Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3Jlc291cmNlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0ZpZWxkLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvY29sb3IuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgiCgpzdGF0aWMgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoSUZYSlNfQ29udGV4dCogY2MpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKCglyZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19QdWJsaWNNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojZGVmaW5lIERPVUJMRV9DT1JSRUNUCTAuMDAwMDAwMDAwMDAwMDAxCgpCRUdJTl9KU19TVEFUSUNfR0xPQkFMX0ZVTihDSlNfUHVibGljTWV0aG9kcykKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0Zvcm1hdCkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0tleXN0cm9rZSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUGVyY2VudF9Gb3JtYXQpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBlcmNlbnRfS2V5c3Ryb2tlKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdEV4KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0tleXN0cm9rZUV4KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdCkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2UpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0RXgpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlRXgpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9Gb3JtYXQpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTcGVjaWFsX0tleXN0cm9rZUV4KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTaW1wbGUpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk1ha2VOdW1iZXIpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNpbXBsZV9DYWxjdWxhdGUpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlJhbmdlX1ZhbGlkYXRlKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNZXJnZUNoYW5nZSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUGFyc2VEYXRlRXgpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkV4dHJhY3ROdW1zKQpFTkRfSlNfU1RBVElDX0dMT0JBTF9GVU4oKQoKSU1QTEVNRU5UX0pTX1NUQVRJQ19HTE9CQUxfRlVOKENKU19QdWJsaWNNZXRob2RzKQoKc3RydWN0IHN0cnVfVGJDb252ZXJ0CnsKCWNvbnN0IEZYX0NIQVIqIGxwc3pKU01hcms7Cgljb25zdCBGWF9DSEFSKiBscHN6Q3BwTWFyazsKfTsKCnN0YXRpYyBjb25zdCBzdHJ1X1RiQ29udmVydCBmY1RhYmxlW10gPSB7Cgl7ICJtbW1tIiwiJUIiIH0sCgl7ICJtbW0iLCAiJWIiIH0sCgl7ICJtbSIsICAiJW0iIH0sCgkvLyJtIgoJeyAiZGRkZCIsIiVBIiB9LAoJeyAiZGRkIiwgIiVhIiB9LAoJeyAiZGQiLCAgIiVkIiB9LAoJLy8iZCIsICAgIiV3IiwKCXsgInl5eXkiLCIlWSIgfSwKCXsgInl5IiwgICIleSIgfSwKCXsgIkhIIiwgICIlSCIgfSwKCS8vIkgiCgl7ICJoaCIsICAiJUkiIH0sCgkvLyJoIgoJeyAiTU0iLCAgIiVNIiB9LAoJLy8iTSIKCXsgInNzIiwgICIlUyIgfSwKCS8vInMKCXsgInR0IiwgICIlcCIgfSwKCS8vInQiCn07CgpzdGF0aWMgY29uc3QgRlhfV0NIQVIqIG1vbnRoc1tdID0KewoJTCJKYW4iLCBMIkZlYiIsIEwiTWFyIiwgTCJBcHIiLCBMIk1heSIsIEwiSnVuIiwgTCJKdWwiLCBMIkF1ZyIsIEwiU2VwIiwgTCJPY3QiLCBMIk5vdiIsIEwiRGVjIgp9OwoKc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBjb25zdCBmdWxsbW9udGhzW10gPQp7CglMIkphbnVhcnkiLCBMIkZlYnJ1YXJ5IiwgTCJNYXJjaCIsIEwiQXByaWwiLCBMIk1heSIsIEwiSnVuZSIsIEwiSnVseSIsIEwiQXVndXN0IiwgTCJTZXB0ZW1iZXIiLCBMIk9jdG9iZXIiLCBMIk5vdmVtYmVyIiwgTCJEZWNlbWJlciIKfTsKCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpCnsKCUNGWF9XaWRlU3RyaW5nIHNUcmltID0gU3RyVHJpbShzdHJpbmcpOwoJY29uc3QgRlhfV0NIQVIqIHBUcmltID0gc1RyaW0uY19zdHIoKTsKCWNvbnN0IEZYX1dDSEFSKiBwID0gcFRyaW07CgoKCUZYX0JPT0wgYkRvdCA9IEZBTFNFOwoJRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwoKCXdjaGFyX3QgYzsKCXdoaWxlICgoYyA9ICpwKSkKCXsKCQlpZiAoYyA9PSAnLicgfHwgYyA9PSAnLCcpCgkJewoJCQlpZiAoYkRvdCkgcmV0dXJuIEZBTFNFOwoJCQliRG90ID0gVFJVRTsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnLScgfHwgYyA9PSAnKycpCgkJewoJCQlpZiAocCAhPSBwVHJpbSkKCQkJCXJldHVybiBGQUxTRTsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnZScgfHwgYyA9PSAnRScpCgkJewoJCQlpZiAoYktYSlMpIHJldHVybiBGQUxTRTsKCgkJCXArKzsKCQkJYyA9ICpwOwoJCQlpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpCgkJCXsKCQkJCWJLWEpTID0gVFJVRTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBGQUxTRTsKCQkJfQoJCX0KCQllbHNlIGlmICghSXNEaWdpdChjKSkKCQl7CgkJCXJldHVybiBGQUxTRTsKCQl9CgkJcCsrOwoJfQoKCXJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0RpZ2l0KHdjaGFyX3QgY2gpCnsKCXJldHVybiAoY2ggPj0gTCcwJyAmJiBjaCA8PSBMJzknKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKQp7CglyZXR1cm4gKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0FscGhhYmV0aWMod2NoYXJfdCBjaCkKewoJcmV0dXJuICgoY2ggPj0gTCdhJyAmJiBjaCA8PSBMJ3onKSB8fCAoY2ggPj0gTCdBJyAmJiBjaCA8PSBMJ1onKSk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpCnsKCXJldHVybiAoSXNEaWdpdChjaCkgfHwgSXNBbHBoYWJldGljKGNoKSk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzaykKewoJc3dpdGNoIChjX01hc2spCgl7CgljYXNlIEwnOSc6CiAgICAgICAgcmV0dXJuIElzRGlnaXQoY19DaGFuZ2UpOwogICAgY2FzZSBMJ0EnOgogICAgICAgIHJldHVybiBJc0FscGhhYmV0aWMoY19DaGFuZ2UpOwogICAgY2FzZSBMJ08nOgogICAgICAgIHJldHVybiBJc0FscGhhTnVtZXJpYyhjX0NoYW5nZSk7CiAgICBjYXNlIEwnWCc6CiAgICAgICAgcmV0dXJuIFRSVUU7CglkZWZhdWx0OgogICAgICAgIHJldHVybiAoY19DaGFuZ2UgPT0gY19NYXNrKTsKCX0KfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6aXNSZXNlcnZlZE1hc2tDaGFyKHdjaGFyX3QgY2gpCnsKCXJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX1NpbXBsZShjb25zdCBGWF9XQ0hBUiogc0Z1Y3Rpb24sIGRvdWJsZSBkVmFsdWUxLCBkb3VibGUgZFZhbHVlMikKewoJaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJBVkciKSA9PSAwIHx8IEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJTVU0iKSA9PSAwKQoJewoJCXJldHVybiBkVmFsdWUxICsgZFZhbHVlMjsKCX0KCWVsc2UgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiUFJEIikgPT0gMCkKCXsKCQlyZXR1cm4gZFZhbHVlMSAqIGRWYWx1ZTI7Cgl9CgllbHNlIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLEwiTUlOIikgPT0gMCkKCXsKCQlyZXR1cm4gRlhfTUlOKGRWYWx1ZTEsIGRWYWx1ZTIpOwoJfQoJZWxzZSBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIk1BWCIpID09IDApCgl7CgkJcmV0dXJuIEZYX01BWChkVmFsdWUxLCBkVmFsdWUyKTsKCX0KCglyZXR1cm4gZFZhbHVlMTsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0ckxUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKQp7Cgl3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gTCcgJykgcFN0cisrOwoKCXJldHVybiBwU3RyOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyUlRyaW0oY29uc3QgRlhfV0NIQVIqIHBTdHIpCnsKCWNvbnN0IEZYX1dDSEFSKiBwID0gcFN0cjsKCXdoaWxlICgqcCkgcCsrOwoJd2hpbGUgKHAgPiBwU3RyICYmICoocCAtIDEpID09IEwnICcpIHAtLTsKCglyZXR1cm4gQ0ZYX1dpZGVTdHJpbmcocFN0ciwgcCAtIHBTdHIpOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cikKewoJcmV0dXJuIFN0clJUcmltKFN0ckxUcmltKHBTdHIpLmNfc3RyKCkpOwp9CgpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyTFRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cikKewoJd2hpbGUgKCpwU3RyICYmICpwU3RyID09ICcgJykgcFN0cisrOwoKICAgICAgICByZXR1cm4gcFN0cjsKfQoKQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKGNvbnN0IEZYX0NIQVIqIHBTdHIpCnsKCWNvbnN0IEZYX0NIQVIqIHAgPSBwU3RyOwoJd2hpbGUgKCpwKSBwKys7Cgl3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykgcC0tOwoKCXJldHVybiBDRlhfQnl0ZVN0cmluZyhwU3RyLHAtcFN0cik7Cn0KCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJUcmltKGNvbnN0IEZYX0NIQVIqIHBTdHIpCnsKCXJldHVybiBTdHJSVHJpbShTdHJMVHJpbShwU3RyKSk7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBGWF9CT09MJiBiQWxsRGlnaXRzLCBGWF9CT09MJiBiRG90LCBGWF9CT09MJiBiU2lnbiwgRlhfQk9PTCYgYktYSlMpCnsKCWJEb3QgPSBGQUxTRTsKCWJTaWduID0gRkFMU0U7CgliS1hKUyA9IEZBTFNFOwoKCUZYX0JPT0wgYkRpZ2l0RXhpc3QgPSBGQUxTRTsKCgljb25zdCBGWF9XQ0hBUiogcCA9IHN3U291cmNlOwoJd2NoYXJfdCBjOwoKCWNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBOVUxMOwoJY29uc3QgRlhfV0NIQVIqIHBFbmQgPSBOVUxMOwoKCXdoaWxlICgoYyA9ICpwKSkKCXsKCQlpZiAoIXBTdGFydCAmJiBjICE9IEwnICcpCgkJewoJCQlwU3RhcnQgPSBwOwoJCX0KCgkJcEVuZCA9IHA7CgkJcCsrOwoJfQoKCWlmICghcFN0YXJ0KQoJewoJCWJBbGxEaWdpdHMgPSBGQUxTRTsKCQlyZXR1cm4gMDsKCX0KCgl3aGlsZSAocEVuZCAhPSBwU3RhcnQpCgl7CgkJaWYgKCpwRW5kID09IEwnICcpCgkJCXBFbmQgLS07CgkJZWxzZQoJCQlicmVhazsKCX0KCglkb3VibGUgZFJldCA9IDA7CglwID0gcFN0YXJ0OwoJYkFsbERpZ2l0cyA9IFRSVUU7CglDRlhfV2lkZVN0cmluZyBzd0RpZ2l0czsKCgl3aGlsZSAocCA8PSBwRW5kKQoJewoJCWMgPSAqcDsKCgkJaWYgKElzRGlnaXQoYykpCgkJewoJCQlzd0RpZ2l0cyArPSBjOwoJCQliRGlnaXRFeGlzdCA9IFRSVUU7CgkJfQoJCWVsc2UKCQl7CgkJCXN3aXRjaCAoYykKCQkJewoJCQljYXNlIEwnICc6CgkJCQliQWxsRGlnaXRzID0gRkFMU0U7CgkJCQlicmVhazsKCQkJY2FzZSBMJy4nOgoJCQljYXNlIEwnLCc6CgkJCQlpZiAoIWJEb3QpCgkJCQl7CgkJCQkJaWYgKGJEaWdpdEV4aXN0KQoJCQkJCXsKCQkJCQkJc3dEaWdpdHMgKz0gTCcuJzsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJc3dEaWdpdHMgKz0gTCcwJzsKCQkJCQkJc3dEaWdpdHMgKz0gTCcuJzsKCQkJCQkJYkRpZ2l0RXhpc3QgPSBUUlVFOwoJCQkJCX0KCgkJCQkJYkRvdCA9IFRSVUU7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCWNhc2UgJ2UnOgoJCQljYXNlICdFJzoKCQkJCWlmICghYktYSlMpCgkJCQl7CgkJCQkJcCsrOwoJCQkJCWMgPSAqcDsKCQkJCQlpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpCgkJCQkJewoJCQkJCQliS1hKUyA9IFRSVUU7CgkJCQkJCXN3RGlnaXRzICs9ICdlJzsKCQkJCQkJc3dEaWdpdHMgKz0gYzsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQl9CgkJCWNhc2UgTCctJzoKCQkJCWlmICghYkRpZ2l0RXhpc3QgJiYgIWJTaWduKQoJCQkJewoJCQkJCXN3RGlnaXRzICs9IGM7CgkJCQkJYlNpZ24gPSBUUlVFOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQlkZWZhdWx0OgoJCQkJYkFsbERpZ2l0cyA9IEZBTFNFOwoKCQkJCWlmIChwICE9IHBTdGFydCAmJiAhYkRvdCAmJiBiRGlnaXRFeGlzdCkKCQkJCXsKCQkJCQlzd0RpZ2l0cyArPSBMJy4nOwoJCQkJCWJEb3QgPSBUUlVFOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWJEb3QgPSBGQUxTRTsKCQkJCQliRGlnaXRFeGlzdCA9IEZBTFNFOwoJCQkJCXN3RGlnaXRzID0gTCIiOwoJCQkJfQoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCXArKzsKCX0KCglpZiAoc3dEaWdpdHMuR2V0TGVuZ3RoKCkgPiAwICYmIHN3RGlnaXRzLkdldExlbmd0aCgpIDwgMTcpCgl7CgkJQ0ZYX0J5dGVTdHJpbmcgc0RpZ2l0cyA9IHN3RGlnaXRzLlVURjhFbmNvZGUoKTsKCgkJaWYgKGJLWEpTKQoJCXsKCQkJZFJldCA9IGF0b2Yoc0RpZ2l0cyk7CgkJfQoJCWVsc2UKCQl7CgkJCWlmIChiRG90KQoJCQl7CgkJCQljaGFyKiBwU3RvcFN0cmluZzsKCQkJCWRSZXQgPSA6OnN0cnRvZChzRGlnaXRzLCAmcFN0b3BTdHJpbmcpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZFJldCA9IGF0b2woc0RpZ2l0cyk7CgkJCX0KCQl9CgoJfQoKCXJldHVybiBkUmV0Owp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlKQp7CglGWF9CT09MIGJBbGxEaWdpdHMgPSBGQUxTRTsKCUZYX0JPT0wgYkRvdCA9IEZBTFNFOwoJRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwoJRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwoKCXJldHVybiBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsKfQoKRlhfQk9PTAlDSlNfUHVibGljTWV0aG9kczo6Q29udmVydFN0cmluZ1RvTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwgZG91YmxlICYgZFJldCwgRlhfQk9PTCAmIGJEb3QpCnsKCUZYX0JPT0wgYkFsbERpZ2l0cyA9IEZBTFNFOwoJRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwoJRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwoKCWRSZXQgPSBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsKCglyZXR1cm4gYkFsbERpZ2l0czsKfQoKQ0pTX0FycmF5IENKU19QdWJsaWNNZXRob2RzOjpBRl9NYWtlQXJyYXlGcm9tTGlzdCh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgQ0pTX1ZhbHVlIHZhbCkKewoJQ0pTX0FycmF5IFN0ckFycmF5KGlzb2xhdGUpOwoJaWYodmFsLklzQXJyYXlPYmplY3QoKSkKCXsKCQl2YWwuQ29udmVydFRvQXJyYXkoU3RyQXJyYXkpOwoJCXJldHVybiBTdHJBcnJheTsKCX0KCUNGWF9XaWRlU3RyaW5nIHdzU3RyID0gdmFsLlRvQ0ZYV2lkZVN0cmluZygpOwoJQ0ZYX0J5dGVTdHJpbmcgdCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cik7Cgljb25zdCBjaGFyICogcCA9IChjb25zdCBjaGFyICopdDsKCgoJaW50IGNoID0gJywnIDsKCWludCBuSW5kZXggPSAwOwoKCXdoaWxlICgqcCkKCXsKCQljb25zdCBjaGFyICogcFRlbXAgPSBzdHJjaHIocCwgY2gpOwoJCWlmIChwVGVtcCA9PSBOVUxMKQoJCXsKCQkJU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBTdHJUcmltKHApLmNfc3RyKCkpKTsKCQkJYnJlYWs7CgkJfQoJCWVsc2UKCQl7CgkJCWNoYXIgKiBwU3ViID0gbmV3IGNoYXJbcFRlbXAgLSBwICsgMV07CgkJCXN0cm5jcHkocFN1YiwgcCwgcFRlbXAgLSBwKTsKCQkJKihwU3ViICsgKHBUZW1wIC0gcCkpID0gJ1wwJzsKCgkJCVN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgU3RyVHJpbShwU3ViKS5jX3N0cigpKSk7CgkJCWRlbGV0ZSBbXXBTdWI7CgoJCQluSW5kZXggKys7CgkJCXAgPSArK3BUZW1wOwoJCX0KCgl9CglyZXR1cm4gU3RyQXJyYXk7Cn0KCmludCBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdJbnRlZ2VyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcsaW50IG5TdGFydCxpbnQmIG5Ta2lwLCBpbnQgbk1heFN0ZXApCnsKCWludCBuUmV0ID0gMDsKCW5Ta2lwID0gMDsKCWZvciAoaW50IGk9blN0YXJ0LCBzej1zdHJpbmcuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKQoJewoJCWlmIChpLW5TdGFydCA+IDEwKQoJCQlicmVhazsKCgkJRlhfV0NIQVIgYyA9IHN0cmluZy5HZXRBdChpKTsKCQlpZiAoSXNEaWdpdCgod2NoYXJfdCljKSkKCQl7CgkJCW5SZXQgPSBuUmV0ICogMTAgKyAoYyAtICcwJyk7CgkJCW5Ta2lwID0gaSAtIG5TdGFydCArIDE7CgkJCWlmIChuU2tpcCA+PSBuTWF4U3RlcCkKCQkJCWJyZWFrOwoJCX0KCQllbHNlCgkJCWJyZWFrOwoJfQoKCXJldHVybiBuUmV0Owp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywgaW50IG5TdGFydCwgaW50JiBuU2tpcCkKewoJQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7CgluU2tpcCA9IDA7Cglmb3IgKGludCBpPW5TdGFydCwgc3o9c3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykKCXsKCQlGWF9XQ0hBUiBjID0gc3RyaW5nLkdldEF0KGkpOwoJCWlmICgoYyA+PSBMJ2EnICYmIGMgPD0gTCd6JykgfHwgKGMgPj0gTCdBJyAmJiBjIDw9IEwnWicpKQoJCXsKCQkJc3dSZXQgKz0gYzsKCQkJblNraXAgPSBpIC0gblN0YXJ0ICsgMTsKCQl9CgkJZWxzZQoJCQlicmVhazsKCX0KCglyZXR1cm4gc3dSZXQ7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VOb3JtYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIEZYX0JPT0wmIGJXcm9uZ0Zvcm1hdCkKewoJZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKCglpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOwoJaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZHQpICsgMTsKCWludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOwoJaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKCWludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZHQpOwoJaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7CgoJaW50IG51bWJlclszXTsKCglpbnQgblNraXAgPSAwOwoJaW50IG5MZW4gPSB2YWx1ZS5HZXRMZW5ndGgoKTsKCWludCBuSW5kZXggPSAwOwoJaW50IGkgPSAwOwoJd2hpbGUgKGkgPCBuTGVuKQoJewoJCWlmIChuSW5kZXggPiAyKSBicmVhazsKCgkJRlhfV0NIQVIgYyA9IHZhbHVlLkdldEF0KGkpOwoJCWlmIChJc0RpZ2l0KCh3Y2hhcl90KWMpKQoJCXsKCQkJbnVtYmVyW25JbmRleCsrXSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaSwgblNraXAsIDQpOwoJCQlpICs9IG5Ta2lwOwoJCX0KCQllbHNlCgkJewoJCQlpICsrOwoJCX0KCX0KCglpZiAobkluZGV4ID09IDIpCgl7CgkJLy8gY2FzZTI6IG1vbnRoL2RheQoJCS8vIGNhc2UzOiBkYXkvbW9udGgKCQlpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkpCgkJewoJCQluTW9udGggPSBudW1iZXJbMF07CgkJCW5EYXkgPSBudW1iZXJbMV07CgkJfQoJCWVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMzEpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpKQoJCXsKCQkJbkRheSA9IG51bWJlclswXTsKCQkJbk1vbnRoID0gbnVtYmVyWzFdOwoJCX0KCgkJYldyb25nRm9ybWF0ID0gRkFMU0U7Cgl9CgllbHNlIGlmIChuSW5kZXggPT0gMykKCXsKCQkvLyBjYXNlMTogeWVhci9tb250aC9kYXkKCQkvLyBjYXNlMjogbW9udGgvZGF5L3llYXIKCQkvLyBjYXNlMzogZGF5L21vbnRoL3llYXIKCgkJaWYgKG51bWJlclswXSA+IDEyICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpICYmIChudW1iZXJbMl0gPj0gMSAmJiBudW1iZXJbMl0gPD0gMzEpKQoJCXsKCQkJblllYXIgPSBudW1iZXJbMF07CgkJCW5Nb250aCA9IG51bWJlclsxXTsKCQkJbkRheSA9IG51bWJlclsyXTsKCQl9CgkJZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkgJiYgbnVtYmVyWzJdID4gMzEpCgkJewoJCQluTW9udGggPSBudW1iZXJbMF07CgkJCW5EYXkgPSBudW1iZXJbMV07CgkJCW5ZZWFyID0gbnVtYmVyWzJdOwoJCX0KCQllbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDMxKSAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSAmJiBudW1iZXJbMl0gPiAzMSkKCQl7CgkJCW5EYXkgPSBudW1iZXJbMF07CgkJCW5Nb250aCA9IG51bWJlclsxXTsKCQkJblllYXIgPSBudW1iZXJbMl07CgkJfQoKCQliV3JvbmdGb3JtYXQgPSBGQUxTRTsKCX0KCWVsc2UKCXsKCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoJCXJldHVybiBkdDsKCX0KCglDRlhfV2lkZVN0cmluZyBzd1RlbXA7Cglzd1RlbXAuRm9ybWF0KEwiJWQvJWQvJWQgJWQ6JWQ6JWQiLG5Nb250aCxuRGF5LG5ZZWFyLG5Ib3VyLG5NaW4sblNlYyk7CglyZXR1cm4gSlNfRGF0ZVBhcnNlKHN3VGVtcC5jX3N0cigpKTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBmb3JtYXQsIEZYX0JPT0wmIGJXcm9uZ0Zvcm1hdCkKewoJZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKCglpZiAoZm9ybWF0LklzRW1wdHkoKSB8fCB2YWx1ZS5Jc0VtcHR5KCkpCgkJcmV0dXJuIGR0OwoKCWludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkdCk7CglpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkdCkgKyAxOwoJaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7CglpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZHQpOwoJaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkdCk7CglpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKCglpbnQgblllYXJTdWIgPSA5OTsgLy9uWWVhciAtIDIwMDA7CgoJRlhfQk9PTCBiUG0gPSBGQUxTRTsKCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKCWJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwoKCWludCBpPTA7CglpbnQgaj0wOwoKCXdoaWxlIChpIDwgZm9ybWF0LkdldExlbmd0aCgpKQoJewoJCWlmIChiRXhpdCkgYnJlYWs7CgoJCUZYX1dDSEFSIGMgPSBmb3JtYXQuR2V0QXQoaSk7CgkJc3dpdGNoIChjKQoJCXsKCQkJY2FzZSAnOic6CgkJCWNhc2UgJy4nOgoJCQljYXNlICctJzoKCQkJY2FzZSAnXFwnOgoJCQljYXNlICcvJzoKCQkJCWkrKzsKCQkJCWorKzsKCQkJCWJyZWFrOwoKCQkJY2FzZSAneSc6CgkJCWNhc2UgJ20nOgoJCQljYXNlICdkJzoKCQkJY2FzZSAnSCc6CgkJCWNhc2UgJ2gnOgoJCQljYXNlICdNJzoKCQkJY2FzZSAncyc6CgkJCWNhc2UgJ3QnOgoJCQkJewoJCQkJCWludCBvbGRqID0gajsKCQkJCQlpbnQgblNraXAgPSAwOwoJCQkJCWludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKCgkJCQkJaWYgKHJlbWFpbmluZyA9PSAwIHx8IGZvcm1hdC5HZXRBdChpKzEpICE9IGMpCgkJCQkJewoJCQkJCQlzd2l0Y2ggKGMpCgkJCQkJCXsKCQkJCQkJCWNhc2UgJ3knOgoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqKys7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdtJzoKCQkJCQkJCQluTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2QnOgoJCQkJCQkJCW5EYXkgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ0gnOgoJCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSsrOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdoJzoKCQkJCQkJCQluSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnTSc6CgkJCQkJCQkJbk1pbiA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAncyc6CgkJCQkJCQkJblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAndCc6CgkJCQkJCQkJYlBtID0gKGogPCB2YWx1ZS5HZXRMZW5ndGgoKSAmJiB2YWx1ZS5HZXRBdChqKSA9PSAncCcpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqKys7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDEgfHwgZm9ybWF0LkdldEF0KGkrMikgIT0gYykKCQkJCQl7CgkJCQkJCXN3aXRjaCAoYykKCQkJCQkJewoJCQkJCQkJY2FzZSAneSc6CgkJCQkJCQkJblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnZCc6CgkJCQkJCQkJbkRheSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnSCc6CgkJCQkJCQkJbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2gnOgoJCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdNJzoKCQkJCQkJCQluTWluID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdzJzoKCQkJCQkJCQluU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICd0JzoKCQkJCQkJCQliUG0gPSAoaiArIDEgPCB2YWx1ZS5HZXRMZW5ndGgoKSAmJiB2YWx1ZS5HZXRBdChqKSA9PSAncCcgJiYgdmFsdWUuR2V0QXQoaisxKSA9PSAnbScpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IDI7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDIgfHwgZm9ybWF0LkdldEF0KGkrMykgIT0gYykKCQkJCQl7CgkJCQkJCXN3aXRjaCAoYykKCQkJCQkJewoJCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQkJewoJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyBzTW9udGggPSBQYXJzZVN0cmluZ1N0cmluZyh2YWx1ZSwgaiwgblNraXApOwoJCQkJCQkJCQlGWF9CT09MIGJGaW5kID0gRkFMU0U7CgkJCQkJCQkJCWZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykKCQkJCQkJCQkJewoJCQkJCQkJCQkJaWYgKHNNb250aC5Db21wYXJlTm9DYXNlKG1vbnRoc1ttXSkgPT0gMCkKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQluTW9udGggPSBtICsgMTsKCQkJCQkJCQkJCQlpKz0zOwoJCQkJCQkJCQkJCWorPW5Ta2lwOwoJCQkJCQkJCQkJCWJGaW5kID0gVFJVRTsKCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoKCQkJCQkJCQkJaWYgKCFiRmluZCkKCQkJCQkJCQkJewoJCQkJCQkJCQkJbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMyk7CgkJCQkJCQkJCQlpKz0zOwoJCQkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3knOgoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQlpKz0zOwoJCQkJCQkJCWorPTM7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkrNCkgIT0gYykKCQkJCQl7CgkJCQkJCXN3aXRjaCAoYykKCQkJCQkJewoKCgkJCQkJCQljYXNlICd5JzoKCQkJCQkJCQluWWVhciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJaSArPSA0OwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQkJewoJCQkJCQkJCQlGWF9CT09MIGJGaW5kID0gRkFMU0U7CgoJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyBzTW9udGggPSBQYXJzZVN0cmluZ1N0cmluZyh2YWx1ZSwgaiwgblNraXApOwoJCQkJCQkJCQlzTW9udGguTWFrZUxvd2VyKCk7CgoJCQkJCQkJCQlmb3IgKGludCBtID0gMDsgbSA8IDEyOyBtKyspCgkJCQkJCQkJCXsKCQkJCQkJCQkJCUNGWF9XaWRlU3RyaW5nIHNGdWxsTW9udGhzID0gZnVsbG1vbnRoc1ttXTsKCQkJCQkJCQkJCXNGdWxsTW9udGhzLk1ha2VMb3dlcigpOwoKCQkJCQkJCQkJCWlmIChzRnVsbE1vbnRocy5GaW5kKHNNb250aC5jX3N0cigpLCAwKSAhPSAtMSkKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQluTW9udGggPSBtICsgMTsKCQkJCQkJCQkJCQlpICs9IDQ7CgkJCQkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQkJCQliRmluZCA9IFRSVUU7CgkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCgkJCQkJCQkJCWlmICghYkZpbmQpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwoJCQkJCQkJCQkJaSs9NDsKCQkJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCWkgKz0gNDsKCQkJCQkJCQlqICs9IDQ7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaWYgKGogPj0gdmFsdWUuR2V0TGVuZ3RoKCkgfHwgZm9ybWF0LkdldEF0KGkpICE9IHZhbHVlLkdldEF0KGopKQoJCQkJCQl7CgkJCQkJCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoJCQkJCQkJYkV4aXQgPSBUUlVFOwoJCQkJCQl9CgkJCQkJCWkrKzsKCQkJCQkJaisrOwoJCQkJCX0KCgkJCQkJaWYgKG9sZGogPT0gaikKCQkJCQl7CgkJCQkJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgkJCQkJCWJFeGl0ID0gVFJVRTsKCQkJCQl9CgkJCQl9CgoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlpZiAodmFsdWUuR2V0TGVuZ3RoKCkgPD0gaikKCQkJCXsKCQkJCQliRXhpdCA9IFRSVUU7CgkJCQl9CgkJCQllbHNlIGlmIChmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpCgkJCQl7CgkJCQkJYldyb25nRm9ybWF0ID0gVFJVRTsKCQkJCQliRXhpdCA9IFRSVUU7CgkJCQl9CgoJCQkJaSsrOwoJCQkJaisrOwoJCQkJYnJlYWs7CgkJfQoJfQoKCWlmIChiUG0pIG5Ib3VyICs9IDEyOwoKCWlmIChuWWVhciA+PSAwICYmIG5ZZWFyIDw9IG5ZZWFyU3ViKQoJCW5ZZWFyICs9IDIwMDA7CgoJaWYgKG5Nb250aCA8IDEgfHwgbk1vbnRoID4gMTIpCgkJYldyb25nRm9ybWF0ID0gVFJVRTsKCglpZiAobkRheSA8IDEgfHwgbkRheSA+IDMxKQoJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgoJaWYgKG5Ib3VyIDwgMCB8fCBuSG91ciA+IDI0KQoJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgoJaWYgKG5NaW4gPCAwIHx8IG5NaW4gPiA2MCkKCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoKCWlmIChuU2VjIDwgMCB8fCBuU2VjID4gNjApCgkJYldyb25nRm9ybWF0ID0gVFJVRTsKCglkb3VibGUgZFJldCA9IDA7CgoJaWYgKGJXcm9uZ0Zvcm1hdCkKCXsKCQlkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwoJfQoJZWxzZQoJewoJCWRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLG5Nb250aCAtIDEsbkRheSksSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCgkJaWYgKEpTX1BvcnRJc05hbihkUmV0KSkKCQl7CgkJCWRSZXQgPSBKU19EYXRlUGFyc2UodmFsdWUuY19zdHIoKSk7CgkJfQoJfQoKCWlmIChKU19Qb3J0SXNOYW4oZFJldCkpCgl7CgkJZFJldCA9IFBhcnNlTm9ybWFsRGF0ZSh2YWx1ZSwgYldyb25nRm9ybWF0KTsKCX0KCglyZXR1cm4gZFJldDsKCn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZShkb3VibGUgZERhdGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0KQp7CglDRlhfV2lkZVN0cmluZyBzUmV0ID0gTCIiLHNQYXJ0ID0gTCIiOwoKCWludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkRGF0ZSk7CglpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkRGF0ZSkgKyAxOwoJaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkRGF0ZSk7CglpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZERhdGUpOwoJaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkRGF0ZSk7CglpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGREYXRlKTsKCglpbnQgaSA9IDA7Cgl3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkKCXsKCSAgICAgICAgRlhfV0NIQVIgYyA9IGZvcm1hdC5HZXRBdChpKTsKICAgICAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKCQlzUGFydCA9IEwiIjsKCQlzd2l0Y2ggKGMpCgkJewoJCQljYXNlICd5JzoKCQkJY2FzZSAnbSc6CgkJCWNhc2UgJ2QnOgoJCQljYXNlICdIJzoKCQkJY2FzZSAnaCc6CgkJCWNhc2UgJ00nOgoJCQljYXNlICdzJzoKCQkJY2FzZSAndCc6CgkJCQlpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkrMSkgIT0gYykKCQkJCXsKCQkJCQlzd2l0Y2ggKGMpCgkJCQkJewoJCQkJCQljYXNlICd5JzoKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbk1vbnRoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdkJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiVkIixuRGF5KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdIJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiVkIixuSG91cik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnaCc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbkhvdXI+MTI/bkhvdXIgLSAxMjpuSG91cik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnTSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbk1pbik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAncyc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsblNlYyk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAndCc6CgkJCQkJCQlzUGFydCArPSBuSG91cj4xMj8ncCc6J2EnOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWkrKzsKCQkJCX0KCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAxIHx8IGZvcm1hdC5HZXRBdChpKzIpICE9IGMpCgkJCQl7CgkJCQkJc3dpdGNoIChjKQoJCQkJCXsKCQkJCQkJY2FzZSAneSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuWWVhciAtIChuWWVhciAvIDEwMCkgKiAxMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbk1vbnRoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdkJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5EYXkpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ0gnOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbkhvdXIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2gnOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbkhvdXI+MTI/bkhvdXIgLSAxMjpuSG91cik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnTSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuTWluKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdzJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5TZWMpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3QnOgoJCQkJCQkJc1BhcnQgPSBuSG91cj4xMj8gTCJwbSI6IEwiYW0iOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWkrPTI7CgkJCQl9CgkJCQllbHNlIGlmIChyZW1haW5pbmcgPT0gMiB8fCBmb3JtYXQuR2V0QXQoaSszKSAhPSBjKQoJCQkJewoJCQkJCXN3aXRjaCAoYykKCQkJCQl7CgkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJaSs9MzsKCQkJCQkJCWlmIChuTW9udGggPiAwJiZuTW9udGggPD0gMTIpCgkJCQkJCQkJc1BhcnQgKz0gbW9udGhzW25Nb250aCAtIDFdOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWRlZmF1bHQ6CgkJCQkJCQlpKz0zOwoJCQkJCQkJc1BhcnQgKz0gYzsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkrNCkgIT0gYykKCQkJCXsKCQkJCQlzd2l0Y2ggKGMpCgkJCQkJewoJCQkJCQljYXNlICd5JzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwNGQiLG5ZZWFyKTsKCQkJCQkJCWkgKz0gNDsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdtJzoKCQkJCQkJCWkrPTQ7CgkJCQkJCQlpZiAobk1vbnRoID4gMCYmbk1vbnRoIDw9IDEyKQoJCQkJCQkJCXNQYXJ0ICs9IGZ1bGxtb250aHNbbk1vbnRoIC0gMV07CgkJCQkJCQlicmVhazsKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCWkgKz0gNDsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJc1BhcnQgKz0gYzsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaSsrOwoJCQkJCXNQYXJ0ICs9IGM7CgkJCQl9CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWkrKzsKCQkJCXNQYXJ0ICs9IGM7CgkJCQlicmVhazsKCQl9CgoJCXNSZXQgKz0gc1BhcnQ7Cgl9CgoJcmV0dXJuIHNSZXQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovL2Z1bmN0aW9uIEFGTnVtYmVyX0Zvcm1hdChuRGVjLCBzZXBTdHlsZSwgbmVnU3R5bGUsIGN1cnJTdHlsZSwgc3RyQ3VycmVuY3ksIGJDdXJyZW5jeVByZXBlbmQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDYpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CglDRlhfQnl0ZVN0cmluZyBzdHJWYWx1ZSA9IFN0clRyaW0oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKSk7CgoJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkgcmV0dXJuIFRSVUU7CgoJaW50IGlEZWMgPSBwYXJhbXNbMF0uVG9JbnQoKTsKCWludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKCWludCBpTmVnU3R5bGUgPSBwYXJhbXNbMl0uVG9JbnQoKTsKCS8vIHBhcmFtc1szXSBpcyBpQ3VyclN0eWxlLCBpdCdzIG5vdCB1c2VkLgoJc3RkOjp3c3RyaW5nIHdzdHJDdXJyZW5jeShwYXJhbXNbNF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CglGWF9CT09MIGJDdXJyZW5jeVByZXBlbmQgPSBwYXJhbXNbNV0uVG9Cb29sKCk7CgoJaWYgKGlEZWMgPCAwKSBpRGVjID0gLWlEZWM7CgoJaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKCQlpU2VwU3R5bGUgPSAwOwoKCWlmIChpTmVnU3R5bGUgPCAwIHx8IGlOZWdTdHlsZSA+IDMpCgkJaU5lZ1N0eWxlID0gMDsKCgoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkvL2ZvciBwcm9jZXNzaW5nIGRlY2ltYWwgcGxhY2VzCglzdHJWYWx1ZS5SZXBsYWNlKCIsIiwgIi4iKTsKCWRvdWJsZSBkVmFsdWUgPSBhdG9mKHN0clZhbHVlKTsKCWlmIChpRGVjID4gMCkKCQlkVmFsdWUgKz0gRE9VQkxFX0NPUlJFQ1Q7Ly8KCglpbnQgaURlYzI7CglGWF9CT09MIGJOYWdhdGl2ZSA9IEZBTFNFOwoKCXN0clZhbHVlID0gZmN2dChkVmFsdWUsaURlYywmaURlYzIsJmJOYWdhdGl2ZSk7CglpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQoJewoJCWRWYWx1ZSA9IDA7CgkJc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5hZ2F0aXZlKTsKCQlpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQoJCXsKCQkJc3RyVmFsdWUgPSAiMCI7CgkJCWlEZWMyID0gMTsKCQl9CgoJfQoKCWlmIChpRGVjMiA8IDApCgl7CgkJZm9yIChpbnQgaU51bSA9IDA7aU51bSA8IGFicyhpRGVjMik7aU51bSsrKQoJCXsKCQkJc3RyVmFsdWUgPSAiMCIgKyBzdHJWYWx1ZTsKCQl9CgkJaURlYzIgPSAwOwoKCX0KCWludCBpTWF4ID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CglpZiAoaURlYzIgPiBpTWF4KQoJewoJCWZvciAoaW50IGlOdW0gPSAwO2lOdW0gPD0gaURlYzIgLSBpTWF4IDtpTnVtKyspCgkJewoJCQlzdHJWYWx1ZSArPSAiMCI7CgkJfQoJCWlNYXggPSBpRGVjMisxOwoJfQoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy9mb3IgcHJvY2Vzc2luZyBzZXBlcmF0b3Igc3R5bGUKCWlmIChpRGVjMiA8IGlNYXgpCgl7CgkJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKQoJCXsKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLicpOwoJCQlpTWF4Kys7CgkJfQoJCWVsc2UgaWYgKGlTZXBTdHlsZSA9PSAyIHx8IGlTZXBTdHlsZSA9PSAzKQoJCXsKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLCcpOwoJCQlpTWF4Kys7CgkJfQoKCQlpZiAoaURlYzIgPT0gMCkKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwoJfQoJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKQoJewoJCWNoYXIgY1NlcGVyYXRvcjsKCQlpZiAoaVNlcFN0eWxlID09IDApCgkJCWNTZXBlcmF0b3IgPSAnLCc7CgkJZWxzZQoJCQljU2VwZXJhdG9yID0gJy4nOwoKCQlpbnQgaURlY1Bvc2l0aXZlLGlEZWNOYWdhdGl2ZTsKCQlpRGVjUG9zaXRpdmUgPSBpRGVjMjsKCQlpRGVjTmFnYXRpdmUgPSBpRGVjMjsKCgkJZm9yIChpRGVjUG9zaXRpdmUgPSBpRGVjMiAtMzsgaURlY1Bvc2l0aXZlID4gMDtpRGVjUG9zaXRpdmUgLT0gMykKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBlcmF0b3IpOwoJCQlpTWF4Kys7CgkJfQoJfQoKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vZm9yIHByb2Nlc3NpbmcgY3VycmVuY3kgc3RyaW5nCgoJVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsKCXN0ZDo6d3N0cmluZyBzdHJWYWx1ZTIgPSBWYWx1ZS5jX3N0cigpOwoKCWlmIChiQ3VycmVuY3lQcmVwZW5kKQoJCXN0clZhbHVlMiA9IHdzdHJDdXJyZW5jeSArIHN0clZhbHVlMjsKCWVsc2UKCQlzdHJWYWx1ZTIgPSBzdHJWYWx1ZTIgKyB3c3RyQ3VycmVuY3k7CgoKCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkvL2ZvciBwcm9jZXNzaW5nIG5lZ2F0aXZlIHN0eWxlCglpZiAoYk5hZ2F0aXZlKQoJewoJCWlmIChpTmVnU3R5bGUgPT0gMCkKCQl7CgkJCXN0clZhbHVlMi5pbnNlcnQoMCxMIi0iKTsKCQl9CgkJaWYgKGlOZWdTdHlsZSA9PSAyIHx8IGlOZWdTdHlsZSA9PSAzKQoJCXsKCQkJc3RyVmFsdWUyLmluc2VydCgwLEwiKCIpOwoJCQlzdHJWYWx1ZTIuaW5zZXJ0KHN0clZhbHVlMi5sZW5ndGgoKSxMIikiKTsKCQl9CgkJaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKQoJCXsKCQkJaWYgKEZpZWxkICogZlRhcmdldCA9IHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCkpCgkJCXsKCQkJCUNKU19BcnJheSBhckNvbG9yKGlzb2xhdGUpOwoJCQkJQ0pTX1ZhbHVlIHZDb2xFbG0oaXNvbGF0ZSk7CgkJCQl2Q29sRWxtID0gTCJSR0IiOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDAsdkNvbEVsbSk7CgkJCQl2Q29sRWxtID0gMTsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgxLHZDb2xFbG0pOwoJCQkJdkNvbEVsbSA9IDA7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMix2Q29sRWxtKTsKCgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMyx2Q29sRWxtKTsKCgkJCQlDSlNfUHJvcFZhbHVlIHZQcm9wKGlzb2xhdGUpOwoJCQkJdlByb3AuU3RhcnRHZXR0aW5nKCk7CgkJCQl2UHJvcDw8YXJDb2xvcjsKCQkJCXZQcm9wLlN0YXJ0U2V0dGluZygpOwoJCQkJZlRhcmdldC0+dGV4dENvbG9yKGNjLHZQcm9wLHNFcnJvcik7Ly8gcmVkCgkJCX0KCQl9Cgl9CgllbHNlCgl7CgkJaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKQoJCXsKCQkJaWYgKEZpZWxkICpmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkKCQkJewoJCQkJQ0pTX0FycmF5IGFyQ29sb3IoaXNvbGF0ZSk7CgkJCQlDSlNfVmFsdWUgdkNvbEVsbShpc29sYXRlKTsKCQkJCXZDb2xFbG0gPSBMIlJHQiI7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMCx2Q29sRWxtKTsKCQkJCXZDb2xFbG0gPSAwOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDEsdkNvbEVsbSk7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMix2Q29sRWxtKTsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgzLHZDb2xFbG0pOwoKCQkJCUNKU19Qcm9wVmFsdWUgdlByb3AoaXNvbGF0ZSk7CgkJCQl2UHJvcC5TdGFydEdldHRpbmcoKTsKCQkJCWZUYXJnZXQtPnRleHRDb2xvcihjYyx2UHJvcCxzRXJyb3IpOwoKCQkJCUNKU19BcnJheSBhUHJvcChpc29sYXRlKTsKCQkJCXZQcm9wLkNvbnZlcnRUb0FycmF5KGFQcm9wKTsKCgkJCQlDUFdMX0NvbG9yIGNyUHJvcDsKCQkJCUNQV0xfQ29sb3IgY3JDb2xvcjsKCQkJCWNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFQcm9wLCBjclByb3ApOwoJCQkJY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJDb2xvciwgY3JDb2xvcik7CgoJCQkJaWYgKGNyQ29sb3IgIT0gY3JQcm9wKQoJCQkJewoJCQkJCUNKU19Qcm9wVmFsdWUgdlByb3AyKGlzb2xhdGUpOwoJCQkJCXZQcm9wMi5TdGFydEdldHRpbmcoKTsKCQkJCQl2UHJvcDI8PGFyQ29sb3I7CgkJCQkJdlByb3AyLlN0YXJ0U2V0dGluZygpOwogICAgIAkJCQlmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsdlByb3AyLHNFcnJvcik7CgkJCQl9CgkJCX0KCQl9Cgl9CglWYWx1ZSA9IHN0clZhbHVlMi5jX3N0cigpOwojZW5kaWYKCXJldHVybiBUUlVFOwp9CgovL2Z1bmN0aW9uIEFGTnVtYmVyX0tleXN0cm9rZShuRGVjLCBzZXBTdHlsZSwgbmVnU3R5bGUsIGN1cnJTdHlsZSwgc3RyQ3VycmVuY3ksIGJDdXJyZW5jeVByZXBlbmQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYocGFyYW1zLnNpemUoKSA8IDIpCgkJcmV0dXJuIEZBTFNFOwoJaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwoKCWlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCgkJaVNlcFN0eWxlID0gMDsKCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCUNGWF9XaWRlU3RyaW5nICYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwoJQ0ZYX1dpZGVTdHJpbmcgJiB3X3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCk7CiAgICBDRlhfV2lkZVN0cmluZyB3X3N0clZhbHVlID0gdmFsOwoKCWlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKCXsKCQlDRlhfV2lkZVN0cmluZyB3c3RyQ2hhbmdlID0gd19zdHJDaGFuZ2U7CgkJQ0ZYX1dpZGVTdHJpbmcgd3N0clZhbHVlID0gU3RyTFRyaW0od19zdHJWYWx1ZS5jX3N0cigpKTsKCQlpZiAod3N0clZhbHVlLklzRW1wdHkoKSkKCQkJcmV0dXJuIFRSVUU7CgoJCUNGWF9XaWRlU3RyaW5nIHN3VGVtcCA9IHdzdHJWYWx1ZTsKCQlzd1RlbXAuUmVwbGFjZShMIiwiLCBMIi4iKTsKCQlpZiAoIUlzTnVtYmVyKHN3VGVtcC5jX3N0cigpKSkKCQl7CgkJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwoJCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSk7CgkJCUFsZXJ0KHBDb250ZXh0LCBzRXJyb3IuY19zdHIoKSk7CgkJCXJldHVybiBUUlVFOwoJCX0KCQlyZXR1cm4gVFJVRTsgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAoJfQoKCXN0ZDo6d3N0cmluZyB3X3N0clZhbHVlMiA9IHdfc3RyVmFsdWUuY19zdHIoKTsKCXN0ZDo6d3N0cmluZyB3X3N0ckNoYW5nZTIgPSB3X3N0ckNoYW5nZS5jX3N0cigpOwoJc3RkOjp3c3RyaW5nIHdfc3RyU2VsZWN0ZWQ7CglpZigtMSAhPSBwRXZlbnQtPlNlbFN0YXJ0KCkpCgkJd19zdHJTZWxlY3RlZCA9IHdfc3RyVmFsdWUyLnN1YnN0cihwRXZlbnQtPlNlbFN0YXJ0KCksKHBFdmVudC0+U2VsRW5kKCkgLSBwRXZlbnQtPlNlbFN0YXJ0KCkpKTsKCUZYX0JPT0wgYkhhc1NpZ24gPSAod19zdHJWYWx1ZTIuZmluZCgnLScpICE9IC0xKSAmJiAod19zdHJTZWxlY3RlZC5maW5kKCctJykgPT0gLTEpOwoJaWYgKGJIYXNTaWduKQoJewoJCS8vY2FuJ3QgaW5zZXJ0ICJjaGFuZ2UiIGluIGZyb250IHRvIHNpZ24gcG9zdGlvbi4KCQlpZiAocEV2ZW50LT5TZWxTdGFydCgpID09IDApCgkJewogICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CgkJCWJSYyA9IEZBTFNFOwoJCQlyZXR1cm4gVFJVRTsKCQl9Cgl9CgoJY2hhciBjU2VwID0gTCcuJzsKCglzd2l0Y2ggKGlTZXBTdHlsZSkKCXsKCWNhc2UgMDoKCWNhc2UgMToKCQljU2VwID0gTCcuJzsKCQlicmVhazsKCWNhc2UgMjoKCWNhc2UgMzoKCQljU2VwID0gTCcsJzsKCQlicmVhazsKCX0KCglGWF9CT09MIGJIYXNTZXAgPSAod19zdHJWYWx1ZTIuZmluZChjU2VwKSAhPSAtMSk7Cglmb3IgKHN0ZDo6d3N0cmluZzo6aXRlcmF0b3IgaXQgPSB3X3N0ckNoYW5nZTIuYmVnaW4oKTsgaXQgIT0gd19zdHJDaGFuZ2UyLmVuZCgpOyBpdCsrKQoJewoJCWlmICgqaXQgPT0gY1NlcCkKCQl7CgkJCWlmIChiSGFzU2VwKQoJCQl7CgkJCQlGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CgkJCQliUmMgPSBGQUxTRTsKCQkJCXJldHVybiBUUlVFOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYkhhc1NlcCA9IFRSVUU7CgkJCQljb250aW51ZTsKCQkJfQoJCX0KCQlpZiAoKml0ID09IEwnLScpCgkJewoJCQlpZiAoYkhhc1NpZ24pCgkJCXsKCQkJCUZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKCQkJCWJSYyA9IEZBTFNFOwoJCQkJcmV0dXJuIFRSVUU7CgkJCX0KCQkJZWxzZSBpZiAoaXQgIT0gd19zdHJDaGFuZ2UyLmJlZ2luKCkpIC8vc2lnbidzIHBvc2l0aW9uIGlzIG5vdCBjb3JyZWN0CgkJCXsKCQkJCUZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKCQkJCWJSYyA9IEZBTFNFOwoJCQkJcmV0dXJuIFRSVUU7CgkJCX0KCQkJZWxzZSBpZiAocEV2ZW50LT5TZWxTdGFydCgpICE9IDApCgkJCXsKCQkJCUZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKCQkJCWJSYyA9IEZBTFNFOwoJCQkJcmV0dXJuIFRSVUU7CgkJCX0KCQkJYkhhc1NpZ24gPSBUUlVFOwoJCQljb250aW51ZTsKCQl9CgoJCWlmICghSXNEaWdpdCgqaXQpKQoJCXsKCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQliUmMgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJfQoKCglzdGQ6OndzdHJpbmcgd19wcmVmaXggPSB3X3N0clZhbHVlMi5zdWJzdHIoMCxwRXZlbnQtPlNlbFN0YXJ0KCkpOwoJc3RkOjp3c3RyaW5nIHdfcG9zdGZpeDsKCWlmIChwRXZlbnQtPlNlbEVuZCgpPChpbnQpd19zdHJWYWx1ZTIubGVuZ3RoKCkpCgkJd19wb3N0Zml4ICA9IHdfc3RyVmFsdWUyLnN1YnN0cihwRXZlbnQtPlNlbEVuZCgpKTsKCXdfc3RyVmFsdWUyID0gd19wcmVmaXggKyB3X3N0ckNoYW5nZTIgKyB3X3Bvc3RmaXg7Cgl3X3N0clZhbHVlID0gd19zdHJWYWx1ZTIuY19zdHIoKTsKCXZhbCA9IHdfc3RyVmFsdWU7CglyZXR1cm4gVFJVRTsKCn0KCi8vZnVuY3Rpb24gQUZQZXJjZW50X0Zvcm1hdChuRGVjLCBzZXBTdHlsZSkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CgoJQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwoJQ0ZYX0J5dGVTdHJpbmcgc3RyVmFsdWUgPSBTdHJUcmltKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOwoJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKCQlyZXR1cm4gVFJVRTsKCglpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludCgpOwoJaWYgKGlEZWMgPCAwKQoJCWlEZWMgPSAtaURlYzsKCglpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CglpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQoJCWlTZXBTdHlsZSA9IDA7CgoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkvL2ZvciBwcm9jZXNzaW5nIGRlY2ltYWwgcGxhY2VzCglkb3VibGUgZFZhbHVlID0gYXRvZihzdHJWYWx1ZSk7CglkVmFsdWUgKj0gMTAwOwoJaWYgKGlEZWMgPiAwKQoJCWRWYWx1ZSArPSBET1VCTEVfQ09SUkVDVDsvL9Cj1f0KCglpbnQgaURlYzI7CglGWF9CT09MIGJOYWdhdGl2ZSA9IEZBTFNFOwoJc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5hZ2F0aXZlKTsKICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgl7CgkJZFZhbHVlID0gMDsKCQlzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLGlEZWMsJmlEZWMyLCZiTmFnYXRpdmUpOwoJfQoKCWlmIChpRGVjMiA8IDApCgl7CgkJZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPCBhYnMoaURlYzIpOyBpTnVtKyspCgkJewoJCQlzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOwoJCX0KCQlpRGVjMiA9IDA7CgoJfQoJaW50IGlNYXggPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKCWlmIChpRGVjMiA+IGlNYXgpCgl7CgkJZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPD0gaURlYzIgLSBpTWF4OyBpTnVtKyspCgkJewoJCQlzdHJWYWx1ZSArPSAiMCI7CgkJfQoJCWlNYXggPSBpRGVjMisxOwoJfQoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy9mb3IgcHJvY2Vzc2luZyBzZXBlcmF0b3Igc3R5bGUKCWlmIChpRGVjMiA8IGlNYXgpCgl7CgkJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKQoJCXsKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLicpOwoJCQlpTWF4Kys7CgkJfQoJCWVsc2UgaWYgKGlTZXBTdHlsZSA9PSAyIHx8IGlTZXBTdHlsZSA9PSAzKQoJCXsKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLCcpOwoJCQlpTWF4Kys7CgkJfQoKCQlpZiAoaURlYzIgPT0gMCkKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwoJfQoJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKQoJewoJCWNoYXIgY1NlcGVyYXRvcjsKCQlpZiAoaVNlcFN0eWxlID09IDApCgkJCWNTZXBlcmF0b3IgPSAnLCc7CgkJZWxzZQoJCQljU2VwZXJhdG9yID0gJy4nOwoKCQlpbnQgaURlY1Bvc2l0aXZlLGlEZWNOYWdhdGl2ZTsKCQlpRGVjUG9zaXRpdmUgPSBpRGVjMjsKCQlpRGVjTmFnYXRpdmUgPSBpRGVjMjsKCgkJZm9yIChpRGVjUG9zaXRpdmUgPSBpRGVjMiAtMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpCgkJewoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlY1Bvc2l0aXZlLGNTZXBlcmF0b3IpOwoJCQlpTWF4Kys7CgkJfQoJfQoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vbmFnYXRpdmUgbWFyawoJaWYoYk5hZ2F0aXZlKQoJCXN0clZhbHVlID0gIi0iICsgc3RyVmFsdWU7CglzdHJWYWx1ZSArPSAiJSI7CglWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOwojZW5kaWYKCXJldHVybiBUUlVFOwp9Ci8vQUZQZXJjZW50X0tleXN0cm9rZShuRGVjLCBzZXBTdHlsZSkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglyZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZEYXRlX0Zvcm1hdEV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCglDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwoJQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUgPSB2YWw7CglpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQoJCXJldHVybiBUUlVFOwoKCUNGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CglGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwoJZG91YmxlIGREYXRlID0gMC4wZjsKCglpZihzdHJWYWx1ZS5GaW5kKEwiR01UIikgIT0gLTEpCgl7CgkJLy9mb3IgR01UIGZvcm1hdCB0aW1lCgkJLy9zdWNoIGFzICJUdWUgQXVnIDExIDE0OjI0OjE2IEdNVCswODAwMjAwOSIKCQlkRGF0ZSA9IE1ha2VJbnRlckRhdGUoc3RyVmFsdWUpOwoJfQoJZWxzZQoJewoJCWREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLHNGb3JtYXQsYldyb25nRm9ybWF0KTsKCX0KCglpZiAoSlNfUG9ydElzTmFuKGREYXRlKSkKCXsKCQlDRlhfV2lkZVN0cmluZyBzd01zZzsKCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksIHNGb3JtYXQuY19zdHIoKSk7CgkJQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwoJCXJldHVybiBGQUxTRTsKCX0KCgl2YWwgPSAgTWFrZUZvcm1hdERhdGUoZERhdGUsc0Zvcm1hdCk7CglyZXR1cm4gVFJVRTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlSW50ZXJEYXRlKENGWF9XaWRlU3RyaW5nIHN0clZhbHVlKQp7CglpbnQgbkhvdXI7CglpbnQgbk1pbjsKCWludCBuU2VjOwoJaW50IG5ZZWFyOwoJaW50IG5Nb250aDsKCWludCBuRGF5OwoKCUNGWF9XaWRlU3RyaW5nQXJyYXkgd3NBcnJheTsKCUNGWF9XaWRlU3RyaW5nIHNNb250aCA9IEwiIjsKCUNGWF9XaWRlU3RyaW5nIHNUZW1wID0gTCIiOwoJaW50IG5TaXplID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CgoJZm9yKGludCBpID0gMDsgaSA8IG5TaXplOyBpKyspCgl7CgkJRlhfV0NIQVIgYyA9IHN0clZhbHVlLkdldEF0KGkpOwoJCWlmKGMgPT0gTCcgJyB8fCBjID09IEwnOicpCgkJewoJCQl3c0FycmF5LkFkZChzVGVtcCk7CgkJCXNUZW1wID0gTCIiOwoJCQljb250aW51ZTsKCQl9CgoJCXNUZW1wICs9IGM7Cgl9CgoJd3NBcnJheS5BZGQoc1RlbXApOwoJaWYod3NBcnJheS5HZXRTaXplKCkgIT0gOClyZXR1cm4gMDsKCglzVGVtcCA9IHdzQXJyYXlbMV07CglpZihzVGVtcC5Db21wYXJlKEwiSmFuIikgPT0gMCkgbk1vbnRoID0gMTsKCWlmKHNUZW1wLkNvbXBhcmUoTCJGZWIiKSA9PSAwKSBuTW9udGggPSAyOwoJaWYoc1RlbXAuQ29tcGFyZShMIk1hciIpID09IDApIG5Nb250aCA9IDM7CglpZihzVGVtcC5Db21wYXJlKEwiQXByIikgPT0gMCkgbk1vbnRoID0gNDsKCWlmKHNUZW1wLkNvbXBhcmUoTCJNYXkiKSA9PSAwKSBuTW9udGggPSA1OwoJaWYoc1RlbXAuQ29tcGFyZShMIkp1biIpID09IDApIG5Nb250aCA9IDY7CglpZihzVGVtcC5Db21wYXJlKEwiSnVsIikgPT0gMCkgbk1vbnRoID0gNzsKCWlmKHNUZW1wLkNvbXBhcmUoTCJBdWciKSA9PSAwKSBuTW9udGggPSA4OwoJaWYoc1RlbXAuQ29tcGFyZShMIlNlcCIpID09IDApIG5Nb250aCA9IDk7CglpZihzVGVtcC5Db21wYXJlKEwiT2N0IikgPT0gMCkgbk1vbnRoID0gMTA7CglpZihzVGVtcC5Db21wYXJlKEwiTm92IikgPT0gMCkgbk1vbnRoID0gMTE7CglpZihzVGVtcC5Db21wYXJlKEwiRGVjIikgPT0gMCkgbk1vbnRoID0gMTI7CgoJbkRheSA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzJdLmNfc3RyKCkpOwoJbkhvdXIgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVszXS5jX3N0cigpKTsKCW5NaW4gPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs0XS5jX3N0cigpKTsKCW5TZWMgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs1XS5jX3N0cigpKTsKCW5ZZWFyID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbN10uY19zdHIoKSk7CgoJZG91YmxlIGRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLG5Nb250aCAtIDEsbkRheSksSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCglpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQoJewoJCWRSZXQgPSBKU19EYXRlUGFyc2Uoc3RyVmFsdWUuY19zdHIoKSk7Cgl9CgoJcmV0dXJuIGRSZXQ7Cn0KCi8vQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKCXsKCQlpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQkJcmV0dXJuIEZBTFNFOwoJCUNGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwoJCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCgkJCXJldHVybiBUUlVFOwoKCQlDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwoJCUZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CgkJZG91YmxlIGRSZXQgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwoJCWlmIChiV3JvbmdGb3JtYXQgfHwgSlNfUG9ydElzTmFuKGRSZXQpKQoJCXsKCQkJQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CgkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKCQkJQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJfQoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKCWNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0gIHtMIm0vZCIsIEwibS9kL3l5IiwgTCJtbS9kZC95eSIsIEwibW0veXkiLCBMImQtbW1tIiwgTCJkLW1tbS15eSIsIEwiZGQtbW1tLXl5IiwKCQlMInl5LW1tLWRkIiwgTCJtbW0teXkiLCBMIm1tbW0teXkiLCBMIm1tbSBkLCB5eXl5IiwgTCJtbW1tIGQsIHl5eXkiLAoJCUwibS9kL3l5IGg6TU0gdHQiLCBMIm0vZC95eSBISDpNTSIgfTsKCglBU1NFUlQoaUluZGV4IDwgRlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7CgoJaWYgKGlJbmRleCA8IDApCgkJaUluZGV4ID0gMDsKCWlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKCQlpSW5kZXggPSAwOwoJQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwoJQ0pTX1ZhbHVlIHZhbChpc29sYXRlLGNGb3JtYXRzW2lJbmRleF0pOwoJbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwoJcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwp9CgovL0FGRGF0ZV9LZXlzdHJva2VFeChjRm9ybWF0KQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CgkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7Cgljb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9ICB7TCJtL2QiLCBMIm0vZC95eSIsIEwibW0vZGQveXkiLCBMIm1tL3l5IiwgTCJkLW1tbSIsIEwiZC1tbW0teXkiLCBMImRkLW1tbS15eSIsCgkJTCJ5eS1tbS1kZCIsIEwibW1tLXl5IiwgTCJtbW1tLXl5IiwgTCJtbW0gZCwgeXl5eSIsIEwibW1tbSBkLCB5eXl5IiwKCQlMIm0vZC95eSBoOk1NIHR0IiwgTCJtL2QveXkgSEg6TU0iIH07CgoJQVNTRVJUKGlJbmRleDxGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKCglpZiAoaUluZGV4IDwgMCkKCQlpSW5kZXggPSAwOwoJaWYgKGlJbmRleCA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKQoJCWlJbmRleCA9IDA7CglDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CglDSlNfVmFsdWUgdmFsKGlzb2xhdGUsY0Zvcm1hdHNbaUluZGV4XSk7CgluZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CglyZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZUaW1lX0Zvcm1hdChwdGYpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwoJY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLCBMImg6TU06c3MgdHQifTsKCglBU1NFUlQoaUluZGV4PEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOwoKCWlmIChpSW5kZXggPCAwKQoJCWlJbmRleCA9IDA7CglpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCgkJaUluZGV4ID0gMDsKCUNKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKCUNKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKCW5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKCXJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CgkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKCWNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wiSEg6TU0iLCBMImg6TU0gdHQiLCBMIkhIOk1NOnNzIiwgTCJoOk1NOnNzIHR0In07CgoJQVNTRVJUKGlJbmRleDxGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKCglpZiAoaUluZGV4IDwgMCkKCQlpSW5kZXggPSAwOwoJaWYgKGlJbmRleCA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKQoJCWlJbmRleCA9IDA7CglDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CglDSlNfVmFsdWUgdmFsKGlzb2xhdGUsY0Zvcm1hdHNbaUluZGV4XSk7CgluZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CglyZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglyZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglyZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZTcGVjaWFsX0Zvcm1hdChwc2YpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglzdGQ6OnN0cmluZyBjRm9ybWF0OwoJaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwoKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwoJc3RkOjpzdHJpbmcgc3RyU3JjID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKS5jX3N0cigpOwoKCXN3aXRjaCAoaUluZGV4KQoJewoJY2FzZSAwOgoJCWNGb3JtYXQgPSAiOTk5OTkiOwoJCWJyZWFrOwoJY2FzZSAxOgoJCWNGb3JtYXQgPSAiOTk5OTktOTk5OSI7CgkJYnJlYWs7CgljYXNlIDI6CgkJewoJCQlzdGQ6OnN0cmluZyBOdW1iZXJTdHI7CgkJCXV0aWw6OnByaW50eCgiOTk5OTk5OTk5OSIsIHN0clNyYyxOdW1iZXJTdHIpOwoJCQlpZiAoTnVtYmVyU3RyLmxlbmd0aCgpID49IDEwICkKCQkJCWNGb3JtYXQgPSAiKDk5OSkgOTk5LTk5OTkiOwoJCQllbHNlCgkJCQljRm9ybWF0ID0gIjk5OS05OTk5IjsKCQkJYnJlYWs7CgkJfQoJY2FzZSAzOgoJCWNGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOwoJCWJyZWFrOwoJfQoKCXN0ZDo6c3RyaW5nIHN0ckRlczsKCXV0aWw6OnByaW50eChjRm9ybWF0LHN0clNyYyxzdHJEZXMpOwoJVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0ckRlcy5jX3N0cigpKTsKCXJldHVybiBUUlVFOwp9CgoKLy9mdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgobWFzaykKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgPCAxKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCUNGWF9XaWRlU3RyaW5nJiB2YWxFdmVudCA9IHBFdmVudC0+VmFsdWUoKTsKCglDRlhfV2lkZVN0cmluZyB3c3RyTWFzayA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCWlmICh3c3RyTWFzay5Jc0VtcHR5KCkpCgkJcmV0dXJuIFRSVUU7CgoJc3RkOjp3c3RyaW5nIHdzdHJWYWx1ZSA9IHZhbEV2ZW50LmNfc3RyKCk7CgoJaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQoJewoJCWlmICh3c3RyVmFsdWUuZW1wdHkoKSkKCQkJcmV0dXJuIFRSVUU7CgkJaW50IGlJbmRleE1hc2sgPSAwOwoJCWZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdzdHJWYWx1ZS5iZWdpbigpOyBpdCAhPSB3c3RyVmFsdWUuZW5kKCk7IGl0KyspCgkJewoJCQl3Y2hhcl90IHdfVmFsdWUgPSAqaXQ7CgkJCWlmICghbWFza1NhdGlzZmllZCh3X1ZhbHVlLHdzdHJNYXNrW2lJbmRleE1hc2tdKSkKCQkJCWJyZWFrOwoJCQlpSW5kZXhNYXNrKys7CgkJfQoKCQlpZiAoaUluZGV4TWFzayAhPSB3c3RyTWFzay5HZXRMZW5ndGgoKSB8fCAoaUluZGV4TWFzayAhPSB3c3RyVmFsdWUuc2l6ZSgpICYmIHdzdHJNYXNrLkdldExlbmd0aCgpICE9IDApKQoJCXsKCQkJQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKS5jX3N0cigpKTsKCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJfQoJCXJldHVybiBUUlVFOwoJfQoKCUNGWF9XaWRlU3RyaW5nICZ3aWRlQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKCXN0ZDo6d3N0cmluZyB3Q2hhbmdlID0gd2lkZUNoYW5nZS5jX3N0cigpOwoJaWYgKHdDaGFuZ2UuZW1wdHkoKSkKCQlyZXR1cm4gVFJVRTsKCglpbnQgaUluZGV4TWFzayA9IHBFdmVudC0+U2VsU3RhcnQoKTsKCglpZiAod3N0clZhbHVlLmxlbmd0aCgpIC0gKHBFdmVudC0+U2VsRW5kKCktcEV2ZW50LT5TZWxTdGFydCgpKSArIHdDaGFuZ2UubGVuZ3RoKCkgPiAoRlhfRFdPUkQpd3N0ck1hc2suR2V0TGVuZ3RoKCkpCgl7CgkJQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7CgkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJcmV0dXJuIFRSVUU7Cgl9CgoJaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgJiYgKCF3Q2hhbmdlLmVtcHR5KCkpKQoJewoJCUFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwoJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwoJCXJldHVybiBUUlVFOwoJfQoKCWZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdDaGFuZ2UuYmVnaW4oKTsgaXQgIT0gd0NoYW5nZS5lbmQoKTsgaXQrKykKCXsKCQlpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSkKCQl7CgkJCUFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJCXdjaGFyX3Qgd19NYXNrID0gd3N0ck1hc2tbaUluZGV4TWFza107CgkJaWYgKCFpc1Jlc2VydmVkTWFza0NoYXIod19NYXNrKSkKCQl7CgkJCSppdCA9IHdfTWFzazsKCQl9CgkJd2NoYXJfdCB3X0NoYW5nZSA9ICppdDsKCQlpZiAoIW1hc2tTYXRpc2ZpZWQod19DaGFuZ2Usd19NYXNrKSkKCQl7CgkJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwoJCQlyZXR1cm4gVFJVRTsKCQl9CgkJaUluZGV4TWFzaysrOwoJfQoKCXdpZGVDaGFuZ2UgPSB3Q2hhbmdlLmNfc3RyKCk7CglyZXR1cm4gVFJVRTsKfQoKCi8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZShwc2YpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCXN0ZDo6c3RyaW5nIGNGb3JtYXQ7CglpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CgoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJLy9DSlNfVmFsdWUgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwoJQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKCXN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh2YWwpLmNfc3RyKCk7CglzdGQ6OndzdHJpbmcgd3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCkuY19zdHIoKTsKCglzd2l0Y2ggKGlJbmRleCkKCXsKCWNhc2UgMDoKCQljRm9ybWF0ID0gIjk5OTk5IjsKCQlicmVhazsKCWNhc2UgMToKCQkvL2NGb3JtYXQgPSAiOTk5OTktOTk5OSI7CgkJY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwoJCWJyZWFrOwoJY2FzZSAyOgoJCXsKCQkJc3RkOjpzdHJpbmcgTnVtYmVyU3RyOwoJCQl1dGlsOjpwcmludHgoIjk5OTk5OTk5OTkiLCBzdHJTcmMsTnVtYmVyU3RyKTsKCQkJaWYgKHN0clNyYy5sZW5ndGgoKSArIHdzdHJDaGFuZ2UubGVuZ3RoKCkgPiA3ICkKCQkJCS8vY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7CgkJCQljRm9ybWF0ID0gIjk5OTk5OTk5OTkiOwoJCQllbHNlCgkJCQkvL2NGb3JtYXQgPSAiOTk5LTk5OTkiOwoJCQkJY0Zvcm1hdCA9ICI5OTk5OTk5IjsKCQkJYnJlYWs7CgkJfQoJY2FzZSAzOgoJCS8vY0Zvcm1hdCA9ICI5OTktOTktOTk5OSI7CgkJY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwoJCWJyZWFrOwoJfQoKCUNKU19QYXJhbWV0ZXJzIHBhcmFtczI7CglDSlNfVmFsdWUgdk1hc2soaXNvbGF0ZSwgY0Zvcm1hdC5jX3N0cigpKTsKCXBhcmFtczIucHVzaF9iYWNrKHZNYXNrKTsKCiAgICByZXR1cm4gQUZTcGVjaWFsX0tleXN0cm9rZUV4KGNjLHBhcmFtczIsdlJldCxzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1lcmdlQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50SGFuZGxlciA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnRIYW5kbGVyICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZTsKCWlmIChwRXZlbnRIYW5kbGVyLT5tX3BWYWx1ZSAhPSBOVUxMKQoJCXN3VmFsdWUgPSBwRXZlbnRIYW5kbGVyLT5WYWx1ZSgpOwoKCWlmIChwRXZlbnRIYW5kbGVyLT5XaWxsQ29tbWl0KCkpCgl7CgkJdlJldCA9IHN3VmFsdWUuY19zdHIoKTsKCQlyZXR1cm4gVFJVRTsKCX0KCglDRlhfV2lkZVN0cmluZyBwcmVmaXgscG9zdGZpeDsKCglpZiAocEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSA+PSAwKQoJCXByZWZpeCA9IHN3VmFsdWUuTWlkKDAscEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSk7CgllbHNlCgkJcHJlZml4ID0gTCIiOwoKCglpZiAocEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPj0gMCAmJiBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA8PSBzd1ZhbHVlLkdldExlbmd0aCgpKQoJCXBvc3RmaXggPSBzd1ZhbHVlLk1pZChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSwgc3dWYWx1ZS5HZXRMZW5ndGgoKSAtIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpKTsKCWVsc2UgcG9zdGZpeCA9IEwiIjsKCgl2UmV0ID0gKHByZWZpeCArIHBFdmVudEhhbmRsZXItPkNoYW5nZSgpICsgcG9zdGZpeCkuY19zdHIoKTsKCglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAyKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCUNGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7CgoJRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKCWRvdWJsZSBkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwoKCWlmIChKU19Qb3J0SXNOYW4oZERhdGUpKQoJewoJCUNGWF9XaWRlU3RyaW5nIHN3TXNnOwoJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKCQlBbGVydCgoQ0pTX0NvbnRleHQgKiljYywgc3dNc2cuY19zdHIoKSk7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCXZSZXQgPSBkRGF0ZTsKCXJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglpZiAocGFyYW1zLnNpemUoKSAhPSAzKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJdlJldCA9IChkb3VibGUpQUZfU2ltcGxlKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLCBwYXJhbXNbMV0uVG9Eb3VibGUoKSwgcGFyYW1zWzJdLlRvRG91YmxlKCkpOwoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWFrZU51bWJlcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9Cgl2UmV0ID0gUGFyc2VTdHJpbmdUb051bWJlcihwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAyKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNKU19WYWx1ZSBwYXJhbXMxID0gcGFyYW1zWzFdOwoKCWlmICghcGFyYW1zMS5Jc0FycmF5T2JqZWN0KCkgJiYgcGFyYW1zMS5HZXRUeXBlKCkgIT0gVlRfc3RyaW5nKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKICAgIEFTU0VSVChwUmVhZGVyRG9jICE9IE5VTEwpOwoKCUNQREZTREtfSW50ZXJGb3JtKiBwUmVhZGVySW50ZXJGb3JtID0gcFJlYWRlckRvYy0+R2V0SW50ZXJGb3JtKCk7CglBU1NFUlQocFJlYWRlckludGVyRm9ybSAhPSBOVUxMKTsKCglDUERGX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBSZWFkZXJJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwoJQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CgoJZG91YmxlIGRWYWx1ZTsKCUNGWF9XaWRlU3RyaW5nIHNGdW5jdGlvbiA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCWlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiUFJEIikgPT0gMCkKICAgIAlkVmFsdWUgPSAxLjA7CgllbHNlCgkJZFZhbHVlID0gMC4wOwoKCUNKU19BcnJheSBGaWVsZE5hbWVBcnJheSA9IEFGX01ha2VBcnJheUZyb21MaXN0KGlzb2xhdGUscGFyYW1zMSk7CgoJaW50IG5GaWVsZHNDb3VudCA9IDA7CgoJZm9yIChpbnQgaT0wLGlzej1GaWVsZE5hbWVBcnJheS5HZXRMZW5ndGgoKTsgaTxpc3o7IGkrKykKCXsKCQlDSlNfVmFsdWUganNWYWx1ZShpc29sYXRlKTsKCQlGaWVsZE5hbWVBcnJheS5HZXRFbGVtZW50KGksanNWYWx1ZSk7CgkJQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZE5hbWUgPSBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpOwoKICAgICAgICBmb3IgKGludCBqPTAsanN6PXBJbnRlckZvcm0tPkNvdW50RmllbGRzKHdzRmllbGROYW1lKTsgajxqc3o7IGorKykKCQl7CgkJCWlmIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBJbnRlckZvcm0tPkdldEZpZWxkKGosIHdzRmllbGROYW1lKSkKCQkJewoJCQkJZG91YmxlIGRUZW1wID0gMC4wOwoKCQkJCXN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpCgkJCQl7CgkJCQljYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CgkJCQljYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKCQkJCQl7CgkJCQkJCWRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQljYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgoJCQkJCXsKCQkJCQkJZFRlbXAgPSAwLjA7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCWNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgoJCQkJY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CgkJCQkJewoJCQkJCQlkVGVtcCA9IDAuMDsKCQkJCQkJZm9yIChpbnQgYz0wLGNzej1wRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGM8Y3N6OyBjKyspCgkJCQkJCXsKCQkJCQkJCWlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGMpKQoJCQkJCQkJewoJCQkJCQkJCWlmIChwRm9ybUN0cmwtPklzQ2hlY2tlZCgpKQoJCQkJCQkJCXsKCQkJCQkJCQkJZFRlbXAgKz0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUN0cmwtPkdldEV4cG9ydFZhbHVlKCkuY19zdHIoKSk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCWNhc2UgRklFTERUWVBFX0xJU1RCT1g6CgkJCQkJewoJCQkJCQlkVGVtcCA9IDAuMDsKCQkJCQkJaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKCQkJCQkJCWJyZWFrOwoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQlkZWZhdWx0OgoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmIChpID09IDAgJiYgaiA9PSAwICYmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUlOIikgPT0gMCB8fCB3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUFYIikgPT0gMCkpCgkJCQkJZFZhbHVlID0gZFRlbXA7CgoJCQkJZFZhbHVlID0gQUZfU2ltcGxlKHNGdW5jdGlvbi5jX3N0cigpLCBkVmFsdWUsIGRUZW1wKTsKCgkJCQluRmllbGRzQ291bnQrKzsKCQkJfQoJCX0KCX0KCglpZiAod2NzY21wKHNGdW5jdGlvbi5jX3N0cigpLCBMIkFWRyIpID09IDAgJiYgbkZpZWxkc0NvdW50ID4gMCkKCQlkVmFsdWUgLz0gbkZpZWxkc0NvdW50OwoKCWRWYWx1ZSA9IChkb3VibGUpZmxvb3IoZFZhbHVlICogRlhTWVNfcG93KChkb3VibGUpMTAsKGRvdWJsZSk2KSArIDAuNDkpIC8gRlhTWVNfcG93KChkb3VibGUpMTAsKGRvdWJsZSk2KTsKCUNKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUsZFZhbHVlKTsKCWlmKChDSlNfRXZlbnRIYW5kbGVyKilwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCktPm1fcFZhbHVlKQoJCSgoQ0pTX0V2ZW50SGFuZGxlciopcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpKS0+VmFsdWUoKSA9IGpzVmFsdWUuVG9DRlhXaWRlU3RyaW5nKCk7CgoJcmV0dXJuIFRSVUU7Cn0KCi8qIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIHRoZSBjdXJyZW50IGV2ZW50IHRvIGVuc3VyZSB0aGF0IGl0cyB2YWx1ZSBpcwoqKiB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZS4gKi8KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUmFuZ2VfVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDQpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJaWYgKHBFdmVudC0+VmFsdWUoKS5Jc0VtcHR5KCkgKQoJCXJldHVybiBUUlVFOwoJZG91YmxlIGRFZW50VmFsdWUgPSBhdG9mKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwRXZlbnQtPlZhbHVlKCkpKTsKCUZYX0JPT0wgYkdyZWF0ZXJUaGFuID0gcGFyYW1zWzBdLlRvQm9vbCgpOwoJZG91YmxlIGRHcmVhdGVyVGhhbiA9IHBhcmFtc1sxXS5Ub0RvdWJsZSgpOwoJRlhfQk9PTCBiTGVzc1RoYW4gPSBwYXJhbXNbMl0uVG9Cb29sKCk7Cglkb3VibGUgZExlc3NUaGFuID0gcGFyYW1zWzNdLlRvRG91YmxlKCk7CglDRlhfV2lkZVN0cmluZyBzd01zZzsKCglpZiAoYkdyZWF0ZXJUaGFuICYmIGJMZXNzVGhhbikKCXsKCQlpZiAoZEVlbnRWYWx1ZSA8IGRHcmVhdGVyVGhhbiB8fCBkRWVudFZhbHVlID4gZExlc3NUaGFuKQoJCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTEpLmNfc3RyKCksCgkJCQkJCSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSwKCQkJCQkJIHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKCX0KCWVsc2UgaWYgKGJHcmVhdGVyVGhhbikKCXsKCQlpZiAoZEVlbnRWYWx1ZSA8IGRHcmVhdGVyVGhhbikKCQkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkFOR0UyKS5jX3N0cigpLAoJCQkJCQkgcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwoJfQoJZWxzZSBpZiAoYkxlc3NUaGFuKQoJewoJCWlmIChkRWVudFZhbHVlID4gZExlc3NUaGFuKQoJCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTMpLmNfc3RyKCksCgkJCQkJCSBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7Cgl9CgoJaWYgKCFzd01zZy5Jc0VtcHR5KCkpCgl7CgkJQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwoJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwoJfQoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNKU19BcnJheSBudW1zKGlzb2xhdGUpOwoKCUNGWF9XaWRlU3RyaW5nIHN0ciA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCUNGWF9XaWRlU3RyaW5nIHNQYXJ0OwoKCWlmIChzdHIuR2V0QXQoMCkgPT0gTCcuJyB8fCBzdHIuR2V0QXQoMCkgPT0gTCcsJykKCQlzdHIgPSBMIjAiICsgc3RyOwoKCWludCBuSW5kZXggPSAwOwoJZm9yIChpbnQgaT0wLCBzej1zdHIuR2V0TGVuZ3RoKCk7IGk8c3o7IGkrKykKCXsKCQlGWF9XQ0hBUiB3YyA9IHN0ci5HZXRBdChpKTsKCQlpZiAoSXNEaWdpdCgod2NoYXJfdCl3YykpCgkJewoJCQlzUGFydCArPSB3YzsKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkKCQkJewoJCQkJbnVtcy5TZXRFbGVtZW50KG5JbmRleCxDSlNfVmFsdWUoaXNvbGF0ZSxzUGFydC5jX3N0cigpKSk7CgkJCQlzUGFydCA9IEwiIjsKCQkJCW5JbmRleCArKzsKCQkJfQoJCX0KCX0KCglpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKQoJewoJCW51bXMuU2V0RWxlbWVudChuSW5kZXgsQ0pTX1ZhbHVlKGlzb2xhdGUsc1BhcnQuY19zdHIoKSkpOwoJfQoKCWlmIChudW1zLkdldExlbmd0aCgpID4gMCkKCQl2UmV0ID0gbnVtczsKCWVsc2UKCQl2UmV0LlNldE51bGwoKTsKCglyZXR1cm4gVFJVRTsKfQo=