I3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKI3ByYWdtYSBub19pbmhlcml0LCBub19jbG9uZSwgbm9fc2hhZG93CgojaW5jbHVkZSA8ZGVmaW5lcy5oPgojaW5jbHVkZSA8cHJvcGVydGllcy5oPgojaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CiNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci9rcmFldXRlci5oPgojaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIvdHJhbmthdHRyaWJ1dGUuaD4KI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CgoKI2lmbmRlZiBCUwojZGVmaW5lIEJTKHgpICAgICAgICAgICAgIGJyZWFrX3N0cmluZyh4LCA3OCkKI2VuZGlmCgovLyBXZWl0ZXIgdW50ZW4gYmVpbSBQYXJzZW4gZGVzIERhdGVuZmlsZXMgd2VyZGVuIFNldFByb3AoKSB1bmQgTmFtZSgpCi8vIHZlcndlbmRldCwgZGFoZXIgZXJiZW4gd2lyIHRoaW5nLgppbmhlcml0ICIvc3RkL3NlY3VyZV90aGluZyI7CgovLyBMaXN0ZSBhbGxlciBtb2VnbGljaGVuIFp1dGF0ZW4sIGdlbWFwcHQgdWViZXIgZWluZW4ga2V5Ci8vIEFOOiBpcnJpdGllcmVuZGVyIE5hbWUsIGRlbm4gZXMgc2luZCBuaWNodCBkaXJla3QgZGllIFp1dGF0ZW4gZW50aGFsdGVuCi8vIHNvbmRlcm4gZGllIHVlYmVyIGVpbmVuIEtleSBpZGVudGlmaXppZXJ0ZW4gS3JhZXV0ZXJncnVwcGVuLCBkaWUgZGllCi8vIFdpcmt1bmdlbi9GdW5rdGlvbmVuIGZlc3RsZWdlbi4KLy8gRm9ybWF0OgovLyAoWyBrZXkgOiAoeyBhdHRyX3BvcywgYXR0cl9uZWcxLCBhdHRyX25lZzIsIEhhbHRiYXJrLiwgV2lya2RhdWVyLCAKLy8gICAgICAgICAgICAgVW50ZXJzdHVldHp1bmcsIFN0b2VydW5nLCBIYWV1Zmlna2VpdCAgfSkgXSkKLy8gQmVpc3BpZWw6IFsoICJhNyI6KHsoezIsNDAwfSksKHsxMSwxNTB9KSwwLDE3MjgwMCwwLCh7Im4qIn0pLDAsMX0pIF0pCi8vIEhVOiBXYXIgZWluIE1hcHBpbmcsIGJsZWlidCBlaW4gTWFwcGluZywgdW5kIG5ldTogRGllIEVpbnRyYWVnZSB3ZXJkZW4gCi8vIGF1Y2ggTWFwcGluZ3MhCnByaXZhdGUgbWFwcGluZyBpbmdyZWRpZW50czsKCi8vIE1hcHBpbmcgdm9uIGlkIHp1bSBLZXkgZGVyIFp1dGF0ZW4gaW0gaW5ncmVkaWVudHMtbWFwcGluZzogaWQya2V5W2lkXT1rZXkKLy8gRGllIGJlaWRlbiBMaXN0ZW4gd2VyZGVuIGJlbm9ldGlndCwgdW0genUgZGVuIEtyYXV0LUlEcyBkaWUgamV3ZWlsaWdlbgovLyBLZXlzIHp1IGZpbmRlbi4KLy8gSFU6IEtFSU4gTUFQUElORy4gRWluIEFycmF5IHZvbiBTdHJpbmdzLiBBYmVyIGRhcyBnZWh0IG5hdHVlcmxpY2guCnByaXZhdGUgc3RyaW5nICppZDJrZXk7CgovLyBNYXBwaW5nIHZvbiBrZXkgenUgS3JhZXV0ZXItSUQgZGVyIFp1dGF0ZW4uCnByaXZhdGUgbWFwcGluZyBrZXkyaWQ7CgovLyBFaWdlbnNjaGFmdGVuIGRlciBLcmFldXRlcjoKLy8ga3JhdXRwcm9wc1tpZF09KHtJRCwgRGVtb24sIEdlbmRlciwgTmFtZSwgQWRqZWt0aXYoZSksIFBfTE9ORywgUmF1bWRldGFpbH0pCi8vIGtyYXV0cHJvcHNbMF0gPSAwOyBJRCAwIGRhcmYgbmljaHQgZXhpc3RpZXJlbgpwcml2YXRlIG1peGVkICprcmF1dHByb3BzOwoKLy8gaGllciB3aXJkIGdlc3BlaWNoZXJ0IHdlbGNoZSBWZXJzaW9uIGVpbmVyIFp1dGF0IGZ1ZXIgZWluZW4gU3BpZWxlciBpc3QuCi8vIEFOL1RPRE86IFdlbm4gZGFzIGZ1ZXIgTmljaHRzZWhlciBudXR6YmFyIHNlaW4gc29sbCwgc29sbHRlIGhpZXIgYmVzc2VyCi8vIG1pdCBnZXR1dWlkKCkgZ2VhcmJlaXRldCB3ZXJkZW4sIHN0YXR0IGdldHVpZCgpIHp1IHZlcndlbmRlbi4KLy8gcGxheWVyIGVudGhhZWx0IGZ1ZXIgamVkZSBTcGllbGVyLVVJRCBlaW5lbiBCaXRzdHJpbmcuIEdlc2V0enRlcyBCaXQKLy8gYmVkZXV0ZXQsIGRhc3MgZGVyIFNwaWVsZXIgdWViZXIgZGFzIEtyYXV0IG1pdCBkaWVzZXIgSUQgZXR3YXMgdWViZXIKLy8gZGllIFZlcndlbmR1bmcgdW5kIFdpcmt1bmcgd2Vpc3MuIEVzIGdpYnQgamVkb2NoIG5vY2gga2VpbmUgTGVybm1vZWdsaWNoLQovLyBrZWl0IHVuZCBJTlNCRVNPTkRFUkUga2VpbmUgRnVua3Rpb25hbGl0YWV0IGltIE1hc3RlciwgdWViZXIgZGllIG1hbiAKLy8gZGllIEJpdHMgc2V0emVuIGtvZW5udGUuCnByaXZhdGUgbWFwcGluZyBwbGF5ZXI7CgovLyB2ZXJzdHVlbW1lbHRlcyBtYXBwaW5nIGZ1ZXIgZGVuIFZDIGluIHNlcnZpY2UgKFNhdmUtRHVtbXkpCnByaXZhdGUgbWFwcGluZyBtYXBfbGRmaWVkOwoKLy8gcm9vbXMgZW50aGFlbHQgZGllIFRlaWxlaW50cmFlZ2UgZGVzIG1hcF9sZGZpZWQgbWFwcGluZyB2b20gVkMKcHJpdmF0ZSBtYXBwaW5nIHJvb21zOwoKLy8gRW50aGFlbHQgRGF0ZW4genUgZGVuIFJhZXVtZW4sIGluIGRlbmVuIGRhcyBUcm9ja25lbiB2b24gS3JhZXV0ZXJuCi8vIG1vZWdsaWNoIGlzdC4KcHJpdmF0ZSBtYXBwaW5nIGRyeWluZ19kYXRhID0gKFs6NF0pOwoKc3RyaW5nIGJ1aWxkX3BsYW50bmFtZShtaXhlZCAqcHJvcHMpOwoKLy8gc3RydWN0LVRlbXBsYXQgZnVlciBUcmFua2F0dHJpYnV0ZQovLyBGdWVyIGRhcyBTUUwtTG9nIE1VU1MgZGllIFJlaWhlbmZvbGdlIGRlciBUcmFua2F0dHJpYnV0ZSBoaWVyIGdlbmF1IGRpZQovLyBzZWluLCB3aWUgZGllIFNwYWx0ZW4gaW4gZGVyIFRhYmVsbGUuCi8qIEN1cnJlbnRseSBub3QgdXNlZC4Kc3RydWN0IHRyYW5rX2F0dHJpYl9zIHsKICAgIGludCBjYXI7CiAgICBpbnQgZGE7CiAgICBpbnQgZG07CiAgICBpbnQgZHU7CiAgICBpbnQgZG47CiAgICBpbnQgZmx0OwogICAgaW50IGZybzsKICAgIGludCBoSTsKICAgIGludCBoUDsKICAgIGludCBoSzsKICAgIGludCBoTDsKICAgIGludCBwYTsKICAgIGludCBwbTsKICAgIGludCBwdTsKICAgIGludCBzczsKICAgIGludCBzcDsKICAgIGludCBzZDsKfTsKKi8KCiNkZWZpbmUgYWxsb3dlZCgpICghcHJvY2Vzc19jYWxsKCkgJiYgXAogICAgICAgIElTX0FSQ0goUlBMKSAmJiBJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkgKQoKI2RlZmluZSBQT1RJT05GSUxFUyAoeyBUUkFOS0lURU0gfSkKCi8vIGVpZ2Vuc2NoYWZ0ZW4gaW0ga3JhdXRwcm9wcy1hcnJheQojZGVmaW5lIFBST1BfSUQgICAgICAgICAgIElOR1JFRElFTlRfSUQKI2RlZmluZSBQUk9QX0RFTU9OICAgICAgICBJTkdSRURJRU5UX0RFTU9OCiNkZWZpbmUgUFJPUF9HRU5ERVIgICAgICAgSU5HUkVESUVOVF9HRU5ERVIKI2RlZmluZSBQUk9QX05BTUUgICAgICAgICBJTkdSRURJRU5UX05BTUUKI2RlZmluZSBQUk9QX0FESiAgICAgICAgICBJTkdSRURJRU5UX0FESgojZGVmaW5lIFBST1BfTE9ORyAgICAgICAgIElOR1JFRElFTlRfTE9ORwojZGVmaW5lIFBST1BfUk9PTURFVEFJTCAgIElOR1JFRElFTlRfUk9PTURFVEFJTAoKLy8gQVRUUl8gaXMgaW1tZXIgZWluIGFycmF5ICh7IGF0dHJpYnV0LCBhYmlsaXR5IH0pCiNkZWZpbmUgQVRUUl9BUlJfQVRUUklCICAgICAgMAojZGVmaW5lIEFUVFJfQVJSX0FCSUxJVFkgICAgIDEKCi8vIG1heGltYWwgZXJsYXVidGVyIFdlcnQgZnVlciBlaW5lIEVpZ2Vuc2NoYWZ0CiNkZWZpbmUgTUFYX0FUVFJfQUJJTElUWSAgICAgIDk5OQoKdm9pZCBkZWJ1ZyhzdHJpbmcgc3RyKQp7CiAgLy93cml0ZSgiZGVidWc6ICIrc3RyKyJcbiIpOwogIGlmICh0aGlzX3BsYXllcigpICYmIElTX0FSQ0godGhpc19wbGF5ZXIoKSkpCiAgICB0aGlzX3BsYXllcigpLT5SZWNlaXZlTXNnKHN0ciw1MzY4NzA5MTIpOwp9Cgpwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQp7CiAgIHNldGV1aWQoZ2V0dWlkKCkpOwogICAvLyBBTi9UT0RPOiBWYXJpYWJsZW4gb2JlbiBkaXJla3QgaW5pdGlhbGlzaWVyZW4uIFBydWVmZW4sIG9iIGRhdm9uCiAgIC8vIGlyZ2VuZHdhcyBub3NhdmUgc2VpbiBrYW5uLgogICBpZiAoIXJlc3RvcmVfb2JqZWN0KF9fRElSX18iL0FSQ0gva3JhdXRtYXN0ZXIiKSkKICAgewogICAgICBpbmdyZWRpZW50cz0oW10pOwogICAgICBpZDJrZXk9KHt9KTsKICAgICAga2V5MmlkPShbXSk7CiAgICAgIGtyYXV0cHJvcHM9KHt9KTsKICAgICAgcGxheWVyPShbXSk7CiAgICAgIG1hcF9sZGZpZWQ9KFtdKTsKICAgICAgcm9vbXM9KFtdKTsKICAgfQogICBpZiAoc2xfb3BlbigiL2xvZy9BUkNIL2tyYXV0dHJhbmsuc3FsaXRlIikgIT0gMSkKICAgewogICAgIHJhaXNlX2Vycm9yKCJEYXRlbmJhbmsga29ubnRlIG5pY2h0IGdlb2VmZm5ldCB3ZXJkZW4uXG4iKTsKICAgfQogICBzbF9leGVjKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB0cmFlbmtlKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksICIKICAgICAgICAgICAidWlkIFRFWFQgTk9UIE5VTEwsIHJuZCBJTlRFR0VSLCAiCiAgICAgICAgICAgInRpbWUgSU5URUdFUiBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QLCAiCiAgICAgICAgICAgInJlY2VpcGUgVEVYVCBOT1QgTlVMTCwgIgogICAgICAgICAgICJxdWFsaXR5IFRFWFQgTk9UIE5VTEwsICIKICAgICAgICAgICAiY2FyIElOVEVHRVIsICIKICAgICAgICAgICAiZGEgSU5URUdFUiwgIgogICAgICAgICAgICJkbSBJTlRFR0VSLCAiCiAgICAgICAgICAgImR1IElOVEVHRVIsICIKICAgICAgICAgICAiZG4gSU5URUdFUiwgIgogICAgICAgICAgICJmbHQgSU5URUdFUiwgIgogICAgICAgICAgICJmcm8gSU5URUdFUiwgIgogICAgICAgICAgICJoSSBJTlRFR0VSLCAiCiAgICAgICAgICAgImhQIElOVEVHRVIsICIKICAgICAgICAgICAiaEsgSU5URUdFUiwgIgogICAgICAgICAgICJoTCBJTlRFR0VSLCAiCiAgICAgICAgICAgInBhIElOVEVHRVIsICIKICAgICAgICAgICAicG0gSU5URUdFUiwgIgogICAgICAgICAgICJwdSBJTlRFR0VSLCAiCiAgICAgICAgICAgInNzIElOVEVHRVIsICIKICAgICAgICAgICAic3AgSU5URUdFUiwgIgogICAgICAgICAgICJzZCBJTlRFR0VSKTsiCiAgICAgICAgICAgKTsKICAgc2xfZXhlYygiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3VpZCBPTiB0cmFlbmtlKHVpZCk7Iik7CiAgIHNsX2V4ZWMoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9yZWNlaXBlIE9OIHRyYWVua2UocmVjZWlwZSk7Iik7CiAgIHNsX2V4ZWMoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHJvaGRhdGVuKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksICIKICAgICAgICAgICAidWlkIFRFWFQgTk9UIE5VTEwsIHJuZCBJTlRFR0VSLCAiCiAgICAgICAgICAgInRpbWUgSU5URUdFUiBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QLCAiCiAgICAgICAgICAgInJlY2VpcGUgVEVYVCBOT1QgTlVMTCwgIgogICAgICAgICAgICJxdWFsaXR5IFRFWFQgTk9UIE5VTEwsICIKICAgICAgICAgICAiY2FyIElOVEVHRVIsICIKICAgICAgICAgICAiZGEgSU5URUdFUiwgIgogICAgICAgICAgICJkbSBJTlRFR0VSLCAiCiAgICAgICAgICAgImR1IElOVEVHRVIsICIKICAgICAgICAgICAiZG4gSU5URUdFUiwgIgogICAgICAgICAgICJmbHQgSU5URUdFUiwgIgogICAgICAgICAgICJmcm8gSU5URUdFUiwgIgogICAgICAgICAgICJoSSBJTlRFR0VSLCAiCiAgICAgICAgICAgImhQIElOVEVHRVIsICIKICAgICAgICAgICAiaEsgSU5URUdFUiwgIgogICAgICAgICAgICJoTCBJTlRFR0VSLCAiCiAgICAgICAgICAgInBhIElOVEVHRVIsICIKICAgICAgICAgICAicG0gSU5URUdFUiwgIgogICAgICAgICAgICJwdSBJTlRFR0VSLCAiCiAgICAgICAgICAgInNzIElOVEVHRVIsICIKICAgICAgICAgICAic3AgSU5URUdFUiwgIgogICAgICAgICAgICJzZCBJTlRFR0VSKTsiCiAgICAgICAgICAgKTsKICAgc2xfZXhlYygiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3VpZF9yIE9OIHJvaGRhdGVuKHVpZCk7Iik7Cn0KCnB1YmxpYyBzdHJpbmcgUXVlcnlQbGFudEZpbGUoaW50IGlkKQp7CiAgaWYgKG1lbWJlcihrcmF1dHByb3BzLCBpZCkpCiAgICByZXR1cm4gYnVpbGRfcGxhbnRuYW1lKGtyYXV0cHJvcHNbaWRdKTsKICByZXR1cm4gMDsKfQoKLy8gQU46IEZ1bmt0aW9uIGVybWl0dGVsdCwgb2IgZWluIFNwaWVsZXIgcGwgZGFzIEtyYXV0IG1pdCBkZXIgSUQgaWQKLy8gdmVyd2VuZGVuIGthbm4uIExhdXQgS29tbWVudGFyIHVudGVuIG11c3MgbWFuIGRhZnVlciB3b2hsIHdhcyB1ZWJlciBkYXMKLy8gS3JhdXQgZ2VsZXJudCBoYWJlbiwgdm9uIHdlbSBpc3QgbWlyIGdlcmFkZSBub2NoIG5pY2h0IGtsYXIuCi8vIEFOL1RPRE86IEVzIGlzdCBiaXNoZXIga2VpbmUgRnVua3Rpb25hbGl0YWV0IHZvcmhhbmRlbiwgdW0gZGllIElEcyBmdWVyCi8vIGRlbiBTcGllbGVyIGZyZWl6dXNjaGFsdGVuLiBEaWUgRnVua3Rpb25zd2Vpc2UgbXVzcyBhdXMgZGVtIEJlaXNwaWVsY29kZQovLyB1bnRlbiBmdWVyIGRhcyBMZWFybi1Pbi1EZW1hbmQgYWJnZWxlc2VuIHdlcmRlbi4Kbm9tYXNrIGludCBDYW5Vc2VJbmdyZWRpZW50KG9iamVjdCBwbCwgaW50IGlkKQp7CiAgLy8gSWNoIG1hY2ggbWFsIGRlbiBoYXJ0ZW4gV2VnLiAtLSBIdW1uaQogIHJldHVybiAxOwogIC8vIEJpdHN0cmluZyBkZXMgU3BpZWxlcnMgYXVzIGRlciBMaXN0ZSBhdXNsZXNlbi4KICAgc3RyaW5nIHN0cj1wbGF5ZXJbZ2V0dWlkKHBsKV07CiAgIGlmICghc3RyaW5ncChzdHIpKSBzdHI9IiI7CiAgIGlmICh0ZXN0X2JpdChzdHIsIGlkKSkKICAgICAgcmV0dXJuIDE7IC8vIG1ha2UgdGhlIGNvbW1vbiBjYXNlIGZhc3QKICAgZWxzZSB7CiAgICAgLy8gbGV0enRlbmVuZGVzIGhhYmUgaWNoIG1pY2ggZW50c2NobG9zc2VuIGVpbnp1YmF1ZW4sIGRhcyBtYW4gbnVyIGRpZQogICAgIC8vIEtyYWV1dGVyIHZlcndlbmRlbiBrYW5uLCB1ZWJlciBkaWUgbWFuIHNjaG9ubWFsIGV0d2FzIGdlbGVzZW4vZ2VsZXJudAogICAgIC8vIGhhdCwgYXVzIGRpZXNlbSBHcnVuZCwgaXN0IGZvbGdlbmRlciBCbG9jayBhdXNrb21tZW50aWVydC4KICAgICAvLyBEaWVzZXIgQmxvY2sgYmVkZXV0ZXQgcXVhc2kgZWluICJhdXRvIGxlYXJuaW5nIG9uIGRlbWFuZCIgZC5oLgogICAgIC8vIHdpcmQgZWluIEtyYXV0IHZlcndlbmRldCB3aXJkIGdlcHJ1ZWZ0IG9iIGZ1ZXIgZGllc2UgR3J1cHBlIGJlcmVpdHMKICAgICAvLyBlaW5lIElEIGZyZWlnZXNjaGFsdGV0IHd1cmRlIC0gYW5zb25zdGVuIHdpcmQgZWluZSBmcmVpZ2VzY2hhbHRldC4KICAgICAvKgogICAgICAgICAvLyBwcnVlZmVuIG9iIGZ1ZXIgZGVuIEtleSBiZXJlaXRzIGVpbiBCaXQgZ2VzZXR6dCBpc3QsIGdnZi4gc2V0emVuCiAgICAgICAgIGlmIChpZD49c2l6ZW9mKGlkMmtleSkpIHJldHVybiAwOyAvLyBpbGxlZ2FsZSBJZAogICAgICAgICBpbnQgaWRsaXN0PWtleTJpZFtpZDJrZXlbaWRdXTsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGZvciAoaT1zaXplb2YoaWRsaXN0KS0xOyBpPj0wOyBpLS0pIHsKICAgICAgICAgICBpZiAodGVzdF9iaXQoc3RyLCBpZGxpc3RbaV0pKSByZXR1cm4gMDsgLy8gS2V5IGJlcmVpdHMgdm9yaGFuZGVuCiAgICAgICAgIH0KICAgICAgICAgLy8gWnVmYWVsbGlnIGVpbiBCaXQgZnVlciBkZW4gS2V5IHNldHplbgogICAgICAgICBpPXJhbmRvbShzaXplb2YoaWRsaXN0KSk7CiAgICAgICAgIHBsYXllcltnZXR1aWQocGwpXT1zZXRfYml0KHN0ciwgaWRsaXN0W2ldKTsKICAgICAgICAgc2F2ZV9vYmplY3Qob2JqZWN0X25hbWUoKSk7CiAgICAgICAgIHJldHVybiAoaT09aWQpOwogICAgICovCiAgICAgcmV0dXJuIDA7CiAgIH0KfQoKLy8gRGllc2UgRnVua3Rpb24gd2lyZCB2b20gTWV0emVsb3Jha2VsIGF1ZmdlcnVmZW4sIHVtIGRpZSBCZWxvaG51bmdlbiB6dQovLyBlcnpldWdlbiwgZGllIG1hbiBkb3J0IGZ1ZXIgZXJmb2xncmVpY2ggYWJzb2x2aWVydGUgTWV0emVsYXVmdHJhZWdlIGVyaGFlbHQKI2RlZmluZSBBTExPV0VEX0NBTExFUiAoeyAiL2QvZWJlbmUvYXJhdGhvcm4vb3Jha2VsL3NlY3VyZS9zY2hhbWFuZSIgfSkKb2JqZWN0IGdldF9wbGFudF9ieV9jYXRlZ29yeShpbnQgbnBjX2NsYXNzKQp7CiAgaWYgKCBtZW1iZXIoQUxMT1dFRF9DQUxMRVIsIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkpPDAgKQogICAgcmFpc2VfZXJyb3IoInVuYXV0aG9yaXNlZCBjYWxsIHRvIGdldF9wbGFudF9ieV9jYXRlZ29yeSgpXG4iKTsKCiAgLy8gVWViZXJnZWJlbmUgTlBDLUtsYXNzZSBpbiBLcmF1dC1LYXRlZ29yaWUgdW1zZXR6ZW4uCiAgLy8gS2F0ZWdvcmllIDcgd2lyZCBhbHMgNy05IGludGVycHJldGllcnQgKHNpZWhlIHVudGVuKS4KICBpbnQgY2F0ZWdvcnk7CiAgc3dpdGNoKG5wY19jbGFzcykgewogICAgY2FzZSAxOiBjYXNlIDI6ICAgICAgICAgY2F0ZWdvcnk9NDsgYnJlYWs7CiAgICBjYXNlIDM6IGNhc2UgNDogICAgICAgICBjYXRlZ29yeT01OyBicmVhazsKICAgIGNhc2UgNTogY2FzZSA2OiBjYXNlIDc6IGNhdGVnb3J5PTY7IGJyZWFrOwogICAgZGVmYXVsdDogICAgICAgICAgICAgICAgY2F0ZWdvcnk9NzsgYnJlYWs7CiAgfQoKICAvLyBBbGxlIEtyYWV1dGVyIGRlciBlcm1pdHRlbHRlbiBLYXRlZ29yaWUgcmF1c3N1Y2hlbi4gQmVpIEthdGVnb3JpZSA3CiAgLy8gd2VyZGVuIGF1Y2ggYWxsZSBhdXMgOCB1bmQgOSBkYXp1Z2Vub21tZW4uCiAgaW50ICplbGlnaWJsZV9wbGFudF9pZHM9KHt9KTsKICBmb3JlYWNoKCBzdHJpbmcgZ3JwLCBtYXBwaW5nIGdycGRhdGEgOiBpbmdyZWRpZW50cyApIHsKICAgIGlmICggY2F0ZWdvcnkgPT0gNyAmJiBncnBkYXRhW1RfQUJVTkRBTkNFXT49NyB8fCAKICAgICAgICAgIGNhdGVnb3J5ID09IGdycGRhdGFbVF9BQlVOREFOQ0VdICkKICAgICAgZWxpZ2libGVfcGxhbnRfaWRzICs9IGtleTJpZFtncnBdOwogIH0KCiAgLy8gS3JhdXRuYW1lbiB6dSBkZW4gS3JhdXQtSURzIGVybWl0dGVsbi4KICBzdHJpbmcgKnBsYW50ZmlsZXM9bWFwKGVsaWdpYmxlX3BsYW50X2lkcywgZnVuY3Rpb24gc3RyaW5nIChpbnQgcGxhbnRpZCkgewogICAgcmV0dXJuIGJ1aWxkX3BsYW50bmFtZShrcmF1dHByb3BzW3BsYW50aWRdKTt9KTsKCiAgLy8gRWluIEtyYXV0IHp1ZmFlbGxpZyBhdXN3YWVobGVuLCBjbG9uZW4gdW5kIGRhcyBPYmpla3QgenVydWVja2dlYmVuLgogIG9iamVjdCBwbGFudD1jbG9uZV9vYmplY3QoUExBTlRESVIrcGxhbnRmaWxlc1tyYW5kb20oc2l6ZW9mKHBsYW50ZmlsZXMpKV0pOwogIHBsYW50LT5EcnlQbGFudCg4MCtyYW5kb20oMTEpKTsKICAvLyBBdWZzY2hyZWliZW4sIHdlciB3ZWxjaGVzIEtyYXV0IG1pdCB3ZWxjaGVyIFF1YWxpdGFldCByYXVzYmVrb21tdC4KICBsb2dfZmlsZSgiQVJDSC9wbGFudF9ieV9jYXRlZ29yeSIsCiAgICBzcHJpbnRmKCIlcyAlLTEycyAlLXMgUXVhbCAlZCBLYXQgJWQgQ2xhc3MgJWRcbiIsIAogICAgICBzdHJmdGltZSgiJXggJVgiLHRpbWUoKSksIGdldHVpZChQTCksCiAgICAgIG9iamVjdF9uYW1lKHBsYW50KVtzaXplb2YoUExBTlRESVIpLi5dLAogICAgICBwbGFudC0+UXVlcnlQcm9wKFBfUVVBTElUWSksIGNhdGVnb3J5LCBucGNfY2xhc3MpKTsKLy8gc3ByaW50ZigiJTI0czogY2FsbCBmcm9tICVPLCBwbGF5ZXI6ICVzIChQTDogJU8pLCBrYXRlZ29yeTogJWRcbiIsIGN0aW1lKCksCi8vIHByZXZpb3VzX29iamVjdCgpLCBnZXR1aWQocGxheWVyKSwgUEwsIGthdGVnb3J5KSkKICByZXR1cm4gcGxhbnQ7Cn0KCnByaXZhdGUgbm9zYXZlIG9iamVjdCBzaW11bF9lZnVuLCBwbGFudHZjOwoKLy8gZnVlciBTSU1VTF9FRlVOX0ZJTEUKI2luY2x1ZGUgPGNvbmZpZy5oPgoKLy8gQU4vVE9ETzogS2xhZXJlbiwgd2FydW0gaGllciBlaW5lIGVpZ2VuZSBGdW5rdGlvbiBnZXRfY2xvbmVyKCkgZXhpc3RpZXJ0LAovLyB3byBkb2NoIGRlciBLcmFldXRlci1WQyBzY2hvbiBlaW5lIGhhdC4Kbm9tYXNrIHByaXZhdGUgc3RyaW5nIGdldF9jbG9uZXIoKQp7CiAgIGludCBpOwogICBvYmplY3QgcG87CiAgIGlmICghc2ltdWxfZWZ1bikgewogICAgICBpZiAoIShzaW11bF9lZnVuPWZpbmRfb2JqZWN0KFNJTVVMX0VGVU5fRklMRSkpKQogICAgICAgICBzaW11bF9lZnVuPWZpbmRfb2JqZWN0KFNQQVJFX1NJTVVMX0VGVU5fRklMRSk7CiAgIH0KICAgLy8gd2VubiBzaWUgamV0enQgbmljaHQgZXhpc3RpZXJ0IC0gYXVjaCBndXQsIGRhbm4gZ2lidCBlcyBoYWx0IGtlaW5lCiAgIC8vIHNlZnVucy4KCiAgIGlmICghcGxhbnR2YykgcGxhbnR2Yz1maW5kX29iamVjdChLUkFFVVRFUlZDKTsKICAgCiAgIGZvciAoaT0wOyBwbz1wcmV2aW91c19vYmplY3QoaSk7IGkrKykgewogICAgICBpZiAocG89PW1hc3RlcigpIHx8IHBvPT1zaW11bF9lZnVuIHx8IHBvPT1NRSB8fAogICAgICAgICAgcG89PXByZXZpb3VzX29iamVjdCgpIHx8IHBvPT1wbGFudHZjKQogICAgICAgICBjb250aW51ZTsKICAgICAgZWxzZSByZXR1cm4gb2JqZWN0X25hbWUocG8pOwogICB9CiAgIHJldHVybiAwOwp9CgovLyBBTjogCm5vbWFzayBzdHJpbmcgQ2hlY2tQbGFudChpbnQgaWQpCnsKICAgaWYgKGlkPD0wIHx8IGlkPj1zaXplb2YoaWQya2V5KSkgcmV0dXJuIDA7CiAgIGlmICghc3RyaW5ncChpZDJrZXlbaWRdKSkgcmV0dXJuIDA7CiAgIHJldHVybiBnZXRfY2xvbmVyKCk7Cn0KCi8vIHVlYmVyIGRpZXNlIEZ1bmt0aW9uIGthbm4gZGllIExpc3RlIGRlciBJZCdzIHVwZGF0ZXQgd2VyZGVuCi8vIGVzIHdpcmQgPGZpbGVuYW1lPiBlaW5nZWxlc2VuIHVuZCBkdXJjaGdlcGFyc3QuCi8vIERpZXNlIERhdGVpIG11c3MgaW4gamVkZXIgWmVpbGUgZm9sZ2VuZGVzIEZvcm1hdCBlaW5oYWx0ZW4gdW5kIGRhcmYga2VpbmUKLy8gbGVlcnplaWxlbiBlbnRoYWx0ZW4hID4gSWQsa2V5LEdlbmRlcixOYW1lLEFkamVrdGl2Ci8vIEFOOiBEYXMgaXN0IFF1YXRzY2guIERhcyBGb3JtYXQgbXVzcyBzbyBhdXNzZWhlbjoKLy8gU3RyaW5nLUlEO0tyYXV0LUlEO2RlbW9uO2dlbmRlcjtQX05BTUU7YWRqZWt0aXY7UF9MT05HO3Jvb21kZXRhaWw7Ci8vIEhVOiBEaWVzZSBGdW5rdGlvbiBsYXNzIGljaCBzby4gSGFyaGFyLgovLyBVcGRhdGU6IE5hIGd1dC4gRmFzdC4Kbm9tYXNrIHByaXZhdGUgaW50IExvYWRJZExpc3Qoc3RyaW5nIGZpbGVuYW1lKQp7CiAgIGludCBpLCBpZCwgc2ksIGRlbW9uOwogICBzdHJpbmcgKmxpbmVzLCBmaWxlOwogICBtaXhlZCAqZGF0YTsKICAgZmlsZT1yZWFkX2ZpbGUoZmlsZW5hbWUpOwogICBpZiAoIXN0cmluZ3AoZmlsZSkpIHJhaXNlX2Vycm9yKCJNaXNzaW5nIEZpbGU6ICIrZmlsZW5hbWUrIlxuIik7CiAgIGxpbmVzPWV4cGxvZGUocmVhZF9maWxlKGZpbGVuYW1lKSwgIlxuIik7CiAgIHNpPXNpemVvZihsaW5lcyktMTsKICAgLy8gQU4vVE9ETzogV2FydW0gdmVyd2VuZGV0IG1hbiBoaWVyIG5pY2h0IGF1Y2ggZWluZmFjaCBleHBsb2RlKCk/CiAgIC8vIFdlbm4gIiMjZW5kZSMjIiBhbHMgVHJlbm56ZWljaGVuIGVudGhhbHRlbiBpc3QsIGxpZWZlcnQgZXhwbG9kZSgpCiAgIC8vIGFscyBsZXR6dGVuIEVpbnRyYWcgZWluZW4gTGVlcnN0cmluZywgZGFyYXVmIGthbm4gbWFuIHBydWVmZW4uCiAgIC8vIEFsbGVyZGluZ3MgbXVlc3N0ZSBkYXMgdm9yIGRlbSBleHBsb2RlKCkgenVyIFplaWxlbnRyZW5udW5nIHBhc3NpZXJlbi4KICAgZm9yICggO3NpPj0wOyBzaS0tKSAKICAgewogICAgIHN0cmluZyBsaWxpPWxpbmVzW3NpXTsKICAgICBpZiAoc3Ryc3RyKGxpbmVzW3NpXSwiIyNlbmRlIyMiKT49MCkgYnJlYWs7CiAgIH0KICAgc2ktLTsKICAgaWYgKHNpPDApIHJhaXNlX2Vycm9yKCIjI2VuZGUjIyBub3QgZm91bmQgaW4gaWQtbGlzdC5cbiIpOwogICBpZDJrZXk9YWxsb2NhdGUoc2krMik7CiAgIGtyYXV0cHJvcHM9YWxsb2NhdGUoc2krMik7CiAgIC8vIEFOOiBGdWVyIGRhcyBBdXNsZXNlbiBkZXIgV2VydGUgYXVzIGRlbSBBcnJheSAiZGF0YSIgbXVlc3NlbiBkaWUgCiAgIC8vIEluZGl6aWVydW5ncy1EZWZpbmVzIGpld2VpbHMgKzEgdmVyd2VuZGV0IHdlcmRlbiwgd2VpbCBpbSBEYXRlbmZpbGUKICAgLy8gc2NobGF1ZXJ3ZWlzZSBlaW4gRGF0ZW5mZWxkICp2b3JuZSogYW5nZWZ1ZWd0IHd1cmRlLgogICAvLyBBTi9UT0RPOiB2aWVsbGVpY2h0IHNvbGx0ZSBtYW4gYmVzc2VyIEVsZW1lbnQgMCB6dWVyc3QgYXVzbGVzZW4gdW5kCiAgIC8vIGRhbm4gZGFzIEFycmF5IGFyciB1bSBlaW4gRWxlbWVudCBrdWVyemVuOiBhcnIgPSBhcnJbMS4uXTsKICAgZm9yIChpPXNpOyBpPj0wOyBpLS0pIHsKICAgICAgZGF0YT1leHBsb2RlKGxpbmVzW2ldLCAiOyIpOwogICAgICBpZiAoc2l6ZW9mKGRhdGEpIT04KSByYWlzZV9lcnJvcigiV3JvbmcgaWQtbGlzdCBmb3JtYXQgaW4gbGluZSAiKyhpKzEpKyJcbiIpOwogICAgICBpZD10b19pbnQoZGF0YVtQUk9QX0lEKzFdKTsKICAgICAgZGF0YVtQUk9QX0lEKzFdPWlkOwogICAgICBpZiAoaWQ+c2krMSkgcmFpc2VfZXJyb3Ioc3ByaW50ZigiTGluZSAlZDogaWQgJWQgZ3JlYXRlciB0aGFuIGFycmF5IHNpemUgJWQuXG4iLCBpLCBpZCwgc2kpKTsKICAgICAgaWQya2V5W2lkXT1kYXRhWzBdOwogICAgICAvLyBBTjogSWNoIHNlaGUgbm9jaCBuaWNodCBzbyBnYW56LCB3YXJ1bSBtYW4gdm9uIGRlbSBEYXRlbmZlbGQKICAgICAgLy8gUFJPUF9ERU1PTiBudXIgZGFzIGxldHp0ZSBaZWljaGVuIGFscyBMaXRlcmFsIHBydWVmZW4gc29sbHRlLgogICAgICAvLyBLb21wbGV0dCBnZWh0IGRvY2ggZ2VuYXVzb2d1dD8KICAgICAgc3dpdGNoKGRhdGFbUFJPUF9ERU1PTisxXVs8MV0pIHsKICAgICAgICBjYXNlICdSJzogZGF0YVtQUk9QX0RFTU9OKzFdPVJBVzsgYnJlYWs7CiAgICAgICAgY2FzZSAnMCc6IGRhdGFbUFJPUF9ERU1PTisxXT0wOyAgIGJyZWFrOwogICAgICAgIGNhc2UgJzEnOiBkYXRhW1BST1BfREVNT04rMV09MTsgICBicmVhazsKICAgICAgICBjYXNlICcyJzogZGF0YVtQUk9QX0RFTU9OKzFdPTI7ICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogcmFpc2VfZXJyb3IoIlVua25vd24gZGVtb25mb3JtYXQgJyIrZGF0YVtQUk9QX0RFTU9OKzFdKwogICAgICAgICAgICAgICAgICAgIicgaW4gaWRsaXN0IGxpbmUgIisoaSsxKSsiXG4iKTsKICAgICAgfQogICAgICBzd2l0Y2goZGF0YVtQUk9QX0dFTkRFUisxXVs8MV0pIHsKICAgICAgICBjYXNlICdOJzogZGF0YVtQUk9QX0dFTkRFUisxXT1ORVVURVI7IGJyZWFrOwogICAgICAgIGNhc2UgJ0YnOiBkYXRhW1BST1BfR0VOREVSKzFdPUZFTUFMRTsgYnJlYWs7CiAgICAgICAgY2FzZSAnTSc6IGRhdGFbUFJPUF9HRU5ERVIrMV09TUFMRTsgICBicmVhazsKICAgICAgICBkZWZhdWx0OiByYWlzZV9lcnJvcigiVW5rbm93biBnZW5kZXJmb3JtYXQgJyIrZGF0YVtQUk9QX0dFTkRFUisxXSsKICAgICAgICAgICAgICAgICAgICInIGluIGlkbGlzdCBsaW5lICIrKGkrMSkrIlxuIik7CiAgICAgIH0KICAgICAgU2V0UHJvcChQX0dFTkRFUiwgZGF0YVtQUk9QX0dFTkRFUisxXSk7CiAgICAgIFNldFByb3AoUF9OQU1FLCBkYXRhW1BST1BfTkFNRSsxXSk7CiAgICAgIC8vIEFOL1RPRE86IGRhdGFbUFJPUF9BREpdIG11c3MgbWFuIG5pY2h0IHVuYmVkaW5ndCB2b3JoZXIgYXVmIDAgc2V0emVuCiAgICAgIGlmICghc2l6ZW9mKGRhdGFbUFJPUF9BREorMV0pKSBkYXRhW1BST1BfQURKKzFdPTA7CiAgICAgIGlmIChkYXRhW1BST1BfQURKKzFdKQogICAgICAgICBTZXRQcm9wKFBfTkFNRV9BREosICh7Imdhbnogbm9ybWFsIiwgZGF0YVtQUk9QX0FESisxXX0pKTsKICAgICAgZWxzZSBTZXRQcm9wKFBfTkFNRV9BREosICJnYW56IG5vcm1hbCIpOwogICAgICBTZXRQcm9wKFBfQVJUSUNMRSwgZGF0YVtQUk9QX0RFTU9OKzFdIT1SQVcpOwogICAgICBkZW1vbj0oZGF0YVtQUk9QX0RFTU9OKzFdPT1SQVcgPyAwIDogZGF0YVtQUk9QX0RFTU9OKzFdKTsKICAgICAgLy8gQU46IFdlbm4ga2VpbmUgTGFuZ2Jlc2NocmVpYnVuZyBoaW50ZXJsZWd0IHd1cmRlLCB3aXJkIGRlciBOYW1lCiAgICAgIC8vIGRlcyBLcmF1dGVzIGFscyBzb2xjaGUgdmVyd2VuZGV0LiBFYmVuc28gZnVlciBkYXMgUmF1bWRldGFpbCwgZGFzCiAgICAgIC8vIGJlaW0gQmV0cmFjaHRlbiBkZXMgS3JhdXRlcyBpbSBSYXVtIGF1c2dlZ2ViZW4gd2lyZC4KICAgICAgaWYgKCFzaXplb2YoZGF0YVtQUk9QX0xPTkcrMV0pKSB7CiAgICAgICAgIGRhdGFbUFJPUF9MT05HKzFdID0gTmFtZShXRVIsIGRlbW9uKSsiLlxuIjsKICAgICAgfQogICAgICBlbHNlIGRhdGFbUFJPUF9MT05HKzFdID0gQlMoZGF0YVtQUk9QX0xPTkcrMV0pOwovLyBIdW1uaTogT2ZmZW5iYXIga29tbWVuIGFtIFplaWxlbmVuZGUgbWFuY2htYWwgWmVpY2hlbiBkYXp1LiBJY2ggZ2VoZSBkYXZvbgovLyBhdXMsIGRhc3Mga2VpbmUgQmVzY2hyZWlidW5nIGt1ZXJ6ZXIgYWxzIDIgWmVpY2hlbiBpc3QuCiAgICAgIGlmIChzaXplb2YoZGF0YVtQUk9QX1JPT01ERVRBSUwrMV0pPDIpIHsKICAgICAgICAgZGF0YVtQUk9QX1JPT01ERVRBSUwrMV0gPSBOYW1lKFdFUiwgZGVtb24pKyIuXG4iOwogICAgICB9CiAgICAgIGVsc2UgZGF0YVtQUk9QX1JPT01ERVRBSUwrMV0gPSBCUyhkYXRhW1BST1BfUk9PTURFVEFJTCsxXSk7CiAgICAgIGtyYXV0cHJvcHNbaWRdPWRhdGFbMS4uXTsKICAgfQogICBTZXRQcm9wKFBfTkFNRSwgMCk7CiAgIFNldFByb3AoUF9OQU1FX0FESiwgIiIpOwogICAKICAgLy8ga2V5MmlkLUNhY2hlIG5ldSBhdWZiYXVlbi4KICAga2V5MmlkPShbXSk7CiAgIGZvciAoaT1zaXplb2YoaWQya2V5KS0xOyBpPj0wOyBpLS0pIHsKICAgICAgaWYgKG1lbWJlcihrZXkyaWQsIGlkMmtleVtpXSkpCiAgICAgICAgIGtleTJpZFtpZDJrZXlbaV1dKz0oeyBpIH0pOwogICAgICBlbHNlIGtleTJpZFtpZDJrZXlbaV1dPSh7IGkgfSk7CiAgIH0KICAgcmV0dXJuIDE7Cn0KCi8vIEhpbGZzZnVua3Rpb24gd2lyZCB6dW0gZWlucGFyc2VuIGJlbvZ0aWd0Ci8vIHdhbmRlbHQgei5CLiBkZW4gc3RyaW5nIHZvbiAiaCA1MDAiIGluICh7IDMsIDUwMCB9KSB1bQpwcml2YXRlIG5vbWFzayA8c3RyaW5nfGludD4qIGJ1aWxkQXR0ckFycihzdHJpbmcgYXR0cikKewogICBpZiAoIWF0dHIpIHJldHVybiAwOwogICBhdHRyPXRyaW0oYXR0cik7CiAgIDxzdHJpbmd8aW50PiogcmVzPWV4cGxvZGUoYXR0ciwgIiAiKS0oeyIifSk7CiAgIC8vZGVidWcoc3ByaW50ZigiIGJ1aWxkIEF0dHIgJU8iLHJlcykpOwogICBpZiAoc2l6ZW9mKHJlcykhPTIpIHJhaXNlX2Vycm9yKCJXcm9uZyBhdHRyaWIgZm9ybWF0IVxuIik7CiAgIC8vZGVidWcoc3ByaW50ZigiJU8iLFRfS1JBVVRfTUFQKSk7CiAgIHJldHVybiAoe1RfS1JBVVRfTUFQW3Jlc1swXV0sKGludClyZXNbMV19KTsKfQoKLy8gQU46IEhpbGZzZnVua3Rpb24genVtIEVpbmxlc2VuIGRlciBUcmFlbmtlbGlzdGUuCm5vbWFzayBwcml2YXRlIHZvaWQgTG9hZEluZGV4KHN0cmluZyBmaWxlbmFtZSkKewogICBpbnQgaSwgaiwgc2k7CiAgIHN0cmluZyAqbGluZXMsIGZpbGU7CiAgIG1peGVkICAqZGF0YTsKCiAgIGZpbGU9cmVhZF9maWxlKGZpbGVuYW1lKTsKICAgaWYgKCFzdHJpbmdwKGZpbGUpKSByYWlzZV9lcnJvcigiTWlzc2luZyBGaWxlOiAiK2ZpbGVuYW1lKyJcbiIpOwogICAKICAgLy8gQU4vVE9ETzogQXVjaCBoaWVyIHdhZXJlIHdpZWRlciBkaWUgVmVyd2VuZHVuZyB2b24gZXhwbG9kZSgpIHp1CiAgIC8vIGVyd2FlZ2VuLgogICBsaW5lcz1leHBsb2RlKGZpbGUsICJcbiIpLSh7IiJ9KTsKICAgc2k9c2l6ZW9mKGxpbmVzKTsKICAgZm9yIChpPTA7IGk8c2k7IGkrKykgaWYgKGxpbmVzW2ldPT0iIyNzdGFydCMjIikgYnJlYWs7CiAgIGkrKzsKICAgaWYgKGk+PXNpKSByYWlzZV9lcnJvcigibWlzc2luZyAjI3N0YXJ0IyMgaW4gSW5kZXguXG4iKTsKICAgaW5ncmVkaWVudHM9KFtdKTsKICAgZm9yICg7IGk8c2k7IGkrKykgeyAvLyBhbGxlIHplaWxlbiBkdXJjaGxhdWZlbi4uLgogICAgIC8vIEFOL1RPRE86IFRhYnVsYXRvcmVuIGFscyBUcmVubnplaWNoZW4gZmluZGUgaWNoIGlyZ2VuZHdpZSBibG9lZC4KICAgICAvLyBIVTogRGFydW0gbnVuIFNlbWlrb2xvbnMKICAgICAvLyBkZWJ1ZygiWmVpbGUgIitsaW5lc1tpXSk7CiAgICAgZGF0YT1vbGRfZXhwbG9kZShsaW5lc1tpXSwgIjsiKTsgLy8gYW4gU2VtaWtvbG9ucyB0cmVubmVuLi4uCiAgICAgLy8gZGVidWcoc3ByaW50ZigiJU8iLGRhdGEpKTsKICAgICBpZiAoc2l6ZW9mKGRhdGEpIT05KSAKICAgICAgIHsKICAgICAgICAgLy9kZWJ1ZyhzcHJpbnRmKCIlTyIsZGF0YSkpOwogICAgICAgICByYWlzZV9lcnJvcigiV3JvbmcgaW5kZXhsaXN0IGZvcm1hdCBpbiBsaW5lICIrKGkrMSkrIlxuIik7CiAgICAgICB9CiAgICAgZm9yIChqPTg7IGo+PTA7IGotLSkgewogICAgICAgLy8gQU4vVE9ETzogaWYoZGF0YVtqXT09IiIgfHwgZGF0YVtqXT09Ii0iKSBkYXRhW2pdPTA7CiAgICAgICAvLyBlcyBzaW5kIG9obmVoaW4gdWViZXJhbGwgU3RyaW5ncyBlbnRoYWx0ZW4uCiAgICAgICAvLyBXaXIgbWFjaGVuIGF1cyAiLSIgb2RlciAiMCIgZWluZSBlY2h0ZSBpbnQtTnVsbC4KICAgICAgIGlmIChzaXplb2YoZGF0YVtqXSk9PTAgfHwgZGF0YVtqXVswXT09Jy0nKSBkYXRhW2pdPTA7CiAgICAgfQogICAgIC8vIEhVOiBBYiBoaWVyIGJhdSBpY2ggbWFsIG5ldS4gRGVuIFJlc3QgcGFjayBpY2ggYXVza29tbWVudGllcnQgZGFydW50ZXIsIHdlbm4gamVtYW5kIGRlbiBhbHRlbiBDb2RlCiAgICAgLy8gbmFjaHNjaGF1ZW4gd2lsbC4KICAgICAvLyBJY2ggd2lsbCBlaW4gTWFwcGluZyB2b24gZGllc2VyIEtyYWV1dGVyZ3J1cHBlLgogICAgIG1hcHBpbmcgbWs9KFtdKTsKICAgICAvLyBEaWVzZXMgTWFwcGluZyBzb2xsIGRpZSBFaW50cmFlZ2UgbnVuIGVudGhhbHRlbi4KICAgICBta1tUX0VGRkVDVF9EVVJBVElPTl09dG9faW50KGRhdGFbNV0pOwogICAgIG1rW1RfQUJVTkRBTkNFXT10b19pbnQoZGF0YVs4XSk7CiAgICAgLy8gcG9zaXRpdmUgRWZmZWt0ZSBhdWZ0ZWlsZW4KICAgICAvL2RlYnVnKHNwcmludGYoIlZvcnBvc2lzICVPIC0gJU8iLG1rLGRhdGEpKTsKICAgICBpZiAoc3RyaW5ncChkYXRhWzFdKSkKICAgICAgIHsKICAgICAgICAgc3RyaW5nKiBwb3Npcz1leHBsb2RlKGRhdGFbMV0sIiwiKTsKICAgICAgICAgLy9kZWJ1ZyhzcHJpbnRmKCIlTyAtICVPIixtayxwb3NpcykpOwogICAgICAgICBmb3JlYWNoIChzdHJpbmcgcTpwb3NpcykgewogICAgICAgICAgIC8vZGVidWcocSk7CiAgICAgICAgICAgPHN0cmluZ3xpbnQ+KiBhcnI9YnVpbGRBdHRyQXJyKHEpOwogICAgICAgICAgIC8vZGVidWcoc3ByaW50ZigiJU8iLGFycikpOwogICAgICAgICAgIG1rW2FyclswXV09bWtbYXJyWzBdXSthcnJbMV07CiAgICAgICAgIH0KICAgICAgIH0KICAgICAvL2RlYnVnKHNwcmludGYoIiVPIixtaykpOwogICAgIC8vIEVyc3RlciBOZWdhdGl2ZXIgRWZmZWt0CiAgICAgaWYgKGRhdGFbMl0hPTApCiAgICAgICB7CiAgICAgICAgIDxzdHJpbmd8aW50PiogYXJyPWJ1aWxkQXR0ckFycihkYXRhWzJdKTsKICAgICAgICAgbWtbYXJyWzBdXT1ta1thcnJbMF1dLWFyclsxXTsKICAgICAgIH0KICAgICAvL2RlYnVnKHNwcmludGYoInZvcm5lZyAlTyIsbWspKTsKICAgICAvLyBaZWl0ZXIgbmVnYXRpdmVyIEVmZmVrdAogICAgIGlmIChkYXRhWzNdIT0wKQogICAgICAgewogICAgICAgICA8c3RyaW5nfGludD4qIGFycj1idWlsZEF0dHJBcnIoZGF0YVszXSk7CiAgICAgICAgIG1rW2FyclswXV09bWtbYXJyWzBdXS1hcnJbMV07CiAgICAgICB9CiAgICAgLy8gSGFsdGJhcmtlaXQgd2lyZCB1bWdlcmVjaG5ldAogICAgIHN0cmluZyogc3RpPWV4cGxvZGUoZGF0YVs0XSwiICIpLSh7IiJ9KTsKICAgICAvL2RlYnVnKCJoYWx0YmFyICIrc3RpWzBdKTsKICAgICBzdHJpbmcgc3R0PXRyaW0oc3RpWzBdKTsKICAgICBpbnQgZHVyOwogICAgIGlmIChzdHRbPDEuLl09PSJkIikgLy8gVGFnZQogICAgICAgewogICAgICAgICAvL2RlYnVnKCJUYWdlIik7CiAgICAgICAgIC8vIERlciBlcnN0ZSBUZWlsIGlzdCBkaWUgRGF1ZXIgaW4gVGFnZW4uCiAgICAgICAgIGR1cj10b19pbnQoc3RpWzBdWy4uPDJdKTsKICAgICAgICAgZHVyPWR1cioyNCo2MCo2MDsgLy8gU2VrdW5kZW4KICAgICAgICAgbWtbVF9FWFBJUkVdPWR1cjsKICAgICAgIH0KICAgICBpZiAoc3R0WzwxLi5dPT0iaCIpIC8vIFN0dW5kZW4KICAgICAgIHsKICAgICAgICAgLy9kZWJ1ZygiU3R1bmRlbiIpOwogICAgICAgICAvLyBTb25zdCBpc3QgZXMgaGFsdCBkaWUgRGF1ZXIgaW4gU3R1bmRlbi4KICAgICAgICAgZHVyPXRvX2ludChzdGlbMF1bLi48Ml0pOwogICAgICAgICBkdXI9ZHVyKjYwKjYwOwogICAgICAgICBta1tUX0VYUElSRV09ZHVyOwogICAgICAgfQogICAgIC8vZGVidWcoImVyZ2lidCAiK2R1cik7CiAgICAgLy8gTnVuIGRpZSBsdXN0aWdlbiBVbnRlcnN0dWV0enVuZ2VuLiBEYXp1IGJlbnV0emVuIHdpciB1bnNlcmVuIGx1c3RpZ2VuIEdsdWVja3NoYXNlbi4KICAgICAvLyBVbmQgZWluIFJlaC4KICAgICBzdHJpbmcqIGdsdWVja3NoYXNlOwogICAgIHN0cmluZyByZWg7CiAgICAgLy8gQWxsZSBMZWVyemVpY2hlbiByYXVzIQogICAgIC8vZGVidWcoIlJlaGUiKTsKICAgICAvL2RlYnVnKHNwcmludGYoIkRhdGE6ICVPIixkYXRhKSk7CiAgICAgaWYgKHN0cmluZ3AoZGF0YVs2XSkpCiAgICAgICB7CiAgICAgICAgIHJlaD0oZXhwbG9kZShkYXRhWzZdLCIgIiktKHsiIn0pKVswXTsKICAgICAKICAgICAgICAgZ2x1ZWNrc2hhc2U9ZXhwbG9kZShyZWgsIiwiKS0oe30pOwogICAgICAgICBta1tUX1NVUFBPUlRFUl09Z2x1ZWNrc2hhc2U7CiAgICAgICB9CiAgICAgZWxzZQogICAgICAgewogICAgICAgICBta1tUX1NVUFBPUlRFUl09MDsKICAgICAgIH0KICAgICAvLyBOdW4gbWFjaGVuIHdpciBnZW5hdXNvIGRpZSBCbG9ja2FkZW4uCiAgICAgLy8gRGFzIHRvbGxlIGlzdDogUmVoIHVuZCBHbHVlY2tzaGFzZSBrb2VubmVuIHdpciB3aWVkZXJ2ZXJ3ZW5kZW4hIERhcyBmcmV1dC4KICAgICBpZiAoc3RyaW5ncChkYXRhWzddKSkKICAgICAgIHsKICAgICAgICAgcmVoPShleHBsb2RlKGRhdGFbN10sIiAiKS0oeyIifSkpWzBdOwogICAgICAgICBnbHVlY2tzaGFzZT1leHBsb2RlKHJlaCwiLCIpLSh7fSk7CiAgICAgICAgIG1rW1RfQkxPQ0tJTkddPWdsdWVja3NoYXNlOwogICAgICAgfQogICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgbWtbVF9CTE9DS0lOR109MDsKICAgICAgIH0KICAgICBpbmdyZWRpZW50c1t0cmltKGRhdGFbMF0pXT1tazsKICAgfQogICAvL2RlYnVnKCJXdWZmIik7CiAgIC8vZGVidWcoc3ByaW50ZigiJU8iLGluZ3JlZGllbnRzKSk7Cn0KCm5vbWFzayBwcml2YXRlIHZvaWQgc2F2ZSgpCnsKICBzYXZlX29iamVjdChfX0RJUl9fIi9BUkNIL2tyYXV0bWFzdGVyIik7Cn0KCi8vIEFOOiBlcnpldWd0IGF1cyBOYW1lbiArIEFkamVrdGl2IGRlciBQZmxhbnplbmRhdGVuIGRlbiBPYmpla3RuYW1lbiwKLy8gei5CLiB3YWxkcmViZV9nZW1laW4gb2RlciBhY2tlcmtsZWVfZ2VsYiwgd29iZWkgQmluZGVzdHJpY2hlIGF1Y2gKLy8gZHVyY2ggVW50ZXJzdHJpY2hlIGVyc2V0enQgd2VyZGVuIChhY2tlcl9yZXR0aWNoKS4Kc3RyaW5nIGJ1aWxkX3BsYW50bmFtZShtaXhlZCAqcHJvcHMpCnsKICAgc3RyaW5nIGtleTsKICAgLy8gQU4vVE9ETzogZXJzdCBQUk9QX05BTUUgaW4ga2V5IHNjaHJlaWJlbiwgZGFubiBnZ2YuIFBST1BfQURKIGRhenUKICAgaWYgKHNpemVvZihwcm9wc1tQUk9QX0FESl0pPjApCiAgICAgIGtleT1sb3dlcnN0cmluZyhwcm9wc1tQUk9QX05BTUVdKyJfIitwcm9wc1tQUk9QX0FESl0pOwogICBlbHNlIGtleT1sb3dlcnN0cmluZyhwcm9wc1tQUk9QX05BTUVdKTsKICAgLy8gQU4vVE9ETzogZXJzZXR6ZW4gZHVyY2ggcmVncmVwbGFjZSgpOwogICBrZXk9aW1wbG9kZShvbGRfZXhwbG9kZShrZXksICIgIiksICJfIik7CiAgIGtleT1pbXBsb2RlKG9sZF9leHBsb2RlKGtleSwgIi0iKSwgIl8iKTsKICAgcmV0dXJuIGtleTsKfQoKcHVibGljIHZvaWQgVXBkYXRlVkMoKQp7CiAgS1JBRVVURVJWQy0+dXBkYXRlKG1hcF9sZGZpZWQpOwp9CgovLyBBTjogRGF0ZW4gbmV1IHBhcnNlbgovLyBOYWNoIGRlbSBTY2hyZWliZW4gZGVzIFNhdmVmaWxlcyBtaXR0ZWxzIHNhdmUoKSB3aXJkIGF1Y2ggZGFzCi8vIEtyYWV1dGVyLUhlYWRlcmZpbGUgdm9tIEtyYWV1dGVyLVZDIG5ldSBnZXNjaHJpZWJlbi4KaW50IF9yZWZyZXNoKCkKewogICBpbnQgaTsKICAgc3RyaW5nIGtleTsKICAgaWYgKGV4dGVybl9jYWxsKCkgJiYgIWFsbG93ZWQoKSkKICAgICByZXR1cm4gMDsKICAgCiAgIExvYWRJZExpc3QoX19ESVJfXyJBUkNIL2tyYWV1dGVybGlzdGUuZHVtcCIpOwogICBMb2FkSW5kZXgoX19ESVJfXyJBUkNIL2tyYWV1dGVyaW5kZXguZHVtcCIpOwogICBtYXBfbGRmaWVkPShbXSk7CiAgIGZvciAoaT1zaXplb2Yoa3JhdXRwcm9wcyktMTsgaT49MDsgaS0tKQogICB7CiAgICAgIGlmIChzaXplb2Yoa3JhdXRwcm9wc1tpXSk8PVBST1BfUk9PTURFVEFJTCkgY29udGludWU7CiAgICAgIGtleSA9IGJ1aWxkX3BsYW50bmFtZShrcmF1dHByb3BzW2ldKTsKICAgICAgbWFwX2xkZmllZFtrZXldPSh7IGtyYXV0cHJvcHNbaV0sIHJvb21zW2tleV18fChbXSkgfSk7CiAgIH0KICAgc2F2ZSgpOwogICBVcGRhdGVWQygpOwogICAKICAgLy8gVXBkYXRlIEhlYWRlcmZpbGUgbWl0IEtyYWV1dGVybGlzdGUKICAgc3RyaW5nICprZXlzID0gc29ydF9hcnJheShtX2luZGljZXMobWFwX2xkZmllZCksICMnPCk7CiAgIHN0cmluZyBoZWFkZXJmaWxlID0KICAgICAiLy8gQXV0b21hdGlzY2ggZ2VuZXJpZXJ0ZXMgRmlsZSwgbmljaHQgdm9uIEhhbmQgZWRpdGllcmVuIVxuIgogICAgICIvLyBFcnpldWdlbmRlcyBGaWxlOiAiK29iamVjdF9uYW1lKCkrIlxuXG4iCiAgICAgIiNkZWZpbmUgUExBTlRDT1VOVCAiK3RvX3N0cmluZyhzaXplb2Yoa2V5cykpKyJcblxuIgogICAgICsiI2RlZmluZSBQTEFOVCh4KSBcIi9pdGVtcy9rcmFldXRlci9cIit4XG5cbiI7CiAgIGZvcmVhY2goa2V5OiBrZXlzKQogICB7CiAgICAgaGVhZGVyZmlsZSArPSBzcHJpbnRmKCIjZGVmaW5lICUtMzBzIFBMQU5UKFwiJXNcIilcbiIsCiAgICAgICAgICAgICAgICAgICAgIHVwcGVyc3RyaW5nKGtleSksIGtleSk7CiAgIH0KICAgd3JpdGVfZmlsZShLUkFFVVRFUkxJU1RFLCBoZWFkZXJmaWxlLCAxKTsKCiAgIHdyaXRlKCJJbnB1dGZpbGVzIHBhcnNlZC4gU2F2ZSAmIEhlYWRlcmZpbGVzIHVwZGF0ZWQhXG4iKTsKICAgcmV0dXJuIDE7Cn0KCmludCBfY2xvbmVwbGFudChzdHJpbmcgc3RyKQp7CiAgaWYgKGFsbG93ZWQoKSkKICB7CiAgICBpZiAodG9fc3RyaW5nKHRvX2ludChzdHIpKSA9PSBzdHIpCiAgICAgIHN0ciA9IFF1ZXJ5UGxhbnRGaWxlKHRvX2ludChzdHIpKTsKICAgIGNsb25lX29iamVjdChQTEFOVERJUitzdHIpLT5tb3ZlKHRoaXNfcGxheWVyKCksIE1fTk9DSEVDSyk7CiAgICB3cml0ZSgiS3JhdXQgIiArIHN0ciArICIgZ2VjbG9udC5cbiIpOwogICAgcmV0dXJuIDE7CiAgfQogIHJldHVybiAwOwp9CgojZGVmaW5lIE1BWF9ST09NUyAxMCAgLyoga2VpbiBLcmF1dCBpc3QgaW4gbWVociBhbHMgMTAgUmFldW1lbiAqLwovLyBBTjogQXVzZ2FiZSBkZXIgS2F0ZWdvcmllbmxpc3RlIHVlYmVyIGRhcyBQbGFudHRvb2wuCmludCBfc2hvd3BsYW50KHN0cmluZyBzdHIpCnsKICAgaW50IGksIHNpLCBrYXQsIHNlY3VyZTsKICAgc3RyaW5nICpsaXN0LCBrZXk7CiAgIG1peGVkICpyZXMsICphcnI7CiAgIG1hcHBpbmcgcHJvcHM7CgogICBzZWN1cmU9YWxsb3dlZCgpOwogICBub3RpZnlfZmFpbCgiRXMgZ2lidCBmb2xnZW5kZSBLcmFldXRlcmthdGVnb3JpZW46XG4iCiAgICArIiAwIC0gaGFldWZpZyB1bmQgYW4gdmllbGVuIFN0ZWxsZW4gaW0gTXVkIGFuenVmaW5kZW5cbiIKICAgICsiIDEgLSBldHdhcyBzZWx0ZW5lciB6dSBmaW5kZW4sIGFiZXIgaW1tZXIgbm9jaCBsZWljaHRcbiIKICAgICsiIDIgLSBhbiB3ZW5pZ2VuIGd1dCB2ZXJzdGVja3RlbiBTdGVsbGVuIGluIGFiZ2VsZWdlbmVuIEdlYmlldGVuXG4iCiAgICArIiAzIC0gZGl0bywgamVkb2NoIG11c3MgZGFzIEtyYXV0IGR1cmNoIGVpbmVuIE5QQyAoWFAgPj0gNTAwMDAwKSBiZXdhY2h0IHNlaW4uXG4iCiAgICArIiA0IC0gYWV1c3NlcnN0IHNlbHRlbiB1bmQgWFAgPj0gMSBtaW9cbiIKICAgICsiIDUgLSBhZXVzc2Vyc3Qgc2VsdGVuIHVuZCBYUCA+PSAyIG1pb1xuIgogICAgKyIgNiAtIGFldXNzZXJzdCBzZWx0ZW4gdW5kIE5QQyBicmluZ3QgPj0gNSAgU3R1cHNlXG4iCiAgICArIiA3IC0gYWV1c3NlcnN0IHNlbHRlbiB1bmQgTlBDIGJyaW5ndCA+PSAxMCBTdHVwc2VcbiIKICAgICsiIDggLSBhZXVzc2Vyc3Qgc2VsdGVuIHVuZCBOUEMgYnJpbmd0ID49IDIwIFN0dXBzZVxuIgogICAgKyIgOSAtIGFldXNzZXJzdCBzZWx0ZW4gdW5kIE5QQyBicmluZ3QgPj0gNTAgU3R1cHNlXG4iCiAgICArIlxuU3ludGF4OiBzaG93cGxhbnQgPGthdGVnb3JpZT4uXG4iKTsKICAga2F0PXRvX2ludChzdHIpOwogICBpZiAoa2F0PDAgfHwga2F0PjkpIHJldHVybiAwOwogICBpZiAodG9fc3RyaW5nKGthdCkhPXN0cikgcmV0dXJuIDA7CiAgIGxpc3Q9bV9pbmRpY2VzKG1hcF9sZGZpZWQpOwogICAvLyBBTjogKmdydW1tZWwqCiAgIC8vIHJlcyA9IGFsbG9jYXRlKE1BWF9ST09NUywgKHt9KSk7CiAgIHJlcz1tYXAoYWxsb2NhdGUoTUFYX1JPT01TKSwgIydhbGxvY2F0ZSk7IC8vICh7ICh7fSkgLi4uICh7fSkgfSkKICAgZm9yIChpPXNpemVvZihsaXN0KS0xOyBpPj0wOyBpLS0pIHsKICAgICAgYXJyPW1hcF9sZGZpZWRbbGlzdFtpXV07CiAgICAgIGlmIChzaXplb2YoYXJyKSE9MikgcmFpc2VfZXJyb3IoIldyb25nIG1hcF9sZGZpZWQtRm9ybWF0IGJ5ICIrbGlzdFtpXSsiXG4iKTsKICAgICAga2V5PWlkMmtleVthcnJbMF1bUFJPUF9JRF1dOwogICAgICBpZiAoIWtleSkgcmFpc2VfZXJyb3IoIk1pc3NpbmcgS2V5IGZvciBpZCAiK2FyclswXVtQUk9QX0lEXSsiXG4iKTsKICAgICAgcHJvcHM9aW5ncmVkaWVudHNba2V5XTsKICAgICAgLy9pZiAoIXBvaW50ZXJwKHByb3BzKSkgY29udGludWU7IC8vIG5vY2ggbmljaHQgZWluZ2V0cmFnZW4KICAgICAgLy9pZiAoc2l6ZW9mKHByb3BzKSE9OCkKICAgICAgLy8gcHJpbnRmKCJXYXJuaW5nOiBXcm9uZyBpbmdyZWRpZW50LWNvbnRlbnQgYnkgIitrZXkrIlxuIik7CiAgICAgIC8vZGVidWcoc3ByaW50ZigiJU8iLHByb3BzKSk7CiAgICAgIGlmIChwcm9wcz09MCkKICAgICAgewogICAgICAgIGRlYnVnKCJGYWxzY2hlciBLZXk6ICIra2V5KTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZiAocHJvcHNbVF9BQlVOREFOQ0VdPT1rYXQpCiAgICAgICAgewogICAgICAgICAgc2k9c2l6ZW9mKGFyclsxXSk7CiAgICAgICAgICBpZiAoc2k8TUFYX1JPT01TKSB7CiAgICAgICAgICAgIGlmIChzdHJpbmdwKGFyclswXVtQUk9QX0FESl0pKSB7CiAgICAgICAgICAgICAgU2V0UHJvcChQX0FSVElDTEUsIDApOwogICAgICAgICAgICAgIFNldFByb3AoUF9OQU1FLCBhcnJbMF1bUFJPUF9OQU1FXSk7CiAgICAgICAgICAgICAgU2V0UHJvcChQX05BTUVfQURKLCBhcnJbMF1bUFJPUF9BREpdKTsKICAgICAgICAgICAgICBTZXRQcm9wKFBfR0VOREVSLCBhcnJbMF1bUFJPUF9HRU5ERVJdKTsKICAgICAgICAgICAgICBrZXk9TmFtZShXRVIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2Uga2V5PWFyclswXVtQUk9QX05BTUVdOwogICAgICAgICAgICBpZiAoc2VjdXJlKQogICAgICAgICAgICAgIHJlc1tzaV0rPSh7IHNwcmludGYoIiUzZCAlLTQwczogJWRcbiIsIGFyclswXVtQUk9QX0lEXSwga2V5LCBzaSkgfSk7CiAgICAgICAgICAgIGVsc2UgcmVzW3NpXSs9KHsgc3ByaW50ZigiJS00MHM6ICVkXG4iLCBrZXksIHNpKSB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgfQogICBmb3IgKGk9MDsgaTxNQVhfUk9PTVM7IGkrKykgewogICAgICBzb3J0X2FycmF5KHJlc1tpXSwgIyc+KTsKICAgICAgZmlsdGVyKHJlc1tpXSwgIyd3cml0ZSk7CiAgIH0KICAgcmV0dXJuIDE7Cn0KCi8vIEFOOiBBdXNnYWJlIGRlciBSYWV1bWUsIGluIGRlbmVuIGRpZSBLcmFldXRlciB6dSBmaW5kZW4gc2luZC4KLy8gYW5nZXN0ZXVlcnQgdWViZXIgZGFzIFBsYW50dG9vbC4KaW50IF9zaG93cm9vbXMoc3RyaW5nIHN0cikKewogICBpbnQgaSwgaiwgaWQ7CiAgIHN0cmluZyAqbGlzdCwgZHVtbXk7CiAgIG1peGVkICphcnI7CiAgIGlmICghYWxsb3dlZCgpKSByZXR1cm4gMDsKICAgbm90aWZ5X2ZhaWwoIlN5bnRheDogc2hvd3Jvb21zIDxpZD4gb2RlciBzaG93cm9vbXMgYWxsXG4iKTsKICAgaWYgKHN0ciE9ImFsbCIpIHsKICAgICBpZD10b19pbnQoc3RyKTsKICAgICBpZiAodG9fc3RyaW5nKGlkKSE9c3RyKSByZXR1cm4gMDsKICAgfQogICBlbHNlIGlkPS0xOwogICBsaXN0PW1faW5kaWNlcyhtYXBfbGRmaWVkKTsKICAgZm9yIChpPXNpemVvZihsaXN0KS0xOyBpPj0wOyBpLS0pIHsKICAgICAgYXJyPW1hcF9sZGZpZWRbbGlzdFtpXV07CiAgICAgIGlmIChzaXplb2YoYXJyKSE9MikgcmFpc2VfZXJyb3IoIldyb25nIG1hcF9sZGZpZWQtRm9ybWF0IGJ5ICIrbGlzdFtpXSsiXG4iKTsKICAgICAgaWYgKGFyclswXVtQUk9QX0lEXT09aWQgfHwgaWQ8MCkgewogICAgICAgICBpZiAoIXNpemVvZihtX2luZGljZXMoYXJyWzFdKSkpIHsKICAgICAgICAgICAgaWYgKGlkPj0wKSB3cml0ZSgiRnVlciBkaWVzZSBJZCBzaW5kIGtlaW5lIFJhZXVtZSBlaW5nZXRyYWdlbi5cbiIpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGlkPj0wKSB7CiAgICAgICAgICAgIHdyaXRlKCJGb2xnZW5kZSBSYWV1bWUgc2luZCBmdWVyICIrYXJyWzBdW1BST1BfSURdKyIgZWluZ2V0cmFnZW4uXG4iKTsKICAgICAgICAgICAgZmlsdGVyKG1hcChtX2luZGljZXMoYXJyWzFdKSwgIycrLCAiXG4iKSwgIyd3cml0ZSk7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgZmlsdGVyKG1hcChtX2luZGljZXMoYXJyWzFdKSwgIycrLCAiOiAiK2FyclswXVtQUk9QX0lEXSsiLCAiK2FyclswXVtQUk9QX05BTUVdKyJcbiIpLCAjJ3dyaXRlKTsKICAgICAgICAgaWYgKGlkPj0wKSByZXR1cm4gMTsKICAgICAgfQogICB9CiAgIHdyaXRlKCJGdWVyIGRpZXNlIElkIHNpbmQgYmlzaGVyIGtlaW5lIEtyYWV1dGVyIGVpbmdldHJhZ2VuLlxuIik7CiAgIHJldHVybiAxOwp9CgovLyBOdXR6dW5nIGRlciBLcmFldXRlciBpbiAgR2ViaWV0ZW4gbGllZmVydCBudXIgZGFubiBndWVsdGlnZSBLcmFldXRlciwKLy8gd2VubiBkZXIgUmF1bSBlaW5nZXRyYWdlbiBpc3QuCmludCBfYWRkcm9vbShzdHJpbmcgc3RyKQp7CiAgIGludCBpZCwgaTsKICAgc3RyaW5nICpsaXN0LCB2YzsKCiAgIGlmICghYWxsb3dlZCgpKSB7CiAgICAgIHdyaXRlKCJGdWVyIGRhcyBFaW50cmFnZW4gZGVyIFJhZXVtZSB3ZW5kZSBEaWNoIGRvY2ggYml0dGUgIgogICAgICAgICAgICAiYW4gZWluZW4gRU0uXG4iKTsKICAgICAgcmV0dXJuIDE7CiAgIH0KICAgbm90aWZ5X2ZhaWwoIlN5bnRheDogYWRkcm9vbSA8a3JhdXRudW1tZXI+IDxmaWxlbmFtZT5cbiIpOwogICBzdHI9UEwtPl91bnBhcnNlZF9hcmdzKCk7CiAgIGlmICghc3RyIHx8IHNzY2FuZihzdHIsICIlZCAlcyIsIGlkLCBzdHIpIT0yKSByZXR1cm4gMDsKICAgaWYgKHN0cj09ImhpZXIiIHx8IHN0cj09ImhlcmUiKQogICB7CiAgICAgaWYgKCF0aGlzX3BsYXllcigpKQogICAgIHsKICAgICAgIG5vdGlmeV9mYWlsKCJLZWluIFNwaWVsZXJvYmpla3QsIGthbm4gIgogICAgICAgICAgICJSYXVtIG5pY2h0IGlkZW50aWZpemllcmVuLlxuIik7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgc3RyPXRvX3N0cmluZyhlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSk7CiAgIH0KICAgaWYgKHN0cls8Mi4uXT09Ii5jIikgc3RyPXN0clswLi48M107IC8vIC5jIGFic2NobmVpZGVuCiAgIGlmIChmaWxlX3NpemUoc3RyKyIuYyIpPD0wKSB7CiAgICAgIGxpc3Q9ZXhwbG9kZShzdHIsICIvIik7CiAgICAgIHZjPWltcGxvZGUobGlzdFswLi48Ml0sICIvIikrIi92aXJ0dWFsX2NvbXBpbGVyLmMiOwogICAgICBpZiAoZmlsZV9zaXplKHZjKTw9MCB8fCAhY2FsbF9vdGhlcih2YywgIlZhbGlkYXRlIiwgbGlzdFs8MV0pKSB7CiAgICAgICAgIHdyaXRlKCJObyBzdWNoIGZpbGUgXCIiK3N0cisiXCIuXG4iKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgfQogICBpZiAoaWQ8PTAgfHwgaWQ+PXNpemVvZihpZDJrZXkpKSB7CiAgICAgIHdyaXRlKCJJbGxlZ2FsIHBsYW50aWQgIitpZCsiLlxuIik7CiAgICAgIHJldHVybiAxOwogICB9CiAgIGxpc3Q9bV9pbmRpY2VzKG1hcF9sZGZpZWQpOwogICBmb3IgKGk9c2l6ZW9mKGxpc3QpLTE7IGk+PTA7IGktLSkgewogICAgICBpZiAobWFwX2xkZmllZFtsaXN0W2ldXVswXVtQUk9QX0lEXT09aWQpIHsKICAgICAgICAgaWYgKCFtZW1iZXIobWFwX2xkZmllZFtsaXN0W2ldXVsxXSwgc3RyKSkgewogICAgICAgICAgICBtYXBfbGRmaWVkW2xpc3RbaV1dWzFdKz0oWyBzdHIgXSk7CiAgICAgICAgICAgIHJvb21zW2xpc3RbaV1dPShyb29tc1tsaXN0W2ldXXx8KFtdKSkrKFsgc3RyIF0pOwogICAgICAgICAgICB3cml0ZSgiUmF1bSBFcmZvbGdyZWljaCBlaW5nZXRyYWdlbiFcbiIpOwogICAgICAgICB9CiAgICAgICAgIGVsc2Ugd3JpdGUoIlJhdW0gYmVyZWl0cyBlaW5nZXRyYWdlbi5cbiIpOwogICAgICAgICBzYXZlKCk7CiAgICAgICAgIF9yZWZyZXNoKCk7CiAgICAgICAgIHJldHVybiAxOwogICAgICB9CiAgIH0KICAgd3JpdGUoIktyYXV0IG1pdCBpZCAiK2lkKyIgbmljaHQgZ2VmdW5kZW4uXG4iKTsKICAgcmV0dXJuIDE7Cn0KCmludCBfZGVscm9vbShzdHJpbmcgc3RyKQp7CiAgIGludCBpLCBkb25lOwogICBzdHJpbmcgKmxpc3Q7CgogICBpZiAoIWFsbG93ZWQoKSkgewogICAgICB3cml0ZSgiRnVlciBkYXMgTG9lc2NoZW4gdm9uIFJhZXVtZW4gd2VuZGUgRGljaCBkb2NoIGJpdHRlICIKICAgICAgICAgICAgImFuIGVpbmVuIEVNLlxuIik7CiAgICAgIHJldHVybiAxOwogICB9CiAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IGRlbHJvb20gPGZpbGVuYW1lPi5cbiIpOwogICBzdHI9UEwtPl91bnBhcnNlZF9hcmdzKCk7CiAgIGlmICghc3RyKSByZXR1cm4gMDsKICAgaWYgKHN0cls8Mi4uXT09Ii5jIikgc3RyPXN0clswLi48M107CiAgIGxpc3Q9bV9pbmRpY2VzKG1hcF9sZGZpZWQpOyBkb25lPTA7CiAgIGZvciAoaT1zaXplb2YobGlzdCktMTsgaT49MDsgaS0tKQogICB7CiAgICAgIGlmIChtZW1iZXIobWFwX2xkZmllZFtsaXN0W2ldXVsxXSwgc3RyKSkgewogICAgICAgICBtX2RlbGV0ZShtYXBfbGRmaWVkW2xpc3RbaV1dWzFdLCBzdHIpOwogICAgICAgICBtX2RlbGV0ZShyb29tc1tsaXN0W2ldXSwgc3RyKTsKICAgICAgICAgd3JpdGUoIlJhdW0gYmVpIGlkICIrbWFwX2xkZmllZFtsaXN0W2ldXVswXVtQUk9QX0lEXQogICAgICAgICAgICAgICArIiBhdXNnZXRyYWdlbi5cbiIpOwogICAgICAgICBkb25lPTE7CiAgICAgIH0KICAgfQogICBpZiAoIWRvbmUpIHsKICAgICAgaWYgKGZpbGVfc2l6ZShzdHIrIi5jIik8MCkKICAgICAgICAgd3JpdGUoIk5vIHN1Y2ggZmlsZSBcIiIrc3RyKyJcIi5cbiIpOwogICAgICBlbHNlIHdyaXRlKCJGdWVyICIrc3RyKyIgc2luZCBrZWluZSBLcmFldXRlciBlaW5nZXRyYWdlbiFcbiIpOwogICB9CiAgIGVsc2UgewogICAgICBzYXZlKCk7CiAgICAgIF9yZWZyZXNoKCk7CiAgIH0KICAgcmV0dXJuIDE7Cn0KCi8vIFZlcmFubGFzc3QgZGVuIEtyYWV1dGVyLVZDLCBlaW5lIHBoeXMuIERhdGVpIGF1cyBkZW4gS3JhZXV0ZXJkYXRlbiBlaW5lcwovLyBLcmF1dGVzIHp1IGVyemV1Z2VuLCBmYWxscyBtYW4gZGllc2UgYXVzYmVzY2hyZWliZW4gd2lsbC4KaW50IF9jcmVhdGVmaWxlKHN0cmluZyBzdHIpCnsKICBpbnQgaWQ7CiAgaWYgKCFhbGxvd2VkKCkpIHsKICAgIHdyaXRlKCJEaWVzZSBGdW5rdGlvbiB3dXJkZSBmdWVyIERpY2ggbmljaHQgZnJlaWdlZ2ViZW4hXG4iKTsKICAgIHJldHVybiAxOwogIH0KICBpZD10b19pbnQoc3RyKTsKICBpZiAodG9fc3RyaW5nKGlkKSE9c3RyIHx8IGlkPD0wIHx8IGlkPj1zaXplb2YoaWQya2V5KSkgewogICAgd3JpdGUoIklsbGVnYWwgcGxhbnRpZCAnIitzdHIrIicuXG4iKTsKICAgIHJldHVybiAxOwogIH0KICBub3RpZnlfZmFpbCgiVW5rbm93biBGdW5jdGlvbiBpbSBrcmFldXRlclZDOiBfY3JlYXRlZmlsZSgpXG4iKTsKICByZXR1cm4gY2FsbF9vdGhlcihLUkFFVVRFUlZDLCAiX2NyZWF0ZWZpbGUiLCBidWlsZF9wbGFudG5hbWUoa3JhdXRwcm9wc1tpZF0pKTsKfQoKLy8gQU46IEhpbGZzZnVua3Rpb25lbiwgZGVyemVpdCBlYmVuZmFsbHMgZGVha3RpdmllcnQuCi8vIGkgPSAwLi43LCBQb3NpdGlvbiBkZXMgS3JhdXRlcywgZnVlciBkYXMgZGVyIEF1ZnJ1ZiBlcmZvbGd0LCBpbiBkZXIgCi8vIExpc3RlIGRlciBpbiBkZW4gS2Vzc2VsIGVpbmZ1ZWxsdGVuIEtyYWV1dGVyLgovLyBrZXlMc3QgaXN0IGRpZSBMaXN0ZSBkZXIgS3JhZXV0ZXJncnVwcGVuLCBkZXIgZGllIEtyYWV1dGVyIHp1Z2VvcmRuZXQKLy8gc2luZC4KLy8gQW4gZGllc2VyIFN0ZWxsZSBrYW5uIGFsc28gZGllIFdpcmt1bmcgdm9uIEtyYWV1dGVyZ3J1cHBlbiBhYmdlaGFlbmd0Ci8vIHdlcmRlbi4gVW5rbGFyIGlzdCBtaXIgYWt0dWVsbCBudXIsIHdhcnVtIGRpZXNlIEZ1bmt0aW9uIGRlbiBQYXJhbWV0ZXIKLy8gImkiIGJlbm9ldGlnZW4gd3VlcmRlLgovLyBJZGVlOiBFcyBzb2xsIGRpZSBFbnRzY2hlaWR1bmcgZGF2b24gYWJoYWVuZ2lnIGdlbWFjaHQgd2VyZGVuIGtvZW5uZW4sCi8vIHdpZSBkaWUgR2VzYW10a29tYmluYXRpb24gYXVzc2llaHQsIHVuZCB6dXNhZXR6bGljaCBkYXZvbiwgYXVzIHdlbGNoZXIKLy8gR3J1cHBlIGRhcyBlaW56ZWxuZSBLcmF1dCBzdGFtbXQuCm5vbWFzayBwcml2YXRlIGludCBJc0Jsb2NrZWQoaW50IGksIHN0cmluZyAqa2V5THN0KQp7CiAgcmV0dXJuIDA7Cn0KCi8vIEFOOiBEaWVzZSBGdW5rdGlvbiBtdWVzc3RlIG5hY2ggZGVtIENvZGUgaW4gbWFrZV9wb3Rpb24oKSB6dSB1cnRlaWxlbgovLyAwIG9kZXIgMSB6dXJ1ZWNrZ2ViZW4sIGRhbm4gd2lyZCBkZXIgRWlnZW5zY2hhZnRzd2VydCBkZXIgS3JhZXV0ZXJncnVwcGUKLy8gdW0gZGVuIEZha3RvciAxLjUgdmVyc3RhZXJrdC4Kbm9tYXNrIHByaXZhdGUgaW50IElzQm9vc3RlZChpbnQgaSwgc3RyaW5nICprZXlMc3QpCnsKICByZXR1cm4gMDsKfQoKI2RlZmluZSBQUk5HICIvc3RkL3V0aWwvcmFuZC1nbGZzciIKLy8gSW5kaXZpZHVlbGxlIEJvbmkvTWFsaSBmdWVyIFNwaWVsZXIuIHBsb2Zmc2V0IHNvbGwgdmlhIFJlZmVyZW56IHVlYmVyZ2ViZW4KLy8gd2VyZGVuIHVuZCB3aXJkIHZvbiBkZXIgRnVua3Rpb24gZ2VzZXR6dC4KaW50IGNhbGN1bGF0ZV9tb2QoaW50IGtyYXV0aW5kZXgsIHN0cmluZyBwbG5hbWUsIGludCBwbG9mZnNldCkKewogIC8vIFN0YXJ0b2Zmc2V0IHp1ZmFlbGxpZyBlcm1pdHRlbHQsIGFiZXIgaW1tZXIgZ2xlaWNoCiAgLy8gZnVlciBqZWRlbiBTcGllbGVybmFtZW4KICBQUk5HLT5Jbml0V2l0aFVVSUQocGxuYW1lKTsKICBwbG9mZnNldCA9IFBSTkctPnJhbmRvbSgxNik7CiAgLy8gSmVkZXMgS3JhdXQgaGF0IGF1Y2ggZWluZW4gaU9mZnNldCAoZGVyIGtvbnN0YW50IGJsZWlidCB1bmQgc2ljaCBuaWNodAogIC8vIGFlbmRlcnQpLiBEZXIgd2lyZCBhdWNoIGFkZGllcnQuIEJlaSBVZWJlcnNjaHJlaXRlbiB2b24gMzAgd2lyZCBuYWNoIDAKICAvLyBnZXdyYXBwdC4KICAvLyBEZXIgT2Zmc2V0IGlzdCBkYW5uIChzcGllbGVyb2Zmc2V0ICsga3JhdXRpbmRleCkgJSAxNiwgZC5oLiBhbGxlIE1vZGlmaWthdG9yZW4gd2VyZGVuCiAgLy8gZGVyIFJlaWhlIG5hY2ggZHVyY2hsYXVmZW4uIFNvIGtyaWVndCBqZWRlciBTcGllbGVyIC0gZmFzdCBlZ2FsLCBiZWkgd2VsY2hlbQogIC8vIE9mZnNldCBlciBzdGFydGV0IC0gYXVjaCBkZXIgUmVpaGUgbmFjaCBhbGxlIEJvbmkrTWFsaS4KICBpbnQgb2Zmc2V0ID0gKChwbG9mZnNldCArIGtyYXV0aW5kZXgpICUgMTYpICogMjsKICAvLyBBbSBFbmRlIHdpcmQgZGFzIGdhbnplIG5vY2ggbmFjaCA4NSBiaXMgMTE1IHZlcmxlZ3QuCiAgcmV0dXJuIG9mZnNldCArIDg1Owp9CgojZGVmaW5lIFpXRUlUSUVTICIvc2VjdXJlL3p3ZWl0aWVzIgoKbWFwcGluZyBjYWxjdWxhdGVfcG90aW9uKGludCogcGxhbnRpZHMsIGludCogcXVhbGl0aWVzLCBzdHJpbmcgZmFtaWxpZSkKewogIC8vIE1hbiBzb2xsdGUgb2huZSBkaWUgS3JhZXV0ZXIgbmljaHQgc28gZWluZmFjaCBXaXJrdW5nZW4gYmVsaWViaWcKICAvLyBiZXJlY2huZW4ga29lbm5lbi4KICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiAhQVJDSF9TRUNVUklUWSkKICAgIHJldHVybiAwOwoKICAvLyBIaWVyIHNwZWljaGVybiB3aXIgdW5zZXIgRXJnZWJuaXMgYnp3LiB1bnNlciBad2lzY2hlbmVyZ2VibmlzLgogIG1hcHBpbmcgYXR0cmliOwogIC8vIEhpZXIgc3BlaWNoZXJuIHdpciBkaWUgV2lya2dydXBwZW4sIGRpZSBhdXMgZGVuIFBsYW50cyBnZXpvZ2VuIHdlcmRlbi4KICBtYXBwaW5nKiB3aXJrdW5nZW49KHt9KTsKICAvLyBIaWVyIHNwZWljaGVybiB3aXIgZ2xlaWNoIHNjaG9uIGJlaW0gRXJ6ZXVnZW4gZGllIHdpY2h0aWdzdGVuIEJsb2NrYWRlbi4KICBzdHJpbmcqIHVudGVyc3R1ZXR6dW5nZW49KHt9KTsKICBzdHJpbmcqIGJsb2NrYWRlbj0oe30pOwogIGludCB6dWZhbGw7CiAgLy8gRGllIFNvcnRpZXJ1bmcgbmFjaCBQbGFudElEIGlzdCBudXIgZnVlciBkYXMgVHJhbmtsb2cgd2ljaHRpZy4KICBwbGFudGlkcyA9IHNvcnRfYXJyYXkocGxhbnRpZHMsICMnPD0pOwoKICAvLyBQQVNTIDE6IFBmbGFuemVuIGR1cmNoIFdpcmt1bmdlbiBlcnNldHplbiwgZGFiZWkgVW50ZXJzdHVldHplcgogIC8vIHVuZCBCbG9ja2VyIG1lcmtlbi4KICBmb3JlYWNoIChpbnQgaWQsIGludCBxdWFsIDogbWttYXBwaW5nKHBsYW50aWRzLHF1YWxpdGllcykpCiAgICB7CiAgICAgIC8vZGVidWcoc3ByaW50ZigiR2VoZSBkdXJjaCBQbGFudDogJWQiLGlkKSk7CiAgICAgIHN0cmluZyBrZXk9aWQya2V5W2lkXTsKICAgICAgLy8gV2lya3VuZ2VuIGRpZXNlcyBLcmF1dHMga29waWVyZW4KICAgICAgbWFwcGluZyBpbmc9Y29weShpbmdyZWRpZW50c1trZXldKTsKICAgICAgLy9kZWJ1ZyhzcHJpbnRmKCIlTyIsaW5nKSk7CiAgICAgIC8vIFp1IGRlbiBXaXJrdW5nZW4gbm9jaCBkZW4gS2V5IGhpbnp1ZnVlZ2VuLgogICAgICBpbmdbImtleSJdPWtleTsKICAgICAgLy8gRGllIFF1YWxpdGFldCBkZXMgS3JhdXRlcyB3aXJkIG5vY2ggbWl0IGRlbSBzcGllbGVyaW5kaXZpZHVlbGxlbgogICAgICAvLyBNb2RpZmlrYXRvciBza2FsaWVydC4KICAgICAgaW5nWyJxdWFsaXR5Il09KHF1YWwgKiBjYWxjdWxhdGVfbW9kKGlkLCBmYW1pbGllLCAmenVmYWxsKSkgLyAxMDA7CiAgICAgIHdpcmt1bmdlbis9KHtpbmd9KTsKICAgICAgaWYgKHBvaW50ZXJwKGluZ1tUX1NVUFBPUlRFUl0pKQogICAgICAgIHsKICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBwaTppbmdbVF9TVVBQT1JURVJdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgdW50ZXJzdHVldHp1bmdlbis9KHtwaX0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICBpZiAocG9pbnRlcnAoaW5nW1RfQkxPQ0tJTkddKSkKICAgICAgICB7CiAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgcGk6aW5nW1RfQkxPQ0tJTkddKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgYmxvY2thZGVuKz0oe3BpfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGRlYnVnKHNwcmludGYoIktyYXV0ICVzIGVyZ2lidCBXZXJ0ZSAlTy4iLGtleSx3aXJrdW5nZW4pKTsKICAgIH0KICAvLyBQQVNTIDI6IEpldHp0IGRpZSBVbnRlcnN0dWV0enVuZ2VuIGF1c3dlcnRlbgogIGZvcmVhY2ggKG1hcHBpbmcgbWFyOndpcmt1bmdlbikKICAgIHsKICAgICAgZm9yZWFjaCAoc3RyaW5nIHBpOnVudGVyc3R1ZXR6dW5nZW4pCiAgICAgICAgewogICAgICAgICAgLy8gSGFiZW4gd2lyIGVpbmUgVW50ZXJzdHVldHp1bmc/CiAgICAgICAgICBpZiAobWFyWyJrZXkiXT09cGkgfHwgKChwaVsxXT09JyonKSAmJiAocGlbMF09PW1hclsia2V5Il1bMF0pKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGRlYnVnIChzcHJpbnRmKCJtYXI9JU8sIHBpPSVPIixtYXIscGkpKTsKICAgICAgICAgICAgICAvLyBBTExFIFpBSExFTiBtYWwgMS41IG5laG1lbi4gTWlyIGlzdCBrbGFyLCBkYXNzIGRhcyBudW4gYXVjaAogICAgICAgICAgICAgIC8vIG1pdCBpcmdlbmR3ZWxjaGVuIEhhZXVmaWdrZWl0ZW4gcGFzc2llcnQsIGFiZXIgbWFsIGVocmxpY2gsCiAgICAgICAgICAgICAgLy8gZGFzIGlzdCB6dXIgQmVyZWNobnVuZyBlZ2FsLgogICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBraywgbWl4ZWQgdmFsIDogJm1hcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgaWYgKGludHAodmFsKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICB2YWw9MTUqdmFsLzEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAvLyBQQVNTIDM6IEpldHp0IGRpZSBCbG9ja2FkZW4gYXVzd2VydGVuCiAgZm9yZWFjaCAobWFwcGluZyBtYXI6d2lya3VuZ2VuKQogICAgewogICAgICBmb3JlYWNoIChzdHJpbmcgcGk6YmxvY2thZGVuKQogICAgICAgIHsKICAgICAgICAgIC8vIEhhYmVuIHdpciBlaW5lIEJsb2NrYWRlPwogICAgICAgICAgaWYgKG1hclsia2V5Il09PXBpIHx8ICgocGlbMV09PScqJykgJiYgKHBpWzBdPT1tYXJbImtleSJdWzBdKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBkZWJ1ZyAoc3ByaW50ZigibWFyPSVPLCBwaT0lTyIsbWFyLHBpKSk7CiAgICAgICAgICAgICAgLy8gSGllciB3ZXJkZW4gYWxsZSBaYWhsZW4gYXVmIE51bGwgZ2VzZXR6dC4KICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcga2ssIG1peGVkIHZhbCA6ICZtYXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGlmIChpbnRwKHZhbCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgdmFsPTA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAvLyBQQVNTIDMuNTogUXVhbGl0YWV0IGRlciBLcmFldXRlciBza2FsaWVyZW4uCiAgZm9yZWFjaCAobWFwcGluZyBtYXI6d2lya3VuZ2VuKQogICAgewogICAgICBmb3JlYWNoIChzdHJpbmcga2ssIG1peGVkIHZhbCA6ICZtYXIpCiAgICAgICAgewogICAgICAgICAgaWYgKGludHAodmFsKSAmJiBrayE9InF1YWxpdHkiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgdmFsPXZhbCptYXJbInF1YWxpdHkiXS8xMDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogIC8vIFBBU1MgNDogTnVuIGFkZGllcmVuIHdpciBhbGxlcyBhdWYgaW4gZGFzIE1hcHBpbmcgYXR0cmliLgogIGF0dHJpYj0oW10pOwogIGZvcmVhY2ggKG1hcHBpbmcgbWFyOndpcmt1bmdlbikKICAgIHsKICAgICAgZm9yZWFjaCAoc3RyaW5nIGtrOm1hcikKICAgICAgICB7CiAgICAgICAgICBpZiAoaW50cChtYXJba2tdKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGF0dHJpYltra109YXR0cmliW2trXSttYXJba2tdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAvLyBEaWUgV2lya3VuZ3NkYXVlciBpc3QgZGVyIER1cmNoc2Nobml0dCBkZXIgV2lya3VuZ3NkYXVlcm4KICBhdHRyaWJbVF9FRkZFQ1RfRFVSQVRJT05dIC89IHNpemVvZihwbGFudGlkcyk7CiAgZGVidWcoc3ByaW50ZigiRHVyYXRpb246ICVkXG4iLGF0dHJpYltUX0VGRkVDVF9EVVJBVElPTl0pKTsKCiAgLy8gRGllIEhhbHRiYXJrZWl0IGRlcyBUcmFua3MgaXN0IGRpZSBIYWx0YmFya2VpdCBkZXMga2xlaW5zdGVuIEtyYXV0ZXMuCiAgaW50IGR1cj0xMDAwMDAwMDsKICBmb3JlYWNoIChtYXBwaW5nIG1hcjp3aXJrdW5nZW4pCiAgICB7CiAgICAgIGlmIChtYXJbVF9FWFBJUkVdPjAgJiYgZHVyPm1hcltUX0VYUElSRV0pCiAgICAgICAgewogICAgICAgICAgZHVyPW1hcltUX0VYUElSRV07CiAgICAgICAgfQogICAgfQogIGlmIChkdXI9PTEwMDAwMDAwKQogICAgewogICAgICBkdXI9MDsKICAgIH0KICBhdHRyaWJbVF9FWFBJUkVdPWR1cjsKICBkZWJ1ZyhzcHJpbnRmKCJFeHBpcmU6ICVkXG4iLGR1cikpOwoKICBpbnQgbWF4aW11bT0wOwogIC8vIEVmZmVrdGUgcmF1c3JlY2huZW4sIGRpZSBuaWNodCBtYXhpbWFsIHNpbmQKICBmb3JlYWNoIChzdHJpbmcga2ssIG1peGVkIHZhbDphdHRyaWIpCiAgewogICAgaWYgKG1lbWJlcihUX0tSQVVUX0VGRkVDVFMsa2spPj0wKQogICAgewogICAgICBpZiAodmFsPjAgJiYgbWF4aW11bTx2YWwpCiAgICAgIHsKICAgICAgICBtYXhpbXVtPXZhbDsKICAgICAgfQogICAgfQogIH0KICAvLyBMb2dlaW50cmFnIGVyc3RlbGxlbi4KICBzbF9leGVjKCJJTlNFUlQgSU5UTyByb2hkYXRlbih1aWQsIHJuZCwgcmVjZWlwZSwgcXVhbGl0eSwgY2FyLCBkYSwgZG0sIGR1LCAiCiAgICAgICAgICAiZG4sIGZsdCwgZnJvLCBoSSwgaFAsIGhLLCBoTCwgcGEsIHBtLCBwdSwgc3MsIHNwLCBzZCkgIgogICAgICAgICAgIlZBTFVFUyg/MSw/Miw/Myw/NCw/NSw/Niw/Nyw/OCw/OSw/MTAsPzExLCA/MTIsID8xMywgPzE0LCAiCiAgICAgICAgICAiPzE1LCA/MTYsID8xNywgPzE4LCA/MTksID8yMCwgPzIxKTsiLAogICAgICAgICAgdGhpc19wbGF5ZXIoKSA/IGdldHVpZCh0aGlzX3BsYXllcigpKSA6ICI8dW5rbm93bj4iLAogICAgICAgICAgenVmYWxsLAogICAgICAgICAgaW1wbG9kZShtYXAocGxhbnRpZHMsICMndG9fc3RyaW5nKSwgIiwgIiksCiAgICAgICAgICBpbXBsb2RlKG1hcChxdWFsaXRpZXMsICMndG9fc3RyaW5nKSwgIiwgIiksCiAgICAgICAgICBhdHRyaWJbVF9DQVJSWV0sIGF0dHJpYltUX0RBTUFHRV9BTklNQUxTXSwKICAgICAgICAgIGF0dHJpYltUX0RBTUFHRV9NQUdJQ10sIGF0dHJpYltUX0RBTUFHRV9VTkRFQURdLAogICAgICAgICAgYXR0cmliW1RfRUZGRUNUX0RVUkFUSU9OXSwgYXR0cmliW1RfRkxFRV9UUE9SVF0sCiAgICAgICAgICBhdHRyaWJbVF9GUk9HXSwgYXR0cmliW1RfSEVBTF9ESVNFQVNFXSwKICAgICAgICAgIGF0dHJpYltUX0hFQUxfUE9JU09OXSwgYXR0cmliW1RfSEVBTF9TUF0sCiAgICAgICAgICBhdHRyaWJbVF9IRUFMX0xQXSwgYXR0cmliW1RfUFJPVEVDVElPTl9BTklNQUxTXSwKICAgICAgICAgIGF0dHJpYltUX1BST1RFQ1RJT05fTUFHSUNdLCBhdHRyaWJbVF9QUk9URUNUSU9OX1VOREVBRF0sCiAgICAgICAgICBhdHRyaWJbVF9TQV9TUEVFRF0sIGF0dHJpYltUX1NBX1NQRUxMX1BFTkVUUkFUSU9OXSwKICAgICAgICAgIGF0dHJpYltUX1NBX0RVUkFUSU9OXSk7CgogIC8vIE1heGltYWwgendlaSBwb3NpdGl2ZSBFZmZla3RlLgogIGludCBjdGVmZj0wOwogIGZvcmVhY2ggKHN0cmluZyBraywgbWl4ZWQgdmFsIDogJmF0dHJpYikKICB7CiAgICAgIGlmIChtZW1iZXIoVF9LUkFVVF9FRkZFQ1RTLGtrKT49MCkKICAgICAgewogICAgICAgIC8vIE51ciBkaWUgMiBzdGFlcmtzdGVuIHBvc2l0aXZlbiBXaXJrdW5nZW4gYmxlaWJlbiB1ZWJlciAoZGF6dQogICAgICAgIC8vIG11ZXNzZW4gc2llIHdpcmtsaWNoIGRlbiBnbGVpY2hlbiBaYWhsZW53ZXJ0IGhhYmVuLCBrYW5uIGJlaQogICAgICAgIC8vIEhlaWx1bmdlbiB2b3Jrb21tZW4sIHNvbnN0IGVoZXIgdW53YWhyc2NoZWlubGljaCkuCiAgICAgICAgaWYgKHZhbD4wICYmIG1heGltdW0+dmFsKQogICAgICAgIHsKICAgICAgICAgIHZhbD0wOwogICAgICAgIH0KICAgICAgICAvLyBUaHJlc2hvbGRzLiBadSB6dSBncm9zc2UgV2lya3VuZ2VuIGhhYmVuIGRpZSBHcmVuemUgYWxzCiAgICAgICAgLy8gQXVzd2lya3VuZy4gTmVnYXRpdmUgV2lya3VuZ2VuLCBkaWUgLVRfTUlOSU1VTV9USFJFU0hPTEQgbmljaHQKICAgICAgICAvLyB1ZWJlcnNjaHJlaWJlbiwgZmFsbGVuIHdlZy4gQmVpIGRlbiBwb3NpdGl2ZW4gYmxlaWJ0IGphIG9obmVoaW4gbnVyCiAgICAgICAgLy8gZGllIHN0YWVya3N0ZSBXaXJrdW5nIHVlYmVyLCBkYSBnaWJ0IGVzIGVyc3RtYWwga2VpbmUKICAgICAgICAvLyBNaW5kZXN0Z3JvZXNzZSBtZWhyLgogICAgICAgIGlmICh2YWw+VF9NQVhJTVVNX1RIUkVTSE9MRCkKICAgICAgICB7CiAgICAgICAgICB2YWw9VF9NQVhJTVVNX1RIUkVTSE9MRDsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbCA8IDAgJiYgdmFsID4gLVRfTUlOSU1VTV9USFJFU0hPTEQpCiAgICAgICAgewogICAgICAgICAgdmFsPTA7CiAgICAgICAgfQogICAgICAgIGlmIChtYXhpbXVtPT12YWwgJiYgdmFsPjApCiAgICAgICAgewogICAgICAgICAgY3RlZmYrKzsKICAgICAgICAgIC8vIFZvZWxsaWcgd2lsbGt1ZXJsaWNoLCB3YXMgaGllciBnZXRyb2ZmZW4gd2lyZC4gT2IgcmVwcm9kdXppZXJiYXIsCiAgICAgICAgICAvLyB2ZXJtdXRsaWNoIGphLCBhYmVyIGhhZW5ndCBtaXQgZGVyIE1hcHBpbmdzdHJ1a3R1ciB6dXNhbW1lbi4KICAgICAgICAgIC8vIEhhcmhhci4KICAgICAgICAgIGlmIChjdGVmZj4yKQogICAgICAgICAgewogICAgICAgICAgICB2YWw9MDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICB9CiAgZGVidWcoc3ByaW50ZigiIFRSQU5LRVJHRUJOSVM6ICVPIixhdHRyaWIpKTsKICAvLyBMb2dlaW50cmFnIGVyc3RlbGxlbi4KICBzbF9leGVjKCJJTlNFUlQgSU5UTyB0cmFlbmtlKHVpZCwgcm5kLCByZWNlaXBlLCBxdWFsaXR5LCBjYXIsIGRhLCBkbSwgZHUsICIKICAgICAgICAgICJkbiwgZmx0LCBmcm8sIGhJLCBoUCwgaEssIGhMLCBwYSwgcG0sIHB1LCBzcywgc3AsIHNkKSAiCiAgICAgICAgICAiVkFMVUVTKD8xLD8yLD8zLD80LD81LD82LD83LD84LD85LD8xMCw/MTEsID8xMiwgPzEzLCA/MTQsICIKICAgICAgICAgICI/MTUsID8xNiwgPzE3LCA/MTgsID8xOSwgPzIwLCA/MjEpOyIsCiAgICAgICAgICB0aGlzX3BsYXllcigpID8gZ2V0dWlkKHRoaXNfcGxheWVyKCkpIDogIjx1bmtub3duPiIsCiAgICAgICAgICB6dWZhbGwsCiAgICAgICAgICBpbXBsb2RlKG1hcChwbGFudGlkcywgIyd0b19zdHJpbmcpLCAiLCAiKSwKICAgICAgICAgIGltcGxvZGUobWFwKHF1YWxpdGllcywgIyd0b19zdHJpbmcpLCAiLCAiKSwKICAgICAgICAgIGF0dHJpYltUX0NBUlJZXSwgYXR0cmliW1RfREFNQUdFX0FOSU1BTFNdLAogICAgICAgICAgYXR0cmliW1RfREFNQUdFX01BR0lDXSwgYXR0cmliW1RfREFNQUdFX1VOREVBRF0sCiAgICAgICAgICBhdHRyaWJbVF9FRkZFQ1RfRFVSQVRJT05dLCBhdHRyaWJbVF9GTEVFX1RQT1JUXSwKICAgICAgICAgIGF0dHJpYltUX0ZST0ddLCBhdHRyaWJbVF9IRUFMX0RJU0VBU0VdLAogICAgICAgICAgYXR0cmliW1RfSEVBTF9QT0lTT05dLCBhdHRyaWJbVF9IRUFMX1NQXSwKICAgICAgICAgIGF0dHJpYltUX0hFQUxfTFBdLCBhdHRyaWJbVF9QUk9URUNUSU9OX0FOSU1BTFNdLAogICAgICAgICAgYXR0cmliW1RfUFJPVEVDVElPTl9NQUdJQ10sIGF0dHJpYltUX1BST1RFQ1RJT05fVU5ERUFEXSwKICAgICAgICAgIGF0dHJpYltUX1NBX1NQRUVEXSwgYXR0cmliW1RfU0FfU1BFTExfUEVORVRSQVRJT05dLAogICAgICAgICAgYXR0cmliW1RfU0FfRFVSQVRJT05dKTsKCiAgcmV0dXJuIGF0dHJpYjsKfQoKbWFwcGluZyBtYWtlX3BvdGlvbihvYmplY3QqIHBsYW50cykKewogIC8vIC0+IG1hcHB0IG5pY2h0LU9iamVrdCB6dSAwLCBhYmVyIDAgaXN0IGF1Y2ggbmUgZ3VlbHRpZ2UgUGxhbnRJRC4gRGFoZXIKICAvLyBt/HNzZW4gemVyc3RvZXJ0ZW4gT2JqZWt0ZSB2b3JoZXIgcmF1cy4KICAvLyBUT0RPOiBkcmF1ZiB2ZXJsYXNzZW4sIGRhc3MgbnVyIGludGFrdGUgT2JqZWt0IGVudGhhbHRlbiBzaW5kPwogIGlmIChtZW1iZXIocGxhbnRzLCAwKSA+PSAwKQogICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigibWFrZV9wb3Rpb24oKSBnb3QgaW52YWxpZCBvYmplY3QgaW4gcGxhbnQgYXJyYXkgIgogICAgICAgICAgICAgICAgICAgICAgICAiJS41ME9cbiIscGxhbnRzKSk7CgogIGludCogcGxhbnRpZHMgPSAoaW50KilwbGFudHMtPlF1ZXJ5UGxhbnRJZCgpOwogIGludCogcXVhbGl0aWVzID0gKGludCopcGxhbnRzLT5RdWVyeVByb3AoUF9RVUFMSVRZKTsKCiAgcmV0dXJuIGNhbGN1bGF0ZV9wb3Rpb24ocGxhbnRpZHMsIHF1YWxpdGllcywKICAgICAgICAgICAgICAgICAgICAgICAgICBaV0VJVElFUy0+UXVlcnlGYW1pbGllKHRoaXNfcGxheWVyKCkpKTsKfQoKLy8gQU46IFN1Y2h0IGFsbGUgUGZsYW56ZW4gcmF1cywgaW4gZGVyZW4gTmFtZW4gZGVyIFN1Y2hiZWdyaWZmICJzdHIiCi8vIHZvcmtvbW10IHVuZCBsaXN0ZXQgZGllc2UgYXVmLiBMYWV1ZnQgYWxsZXJkaW5ncyBtb21lbnRhbiBub2NoIGluIGVpbmVuCi8vIEZlaGxlciAiaW5kZXggb3V0IG9mIGJvdW5kcyIsIGFiZXIgbWFuIG11ZXNzdGUgaGllciAoVE9ETykgc293aWVzbyBtYWwKLy8gdm9uIGV4cGxvZGUoKSBhdWYgc3Ryc3RyKCkgdW1iYXVlbiwgZGVua2UgaWNoLgpzdHJpbmcgX2ZpbmRwbGFudChzdHJpbmcgc3RyKSB7CiAgaW50IGksIGs7CiAgc3RyaW5nICppbmQsICp0bXA7CgogIGlmKCFzdHIpIHJldHVybiAiIjsKICB3cml0ZSgiU3VjaGUgbmFjaCAnIitzdHIrIic6XG5cbiIpOwogIGluZCA9IG1faW5kaWNlcyhtYXBfbGRmaWVkKTsKICBmb3IoaT0wO2k8c2l6ZW9mKGluZCk7aSsrKSB7CiAgICB0bXAgPSBtYXBfbGRmaWVkW2luZFtpXV1bMF07CiAgICBpZiggc3RyaW5ncCh0bXBbM10pICYmIAogICAgICAgIG9sZF9leHBsb2RlKGxvd2VyX2Nhc2UodG1wWzNdKSxzdHIpWzBdICE9IGxvd2VyX2Nhc2UodG1wWzNdKSAKICAgICAgICB8fAogICAgICAgIHN0cmluZ3AodG1wWzRdKSAmJiAKICAgICAgICBvbGRfZXhwbG9kZShsb3dlcl9jYXNlKHRtcFs0XSksc3RyKVswXSAhPSBsb3dlcl9jYXNlKHRtcFs0XSkpCiAgICAgIHdyaXRlKCIgLSAgIit0bXBbM10rCiAgICAgICAgICAoc3RyaW5ncCh0bXBbNF0pPyIgKCIrdG1wWzRdKyIpIjoiIikrIiAgICAgICAtICIrdG1wWzBdKyJcbiIpOwogIH0KCiAgcmV0dXJuICIiOwp9CgovLyBBTjogRnVua3Rpb24gbGllZmVydCBkYXMgRXJnZWJuaXNhcnJheSBhdXMgbWFrZV9wb3Rpb24oKSBmdWVyIGVpbmUgTGlzdGUKLy8gdm9uIEtyYWV1dGVybiwgZGllIGFscyAiLCAiLWdldHJlbm50ZSBLcmF1dC1JRHMgdWViZXJnZWJlbiB3ZXJkZW4gbXVlc3Nlbi4KbWl4ZWQgX2NoZWNrVHJhbmsoc3RyaW5nIHN0cikKewogIGlmIChleHRlcm5fY2FsbCgpICYmICFhbGxvd2VkKCkpCiAgICByZXR1cm4gMDsKCiAgc3RyaW5nICppbmQsICphcmdzLCBuYW1lOwogIG9iamVjdCAqb2JqczsKICBpbnQgaywgbDsKCiAgb2JqcyA9ICh7fSk7CiAgaWYoIXN0cikgcmV0dXJuICJLZWluZSBLcmFldXRlciB1ZWJlcmdlYmVuISI7CiAgaW5kID0gb2xkX2V4cGxvZGUoc3RyLCIsIik7Ci8vICBpbmQgPSAoeyIxODAiLCIxMSIsIjUzIn0pOwogIGZvcihpbnQgaT0wO2k8c2l6ZW9mKGluZCk7aSsrKQogIHsKICAgIG5hbWUgPSBidWlsZF9wbGFudG5hbWUoa3JhdXRwcm9wc1t0b19pbnQoaW5kW2ldKV0pOwogICAgd3JpdGUoIklucHV0OiAnIituYW1lKyInICgiK2luZFtpXSsiKVxuIik7CiAgICBvYmpzICs9ICh7Y2xvbmVfb2JqZWN0KFBMQU5URElSK25hbWUpfSk7CiAgfQogIG1hcHBpbmcgcmFndGVzdCA9IG1ha2VfcG90aW9uKG9ianMpOwogIG9ianMtPnJlbW92ZSgpOwovKiAgbmFtZT0iIjsKICBmb3IoaW50IGk9MDtpPHNpemVvZihyYWd0ZXN0KTtpKyspCiAgICAgICBuYW1lID0gbmFtZSArIHJhZ3Rlc3RbaV0rIiwiOwogIHdyaXRlKCJSZXN1bHQ6ICh7ICIrbmFtZSsiIH0pXG4iKTsqLwogIHJldHVybiBzcHJpbnRmKCIlT1xuIixyYWd0ZXN0KTsKfQoKI2RlZmluZSBRVUFMX0JBU0UgIDAKI2RlZmluZSBRVUFMX1JORCAgIDEKI2RlZmluZSBERUxBWV9CQVNFIDIKI2RlZmluZSBERUxBWV9STkQgIDMKCiNkZWZpbmUgQUxMT1dFRF9EUklFUiAiL2l0ZW1zL2tyYWV1dGVyL3Ryb2NrbmVyIgoKLy8gTGllZmVydCBkaWUgVHJvY2tudW5nc2RhdGVuIGVpbmVzIFJhdW1lcyBhdXMsIG1pdCBkZW5lbiBkZXIgS3JhZXV0ZXItCi8vIHRyb2NrbmVyIGRhbm4gZGFzIEtyYXV0IGJlYXJiZWl0ZW4ga2Fubi4KaW50ICpRdWVyeURyeWluZ0RhdGEoKSB7CiAgLy8gRXMgbXVzcyBhbGxlcmRpbmdzIGRhcyBhdWZydWZlbmRlIE9iamVrdCBlaW4gVHJvY2tuZXItQ2xvbmUgc2VpbiwgCiAgLy8gZGVyIGluIGVpbmVtIGRlciB6dWdlbGFzc2VuZW4gUmFldW1lIHN0ZWhlbiBtdXNzLgogIC8vIFdlbm4gZGFzIG5pY2h0IGRlciBGYWxsIGlzdCwgd2lyZCBkZXIgVHJvY2tuZXIgZGFzIGxlZXJlIEFycmF5LCBkYXMgCiAgLy8genVydWVja2dlZ2ViZW4gd2lyZCwgYWxzIEluZGl6IHdlcnRlbiwgZGFzcyBlciBpbSBmYWxzY2hlbiBSYXVtIHN0ZWh0LgogIGlmICggb2JqZWN0cChwcmV2aW91c19vYmplY3QoKSkgJiYKICAgICAgIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgPT0gQUxMT1dFRF9EUklFUiAmJgogICAgICAgbWVtYmVyKGRyeWluZ19kYXRhLCBsb2FkX25hbWUoZW52aXJvbm1lbnQocHJldmlvdXNfb2JqZWN0KCkpKSkgJiYKICAgICAgIGNsb25lcChwcmV2aW91c19vYmplY3QoKSkgKQogIHsKICAgIC8vIFJhdW0gZXJtaXR0ZWxuLCBEZWxheS9RdWFsaSBlcnJlY2huZW4sIEVyZ2VibmlzYXJyYXkgenVydWVja2dlYmVuLgogICAgc3RyaW5nIHdoZXJlID0gbG9hZF9uYW1lKGVudmlyb25tZW50KHByZXZpb3VzX29iamVjdCgpKSk7CiAgICBpbnQgZGVsYXkgPSBkcnlpbmdfZGF0YVt3aGVyZSxERUxBWV9CQVNFXSsKICAgICAgICAgICAgICAgIHJhbmRvbShkcnlpbmdfZGF0YVt3aGVyZSxERUxBWV9STkRdKTsKICAgIGludCBxdWFsICA9IGRyeWluZ19kYXRhW3doZXJlLFFVQUxfQkFTRV0rCiAgICAgICAgICAgICAgICByYW5kb20oZHJ5aW5nX2RhdGFbd2hlcmUsUVVBTF9STkRdKTsKICAgIHJldHVybiAoeyBkZWxheSwgcXVhbCB9KTsKICB9CiAgcmV0dXJuICh7fSk7Cn0KCi8vIE1vZGlmaXppZXJlbiBkZXIgVHJvY2tudW5nc2RhdGVuLgovLyA8cm9vbT4gbXVzcyBkZXIgdm9sbGUgRGF0ZWluYW1lIGRlcyBSYXVtZXMgc2Vpbiwgb2huZSAuYyBhbSBFbmRlLgovLyA8dmFsdWVzPiBlbnRoYWVsdCBkaWUgdmllciBQYXJhbWV0ZXIgenUgZGVtIFJhdW0gaW4gZm9sZ2VuZGVyIFJlaWhlbmZvbGdlOgovLyAoeyBRdWFsaS1CYXNpcywgUXVhbGktWnVmYWxsc2FudGVpbCwgRGVsYXktQmFzaXMsIERlbGF5LVp1ZmFsbHNhbnRlaWwgfSkKLy8gV2VubiA8dmFsdWVzPiBuaWNodCBhbmdlYmVuIHdpcmQgb2RlciAwIGlzdCwgd2VyZGVuIGRpZSBEYXRlbiB6dSA8cm9vbT4KLy8gZ2Vsb2VzY2h0LgppbnR8bWFwcGluZyBTZXREcnlpbmdEYXRhKHN0cmluZyByb29tLCBpbnQqIHZhbHVlcykgCnsKICAvLyBrZWluZSBadWdyaWZmc3JlY2h0ZQogIGlmICggIWFsbG93ZWQoKSApCiAgICByZXR1cm4gLTE7CiAgCiAgLy8gPHZhbHVlcz4gd3VyZGUgbmljaHQgdWViZXJnZWJlbj8gRGFubiBEYXRlbiBsb2VzY2hlbi4KICBpZiAoICF2YWx1ZXMgKSAKICB7CiAgICBtX2RlbGV0ZShkcnlpbmdfZGF0YSwgcm9vbSk7CiAgICByZXR1cm4gMTsKICB9CgogIC8vIEFuc29uc3RlbiBtdWVzc2VuIDQgSW50ZWdlci1XZXJ0ZSBhbHMgPHZhbHVlcz4gdWViZXJnZWJlbiB3ZXJkZW4uCiAgaWYgKCBzaXplb2YodmFsdWVzKSAhPSA0ICkgCiAgICByZXR1cm4gLTI7CgogIGlmICggcm9vbVs8Mi4uPDFdID09ICIuYyIgKQogICAgcm9vbSA9IHJvb21bLi48M107CgogIC8vIFVlYmVyZ2ViZW5lIERhdGVuIGFlbmRlcm4gZGlyZWt0IGRhcyBNYXBwaW5nIGRlciBUcm9ja251bmdzZGF0ZW4uCiAgbV9hZGQoZHJ5aW5nX2RhdGEsIHJvb20sIHZhbHVlcy4uLik7CiAgc2F2ZSgpOwogIHJldHVybiAoWyByb29tIDogZHJ5aW5nX2RhdGFbcm9vbSwwXTsgZHJ5aW5nX2RhdGFbcm9vbSwxXTsgCiAgICAgICAgICAgICAgICAgICBkcnlpbmdfZGF0YVtyb29tLDJdOyBkcnlpbmdfZGF0YVtyb29tLDNdXSk7Cn0KCnZhcmFyZ3MgbWFwcGluZyBRdWVyeURyeWluZygpCnsKICByZXR1cm4gKGFsbG93ZWQoKSA/IGRyeWluZ19kYXRhIDogKFtdKSApOwp9Cgp2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkgCnsKICBzYXZlKCk7CiAgcmV0dXJuIDo6cmVtb3ZlKHNpbGVudCk7Cn0KCi8qCiNkZWZpbmUgRFJZSU5HREFUQSAiL3NlY3VyZS9BUkNIL2tyYWV1dGVydHJvY2tudW5nc2RhdGVuIgoKcHJpdmF0ZSB2b2lkIFJlYWREcnlpbmdEYXRhKCkgCnsKICBtaXhlZCBkYXRhID0gZXhwbG9kZShyZWFkX2ZpbGUoRFJZSU5HREFUQSksICJcbiIpLSh7IiJ9KTsKICBmb3JlYWNoKHN0cmluZyBsaW5lIDogZGF0YSkgCiAgewogICAgaWYgKCBsaW5lWzBdID09ICcjJyApCiAgICAgIGNvbnRpbnVlOwogICAgc3RyaW5nICpmaWVsZHMgPSBleHBsb2RlKGxpbmUsIjsiKTsKICAgIGZpZWxkc1sxLi5dID0gbWFwKGZpZWxkc1sxLi5dLCAjJ3RvX2ludCk7CiAgICBtX2FkZCh0bXBfZHJ5aW5nX2RhdGEsIGZpZWxkcy4uLik7CiAgfQp9Ki8KCg==