Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAovLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQoKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9yZXNvdXJjZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3V0aWwuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oIgoKc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElGWEpTX0NvbnRleHQqIGNjKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CglBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CgoJcmV0dXJuIHBSdW50aW1lLT5HZXRJc29sYXRlKCk7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfUHVibGljTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKI2RlZmluZSBET1VCTEVfQ09SUkVDVAkwLjAwMDAwMDAwMDAwMDAwMQoKQkVHSU5fSlNfU1RBVElDX0dMT0JBTF9GVU4oQ0pTX1B1YmxpY01ldGhvZHMpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9Gb3JtYXQsNikKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0tleXN0cm9rZSw2KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0Zvcm1hdCwyKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0tleXN0cm9rZSwyKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdEV4LDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfS2V5c3Ryb2tlRXgsMSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXQsMSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2UsMSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9Gb3JtYXRFeCwxKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZUV4LDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0LDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlLDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfRm9ybWF0LDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlLDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlRXgsMSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlLDMpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk1ha2VOdW1iZXIsMSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlX0NhbGN1bGF0ZSwyKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZSYW5nZV9WYWxpZGF0ZSw0KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNZXJnZUNoYW5nZSwxKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQYXJzZURhdGVFeCwyKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZFeHRyYWN0TnVtcywxKQpFTkRfSlNfU1RBVElDX0dMT0JBTF9GVU4oKQoKSU1QTEVNRU5UX0pTX1NUQVRJQ19HTE9CQUxfRlVOKENKU19QdWJsaWNNZXRob2RzKQoKc3RydWN0IHN0cnVfVGJDb252ZXJ0CnsKCUZYX0xQQ1NUUiBscHN6SlNNYXJrOwoJRlhfTFBDU1RSIGxwc3pDcHBNYXJrOwp9OwoKc3RhdGljIGNvbnN0IHN0cnVfVGJDb252ZXJ0IGZjVGFibGVbXSA9IHsKCXsgIm1tbW0iLCIlQiIgfSwKCXsgIm1tbSIsICIlYiIgfSwKCXsgIm1tIiwgICIlbSIgfSwKCS8vIm0iCgl7ICJkZGRkIiwiJUEiIH0sCgl7ICJkZGQiLCAiJWEiIH0sCgl7ICJkZCIsICAiJWQiIH0sCgkvLyJkIiwgICAiJXciLAoJeyAieXl5eSIsIiVZIiB9LAoJeyAieXkiLCAgIiV5IiB9LAoJeyAiSEgiLCAgIiVIIiB9LAoJLy8iSCIKCXsgImhoIiwgICIlSSIgfSwKCS8vImgiCgl7ICJNTSIsICAiJU0iIH0sCgkvLyJNIgoJeyAic3MiLCAgIiVTIiB9LAoJLy8icwoJeyAidHQiLCAgIiVwIiB9LAoJLy8idCIKfTsKCnN0YXRpYyBGWF9MUENXU1RSIG1vbnRoc1tdID0KewoJTCJKYW4iLCBMIkZlYiIsIEwiTWFyIiwgTCJBcHIiLCBMIk1heSIsIEwiSnVuIiwgTCJKdWwiLCBMIkF1ZyIsIEwiU2VwIiwgTCJPY3QiLCBMIk5vdiIsIEwiRGVjIgp9OwoKc3RhdGljIEZYX0xQQ1dTVFIgZnVsbG1vbnRoc1tdID0gCnsgCglMIkphbnVhcnkiLCBMIkZlYnJ1YXJ5IiwgTCJNYXJjaCIsIEwiQXByaWwiLCBMIk1heSIsIEwiSnVuZSIsIEwiSnVseSIsIEwiQXVndXN0IiwgTCJTZXB0ZW1iZXIiLCBMIk9jdG9iZXIiLCBMIk5vdmVtYmVyIiwgTCJEZWNlbWJlciIgCn07CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc051bWJlcihGWF9MUENXU1RSIHN0cmluZykKewoJQ0ZYX1dpZGVTdHJpbmcgc1RyaW0gPSBTdHJUcmltKHN0cmluZyk7CglGWF9MUENXU1RSIHBUcmltID0gc1RyaW07CglGWF9MUENXU1RSIHAgPSBwVHJpbTsKCgoJRlhfQk9PTCBiRG90ID0gRkFMU0U7CglGWF9CT09MIGJLWEpTID0gRkFMU0U7CgoJd2NoYXJfdCBjOwoJd2hpbGUgKChjID0gKnApKQoJewoJCWlmIChjID09ICcuJyB8fCBjID09ICcsJykKCQl7CgkJCWlmIChiRG90KSByZXR1cm4gRkFMU0U7CgkJCWJEb3QgPSBUUlVFOwoJCX0KCQllbHNlIGlmIChjID09ICctJyB8fCBjID09ICcrJykKCQl7CgkJCWlmIChwICE9IHBUcmltKQoJCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQllbHNlIGlmIChjID09ICdlJyB8fCBjID09ICdFJykKCQl7CgkJCWlmIChiS1hKUykgcmV0dXJuIEZBTFNFOwoKCQkJcCsrOwoJCQljID0gKnA7CgkJCWlmIChjID09ICcrJyB8fCBjID09ICctJykKCQkJewoJCQkJYktYSlMgPSBUUlVFOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIEZBTFNFOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCFJc0RpZ2l0KGMpKQoJCXsKCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQlwKys7Cgl9CgoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzRGlnaXQod2NoYXJfdCBjaCkKewoJcmV0dXJuIChjaCA+PSBMJzAnICYmIGNoIDw9IEwnOScpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0RpZ2l0KGNoYXIgY2gpCnsKCXJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKQp7CglyZXR1cm4gKChjaCA+PSBMJ2EnICYmIGNoIDw9IEwneicpIHx8IChjaCA+PSBMJ0EnICYmIGNoIDw9IEwnWicpKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNBbHBoYU51bWVyaWMod2NoYXJfdCBjaCkKewoJcmV0dXJuIChJc0RpZ2l0KGNoKSB8fCBJc0FscGhhYmV0aWMoY2gpKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6bWFza1NhdGlzZmllZCh3Y2hhcl90IGNfQ2hhbmdlLHdjaGFyX3QgY19NYXNrKQp7Cglzd2l0Y2ggKGNfTWFzaykKCXsKCWNhc2UgTCc5JzoKICAgICAgICByZXR1cm4gSXNEaWdpdChjX0NoYW5nZSk7CQkKICAgIGNhc2UgTCdBJzoKICAgICAgICByZXR1cm4gSXNBbHBoYWJldGljKGNfQ2hhbmdlKTsJCQogICAgY2FzZSBMJ08nOgogICAgICAgIHJldHVybiBJc0FscGhhTnVtZXJpYyhjX0NoYW5nZSk7CQkKICAgIGNhc2UgTCdYJzoKICAgICAgICByZXR1cm4gVFJVRTsJCQoJZGVmYXVsdDoKICAgICAgICByZXR1cm4gKGNfQ2hhbmdlID09IGNfTWFzayk7Cgl9Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OmlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKQp7CglyZXR1cm4gY2ggPT0gTCc5JyB8fCBjaCA9PSBMJ0EnIHx8IGNoID09IEwnTycgfHwgY2ggPT0gTCdYJzsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpBRl9TaW1wbGUoRlhfTFBDV1NUUiBzRnVjdGlvbiwgZG91YmxlIGRWYWx1ZTEsIGRvdWJsZSBkVmFsdWUyKQp7CglpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIkFWRyIpID09IDAgfHwgRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIlNVTSIpID09IDApCgl7CgkJcmV0dXJuIGRWYWx1ZTEgKyBkVmFsdWUyOwoJfQoJZWxzZSBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJQUkQiKSA9PSAwKQoJewoJCXJldHVybiBkVmFsdWUxICogZFZhbHVlMjsKCX0KCWVsc2UgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJNSU4iKSA9PSAwKQoJewoJCXJldHVybiBGWF9NSU4oZFZhbHVlMSwgZFZhbHVlMik7Cgl9CgllbHNlIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLEwiTUFYIikgPT0gMCkKCXsKCQlyZXR1cm4gRlhfTUFYKGRWYWx1ZTEsIGRWYWx1ZTIpOwoJfQoKCXJldHVybiBkVmFsdWUxOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyTFRyaW0oRlhfTFBDV1NUUiBwU3RyKQp7Cgl3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gTCcgJykgcFN0cisrOwoKCXJldHVybiBwU3RyOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyUlRyaW0oRlhfTFBDV1NUUiBwU3RyKQp7CglGWF9MUENXU1RSIHAgPSBwU3RyOwoJd2hpbGUgKCpwKSBwKys7Cgl3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykgcC0tOwoKCXJldHVybiBDRlhfV2lkZVN0cmluZyhwU3RyLCBwIC0gcFN0cik7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJUcmltKEZYX0xQQ1dTVFIgcFN0cikKewoJcmV0dXJuIFN0clJUcmltKFN0ckxUcmltKHBTdHIpKTsKfQoKQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0ckxUcmltKEZYX0xQQ1NUUiBwU3RyKQp7Cgl3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gJyAnKSBwU3RyKys7CgogICAgICAgIHJldHVybiBwU3RyOwp9CgpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyUlRyaW0oRlhfTFBDU1RSIHBTdHIpCnsKCUZYX0xQQ1NUUiBwID0gcFN0cjsKCXdoaWxlICgqcCkgcCsrOwoJd2hpbGUgKHAgPiBwU3RyICYmICoocCAtIDEpID09IEwnICcpIHAtLTsKCglyZXR1cm4gQ0ZYX0J5dGVTdHJpbmcocFN0cixwLXBTdHIpOwp9CgpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyVHJpbShGWF9MUENTVFIgcFN0cikKewoJcmV0dXJuIFN0clJUcmltKFN0ckxUcmltKHBTdHIpKTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU51bWJlcihGWF9MUENXU1RSIHN3U291cmNlLCBGWF9CT09MJiBiQWxsRGlnaXRzLCBGWF9CT09MJiBiRG90LCBGWF9CT09MJiBiU2lnbiwgRlhfQk9PTCYgYktYSlMpCnsKCWJEb3QgPSBGQUxTRTsKCWJTaWduID0gRkFMU0U7CgliS1hKUyA9IEZBTFNFOwoKCUZYX0JPT0wgYkRpZ2l0RXhpc3QgPSBGQUxTRTsKCglGWF9MUENXU1RSIHAgPSBzd1NvdXJjZTsKCXdjaGFyX3QgYzsKCglGWF9MUENXU1RSIHBTdGFydCA9IE5VTEw7CglGWF9MUENXU1RSIHBFbmQgPSBOVUxMOwoKCXdoaWxlICgoYyA9ICpwKSkKCXsKCQlpZiAoIXBTdGFydCAmJiBjICE9IEwnICcpCgkJewoJCQlwU3RhcnQgPSBwOwoJCX0KCgkJcEVuZCA9IHA7CgkJcCsrOwoJfQoKCWlmICghcFN0YXJ0KQoJewoJCWJBbGxEaWdpdHMgPSBGQUxTRTsKCQlyZXR1cm4gMDsKCX0KCgl3aGlsZSAocEVuZCAhPSBwU3RhcnQpCgl7CgkJaWYgKCpwRW5kID09IEwnICcpCgkJCXBFbmQgLS07CgkJZWxzZQoJCQlicmVhazsKCX0KCglkb3VibGUgZFJldCA9IDA7CglwID0gcFN0YXJ0OwoJYkFsbERpZ2l0cyA9IFRSVUU7CglDRlhfV2lkZVN0cmluZyBzd0RpZ2l0czsKCgl3aGlsZSAocCA8PSBwRW5kKQoJewkKCQljID0gKnA7CgoJCWlmIChJc0RpZ2l0KGMpKQoJCXsKCQkJc3dEaWdpdHMgKz0gYzsKCQkJYkRpZ2l0RXhpc3QgPSBUUlVFOwoJCX0KCQllbHNlIAoJCXsKCQkJc3dpdGNoIChjKQoJCQl7CgkJCWNhc2UgTCcgJzoKCQkJCWJBbGxEaWdpdHMgPSBGQUxTRTsKCQkJCWJyZWFrOwoJCQljYXNlIEwnLic6CgkJCWNhc2UgTCcsJzoKCQkJCWlmICghYkRvdCkKCQkJCXsKCQkJCQlpZiAoYkRpZ2l0RXhpc3QpCgkJCQkJewoJCQkJCQlzd0RpZ2l0cyArPSBMJy4nOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlzd0RpZ2l0cyArPSBMJzAnOwoJCQkJCQlzd0RpZ2l0cyArPSBMJy4nOwoJCQkJCQliRGlnaXRFeGlzdCA9IFRSVUU7CgkJCQkJfQoKCQkJCQliRG90ID0gVFJVRTsKCQkJCQlicmVhazsKCQkJCX0KCQkJY2FzZSAnZSc6CgkJCWNhc2UgJ0UnOgoJCQkJaWYgKCFiS1hKUykKCQkJCXsKCQkJCQlwKys7CgkJCQkJYyA9ICpwOwoJCQkJCWlmIChjID09ICcrJyB8fCBjID09ICctJykKCQkJCQl7CgkJCQkJCWJLWEpTID0gVFJVRTsKCQkJCQkJc3dEaWdpdHMgKz0gJ2UnOwoJCQkJCQlzd0RpZ2l0cyArPSBjOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCX0KCQkJY2FzZSBMJy0nOgoJCQkJaWYgKCFiRGlnaXRFeGlzdCAmJiAhYlNpZ24pCgkJCQl7CgkJCQkJc3dEaWdpdHMgKz0gYzsKCQkJCQliU2lnbiA9IFRSVUU7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCWRlZmF1bHQ6CgkJCQliQWxsRGlnaXRzID0gRkFMU0U7CgoJCQkJaWYgKHAgIT0gcFN0YXJ0ICYmICFiRG90ICYmIGJEaWdpdEV4aXN0KQoJCQkJewoJCQkJCXN3RGlnaXRzICs9IEwnLic7CgkJCQkJYkRvdCA9IFRSVUU7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJYkRvdCA9IEZBTFNFOwoJCQkJCWJEaWdpdEV4aXN0ID0gRkFMU0U7CgkJCQkJc3dEaWdpdHMgPSBMIiI7CgkJCQl9CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJcCsrOwoJfQoKCWlmIChzd0RpZ2l0cy5HZXRMZW5ndGgoKSA+IDAgJiYgc3dEaWdpdHMuR2V0TGVuZ3RoKCkgPCAxNykKCXsKCQlDRlhfQnl0ZVN0cmluZyBzRGlnaXRzID0gc3dEaWdpdHMuVVRGOEVuY29kZSgpOwoKCQlpZiAoYktYSlMpCgkJewoJCQlkUmV0ID0gYXRvZihzRGlnaXRzKTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKGJEb3QpCgkJCXsKCQkJCWNoYXIqIHBTdG9wU3RyaW5nOwoJCQkJZFJldCA9IDo6c3RydG9kKHNEaWdpdHMsICZwU3RvcFN0cmluZyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkUmV0ID0gYXRvbChzRGlnaXRzKTsKCQkJfQoJCX0KCgl9CgoJcmV0dXJuIGRSZXQ7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdUb051bWJlcihGWF9MUENXU1RSIHN3U291cmNlKQp7CglGWF9CT09MIGJBbGxEaWdpdHMgPSBGQUxTRTsKCUZYX0JPT0wgYkRvdCA9IEZBTFNFOwoJRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwoJRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwoKCXJldHVybiBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsKfQoKRlhfQk9PTAlDSlNfUHVibGljTWV0aG9kczo6Q29udmVydFN0cmluZ1RvTnVtYmVyKEZYX0xQQ1dTVFIgc3dTb3VyY2UsIGRvdWJsZSAmIGRSZXQsIEZYX0JPT0wgJiBiRG90KQp7CglGWF9CT09MIGJBbGxEaWdpdHMgPSBGQUxTRTsKCUZYX0JPT0wgYlNpZ24gPSBGQUxTRTsKCUZYX0JPT0wgYktYSlMgPSBGQUxTRTsKCglkUmV0ID0gUGFyc2VOdW1iZXIoc3dTb3VyY2UsIGJBbGxEaWdpdHMsIGJEb3QsIGJTaWduLCBiS1hKUyk7CgoJcmV0dXJuIGJBbGxEaWdpdHM7Cn0KCkNKU19BcnJheSBDSlNfUHVibGljTWV0aG9kczo6QUZfTWFrZUFycmF5RnJvbUxpc3Qodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19WYWx1ZSB2YWwpCnsKCUNKU19BcnJheSBTdHJBcnJheShpc29sYXRlKTsKCWlmKHZhbC5Jc0FycmF5T2JqZWN0KCkpCgl7CgkJdmFsLkNvbnZlcnRUb0FycmF5KFN0ckFycmF5KTsKCQlyZXR1cm4gU3RyQXJyYXk7Cgl9CglDRlhfV2lkZVN0cmluZyB3c1N0ciA9IHZhbC5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpOwoJQ0ZYX0J5dGVTdHJpbmcgdCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cik7Cgljb25zdCBjaGFyICogcCA9IChjb25zdCBjaGFyICopdDsKCgoJaW50IGNoID0gJywnIDsKCWludCBuSW5kZXggPSAwOwoKCXdoaWxlICgqcCkKCXsKCQljb25zdCBjaGFyICogcFRlbXAgPSBzdHJjaHIocCwgY2gpOwoJCWlmIChwVGVtcCA9PSBOVUxMKQoJCXsKCQkJU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBTdHJUcmltKHApLmNfc3RyKCkpKTsKCQkJYnJlYWs7CgkJfQoJCWVsc2UKCQl7CgkJCWNoYXIgKiBwU3ViID0gbmV3IGNoYXJbcFRlbXAgLSBwICsgMV07CgkJCXN0cm5jcHkocFN1YiwgcCwgcFRlbXAgLSBwKTsKCQkJKihwU3ViICsgKHBUZW1wIC0gcCkpID0gJ1wwJzsKCgkJCVN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgU3RyVHJpbShwU3ViKS5jX3N0cigpKSk7CgkJCWRlbGV0ZSBbXXBTdWI7CgkJCQoJCQluSW5kZXggKys7CgkJCXAgPSArK3BUZW1wOwoJCX0KCQkKCX0KCXJldHVybiBTdHJBcnJheTsKfQoKaW50IENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZyxpbnQgblN0YXJ0LGludCYgblNraXAsIGludCBuTWF4U3RlcCkKewoJaW50IG5SZXQgPSAwOwoJblNraXAgPSAwOwoJZm9yIChpbnQgaT1uU3RhcnQsIHN6PXN0cmluZy5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspCgl7CgkJaWYgKGktblN0YXJ0ID4gMTApCgkJCWJyZWFrOwoKCQlGWF9XQ0hBUiBjID0gc3RyaW5nLkdldEF0KGkpOwoJCWlmIChJc0RpZ2l0KCh3Y2hhcl90KWMpKQoJCXsKCQkJblJldCA9IG5SZXQgKiAxMCArIChjIC0gJzAnKTsKCQkJblNraXAgPSBpIC0gblN0YXJ0ICsgMTsKCQkJaWYgKG5Ta2lwID49IG5NYXhTdGVwKSAKCQkJCWJyZWFrOwoJCX0KCQllbHNlCgkJCWJyZWFrOwoJfQoKCXJldHVybiBuUmV0Owp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywgaW50IG5TdGFydCwgaW50JiBuU2tpcCkKewoJQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7CgluU2tpcCA9IDA7Cglmb3IgKGludCBpPW5TdGFydCwgc3o9c3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykKCXsKCQlGWF9XQ0hBUiBjID0gc3RyaW5nLkdldEF0KGkpOwoJCWlmICgoYyA+PSBMJ2EnICYmIGMgPD0gTCd6JykgfHwgKGMgPj0gTCdBJyAmJiBjIDw9IEwnWicpKQoJCXsKCQkJc3dSZXQgKz0gYzsKCQkJblNraXAgPSBpIC0gblN0YXJ0ICsgMTsKCQl9CgkJZWxzZQoJCQlicmVhazsKCX0KCglyZXR1cm4gc3dSZXQ7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VOb3JtYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIEZYX0JPT0wmIGJXcm9uZ0Zvcm1hdCkKewoJZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKCglpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOwoJaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZHQpICsgMTsKCWludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOwoJaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKCWludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZHQpOwoJaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7CgoJaW50IG51bWJlclszXTsKCglpbnQgblNraXAgPSAwOwoJaW50IG5MZW4gPSB2YWx1ZS5HZXRMZW5ndGgoKTsKCWludCBuSW5kZXggPSAwOwoJaW50IGkgPSAwOwoJd2hpbGUgKGkgPCBuTGVuKQoJewoJCWlmIChuSW5kZXggPiAyKSBicmVhazsKCgkJRlhfV0NIQVIgYyA9IHZhbHVlLkdldEF0KGkpOwoJCWlmIChJc0RpZ2l0KCh3Y2hhcl90KWMpKQoJCXsKCQkJbnVtYmVyW25JbmRleCsrXSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaSwgblNraXAsIDQpOwoJCQlpICs9IG5Ta2lwOwkJCQoJCX0KCQllbHNlCgkJewoJCQlpICsrOwoJCX0KCX0KCglpZiAobkluZGV4ID09IDIpCgl7CgkJLy8gY2FzZTI6IG1vbnRoL2RheQoJCS8vIGNhc2UzOiBkYXkvbW9udGgKCQlpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkpCgkJewoJCQluTW9udGggPSBudW1iZXJbMF07CgkJCW5EYXkgPSBudW1iZXJbMV07CgkJfQoJCWVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMzEpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpKQoJCXsKCQkJbkRheSA9IG51bWJlclswXTsKCQkJbk1vbnRoID0gbnVtYmVyWzFdOwoJCX0KCgkJYldyb25nRm9ybWF0ID0gRkFMU0U7Cgl9CgllbHNlIGlmIChuSW5kZXggPT0gMykKCXsKCQkvLyBjYXNlMTogeWVhci9tb250aC9kYXkKCQkvLyBjYXNlMjogbW9udGgvZGF5L3llYXIKCQkvLyBjYXNlMzogZGF5L21vbnRoL3llYXIKCgkJaWYgKG51bWJlclswXSA+IDEyICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpICYmIChudW1iZXJbMl0gPj0gMSAmJiBudW1iZXJbMl0gPD0gMzEpKQoJCXsKCQkJblllYXIgPSBudW1iZXJbMF07CgkJCW5Nb250aCA9IG51bWJlclsxXTsKCQkJbkRheSA9IG51bWJlclsyXTsKCQl9CgkJZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkgJiYgbnVtYmVyWzJdID4gMzEpCgkJewoJCQluTW9udGggPSBudW1iZXJbMF07CgkJCW5EYXkgPSBudW1iZXJbMV07CgkJCW5ZZWFyID0gbnVtYmVyWzJdOwoJCX0KCQllbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDMxKSAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSAmJiBudW1iZXJbMl0gPiAzMSkKCQl7CgkJCW5EYXkgPSBudW1iZXJbMF07CgkJCW5Nb250aCA9IG51bWJlclsxXTsKCQkJblllYXIgPSBudW1iZXJbMl07CgkJfQoKCQliV3JvbmdGb3JtYXQgPSBGQUxTRTsKCX0KCWVsc2UKCXsKCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoJCXJldHVybiBkdDsKCX0KCglDRlhfV2lkZVN0cmluZyBzd1RlbXA7Cglzd1RlbXAuRm9ybWF0KEwiJWQvJWQvJWQgJWQ6JWQ6JWQiLG5Nb250aCxuRGF5LG5ZZWFyLG5Ib3VyLG5NaW4sblNlYyk7CglyZXR1cm4gSlNfRGF0ZVBhcnNlKHN3VGVtcCk7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0LCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpCnsKCWRvdWJsZSBkdCA9IEpTX0dldERhdGVUaW1lKCk7CgoJaWYgKGZvcm1hdC5Jc0VtcHR5KCkgfHwgdmFsdWUuSXNFbXB0eSgpKQoJCXJldHVybiBkdDsKCglpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOwoJaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZHQpICsgMTsKCWludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOwoJaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKCWludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZHQpOwoJaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7CgoJaW50IG5ZZWFyU3ViID0gOTk7IC8vblllYXIgLSAyMDAwOwoKCUZYX0JPT0wgYlBtID0gRkFMU0U7CglGWF9CT09MIGJFeGl0ID0gRkFMU0U7CgliV3JvbmdGb3JtYXQgPSBGQUxTRTsKCglpbnQgaT0wOwoJaW50IGo9MDsKCgl3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkKCXsKCQlpZiAoYkV4aXQpIGJyZWFrOwoKCQlGWF9XQ0hBUiBjID0gZm9ybWF0LkdldEF0KGkpOwoJCXN3aXRjaCAoYykKCQl7CgkJCWNhc2UgJzonOgoJCQljYXNlICcuJzoKCQkJY2FzZSAnLSc6CgkJCWNhc2UgJ1xcJzoKCQkJY2FzZSAnLyc6CgkJCQlpKys7CgkJCQlqKys7CgkJCQlicmVhazsKCgkJCWNhc2UgJ3knOgoJCQljYXNlICdtJzoKCQkJY2FzZSAnZCc6CgkJCWNhc2UgJ0gnOgoJCQljYXNlICdoJzoKCQkJY2FzZSAnTSc6CgkJCWNhc2UgJ3MnOgoJCQljYXNlICd0JzoKCQkJCXsKCQkJCQlpbnQgb2xkaiA9IGo7CgkJCQkJaW50IG5Ta2lwID0gMDsKCQkJCQlpbnQgcmVtYWluaW5nID0gZm9ybWF0LkdldExlbmd0aCgpIC0gaSAtIDE7CgoJCQkJCWlmIChyZW1haW5pbmcgPT0gMCB8fCBmb3JtYXQuR2V0QXQoaSsxKSAhPSBjKQoJCQkJCXsKCQkJCQkJc3dpdGNoIChjKQoJCQkJCQl7CgkJCQkJCQljYXNlICd5JzoKCQkJCQkJCQlpKys7CgkJCQkJCQkJaisrOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQkJbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSsrOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdkJzoKCQkJCQkJCQluRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSsrOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdIJzoKCQkJCQkJCQluSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnaCc6CgkJCQkJCQkJbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ00nOgoJCQkJCQkJCW5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3MnOgoJCQkJCQkJCW5TZWMgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3QnOgoJCQkJCQkJCWJQbSA9IChqIDwgdmFsdWUuR2V0TGVuZ3RoKCkgJiYgdmFsdWUuR2V0QXQoaikgPT0gJ3AnKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaisrOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAxIHx8IGZvcm1hdC5HZXRBdChpKzIpICE9IGMpCgkJCQkJewoJCQkJCQlzd2l0Y2ggKGMpCgkJCQkJCXsKCQkJCQkJCWNhc2UgJ3knOgoJCQkJCQkJCW5ZZWFyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdtJzoKCQkJCQkJCQluTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2QnOgoJCQkJCQkJCW5EYXkgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ0gnOgoJCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdoJzoKCQkJCQkJCQluSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnTSc6CgkJCQkJCQkJbk1pbiA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAncyc6CgkJCQkJCQkJblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAndCc6CgkJCQkJCQkJYlBtID0gKGogKyAxIDwgdmFsdWUuR2V0TGVuZ3RoKCkgJiYgdmFsdWUuR2V0QXQoaikgPT0gJ3AnICYmIHZhbHVlLkdldEF0KGorMSkgPT0gJ20nKTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSAyOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpKzMpICE9IGMpCgkJCQkJewoJCQkJCQlzd2l0Y2ggKGMpCgkJCQkJCXsKCQkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJCXsKCQkJCQkJCQkJQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKCQkJCQkJCQkJRlhfQk9PTCBiRmluZCA9IEZBTFNFOwoJCQkJCQkJCQlmb3IgKGludCBtID0gMDsgbSA8IDEyOyBtKyspCgkJCQkJCQkJCXsKCQkJCQkJCQkJCWlmIChzTW9udGguQ29tcGFyZU5vQ2FzZShtb250aHNbbV0pID09IDApCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJbk1vbnRoID0gbSArIDE7CgkJCQkJCQkJCQkJaSs9MzsKCQkJCQkJCQkJCQlqKz1uU2tpcDsKCQkJCQkJCQkJCQliRmluZCA9IFRSVUU7CgkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCgkJCQkJCQkJCWlmICghYkZpbmQpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDMpOwoJCQkJCQkJCQkJaSs9MzsKCQkJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICd5JzoKCQkJCQkJCQlicmVhazsKCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJaSs9MzsKCQkJCQkJCQlqKz0zOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAzIHx8IGZvcm1hdC5HZXRBdChpKzQpICE9IGMpCgkJCQkJewoJCQkJCQlzd2l0Y2ggKGMpCgkJCQkJCXsKCgoJCQkJCQkJY2FzZSAneSc6CgkJCQkJCQkJblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWkgKz0gNDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJCXsKCQkJCQkJCQkJRlhfQk9PTCBiRmluZCA9IEZBTFNFOwoKCQkJCQkJCQkJQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKCQkJCQkJCQkJc01vbnRoLk1ha2VMb3dlcigpOwoKCQkJCQkJCQkJZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyBzRnVsbE1vbnRocyA9IGZ1bGxtb250aHNbbV07CgkJCQkJCQkJCQlzRnVsbE1vbnRocy5NYWtlTG93ZXIoKTsKCgkJCQkJCQkJCQlpZiAoc0Z1bGxNb250aHMuRmluZChzTW9udGgsIDApICE9IC0xKQoJCQkJCQkJCQkJewoJCQkJCQkJCQkJCW5Nb250aCA9IG0gKyAxOwoJCQkJCQkJCQkJCWkgKz0gNDsKCQkJCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCQkJCWJGaW5kID0gVFJVRTsKCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoKCQkJCQkJCQkJaWYgKCFiRmluZCkKCQkJCQkJCQkJewoJCQkJCQkJCQkJbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CgkJCQkJCQkJCQlpKz00OwoJCQkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJaSArPSA0OwoJCQkJCQkJCWogKz0gNDsKCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlpZiAoaiA+PSB2YWx1ZS5HZXRMZW5ndGgoKSB8fCBmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpCgkJCQkJCXsKCQkJCQkJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgkJCQkJCQliRXhpdCA9IFRSVUU7CgkJCQkJCX0KCQkJCQkJaSsrOwoJCQkJCQlqKys7CgkJCQkJfQoKCQkJCQlpZiAob2xkaiA9PSBqKQoJCQkJCXsKCQkJCQkJYldyb25nRm9ybWF0ID0gVFJVRTsKCQkJCQkJYkV4aXQgPSBUUlVFOwoJCQkJCX0KCQkJCX0KCgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKQoJCQkJewoJCQkJCWJFeGl0ID0gVFJVRTsKCQkJCX0KCQkJCWVsc2UgaWYgKGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkKCQkJCXsKCQkJCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoJCQkJCWJFeGl0ID0gVFJVRTsKCQkJCX0KCgkJCQlpKys7CgkJCQlqKys7CgkJCQlicmVhazsKCQl9Cgl9CgoJaWYgKGJQbSkgbkhvdXIgKz0gMTI7CgoJaWYgKG5ZZWFyID49IDAgJiYgblllYXIgPD0gblllYXJTdWIpCgkJblllYXIgKz0gMjAwMDsKCglpZiAobk1vbnRoIDwgMSB8fCBuTW9udGggPiAxMikKCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoKCWlmIChuRGF5IDwgMSB8fCBuRGF5ID4gMzEpCgkJYldyb25nRm9ybWF0ID0gVFJVRTsKCglpZiAobkhvdXIgPCAwIHx8IG5Ib3VyID4gMjQpCgkJYldyb25nRm9ybWF0ID0gVFJVRTsKCglpZiAobk1pbiA8IDAgfHwgbk1pbiA+IDYwKQoJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgoJaWYgKG5TZWMgPCAwIHx8IG5TZWMgPiA2MCkKCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoKCWRvdWJsZSBkUmV0ID0gMDsKCglpZiAoYldyb25nRm9ybWF0KQoJewoJCWRSZXQgPSBQYXJzZU5vcm1hbERhdGUodmFsdWUsIGJXcm9uZ0Zvcm1hdCk7Cgl9CgllbHNlCgl7CgkJZFJldCA9IEpTX01ha2VEYXRlKEpTX01ha2VEYXkoblllYXIsbk1vbnRoIC0gMSxuRGF5KSxKU19NYWtlVGltZShuSG91ciwgbk1pbiwgblNlYywgMCkpOwoKCQlpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQoJCXsKCQkJZFJldCA9IEpTX0RhdGVQYXJzZSh2YWx1ZSk7CgkJfQoJfQoKCWlmIChKU19Qb3J0SXNOYW4oZFJldCkpCgl7CgkJZFJldCA9IFBhcnNlTm9ybWFsRGF0ZSh2YWx1ZSwgYldyb25nRm9ybWF0KTsKCX0KCglyZXR1cm4gZFJldDsKCn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZShkb3VibGUgZERhdGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0KQp7CglDRlhfV2lkZVN0cmluZyBzUmV0ID0gTCIiLHNQYXJ0ID0gTCIiOwoKCWludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkRGF0ZSk7CglpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkRGF0ZSkgKyAxOwoJaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkRGF0ZSk7CglpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZERhdGUpOwoJaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkRGF0ZSk7CglpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGREYXRlKTsKCglpbnQgaSA9IDA7Cgl3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkKCXsKCSAgICAgICAgRlhfV0NIQVIgYyA9IGZvcm1hdC5HZXRBdChpKTsKICAgICAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKCQlzUGFydCA9IEwiIjsKCQlzd2l0Y2ggKGMpCgkJewoJCQljYXNlICd5JzoKCQkJY2FzZSAnbSc6CgkJCWNhc2UgJ2QnOgoJCQljYXNlICdIJzoKCQkJY2FzZSAnaCc6CgkJCWNhc2UgJ00nOgoJCQljYXNlICdzJzoKCQkJY2FzZSAndCc6CgkJCQlpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkrMSkgIT0gYykKCQkJCXsKCQkJCQlzd2l0Y2ggKGMpCgkJCQkJewoJCQkJCQljYXNlICd5JzoKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbk1vbnRoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdkJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiVkIixuRGF5KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdIJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiVkIixuSG91cik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnaCc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbkhvdXI+MTI/bkhvdXIgLSAxMjpuSG91cik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnTSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbk1pbik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAncyc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsblNlYyk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAndCc6CgkJCQkJCQlzUGFydCArPSBuSG91cj4xMj8ncCc6J2EnOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWkrKzsKCQkJCX0KCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAxIHx8IGZvcm1hdC5HZXRBdChpKzIpICE9IGMpCgkJCQl7CgkJCQkJc3dpdGNoIChjKQoJCQkJCXsKCQkJCQkJY2FzZSAneSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuWWVhciAtIChuWWVhciAvIDEwMCkgKiAxMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbk1vbnRoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdkJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5EYXkpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ0gnOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbkhvdXIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2gnOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbkhvdXI+MTI/bkhvdXIgLSAxMjpuSG91cik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnTSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuTWluKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdzJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5TZWMpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3QnOgoJCQkJCQkJc1BhcnQgPSBuSG91cj4xMj8gTCJwbSI6IEwiYW0iOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWkrPTI7CgkJCQl9CgkJCQllbHNlIGlmIChyZW1haW5pbmcgPT0gMiB8fCBmb3JtYXQuR2V0QXQoaSszKSAhPSBjKQoJCQkJewoJCQkJCXN3aXRjaCAoYykKCQkJCQl7CgkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJaSs9MzsKCQkJCQkJCWlmIChuTW9udGggPiAwJiZuTW9udGggPD0gMTIpCgkJCQkJCQkJc1BhcnQgKz0gbW9udGhzW25Nb250aCAtIDFdOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWRlZmF1bHQ6CgkJCQkJCQlpKz0zOwoJCQkJCQkJc1BhcnQgKz0gYzsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkrNCkgIT0gYykKCQkJCXsKCQkJCQlzd2l0Y2ggKGMpCgkJCQkJewoJCQkJCQljYXNlICd5JzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwNGQiLG5ZZWFyKTsKCQkJCQkJCWkgKz0gNDsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdtJzoKCQkJCQkJCWkrPTQ7CgkJCQkJCQlpZiAobk1vbnRoID4gMCYmbk1vbnRoIDw9IDEyKQoJCQkJCQkJCXNQYXJ0ICs9IGZ1bGxtb250aHNbbk1vbnRoIC0gMV07CgkJCQkJCQlicmVhazsKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCWkgKz0gNDsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJc1BhcnQgKz0gYzsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaSsrOwoJCQkJCXNQYXJ0ICs9IGM7CgkJCQl9CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWkrKzsKCQkJCXNQYXJ0ICs9IGM7CgkJCQlicmVhazsKCQl9CgoJCXNSZXQgKz0gc1BhcnQ7Cgl9CgoJcmV0dXJuIHNSZXQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovL2Z1bmN0aW9uIEFGTnVtYmVyX0Zvcm1hdChuRGVjLCBzZXBTdHlsZSwgbmVnU3R5bGUsIGN1cnJTdHlsZSwgc3RyQ3VycmVuY3ksIGJDdXJyZW5jeVByZXBlbmQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBKU19FcnJvclN0cmluZyYgc0Vycm9yKQp7CiNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDYpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CQoJQ0ZYX0J5dGVTdHJpbmcgc3RyVmFsdWUgPSBTdHJUcmltKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOwoJCglpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gVFJVRTsKCQoJaW50IGlEZWMgPSBwYXJhbXNbMF07CglpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdOwoJaW50IGlOZWdTdHlsZSA9IHBhcmFtc1syXTsKCS8vIHBhcmFtc1szXSBpcyBpQ3VyclN0eWxlLCBpdCdzIG5vdCB1c2VkLgoJc3RkOjp3c3RyaW5nIHdzdHJDdXJyZW5jeShwYXJhbXNbNF0ub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKSk7CglGWF9CT09MIGJDdXJyZW5jeVByZXBlbmQgPSBwYXJhbXNbNV07CgkKCWlmIChpRGVjIDwgMCkgaURlYyA9IC1pRGVjOwoJCglpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQoJCWlTZXBTdHlsZSA9IDA7CgkKCWlmIChpTmVnU3R5bGUgPCAwIHx8IGlOZWdTdHlsZSA+IDMpCgkJaU5lZ1N0eWxlID0gMDsKCQoJCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKCXN0clZhbHVlLlJlcGxhY2UoIiwiLCAiLiIpOwoJZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOwoJaWYgKGlEZWMgPiAwKQoJCWRWYWx1ZSArPSBET1VCTEVfQ09SUkVDVDsvLwoJCSAgICAKCWludCBpRGVjMjsKCUZYX0JPT0wgYk5hZ2F0aXZlID0gRkFMU0U7CgoJc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5hZ2F0aXZlKTsKCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgl7CgkJZFZhbHVlID0gMDsKCQlzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLGlEZWMsJmlEZWMyLCZiTmFnYXRpdmUpOwoJCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgkJewoJCQlzdHJWYWx1ZSA9ICIwIjsKCQkJaURlYzIgPSAxOwoJCX0KCgl9CgoJaWYgKGlEZWMyIDwgMCkKCXsKCQlmb3IgKGludCBpTnVtID0gMDtpTnVtIDwgYWJzKGlEZWMyKTtpTnVtKyspCgkJewoJCQlzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOwoJCX0KCQlpRGVjMiA9IDA7CgkJCgl9CglpbnQgaU1heCA9IHN0clZhbHVlLkdldExlbmd0aCgpOwoJaWYgKGlEZWMyID4gaU1heCkKCXsKCQlmb3IgKGludCBpTnVtID0gMDtpTnVtIDw9IGlEZWMyIC0gaU1heCA7aU51bSsrKQoJCXsKCQkJc3RyVmFsdWUgKz0gIjAiOwoJCX0KCQlpTWF4ID0gaURlYzIrMTsJCQkKCX0KCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCglpZiAoaURlYzIgPCBpTWF4KQoJewoJCWlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMSkKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsKCQkJaU1heCsrOwoJCX0KCQllbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJywnKTsKCQkJaU1heCsrOwoJCX0KCQkKCQlpZiAoaURlYzIgPT0gMCkKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwoJfQoJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKQoJewoJCWNoYXIgY1NlcGVyYXRvcjsKCQlpZiAoaVNlcFN0eWxlID09IDApCgkJCWNTZXBlcmF0b3IgPSAnLCc7CgkJZWxzZQoJCQljU2VwZXJhdG9yID0gJy4nOwoJCQoJCWludCBpRGVjUG9zaXRpdmUsaURlY05hZ2F0aXZlOwoJCWlEZWNQb3NpdGl2ZSA9IGlEZWMyOwoJCWlEZWNOYWdhdGl2ZSA9IGlEZWMyOwkJCgkJCgkJZm9yIChpRGVjUG9zaXRpdmUgPSBpRGVjMiAtMzsgaURlY1Bvc2l0aXZlID4gMDtpRGVjUG9zaXRpdmUgLT0gMykKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBlcmF0b3IpOwoJCQlpTWF4Kys7CgkJfQoJfQoJCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvL2ZvciBwcm9jZXNzaW5nIGN1cnJlbmN5IHN0cmluZwoKCVZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJWYWx1ZSk7CgkKCXN0ZDo6d3N0cmluZyBzdHJWYWx1ZTIoVmFsdWUpOwoKCWlmIChiQ3VycmVuY3lQcmVwZW5kKQoJCXN0clZhbHVlMiA9IHdzdHJDdXJyZW5jeSArIHN0clZhbHVlMjsKCWVsc2UKCQlzdHJWYWx1ZTIgPSBzdHJWYWx1ZTIgKyB3c3RyQ3VycmVuY3k7CgkKCQoJCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkvL2ZvciBwcm9jZXNzaW5nIG5lZ2F0aXZlIHN0eWxlCglpZiAoYk5hZ2F0aXZlKQoJewoJCWlmIChpTmVnU3R5bGUgPT0gMCkKCQl7CgkJCXN0clZhbHVlMi5pbnNlcnQoMCxMIi0iKTsKCQl9CgkJaWYgKGlOZWdTdHlsZSA9PSAyIHx8IGlOZWdTdHlsZSA9PSAzKQoJCXsKCQkJc3RyVmFsdWUyLmluc2VydCgwLEwiKCIpOwoJCQlzdHJWYWx1ZTIuaW5zZXJ0KHN0clZhbHVlMi5sZW5ndGgoKSxMIikiKTsKCQl9CgkJaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKQoJCXsKCQkJaWYgKEZpZWxkICogZlRhcmdldCA9IHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCkpCgkJCXsKCQkJCUNKU19BcnJheSBhckNvbG9yKGlzb2xhdGUpOwoJCQkJQ0pTX1ZhbHVlIHZDb2xFbG0oaXNvbGF0ZSk7CgkJCQl2Q29sRWxtID0gTCJSR0IiOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDAsdkNvbEVsbSk7CgkJCQl2Q29sRWxtID0gMTsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgxLHZDb2xFbG0pOwoJCQkJdkNvbEVsbSA9IDA7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMix2Q29sRWxtKTsKCQkJCQoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDMsdkNvbEVsbSk7CgkJCQkKCQkJCUNKU19Qcm9wVmFsdWUgdlByb3AoaXNvbGF0ZSk7CgkJCQl2UHJvcC5TdGFydEdldHRpbmcoKTsKCQkJCXZQcm9wPDxhckNvbG9yOwoJCQkJdlByb3AuU3RhcnRTZXR0aW5nKCk7CgkJCQlmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsdlByb3Asc0Vycm9yKTsvLyByZWQKCQkJfQoJCX0KCX0KCWVsc2UKCXsKCQlpZiAoaU5lZ1N0eWxlID09IDEgfHwgaU5lZ1N0eWxlID09IDMpCgkJewoJCQlpZiAoRmllbGQgKmZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKQoJCQl7CgkJCQlDSlNfQXJyYXkgYXJDb2xvcihpc29sYXRlKTsKCQkJCUNKU19WYWx1ZSB2Q29sRWxtKGlzb2xhdGUpOwoJCQkJdkNvbEVsbSA9IEwiUkdCIjsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgwLHZDb2xFbG0pOwoJCQkJdkNvbEVsbSA9IDA7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMSx2Q29sRWxtKTsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgyLHZDb2xFbG0pOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDMsdkNvbEVsbSk7CgkJCQkKCQkJCUNKU19Qcm9wVmFsdWUgdlByb3AoaXNvbGF0ZSk7CgkJCQl2UHJvcC5TdGFydEdldHRpbmcoKTsKCQkJCWZUYXJnZXQtPnRleHRDb2xvcihjYyx2UHJvcCxzRXJyb3IpOwoJCQkJCgkJCQlDSlNfQXJyYXkgYVByb3AoaXNvbGF0ZSk7CgkJCQl2UHJvcC5Db252ZXJ0VG9BcnJheShhUHJvcCk7CgoJCQkJQ1BXTF9Db2xvciBjclByb3A7CgkJCQlDUFdMX0NvbG9yIGNyQ29sb3I7CgkJCQljb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihhUHJvcCwgY3JQcm9wKTsKCQkJCWNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFyQ29sb3IsIGNyQ29sb3IpOwoKCQkJCWlmIChjckNvbG9yICE9IGNyUHJvcCkKCQkJCXsKCQkJCQlDSlNfUHJvcFZhbHVlIHZQcm9wMihpc29sYXRlKTsKCQkJCQl2UHJvcDIuU3RhcnRHZXR0aW5nKCk7CgkJCQkJdlByb3AyPDxhckNvbG9yOwoJCQkJCXZQcm9wMi5TdGFydFNldHRpbmcoKTsKICAgICAJCQkJZlRhcmdldC0+dGV4dENvbG9yKGNjLHZQcm9wMixzRXJyb3IpOwoJCQkJfQoJCQl9CgkJfQoJfQoJVmFsdWUgPSBzdHJWYWx1ZTIuY19zdHIoKTsKI2VuZGlmCglyZXR1cm4gVFJVRTsKfQoKLy9mdW5jdGlvbiBBRk51bWJlcl9LZXlzdHJva2UobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LCBiQ3VycmVuY3lQcmVwZW5kKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgSlNfRXJyb3JTdHJpbmcmIHNFcnJvcikKewoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoJCglpZihwYXJhbXMuc2l6ZSgpIDwgMikKCQlyZXR1cm4gRkFMU0U7CglpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdOwoJCglpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQoJCWlTZXBTdHlsZSA9IDA7CglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglDRlhfV2lkZVN0cmluZyAmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsJCglDRlhfV2lkZVN0cmluZyAmIHdfc3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICAgIENGWF9XaWRlU3RyaW5nIHdfc3RyVmFsdWUgPSB2YWw7CgoJaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQoJewoJCUNGWF9XaWRlU3RyaW5nIHdzdHJDaGFuZ2UgPSB3X3N0ckNoYW5nZTsKCQlDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSBTdHJMVHJpbSh3X3N0clZhbHVlKTsKCQlpZiAod3N0clZhbHVlLklzRW1wdHkoKSkKCQkJcmV0dXJuIFRSVUU7CgkJCgkJQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wID0gd3N0clZhbHVlOwoJCXN3VGVtcC5SZXBsYWNlKEwiLCIsIEwiLiIpOwoJCWlmICghSXNOdW1iZXIoc3dUZW1wKSkgLy8hKElzTnVtYmVyKHdzdHJDaGFuZ2UpICYmIAoJCXsKCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsKCQkJQWxlcnQocENvbnRleHQsIHNFcnJvcik7CgkJCXJldHVybiBUUlVFOwoJCX0KCQlyZXR1cm4gVFJVRTsgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAoJfQoJCglzdGQ6OndzdHJpbmcgd19zdHJWYWx1ZTIgKHdfc3RyVmFsdWUpOwoJc3RkOjp3c3RyaW5nIHdfc3RyQ2hhbmdlMih3X3N0ckNoYW5nZSk7CgkKCXN0ZDo6d3N0cmluZyB3X3N0clNlbGVjdGVkOwoJaWYoLTEgIT0gcEV2ZW50LT5TZWxTdGFydCgpKQoJCXdfc3RyU2VsZWN0ZWQgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxTdGFydCgpLChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKSk7CglGWF9CT09MIGJIYXNTaWduID0gKHdfc3RyVmFsdWUyLmZpbmQoJy0nKSAhPSAtMSkgJiYgKHdfc3RyU2VsZWN0ZWQuZmluZCgnLScpID09IC0xKTsKCWlmIChiSGFzU2lnbikKCXsKCQkvL2Nhbid0IGluc2VydCAiY2hhbmdlIiBpbiBmcm9udCB0byBzaWduIHBvc3Rpb24uCgkJaWYgKHBFdmVudC0+U2VsU3RhcnQoKSA9PSAwKQoJCXsKICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQliUmMgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJfQoKCWNoYXIgY1NlcCA9IEwnLic7CgoJc3dpdGNoIChpU2VwU3R5bGUpCgl7CgljYXNlIDA6CgljYXNlIDE6CgkJY1NlcCA9IEwnLic7CgkJYnJlYWs7CgljYXNlIDI6CgljYXNlIDM6CgkJY1NlcCA9IEwnLCc7CgkJYnJlYWs7Cgl9CgkKCUZYX0JPT0wgYkhhc1NlcCA9ICh3X3N0clZhbHVlMi5maW5kKGNTZXApICE9IC0xKTsKCWZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdfc3RyQ2hhbmdlMi5iZWdpbigpOyBpdCAhPSB3X3N0ckNoYW5nZTIuZW5kKCk7IGl0KyspCgl7CgkJaWYgKCppdCA9PSBjU2VwKQoJCXsKCQkJaWYgKGJIYXNTZXApCgkJCXsKCQkJCUZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKCQkJCWJSYyA9IEZBTFNFOwoJCQkJcmV0dXJuIFRSVUU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQliSGFzU2VwID0gVFJVRTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoJCWlmICgqaXQgPT0gTCctJykKCQl7CgkJCWlmIChiSGFzU2lnbikKCQkJewoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQkJYlJjID0gRkFMU0U7CgkJCQlyZXR1cm4gVFJVRTsKCQkJfQoJCQllbHNlIGlmIChpdCAhPSB3X3N0ckNoYW5nZTIuYmVnaW4oKSkgLy9zaWduJ3MgcG9zaXRpb24gaXMgbm90IGNvcnJlY3QKCQkJewoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQkJYlJjID0gRkFMU0U7CgkJCQlyZXR1cm4gVFJVRTsKCQkJfQoJCQllbHNlIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgIT0gMCkKCQkJewoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQkJYlJjID0gRkFMU0U7CgkJCQlyZXR1cm4gVFJVRTsKCQkJfQoJCQliSGFzU2lnbiA9IFRSVUU7CgkJCWNvbnRpbnVlOwoJCX0KCQkKCQlpZiAoIUlzRGlnaXQoKml0KSkKCQl7CQkJCgkJCUZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKCQkJYlJjID0gRkFMU0U7CgkJCXJldHVybiBUUlVFOwoJCX0KCX0KCQoJCglzdGQ6OndzdHJpbmcgd19wcmVmaXggPSB3X3N0clZhbHVlMi5zdWJzdHIoMCxwRXZlbnQtPlNlbFN0YXJ0KCkpOwoJc3RkOjp3c3RyaW5nIHdfcG9zdGZpeDsKCWlmIChwRXZlbnQtPlNlbEVuZCgpPChpbnQpd19zdHJWYWx1ZTIubGVuZ3RoKCkpCgkJd19wb3N0Zml4ICA9IHdfc3RyVmFsdWUyLnN1YnN0cihwRXZlbnQtPlNlbEVuZCgpKTsKCXdfc3RyVmFsdWUyID0gd19wcmVmaXggKyB3X3N0ckNoYW5nZTIgKyB3X3Bvc3RmaXg7Cgl3X3N0clZhbHVlID0gd19zdHJWYWx1ZTIuY19zdHIoKTsKCXZhbCA9IHdfc3RyVmFsdWU7CglyZXR1cm4gVFJVRTsJCQoJCn0KCi8vZnVuY3Rpb24gQUZQZXJjZW50X0Zvcm1hdChuRGVjLCBzZXBTdHlsZSkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBKU19FcnJvclN0cmluZyYgc0Vycm9yKQp7CiNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CgkKLy8gICAgIEhXTkQgaE1haW5GcmFtZSA9IE5VTEw7Ci8vIAkKLy8gCUNQREZTREtfRm9ybUZpbGxBcHAgKnBBcHAgPSBwQ29udGV4dC0+R2V0UmVhZGVyQXBwKCk7Ci8vIAlBU1NFUlQocEFwcCk7Ci8vIAloTWFpbkZyYW1lID0gcEFwcC0+R2V0TWFpbkZyYW1lV25kKCk7CgkJCglDRlhfQnl0ZVN0cmluZyBzdHJWYWx1ZSA9IFN0clRyaW0oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKSk7CgkKCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgkJcmV0dXJuIFRSVUU7CgkKCWludCBpRGVjID0gcGFyYW1zWzBdOwoJaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXTsKCQoJLy9BU1NFUlQoaURlYyA+IDApOwoJaWYgKGlEZWMgPCAwKQoJCWlEZWMgPSAtaURlYzsKCQoJaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKCQlpU2VwU3R5bGUgPSAwOwoJCgkKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJLy9mb3IgcHJvY2Vzc2luZyBkZWNpbWFsIHBsYWNlcwoJZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOwoJZFZhbHVlICo9IDEwMDsKCWlmIChpRGVjID4gMCkKCQlkVmFsdWUgKz0gRE9VQkxFX0NPUlJFQ1Q7Ly/Qo9X9CgoJaW50IGlEZWMyOwoJRlhfQk9PTCBiTmFnYXRpdmUgPSBGQUxTRTsKCXN0clZhbHVlID0gZmN2dChkVmFsdWUsaURlYywmaURlYzIsJmJOYWdhdGl2ZSk7CiAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQoJewoJCWRWYWx1ZSA9IDA7CgkJc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5hZ2F0aXZlKTsKCX0KCglpZiAoaURlYzIgPCAwKQoJewoJCWZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDwgYWJzKGlEZWMyKTsgaU51bSsrKQoJCXsKCQkJc3RyVmFsdWUgPSAiMCIgKyBzdHJWYWx1ZTsKCQl9CgkJaURlYzIgPSAwOwoJCQoJfQoJaW50IGlNYXggPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKCWlmIChpRGVjMiA+IGlNYXgpCgl7CgkJZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPD0gaURlYzIgLSBpTWF4OyBpTnVtKyspCgkJewoJCQlzdHJWYWx1ZSArPSAiMCI7CgkJfQoJCWlNYXggPSBpRGVjMisxOwkJCQoJfQoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy9mb3IgcHJvY2Vzc2luZyBzZXBlcmF0b3Igc3R5bGUKCWlmIChpRGVjMiA8IGlNYXgpCgl7CgkJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKQoJCXsKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLicpOwoJCQlpTWF4Kys7CgkJfQoJCWVsc2UgaWYgKGlTZXBTdHlsZSA9PSAyIHx8IGlTZXBTdHlsZSA9PSAzKQoJCXsKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLCcpOwoJCQlpTWF4Kys7CgkJfQoJCQoJCWlmIChpRGVjMiA9PSAwKQoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7Cgl9CglpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDIpCgl7CgkJY2hhciBjU2VwZXJhdG9yOwoJCWlmIChpU2VwU3R5bGUgPT0gMCkKCQkJY1NlcGVyYXRvciA9ICcsJzsKCQllbHNlCgkJCWNTZXBlcmF0b3IgPSAnLic7CgkJCgkJaW50IGlEZWNQb3NpdGl2ZSxpRGVjTmFnYXRpdmU7CgkJaURlY1Bvc2l0aXZlID0gaURlYzI7CgkJaURlY05hZ2F0aXZlID0gaURlYzI7CgkJCQoJCWZvciAoaURlY1Bvc2l0aXZlID0gaURlYzIgLTM7IGlEZWNQb3NpdGl2ZSA+IDA7IGlEZWNQb3NpdGl2ZSAtPSAzKQoJCXsKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWNQb3NpdGl2ZSxjU2VwZXJhdG9yKTsKCQkJaU1heCsrOwoJCX0KCX0KCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkvL25hZ2F0aXZlIG1hcmsKCWlmKGJOYWdhdGl2ZSkKCQlzdHJWYWx1ZSA9ICItIiArIHN0clZhbHVlOwoJc3RyVmFsdWUgKz0gIiUiOwoJVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsKI2VuZGlmCglyZXR1cm4gVFJVRTsKfQovL0FGUGVyY2VudF9LZXlzdHJva2UobkRlYywgc2VwU3R5bGUpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgSlNfRXJyb3JTdHJpbmcmIHNFcnJvcikKewoJcmV0dXJuIEFGTnVtYmVyX0tleXN0cm9rZShjYyxwYXJhbXMsdlJldCxzRXJyb3IpOwp9CgovL2Z1bmN0aW9uIEFGRGF0ZV9Gb3JtYXRFeChjRm9ybWF0KQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfRm9ybWF0RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgSlNfRXJyb3JTdHJpbmcmIHNFcnJvcikKewoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CQoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKCQoJQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUgPSB2YWw7CQoJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkgcmV0dXJuIFRSVUU7CQkKCglDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCk7CgoJRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKCWRvdWJsZSBkRGF0ZSA9IDAuMGY7CgoJaWYoc3RyVmFsdWUuRmluZChMIkdNVCIpICE9IC0xKQoJewoJCS8vZm9yIEdNVCBmb3JtYXQgdGltZQoJCS8vc3VjaCBhcyAiVHVlIEF1ZyAxMSAxNDoyNDoxNiBHTVQrMDgwMDIwMDkiCgkJZERhdGUgPSBNYWtlSW50ZXJEYXRlKHN0clZhbHVlKTsKCX0KCWVsc2UKCXsKCQlkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzdHJWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7Cgl9CgoJaWYgKEpTX1BvcnRJc05hbihkRGF0ZSkpCgl7CgkJQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CgkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKSwgc0Zvcm1hdC5jX3N0cigpKTsKCQlBbGVydChwQ29udGV4dCwgc3dNc2cpOwoJCXJldHVybiBGQUxTRTsKCX0KCQoJdmFsID0gIE1ha2VGb3JtYXREYXRlKGREYXRlLHNGb3JtYXQpOwoKCXJldHVybiBUUlVFOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VJbnRlckRhdGUoQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUpCnsKCWludCBuSG91cjsKCWludCBuTWluOwoJaW50IG5TZWM7CglpbnQgblllYXI7CglpbnQgbk1vbnRoOwoJaW50IG5EYXk7CgoJQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c0FycmF5OwoJQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gTCIiOwoJQ0ZYX1dpZGVTdHJpbmcgc1RlbXAgPSBMIiI7CglpbnQgblNpemUgPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKCglmb3IoaW50IGkgPSAwOyBpIDwgblNpemU7IGkrKykKCXsKCQlGWF9XQ0hBUiBjID0gc3RyVmFsdWUuR2V0QXQoaSk7CgkJaWYoYyA9PSBMJyAnIHx8IGMgPT0gTCc6JykKCQl7CQoJCQl3c0FycmF5LkFkZChzVGVtcCk7CgkJCXNUZW1wID0gTCIiOwoJCQljb250aW51ZTsKCQl9CgoJCXNUZW1wICs9IGM7Cgl9CgkKCXdzQXJyYXkuQWRkKHNUZW1wKTsKCWlmKHdzQXJyYXkuR2V0U2l6ZSgpICE9IDgpcmV0dXJuIDA7CgoJc1RlbXAgPSB3c0FycmF5WzFdOwoJaWYoc1RlbXAuQ29tcGFyZShMIkphbiIpID09IDApIG5Nb250aCA9IDE7CglpZihzVGVtcC5Db21wYXJlKEwiRmViIikgPT0gMCkgbk1vbnRoID0gMjsKCWlmKHNUZW1wLkNvbXBhcmUoTCJNYXIiKSA9PSAwKSBuTW9udGggPSAzOwoJaWYoc1RlbXAuQ29tcGFyZShMIkFwciIpID09IDApIG5Nb250aCA9IDQ7CglpZihzVGVtcC5Db21wYXJlKEwiTWF5IikgPT0gMCkgbk1vbnRoID0gNTsKCWlmKHNUZW1wLkNvbXBhcmUoTCJKdW4iKSA9PSAwKSBuTW9udGggPSA2OwoJaWYoc1RlbXAuQ29tcGFyZShMIkp1bCIpID09IDApIG5Nb250aCA9IDc7CglpZihzVGVtcC5Db21wYXJlKEwiQXVnIikgPT0gMCkgbk1vbnRoID0gODsKCWlmKHNUZW1wLkNvbXBhcmUoTCJTZXAiKSA9PSAwKSBuTW9udGggPSA5OwoJaWYoc1RlbXAuQ29tcGFyZShMIk9jdCIpID09IDApIG5Nb250aCA9IDEwOwoJaWYoc1RlbXAuQ29tcGFyZShMIk5vdiIpID09IDApIG5Nb250aCA9IDExOwoJaWYoc1RlbXAuQ29tcGFyZShMIkRlYyIpID09IDApIG5Nb250aCA9IDEyOwoKCW5EYXkgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVsyXSk7CgluSG91ciA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzNdKTsKCW5NaW4gPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs0XSk7CgluU2VjID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbNV0pOwoJblllYXIgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs3XSk7CgoJZG91YmxlIGRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLG5Nb250aCAtIDEsbkRheSksSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCglpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQoJewoJCWRSZXQgPSBKU19EYXRlUGFyc2Uoc3RyVmFsdWUpOwoJfQoJCglyZXR1cm4gZFJldDsKfQoKLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIEpTX0Vycm9yU3RyaW5nJiBzRXJyb3IpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCXNFcnJvciA9IEwiQUZEYXRlX0tleXN0cm9rZUV4J3MgcGFyYW1ldGVycycgc2l6ZSByIG5vdCBjb3JyZWN0IjsKCQlyZXR1cm4gRkFMU0U7Cgl9CQoJCglpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpCgl7CgkJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJCXJldHVybiBGQUxTRTsKCQlDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKCQlpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gVFJVRTsKCgkJQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpOwoKCQlGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwoJCWRvdWJsZSBkUmV0ID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLHNGb3JtYXQsYldyb25nRm9ybWF0KTsKCQlpZiAoYldyb25nRm9ybWF0IHx8IEpTX1BvcnRJc05hbihkUmV0KSkKCQl7CgkJCUNGWF9XaWRlU3RyaW5nIHN3TXNnOwoJCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLCBzRm9ybWF0LmNfc3RyKCkpOwoJCQlBbGVydChwQ29udGV4dCwgc3dNc2cpOwoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJfQoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgSlNfRXJyb3JTdHJpbmcmIHNFcnJvcikKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWludCBpSW5kZXggPSBwYXJhbXNbMF07CglGWF9MUENXU1RSIGNGb3JtYXRzW10gPSAge0wibS9kIiwgTCJtL2QveXkiLCBMIm1tL2RkL3l5IiwgTCJtbS95eSIsIEwiZC1tbW0iLCBMImQtbW1tLXl5IiwgTCJkZC1tbW0teXkiLAoJCUwieXktbW0tZGQiLCBMIm1tbS15eSIsIEwibW1tbS15eSIsIEwibW1tIGQsIHl5eXkiLCBMIm1tbW0gZCwgeXl5eSIsCgkJTCJtL2QveXkgaDpNTSB0dCIsIEwibS9kL3l5IEhIOk1NIiB9OwoKCUFTU0VSVChpSW5kZXggPCBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKCglpZiAoaUluZGV4IDwgMCkKCQlpSW5kZXggPSAwOwoJaWYgKGlJbmRleCA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKQoJCWlJbmRleCA9IDA7CglDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CglDSlNfVmFsdWUgdmFsKGlzb2xhdGUsY0Zvcm1hdHNbaUluZGV4XSk7CgluZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CglyZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgSlNfRXJyb3JTdHJpbmcmIHNFcnJvcikKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWludCBpSW5kZXggPSBwYXJhbXNbMF07CglGWF9MUENXU1RSIGNGb3JtYXRzW10gPSAge0wibS9kIiwgTCJtL2QveXkiLCBMIm1tL2RkL3l5IiwgTCJtbS95eSIsIEwiZC1tbW0iLCBMImQtbW1tLXl5IiwgTCJkZC1tbW0teXkiLAoJCUwieXktbW0tZGQiLCBMIm1tbS15eSIsIEwibW1tbS15eSIsIEwibW1tIGQsIHl5eXkiLCBMIm1tbW0gZCwgeXl5eSIsCgkJTCJtL2QveXkgaDpNTSB0dCIsIEwibS9kL3l5IEhIOk1NIiB9OwoKCUFTU0VSVChpSW5kZXg8RlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7CgoJaWYgKGlJbmRleCA8IDApCgkJaUluZGV4ID0gMDsKCWlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKCQlpSW5kZXggPSAwOwoJQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwoJQ0pTX1ZhbHVlIHZhbChpc29sYXRlLGNGb3JtYXRzW2lJbmRleF0pOwoJbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwoJcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwp9CgovL2Z1bmN0aW9uIEFGVGltZV9Gb3JtYXQocHRmKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIEpTX0Vycm9yU3RyaW5nJiBzRXJyb3IpCnsKCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CgkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWludCBpSW5kZXggPSBwYXJhbXNbMF07CglGWF9MUENXU1RSIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLCBMImg6TU06c3MgdHQifTsKCglBU1NFUlQoaUluZGV4PEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOwoKCWlmIChpSW5kZXggPCAwKQoJCWlJbmRleCA9IDA7CglpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCgkJaUluZGV4ID0gMDsKCUNKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKCUNKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKCW5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKCXJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBKU19FcnJvclN0cmluZyYgc0Vycm9yKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CgkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWludCBpSW5kZXggPSBwYXJhbXNbMF07CglGWF9MUENXU1RSIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLCBMImg6TU06c3MgdHQifTsKCglBU1NFUlQoaUluZGV4PEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOwoKCWlmIChpSW5kZXggPCAwKQoJCWlJbmRleCA9IDA7CglpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCgkJaUluZGV4ID0gMDsKCUNKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKCUNKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKCW5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKCXJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIEpTX0Vycm9yU3RyaW5nJiBzRXJyb3IpCnsKCXJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIEpTX0Vycm9yU3RyaW5nJiBzRXJyb3IpCnsKCXJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKLy9mdW5jdGlvbiBBRlNwZWNpYWxfRm9ybWF0KHBzZikKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBKU19FcnJvclN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCXN0ZDo6c3RyaW5nIGNGb3JtYXQ7CglpbnQgaUluZGV4ID0gcGFyYW1zWzBdOwoKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwkKCXN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkuY19zdHIoKTsKCQoJc3dpdGNoIChpSW5kZXgpIAoJewoJY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAKCQljRm9ybWF0ID0gIjk5OTk5IjsKCQlicmVhazsKCWNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgCgkJY0Zvcm1hdCA9ICI5OTk5OS05OTk5IjsKCQlicmVhazsKCWNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgCgkJewoJCQlzdGQ6OnN0cmluZyBOdW1iZXJTdHI7CgkJCXV0aWw6OnByaW50eCgiOTk5OTk5OTk5OSIsIHN0clNyYyxOdW1iZXJTdHIpOyAKCQkJaWYgKE51bWJlclN0ci5sZW5ndGgoKSA+PSAxMCApCgkJCQljRm9ybWF0ID0gIig5OTkpIDk5OS05OTk5IjsKCQkJZWxzZSAKCQkJCWNGb3JtYXQgPSAiOTk5LTk5OTkiOwoJCQlicmVhazsKCQl9CgljYXNlIDM6CgkJY0Zvcm1hdCA9ICI5OTktOTktOTk5OSI7CgkJYnJlYWs7Cgl9CgkKCXN0ZDo6c3RyaW5nIHN0ckRlczsKCXV0aWw6OnByaW50eChjRm9ybWF0LHN0clNyYyxzdHJEZXMpOwoJVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0ckRlcy5jX3N0cigpKTsKCXJldHVybiBUUlVFOwp9CgoKLy9mdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgobWFzaykKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIEpTX0Vycm9yU3RyaW5nJiBzRXJyb3IpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgPCAxKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCUNGWF9XaWRlU3RyaW5nJiB2YWxFdmVudCA9IHBFdmVudC0+VmFsdWUoKTsKCglDRlhfV2lkZVN0cmluZyB3c3RyTWFzayA9IHBhcmFtc1swXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpOwoJaWYgKHdzdHJNYXNrLklzRW1wdHkoKSkgcmV0dXJuIFRSVUU7CgkKCXN0ZDo6d3N0cmluZyB3c3RyVmFsdWUodmFsRXZlbnQpOwoJCglpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpCgl7CgkJaWYgKHdzdHJWYWx1ZS5lbXB0eSgpKQoJCQlyZXR1cm4gVFJVRTsKCQlpbnQgaUluZGV4TWFzayA9IDA7CgkJZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd3N0clZhbHVlLmJlZ2luKCk7IGl0ICE9IHdzdHJWYWx1ZS5lbmQoKTsgaXQrKykKCQl7CgkJCXdjaGFyX3Qgd19WYWx1ZSA9ICppdDsKICAgICAgICAgICAgaWYgKCFtYXNrU2F0aXNmaWVkKHdfVmFsdWUsd3N0ck1hc2tbaUluZGV4TWFza10pKQoJCQkJYnJlYWs7CgkJCWlJbmRleE1hc2srKzsKCQl9CgoJCWlmIChpSW5kZXhNYXNrICE9IHdzdHJNYXNrLkdldExlbmd0aCgpIHx8IChpSW5kZXhNYXNrICE9IHdzdHJWYWx1ZS5zaXplKCkgJiYgd3N0ck1hc2suR2V0TGVuZ3RoKCkgIT0gMCkpCgkJewoJCQlBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpKTsKCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJfQoJCXJldHVybiBUUlVFOwoJfQoKCQoJQ0ZYX1dpZGVTdHJpbmcgJndpZGVDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOwoJc3RkOjp3c3RyaW5nIHdDaGFuZ2Uod2lkZUNoYW5nZSk7CgkKCWlmICh3Q2hhbmdlLmVtcHR5KCkpCgkJcmV0dXJuIFRSVUU7CiAgICBpbnQgaUluZGV4TWFzayA9IHBFdmVudC0+U2VsU3RhcnQoKTsKCS8vaUluZGV4TWFzaysrOwoJCgkKCWlmICh3c3RyVmFsdWUubGVuZ3RoKCkgLSAocEV2ZW50LT5TZWxFbmQoKS1wRXZlbnQtPlNlbFN0YXJ0KCkpICsgd0NoYW5nZS5sZW5ndGgoKSA+IChGWF9EV09SRCl3c3RyTWFzay5HZXRMZW5ndGgoKSkKCXsKCQlBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKSk7CgkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJcmV0dXJuIFRSVUU7Cgl9CgkKCQoJaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgJiYgKCF3Q2hhbmdlLmVtcHR5KCkpKQoJewoJCUFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpKTsKCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQlyZXR1cm4gVFJVRTsKCX0KCQoJZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd0NoYW5nZS5iZWdpbigpOyBpdCAhPSB3Q2hhbmdlLmVuZCgpOyBpdCsrKQoJewoJCWlmIChpSW5kZXhNYXNrID49IHdzdHJNYXNrLkdldExlbmd0aCgpKQoJCXsKCQkJQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykpOwoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJCXdjaGFyX3Qgd19NYXNrID0gd3N0ck1hc2tbaUluZGV4TWFza107CgkJaWYgKCFpc1Jlc2VydmVkTWFza0NoYXIod19NYXNrKSkKCQl7CgkJCS8vd0NoYW5nZS5pbnNlcnQoaXQsd19NYXNrKTsJCQkJCgkJCSppdCA9IHdfTWFzazsKCQl9CgkJd2NoYXJfdCB3X0NoYW5nZSA9ICppdDsKCQkKICAgICAgICBpZiAoIW1hc2tTYXRpc2ZpZWQod19DaGFuZ2Usd19NYXNrKSkKCQl7CgkJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwoJCQlyZXR1cm4gVFJVRTsKCQl9CgkJaUluZGV4TWFzaysrOwoJfQoJCgl3aWRlQ2hhbmdlID0gd0NoYW5nZS5jX3N0cigpOwkKCQoJcmV0dXJuIFRSVUU7Cn0KCgovL2Z1bmN0aW9uIEFGU3BlY2lhbF9LZXlzdHJva2UocHNmKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIEpTX0Vycm9yU3RyaW5nJiBzRXJyb3IpCnsKCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglzdGQ6OnN0cmluZyBjRm9ybWF0OwoJaW50IGlJbmRleCA9IChpbnQpcGFyYW1zWzBdOwkKCglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CgkvL0NKU19WYWx1ZSB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CglDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwoJc3RkOjpzdHJpbmcgc3RyU3JjID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHZhbCkuY19zdHIoKTsKCXN0ZDo6d3N0cmluZyB3c3RyQ2hhbmdlKHBFdmVudC0+Q2hhbmdlKCkpOwoJCglzd2l0Y2ggKGlJbmRleCkgCgl7CgljYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgIAoJCWNGb3JtYXQgPSAiOTk5OTkiOwoJCWJyZWFrOwoJY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAKCQkvL2NGb3JtYXQgPSAiOTk5OTktOTk5OSI7CgkJY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwoJCWJyZWFrOwoJY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAKCQl7CgkJCXN0ZDo6c3RyaW5nIE51bWJlclN0cjsKCQkJdXRpbDo6cHJpbnR4KCI5OTk5OTk5OTk5Iiwgc3RyU3JjLE51bWJlclN0cik7IAoJCQlpZiAoc3RyU3JjLmxlbmd0aCgpICsgd3N0ckNoYW5nZS5sZW5ndGgoKSA+IDcgKQoJCQkJLy9jRm9ybWF0ID0gIig5OTkpIDk5OS05OTk5IjsKCQkJCWNGb3JtYXQgPSAiOTk5OTk5OTk5OSI7CgkJCWVsc2UgCgkJCQkvL2NGb3JtYXQgPSAiOTk5LTk5OTkiOwoJCQkJY0Zvcm1hdCA9ICI5OTk5OTk5IjsKCQkJYnJlYWs7CgkJfQoJY2FzZSAzOgoJCS8vY0Zvcm1hdCA9ICI5OTktOTktOTk5OSI7CgkJY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwoJCWJyZWFrOwoJfQogICAgCglDSlNfUGFyYW1ldGVycyBwYXJhbXMyOwoJQ0pTX1ZhbHVlIHZNYXNrKGlzb2xhdGUsIGNGb3JtYXQuY19zdHIoKSk7CglwYXJhbXMyLnB1c2hfYmFjayh2TWFzayk7CgkKICAgIHJldHVybiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoY2MscGFyYW1zMix2UmV0LHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgSlNfRXJyb3JTdHJpbmcmIHNFcnJvcikKewoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnRIYW5kbGVyID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoJQVNTRVJUKHBFdmVudEhhbmRsZXIgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglDRlhfV2lkZVN0cmluZyBzd1ZhbHVlOwoJaWYgKHBFdmVudEhhbmRsZXItPm1fcFZhbHVlICE9IE5VTEwpCgkJc3dWYWx1ZSA9IHBFdmVudEhhbmRsZXItPlZhbHVlKCk7CgoJaWYgKHBFdmVudEhhbmRsZXItPldpbGxDb21taXQoKSkKCXsKCQl2UmV0ID0gc3dWYWx1ZTsKCQlyZXR1cm4gVFJVRTsKCX0KCglDRlhfV2lkZVN0cmluZyBwcmVmaXgscG9zdGZpeDsKCglpZiAocEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSA+PSAwKQoJCXByZWZpeCA9IHN3VmFsdWUuTWlkKDAscEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSk7CgllbHNlCgkJcHJlZml4ID0gTCIiOwoKCglpZiAocEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPj0gMCAmJiBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA8PSBzd1ZhbHVlLkdldExlbmd0aCgpKQoJCXBvc3RmaXggPSBzd1ZhbHVlLk1pZChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSwgc3dWYWx1ZS5HZXRMZW5ndGgoKSAtIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpKTsKCWVsc2UgcG9zdGZpeCA9IEwiIjsKCgl2UmV0ID0gcHJlZml4ICsgcEV2ZW50SGFuZGxlci0+Q2hhbmdlKCkgKyBwb3N0Zml4OwoKCXJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBhcnNlRGF0ZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIEpTX0Vycm9yU3RyaW5nJiBzRXJyb3IpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcGFyYW1zWzBdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCk7CglDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzFdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCk7CgoJRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKCWRvdWJsZSBkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwoKCWlmIChKU19Qb3J0SXNOYW4oZERhdGUpKQoJewoJCUNGWF9XaWRlU3RyaW5nIHN3TXNnOwoJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSksIHNGb3JtYXQuY19zdHIoKSk7CgkJQWxlcnQoKENKU19Db250ZXh0ICopY2MsIHN3TXNnKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgkKCXZSZXQgPSBkRGF0ZTsKCglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgSlNfRXJyb3JTdHJpbmcmIHNFcnJvcikKewoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMykKCXsKCQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCXZSZXQgPSAoZG91YmxlKUFGX1NpbXBsZShwYXJhbXNbMF0ub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKSwgKGRvdWJsZSlwYXJhbXNbMV0sIChkb3VibGUpcGFyYW1zWzJdKTsKCXJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1ha2VOdW1iZXIoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgSlNfRXJyb3JTdHJpbmcmIHNFcnJvcikKewoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQogICAgdlJldCA9IFBhcnNlU3RyaW5nVG9OdW1iZXIocGFyYW1zWzBdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCkpOwoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlX0NhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBKU19FcnJvclN0cmluZyYgc0Vycm9yKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglDSlNfVmFsdWUgcGFyYW1zMSA9IHBhcmFtc1sxXTsKCglpZiAoIXBhcmFtczEuSXNBcnJheU9iamVjdCgpICYmIHBhcmFtczEuR2V0VHlwZSgpICE9IFZUX3N0cmluZykKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCQoJQ1BERlNES19Eb2N1bWVudCogcFJlYWRlckRvYyA9IHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpOwogICAgQVNTRVJUKHBSZWFkZXJEb2MgIT0gTlVMTCk7CgoJQ1BERlNES19JbnRlckZvcm0qIHBSZWFkZXJJbnRlckZvcm0gPSBwUmVhZGVyRG9jLT5HZXRJbnRlckZvcm0oKTsKCUFTU0VSVChwUmVhZGVySW50ZXJGb3JtICE9IE5VTEwpOwoKCUNQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CglBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKCglkb3VibGUgZFZhbHVlOwoJQ0ZYX1dpZGVTdHJpbmcgc0Z1bmN0aW9uID0gcGFyYW1zWzBdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCk7CglpZiAod2NzY21wKHNGdW5jdGlvbiwgTCJQUkQiKSA9PSAwKQogICAgCWRWYWx1ZSA9IDEuMDsKCWVsc2UKCQlkVmFsdWUgPSAwLjA7CgoJQ0pTX0FycmF5IEZpZWxkTmFtZUFycmF5ID0gQUZfTWFrZUFycmF5RnJvbUxpc3QoaXNvbGF0ZSxwYXJhbXMxKTsKCglpbnQgbkZpZWxkc0NvdW50ID0gMDsKCglmb3IgKGludCBpPTAsaXN6PUZpZWxkTmFtZUFycmF5LkdldExlbmd0aCgpOyBpPGlzejsgaSsrKQoJewoJCUNKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUpOwoJCUZpZWxkTmFtZUFycmF5LkdldEVsZW1lbnQoaSxqc1ZhbHVlKTsKICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkTmFtZSA9IGpzVmFsdWUub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKTsKCiAgICAgICAgZm9yIChpbnQgaj0wLGpzej1wSW50ZXJGb3JtLT5Db3VudEZpZWxkcyh3c0ZpZWxkTmFtZSk7IGo8anN6OyBqKyspCgkJewoJCQlpZiAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwSW50ZXJGb3JtLT5HZXRGaWVsZChqLCB3c0ZpZWxkTmFtZSkpCgkJCXsKCQkJCWRvdWJsZSBkVGVtcCA9IDAuMDsKCgkJCQlzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQoJCQkJewoJCQkJY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgoJCQkJY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6CgkJCQkJewoJCQkJCQlkVGVtcCA9IFBhcnNlU3RyaW5nVG9OdW1iZXIocEZvcm1GaWVsZC0+R2V0VmFsdWUoKSk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCWNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CgkJCQkJewoJCQkJCQlkVGVtcCA9IDAuMDsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CgkJCQljYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKCQkJCQl7CgkJCQkJCWRUZW1wID0gMC4wOwoJCQkJCQlmb3IgKGludCBjPTAsY3N6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgYzxjc3o7IGMrKykKCQkJCQkJewoJCQkJCQkJaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woYykpCgkJCQkJCQl7CgkJCQkJCQkJaWYgKHBGb3JtQ3RybC0+SXNDaGVja2VkKCkpCgkJCQkJCQkJewoJCQkJCQkJCQlkVGVtcCArPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtQ3RybC0+R2V0RXhwb3J0VmFsdWUoKSk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCWNhc2UgRklFTERUWVBFX0xJU1RCT1g6CgkJCQkJewoJCQkJCQlkVGVtcCA9IDAuMDsKCQkJCQkJaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKCQkJCQkJCWJyZWFrOwoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJZGVmYXVsdDoKCQkJCQlicmVhazsKCQkJCX0KCgkJCQlpZiAoaSA9PSAwICYmIGogPT0gMCAmJiAod2NzY21wKHNGdW5jdGlvbixMIk1JTiIpID09IDAgfHwgd2NzY21wKHNGdW5jdGlvbiwgTCJNQVgiKSA9PSAwKSkKCQkJCQlkVmFsdWUgPSBkVGVtcDsKCgkJCQlkVmFsdWUgPSBBRl9TaW1wbGUoc0Z1bmN0aW9uLCBkVmFsdWUsIGRUZW1wKTsKCgkJCQluRmllbGRzQ291bnQrKzsKCQkJfQoJCX0KCX0KCglpZiAod2NzY21wKHNGdW5jdGlvbiwgTCJBVkciKSA9PSAwICYmIG5GaWVsZHNDb3VudCA+IDApCgkJZFZhbHVlIC89IG5GaWVsZHNDb3VudDsKCglkVmFsdWUgPSAoZG91YmxlKWZsb29yKGRWYWx1ZSAqIEZYU1lTX3BvdygoZG91YmxlKTEwLChkb3VibGUpNikgKyAwLjQ5KSAvIEZYU1lTX3BvdygoZG91YmxlKTEwLChkb3VibGUpNik7CglDSlNfVmFsdWUganNWYWx1ZShpc29sYXRlLGRWYWx1ZSk7CglpZigoQ0pTX0V2ZW50SGFuZGxlciopcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5tX3BWYWx1ZSkKCQkoKENKU19FdmVudEhhbmRsZXIqKXBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKSktPlZhbHVlKCkgPSBqc1ZhbHVlOwoKCXJldHVybiBUUlVFOwp9CgovKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgY3VycmVudCBldmVudCB0byBlbnN1cmUgdGhhdCBpdHMgdmFsdWUgaXMgCioqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZSYW5nZV9WYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBKU19FcnJvclN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gNCkgCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJaWYgKHBFdmVudC0+VmFsdWUoKS5Jc0VtcHR5KCkgKQoJCXJldHVybiBUUlVFOwoJZG91YmxlIGRFZW50VmFsdWUgPSBhdG9mKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwRXZlbnQtPlZhbHVlKCkpKTsKCUZYX0JPT0wgYkdyZWF0ZXJUaGFuLCBiTGVzc1RoYW47Cglkb3VibGUgIGRHcmVhdGVyVGhhbiwgZExlc3NUaGFuOwogICAgYkdyZWF0ZXJUaGFuID0gKEZYX0JPT0wpcGFyYW1zWzBdOwoJQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CglkR3JlYXRlclRoYW4gPSAoZG91YmxlKXBhcmFtc1sxXTsKCWJMZXNzVGhhbiA9IChGWF9CT09MKXBhcmFtc1syXTsKCWRMZXNzVGhhbiA9IChkb3VibGUpcGFyYW1zWzNdOwoKCWlmIChiR3JlYXRlclRoYW4gJiYgYkxlc3NUaGFuKQoJewoJCWlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuIHx8IGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCgkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMSksKEZYX0xQQ1dTVFIpcGFyYW1zWzFdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCksIChGWF9MUENXU1RSKXBhcmFtc1szXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpKTsKCX0KCWVsc2UgaWYgKGJHcmVhdGVyVGhhbikKCXsKCQlpZiAoZEVlbnRWYWx1ZSA8IGRHcmVhdGVyVGhhbikKCQkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkFOR0UyKSwgKEZYX0xQQ1dTVFIpcGFyYW1zWzFdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCkpOwoJfQoJZWxzZSBpZiAoYkxlc3NUaGFuKQoJewoJCWlmIChkRWVudFZhbHVlID4gZExlc3NUaGFuKQoJCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTMpLCAoRlhfTFBDV1NUUilwYXJhbXNbM10ub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKSk7Cgl9CgoJaWYgKCFzd01zZy5Jc0VtcHR5KCkpCgl7CgkJQWxlcnQocENvbnRleHQsIHN3TXNnKTsKCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCX0KCXJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkV4dHJhY3ROdW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIEpTX0Vycm9yU3RyaW5nJiBzRXJyb3IpCnsKCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJQ0pTX0FycmF5IG51bXMoaXNvbGF0ZSk7CgoJQ0ZYX1dpZGVTdHJpbmcgc3RyID0gcGFyYW1zWzBdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCk7CglDRlhfV2lkZVN0cmluZyBzUGFydDsKCglpZiAoc3RyLkdldEF0KDApID09IEwnLicgfHwgc3RyLkdldEF0KDApID09IEwnLCcpCgkJc3RyID0gTCIwIiArIHN0cjsKCglpbnQgbkluZGV4ID0gMDsKCWZvciAoaW50IGk9MCwgc3o9c3RyLkdldExlbmd0aCgpOyBpPHN6OyBpKyspCgl7CgkJRlhfV0NIQVIgd2MgPSBzdHIuR2V0QXQoaSk7CgkJaWYgKElzRGlnaXQoKHdjaGFyX3Qpd2MpKQoJCXsKCQkJc1BhcnQgKz0gd2M7CgkJfQoJCWVsc2UKCQl7CgkJCWlmIChzUGFydC5HZXRMZW5ndGgoKSA+IDApCgkJCXsKCQkJCW51bXMuU2V0RWxlbWVudChuSW5kZXgsQ0pTX1ZhbHVlKGlzb2xhdGUsc1BhcnQuY19zdHIoKSkpOwoJCQkJc1BhcnQgPSBMIiI7CgkJCQluSW5kZXggKys7CgkJCX0KCQl9Cgl9CgoJaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkKCXsKCQludW1zLlNldEVsZW1lbnQobkluZGV4LENKU19WYWx1ZShpc29sYXRlLHNQYXJ0LmNfc3RyKCkpKTsJCgl9CgoJaWYgKG51bXMuR2V0TGVuZ3RoKCkgPiAwKQoJCXZSZXQgPSBudW1zOwoJZWxzZQoJCXZSZXQuU2V0TnVsbCgpOwoKCXJldHVybiBUUlVFOwp9Cg==