LyoKICogU05NUHYzIFZpZXctYmFzZWQgQWNjZXNzIENvbnRyb2wgTW9kZWwKICovCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgY29weXJpZ2h0ZWQgYnk6CiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfTUFMTE9DX0gKI2luY2x1ZGUgPG1hbGxvYy5oPgojZW5kaWYKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9BUlBBX0lORVRfSAojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfTkVUREJfSAojaW5jbHVkZSA8bmV0ZGIuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYWdlbnRfY2FsbGJhY2tzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9zeXNPUlRhYmxlLmg+CiNpbmNsdWRlICJ2YWNtX3ZhcnMuaCIKI2luY2x1ZGUgInV0aWxfZnVuY3MvaGVhZGVyX2dlbmVyaWMuaCIKCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKCnN0YXRpYyB1bnNpZ25lZCBpbnQgdmFjbVZpZXdTcGluTG9jayA9IDA7Cgp2b2lkCmluaXRfdmFjbV92YXJzKHZvaWQpCnsKCiAgICBvaWQgICAgICByZWdbXSA9IHsgU05NUF9PSURfU05NUE1PRFVMRVMsIDE2LCAyLCAyLCAxIH07CgojZGVmaW5lIFBSSVZSVwkoTkVUU05NUF9TTk1QVjJBTlkgfCAweDUwMDApCgogICAgc3RydWN0IHZhcmlhYmxlMSB2YWNtX3NlYzJncm91cFtdID0gewogICAgICAgIHtTRUNVUklUWUdST1VQLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX3NlYzJncm91cCwgMSwgezN9fSwKICAgICAgICB7U0VDVVJJVFlTVE9SQUdFLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgICAgICB2YXJfdmFjbV9zZWMyZ3JvdXAsIDEsIHs0fX0sCiAgICAgICAge1NFQ1VSSVRZU1RBVFVTLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgICAgICB2YXJfdmFjbV9zZWMyZ3JvdXAsIDEsIHs1fX0sCiAgICB9OwoKICAgIHN0cnVjdCB2YXJpYWJsZTEgdmFjbV9hY2Nlc3NbXSA9IHsKICAgICAgICB7QUNDRVNTTUFUQ0gsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX2FjY2VzcywgMSwgezR9fSwKICAgICAgICB7QUNDRVNTUkVBRCwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgICAgICB2YXJfdmFjbV9hY2Nlc3MsIDEsIHs1fX0sCiAgICAgICAge0FDQ0VTU1dSSVRFLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX2FjY2VzcywgMSwgezZ9fSwKICAgICAgICB7QUNDRVNTTk9USUZZLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX2FjY2VzcywgMSwgezd9fSwKICAgICAgICB7QUNDRVNTU1RPUkFHRSwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICAgICAgdmFyX3ZhY21fYWNjZXNzLCAxLCB7OH19LAogICAgICAgIHtBQ0NFU1NTVEFUVVMsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX2FjY2VzcywgMSwgezl9fSwKICAgIH07CgogICAgc3RydWN0IHZhcmlhYmxlMyB2YWNtX3ZpZXdbXSA9IHsKICAgICAgICB7VkFDTVZJRVdTUElOTE9DSywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICAgICAgdmFyX3ZhY21fdmlldywgMSwgezF9fSwKICAgICAgICB7VklFV01BU0ssIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICAgICAgdmFyX3ZhY21fdmlldywgMywgezIsIDEsIDN9fSwKICAgICAgICB7VklFV1RZUEUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgICAgIHZhcl92YWNtX3ZpZXcsIDMsIHsyLCAxLCA0fX0sCiAgICAgICAge1ZJRVdTVE9SQUdFLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgICAgICB2YXJfdmFjbV92aWV3LCAzLCB7MiwgMSwgNX19LAogICAgICAgIHtWSUVXU1RBVFVTLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgICAgICB2YXJfdmFjbV92aWV3LCAzLCB7MiwgMSwgNn19LAogICAgfTsKCiAgICAvKgogICAgICogRGVmaW5lIHRoZSBPSUQgcG9pbnRlciB0byB0aGUgdG9wIG9mIHRoZSBtaWIgdHJlZSB0aGF0IHdlJ3JlCiAgICAgKiByZWdpc3RlcmluZyB1bmRlcm5lYXRoIAogICAgICovCiAgICBvaWQgICAgICAgICAgICAgdmFjbV9zZWMyZ3JvdXBfb2lkW10gPSB7IE9JRF9WQUNNR1JPVVBFTlRSWSB9OwogICAgb2lkICAgICAgICAgICAgIHZhY21fYWNjZXNzX29pZFtdID0geyBPSURfVkFDTUFDQ0VTU0VOVFJZIH07CiAgICBvaWQgICAgICAgICAgICAgdmFjbV92aWV3X29pZFtdID0geyBPSURfVkFDTU1JQlZJRVdTIH07CgogICAgLyoKICAgICAqIHdlIG5lZWQgdG8gYmUgY2FsbGVkIGJhY2sgbGF0ZXIgCiAgICAgKi8KICAgIHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19MSUJSQVJZLCBTTk1QX0NBTExCQUNLX1NUT1JFX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlX3ZhY20sIE5VTEwpOwoKICAgIC8qCiAgICAgKiByZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCB0aGUgYWdlbnQgdG8gaGFuZGxlIG91ciBtaWIgdHJlZSAKICAgICAqLwogICAgUkVHSVNURVJfTUlCKCJtaWJJSS92YWNtOnNlYzJncm91cCIsIHZhY21fc2VjMmdyb3VwLCB2YXJpYWJsZTEsCiAgICAgICAgICAgICAgICAgdmFjbV9zZWMyZ3JvdXBfb2lkKTsKICAgIFJFR0lTVEVSX01JQigibWliSUkvdmFjbTphY2Nlc3MiLCB2YWNtX2FjY2VzcywgdmFyaWFibGUxLAogICAgICAgICAgICAgICAgIHZhY21fYWNjZXNzX29pZCk7CiAgICBSRUdJU1RFUl9NSUIoIm1pYklJL3ZhY206dmlldyIsIHZhY21fdmlldywgdmFyaWFibGUzLCB2YWNtX3ZpZXdfb2lkKTsKCiAgICBSRUdJU1RFUl9TWVNPUl9FTlRSWShyZWcsICJWaWV3LWJhc2VkIEFjY2VzcyBDb250cm9sIE1vZGVsIGZvciBTTk1QLiIpOwp9CgoKCnVfY2hhciAgICAgICAgICoKdmFyX3ZhY21fc2VjMmdyb3VwKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICAgIGludCBleGFjdCwKICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqZ3A7CiAgICBvaWQgICAgICAgICAgICAqZ3JvdXBTdWJ0cmVlOwogICAgc3NpemVfdCAgICAgICAgIGdyb3VwU3VidHJlZUxlbjsKICAgIGludCAgICAgICAgICAgICBzZWNtb2RlbDsKICAgIGNoYXIgICAgICAgICAgICBzZWNuYW1lW1ZBQ01TVFJJTkdMRU5dLCAqY3A7CgogICAgLyoKICAgICAqIFNldCB1cCB3cml0ZV9tZXRob2QgZmlyc3QsIGluIGNhc2Ugd2UgcmV0dXJuIE5VTEwgYmVmb3JlIGdldHRpbmcgdG8KICAgICAqIHRoZSBzd2l0Y2ggKHZwLT5tYWdpYykgYmVsb3cuICBJbiBzb21lIG9mIHRoZXNlIGNhc2VzLCB3ZSBzdGlsbCB3YW50CiAgICAgKiB0byBjYWxsIHRoZSBhcHByb3ByaWF0ZSB3cml0ZV9tZXRob2QsIGlmIG9ubHkgdG8gaGF2ZSBpdCByZXR1cm4gdGhlCiAgICAgKiBhcHByb3ByaWF0ZSBlcnJvci4gIAogICAgICovCgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKI2lmbmRlZiBORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQgCiAgICBjYXNlIFNFQ1VSSVRZR1JPVVA6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3ZhY21Hcm91cE5hbWU7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFNFQ1VSSVRZU1RPUkFHRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdmFjbVNlY3VyaXR5VG9Hcm91cFN0b3JhZ2VUeXBlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBTRUNVUklUWVNUQVRVUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdmFjbVNlY3VyaXR5VG9Hcm91cFN0YXR1czsKICAgICAgICBicmVhazsKI2VuZGlmIC8qICFORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQgKi8gCiAgICBkZWZhdWx0OgogICAgICAgICp3cml0ZV9tZXRob2QgPSBOVUxMOwogICAgfQoKCSp2YXJfbGVuID0gMDsgLyogYXNzdW1lIDAgbGVuZ3RoIHVudGlsIGZvdW5kICovCgogICAgaWYgKG1lbWNtcChuYW1lLCB2cC0+bmFtZSwgc2l6ZW9mKG9pZCkgKiB2cC0+bmFtZWxlbikgIT0gMCkgewogICAgICAgIG1lbWNweShuYW1lLCB2cC0+bmFtZSwgc2l6ZW9mKG9pZCkgKiB2cC0+bmFtZWxlbik7CiAgICAgICAgKmxlbmd0aCA9IHZwLT5uYW1lbGVuOwogICAgfQogICAgaWYgKGV4YWN0KSB7CiAgICAgICAgaWYgKCpsZW5ndGggPCAxMykKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgIHNlY21vZGVsID0gbmFtZVsxMV07CiAgICAgICAgZ3JvdXBTdWJ0cmVlID0gbmFtZSArIDEzOwogICAgICAgIGdyb3VwU3VidHJlZUxlbiA9ICpsZW5ndGggLSAxMzsKICAgICAgICBpZiAoIG5hbWVbMTJdICE9IGdyb3VwU3VidHJlZUxlbiApCiAgICAgICAgICAgIHJldHVybiBOVUxMOwkvKiBFaXRoZXIgZXh0cmEgc3ViaWRzLCBvciBhbiBpbmNvbXBsZXRlIHN0cmluZyAqLwogICAgICAgIGNwID0gc2VjbmFtZTsKICAgICAgICB3aGlsZSAoZ3JvdXBTdWJ0cmVlTGVuLS0gPiAwKSB7CiAgICAgICAgICAgIGlmICgqZ3JvdXBTdWJ0cmVlID4gMjU1KQogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgIC8qIGlsbGVnYWwgdmFsdWUgKi8KICAgICAgICAgICAgaWYgKGNwIC0gc2VjbmFtZSA+IFZBQ01fTUFYX1NUUklORykKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAqY3ArKyA9IChjaGFyKSAqZ3JvdXBTdWJ0cmVlKys7CiAgICAgICAgfQogICAgICAgICpjcCA9IDA7CgogICAgICAgIGdwID0gdmFjbV9nZXRHcm91cEVudHJ5KHNlY21vZGVsLCBzZWNuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgICAgc2VjbW9kZWwgPSAqbGVuZ3RoID4gMTEgPyBuYW1lWzExXSA6IDA7CiAgICAgICAgZ3JvdXBTdWJ0cmVlID0gbmFtZSArIDEyOwogICAgICAgIGdyb3VwU3VidHJlZUxlbiA9ICpsZW5ndGggLSAxMjsKICAgICAgICBjcCA9IHNlY25hbWU7CiAgICAgICAgd2hpbGUgKGdyb3VwU3VidHJlZUxlbi0tID4gMCkgewogICAgICAgICAgICBpZiAoKmdyb3VwU3VidHJlZSA+IDI1NSkKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAvKiBpbGxlZ2FsIHZhbHVlICovCiAgICAgICAgICAgIGlmIChjcCAtIHNlY25hbWUgPiBWQUNNX01BWF9TVFJJTkcpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgKmNwKysgPSAoY2hhcikgKmdyb3VwU3VidHJlZSsrOwogICAgICAgIH0KICAgICAgICAqY3AgPSAwOwogICAgICAgIHZhY21fc2Nhbkdyb3VwSW5pdCgpOwogICAgICAgIHdoaWxlICgoZ3AgPSB2YWNtX3NjYW5Hcm91cE5leHQoKSkgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAoZ3AtPnNlY3VyaXR5TW9kZWwgPiBzZWNtb2RlbCB8fAogICAgICAgICAgICAgICAgKGdwLT5zZWN1cml0eU1vZGVsID09IHNlY21vZGVsCiAgICAgICAgICAgICAgICAgJiYgc3RyY21wKGdwLT5zZWN1cml0eU5hbWUsIHNlY25hbWUpID4gMCkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGdwKSB7CiAgICAgICAgICAgIG5hbWVbMTFdID0gZ3AtPnNlY3VyaXR5TW9kZWw7CiAgICAgICAgICAgICpsZW5ndGggPSAxMjsKICAgICAgICAgICAgY3AgPSBncC0+c2VjdXJpdHlOYW1lOwogICAgICAgICAgICB3aGlsZSAoKmNwKSB7CiAgICAgICAgICAgICAgICBuYW1lWygqbGVuZ3RoKSsrXSA9ICpjcCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmIChncCA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgU0VDVVJJVFlNT0RFTDoKICAgICAgICBsb25nX3JldHVybiA9IGdwLT5zZWN1cml0eU1vZGVsOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBTRUNVUklUWU5BTUU6CiAgICAgICAgKnZhcl9sZW4gPSBncC0+c2VjdXJpdHlOYW1lWzBdOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgZ3AtPnNlY3VyaXR5TmFtZVsxXTsKCiAgICBjYXNlIFNFQ1VSSVRZR1JPVVA6CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oZ3AtPmdyb3VwTmFtZSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgZ3AtPmdyb3VwTmFtZTsKCiAgICBjYXNlIFNFQ1VSSVRZU1RPUkFHRToKICAgICAgICBsb25nX3JldHVybiA9IGdwLT5zdG9yYWdlVHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgU0VDVVJJVFlTVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBncC0+c3RhdHVzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gTlVMTDsKfQoKdV9jaGFyICAgICAgICAgKgp2YXJfdmFjbV9hY2Nlc3Moc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICpncDsKICAgIGludCAgICAgICAgICAgICBzZWNtb2RlbCwgc2VjbGV2ZWw7CiAgICBjaGFyICAgICAgICAgICAgZ3JvdXBOYW1lW1ZBQ01TVFJJTkdMRU5dID0geyAwIH07CiAgICBjaGFyICAgICAgICAgICAgY29udGV4dFByZWZpeFtWQUNNU1RSSU5HTEVOXSA9IHsgMCB9OwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgdW5zaWduZWQgbG9uZyAgIGxlbiwgaSA9IDA7CiAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICBpbnQgICAgICAgICAgICAgY21wOwoKICAgIC8qCiAgICAgKiBTZXQgdXAgd3JpdGVfbWV0aG9kIGZpcnN0LCBpbiBjYXNlIHdlIHJldHVybiBOVUxMIGJlZm9yZSBnZXR0aW5nIHRvCiAgICAgKiB0aGUgc3dpdGNoICh2cC0+bWFnaWMpIGJlbG93LiAgSW4gc29tZSBvZiB0aGVzZSBjYXNlcywgd2Ugc3RpbGwgd2FudAogICAgICogdG8gY2FsbCB0aGUgYXBwcm9wcmlhdGUgd3JpdGVfbWV0aG9kLCBpZiBvbmx5IHRvIGhhdmUgaXQgcmV0dXJuIHRoZQogICAgICogYXBwcm9wcmlhdGUgZXJyb3IuICAKICAgICAqLwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiNpZm5kZWYgTkVUU05NUF9OT19XUklURV9TVVBQT1JUIAogICAgY2FzZSBBQ0NFU1NNQVRDSDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdmFjbUFjY2Vzc0NvbnRleHRNYXRjaDsKICAgICAgICBicmVhazsKICAgIGNhc2UgQUNDRVNTUkVBRDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdmFjbUFjY2Vzc1JlYWRWaWV3TmFtZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgQUNDRVNTV1JJVEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3ZhY21BY2Nlc3NXcml0ZVZpZXdOYW1lOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBBQ0NFU1NOT1RJRlk6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3ZhY21BY2Nlc3NOb3RpZnlWaWV3TmFtZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgQUNDRVNTU1RPUkFHRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdmFjbUFjY2Vzc1N0b3JhZ2VUeXBlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBBQ0NFU1NTVEFUVVM6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3ZhY21BY2Nlc3NTdGF0dXM7CiAgICAgICAgYnJlYWs7CiNlbmRpZiAvKiAhTkVUU05NUF9OT19XUklURV9TVVBQT1JUICovIAogICAgZGVmYXVsdDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gTlVMTDsKICAgIH0KCgkqdmFyX2xlbiA9IDA7IC8qIGFzc3VtZSAwIGxlbmd0aCB1bnRpbCBmb3VuZCAqLwoKICAgIGlmIChtZW1jbXAobmFtZSwgdnAtPm5hbWUsIHNpemVvZihvaWQpICogdnAtPm5hbWVsZW4pICE9IDApIHsKICAgICAgICBtZW1jcHkobmFtZSwgdnAtPm5hbWUsIHNpemVvZihvaWQpICogdnAtPm5hbWVsZW4pOwogICAgICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbjsKICAgIH0KCiAgICBpZiAoZXhhY3QpIHsKICAgICAgICBpZiAoKmxlbmd0aCA8IDE1KQogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgLyoKICAgICAgICAgKiBFeHRyYWN0IHRoZSBncm91cCBuYW1lIGluZGV4IGZyb20gdGhlIHJlcXVlc3RlZCBPSUQgLi4uLgogICAgICAgICAqLwogICAgICAgIG9wID0gbmFtZSArIDExOwogICAgICAgIGxlbiA9ICpvcCsrOwogICAgICAgIGlmIChsZW4gPiBWQUNNX01BWF9TVFJJTkcpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIGNwID0gZ3JvdXBOYW1lOwogICAgICAgIHdoaWxlIChsZW4tLSA+IDApIHsKICAgICAgICAgICAgaWYgKCpvcCA+IDI1NSkKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAvKiBpbGxlZ2FsIHZhbHVlICovCiAgICAgICAgICAgICpjcCsrID0gKGNoYXIpICpvcCsrOwogICAgICAgIH0KICAgICAgICAqY3AgPSAwOwoKICAgICAgICAvKgogICAgICAgICAqIC4uLiBmb2xsb3dlZCBieSB0aGUgY29udGV4dCBpbmRleCAuLi4KICAgICAgICAgKi8KICAgICAgICBsZW4gPSAqb3ArKzsKICAgICAgICBpZiAobGVuID4gVkFDTV9NQVhfU1RSSU5HKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICBjcCA9IGNvbnRleHRQcmVmaXg7CiAgICAgICAgd2hpbGUgKGxlbi0tID4gMCkgewogICAgICAgICAgICBpZiAoKm9wID4gMjU1KQogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgIC8qIGlsbGVnYWwgdmFsdWUgKi8KICAgICAgICAgICAgKmNwKysgPSAoY2hhcikgKm9wKys7CiAgICAgICAgfQogICAgICAgICpjcCA9IDA7CgogICAgICAgIC8qCiAgICAgICAgICogLi4uIGFuZCB0aGUgc2VjTW9kZWwgYW5kIHNlY0xldmVsIGluZGV4IHZhbHVlcy4KICAgICAgICAgKi8KICAgICAgICBzZWNtb2RlbCA9ICpvcCsrOwogICAgICAgIHNlY2xldmVsID0gKm9wKys7CiAgICAgICAgaWYgKG9wICE9IG5hbWUgKyAqbGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KCiAgICAgICAgZ3AgPSB2YWNtX2dldEFjY2Vzc0VudHJ5KGdyb3VwTmFtZSwgY29udGV4dFByZWZpeCwgc2VjbW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY2xldmVsKTsKICAgICAgICBpZiAoIGdwICYmIGdwLT5zZWN1cml0eUxldmVsICE9IHNlY2xldmVsICkKICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAvKiBUaGlzIGlzbid0IHN0cmljdGx5IHdoYXQgd2FzIGFza2VkIGZvciAqLwoKICAgIH0gZWxzZSB7CiAgICAgICAgc2VjbW9kZWwgPSBzZWNsZXZlbCA9IDA7CiAgICAgICAgZ3JvdXBOYW1lWzBdID0gMDsKICAgICAgICBjb250ZXh0UHJlZml4WzBdID0gMDsKICAgICAgICBvcCA9IG5hbWUgKyAxMTsKICAgICAgICBpZiAob3AgPj0gbmFtZSArICpsZW5ndGgpIHsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZW4gPSAqb3A7CiAgICAgICAgICAgIGlmIChsZW4gPiBWQUNNX01BWF9TVFJJTkcpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgY3AgPSBncm91cE5hbWU7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICgqb3AgPiAyNTUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAvKiBpbGxlZ2FsIHZhbHVlICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqY3ArKyA9IChjaGFyKSAqb3ArKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAqY3AgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAob3AgPj0gbmFtZSArICpsZW5ndGgpIHsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZW4gPSAqb3A7CiAgICAgICAgICAgIGlmIChsZW4gPiBWQUNNX01BWF9TVFJJTkcpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgY3AgPSBjb250ZXh0UHJlZml4OwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoKm9wID4gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgLyogaWxsZWdhbCB2YWx1ZSAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKmNwKysgPSAoY2hhcikgKm9wKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKmNwID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKG9wID49IG5hbWUgKyAqbGVuZ3RoKSB7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2VjbW9kZWwgPSAqb3ArKzsKICAgICAgICB9CiAgICAgICAgaWYgKG9wID49IG5hbWUgKyAqbGVuZ3RoKSB7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2VjbGV2ZWwgPSAqb3ArKzsKICAgICAgICB9CiAgICAgICAgdmFjbV9zY2FuQWNjZXNzSW5pdCgpOwogICAgICAgIHdoaWxlICgoZ3AgPSB2YWNtX3NjYW5BY2Nlc3NOZXh0KCkpICE9IE5VTEwpIHsKICAgICAgICAgICAgY21wID0gc3RyY21wKGdwLT5ncm91cE5hbWUsIGdyb3VwTmFtZSk7CiAgICAgICAgICAgIGlmIChjbXAgPiAwKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChjbXAgPCAwKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNtcCA9IHN0cmNtcChncC0+Y29udGV4dFByZWZpeCwgY29udGV4dFByZWZpeCk7CiAgICAgICAgICAgIGlmIChjbXAgPiAwKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChjbXAgPCAwKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGlmIChncC0+c2VjdXJpdHlNb2RlbCA+IHNlY21vZGVsKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChncC0+c2VjdXJpdHlNb2RlbCA8IHNlY21vZGVsKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGlmIChncC0+c2VjdXJpdHlMZXZlbCA+IHNlY2xldmVsKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChncCkgewogICAgICAgICAgICAqbGVuZ3RoID0gMTE7CiAgICAgICAgICAgIGNwID0gZ3AtPmdyb3VwTmFtZTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgbmFtZVsoKmxlbmd0aCkrK10gPSAqY3ArKzsKICAgICAgICAgICAgfSB3aGlsZSAoKmNwKTsKICAgICAgICAgICAgY3AgPSBncC0+Y29udGV4dFByZWZpeDsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgbmFtZVsoKmxlbmd0aCkrK10gPSAqY3ArKzsKICAgICAgICAgICAgfSB3aGlsZSAoKmNwKTsKICAgICAgICAgICAgbmFtZVsoKmxlbmd0aCkrK10gPSBncC0+c2VjdXJpdHlNb2RlbDsKICAgICAgICAgICAgbmFtZVsoKmxlbmd0aCkrK10gPSBncC0+c2VjdXJpdHlMZXZlbDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFncCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmdfcmV0dXJuKTsKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIEFDQ0VTU01BVENIOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ3AtPmNvbnRleHRNYXRjaDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgQUNDRVNTTEVWRUw6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBncC0+c2VjdXJpdHlMZXZlbDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgQUNDRVNTTU9ERUw6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBncC0+c2VjdXJpdHlNb2RlbDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgQUNDRVNTUFJFRklYOgogICAgICAgICp2YXJfbGVuID0gKmdwLT5jb250ZXh0UHJlZml4OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgZ3AtPmNvbnRleHRQcmVmaXhbMV07CgogICAgY2FzZSBBQ0NFU1NSRUFEOgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKGdwLT52aWV3c1tWQUNNX1ZJRVdfUkVBRF0pOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGdwLT52aWV3c1tWQUNNX1ZJRVdfUkVBRF07CgogICAgY2FzZSBBQ0NFU1NXUklURToKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihncC0+dmlld3NbVkFDTV9WSUVXX1dSSVRFXSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgZ3AtPnZpZXdzW1ZBQ01fVklFV19XUklURV07CgogICAgY2FzZSBBQ0NFU1NOT1RJRlk6CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oZ3AtPnZpZXdzW1ZBQ01fVklFV19OT1RJRlldKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBncC0+dmlld3NbVkFDTV9WSUVXX05PVElGWV07CgogICAgY2FzZSBBQ0NFU1NTVE9SQUdFOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ3AtPnN0b3JhZ2VUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBBQ0NFU1NTVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBncC0+c3RhdHVzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICB9CgogICAgcmV0dXJuIE5VTEw7Cn0KCnVfY2hhciAgICAgICAgICoKdmFyX3ZhY21fdmlldyhzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgc3RydWN0IHZhY21fdmlld0VudHJ5ICpncCA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAgdmlld05hbWVbVkFDTVNUUklOR0xFTl0gPSB7IDAgfTsKICAgIG9pZCAgICAgICAgICAgICBzdWJ0cmVlW01BWF9PSURfTEVOXSA9IHsgMCB9OwogICAgc2l6ZV90ICAgICAgICAgIHN1YnRyZWVMZW4gPSAwOwogICAgb2lkICAgICAgICAgICAgKm9wLCAqb3AxOwogICAgdW5zaWduZWQgbG9uZyAgIGxlbiA9IDAsIGkgPSAwOwogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgaW50ICAgICAgICAgICAgIGNtcCwgY21wMjsKCiAgICAvKgogICAgICogU2V0IHVwIHdyaXRlX21ldGhvZCBmaXJzdCwgaW4gY2FzZSB3ZSByZXR1cm4gTlVMTCBiZWZvcmUgZ2V0dGluZyB0bwogICAgICogdGhlIHN3aXRjaCAodnAtPm1hZ2ljKSBiZWxvdy4gIEluIHNvbWUgb2YgdGhlc2UgY2FzZXMsIHdlIHN0aWxsIHdhbnQKICAgICAqIHRvIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHdyaXRlX21ldGhvZCwgaWYgb25seSB0byBoYXZlIGl0IHJldHVybiB0aGUKICAgICAqIGFwcHJvcHJpYXRlIGVycm9yLiAgCiAgICAgKi8KCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewojaWZuZGVmIE5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVCAKICAgIGNhc2UgVklFV01BU0s6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3ZhY21WaWV3TWFzazsKICAgICAgICBicmVhazsKICAgIGNhc2UgVklFV1RZUEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3ZhY21WaWV3VHlwZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVklFV1NUT1JBR0U6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3ZhY21WaWV3U3RvcmFnZVR5cGU7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFZJRVdTVEFUVVM6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3ZhY21WaWV3U3RhdHVzOwogICAgICAgIGJyZWFrOwojZW5kaWYgLyogIU5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVCAqLyAKICAgIGRlZmF1bHQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IE5VTEw7CiAgICB9CgogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwoKICAgIGlmICh2cC0+bWFnaWMgIT0gVkFDTVZJRVdTUElOTE9DSykgewogICAgICAgIGlmIChtZW1jbXAobmFtZSwgdnAtPm5hbWUsIHNpemVvZihvaWQpICogdnAtPm5hbWVsZW4pICE9IDApIHsKICAgICAgICAgICAgbWVtY3B5KG5hbWUsIHZwLT5uYW1lLCBzaXplb2Yob2lkKSAqIHZwLT5uYW1lbGVuKTsKICAgICAgICAgICAgKmxlbmd0aCA9IHZwLT5uYW1lbGVuOwogICAgICAgIH0KCiAgICAgICAgaWYgKGV4YWN0KSB7CiAgICAgICAgICAgIGlmICgqbGVuZ3RoIDwgMTUpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEV4dHJhY3QgdGhlIHZpZXcgbmFtZSBpbmRleCBmcm9tIHRoZSByZXF1ZXN0ZWQgT0lEIC4uLi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wID0gbmFtZSArIDEyOwogICAgICAgICAgICBsZW4gPSAqb3ArKzsKICAgICAgICAgICAgaWYgKGxlbiA+IFZBQ01fTUFYX1NUUklORykKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICBjcCA9IHZpZXdOYW1lOwogICAgICAgICAgICB3aGlsZSAobGVuLS0gPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoKm9wID4gMjU1KQogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgKmNwKysgPSAoY2hhcikgKm9wKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKmNwID0gMDsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIC4uLiBmb2xsb3dlZCBieSB0aGUgdmlldyBPSUQgaW5kZXguCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdWJ0cmVlWzBdID0gbGVuID0gKm9wKys7CiAgICAgICAgICAgIHN1YnRyZWVMZW4gPSAxOwogICAgICAgICAgICBpZiAobGVuID4gTUFYX09JRF9MRU4pCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgaWYgKCAob3ArbGVuKSAhPSAobmFtZSArICpsZW5ndGgpICkKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgLyogRGVjbGFyZWQgbGVuZ3RoIGRvZXNuJ3QgbWF0Y2ggd2hhdCB3ZSBhY3R1YWxseSBnb3QgKi8KICAgICAgICAgICAgb3AxID0gJihzdWJ0cmVlWzFdKTsKICAgICAgICAgICAgd2hpbGUgKGxlbi0tID4gMCkgewogICAgICAgICAgICAgICAgKm9wMSsrID0gKm9wKys7CiAgICAgICAgICAgICAgICBzdWJ0cmVlTGVuKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdwID0gdmFjbV9nZXRWaWV3RW50cnkodmlld05hbWUsICZzdWJ0cmVlWzFdLCBzdWJ0cmVlTGVuLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFDTV9NT0RFX0lHTk9SRV9NQVNLKTsKICAgICAgICAgICAgaWYgKGdwICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGlmIChncC0+dmlld1N1YnRyZWVMZW4gIT0gc3VidHJlZUxlbikgewogICAgICAgICAgICAgICAgICAgIGdwID0gTlVMTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZpZXdOYW1lWzBdID0gMDsKICAgICAgICAgICAgb3AgPSBuYW1lICsgMTI7CiAgICAgICAgICAgIGlmIChvcCA+PSBuYW1lICsgKmxlbmd0aCkgewogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbGVuID0gKm9wOwogICAgICAgICAgICAgICAgaWYgKGxlbiA+IFZBQ01fTUFYX1NUUklORykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIGNwID0gdmlld05hbWU7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGxlbiAmJiBvcCA8IG5hbWUgKyAqbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKm9wID4gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqY3ArKyA9IChjaGFyKSAqb3ArKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICpjcCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wID49IG5hbWUgKyAqbGVuZ3RoKSB7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsZW4gPSAqb3ArKzsKICAgICAgICAgICAgICAgIG9wMSA9IHN1YnRyZWU7CiAgICAgICAgICAgICAgICAqb3AxKysgPSBsZW47CiAgICAgICAgICAgICAgICBzdWJ0cmVlTGVuKys7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGxlbiAmJiBvcCA8IG5hbWUgKyAqbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAqb3AxKysgPSAqb3ArKzsKICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlTGVuKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFjbV9zY2FuVmlld0luaXQoKTsKICAgICAgICAgICAgd2hpbGUgKChncCA9IHZhY21fc2NhblZpZXdOZXh0KCkpICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGNtcCA9IHN0cmNtcChncC0+dmlld05hbWUsIHZpZXdOYW1lKTsKICAgICAgICAgICAgICAgIGNtcDIgPQogICAgICAgICAgICAgICAgICAgIHNubXBfb2lkX2NvbXBhcmUoZ3AtPnZpZXdTdWJ0cmVlLCBncC0+dmlld1N1YnRyZWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLCBzdWJ0cmVlTGVuKTsKICAgICAgICAgICAgICAgIGlmIChjbXAgPT0gMCAmJiBjbXAyID4gMCkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChncCkgewogICAgICAgICAgICAgICAgKmxlbmd0aCA9IDEyOwogICAgICAgICAgICAgICAgY3AgPSBncC0+dmlld05hbWU7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgbmFtZVsoKmxlbmd0aCkrK10gPSAqY3ArKzsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKCpjcCk7CiAgICAgICAgICAgICAgICBvcDEgPSBncC0+dmlld1N1YnRyZWU7CiAgICAgICAgICAgICAgICBsZW4gPSBncC0+dmlld1N1YnRyZWVMZW47CiAgICAgICAgICAgICAgICB3aGlsZSAobGVuLS0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbmFtZVsoKmxlbmd0aCkrK10gPSAqb3AxKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChncCA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGhlYWRlcl9nZW5lcmljKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpKSB7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZGlmIC0tIHZwLT5tYWdpYyAhPSBWQUNNVklFV1NQSU5MT0NLICovCgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgVkFDTVZJRVdTUElOTE9DSzoKI2lmbmRlZiBORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdmFjbVZpZXdTcGluTG9jazsKI2VuZGlmIC8qICFORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQgKi8KICAgICAgICBsb25nX3JldHVybiA9IHZhY21WaWV3U3BpbkxvY2s7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKCiAgICBjYXNlIFZJRVdOQU1FOgogICAgICAgICp2YXJfbGVuID0gZ3AtPnZpZXdOYW1lWzBdOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgZ3AtPnZpZXdOYW1lWzFdOwoKICAgIGNhc2UgVklFV1NVQlRSRUU6CiAgICAgICAgKnZhcl9sZW4gPSBncC0+dmlld1N1YnRyZWVMZW4gKiBzaXplb2Yob2lkKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBncC0+dmlld1N1YnRyZWU7CgogICAgY2FzZSBWSUVXTUFTSzoKICAgICAgICAqdmFyX2xlbiA9IGdwLT52aWV3TWFza0xlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBncC0+dmlld01hc2s7CgogICAgY2FzZSBWSUVXVFlQRToKICAgICAgICBsb25nX3JldHVybiA9IGdwLT52aWV3VHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgVklFV1NUT1JBR0U6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBncC0+dmlld1N0b3JhZ2VUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBWSUVXU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ3AtPnZpZXdTdGF0dXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIH0KCiAgICByZXR1cm4gTlVMTDsKfQoKI2lmbmRlZiBORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQgCmludApzZWMyZ3JvdXBfcGFyc2Vfb2lkKG9pZCAqIG9pZEluZGV4LCBzaXplX3Qgb2lkTGVuLAogICAgICAgICAgICAgICAgICAgIGludCAqbW9kZWwsIHVuc2lnbmVkIGNoYXIgKipuYW1lLCBzaXplX3QgKiBuYW1lTGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgbmFtZUw7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICAvKgogICAgICogZmlyc3QgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBvaWQgCiAgICAgKi8KICAgIGlmICgob2lkTGVuIDw9IDApIHx8ICghb2lkSW5kZXgpKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBuYW1lTCA9IG9pZEluZGV4WzFdOyAgICAgICAgLyogdGhlIGluaXRpYWwgbmFtZSBsZW5ndGggKi8KICAgIGlmICgoaW50KSBvaWRMZW4gIT0gbmFtZUwgKyAyKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgLyoKICAgICAqIGl0cyB2YWxpZCwgbWFsbG9jIHRoZSBzcGFjZSBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgCiAgICAgKi8KICAgIGlmIChuYW1lID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAqbmFtZSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyhuYW1lTCArIDEpOwogICAgaWYgKCpuYW1lID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAqbW9kZWwgPSBvaWRJbmRleFswXTsKICAgICpuYW1lTGVuID0gbmFtZUw7CgoKICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lTDsgaSsrKSB7CiAgICAgICAgaWYgKG9pZEluZGV4W2kgKyAyXSA+IDI1NSkgewogICAgICAgICAgICBmcmVlKCpuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIG5hbWVbMF1baV0gPSAodW5zaWduZWQgY2hhcikgb2lkSW5kZXhbaSArIDJdOwogICAgfQogICAgbmFtZVswXVtuYW1lTF0gPSAwOwoKICAgIHJldHVybiAwOwoKfQoKc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqCnNlYzJncm91cF9wYXJzZV9ncm91cEVudHJ5KG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqZ2VwdHI7CgogICAgY2hhciAgICAgICAgICAgKm5ld05hbWU7CiAgICBpbnQgICAgICAgICAgICAgbW9kZWw7CiAgICBzaXplX3QgICAgICAgICAgbmFtZUxlbjsKCiAgICAvKgogICAgICogZ2V0IHRoZSBuYW1lIGFuZCBlbmdpbmVJRCBvdXQgb2YgdGhlIGluY29taW5nIG9pZCAKICAgICAqLwogICAgaWYgKHNlYzJncm91cF9wYXJzZV9vaWQKICAgICAgICAoJm5hbWVbU0VDMkdST1VQX01JQl9MRU5HVEhdLCBuYW1lX2xlbiAtIFNFQzJHUk9VUF9NSUJfTEVOR1RILAogICAgICAgICAmbW9kZWwsICh1X2NoYXIgKiopICYgbmV3TmFtZSwgJm5hbWVMZW4pKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBOb3cgc2VlIGlmIGEgdXNlciBleGlzdHMgd2l0aCB0aGVzZSBpbmRleCB2YWx1ZXMgCiAgICAgKi8KICAgIGdlcHRyID0gdmFjbV9nZXRHcm91cEVudHJ5KG1vZGVsLCBuZXdOYW1lKTsKICAgIGZyZWUobmV3TmFtZSk7CgogICAgcmV0dXJuIGdlcHRyOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdmFjbV9wYXJzZV9ncm91cEVudHJ5KCkgKi8KCmludAp3cml0ZV92YWNtR3JvdXBOYW1lKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBzdHJpbmdbVkFDTVNUUklOR0xFTl07CiAgICBzdHJ1Y3QgdmFjbV9ncm91cEVudHJ5ICpnZXB0cjsKICAgIHN0YXRpYyBpbnQgICAgICByZXNldE9uRmFpbDsKCiAgICBpZiAoYWN0aW9uID09IFJFU0VSVkUxKSB7CiAgICAgICAgcmVzZXRPbkZhaWwgPSAwOwogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBpZiAodmFyX3ZhbF9sZW4gPCAxIHx8IHZhcl92YWxfbGVuID4gMzIpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFJFU0VSVkUyKSB7CiAgICAgICAgaWYgKChnZXB0ciA9IHNlYzJncm91cF9wYXJzZV9ncm91cEVudHJ5KG5hbWUsIG5hbWVfbGVuKSkgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXNldE9uRmFpbCA9IDE7CiAgICAgICAgICAgIG1lbWNweShzdHJpbmcsIGdlcHRyLT5ncm91cE5hbWUsIFZBQ01TVFJJTkdMRU4pOwogICAgICAgICAgICBtZW1jcHkoZ2VwdHItPmdyb3VwTmFtZSwgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4pOwogICAgICAgICAgICBnZXB0ci0+Z3JvdXBOYW1lW3Zhcl92YWxfbGVuXSA9IDA7CiAgICAgICAgICAgIGlmIChnZXB0ci0+c3RhdHVzID09IFJTX05PVFJFQURZKSB7CiAgICAgICAgICAgICAgICBnZXB0ci0+c3RhdHVzID0gUlNfTk9USU5TRVJWSUNFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gRlJFRSkgewogICAgICAgIC8qCiAgICAgICAgICogVHJ5IHRvIHVuZG8gdGhlIFNFVCBoZXJlIChhYm5vcm1hbCB1c2FnZSBvZiBGUkVFIGNsYXVzZSkgIAogICAgICAgICAqLwogICAgICAgIGlmICgoZ2VwdHIgPSBzZWMyZ3JvdXBfcGFyc2VfZ3JvdXBFbnRyeShuYW1lLCBuYW1lX2xlbikpICE9IE5VTEwgJiYKICAgICAgICAgICAgcmVzZXRPbkZhaWwpIHsKICAgICAgICAgICAgbWVtY3B5KGdlcHRyLT5ncm91cE5hbWUsIHN0cmluZywgVkFDTVNUUklOR0xFTik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV92YWNtU2VjdXJpdHlUb0dyb3VwU3RvcmFnZVR5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIC8qCiAgICAgKiB2YXJpYWJsZXMgd2UgbWF5IHVzZSBsYXRlciAKICAgICAqLwogICAgc3RhdGljIGxvbmcgICAgIGxvbmdfcmV0OwogICAgc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqZ2VwdHI7CgogICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICB9CiAgICBpZiAodmFyX3ZhbF9sZW4gPiBzaXplb2YobG9uZ19yZXQpKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgfQogICAgaWYgKGFjdGlvbiA9PSBDT01NSVQpIHsKICAgICAgICAvKgogICAgICAgICAqIGRvbid0IGFsbG93IGNyZWF0aW9ucyBoZXJlIAogICAgICAgICAqLwogICAgICAgIGlmICgoZ2VwdHIgPSBzZWMyZ3JvdXBfcGFyc2VfZ3JvdXBFbnRyeShuYW1lLCBuYW1lX2xlbikpID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7CiAgICAgICAgfQogICAgICAgIGxvbmdfcmV0ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBpZiAoKGxvbmdfcmV0ID09IFNUX1ZPTEFUSUxFIHx8IGxvbmdfcmV0ID09IFNUX05PTlZPTEFUSUxFKSAmJgogICAgICAgICAgICAoZ2VwdHItPnN0b3JhZ2VUeXBlID09IFNUX1ZPTEFUSUxFIHx8CiAgICAgICAgICAgICBnZXB0ci0+c3RvcmFnZVR5cGUgPT0gU1RfTk9OVk9MQVRJTEUpKSB7CiAgICAgICAgICAgIGdlcHRyLT5zdG9yYWdlVHlwZSA9IGxvbmdfcmV0OwogICAgICAgIH0gZWxzZSBpZiAobG9uZ19yZXQgPT0gZ2VwdHItPnN0b3JhZ2VUeXBlKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCmludAp3cml0ZV92YWNtU2VjdXJpdHlUb0dyb3VwU3RhdHVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKICAgIGludCAgICAgICAgICAgICBtb2RlbDsKICAgIGNoYXIgICAgICAgICAgICpuZXdOYW1lOwogICAgc2l6ZV90ICAgICAgICAgIG5hbWVMZW47CiAgICBzdHJ1Y3QgdmFjbV9ncm91cEVudHJ5ICpnZXB0cjsKCiAgICBpZiAoYWN0aW9uID09IFJFU0VSVkUxKSB7CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBpZiAodmFyX3ZhbF9sZW4gIT0gc2l6ZW9mKGxvbmdfcmV0KSkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQogICAgICAgIGxvbmdfcmV0ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfTk9UUkVBRFkgfHwgbG9uZ19yZXQgPCAxIHx8IGxvbmdfcmV0ID4gNikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogU2VlIGlmIHdlIGNhbiBwYXJzZSB0aGUgb2lkIGZvciBtb2RlbC9uYW1lIGZpcnN0LiAgCiAgICAgICAgICovCgogICAgICAgIGlmIChzZWMyZ3JvdXBfcGFyc2Vfb2lkKCZuYW1lW1NFQzJHUk9VUF9NSUJfTEVOR1RIXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiAtIFNFQzJHUk9VUF9NSUJfTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlbCwgKHVfY2hhciAqKikgJiBuZXdOYW1lLCAmbmFtZUxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgfQoKICAgICAgICBpZiAobW9kZWwgPCAxIHx8IG5hbWVMZW4gPCAxIHx8IG5hbWVMZW4gPiAzMikgewogICAgICAgICAgICBmcmVlKG5ld05hbWUpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9DUkVBVElPTjsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogTm93IHNlZSBpZiBhIGdyb3VwIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlc2UgaW5kZXggdmFsdWVzLiAgCiAgICAgICAgICovCiAgICAgICAgZ2VwdHIgPSB2YWNtX2dldEdyb3VwRW50cnkobW9kZWwsIG5ld05hbWUpOwoKICAgICAgICBpZiAoZ2VwdHIgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5ER08gfHwgbG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5EV0FJVCkgewogICAgICAgICAgICAgICAgZnJlZShuZXdOYW1lKTsKICAgICAgICAgICAgICAgIGxvbmdfcmV0ID0gUlNfTk9UUkVBRFk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0RFU1RST1kgJiYgZ2VwdHItPnN0b3JhZ2VUeXBlID09IFNUX1BFUk1BTkVOVCkgewogICAgICAgICAgICAgICAgZnJlZShuZXdOYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0FDVElWRSB8fCBsb25nX3JldCA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKICAgICAgICAgICAgICAgIGZyZWUobmV3TmFtZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0NSRUFURUFOREdPIHx8IGxvbmdfcmV0ID09IFJTX0NSRUFURUFORFdBSVQpIHsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogR2VuZXJhdGUgYSBuZXcgZ3JvdXAgZW50cnkuICAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKChnZXB0ciA9CiAgICAgICAgICAgICAgICAgICAgIHZhY21fY3JlYXRlR3JvdXBFbnRyeShtb2RlbCwgbmV3TmFtZSkpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBmcmVlKG5ld05hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFNldCBkZWZhdWx0cy4gIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBnZXB0ci0+c3RvcmFnZVR5cGUgPSBTVF9OT05WT0xBVElMRTsKICAgICAgICAgICAgICAgIGdlcHRyLT5zdGF0dXMgPSBSU19OT1RSRUFEWTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKG5ld05hbWUpOwogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gQUNUSU9OKSB7CiAgICAgICAgc2VjMmdyb3VwX3BhcnNlX29pZCgmbmFtZVtTRUMyR1JPVVBfTUlCX0xFTkdUSF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiAtIFNFQzJHUk9VUF9NSUJfTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVsLCAodV9jaGFyICoqKSAmIG5ld05hbWUsICZuYW1lTGVuKTsKCiAgICAgICAgZ2VwdHIgPSB2YWNtX2dldEdyb3VwRW50cnkobW9kZWwsIG5ld05hbWUpOwoKICAgICAgICBpZiAoZ2VwdHIgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5ER08gfHwgbG9uZ19yZXQgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogQ2hlY2sgdGhhdCBhbGwgdGhlIG1hbmRhdG9yeSBvYmplY3RzIGhhdmUgYmVlbiBzZXQgYnkgbm93LAogICAgICAgICAgICAgICAgICogb3RoZXJ3aXNlIHJldHVybiBpbmNvbnNpc3RlbnRWYWx1ZS4gIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoZ2VwdHItPmdyb3VwTmFtZVswXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZnJlZShuZXdOYW1lKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBnZXB0ci0+c3RhdHVzID0gUlNfQUNUSVZFOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxvbmdfcmV0ID09IFJTX0NSRUFURUFORFdBSVQpIHsKICAgICAgICAgICAgICAgIGlmIChnZXB0ci0+Z3JvdXBOYW1lWzBdICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBnZXB0ci0+c3RhdHVzID0gUlNfTk9USU5TRVJWSUNFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGxvbmdfcmV0ID09IFJTX05PVElOU0VSVklDRSkgewogICAgICAgICAgICAgICAgaWYgKGdlcHRyLT5zdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgICAgICAgICAgICAgZ2VwdHItPnN0YXR1cyA9IFJTX05PVElOU0VSVklDRTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2VwdHItPnN0YXR1cyA9PSBSU19OT1RSRUFEWSkgewogICAgICAgICAgICAgICAgICAgIGZyZWUobmV3TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUobmV3TmFtZSk7CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBDT01NSVQpIHsKICAgICAgICBzZWMyZ3JvdXBfcGFyc2Vfb2lkKCZuYW1lW1NFQzJHUk9VUF9NSUJfTEVOR1RIXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfbGVuIC0gU0VDMkdST1VQX01JQl9MRU5HVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZWwsICh1X2NoYXIgKiopICYgbmV3TmFtZSwgJm5hbWVMZW4pOwoKICAgICAgICBnZXB0ciA9IHZhY21fZ2V0R3JvdXBFbnRyeShtb2RlbCwgbmV3TmFtZSk7CgogICAgICAgIGlmIChnZXB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICB2YWNtX2Rlc3Ryb3lHcm91cEVudHJ5KG1vZGVsLCBuZXdOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKG5ld05hbWUpOwogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gVU5ETykgewogICAgICAgIGlmIChsb25nX3JldCA9PSBSU19DUkVBVEVBTkRHTyB8fCBsb25nX3JldCA9PSBSU19DUkVBVEVBTkRXQUlUKSB7CiAgICAgICAgICAgIHNlYzJncm91cF9wYXJzZV9vaWQoJm5hbWVbU0VDMkdST1VQX01JQl9MRU5HVEhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfbGVuIC0gU0VDMkdST1VQX01JQl9MRU5HVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVsLCAodV9jaGFyICoqKSAmIG5ld05hbWUsICZuYW1lTGVuKTsKCiAgICAgICAgICAgIGdlcHRyID0gdmFjbV9nZXRHcm91cEVudHJ5KG1vZGVsLCBuZXdOYW1lKTsKCiAgICAgICAgICAgIGlmIChnZXB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICB2YWNtX2Rlc3Ryb3lHcm91cEVudHJ5KG1vZGVsLCBuZXdOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKG5ld05hbWUpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CmFjY2Vzc19wYXJzZV9vaWQob2lkICogb2lkSW5kZXgsIHNpemVfdCBvaWRMZW4sCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKmdyb3VwTmFtZSwgc2l6ZV90ICogZ3JvdXBOYW1lTGVuLAogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipjb250ZXh0UHJlZml4LCBzaXplX3QgKiBjb250ZXh0UHJlZml4TGVuLAogICAgICAgICAgICAgICAgIGludCAqbW9kZWwsIGludCAqbGV2ZWwpCnsKICAgIGludCAgICAgICAgICAgICBncm91cE5hbWVMLCBjb250ZXh0UHJlZml4TDsKICAgIGludCAgICAgICAgICAgICBpOwoKICAgIC8qCiAgICAgKiBmaXJzdCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIG9pZCAKICAgICAqLwogICAgaWYgKChvaWRMZW4gPD0gMCkgfHwgKCFvaWRJbmRleCkpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGdyb3VwTmFtZUwgPSBvaWRJbmRleFswXTsKICAgIGNvbnRleHRQcmVmaXhMID0gb2lkSW5kZXhbZ3JvdXBOYW1lTCArIDFdOyAgLyogdGhlIGluaXRpYWwgbmFtZSBsZW5ndGggKi8KICAgIGlmICgoaW50KSBvaWRMZW4gIT0gZ3JvdXBOYW1lTCArIGNvbnRleHRQcmVmaXhMICsgNCkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8qCiAgICAgKiBpdHMgdmFsaWQsIG1hbGxvYyB0aGUgc3BhY2UgYW5kIHN0b3JlIHRoZSByZXN1bHRzIAogICAgICovCiAgICBpZiAoY29udGV4dFByZWZpeCA9PSBOVUxMIHx8IGdyb3VwTmFtZSA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgKmdyb3VwTmFtZSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyhncm91cE5hbWVMICsgMSk7CiAgICBpZiAoKmdyb3VwTmFtZSA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgKmNvbnRleHRQcmVmaXggPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MoY29udGV4dFByZWZpeEwgKyAxKTsKICAgIGlmICgqY29udGV4dFByZWZpeCA9PSBOVUxMKSB7CiAgICAgICAgZnJlZSgqZ3JvdXBOYW1lKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAqY29udGV4dFByZWZpeExlbiA9IGNvbnRleHRQcmVmaXhMOwogICAgKmdyb3VwTmFtZUxlbiA9IGdyb3VwTmFtZUw7CgogICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTmFtZUw7IGkrKykgewogICAgICAgIGlmIChvaWRJbmRleFtpICsgMV0gPiAyNTUpIHsKICAgICAgICAgICAgZnJlZSgqZ3JvdXBOYW1lKTsKICAgICAgICAgICAgZnJlZSgqY29udGV4dFByZWZpeCk7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBncm91cE5hbWVbMF1baV0gPSAodW5zaWduZWQgY2hhcikgb2lkSW5kZXhbaSArIDFdOwogICAgfQogICAgZ3JvdXBOYW1lWzBdW2dyb3VwTmFtZUxdID0gMDsKCgogICAgZm9yIChpID0gMDsgaSA8IGNvbnRleHRQcmVmaXhMOyBpKyspIHsKICAgICAgICBpZiAob2lkSW5kZXhbaSArIGdyb3VwTmFtZUwgKyAyXSA+IDI1NSkgewogICAgICAgICAgICBmcmVlKCpncm91cE5hbWUpOwogICAgICAgICAgICBmcmVlKCpjb250ZXh0UHJlZml4KTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGNvbnRleHRQcmVmaXhbMF1baV0gPSAodW5zaWduZWQgY2hhcikgb2lkSW5kZXhbaSArIGdyb3VwTmFtZUwgKyAyXTsKICAgIH0KICAgIGNvbnRleHRQcmVmaXhbMF1bY29udGV4dFByZWZpeExdID0gMDsKCiAgICAqbW9kZWwgPSBvaWRJbmRleFtncm91cE5hbWVMICsgY29udGV4dFByZWZpeEwgKyAyXTsKICAgICpsZXZlbCA9IG9pZEluZGV4W2dyb3VwTmFtZUwgKyBjb250ZXh0UHJlZml4TCArIDNdOwoKICAgIHJldHVybiAwOwoKfQoKc3RydWN0IHZhY21fYWNjZXNzRW50cnkgKgphY2Nlc3NfcGFyc2VfYWNjZXNzRW50cnkob2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqYXB0cjsKCiAgICBjaGFyICAgICAgICAgICAqbmV3R3JvdXBOYW1lID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICpuZXdDb250ZXh0UHJlZml4ID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICBtb2RlbCwgbGV2ZWw7CiAgICBzaXplX3QgICAgICAgICAgZ3JvdXBOYW1lTGVuLCBjb250ZXh0UHJlZml4TGVuOwoKICAgIC8qCiAgICAgKiBnZXQgdGhlIG5hbWUgYW5kIGVuZ2luZUlEIG91dCBvZiB0aGUgaW5jb21pbmcgb2lkIAogICAgICovCiAgICBpZiAoYWNjZXNzX3BhcnNlX29pZAogICAgICAgICgmbmFtZVtBQ0NFU1NfTUlCX0xFTkdUSF0sIG5hbWVfbGVuIC0gQUNDRVNTX01JQl9MRU5HVEgsCiAgICAgICAgICh1X2NoYXIgKiopICYgbmV3R3JvdXBOYW1lLCAmZ3JvdXBOYW1lTGVuLAogICAgICAgICAodV9jaGFyICoqKSAmIG5ld0NvbnRleHRQcmVmaXgsICZjb250ZXh0UHJlZml4TGVuLCAmbW9kZWwsCiAgICAgICAgICZsZXZlbCkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyoKICAgICAqIE5vdyBzZWUgaWYgYSB1c2VyIGV4aXN0cyB3aXRoIHRoZXNlIGluZGV4IHZhbHVlcyAKICAgICAqLwogICAgYXB0ciA9CiAgICAgICAgdmFjbV9nZXRBY2Nlc3NFbnRyeShuZXdHcm91cE5hbWUsIG5ld0NvbnRleHRQcmVmaXgsIG1vZGVsLCBsZXZlbCk7CiAgICBTTk1QX0ZSRUUobmV3Q29udGV4dFByZWZpeCk7CiAgICBTTk1QX0ZSRUUobmV3R3JvdXBOYW1lKTsKCiAgICByZXR1cm4gYXB0cjsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHZhY21fcGFyc2VfYWNjZXNzRW50cnkoKSAqLwoKaW50CndyaXRlX3ZhY21BY2Nlc3NTdGF0dXMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKICAgIGludCAgICAgICAgICAgICBtb2RlbCwgbGV2ZWw7CiAgICBjaGFyICAgICAgICAgICAqbmV3R3JvdXBOYW1lID0gTlVMTCwgKm5ld0NvbnRleHRQcmVmaXggPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIGdyb3VwTmFtZUxlbiwgY29udGV4dFByZWZpeExlbjsKICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICphcHRyID0gTlVMTDsKCiAgICBpZiAoYWN0aW9uID09IFJFU0VSVkUxKSB7CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBpZiAodmFyX3ZhbF9sZW4gIT0gc2l6ZW9mKGxvbmdfcmV0KSkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQogICAgICAgIGxvbmdfcmV0ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfTk9UUkVBRFkgfHwgbG9uZ19yZXQgPCAxIHx8IGxvbmdfcmV0ID4gNikgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogU2VlIGlmIHdlIGNhbiBwYXJzZSB0aGUgb2lkIGZvciBtb2RlbC9uYW1lIGZpcnN0LiAgCiAgICAgICAgICovCiAgICAgICAgaWYgKGFjY2Vzc19wYXJzZV9vaWQoJm5hbWVbQUNDRVNTX01JQl9MRU5HVEhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfbGVuIC0gQUNDRVNTX01JQl9MRU5HVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKikgJiBuZXdHcm91cE5hbWUsICZncm91cE5hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKikgJiBuZXdDb250ZXh0UHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0UHJlZml4TGVuLCAmbW9kZWwsICZsZXZlbCkpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgfQoKICAgICAgICBpZiAobW9kZWwgPCAwIHx8IGdyb3VwTmFtZUxlbiA8IDEgfHwgZ3JvdXBOYW1lTGVuID4gMzIgfHwKICAgICAgICAgICAgY29udGV4dFByZWZpeExlbiA+IDMyKSB7CiAgICAgICAgICAgIGZyZWUobmV3R3JvdXBOYW1lKTsKICAgICAgICAgICAgZnJlZShuZXdDb250ZXh0UHJlZml4KTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PQ1JFQVRJT047CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIE5vdyBzZWUgaWYgYSBncm91cCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZXNlIGluZGV4IHZhbHVlcy4gIAogICAgICAgICAqLwogICAgICAgIGFwdHIgPQogICAgICAgICAgICB2YWNtX2dldEFjY2Vzc0VudHJ5KG5ld0dyb3VwTmFtZSwgbmV3Q29udGV4dFByZWZpeCwgbW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOwoKICAgICAgICBpZiAoYXB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19DUkVBVEVBTkRHTyB8fCBsb25nX3JldCA9PSBSU19DUkVBVEVBTkRXQUlUKSB7CiAgICAgICAgICAgICAgICBmcmVlKG5ld0dyb3VwTmFtZSk7CiAgICAgICAgICAgICAgICBmcmVlKG5ld0NvbnRleHRQcmVmaXgpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19ERVNUUk9ZICYmIGFwdHItPnN0b3JhZ2VUeXBlID09IFNUX1BFUk1BTkVOVCkgewogICAgICAgICAgICAgICAgZnJlZShuZXdHcm91cE5hbWUpOwogICAgICAgICAgICAgICAgZnJlZShuZXdDb250ZXh0UHJlZml4KTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0FDVElWRSB8fCBsb25nX3JldCA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKICAgICAgICAgICAgICAgIGZyZWUobmV3R3JvdXBOYW1lKTsKICAgICAgICAgICAgICAgIGZyZWUobmV3Q29udGV4dFByZWZpeCk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0NSRUFURUFOREdPIHx8IGxvbmdfcmV0ID09IFJTX0NSRUFURUFORFdBSVQpIHsKICAgICAgICAgICAgICAgIGlmICgoYXB0ciA9IHZhY21fY3JlYXRlQWNjZXNzRW50cnkobmV3R3JvdXBOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZXh0UHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZnJlZShuZXdHcm91cE5hbWUpOwogICAgICAgICAgICAgICAgICAgIGZyZWUobmV3Q29udGV4dFByZWZpeCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogU2V0IGRlZmF1bHRzLiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGFwdHItPmNvbnRleHRNYXRjaCA9IDE7IC8qICBleGFjdCgxKSBpcyB0aGUgREVGVkFMICAqLwogICAgICAgICAgICAgICAgYXB0ci0+c3RvcmFnZVR5cGUgPSBTVF9OT05WT0xBVElMRTsKICAgICAgICAgICAgICAgIGFwdHItPnN0YXR1cyA9IFJTX05PVFJFQURZOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUobmV3R3JvdXBOYW1lKTsKICAgICAgICBmcmVlKG5ld0NvbnRleHRQcmVmaXgpOwogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gQUNUSU9OKSB7CiAgICAgICAgYWNjZXNzX3BhcnNlX29pZCgmbmFtZVtBQ0NFU1NfTUlCX0xFTkdUSF0sCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiAtIEFDQ0VTU19NSUJfTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKikgJiBuZXdHcm91cE5hbWUsICZncm91cE5hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICoqKSAmIG5ld0NvbnRleHRQcmVmaXgsICZjb250ZXh0UHJlZml4TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVsLCAmbGV2ZWwpOwogICAgICAgIGFwdHIgPQogICAgICAgICAgICB2YWNtX2dldEFjY2Vzc0VudHJ5KG5ld0dyb3VwTmFtZSwgbmV3Q29udGV4dFByZWZpeCwgbW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOwoKICAgICAgICBpZiAoYXB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19DUkVBVEVBTkRHTyB8fCBsb25nX3JldCA9PSBSU19BQ1RJVkUpIHsKICAgICAgICAgICAgICAgIGFwdHItPnN0YXR1cyA9IFJTX0FDVElWRTsKICAgICAgICAgICAgfSBlbHNlIGlmIChsb25nX3JldCA9PSBSU19DUkVBVEVBTkRXQUlUKSB7CiAgICAgICAgICAgICAgICBhcHRyLT5zdGF0dXMgPSBSU19OT1RJTlNFUlZJQ0U7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobG9uZ19yZXQgPT0gUlNfTk9USU5TRVJWSUNFKSB7CiAgICAgICAgICAgICAgICBpZiAoYXB0ci0+c3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgICAgICAgICAgICAgIGFwdHItPnN0YXR1cyA9IFJTX05PVElOU0VSVklDRTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXB0ci0+c3RhdHVzID09IFJTX05PVFJFQURZKSB7CiAgICAgICAgICAgICAgICAgICAgZnJlZShuZXdHcm91cE5hbWUpOwogICAgICAgICAgICAgICAgICAgIGZyZWUobmV3Q29udGV4dFByZWZpeCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUobmV3R3JvdXBOYW1lKTsKICAgICAgICBmcmVlKG5ld0NvbnRleHRQcmVmaXgpOwogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gQ09NTUlUKSB7CiAgICAgICAgYWNjZXNzX3BhcnNlX29pZCgmbmFtZVtBQ0NFU1NfTUlCX0xFTkdUSF0sCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiAtIEFDQ0VTU19NSUJfTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKikgJiBuZXdHcm91cE5hbWUsICZncm91cE5hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICoqKSAmIG5ld0NvbnRleHRQcmVmaXgsICZjb250ZXh0UHJlZml4TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVsLCAmbGV2ZWwpOwogICAgICAgIGFwdHIgPQogICAgICAgICAgICB2YWNtX2dldEFjY2Vzc0VudHJ5KG5ld0dyb3VwTmFtZSwgbmV3Q29udGV4dFByZWZpeCwgbW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOwoKICAgICAgICBpZiAoYXB0cikgewogICAgICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAgICAgdmFjbV9kZXN0cm95QWNjZXNzRW50cnkobmV3R3JvdXBOYW1lLCBuZXdDb250ZXh0UHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsIGxldmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcmVlKG5ld0dyb3VwTmFtZSk7CiAgICAgICAgZnJlZShuZXdDb250ZXh0UHJlZml4KTsKICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFVORE8pIHsKICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5ER08gfHwgbG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5EV0FJVCkgewogICAgICAgICAgICBhY2Nlc3NfcGFyc2Vfb2lkKCZuYW1lW0FDQ0VTU19NSUJfTEVOR1RIXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiAtIEFDQ0VTU19NSUJfTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKiopICYgbmV3R3JvdXBOYW1lLCAmZ3JvdXBOYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKiopICYgbmV3Q29udGV4dFByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dFByZWZpeExlbiwgJm1vZGVsLCAmbGV2ZWwpOwogICAgICAgICAgICBhcHRyID0KICAgICAgICAgICAgICAgIHZhY21fZ2V0QWNjZXNzRW50cnkobmV3R3JvdXBOYW1lLCBuZXdDb250ZXh0UHJlZml4LCBtb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOwogICAgICAgICAgICBpZiAoYXB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICB2YWNtX2Rlc3Ryb3lBY2Nlc3NFbnRyeShuZXdHcm91cE5hbWUsIG5ld0NvbnRleHRQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCwgbGV2ZWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUobmV3R3JvdXBOYW1lKTsKICAgICAgICBmcmVlKG5ld0NvbnRleHRQcmVmaXgpOwogICAgfQoKICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdmFjbUFjY2Vzc1N0b3JhZ2VUeXBlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIC8qCiAgICAgKiB2YXJpYWJsZXMgd2UgbWF5IHVzZSBsYXRlciAKICAgICAqLwogICAgc3RhdGljIGxvbmcgICAgIGxvbmdfcmV0OwogICAgc3RydWN0IHZhY21fYWNjZXNzRW50cnkgKmFwdHI7CgogICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YWNtX3ZhcnMiLAogICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB2YWNtU2VjdXJpdHlUb0dyb3VwU3RvcmFnZVR5cGUgbm90IEFTTl9JTlRFR0VSXG4iKSk7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgIH0KICAgIGlmICh2YXJfdmFsX2xlbiA+IHNpemVvZihsb25nX3JldCkpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFjbV92YXJzIiwKICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdmFjbVNlY3VyaXR5VG9Hcm91cFN0b3JhZ2VUeXBlOiBiYWQgbGVuZ3RoXG4iKSk7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgfQogICAgaWYgKGFjdGlvbiA9PSBDT01NSVQpIHsKICAgICAgICAvKgogICAgICAgICAqIGRvbid0IGFsbG93IGNyZWF0aW9ucyBoZXJlIAogICAgICAgICAqLwogICAgICAgIGlmICgoYXB0ciA9IGFjY2Vzc19wYXJzZV9hY2Nlc3NFbnRyeShuYW1lLCBuYW1lX2xlbikpID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7CiAgICAgICAgfQogICAgICAgIGxvbmdfcmV0ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICAvKgogICAgICAgICAqIGlmICgobG9uZ19yZXQgPT0gU1RfVk9MQVRJTEUgfHwgbG9uZ19yZXQgPT0gU1RfTk9OVk9MQVRJTEUpICYmCiAgICAgICAgICogKGFwdHItPnN0b3JhZ2VUeXBlID09IFNUX1ZPTEFUSUxFIHx8CiAgICAgICAgICogYXB0ci0+c3RvcmFnZVR5cGUgPT0gU1RfTk9OVk9MQVRJTEUpKSAKICAgICAgICAgKi8KICAgICAgICAvKgogICAgICAgICAqIFRoaXMgdmVyc2lvbiBvbmx5IHN1cHBvcnRzIHZvbGF0aWxlIHN0b3JhZ2UKICAgICAgICAgKi8KICAgICAgICBpZiAobG9uZ19yZXQgPT0gYXB0ci0+c3RvcmFnZVR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdmFjbUFjY2Vzc0NvbnRleHRNYXRjaChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgLyoKICAgICAqIHZhcmlhYmxlcyB3ZSBtYXkgdXNlIGxhdGVyIAogICAgICovCiAgICBzdGF0aWMgbG9uZyAgICAgbG9uZ19yZXQ7CiAgICBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqYXB0cjsKCiAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHZhY21BY2Nlc3NDb250ZXh0TWF0Y2ggbm90IEFTTl9JTlRFR0VSXG4iKSk7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgIH0KICAgIGlmICh2YXJfdmFsX2xlbiA+IHNpemVvZihsb25nX3JldCkpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFjbV92YXJzIiwKICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdmFjbUFjY2Vzc0NvbnRleHRNYXRjaDogYmFkIGxlbmd0aFxuIikpOwogICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgIH0KICAgIGlmIChhY3Rpb24gPT0gQ09NTUlUKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBkb24ndCBhbGxvdyBjcmVhdGlvbnMgaGVyZSAKICAgICAgICAgKi8KICAgICAgICBpZiAoKGFwdHIgPSBhY2Nlc3NfcGFyc2VfYWNjZXNzRW50cnkobmFtZSwgbmFtZV9sZW4pKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOwogICAgICAgIH0KICAgICAgICBsb25nX3JldCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgaWYgKGxvbmdfcmV0ID09IENNX0VYQUNUIHx8IGxvbmdfcmV0ID09IENNX1BSRUZJWCkgewogICAgICAgICAgICBhcHRyLT5jb250ZXh0TWF0Y2ggPSBsb25nX3JldDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3ZhY21BY2Nlc3NSZWFkVmlld05hbWUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHN0cmluZ1tWQUNNU1RSSU5HTEVOXTsKICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICphcHRyID0gTlVMTDsKICAgIHN0YXRpYyBpbnQgICAgICByZXNldE9uRmFpbDsKCiAgICBpZiAoYWN0aW9uID09IFJFU0VSVkUxKSB7CiAgICAgICAgcmVzZXRPbkZhaWwgPSAwOwogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFjbV92YXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHZhY21BY2Nlc3NSZWFkVmlld05hbWUgbm90IEFTTl9PQ1RFVF9TVFJcbiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhcl92YWxfbGVuID4gMzIpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB2YWNtQWNjZXNzUmVhZFZpZXdOYW1lOiBiYWQgbGVuZ3RoXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMikgewogICAgICAgIGlmICgoYXB0ciA9IGFjY2Vzc19wYXJzZV9hY2Nlc3NFbnRyeShuYW1lLCBuYW1lX2xlbikpID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzZXRPbkZhaWwgPSAxOwogICAgICAgICAgICBtZW1jcHkoc3RyaW5nLCBhcHRyLT52aWV3c1tWQUNNX1ZJRVdfUkVBRF0sIFZBQ01TVFJJTkdMRU4pOwogICAgICAgICAgICBtZW1jcHkoYXB0ci0+dmlld3NbVkFDTV9WSUVXX1JFQURdLCB2YXJfdmFsLCB2YXJfdmFsX2xlbik7CiAgICAgICAgICAgIGFwdHItPnZpZXdzW1ZBQ01fVklFV19SRUFEXVt2YXJfdmFsX2xlbl0gPSAwOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IEZSRUUpIHsKICAgICAgICAvKgogICAgICAgICAqIFRyeSB0byB1bmRvIHRoZSBTRVQgaGVyZSAoYWJub3JtYWwgdXNhZ2Ugb2YgRlJFRSBjbGF1c2UpICAKICAgICAgICAgKi8KICAgICAgICBpZiAoKGFwdHIgPSBhY2Nlc3NfcGFyc2VfYWNjZXNzRW50cnkobmFtZSwgbmFtZV9sZW4pKSAhPSBOVUxMICYmCiAgICAgICAgICAgIHJlc2V0T25GYWlsKSB7CiAgICAgICAgICAgIG1lbWNweShhcHRyLT52aWV3c1tWQUNNX1ZJRVdfUkVBRF0sIHN0cmluZywgdmFyX3ZhbF9sZW4pOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdmFjbUFjY2Vzc1dyaXRlVmlld05hbWUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBzdHJpbmdbVkFDTVNUUklOR0xFTl07CiAgICBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqYXB0ciA9IE5VTEw7CiAgICBzdGF0aWMgaW50ICAgICAgcmVzZXRPbkZhaWw7CgogICAgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMSkgewogICAgICAgIHJlc2V0T25GYWlsID0gMDsKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB2YWNtQWNjZXNzV3JpdGVWaWV3TmFtZSBub3QgQVNOX09DVEVUX1NUUlxuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBpZiAodmFyX3ZhbF9sZW4gPiAzMikgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFjbV92YXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHZhY21BY2Nlc3NXcml0ZVZpZXdOYW1lOiBiYWQgbGVuZ3RoXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMikgewogICAgICAgIGlmICgoYXB0ciA9IGFjY2Vzc19wYXJzZV9hY2Nlc3NFbnRyeShuYW1lLCBuYW1lX2xlbikpID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzZXRPbkZhaWwgPSAxOwogICAgICAgICAgICBtZW1jcHkoc3RyaW5nLCBhcHRyLT52aWV3c1tWQUNNX1ZJRVdfV1JJVEVdLCBWQUNNU1RSSU5HTEVOKTsKICAgICAgICAgICAgbWVtY3B5KGFwdHItPnZpZXdzW1ZBQ01fVklFV19XUklURV0sIHZhcl92YWwsIHZhcl92YWxfbGVuKTsKICAgICAgICAgICAgYXB0ci0+dmlld3NbVkFDTV9WSUVXX1dSSVRFXVt2YXJfdmFsX2xlbl0gPSAwOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IEZSRUUpIHsKICAgICAgICAvKgogICAgICAgICAqIFRyeSB0byB1bmRvIHRoZSBTRVQgaGVyZSAoYWJub3JtYWwgdXNhZ2Ugb2YgRlJFRSBjbGF1c2UpICAKICAgICAgICAgKi8KICAgICAgICBpZiAoKGFwdHIgPSBhY2Nlc3NfcGFyc2VfYWNjZXNzRW50cnkobmFtZSwgbmFtZV9sZW4pKSAhPSBOVUxMICYmCiAgICAgICAgICAgIHJlc2V0T25GYWlsKSB7CiAgICAgICAgICAgIG1lbWNweShhcHRyLT52aWV3c1tWQUNNX1ZJRVdfV1JJVEVdLCBzdHJpbmcsIHZhcl92YWxfbGVuKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3ZhY21BY2Nlc3NOb3RpZnlWaWV3TmFtZShpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBzdHJpbmdbVkFDTVNUUklOR0xFTl07CiAgICBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqYXB0ciA9IE5VTEw7CiAgICBzdGF0aWMgaW50ICAgICAgcmVzZXRPbkZhaWw7CgogICAgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMSkgewogICAgICAgIHJlc2V0T25GYWlsID0gMDsKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB2YWNtQWNjZXNzTm90aWZ5Vmlld05hbWUgbm90IEFTTl9PQ1RFVF9TVFJcbiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhcl92YWxfbGVuID4gMzIpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB2YWNtQWNjZXNzTm90aWZ5Vmlld05hbWU6IGJhZCBsZW5ndGhcbiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFJFU0VSVkUyKSB7CiAgICAgICAgaWYgKChhcHRyID0gYWNjZXNzX3BhcnNlX2FjY2Vzc0VudHJ5KG5hbWUsIG5hbWVfbGVuKSkgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXNldE9uRmFpbCA9IDE7CiAgICAgICAgICAgIG1lbWNweShzdHJpbmcsIGFwdHItPnZpZXdzW1ZBQ01fVklFV19OT1RJRlldLCBWQUNNU1RSSU5HTEVOKTsKICAgICAgICAgICAgbWVtY3B5KGFwdHItPnZpZXdzW1ZBQ01fVklFV19OT1RJRlldLCB2YXJfdmFsLCB2YXJfdmFsX2xlbik7CiAgICAgICAgICAgIGFwdHItPnZpZXdzW1ZBQ01fVklFV19OT1RJRlldW3Zhcl92YWxfbGVuXSA9IDA7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gRlJFRSkgewogICAgICAgIC8qCiAgICAgICAgICogVHJ5IHRvIHVuZG8gdGhlIFNFVCBoZXJlIChhYm5vcm1hbCB1c2FnZSBvZiBGUkVFIGNsYXVzZSkgIAogICAgICAgICAqLwogICAgICAgIGlmICgoYXB0ciA9IGFjY2Vzc19wYXJzZV9hY2Nlc3NFbnRyeShuYW1lLCBuYW1lX2xlbikpICE9IE5VTEwgJiYKICAgICAgICAgICAgcmVzZXRPbkZhaWwpIHsKICAgICAgICAgICAgbWVtY3B5KGFwdHItPnZpZXdzW1ZBQ01fVklFV19OT1RJRlldLCBzdHJpbmcsIHZhcl92YWxfbGVuKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CnZpZXdfcGFyc2Vfb2lkKG9pZCAqIG9pZEluZGV4LCBzaXplX3Qgb2lkTGVuLAogICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqdmlld05hbWUsIHNpemVfdCAqIHZpZXdOYW1lTGVuLAogICAgICAgICAgICAgICBvaWQgKiogc3VidHJlZSwgc2l6ZV90ICogc3VidHJlZUxlbikKewogICAgaW50ICAgICAgICAgICAgIHZpZXdOYW1lTCwgc3VidHJlZUwsIGk7CgogICAgLyoKICAgICAqIGZpcnN0IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgb2lkIAogICAgICovCiAgICBpZiAoKG9pZExlbiA8PSAwKSB8fCAoIW9pZEluZGV4KSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgfQogICAgdmlld05hbWVMID0gb2lkSW5kZXhbMF07CiAgICBzdWJ0cmVlTCA9IG9pZExlbiAtIHZpZXdOYW1lTCAtIDE7ICAvKiB0aGUgaW5pdGlhbCBuYW1lIGxlbmd0aCAqLwoKICAgIC8qCiAgICAgKiBpdHMgdmFsaWQsIG1hbGxvYyB0aGUgc3BhY2UgYW5kIHN0b3JlIHRoZSByZXN1bHRzIAogICAgICovCiAgICBpZiAodmlld05hbWUgPT0gTlVMTCB8fCBzdWJ0cmVlID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfUkVTT1VSQ0VVTkFWQUlMQUJMRTsKICAgIH0KCiAgICBpZiAoc3VidHJlZUwgPCAwKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PQ1JFQVRJT047CiAgICB9CgogICAgKnZpZXdOYW1lID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jKHZpZXdOYW1lTCArIDEpOwoKICAgIGlmICgqdmlld05hbWUgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9SRVNPVVJDRVVOQVZBSUxBQkxFOwogICAgfQoKICAgICpzdWJ0cmVlID0gKG9pZCAqKSBtYWxsb2Moc3VidHJlZUwgKiBzaXplb2Yob2lkKSk7CiAgICBpZiAoKnN1YnRyZWUgPT0gTlVMTCkgewogICAgICAgIGZyZWUoKnZpZXdOYW1lKTsKICAgICAgICByZXR1cm4gU05NUF9FUlJfUkVTT1VSQ0VVTkFWQUlMQUJMRTsKICAgIH0KCiAgICAqc3VidHJlZUxlbiA9IHN1YnRyZWVMOwogICAgKnZpZXdOYW1lTGVuID0gdmlld05hbWVMOwoKICAgIGZvciAoaSA9IDA7IGkgPCB2aWV3TmFtZUw7IGkrKykgewogICAgICAgIGlmIChvaWRJbmRleFtpICsgMV0gPiAyNTUpIHsKICAgICAgICAgICAgZnJlZSgqdmlld05hbWUpOwogICAgICAgICAgICBmcmVlKCpzdWJ0cmVlKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgfQogICAgICAgIHZpZXdOYW1lWzBdW2ldID0gKHVuc2lnbmVkIGNoYXIpIG9pZEluZGV4W2kgKyAxXTsKICAgIH0KICAgIHZpZXdOYW1lWzBdW3ZpZXdOYW1lTF0gPSAwOwoKICAgIGZvciAoaSA9IDA7IGkgPCBzdWJ0cmVlTDsgaSsrKSB7CiAgICAgICAgc3VidHJlZVswXVtpXSA9IChvaWQpIG9pZEluZGV4W2kgKyB2aWV3TmFtZUwgKyAxXTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKc3RydWN0IHZhY21fdmlld0VudHJ5ICoKdmlld19wYXJzZV92aWV3RW50cnkob2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKnZwdHI7CgogICAgY2hhciAgICAgICAgICAgKm5ld1ZpZXdOYW1lOwogICAgb2lkICAgICAgICAgICAgKm5ld1ZpZXdTdWJ0cmVlOwogICAgc2l6ZV90ICAgICAgICAgIHZpZXdOYW1lTGVuLCB2aWV3U3VidHJlZUxlbjsKCiAgICBpZiAodmlld19wYXJzZV9vaWQoJm5hbWVbVklFV19NSUJfTEVOR1RIXSwgbmFtZV9sZW4gLSBWSUVXX01JQl9MRU5HVEgsCiAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKikgJiBuZXdWaWV3TmFtZSwgJnZpZXdOYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgIChvaWQgKiopICYgbmV3Vmlld1N1YnRyZWUsICZ2aWV3U3VidHJlZUxlbikpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgdnB0ciA9CiAgICAgICAgdmFjbV9nZXRWaWV3RW50cnkobmV3Vmlld05hbWUsICZuZXdWaWV3U3VidHJlZVsxXSwgdmlld1N1YnRyZWVMZW4tMSwKICAgICAgICAgICAgICAgICAgICAgICAgICBWQUNNX01PREVfSUdOT1JFX01BU0spOwogICAgZnJlZShuZXdWaWV3TmFtZSk7CiAgICBmcmVlKG5ld1ZpZXdTdWJ0cmVlKTsKCiAgICByZXR1cm4gdnB0cjsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHZhY21fcGFyc2Vfdmlld0VudHJ5KCkgKi8KCmludAp3cml0ZV92YWNtVmlld1N0YXR1cyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKICAgIGNoYXIgICAgICAgICAgICpuZXdWaWV3TmFtZTsKICAgIG9pZCAgICAgICAgICAgICpuZXdWaWV3U3VidHJlZTsKICAgIHNpemVfdCAgICAgICAgICB2aWV3TmFtZUxlbiwgdmlld1N1YnRyZWVMZW47CiAgICBzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKnZwdHI7CiAgICBpbnQgICAgICAgICAgICAgcmMgPSAwOwoKICAgIGlmIChhY3Rpb24gPT0gUkVTRVJWRTEpIHsKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJfdmFsX2xlbiAhPSBzaXplb2YobG9uZ19yZXQpKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICB9CiAgICAgICAgbG9uZ19yZXQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGlmIChsb25nX3JldCA9PSBSU19OT1RSRUFEWSB8fCBsb25nX3JldCA8IDEgfHwgbG9uZ19yZXQgPiA2KSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBTZWUgaWYgd2UgY2FuIHBhcnNlIHRoZSBvaWQgZm9yIG1vZGVsL25hbWUgZmlyc3QuICAKICAgICAgICAgKi8KICAgICAgICBpZiAoKHJjID0KICAgICAgICAgICAgIHZpZXdfcGFyc2Vfb2lkKCZuYW1lW1ZJRVdfTUlCX0xFTkdUSF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiAtIFZJRVdfTUlCX0xFTkdUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKiopICYgbmV3Vmlld05hbWUsICZ2aWV3TmFtZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvaWQgKiopICYgbmV3Vmlld1N1YnRyZWUsICZ2aWV3U3VidHJlZUxlbikpKSB7CiAgICAgICAgICAgIHJldHVybiByYzsKICAgICAgICB9CgogICAgICAgIGlmICh2aWV3TmFtZUxlbiA8IDEgfHwgdmlld05hbWVMZW4gPiAzMikgewogICAgICAgICAgICBmcmVlKG5ld1ZpZXdOYW1lKTsKICAgICAgICAgICAgZnJlZShuZXdWaWV3U3VidHJlZSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0NSRUFUSU9OOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBOb3cgc2VlIGlmIGEgZ3JvdXAgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGVzZSBpbmRleCB2YWx1ZXMuICAKICAgICAgICAgKi8KICAgICAgICB2cHRyID0KICAgICAgICAgICAgdmFjbV9nZXRWaWV3RW50cnkobmV3Vmlld05hbWUsICZuZXdWaWV3U3VidHJlZVsxXSwgdmlld1N1YnRyZWVMZW4tMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFDTV9NT0RFX0lHTk9SRV9NQVNLKTsKICAgICAgICBpZiAodnB0ciAmJgogICAgICAgICAgICBuZXRzbm1wX29pZF9lcXVhbHModnB0ci0+dmlld1N1YnRyZWUgKyAxLCB2cHRyLT52aWV3U3VidHJlZUxlbiAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3U3VidHJlZSArIDEsIHZpZXdTdWJ0cmVlTGVuIC0gMSkgIT0gMCkgewogICAgICAgICAgICB2cHRyID0gTlVMTDsKICAgICAgICB9CiAgICAgICAgaWYgKHZwdHIgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5ER08gfHwgbG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5EV0FJVCkgewogICAgICAgICAgICAgICAgZnJlZShuZXdWaWV3TmFtZSk7CiAgICAgICAgICAgICAgICBmcmVlKG5ld1ZpZXdTdWJ0cmVlKTsKICAgICAgICAgICAgICAgIGxvbmdfcmV0ID0gUlNfTk9UUkVBRFk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0RFU1RST1kgJiYgdnB0ci0+dmlld1N0b3JhZ2VUeXBlID09IFNUX1BFUk1BTkVOVCkgewogICAgICAgICAgICAgICAgZnJlZShuZXdWaWV3TmFtZSk7CiAgICAgICAgICAgICAgICBmcmVlKG5ld1ZpZXdTdWJ0cmVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0FDVElWRSB8fCBsb25nX3JldCA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKICAgICAgICAgICAgICAgIGZyZWUobmV3Vmlld05hbWUpOwogICAgICAgICAgICAgICAgZnJlZShuZXdWaWV3U3VidHJlZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0NSRUFURUFOREdPIHx8IGxvbmdfcmV0ID09IFJTX0NSRUFURUFORFdBSVQpIHsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogR2VuZXJhdGUgYSBuZXcgZ3JvdXAgZW50cnkuICAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKCh2cHRyID0KICAgICAgICAgICAgICAgICAgICAgdmFjbV9jcmVhdGVWaWV3RW50cnkobmV3Vmlld05hbWUsICZuZXdWaWV3U3VidHJlZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1N1YnRyZWVMZW4gLSAxKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGZyZWUobmV3Vmlld05hbWUpOwogICAgICAgICAgICAgICAgICAgIGZyZWUobmV3Vmlld1N1YnRyZWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFNldCBkZWZhdWx0cy4gIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB2cHRyLT52aWV3U3RvcmFnZVR5cGUgPSBTVF9OT05WT0xBVElMRTsKICAgICAgICAgICAgICAgIHZwdHItPnZpZXdTdGF0dXMgPSBSU19OT1RSRUFEWTsKICAgICAgICAgICAgICAgIHZwdHItPnZpZXdUeXBlID0gU05NUF9WSUVXX0lOQ0xVREVEOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUobmV3Vmlld05hbWUpOwogICAgICAgIGZyZWUobmV3Vmlld1N1YnRyZWUpOwogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gQUNUSU9OKSB7CiAgICAgICAgdmlld19wYXJzZV9vaWQoJm5hbWVbVklFV19NSUJfTEVOR1RIXSwgbmFtZV9sZW4gLSBWSUVXX01JQl9MRU5HVEgsCiAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKikgJiBuZXdWaWV3TmFtZSwgJnZpZXdOYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgIChvaWQgKiopICYgbmV3Vmlld1N1YnRyZWUsICZ2aWV3U3VidHJlZUxlbik7CgogICAgICAgIHZwdHIgPQogICAgICAgICAgICB2YWNtX2dldFZpZXdFbnRyeShuZXdWaWV3TmFtZSwgJm5ld1ZpZXdTdWJ0cmVlWzFdLCB2aWV3U3VidHJlZUxlbi0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUNNX01PREVfSUdOT1JFX01BU0spOwoKICAgICAgICBpZiAodnB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChsb25nX3JldCA9PSBSU19DUkVBVEVBTkRHTyB8fCBsb25nX3JldCA9PSBSU19BQ1RJVkUpIHsKICAgICAgICAgICAgICAgIHZwdHItPnZpZXdTdGF0dXMgPSBSU19BQ1RJVkU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobG9uZ19yZXQgPT0gUlNfQ1JFQVRFQU5EV0FJVCkgewogICAgICAgICAgICAgICAgdnB0ci0+dmlld1N0YXR1cyA9IFJTX05PVElOU0VSVklDRTsKICAgICAgICAgICAgfSBlbHNlIGlmIChsb25nX3JldCA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKICAgICAgICAgICAgICAgIGlmICh2cHRyLT52aWV3U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgICAgICAgICAgICAgIHZwdHItPnZpZXdTdGF0dXMgPSBSU19OT1RJTlNFUlZJQ0U7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZwdHItPnZpZXdTdGF0dXMgPT0gUlNfTk9UUkVBRFkpIHsKICAgICAgICAgICAgICAgICAgICBmcmVlKG5ld1ZpZXdOYW1lKTsKICAgICAgICAgICAgICAgICAgICBmcmVlKG5ld1ZpZXdTdWJ0cmVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnJlZShuZXdWaWV3TmFtZSk7CiAgICAgICAgZnJlZShuZXdWaWV3U3VidHJlZSk7CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBDT01NSVQpIHsKICAgICAgICB2aWV3X3BhcnNlX29pZCgmbmFtZVtWSUVXX01JQl9MRU5HVEhdLCBuYW1lX2xlbiAtIFZJRVdfTUlCX0xFTkdUSCwKICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICoqKSAmIG5ld1ZpZXdOYW1lLCAmdmlld05hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgKG9pZCAqKikgJiBuZXdWaWV3U3VidHJlZSwgJnZpZXdTdWJ0cmVlTGVuKTsKCiAgICAgICAgdnB0ciA9CiAgICAgICAgICAgIHZhY21fZ2V0Vmlld0VudHJ5KG5ld1ZpZXdOYW1lLCAmbmV3Vmlld1N1YnRyZWVbMV0sIHZpZXdTdWJ0cmVlTGVuLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQ01fTU9ERV9JR05PUkVfTUFTSyk7CgogICAgICAgIGlmICh2cHRyICE9IE5VTEwpIHsKICAgICAgICAgICAgaWYgKGxvbmdfcmV0ID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHZhY21fZGVzdHJveVZpZXdFbnRyeShuZXdWaWV3TmFtZSwgbmV3Vmlld1N1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1N1YnRyZWVMZW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUobmV3Vmlld05hbWUpOwogICAgICAgIGZyZWUobmV3Vmlld1N1YnRyZWUpOwogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gVU5ETykgewogICAgICAgIGlmIChsb25nX3JldCA9PSBSU19DUkVBVEVBTkRHTyB8fCBsb25nX3JldCA9PSBSU19DUkVBVEVBTkRXQUlUKSB7CiAgICAgICAgICAgIHZpZXdfcGFyc2Vfb2lkKCZuYW1lW1ZJRVdfTUlCX0xFTkdUSF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfbGVuIC0gVklFV19NSUJfTEVOR1RILAogICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICoqKSAmIG5ld1ZpZXdOYW1lLCAmdmlld05hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChvaWQgKiopICYgbmV3Vmlld1N1YnRyZWUsICZ2aWV3U3VidHJlZUxlbik7CgogICAgICAgICAgICB2cHRyID0gdmFjbV9nZXRWaWV3RW50cnkobmV3Vmlld05hbWUsICZuZXdWaWV3U3VidHJlZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdTdWJ0cmVlTGVuLTEsIFZBQ01fTU9ERV9JR05PUkVfTUFTSyk7CgogICAgICAgICAgICBpZiAodnB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICB2YWNtX2Rlc3Ryb3lWaWV3RW50cnkobmV3Vmlld05hbWUsIG5ld1ZpZXdTdWJ0cmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdTdWJ0cmVlTGVuKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKG5ld1ZpZXdOYW1lKTsKICAgICAgICAgICAgZnJlZShuZXdWaWV3U3VidHJlZSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdmFjbVZpZXdTdG9yYWdlVHlwZShpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgbG9uZyAgICAgICAgICAgIG5ld1ZhbHVlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgIHN0YXRpYyBsb25nICAgICBvbGRWYWx1ZTsKICAgIHN0cnVjdCB2YWNtX3ZpZXdFbnRyeSAqdnB0ciA9IE5VTEw7CgogICAgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMSkgewogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhcl92YWxfbGVuICE9IHNpemVvZihsb25nKSkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gUkVTRVJWRTIpIHsKICAgICAgICBpZiAoKHZwdHIgPSB2aWV3X3BhcnNlX3ZpZXdFbnRyeShuYW1lLCBuYW1lX2xlbikpID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKChuZXdWYWx1ZSA9PSBTVF9WT0xBVElMRSB8fCBuZXdWYWx1ZSA9PSBTVF9OT05WT0xBVElMRSkgJiYKICAgICAgICAgICAgICAgICh2cHRyLT52aWV3U3RvcmFnZVR5cGUgPT0gU1RfVk9MQVRJTEUgfHwKICAgICAgICAgICAgICAgICB2cHRyLT52aWV3U3RvcmFnZVR5cGUgPT0gU1RfTk9OVk9MQVRJTEUpKSB7CiAgICAgICAgICAgICAgICBvbGRWYWx1ZSA9IHZwdHItPnZpZXdTdG9yYWdlVHlwZTsKICAgICAgICAgICAgICAgIHZwdHItPnZpZXdTdG9yYWdlVHlwZSA9IG5ld1ZhbHVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID09IHZwdHItPnZpZXdTdG9yYWdlVHlwZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBVTkRPKSB7CiAgICAgICAgaWYgKCh2cHRyID0gdmlld19wYXJzZV92aWV3RW50cnkobmFtZSwgbmFtZV9sZW4pKSAhPSBOVUxMKSB7CiAgICAgICAgICAgIHZwdHItPnZpZXdTdG9yYWdlVHlwZSA9IG9sZFZhbHVlOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3ZhY21WaWV3TWFzayhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBzdHJpbmdbVkFDTVNUUklOR0xFTl07CiAgICBzdGF0aWMgbG9uZyAgICAgbGVuZ3RoOwogICAgc3RydWN0IHZhY21fdmlld0VudHJ5ICp2cHRyID0gTlVMTDsKCiAgICBpZiAoYWN0aW9uID09IFJFU0VSVkUxKSB7CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJfdmFsX2xlbiA+IDE2KSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMikgewogICAgICAgIGlmICgodnB0ciA9IHZpZXdfcGFyc2Vfdmlld0VudHJ5KG5hbWUsIG5hbWVfbGVuKSkgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZW1jcHkoc3RyaW5nLCB2cHRyLT52aWV3TWFzaywgdnB0ci0+dmlld01hc2tMZW4pOwogICAgICAgICAgICBsZW5ndGggPSB2cHRyLT52aWV3TWFza0xlbjsKICAgICAgICAgICAgbWVtY3B5KHZwdHItPnZpZXdNYXNrLCB2YXJfdmFsLCB2YXJfdmFsX2xlbik7CiAgICAgICAgICAgIHZwdHItPnZpZXdNYXNrTGVuID0gdmFyX3ZhbF9sZW47CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gRlJFRSkgewogICAgICAgIGlmICgodnB0ciA9IHZpZXdfcGFyc2Vfdmlld0VudHJ5KG5hbWUsIG5hbWVfbGVuKSkgIT0gTlVMTCkgewogICAgICAgICAgICBtZW1jcHkodnB0ci0+dmlld01hc2ssIHN0cmluZywgbGVuZ3RoKTsKICAgICAgICAgICAgdnB0ci0+dmlld01hc2tMZW4gPSBsZW5ndGg7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV92YWNtVmlld1R5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgbG9uZyAgICAgICAgICAgIG5ld1ZhbHVlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgIHN0YXRpYyBsb25nICAgICBvbGRWYWx1ZTsKICAgIHN0cnVjdCB2YWNtX3ZpZXdFbnRyeSAqdnB0ciA9IE5VTEw7CgogICAgaWYgKGFjdGlvbiA9PSBSRVNFUlZFMSkgewogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhcl92YWxfbGVuICE9IHNpemVvZihsb25nKSkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQogICAgICAgIGlmIChuZXdWYWx1ZSA8IDEgfHwgbmV3VmFsdWUgPiAyKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFJFU0VSVkUyKSB7CiAgICAgICAgaWYgKCh2cHRyID0gdmlld19wYXJzZV92aWV3RW50cnkobmFtZSwgbmFtZV9sZW4pKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9sZFZhbHVlID0gdnB0ci0+dmlld1R5cGU7CiAgICAgICAgICAgIHZwdHItPnZpZXdUeXBlID0gbmV3VmFsdWU7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gVU5ETykgewogICAgICAgIGlmICgodnB0ciA9IHZpZXdfcGFyc2Vfdmlld0VudHJ5KG5hbWUsIG5hbWVfbGVuKSkgIT0gTlVMTCkgewogICAgICAgICAgICB2cHRyLT52aWV3VHlwZSA9IG9sZFZhbHVlOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3ZhY21WaWV3U3BpbkxvY2soaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKCiAgICBpZiAoYWN0aW9uID09IFJFU0VSVkUxKSB7CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdmFjbV92YXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHZhY21WaWV3U3BpbkxvY2sgbm90IEFTTl9JTlRFR0VSXG4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJfdmFsX2xlbiAhPSBzaXplb2YobG9uZ19yZXQpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YWNtX3ZhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdmFjbVZpZXdTcGluTG9jazogYmFkIGxlbmd0aFxuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQogICAgICAgIGxvbmdfcmV0ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBpZiAobG9uZ19yZXQgIT0gKGxvbmcpIHZhY21WaWV3U3BpbkxvY2spIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IENPTU1JVCkgewogICAgICAgIGlmICh2YWNtVmlld1NwaW5Mb2NrID09IDIxNDc0ODM2NDcpIHsKICAgICAgICAgICAgdmFjbVZpZXdTcGluTG9jayA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFjbVZpZXdTcGluTG9jaysrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CiNlbmRpZiAvKiAhTkVUU05NUF9OT19XUklURV9TVVBQT1JUICovIAo=