LyogR1NTQVBJL2tyYjUgc3VwcG9ydCBmb3IgRlRQIC0gbG9vc2VseSBiYXNlZCBvbiBvbGQga3JiNC5jCiAqCiAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIENvcHlyaWdodCAoYykgMjAwNCAtIDIwMTcgRGFuaWVsIFN0ZW5iZXJnCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLiAgKi8KCiNpbmNsdWRlICJjdXJsX3NldHVwLmgiCgojaWYgZGVmaW5lZChIQVZFX0dTU0FQSSkgJiYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0ZUUCkKCiNpZmRlZiBIQVZFX05FVERCX0gKI2luY2x1ZGUgPG5ldGRiLmg+CiNlbmRpZgoKI2luY2x1ZGUgInVybGRhdGEuaCIKI2luY2x1ZGUgImN1cmxfYmFzZTY0LmgiCiNpbmNsdWRlICJmdHAuaCIKI2luY2x1ZGUgImN1cmxfZ3NzYXBpLmgiCiNpbmNsdWRlICJzZW5kZi5oIgojaW5jbHVkZSAiY3VybF9zZWMuaCIKI2luY2x1ZGUgIndhcm5sZXNzLmgiCgovKiBUaGUgbGFzdCAzICNpbmNsdWRlIGZpbGVzIHNob3VsZCBiZSBpbiB0aGlzIG9yZGVyICovCiNpbmNsdWRlICJjdXJsX3ByaW50Zi5oIgojaW5jbHVkZSAiY3VybF9tZW1vcnkuaCIKI2luY2x1ZGUgIm1lbWRlYnVnLmgiCgpzdGF0aWMgaW50CmtyYjVfaW5pdCh2b2lkICphcHBfZGF0YSkKewogIGdzc19jdHhfaWRfdCAqY29udGV4dCA9IGFwcF9kYXRhOwogIC8qIE1ha2Ugc3VyZSBvdXIgY29udGV4dCBpcyBpbml0aWFsaXplZCBmb3Iga3JiNV9lbmQuICovCiAgKmNvbnRleHQgPSBHU1NfQ19OT19DT05URVhUOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmtyYjVfY2hlY2tfcHJvdCh2b2lkICphcHBfZGF0YSwgaW50IGxldmVsKQp7CiAgKHZvaWQpYXBwX2RhdGE7IC8qIHVudXNlZCAqLwogIGlmKGxldmVsID09IFBST1RfQ09ORklERU5USUFMKQogICAgcmV0dXJuIC0xOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmtyYjVfZGVjb2RlKHZvaWQgKmFwcF9kYXRhLCB2b2lkICpidWYsIGludCBsZW4sCiAgICAgICAgICAgIGludCBsZXZlbCBVTlVTRURfUEFSQU0sCiAgICAgICAgICAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiBVTlVTRURfUEFSQU0pCnsKICBnc3NfY3R4X2lkX3QgKmNvbnRleHQgPSBhcHBfZGF0YTsKICBPTV91aW50MzIgbWFqLCBtaW47CiAgZ3NzX2J1ZmZlcl9kZXNjIGVuYywgZGVjOwoKICAodm9pZClsZXZlbDsKICAodm9pZCljb25uOwoKICBlbmMudmFsdWUgPSBidWY7CiAgZW5jLmxlbmd0aCA9IGxlbjsKICBtYWogPSBnc3NfdW53cmFwKCZtaW4sICpjb250ZXh0LCAmZW5jLCAmZGVjLCBOVUxMLCBOVUxMKTsKICBpZihtYWogIT0gR1NTX1NfQ09NUExFVEUpIHsKICAgIGlmKGxlbiA+PSA0KQogICAgICBzdHJjcHkoYnVmLCAiNTk5ICIpOwogICAgcmV0dXJuIC0xOwogIH0KCiAgbWVtY3B5KGJ1ZiwgZGVjLnZhbHVlLCBkZWMubGVuZ3RoKTsKICBsZW4gPSBjdXJseF91enRvc2koZGVjLmxlbmd0aCk7CiAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW4sICZkZWMpOwoKICByZXR1cm4gbGVuOwp9CgpzdGF0aWMgaW50CmtyYjVfb3ZlcmhlYWQodm9pZCAqYXBwX2RhdGEsIGludCBsZXZlbCwgaW50IGxlbikKewogIC8qIG5vIGFyZ3VtZW50cyBhcmUgdXNlZCAqLwogICh2b2lkKWFwcF9kYXRhOwogICh2b2lkKWxldmVsOwogICh2b2lkKWxlbjsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludAprcmI1X2VuY29kZSh2b2lkICphcHBfZGF0YSwgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbmd0aCwgaW50IGxldmVsLCB2b2lkICoqdG8pCnsKICBnc3NfY3R4X2lkX3QgKmNvbnRleHQgPSBhcHBfZGF0YTsKICBnc3NfYnVmZmVyX2Rlc2MgZGVjLCBlbmM7CiAgT01fdWludDMyIG1haiwgbWluOwogIGludCBzdGF0ZTsKICBpbnQgbGVuOwoKICAvKiBOT1RFIHRoYXQgdGhlIGNhc3QgaXMgc2FmZSwgbmVpdGhlciBvZiB0aGUga3JiNSwgZ251IGdzcyBhbmQgaGVpbWRhbAogICAqIGxpYnJhcmllcyBtb2RpZnkgdGhlIGlucHV0IGJ1ZmZlciBpbiBnc3Nfd3JhcCgpCiAgICovCiAgZGVjLnZhbHVlID0gKHZvaWQgKilmcm9tOwogIGRlYy5sZW5ndGggPSBsZW5ndGg7CiAgbWFqID0gZ3NzX3dyYXAoJm1pbiwgKmNvbnRleHQsCiAgICAgICAgICAgICAgICAgbGV2ZWwgPT0gUFJPVF9QUklWQVRFLAogICAgICAgICAgICAgICAgIEdTU19DX1FPUF9ERUZBVUxULAogICAgICAgICAgICAgICAgICZkZWMsICZzdGF0ZSwgJmVuYyk7CgogIGlmKG1haiAhPSBHU1NfU19DT01QTEVURSkKICAgIHJldHVybiAtMTsKCiAgLyogbWFsbG9jIGEgbmV3IGJ1ZmZlciwgaW4gY2FzZSBnc3NfcmVsZWFzZV9idWZmZXIgZG9lc24ndCB3b3JrIGFzCiAgICAgZXhwZWN0ZWQgKi8KICAqdG8gPSBtYWxsb2MoZW5jLmxlbmd0aCk7CiAgaWYoISp0bykKICAgIHJldHVybiAtMTsKICBtZW1jcHkoKnRvLCBlbmMudmFsdWUsIGVuYy5sZW5ndGgpOwogIGxlbiA9IGN1cmx4X3V6dG9zaShlbmMubGVuZ3RoKTsKICBnc3NfcmVsZWFzZV9idWZmZXIoJm1pbiwgJmVuYyk7CiAgcmV0dXJuIGxlbjsKfQoKc3RhdGljIGludAprcmI1X2F1dGgodm9pZCAqYXBwX2RhdGEsIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKewogIGludCByZXQgPSBBVVRIX09LOwogIGNoYXIgKnA7CiAgY29uc3QgY2hhciAqaG9zdCA9IGNvbm4tPmhvc3QubmFtZTsKICBzc2l6ZV90IG5yZWFkOwogIGN1cmxfc29ja2xlbl90IGwgPSBzaXplb2YoY29ubi0+bG9jYWxfYWRkcik7CiAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgQ1VSTGNvZGUgcmVzdWx0OwogIGNvbnN0IGNoYXIgKnNlcnZpY2UgPSBkYXRhLT5zZXQuc3RyW1NUUklOR19TRVJWSUNFX05BTUVdID8KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+c2V0LnN0cltTVFJJTkdfU0VSVklDRV9OQU1FXSA6CiAgICAgICAgICAgICAgICAgICAgICAgICJmdHAiOwogIGNvbnN0IGNoYXIgKnNydl9ob3N0ID0gImhvc3QiOwogIGdzc19idWZmZXJfZGVzYyBpbnB1dF9idWZmZXIsIG91dHB1dF9idWZmZXIsIF9nc3NyZXNwLCAqZ3NzcmVzcDsKICBPTV91aW50MzIgbWFqLCBtaW47CiAgZ3NzX25hbWVfdCBnc3NuYW1lOwogIGdzc19jdHhfaWRfdCAqY29udGV4dCA9IGFwcF9kYXRhOwogIHN0cnVjdCBnc3NfY2hhbm5lbF9iaW5kaW5nc19zdHJ1Y3QgY2hhbjsKICBzaXplX3QgYmFzZTY0X3N6ID0gMDsKICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKipyZW1vdGVfYWRkciA9CiAgICAoc3RydWN0IHNvY2thZGRyX2luICoqKSZjb25uLT5pcF9hZGRyLT5haV9hZGRyOwogIGNoYXIgKnN0cmluZ3A7CgogIGlmKGdldHNvY2tuYW1lKGNvbm4tPnNvY2tbRklSU1RTT0NLRVRdLAogICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmY29ubi0+bG9jYWxfYWRkciwgJmwpIDwgMCkKICAgIHBlcnJvcigiZ2V0c29ja25hbWUoKSIpOwoKICBjaGFuLmluaXRpYXRvcl9hZGRydHlwZSA9IEdTU19DX0FGX0lORVQ7CiAgY2hhbi5pbml0aWF0b3JfYWRkcmVzcy5sZW5ndGggPSBsIC0gNDsKICBjaGFuLmluaXRpYXRvcl9hZGRyZXNzLnZhbHVlID0gJmNvbm4tPmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyOwogIGNoYW4uYWNjZXB0b3JfYWRkcnR5cGUgPSBHU1NfQ19BRl9JTkVUOwogIGNoYW4uYWNjZXB0b3JfYWRkcmVzcy5sZW5ndGggPSBsIC0gNDsKICBjaGFuLmFjY2VwdG9yX2FkZHJlc3MudmFsdWUgPSAmKCpyZW1vdGVfYWRkciktPnNpbl9hZGRyLnNfYWRkcjsKICBjaGFuLmFwcGxpY2F0aW9uX2RhdGEubGVuZ3RoID0gMDsKICBjaGFuLmFwcGxpY2F0aW9uX2RhdGEudmFsdWUgPSBOVUxMOwoKICAvKiB0aGlzIGxvb3Agd2lsbCBleGVjdXRlIHR3aWNlIChvbmNlIGZvciBzZXJ2aWNlLCBvbmNlIGZvciBob3N0KSAqLwogIGZvcig7OykgewogICAgLyogdGhpcyByZWFsbHkgc2hvdWxkbid0IGJlIHJlcGVhdGVkIGhlcmUsIGJ1dCBjYW4ndCBoZWxwIGl0ICovCiAgICBpZihzZXJ2aWNlID09IHNydl9ob3N0KSB7CiAgICAgIHJlc3VsdCA9IEN1cmxfZnRwc2VuZChjb25uLCAiQVVUSCBHU1NBUEkiKTsKICAgICAgaWYocmVzdWx0KQogICAgICAgIHJldHVybiAtMjsKCiAgICAgIGlmKEN1cmxfR2V0RlRQUmVzcG9uc2UoJm5yZWFkLCBjb25uLCBOVUxMKSkKICAgICAgICByZXR1cm4gLTE7CgogICAgICBpZihkYXRhLT5zdGF0ZS5idWZmZXJbMF0gIT0gJzMnKQogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzdHJpbmdwID0gYXByaW50ZigiJXNAJXMiLCBzZXJ2aWNlLCBob3N0KTsKICAgIGlmKCFzdHJpbmdwKQogICAgICByZXR1cm4gLTI7CgogICAgaW5wdXRfYnVmZmVyLnZhbHVlID0gc3RyaW5ncDsKICAgIGlucHV0X2J1ZmZlci5sZW5ndGggPSBzdHJsZW4oc3RyaW5ncCk7CiAgICBtYWogPSBnc3NfaW1wb3J0X25hbWUoJm1pbiwgJmlucHV0X2J1ZmZlciwgR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJmdzc25hbWUpOwogICAgZnJlZShzdHJpbmdwKTsKICAgIGlmKG1haiAhPSBHU1NfU19DT01QTEVURSkgewogICAgICBnc3NfcmVsZWFzZV9uYW1lKCZtaW4sICZnc3NuYW1lKTsKICAgICAgaWYoc2VydmljZSA9PSBzcnZfaG9zdCkgewogICAgICAgIEN1cmxfZmFpbGYoZGF0YSwgIkVycm9yIGltcG9ydGluZyBzZXJ2aWNlIG5hbWUgJXNAJXMiLCBzZXJ2aWNlLCBob3N0KTsKICAgICAgICByZXR1cm4gQVVUSF9FUlJPUjsKICAgICAgfQogICAgICBzZXJ2aWNlID0gc3J2X2hvc3Q7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgLyogV2UgcGFzcyBOVUxMIGFzIHxvdXRwdXRfbmFtZV90eXBlfCB0byBhdm9pZCBhIGxlYWsuICovCiAgICBnc3NfZGlzcGxheV9uYW1lKCZtaW4sIGdzc25hbWUsICZvdXRwdXRfYnVmZmVyLCBOVUxMKTsKICAgIEN1cmxfaW5mb2YoZGF0YSwgIlRyeWluZyBhZ2FpbnN0ICVzXG4iLCBvdXRwdXRfYnVmZmVyLnZhbHVlKTsKICAgIGdzc3Jlc3AgPSBHU1NfQ19OT19CVUZGRVI7CiAgICAqY29udGV4dCA9IEdTU19DX05PX0NPTlRFWFQ7CgogICAgZG8gewogICAgICAvKiBSZWxlYXNlIHRoZSBidWZmZXIgYXQgZWFjaCBpdGVyYXRpb24gdG8gYXZvaWQgbGVha2luZzogdGhlIGZpcnN0IHRpbWUKICAgICAgICAgd2UgYXJlIHJlbGVhc2luZyB0aGUgbWVtb3J5IGZyb20gZ3NzX2Rpc3BsYXlfbmFtZS4gVGhlIGxhc3QgaXRlbSBpcwogICAgICAgICB0YWtlbiBjYXJlIGJ5IGEgZmluYWwgZ3NzX3JlbGVhc2VfYnVmZmVyLiAqLwogICAgICBnc3NfcmVsZWFzZV9idWZmZXIoJm1pbiwgJm91dHB1dF9idWZmZXIpOwogICAgICByZXQgPSBBVVRIX09LOwogICAgICBtYWogPSBDdXJsX2dzc19pbml0X3NlY19jb250ZXh0KGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzc25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkN1cmxfa3JiNV9tZWNoX29pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3NyZXNwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CgogICAgICBpZihnc3NyZXNwKSB7CiAgICAgICAgZnJlZShfZ3NzcmVzcC52YWx1ZSk7CiAgICAgICAgZ3NzcmVzcCA9IE5VTEw7CiAgICAgIH0KCiAgICAgIGlmKEdTU19FUlJPUihtYWopKSB7CiAgICAgICAgQ3VybF9pbmZvZihkYXRhLCAiRXJyb3IgY3JlYXRpbmcgc2VjdXJpdHkgY29udGV4dFxuIik7CiAgICAgICAgcmV0ID0gQVVUSF9FUlJPUjsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgaWYob3V0cHV0X2J1ZmZlci5sZW5ndGggIT0gMCkgewogICAgICAgIGNoYXIgKmNtZDsKCiAgICAgICAgcmVzdWx0ID0gQ3VybF9iYXNlNjRfZW5jb2RlKGRhdGEsIChjaGFyICopb3V0cHV0X2J1ZmZlci52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlci5sZW5ndGgsICZwLCAmYmFzZTY0X3N6KTsKICAgICAgICBpZihyZXN1bHQpIHsKICAgICAgICAgIEN1cmxfaW5mb2YoZGF0YSwgImJhc2U2NC1lbmNvZGluZzogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIGN1cmxfZWFzeV9zdHJlcnJvcihyZXN1bHQpKTsKICAgICAgICAgIHJldCA9IEFVVEhfRVJST1I7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGNtZCA9IGFwcmludGYoIkFEQVQgJXMiLCBwKTsKICAgICAgICBpZihjbWQpCiAgICAgICAgICByZXN1bHQgPSBDdXJsX2Z0cHNlbmQoY29ubiwgY21kKTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXN1bHQgPSBDVVJMRV9PVVRfT0ZfTUVNT1JZOwoKICAgICAgICBmcmVlKHApOwoKICAgICAgICBpZihyZXN1bHQpIHsKICAgICAgICAgIHJldCA9IC0yOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZihDdXJsX0dldEZUUFJlc3BvbnNlKCZucmVhZCwgY29ubiwgTlVMTCkpIHsKICAgICAgICAgIHJldCA9IC0xOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZihkYXRhLT5zdGF0ZS5idWZmZXJbMF0gIT0gJzInICYmIGRhdGEtPnN0YXRlLmJ1ZmZlclswXSAhPSAnMycpIHsKICAgICAgICAgIEN1cmxfaW5mb2YoZGF0YSwgIlNlcnZlciBkaWRuJ3QgYWNjZXB0IGF1dGggZGF0YVxuIik7CiAgICAgICAgICByZXQgPSBBVVRIX0VSUk9SOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBfZ3NzcmVzcC52YWx1ZSA9IE5VTEw7IC8qIG1ha2Ugc3VyZSBpdCBpcyBpbml0aWFsaXplZCAqLwogICAgICAgIHAgPSBkYXRhLT5zdGF0ZS5idWZmZXIgKyA0OwogICAgICAgIHAgPSBzdHJzdHIocCwgIkFEQVQ9Iik7CiAgICAgICAgaWYocCkgewogICAgICAgICAgcmVzdWx0ID0gQ3VybF9iYXNlNjRfZGVjb2RlKHAgKyA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICoqKSZfZ3NzcmVzcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2dzc3Jlc3AubGVuZ3RoKTsKICAgICAgICAgIGlmKHJlc3VsdCkgewogICAgICAgICAgICBDdXJsX2ZhaWxmKGRhdGEsICJiYXNlNjQtZGVjb2Rpbmc6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICBjdXJsX2Vhc3lfc3RyZXJyb3IocmVzdWx0KSk7CiAgICAgICAgICAgIHJldCA9IEFVVEhfQ09OVElOVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZ3NzcmVzcCA9ICZfZ3NzcmVzcDsKICAgICAgfQogICAgfSB3aGlsZShtYWogPT0gR1NTX1NfQ09OVElOVUVfTkVFREVEKTsKCiAgICBnc3NfcmVsZWFzZV9uYW1lKCZtaW4sICZnc3NuYW1lKTsKICAgIGdzc19yZWxlYXNlX2J1ZmZlcigmbWluLCAmb3V0cHV0X2J1ZmZlcik7CgogICAgaWYoZ3NzcmVzcCkKICAgICAgZnJlZShfZ3NzcmVzcC52YWx1ZSk7CgogICAgaWYocmV0ID09IEFVVEhfT0sgfHwgc2VydmljZSA9PSBzcnZfaG9zdCkKICAgICAgcmV0dXJuIHJldDsKCiAgICBzZXJ2aWNlID0gc3J2X2hvc3Q7CiAgfQogIHJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIGtyYjVfZW5kKHZvaWQgKmFwcF9kYXRhKQp7CiAgICBPTV91aW50MzIgbWluOwogICAgZ3NzX2N0eF9pZF90ICpjb250ZXh0ID0gYXBwX2RhdGE7CiAgICBpZigqY29udGV4dCAhPSBHU1NfQ19OT19DT05URVhUKSB7CiNpZmRlZiBERUJVR0JVSUxECiAgICAgIE9NX3VpbnQzMiBtYWogPQojZW5kaWYKICAgICAgZ3NzX2RlbGV0ZV9zZWNfY29udGV4dCgmbWluLCBjb250ZXh0LCBHU1NfQ19OT19CVUZGRVIpOwogICAgICBERUJVR0FTU0VSVChtYWogPT0gR1NTX1NfQ09NUExFVEUpOwogICAgfQp9CgpzdHJ1Y3QgQ3VybF9zZWNfY2xpZW50X21lY2ggQ3VybF9rcmI1X2NsaWVudF9tZWNoID0gewogICAgIkdTU0FQSSIsCiAgICBzaXplb2YoZ3NzX2N0eF9pZF90KSwKICAgIGtyYjVfaW5pdCwKICAgIGtyYjVfYXV0aCwKICAgIGtyYjVfZW5kLAogICAga3JiNV9jaGVja19wcm90LAogICAga3JiNV9vdmVyaGVhZCwKICAgIGtyYjVfZW5jb2RlLAogICAga3JiNV9kZWNvZGUKfTsKCiNlbmRpZiAvKiBIQVZFX0dTU0FQSSAmJiAhQ1VSTF9ESVNBQkxFX0ZUUCAqLwo=