LyoKICogcGFyc2UuYwogKgogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBDb3B5cmlnaHQgMTk4OSwgMTk5MSwgMTk5MiBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQoKICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKClBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwpkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCnByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCnN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ01VIG5vdCBiZQp1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgoKQ01VIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCkNNVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLApXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCkFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKU09GVFdBUkUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCgojaWYgSEFWRV9MSU1JVFNfSAojaW5jbHVkZSA8bGltaXRzLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RkaW8uaD4KI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfU1lTX1NUQVRfSAojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2VuZGlmCgovKgogKiBXb3cuICBUaGlzIGlzIHVnbHkuICAtLSBXZXMgCiAqLwojaWYgSEFWRV9ESVJFTlRfSAojIGluY2x1ZGUgPGRpcmVudC5oPgojIGRlZmluZSBOQU1MRU4oZGlyZW50KSBzdHJsZW4oKGRpcmVudCktPmRfbmFtZSkKI2Vsc2UKIyBkZWZpbmUgZGlyZW50IGRpcmVjdAojIGRlZmluZSBOQU1MRU4oZGlyZW50KSAoZGlyZW50KS0+ZF9uYW1sZW4KIyBpZiBIQVZFX1NZU19ORElSX0gKIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfU1lTX0RJUl9ICiMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfTkRJUl9ICiMgIGluY2x1ZGUgPG5kaXIuaD4KIyBlbmRpZgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGlmZGVmIFdJTjMyCiMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgojIGVsc2UKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbmRpZgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBkZWZpbmVkKEhBVkVfUkVHRVhfSCkgJiYgZGVmaW5lZChIQVZFX1JFR0NPTVApCiNpbmNsdWRlIDxyZWdleC5oPgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2luY2x1ZGUgPGVycm5vLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2NvbmZpZ19hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL3V0aWxpdGllcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvcGFyc2UuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbWliLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfYXBpLmg+CgovKgogKiBBIGxpbmtlZCBsaXN0IG9mIG5vZGVzLgogKi8Kc3RydWN0IG5vZGUgewogICAgc3RydWN0IG5vZGUgICAgKm5leHQ7CiAgICBjaGFyICAgICAgICAgICAqbGFiZWw7ICAvKiBUaGlzIG5vZGUncyAodW5pcXVlKSB0ZXh0dWFsIG5hbWUgKi8KICAgIHVfbG9uZyAgICAgICAgICBzdWJpZDsgIC8qIFRoaXMgbm9kZSdzIGludGVnZXIgc3ViaWRlbnRpZmllciAqLwogICAgaW50ICAgICAgICAgICAgIG1vZGlkOyAgLyogVGhlIG1vZHVsZSBjb250YWluaW5nIHRoaXMgbm9kZSAqLwogICAgY2hhciAgICAgICAgICAgKnBhcmVudDsgLyogVGhlIHBhcmVudCdzIHRleHR1YWwgbmFtZSAqLwogICAgaW50ICAgICAgICAgICAgIHRjX2luZGV4OyAvKiBpbmRleCBpbnRvIHRjbGlzdCAoLTEgaWYgTkEpICovCiAgICBpbnQgICAgICAgICAgICAgdHlwZTsgICAvKiBUaGUgdHlwZSBvZiBvYmplY3QgdGhpcyByZXByZXNlbnRzICovCiAgICBpbnQgICAgICAgICAgICAgYWNjZXNzOwogICAgaW50ICAgICAgICAgICAgIHN0YXR1czsKICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zOyAvKiAob3B0aW9uYWwpIGxpc3Qgb2YgZW51bWVyYXRlZCBpbnRlZ2VycyAqLwogICAgc3RydWN0IHJhbmdlX2xpc3QgKnJhbmdlczsKICAgIHN0cnVjdCBpbmRleF9saXN0ICppbmRleGVzOwogICAgY2hhciAgICAgICAgICAgKmF1Z21lbnRzOwogICAgc3RydWN0IHZhcmJpbmRfbGlzdCAqdmFyYmluZHM7CiAgICBjaGFyICAgICAgICAgICAqaGludDsKICAgIGNoYXIgICAgICAgICAgICp1bml0czsKICAgIGNoYXIgICAgICAgICAgICpkZXNjcmlwdGlvbjsgLyogZGVzY3JpcHRpb24gKGEgcXVvdGVkIHN0cmluZykgKi8KICAgIGNoYXIgICAgICAgICAgICpyZWZlcmVuY2U7IC8qIHJlZmVyZW5jZXMgKGEgcXVvdGVkIHN0cmluZykgKi8KICAgIGNoYXIgICAgICAgICAgICpkZWZhdWx0VmFsdWU7CiAgICBjaGFyICAgICAgICAgICAqZmlsZW5hbWU7CiAgICBpbnQgICAgICAgICAgICAgbGluZW5vOwp9OwoKLyoKICogVGhpcyBpcyBvbmUgZWxlbWVudCBvZiBhbiBvYmplY3QgaWRlbnRpZmllciB3aXRoIGVpdGhlciBhbiBpbnRlZ2VyCiAqIHN1YmlkZW50aWZpZXIsIG9yIGEgdGV4dHVhbCBzdHJpbmcgbGFiZWwsIG9yIGJvdGguCiAqIFRoZSBzdWJpZCBpcyAtMSBpZiBub3QgcHJlc2VudCwgYW5kIGxhYmVsIGlzIE5VTEwgaWYgbm90IHByZXNlbnQuCiAqLwpzdHJ1Y3Qgc3ViaWRfcyB7CiAgICBpbnQgICAgICAgICAgICAgc3ViaWQ7CiAgICBpbnQgICAgICAgICAgICAgbW9kaWQ7CiAgICBjaGFyICAgICAgICAgICAqbGFiZWw7Cn07CgojZGVmaW5lIE1BWFRDICAgNDA5NgpzdHJ1Y3QgdGMgeyAgICAgICAgICAgICAgICAgICAgIC8qIHRleHR1YWwgY29udmVudGlvbnMgKi8KICAgIGludCAgICAgICAgICAgICB0eXBlOwogICAgaW50ICAgICAgICAgICAgIG1vZGlkOwogICAgY2hhciAgICAgICAgICAgKmRlc2NyaXB0b3I7CiAgICBjaGFyICAgICAgICAgICAqaGludDsKICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zOwogICAgc3RydWN0IHJhbmdlX2xpc3QgKnJhbmdlczsKICAgIGNoYXIgICAgICAgICAgICpkZXNjcmlwdGlvbjsKfSB0Y2xpc3RbTUFYVENdOwoKaW50ICAgICAgICAgICAgIG1pYkxpbmUgPSAwOwpjb25zdCBjaGFyICAgICAqRmlsZSA9ICIobm9uZSkiOwpzdGF0aWMgaW50ICAgICAgYW5vbnltb3VzID0gMDsKCnN0cnVjdCBvYmpncm91cCB7CiAgICBjaGFyICAgICAgICAgICAqbmFtZTsKICAgIGludCAgICAgICAgICAgICBsaW5lOwogICAgc3RydWN0IG9iamdyb3VwICpuZXh0Owp9ICAgICAgICAgICAgICAqb2JqZ3JvdXBzID0gTlVMTCwgKm9iamVjdHMgPSBOVUxMLCAqbm90aWZzID0gTlVMTDsKCiNkZWZpbmUgU1lOVEFYX01BU0sgICAgIDB4ODAKLyoKICogdHlwZXMgb2YgdG9rZW5zCiAqIFRva2VucyB3aWh0IHRoZSBTWU5UQVhfTUFTSyBiaXQgc2V0IGFyZSBzeW50YXggdG9rZW5zIAogKi8KI2RlZmluZSBDT05USU5VRSAgICAtMQojZGVmaW5lIEVORE9GRklMRSAgIDAKI2RlZmluZSBMQUJFTCAgICAgICAxCiNkZWZpbmUgU1VCVFJFRSAgICAgMgojZGVmaW5lIFNZTlRBWCAgICAgIDMKI2RlZmluZSBPQkpJRCAgICAgICAoNCB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIE9DVEVUU1RSICAgICg1IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgSU5URUdFUiAgICAgKDYgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBORVRBRERSICAgICAoNyB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIElQQUREUiAgICAgICg4IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgQ09VTlRFUiAgICAgKDkgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBHQVVHRSAgICAgICAoMTAgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBUSU1FVElDS1MgICAoMTEgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBLV19PUEFRVUUgICAoMTIgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBOVUwgICAgICAgICAoMTMgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBTRVFVRU5DRSAgICAxNAojZGVmaW5lIE9GICAgICAgICAgIDE1ICAgICAgICAgIC8qIFNFUVVFTkNFIE9GICovCiNkZWZpbmUgT0JKVFlQRSAgICAgMTYKI2RlZmluZSBBQ0NFU1MgICAgICAxNwojZGVmaW5lIFJFQURPTkxZICAgIDE4CiNkZWZpbmUgUkVBRFdSSVRFICAgMTkKI2RlZmluZSBXUklURU9OTFkgICAyMAojaWZkZWYgTk9BQ0NFU1MKI3VuZGVmIE5PQUNDRVNTICAgICAgICAgICAgICAgICAvKiBhZ2VudCAnTk9BQ0NFU1MnIHRva2VuICovCiNlbmRpZgojZGVmaW5lIE5PQUNDRVNTICAgIDIxCiNkZWZpbmUgU1RBVFVTICAgICAgMjIKI2RlZmluZSBNQU5EQVRPUlkgICAyMwojZGVmaW5lIEtXX09QVElPTkFMICAgIDI0CiNkZWZpbmUgT0JTT0xFVEUgICAgMjUKLyoKICogI2RlZmluZSBSRUNPTU1FTkRFRCAyNiAKICovCiNkZWZpbmUgUFVOQ1QgICAgICAgMjcKI2RlZmluZSBFUVVBTFMgICAgICAyOAojZGVmaW5lIE5VTUJFUiAgICAgIDI5CiNkZWZpbmUgTEVGVEJSQUNLRVQgMzAKI2RlZmluZSBSSUdIVEJSQUNLRVQgMzEKI2RlZmluZSBMRUZUUEFSRU4gICAzMgojZGVmaW5lIFJJR0hUUEFSRU4gIDMzCiNkZWZpbmUgQ09NTUEgICAgICAgMzQKI2RlZmluZSBERVNDUklQVElPTiAzNQojZGVmaW5lIFFVT1RFU1RSSU5HIDM2CiNkZWZpbmUgSU5ERVggICAgICAgMzcKI2RlZmluZSBERUZWQUwgICAgICAzOAojZGVmaW5lIERFUFJFQ0FURUQgIDM5CiNkZWZpbmUgU0laRSAgICAgICAgNDAKI2RlZmluZSBCSVRTVFJJTkcgICAoNDEgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBOU0FQQUREUkVTUyAoNDIgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBDT1VOVEVSNjQgICAoNDMgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBPQkpHUk9VUCAgICA0NAojZGVmaW5lIE5PVElGVFlQRSAgIDQ1CiNkZWZpbmUgQVVHTUVOVFMgICAgNDYKI2RlZmluZSBDT01QTElBTkNFICA0NwojZGVmaW5lIFJFQURDUkVBVEUgIDQ4CiNkZWZpbmUgVU5JVFMgICAgICAgNDkKI2RlZmluZSBSRUZFUkVOQ0UgICA1MAojZGVmaW5lIE5VTV9FTlRSSUVTIDUxCiNkZWZpbmUgTU9EVUxFSURFTlRJVFkgNTIKI2RlZmluZSBMQVNUVVBEQVRFRCA1MwojZGVmaW5lIE9SR0FOSVpBVElPTiA1NAojZGVmaW5lIENPTlRBQ1RJTkZPIDU1CiNkZWZpbmUgVUlOVEVHRVIzMiAoNTYgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBDVVJSRU5UICAgICA1NwojZGVmaW5lIERFRklOSVRJT05TIDU4CiNkZWZpbmUgRU5EICAgICAgICAgNTkKI2RlZmluZSBTRU1JICAgICAgICA2MAojZGVmaW5lIFRSQVBUWVBFICAgIDYxCiNkZWZpbmUgRU5URVJQUklTRSAgNjIKLyoKICogI2RlZmluZSBESVNQTEFZU1RSICg2MyB8IFNZTlRBWF9NQVNLKSAKICovCiNkZWZpbmUgQkVHSU4gICAgICAgNjQKI2RlZmluZSBJTVBPUlRTICAgICA2NQojZGVmaW5lIEVYUE9SVFMgICAgIDY2CiNkZWZpbmUgQUNDTk9USUZZICAgNjcKI2RlZmluZSBCQVIgICAgICAgICA2OAojZGVmaW5lIFJBTkdFICAgICAgIDY5CiNkZWZpbmUgQ09OVkVOVElPTiAgNzAKI2RlZmluZSBESVNQTEFZSElOVCA3MQojZGVmaW5lIEZST00gICAgICAgIDcyCiNkZWZpbmUgQUdFTlRDQVAgICAgNzMKI2RlZmluZSBNQUNSTyAgICAgICA3NAojZGVmaW5lIElNUExJRUQgICAgIDc1CiNkZWZpbmUgU1VQUE9SVFMgICAgNzYKI2RlZmluZSBJTkNMVURFUyAgICA3NwojZGVmaW5lIFZBUklBVElPTiAgIDc4CiNkZWZpbmUgUkVWSVNJT04gICAgNzkKI2RlZmluZSBOT1RJTVBMCSAgICA4MAojZGVmaW5lIE9CSkVDVFMJICAgIDgxCiNkZWZpbmUgTk9USUZJQ0FUSU9OUwk4MgojZGVmaW5lIE1PRFVMRQkgICAgODMKI2RlZmluZSBNSU5BQ0NFU1MgICA4NAojZGVmaW5lIFBST0RSRUwJICAgIDg1CiNkZWZpbmUgV1JTWU5UQVggICAgODYKI2RlZmluZSBDUkVBVEVSRVEgICA4NwojZGVmaW5lIE5PVElGR1JPVVAgIDg4CiNkZWZpbmUgTUFOREFUT1JZR1JPVVBTCTg5CiNkZWZpbmUgR1JPVVAJICAgIDkwCiNkZWZpbmUgT0JKRUNUCSAgICA5MQojZGVmaW5lIElERU5USUZJRVIgIDkyCiNkZWZpbmUgQ0hPSUNFCSAgICA5MwojZGVmaW5lIExFRlRTUUJSQUNLCTk1CiNkZWZpbmUgUklHSFRTUUJSQUNLCTk2CiNkZWZpbmUgSU1QTElDSVQgICAgOTcKI2RlZmluZSBBUFBTWU5UQVgJKDk4IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgT0JKU1lOVEFYCSg5OSB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIFNJTVBMRVNZTlRBWAkoMTAwIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgT0JKTkFNRQkJKDEwMSB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIE5PVElGTkFNRQkoMTAyIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgVkFSSUFCTEVTCTEwMwojZGVmaW5lIFVOU0lHTkVEMzIJKDEwNCB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIElOVEVHRVIzMgkoMTA1IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgT0JKSURFTlRJVFkJMTA2Ci8qCiAqIEJld2FyZSBvZiByZWFjaGluZyBTWU5UQVhfTUFTSyAoMHg4MCkgCiAqLwoKc3RydWN0IHRvayB7CiAgICBjb25zdCBjaGFyICAgICAqbmFtZTsgICAgICAgLyogdG9rZW4gbmFtZSAqLwogICAgaW50ICAgICAgICAgICAgIGxlbjsgICAgICAgIC8qIGxlbmd0aCBub3QgY291bnRpbmcgbnVsICovCiAgICBpbnQgICAgICAgICAgICAgdG9rZW47ICAgICAgLyogdmFsdWUgKi8KICAgIGludCAgICAgICAgICAgICBoYXNoOyAgICAgICAvKiBoYXNoIG9mIG5hbWUgKi8KICAgIHN0cnVjdCB0b2sgICAgICpuZXh0OyAgICAgICAvKiBwb2ludGVyIHRvIG5leHQgaW4gaGFzaCB0YWJsZSAqLwp9OwoKCnN0YXRpYyBzdHJ1Y3QgdG9rIHRva2Vuc1tdID0gewogICAgeyJvYnNvbGV0ZSIsIHNpemVvZigib2Jzb2xldGUiKSAtIDEsIE9CU09MRVRFfQogICAgLAogICAgeyJPcGFxdWUiLCBzaXplb2YoIk9wYXF1ZSIpIC0gMSwgS1dfT1BBUVVFfQogICAgLAogICAgeyJvcHRpb25hbCIsIHNpemVvZigib3B0aW9uYWwiKSAtIDEsIEtXX09QVElPTkFMfQogICAgLAogICAgeyJMQVNULVVQREFURUQiLCBzaXplb2YoIkxBU1QtVVBEQVRFRCIpIC0gMSwgTEFTVFVQREFURUR9CiAgICAsCiAgICB7Ik9SR0FOSVpBVElPTiIsIHNpemVvZigiT1JHQU5JWkFUSU9OIikgLSAxLCBPUkdBTklaQVRJT059CiAgICAsCiAgICB7IkNPTlRBQ1QtSU5GTyIsIHNpemVvZigiQ09OVEFDVC1JTkZPIikgLSAxLCBDT05UQUNUSU5GT30KICAgICwKICAgIHsiTU9EVUxFLUlERU5USVRZIiwgc2l6ZW9mKCJNT0RVTEUtSURFTlRJVFkiKSAtIDEsIE1PRFVMRUlERU5USVRZfQogICAgLAogICAgeyJNT0RVTEUtQ09NUExJQU5DRSIsIHNpemVvZigiTU9EVUxFLUNPTVBMSUFOQ0UiKSAtIDEsIENPTVBMSUFOQ0V9CiAgICAsCiAgICB7IkRFRklOSVRJT05TIiwgc2l6ZW9mKCJERUZJTklUSU9OUyIpIC0gMSwgREVGSU5JVElPTlN9CiAgICAsCiAgICB7IkVORCIsIHNpemVvZigiRU5EIikgLSAxLCBFTkR9CiAgICAsCiAgICB7IkFVR01FTlRTIiwgc2l6ZW9mKCJBVUdNRU5UUyIpIC0gMSwgQVVHTUVOVFN9CiAgICAsCiAgICB7Im5vdC1hY2Nlc3NpYmxlIiwgc2l6ZW9mKCJub3QtYWNjZXNzaWJsZSIpIC0gMSwgTk9BQ0NFU1N9CiAgICAsCiAgICB7IndyaXRlLW9ubHkiLCBzaXplb2YoIndyaXRlLW9ubHkiKSAtIDEsIFdSSVRFT05MWX0KICAgICwKICAgIHsiTnNhcEFkZHJlc3MiLCBzaXplb2YoIk5zYXBBZGRyZXNzIikgLSAxLCBOU0FQQUREUkVTU30KICAgICwKICAgIHsiVU5JVFMiLCBzaXplb2YoIlVuaXRzIikgLSAxLCBVTklUU30KICAgICwKICAgIHsiUkVGRVJFTkNFIiwgc2l6ZW9mKCJSRUZFUkVOQ0UiKSAtIDEsIFJFRkVSRU5DRX0KICAgICwKICAgIHsiTlVNLUVOVFJJRVMiLCBzaXplb2YoIk5VTS1FTlRSSUVTIikgLSAxLCBOVU1fRU5UUklFU30KICAgICwKICAgIHsiQklUU1RSSU5HIiwgc2l6ZW9mKCJCSVRTVFJJTkciKSAtIDEsIEJJVFNUUklOR30KICAgICwKICAgIHsiQklUIiwgc2l6ZW9mKCJCSVQiKSAtIDEsIENPTlRJTlVFfQogICAgLAogICAgeyJCSVRTIiwgc2l6ZW9mKCJCSVRTIikgLSAxLCBCSVRTVFJJTkd9CiAgICAsCiAgICB7IkNvdW50ZXI2NCIsIHNpemVvZigiQ291bnRlcjY0IikgLSAxLCBDT1VOVEVSNjR9CiAgICAsCiAgICB7IlRpbWVUaWNrcyIsIHNpemVvZigiVGltZVRpY2tzIikgLSAxLCBUSU1FVElDS1N9CiAgICAsCiAgICB7Ik5PVElGSUNBVElPTi1UWVBFIiwgc2l6ZW9mKCJOT1RJRklDQVRJT04tVFlQRSIpIC0gMSwgTk9USUZUWVBFfQogICAgLAogICAgeyJPQkpFQ1QtR1JPVVAiLCBzaXplb2YoIk9CSkVDVC1HUk9VUCIpIC0gMSwgT0JKR1JPVVB9CiAgICAsCiAgICB7Ik9CSkVDVC1JREVOVElUWSIsIHNpemVvZigiT0JKRUNULUlERU5USVRZIikgLSAxLCBPQkpJREVOVElUWX0KICAgICwKICAgIHsiSURFTlRJRklFUiIsIHNpemVvZigiSURFTlRJRklFUiIpIC0gMSwgSURFTlRJRklFUn0KICAgICwKICAgIHsiT0JKRUNUIiwgc2l6ZW9mKCJPQkpFQ1QiKSAtIDEsIE9CSkVDVH0KICAgICwKICAgIHsiTmV0d29ya0FkZHJlc3MiLCBzaXplb2YoIk5ldHdvcmtBZGRyZXNzIikgLSAxLCBORVRBRERSfQogICAgLAogICAgeyJHYXVnZSIsIHNpemVvZigiR2F1Z2UiKSAtIDEsIEdBVUdFfQogICAgLAogICAgeyJHYXVnZTMyIiwgc2l6ZW9mKCJHYXVnZTMyIikgLSAxLCBHQVVHRX0KICAgICwKICAgIHsiVW5zaWduZWQzMiIsIHNpemVvZigiVW5zaWduZWQzMiIpIC0gMSwgVU5TSUdORUQzMn0KICAgICwKICAgIHsicmVhZC13cml0ZSIsIHNpemVvZigicmVhZC13cml0ZSIpIC0gMSwgUkVBRFdSSVRFfQogICAgLAogICAgeyJyZWFkLWNyZWF0ZSIsIHNpemVvZigicmVhZC1jcmVhdGUiKSAtIDEsIFJFQURDUkVBVEV9CiAgICAsCiAgICB7Ik9DVEVUU1RSSU5HIiwgc2l6ZW9mKCJPQ1RFVFNUUklORyIpIC0gMSwgT0NURVRTVFJ9CiAgICAsCiAgICB7Ik9DVEVUIiwgc2l6ZW9mKCJPQ1RFVCIpIC0gMSwgQ09OVElOVUV9CiAgICAsCiAgICB7Ik9GIiwgc2l6ZW9mKCJPRiIpIC0gMSwgT0Z9CiAgICAsCiAgICB7IlNFUVVFTkNFIiwgc2l6ZW9mKCJTRVFVRU5DRSIpIC0gMSwgU0VRVUVOQ0V9CiAgICAsCiAgICB7Ik5VTEwiLCBzaXplb2YoIk5VTEwiKSAtIDEsIE5VTH0KICAgICwKICAgIHsiSXBBZGRyZXNzIiwgc2l6ZW9mKCJJcEFkZHJlc3MiKSAtIDEsIElQQUREUn0KICAgICwKICAgIHsiVUludGVnZXIzMiIsIHNpemVvZigiVUludGVnZXIzMiIpIC0gMSwgVUlOVEVHRVIzMn0KICAgICwKICAgIHsiSU5URUdFUiIsIHNpemVvZigiSU5URUdFUiIpIC0gMSwgSU5URUdFUn0KICAgICwKICAgIHsiSW50ZWdlcjMyIiwgc2l6ZW9mKCJJbnRlZ2VyMzIiKSAtIDEsIElOVEVHRVIzMn0KICAgICwKICAgIHsiQ291bnRlciIsIHNpemVvZigiQ291bnRlciIpIC0gMSwgQ09VTlRFUn0KICAgICwKICAgIHsiQ291bnRlcjMyIiwgc2l6ZW9mKCJDb3VudGVyMzIiKSAtIDEsIENPVU5URVJ9CiAgICAsCiAgICB7InJlYWQtb25seSIsIHNpemVvZigicmVhZC1vbmx5IikgLSAxLCBSRUFET05MWX0KICAgICwKICAgIHsiREVTQ1JJUFRJT04iLCBzaXplb2YoIkRFU0NSSVBUSU9OIikgLSAxLCBERVNDUklQVElPTn0KICAgICwKICAgIHsiSU5ERVgiLCBzaXplb2YoIklOREVYIikgLSAxLCBJTkRFWH0KICAgICwKICAgIHsiREVGVkFMIiwgc2l6ZW9mKCJERUZWQUwiKSAtIDEsIERFRlZBTH0KICAgICwKICAgIHsiZGVwcmVjYXRlZCIsIHNpemVvZigiZGVwcmVjYXRlZCIpIC0gMSwgREVQUkVDQVRFRH0KICAgICwKICAgIHsiU0laRSIsIHNpemVvZigiU0laRSIpIC0gMSwgU0laRX0KICAgICwKICAgIHsiTUFYLUFDQ0VTUyIsIHNpemVvZigiTUFYLUFDQ0VTUyIpIC0gMSwgQUNDRVNTfQogICAgLAogICAgeyJBQ0NFU1MiLCBzaXplb2YoIkFDQ0VTUyIpIC0gMSwgQUNDRVNTfQogICAgLAogICAgeyJtYW5kYXRvcnkiLCBzaXplb2YoIm1hbmRhdG9yeSIpIC0gMSwgTUFOREFUT1JZfQogICAgLAogICAgeyJjdXJyZW50Iiwgc2l6ZW9mKCJjdXJyZW50IikgLSAxLCBDVVJSRU5UfQogICAgLAogICAgeyJTVEFUVVMiLCBzaXplb2YoIlNUQVRVUyIpIC0gMSwgU1RBVFVTfQogICAgLAogICAgeyJTWU5UQVgiLCBzaXplb2YoIlNZTlRBWCIpIC0gMSwgU1lOVEFYfQogICAgLAogICAgeyJPQkpFQ1QtVFlQRSIsIHNpemVvZigiT0JKRUNULVRZUEUiKSAtIDEsIE9CSlRZUEV9CiAgICAsCiAgICB7IlRSQVAtVFlQRSIsIHNpemVvZigiVFJBUC1UWVBFIikgLSAxLCBUUkFQVFlQRX0KICAgICwKICAgIHsiRU5URVJQUklTRSIsIHNpemVvZigiRU5URVJQUklTRSIpIC0gMSwgRU5URVJQUklTRX0KICAgICwKICAgIHsiQkVHSU4iLCBzaXplb2YoIkJFR0lOIikgLSAxLCBCRUdJTn0KICAgICwKICAgIHsiSU1QT1JUUyIsIHNpemVvZigiSU1QT1JUUyIpIC0gMSwgSU1QT1JUU30KICAgICwKICAgIHsiRVhQT1JUUyIsIHNpemVvZigiRVhQT1JUUyIpIC0gMSwgRVhQT1JUU30KICAgICwKICAgIHsiYWNjZXNzaWJsZS1mb3Itbm90aWZ5Iiwgc2l6ZW9mKCJhY2Nlc3NpYmxlLWZvci1ub3RpZnkiKSAtIDEsCiAgICAgQUNDTk9USUZZfQogICAgLAogICAgeyJURVhUVUFMLUNPTlZFTlRJT04iLCBzaXplb2YoIlRFWFRVQUwtQ09OVkVOVElPTiIpIC0gMSwgQ09OVkVOVElPTn0KICAgICwKICAgIHsiTk9USUZJQ0FUSU9OLUdST1VQIiwgc2l6ZW9mKCJOT1RJRklDQVRJT04tR1JPVVAiKSAtIDEsIE5PVElGR1JPVVB9CiAgICAsCiAgICB7IkRJU1BMQVktSElOVCIsIHNpemVvZigiRElTUExBWS1ISU5UIikgLSAxLCBESVNQTEFZSElOVH0KICAgICwKICAgIHsiRlJPTSIsIHNpemVvZigiRlJPTSIpIC0gMSwgRlJPTX0KICAgICwKICAgIHsiQUdFTlQtQ0FQQUJJTElUSUVTIiwgc2l6ZW9mKCJBR0VOVC1DQVBBQklMSVRJRVMiKSAtIDEsIEFHRU5UQ0FQfQogICAgLAogICAgeyJNQUNSTyIsIHNpemVvZigiTUFDUk8iKSAtIDEsIE1BQ1JPfQogICAgLAogICAgeyJJTVBMSUVEIiwgc2l6ZW9mKCJJTVBMSUVEIikgLSAxLCBJTVBMSUVEfQogICAgLAogICAgeyJTVVBQT1JUUyIsIHNpemVvZigiU1VQUE9SVFMiKSAtIDEsIFNVUFBPUlRTfQogICAgLAogICAgeyJJTkNMVURFUyIsIHNpemVvZigiSU5DTFVERVMiKSAtIDEsIElOQ0xVREVTfQogICAgLAogICAgeyJWQVJJQVRJT04iLCBzaXplb2YoIlZBUklBVElPTiIpIC0gMSwgVkFSSUFUSU9OfQogICAgLAogICAgeyJSRVZJU0lPTiIsIHNpemVvZigiUkVWSVNJT04iKSAtIDEsIFJFVklTSU9OfQogICAgLAogICAgeyJub3QtaW1wbGVtZW50ZWQiLCBzaXplb2YoIm5vdC1pbXBsZW1lbnRlZCIpIC0gMSwgTk9USU1QTH0KICAgICwKICAgIHsiT0JKRUNUUyIsIHNpemVvZigiT0JKRUNUUyIpIC0gMSwgT0JKRUNUU30KICAgICwKICAgIHsiTk9USUZJQ0FUSU9OUyIsIHNpemVvZigiTk9USUZJQ0FUSU9OUyIpIC0gMSwgTk9USUZJQ0FUSU9OU30KICAgICwKICAgIHsiTU9EVUxFIiwgc2l6ZW9mKCJNT0RVTEUiKSAtIDEsIE1PRFVMRX0KICAgICwKICAgIHsiTUlOLUFDQ0VTUyIsIHNpemVvZigiTUlOLUFDQ0VTUyIpIC0gMSwgTUlOQUNDRVNTfQogICAgLAogICAgeyJQUk9EVUNULVJFTEVBU0UiLCBzaXplb2YoIlBST0RVQ1QtUkVMRUFTRSIpIC0gMSwgUFJPRFJFTH0KICAgICwKICAgIHsiV1JJVEUtU1lOVEFYIiwgc2l6ZW9mKCJXUklURS1TWU5UQVgiKSAtIDEsIFdSU1lOVEFYfQogICAgLAogICAgeyJDUkVBVElPTi1SRVFVSVJFUyIsIHNpemVvZigiQ1JFQVRJT04tUkVRVUlSRVMiKSAtIDEsIENSRUFURVJFUX0KICAgICwKICAgIHsiTUFOREFUT1JZLUdST1VQUyIsIHNpemVvZigiTUFOREFUT1JZLUdST1VQUyIpIC0gMSwgTUFOREFUT1JZR1JPVVBTfQogICAgLAogICAgeyJHUk9VUCIsIHNpemVvZigiR1JPVVAiKSAtIDEsIEdST1VQfQogICAgLAogICAgeyJDSE9JQ0UiLCBzaXplb2YoIkNIT0lDRSIpIC0gMSwgQ0hPSUNFfQogICAgLAogICAgeyJJTVBMSUNJVCIsIHNpemVvZigiSU1QTElDSVQiKSAtIDEsIElNUExJQ0lUfQogICAgLAogICAgeyJPYmplY3RTeW50YXgiLCBzaXplb2YoIk9iamVjdFN5bnRheCIpIC0gMSwgT0JKU1lOVEFYfQogICAgLAogICAgeyJTaW1wbGVTeW50YXgiLCBzaXplb2YoIlNpbXBsZVN5bnRheCIpIC0gMSwgU0lNUExFU1lOVEFYfQogICAgLAogICAgeyJBcHBsaWNhdGlvblN5bnRheCIsIHNpemVvZigiQXBwbGljYXRpb25TeW50YXgiKSAtIDEsIEFQUFNZTlRBWH0KICAgICwKICAgIHsiT2JqZWN0TmFtZSIsIHNpemVvZigiT2JqZWN0TmFtZSIpIC0gMSwgT0JKTkFNRX0KICAgICwKICAgIHsiTm90aWZpY2F0aW9uTmFtZSIsIHNpemVvZigiTm90aWZpY2F0aW9uTmFtZSIpIC0gMSwgTk9USUZOQU1FfQogICAgLAogICAgeyJWQVJJQUJMRVMiLCBzaXplb2YoIlZBUklBQkxFUyIpIC0gMSwgVkFSSUFCTEVTfQogICAgLAogICAge05VTEx9Cn07CgpzdGF0aWMgc3RydWN0IG1vZHVsZV9jb21wYXRhYmlsaXR5ICptb2R1bGVfbWFwX2hlYWQ7CnN0YXRpYyBzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkgbW9kdWxlX21hcFtdID0gewogICAgeyJSRkMxMDY1LVNNSSIsICJSRkMxMTU1LVNNSSIsIE5VTEwsIDB9LAogICAgeyJSRkMxMDY2LU1JQiIsICJSRkMxMTU2LU1JQiIsIE5VTEwsIDB9LAogICAgLyoKICAgICAqICdtaWInIC0+ICdtaWItMicgCiAgICAgKi8KICAgIHsiUkZDMTE1Ni1NSUIiLCAiUkZDMTE1OC1NSUIiLCBOVUxMLCAwfSwKICAgIC8qCiAgICAgKiAnc25tcEVuYWJsZUF1dGhUcmFwcycgLT4gJ3NubXBFbmFibGVBdXRoZW5UcmFwcycgCiAgICAgKi8KICAgIHsiUkZDMTE1OC1NSUIiLCAiUkZDMTIxMy1NSUIiLCBOVUxMLCAwfSwKICAgIC8qCiAgICAgKiAnbnVsbE9JRCcgLT4gJ3plcm9Eb3RaZXJvJyAKICAgICAqLwogICAgeyJSRkMxMTU1LVNNSSIsICJTTk1QdjItU01JIiwgTlVMTCwgMH0sCiAgICB7IlJGQzEyMTMtTUlCIiwgIlNOTVB2Mi1TTUkiLCAibWliLTIiLCAwfSwKICAgIHsiUkZDMTIxMy1NSUIiLCAiU05NUHYyLU1JQiIsICJzeXMiLCAzfSwKICAgIHsiUkZDMTIxMy1NSUIiLCAiSUYtTUlCIiwgImlmIiwgMn0sCiAgICB7IlJGQzEyMTMtTUlCIiwgIklQLU1JQiIsICJpcCIsIDJ9LAogICAgeyJSRkMxMjEzLU1JQiIsICJJUC1NSUIiLCAiaWNtcCIsIDR9LAogICAgeyJSRkMxMjEzLU1JQiIsICJUQ1AtTUlCIiwgInRjcCIsIDN9LAogICAgeyJSRkMxMjEzLU1JQiIsICJVRFAtTUlCIiwgInVkcCIsIDN9LAogICAgeyJSRkMxMjEzLU1JQiIsICJTTk1QdjItU01JIiwgInRyYW5zbWlzc2lvbiIsIDB9LAogICAgeyJSRkMxMjEzLU1JQiIsICJTTk1QdjItTUlCIiwgInNubXAiLCA0fSwKICAgIHsiUkZDMTIzMS1NSUIiLCAiVE9LRU5SSU5HLU1JQiIsIE5VTEwsIDB9LAogICAgeyJSRkMxMjcxLU1JQiIsICJSTU9OLU1JQiIsIE5VTEwsIDB9LAogICAgeyJSRkMxMjg2LU1JQiIsICJTT1VSQ0UtUk9VVElORy1NSUIiLCAiZG90MWRTciIsIDd9LAogICAgeyJSRkMxMjg2LU1JQiIsICJCUklER0UtTUlCIiwgTlVMTCwgMH0sCiAgICB7IlJGQzEzMTUtTUlCIiwgIkZSQU1FLVJFTEFZLURURS1NSUIiLCBOVUxMLCAwfSwKICAgIHsiUkZDMTMxNi1NSUIiLCAiQ0hBUkFDVEVSLU1JQiIsIE5VTEwsIDB9LAogICAgeyJSRkMxNDA2LU1JQiIsICJEUzEtTUlCIiwgTlVMTCwgMH0sCiAgICB7IlJGQy0xMjEzIiwgIlJGQzEyMTMtTUlCIiwgTlVMTCwgMH0sCn07CgojZGVmaW5lIE1PRFVMRV9OT1RfRk9VTkQJMAojZGVmaW5lIE1PRFVMRV9MT0FERURfT0sJMQojZGVmaW5lIE1PRFVMRV9BTFJFQURZX0xPQURFRAkyCi8qCiAqICNkZWZpbmUgTU9EVUxFX0xPQURfRkFJTEVEICAgMyAgICAgICAKICovCiNkZWZpbmUgTU9EVUxFX0xPQURfRkFJTEVECU1PRFVMRV9OT1RfRk9VTkQKCgojZGVmaW5lIEhBU0hTSVpFICAgICAgICAzMgojZGVmaW5lIEJVQ0tFVCh4KSAgICAgICAoeCAmIChIQVNIU0laRS0xKSkKCiNkZWZpbmUgTkhBU0hTSVpFICAgIDEyOAojZGVmaW5lIE5CVUNLRVQoeCkgICAoeCAmIChOSEFTSFNJWkUtMSkpCgpzdGF0aWMgc3RydWN0IHRvayAqYnVja2V0c1tIQVNIU0laRV07CgpzdGF0aWMgc3RydWN0IG5vZGUgKm5idWNrZXRzW05IQVNIU0laRV07CnN0YXRpYyBzdHJ1Y3QgdHJlZSAqdGJ1Y2tldHNbTkhBU0hTSVpFXTsKc3RhdGljIHN0cnVjdCBtb2R1bGUgKm1vZHVsZV9oZWFkID0gTlVMTDsKCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqb3JwaGFuX25vZGVzID0gTlVMTDsKc3RydWN0IHRyZWUgICAgICAgICp0cmVlX2hlYWQgPSBOVUxMOwoKI2RlZmluZQlOVU1CRVJfT0ZfUk9PVF9OT0RFUwkzCnN0YXRpYyBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCByb290X2ltcG9ydHNbTlVNQkVSX09GX1JPT1RfTk9ERVNdOwoKc3RhdGljIGludCAgICAgIGN1cnJlbnRfbW9kdWxlID0gMDsKc3RhdGljIGludCAgICAgIG1heF9tb2R1bGUgPSAwOwpzdGF0aWMgaW50ICAgICAgZmlyc3RfZXJyX21vZHVsZSA9IDE7CnN0YXRpYyBjaGFyICAgICpsYXN0X2Vycl9tb2R1bGUgPSBOVUxMOyAvKiBubyByZXBlYXRzIG9uICJDYW5ub3QgZmluZCBtb2R1bGUuLi4iICovCgpzdGF0aWMgdm9pZCAgICAgdHJlZV9mcm9tX25vZGUoc3RydWN0IHRyZWUgKnRwLCBzdHJ1Y3Qgbm9kZSAqbnApOwpzdGF0aWMgdm9pZCAgICAgZG9fc3VidHJlZShzdHJ1Y3QgdHJlZSAqLCBzdHJ1Y3Qgbm9kZSAqKik7CnN0YXRpYyB2b2lkICAgICBkb19saW5rdXAoc3RydWN0IG1vZHVsZSAqLCBzdHJ1Y3Qgbm9kZSAqKTsKc3RhdGljIHZvaWQgICAgIGR1bXBfbW9kdWxlX2xpc3Qodm9pZCk7CnN0YXRpYyBpbnQgICAgICBnZXRfdG9rZW4oRklMRSAqLCBjaGFyICosIGludCk7CnN0YXRpYyBpbnQgICAgICBwYXJzZVF1b3RlU3RyaW5nKEZJTEUgKiwgY2hhciAqLCBpbnQpOwpzdGF0aWMgaW50ICAgICAgdG9zc09iamVjdElkZW50aWZpZXIoRklMRSAqKTsKc3RhdGljIGludCAgICAgIG5hbWVfaGFzaChjb25zdCBjaGFyICopOwpzdGF0aWMgdm9pZCAgICAgaW5pdF9ub2RlX2hhc2goc3RydWN0IG5vZGUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9lcnJvcihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKc3RhdGljIHZvaWQgICAgIGZyZWVfdHJlZShzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIGZyZWVfcGFydGlhbF90cmVlKHN0cnVjdCB0cmVlICosIGludCk7CnN0YXRpYyB2b2lkICAgICBmcmVlX25vZGUoc3RydWN0IG5vZGUgKik7CnN0YXRpYyB2b2lkICAgICBidWlsZF90cmFuc2xhdGlvbl90YWJsZSh2b2lkKTsKc3RhdGljIHZvaWQgICAgIGluaXRfdHJlZV9yb290cyh2b2lkKTsKc3RhdGljIHZvaWQgICAgIG1lcmdlX2Fub25fY2hpbGRyZW4oc3RydWN0IHRyZWUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICB1bmxpbmtfdGJ1Y2tldChzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHVubGlua190cmVlKHN0cnVjdCB0cmVlICopOwpzdGF0aWMgaW50ICAgICAgZ2V0b2lkKEZJTEUgKiwgc3RydWN0IHN1YmlkX3MgKiwgaW50KTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9vYmplY3RpZChGSUxFICosIGNoYXIgKik7CnN0YXRpYyBpbnQgICAgICBnZXRfdGMoY29uc3QgY2hhciAqLCBpbnQsIGludCAqLCBzdHJ1Y3QgZW51bV9saXN0ICoqLAogICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICoqLCBjaGFyICoqKTsKc3RhdGljIGludCAgICAgIGdldF90Y19pbmRleChjb25zdCBjaGFyICosIGludCk7CnN0YXRpYyBzdHJ1Y3QgZW51bV9saXN0ICpwYXJzZV9lbnVtbGlzdChGSUxFICosIHN0cnVjdCBlbnVtX2xpc3QgKiopOwpzdGF0aWMgc3RydWN0IHJhbmdlX2xpc3QgKnBhcnNlX3JhbmdlcyhGSUxFICogZnAsIHN0cnVjdCByYW5nZV9saXN0ICoqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9hc250eXBlKEZJTEUgKiwgY2hhciAqLCBpbnQgKiwgY2hhciAqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9vYmplY3R0eXBlKEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9vYmplY3Rncm91cChGSUxFICosIGNoYXIgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmpncm91cCAqKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2Vfbm90aWZpY2F0aW9uRGVmaW5pdGlvbihGSUxFICosIGNoYXIgKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2VfdHJhcERlZmluaXRpb24oRklMRSAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX2NvbXBsaWFuY2UoRklMRSAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX2NhcGFiaWxpdGllcyhGSUxFICosIGNoYXIgKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2VfbW9kdWxlSWRlbnRpdHkoRklMRSAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX21hY3JvKEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIHZvaWQgICAgIHBhcnNlX2ltcG9ydHMoRklMRSAqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZShGSUxFICosIHN0cnVjdCBub2RlICopOwoKc3RhdGljIGludCAgICAgcmVhZF9tb2R1bGVfaW50ZXJuYWwoY29uc3QgY2hhciAqKTsKc3RhdGljIGludCAgICAgcmVhZF9tb2R1bGVfcmVwbGFjZW1lbnRzKGNvbnN0IGNoYXIgKik7CnN0YXRpYyBpbnQgICAgIHJlYWRfaW1wb3J0X3JlcGxhY2VtZW50cyhjb25zdCBjaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1vZHVsZV9pbXBvcnQgKik7CgpzdGF0aWMgdm9pZCAgICAgbmV3X21vZHVsZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CgpzdGF0aWMgc3RydWN0IG5vZGUgKm1lcmdlX3BhcnNlX29iamVjdGlkKHN0cnVjdCBub2RlICosIEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIHN0cnVjdCBpbmRleF9saXN0ICpnZXRJbmRleGVzKEZJTEUgKiBmcCwgc3RydWN0IGluZGV4X2xpc3QgKiopOwpzdGF0aWMgc3RydWN0IHZhcmJpbmRfbGlzdCAqZ2V0VmFyYmluZHMoRklMRSAqIGZwLCBzdHJ1Y3QgdmFyYmluZF9saXN0ICoqKTsKc3RhdGljIHZvaWQgICAgIGZyZWVfaW5kZXhlcyhzdHJ1Y3QgaW5kZXhfbGlzdCAqKik7CnN0YXRpYyB2b2lkICAgICBmcmVlX3ZhcmJpbmRzKHN0cnVjdCB2YXJiaW5kX2xpc3QgKiopOwpzdGF0aWMgdm9pZCAgICAgZnJlZV9yYW5nZXMoc3RydWN0IHJhbmdlX2xpc3QgKiopOwpzdGF0aWMgdm9pZCAgICAgZnJlZV9lbnVtcyhzdHJ1Y3QgZW51bV9saXN0ICoqKTsKc3RhdGljIHN0cnVjdCByYW5nZV9saXN0ICpjb3B5X3JhbmdlcyhzdHJ1Y3QgcmFuZ2VfbGlzdCAqKTsKc3RhdGljIHN0cnVjdCBlbnVtX2xpc3QgKmNvcHlfZW51bXMoc3RydWN0IGVudW1fbGlzdCAqKTsKCnN0YXRpYyB1X2ludCAgICBjb21wdXRlX21hdGNoKGNvbnN0IGNoYXIgKnNlYXJjaF9iYXNlLCBjb25zdCBjaGFyICprZXkpOwoKdm9pZApzbm1wX21pYl90b2dnbGVfb3B0aW9uc191c2FnZShjb25zdCBjaGFyICpsZWFkLCBGSUxFICogb3V0ZikKewogICAgZnByaW50ZihvdXRmLCAiJXN1OiAgJXNhbGxvdyB0aGUgdXNlIG9mIHVuZGVybGluZXMgaW4gTUlCIHN5bWJvbHNcbiIsCiAgICAgICAgICAgIGxlYWQsICgobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMKSkgPwoJCSAgICJkaXMiIDogIiIpKTsKICAgIGZwcmludGYob3V0ZiwgIiVzYzogICVzYWxsb3cgdGhlIHVzZSBvZiBcIi0tXCIgdG8gdGVybWluYXRlIGNvbW1lbnRzXG4iLAogICAgICAgICAgICBsZWFkLCAoKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAoJCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pKSA/CgkJICAgIiIgOiAiZGlzIikpOwoKICAgIGZwcmludGYob3V0ZiwgIiVzZDogICVzc2F2ZSB0aGUgREVTQ1JJUFRJT05zIG9mIHRoZSBNSUIgb2JqZWN0c1xuIiwKICAgICAgICAgICAgbGVhZCwgKChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgPwoJCSAgICJkbyBub3QgIiA6ICIiKSk7CgogICAgZnByaW50ZihvdXRmLCAiJXNlOiAgZGlzYWJsZSBlcnJvcnMgd2hlbiBNSUIgc3ltYm9scyBjb25mbGljdFxuIiwgbGVhZCk7CgogICAgZnByaW50ZihvdXRmLCAiJXN3OiAgZW5hYmxlIHdhcm5pbmdzIHdoZW4gTUlCIHN5bWJvbHMgY29uZmxpY3RcbiIsIGxlYWQpOwoKICAgIGZwcmludGYob3V0ZiwgIiVzVzogIGVuYWJsZSBkZXRhaWxlZCB3YXJuaW5ncyB3aGVuIE1JQiBzeW1ib2xzIGNvbmZsaWN0XG4iLAogICAgICAgICAgICBsZWFkKTsKCiAgICBmcHJpbnRmKG91dGYsICIlc1I6ICByZXBsYWNlIE1JQiBzeW1ib2xzIGZyb20gbGF0ZXN0IG1vZHVsZVxuIiwgbGVhZCk7Cn0KCmNoYXIgICAgICAgICAgICoKc25tcF9taWJfdG9nZ2xlX29wdGlvbnMoY2hhciAqb3B0aW9ucykKewogICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICB3aGlsZSAoKm9wdGlvbnMpIHsKICAgICAgICAgICAgc3dpdGNoICgqb3B0aW9ucykgewogICAgICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfUEFSU0VfTEFCRUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ2MnOgogICAgICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkJICBORVRTTk1QX0RTX0xJQl9NSUJfQ09NTUVOVF9URVJNKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKCQkJCQkgIE5FVFNOTVBfRFNfTElCX01JQl9FUlJPUlMpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MsIDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdXJzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MsIDIpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCQkgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUyk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ1InOgogICAgICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgTkVUU05NUF9EU19MSUJfTUlCX1JFUExBQ0UpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHJldHVybiBhdCB0aGUgdW5rbm93biBvcHRpb24gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wdGlvbnMrKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKc3RhdGljIGludApuYW1lX2hhc2goY29uc3QgY2hhciAqbmFtZSkKewogICAgaW50ICAgICAgICAgICAgIGhhc2ggPSAwOwogICAgY29uc3QgY2hhciAgICAgKmNwOwoKICAgIGlmICghbmFtZSkKICAgICAgICByZXR1cm4gMDsKICAgIGZvciAoY3AgPSBuYW1lOyAqY3A7IGNwKyspCiAgICAgICAgaGFzaCArPSB0b2xvd2VyKCpjcCk7CiAgICByZXR1cm4gKGhhc2gpOwp9Cgp2b2lkCm5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKHZvaWQpCnsKICAgIHJlZ2lzdGVyIHN0cnVjdCB0b2sgKnRwOwogICAgcmVnaXN0ZXIgaW50ICAgIGIsIGk7CiAgICBpbnQgICAgICAgICAgICAgbWF4X21vZGM7CgogICAgaWYgKHRyZWVfaGVhZCkKICAgICAgICByZXR1cm47CgogICAgLyoKICAgICAqIFNldCB1cCBoYXNoIGxpc3Qgb2YgcHJlLWRlZmluZWQgdG9rZW5zCiAgICAgKi8KICAgIG1lbXNldChidWNrZXRzLCAwLCBzaXplb2YoYnVja2V0cykpOwogICAgZm9yICh0cCA9IHRva2VuczsgdHAtPm5hbWU7IHRwKyspIHsKICAgICAgICB0cC0+aGFzaCA9IG5hbWVfaGFzaCh0cC0+bmFtZSk7CiAgICAgICAgYiA9IEJVQ0tFVCh0cC0+aGFzaCk7CiAgICAgICAgaWYgKGJ1Y2tldHNbYl0pCiAgICAgICAgICAgIHRwLT5uZXh0ID0gYnVja2V0c1tiXTsgICAgICAvKiBCVUcgPz8/ICovCiAgICAgICAgYnVja2V0c1tiXSA9IHRwOwogICAgfQoKICAgIC8qCiAgICAgKiBJbml0aWFsaXNlIG90aGVyIGludGVybmFsIHN0cnVjdHVyZXMKICAgICAqLwoKICAgIG1heF9tb2RjID0gc2l6ZW9mKG1vZHVsZV9tYXApIC8gc2l6ZW9mKG1vZHVsZV9tYXBbMF0pIC0gMTsKICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfbW9kYzsgKytpKQogICAgICAgIG1vZHVsZV9tYXBbaV0ubmV4dCA9ICYobW9kdWxlX21hcFtpICsgMV0pOwogICAgbW9kdWxlX21hcFttYXhfbW9kY10ubmV4dCA9IE5VTEw7CiAgICBtb2R1bGVfbWFwX2hlYWQgPSBtb2R1bGVfbWFwOwoKICAgIG1lbXNldChuYnVja2V0cywgMCwgc2l6ZW9mKG5idWNrZXRzKSk7CiAgICBtZW1zZXQodGJ1Y2tldHMsIDAsIHNpemVvZih0YnVja2V0cykpOwogICAgbWVtc2V0KHRjbGlzdCwgMCwgTUFYVEMgKiBzaXplb2Yoc3RydWN0IHRjKSk7CiAgICBidWlsZF90cmFuc2xhdGlvbl90YWJsZSgpOwogICAgaW5pdF90cmVlX3Jvb3RzKCk7ICAgICAgICAgIC8qIFNldCB1cCBpbml0aWFsIHJvb3RzICovCiAgICAvKgogICAgICogUmVsaWVzIG9uICdhZGRfbWliZGlyJyBoYXZpbmcgc2V0IHVwIHRoZSBtb2R1bGVzIAogICAgICovCn0KCiNpZm5kZWYgTkVUU05NUF9OT19MRUdBQ1lfREVGSU5JVElPTlMKdm9pZAppbml0X21pYl9pbnRlcm5hbHModm9pZCkKewogICAgbmV0c25tcF9pbml0X21pYl9pbnRlcm5hbHMoKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkCmluaXRfbm9kZV9oYXNoKHN0cnVjdCBub2RlICpub2RlcykKewogICAgc3RydWN0IG5vZGUgICAgKm5wLCAqbmV4dHA7CiAgICBpbnQgICAgICAgICAgICAgaGFzaDsKCiAgICBtZW1zZXQobmJ1Y2tldHMsIDAsIHNpemVvZihuYnVja2V0cykpOwogICAgZm9yIChucCA9IG5vZGVzOyBucDspIHsKICAgICAgICBuZXh0cCA9IG5wLT5uZXh0OwogICAgICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaChucC0+cGFyZW50KSk7CiAgICAgICAgbnAtPm5leHQgPSBuYnVja2V0c1toYXNoXTsKICAgICAgICBuYnVja2V0c1toYXNoXSA9IG5wOwogICAgICAgIG5wID0gbmV4dHA7CiAgICB9Cn0KCnN0YXRpYyBpbnQgICAgICBlcnJvbmVvdXNNaWJzID0gMDsKCmludApnZXRfbWliX3BhcnNlX2Vycm9yX2NvdW50KHZvaWQpCnsKICAgIHJldHVybiBlcnJvbmVvdXNNaWJzOwp9CgoKc3RhdGljIHZvaWQKcHJpbnRfZXJyb3IoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICp0b2tlbiwgaW50IHR5cGUpCnsKICAgIGVycm9uZW91c01pYnMrKzsKICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIlxuIikpOwogICAgaWYgKHR5cGUgPT0gRU5ET0ZGSUxFKQogICAgICAgIHNubXBfbG9nKExPR19FUlIsICIlcyAoRU9GKTogQXQgbGluZSAlZCBpbiAlc1xuIiwgc3RyLCBtaWJMaW5lLAogICAgICAgICAgICAgICAgIEZpbGUpOwogICAgZWxzZSBpZiAodG9rZW4gJiYgKnRva2VuKQogICAgICAgIHNubXBfbG9nKExPR19FUlIsICIlcyAoJXMpOiBBdCBsaW5lICVkIGluICVzXG4iLCBzdHIsIHRva2VuLAogICAgICAgICAgICAgICAgIG1pYkxpbmUsIEZpbGUpOwogICAgZWxzZQogICAgICAgIHNubXBfbG9nKExPR19FUlIsICIlczogQXQgbGluZSAlZCBpbiAlc1xuIiwgc3RyLCBtaWJMaW5lLCBGaWxlKTsKfQoKc3RhdGljIHZvaWQKcHJpbnRfbW9kdWxlX25vdF9mb3VuZChjb25zdCBjaGFyICpjcCkKewogICAgaWYgKGZpcnN0X2Vycl9tb2R1bGUpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiTUlCIHNlYXJjaCBwYXRoOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9nZXRfbWliX2RpcmVjdG9yeSgpKTsKICAgICAgICBmaXJzdF9lcnJfbW9kdWxlID0gMDsKICAgIH0KICAgIGlmICghbGFzdF9lcnJfbW9kdWxlIHx8IHN0cmNtcChjcCwgbGFzdF9lcnJfbW9kdWxlKSkKICAgICAgICBwcmludF9lcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlIiwgY3AsIENPTlRJTlVFKTsKICAgIGlmIChsYXN0X2Vycl9tb2R1bGUpCiAgICAgICAgZnJlZShsYXN0X2Vycl9tb2R1bGUpOwogICAgbGFzdF9lcnJfbW9kdWxlID0gc3RyZHVwKGNwKTsKfQoKc3RhdGljIHN0cnVjdCBub2RlICoKYWxsb2Nfbm9kZShpbnQgbW9kaWQpCnsKICAgIHN0cnVjdCBub2RlICAgICpucDsKICAgIG5wID0gKHN0cnVjdCBub2RlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IG5vZGUpKTsKICAgIGlmIChucCkgewogICAgICAgIG5wLT50Y19pbmRleCA9IC0xOwogICAgICAgIG5wLT5tb2RpZCA9IG1vZGlkOwoJbnAtPmZpbGVuYW1lID0gc3RyZHVwKEZpbGUpOwoJbnAtPmxpbmVubyA9IG1pYkxpbmU7CiAgICB9CiAgICByZXR1cm4gbnA7Cn0KCnN0YXRpYyB2b2lkCnVubGlua190YnVja2V0KHN0cnVjdCB0cmVlICp0cCkKewogICAgaW50ICAgICAgICAgICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaCh0cC0+bGFiZWwpKTsKICAgIHN0cnVjdCB0cmVlICAgICpvdHAgPSBOVUxMLCAqbnRwID0gdGJ1Y2tldHNbaGFzaF07CgogICAgd2hpbGUgKG50cCAmJiBudHAgIT0gdHApIHsKICAgICAgICBvdHAgPSBudHA7CiAgICAgICAgbnRwID0gbnRwLT5uZXh0OwogICAgfQogICAgaWYgKCFudHApCiAgICAgICAgc25tcF9sb2coTE9HX0VNRVJHLCAiQ2FuJ3QgZmluZCAlcyBpbiB0YnVja2V0c1xuIiwgdHAtPmxhYmVsKTsKICAgIGVsc2UgaWYgKG90cCkKICAgICAgICBvdHAtPm5leHQgPSBudHAtPm5leHQ7CiAgICBlbHNlCiAgICAgICAgdGJ1Y2tldHNbaGFzaF0gPSB0cC0+bmV4dDsKfQoKc3RhdGljIHZvaWQKdW5saW5rX3RyZWUoc3RydWN0IHRyZWUgKnRwKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqb3RwID0gTlVMTCwgKm50cCA9IHRwLT5wYXJlbnQ7CgogICAgaWYgKCFudHApIHsgICAgICAgICAgICAgICAgIC8qIHRoaXMgdHJlZSBoYXMgbm8gcGFyZW50ICovCiAgICAgICAgREVCVUdNU0dUTCgoInVubGlua190cmVlIiwgIlRyZWUgbm9kZSAlcyBoYXMgbm8gcGFyZW50XG4iLAogICAgICAgICAgICAgICAgICAgIHRwLT5sYWJlbCkpOwogICAgfSBlbHNlIHsKICAgICAgICBudHAgPSBudHAtPmNoaWxkX2xpc3Q7CgogICAgICAgIHdoaWxlIChudHAgJiYgbnRwICE9IHRwKSB7CiAgICAgICAgICAgIG90cCA9IG50cDsKICAgICAgICAgICAgbnRwID0gbnRwLT5uZXh0X3BlZXI7CiAgICAgICAgfQogICAgICAgIGlmICghbnRwKQogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRU1FUkcsICJDYW4ndCBmaW5kICVzIGluICVzJ3MgY2hpbGRyZW5cbiIsCiAgICAgICAgICAgICAgICAgICAgIHRwLT5sYWJlbCwgdHAtPnBhcmVudC0+bGFiZWwpOwogICAgICAgIGVsc2UgaWYgKG90cCkKICAgICAgICAgICAgb3RwLT5uZXh0X3BlZXIgPSBudHAtPm5leHRfcGVlcjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRwLT5wYXJlbnQtPmNoaWxkX2xpc3QgPSB0cC0+bmV4dF9wZWVyOwogICAgfQoKICAgIGlmICh0cmVlX2hlYWQgPT0gdHApCiAgICAgICAgdHJlZV9oZWFkID0gdHAtPm5leHRfcGVlcjsKfQoKc3RhdGljIHZvaWQKZnJlZV9wYXJ0aWFsX3RyZWUoc3RydWN0IHRyZWUgKnRwLCBpbnQga2VlcF9sYWJlbCkKewogICAgaWYgKCF0cCkKICAgICAgICByZXR1cm47CgogICAgLyoKICAgICAqIHJlbW92ZSB0aGUgZGF0YSBmcm9tIHRoaXMgdHJlZSBub2RlIAogICAgICovCiAgICBmcmVlX2VudW1zKCZ0cC0+ZW51bXMpOwogICAgZnJlZV9yYW5nZXMoJnRwLT5yYW5nZXMpOwogICAgZnJlZV9pbmRleGVzKCZ0cC0+aW5kZXhlcyk7CiAgICBmcmVlX3ZhcmJpbmRzKCZ0cC0+dmFyYmluZHMpOwogICAgaWYgKCFrZWVwX2xhYmVsKQogICAgICAgIFNOTVBfRlJFRSh0cC0+bGFiZWwpOwogICAgU05NUF9GUkVFKHRwLT5oaW50KTsKICAgIFNOTVBfRlJFRSh0cC0+dW5pdHMpOwogICAgU05NUF9GUkVFKHRwLT5kZXNjcmlwdGlvbik7CiAgICBTTk1QX0ZSRUUodHAtPnJlZmVyZW5jZSk7CiAgICBTTk1QX0ZSRUUodHAtPmF1Z21lbnRzKTsKICAgIFNOTVBfRlJFRSh0cC0+ZGVmYXVsdFZhbHVlKTsKfQoKLyoKICogZnJlZSBhIHRyZWUgbm9kZS4gTm90ZTogdGhlIG5vZGUgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiB1bmxpbmtlZAogKiBmcm9tIHRoZSB0cmVlIHdoZW4gY2FsbGluZyB0aGlzIHJvdXRpbmUKICovCnN0YXRpYyB2b2lkCmZyZWVfdHJlZShzdHJ1Y3QgdHJlZSAqVHJlZSkKewogICAgaWYgKCFUcmVlKQogICAgICAgIHJldHVybjsKCiAgICB1bmxpbmtfdGJ1Y2tldChUcmVlKTsKICAgIGZyZWVfcGFydGlhbF90cmVlKFRyZWUsIEZBTFNFKTsKICAgIGlmIChUcmVlLT5udW1iZXJfbW9kdWxlcyA+IDEpCiAgICAgICAgZnJlZSgoY2hhciAqKSBUcmVlLT5tb2R1bGVfbGlzdCk7CiAgICBmcmVlKChjaGFyICopIFRyZWUpOwp9CgpzdGF0aWMgdm9pZApmcmVlX25vZGUoc3RydWN0IG5vZGUgKm5wKQp7CiAgICBpZiAoIW5wKQogICAgICAgIHJldHVybjsKCiAgICBmcmVlX2VudW1zKCZucC0+ZW51bXMpOwogICAgZnJlZV9yYW5nZXMoJm5wLT5yYW5nZXMpOwogICAgZnJlZV9pbmRleGVzKCZucC0+aW5kZXhlcyk7CiAgICBmcmVlX3ZhcmJpbmRzKCZucC0+dmFyYmluZHMpOwogICAgaWYgKG5wLT5sYWJlbCkKICAgICAgICBmcmVlKG5wLT5sYWJlbCk7CiAgICBpZiAobnAtPmhpbnQpCiAgICAgICAgZnJlZShucC0+aGludCk7CiAgICBpZiAobnAtPnVuaXRzKQogICAgICAgIGZyZWUobnAtPnVuaXRzKTsKICAgIGlmIChucC0+ZGVzY3JpcHRpb24pCiAgICAgICAgZnJlZShucC0+ZGVzY3JpcHRpb24pOwogICAgaWYgKG5wLT5yZWZlcmVuY2UpCiAgICAgICAgZnJlZShucC0+cmVmZXJlbmNlKTsKICAgIGlmIChucC0+ZGVmYXVsdFZhbHVlKQogICAgICAgIGZyZWUobnAtPmRlZmF1bHRWYWx1ZSk7CiAgICBpZiAobnAtPnBhcmVudCkKICAgICAgICBmcmVlKG5wLT5wYXJlbnQpOwogICAgaWYgKG5wLT5hdWdtZW50cykKICAgICAgICBmcmVlKG5wLT5hdWdtZW50cyk7CiAgICBpZiAobnAtPmZpbGVuYW1lKQoJZnJlZShucC0+ZmlsZW5hbWUpOwogICAgZnJlZSgoY2hhciAqKSBucCk7Cn0KCnN0YXRpYyB2b2lkCnByaW50X3JhbmdlX3ZhbHVlKEZJTEUgKiBmcCwgaW50IHR5cGUsIHN0cnVjdCByYW5nZV9saXN0ICogcnApCnsKICAgIHN3aXRjaCAodHlwZSkgewogICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgIGlmIChycC0+bG93ID09IHJwLT5oaWdoKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiJWQiLCBycC0+bG93KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGZwcmludGYoZnAsICIlZC4uJWQiLCBycC0+bG93LCBycC0+aGlnaCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgIGNhc2UgVFlQRV9HQVVHRToKICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICBpZiAocnAtPmxvdyA9PSBycC0+aGlnaCkKICAgICAgICAgICAgZnByaW50ZihmcCwgIiV1IiwgKHVuc2lnbmVkKXJwLT5sb3cpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZnByaW50ZihmcCwgIiV1Li4ldSIsICh1bnNpZ25lZClycC0+bG93LCAodW5zaWduZWQpcnAtPmhpZ2gpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAvKiBObyBvdGhlciByYW5nZSB0eXBlcyBhbGxvd2VkICovCiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCiNpZmRlZiBURVNUCnN0YXRpYyB2b2lkCnByaW50X25vZGVzKEZJTEUgKiBmcCwgc3RydWN0IG5vZGUgKnJvb3QpCnsKICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVwOwogICAgc3RydWN0IGluZGV4X2xpc3QgKmlwOwogICAgc3RydWN0IHJhbmdlX2xpc3QgKnJwOwogICAgc3RydWN0IHZhcmJpbmRfbGlzdCAqdnA7CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnA7CgogICAgZm9yIChucCA9IHJvb3Q7IG5wOyBucCA9IG5wLT5uZXh0KSB7CiAgICAgICAgZnByaW50ZihmcCwgIiVzIDo6PSB7ICVzICVsZCB9ICglZClcbiIsIG5wLT5sYWJlbCwgbnAtPnBhcmVudCwKICAgICAgICAgICAgICAgIG5wLT5zdWJpZCwgbnAtPnR5cGUpOwogICAgICAgIGlmIChucC0+dGNfaW5kZXggPj0gMCkKICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgVEMgPSAlc1xuIiwgdGNsaXN0W25wLT50Y19pbmRleF0uZGVzY3JpcHRvcik7CiAgICAgICAgaWYgKG5wLT5lbnVtcykgewogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBFbnVtczogXG4iKTsKICAgICAgICAgICAgZm9yIChlcCA9IG5wLT5lbnVtczsgZXA7IGVwID0gZXAtPm5leHQpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgICAgJXMoJWQpXG4iLCBlcC0+bGFiZWwsIGVwLT52YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG5wLT5yYW5nZXMpIHsKICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgUmFuZ2VzOiAiKTsKICAgICAgICAgICAgZm9yIChycCA9IG5wLT5yYW5nZXM7IHJwOyBycCA9IHJwLT5uZXh0KSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXG4gICAgIik7CiAgICAgICAgICAgICAgICBwcmludF9yYW5nZV92YWx1ZShmcCwgbnAtPnR5cGUsIHJwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiXG4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKG5wLT5pbmRleGVzKSB7CiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIEluZGV4ZXM6IFxuIik7CiAgICAgICAgICAgIGZvciAoaXAgPSBucC0+aW5kZXhlczsgaXA7IGlwID0gaXAtPm5leHQpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgICAgJXNcbiIsIGlwLT5pbGFiZWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChucC0+YXVnbWVudHMpCiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIEF1Z21lbnRzOiAlc1xuIiwgbnAtPmF1Z21lbnRzKTsKICAgICAgICBpZiAobnAtPnZhcmJpbmRzKSB7CiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIFZhcmJpbmRzOiBcbiIpOwogICAgICAgICAgICBmb3IgKHZwID0gbnAtPnZhcmJpbmRzOyB2cDsgdnAgPSB2cC0+bmV4dCkgewogICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgICAlc1xuIiwgdnAtPnZibGFiZWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChucC0+aGludCkKICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgSGludDogJXNcbiIsIG5wLT5oaW50KTsKICAgICAgICBpZiAobnAtPnVuaXRzKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBVbml0czogJXNcbiIsIG5wLT51bml0cyk7CiAgICAgICAgaWYgKG5wLT5kZWZhdWx0VmFsdWUpCiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIERlZmF1bHRWYWx1ZTogJXNcbiIsIG5wLT5kZWZhdWx0VmFsdWUpOwogICAgfQp9CiNlbmRpZgoKdm9pZApwcmludF9zdWJ0cmVlKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHJlZSwgaW50IGNvdW50KQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIGNoYXIgICAgICAgICAgICBtb2RidWZbMjU2XTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKICAgICAgICBmcHJpbnRmKGYsICIgICIpOwogICAgZnByaW50ZihmLCAiQ2hpbGRyZW4gb2YgJXMoJWxkKTpcbiIsIHRyZWUtPmxhYmVsLCB0cmVlLT5zdWJpZCk7CiAgICBjb3VudCsrOwogICAgZm9yICh0cCA9IHRyZWUtPmNoaWxkX2xpc3Q7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKICAgICAgICAgICAgZnByaW50ZihmLCAiICAiKTsKICAgICAgICBmcHJpbnRmKGYsICIlczolcyglbGQpIHR5cGU9JWQiLAogICAgICAgICAgICAgICAgbW9kdWxlX25hbWUodHAtPm1vZHVsZV9saXN0WzBdLCBtb2RidWYpLAogICAgICAgICAgICAgICAgdHAtPmxhYmVsLCB0cC0+c3ViaWQsIHRwLT50eXBlKTsKICAgICAgICBpZiAodHAtPnRjX2luZGV4ICE9IC0xKQogICAgICAgICAgICBmcHJpbnRmKGYsICIgdGM9JWQiLCB0cC0+dGNfaW5kZXgpOwogICAgICAgIGlmICh0cC0+aGludCkKICAgICAgICAgICAgZnByaW50ZihmLCAiIGhpbnQ9JXMiLCB0cC0+aGludCk7CiAgICAgICAgaWYgKHRwLT51bml0cykKICAgICAgICAgICAgZnByaW50ZihmLCAiIHVuaXRzPSVzIiwgdHAtPnVuaXRzKTsKICAgICAgICBpZiAodHAtPm51bWJlcl9tb2R1bGVzID4gMSkgewogICAgICAgICAgICBmcHJpbnRmKGYsICIgbW9kdWxlczoiKTsKICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHRwLT5udW1iZXJfbW9kdWxlczsgaSsrKQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICVzIiwgbW9kdWxlX25hbWUodHAtPm1vZHVsZV9saXN0W2ldLCBtb2RidWYpKTsKICAgICAgICB9CiAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgIH0KICAgIGZvciAodHAgPSB0cmVlLT5jaGlsZF9saXN0OyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgaWYgKHRwLT5jaGlsZF9saXN0KQogICAgICAgICAgICBwcmludF9zdWJ0cmVlKGYsIHRwLCBjb3VudCk7CiAgICB9Cn0KCnZvaWQKcHJpbnRfYXNjaWlfZHVtcF90cmVlKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHJlZSwgaW50IGNvdW50KQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CgogICAgY291bnQrKzsKICAgIGZvciAodHAgPSB0cmVlLT5jaGlsZF9saXN0OyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgZnByaW50ZihmLCAiJXMgT0JKRUNUIElERU5USUZJRVIgOjo9IHsgJXMgJWxkIH1cbiIsIHRwLT5sYWJlbCwKICAgICAgICAgICAgICAgIHRyZWUtPmxhYmVsLCB0cC0+c3ViaWQpOwogICAgfQogICAgZm9yICh0cCA9IHRyZWUtPmNoaWxkX2xpc3Q7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpIHsKICAgICAgICBpZiAodHAtPmNoaWxkX2xpc3QpCiAgICAgICAgICAgIHByaW50X2FzY2lpX2R1bXBfdHJlZShmLCB0cCwgY291bnQpOwogICAgfQp9CgpzdGF0aWMgaW50ICAgICAgdHJhbnNsYXRpb25fdGFibGVbMjU2XTsKCnN0YXRpYyB2b2lkCmJ1aWxkX3RyYW5zbGF0aW9uX3RhYmxlKHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBjb3VudDsKCiAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNTY7IGNvdW50KyspIHsKICAgICAgICBzd2l0Y2ggKGNvdW50KSB7CiAgICAgICAgY2FzZSBPQkpJRDoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9PQkpJRDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPQ1RFVFNUUjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9PQ1RFVFNUUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBJTlRFR0VSOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX0lOVEVHRVI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTkVUQUREUjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9ORVRBRERSOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElQQUREUjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9JUEFERFI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ09VTlRFUjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9DT1VOVEVSOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEdBVUdFOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX0dBVUdFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRJTUVUSUNLUzoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9USU1FVElDS1M7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgS1dfT1BBUVVFOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX09QQVFVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOVUw6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTlVMTDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDT1VOVEVSNjQ6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfQ09VTlRFUjY0OwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEJJVFNUUklORzoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9CSVRTVFJJTkc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTlNBUEFERFJFU1M6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTlNBUEFERFJFU1M7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSU5URUdFUjMyOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX0lOVEVHRVIzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBVSU5URUdFUjMyOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX1VJTlRFR0VSOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFVOU0lHTkVEMzI6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfVU5TSUdORUQzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUUkFQVFlQRToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9UUkFQVFlQRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOT1RJRlRZUEU6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTk9USUZUWVBFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5PVElGR1JPVVA6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTk9USUZHUk9VUDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPQkpHUk9VUDoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9PQkpHUk9VUDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNT0RVTEVJREVOVElUWToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9NT0RJRDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPQkpJREVOVElUWToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9PQkpJREVOVElUWTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBR0VOVENBUDoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9BR0VOVENBUDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDT01QTElBTkNFOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX01PRENPTVA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfT1RIRVI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQKaW5pdF90cmVlX3Jvb3RzKHZvaWQpCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCwgKmxhc3R0cDsKICAgIGludCAgICAgICAgICAgICBiYXNlX21vZGlkOwogICAgaW50ICAgICAgICAgICAgIGhhc2g7CgogICAgYmFzZV9tb2RpZCA9IHdoaWNoX21vZHVsZSgiU05NUHYyLVNNSSIpOwogICAgaWYgKGJhc2VfbW9kaWQgPT0gLTEpCiAgICAgICAgYmFzZV9tb2RpZCA9IHdoaWNoX21vZHVsZSgiUkZDMTE1NS1TTUkiKTsKICAgIGlmIChiYXNlX21vZGlkID09IC0xKQogICAgICAgIGJhc2VfbW9kaWQgPSB3aGljaF9tb2R1bGUoIlJGQzEyMTMtTUlCIik7CgogICAgLyoKICAgICAqIGJ1aWxkIHJvb3Qgbm9kZSAKICAgICAqLwogICAgdHAgPSAoc3RydWN0IHRyZWUgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdHJlZSkpOwogICAgaWYgKHRwID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwogICAgdHAtPmxhYmVsID0gc3RyZHVwKCJqb2ludC1pc28tY2NpdHQiKTsKICAgIHRwLT5tb2RpZCA9IGJhc2VfbW9kaWQ7CiAgICB0cC0+bnVtYmVyX21vZHVsZXMgPSAxOwogICAgdHAtPm1vZHVsZV9saXN0ID0gJih0cC0+bW9kaWQpOwogICAgdHAtPnN1YmlkID0gMjsKICAgIHRwLT50Y19pbmRleCA9IC0xOwogICAgc2V0X2Z1bmN0aW9uKHRwKTsgICAgICAgICAgIC8qIGZyb20gbWliLmMgKi8KICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaCh0cC0+bGFiZWwpKTsKICAgIHRwLT5uZXh0ID0gdGJ1Y2tldHNbaGFzaF07CiAgICB0YnVja2V0c1toYXNoXSA9IHRwOwogICAgbGFzdHRwID0gdHA7CiAgICByb290X2ltcG9ydHNbMF0ubGFiZWwgPSBzdHJkdXAodHAtPmxhYmVsKTsKICAgIHJvb3RfaW1wb3J0c1swXS5tb2RpZCA9IGJhc2VfbW9kaWQ7CgogICAgLyoKICAgICAqIGJ1aWxkIHJvb3Qgbm9kZSAKICAgICAqLwogICAgdHAgPSAoc3RydWN0IHRyZWUgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdHJlZSkpOwogICAgaWYgKHRwID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwogICAgdHAtPm5leHRfcGVlciA9IGxhc3R0cDsKICAgIHRwLT5sYWJlbCA9IHN0cmR1cCgiY2NpdHQiKTsKICAgIHRwLT5tb2RpZCA9IGJhc2VfbW9kaWQ7CiAgICB0cC0+bnVtYmVyX21vZHVsZXMgPSAxOwogICAgdHAtPm1vZHVsZV9saXN0ID0gJih0cC0+bW9kaWQpOwogICAgdHAtPnN1YmlkID0gMDsKICAgIHRwLT50Y19pbmRleCA9IC0xOwogICAgc2V0X2Z1bmN0aW9uKHRwKTsgICAgICAgICAgIC8qIGZyb20gbWliLmMgKi8KICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaCh0cC0+bGFiZWwpKTsKICAgIHRwLT5uZXh0ID0gdGJ1Y2tldHNbaGFzaF07CiAgICB0YnVja2V0c1toYXNoXSA9IHRwOwogICAgbGFzdHRwID0gdHA7CiAgICByb290X2ltcG9ydHNbMV0ubGFiZWwgPSBzdHJkdXAodHAtPmxhYmVsKTsKICAgIHJvb3RfaW1wb3J0c1sxXS5tb2RpZCA9IGJhc2VfbW9kaWQ7CgogICAgLyoKICAgICAqIGJ1aWxkIHJvb3Qgbm9kZSAKICAgICAqLwogICAgdHAgPSAoc3RydWN0IHRyZWUgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdHJlZSkpOwogICAgaWYgKHRwID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwogICAgdHAtPm5leHRfcGVlciA9IGxhc3R0cDsKICAgIHRwLT5sYWJlbCA9IHN0cmR1cCgiaXNvIik7CiAgICB0cC0+bW9kaWQgPSBiYXNlX21vZGlkOwogICAgdHAtPm51bWJlcl9tb2R1bGVzID0gMTsKICAgIHRwLT5tb2R1bGVfbGlzdCA9ICYodHAtPm1vZGlkKTsKICAgIHRwLT5zdWJpZCA9IDE7CiAgICB0cC0+dGNfaW5kZXggPSAtMTsKICAgIHNldF9mdW5jdGlvbih0cCk7ICAgICAgICAgICAvKiBmcm9tIG1pYi5jICovCiAgICBoYXNoID0gTkJVQ0tFVChuYW1lX2hhc2godHAtPmxhYmVsKSk7CiAgICB0cC0+bmV4dCA9IHRidWNrZXRzW2hhc2hdOwogICAgdGJ1Y2tldHNbaGFzaF0gPSB0cDsKICAgIGxhc3R0cCA9IHRwOwogICAgcm9vdF9pbXBvcnRzWzJdLmxhYmVsID0gc3RyZHVwKHRwLT5sYWJlbCk7CiAgICByb290X2ltcG9ydHNbMl0ubW9kaWQgPSBiYXNlX21vZGlkOwoKICAgIHRyZWVfaGVhZCA9IHRwOwp9CgojaWZkZWYgU1RSSUNUX01JQl9QQVJTRUlORwojZGVmaW5lCWxhYmVsX2NvbXBhcmUJc3RyY2FzZWNtcAojZWxzZQojZGVmaW5lCWxhYmVsX2NvbXBhcmUJc3RyY21wCiNlbmRpZgoKCnN0cnVjdCB0cmVlICAgICoKZmluZF90cmVlX25vZGUoY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGlkKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAsICpoZWFkdHA7CiAgICBpbnQgICAgICAgICAgICAgY291bnQsICppbnRfcDsKCiAgICBpZiAoIW5hbWUgfHwgISpuYW1lKQogICAgICAgIHJldHVybiAoTlVMTCk7CgogICAgaGVhZHRwID0gdGJ1Y2tldHNbTkJVQ0tFVChuYW1lX2hhc2gobmFtZSkpXTsKICAgIGZvciAodHAgPSBoZWFkdHA7IHRwOyB0cCA9IHRwLT5uZXh0KSB7CiAgICAgICAgaWYgKHRwLT5sYWJlbCAmJiAhbGFiZWxfY29tcGFyZSh0cC0+bGFiZWwsIG5hbWUpKSB7CgogICAgICAgICAgICBpZiAobW9kaWQgPT0gLTEpICAgIC8qIEFueSBtb2R1bGUgKi8KICAgICAgICAgICAgICAgIHJldHVybiAodHApOwoKICAgICAgICAgICAgZm9yIChpbnRfcCA9IHRwLT5tb2R1bGVfbGlzdCwgY291bnQgPSAwOwogICAgICAgICAgICAgICAgIGNvdW50IDwgdHAtPm51bWJlcl9tb2R1bGVzOyArK2NvdW50LCArK2ludF9wKQogICAgICAgICAgICAgICAgaWYgKCppbnRfcCA9PSBtb2RpZCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRwKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIChOVUxMKTsKfQoKLyoKICogY29tcHV0ZXMgYSB2YWx1ZSB3aGljaCByZXByZXNlbnRzIGhvdyBjbG9zZSBuYW1lMSBpcyB0byBuYW1lMi4KICogKiBoaWdoIHNjb3JlcyBtZWFuIGEgd29yc2UgbWF0Y2guCiAqICogKHllcywgdGhlIGFsZ29yaXRobSBzdWNrcyEpCiAqLwojZGVmaW5lIE1BWF9CQUQgMHhmZmZmZmYKCnN0YXRpYyAgICAgICAgICB1X2ludApjb21wdXRlX21hdGNoKGNvbnN0IGNoYXIgKnNlYXJjaF9iYXNlLCBjb25zdCBjaGFyICprZXkpCnsKI2lmIGRlZmluZWQoSEFWRV9SRUdFWF9IKSAmJiBkZWZpbmVkKEhBVkVfUkVHQ09NUCkKICAgIGludCAgICAgICAgICAgICByYzsKICAgIHJlZ2V4X3QgICAgICAgICBwYXJzZXRyZWU7CiAgICByZWdtYXRjaF90ICAgICAgcG1hdGNoOwogICAgcmMgPSByZWdjb21wKCZwYXJzZXRyZWUsIGtleSwgUkVHX0lDQVNFIHwgUkVHX0VYVEVOREVEKTsKICAgIGlmIChyYyA9PSAwKQogICAgICAgIHJjID0gcmVnZXhlYygmcGFyc2V0cmVlLCBzZWFyY2hfYmFzZSwgMSwgJnBtYXRjaCwgMCk7CiAgICByZWdmcmVlKCZwYXJzZXRyZWUpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICAvKgogICAgICAgICAqIGZvdW5kIAogICAgICAgICAqLwogICAgICAgIHJldHVybiBwbWF0Y2gucm1fc287CiAgICB9CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIG91ciBvd24gd2lsZGNhcmQgbWF0Y2hlciAqLwogICAgLyoKICAgICAqIGZpcnN0IGZpbmQgdGhlIGxvbmdlc3QgbWF0Y2hpbmcgc3Vic3RyaW5nIChpY2spIAogICAgICovCiAgICBjaGFyICAgICAgICAgICAqZmlyc3QgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTCwgKmVudHJ5OwogICAgY29uc3QgY2hhciAgICAgKnBvc2l0aW9uOwogICAgY2hhciAgICAgICAgICAgKm5ld2tleSA9IHN0cmR1cChrZXkpOwogICAgY2hhciAgICAgICAgICAgKnN0OwoKCiAgICBlbnRyeSA9IHN0cnRva19yKG5ld2tleSwgIioiLCAmc3QpOwogICAgcG9zaXRpb24gPSBzZWFyY2hfYmFzZTsKICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgIHJlc3VsdCA9IHN0cmNhc2VzdHIocG9zaXRpb24sIGVudHJ5KTsKCiAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CiAgICAgICAgICAgIGZyZWUobmV3a2V5KTsKICAgICAgICAgICAgcmV0dXJuIE1BWF9CQUQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoZmlyc3QgPT0gTlVMTCkKICAgICAgICAgICAgZmlyc3QgPSByZXN1bHQ7CgogICAgICAgIHBvc2l0aW9uID0gcmVzdWx0ICsgc3RybGVuKGVudHJ5KTsKICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsICIqIiwgJnN0KTsKICAgIH0KICAgIGZyZWUobmV3a2V5KTsKICAgIGlmIChyZXN1bHQpCiAgICAgICAgcmV0dXJuIChmaXJzdCAtIHNlYXJjaF9iYXNlKTsKI2VuZGlmCgogICAgLyoKICAgICAqIG5vdCBmb3VuZCAKICAgICAqLwogICAgcmV0dXJuIE1BWF9CQUQ7Cn0KCi8qCiAqIEZpbmQgdGhlIHRyZWUgbm9kZSB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgcGF0dGVybiBzdHJpbmcuCiAqIFVzZSB0aGUgInJlcG9ydGVkIiBmbGFnIHN1Y2ggdGhhdCBvbmx5IG9uZSBtYXRjaAogKiBpcyBhdHRlbXB0ZWQgZm9yIGV2ZXJ5IG5vZGUuCiAqCiAqIFdhcm5pbmchIFRoaXMgZnVuY3Rpb24gbWF5IHJlY3Vyc2UuCiAqCiAqIENhbGxlciBfbXVzdF8gaW52b2tlIGNsZWFyX3RyZWVfZmxhZ3MgYmVmb3JlIGZpcnN0IGNhbGwKICogdG8gdGhpcyBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcwogKiB0byBlbnN1cmUgdGhhdCB0aGUgZW50aXJlIHRyZWUgaXMgdHJhdmVyc2VkLgogKi8KCnN0cnVjdCB0cmVlICAgICoKZmluZF9iZXN0X3RyZWVfbm9kZShjb25zdCBjaGFyICpwYXR0cm4sIHN0cnVjdCB0cmVlICp0cmVlX3RvcCwKICAgICAgICAgICAgICAgICAgICB1X2ludCAqIG1hdGNoKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAsICpiZXN0X3NvX2ZhciA9IE5VTEwsICpyZXRwdHI7CiAgICB1X2ludCAgICAgICAgICAgb2xkX21hdGNoID0gTUFYX0JBRCwgbmV3X21hdGNoID0gTUFYX0JBRDsKCiAgICBpZiAoIXBhdHRybiB8fCAhKnBhdHRybikKICAgICAgICByZXR1cm4gKE5VTEwpOwoKICAgIGlmICghdHJlZV90b3ApCiAgICAgICAgdHJlZV90b3AgPSBnZXRfdHJlZV9oZWFkKCk7CgogICAgZm9yICh0cCA9IHRyZWVfdG9wOyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgaWYgKCF0cC0+cmVwb3J0ZWQgJiYgdHAtPmxhYmVsKQogICAgICAgICAgICBuZXdfbWF0Y2ggPSBjb21wdXRlX21hdGNoKHRwLT5sYWJlbCwgcGF0dHJuKTsKICAgICAgICB0cC0+cmVwb3J0ZWQgPSAxOwoKICAgICAgICBpZiAobmV3X21hdGNoIDwgb2xkX21hdGNoKSB7CiAgICAgICAgICAgIGJlc3Rfc29fZmFyID0gdHA7CiAgICAgICAgICAgIG9sZF9tYXRjaCA9IG5ld19tYXRjaDsKICAgICAgICB9CiAgICAgICAgaWYgKG5ld19tYXRjaCA9PSAwKQogICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgIC8qIHRoaXMgaXMgdGhlIGJlc3QgcmVzdWx0IHdlIGNhbiBnZXQgKi8KICAgICAgICBpZiAodHAtPmNoaWxkX2xpc3QpIHsKICAgICAgICAgICAgcmV0cHRyID0KICAgICAgICAgICAgICAgIGZpbmRfYmVzdF90cmVlX25vZGUocGF0dHJuLCB0cC0+Y2hpbGRfbGlzdCwgJm5ld19tYXRjaCk7CiAgICAgICAgICAgIGlmIChuZXdfbWF0Y2ggPCBvbGRfbWF0Y2gpIHsKICAgICAgICAgICAgICAgIGJlc3Rfc29fZmFyID0gcmV0cHRyOwogICAgICAgICAgICAgICAgb2xkX21hdGNoID0gbmV3X21hdGNoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdfbWF0Y2ggPT0gMCkKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiB0aGlzIGlzIHRoZSBiZXN0IHJlc3VsdCB3ZSBjYW4gZ2V0ICovCiAgICAgICAgfQogICAgfQogICAgaWYgKG1hdGNoKQogICAgICAgICptYXRjaCA9IG9sZF9tYXRjaDsKICAgIHJldHVybiAoYmVzdF9zb19mYXIpOwp9CgoKc3RhdGljIHZvaWQKbWVyZ2VfYW5vbl9jaGlsZHJlbihzdHJ1Y3QgdHJlZSAqdHAxLCBzdHJ1Y3QgdHJlZSAqdHAyKQogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIE5COiB0cDEgaXMgdGhlICdhbm9ueW1vdXMnIG5vZGUgCiAgICAgICAgICAgICAgICAgKi8KewogICAgc3RydWN0IHRyZWUgICAgKmNoaWxkMSwgKmNoaWxkMiwgKnByZXZpb3VzOwoKICAgIGZvciAoY2hpbGQxID0gdHAxLT5jaGlsZF9saXN0OyBjaGlsZDE7KSB7CgogICAgICAgIGZvciAoY2hpbGQyID0gdHAyLT5jaGlsZF9saXN0LCBwcmV2aW91cyA9IE5VTEw7CiAgICAgICAgICAgICBjaGlsZDI7IHByZXZpb3VzID0gY2hpbGQyLCBjaGlsZDIgPSBjaGlsZDItPm5leHRfcGVlcikgewoKICAgICAgICAgICAgaWYgKGNoaWxkMS0+c3ViaWQgPT0gY2hpbGQyLT5zdWJpZCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIEZvdW5kICdtYXRjaGluZycgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgKiAgc28gbWVyZ2UgdGhlbQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoY2hpbGQxLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pKSB7CiAgICAgICAgICAgICAgICAgICAgbWVyZ2VfYW5vbl9jaGlsZHJlbihjaGlsZDEsIGNoaWxkMik7CgogICAgICAgICAgICAgICAgICAgIGNoaWxkMS0+Y2hpbGRfbGlzdCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgPSBjaGlsZDE7ICAvKiBGaW5pc2hlZCB3aXRoICdjaGlsZDEnICovCiAgICAgICAgICAgICAgICAgICAgY2hpbGQxID0gY2hpbGQxLT5uZXh0X3BlZXI7CiAgICAgICAgICAgICAgICAgICAgZnJlZV90cmVlKHByZXZpb3VzKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoY2hpbGQyLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pKSB7CiAgICAgICAgICAgICAgICAgICAgbWVyZ2VfYW5vbl9jaGlsZHJlbihjaGlsZDIsIGNoaWxkMSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cykKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMtPm5leHRfcGVlciA9IGNoaWxkMi0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgdHAyLT5jaGlsZF9saXN0ID0gY2hpbGQyLT5uZXh0X3BlZXI7CiAgICAgICAgICAgICAgICAgICAgZnJlZV90cmVlKGNoaWxkMik7CgogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gY2hpbGQxOyAgLyogTW92ZSAnY2hpbGQxJyB0byAndHAyJyAqLwogICAgICAgICAgICAgICAgICAgIGNoaWxkMSA9IGNoaWxkMS0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLT5uZXh0X3BlZXIgPSB0cDItPmNoaWxkX2xpc3Q7CiAgICAgICAgICAgICAgICAgICAgdHAyLT5jaGlsZF9saXN0ID0gcHJldmlvdXM7CiAgICAgICAgICAgICAgICAgICAgZm9yIChwcmV2aW91cyA9IHRwMi0+Y2hpbGRfbGlzdDsKICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzOyBwcmV2aW91cyA9IHByZXZpb3VzLT5uZXh0X3BlZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLT5wYXJlbnQgPSB0cDI7CiAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbGFiZWxfY29tcGFyZShjaGlsZDEtPmxhYmVsLCBjaGlsZDItPmxhYmVsKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogJXMuJWxkIGlzIGJvdGggJXMgYW5kICVzICglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwMi0+bGFiZWwsIGNoaWxkMS0+c3ViaWQsIGNoaWxkMS0+bGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkMi0+bGFiZWwsIEZpbGUpOwoJCSAgICB9CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogVHdvIGNvcGllcyBvZiB0aGUgc2FtZSBub2RlLgogICAgICAgICAgICAgICAgICAgICAqICdjaGlsZDInIGFkb3B0cyB0aGUgY2hpbGRyZW4gb2YgJ2NoaWxkMScKICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkMi0+Y2hpbGRfbGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHByZXZpb3VzID0gY2hpbGQyLT5jaGlsZF9saXN0OyBwcmV2aW91cy0+bmV4dF9wZWVyOyBwcmV2aW91cyA9IHByZXZpb3VzLT5uZXh0X3BlZXIpOyAgICAgICAvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMtPm5leHRfcGVlciA9IGNoaWxkMS0+Y2hpbGRfbGlzdDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQyLT5jaGlsZF9saXN0ID0gY2hpbGQxLT5jaGlsZF9saXN0OwogICAgICAgICAgICAgICAgICAgIGZvciAocHJldmlvdXMgPSBjaGlsZDEtPmNoaWxkX2xpc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91czsgcHJldmlvdXMgPSBwcmV2aW91cy0+bmV4dF9wZWVyKQogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy0+cGFyZW50ID0gY2hpbGQyOwogICAgICAgICAgICAgICAgICAgIGNoaWxkMS0+Y2hpbGRfbGlzdCA9IE5VTEw7CgogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gY2hpbGQxOyAgLyogRmluaXNoZWQgd2l0aCAnY2hpbGQxJyAqLwogICAgICAgICAgICAgICAgICAgIGNoaWxkMSA9IGNoaWxkMS0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgIGZyZWVfdHJlZShwcmV2aW91cyk7CiAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogSWYgbm8gbWF0Y2gsIG1vdmUgJ2NoaWxkMScgdG8gJ3RwMicgY2hpbGRfbGlzdAogICAgICAgICAqLwogICAgICAgIGlmIChjaGlsZDEpIHsKICAgICAgICAgICAgcHJldmlvdXMgPSBjaGlsZDE7CiAgICAgICAgICAgIGNoaWxkMSA9IGNoaWxkMS0+bmV4dF9wZWVyOwogICAgICAgICAgICBwcmV2aW91cy0+cGFyZW50ID0gdHAyOwogICAgICAgICAgICBwcmV2aW91cy0+bmV4dF9wZWVyID0gdHAyLT5jaGlsZF9saXN0OwogICAgICAgICAgICB0cDItPmNoaWxkX2xpc3QgPSBwcmV2aW91czsKICAgICAgICB9CiAgICAgIG5leHQ6OwogICAgfQp9CgoKLyoKICogRmluZCBhbGwgdGhlIGNoaWxkcmVuIG9mIHJvb3QgaW4gdGhlIGxpc3Qgb2Ygbm9kZXMuICBMaW5rIHRoZW0gaW50byB0aGUKICogdHJlZSBhbmQgb3V0IG9mIHRoZSBub2RlcyBsaXN0LgogKi8Kc3RhdGljIHZvaWQKZG9fc3VidHJlZShzdHJ1Y3QgdHJlZSAqcm9vdCwgc3RydWN0IG5vZGUgKipub2RlcykKewogICAgc3RydWN0IHRyZWUgICAgKnRwLCAqYW5vbl90cCA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJlZSAgICAqeHJvb3QgPSByb290OwogICAgc3RydWN0IG5vZGUgICAgKm5wLCAqKmhlYWRwOwogICAgc3RydWN0IG5vZGUgICAgKm9sZG5wID0gTlVMTCwgKmNoaWxkX2xpc3QgPSBOVUxMLCAqY2hpbGRwID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICBoYXNoOwogICAgaW50ICAgICAgICAgICAgKmludF9wOwoKICAgIHdoaWxlICh4cm9vdC0+bmV4dF9wZWVyICYmIHhyb290LT5uZXh0X3BlZXItPnN1YmlkID09IHJvb3QtPnN1YmlkKSB7CiNpZiAwCiAgICAgICAgcHJpbnRmKCJ4cm9vdDogJXMuJXMgPT4gJXNcbiIsIHhyb290LT5wYXJlbnQtPmxhYmVsLCB4cm9vdC0+bGFiZWwsCiAgICAgICAgICAgICAgIHhyb290LT5uZXh0X3BlZXItPmxhYmVsKTsKI2VuZGlmCiAgICAgICAgeHJvb3QgPSB4cm9vdC0+bmV4dF9wZWVyOwogICAgfQoKICAgIHRwID0gcm9vdDsKICAgIGhlYWRwID0gJm5idWNrZXRzW05CVUNLRVQobmFtZV9oYXNoKHRwLT5sYWJlbCkpXTsKICAgIC8qCiAgICAgKiBTZWFyY2ggZWFjaCBvZiB0aGUgbm9kZXMgZm9yIG9uZSB3aG9zZSBwYXJlbnQgaXMgcm9vdCwgYW5kCiAgICAgKiBtb3ZlIGVhY2ggaW50byBhIHNlcGFyYXRlIGxpc3QuCiAgICAgKi8KICAgIGZvciAobnAgPSAqaGVhZHA7IG5wOyBucCA9IG5wLT5uZXh0KSB7CiAgICAgICAgaWYgKCFsYWJlbF9jb21wYXJlKHRwLT5sYWJlbCwgbnAtPnBhcmVudCkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogdGFrZSB0aGlzIG5vZGUgb3V0IG9mIHRoZSBub2RlIGxpc3QgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAob2xkbnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgKmhlYWRwID0gbnAtPm5leHQ7ICAgICAgLyogZml4IHJvb3Qgb2Ygbm9kZSBsaXN0ICovCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvbGRucC0+bmV4dCA9IG5wLT5uZXh0OyAvKiBsaW5rIGFyb3VuZCB0aGlzIG5vZGUgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hpbGRfbGlzdCkKICAgICAgICAgICAgICAgIGNoaWxkcC0+bmV4dCA9IG5wOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBjaGlsZF9saXN0ID0gbnA7CiAgICAgICAgICAgIGNoaWxkcCA9IG5wOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9sZG5wID0gbnA7CiAgICAgICAgfQoKICAgIH0KICAgIGlmIChjaGlsZHApCiAgICAgICAgY2hpbGRwLT5uZXh0ID0gTlVMTDsKICAgIC8qCiAgICAgKiBUYWtlIGVhY2ggZWxlbWVudCBpbiB0aGUgY2hpbGQgbGlzdCBhbmQgcGxhY2UgaXQgaW50byB0aGUgdHJlZS4KICAgICAqLwogICAgZm9yIChucCA9IGNoaWxkX2xpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KSB7CiAgICAgICAgc3RydWN0IHRyZWUgICAgKm90cCA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyZWUgICAgKnh4cm9vdCA9IHhyb290OwogICAgICAgIGFub25fdHAgPSBOVUxMOwogICAgICAgIHRwID0geHJvb3QtPmNoaWxkX2xpc3Q7CgogICAgICAgIGlmIChucC0+c3ViaWQgPT0gLTEpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogbmFtZSA6Oj0geyBwYXJlbnQgfSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5wLT5zdWJpZCA9IHhyb290LT5zdWJpZDsKICAgICAgICAgICAgdHAgPSB4cm9vdDsKICAgICAgICAgICAgeHhyb290ID0geHJvb3QtPnBhcmVudDsKICAgICAgICB9CgogICAgICAgIHdoaWxlICh0cCkgewogICAgICAgICAgICBpZiAodHAtPnN1YmlkID09IG5wLT5zdWJpZCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG90cCA9IHRwOwogICAgICAgICAgICAgICAgdHAgPSB0cC0+bmV4dF9wZWVyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0cCkgewogICAgICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUodHAtPmxhYmVsLCBucC0+bGFiZWwpKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVXBkYXRlIGxpc3Qgb2YgbW9kdWxlcyAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaW50X3AgPQogICAgICAgICAgICAgICAgICAgIChpbnQgKikgbWFsbG9jKCh0cC0+bnVtYmVyX21vZHVsZXMgKyAxKSAqIHNpemVvZihpbnQpKTsKICAgICAgICAgICAgICAgIGlmIChpbnRfcCA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIG1lbWNweShpbnRfcCwgdHAtPm1vZHVsZV9saXN0LAogICAgICAgICAgICAgICAgICAgICAgIHRwLT5udW1iZXJfbW9kdWxlcyAqIHNpemVvZihpbnQpKTsKICAgICAgICAgICAgICAgIGludF9wW3RwLT5udW1iZXJfbW9kdWxlc10gPSBucC0+bW9kaWQ7CiAgICAgICAgICAgICAgICBpZiAodHAtPm51bWJlcl9tb2R1bGVzID4gMSkKICAgICAgICAgICAgICAgICAgICBmcmVlKChjaGFyICopIHRwLT5tb2R1bGVfbGlzdCk7CiAgICAgICAgICAgICAgICArK3RwLT5udW1iZXJfbW9kdWxlczsKICAgICAgICAgICAgICAgIHRwLT5tb2R1bGVfbGlzdCA9IGludF9wOwoKICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1JFUExBQ0UpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBSZXBsYWNlIGZyb20gbm9kZSAKICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICB0cmVlX2Zyb21fbm9kZSh0cCwgbnApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIEhhbmRsZSBjaGlsZHJlbiAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZG9fc3VidHJlZSh0cCwgbm9kZXMpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzdHJuY21wKG5wLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pIHx8CiAgICAgICAgICAgICAgICAhc3RybmNtcCh0cC0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSkgewogICAgICAgICAgICAgICAgYW5vbl90cCA9IHRwOyAgIC8qIE5lZWQgdG8gbWVyZ2UgdGhlc2UgdHdvIHRyZWVzIGxhdGVyICovCiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiAlcy4lbGQgaXMgYm90aCAlcyBhbmQgJXMgKCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QtPmxhYmVsLCBucC0+c3ViaWQsIHRwLT5sYWJlbCwgbnAtPmxhYmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSk7CgkgICAgfQogICAgICAgIH0KCiAgICAgICAgdHAgPSAoc3RydWN0IHRyZWUgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdHJlZSkpOwogICAgICAgIGlmICh0cCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdHAtPnBhcmVudCA9IHh4cm9vdDsKICAgICAgICB0cC0+bW9kaWQgPSBucC0+bW9kaWQ7CiAgICAgICAgdHAtPm51bWJlcl9tb2R1bGVzID0gMTsKICAgICAgICB0cC0+bW9kdWxlX2xpc3QgPSAmKHRwLT5tb2RpZCk7CiAgICAgICAgdHJlZV9mcm9tX25vZGUodHAsIG5wKTsKICAgICAgICB0cC0+bmV4dF9wZWVyID0gb3RwID8gb3RwLT5uZXh0X3BlZXIgOiB4eHJvb3QtPmNoaWxkX2xpc3Q7CiAgICAgICAgaWYgKG90cCkKICAgICAgICAgICAgb3RwLT5uZXh0X3BlZXIgPSB0cDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHh4cm9vdC0+Y2hpbGRfbGlzdCA9IHRwOwogICAgICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaCh0cC0+bGFiZWwpKTsKICAgICAgICB0cC0+bmV4dCA9IHRidWNrZXRzW2hhc2hdOwogICAgICAgIHRidWNrZXRzW2hhc2hdID0gdHA7CiAgICAgICAgZG9fc3VidHJlZSh0cCwgbm9kZXMpOwoKICAgICAgICBpZiAoYW5vbl90cCkgewogICAgICAgICAgICBpZiAoIXN0cm5jbXAodHAtPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBUaGUgbmV3IG5vZGUgaXMgYW5vbnltb3VzLAogICAgICAgICAgICAgICAgICogIHNvIG1lcmdlIGl0IHdpdGggdGhlIGV4aXN0aW5nIG9uZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbWVyZ2VfYW5vbl9jaGlsZHJlbih0cCwgYW5vbl90cCk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHVubGluayBhbmQgZGVzdHJveSB0cCAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdW5saW5rX3RyZWUodHApOwogICAgICAgICAgICAgICAgZnJlZV90cmVlKHRwKTsKICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhbm9uX3RwLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqbnRwOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFRoZSBvbGQgbm9kZSB3YXMgYW5vbnltb3VzLAogICAgICAgICAgICAgICAgICogIHNvIG1lcmdlIGl0IHdpdGggdGhlIGV4aXN0aW5nIG9uZSwKICAgICAgICAgICAgICAgICAqICBhbmQgZmlsbCBpbiB0aGUgZnVsbCBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbWVyZ2VfYW5vbl9jaGlsZHJlbihhbm9uX3RwLCB0cCk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHVubGluayBhbm9uX3RwIGZyb20gdGhlIGhhc2ggCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHVubGlua190YnVja2V0KGFub25fdHApOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBnZXQgcmlkIG9mIG9sZCBjb250ZW50cyBvZiBhbm9uX3RwIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmcmVlX3BhcnRpYWxfdHJlZShhbm9uX3RwLCBGQUxTRSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHB1dCBpbiB0aGUgY3VycmVudCBpbmZvcm1hdGlvbiAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgYW5vbl90cC0+bGFiZWwgPSB0cC0+bGFiZWw7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5jaGlsZF9saXN0ID0gdHAtPmNoaWxkX2xpc3Q7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5tb2RpZCA9IHRwLT5tb2RpZDsKICAgICAgICAgICAgICAgIGFub25fdHAtPnRjX2luZGV4ID0gdHAtPnRjX2luZGV4OwogICAgICAgICAgICAgICAgYW5vbl90cC0+dHlwZSA9IHRwLT50eXBlOwogICAgICAgICAgICAgICAgYW5vbl90cC0+ZW51bXMgPSB0cC0+ZW51bXM7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5pbmRleGVzID0gdHAtPmluZGV4ZXM7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5hdWdtZW50cyA9IHRwLT5hdWdtZW50czsKICAgICAgICAgICAgICAgIGFub25fdHAtPnZhcmJpbmRzID0gdHAtPnZhcmJpbmRzOwogICAgICAgICAgICAgICAgYW5vbl90cC0+cmFuZ2VzID0gdHAtPnJhbmdlczsKICAgICAgICAgICAgICAgIGFub25fdHAtPmhpbnQgPSB0cC0+aGludDsKICAgICAgICAgICAgICAgIGFub25fdHAtPnVuaXRzID0gdHAtPnVuaXRzOwogICAgICAgICAgICAgICAgYW5vbl90cC0+ZGVzY3JpcHRpb24gPSB0cC0+ZGVzY3JpcHRpb247CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5yZWZlcmVuY2UgPSB0cC0+cmVmZXJlbmNlOwogICAgICAgICAgICAgICAgYW5vbl90cC0+ZGVmYXVsdFZhbHVlID0gdHAtPmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICAgIGFub25fdHAtPnBhcmVudCA9IHRwLT5wYXJlbnQ7CgogICAgICAgICAgICAgICAgc2V0X2Z1bmN0aW9uKGFub25fdHApOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB1cGRhdGUgcGFyZW50IHBvaW50ZXIgaW4gbW92ZWQgY2hpbGRyZW4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG50cCA9IGFub25fdHAtPmNoaWxkX2xpc3Q7CiAgICAgICAgICAgICAgICB3aGlsZSAobnRwKSB7CiAgICAgICAgICAgICAgICAgICAgbnRwLT5wYXJlbnQgPSBhbm9uX3RwOwogICAgICAgICAgICAgICAgICAgIG50cCA9IG50cC0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBoYXNoIGluIGFub25fdHAgaW4gaXRzIG5ldyBwbGFjZSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKGFub25fdHAtPmxhYmVsKSk7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5uZXh0ID0gdGJ1Y2tldHNbaGFzaF07CiAgICAgICAgICAgICAgICB0YnVja2V0c1toYXNoXSA9IGFub25fdHA7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHVubGluayBhbmQgZGVzdHJveSB0cCAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdW5saW5rX3RidWNrZXQodHApOwogICAgICAgICAgICAgICAgdW5saW5rX3RyZWUodHApOwogICAgICAgICAgICAgICAgZnJlZSh0cCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVWg/ICBPbmUgb2YgdGhlc2UgdHdvIHNob3VsZCBoYXZlIGJlZW4gYW5vbnltb3VzISAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykpIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogZXhwZWN0ZWQgYW5vbnltb3VzIG5vZGUgKGVpdGhlciAlcyBvciAlcykgaW4gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmxhYmVsLCBhbm9uX3RwLT5sYWJlbCwgRmlsZSk7CgkJfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFub25fdHAgPSBOVUxMOwogICAgICAgIH0KICAgIH0KICAgIC8qCiAgICAgKiBmcmVlIGFsbCBub2RlcyB0aGF0IHdlcmUgY29waWVkIGludG8gdHJlZSAKICAgICAqLwogICAgb2xkbnAgPSBOVUxMOwogICAgZm9yIChucCA9IGNoaWxkX2xpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KSB7CiAgICAgICAgaWYgKG9sZG5wKQogICAgICAgICAgICBmcmVlX25vZGUob2xkbnApOwogICAgICAgIG9sZG5wID0gbnA7CiAgICB9CiAgICBpZiAob2xkbnApCiAgICAgICAgZnJlZV9ub2RlKG9sZG5wKTsKfQoKc3RhdGljIHZvaWQKZG9fbGlua3VwKHN0cnVjdCBtb2R1bGUgKm1wLCBzdHJ1Y3Qgbm9kZSAqbnApCnsKICAgIHN0cnVjdCBtb2R1bGVfaW1wb3J0ICptaXA7CiAgICBzdHJ1Y3Qgbm9kZSAgICAqb25wLCAqb2xkcCwgKm5ld3A7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CiAgICBpbnQgICAgICAgICAgICAgaSwgbW9yZTsKICAgIC8qCiAgICAgKiBBbGwgbW9kdWxlcyBpbXBsaWNpdGx5IGltcG9ydAogICAgICogICB0aGUgcm9vdHMgb2YgdGhlIHRyZWUKICAgICAqLwogICAgaWYgKHNubXBfZ2V0X2RvX2RlYnVnZ2luZygpID4gMSkKICAgICAgICBkdW1wX21vZHVsZV9saXN0KCk7CiAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJQcm9jZXNzaW5nIElNUE9SVFMgZm9yIG1vZHVsZSAlZCAlc1xuIiwKICAgICAgICAgICAgICAgIG1wLT5tb2RpZCwgbXAtPm5hbWUpKTsKICAgIGlmIChtcC0+bm9faW1wb3J0cyA9PSAwKSB7CiAgICAgICAgbXAtPm5vX2ltcG9ydHMgPSBOVU1CRVJfT0ZfUk9PVF9OT0RFUzsKICAgICAgICBtcC0+aW1wb3J0cyA9IHJvb3RfaW1wb3J0czsKICAgIH0KCiAgICAvKgogICAgICogQnVpbGQgdGhlIHRyZWUKICAgICAqLwogICAgaW5pdF9ub2RlX2hhc2gobnApOwogICAgZm9yIChpID0gMCwgbWlwID0gbXAtPmltcG9ydHM7IGkgPCBtcC0+bm9faW1wb3J0czsgKytpLCArK21pcCkgewogICAgICAgIGNoYXIgICAgICAgICAgICBtb2RidWZbMjU2XTsKICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICIgIFByb2Nlc3NpbmcgaW1wb3J0OiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBtaXAtPmxhYmVsKSk7CiAgICAgICAgaWYgKGdldF90Y19pbmRleChtaXAtPmxhYmVsLCBtaXAtPm1vZGlkKSAhPSAtMSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgdHAgPSBmaW5kX3RyZWVfbm9kZShtaXAtPmxhYmVsLCBtaXAtPm1vZGlkKTsKICAgICAgICBpZiAoIXRwKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICJEaWQgbm90IGZpbmQgJyVzJyBpbiBtb2R1bGUgJXMgKCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1pcC0+bGFiZWwsIG1vZHVsZV9uYW1lKG1pcC0+bW9kaWQsIG1vZGJ1ZiksCiAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGRvX3N1YnRyZWUodHAsICZucCk7CiAgICB9CgogICAgLyoKICAgICAqIElmIGFueSBub2RlcyBsZWZ0IG92ZXIsCiAgICAgKiAgIGNoZWNrIHRoYXQgdGhleSdyZSBub3QgdGhlIHJlc3VsdCBvZiBhICJmdWxseSBxdWFsaWZpZWQiCiAgICAgKiAgIG5hbWUsIGFuZCB0aGVuIGFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIG9ycGhhbnMKICAgICAqLwoKICAgIGlmICghbnApCiAgICAgICAgcmV0dXJuOwogICAgZm9yICh0cCA9IHRyZWVfaGVhZDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikKICAgICAgICBkb19zdWJ0cmVlKHRwLCAmbnApOwogICAgaWYgKCFucCkKICAgICAgICByZXR1cm47CgogICAgLyoKICAgICAqIHF1aWV0bHkgbW92ZSBhbGwgaW50ZXJuYWwgcmVmZXJlbmNlcyB0byB0aGUgb3JwaGFuIGxpc3QgCiAgICAgKi8KICAgIG9sZHAgPSBvcnBoYW5fbm9kZXM7CiAgICBkbyB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IE5IQVNIU0laRTsgaSsrKQogICAgICAgICAgICBmb3IgKG9ucCA9IG5idWNrZXRzW2ldOyBvbnA7IG9ucCA9IG9ucC0+bmV4dCkgewogICAgICAgICAgICAgICAgc3RydWN0IG5vZGUgICAgKm9wID0gTlVMTDsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBoYXNoID0gTkJVQ0tFVChuYW1lX2hhc2gob25wLT5sYWJlbCkpOwogICAgICAgICAgICAgICAgbnAgPSBuYnVja2V0c1toYXNoXTsKICAgICAgICAgICAgICAgIHdoaWxlIChucCkgewogICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbF9jb21wYXJlKG9ucC0+bGFiZWwsIG5wLT5wYXJlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gbnA7CiAgICAgICAgICAgICAgICAgICAgICAgIG5wID0gbnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPm5leHQgPSBucC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJ1Y2tldHNbaGFzaF0gPSBucC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgbnAtPm5leHQgPSBvcnBoYW5fbm9kZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIG9ycGhhbl9ub2RlcyA9IG5wOwogICAgICAgICAgICAgICAgICAgICAgICBvcCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgICAgIG5wID0gbmJ1Y2tldHNbaGFzaF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgbmV3cCA9IG9ycGhhbl9ub2RlczsKICAgICAgICBtb3JlID0gMDsKICAgICAgICBmb3IgKG9ucCA9IG9ycGhhbl9ub2Rlczsgb25wICE9IG9sZHA7IG9ucCA9IG9ucC0+bmV4dCkgewogICAgICAgICAgICBzdHJ1Y3Qgbm9kZSAgICAqb3AgPSBOVUxMOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKG9ucC0+bGFiZWwpKTsKICAgICAgICAgICAgbnAgPSBuYnVja2V0c1toYXNoXTsKICAgICAgICAgICAgd2hpbGUgKG5wKSB7CiAgICAgICAgICAgICAgICBpZiAobGFiZWxfY29tcGFyZShvbnAtPmxhYmVsLCBucC0+cGFyZW50KSkgewogICAgICAgICAgICAgICAgICAgIG9wID0gbnA7CiAgICAgICAgICAgICAgICAgICAgbnAgPSBucC0+bmV4dDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wKQogICAgICAgICAgICAgICAgICAgICAgICBvcC0+bmV4dCA9IG5wLT5uZXh0OwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgbmJ1Y2tldHNbaGFzaF0gPSBucC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICBucC0+bmV4dCA9IG9ycGhhbl9ub2RlczsKICAgICAgICAgICAgICAgICAgICBvcnBoYW5fbm9kZXMgPSBucDsKICAgICAgICAgICAgICAgICAgICBvcCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgbnAgPSBuYnVja2V0c1toYXNoXTsKICAgICAgICAgICAgICAgICAgICBtb3JlID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvbGRwID0gbmV3cDsKICAgIH0gd2hpbGUgKG1vcmUpOwoKICAgIC8qCiAgICAgKiBjb21wbGFpbiBhYm91dCBsZWZ0IG92ZXIgbm9kZXMgCiAgICAgKi8KICAgIGZvciAobnAgPSBvcnBoYW5fbm9kZXM7IG5wICYmIG5wLT5uZXh0OyBucCA9IG5wLT5uZXh0KTsgICAgIC8qIGZpbmQgdGhlIGVuZCBvZiB0aGUgb3JwaGFuIGxpc3QgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBOSEFTSFNJWkU7IGkrKykKICAgICAgICBpZiAobmJ1Y2tldHNbaV0pIHsKICAgICAgICAgICAgaWYgKG9ycGhhbl9ub2RlcykKICAgICAgICAgICAgICAgIG9ucCA9IG5wLT5uZXh0ID0gbmJ1Y2tldHNbaV07CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIG9ucCA9IG9ycGhhbl9ub2RlcyA9IG5idWNrZXRzW2ldOwogICAgICAgICAgICBuYnVja2V0c1tpXSA9IE5VTEw7CiAgICAgICAgICAgIHdoaWxlIChvbnApIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgIlVubGlua2VkIE9JRCBpbiAlczogJXMgOjo9IHsgJXMgJWxkIH1cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobXAtPm5hbWUgPyBtcC0+bmFtZSA6ICI8bm8gbW9kdWxlPiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKG9ucC0+bGFiZWwgPyBvbnAtPmxhYmVsIDogIjxubyBsYWJlbD4iKSwKICAgICAgICAgICAgICAgICAgICAgICAgIChvbnAtPnBhcmVudCA/IG9ucC0+cGFyZW50IDogIjxubyBwYXJlbnQ+IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBvbnAtPnN1YmlkKTsKCQkgc25tcF9sb2coTE9HX1dBUk5JTkcsCgkJCSAgIlVuZGVmaW5lZCBpZGVudGlmaWVyOiAlcyBuZWFyIGxpbmUgJWQgb2YgJXNcbiIsCgkJCSAgKG9ucC0+cGFyZW50ID8gb25wLT5wYXJlbnQgOiAiPG5vIHBhcmVudD4iKSwKCQkJICBvbnAtPmxpbmVubywgb25wLT5maWxlbmFtZSk7CiAgICAgICAgICAgICAgICBucCA9IG9ucDsKICAgICAgICAgICAgICAgIG9ucCA9IG9ucC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIHJldHVybjsKfQoKCi8qCiAqIFRha2VzIGEgbGlzdCBvZiB0aGUgZm9ybToKICogeyBpc28gb3JnKDMpIGRvZCg2KSAxIH0KICogYW5kIGNyZWF0ZXMgc2V2ZXJhbCBub2Rlcywgb25lIGZvciBlYWNoIHBhcmVudC1jaGlsZCBwYWlyLgogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqLwpzdGF0aWMgaW50CmdldG9pZChGSUxFICogZnAsIHN0cnVjdCBzdWJpZF9zICppZCwgICAvKiBhbiBhcnJheSBvZiBzdWJpZHMgKi8KICAgICAgIGludCBsZW5ndGgpCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgKi8KICAgIHJlZ2lzdGVyIGludCAgICBjb3VudDsKICAgIGludCAgICAgICAgICAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKCiAgICBpZiAoKHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTikpICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwie1wiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGxlbmd0aDsgY291bnQrKywgaWQrKykgewogICAgICAgIGlkLT5sYWJlbCA9IE5VTEw7CiAgICAgICAgaWQtPm1vZGlkID0gY3VycmVudF9tb2R1bGU7CiAgICAgICAgaWQtPnN1YmlkID0gLTE7CiAgICAgICAgaWYgKHR5cGUgPT0gUklHSFRCUkFDS0VUKQogICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgaWYgKHR5cGUgPT0gTEFCRUwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogdGhpcyBlbnRyeSBoYXMgYSBsYWJlbCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlkLT5sYWJlbCA9IHN0cmR1cCh0b2tlbik7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlID09IE5VTUJFUikgewogICAgICAgICAgICAgICAgICAgIGlkLT5zdWJpZCA9IHN0cnRvdWwodG9rZW4sIE5VTEwsIDEwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pKSAhPSBSSUdIVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBhIGNsb3NpbmcgcGFyZW50aGVzaXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIGEgbnVtYmVyIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTlVNQkVSKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHRoaXMgZW50cnkgIGhhcyBqdXN0IGFuIGludGVnZXIgc3ViLWlkZW50aWZpZXIgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZC0+c3ViaWQgPSBzdHJ0b3VsKHRva2VuLCBOVUxMLCAxMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIGxhYmVsIG9yIG51bWJlciIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CiAgICBwcmludF9lcnJvcigiVG9vIGxvbmcgT0lEIiwgdG9rZW4sIHR5cGUpOwogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIFBhcnNlIGEgc2VxdWVuY2Ugb2Ygb2JqZWN0IHN1YmlkZW50aWZpZXJzIGZvciB0aGUgZ2l2ZW4gbmFtZS4KICogVGhlICJsYWJlbCBPQkpFQ1QgSURFTlRJRklFUiA6Oj0iIHBvcnRpb24gaGFzIGFscmVhZHkgYmVlbiBwYXJzZWQuCiAqCiAqIFRoZSBtYWpvcml0eSBvZiBjYXNlcyB0YWtlIHRoaXMgZm9ybSA6CiAqIGxhYmVsIE9CSkVDVCBJREVOVElGSUVSIDo6PSB7IHBhcmVudCAyIH0KICogd2hlcmUgYSBwYXJlbnQgbGFiZWwgYW5kIGEgY2hpbGQgc3ViaWRlbnRpZmllciBudW1iZXIgYXJlIHNwZWNpZmllZC4KICoKICogVmFyaWF0aW9ucyBvbiB0aGUgdGhlbWUgaW5jbHVkZSBjYXNlcyB3aGVyZSBhIG51bWJlciBhcHBlYXJzIHdpdGgKICogdGhlIHBhcmVudCwgb3IgaW50ZXJtZWRpYXRlIHN1YmlkZW50aWZpZXJzIGFyZSBzcGVjaWZpZWQgYnkgbGFiZWwsCiAqIGJ5IG51bWJlciwgb3IgYm90aC4KICoKICogSGVyZSBhcmUgc29tZSByZXByZXNlbnRhdGl2ZSBzYW1wbGVzIDoKICogaW50ZXJuZXQgICAgICAgIE9CSkVDVCBJREVOVElGSUVSIDo6PSB7IGlzbyBvcmcoMykgZG9kKDYpIDEgfQogKiBtZ210ICAgICAgICAgICAgT0JKRUNUIElERU5USUZJRVIgOjo9IHsgaW50ZXJuZXQgMiB9CiAqIHJwdHJJbmZvSGVhbHRoICBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyBzbm1wRG90M1JwdHJNZ3QgMCA0IH0KICoKICogSGVyZSBpcyBhIHZlcnkgcmFyZSBmb3JtIDoKICogaXNvICAgICAgICAgICAgIE9CSkVDVCBJREVOVElGSUVSIDo6PSB7IDEgfQogKgogKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IuICBXaGVuIHRoaXMgaGFwcGVucywgbWVtb3J5IG1heSBiZSBsZWFrZWQuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9vYmplY3RpZChGSUxFICogZnAsIGNoYXIgKm5hbWUpCnsKICAgIHJlZ2lzdGVyIGludCAgICBjb3VudDsKICAgIHJlZ2lzdGVyIHN0cnVjdCBzdWJpZF9zICpvcCwgKm5vcDsKICAgIGludCAgICAgICAgICAgICBsZW5ndGg7CiAgICBzdHJ1Y3Qgc3ViaWRfcyAgbG9pZFszMl07CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnAsICpyb290ID0gTlVMTCwgKm9sZG5wID0gTlVMTDsKICAgIHN0cnVjdCB0cmVlICAgICp0cDsKCiAgICBpZiAoKGxlbmd0aCA9IGdldG9pZChmcCwgbG9pZCwgMzIpKSA9PSAwKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBvYmplY3QgaWRlbnRpZmllciIsIE5VTEwsIENPTlRJTlVFKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICAvKgogICAgICogSGFuZGxlIG51bWVyaWMtb25seSBvYmplY3QgaWRlbnRpZmllcnMsCiAgICAgKiAgYnkgbGFiZWxsaW5nIHRoZSBmaXJzdCBzdWItaWRlbnRpZmllcgogICAgICovCiAgICBvcCA9IGxvaWQ7CiAgICBpZiAoIW9wLT5sYWJlbCkgewogICAgICAgIGlmIChsZW5ndGggPT0gMSkgewogICAgICAgICAgICBwcmludF9lcnJvcigiQXR0ZW1wdCB0byBkZWZpbmUgYSByb290IG9pZCIsIG5hbWUsIE9CSkVDVCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBmb3IgKHRwID0gdHJlZV9oZWFkOyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKQogICAgICAgICAgICBpZiAoKGludCkgdHAtPnN1YmlkID09IG9wLT5zdWJpZCkgewogICAgICAgICAgICAgICAgb3AtPmxhYmVsID0gc3RyZHVwKHRwLT5sYWJlbCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBIYW5kbGUgICJsYWJlbCBPQkpFQ1QtSURFTlRJRklFUiA6Oj0geyBzdWJpZCB9IgogICAgICovCiAgICBpZiAobGVuZ3RoID09IDEpIHsKICAgICAgICBvcCA9IGxvaWQ7CiAgICAgICAgbnAgPSBhbGxvY19ub2RlKG9wLT5tb2RpZCk7CiAgICAgICAgaWYgKG5wID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICAgbnAtPnN1YmlkID0gb3AtPnN1YmlkOwogICAgICAgIG5wLT5sYWJlbCA9IHN0cmR1cChuYW1lKTsKICAgICAgICBucC0+cGFyZW50ID0gb3AtPmxhYmVsOwogICAgICAgIHJldHVybiBucDsKICAgIH0KCiAgICAvKgogICAgICogRm9yIGVhY2ggcGFyZW50LWNoaWxkIHN1YmlkIHBhaXIgaW4gdGhlIHN1YmlkIGFycmF5LAogICAgICogY3JlYXRlIGEgbm9kZSBhbmQgbGluayBpdCBpbnRvIHRoZSBub2RlIGxpc3QuCiAgICAgKi8KICAgIGZvciAoY291bnQgPSAwLCBvcCA9IGxvaWQsIG5vcCA9IGxvaWQgKyAxOyBjb3VudCA8IChsZW5ndGggLSAxKTsKICAgICAgICAgY291bnQrKywgb3ArKywgbm9wKyspIHsKICAgICAgICAvKgogICAgICAgICAqIGV2ZXJ5IG5vZGUgbXVzdCBoYXZlIHBhcmVudCdzIG5hbWUgYW5kIGNoaWxkJ3MgbmFtZSBvciBudW1iZXIgCiAgICAgICAgICovCiAgICAgICAgLyoKICAgICAgICAgKiBYWCB0aGUgbmV4dCBzdGF0ZW1lbnQgaXMgYWx3YXlzIHRydWUgLS0gZG9lcyBpdCBtYXR0ZXIgPz8gCiAgICAgICAgICovCiAgICAgICAgaWYgKG9wLT5sYWJlbCAmJiAobm9wLT5sYWJlbCB8fCAobm9wLT5zdWJpZCAhPSAtMSkpKSB7CiAgICAgICAgICAgIG5wID0gYWxsb2Nfbm9kZShub3AtPm1vZGlkKTsKICAgICAgICAgICAgaWYgKG5wID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgICAgICBpZiAocm9vdCA9PSBOVUxMKQogICAgICAgICAgICAgICAgcm9vdCA9IG5wOwoKICAgICAgICAgICAgbnAtPnBhcmVudCA9IHN0cmR1cChvcC0+bGFiZWwpOwogICAgICAgICAgICBpZiAoY291bnQgPT0gKGxlbmd0aCAtIDIpKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVGhlIG5hbWUgZm9yIHRoaXMgbm9kZSBpcyB0aGUgbGFiZWwgZm9yIHRoaXMgZW50cnkgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG5wLT5sYWJlbCA9IHN0cmR1cChuYW1lKTsKICAgICAgICAgICAgICAgIGlmIChucC0+bGFiZWwgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIFNOTVBfRlJFRShucC0+cGFyZW50KTsKICAgICAgICAgICAgICAgICAgICBTTk1QX0ZSRUUobnApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIW5vcC0+bGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICBub3AtPmxhYmVsID0gKGNoYXIgKikgbWFsbG9jKDIwICsgQU5PTl9MRU4pOwogICAgICAgICAgICAgICAgICAgIGlmIChub3AtPmxhYmVsID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU05NUF9GUkVFKG5wLT5wYXJlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICBTTk1QX0ZSRUUobnApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG5vcC0+bGFiZWwsICIlcyVkIiwgQU5PTiwgYW5vbnltb3VzKyspOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbnAtPmxhYmVsID0gc3RyZHVwKG5vcC0+bGFiZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChub3AtPnN1YmlkICE9IC0xKQogICAgICAgICAgICAgICAgbnAtPnN1YmlkID0gbm9wLT5zdWJpZDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIldhcm5pbmc6IFRoaXMgZW50cnkgaXMgcHJldHR5IHNpbGx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wLT5sYWJlbCwgQ09OVElOVUUpOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogc2V0IHVwIG5leHQgZW50cnkgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAob2xkbnApCiAgICAgICAgICAgICAgICBvbGRucC0+bmV4dCA9IG5wOwogICAgICAgICAgICBvbGRucCA9IG5wOwogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZihvcC0+bGFiZWwuLi4gKi8KICAgIH0KCiAgICAvKgogICAgICogZnJlZSB0aGUgbG9pZCBhcnJheSAKICAgICAqLwogICAgZm9yIChjb3VudCA9IDAsIG9wID0gbG9pZDsgY291bnQgPCBsZW5ndGg7IGNvdW50KyssIG9wKyspIHsKICAgICAgICBpZiAob3AtPmxhYmVsKQogICAgICAgICAgICBmcmVlKG9wLT5sYWJlbCk7CiAgICB9CgogICAgcmV0dXJuIHJvb3Q7Cn0KCnN0YXRpYyBpbnQKZ2V0X3RjKGNvbnN0IGNoYXIgKmRlc2NyaXB0b3IsCiAgICAgICBpbnQgbW9kaWQsCiAgICAgICBpbnQgKnRjX2luZGV4LAogICAgICAgc3RydWN0IGVudW1fbGlzdCAqKmVwLCBzdHJ1Y3QgcmFuZ2VfbGlzdCAqKnJwLCBjaGFyICoqaGludCkKewogICAgaW50ICAgICAgICAgICAgIGk7CiAgICBzdHJ1Y3QgdGMgICAgICAqdGNwOwoKICAgIGkgPSBnZXRfdGNfaW5kZXgoZGVzY3JpcHRvciwgbW9kaWQpOwogICAgaWYgKHRjX2luZGV4KQogICAgICAgICp0Y19pbmRleCA9IGk7CiAgICBpZiAoaSAhPSAtMSkgewogICAgICAgIHRjcCA9ICZ0Y2xpc3RbaV07CiAgICAgICAgaWYgKGVwKSB7CiAgICAgICAgICAgIGZyZWVfZW51bXMoZXApOwogICAgICAgICAgICAqZXAgPSBjb3B5X2VudW1zKHRjcC0+ZW51bXMpOwogICAgICAgIH0KICAgICAgICBpZiAocnApIHsKICAgICAgICAgICAgZnJlZV9yYW5nZXMocnApOwogICAgICAgICAgICAqcnAgPSBjb3B5X3Jhbmdlcyh0Y3AtPnJhbmdlcyk7CiAgICAgICAgfQogICAgICAgIGlmIChoaW50KSB7CiAgICAgICAgICAgIGlmICgqaGludCkKICAgICAgICAgICAgICAgIGZyZWUoKmhpbnQpOwogICAgICAgICAgICAqaGludCA9ICh0Y3AtPmhpbnQgPyBzdHJkdXAodGNwLT5oaW50KSA6IE5VTEwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGNwLT50eXBlOwogICAgfQogICAgcmV0dXJuIExBQkVMOwp9CgovKgogKiByZXR1cm4gaW5kZXggaW50byB0Y2xpc3Qgb2YgZ2l2ZW4gVEMgZGVzY3JpcHRvcgogKiByZXR1cm4gLTEgaWYgbm90IGZvdW5kCiAqLwpzdGF0aWMgaW50CmdldF90Y19pbmRleChjb25zdCBjaGFyICpkZXNjcmlwdG9yLCBpbnQgbW9kaWQpCnsKICAgIGludCAgICAgICAgICAgICBpOwogICAgc3RydWN0IHRjICAgICAgKnRjcDsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKICAgIHN0cnVjdCBtb2R1bGVfaW1wb3J0ICptaXA7CgogICAgLyoKICAgICAqIENoZWNrIHRoYXQgdGhlIGRlc2NyaXB0b3IgaXNuJ3QgaW1wb3J0ZWQKICAgICAqICBieSBzZWFyY2hpbmcgdGhlIGltcG9ydCBsaXN0CiAgICAgKi8KCiAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wOyBtcCA9IG1wLT5uZXh0KQogICAgICAgIGlmIChtcC0+bW9kaWQgPT0gbW9kaWQpCiAgICAgICAgICAgIGJyZWFrOwogICAgaWYgKG1wKQogICAgICAgIGZvciAoaSA9IDAsIG1pcCA9IG1wLT5pbXBvcnRzOyBpIDwgbXAtPm5vX2ltcG9ydHM7ICsraSwgKyttaXApIHsKICAgICAgICAgICAgaWYgKCFsYWJlbF9jb21wYXJlKG1pcC0+bGFiZWwsIGRlc2NyaXB0b3IpKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogRm91bmQgaXQgLSBzbyBhbWVuZCB0aGUgbW9kdWxlIElEIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBtb2RpZCA9IG1pcC0+bW9kaWQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCgogICAgZm9yIChpID0gMCwgdGNwID0gdGNsaXN0OyBpIDwgTUFYVEM7IGkrKywgdGNwKyspIHsKICAgICAgICBpZiAodGNwLT50eXBlID09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmICghbGFiZWxfY29tcGFyZShkZXNjcmlwdG9yLCB0Y3AtPmRlc2NyaXB0b3IpICYmCiAgICAgICAgICAgICgobW9kaWQgPT0gdGNwLT5tb2RpZCkgfHwgKG1vZGlkID09IC0xKSkpIHsKICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwp9CgovKgogKiB0cmFuc2xhdGUgaW50ZWdlciB0Y19pbmRleCB0byBzdHJpbmcgaWRlbnRpZmllciBmcm9tIHRjbGlzdAogKiAqCiAqICogUmV0dXJucyBwb2ludGVyIHRvIHN0cmluZyBpbiB0YWJsZSAoc2hvdWxkIG5vdCBiZSBtb2RpZmllZCkgb3IgTlVMTAogKi8KY29uc3QgY2hhciAgICAgKgpnZXRfdGNfZGVzY3JpcHRvcihpbnQgdGNfaW5kZXgpCnsKICAgIGlmICh0Y19pbmRleCA8IDAgfHwgdGNfaW5kZXggPj0gTUFYVEMpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICByZXR1cm4gKHRjbGlzdFt0Y19pbmRleF0uZGVzY3JpcHRvcik7Cn0KCmNvbnN0IGNoYXIgICAgICoKZ2V0X3RjX2Rlc2NyaXB0aW9uKGludCB0Y19pbmRleCkKewogICAgaWYgKHRjX2luZGV4IDwgMCB8fCB0Y19pbmRleCA+PSBNQVhUQykKICAgICAgICByZXR1cm4gTlVMTDsKICAgIHJldHVybiAodGNsaXN0W3RjX2luZGV4XS5kZXNjcmlwdGlvbik7Cn0KCgovKgogKiBQYXJzZXMgYW4gZW51bWVyYXRpb24gbGlzdCBvZiB0aGUgZm9ybToKICogICAgICAgIHsgbGFiZWwodmFsdWUpIGxhYmVsKHZhbHVlKSAuLi4gfQogKiBUaGUgaW5pdGlhbCB7IGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkLgogKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAqLwoKc3RhdGljIHN0cnVjdCBlbnVtX2xpc3QgKgpwYXJzZV9lbnVtbGlzdChGSUxFICogZnAsIHN0cnVjdCBlbnVtX2xpc3QgKipyZXRwKQp7CiAgICByZWdpc3RlciBpbnQgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBzdHJ1Y3QgZW51bV9saXN0ICplcCA9IE5VTEwsICoqZXBwID0gJmVwOwoKICAgIGZyZWVfZW51bXMocmV0cCk7CgogICAgd2hpbGUgKCh0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pKSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICBpZiAodHlwZSA9PSBSSUdIVEJSQUNLRVQpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8qIHNvbWUgZW51bXMgdXNlICJkZXByZWNhdGVkIiB0byBpbmRpY2F0ZSBhIG5vIGxvbmdlciB2YWx1ZSBsYWJlbCAqLwogICAgICAgIC8qIChFRzogSVAtTUlCJ3MgSXBBZGRyZXNzU3RhdHVzVEMpICovCiAgICAgICAgaWYgKHR5cGUgPT0gTEFCRUwgfHwgdHlwZSA9PSBERVBSRUNBVEVEKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHRoaXMgaXMgYW4gZW51bWVyYXRlZCBsYWJlbCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgICplcHAgPQogICAgICAgICAgICAgICAgKHN0cnVjdCBlbnVtX2xpc3QgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZW51bV9saXN0KSk7CiAgICAgICAgICAgIGlmICgqZXBwID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvbiBmb3IgdGhlIGxlbmd0aCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgICgqZXBwKS0+bGFiZWwgPSBzdHJkdXAodG9rZW4pOwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIihcIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IE5VTUJFUikgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIGludGVnZXIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICAoKmVwcCktPnZhbHVlID0gc3RydG9sKHRva2VuLCBOVUxMLCAxMCk7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFJJR0hUUEFSRU4pIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIilcIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVwcCA9ICYoKmVwcCktPm5leHQ7CiAgICAgICAgfQogICAgfQogICAgaWYgKHR5cGUgPT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwifVwiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgKnJldHAgPSBlcDsKICAgIHJldHVybiBlcDsKfQoKc3RhdGljIHN0cnVjdCByYW5nZV9saXN0ICoKcGFyc2VfcmFuZ2VzKEZJTEUgKiBmcCwgc3RydWN0IHJhbmdlX2xpc3QgKipyZXRwKQp7CiAgICBpbnQgICAgICAgICAgICAgbG93LCBoaWdoOwogICAgY2hhciAgICAgICAgICAgIG5leHR0b2tlbltNQVhUT0tFTl07CiAgICBpbnQgICAgICAgICAgICAgbmV4dHR5cGU7CiAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcnAgPSBOVUxMLCAqKnJwcCA9ICZycDsKICAgIGludCAgICAgICAgICAgICBzaXplID0gMCwgdGFrZW4gPSAxOwoKICAgIGZyZWVfcmFuZ2VzKHJldHApOwoKICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmIChuZXh0dHlwZSA9PSBTSVpFKSB7CiAgICAgICAgc2l6ZSA9IDE7CiAgICAgICAgdGFrZW4gPSAwOwogICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAobmV4dHR5cGUgIT0gTEVGVFBBUkVOKQogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCIoXCIgYWZ0ZXIgU0laRSIsIG5leHR0b2tlbiwgbmV4dHR5cGUpOwogICAgfQoKICAgIGRvIHsKICAgICAgICBpZiAoIXRha2VuKQogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0YWtlbiA9IDA7CiAgICAgICAgaGlnaCA9IGxvdyA9IHN0cnRvdWwobmV4dHRva2VuLCBOVUxMLCAxMCk7CiAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmIChuZXh0dHlwZSA9PSBSQU5HRSkgewogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGVycm5vID0gMDsKICAgICAgICAgICAgaGlnaCA9IHN0cnRvdWwobmV4dHRva2VuLCBOVUxMLCAxMCk7CiAgICAgICAgICAgIGlmICggZXJybm8gPT0gRVJBTkdFICkgewogICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpKQogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBVcHBlciBib3VuZCBub3QgaGFuZGxlZCBjb3JyZWN0bHkgKCVzICE9ICVkKTogQXQgbGluZSAlZCBpbiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHRva2VuLCBoaWdoLCBtaWJMaW5lLCBGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfQogICAgICAgICpycHAgPSAoc3RydWN0IHJhbmdlX2xpc3QgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcmFuZ2VfbGlzdCkpOwogICAgICAgIGlmICgqcnBwID09IE5VTEwpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICgqcnBwKS0+bG93ID0gbG93OwogICAgICAgICgqcnBwKS0+aGlnaCA9IGhpZ2g7CiAgICAgICAgcnBwID0gJigqcnBwKS0+bmV4dDsKCiAgICB9IHdoaWxlIChuZXh0dHlwZSA9PSBCQVIpOwogICAgaWYgKHNpemUpIHsKICAgICAgICBpZiAobmV4dHR5cGUgIT0gUklHSFRQQVJFTikKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKVwiIGFmdGVyIFNJWkUiLCBuZXh0dG9rZW4sIG5leHR0eXBlKTsKICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBuZXh0dHlwZSk7CiAgICB9CiAgICBpZiAobmV4dHR5cGUgIT0gUklHSFRQQVJFTikKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCIpXCIiLCBuZXh0dG9rZW4sIG5leHR0eXBlKTsKCiAgICAqcmV0cCA9IHJwOwogICAgcmV0dXJuIHJwOwp9CgovKgogKiBQYXJzZXMgYW4gYXNuIHR5cGUuICBTdHJ1Y3R1cmVzIGFyZSBpZ25vcmVkIGJ5IHRoaXMgcGFyc2VyLgogKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9hc250eXBlKEZJTEUgKiBmcCwgY2hhciAqbmFtZSwgaW50ICpudHlwZSwgY2hhciAqbnRva2VuKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZSwgaTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgcXVvdGVkX3N0cmluZ19idWZmZXJbTUFYUVVPVEVTVFJdOwogICAgY2hhciAgICAgICAgICAgKmhpbnQgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgKmRlc2NyID0gTlVMTDsKICAgIHN0cnVjdCB0YyAgICAgICp0Y3A7CiAgICBpbnQgICAgICAgICAgICAgbGV2ZWw7CgogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlID09IFNFUVVFTkNFIHx8IHR5cGUgPT0gQ0hPSUNFKSB7CiAgICAgICAgbGV2ZWwgPSAwOwogICAgICAgIHdoaWxlICgodHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKSkgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgICAgIGlmICh0eXBlID09IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICBsZXZlbCsrOwogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUklHSFRCUkFDS0VUICYmIC0tbGV2ZWwgPT0gMCkgewogICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIn1cIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSBMRUZUQlJBQ0tFVCkgewogICAgICAgIHN0cnVjdCBub2RlICAgICpucDsKICAgICAgICBpbnQgICAgICAgICAgICAgY2hfbmV4dCA9ICd7JzsKICAgICAgICB1bmdldGMoY2hfbmV4dCwgZnApOwogICAgICAgIG5wID0gcGFyc2Vfb2JqZWN0aWQoZnAsIG5hbWUpOwogICAgICAgIGlmIChucCAhPSBOVUxMKSB7CiAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIHJldHVybiBucDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTEVGVFNRQlJBQ0spIHsKICAgICAgICBpbnQgICAgICAgICAgICAgc2l6ZSA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0gd2hpbGUgKHR5cGUgIT0gRU5ET0ZGSUxFICYmIHR5cGUgIT0gUklHSFRTUUJSQUNLKTsKICAgICAgICBpZiAodHlwZSAhPSBSSUdIVFNRQlJBQ0spIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiXVwiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSA9PSBJTVBMSUNJVCkKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICgqbnR5cGUgPT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlIE9DVEVUU1RSOgogICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICgqbnR5cGUgIT0gU0laRSkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBTSVpFIiwgbnRva2VuLCAqbnR5cGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2l6ZSA9IDE7CiAgICAgICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKCpudHlwZSAhPSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCIoXCIgYWZ0ZXIgU0laRSIsIG50b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbnR5cGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGZhbGwgdGhyb3VnaCAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBjYXNlIElOVEVHRVI6CiAgICAgICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIGlmICgqbnR5cGUgIT0gTlVNQkVSKQogICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgTlVNQkVSIiwgbnRva2VuLCAqbnR5cGUpOwogICAgICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCpudHlwZSA9PSBSQU5HRSkgewogICAgICAgICAgICAgICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKm50eXBlICE9IE5VTUJFUikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBOVU1CRVIiLCBudG9rZW4sICpudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSB3aGlsZSAoKm50eXBlID09IEJBUik7CiAgICAgICAgICAgICAgICBpZiAoKm50eXBlICE9IFJJR0hUUEFSRU4pIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCIpXCIiLCBudG9rZW4sICpudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHNpemUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKm50eXBlICE9IFJJR0hUUEFSRU4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKVwiIHRvIHRlcm1pbmF0ZSBTSVpFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRva2VuLCAqbnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHR5cGUgPT0gQ09OVkVOVElPTikgewogICAgICAgICAgICB3aGlsZSAodHlwZSAhPSBTWU5UQVggJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlID09IERJU1BMQVlISU5UKSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkRJU1BMQVktSElOVCBtdXN0IGJlIHN0cmluZyIsIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQgPSBzdHJkdXAodG9rZW4pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IERFU0NSSVBUSU9OICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkRFU0NSSVBUSU9OIG11c3QgYmUgc3RyaW5nIiwgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3IgPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSA9PSBPQkpFQ1QpIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBJREVOVElGSUVSKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIElERU5USUZJRVIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgU05NUF9GUkVFKGhpbnQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdHlwZSA9IE9CSklEOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE9CSkVDVCkgewogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBJREVOVElGSUVSKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgSURFTlRJRklFUiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBPQkpJRDsKICAgICAgICB9CgogICAgICAgIGlmICh0eXBlID09IExBQkVMKSB7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdGModG9rZW4sIGN1cnJlbnRfbW9kdWxlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogdGV4dHVhbCBjb252ZW50aW9uIAogICAgICAgICAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhUQzsgaSsrKSB7CiAgICAgICAgICAgIGlmICh0Y2xpc3RbaV0udHlwZSA9PSAwKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA9PSBNQVhUQykgewogICAgICAgICAgICBwcmludF9lcnJvcigiVG9vIG1hbnkgdGV4dHVhbCBjb252ZW50aW9ucyIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgU05NUF9GUkVFKGhpbnQpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgaWYgKCEodHlwZSAmIFNZTlRBWF9NQVNLKSkgewogICAgICAgICAgICBwcmludF9lcnJvcigiVGV4dHVhbCBjb252ZW50aW9uIGRvZXNuJ3QgbWFwIHRvIHJlYWwgdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgU05NUF9GUkVFKGhpbnQpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgdGNwID0gJnRjbGlzdFtpXTsKICAgICAgICB0Y3AtPm1vZGlkID0gY3VycmVudF9tb2R1bGU7CiAgICAgICAgdGNwLT5kZXNjcmlwdG9yID0gc3RyZHVwKG5hbWUpOwogICAgICAgIHRjcC0+aGludCA9IGhpbnQ7CiAgICAgICAgdGNwLT5kZXNjcmlwdGlvbiA9IGRlc2NyOwogICAgICAgIHRjcC0+dHlwZSA9IHR5cGU7CiAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAoKm50eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICB0Y3AtPnJhbmdlcyA9IHBhcnNlX3JhbmdlcyhmcCwgJnRjcC0+cmFuZ2VzKTsKICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9IGVsc2UgaWYgKCpudHlwZSA9PSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBpZiB0aGVyZSBpcyBhbiBlbnVtZXJhdGlvbiBsaXN0LCBwYXJzZSBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRjcC0+ZW51bXMgPSBwYXJzZV9lbnVtbGlzdChmcCwgJnRjcC0+ZW51bXMpOwogICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KfQoKCi8qCiAqIFBhcnNlcyBhbiBPQkpFQ1QgVFlQRSBtYWNyby4KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2Vfb2JqZWN0dHlwZShGSUxFICogZnAsIGNoYXIgKm5hbWUpCnsKICAgIHJlZ2lzdGVyIGludCAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBuZXh0dG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIHF1b3RlZF9zdHJpbmdfYnVmZmVyW01BWFFVT1RFU1RSXTsKICAgIGludCAgICAgICAgICAgICBuZXh0dHlwZSwgdGN0eXBlOwogICAgcmVnaXN0ZXIgc3RydWN0IG5vZGUgKm5wOwoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBTWU5UQVgpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIGZvcm1hdCBmb3IgT0JKRUNULVRZUEUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBucCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgaWYgKG5wID09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSA9PSBPQkpFQ1QpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IElERU5USUZJRVIpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIElERU5USUZJRVIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICB0eXBlID0gT0JKSUQ7CiAgICB9CiAgICBpZiAodHlwZSA9PSBMQUJFTCkgewogICAgICAgIGludCAgICAgICAgICAgICB0bXBfaW5kZXg7CiAgICAgICAgdGN0eXBlID0gZ2V0X3RjKHRva2VuLCBjdXJyZW50X21vZHVsZSwgJnRtcF9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5wLT5lbnVtcywgJm5wLT5yYW5nZXMsICZucC0+aGludCk7CiAgICAgICAgaWYgKHRjdHlwZSA9PSBMQUJFTCAmJgogICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykgPiAxKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJXYXJuaW5nOiBObyBrbm93biB0cmFuc2xhdGlvbiBmb3IgdHlwZSIsIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IHRjdHlwZTsKICAgICAgICBucC0+dGNfaW5kZXggPSB0bXBfaW5kZXg7ICAgICAgIC8qIHN0b3JlIFRDIGZvciBsYXRlciByZWZlcmVuY2UgKi8KICAgIH0KICAgIG5wLT50eXBlID0gdHlwZTsKICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgIHN3aXRjaCAodHlwZSkgewogICAgY2FzZSBTRVFVRU5DRToKICAgICAgICBpZiAobmV4dHR5cGUgPT0gT0YpIHsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CgogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgSU5URUdFUjoKICAgIGNhc2UgSU5URUdFUjMyOgogICAgY2FzZSBVSU5URUdFUjMyOgogICAgY2FzZSBVTlNJR05FRDMyOgogICAgY2FzZSBDT1VOVEVSOgogICAgY2FzZSBHQVVHRToKICAgIGNhc2UgQklUU1RSSU5HOgogICAgY2FzZSBMQUJFTDoKICAgICAgICBpZiAobmV4dHR5cGUgPT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaWYgdGhlcmUgaXMgYW4gZW51bWVyYXRpb24gbGlzdCwgcGFyc2UgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBucC0+ZW51bXMgPSBwYXJzZV9lbnVtbGlzdChmcCwgJm5wLT5lbnVtcyk7CiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9IGVsc2UgaWYgKG5leHR0eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBpZiB0aGVyZSBpcyBhIHJhbmdlIGxpc3QsIHBhcnNlIGl0IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbnAtPnJhbmdlcyA9IHBhcnNlX3JhbmdlcyhmcCwgJm5wLT5yYW5nZXMpOwogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBPQ1RFVFNUUjoKICAgIGNhc2UgS1dfT1BBUVVFOgogICAgICAgIC8qCiAgICAgICAgICogcGFyc2UgYW55IFNJWkUgc3BlY2lmaWNhdGlvbiAKICAgICAgICAgKi8KICAgICAgICBpZiAobmV4dHR5cGUgPT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKG5leHR0eXBlID09IFNJWkUpIHsKICAgICAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmIChuZXh0dHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgICAgICAgICBucC0+cmFuZ2VzID0gcGFyc2VfcmFuZ2VzKGZwLCAmbnAtPnJhbmdlcyk7CiAgICAgICAgICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOyAgICAgIC8qICkgKi8KICAgICAgICAgICAgICAgICAgICBpZiAobmV4dHR5cGUgPT0gUklHSFRQQVJFTikgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFNJWkUgc3ludGF4IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE9CSklEOgogICAgY2FzZSBORVRBRERSOgogICAgY2FzZSBJUEFERFI6CiAgICBjYXNlIFRJTUVUSUNLUzoKICAgIGNhc2UgTlVMOgogICAgY2FzZSBOU0FQQUREUkVTUzoKICAgIGNhc2UgQ09VTlRFUjY0OgogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBwcmludF9lcnJvcigiQmFkIHN5bnRheCIsIHRva2VuLCB0eXBlKTsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgaWYgKG5leHR0eXBlID09IFVOSVRTKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFVOSVRTIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgbnAtPnVuaXRzID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICB9CiAgICBpZiAobmV4dHR5cGUgIT0gQUNDRVNTKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIlNob3VsZCBiZSBBQ0NFU1MiLCBuZXh0dG9rZW4sIG5leHR0eXBlKTsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IFJFQURPTkxZICYmIHR5cGUgIT0gUkVBRFdSSVRFICYmIHR5cGUgIT0gV1JJVEVPTkxZCiAgICAgICAgJiYgdHlwZSAhPSBOT0FDQ0VTUyAmJiB0eXBlICE9IFJFQURDUkVBVEUgJiYgdHlwZSAhPSBBQ0NOT1RJRlkpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIEFDQ0VTUyB0eXBlIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBucC0+YWNjZXNzID0gdHlwZTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBTVEFUVVMpIHsKICAgICAgICBwcmludF9lcnJvcigiU2hvdWxkIGJlIFNUQVRVUyIsIHRva2VuLCB0eXBlKTsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IE1BTkRBVE9SWSAmJiB0eXBlICE9IENVUlJFTlQgJiYgdHlwZSAhPSBLV19PUFRJT05BTCAmJgogICAgICAgIHR5cGUgIT0gT0JTT0xFVEUgJiYgdHlwZSAhPSBERVBSRUNBVEVEKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBTVEFUVVMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIG5wLT5zdGF0dXMgPSB0eXBlOwogICAgLyoKICAgICAqIE9wdGlvbmFsIHBhcnRzIG9mIHRoZSBPQkpFQ1QtVFlQRSBtYWNybwogICAgICovCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgd2hpbGUgKHR5cGUgIT0gRVFVQUxTICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSBERVNDUklQVElPTjoKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKCiAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgewogICAgICAgICAgICAgICAgbnAtPmRlc2NyaXB0aW9uID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBSRUZFUkVOQ0U6CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFJFRkVSRU5DRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBucC0+cmVmZXJlbmNlID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBJTkRFWDoKICAgICAgICAgICAgaWYgKG5wLT5hdWdtZW50cykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkNhbm5vdCBoYXZlIGJvdGggSU5ERVggYW5kIEFVR01FTlRTIiwgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBucC0+aW5kZXhlcyA9IGdldEluZGV4ZXMoZnAsICZucC0+aW5kZXhlcyk7CiAgICAgICAgICAgIGlmIChucC0+aW5kZXhlcyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIElOREVYIGxpc3QiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBVUdNRU5UUzoKICAgICAgICAgICAgaWYgKG5wLT5pbmRleGVzKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQ2Fubm90IGhhdmUgYm90aCBJTkRFWCBhbmQgQVVHTUVOVFMiLCB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5wLT5pbmRleGVzID0gZ2V0SW5kZXhlcyhmcCwgJm5wLT5pbmRleGVzKTsKICAgICAgICAgICAgaWYgKG5wLT5pbmRleGVzID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgQVVHTUVOVFMgbGlzdCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBucC0+YXVnbWVudHMgPSBzdHJkdXAobnAtPmluZGV4ZXMtPmlsYWJlbCk7CiAgICAgICAgICAgIGZyZWVfaW5kZXhlcygmbnAtPmluZGV4ZXMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIERFRlZBTDoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTWFyaydzIGRlZlZhbCBzZWN0aW9uIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVGQVVMVFZBTFVFIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxldmVsID0gMTsKICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBkZWZidWZbNTEyXTsKCiAgICAgICAgICAgICAgICBkZWZidWZbMF0gPSAwOwogICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgIGlmICgodHlwZSA9PSBSSUdIVEJSQUNLRVQgJiYgLS1sZXZlbCA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlID09IEVORE9GRklMRSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBMRUZUQlJBQ0tFVCkKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwrKzsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBRVU9URVNUUklORykKICAgICAgICAgICAgICAgICAgICAgICAgc3RybGNhdChkZWZidWYsICJcXFwiIiwgc2l6ZW9mKGRlZmJ1ZikpOwogICAgICAgICAgICAgICAgICAgIHN0cmxjYXQoZGVmYnVmLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgc2l6ZW9mKGRlZmJ1ZikpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFFVT1RFU1RSSU5HKQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsY2F0KGRlZmJ1ZiwgIlxcXCIiLCBzaXplb2YoZGVmYnVmKSk7CiAgICAgICAgICAgICAgICAgICAgc3RybGNhdChkZWZidWYsICIgIiwgc2l6ZW9mKGRlZmJ1ZikpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFJJR0hUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVGQVVMVFZBTFVFIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBkZWZidWZbc3RybGVuKGRlZmJ1ZikgLSAxXSA9IDA7CiAgICAgICAgICAgICAgICBucC0+ZGVmYXVsdFZhbHVlID0gc3RyZHVwKGRlZmJ1Zik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE5VTV9FTlRSSUVTOgogICAgICAgICAgICBpZiAodG9zc09iamVjdElkZW50aWZpZXIoZnApICE9IE9CSklEKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIE9iamVjdCBJZGVudGlmaWVyIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIGZvcm1hdCBvZiBvcHRpb25hbCBjbGF1c2VzIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CiAgICBpZiAodHlwZSAhPSBFUVVBTFMpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIGZvcm1hdCIsIHRva2VuLCB0eXBlKTsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgcmV0dXJuIG1lcmdlX3BhcnNlX29iamVjdGlkKG5wLCBmcCwgbmFtZSk7Cn0KCi8qCiAqIFBhcnNlcyBhbiBPQkpFQ1QgR1JPVVAgbWFjcm8uCiAqIFJldHVybnMgMCBvbiBlcnJvci4KICoKICogQWxzbyBwYXJzZXMgb2JqZWN0LWlkZW50aXR5LCBzaW5jZSB0aGV5IGFyZSBzaW1pbGFyIChpZ25vcmUgU1RBVFVTKS4KICogICAtIFdKSCAxMC85NgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2Vfb2JqZWN0Z3JvdXAoRklMRSAqIGZwLCBjaGFyICpuYW1lLCBpbnQgd2hhdCwgc3RydWN0IG9iamdyb3VwICoqb2wpCnsKICAgIGludCAgICAgICAgICAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBxdW90ZWRfc3RyaW5nX2J1ZmZlcltNQVhRVU9URVNUUl07CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnA7CgogICAgbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgPT0gd2hhdCkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgIT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwie1wiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIGRvIHsKICAgICAgICAgICAgc3RydWN0IG9iamdyb3VwICpvOwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBMQUJFTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBpZGVudGlmaWVyIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG8gPSAoc3RydWN0IG9iamdyb3VwICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamdyb3VwKSk7CiAgICAgICAgICAgIGlmICghbykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIlJlc291cmNlIGZhaWx1cmUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgby0+bGluZSA9IG1pYkxpbmU7CiAgICAgICAgICAgIG8tPm5hbWUgPSBzdHJkdXAodG9rZW4pOwogICAgICAgICAgICBvLT5uZXh0ID0gKm9sOwogICAgICAgICAgICAqb2wgPSBvOwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0gd2hpbGUgKHR5cGUgPT0gQ09NTUEpOwogICAgICAgIGlmICh0eXBlICE9IFJJR0hUQlJBQ0tFVCkgewogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ9XCIgYWZ0ZXIgbGlzdCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgdHlwZSk7CiAgICB9CiAgICBpZiAodHlwZSAhPSBTVEFUVVMpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgU1RBVFVTIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBDVVJSRU5UICYmIHR5cGUgIT0gREVQUkVDQVRFRCAmJiB0eXBlICE9IE9CU09MRVRFKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBTVEFUVVMgdmFsdWUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IERFU0NSSVBUSU9OKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKSB7CiAgICAgICAgbnAtPmRlc2NyaXB0aW9uID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSA9PSBSRUZFUkVOQ0UpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgUkVGRVJFTkNFIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgbnAtPnJlZmVyZW5jZSA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIH0KICAgIGlmICh0eXBlICE9IEVRVUFMUykKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCI6Oj1cIiIsIHRva2VuLCB0eXBlKTsKICBza2lwOgogICAgd2hpbGUgKHR5cGUgIT0gRVFVQUxTICYmIHR5cGUgIT0gRU5ET0ZGSUxFKQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CgogICAgcmV0dXJuIG1lcmdlX3BhcnNlX29iamVjdGlkKG5wLCBmcCwgbmFtZSk7Cn0KCi8qCiAqIFBhcnNlcyBhIE5PVElGSUNBVElPTi1UWVBFIG1hY3JvLgogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9ub3RpZmljYXRpb25EZWZpbml0aW9uKEZJTEUgKiBmcCwgY2hhciAqbmFtZSkKewogICAgcmVnaXN0ZXIgaW50ICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIHF1b3RlZF9zdHJpbmdfYnVmZmVyW01BWFFVT1RFU1RSXTsKICAgIHJlZ2lzdGVyIHN0cnVjdCBub2RlICpucDsKCiAgICBucCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgaWYgKG5wID09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB3aGlsZSAodHlwZSAhPSBFUVVBTFMgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICBjYXNlIERFU0NSSVBUSU9OOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUykpIHsKICAgICAgICAgICAgICAgIG5wLT5kZXNjcmlwdGlvbiA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBSRUZFUkVOQ0U6CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFJFRkVSRU5DRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBucC0+cmVmZXJlbmNlID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPQkpFQ1RTOgogICAgICAgICAgICBucC0+dmFyYmluZHMgPSBnZXRWYXJiaW5kcyhmcCwgJm5wLT52YXJiaW5kcyk7CiAgICAgICAgICAgIGlmICghbnAtPnZhcmJpbmRzKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIE9CSkVDVFMgbGlzdCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBOT1RISU5HIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CiAgICByZXR1cm4gbWVyZ2VfcGFyc2Vfb2JqZWN0aWQobnAsIGZwLCBuYW1lKTsKfQoKLyoKICogUGFyc2VzIGEgVFJBUC1UWVBFIG1hY3JvLgogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV90cmFwRGVmaW5pdGlvbihGSUxFICogZnAsIGNoYXIgKm5hbWUpCnsKICAgIHJlZ2lzdGVyIGludCAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBxdW90ZWRfc3RyaW5nX2J1ZmZlcltNQVhRVU9URVNUUl07CiAgICByZWdpc3RlciBzdHJ1Y3Qgbm9kZSAqbnA7CgogICAgbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgd2hpbGUgKHR5cGUgIT0gRVFVQUxTICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSBERVNDUklQVElPTjoKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKSB7CiAgICAgICAgICAgICAgICBucC0+ZGVzY3JpcHRpb24gPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUkVGRVJFTkNFOgogICAgICAgICAgICAvKiBJJ20gbm90IHN1cmUgUkVGRVJFTkNFcyBhcmUgbGVnYWwgaW4gc21pdjEgdHJhcHM/Pz8gKi8KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgUkVGRVJFTkNFIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5wLT5yZWZlcmVuY2UgPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVOVEVSUFJJU0U6CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlID09IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEFCRUwpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFRyYXAgRm9ybWF0IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBucC0+cGFyZW50ID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBHZXQgcmlnaHQgYnJhY2tldCAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IExBQkVMKSB7CiAgICAgICAgICAgICAgICBucC0+cGFyZW50ID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFZBUklBQkxFUzoKICAgICAgICAgICAgbnAtPnZhcmJpbmRzID0gZ2V0VmFyYmluZHMoZnAsICZucC0+dmFyYmluZHMpOwogICAgICAgICAgICBpZiAoIW5wLT52YXJiaW5kcykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBWQVJJQUJMRVMgbGlzdCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBOT1RISU5HIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwoKICAgIG5wLT5sYWJlbCA9IHN0cmR1cChuYW1lKTsKCiAgICBpZiAodHlwZSAhPSBOVU1CRVIpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgYSBOdW1iZXIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIG5wLT5zdWJpZCA9IHN0cnRvdWwodG9rZW4sIE5VTEwsIDEwKTsKICAgIG5wLT5uZXh0ID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAtPm5leHQgPT0gTlVMTCkgewogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIH0KICAgIG5wLT5uZXh0LT5wYXJlbnQgPSBucC0+cGFyZW50OwogICAgbnAtPnBhcmVudCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4obnAtPnBhcmVudCkgKyAyKTsKICAgIGlmIChucC0+cGFyZW50ID09IE5VTEwpIHsKICAgICAgICBmcmVlX25vZGUobnAtPm5leHQpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIH0KICAgIHN0cmNweShucC0+cGFyZW50LCBucC0+bmV4dC0+cGFyZW50KTsKICAgIHN0cmNhdChucC0+cGFyZW50LCAiIyIpOwogICAgbnAtPm5leHQtPmxhYmVsID0gc3RyZHVwKG5wLT5wYXJlbnQpOwogICAgcmV0dXJuIG5wOwp9CgoKLyoKICogUGFyc2VzIGEgY29tcGxpYW5jZSBtYWNybwogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqLwpzdGF0aWMgaW50CmVhdF9zeW50YXgoRklMRSAqIGZwLCBjaGFyICp0b2tlbiwgaW50IG1heHRva2VuKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZSwgbmV4dHR5cGU7CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGNoYXIgICAgICAgICAgICBuZXh0dG9rZW5bTUFYVE9LRU5dOwoKICAgIGlmICghbnApCglyZXR1cm4gMDsKCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgbWF4dG9rZW4pOwogICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgc3dpdGNoICh0eXBlKSB7CiAgICBjYXNlIElOVEVHRVI6CiAgICBjYXNlIElOVEVHRVIzMjoKICAgIGNhc2UgVUlOVEVHRVIzMjoKICAgIGNhc2UgVU5TSUdORUQzMjoKICAgIGNhc2UgQ09VTlRFUjoKICAgIGNhc2UgR0FVR0U6CiAgICBjYXNlIEJJVFNUUklORzoKICAgIGNhc2UgTEFCRUw6CiAgICAgICAgaWYgKG5leHR0eXBlID09IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlmIHRoZXJlIGlzIGFuIGVudW1lcmF0aW9uIGxpc3QsIHBhcnNlIGl0IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbnAtPmVudW1zID0gcGFyc2VfZW51bWxpc3QoZnAsICZucC0+ZW51bXMpOwogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfSBlbHNlIGlmIChuZXh0dHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaWYgdGhlcmUgaXMgYSByYW5nZSBsaXN0LCBwYXJzZSBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5wLT5yYW5nZXMgPSBwYXJzZV9yYW5nZXMoZnAsICZucC0+cmFuZ2VzKTsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgT0NURVRTVFI6CiAgICBjYXNlIEtXX09QQVFVRToKICAgICAgICAvKgogICAgICAgICAqIHBhcnNlIGFueSBTSVpFIHNwZWNpZmljYXRpb24gCiAgICAgICAgICovCiAgICAgICAgaWYgKG5leHR0eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmIChuZXh0dHlwZSA9PSBTSVpFKSB7CiAgICAgICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAobmV4dHR5cGUgPT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgbnAtPnJhbmdlcyA9IHBhcnNlX3JhbmdlcyhmcCwgJm5wLT5yYW5nZXMpOwogICAgICAgICAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsgICAgICAvKiApICovCiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHR0eXBlID09IFJJR0hUUEFSRU4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBTSVpFIHN5bnRheCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgcmV0dXJuIG5leHR0eXBlOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgT0JKSUQ6CiAgICBjYXNlIE5FVEFERFI6CiAgICBjYXNlIElQQUREUjoKICAgIGNhc2UgVElNRVRJQ0tTOgogICAgY2FzZSBOVUw6CiAgICBjYXNlIE5TQVBBRERSRVNTOgogICAgY2FzZSBDT1VOVEVSNjQ6CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHByaW50X2Vycm9yKCJCYWQgc3ludGF4IiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIG5leHR0eXBlOwogICAgfQogICAgZnJlZV9ub2RlKG5wKTsKICAgIHJldHVybiBuZXh0dHlwZTsKfQoKc3RhdGljIGludApjb21wbGlhbmNlX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kaWQpCnsKICAgIGlmIChtb2RpZCA9PSAtMSkgewogICAgICAgIHN0cnVjdCBvYmpncm91cCAqb3AgPQogICAgICAgICAgICAoc3RydWN0IG9iamdyb3VwICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamdyb3VwKSk7CiAgICAgICAgaWYgKCFvcCkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgb3AtPm5leHQgPSBvYmpncm91cHM7CiAgICAgICAgb3AtPm5hbWUgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgb3AtPmxpbmUgPSBtaWJMaW5lOwogICAgICAgIG9iamdyb3VwcyA9IG9wOwogICAgICAgIHJldHVybiAxOwogICAgfSBlbHNlCiAgICAgICAgcmV0dXJuIGZpbmRfdHJlZV9ub2RlKG5hbWUsIG1vZGlkKSAhPSBOVUxMOwp9CgpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9jb21wbGlhbmNlKEZJTEUgKiBmcCwgY2hhciAqbmFtZSkKewogICAgaW50ICAgICAgICAgICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIHF1b3RlZF9zdHJpbmdfYnVmZmVyW01BWFFVT1RFU1RSXTsKICAgIHN0cnVjdCBub2RlICAgICpucDsKCiAgICBucCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgaWYgKG5wID09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBTVEFUVVMpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgU1RBVFVTIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBDVVJSRU5UICYmIHR5cGUgIT0gREVQUkVDQVRFRCAmJiB0eXBlICE9IE9CU09MRVRFKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBTVEFUVVMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IERFU0NSSVBUSU9OKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUykpCiAgICAgICAgbnAtPmRlc2NyaXB0aW9uID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSA9PSBSRUZFUkVOQ0UpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgUkVGRVJFTkNFIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIG5wLT5yZWZlcmVuY2UgPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CiAgICBpZiAodHlwZSAhPSBNT0RVTEUpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgTU9EVUxFIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHdoaWxlICh0eXBlID09IE1PRFVMRSkgewogICAgICAgIGludCAgICAgICAgICAgICBtb2RpZCA9IC0xOwogICAgICAgIGNoYXIgICAgICAgICAgICBtb2RuYW1lW01BWFRPS0VOXTsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlID09IExBQkVMCiAgICAgICAgICAgICYmIHN0cmNtcCh0b2tlbiwgbW9kdWxlX25hbWUoY3VycmVudF9tb2R1bGUsIG1vZG5hbWUpKSkgewogICAgICAgICAgICBtb2RpZCA9IHJlYWRfbW9kdWxlX2ludGVybmFsKHRva2VuKTsKICAgICAgICAgICAgaWYgKG1vZGlkICE9IE1PRFVMRV9MT0FERURfT0sKICAgICAgICAgICAgICAgICYmIG1vZGlkICE9IE1PRFVMRV9BTFJFQURZX0xPQURFRCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIlVua25vd24gbW9kdWxlIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZGlkID0gd2hpY2hfbW9kdWxlKHRva2VuKTsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgPT0gTUFOREFUT1JZR1JPVVBTKSB7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ7XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBncm91cCBuYW1lIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghY29tcGxpYW5jZV9sb29rdXAodG9rZW4sIG1vZGlkKSkKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiVW5rbm93biBncm91cCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0gd2hpbGUgKHR5cGUgPT0gQ09NTUEpOwogICAgICAgICAgICBpZiAodHlwZSAhPSBSSUdIVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIn1cIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgICAgICB3aGlsZSAodHlwZSA9PSBHUk9VUCB8fCB0eXBlID09IE9CSkVDVCkgewogICAgICAgICAgICBpZiAodHlwZSA9PSBHUk9VUCkgewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBncm91cCBuYW1lIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghY29tcGxpYW5jZV9sb29rdXAodG9rZW4sIG1vZGlkKSkKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiVW5rbm93biBncm91cCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEFCRUwpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIG9iamVjdCBuYW1lIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghY29tcGxpYW5jZV9sb29rdXAodG9rZW4sIG1vZGlkKSkKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiVW5rbm93biBncm91cCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBTWU5UQVgpCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGVhdF9zeW50YXgoZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBXUlNZTlRBWCkKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZWF0X3N5bnRheChmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlID09IE1JTkFDQ0VTUykgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gTk9BQ0NFU1MgJiYgdHlwZSAhPSBBQ0NOT1RJRlkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBSRUFET05MWSAmJiB0eXBlICE9IFdSSVRFT05MWQogICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IFJFQURDUkVBVEUgJiYgdHlwZSAhPSBSRUFEV1JJVEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBNSU4tQUNDRVNTIHNwZWMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZSAhPSBERVNDUklQVElPTikgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfQogICAgfQogIHNraXA6CiAgICB3aGlsZSAodHlwZSAhPSBFUVVBTFMgJiYgdHlwZSAhPSBFTkRPRkZJTEUpCiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKCiAgICByZXR1cm4gbWVyZ2VfcGFyc2Vfb2JqZWN0aWQobnAsIGZwLCBuYW1lKTsKfQoKCi8qCiAqIFBhcnNlcyBhIGNhcGFiaWxpdGllcyBtYWNybwogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9jYXBhYmlsaXRpZXMoRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgcXVvdGVkX3N0cmluZ19idWZmZXJbTUFYUVVPVEVTVFJdOwogICAgc3RydWN0IG5vZGUgICAgKm5wOwoKICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IFBST0RSRUwpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgUFJPRFVDVC1SRUxFQVNFIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBTVFJJTkcgYWZ0ZXIgUFJPRFVDVC1SRUxFQVNFIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBTVEFUVVMpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgU1RBVFVTIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBDVVJSRU5UICYmIHR5cGUgIT0gT0JTT0xFVEUpIHsKICAgICAgICBwcmludF9lcnJvcigiU1RBVFVTIHNob3VsZCBiZSBjdXJyZW50IG9yIG9ic29sZXRlIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBERVNDUklQVElPTikgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKSB7CiAgICAgICAgbnAtPmRlc2NyaXB0aW9uID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSA9PSBSRUZFUkVOQ0UpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgUkVGRVJFTkNFIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIG5wLT5yZWZlcmVuY2UgPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCB0eXBlKTsKICAgIH0KICAgIHdoaWxlICh0eXBlID09IFNVUFBPUlRTKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIG1vZGlkOwogICAgICAgIHN0cnVjdCB0cmVlICAgICp0cDsKCiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBMQUJFTCkgewogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIG1vZHVsZSBuYW1lIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIG1vZGlkID0gcmVhZF9tb2R1bGVfaW50ZXJuYWwodG9rZW4pOwogICAgICAgIGlmIChtb2RpZCAhPSBNT0RVTEVfTE9BREVEX09LICYmIG1vZGlkICE9IE1PRFVMRV9BTFJFQURZX0xPQURFRCkgewogICAgICAgICAgICBwcmludF9lcnJvcigiTW9kdWxlIG5vdCBmb3VuZCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICBtb2RpZCA9IHdoaWNoX21vZHVsZSh0b2tlbik7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBJTkNMVURFUykgewogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgSU5DTFVERVMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ7XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgZG8gewogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBMQUJFTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIGdyb3VwIG5hbWUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHAgPSBmaW5kX3RyZWVfbm9kZSh0b2tlbiwgbW9kaWQpOwogICAgICAgICAgICBpZiAoIXRwKQogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkdyb3VwIG5vdCBmb3VuZCBpbiBtb2R1bGUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfSB3aGlsZSAodHlwZSA9PSBDT01NQSk7CiAgICAgICAgaWYgKHR5cGUgIT0gUklHSFRCUkFDS0VUKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIn1cIiBhZnRlciBncm91cCBsaXN0IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgd2hpbGUgKHR5cGUgPT0gVkFSSUFUSU9OKSB7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIG9iamVjdCBuYW1lIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRwID0gZmluZF90cmVlX25vZGUodG9rZW4sIG1vZGlkKTsKICAgICAgICAgICAgaWYgKCF0cCkKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJPYmplY3Qgbm90IGZvdW5kIGluIG1vZHVsZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gU1lOVEFYKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZWF0X3N5bnRheChmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZSA9PSBXUlNZTlRBWCkgewogICAgICAgICAgICAgICAgdHlwZSA9IGVhdF9zeW50YXgoZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGUgPT0gQUNDRVNTKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gQUNDTk9USUZZICYmIHR5cGUgIT0gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IFJFQURXUklURSAmJiB0eXBlICE9IFJFQURDUkVBVEUKICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IFdSSVRFT05MWSAmJiB0eXBlICE9IE5PVElNUEwpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIEFDQ0VTUyIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlID09IENSRUFURVJFUSkgewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwie1wiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgb2JqZWN0IG5hbWUgaW4gbGlzdCIsIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgfSB3aGlsZSAodHlwZSA9PSBDT01NQSk7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBSSUdIVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ9XCIgYWZ0ZXIgbGlzdCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlID09IERFRlZBTCkgewogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxldmVsID0gMTsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIntcIiBhZnRlciBERUZWQUwiLCB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBMRUZUQlJBQ0tFVCkKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwrKzsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IFJJR0hUQlJBQ0tFVCkKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwtLTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKCh0eXBlICE9IFJJR0hUQlJBQ0tFVCB8fCBsZXZlbCAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBFTkRPRkZJTEUpOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gUklHSFRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIk1pc3NpbmcgXCJ9XCIgYWZ0ZXIgREVGVkFMIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGUgIT0gREVTQ1JJUFRJT04pIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlICE9IEVRVUFMUykKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCI6Oj1cIiIsIHRva2VuLCB0eXBlKTsKICBza2lwOgogICAgd2hpbGUgKHR5cGUgIT0gRVFVQUxTICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgIH0KICAgIHJldHVybiBtZXJnZV9wYXJzZV9vYmplY3RpZChucCwgZnAsIG5hbWUpOwp9CgovKgogKiBQYXJzZXMgYSBtb2R1bGUgaWRlbnRpdHkgbWFjcm8KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIHZvaWQKY2hlY2tfdXRjKGNvbnN0IGNoYXIgKnV0YykKewogICAgaW50ICAgICAgICAgICAgIGxlbiwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlOwoKICAgIGxlbiA9IHN0cmxlbih1dGMpOwogICAgaWYgKHV0Y1tsZW4gLSAxXSAhPSAnWicgJiYgdXRjW2xlbiAtIDFdICE9ICd6JykgewogICAgICAgIHByaW50X2Vycm9yKCJUaW1lc3RhbXAgc2hvdWxkIGVuZCB3aXRoIFoiLCB1dGMsIFFVT1RFU1RSSU5HKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobGVuID09IDExKSB7CiAgICAgICAgbGVuID0KICAgICAgICAgICAgc3NjYW5mKHV0YywgIiUyZCUyZCUyZCUyZCUyZFoiLCAmeWVhciwgJm1vbnRoLCAmZGF5LCAmaG91ciwKICAgICAgICAgICAgICAgICAgICZtaW51dGUpOwogICAgICAgIHllYXIgKz0gMTkwMDsKICAgIH0gZWxzZSBpZiAobGVuID09IDEzKQogICAgICAgIGxlbiA9CiAgICAgICAgICAgIHNzY2FuZih1dGMsICIlNGQlMmQlMmQlMmQlMmRaIiwgJnllYXIsICZtb250aCwgJmRheSwgJmhvdXIsCiAgICAgICAgICAgICAgICAgICAmbWludXRlKTsKICAgIGVsc2UgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgdGltZXN0YW1wIGZvcm1hdCAoMTEgb3IgMTMgY2hhcmFjdGVycykiLAogICAgICAgICAgICAgICAgICAgIHV0YywgUVVPVEVTVFJJTkcpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChsZW4gIT0gNSkgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgdGltZXN0YW1wIGZvcm1hdCIsIHV0YywgUVVPVEVTVFJJTkcpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMikKICAgICAgICBwcmludF9lcnJvcigiQmFkIG1vbnRoIGluIHRpbWVzdGFtcCIsIHV0YywgUVVPVEVTVFJJTkcpOwogICAgaWYgKGRheSA8IDEgfHwgZGF5ID4gMzEpCiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBkYXkgaW4gdGltZXN0YW1wIiwgdXRjLCBRVU9URVNUUklORyk7CiAgICBpZiAoaG91ciA8IDAgfHwgaG91ciA+IDIzKQogICAgICAgIHByaW50X2Vycm9yKCJCYWQgaG91ciBpbiB0aW1lc3RhbXAiLCB1dGMsIFFVT1RFU1RSSU5HKTsKICAgIGlmIChtaW51dGUgPCAwIHx8IG1pbnV0ZSA+IDU5KQogICAgICAgIHByaW50X2Vycm9yKCJCYWQgbWludXRlIGluIHRpbWVzdGFtcCIsIHV0YywgUVVPVEVTVFJJTkcpOwp9CgpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9tb2R1bGVJZGVudGl0eShGSUxFICogZnAsIGNoYXIgKm5hbWUpCnsKICAgIHJlZ2lzdGVyIGludCAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBxdW90ZWRfc3RyaW5nX2J1ZmZlcltNQVhRVU9URVNUUl07CiAgICByZWdpc3RlciBzdHJ1Y3Qgbm9kZSAqbnA7CgogICAgbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gTEFTVFVQREFURUQpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgTEFTVC1VUERBVEVEIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJOZWVkIFNUUklORyBmb3IgTEFTVC1VUERBVEVEIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIGNoZWNrX3V0Yyh0b2tlbik7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gT1JHQU5JWkFUSU9OKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIE9SR0FOSVpBVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIE9SR0FOSVpBVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gQ09OVEFDVElORk8pIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgQ09OVEFDVC1JTkZPIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgQ09OVEFDVC1JTkZPIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBERVNDUklQVElPTikgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKSB7CiAgICAgICAgbnAtPmRlc2NyaXB0aW9uID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB3aGlsZSAodHlwZSA9PSBSRVZJU0lPTikgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBSRVZJU0lPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICBjaGVja191dGModG9rZW4pOwogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgIT0gREVTQ1JJUFRJT04pIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgaWYgKHR5cGUgIT0gRVFVQUxTKQogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIjo6PVwiIiwgdG9rZW4sIHR5cGUpOwogIHNraXA6CiAgICB3aGlsZSAodHlwZSAhPSBFUVVBTFMgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgfQogICAgcmV0dXJuIG1lcmdlX3BhcnNlX29iamVjdGlkKG5wLCBmcCwgbmFtZSk7Cn0KCgovKgogKiBQYXJzZXMgYSBNQUNSTyBkZWZpbml0aW9uCiAqIEV4cGVjdCBCRUdJTiwgZGlzY2FyZCBldmVyeXRoaW5nIHRvIGVuZC4KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2VfbWFjcm8oRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnA7CiAgICBpbnQgICAgICAgICAgICAgaUxpbmUgPSBtaWJMaW5lOwoKICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIHNpemVvZih0b2tlbikpOwogICAgd2hpbGUgKHR5cGUgIT0gRVFVQUxTICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIHNpemVvZih0b2tlbikpOwogICAgfQogICAgaWYgKHR5cGUgIT0gRVFVQUxTKSB7CiAgICAgICAgaWYgKG5wKQogICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgd2hpbGUgKHR5cGUgIT0gQkVHSU4gJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgc2l6ZW9mKHRva2VuKSk7CiAgICB9CiAgICBpZiAodHlwZSAhPSBCRUdJTikgewogICAgICAgIGlmIChucCkKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHdoaWxlICh0eXBlICE9IEVORCAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBzaXplb2YodG9rZW4pKTsKICAgIH0KICAgIGlmICh0eXBlICE9IEVORCkgewogICAgICAgIGlmIChucCkKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAiJXMgTUFDUk8gKGxpbmVzICVkLi4lZCBwYXJzZWQgYW5kIGlnbm9yZWQpLlxuIiwgbmFtZSwKICAgICAgICAgICAgICAgICBpTGluZSwgbWliTGluZSk7CiAgICB9CgogICAgcmV0dXJuIG5wOwp9CgovKgogKiBQYXJzZXMgYSBtb2R1bGUgaW1wb3J0IGNsYXVzZQogKiAgIGxvYWRpbmcgYW55IG1vZHVsZXMgcmVmZXJlbmNlZAogKi8Kc3RhdGljIHZvaWQKcGFyc2VfaW1wb3J0cyhGSUxFICogZnApCnsKICAgIHJlZ2lzdGVyIGludCAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBtb2RidWZbMjU2XTsKI2RlZmluZSBNQVhfSU1QT1JUUwkyNTYKICAgIHN0cnVjdCBtb2R1bGVfaW1wb3J0IGltcG9ydF9saXN0W01BWF9JTVBPUlRTXTsKICAgIGludCAgICAgICAgICAgICB0aGlzX21vZHVsZTsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKCiAgICBpbnQgICAgICAgICAgICAgaW1wb3J0X2NvdW50ID0gMDsgICAvKiBUb3RhbCBudW1iZXIgb2YgaW1wb3J0ZWQgZGVzY3JpcHRvcnMgKi8KICAgIGludCAgICAgICAgICAgICBpID0gMCwgb2xkX2k7ICAgICAgIC8qIGluZGV4IG9mIGZpcnN0IGltcG9ydCBmcm9tIGVhY2ggbW9kdWxlICovCgogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKCiAgICAvKgogICAgICogUGFyc2UgdGhlIElNUE9SVFMgY2xhdXNlCiAgICAgKi8KICAgIHdoaWxlICh0eXBlICE9IFNFTUkgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICBpZiAodHlwZSA9PSBMQUJFTCkgewogICAgICAgICAgICBpZiAoaW1wb3J0X2NvdW50ID09IE1BWF9JTVBPUlRTKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiVG9vIG1hbnkgaW1wb3J0ZWQgc3ltYm9scyIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgfSB3aGlsZSAodHlwZSAhPSBTRU1JICYmIHR5cGUgIT0gRU5ET0ZGSUxFKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbXBvcnRfbGlzdFtpbXBvcnRfY291bnQrK10ubGFiZWwgPSBzdHJkdXAodG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBGUk9NKSB7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmIChpbXBvcnRfY291bnQgPT0gaSkgeyAgICAvKiBBbGwgaW1wb3J0cyBhcmUgaGFuZGxlZCBpbnRlcm5hbGx5ICovCiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpc19tb2R1bGUgPSB3aGljaF9tb2R1bGUodG9rZW4pOwoKICAgICAgICAgICAgZm9yIChvbGRfaSA9IGk7IGkgPCBpbXBvcnRfY291bnQ7ICsraSkKICAgICAgICAgICAgICAgIGltcG9ydF9saXN0W2ldLm1vZGlkID0gdGhpc19tb2R1bGU7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBSZWN1cnNpdmVseSByZWFkIGFueSBwcmUtcmVxdWlzaXRlIG1vZHVsZXMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChyZWFkX21vZHVsZV9pbnRlcm5hbCh0b2tlbikgPT0gTU9EVUxFX05PVF9GT1VORCkgewoJCWludCBmb3VuZCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKDsgb2xkX2kgPCBpbXBvcnRfY291bnQ7ICsrb2xkX2kpIHsKICAgICAgICAgICAgICAgICAgICBmb3VuZCArPSByZWFkX2ltcG9ydF9yZXBsYWNlbWVudHModG9rZW4sICZpbXBvcnRfbGlzdFtvbGRfaV0pOwogICAgICAgICAgICAgICAgfQoJCWlmICghZm91bmQpCgkJICAgIHByaW50X21vZHVsZV9ub3RfZm91bmQodG9rZW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CgogICAgLyoKICAgICAqIFNhdmUgdGhlIGltcG9ydCBpbmZvcm1hdGlvbgogICAgICogICBpbiB0aGUgZ2xvYmFsIG1vZHVsZSB0YWJsZQogICAgICovCiAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wOyBtcCA9IG1wLT5uZXh0KQogICAgICAgIGlmIChtcC0+bW9kaWQgPT0gY3VycmVudF9tb2R1bGUpIHsKICAgICAgICAgICAgaWYgKGltcG9ydF9jb3VudCA9PSAwKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAobXAtPmltcG9ydHMgJiYgKG1wLT5pbXBvcnRzICE9IHJvb3RfaW1wb3J0cykpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB0aGlzIGNhbiBoYXBwZW4gaWYgYWxsIG1vZHVsZXMgYXJlIGluIG9uZSBzb3VyY2UgZmlsZS4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtcC0+bm9faW1wb3J0czsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjIyMjIGZyZWVpbmcgTW9kdWxlICVkICclcycgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAtPm1vZGlkLCBtcC0+aW1wb3J0c1tpXS5sYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcC0+aW1wb3J0c1tpXS5tb2RpZCkpOwogICAgICAgICAgICAgICAgICAgIGZyZWUoKGNoYXIgKikgbXAtPmltcG9ydHNbaV0ubGFiZWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnJlZSgoY2hhciAqKSBtcC0+aW1wb3J0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXAtPmltcG9ydHMgPSAoc3RydWN0IG1vZHVsZV9pbXBvcnQgKikKICAgICAgICAgICAgICAgIGNhbGxvYyhpbXBvcnRfY291bnQsIHNpemVvZihzdHJ1Y3QgbW9kdWxlX2ltcG9ydCkpOwogICAgICAgICAgICBpZiAobXAtPmltcG9ydHMgPT0gTlVMTCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGltcG9ydF9jb3VudDsgKytpKSB7CiAgICAgICAgICAgICAgICBtcC0+aW1wb3J0c1tpXS5sYWJlbCA9IGltcG9ydF9saXN0W2ldLmxhYmVsOwogICAgICAgICAgICAgICAgbXAtPmltcG9ydHNbaV0ubW9kaWQgPSBpbXBvcnRfbGlzdFtpXS5tb2RpZDsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjIyMjIGFkZGluZyBNb2R1bGUgJWQgJyVzJyAlZFxuIiwgbXAtPm1vZGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAtPmltcG9ydHNbaV0ubGFiZWwsIG1wLT5pbXBvcnRzW2ldLm1vZGlkKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXAtPm5vX2ltcG9ydHMgPSBpbXBvcnRfY291bnQ7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgLyoKICAgICAqIFNob3VsZG4ndCBnZXQgdGhpcyBmYXIKICAgICAqLwogICAgcHJpbnRfbW9kdWxlX25vdF9mb3VuZChtb2R1bGVfbmFtZShjdXJyZW50X21vZHVsZSwgbW9kYnVmKSk7CiAgICByZXR1cm47Cn0KCgoKLyoKICogTUlCIG1vZHVsZSBoYW5kbGluZyByb3V0aW5lcwogKi8KCnN0YXRpYyB2b2lkCmR1bXBfbW9kdWxlX2xpc3Qodm9pZCkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wID0gbW9kdWxlX2hlYWQ7CgogICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiTW9kdWxlIGxpc3Q6XG4iKSk7CiAgICB3aGlsZSAobXApIHsKICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICIgICVzICVkICVzICVkXG4iLCBtcC0+bmFtZSwgbXAtPm1vZGlkLAogICAgICAgICAgICAgICAgICAgIG1wLT5maWxlLCBtcC0+bm9faW1wb3J0cykpOwogICAgICAgIG1wID0gbXAtPm5leHQ7CiAgICB9Cn0KCmludAp3aGljaF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgaWYgKCFsYWJlbF9jb21wYXJlKG1wLT5uYW1lLCBuYW1lKSkKICAgICAgICAgICAgcmV0dXJuIChtcC0+bW9kaWQpOwoKICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIk1vZHVsZSAlcyBub3QgZm91bmRcbiIsIG5hbWUpKTsKICAgIHJldHVybiAoLTEpOwp9CgovKgogKiBtb2R1bGVfbmFtZSAtIGNvcHkgbW9kdWxlIG5hbWUgdG8gdXNlciBidWZmZXIsIHJldHVybiBwdHIgdG8gc2FtZS4KICovCmNoYXIgICAgICAgICAgICoKbW9kdWxlX25hbWUoaW50IG1vZGlkLCBjaGFyICpjcCkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgaWYgKG1wLT5tb2RpZCA9PSBtb2RpZCkgewogICAgICAgICAgICBzdHJjcHkoY3AsIG1wLT5uYW1lKTsKICAgICAgICAgICAgcmV0dXJuIChjcCk7CiAgICAgICAgfQoKICAgIGlmIChtb2RpZCAhPSAtMSkgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiTW9kdWxlICVkIG5vdCBmb3VuZFxuIiwgbW9kaWQpKTsKICAgIHNwcmludGYoY3AsICIjJWQiLCBtb2RpZCk7CiAgICByZXR1cm4gKGNwKTsKfQoKLyoKICogIEJhY2t3YXJkcyBjb21wYXRhYmlsaXR5CiAqICBSZWFkIG5ld2VyIG1vZHVsZXMgdGhhdCByZXBsYWNlIHRoZSBvbmUgc3BlY2lmaWVkOi0KICogICAgICBlaXRoZXIgYWxsIG9mIHRoZW0gKHJlYWRfbW9kdWxlX3JlcGxhY2VtZW50cyksCiAqICAgICAgb3IgdGhvc2UgcmVsYXRpbmcgdG8gYSBzcGVjaWZpZWQgaWRlbnRpZmllciAocmVhZF9pbXBvcnRfcmVwbGFjZW1lbnRzKQogKiAgICAgIHBsdXMgYW4gaW50ZXJmYWNlIHRvIGFkZCBuZXcgcmVwbGFjZW1lbnQgcmVxdWlyZW1lbnRzCiAqLwp2b2lkCmFkZF9tb2R1bGVfcmVwbGFjZW1lbnQoY29uc3QgY2hhciAqb2xkX21vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuZXdfbW9kdWxlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnLCBpbnQgbGVuKQp7CiAgICBzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkgKm1jcDsKCiAgICBtY3AgPSAoc3RydWN0IG1vZHVsZV9jb21wYXRhYmlsaXR5ICopCiAgICAgICAgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkpKTsKICAgIGlmIChtY3AgPT0gTlVMTCkKICAgICAgICByZXR1cm47CgogICAgbWNwLT5vbGRfbW9kdWxlID0gc3RyZHVwKG9sZF9tb2R1bGUpOwogICAgbWNwLT5uZXdfbW9kdWxlID0gc3RyZHVwKG5ld19tb2R1bGVfbmFtZSk7CiAgICBpZiAodGFnKQogICAgICAgIG1jcC0+dGFnID0gc3RyZHVwKHRhZyk7CiAgICBtY3AtPnRhZ19sZW4gPSBsZW47CgogICAgbWNwLT5uZXh0ID0gbW9kdWxlX21hcF9oZWFkOwogICAgbW9kdWxlX21hcF9oZWFkID0gbWNwOwp9CgpzdGF0aWMgaW50CnJlYWRfbW9kdWxlX3JlcGxhY2VtZW50cyhjb25zdCBjaGFyICpuYW1lKQp7CiAgICBzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkgKm1jcDsKCiAgICBmb3IgKG1jcCA9IG1vZHVsZV9tYXBfaGVhZDsgbWNwOyBtY3AgPSBtY3AtPm5leHQpIHsKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobWNwLT5vbGRfbW9kdWxlLCBuYW1lKSkgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICJMb2FkaW5nIHJlcGxhY2VtZW50IG1vZHVsZSAlcyBmb3IgJXMgKCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1jcC0+bmV3X21vZHVsZSwgbmFtZSwgRmlsZSk7CgkgICAgfQogICAgICAgICAgICAodm9pZCkgbmV0c25tcF9yZWFkX21vZHVsZShtY3AtPm5ld19tb2R1bGUpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludApyZWFkX2ltcG9ydF9yZXBsYWNlbWVudHMoY29uc3QgY2hhciAqb2xkX21vZHVsZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1vZHVsZV9pbXBvcnQgKmlkZW50aWZpZXIpCnsKICAgIHN0cnVjdCBtb2R1bGVfY29tcGF0YWJpbGl0eSAqbWNwOwoKICAgIC8qCiAgICAgKiBMb29rIGZvciBtYXRjaGVzIGZpcnN0CiAgICAgKi8KICAgIGZvciAobWNwID0gbW9kdWxlX21hcF9oZWFkOyBtY3A7IG1jcCA9IG1jcC0+bmV4dCkgewogICAgICAgIGlmICghbGFiZWxfY29tcGFyZShtY3AtPm9sZF9tb2R1bGUsIG9sZF9tb2R1bGVfbmFtZSkpIHsKCiAgICAgICAgICAgIGlmICggICAgICAgICAgICAgICAgLyogZXhhY3QgbWF0Y2ggKi8KICAgICAgICAgICAgICAgICAgIChtY3AtPnRhZ19sZW4gPT0gMCAmJgogICAgICAgICAgICAgICAgICAgIChtY3AtPnRhZyA9PSBOVUxMIHx8CiAgICAgICAgICAgICAgICAgICAgICFsYWJlbF9jb21wYXJlKG1jcC0+dGFnLCBpZGVudGlmaWVyLT5sYWJlbCkpKSB8fAogICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAqIHByZWZpeCBtYXRjaCAKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgKG1jcC0+dGFnX2xlbiAhPSAwICYmCiAgICAgICAgICAgICAgICAgICAgIXN0cm5jbXAobWNwLT50YWcsIGlkZW50aWZpZXItPmxhYmVsLCBtY3AtPnRhZ19sZW4pKQogICAgICAgICAgICAgICAgKSB7CgogICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykpIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wb3J0aW5nICVzIGZyb20gcmVwbGFjZW1lbnQgbW9kdWxlICVzIGluc3RlYWQgb2YgJXMgKCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyLT5sYWJlbCwgbWNwLT5uZXdfbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9tb2R1bGVfbmFtZSwgRmlsZSk7CgkJfQogICAgICAgICAgICAgICAgKHZvaWQpIG5ldHNubXBfcmVhZF9tb2R1bGUobWNwLT5uZXdfbW9kdWxlKTsKICAgICAgICAgICAgICAgIGlkZW50aWZpZXItPm1vZGlkID0gd2hpY2hfbW9kdWxlKG1jcC0+bmV3X21vZHVsZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsgICAgICAgICAvKiBmaW5pc2hlZCEgKi8KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogSWYgbm8gZXhhY3QgbWF0Y2gsIGxvYWQgZXZlcnl0aGluZyByZWxldmFudAogICAgICovCiAgICByZXR1cm4gcmVhZF9tb2R1bGVfcmVwbGFjZW1lbnRzKG9sZF9tb2R1bGVfbmFtZSk7Cn0KCgovKgogKiAgUmVhZCBpbiB0aGUgbmFtZWQgbW9kdWxlCiAqICAgICAgUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgd2hvbGUgdHJlZQogKiAgICAgIChieSBhbmFsb2d5IHdpdGggJ3JlYWRfbWliJykKICovCnN0YXRpYyBpbnQKcmVhZF9tb2R1bGVfaW50ZXJuYWwoY29uc3QgY2hhciAqbmFtZSkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwogICAgRklMRSAgICAgICAgICAgKmZwOwoKICAgIG5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKCk7CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobXAtPm5hbWUsIG5hbWUpKSB7CiAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpvbGRGaWxlID0gRmlsZTsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG9sZExpbmUgPSBtaWJMaW5lOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgb2xkTW9kdWxlID0gY3VycmVudF9tb2R1bGU7CgogICAgICAgICAgICBpZiAobXAtPm5vX2ltcG9ydHMgIT0gLTEpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIk1vZHVsZSAlcyBhbHJlYWR5IGxvYWRlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKICAgICAgICAgICAgICAgIHJldHVybiBNT0RVTEVfQUxSRUFEWV9MT0FERUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChmcCA9IGZvcGVuKG1wLT5maWxlLCAiciIpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IobXAtPmZpbGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE1PRFVMRV9MT0FEX0ZBSUxFRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBtcC0+bm9faW1wb3J0cyA9IDA7IC8qIE5vdGUgdGhhdCB3ZSd2ZSByZWFkIHRoZSBmaWxlICovCiAgICAgICAgICAgIEZpbGUgPSBtcC0+ZmlsZTsKICAgICAgICAgICAgbWliTGluZSA9IDE7CiAgICAgICAgICAgIGN1cnJlbnRfbW9kdWxlID0gbXAtPm1vZGlkOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQYXJzZSB0aGUgZmlsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGFyc2UoZnAsIE5VTEwpOwogICAgICAgICAgICBmY2xvc2UoZnApOwogICAgICAgICAgICBGaWxlID0gb2xkRmlsZTsKICAgICAgICAgICAgbWliTGluZSA9IG9sZExpbmU7CiAgICAgICAgICAgIGN1cnJlbnRfbW9kdWxlID0gb2xkTW9kdWxlOwogICAgICAgICAgICByZXR1cm4gTU9EVUxFX0xPQURFRF9PSzsKICAgICAgICB9CgogICAgcmV0dXJuIE1PRFVMRV9OT1RfRk9VTkQ7Cn0KCnZvaWQKYWRvcHRfb3JwaGFucyh2b2lkKQp7CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnAsICpvbnA7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CiAgICBpbnQgICAgICAgICAgICAgaSwgYWRvcHRlZCA9IDE7CgogICAgaWYgKCFvcnBoYW5fbm9kZXMpCiAgICAgICAgcmV0dXJuOwogICAgaW5pdF9ub2RlX2hhc2gob3JwaGFuX25vZGVzKTsKICAgIG9ycGhhbl9ub2RlcyA9IE5VTEw7CgogICAgd2hpbGUgKGFkb3B0ZWQpIHsKICAgICAgICBhZG9wdGVkID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkhBU0hTSVpFOyBpKyspCiAgICAgICAgICAgIGlmIChuYnVja2V0c1tpXSkgewogICAgICAgICAgICAgICAgZm9yIChucCA9IG5idWNrZXRzW2ldOyBucCAhPSBOVUxMOyBucCA9IG5wLT5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgdHAgPSBmaW5kX3RyZWVfbm9kZShucC0+cGFyZW50LCAtMSk7CgkJICAgIGlmICh0cCkgewoJCQlkb19zdWJ0cmVlKHRwLCAmbnApOwoJCQlhZG9wdGVkID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICogaWYgZG9fc3VidHJlZSBhZG9wdGVkIHRoZSBlbnRpcmUgYnVja2V0LCBzdG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZihOVUxMID09IG5idWNrZXRzW2ldKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBkb19zdWJ0cmVlIG1heSBtb2RpZnkgbmJ1Y2tldHMsIGFuZCBpZiBucAogICAgICAgICAgICAgICAgICAgICAgICAgKiB3YXMgYWRvcHRlZCwgbnAtPm5leHQgcHJvYmFibHkgaXNuJ3QgYW4gb3JwaGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGFueW1vcmUuIGlmIG5wIGlzIHN0aWxsIGluIHRoZSBidWNrZXQgKGRvX3N1YnRyZWUKICAgICAgICAgICAgICAgICAgICAgICAgICogZGlkbid0IGFkb3B0IGl0KSBrZWVwIG9uIHBsdWdnaW5nLiBvdGhlcndpc2UKICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhcnQgb3ZlciwgYXQgdGhlIHRvcCBvZiB0aGUgYnVja2V0LgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgZm9yKG9ucCA9IG5idWNrZXRzW2ldOyBvbnA7IG9ucCA9IG9ucC0+bmV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9ucCA9PSBucCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBvbnApIHsgLyogbm90IGluIHRoZSBsaXN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucCA9IG5idWNrZXRzW2ldOyAvKiBzdGFydCBvdmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkgICAgfQoJCX0KICAgICAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBSZXBvcnQgb24gb3V0c3RhbmRpbmcgb3JwaGFucwogICAgICogICAgYW5kIGxpbmsgdGhlbSBiYWNrIGludG8gdGhlIG9ycGhhbiBsaXN0CiAgICAgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBOSEFTSFNJWkU7IGkrKykKICAgICAgICBpZiAobmJ1Y2tldHNbaV0pIHsKICAgICAgICAgICAgaWYgKG9ycGhhbl9ub2RlcykKICAgICAgICAgICAgICAgIG9ucCA9IG5wLT5uZXh0ID0gbmJ1Y2tldHNbaV07CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIG9ucCA9IG9ycGhhbl9ub2RlcyA9IG5idWNrZXRzW2ldOwogICAgICAgICAgICBuYnVja2V0c1tpXSA9IE5VTEw7CiAgICAgICAgICAgIHdoaWxlIChvbnApIHsKICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBtb2RidWZbMjU2XTsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBhZG9wdCBPSUQgaW4gJXM6ICVzIDo6PSB7ICVzICVsZCB9XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUob25wLT5tb2RpZCwgbW9kYnVmKSwKICAgICAgICAgICAgICAgICAgICAgICAgIChvbnAtPmxhYmVsID8gb25wLT5sYWJlbCA6ICI8bm8gbGFiZWw+IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAob25wLT5wYXJlbnQgPyBvbnAtPnBhcmVudCA6ICI8bm8gcGFyZW50PiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgb25wLT5zdWJpZCk7CgogICAgICAgICAgICAgICAgbnAgPSBvbnA7CiAgICAgICAgICAgICAgICBvbnAgPSBvbnAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9OT19MRUdBQ1lfREVGSU5JVElPTlMKc3RydWN0IHRyZWUgICAgKgpyZWFkX21vZHVsZShjb25zdCBjaGFyICpuYW1lKQp7CiAgICByZXR1cm4gbmV0c25tcF9yZWFkX21vZHVsZShuYW1lKTsKfQojZW5kaWYKCnN0cnVjdCB0cmVlICAgICoKbmV0c25tcF9yZWFkX21vZHVsZShjb25zdCBjaGFyICpuYW1lKQp7CiAgICBpZiAocmVhZF9tb2R1bGVfaW50ZXJuYWwobmFtZSkgPT0gTU9EVUxFX05PVF9GT1VORCkKICAgICAgICBpZiAoIXJlYWRfbW9kdWxlX3JlcGxhY2VtZW50cyhuYW1lKSkKCSAgICBwcmludF9tb2R1bGVfbm90X2ZvdW5kKG5hbWUpOwogICAgcmV0dXJuIHRyZWVfaGVhZDsKfQoKLyoKICogUHJvdG90eXBlIGRlZmluaXRpb24gCiAqLwp2b2lkICAgICAgICAgICAgdW5sb2FkX21vZHVsZV9ieV9JRChpbnQgbW9kSUQsIHN0cnVjdCB0cmVlICp0cmVlX3RvcCk7Cgp2b2lkCnVubG9hZF9tb2R1bGVfYnlfSUQoaW50IG1vZElELCBzdHJ1Y3QgdHJlZSAqdHJlZV90b3ApCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCwgKm5leHQ7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICBmb3IgKHRwID0gdHJlZV90b3A7IHRwOyB0cCA9IG5leHQpIHsKICAgICAgICAvKgogICAgICAgICAqIEVzc2VudGlhbGx5LCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvZGUgZnJhZ21lbnQ6CiAgICAgICAgICogICAgICBpZiAodHAtPm1vZElEID09IG1vZElEKQogICAgICAgICAqICAgICAgICB0cC0+bnVtYmVyX21vZHVsZXMtLTsKICAgICAgICAgKiBidXQgaGFuZGxlcyBvbmUgdHJlZSBub2RlIGJlaW5nIHBhcnQgb2Ygc2V2ZXJhbCBtb2R1bGVzLAogICAgICAgICAqIGFuZCBwb3NzaWJsZSBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgbW9kdWxlIElELgogICAgICAgICAqLwogICAgICAgIGludCAgICAgICAgICAgICBubW9kID0gdHAtPm51bWJlcl9tb2R1bGVzOwogICAgICAgIGlmIChubW9kID4gMCkgeyAgICAgICAgIC8qIGluIHNvbWUgbW9kdWxlICovCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFJlbW92ZSBhbGwgY29waWVzIG9mIHRoaXMgbW9kdWxlIElECiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgY250ID0gMCwgKnBpMSwgKnBpMiA9IHRwLT5tb2R1bGVfbGlzdDsKICAgICAgICAgICAgZm9yIChpID0gMCwgcGkxID0gcGkyOyBpIDwgbm1vZDsgaSsrLCBwaTIrKykgewogICAgICAgICAgICAgICAgaWYgKCpwaTIgPT0gbW9kSUQpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICBjbnQrKzsKICAgICAgICAgICAgICAgICpwaTErKyA9ICpwaTI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5tb2QgIT0gY250KSB7ICAvKiBpbiB0aGlzIG1vZHVsZSAqLwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGlmICggKG5tb2QgLSBjbnQpID4gMSkKICAgICAgICAgICAgICAgICAqIHByaW50ZigiRHVwIG1vZGlkICVkLCAgJWQgdGltZXMsICclcydcbiIsIHRwLT5tb2RpZCwgKG5tb2QtY250KSwgdHAtPmxhYmVsKTsgZmZsdXNoKHN0ZG91dCk7ID8qIFhYREVCVUcgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHRwLT5udW1iZXJfbW9kdWxlcyA9IGNudDsKICAgICAgICAgICAgICAgIHN3aXRjaCAoY250KSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgdHAtPm1vZHVsZV9saXN0WzBdID0gLTE7ICAgIC8qIE1hcmsgdW51c2VkLCBhbmQgRkFMTCBUSFJPVUdIICovCgogICAgICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgLyogc2F2ZSB0aGUgcmVtYWluaW5nIG1vZHVsZSAqLwogICAgICAgICAgICAgICAgICAgIGlmICgmKHRwLT5tb2RpZCkgIT0gdHAtPm1vZHVsZV9saXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb2RpZCA9IHRwLT5tb2R1bGVfbGlzdFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh0cC0+bW9kdWxlX2xpc3QpOwogICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9kdWxlX2xpc3QgPSAmKHRwLT5tb2RpZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogaWYgdHJlZSBub2RlIGlzIGluIHRoaXMgbW9kdWxlICovCiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogaWYgdHJlZSBub2RlIGlzIGluIHNvbWUgbW9kdWxlIAogICAgICAgICAqLwogICAgICAgIG5leHQgPSB0cC0+bmV4dF9wZWVyOwoKCiAgICAgICAgLyoKICAgICAgICAgKiAgT0sgLSB0aGF0J3MgZGVhbHQgd2l0aCAqdGhpcyogbm9kZS4KICAgICAgICAgKiAgICBOb3cgbGV0J3MgbG9vayBhdCB0aGUgY2hpbGRyZW4uCiAgICAgICAgICogICAgKElzbid0IHJlY3Vyc2lvbiB3b25kZXJmdWwhKQogICAgICAgICAqLwogICAgICAgIGlmICh0cC0+Y2hpbGRfbGlzdCkKICAgICAgICAgICAgdW5sb2FkX21vZHVsZV9ieV9JRChtb2RJRCwgdHAtPmNoaWxkX2xpc3QpOwoKCiAgICAgICAgaWYgKHRwLT5udW1iZXJfbW9kdWxlcyA9PSAwKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFRoaXMgbm9kZSBpc24ndCBuZWVkZWQgYW55IG1vcmUgKGV4Y2VwdCBwZXJoYXBzCiAgICAgICAgICAgICAqIGZvciB0aGUgc2FrZSBvZiB0aGUgY2hpbGRyZW4pIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHRwLT5jaGlsZF9saXN0ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHVubGlua190cmVlKHRwKTsKICAgICAgICAgICAgICAgIGZyZWVfdHJlZSh0cCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcmVlX3BhcnRpYWxfdHJlZSh0cCwgVFJVRSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9OT19MRUdBQ1lfREVGSU5JVElPTlMKaW50CnVubG9hZF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKewogICAgcmV0dXJuIG5ldHNubXBfdW5sb2FkX21vZHVsZShuYW1lKTsKfQojZW5kaWYKCmludApuZXRzbm1wX3VubG9hZF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwogICAgaW50ICAgICAgICAgICAgIG1vZElEID0gLTE7CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobXAtPm5hbWUsIG5hbWUpKSB7CiAgICAgICAgICAgIG1vZElEID0gbXAtPm1vZGlkOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgaWYgKG1vZElEID09IC0xKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVubG9hZC1taWIiLCAiTW9kdWxlICVzIG5vdCBmb3VuZCB0byB1bmxvYWRcbiIsCiAgICAgICAgICAgICAgICAgICAgbmFtZSkpOwogICAgICAgIHJldHVybiBNT0RVTEVfTk9UX0ZPVU5EOwogICAgfQogICAgdW5sb2FkX21vZHVsZV9ieV9JRChtb2RJRCwgdHJlZV9oZWFkKTsKICAgIG1wLT5ub19pbXBvcnRzID0gLTE7ICAgICAgICAvKiBtYXJrIGFzIHVubG9hZGVkICovCiAgICByZXR1cm4gTU9EVUxFX0xPQURFRF9PSzsgICAgLyogV2VsbCwgeW91IGtub3cgd2hhdCBJIG1lYW4hICovCn0KCi8qCiAqIENsZWFyIG1vZHVsZSBtYXAsIHRyZWUgbm9kZXMsIHRleHR1YWwgY29udmVudGlvbiB0YWJsZS4KICovCnZvaWQKdW5sb2FkX2FsbF9taWJzKHZvaWQpCnsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKICAgIHN0cnVjdCBtb2R1bGVfY29tcGF0YWJpbGl0eSAqbWNwOwogICAgc3RydWN0IHRjICAgICAgKnB0YzsKICAgIGludCAgICAgICAgICAgICBpOwoKICAgIGZvciAobWNwID0gbW9kdWxlX21hcF9oZWFkOyBtY3A7IG1jcCA9IG1vZHVsZV9tYXBfaGVhZCkgewogICAgICAgIGlmIChtY3AgPT0gbW9kdWxlX21hcCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgbW9kdWxlX21hcF9oZWFkID0gbWNwLT5uZXh0OwogICAgICAgIGlmIChtY3AtPnRhZykgZnJlZShORVRTTk1QX1JFTU9WRV9DT05TVChjaGFyICosIG1jcC0+dGFnKSk7CiAgICAgICAgZnJlZShORVRTTk1QX1JFTU9WRV9DT05TVChjaGFyICosIG1jcC0+b2xkX21vZHVsZSkpOwogICAgICAgIGZyZWUoTkVUU05NUF9SRU1PVkVfQ09OU1QoY2hhciAqLCBtY3AtPm5ld19tb2R1bGUpKTsKICAgICAgICBmcmVlKG1jcCk7CiAgICB9CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtb2R1bGVfaGVhZCkgewogICAgICAgIHN0cnVjdCBtb2R1bGVfaW1wb3J0ICptaSA9IG1wLT5pbXBvcnRzOwogICAgICAgIGlmIChtaSkgewogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXAtPm5vX2ltcG9ydHM7ICsraSkgewogICAgICAgICAgICAgICAgU05NUF9GUkVFKChtaSArIGkpLT5sYWJlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXAtPm5vX2ltcG9ydHMgPSAwOwogICAgICAgICAgICBpZiAobWkgPT0gcm9vdF9pbXBvcnRzKQogICAgICAgICAgICAgICAgbWVtc2V0KG1pLCAwLCBzaXplb2YoKm1pKSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGZyZWUobWkpOwogICAgICAgIH0KCiAgICAgICAgdW5sb2FkX21vZHVsZV9ieV9JRChtcC0+bW9kaWQsIHRyZWVfaGVhZCk7CiAgICAgICAgbW9kdWxlX2hlYWQgPSBtcC0+bmV4dDsKICAgICAgICBmcmVlKG1wLT5uYW1lKTsKICAgICAgICBmcmVlKG1wLT5maWxlKTsKICAgICAgICBmcmVlKG1wKTsKICAgIH0KICAgIHVubG9hZF9tb2R1bGVfYnlfSUQoLTEsIHRyZWVfaGVhZCk7CiAgICAvKgogICAgICogdHJlZSBub2RlcyBhcmUgY2xlYXJlZCAKICAgICAqLwoKICAgIGZvciAoaSA9IDAsIHB0YyA9IHRjbGlzdDsgaSA8IE1BWFRDOyBpKyssIHB0YysrKSB7CiAgICAgICAgaWYgKHB0Yy0+dHlwZSA9PSAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBmcmVlX2VudW1zKCZwdGMtPmVudW1zKTsKICAgICAgICBmcmVlX3JhbmdlcygmcHRjLT5yYW5nZXMpOwogICAgICAgIGZyZWUocHRjLT5kZXNjcmlwdG9yKTsKICAgICAgICBpZiAocHRjLT5oaW50KQogICAgICAgICAgICBmcmVlKHB0Yy0+aGludCk7CiAgICAgICAgaWYgKHB0Yy0+ZGVzY3JpcHRpb24pCiAgICAgICAgICAgIGZyZWUocHRjLT5kZXNjcmlwdGlvbik7CiAgICB9CiAgICBtZW1zZXQodGNsaXN0LCAwLCBNQVhUQyAqIHNpemVvZihzdHJ1Y3QgdGMpKTsKCiAgICBtZW1zZXQoYnVja2V0cywgMCwgc2l6ZW9mKGJ1Y2tldHMpKTsKICAgIG1lbXNldChuYnVja2V0cywgMCwgc2l6ZW9mKG5idWNrZXRzKSk7CiAgICBtZW1zZXQodGJ1Y2tldHMsIDAsIHNpemVvZih0YnVja2V0cykpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yocm9vdF9pbXBvcnRzKSAvIHNpemVvZihyb290X2ltcG9ydHNbMF0pOyBpKyspIHsKICAgICAgICBTTk1QX0ZSRUUocm9vdF9pbXBvcnRzW2ldLmxhYmVsKTsKICAgIH0KCiAgICBtYXhfbW9kdWxlID0gMDsKICAgIGN1cnJlbnRfbW9kdWxlID0gMDsKICAgIG1vZHVsZV9tYXBfaGVhZCA9IE5VTEw7CiAgICBTTk1QX0ZSRUUobGFzdF9lcnJfbW9kdWxlKTsKfQoKc3RhdGljIHZvaWQKbmV3X21vZHVsZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpmaWxlKQp7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobXAtPm5hbWUsIG5hbWUpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIiAgTW9kdWxlICVzIGFscmVhZHkgbm90ZWRcbiIsIG5hbWUpKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTm90IHRoZSBzYW1lIGZpbGUgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAobGFiZWxfY29tcGFyZShtcC0+ZmlsZSwgZmlsZSkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIiAgICAlcyBpcyBub3cgaW4gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBmaWxlKSk7CiAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBNb2R1bGUgJXMgd2FzIGluICVzIG5vdyBpcyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtcC0+ZmlsZSwgZmlsZSk7CgkJfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBVc2UgdGhlIG5ldyBvbmUgaW4gcHJlZmVyZW5jZSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZnJlZShtcC0+ZmlsZSk7CiAgICAgICAgICAgICAgICBtcC0+ZmlsZSA9IHN0cmR1cChmaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgIC8qCiAgICAgKiBBZGQgdGhpcyBtb2R1bGUgdG8gdGhlIGxpc3QgCiAgICAgKi8KICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIiAgTW9kdWxlICVkICVzIGlzIGluICVzXG4iLCBtYXhfbW9kdWxlLAogICAgICAgICAgICAgICAgbmFtZSwgZmlsZSkpOwogICAgbXAgPSAoc3RydWN0IG1vZHVsZSAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBtb2R1bGUpKTsKICAgIGlmIChtcCA9PSBOVUxMKQogICAgICAgIHJldHVybjsKICAgIG1wLT5uYW1lID0gc3RyZHVwKG5hbWUpOwogICAgbXAtPmZpbGUgPSBzdHJkdXAoZmlsZSk7CiAgICBtcC0+aW1wb3J0cyA9IE5VTEw7CiAgICBtcC0+bm9faW1wb3J0cyA9IC0xOyAgICAgICAgLyogTm90IHlldCBsb2FkZWQgKi8KICAgIG1wLT5tb2RpZCA9IG1heF9tb2R1bGU7CiAgICArK21heF9tb2R1bGU7CgogICAgbXAtPm5leHQgPSBtb2R1bGVfaGVhZDsgICAgIC8qIE9yIGFkZCB0byB0aGUgKmVuZCogb2YgdGhlIGxpc3Q/ICovCiAgICBtb2R1bGVfaGVhZCA9IG1wOwp9CgoKc3RhdGljIHZvaWQKc2Nhbl9vYmpsaXN0KHN0cnVjdCBub2RlICpyb290LCBzdHJ1Y3QgbW9kdWxlICptcCwgc3RydWN0IG9iamdyb3VwICpsaXN0LCBjb25zdCBjaGFyICplcnJvcikKewogICAgaW50ICAgICAgICAgICAgIG9MaW5lID0gbWliTGluZTsKCiAgICB3aGlsZSAobGlzdCkgewogICAgICAgIHN0cnVjdCBvYmpncm91cCAqZ3AgPSBsaXN0OwogICAgICAgIHN0cnVjdCBub2RlICAgICpucDsKICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKICAgICAgICBucCA9IHJvb3Q7CiAgICAgICAgd2hpbGUgKG5wKQogICAgICAgICAgICBpZiAobGFiZWxfY29tcGFyZShucC0+bGFiZWwsIGdwLT5uYW1lKSkKICAgICAgICAgICAgICAgIG5wID0gbnAtPm5leHQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmICghbnApIHsKCSAgICBpbnQgaTsKCSAgICBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCAqbWlwOwoJICAgIC8qIGlmIG5vdCBsb2NhbCwgY2hlY2sgaWYgaXQgd2FzIElNUE9SVGVkICovCgkgICAgZm9yIChpID0gMCwgbWlwID0gbXAtPmltcG9ydHM7IGkgPCBtcC0+bm9faW1wb3J0czsgaSsrLCBtaXArKykKCQlpZiAoc3RyY21wKG1pcC0+bGFiZWwsIGdwLT5uYW1lKSA9PSAwKQoJCSAgICBicmVhazsKCSAgICBpZiAoaSA9PSBtcC0+bm9faW1wb3J0cykgewoJCW1pYkxpbmUgPSBncC0+bGluZTsKCQlwcmludF9lcnJvcihlcnJvciwgZ3AtPm5hbWUsIFFVT1RFU1RSSU5HKTsKCSAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUoZ3AtPm5hbWUpOwogICAgICAgIGZyZWUoZ3ApOwogICAgfQogICAgbWliTGluZSA9IG9MaW5lOwp9CgovKgogKiBQYXJzZXMgYSBtaWIgZmlsZSBhbmQgcmV0dXJucyBhIGxpbmtlZCBsaXN0IG9mIG5vZGVzIGZvdW5kIGluIHRoZSBmaWxlLgogKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZShGSUxFICogZnAsIHN0cnVjdCBub2RlICpyb290KQp7CiNpZmRlZiBURVNUCiAgICBleHRlcm4gdm9pZCAgICAgeG1hbGxvY19zdGF0cyhGSUxFICopOwojZW5kaWYKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgbmFtZVtNQVhUT0tFTisxXTsKICAgIGludCAgICAgICAgICAgICB0eXBlID0gTEFCRUw7CiAgICBpbnQgICAgICAgICAgICAgbGFzdHR5cGUgPSBMQUJFTDsKCiNkZWZpbmUgQkVUV0VFTl9NSUJTICAgICAgICAgIDEKI2RlZmluZSBJTl9NSUIgICAgICAgICAgICAgICAgMgogICAgaW50ICAgICAgICAgICAgIHN0YXRlID0gQkVUV0VFTl9NSUJTOwogICAgc3RydWN0IG5vZGUgICAgKm5wLCAqbm5wOwogICAgc3RydWN0IG9iamdyb3VwICpvbGRncm91cHMgPSBOVUxMLCAqb2xkb2JqZWN0cyA9IE5VTEwsICpvbGRub3RpZnMgPQogICAgICAgIE5VTEw7CgogICAgREVCVUdNU0dUTCgoInBhcnNlLWZpbGUiLCAiUGFyc2luZyBmaWxlOiAgJXMuLi5cbiIsIEZpbGUpKTsKCiAgICBpZiAobGFzdF9lcnJfbW9kdWxlKQogICAgICAgIGZyZWUobGFzdF9lcnJfbW9kdWxlKTsKICAgIGxhc3RfZXJyX21vZHVsZSA9IE5VTEw7CgogICAgbnAgPSByb290OwogICAgaWYgKG5wICE9IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIG5vdyBmaW5kIGVuZCBvZiBjaGFpbiAKICAgICAgICAgKi8KICAgICAgICB3aGlsZSAobnAtPm5leHQpCiAgICAgICAgICAgIG5wID0gbnAtPm5leHQ7CiAgICB9CgogICAgd2hpbGUgKHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgaWYgKGxhc3R0eXBlID09IENPTlRJTlVFKQogICAgICAgICAgICBsYXN0dHlwZSA9IHR5cGU7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0eXBlID0gbGFzdHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CgogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgRU5EOgogICAgICAgICAgICBpZiAoc3RhdGUgIT0gSU5fTUlCKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXJyb3IsIEVORCBiZWZvcmUgc3RhcnQgb2YgTUlCIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBtb2R1bGUgICptcDsKI2lmZGVmIFRFU1QKICAgICAgICAgICAgICAgIHByaW50ZigiXG5Ob2RlcyBmb3IgTW9kdWxlICVzOlxuIiwgbmFtZSk7CiAgICAgICAgICAgICAgICBwcmludF9ub2RlcyhzdGRvdXQsIHJvb3QpOwojZW5kaWYKICAgICAgICAgICAgICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgICAgICAgICAgICAgaWYgKG1wLT5tb2RpZCA9PSBjdXJyZW50X21vZHVsZSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBzY2FuX29iamxpc3Qocm9vdCwgbXAsIG9iamdyb3VwcywgIlVuZGVmaW5lZCBPQkpFQ1QtR1JPVVAiKTsKICAgICAgICAgICAgICAgIHNjYW5fb2JqbGlzdChyb290LCBtcCwgb2JqZWN0cywgIlVuZGVmaW5lZCBPQkpFQ1QiKTsKICAgICAgICAgICAgICAgIHNjYW5fb2JqbGlzdChyb290LCBtcCwgbm90aWZzLCAiVW5kZWZpbmVkIE5PVElGSUNBVElPTiIpOwogICAgICAgICAgICAgICAgb2JqZ3JvdXBzID0gb2xkZ3JvdXBzOwogICAgICAgICAgICAgICAgb2JqZWN0cyA9IG9sZG9iamVjdHM7CiAgICAgICAgICAgICAgICBub3RpZnMgPSBvbGRub3RpZnM7CiAgICAgICAgICAgICAgICBkb19saW5rdXAobXAsIHJvb3QpOwogICAgICAgICAgICAgICAgbnAgPSByb290ID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZSA9IEJFVFdFRU5fTUlCUzsKI2lmZGVmIFRFU1QKICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgICAgICAgICAgLyogeG1hbGxvY19zdGF0cyhzdGRlcnIpOyAqLwoJICAgIH0KI2VuZGlmCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgSU1QT1JUUzoKICAgICAgICAgICAgcGFyc2VfaW1wb3J0cyhmcCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgRVhQT1JUUzoKICAgICAgICAgICAgd2hpbGUgKHR5cGUgIT0gU0VNSSAmJiB0eXBlICE9IEVORE9GRklMRSkKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgTEFCRUw6CiAgICAgICAgY2FzZSBJTlRFR0VSOgogICAgICAgIGNhc2UgSU5URUdFUjMyOgogICAgICAgIGNhc2UgVUlOVEVHRVIzMjoKICAgICAgICBjYXNlIFVOU0lHTkVEMzI6CiAgICAgICAgY2FzZSBDT1VOVEVSOgogICAgICAgIGNhc2UgQ09VTlRFUjY0OgogICAgICAgIGNhc2UgR0FVR0U6CiAgICAgICAgY2FzZSBJUEFERFI6CiAgICAgICAgY2FzZSBORVRBRERSOgogICAgICAgIGNhc2UgTlNBUEFERFJFU1M6CiAgICAgICAgY2FzZSBPQkpTWU5UQVg6CiAgICAgICAgY2FzZSBBUFBTWU5UQVg6CiAgICAgICAgY2FzZSBTSU1QTEVTWU5UQVg6CiAgICAgICAgY2FzZSBPQkpOQU1FOgogICAgICAgIGNhc2UgTk9USUZOQU1FOgogICAgICAgIGNhc2UgS1dfT1BBUVVFOgogICAgICAgIGNhc2UgVElNRVRJQ0tTOgogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVORE9GRklMRToKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgc3RybGNweShuYW1lLCB0b2tlbiwgc2l6ZW9mKG5hbWUpKTsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgbm5wID0gTlVMTDsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gTUFDUk8pIHsKICAgICAgICAgICAgICAgIG5ucCA9IHBhcnNlX21hY3JvKGZwLCBuYW1lKTsKICAgICAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgTUFDUk8iLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5ucCk7IC8qIElHTk9SRSAqLwogICAgICAgICAgICAgICAgbm5wID0gTlVMTDsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBwcmludF9lcnJvcihuYW1lLCAiaXMgYSByZXNlcnZlZCB3b3JkIiwgbGFzdHR5cGUpOwogICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgIC8qIHNlZSBpZiB3ZSBjYW4gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgKi8KICAgICAgICB9CiAgICAgICAgc3RybGNweShuYW1lLCB0b2tlbiwgc2l6ZW9mKG5hbWUpKTsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIG5ucCA9IE5VTEw7CgogICAgICAgIC8qCiAgICAgICAgICogSGFuZGxlIG9ic29sZXRlIG1ldGhvZCB0byBhc3NpZ24gYW4gb2JqZWN0IGlkZW50aWZpZXIgdG8gYQogICAgICAgICAqIG1vZHVsZQogICAgICAgICAqLwogICAgICAgIGlmIChsYXN0dHlwZSA9PSBMQUJFTCAmJiB0eXBlID09IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgIHdoaWxlICh0eXBlICE9IFJJR0hUQlJBQ0tFVCAmJiB0eXBlICE9IEVORE9GRklMRSkKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlID09IEVORE9GRklMRSkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwifVwiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgREVGSU5JVElPTlM6CiAgICAgICAgICAgIGlmIChzdGF0ZSAhPSBCRVRXRUVOX01JQlMpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFcnJvciwgbmVzdGVkIE1JQlMiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlID0gSU5fTUlCOwogICAgICAgICAgICBjdXJyZW50X21vZHVsZSA9IHdoaWNoX21vZHVsZShuYW1lKTsKICAgICAgICAgICAgb2xkZ3JvdXBzID0gb2JqZ3JvdXBzOwogICAgICAgICAgICBvYmpncm91cHMgPSBOVUxMOwogICAgICAgICAgICBvbGRvYmplY3RzID0gb2JqZWN0czsKICAgICAgICAgICAgb2JqZWN0cyA9IE5VTEw7CiAgICAgICAgICAgIG9sZG5vdGlmcyA9IG5vdGlmczsKICAgICAgICAgICAgbm90aWZzID0gTlVMTDsKICAgICAgICAgICAgaWYgKGN1cnJlbnRfbW9kdWxlID09IC0xKSB7CiAgICAgICAgICAgICAgICBuZXdfbW9kdWxlKG5hbWUsIEZpbGUpOwogICAgICAgICAgICAgICAgY3VycmVudF9tb2R1bGUgPSB3aGljaF9tb2R1bGUobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiUGFyc2luZyBNSUI6ICVkICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X21vZHVsZSwgbmFtZSkpOwogICAgICAgICAgICB3aGlsZSAoKHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTikpICE9IEVORE9GRklMRSkKICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEJFR0lOKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE9CSlRZUEU6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX29iamVjdHR5cGUoZnAsIG5hbWUpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgT0JKRUNULVRZUEUiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKR1JPVVA6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX29iamVjdGdyb3VwKGZwLCBuYW1lLCBPQkpFQ1RTLCAmb2JqZWN0cyk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBPQkpFQ1QtR1JPVVAiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTk9USUZHUk9VUDoKICAgICAgICAgICAgbm5wID0gcGFyc2Vfb2JqZWN0Z3JvdXAoZnAsIG5hbWUsIE5PVElGSUNBVElPTlMsICZub3RpZnMpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgTk9USUZJQ0FUSU9OLUdST1VQIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRSQVBUWVBFOgogICAgICAgICAgICBubnAgPSBwYXJzZV90cmFwRGVmaW5pdGlvbihmcCwgbmFtZSk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBUUkFQLVRZUEUiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTk9USUZUWVBFOgogICAgICAgICAgICBubnAgPSBwYXJzZV9ub3RpZmljYXRpb25EZWZpbml0aW9uKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE5PVElGSUNBVElPTi1UWVBFIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENPTVBMSUFOQ0U6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX2NvbXBsaWFuY2UoZnAsIG5hbWUpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgTU9EVUxFLUNPTVBMSUFOQ0UiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQUdFTlRDQVA6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX2NhcGFiaWxpdGllcyhmcCwgbmFtZSk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBBR0VOVC1DQVBBQklMSVRJRVMiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUFDUk86CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX21hY3JvKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE1BQ1JPIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlX25vZGUobm5wKTsgICAgIC8qIElHTk9SRSAqLwogICAgICAgICAgICBubnAgPSBOVUxMOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1PRFVMRUlERU5USVRZOgogICAgICAgICAgICBubnAgPSBwYXJzZV9tb2R1bGVJZGVudGl0eShmcCwgbmFtZSk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBNT0RVTEUtSURFTlRJVFkiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKSURFTlRJVFk6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX29iamVjdGdyb3VwKGZwLCBuYW1lLCBPQkpFQ1RTLCAmb2JqZWN0cyk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBPQkpFQ1QtSURFTlRJVFkiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKRUNUOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBJREVOVElGSUVSKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgSURFTlRJRklFUiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IEVRVUFMUykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiOjo9XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBubnAgPSBwYXJzZV9vYmplY3RpZChmcCwgbmFtZSk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBPQkpFQ1QgSURFTlRJRklFUiIsIE5VTEwsIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFUVVBTFM6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX2FzbnR5cGUoZnAsIG5hbWUsICZ0eXBlLCB0b2tlbik7CiAgICAgICAgICAgIGxhc3R0eXBlID0gQ09OVElOVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRU5ET0ZGSUxFOgogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIG9wZXJhdG9yIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgaWYgKG5ucCkgewogICAgICAgICAgICBpZiAobnApCiAgICAgICAgICAgICAgICBucC0+bmV4dCA9IG5ucDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbnAgPSByb290ID0gbm5wOwogICAgICAgICAgICB3aGlsZSAobnAtPm5leHQpCiAgICAgICAgICAgICAgICBucCA9IG5wLT5uZXh0OwogICAgICAgICAgICBpZiAobnAtPnR5cGUgPT0gVFlQRV9PVEhFUikKICAgICAgICAgICAgICAgIG5wLT50eXBlID0gdHlwZTsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgicGFyc2UtZmlsZSIsICJFbmQgb2YgZmlsZSAoJXMpXG4iLCBGaWxlKSk7CiAgICByZXR1cm4gcm9vdDsKfQoKLyoKICogcmV0dXJuIHplcm8gaWYgY2hhcmFjdGVyIGlzIG5vdCBhIGxhYmVsIGNoYXJhY3Rlci4gCiAqLwpzdGF0aWMgaW50CmlzX2xhYmVsY2hhcihpbnQgaWNoKQp7CiAgICBpZiAoKGlzYWxudW0oaWNoKSkgfHwgKGljaCA9PSAnLScpKQogICAgICAgIHJldHVybiAxOwogICAgaWYgKGljaCA9PSAnXycgJiYgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgICAgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMKSkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovKgogKiBQYXJzZXMgYSB0b2tlbiBmcm9tIHRoZSBmaWxlLiAgVGhlIHR5cGUgb2YgdGhlIHRva2VuIHBhcnNlZCBpcyByZXR1cm5lZCwKICogYW5kIHRoZSB0ZXh0IGlzIHBsYWNlZCBpbiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgdG9rZW4uCiAqIFdhcm5pbmc6IHRoaXMgbWV0aG9kIG1heSByZWN1cnNlLgogKi8Kc3RhdGljIGludApnZXRfdG9rZW4oRklMRSAqIGZwLCBjaGFyICp0b2tlbiwgaW50IG1heHRsZW4pCnsKICAgIHJlZ2lzdGVyIGludCAgICBjaCwgY2hfbmV4dDsKICAgIHJlZ2lzdGVyIGNoYXIgICpjcCA9IHRva2VuOwogICAgcmVnaXN0ZXIgaW50ICAgIGhhc2ggPSAwOwogICAgcmVnaXN0ZXIgc3RydWN0IHRvayAqdHA7CiAgICBpbnQgICAgICAgICAgICAgdG9vX2xvbmcgPSAwOwogICAgZW51bSB7IGJkaWdpdHMsIHhkaWdpdHMsIG90aGVyIH0gc2VlblN5bWJvbHM7CgogICAgLyoKICAgICAqIHNraXAgYWxsIHdoaXRlIHNwYWNlIAogICAgICovCiAgICBkbyB7CiAgICAgICAgY2ggPSBnZXRjKGZwKTsKICAgICAgICBpZiAoY2ggPT0gJ1xuJykKICAgICAgICAgICAgbWliTGluZSsrOwogICAgfQogICAgd2hpbGUgKGlzc3BhY2UoY2gpICYmIGNoICE9IEVPRik7CiAgICAqY3ArKyA9IGNoOwogICAgKmNwID0gJ1wwJzsKICAgIHN3aXRjaCAoY2gpIHsKICAgIGNhc2UgRU9GOgogICAgICAgIHJldHVybiBFTkRPRkZJTEU7CiAgICBjYXNlICciJzoKICAgICAgICByZXR1cm4gcGFyc2VRdW90ZVN0cmluZyhmcCwgdG9rZW4sIG1heHRsZW4pOwogICAgY2FzZSAnXCcnOiAgICAgICAgICAgICAgICAgLyogYmluYXJ5IG9yIGhleCBjb25zdGFudCAqLwogICAgICAgIHNlZW5TeW1ib2xzID0gYmRpZ2l0czsKICAgICAgICB3aGlsZSAoKGNoID0gZ2V0YyhmcCkpICE9IEVPRiAmJiBjaCAhPSAnXCcnKSB7CiAgICAgICAgICAgIHN3aXRjaCAoc2VlblN5bWJvbHMpIHsKICAgICAgICAgICAgY2FzZSBiZGlnaXRzOgogICAgICAgICAgICAgICAgaWYgKGNoID09ICcwJyB8fCBjaCA9PSAnMScpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBzZWVuU3ltYm9scyA9IHhkaWdpdHM7CiAgICAgICAgICAgIGNhc2UgeGRpZ2l0czoKICAgICAgICAgICAgICAgIGlmIChpc3hkaWdpdChjaCkpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBzZWVuU3ltYm9scyA9IG90aGVyOwogICAgICAgICAgICBjYXNlIG90aGVyOgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNwIC0gdG9rZW4gPCBtYXh0bGVuIC0gMikKICAgICAgICAgICAgICAgICpjcCsrID0gY2g7CiAgICAgICAgfQogICAgICAgIGlmIChjaCA9PSAnXCcnKSB7CiAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICB2YWwgPSAwOwogICAgICAgICAgICBjaGFyICAgICAgICAgICAqcnVuID0gdG9rZW4gKyAxOwogICAgICAgICAgICBjaCA9IGdldGMoZnApOwogICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgIGNhc2UgRU9GOgogICAgICAgICAgICAgICAgcmV0dXJuIEVORE9GRklMRTsKICAgICAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgIGNhc2UgJ0InOgogICAgICAgICAgICAgICAgaWYgKHNlZW5TeW1ib2xzID4gYmRpZ2l0cykgewogICAgICAgICAgICAgICAgICAgICpjcCsrID0gJ1wnJzsKICAgICAgICAgICAgICAgICAgICAqY3AgPSAwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChydW4gIT0gY3ApCiAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsICogMiArICpydW4rKyAtICcwJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgICBpZiAoc2VlblN5bWJvbHMgPiB4ZGlnaXRzKSB7CiAgICAgICAgICAgICAgICAgICAgKmNwKysgPSAnXCcnOwogICAgICAgICAgICAgICAgICAgICpjcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExBQkVMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKHJ1biAhPSBjcCkgewogICAgICAgICAgICAgICAgICAgIGNoID0gKnJ1bisrOwogICAgICAgICAgICAgICAgICAgIGlmICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgKiAxNiArIGNoIC0gJzAnOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdhJyA8PSBjaCAmJiBjaCA8PSAnZicpCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCAqIDE2ICsgY2ggLSAnYScgKyAxMDsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnQScgPD0gY2ggJiYgY2ggPD0gJ0YnKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgKiAxNiArIGNoIC0gJ0EnICsgMTA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICpjcCsrID0gJ1wnJzsKICAgICAgICAgICAgICAgICpjcCA9IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gTEFCRUw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3ByaW50Zih0b2tlbiwgIiVsZCIsIHZhbCk7CiAgICAgICAgICAgIHJldHVybiBOVU1CRVI7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgIGNhc2UgJygnOgogICAgICAgIHJldHVybiBMRUZUUEFSRU47CiAgICBjYXNlICcpJzoKICAgICAgICByZXR1cm4gUklHSFRQQVJFTjsKICAgIGNhc2UgJ3snOgogICAgICAgIHJldHVybiBMRUZUQlJBQ0tFVDsKICAgIGNhc2UgJ30nOgogICAgICAgIHJldHVybiBSSUdIVEJSQUNLRVQ7CiAgICBjYXNlICdbJzoKICAgICAgICByZXR1cm4gTEVGVFNRQlJBQ0s7CiAgICBjYXNlICddJzoKICAgICAgICByZXR1cm4gUklHSFRTUUJSQUNLOwogICAgY2FzZSAnOyc6CiAgICAgICAgcmV0dXJuIFNFTUk7CiAgICBjYXNlICcsJzoKICAgICAgICByZXR1cm4gQ09NTUE7CiAgICBjYXNlICd8JzoKICAgICAgICByZXR1cm4gQkFSOwogICAgY2FzZSAnLic6CiAgICAgICAgY2hfbmV4dCA9IGdldGMoZnApOwogICAgICAgIGlmIChjaF9uZXh0ID09ICcuJykKICAgICAgICAgICAgcmV0dXJuIFJBTkdFOwogICAgICAgIHVuZ2V0YyhjaF9uZXh0LCBmcCk7CiAgICAgICAgcmV0dXJuIExBQkVMOwogICAgY2FzZSAnOic6CiAgICAgICAgY2hfbmV4dCA9IGdldGMoZnApOwogICAgICAgIGlmIChjaF9uZXh0ICE9ICc6JykgewogICAgICAgICAgICB1bmdldGMoY2hfbmV4dCwgZnApOwogICAgICAgICAgICByZXR1cm4gTEFCRUw7CiAgICAgICAgfQogICAgICAgIGNoX25leHQgPSBnZXRjKGZwKTsKICAgICAgICBpZiAoY2hfbmV4dCAhPSAnPScpIHsKICAgICAgICAgICAgdW5nZXRjKGNoX25leHQsIGZwKTsKICAgICAgICAgICAgcmV0dXJuIExBQkVMOwogICAgICAgIH0KICAgICAgICByZXR1cm4gRVFVQUxTOwogICAgY2FzZSAnLSc6CiAgICAgICAgY2hfbmV4dCA9IGdldGMoZnApOwogICAgICAgIGlmIChjaF9uZXh0ID09ICctJykgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVHJlYXQgdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIGFzIGEgY29tbWVudC4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHdoaWxlICgoY2hfbmV4dCAhPSBFT0YpICYmIChjaF9uZXh0ICE9ICdcbicpKQogICAgICAgICAgICAgICAgICAgIGNoX25leHQgPSBnZXRjKGZwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBUcmVhdCB0aGUgcmVzdCBvZiB0aGUgbGluZSBvciB1bnRpbCBhbm90aGVyICctLScgYXMgYSBjb21tZW50IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogKHRoaXMgaXMgdGhlICJ0ZWNobmljYWxseSIgY29ycmVjdCB3YXkgdG8gcGFyc2UgY29tbWVudHMpIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjaCA9ICcgJzsKICAgICAgICAgICAgICAgIGNoX25leHQgPSBnZXRjKGZwKTsKICAgICAgICAgICAgICAgIHdoaWxlIChjaF9uZXh0ICE9IEVPRiAmJiBjaF9uZXh0ICE9ICdcbicgJiYKICAgICAgICAgICAgICAgICAgICAgICAoY2ggIT0gJy0nIHx8IGNoX25leHQgIT0gJy0nKSkgewogICAgICAgICAgICAgICAgICAgIGNoID0gY2hfbmV4dDsKICAgICAgICAgICAgICAgICAgICBjaF9uZXh0ID0gZ2V0YyhmcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoX25leHQgPT0gRU9GKQogICAgICAgICAgICAgICAgcmV0dXJuIEVORE9GRklMRTsKICAgICAgICAgICAgaWYgKGNoX25leHQgPT0gJ1xuJykKICAgICAgICAgICAgICAgIG1pYkxpbmUrKzsKICAgICAgICAgICAgcmV0dXJuIGdldF90b2tlbihmcCwgdG9rZW4sIG1heHRsZW4pOwogICAgICAgIH0KICAgICAgICB1bmdldGMoY2hfbmV4dCwgZnApOwoJLyogZmFsbHRocm91Z2ggKi8KICAgIGRlZmF1bHQ6CiAgICAgICAgLyoKICAgICAgICAgKiBBY2N1bXVsYXRlIGNoYXJhY3RlcnMgdW50aWwgZW5kIG9mIHRva2VuIGlzIGZvdW5kLiAgVGhlbiBhdHRlbXB0IHRvCiAgICAgICAgICogbWF0Y2ggdGhpcyB0b2tlbiBhcyBhIHJlc2VydmVkIHdvcmQuICBJZiBhIG1hdGNoIGlzIGZvdW5kLCByZXR1cm4gdGhlCiAgICAgICAgICogdHlwZS4gIEVsc2UgaXQgaXMgYSBsYWJlbC4KICAgICAgICAgKi8KICAgICAgICBpZiAoIWlzX2xhYmVsY2hhcihjaCkpCiAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgICAgICBoYXNoICs9IHRvbG93ZXIoY2gpOwogICAgICBtb3JlOgogICAgICAgIHdoaWxlIChpc19sYWJlbGNoYXIoY2hfbmV4dCA9IGdldGMoZnApKSkgewogICAgICAgICAgICBoYXNoICs9IHRvbG93ZXIoY2hfbmV4dCk7CiAgICAgICAgICAgIGlmIChjcCAtIHRva2VuIDwgbWF4dGxlbiAtIDEpCiAgICAgICAgICAgICAgICAqY3ArKyA9IGNoX25leHQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHRvb19sb25nID0gMTsKICAgICAgICB9CiAgICAgICAgdW5nZXRjKGNoX25leHQsIGZwKTsKICAgICAgICAqY3AgPSAnXDAnOwoKICAgICAgICBpZiAodG9vX2xvbmcpCiAgICAgICAgICAgIHByaW50X2Vycm9yKCJXYXJuaW5nOiB0b2tlbiB0b28gbG9uZyIsIHRva2VuLCBDT05USU5VRSk7CiAgICAgICAgZm9yICh0cCA9IGJ1Y2tldHNbQlVDS0VUKGhhc2gpXTsgdHA7IHRwID0gdHAtPm5leHQpIHsKICAgICAgICAgICAgaWYgKCh0cC0+aGFzaCA9PSBoYXNoKSAmJiAoIWxhYmVsX2NvbXBhcmUodHAtPm5hbWUsIHRva2VuKSkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRwKSB7CiAgICAgICAgICAgIGlmICh0cC0+dG9rZW4gIT0gQ09OVElOVUUpCiAgICAgICAgICAgICAgICByZXR1cm4gKHRwLT50b2tlbik7CiAgICAgICAgICAgIHdoaWxlIChpc3NwYWNlKChjaF9uZXh0ID0gZ2V0YyhmcCkpKSkKICAgICAgICAgICAgICAgIGlmIChjaF9uZXh0ID09ICdcbicpCiAgICAgICAgICAgICAgICAgICAgbWliTGluZSsrOwogICAgICAgICAgICBpZiAoY2hfbmV4dCA9PSBFT0YpCiAgICAgICAgICAgICAgICByZXR1cm4gRU5ET0ZGSUxFOwogICAgICAgICAgICBpZiAoaXNhbG51bShjaF9uZXh0KSkgewogICAgICAgICAgICAgICAgKmNwKysgPSBjaF9uZXh0OwogICAgICAgICAgICAgICAgaGFzaCArPSB0b2xvd2VyKGNoX25leHQpOwogICAgICAgICAgICAgICAgZ290byBtb3JlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlblswXSA9PSAnLScgfHwgaXNkaWdpdCh0b2tlblswXSkpIHsKICAgICAgICAgICAgZm9yIChjcCA9IHRva2VuICsgMTsgKmNwOyBjcCsrKQogICAgICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KCpjcCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExBQkVMOwogICAgICAgICAgICByZXR1cm4gTlVNQkVSOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTEFCRUw7CiAgICB9Cn0KCmludApzbm1wX2dldF90b2tlbihGSUxFICogZnAsIGNoYXIgKnRva2VuLCBpbnQgbWF4dGxlbikKewogICAgcmV0dXJuIGdldF90b2tlbihmcCwgdG9rZW4sIG1heHRsZW4pOwp9CgppbnQKYWRkX21pYmZpbGUoY29uc3QgY2hhciogdG1wc3RyLCBjb25zdCBjaGFyKiBkX25hbWUsIEZJTEUgKmlwICkKewogICAgRklMRSAgICAgICAgICAgKmZwOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXSwgdG9rZW4yW01BWFRPS0VOXTsKCiAgICAvKgogICAgICogd2hpY2ggbW9kdWxlIGlzIHRoaXMgCiAgICAgKi8KICAgIGlmICgoZnAgPSBmb3Blbih0bXBzdHIsICJyIikpID09IE5VTEwpIHsKICAgICAgICBzbm1wX2xvZ19wZXJyb3IodG1wc3RyKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIkNoZWNraW5nIGZpbGU6ICVzLi4uXG4iLAogICAgICAgICAgICAgICAgdG1wc3RyKSk7CiAgICBtaWJMaW5lID0gMTsKICAgIEZpbGUgPSB0bXBzdHI7CiAgICBpZiAoZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pICE9IExBQkVMKSB7CgkgICAgZmNsb3NlKGZwKTsKCSAgICByZXR1cm4gMTsKICAgIH0KICAgIC8qCiAgICAgKiBzaW1wbGUgdGVzdCBmb3IgdGhpcyBiZWluZyBhIE1JQiAKICAgICAqLwogICAgaWYgKGdldF90b2tlbihmcCwgdG9rZW4yLCBNQVhUT0tFTikgPT0gREVGSU5JVElPTlMpIHsKICAgICAgICBuZXdfbW9kdWxlKHRva2VuLCB0bXBzdHIpOwogICAgICAgIGlmIChpcCkKICAgICAgICAgICAgZnByaW50ZihpcCwgIiVzICVzXG4iLCB0b2tlbiwgZF9uYW1lKTsKICAgICAgICBmY2xvc2UoZnApOwogICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIHsKICAgICAgICBmY2xvc2UoZnApOwogICAgICAgIHJldHVybiAxOwogICAgfQp9CgovKiBGb3IgV2luMzIgcGxhdGZvcm1zLCB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IG1haW50YWluIGEgbGFzdCBtb2RpZmljYXRpb24KICogZGF0ZSB0aGF0IHdlIGNhbiBjb21wYXJlIHdpdGggdGhlIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSAuaW5kZXggZmlsZS4KICogVGhlcmVmb3JlIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoZXRoZXIgYW55IC5pbmRleCBmaWxlIGlzIHZhbGlkLgogKiBUaGlzIGlzIHRoZSByZWFzb24gZm9yIHRoZSAjaWYgIShkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKGN5Z3dpbikpCiAqIGluIHRoZSBhZGRfbWliZGlyIGZ1bmN0aW9uCiAqLwppbnQKYWRkX21pYmRpcihjb25zdCBjaGFyICpkaXJuYW1lKQp7CiAgICBGSUxFICAgICAgICAgICAqaXA7CiAgICBESVIgICAgICAgICAgICAqZGlyLCAqZGlyMjsKICAgIGNvbnN0IGNoYXIgICAgICpvbGRGaWxlID0gRmlsZTsKICAgIHN0cnVjdCBkaXJlbnQgICpmaWxlOwogICAgY2hhciAgICAgICAgICAgIHRtcHN0clszMDBdOwogICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsKICAgIGludCAgICAgICAgICAgICBmbmFtZV9sZW4gPSAwOwojaWYgIShkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKGN5Z3dpbikpCiAgICBjaGFyICAgICAgICAgICAqdG9rZW47CiAgICBjaGFyIHNwYWNlOwogICAgY2hhciBuZXdsaW5lOwogICAgc3RydWN0IHN0YXQgICAgIGRpcl9zdGF0LCBpZHhfc3RhdDsKICAgIGNoYXIgICAgICAgICAgICB0bXBzdHIxWzMwMF07CiNlbmRpZgoKICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIlNjYW5uaW5nIGRpcmVjdG9yeSAlc1xuIiwgZGlybmFtZSkpOwojaWYgIShkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKGN5Z3dpbikpCiAgICB0b2tlbiA9IG5ldHNubXBfbWliaW5kZXhfbG9va3VwKCBkaXJuYW1lICk7CiAgICBpZiAodG9rZW4gJiYgc3RhdCh0b2tlbiwgJmlkeF9zdGF0KSA9PSAwICYmIHN0YXQoZGlybmFtZSwgJmRpcl9zdGF0KSA9PSAwKSB7CiAgICAgICAgaWYgKGRpcl9zdGF0LnN0X210aW1lIDwgaWR4X3N0YXQuc3RfbXRpbWUpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiVGhlIGluZGV4IGlzIGdvb2RcbiIpKTsKICAgICAgICAgICAgaWYgKChpcCA9IGZvcGVuKHRva2VuLCAiciIpKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBmZ2V0cyh0bXBzdHIsIHNpemVvZih0bXBzdHIpLCBpcCk7IC8qIFNraXAgZGlyIGxpbmUgKi8KICAgICAgICAgICAgICAgIHdoaWxlIChmc2NhbmYoaXAsICIlMTI3cyVjJTI5OXMlYyIsIHRva2VuLCAmc3BhY2UsIHRtcHN0ciwKCQkgICAgJm5ld2xpbmUpID09IDQpIHsKCgkJICAgIC8qCgkJICAgICAqIElmIGFuIG92ZXJmbG93IG9mIHRoZSB0b2tlbiBvciB0bXBzdHIgYnVmZmVycyBoYXMgYmVlbgoJCSAgICAgKiBmb3VuZCBsb2cgYSBtZXNzYWdlIGFuZCBicmVhayBvdXQgb2YgdGhlIHdoaWxlIGxvb3AsCgkJICAgICAqIHRodXMgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgdG9rZW5zIHdpbGwgYmUgaWdub3JlZC4KCQkgICAgICovCgkJICAgIGlmIChzcGFjZSAhPSAnICcgfHwgbmV3bGluZSAhPSAnXG4nKSB7CgkJCXNubXBfbG9nKExPR19FUlIsCgkJCSAgICAiYWRkX21pYmRpcjogc3RyaW5ncyBzY2FubmVkIGluIGZyb20gJXMvJXMgIiBcCgkJCSAgICAiYXJlIHRvbyBsYXJnZS4gIGNvdW50ID0gJWRcbiAiLCBkaXJuYW1lLAoJCQkgICAgIi5pbmRleCIsIGNvdW50KTsKCQkJICAgIGJyZWFrOwoJCSAgICB9CgkJICAgCgkJICAgIHNucHJpbnRmKHRtcHN0cjEsIHNpemVvZih0bXBzdHIxKSwgIiVzLyVzIiwgZGlybmFtZSwgdG1wc3RyKTsKICAgICAgICAgICAgICAgICAgICB0bXBzdHIxWyBzaXplb2YodG1wc3RyMSktMSBdID0gMDsKICAgICAgICAgICAgICAgICAgICBuZXdfbW9kdWxlKHRva2VuLCB0bXBzdHIxKTsKICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmNsb3NlKGlwKTsKICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJDYW4ndCByZWFkIGluZGV4XG4iKSk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIkluZGV4IG91dGRhdGVkXG4iKSk7CiAgICB9IGVsc2UKICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJObyBpbmRleFxuIikpOwojZW5kaWYKCiAgICBpZiAoKGRpciA9IG9wZW5kaXIoZGlybmFtZSkpKSB7CiAgICAgICAgaXAgPSBuZXRzbm1wX21pYmluZGV4X25ldyggZGlybmFtZSApOwogICAgICAgIHdoaWxlICgoZmlsZSA9IHJlYWRkaXIoZGlyKSkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogT25seSBwYXJzZSBmaWxlIG5hbWVzIHRoYXQgZG9uJ3QgYmVnaW4gd2l0aCBhICcuJyAKICAgICAgICAgICAgICogQWxzbyBza2lwIGZpbGVzIGVuZGluZyBpbiAnficsIG9yIHN0YXJ0aW5nL2VuZGluZwogICAgICAgICAgICAgKiB3aXRoICcjJyB3aGljaCBhcmUgdHlwaWNhbGx5IGVkaXRvciBiYWNrdXAgZmlsZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoZmlsZS0+ZF9uYW1lICE9IE5VTEwpIHsKICAgICAgICAgICAgICBmbmFtZV9sZW4gPSBzdHJsZW4oIGZpbGUtPmRfbmFtZSApOwogICAgICAgICAgICAgIGlmIChmbmFtZV9sZW4gPiAwICYmIGZpbGUtPmRfbmFtZVswXSAhPSAnLicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZS0+ZF9uYW1lWzBdICE9ICcjJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGUtPmRfbmFtZVtmbmFtZV9sZW4tMV0gIT0gJyMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZS0+ZF9uYW1lW2ZuYW1lX2xlbi0xXSAhPSAnficpIHsKICAgICAgICAgICAgICAgIHNucHJpbnRmKHRtcHN0ciwgc2l6ZW9mKHRtcHN0ciksICIlcy8lcyIsIGRpcm5hbWUsIGZpbGUtPmRfbmFtZSk7CiAgICAgICAgICAgICAgICB0bXBzdHJbIHNpemVvZih0bXBzdHIpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoKGRpcjIgPSBvcGVuZGlyKHRtcHN0cikpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBmaWxlIGlzIGEgZGlyZWN0b3J5LCBkb24ndCByZWFkIGl0IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGNsb3NlZGlyKGRpcjIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICFhZGRfbWliZmlsZSggdG1wc3RyLCBmaWxlLT5kX25hbWUsIGlwICkpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEZpbGUgPSBvbGRGaWxlOwogICAgICAgIGNsb3NlZGlyKGRpcik7CiAgICAgICAgaWYgKGlwKQogICAgICAgICAgICBmY2xvc2UoaXApOwogICAgICAgIHJldHVybiAoY291bnQpOwogICAgfQogICAgZWxzZQogICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwiY2Fubm90IG9wZW4gTUlCIGRpcmVjdG9yeSAlc1xuIiwgZGlybmFtZSkpOwoKICAgIHJldHVybiAoLTEpOwp9CgoKLyoKICogUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgd2hvbGUgdHJlZQogKiAgIChmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkpCiAqLwpzdHJ1Y3QgdHJlZSAgICAqCnJlYWRfbWliKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQp7CiAgICBGSUxFICAgICAgICAgICAqZnA7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwoKICAgIGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CiAgICBpZiAoZnAgPT0gTlVMTCkgewogICAgICAgIHNubXBfbG9nX3BlcnJvcihmaWxlbmFtZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBtaWJMaW5lID0gMTsKICAgIEZpbGUgPSBmaWxlbmFtZTsKICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIlBhcnNpbmcgZmlsZTogJXMuLi5cbiIsIGZpbGVuYW1lKSk7CiAgICBpZiAoZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pICE9IExBQkVMKSB7CgkgICAgc25tcF9sb2coTE9HX0VSUiwgIkZhaWxlZCB0byBwYXJzZSBNSUIgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwoJICAgIGZjbG9zZShmcCk7CgkgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBmY2xvc2UoZnApOwogICAgbmV3X21vZHVsZSh0b2tlbiwgZmlsZW5hbWUpOwogICAgKHZvaWQpIG5ldHNubXBfcmVhZF9tb2R1bGUodG9rZW4pOwoKICAgIHJldHVybiB0cmVlX2hlYWQ7Cn0KCgpzdHJ1Y3QgdHJlZSAgICAqCnJlYWRfYWxsX21pYnModm9pZCkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgaWYgKG1wLT5ub19pbXBvcnRzID09IC0xKQogICAgICAgICAgICBuZXRzbm1wX3JlYWRfbW9kdWxlKG1wLT5uYW1lKTsKICAgIGFkb3B0X29ycGhhbnMoKTsKCiAgICByZXR1cm4gdHJlZV9oZWFkOwp9CgoKI2lmZGVmIFRFU1QKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgaW50ICAgICAgICAgICAgIGk7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CiAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MsIDIpOwoKICAgIG5ldHNubXBfaW5pdF9taWIoKTsKCiAgICBpZiAoYXJnYyA9PSAxKQogICAgICAgICh2b2lkKSByZWFkX2FsbF9taWJzKCk7CiAgICBlbHNlCiAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKICAgICAgICAgICAgcmVhZF9taWIoYXJndltpXSk7CgogICAgZm9yICh0cCA9IHRyZWVfaGVhZDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikKICAgICAgICBwcmludF9zdWJ0cmVlKHN0ZG91dCwgdHAsIDApOwogICAgZnJlZV90cmVlKHRyZWVfaGVhZCk7CgogICAgcmV0dXJuIDA7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBURVNUICovCgpzdGF0aWMgaW50CnBhcnNlUXVvdGVTdHJpbmcoRklMRSAqIGZwLCBjaGFyICp0b2tlbiwgaW50IG1heHRsZW4pCnsKICAgIHJlZ2lzdGVyIGludCAgICBjaDsKICAgIGludCAgICAgICAgICAgICBjb3VudCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgdG9vX2xvbmcgPSAwOwogICAgY2hhciAgICAgICAgICAgKnRva2VuX3N0YXJ0ID0gdG9rZW47CgogICAgZm9yIChjaCA9IGdldGMoZnApOyBjaCAhPSBFT0Y7IGNoID0gZ2V0YyhmcCkpIHsKICAgICAgICBpZiAoY2ggPT0gJ1xyJykKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaWYgKGNoID09ICdcbicpIHsKICAgICAgICAgICAgbWliTGluZSsrOwogICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyInKSB7CiAgICAgICAgICAgICp0b2tlbiA9ICdcMCc7CiAgICAgICAgICAgIGlmICh0b29fbG9uZyAmJiBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpID4gMSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHNob3cgc2hvcnQgZm9ybSBmb3IgYnJldml0eSBzYWtlIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgY2hfc2F2ZSA9ICoodG9rZW5fc3RhcnQgKyA1MCk7CiAgICAgICAgICAgICAgICAqKHRva2VuX3N0YXJ0ICsgNTApID0gJ1wwJzsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJXYXJuaW5nOiBzdHJpbmcgdG9vIGxvbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5fc3RhcnQsIFFVT1RFU1RSSU5HKTsKICAgICAgICAgICAgICAgICoodG9rZW5fc3RhcnQgKyA1MCkgPSBjaF9zYXZlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBRVU9URVNUUklORzsKICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICAgKiBtYXhpbXVtIGRlc2NyaXB0aW9uIGxlbmd0aCBjaGVjay4gIElmIGdyZWF0ZXIsIGtlZXAgcGFyc2luZwogICAgICAgICAqIGJ1dCB0cnVuY2F0ZSB0aGUgc3RyaW5nIAogICAgICAgICAqLwogICAgICAgIGlmICgrK2NvdW50IDwgbWF4dGxlbikKICAgICAgICAgICAgKnRva2VuKysgPSBjaDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRvb19sb25nID0gMTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLyoKICogc3RydWN0IGluZGV4X2xpc3QgKgogKiBnZXRJbmRleGVzKEZJTEUgKmZwKToKICogICBUaGlzIHJvdXRpbmUgcGFyc2VzIGEgc3RyaW5nIGxpa2UgIHsgYmxhaCBibGFoIGJsYWggfSBhbmQgcmV0dXJucyBhCiAqICAgbGlzdCBvZiB0aGUgc3RyaW5ncyBlbmNsb3NlZCB3aXRoaW4gaXQuCiAqCiAqLwpzdGF0aWMgc3RydWN0IGluZGV4X2xpc3QgKgpnZXRJbmRleGVzKEZJTEUgKiBmcCwgc3RydWN0IGluZGV4X2xpc3QgKipyZXRwKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgbmV4dElzSW1wbGllZCA9IDA7CgogICAgc3RydWN0IGluZGV4X2xpc3QgKm15bGlzdCA9IE5VTEw7CiAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqKm15cHAgPSAmbXlsaXN0OwoKICAgIGZyZWVfaW5kZXhlcyhyZXRwKTsKCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwoKICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIHdoaWxlICh0eXBlICE9IFJJR0hUQlJBQ0tFVCAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIGlmICgodHlwZSA9PSBMQUJFTCkgfHwgKHR5cGUgJiBTWU5UQVhfTUFTSykpIHsKICAgICAgICAgICAgKm15cHAgPQogICAgICAgICAgICAgICAgKHN0cnVjdCBpbmRleF9saXN0ICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGluZGV4X2xpc3QpKTsKICAgICAgICAgICAgaWYgKCpteXBwKSB7CiAgICAgICAgICAgICAgICAoKm15cHApLT5pbGFiZWwgPSBzdHJkdXAodG9rZW4pOwogICAgICAgICAgICAgICAgKCpteXBwKS0+aXNpbXBsaWVkID0gbmV4dElzSW1wbGllZDsKICAgICAgICAgICAgICAgIG15cHAgPSAmKCpteXBwKS0+bmV4dDsKICAgICAgICAgICAgICAgIG5leHRJc0ltcGxpZWQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IElNUExJRUQpIHsKICAgICAgICAgICAgbmV4dElzSW1wbGllZCA9IDE7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CgogICAgKnJldHAgPSBteWxpc3Q7CiAgICByZXR1cm4gbXlsaXN0Owp9CgpzdGF0aWMgc3RydWN0IHZhcmJpbmRfbGlzdCAqCmdldFZhcmJpbmRzKEZJTEUgKiBmcCwgc3RydWN0IHZhcmJpbmRfbGlzdCAqKnJldHApCnsKICAgIGludCAgICAgICAgICAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKCiAgICBzdHJ1Y3QgdmFyYmluZF9saXN0ICpteWxpc3QgPSBOVUxMOwogICAgc3RydWN0IHZhcmJpbmRfbGlzdCAqKm15cHAgPSAmbXlsaXN0OwoKICAgIGZyZWVfdmFyYmluZHMocmV0cCk7CgogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKCiAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB3aGlsZSAodHlwZSAhPSBSSUdIVEJSQUNLRVQgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICBpZiAoKHR5cGUgPT0gTEFCRUwpIHx8ICh0eXBlICYgU1lOVEFYX01BU0spKSB7CiAgICAgICAgICAgICpteXBwID0KICAgICAgICAgICAgICAgIChzdHJ1Y3QgdmFyYmluZF9saXN0ICopIGNhbGxvYygxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyYmluZF9saXN0KSk7CiAgICAgICAgICAgIGlmICgqbXlwcCkgewogICAgICAgICAgICAgICAgKCpteXBwKS0+dmJsYWJlbCA9IHN0cmR1cCh0b2tlbik7CiAgICAgICAgICAgICAgICBteXBwID0gJigqbXlwcCktPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIH0KCiAgICAqcmV0cCA9IG15bGlzdDsKICAgIHJldHVybiBteWxpc3Q7Cn0KCnN0YXRpYyB2b2lkCmZyZWVfaW5kZXhlcyhzdHJ1Y3QgaW5kZXhfbGlzdCAqKnNwcCkKewogICAgaWYgKHNwcCAmJiAqc3BwKSB7CiAgICAgICAgc3RydWN0IGluZGV4X2xpc3QgKnBwLCAqbnBwOwoKICAgICAgICBwcCA9ICpzcHA7CiAgICAgICAgKnNwcCA9IE5VTEw7CgogICAgICAgIHdoaWxlIChwcCkgewogICAgICAgICAgICBucHAgPSBwcC0+bmV4dDsKICAgICAgICAgICAgaWYgKHBwLT5pbGFiZWwpCiAgICAgICAgICAgICAgICBmcmVlKHBwLT5pbGFiZWwpOwogICAgICAgICAgICBmcmVlKHBwKTsKICAgICAgICAgICAgcHAgPSBucHA7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZApmcmVlX3ZhcmJpbmRzKHN0cnVjdCB2YXJiaW5kX2xpc3QgKipzcHApCnsKICAgIGlmIChzcHAgJiYgKnNwcCkgewogICAgICAgIHN0cnVjdCB2YXJiaW5kX2xpc3QgKnBwLCAqbnBwOwoKICAgICAgICBwcCA9ICpzcHA7CiAgICAgICAgKnNwcCA9IE5VTEw7CgogICAgICAgIHdoaWxlIChwcCkgewogICAgICAgICAgICBucHAgPSBwcC0+bmV4dDsKICAgICAgICAgICAgaWYgKHBwLT52YmxhYmVsKQogICAgICAgICAgICAgICAgZnJlZShwcC0+dmJsYWJlbCk7CiAgICAgICAgICAgIGZyZWUocHApOwogICAgICAgICAgICBwcCA9IG5wcDsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkCmZyZWVfcmFuZ2VzKHN0cnVjdCByYW5nZV9saXN0ICoqc3BwKQp7CiAgICBpZiAoc3BwICYmICpzcHApIHsKICAgICAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcHAsICpucHA7CgogICAgICAgIHBwID0gKnNwcDsKICAgICAgICAqc3BwID0gTlVMTDsKCiAgICAgICAgd2hpbGUgKHBwKSB7CiAgICAgICAgICAgIG5wcCA9IHBwLT5uZXh0OwogICAgICAgICAgICBmcmVlKHBwKTsKICAgICAgICAgICAgcHAgPSBucHA7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZApmcmVlX2VudW1zKHN0cnVjdCBlbnVtX2xpc3QgKipzcHApCnsKICAgIGlmIChzcHAgJiYgKnNwcCkgewogICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKnBwLCAqbnBwOwoKICAgICAgICBwcCA9ICpzcHA7CiAgICAgICAgKnNwcCA9IE5VTEw7CgogICAgICAgIHdoaWxlIChwcCkgewogICAgICAgICAgICBucHAgPSBwcC0+bmV4dDsKICAgICAgICAgICAgaWYgKHBwLT5sYWJlbCkKICAgICAgICAgICAgICAgIGZyZWUocHAtPmxhYmVsKTsKICAgICAgICAgICAgZnJlZShwcCk7CiAgICAgICAgICAgIHBwID0gbnBwOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHN0cnVjdCBlbnVtX2xpc3QgKgpjb3B5X2VudW1zKHN0cnVjdCBlbnVtX2xpc3QgKnNwKQp7CiAgICBzdHJ1Y3QgZW51bV9saXN0ICp4cCA9IE5VTEwsICoqc3BwID0gJnhwOwoKICAgIHdoaWxlIChzcCkgewogICAgICAgICpzcHAgPSAoc3RydWN0IGVudW1fbGlzdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBlbnVtX2xpc3QpKTsKICAgICAgICBpZiAoISpzcHApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICgqc3BwKS0+bGFiZWwgPSBzdHJkdXAoc3AtPmxhYmVsKTsKICAgICAgICAoKnNwcCktPnZhbHVlID0gc3AtPnZhbHVlOwogICAgICAgIHNwcCA9ICYoKnNwcCktPm5leHQ7CiAgICAgICAgc3AgPSBzcC0+bmV4dDsKICAgIH0KICAgIHJldHVybiAoeHApOwp9CgpzdGF0aWMgc3RydWN0IHJhbmdlX2xpc3QgKgpjb3B5X3JhbmdlcyhzdHJ1Y3QgcmFuZ2VfbGlzdCAqc3ApCnsKICAgIHN0cnVjdCByYW5nZV9saXN0ICp4cCA9IE5VTEwsICoqc3BwID0gJnhwOwoKICAgIHdoaWxlIChzcCkgewogICAgICAgICpzcHAgPSAoc3RydWN0IHJhbmdlX2xpc3QgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcmFuZ2VfbGlzdCkpOwogICAgICAgIGlmICghKnNwcCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgKCpzcHApLT5sb3cgPSBzcC0+bG93OwogICAgICAgICgqc3BwKS0+aGlnaCA9IHNwLT5oaWdoOwogICAgICAgIHNwcCA9ICYoKnNwcCktPm5leHQ7CiAgICAgICAgc3AgPSBzcC0+bmV4dDsKICAgIH0KICAgIHJldHVybiAoeHApOwp9CgovKgogKiBUaGlzIHJvdXRpbmUgcGFyc2VzIGEgc3RyaW5nIGxpa2UgIHsgYmxhaCBibGFoIGJsYWggfSBhbmQgcmV0dXJucyBPQkpJRCBpZgogKiBpdCBpcyB3ZWxsIGZvcm1lZCwgYW5kIE5VTEwgaWYgbm90LgogKi8Kc3RhdGljIGludAp0b3NzT2JqZWN0SWRlbnRpZmllcihGSUxFICogZnApCnsKICAgIGludCAgICAgICAgICAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGludCAgICAgICAgICAgICBicmFja2V0Y291bnQgPSAxOwoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CgogICAgaWYgKHR5cGUgIT0gTEVGVEJSQUNLRVQpCiAgICAgICAgcmV0dXJuIDA7CiAgICB3aGlsZSAoKHR5cGUgIT0gUklHSFRCUkFDS0VUIHx8IGJyYWNrZXRjb3VudCA+IDApICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSA9PSBMRUZUQlJBQ0tFVCkKICAgICAgICAgICAgYnJhY2tldGNvdW50Kys7CiAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBSSUdIVEJSQUNLRVQpCiAgICAgICAgICAgIGJyYWNrZXRjb3VudC0tOwogICAgfQoKICAgIGlmICh0eXBlID09IFJJR0hUQlJBQ0tFVCkKICAgICAgICByZXR1cm4gT0JKSUQ7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIDA7Cn0KCi8qIEZpbmQgbm9kZSBpbiBhbnkgTUlCIG1vZHVsZQogICBVc2VkIGJ5IFBlcmwgbW9kdWxlcwkJKi8Kc3RydWN0IHRyZWUgICAgKgpmaW5kX25vZGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHRyZWUgKnN1YnRyZWUpCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW51c2VkICovCiAgICByZXR1cm4gKGZpbmRfdHJlZV9ub2RlKG5hbWUsIC0xKSk7Cn0KCi8qIEZpbmQgbm9kZSBpbiBzcGVjaWZpYyBNSUIgbW9kdWxlCiAgIFVzZWQgYnkgUGVybCBtb2R1bGVzCQkqLwpzdHJ1Y3QgdHJlZSAgICAqCmZpbmRfbm9kZTIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbW9kdWxlKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIGludCBtb2RpZCA9IC0xOwogIGlmIChtb2R1bGUpIHsKICAgIG1vZGlkID0gd2hpY2hfbW9kdWxlKG1vZHVsZSk7CiAgfQogIGlmIChtb2RpZCA9PSAtMSkKICB7CiAgICByZXR1cm4gKE5VTEwpOwogIH0KICByZXR1cm4gKGZpbmRfdHJlZV9ub2RlKG5hbWUsIG1vZGlkKSk7Cn0KCnN0cnVjdCBtb2R1bGUgICoKZmluZF9tb2R1bGUoaW50IG1pZCkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXAgIT0gTlVMTDsgbXAgPSBtcC0+bmV4dCkgewogICAgICAgIGlmIChtcC0+bW9kaWQgPT0gbWlkKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBtcDsKfQoKCnN0YXRpYyBjaGFyICAgICBsZWF2ZV9pbmRlbnRbMjU2XTsKc3RhdGljIGludCAgICAgIGxlYXZlX3dhc19zaW1wbGU7CgpzdGF0aWMgdm9pZApwcmludF9taWJfbGVhdmVzKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHAsIGludCB3aWR0aCkKewogICAgc3RydWN0IHRyZWUgICAgKm50cDsKICAgIGNoYXIgICAgICAgICAgICppcCA9IGxlYXZlX2luZGVudCArIHN0cmxlbihsZWF2ZV9pbmRlbnQpIC0gMTsKICAgIGNoYXIgICAgICAgICAgICBsYXN0X2lwY2ggPSAqaXA7CgogICAgKmlwID0gJysnOwogICAgaWYgKHRwLT50eXBlID09IFRZUEVfT1RIRVIgfHwgdHAtPnR5cGUgPiBUWVBFX1NJTVBMRV9MQVNUKSB7CiAgICAgICAgZnByaW50ZihmLCAiJXMtLSVzKCVsZClcbiIsIGxlYXZlX2luZGVudCwgdHAtPmxhYmVsLCB0cC0+c3ViaWQpOwogICAgICAgIGlmICh0cC0+aW5kZXhlcykgewogICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqeHAgPSB0cC0+aW5kZXhlczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMSwgY3BvcyA9IDAsIGxlbiwgY21heCA9CiAgICAgICAgICAgICAgICB3aWR0aCAtIHN0cmxlbihsZWF2ZV9pbmRlbnQpIC0gMTI7CiAgICAgICAgICAgICppcCA9IGxhc3RfaXBjaDsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgIHwgIEluZGV4OiAiLCBsZWF2ZV9pbmRlbnQpOwogICAgICAgICAgICB3aGlsZSAoeHApIHsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiLCAiKTsKICAgICAgICAgICAgICAgIGNwb3MgKz0gKGxlbiA9IHN0cmxlbih4cC0+aWxhYmVsKSArIDIpOwogICAgICAgICAgICAgICAgaWYgKGNwb3MgPiBjbWF4KSB7CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlcyAgfCAgICAgICAgICIsIGxlYXZlX2luZGVudCk7CiAgICAgICAgICAgICAgICAgICAgY3BvcyA9IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiVzIiwgeHAtPmlsYWJlbCk7CiAgICAgICAgICAgICAgICB4cCA9IHhwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgICAgICppcCA9ICcrJzsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGNoYXIgICAgICphY2MsICp0eXA7CiAgICAgICAgaW50ICAgICAgICAgICAgIHNpemUgPSAwOwogICAgICAgIHN3aXRjaCAodHAtPmFjY2VzcykgewogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19OT0FDQ0VTUzoKICAgICAgICAgICAgYWNjID0gIi0tLS0iOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfUkVBRE9OTFk6CiAgICAgICAgICAgIGFjYyA9ICItUi0tIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1dSSVRFT05MWToKICAgICAgICAgICAgYWNjID0gIi0tVy0iOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfUkVBRFdSSVRFOgogICAgICAgICAgICBhY2MgPSAiLVJXLSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19OT1RJRlk6CiAgICAgICAgICAgIGFjYyA9ICItLS1OIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX0NSRUFURToKICAgICAgICAgICAgYWNjID0gIkNSLS0iOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBhY2MgPSAiICAgICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgICAgICB0eXAgPSAiT2JqSUQgICAgIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICB0eXAgPSAiU3RyaW5nICAgIjsKICAgICAgICAgICAgc2l6ZSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgICAgICBpZiAodHAtPmVudW1zKQogICAgICAgICAgICAgICAgdHlwID0gIkVudW1WYWwgICI7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHR5cCA9ICJJTlRFR0VSICAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTkVUQUREUjoKICAgICAgICAgICAgdHlwID0gIk5ldEFkZHIgICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgICAgIHR5cCA9ICJJcEFkZHIgICAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQ09VTlRFUjoKICAgICAgICAgICAgdHlwID0gIkNvdW50ZXIgICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICAgICAgdHlwID0gIkdhdWdlICAgICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgICAgIHR5cCA9ICJUaW1lVGlja3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT1BBUVVFOgogICAgICAgICAgICB0eXAgPSAiT3BhcXVlICAgIjsKICAgICAgICAgICAgc2l6ZSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9OVUxMOgogICAgICAgICAgICB0eXAgPSAiTnVsbCAgICAgIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0NPVU5URVI2NDoKICAgICAgICAgICAgdHlwID0gIkNvdW50ZXI2NCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9CSVRTVFJJTkc6CiAgICAgICAgICAgIHR5cCA9ICJCaXRTdHJpbmciOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgICAgIHR5cCA9ICJOc2FwQWRkciAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICAgICAgdHlwID0gIlVuc2lnbmVkICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICAgICAgdHlwID0gIlVJbnRlZ2VyICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgICAgIHR5cCA9ICJJbnRlZ2VyMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0eXAgPSAiICAgICAgICAgIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGZwcmludGYoZiwgIiVzLS0gJXMgJXMgJXMoJWxkKVxuIiwgbGVhdmVfaW5kZW50LCBhY2MsIHR5cCwKICAgICAgICAgICAgICAgIHRwLT5sYWJlbCwgdHAtPnN1YmlkKTsKICAgICAgICAqaXAgPSBsYXN0X2lwY2g7CiAgICAgICAgaWYgKHRwLT50Y19pbmRleCA+PSAwKQogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyAgICAgICAgVGV4dHVhbCBDb252ZW50aW9uOiAlc1xuIiwgbGVhdmVfaW5kZW50LAogICAgICAgICAgICAgICAgICAgIHRjbGlzdFt0cC0+dGNfaW5kZXhdLmRlc2NyaXB0b3IpOwogICAgICAgIGlmICh0cC0+ZW51bXMpIHsKICAgICAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSB0cC0+ZW51bXM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBjcG9zID0gMCwgY21heCA9CiAgICAgICAgICAgICAgICB3aWR0aCAtIHN0cmxlbihsZWF2ZV9pbmRlbnQpIC0gMTY7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzICAgICAgICBWYWx1ZXM6ICIsIGxlYXZlX2luZGVudCk7CiAgICAgICAgICAgIHdoaWxlIChlcCkgewogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIGJ1Zls4MF07CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnVmdzsKICAgICAgICAgICAgICAgIGlmIChlcCAhPSB0cC0+ZW51bXMpCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiLCAiKTsKICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyglZCkiLCBlcC0+bGFiZWwsIGVwLT52YWx1ZSk7CiAgICAgICAgICAgICAgICBidWZbIHNpemVvZihidWYpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICBjcG9zICs9IChidWZ3ID0gc3RybGVuKGJ1ZikgKyAyKTsKICAgICAgICAgICAgICAgIGlmIChjcG9zID49IGNtYXgpIHsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJcbiVzICAgICAgICAgICAgICAgICIsIGxlYXZlX2luZGVudCk7CiAgICAgICAgICAgICAgICAgICAgY3BvcyA9IGJ1Znc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlcyIsIGJ1Zik7CiAgICAgICAgICAgICAgICBlcCA9IGVwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmICh0cC0+cmFuZ2VzKSB7CiAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICpycCA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgIGlmIChzaXplKQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgICAgICAgIFNpemU6ICIsIGxlYXZlX2luZGVudCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiVzICAgICAgICBSYW5nZTogIiwgbGVhdmVfaW5kZW50KTsKICAgICAgICAgICAgd2hpbGUgKHJwKSB7CiAgICAgICAgICAgICAgICBpZiAocnAgIT0gdHAtPnJhbmdlcykKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgfCAiKTsKICAgICAgICAgICAgICAgIHByaW50X3JhbmdlX3ZhbHVlKGYsIHRwLT50eXBlLCBycCk7CiAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgfQogICAgKmlwID0gbGFzdF9pcGNoOwogICAgc3RyY2F0KGxlYXZlX2luZGVudCwgIiAgfCIpOwogICAgbGVhdmVfd2FzX3NpbXBsZSA9IHRwLT50eXBlICE9IFRZUEVfT1RIRVI7CgogICAgewogICAgICAgIGludCAgICAgICAgICAgICBpLCBqLCBjb3VudCA9IDA7CiAgICAgICAgc3RydWN0IGxlYXZlIHsKICAgICAgICAgICAgb2lkICAgICAgICAgICAgIGlkOwogICAgICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CiAgICAgICAgfSAgICAgICAgICAgICAgKmxlYXZlcywgKmxwOwoKICAgICAgICBmb3IgKG50cCA9IHRwLT5jaGlsZF9saXN0OyBudHA7IG50cCA9IG50cC0+bmV4dF9wZWVyKQogICAgICAgICAgICBjb3VudCsrOwogICAgICAgIGlmIChjb3VudCkgewogICAgICAgICAgICBsZWF2ZXMgPSAoc3RydWN0IGxlYXZlICopIGNhbGxvYyhjb3VudCwgc2l6ZW9mKHN0cnVjdCBsZWF2ZSkpOwogICAgICAgICAgICBpZiAoIWxlYXZlcykKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgZm9yIChudHAgPSB0cC0+Y2hpbGRfbGlzdCwgY291bnQgPSAwOyBudHA7CiAgICAgICAgICAgICAgICAgbnRwID0gbnRwLT5uZXh0X3BlZXIpIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxwID0gbGVhdmVzOyBpIDwgY291bnQ7IGkrKywgbHArKykKICAgICAgICAgICAgICAgICAgICBpZiAobHAtPmlkID49IG50cC0+c3ViaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZm9yIChqID0gY291bnQ7IGogPiBpOyBqLS0pCiAgICAgICAgICAgICAgICAgICAgbGVhdmVzW2pdID0gbGVhdmVzW2ogLSAxXTsKICAgICAgICAgICAgICAgIGxwLT5pZCA9IG50cC0+c3ViaWQ7CiAgICAgICAgICAgICAgICBscC0+dHAgPSBudHA7CiAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoaSA9IDEsIGxwID0gbGVhdmVzOyBpIDw9IGNvdW50OyBpKyssIGxwKyspIHsKICAgICAgICAgICAgICAgIGlmICghbGVhdmVfd2FzX3NpbXBsZSB8fCBscC0+dHAtPnR5cGUgPT0gMCkKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuIiwgbGVhdmVfaW5kZW50KTsKICAgICAgICAgICAgICAgIGlmIChpID09IGNvdW50KQogICAgICAgICAgICAgICAgICAgIGlwWzNdID0gJyAnOwogICAgICAgICAgICAgICAgcHJpbnRfbWliX2xlYXZlcyhmLCBscC0+dHAsIHdpZHRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKGxlYXZlcyk7CiAgICAgICAgICAgIGxlYXZlX3dhc19zaW1wbGUgPSAwOwogICAgICAgIH0KICAgIH0KICAgIGlwWzFdID0gMDsKfQoKdm9pZApwcmludF9taWJfdHJlZShGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwLCBpbnQgd2lkdGgpCnsKICAgIGxlYXZlX2luZGVudFswXSA9ICcgJzsKICAgIGxlYXZlX2luZGVudFsxXSA9IDA7CiAgICBsZWF2ZV93YXNfc2ltcGxlID0gMTsKICAgIHByaW50X21pYl9sZWF2ZXMoZiwgdHAsIHdpZHRoKTsKfQoKCi8qCiAqIE1lcmdlIHRoZSBwYXJzZWQgb2JqZWN0IGlkZW50aWZpZXIgd2l0aCB0aGUgZXhpc3Rpbmcgbm9kZS4KICogSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGlkZW50aWZpZXIsIHJlbGVhc2UgdGhlIGV4aXN0aW5nIG5vZGUuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgptZXJnZV9wYXJzZV9vYmplY3RpZChzdHJ1Y3Qgbm9kZSAqbnAsIEZJTEUgKiBmcCwgY2hhciAqbmFtZSkKewogICAgc3RydWN0IG5vZGUgICAgKm5ucDsKICAgIC8qCiAgICAgKiBwcmludGYoIm1lcmdlIGRlZnZhbCAtLT4gJXNcbiIsbnAtPmRlZmF1bHRWYWx1ZSk7IAogICAgICovCiAgICBubnAgPSBwYXJzZV9vYmplY3RpZChmcCwgbmFtZSk7CiAgICBpZiAobm5wKSB7CgogICAgICAgIC8qCiAgICAgICAgICogYXBwbHkgbGFzdCBPSUQgc3ViLWlkZW50aWZpZXIgZGF0YSB0byB0aGUgaW5mb3JtYXRpb24gCiAgICAgICAgICovCiAgICAgICAgLyoKICAgICAgICAgKiBhbHJlYWR5IGNvbGxlY3RlZCBmb3IgdGhpcyBub2RlLiAKICAgICAgICAgKi8KICAgICAgICBzdHJ1Y3Qgbm9kZSAgICAqaGVhZHAsICpuZXh0cDsKICAgICAgICBpbnQgICAgICAgICAgICAgbmNvdW50ID0gMDsKICAgICAgICBuZXh0cCA9IGhlYWRwID0gbm5wOwogICAgICAgIHdoaWxlIChubnAtPm5leHQpIHsKICAgICAgICAgICAgbmV4dHAgPSBubnA7CiAgICAgICAgICAgIG5jb3VudCsrOwogICAgICAgICAgICBubnAgPSBubnAtPm5leHQ7CiAgICAgICAgfQoKICAgICAgICBucC0+bGFiZWwgPSBubnAtPmxhYmVsOwogICAgICAgIG5wLT5zdWJpZCA9IG5ucC0+c3ViaWQ7CiAgICAgICAgbnAtPm1vZGlkID0gbm5wLT5tb2RpZDsKICAgICAgICBucC0+cGFyZW50ID0gbm5wLT5wYXJlbnQ7CglpZiAobm5wLT5maWxlbmFtZSAhPSBOVUxMKSB7CgkgIGZyZWUobm5wLT5maWxlbmFtZSk7Cgl9CiAgICAgICAgZnJlZShubnApOwoKICAgICAgICBpZiAobmNvdW50KSB7CiAgICAgICAgICAgIG5leHRwLT5uZXh0ID0gbnA7CiAgICAgICAgICAgIG5wID0gaGVhZHA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIG5wID0gTlVMTDsKICAgIH0KCiAgICByZXR1cm4gbnA7Cn0KCi8qCiAqIHRyYW5zZmVyIGRhdGEgdG8gdHJlZSBmcm9tIG5vZGUKICoKICogbW92ZSBwb2ludGVycyBmb3IgYWxsb2MnZCBkYXRhIGZyb20gbnAgdG8gdHAuCiAqIHRoaXMgcHJldmVudHMgdGhlbSBmcm9tIGJlaW5nIGZyZWVkIHdoZW4gbnAgaXMgcmVsZWFzZWQuCiAqIHBhcmVudCBtZW1iZXIgaXMgbm90IG1vdmVkLgogKgogKiBDQVVUSU9OOiBub2RlcyBtYXkgYmUgcmVwZWF0cyBvZiBleGlzdGluZyB0cmVlIG5vZGVzLgogKiBUaGlzIGNhbiBoYXBwZW4gZXNwZWNpYWxseSB3aGVuIHJlc29sdmluZyBJTVBPUlQgY2xhdXNlcy4KICoKICovCnN0YXRpYyB2b2lkCnRyZWVfZnJvbV9ub2RlKHN0cnVjdCB0cmVlICp0cCwgc3RydWN0IG5vZGUgKm5wKQp7CiAgICBmcmVlX3BhcnRpYWxfdHJlZSh0cCwgRkFMU0UpOwoKICAgIHRwLT5sYWJlbCA9IG5wLT5sYWJlbDsKICAgIG5wLT5sYWJlbCA9IE5VTEw7CiAgICB0cC0+ZW51bXMgPSBucC0+ZW51bXM7CiAgICBucC0+ZW51bXMgPSBOVUxMOwogICAgdHAtPnJhbmdlcyA9IG5wLT5yYW5nZXM7CiAgICBucC0+cmFuZ2VzID0gTlVMTDsKICAgIHRwLT5pbmRleGVzID0gbnAtPmluZGV4ZXM7CiAgICBucC0+aW5kZXhlcyA9IE5VTEw7CiAgICB0cC0+YXVnbWVudHMgPSBucC0+YXVnbWVudHM7CiAgICBucC0+YXVnbWVudHMgPSBOVUxMOwogICAgdHAtPnZhcmJpbmRzID0gbnAtPnZhcmJpbmRzOwogICAgbnAtPnZhcmJpbmRzID0gTlVMTDsKICAgIHRwLT5oaW50ID0gbnAtPmhpbnQ7CiAgICBucC0+aGludCA9IE5VTEw7CiAgICB0cC0+dW5pdHMgPSBucC0+dW5pdHM7CiAgICBucC0+dW5pdHMgPSBOVUxMOwogICAgdHAtPmRlc2NyaXB0aW9uID0gbnAtPmRlc2NyaXB0aW9uOwogICAgbnAtPmRlc2NyaXB0aW9uID0gTlVMTDsKICAgIHRwLT5yZWZlcmVuY2UgPSBucC0+cmVmZXJlbmNlOwogICAgbnAtPnJlZmVyZW5jZSA9IE5VTEw7CiAgICB0cC0+ZGVmYXVsdFZhbHVlID0gbnAtPmRlZmF1bHRWYWx1ZTsKICAgIG5wLT5kZWZhdWx0VmFsdWUgPSBOVUxMOwogICAgdHAtPnN1YmlkID0gbnAtPnN1YmlkOwogICAgdHAtPnRjX2luZGV4ID0gbnAtPnRjX2luZGV4OwogICAgdHAtPnR5cGUgPSB0cmFuc2xhdGlvbl90YWJsZVtucC0+dHlwZV07CiAgICB0cC0+YWNjZXNzID0gbnAtPmFjY2VzczsKICAgIHRwLT5zdGF0dXMgPSBucC0+c3RhdHVzOwoKICAgIHNldF9mdW5jdGlvbih0cCk7Cn0KCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8K