Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAovLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQoKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9yZXNvdXJjZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3V0aWwuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oIgoKc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElGWEpTX0NvbnRleHQqIGNjKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CglBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CgoJcmV0dXJuIHBSdW50aW1lLT5HZXRJc29sYXRlKCk7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfUHVibGljTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKI2RlZmluZSBET1VCTEVfQ09SUkVDVAkwLjAwMDAwMDAwMDAwMDAwMQoKQkVHSU5fSlNfU1RBVElDX0dMT0JBTF9GVU4oQ0pTX1B1YmxpY01ldGhvZHMpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9Gb3JtYXQpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9LZXlzdHJva2UpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBlcmNlbnRfRm9ybWF0KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0tleXN0cm9rZSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXRFeCkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2VFeCkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXQpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfS2V5c3Ryb2tlKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0Zvcm1hdEV4KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZUV4KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0Zvcm1hdCkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9LZXlzdHJva2UpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfRm9ybWF0KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTcGVjaWFsX0tleXN0cm9rZSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9LZXlzdHJva2VFeCkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNYWtlTnVtYmVyKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTaW1wbGVfQ2FsY3VsYXRlKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZSYW5nZV9WYWxpZGF0ZSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTWVyZ2VDaGFuZ2UpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBhcnNlRGF0ZUV4KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZFeHRyYWN0TnVtcykKRU5EX0pTX1NUQVRJQ19HTE9CQUxfRlVOKCkKCklNUExFTUVOVF9KU19TVEFUSUNfR0xPQkFMX0ZVTihDSlNfUHVibGljTWV0aG9kcykKCnN0cnVjdCBzdHJ1X1RiQ29udmVydAp7CglGWF9MUENTVFIgbHBzekpTTWFyazsKCUZYX0xQQ1NUUiBscHN6Q3BwTWFyazsKfTsKCnN0YXRpYyBjb25zdCBzdHJ1X1RiQ29udmVydCBmY1RhYmxlW10gPSB7Cgl7ICJtbW1tIiwiJUIiIH0sCgl7ICJtbW0iLCAiJWIiIH0sCgl7ICJtbSIsICAiJW0iIH0sCgkvLyJtIgoJeyAiZGRkZCIsIiVBIiB9LAoJeyAiZGRkIiwgIiVhIiB9LAoJeyAiZGQiLCAgIiVkIiB9LAoJLy8iZCIsICAgIiV3IiwKCXsgInl5eXkiLCIlWSIgfSwKCXsgInl5IiwgICIleSIgfSwKCXsgIkhIIiwgICIlSCIgfSwKCS8vIkgiCgl7ICJoaCIsICAiJUkiIH0sCgkvLyJoIgoJeyAiTU0iLCAgIiVNIiB9LAoJLy8iTSIKCXsgInNzIiwgICIlUyIgfSwKCS8vInMKCXsgInR0IiwgICIlcCIgfSwKCS8vInQiCn07CgpzdGF0aWMgRlhfTFBDV1NUUiBtb250aHNbXSA9CnsKCUwiSmFuIiwgTCJGZWIiLCBMIk1hciIsIEwiQXByIiwgTCJNYXkiLCBMIkp1biIsIEwiSnVsIiwgTCJBdWciLCBMIlNlcCIsIEwiT2N0IiwgTCJOb3YiLCBMIkRlYyIKfTsKCnN0YXRpYyBGWF9MUENXU1RSIGZ1bGxtb250aHNbXSA9IAp7IAoJTCJKYW51YXJ5IiwgTCJGZWJydWFyeSIsIEwiTWFyY2giLCBMIkFwcmlsIiwgTCJNYXkiLCBMIkp1bmUiLCBMIkp1bHkiLCBMIkF1Z3VzdCIsIEwiU2VwdGVtYmVyIiwgTCJPY3RvYmVyIiwgTCJOb3ZlbWJlciIsIEwiRGVjZW1iZXIiIAp9OwoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIoRlhfTFBDV1NUUiBzdHJpbmcpCnsKCUNGWF9XaWRlU3RyaW5nIHNUcmltID0gU3RyVHJpbShzdHJpbmcpOwoJRlhfTFBDV1NUUiBwVHJpbSA9IHNUcmltLmNfc3RyKCk7CglGWF9MUENXU1RSIHAgPSBwVHJpbTsKCgoJRlhfQk9PTCBiRG90ID0gRkFMU0U7CglGWF9CT09MIGJLWEpTID0gRkFMU0U7CgoJd2NoYXJfdCBjOwoJd2hpbGUgKChjID0gKnApKQoJewoJCWlmIChjID09ICcuJyB8fCBjID09ICcsJykKCQl7CgkJCWlmIChiRG90KSByZXR1cm4gRkFMU0U7CgkJCWJEb3QgPSBUUlVFOwoJCX0KCQllbHNlIGlmIChjID09ICctJyB8fCBjID09ICcrJykKCQl7CgkJCWlmIChwICE9IHBUcmltKQoJCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQllbHNlIGlmIChjID09ICdlJyB8fCBjID09ICdFJykKCQl7CgkJCWlmIChiS1hKUykgcmV0dXJuIEZBTFNFOwoKCQkJcCsrOwoJCQljID0gKnA7CgkJCWlmIChjID09ICcrJyB8fCBjID09ICctJykKCQkJewoJCQkJYktYSlMgPSBUUlVFOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIEZBTFNFOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCFJc0RpZ2l0KGMpKQoJCXsKCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQlwKys7Cgl9CgoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzRGlnaXQod2NoYXJfdCBjaCkKewoJcmV0dXJuIChjaCA+PSBMJzAnICYmIGNoIDw9IEwnOScpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0RpZ2l0KGNoYXIgY2gpCnsKCXJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKQp7CglyZXR1cm4gKChjaCA+PSBMJ2EnICYmIGNoIDw9IEwneicpIHx8IChjaCA+PSBMJ0EnICYmIGNoIDw9IEwnWicpKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNBbHBoYU51bWVyaWMod2NoYXJfdCBjaCkKewoJcmV0dXJuIChJc0RpZ2l0KGNoKSB8fCBJc0FscGhhYmV0aWMoY2gpKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6bWFza1NhdGlzZmllZCh3Y2hhcl90IGNfQ2hhbmdlLHdjaGFyX3QgY19NYXNrKQp7Cglzd2l0Y2ggKGNfTWFzaykKCXsKCWNhc2UgTCc5JzoKICAgICAgICByZXR1cm4gSXNEaWdpdChjX0NoYW5nZSk7CQkKICAgIGNhc2UgTCdBJzoKICAgICAgICByZXR1cm4gSXNBbHBoYWJldGljKGNfQ2hhbmdlKTsJCQogICAgY2FzZSBMJ08nOgogICAgICAgIHJldHVybiBJc0FscGhhTnVtZXJpYyhjX0NoYW5nZSk7CQkKICAgIGNhc2UgTCdYJzoKICAgICAgICByZXR1cm4gVFJVRTsJCQoJZGVmYXVsdDoKICAgICAgICByZXR1cm4gKGNfQ2hhbmdlID09IGNfTWFzayk7Cgl9Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OmlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKQp7CglyZXR1cm4gY2ggPT0gTCc5JyB8fCBjaCA9PSBMJ0EnIHx8IGNoID09IEwnTycgfHwgY2ggPT0gTCdYJzsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpBRl9TaW1wbGUoRlhfTFBDV1NUUiBzRnVjdGlvbiwgZG91YmxlIGRWYWx1ZTEsIGRvdWJsZSBkVmFsdWUyKQp7CglpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIkFWRyIpID09IDAgfHwgRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIlNVTSIpID09IDApCgl7CgkJcmV0dXJuIGRWYWx1ZTEgKyBkVmFsdWUyOwoJfQoJZWxzZSBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJQUkQiKSA9PSAwKQoJewoJCXJldHVybiBkVmFsdWUxICogZFZhbHVlMjsKCX0KCWVsc2UgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJNSU4iKSA9PSAwKQoJewoJCXJldHVybiBGWF9NSU4oZFZhbHVlMSwgZFZhbHVlMik7Cgl9CgllbHNlIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLEwiTUFYIikgPT0gMCkKCXsKCQlyZXR1cm4gRlhfTUFYKGRWYWx1ZTEsIGRWYWx1ZTIpOwoJfQoKCXJldHVybiBkVmFsdWUxOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyTFRyaW0oRlhfTFBDV1NUUiBwU3RyKQp7Cgl3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gTCcgJykgcFN0cisrOwoKCXJldHVybiBwU3RyOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyUlRyaW0oRlhfTFBDV1NUUiBwU3RyKQp7CglGWF9MUENXU1RSIHAgPSBwU3RyOwoJd2hpbGUgKCpwKSBwKys7Cgl3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykgcC0tOwoKCXJldHVybiBDRlhfV2lkZVN0cmluZyhwU3RyLCBwIC0gcFN0cik7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJUcmltKEZYX0xQQ1dTVFIgcFN0cikKewoJcmV0dXJuIFN0clJUcmltKFN0ckxUcmltKHBTdHIpLmNfc3RyKCkpOwp9CgpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyTFRyaW0oRlhfTFBDU1RSIHBTdHIpCnsKCXdoaWxlICgqcFN0ciAmJiAqcFN0ciA9PSAnICcpIHBTdHIrKzsKCiAgICAgICAgcmV0dXJuIHBTdHI7Cn0KCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJSVHJpbShGWF9MUENTVFIgcFN0cikKewoJRlhfTFBDU1RSIHAgPSBwU3RyOwoJd2hpbGUgKCpwKSBwKys7Cgl3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykgcC0tOwoKCXJldHVybiBDRlhfQnl0ZVN0cmluZyhwU3RyLHAtcFN0cik7Cn0KCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJUcmltKEZYX0xQQ1NUUiBwU3RyKQp7CglyZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikpOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTnVtYmVyKEZYX0xQQ1dTVFIgc3dTb3VyY2UsIEZYX0JPT0wmIGJBbGxEaWdpdHMsIEZYX0JPT0wmIGJEb3QsIEZYX0JPT0wmIGJTaWduLCBGWF9CT09MJiBiS1hKUykKewoJYkRvdCA9IEZBTFNFOwoJYlNpZ24gPSBGQUxTRTsKCWJLWEpTID0gRkFMU0U7CgoJRlhfQk9PTCBiRGlnaXRFeGlzdCA9IEZBTFNFOwoKCUZYX0xQQ1dTVFIgcCA9IHN3U291cmNlOwoJd2NoYXJfdCBjOwoKCUZYX0xQQ1dTVFIgcFN0YXJ0ID0gTlVMTDsKCUZYX0xQQ1dTVFIgcEVuZCA9IE5VTEw7CgoJd2hpbGUgKChjID0gKnApKQoJewoJCWlmICghcFN0YXJ0ICYmIGMgIT0gTCcgJykKCQl7CgkJCXBTdGFydCA9IHA7CgkJfQoKCQlwRW5kID0gcDsKCQlwKys7Cgl9CgoJaWYgKCFwU3RhcnQpCgl7CgkJYkFsbERpZ2l0cyA9IEZBTFNFOwoJCXJldHVybiAwOwoJfQoKCXdoaWxlIChwRW5kICE9IHBTdGFydCkKCXsKCQlpZiAoKnBFbmQgPT0gTCcgJykKCQkJcEVuZCAtLTsKCQllbHNlCgkJCWJyZWFrOwoJfQoKCWRvdWJsZSBkUmV0ID0gMDsKCXAgPSBwU3RhcnQ7CgliQWxsRGlnaXRzID0gVFJVRTsKCUNGWF9XaWRlU3RyaW5nIHN3RGlnaXRzOwoKCXdoaWxlIChwIDw9IHBFbmQpCgl7CQoJCWMgPSAqcDsKCgkJaWYgKElzRGlnaXQoYykpCgkJewoJCQlzd0RpZ2l0cyArPSBjOwoJCQliRGlnaXRFeGlzdCA9IFRSVUU7CgkJfQoJCWVsc2UgCgkJewoJCQlzd2l0Y2ggKGMpCgkJCXsKCQkJY2FzZSBMJyAnOgoJCQkJYkFsbERpZ2l0cyA9IEZBTFNFOwoJCQkJYnJlYWs7CgkJCWNhc2UgTCcuJzoKCQkJY2FzZSBMJywnOgoJCQkJaWYgKCFiRG90KQoJCQkJewoJCQkJCWlmIChiRGlnaXRFeGlzdCkKCQkJCQl7CgkJCQkJCXN3RGlnaXRzICs9IEwnLic7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXN3RGlnaXRzICs9IEwnMCc7CgkJCQkJCXN3RGlnaXRzICs9IEwnLic7CgkJCQkJCWJEaWdpdEV4aXN0ID0gVFJVRTsKCQkJCQl9CgoJCQkJCWJEb3QgPSBUUlVFOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQljYXNlICdlJzoKCQkJY2FzZSAnRSc6CgkJCQlpZiAoIWJLWEpTKQoJCQkJewoJCQkJCXArKzsKCQkJCQljID0gKnA7CgkJCQkJaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQoJCQkJCXsKCQkJCQkJYktYSlMgPSBUUlVFOwoJCQkJCQlzd0RpZ2l0cyArPSAnZSc7CgkJCQkJCXN3RGlnaXRzICs9IGM7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJfQoJCQljYXNlIEwnLSc6CgkJCQlpZiAoIWJEaWdpdEV4aXN0ICYmICFiU2lnbikKCQkJCXsKCQkJCQlzd0RpZ2l0cyArPSBjOwoJCQkJCWJTaWduID0gVFJVRTsKCQkJCQlicmVhazsKCQkJCX0KCQkJZGVmYXVsdDoKCQkJCWJBbGxEaWdpdHMgPSBGQUxTRTsKCgkJCQlpZiAocCAhPSBwU3RhcnQgJiYgIWJEb3QgJiYgYkRpZ2l0RXhpc3QpCgkJCQl7CgkJCQkJc3dEaWdpdHMgKz0gTCcuJzsKCQkJCQliRG90ID0gVFJVRTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQliRG90ID0gRkFMU0U7CgkJCQkJYkRpZ2l0RXhpc3QgPSBGQUxTRTsKCQkJCQlzd0RpZ2l0cyA9IEwiIjsKCQkJCX0KCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQlwKys7Cgl9CgoJaWYgKHN3RGlnaXRzLkdldExlbmd0aCgpID4gMCAmJiBzd0RpZ2l0cy5HZXRMZW5ndGgoKSA8IDE3KQoJewoJCUNGWF9CeXRlU3RyaW5nIHNEaWdpdHMgPSBzd0RpZ2l0cy5VVEY4RW5jb2RlKCk7CgoJCWlmIChiS1hKUykKCQl7CgkJCWRSZXQgPSBhdG9mKHNEaWdpdHMpOwoJCX0KCQllbHNlCgkJewoJCQlpZiAoYkRvdCkKCQkJewoJCQkJY2hhciogcFN0b3BTdHJpbmc7CgkJCQlkUmV0ID0gOjpzdHJ0b2Qoc0RpZ2l0cywgJnBTdG9wU3RyaW5nKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRSZXQgPSBhdG9sKHNEaWdpdHMpOwoJCQl9CgkJfQoKCX0KCglyZXR1cm4gZFJldDsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ1RvTnVtYmVyKEZYX0xQQ1dTVFIgc3dTb3VyY2UpCnsKCUZYX0JPT0wgYkFsbERpZ2l0cyA9IEZBTFNFOwoJRlhfQk9PTCBiRG90ID0gRkFMU0U7CglGWF9CT09MIGJTaWduID0gRkFMU0U7CglGWF9CT09MIGJLWEpTID0gRkFMU0U7CgoJcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwp9CgpGWF9CT09MCUNKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoRlhfTFBDV1NUUiBzd1NvdXJjZSwgZG91YmxlICYgZFJldCwgRlhfQk9PTCAmIGJEb3QpCnsKCUZYX0JPT0wgYkFsbERpZ2l0cyA9IEZBTFNFOwoJRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwoJRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwoKCWRSZXQgPSBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsKCglyZXR1cm4gYkFsbERpZ2l0czsKfQoKQ0pTX0FycmF5IENKU19QdWJsaWNNZXRob2RzOjpBRl9NYWtlQXJyYXlGcm9tTGlzdCh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgQ0pTX1ZhbHVlIHZhbCkKewoJQ0pTX0FycmF5IFN0ckFycmF5KGlzb2xhdGUpOwoJaWYodmFsLklzQXJyYXlPYmplY3QoKSkKCXsKCQl2YWwuQ29udmVydFRvQXJyYXkoU3RyQXJyYXkpOwoJCXJldHVybiBTdHJBcnJheTsKCX0KCUNGWF9XaWRlU3RyaW5nIHdzU3RyID0gdmFsLlRvQ0ZYV2lkZVN0cmluZygpOwoJQ0ZYX0J5dGVTdHJpbmcgdCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cik7Cgljb25zdCBjaGFyICogcCA9IChjb25zdCBjaGFyICopdDsKCgoJaW50IGNoID0gJywnIDsKCWludCBuSW5kZXggPSAwOwoKCXdoaWxlICgqcCkKCXsKCQljb25zdCBjaGFyICogcFRlbXAgPSBzdHJjaHIocCwgY2gpOwoJCWlmIChwVGVtcCA9PSBOVUxMKQoJCXsKCQkJU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBTdHJUcmltKHApLmNfc3RyKCkpKTsKCQkJYnJlYWs7CgkJfQoJCWVsc2UKCQl7CgkJCWNoYXIgKiBwU3ViID0gbmV3IGNoYXJbcFRlbXAgLSBwICsgMV07CgkJCXN0cm5jcHkocFN1YiwgcCwgcFRlbXAgLSBwKTsKCQkJKihwU3ViICsgKHBUZW1wIC0gcCkpID0gJ1wwJzsKCgkJCVN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgU3RyVHJpbShwU3ViKS5jX3N0cigpKSk7CgkJCWRlbGV0ZSBbXXBTdWI7CgkJCQoJCQluSW5kZXggKys7CgkJCXAgPSArK3BUZW1wOwoJCX0KCQkKCX0KCXJldHVybiBTdHJBcnJheTsKfQoKaW50IENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZyxpbnQgblN0YXJ0LGludCYgblNraXAsIGludCBuTWF4U3RlcCkKewoJaW50IG5SZXQgPSAwOwoJblNraXAgPSAwOwoJZm9yIChpbnQgaT1uU3RhcnQsIHN6PXN0cmluZy5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspCgl7CgkJaWYgKGktblN0YXJ0ID4gMTApCgkJCWJyZWFrOwoKCQlGWF9XQ0hBUiBjID0gc3RyaW5nLkdldEF0KGkpOwoJCWlmIChJc0RpZ2l0KCh3Y2hhcl90KWMpKQoJCXsKCQkJblJldCA9IG5SZXQgKiAxMCArIChjIC0gJzAnKTsKCQkJblNraXAgPSBpIC0gblN0YXJ0ICsgMTsKCQkJaWYgKG5Ta2lwID49IG5NYXhTdGVwKSAKCQkJCWJyZWFrOwoJCX0KCQllbHNlCgkJCWJyZWFrOwoJfQoKCXJldHVybiBuUmV0Owp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywgaW50IG5TdGFydCwgaW50JiBuU2tpcCkKewoJQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7CgluU2tpcCA9IDA7Cglmb3IgKGludCBpPW5TdGFydCwgc3o9c3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykKCXsKCQlGWF9XQ0hBUiBjID0gc3RyaW5nLkdldEF0KGkpOwoJCWlmICgoYyA+PSBMJ2EnICYmIGMgPD0gTCd6JykgfHwgKGMgPj0gTCdBJyAmJiBjIDw9IEwnWicpKQoJCXsKCQkJc3dSZXQgKz0gYzsKCQkJblNraXAgPSBpIC0gblN0YXJ0ICsgMTsKCQl9CgkJZWxzZQoJCQlicmVhazsKCX0KCglyZXR1cm4gc3dSZXQ7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VOb3JtYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIEZYX0JPT0wmIGJXcm9uZ0Zvcm1hdCkKewoJZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKCglpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOwoJaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZHQpICsgMTsKCWludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOwoJaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKCWludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZHQpOwoJaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7CgoJaW50IG51bWJlclszXTsKCglpbnQgblNraXAgPSAwOwoJaW50IG5MZW4gPSB2YWx1ZS5HZXRMZW5ndGgoKTsKCWludCBuSW5kZXggPSAwOwoJaW50IGkgPSAwOwoJd2hpbGUgKGkgPCBuTGVuKQoJewoJCWlmIChuSW5kZXggPiAyKSBicmVhazsKCgkJRlhfV0NIQVIgYyA9IHZhbHVlLkdldEF0KGkpOwoJCWlmIChJc0RpZ2l0KCh3Y2hhcl90KWMpKQoJCXsKCQkJbnVtYmVyW25JbmRleCsrXSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaSwgblNraXAsIDQpOwoJCQlpICs9IG5Ta2lwOwkJCQoJCX0KCQllbHNlCgkJewoJCQlpICsrOwoJCX0KCX0KCglpZiAobkluZGV4ID09IDIpCgl7CgkJLy8gY2FzZTI6IG1vbnRoL2RheQoJCS8vIGNhc2UzOiBkYXkvbW9udGgKCQlpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkpCgkJewoJCQluTW9udGggPSBudW1iZXJbMF07CgkJCW5EYXkgPSBudW1iZXJbMV07CgkJfQoJCWVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMzEpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpKQoJCXsKCQkJbkRheSA9IG51bWJlclswXTsKCQkJbk1vbnRoID0gbnVtYmVyWzFdOwoJCX0KCgkJYldyb25nRm9ybWF0ID0gRkFMU0U7Cgl9CgllbHNlIGlmIChuSW5kZXggPT0gMykKCXsKCQkvLyBjYXNlMTogeWVhci9tb250aC9kYXkKCQkvLyBjYXNlMjogbW9udGgvZGF5L3llYXIKCQkvLyBjYXNlMzogZGF5L21vbnRoL3llYXIKCgkJaWYgKG51bWJlclswXSA+IDEyICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpICYmIChudW1iZXJbMl0gPj0gMSAmJiBudW1iZXJbMl0gPD0gMzEpKQoJCXsKCQkJblllYXIgPSBudW1iZXJbMF07CgkJCW5Nb250aCA9IG51bWJlclsxXTsKCQkJbkRheSA9IG51bWJlclsyXTsKCQl9CgkJZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkgJiYgbnVtYmVyWzJdID4gMzEpCgkJewoJCQluTW9udGggPSBudW1iZXJbMF07CgkJCW5EYXkgPSBudW1iZXJbMV07CgkJCW5ZZWFyID0gbnVtYmVyWzJdOwoJCX0KCQllbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDMxKSAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSAmJiBudW1iZXJbMl0gPiAzMSkKCQl7CgkJCW5EYXkgPSBudW1iZXJbMF07CgkJCW5Nb250aCA9IG51bWJlclsxXTsKCQkJblllYXIgPSBudW1iZXJbMl07CgkJfQoKCQliV3JvbmdGb3JtYXQgPSBGQUxTRTsKCX0KCWVsc2UKCXsKCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoJCXJldHVybiBkdDsKCX0KCglDRlhfV2lkZVN0cmluZyBzd1RlbXA7Cglzd1RlbXAuRm9ybWF0KEwiJWQvJWQvJWQgJWQ6JWQ6JWQiLG5Nb250aCxuRGF5LG5ZZWFyLG5Ib3VyLG5NaW4sblNlYyk7CglyZXR1cm4gSlNfRGF0ZVBhcnNlKHN3VGVtcC5jX3N0cigpKTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBmb3JtYXQsIEZYX0JPT0wmIGJXcm9uZ0Zvcm1hdCkKewoJZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKCglpZiAoZm9ybWF0LklzRW1wdHkoKSB8fCB2YWx1ZS5Jc0VtcHR5KCkpCgkJcmV0dXJuIGR0OwoKCWludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkdCk7CglpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkdCkgKyAxOwoJaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7CglpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZHQpOwoJaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkdCk7CglpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKCglpbnQgblllYXJTdWIgPSA5OTsgLy9uWWVhciAtIDIwMDA7CgoJRlhfQk9PTCBiUG0gPSBGQUxTRTsKCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKCWJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwoKCWludCBpPTA7CglpbnQgaj0wOwoKCXdoaWxlIChpIDwgZm9ybWF0LkdldExlbmd0aCgpKQoJewoJCWlmIChiRXhpdCkgYnJlYWs7CgoJCUZYX1dDSEFSIGMgPSBmb3JtYXQuR2V0QXQoaSk7CgkJc3dpdGNoIChjKQoJCXsKCQkJY2FzZSAnOic6CgkJCWNhc2UgJy4nOgoJCQljYXNlICctJzoKCQkJY2FzZSAnXFwnOgoJCQljYXNlICcvJzoKCQkJCWkrKzsKCQkJCWorKzsKCQkJCWJyZWFrOwoKCQkJY2FzZSAneSc6CgkJCWNhc2UgJ20nOgoJCQljYXNlICdkJzoKCQkJY2FzZSAnSCc6CgkJCWNhc2UgJ2gnOgoJCQljYXNlICdNJzoKCQkJY2FzZSAncyc6CgkJCWNhc2UgJ3QnOgoJCQkJewoJCQkJCWludCBvbGRqID0gajsKCQkJCQlpbnQgblNraXAgPSAwOwoJCQkJCWludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKCgkJCQkJaWYgKHJlbWFpbmluZyA9PSAwIHx8IGZvcm1hdC5HZXRBdChpKzEpICE9IGMpCgkJCQkJewoJCQkJCQlzd2l0Y2ggKGMpCgkJCQkJCXsKCQkJCQkJCWNhc2UgJ3knOgoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqKys7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdtJzoKCQkJCQkJCQluTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2QnOgoJCQkJCQkJCW5EYXkgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ0gnOgoJCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSsrOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdoJzoKCQkJCQkJCQluSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnTSc6CgkJCQkJCQkJbk1pbiA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAncyc6CgkJCQkJCQkJblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAndCc6CgkJCQkJCQkJYlBtID0gKGogPCB2YWx1ZS5HZXRMZW5ndGgoKSAmJiB2YWx1ZS5HZXRBdChqKSA9PSAncCcpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqKys7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDEgfHwgZm9ybWF0LkdldEF0KGkrMikgIT0gYykKCQkJCQl7CgkJCQkJCXN3aXRjaCAoYykKCQkJCQkJewoJCQkJCQkJY2FzZSAneSc6CgkJCQkJCQkJblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnZCc6CgkJCQkJCQkJbkRheSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnSCc6CgkJCQkJCQkJbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2gnOgoJCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdNJzoKCQkJCQkJCQluTWluID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdzJzoKCQkJCQkJCQluU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICd0JzoKCQkJCQkJCQliUG0gPSAoaiArIDEgPCB2YWx1ZS5HZXRMZW5ndGgoKSAmJiB2YWx1ZS5HZXRBdChqKSA9PSAncCcgJiYgdmFsdWUuR2V0QXQoaisxKSA9PSAnbScpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IDI7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDIgfHwgZm9ybWF0LkdldEF0KGkrMykgIT0gYykKCQkJCQl7CgkJCQkJCXN3aXRjaCAoYykKCQkJCQkJewoJCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQkJewoJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyBzTW9udGggPSBQYXJzZVN0cmluZ1N0cmluZyh2YWx1ZSwgaiwgblNraXApOwoJCQkJCQkJCQlGWF9CT09MIGJGaW5kID0gRkFMU0U7CgkJCQkJCQkJCWZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykKCQkJCQkJCQkJewoJCQkJCQkJCQkJaWYgKHNNb250aC5Db21wYXJlTm9DYXNlKG1vbnRoc1ttXSkgPT0gMCkKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQluTW9udGggPSBtICsgMTsKCQkJCQkJCQkJCQlpKz0zOwoJCQkJCQkJCQkJCWorPW5Ta2lwOwoJCQkJCQkJCQkJCWJGaW5kID0gVFJVRTsKCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoKCQkJCQkJCQkJaWYgKCFiRmluZCkKCQkJCQkJCQkJewoJCQkJCQkJCQkJbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMyk7CgkJCQkJCQkJCQlpKz0zOwoJCQkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3knOgoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQlpKz0zOwoJCQkJCQkJCWorPTM7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkrNCkgIT0gYykKCQkJCQl7CgkJCQkJCXN3aXRjaCAoYykKCQkJCQkJewoKCgkJCQkJCQljYXNlICd5JzoKCQkJCQkJCQluWWVhciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJaSArPSA0OwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQkJewoJCQkJCQkJCQlGWF9CT09MIGJGaW5kID0gRkFMU0U7CgoJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyBzTW9udGggPSBQYXJzZVN0cmluZ1N0cmluZyh2YWx1ZSwgaiwgblNraXApOwoJCQkJCQkJCQlzTW9udGguTWFrZUxvd2VyKCk7CgoJCQkJCQkJCQlmb3IgKGludCBtID0gMDsgbSA8IDEyOyBtKyspCgkJCQkJCQkJCXsKCQkJCQkJCQkJCUNGWF9XaWRlU3RyaW5nIHNGdWxsTW9udGhzID0gZnVsbG1vbnRoc1ttXTsKCQkJCQkJCQkJCXNGdWxsTW9udGhzLk1ha2VMb3dlcigpOwoKCQkJCQkJCQkJCWlmIChzRnVsbE1vbnRocy5GaW5kKHNNb250aC5jX3N0cigpLCAwKSAhPSAtMSkKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQluTW9udGggPSBtICsgMTsKCQkJCQkJCQkJCQlpICs9IDQ7CgkJCQkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQkJCQliRmluZCA9IFRSVUU7CgkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCgkJCQkJCQkJCWlmICghYkZpbmQpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwoJCQkJCQkJCQkJaSs9NDsKCQkJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCWkgKz0gNDsKCQkJCQkJCQlqICs9IDQ7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaWYgKGogPj0gdmFsdWUuR2V0TGVuZ3RoKCkgfHwgZm9ybWF0LkdldEF0KGkpICE9IHZhbHVlLkdldEF0KGopKQoJCQkJCQl7CgkJCQkJCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoJCQkJCQkJYkV4aXQgPSBUUlVFOwoJCQkJCQl9CgkJCQkJCWkrKzsKCQkJCQkJaisrOwoJCQkJCX0KCgkJCQkJaWYgKG9sZGogPT0gaikKCQkJCQl7CgkJCQkJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgkJCQkJCWJFeGl0ID0gVFJVRTsKCQkJCQl9CgkJCQl9CgoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlpZiAodmFsdWUuR2V0TGVuZ3RoKCkgPD0gaikKCQkJCXsKCQkJCQliRXhpdCA9IFRSVUU7CgkJCQl9CgkJCQllbHNlIGlmIChmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpCgkJCQl7CgkJCQkJYldyb25nRm9ybWF0ID0gVFJVRTsKCQkJCQliRXhpdCA9IFRSVUU7CgkJCQl9CgoJCQkJaSsrOwoJCQkJaisrOwoJCQkJYnJlYWs7CgkJfQoJfQoKCWlmIChiUG0pIG5Ib3VyICs9IDEyOwoKCWlmIChuWWVhciA+PSAwICYmIG5ZZWFyIDw9IG5ZZWFyU3ViKQoJCW5ZZWFyICs9IDIwMDA7CgoJaWYgKG5Nb250aCA8IDEgfHwgbk1vbnRoID4gMTIpCgkJYldyb25nRm9ybWF0ID0gVFJVRTsKCglpZiAobkRheSA8IDEgfHwgbkRheSA+IDMxKQoJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgoJaWYgKG5Ib3VyIDwgMCB8fCBuSG91ciA+IDI0KQoJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgoJaWYgKG5NaW4gPCAwIHx8IG5NaW4gPiA2MCkKCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoKCWlmIChuU2VjIDwgMCB8fCBuU2VjID4gNjApCgkJYldyb25nRm9ybWF0ID0gVFJVRTsKCglkb3VibGUgZFJldCA9IDA7CgoJaWYgKGJXcm9uZ0Zvcm1hdCkKCXsKCQlkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwoJfQoJZWxzZQoJewoJCWRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLG5Nb250aCAtIDEsbkRheSksSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCgkJaWYgKEpTX1BvcnRJc05hbihkUmV0KSkKCQl7CgkJCWRSZXQgPSBKU19EYXRlUGFyc2UodmFsdWUuY19zdHIoKSk7CgkJfQoJfQoKCWlmIChKU19Qb3J0SXNOYW4oZFJldCkpCgl7CgkJZFJldCA9IFBhcnNlTm9ybWFsRGF0ZSh2YWx1ZSwgYldyb25nRm9ybWF0KTsKCX0KCglyZXR1cm4gZFJldDsKCn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZShkb3VibGUgZERhdGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0KQp7CglDRlhfV2lkZVN0cmluZyBzUmV0ID0gTCIiLHNQYXJ0ID0gTCIiOwoKCWludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkRGF0ZSk7CglpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkRGF0ZSkgKyAxOwoJaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkRGF0ZSk7CglpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZERhdGUpOwoJaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkRGF0ZSk7CglpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGREYXRlKTsKCglpbnQgaSA9IDA7Cgl3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkKCXsKCSAgICAgICAgRlhfV0NIQVIgYyA9IGZvcm1hdC5HZXRBdChpKTsKICAgICAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKCQlzUGFydCA9IEwiIjsKCQlzd2l0Y2ggKGMpCgkJewoJCQljYXNlICd5JzoKCQkJY2FzZSAnbSc6CgkJCWNhc2UgJ2QnOgoJCQljYXNlICdIJzoKCQkJY2FzZSAnaCc6CgkJCWNhc2UgJ00nOgoJCQljYXNlICdzJzoKCQkJY2FzZSAndCc6CgkJCQlpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkrMSkgIT0gYykKCQkJCXsKCQkJCQlzd2l0Y2ggKGMpCgkJCQkJewoJCQkJCQljYXNlICd5JzoKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbk1vbnRoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdkJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiVkIixuRGF5KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdIJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiVkIixuSG91cik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnaCc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbkhvdXI+MTI/bkhvdXIgLSAxMjpuSG91cik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnTSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbk1pbik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAncyc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsblNlYyk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAndCc6CgkJCQkJCQlzUGFydCArPSBuSG91cj4xMj8ncCc6J2EnOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWkrKzsKCQkJCX0KCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAxIHx8IGZvcm1hdC5HZXRBdChpKzIpICE9IGMpCgkJCQl7CgkJCQkJc3dpdGNoIChjKQoJCQkJCXsKCQkJCQkJY2FzZSAneSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuWWVhciAtIChuWWVhciAvIDEwMCkgKiAxMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbk1vbnRoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdkJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5EYXkpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ0gnOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbkhvdXIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2gnOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbkhvdXI+MTI/bkhvdXIgLSAxMjpuSG91cik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnTSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuTWluKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdzJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5TZWMpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3QnOgoJCQkJCQkJc1BhcnQgPSBuSG91cj4xMj8gTCJwbSI6IEwiYW0iOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWkrPTI7CgkJCQl9CgkJCQllbHNlIGlmIChyZW1haW5pbmcgPT0gMiB8fCBmb3JtYXQuR2V0QXQoaSszKSAhPSBjKQoJCQkJewoJCQkJCXN3aXRjaCAoYykKCQkJCQl7CgkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJaSs9MzsKCQkJCQkJCWlmIChuTW9udGggPiAwJiZuTW9udGggPD0gMTIpCgkJCQkJCQkJc1BhcnQgKz0gbW9udGhzW25Nb250aCAtIDFdOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWRlZmF1bHQ6CgkJCQkJCQlpKz0zOwoJCQkJCQkJc1BhcnQgKz0gYzsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkrNCkgIT0gYykKCQkJCXsKCQkJCQlzd2l0Y2ggKGMpCgkJCQkJewoJCQkJCQljYXNlICd5JzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwNGQiLG5ZZWFyKTsKCQkJCQkJCWkgKz0gNDsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdtJzoKCQkJCQkJCWkrPTQ7CgkJCQkJCQlpZiAobk1vbnRoID4gMCYmbk1vbnRoIDw9IDEyKQoJCQkJCQkJCXNQYXJ0ICs9IGZ1bGxtb250aHNbbk1vbnRoIC0gMV07CgkJCQkJCQlicmVhazsKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCWkgKz0gNDsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJc1BhcnQgKz0gYzsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaSsrOwoJCQkJCXNQYXJ0ICs9IGM7CgkJCQl9CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWkrKzsKCQkJCXNQYXJ0ICs9IGM7CgkJCQlicmVhazsKCQl9CgoJCXNSZXQgKz0gc1BhcnQ7Cgl9CgoJcmV0dXJuIHNSZXQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovL2Z1bmN0aW9uIEFGTnVtYmVyX0Zvcm1hdChuRGVjLCBzZXBTdHlsZSwgbmVnU3R5bGUsIGN1cnJTdHlsZSwgc3RyQ3VycmVuY3ksIGJDdXJyZW5jeVByZXBlbmQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDYpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CQoJQ0ZYX0J5dGVTdHJpbmcgc3RyVmFsdWUgPSBTdHJUcmltKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOwoJCglpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gVFJVRTsKCQoJaW50IGlEZWMgPSBwYXJhbXNbMF0uVG9JbnQoKTsKCWludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKCWludCBpTmVnU3R5bGUgPSBwYXJhbXNbMl0uVG9JbnQoKTsKCS8vIHBhcmFtc1szXSBpcyBpQ3VyclN0eWxlLCBpdCdzIG5vdCB1c2VkLgoJc3RkOjp3c3RyaW5nIHdzdHJDdXJyZW5jeShwYXJhbXNbNF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CglGWF9CT09MIGJDdXJyZW5jeVByZXBlbmQgPSBwYXJhbXNbNV0uVG9Cb29sKCk7CgkKCWlmIChpRGVjIDwgMCkgaURlYyA9IC1pRGVjOwoJCglpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQoJCWlTZXBTdHlsZSA9IDA7CgkKCWlmIChpTmVnU3R5bGUgPCAwIHx8IGlOZWdTdHlsZSA+IDMpCgkJaU5lZ1N0eWxlID0gMDsKCQoJCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKCXN0clZhbHVlLlJlcGxhY2UoIiwiLCAiLiIpOwoJZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOwoJaWYgKGlEZWMgPiAwKQoJCWRWYWx1ZSArPSBET1VCTEVfQ09SUkVDVDsvLwoJCSAgICAKCWludCBpRGVjMjsKCUZYX0JPT0wgYk5hZ2F0aXZlID0gRkFMU0U7CgoJc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5hZ2F0aXZlKTsKCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgl7CgkJZFZhbHVlID0gMDsKCQlzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLGlEZWMsJmlEZWMyLCZiTmFnYXRpdmUpOwoJCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgkJewoJCQlzdHJWYWx1ZSA9ICIwIjsKCQkJaURlYzIgPSAxOwoJCX0KCgl9CgoJaWYgKGlEZWMyIDwgMCkKCXsKCQlmb3IgKGludCBpTnVtID0gMDtpTnVtIDwgYWJzKGlEZWMyKTtpTnVtKyspCgkJewoJCQlzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOwoJCX0KCQlpRGVjMiA9IDA7CgkJCgl9CglpbnQgaU1heCA9IHN0clZhbHVlLkdldExlbmd0aCgpOwoJaWYgKGlEZWMyID4gaU1heCkKCXsKCQlmb3IgKGludCBpTnVtID0gMDtpTnVtIDw9IGlEZWMyIC0gaU1heCA7aU51bSsrKQoJCXsKCQkJc3RyVmFsdWUgKz0gIjAiOwoJCX0KCQlpTWF4ID0gaURlYzIrMTsJCQkKCX0KCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCglpZiAoaURlYzIgPCBpTWF4KQoJewoJCWlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMSkKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsKCQkJaU1heCsrOwoJCX0KCQllbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJywnKTsKCQkJaU1heCsrOwoJCX0KCQkKCQlpZiAoaURlYzIgPT0gMCkKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwoJfQoJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKQoJewoJCWNoYXIgY1NlcGVyYXRvcjsKCQlpZiAoaVNlcFN0eWxlID09IDApCgkJCWNTZXBlcmF0b3IgPSAnLCc7CgkJZWxzZQoJCQljU2VwZXJhdG9yID0gJy4nOwoJCQoJCWludCBpRGVjUG9zaXRpdmUsaURlY05hZ2F0aXZlOwoJCWlEZWNQb3NpdGl2ZSA9IGlEZWMyOwoJCWlEZWNOYWdhdGl2ZSA9IGlEZWMyOwkJCgkJCgkJZm9yIChpRGVjUG9zaXRpdmUgPSBpRGVjMiAtMzsgaURlY1Bvc2l0aXZlID4gMDtpRGVjUG9zaXRpdmUgLT0gMykKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBlcmF0b3IpOwoJCQlpTWF4Kys7CgkJfQoJfQoJCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvL2ZvciBwcm9jZXNzaW5nIGN1cnJlbmN5IHN0cmluZwoKCVZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJWYWx1ZSk7CglzdGQ6OndzdHJpbmcgc3RyVmFsdWUyID0gVmFsdWUuY19zdHIoKTsKCglpZiAoYkN1cnJlbmN5UHJlcGVuZCkKCQlzdHJWYWx1ZTIgPSB3c3RyQ3VycmVuY3kgKyBzdHJWYWx1ZTI7CgllbHNlCgkJc3RyVmFsdWUyID0gc3RyVmFsdWUyICsgd3N0ckN1cnJlbmN5OwoJCgkKCQoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJLy9mb3IgcHJvY2Vzc2luZyBuZWdhdGl2ZSBzdHlsZQoJaWYgKGJOYWdhdGl2ZSkKCXsKCQlpZiAoaU5lZ1N0eWxlID09IDApCgkJewoJCQlzdHJWYWx1ZTIuaW5zZXJ0KDAsTCItIik7CgkJfQoJCWlmIChpTmVnU3R5bGUgPT0gMiB8fCBpTmVnU3R5bGUgPT0gMykKCQl7CgkJCXN0clZhbHVlMi5pbnNlcnQoMCxMIigiKTsKCQkJc3RyVmFsdWUyLmluc2VydChzdHJWYWx1ZTIubGVuZ3RoKCksTCIpIik7CgkJfQoJCWlmIChpTmVnU3R5bGUgPT0gMSB8fCBpTmVnU3R5bGUgPT0gMykKCQl7CgkJCWlmIChGaWVsZCAqIGZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKQoJCQl7CgkJCQlDSlNfQXJyYXkgYXJDb2xvcihpc29sYXRlKTsKCQkJCUNKU19WYWx1ZSB2Q29sRWxtKGlzb2xhdGUpOwoJCQkJdkNvbEVsbSA9IEwiUkdCIjsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgwLHZDb2xFbG0pOwoJCQkJdkNvbEVsbSA9IDE7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMSx2Q29sRWxtKTsKCQkJCXZDb2xFbG0gPSAwOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDIsdkNvbEVsbSk7CgkJCQkKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgzLHZDb2xFbG0pOwoJCQkJCgkJCQlDSlNfUHJvcFZhbHVlIHZQcm9wKGlzb2xhdGUpOwoJCQkJdlByb3AuU3RhcnRHZXR0aW5nKCk7CgkJCQl2UHJvcDw8YXJDb2xvcjsKCQkJCXZQcm9wLlN0YXJ0U2V0dGluZygpOwoJCQkJZlRhcmdldC0+dGV4dENvbG9yKGNjLHZQcm9wLHNFcnJvcik7Ly8gcmVkCgkJCX0KCQl9Cgl9CgllbHNlCgl7CgkJaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKQoJCXsKCQkJaWYgKEZpZWxkICpmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkKCQkJewoJCQkJQ0pTX0FycmF5IGFyQ29sb3IoaXNvbGF0ZSk7CgkJCQlDSlNfVmFsdWUgdkNvbEVsbShpc29sYXRlKTsKCQkJCXZDb2xFbG0gPSBMIlJHQiI7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMCx2Q29sRWxtKTsKCQkJCXZDb2xFbG0gPSAwOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDEsdkNvbEVsbSk7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMix2Q29sRWxtKTsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgzLHZDb2xFbG0pOwoJCQkJCgkJCQlDSlNfUHJvcFZhbHVlIHZQcm9wKGlzb2xhdGUpOwoJCQkJdlByb3AuU3RhcnRHZXR0aW5nKCk7CgkJCQlmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsdlByb3Asc0Vycm9yKTsKCQkJCQoJCQkJQ0pTX0FycmF5IGFQcm9wKGlzb2xhdGUpOwoJCQkJdlByb3AuQ29udmVydFRvQXJyYXkoYVByb3ApOwoKCQkJCUNQV0xfQ29sb3IgY3JQcm9wOwoJCQkJQ1BXTF9Db2xvciBjckNvbG9yOwoJCQkJY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYVByb3AsIGNyUHJvcCk7CgkJCQljb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihhckNvbG9yLCBjckNvbG9yKTsKCgkJCQlpZiAoY3JDb2xvciAhPSBjclByb3ApCgkJCQl7CgkJCQkJQ0pTX1Byb3BWYWx1ZSB2UHJvcDIoaXNvbGF0ZSk7CgkJCQkJdlByb3AyLlN0YXJ0R2V0dGluZygpOwoJCQkJCXZQcm9wMjw8YXJDb2xvcjsKCQkJCQl2UHJvcDIuU3RhcnRTZXR0aW5nKCk7CiAgICAgCQkJCWZUYXJnZXQtPnRleHRDb2xvcihjYyx2UHJvcDIsc0Vycm9yKTsKCQkJCX0KCQkJfQoJCX0KCX0KCVZhbHVlID0gc3RyVmFsdWUyLmNfc3RyKCk7CiNlbmRpZgoJcmV0dXJuIFRSVUU7Cn0KCi8vZnVuY3Rpb24gQUZOdW1iZXJfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCQoJaWYocGFyYW1zLnNpemUoKSA8IDIpCgkJcmV0dXJuIEZBTFNFOwoJaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwoJCglpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQoJCWlTZXBTdHlsZSA9IDA7CglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglDRlhfV2lkZVN0cmluZyAmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsJCglDRlhfV2lkZVN0cmluZyAmIHdfc3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICAgIENGWF9XaWRlU3RyaW5nIHdfc3RyVmFsdWUgPSB2YWw7CgoJaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQoJewoJCUNGWF9XaWRlU3RyaW5nIHdzdHJDaGFuZ2UgPSB3X3N0ckNoYW5nZTsKCQlDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSBTdHJMVHJpbSh3X3N0clZhbHVlLmNfc3RyKCkpOwoJCWlmICh3c3RyVmFsdWUuSXNFbXB0eSgpKQoJCQlyZXR1cm4gVFJVRTsKCQkKCQlDRlhfV2lkZVN0cmluZyBzd1RlbXAgPSB3c3RyVmFsdWU7CgkJc3dUZW1wLlJlcGxhY2UoTCIsIiwgTCIuIik7CgkJaWYgKCFJc051bWJlcihzd1RlbXAuY19zdHIoKSkpCgkJewoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwoJCQlBbGVydChwQ29udGV4dCwgc0Vycm9yLmNfc3RyKCkpOwoJCQlyZXR1cm4gVFJVRTsKCQl9CgkJcmV0dXJuIFRSVUU7IC8vIGl0IGhhcHBlbnMgYWZ0ZXIgdGhlIGxhc3Qga2V5c3Ryb2tlIGFuZCBiZWZvcmUgdmFsaWRhdGluZywKCX0KCglzdGQ6OndzdHJpbmcgd19zdHJWYWx1ZTIgPSB3X3N0clZhbHVlLmNfc3RyKCk7CglzdGQ6OndzdHJpbmcgd19zdHJDaGFuZ2UyID0gd19zdHJDaGFuZ2UuY19zdHIoKTsKCXN0ZDo6d3N0cmluZyB3X3N0clNlbGVjdGVkOwoJaWYoLTEgIT0gcEV2ZW50LT5TZWxTdGFydCgpKQoJCXdfc3RyU2VsZWN0ZWQgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxTdGFydCgpLChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKSk7CglGWF9CT09MIGJIYXNTaWduID0gKHdfc3RyVmFsdWUyLmZpbmQoJy0nKSAhPSAtMSkgJiYgKHdfc3RyU2VsZWN0ZWQuZmluZCgnLScpID09IC0xKTsKCWlmIChiSGFzU2lnbikKCXsKCQkvL2Nhbid0IGluc2VydCAiY2hhbmdlIiBpbiBmcm9udCB0byBzaWduIHBvc3Rpb24uCgkJaWYgKHBFdmVudC0+U2VsU3RhcnQoKSA9PSAwKQoJCXsKICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQliUmMgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJfQoKCWNoYXIgY1NlcCA9IEwnLic7CgoJc3dpdGNoIChpU2VwU3R5bGUpCgl7CgljYXNlIDA6CgljYXNlIDE6CgkJY1NlcCA9IEwnLic7CgkJYnJlYWs7CgljYXNlIDI6CgljYXNlIDM6CgkJY1NlcCA9IEwnLCc7CgkJYnJlYWs7Cgl9CgkKCUZYX0JPT0wgYkhhc1NlcCA9ICh3X3N0clZhbHVlMi5maW5kKGNTZXApICE9IC0xKTsKCWZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdfc3RyQ2hhbmdlMi5iZWdpbigpOyBpdCAhPSB3X3N0ckNoYW5nZTIuZW5kKCk7IGl0KyspCgl7CgkJaWYgKCppdCA9PSBjU2VwKQoJCXsKCQkJaWYgKGJIYXNTZXApCgkJCXsKCQkJCUZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKCQkJCWJSYyA9IEZBTFNFOwoJCQkJcmV0dXJuIFRSVUU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQliSGFzU2VwID0gVFJVRTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoJCWlmICgqaXQgPT0gTCctJykKCQl7CgkJCWlmIChiSGFzU2lnbikKCQkJewoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQkJYlJjID0gRkFMU0U7CgkJCQlyZXR1cm4gVFJVRTsKCQkJfQoJCQllbHNlIGlmIChpdCAhPSB3X3N0ckNoYW5nZTIuYmVnaW4oKSkgLy9zaWduJ3MgcG9zaXRpb24gaXMgbm90IGNvcnJlY3QKCQkJewoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQkJYlJjID0gRkFMU0U7CgkJCQlyZXR1cm4gVFJVRTsKCQkJfQoJCQllbHNlIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgIT0gMCkKCQkJewoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQkJYlJjID0gRkFMU0U7CgkJCQlyZXR1cm4gVFJVRTsKCQkJfQoJCQliSGFzU2lnbiA9IFRSVUU7CgkJCWNvbnRpbnVlOwoJCX0KCQkKCQlpZiAoIUlzRGlnaXQoKml0KSkKCQl7CQkJCgkJCUZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKCQkJYlJjID0gRkFMU0U7CgkJCXJldHVybiBUUlVFOwoJCX0KCX0KCQoJCglzdGQ6OndzdHJpbmcgd19wcmVmaXggPSB3X3N0clZhbHVlMi5zdWJzdHIoMCxwRXZlbnQtPlNlbFN0YXJ0KCkpOwoJc3RkOjp3c3RyaW5nIHdfcG9zdGZpeDsKCWlmIChwRXZlbnQtPlNlbEVuZCgpPChpbnQpd19zdHJWYWx1ZTIubGVuZ3RoKCkpCgkJd19wb3N0Zml4ICA9IHdfc3RyVmFsdWUyLnN1YnN0cihwRXZlbnQtPlNlbEVuZCgpKTsKCXdfc3RyVmFsdWUyID0gd19wcmVmaXggKyB3X3N0ckNoYW5nZTIgKyB3X3Bvc3RmaXg7Cgl3X3N0clZhbHVlID0gd19zdHJWYWx1ZTIuY19zdHIoKTsKCXZhbCA9IHdfc3RyVmFsdWU7CglyZXR1cm4gVFJVRTsJCQoJCn0KCi8vZnVuY3Rpb24gQUZQZXJjZW50X0Zvcm1hdChuRGVjLCBzZXBTdHlsZSkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CgoJQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwoJQ0ZYX0J5dGVTdHJpbmcgc3RyVmFsdWUgPSBTdHJUcmltKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOwoJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKCQlyZXR1cm4gVFJVRTsKCglpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludCgpOwoJaWYgKGlEZWMgPCAwKQoJCWlEZWMgPSAtaURlYzsKCglpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CglpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQoJCWlTZXBTdHlsZSA9IDA7CgoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkvL2ZvciBwcm9jZXNzaW5nIGRlY2ltYWwgcGxhY2VzCglkb3VibGUgZFZhbHVlID0gYXRvZihzdHJWYWx1ZSk7CglkVmFsdWUgKj0gMTAwOwoJaWYgKGlEZWMgPiAwKQoJCWRWYWx1ZSArPSBET1VCTEVfQ09SUkVDVDsvL9Cj1f0KCglpbnQgaURlYzI7CglGWF9CT09MIGJOYWdhdGl2ZSA9IEZBTFNFOwoJc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5hZ2F0aXZlKTsKICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgl7CgkJZFZhbHVlID0gMDsKCQlzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLGlEZWMsJmlEZWMyLCZiTmFnYXRpdmUpOwoJfQoKCWlmIChpRGVjMiA8IDApCgl7CgkJZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPCBhYnMoaURlYzIpOyBpTnVtKyspCgkJewoJCQlzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOwoJCX0KCQlpRGVjMiA9IDA7CgkJCgl9CglpbnQgaU1heCA9IHN0clZhbHVlLkdldExlbmd0aCgpOwoJaWYgKGlEZWMyID4gaU1heCkKCXsKCQlmb3IgKGludCBpTnVtID0gMDsgaU51bSA8PSBpRGVjMiAtIGlNYXg7IGlOdW0rKykKCQl7CgkJCXN0clZhbHVlICs9ICIwIjsKCQl9CgkJaU1heCA9IGlEZWMyKzE7CQkJCgl9CgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvL2ZvciBwcm9jZXNzaW5nIHNlcGVyYXRvciBzdHlsZQoJaWYgKGlEZWMyIDwgaU1heCkKCXsKCQlpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDEpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcuJyk7CgkJCWlNYXgrKzsKCQl9CgkJZWxzZSBpZiAoaVNlcFN0eWxlID09IDIgfHwgaVNlcFN0eWxlID09IDMpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcsJyk7CgkJCWlNYXgrKzsKCQl9CgkJCgkJaWYgKGlEZWMyID09IDApCgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJzAnKTsKCX0KCWlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMikKCXsKCQljaGFyIGNTZXBlcmF0b3I7CgkJaWYgKGlTZXBTdHlsZSA9PSAwKQoJCQljU2VwZXJhdG9yID0gJywnOwoJCWVsc2UKCQkJY1NlcGVyYXRvciA9ICcuJzsKCQkKCQlpbnQgaURlY1Bvc2l0aXZlLGlEZWNOYWdhdGl2ZTsKCQlpRGVjUG9zaXRpdmUgPSBpRGVjMjsKCQlpRGVjTmFnYXRpdmUgPSBpRGVjMjsKCQkJCgkJZm9yIChpRGVjUG9zaXRpdmUgPSBpRGVjMiAtMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlY1Bvc2l0aXZlLGNTZXBlcmF0b3IpOwoJCQlpTWF4Kys7CgkJfQoJfQoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vbmFnYXRpdmUgbWFyawoJaWYoYk5hZ2F0aXZlKQoJCXN0clZhbHVlID0gIi0iICsgc3RyVmFsdWU7CglzdHJWYWx1ZSArPSAiJSI7CglWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOwojZW5kaWYKCXJldHVybiBUUlVFOwp9Ci8vQUZQZXJjZW50X0tleXN0cm9rZShuRGVjLCBzZXBTdHlsZSkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglyZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZEYXRlX0Zvcm1hdEV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCglDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwoJQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUgPSB2YWw7CglpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQoJCXJldHVybiBUUlVFOwoKCUNGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CglGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwoJZG91YmxlIGREYXRlID0gMC4wZjsKCglpZihzdHJWYWx1ZS5GaW5kKEwiR01UIikgIT0gLTEpCgl7CgkJLy9mb3IgR01UIGZvcm1hdCB0aW1lCgkJLy9zdWNoIGFzICJUdWUgQXVnIDExIDE0OjI0OjE2IEdNVCswODAwMjAwOSIKCQlkRGF0ZSA9IE1ha2VJbnRlckRhdGUoc3RyVmFsdWUpOwoJfQoJZWxzZQoJewoJCWREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLHNGb3JtYXQsYldyb25nRm9ybWF0KTsKCX0KCglpZiAoSlNfUG9ydElzTmFuKGREYXRlKSkKCXsKCQlDRlhfV2lkZVN0cmluZyBzd01zZzsKCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksIHNGb3JtYXQuY19zdHIoKSk7CgkJQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwoJCXJldHVybiBGQUxTRTsKCX0KCgl2YWwgPSAgTWFrZUZvcm1hdERhdGUoZERhdGUsc0Zvcm1hdCk7CglyZXR1cm4gVFJVRTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlSW50ZXJEYXRlKENGWF9XaWRlU3RyaW5nIHN0clZhbHVlKQp7CglpbnQgbkhvdXI7CglpbnQgbk1pbjsKCWludCBuU2VjOwoJaW50IG5ZZWFyOwoJaW50IG5Nb250aDsKCWludCBuRGF5OwoKCUNGWF9XaWRlU3RyaW5nQXJyYXkgd3NBcnJheTsKCUNGWF9XaWRlU3RyaW5nIHNNb250aCA9IEwiIjsKCUNGWF9XaWRlU3RyaW5nIHNUZW1wID0gTCIiOwoJaW50IG5TaXplID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CgoJZm9yKGludCBpID0gMDsgaSA8IG5TaXplOyBpKyspCgl7CgkJRlhfV0NIQVIgYyA9IHN0clZhbHVlLkdldEF0KGkpOwoJCWlmKGMgPT0gTCcgJyB8fCBjID09IEwnOicpCgkJewkKCQkJd3NBcnJheS5BZGQoc1RlbXApOwoJCQlzVGVtcCA9IEwiIjsKCQkJY29udGludWU7CgkJfQoKCQlzVGVtcCArPSBjOwoJfQoJCgl3c0FycmF5LkFkZChzVGVtcCk7CglpZih3c0FycmF5LkdldFNpemUoKSAhPSA4KXJldHVybiAwOwoKCXNUZW1wID0gd3NBcnJheVsxXTsKCWlmKHNUZW1wLkNvbXBhcmUoTCJKYW4iKSA9PSAwKSBuTW9udGggPSAxOwoJaWYoc1RlbXAuQ29tcGFyZShMIkZlYiIpID09IDApIG5Nb250aCA9IDI7CglpZihzVGVtcC5Db21wYXJlKEwiTWFyIikgPT0gMCkgbk1vbnRoID0gMzsKCWlmKHNUZW1wLkNvbXBhcmUoTCJBcHIiKSA9PSAwKSBuTW9udGggPSA0OwoJaWYoc1RlbXAuQ29tcGFyZShMIk1heSIpID09IDApIG5Nb250aCA9IDU7CglpZihzVGVtcC5Db21wYXJlKEwiSnVuIikgPT0gMCkgbk1vbnRoID0gNjsKCWlmKHNUZW1wLkNvbXBhcmUoTCJKdWwiKSA9PSAwKSBuTW9udGggPSA3OwoJaWYoc1RlbXAuQ29tcGFyZShMIkF1ZyIpID09IDApIG5Nb250aCA9IDg7CglpZihzVGVtcC5Db21wYXJlKEwiU2VwIikgPT0gMCkgbk1vbnRoID0gOTsKCWlmKHNUZW1wLkNvbXBhcmUoTCJPY3QiKSA9PSAwKSBuTW9udGggPSAxMDsKCWlmKHNUZW1wLkNvbXBhcmUoTCJOb3YiKSA9PSAwKSBuTW9udGggPSAxMTsKCWlmKHNUZW1wLkNvbXBhcmUoTCJEZWMiKSA9PSAwKSBuTW9udGggPSAxMjsKCgluRGF5ID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbMl0uY19zdHIoKSk7CgluSG91ciA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzNdLmNfc3RyKCkpOwoJbk1pbiA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzRdLmNfc3RyKCkpOwoJblNlYyA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzVdLmNfc3RyKCkpOwoJblllYXIgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs3XS5jX3N0cigpKTsKCglkb3VibGUgZFJldCA9IEpTX01ha2VEYXRlKEpTX01ha2VEYXkoblllYXIsbk1vbnRoIC0gMSxuRGF5KSxKU19NYWtlVGltZShuSG91ciwgbk1pbiwgblNlYywgMCkpOwoKCWlmIChKU19Qb3J0SXNOYW4oZFJldCkpCgl7CgkJZFJldCA9IEpTX0RhdGVQYXJzZShzdHJWYWx1ZS5jX3N0cigpKTsKCX0KCQoJcmV0dXJuIGRSZXQ7Cn0KCi8vQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKCXsKCQlpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQkJcmV0dXJuIEZBTFNFOwoJCUNGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwoJCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgkJCXJldHVybiBUUlVFOwoKCQlDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwoJCUZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CgkJZG91YmxlIGRSZXQgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwoJCWlmIChiV3JvbmdGb3JtYXQgfHwgSlNfUG9ydElzTmFuKGRSZXQpKQoJCXsKCQkJQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CgkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKCQkJQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJfQoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKCUZYX0xQQ1dTVFIgY0Zvcm1hdHNbXSA9ICB7TCJtL2QiLCBMIm0vZC95eSIsIEwibW0vZGQveXkiLCBMIm1tL3l5IiwgTCJkLW1tbSIsIEwiZC1tbW0teXkiLCBMImRkLW1tbS15eSIsCgkJTCJ5eS1tbS1kZCIsIEwibW1tLXl5IiwgTCJtbW1tLXl5IiwgTCJtbW0gZCwgeXl5eSIsIEwibW1tbSBkLCB5eXl5IiwKCQlMIm0vZC95eSBoOk1NIHR0IiwgTCJtL2QveXkgSEg6TU0iIH07CgoJQVNTRVJUKGlJbmRleCA8IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOwoKCWlmIChpSW5kZXggPCAwKQoJCWlJbmRleCA9IDA7CglpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCgkJaUluZGV4ID0gMDsKCUNKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKCUNKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKCW5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKCXJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwoJRlhfTFBDV1NUUiBjRm9ybWF0c1tdID0gIHtMIm0vZCIsIEwibS9kL3l5IiwgTCJtbS9kZC95eSIsIEwibW0veXkiLCBMImQtbW1tIiwgTCJkLW1tbS15eSIsIEwiZGQtbW1tLXl5IiwKCQlMInl5LW1tLWRkIiwgTCJtbW0teXkiLCBMIm1tbW0teXkiLCBMIm1tbSBkLCB5eXl5IiwgTCJtbW1tIGQsIHl5eXkiLAoJCUwibS9kL3l5IGg6TU0gdHQiLCBMIm0vZC95eSBISDpNTSIgfTsKCglBU1NFUlQoaUluZGV4PEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOwoKCWlmIChpSW5kZXggPCAwKQoJCWlJbmRleCA9IDA7CglpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCgkJaUluZGV4ID0gMDsKCUNKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKCUNKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKCW5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKCXJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKLy9mdW5jdGlvbiBBRlRpbWVfRm9ybWF0KHB0ZikKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CglGWF9MUENXU1RSIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLCBMImg6TU06c3MgdHQifTsKCglBU1NFUlQoaUluZGV4PEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOwoKCWlmIChpSW5kZXggPCAwKQoJCWlJbmRleCA9IDA7CglpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCgkJaUluZGV4ID0gMDsKCUNKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKCUNKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKCW5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKCXJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CgkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKCUZYX0xQQ1dTVFIgY0Zvcm1hdHNbXSA9IHtMIkhIOk1NIiwgTCJoOk1NIHR0IiwgTCJISDpNTTpzcyIsIEwiaDpNTTpzcyB0dCJ9OwoKCUFTU0VSVChpSW5kZXg8RlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7CgoJaWYgKGlJbmRleCA8IDApCgkJaUluZGV4ID0gMDsKCWlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKCQlpSW5kZXggPSAwOwoJQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwoJQ0pTX1ZhbHVlIHZhbChpc29sYXRlLGNGb3JtYXRzW2lJbmRleF0pOwoJbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwoJcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYyxwYXJhbXMsdlJldCxzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYyxwYXJhbXMsdlJldCxzRXJyb3IpOwp9CgovL2Z1bmN0aW9uIEFGU3BlY2lhbF9Gb3JtYXQocHNmKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJc3RkOjpzdHJpbmcgY0Zvcm1hdDsKCWludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKCglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCUNGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsJCglzdGQ6OnN0cmluZyBzdHJTcmMgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpLmNfc3RyKCk7CgkKCXN3aXRjaCAoaUluZGV4KSAKCXsKCWNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgCgkJY0Zvcm1hdCA9ICI5OTk5OSI7CgkJYnJlYWs7CgljYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgIAoJCWNGb3JtYXQgPSAiOTk5OTktOTk5OSI7CgkJYnJlYWs7CgljYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgIAoJCXsKCQkJc3RkOjpzdHJpbmcgTnVtYmVyU3RyOwoJCQl1dGlsOjpwcmludHgoIjk5OTk5OTk5OTkiLCBzdHJTcmMsTnVtYmVyU3RyKTsgCgkJCWlmIChOdW1iZXJTdHIubGVuZ3RoKCkgPj0gMTAgKQoJCQkJY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7CgkJCWVsc2UgCgkJCQljRm9ybWF0ID0gIjk5OS05OTk5IjsKCQkJYnJlYWs7CgkJfQoJY2FzZSAzOgoJCWNGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOwoJCWJyZWFrOwoJfQoJCglzdGQ6OnN0cmluZyBzdHJEZXM7Cgl1dGlsOjpwcmludHgoY0Zvcm1hdCxzdHJTcmMsc3RyRGVzKTsKCVZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJEZXMuY19zdHIoKSk7CglyZXR1cm4gVFJVRTsKfQoKCi8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZUV4KG1hc2spCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpIDwgMSkKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglDRlhfV2lkZVN0cmluZyYgdmFsRXZlbnQgPSBwRXZlbnQtPlZhbHVlKCk7CgoJQ0ZYX1dpZGVTdHJpbmcgd3N0ck1hc2sgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CglpZiAod3N0ck1hc2suSXNFbXB0eSgpKQoJCXJldHVybiBUUlVFOwoKCXN0ZDo6d3N0cmluZyB3c3RyVmFsdWUgPSB2YWxFdmVudC5jX3N0cigpOwoKCWlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKCXsKCQlpZiAod3N0clZhbHVlLmVtcHR5KCkpCgkJCXJldHVybiBUUlVFOwoJCWludCBpSW5kZXhNYXNrID0gMDsKCQlmb3IgKHN0ZDo6d3N0cmluZzo6aXRlcmF0b3IgaXQgPSB3c3RyVmFsdWUuYmVnaW4oKTsgaXQgIT0gd3N0clZhbHVlLmVuZCgpOyBpdCsrKQoJCXsKCQkJd2NoYXJfdCB3X1ZhbHVlID0gKml0OwoJCQlpZiAoIW1hc2tTYXRpc2ZpZWQod19WYWx1ZSx3c3RyTWFza1tpSW5kZXhNYXNrXSkpCgkJCQlicmVhazsKCQkJaUluZGV4TWFzaysrOwoJCX0KCgkJaWYgKGlJbmRleE1hc2sgIT0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgfHwgKGlJbmRleE1hc2sgIT0gd3N0clZhbHVlLnNpemUoKSAmJiB3c3RyTWFzay5HZXRMZW5ndGgoKSAhPSAwKSkKCQl7CgkJCUFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSkuY19zdHIoKSk7CgkJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwoJCX0KCQlyZXR1cm4gVFJVRTsKCX0KCglDRlhfV2lkZVN0cmluZyAmd2lkZUNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCk7CglzdGQ6OndzdHJpbmcgd0NoYW5nZSA9IHdpZGVDaGFuZ2UuY19zdHIoKTsKCWlmICh3Q2hhbmdlLmVtcHR5KCkpCgkJcmV0dXJuIFRSVUU7CgoJaW50IGlJbmRleE1hc2sgPSBwRXZlbnQtPlNlbFN0YXJ0KCk7CgoJaWYgKHdzdHJWYWx1ZS5sZW5ndGgoKSAtIChwRXZlbnQtPlNlbEVuZCgpLXBFdmVudC0+U2VsU3RhcnQoKSkgKyB3Q2hhbmdlLmxlbmd0aCgpID4gKEZYX0RXT1JEKXdzdHJNYXNrLkdldExlbmd0aCgpKQoJewoJCUFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwoJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwoJCXJldHVybiBUUlVFOwoJfQoKCWlmIChpSW5kZXhNYXNrID49IHdzdHJNYXNrLkdldExlbmd0aCgpICYmICghd0NoYW5nZS5lbXB0eSgpKSkKCXsKCQlBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQlyZXR1cm4gVFJVRTsKCX0KCglmb3IgKHN0ZDo6d3N0cmluZzo6aXRlcmF0b3IgaXQgPSB3Q2hhbmdlLmJlZ2luKCk7IGl0ICE9IHdDaGFuZ2UuZW5kKCk7IGl0KyspCgl7CgkJaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkpCgkJewoJCQlBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJCXJldHVybiBUUlVFOwoJCX0KCQl3Y2hhcl90IHdfTWFzayA9IHdzdHJNYXNrW2lJbmRleE1hc2tdOwoJCWlmICghaXNSZXNlcnZlZE1hc2tDaGFyKHdfTWFzaykpCgkJewoJCQkqaXQgPSB3X01hc2s7CgkJfQoJCXdjaGFyX3Qgd19DaGFuZ2UgPSAqaXQ7CgkJaWYgKCFtYXNrU2F0aXNmaWVkKHdfQ2hhbmdlLHdfTWFzaykpCgkJewoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJCWlJbmRleE1hc2srKzsKCX0KCgl3aWRlQ2hhbmdlID0gd0NoYW5nZS5jX3N0cigpOwoJcmV0dXJuIFRSVUU7Cn0KCgovL2Z1bmN0aW9uIEFGU3BlY2lhbF9LZXlzdHJva2UocHNmKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglzdGQ6OnN0cmluZyBjRm9ybWF0OwoJaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwoKCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCS8vQ0pTX1ZhbHVlIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKCUNGWF9XaWRlU3RyaW5nJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CglzdGQ6OnN0cmluZyBzdHJTcmMgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUodmFsKS5jX3N0cigpOwoJc3RkOjp3c3RyaW5nIHdzdHJDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpLmNfc3RyKCk7CgoJc3dpdGNoIChpSW5kZXgpIAoJewoJY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAKCQljRm9ybWF0ID0gIjk5OTk5IjsKCQlicmVhazsKCWNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgCgkJLy9jRm9ybWF0ID0gIjk5OTk5LTk5OTkiOwoJCWNGb3JtYXQgPSAiOTk5OTk5OTk5IjsKCQlicmVhazsKCWNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgCgkJewoJCQlzdGQ6OnN0cmluZyBOdW1iZXJTdHI7CgkJCXV0aWw6OnByaW50eCgiOTk5OTk5OTk5OSIsIHN0clNyYyxOdW1iZXJTdHIpOyAKCQkJaWYgKHN0clNyYy5sZW5ndGgoKSArIHdzdHJDaGFuZ2UubGVuZ3RoKCkgPiA3ICkKCQkJCS8vY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7CgkJCQljRm9ybWF0ID0gIjk5OTk5OTk5OTkiOwoJCQllbHNlIAoJCQkJLy9jRm9ybWF0ID0gIjk5OS05OTk5IjsKCQkJCWNGb3JtYXQgPSAiOTk5OTk5OSI7CgkJCWJyZWFrOwoJCX0KCWNhc2UgMzoKCQkvL2NGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOwoJCWNGb3JtYXQgPSAiOTk5OTk5OTk5IjsKCQlicmVhazsKCX0KICAgIAoJQ0pTX1BhcmFtZXRlcnMgcGFyYW1zMjsKCUNKU19WYWx1ZSB2TWFzayhpc29sYXRlLCBjRm9ybWF0LmNfc3RyKCkpOwoJcGFyYW1zMi5wdXNoX2JhY2sodk1hc2spOwoJCiAgICByZXR1cm4gQUZTcGVjaWFsX0tleXN0cm9rZUV4KGNjLHBhcmFtczIsdlJldCxzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1lcmdlQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50SGFuZGxlciA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnRIYW5kbGVyICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZTsKCWlmIChwRXZlbnRIYW5kbGVyLT5tX3BWYWx1ZSAhPSBOVUxMKQoJCXN3VmFsdWUgPSBwRXZlbnRIYW5kbGVyLT5WYWx1ZSgpOwoKCWlmIChwRXZlbnRIYW5kbGVyLT5XaWxsQ29tbWl0KCkpCgl7CgkJdlJldCA9IHN3VmFsdWUuY19zdHIoKTsKCQlyZXR1cm4gVFJVRTsKCX0KCglDRlhfV2lkZVN0cmluZyBwcmVmaXgscG9zdGZpeDsKCglpZiAocEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSA+PSAwKQoJCXByZWZpeCA9IHN3VmFsdWUuTWlkKDAscEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSk7CgllbHNlCgkJcHJlZml4ID0gTCIiOwoKCglpZiAocEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPj0gMCAmJiBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA8PSBzd1ZhbHVlLkdldExlbmd0aCgpKQoJCXBvc3RmaXggPSBzd1ZhbHVlLk1pZChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSwgc3dWYWx1ZS5HZXRMZW5ndGgoKSAtIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpKTsKCWVsc2UgcG9zdGZpeCA9IEwiIjsKCgl2UmV0ID0gKHByZWZpeCArIHBFdmVudEhhbmRsZXItPkNoYW5nZSgpICsgcG9zdGZpeCkuY19zdHIoKTsKCglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAyKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCUNGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7CgoJRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKCWRvdWJsZSBkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwoKCWlmIChKU19Qb3J0SXNOYW4oZERhdGUpKQoJewoJCUNGWF9XaWRlU3RyaW5nIHN3TXNnOwoJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKCQlBbGVydCgoQ0pTX0NvbnRleHQgKiljYywgc3dNc2cuY19zdHIoKSk7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCXZSZXQgPSBkRGF0ZTsKCXJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglpZiAocGFyYW1zLnNpemUoKSAhPSAzKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJdlJldCA9IChkb3VibGUpQUZfU2ltcGxlKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLCBwYXJhbXNbMV0uVG9Eb3VibGUoKSwgcGFyYW1zWzJdLlRvRG91YmxlKCkpOwoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWFrZU51bWJlcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9Cgl2UmV0ID0gUGFyc2VTdHJpbmdUb051bWJlcihwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAyKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNKU19WYWx1ZSBwYXJhbXMxID0gcGFyYW1zWzFdOwoKCWlmICghcGFyYW1zMS5Jc0FycmF5T2JqZWN0KCkgJiYgcGFyYW1zMS5HZXRUeXBlKCkgIT0gVlRfc3RyaW5nKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKICAgIEFTU0VSVChwUmVhZGVyRG9jICE9IE5VTEwpOwoKCUNQREZTREtfSW50ZXJGb3JtKiBwUmVhZGVySW50ZXJGb3JtID0gcFJlYWRlckRvYy0+R2V0SW50ZXJGb3JtKCk7CglBU1NFUlQocFJlYWRlckludGVyRm9ybSAhPSBOVUxMKTsKCglDUERGX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBSZWFkZXJJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwoJQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CgoJZG91YmxlIGRWYWx1ZTsKCUNGWF9XaWRlU3RyaW5nIHNGdW5jdGlvbiA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCWlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiUFJEIikgPT0gMCkKICAgIAlkVmFsdWUgPSAxLjA7CgllbHNlCgkJZFZhbHVlID0gMC4wOwoKCUNKU19BcnJheSBGaWVsZE5hbWVBcnJheSA9IEFGX01ha2VBcnJheUZyb21MaXN0KGlzb2xhdGUscGFyYW1zMSk7CgoJaW50IG5GaWVsZHNDb3VudCA9IDA7CgoJZm9yIChpbnQgaT0wLGlzej1GaWVsZE5hbWVBcnJheS5HZXRMZW5ndGgoKTsgaTxpc3o7IGkrKykKCXsKCQlDSlNfVmFsdWUganNWYWx1ZShpc29sYXRlKTsKCQlGaWVsZE5hbWVBcnJheS5HZXRFbGVtZW50KGksanNWYWx1ZSk7CgkJQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZE5hbWUgPSBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpOwoKICAgICAgICBmb3IgKGludCBqPTAsanN6PXBJbnRlckZvcm0tPkNvdW50RmllbGRzKHdzRmllbGROYW1lKTsgajxqc3o7IGorKykKCQl7CgkJCWlmIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBJbnRlckZvcm0tPkdldEZpZWxkKGosIHdzRmllbGROYW1lKSkKCQkJewoJCQkJZG91YmxlIGRUZW1wID0gMC4wOwoKCQkJCXN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpCgkJCQl7CgkJCQljYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CgkJCQljYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKCQkJCQl7CgkJCQkJCWRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQljYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgoJCQkJCXsKCQkJCQkJZFRlbXAgPSAwLjA7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCWNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgoJCQkJY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CgkJCQkJewoJCQkJCQlkVGVtcCA9IDAuMDsKCQkJCQkJZm9yIChpbnQgYz0wLGNzej1wRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGM8Y3N6OyBjKyspCgkJCQkJCXsKCQkJCQkJCWlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGMpKQoJCQkJCQkJewoJCQkJCQkJCWlmIChwRm9ybUN0cmwtPklzQ2hlY2tlZCgpKQoJCQkJCQkJCXsKCQkJCQkJCQkJZFRlbXAgKz0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUN0cmwtPkdldEV4cG9ydFZhbHVlKCkuY19zdHIoKSk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCWNhc2UgRklFTERUWVBFX0xJU1RCT1g6CgkJCQkJewoJCQkJCQlkVGVtcCA9IDAuMDsKCQkJCQkJaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKCQkJCQkJCWJyZWFrOwoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQlkZWZhdWx0OgoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmIChpID09IDAgJiYgaiA9PSAwICYmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUlOIikgPT0gMCB8fCB3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUFYIikgPT0gMCkpCgkJCQkJZFZhbHVlID0gZFRlbXA7CgoJCQkJZFZhbHVlID0gQUZfU2ltcGxlKHNGdW5jdGlvbi5jX3N0cigpLCBkVmFsdWUsIGRUZW1wKTsKCgkJCQluRmllbGRzQ291bnQrKzsKCQkJfQoJCX0KCX0KCglpZiAod2NzY21wKHNGdW5jdGlvbi5jX3N0cigpLCBMIkFWRyIpID09IDAgJiYgbkZpZWxkc0NvdW50ID4gMCkKCQlkVmFsdWUgLz0gbkZpZWxkc0NvdW50OwoKCWRWYWx1ZSA9IChkb3VibGUpZmxvb3IoZFZhbHVlICogRlhTWVNfcG93KChkb3VibGUpMTAsKGRvdWJsZSk2KSArIDAuNDkpIC8gRlhTWVNfcG93KChkb3VibGUpMTAsKGRvdWJsZSk2KTsKCUNKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUsZFZhbHVlKTsKCWlmKChDSlNfRXZlbnRIYW5kbGVyKilwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCktPm1fcFZhbHVlKQoJCSgoQ0pTX0V2ZW50SGFuZGxlciopcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpKS0+VmFsdWUoKSA9IGpzVmFsdWUuVG9DRlhXaWRlU3RyaW5nKCk7CgoJcmV0dXJuIFRSVUU7Cn0KCi8qIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIHRoZSBjdXJyZW50IGV2ZW50IHRvIGVuc3VyZSB0aGF0IGl0cyB2YWx1ZSBpcyAKKiogd2l0aGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuICovCgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSA0KSAKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglpZiAocEV2ZW50LT5WYWx1ZSgpLklzRW1wdHkoKSApCgkJcmV0dXJuIFRSVUU7Cglkb3VibGUgZEVlbnRWYWx1ZSA9IGF0b2YoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBFdmVudC0+VmFsdWUoKSkpOwoJRlhfQk9PTCBiR3JlYXRlclRoYW4gPSBwYXJhbXNbMF0uVG9Cb29sKCk7Cglkb3VibGUgZEdyZWF0ZXJUaGFuID0gcGFyYW1zWzFdLlRvRG91YmxlKCk7CglGWF9CT09MIGJMZXNzVGhhbiA9IHBhcmFtc1syXS5Ub0Jvb2woKTsKCWRvdWJsZSBkTGVzc1RoYW4gPSBwYXJhbXNbM10uVG9Eb3VibGUoKTsKCUNGWF9XaWRlU3RyaW5nIHN3TXNnOwoKCWlmIChiR3JlYXRlclRoYW4gJiYgYkxlc3NUaGFuKQoJewoJCWlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuIHx8IGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCgkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMSkuY19zdHIoKSwKCQkJCQkJIHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLAoJCQkJCQkgcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwoJfQoJZWxzZSBpZiAoYkdyZWF0ZXJUaGFuKQoJewoJCWlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuKQoJCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTIpLmNfc3RyKCksCgkJCQkJCSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7Cgl9CgllbHNlIGlmIChiTGVzc1RoYW4pCgl7CgkJaWYgKGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCgkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMykuY19zdHIoKSwKCQkJCQkJIHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKCX0KCglpZiAoIXN3TXNnLklzRW1wdHkoKSkKCXsKCQlBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CgkJcEV2ZW50LT5SYygpID0gRkFMU0U7Cgl9CglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZFeHRyYWN0TnVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIAoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNKU19BcnJheSBudW1zKGlzb2xhdGUpOwoKCUNGWF9XaWRlU3RyaW5nIHN0ciA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCUNGWF9XaWRlU3RyaW5nIHNQYXJ0OwoKCWlmIChzdHIuR2V0QXQoMCkgPT0gTCcuJyB8fCBzdHIuR2V0QXQoMCkgPT0gTCcsJykKCQlzdHIgPSBMIjAiICsgc3RyOwoKCWludCBuSW5kZXggPSAwOwoJZm9yIChpbnQgaT0wLCBzej1zdHIuR2V0TGVuZ3RoKCk7IGk8c3o7IGkrKykKCXsKCQlGWF9XQ0hBUiB3YyA9IHN0ci5HZXRBdChpKTsKCQlpZiAoSXNEaWdpdCgod2NoYXJfdCl3YykpCgkJewoJCQlzUGFydCArPSB3YzsKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkKCQkJewoJCQkJbnVtcy5TZXRFbGVtZW50KG5JbmRleCxDSlNfVmFsdWUoaXNvbGF0ZSxzUGFydC5jX3N0cigpKSk7CgkJCQlzUGFydCA9IEwiIjsKCQkJCW5JbmRleCArKzsKCQkJfQoJCX0KCX0KCglpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKQoJewoJCW51bXMuU2V0RWxlbWVudChuSW5kZXgsQ0pTX1ZhbHVlKGlzb2xhdGUsc1BhcnQuY19zdHIoKSkpOwkKCX0KCglpZiAobnVtcy5HZXRMZW5ndGgoKSA+IDApCgkJdlJldCA9IG51bXM7CgllbHNlCgkJdlJldC5TZXROdWxsKCk7CgoJcmV0dXJuIFRSVUU7Cn0K