LyoKICogcGFyc2UuYwogKgogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBDb3B5cmlnaHQgMTk4OSwgMTk5MSwgMTk5MiBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQoKICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKClBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwpkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCnByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCnN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ01VIG5vdCBiZQp1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgoKQ01VIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCkNNVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLApXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCkFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKU09GVFdBUkUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCgojaWYgSEFWRV9MSU1JVFNfSAojaW5jbHVkZSA8bGltaXRzLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RkaW8uaD4KI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfU1lTX1NUQVRfSAojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2VuZGlmCgovKgogKiBXb3cuICBUaGlzIGlzIHVnbHkuICAtLSBXZXMgCiAqLwojaWYgSEFWRV9ESVJFTlRfSAojIGluY2x1ZGUgPGRpcmVudC5oPgojIGRlZmluZSBOQU1MRU4oZGlyZW50KSBzdHJsZW4oKGRpcmVudCktPmRfbmFtZSkKI2Vsc2UKIyBkZWZpbmUgZGlyZW50IGRpcmVjdAojIGRlZmluZSBOQU1MRU4oZGlyZW50KSAoZGlyZW50KS0+ZF9uYW1sZW4KIyBpZiBIQVZFX1NZU19ORElSX0gKIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfU1lTX0RJUl9ICiMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KIyBlbmRpZgojIGlmIEhBVkVfTkRJUl9ICiMgIGluY2x1ZGUgPG5kaXIuaD4KIyBlbmRpZgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGlmZGVmIFdJTjMyCiMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgojIGVsc2UKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbmRpZgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBkZWZpbmVkKEhBVkVfUkVHRVhfSCkgJiYgZGVmaW5lZChIQVZFX1JFR0NPTVApCiNpbmNsdWRlIDxyZWdleC5oPgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2luY2x1ZGUgPGVycm5vLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2NvbmZpZ19hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL3V0aWxpdGllcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvcGFyc2UuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbWliLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfYXBpLmg+CgovKgogKiBUaGlzIGlzIG9uZSBlbGVtZW50IG9mIGFuIG9iamVjdCBpZGVudGlmaWVyIHdpdGggZWl0aGVyIGFuIGludGVnZXIKICogc3ViaWRlbnRpZmllciwgb3IgYSB0ZXh0dWFsIHN0cmluZyBsYWJlbCwgb3IgYm90aC4KICogVGhlIHN1YmlkIGlzIC0xIGlmIG5vdCBwcmVzZW50LCBhbmQgbGFiZWwgaXMgTlVMTCBpZiBub3QgcHJlc2VudC4KICovCnN0cnVjdCBzdWJpZF9zIHsKICAgIGludCAgICAgICAgICAgICBzdWJpZDsKICAgIGludCAgICAgICAgICAgICBtb2RpZDsKICAgIGNoYXIgICAgICAgICAgICpsYWJlbDsKfTsKCiNkZWZpbmUgTUFYVEMgICA0MDk2CnN0cnVjdCB0YyB7ICAgICAgICAgICAgICAgICAgICAgLyogdGV4dHVhbCBjb252ZW50aW9ucyAqLwogICAgaW50ICAgICAgICAgICAgIHR5cGU7CiAgICBpbnQgICAgICAgICAgICAgbW9kaWQ7CiAgICBjaGFyICAgICAgICAgICAqZGVzY3JpcHRvcjsKICAgIGNoYXIgICAgICAgICAgICpoaW50OwogICAgc3RydWN0IGVudW1fbGlzdCAqZW51bXM7CiAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcmFuZ2VzOwogICAgY2hhciAgICAgICAgICAgKmRlc2NyaXB0aW9uOwp9IHRjbGlzdFtNQVhUQ107CgppbnQgICAgICAgICAgICAgbWliTGluZSA9IDA7CmNvbnN0IGNoYXIgICAgICpGaWxlID0gIihub25lKSI7CnN0YXRpYyBpbnQgICAgICBhbm9ueW1vdXMgPSAwOwoKc3RydWN0IG9iamdyb3VwIHsKICAgIGNoYXIgICAgICAgICAgICpuYW1lOwogICAgaW50ICAgICAgICAgICAgIGxpbmU7CiAgICBzdHJ1Y3Qgb2JqZ3JvdXAgKm5leHQ7Cn0gICAgICAgICAgICAgICpvYmpncm91cHMgPSBOVUxMLCAqb2JqZWN0cyA9IE5VTEwsICpub3RpZnMgPSBOVUxMOwoKI2RlZmluZSBTWU5UQVhfTUFTSyAgICAgMHg4MAovKgogKiB0eXBlcyBvZiB0b2tlbnMKICogVG9rZW5zIHdpaHQgdGhlIFNZTlRBWF9NQVNLIGJpdCBzZXQgYXJlIHN5bnRheCB0b2tlbnMgCiAqLwojZGVmaW5lIENPTlRJTlVFICAgIC0xCiNkZWZpbmUgRU5ET0ZGSUxFICAgMAojZGVmaW5lIExBQkVMICAgICAgIDEKI2RlZmluZSBTVUJUUkVFICAgICAyCiNkZWZpbmUgU1lOVEFYICAgICAgMwojZGVmaW5lIE9CSklEICAgICAgICg0IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgT0NURVRTVFIgICAgKDUgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBJTlRFR0VSICAgICAoNiB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIE5FVEFERFIgICAgICg3IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgSVBBRERSICAgICAgKDggfCBTWU5UQVhfTUFTSykKI2RlZmluZSBDT1VOVEVSICAgICAoOSB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIEdBVUdFICAgICAgICgxMCB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIFRJTUVUSUNLUyAgICgxMSB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIEtXX09QQVFVRSAgICgxMiB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIE5VTCAgICAgICAgICgxMyB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIFNFUVVFTkNFICAgIDE0CiNkZWZpbmUgT0YgICAgICAgICAgMTUgICAgICAgICAgLyogU0VRVUVOQ0UgT0YgKi8KI2RlZmluZSBPQkpUWVBFICAgICAxNgojZGVmaW5lIEFDQ0VTUyAgICAgIDE3CiNkZWZpbmUgUkVBRE9OTFkgICAgMTgKI2RlZmluZSBSRUFEV1JJVEUgICAxOQojZGVmaW5lIFdSSVRFT05MWSAgIDIwCiNpZmRlZiBOT0FDQ0VTUwojdW5kZWYgTk9BQ0NFU1MgICAgICAgICAgICAgICAgIC8qIGFnZW50ICdOT0FDQ0VTUycgdG9rZW4gKi8KI2VuZGlmCiNkZWZpbmUgTk9BQ0NFU1MgICAgMjEKI2RlZmluZSBTVEFUVVMgICAgICAyMgojZGVmaW5lIE1BTkRBVE9SWSAgIDIzCiNkZWZpbmUgS1dfT1BUSU9OQUwgICAgMjQKI2RlZmluZSBPQlNPTEVURSAgICAyNQovKgogKiAjZGVmaW5lIFJFQ09NTUVOREVEIDI2IAogKi8KI2RlZmluZSBQVU5DVCAgICAgICAyNwojZGVmaW5lIEVRVUFMUyAgICAgIDI4CiNkZWZpbmUgTlVNQkVSICAgICAgMjkKI2RlZmluZSBMRUZUQlJBQ0tFVCAzMAojZGVmaW5lIFJJR0hUQlJBQ0tFVCAzMQojZGVmaW5lIExFRlRQQVJFTiAgIDMyCiNkZWZpbmUgUklHSFRQQVJFTiAgMzMKI2RlZmluZSBDT01NQSAgICAgICAzNAojZGVmaW5lIERFU0NSSVBUSU9OIDM1CiNkZWZpbmUgUVVPVEVTVFJJTkcgMzYKI2RlZmluZSBJTkRFWCAgICAgICAzNwojZGVmaW5lIERFRlZBTCAgICAgIDM4CiNkZWZpbmUgREVQUkVDQVRFRCAgMzkKI2RlZmluZSBTSVpFICAgICAgICA0MAojZGVmaW5lIEJJVFNUUklORyAgICg0MSB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIE5TQVBBRERSRVNTICg0MiB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIENPVU5URVI2NCAgICg0MyB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIE9CSkdST1VQICAgIDQ0CiNkZWZpbmUgTk9USUZUWVBFICAgNDUKI2RlZmluZSBBVUdNRU5UUyAgICA0NgojZGVmaW5lIENPTVBMSUFOQ0UgIDQ3CiNkZWZpbmUgUkVBRENSRUFURSAgNDgKI2RlZmluZSBVTklUUyAgICAgICA0OQojZGVmaW5lIFJFRkVSRU5DRSAgIDUwCiNkZWZpbmUgTlVNX0VOVFJJRVMgNTEKI2RlZmluZSBNT0RVTEVJREVOVElUWSA1MgojZGVmaW5lIExBU1RVUERBVEVEIDUzCiNkZWZpbmUgT1JHQU5JWkFUSU9OIDU0CiNkZWZpbmUgQ09OVEFDVElORk8gNTUKI2RlZmluZSBVSU5URUdFUjMyICg1NiB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIENVUlJFTlQgICAgIDU3CiNkZWZpbmUgREVGSU5JVElPTlMgNTgKI2RlZmluZSBFTkQgICAgICAgICA1OQojZGVmaW5lIFNFTUkgICAgICAgIDYwCiNkZWZpbmUgVFJBUFRZUEUgICAgNjEKI2RlZmluZSBFTlRFUlBSSVNFICA2MgovKgogKiAjZGVmaW5lIERJU1BMQVlTVFIgKDYzIHwgU1lOVEFYX01BU0spIAogKi8KI2RlZmluZSBCRUdJTiAgICAgICA2NAojZGVmaW5lIElNUE9SVFMgICAgIDY1CiNkZWZpbmUgRVhQT1JUUyAgICAgNjYKI2RlZmluZSBBQ0NOT1RJRlkgICA2NwojZGVmaW5lIEJBUiAgICAgICAgIDY4CiNkZWZpbmUgUkFOR0UgICAgICAgNjkKI2RlZmluZSBDT05WRU5USU9OICA3MAojZGVmaW5lIERJU1BMQVlISU5UIDcxCiNkZWZpbmUgRlJPTSAgICAgICAgNzIKI2RlZmluZSBBR0VOVENBUCAgICA3MwojZGVmaW5lIE1BQ1JPICAgICAgIDc0CiNkZWZpbmUgSU1QTElFRCAgICAgNzUKI2RlZmluZSBTVVBQT1JUUyAgICA3NgojZGVmaW5lIElOQ0xVREVTICAgIDc3CiNkZWZpbmUgVkFSSUFUSU9OICAgNzgKI2RlZmluZSBSRVZJU0lPTiAgICA3OQojZGVmaW5lIE5PVElNUEwJICAgIDgwCiNkZWZpbmUgT0JKRUNUUwkgICAgODEKI2RlZmluZSBOT1RJRklDQVRJT05TCTgyCiNkZWZpbmUgTU9EVUxFCSAgICA4MwojZGVmaW5lIE1JTkFDQ0VTUyAgIDg0CiNkZWZpbmUgUFJPRFJFTAkgICAgODUKI2RlZmluZSBXUlNZTlRBWCAgICA4NgojZGVmaW5lIENSRUFURVJFUSAgIDg3CiNkZWZpbmUgTk9USUZHUk9VUCAgODgKI2RlZmluZSBNQU5EQVRPUllHUk9VUFMJODkKI2RlZmluZSBHUk9VUAkgICAgOTAKI2RlZmluZSBPQkpFQ1QJICAgIDkxCiNkZWZpbmUgSURFTlRJRklFUiAgOTIKI2RlZmluZSBDSE9JQ0UJICAgIDkzCiNkZWZpbmUgTEVGVFNRQlJBQ0sJOTUKI2RlZmluZSBSSUdIVFNRQlJBQ0sJOTYKI2RlZmluZSBJTVBMSUNJVCAgICA5NwojZGVmaW5lIEFQUFNZTlRBWAkoOTggfCBTWU5UQVhfTUFTSykKI2RlZmluZSBPQkpTWU5UQVgJKDk5IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgU0lNUExFU1lOVEFYCSgxMDAgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBPQkpOQU1FCQkoMTAxIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgTk9USUZOQU1FCSgxMDIgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBWQVJJQUJMRVMJMTAzCiNkZWZpbmUgVU5TSUdORUQzMgkoMTA0IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgSU5URUdFUjMyCSgxMDUgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBPQkpJREVOVElUWQkxMDYKLyoKICogQmV3YXJlIG9mIHJlYWNoaW5nIFNZTlRBWF9NQVNLICgweDgwKSAKICovCgpzdHJ1Y3QgdG9rIHsKICAgIGNvbnN0IGNoYXIgICAgICpuYW1lOyAgICAgICAvKiB0b2tlbiBuYW1lICovCiAgICBpbnQgICAgICAgICAgICAgbGVuOyAgICAgICAgLyogbGVuZ3RoIG5vdCBjb3VudGluZyBudWwgKi8KICAgIGludCAgICAgICAgICAgICB0b2tlbjsgICAgICAvKiB2YWx1ZSAqLwogICAgaW50ICAgICAgICAgICAgIGhhc2g7ICAgICAgIC8qIGhhc2ggb2YgbmFtZSAqLwogICAgc3RydWN0IHRvayAgICAgKm5leHQ7ICAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBpbiBoYXNoIHRhYmxlICovCn07CgoKc3RhdGljIHN0cnVjdCB0b2sgdG9rZW5zW10gPSB7CiAgICB7Im9ic29sZXRlIiwgc2l6ZW9mKCJvYnNvbGV0ZSIpIC0gMSwgT0JTT0xFVEV9CiAgICAsCiAgICB7Ik9wYXF1ZSIsIHNpemVvZigiT3BhcXVlIikgLSAxLCBLV19PUEFRVUV9CiAgICAsCiAgICB7Im9wdGlvbmFsIiwgc2l6ZW9mKCJvcHRpb25hbCIpIC0gMSwgS1dfT1BUSU9OQUx9CiAgICAsCiAgICB7IkxBU1QtVVBEQVRFRCIsIHNpemVvZigiTEFTVC1VUERBVEVEIikgLSAxLCBMQVNUVVBEQVRFRH0KICAgICwKICAgIHsiT1JHQU5JWkFUSU9OIiwgc2l6ZW9mKCJPUkdBTklaQVRJT04iKSAtIDEsIE9SR0FOSVpBVElPTn0KICAgICwKICAgIHsiQ09OVEFDVC1JTkZPIiwgc2l6ZW9mKCJDT05UQUNULUlORk8iKSAtIDEsIENPTlRBQ1RJTkZPfQogICAgLAogICAgeyJNT0RVTEUtSURFTlRJVFkiLCBzaXplb2YoIk1PRFVMRS1JREVOVElUWSIpIC0gMSwgTU9EVUxFSURFTlRJVFl9CiAgICAsCiAgICB7Ik1PRFVMRS1DT01QTElBTkNFIiwgc2l6ZW9mKCJNT0RVTEUtQ09NUExJQU5DRSIpIC0gMSwgQ09NUExJQU5DRX0KICAgICwKICAgIHsiREVGSU5JVElPTlMiLCBzaXplb2YoIkRFRklOSVRJT05TIikgLSAxLCBERUZJTklUSU9OU30KICAgICwKICAgIHsiRU5EIiwgc2l6ZW9mKCJFTkQiKSAtIDEsIEVORH0KICAgICwKICAgIHsiQVVHTUVOVFMiLCBzaXplb2YoIkFVR01FTlRTIikgLSAxLCBBVUdNRU5UU30KICAgICwKICAgIHsibm90LWFjY2Vzc2libGUiLCBzaXplb2YoIm5vdC1hY2Nlc3NpYmxlIikgLSAxLCBOT0FDQ0VTU30KICAgICwKICAgIHsid3JpdGUtb25seSIsIHNpemVvZigid3JpdGUtb25seSIpIC0gMSwgV1JJVEVPTkxZfQogICAgLAogICAgeyJOc2FwQWRkcmVzcyIsIHNpemVvZigiTnNhcEFkZHJlc3MiKSAtIDEsIE5TQVBBRERSRVNTfQogICAgLAogICAgeyJVTklUUyIsIHNpemVvZigiVW5pdHMiKSAtIDEsIFVOSVRTfQogICAgLAogICAgeyJSRUZFUkVOQ0UiLCBzaXplb2YoIlJFRkVSRU5DRSIpIC0gMSwgUkVGRVJFTkNFfQogICAgLAogICAgeyJOVU0tRU5UUklFUyIsIHNpemVvZigiTlVNLUVOVFJJRVMiKSAtIDEsIE5VTV9FTlRSSUVTfQogICAgLAogICAgeyJCSVRTVFJJTkciLCBzaXplb2YoIkJJVFNUUklORyIpIC0gMSwgQklUU1RSSU5HfQogICAgLAogICAgeyJCSVQiLCBzaXplb2YoIkJJVCIpIC0gMSwgQ09OVElOVUV9CiAgICAsCiAgICB7IkJJVFMiLCBzaXplb2YoIkJJVFMiKSAtIDEsIEJJVFNUUklOR30KICAgICwKICAgIHsiQ291bnRlcjY0Iiwgc2l6ZW9mKCJDb3VudGVyNjQiKSAtIDEsIENPVU5URVI2NH0KICAgICwKICAgIHsiVGltZVRpY2tzIiwgc2l6ZW9mKCJUaW1lVGlja3MiKSAtIDEsIFRJTUVUSUNLU30KICAgICwKICAgIHsiTk9USUZJQ0FUSU9OLVRZUEUiLCBzaXplb2YoIk5PVElGSUNBVElPTi1UWVBFIikgLSAxLCBOT1RJRlRZUEV9CiAgICAsCiAgICB7Ik9CSkVDVC1HUk9VUCIsIHNpemVvZigiT0JKRUNULUdST1VQIikgLSAxLCBPQkpHUk9VUH0KICAgICwKICAgIHsiT0JKRUNULUlERU5USVRZIiwgc2l6ZW9mKCJPQkpFQ1QtSURFTlRJVFkiKSAtIDEsIE9CSklERU5USVRZfQogICAgLAogICAgeyJJREVOVElGSUVSIiwgc2l6ZW9mKCJJREVOVElGSUVSIikgLSAxLCBJREVOVElGSUVSfQogICAgLAogICAgeyJPQkpFQ1QiLCBzaXplb2YoIk9CSkVDVCIpIC0gMSwgT0JKRUNUfQogICAgLAogICAgeyJOZXR3b3JrQWRkcmVzcyIsIHNpemVvZigiTmV0d29ya0FkZHJlc3MiKSAtIDEsIE5FVEFERFJ9CiAgICAsCiAgICB7IkdhdWdlIiwgc2l6ZW9mKCJHYXVnZSIpIC0gMSwgR0FVR0V9CiAgICAsCiAgICB7IkdhdWdlMzIiLCBzaXplb2YoIkdhdWdlMzIiKSAtIDEsIEdBVUdFfQogICAgLAogICAgeyJVbnNpZ25lZDMyIiwgc2l6ZW9mKCJVbnNpZ25lZDMyIikgLSAxLCBVTlNJR05FRDMyfQogICAgLAogICAgeyJyZWFkLXdyaXRlIiwgc2l6ZW9mKCJyZWFkLXdyaXRlIikgLSAxLCBSRUFEV1JJVEV9CiAgICAsCiAgICB7InJlYWQtY3JlYXRlIiwgc2l6ZW9mKCJyZWFkLWNyZWF0ZSIpIC0gMSwgUkVBRENSRUFURX0KICAgICwKICAgIHsiT0NURVRTVFJJTkciLCBzaXplb2YoIk9DVEVUU1RSSU5HIikgLSAxLCBPQ1RFVFNUUn0KICAgICwKICAgIHsiT0NURVQiLCBzaXplb2YoIk9DVEVUIikgLSAxLCBDT05USU5VRX0KICAgICwKICAgIHsiT0YiLCBzaXplb2YoIk9GIikgLSAxLCBPRn0KICAgICwKICAgIHsiU0VRVUVOQ0UiLCBzaXplb2YoIlNFUVVFTkNFIikgLSAxLCBTRVFVRU5DRX0KICAgICwKICAgIHsiTlVMTCIsIHNpemVvZigiTlVMTCIpIC0gMSwgTlVMfQogICAgLAogICAgeyJJcEFkZHJlc3MiLCBzaXplb2YoIklwQWRkcmVzcyIpIC0gMSwgSVBBRERSfQogICAgLAogICAgeyJVSW50ZWdlcjMyIiwgc2l6ZW9mKCJVSW50ZWdlcjMyIikgLSAxLCBVSU5URUdFUjMyfQogICAgLAogICAgeyJJTlRFR0VSIiwgc2l6ZW9mKCJJTlRFR0VSIikgLSAxLCBJTlRFR0VSfQogICAgLAogICAgeyJJbnRlZ2VyMzIiLCBzaXplb2YoIkludGVnZXIzMiIpIC0gMSwgSU5URUdFUjMyfQogICAgLAogICAgeyJDb3VudGVyIiwgc2l6ZW9mKCJDb3VudGVyIikgLSAxLCBDT1VOVEVSfQogICAgLAogICAgeyJDb3VudGVyMzIiLCBzaXplb2YoIkNvdW50ZXIzMiIpIC0gMSwgQ09VTlRFUn0KICAgICwKICAgIHsicmVhZC1vbmx5Iiwgc2l6ZW9mKCJyZWFkLW9ubHkiKSAtIDEsIFJFQURPTkxZfQogICAgLAogICAgeyJERVNDUklQVElPTiIsIHNpemVvZigiREVTQ1JJUFRJT04iKSAtIDEsIERFU0NSSVBUSU9OfQogICAgLAogICAgeyJJTkRFWCIsIHNpemVvZigiSU5ERVgiKSAtIDEsIElOREVYfQogICAgLAogICAgeyJERUZWQUwiLCBzaXplb2YoIkRFRlZBTCIpIC0gMSwgREVGVkFMfQogICAgLAogICAgeyJkZXByZWNhdGVkIiwgc2l6ZW9mKCJkZXByZWNhdGVkIikgLSAxLCBERVBSRUNBVEVEfQogICAgLAogICAgeyJTSVpFIiwgc2l6ZW9mKCJTSVpFIikgLSAxLCBTSVpFfQogICAgLAogICAgeyJNQVgtQUNDRVNTIiwgc2l6ZW9mKCJNQVgtQUNDRVNTIikgLSAxLCBBQ0NFU1N9CiAgICAsCiAgICB7IkFDQ0VTUyIsIHNpemVvZigiQUNDRVNTIikgLSAxLCBBQ0NFU1N9CiAgICAsCiAgICB7Im1hbmRhdG9yeSIsIHNpemVvZigibWFuZGF0b3J5IikgLSAxLCBNQU5EQVRPUll9CiAgICAsCiAgICB7ImN1cnJlbnQiLCBzaXplb2YoImN1cnJlbnQiKSAtIDEsIENVUlJFTlR9CiAgICAsCiAgICB7IlNUQVRVUyIsIHNpemVvZigiU1RBVFVTIikgLSAxLCBTVEFUVVN9CiAgICAsCiAgICB7IlNZTlRBWCIsIHNpemVvZigiU1lOVEFYIikgLSAxLCBTWU5UQVh9CiAgICAsCiAgICB7Ik9CSkVDVC1UWVBFIiwgc2l6ZW9mKCJPQkpFQ1QtVFlQRSIpIC0gMSwgT0JKVFlQRX0KICAgICwKICAgIHsiVFJBUC1UWVBFIiwgc2l6ZW9mKCJUUkFQLVRZUEUiKSAtIDEsIFRSQVBUWVBFfQogICAgLAogICAgeyJFTlRFUlBSSVNFIiwgc2l6ZW9mKCJFTlRFUlBSSVNFIikgLSAxLCBFTlRFUlBSSVNFfQogICAgLAogICAgeyJCRUdJTiIsIHNpemVvZigiQkVHSU4iKSAtIDEsIEJFR0lOfQogICAgLAogICAgeyJJTVBPUlRTIiwgc2l6ZW9mKCJJTVBPUlRTIikgLSAxLCBJTVBPUlRTfQogICAgLAogICAgeyJFWFBPUlRTIiwgc2l6ZW9mKCJFWFBPUlRTIikgLSAxLCBFWFBPUlRTfQogICAgLAogICAgeyJhY2Nlc3NpYmxlLWZvci1ub3RpZnkiLCBzaXplb2YoImFjY2Vzc2libGUtZm9yLW5vdGlmeSIpIC0gMSwKICAgICBBQ0NOT1RJRll9CiAgICAsCiAgICB7IlRFWFRVQUwtQ09OVkVOVElPTiIsIHNpemVvZigiVEVYVFVBTC1DT05WRU5USU9OIikgLSAxLCBDT05WRU5USU9OfQogICAgLAogICAgeyJOT1RJRklDQVRJT04tR1JPVVAiLCBzaXplb2YoIk5PVElGSUNBVElPTi1HUk9VUCIpIC0gMSwgTk9USUZHUk9VUH0KICAgICwKICAgIHsiRElTUExBWS1ISU5UIiwgc2l6ZW9mKCJESVNQTEFZLUhJTlQiKSAtIDEsIERJU1BMQVlISU5UfQogICAgLAogICAgeyJGUk9NIiwgc2l6ZW9mKCJGUk9NIikgLSAxLCBGUk9NfQogICAgLAogICAgeyJBR0VOVC1DQVBBQklMSVRJRVMiLCBzaXplb2YoIkFHRU5ULUNBUEFCSUxJVElFUyIpIC0gMSwgQUdFTlRDQVB9CiAgICAsCiAgICB7Ik1BQ1JPIiwgc2l6ZW9mKCJNQUNSTyIpIC0gMSwgTUFDUk99CiAgICAsCiAgICB7IklNUExJRUQiLCBzaXplb2YoIklNUExJRUQiKSAtIDEsIElNUExJRUR9CiAgICAsCiAgICB7IlNVUFBPUlRTIiwgc2l6ZW9mKCJTVVBQT1JUUyIpIC0gMSwgU1VQUE9SVFN9CiAgICAsCiAgICB7IklOQ0xVREVTIiwgc2l6ZW9mKCJJTkNMVURFUyIpIC0gMSwgSU5DTFVERVN9CiAgICAsCiAgICB7IlZBUklBVElPTiIsIHNpemVvZigiVkFSSUFUSU9OIikgLSAxLCBWQVJJQVRJT059CiAgICAsCiAgICB7IlJFVklTSU9OIiwgc2l6ZW9mKCJSRVZJU0lPTiIpIC0gMSwgUkVWSVNJT059CiAgICAsCiAgICB7Im5vdC1pbXBsZW1lbnRlZCIsIHNpemVvZigibm90LWltcGxlbWVudGVkIikgLSAxLCBOT1RJTVBMfQogICAgLAogICAgeyJPQkpFQ1RTIiwgc2l6ZW9mKCJPQkpFQ1RTIikgLSAxLCBPQkpFQ1RTfQogICAgLAogICAgeyJOT1RJRklDQVRJT05TIiwgc2l6ZW9mKCJOT1RJRklDQVRJT05TIikgLSAxLCBOT1RJRklDQVRJT05TfQogICAgLAogICAgeyJNT0RVTEUiLCBzaXplb2YoIk1PRFVMRSIpIC0gMSwgTU9EVUxFfQogICAgLAogICAgeyJNSU4tQUNDRVNTIiwgc2l6ZW9mKCJNSU4tQUNDRVNTIikgLSAxLCBNSU5BQ0NFU1N9CiAgICAsCiAgICB7IlBST0RVQ1QtUkVMRUFTRSIsIHNpemVvZigiUFJPRFVDVC1SRUxFQVNFIikgLSAxLCBQUk9EUkVMfQogICAgLAogICAgeyJXUklURS1TWU5UQVgiLCBzaXplb2YoIldSSVRFLVNZTlRBWCIpIC0gMSwgV1JTWU5UQVh9CiAgICAsCiAgICB7IkNSRUFUSU9OLVJFUVVJUkVTIiwgc2l6ZW9mKCJDUkVBVElPTi1SRVFVSVJFUyIpIC0gMSwgQ1JFQVRFUkVRfQogICAgLAogICAgeyJNQU5EQVRPUlktR1JPVVBTIiwgc2l6ZW9mKCJNQU5EQVRPUlktR1JPVVBTIikgLSAxLCBNQU5EQVRPUllHUk9VUFN9CiAgICAsCiAgICB7IkdST1VQIiwgc2l6ZW9mKCJHUk9VUCIpIC0gMSwgR1JPVVB9CiAgICAsCiAgICB7IkNIT0lDRSIsIHNpemVvZigiQ0hPSUNFIikgLSAxLCBDSE9JQ0V9CiAgICAsCiAgICB7IklNUExJQ0lUIiwgc2l6ZW9mKCJJTVBMSUNJVCIpIC0gMSwgSU1QTElDSVR9CiAgICAsCiAgICB7Ik9iamVjdFN5bnRheCIsIHNpemVvZigiT2JqZWN0U3ludGF4IikgLSAxLCBPQkpTWU5UQVh9CiAgICAsCiAgICB7IlNpbXBsZVN5bnRheCIsIHNpemVvZigiU2ltcGxlU3ludGF4IikgLSAxLCBTSU1QTEVTWU5UQVh9CiAgICAsCiAgICB7IkFwcGxpY2F0aW9uU3ludGF4Iiwgc2l6ZW9mKCJBcHBsaWNhdGlvblN5bnRheCIpIC0gMSwgQVBQU1lOVEFYfQogICAgLAogICAgeyJPYmplY3ROYW1lIiwgc2l6ZW9mKCJPYmplY3ROYW1lIikgLSAxLCBPQkpOQU1FfQogICAgLAogICAgeyJOb3RpZmljYXRpb25OYW1lIiwgc2l6ZW9mKCJOb3RpZmljYXRpb25OYW1lIikgLSAxLCBOT1RJRk5BTUV9CiAgICAsCiAgICB7IlZBUklBQkxFUyIsIHNpemVvZigiVkFSSUFCTEVTIikgLSAxLCBWQVJJQUJMRVN9CiAgICAsCiAgICB7TlVMTH0KfTsKCnN0YXRpYyBzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkgKm1vZHVsZV9tYXBfaGVhZDsKc3RhdGljIHN0cnVjdCBtb2R1bGVfY29tcGF0YWJpbGl0eSBtb2R1bGVfbWFwW10gPSB7CiAgICB7IlJGQzEwNjUtU01JIiwgIlJGQzExNTUtU01JIiwgTlVMTCwgMH0sCiAgICB7IlJGQzEwNjYtTUlCIiwgIlJGQzExNTYtTUlCIiwgTlVMTCwgMH0sCiAgICAvKgogICAgICogJ21pYicgLT4gJ21pYi0yJyAKICAgICAqLwogICAgeyJSRkMxMTU2LU1JQiIsICJSRkMxMTU4LU1JQiIsIE5VTEwsIDB9LAogICAgLyoKICAgICAqICdzbm1wRW5hYmxlQXV0aFRyYXBzJyAtPiAnc25tcEVuYWJsZUF1dGhlblRyYXBzJyAKICAgICAqLwogICAgeyJSRkMxMTU4LU1JQiIsICJSRkMxMjEzLU1JQiIsIE5VTEwsIDB9LAogICAgLyoKICAgICAqICdudWxsT0lEJyAtPiAnemVyb0RvdFplcm8nIAogICAgICovCiAgICB7IlJGQzExNTUtU01JIiwgIlNOTVB2Mi1TTUkiLCBOVUxMLCAwfSwKICAgIHsiUkZDMTIxMy1NSUIiLCAiU05NUHYyLVNNSSIsICJtaWItMiIsIDB9LAogICAgeyJSRkMxMjEzLU1JQiIsICJTTk1QdjItTUlCIiwgInN5cyIsIDN9LAogICAgeyJSRkMxMjEzLU1JQiIsICJJRi1NSUIiLCAiaWYiLCAyfSwKICAgIHsiUkZDMTIxMy1NSUIiLCAiSVAtTUlCIiwgImlwIiwgMn0sCiAgICB7IlJGQzEyMTMtTUlCIiwgIklQLU1JQiIsICJpY21wIiwgNH0sCiAgICB7IlJGQzEyMTMtTUlCIiwgIlRDUC1NSUIiLCAidGNwIiwgM30sCiAgICB7IlJGQzEyMTMtTUlCIiwgIlVEUC1NSUIiLCAidWRwIiwgM30sCiAgICB7IlJGQzEyMTMtTUlCIiwgIlNOTVB2Mi1TTUkiLCAidHJhbnNtaXNzaW9uIiwgMH0sCiAgICB7IlJGQzEyMTMtTUlCIiwgIlNOTVB2Mi1NSUIiLCAic25tcCIsIDR9LAogICAgeyJSRkMxMjMxLU1JQiIsICJUT0tFTlJJTkctTUlCIiwgTlVMTCwgMH0sCiAgICB7IlJGQzEyNzEtTUlCIiwgIlJNT04tTUlCIiwgTlVMTCwgMH0sCiAgICB7IlJGQzEyODYtTUlCIiwgIlNPVVJDRS1ST1VUSU5HLU1JQiIsICJkb3QxZFNyIiwgN30sCiAgICB7IlJGQzEyODYtTUlCIiwgIkJSSURHRS1NSUIiLCBOVUxMLCAwfSwKICAgIHsiUkZDMTMxNS1NSUIiLCAiRlJBTUUtUkVMQVktRFRFLU1JQiIsIE5VTEwsIDB9LAogICAgeyJSRkMxMzE2LU1JQiIsICJDSEFSQUNURVItTUlCIiwgTlVMTCwgMH0sCiAgICB7IlJGQzE0MDYtTUlCIiwgIkRTMS1NSUIiLCBOVUxMLCAwfSwKICAgIHsiUkZDLTEyMTMiLCAiUkZDMTIxMy1NSUIiLCBOVUxMLCAwfSwKfTsKCiNkZWZpbmUgTU9EVUxFX05PVF9GT1VORAkwCiNkZWZpbmUgTU9EVUxFX0xPQURFRF9PSwkxCiNkZWZpbmUgTU9EVUxFX0FMUkVBRFlfTE9BREVECTIKLyoKICogI2RlZmluZSBNT0RVTEVfTE9BRF9GQUlMRUQgICAzICAgICAgIAogKi8KI2RlZmluZSBNT0RVTEVfTE9BRF9GQUlMRUQJTU9EVUxFX05PVF9GT1VORAoKCiNkZWZpbmUgSEFTSFNJWkUgICAgICAgIDMyCiNkZWZpbmUgQlVDS0VUKHgpICAgICAgICh4ICYgKEhBU0hTSVpFLTEpKQoKI2RlZmluZSBOSEFTSFNJWkUgICAgMTI4CiNkZWZpbmUgTkJVQ0tFVCh4KSAgICh4ICYgKE5IQVNIU0laRS0xKSkKCnN0YXRpYyBzdHJ1Y3QgdG9rICpidWNrZXRzW0hBU0hTSVpFXTsKCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqbmJ1Y2tldHNbTkhBU0hTSVpFXTsKc3RhdGljIHN0cnVjdCB0cmVlICp0YnVja2V0c1tOSEFTSFNJWkVdOwpzdGF0aWMgc3RydWN0IG1vZHVsZSAqbW9kdWxlX2hlYWQgPSBOVUxMOwoKc3RydWN0IG5vZGUgICAgKm9ycGhhbl9ub2RlcyA9IE5VTEw7CnN0cnVjdCB0cmVlICAgICp0cmVlX2hlYWQgPSBOVUxMOwoKI2RlZmluZQlOVU1CRVJfT0ZfUk9PVF9OT0RFUwkzCnN0YXRpYyBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCByb290X2ltcG9ydHNbTlVNQkVSX09GX1JPT1RfTk9ERVNdOwoKc3RhdGljIGludCAgICAgIGN1cnJlbnRfbW9kdWxlID0gMDsKc3RhdGljIGludCAgICAgIG1heF9tb2R1bGUgPSAwOwpzdGF0aWMgaW50ICAgICAgZmlyc3RfZXJyX21vZHVsZSA9IDE7CnN0YXRpYyBjaGFyICAgICpsYXN0X2Vycl9tb2R1bGUgPSAwOyAgICAvKiBubyByZXBlYXRzIG9uICJDYW5ub3QgZmluZCBtb2R1bGUuLi4iICovCgpzdGF0aWMgdm9pZCAgICAgdHJlZV9mcm9tX25vZGUoc3RydWN0IHRyZWUgKnRwLCBzdHJ1Y3Qgbm9kZSAqbnApOwpzdGF0aWMgdm9pZCAgICAgZG9fc3VidHJlZShzdHJ1Y3QgdHJlZSAqLCBzdHJ1Y3Qgbm9kZSAqKik7CnN0YXRpYyB2b2lkICAgICBkb19saW5rdXAoc3RydWN0IG1vZHVsZSAqLCBzdHJ1Y3Qgbm9kZSAqKTsKc3RhdGljIHZvaWQgICAgIGR1bXBfbW9kdWxlX2xpc3Qodm9pZCk7CnN0YXRpYyBpbnQgICAgICBnZXRfdG9rZW4oRklMRSAqLCBjaGFyICosIGludCk7CnN0YXRpYyBpbnQgICAgICBwYXJzZVF1b3RlU3RyaW5nKEZJTEUgKiwgY2hhciAqLCBpbnQpOwpzdGF0aWMgaW50ICAgICAgdG9zc09iamVjdElkZW50aWZpZXIoRklMRSAqKTsKc3RhdGljIGludCAgICAgIG5hbWVfaGFzaChjb25zdCBjaGFyICopOwpzdGF0aWMgdm9pZCAgICAgaW5pdF9ub2RlX2hhc2goc3RydWN0IG5vZGUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9lcnJvcihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKc3RhdGljIHZvaWQgICAgIGZyZWVfdHJlZShzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIGZyZWVfcGFydGlhbF90cmVlKHN0cnVjdCB0cmVlICosIGludCk7CnN0YXRpYyB2b2lkICAgICBmcmVlX25vZGUoc3RydWN0IG5vZGUgKik7CnN0YXRpYyB2b2lkICAgICBidWlsZF90cmFuc2xhdGlvbl90YWJsZSh2b2lkKTsKc3RhdGljIHZvaWQgICAgIGluaXRfdHJlZV9yb290cyh2b2lkKTsKc3RhdGljIHZvaWQgICAgIG1lcmdlX2Fub25fY2hpbGRyZW4oc3RydWN0IHRyZWUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICB1bmxpbmtfdGJ1Y2tldChzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHVubGlua190cmVlKHN0cnVjdCB0cmVlICopOwpzdGF0aWMgaW50ICAgICAgZ2V0b2lkKEZJTEUgKiwgc3RydWN0IHN1YmlkX3MgKiwgaW50KTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9vYmplY3RpZChGSUxFICosIGNoYXIgKik7CnN0YXRpYyBpbnQgICAgICBnZXRfdGMoY29uc3QgY2hhciAqLCBpbnQsIGludCAqLCBzdHJ1Y3QgZW51bV9saXN0ICoqLAogICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICoqLCBjaGFyICoqKTsKc3RhdGljIGludCAgICAgIGdldF90Y19pbmRleChjb25zdCBjaGFyICosIGludCk7CnN0YXRpYyBzdHJ1Y3QgZW51bV9saXN0ICpwYXJzZV9lbnVtbGlzdChGSUxFICosIHN0cnVjdCBlbnVtX2xpc3QgKiopOwpzdGF0aWMgc3RydWN0IHJhbmdlX2xpc3QgKnBhcnNlX3JhbmdlcyhGSUxFICogZnAsIHN0cnVjdCByYW5nZV9saXN0ICoqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9hc250eXBlKEZJTEUgKiwgY2hhciAqLCBpbnQgKiwgY2hhciAqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9vYmplY3R0eXBlKEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9vYmplY3Rncm91cChGSUxFICosIGNoYXIgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmpncm91cCAqKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2Vfbm90aWZpY2F0aW9uRGVmaW5pdGlvbihGSUxFICosIGNoYXIgKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2VfdHJhcERlZmluaXRpb24oRklMRSAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX2NvbXBsaWFuY2UoRklMRSAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX2NhcGFiaWxpdGllcyhGSUxFICosIGNoYXIgKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2VfbW9kdWxlSWRlbnRpdHkoRklMRSAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX21hY3JvKEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIHZvaWQgICAgIHBhcnNlX2ltcG9ydHMoRklMRSAqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZShGSUxFICosIHN0cnVjdCBub2RlICopOwoKc3RhdGljIGludCAgICAgcmVhZF9tb2R1bGVfaW50ZXJuYWwoY29uc3QgY2hhciAqKTsKc3RhdGljIGludCAgICAgcmVhZF9tb2R1bGVfcmVwbGFjZW1lbnRzKGNvbnN0IGNoYXIgKik7CnN0YXRpYyBpbnQgICAgIHJlYWRfaW1wb3J0X3JlcGxhY2VtZW50cyhjb25zdCBjaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1vZHVsZV9pbXBvcnQgKik7CgpzdGF0aWMgdm9pZCAgICAgbmV3X21vZHVsZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CgpzdGF0aWMgc3RydWN0IG5vZGUgKm1lcmdlX3BhcnNlX29iamVjdGlkKHN0cnVjdCBub2RlICosIEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIHN0cnVjdCBpbmRleF9saXN0ICpnZXRJbmRleGVzKEZJTEUgKiBmcCwgc3RydWN0IGluZGV4X2xpc3QgKiopOwpzdGF0aWMgc3RydWN0IHZhcmJpbmRfbGlzdCAqZ2V0VmFyYmluZHMoRklMRSAqIGZwLCBzdHJ1Y3QgdmFyYmluZF9saXN0ICoqKTsKc3RhdGljIHZvaWQgICAgIGZyZWVfaW5kZXhlcyhzdHJ1Y3QgaW5kZXhfbGlzdCAqKik7CnN0YXRpYyB2b2lkICAgICBmcmVlX3ZhcmJpbmRzKHN0cnVjdCB2YXJiaW5kX2xpc3QgKiopOwpzdGF0aWMgdm9pZCAgICAgZnJlZV9yYW5nZXMoc3RydWN0IHJhbmdlX2xpc3QgKiopOwpzdGF0aWMgdm9pZCAgICAgZnJlZV9lbnVtcyhzdHJ1Y3QgZW51bV9saXN0ICoqKTsKc3RhdGljIHN0cnVjdCByYW5nZV9saXN0ICpjb3B5X3JhbmdlcyhzdHJ1Y3QgcmFuZ2VfbGlzdCAqKTsKc3RhdGljIHN0cnVjdCBlbnVtX2xpc3QgKmNvcHlfZW51bXMoc3RydWN0IGVudW1fbGlzdCAqKTsKCnN0YXRpYyB1X2ludCAgICBjb21wdXRlX21hdGNoKGNvbnN0IGNoYXIgKnNlYXJjaF9iYXNlLCBjb25zdCBjaGFyICprZXkpOwoKdm9pZApzbm1wX21pYl90b2dnbGVfb3B0aW9uc191c2FnZShjb25zdCBjaGFyICpsZWFkLCBGSUxFICogb3V0ZikKewogICAgZnByaW50ZihvdXRmLCAiJXN1OiAgJXNhbGxvdyB0aGUgdXNlIG9mIHVuZGVybGluZXMgaW4gTUlCIHN5bWJvbHNcbiIsCiAgICAgICAgICAgIGxlYWQsICgobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMKSkgPwoJCSAgICJkaXMiIDogIiIpKTsKICAgIGZwcmludGYob3V0ZiwgIiVzYzogICVzYWxsb3cgdGhlIHVzZSBvZiBcIi0tXCIgdG8gdGVybWluYXRlIGNvbW1lbnRzXG4iLAogICAgICAgICAgICBsZWFkLCAoKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAoJCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pKSA/CgkJICAgIiIgOiAiZGlzIikpOwoKICAgIGZwcmludGYob3V0ZiwgIiVzZDogICVzc2F2ZSB0aGUgREVTQ1JJUFRJT05zIG9mIHRoZSBNSUIgb2JqZWN0c1xuIiwKICAgICAgICAgICAgbGVhZCwgKChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgPwoJCSAgICJkbyBub3QgIiA6ICIiKSk7CgogICAgZnByaW50ZihvdXRmLCAiJXNlOiAgZGlzYWJsZSBlcnJvcnMgd2hlbiBNSUIgc3ltYm9scyBjb25mbGljdFxuIiwgbGVhZCk7CgogICAgZnByaW50ZihvdXRmLCAiJXN3OiAgZW5hYmxlIHdhcm5pbmdzIHdoZW4gTUlCIHN5bWJvbHMgY29uZmxpY3RcbiIsIGxlYWQpOwoKICAgIGZwcmludGYob3V0ZiwgIiVzVzogIGVuYWJsZSBkZXRhaWxlZCB3YXJuaW5ncyB3aGVuIE1JQiBzeW1ib2xzIGNvbmZsaWN0XG4iLAogICAgICAgICAgICBsZWFkKTsKCiAgICBmcHJpbnRmKG91dGYsICIlc1I6ICByZXBsYWNlIE1JQiBzeW1ib2xzIGZyb20gbGF0ZXN0IG1vZHVsZVxuIiwgbGVhZCk7Cn0KCmNoYXIgICAgICAgICAgICoKc25tcF9taWJfdG9nZ2xlX29wdGlvbnMoY2hhciAqb3B0aW9ucykKewogICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICB3aGlsZSAoKm9wdGlvbnMpIHsKICAgICAgICAgICAgc3dpdGNoICgqb3B0aW9ucykgewogICAgICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfUEFSU0VfTEFCRUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ2MnOgogICAgICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkJICBORVRTTk1QX0RTX0xJQl9NSUJfQ09NTUVOVF9URVJNKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKCQkJCQkgIE5FVFNOTVBfRFNfTElCX01JQl9FUlJPUlMpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MsIDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdXJzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MsIDIpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCQkgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUyk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ1InOgogICAgICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgTkVUU05NUF9EU19MSUJfTUlCX1JFUExBQ0UpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHJldHVybiBhdCB0aGUgdW5rbm93biBvcHRpb24gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wdGlvbnMrKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKc3RhdGljIGludApuYW1lX2hhc2goY29uc3QgY2hhciAqbmFtZSkKewogICAgaW50ICAgICAgICAgICAgIGhhc2ggPSAwOwogICAgY29uc3QgY2hhciAgICAgKmNwOwoKICAgIGlmICghbmFtZSkKICAgICAgICByZXR1cm4gMDsKICAgIGZvciAoY3AgPSBuYW1lOyAqY3A7IGNwKyspCiAgICAgICAgaGFzaCArPSB0b2xvd2VyKCpjcCk7CiAgICByZXR1cm4gKGhhc2gpOwp9Cgp2b2lkCm5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKHZvaWQpCnsKICAgIHJlZ2lzdGVyIHN0cnVjdCB0b2sgKnRwOwogICAgcmVnaXN0ZXIgaW50ICAgIGIsIGk7CiAgICBpbnQgICAgICAgICAgICAgbWF4X21vZGM7CgogICAgaWYgKHRyZWVfaGVhZCkKICAgICAgICByZXR1cm47CgogICAgLyoKICAgICAqIFNldCB1cCBoYXNoIGxpc3Qgb2YgcHJlLWRlZmluZWQgdG9rZW5zCiAgICAgKi8KICAgIG1lbXNldChidWNrZXRzLCAwLCBzaXplb2YoYnVja2V0cykpOwogICAgZm9yICh0cCA9IHRva2VuczsgdHAtPm5hbWU7IHRwKyspIHsKICAgICAgICB0cC0+aGFzaCA9IG5hbWVfaGFzaCh0cC0+bmFtZSk7CiAgICAgICAgYiA9IEJVQ0tFVCh0cC0+aGFzaCk7CiAgICAgICAgaWYgKGJ1Y2tldHNbYl0pCiAgICAgICAgICAgIHRwLT5uZXh0ID0gYnVja2V0c1tiXTsgICAgICAvKiBCVUcgPz8/ICovCiAgICAgICAgYnVja2V0c1tiXSA9IHRwOwogICAgfQoKICAgIC8qCiAgICAgKiBJbml0aWFsaXNlIG90aGVyIGludGVybmFsIHN0cnVjdHVyZXMKICAgICAqLwoKICAgIG1heF9tb2RjID0gc2l6ZW9mKG1vZHVsZV9tYXApIC8gc2l6ZW9mKG1vZHVsZV9tYXBbMF0pIC0gMTsKICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfbW9kYzsgKytpKQogICAgICAgIG1vZHVsZV9tYXBbaV0ubmV4dCA9ICYobW9kdWxlX21hcFtpICsgMV0pOwogICAgbW9kdWxlX21hcFttYXhfbW9kY10ubmV4dCA9IE5VTEw7CiAgICBtb2R1bGVfbWFwX2hlYWQgPSBtb2R1bGVfbWFwOwoKICAgIG1lbXNldChuYnVja2V0cywgMCwgc2l6ZW9mKG5idWNrZXRzKSk7CiAgICBtZW1zZXQodGJ1Y2tldHMsIDAsIHNpemVvZih0YnVja2V0cykpOwogICAgbWVtc2V0KHRjbGlzdCwgMCwgTUFYVEMgKiBzaXplb2Yoc3RydWN0IHRjKSk7CiAgICBidWlsZF90cmFuc2xhdGlvbl90YWJsZSgpOwogICAgaW5pdF90cmVlX3Jvb3RzKCk7ICAgICAgICAgIC8qIFNldCB1cCBpbml0aWFsIHJvb3RzICovCiAgICAvKgogICAgICogUmVsaWVzIG9uICdhZGRfbWliZGlyJyBoYXZpbmcgc2V0IHVwIHRoZSBtb2R1bGVzIAogICAgICovCn0KCiNpZm5kZWYgTkVUU05NUF9DTEVBTl9OQU1FU1BBQ0UKdm9pZAppbml0X21pYl9pbnRlcm5hbHModm9pZCkKewogICAgbmV0c25tcF9pbml0X21pYl9pbnRlcm5hbHMoKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkCmluaXRfbm9kZV9oYXNoKHN0cnVjdCBub2RlICpub2RlcykKewogICAgc3RydWN0IG5vZGUgICAgKm5wLCAqbmV4dHA7CiAgICBpbnQgICAgICAgICAgICAgaGFzaDsKCiAgICBtZW1zZXQobmJ1Y2tldHMsIDAsIHNpemVvZihuYnVja2V0cykpOwogICAgZm9yIChucCA9IG5vZGVzOyBucDspIHsKICAgICAgICBuZXh0cCA9IG5wLT5uZXh0OwogICAgICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaChucC0+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+bG93LCAodW5zaWduZWQpcnAtPmhpZ2gpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAvKiBObyBvdGhlciByYW5nZSB0eXBlcyBhbGxvd2VkICovCiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCiNpZmRlZiBURVNUCnN0YXRpYyB2b2lkCnByaW50X25vZGVzKEZJTEUgKiBmcCwgc3RydWN0IG5vZGUgKnJvb3QpCnsKICAgIGV4dGVybiB2b2lkICAgICB4bWFsbG9jX3N0YXRzKEZJTEUgKik7CiAgICBzdHJ1Y3QgZW51bV9saXN0ICplcDsKICAgIHN0cnVjdCBpbmRleF9saXN0ICppcDsKICAgIHN0cnVjdCByYW5nZV9saXN0ICpycDsKICAgIHN0cnVjdCB2YXJiaW5kX2xpc3QgKnZwOwogICAgc3RydWN0IG5vZGUgICAgKm5wOwoKICAgIGZvciAobnAgPSByb290OyBucDsgbnAgPSBucC0+bmV4dCkgewogICAgICAgIGZwcmludGYoZnAsICIlcyA6Oj0geyAlcyAlbGQgfSAoJWQpXG4iLCBucC0+bGFiZWwsIG5wLT5wYXJlbnQsCiAgICAgICAgICAgICAgICBucC0+c3ViaWQsIG5wLT50eXBlKTsKICAgICAgICBpZiAobnAtPnRjX2luZGV4ID49IDApCiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIFRDID0gJXNcbiIsIHRjbGlzdFtucC0+dGNfaW5kZXhdLmRlc2NyaXB0b3IpOwogICAgICAgIGlmIChucC0+ZW51bXMpIHsKICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgRW51bXM6IFxuIik7CiAgICAgICAgICAgIGZvciAoZXAgPSBucC0+ZW51bXM7IGVwOyBlcCA9IGVwLT5uZXh0KSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiICAgICVzKCVkKVxuIiwgZXAtPmxhYmVsLCBlcC0+dmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChucC0+cmFuZ2VzKSB7CiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIFJhbmdlczogIik7CiAgICAgICAgICAgIGZvciAocnAgPSBucC0+cmFuZ2VzOyBycDsgcnAgPSBycC0+bmV4dCkgewogICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlxuICAgICIpOwogICAgICAgICAgICAgICAgcHJpbnRfcmFuZ2VfdmFsdWUoZnAsIG5wLT50eXBlLCBycCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnByaW50ZihmcCwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChucC0+aW5kZXhlcykgewogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBJbmRleGVzOiBcbiIpOwogICAgICAgICAgICBmb3IgKGlwID0gbnAtPmluZGV4ZXM7IGlwOyBpcCA9IGlwLT5uZXh0KSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiICAgICVzXG4iLCBpcC0+aWxhYmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobnAtPmF1Z21lbnRzKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBBdWdtZW50czogJXNcbiIsIG5wLT5hdWdtZW50cyk7CiAgICAgICAgaWYgKG5wLT52YXJiaW5kcykgewogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBWYXJiaW5kczogXG4iKTsKICAgICAgICAgICAgZm9yICh2cCA9IG5wLT52YXJiaW5kczsgdnA7IHZwID0gdnAtPm5leHQpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgICAgJXNcbiIsIHZwLT52YmxhYmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobnAtPmhpbnQpCiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIEhpbnQ6ICVzXG4iLCBucC0+aGludCk7CiAgICAgICAgaWYgKG5wLT51bml0cykKICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgVW5pdHM6ICVzXG4iLCBucC0+dW5pdHMpOwogICAgICAgIGlmIChucC0+ZGVmYXVsdFZhbHVlKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBEZWZhdWx0VmFsdWU6ICVzXG4iLCBucC0+ZGVmYXVsdFZhbHVlKTsKICAgIH0KfQojZW5kaWYKCnZvaWQKcHJpbnRfc3VidHJlZShGSUxFICogZiwgc3RydWN0IHRyZWUgKnRyZWUsIGludCBjb3VudCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgaW50ICAgICAgICAgICAgIGk7CiAgICBjaGFyICAgICAgICAgICAgbW9kYnVmWzI1Nl07CgogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgICAgZnByaW50ZihmLCAiICAiKTsKICAgIGZwcmludGYoZiwgIkNoaWxkcmVuIG9mICVzKCVsZCk6XG4iLCB0cmVlLT5sYWJlbCwgdHJlZS0+c3ViaWQpOwogICAgY291bnQrKzsKICAgIGZvciAodHAgPSB0cmVlLT5jaGlsZF9saXN0OyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgICAgICAgIGZwcmludGYoZiwgIiAgIik7CiAgICAgICAgZnByaW50ZihmLCAiJXM6JXMoJWxkKSB0eXBlPSVkIiwKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lKHRwLT5tb2R1bGVfbGlzdFswXSwgbW9kYnVmKSwKICAgICAgICAgICAgICAgIHRwLT5sYWJlbCwgdHAtPnN1YmlkLCB0cC0+dHlwZSk7CiAgICAgICAgaWYgKHRwLT50Y19pbmRleCAhPSAtMSkKICAgICAgICAgICAgZnByaW50ZihmLCAiIHRjPSVkIiwgdHAtPnRjX2luZGV4KTsKICAgICAgICBpZiAodHAtPmhpbnQpCiAgICAgICAgICAgIGZwcmludGYoZiwgIiBoaW50PSVzIiwgdHAtPmhpbnQpOwogICAgICAgIGlmICh0cC0+dW5pdHMpCiAgICAgICAgICAgIGZwcmludGYoZiwgIiB1bml0cz0lcyIsIHRwLT51bml0cyk7CiAgICAgICAgaWYgKHRwLT5udW1iZXJfbW9kdWxlcyA+IDEpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiIG1vZHVsZXM6Iik7CiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCB0cC0+bnVtYmVyX21vZHVsZXM7IGkrKykKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAlcyIsIG1vZHVsZV9uYW1lKHRwLT5tb2R1bGVfbGlzdFtpXSwgbW9kYnVmKSk7CiAgICAgICAgfQogICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICB9CiAgICBmb3IgKHRwID0gdHJlZS0+Y2hpbGRfbGlzdDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikgewogICAgICAgIGlmICh0cC0+Y2hpbGRfbGlzdCkKICAgICAgICAgICAgcHJpbnRfc3VidHJlZShmLCB0cCwgY291bnQpOwogICAgfQp9Cgp2b2lkCnByaW50X2FzY2lpX2R1bXBfdHJlZShGSUxFICogZiwgc3RydWN0IHRyZWUgKnRyZWUsIGludCBjb3VudCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwOwoKICAgIGNvdW50Kys7CiAgICBmb3IgKHRwID0gdHJlZS0+Y2hpbGRfbGlzdDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikgewogICAgICAgIGZwcmludGYoZiwgIiVzIE9CSkVDVCBJREVOVElGSUVSIDo6PSB7ICVzICVsZCB9XG4iLCB0cC0+bGFiZWwsCiAgICAgICAgICAgICAgICB0cmVlLT5sYWJlbCwgdHAtPnN1YmlkKTsKICAgIH0KICAgIGZvciAodHAgPSB0cmVlLT5jaGlsZF9saXN0OyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgaWYgKHRwLT5jaGlsZF9saXN0KQogICAgICAgICAgICBwcmludF9hc2NpaV9kdW1wX3RyZWUoZiwgdHAsIGNvdW50KTsKICAgIH0KfQoKc3RhdGljIGludCAgICAgIHRyYW5zbGF0aW9uX3RhYmxlWzI1Nl07CgpzdGF0aWMgdm9pZApidWlsZF90cmFuc2xhdGlvbl90YWJsZSgpCnsKICAgIGludCAgICAgICAgICAgICBjb3VudDsKCiAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNTY7IGNvdW50KyspIHsKICAgICAgICBzd2l0Y2ggKGNvdW50KSB7CiAgICAgICAgY2FzZSBPQkpJRDoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9PQkpJRDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPQ1RFVFNUUjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9PQ1RFVFNUUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBJTlRFR0VSOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX0lOVEVHRVI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTkVUQUREUjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9ORVRBRERSOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElQQUREUjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9JUEFERFI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ09VTlRFUjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9DT1VOVEVSOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEdBVUdFOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX0dBVUdFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRJTUVUSUNLUzoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9USU1FVElDS1M7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgS1dfT1BBUVVFOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX09QQVFVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOVUw6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTlVMTDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDT1VOVEVSNjQ6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfQ09VTlRFUjY0OwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEJJVFNUUklORzoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9CSVRTVFJJTkc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTlNBUEFERFJFU1M6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTlNBUEFERFJFU1M7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSU5URUdFUjMyOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX0lOVEVHRVIzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBVSU5URUdFUjMyOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX1VJTlRFR0VSOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFVOU0lHTkVEMzI6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfVU5TSUdORUQzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUUkFQVFlQRToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9UUkFQVFlQRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOT1RJRlRZUEU6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTk9USUZUWVBFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5PVElGR1JPVVA6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTk9USUZHUk9VUDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPQkpHUk9VUDoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9PQkpHUk9VUDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNT0RVTEVJREVOVElUWToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9NT0RJRDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPQkpJREVOVElUWToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9PQkpJREVOVElUWTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBR0VOVENBUDoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9BR0VOVENBUDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDT01QTElBTkNFOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX01PRENPTVA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfT1RIRVI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQKaW5pdF90cmVlX3Jvb3RzKCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwLCAqbGFzdHRwOwogICAgaW50ICAgICAgICAgICAgIGJhc2VfbW9kaWQ7CiAgICBpbnQgICAgICAgICAgICAgaGFzaDsKCiAgICBiYXNlX21vZGlkID0gd2hpY2hfbW9kdWxlKCJTTk1QdjItU01JIik7CiAgICBpZiAoYmFzZV9tb2RpZCA9PSAtMSkKICAgICAgICBiYXNlX21vZGlkID0gd2hpY2hfbW9kdWxlKCJSRkMxMTU1LVNNSSIpOwogICAgaWYgKGJhc2VfbW9kaWQgPT0gLTEpCiAgICAgICAgYmFzZV9tb2RpZCA9IHdoaWNoX21vZHVsZSgiUkZDMTIxMy1NSUIiKTsKCiAgICAvKgogICAgICogYnVpbGQgcm9vdCBub2RlIAogICAgICovCiAgICB0cCA9IChzdHJ1Y3QgdHJlZSAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0cmVlKSk7CiAgICBpZiAodHAgPT0gTlVMTCkKICAgICAgICByZXR1cm47CiAgICB0cC0+bGFiZWwgPSBzdHJkdXAoImpvaW50LWlzby1jY2l0dCIpOwogICAgdHAtPm1vZGlkID0gYmFzZV9tb2RpZDsKICAgIHRwLT5udW1iZXJfbW9kdWxlcyA9IDE7CiAgICB0cC0+bW9kdWxlX2xpc3QgPSAmKHRwLT5tb2RpZCk7CiAgICB0cC0+c3ViaWQgPSAyOwogICAgdHAtPnRjX2luZGV4ID0gLTE7CiAgICBzZXRfZnVuY3Rpb24odHApOyAgICAgICAgICAgLyogZnJvbSBtaWIuYyAqLwogICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKHRwLT5sYWJlbCkpOwogICAgdHAtPm5leHQgPSB0YnVja2V0c1toYXNoXTsKICAgIHRidWNrZXRzW2hhc2hdID0gdHA7CiAgICBsYXN0dHAgPSB0cDsKICAgIHJvb3RfaW1wb3J0c1swXS5sYWJlbCA9IHN0cmR1cCh0cC0+bGFiZWwpOwogICAgcm9vdF9pbXBvcnRzWzBdLm1vZGlkID0gYmFzZV9tb2RpZDsKCiAgICAvKgogICAgICogYnVpbGQgcm9vdCBub2RlIAogICAgICovCiAgICB0cCA9IChzdHJ1Y3QgdHJlZSAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0cmVlKSk7CiAgICBpZiAodHAgPT0gTlVMTCkKICAgICAgICByZXR1cm47CiAgICB0cC0+bmV4dF9wZWVyID0gbGFzdHRwOwogICAgdHAtPmxhYmVsID0gc3RyZHVwKCJjY2l0dCIpOwogICAgdHAtPm1vZGlkID0gYmFzZV9tb2RpZDsKICAgIHRwLT5udW1iZXJfbW9kdWxlcyA9IDE7CiAgICB0cC0+bW9kdWxlX2xpc3QgPSAmKHRwLT5tb2RpZCk7CiAgICB0cC0+c3ViaWQgPSAwOwogICAgdHAtPnRjX2luZGV4ID0gLTE7CiAgICBzZXRfZnVuY3Rpb24odHApOyAgICAgICAgICAgLyogZnJvbSBtaWIuYyAqLwogICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKHRwLT5sYWJlbCkpOwogICAgdHAtPm5leHQgPSB0YnVja2V0c1toYXNoXTsKICAgIHRidWNrZXRzW2hhc2hdID0gdHA7CiAgICBsYXN0dHAgPSB0cDsKICAgIHJvb3RfaW1wb3J0c1sxXS5sYWJlbCA9IHN0cmR1cCh0cC0+bGFiZWwpOwogICAgcm9vdF9pbXBvcnRzWzFdLm1vZGlkID0gYmFzZV9tb2RpZDsKCiAgICAvKgogICAgICogYnVpbGQgcm9vdCBub2RlIAogICAgICovCiAgICB0cCA9IChzdHJ1Y3QgdHJlZSAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0cmVlKSk7CiAgICBpZiAodHAgPT0gTlVMTCkKICAgICAgICByZXR1cm47CiAgICB0cC0+bmV4dF9wZWVyID0gbGFzdHRwOwogICAgdHAtPmxhYmVsID0gc3RyZHVwKCJpc28iKTsKICAgIHRwLT5tb2RpZCA9IGJhc2VfbW9kaWQ7CiAgICB0cC0+bnVtYmVyX21vZHVsZXMgPSAxOwogICAgdHAtPm1vZHVsZV9saXN0ID0gJih0cC0+bW9kaWQpOwogICAgdHAtPnN1YmlkID0gMTsKICAgIHRwLT50Y19pbmRleCA9IC0xOwogICAgc2V0X2Z1bmN0aW9uKHRwKTsgICAgICAgICAgIC8qIGZyb20gbWliLmMgKi8KICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaCh0cC0+bGFiZWwpKTsKICAgIHRwLT5uZXh0ID0gdGJ1Y2tldHNbaGFzaF07CiAgICB0YnVja2V0c1toYXNoXSA9IHRwOwogICAgbGFzdHRwID0gdHA7CiAgICByb290X2ltcG9ydHNbMl0ubGFiZWwgPSBzdHJkdXAodHAtPmxhYmVsKTsKICAgIHJvb3RfaW1wb3J0c1syXS5tb2RpZCA9IGJhc2VfbW9kaWQ7CgogICAgdHJlZV9oZWFkID0gdHA7Cn0KCiNpZmRlZiBTVFJJQ1RfTUlCX1BBUlNFSU5HCiNkZWZpbmUJbGFiZWxfY29tcGFyZQlzdHJjYXNlY21wCiNlbHNlCiNkZWZpbmUJbGFiZWxfY29tcGFyZQlzdHJjbXAKI2VuZGlmCgoKc3RydWN0IHRyZWUgICAgKgpmaW5kX3RyZWVfbm9kZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kaWQpCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCwgKmhlYWR0cDsKICAgIGludCAgICAgICAgICAgICBjb3VudCwgKmludF9wOwoKICAgIGlmICghbmFtZSB8fCAhKm5hbWUpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKCiAgICBoZWFkdHAgPSB0YnVja2V0c1tOQlVDS0VUKG5hbWVfaGFzaChuYW1lKSldOwogICAgZm9yICh0cCA9IGhlYWR0cDsgdHA7IHRwID0gdHAtPm5leHQpIHsKICAgICAgICBpZiAodHAtPmxhYmVsICYmICFsYWJlbF9jb21wYXJlKHRwLT5sYWJlbCwgbmFtZSkpIHsKCiAgICAgICAgICAgIGlmIChtb2RpZCA9PSAtMSkgICAgLyogQW55IG1vZHVsZSAqLwogICAgICAgICAgICAgICAgcmV0dXJuICh0cCk7CgogICAgICAgICAgICBmb3IgKGludF9wID0gdHAtPm1vZHVsZV9saXN0LCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgY291bnQgPCB0cC0+bnVtYmVyX21vZHVsZXM7ICsrY291bnQsICsraW50X3ApCiAgICAgICAgICAgICAgICBpZiAoKmludF9wID09IG1vZGlkKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKE5VTEwpOwp9CgovKgogKiBjb21wdXRlcyBhIHZhbHVlIHdoaWNoIHJlcHJlc2VudHMgaG93IGNsb3NlIG5hbWUxIGlzIHRvIG5hbWUyLgogKiAqIGhpZ2ggc2NvcmVzIG1lYW4gYSB3b3JzZSBtYXRjaC4KICogKiAoeWVzLCB0aGUgYWxnb3JpdGhtIHN1Y2tzISkKICovCiNkZWZpbmUgTUFYX0JBRCAweGZmZmZmZgoKc3RhdGljICAgICAgICAgIHVfaW50CmNvbXB1dGVfbWF0Y2goY29uc3QgY2hhciAqc2VhcmNoX2Jhc2UsIGNvbnN0IGNoYXIgKmtleSkKewojaWYgZGVmaW5lZChIQVZFX1JFR0VYX0gpICYmIGRlZmluZWQoSEFWRV9SRUdDT01QKQogICAgaW50ICAgICAgICAgICAgIHJjOwogICAgcmVnZXhfdCAgICAgICAgIHBhcnNldHJlZTsKICAgIHJlZ21hdGNoX3QgICAgICBwbWF0Y2g7CiAgICByYyA9IHJlZ2NvbXAoJnBhcnNldHJlZSwga2V5LCBSRUdfSUNBU0UgfCBSRUdfRVhURU5ERUQpOwogICAgaWYgKHJjID09IDApCiAgICAgICAgcmMgPSByZWdleGVjKCZwYXJzZXRyZWUsIHNlYXJjaF9iYXNlLCAxLCAmcG1hdGNoLCAwKTsKICAgIHJlZ2ZyZWUoJnBhcnNldHJlZSk7CiAgICBpZiAocmMgPT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogZm91bmQgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuIHBtYXRjaC5ybV9zbzsKICAgIH0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2Ugb3VyIG93biB3aWxkY2FyZCBtYXRjaGVyICovCiAgICAvKgogICAgICogZmlyc3QgZmluZCB0aGUgbG9uZ2VzdCBtYXRjaGluZyBzdWJzdHJpbmcgKGljaykgCiAgICAgKi8KICAgIGNoYXIgICAgICAgICAgICpmaXJzdCA9IE5VTEwsICpyZXN1bHQgPSBOVUxMLCAqZW50cnk7CiAgICBjb25zdCBjaGFyICAgICAqcG9zaXRpb247CiAgICBjaGFyICAgICAgICAgICAqbmV3a2V5ID0gc3RyZHVwKGtleSk7CiAgICBjaGFyICAgICAgICAgICAqc3Q7CgoKICAgIGVudHJ5ID0gc3RydG9rX3IobmV3a2V5LCAiKiIsICZzdCk7CiAgICBwb3NpdGlvbiA9IHNlYXJjaF9iYXNlOwogICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgcmVzdWx0ID0gc3RyY2FzZXN0cihwb3NpdGlvbiwgZW50cnkpOwoKICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKICAgICAgICAgICAgZnJlZShuZXdrZXkpOwogICAgICAgICAgICByZXR1cm4gTUFYX0JBRDsKICAgICAgICB9CgogICAgICAgIGlmIChmaXJzdCA9PSBOVUxMKQogICAgICAgICAgICBmaXJzdCA9IHJlc3VsdDsKCiAgICAgICAgcG9zaXRpb24gPSByZXN1bHQgKyBzdHJsZW4oZW50cnkpOwogICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgIioiLCAmc3QpOwogICAgfQogICAgZnJlZShuZXdrZXkpOwogICAgaWYgKHJlc3VsdCkKICAgICAgICByZXR1cm4gKGZpcnN0IC0gc2VhcmNoX2Jhc2UpOwojZW5kaWYKCiAgICAvKgogICAgICogbm90IGZvdW5kIAogICAgICovCiAgICByZXR1cm4gTUFYX0JBRDsKfQoKLyoKICogRmluZCB0aGUgdHJlZSBub2RlIHRoYXQgYmVzdCBtYXRjaGVzIHRoZSBwYXR0ZXJuIHN0cmluZy4KICogVXNlIHRoZSAicmVwb3J0ZWQiIGZsYWcgc3VjaCB0aGF0IG9ubHkgb25lIG1hdGNoCiAqIGlzIGF0dGVtcHRlZCBmb3IgZXZlcnkgbm9kZS4KICoKICogV2FybmluZyEgVGhpcyBmdW5jdGlvbiBtYXkgcmVjdXJzZS4KICoKICogQ2FsbGVyIF9tdXN0XyBpbnZva2UgY2xlYXJfdHJlZV9mbGFncyBiZWZvcmUgZmlyc3QgY2FsbAogKiB0byB0aGlzIGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzCiAqIHRvIGVuc3VyZSB0aGF0IHRoZSBlbnRpcmUgdHJlZSBpcyB0cmF2ZXJzZWQuCiAqLwoKc3RydWN0IHRyZWUgICAgKgpmaW5kX2Jlc3RfdHJlZV9ub2RlKGNvbnN0IGNoYXIgKnBhdHRybiwgc3RydWN0IHRyZWUgKnRyZWVfdG9wLAogICAgICAgICAgICAgICAgICAgIHVfaW50ICogbWF0Y2gpCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCwgKmJlc3Rfc29fZmFyID0gTlVMTCwgKnJldHB0cjsKICAgIHVfaW50ICAgICAgICAgICBvbGRfbWF0Y2ggPSBNQVhfQkFELCBuZXdfbWF0Y2ggPSBNQVhfQkFEOwoKICAgIGlmICghcGF0dHJuIHx8ICEqcGF0dHJuKQogICAgICAgIHJldHVybiAoTlVMTCk7CgogICAgaWYgKCF0cmVlX3RvcCkKICAgICAgICB0cmVlX3RvcCA9IGdldF90cmVlX2hlYWQoKTsKCiAgICBmb3IgKHRwID0gdHJlZV90b3A7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpIHsKICAgICAgICBpZiAoIXRwLT5yZXBvcnRlZCAmJiB0cC0+bGFiZWwpCiAgICAgICAgICAgIG5ld19tYXRjaCA9IGNvbXB1dGVfbWF0Y2godHAtPmxhYmVsLCBwYXR0cm4pOwogICAgICAgIHRwLT5yZXBvcnRlZCA9IDE7CgogICAgICAgIGlmIChuZXdfbWF0Y2ggPCBvbGRfbWF0Y2gpIHsKICAgICAgICAgICAgYmVzdF9zb19mYXIgPSB0cDsKICAgICAgICAgICAgb2xkX21hdGNoID0gbmV3X21hdGNoOwogICAgICAgIH0KICAgICAgICBpZiAobmV3X21hdGNoID09IDApCiAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogdGhpcyBpcyB0aGUgYmVzdCByZXN1bHQgd2UgY2FuIGdldCAqLwogICAgICAgIGlmICh0cC0+Y2hpbGRfbGlzdCkgewogICAgICAgICAgICByZXRwdHIgPQogICAgICAgICAgICAgICAgZmluZF9iZXN0X3RyZWVfbm9kZShwYXR0cm4sIHRwLT5jaGlsZF9saXN0LCAmbmV3X21hdGNoKTsKICAgICAgICAgICAgaWYgKG5ld19tYXRjaCA8IG9sZF9tYXRjaCkgewogICAgICAgICAgICAgICAgYmVzdF9zb19mYXIgPSByZXRwdHI7CiAgICAgICAgICAgICAgICBvbGRfbWF0Y2ggPSBuZXdfbWF0Y2g7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5ld19tYXRjaCA9PSAwKQogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIHRoaXMgaXMgdGhlIGJlc3QgcmVzdWx0IHdlIGNhbiBnZXQgKi8KICAgICAgICB9CiAgICB9CiAgICBpZiAobWF0Y2gpCiAgICAgICAgKm1hdGNoID0gb2xkX21hdGNoOwogICAgcmV0dXJuIChiZXN0X3NvX2Zhcik7Cn0KCgpzdGF0aWMgdm9pZAptZXJnZV9hbm9uX2NoaWxkcmVuKHN0cnVjdCB0cmVlICp0cDEsIHN0cnVjdCB0cmVlICp0cDIpCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogTkI6IHRwMSBpcyB0aGUgJ2Fub255bW91cycgbm9kZSAKICAgICAgICAgICAgICAgICAqLwp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqY2hpbGQxLCAqY2hpbGQyLCAqcHJldmlvdXM7CgogICAgZm9yIChjaGlsZDEgPSB0cDEtPmNoaWxkX2xpc3Q7IGNoaWxkMTspIHsKCiAgICAgICAgZm9yIChjaGlsZDIgPSB0cDItPmNoaWxkX2xpc3QsIHByZXZpb3VzID0gTlVMTDsKICAgICAgICAgICAgIGNoaWxkMjsgcHJldmlvdXMgPSBjaGlsZDIsIGNoaWxkMiA9IGNoaWxkMi0+bmV4dF9wZWVyKSB7CgogICAgICAgICAgICBpZiAoY2hpbGQxLT5zdWJpZCA9PSBjaGlsZDItPnN1YmlkKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogRm91bmQgJ21hdGNoaW5nJyBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAqICBzbyBtZXJnZSB0aGVtCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChjaGlsZDEtPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikpIHsKICAgICAgICAgICAgICAgICAgICBtZXJnZV9hbm9uX2NoaWxkcmVuKGNoaWxkMSwgY2hpbGQyKTsKCiAgICAgICAgICAgICAgICAgICAgY2hpbGQxLT5jaGlsZF9saXN0ID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGNoaWxkMTsgIC8qIEZpbmlzaGVkIHdpdGggJ2NoaWxkMScgKi8KICAgICAgICAgICAgICAgICAgICBjaGlsZDEgPSBjaGlsZDEtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICBmcmVlX3RyZWUocHJldmlvdXMpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RybmNtcChjaGlsZDItPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikpIHsKICAgICAgICAgICAgICAgICAgICBtZXJnZV9hbm9uX2NoaWxkcmVuKGNoaWxkMiwgY2hpbGQxKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzKQogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy0+bmV4dF9wZWVyID0gY2hpbGQyLT5uZXh0X3BlZXI7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB0cDItPmNoaWxkX2xpc3QgPSBjaGlsZDItPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICBmcmVlX3RyZWUoY2hpbGQyKTsKCiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgPSBjaGlsZDE7ICAvKiBNb3ZlICdjaGlsZDEnIHRvICd0cDInICovCiAgICAgICAgICAgICAgICAgICAgY2hpbGQxID0gY2hpbGQxLT5uZXh0X3BlZXI7CiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMtPm5leHRfcGVlciA9IHRwMi0+Y2hpbGRfbGlzdDsKICAgICAgICAgICAgICAgICAgICB0cDItPmNoaWxkX2xpc3QgPSBwcmV2aW91czsKICAgICAgICAgICAgICAgICAgICBmb3IgKHByZXZpb3VzID0gdHAyLT5jaGlsZF9saXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXM7IHByZXZpb3VzID0gcHJldmlvdXMtPm5leHRfcGVlcikKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMtPnBhcmVudCA9IHRwMjsKICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFsYWJlbF9jb21wYXJlKGNoaWxkMS0+bGFiZWwsIGNoaWxkMi0+bGFiZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiAlcy4lbGQgaXMgYm90aCAlcyBhbmQgJXMgKCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAyLT5sYWJlbCwgY2hpbGQxLT5zdWJpZCwgY2hpbGQxLT5sYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQyLT5sYWJlbCwgRmlsZSk7CgkJICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBUd28gY29waWVzIG9mIHRoZSBzYW1lIG5vZGUuCiAgICAgICAgICAgICAgICAgICAgICogJ2NoaWxkMicgYWRvcHRzIHRoZSBjaGlsZHJlbiBvZiAnY2hpbGQxJwogICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQyLT5jaGlsZF9saXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocHJldmlvdXMgPSBjaGlsZDItPmNoaWxkX2xpc3Q7IHByZXZpb3VzLT5uZXh0X3BlZXI7IHByZXZpb3VzID0gcHJldmlvdXMtPm5leHRfcGVlcik7ICAgICAgIC8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgbGlzdCAqLwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy0+bmV4dF9wZWVyID0gY2hpbGQxLT5jaGlsZF9saXN0OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZDItPmNoaWxkX2xpc3QgPSBjaGlsZDEtPmNoaWxkX2xpc3Q7CiAgICAgICAgICAgICAgICAgICAgZm9yIChwcmV2aW91cyA9IGNoaWxkMS0+Y2hpbGRfbGlzdDsKICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzOyBwcmV2aW91cyA9IHByZXZpb3VzLT5uZXh0X3BlZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLT5wYXJlbnQgPSBjaGlsZDI7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQxLT5jaGlsZF9saXN0ID0gTlVMTDsKCiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgPSBjaGlsZDE7ICAvKiBGaW5pc2hlZCB3aXRoICdjaGlsZDEnICovCiAgICAgICAgICAgICAgICAgICAgY2hpbGQxID0gY2hpbGQxLT5uZXh0X3BlZXI7CiAgICAgICAgICAgICAgICAgICAgZnJlZV90cmVlKHByZXZpb3VzKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICAgKiBJZiBubyBtYXRjaCwgbW92ZSAnY2hpbGQxJyB0byAndHAyJyBjaGlsZF9saXN0CiAgICAgICAgICovCiAgICAgICAgaWYgKGNoaWxkMSkgewogICAgICAgICAgICBwcmV2aW91cyA9IGNoaWxkMTsKICAgICAgICAgICAgY2hpbGQxID0gY2hpbGQxLT5uZXh0X3BlZXI7CiAgICAgICAgICAgIHByZXZpb3VzLT5wYXJlbnQgPSB0cDI7CiAgICAgICAgICAgIHByZXZpb3VzLT5uZXh0X3BlZXIgPSB0cDItPmNoaWxkX2xpc3Q7CiAgICAgICAgICAgIHRwMi0+Y2hpbGRfbGlzdCA9IHByZXZpb3VzOwogICAgICAgIH0KICAgICAgbmV4dDo7CiAgICB9Cn0KCgovKgogKiBGaW5kIGFsbCB0aGUgY2hpbGRyZW4gb2Ygcm9vdCBpbiB0aGUgbGlzdCBvZiBub2Rlcy4gIExpbmsgdGhlbSBpbnRvIHRoZQogKiB0cmVlIGFuZCBvdXQgb2YgdGhlIG5vZGVzIGxpc3QuCiAqLwpzdGF0aWMgdm9pZApkb19zdWJ0cmVlKHN0cnVjdCB0cmVlICpyb290LCBzdHJ1Y3Qgbm9kZSAqKm5vZGVzKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAsICphbm9uX3RwID0gTlVMTDsKICAgIHN0cnVjdCB0cmVlICAgICp4cm9vdCA9IHJvb3Q7CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnAsICoqaGVhZHA7CiAgICBzdHJ1Y3Qgbm9kZSAgICAqb2xkbnAgPSBOVUxMLCAqY2hpbGRfbGlzdCA9IE5VTEwsICpjaGlsZHAgPSBOVUxMOwogICAgaW50ICAgICAgICAgICAgIGhhc2g7CiAgICBpbnQgICAgICAgICAgICAqaW50X3A7CgogICAgd2hpbGUgKHhyb290LT5uZXh0X3BlZXIgJiYgeHJvb3QtPm5leHRfcGVlci0+c3ViaWQgPT0gcm9vdC0+c3ViaWQpIHsKI2lmIDAKICAgICAgICBwcmludGYoInhyb290OiAlcy4lcyA9PiAlc1xuIiwgeHJvb3QtPnBhcmVudC0+bGFiZWwsIHhyb290LT5sYWJlbCwKICAgICAgICAgICAgICAgeHJvb3QtPm5leHRfcGVlci0+bGFiZWwpOwojZW5kaWYKICAgICAgICB4cm9vdCA9IHhyb290LT5uZXh0X3BlZXI7CiAgICB9CgogICAgdHAgPSByb290OwogICAgaGVhZHAgPSAmbmJ1Y2tldHNbTkJVQ0tFVChuYW1lX2hhc2godHAtPmxhYmVsKSldOwogICAgLyoKICAgICAqIFNlYXJjaCBlYWNoIG9mIHRoZSBub2RlcyBmb3Igb25lIHdob3NlIHBhcmVudCBpcyByb290LCBhbmQKICAgICAqIG1vdmUgZWFjaCBpbnRvIGEgc2VwYXJhdGUgbGlzdC4KICAgICAqLwogICAgZm9yIChucCA9ICpoZWFkcDsgbnA7IG5wID0gbnAtPm5leHQpIHsKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUodHAtPmxhYmVsLCBucC0+cGFyZW50KSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB0YWtlIHRoaXMgbm9kZSBvdXQgb2YgdGhlIG5vZGUgbGlzdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChvbGRucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAqaGVhZHAgPSBucC0+bmV4dDsgICAgICAvKiBmaXggcm9vdCBvZiBub2RlIGxpc3QgKi8KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9sZG5wLT5uZXh0ID0gbnAtPm5leHQ7IC8qIGxpbmsgYXJvdW5kIHRoaXMgbm9kZSAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaGlsZF9saXN0KQogICAgICAgICAgICAgICAgY2hpbGRwLT5uZXh0ID0gbnA7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNoaWxkX2xpc3QgPSBucDsKICAgICAgICAgICAgY2hpbGRwID0gbnA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb2xkbnAgPSBucDsKICAgICAgICB9CgogICAgfQogICAgaWYgKGNoaWxkcCkKICAgICAgICBjaGlsZHAtPm5leHQgPSBOVUxMOwogICAgLyoKICAgICAqIFRha2UgZWFjaCBlbGVtZW50IGluIHRoZSBjaGlsZCBsaXN0IGFuZCBwbGFjZSBpdCBpbnRvIHRoZSB0cmVlLgogICAgICovCiAgICBmb3IgKG5wID0gY2hpbGRfbGlzdDsgbnA7IG5wID0gbnAtPm5leHQpIHsKICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqb3RwID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqeHhyb290ID0geHJvb3Q7CiAgICAgICAgYW5vbl90cCA9IE5VTEw7CiAgICAgICAgdHAgPSB4cm9vdC0+Y2hpbGRfbGlzdDsKCiAgICAgICAgaWYgKG5wLT5zdWJpZCA9PSAtMSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBuYW1lIDo6PSB7IHBhcmVudCB9IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbnAtPnN1YmlkID0geHJvb3QtPnN1YmlkOwogICAgICAgICAgICB0cCA9IHhyb290OwogICAgICAgICAgICB4eHJvb3QgPSB4cm9vdC0+cGFyZW50OwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKHRwKSB7CiAgICAgICAgICAgIGlmICh0cC0+c3ViaWQgPT0gbnAtPnN1YmlkKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgb3RwID0gdHA7CiAgICAgICAgICAgICAgICB0cCA9IHRwLT5uZXh0X3BlZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRwKSB7CiAgICAgICAgICAgIGlmICghbGFiZWxfY29tcGFyZSh0cC0+bGFiZWwsIG5wLT5sYWJlbCkpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBVcGRhdGUgbGlzdCBvZiBtb2R1bGVzIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpbnRfcCA9CiAgICAgICAgICAgICAgICAgICAgKGludCAqKSBtYWxsb2MoKHRwLT5udW1iZXJfbW9kdWxlcyArIDEpICogc2l6ZW9mKGludCkpOwogICAgICAgICAgICAgICAgaWYgKGludF9wID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgbWVtY3B5KGludF9wLCB0cC0+bW9kdWxlX2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgdHAtPm51bWJlcl9tb2R1bGVzICogc2l6ZW9mKGludCkpOwogICAgICAgICAgICAgICAgaW50X3BbdHAtPm51bWJlcl9tb2R1bGVzXSA9IG5wLT5tb2RpZDsKICAgICAgICAgICAgICAgIGlmICh0cC0+bnVtYmVyX21vZHVsZXMgPiAxKQogICAgICAgICAgICAgICAgICAgIGZyZWUoKGNoYXIgKikgdHAtPm1vZHVsZV9saXN0KTsKICAgICAgICAgICAgICAgICsrdHAtPm51bWJlcl9tb2R1bGVzOwogICAgICAgICAgICAgICAgdHAtPm1vZHVsZV9saXN0ID0gaW50X3A7CgogICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfUkVQTEFDRSkpIHsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIFJlcGxhY2UgZnJvbSBub2RlIAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHRyZWVfZnJvbV9ub2RlKHRwLCBucCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogSGFuZGxlIGNoaWxkcmVuIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBkb19zdWJ0cmVlKHRwLCBub2Rlcyk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXN0cm5jbXAobnAtPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikgfHwKICAgICAgICAgICAgICAgICFzdHJuY21wKHRwLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pKSB7CiAgICAgICAgICAgICAgICBhbm9uX3RwID0gdHA7ICAgLyogTmVlZCB0byBtZXJnZSB0aGVzZSB0d28gdHJlZXMgbGF0ZXIgKi8KICAgICAgICAgICAgfSBlbHNlIGlmIChuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCQkgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6ICVzLiVsZCBpcyBib3RoICVzIGFuZCAlcyAoJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+bGFiZWwsIG5wLT5zdWJpZCwgdHAtPmxhYmVsLCBucC0+bGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlKTsKCSAgICB9CiAgICAgICAgfQoKICAgICAgICB0cCA9IChzdHJ1Y3QgdHJlZSAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0cmVlKSk7CiAgICAgICAgaWYgKHRwID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0cC0+cGFyZW50ID0geHhyb290OwogICAgICAgIHRwLT5tb2RpZCA9IG5wLT5tb2RpZDsKICAgICAgICB0cC0+bnVtYmVyX21vZHVsZXMgPSAxOwogICAgICAgIHRwLT5tb2R1bGVfbGlzdCA9ICYodHAtPm1vZGlkKTsKICAgICAgICB0cmVlX2Zyb21fbm9kZSh0cCwgbnApOwogICAgICAgIHRwLT5uZXh0X3BlZXIgPSBvdHAgPyBvdHAtPm5leHRfcGVlciA6IHh4cm9vdC0+Y2hpbGRfbGlzdDsKICAgICAgICBpZiAob3RwKQogICAgICAgICAgICBvdHAtPm5leHRfcGVlciA9IHRwOwogICAgICAgIGVsc2UKICAgICAgICAgICAgeHhyb290LT5jaGlsZF9saXN0ID0gdHA7CiAgICAgICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKHRwLT5sYWJlbCkpOwogICAgICAgIHRwLT5uZXh0ID0gdGJ1Y2tldHNbaGFzaF07CiAgICAgICAgdGJ1Y2tldHNbaGFzaF0gPSB0cDsKICAgICAgICBkb19zdWJ0cmVlKHRwLCBub2Rlcyk7CgogICAgICAgIGlmIChhbm9uX3RwKSB7CiAgICAgICAgICAgIGlmICghc3RybmNtcCh0cC0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFRoZSBuZXcgbm9kZSBpcyBhbm9ueW1vdXMsCiAgICAgICAgICAgICAgICAgKiAgc28gbWVyZ2UgaXQgd2l0aCB0aGUgZXhpc3Rpbmcgb25lLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBtZXJnZV9hbm9uX2NoaWxkcmVuKHRwLCBhbm9uX3RwKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogdW5saW5rIGFuZCBkZXN0cm95IHRwIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB1bmxpbmtfdHJlZSh0cCk7CiAgICAgICAgICAgICAgICBmcmVlX3RyZWUodHApOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFub25fdHAtPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICAgICpudHA7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVGhlIG9sZCBub2RlIHdhcyBhbm9ueW1vdXMsCiAgICAgICAgICAgICAgICAgKiAgc28gbWVyZ2UgaXQgd2l0aCB0aGUgZXhpc3Rpbmcgb25lLAogICAgICAgICAgICAgICAgICogIGFuZCBmaWxsIGluIHRoZSBmdWxsIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBtZXJnZV9hbm9uX2NoaWxkcmVuKGFub25fdHAsIHRwKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogdW5saW5rIGFub25fdHAgZnJvbSB0aGUgaGFzaCAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdW5saW5rX3RidWNrZXQoYW5vbl90cCk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGdldCByaWQgb2Ygb2xkIGNvbnRlbnRzIG9mIGFub25fdHAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZyZWVfcGFydGlhbF90cmVlKGFub25fdHAsIEZBTFNFKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogcHV0IGluIHRoZSBjdXJyZW50IGluZm9ybWF0aW9uIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBhbm9uX3RwLT5sYWJlbCA9IHRwLT5sYWJlbDsKICAgICAgICAgICAgICAgIGFub25fdHAtPmNoaWxkX2xpc3QgPSB0cC0+Y2hpbGRfbGlzdDsKICAgICAgICAgICAgICAgIGFub25fdHAtPm1vZGlkID0gdHAtPm1vZGlkOwogICAgICAgICAgICAgICAgYW5vbl90cC0+dGNfaW5kZXggPSB0cC0+dGNfaW5kZXg7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT50eXBlID0gdHAtPnR5cGU7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5lbnVtcyA9IHRwLT5lbnVtczsKICAgICAgICAgICAgICAgIGFub25fdHAtPmluZGV4ZXMgPSB0cC0+aW5kZXhlczsKICAgICAgICAgICAgICAgIGFub25fdHAtPmF1Z21lbnRzID0gdHAtPmF1Z21lbnRzOwogICAgICAgICAgICAgICAgYW5vbl90cC0+dmFyYmluZHMgPSB0cC0+dmFyYmluZHM7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5yYW5nZXMgPSB0cC0+cmFuZ2VzOwogICAgICAgICAgICAgICAgYW5vbl90cC0+aGludCA9IHRwLT5oaW50OwogICAgICAgICAgICAgICAgYW5vbl90cC0+dW5pdHMgPSB0cC0+dW5pdHM7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5kZXNjcmlwdGlvbiA9IHRwLT5kZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgIGFub25fdHAtPnJlZmVyZW5jZSA9IHRwLT5yZWZlcmVuY2U7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5kZWZhdWx0VmFsdWUgPSB0cC0+ZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgICAgYW5vbl90cC0+cGFyZW50ID0gdHAtPnBhcmVudDsKCiAgICAgICAgICAgICAgICBzZXRfZnVuY3Rpb24oYW5vbl90cCk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHVwZGF0ZSBwYXJlbnQgcG9pbnRlciBpbiBtb3ZlZCBjaGlsZHJlbiAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbnRwID0gYW5vbl90cC0+Y2hpbGRfbGlzdDsKICAgICAgICAgICAgICAgIHdoaWxlIChudHApIHsKICAgICAgICAgICAgICAgICAgICBudHAtPnBhcmVudCA9IGFub25fdHA7CiAgICAgICAgICAgICAgICAgICAgbnRwID0gbnRwLT5uZXh0X3BlZXI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGhhc2ggaW4gYW5vbl90cCBpbiBpdHMgbmV3IHBsYWNlIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBoYXNoID0gTkJVQ0tFVChuYW1lX2hhc2goYW5vbl90cC0+bGFiZWwpKTsKICAgICAgICAgICAgICAgIGFub25fdHAtPm5leHQgPSB0YnVja2V0c1toYXNoXTsKICAgICAgICAgICAgICAgIHRidWNrZXRzW2hhc2hdID0gYW5vbl90cDsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogdW5saW5rIGFuZCBkZXN0cm95IHRwIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB1bmxpbmtfdGJ1Y2tldCh0cCk7CiAgICAgICAgICAgICAgICB1bmxpbmtfdHJlZSh0cCk7CiAgICAgICAgICAgICAgICBmcmVlKHRwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBVaD8gIE9uZSBvZiB0aGVzZSB0d28gc2hvdWxkIGhhdmUgYmVlbiBhbm9ueW1vdXMhIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBleHBlY3RlZCBhbm9ueW1vdXMgbm9kZSAoZWl0aGVyICVzIG9yICVzKSBpbiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bGFiZWwsIGFub25fdHAtPmxhYmVsLCBGaWxlKTsKCQl9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYW5vbl90cCA9IE5VTEw7CiAgICAgICAgfQogICAgfQogICAgLyoKICAgICAqIGZyZWUgYWxsIG5vZGVzIHRoYXQgd2VyZSBjb3BpZWQgaW50byB0cmVlIAogICAgICovCiAgICBvbGRucCA9IE5VTEw7CiAgICBmb3IgKG5wID0gY2hpbGRfbGlzdDsgbnA7IG5wID0gbnAtPm5leHQpIHsKICAgICAgICBpZiAob2xkbnApCiAgICAgICAgICAgIGZyZWVfbm9kZShvbGRucCk7CiAgICAgICAgb2xkbnAgPSBucDsKICAgIH0KICAgIGlmIChvbGRucCkKICAgICAgICBmcmVlX25vZGUob2xkbnApOwp9CgpzdGF0aWMgdm9pZApkb19saW5rdXAoc3RydWN0IG1vZHVsZSAqbXAsIHN0cnVjdCBub2RlICpucCkKewogICAgc3RydWN0IG1vZHVsZV9pbXBvcnQgKm1pcDsKICAgIHN0cnVjdCBub2RlICAgICpvbnAsICpvbGRwLCAqbmV3cDsKICAgIHN0cnVjdCB0cmVlICAgICp0cDsKICAgIGludCAgICAgICAgICAgICBpLCBtb3JlOwogICAgLyoKICAgICAqIEFsbCBtb2R1bGVzIGltcGxpY2l0bHkgaW1wb3J0CiAgICAgKiAgIHRoZSByb290cyBvZiB0aGUgdHJlZQogICAgICovCiAgICBpZiAoc25tcF9nZXRfZG9fZGVidWdnaW5nKCkgPiAxKQogICAgICAgIGR1bXBfbW9kdWxlX2xpc3QoKTsKICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIlByb2Nlc3NpbmcgSU1QT1JUUyBmb3IgbW9kdWxlICVkICVzXG4iLAogICAgICAgICAgICAgICAgbXAtPm1vZGlkLCBtcC0+bmFtZSkpOwogICAgaWYgKG1wLT5ub19pbXBvcnRzID09IDApIHsKICAgICAgICBtcC0+bm9faW1wb3J0cyA9IE5VTUJFUl9PRl9ST09UX05PREVTOwogICAgICAgIG1wLT5pbXBvcnRzID0gcm9vdF9pbXBvcnRzOwogICAgfQoKICAgIC8qCiAgICAgKiBCdWlsZCB0aGUgdHJlZQogICAgICovCiAgICBpbml0X25vZGVfaGFzaChucCk7CiAgICBmb3IgKGkgPSAwLCBtaXAgPSBtcC0+aW1wb3J0czsgaSA8IG1wLT5ub19pbXBvcnRzOyArK2ksICsrbWlwKSB7CiAgICAgICAgY2hhciAgICAgICAgICAgIG1vZGJ1ZlsyNTZdOwogICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIiAgUHJvY2Vzc2luZyBpbXBvcnQ6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIG1pcC0+bGFiZWwpKTsKICAgICAgICBpZiAoZ2V0X3RjX2luZGV4KG1pcC0+bGFiZWwsIG1pcC0+bW9kaWQpICE9IC0xKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKG1pcC0+bGFiZWwsIG1pcC0+bW9kaWQpOwogICAgICAgIGlmICghdHApIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgIkRpZCBub3QgZmluZCAnJXMnIGluIG1vZHVsZSAlcyAoJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbWlwLT5sYWJlbCwgbW9kdWxlX25hbWUobWlwLT5tb2RpZCwgbW9kYnVmKSwKICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZG9fc3VidHJlZSh0cCwgJm5wKTsKICAgIH0KCiAgICAvKgogICAgICogSWYgYW55IG5vZGVzIGxlZnQgb3ZlciwKICAgICAqICAgY2hlY2sgdGhhdCB0aGV5J3JlIG5vdCB0aGUgcmVzdWx0IG9mIGEgImZ1bGx5IHF1YWxpZmllZCIKICAgICAqICAgbmFtZSwgYW5kIHRoZW4gYWRkIHRoZW0gdG8gdGhlIGxpc3Qgb2Ygb3JwaGFucwogICAgICovCgogICAgaWYgKCFucCkKICAgICAgICByZXR1cm47CiAgICBmb3IgKHRwID0gdHJlZV9oZWFkOyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKQogICAgICAgIGRvX3N1YnRyZWUodHAsICZucCk7CiAgICBpZiAoIW5wKQogICAgICAgIHJldHVybjsKCiAgICAvKgogICAgICogcXVpZXRseSBtb3ZlIGFsbCBpbnRlcm5hbCByZWZlcmVuY2VzIHRvIHRoZSBvcnBoYW4gbGlzdCAKICAgICAqLwogICAgb2xkcCA9IG9ycGhhbl9ub2RlczsKICAgIGRvIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkhBU0hTSVpFOyBpKyspCiAgICAgICAgICAgIGZvciAob25wID0gbmJ1Y2tldHNbaV07IG9ucDsgb25wID0gb25wLT5uZXh0KSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3Qgbm9kZSAgICAqb3AgPSBOVUxMOwogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaChvbnAtPmxhYmVsKSk7CiAgICAgICAgICAgICAgICBucCA9IG5idWNrZXRzW2hhc2hdOwogICAgICAgICAgICAgICAgd2hpbGUgKG5wKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsX2NvbXBhcmUob25wLT5sYWJlbCwgbnAtPnBhcmVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBucDsKICAgICAgICAgICAgICAgICAgICAgICAgbnAgPSBucC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+bmV4dCA9IG5wLT5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYnVja2V0c1toYXNoXSA9IG5wLT5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICBucC0+bmV4dCA9IG9ycGhhbl9ub2RlczsKICAgICAgICAgICAgICAgICAgICAgICAgb3JwaGFuX25vZGVzID0gbnA7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgbnAgPSBuYnVja2V0c1toYXNoXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICBuZXdwID0gb3JwaGFuX25vZGVzOwogICAgICAgIG1vcmUgPSAwOwogICAgICAgIGZvciAob25wID0gb3JwaGFuX25vZGVzOyBvbnAgIT0gb2xkcDsgb25wID0gb25wLT5uZXh0KSB7CiAgICAgICAgICAgIHN0cnVjdCBub2RlICAgICpvcCA9IE5VTEw7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBoYXNoID0gTkJVQ0tFVChuYW1lX2hhc2gob25wLT5sYWJlbCkpOwogICAgICAgICAgICBucCA9IG5idWNrZXRzW2hhc2hdOwogICAgICAgICAgICB3aGlsZSAobnApIHsKICAgICAgICAgICAgICAgIGlmIChsYWJlbF9jb21wYXJlKG9ucC0+bGFiZWwsIG5wLT5wYXJlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgb3AgPSBucDsKICAgICAgICAgICAgICAgICAgICBucCA9IG5wLT5uZXh0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAob3ApCiAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5uZXh0ID0gbnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBuYnVja2V0c1toYXNoXSA9IG5wLT5uZXh0OwogICAgICAgICAgICAgICAgICAgIG5wLT5uZXh0ID0gb3JwaGFuX25vZGVzOwogICAgICAgICAgICAgICAgICAgIG9ycGhhbl9ub2RlcyA9IG5wOwogICAgICAgICAgICAgICAgICAgIG9wID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBucCA9IG5idWNrZXRzW2hhc2hdOwogICAgICAgICAgICAgICAgICAgIG1vcmUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9sZHAgPSBuZXdwOwogICAgfSB3aGlsZSAobW9yZSk7CgogICAgLyoKICAgICAqIGNvbXBsYWluIGFib3V0IGxlZnQgb3ZlciBub2RlcyAKICAgICAqLwogICAgZm9yIChucCA9IG9ycGhhbl9ub2RlczsgbnAgJiYgbnAtPm5leHQ7IG5wID0gbnAtPm5leHQpOyAgICAgLyogZmluZCB0aGUgZW5kIG9mIHRoZSBvcnBoYW4gbGlzdCAqLwogICAgZm9yIChpID0gMDsgaSA8IE5IQVNIU0laRTsgaSsrKQogICAgICAgIGlmIChuYnVja2V0c1tpXSkgewogICAgICAgICAgICBpZiAob3JwaGFuX25vZGVzKQogICAgICAgICAgICAgICAgb25wID0gbnAtPm5leHQgPSBuYnVja2V0c1tpXTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgb25wID0gb3JwaGFuX25vZGVzID0gbmJ1Y2tldHNbaV07CiAgICAgICAgICAgIG5idWNrZXRzW2ldID0gTlVMTDsKICAgICAgICAgICAgd2hpbGUgKG9ucCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAiVW5saW5rZWQgT0lEIGluICVzOiAlcyA6Oj0geyAlcyAlbGQgfVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIChtcC0+bmFtZSA/IG1wLT5uYW1lIDogIjxubyBtb2R1bGU+IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAob25wLT5sYWJlbCA/IG9ucC0+bGFiZWwgOiAiPG5vIGxhYmVsPiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKG9ucC0+cGFyZW50ID8gb25wLT5wYXJlbnQgOiAiPG5vIHBhcmVudD4iKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG9ucC0+c3ViaWQpOwoJCSBzbm1wX2xvZyhMT0dfV0FSTklORywKCQkJICAiVW5kZWZpbmVkIGlkZW50aWZpZXI6ICVzIG5lYXIgbGluZSAlZCBvZiAlc1xuIiwKCQkJICAob25wLT5wYXJlbnQgPyBvbnAtPnBhcmVudCA6ICI8bm8gcGFyZW50PiIpLAoJCQkgIG9ucC0+bGluZW5vLCBvbnAtPmZpbGVuYW1lKTsKICAgICAgICAgICAgICAgIG5wID0gb25wOwogICAgICAgICAgICAgICAgb25wID0gb25wLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgcmV0dXJuOwp9CgoKLyoKICogVGFrZXMgYSBsaXN0IG9mIHRoZSBmb3JtOgogKiB7IGlzbyBvcmcoMykgZG9kKDYpIDEgfQogKiBhbmQgY3JlYXRlcyBzZXZlcmFsIG5vZGVzLCBvbmUgZm9yIGVhY2ggcGFyZW50LWNoaWxkIHBhaXIuCiAqIFJldHVybnMgMCBvbiBlcnJvci4KICovCnN0YXRpYyBpbnQKZ2V0b2lkKEZJTEUgKiBmcCwgc3RydWN0IHN1YmlkX3MgKmlkLCAgIC8qIGFuIGFycmF5IG9mIHN1YmlkcyAqLwogICAgICAgaW50IGxlbmd0aCkKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSAqLwogICAgcmVnaXN0ZXIgaW50ICAgIGNvdW50OwogICAgaW50ICAgICAgICAgICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwoKICAgIGlmICgodHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKSkgIT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ7XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbGVuZ3RoOyBjb3VudCsrLCBpZCsrKSB7CiAgICAgICAgaWQtPmxhYmVsID0gTlVMTDsKICAgICAgICBpZC0+bW9kaWQgPSBjdXJyZW50X21vZHVsZTsKICAgICAgICBpZC0+c3ViaWQgPSAtMTsKICAgICAgICBpZiAodHlwZSA9PSBSSUdIVEJSQUNLRVQpCiAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICBpZiAodHlwZSA9PSBMQUJFTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB0aGlzIGVudHJ5IGhhcyBhIGxhYmVsIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWQtPmxhYmVsID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gTlVNQkVSKSB7CiAgICAgICAgICAgICAgICAgICAgaWQtPnN1YmlkID0gc3RydG91bCh0b2tlbiwgTlVMTCwgMTApOwogICAgICAgICAgICAgICAgICAgIGlmICgodHlwZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTikpICE9IFJJR0hUUEFSRU4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIGEgY2xvc2luZyBwYXJlbnRoZXNpcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgYSBudW1iZXIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBOVU1CRVIpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogdGhpcyBlbnRyeSAgaGFzIGp1c3QgYW4gaW50ZWdlciBzdWItaWRlbnRpZmllciAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlkLT5zdWJpZCA9IHN0cnRvdWwodG9rZW4sIE5VTEwsIDEwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgbGFiZWwgb3IgbnVtYmVyIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIH0KICAgIHByaW50X2Vycm9yKCJUb28gbG9uZyBPSUQiLCB0b2tlbiwgdHlwZSk7CiAgICByZXR1cm4gMDsKfQoKLyoKICogUGFyc2UgYSBzZXF1ZW5jZSBvZiBvYmplY3Qgc3ViaWRlbnRpZmllcnMgZm9yIHRoZSBnaXZlbiBuYW1lLgogKiBUaGUgImxhYmVsIE9CSkVDVCBJREVOVElGSUVSIDo6PSIgcG9ydGlvbiBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZC4KICoKICogVGhlIG1ham9yaXR5IG9mIGNhc2VzIHRha2UgdGhpcyBmb3JtIDoKICogbGFiZWwgT0JKRUNUIElERU5USUZJRVIgOjo9IHsgcGFyZW50IDIgfQogKiB3aGVyZSBhIHBhcmVudCBsYWJlbCBhbmQgYSBjaGlsZCBzdWJpZGVudGlmaWVyIG51bWJlciBhcmUgc3BlY2lmaWVkLgogKgogKiBWYXJpYXRpb25zIG9uIHRoZSB0aGVtZSBpbmNsdWRlIGNhc2VzIHdoZXJlIGEgbnVtYmVyIGFwcGVhcnMgd2l0aAogKiB0aGUgcGFyZW50LCBvciBpbnRlcm1lZGlhdGUgc3ViaWRlbnRpZmllcnMgYXJlIHNwZWNpZmllZCBieSBsYWJlbCwKICogYnkgbnVtYmVyLCBvciBib3RoLgogKgogKiBIZXJlIGFyZSBzb21lIHJlcHJlc2VudGF0aXZlIHNhbXBsZXMgOgogKiBpbnRlcm5ldCAgICAgICAgT0JKRUNUIElERU5USUZJRVIgOjo9IHsgaXNvIG9yZygzKSBkb2QoNikgMSB9CiAqIG1nbXQgICAgICAgICAgICBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyBpbnRlcm5ldCAyIH0KICogcnB0ckluZm9IZWFsdGggIE9CSkVDVCBJREVOVElGSUVSIDo6PSB7IHNubXBEb3QzUnB0ck1ndCAwIDQgfQogKgogKiBIZXJlIGlzIGEgdmVyeSByYXJlIGZvcm0gOgogKiBpc28gICAgICAgICAgICAgT0JKRUNUIElERU5USUZJRVIgOjo9IHsgMSB9CiAqCiAqIFJldHVybnMgTlVMTCBvbiBlcnJvci4gIFdoZW4gdGhpcyBoYXBwZW5zLCBtZW1vcnkgbWF5IGJlIGxlYWtlZC4KICovCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX29iamVjdGlkKEZJTEUgKiBmcCwgY2hhciAqbmFtZSkKewogICAgcmVnaXN0ZXIgaW50ICAgIGNvdW50OwogICAgcmVnaXN0ZXIgc3RydWN0IHN1YmlkX3MgKm9wLCAqbm9wOwogICAgaW50ICAgICAgICAgICAgIGxlbmd0aDsKICAgIHN0cnVjdCBzdWJpZF9zICBsb2lkWzMyXTsKICAgIHN0cnVjdCBub2RlICAgICpucCwgKnJvb3QgPSBOVUxMLCAqb2xkbnAgPSBOVUxMOwogICAgc3RydWN0IHRyZWUgICAgKnRwOwoKICAgIGlmICgobGVuZ3RoID0gZ2V0b2lkKGZwLCBsb2lkLCAzMikpID09IDApIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIG9iamVjdCBpZGVudGlmaWVyIiwgTlVMTCwgQ09OVElOVUUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qCiAgICAgKiBIYW5kbGUgbnVtZXJpYy1vbmx5IG9iamVjdCBpZGVudGlmaWVycywKICAgICAqICBieSBsYWJlbGxpbmcgdGhlIGZpcnN0IHN1Yi1pZGVudGlmaWVyCiAgICAgKi8KICAgIG9wID0gbG9pZDsKICAgIGlmICghb3AtPmxhYmVsKSB7CiAgICAgICAgaWYgKGxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJBdHRlbXB0IHRvIGRlZmluZSBhIHJvb3Qgb2lkIiwgbmFtZSwgT0JKRUNUKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGZvciAodHAgPSB0cmVlX2hlYWQ7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpCiAgICAgICAgICAgIGlmICgoaW50KSB0cC0+c3ViaWQgPT0gb3AtPnN1YmlkKSB7CiAgICAgICAgICAgICAgICBvcC0+bGFiZWwgPSBzdHJkdXAodHAtPmxhYmVsKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIEhhbmRsZSAgImxhYmVsIE9CSkVDVC1JREVOVElGSUVSIDo6PSB7IHN1YmlkIH0iCiAgICAgKi8KICAgIGlmIChsZW5ndGggPT0gMSkgewogICAgICAgIG9wID0gbG9pZDsKICAgICAgICBucCA9IGFsbG9jX25vZGUob3AtPm1vZGlkKTsKICAgICAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICBucC0+c3ViaWQgPSBvcC0+c3ViaWQ7CiAgICAgICAgbnAtPmxhYmVsID0gc3RyZHVwKG5hbWUpOwogICAgICAgIG5wLT5wYXJlbnQgPSBvcC0+bGFiZWw7CiAgICAgICAgcmV0dXJuIG5wOwogICAgfQoKICAgIC8qCiAgICAgKiBGb3IgZWFjaCBwYXJlbnQtY2hpbGQgc3ViaWQgcGFpciBpbiB0aGUgc3ViaWQgYXJyYXksCiAgICAgKiBjcmVhdGUgYSBub2RlIGFuZCBsaW5rIGl0IGludG8gdGhlIG5vZGUgbGlzdC4KICAgICAqLwogICAgZm9yIChjb3VudCA9IDAsIG9wID0gbG9pZCwgbm9wID0gbG9pZCArIDE7IGNvdW50IDwgKGxlbmd0aCAtIDEpOwogICAgICAgICBjb3VudCsrLCBvcCsrLCBub3ArKykgewogICAgICAgIC8qCiAgICAgICAgICogZXZlcnkgbm9kZSBtdXN0IGhhdmUgcGFyZW50J3MgbmFtZSBhbmQgY2hpbGQncyBuYW1lIG9yIG51bWJlciAKICAgICAgICAgKi8KICAgICAgICAvKgogICAgICAgICAqIFhYIHRoZSBuZXh0IHN0YXRlbWVudCBpcyBhbHdheXMgdHJ1ZSAtLSBkb2VzIGl0IG1hdHRlciA/PyAKICAgICAgICAgKi8KICAgICAgICBpZiAob3AtPmxhYmVsICYmIChub3AtPmxhYmVsIHx8IChub3AtPnN1YmlkICE9IC0xKSkpIHsKICAgICAgICAgICAgbnAgPSBhbGxvY19ub2RlKG5vcC0+bW9kaWQpOwogICAgICAgICAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICAgICAgIGlmIChyb290ID09IE5VTEwpCiAgICAgICAgICAgICAgICByb290ID0gbnA7CgogICAgICAgICAgICBucC0+cGFyZW50ID0gc3RyZHVwKG9wLT5sYWJlbCk7CiAgICAgICAgICAgIGlmIChjb3VudCA9PSAobGVuZ3RoIC0gMikpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBUaGUgbmFtZSBmb3IgdGhpcyBub2RlIGlzIHRoZSBsYWJlbCBmb3IgdGhpcyBlbnRyeSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbnAtPmxhYmVsID0gc3RyZHVwKG5hbWUpOwogICAgICAgICAgICAgICAgaWYgKG5wLT5sYWJlbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgU05NUF9GUkVFKG5wLT5wYXJlbnQpOwogICAgICAgICAgICAgICAgICAgIFNOTVBfRlJFRShucCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghbm9wLT5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgIG5vcC0+bGFiZWwgPSAoY2hhciAqKSBtYWxsb2MoMjAgKyBBTk9OX0xFTik7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5vcC0+bGFiZWwgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICBTTk1QX0ZSRUUobnAtPnBhcmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBfRlJFRShucCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNwcmludGYobm9wLT5sYWJlbCwgIiVzJWQiLCBBTk9OLCBhbm9ueW1vdXMrKyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBucC0+bGFiZWwgPSBzdHJkdXAobm9wLT5sYWJlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5vcC0+c3ViaWQgIT0gLTEpCiAgICAgICAgICAgICAgICBucC0+c3ViaWQgPSBub3AtPnN1YmlkOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiV2FybmluZzogVGhpcyBlbnRyeSBpcyBwcmV0dHkgc2lsbHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnAtPmxhYmVsLCBDT05USU5VRSk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBzZXQgdXAgbmV4dCBlbnRyeSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChvbGRucCkKICAgICAgICAgICAgICAgIG9sZG5wLT5uZXh0ID0gbnA7CiAgICAgICAgICAgIG9sZG5wID0gbnA7CiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGlmKG9wLT5sYWJlbC4uLiAqLwogICAgfQoKICAgIC8qCiAgICAgKiBmcmVlIHRoZSBsb2lkIGFycmF5IAogICAgICovCiAgICBmb3IgKGNvdW50ID0gMCwgb3AgPSBsb2lkOyBjb3VudCA8IGxlbmd0aDsgY291bnQrKywgb3ArKykgewogICAgICAgIGlmIChvcC0+bGFiZWwpCiAgICAgICAgICAgIGZyZWUob3AtPmxhYmVsKTsKICAgIH0KCiAgICByZXR1cm4gcm9vdDsKfQoKc3RhdGljIGludApnZXRfdGMoY29uc3QgY2hhciAqZGVzY3JpcHRvciwKICAgICAgIGludCBtb2RpZCwKICAgICAgIGludCAqdGNfaW5kZXgsCiAgICAgICBzdHJ1Y3QgZW51bV9saXN0ICoqZXAsIHN0cnVjdCByYW5nZV9saXN0ICoqcnAsIGNoYXIgKipoaW50KQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIHN0cnVjdCB0YyAgICAgICp0Y3A7CgogICAgaSA9IGdldF90Y19pbmRleChkZXNjcmlwdG9yLCBtb2RpZCk7CiAgICBpZiAodGNfaW5kZXgpCiAgICAgICAgKnRjX2luZGV4ID0gaTsKICAgIGlmIChpICE9IC0xKSB7CiAgICAgICAgdGNwID0gJnRjbGlzdFtpXTsKICAgICAgICBpZiAoZXApIHsKICAgICAgICAgICAgZnJlZV9lbnVtcyhlcCk7CiAgICAgICAgICAgICplcCA9IGNvcHlfZW51bXModGNwLT5lbnVtcyk7CiAgICAgICAgfQogICAgICAgIGlmIChycCkgewogICAgICAgICAgICBmcmVlX3JhbmdlcyhycCk7CiAgICAgICAgICAgICpycCA9IGNvcHlfcmFuZ2VzKHRjcC0+cmFuZ2VzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGhpbnQpIHsKICAgICAgICAgICAgaWYgKCpoaW50KQogICAgICAgICAgICAgICAgZnJlZSgqaGludCk7CiAgICAgICAgICAgICpoaW50ID0gKHRjcC0+aGludCA/IHN0cmR1cCh0Y3AtPmhpbnQpIDogTlVMTCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Y3AtPnR5cGU7CiAgICB9CiAgICByZXR1cm4gTEFCRUw7Cn0KCi8qCiAqIHJldHVybiBpbmRleCBpbnRvIHRjbGlzdCBvZiBnaXZlbiBUQyBkZXNjcmlwdG9yCiAqIHJldHVybiAtMSBpZiBub3QgZm91bmQKICovCnN0YXRpYyBpbnQKZ2V0X3RjX2luZGV4KGNvbnN0IGNoYXIgKmRlc2NyaXB0b3IsIGludCBtb2RpZCkKewogICAgaW50ICAgICAgICAgICAgIGk7CiAgICBzdHJ1Y3QgdGMgICAgICAqdGNwOwogICAgc3RydWN0IG1vZHVsZSAgKm1wOwogICAgc3RydWN0IG1vZHVsZV9pbXBvcnQgKm1pcDsKCiAgICAvKgogICAgICogQ2hlY2sgdGhhdCB0aGUgZGVzY3JpcHRvciBpc24ndCBpbXBvcnRlZAogICAgICogIGJ5IHNlYXJjaGluZyB0aGUgaW1wb3J0IGxpc3QKICAgICAqLwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgaWYgKG1wLT5tb2RpZCA9PSBtb2RpZCkKICAgICAgICAgICAgYnJlYWs7CiAgICBpZiAobXApCiAgICAgICAgZm9yIChpID0gMCwgbWlwID0gbXAtPmltcG9ydHM7IGkgPCBtcC0+bm9faW1wb3J0czsgKytpLCArK21pcCkgewogICAgICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobWlwLT5sYWJlbCwgZGVzY3JpcHRvcikpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBGb3VuZCBpdCAtIHNvIGFtZW5kIHRoZSBtb2R1bGUgSUQgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1vZGlkID0gbWlwLT5tb2RpZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKCiAgICBmb3IgKGkgPSAwLCB0Y3AgPSB0Y2xpc3Q7IGkgPCBNQVhUQzsgaSsrLCB0Y3ArKykgewogICAgICAgIGlmICh0Y3AtPnR5cGUgPT0gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgaWYgKCFsYWJlbF9jb21wYXJlKGRlc2NyaXB0b3IsIHRjcC0+ZGVzY3JpcHRvcikgJiYKICAgICAgICAgICAgKChtb2RpZCA9PSB0Y3AtPm1vZGlkKSB8fCAobW9kaWQgPT0gLTEpKSkgewogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCi8qCiAqIHRyYW5zbGF0ZSBpbnRlZ2VyIHRjX2luZGV4IHRvIHN0cmluZyBpZGVudGlmaWVyIGZyb20gdGNsaXN0CiAqICoKICogKiBSZXR1cm5zIHBvaW50ZXIgdG8gc3RyaW5nIGluIHRhYmxlIChzaG91bGQgbm90IGJlIG1vZGlmaWVkKSBvciBOVUxMCiAqLwpjb25zdCBjaGFyICAgICAqCmdldF90Y19kZXNjcmlwdG9yKGludCB0Y19pbmRleCkKewogICAgaWYgKHRjX2luZGV4IDwgMCB8fCB0Y19pbmRleCA+PSBNQVhUQykKICAgICAgICByZXR1cm4gTlVMTDsKICAgIHJldHVybiAodGNsaXN0W3RjX2luZGV4XS5kZXNjcmlwdG9yKTsKfQoKY29uc3QgY2hhciAgICAgKgpnZXRfdGNfZGVzY3JpcHRpb24oaW50IHRjX2luZGV4KQp7CiAgICBpZiAodGNfaW5kZXggPCAwIHx8IHRjX2luZGV4ID49IE1BWFRDKQogICAgICAgIHJldHVybiBOVUxMOwogICAgcmV0dXJuICh0Y2xpc3RbdGNfaW5kZXhdLmRlc2NyaXB0aW9uKTsKfQoKCi8qCiAqIFBhcnNlcyBhbiBlbnVtZXJhdGlvbiBsaXN0IG9mIHRoZSBmb3JtOgogKiAgICAgICAgeyBsYWJlbCh2YWx1ZSkgbGFiZWwodmFsdWUpIC4uLiB9CiAqIFRoZSBpbml0aWFsIHsgaGFzIGFscmVhZHkgYmVlbiBwYXJzZWQuCiAqIFJldHVybnMgTlVMTCBvbiBlcnJvci4KICovCgpzdGF0aWMgc3RydWN0IGVudW1fbGlzdCAqCnBhcnNlX2VudW1saXN0KEZJTEUgKiBmcCwgc3RydWN0IGVudW1fbGlzdCAqKnJldHApCnsKICAgIHJlZ2lzdGVyIGludCAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVwID0gTlVMTCwgKiplcHAgPSAmZXA7CgogICAgZnJlZV9lbnVtcyhyZXRwKTsKCiAgICB3aGlsZSAoKHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTikpICE9IEVORE9GRklMRSkgewogICAgICAgIGlmICh0eXBlID09IFJJR0hUQlJBQ0tFVCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLyogc29tZSBlbnVtcyB1c2UgImRlcHJlY2F0ZWQiIHRvIGluZGljYXRlIGEgbm8gbG9uZ2VyIHZhbHVlIGxhYmVsICovCiAgICAgICAgLyogKEVHOiBJUC1NSUIncyBJcEFkZHJlc3NTdGF0dXNUQykgKi8KICAgICAgICBpZiAodHlwZSA9PSBMQUJFTCB8fCB0eXBlID09IERFUFJFQ0FURUQpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogdGhpcyBpcyBhbiBlbnVtZXJhdGVkIGxhYmVsIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKmVwcCA9CiAgICAgICAgICAgICAgICAoc3RydWN0IGVudW1fbGlzdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBlbnVtX2xpc3QpKTsKICAgICAgICAgICAgaWYgKCplcHAgPT0gTlVMTCkKICAgICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGEgcmVhc29uYWJsZSBhcHByb3hpbWF0aW9uIGZvciB0aGUgbGVuZ3RoIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCplcHApLT5sYWJlbCA9IHN0cmR1cCh0b2tlbik7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IExFRlRQQVJFTikgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKFwiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gTlVNQkVSKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgaW50ZWdlciIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgICgqZXBwKS0+dmFsdWUgPSBzdHJ0b2wodG9rZW4sIE5VTEwsIDEwKTsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gUklHSFRQQVJFTikgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKVwiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXBwID0gJigqZXBwKS0+bmV4dDsKICAgICAgICB9CiAgICB9CiAgICBpZiAodHlwZSA9PSBFTkRPRkZJTEUpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ9XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAqcmV0cCA9IGVwOwogICAgcmV0dXJuIGVwOwp9CgpzdGF0aWMgc3RydWN0IHJhbmdlX2xpc3QgKgpwYXJzZV9yYW5nZXMoRklMRSAqIGZwLCBzdHJ1Y3QgcmFuZ2VfbGlzdCAqKnJldHApCnsKICAgIGludCAgICAgICAgICAgICBsb3csIGhpZ2g7CiAgICBjaGFyICAgICAgICAgICAgbmV4dHRva2VuW01BWFRPS0VOXTsKICAgIGludCAgICAgICAgICAgICBuZXh0dHlwZTsKICAgIHN0cnVjdCByYW5nZV9saXN0ICpycCA9IE5VTEwsICoqcnBwID0gJnJwOwogICAgaW50ICAgICAgICAgICAgIHNpemUgPSAwLCB0YWtlbiA9IDE7CgogICAgZnJlZV9yYW5nZXMocmV0cCk7CgogICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKG5leHR0eXBlID09IFNJWkUpIHsKICAgICAgICBzaXplID0gMTsKICAgICAgICB0YWtlbiA9IDA7CiAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmIChuZXh0dHlwZSAhPSBMRUZUUEFSRU4pCiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIihcIiBhZnRlciBTSVpFIiwgbmV4dHRva2VuLCBuZXh0dHlwZSk7CiAgICB9CgogICAgZG8gewogICAgICAgIGlmICghdGFrZW4pCiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRha2VuID0gMDsKICAgICAgICBoaWdoID0gbG93ID0gc3RydG91bChuZXh0dG9rZW4sIE5VTEwsIDEwKTsKICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKG5leHR0eXBlID09IFJBTkdFKSB7CiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgZXJybm8gPSAwOwogICAgICAgICAgICBoaWdoID0gc3RydG91bChuZXh0dG9rZW4sIE5VTEwsIDEwKTsKICAgICAgICAgICAgaWYgKCBlcnJubyA9PSBFUkFOR0UgKSB7CiAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykpCiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IFVwcGVyIGJvdW5kIG5vdCBoYW5kbGVkIGNvcnJlY3RseSAoJXMgIT0gJWQpOiBBdCBsaW5lICVkIGluICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0dG9rZW4sIGhpZ2gsIG1pYkxpbmUsIEZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CiAgICAgICAgKnJwcCA9IChzdHJ1Y3QgcmFuZ2VfbGlzdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCByYW5nZV9saXN0KSk7CiAgICAgICAgaWYgKCpycHAgPT0gTlVMTCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgKCpycHApLT5sb3cgPSBsb3c7CiAgICAgICAgKCpycHApLT5oaWdoID0gaGlnaDsKICAgICAgICBycHAgPSAmKCpycHApLT5uZXh0OwoKICAgIH0gd2hpbGUgKG5leHR0eXBlID09IEJBUik7CiAgICBpZiAoc2l6ZSkgewogICAgICAgIGlmIChuZXh0dHlwZSAhPSBSSUdIVFBBUkVOKQogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCIpXCIgYWZ0ZXIgU0laRSIsIG5leHR0b2tlbiwgbmV4dHR5cGUpOwogICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIG5leHR0eXBlKTsKICAgIH0KICAgIGlmIChuZXh0dHlwZSAhPSBSSUdIVFBBUkVOKQogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIilcIiIsIG5leHR0b2tlbiwgbmV4dHR5cGUpOwoKICAgICpyZXRwID0gcnA7CiAgICByZXR1cm4gcnA7Cn0KCi8qCiAqIFBhcnNlcyBhbiBhc24gdHlwZS4gIFN0cnVjdHVyZXMgYXJlIGlnbm9yZWQgYnkgdGhpcyBwYXJzZXIuCiAqIFJldHVybnMgTlVMTCBvbiBlcnJvci4KICovCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX2FzbnR5cGUoRklMRSAqIGZwLCBjaGFyICpuYW1lLCBpbnQgKm50eXBlLCBjaGFyICpudG9rZW4pCnsKICAgIGludCAgICAgICAgICAgICB0eXBlLCBpOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBxdW90ZWRfc3RyaW5nX2J1ZmZlcltNQVhRVU9URVNUUl07CiAgICBjaGFyICAgICAgICAgICAqaGludCA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAqZGVzY3IgPSBOVUxMOwogICAgc3RydWN0IHRjICAgICAgKnRjcDsKICAgIGludCAgICAgICAgICAgICBsZXZlbDsKCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgPT0gU0VRVUVOQ0UgfHwgdHlwZSA9PSBDSE9JQ0UpIHsKICAgICAgICBsZXZlbCA9IDA7CiAgICAgICAgd2hpbGUgKCh0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pKSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgIGxldmVsKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBSSUdIVEJSQUNLRVQgJiYgLS1sZXZlbCA9PSAwKSB7CiAgICAgICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwifVwiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIGlmICh0eXBlID09IExFRlRCUkFDS0VUKSB7CiAgICAgICAgc3RydWN0IG5vZGUgICAgKm5wOwogICAgICAgIGludCAgICAgICAgICAgICBjaF9uZXh0ID0gJ3snOwogICAgICAgIHVuZ2V0YyhjaF9uZXh0LCBmcCk7CiAgICAgICAgbnAgPSBwYXJzZV9vYmplY3RpZChmcCwgbmFtZSk7CiAgICAgICAgaWYgKG5wICE9IE5VTEwpIHsKICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgcmV0dXJuIG5wOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSBMRUZUU1FCUkFDSykgewogICAgICAgIGludCAgICAgICAgICAgICBzaXplID0gMDsKICAgICAgICBkbyB7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfSB3aGlsZSAodHlwZSAhPSBFTkRPRkZJTEUgJiYgdHlwZSAhPSBSSUdIVFNRQlJBQ0spOwogICAgICAgIGlmICh0eXBlICE9IFJJR0hUU1FCUkFDSykgewogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJdXCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlID09IElNUExJQ0lUKQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKCpudHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICAgIGNhc2UgT0NURVRTVFI6CiAgICAgICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKCpudHlwZSAhPSBTSVpFKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFNJWkUiLCBudG9rZW4sICpudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzaXplID0gMTsKICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAoKm50eXBlICE9IExFRlRQQVJFTikgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIihcIiBhZnRlciBTSVpFIiwgbnRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogZmFsbCB0aHJvdWdoIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNhc2UgSU5URUdFUjoKICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCpudHlwZSAhPSBOVU1CRVIpCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBOVU1CRVIiLCBudG9rZW4sICpudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKm50eXBlID09IFJBTkdFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqbnR5cGUgIT0gTlVNQkVSKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIE5VTUJFUiIsIG50b2tlbiwgKm50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IHdoaWxlICgqbnR5cGUgPT0gQkFSKTsKICAgICAgICAgICAgICAgIGlmICgqbnR5cGUgIT0gUklHSFRQQVJFTikgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIilcIiIsIG50b2tlbiwgKm50eXBlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAoc2l6ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgqbnR5cGUgIT0gUklHSFRQQVJFTikgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCIpXCIgdG8gdGVybWluYXRlIFNJWkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9rZW4sICpudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAodHlwZSA9PSBDT05WRU5USU9OKSB7CiAgICAgICAgICAgIHdoaWxlICh0eXBlICE9IFNZTlRBWCAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gRElTUExBWUhJTlQpIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKQogICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRElTUExBWS1ISU5UIG11c3QgYmUgc3RyaW5nIiwgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgaGludCA9IHN0cmR1cCh0b2tlbik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gREVTQ1JJUFRJT04gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUykpIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKQogICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiREVTQ1JJUFRJT04gbXVzdCBiZSBzdHJpbmciLCB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBkZXNjciA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICB0eXBlID0KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlID09IE9CSkVDVCkgewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IElERU5USUZJRVIpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgSURFTlRJRklFUiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoaGludCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0eXBlID0gT0JKSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gT0JKRUNUKSB7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IElERU5USUZJRVIpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBJREVOVElGSUVSIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZSA9IE9CSklEOwogICAgICAgIH0KCiAgICAgICAgaWYgKHR5cGUgPT0gTEFCRUwpIHsKICAgICAgICAgICAgdHlwZSA9IGdldF90Yyh0b2tlbiwgY3VycmVudF9tb2R1bGUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiB0ZXh0dWFsIGNvbnZlbnRpb24gCiAgICAgICAgICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWFRDOyBpKyspIHsKICAgICAgICAgICAgaWYgKHRjbGlzdFtpXS50eXBlID09IDApCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChpID09IE1BWFRDKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJUb28gbWFueSB0ZXh0dWFsIGNvbnZlbnRpb25zIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBTTk1QX0ZSRUUoaGludCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBpZiAoISh0eXBlICYgU1lOVEFYX01BU0spKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJUZXh0dWFsIGNvbnZlbnRpb24gZG9lc24ndCBtYXAgdG8gcmVhbCB0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBTTk1QX0ZSRUUoaGludCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICB0Y3AgPSAmdGNsaXN0W2ldOwogICAgICAgIHRjcC0+bW9kaWQgPSBjdXJyZW50X21vZHVsZTsKICAgICAgICB0Y3AtPmRlc2NyaXB0b3IgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgdGNwLT5oaW50ID0gaGludDsKICAgICAgICB0Y3AtPmRlc2NyaXB0aW9uID0gZGVzY3I7CiAgICAgICAgdGNwLT50eXBlID0gdHlwZTsKICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICgqbnR5cGUgPT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgIHRjcC0+cmFuZ2VzID0gcGFyc2VfcmFuZ2VzKGZwLCAmdGNwLT5yYW5nZXMpOwogICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0gZWxzZSBpZiAoKm50eXBlID09IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlmIHRoZXJlIGlzIGFuIGVudW1lcmF0aW9uIGxpc3QsIHBhcnNlIGl0IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGNwLT5lbnVtcyA9IHBhcnNlX2VudW1saXN0KGZwLCAmdGNwLT5lbnVtcyk7CiAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBOVUxMOwogICAgfQp9CgoKLyoKICogUGFyc2VzIGFuIE9CSkVDVCBUWVBFIG1hY3JvLgogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9vYmplY3R0eXBlKEZJTEUgKiBmcCwgY2hhciAqbmFtZSkKewogICAgcmVnaXN0ZXIgaW50ICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIG5leHR0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgcXVvdGVkX3N0cmluZ19idWZmZXJbTUFYUVVPVEVTVFJdOwogICAgaW50ICAgICAgICAgICAgIG5leHR0eXBlLCB0Y3R5cGU7CiAgICByZWdpc3RlciBzdHJ1Y3Qgbm9kZSAqbnA7CgogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IFNZTlRBWCkgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgZm9ybWF0IGZvciBPQkpFQ1QtVFlQRSIsIHRva2VuLCB0eXBlKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlID09IE9CSkVDVCkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgIT0gSURFTlRJRklFUikgewogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgSURFTlRJRklFUiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBPQkpJRDsKICAgIH0KICAgIGlmICh0eXBlID09IExBQkVMKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHRtcF9pbmRleDsKICAgICAgICB0Y3R5cGUgPSBnZXRfdGModG9rZW4sIGN1cnJlbnRfbW9kdWxlLCAmdG1wX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAmbnAtPmVudW1zLCAmbnAtPnJhbmdlcywgJm5wLT5oaW50KTsKICAgICAgICBpZiAodGN0eXBlID09IExBQkVMICYmCiAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkgICAgICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSA+IDEpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIldhcm5pbmc6IE5vIGtub3duIHRyYW5zbGF0aW9uIGZvciB0eXBlIiwgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgIH0KICAgICAgICB0eXBlID0gdGN0eXBlOwogICAgICAgIG5wLT50Y19pbmRleCA9IHRtcF9pbmRleDsgICAgICAgLyogc3RvcmUgVEMgZm9yIGxhdGVyIHJlZmVyZW5jZSAqLwogICAgfQogICAgbnAtPnR5cGUgPSB0eXBlOwogICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgc3dpdGNoICh0eXBlKSB7CiAgICBjYXNlIFNFUVVFTkNFOgogICAgICAgIGlmIChuZXh0dHlwZSA9PSBPRikgewogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKCiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBJTlRFR0VSOgogICAgY2FzZSBJTlRFR0VSMzI6CiAgICBjYXNlIFVJTlRFR0VSMzI6CiAgICBjYXNlIFVOU0lHTkVEMzI6CiAgICBjYXNlIENPVU5URVI6CiAgICBjYXNlIEdBVUdFOgogICAgY2FzZSBCSVRTVFJJTkc6CiAgICBjYXNlIExBQkVMOgogICAgICAgIGlmIChuZXh0dHlwZSA9PSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBpZiB0aGVyZSBpcyBhbiBlbnVtZXJhdGlvbiBsaXN0LCBwYXJzZSBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5wLT5lbnVtcyA9IHBhcnNlX2VudW1saXN0KGZwLCAmbnAtPmVudW1zKTsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0gZWxzZSBpZiAobmV4dHR5cGUgPT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlmIHRoZXJlIGlzIGEgcmFuZ2UgbGlzdCwgcGFyc2UgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBucC0+cmFuZ2VzID0gcGFyc2VfcmFuZ2VzKGZwLCAmbnAtPnJhbmdlcyk7CiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE9DVEVUU1RSOgogICAgY2FzZSBLV19PUEFRVUU6CiAgICAgICAgLyoKICAgICAgICAgKiBwYXJzZSBhbnkgU0laRSBzcGVjaWZpY2F0aW9uIAogICAgICAgICAqLwogICAgICAgIGlmIChuZXh0dHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAobmV4dHR5cGUgPT0gU0laRSkgewogICAgICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKG5leHR0eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICAgICAgICAgIG5wLT5yYW5nZXMgPSBwYXJzZV9yYW5nZXMoZnAsICZucC0+cmFuZ2VzKTsKICAgICAgICAgICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7ICAgICAgLyogKSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0dHlwZSA9PSBSSUdIVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgU0laRSBzeW50YXgiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgT0JKSUQ6CiAgICBjYXNlIE5FVEFERFI6CiAgICBjYXNlIElQQUREUjoKICAgIGNhc2UgVElNRVRJQ0tTOgogICAgY2FzZSBOVUw6CiAgICBjYXNlIE5TQVBBRERSRVNTOgogICAgY2FzZSBDT1VOVEVSNjQ6CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHByaW50X2Vycm9yKCJCYWQgc3ludGF4IiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpZiAobmV4dHR5cGUgPT0gVU5JVFMpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgVU5JVFMiLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBucC0+dW5pdHMgPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgIH0KICAgIGlmIChuZXh0dHlwZSAhPSBBQ0NFU1MpIHsKICAgICAgICBwcmludF9lcnJvcigiU2hvdWxkIGJlIEFDQ0VTUyIsIG5leHR0b2tlbiwgbmV4dHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gUkVBRE9OTFkgJiYgdHlwZSAhPSBSRUFEV1JJVEUgJiYgdHlwZSAhPSBXUklURU9OTFkKICAgICAgICAmJiB0eXBlICE9IE5PQUNDRVNTICYmIHR5cGUgIT0gUkVBRENSRUFURSAmJiB0eXBlICE9IEFDQ05PVElGWSkgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgQUNDRVNTIHR5cGUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIG5wLT5hY2Nlc3MgPSB0eXBlOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IFNUQVRVUykgewogICAgICAgIHByaW50X2Vycm9yKCJTaG91bGQgYmUgU1RBVFVTIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gTUFOREFUT1JZICYmIHR5cGUgIT0gQ1VSUkVOVCAmJiB0eXBlICE9IEtXX09QVElPTkFMICYmCiAgICAgICAgdHlwZSAhPSBPQlNPTEVURSAmJiB0eXBlICE9IERFUFJFQ0FURUQpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIFNUQVRVUyIsIHRva2VuLCB0eXBlKTsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbnAtPnN0YXR1cyA9IHR5cGU7CiAgICAvKgogICAgICogT3B0aW9uYWwgcGFydHMgb2YgdGhlIE9CSkVDVC1UWVBFIG1hY3JvCiAgICAgKi8KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB3aGlsZSAodHlwZSAhPSBFUVVBTFMgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICBjYXNlIERFU0NSSVBUSU9OOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwoKICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKSB7CiAgICAgICAgICAgICAgICBucC0+ZGVzY3JpcHRpb24gPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFJFRkVSRU5DRToKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgUkVGRVJFTkNFIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5wLT5yZWZlcmVuY2UgPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElOREVYOgogICAgICAgICAgICBpZiAobnAtPmF1Z21lbnRzKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQ2Fubm90IGhhdmUgYm90aCBJTkRFWCBhbmQgQVVHTUVOVFMiLCB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5wLT5pbmRleGVzID0gZ2V0SW5kZXhlcyhmcCwgJm5wLT5pbmRleGVzKTsKICAgICAgICAgICAgaWYgKG5wLT5pbmRleGVzID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgSU5ERVggbGlzdCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFVR01FTlRTOgogICAgICAgICAgICBpZiAobnAtPmluZGV4ZXMpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJDYW5ub3QgaGF2ZSBib3RoIElOREVYIGFuZCBBVUdNRU5UUyIsIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnAtPmluZGV4ZXMgPSBnZXRJbmRleGVzKGZwLCAmbnAtPmluZGV4ZXMpOwogICAgICAgICAgICBpZiAobnAtPmluZGV4ZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBBVUdNRU5UUyBsaXN0IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5wLT5hdWdtZW50cyA9IHN0cmR1cChucC0+aW5kZXhlcy0+aWxhYmVsKTsKICAgICAgICAgICAgZnJlZV9pbmRleGVzKCZucC0+aW5kZXhlcyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgREVGVkFMOgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBNYXJrJ3MgZGVmVmFsIHNlY3Rpb24gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERUZBVUxUVkFMVUUiLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIGRlZmJ1Zls1MTJdOwoKICAgICAgICAgICAgICAgIGRlZmJ1ZlswXSA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlID09IFJJR0hUQlJBQ0tFVCAmJiAtLWxldmVsID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgPT0gRU5ET0ZGSUxFKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IExFRlRCUkFDS0VUKQogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCsrOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFFVT1RFU1RSSU5HKQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsY2F0KGRlZmJ1ZiwgIlxcXCIiLCBzaXplb2YoZGVmYnVmKSk7CiAgICAgICAgICAgICAgICAgICAgc3RybGNhdChkZWZidWYsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBzaXplb2YoZGVmYnVmKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUVVPVEVTVFJJTkcpCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxjYXQoZGVmYnVmLCAiXFxcIiIsIHNpemVvZihkZWZidWYpKTsKICAgICAgICAgICAgICAgICAgICBzdHJsY2F0KGRlZmJ1ZiwgIiAiLCBzaXplb2YoZGVmYnVmKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gUklHSFRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERUZBVUxUVkFMVUUiLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRlZmJ1ZltzdHJsZW4oZGVmYnVmKSAtIDFdID0gMDsKICAgICAgICAgICAgICAgIG5wLT5kZWZhdWx0VmFsdWUgPSBzdHJkdXAoZGVmYnVmKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgTlVNX0VOVFJJRVM6CiAgICAgICAgICAgIGlmICh0b3NzT2JqZWN0SWRlbnRpZmllcihmcCkgIT0gT0JKSUQpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgT2JqZWN0IElkZW50aWZpZXIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgZm9ybWF0IG9mIG9wdGlvbmFsIGNsYXVzZXMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIH0KICAgIGlmICh0eXBlICE9IEVRVUFMUykgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgZm9ybWF0IiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICByZXR1cm4gbWVyZ2VfcGFyc2Vfb2JqZWN0aWQobnAsIGZwLCBuYW1lKTsKfQoKLyoKICogUGFyc2VzIGFuIE9CSkVDVCBHUk9VUCBtYWNyby4KICogUmV0dXJucyAwIG9uIGVycm9yLgogKgogKiBBbHNvIHBhcnNlcyBvYmplY3QtaWRlbnRpdHksIHNpbmNlIHRoZXkgYXJlIHNpbWlsYXIgKGlnbm9yZSBTVEFUVVMpLgogKiAgIC0gV0pIIDEwLzk2CiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9vYmplY3Rncm91cChGSUxFICogZnAsIGNoYXIgKm5hbWUsIGludCB3aGF0LCBzdHJ1Y3Qgb2JqZ3JvdXAgKipvbCkKewogICAgaW50ICAgICAgICAgICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIHF1b3RlZF9zdHJpbmdfYnVmZmVyW01BWFFVT1RFU1RSXTsKICAgIHN0cnVjdCBub2RlICAgICpucDsKCiAgICBucCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgaWYgKG5wID09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSA9PSB3aGF0KSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ7XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgZG8gewogICAgICAgICAgICBzdHJ1Y3Qgb2JqZ3JvdXAgKm87CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIGlkZW50aWZpZXIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbyA9IChzdHJ1Y3Qgb2JqZ3JvdXAgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2JqZ3JvdXApKTsKICAgICAgICAgICAgaWYgKCFvKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiUmVzb3VyY2UgZmFpbHVyZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBvLT5saW5lID0gbWliTGluZTsKICAgICAgICAgICAgby0+bmFtZSA9IHN0cmR1cCh0b2tlbik7CiAgICAgICAgICAgIG8tPm5leHQgPSAqb2w7CiAgICAgICAgICAgICpvbCA9IG87CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfSB3aGlsZSAodHlwZSA9PSBDT01NQSk7CiAgICAgICAgaWYgKHR5cGUgIT0gUklHSFRCUkFDS0VUKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIn1cIiBhZnRlciBsaXN0IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCB0eXBlKTsKICAgIH0KICAgIGlmICh0eXBlICE9IFNUQVRVUykgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBTVEFUVVMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IENVUlJFTlQgJiYgdHlwZSAhPSBERVBSRUNBVEVEICYmIHR5cGUgIT0gT0JTT0xFVEUpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIFNUQVRVUyB2YWx1ZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gREVTQ1JJUFRJT04pIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgREVTQ1JJUFRJT04iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUykpIHsKICAgICAgICBucC0+ZGVzY3JpcHRpb24gPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlID09IFJFRkVSRU5DRSkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBSRUZFUkVOQ0UiLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBucC0+cmVmZXJlbmNlID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgaWYgKHR5cGUgIT0gRVFVQUxTKQogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIjo6PVwiIiwgdG9rZW4sIHR5cGUpOwogIHNraXA6CiAgICB3aGlsZSAodHlwZSAhPSBFUVVBTFMgJiYgdHlwZSAhPSBFTkRPRkZJTEUpCiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKCiAgICByZXR1cm4gbWVyZ2VfcGFyc2Vfb2JqZWN0aWQobnAsIGZwLCBuYW1lKTsKfQoKLyoKICogUGFyc2VzIGEgTk9USUZJQ0FUSU9OLVRZUEUgbWFjcm8uCiAqIFJldHVybnMgMCBvbiBlcnJvci4KICovCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX25vdGlmaWNhdGlvbkRlZmluaXRpb24oRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgcXVvdGVkX3N0cmluZ19idWZmZXJbTUFYUVVPVEVTVFJdOwogICAgcmVnaXN0ZXIgc3RydWN0IG5vZGUgKm5wOwoKICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIHdoaWxlICh0eXBlICE9IEVRVUFMUyAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgREVTQ1JJUFRJT046CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgewogICAgICAgICAgICAgICAgbnAtPmRlc2NyaXB0aW9uID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJFRkVSRU5DRToKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgUkVGRVJFTkNFIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5wLT5yZWZlcmVuY2UgPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE9CSkVDVFM6CiAgICAgICAgICAgIG5wLT52YXJiaW5kcyA9IGdldFZhcmJpbmRzKGZwLCAmbnAtPnZhcmJpbmRzKTsKICAgICAgICAgICAgaWYgKCFucC0+dmFyYmluZHMpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgT0JKRUNUUyBsaXN0IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE5PVEhJTkcgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIH0KICAgIHJldHVybiBtZXJnZV9wYXJzZV9vYmplY3RpZChucCwgZnAsIG5hbWUpOwp9CgovKgogKiBQYXJzZXMgYSBUUkFQLVRZUEUgbWFjcm8uCiAqIFJldHVybnMgMCBvbiBlcnJvci4KICovCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX3RyYXBEZWZpbml0aW9uKEZJTEUgKiBmcCwgY2hhciAqbmFtZSkKewogICAgcmVnaXN0ZXIgaW50ICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIHF1b3RlZF9zdHJpbmdfYnVmZmVyW01BWFFVT1RFU1RSXTsKICAgIHJlZ2lzdGVyIHN0cnVjdCBub2RlICpucDsKCiAgICBucCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgaWYgKG5wID09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB3aGlsZSAodHlwZSAhPSBFUVVBTFMgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICBjYXNlIERFU0NSSVBUSU9OOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUykpIHsKICAgICAgICAgICAgICAgIG5wLT5kZXNjcmlwdGlvbiA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBSRUZFUkVOQ0U6CiAgICAgICAgICAgIC8qIEknbSBub3Qgc3VyZSBSRUZFUkVOQ0VzIGFyZSBsZWdhbCBpbiBzbWl2MSB0cmFwcz8/PyAqLwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBSRUZFUkVOQ0UiLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnAtPnJlZmVyZW5jZSA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRU5URVJQUklTRToKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBMQUJFTCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgVHJhcCBGb3JtYXQiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5wLT5wYXJlbnQgPSBzdHJkdXAodG9rZW4pOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIEdldCByaWdodCBicmFja2V0IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTEFCRUwpIHsKICAgICAgICAgICAgICAgIG5wLT5wYXJlbnQgPSBzdHJkdXAodG9rZW4pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVkFSSUFCTEVTOgogICAgICAgICAgICBucC0+dmFyYmluZHMgPSBnZXRWYXJiaW5kcyhmcCwgJm5wLT52YXJiaW5kcyk7CiAgICAgICAgICAgIGlmICghbnAtPnZhcmJpbmRzKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFZBUklBQkxFUyBsaXN0IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE5PVEhJTkcgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CgogICAgbnAtPmxhYmVsID0gc3RyZHVwKG5hbWUpOwoKICAgIGlmICh0eXBlICE9IE5VTUJFUikgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBhIE51bWJlciIsIHRva2VuLCB0eXBlKTsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbnAtPnN1YmlkID0gc3RydG91bCh0b2tlbiwgTlVMTCwgMTApOwogICAgbnAtPm5leHQgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucC0+bmV4dCA9PSBOVUxMKSB7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgfQogICAgbnAtPm5leHQtPnBhcmVudCA9IG5wLT5wYXJlbnQ7CiAgICBucC0+cGFyZW50ID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihucC0+cGFyZW50KSArIDIpOwogICAgaWYgKG5wLT5wYXJlbnQgPT0gTlVMTCkgewogICAgICAgIGZyZWVfbm9kZShucC0+bmV4dCk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgfQogICAgc3RyY3B5KG5wLT5wYXJlbnQsIG5wLT5uZXh0LT5wYXJlbnQpOwogICAgc3RyY2F0KG5wLT5wYXJlbnQsICIjIik7CiAgICBucC0+bmV4dC0+bGFiZWwgPSBzdHJkdXAobnAtPnBhcmVudCk7CiAgICBucC0+dHlwZSA9IFRSQVBUWVBFOwogICAgcmV0dXJuIG5wOwp9CgoKLyoKICogUGFyc2VzIGEgY29tcGxpYW5jZSBtYWNybwogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqLwpzdGF0aWMgaW50CmVhdF9zeW50YXgoRklMRSAqIGZwLCBjaGFyICp0b2tlbiwgaW50IG1heHRva2VuKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZSwgbmV4dHR5cGU7CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGNoYXIgICAgICAgICAgICBuZXh0dG9rZW5bTUFYVE9LRU5dOwoKICAgIGlmICghbnApCglyZXR1cm4gMDsKCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgbWF4dG9rZW4pOwogICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgc3dpdGNoICh0eXBlKSB7CiAgICBjYXNlIElOVEVHRVI6CiAgICBjYXNlIElOVEVHRVIzMjoKICAgIGNhc2UgVUlOVEVHRVIzMjoKICAgIGNhc2UgVU5TSUdORUQzMjoKICAgIGNhc2UgQ09VTlRFUjoKICAgIGNhc2UgR0FVR0U6CiAgICBjYXNlIEJJVFNUUklORzoKICAgIGNhc2UgTEFCRUw6CiAgICAgICAgaWYgKG5leHR0eXBlID09IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlmIHRoZXJlIGlzIGFuIGVudW1lcmF0aW9uIGxpc3QsIHBhcnNlIGl0IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbnAtPmVudW1zID0gcGFyc2VfZW51bWxpc3QoZnAsICZucC0+ZW51bXMpOwogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfSBlbHNlIGlmIChuZXh0dHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaWYgdGhlcmUgaXMgYSByYW5nZSBsaXN0LCBwYXJzZSBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5wLT5yYW5nZXMgPSBwYXJzZV9yYW5nZXMoZnAsICZucC0+cmFuZ2VzKTsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgT0NURVRTVFI6CiAgICBjYXNlIEtXX09QQVFVRToKICAgICAgICAvKgogICAgICAgICAqIHBhcnNlIGFueSBTSVpFIHNwZWNpZmljYXRpb24gCiAgICAgICAgICovCiAgICAgICAgaWYgKG5leHR0eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmIChuZXh0dHlwZSA9PSBTSVpFKSB7CiAgICAgICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAobmV4dHR5cGUgPT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgbnAtPnJhbmdlcyA9IHBhcnNlX3JhbmdlcyhmcCwgJm5wLT5yYW5nZXMpOwogICAgICAgICAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsgICAgICAvKiApICovCiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHR0eXBlID09IFJJR0hUUEFSRU4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBTSVpFIHN5bnRheCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgcmV0dXJuIG5leHR0eXBlOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgT0JKSUQ6CiAgICBjYXNlIE5FVEFERFI6CiAgICBjYXNlIElQQUREUjoKICAgIGNhc2UgVElNRVRJQ0tTOgogICAgY2FzZSBOVUw6CiAgICBjYXNlIE5TQVBBRERSRVNTOgogICAgY2FzZSBDT1VOVEVSNjQ6CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHByaW50X2Vycm9yKCJCYWQgc3ludGF4IiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIG5leHR0eXBlOwogICAgfQogICAgZnJlZV9ub2RlKG5wKTsKICAgIHJldHVybiBuZXh0dHlwZTsKfQoKc3RhdGljIGludApjb21wbGlhbmNlX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kaWQpCnsKICAgIGlmIChtb2RpZCA9PSAtMSkgewogICAgICAgIHN0cnVjdCBvYmpncm91cCAqb3AgPQogICAgICAgICAgICAoc3RydWN0IG9iamdyb3VwICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamdyb3VwKSk7CiAgICAgICAgaWYgKCFvcCkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgb3AtPm5leHQgPSBvYmpncm91cHM7CiAgICAgICAgb3AtPm5hbWUgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgb3AtPmxpbmUgPSBtaWJMaW5lOwogICAgICAgIG9iamdyb3VwcyA9IG9wOwogICAgICAgIHJldHVybiAxOwogICAgfSBlbHNlCiAgICAgICAgcmV0dXJuIGZpbmRfdHJlZV9ub2RlKG5hbWUsIG1vZGlkKSAhPSBOVUxMOwp9CgpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9jb21wbGlhbmNlKEZJTEUgKiBmcCwgY2hhciAqbmFtZSkKewogICAgaW50ICAgICAgICAgICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIHF1b3RlZF9zdHJpbmdfYnVmZmVyW01BWFFVT1RFU1RSXTsKICAgIHN0cnVjdCBub2RlICAgICpucDsKCiAgICBucCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgaWYgKG5wID09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBTVEFUVVMpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgU1RBVFVTIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBDVVJSRU5UICYmIHR5cGUgIT0gREVQUkVDQVRFRCAmJiB0eXBlICE9IE9CU09MRVRFKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBTVEFUVVMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IERFU0NSSVBUSU9OKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUykpCiAgICAgICAgbnAtPmRlc2NyaXB0aW9uID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSA9PSBSRUZFUkVOQ0UpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgUkVGRVJFTkNFIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIG5wLT5yZWZlcmVuY2UgPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CiAgICBpZiAodHlwZSAhPSBNT0RVTEUpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgTU9EVUxFIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHdoaWxlICh0eXBlID09IE1PRFVMRSkgewogICAgICAgIGludCAgICAgICAgICAgICBtb2RpZCA9IC0xOwogICAgICAgIGNoYXIgICAgICAgICAgICBtb2RuYW1lW01BWFRPS0VOXTsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlID09IExBQkVMCiAgICAgICAgICAgICYmIHN0cmNtcCh0b2tlbiwgbW9kdWxlX25hbWUoY3VycmVudF9tb2R1bGUsIG1vZG5hbWUpKSkgewogICAgICAgICAgICBtb2RpZCA9IHJlYWRfbW9kdWxlX2ludGVybmFsKHRva2VuKTsKICAgICAgICAgICAgaWYgKG1vZGlkICE9IE1PRFVMRV9MT0FERURfT0sKICAgICAgICAgICAgICAgICYmIG1vZGlkICE9IE1PRFVMRV9BTFJFQURZX0xPQURFRCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIlVua25vd24gbW9kdWxlIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZGlkID0gd2hpY2hfbW9kdWxlKHRva2VuKTsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgPT0gTUFOREFUT1JZR1JPVVBTKSB7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ7XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBncm91cCBuYW1lIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghY29tcGxpYW5jZV9sb29rdXAodG9rZW4sIG1vZGlkKSkKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiVW5rbm93biBncm91cCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0gd2hpbGUgKHR5cGUgPT0gQ09NTUEpOwogICAgICAgICAgICBpZiAodHlwZSAhPSBSSUdIVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIn1cIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgICAgICB3aGlsZSAodHlwZSA9PSBHUk9VUCB8fCB0eXBlID09IE9CSkVDVCkgewogICAgICAgICAgICBpZiAodHlwZSA9PSBHUk9VUCkgewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBncm91cCBuYW1lIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghY29tcGxpYW5jZV9sb29rdXAodG9rZW4sIG1vZGlkKSkKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiVW5rbm93biBncm91cCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEFCRUwpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIG9iamVjdCBuYW1lIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghY29tcGxpYW5jZV9sb29rdXAodG9rZW4sIG1vZGlkKSkKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiVW5rbm93biBncm91cCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBTWU5UQVgpCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGVhdF9zeW50YXgoZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBXUlNZTlRBWCkKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZWF0X3N5bnRheChmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlID09IE1JTkFDQ0VTUykgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gTk9BQ0NFU1MgJiYgdHlwZSAhPSBBQ0NOT1RJRlkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBSRUFET05MWSAmJiB0eXBlICE9IFdSSVRFT05MWQogICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IFJFQURDUkVBVEUgJiYgdHlwZSAhPSBSRUFEV1JJVEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBNSU4tQUNDRVNTIHNwZWMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZSAhPSBERVNDUklQVElPTikgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfQogICAgfQogIHNraXA6CiAgICB3aGlsZSAodHlwZSAhPSBFUVVBTFMgJiYgdHlwZSAhPSBFTkRPRkZJTEUpCiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKCiAgICByZXR1cm4gbWVyZ2VfcGFyc2Vfb2JqZWN0aWQobnAsIGZwLCBuYW1lKTsKfQoKCi8qCiAqIFBhcnNlcyBhIGNhcGFiaWxpdGllcyBtYWNybwogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9jYXBhYmlsaXRpZXMoRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgcXVvdGVkX3N0cmluZ19idWZmZXJbTUFYUVVPVEVTVFJdOwogICAgc3RydWN0IG5vZGUgICAgKm5wOwoKICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IFBST0RSRUwpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgUFJPRFVDVC1SRUxFQVNFIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBTVFJJTkcgYWZ0ZXIgUFJPRFVDVC1SRUxFQVNFIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBTVEFUVVMpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgU1RBVFVTIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBDVVJSRU5UICYmIHR5cGUgIT0gT0JTT0xFVEUpIHsKICAgICAgICBwcmludF9lcnJvcigiU1RBVFVTIHNob3VsZCBiZSBjdXJyZW50IG9yIG9ic29sZXRlIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBERVNDUklQVElPTikgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKSB7CiAgICAgICAgbnAtPmRlc2NyaXB0aW9uID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSA9PSBSRUZFUkVOQ0UpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgUkVGRVJFTkNFIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIG5wLT5yZWZlcmVuY2UgPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCB0eXBlKTsKICAgIH0KICAgIHdoaWxlICh0eXBlID09IFNVUFBPUlRTKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIG1vZGlkOwogICAgICAgIHN0cnVjdCB0cmVlICAgICp0cDsKCiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBMQUJFTCkgewogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIG1vZHVsZSBuYW1lIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIG1vZGlkID0gcmVhZF9tb2R1bGVfaW50ZXJuYWwodG9rZW4pOwogICAgICAgIGlmIChtb2RpZCAhPSBNT0RVTEVfTE9BREVEX09LICYmIG1vZGlkICE9IE1PRFVMRV9BTFJFQURZX0xPQURFRCkgewogICAgICAgICAgICBwcmludF9lcnJvcigiTW9kdWxlIG5vdCBmb3VuZCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICBtb2RpZCA9IHdoaWNoX21vZHVsZSh0b2tlbik7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBJTkNMVURFUykgewogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgSU5DTFVERVMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ7XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgZG8gewogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBMQUJFTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIGdyb3VwIG5hbWUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHAgPSBmaW5kX3RyZWVfbm9kZSh0b2tlbiwgbW9kaWQpOwogICAgICAgICAgICBpZiAoIXRwKQogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkdyb3VwIG5vdCBmb3VuZCBpbiBtb2R1bGUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfSB3aGlsZSAodHlwZSA9PSBDT01NQSk7CiAgICAgICAgaWYgKHR5cGUgIT0gUklHSFRCUkFDS0VUKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIn1cIiBhZnRlciBncm91cCBsaXN0IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgd2hpbGUgKHR5cGUgPT0gVkFSSUFUSU9OKSB7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIG9iamVjdCBuYW1lIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRwID0gZmluZF90cmVlX25vZGUodG9rZW4sIG1vZGlkKTsKICAgICAgICAgICAgaWYgKCF0cCkKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJPYmplY3Qgbm90IGZvdW5kIGluIG1vZHVsZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gU1lOVEFYKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZWF0X3N5bnRheChmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZSA9PSBXUlNZTlRBWCkgewogICAgICAgICAgICAgICAgdHlwZSA9IGVhdF9zeW50YXgoZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGUgPT0gQUNDRVNTKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gQUNDTk9USUZZICYmIHR5cGUgIT0gUkVBRE9OTFkKICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IFJFQURXUklURSAmJiB0eXBlICE9IFJFQURDUkVBVEUKICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IFdSSVRFT05MWSAmJiB0eXBlICE9IE5PVElNUEwpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIEFDQ0VTUyIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlID09IENSRUFURVJFUSkgewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwie1wiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgb2JqZWN0IG5hbWUgaW4gbGlzdCIsIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgfSB3aGlsZSAodHlwZSA9PSBDT01NQSk7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBSSUdIVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ9XCIgYWZ0ZXIgbGlzdCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlID09IERFRlZBTCkgewogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxldmVsID0gMTsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIntcIiBhZnRlciBERUZWQUwiLCB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBMRUZUQlJBQ0tFVCkKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwrKzsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IFJJR0hUQlJBQ0tFVCkKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwtLTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKCh0eXBlICE9IFJJR0hUQlJBQ0tFVCB8fCBsZXZlbCAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBFTkRPRkZJTEUpOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gUklHSFRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIk1pc3NpbmcgXCJ9XCIgYWZ0ZXIgREVGVkFMIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGUgIT0gREVTQ1JJUFRJT04pIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlICE9IEVRVUFMUykKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCI6Oj1cIiIsIHRva2VuLCB0eXBlKTsKICBza2lwOgogICAgd2hpbGUgKHR5cGUgIT0gRVFVQUxTICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgIH0KICAgIHJldHVybiBtZXJnZV9wYXJzZV9vYmplY3RpZChucCwgZnAsIG5hbWUpOwp9CgovKgogKiBQYXJzZXMgYSBtb2R1bGUgaWRlbnRpdHkgbWFjcm8KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIHZvaWQKY2hlY2tfdXRjKGNvbnN0IGNoYXIgKnV0YykKewogICAgaW50ICAgICAgICAgICAgIGxlbiwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlOwoKICAgIGxlbiA9IHN0cmxlbih1dGMpOwogICAgaWYgKHV0Y1tsZW4gLSAxXSAhPSAnWicgJiYgdXRjW2xlbiAtIDFdICE9ICd6JykgewogICAgICAgIHByaW50X2Vycm9yKCJUaW1lc3RhbXAgc2hvdWxkIGVuZCB3aXRoIFoiLCB1dGMsIFFVT1RFU1RSSU5HKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobGVuID09IDExKSB7CiAgICAgICAgbGVuID0KICAgICAgICAgICAgc3NjYW5mKHV0YywgIiUyZCUyZCUyZCUyZCUyZFoiLCAmeWVhciwgJm1vbnRoLCAmZGF5LCAmaG91ciwKICAgICAgICAgICAgICAgICAgICZtaW51dGUpOwogICAgICAgIHllYXIgKz0gMTkwMDsKICAgIH0gZWxzZSBpZiAobGVuID09IDEzKQogICAgICAgIGxlbiA9CiAgICAgICAgICAgIHNzY2FuZih1dGMsICIlNGQlMmQlMmQlMmQlMmRaIiwgJnllYXIsICZtb250aCwgJmRheSwgJmhvdXIsCiAgICAgICAgICAgICAgICAgICAmbWludXRlKTsKICAgIGVsc2UgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgdGltZXN0YW1wIGZvcm1hdCAoMTEgb3IgMTMgY2hhcmFjdGVycykiLAogICAgICAgICAgICAgICAgICAgIHV0YywgUVVPVEVTVFJJTkcpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChsZW4gIT0gNSkgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgdGltZXN0YW1wIGZvcm1hdCIsIHV0YywgUVVPVEVTVFJJTkcpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMikKICAgICAgICBwcmludF9lcnJvcigiQmFkIG1vbnRoIGluIHRpbWVzdGFtcCIsIHV0YywgUVVPVEVTVFJJTkcpOwogICAgaWYgKGRheSA8IDEgfHwgZGF5ID4gMzEpCiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBkYXkgaW4gdGltZXN0YW1wIiwgdXRjLCBRVU9URVNUUklORyk7CiAgICBpZiAoaG91ciA8IDAgfHwgaG91ciA+IDIzKQogICAgICAgIHByaW50X2Vycm9yKCJCYWQgaG91ciBpbiB0aW1lc3RhbXAiLCB1dGMsIFFVT1RFU1RSSU5HKTsKICAgIGlmIChtaW51dGUgPCAwIHx8IG1pbnV0ZSA+IDU5KQogICAgICAgIHByaW50X2Vycm9yKCJCYWQgbWludXRlIGluIHRpbWVzdGFtcCIsIHV0YywgUVVPVEVTVFJJTkcpOwp9CgpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9tb2R1bGVJZGVudGl0eShGSUxFICogZnAsIGNoYXIgKm5hbWUpCnsKICAgIHJlZ2lzdGVyIGludCAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBxdW90ZWRfc3RyaW5nX2J1ZmZlcltNQVhRVU9URVNUUl07CiAgICByZWdpc3RlciBzdHJ1Y3Qgbm9kZSAqbnA7CgogICAgbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gTEFTVFVQREFURUQpIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgTEFTVC1VUERBVEVEIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJOZWVkIFNUUklORyBmb3IgTEFTVC1VUERBVEVEIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIGNoZWNrX3V0Yyh0b2tlbik7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gT1JHQU5JWkFUSU9OKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIE9SR0FOSVpBVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIE9SR0FOSVpBVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gQ09OVEFDVElORk8pIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgQ09OVEFDVC1JTkZPIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgQ09OVEFDVC1JTkZPIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBERVNDUklQVElPTikgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKSB7CiAgICAgICAgbnAtPmRlc2NyaXB0aW9uID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB3aGlsZSAodHlwZSA9PSBSRVZJU0lPTikgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBSRVZJU0lPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICBjaGVja191dGModG9rZW4pOwogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgIT0gREVTQ1JJUFRJT04pIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgaWYgKHR5cGUgIT0gRVFVQUxTKQogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIjo6PVwiIiwgdG9rZW4sIHR5cGUpOwogIHNraXA6CiAgICB3aGlsZSAodHlwZSAhPSBFUVVBTFMgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgfQogICAgcmV0dXJuIG1lcmdlX3BhcnNlX29iamVjdGlkKG5wLCBmcCwgbmFtZSk7Cn0KCgovKgogKiBQYXJzZXMgYSBNQUNSTyBkZWZpbml0aW9uCiAqIEV4cGVjdCBCRUdJTiwgZGlzY2FyZCBldmVyeXRoaW5nIHRvIGVuZC4KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2VfbWFjcm8oRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnA7CiAgICBpbnQgICAgICAgICAgICAgaUxpbmUgPSBtaWJMaW5lOwoKICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIHNpemVvZih0b2tlbikpOwogICAgd2hpbGUgKHR5cGUgIT0gRVFVQUxTICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIHNpemVvZih0b2tlbikpOwogICAgfQogICAgaWYgKHR5cGUgIT0gRVFVQUxTKSB7CiAgICAgICAgaWYgKG5wKQogICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgd2hpbGUgKHR5cGUgIT0gQkVHSU4gJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgc2l6ZW9mKHRva2VuKSk7CiAgICB9CiAgICBpZiAodHlwZSAhPSBCRUdJTikgewogICAgICAgIGlmIChucCkKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHdoaWxlICh0eXBlICE9IEVORCAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBzaXplb2YodG9rZW4pKTsKICAgIH0KICAgIGlmICh0eXBlICE9IEVORCkgewogICAgICAgIGlmIChucCkKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAiJXMgTUFDUk8gKGxpbmVzICVkLi4lZCBwYXJzZWQgYW5kIGlnbm9yZWQpLlxuIiwgbmFtZSwKICAgICAgICAgICAgICAgICBpTGluZSwgbWliTGluZSk7CiAgICB9CgogICAgcmV0dXJuIG5wOwp9CgovKgogKiBQYXJzZXMgYSBtb2R1bGUgaW1wb3J0IGNsYXVzZQogKiAgIGxvYWRpbmcgYW55IG1vZHVsZXMgcmVmZXJlbmNlZAogKi8Kc3RhdGljIHZvaWQKcGFyc2VfaW1wb3J0cyhGSUxFICogZnApCnsKICAgIHJlZ2lzdGVyIGludCAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBtb2RidWZbMjU2XTsKI2RlZmluZSBNQVhfSU1QT1JUUwkyNTYKICAgIHN0cnVjdCBtb2R1bGVfaW1wb3J0IGltcG9ydF9saXN0W01BWF9JTVBPUlRTXTsKICAgIGludCAgICAgICAgICAgICB0aGlzX21vZHVsZTsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKCiAgICBpbnQgICAgICAgICAgICAgaW1wb3J0X2NvdW50ID0gMDsgICAvKiBUb3RhbCBudW1iZXIgb2YgaW1wb3J0ZWQgZGVzY3JpcHRvcnMgKi8KICAgIGludCAgICAgICAgICAgICBpID0gMCwgb2xkX2k7ICAgICAgIC8qIGluZGV4IG9mIGZpcnN0IGltcG9ydCBmcm9tIGVhY2ggbW9kdWxlICovCgogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKCiAgICAvKgogICAgICogUGFyc2UgdGhlIElNUE9SVFMgY2xhdXNlCiAgICAgKi8KICAgIHdoaWxlICh0eXBlICE9IFNFTUkgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICBpZiAodHlwZSA9PSBMQUJFTCkgewogICAgICAgICAgICBpZiAoaW1wb3J0X2NvdW50ID09IE1BWF9JTVBPUlRTKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiVG9vIG1hbnkgaW1wb3J0ZWQgc3ltYm9scyIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgfSB3aGlsZSAodHlwZSAhPSBTRU1JICYmIHR5cGUgIT0gRU5ET0ZGSUxFKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbXBvcnRfbGlzdFtpbXBvcnRfY291bnQrK10ubGFiZWwgPSBzdHJkdXAodG9rZW4pOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBGUk9NKSB7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmIChpbXBvcnRfY291bnQgPT0gaSkgeyAgICAvKiBBbGwgaW1wb3J0cyBhcmUgaGFuZGxlZCBpbnRlcm5hbGx5ICovCiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpc19tb2R1bGUgPSB3aGljaF9tb2R1bGUodG9rZW4pOwoKICAgICAgICAgICAgZm9yIChvbGRfaSA9IGk7IGkgPCBpbXBvcnRfY291bnQ7ICsraSkKICAgICAgICAgICAgICAgIGltcG9ydF9saXN0W2ldLm1vZGlkID0gdGhpc19tb2R1bGU7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBSZWN1cnNpdmVseSByZWFkIGFueSBwcmUtcmVxdWlzaXRlIG1vZHVsZXMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChyZWFkX21vZHVsZV9pbnRlcm5hbCh0b2tlbikgPT0gTU9EVUxFX05PVF9GT1VORCkgewoJCWludCBmb3VuZCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKDsgb2xkX2kgPCBpbXBvcnRfY291bnQ7ICsrb2xkX2kpIHsKICAgICAgICAgICAgICAgICAgICBmb3VuZCArPSByZWFkX2ltcG9ydF9yZXBsYWNlbWVudHModG9rZW4sICZpbXBvcnRfbGlzdFtvbGRfaV0pOwogICAgICAgICAgICAgICAgfQoJCWlmICghZm91bmQpCgkJICAgIHByaW50X21vZHVsZV9ub3RfZm91bmQodG9rZW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CgogICAgLyoKICAgICAqIFNhdmUgdGhlIGltcG9ydCBpbmZvcm1hdGlvbgogICAgICogICBpbiB0aGUgZ2xvYmFsIG1vZHVsZSB0YWJsZQogICAgICovCiAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wOyBtcCA9IG1wLT5uZXh0KQogICAgICAgIGlmIChtcC0+bW9kaWQgPT0gY3VycmVudF9tb2R1bGUpIHsKICAgICAgICAgICAgaWYgKGltcG9ydF9jb3VudCA9PSAwKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAobXAtPmltcG9ydHMgJiYgKG1wLT5pbXBvcnRzICE9IHJvb3RfaW1wb3J0cykpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB0aGlzIGNhbiBoYXBwZW4gaWYgYWxsIG1vZHVsZXMgYXJlIGluIG9uZSBzb3VyY2UgZmlsZS4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtcC0+bm9faW1wb3J0czsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjIyMjIGZyZWVpbmcgTW9kdWxlICVkICclcycgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAtPm1vZGlkLCBtcC0+aW1wb3J0c1tpXS5sYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcC0+aW1wb3J0c1tpXS5tb2RpZCkpOwogICAgICAgICAgICAgICAgICAgIGZyZWUoKGNoYXIgKikgbXAtPmltcG9ydHNbaV0ubGFiZWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnJlZSgoY2hhciAqKSBtcC0+aW1wb3J0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXAtPmltcG9ydHMgPSAoc3RydWN0IG1vZHVsZV9pbXBvcnQgKikKICAgICAgICAgICAgICAgIGNhbGxvYyhpbXBvcnRfY291bnQsIHNpemVvZihzdHJ1Y3QgbW9kdWxlX2ltcG9ydCkpOwogICAgICAgICAgICBpZiAobXAtPmltcG9ydHMgPT0gTlVMTCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGltcG9ydF9jb3VudDsgKytpKSB7CiAgICAgICAgICAgICAgICBtcC0+aW1wb3J0c1tpXS5sYWJlbCA9IGltcG9ydF9saXN0W2ldLmxhYmVsOwogICAgICAgICAgICAgICAgbXAtPmltcG9ydHNbaV0ubW9kaWQgPSBpbXBvcnRfbGlzdFtpXS5tb2RpZDsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjIyMjIGFkZGluZyBNb2R1bGUgJWQgJyVzJyAlZFxuIiwgbXAtPm1vZGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAtPmltcG9ydHNbaV0ubGFiZWwsIG1wLT5pbXBvcnRzW2ldLm1vZGlkKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXAtPm5vX2ltcG9ydHMgPSBpbXBvcnRfY291bnQ7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgLyoKICAgICAqIFNob3VsZG4ndCBnZXQgdGhpcyBmYXIKICAgICAqLwogICAgcHJpbnRfbW9kdWxlX25vdF9mb3VuZChtb2R1bGVfbmFtZShjdXJyZW50X21vZHVsZSwgbW9kYnVmKSk7CiAgICByZXR1cm47Cn0KCgoKLyoKICogTUlCIG1vZHVsZSBoYW5kbGluZyByb3V0aW5lcwogKi8KCnN0YXRpYyB2b2lkCmR1bXBfbW9kdWxlX2xpc3Qodm9pZCkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wID0gbW9kdWxlX2hlYWQ7CgogICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiTW9kdWxlIGxpc3Q6XG4iKSk7CiAgICB3aGlsZSAobXApIHsKICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICIgICVzICVkICVzICVkXG4iLCBtcC0+bmFtZSwgbXAtPm1vZGlkLAogICAgICAgICAgICAgICAgICAgIG1wLT5maWxlLCBtcC0+bm9faW1wb3J0cykpOwogICAgICAgIG1wID0gbXAtPm5leHQ7CiAgICB9Cn0KCmludAp3aGljaF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgaWYgKCFsYWJlbF9jb21wYXJlKG1wLT5uYW1lLCBuYW1lKSkKICAgICAgICAgICAgcmV0dXJuIChtcC0+bW9kaWQpOwoKICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIk1vZHVsZSAlcyBub3QgZm91bmRcbiIsIG5hbWUpKTsKICAgIHJldHVybiAoLTEpOwp9CgovKgogKiBtb2R1bGVfbmFtZSAtIGNvcHkgbW9kdWxlIG5hbWUgdG8gdXNlciBidWZmZXIsIHJldHVybiBwdHIgdG8gc2FtZS4KICovCmNoYXIgICAgICAgICAgICoKbW9kdWxlX25hbWUoaW50IG1vZGlkLCBjaGFyICpjcCkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgaWYgKG1wLT5tb2RpZCA9PSBtb2RpZCkgewogICAgICAgICAgICBzdHJjcHkoY3AsIG1wLT5uYW1lKTsKICAgICAgICAgICAgcmV0dXJuIChjcCk7CiAgICAgICAgfQoKICAgIGlmIChtb2RpZCAhPSAtMSkgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiTW9kdWxlICVkIG5vdCBmb3VuZFxuIiwgbW9kaWQpKTsKICAgIHNwcmludGYoY3AsICIjJWQiLCBtb2RpZCk7CiAgICByZXR1cm4gKGNwKTsKfQoKLyoKICogIEJhY2t3YXJkcyBjb21wYXRhYmlsaXR5CiAqICBSZWFkIG5ld2VyIG1vZHVsZXMgdGhhdCByZXBsYWNlIHRoZSBvbmUgc3BlY2lmaWVkOi0KICogICAgICBlaXRoZXIgYWxsIG9mIHRoZW0gKHJlYWRfbW9kdWxlX3JlcGxhY2VtZW50cyksCiAqICAgICAgb3IgdGhvc2UgcmVsYXRpbmcgdG8gYSBzcGVjaWZpZWQgaWRlbnRpZmllciAocmVhZF9pbXBvcnRfcmVwbGFjZW1lbnRzKQogKiAgICAgIHBsdXMgYW4gaW50ZXJmYWNlIHRvIGFkZCBuZXcgcmVwbGFjZW1lbnQgcmVxdWlyZW1lbnRzCiAqLwp2b2lkCmFkZF9tb2R1bGVfcmVwbGFjZW1lbnQoY29uc3QgY2hhciAqb2xkX21vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuZXdfbW9kdWxlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnLCBpbnQgbGVuKQp7CiAgICBzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkgKm1jcDsKCiAgICBtY3AgPSAoc3RydWN0IG1vZHVsZV9jb21wYXRhYmlsaXR5ICopCiAgICAgICAgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkpKTsKICAgIGlmIChtY3AgPT0gTlVMTCkKICAgICAgICByZXR1cm47CgogICAgbWNwLT5vbGRfbW9kdWxlID0gc3RyZHVwKG9sZF9tb2R1bGUpOwogICAgbWNwLT5uZXdfbW9kdWxlID0gc3RyZHVwKG5ld19tb2R1bGVfbmFtZSk7CiAgICBpZiAodGFnKQogICAgICAgIG1jcC0+dGFnID0gc3RyZHVwKHRhZyk7CiAgICBtY3AtPnRhZ19sZW4gPSBsZW47CgogICAgbWNwLT5uZXh0ID0gbW9kdWxlX21hcF9oZWFkOwogICAgbW9kdWxlX21hcF9oZWFkID0gbWNwOwp9CgpzdGF0aWMgaW50CnJlYWRfbW9kdWxlX3JlcGxhY2VtZW50cyhjb25zdCBjaGFyICpuYW1lKQp7CiAgICBzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkgKm1jcDsKCiAgICBmb3IgKG1jcCA9IG1vZHVsZV9tYXBfaGVhZDsgbWNwOyBtY3AgPSBtY3AtPm5leHQpIHsKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobWNwLT5vbGRfbW9kdWxlLCBuYW1lKSkgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICJMb2FkaW5nIHJlcGxhY2VtZW50IG1vZHVsZSAlcyBmb3IgJXMgKCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1jcC0+bmV3X21vZHVsZSwgbmFtZSwgRmlsZSk7CgkgICAgfQogICAgICAgICAgICAodm9pZCkgbmV0c25tcF9yZWFkX21vZHVsZShtY3AtPm5ld19tb2R1bGUpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludApyZWFkX2ltcG9ydF9yZXBsYWNlbWVudHMoY29uc3QgY2hhciAqb2xkX21vZHVsZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1vZHVsZV9pbXBvcnQgKmlkZW50aWZpZXIpCnsKICAgIHN0cnVjdCBtb2R1bGVfY29tcGF0YWJpbGl0eSAqbWNwOwoKICAgIC8qCiAgICAgKiBMb29rIGZvciBtYXRjaGVzIGZpcnN0CiAgICAgKi8KICAgIGZvciAobWNwID0gbW9kdWxlX21hcF9oZWFkOyBtY3A7IG1jcCA9IG1jcC0+bmV4dCkgewogICAgICAgIGlmICghbGFiZWxfY29tcGFyZShtY3AtPm9sZF9tb2R1bGUsIG9sZF9tb2R1bGVfbmFtZSkpIHsKCiAgICAgICAgICAgIGlmICggICAgICAgICAgICAgICAgLyogZXhhY3QgbWF0Y2ggKi8KICAgICAgICAgICAgICAgICAgIChtY3AtPnRhZ19sZW4gPT0gMCAmJgogICAgICAgICAgICAgICAgICAgIChtY3AtPnRhZyA9PSBOVUxMIHx8CiAgICAgICAgICAgICAgICAgICAgICFsYWJlbF9jb21wYXJlKG1jcC0+dGFnLCBpZGVudGlmaWVyLT5sYWJlbCkpKSB8fAogICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAqIHByZWZpeCBtYXRjaCAKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgKG1jcC0+dGFnX2xlbiAhPSAwICYmCiAgICAgICAgICAgICAgICAgICAgIXN0cm5jbXAobWNwLT50YWcsIGlkZW50aWZpZXItPmxhYmVsLCBtY3AtPnRhZ19sZW4pKQogICAgICAgICAgICAgICAgKSB7CgogICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykpIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wb3J0aW5nICVzIGZyb20gcmVwbGFjZW1lbnQgbW9kdWxlICVzIGluc3RlYWQgb2YgJXMgKCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyLT5sYWJlbCwgbWNwLT5uZXdfbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9tb2R1bGVfbmFtZSwgRmlsZSk7CgkJfQogICAgICAgICAgICAgICAgKHZvaWQpIG5ldHNubXBfcmVhZF9tb2R1bGUobWNwLT5uZXdfbW9kdWxlKTsKICAgICAgICAgICAgICAgIGlkZW50aWZpZXItPm1vZGlkID0gd2hpY2hfbW9kdWxlKG1jcC0+bmV3X21vZHVsZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsgICAgICAgICAvKiBmaW5pc2hlZCEgKi8KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogSWYgbm8gZXhhY3QgbWF0Y2gsIGxvYWQgZXZlcnl0aGluZyByZWxldmFudAogICAgICovCiAgICByZXR1cm4gcmVhZF9tb2R1bGVfcmVwbGFjZW1lbnRzKG9sZF9tb2R1bGVfbmFtZSk7Cn0KCgovKgogKiAgUmVhZCBpbiB0aGUgbmFtZWQgbW9kdWxlCiAqICAgICAgUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgd2hvbGUgdHJlZQogKiAgICAgIChieSBhbmFsb2d5IHdpdGggJ3JlYWRfbWliJykKICovCnN0YXRpYyBpbnQKcmVhZF9tb2R1bGVfaW50ZXJuYWwoY29uc3QgY2hhciAqbmFtZSkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwogICAgRklMRSAgICAgICAgICAgKmZwOwoKICAgIG5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKCk7CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobXAtPm5hbWUsIG5hbWUpKSB7CiAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpvbGRGaWxlID0gRmlsZTsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG9sZExpbmUgPSBtaWJMaW5lOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgb2xkTW9kdWxlID0gY3VycmVudF9tb2R1bGU7CgogICAgICAgICAgICBpZiAobXAtPm5vX2ltcG9ydHMgIT0gLTEpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIk1vZHVsZSAlcyBhbHJlYWR5IGxvYWRlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKICAgICAgICAgICAgICAgIHJldHVybiBNT0RVTEVfQUxSRUFEWV9MT0FERUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChmcCA9IGZvcGVuKG1wLT5maWxlLCAiciIpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IobXAtPmZpbGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE1PRFVMRV9MT0FEX0ZBSUxFRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBtcC0+bm9faW1wb3J0cyA9IDA7IC8qIE5vdGUgdGhhdCB3ZSd2ZSByZWFkIHRoZSBmaWxlICovCiAgICAgICAgICAgIEZpbGUgPSBtcC0+ZmlsZTsKICAgICAgICAgICAgbWliTGluZSA9IDE7CiAgICAgICAgICAgIGN1cnJlbnRfbW9kdWxlID0gbXAtPm1vZGlkOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQYXJzZSB0aGUgZmlsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGFyc2UoZnAsIE5VTEwpOwogICAgICAgICAgICBmY2xvc2UoZnApOwogICAgICAgICAgICBGaWxlID0gb2xkRmlsZTsKICAgICAgICAgICAgbWliTGluZSA9IG9sZExpbmU7CiAgICAgICAgICAgIGN1cnJlbnRfbW9kdWxlID0gb2xkTW9kdWxlOwogICAgICAgICAgICByZXR1cm4gTU9EVUxFX0xPQURFRF9PSzsKICAgICAgICB9CgogICAgcmV0dXJuIE1PRFVMRV9OT1RfRk9VTkQ7Cn0KCnZvaWQKYWRvcHRfb3JwaGFucyh2b2lkKQp7CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnAsICpvbnA7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CiAgICBpbnQgICAgICAgICAgICAgaSwgYWRvcHRlZCA9IDE7CgogICAgaWYgKCFvcnBoYW5fbm9kZXMpCiAgICAgICAgcmV0dXJuOwogICAgaW5pdF9ub2RlX2hhc2gob3JwaGFuX25vZGVzKTsKICAgIG9ycGhhbl9ub2RlcyA9IE5VTEw7CgogICAgd2hpbGUgKGFkb3B0ZWQpIHsKICAgICAgICBhZG9wdGVkID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkhBU0hTSVpFOyBpKyspCiAgICAgICAgICAgIGlmIChuYnVja2V0c1tpXSkgewogICAgICAgICAgICAgICAgZm9yIChucCA9IG5idWNrZXRzW2ldOyBucCAhPSBOVUxMOyBucCA9IG5wLT5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgdHAgPSBmaW5kX3RyZWVfbm9kZShucC0+cGFyZW50LCAtMSk7CgkJICAgIGlmICh0cCkgewoJCQlkb19zdWJ0cmVlKHRwLCAmbnApOwoJCQlhZG9wdGVkID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICogaWYgZG9fc3VidHJlZSBhZG9wdGVkIHRoZSBlbnRpcmUgYnVja2V0LCBzdG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZihOVUxMID09IG5idWNrZXRzW2ldKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBkb19zdWJ0cmVlIG1heSBtb2RpZnkgbmJ1Y2tldHMsIGFuZCBpZiBucAogICAgICAgICAgICAgICAgICAgICAgICAgKiB3YXMgYWRvcHRlZCwgbnAtPm5leHQgcHJvYmFibHkgaXNuJ3QgYW4gb3JwaGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGFueW1vcmUuIGlmIG5wIGlzIHN0aWxsIGluIHRoZSBidWNrZXQgKGRvX3N1YnRyZWUKICAgICAgICAgICAgICAgICAgICAgICAgICogZGlkbid0IGFkb3B0IGl0KSBrZWVwIG9uIHBsdWdnaW5nLiBvdGhlcndpc2UKICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhcnQgb3ZlciwgYXQgdGhlIHRvcCBvZiB0aGUgYnVja2V0LgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgZm9yKG9ucCA9IG5idWNrZXRzW2ldOyBvbnA7IG9ucCA9IG9ucC0+bmV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9ucCA9PSBucCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBvbnApIHsgLyogbm90IGluIHRoZSBsaXN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucCA9IG5idWNrZXRzW2ldOyAvKiBzdGFydCBvdmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkgICAgfQoJCX0KICAgICAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBSZXBvcnQgb24gb3V0c3RhbmRpbmcgb3JwaGFucwogICAgICogICAgYW5kIGxpbmsgdGhlbSBiYWNrIGludG8gdGhlIG9ycGhhbiBsaXN0CiAgICAgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBOSEFTSFNJWkU7IGkrKykKICAgICAgICBpZiAobmJ1Y2tldHNbaV0pIHsKICAgICAgICAgICAgaWYgKG9ycGhhbl9ub2RlcykKICAgICAgICAgICAgICAgIG9ucCA9IG5wLT5uZXh0ID0gbmJ1Y2tldHNbaV07CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIG9ucCA9IG9ycGhhbl9ub2RlcyA9IG5idWNrZXRzW2ldOwogICAgICAgICAgICBuYnVja2V0c1tpXSA9IE5VTEw7CiAgICAgICAgICAgIHdoaWxlIChvbnApIHsKICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBtb2RidWZbMjU2XTsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBhZG9wdCBPSUQgaW4gJXM6ICVzIDo6PSB7ICVzICVsZCB9XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUob25wLT5tb2RpZCwgbW9kYnVmKSwKICAgICAgICAgICAgICAgICAgICAgICAgIChvbnAtPmxhYmVsID8gb25wLT5sYWJlbCA6ICI8bm8gbGFiZWw+IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAob25wLT5wYXJlbnQgPyBvbnAtPnBhcmVudCA6ICI8bm8gcGFyZW50PiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgb25wLT5zdWJpZCk7CgogICAgICAgICAgICAgICAgbnAgPSBvbnA7CiAgICAgICAgICAgICAgICBvbnAgPSBvbnAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9DTEVBTl9OQU1FU1BBQ0UKc3RydWN0IHRyZWUgICAgKgpyZWFkX21vZHVsZShjb25zdCBjaGFyICpuYW1lKQp7CiAgICByZXR1cm4gbmV0c25tcF9yZWFkX21vZHVsZShuYW1lKTsKfQojZW5kaWYKCnN0cnVjdCB0cmVlICAgICoKbmV0c25tcF9yZWFkX21vZHVsZShjb25zdCBjaGFyICpuYW1lKQp7CiAgICBpZiAocmVhZF9tb2R1bGVfaW50ZXJuYWwobmFtZSkgPT0gTU9EVUxFX05PVF9GT1VORCkKICAgICAgICBpZiAoIXJlYWRfbW9kdWxlX3JlcGxhY2VtZW50cyhuYW1lKSkKCSAgICBwcmludF9tb2R1bGVfbm90X2ZvdW5kKG5hbWUpOwogICAgcmV0dXJuIHRyZWVfaGVhZDsKfQoKLyoKICogUHJvdG90eXBlIGRlZmluaXRpb24gCiAqLwp2b2lkICAgICAgICAgICAgdW5sb2FkX21vZHVsZV9ieV9JRChpbnQgbW9kSUQsIHN0cnVjdCB0cmVlICp0cmVlX3RvcCk7Cgp2b2lkCnVubG9hZF9tb2R1bGVfYnlfSUQoaW50IG1vZElELCBzdHJ1Y3QgdHJlZSAqdHJlZV90b3ApCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCwgKm5leHQ7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICBmb3IgKHRwID0gdHJlZV90b3A7IHRwOyB0cCA9IG5leHQpIHsKICAgICAgICAvKgogICAgICAgICAqIEVzc2VudGlhbGx5LCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvZGUgZnJhZ21lbnQ6CiAgICAgICAgICogICAgICBpZiAodHAtPm1vZElEID09IG1vZElEKQogICAgICAgICAqICAgICAgICB0cC0+bnVtYmVyX21vZHVsZXMtLTsKICAgICAgICAgKiBidXQgaGFuZGxlcyBvbmUgdHJlZSBub2RlIGJlaW5nIHBhcnQgb2Ygc2V2ZXJhbCBtb2R1bGVzLAogICAgICAgICAqIGFuZCBwb3NzaWJsZSBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgbW9kdWxlIElELgogICAgICAgICAqLwogICAgICAgIGludCAgICAgICAgICAgICBubW9kID0gdHAtPm51bWJlcl9tb2R1bGVzOwogICAgICAgIGlmIChubW9kID4gMCkgeyAgICAgICAgIC8qIGluIHNvbWUgbW9kdWxlICovCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFJlbW92ZSBhbGwgY29waWVzIG9mIHRoaXMgbW9kdWxlIElECiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgY250ID0gMCwgKnBpMSwgKnBpMiA9IHRwLT5tb2R1bGVfbGlzdDsKICAgICAgICAgICAgZm9yIChpID0gMCwgcGkxID0gcGkyOyBpIDwgbm1vZDsgaSsrLCBwaTIrKykgewogICAgICAgICAgICAgICAgaWYgKCpwaTIgPT0gbW9kSUQpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICBjbnQrKzsKICAgICAgICAgICAgICAgICpwaTErKyA9ICpwaTI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5tb2QgIT0gY250KSB7ICAvKiBpbiB0aGlzIG1vZHVsZSAqLwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGlmICggKG5tb2QgLSBjbnQpID4gMSkKICAgICAgICAgICAgICAgICAqIHByaW50ZigiRHVwIG1vZGlkICVkLCAgJWQgdGltZXMsICclcydcbiIsIHRwLT5tb2RpZCwgKG5tb2QtY250KSwgdHAtPmxhYmVsKTsgZmZsdXNoKHN0ZG91dCk7ID8qIFhYREVCVUcgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHRwLT5udW1iZXJfbW9kdWxlcyA9IGNudDsKICAgICAgICAgICAgICAgIHN3aXRjaCAoY250KSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgdHAtPm1vZHVsZV9saXN0WzBdID0gLTE7ICAgIC8qIE1hcmsgdW51c2VkLCBhbmQgRkFMTCBUSFJPVUdIICovCgogICAgICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgLyogc2F2ZSB0aGUgcmVtYWluaW5nIG1vZHVsZSAqLwogICAgICAgICAgICAgICAgICAgIGlmICgmKHRwLT5tb2RpZCkgIT0gdHAtPm1vZHVsZV9saXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb2RpZCA9IHRwLT5tb2R1bGVfbGlzdFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh0cC0+bW9kdWxlX2xpc3QpOwogICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9kdWxlX2xpc3QgPSAmKHRwLT5tb2RpZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogaWYgdHJlZSBub2RlIGlzIGluIHRoaXMgbW9kdWxlICovCiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogaWYgdHJlZSBub2RlIGlzIGluIHNvbWUgbW9kdWxlIAogICAgICAgICAqLwogICAgICAgIG5leHQgPSB0cC0+bmV4dF9wZWVyOwoKCiAgICAgICAgLyoKICAgICAgICAgKiAgT0sgLSB0aGF0J3MgZGVhbHQgd2l0aCAqdGhpcyogbm9kZS4KICAgICAgICAgKiAgICBOb3cgbGV0J3MgbG9vayBhdCB0aGUgY2hpbGRyZW4uCiAgICAgICAgICogICAgKElzbid0IHJlY3Vyc2lvbiB3b25kZXJmdWwhKQogICAgICAgICAqLwogICAgICAgIGlmICh0cC0+Y2hpbGRfbGlzdCkKICAgICAgICAgICAgdW5sb2FkX21vZHVsZV9ieV9JRChtb2RJRCwgdHAtPmNoaWxkX2xpc3QpOwoKCiAgICAgICAgaWYgKHRwLT5udW1iZXJfbW9kdWxlcyA9PSAwKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFRoaXMgbm9kZSBpc24ndCBuZWVkZWQgYW55IG1vcmUgKGV4Y2VwdCBwZXJoYXBzCiAgICAgICAgICAgICAqIGZvciB0aGUgc2FrZSBvZiB0aGUgY2hpbGRyZW4pIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHRwLT5jaGlsZF9saXN0ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHVubGlua190cmVlKHRwKTsKICAgICAgICAgICAgICAgIGZyZWVfdHJlZSh0cCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcmVlX3BhcnRpYWxfdHJlZSh0cCwgVFJVRSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9DTEVBTl9OQU1FU1BBQ0UKaW50CnVubG9hZF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKewogICAgcmV0dXJuIG5ldHNubXBfdW5sb2FkX21vZHVsZShuYW1lKTsKfQojZW5kaWYKCmludApuZXRzbm1wX3VubG9hZF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwogICAgaW50ICAgICAgICAgICAgIG1vZElEID0gLTE7CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobXAtPm5hbWUsIG5hbWUpKSB7CiAgICAgICAgICAgIG1vZElEID0gbXAtPm1vZGlkOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgaWYgKG1vZElEID09IC0xKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVubG9hZC1taWIiLCAiTW9kdWxlICVzIG5vdCBmb3VuZCB0byB1bmxvYWRcbiIsCiAgICAgICAgICAgICAgICAgICAgbmFtZSkpOwogICAgICAgIHJldHVybiBNT0RVTEVfTk9UX0ZPVU5EOwogICAgfQogICAgdW5sb2FkX21vZHVsZV9ieV9JRChtb2RJRCwgdHJlZV9oZWFkKTsKICAgIG1wLT5ub19pbXBvcnRzID0gLTE7ICAgICAgICAvKiBtYXJrIGFzIHVubG9hZGVkICovCiAgICByZXR1cm4gTU9EVUxFX0xPQURFRF9PSzsgICAgLyogV2VsbCwgeW91IGtub3cgd2hhdCBJIG1lYW4hICovCn0KCi8qCiAqIENsZWFyIG1vZHVsZSBtYXAsIHRyZWUgbm9kZXMsIHRleHR1YWwgY29udmVudGlvbiB0YWJsZS4KICovCnZvaWQKdW5sb2FkX2FsbF9taWJzKCkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwogICAgc3RydWN0IG1vZHVsZV9jb21wYXRhYmlsaXR5ICptY3A7CiAgICBzdHJ1Y3QgdGMgICAgICAqcHRjOwogICAgaW50ICAgICAgICAgICAgIGk7CgogICAgZm9yIChtY3AgPSBtb2R1bGVfbWFwX2hlYWQ7IG1jcDsgbWNwID0gbW9kdWxlX21hcF9oZWFkKSB7CiAgICAgICAgaWYgKG1jcCA9PSBtb2R1bGVfbWFwKQogICAgICAgICAgICBicmVhazsKICAgICAgICBtb2R1bGVfbWFwX2hlYWQgPSBtY3AtPm5leHQ7CiAgICAgICAgaWYgKG1jcC0+dGFnKSBmcmVlKE5FVFNOTVBfUkVNT1ZFX0NPTlNUKGNoYXIgKiwgbWNwLT50YWcpKTsKICAgICAgICBmcmVlKE5FVFNOTVBfUkVNT1ZFX0NPTlNUKGNoYXIgKiwgbWNwLT5vbGRfbW9kdWxlKSk7CiAgICAgICAgZnJlZShORVRTTk1QX1JFTU9WRV9DT05TVChjaGFyICosIG1jcC0+bmV3X21vZHVsZSkpOwogICAgICAgIGZyZWUobWNwKTsKICAgIH0KCiAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wOyBtcCA9IG1vZHVsZV9oZWFkKSB7CiAgICAgICAgc3RydWN0IG1vZHVsZV9pbXBvcnQgKm1pID0gbXAtPmltcG9ydHM7CiAgICAgICAgaWYgKG1pKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtcC0+bm9faW1wb3J0czsgKytpKSB7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoKG1pICsgaSktPmxhYmVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtcC0+bm9faW1wb3J0cyA9IDA7CiAgICAgICAgICAgIGlmIChtaSA9PSByb290X2ltcG9ydHMpCiAgICAgICAgICAgICAgICBtZW1zZXQobWksIDAsIHNpemVvZigqbWkpKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZnJlZShtaSk7CiAgICAgICAgfQoKICAgICAgICB1bmxvYWRfbW9kdWxlX2J5X0lEKG1wLT5tb2RpZCwgdHJlZV9oZWFkKTsKICAgICAgICBtb2R1bGVfaGVhZCA9IG1wLT5uZXh0OwogICAgICAgIGZyZWUobXAtPm5hbWUpOwogICAgICAgIGZyZWUobXAtPmZpbGUpOwogICAgICAgIGZyZWUobXApOwogICAgfQogICAgdW5sb2FkX21vZHVsZV9ieV9JRCgtMSwgdHJlZV9oZWFkKTsKICAgIC8qCiAgICAgKiB0cmVlIG5vZGVzIGFyZSBjbGVhcmVkIAogICAgICovCgogICAgZm9yIChpID0gMCwgcHRjID0gdGNsaXN0OyBpIDwgTUFYVEM7IGkrKywgcHRjKyspIHsKICAgICAgICBpZiAocHRjLT50eXBlID09IDApCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGZyZWVfZW51bXMoJnB0Yy0+ZW51bXMpOwogICAgICAgIGZyZWVfcmFuZ2VzKCZwdGMtPnJhbmdlcyk7CiAgICAgICAgZnJlZShwdGMtPmRlc2NyaXB0b3IpOwogICAgICAgIGlmIChwdGMtPmhpbnQpCiAgICAgICAgICAgIGZyZWUocHRjLT5oaW50KTsKICAgICAgICBpZiAocHRjLT5kZXNjcmlwdGlvbikKICAgICAgICAgICAgZnJlZShwdGMtPmRlc2NyaXB0aW9uKTsKICAgIH0KICAgIG1lbXNldCh0Y2xpc3QsIDAsIE1BWFRDICogc2l6ZW9mKHN0cnVjdCB0YykpOwoKICAgIG1lbXNldChidWNrZXRzLCAwLCBzaXplb2YoYnVja2V0cykpOwogICAgbWVtc2V0KG5idWNrZXRzLCAwLCBzaXplb2YobmJ1Y2tldHMpKTsKICAgIG1lbXNldCh0YnVja2V0cywgMCwgc2l6ZW9mKHRidWNrZXRzKSk7CgogICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihyb290X2ltcG9ydHMpIC8gc2l6ZW9mKHJvb3RfaW1wb3J0c1swXSk7IGkrKykgewogICAgICAgIFNOTVBfRlJFRShyb290X2ltcG9ydHNbaV0ubGFiZWwpOwogICAgfQoKICAgIG1heF9tb2R1bGUgPSAwOwogICAgY3VycmVudF9tb2R1bGUgPSAwOwogICAgbW9kdWxlX21hcF9oZWFkID0gTlVMTDsKICAgIFNOTVBfRlJFRShsYXN0X2Vycl9tb2R1bGUpOwp9CgpzdGF0aWMgdm9pZApuZXdfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmZpbGUpCnsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKCiAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wOyBtcCA9IG1wLT5uZXh0KQogICAgICAgIGlmICghbGFiZWxfY29tcGFyZShtcC0+bmFtZSwgbmFtZSkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiICBNb2R1bGUgJXMgYWxyZWFkeSBub3RlZFxuIiwgbmFtZSkpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBOb3QgdGhlIHNhbWUgZmlsZSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChsYWJlbF9jb21wYXJlKG1wLT5maWxlLCBmaWxlKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiICAgICVzIGlzIG5vdyBpbiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGZpbGUpKTsKICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IE1vZHVsZSAlcyB3YXMgaW4gJXMgbm93IGlzICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1wLT5maWxlLCBmaWxlKTsKCQl9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFVzZSB0aGUgbmV3IG9uZSBpbiBwcmVmZXJlbmNlIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmcmVlKG1wLT5maWxlKTsKICAgICAgICAgICAgICAgIG1wLT5maWxlID0gc3RyZHVwKGZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgLyoKICAgICAqIEFkZCB0aGlzIG1vZHVsZSB0byB0aGUgbGlzdCAKICAgICAqLwogICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiICBNb2R1bGUgJWQgJXMgaXMgaW4gJXNcbiIsIG1heF9tb2R1bGUsCiAgICAgICAgICAgICAgICBuYW1lLCBmaWxlKSk7CiAgICBtcCA9IChzdHJ1Y3QgbW9kdWxlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IG1vZHVsZSkpOwogICAgaWYgKG1wID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwogICAgbXAtPm5hbWUgPSBzdHJkdXAobmFtZSk7CiAgICBtcC0+ZmlsZSA9IHN0cmR1cChmaWxlKTsKICAgIG1wLT5pbXBvcnRzID0gTlVMTDsKICAgIG1wLT5ub19pbXBvcnRzID0gLTE7ICAgICAgICAvKiBOb3QgeWV0IGxvYWRlZCAqLwogICAgbXAtPm1vZGlkID0gbWF4X21vZHVsZTsKICAgICsrbWF4X21vZHVsZTsKCiAgICBtcC0+bmV4dCA9IG1vZHVsZV9oZWFkOyAgICAgLyogT3IgYWRkIHRvIHRoZSAqZW5kKiBvZiB0aGUgbGlzdD8gKi8KICAgIG1vZHVsZV9oZWFkID0gbXA7Cn0KCgpzdGF0aWMgdm9pZApzY2FuX29iamxpc3Qoc3RydWN0IG5vZGUgKnJvb3QsIHN0cnVjdCBvYmpncm91cCAqbGlzdCwgY29uc3QgY2hhciAqZXJyb3IpCnsKICAgIGludCAgICAgICAgICAgICBvTGluZSA9IG1pYkxpbmU7CgogICAgd2hpbGUgKGxpc3QpIHsKICAgICAgICBzdHJ1Y3Qgb2JqZ3JvdXAgKmdwID0gbGlzdDsKICAgICAgICBzdHJ1Y3Qgbm9kZSAgICAqbnA7CiAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CiAgICAgICAgbnAgPSByb290OwogICAgICAgIHdoaWxlIChucCkKICAgICAgICAgICAgaWYgKGxhYmVsX2NvbXBhcmUobnAtPmxhYmVsLCBncC0+bmFtZSkpCiAgICAgICAgICAgICAgICBucCA9IG5wLT5uZXh0OwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBpZiAoIW5wKSB7CiAgICAgICAgICAgIG1pYkxpbmUgPSBncC0+bGluZTsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoZXJyb3IsIGdwLT5uYW1lLCBRVU9URVNUUklORyk7CiAgICAgICAgfQogICAgICAgIGZyZWUoZ3AtPm5hbWUpOwogICAgICAgIGZyZWUoZ3ApOwogICAgfQogICAgbWliTGluZSA9IG9MaW5lOwp9CgovKgogKiBQYXJzZXMgYSBtaWIgZmlsZSBhbmQgcmV0dXJucyBhIGxpbmtlZCBsaXN0IG9mIG5vZGVzIGZvdW5kIGluIHRoZSBmaWxlLgogKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZShGSUxFICogZnAsIHN0cnVjdCBub2RlICpyb290KQp7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIG5hbWVbTUFYVE9LRU4rMV07CiAgICBpbnQgICAgICAgICAgICAgdHlwZSA9IExBQkVMOwogICAgaW50ICAgICAgICAgICAgIGxhc3R0eXBlID0gTEFCRUw7CgojZGVmaW5lIEJFVFdFRU5fTUlCUyAgICAgICAgICAxCiNkZWZpbmUgSU5fTUlCICAgICAgICAgICAgICAgIDIKICAgIGludCAgICAgICAgICAgICBzdGF0ZSA9IEJFVFdFRU5fTUlCUzsKICAgIHN0cnVjdCBub2RlICAgICpucCwgKm5ucDsKICAgIHN0cnVjdCBvYmpncm91cCAqb2xkZ3JvdXBzID0gTlVMTCwgKm9sZG9iamVjdHMgPSBOVUxMLCAqb2xkbm90aWZzID0KICAgICAgICBOVUxMOwoKICAgIERFQlVHTVNHVEwoKCJwYXJzZS1maWxlIiwgIlBhcnNpbmcgZmlsZTogICVzLi4uXG4iLCBGaWxlKSk7CgogICAgaWYgKGxhc3RfZXJyX21vZHVsZSkKICAgICAgICBmcmVlKGxhc3RfZXJyX21vZHVsZSk7CiAgICBsYXN0X2Vycl9tb2R1bGUgPSAwOwoKICAgIG5wID0gcm9vdDsKICAgIGlmIChucCAhPSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBub3cgZmluZCBlbmQgb2YgY2hhaW4gCiAgICAgICAgICovCiAgICAgICAgd2hpbGUgKG5wLT5uZXh0KQogICAgICAgICAgICBucCA9IG5wLT5uZXh0OwogICAgfQoKICAgIHdoaWxlICh0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIGlmIChsYXN0dHlwZSA9PSBDT05USU5VRSkKICAgICAgICAgICAgbGFzdHR5cGUgPSB0eXBlOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdHlwZSA9IGxhc3R0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwoKICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICBjYXNlIEVORDoKICAgICAgICAgICAgaWYgKHN0YXRlICE9IElOX01JQikgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkVycm9yLCBFTkQgYmVmb3JlIHN0YXJ0IG9mIE1JQiIsIE5VTEwsIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CiNpZmRlZiBURVNUCiAgICAgICAgICAgICAgICBwcmludGYoIlxuTm9kZXMgZm9yIE1vZHVsZSAlczpcbiIsIG5hbWUpOwogICAgICAgICAgICAgICAgcHJpbnRfbm9kZXMoc3Rkb3V0LCByb290KTsKI2VuZGlmCiAgICAgICAgICAgICAgICBzY2FuX29iamxpc3Qocm9vdCwgb2JqZ3JvdXBzLCAiVW5kZWZpbmVkIE9CSkVDVC1HUk9VUCIpOwogICAgICAgICAgICAgICAgc2Nhbl9vYmpsaXN0KHJvb3QsIG9iamVjdHMsICJVbmRlZmluZWQgT0JKRUNUIik7CiAgICAgICAgICAgICAgICBzY2FuX29iamxpc3Qocm9vdCwgbm90aWZzLCAiVW5kZWZpbmVkIE5PVElGSUNBVElPTiIpOwogICAgICAgICAgICAgICAgb2JqZ3JvdXBzID0gb2xkZ3JvdXBzOwogICAgICAgICAgICAgICAgb2JqZWN0cyA9IG9sZG9iamVjdHM7CiAgICAgICAgICAgICAgICBub3RpZnMgPSBvbGRub3RpZnM7CiAgICAgICAgICAgICAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wOyBtcCA9IG1wLT5uZXh0KQogICAgICAgICAgICAgICAgICAgIGlmIChtcC0+bW9kaWQgPT0gY3VycmVudF9tb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZG9fbGlua3VwKG1wLCByb290KTsKICAgICAgICAgICAgICAgIG5wID0gcm9vdCA9IE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUgPSBCRVRXRUVOX01JQlM7CiNpZmRlZiBURVNUCiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykpIHsKICAgICAgICAgICAgICAgIHhtYWxsb2Nfc3RhdHMoc3RkZXJyKTsKCSAgICB9CiNlbmRpZgogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIElNUE9SVFM6CiAgICAgICAgICAgIHBhcnNlX2ltcG9ydHMoZnApOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIEVYUE9SVFM6CiAgICAgICAgICAgIHdoaWxlICh0eXBlICE9IFNFTUkgJiYgdHlwZSAhPSBFTkRPRkZJTEUpCiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIExBQkVMOgogICAgICAgIGNhc2UgSU5URUdFUjoKICAgICAgICBjYXNlIElOVEVHRVIzMjoKICAgICAgICBjYXNlIFVJTlRFR0VSMzI6CiAgICAgICAgY2FzZSBVTlNJR05FRDMyOgogICAgICAgIGNhc2UgQ09VTlRFUjoKICAgICAgICBjYXNlIENPVU5URVI2NDoKICAgICAgICBjYXNlIEdBVUdFOgogICAgICAgIGNhc2UgSVBBRERSOgogICAgICAgIGNhc2UgTkVUQUREUjoKICAgICAgICBjYXNlIE5TQVBBRERSRVNTOgogICAgICAgIGNhc2UgT0JKU1lOVEFYOgogICAgICAgIGNhc2UgQVBQU1lOVEFYOgogICAgICAgIGNhc2UgU0lNUExFU1lOVEFYOgogICAgICAgIGNhc2UgT0JKTkFNRToKICAgICAgICBjYXNlIE5PVElGTkFNRToKICAgICAgICBjYXNlIEtXX09QQVFVRToKICAgICAgICBjYXNlIFRJTUVUSUNLUzoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFTkRPRkZJTEU6CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHN0cmxjcHkobmFtZSwgdG9rZW4sIHNpemVvZihuYW1lKSk7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIG5ucCA9IE5VTEw7CiAgICAgICAgICAgIGlmICh0eXBlID09IE1BQ1JPKSB7CiAgICAgICAgICAgICAgICBubnAgPSBwYXJzZV9tYWNybyhmcCwgbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE1BQ1JPIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZyZWVfbm9kZShubnApOyAvKiBJR05PUkUgKi8KICAgICAgICAgICAgICAgIG5ucCA9IE5VTEw7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IobmFtZSwgImlzIGEgcmVzZXJ2ZWQgd29yZCIsIGxhc3R0eXBlKTsKICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAvKiBzZWUgaWYgd2UgY2FuIHBhcnNlIHRoZSByZXN0IG9mIHRoZSBmaWxlICovCiAgICAgICAgfQogICAgICAgIHN0cmxjcHkobmFtZSwgdG9rZW4sIHNpemVvZihuYW1lKSk7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBubnAgPSBOVUxMOwoKICAgICAgICAvKgogICAgICAgICAqIEhhbmRsZSBvYnNvbGV0ZSBtZXRob2QgdG8gYXNzaWduIGFuIG9iamVjdCBpZGVudGlmaWVyIHRvIGEKICAgICAgICAgKiBtb2R1bGUKICAgICAgICAgKi8KICAgICAgICBpZiAobGFzdHR5cGUgPT0gTEFCRUwgJiYgdHlwZSA9PSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICB3aGlsZSAodHlwZSAhPSBSSUdIVEJSQUNLRVQgJiYgdHlwZSAhPSBFTkRPRkZJTEUpCiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSA9PSBFTkRPRkZJTEUpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIn1cIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICBjYXNlIERFRklOSVRJT05TOgogICAgICAgICAgICBpZiAoc3RhdGUgIT0gQkVUV0VFTl9NSUJTKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXJyb3IsIG5lc3RlZCBNSUJTIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZSA9IElOX01JQjsKICAgICAgICAgICAgY3VycmVudF9tb2R1bGUgPSB3aGljaF9tb2R1bGUobmFtZSk7CiAgICAgICAgICAgIG9sZGdyb3VwcyA9IG9iamdyb3VwczsKICAgICAgICAgICAgb2JqZ3JvdXBzID0gTlVMTDsKICAgICAgICAgICAgb2xkb2JqZWN0cyA9IG9iamVjdHM7CiAgICAgICAgICAgIG9iamVjdHMgPSBOVUxMOwogICAgICAgICAgICBvbGRub3RpZnMgPSBub3RpZnM7CiAgICAgICAgICAgIG5vdGlmcyA9IE5VTEw7CiAgICAgICAgICAgIGlmIChjdXJyZW50X21vZHVsZSA9PSAtMSkgewogICAgICAgICAgICAgICAgbmV3X21vZHVsZShuYW1lLCBGaWxlKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRfbW9kdWxlID0gd2hpY2hfbW9kdWxlKG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIlBhcnNpbmcgTUlCOiAlZCAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9tb2R1bGUsIG5hbWUpKTsKICAgICAgICAgICAgd2hpbGUgKCh0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pKSAhPSBFTkRPRkZJTEUpCiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBCRUdJTikKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPQkpUWVBFOgogICAgICAgICAgICBubnAgPSBwYXJzZV9vYmplY3R0eXBlKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE9CSkVDVC1UWVBFIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE9CSkdST1VQOgogICAgICAgICAgICBubnAgPSBwYXJzZV9vYmplY3Rncm91cChmcCwgbmFtZSwgT0JKRUNUUywgJm9iamVjdHMpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgT0JKRUNULUdST1VQIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5PVElGR1JPVVA6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX29iamVjdGdyb3VwKGZwLCBuYW1lLCBOT1RJRklDQVRJT05TLCAmbm90aWZzKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE5PVElGSUNBVElPTi1HUk9VUCIsIE5VTEwsIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUUkFQVFlQRToKICAgICAgICAgICAgbm5wID0gcGFyc2VfdHJhcERlZmluaXRpb24oZnAsIG5hbWUpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgVFJBUC1UWVBFIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5PVElGVFlQRToKICAgICAgICAgICAgbm5wID0gcGFyc2Vfbm90aWZpY2F0aW9uRGVmaW5pdGlvbihmcCwgbmFtZSk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBOT1RJRklDQVRJT04tVFlQRSIsIE5VTEwsIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDT01QTElBTkNFOgogICAgICAgICAgICBubnAgPSBwYXJzZV9jb21wbGlhbmNlKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE1PRFVMRS1DT01QTElBTkNFIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFHRU5UQ0FQOgogICAgICAgICAgICBubnAgPSBwYXJzZV9jYXBhYmlsaXRpZXMoZnAsIG5hbWUpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgQUdFTlQtQ0FQQUJJTElUSUVTIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1BQ1JPOgogICAgICAgICAgICBubnAgPSBwYXJzZV9tYWNybyhmcCwgbmFtZSk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBNQUNSTyIsIE5VTEwsIHR5cGUpOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZV9ub2RlKG5ucCk7ICAgICAvKiBJR05PUkUgKi8KICAgICAgICAgICAgbm5wID0gTlVMTDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNT0RVTEVJREVOVElUWToKICAgICAgICAgICAgbm5wID0gcGFyc2VfbW9kdWxlSWRlbnRpdHkoZnAsIG5hbWUpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgTU9EVUxFLUlERU5USVRZIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE9CSklERU5USVRZOgogICAgICAgICAgICBubnAgPSBwYXJzZV9vYmplY3Rncm91cChmcCwgbmFtZSwgT0JKRUNUUywgJm9iamVjdHMpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgT0JKRUNULUlERU5USVRZIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE9CSkVDVDoKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gSURFTlRJRklFUikgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIElERU5USUZJRVIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBFUVVBTFMpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIjo6PVwiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm5wID0gcGFyc2Vfb2JqZWN0aWQoZnAsIG5hbWUpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgT0JKRUNUIElERU5USUZJRVIiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRVFVQUxTOgogICAgICAgICAgICBubnAgPSBwYXJzZV9hc250eXBlKGZwLCBuYW1lLCAmdHlwZSwgdG9rZW4pOwogICAgICAgICAgICBsYXN0dHlwZSA9IENPTlRJTlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVORE9GRklMRToKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBvcGVyYXRvciIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGlmIChubnApIHsKICAgICAgICAgICAgaWYgKG5wKQogICAgICAgICAgICAgICAgbnAtPm5leHQgPSBubnA7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIG5wID0gcm9vdCA9IG5ucDsKICAgICAgICAgICAgd2hpbGUgKG5wLT5uZXh0KQogICAgICAgICAgICAgICAgbnAgPSBucC0+bmV4dDsKICAgICAgICAgICAgaWYgKG5wLT50eXBlID09IFRZUEVfT1RIRVIpCiAgICAgICAgICAgICAgICBucC0+dHlwZSA9IHR5cGU7CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0dUTCgoInBhcnNlLWZpbGUiLCAiRW5kIG9mIGZpbGUgKCVzKVxuIiwgRmlsZSkpOwogICAgcmV0dXJuIHJvb3Q7Cn0KCi8qCiAqIHJldHVybiB6ZXJvIGlmIGNoYXJhY3RlciBpcyBub3QgYSBsYWJlbCBjaGFyYWN0ZXIuIAogKi8Kc3RhdGljIGludAppc19sYWJlbGNoYXIoaW50IGljaCkKewogICAgaWYgKChpc2FsbnVtKGljaCkpIHx8IChpY2ggPT0gJy0nKSkKICAgICAgICByZXR1cm4gMTsKICAgIGlmIChpY2ggPT0gJ18nICYmIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCQkgICAgIE5FVFNOTVBfRFNfTElCX01JQl9QQVJTRV9MQUJFTCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLyoKICogUGFyc2VzIGEgdG9rZW4gZnJvbSB0aGUgZmlsZS4gIFRoZSB0eXBlIG9mIHRoZSB0b2tlbiBwYXJzZWQgaXMgcmV0dXJuZWQsCiAqIGFuZCB0aGUgdGV4dCBpcyBwbGFjZWQgaW4gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IHRva2VuLgogKiBXYXJuaW5nOiB0aGlzIG1ldGhvZCBtYXkgcmVjdXJzZS4KICovCnN0YXRpYyBpbnQKZ2V0X3Rva2VuKEZJTEUgKiBmcCwgY2hhciAqdG9rZW4sIGludCBtYXh0bGVuKQp7CiAgICByZWdpc3RlciBpbnQgICAgY2gsIGNoX25leHQ7CiAgICByZWdpc3RlciBjaGFyICAqY3AgPSB0b2tlbjsKICAgIHJlZ2lzdGVyIGludCAgICBoYXNoID0gMDsKICAgIHJlZ2lzdGVyIHN0cnVjdCB0b2sgKnRwOwogICAgaW50ICAgICAgICAgICAgIHRvb19sb25nID0gMDsKCiAgICAvKgogICAgICogc2tpcCBhbGwgd2hpdGUgc3BhY2UgCiAgICAgKi8KICAgIGRvIHsKICAgICAgICBjaCA9IGdldGMoZnApOwogICAgICAgIGlmIChjaCA9PSAnXG4nKQogICAgICAgICAgICBtaWJMaW5lKys7CiAgICB9CiAgICB3aGlsZSAoaXNzcGFjZShjaCkgJiYgY2ggIT0gRU9GKTsKICAgICpjcCsrID0gY2g7CiAgICAqY3AgPSAnXDAnOwogICAgc3dpdGNoIChjaCkgewogICAgY2FzZSBFT0Y6CiAgICAgICAgcmV0dXJuIEVORE9GRklMRTsKICAgIGNhc2UgJyInOgogICAgICAgIHJldHVybiBwYXJzZVF1b3RlU3RyaW5nKGZwLCB0b2tlbiwgbWF4dGxlbik7CiAgICBjYXNlICdcJyc6ICAgICAgICAgICAgICAgICAvKiBiaW5hcnkgb3IgaGV4IGNvbnN0YW50ICovCiAgICAgICAgd2hpbGUgKChjaCA9IGdldGMoZnApKSAhPSBFT0YgJiYgY2ggIT0gJ1wnJwogICAgICAgICAgICAgICAmJiBjcCAtIHRva2VuIDwgbWF4dGxlbiAtIDIpCiAgICAgICAgICAgICpjcCsrID0gY2g7CiAgICAgICAgaWYgKGNoID09ICdcJycpIHsKICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIHZhbCA9IDA7CiAgICAgICAgICAgICpjcCsrID0gJ1wnJzsKICAgICAgICAgICAgKmNwKysgPSBjaCA9IGdldGMoZnApOwogICAgICAgICAgICAqY3AgPSAwOwogICAgICAgICAgICBjcCA9IHRva2VuICsgMTsKICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICBjYXNlIEVPRjoKICAgICAgICAgICAgICAgIHJldHVybiBFTkRPRkZJTEU7CiAgICAgICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICBjYXNlICdCJzoKICAgICAgICAgICAgICAgIHdoaWxlICgoY2ggPSAqY3ArKykgIT0gJ1wnJykKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJzAnICYmIGNoICE9ICcxJykKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExBQkVMOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsICogMiArIGNoIC0gJzAnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICBjYXNlICdIJzoKICAgICAgICAgICAgICAgIHdoaWxlICgoY2ggPSAqY3ArKykgIT0gJ1wnJykKICAgICAgICAgICAgICAgICAgICBpZiAoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsICogMTYgKyBjaCAtICcwJzsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnYScgPD0gY2ggJiYgY2ggPD0gJ2YnKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgKiAxNiArIGNoIC0gJ2EnICsgMTA7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ0EnIDw9IGNoICYmIGNoIDw9ICdGJykKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsICogMTYgKyBjaCAtICdBJyArIDEwOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExBQkVMOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gTEFCRUw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3ByaW50Zih0b2tlbiwgIiVsZCIsIHZhbCk7CiAgICAgICAgICAgIHJldHVybiBOVU1CRVI7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgIGNhc2UgJygnOgogICAgICAgIHJldHVybiBMRUZUUEFSRU47CiAgICBjYXNlICcpJzoKICAgICAgICByZXR1cm4gUklHSFRQQVJFTjsKICAgIGNhc2UgJ3snOgogICAgICAgIHJldHVybiBMRUZUQlJBQ0tFVDsKICAgIGNhc2UgJ30nOgogICAgICAgIHJldHVybiBSSUdIVEJSQUNLRVQ7CiAgICBjYXNlICdbJzoKICAgICAgICByZXR1cm4gTEVGVFNRQlJBQ0s7CiAgICBjYXNlICddJzoKICAgICAgICByZXR1cm4gUklHSFRTUUJSQUNLOwogICAgY2FzZSAnOyc6CiAgICAgICAgcmV0dXJuIFNFTUk7CiAgICBjYXNlICcsJzoKICAgICAgICByZXR1cm4gQ09NTUE7CiAgICBjYXNlICd8JzoKICAgICAgICByZXR1cm4gQkFSOwogICAgY2FzZSAnLic6CiAgICAgICAgY2hfbmV4dCA9IGdldGMoZnApOwogICAgICAgIGlmIChjaF9uZXh0ID09ICcuJykKICAgICAgICAgICAgcmV0dXJuIFJBTkdFOwogICAgICAgIHVuZ2V0YyhjaF9uZXh0LCBmcCk7CiAgICAgICAgcmV0dXJuIExBQkVMOwogICAgY2FzZSAnOic6CiAgICAgICAgY2hfbmV4dCA9IGdldGMoZnApOwogICAgICAgIGlmIChjaF9uZXh0ICE9ICc6JykgewogICAgICAgICAgICB1bmdldGMoY2hfbmV4dCwgZnApOwogICAgICAgICAgICByZXR1cm4gTEFCRUw7CiAgICAgICAgfQogICAgICAgIGNoX25leHQgPSBnZXRjKGZwKTsKICAgICAgICBpZiAoY2hfbmV4dCAhPSAnPScpIHsKICAgICAgICAgICAgdW5nZXRjKGNoX25leHQsIGZwKTsKICAgICAgICAgICAgcmV0dXJuIExBQkVMOwogICAgICAgIH0KICAgICAgICByZXR1cm4gRVFVQUxTOwogICAgY2FzZSAnLSc6CiAgICAgICAgY2hfbmV4dCA9IGdldGMoZnApOwogICAgICAgIGlmIChjaF9uZXh0ID09ICctJykgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVHJlYXQgdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIGFzIGEgY29tbWVudC4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHdoaWxlICgoY2hfbmV4dCAhPSBFT0YpICYmIChjaF9uZXh0ICE9ICdcbicpKQogICAgICAgICAgICAgICAgICAgIGNoX25leHQgPSBnZXRjKGZwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBUcmVhdCB0aGUgcmVzdCBvZiB0aGUgbGluZSBvciB1bnRpbCBhbm90aGVyICctLScgYXMgYSBjb21tZW50IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogKHRoaXMgaXMgdGhlICJ0ZWNobmljYWxseSIgY29ycmVjdCB3YXkgdG8gcGFyc2UgY29tbWVudHMpIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjaCA9ICcgJzsKICAgICAgICAgICAgICAgIGNoX25leHQgPSBnZXRjKGZwKTsKICAgICAgICAgICAgICAgIHdoaWxlIChjaF9uZXh0ICE9IEVPRiAmJiBjaF9uZXh0ICE9ICdcbicgJiYKICAgICAgICAgICAgICAgICAgICAgICAoY2ggIT0gJy0nIHx8IGNoX25leHQgIT0gJy0nKSkgewogICAgICAgICAgICAgICAgICAgIGNoID0gY2hfbmV4dDsKICAgICAgICAgICAgICAgICAgICBjaF9uZXh0ID0gZ2V0YyhmcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoX25leHQgPT0gRU9GKQogICAgICAgICAgICAgICAgcmV0dXJuIEVORE9GRklMRTsKICAgICAgICAgICAgaWYgKGNoX25leHQgPT0gJ1xuJykKICAgICAgICAgICAgICAgIG1pYkxpbmUrKzsKICAgICAgICAgICAgcmV0dXJuIGdldF90b2tlbihmcCwgdG9rZW4sIG1heHRsZW4pOwogICAgICAgIH0KICAgICAgICB1bmdldGMoY2hfbmV4dCwgZnApOwoJLyogZmFsbHRocm91Z2ggKi8KICAgIGRlZmF1bHQ6CiAgICAgICAgLyoKICAgICAgICAgKiBBY2N1bXVsYXRlIGNoYXJhY3RlcnMgdW50aWwgZW5kIG9mIHRva2VuIGlzIGZvdW5kLiAgVGhlbiBhdHRlbXB0IHRvCiAgICAgICAgICogbWF0Y2ggdGhpcyB0b2tlbiBhcyBhIHJlc2VydmVkIHdvcmQuICBJZiBhIG1hdGNoIGlzIGZvdW5kLCByZXR1cm4gdGhlCiAgICAgICAgICogdHlwZS4gIEVsc2UgaXQgaXMgYSBsYWJlbC4KICAgICAgICAgKi8KICAgICAgICBpZiAoIWlzX2xhYmVsY2hhcihjaCkpCiAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgICAgICBoYXNoICs9IHRvbG93ZXIoY2gpOwogICAgICBtb3JlOgogICAgICAgIHdoaWxlIChpc19sYWJlbGNoYXIoY2hfbmV4dCA9IGdldGMoZnApKSkgewogICAgICAgICAgICBoYXNoICs9IHRvbG93ZXIoY2hfbmV4dCk7CiAgICAgICAgICAgIGlmIChjcCAtIHRva2VuIDwgbWF4dGxlbiAtIDEpCiAgICAgICAgICAgICAgICAqY3ArKyA9IGNoX25leHQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHRvb19sb25nID0gMTsKICAgICAgICB9CiAgICAgICAgdW5nZXRjKGNoX25leHQsIGZwKTsKICAgICAgICAqY3AgPSAnXDAnOwoKICAgICAgICBpZiAodG9vX2xvbmcpCiAgICAgICAgICAgIHByaW50X2Vycm9yKCJXYXJuaW5nOiB0b2tlbiB0b28gbG9uZyIsIHRva2VuLCBDT05USU5VRSk7CiAgICAgICAgZm9yICh0cCA9IGJ1Y2tldHNbQlVDS0VUKGhhc2gpXTsgdHA7IHRwID0gdHAtPm5leHQpIHsKICAgICAgICAgICAgaWYgKCh0cC0+aGFzaCA9PSBoYXNoKSAmJiAoIWxhYmVsX2NvbXBhcmUodHAtPm5hbWUsIHRva2VuKSkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRwKSB7CiAgICAgICAgICAgIGlmICh0cC0+dG9rZW4gIT0gQ09OVElOVUUpCiAgICAgICAgICAgICAgICByZXR1cm4gKHRwLT50b2tlbik7CiAgICAgICAgICAgIHdoaWxlIChpc3NwYWNlKChjaF9uZXh0ID0gZ2V0YyhmcCkpKSkKICAgICAgICAgICAgICAgIGlmIChjaF9uZXh0ID09ICdcbicpCiAgICAgICAgICAgICAgICAgICAgbWliTGluZSsrOwogICAgICAgICAgICBpZiAoY2hfbmV4dCA9PSBFT0YpCiAgICAgICAgICAgICAgICByZXR1cm4gRU5ET0ZGSUxFOwogICAgICAgICAgICBpZiAoaXNhbG51bShjaF9uZXh0KSkgewogICAgICAgICAgICAgICAgKmNwKysgPSBjaF9uZXh0OwogICAgICAgICAgICAgICAgaGFzaCArPSB0b2xvd2VyKGNoX25leHQpOwogICAgICAgICAgICAgICAgZ290byBtb3JlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlblswXSA9PSAnLScgfHwgaXNkaWdpdCh0b2tlblswXSkpIHsKICAgICAgICAgICAgZm9yIChjcCA9IHRva2VuICsgMTsgKmNwOyBjcCsrKQogICAgICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KCpjcCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExBQkVMOwogICAgICAgICAgICByZXR1cm4gTlVNQkVSOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTEFCRUw7CiAgICB9Cn0KCmludApzbm1wX2dldF90b2tlbihGSUxFICogZnAsIGNoYXIgKnRva2VuLCBpbnQgbWF4dGxlbikKewogICAgcmV0dXJuIGdldF90b2tlbihmcCwgdG9rZW4sIG1heHRsZW4pOwp9CgppbnQKYWRkX21pYmZpbGUoY29uc3QgY2hhciogdG1wc3RyLCBjb25zdCBjaGFyKiBkX25hbWUsIEZJTEUgKmlwICkKewogICAgRklMRSAgICAgICAgICAgKmZwOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXSwgdG9rZW4yW01BWFRPS0VOXTsKCiAgICAvKgogICAgICogd2hpY2ggbW9kdWxlIGlzIHRoaXMgCiAgICAgKi8KICAgIGlmICgoZnAgPSBmb3Blbih0bXBzdHIsICJyIikpID09IE5VTEwpIHsKICAgICAgICBzbm1wX2xvZ19wZXJyb3IodG1wc3RyKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIkNoZWNraW5nIGZpbGU6ICVzLi4uXG4iLAogICAgICAgICAgICAgICAgdG1wc3RyKSk7CiAgICBtaWJMaW5lID0gMTsKICAgIEZpbGUgPSB0bXBzdHI7CiAgICBpZiAoZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pICE9IExBQkVMKSB7CgkgICAgZmNsb3NlKGZwKTsKCSAgICByZXR1cm4gMTsKICAgIH0KICAgIC8qCiAgICAgKiBzaW1wbGUgdGVzdCBmb3IgdGhpcyBiZWluZyBhIE1JQiAKICAgICAqLwogICAgaWYgKGdldF90b2tlbihmcCwgdG9rZW4yLCBNQVhUT0tFTikgPT0gREVGSU5JVElPTlMpIHsKICAgICAgICBuZXdfbW9kdWxlKHRva2VuLCB0bXBzdHIpOwogICAgICAgIGlmIChpcCkKICAgICAgICAgICAgZnByaW50ZihpcCwgIiVzICVzXG4iLCB0b2tlbiwgZF9uYW1lKTsKICAgICAgICBmY2xvc2UoZnApOwogICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIHsKICAgICAgICBmY2xvc2UoZnApOwogICAgICAgIHJldHVybiAxOwogICAgfQp9CgovKiBGb3IgV2luMzIgcGxhdGZvcm1zLCB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IG1haW50YWluIGEgbGFzdCBtb2RpZmljYXRpb24KICogZGF0ZSB0aGF0IHdlIGNhbiBjb21wYXJlIHdpdGggdGhlIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSAuaW5kZXggZmlsZS4KICogVGhlcmVmb3JlIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoZXRoZXIgYW55IC5pbmRleCBmaWxlIGlzIHZhbGlkLgogKiBUaGlzIGlzIHRoZSByZWFzb24gZm9yIHRoZSAjaWYgIShkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKGN5Z3dpbikpCiAqIGluIHRoZSBhZGRfbWliZGlyIGZ1bmN0aW9uCiAqLwppbnQKYWRkX21pYmRpcihjb25zdCBjaGFyICpkaXJuYW1lKQp7CiAgICBGSUxFICAgICAgICAgICAqaXA7CiAgICBESVIgICAgICAgICAgICAqZGlyLCAqZGlyMjsKICAgIGNvbnN0IGNoYXIgICAgICpvbGRGaWxlID0gRmlsZTsKICAgIHN0cnVjdCBkaXJlbnQgICpmaWxlOwogICAgY2hhciAgICAgICAgICAgIHRtcHN0clszMDBdOwogICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsKICAgIGludCAgICAgICAgICAgICBmbmFtZV9sZW4gPSAwOwojaWYgIShkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKGN5Z3dpbikpCiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciBzcGFjZTsKICAgIGNoYXIgbmV3bGluZTsKICAgIHN0cnVjdCBzdGF0ICAgICBkaXJfc3RhdCwgaWR4X3N0YXQ7CiAgICBjaGFyICAgICAgICAgICAgdG1wc3RyMVszMDBdOwogICAgaW50IGVtcHR5ID0gMTsKI2VuZGlmCgogICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiU2Nhbm5pbmcgZGlyZWN0b3J5ICVzXG4iLCBkaXJuYW1lKSk7CiNpZiAhKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoY3lnd2luKSkKICAgIHNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCAiJXMvJXMiLCBkaXJuYW1lLCAiLmluZGV4Iik7CiAgICB0b2tlblsgc2l6ZW9mKHRva2VuKS0xIF0gPSAwOwogICAgaWYgKHN0YXQodG9rZW4sICZpZHhfc3RhdCkgPT0gMCAmJiBzdGF0KGRpcm5hbWUsICZkaXJfc3RhdCkgPT0gMCkgewogICAgICAgIGlmIChkaXJfc3RhdC5zdF9tdGltZSA8IGlkeF9zdGF0LnN0X210aW1lKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIlRoZSBpbmRleCBpcyBnb29kXG4iKSk7CiAgICAgICAgICAgIGlmICgoaXAgPSBmb3Blbih0b2tlbiwgInIiKSkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgd2hpbGUgKGZzY2FuZihpcCwgIiUxMjdzJWMlMjk5cyVjIiwgdG9rZW4sICZzcGFjZSwgdG1wc3RyLAoJCSAgICAmbmV3bGluZSkgPT0gNCkgewoKICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IDA7CgkJICAgIC8qCgkJICAgICAqIElmIGFuIG92ZXJmbG93IG9mIHRoZSB0b2tlbiBvciB0bXBzdHIgYnVmZmVycyBoYXMgYmVlbgoJCSAgICAgKiBmb3VuZCBsb2cgYSBtZXNzYWdlIGFuZCBicmVhayBvdXQgb2YgdGhlIHdoaWxlIGxvb3AsCgkJICAgICAqIHRodXMgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgdG9rZW5zIHdpbGwgYmUgaWdub3JlZC4KCQkgICAgICovCgkJICAgIGlmIChzcGFjZSAhPSAnICcgfHwgbmV3bGluZSAhPSAnXG4nKSB7CgkJCXNubXBfbG9nKExPR19FUlIsCgkJCSAgICAiYWRkX21pYmRpcjogc3RyaW5ncyBzY2FubmVkIGluIGZyb20gJXMvJXMgIiBcCgkJCSAgICAiYXJlIHRvbyBsYXJnZS4gIGNvdW50ID0gJWRcbiAiLCBkaXJuYW1lLAoJCQkgICAgIi5pbmRleCIsIGNvdW50KTsKCQkJICAgIGJyZWFrOwoJCSAgICB9CgkJICAgCgkJICAgIHNucHJpbnRmKHRtcHN0cjEsIHNpemVvZih0bXBzdHIxKSwgIiVzLyVzIiwgZGlybmFtZSwgdG1wc3RyKTsKICAgICAgICAgICAgICAgICAgICB0bXBzdHIxWyBzaXplb2YodG1wc3RyMSktMSBdID0gMDsKICAgICAgICAgICAgICAgICAgICBuZXdfbW9kdWxlKHRva2VuLCB0bXBzdHIxKTsKICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmNsb3NlKGlwKTsKICAgICAgICAgICAgICAgIGlmICggIWVtcHR5ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIkVtcHR5IE1JQiBpbmRleFxuIikpOwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIkNhbid0IHJlYWQgaW5kZXhcbiIpKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiSW5kZXggb3V0ZGF0ZWRcbiIpKTsKICAgIH0gZWxzZQogICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIk5vIGluZGV4XG4iKSk7CiNlbmRpZgoKICAgIGlmICgoZGlyID0gb3BlbmRpcihkaXJuYW1lKSkpIHsKICAgICAgICBzbnByaW50Zih0bXBzdHIsIHNpemVvZih0bXBzdHIpLCAiJXMvLmluZGV4IiwgZGlybmFtZSk7CiAgICAgICAgdG1wc3RyWyBzaXplb2YodG1wc3RyKS0xIF0gPSAwOwogICAgICAgIGlwID0gZm9wZW4odG1wc3RyLCAidyIpOwogICAgICAgIHdoaWxlICgoZmlsZSA9IHJlYWRkaXIoZGlyKSkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogT25seSBwYXJzZSBmaWxlIG5hbWVzIHRoYXQgZG9uJ3QgYmVnaW4gd2l0aCBhICcuJyAKICAgICAgICAgICAgICogQWxzbyBza2lwIGZpbGVzIGVuZGluZyBpbiAnficsIG9yIHN0YXJ0aW5nL2VuZGluZwogICAgICAgICAgICAgKiB3aXRoICcjJyB3aGljaCBhcmUgdHlwaWNhbGx5IGVkaXRvciBiYWNrdXAgZmlsZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoZmlsZS0+ZF9uYW1lICE9IE5VTEwpIHsKICAgICAgICAgICAgICBmbmFtZV9sZW4gPSBzdHJsZW4oIGZpbGUtPmRfbmFtZSApOwogICAgICAgICAgICAgIGlmIChmbmFtZV9sZW4gPiAwICYmIGZpbGUtPmRfbmFtZVswXSAhPSAnLicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZS0+ZF9uYW1lWzBdICE9ICcjJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGUtPmRfbmFtZVtmbmFtZV9sZW4tMV0gIT0gJyMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZS0+ZF9uYW1lW2ZuYW1lX2xlbi0xXSAhPSAnficpIHsKICAgICAgICAgICAgICAgIHNucHJpbnRmKHRtcHN0ciwgc2l6ZW9mKHRtcHN0ciksICIlcy8lcyIsIGRpcm5hbWUsIGZpbGUtPmRfbmFtZSk7CiAgICAgICAgICAgICAgICB0bXBzdHJbIHNpemVvZih0bXBzdHIpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoKGRpcjIgPSBvcGVuZGlyKHRtcHN0cikpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBmaWxlIGlzIGEgZGlyZWN0b3J5LCBkb24ndCByZWFkIGl0IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGNsb3NlZGlyKGRpcjIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICFhZGRfbWliZmlsZSggdG1wc3RyLCBmaWxlLT5kX25hbWUsIGlwICkpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEZpbGUgPSBvbGRGaWxlOwogICAgICAgIGNsb3NlZGlyKGRpcik7CiAgICAgICAgaWYgKGlwKQogICAgICAgICAgICBmY2xvc2UoaXApOwogICAgICAgIHJldHVybiAoY291bnQpOwogICAgfQogICAgZWxzZQogICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwiY2Fubm90IG9wZW4gTUlCIGRpcmVjdG9yeSAlc1xuIiwgZGlybmFtZSkpOwoKICAgIHJldHVybiAoLTEpOwp9CgoKLyoKICogUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgd2hvbGUgdHJlZQogKiAgIChmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkpCiAqLwpzdHJ1Y3QgdHJlZSAgICAqCnJlYWRfbWliKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQp7CiAgICBGSUxFICAgICAgICAgICAqZnA7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwoKICAgIGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CiAgICBpZiAoZnAgPT0gTlVMTCkgewogICAgICAgIHNubXBfbG9nX3BlcnJvcihmaWxlbmFtZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBtaWJMaW5lID0gMTsKICAgIEZpbGUgPSBmaWxlbmFtZTsKICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIlBhcnNpbmcgZmlsZTogJXMuLi5cbiIsIGZpbGVuYW1lKSk7CiAgICBpZiAoZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pICE9IExBQkVMKSB7CgkgICAgc25tcF9sb2coTE9HX0VSUiwgIkZhaWxlZCB0byBwYXJzZSBNSUIgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwoJICAgIGZjbG9zZShmcCk7CgkgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBmY2xvc2UoZnApOwogICAgbmV3X21vZHVsZSh0b2tlbiwgZmlsZW5hbWUpOwogICAgKHZvaWQpIG5ldHNubXBfcmVhZF9tb2R1bGUodG9rZW4pOwoKICAgIHJldHVybiB0cmVlX2hlYWQ7Cn0KCgpzdHJ1Y3QgdHJlZSAgICAqCnJlYWRfYWxsX21pYnMoKQp7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAobXAtPm5vX2ltcG9ydHMgPT0gLTEpCiAgICAgICAgICAgIG5ldHNubXBfcmVhZF9tb2R1bGUobXAtPm5hbWUpOwogICAgYWRvcHRfb3JwaGFucygpOwoKICAgIHJldHVybiB0cmVlX2hlYWQ7Cn0KCgojaWZkZWYgVEVTVAptYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIGludCAgICAgICAgICAgICBpOwogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTLCAyKTsKCiAgICBuZXRzbm1wX2luaXRfbWliKCk7CgogICAgaWYgKGFyZ2MgPT0gMSkKICAgICAgICAodm9pZCkgcmVhZF9hbGxfbWlicygpOwogICAgZWxzZQogICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCiAgICAgICAgICAgIHJlYWRfbWliKGFyZ3ZbaV0pOwoKICAgIGZvciAodHAgPSB0cmVlX2hlYWQ7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpCiAgICAgICAgcHJpbnRfc3VidHJlZShzdGRvdXQsIHRwLCAwKTsKICAgIGZyZWVfdHJlZSh0cmVlX2hlYWQpOwoKICAgIHJldHVybiAwOwp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVTVCAqLwoKc3RhdGljIGludApwYXJzZVF1b3RlU3RyaW5nKEZJTEUgKiBmcCwgY2hhciAqdG9rZW4sIGludCBtYXh0bGVuKQp7CiAgICByZWdpc3RlciBpbnQgICAgY2g7CiAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOwogICAgaW50ICAgICAgICAgICAgIHRvb19sb25nID0gMDsKICAgIGNoYXIgICAgICAgICAgICp0b2tlbl9zdGFydCA9IHRva2VuOwoKICAgIGZvciAoY2ggPSBnZXRjKGZwKTsgY2ggIT0gRU9GOyBjaCA9IGdldGMoZnApKSB7CiAgICAgICAgaWYgKGNoID09ICdccicpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CiAgICAgICAgICAgIG1pYkxpbmUrKzsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICciJykgewogICAgICAgICAgICAqdG9rZW4gPSAnXDAnOwogICAgICAgICAgICBpZiAodG9vX2xvbmcgJiYgbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSA+IDEpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBzaG93IHNob3J0IGZvcm0gZm9yIGJyZXZpdHkgc2FrZSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIGNoX3NhdmUgPSAqKHRva2VuX3N0YXJ0ICsgNTApOwogICAgICAgICAgICAgICAgKih0b2tlbl9zdGFydCArIDUwKSA9ICdcMCc7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiV2FybmluZzogc3RyaW5nIHRvbyBsb25nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuX3N0YXJ0LCBRVU9URVNUUklORyk7CiAgICAgICAgICAgICAgICAqKHRva2VuX3N0YXJ0ICsgNTApID0gY2hfc2F2ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gUVVPVEVTVFJJTkc7CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogbWF4aW11bSBkZXNjcmlwdGlvbiBsZW5ndGggY2hlY2suICBJZiBncmVhdGVyLCBrZWVwIHBhcnNpbmcKICAgICAgICAgKiBidXQgdHJ1bmNhdGUgdGhlIHN0cmluZyAKICAgICAgICAgKi8KICAgICAgICBpZiAoKytjb3VudCA8IG1heHRsZW4pCiAgICAgICAgICAgICp0b2tlbisrID0gY2g7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0b29fbG9uZyA9IDE7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIHN0cnVjdCBpbmRleF9saXN0ICoKICogZ2V0SW5kZXhlcyhGSUxFICpmcCk6CiAqICAgVGhpcyByb3V0aW5lIHBhcnNlcyBhIHN0cmluZyBsaWtlICB7IGJsYWggYmxhaCBibGFoIH0gYW5kIHJldHVybnMgYQogKiAgIGxpc3Qgb2YgdGhlIHN0cmluZ3MgZW5jbG9zZWQgd2l0aGluIGl0LgogKgogKi8Kc3RhdGljIHN0cnVjdCBpbmRleF9saXN0ICoKZ2V0SW5kZXhlcyhGSUxFICogZnAsIHN0cnVjdCBpbmRleF9saXN0ICoqcmV0cCkKewogICAgaW50ICAgICAgICAgICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIG5leHRJc0ltcGxpZWQgPSAwOwoKICAgIHN0cnVjdCBpbmRleF9saXN0ICpteWxpc3QgPSBOVUxMOwogICAgc3RydWN0IGluZGV4X2xpc3QgKipteXBwID0gJm15bGlzdDsKCiAgICBmcmVlX2luZGV4ZXMocmV0cCk7CgogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKCiAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB3aGlsZSAodHlwZSAhPSBSSUdIVEJSQUNLRVQgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICBpZiAoKHR5cGUgPT0gTEFCRUwpIHx8ICh0eXBlICYgU1lOVEFYX01BU0spKSB7CiAgICAgICAgICAgICpteXBwID0KICAgICAgICAgICAgICAgIChzdHJ1Y3QgaW5kZXhfbGlzdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBpbmRleF9saXN0KSk7CiAgICAgICAgICAgIGlmICgqbXlwcCkgewogICAgICAgICAgICAgICAgKCpteXBwKS0+aWxhYmVsID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgICAgICgqbXlwcCktPmlzaW1wbGllZCA9IG5leHRJc0ltcGxpZWQ7CiAgICAgICAgICAgICAgICBteXBwID0gJigqbXlwcCktPm5leHQ7CiAgICAgICAgICAgICAgICBuZXh0SXNJbXBsaWVkID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBJTVBMSUVEKSB7CiAgICAgICAgICAgIG5leHRJc0ltcGxpZWQgPSAxOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQoKICAgICpyZXRwID0gbXlsaXN0OwogICAgcmV0dXJuIG15bGlzdDsKfQoKc3RhdGljIHN0cnVjdCB2YXJiaW5kX2xpc3QgKgpnZXRWYXJiaW5kcyhGSUxFICogZnAsIHN0cnVjdCB2YXJiaW5kX2xpc3QgKipyZXRwKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CgogICAgc3RydWN0IHZhcmJpbmRfbGlzdCAqbXlsaXN0ID0gTlVMTDsKICAgIHN0cnVjdCB2YXJiaW5kX2xpc3QgKipteXBwID0gJm15bGlzdDsKCiAgICBmcmVlX3ZhcmJpbmRzKHJldHApOwoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CgogICAgaWYgKHR5cGUgIT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgd2hpbGUgKHR5cGUgIT0gUklHSFRCUkFDS0VUICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgaWYgKCh0eXBlID09IExBQkVMKSB8fCAodHlwZSAmIFNZTlRBWF9NQVNLKSkgewogICAgICAgICAgICAqbXlwcCA9CiAgICAgICAgICAgICAgICAoc3RydWN0IHZhcmJpbmRfbGlzdCAqKSBjYWxsb2MoMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmJpbmRfbGlzdCkpOwogICAgICAgICAgICBpZiAoKm15cHApIHsKICAgICAgICAgICAgICAgICgqbXlwcCktPnZibGFiZWwgPSBzdHJkdXAodG9rZW4pOwogICAgICAgICAgICAgICAgbXlwcCA9ICYoKm15cHApLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CgogICAgKnJldHAgPSBteWxpc3Q7CiAgICByZXR1cm4gbXlsaXN0Owp9CgpzdGF0aWMgdm9pZApmcmVlX2luZGV4ZXMoc3RydWN0IGluZGV4X2xpc3QgKipzcHApCnsKICAgIGlmIChzcHAgJiYgKnNwcCkgewogICAgICAgIHN0cnVjdCBpbmRleF9saXN0ICpwcCwgKm5wcDsKCiAgICAgICAgcHAgPSAqc3BwOwogICAgICAgICpzcHAgPSBOVUxMOwoKICAgICAgICB3aGlsZSAocHApIHsKICAgICAgICAgICAgbnBwID0gcHAtPm5leHQ7CiAgICAgICAgICAgIGlmIChwcC0+aWxhYmVsKQogICAgICAgICAgICAgICAgZnJlZShwcC0+aWxhYmVsKTsKICAgICAgICAgICAgZnJlZShwcCk7CiAgICAgICAgICAgIHBwID0gbnBwOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQKZnJlZV92YXJiaW5kcyhzdHJ1Y3QgdmFyYmluZF9saXN0ICoqc3BwKQp7CiAgICBpZiAoc3BwICYmICpzcHApIHsKICAgICAgICBzdHJ1Y3QgdmFyYmluZF9saXN0ICpwcCwgKm5wcDsKCiAgICAgICAgcHAgPSAqc3BwOwogICAgICAgICpzcHAgPSBOVUxMOwoKICAgICAgICB3aGlsZSAocHApIHsKICAgICAgICAgICAgbnBwID0gcHAtPm5leHQ7CiAgICAgICAgICAgIGlmIChwcC0+dmJsYWJlbCkKICAgICAgICAgICAgICAgIGZyZWUocHAtPnZibGFiZWwpOwogICAgICAgICAgICBmcmVlKHBwKTsKICAgICAgICAgICAgcHAgPSBucHA7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZApmcmVlX3JhbmdlcyhzdHJ1Y3QgcmFuZ2VfbGlzdCAqKnNwcCkKewogICAgaWYgKHNwcCAmJiAqc3BwKSB7CiAgICAgICAgc3RydWN0IHJhbmdlX2xpc3QgKnBwLCAqbnBwOwoKICAgICAgICBwcCA9ICpzcHA7CiAgICAgICAgKnNwcCA9IE5VTEw7CgogICAgICAgIHdoaWxlIChwcCkgewogICAgICAgICAgICBucHAgPSBwcC0+bmV4dDsKICAgICAgICAgICAgZnJlZShwcCk7CiAgICAgICAgICAgIHBwID0gbnBwOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQKZnJlZV9lbnVtcyhzdHJ1Y3QgZW51bV9saXN0ICoqc3BwKQp7CiAgICBpZiAoc3BwICYmICpzcHApIHsKICAgICAgICBzdHJ1Y3QgZW51bV9saXN0ICpwcCwgKm5wcDsKCiAgICAgICAgcHAgPSAqc3BwOwogICAgICAgICpzcHAgPSBOVUxMOwoKICAgICAgICB3aGlsZSAocHApIHsKICAgICAgICAgICAgbnBwID0gcHAtPm5leHQ7CiAgICAgICAgICAgIGlmIChwcC0+bGFiZWwpCiAgICAgICAgICAgICAgICBmcmVlKHBwLT5sYWJlbCk7CiAgICAgICAgICAgIGZyZWUocHApOwogICAgICAgICAgICBwcCA9IG5wcDsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyBzdHJ1Y3QgZW51bV9saXN0ICoKY29weV9lbnVtcyhzdHJ1Y3QgZW51bV9saXN0ICpzcCkKewogICAgc3RydWN0IGVudW1fbGlzdCAqeHAgPSBOVUxMLCAqKnNwcCA9ICZ4cDsKCiAgICB3aGlsZSAoc3ApIHsKICAgICAgICAqc3BwID0gKHN0cnVjdCBlbnVtX2xpc3QgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZW51bV9saXN0KSk7CiAgICAgICAgaWYgKCEqc3BwKQogICAgICAgICAgICBicmVhazsKICAgICAgICAoKnNwcCktPmxhYmVsID0gc3RyZHVwKHNwLT5sYWJlbCk7CiAgICAgICAgKCpzcHApLT52YWx1ZSA9IHNwLT52YWx1ZTsKICAgICAgICBzcHAgPSAmKCpzcHApLT5uZXh0OwogICAgICAgIHNwID0gc3AtPm5leHQ7CiAgICB9CiAgICByZXR1cm4gKHhwKTsKfQoKc3RhdGljIHN0cnVjdCByYW5nZV9saXN0ICoKY29weV9yYW5nZXMoc3RydWN0IHJhbmdlX2xpc3QgKnNwKQp7CiAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqeHAgPSBOVUxMLCAqKnNwcCA9ICZ4cDsKCiAgICB3aGlsZSAoc3ApIHsKICAgICAgICAqc3BwID0gKHN0cnVjdCByYW5nZV9saXN0ICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHJhbmdlX2xpc3QpKTsKICAgICAgICBpZiAoISpzcHApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICgqc3BwKS0+bG93ID0gc3AtPmxvdzsKICAgICAgICAoKnNwcCktPmhpZ2ggPSBzcC0+aGlnaDsKICAgICAgICBzcHAgPSAmKCpzcHApLT5uZXh0OwogICAgICAgIHNwID0gc3AtPm5leHQ7CiAgICB9CiAgICByZXR1cm4gKHhwKTsKfQoKLyoKICogVGhpcyByb3V0aW5lIHBhcnNlcyBhIHN0cmluZyBsaWtlICB7IGJsYWggYmxhaCBibGFoIH0gYW5kIHJldHVybnMgT0JKSUQgaWYKICogaXQgaXMgd2VsbCBmb3JtZWQsIGFuZCBOVUxMIGlmIG5vdC4KICovCnN0YXRpYyBpbnQKdG9zc09iamVjdElkZW50aWZpZXIoRklMRSAqIGZwKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBpbnQgICAgICAgICAgICAgYnJhY2tldGNvdW50ID0gMTsKCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwoKICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKQogICAgICAgIHJldHVybiAwOwogICAgd2hpbGUgKCh0eXBlICE9IFJJR0hUQlJBQ0tFVCB8fCBicmFja2V0Y291bnQgPiAwKSAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgPT0gTEVGVEJSQUNLRVQpCiAgICAgICAgICAgIGJyYWNrZXRjb3VudCsrOwogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gUklHSFRCUkFDS0VUKQogICAgICAgICAgICBicmFja2V0Y291bnQtLTsKICAgIH0KCiAgICBpZiAodHlwZSA9PSBSSUdIVEJSQUNLRVQpCiAgICAgICAgcmV0dXJuIE9CSklEOwogICAgZWxzZQogICAgICAgIHJldHVybiAwOwp9CgovKiBGaW5kIG5vZGUgaW4gYW55IE1JQiBtb2R1bGUKICAgVXNlZCBieSBQZXJsIG1vZHVsZXMJCSovCnN0cnVjdCB0cmVlICAgICoKZmluZF9ub2RlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCB0cmVlICpzdWJ0cmVlKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVudXNlZCAqLwogICAgcmV0dXJuIChmaW5kX3RyZWVfbm9kZShuYW1lLCAtMSkpOwp9CgovKiBGaW5kIG5vZGUgaW4gc3BlY2lmaWMgTUlCIG1vZHVsZQogICBVc2VkIGJ5IFBlcmwgbW9kdWxlcwkJKi8Kc3RydWN0IHRyZWUgICAgKgpmaW5kX25vZGUyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm1vZHVsZSkKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBpbnQgbW9kaWQgPSAtMTsKICBpZiAobW9kdWxlKSB7CiAgICBtb2RpZCA9IHdoaWNoX21vZHVsZShtb2R1bGUpOwogIH0KICBpZiAobW9kaWQgPT0gLTEpCiAgewogICAgcmV0dXJuIChOVUxMKTsKICB9CiAgcmV0dXJuIChmaW5kX3RyZWVfbm9kZShuYW1lLCBtb2RpZCkpOwp9CgpzdHJ1Y3QgbW9kdWxlICAqCmZpbmRfbW9kdWxlKGludCBtaWQpCnsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKCiAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wICE9IE5VTEw7IG1wID0gbXAtPm5leHQpIHsKICAgICAgICBpZiAobXAtPm1vZGlkID09IG1pZCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAobXAgIT0gMCkKICAgICAgICByZXR1cm4gbXA7CiAgICByZXR1cm4gTlVMTDsKfQoKCnN0YXRpYyBjaGFyICAgICBsZWF2ZV9pbmRlbnRbMjU2XTsKc3RhdGljIGludCAgICAgIGxlYXZlX3dhc19zaW1wbGU7CgpzdGF0aWMgdm9pZApwcmludF9taWJfbGVhdmVzKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHAsIGludCB3aWR0aCkKewogICAgc3RydWN0IHRyZWUgICAgKm50cDsKICAgIGNoYXIgICAgICAgICAgICppcCA9IGxlYXZlX2luZGVudCArIHN0cmxlbihsZWF2ZV9pbmRlbnQpIC0gMTsKICAgIGNoYXIgICAgICAgICAgICBsYXN0X2lwY2ggPSAqaXA7CgogICAgKmlwID0gJysnOwogICAgaWYgKHRwLT50eXBlID09IFRZUEVfT1RIRVIgfHwgdHAtPnR5cGUgPiBUWVBFX1NJTVBMRV9MQVNUKSB7CiAgICAgICAgZnByaW50ZihmLCAiJXMtLSVzKCVsZClcbiIsIGxlYXZlX2luZGVudCwgdHAtPmxhYmVsLCB0cC0+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