ZGlmZiAtLWdpdCBhL3NyYy93aW5kb3dzL1RPRE8gYi9zcmMvd2luZG93cy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOGVjMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvd2luZG93cy9UT0RPCkBAIC0wLDAgKzEsODYgQEAKKyogR2V0IGhlYXAtcHJvZmlsZS10YWJsZS5jYyB1c2luZyBEZWxldGVNYXRjaGluZ0ZpbGVzCisqIEdldCBoZWFwLXByb2ZpbGUtdGFibGUuY2MgdXNpbmcgRmlsbFByb2NTZWxmTWFwcywgRHVtcFByb2NTZWxmTWFwcworKiBQbGF5IGFyb3VuZCB3aXRoIEV4cGVyaW1lbnRhbEdldFN0YWNrVHJhY2UKKyogU3VwcG9ydCB0aGUgd2luZG93cy1sZXZlbCBtZW1vcnktYWxsb2NhdGlvbiBmdW5jdGlvbnM/ICBTZWUKKyAgICAvaG9tZS9idWlsZC9nb29nbGVjbGllbnQvZWFydGgvY2xpZW50L3Rvb2xzL21lbW9yeXRyYWNraW5nL2NsaWVudC9tZW1vcnl0cmFjZS9zcmMvbWVtb3J5dHJhY2UuY3BwCisgICAgL2hvbWUvYnVpbGQvZ29vZ2xlY2xpZW50L3RvdGFsX3JlY2FsbC9jb21tb24vc2l0ZXN0ZXAvKgorICAgIGh0dHA6Ly93d3cuaW50ZXJuYWxzLmNvbS9hcnRpY2xlcy9hcGlzcHkvYXBpc3B5Lmh0bQorICAgIGh0dHA6Ly93d3cud2hlYXR5Lm5ldC9BUElTUFkzMi56aXAKKyogVmVyaWZ5IC9wcm9jL3h4eC9tYXBzOgorICAgIGh0dHA6Ly93d3cuZ2VvY2l0aWVzLmNvbS93YWhfamF2YV9kb3RuZXQvcHJvY21hcC9pbmRleC5odG1sCisqIEZpZ3VyZSBvdXQgaG93IHRvIGVkaXQgdGhlIGV4ZWN1dGFibGUgSUFUIHNvIHRjbWFsbG9jLmRsbCBpcyBsb2FkZWQgZmlyc3QKKyogVXNlIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyIGluc3RlYWQgb2YgR2V0VGlja0NvdW50KCkgKGFsc28gZm9yIHNwYXJzZWhhc2gpCisKKy0tLS0KK01vcmUgaW5mbyBvbiB3aW5kb3dzLWxldmVsIG1lbW9yeS1hbGxvY2F0aW9uIGZ1bmN0aW9uczoKKyAgIEMgcnVudGltZSBtYWxsb2MKKyAgIExvY2FsQWxsb2MKKyAgIEdsb2JhbEFsbG9jCisgICBIZWFwQWxsb2MKKyAgIFZpcnR1YWxBbGxvYworICAgbW1hcCBzdHVmZgorCittYWxsb2MsIExvY2FsQWxsb2MgYW5kIEdsb2JhbEFsbG9jIGNhbGwgSGVhcEFsbG9jLCB3aGljaCBjYWxscworVmlydHVhbEFsbG9jIHdoZW4gbmVlZGVkLCB3aGljaCBjYWxscyBWaXJ0dWFsQWxsb2NFeCAodGhlIF9fc2JyayBlcXVpdj8pCisKK3NpZ2dpIHNlejogSWYgeW91IHdhbnQgdG8gZG8gYSBnZW5lcmljIGpvYiwgeW91IHByb2JhYmx5IG5lZWQgdG8KK3ByZXNlcnZlIHRoZSBzZW1hbnRpY3Mgb2YgYWxsIG9mIHRoZXNlIFdpbjMyIGNhbGxzOgorICAgSGVhcDMyRmlyc3QKKyAgIEhlYXAzMkxpc3RGaXJzdAorICAgSGVhcDMyTGlzdE5leHQKKyAgIEhlYXAzMk5leHQKKyAgIEhlYXBBbGxvYworICAgSGVhcENvbXBhY3QKKyAgIEhlYXBDcmVhdGUKKyAgIEhlYXBDcmVhdGVUYWdzVworICAgSGVhcERlc3Ryb3kKKyAgIEhlYXBFeHRlbmQKKyAgIEhlYXBGcmVlCisgICBIZWFwTG9jaworICAgSGVhcFF1ZXJ5SW5mb3JtYXRpb24KKyAgIEhlYXBRdWVyeVRhZ1cKKyAgIEhlYXBSZUFsbG9jCisgICBIZWFwU2V0SW5mb3JtYXRpb24KKyAgIEhlYXBTaXplCisgICBIZWFwU3VtbWFyeQorICAgSGVhcFVubG9jaworICAgSGVhcFVzYWdlCisgICBIZWFwVmFsaWRhdGUKKyAgIEhlYXBXYWxrCisKK2tlcm5lbDMyLmRsbCBleHBvcnQgZnVuY3Rpb25zIGFuZCBudC5kbGwgZXhwb3J0IGZ1bmN0aW9uczoKKyAgIGh0dHA6Ly93d3cuc2hvcnRoaWtlLmNvbS9zdm4vdHJ1bmsvdG9vbHNfd2luMzIvZG0vbGliL2tlcm5lbDMyLmRlZgorICAgaHR0cDovL3VuZG9jdW1lbnRlZC5udGludGVybmFscy5uZXQvCisKK1lvdSBjYW4gZWRpdCB0aGUgZXhlY3V0YWJsZSBJQVQgdG8gaGF2ZSB0aGUgcGF0Y2hpbmcgRExMIGJlIHRoZQorZmlyc3Qgb25lIGxvYWRlZC4KKworTW9zdCBjb21wbGV0ZSB3YXkgdG8gaW50ZXJjZXB0IHN5c3RlbSBjYWxscyBpcyBwYXRjaCB0aGUgZnVuY3Rpb25zCisobm90IHRoZSBJQVQpLgorCitNaWNyb3NvZnQgaGFzIHNvbWVlIGJ1aWx0LWluIHJvdXRpbmVzIGZvciBoZWFwLWNoZWNraW5nOgorICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8yNjgzNDMKKworLS0tLQorSXRpbWVyIHJlcGxhY2VtZW50OgorICAgaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczcxMjcxMy5hc3B4CisKKy0tLS0KK0NoYW5nZXMgSSd2ZSBoYWQgdG8gbWFrZSB0byB0aGUgcHJvamVjdCBmaWxlOgorCiswKSBXaGVuIGNyZWF0aW5nIHRoZSBwcm9qZWN0IGZpbGUsIGNsaWNrIG9uICJubyBhdXRvZ2VuZXJhdGVkIGZpbGVzIgorCistLS0gRm9yIGVhY2ggcHJvamVjdDoKKzEpIEFsdC1GNyAtPiBHZW5lcmFsIC0+IFtwdWxsZG93biAiYWxsIGNvbmZpZ3VyYXRpb25zIiBdIC0+IE91dHB1dCBEaXJlY3RvcnkgLT4gJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKQorMikgQWx0LUY3IC0+IEdlbmVyYWwgLT4gW3B1bGxkb3duICJhbGwgY29uZmlndXJhdGlvbnMiIF0gLT4gSW50ZXJtZWRpYXRlIERpcmVjdG9yeSAtPiAkKENvbmZpZ3VyYXRpb25OYW1lKQorCistLS0gRm9yIGVhY2ggLmNjIGZpbGU6CisxKSBBbHQtRjcgLT4gQy9DKysgLT4gR2VuZXJhbCAtPiBbcHVsbGRvd24gImFsbCBjb25maWd1cmF0aW9ucyJdIC0+IEFkZGl0aW9uYWwgSW5jbHVkZSBEaXJlY3RpdmVzIC0tPiBzcmMvd2luZG93cyArIHNyYy8KKzIpIEFsdC1GNyAtPiBDL0MrKyAtPiBDb2RlIEdlbmVyYXRpb24gLT4gUnVudGltZSBMaWJyYXJ5IC0+IE11bHRpLXRocmVhZGVkLCBkZWJ1Zy9yZWxlYXNlLCBETEwgb3Igbm90CisKKy0tLSBGb3IgRExMOgorMykgQWx0LUY3IC0+IExpbmtlciAtPiBJbnB1dCAtPiBbcHVsbGRvd24gImFsbCBjb25maWd1cmF0aW9ucyIgXSAtPiBNb2R1bGUgRGVmaW5pdGlvbiBGaWxlIC0+IHNyY1x3aW5kb3dzXHZjN2FuZDguZGVmCistLS0gRm9yIGJpbmFyaWVzIGRlcGVuZGluZyBvbiBhIERMTDoKKzMpIFJpZ2h0LWNsaWNrIG9uIHByb2plY3QgLT4gUHJvamVjdCBEZXBlbmRlbmNpZXMgLT4gW2FkZCBkbGxdCistLS0gRm9yIHN0YXRpYyBiaW5hcmllcyAobm90IGRlcGVuZGluZyBvbiBhIERMTCkKKzMpIEFsdC1GNyAtPiBDL0MrKyAtPiBDb21tYW5kIExpbmUgLT4gW3B1bGxkb3duICJhbGwgY29uZmlndXJhdGlvbnMiXSAtPiAvRCBQRVJGVE9PTFNfRExMX0RFQ0w9CmRpZmYgLS1naXQgYS9zcmMvd2luZG93cy9hZGRyMmxpbmUtcGRiLmMgYi9zcmMvd2luZG93cy9hZGRyMmxpbmUtcGRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2NWEwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93aW5kb3dzL2FkZHIybGluZS1wZGIuYwpAQCAtMCwwICsxLDE2MyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDA4LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAtLS0KKyAqIEF1dGhvcjogRGF2aWQgVml0ZWsKKyAqCisgKiBEdW1wIGZ1bmN0aW9uIGFkZHJlc3NlcyB1c2luZyBNaWNyb3NvZnQgZGVidWcgc3ltYm9scy4gIFRoaXMgd29ya3MKKyAqIG9uIFBEQiBmaWxlcy4gIE5vdGUgdGhhdCB0aGlzIHByb2dyYW0gd2lsbCBkb3dubG9hZCBzeW1ib2xzIHRvCisgKiBjOlx3ZWJzeW1ib2xzIHdpdGhvdXQgYXNraW5nLgorICovCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUworI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8ZGJnaGVscC5oPgorCisjZGVmaW5lIFNFQVJDSF9DQVAgKDEwMjQqMTAyNCkKKyNkZWZpbmUgV0VCU1lNICJTUlYqYzpcXHdlYnN5bWJvbHMqaHR0cDovL21zZGwubWljcm9zb2Z0LmNvbS9kb3dubG9hZC9zeW1ib2xzIgorCit2b2lkIHVzYWdlKCkgeworICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAiCisgICAgICAgICAgImFkZHIybGluZS1wZGIgWy1mfC0tZnVuY3Rpb25zXSBbLUN8LS1kZW1hbmdsZV0gWy1lIGZpbGVuYW1lXVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiKFRoZW4gbGlzdCB0aGUgaGV4IGFkZHJlc3NlcyBvbiBzdGRpbiwgb25lIHBlciBsaW5lKVxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgRFdPUkQgIGVycm9yOworICBIQU5ETEUgcHJvY2VzczsKKyAgVUxPTkc2NCBtb2R1bGVfYmFzZTsKKyAgaW50IGk7CisgIGNoYXIqIHNlYXJjaDsKKyAgY2hhciBidWZbMjU2XTsgICAvKiBFbm91Z2ggdG8gaG9sZCBvbmUgaGV4IGFkZHJlc3MsIEkgdHJ1c3QhICovCisgIGludCBydiA9IDA7CisgIC8qIFdlIG1heSBhZGQgU1lNT1BUX1VORE5BTUUgaWYgLS1kZW1hbmdsZSBpcyBzcGVjaWZpZWQ6ICovCisgIERXT1JEIHN5bW9wdHMgPSBTWU1PUFRfREVGRVJSRURfTE9BRFMgfCBTWU1PUFRfREVCVUcgfCBTWU1PUFRfTE9BRF9MSU5FUzsKKyAgY2hhciogZmlsZW5hbWUgPSAiYS5vdXQiOyAgICAgICAgIC8qIFRoZSBkZWZhdWx0IGlmIC1lIGlzbid0IHNwZWNpZmllZCAqLworICBpbnQgcHJpbnRfZnVuY3Rpb25fbmFtZSA9IDA7ICAgICAgLyogU2V0IHRvIDEgaWYgLWYgaXMgc3BlY2lmaWVkICovCisKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi0tZnVuY3Rpb25zIikgPT0gMCB8fCBzdHJjbXAoYXJndltpXSwgIi1mIikgPT0gMCkgeworICAgICAgcHJpbnRfZnVuY3Rpb25fbmFtZSA9IDE7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi0tZGVtYW5nbGUiKSA9PSAwIHx8CisgICAgICAgICAgICAgICBzdHJjbXAoYXJndltpXSwgIi1DIikgPT0gMCkgeworICAgICAgc3ltb3B0cyB8PSBTWU1PUFRfVU5ETkFNRTsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWUiKSA9PSAwKSB7CisgICAgICBpZiAoaSArIDEgPj0gYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZBVEFMIEVSUk9SOiAtZSBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgZmlsZW5hbWVcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGZpbGVuYW1lID0gYXJndltpKzFdOworICAgICAgaSsrOyAgICAgLyogdG8gc2tpcCBvdmVyIGZpbGVuYW1lIHRvbyAqLworICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItLWhlbHAiKSA9PSAwKSB7CisgICAgICB1c2FnZSgpOworICAgICAgZXhpdCgwKTsKKyAgICB9IGVsc2UgeworICAgICAgdXNhZ2UoKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICB9CisKKyAgcHJvY2VzcyA9IEdldEN1cnJlbnRQcm9jZXNzKCk7CisKKyAgaWYgKCFTeW1Jbml0aWFsaXplKHByb2Nlc3MsIE5VTEwsIEZBTFNFKSkgeworICAgIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgZnByaW50ZihzdGRlcnIsICJTeW1Jbml0aWFsaXplIHJldHVybmVkIGVycm9yIDogJWRcbiIsIGVycm9yKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHNlYXJjaCA9IG1hbGxvYyhTRUFSQ0hfQ0FQKTsKKyAgaWYgKFN5bUdldFNlYXJjaFBhdGgocHJvY2Vzcywgc2VhcmNoLCBTRUFSQ0hfQ0FQKSkgeworICAgIGlmIChzdHJsZW4oc2VhcmNoKSArIHNpemVvZigiOyIgV0VCU1lNKSA+IFNFQVJDSF9DQVApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiU2VhcmNoIHBhdGggdG9vIGxvbmdcbiIpOworICAgICAgU3ltQ2xlYW51cChwcm9jZXNzKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBzdHJjYXQoc2VhcmNoLCAiOyIgV0VCU1lNKTsKKyAgfSBlbHNlIHsKKyAgICBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIGZwcmludGYoc3RkZXJyLCAiU3ltR2V0U2VhcmNoUGF0aCByZXR1cm5lZCBlcnJvciA6ICVkXG4iLCBlcnJvcik7CisgICAgcnYgPSAxOyAgICAgICAgICAgICAgICAgICAvKiBBbiBlcnJvciwgYnV0IG5vdCBhIGZhdGFsIG9uZSAqLworICAgIHN0cmNweShzZWFyY2gsIFdFQlNZTSk7ICAgLyogVXNlIGEgZGVmYXVsdCB2YWx1ZSAqLworICB9CisgIGlmICghU3ltU2V0U2VhcmNoUGF0aChwcm9jZXNzLCBzZWFyY2gpKSB7CisgICAgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlN5bVNldFNlYXJjaFBhdGggcmV0dXJuZWQgZXJyb3IgOiAlZFxuIiwgZXJyb3IpOworICAgIHJ2ID0gMTsgICAgICAgICAgICAgICAgICAgLyogQW4gZXJyb3IsIGJ1dCBub3QgYSBmYXRhbCBvbmUgKi8KKyAgfQorCisgIFN5bVNldE9wdGlvbnMoc3ltb3B0cyk7CisgIG1vZHVsZV9iYXNlID0gU3ltTG9hZE1vZHVsZUV4KHByb2Nlc3MsIE5VTEwsIGZpbGVuYW1lLCBOVUxMLCAwLCAwLCBOVUxMLCAwKTsKKyAgaWYgKCFtb2R1bGVfYmFzZSkgeworICAgIC8qIFN5bUxvYWRNb2R1bGVFeCBmYWlsZWQgKi8KKyAgICBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIGZwcmludGYoc3RkZXJyLCAiU3ltTG9hZE1vZHVsZUV4IHJldHVybmVkIGVycm9yIDogJWQgZm9yICVzXG4iLAorICAgICAgICAgICAgZXJyb3IsIGZpbGVuYW1lKTsKKyAgICBTeW1DbGVhbnVwKHByb2Nlc3MpOworICAgIHJldHVybiAxOworICB9CisKKyAgYnVmW3NpemVvZihidWYpLTFdID0gJ1wwJzsgIC8qIEp1c3QgdG8gYmUgc2FmZSAqLworICB3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKS0xLCBzdGRpbikpIHsKKyAgICAvKiBHTlUgYWRkcjJsaW5lIHNlZW1zIHRvIGp1c3QgZG8gYSBzdHJ0b2wgYW5kIGlnbm9yZSBhbnkKKyAgICAgKiB3ZWlyZCBjaGFyYWN0ZXJzIGl0IGdldHMsIHNvIHdlIHdpbGwgdG9vLgorICAgICAqLworICAgIHVuc2lnbmVkIF9faW50NjQgYWRkciA9IF9zdHJ0b3VpNjQoYnVmLCBOVUxMLCAxNik7CisgICAgVUxPTkc2NCBidWZmZXJbKHNpemVvZihTWU1CT0xfSU5GTykgKworICAgICAgICAgICAgICAgICAgICBNQVhfU1lNX05BTUUqc2l6ZW9mKFRDSEFSKSArCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihVTE9ORzY0KSAtIDEpCisgICAgICAgICAgICAgICAgICAgLyBzaXplb2YoVUxPTkc2NCldOworICAgIFBTWU1CT0xfSU5GTyBwU3ltYm9sID0gKFBTWU1CT0xfSU5GTylidWZmZXI7CisgICAgSU1BR0VITFBfTElORTY0IGxpbmU7CisgICAgRFdPUkQgZHVtbXk7CisgICAgcFN5bWJvbC0+U2l6ZU9mU3RydWN0ID0gc2l6ZW9mKFNZTUJPTF9JTkZPKTsKKyAgICBwU3ltYm9sLT5NYXhOYW1lTGVuID0gTUFYX1NZTV9OQU1FOworICAgIGlmIChwcmludF9mdW5jdGlvbl9uYW1lKSB7CisgICAgICBpZiAoU3ltRnJvbUFkZHIocHJvY2VzcywgKERXT1JENjQpYWRkciwgTlVMTCwgcFN5bWJvbCkpIHsKKyAgICAgICAgcHJpbnRmKCIlc1xuIiwgcFN5bWJvbC0+TmFtZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIj8/XG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGluZS5TaXplT2ZTdHJ1Y3QgPSBzaXplb2YoSU1BR0VITFBfTElORTY0KTsKKyAgICBpZiAoU3ltR2V0TGluZUZyb21BZGRyNjQocHJvY2VzcywgKERXT1JENjQpYWRkciwgJmR1bW15LCAmbGluZSkpIHsKKyAgICAgIHByaW50ZigiJXM6JWRcbiIsIGxpbmUuRmlsZU5hbWUsIChpbnQpbGluZS5MaW5lTnVtYmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCI/PzowXG4iKTsKKyAgICB9CisgIH0KKyAgU3ltVW5sb2FkTW9kdWxlNjQocHJvY2VzcywgbW9kdWxlX2Jhc2UpOworICBTeW1DbGVhbnVwKHByb2Nlc3MpOworICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9zcmMvd2luZG93cy9hdXRvX3Rlc3RpbmdfaG9vay5oIGIvc3JjL3dpbmRvd3MvYXV0b190ZXN0aW5nX2hvb2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzJiNzEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3MvYXV0b190ZXN0aW5nX2hvb2suaApAQCAtMCwwICsxLDE1NiBAQAorLy8gLSotIE1vZGU6IEMrKzsgYy1iYXNpYy1vZmZzZXQ6IDI7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyBVdGlsaXR5IGZvciB1c2luZyBTaWRlU3RlcCB3aXRoIHVuaXQgdGVzdHMuCisKKyNpZm5kZWYgQ0VFRV9URVNUSU5HX1NJREVTVEVQX0FVVE9fVEVTVElOR19IT09LX0hfCisjZGVmaW5lIENFRUVfVEVTVElOR19TSURFU1RFUF9BVVRPX1RFU1RJTkdfSE9PS19IXworCisjaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAicHJlYW1ibGVfcGF0Y2hlci5oIgorCisjZGVmaW5lIFNJREVTVEVQX0NISyh4KSAgQ0hFQ0soeCkKKyNkZWZpbmUgU0lERVNURVBfRVhQRUNUX1RSVUUoeCkgIFNJREVTVEVQX0NISyh4KQorCituYW1lc3BhY2Ugc2lkZXN0ZXAgeworCisvLyBTYW1lIHRyaWNrIGFzIGNvbW1vbi9zY29wZV9jbGVhbnVwLmggU2NvcGVHdWFyZEltcGxCYXNlCitjbGFzcyBBdXRvVGVzdGluZ0hvb2tCYXNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkF1dG9UZXN0aW5nSG9va0Jhc2UoKSB7fQorfTsKKworLy8gVGhpcyBpcyB0aGUgdHlwZWRlZiB5b3Ugbm9ybWFsbHkgdXNlIGZvciB0aGUgY2xhc3MsIGUuZy4KKy8vCisvLyBBdXRvVGVzdGluZ0hvb2sgaG9vayA9IE1ha2VUZXN0aW5nSG9vayhUYXJnZXRGdW5jLCBIb29rVGFyZ2V0RnVuYyk7CisvLworLy8gVGhlICdob29rJyB2YXJpYWJsZSB3aWxsIHRoZW4gYmUgZGVzdHJveWVkIHdoZW4gaXQgZ29lcyBvdXQgb2Ygc2NvcGUuCisvLworLy8gTk9URTogWW91IG11c3Qgbm90IGhvbGQgdGhpcyB0eXBlIGFzIGEgbWVtYmVyIG9mIGFub3RoZXIgY2xhc3MuICBJdHMKKy8vIGRlc3RydWN0b3Igd2lsbCBub3QgZ2V0IGNhbGxlZC4KK3R5cGVkZWYgY29uc3QgQXV0b1Rlc3RpbmdIb29rQmFzZSYgQXV0b1Rlc3RpbmdIb29rOworCisvLyBUaGlzIGlzIHRoZSBjbGFzcyB5b3UgbXVzdCB1c2Ugd2hlbiBob2xkaW5nIGEgaG9vayBhcyBhIG1lbWJlciBvZiBhbm90aGVyCisvLyBjbGFzcywgZS5nLgorLy8KKy8vIHB1YmxpYzoKKy8vICBBdXRvVGVzdGluZ0hvb2tIb2xkZXIgaG9sZGVyXzsKKy8vICBNeUNsYXNzKCkgOiBteV9ob29rX2hvbGRlcihNYWtlVGVzdGluZ0hvb2tIb2xkZXIoVGFyZ2V0LCBIb29rKSkge30KK2NsYXNzIEF1dG9UZXN0aW5nSG9va0hvbGRlciB7CisgcHVibGljOgorICBleHBsaWNpdCBBdXRvVGVzdGluZ0hvb2tIb2xkZXIoQXV0b1Rlc3RpbmdIb29rQmFzZSogaG9vaykgOiBob29rXyhob29rKSB7fQorICB+QXV0b1Rlc3RpbmdIb29rSG9sZGVyKCkgeyBkZWxldGUgaG9va187IH0KKyBwcml2YXRlOgorICBBdXRvVGVzdGluZ0hvb2tIb2xkZXIoKSB7fSAgLy8gZGlzYWxsb3cKKyAgQXV0b1Rlc3RpbmdIb29rQmFzZSogaG9va187Cit9OworCisvLyBUaGlzIGNsYXNzIGhlbHBzIHBhdGNoIGEgZnVuY3Rpb24sIHRoZW4gdW5wYXRjaCBpdCB3aGVuIHRoZSBvYmplY3QgZXhpdHMKKy8vIHNjb3BlLCBhbmQgYWxzbyBtYWludGFpbnMgdGhlIHBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHN0dWIuCisvLworLy8gVG8gZW5hYmxlIHVzZSBvZiB0aGUgY2xhc3Mgd2l0aG91dCBoYXZpbmcgdG8gZXhwbGljaXRseSBwcm92aWRlIHRoZQorLy8gdHlwZSBvZiB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKGFuZCBpbnN0ZWFkIG9ubHkgcHJvdmlkaW5nIGl0CisvLyBpbXBsaWNpdGx5KSB3ZSB1c2UgdGhlIHNhbWUgdHJpY2sgYXMgU2NvcGVHdWFyZCAoc2VlCisvLyBjb21tb24vc2NvcGVfY2xlYW51cC5oKSB1c2VzLCBzbyB0byBjcmVhdGUgYSBob29rIHlvdSB1c2UgdGhlIE1ha2VIb29rCisvLyBmdW5jdGlvbiByYXRoZXIgdGhhbiBhIGNvbnN0cnVjdG9yLgorLy8KKy8vIE5PVEU6ICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgc2FmZSBmb3IgZS5nLiB1bml0IHRlc3RzIGFuZCBfbm90XyBmb3IKKy8vIHByb2R1Y3Rpb24gY29kZS4gIFNlZSBQcmVhbWJsZVBhdGNoZXIgY2xhc3MgZm9yIGRldGFpbHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEF1dG9UZXN0aW5nSG9va0ltcGwgOiBwdWJsaWMgQXV0b1Rlc3RpbmdIb29rQmFzZSB7CisgcHVibGljOgorICBzdGF0aWMgQXV0b1Rlc3RpbmdIb29rSW1wbDxUPiBNYWtlVGVzdGluZ0hvb2soVCB0YXJnZXRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIHJlcGxhY2VtZW50X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb19pdCkgeworICAgIHJldHVybiBBdXRvVGVzdGluZ0hvb2tJbXBsPFQ+KHRhcmdldF9mdW5jdGlvbiwgcmVwbGFjZW1lbnRfZnVuY3Rpb24sIGRvX2l0KTsKKyAgfQorCisgIHN0YXRpYyBBdXRvVGVzdGluZ0hvb2tJbXBsPFQ+KiBNYWtlVGVzdGluZ0hvb2tIb2xkZXIoVCB0YXJnZXRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCByZXBsYWNlbWVudF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvX2l0KSB7CisgICAgcmV0dXJuIG5ldyBBdXRvVGVzdGluZ0hvb2tJbXBsPFQ+KHRhcmdldF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRfZnVuY3Rpb24sIGRvX2l0KTsKKyAgfQorCisgIH5BdXRvVGVzdGluZ0hvb2tJbXBsKCkgeworICAgIGlmIChkaWRfaXRfKSB7CisgICAgICBTSURFU1RFUF9DSEsoU0lERVNURVBfU1VDQ0VTUyA9PSBQcmVhbWJsZVBhdGNoZXI6OlVucGF0Y2goCisgICAgICAgICAgKHZvaWQqKXRhcmdldF9mdW5jdGlvbl8sICh2b2lkKilyZXBsYWNlbWVudF9mdW5jdGlvbl8sCisgICAgICAgICAgKHZvaWQqKW9yaWdpbmFsX2Z1bmN0aW9uXykpOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4gIFRvIHVzZSB0aGlzIG1ldGhvZCB5b3Ugd2lsbAorICAvLyBoYXZlIHRvIGV4cGxpY2l0bHkgY3JlYXRlIGFuIEF1dG9UZXN0aW5nSG9va0ltcGwgb2YgdGhlIHNwZWNpZmljCisgIC8vIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSAoaS5lLiBub3QgdXNlIHRoZSBBdXRvVGVzdGluZ0hvb2sgdHlwZWRlZikuCisgIFQgb3JpZ2luYWxfZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIG9yaWdpbmFsX2Z1bmN0aW9uXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgQXV0b1Rlc3RpbmdIb29rSW1wbChUIHRhcmdldF9mdW5jdGlvbiwgVCByZXBsYWNlbWVudF9mdW5jdGlvbiwgYm9vbCBkb19pdCkKKyAgICAgIDogdGFyZ2V0X2Z1bmN0aW9uXyh0YXJnZXRfZnVuY3Rpb24pLAorICAgICAgICBvcmlnaW5hbF9mdW5jdGlvbl8oTlVMTCksCisgICAgICAgIHJlcGxhY2VtZW50X2Z1bmN0aW9uXyhyZXBsYWNlbWVudF9mdW5jdGlvbiksCisgICAgICAgIGRpZF9pdF8oZG9faXQpIHsKKyAgICBpZiAoZG9faXQpIHsKKyAgICAgIFNJREVTVEVQX0NISyhTSURFU1RFUF9TVUNDRVNTID09IFByZWFtYmxlUGF0Y2hlcjo6UGF0Y2godGFyZ2V0X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yaWdpbmFsX2Z1bmN0aW9uXykpOworICAgIH0KKyAgfQorCisgIFQgdGFyZ2V0X2Z1bmN0aW9uXzsgIC8vIGFsd2F5cyB2YWxpZAorICBUIG9yaWdpbmFsX2Z1bmN0aW9uXzsgIC8vIGFsd2F5cyB2YWxpZAorICBUIHJlcGxhY2VtZW50X2Z1bmN0aW9uXzsgIC8vIGFsd2F5cyB2YWxpZAorICBib29sIGRpZF9pdF87ICAvLyBSZW1lbWJlciBpZiB3ZSBkaWQgaXQgb3Igbm90Li4uCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBBdXRvVGVzdGluZ0hvb2tJbXBsPFQ+IE1ha2VUZXN0aW5nSG9vayhUIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIHJlcGxhY2VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9faXQpIHsKKyAgcmV0dXJuIEF1dG9UZXN0aW5nSG9va0ltcGw8VD46Ok1ha2VUZXN0aW5nSG9vayh0YXJnZXQsIHJlcGxhY2VtZW50LCBkb19pdCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIEF1dG9UZXN0aW5nSG9va0ltcGw8VD4gTWFrZVRlc3RpbmdIb29rKFQgdGFyZ2V0LCBUIHJlcGxhY2VtZW50KSB7CisgIHJldHVybiBBdXRvVGVzdGluZ0hvb2tJbXBsPFQ+OjpNYWtlVGVzdGluZ0hvb2sodGFyZ2V0LCByZXBsYWNlbWVudCwgdHJ1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIEF1dG9UZXN0aW5nSG9va0ltcGw8VD4qIE1ha2VUZXN0aW5nSG9va0hvbGRlcihUIHRhcmdldCwgVCByZXBsYWNlbWVudCkgeworICByZXR1cm4gQXV0b1Rlc3RpbmdIb29rSW1wbDxUPjo6TWFrZVRlc3RpbmdIb29rSG9sZGVyKHRhcmdldCwgcmVwbGFjZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Cit9CisKK307ICAvLyBuYW1lc3BhY2Ugc2lkZXN0ZXAKKworI2VuZGlmICAvLyBDRUVFX1RFU1RJTkdfU0lERVNURVBfQVVUT19URVNUSU5HX0hPT0tfSF8KZGlmZiAtLWdpdCBhL3NyYy93aW5kb3dzL2NvbmZpZy5oIGIvc3JjL3dpbmRvd3MvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3NjQ1NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93aW5kb3dzL2NvbmZpZy5oCkBAIC0wLDAgKzEsMzEwIEBACisvKiBBIG1hbnVhbCB2ZXJzaW9uIG9mIGNvbmZpZy5oIGZpdCBmb3Igd2luZG93cyBtYWNoaW5lcy4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuCisgKiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorICovCisKKy8qIFNvbWV0aW1lcyB3ZSBhY2NpZGVudGFsbHkgI2luY2x1ZGUgdGhpcyBjb25maWcuaCBpbnN0ZWFkIG9mIHRoZSBvbmUKKyAgIGluIC4uIC0tIHRoaXMgaXMgcGFydGljdWxhcmx5IHRydWUgZm9yIG1zeXMvbWluZ3csIHdoaWNoIHVzZXMgdGhlCisgICB1bml4IGNvbmZpZy5oIGJ1dCBhbHNvIHJ1bnMgY29kZSBpbiB0aGUgd2luZG93cyBkaXJlY3RvcnkuCisgICAqLworI2lmZGVmIF9fTUlOR1czMl9fCisjaW5jbHVkZSAiLi4vY29uZmlnLmgiCisjZGVmaW5lIEdPT0dMRV9QRVJGVE9PTFNfV0lORE9XU19DT05GSUdfSF8KKyNlbmRpZgorCisjaWZuZGVmIEdPT0dMRV9QRVJGVE9PTFNfV0lORE9XU19DT05GSUdfSF8KKyNkZWZpbmUgR09PR0xFX1BFUkZUT09MU19XSU5ET1dTX0NPTkZJR19IXworCisvKiBkZWZpbmUgdGhpcyBpZiB5b3UgYXJlIGxpbmtpbmcgdGNtYWxsb2Mgc3RhdGljYWxseSBhbmQgb3ZlcnJpZGluZyB0aGUKKyAqIGRlZmF1bHQgYWxsb2NhdG9ycy4KKyAqIEZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHVzZSB0aGlzIG1vZGUsIHNlZQorICogaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2dvb2dsZS1wZXJmdG9vbHMvYnJvd3NlX3RocmVhZC90aHJlYWQvNDFjZDM3MTBhZjg1ZTU3YgorICovCisjdW5kZWYgV0lOMzJfT1ZFUlJJREVfQUxMT0NBVE9SUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3VyIGxpYmMgaGFzIGEgc25wcmludGYgaW1wbGVtZW50YXRpb24gKi8KKyN1bmRlZiBIQVZFX1NOUFJJTlRGCisKKy8qIERlZmluZSB0byAxIGlmIGNvbXBpbGVyIHN1cHBvcnRzIF9fYnVpbHRpbl9zdGFja19wb2ludGVyICovCisjdW5kZWYgSEFWRV9CVUlMVElOX1NUQUNLX1BPSU5URVIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxjb25mbGljdC1zaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9DT05GTElDVF9TSUdOQUxfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGN5Z3dpbi9zaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9DWUdXSU5fU0lHTkFMX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBjZnJlZScsIGFuZCB0byAwIGlmIHlvdSBkb24ndC4KKyAgICovCisjdW5kZWYgSEFWRV9ERUNMX0NGUkVFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgbWVtYWxpZ24nLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9NRU1BTElHTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYHBvc2l4X21lbWFsaWduJywgYW5kIHRvIDAgaWYKKyAgIHlvdSBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfUE9TSVhfTUVNQUxJR04KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBwdmFsbG9jJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfUFZBTExPQworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYHVuYW1lJywgYW5kIHRvIDAgaWYgeW91IGRvbid0LgorICAgKi8KKyN1bmRlZiBIQVZFX0RFQ0xfVU5BTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGB2YWxsb2MnLCBhbmQgdG8gMCBpZiB5b3UgZG9uJ3QuCisgICAqLworI3VuZGVmIEhBVkVfREVDTF9WQUxMT0MKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0RMRkNOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYEVsZjMyX1ZlcnN5bScuICovCisjdW5kZWYgSEFWRV9FTEYzMl9WRVJTWU0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxleGVjaW5mby5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0VYRUNJTkZPX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmZWF0dXJlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0ZFQVRVUkVTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRldWlkJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVEVVSUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwYWdlc2l6ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUUEFHRVNJWkUgMSAgIC8qIHdlIGRlZmluZSBpdCBpbiB3aW5kb3dzL3BvcnQuY2MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxnbG9iLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfR0xPQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z3JwLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfR1JQX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJ1bndpbmQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MSUJVTldJTkRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L3B0cmFjZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJTlVYX1BUUkFDRV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX01BTExPQ19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MvbWFsbG9jLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTUFMTE9DX01BTExPQ19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTUVNT1JZX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogZGVmaW5lIGlmIHRoZSBjb21waWxlciBpbXBsZW1lbnRzIG5hbWVzcGFjZXMgKi8KKyNkZWZpbmUgSEFWRV9OQU1FU1BBQ0VTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwb2xsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfUE9MTF9ICisKKy8qIGRlZmluZSBpZiBsaWJjIGhhcyBwcm9ncmFtX2ludm9jYXRpb25fbmFtZSAqLworI3VuZGVmIEhBVkVfUFJPR1JBTV9JTlZPQ0FUSU9OX05BTUUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIFBPU0lYIHRocmVhZHMgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgSEFWRV9QVEhSRUFECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cHdkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfUFdEX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzYnJrJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NCUksKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzY2hlZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NDSEVEX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERJTlRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3QgbWFsbGluZm8nLiAqLworI3VuZGVmIEhBVkVfU1RSVUNUX01BTExJTkZPCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2NkZWZzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX0NERUZTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbWFsbG9jLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX01BTExPQ19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcHJjdGwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfUFJDVExfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TT0NLRVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zeXNjYWxsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NZU0NBTExfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCisKKy8qIDxzeXMvdWNvbnRleHQuaD4gaXMgYnJva2VuIG9uIHJlZGhhdCA3ICovCisjdW5kZWYgSEFWRV9TWVNfVUNPTlRFWFRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy93YWl0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1dBSVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiBjb21waWxlciBzdXBwb3J0cyBfX3RocmVhZCAqLworI2RlZmluZSBIQVZFX1RMUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dWNvbnRleHQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9VQ09OVEVYVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bndpbmQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9VTldJTkRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHZhbGdyaW5kLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVkFMR1JJTkRfSAorCisvKiBkZWZpbmUgaWYgeW91ciBjb21waWxlciBoYXMgX19hdHRyaWJ1dGVfXyAqLworI3VuZGVmIEhBVkVfX19BVFRSSUJVVEVfXworCisvKiBEZWZpbmUgdG8gMSBpZiBjb21waWxlciBzdXBwb3J0cyBfX2Vudmlyb24gKi8KKyN1bmRlZiBIQVZFX19fRU5WSVJPTgorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgX19pbnQ2NCcuICovCisjZGVmaW5lIEhBVkVfX19JTlQ2NCAxCisKKy8qIHByZWZpeCB3aGVyZSB3ZSBsb29rIGZvciBpbnN0YWxsZWQgZmlsZXMgKi8KKyN1bmRlZiBJTlNUQUxMX1BSRUZJWAorCisvKiBEZWZpbmUgdG8gMSBpZiBpbnQzMl90IGlzIGVxdWl2YWxlbnQgdG8gaW50cHRyX3QgKi8KKyN1bmRlZiBJTlQzMl9FUVVBTFNfSU5UUFRSCisKKy8qIERlZmluZSB0byB0aGUgc3ViLWRpcmVjdG9yeSBpbiB3aGljaCBsaWJ0b29sIHN0b3JlcyB1bmluc3RhbGxlZCBsaWJyYXJpZXMuCisgICAqLworI3VuZGVmIExUX09CSkRJUgorCisvKiBEZWZpbmUgdG8gJ3ZvbGF0aWxlJyBpZiBfX21hbGxvY19ob29rIGlzIGRlY2xhcmVkIHZvbGF0aWxlICovCisjdW5kZWYgTUFMTE9DX0hPT0tfTUFZQkVfVk9MQVRJTEUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91ciBDIGNvbXBpbGVyIGRvZXNuJ3QgYWNjZXB0IC1jIGFuZCAtbyB0b2dldGhlci4gKi8KKyN1bmRlZiBOT19NSU5VU19DX01JTlVTX08KKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjZGVmaW5lIFBBQ0tBR0UgImdwZXJmdG9vbHMiCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAib3BlbnNvdXJjZUBnb29nbGUuY29tIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiZ3BlcmZ0b29scyIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1NUUklORyAiZ3BlcmZ0b29scyAyLjQiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJncGVyZnRvb2xzIgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVVJMCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMi40IgorCisvKiBIb3cgdG8gYWNjZXNzIHRoZSBQQyBmcm9tIGEgc3RydWN0IHVjb250ZXh0ICovCisjdW5kZWYgUENfRlJPTV9VQ09OVEVYVAorCisvKiBBbHdheXMgdGhlIGVtcHR5LXN0cmluZyBvbiBub24td2luZG93cyBzeXN0ZW1zLiBPbiB3aW5kb3dzLCBzaG91bGQgYmUKKyAgICJfX2RlY2xzcGVjKGRsbGV4cG9ydCkiLiBUaGlzIHdheSwgd2hlbiB3ZSBjb21waWxlIHRoZSBkbGwsIHdlIGV4cG9ydCBvdXIKKyAgIGZ1bmN0aW9ucy9jbGFzc2VzLiBJdCdzIHNhZmUgdG8gZGVmaW5lIHRoaXMgaGVyZSBiZWNhdXNlIGNvbmZpZy5oIGlzIG9ubHkKKyAgIHVzZWQgaW50ZXJuYWxseSwgdG8gY29tcGlsZSB0aGUgRExMLCBhbmQgZXZlcnkgRExMIHNvdXJjZSBmaWxlICNpbmNsdWRlcworICAgImNvbmZpZy5oIiBiZWZvcmUgYW55dGhpbmcgZWxzZS4gKi8KKyNpZm5kZWYgUEVSRlRPT0xTX0RMTF9ERUNMCisjIGRlZmluZSBQRVJGVE9PTFNfSVNfQV9ETEwgIDEgICAvKiBub3Qgc2V0IGlmIHlvdSdyZSBzdGF0aWNhbGx5IGxpbmtpbmcgKi8KKyMgZGVmaW5lIFBFUkZUT09MU19ETExfREVDTCAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjIGRlZmluZSBQRVJGVE9PTFNfRExMX0RFQ0xfRk9SX1VOSVRURVNUUyAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZW5kaWYKKworLyogcHJpbnRmIGZvcm1hdCBjb2RlIGZvciBwcmludGluZyBhIHNpemVfdCBhbmQgc3NpemVfdCAqLworI2RlZmluZSBQUklkUyAgIklkIgorCisvKiBwcmludGYgZm9ybWF0IGNvZGUgZm9yIHByaW50aW5nIGEgc2l6ZV90IGFuZCBzc2l6ZV90ICovCisjZGVmaW5lIFBSSXVTICAiSXUiCisKKy8qIHByaW50ZiBmb3JtYXQgY29kZSBmb3IgcHJpbnRpbmcgYSBzaXplX3QgYW5kIHNzaXplX3QgKi8KKyNkZWZpbmUgUFJJeFMgICJJeCIKKworLyogTWFyayB0aGUgc3lzdGVtcyB3aGVyZSB3ZSBrbm93IGl0J3MgYmFkIGlmIHB0aHJlYWRzIHJ1bnMgdG9vCisgICBlYXJseSBiZWZvcmUgbWFpbiAoYmVmb3JlIHRocmVhZHMgYXJlIGluaXRpYWxpemVkLCBwcmVzdW1hYmx5KS4gICovCisjaWZkZWYgX19GcmVlQlNEX18KKyNkZWZpbmUgUFRIUkVBRFNfQ1JBU0hFU19JRl9SVU5fVE9PX0VBUkxZIDEKKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gbmVjZXNzYXJ5IHN5bWJvbCBpZiB0aGlzIGNvbnN0YW50IHVzZXMgYSBub24tc3RhbmRhcmQgbmFtZSBvbgorICAgeW91ciBzeXN0ZW0uICovCisjdW5kZWYgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisKKy8qIHRoZSBuYW1lc3BhY2Ugd2hlcmUgU1RMIGNvZGUgbGlrZSB2ZWN0b3I8PiBpcyBkZWZpbmVkICovCisjZGVmaW5lIFNUTF9OQU1FU1BBQ0UgIHN0ZAorCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjdW5kZWYgVkVSU0lPTgorCisvKiBDOTkgc2F5czogZGVmaW5lIHRoaXMgdG8gZ2V0IHRoZSBQUkkuLi4gbWFjcm9zIGZyb20gc3RkaW50LmggKi8KKyNpZm5kZWYgX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TIDEKKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKKyAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworI3VuZGVmIGlubGluZQorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXh0cmEgc3R1ZmYgbm90IGZvdW5kIGluIGNvbmZpZy5oLmluCisKKy8vIFRoaXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSB0aGUgd2luZG93cy5oIGlzIGluY2x1ZGVkLiAgV2UgbmVlZCBhdAorLy8gbGVhc3QgMHgwNDAwIGZvciBtdXRleC5oIHRvIGhhdmUgYWNjZXNzIHRvIFRyeUxvY2ssIGFuZCBhdCBsZWFzdAorLy8gMHgwNTAxIGZvciBwYXRjaF9mdW5jdGlvbnMuY2MgdG8gaGF2ZSBhY2Nlc3MgdG8gR2V0TW9kdWxlSGFuZGxlRXguCisvLyAoVGhpcyBsYXR0ZXIgaXMgYW4gb3B0aW1pemF0aW9uIHdlIGNvdWxkIHRha2Ugb3V0IGlmIG5lZWQgYmUuKQorI2lmbmRlZiBfV0lOMzJfV0lOTlQKKyMgZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDEKKyNlbmRpZgorCisvLyBXZSB3YW50IHRvIG1ha2Ugc3VyZSBub3QgdG8gZXZlciB0cnkgdG8gI2luY2x1ZGUgaGVhcC1jaGVja2VyLmgKKyNkZWZpbmUgTk9fSEVBUF9DSEVDSyAxCisKKy8vIFRPRE8oY3NpbHZlcnMpOiBpbmNsdWRlIHdpbmRvd3MvcG9ydC5oIGluIGV2ZXJ5IHJlbGV2YW50IHNvdXJjZSBmaWxlIGluc3RlYWQ/CisjaW5jbHVkZSAid2luZG93cy9wb3J0LmgiCisKKyNlbmRpZiAgLyogR09PR0xFX1BFUkZUT09MU19XSU5ET1dTX0NPTkZJR19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3dpbmRvd3MvZ2V0X21hbmdsZWRfbmFtZXMuY2MgYi9zcmMvd2luZG93cy9nZXRfbWFuZ2xlZF9uYW1lcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGJkMDNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3MvZ2V0X21hbmdsZWRfbmFtZXMuY2MKQEAgLTAsMCArMSw2NSBAQAorLy8gLSotIE1vZGU6IEMrKzsgYy1iYXNpYy1vZmZzZXQ6IDI7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKy8vIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8gCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLyAKKy8vIC0tLQorLy8gQXV0aG9yOiBDcmFpZyBTaWx2ZXJzdGVpbiAob3BlbnNvdXJjZUBnb29nbGUuY29tKQorCisvLyBXaGVuIHlvdSBhcmUgcG9ydGluZyBwZXJmdG9vbHMgdG8gYSBuZXcgY29tcGlsZXIgb3IgYXJjaGl0ZWN0dXJlCisvLyAod2luNjQgdnMgd2luMzIpIGZvciBpbnN0YW5jZSwgeW91J2xsIG5lZWQgdG8gY2hhbmdlIHRoZSBtYW5nbGVkCisvLyBzeW1ib2wgbmFtZXMgZm9yIG9wZXJhdG9yIG5ldyBhbmQgZnJpZW5kcyBhdCB0aGUgdG9wIG9mCisvLyBwYXRjaF9mdW5jdGlvbnMuY2MuICBUaGlzIGZpbGUgaGVscHMgeW91IGRvIHRoYXQuCisvLworLy8gSXQgZG9lcyB0aGlzIGJ5IGRlZmluaW5nIHRoZXNlIGZ1bmN0aW9ucyB3aXRoIHRoZSBwcm9wZXIgc2lnbmF0dXJlLgorLy8gQWxsIHlvdSBuZWVkIHRvIGRvIGlzIGNvbXBpbGUgdGhpcyBmaWxlIGFuZCB0aGUgcnVuIGR1bXBiaW4gb24gaXQuCisvLyAoU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS81eDQ5dzY5OS5hc3B4IGZvciBtb3JlCisvLyBvbiBkdW1wYmluKS4gIFRvIGRvIHRoaXMgaW4gTVNWQywgdXNlIHRoZSBNU1ZDIGNvbW1hbmRsaW5lIHNoZWxsOgorLy8gICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMjM1NjM5KFZTLjgwKS5hc3B4KQorLy8KKy8vIFRoZSBydW46CisvLyAgICBjbCAvYyBnZXRfbWFuZ2xlZF9uYW1lcy5jYworLy8gICAgZHVtcGJpbiAvc3ltYm9scyBnZXRfbWFuZ2xlZF9uYW1lcy5vYmoKKy8vCisvLyBJdCB3aWxsIHByaW50IG91dCB0aGUgbWFuZ2xlZCAoYW5kIGFzc29jaWF0ZWQgdW5tYW5nbGVkKSBuYW1lcyBvZgorLy8gdGhlIDggc3ltYm9scyB5b3UgbmVlZCB0byBwdXQgYXQgdGhlIHRvcCBvZiBwYXRjaF9mdW5jdGlvbnMuY2MKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgIC8vIGZvciBzaXplX3QKKyNpbmNsdWRlIDxuZXc+ICAgICAgICAgICAvLyBmb3Igbm90aHJvd190CisKK3N0YXRpYyBjaGFyIG07ICAgLy8gc29tZSBkdW1teSBtZW1vcnkgc28gbmV3IGRvZXNuJ3QgcmV0dXJuIE5VTEwuCisKK3ZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSkgeyByZXR1cm4gJm07IH0KK3ZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHApIHRocm93KCkgeyB9Cit2b2lkKiBvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSkgeyByZXR1cm4gJm07IH0KK3ZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcCkgdGhyb3coKSB7IH0KKwordm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCkgeyByZXR1cm4gJm07IH0KK3ZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHAsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKSB7IH0KK3ZvaWQqIG9wZXJhdG9yIG5ld1tdKHNpemVfdCBzaXplLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCkgeyByZXR1cm4gJm07IH0KK3ZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpIHsgfQpkaWZmIC0tZ2l0IGEvc3JjL3dpbmRvd3MvZ29vZ2xlL3RjbWFsbG9jLmggYi9zcmMvd2luZG93cy9nb29nbGUvdGNtYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RiNjMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3MvZ29vZ2xlL3RjbWFsbG9jLmgKQEAgLTAsMCArMSwzNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDAzLCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKiBUaGUgY29kZSBoYXMgbW92ZWQgdG8gZ3BlcmZ0b29scy8uICBVc2UgdGhhdCBpbmNsdWRlLWRpcmVjdG9yeSBmb3IKKyAqIG5ldyBjb2RlLgorICovCisjaW5jbHVkZSA8Z3BlcmZ0b29scy90Y21hbGxvYy5oPgpkaWZmIC0tZ2l0IGEvc3JjL3dpbmRvd3MvZ3BlcmZ0b29scy90Y21hbGxvYy5oIGIvc3JjL3dpbmRvd3MvZ3BlcmZ0b29scy90Y21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTc5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvd2luZG93cy9ncGVyZnRvb2xzL3RjbWFsbG9jLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8vIC0qLSBNb2RlOiBDKys7IGMtYmFzaWMtb2Zmc2V0OiAyOyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisvKiBDb3B5cmlnaHQgKGMpIDIwMDMsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIC0tLQorICogQXV0aG9yOiBTYW5qYXkgR2hlbWF3YXQgPG9wZW5zb3VyY2VAZ29vZ2xlLmNvbT4KKyAqICAgICAgICAgLmguaW4gZmlsZSBieSBDcmFpZyBTaWx2ZXJzdGVpbiA8b3BlbnNvdXJjZUBnb29nbGUuY29tPgorICovCisKKyNpZm5kZWYgVENNQUxMT0NfVENNQUxMT0NfSF8KKyNkZWZpbmUgVENNQUxMT0NfVENNQUxMT0NfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBzaXplX3QKKyNpZmRlZiBIQVZFX1NZU19DREVGU19ICisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+ICAgLy8gd2hlcmUgZ2xpYmMgZGVmaW5lcyBfX1RIUk9XCisjZW5kaWYKKworLy8gX19USFJPVyBpcyBkZWZpbmVkIGluIGdsaWJjIHN5c3RlbXMuICBJdCBtZWFucywgY291bnRlci1pbnR1aXRpdmVseSwKKy8vICJUaGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgdGhyb3cgYW4gZXhjZXB0aW9uLiIgIEl0J3MgYW4gb3B0aW9uYWwKKy8vIG9wdGltaXphdGlvbiB0b29sLCBidXQgd2UgbWF5IG5lZWQgdG8gdXNlIGl0IHRvIG1hdGNoIGdsaWJjIHByb3RvdHlwZXMuCisjaWZuZGVmIF9fVEhST1cgICAgLyogSSBndWVzcyB3ZSdyZSBub3Qgb24gYSBnbGliYyBzeXN0ZW0gKi8KKyMgZGVmaW5lIF9fVEhST1cgICAvKiBfX1RIUk9XIGlzIGp1c3QgYW4gb3B0aW1pemF0aW9uLCBzbyBvayB0byBtYWtlIGl0ICIiICovCisjZW5kaWYKKworLy8gRGVmaW5lIHRoZSB2ZXJzaW9uIG51bWJlciBzbyBmb2xrcyBjYW4gY2hlY2sgYWdhaW5zdCBpdAorI2RlZmluZSBUQ19WRVJTSU9OX01BSk9SICAyCisjZGVmaW5lIFRDX1ZFUlNJT05fTUlOT1IgIDQKKyNkZWZpbmUgVENfVkVSU0lPTl9QQVRDSCAgIiIKKyNkZWZpbmUgVENfVkVSU0lPTl9TVFJJTkcgImdwZXJmdG9vbHMgMi40IgorCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgLy8gZm9yIHN0cnVjdCBtYWxsaW5mbywgaWYgaXQncyBkZWZpbmVkCisKKy8vIEFubm95aW5nIHN0dWZmIGZvciB3aW5kb3dzIC0tIG1ha2VzIHN1cmUgY2xpZW50cyBjYW4gaW1wb3J0IHRoZXNlIGZ1bmN0aW9ucworI2lmbmRlZiBQRVJGVE9PTFNfRExMX0RFQ0wKKyMgaWZkZWYgX1dJTjMyCisjICAgZGVmaW5lIFBFUkZUT09MU19ETExfREVDTCAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjIGVsc2UKKyMgICBkZWZpbmUgUEVSRlRPT0xTX0RMTF9ERUNMCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCituYW1lc3BhY2Ugc3RkIHsKK3N0cnVjdCBub3Rocm93X3Q7Cit9CisKK2V4dGVybiAiQyIgeworI2VuZGlmCisgIC8vIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIHN0cmluZy4gIElmIG1ham9yLCBtaW5vciwKKyAgLy8gYW5kL29yIHBhdGNoIGFyZSBub3QgTlVMTCwgdGhleSBhcmUgc2V0IHRvIHRoZSBtYWpvciB2ZXJzaW9uLAorICAvLyBtaW5vciB2ZXJzaW9uLCBhbmQgcGF0Y2gtY29kZSAoYSBzdHJpbmcsIHVzdWFsbHkgIiIpLgorICBQRVJGVE9PTFNfRExMX0RFQ0wgY29uc3QgY2hhciogdGNfdmVyc2lvbihpbnQqIG1ham9yLCBpbnQqIG1pbm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogcGF0Y2gpIF9fVEhST1c7CisKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIHZvaWQqIHRjX21hbGxvYyhzaXplX3Qgc2l6ZSkgX19USFJPVzsKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIHZvaWQqIHRjX21hbGxvY19za2lwX25ld19oYW5kbGVyKHNpemVfdCBzaXplKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCB0Y19mcmVlKHZvaWQqIHB0cikgX19USFJPVzsKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIHZvaWQqIHRjX3JlYWxsb2Modm9pZCogcHRyLCBzaXplX3Qgc2l6ZSkgX19USFJPVzsKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIHZvaWQqIHRjX2NhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCB0Y19jZnJlZSh2b2lkKiBwdHIpIF9fVEhST1c7CisKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIHZvaWQqIHRjX21lbWFsaWduKHNpemVfdCBfX2FsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX3NpemUpIF9fVEhST1c7CisgIFBFUkZUT09MU19ETExfREVDTCBpbnQgdGNfcG9zaXhfbWVtYWxpZ24odm9pZCoqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWxpZ24sIHNpemVfdCBzaXplKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCogdGNfdmFsbG9jKHNpemVfdCBfX3NpemUpIF9fVEhST1c7CisgIFBFUkZUT09MU19ETExfREVDTCB2b2lkKiB0Y19wdmFsbG9jKHNpemVfdCBfX3NpemUpIF9fVEhST1c7CisKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIHZvaWQgdGNfbWFsbG9jX3N0YXRzKHZvaWQpIF9fVEhST1c7CisgIFBFUkZUT09MU19ETExfREVDTCBpbnQgdGNfbWFsbG9wdChpbnQgY21kLCBpbnQgdmFsdWUpIF9fVEhST1c7CisjaWYgMAorICBQRVJGVE9PTFNfRExMX0RFQ0wgc3RydWN0IG1hbGxpbmZvIHRjX21hbGxpbmZvKHZvaWQpIF9fVEhST1c7CisjZW5kaWYKKworICAvLyBUaGlzIGlzIGFuIGFsaWFzIGZvciBNYWxsb2NFeHRlbnNpb246Omluc3RhbmNlKCktPkdldEFsbG9jYXRlZFNpemUoKS4KKyAgLy8gSXQgaXMgZXF1aXZhbGVudCB0bworICAvLyAgICBPUyBYOiBtYWxsb2Nfc2l6ZSgpCisgIC8vICAgIGdsaWJjOiBtYWxsb2NfdXNhYmxlX3NpemUoKQorICAvLyAgICBXaW5kb3dzOiBfbXNpemUoKQorICBQRVJGVE9PTFNfRExMX0RFQ0wgc2l6ZV90IHRjX21hbGxvY19zaXplKHZvaWQqIHB0cikgX19USFJPVzsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIFBFUkZUT09MU19ETExfREVDTCBpbnQgdGNfc2V0X25ld19tb2RlKGludCBmbGFnKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCogdGNfbmV3KHNpemVfdCBzaXplKTsKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIHZvaWQqIHRjX25ld19ub3Rocm93KHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCB0Y19kZWxldGUodm9pZCogcCkgX19USFJPVzsKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIHZvaWQgdGNfZGVsZXRlX25vdGhyb3codm9pZCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCogdGNfbmV3YXJyYXkoc2l6ZV90IHNpemUpOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCogdGNfbmV3YXJyYXlfbm90aHJvdyhzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCB0Y19kZWxldGVhcnJheSh2b2lkKiBwKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCB0Y19kZWxldGVhcnJheV9ub3Rocm93KHZvaWQqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfX1RIUk9XOworfQorI2VuZGlmCisKKyNlbmRpZiAgLy8gI2lmbmRlZiBUQ01BTExPQ19UQ01BTExPQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3dpbmRvd3MvZ3BlcmZ0b29scy90Y21hbGxvYy5oLmluIGIvc3JjL3dpbmRvd3MvZ3BlcmZ0b29scy90Y21hbGxvYy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NThkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvd2luZG93cy9ncGVyZnRvb2xzL3RjbWFsbG9jLmguaW4KQEAgLTAsMCArMSwxMjUgQEAKKy8vIC0qLSBNb2RlOiBDKys7IGMtYmFzaWMtb2Zmc2V0OiAyOyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisvKiBDb3B5cmlnaHQgKGMpIDIwMDMsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIC0tLQorICogQXV0aG9yOiBTYW5qYXkgR2hlbWF3YXQgPG9wZW5zb3VyY2VAZ29vZ2xlLmNvbT4KKyAqICAgICAgICAgLmguaW4gZmlsZSBieSBDcmFpZyBTaWx2ZXJzdGVpbiA8b3BlbnNvdXJjZUBnb29nbGUuY29tPgorICovCisKKyNpZm5kZWYgVENNQUxMT0NfVENNQUxMT0NfSF8KKyNkZWZpbmUgVENNQUxMT0NfVENNQUxMT0NfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBzaXplX3QKKyNpZmRlZiBIQVZFX1NZU19DREVGU19ICisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+ICAgLy8gd2hlcmUgZ2xpYmMgZGVmaW5lcyBfX1RIUk9XCisjZW5kaWYKKworLy8gX19USFJPVyBpcyBkZWZpbmVkIGluIGdsaWJjIHN5c3RlbXMuICBJdCBtZWFucywgY291bnRlci1pbnR1aXRpdmVseSwKKy8vICJUaGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgdGhyb3cgYW4gZXhjZXB0aW9uLiIgIEl0J3MgYW4gb3B0aW9uYWwKKy8vIG9wdGltaXphdGlvbiB0b29sLCBidXQgd2UgbWF5IG5lZWQgdG8gdXNlIGl0IHRvIG1hdGNoIGdsaWJjIHByb3RvdHlwZXMuCisjaWZuZGVmIF9fVEhST1cgICAgLyogSSBndWVzcyB3ZSdyZSBub3Qgb24gYSBnbGliYyBzeXN0ZW0gKi8KKyMgZGVmaW5lIF9fVEhST1cgICAvKiBfX1RIUk9XIGlzIGp1c3QgYW4gb3B0aW1pemF0aW9uLCBzbyBvayB0byBtYWtlIGl0ICIiICovCisjZW5kaWYKKworLy8gRGVmaW5lIHRoZSB2ZXJzaW9uIG51bWJlciBzbyBmb2xrcyBjYW4gY2hlY2sgYWdhaW5zdCBpdAorI2RlZmluZSBUQ19WRVJTSU9OX01BSk9SICBAVENfVkVSU0lPTl9NQUpPUkAKKyNkZWZpbmUgVENfVkVSU0lPTl9NSU5PUiAgQFRDX1ZFUlNJT05fTUlOT1JACisjZGVmaW5lIFRDX1ZFUlNJT05fUEFUQ0ggICJAVENfVkVSU0lPTl9QQVRDSEAiCisjZGVmaW5lIFRDX1ZFUlNJT05fU1RSSU5HICJncGVyZnRvb2xzIEBUQ19WRVJTSU9OX01BSk9SQC5AVENfVkVSU0lPTl9NSU5PUkBAVENfVkVSU0lPTl9QQVRDSEAiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAvLyBmb3Igc3RydWN0IG1hbGxpbmZvLCBpZiBpdCdzIGRlZmluZWQKKworLy8gQW5ub3lpbmcgc3R1ZmYgZm9yIHdpbmRvd3MgLS0gbWFrZXMgc3VyZSBjbGllbnRzIGNhbiBpbXBvcnQgdGhlc2UgZnVuY3Rpb25zCisjaWZuZGVmIFBFUkZUT09MU19ETExfREVDTAorIyBpZmRlZiBfV0lOMzIKKyMgICBkZWZpbmUgUEVSRlRPT0xTX0RMTF9ERUNMICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgZWxzZQorIyAgIGRlZmluZSBQRVJGVE9PTFNfRExMX0RFQ0wKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK25hbWVzcGFjZSBzdGQgeworc3RydWN0IG5vdGhyb3dfdDsKK30KKworZXh0ZXJuICJDIiB7CisjZW5kaWYKKyAgLy8gUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gc3RyaW5nLiAgSWYgbWFqb3IsIG1pbm9yLAorICAvLyBhbmQvb3IgcGF0Y2ggYXJlIG5vdCBOVUxMLCB0aGV5IGFyZSBzZXQgdG8gdGhlIG1ham9yIHZlcnNpb24sCisgIC8vIG1pbm9yIHZlcnNpb24sIGFuZCBwYXRjaC1jb2RlIChhIHN0cmluZywgdXN1YWxseSAiIikuCisgIFBFUkZUT09MU19ETExfREVDTCBjb25zdCBjaGFyKiB0Y192ZXJzaW9uKGludCogbWFqb3IsIGludCogbWlub3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiBwYXRjaCkgX19USFJPVzsKKworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCogdGNfbWFsbG9jKHNpemVfdCBzaXplKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCogdGNfbWFsbG9jX3NraXBfbmV3X2hhbmRsZXIoc2l6ZV90IHNpemUpIF9fVEhST1c7CisgIFBFUkZUT09MU19ETExfREVDTCB2b2lkIHRjX2ZyZWUodm9pZCogcHRyKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCogdGNfcmVhbGxvYyh2b2lkKiBwdHIsIHNpemVfdCBzaXplKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCogdGNfY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpIF9fVEhST1c7CisgIFBFUkZUT09MU19ETExfREVDTCB2b2lkIHRjX2NmcmVlKHZvaWQqIHB0cikgX19USFJPVzsKKworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCogdGNfbWVtYWxpZ24oc2l6ZV90IF9fYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIGludCB0Y19wb3NpeF9tZW1hbGlnbih2b2lkKiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbGlnbiwgc2l6ZV90IHNpemUpIF9fVEhST1c7CisgIFBFUkZUT09MU19ETExfREVDTCB2b2lkKiB0Y192YWxsb2Moc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIHZvaWQqIHRjX3B2YWxsb2Moc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCB0Y19tYWxsb2Nfc3RhdHModm9pZCkgX19USFJPVzsKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIGludCB0Y19tYWxsb3B0KGludCBjbWQsIGludCB2YWx1ZSkgX19USFJPVzsKKyNpZiAwCisgIFBFUkZUT09MU19ETExfREVDTCBzdHJ1Y3QgbWFsbGluZm8gdGNfbWFsbGluZm8odm9pZCkgX19USFJPVzsKKyNlbmRpZgorCisgIC8vIFRoaXMgaXMgYW4gYWxpYXMgZm9yIE1hbGxvY0V4dGVuc2lvbjo6aW5zdGFuY2UoKS0+R2V0QWxsb2NhdGVkU2l6ZSgpLgorICAvLyBJdCBpcyBlcXVpdmFsZW50IHRvCisgIC8vICAgIE9TIFg6IG1hbGxvY19zaXplKCkKKyAgLy8gICAgZ2xpYmM6IG1hbGxvY191c2FibGVfc2l6ZSgpCisgIC8vICAgIFdpbmRvd3M6IF9tc2l6ZSgpCisgIFBFUkZUT09MU19ETExfREVDTCBzaXplX3QgdGNfbWFsbG9jX3NpemUodm9pZCogcHRyKSBfX1RIUk9XOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgUEVSRlRPT0xTX0RMTF9ERUNMIGludCB0Y19zZXRfbmV3X21vZGUoaW50IGZsYWcpIF9fVEhST1c7CisgIFBFUkZUT09MU19ETExfREVDTCB2b2lkKiB0Y19uZXcoc2l6ZV90IHNpemUpOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCogdGNfbmV3X25vdGhyb3coc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIF9fVEhST1c7CisgIFBFUkZUT09MU19ETExfREVDTCB2b2lkIHRjX2RlbGV0ZSh2b2lkKiBwKSBfX1RIUk9XOworICBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCB0Y19kZWxldGVfbm90aHJvdyh2b2lkKiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIF9fVEhST1c7CisgIFBFUkZUT09MU19ETExfREVDTCB2b2lkKiB0Y19uZXdhcnJheShzaXplX3Qgc2l6ZSk7CisgIFBFUkZUT09MU19ETExfREVDTCB2b2lkKiB0Y19uZXdhcnJheV9ub3Rocm93KHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIF9fVEhST1c7CisgIFBFUkZUT09MU19ETExfREVDTCB2b2lkIHRjX2RlbGV0ZWFycmF5KHZvaWQqIHApIF9fVEhST1c7CisgIFBFUkZUT09MU19ETExfREVDTCB2b2lkIHRjX2RlbGV0ZWFycmF5X25vdGhyb3codm9pZCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIF9fVEhST1c7Cit9CisjZW5kaWYKKworI2VuZGlmICAvLyAjaWZuZGVmIFRDTUFMTE9DX1RDTUFMTE9DX0hfCmRpZmYgLS1naXQgYS9zcmMvd2luZG93cy9pYTMyX21vZHJtX21hcC5jYyBiL3NyYy93aW5kb3dzL2lhMzJfbW9kcm1fbWFwLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjE5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvd2luZG93cy9pYTMyX21vZHJtX21hcC5jYwpAQCAtMCwwICsxLDEyMSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDA3LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAtLS0KKyAqIEF1dGhvcjogSm9pIFNpZ3VyZHNzb24KKyAqCisgKiBUYWJsZSBvZiByZWxldmFudCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gZGVjb2RlIHRoZSBNb2RSL00gYnl0ZS4KKyAqIEJhc2VkIG9uIGluZm9ybWF0aW9uIGluIHRoZSBJQS0zMiBJbnRlbK4gQXJjaGl0ZWN0dXJlCisgKiBTb2Z0d2FyZSBEZXZlbG9wZXKScyBNYW51YWwgVm9sdW1lIDI6IEluc3RydWN0aW9uIFNldCBSZWZlcmVuY2UuCisgKi8KKworI2luY2x1ZGUgIm1pbmlfZGlzYXNzZW1ibGVyLmgiCisjaW5jbHVkZSAibWluaV9kaXNhc3NlbWJsZXJfdHlwZXMuaCIKKworbmFtZXNwYWNlIHNpZGVzdGVwIHsKKworY29uc3QgTW9kcm1FbnRyeSBNaW5pRGlzYXNzZW1ibGVyOjpzX2lhMTZfbW9kcm1fbWFwX1tdID0geworLy8gbW9kID09IDAwCisgIC8qIHIvbSA9PSAwMDAgKi8geyBmYWxzZSwgZmFsc2UsIE9TX1pFUk8gfSwKKyAgLyogci9tID09IDAwMSAqLyB7IGZhbHNlLCBmYWxzZSwgT1NfWkVSTyB9LAorICAvKiByL20gPT0gMDEwICovIHsgZmFsc2UsIGZhbHNlLCBPU19aRVJPIH0sCisgIC8qIHIvbSA9PSAwMTEgKi8geyBmYWxzZSwgZmFsc2UsIE9TX1pFUk8gfSwKKyAgLyogci9tID09IDEwMCAqLyB7IGZhbHNlLCBmYWxzZSwgT1NfWkVSTyB9LAorICAvKiByL20gPT0gMTAxICovIHsgZmFsc2UsIGZhbHNlLCBPU19aRVJPIH0sCisgIC8qIHIvbSA9PSAxMTAgKi8geyB0cnVlLCBmYWxzZSwgT1NfV09SRCB9LAorICAvKiByL20gPT0gMTExICovIHsgZmFsc2UsIGZhbHNlLCBPU19aRVJPIH0sIAorLy8gbW9kID09IDAxCisgIC8qIHIvbSA9PSAwMDAgKi8geyB0cnVlLCBmYWxzZSwgT1NfQllURSB9LAorICAvKiByL20gPT0gMDAxICovIHsgdHJ1ZSwgZmFsc2UsIE9TX0JZVEUgfSwKKyAgLyogci9tID09IDAxMCAqLyB7IHRydWUsIGZhbHNlLCBPU19CWVRFIH0sCisgIC8qIHIvbSA9PSAwMTEgKi8geyB0cnVlLCBmYWxzZSwgT1NfQllURSB9LAorICAvKiByL20gPT0gMTAwICovIHsgdHJ1ZSwgZmFsc2UsIE9TX0JZVEUgfSwKKyAgLyogci9tID09IDEwMSAqLyB7IHRydWUsIGZhbHNlLCBPU19CWVRFIH0sCisgIC8qIHIvbSA9PSAxMTAgKi8geyB0cnVlLCBmYWxzZSwgT1NfQllURSB9LAorICAvKiByL20gPT0gMTExICovIHsgdHJ1ZSwgZmFsc2UsIE9TX0JZVEUgfSwgCisvLyBtb2QgPT0gMTAKKyAgLyogci9tID09IDAwMCAqLyB7IHRydWUsIGZhbHNlLCBPU19XT1JEIH0sCisgIC8qIHIvbSA9PSAwMDEgKi8geyB0cnVlLCBmYWxzZSwgT1NfV09SRCB9LAorICAvKiByL20gPT0gMDEwICovIHsgdHJ1ZSwgZmFsc2UsIE9TX1dPUkQgfSwKKyAgLyogci9tID09IDAxMSAqLyB7IHRydWUsIGZhbHNlLCBPU19XT1JEIH0sCisgIC8qIHIvbSA9PSAxMDAgKi8geyB0cnVlLCBmYWxzZSwgT1NfV09SRCB9LAorICAvKiByL20gPT0gMTAxICovIHsgdHJ1ZSwgZmFsc2UsIE9TX1dPUkQgfSwKKyAgLyogci9tID09IDExMCAqLyB7IHRydWUsIGZhbHNlLCBPU19XT1JEIH0sCisgIC8qIHIvbSA9PSAxMTEgKi8geyB0cnVlLCBmYWxzZSwgT1NfV09SRCB9LCAKKy8vIG1vZCA9PSAxMQorICAvKiByL20gPT0gMDAwICovIHsgZmFsc2UsIGZhbHNlLCBPU19aRVJPIH0sCisgIC8qIHIvbSA9PSAwMDEgKi8geyBmYWxzZSwgZmFsc2UsIE9TX1pFUk8gfSwKKyAgLyogci9tID09IDAxMCAqLyB7IGZhbHNlLCBmYWxzZSwgT1NfWkVSTyB9LAorICAvKiByL20gPT0gMDExICovIHsgZmFsc2UsIGZhbHNlLCBPU19aRVJPIH0sCisgIC8qIHIvbSA9PSAxMDAgKi8geyBmYWxzZSwgZmFsc2UsIE9TX1pFUk8gfSwKKyAgLyogci9tID09IDEwMSAqLyB7IGZhbHNlLCBmYWxzZSwgT1NfWkVSTyB9LAorICAvKiByL20gPT0gMTEwICovIHsgZmFsc2UsIGZhbHNlLCBPU19aRVJPIH0sCisgIC8qIHIvbSA9PSAxMTEgKi8geyBmYWxzZSwgZmFsc2UsIE9TX1pFUk8gfQorfTsKKworY29uc3QgTW9kcm1FbnRyeSBNaW5pRGlzYXNzZW1ibGVyOjpzX2lhMzJfbW9kcm1fbWFwX1tdID0geworLy8gbW9kID09IDAwCisgIC8qIHIvbSA9PSAwMDAgKi8geyBmYWxzZSwgZmFsc2UsIE9TX1pFUk8gfSwKKyAgLyogci9tID09IDAwMSAqLyB7IGZhbHNlLCBmYWxzZSwgT1NfWkVSTyB9LAorICAvKiByL20gPT0gMDEwICovIHsgZmFsc2UsIGZhbHNlLCBPU19aRVJPIH0sCisgIC8qIHIvbSA9PSAwMTEgKi8geyBmYWxzZSwgZmFsc2UsIE9TX1pFUk8gfSwKKyAgLyogci9tID09IDEwMCAqLyB7IGZhbHNlLCB0cnVlLCBPU19aRVJPIH0sCisgIC8qIHIvbSA9PSAxMDEgKi8geyB0cnVlLCBmYWxzZSwgT1NfRE9VQkxFX1dPUkQgfSwKKyAgLyogci9tID09IDExMCAqLyB7IGZhbHNlLCBmYWxzZSwgT1NfWkVSTyB9LAorICAvKiByL20gPT0gMTExICovIHsgZmFsc2UsIGZhbHNlLCBPU19aRVJPIH0sIAorLy8gbW9kID09IDAxCisgIC8qIHIvbSA9PSAwMDAgKi8geyB0cnVlLCBmYWxzZSwgT1NfQllURSB9LAorICAvKiByL20gPT0gMDAxICovIHsgdHJ1ZSwgZmFsc2UsIE9TX0JZVEUgfSwKKyAgLyogci9tID09IDAxMCAqLyB7IHRydWUsIGZhbHNlLCBPU19CWVRFIH0sCisgIC8qIHIvbSA9PSAwMTEgKi8geyB0cnVlLCBmYWxzZSwgT1NfQllURSB9LAorICAvKiByL20gPT0gMTAwICovIHsgdHJ1ZSwgdHJ1ZSwgT1NfQllURSB9LAorICAvKiByL20gPT0gMTAxICovIHsgdHJ1ZSwgZmFsc2UsIE9TX0JZVEUgfSwKKyAgLyogci9tID09IDExMCAqLyB7IHRydWUsIGZhbHNlLCBPU19CWVRFIH0sCisgIC8qIHIvbSA9PSAxMTEgKi8geyB0cnVlLCBmYWxzZSwgT1NfQllURSB9LCAKKy8vIG1vZCA9PSAxMAorICAvKiByL20gPT0gMDAwICovIHsgdHJ1ZSwgZmFsc2UsIE9TX0RPVUJMRV9XT1JEIH0sCisgIC8qIHIvbSA9PSAwMDEgKi8geyB0cnVlLCBmYWxzZSwgT1NfRE9VQkxFX1dPUkQgfSwKKyAgLyogci9tID09IDAxMCAqLyB7IHRydWUsIGZhbHNlLCBPU19ET1VCTEVfV09SRCB9LAorICAvKiByL20gPT0gMDExICovIHsgdHJ1ZSwgZmFsc2UsIE9TX0RPVUJMRV9XT1JEIH0sCisgIC8qIHIvbSA9PSAxMDAgKi8geyB0cnVlLCB0cnVlLCBPU19ET1VCTEVfV09SRCB9LAorICAvKiByL20gPT0gMTAxICovIHsgdHJ1ZSwgZmFsc2UsIE9TX0RPVUJMRV9XT1JEIH0sCisgIC8qIHIvbSA9PSAxMTAgKi8geyB0cnVlLCBmYWxzZSwgT1NfRE9VQkxFX1dPUkQgfSwKKyAgLyogci9tID09IDExMSAqLyB7IHRydWUsIGZhbHNlLCBPU19ET1VCTEVfV09SRCB9LCAKKy8vIG1vZCA9PSAxMQorICAvKiByL20gPT0gMDAwICovIHsgZmFsc2UsIGZhbHNlLCBPU19aRVJPIH0sCisgIC8qIHIvbSA9PSAwMDEgKi8geyBmYWxzZSwgZmFsc2UsIE9TX1pFUk8gfSwKKyAgLyogci9tID09IDAxMCAqLyB7IGZhbHNlLCBmYWxzZSwgT1NfWkVSTyB9LAorICAvKiByL20gPT0gMDExICovIHsgZmFsc2UsIGZhbHNlLCBPU19aRVJPIH0sCisgIC8qIHIvbSA9PSAxMDAgKi8geyBmYWxzZSwgZmFsc2UsIE9TX1pFUk8gfSwKKyAgLyogci9tID09IDEwMSAqLyB7IGZhbHNlLCBmYWxzZSwgT1NfWkVSTyB9LAorICAvKiByL20gPT0gMTEwICovIHsgZmFsc2UsIGZhbHNlLCBPU19aRVJPIH0sCisgIC8qIHIvbSA9PSAxMTEgKi8geyBmYWxzZSwgZmFsc2UsIE9TX1pFUk8gfSwKK307CisKK307ICAvLyBuYW1lc3BhY2Ugc2lkZXN0ZXAKZGlmZiAtLWdpdCBhL3NyYy93aW5kb3dzL2lhMzJfb3Bjb2RlX21hcC5jYyBiL3NyYy93aW5kb3dzL2lhMzJfb3Bjb2RlX21hcC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTZhNzllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3MvaWEzMl9vcGNvZGVfbWFwLmNjCkBAIC0wLDAgKzEsMTIxOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDA3LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAtLS0KKyAqIEF1dGhvcjogSm9pIFNpZ3VyZHNzb24KKyAqCisgKiBPcGNvZGUgZGVjb2RpbmcgbWFwcy4gIEJhc2VkIG9uIHRoZSBJQS0zMiBJbnRlbK4gQXJjaGl0ZWN0dXJlCisgKiBTb2Z0d2FyZSBEZXZlbG9wZXKScyBNYW51YWwgVm9sdW1lIDI6IEluc3RydWN0aW9uIFNldCBSZWZlcmVuY2UuICBJZGVhCisgKiBmb3IgaG93IHRvIGxheSBvdXQgdGhlIHRhYmxlcyBpbiBtZW1vcnkgdGFrZW4gZnJvbSB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGluIHRoZSBCYXN0YXJkIGRpc2Fzc2VtYmx5IGVudmlyb25tZW50LgorICovCisKKyNpbmNsdWRlICJtaW5pX2Rpc2Fzc2VtYmxlci5oIgorCituYW1lc3BhY2Ugc2lkZXN0ZXAgeworCisvKgorKiBUaGlzIGlzIHRoZSBmaXJzdCB0YWJsZSB0byBiZSBzZWFyY2hlZDsgdGhlIGZpcnN0IGZpZWxkIG9mIGVhY2gKKyogT3Bjb2RlIGluIHRoZSB0YWJsZSBpcyBlaXRoZXIgMCB0byBpbmRpY2F0ZSB5b3UncmUgaW4gdGhlCisqIHJpZ2h0IHRhYmxlLCBvciBhbiBpbmRleCB0byB0aGUgY29ycmVjdCB0YWJsZSwgaW4gdGhlIGdsb2JhbAorKiBtYXAgZ19wZW50aXVtT3Bjb2RlTWFwCisqLworY29uc3QgT3Bjb2RlIHNfZmlyc3Rfb3Bjb2RlX2J5dGVbXSA9IHsKKyAgLyogMHgwICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0cgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImFkZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9HIHwgT1RfViwgQU1fTk9UX1VTRUQsICJhZGQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfQiwgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCAiYWRkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImFkZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAiYWRkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9JIHwgT1RfViwgQU1fTk9UX1VTRUQsICJhZGQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1csIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInB1c2giLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDcgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1csIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInBvcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9HIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJvciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9HIHwgT1RfViwgQU1fTk9UX1VTRUQsICJvciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9CLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJvciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsICJvciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAib3IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm9yIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhFICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9XLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwdXNoIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhGICovIHsgMSwgSVRfUkVGRVJFTkNFLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDEwICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0cgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImFkYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MTEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fRyB8IE9UX1YsIEFNX05PVF9VU0VELCAiYWRjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgxMiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9CLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJhZGMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDEzICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImFkYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MTQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImFkYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MTUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImFkYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MTYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1csIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInB1c2giLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDE3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9XLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwb3AiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDE4ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0cgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInNiYiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MTkgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fRyB8IE9UX1YsIEFNX05PVF9VU0VELCAic2JiIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgxQSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9CLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzYmIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDFCICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgInNiYiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MUMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInNiYiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MUQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgInNiYiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MUUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1csIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInB1c2giLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDFGICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9XLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwb3AiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDIwICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0cgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImFuZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MjEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fRyB8IE9UX1YsIEFNX05PVF9VU0VELCAiYW5kIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyMiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9CLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJhbmQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDIzICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImFuZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MjQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImFuZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MjUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImFuZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MjYgKi8geyAwLCBJVF9QUkVGSVgsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MjcgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiZGFhIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyOCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9HIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzdWIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDI5ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0cgfCBPVF9WLCBBTV9OT1RfVVNFRCwgInN1YiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MkEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfQiwgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCAic3ViIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyQiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsICJzdWIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDJDICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzdWIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDJEICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9JIHwgT1RfViwgQU1fTk9UX1VTRUQsICJzdWIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDJFICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDJGICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImRhcyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MzAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fRyB8IE9UX0IsIEFNX05PVF9VU0VELCAieG9yIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzMSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9HIHwgT1RfViwgQU1fTk9UX1VTRUQsICJ4b3IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDMyICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX0IsIEFNX0UgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInhvciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MzMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCAieG9yIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzNCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAieG9yIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzNSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fSSB8IE9UX1YsIEFNX05PVF9VU0VELCAieG9yIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzNiAqLyB7IDAsIElUX1BSRUZJWCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzNyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJhYWEiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDM4ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0cgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImNtcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MzkgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fRyB8IE9UX1YsIEFNX05PVF9VU0VELCAiY21wIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzQSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9CLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJjbXAiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDNCICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImNtcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4M0MgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImNtcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4M0QgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImNtcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4M0UgKi8geyAwLCBJVF9QUkVGSVgsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4M0YgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiYWFzIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyNpZmRlZiBfTV9YNjQKKyAgLyogUkVYIFByZWZpeGVzIGluIDY0LWJpdCBtb2RlLiAqLworICAvKiAweDQwICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQxICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQyICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQzICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQ0ICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQ1ICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQ2ICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQ3ICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQ4ICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQ5ICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDRBICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDRCICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDRDICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDREICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDRFICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDRGICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorI2Vsc2UKKyAgLyogMHg0MCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaW5jIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaW5jIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0MiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaW5jIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0MyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaW5jIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaW5jIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0NSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaW5jIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaW5jIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0NyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaW5jIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0OCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiZGVjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0OSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiZGVjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0QSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiZGVjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0QiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiZGVjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0QyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiZGVjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0RCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiZGVjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0RSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiZGVjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0RiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiZGVjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyNlbmRpZgorICAvKiAweDUwICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwdXNoIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicHVzaCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NTIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInB1c2giLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDUzICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwdXNoIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicHVzaCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NTUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInB1c2giLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDU2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwdXNoIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1NyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicHVzaCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NTggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInBvcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NTkgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInBvcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NUEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInBvcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NUIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInBvcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NUMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInBvcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NUQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInBvcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NUUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInBvcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NUYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInBvcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NjAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicHVzaGFkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwb3BhZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NjIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fTSB8IE9UX0EsIEFNX05PVF9VU0VELCAiYm91bmQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDYzICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1csIEFNX0cgfCBPVF9XLCBBTV9OT1RfVVNFRCwgImFycGwiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDY0ICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDY1ICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDY2ICovIHsgMCwgSVRfUFJFRklYX09QRVJBTkQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NjcgKi8geyAwLCBJVF9QUkVGSVhfQUREUkVTUywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2OCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwdXNoIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2OSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX1YsICJpbXVsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2QSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwdXNoIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2QiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fSSB8ICBPVF9CLCAiaW11bCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NkMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9ZIHwgT1RfQiwgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImluc2IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDZEICovIHsgMCwgSVRfR0VORVJJQywgQU1fWSB8IE9UX1YsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsICJpbnNkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2RSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fWCB8IE9UX0IsIEFNX05PVF9VU0VELCAib3V0c2IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDZGICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9YIHwgT1RfViwgQU1fTk9UX1VTRUQsICJvdXRzYiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NzAgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiam8iLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDcxICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpubyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NzIgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiamMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDczICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpuYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NzQgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAianoiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDc1ICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpueiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NzYgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiamJlIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3NyAqLyB7IDAsIElUX0pVTVAsIEFNX0ogfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJqYSIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NzggKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAianMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDc5ICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpucyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4N0EgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAianBlIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3QiAqLyB7IDAsIElUX0pVTVAsIEFNX0ogfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJqcG8iLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDdDICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3RCAqLyB7IDAsIElUX0pVTVAsIEFNX0ogfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJqZ2UiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDdFICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpsZSIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4N0YgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiamciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDgwICovIHsgMiwgSVRfUkVGRVJFTkNFLCBBTV9FIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDgxICovIHsgMywgSVRfUkVGRVJFTkNFLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX1YsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDgyICovIHsgNCwgSVRfUkVGRVJFTkNFLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDgzICovIHsgNSwgSVRfUkVGRVJFTkNFLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDg0ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0cgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInRlc3QiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDg1ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0cgfCBPVF9WLCBBTV9OT1RfVVNFRCwgInRlc3QiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDg2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0cgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInhjaGciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDg3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0cgfCBPVF9WLCBBTV9OT1RfVVNFRCwgInhjaGciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDg4ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0cgfCBPVF9CLCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4ODkgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fRyB8IE9UX1YsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg4QSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9CLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJtb3YiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDhCICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OEMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfVywgQU1fUyB8IE9UX1csIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg4RCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9NIHwgT1RfQUREUkVTU19NT0RFX00sIEFNX05PVF9VU0VELCAibGVhIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg4RSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1MgfCBPVF9XLCBBTV9FIHwgT1RfVywgQU1fTk9UX1VTRUQsICJtb3YiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDhGICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInBvcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OTAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAibm9wIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg5MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9OT1RfVVNFRCwgInhjaGciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDkyICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCAieGNoZyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OTMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsICJ4Y2hnIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg5NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9OT1RfVVNFRCwgInhjaGciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDk1ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX05PVF9VU0VELCAieGNoZyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OTYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsICJ4Y2hnIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg5NyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9OT1RfVVNFRCwgInhjaGciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDk4ICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImN3ZGUiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDk5ICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImNkcSIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OUEgKi8geyAwLCBJVF9KVU1QLCBBTV9BIHwgT1RfUCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiY2FsbGYiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDlCICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgIndhaXQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDlDICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInB1c2hmZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OUQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicG9wZmQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDlFICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInNhaGYiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDlGICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImxhaGYiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEEwICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9PIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJtb3YiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEExICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9PIHwgT1RfViwgQU1fTk9UX1VTRUQsICJtb3YiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEEyICovIHsgMCwgSVRfR0VORVJJQywgQU1fTyB8IE9UX0IsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJtb3YiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEEzICovIHsgMCwgSVRfR0VORVJJQywgQU1fTyB8IE9UX1YsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fTk9UX1VTRUQsICJtb3YiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEE0ICovIHsgMCwgSVRfR0VORVJJQywgQU1fWCB8IE9UX0IsIEFNX1kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgIm1vdnNiIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhBNSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1ggfCBPVF9WLCBBTV9ZIHwgT1RfViwgQU1fTk9UX1VTRUQsICJtb3ZzZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QTYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9YIHwgT1RfQiwgQU1fWSB8IE9UX0IsIEFNX05PVF9VU0VELCAiY21wc2IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEE3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fWCB8IE9UX1YsIEFNX1kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImNtcHNkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhBOCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAidGVzdCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QTkgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgInRlc3QiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEFBICovIHsgMCwgSVRfR0VORVJJQywgQU1fWSB8IE9UX0IsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzdG9zYiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QUIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9ZIHwgT1RfViwgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9OT1RfVVNFRCwgInN0b3NkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhBQyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fWHwgT1RfQiwgQU1fTk9UX1VTRUQsICJsb2RzYiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QUQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX1h8IE9UX1YsIEFNX05PVF9VU0VELCAibG9kc2QiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEFFICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9ZIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzY2FzYiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QUYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX1kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgInNjYXNkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCMCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCMSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCMiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCMyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCNCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCNSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCNiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCNyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyNpZmRlZiBfTV9YNjQKKyAgLyogMHhCOCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fSSB8IE9UX1YgfCBJT1NfNjQsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCOSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fSSB8IE9UX1YgfCBJT1NfNjQsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCQSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fSSB8IE9UX1YgfCBJT1NfNjQsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCQiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fSSB8IE9UX1YgfCBJT1NfNjQsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCQyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fSSB8IE9UX1YgfCBJT1NfNjQsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCRCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fSSB8IE9UX1YgfCBJT1NfNjQsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCRSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fSSB8IE9UX1YgfCBJT1NfNjQsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCRiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fSSB8IE9UX1YgfCBJT1NfNjQsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyNlbHNlCisgIC8qIDB4QjggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QjkgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QkEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QkIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QkMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QkQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QkUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QkYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisjZW5kaWYKKyAgLyogMHhDMCAqLyB7IDYsIElUX1JFRkVSRU5DRSwgQU1fRSB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDMSAqLyB7IDcsIElUX1JFRkVSRU5DRSwgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDMiAqLyB7IDAsIElUX1JFVFVSTiwgQU1fSSB8IE9UX1csIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInJldCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QzMgKi8geyAwLCBJVF9SRVRVUk4sIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJyZXQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEM0ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX00gfCBPVF9QLCBBTV9OT1RfVVNFRCwgImxlcyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QzUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fTSB8IE9UX1AsIEFNX05PVF9VU0VELCAibGRzIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDNiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJtb3YiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEM3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QzggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9JIHwgT1RfVywgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAiZW50ZXIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEM5ICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImxlYXZlIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDQSAqLyB7IDAsIElUX1JFVFVSTiwgQU1fSSB8IE9UX1csIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInJldGYiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweENCICovIHsgMCwgSVRfUkVUVVJOLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicmV0ZiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4Q0MgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaW50MyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4Q0QgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaW50IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDRSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJpbnRvIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDRiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJpcmV0IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhEMCAqLyB7IDgsIElUX1JFRkVSRU5DRSwgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhEMSAqLyB7IDksIElUX1JFRkVSRU5DRSwgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhEMiAqLyB7IDEwLCBJVF9SRUZFUkVOQ0UsIEFNX0UgfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RDMgKi8geyAxMSwgSVRfUkVGRVJFTkNFLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEQ0ICovIHsgMCwgSVRfR0VORVJJQywgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImFhbSIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RDUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiYWFkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhENiAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhENyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJ4bGF0IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgCisgIC8vIFRoZSBmb2xsb3dpbmcgOCBsaW5lcyB3b3VsZCBiZSByZWZlcmVuY2VzIHRvIHRoZSBGUFUgdGFibGVzLCBidXQgd2UgY3VycmVudGx5CisgIC8vIGRvIG5vdCBzdXBwb3J0IHRoZSBGUFUgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgZGlzYXNzZW1ibGVyLgorICAKKyAgLyogMHhEOCAqLyB7IDAsIElUX1VOS05PV04sIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RDkgKi8geyAwLCBJVF9VTktOT1dOLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweERBICovIHsgMCwgSVRfVU5LTk9XTiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhEQiAqLyB7IDAsIElUX1VOS05PV04sIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4REMgKi8geyAwLCBJVF9VTktOT1dOLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEREICovIHsgMCwgSVRfVU5LTk9XTiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhERSAqLyB7IDAsIElUX1VOS05PV04sIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4REYgKi8geyAwLCBJVF9VTktOT1dOLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAKKyAgCisgIC8qIDB4RTAgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAibG9vcG56IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhFMSAqLyB7IDAsIElUX0pVTVAsIEFNX0ogfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJsb29weiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RTIgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAibG9vcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RTMgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiamN4eiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RTQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImluIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhFNSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAiaW4iLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEU2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fSSB8IE9UX0IsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJvdXQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEU3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fSSB8IE9UX0IsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJvdXQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEU4ICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImNhbGwiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEU5ICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImptcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RUEgKi8geyAwLCBJVF9KVU1QLCBBTV9BIHwgT1RfUCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiam1wIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhFQiAqLyB7IDAsIElUX0pVTVAsIEFNX0ogfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJqbXAiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEVDICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9SRUdJU1RFUiB8IE9UX1csIEFNX05PVF9VU0VELCAiaW4iLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEVEICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9SRUdJU1RFUiB8IE9UX1csIEFNX05PVF9VU0VELCAiaW4iLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEVFICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9XLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX05PVF9VU0VELCAib3V0IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhFRiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfVywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm91dCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RjAgKi8geyAwLCBJVF9QUkVGSVgsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJsb2NrOiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RjEgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RjIgKi8geyAwLCBJVF9QUkVGSVgsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJyZXBuZToiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEYzICovIHsgMCwgSVRfUFJFRklYLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicmVwOiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RjQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaGx0IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhGNSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJjbWMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEY2ICovIHsgMTIsIElUX1JFRkVSRU5DRSwgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhGNyAqLyB7IDEzLCBJVF9SRUZFUkVOQ0UsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RjggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiY2xjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhGOSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJzdGMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEZBICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImNsaSIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RkIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAic3RpIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhGQyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJjbGQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEZEICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInN0ZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RkUgKi8geyAxNCwgSVRfUkVGRVJFTkNFLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEZGICovIHsgMTUsIElUX1JFRkVSRU5DRSwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfQorfTsKKworY29uc3QgT3Bjb2RlIHNfb3Bjb2RlX2J5dGVfYWZ0ZXJfMGZbXSA9IHsKKyAgLyogMHgwICovIHsgMTYsIElUX1JFRkVSRU5DRSwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgxICovIHsgMTcsIElUX1JFRkVSRU5DRSwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9XLCBBTV9OT1RfVVNFRCwgImxhciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfVywgQU1fTk9UX1VTRUQsICJsc2wiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NSAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImNsdHMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDcgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJpbnZkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg5ICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgIndiaW52ZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QSAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCICovIHsgMCwgSVRfVU5VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAidWQyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDICovIHsgMCwgSVRfVU5VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEQgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RSAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhGICovIHsgMCwgSVRfVU5VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDEwICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BTLCBBTV9XIHwgT1RfUFMsIEFNX05PVF9VU0VELCAibW92dXBzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfU0QsIEFNX1cgfCBPVF9TRCwgQU1fTk9UX1VTRUQsICJtb3ZzZCIgfSwKKyAgICAvKiBGM2ggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfU1MsIEFNX1cgfCBPVF9TUywgQU1fTk9UX1VTRUQsICJtb3ZzcyIgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUEQsIEFNX1cgfCBPVF9QRCwgQU1fTk9UX1VTRUQsICJtb3Z1cGQiIH0gfSwKKyAgLyogMHgxMSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1cgfCBPVF9QUywgQU1fViB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgIm1vdnVwcyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCwgSVRfR0VORVJJQywgQU1fVyB8IE9UX1NELCBBTV9WIHwgT1RfU0QsIEFNX05PVF9VU0VELCAibW92c2QiIH0sCisgICAgLyogRjNoICovIHsgMCwgSVRfR0VORVJJQywgQU1fVyB8IE9UX1NTLCBBTV9WIHwgT1RfU1MsIEFNX05PVF9VU0VELCAibW92c3MiIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fVyB8IE9UX1BELCBBTV9WIHwgT1RfUEQsIEFNX05PVF9VU0VELCAibW92dXBkIiB9IH0sCisgIC8qIDB4MTIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9XIHwgT1RfUSwgQU1fViB8IE9UX1EsIEFNX05PVF9VU0VELCAibW92bHBzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUSwgQU1fViB8IE9UX1EsIEFNX05PVF9VU0VELCAibW92aGxwcyIgfSwgIC8vIG9ubHkgb25lIG9mIC4uLgorICAgIC8qIEYzaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9RLCBBTV9WIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJtb3ZobHBzIiB9LCAgLy8gLi4udGhlc2UgdHdvIGlzIGNvcnJlY3QsIEludGVsIGRvZXNuJ3Qgc3BlY2lmeSB3aGljaAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9RLCBBTV9XIHwgT1RfUywgQU1fTk9UX1VTRUQsICJtb3ZscGQiIH0gfSwKKyAgLyogMHgxMyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9RLCBBTV9XIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJtb3ZscHMiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1EsIEFNX1cgfCBPVF9RLCBBTV9OT1RfVVNFRCwgIm1vdmxwZCIgfSB9LAorICAvKiAweDE0ICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BTLCBBTV9XIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJ1bnBja2xwcyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUEQsIEFNX1cgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInVucGNrbHBkIiB9IH0sCisgIC8qIDB4MTUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUFMsIEFNX1cgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInVucGNraHBzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QRCwgQU1fVyB8IE9UX1EsIEFNX05PVF9VU0VELCAidW5wY2tocGQiIH0gfSwKKyAgLyogMHgxNiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9RLCBBTV9XIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJtb3ZocHMiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9RLCBBTV9WIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJtb3ZsaHBzIiB9LCAgLy8gb25seSBvbmUgb2YuLi4KKyAgICAvKiBGM2ggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUSwgQU1fViB8IE9UX1EsIEFNX05PVF9VU0VELCAibW92bGhwcyIgfSwgIC8vIC4uLnRoZXNlIHR3byBpcyBjb3JyZWN0LCBJbnRlbCBkb2Vzbid0IHNwZWNpZnkgd2hpY2gKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUSwgQU1fVyB8IE9UX1EsIEFNX05PVF9VU0VELCAibW92aHBkIiB9IH0sCisgIC8qIDB4MTcgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9XIHwgT1RfUSwgQU1fViB8IE9UX1EsIEFNX05PVF9VU0VELCAibW92aHBzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1cgfCBPVF9RLCBBTV9WIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJtb3ZocGQiIH0gfSwKKyAgLyogMHgxOCAqLyB7IDE4LCBJVF9SRUZFUkVOQ0UsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MTkgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MUEgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MUIgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MUMgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MUQgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MUUgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MUYgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MjAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SIHwgT1RfRCwgQU1fQyB8IE9UX0QsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyMSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1IgfCBPVF9ELCBBTV9EIHwgT1RfRCwgQU1fTk9UX1VTRUQsICJtb3YiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDIyICovIHsgMCwgSVRfR0VORVJJQywgQU1fQyB8IE9UX0QsIEFNX1IgfCBPVF9ELCBBTV9OT1RfVVNFRCwgIm1vdiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MjMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9EIHwgT1RfRCwgQU1fUiB8IE9UX0QsIEFNX05PVF9VU0VELCAibW92IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyNCAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyNSAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyNiAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyNyAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyOCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QUywgQU1fVyB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgIm1vdmFwcyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUEQsIEFNX1cgfCBPVF9QRCwgQU1fTk9UX1VTRUQsICJtb3ZhcGQiIH0gfSwKKyAgLyogMHgyOSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1cgfCBPVF9QUywgQU1fViB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgIm1vdmFwcyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9XIHwgT1RfUEQsIEFNX1YgfCBPVF9QRCwgQU1fTk9UX1VTRUQsICJtb3ZhcGQiIH0gfSwKKyAgLyogMHgyQSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QUywgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAiY3Z0cGkycHMiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9TRCwgQU1fRSB8IE9UX0QsIEFNX05PVF9VU0VELCAiY3Z0c2kyc2QiIH0sCisgICAgLyogRjNoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1NTLCBBTV9FIHwgT1RfRCwgQU1fTk9UX1VTRUQsICJjdnRzaTJzcyIgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUEQsIEFNX1EgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJjdnRwaTJwZCIgfSB9LAorICAvKiAweDJCICovIHsgMCwgSVRfR0VORVJJQywgQU1fVyB8IE9UX1BTLCBBTV9WIHwgT1RfUFMsIEFNX05PVF9VU0VELCAibW92bnRwcyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9XIHwgT1RfUEQsIEFNX1YgfCBPVF9QRCwgQU1fTk9UX1VTRUQsICJtb3ZudHBkIiB9IH0sCisgIC8qIDB4MkMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9RIHwgT1RfUSwgQU1fVyB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgImN2dHRwczJwaSIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX0QsIEFNX1cgfCBPVF9TRCwgQU1fTk9UX1VTRUQsICJjdnR0c2Qyc2kiIH0sCisgICAgLyogRjNoICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX0QsIEFNX1cgfCBPVF9TUywgQU1fTk9UX1VTRUQsICJjdnR0c3Myc2kiIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fUSB8IE9UX0RRLCBBTV9XIHwgT1RfUEQsIEFNX05PVF9VU0VELCAiY3Z0dHBkMnBpIiB9IH0sCisgIC8qIDB4MkQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9RIHwgT1RfUSwgQU1fVyB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgImN2dHBzMnBpIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfRCwgQU1fVyB8IE9UX1NELCBBTV9OT1RfVVNFRCwgImN2dHNkMnNpIiB9LAorICAgIC8qIEYzaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9ELCBBTV9XIHwgT1RfU1MsIEFNX05PVF9VU0VELCAiY3Z0c3Myc2kiIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fUSB8IE9UX0RRLCBBTV9XIHwgT1RfUEQsIEFNX05PVF9VU0VELCAiY3Z0cGQycGkiIH0gfSwKKyAgLyogMHgyRSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9TUywgQU1fVyB8IE9UX1NTLCBBTV9OT1RfVVNFRCwgInVjb21pc3MiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1NELCBBTV9XIHwgT1RfU0QsIEFNX05PVF9VU0VELCAidWNvbWlzZCIgfSB9LAorICAvKiAweDJGICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BTLCBBTV9XIHwgT1RfU1MsIEFNX05PVF9VU0VELCAiY29taXNzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9TRCwgQU1fVyB8IE9UX1NELCBBTV9OT1RfVVNFRCwgImNvbWlzZCIgfSB9LAorICAvKiAweDMwICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgIndybXNyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzMSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJyZHRzYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MzIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicmRtc3IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDMzICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInJkcG1jIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzNCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJzeXNlbnRlciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MzUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAic3lzZXhpdCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MzYgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MzcgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MzggKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MzkgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4M0EgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4M0IgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4M0MgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCAibW92bnRpIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzRCAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzRSAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzRiAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0MCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsICJjbW92byIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NDEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCAiY21vdm5vIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0MiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsICJjbW92YyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NDMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCAiY21vdm5jIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsICJjbW92eiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NDUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCAiY21vdm56IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsICJjbW92YmUiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQ3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImNtb3ZhIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0OCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsICJjbW92cyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NDkgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCAiY21vdm5zIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0QSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsICJjbW92cGUiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDRCICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImNtb3ZwbyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NEMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCAiY21vdmwiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDREICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImNtb3ZnZSIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NEUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCAiY21vdmxlIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0RiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsICJjbW92ZyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NTAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfRCwgQU1fViB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgIm1vdm1za3BzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9ELCBBTV9WIHwgT1RfUEQsIEFNX05PVF9VU0VELCAibW92bXNrcGQiIH0gfSwKKyAgLyogMHg1MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QUywgQU1fVyB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgInNxcnRwcyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1NELCBBTV9XIHwgT1RfU0QsIEFNX05PVF9VU0VELCAic3FydHNkIiB9LAorICAgIC8qIEYzaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9TUywgQU1fVyB8IE9UX1NTLCBBTV9OT1RfVVNFRCwgInNxcnRzcyIgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUEQsIEFNX1cgfCBPVF9QRCwgQU1fTk9UX1VTRUQsICJzcXJ0cGQiIH0gfSwKKyAgLyogMHg1MiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QUywgQU1fVyB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgInJzcXJ0cHMiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfU1MsIEFNX1cgfCBPVF9TUywgQU1fTk9UX1VTRUQsICJyc3FydHNzIiB9LAorICAgIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDUzICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BTLCBBTV9XIHwgT1RfUFMsIEFNX05PVF9VU0VELCAicmNwcHMiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfU1MsIEFNX1cgfCBPVF9TUywgQU1fTk9UX1VTRUQsICJyY3BzcyIgfSwKKyAgICAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QUywgQU1fVyB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgImFuZHBzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QRCwgQU1fVyB8IE9UX1BELCBBTV9OT1RfVVNFRCwgImFuZHBkIiB9IH0sCisgIC8qIDB4NTUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUFMsIEFNX1cgfCBPVF9QUywgQU1fTk9UX1VTRUQsICJhbmRucHMiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BELCBBTV9XIHwgT1RfUEQsIEFNX05PVF9VU0VELCAiYW5kbnBkIiB9IH0sCisgIC8qIDB4NTYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUFMsIEFNX1cgfCBPVF9QUywgQU1fTk9UX1VTRUQsICJvcnBzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QRCwgQU1fVyB8IE9UX1BELCBBTV9OT1RfVVNFRCwgIm9ycGQiIH0gfSwKKyAgLyogMHg1NyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QUywgQU1fVyB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgInhvcnBzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QRCwgQU1fVyB8IE9UX1BELCBBTV9OT1RfVVNFRCwgInhvcnBkIiB9IH0sCisgIC8qIDB4NTggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUFMsIEFNX1cgfCBPVF9QUywgQU1fTk9UX1VTRUQsICJhZGRwcyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1NELCBBTV9XIHwgT1RfU0QsIEFNX05PVF9VU0VELCAiYWRkc2QiIH0sCisgICAgLyogRjNoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1NTLCBBTV9XIHwgT1RfU1MsIEFNX05PVF9VU0VELCAiYWRkc3MiIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BELCBBTV9XIHwgT1RfUEQsIEFNX05PVF9VU0VELCAiYWRkcGQiIH0gfSwKKyAgLyogMHg1OSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QUywgQU1fVyB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgIm11bHBzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfU0QsIEFNX1cgfCBPVF9TRCwgQU1fTk9UX1VTRUQsICJtdWxzZCIgfSwKKyAgICAvKiBGM2ggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfU1MsIEFNX1cgfCBPVF9TUywgQU1fTk9UX1VTRUQsICJtdWxzcyIgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUEQsIEFNX1cgfCBPVF9QRCwgQU1fTk9UX1VTRUQsICJtdWxwZCIgfSB9LAorICAvKiAweDVBICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BELCBBTV9XIHwgT1RfUFMsIEFNX05PVF9VU0VELCAiY3Z0cHMycGQiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9TRCwgQU1fVyB8IE9UX1NELCBBTV9OT1RfVVNFRCwgImN2dHNkMnNzIiB9LAorICAgIC8qIEYzaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9TUywgQU1fVyB8IE9UX1NTLCBBTV9OT1RfVVNFRCwgImN2dHNzMnNkIiB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QUywgQU1fVyB8IE9UX1BELCBBTV9OT1RfVVNFRCwgImN2dHBkMnBzIiB9IH0sCisgIC8qIDB4NUIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUFMsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJjdnRkcTJwcyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgImN2dHRwczJkcSIgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9QUywgQU1fTk9UX1VTRUQsICJjdnRwczJkcSIgfSB9LAorICAvKiAweDVDICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BTLCBBTV9XIHwgT1RfUFMsIEFNX05PVF9VU0VELCAic3VicHMiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9TRCwgQU1fVyB8IE9UX1NELCBBTV9OT1RfVVNFRCwgInN1YnNkIiB9LAorICAgIC8qIEYzaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9TUywgQU1fVyB8IE9UX1NTLCBBTV9OT1RfVVNFRCwgInN1YnNzIiB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QRCwgQU1fVyB8IE9UX1BELCBBTV9OT1RfVVNFRCwgInN1YnBkIiB9IH0sCisgIC8qIDB4NUQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUFMsIEFNX1cgfCBPVF9QUywgQU1fTk9UX1VTRUQsICJtaW5wcyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1NELCBBTV9XIHwgT1RfU0QsIEFNX05PVF9VU0VELCAibWluc2QiIH0sCisgICAgLyogRjNoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1NTLCBBTV9XIHwgT1RfU1MsIEFNX05PVF9VU0VELCAibWluc3MiIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BELCBBTV9XIHwgT1RfUEQsIEFNX05PVF9VU0VELCAibWlucGQiIH0gfSwKKyAgLyogMHg1RSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QUywgQU1fVyB8IE9UX1BTLCBBTV9OT1RfVVNFRCwgImRpdnBzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfU0QsIEFNX1cgfCBPVF9TRCwgQU1fTk9UX1VTRUQsICJkaXZzZCIgfSwKKyAgICAvKiBGM2ggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfU1MsIEFNX1cgfCBPVF9TUywgQU1fTk9UX1VTRUQsICJkaXZzcyIgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfUEQsIEFNX1cgfCBPVF9QRCwgQU1fTk9UX1VTRUQsICJkaXZwZCIgfSB9LAorICAvKiAweDVGICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BTLCBBTV9XIHwgT1RfUFMsIEFNX05PVF9VU0VELCAibWF4cHMiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9TRCwgQU1fVyB8IE9UX1NELCBBTV9OT1RfVVNFRCwgIm1heHNkIiB9LAorICAgIC8qIEYzaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9TUywgQU1fVyB8IE9UX1NTLCBBTV9OT1RfVVNFRCwgIm1heHNzIiB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QRCwgQU1fVyB8IE9UX1BELCBBTV9OT1RfVVNFRCwgIm1heHBkIiB9IH0sCisgIC8qIDB4NjAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX0QsIEFNX05PVF9VU0VELCAicHVucGNrbGJ3IiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInB1bnBja2xidyIgfSB9LAorICAvKiAweDYxICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9ELCBBTV9OT1RfVVNFRCwgInB1bnBja2x3ZCIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwdW5wY2tsd2QiIH0gfSwKKyAgLyogMHg2MiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfRCwgQU1fTk9UX1VTRUQsICJwdW5wY2tsZHEiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicHVucGNrbGRxIiB9IH0sCisgIC8qIDB4NjMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX0QsIEFNX05PVF9VU0VELCAicGFja3Nzd2IiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicGFja3Nzd2IiIH0gfSwKKyAgLyogMHg2NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfRCwgQU1fTk9UX1VTRUQsICJwY21wZ3RiIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBjbXBndGIiIH0gfSwKKyAgLyogMHg2NSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfRCwgQU1fTk9UX1VTRUQsICJwY21wZ3R3IiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBjbXBndHciIH0gfSwKKyAgLyogMHg2NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfRCwgQU1fTk9UX1VTRUQsICJwY21wZ3RkIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBjbXBndGQiIH0gfSwKKyAgLyogMHg2NyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfRCwgQU1fTk9UX1VTRUQsICJwYWNrdXN3YiIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwYWNrdXN3YiIgfSB9LAorICAvKiAweDY4ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9ELCBBTV9OT1RfVVNFRCwgInB1bnBja2hidyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfRFEsIEFNX1EgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwdW5wY2toYnciIH0gfSwKKyAgLyogMHg2OSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfRCwgQU1fTk9UX1VTRUQsICJwdW5wY2tod2QiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX0RRLCBBTV9RIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicHVucGNraHdkIiB9IH0sCisgIC8qIDB4NkEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX0QsIEFNX05PVF9VU0VELCAicHVucGNraGRxIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9EUSwgQU1fUSB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInB1bnBja2hkcSIgfSB9LAorICAvKiAweDZCICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9ELCBBTV9OT1RfVVNFRCwgInBhY2tzc2R3IiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9EUSwgQU1fUSB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBhY2tzc2R3IiB9IH0sCisgIC8qIDB4NkMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAibm90IHVzZWQgd2l0aG91dCBwcmVmaXgiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicHVucGNrbHFkcSIgfSB9LAorICAvKiAweDZEICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgIm5vdCB1c2VkIHdpdGhvdXQgcHJlZml4IiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInB1bnBja2xxZHEiIH0gfSwKKyAgLyogMHg2RSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9ELCBBTV9FIHwgT1RfRCwgQU1fTk9UX1VTRUQsICJtb3ZkIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fRSB8IE9UX0QsIEFNX05PVF9VU0VELCAibW92ZCIgfSB9LAorICAvKiAweDZGICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9ELCBBTV9OT1RfVVNFRCwgIm1vdnEiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJtb3ZkcXUiIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAibW92ZHFhIiB9IH0sCisgIC8qIDB4NzAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX0kgfCAgT1RfQiwgInBzaHVmIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fSSB8IE9UX0IsICJwc2h1Zmx3IiB9LAorICAgIC8qIEYzaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9JIHwgT1RfQiwgInBzaHVmaHciIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX0kgfCBPVF9CLCAicHNodWZkIiB9IH0sCisgIC8qIDB4NzEgKi8geyAxOSwgSVRfUkVGRVJFTkNFLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDcyICovIHsgMjAsIElUX1JFRkVSRU5DRSwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3MyAqLyB7IDIxLCBJVF9SRUZFUkVOQ0UsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NzQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicGNtcGVxYiIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwY21wZXFiIiB9IH0sCisgIC8qIDB4NzUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicGNtcGVxdyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwY21wZXF3IiB9IH0sCisgIC8qIDB4NzYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicGNtcGVxZCIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwY21wZXFkIiB9IH0sCisgIC8qIDB4NzcgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiZW1tcyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIAorICAvLyBUaGUgZm9sbG93aW5nIHNpeCBvcGNvZGVzIGFyZSBlc2NhcGVzIGludG8gdGhlIE1NWCBzdHVmZiwgd2hpY2ggdGhpcyBkaXNhc3NlbWJsZXIgZG9lcyBub3Qgc3VwcG9ydC4KKyAgLyogMHg3OCAqLyB7IDAsIElUX1VOS05PV04sIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NzkgKi8geyAwLCBJVF9VTktOT1dOLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDdBICovIHsgMCwgSVRfVU5LTk9XTiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3QiAqLyB7IDAsIElUX1VOS05PV04sIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4N0MgKi8geyAwLCBJVF9VTktOT1dOLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDdEICovIHsgMCwgSVRfVU5LTk9XTiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgCisgIC8qIDB4N0UgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfRCwgQU1fUCB8IE9UX0QsIEFNX05PVF9VU0VELCAibW92ZCIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9RLCBBTV9XIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJtb3ZxIiB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9ELCBBTV9WIHwgT1RfRFEsIEFNX05PVF9VU0VELCAibW92ZCIgfSB9LAorICAvKiAweDdGICovIHsgMCwgSVRfR0VORVJJQywgQU1fUSB8IE9UX1EsIEFNX1AgfCBPVF9RLCBBTV9OT1RfVVNFRCwgIm1vdnEiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9XIHwgT1RfRFEsIEFNX1YgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJtb3ZkcXUiIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fVyB8IE9UX0RRLCBBTV9WIHwgT1RfRFEsIEFNX05PVF9VU0VELCAibW92ZHFhIiB9IH0sCisgIC8qIDB4ODAgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiam8iLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDgxICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpubyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4ODIgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiamMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDgzICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpuYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4ODQgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAianoiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDg1ICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpueiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4ODYgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiamJlIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg4NyAqLyB7IDAsIElUX0pVTVAsIEFNX0ogfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJqYSIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4ODggKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAianMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDg5ICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpucyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OEEgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAianBlIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg4QiAqLyB7IDAsIElUX0pVTVAsIEFNX0ogfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJqcG8iLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDhDICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg4RCAqLyB7IDAsIElUX0pVTVAsIEFNX0ogfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJqZ2UiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDhFICovIHsgMCwgSVRfSlVNUCwgQU1fSiB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImpsZSIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OEYgKi8geyAwLCBJVF9KVU1QLCBBTV9KIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiamciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDkwICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInNldG8iLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDkxICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInNldG5vIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg5MiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJzZXRjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg5MyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJzZXRuYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OTQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAic2V0eiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OTUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAic2V0bnoiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDk2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInNldGJlIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg5NyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJzZXRhIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg5OCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJzZXRzIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg5OSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJzZXRucyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OUEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAic2V0cGUiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDlCICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInNldHBvIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg5QyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJzZXRsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg5RCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJzZXRnZSIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4OUUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAic2V0bGUiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDlGICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInNldGciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEEwICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9XLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwdXNoIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhBMSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfVywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicG9wIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhBMiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJjcHVpZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QTMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fRyB8IE9UX1YsIEFNX05PVF9VU0VELCAiYnQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEE0ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0cgfCBPVF9WLCBBTV9JIHwgT1RfQiwgInNobGQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEE1ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0cgfCBPVF9WLCBBTV9JIHwgT1RfQiB8IEFNX1JFR0lTVEVSLCAic2hsZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QTYgKi8geyAwLCBJVF9VTktOT1dOLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEE3ICovIHsgMCwgSVRfVU5LTk9XTiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhBOCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfVywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicHVzaCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QTkgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1csIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInBvcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QUEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicnNtIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhBQiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9HIHwgT1RfViwgQU1fTk9UX1VTRUQsICJidHMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEFDICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0cgfCBPVF9WLCBBTV9JIHwgT1RfQiwgInNocmQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEFEICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0cgfCBPVF9WLCBBTV9JIHwgT1RfQiB8IEFNX1JFR0lTVEVSLCAic2hyZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QUUgKi8geyAyMiwgSVRfUkVGRVJFTkNFLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEFGICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImltdWwiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEIwICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0cgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImNtcHhjaGciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEIxICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0cgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImNtcHhjaGciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEIyICovIHsgMCwgSVRfR0VORVJJQywgQU1fTSB8IE9UX1AsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImxzcyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QjMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fRyB8IE9UX1YsIEFNX05PVF9VU0VELCAiYnRyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCNCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX00gfCBPVF9QLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJsZnMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEI1ICovIHsgMCwgSVRfR0VORVJJQywgQU1fTSB8IE9UX1AsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImxncyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QjYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCAibW92engiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEI3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9XLCBBTV9OT1RfVVNFRCwgIm1vdnp4IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCOCAqLyB7IDAsIElUX1VOS05PV04sIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QjkgKi8geyAwLCBJVF9VTktOT1dOLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAidWQxIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCQSAqLyB7IDIzLCBJVF9SRUZFUkVOQ0UsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QkIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fRyB8IE9UX1YsIEFNX05PVF9VU0VELCAiYnRjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhCQyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsICJic2YiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEJEICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImJzciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4QkUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfViwgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCAibW92c3giLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEJGICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX1YsIEFNX0UgfCBPVF9XLCBBTV9OT1RfVVNFRCwgIm1vdnN4IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDMCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9HIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJ4YWRkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDMSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJ4YWRkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDMiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QUywgQU1fVyB8IE9UX1BTLCBBTV9JIHwgT1RfQiwgImNtcHBzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfU0QsIEFNX1cgfCBPVF9TRCwgQU1fSSB8IE9UX0IsICJjbXBzZCIgfSwKKyAgICAvKiBGM2ggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfU1MsIEFNX1cgIHwgT1RfU1MsIEFNX0kgfCBPVF9CLCAiY21wc3MiIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BELCBBTV9XIHwgT1RfUEQsIEFNX0kgfCBPVF9CLCAiY21wcGQiIH0gfSwKKyAgLyogMHhDMyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9ELCBBTV9HIHwgT1RfRCwgQU1fTk9UX1VTRUQsICJtb3ZudGkiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEM0ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX0UgfCBPVF9ELCBBTV9JIHwgT1RfQiwgInBpbnNydyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX0UgfCBPVF9ELCBBTV9JIHwgT1RfQiwgInBpbnNydyIgfSB9LAorICAvKiAweEM1ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRyB8IE9UX0QsIEFNX1AgfCBPVF9RLCBBTV9JIHwgT1RfQiwgInBleHRydyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfRCwgQU1fViB8IE9UX0RRLCBBTV9JIHwgT1RfQiwgInBleHRydyIgfSB9LAorICAvKiAweEM2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BTLCBBTV9XIHwgT1RfUFMsIEFNX0kgfCBPVF9CLCAic2h1ZnBzIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9QRCwgQU1fVyB8IE9UX1BELCBBTV9JIHwgT1RfQiwgInNodWZwZCIgfSB9LAorICAvKiAweEM3ICovIHsgMjQsIElUX1JFRkVSRU5DRSwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDOCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiYnN3YXAiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweEM5ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9ELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJic3dhcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4Q0EgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX0QsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImJzd2FwIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDQiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiYnN3YXAiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweENDICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9ELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJic3dhcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4Q0QgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX0QsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImJzd2FwIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHhDRSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiYnN3YXAiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweENGICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9ELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJic3dhcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RDAgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RDEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicHNybHciLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicHNybHciIH0gfSwKKyAgLyogMHhEMiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJwc3JsZCIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwc3JsZCIgfSB9LAorICAvKiAweEQzICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBzcmxxIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBzcmxxIiB9IH0sCisgIC8qIDB4RDQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicGFkZHEiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicGFkZHEiIH0gfSwKKyAgLyogMHhENSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJwbXVsbHciLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicG11bGx3IiB9IH0sCisgIC8qIDB4RDYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAidW51c2VkIHdpdGhvdXQgcHJlZml4IiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fVyB8IE9UX1EsIEFNX05PVF9VU0VELCAibW92ZHEycSIgfSwKKyAgICAvKiBGM2ggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgIm1vdnEyZHEiIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fVyB8IE9UX1EsIEFNX1YgfCBPVF9RLCBBTV9OT1RfVVNFRCwgIm1vdnEiIH0gfSwKKyAgLyogMHhENyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0cgfCBPVF9ELCBBTV9QIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJwbW92bXNrYiIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9HIHwgT1RfRCwgQU1fViB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBtb3Ztc2tiIiB9IH0sCisgIC8qIDB4RDggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicHN1YnVzYiIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwc3VidXNiIiB9IH0sCisgIC8qIDB4RDkgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicHN1YnVzdyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwc3VidXN3IiB9IH0sCisgIC8qIDB4REEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicG1pbnViIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBtaW51YiIgfSB9LAorICAvKiAweERCICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBhbmQiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicGFuZCIgfSB9LAorICAvKiAweERDICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBhZGR1c2IiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicGFkZHVzYiIgfSB9LAorICAvKiAweEREICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBhZGR1c3ciLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicGFkZHVzdyIgfSB9LAorICAvKiAweERFICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBtYXh1YiIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwbWF4dWIiIH0gfSwKKyAgLyogMHhERiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJwYW5kbiIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwYW5kbiIgfSB9LAorICAvKiAweEUwICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBhdmdiIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBhdmdiIiB9IH0sCisgIC8qIDB4RTEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicHNyYXciLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicHNycXciIH0gfSwKKyAgLyogMHhFMiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJwc3JhZCIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwc3JhZCIgfSB9LAorICAvKiAweEUzICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBhdmd3IiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBhdmd3IiB9IH0sCisgIC8qIDB4RTQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicG11bGh1dyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwbXVsaHV3IiB9IH0sCisgIC8qIDB4RTUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicG11bGh1dyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwbXVsaHciIH0gfSwKKyAgLyogMHhFNiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJub3QgdXNlZCB3aXRob3V0IHByZWZpeCIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfUEQsIEFNX05PVF9VU0VELCAiY3Z0cGQyZHEiIH0sCisgICAgLyogRjNoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX1BELCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAiY3Z0ZHEycGQiIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfUEQsIEFNX05PVF9VU0VELCAiY3Z0dHBkMmRxIiB9IH0sCisgIC8qIDB4RTcgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9XIHwgT1RfUSwgQU1fViB8IE9UX1EsIEFNX05PVF9VU0VELCAibW92bnRxIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1cgfCBPVF9EUSwgQU1fViB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgIm1vdm50ZHEiIH0gfSwKKyAgLyogMHhFOCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJwc3Vic2IiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicHN1YnNiIiB9IH0sCisgIC8qIDB4RTkgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicHN1YnN3IiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBzdWJzdyIgfSB9LAorICAvKiAweEVBICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBtaW5zdyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwbWluc3ciIH0gfSwKKyAgLyogMHhFQiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJwb3IiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicG9yIiB9IH0sCisgIC8qIDB4RUMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicGFkZHNiIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBhZGRzYiIgfSB9LAorICAvKiAweEVEICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBhZGRzdyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwYWRkc3ciIH0gfSwKKyAgLyogMHhFRSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJwbWF4c3ciLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicG1heHN3IiB9IH0sCisgIC8qIDB4RUYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicHhvciIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJweG9yIiB9IH0sCisgIC8qIDB4RjAgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4RjEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicHNsbHciLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicHNsbHciIH0gfSwKKyAgLyogMHhGMiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJwc2xsZCIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwc2xsZCIgfSB9LAorICAvKiAweEYzICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBzbGxxIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBzbGxxIiB9IH0sCisgIC8qIDB4RjQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicG11bHVkcSIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwbXVsdWRxIiB9IH0sCisgIC8qIDB4RjUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicG1hZGR3ZCIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwbWFkZHdkIiB9IH0sCisgIC8qIDB4RjYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicHNhZGJ3IiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBzYWRidyIgfSB9LAorICAvKiAweEY3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1BJLCBBTV9RIHwgT1RfUEksIEFNX05PVF9VU0VELCAibWFza21vdnEiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAibWFza21vdmRxdSIgfSB9LAorICAvKiAweEY4ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBzdWJiIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBzdWJiIiB9IH0sCisgIC8qIDB4RjkgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicHN1YnciLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicHN1YnciIH0gfSwKKyAgLyogMHhGQSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJwc3ViZCIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwc3ViZCIgfSB9LAorICAvKiAweEZCICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBzdWJxIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBzdWJxIiB9IH0sCisgIC8qIDB4RkMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fUSB8IE9UX1EsIEFNX05PVF9VU0VELCAicGFkZGIiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fViB8IE9UX0RRLCBBTV9XIHwgT1RfRFEsIEFNX05PVF9VU0VELCAicGFkZGIiIH0gfSwKKyAgLyogMHhGRCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9RIHwgT1RfUSwgQU1fTk9UX1VTRUQsICJwYWRkdyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9WIHwgT1RfRFEsIEFNX1cgfCBPVF9EUSwgQU1fTk9UX1VTRUQsICJwYWRkdyIgfSB9LAorICAvKiAweEZFICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX1EgfCBPVF9RLCBBTV9OT1RfVVNFRCwgInBhZGRkIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1YgfCBPVF9EUSwgQU1fVyB8IE9UX0RRLCBBTV9OT1RfVVNFRCwgInBhZGRkIiB9IH0sCisgIC8qIDB4RkYgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0KK307CisKK2NvbnN0IE9wY29kZSBzX29wY29kZV9ieXRlX2FmdGVyXzBmMDBbXSA9IHsKKyAgLyogMHgwICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1csIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInNsZHQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfVywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAic3RyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1csIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImxsZHQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfVywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAibHRyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1csIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInZlcnIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfVywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAidmVydyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NiAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3ICovIHsgMCwgSVRfVU5VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9Cit9OworCitjb25zdCBPcGNvZGUgc19vcGNvZGVfYnl0ZV9hZnRlcl8wZjAxW10gPSB7CisgIC8qIDB4MCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX00gfCBPVF9TLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJzZ2R0IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgxICovIHsgMCwgSVRfR0VORVJJQywgQU1fTSB8IE9UX1MsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInNpZHQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9NIHwgT1RfUywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAibGdkdCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX00gfCBPVF9TLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJsaWR0IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1csIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInNtc3ciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDUgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9XLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJsbXN3IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fTSB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImludmxwZyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0KK307CisKK2NvbnN0IE9wY29kZSBzX29wY29kZV9ieXRlX2FmdGVyXzBmMThbXSA9IHsKKyAgLyogMHgwICovIHsgMCwgSVRfR0VORVJJQywgQU1fTSB8IE9UX0FERFJFU1NfTU9ERV9NLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwcmVmZXRjaCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAicHJlZmV0Y2giLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX0QsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgInByZWZldGNoIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9ELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwcmVmZXRjaCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NCAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1ICovIHsgMCwgSVRfVU5VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDYgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NyAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfQorfTsKKworY29uc3QgT3Bjb2RlIHNfb3Bjb2RlX2J5dGVfYWZ0ZXJfMGY3MVtdID0geworICAvKiAweDAgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInBzcmx3IiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9EUSwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAicHNybHciIH0gfSwKKyAgLyogMHgzICovIHsgMCwgSVRfVU5VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAicHNyYXciLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX0RRLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJwc3JhdyIgfSB9LAorICAvKiAweDUgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJwc2xsdyIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfRFEsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInBzbGx3IiB9IH0sCisgIC8qIDB4NyAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfQorfTsKKworY29uc3QgT3Bjb2RlIHNfb3Bjb2RlX2J5dGVfYWZ0ZXJfMGY3MltdID0geworICAvKiAweDAgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInBzcmxkIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1cgfCBPVF9EUSwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAicHNybGQiIH0gfSwKKyAgLyogMHgzICovIHsgMCwgSVRfVU5VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9QIHwgT1RfUSwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAicHNyYWQiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fVyB8IE9UX0RRLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJwc3JhZCIgfSB9LAorICAvKiAweDUgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1AgfCBPVF9RLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJwc2xsZCIsIHRydWUsCisgICAgLyogRjJoICovIHsgMCB9LAorICAgIC8qIEYzaCAqLyB7IDAgfSwKKyAgICAvKiA2NmggKi8geyAwLCBJVF9HRU5FUklDLCBBTV9XIHwgT1RfRFEsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInBzbGxkIiB9IH0sCisgIC8qIDB4NyAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfQorfTsKKworY29uc3QgT3Bjb2RlIHNfb3Bjb2RlX2J5dGVfYWZ0ZXJfMGY3M1tdID0geworICAvKiAweDAgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInBzcmxxIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1cgfCBPVF9EUSwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAicHNybHEiIH0gfSwKKyAgLyogMHgzICovIHsgMCwgSVRfVU5VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NSAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUCB8IE9UX1EsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInBzbGxxIiwgdHJ1ZSwKKyAgICAvKiBGMmggKi8geyAwIH0sCisgICAgLyogRjNoICovIHsgMCB9LAorICAgIC8qIDY2aCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1cgfCBPVF9EUSwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAicHNsbHEiIH0gfSwKKyAgLyogMHg3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fVyB8IE9UX0RRLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJwc2xsZHEiLCB0cnVlLAorICAgIC8qIEYyaCAqLyB7IDAgfSwKKyAgICAvKiBGM2ggKi8geyAwIH0sCisgICAgLyogNjZoICovIHsgMCwgSVRfR0VORVJJQywgQU1fVyB8IE9UX0RRLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJwc2xsZHEiIH0gfSwKK307CisKK2NvbnN0IE9wY29kZSBzX29wY29kZV9ieXRlX2FmdGVyXzBmYWVbXSA9IHsKKyAgLyogMHgwICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImZ4c2F2ZSIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJmeHJzdG9yIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImxkbXhjc3IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAic3RteGNzciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NCAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1ICovIHsgMCwgSVRfR0VORVJJQywgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImxmZW5jZSIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJtZmVuY2UiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDcgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiY2xmbHVzaC9zZmVuY2UiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorfTsKKworY29uc3QgT3Bjb2RlIHNfb3Bjb2RlX2J5dGVfYWZ0ZXJfMGZiYVtdID0geworICAvKiAweDAgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX1VOVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgMCwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfVU5VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDMgKi8geyAwLCBJVF9VTlVTRUQsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIDAsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJidCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJidHMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAiYnRyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImJ0YyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0KK307CisKK2NvbnN0IE9wY29kZSBzX29wY29kZV9ieXRlX2FmdGVyXzBmYzdbXSA9IHsKKyAgLyogMHgwICovIHsgMCwgSVRfVU5VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9NIHwgT1RfUSwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiY21weGNoOGIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9Cit9OworCitjb25zdCBPcGNvZGUgc19vcGNvZGVfYnl0ZV9hZnRlcl84MFtdID0geworICAvKiAweDAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAiYWRkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgxICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgIm9yIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImFkYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzYmIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAiYW5kIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInN1YiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJ4b3IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDcgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAiY21wIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfQorfTsKKworY29uc3QgT3Bjb2RlIHNfb3Bjb2RlX2J5dGVfYWZ0ZXJfODFbXSA9IHsKKyAgLyogMHgwICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImFkZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfViwgQU1fTk9UX1VTRUQsICJvciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfViwgQU1fTk9UX1VTRUQsICJhZGMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX1YsIEFNX05PVF9VU0VELCAic2JiIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImFuZCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfViwgQU1fTk9UX1VTRUQsICJzdWIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX1YsIEFNX05PVF9VU0VELCAieG9yIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9WLCBBTV9OT1RfVVNFRCwgImNtcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0KK307CisKK2NvbnN0IE9wY29kZSBzX29wY29kZV9ieXRlX2FmdGVyXzgyW10gPSB7CisgIC8qIDB4MCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJhZGQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAib3IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAiYWRjIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInNiYiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJhbmQiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAic3ViIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInhvciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJjbXAiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9Cit9OworCitjb25zdCBPcGNvZGUgc19vcGNvZGVfYnl0ZV9hZnRlcl84M1tdID0geworICAvKiAweDAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAiYWRkIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgxICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgIm9yIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImFkYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzYmIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAiYW5kIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInN1YiIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJ4b3IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDcgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAiY21wIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfQorfTsKKworY29uc3QgT3Bjb2RlIHNfb3Bjb2RlX2J5dGVfYWZ0ZXJfYzBbXSA9IHsKKyAgLyogMHgwICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInJvbCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJyb3IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAicmNsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInJjciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzaGwiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAic2hyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInNhbCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzYXIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9Cit9OworCitjb25zdCBPcGNvZGUgc19vcGNvZGVfYnl0ZV9hZnRlcl9jMVtdID0geworICAvKiAweDAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAicm9sIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgxICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInJvciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJyY2wiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAicmNyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg0ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInNobCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzaHIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX0IsIEFNX05PVF9VU0VELCAic2FsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInNhciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0KK307CisKK2NvbnN0IE9wY29kZSBzX29wY29kZV9ieXRlX2FmdGVyX2QwW10gPSB7CisgIC8qIDB4MCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9JTVBMSUNJVCwgQU1fTk9UX1VTRUQsICJyb2wiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fSU1QTElDSVQsIEFNX05PVF9VU0VELCAicm9yIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0lNUExJQ0lULCBBTV9OT1RfVVNFRCwgInJjbCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9JTVBMSUNJVCwgQU1fTk9UX1VTRUQsICJyY3IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fSU1QTElDSVQsIEFNX05PVF9VU0VELCAic2hsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0lNUExJQ0lULCBBTV9OT1RfVVNFRCwgInNociIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9JTVBMSUNJVCwgQU1fTk9UX1VTRUQsICJzYWwiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDcgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fSU1QTElDSVQsIEFNX05PVF9VU0VELCAic2FyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfQorfTsKKworY29uc3QgT3Bjb2RlIHNfb3Bjb2RlX2J5dGVfYWZ0ZXJfZDFbXSA9IHsKKyAgLyogMHgwICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0lNUExJQ0lULCBBTV9OT1RfVVNFRCwgInJvbCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JTVBMSUNJVCwgQU1fTk9UX1VTRUQsICJyb3IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSU1QTElDSVQsIEFNX05PVF9VU0VELCAicmNsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0lNUExJQ0lULCBBTV9OT1RfVVNFRCwgInJjciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JTVBMSUNJVCwgQU1fTk9UX1VTRUQsICJzaGwiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDUgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSU1QTElDSVQsIEFNX05PVF9VU0VELCAic2hyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX0lNUExJQ0lULCBBTV9OT1RfVVNFRCwgInNhbCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JTVBMSUNJVCwgQU1fTk9UX1VTRUQsICJzYXIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9Cit9OworCitjb25zdCBPcGNvZGUgc19vcGNvZGVfYnl0ZV9hZnRlcl9kMltdID0geworICAvKiAweDAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInJvbCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX05PVF9VU0VELCAicm9yIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJyY2wiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDMgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInJjciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX05PVF9VU0VELCAic2hsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzaHIiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDYgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInNhbCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX05PVF9VU0VELCAic2FyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfQorfTsKKworY29uc3QgT3Bjb2RlIHNfb3Bjb2RlX2J5dGVfYWZ0ZXJfZDNbXSA9IHsKKyAgLyogMHgwICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJyb2wiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDEgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInJvciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX05PVF9VU0VELCAicmNsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJyY3IiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInNobCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX05PVF9VU0VELCAic2hyIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX1JFR0lTVEVSIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJzYWwiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDcgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInNhciIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0KK307CisKK2NvbnN0IE9wY29kZSBzX29wY29kZV9ieXRlX2FmdGVyX2Y2W10gPSB7CisgIC8qIDB4MCAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9JIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJ0ZXN0IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgxICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX0kgfCBPVF9CLCBBTV9OT1RfVVNFRCwgInRlc3QiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDIgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAibm90IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgIm5lZyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NCAqLyB7IDAsIElUX0dFTkVSSUMsIE9UX0IgfCBBTV9SRUdJU1RFUiwgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCAibXVsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1ICovIHsgMCwgSVRfR0VORVJJQywgT1RfQiB8IEFNX1JFR0lTVEVSLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJpbXVsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg2ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9CLCBBTV9FIHwgT1RfQiwgQU1fTk9UX1VTRUQsICJkaXYiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDcgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX0IsIEFNX0UgfCBPVF9CLCBBTV9OT1RfVVNFRCwgImlkaXYiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9Cit9OworCitjb25zdCBPcGNvZGUgc19vcGNvZGVfYnl0ZV9hZnRlcl9mN1tdID0geworICAvKiAweDAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fSSB8IE9UX1YsIEFNX05PVF9VU0VELCAidGVzdCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9JIHwgT1RfViwgQU1fTk9UX1VTRUQsICJ0ZXN0IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgyICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgIm5vdCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MyAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJuZWciLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9SRUdJU1RFUiB8IE9UX1YsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgIm11bCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCAiaW11bCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX1JFR0lTVEVSIHwgT1RfViwgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCAiZGl2IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3ICovIHsgMCwgSVRfR0VORVJJQywgQU1fUkVHSVNURVIgfCBPVF9WLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsICJpZGl2IiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfQorfTsKKworY29uc3QgT3Bjb2RlIHNfb3Bjb2RlX2J5dGVfYWZ0ZXJfZmVbXSA9IHsKKyAgLyogMHgwICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX0IsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImluYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MSAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9CLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJkZWMiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9Cit9OworCitjb25zdCBPcGNvZGUgc19vcGNvZGVfYnl0ZV9hZnRlcl9mZltdID0geworICAvKiAweDAgKi8geyAwLCBJVF9HRU5FUklDLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiaW5jIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgxICovIHsgMCwgSVRfR0VORVJJQywgQU1fRSB8IE9UX1YsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImRlYyIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4MiAqLyB7IDAsIElUX0pVTVAsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJjYWxsIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHgzICovIHsgMCwgSVRfSlVNUCwgQU1fRSB8IE9UX1AsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImNhbGwiLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9LAorICAvKiAweDQgKi8geyAwLCBJVF9KVU1QLCBBTV9FIHwgT1RfViwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAiam1wIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg1ICovIHsgMCwgSVRfSlVNUCwgQU1fRSB8IE9UX1AsIEFNX05PVF9VU0VELCBBTV9OT1RfVVNFRCwgImptcCIsIGZhbHNlLCAvKiBGMmggKi8geyAwIH0sIC8qIEYzaCAqLyB7IDAgfSwgLyogNjZoICovIHsgMCB9IH0sCisgIC8qIDB4NiAqLyB7IDAsIElUX0dFTkVSSUMsIEFNX0UgfCBPVF9WLCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsICJwdXNoIiwgZmFsc2UsIC8qIEYyaCAqLyB7IDAgfSwgLyogRjNoICovIHsgMCB9LCAvKiA2NmggKi8geyAwIH0gfSwKKyAgLyogMHg3ICovIHsgMCwgSVRfVU5VU0VELCBBTV9OT1RfVVNFRCwgQU1fTk9UX1VTRUQsIEFNX05PVF9VU0VELCAwLCBmYWxzZSwgLyogRjJoICovIHsgMCB9LCAvKiBGM2ggKi8geyAwIH0sIC8qIDY2aCAqLyB7IDAgfSB9Cit9OworCisvKgorKiBBIHRhYmxlIG9mIGFsbCB0aGUgb3RoZXIgdGFibGVzLCBjb250YWluaW5nIHNvbWUgZXh0cmEgaW5mb3JtYXRpb24sIGUuZy4KKyogaG93IHRvIG1hc2sgb3V0IHRoZSBieXRlIHdlJ3JlIGxvb2tpbmcgYXQuCisqLworY29uc3QgT3Bjb2RlVGFibGUgTWluaURpc2Fzc2VtYmxlcjo6c19pYTMyX29wY29kZV9tYXBfW109eworICAvLyBPbmUtYnl0ZSBvcGNvZGVzIGFuZCBqdW1wcyB0byBsYXJnZXIKKyAgLyogIDAgKi8ge3NfZmlyc3Rfb3Bjb2RlX2J5dGUsIDAsIDB4ZmYsIDAsIDB4ZmZ9LAorICAvLyBUd28tYnl0ZSBvcGNvZGVzIChzZWNvbmQgYnl0ZSkKKyAgLyogIDEgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfMGYsIDAsIDB4ZmYsIDAsIDB4ZmZ9LAorICAvLyBTdGFydCBvZiB0YWJsZXMgZm9yIG9wY29kZXMgdXNpbmcgTW9kUi9NIGJpdHMgYXMgZXh0ZW5zaW9uCisgIC8qICAyICovIHtzX29wY29kZV9ieXRlX2FmdGVyXzgwLCAzLCAweDA3LCAwLCAweDA3fSwKKyAgLyogIDMgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfODEsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogIDQgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfODIsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogIDUgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfODMsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogIDYgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfYzAsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogIDcgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfYzEsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogIDggKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfZDAsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogIDkgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfZDEsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogMTAgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfZDIsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogMTEgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfZDMsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogMTIgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfZjYsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogMTMgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfZjcsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogMTQgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfZmUsIDMsIDB4MDcsIDAsIDB4MDF9LCAKKyAgLyogMTUgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfZmYsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogMTYgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfMGYwMCwgMywgMHgwNywgMCwgMHgwN30sIAorICAvKiAxNyAqLyB7c19vcGNvZGVfYnl0ZV9hZnRlcl8wZjAxLCAzLCAweDA3LCAwLCAweDA3fSwgCisgIC8qIDE4ICovIHtzX29wY29kZV9ieXRlX2FmdGVyXzBmMTgsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogMTkgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfMGY3MSwgMywgMHgwNywgMCwgMHgwN30sIAorICAvKiAyMCAqLyB7c19vcGNvZGVfYnl0ZV9hZnRlcl8wZjcyLCAzLCAweDA3LCAwLCAweDA3fSwgCisgIC8qIDIxICovIHtzX29wY29kZV9ieXRlX2FmdGVyXzBmNzMsIDMsIDB4MDcsIDAsIDB4MDd9LCAKKyAgLyogMjIgKi8ge3Nfb3Bjb2RlX2J5dGVfYWZ0ZXJfMGZhZSwgMywgMHgwNywgMCwgMHgwN30sIAorICAvKiAyMyAqLyB7c19vcGNvZGVfYnl0ZV9hZnRlcl8wZmJhLCAzLCAweDA3LCAwLCAweDA3fSwgCisgIC8qIDI0ICovIHtzX29wY29kZV9ieXRlX2FmdGVyXzBmYzcsIDMsIDB4MDcsIDAsIDB4MDF9Cit9OworCit9OyAgLy8gbmFtZXNwYWNlIHNpZGVzdGVwCmRpZmYgLS1naXQgYS9zcmMvd2luZG93cy9taW5ndy5oIGIvc3JjL3dpbmRvd3MvbWluZ3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTg2ZTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3MvbWluZ3cuaApAQCAtMCwwICsxLDcyIEBACisvKiAtKi0gTW9kZTogQzsgYy1iYXNpYy1vZmZzZXQ6IDI7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0gKi8KKy8qIENvcHlyaWdodCAoYykgMjAwNywgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogLS0tCisgKiBBdXRob3I6IENyYWlnIFNpbHZlcnN0ZWluCisgKgorICogTWluR1cgaXMgYW4gaW50ZXJlc3RpbmcgbWl4IG9mIHVuaXggYW5kIHdpbmRvd3MuICBXZSB1c2UgYSBub3JtYWwKKyAqIGNvbmZpZ3VyZSBzY3JpcHQsIGJ1dCBzdGlsbCBuZWVkIHRoZSB3aW5kb3dzIHBvcnQuaCB0byBkZWZpbmUgc29tZQorICogc3R1ZmYgdGhhdCBNaW5HVyBkb2Vzbid0IHN1cHBvcnQsIGxpa2UgcHRocmVhZHMuCisgKi8KKworI2lmbmRlZiBHT09HTEVfUEVSRlRPT0xTX1dJTkRPV1NfTUlOR1dfSF8KKyNkZWZpbmUgR09PR0xFX1BFUkZUT09MU19XSU5ET1dTX01JTkdXX0hfCisKKyNpZmRlZiBfX01JTkdXMzJfXworCisvLyBPbGRlciB2ZXJzaW9uIG9mIHRoZSBtaW5ndyBtc3ZjcnQgZG9uJ3QgZGVmaW5lIF9hbGlnbmVkX21hbGxvYworI2lmIF9fTVNWQ1JUX1ZFUlNJT05fXyA8IDB4MDcwMAorIyBkZWZpbmUgUEVSRlRPT0xTX05PX0FMSUdORURfTUFMTE9DIDEKKyNlbmRpZgorCisvLyBUaGlzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgdGhlIHdpbmRvd3MuaCBpcyBpbmNsdWRlZC4gIFdlIG5lZWQgYXQKKy8vIGxlYXN0IDB4MDQwMCBmb3IgbXV0ZXguaCB0byBoYXZlIGFjY2VzcyB0byBUcnlMb2NrLCBhbmQgYXQgbGVhc3QKKy8vIDB4MDUwMSBmb3IgcGF0Y2hfZnVuY3Rpb25zLmNjIHRvIGhhdmUgYWNjZXNzIHRvIEdldE1vZHVsZUhhbmRsZUV4LgorLy8gKFRoaXMgbGF0dGVyIGlzIGFuIG9wdGltaXphdGlvbiB3ZSBjb3VsZCB0YWtlIG91dCBpZiBuZWVkIGJlLikKKyNpZm5kZWYgX1dJTjMyX1dJTk5UCisjIGRlZmluZSBfV0lOMzJfV0lOTlQgMHgwNTAxCisjZW5kaWYKKworI2RlZmluZSBIQVZFX1NOUFJJTlRGIDEKKworLy8gU29tZSBtaW5ndyBkaXN0cmlidXRpb25zIGhhdmUgYSBwdGhyZWFkcyB3cmFwcGVyLCBidXQgaXQgZG9lc24ndAorLy8gd29yayBhcyB3ZWxsIGFzIG5hdGl2ZSB3aW5kb3dzIHNwaW5sb2NrcyAoYXQgbGVhc3QgZm9yIHVzKS4gIFNvCisvLyBwcmV0ZW5kIHRoZSBwdGhyZWFkcyB3cmFwcGVyIGRvZXNuJ3QgZXhpc3QsIGV2ZW4gd2hlbiBpdCBkb2VzLgorI2lmbmRlZiBIQVZFX1BUSFJFQURfREVTUElURV9BU0tJTkdfRk9SCisjdW5kZWYgSEFWRV9QVEhSRUFECisjZW5kaWYKKworI2RlZmluZSBIQVZFX1BJRF9UCisKKyNpbmNsdWRlICJ3aW5kb3dzL3BvcnQuaCIKKworI2VuZGlmICAvKiBfX01JTkdXMzJfXyAqLworCisjZW5kaWYgIC8qIEdPT0dMRV9QRVJGVE9PTFNfV0lORE9XU19NSU5HV19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3dpbmRvd3MvbWluaV9kaXNhc3NlbWJsZXIuY2MgYi9zcmMvd2luZG93cy9taW5pX2Rpc2Fzc2VtYmxlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzYyMDA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3MvbWluaV9kaXNhc3NlbWJsZXIuY2MKQEAgLTAsMCArMSw0MzIgQEAKKy8vIC0qLSBNb2RlOiBDKys7IGMtYmFzaWMtb2Zmc2V0OiAyOyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisvKiBDb3B5cmlnaHQgKGMpIDIwMDcsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIC0tLQorICogQXV0aG9yOiBKb2kgU2lndXJkc3NvbgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIE1pbmlEaXNhc3NlbWJsZXIuCisgKi8KKworI2luY2x1ZGUgIm1pbmlfZGlzYXNzZW1ibGVyLmgiCisKK25hbWVzcGFjZSBzaWRlc3RlcCB7CisKK01pbmlEaXNhc3NlbWJsZXI6Ok1pbmlEaXNhc3NlbWJsZXIoYm9vbCBvcGVyYW5kX2RlZmF1bHRfaXNfMzJfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRyZXNzX2RlZmF1bHRfaXNfMzJfYml0cykKKyAgICA6IG9wZXJhbmRfZGVmYXVsdF9pc18zMl9iaXRzXyhvcGVyYW5kX2RlZmF1bHRfaXNfMzJfYml0cyksCisgICAgICBhZGRyZXNzX2RlZmF1bHRfaXNfMzJfYml0c18oYWRkcmVzc19kZWZhdWx0X2lzXzMyX2JpdHMpIHsKKyAgSW5pdGlhbGl6ZSgpOworfQorCitNaW5pRGlzYXNzZW1ibGVyOjpNaW5pRGlzYXNzZW1ibGVyKCkKKyAgICA6IG9wZXJhbmRfZGVmYXVsdF9pc18zMl9iaXRzXyh0cnVlKSwKKyAgICAgIGFkZHJlc3NfZGVmYXVsdF9pc18zMl9iaXRzXyh0cnVlKSB7CisgIEluaXRpYWxpemUoKTsKK30KKworSW5zdHJ1Y3Rpb25UeXBlIE1pbmlEaXNhc3NlbWJsZXI6OkRpc2Fzc2VtYmxlKAorICAgIHVuc2lnbmVkIGNoYXIqIHN0YXJ0X2J5dGUsCisgICAgdW5zaWduZWQgaW50JiBpbnN0cnVjdGlvbl9ieXRlcykgeworICAvLyBDbGVhbiB1cCBhbnkgc3RhdGUgZnJvbSBwcmV2aW91cyBpbnZvY2F0aW9ucy4KKyAgSW5pdGlhbGl6ZSgpOworCisgIC8vIFN0YXJ0IGJ5IHByb2Nlc3NpbmcgYW55IHByZWZpeGVzLgorICB1bnNpZ25lZCBjaGFyKiBjdXJyZW50X2J5dGUgPSBzdGFydF9ieXRlOworICB1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7CisgIEluc3RydWN0aW9uVHlwZSBpbnN0cnVjdGlvbl90eXBlID0gUHJvY2Vzc1ByZWZpeGVzKGN1cnJlbnRfYnl0ZSwgc2l6ZSk7CisKKyAgaWYgKElUX1VOS05PV04gPT0gaW5zdHJ1Y3Rpb25fdHlwZSkKKyAgICByZXR1cm4gaW5zdHJ1Y3Rpb25fdHlwZTsKKworICBjdXJyZW50X2J5dGUgKz0gc2l6ZTsKKyAgc2l6ZSA9IDA7CisKKyAgLy8gSW52YXJpYW50OiBXZSBoYXZlIHN0cmlwcGVkIGFsbCBwcmVmaXhlcywgYW5kIHRoZSBvcGVyYW5kX2lzXzMyX2JpdHNfCisgIC8vIGFuZCBhZGRyZXNzX2lzXzMyX2JpdHNfIGZsYWdzIGFyZSBjb3JyZWN0bHkgc2V0LgorCisgIGluc3RydWN0aW9uX3R5cGUgPSBQcm9jZXNzT3Bjb2RlKGN1cnJlbnRfYnl0ZSwgMCwgc2l6ZSk7CisKKyAgLy8gQ2hlY2sgZm9yIGVycm9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KKyAgaWYgKChJVF9VTktOT1dOID09IGluc3RydWN0aW9uX3R5cGVfKSB8fCAoSVRfVU5VU0VEID09IGluc3RydWN0aW9uX3R5cGVfKSkgeworICAgIHJldHVybiBJVF9VTktOT1dOOworICB9CisKKyAgY3VycmVudF9ieXRlICs9IHNpemU7CisKKyAgLy8gSW52YXJpYW50OiBvcGVyYW5kX2J5dGVzXyBpbmRpY2F0ZXMgdGhlIHRvdGFsIHNpemUgb2Ygb3BlcmFuZHMKKyAgLy8gc3BlY2lmaWVkIGJ5IHRoZSBvcGNvZGUgYW5kL29yIE1vZFIvTSBieXRlIGFuZC9vciBTSUIgYnl0ZS4KKyAgLy8gcEN1cnJlbnRCeXRlIHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBhZnRlciB0aGUgTW9kUi9NIGJ5dGUsIG9yIGFmdGVyCisgIC8vIHRoZSBTSUIgYnl0ZSBpZiBpdCBpcyBwcmVzZW50IChpLmUuIHRoZSBmaXJzdCBieXRlIG9mIGFueSBvcGVyYW5kcworICAvLyBlbmNvZGVkIGluIHRoZSBpbnN0cnVjdGlvbikuCisKKyAgLy8gV2UgZ2V0IHRoZSB0b3RhbCBsZW5ndGggb2YgYW55IHByZWZpeGVzLCB0aGUgb3Bjb2RlLCBhbmQgdGhlIE1vZFIvTSBhbmQKKyAgLy8gU0lCIGJ5dGVzIGlmIHByZXNlbnQsIGJ5IHRha2luZyB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgb3JpZ2luYWwgc3RhcnRpbmcKKyAgLy8gYWRkcmVzcyBhbmQgdGhlIGN1cnJlbnQgYnl0ZSAod2hpY2ggcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZQorICAvLyBvcGVyYW5kcyBpZiBwcmVzZW50LCBvciB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpZgorICAvLyB0aGV5IGFyZSBub3QpLiAgQWRkaW5nIHRoZSBjb3VudCBvZiBieXRlcyBpbiB0aGUgb3BlcmFuZHMgZW5jb2RlZCBpbgorICAvLyB0aGUgaW5zdHJ1Y3Rpb24gZ2l2ZXMgdXMgdGhlIGZ1bGwgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiBpbiBieXRlcy4KKyAgaW5zdHJ1Y3Rpb25fYnl0ZXMgKz0gb3BlcmFuZF9ieXRlc18gKyAoY3VycmVudF9ieXRlIC0gc3RhcnRfYnl0ZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBpbnN0cnVjdGlvbiB0eXBlLCB3aGljaCB3YXMgc2V0IGJ5IFByb2Nlc3NPcGNvZGUoKS4KKyAgcmV0dXJuIGluc3RydWN0aW9uX3R5cGVfOworfQorCit2b2lkIE1pbmlEaXNhc3NlbWJsZXI6OkluaXRpYWxpemUoKSB7CisgIG9wZXJhbmRfaXNfMzJfYml0c18gPSBvcGVyYW5kX2RlZmF1bHRfaXNfMzJfYml0c187CisgIGFkZHJlc3NfaXNfMzJfYml0c18gPSBhZGRyZXNzX2RlZmF1bHRfaXNfMzJfYml0c187CisjaWZkZWYgX01fWDY0CisgIG9wZXJhbmRfZGVmYXVsdF9zdXBwb3J0XzY0X2JpdHNfID0gdHJ1ZTsKKyNlbHNlCisgIG9wZXJhbmRfZGVmYXVsdF9zdXBwb3J0XzY0X2JpdHNfID0gZmFsc2U7CisjZW5kaWYKKyAgb3BlcmFuZF9pc182NF9iaXRzXyA9IGZhbHNlOworICBvcGVyYW5kX2J5dGVzXyA9IDA7CisgIGhhdmVfbW9kcm1fID0gZmFsc2U7CisgIHNob3VsZF9kZWNvZGVfbW9kcm1fID0gZmFsc2U7CisgIGluc3RydWN0aW9uX3R5cGVfID0gSVRfVU5LTk9XTjsKKyAgZ290X2YyX3ByZWZpeF8gPSBmYWxzZTsKKyAgZ290X2YzX3ByZWZpeF8gPSBmYWxzZTsKKyAgZ290XzY2X3ByZWZpeF8gPSBmYWxzZTsKK30KKworSW5zdHJ1Y3Rpb25UeXBlIE1pbmlEaXNhc3NlbWJsZXI6OlByb2Nlc3NQcmVmaXhlcyh1bnNpZ25lZCBjaGFyKiBzdGFydF9ieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQmIHNpemUpIHsKKyAgSW5zdHJ1Y3Rpb25UeXBlIGluc3RydWN0aW9uX3R5cGUgPSBJVF9HRU5FUklDOworICBjb25zdCBPcGNvZGUmIG9wY29kZSA9IHNfaWEzMl9vcGNvZGVfbWFwX1swXS50YWJsZV9bKnN0YXJ0X2J5dGVdOworCisgIHN3aXRjaCAob3Bjb2RlLnR5cGVfKSB7CisgICAgY2FzZSBJVF9QUkVGSVhfQUREUkVTUzoKKyAgICAgIGFkZHJlc3NfaXNfMzJfYml0c18gPSAhYWRkcmVzc19kZWZhdWx0X2lzXzMyX2JpdHNfOworICAgICAgZ290byBub2NoYW5nZW9wZXJhbmQ7CisgICAgY2FzZSBJVF9QUkVGSVhfT1BFUkFORDoKKyAgICAgIG9wZXJhbmRfaXNfMzJfYml0c18gPSAhb3BlcmFuZF9kZWZhdWx0X2lzXzMyX2JpdHNfOworICAgICAgbm9jaGFuZ2VvcGVyYW5kOgorICAgIGNhc2UgSVRfUFJFRklYOgorCisgICAgICBpZiAoMHhGMiA9PSAoKnN0YXJ0X2J5dGUpKQorICAgICAgICBnb3RfZjJfcHJlZml4XyA9IHRydWU7CisgICAgICBlbHNlIGlmICgweEYzID09ICgqc3RhcnRfYnl0ZSkpCisgICAgICAgIGdvdF9mM19wcmVmaXhfID0gdHJ1ZTsKKyAgICAgIGVsc2UgaWYgKDB4NjYgPT0gKCpzdGFydF9ieXRlKSkKKyAgICAgICAgZ290XzY2X3ByZWZpeF8gPSB0cnVlOworICAgICAgZWxzZSBpZiAob3BlcmFuZF9kZWZhdWx0X3N1cHBvcnRfNjRfYml0c18gJiYgKCpzdGFydF9ieXRlKSAmIDB4NDgpCisgICAgICAgIG9wZXJhbmRfaXNfNjRfYml0c18gPSB0cnVlOworCisgICAgICBpbnN0cnVjdGlvbl90eXBlID0gb3Bjb2RlLnR5cGVfOworICAgICAgc2l6ZSArKzsKKyAgICAgIC8vIHdlIGdvdCBhIHByZWZpeCwgc28gYWRkIG9uZSBhbmQgY2hlY2sgbmV4dCBieXRlCisgICAgICBQcm9jZXNzUHJlZml4ZXMoc3RhcnRfYnl0ZSArIDEsIHNpemUpOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsgICAvLyBub3QgYSBwcmVmaXggYnl0ZQorICB9CisKKyAgcmV0dXJuIGluc3RydWN0aW9uX3R5cGU7Cit9CisKK0luc3RydWN0aW9uVHlwZSBNaW5pRGlzYXNzZW1ibGVyOjpQcm9jZXNzT3Bjb2RlKHVuc2lnbmVkIGNoYXIqIHN0YXJ0X2J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFibGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQmIHNpemUpIHsKKyAgY29uc3QgT3Bjb2RlVGFibGUmIHRhYmxlID0gc19pYTMyX29wY29kZV9tYXBfW3RhYmxlX2luZGV4XTsgICAvLyBHZXQgb3VyIHRhYmxlCisgIHVuc2lnbmVkIGNoYXIgY3VycmVudF9ieXRlID0gKCpzdGFydF9ieXRlKSA+PiB0YWJsZS5zaGlmdF87CisgIGN1cnJlbnRfYnl0ZSA9IGN1cnJlbnRfYnl0ZSAmIHRhYmxlLm1hc2tfOyAgLy8gTWFzayBvdXQgdGhlIGJpdHMgd2Ugd2lsbCB1c2UKKworICAvLyBDaGVjayB3aGV0aGVyIHRoZSBieXRlIHdlIGhhdmUgaXMgaW5zaWRlIHRoZSB0YWJsZSB3ZSBoYXZlLgorICBpZiAoY3VycmVudF9ieXRlIDwgdGFibGUubWluX2xpbV8gfHwgY3VycmVudF9ieXRlID4gdGFibGUubWF4X2xpbV8pIHsKKyAgICBpbnN0cnVjdGlvbl90eXBlXyA9IElUX1VOS05PV047CisgICAgcmV0dXJuIGluc3RydWN0aW9uX3R5cGVfOworICB9CisKKyAgY29uc3QgT3Bjb2RlJiBvcGNvZGUgPSB0YWJsZS50YWJsZV9bY3VycmVudF9ieXRlXTsKKyAgaWYgKElUX1VOVVNFRCA9PSBvcGNvZGUudHlwZV8pIHsKKyAgICAvLyBUaGlzIGluc3RydWN0aW9uIGlzIG5vdCB1c2VkIGJ5IHRoZSBJQS0zMiBJU0EsIHNvIHdlIGluZGljYXRlCisgICAgLy8gdGhpcyB0byB0aGUgdXNlci4gIFByb2JhYmx5IG1lYW5zIHRoYXQgd2Ugd2VyZSBwb2ludGVkIHRvCisgICAgLy8gYSBieXRlIGluIG1lbW9yeSB0aGF0IHdhcyBub3QgdGhlIHN0YXJ0IG9mIGFuIGluc3RydWN0aW9uLgorICAgIGluc3RydWN0aW9uX3R5cGVfID0gSVRfVU5VU0VEOworICAgIHJldHVybiBpbnN0cnVjdGlvbl90eXBlXzsKKyAgfSBlbHNlIGlmIChJVF9SRUZFUkVOQ0UgPT0gb3Bjb2RlLnR5cGVfKSB7CisgICAgLy8gV2UgYXJlIGxvb2tpbmcgYXQgYW4gb3Bjb2RlIHRoYXQgaGFzIG1vcmUgYnl0ZXMgKG9yIGlzIGNvbnRpbnVlZAorICAgIC8vIGluIHRoZSBNb2RSL00gYnl0ZSkuICBSZWN1cnNpdmVseSBmaW5kIHRoZSBvcGNvZGUgZGVmaW5pdGlvbiBpbgorICAgIC8vIHRoZSB0YWJsZSBmb3IgdGhlIG9wY29kZSdzIG5leHQgYnl0ZS4KKyAgICBzaXplKys7CisgICAgUHJvY2Vzc09wY29kZShzdGFydF9ieXRlICsgMSwgb3Bjb2RlLnRhYmxlX2luZGV4Xywgc2l6ZSk7CisgICAgcmV0dXJuIGluc3RydWN0aW9uX3R5cGVfOworICB9CisKKyAgY29uc3QgU3BlY2lmaWNPcGNvZGUqIHNwZWNpZmljX29wY29kZSA9IChTcGVjaWZpY09wY29kZSopJm9wY29kZTsKKyAgaWYgKG9wY29kZS5pc19wcmVmaXhfZGVwZW5kZW50XykgeworICAgIGlmIChnb3RfZjJfcHJlZml4XyAmJiBvcGNvZGUub3Bjb2RlX2lmX2YyX3ByZWZpeF8ubW5lbW9uaWNfICE9IDApIHsKKyAgICAgIHNwZWNpZmljX29wY29kZSA9ICZvcGNvZGUub3Bjb2RlX2lmX2YyX3ByZWZpeF87CisgICAgfSBlbHNlIGlmIChnb3RfZjNfcHJlZml4XyAmJiBvcGNvZGUub3Bjb2RlX2lmX2YzX3ByZWZpeF8ubW5lbW9uaWNfICE9IDApIHsKKyAgICAgIHNwZWNpZmljX29wY29kZSA9ICZvcGNvZGUub3Bjb2RlX2lmX2YzX3ByZWZpeF87CisgICAgfSBlbHNlIGlmIChnb3RfNjZfcHJlZml4XyAmJiBvcGNvZGUub3Bjb2RlX2lmXzY2X3ByZWZpeF8ubW5lbW9uaWNfICE9IDApIHsKKyAgICAgIHNwZWNpZmljX29wY29kZSA9ICZvcGNvZGUub3Bjb2RlX2lmXzY2X3ByZWZpeF87CisgICAgfQorICB9CisKKyAgLy8gSW52OiBUaGUgb3Bjb2RlIHR5cGUgaXMga25vd24uCisgIGluc3RydWN0aW9uX3R5cGVfID0gc3BlY2lmaWNfb3Bjb2RlLT50eXBlXzsKKworICAvLyBMZXQncyBwcm9jZXNzIHRoZSBvcGVyYW5kIHR5cGVzIHRvIHNlZSBpZiB3ZSBoYXZlIGFueSBpbW1lZGlhdGUKKyAgLy8gb3BlcmFuZHMsIGFuZC9vciBhIE1vZFIvTSBieXRlLgorCisgIFByb2Nlc3NPcGVyYW5kKHNwZWNpZmljX29wY29kZS0+ZmxhZ19kZXN0Xyk7CisgIFByb2Nlc3NPcGVyYW5kKHNwZWNpZmljX29wY29kZS0+ZmxhZ19zb3VyY2VfKTsKKyAgUHJvY2Vzc09wZXJhbmQoc3BlY2lmaWNfb3Bjb2RlLT5mbGFnX2F1eF8pOworCisgIC8vIEludjogV2UgaGF2ZSBwcm9jZXNzZWQgdGhlIG9wY29kZSBhbmQgaW5jcmVtZW50ZWQgb3BlcmFuZF9ieXRlc18KKyAgLy8gYnkgdGhlIG51bWJlciBvZiBieXRlcyBvZiBhbnkgb3BlcmFuZHMgc3BlY2lmaWVkIGJ5IHRoZSBvcGNvZGUKKyAgLy8gdGhhdCBhcmUgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbiAobm90IHJlZ2lzdGVycyBldGMuKS4gIE5vdworICAvLyB3ZSBuZWVkIHRvIHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGZvciB0aGUgb3Bjb2RlIGFuZAorICAvLyBmb3IgdGhlIE1vZFIvTSBvciBTSUIgYnl0ZXMgaWYgdGhleSBhcmUgcHJlc2VudC4KKworICBpZiAodGFibGUubWFza18gIT0gMHhmZikgeworICAgIGlmIChoYXZlX21vZHJtXykgeworICAgICAgLy8gd2UncmUgbG9va2luZyBhdCBhIE1vZFIvTSBieXRlIHNvIHdlJ3JlIG5vdCBnb2luZyB0bworICAgICAgLy8gY291bnQgdGhhdCBpbnRvIHRoZSBvcGNvZGUgc2l6ZQorICAgICAgUHJvY2Vzc01vZHJtKHN0YXJ0X2J5dGUsIHNpemUpOworICAgICAgcmV0dXJuIElUX0dFTkVSSUM7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIG5lZWQgdG8gY291bnQgdGhlIE1vZFIvTSBieXRlIGV2ZW4gaWYgaXQncyBqdXN0IGJlaW5nCisgICAgICAvLyB1c2VkIGZvciBvcGNvZGUgZXh0ZW5zaW9uCisgICAgICBzaXplKys7CisgICAgICByZXR1cm4gSVRfR0VORVJJQzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGhhdmVfbW9kcm1fKSB7CisgICAgICAvLyBUaGUgTW9kUi9NIGJ5dGUgaXMgdGhlIG5leHQgYnl0ZS4KKyAgICAgIHNpemUrKzsKKyAgICAgIFByb2Nlc3NNb2RybShzdGFydF9ieXRlICsgMSwgc2l6ZSk7CisgICAgICByZXR1cm4gSVRfR0VORVJJQzsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZSsrOworICAgICAgcmV0dXJuIElUX0dFTkVSSUM7CisgICAgfQorICB9Cit9CisKK2Jvb2wgTWluaURpc2Fzc2VtYmxlcjo6UHJvY2Vzc09wZXJhbmQoaW50IGZsYWdfb3BlcmFuZCkgeworICBib29sIHN1Y2NlZWRlZCA9IHRydWU7CisgIGlmIChBTV9OT1RfVVNFRCA9PSBmbGFnX29wZXJhbmQpCisgICAgcmV0dXJuIHN1Y2NlZWRlZDsKKworICAvLyBEZWNpZGUgd2hhdCB0byBkbyBiYXNlZCBvbiB0aGUgYWRkcmVzc2luZyBtb2RlLgorICBzd2l0Y2ggKGZsYWdfb3BlcmFuZCAmIEFNX01BU0spIHsKKyAgICAvLyBObyBNb2RSL00gYnl0ZSBpbmRpY2F0ZWQgYnkgdGhlc2UgYWRkcmVzc2luZyBtb2RlcywgYW5kIG5vCisgICAgLy8gYWRkaXRpb25hbCAoZS5nLiBpbW1lZGlhdGUpIHBhcmFtZXRlcnMuCisgICAgY2FzZSBBTV9BOiAvLyBEaXJlY3QgYWRkcmVzcworICAgIGNhc2UgQU1fRjogLy8gRUZMQUdTIHJlZ2lzdGVyCisgICAgY2FzZSBBTV9YOiAvLyBNZW1vcnkgYWRkcmVzc2VkIGJ5IHRoZSBEUzpTSSByZWdpc3RlciBwYWlyCisgICAgY2FzZSBBTV9ZOiAvLyBNZW1vcnkgYWRkcmVzc2VkIGJ5IHRoZSBFUzpESSByZWdpc3RlciBwYWlyCisgICAgY2FzZSBBTV9JTVBMSUNJVDogLy8gUGFyYW1ldGVyIGlzIGltcGxpY2l0LCBvY2N1cGllcyBubyBzcGFjZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0cnVjdGlvbgorICAgICAgYnJlYWs7CisKKyAgICAvLyBUaGVyZSBpcyBhIE1vZFIvTSBieXRlIGJ1dCBpdCBkb2VzIG5vdCBuZWNlc3NhcmlseSBuZWVkCisgICAgLy8gdG8gYmUgZGVjb2RlZC4KKyAgICBjYXNlIEFNX0M6IC8vIHJlZyBmaWVsZCBvZiBNb2RSL00gc2VsZWN0cyBhIGNvbnRyb2wgcmVnaXN0ZXIKKyAgICBjYXNlIEFNX0Q6IC8vIHJlZyBmaWVsZCBvZiBNb2RSL00gc2VsZWN0cyBhIGRlYnVnIHJlZ2lzdGVyCisgICAgY2FzZSBBTV9HOiAvLyByZWcgZmllbGQgb2YgTW9kUi9NIHNlbGVjdHMgYSBnZW5lcmFsIHJlZ2lzdGVyCisgICAgY2FzZSBBTV9QOiAvLyByZWcgZmllbGQgb2YgTW9kUi9NIHNlbGVjdHMgYW4gTU1YIHJlZ2lzdGVyCisgICAgY2FzZSBBTV9SOiAvLyBtb2QgZmllbGQgb2YgTW9kUi9NIG1heSByZWZlciBvbmx5IHRvIGEgZ2VuZXJhbCByZWdpc3RlcgorICAgIGNhc2UgQU1fUzogLy8gcmVnIGZpZWxkIG9mIE1vZFIvTSBzZWxlY3RzIGEgc2VnbWVudCByZWdpc3RlcgorICAgIGNhc2UgQU1fVDogLy8gcmVnIGZpZWxkIG9mIE1vZFIvTSBzZWxlY3RzIGEgdGVzdCByZWdpc3RlcgorICAgIGNhc2UgQU1fVjogLy8gcmVnIGZpZWxkIG9mIE1vZFIvTSBzZWxlY3RzIGEgMTI4LWJpdCBYTU0gcmVnaXN0ZXIKKyAgICAgIGhhdmVfbW9kcm1fID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgLy8gSW4gdGhlc2UgYWRkcmVzc2luZyBtb2RlcywgdGhlcmUgaXMgYSBNb2RSL00gYnl0ZSBhbmQgaXQgbmVlZHMgdG8gYmUKKyAgICAvLyBkZWNvZGVkLiBObyBvdGhlciAoZS5nLiBpbW1lZGlhdGUpIHBhcmFtcyB0aGFuIGluZGljYXRlZCBpbiBNb2RSL00uCisgICAgY2FzZSBBTV9FOiAvLyBPcGVyYW5kIGlzIGVpdGhlciBhIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciBvciBtZW1vcnksCisgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBieSBNb2RSL00gYnl0ZQorICAgIGNhc2UgQU1fTTogLy8gTW9kUi9NIGJ5dGUgd2lsbCByZWZlciBvbmx5IHRvIG1lbW9yeQorICAgIGNhc2UgQU1fUTogLy8gT3BlcmFuZCBpcyBlaXRoZXIgYW4gTU1YIHJlZ2lzdGVyIG9yIG1lbW9yeSAoY29tcGxleAorICAgICAgICAgICAgICAgICAvLyBldmFsdWF0aW9uKSwgc3BlY2lmaWVkIGJ5IE1vZFIvTSBieXRlCisgICAgY2FzZSBBTV9XOiAvLyBPcGVyYW5kIGlzIGVpdGhlciBhIDEyOC1iaXQgWE1NIHJlZ2lzdGVyIG9yIG1lbW9yeSAoY29tcGxleAorICAgICAgICAgICAgICAgICAvLyBldmFsKSwgc3BlY2lmaWVkIGJ5IE1vZFIvTSBieXRlCisgICAgICBoYXZlX21vZHJtXyA9IHRydWU7CisgICAgICBzaG91bGRfZGVjb2RlX21vZHJtXyA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIC8vIFRoZXNlIGFkZHJlc3NpbmcgbW9kZXMgc3BlY2lmeSBhbiBpbW1lZGlhdGUgb3IgYW4gb2Zmc2V0IHZhbHVlCisgICAgLy8gZGlyZWN0bHksIHNvIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUgb3BlcmFuZCB0eXBlIHRvIHNlZSBob3cgbWFueQorICAgIC8vIGJ5dGVzLgorICAgIGNhc2UgQU1fSTogLy8gSW1tZWRpYXRlIGRhdGEuCisgICAgY2FzZSBBTV9KOiAvLyBKdW1wIHRvIG9mZnNldC4KKyAgICBjYXNlIEFNX086IC8vIE9wZXJhbmQgaXMgYXQgb2Zmc2V0LgorICAgICAgc3dpdGNoIChmbGFnX29wZXJhbmQgJiBPVF9NQVNLKSB7CisgICAgICAgIGNhc2UgT1RfQjogLy8gQnl0ZSByZWdhcmRsZXNzIG9mIG9wZXJhbmQtc2l6ZSBhdHRyaWJ1dGUuCisgICAgICAgICAgb3BlcmFuZF9ieXRlc18gKz0gT1NfQllURTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPVF9DOiAvLyBCeXRlIG9yIHdvcmQsIGRlcGVuZGluZyBvbiBvcGVyYW5kLXNpemUgYXR0cmlidXRlLgorICAgICAgICAgIGlmIChvcGVyYW5kX2lzXzMyX2JpdHNfKQorICAgICAgICAgICAgb3BlcmFuZF9ieXRlc18gKz0gT1NfV09SRDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBvcGVyYW5kX2J5dGVzXyArPSBPU19CWVRFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9UX0Q6IC8vIERvdWJsZXdvcmQsIHJlZ2FyZGxlc3Mgb2Ygb3BlcmFuZC1zaXplIGF0dHJpYnV0ZS4KKyAgICAgICAgICBvcGVyYW5kX2J5dGVzXyArPSBPU19ET1VCTEVfV09SRDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPVF9EUTogLy8gRG91YmxlLXF1YWR3b3JkLCByZWdhcmRsZXNzIG9mIG9wZXJhbmQtc2l6ZSBhdHRyaWJ1dGUuCisgICAgICAgICAgb3BlcmFuZF9ieXRlc18gKz0gT1NfRE9VQkxFX1FVQURfV09SRDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPVF9QOiAvLyAzMi1iaXQgb3IgNDgtYml0IHBvaW50ZXIsIGRlcGVuZGluZyBvbiBvcGVyYW5kLXNpemUKKyAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZS4KKyAgICAgICAgICBpZiAob3BlcmFuZF9pc18zMl9iaXRzXykKKyAgICAgICAgICAgIG9wZXJhbmRfYnl0ZXNfICs9IE9TXzQ4X0JJVF9QT0lOVEVSOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9wZXJhbmRfYnl0ZXNfICs9IE9TXzMyX0JJVF9QT0lOVEVSOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9UX1BTOiAvLyAxMjgtYml0IHBhY2tlZCBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGRhdGEuCisgICAgICAgICAgb3BlcmFuZF9ieXRlc18gKz0gT1NfMTI4X0JJVF9QQUNLRURfU0lOR0xFX1BSRUNJU0lPTl9GTE9BVElORzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPVF9ROiAvLyBRdWFkd29yZCwgcmVnYXJkbGVzcyBvZiBvcGVyYW5kLXNpemUgYXR0cmlidXRlLgorICAgICAgICAgIG9wZXJhbmRfYnl0ZXNfICs9IE9TX1FVQURfV09SRDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPVF9TOiAvLyA2LWJ5dGUgcHNldWRvLWRlc2NyaXB0b3IuCisgICAgICAgICAgb3BlcmFuZF9ieXRlc18gKz0gT1NfUFNFVURPX0RFU0NSSVBUT1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1RfU0Q6IC8vIFNjYWxhciBEb3VibGUtUHJlY2lzaW9uIEZsb2F0aW5nLVBvaW50IFZhbHVlCisgICAgICAgIGNhc2UgT1RfUEQ6IC8vIFVuYWxpZ25lZCBwYWNrZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZQorICAgICAgICAgIG9wZXJhbmRfYnl0ZXNfICs9IE9TX0RPVUJMRV9QUkVDSVNJT05fRkxPQVRJTkc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1RfU1M6CisgICAgICAgICAgLy8gU2NhbGFyIGVsZW1lbnQgb2YgYSAxMjgtYml0IHBhY2tlZCBzaW5nbGUtcHJlY2lzaW9uCisgICAgICAgICAgLy8gZmxvYXRpbmcgZGF0YS4KKyAgICAgICAgICAvLyBXZSBzaW1wbHkgcmV0dXJuIGVuSXRVbmtub3duIHNpbmNlIHdlIGRvbid0IGhhdmUgdG8gc3VwcG9ydAorICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50CisgICAgICAgICAgc3VjY2VlZGVkID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1RfVjogLy8gV29yZCwgZG91Ymxld29yZCBvciBxdWFkd29yZCwgZGVwZW5kaW5nIG9uIG9wZXJhbmQtc2l6ZSAKKyAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGUuCisgICAgICAgICAgaWYgKG9wZXJhbmRfaXNfNjRfYml0c18gJiYgZmxhZ19vcGVyYW5kICYgQU1fSSAmJgorICAgICAgICAgICAgICBmbGFnX29wZXJhbmQgJiBJT1NfNjQpCisgICAgICAgICAgICBvcGVyYW5kX2J5dGVzXyArPSBPU19RVUFEX1dPUkQ7CisgICAgICAgICAgZWxzZSBpZiAob3BlcmFuZF9pc18zMl9iaXRzXykKKyAgICAgICAgICAgIG9wZXJhbmRfYnl0ZXNfICs9IE9TX0RPVUJMRV9XT1JEOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG9wZXJhbmRfYnl0ZXNfICs9IE9TX1dPUkQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1RfVzogLy8gV29yZCwgcmVnYXJkbGVzcyBvZiBvcGVyYW5kLXNpemUgYXR0cmlidXRlLgorICAgICAgICAgIG9wZXJhbmRfYnl0ZXNfICs9IE9TX1dPUkQ7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gQ2FuIHNhZmVseSBpZ25vcmUgdGhlc2UuCisgICAgICAgIGNhc2UgT1RfQTogLy8gVHdvIG9uZS13b3JkIG9wZXJhbmRzIGluIG1lbW9yeSBvciB0d28gZG91YmxlLXdvcmQKKyAgICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhbmRzIGluIG1lbW9yeQorICAgICAgICBjYXNlIE9UX1BJOiAvLyBRdWFkd29yZCBNTVggdGVjaG5vbG9neSByZWdpc3RlciAoZS5nLiBtbTApCisgICAgICAgIGNhc2UgT1RfU0k6IC8vIERvdWJsZXdvcmQgaW50ZWdlciByZWdpc3RlciAoZS5nLiwgZWF4KQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdWNjZWVkZWQ7Cit9CisKK2Jvb2wgTWluaURpc2Fzc2VtYmxlcjo6UHJvY2Vzc01vZHJtKHVuc2lnbmVkIGNoYXIqIHN0YXJ0X2J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQmIHNpemUpIHsKKyAgLy8gSWYgd2UgZG9uJ3QgbmVlZCB0byBkZWNvZGUsIHdlIGp1c3QgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBNb2RSL00KKyAgLy8gYnl0ZSAodGhlcmUgaXMgbmV2ZXIgYSBTSUIgYnl0ZSBpbiB0aGlzIGNhc2UpLgorICBpZiAoIXNob3VsZF9kZWNvZGVfbW9kcm1fKSB7CisgICAgc2l6ZSsrOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gV2UgbmV2ZXIgY2FyZSBhYm91dCB0aGUgcmVnIGZpZWxkLCBvbmx5IHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgbW9kCisgIC8vIGFuZCByL20gZmllbGRzLCBzbyBsZXQncyBzdGFydCBieSBwYWNraW5nIHRob3NlIGZpZWxkcyB0b2dldGhlciBpbnRvCisgIC8vIDUgYml0cy4KKyAgdW5zaWduZWQgY2hhciBtb2RybSA9ICgqc3RhcnRfYnl0ZSk7CisgIHVuc2lnbmVkIGNoYXIgbW9kID0gbW9kcm0gJiAweEMwOyAvLyBtYXNrIG91dCB0b3AgdHdvIGJpdHMgdG8gZ2V0IG1vZCBmaWVsZAorICBtb2RybSA9IG1vZHJtICYgMHgwNzsgLy8gbWFzayBvdXQgYm90dG9tIDMgYml0cyB0byBnZXQgci9tIGZpZWxkCisgIG1vZCA9IG1vZCA+PiAzOyAvLyBzaGlmdCB0aGUgbW9kIGZpZWxkIHRvIHRoZSByaWdodCBwbGFjZQorICBtb2RybSA9IG1vZCB8IG1vZHJtOyAvLyBjb21iaW5lIHRoZSByL20gYW5kIG1vZCBmaWVsZHMgYXMgZGlzY3Vzc2VkCisgIG1vZCA9IG1vZCA+PiAzOyAvLyBzaGlmdCB0aGUgbW9kIGZpZWxkIHRvIGJpdHMgMi4uMAorCisgIC8vIEludmFyaWFudDogbW9kcm0gY29udGFpbnMgdGhlIG1vZCBmaWVsZCBpbiBiaXRzIDQuLjMgYW5kIHRoZSByL20gZmllbGQKKyAgLy8gaW4gYml0cyAyLi4wLCBhbmQgbW9kIGNvbnRhaW5zIHRoZSBtb2QgZmllbGQgaW4gYml0cyAyLi4wCisKKyAgY29uc3QgTW9kcm1FbnRyeSogbW9kcm1fZW50cnkgPSAwOworICBpZiAoYWRkcmVzc19pc18zMl9iaXRzXykKKyAgICBtb2RybV9lbnRyeSA9ICZzX2lhMzJfbW9kcm1fbWFwX1ttb2RybV07CisgIGVsc2UKKyAgICBtb2RybV9lbnRyeSA9ICZzX2lhMTZfbW9kcm1fbWFwX1ttb2RybV07CisKKyAgLy8gSW52YXJpYW50OiBtb2RybV9lbnRyeSBwb2ludHMgdG8gaW5mb3JtYXRpb24gdGhhdCB3ZSBuZWVkIHRvIGRlY29kZQorICAvLyB0aGUgTW9kUi9NIGJ5dGUuCisKKyAgLy8gQWRkIHRvIHRoZSBjb3VudCBvZiBvcGVyYW5kIGJ5dGVzLCBpZiB0aGUgTW9kUi9NIGJ5dGUgaW5kaWNhdGVzCisgIC8vIHRoYXQgc29tZSBvcGVyYW5kcyBhcmUgZW5jb2RlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCisgIGlmIChtb2RybV9lbnRyeS0+aXNfZW5jb2RlZF9pbl9pbnN0cnVjdGlvbl8pCisgICAgb3BlcmFuZF9ieXRlc18gKz0gbW9kcm1fZW50cnktPm9wZXJhbmRfc2l6ZV87CisKKyAgLy8gUHJvY2VzcyB0aGUgU0lCIGJ5dGUgaWYgbmVjZXNzYXJ5LCBhbmQgcmV0dXJuIHRoZSBjb3VudAorICAvLyBvZiBNb2RSL00gYW5kIFNJQiBieXRlcy4KKyAgaWYgKG1vZHJtX2VudHJ5LT51c2Vfc2liX2J5dGVfKSB7CisgICAgc2l6ZSsrOworICAgIHJldHVybiBQcm9jZXNzU2liKHN0YXJ0X2J5dGUgKyAxLCBtb2QsIHNpemUpOworICB9IGVsc2UgeworICAgIHNpemUrKzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitib29sIE1pbmlEaXNhc3NlbWJsZXI6OlByb2Nlc3NTaWIodW5zaWduZWQgY2hhciogc3RhcnRfYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG1vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQmIHNpemUpIHsKKyAgLy8gZ2V0IHRoZSBtb2QgZmllbGQgZnJvbSB0aGUgMi4uMCBiaXRzIG9mIHRoZSBTSUIgYnl0ZQorICB1bnNpZ25lZCBjaGFyIHNpYl9iYXNlID0gKCpzdGFydF9ieXRlKSAmIDB4MDc7CisgIGlmICgweDA1ID09IHNpYl9iYXNlKSB7CisgICAgc3dpdGNoIChtb2QpIHsKKyAgICBjYXNlIDB4MDA6IC8vIG1vZCA9PSAwMAorICAgIGNhc2UgMHgwMjogLy8gbW9kID09IDEwCisgICAgICBvcGVyYW5kX2J5dGVzXyArPSBPU19ET1VCTEVfV09SRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMTogLy8gbW9kID09IDAxCisgICAgICBvcGVyYW5kX2J5dGVzXyArPSBPU19CWVRFOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAzOiAvLyBtb2QgPT0gMTEKKyAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgSUEtMzIgZG9jcywgdGhlcmUgZG9lcyBub3Qgc2VlbSB0byBiZSBhIGRpc3AKKyAgICAgIC8vIHZhbHVlIGZvciB0aGlzIHZhbHVlIG9mIG1vZAorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBzaXplKys7CisgIHJldHVybiB0cnVlOworfQorCit9OyAgLy8gbmFtZXNwYWNlIHNpZGVzdGVwCmRpZmYgLS1naXQgYS9zcmMvd2luZG93cy9taW5pX2Rpc2Fzc2VtYmxlci5oIGIvc3JjL3dpbmRvd3MvbWluaV9kaXNhc3NlbWJsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2JkYzA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3MvbWluaV9kaXNhc3NlbWJsZXIuaApAQCAtMCwwICsxLDE5OCBAQAorLy8gLSotIE1vZGU6IEMrKzsgYy1iYXNpYy1vZmZzZXQ6IDI7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKy8qIENvcHlyaWdodCAoYykgMjAwNywgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogLS0tCisgKiBBdXRob3I6IEpvaSBTaWd1cmRzc29uCisgKgorICogRGVmaW5pdGlvbiBvZiBNaW5pRGlzYXNzZW1ibGVyLgorICovCisKKyNpZm5kZWYgR09PR0xFX1BFUkZUT09MU19NSU5JX0RJU0FTU0VNQkxFUl9IXworI2RlZmluZSBHT09HTEVfUEVSRlRPT0xTX01JTklfRElTQVNTRU1CTEVSX0hfCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAibWluaV9kaXNhc3NlbWJsZXJfdHlwZXMuaCIKKworLy8gY29tcGF0aWJpbGl0eSBzaGltCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjZGVmaW5lIFNJREVTVEVQX0FTU0VSVChjb25kKSAgUkFXX0RDSEVDSyhjb25kLCAjY29uZCkKKyNkZWZpbmUgU0lERVNURVBfTE9HKG1zZykgICAgICBSQVdfVkxPRygxLCBtc2cpCisKK25hbWVzcGFjZSBzaWRlc3RlcCB7CisKKy8vIFRoaXMgc21hbGwgZGlzYXNzZW1ibGVyIGlzIHZlcnkgbGltaXRlZAorLy8gaW4gaXRzIGZ1bmN0aW9uYWxpdHksIGFuZCBpbiBmYWN0IGRvZXMgb25seSB0aGUgYmFyZSBtaW5pbXVtIHJlcXVpcmVkIGJ5IHRoZQorLy8gcHJlYW1ibGUgcGF0Y2hpbmcgdXRpbGl0eS4gIEl0IG1heSBiZSB1c2VmdWwgZm9yIG90aGVyIHB1cnBvc2VzLCBob3dldmVyLgorLy8KKy8vIFRoZSBsaW1pdGF0aW9ucyBpbmNsdWRlIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmc6CisvLyAgLSMgTm8gc3VwcG9ydCBmb3IgY29wcm9jZXNzb3Igb3Bjb2RlcywgTU1YLCBldGMuCisvLyAgLSMgTm8gbWFjaGluZS1yZWFkYWJsZSBpZGVudGlmaWNhdGlvbiBvZiBvcGNvZGVzIG9yIGRlY29kaW5nIG9mCisvLyAgICAgYXNzZW1ibHkgcGFyYW1ldGVycy4gVGhlIG5hbWUgb2YgdGhlIG9wY29kZSAoYXMgYSBzdHJpbmcpIGlzIGdpdmVuLAorLy8gICAgIGhvd2V2ZXIsIHRvIGFpZCBkZWJ1Z2dpbmcuCisvLworLy8gWW91IG1heSBhc2sgd2hhdCB0aGlzIGxpdHRsZSBkaXNhc3NlbWJsZXIgYWN0dWFsbHkgZG9lcywgdGhlbj8gIFRoZSBhbnN3ZXIgaXMKKy8vIHRoYXQgaXQgZG9lcyB0aGUgZm9sbG93aW5nLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgdGhlIHBhdGNoaW5nIHV0aWxpdHkgbmVlZHM6CisvLyAgLSMgSW5kaWNhdGVzIGlmIG9wY29kZSBpcyBhIGp1bXAgKGFueSBraW5kKSBvciBhIHJldHVybiAoYW55IGtpbmQpCisvLyAgICAgYmVjYXVzZSB0aGlzIGlzIGltcG9ydGFudCBmb3IgdGhlIHBhdGNoaW5nIHV0aWxpdHkgdG8gZGV0ZXJtaW5lIGlmCisvLyAgICAgYSBmdW5jdGlvbiBpcyB0b28gc2hvcnQgb3IgdGhlcmUgYXJlIGp1bXBzIHRvbyBlYXJseSBpbiBpdCBmb3IgaXQKKy8vICAgICB0byBiZSBwcmVhbWJsZSBwYXRjaGVkLgorLy8gIC0jIFRoZSBvcGNvZGUgbGVuZ3RoIGlzIGFsd2F5cyBjYWxjdWxhdGVkLCBzbyB0aGF0IHRoZSBwYXRjaGluZyB1dGlsaXR5CisvLyAgICAgY2FuIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gc3RhcnRzLCBhbmQgd2hldGhlciBpdAorLy8gICAgIGFscmVhZHkgaGFzIGVub3VnaCBpbnN0cnVjdGlvbnMgdG8gcmVwbGFjZSB3aXRoIHRoZSBhYnNvbHV0ZSBqdW1wCisvLyAgICAgdG8gdGhlIHBhdGNoaW5nIGNvZGUuCisvLworLy8gVGhlIHVzYWdlIGlzIHF1aXRlIHNpbXBsZTsganVzdCBjcmVhdGUgYSBNaW5pRGlzYXNzZW1ibGVyIGFuZCB1c2UgaXRzCisvLyBEaXNhc3NlbWJsZSgpIG1ldGhvZC4KKy8vCisvLyBJZiB5b3Ugd291bGQgbGlrZSB0byBleHRlbmQgdGhpcyBkaXNhc3NlbWJsZXIsIHBsZWFzZSByZWZlciB0byB0aGUKKy8vIElBLTMyIEludGVsriBBcmNoaXRlY3R1cmUgU29mdHdhcmUgRGV2ZWxvcGVyknMgTWFudWFsIFZvbHVtZSAyOgorLy8gSW5zdHJ1Y3Rpb24gU2V0IFJlZmVyZW5jZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgb3BlcmFuZCBkZWNvZGluZworLy8gZXRjLgorY2xhc3MgUEVSRlRPT0xTX0RMTF9ERUNMIE1pbmlEaXNhc3NlbWJsZXIgeworIHB1YmxpYzoKKworICAvLyBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGFuZCBzZXRzIGRlZmF1bHRzLgorICAvLworICAvLyBAcGFyYW0gb3BlcmFuZF9kZWZhdWx0XzMyX2JpdHMgSWYgdHJ1ZSwgdGhlIGRlZmF1bHQgb3BlcmFuZCBzaXplIGlzCisgIC8vIHNldCB0byAzMiBiaXRzLCB3aGljaCBpcyB0aGUgZGVmYXVsdCB1bmRlciBXaW4zMi4gT3RoZXJ3aXNlIGl0IGlzIDE2IGJpdHMuCisgIC8vIEBwYXJhbSBhZGRyZXNzX2RlZmF1bHRfMzJfYml0cyBJZiB0cnVlLCB0aGUgZGVmYXVsdCBhZGRyZXNzIHNpemUgaXMKKyAgLy8gc2V0IHRvIDMyIGJpdHMsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHVuZGVyIFdpbjMyLiBPdGhlcndpc2UgaXQgaXMgMTYgYml0cy4KKyAgTWluaURpc2Fzc2VtYmxlcihib29sIG9wZXJhbmRfZGVmYXVsdF8zMl9iaXRzLAorICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkcmVzc19kZWZhdWx0XzMyX2JpdHMpOworCisgIC8vIEVxdWl2YWxlbnQgdG8gTWluaURpc2Fzc2VtYmxlcih0cnVlLCB0cnVlKTsKKyAgTWluaURpc2Fzc2VtYmxlcigpOworCisgIC8vIEF0dGVtcHRzIHRvIGRpc2Fzc2VtYmxlIGEgc2luZ2xlIGluc3RydWN0aW9uIHN0YXJ0aW5nIGZyb20gdGhlCisgIC8vIGFkZHJlc3MgaW4gbWVtb3J5IGl0IGlzIHBvaW50ZWQgdG8uCisgIC8vCisgIC8vIEBwYXJhbSBzdGFydCBBZGRyZXNzIHdoZXJlIGRpc2Fzc2VtYmx5IHNob3VsZCBzdGFydC4KKyAgLy8gQHBhcmFtIGluc3RydWN0aW9uX2J5dGVzIFZhcmlhYmxlIHRoYXQgd2lsbCBiZSA8Yj5pbmNyZW1lbnRlZDwvYj4gYnkKKyAgLy8gdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgIC8vIEByZXR1cm4gZW5JdEp1bXAsIGVuSXRSZXR1cm4gb3IgZW5JdEdlbmVyaWMgb24gc3VjY2Vzcy4gIGVuSXRVbmtub3duCisgIC8vIGlmIHVuYWJsZSB0byBkaXNhc3NlbWJsZSwgZW5JdFVudXNlZCBpZiB0aGlzIHNlZW1zIHRvIGJlIGFuIHVudXNlZAorICAvLyBvcGNvZGUuIEluIHRoZSBsYXN0IHR3byAoZXJyb3IpIGNhc2VzLCBjYkluc3RydWN0aW9uIHdpbGwgYmUgc2V0CisgIC8vIHRvIDB4ZmZmZmZmZmYuCisgIC8vCisgIC8vIEBwb3N0IFRoaXMgaW5zdGFuY2Ugb2YgdGhlIGRpc2Fzc2VtYmxlciBpcyByZWFkeSB0byBiZSB1c2VkIGFnYWluLAorICAvLyB3aXRoIHVuY2hhbmdlZCBkZWZhdWx0cyBmcm9tIGNyZWF0aW9uIHRpbWUuCisgIEluc3RydWN0aW9uVHlwZSBEaXNhc3NlbWJsZSh1bnNpZ25lZCBjaGFyKiBzdGFydCwgdW5zaWduZWQgaW50JiBpbnN0cnVjdGlvbl9ieXRlcyk7CisKKyBwcml2YXRlOgorCisgIC8vIE1ha2VzIHRoZSBkaXNhc3NlbWJsZXIgcmVhZHkgZm9yIHJldXNlLgorICB2b2lkIEluaXRpYWxpemUoKTsKKworICAvLyBTZXRzIHRoZSBmbGFncyBmb3IgYWRkcmVzcyBhbmQgb3BlcmFuZCBzaXplcy4KKyAgLy8gQHJldHVybiBOdW1iZXIgb2YgcHJlZml4IGJ5dGVzLgorICBJbnN0cnVjdGlvblR5cGUgUHJvY2Vzc1ByZWZpeGVzKHVuc2lnbmVkIGNoYXIqIHN0YXJ0LCB1bnNpZ25lZCBpbnQmIHNpemUpOworCisgIC8vIFNldHMgdGhlIGZsYWcgZm9yIHdoZXRoZXIgd2UgaGF2ZSBNb2RSL00sIGFuZCBpbmNyZW1lbnRzCisgIC8vIG9wZXJhbmRfYnl0ZXNfIGlmIGFueSBhcmUgc3BlY2lmaWVzIGJ5IHRoZSBvcGNvZGUgZGlyZWN0bHkuCisgIC8vIEByZXR1cm4gTnVtYmVyIG9mIG9wY29kZSBieXRlcy4KKyAgSW5zdHJ1Y3Rpb25UeXBlIFByb2Nlc3NPcGNvZGUodW5zaWduZWQgY2hhciogc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50JiBzaXplKTsKKworICAvLyBDaGVja3MgdGhlIHR5cGUgb2YgdGhlIHN1cHBsaWVkIG9wZXJhbmQuICBJbmNyZW1lbnRzCisgIC8vIG9wZXJhbmRfYnl0ZXNfIGlmIGl0IGRpcmVjdGx5IGluZGljYXRlcyBhbiBpbW1lZGlhdGUgZXRjLgorICAvLyBvcGVyYW5kLiAgQXNzZXJ0cyBoYXZlX21vZHJtXyBpZiB0aGUgb3BlcmFuZCBzcGVjaWZpZXMKKyAgLy8gYSBNb2RSL00gYnl0ZS4KKyAgYm9vbCBQcm9jZXNzT3BlcmFuZChpbnQgZmxhZ19vcGVyYW5kKTsKKworICAvLyBJbmNyZW1lbnRzIG9wZXJhbmRfYnl0ZXNfIGJ5IHNpemUgc3BlY2lmaWVkIGJ5IE1vZFIvTSBhbmQKKyAgLy8gYnkgU0lCIGlmIHByZXNlbnQuCisgIC8vIEByZXR1cm4gMCBpbiBjYXNlIG9mIGVycm9yLCAxIGlmIHRoZXJlIGlzIGp1c3QgYSBNb2RSL00gYnl0ZSwKKyAgLy8gMiBpZiB0aGVyZSBpcyBhIE1vZFIvTSBieXRlIGFuZCBhIFNJQiBieXRlLgorICBib29sIFByb2Nlc3NNb2RybSh1bnNpZ25lZCBjaGFyKiBzdGFydCwgdW5zaWduZWQgaW50JiBzaXplKTsKKworICAvLyBQcm9jZXNzZXMgdGhlIFNJQiBieXRlIHRoYXQgaXQgaXMgcG9pbnRlZCB0by4KKyAgLy8gQHBhcmFtIHN0YXJ0IFBvaW50ZXIgdG8gdGhlIFNJQiBieXRlLgorICAvLyBAcGFyYW0gbW9kIFRoZSBtb2QgZmllbGQgZnJvbSB0aGUgTW9kUi9NIGJ5dGUuCisgIC8vIEByZXR1cm4gMSB0byBpbmRpY2F0ZSBzdWNjZXNzIChpbmRpY2F0ZXMgMSBTSUIgYnl0ZSkKKyAgYm9vbCBQcm9jZXNzU2liKHVuc2lnbmVkIGNoYXIqIHN0YXJ0LCB1bnNpZ25lZCBjaGFyIG1vZCwgdW5zaWduZWQgaW50JiBzaXplKTsKKworICAvLyBUaGUgaW5zdHJ1Y3Rpb24gdHlwZSB3ZSBoYXZlIGRlY29kZWQgZnJvbSB0aGUgb3Bjb2RlLgorICBJbnN0cnVjdGlvblR5cGUgaW5zdHJ1Y3Rpb25fdHlwZV87CisKKyAgLy8gQ291bnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBpcyBvY2N1cGllZCBieSBvcGVyYW5kcyBpbgorICAvLyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiAobm90ZTogd2UgZG9uJ3QgY2FyZSBhYm91dCBob3cgbGFyZ2UKKyAgLy8gb3BlcmFuZHMgc3RvcmVkIGluIHJlZ2lzdGVycyBldGMuIGFyZSkuCisgIHVuc2lnbmVkIGludCBvcGVyYW5kX2J5dGVzXzsKKworICAvLyBUcnVlIGlmZiB0aGVyZSBpcyBhIE1vZFIvTSBieXRlIGluIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaGF2ZV9tb2RybV87CisKKyAgLy8gVHJ1ZSBpZmYgd2UgbmVlZCB0byBkZWNvZGUgdGhlIE1vZFIvTSBieXRlIChzb21ldGltZXMgaXQganVzdAorICAvLyBwb2ludHMgdG8gYSByZWdpc3Rlciwgd2UgY2FuIHRlbGwgYnkgdGhlIGFkZHJlc3NpbmcgbW9kZSkuCisgIGJvb2wgc2hvdWxkX2RlY29kZV9tb2RybV87CisKKyAgLy8gQ3VycmVudCBvcGVyYW5kIHNpemUgaXMgMzIgYml0cyBpZiB0cnVlLCAxNiBiaXRzIGlmIGZhbHNlLgorICBib29sIG9wZXJhbmRfaXNfMzJfYml0c187CisKKyAgLy8gRGVmYXVsdCBvcGVyYW5kIHNpemUgaXMgMzIgYml0cyBpZiB0cnVlLCAxNiBiaXRzIGlmIGZhbHNlLgorICBib29sIG9wZXJhbmRfZGVmYXVsdF9pc18zMl9iaXRzXzsKKworICAvLyBDdXJyZW50IGFkZHJlc3Mgc2l6ZSBpcyAzMiBiaXRzIGlmIHRydWUsIDE2IGJpdHMgaWYgZmFsc2UuCisgIGJvb2wgYWRkcmVzc19pc18zMl9iaXRzXzsKKworICAvLyBEZWZhdWx0IGFkZHJlc3Mgc2l6ZSBpcyAzMiBiaXRzIGlmIHRydWUsIDE2IGJpdHMgaWYgZmFsc2UuCisgIGJvb2wgYWRkcmVzc19kZWZhdWx0X2lzXzMyX2JpdHNfOworCisgIC8vIERldGVybWluZXMgaWYgNjQgYml0IG9wZXJhbmRzIGFyZSBzdXBwb3J0ZWQgKHg2NCkuCisgIGJvb2wgb3BlcmFuZF9kZWZhdWx0X3N1cHBvcnRfNjRfYml0c187CisKKyAgLy8gQ3VycmVudCBvcGVyYW5kIHNpemUgaXMgNjQgYml0cyBpZiB0cnVlLCAzMiBiaXRzIGlmIGZhbHNlLgorICBib29sIG9wZXJhbmRfaXNfNjRfYml0c187CisKKyAgLy8gSHVnZSBiaWcgb3Bjb2RlIHRhYmxlIGJhc2VkIG9uIHRoZSBJQS0zMiBtYW51YWwsIGRlZmluZWQKKyAgLy8gaW4gSWEzMk9wY29kZU1hcC5jYworICBzdGF0aWMgY29uc3QgT3Bjb2RlVGFibGUgc19pYTMyX29wY29kZV9tYXBfW107CisKKyAgLy8gU29tZXdoYXQgc21hbGxlciB0YWJsZSB0byBoZWxwIHdpdGggZGVjb2RpbmcgTW9kUi9NIGJ5dGVzCisgIC8vIHdoZW4gMTYtYml0IGFkZHJlc3NpbmcgbW9kZSBpcyBiZWluZyB1c2VkLiAgRGVmaW5lZCBpbgorICAvLyBJYTMyTW9kcm1NYXAuY2MKKyAgc3RhdGljIGNvbnN0IE1vZHJtRW50cnkgc19pYTE2X21vZHJtX21hcF9bXTsKKworICAvLyBTb21ld2hhdCBzbWFsbGVyIHRhYmxlIHRvIGhlbHAgd2l0aCBkZWNvZGluZyBNb2RSL00gYnl0ZXMKKyAgLy8gd2hlbiAzMi1iaXQgYWRkcmVzc2luZyBtb2RlIGlzIGJlaW5nIHVzZWQuICBEZWZpbmVkIGluCisgIC8vIElhMzJNb2RybU1hcC5jYworICBzdGF0aWMgY29uc3QgTW9kcm1FbnRyeSBzX2lhMzJfbW9kcm1fbWFwX1tdOworCisgIC8vIEluZGljYXRvcnMgb2Ygd2hldGhlciB3ZSBnb3QgY2VydGFpbiBwcmVmaXhlcyB0aGF0IGNlcnRhaW4KKyAgLy8gc2lsbHkgSW50ZWwgaW5zdHJ1Y3Rpb25zIGRlcGVuZCBvbiBpbiBub25zdGFuZGFyZCB3YXlzIGZvcgorICAvLyB0aGVpciBiZWhhdmlvcnMuCisgIGJvb2wgZ290X2YyX3ByZWZpeF8sIGdvdF9mM19wcmVmaXhfLCBnb3RfNjZfcHJlZml4XzsKK307CisKK307ICAvLyBuYW1lc3BhY2Ugc2lkZXN0ZXAKKworI2VuZGlmICAvLyBHT09HTEVfUEVSRlRPT0xTX01JTklfRElTQVNTRU1CTEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvd2luZG93cy9taW5pX2Rpc2Fzc2VtYmxlcl90eXBlcy5oIGIvc3JjL3dpbmRvd3MvbWluaV9kaXNhc3NlbWJsZXJfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQ0NzU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3MvbWluaV9kaXNhc3NlbWJsZXJfdHlwZXMuaApAQCAtMCwwICsxLDIzNyBAQAorLy8gLSotIE1vZGU6IEMrKzsgYy1iYXNpYy1vZmZzZXQ6IDI7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKy8qIENvcHlyaWdodCAoYykgMjAwNywgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogLS0tCisgKiBBdXRob3I6IEpvaSBTaWd1cmRzc29uCisgKgorICogU2V2ZXJhbCBzaW1wbGUgdHlwZXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGFuZCBzb21lIG9mIHRoZSBwYXRjaGluZworICogbWVjaGFuaXNtcy4KKyAqLworCisjaWZuZGVmIEdPT0dMRV9QRVJGVE9PTFNfTUlOSV9ESVNBU1NFTUJMRVJfVFlQRVNfSF8KKyNkZWZpbmUgR09PR0xFX1BFUkZUT09MU19NSU5JX0RJU0FTU0VNQkxFUl9UWVBFU19IXworCituYW1lc3BhY2Ugc2lkZXN0ZXAgeworCisvLyBDYXRlZ29yaWVzIG9mIGluc3RydWN0aW9ucyB0aGF0IHdlIGNhcmUgYWJvdXQKK2VudW0gSW5zdHJ1Y3Rpb25UeXBlIHsKKyAgLy8gVGhpcyBvcGNvZGUgaXMgbm90IHVzZWQKKyAgSVRfVU5VU0VELAorICAvLyBUaGlzIGRpc2Fzc2VtYmxlciBkb2VzIG5vdCByZWNvZ25pemUgdGhpcyBvcGNvZGUgKGVycm9yKQorICBJVF9VTktOT1dOLAorICAvLyBUaGlzIGlzIG5vdCBhbiBpbnN0cnVjdGlvbiBidXQgYSByZWZlcmVuY2UgdG8gYW5vdGhlciB0YWJsZQorICBJVF9SRUZFUkVOQ0UsCisgIC8vIFRoaXMgYnl0ZSBpcyBhIHByZWZpeCBieXRlIHRoYXQgd2UgY2FuIGlnbm9yZQorICBJVF9QUkVGSVgsCisgIC8vIFRoaXMgaXMgYSBwcmVmaXggYnl0ZSB0aGF0IHN3aXRjaGVzIHRvIHRoZSBub25kZWZhdWx0IGFkZHJlc3Mgc2l6ZQorICBJVF9QUkVGSVhfQUREUkVTUywKKyAgLy8gVGhpcyBpcyBhIHByZWZpeCBieXRlIHRoYXQgc3dpdGNoZXMgdG8gdGhlIG5vbmRlZmF1bHQgb3BlcmFuZCBzaXplCisgIElUX1BSRUZJWF9PUEVSQU5ELAorICAvLyBBIGp1bXAgb3IgY2FsbCBpbnN0cnVjdGlvbgorICBJVF9KVU1QLAorICAvLyBBIHJldHVybiBpbnN0cnVjdGlvbgorICBJVF9SRVRVUk4sCisgIC8vIEFueSBvdGhlciB0eXBlIG9mIGluc3RydWN0aW9uIChpbiB0aGlzIGNhc2Ugd2UgZG9uJ3QgY2FyZSB3aGF0IGl0IGlzKQorICBJVF9HRU5FUklDLAorfTsKKworLy8gTGlzdHMgSUEtMzIgb3BlcmFuZCBzaXplcyBpbiBtdWx0aXBsZXMgb2YgOCBiaXRzCitlbnVtIE9wZXJhbmRTaXplIHsKKyAgT1NfWkVSTyA9IDAsCisgIE9TX0JZVEUgPSAxLAorICBPU19XT1JEID0gMiwKKyAgT1NfRE9VQkxFX1dPUkQgPSA0LAorICBPU19RVUFEX1dPUkQgPSA4LAorICBPU19ET1VCTEVfUVVBRF9XT1JEID0gMTYsCisgIE9TXzMyX0JJVF9QT0lOVEVSID0gMzIvOCwKKyAgT1NfNDhfQklUX1BPSU5URVIgPSA0OC84LAorICBPU19TSU5HTEVfUFJFQ0lTSU9OX0ZMT0FUSU5HID0gMzIvOCwKKyAgT1NfRE9VQkxFX1BSRUNJU0lPTl9GTE9BVElORyA9IDY0LzgsCisgIE9TX0RPVUJMRV9FWFRFTkRFRF9QUkVDSVNJT05fRkxPQVRJTkcgPSA4MC84LAorICBPU18xMjhfQklUX1BBQ0tFRF9TSU5HTEVfUFJFQ0lTSU9OX0ZMT0FUSU5HID0gMTI4LzgsCisgIE9TX1BTRVVET19ERVNDUklQVE9SID0gNgorfTsKKworLy8gT3BlcmFuZCBhZGRyZXNzaW5nIG1ldGhvZHMgZnJvbSB0aGUgSUEtMzIgbWFudWFsLiAgVGhlIGVuQW1NYXNrIHZhbHVlCisvLyBpcyBhIG1hc2sgZm9yIHRoZSByZXN0LiAgVGhlIG90aGVyIGVudW1lcmF0aW9uIHZhbHVlcyBhcmUgbmFtZWQgZm9yIHRoZQorLy8gbmFtZXMgZ2l2ZW4gdG8gdGhlIGFkZHJlc3NpbmcgbWV0aG9kcyBpbiB0aGUgbWFudWFsLCBlLmcuIGVuQW1fRCBpcyBmb3IKKy8vIHRoZSBEIGFkZHJlc3NpbmcgbWV0aG9kLgorLy8KKy8vIFRoZSByZWFzb24gd2UgdXNlIGEgZnVsbCA0IGJ5dGVzIGFuZCBhIG1hc2ssIGlzIHRoYXQgd2UgbmVlZCB0byBjb21iaW5lCisvLyB0aGVzZSBmbGFncyB3aXRoIHRoZSBlbk9wZXJhbmRUeXBlIHRvIHN0b3JlIHRoZSBkZXRhaWxzCisvLyBvbiB0aGUgb3BlcmFuZCBpbiBhIHNpbmdsZSBpbnRlZ2VyLgorZW51bSBBZGRyZXNzaW5nTWV0aG9kIHsKKyAgQU1fTk9UX1VTRUQgPSAwLCAgICAgICAgLy8gVGhpcyBvcGVyYW5kIGlzIG5vdCB1c2VkIGZvciB0aGlzIGluc3RydWN0aW9uCisgIEFNX01BU0sgPSAweDAwRkYwMDAwLCAgLy8gTWFzayBmb3IgdGhlIHJlc3Qgb2YgdGhlIHZhbHVlcyBpbiB0aGlzIGVudW1lcmF0aW9uCisgIEFNX0EgPSAweDAwMDEwMDAwLCAgICAvLyBBIGFkZHJlc3NpbmcgdHlwZQorICBBTV9DID0gMHgwMDAyMDAwMCwgICAgLy8gQyBhZGRyZXNzaW5nIHR5cGUKKyAgQU1fRCA9IDB4MDAwMzAwMDAsICAgIC8vIEQgYWRkcmVzc2luZyB0eXBlCisgIEFNX0UgPSAweDAwMDQwMDAwLCAgICAvLyBFIGFkZHJlc3NpbmcgdHlwZQorICBBTV9GID0gMHgwMDA1MDAwMCwgICAgLy8gRiBhZGRyZXNzaW5nIHR5cGUKKyAgQU1fRyA9IDB4MDAwNjAwMDAsICAgIC8vIEcgYWRkcmVzc2luZyB0eXBlCisgIEFNX0kgPSAweDAwMDcwMDAwLCAgICAvLyBJIGFkZHJlc3NpbmcgdHlwZQorICBBTV9KID0gMHgwMDA4MDAwMCwgICAgLy8gSiBhZGRyZXNzaW5nIHR5cGUKKyAgQU1fTSA9IDB4MDAwOTAwMDAsICAgIC8vIE0gYWRkcmVzc2luZyB0eXBlCisgIEFNX08gPSAweDAwMEEwMDAwLCAgICAvLyBPIGFkZHJlc3NpbmcgdHlwZQorICBBTV9QID0gMHgwMDBCMDAwMCwgICAgLy8gUCBhZGRyZXNzaW5nIHR5cGUKKyAgQU1fUSA9IDB4MDAwQzAwMDAsICAgIC8vIFEgYWRkcmVzc2luZyB0eXBlCisgIEFNX1IgPSAweDAwMEQwMDAwLCAgICAvLyBSIGFkZHJlc3NpbmcgdHlwZQorICBBTV9TID0gMHgwMDBFMDAwMCwgICAgLy8gUyBhZGRyZXNzaW5nIHR5cGUKKyAgQU1fVCA9IDB4MDAwRjAwMDAsICAgIC8vIFQgYWRkcmVzc2luZyB0eXBlCisgIEFNX1YgPSAweDAwMTAwMDAwLCAgICAvLyBWIGFkZHJlc3NpbmcgdHlwZQorICBBTV9XID0gMHgwMDExMDAwMCwgICAgLy8gVyBhZGRyZXNzaW5nIHR5cGUKKyAgQU1fWCA9IDB4MDAxMjAwMDAsICAgIC8vIFggYWRkcmVzc2luZyB0eXBlCisgIEFNX1kgPSAweDAwMTMwMDAwLCAgICAvLyBZIGFkZHJlc3NpbmcgdHlwZQorICBBTV9SRUdJU1RFUiA9IDB4MDAxNDAwMDAsICAvLyBTcGVjaWZpYyByZWdpc3RlciBpcyBhbHdheXMgdXNlZCBhcyB0aGlzIG9wCisgIEFNX0lNUExJQ0lUID0gMHgwMDE1MDAwMCwgIC8vIEFuIGltcGxpY2l0LCBmaXhlZCB2YWx1ZSBpcyB1c2VkCit9OworCisvLyBPcGVyYW5kIHR5cGVzIGZyb20gdGhlIElBLTMyIG1hbnVhbC4gVGhlIGVuT3RNYXNrIHZhbHVlIGlzCisvLyBhIG1hc2sgZm9yIHRoZSByZXN0LiBUaGUgcmVzdCBvZiB0aGUgdmFsdWVzIGFyZSBuYW1lZCBmb3IgdGhlCisvLyBuYW1lcyBnaXZlbiB0byB0aGVzZSBvcGVyYW5kIHR5cGVzIGluIHRoZSBtYW51YWwsIGUuZy4gZW5PdF9wcworLy8gaXMgZm9yIHRoZSBwcyBvcGVyYW5kIHR5cGUgaW4gdGhlIG1hbnVhbC4KKy8vCisvLyBUaGUgcmVhc29uIHdlIHVzZSBhIGZ1bGwgNCBieXRlcyBhbmQgYSBtYXNrLCBpcyB0aGF0IHdlIG5lZWQKKy8vIHRvIGNvbWJpbmUgdGhlc2UgZmxhZ3Mgd2l0aCB0aGUgZW5BZGRyZXNzaW5nTWV0aG9kIHRvIHN0b3JlIHRoZSBkZXRhaWxzCisvLyBvbiB0aGUgb3BlcmFuZCBpbiBhIHNpbmdsZSBpbnRlZ2VyLgorZW51bSBPcGVyYW5kVHlwZSB7CisgIE9UX01BU0sgPSAweEZGMDAwMDAwLAorICBPVF9BID0gMHgwMTAwMDAwMCwKKyAgT1RfQiA9IDB4MDIwMDAwMDAsCisgIE9UX0MgPSAweDAzMDAwMDAwLAorICBPVF9EID0gMHgwNDAwMDAwMCwKKyAgT1RfRFEgPSAweDA1MDAwMDAwLAorICBPVF9QID0gMHgwNjAwMDAwMCwKKyAgT1RfUEkgPSAweDA3MDAwMDAwLAorICBPVF9QUyA9IDB4MDgwMDAwMDAsICAvLyBhY3R1YWxseSB1bnN1cHBvcnRlZCBmb3IgKHdlIGRvbid0IGtub3cgaXRzIHNpemUpCisgIE9UX1EgPSAweDA5MDAwMDAwLAorICBPVF9TID0gMHgwQTAwMDAwMCwKKyAgT1RfU1MgPSAweDBCMDAwMDAwLAorICBPVF9TSSA9IDB4MEMwMDAwMDAsCisgIE9UX1YgPSAweDBEMDAwMDAwLAorICBPVF9XID0gMHgwRTAwMDAwMCwKKyAgT1RfU0QgPSAweDBGMDAwMDAwLCAgLy8gc2NhbGFyIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKKyAgT1RfUEQgPSAweDEwMDAwMDAwLCAgLy8gZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludAorICAvLyBkdW1teSAib3BlcmFuZCB0eXBlIiBmb3IgYWRkcmVzcyBtb2RlIE0gLSB3aGljaCBkb2Vzbid0IHNwZWNpZnkKKyAgLy8gb3BlcmFuZCB0eXBlCisgIE9UX0FERFJFU1NfTU9ERV9NID0gMHg4MDAwMDAwMAorfTsKKworLy8gRmxhZyB0aGF0IGluZGljYXRlcyBpZiBhbiBpbW1lZGlhdGUgb3BlcmFuZCBpcyA2NC1iaXRzLgorLy8KKy8vIFRoZSBJbnRlbCA2NCBhbmQgSUEtMzIgQXJjaGl0ZWN0dXJlIFNvZnR3YXJlIERldmVsb3BlcidzIE1hbnVhbCBjdXJyZW50bHkKKy8vIGRlZmluZXMgTU9WIGFzIHRoZSBvbmx5IGluc3RydWN0aW9uIHN1cHBvcnRpbmcgYSA2NC1iaXQgaW1tZWRpYXRlIG9wZXJhbmQuCitlbnVtIEltbWVkaWF0ZU9wZXJhbmRTaXplIHsKKyAgSU9TX01BU0sgPSAweDAwMDBGMDAwLAorICBJT1NfREVGQVVMVCA9IDB4MCwKKyAgSU9TXzY0ID0gMHgwMDAwMTAwMAorfTsKKworLy8gRXZlcnl0aGluZyB0aGF0J3MgaW4gYW4gT3Bjb2RlIChzZWUgYmVsb3cpIGV4Y2VwdCB0aGUgdGhyZWUKKy8vIGFsdGVybmF0aXZlIG9wY29kZSBzdHJ1Y3RzIGZvciBkaWZmZXJlbnQgcHJlZml4ZXMuCitzdHJ1Y3QgU3BlY2lmaWNPcGNvZGUgeworICAvLyBJbmRleCB0byBjb250aW51YXRpb24gdGFibGUsIG9yIDAgaWYgdGhpcyBpcyB0aGUgbGFzdAorICAvLyBieXRlIGluIHRoZSBvcGNvZGUuCisgIGludCB0YWJsZV9pbmRleF87CisKKyAgLy8gVGhlIG9wY29kZSB0eXBlCisgIEluc3RydWN0aW9uVHlwZSB0eXBlXzsKKworICAvLyBEZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiB0aGUgZGVzdCwgc3JjIGFuZCBhdXggb3BlcmFuZHMsCisgIC8vIHB1dCB0b2dldGhlciBmcm9tIGVuT3BlcmFuZFR5cGUsIGVuQWRkcmVzc2luZ01ldGhvZCBhbmQgCisgIC8vIGVuSW1tZWRpYXRlT3BlcmFuZFNpemUgZmxhZ3MuCisgIGludCBmbGFnX2Rlc3RfOworICBpbnQgZmxhZ19zb3VyY2VfOworICBpbnQgZmxhZ19hdXhfOworCisgIC8vIFdlIGluZGljYXRlIHRoZSBtbmVtb25pYyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisgIGNvbnN0IGNoYXIqIG1uZW1vbmljXzsKK307CisKKy8vIFRoZSBpbmZvcm1hdGlvbiB3ZSBrZWVwIGluIG91ciB0YWJsZXMgYWJvdXQgZWFjaCBvZiB0aGUgZGlmZmVyZW50CisvLyB2YWxpZCBpbnN0cnVjdGlvbnMgcmVjb2duaXplZCBieSB0aGUgSUEtMzIgYXJjaGl0ZWN0dXJlLgorc3RydWN0IE9wY29kZSB7CisgIC8vIEluZGV4IHRvIGNvbnRpbnVhdGlvbiB0YWJsZSwgb3IgMCBpZiB0aGlzIGlzIHRoZSBsYXN0CisgIC8vIGJ5dGUgaW4gdGhlIG9wY29kZS4KKyAgaW50IHRhYmxlX2luZGV4XzsKKworICAvLyBUaGUgb3Bjb2RlIHR5cGUKKyAgSW5zdHJ1Y3Rpb25UeXBlIHR5cGVfOworCisgIC8vIERlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIHRoZSBkZXN0LCBzcmMgYW5kIGF1eCBvcGVyYW5kcywKKyAgLy8gcHV0IHRvZ2V0aGVyIGZyb20gYW4gZW5PcGVyYW5kVHlwZSBmbGFnIGFuZCBhbiBlbkFkZHJlc3NpbmdNZXRob2QKKyAgLy8gZmxhZy4KKyAgaW50IGZsYWdfZGVzdF87CisgIGludCBmbGFnX3NvdXJjZV87CisgIGludCBmbGFnX2F1eF87CisKKyAgLy8gV2UgaW5kaWNhdGUgdGhlIG1uZW1vbmljIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyAgY29uc3QgY2hhciogbW5lbW9uaWNfOworCisgIC8vIEFsdGVybmF0aXZlIG9wY29kZSBpbmZvIGlmIGNlcnRhaW4gcHJlZml4ZXMgYXJlIHNwZWNpZmllZC4KKyAgLy8gSW4gbW9zdCBjYXNlcywgYWxsIG9mIHRoZXNlIGFyZSB6ZXJvZWQtb3V0LiAgT25seSB1c2VkIGlmCisgIC8vIGJQcmVmaXhEZXBlbmRlbnQgaXMgdHJ1ZS4KKyAgYm9vbCBpc19wcmVmaXhfZGVwZW5kZW50XzsKKyAgU3BlY2lmaWNPcGNvZGUgb3Bjb2RlX2lmX2YyX3ByZWZpeF87CisgIFNwZWNpZmljT3Bjb2RlIG9wY29kZV9pZl9mM19wcmVmaXhfOworICBTcGVjaWZpY09wY29kZSBvcGNvZGVfaWZfNjZfcHJlZml4XzsKK307CisKKy8vIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggdGFibGUgZW50cnkuCitzdHJ1Y3QgT3Bjb2RlVGFibGUgeworICAvLyBUYWJsZSBvZiBpbnN0cnVjdGlvbiBlbnRyaWVzCisgIGNvbnN0IE9wY29kZSogdGFibGVfOworICAvLyBIb3cgbWFueSBieXRlcyBsZWZ0IHRvIHNoaWZ0IE1vZFIvTSBieXRlIDxiPmJlZm9yZTwvYj4gYXBwbHlpbmcgbWFzaworICB1bnNpZ25lZCBjaGFyIHNoaWZ0XzsKKyAgLy8gTWFzayB0byBhcHBseSB0byBieXRlIGJlaW5nIGxvb2tlZCBhdCBiZWZvcmUgY29tcGFyaW5nIHRvIHRhYmxlCisgIHVuc2lnbmVkIGNoYXIgbWFza187CisgIC8vIE1pbmltdW0vbWF4aW11bSBpbmRleGVzIGluIHRhYmxlLgorICB1bnNpZ25lZCBjaGFyIG1pbl9saW1fOworICB1bnNpZ25lZCBjaGFyIG1heF9saW1fOworfTsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCBlbnRyeSBpbiB0YWJsZSB1c2VkIHRvIGRlY29kZSBNb2RSL00gYnl0ZS4KK3N0cnVjdCBNb2RybUVudHJ5IHsKKyAgLy8gSXMgdGhlIG9wZXJhbmQgZW5jb2RlZCBhcyBieXRlcyBpbiB0aGUgaW5zdHJ1Y3Rpb24gKHJhdGhlciB0aGFuCisgIC8vIGlmIGl0J3MgZS5nLiBhIHJlZ2lzdGVyIGluIHdoaWNoIGNhc2UgaXQncyBqdXN0IGVuY29kZWQgaW4gdGhlCisgIC8vIE1vZFIvTSBieXRlKQorICBib29sIGlzX2VuY29kZWRfaW5faW5zdHJ1Y3Rpb25fOworCisgIC8vIElzIHRoZXJlIGEgU0lCIGJ5dGU/ICBJbiB0aGlzIGNhc2Ugd2UgYWx3YXlzIG5lZWQgdG8gZGVjb2RlIGl0LgorICBib29sIHVzZV9zaWJfYnl0ZV87CisKKyAgLy8gV2hhdCBpcyB0aGUgc2l6ZSBvZiB0aGUgb3BlcmFuZCAob25seSBpbXBvcnRhbnQgaWYgaXQncyBlbmNvZGVkCisgIC8vIGluIHRoZSBpbnN0cnVjdGlvbik/CisgIE9wZXJhbmRTaXplIG9wZXJhbmRfc2l6ZV87Cit9OworCit9OyAgLy8gbmFtZXNwYWNlIHNpZGVzdGVwCisKKyNlbmRpZiAgLy8gR09PR0xFX1BFUkZUT09MU19NSU5JX0RJU0FTU0VNQkxFUl9UWVBFU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3dpbmRvd3Mvbm0tcGRiLmMgYi9zcmMvd2luZG93cy9ubS1wZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWEwODBkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3Mvbm0tcGRiLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIC0tLQorICogQXV0aG9yOiBEYXZpZCBWaXRlaworICoKKyAqIER1bXAgZnVuY3Rpb24gYWRkcmVzc2VzIHVzaW5nIE1pY3Jvc29mdCBkZWJ1ZyBzeW1ib2xzLiAgVGhpcyB3b3JrcworICogb24gUERCIGZpbGVzLiAgTm90ZSB0aGF0IHRoaXMgcHJvZ3JhbSB3aWxsIGRvd25sb2FkIHN5bWJvbHMgdG8KKyAqIGM6XHdlYnN5bWJvbHMgd2l0aG91dCBhc2tpbmcuCisgKi8KKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCisjZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAvLyBmb3IgX3N0cmR1cAorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPGRiZ2hlbHAuaD4KKworLy8gVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gdmVyc2lvbmluZyBpbmZvIGluIGRiZ2hlbHAuaCBzbyBJIGNhbgorLy8gdGVsbCB3aGV0aGVyIGl0IGhhcyBhbiBvbGQtc3R5bGUgKGNpcmNhIFZDNy4xKSBJTUFHRUhMUF9NT0RVTEU2NAorLy8gc3RydWN0LCB3aXRoIG9ubHkgYSBmZXcgZmllbGRzLCBvciBhIG5ldy1zdHlsZSAoY2lyY2EgVkM4KQorLy8gSU1BR0VITFBfTU9EVUxFNjQsIHdpdGggbG90cyBvZiBmaWVsZHMuICBUaGVzZSBmaWVsZHMgYXJlIGp1c3QgdXNlZAorLy8gZm9yIGRlYnVnZ2luZywgc28gaXQncyBmaW5lIHRvIGp1c3QgYXNzdW1lIHRoZSBzbWFsbGVyIHN0cnVjdCwgYnV0CisvLyBmb3IgbW9zdCBwZW9wbGUsIHVzaW5nIGEgbW9kZXJuIE1TVkMsIHRoZSBmdWxsIHN0cnVjdCBpcyBhdmFpbGFibGUuCisvLyBJZiB5b3UgYXJlIG9uZSBvZiB0aG9zZSBwZW9wbGUgYW5kIHdvdWxkIGxpa2UgdGhpcyBleHRyYSBkZWJ1Z2dpbmcKKy8vIGluZm8sIHlvdSBjYW4gdW5jb21tZW50IHRoZSBsaW5lIGJlbG93LgorLy8jZGVmaW5lIFZDOF9PUl9BQk9WRQorCisjZGVmaW5lIFNFQVJDSF9DQVAgKDEwMjQqMTAyNCkKKyNkZWZpbmUgV0VCU1lNICJTUlYqYzpcXHdlYnN5bWJvbHMqaHR0cDovL21zZGwubWljcm9zb2Z0LmNvbS9kb3dubG9hZC9zeW1ib2xzIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgKm5hbWU7CisgIFVMT05HNjQgYWRkcjsKKyAgVUxPTkcgZmxhZ3M7Cit9IFNZTTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVTE9ORzY0IG1vZHVsZV9iYXNlOworICBTWU0gKnN5bXM7CisgIERXT1JEIHN5bXNfbGVuOworICBEV09SRCBzeW1zX2NhcDsKK30gU1lNX0NPTlRFWFQ7CisKK3N0YXRpYyBpbnQgc3ltX2NtcChjb25zdCB2b2lkICpfczEsIGNvbnN0IHZvaWQgKl9zMikgeworICBjb25zdCBTWU0gKnMxID0gKGNvbnN0IFNZTSAqKV9zMTsKKyAgY29uc3QgU1lNICpzMiA9IChjb25zdCBTWU0gKilfczI7CisKKyAgaWYgKHMxLT5hZGRyIDwgczItPmFkZHIpCisgICAgcmV0dXJuIC0xOworICBpZiAoczEtPmFkZHIgPiBzMi0+YWRkcikKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBCT09MIENBTExCQUNLIEVudW1TeW1Qcm9jKFBTWU1CT0xfSU5GTyBzeW1ib2xfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIHN5bWJvbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZPSUQgdXNlcl9jb250ZXh0KSB7CisgIFNZTV9DT05URVhUICpjdHggPSAoU1lNX0NPTlRFWFQqKXVzZXJfY29udGV4dDsKKyAgaWYgKHN5bWJvbF9pbmZvLT5BZGRyZXNzIDwgY3R4LT5tb2R1bGVfYmFzZSB8fAorICAgICAgKHN5bWJvbF9pbmZvLT5GbGFncyAmIFNZTUZMQUdfVExTUkVMKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChjdHgtPnN5bXNfbGVuID09IGN0eC0+c3ltc19jYXApIHsKKyAgICBpZiAoIWN0eC0+c3ltc19jYXApCisgICAgICBjdHgtPnN5bXNfY2FwKys7CisgICAgY3R4LT5zeW1zX2NhcCAqPSAyOworICAgIGN0eC0+c3ltcyA9IHJlYWxsb2MoY3R4LT5zeW1zLCBzaXplb2YoY3R4LT5zeW1zWzBdKSAqIGN0eC0+c3ltc19jYXApOworICB9CisgIGN0eC0+c3ltc1tjdHgtPnN5bXNfbGVuXS5uYW1lID0gX3N0cmR1cChzeW1ib2xfaW5mby0+TmFtZSk7CisgIGN0eC0+c3ltc1tjdHgtPnN5bXNfbGVuXS5hZGRyID0gc3ltYm9sX2luZm8tPkFkZHJlc3M7CisgIGN0eC0+c3ltc1tjdHgtPnN5bXNfbGVuXS5mbGFncyA9IHN5bWJvbF9pbmZvLT5GbGFnczsKKyAgY3R4LT5zeW1zX2xlbisrOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgTWF5YmVQcmludChjb25zdCBjaGFyKiB2YXIsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7CisgIGlmICh2YXJbMF0pCisgICAgcHJpbnRmKCIlczogJXNcbiIsIGRlc2NyaXB0aW9uLCB2YXIpOworfQorCitzdGF0aWMgdm9pZCBQcmludEF2YWlsYWJpbGl0eShCT09MIHZhciwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pIHsKKyAgcHJpbnRmKCIlczogJXNcbiIsIGRlc2NyaXB0aW9uLCAodmFyID8gIkF2YWlsYWJsZSIgOiAiTm90IGF2YWlsYWJsZSIpKTsKK30KKworc3RhdGljIHZvaWQgU2hvd1N5bWJvbEluZm8oSEFORExFIHByb2Nlc3MsIFVMT05HNjQgbW9kdWxlX2Jhc2UpIHsKKyAgLyogR2V0IG1vZHVsZSBpbmZvcm1hdGlvbi4gKi8KKyAgSU1BR0VITFBfTU9EVUxFNjQgbW9kdWxlX2luZm87CisgIEJPT0wgZ2V0bW9kdWxlaW5mb19ydjsKKyAgcHJpbnRmKCJMb2FkIEFkZHJlc3M6ICVJNjR4XG4iLCBtb2R1bGVfYmFzZSk7CisgIG1lbXNldCgmbW9kdWxlX2luZm8sIDAsIHNpemVvZihtb2R1bGVfaW5mbykpOworICBtb2R1bGVfaW5mby5TaXplT2ZTdHJ1Y3QgPSBzaXplb2YobW9kdWxlX2luZm8pOworICBnZXRtb2R1bGVpbmZvX3J2ID0gU3ltR2V0TW9kdWxlSW5mbzY0KHByb2Nlc3MsIG1vZHVsZV9iYXNlLCAmbW9kdWxlX2luZm8pOworICBpZiAoIWdldG1vZHVsZWluZm9fcnYpICB7CisgICAgcHJpbnRmKCJFcnJvcjogU3ltR2V0TW9kdWxlSW5mbzY0KCkgZmFpbGVkLiBFcnJvciBjb2RlOiAldVxuIiwKKyAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpOworICAgIHJldHVybjsKKyAgfQorICAvKiBEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHN5bWJvbHMsIGJhc2VkIG9uIGtpbmQgb2Ygc3ltYm9sLiAqLworICBzd2l0Y2ggKG1vZHVsZV9pbmZvLlN5bVR5cGUpICB7CisgICAgY2FzZSBTeW1Ob25lOgorICAgICAgcHJpbnRmKCgiTm8gc3ltYm9scyBhdmFpbGFibGUgZm9yIHRoZSBtb2R1bGUuXG4iKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFN5bUV4cG9ydDoKKyAgICAgIHByaW50ZigoIkxvYWRlZCBzeW1ib2xzOiBFeHBvcnRzXG4iKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFN5bUNvZmY6CisgICAgICBwcmludGYoKCJMb2FkZWQgc3ltYm9sczogQ09GRlxuIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTeW1DdjoKKyAgICAgIHByaW50ZigoIkxvYWRlZCBzeW1ib2xzOiBDb2RlVmlld1xuIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTeW1TeW06CisgICAgICBwcmludGYoKCJMb2FkZWQgc3ltYm9sczogU1lNXG4iKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFN5bVZpcnR1YWw6CisgICAgICBwcmludGYoKCJMb2FkZWQgc3ltYm9sczogVmlydHVhbFxuIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTeW1QZGI6CisgICAgICBwcmludGYoKCJMb2FkZWQgc3ltYm9sczogUERCXG4iKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFN5bURpYToKKyAgICAgIHByaW50ZigoIkxvYWRlZCBzeW1ib2xzOiBESUFcbiIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU3ltRGVmZXJyZWQ6CisgICAgICBwcmludGYoKCJMb2FkZWQgc3ltYm9sczogRGVmZXJyZWRcbiIpKTsgIC8qIG5vdCBhY3R1YWxseSBsb2FkZWQgKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBwcmludGYoKCJMb2FkZWQgc3ltYm9sczogVW5rbm93biBmb3JtYXQuXG4iKSk7CisgICAgICBicmVhazsKKyAgfQorCisgIE1heWJlUHJpbnQoIkltYWdlIG5hbWUiLCBtb2R1bGVfaW5mby5JbWFnZU5hbWUpOworICBNYXliZVByaW50KCJMb2FkZWQgaW1hZ2UgbmFtZSIsIG1vZHVsZV9pbmZvLkxvYWRlZEltYWdlTmFtZSk7CisjaWZkZWYgVkM4X09SX0FCT1ZFICAgLyogVE9ETyhjc2lsdmVycyk6IGZpZ3VyZSBvdXQgaG93IHRvIHRlbGwgKi8KKyAgTWF5YmVQcmludCgiUERCIGZpbGUgbmFtZSIsIG1vZHVsZV9pbmZvLkxvYWRlZFBkYk5hbWUpOworICBpZiAobW9kdWxlX2luZm8uUGRiVW5tYXRjaGVkIHx8IG1vZHVsZV9pbmZvLkRiZ1VubWF0Y2hlZCkgIHsKKyAgICAvKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgZGVidWcgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluIGEKKyAgICAgKiBzZXBhcmF0ZSBmaWxlICguREJHIG9yIC5QREIpCisgICAgICovCisgICAgcHJpbnRmKCgiV2FybmluZzogVW5tYXRjaGVkIHN5bWJvbHMuXG4iKSk7CisgIH0KKyNlbmRpZgorCisgIC8qIENvbnRlbnRzICovCisjaWZkZWYgVkM4X09SX0FCT1ZFICAgLyogVE9ETyhjc2lsdmVycyk6IGZpZ3VyZSBvdXQgaG93IHRvIHRlbGwgKi8KKyAgUHJpbnRBdmFpbGFiaWxpdHkoIkxpbmUgbnVtYmVycyIsIG1vZHVsZV9pbmZvLkxpbmVOdW1iZXJzKTsKKyAgUHJpbnRBdmFpbGFiaWxpdHkoIkdsb2JhbCBzeW1ib2xzIiwgbW9kdWxlX2luZm8uR2xvYmFsU3ltYm9scyk7CisgIFByaW50QXZhaWxhYmlsaXR5KCJUeXBlIGluZm9ybWF0aW9uIiwgbW9kdWxlX2luZm8uVHlwZUluZm8pOworI2VuZGlmCit9CisKK3ZvaWQgdXNhZ2UoKSB7CisgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IG5tLXBkYiBbLUN8LS1kZW1hbmdsZV0gPG1vZHVsZSBvciBmaWxlbmFtZT5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisgIERXT1JEICBlcnJvcjsKKyAgSEFORExFIHByb2Nlc3M7CisgIFVMT05HNjQgbW9kdWxlX2Jhc2U7CisgIFNZTV9DT05URVhUIGN0eDsKKyAgaW50IGk7CisgIGNoYXIqIHNlYXJjaDsKKyAgY2hhciogZmlsZW5hbWUgPSBOVUxMOworICBpbnQgcnYgPSAwOworICAvKiBXZSBtYXkgYWRkIFNZTU9QVF9VTkROQU1FIGlmIC0tZGVtYW5nbGUgaXMgc3BlY2lmaWVkOiAqLworICBEV09SRCBzeW1vcHRzID0gU1lNT1BUX0RFRkVSUkVEX0xPQURTIHwgU1lNT1BUX0RFQlVHOworCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItLWRlbWFuZ2xlIikgPT0gMCB8fCBzdHJjbXAoYXJndltpXSwgIi1DIikgPT0gMCkgeworICAgICAgc3ltb3B0cyB8PSBTWU1PUFRfVU5ETkFNRTsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLS1oZWxwIikgPT0gMCkgeworICAgICAgdXNhZ2UoKTsKKyAgICAgIGV4aXQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoaSAhPSBhcmdjIC0gMSkgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCgxKTsKKyAgfQorICBmaWxlbmFtZSA9IGFyZ3ZbaV07CisKKyAgcHJvY2VzcyA9IEdldEN1cnJlbnRQcm9jZXNzKCk7CisKKyAgaWYgKCFTeW1Jbml0aWFsaXplKHByb2Nlc3MsIE5VTEwsIEZBTFNFKSkgeworICAgIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgZnByaW50ZihzdGRlcnIsICJTeW1Jbml0aWFsaXplIHJldHVybmVkIGVycm9yIDogJWRcbiIsIGVycm9yKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHNlYXJjaCA9IG1hbGxvYyhTRUFSQ0hfQ0FQKTsKKyAgaWYgKFN5bUdldFNlYXJjaFBhdGgocHJvY2Vzcywgc2VhcmNoLCBTRUFSQ0hfQ0FQKSkgeworICAgIGlmIChzdHJsZW4oc2VhcmNoKSArIHNpemVvZigiOyIgV0VCU1lNKSA+IFNFQVJDSF9DQVApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiU2VhcmNoIHBhdGggdG9vIGxvbmdcbiIpOworICAgICAgU3ltQ2xlYW51cChwcm9jZXNzKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBzdHJjYXQoc2VhcmNoLCAiOyIgV0VCU1lNKTsKKyAgfSBlbHNlIHsKKyAgICBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIGZwcmludGYoc3RkZXJyLCAiU3ltR2V0U2VhcmNoUGF0aCByZXR1cm5lZCBlcnJvciA6ICVkXG4iLCBlcnJvcik7CisgICAgcnYgPSAxOyAgICAgICAgICAgICAgICAgICAvKiBBbiBlcnJvciwgYnV0IG5vdCBhIGZhdGFsIG9uZSAqLworICAgIHN0cmNweShzZWFyY2gsIFdFQlNZTSk7ICAgLyogVXNlIGEgZGVmYXVsdCB2YWx1ZSAqLworICB9CisgIGlmICghU3ltU2V0U2VhcmNoUGF0aChwcm9jZXNzLCBzZWFyY2gpKSB7CisgICAgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlN5bVNldFNlYXJjaFBhdGggcmV0dXJuZWQgZXJyb3IgOiAlZFxuIiwgZXJyb3IpOworICAgIHJ2ID0gMTsgICAgICAgICAgICAgICAgICAgLyogQW4gZXJyb3IsIGJ1dCBub3QgYSBmYXRhbCBvbmUgKi8KKyB9CisKKyAgU3ltU2V0T3B0aW9ucyhzeW1vcHRzKTsKKyAgbW9kdWxlX2Jhc2UgPSBTeW1Mb2FkTW9kdWxlRXgocHJvY2VzcywgTlVMTCwgZmlsZW5hbWUsIE5VTEwsIDAsIDAsIE5VTEwsIDApOworICBpZiAoIW1vZHVsZV9iYXNlKSB7CisgICAgLyogU3ltTG9hZE1vZHVsZUV4IGZhaWxlZCAqLworICAgIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgZnByaW50ZihzdGRlcnIsICJTeW1Mb2FkTW9kdWxlRXggcmV0dXJuZWQgZXJyb3IgOiAlZCBmb3IgJXNcbiIsCisgICAgICAgICAgICBlcnJvciwgZmlsZW5hbWUpOworICAgIFN5bUNsZWFudXAocHJvY2Vzcyk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBTaG93U3ltYm9sSW5mbyhwcm9jZXNzLCBtb2R1bGVfYmFzZSk7CisKKyAgbWVtc2V0KCZjdHgsIDAsIHNpemVvZihjdHgpKTsKKyAgY3R4Lm1vZHVsZV9iYXNlID0gbW9kdWxlX2Jhc2U7CisgIGlmICghU3ltRW51bVN5bWJvbHMocHJvY2VzcywgbW9kdWxlX2Jhc2UsIE5VTEwsIEVudW1TeW1Qcm9jLCAmY3R4KSkgeworICAgIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgZnByaW50ZihzdGRlcnIsICJTeW1FbnVtU3ltYm9scyByZXR1cm5lZCBlcnJvcjogJWRcbiIsIGVycm9yKTsKKyAgICBydiA9IDE7CisgIH0gZWxzZSB7CisgICAgRFdPUkQgajsKKyAgICBxc29ydChjdHguc3ltcywgY3R4LnN5bXNfbGVuLCBzaXplb2YoY3R4LnN5bXNbMF0pLCBzeW1fY21wKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgY3R4LnN5bXNfbGVuOyBqKyspIHsKKyAgICAgIHByaW50ZigiJTAxNkk2NHggWCAlc1xuIiwgY3R4LnN5bXNbal0uYWRkciwgY3R4LnN5bXNbal0ubmFtZSk7CisgICAgfQorICAgIC8qIEluIGEgcGVyZmVjdCB3b3JsZCwgbWF5YmUgd2UnZCBjbGVhbiB1cCBjdHgncyBtZW1vcnk/ICovCisgIH0KKyAgU3ltVW5sb2FkTW9kdWxlNjQocHJvY2VzcywgbW9kdWxlX2Jhc2UpOworICBTeW1DbGVhbnVwKHByb2Nlc3MpOworICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9zcmMvd2luZG93cy9vdmVycmlkZV9mdW5jdGlvbnMuY2MgYi9zcmMvd2luZG93cy9vdmVycmlkZV9mdW5jdGlvbnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5MTdkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93aW5kb3dzL292ZXJyaWRlX2Z1bmN0aW9ucy5jYwpAQCAtMCwwICsxLDEyMyBAQAorLy8gLSotIE1vZGU6IEMrKzsgYy1iYXNpYy1vZmZzZXQ6IDI7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKy8vIENvcHlyaWdodCAoYykgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8gCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gLS0tCisvLyBBdXRob3I6IE1pa2UgQmVsc2hlCisvLyAKKy8vIFRvIGxpbmsgdGNtYWxsb2MgaW50byBhIEVYRSBvciBETEwgc3RhdGljYWxseSB3aXRob3V0IHVzaW5nIHRoZSBwYXRjaGluZworLy8gZmFjaWxpdHksIHdlIGNhbiB0YWtlIGEgc3RvY2sgbGliY210IGFuZCByZW1vdmUgYWxsIHRoZSBhbGxvY2F0b3IgZnVuY3Rpb25zLgorLy8gV2hlbiB3ZSByZWxpbmsgdGhlIEVYRS9ETEwgd2l0aCB0aGUgbW9kaWZpZWQgbGliY210IGFuZCB0Y21hbGxvYywgYSBmZXcKKy8vIGZ1bmN0aW9ucyBhcmUgbWlzc2luZy4gIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYWRkaXRpb25hbCBvdmVycmlkZXMgd2hpY2gKKy8vIGFyZSByZXF1aXJlZCBpbiB0aGUgVlMyMDA1IGxpYmNtdCBpbiBvcmRlciB0byBsaW5rIHRoZSBtb2RpZmllZCBsaWJjbXQuCisvLworLy8gU2VlIGFsc28KKy8vIGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9nb29nbGUtcGVyZnRvb2xzL2Jyb3dzZV90aHJlYWQvdGhyZWFkLzQxY2QzNzEwYWY4NWU1N2IKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZuZGVmIF9XSU4zMgorIyBlcnJvciBZb3Ugc2hvdWxkIG9ubHkgYmUgaW5jbHVkaW5nIHRoaXMgZmlsZSBpbiBhIHdpbmRvd3MgZW52aXJvbm1lbnQhCisjZW5kaWYKKworI2lmbmRlZiBXSU4zMl9PVkVSUklERV9BTExPQ0FUT1JTCisjIGVycm9yIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gb3ZlcnJpZGluZyBhbGxvY2F0b3JzCisjZW5kaWYKKworI2luY2x1ZGUgInRjbWFsbG9jLmNjIgorCitleHRlcm4gIkMiIHZvaWQqIF9yZWNhbGxvYyh2b2lkKiBwLCBzaXplX3Qgbiwgc2l6ZV90IHNpemUpIHsKKyAgdm9pZCogcmVzdWx0ID0gcmVhbGxvYyhwLCBuICogc2l6ZSk7CisgIG1lbXNldChyZXN1bHQsIDAsIG4gKiBzaXplKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworZXh0ZXJuICJDIiB2b2lkKiBfY2FsbG9jX2ltcGwoc2l6ZV90IG4sIHNpemVfdCBzaXplKSB7CisgIHJldHVybiBjYWxsb2Mobiwgc2l6ZSk7Cit9CisKK2V4dGVybiAiQyIgc2l6ZV90IF9tc2l6ZSh2b2lkKiBwKSB7CisgIHJldHVybiBNYWxsb2NFeHRlbnNpb246Omluc3RhbmNlKCktPkdldEFsbG9jYXRlZFNpemUocCk7Cit9CisKK2V4dGVybiAiQyIgaW50cHRyX3QgX2dldF9oZWFwX2hhbmRsZSgpIHsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFRoZSBDUlQgaGVhcCBpbml0aWFsaXphdGlvbiBzdHViLgorZXh0ZXJuICJDIiBpbnQgX2hlYXBfaW5pdCgpIHsKKyAgLy8gV2UgaW50ZW50aW9uYWxseSBsZWFrIHRoaXMgb2JqZWN0LiAgSXQgbGFzdHMgZm9yIHRoZSBwcm9jZXNzCisgIC8vIGxpZmV0aW1lLiAgVHJ5aW5nIHRvIHRlYXJkb3duIGF0IF9oZWFwX3Rlcm0oKSBpcyBzbyBsYXRlIHRoYXQKKyAgLy8geW91IGNhbid0IGRvIGFueXRoaW5nIHVzZWZ1bCBhbnl3YXkuCisgIG5ldyBUQ01hbGxvY0d1YXJkKCk7CisgIHJldHVybiAxOworfQorCisvLyBUaGUgQ1JUIGhlYXAgY2xlYW51cCBzdHViLgorZXh0ZXJuICJDIiB2b2lkIF9oZWFwX3Rlcm0oKSB7Cit9CisKK2V4dGVybiAiQyIgaW50IF9zZXRfbmV3X21vZGUoaW50IGZsYWcpIHsKKyAgcmV0dXJuIHRjX3NldF9uZXdfbW9kZShmbGFnKTsKK30KKworI2lmbmRlZiBOREVCVUcKKyN1bmRlZiBtYWxsb2MKKyN1bmRlZiBmcmVlCisjdW5kZWYgY2FsbG9jCitpbnQgX0NydERiZ1JlcG9ydChpbnQsIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgLi4uKSB7CisgIHJldHVybiAwOworfQorCitpbnQgX0NydERiZ1JlcG9ydFcoaW50LCBjb25zdCB3Y2hhcl90KiwgaW50LCBjb25zdCB3Y2hhcl90KiwgY29uc3Qgd2NoYXJfdCosIC4uLikgeworICByZXR1cm4gMDsKK30KKworaW50IF9DcnRTZXRSZXBvcnRNb2RlKGludCwgaW50KSB7CisgIHJldHVybiAwOworfQorCitleHRlcm4gIkMiIHZvaWQqIF9tYWxsb2NfZGJnKHNpemVfdCBzaXplLCBpbnQgLCBjb25zdCBjaGFyKiwgaW50KSB7CisgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfZnJlZV9kYmcodm9pZCogcHRyLCBpbnQpIHsKKyAgZnJlZShwdHIpOworfQorCitleHRlcm4gIkMiIHZvaWQqIF9jYWxsb2NfZGJnKHNpemVfdCBuLCBzaXplX3Qgc2l6ZSwgaW50LCBjb25zdCBjaGFyKiwgaW50KSB7CisgIHJldHVybiBjYWxsb2Mobiwgc2l6ZSk7Cit9CisjZW5kaWYgIC8vIE5ERUJVRworCisvLyBXZSBzZXQgdGhpcyB0byAxIGJlY2F1c2UgcGFydCBvZiB0aGUgQ1JUIHVzZXMgYSBjaGVjayBvZiBfY3J0aGVhcCAhPSAwCisvLyB0byB0ZXN0IHdoZXRoZXIgdGhlIENSVCBoYXMgYmVlbiBpbml0aWFsaXplZC4gIE9uY2Ugd2UndmUgcmlwcGVkIG91dAorLy8gdGhlIGFsbG9jYXRvcnMgZnJvbSBsaWJjbXQsIHdlIG5lZWQgdG8gcHJvdmlkZSB0aGlzIGRlZmluaXRpb24gc28gdGhhdAorLy8gdGhlIHJlc3Qgb2YgdGhlIENSVCBpcyBzdGlsbCB1c2FibGUuCitleHRlcm4gIkMiIHZvaWQqIF9jcnRoZWFwID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oMSk7CmRpZmYgLS1naXQgYS9zcmMvd2luZG93cy9wYXRjaF9mdW5jdGlvbnMuY2MgYi9zcmMvd2luZG93cy9wYXRjaF9mdW5jdGlvbnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxYmVjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93aW5kb3dzL3BhdGNoX2Z1bmN0aW9ucy5jYwpAQCAtMCwwICsxLDEwNzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAwNywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8gCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gLS0tCisvLyBBdXRob3I6IENyYWlnIFNpbHZlcnN0ZWluCisvLworLy8gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGZpbGUgaXMgdG8gcGF0Y2ggdGhlIGxpYmMgYWxsb2NhdGlvbgorLy8gcm91dGluZXMgKG1hbGxvYyBhbmQgZnJpZW5kcywgYnV0IGFsc28gX21zaXplIGFuZCBvdGhlcgorLy8gd2luZG93cy1zcGVjaWZpYyBsaWJjLXN0eWxlIHJvdXRpbmVzKS4gIEhvd2V2ZXIsIHdlIGFsc28gcGF0Y2gKKy8vIHdpbmRvd3Mgcm91dGluZXMgdG8gZG8gYWNjb3VudGluZy4gIFdlIGRvIGJldHRlciBhdCB0aGUgZm9ybWVyIHRoYW4KKy8vIHRoZSBsYXR0ZXIuICBIZXJlIGFyZSBzb21lIGNvbW1lbnRzIGZyb20gUGF1bCBQbHV6aG5pa292IGFib3V0IHdoYXQKKy8vIGl0IG1pZ2h0IHRha2UgdG8gZG8gYSByZWFsbHkgZ29vZCBqb2IgcGF0Y2hpbmcgd2luZG93cyByb3V0aW5lcyB0bworLy8ga2VlcCB0cmFjayBvZiBtZW1vcnkgdXNhZ2U6CisvLworLy8gIllvdSBzaG91bGQgaW50ZXJjZXB0IGF0IGxlYXN0IHRoZSBmb2xsb3dpbmc6CisvLyAgICAgSGVhcENyZWF0ZSBIZWFwRGVzdHJveSBIZWFwQWxsb2MgSGVhcFJlQWxsb2MgSGVhcEZyZWUKKy8vICAgICBSdGxDcmVhdGVIZWFwIFJ0bERlc3Ryb3lIZWFwIFJ0bEFsbG9jYXRlSGVhcCBSdGxGcmVlSGVhcAorLy8gICAgIG1hbGxvYyBjYWxsb2MgcmVhbGxvYyBmcmVlCisvLyAgICAgbWFsbG9jX2RiZyBjYWxsb2NfZGJnIHJlYWxsb2NfZGJnIGZyZWVfZGJnCisvLyBTb21lIG9mIHRoZXNlIGNhbGwgdGhlIG90aGVyIG9uZXMgKGJ1dCBub3QgYWx3YXlzKSwgc29tZXRpbWVzCisvLyByZWN1cnNpdmVseSAoaS5lLiBIZWFwQ3JlYXRlIG1heSBjYWxsIEhlYXBBbGxvYyBvbiBhIGRpZmZlcmVudAorLy8gaGVhcCwgSUlSQykuIgorLy8KKy8vIFNpbmNlIFBhdWwgZGlkbid0IG1lbnRpb24gVmlydHVhbEFsbG9jRXgsIGhlIG1heSBub3QgaGF2ZSBldmVuIGJlZW4KKy8vIGNvbnNpZGVyaW5nIGFsbCB0aGUgbW1hcC1saWtlIGZ1bmN0aW9ucyB0aGF0IHdpbmRvd3MgaGFzIChvciBoZSBtYXkKKy8vIGp1c3QgYmUgaWdub3JpbmcgaXQgYmVjYXVzZSBoZSdzIHNlZW4gd2UgYWxyZWFkeSBwYXRjaCBpdCkuICBPZiB0aGUKKy8vIGFib3ZlLCB3ZSBkbyBub3QgcGF0Y2ggdGhlICpfZGJnIGZ1bmN0aW9ucywgYW5kIG9mIHRoZSB3aW5kb3dzCisvLyBmdW5jdGlvbnMsIHdlIG9ubHkgcGF0Y2ggSGVhcEFsbG9jIGFuZCBIZWFwRnJlZS4KKy8vCisvLyBUaGUgKl9kYmcgZnVuY3Rpb25zIGNvbWUgaW50byBwbGF5IHdpdGggL01EZCwgL01UZCwgYW5kIC9NTGQsCisvLyBwcm9iYWJseS4gIEl0IG1heSBiZSBvayB0byBqdXN0IHR1cm4gb2ZmIHRjbWFsbG9jIGluIHRob3NlIGNhc2VzIC0tCisvLyBpZiB0aGUgdXNlciB3YW50cyB0aGUgd2luZG93cyBkZWJ1ZyBtYWxsb2MsIHRoZXkgcHJvYmFibHkgZG9uJ3QKKy8vIHdhbnQgdGNtYWxsb2MhICBXZSBzaG91bGQgYWxzbyB0ZXN0IHdpdGggYWxsIG9mIC9NRCwgL01ULCBhbmQgL01MLAorLy8gd2hpY2ggd2UncmUgbm90IGN1cnJlbnRseSBkb2luZy4KKworLy8gVE9ETyhjc2lsdmVycyk6IHRyeSB0byBkbyBiZXR0ZXIgaGVyZT8gIFBhdWwgZG9lcyBjb25jbHVkZToKKy8vICAgICAgICAgICAgICAgICAiS2VlcGluZyB0cmFjayBvZiBhbGwgb2YgdGhpcyB3YXMgYSBuaWdodG1hcmUuIgorCisjaWZuZGVmIF9XSU4zMgorIyBlcnJvciBZb3Ugc2hvdWxkIG9ubHkgYmUgaW5jbHVkaW5nIHdpbmRvd3MvcGF0Y2hfZnVuY3Rpb25zLmNjIGluIGEgd2luZG93cyBlbnZpcm9ubWVudCEKKyNlbmRpZgorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBXSU4zMl9PVkVSUklERV9BTExPQ0FUT1JTCisjZXJyb3IgVGhpcyBmaWxlIGlzIGludGVuZGVkIGZvciBwYXRjaGluZyBhbGxvY2F0b3JzIC0gdXNlIG92ZXJyaWRlX2Z1bmN0aW9ucy5jYyBpbnN0ZWFkLgorI2VuZGlmCisKKy8vIFdlIHVzZSBwc2FwaS4gIE5vbi1NU1ZDIHN5c3RlbXMgd2lsbCBoYXZlIHRvIGxpbmsgdGhpcyBpbiB0aGVtc2VsdmVzLgorI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIGNvbW1lbnQobGliLCAiUHNhcGkubGliIikKKyNlbmRpZgorCisvLyBNYWtlIHN1cmUgd2UgYWx3YXlzIHVzZSB0aGUgJ29sZCcgbmFtZXMgb2YgdGhlIHBzYXBpIGZ1bmN0aW9ucy4KKyNpZm5kZWYgUFNBUElfVkVSU0lPTgorI2RlZmluZSBQU0FQSV9WRVJTSU9OIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+ICAgICAgIC8vIGZvciBfbXNpemUgYW5kIF9leHBhbmQKKyNpbmNsdWRlIDxwc2FwaS5oPiAgICAgICAgLy8gZm9yIEVudW1Qcm9jZXNzTW9kdWxlcywgR2V0TW9kdWxlSW5mb3JtYXRpb24sIGV0Yy4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlICJiYXNlL3NwaW5sb2NrLmgiCisjaW5jbHVkZSAiZ3BlcmZ0b29scy9tYWxsb2NfaG9vay5oIgorI2luY2x1ZGUgIm1hbGxvY19ob29rLWlubC5oIgorI2luY2x1ZGUgInByZWFtYmxlX3BhdGNoZXIuaCIKKworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1vZHVsZXMgd2UgYWxsb3cgdG8gYmUgaW4gb25lIGV4ZWN1dGFibGUKK2NvbnN0IGludCBrTWF4TW9kdWxlcyA9IDgxODI7CisKKy8vIFRoZXNlIGFyZSBoYXJkLWNvZGVkLCB1bmZvcnR1bmF0ZWx5LiA6LSggVGhleSBhcmUgYWxzbyBwcm9iYWJseQorLy8gY29tcGlsZXIgc3BlY2lmaWMuICBTZWUgZ2V0X21hbmdsZWRfbmFtZXMuY2MsIGluIHRoaXMgZGlyZWN0b3J5LAorLy8gZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8gdXBkYXRlIHRoZXNlIG5hbWVzIGZvciB5b3VyIGNvbXBpbGVyLgorY29uc3QgY2hhciBrTWFuZ2xlZE5ld1tdID0gIj8/MkBZQVBBWElAWiI7Citjb25zdCBjaGFyIGtNYW5nbGVkTmV3QXJyYXlbXSA9ICI/P19VQFlBUEFYSUBaIjsKK2NvbnN0IGNoYXIga01hbmdsZWREZWxldGVbXSA9ICI/PzNAWUFYUEFYQFoiOworY29uc3QgY2hhciBrTWFuZ2xlZERlbGV0ZUFycmF5W10gPSAiPz9fVkBZQVhQQVhAWiI7Citjb25zdCBjaGFyIGtNYW5nbGVkTmV3Tm90aHJvd1tdID0gIj8/MkBZQVBBWElBQlVub3Rocm93X3RAc3RkQEBAWiI7Citjb25zdCBjaGFyIGtNYW5nbGVkTmV3QXJyYXlOb3Rocm93W10gPSAiPz9fVUBZQVBBWElBQlVub3Rocm93X3RAc3RkQEBAWiI7Citjb25zdCBjaGFyIGtNYW5nbGVkRGVsZXRlTm90aHJvd1tdID0gIj8/M0BZQVhQQVhBQlVub3Rocm93X3RAc3RkQEBAWiI7Citjb25zdCBjaGFyIGtNYW5nbGVkRGVsZXRlQXJyYXlOb3Rocm93W10gPSAiPz9fVkBZQVhQQVhBQlVub3Rocm93X3RAc3RkQEBAWiI7CisKKy8vIFRoaXMgaXMgYW4gdW51c2VkIGJ1dCBleHBvcnRlZCBzeW1ib2wgdGhhdCB3ZSBjYW4gdXNlIHRvIHRlbGwgdGhlCisvLyBNU1ZDIGxpbmtlciB0byBicmluZyBpbiBsaWJ0Y21hbGxvYywgdmlhIHRoZSAvSU5DTFVERSBsaW5rZXIgZmxhZy4KKy8vIFdpdGhvdXQgdGhpcywgdGhlIGxpbmtlciB3aWxsIGxpa2VseSBkZWNpZGUgdGhhdCBsaWJ0Y21hbGxvYy5kbGwKKy8vIGRvZXNuJ3QgYWRkIGFueXRoaW5nIHRvIHRoZSBleGVjdXRhYmxlIChzaW5jZSBpdCBkb2VzIGFsbCBpdHMgd29yaworLy8gdGhyb3VnaCBwYXRjaGluZywgd2hpY2ggdGhlIGxpbmtlciBjYW4ndCBzZWUpLCBhbmQgaWdub3JlIGl0CisvLyBlbnRpcmVseS4gIChUaGUgbmFtZSAndGNtYWxsb2MnIGlzIGFscmVhZHkgcmVzZXJ2ZWQgZm9yIGEKKy8vIG5hbWVzcGFjZS4gIEknZCByYXRoZXIgZXhwb3J0IGEgdmFyaWFibGUgbmFtZWQgIl90Y21hbGxvYyIsIGJ1dCBJCisvLyBjb3VsZG4ndCBmaWd1cmUgb3V0IGhvdyB0byBnZXQgdGhhdCB0byB3b3JrLiAgVGhpcyBmdW5jdGlvbiBleHBvcnRzCisvLyB0aGUgc3ltYm9sICJfX3RjbWFsbG9jIi4pCitleHRlcm4gIkMiIFBFUkZUT09MU19ETExfREVDTCB2b2lkIF90Y21hbGxvYygpOwordm9pZCBfdGNtYWxsb2MoKSB7IH0KKworLy8gVGhpcyBpcyB0aGUgdmVyc2lvbiBuZWVkZWQgZm9yIHdpbmRvd3MgeDY0LCB3aGljaCBoYXMgYSBkaWZmZXJlbnQKKy8vIGRlY29yYXRpb24gc2NoZW1lIHdoaWNoIGRvZXNuJ3QgYXV0by1hZGQgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCitleHRlcm4gIkMiIFBFUkZUT09MU19ETExfREVDTCB2b2lkIF9fdGNtYWxsb2MoKTsKK3ZvaWQgX190Y21hbGxvYygpIHsgfQorCituYW1lc3BhY2UgeyAgICAvLyBtb3N0IGV2ZXJ5dGhpbmcgaGVyZSBpcyBpbiBhbiB1bm5hbWVkIG5hbWVzcGFjZQorCit0eXBlZGVmIHZvaWQgKCpHZW5lcmljRm5QdHIpKCk7CisKK3VzaW5nIHNpZGVzdGVwOjpQcmVhbWJsZVBhdGNoZXI7CisKK3N0cnVjdCBNb2R1bGVFbnRyeUNvcHk7ICAgLy8gZGVmaW5lZCBiZWxvdworCisvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIGhvdyB3ZSBvdmVycmlkZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24KKy8vIGZ1bmN0aW9ucywganVzdCBsaWtlIHRjbWFsbG9jLmNjIGFuZCBtYWxsb2NfaG9vay5jYyBkby4KKworLy8gVGhpcyBpcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm91dGluZXMgd2UncmUgcGF0Y2hpbmcsIGZvciBhIGdpdmVuCisvLyBtb2R1bGUgdGhhdCBpbXBsZW1lbnRzIGxpYmMgbWVtb3J5IHJvdXRpbmVzLiAgQSBzaW5nbGUgZXhlY3V0YWJsZQorLy8gY2FuIGhhdmUgc2V2ZXJhbCBsaWJjIGltcGxlbWVudGF0aW9ucyBydW5uaW5nIGFib3V0IChpbiBkaWZmZXJlbnQKKy8vIC5kbGwncyksIGFuZCB3ZSBuZWVkIHRvIHBhdGNoL3VucGF0Y2ggdGhlbSBhbGwuICBUaGlzIGRlZmluZXMKKy8vIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBuZXcgZnVuY3Rpb25zIHdlJ3JlIHBhdGNoaW5nIGluLCB3aGljaAorLy8gYXJlIGRlZmluZWQgaW4gTGliY0Z1bmN0aW9ucywgYmVsb3cuCitjbGFzcyBMaWJjSW5mbyB7CisgcHVibGljOgorICBMaWJjSW5mbygpIHsKKyAgICBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7ICAvLyBlYXNpZXN0IHdheSB0byBpbml0aWFsaXplIHRoZSBhcnJheQorICB9CisKKyAgYm9vbCBwYXRjaGVkKCkgY29uc3QgeyByZXR1cm4gaXNfdmFsaWQoKTsgfQorICB2b2lkIHNldF9pc192YWxpZChib29sIGIpIHsgaXNfdmFsaWRfID0gYjsgfQorICAvLyBBY2NvcmRpbmcgdG8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNjg0MjI5KFZTLjg1KS5hc3B4OgorICAvLyAiVGhlIGxvYWQgYWRkcmVzcyBvZiBhIG1vZHVsZSAobHBCYXNlT2ZEbGwpIGlzIHRoZSBzYW1lIGFzIHRoZSBITU9EVUxFCisgIC8vIHZhbHVlLiIKKyAgSE1PRFVMRSBobW9kdWxlKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEhNT0RVTEU+KGNvbnN0X2Nhc3Q8dm9pZCo+KG1vZHVsZV9iYXNlX2FkZHJlc3NfKSk7CisgIH0KKworICAvLyBQb3B1bGF0ZXMgYWxsIHRoZSB3aW5kb3dzX2ZuX1tdIHZhcnMgYmFzZWQgb24gb3VyIG1vZHVsZSBpbmZvLgorICAvLyBSZXR1cm5zIGZhbHNlIGlmIHdpbmRvd3NfZm5fIGlzIGFsbCBOVUxMJ3MsIGJlY2F1c2UgdGhlcmUncworICAvLyBub3RoaW5nIHRvIHBhdGNoLiAgQWxzbyBwb3B1bGF0ZXMgdGhlIHJlc3Qgb2YgdGhlIG1vZHVsZV9lbnRyeQorICAvLyBpbmZvLCBzdWNoIGFzIHRoZSBtb2R1bGUncyBuYW1lLgorICBib29sIFBvcHVsYXRlV2luZG93c0ZuKGNvbnN0IE1vZHVsZUVudHJ5Q29weSYgbW9kdWxlX2VudHJ5KTsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBMaWJjSW5mbyYgdGhhdCkgeworICAgIGlmICh0aGlzID09ICZ0aGF0KQorICAgICAgcmV0dXJuOworICAgIHRoaXMtPmlzX3ZhbGlkXyA9IHRoYXQuaXNfdmFsaWRfOworICAgIG1lbWNweSh0aGlzLT53aW5kb3dzX2ZuXywgdGhhdC53aW5kb3dzX2ZuXywgc2l6ZW9mKHdpbmRvd3NfZm5fKSk7CisgICAgdGhpcy0+bW9kdWxlX2Jhc2VfYWRkcmVzc18gPSB0aGF0Lm1vZHVsZV9iYXNlX2FkZHJlc3NfOworICAgIHRoaXMtPm1vZHVsZV9iYXNlX3NpemVfID0gdGhhdC5tb2R1bGVfYmFzZV9zaXplXzsKKyAgfQorCisgIGVudW0geworICAgIGtNYWxsb2MsIGtGcmVlLCBrUmVhbGxvYywga0NhbGxvYywKKyAgICBrTmV3LCBrTmV3QXJyYXksIGtEZWxldGUsIGtEZWxldGVBcnJheSwKKyAgICBrTmV3Tm90aHJvdywga05ld0FycmF5Tm90aHJvdywga0RlbGV0ZU5vdGhyb3csIGtEZWxldGVBcnJheU5vdGhyb3csCisgICAgLy8gVGhlc2UgYXJlIHdpbmRvd3Mtb25seSBmdW5jdGlvbnMgZnJvbSBtYWxsb2MuaAorICAgIGtfTXNpemUsIGtfRXhwYW5kLAorICAgIC8vIEEgTVMgQ1JUICJpbnRlcm5hbCIgZnVuY3Rpb24sIGltcGxlbWVudGVkIHVzaW5nIF9jYWxsb2NfaW1wbAorICAgIGtfQ2FsbG9jQ3J0LAorICAgIGtOdW1GdW5jdGlvbnMKKyAgfTsKKworICAvLyBJJ2QgbGlrZSB0byBwdXQgdGhlc2UgdG9nZXRoZXIgaW4gYSBzdHJ1Y3QgKHBlcmhhcHMgaW4gdGhlCisgIC8vIHN1YmNsYXNzLCBzbyB3ZSBjYW4gcHV0IGluIHBlcmZ0b29sc19mbl8gYXMgd2VsbCksIGJ1dCB2Yzggc2VlbXMKKyAgLy8gdG8gaGF2ZSBhIGJ1ZyB3aGVyZSBpdCBkb2Vzbid0IGluaXRpYWxpemUgdGhlIHN0cnVjdCBwcm9wZXJseSBpZgorICAvLyB3ZSB0cnkgdG8gdGFrZSB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRoYXQncyBub3QgeWV0IGxvYWRlZAorICAvLyBmcm9tIGEgZGxsLCBhcyBpcyB0aGUgY29tbW9uIGNhc2UgZm9yIHN0YXRpY19mbl8uICBTbyB3ZSBuZWVkCisgIC8vIGVhY2ggdG8gYmUgaW4gaXRzIG93biBhcnJheS4gOi0oCisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBmdW5jdGlvbl9uYW1lX1trTnVtRnVuY3Rpb25zXTsKKworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyB0aGUgYmluYXJ5LgorICAvLyBJbiB0aGF0IGNhc2UsIGxvYWRpbmcgbWFsbG9jL2V0YyBmcm9tIHRoZSBkbGwgKHZpYQorICAvLyBQYXRjaE9uZU1vZHVsZSkgd29uJ3Qgd29yaywgc2luY2UgdGhlcmUgYXJlIG5vIGRsbHMuICBJbnN0ZWFkLAorICAvLyB5b3UganVzdCB3YW50IHRvIGJlIHRha2luZyB0aGUgYWRkcmVzcyBvZiBtYWxsb2MvZXRjIGRpcmVjdGx5LgorICAvLyBJbiB0aGUgY29tbW9uLCBub24tc3RhdGljLWxpbmsgY2FzZSwgdGhlc2UgcG9pbnRlcnMgd2lsbCBhbGwgYmUKKyAgLy8gTlVMTCwgc2luY2UgdGhpcyBpbml0aWFsaXplciBydW5zIGJlZm9yZSBtc3ZjcnQuZGxsIGlzIGxvYWRlZC4KKyAgc3RhdGljIGNvbnN0IEdlbmVyaWNGblB0ciBzdGF0aWNfZm5fW2tOdW1GdW5jdGlvbnNdOworCisgIC8vIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIHdlIGFyZSBnb2luZyB0byBwYXRjaAorICAvLyAobWFsbG9jLCBldGMpLiAgT3RoZXIgaW5mbyBhYm91dCB0aGUgZnVuY3Rpb24gaXMgaW4gdGhlCisgIC8vIHBhdGNoLXNwZWNpZmljIHN1YmNsYXNzZXMsIGJlbG93LgorICBHZW5lcmljRm5QdHIgd2luZG93c19mbl9ba051bUZ1bmN0aW9uc107CisKKyAgLy8gVGhpcyBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoaXMgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIChiZWNhdXNlCisgIC8vIHdlJ3JlIHBhdGNoaW5nIGEgbmV3IGxpYnJhcnkpIGFuZCBzZXQgdG8gZmFsc2Ugd2hlbiBpdCdzCisgIC8vIHVuaW5pdGlhbGl6ZWQgKGJlY2F1c2Ugd2UndmUgZnJlZWQgdGhhdCBsaWJyYXJ5KS4KKyAgYm9vbCBpc192YWxpZF87CisKKyAgY29uc3Qgdm9pZCAqbW9kdWxlX2Jhc2VfYWRkcmVzc187CisgIHNpemVfdCBtb2R1bGVfYmFzZV9zaXplXzsKKworIHB1YmxpYzoKKyAgLy8gVGhlc2Ugc2hvdWxkbid0IGhhdmUgdG8gYmUgcHVibGljLCBzaW5jZSBvbmx5IHN1YmNsYXNzZXMgb2YKKyAgLy8gTGliY0luZm8gbmVlZCBpdCwgYnV0IHRoZXkgZG8uICBNYXliZSBzb21ldGhpbmcgdG8gZG8gd2l0aAorICAvLyB0ZW1wbGF0ZXMuICBTaHJ1Zy4gIEkgaGlkZSB0aGVtIGRvd24gaGVyZSBzbyB1c2VycyB3b24ndCBzZWUKKyAgLy8gdGhlbS4gOi0pICAoT0ssIEkgYWxzbyBuZWVkIHRvIGRlZmluZSBjdHJnUHJvY0FkZHJlc3MgbGF0ZS4pCisgIGJvb2wgaXNfdmFsaWQoKSBjb25zdCB7IHJldHVybiBpc192YWxpZF87IH0KKyAgR2VuZXJpY0ZuUHRyIHdpbmRvd3NfZm4oaW50IGlmdW5jdGlvbikgY29uc3QgeworICAgIHJldHVybiB3aW5kb3dzX2ZuX1tpZnVuY3Rpb25dOworICB9CisgIC8vIFRoZXNlIHRocmVlIGFyZSBuZWVkZWQgYnkgTW9kdWxlRW50cnlDb3B5LgorICBzdGF0aWMgY29uc3QgaW50IGN0cmdQcm9jQWRkcmVzcyA9IGtOdW1GdW5jdGlvbnM7CisgIHN0YXRpYyBHZW5lcmljRm5QdHIgc3RhdGljX2ZuKGludCBpZnVuY3Rpb24pIHsKKyAgICByZXR1cm4gc3RhdGljX2ZuX1tpZnVuY3Rpb25dOworICB9CisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBmdW5jdGlvbl9uYW1lKGludCBpZnVuY3Rpb24pIHsKKyAgICByZXR1cm4gZnVuY3Rpb25fbmFtZV9baWZ1bmN0aW9uXTsKKyAgfQorfTsKKworLy8gVGVtcGxhdGUgdHJpY2tpbmVzczogbG9naWNhbGx5LCBhIExpYmNJbmZvIHdvdWxkIGluY2x1ZGUKKy8vIFdpbmRvd3NfbWFsbG9jXywgb3JpZ3N0dWJfbWFsbG9jXywgYW5kIFBlcmZ0b29sc19tYWxsb2NfOiBmb3IgYQorLy8gZ2l2ZW4gbW9kdWxlLCB0aGVzZSB0aHJlZSBnbyB0b2dldGhlci4gIEFuZCBpbiBmYWN0LAorLy8gUGVyZnRvb2xzX21hbGxvY18gbWF5IG5lZWQgdG8gY2FsbCBvcmlnc3R1Yl9tYWxsb2NfLCB3aGljaCBtZWFucyB3ZQorLy8gZWl0aGVyIG5lZWQgdG8gY2hhbmdlIFBlcmZ0b29sc19tYWxsb2NfIHRvIHRha2Ugb3JpZ3N0dWJfbWFsbG9jXyBhcworLy8gYW4gYXJndW1lbnQgLS0gdW5mb3J0dW5hdGVseSBpbXBvc3NpYmxlIHNpbmNlIGl0IG5lZWRzIHRvIGtlZXAgdGhlCisvLyBzYW1lIEFQSSBhcyBub3JtYWwgbWFsbG9jIC0tIG9yIHdlIG5lZWQgdG8gd3JpdGUgYSBkaWZmZXJlbnQKKy8vIHZlcnNpb24gb2YgUGVyZnRvb2xzX21hbGxvY18gZm9yIGVhY2ggTGliY0luZm8gaW5zdGFuY2Ugd2UgY3JlYXRlLgorLy8gV2UgY2hvb3NlIHRoZSBzZWNvbmQgcm91dGUsIGFuZCB1c2UgdGVtcGxhdGVzIHRvIGltcGxlbWVudCBpdCAod2UKKy8vIGNvdWxkIGhhdmUgYWxzbyB1c2VkIG1hY3JvcykuICBTbyB0byBnZXQgbXVsdGlwbGUgdmVyc2lvbnMKKy8vIG9mIHRoZSBzdHJ1Y3QsIHdlIHNheSAic3RydWN0PDE+IHZhcjE7IHN0cnVjdDwyPiB2YXIyOyIuICBUaGUgcHJpY2UKKy8vIHdlIHBheSBpcyBzb21lIGNvZGUgZHVwbGljYXRpb24sIGFuZCBtb3JlIGFubm95aW5nLCBlYWNoIGluc3RhbmNlCisvLyBvZiB0aGlzIHZhciBpcyBhIHNlcGFyYXRlIHR5cGUuCit0ZW1wbGF0ZTxpbnQ+IGNsYXNzIExpYmNJbmZvV2l0aFBhdGNoRnVuY3Rpb25zIDogcHVibGljIExpYmNJbmZvIHsKKyBwdWJsaWM6CisgIC8vIG1lX2luZm8gc2hvdWxkIGhhdmUgaGFkIFBvcHVsYXRlV2luZG93c0ZuKCkgY2FsbGVkIG9uIGl0LCBzbyB0aGUKKyAgLy8gbW9kdWxlXyogdmFycyBhbmQgd2luZG93c19mbl8gYXJlIHNldCB1cC4KKyAgYm9vbCBQYXRjaChjb25zdCBMaWJjSW5mbyYgbWVfaW5mbyk7CisgIHZvaWQgVW5wYXRjaCgpOworCisgcHJpdmF0ZToKKyAgLy8gVGhpcyBob2xkcyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gY29udGVudHMgYWZ0ZXIgd2UgcGF0Y2ggdGhlIGZ1bmN0aW9uLgorICAvLyBUaGlzIGhhcyB0byBiZSBkZWZpbmVkIHN0YXRpYyBpbiB0aGUgc3ViY2xhc3MsIGJlY2F1c2UgdGhlIHBlcmZ0b29sc19mbnMKKyAgLy8gcmVmZXJlbmNlIG9yaWdzdHViX2ZuXy4KKyAgc3RhdGljIEdlbmVyaWNGblB0ciBvcmlnc3R1Yl9mbl9ba051bUZ1bmN0aW9uc107CisKKyAgLy8gVGhpcyBpcyB0aGUgZnVuY3Rpb24gd2Ugd2FudCB0byBwYXRjaCBpbgorICBzdGF0aWMgY29uc3QgR2VuZXJpY0ZuUHRyIHBlcmZ0b29sc19mbl9ba051bUZ1bmN0aW9uc107CisKKyAgc3RhdGljIHZvaWQqIFBlcmZ0b29sc19tYWxsb2Moc2l6ZV90IHNpemUpIF9fVEhST1c7CisgIHN0YXRpYyB2b2lkIFBlcmZ0b29sc19mcmVlKHZvaWQqIHB0cikgX19USFJPVzsKKyAgc3RhdGljIHZvaWQqIFBlcmZ0b29sc19yZWFsbG9jKHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpIF9fVEhST1c7CisgIHN0YXRpYyB2b2lkKiBQZXJmdG9vbHNfY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpIF9fVEhST1c7CisgIHN0YXRpYyB2b2lkKiBQZXJmdG9vbHNfbmV3KHNpemVfdCBzaXplKTsKKyAgc3RhdGljIHZvaWQqIFBlcmZ0b29sc19uZXdhcnJheShzaXplX3Qgc2l6ZSk7CisgIHN0YXRpYyB2b2lkIFBlcmZ0b29sc19kZWxldGUodm9pZCAqcHRyKTsKKyAgc3RhdGljIHZvaWQgUGVyZnRvb2xzX2RlbGV0ZWFycmF5KHZvaWQgKnB0cik7CisgIHN0YXRpYyB2b2lkKiBQZXJmdG9vbHNfbmV3X25vdGhyb3coc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfX1RIUk9XOworICBzdGF0aWMgdm9pZCogUGVyZnRvb2xzX25ld2FycmF5X25vdGhyb3coc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIF9fVEhST1c7CisgIHN0YXRpYyB2b2lkIFBlcmZ0b29sc19kZWxldGVfbm90aHJvdyh2b2lkICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIF9fVEhST1c7CisgIHN0YXRpYyB2b2lkIFBlcmZ0b29sc19kZWxldGVhcnJheV9ub3Rocm93KHZvaWQgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfX1RIUk9XOworICBzdGF0aWMgc2l6ZV90IFBlcmZ0b29sc19fbXNpemUodm9pZCAqcHRyKSBfX1RIUk9XOworICBzdGF0aWMgdm9pZCogUGVyZnRvb2xzX19leHBhbmQodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgX19USFJPVzsKKyAgLy8gbWFsbG9jLmggYWxzbyBkZWZpbmVzIHRoZXNlIGZ1bmN0aW9uczoKKyAgLy8gICBfYWxpZ25lZF9tYWxsb2MsIF9hbGlnbmVkX2ZyZWUsCisgIC8vICAgX3JlY2FsbG9jLCBfYWxpZ25lZF9vZmZzZXRfbWFsbG9jLCBfYWxpZ25lZF9yZWFsbG9jLCBfYWxpZ25lZF9yZWNhbGxvYworICAvLyAgIF9hbGlnbmVkX29mZnNldF9yZWFsbG9jLCBfYWxpZ25lZF9vZmZzZXRfcmVjYWxsb2MsIF9tYWxsb2NhLCBfZnJlZWEKKyAgLy8gQnV0IHRoZXkgc2VlbSBwcmV0dHkgb2JzY3VyZSwgYW5kIEknbSBmaW5lIG5vdCBvdmVycmlkaW5nIHRoZW0gZm9yIG5vdy4KKyAgLy8gSXQgbWF5IGJlIHRoZXkgYWxsIGNhbGwgaW50byBtYWxsb2MvZnJlZSBhbnl3YXkuCit9OworCisvLyBUaGlzIGlzIGEgc3Vic2V0IG9mIE1PRERVTEVFTlRSWTMyLCB0aGF0IHdlIG5lZWQgZm9yIHBhdGNoaW5nLgorc3RydWN0IE1vZHVsZUVudHJ5Q29weSB7CisgIExQVk9JRCAgbW9kQmFzZUFkZHI7ICAgICAvLyB0aGUgc2FtZSBhcyBobW9kdWxlCisgIERXT1JEICAgbW9kQmFzZVNpemU7CisgIC8vIFRoaXMgaXMgbm90IHBhcnQgb2YgTU9ERFVMRUVOVFJZMzIsIGJ1dCBpcyBuZWVkZWQgdG8gYXZvaWQgbWFraW5nCisgIC8vIHdpbmRvd3Mgc3lzY2FsbHMgd2hpbGUgd2UncmUgaG9sZGluZyBwYXRjaF9hbGxfbW9kdWxlc19sb2NrIChzZWUKKyAgLy8gbG9jay1pbnZlcnNpb24gY29tbWVudHMgYXQgcGF0Y2hfYWxsX21vZHVsZXNfbG9jayBkZWZpbml0aW9uLCBiZWxvdykuCisgIEdlbmVyaWNGblB0ciByZ1Byb2NBZGRyZXNzZXNbTGliY0luZm86OmN0cmdQcm9jQWRkcmVzc107CisKKyAgTW9kdWxlRW50cnlDb3B5KCkgeworICAgIG1vZEJhc2VBZGRyID0gTlVMTDsKKyAgICBtb2RCYXNlU2l6ZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YocmdQcm9jQWRkcmVzc2VzKS9zaXplb2YoKnJnUHJvY0FkZHJlc3Nlcyk7IGkrKykKKyAgICAgIHJnUHJvY0FkZHJlc3Nlc1tpXSA9IExpYmNJbmZvOjpzdGF0aWNfZm4oaSk7CisgIH0KKyAgTW9kdWxlRW50cnlDb3B5KGNvbnN0IE1PRFVMRUlORk8mIG1pKSB7CisgICAgdGhpcy0+bW9kQmFzZUFkZHIgPSBtaS5scEJhc2VPZkRsbDsKKyAgICB0aGlzLT5tb2RCYXNlU2l6ZSA9IG1pLlNpemVPZkltYWdlOworICAgIExQVk9JRCBtb2RFbmRBZGRyID0gKGNoYXIqKW1pLmxwQmFzZU9mRGxsICsgbWkuU2l6ZU9mSW1hZ2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YocmdQcm9jQWRkcmVzc2VzKS9zaXplb2YoKnJnUHJvY0FkZHJlc3Nlcyk7IGkrKykgeworICAgICAgRkFSUFJPQyB0YXJnZXQgPSA6OkdldFByb2NBZGRyZXNzKAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgSE1PRFVMRT4obWkubHBCYXNlT2ZEbGwpLAorICAgICAgICAgIExpYmNJbmZvOjpmdW5jdGlvbl9uYW1lKGkpKTsKKyAgICAgIC8vIFNvbWV0aW1lcyBhIERMTCBmb3J3YXJkcyBhIGZ1bmN0aW9uIHRvIGEgZnVuY3Rpb24gaW4gYW5vdGhlcgorICAgICAgLy8gRExMLiAgV2UgZG9uJ3Qgd2FudCB0byBwYXRjaCB0aG9zZSBmb3J3YXJkZWQgZnVuY3Rpb25zIC0tCisgICAgICAvLyB0aGV5J2xsIGdldCBwYXRjaGVkIHdoZW4gdGhlIG90aGVyIERMTCBpcyBwcm9jZXNzZWQuCisgICAgICBpZiAodGFyZ2V0ID49IG1vZEJhc2VBZGRyICYmIHRhcmdldCA8IG1vZEVuZEFkZHIpCisgICAgICAgIHJnUHJvY0FkZHJlc3Nlc1tpXSA9IChHZW5lcmljRm5QdHIpdGFyZ2V0OworICAgICAgZWxzZQorICAgICAgICByZ1Byb2NBZGRyZXNzZXNbaV0gPSAoR2VuZXJpY0ZuUHRyKU5VTEw7CisgICAgfQorICB9Cit9OworCisvLyBUaGlzIGNsYXNzIGlzIGVhc2llciBiZWNhdXNlIHRoZXJlJ3Mgb25seSBvbmUgb2YgdGhlbS4KK2NsYXNzIFdpbmRvd3NJbmZvIHsKKyBwdWJsaWM6CisgIHZvaWQgUGF0Y2goKTsKKyAgdm9pZCBVbnBhdGNoKCk7CisKKyBwcml2YXRlOgorICAvLyBUT0RPKGNzaWx2ZXJzKTogc2hvdWxkIHdlIGJlIHBhdGNoaW5nIEdsb2JhbEFsbG9jL0xvY2FsQWxsb2MgaW5zdGVhZCwKKyAgLy8gICAgICAgICAgICAgICAgIGZvciBwcmUtWFAgc3lzdGVtcz8KKyAgZW51bSB7CisgICAga0hlYXBBbGxvYywga0hlYXBGcmVlLCBrVmlydHVhbEFsbG9jRXgsIGtWaXJ0dWFsRnJlZUV4LAorICAgIGtNYXBWaWV3T2ZGaWxlRXgsIGtVbm1hcFZpZXdPZkZpbGUsIGtMb2FkTGlicmFyeUV4Vywga0ZyZWVMaWJyYXJ5LAorICAgIGtOdW1GdW5jdGlvbnMKKyAgfTsKKworICBzdHJ1Y3QgRnVuY3Rpb25JbmZvIHsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBuYW1lOyAgICAgICAgICAvLyBuYW1lIG9mIGZuIGluIGEgbW9kdWxlIChlZyAibWFsbG9jIikKKyAgICBHZW5lcmljRm5QdHIgd2luZG93c19mbjsgICAgICAgICAvLyB0aGUgZm4gd2hvc2UgbmFtZSB3ZSBjYWxsICgmbWFsbG9jKQorICAgIEdlbmVyaWNGblB0ciBvcmlnc3R1Yl9mbjsgICAgICAgIC8vIG9yaWdpbmFsIGZuIGNvbnRlbnRzIGFmdGVyIHdlIHBhdGNoCisgICAgY29uc3QgR2VuZXJpY0ZuUHRyIHBlcmZ0b29sc19mbjsgLy8gZm4gd2Ugd2FudCB0byBwYXRjaCBpbgorICB9OworCisgIHN0YXRpYyBGdW5jdGlvbkluZm8gZnVuY3Rpb25faW5mb19ba051bUZ1bmN0aW9uc107CisKKyAgLy8gQSBXaW5kb3dzLUFQSSBlcXVpdmFsZW50IG9mIG1hbGxvYyBhbmQgZnJlZQorICBzdGF0aWMgTFBWT0lEIFdJTkFQSSBQZXJmdG9vbHNfSGVhcEFsbG9jKEhBTkRMRSBoSGVhcCwgRFdPUkQgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRF9QVFIgZHdCeXRlcyk7CisgIHN0YXRpYyBCT09MIFdJTkFQSSBQZXJmdG9vbHNfSGVhcEZyZWUoSEFORExFIGhIZWFwLCBEV09SRCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscE1lbSk7CisgIC8vIEEgV2luZG93cy1BUEkgZXF1aXZhbGVudCBvZiBtbWFwIGFuZCBtdW5tYXAsIGZvciAiYW5vbnltb3VzIHJlZ2lvbnMiCisgIHN0YXRpYyBMUFZPSUQgV0lOQVBJIFBlcmZ0b29sc19WaXJ0dWFsQWxsb2NFeChIQU5ETEUgcHJvY2VzcywgTFBWT0lEIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFX1Qgc2l6ZSwgRFdPUkQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHByb3RlY3QpOworICBzdGF0aWMgQk9PTCBXSU5BUEkgUGVyZnRvb2xzX1ZpcnR1YWxGcmVlRXgoSEFORExFIHByb2Nlc3MsIExQVk9JRCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRV9UIHNpemUsIERXT1JEIHR5cGUpOworICAvLyBBIFdpbmRvd3MtQVBJIGVxdWl2YWxlbnQgb2YgbW1hcCBhbmQgbXVubWFwLCBmb3IgYWN0dWFsIGZpbGVzCisgIHN0YXRpYyBMUFZPSUQgV0lOQVBJIFBlcmZ0b29sc19NYXBWaWV3T2ZGaWxlRXgoSEFORExFIGhGaWxlTWFwcGluZ09iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGaWxlT2Zmc2V0SGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZpbGVPZmZzZXRMb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRV9UIGR3TnVtYmVyT2ZCeXRlc1RvTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEJhc2VBZGRyZXNzKTsKKyAgc3RhdGljIEJPT0wgV0lOQVBJIFBlcmZ0b29sc19Vbm1hcFZpZXdPZkZpbGUoTFBDVk9JRCBscEJhc2VBZGRyZXNzKTsKKyAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgb3RoZXIgMyB2YXJpYW50cyBiZWNhdXNlIHRoZXkgYWxsIGNhbGwgdGhpcyBvbmUuICovCisgIHN0YXRpYyBITU9EVUxFIFdJTkFQSSBQZXJmdG9vbHNfTG9hZExpYnJhcnlFeFcoTFBDV1NUUiBscEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRSBoRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKTsKKyAgc3RhdGljIEJPT0wgV0lOQVBJIFBlcmZ0b29sc19GcmVlTGlicmFyeShITU9EVUxFIGhMaWJNb2R1bGUpOworfTsKKworLy8gSWYgeW91IHJ1biBvdXQsIGp1c3QgYWRkIGEgZmV3IG1vcmUgdG8gdGhlIGFycmF5LiAgWW91J2xsIGFsc28gbmVlZAorLy8gdG8gdXBkYXRlIHRoZSBzd2l0Y2ggc3RhdGVtZW50IGluIFBhdGNoT25lTW9kdWxlKCksIGFuZCB0aGUgbGlzdCBpbgorLy8gVW5wYXRjaFdpbmRvd3NGdW5jdGlvbnMoKS4KKy8vIG1haW5fZXhlY3V0YWJsZSBhbmQgbWFpbl9leGVjdXRhYmxlX3dpbmRvd3MgYXJlIHR3byB3aW5kb3dzIGludG8KKy8vIHRoZSBzYW1lIGV4ZWN1dGFibGUuICBPbmUgaXMgcmVzcG9uc2libGUgZm9yIHBhdGNoaW5nIHRoZSBsaWJjCisvLyByb3V0aW5lcyB0aGF0IGxpdmUgaW4gdGhlIG1haW4gZXhlY3V0YWJsZSAoaWYgYW55KSB0byB1c2UgdGNtYWxsb2M7CisvLyB0aGUgb3RoZXIgaXMgcmVzcG9uc2libGUgZm9yIHBhdGNoaW5nIHRoZSB3aW5kb3dzIHJvdXRpbmVzIGxpa2UKKy8vIEhlYXBBbGxvYy9ldGMgdG8gdXNlIHRjbWFsbG9jLgorc3RhdGljIExpYmNJbmZvV2l0aFBhdGNoRnVuY3Rpb25zPDA+IG1haW5fZXhlY3V0YWJsZTsKK3N0YXRpYyBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczwxPiBsaWJjMTsKK3N0YXRpYyBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczwyPiBsaWJjMjsKK3N0YXRpYyBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczwzPiBsaWJjMzsKK3N0YXRpYyBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczw0PiBsaWJjNDsKK3N0YXRpYyBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczw1PiBsaWJjNTsKK3N0YXRpYyBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczw2PiBsaWJjNjsKK3N0YXRpYyBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczw3PiBsaWJjNzsKK3N0YXRpYyBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczw4PiBsaWJjODsKK3N0YXRpYyBMaWJjSW5mbyogZ19tb2R1bGVfbGliY3NbXSA9IHsKKyAgJmxpYmMxLCAmbGliYzIsICZsaWJjMywgJmxpYmM0LCAmbGliYzUsICZsaWJjNiwgJmxpYmM3LCAmbGliYzgKK307CitzdGF0aWMgV2luZG93c0luZm8gbWFpbl9leGVjdXRhYmxlX3dpbmRvd3M7CisKK2NvbnN0IGNoYXIqIGNvbnN0IExpYmNJbmZvOjpmdW5jdGlvbl9uYW1lX1tdID0geworICAibWFsbG9jIiwgImZyZWUiLCAicmVhbGxvYyIsICJjYWxsb2MiLAorICBrTWFuZ2xlZE5ldywga01hbmdsZWROZXdBcnJheSwga01hbmdsZWREZWxldGUsIGtNYW5nbGVkRGVsZXRlQXJyYXksCisgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIHBhdGNoIHRoZSBub3Rocm93IHZlcnNpb25zIG9mIG5ldy9kZWxldGUsIGJ1dAorICAvLyBhdCBsZWFzdCBpbiBtc3ZjcnQsIG5vdGhyb3ctbmV3IG1hY2hpbmUtY29kZSBpcyBvZiBhIHR5cGUgd2UKKyAgLy8gY2FuJ3QgcGF0Y2guICBTaW5jZSB0aGVzZSBhcmUgcmVsYXRpdmVseSByYXJlLCBJJ20gaG9waW5nIGl0J3Mgb2sKKyAgLy8gbm90IHRvIHBhdGNoIHRoZW0uICAoTlVMTCBuYW1lIHR1cm5zIG9mZiBwYXRjaGluZy4pCisgIE5VTEwsICAvLyBrTWFuZ2xlZE5ld05vdGhyb3csCisgIE5VTEwsICAvLyBrTWFuZ2xlZE5ld0FycmF5Tm90aHJvdywKKyAgTlVMTCwgIC8vIGtNYW5nbGVkRGVsZXRlTm90aHJvdywKKyAgTlVMTCwgIC8vIGtNYW5nbGVkRGVsZXRlQXJyYXlOb3Rocm93LAorICAiX21zaXplIiwgIl9leHBhbmQiLCAiX2NhbGxvY19jcnQiLAorfTsKKworLy8gRm9yIG1pbmd3LCBJIGNhbid0IHBhdGNoIHRoZSBuZXcvZGVsZXRlIGhlcmUsIGJlY2F1c2UgdGhlCisvLyBpbnN0cnVjdGlvbnMgYXJlIHRvbyBzbWFsbCB0byBwYXRjaC4gIEx1Y2tpbHksIHRoZXkncmUgc28gc21hbGwKKy8vIGJlY2F1c2UgYWxsIHRoZXkgZG8gaXMgY2FsbCBpbnRvIG1hbGxvYy9mcmVlLCBzbyB0aGV5IHN0aWxsIGVuZCB1cAorLy8gY2FsbGluZyB0Y21hbGxvYyByb3V0aW5lcywgYW5kIHdlIGRvbid0IGFjdHVhbGx5IGxvc2UgYW55dGhpbmcKKy8vIChleGNlcHQgbWF5YmUgc29tZSBzdGFja3RyYWNlIGdvb2RuZXNzKSBieSBub3QgcGF0Y2hpbmcuCitjb25zdCBHZW5lcmljRm5QdHIgTGliY0luZm86OnN0YXRpY19mbl9bXSA9IHsKKyAgKEdlbmVyaWNGblB0cikmOjptYWxsb2MsCisgIChHZW5lcmljRm5QdHIpJjo6ZnJlZSwKKyAgKEdlbmVyaWNGblB0cikmOjpyZWFsbG9jLAorICAoR2VuZXJpY0ZuUHRyKSY6OmNhbGxvYywKKyNpZmRlZiBfX01JTkdXMzJfXworICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorI2Vsc2UKKyAgKEdlbmVyaWNGblB0cikodm9pZCooKikoc2l6ZV90KSkmOjpvcGVyYXRvciBuZXcsCisgIChHZW5lcmljRm5QdHIpKHZvaWQqKCopKHNpemVfdCkpJjo6b3BlcmF0b3IgbmV3W10sCisgIChHZW5lcmljRm5QdHIpKHZvaWQoKikodm9pZCopKSY6Om9wZXJhdG9yIGRlbGV0ZSwKKyAgKEdlbmVyaWNGblB0cikodm9pZCgqKSh2b2lkKikpJjo6b3BlcmF0b3IgZGVsZXRlW10sCisgIChHZW5lcmljRm5QdHIpCisgICh2b2lkKigqKShzaXplX3QsIHN0cnVjdCBzdGQ6Om5vdGhyb3dfdCBjb25zdCAmKSkmOjpvcGVyYXRvciBuZXcsCisgIChHZW5lcmljRm5QdHIpCisgICh2b2lkKigqKShzaXplX3QsIHN0cnVjdCBzdGQ6Om5vdGhyb3dfdCBjb25zdCAmKSkmOjpvcGVyYXRvciBuZXdbXSwKKyAgKEdlbmVyaWNGblB0cikKKyAgKHZvaWQoKikodm9pZCosIHN0cnVjdCBzdGQ6Om5vdGhyb3dfdCBjb25zdCAmKSkmOjpvcGVyYXRvciBkZWxldGUsCisgIChHZW5lcmljRm5QdHIpCisgICh2b2lkKCopKHZvaWQqLCBzdHJ1Y3Qgc3RkOjpub3Rocm93X3QgY29uc3QgJikpJjo6b3BlcmF0b3IgZGVsZXRlW10sCisjZW5kaWYKKyAgKEdlbmVyaWNGblB0cikmOjpfbXNpemUsCisgIChHZW5lcmljRm5QdHIpJjo6X2V4cGFuZCwKKyAgKEdlbmVyaWNGblB0cikmOjpjYWxsb2MsCit9OworCit0ZW1wbGF0ZTxpbnQgVD4gR2VuZXJpY0ZuUHRyIExpYmNJbmZvV2l0aFBhdGNoRnVuY3Rpb25zPFQ+Ojpvcmlnc3R1Yl9mbl9bXSA9IHsKKyAgLy8gVGhpcyB3aWxsIGdldCBmaWxsZWQgaW4gYXQgcnVuLXRpbWUsIGFzIHBhdGNoaW5nIGlzIGRvbmUuCit9OworCit0ZW1wbGF0ZTxpbnQgVD4KK2NvbnN0IEdlbmVyaWNGblB0ciBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczxUPjo6cGVyZnRvb2xzX2ZuX1tdID0geworICAoR2VuZXJpY0ZuUHRyKSZQZXJmdG9vbHNfbWFsbG9jLAorICAoR2VuZXJpY0ZuUHRyKSZQZXJmdG9vbHNfZnJlZSwKKyAgKEdlbmVyaWNGblB0cikmUGVyZnRvb2xzX3JlYWxsb2MsCisgIChHZW5lcmljRm5QdHIpJlBlcmZ0b29sc19jYWxsb2MsCisgIChHZW5lcmljRm5QdHIpJlBlcmZ0b29sc19uZXcsCisgIChHZW5lcmljRm5QdHIpJlBlcmZ0b29sc19uZXdhcnJheSwKKyAgKEdlbmVyaWNGblB0cikmUGVyZnRvb2xzX2RlbGV0ZSwKKyAgKEdlbmVyaWNGblB0cikmUGVyZnRvb2xzX2RlbGV0ZWFycmF5LAorICAoR2VuZXJpY0ZuUHRyKSZQZXJmdG9vbHNfbmV3X25vdGhyb3csCisgIChHZW5lcmljRm5QdHIpJlBlcmZ0b29sc19uZXdhcnJheV9ub3Rocm93LAorICAoR2VuZXJpY0ZuUHRyKSZQZXJmdG9vbHNfZGVsZXRlX25vdGhyb3csCisgIChHZW5lcmljRm5QdHIpJlBlcmZ0b29sc19kZWxldGVhcnJheV9ub3Rocm93LAorICAoR2VuZXJpY0ZuUHRyKSZQZXJmdG9vbHNfX21zaXplLAorICAoR2VuZXJpY0ZuUHRyKSZQZXJmdG9vbHNfX2V4cGFuZCwKKyAgKEdlbmVyaWNGblB0cikmUGVyZnRvb2xzX2NhbGxvYywKK307CisKKy8qc3RhdGljKi8gV2luZG93c0luZm86OkZ1bmN0aW9uSW5mbyBXaW5kb3dzSW5mbzo6ZnVuY3Rpb25faW5mb19bXSA9IHsKKyAgeyAiSGVhcEFsbG9jIiwgTlVMTCwgTlVMTCwgKEdlbmVyaWNGblB0cikmUGVyZnRvb2xzX0hlYXBBbGxvYyB9LAorICB7ICJIZWFwRnJlZSIsIE5VTEwsIE5VTEwsIChHZW5lcmljRm5QdHIpJlBlcmZ0b29sc19IZWFwRnJlZSB9LAorICB7ICJWaXJ0dWFsQWxsb2NFeCIsIE5VTEwsIE5VTEwsIChHZW5lcmljRm5QdHIpJlBlcmZ0b29sc19WaXJ0dWFsQWxsb2NFeCB9LAorICB7ICJWaXJ0dWFsRnJlZUV4IiwgTlVMTCwgTlVMTCwgKEdlbmVyaWNGblB0cikmUGVyZnRvb2xzX1ZpcnR1YWxGcmVlRXggfSwKKyAgeyAiTWFwVmlld09mRmlsZUV4IiwgTlVMTCwgTlVMTCwgKEdlbmVyaWNGblB0cikmUGVyZnRvb2xzX01hcFZpZXdPZkZpbGVFeCB9LAorICB7ICJVbm1hcFZpZXdPZkZpbGUiLCBOVUxMLCBOVUxMLCAoR2VuZXJpY0ZuUHRyKSZQZXJmdG9vbHNfVW5tYXBWaWV3T2ZGaWxlIH0sCisgIHsgIkxvYWRMaWJyYXJ5RXhXIiwgTlVMTCwgTlVMTCwgKEdlbmVyaWNGblB0cikmUGVyZnRvb2xzX0xvYWRMaWJyYXJ5RXhXIH0sCisgIHsgIkZyZWVMaWJyYXJ5IiwgTlVMTCwgTlVMTCwgKEdlbmVyaWNGblB0cikmUGVyZnRvb2xzX0ZyZWVMaWJyYXJ5IH0sCit9OworCitib29sIExpYmNJbmZvOjpQb3B1bGF0ZVdpbmRvd3NGbihjb25zdCBNb2R1bGVFbnRyeUNvcHkmIG1vZHVsZV9lbnRyeSkgeworICAvLyBGaXJzdCwgc3RvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmdW5jdGlvbiB0byBwYXRjaCBiZWZvcmUKKyAgLy8gcGF0Y2hpbmcgaXQuICBJZiBub25lIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgZm91bmQgaW4gdGhlIG1vZHVsZSwKKyAgLy8gdGhlbiB0aGlzIG1vZHVsZSBoYXMgbm8gbGliYyBpbiBpdCwgYW5kIHdlIGp1c3QgcmV0dXJuIGZhbHNlLgorICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1GdW5jdGlvbnM7IGkrKykgeworICAgIGlmICghZnVuY3Rpb25fbmFtZV9baV0pICAgICAvLyB3ZSBjYW4gdHVybiBvZmYgcGF0Y2hpbmcgYnkgdW5zZXR0aW5nIG5hbWUKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIFRoZSA6OkdldFByb2NBZGRyZXNzIGNhbGxzIHdlcmUgZG9uZSBpbiB0aGUgTW9kdWxlRW50cnlDb3B5CisgICAgLy8gY29uc3RydWN0b3IsIHNvIHdlIGRvbid0IGhhdmUgdG8gbWFrZSBhbnkgd2luZG93cyBjYWxscyBoZXJlLgorICAgIGNvbnN0IEdlbmVyaWNGblB0ciBmbiA9IG1vZHVsZV9lbnRyeS5yZ1Byb2NBZGRyZXNzZXNbaV07CisgICAgaWYgKGZuKSB7CisgICAgICB3aW5kb3dzX2ZuX1tpXSA9IFByZWFtYmxlUGF0Y2hlcjo6UmVzb2x2ZVRhcmdldChmbik7CisgICAgfQorICB9CisKKyAgLy8gU29tZSBtb2R1bGVzIHVzZSB0aGUgc2FtZSBmdW5jdGlvbiBwb2ludGVyIGZvciBuZXcgYW5kIG5ld1tdLiAgSWYKKyAgLy8gd2UgZmluZCB0aGF0LCBzZXQgb25lIG9mIHRoZSBwb2ludGVycyB0byBOVUxMIHNvIHdlIGRvbid0IGRvdWJsZS0KKyAgLy8gcGF0Y2guICBTYW1lIG1heSBoYXBwZW4gd2l0aCBuZXcgYW5kIG5vdGhyb3ctbmV3LCBvciBldmVuIG5ld1tdCisgIC8vIGFuZCBub3Rocm93LW5ldy4gIEl0J3MgZWFzaWVzdCBqdXN0IHRvIGNoZWNrIGVhY2ggZm4tcHRyIGFnYWluc3QKKyAgLy8gZXZlcnkgb3RoZXIuCisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUZ1bmN0aW9uczsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IGkrMTsgaiA8IGtOdW1GdW5jdGlvbnM7IGorKykgeworICAgICAgaWYgKHdpbmRvd3NfZm5fW2ldID09IHdpbmRvd3NfZm5fW2pdKSB7CisgICAgICAgIC8vIFdlIE5VTEwgdGhlIGxhdGVyIG9uZSAoaiksIHNvIGFzIHRvIG1pbmltaXplIHRoZSBjaGFuY2VzIHdlCisgICAgICAgIC8vIE5VTEwga0ZyZWUgYW5kIGtSZWFsbG9jLiAgU2VlIGNvbW1lbnRzIGJlbG93LiAgVGhpcyBpcyBmcmFnaWxlIQorICAgICAgICB3aW5kb3dzX2ZuX1tqXSA9IE5VTEw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVGhlcmUncyBhbHdheXMgYSBjaGFuY2UgdGhhdCBvdXIgbW9kdWxlIHVzZXMgdGhlIHNhbWUgZnVuY3Rpb24KKyAgLy8gYXMgYW5vdGhlciBtb2R1bGUgdGhhdCB3ZSd2ZSBhbHJlYWR5IGxvYWRlZC4gIEluIHRoYXQgY2FzZSwgd2UKKyAgLy8gbmVlZCB0byBzZXQgb3VyIHdpbmRvd3NfZm4gdG8gTlVMTCwgdG8gYXZvaWQgZG91YmxlLXBhdGNoaW5nLgorICBmb3IgKGludCBpZm4gPSAwOyBpZm4gPCBrTnVtRnVuY3Rpb25zOyBpZm4rKykgeworICAgIGZvciAoaW50IGltb2QgPSAwOworICAgICAgICAgaW1vZCA8IHNpemVvZihnX21vZHVsZV9saWJjcykvc2l6ZW9mKCpnX21vZHVsZV9saWJjcyk7ICBpbW9kKyspIHsKKyAgICAgIGlmIChnX21vZHVsZV9saWJjc1tpbW9kXS0+aXNfdmFsaWQoKSAmJgorICAgICAgICAgIHRoaXMtPndpbmRvd3NfZm4oaWZuKSA9PSBnX21vZHVsZV9saWJjc1tpbW9kXS0+d2luZG93c19mbihpZm4pKSB7CisgICAgICAgIHdpbmRvd3NfZm5fW2lmbl0gPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGJvb2wgZm91bmRfbm9uX251bGwgPSBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtRnVuY3Rpb25zOyBpKyspIHsKKyAgICBpZiAod2luZG93c19mbl9baV0pCisgICAgICBmb3VuZF9ub25fbnVsbCA9IHRydWU7CisgIH0KKyAgaWYgKCFmb3VuZF9ub25fbnVsbCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSXQncyBpbXBvcnRhbnQgd2UgZGlkbid0IE5VTEwgb3V0IHdpbmRvd3NfZm5fW2tGcmVlXSBvciBba1JlYWxsb2NdLgorICAvLyBUaGUgcmVhc29uIGlzLCBpZiB0aG9zZSBhcmUgTlVMTC1lZCBvdXQsIHdlJ2xsIG5ldmVyIHBhdGNoIHRoZW0KKyAgLy8gYW5kIHRodXMgbmV2ZXIgZ2V0IGFuIG9yaWdzdHViX2ZuXyB2YWx1ZSBmb3IgdGhlbSwgYW5kIHdoZW4gd2UKKyAgLy8gdHJ5IHRvIGNhbGwgb3JpZ3N0dWJfZm5fW2tGcmVlL2tSZWFsbG9jXSBpbiBQZXJmdG9vbHNfZnJlZSBhbmQKKyAgLy8gUGVyZnRvb2xzX3JlYWxsb2MsIGJlbG93LCBpdCB3aWxsIGZhaWwuICBXZSBjb3VsZCB3b3JrIGFyb3VuZAorICAvLyB0aGF0IGJ5IGFkZGluZyBhIHBvaW50ZXIgZnJvbSBvbmUgcGF0Y2gtdW5pdCB0byB0aGUgb3RoZXIsIGJ1dCB3ZQorICAvLyBoYXZlbid0IG5lZWRlZCB0byB5ZXQuCisgIENIRUNLKHdpbmRvd3NfZm5fW2tGcmVlXSk7CisgIENIRUNLKHdpbmRvd3NfZm5fW2tSZWFsbG9jXSk7CisKKyAgLy8gT0ssIHdlIHN1Y2Nlc3NmdWxseSBwb3B1bGF0ZWQuICBMZXQncyBzdG9yZSBvdXIgbWVtYmVyIGluZm9ybWF0aW9uLgorICBtb2R1bGVfYmFzZV9hZGRyZXNzXyA9IG1vZHVsZV9lbnRyeS5tb2RCYXNlQWRkcjsKKyAgbW9kdWxlX2Jhc2Vfc2l6ZV8gPSBtb2R1bGVfZW50cnkubW9kQmFzZVNpemU7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTxpbnQgVD4KK2Jvb2wgTGliY0luZm9XaXRoUGF0Y2hGdW5jdGlvbnM8VD46OlBhdGNoKGNvbnN0IExpYmNJbmZvJiBtZV9pbmZvKSB7CisgIENvcHlGcm9tKG1lX2luZm8pOyAgIC8vIGNvcGllcyB0aGUgbW9kdWxlX2VudHJ5IGFuZCB0aGUgd2luZG93c19mbl8gYXJyYXkKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtRnVuY3Rpb25zOyBpKyspIHsKKyAgICBpZiAod2luZG93c19mbl9baV0gJiYgd2luZG93c19mbl9baV0gIT0gcGVyZnRvb2xzX2ZuX1tpXSkgeworICAgICAgLy8gaWYgb3JpZ3N0dWJfZm5fIGlzIG5vdCBOVUxMLCBpdCdzIGxlZnQgYXJvdW5kIGZyb20gYSBwcmV2aW91cworICAgICAgLy8gcGF0Y2guICBXZSBuZWVkIHRvIHNldCBpdCB0byBOVUxMIGZvciB0aGUgbmV3IFBhdGNoIGNhbGwuCisgICAgICAvLworICAgICAgLy8gTm90ZSB0aGF0IG9yaWdzdHViX2ZuXyB3YXMgbG9naWNhbGx5IGZyZWVkIGJ5CisgICAgICAvLyBQcmVhbWJsZVBhdGNoZXI6OlVucGF0Y2gsIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKKyAgICAgIC8vIGFib3V0IGl0LgorICAgICAgb3JpZ3N0dWJfZm5fW2ldID0gTlVMTDsgICAvLyBQYXRjaCgpIHdpbGwgZmlsbCB0aGlzIGluCisgICAgICBDSEVDS19FUShzaWRlc3RlcDo6U0lERVNURVBfU1VDQ0VTUywKKyAgICAgICAgICAgICAgIFByZWFtYmxlUGF0Y2hlcjo6UGF0Y2god2luZG93c19mbl9baV0sIHBlcmZ0b29sc19mbl9baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmlnc3R1Yl9mbl9baV0pKTsKKyAgICB9CisgIH0KKyAgc2V0X2lzX3ZhbGlkKHRydWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8aW50IFQ+Cit2b2lkIExpYmNJbmZvV2l0aFBhdGNoRnVuY3Rpb25zPFQ+OjpVbnBhdGNoKCkgeworICAvLyBXZSBoYXZlIHRvIGNhc3Qgb3VyIEdlbmVyaWNGblB0cnMgdG8gdm9pZCogZm9yIHVucGF0Y2guICBUaGlzIGlzCisgIC8vIGNvbnRyYSB0aGUgQysrIHNwZWM7IHdlIHVzZSBDLXN0eWxlIGNhc3RzIHRvIGVtcGFoc2l6ZSB0aGF0LgorICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1GdW5jdGlvbnM7IGkrKykgeworICAgIGlmICh3aW5kb3dzX2ZuX1tpXSkKKyAgICAgIENIRUNLX0VRKHNpZGVzdGVwOjpTSURFU1RFUF9TVUNDRVNTLAorICAgICAgICAgICAgICAgUHJlYW1ibGVQYXRjaGVyOjpVbnBhdGNoKCh2b2lkKil3aW5kb3dzX2ZuX1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopcGVyZnRvb2xzX2ZuX1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopb3JpZ3N0dWJfZm5fW2ldKSk7CisgIH0KKyAgc2V0X2lzX3ZhbGlkKGZhbHNlKTsKK30KKwordm9pZCBXaW5kb3dzSW5mbzo6UGF0Y2goKSB7CisgIEhNT0RVTEUgaGtlcm5lbDMyID0gOjpHZXRNb2R1bGVIYW5kbGVBKCJrZXJuZWwzMiIpOworICBDSEVDS19ORShoa2VybmVsMzIsIE5VTEwpOworCisgIC8vIFVubGlrZSBmb3IgbGliYywgd2Uga25vdyB0aGVzZSBleGlzdCBpbiBvdXIgbW9kdWxlLCBzbyB3ZSBjYW4gZ2V0CisgIC8vIGFuZCBwYXRjaCBhdCB0aGUgc2FtZSB0aW1lLgorICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1GdW5jdGlvbnM7IGkrKykgeworICAgIGZ1bmN0aW9uX2luZm9fW2ldLndpbmRvd3NfZm4gPSAoR2VuZXJpY0ZuUHRyKQorICAgICAgICA6OkdldFByb2NBZGRyZXNzKGhrZXJuZWwzMiwgZnVuY3Rpb25faW5mb19baV0ubmFtZSk7CisgICAgLy8gSWYgb3JpZ3N0dWJfZm4gaXMgbm90IE5VTEwsIGl0J3MgbGVmdCBhcm91bmQgZnJvbSBhIHByZXZpb3VzCisgICAgLy8gcGF0Y2guICBXZSBuZWVkIHRvIHNldCBpdCB0byBOVUxMIGZvciB0aGUgbmV3IFBhdGNoIGNhbGwuCisgICAgLy8gU2luY2Ugd2UndmUgcGF0Y2hlZCBVbnBhdGNoKCkgbm90IHRvIGRlbGV0ZSBvcmlnc3R1Yl9mbl8gKGl0CisgICAgLy8gY2F1c2VzIHByb2JsZW1zIGluIHNvbWUgY29udGV4dHMsIHRob3VnaCBvYnZpb3VzbHkgbm90IHRoaXMKKyAgICAvLyBvbmUpLCB3ZSBzaG91bGQgZGVsZXRlIGl0IG5vdywgYmVmb3JlIHNldHRpbmcgaXQgdG8gTlVMTC4KKyAgICAvLyBOT1RFOiBjYXN0aW5nIGZyb20gYSBmdW5jdGlvbiB0byBhIHBvaW50ZXIgaXMgY29udHJhIHRoZSBDKysKKyAgICAvLyAgICAgICBzcGVjLiAgSXQncyBub3Qgc2FmZSBvbiBJQTY0LCBidXQgaXMgb24gaTM4Ni4gIFdlIHVzZQorICAgIC8vICAgICAgIGEgQy1zdHlsZSBjYXN0IGhlcmUgdG8gZW1waGFzaXplIHRoaXMgaXMgbm90IGxlZ2FsIEMrKy4KKyAgICBkZWxldGVbXSAoY2hhciopKGZ1bmN0aW9uX2luZm9fW2ldLm9yaWdzdHViX2ZuKTsKKyAgICBmdW5jdGlvbl9pbmZvX1tpXS5vcmlnc3R1Yl9mbiA9IE5VTEw7ICAvLyBQYXRjaCgpIHdpbGwgZmlsbCB0aGlzIGluCisgICAgQ0hFQ0tfRVEoc2lkZXN0ZXA6OlNJREVTVEVQX1NVQ0NFU1MsCisgICAgICAgICAgICAgUHJlYW1ibGVQYXRjaGVyOjpQYXRjaChmdW5jdGlvbl9pbmZvX1tpXS53aW5kb3dzX2ZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25faW5mb19baV0ucGVyZnRvb2xzX2ZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bmN0aW9uX2luZm9fW2ldLm9yaWdzdHViX2ZuKSk7CisgIH0KK30KKwordm9pZCBXaW5kb3dzSW5mbzo6VW5wYXRjaCgpIHsKKyAgLy8gV2UgaGF2ZSB0byBjYXN0IG91ciBHZW5lcmljRm5QdHJzIHRvIHZvaWQqIGZvciB1bnBhdGNoLiAgVGhpcyBpcworICAvLyBjb250cmEgdGhlIEMrKyBzcGVjOyB3ZSB1c2UgQy1zdHlsZSBjYXN0cyB0byBlbXBhaHNpemUgdGhhdC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtRnVuY3Rpb25zOyBpKyspIHsKKyAgICBDSEVDS19FUShzaWRlc3RlcDo6U0lERVNURVBfU1VDQ0VTUywKKyAgICAgICAgICAgICBQcmVhbWJsZVBhdGNoZXI6OlVucGF0Y2goKHZvaWQqKWZ1bmN0aW9uX2luZm9fW2ldLndpbmRvd3NfZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilmdW5jdGlvbl9pbmZvX1tpXS5wZXJmdG9vbHNfZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilmdW5jdGlvbl9pbmZvX1tpXS5vcmlnc3R1Yl9mbikpOworICB9Cit9CisKKy8vIFlvdSBzaG91bGQgaG9sZCB0aGUgcGF0Y2hfYWxsX21vZHVsZXNfbG9jayB3aGVuIGNhbGxpbmcgdGhpcy4KK3ZvaWQgUGF0Y2hPbmVNb2R1bGVMb2NrZWQoY29uc3QgTGliY0luZm8mIG1lX2luZm8pIHsKKyAgLy8gSWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGluZm8gb24gdGhpcyBtb2R1bGUsIGxldCdzIGFkZCBpdC4gIFRoaXMKKyAgLy8gaXMgd2hlcmUgd2UncmUgc2FkIHRoYXQgZWFjaCBsaWJjWCBoYXMgYSBkaWZmZXJlbnQgdHlwZSwgc28gd2UKKyAgLy8gY2FuJ3QgdXNlIGFuIGFycmF5OyBpbnN0ZWFkLCB3ZSBoYXZlIHRvIHVzZSBhIHN3aXRjaCBzdGF0ZW1lbnQuCisgIC8vIFBhdGNoKCkgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSB3ZXJlIG5vIGxpYmMgZnVuY3Rpb25zIGluIHRoZSBtb2R1bGUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKGdfbW9kdWxlX2xpYmNzKS9zaXplb2YoKmdfbW9kdWxlX2xpYmNzKTsgaSsrKSB7CisgICAgaWYgKCFnX21vZHVsZV9saWJjc1tpXS0+aXNfdmFsaWQoKSkgeyAgIC8vIGZvdW5kIGFuIGVtcHR5IHNwb3QgdG8gYWRkIQorICAgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgMDogbGliYzEuUGF0Y2gobWVfaW5mbyk7IHJldHVybjsKKyAgICAgICAgY2FzZSAxOiBsaWJjMi5QYXRjaChtZV9pbmZvKTsgcmV0dXJuOworICAgICAgICBjYXNlIDI6IGxpYmMzLlBhdGNoKG1lX2luZm8pOyByZXR1cm47CisgICAgICAgIGNhc2UgMzogbGliYzQuUGF0Y2gobWVfaW5mbyk7IHJldHVybjsKKyAgICAgICAgY2FzZSA0OiBsaWJjNS5QYXRjaChtZV9pbmZvKTsgcmV0dXJuOworICAgICAgICBjYXNlIDU6IGxpYmM2LlBhdGNoKG1lX2luZm8pOyByZXR1cm47CisgICAgICAgIGNhc2UgNjogbGliYzcuUGF0Y2gobWVfaW5mbyk7IHJldHVybjsKKyAgICAgICAgY2FzZSA3OiBsaWJjOC5QYXRjaChtZV9pbmZvKTsgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorICBwcmludGYoIlBFUkZUT09MUyBFUlJPUjogVG9vIG1hbnkgbW9kdWxlcyBjb250YWluaW5nIGxpYmMgaW4gdGhpcyBleGVjdXRhYmxlXG4iKTsKK30KKwordm9pZCBQYXRjaE1haW5FeGVjdXRhYmxlTG9ja2VkKCkgeworICBpZiAobWFpbl9leGVjdXRhYmxlLnBhdGNoZWQoKSkKKyAgICByZXR1cm47ICAgIC8vIG1haW4gZXhlY3V0YWJsZSBoYXMgYWxyZWFkeSBiZWVuIHBhdGNoZWQKKyAgTW9kdWxlRW50cnlDb3B5IGZha2VfbW9kdWxlX2VudHJ5OyAgIC8vIG1ha2UgYSBmYWtlIG9uZSB0byBwYXNzIGludG8gUGF0Y2goKQorICAvLyBObyBuZWVkIHRvIGNhbGwgUG9wdWxhdGVNb2R1bGVFbnRyeVByb2NBZGRyZXNzZXMgb24gdGhlIG1haW4gZXhlY3V0YWJsZS4KKyAgbWFpbl9leGVjdXRhYmxlLlBvcHVsYXRlV2luZG93c0ZuKGZha2VfbW9kdWxlX2VudHJ5KTsKKyAgbWFpbl9leGVjdXRhYmxlLlBhdGNoKG1haW5fZXhlY3V0YWJsZSk7Cit9CisKKy8vIFRoaXMgbG9jayBpcyBzdWJqZWN0IHRvIGEgc3VidGxlIGFuZCBhbm5veWluZyBsb2NrIGludmVyc2lvbgorLy8gcHJvYmxlbTogaXQgbWF5IGludGVyYWN0IGJhZGx5IHdpdGggdW5rbm93biBpbnRlcm5hbCB3aW5kb3dzIGxvY2tzLgorLy8gSW4gcGFydGljdWxhciwgd2luZG93cyBtYXkgYmUgaG9sZGluZyBhIGxvY2sgd2hlbiBpdCBjYWxscworLy8gTG9hZExpYnJhcnlFeFcgYW5kIEZyZWVMaWJyYXJ5LCB3aGljaCB3ZSd2ZSBwYXRjaGVkLiAgV2UgaGF2ZSB0aG9zZQorLy8gcm91dGluZXMgY2FsbCBQYXRjaEFsbE1vZHVsZXMsIHdoaWNoIGFjcXVpcmVzIHRoaXMgbG9jay4gIElmIHdlCisvLyBtYWtlIHdpbmRvd3Mgc3lzdGVtIGNhbGxzIHdoaWxlIGhvbGRpbmcgdGhpcyBsb2NrLCB0aG9zZSBzeXN0ZW0KKy8vIGNhbGxzIG1heSBuZWVkIHRoZSBpbnRlcm5hbCB3aW5kb3dzIGxvY2tzIHRoYXQgYXJlIGJlaW5nIGhlbGQgaW4KKy8vIHRoZSBjYWxsIHRvIExvYWRMaWJyYXJ5RXhXLCByZXN1bHRpbmcgaW4gZGVhZGxvY2suICBUaGUgc29sdXRpb24gaXMKKy8vIHRvIGJlIHZlcnkgY2FyZWZ1bCBub3QgdG8gY2FsbCAqYW55KiB3aW5kb3dzIHJvdXRpbmVzIHdoaWxlIGhvbGRpbmcKKy8vIHBhdGNoX2FsbF9tb2R1bGVzX2xvY2ssIGluc2lkZSBQYXRjaEFsbE1vZHVsZXMoKS4KK3N0YXRpYyBTcGluTG9jayBwYXRjaF9hbGxfbW9kdWxlc19sb2NrKFNwaW5Mb2NrOjpMSU5LRVJfSU5JVElBTElaRUQpOworCisvLyBsYXN0X2xvYWRlZDogVGhlIHNldCBvZiBtb2R1bGVzIHRoYXQgd2VyZSBsb2FkZWQgdGhlIGxhc3QgdGltZQorLy8gUGF0Y2hBbGxNb2R1bGVzIHdhcyBjYWxsZWQuICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBmb3Igb25seQorLy8gbG9va2luZyBhdCBtb2R1bGVzIHRoYXQgd2VyZSBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIGxhc3QgY2FsbC4KK3N0YXRpYyBzdGQ6OnNldDxITU9EVUxFPiAqZ19sYXN0X2xvYWRlZDsKKworLy8gSXRlcmF0ZXMgb3ZlciBhbGwgdGhlIG1vZHVsZXMgY3VycmVudGx5IGxvYWRlZCBieSB0aGUgZXhlY3V0YWJsZSwKKy8vIGFjY29yZGluZyB0byB3aW5kb3dzLCBhbmQgbWFrZXMgc3VyZSB0aGV5J3JlIGFsbCBwYXRjaGVkLiAgTW9zdAorLy8gbW9kdWxlcyB3aWxsIGFscmVhZHkgYmUgaW4gbG9hZGVkX21vZHVsZXMsIG1lYW5pbmcgd2UgaGF2ZSBhbHJlYWR5CisvLyBsb2FkZWQgYW5kIGVpdGhlciBwYXRjaGVkIHRoZW0gb3IgZGV0ZXJtaW5lZCB0aGV5IGRpZCBub3QgbmVlZCB0bworLy8gYmUgcGF0Y2hlZC4gIE90aGVycyB3aWxsIG5vdCwgd2hpY2ggbWVhbnMgd2UgbmVlZCB0byBwYXRjaCB0aGVtCisvLyAoaWYgbmVjZXNzYXJ5KS4gIEZpbmFsbHksIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCB0aGUgZXhpc3RpbmcKKy8vIGdfbW9kdWxlX2xpYmNzIGFuZCBzZWUgaWYgYW55IG9mIHRob3NlIGFyZSAqbm90KiBpbiB0aGUgbW9kdWxlcworLy8gY3VycmVudGx5IGxvYWRlZCBieSB0aGUgZXhlY3V0YWJsZS4gIElmIHNvLCB3ZSBuZWVkIHRvIGludmFsaWRhdGUKKy8vIHRoZW0uICBSZXR1cm5zIHRydWUgaWYgd2UgZGlkIGFueSB3b3JrIChwYXRjaGluZyBvciBpbnZhbGlkYXRpbmcpLAorLy8gZmFsc2UgaWYgd2Ugd2VyZSBhIG5vb3AuICBNYXkgdXBkYXRlIGxvYWRlZF9tb2R1bGVzIGFzIHdlbGwuCisvLyBOT1RFOiB5b3UgbXVzdCBob2xkIHRoZSBwYXRjaF9hbGxfbW9kdWxlc19sb2NrIHRvIGFjY2VzcyBsb2FkZWRfbW9kdWxlcy4KK2Jvb2wgUGF0Y2hBbGxNb2R1bGVzKCkgeworICBzdGQ6OnZlY3RvcjxNb2R1bGVFbnRyeUNvcHk+IG1vZHVsZXM7CisgIGJvb2wgbWFkZV9jaGFuZ2VzID0gZmFsc2U7CisKKyAgY29uc3QgSEFORExFIGhDdXJyZW50UHJvY2VzcyA9IEdldEN1cnJlbnRQcm9jZXNzKCk7CisgIERXT1JEIG51bV9tb2R1bGVzID0gMDsKKyAgSE1PRFVMRSBoTW9kdWxlc1trTWF4TW9kdWxlc107ICAvLyBtYXggIyBvZiBtb2R1bGVzIHdlIHN1cHBvcnQgaW4gb25lIHByb2Nlc3MKKyAgaWYgKCE6OkVudW1Qcm9jZXNzTW9kdWxlcyhoQ3VycmVudFByb2Nlc3MsIGhNb2R1bGVzLCBzaXplb2YoaE1vZHVsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1fbW9kdWxlcykpIHsKKyAgICBudW1fbW9kdWxlcyA9IDA7CisgIH0KKyAgLy8gRW51bVByb2Nlc3NNb2R1bGVzIGFjdHVhbGx5IHNldCB0aGUgYnl0ZXMgd3JpdHRlbiBpbnRvIGhNb2R1bGVzLAorICAvLyBzbyB3ZSBuZWVkIHRvIGRpdmlkZSB0byBtYWtlIG51bV9tb2R1bGVzIGFjdHVhbGx5IGJlIGEgbW9kdWxlLWNvdW50LgorICBudW1fbW9kdWxlcyAvPSBzaXplb2YoKmhNb2R1bGVzKTsKKyAgaWYgKG51bV9tb2R1bGVzID49IGtNYXhNb2R1bGVzKSB7CisgICAgcHJpbnRmKCJQRVJGVE9PTFMgRVJST1I6IFRvbyBtYW55IG1vZHVsZXMgaW4gdGhpcyBleGVjdXRhYmxlIHRvIHRyeSIKKyAgICAgICAgICAgIiB0byBwYXRjaCB0aGVtIGFsbCAoaWYgeW91IG5lZWQgdG8sIHJhaXNlIGtNYXhNb2R1bGVzIGluIgorICAgICAgICAgICAiIHBhdGNoX2Z1bmN0aW9ucy5jYykuXG4iKTsKKyAgICBudW1fbW9kdWxlcyA9IGtNYXhNb2R1bGVzOworICB9CisKKyAgLy8gTm93IHdlIGhhbmRsZSB0aGUgdW5wYXRjaGluZyBvZiBtb2R1bGVzIHdlIGhhdmUgaW4gZ19tb2R1bGVfbGliY3MKKyAgLy8gYnV0IHRoYXQgd2VyZSBub3QgZm91bmQgaW4gRW51bVByb2Nlc3NNb2R1bGVzLiAgV2UgbmVlZCB0bworICAvLyBpbnZhbGlkYXRlIHRoZW0uICBUbyBzcGVlZCB0aGF0IHVwLCB3ZSBzdG9yZSB0aGUgRW51bVByb2Nlc3NNb2R1bGVzCisgIC8vIG91dHB1dCBpbiBhIHNldC4KKyAgLy8gQXQgdGhlIHNhbWUgdGltZSwgd2UgcHJlcGFyZSBmb3IgdGhlIGFkZGluZyBvZiBuZXcgbW9kdWxlcywgYnkKKyAgLy8gcmVtb3ZpbmcgZnJvbSBoTW9kdWxlcyBhbGwgdGhlIG1vZHVsZXMgd2Uga25vdyB3ZSd2ZSBhbHJlYWR5CisgIC8vIHBhdGNoZWQgKG9yIGRlY2lkZWQgZG9uJ3QgbmVlZCB0byBiZSBwYXRjaGVkKS4gIEF0IHRoZSBlbmQsCisgIC8vIGhNb2R1bGVzIHdpbGwgaG9sZCBvbmx5IHRoZSBtb2R1bGVzIHRoYXQgd2UgbmVlZCB0byBjb25zaWRlciBwYXRjaGluZy4KKyAgc3RkOjpzZXQ8SE1PRFVMRT4gY3VycmVudGx5X2xvYWRlZF9tb2R1bGVzOworICB7CisgICAgU3BpbkxvY2tIb2xkZXIgaCgmcGF0Y2hfYWxsX21vZHVsZXNfbG9jayk7CisgICAgaWYgKCFnX2xhc3RfbG9hZGVkKSAgZ19sYXN0X2xvYWRlZCA9IG5ldyBzdGQ6OnNldDxITU9EVUxFPjsKKyAgICAvLyBBdCB0aGUgZW5kIG9mIHRoaXMgbG9vcCwgY3VycmVudGx5X2xvYWRlZF9tb2R1bGVzIGNvbnRhaW5zIHRoZQorICAgIC8vIGZ1bGwgbGlzdCBvZiBFbnVtUHJvY2Vzc01vZHVsZXMsIGFuZCBoTW9kdWxlcyBqdXN0IHRoZSBvbmVzIHdlCisgICAgLy8gaGF2ZW4ndCBoYW5kbGVkIHlldC4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9tb2R1bGVzOyApIHsKKyAgICAgIGN1cnJlbnRseV9sb2FkZWRfbW9kdWxlcy5pbnNlcnQoaE1vZHVsZXNbaV0pOworICAgICAgaWYgKGdfbGFzdF9sb2FkZWQtPmNvdW50KGhNb2R1bGVzW2ldKSA+IDApIHsKKyAgICAgICAgaE1vZHVsZXNbaV0gPSBoTW9kdWxlc1stLW51bV9tb2R1bGVzXTsgIC8vIHJlcGxhY2UgZWxlbWVudCBpIHdpdGggdGFpbAorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgZWxlbWVudCBpCisgICAgICB9CisgICAgfQorICAgIC8vIE5vdyB3ZSBkbyB0aGUgdW5wYXRjaGluZy9pbnZhbGlkYXRpb24uCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YoZ19tb2R1bGVfbGliY3MpL3NpemVvZigqZ19tb2R1bGVfbGliY3MpOyBpKyspIHsKKyAgICAgIGlmIChnX21vZHVsZV9saWJjc1tpXS0+cGF0Y2hlZCgpICYmCisgICAgICAgICAgY3VycmVudGx5X2xvYWRlZF9tb2R1bGVzLmNvdW50KGdfbW9kdWxlX2xpYmNzW2ldLT5obW9kdWxlKCkpID09IDApIHsKKyAgICAgICAgLy8gTWVhbnMgZ19tb2R1bGVfbGliY3NbaV0gaXMgbm8gbG9uZ2VyIGxvYWRlZCAobm8gbWUzMiBtYXRjaGVkKS4KKyAgICAgICAgLy8gV2UgY291bGQgY2FsbCBVbnBhdGNoKCkgaGVyZSwgYnV0IHdoeSBib3RoZXI/ICBUaGUgbW9kdWxlCisgICAgICAgIC8vIGhhcyBnb25lIGF3YXksIHNvIG5vYm9keSBpcyBnb2luZyB0byBjYWxsIGludG8gaXQgYW55d2F5LgorICAgICAgICBnX21vZHVsZV9saWJjc1tpXS0+c2V0X2lzX3ZhbGlkKGZhbHNlKTsKKyAgICAgICAgbWFkZV9jaGFuZ2VzID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gVXBkYXRlIHRoZSBsb2FkZWQgbW9kdWxlIGNhY2hlLgorICAgIGdfbGFzdF9sb2FkZWQtPnN3YXAoY3VycmVudGx5X2xvYWRlZF9tb2R1bGVzKTsKKyAgfQorCisgIC8vIE5vdyB0aGF0IHdlIGtub3cgd2hhdCBtb2R1bGVzIGFyZSBuZXcsIGxldCdzIGdldCB0aGUgaW5mbyB3ZSdsbAorICAvLyBuZWVkIHRvIHBhdGNoIHRoZW0uICBOb3RlIHRoaXMgKmNhbm5vdCogYmUgZG9uZSB3aGlsZSBob2xkaW5nIHRoZQorICAvLyBsb2NrLCBzaW5jZSBpdCBuZWVkcyB0byBtYWtlIHdpbmRvd3MgY2FsbHMgKHNlZSB0aGUgbG9jay1pbnZlcnNpb24KKyAgLy8gY29tbWVudHMgYmVmb3JlIHRoZSBkZWZpbml0aW9uIG9mIHBhdGNoX2FsbF9tb2R1bGVzX2xvY2spLgorICBNT0RVTEVJTkZPIG1pOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9tb2R1bGVzOyBpKyspIHsKKyAgICBpZiAoOjpHZXRNb2R1bGVJbmZvcm1hdGlvbihoQ3VycmVudFByb2Nlc3MsIGhNb2R1bGVzW2ldLCAmbWksIHNpemVvZihtaSkpKQorICAgICAgbW9kdWxlcy5wdXNoX2JhY2soTW9kdWxlRW50cnlDb3B5KG1pKSk7CisgIH0KKworICAvLyBOb3cgd2UgY2FuIGRvIHRoZSBwYXRjaGluZyBvZiBuZXcgbW9kdWxlcy4KKyAgeworICAgIFNwaW5Mb2NrSG9sZGVyIGgoJnBhdGNoX2FsbF9tb2R1bGVzX2xvY2spOworICAgIGZvciAoc3RkOjp2ZWN0b3I8TW9kdWxlRW50cnlDb3B5Pjo6aXRlcmF0b3IgaXQgPSBtb2R1bGVzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtb2R1bGVzLmVuZCgpOyArK2l0KSB7CisgICAgICBMaWJjSW5mbyBsaWJjX2luZm87CisgICAgICBpZiAobGliY19pbmZvLlBvcHVsYXRlV2luZG93c0ZuKCppdCkpIHsgLy8gdHJ1ZT09bW9kdWxlIGhhcyBsaWJjIHJvdXRpbmVzCisgICAgICAgIFBhdGNoT25lTW9kdWxlTG9ja2VkKGxpYmNfaW5mbyk7CisgICAgICAgIG1hZGVfY2hhbmdlcyA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gTm93IHRoYXQgd2UndmUgZGVhbHQgd2l0aCB0aGUgbW9kdWxlcyAoZGxscyksIHVwZGF0ZSB0aGUgbWFpbgorICAgIC8vIGV4ZWN1dGFibGUuICBXZSBkbyB0aGlzIGxhc3QgYmVjYXVzZSBQYXRjaE1haW5FeGVjdXRhYmxlTG9ja2VkCisgICAgLy8gd2FudHMgdG8gbG9vayBhdCBob3cgb3RoZXIgbW9kdWxlcyB3ZXJlIHBhdGNoZWQuCisgICAgaWYgKCFtYWluX2V4ZWN1dGFibGUucGF0Y2hlZCgpKSB7CisgICAgICBQYXRjaE1haW5FeGVjdXRhYmxlTG9ja2VkKCk7CisgICAgICBtYWRlX2NoYW5nZXMgPSB0cnVlOworICAgIH0KKyAgfQorICAvLyBUT0RPKGNzaWx2ZXJzKTogZm9yIHRoaXMgdG8gYmUgcmVsaWFibGUsIHdlIG5lZWQgdG8gYWxzbyB0YWtlCisgIC8vIGludG8gYWNjb3VudCBpZiB3ZSAqd291bGQqIGhhdmUgcGF0Y2hlZCBhbnkgbW9kdWxlcyBoYWQgdGhleSBub3QKKyAgLy8gYWxyZWFkeSBiZWVuIGxvYWRlZC4gIChUaGF0IGlzLCBtYWRlX2NoYW5nZXMgc2hvdWxkIGlnbm9yZQorICAvLyBnX2xhc3RfbG9hZGVkLikKKyAgcmV0dXJuIG1hZGVfY2hhbmdlczsKK30KKworCit9ICAvLyBlbmQgdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb3cgdGhhdCB3ZSd2ZSBkb25lIGFsbCB0aGUgcGF0Y2hpbmcgbWFjaGluZXJ5LCBsZXQncyBhY3R1YWxseQorLy8gZGVmaW5lIHRoZSBmdW5jdGlvbnMgd2UncmUgcGF0Y2hpbmcgaW4uICBNb3N0bHkgdGhlc2UgYXJlCisvLyBzaW1wbGUgd3JhcHBlcnMgYXJvdW5kIHRoZSBkb18qIHJvdXRpbmVzIGluIHRjbWFsbG9jLmNjLgorLy8KKy8vIEluIGZhY3QsIHdlICNpbmNsdWRlIHRjbWFsbG9jLmNjIHRvIGdldCBhdCB0aGUgdGNtYWxsb2MgaW50ZXJuYWwKKy8vIGRvXyogZnVuY3Rpb25zLCB0aGUgYmV0dGVyIHRvIHdyaXRlIG91ciBvd24gaG9vayBmdW5jdGlvbnMuCisvLyBVLUctTC1ZLCBJIGtub3cuICBCdXQgdGhlIGFsdGVybmF0aXZlcyBhcmUsIHBlcmhhcHMsIHdvcnNlLiAgVGhpcworLy8gYWxzbyBsZXRzIHVzIGRlZmluZSBfbXNpemUoKSwgX2V4cGFuZCgpLCBhbmQgb3RoZXIgd2luZG93cy1zcGVjaWZpYworLy8gZnVuY3Rpb25zIGhlcmUsIHVzaW5nIHRjbWFsbG9jIGludGVybmFscywgd2l0aG91dCBwb2xsdXRpbmcKKy8vIHRjbWFsbG9jLmNjLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUT0RPKGNzaWx2ZXJzKTogcmVmYWN0b3IgdGNtYWxsb2MuY2MgaW50byB0d28gZmlsZXMsIHNvIEkgY2FuIGxpbmsKKy8vIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBkb19tYWxsb2MsIGFuZCBpZ25vcmUgdGhlIG9uZSB3aXRoIG1hbGxvYy4KKyNpbmNsdWRlICJ0Y21hbGxvYy5jYyIKKwordGVtcGxhdGU8aW50IFQ+Cit2b2lkKiBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczxUPjo6UGVyZnRvb2xzX21hbGxvYyhzaXplX3Qgc2l6ZSkgX19USFJPVyB7CisgIHZvaWQqIHJlc3VsdCA9IGRvX21hbGxvY19vcl9jcHBfYWxsb2Moc2l6ZSk7CisgIE1hbGxvY0hvb2s6Okludm9rZU5ld0hvb2socmVzdWx0LCBzaXplKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGU8aW50IFQ+Cit2b2lkIExpYmNJbmZvV2l0aFBhdGNoRnVuY3Rpb25zPFQ+OjpQZXJmdG9vbHNfZnJlZSh2b2lkKiBwdHIpIF9fVEhST1cgeworICBNYWxsb2NIb29rOjpJbnZva2VEZWxldGVIb29rKHB0cik7CisgIC8vIFRoaXMgY2FsbHMgdGhlIHdpbmRvd3MgZnJlZSBpZiBkb19mcmVlIGRlY2lkZXMgcHRyIHdhcyBub3QKKyAgLy8gYWxsb2NhdGVkIGJ5IHRjbWFsbG9jLiAgTm90ZSBpdCBjYWxscyB0aGUgb3JpZ3N0dWJfZnJlZSBmcm9tCisgIC8vICp0aGlzKiB0ZW1wbGF0aXplZCBpbnN0YW5jZSBvZiBMaWJjSW5mby4gIFNlZSAidGVtcGxhdGUKKyAgLy8gdHJpY2tpbmVzcyIgYWJvdmUuCisgIGRvX2ZyZWVfd2l0aF9jYWxsYmFjayhwdHIsICh2b2lkICgqKSh2b2lkKikpb3JpZ3N0dWJfZm5fW2tGcmVlXSk7Cit9CisKK3RlbXBsYXRlPGludCBUPgordm9pZCogTGliY0luZm9XaXRoUGF0Y2hGdW5jdGlvbnM8VD46OlBlcmZ0b29sc19yZWFsbG9jKAorICAgIHZvaWQqIG9sZF9wdHIsIHNpemVfdCBuZXdfc2l6ZSkgX19USFJPVyB7CisgIGlmIChvbGRfcHRyID09IE5VTEwpIHsKKyAgICB2b2lkKiByZXN1bHQgPSBkb19tYWxsb2Nfb3JfY3BwX2FsbG9jKG5ld19zaXplKTsKKyAgICBNYWxsb2NIb29rOjpJbnZva2VOZXdIb29rKHJlc3VsdCwgbmV3X3NpemUpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgaWYgKG5ld19zaXplID09IDApIHsKKyAgICBNYWxsb2NIb29rOjpJbnZva2VEZWxldGVIb29rKG9sZF9wdHIpOworICAgIGRvX2ZyZWVfd2l0aF9jYWxsYmFjayhvbGRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAoKikodm9pZCopKW9yaWdzdHViX2ZuX1trRnJlZV0pOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBkb19yZWFsbG9jX3dpdGhfY2FsbGJhY2soCisgICAgICBvbGRfcHRyLCBuZXdfc2l6ZSwKKyAgICAgICh2b2lkICgqKSh2b2lkKikpb3JpZ3N0dWJfZm5fW2tGcmVlXSwKKyAgICAgIChzaXplX3QgKCopKGNvbnN0IHZvaWQqKSlvcmlnc3R1Yl9mbl9ba19Nc2l6ZV0pOworfQorCit0ZW1wbGF0ZTxpbnQgVD4KK3ZvaWQqIExpYmNJbmZvV2l0aFBhdGNoRnVuY3Rpb25zPFQ+OjpQZXJmdG9vbHNfY2FsbG9jKAorICAgIHNpemVfdCBuLCBzaXplX3QgZWxlbV9zaXplKSBfX1RIUk9XIHsKKyAgdm9pZCogcmVzdWx0ID0gZG9fY2FsbG9jKG4sIGVsZW1fc2l6ZSk7CisgIE1hbGxvY0hvb2s6Okludm9rZU5ld0hvb2socmVzdWx0LCBuICogZWxlbV9zaXplKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGU8aW50IFQ+Cit2b2lkKiBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczxUPjo6UGVyZnRvb2xzX25ldyhzaXplX3Qgc2l6ZSkgeworICB2b2lkKiBwID0gY3BwX2FsbG9jKHNpemUsIGZhbHNlKTsKKyAgTWFsbG9jSG9vazo6SW52b2tlTmV3SG9vayhwLCBzaXplKTsKKyAgcmV0dXJuIHA7Cit9CisKK3RlbXBsYXRlPGludCBUPgordm9pZCogTGliY0luZm9XaXRoUGF0Y2hGdW5jdGlvbnM8VD46OlBlcmZ0b29sc19uZXdhcnJheShzaXplX3Qgc2l6ZSkgeworICB2b2lkKiBwID0gY3BwX2FsbG9jKHNpemUsIGZhbHNlKTsKKyAgTWFsbG9jSG9vazo6SW52b2tlTmV3SG9vayhwLCBzaXplKTsKKyAgcmV0dXJuIHA7Cit9CisKK3RlbXBsYXRlPGludCBUPgordm9pZCBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczxUPjo6UGVyZnRvb2xzX2RlbGV0ZSh2b2lkICpwKSB7CisgIE1hbGxvY0hvb2s6Okludm9rZURlbGV0ZUhvb2socCk7CisgIGRvX2ZyZWVfd2l0aF9jYWxsYmFjayhwLCAodm9pZCAoKikodm9pZCopKW9yaWdzdHViX2ZuX1trRnJlZV0pOworfQorCit0ZW1wbGF0ZTxpbnQgVD4KK3ZvaWQgTGliY0luZm9XaXRoUGF0Y2hGdW5jdGlvbnM8VD46OlBlcmZ0b29sc19kZWxldGVhcnJheSh2b2lkICpwKSB7CisgIE1hbGxvY0hvb2s6Okludm9rZURlbGV0ZUhvb2socCk7CisgIGRvX2ZyZWVfd2l0aF9jYWxsYmFjayhwLCAodm9pZCAoKikodm9pZCopKW9yaWdzdHViX2ZuX1trRnJlZV0pOworfQorCit0ZW1wbGF0ZTxpbnQgVD4KK3ZvaWQqIExpYmNJbmZvV2l0aFBhdGNoRnVuY3Rpb25zPFQ+OjpQZXJmdG9vbHNfbmV3X25vdGhyb3coCisgICAgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgX19USFJPVyB7CisgIHZvaWQqIHAgPSBjcHBfYWxsb2Moc2l6ZSwgdHJ1ZSk7CisgIE1hbGxvY0hvb2s6Okludm9rZU5ld0hvb2socCwgc2l6ZSk7CisgIHJldHVybiBwOworfQorCit0ZW1wbGF0ZTxpbnQgVD4KK3ZvaWQqIExpYmNJbmZvV2l0aFBhdGNoRnVuY3Rpb25zPFQ+OjpQZXJmdG9vbHNfbmV3YXJyYXlfbm90aHJvdygKKyAgICBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfX1RIUk9XIHsKKyAgdm9pZCogcCA9IGNwcF9hbGxvYyhzaXplLCB0cnVlKTsKKyAgTWFsbG9jSG9vazo6SW52b2tlTmV3SG9vayhwLCBzaXplKTsKKyAgcmV0dXJuIHA7Cit9CisKK3RlbXBsYXRlPGludCBUPgordm9pZCBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczxUPjo6UGVyZnRvb2xzX2RlbGV0ZV9ub3Rocm93KAorICAgIHZvaWQgKnAsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgX19USFJPVyB7CisgIE1hbGxvY0hvb2s6Okludm9rZURlbGV0ZUhvb2socCk7CisgIGRvX2ZyZWVfd2l0aF9jYWxsYmFjayhwLCAodm9pZCAoKikodm9pZCopKW9yaWdzdHViX2ZuX1trRnJlZV0pOworfQorCit0ZW1wbGF0ZTxpbnQgVD4KK3ZvaWQgTGliY0luZm9XaXRoUGF0Y2hGdW5jdGlvbnM8VD46OlBlcmZ0b29sc19kZWxldGVhcnJheV9ub3Rocm93KAorICAgIHZvaWQgKnAsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgX19USFJPVyB7CisgIE1hbGxvY0hvb2s6Okludm9rZURlbGV0ZUhvb2socCk7CisgIGRvX2ZyZWVfd2l0aF9jYWxsYmFjayhwLCAodm9pZCAoKikodm9pZCopKW9yaWdzdHViX2ZuX1trRnJlZV0pOworfQorCisKKy8vIF9tc2l6ZSgpIGxldHMgeW91IGZpZ3VyZSBvdXQgaG93IG11Y2ggc3BhY2UgaXMgcmVzZXJ2ZWQgZm9yIGEKKy8vIHBvaW50ZXIsIGluIFdpbmRvd3MuICBFdmVuIGlmIGFwcGxpY2F0aW9ucyBkb24ndCBjYWxsIGl0LCBhbnkgRExMCisvLyB3aXRoIGdsb2JhbCBjb25zdHJ1Y3RvcnMgd2lsbCBjYWxsICh0cmFuc2l0aXZlbHkpIHNvbWV0aGluZyBjYWxsZWQKKy8vIF9fZGxsb25leGl0X2xrIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGUgZGVzdHJ1Y3RvcnMgZ2V0IGNhbGxlZAorLy8gd2hlbiB0aGUgZGxsIHVubG9hZHMuICBBbmQgdGhhdCB3aWxsIGNhbGwgbXNpemUgLS0gaG9ycmlibGUgdGhpbmdzCisvLyBjYW4gZW5zdWUgaWYgdGhpcyBpcyBub3QgaG9va2VkLiAgT3RoZXIgcGFydHMgb2YgbGliYyBtYXkgYWxzbyBjYWxsCisvLyB0aGlzIGludGVybmFsbHkuCisKK3RlbXBsYXRlPGludCBUPgorc2l6ZV90IExpYmNJbmZvV2l0aFBhdGNoRnVuY3Rpb25zPFQ+OjpQZXJmdG9vbHNfX21zaXplKHZvaWQqIHB0cikgX19USFJPVyB7CisgIHJldHVybiBHZXRTaXplV2l0aENhbGxiYWNrKHB0ciwgKHNpemVfdCAoKikoY29uc3Qgdm9pZCopKW9yaWdzdHViX2ZuX1trX01zaXplXSk7Cit9CisKKy8vIFdlIG5lZWQgdG8gZGVmaW5lIHRoaXMgYmVjYXVzZSBpbnRlcm5hbCB3aW5kb3dzIGZ1bmN0aW9ucyBsaWtlIHRvCisvLyBjYWxsIGludG8gaXQoPykuICBfZXhwYW5kKCkgaXMgbGlrZSByZWFsbG9jIGJ1dCBkb2Vzbid0IG1vdmUgdGhlCisvLyBwb2ludGVyLiAgV2UgcHVudCwgd2hpY2ggd2lsbCBjYXVzZSBjYWxsZXJzIHRvIGZhbGwgYmFjayBvbiByZWFsbG9jLgordGVtcGxhdGU8aW50IFQ+Cit2b2lkKiBMaWJjSW5mb1dpdGhQYXRjaEZ1bmN0aW9uczxUPjo6UGVyZnRvb2xzX19leHBhbmQodm9pZCAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSBfX1RIUk9XIHsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK0xQVk9JRCBXSU5BUEkgV2luZG93c0luZm86OlBlcmZ0b29sc19IZWFwQWxsb2MoSEFORExFIGhIZWFwLCBEV09SRCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRF9QVFIgZHdCeXRlcykgeworICBMUFZPSUQgcmVzdWx0ID0gKChMUFZPSUQgKFdJTkFQSSAqKShIQU5ETEUsIERXT1JELCBEV09SRF9QVFIpKQorICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX2luZm9fW2tIZWFwQWxsb2NdLm9yaWdzdHViX2ZuKSgKKyAgICAgICAgICAgICAgICAgICAgICAgaEhlYXAsIGR3RmxhZ3MsIGR3Qnl0ZXMpOworICBNYWxsb2NIb29rOjpJbnZva2VOZXdIb29rKHJlc3VsdCwgZHdCeXRlcyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0JPT0wgV0lOQVBJIFdpbmRvd3NJbmZvOjpQZXJmdG9vbHNfSGVhcEZyZWUoSEFORExFIGhIZWFwLCBEV09SRCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBNZW0pIHsKKyAgTWFsbG9jSG9vazo6SW52b2tlRGVsZXRlSG9vayhscE1lbSk7CisgIHJldHVybiAoKEJPT0wgKFdJTkFQSSAqKShIQU5ETEUsIERXT1JELCBMUFZPSUQpKQorICAgICAgICAgIGZ1bmN0aW9uX2luZm9fW2tIZWFwRnJlZV0ub3JpZ3N0dWJfZm4pKAorICAgICAgICAgICAgICBoSGVhcCwgZHdGbGFncywgbHBNZW0pOworfQorCitMUFZPSUQgV0lOQVBJIFdpbmRvd3NJbmZvOjpQZXJmdG9vbHNfVmlydHVhbEFsbG9jRXgoSEFORExFIHByb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRV9UIHNpemUsIERXT1JEIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgcHJvdGVjdCkgeworICBMUFZPSUQgcmVzdWx0ID0gKChMUFZPSUQgKFdJTkFQSSAqKShIQU5ETEUsIExQVk9JRCwgU0laRV9ULCBEV09SRCwgRFdPUkQpKQorICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX2luZm9fW2tWaXJ0dWFsQWxsb2NFeF0ub3JpZ3N0dWJfZm4pKAorICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLCBhZGRyZXNzLCBzaXplLCB0eXBlLCBwcm90ZWN0KTsKKyAgLy8gVmlydHVhbEFsbG9jRXgoKSBzZWVtcyB0byBiZSB0aGUgV2luZG93cyBlcXVpdmFsZW50IG9mIG1tYXAoKQorICBNYWxsb2NIb29rOjpJbnZva2VNbWFwSG9vayhyZXN1bHQsIGFkZHJlc3MsIHNpemUsIHByb3RlY3QsIHR5cGUsIC0xLCAwKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworQk9PTCBXSU5BUEkgV2luZG93c0luZm86OlBlcmZ0b29sc19WaXJ0dWFsRnJlZUV4KEhBTkRMRSBwcm9jZXNzLCBMUFZPSUQgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFX1Qgc2l6ZSwgRFdPUkQgdHlwZSkgeworICBNYWxsb2NIb29rOjpJbnZva2VNdW5tYXBIb29rKGFkZHJlc3MsIHNpemUpOworICByZXR1cm4gKChCT09MIChXSU5BUEkgKikoSEFORExFLCBMUFZPSUQsIFNJWkVfVCwgRFdPUkQpKQorICAgICAgICAgIGZ1bmN0aW9uX2luZm9fW2tWaXJ0dWFsRnJlZUV4XS5vcmlnc3R1Yl9mbikoCisgICAgICAgICAgICAgIHByb2Nlc3MsIGFkZHJlc3MsIHNpemUsIHR5cGUpOworfQorCitMUFZPSUQgV0lOQVBJIFdpbmRvd3NJbmZvOjpQZXJmdG9vbHNfTWFwVmlld09mRmlsZUV4KAorICAgIEhBTkRMRSBoRmlsZU1hcHBpbmdPYmplY3QsIERXT1JEIGR3RGVzaXJlZEFjY2VzcywgRFdPUkQgZHdGaWxlT2Zmc2V0SGlnaCwKKyAgICBEV09SRCBkd0ZpbGVPZmZzZXRMb3csIFNJWkVfVCBkd051bWJlck9mQnl0ZXNUb01hcCwgTFBWT0lEIGxwQmFzZUFkZHJlc3MpIHsKKyAgLy8gRm9yIHRoaXMgZnVuY3Rpb24gcGFpciwgeW91IGFsd2F5cyBkZWFsbG9jYXRlIHRoZSBmdWxsIGJsb2NrIG9mCisgIC8vIGRhdGEgdGhhdCB5b3UgYWxsb2NhdGUsIHNvIE5ld0hvb2svRGVsZXRlSG9vayBpcyB0aGUgcmlnaHQgQVBJLgorICBMUFZPSUQgcmVzdWx0ID0gKChMUFZPSUQgKFdJTkFQSSAqKShIQU5ETEUsIERXT1JELCBEV09SRCwgRFdPUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVfVCwgTFBWT0lEKSkKKyAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9pbmZvX1trTWFwVmlld09mRmlsZUV4XS5vcmlnc3R1Yl9mbikoCisgICAgICAgICAgICAgICAgICAgICAgIGhGaWxlTWFwcGluZ09iamVjdCwgZHdEZXNpcmVkQWNjZXNzLCBkd0ZpbGVPZmZzZXRIaWdoLAorICAgICAgICAgICAgICAgICAgICAgICBkd0ZpbGVPZmZzZXRMb3csIGR3TnVtYmVyT2ZCeXRlc1RvTWFwLCBscEJhc2VBZGRyZXNzKTsKKyAgTWFsbG9jSG9vazo6SW52b2tlTmV3SG9vayhyZXN1bHQsIGR3TnVtYmVyT2ZCeXRlc1RvTWFwKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworQk9PTCBXSU5BUEkgV2luZG93c0luZm86OlBlcmZ0b29sc19Vbm1hcFZpZXdPZkZpbGUoTFBDVk9JRCBscEJhc2VBZGRyZXNzKSB7CisgIE1hbGxvY0hvb2s6Okludm9rZURlbGV0ZUhvb2sobHBCYXNlQWRkcmVzcyk7CisgIHJldHVybiAoKEJPT0wgKFdJTkFQSSAqKShMUENWT0lEKSkKKyAgICAgICAgICBmdW5jdGlvbl9pbmZvX1trVW5tYXBWaWV3T2ZGaWxlXS5vcmlnc3R1Yl9mbikoCisgICAgICAgICAgICAgIGxwQmFzZUFkZHJlc3MpOworfQorCisvLyBnX2xvYWRfbWFwIGhvbGRzIGEgY29weSBvZiB3aW5kb3dzJyByZWZjb3VudCBmb3IgaG93IG1hbnkgdGltZXMKKy8vIGVhY2ggY3VycmVudGx5IGxvYWRlZCBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkIGFuZCB1bmxvYWRlZC4gIFdlIHVzZQorLy8gaXQgYXMgYW4gb3B0aW1pemF0aW9uIHdoZW4gdGhlIHNhbWUgbW9kdWxlIGlzIGxvYWRlZCBtb3JlIHRoYW4KKy8vIG9uY2U6IGFzIGxvbmcgYXMgdGhlIHJlZmNvdW50IHN0YXlzIGFib3ZlIDEsIHdlIGRvbid0IG5lZWQgdG8gd29ycnkKKy8vIGFib3V0IHBhdGNoaW5nIGJlY2F1c2UgaXQncyBhbHJlYWR5IHBhdGNoZWQuICBMaWtld2lzZSwgd2UgZG9uJ3QKKy8vIG5lZWQgdG8gdW5wYXRjaCB1bnRpbCB0aGUgcmVmY291bnQgZHJvcHMgdG8gMC4gIGxvYWRfbWFwIGlzCisvLyBtYWludGFpbmVkIGluIExvYWRMaWJyYXJ5RXhXIGFuZCBGcmVlTGlicmFyeSwgYW5kIG9ubHkgY292ZXJzCisvLyBtb2R1bGVzIGV4cGxpY2l0bHkgbG9hZGVkL2ZyZWVkIHZpYSB0aG9zZSBpbnRlcmZhY2VzLgorc3RhdGljIHN0ZDo6bWFwPEhNT0RVTEUsIGludD4qIGdfbG9hZF9tYXAgPSBOVUxMOworCitITU9EVUxFIFdJTkFQSSBXaW5kb3dzSW5mbzo6UGVyZnRvb2xzX0xvYWRMaWJyYXJ5RXhXKExQQ1dTVFIgbHBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFIGhGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKSB7CisgIEhNT0RVTEUgcnY7CisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbW9kdWxlcyBpcyBhbHJlYWR5IGxvYWRlZCwgZmxhZyAwIGdldHMgYQorICAvLyByZWZlcmVuY2UgaWYgaXQgd2FzIGxvYWRlZC4gIElmIGl0IHdhcyBsb2FkZWQgbm8gbmVlZCB0byBjYWxsCisgIC8vIFBhdGNoQWxsTW9kdWxlcywganVzdCBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IHRvIG1hdGNoCisgIC8vIHdoYXQgR2V0TW9kdWxlSGFuZGxlRXhXIGRvZXMgaW50ZXJuYWxseSBpbnNpZGUgd2luZG93cy4KKyAgaWYgKDo6R2V0TW9kdWxlSGFuZGxlRXhXKDAsIGxwRmlsZU5hbWUsICZydikpIHsKKyAgICByZXR1cm4gcnY7CisgIH0gZWxzZSB7CisgICAgLy8gTm90IGFscmVhZHkgbG9hZGVkLCBzbyBsb2FkIGl0LgorICAgIHJ2ID0gKChITU9EVUxFIChXSU5BUEkgKikoTFBDV1NUUiwgSEFORExFLCBEV09SRCkpCisgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9pbmZvX1trTG9hZExpYnJhcnlFeFddLm9yaWdzdHViX2ZuKSgKKyAgICAgICAgICAgICAgICAgICAgICBscEZpbGVOYW1lLCBoRmlsZSwgZHdGbGFncyk7CisgICAgLy8gVGhpcyB3aWxsIHBhdGNoIGFueSBuZXdseSBsb2FkZWQgbGlicmFyaWVzLCBpZiBwYXRjaGluZyBuZWVkcworICAgIC8vIHRvIGJlIGRvbmUuCisgICAgUGF0Y2hBbGxNb2R1bGVzKCk7CisKKyAgICByZXR1cm4gcnY7CisgIH0KK30KKworQk9PTCBXSU5BUEkgV2luZG93c0luZm86OlBlcmZ0b29sc19GcmVlTGlicmFyeShITU9EVUxFIGhMaWJNb2R1bGUpIHsKKyAgQk9PTCBydiA9ICgoQk9PTCAoV0lOQVBJICopKEhNT0RVTEUpKQorICAgICAgICAgICAgIGZ1bmN0aW9uX2luZm9fW2tGcmVlTGlicmFyeV0ub3JpZ3N0dWJfZm4pKGhMaWJNb2R1bGUpOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbW9kdWxlIGlzIHN0aWxsIGxvYWRlZCBieSBwYXNzaW5nIHRoZSBiYXNlCisgIC8vIGFkZHJlc3MgYW5kIHNlZWluZyBpZiBpdCBjb21lcyBiYWNrIHdpdGggdGhlIHNhbWUgYWRkcmVzcy4gIElmIGl0CisgIC8vIGlzIHRoZSBzYW1lIGFkZHJlc3MgaXQncyBzdGlsbCBsb2FkZWQsIHNvIHRoZSBGcmVlTGlicmFyeSgpIGNhbGwKKyAgLy8gd2FzIGEgbm9vcCwgYW5kIHRoZXJlJ3Mgbm8gbmVlZCB0byByZWRvIHRoZSBwYXRjaGluZy4KKyAgSE1PRFVMRSBvd25lciA9IE5VTEw7CisgIEJPT0wgcmVzdWx0ID0gOjpHZXRNb2R1bGVIYW5kbGVFeFcoCisgICAgICAoR0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19GUk9NX0FERFJFU1MgfAorICAgICAgIEdFVF9NT0RVTEVfSEFORExFX0VYX0ZMQUdfVU5DSEFOR0VEX1JFRkNPVU5UKSwKKyAgICAgIChMUENXU1RSKWhMaWJNb2R1bGUsCisgICAgICAmb3duZXIpOworICBpZiAocmVzdWx0ICYmIG93bmVyID09IGhMaWJNb2R1bGUpCisgICAgcmV0dXJuIHJ2OworCisgIFBhdGNoQWxsTW9kdWxlcygpOyAgICAvLyB0aGlzIHdpbGwgZml4IHVwIHRoZSBsaXN0IG9mIHBhdGNoZWQgbGlicmFyaWVzCisgIHJldHVybiBydjsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhdGNoV2luZG93c0Z1bmN0aW9ucygpCisvLyAgICBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGV4cG9zZWQgdG8gdGhlIG91dHNpZGUgd29ybGQuCisvLyAgICBJdCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGUgcHJvZ3JhbSBiZWNvbWVzIG11bHRpLXRocmVhZGVkLAorLy8gICAgc2luY2UgbWFpbl9leGVjdXRhYmxlX3dpbmRvd3MuUGF0Y2goKSBpcyBub3QgdGhyZWFkLXNhZmUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBQYXRjaFdpbmRvd3NGdW5jdGlvbnMoKSB7CisgIC8vIFRoaXMgZG9lcyB0aGUgbGliYyBwYXRjaGluZyBpbiBldmVyeSBtb2R1bGUsIGFuZCB0aGUgbWFpbiBleGVjdXRhYmxlLgorICBQYXRjaEFsbE1vZHVsZXMoKTsKKyAgbWFpbl9leGVjdXRhYmxlX3dpbmRvd3MuUGF0Y2goKTsKK30KKworI2lmIDAKKy8vIEl0J3MgcG9zc2libGUgdG8gdW5wYXRjaCBhbGwgdGhlIGZ1bmN0aW9ucyB3aGVuIHdlIGFyZSBleGl0aW5nLgorCisvLyBUaGUgaWRlYSBpcyB0byBoYW5kbGUgcHJvcGVybHkgd2luZG93cy1pbnRlcm5hbCBkYXRhIHRoYXQgaXMKKy8vIGFsbG9jYXRlZCBiZWZvcmUgUGF0Y2hXaW5kb3dzRnVuY3Rpb25zIGlzIGNhbGxlZC4gIElmIGFsbAorLy8gZGVzdHJ1Y3Rpb24gaGFwcGVuZWQgaW4gcmV2ZXJzZSBvcmRlciBmcm9tIGNvbnN0cnVjdGlvbiwgdGhlbiB3ZQorLy8gY291bGQgY2FsbCBVbnBhdGNoV2luZG93c0Z1bmN0aW9ucyBhdCBqdXN0IHRoZSByaWdodCB0aW1lLCBzbyB0aGF0CisvLyB0aGF0IGVhcmx5LWFsbG9jYXRlZCBkYXRhIHdvdWxkIGJlIGZyZWVkIHVzaW5nIHRoZSB3aW5kb3dzCisvLyBhbGxvY2F0aW9uIGZ1bmN0aW9ucyByYXRoZXIgdGhhbiB0Y21hbGxvYy4gIFRoZSBwcm9ibGVtIGlzIHRoYXQKKy8vIHdpbmRvd3MgYWxsb2NhdGVzIHNvbWUgc3RydWN0dXJlcyBsYXppbHksIHNvIGl0IHdvdWxkIGFsbG9jYXRlIHRoZW0KKy8vIGxhdGUgKHVzaW5nIHRjbWFsbG9jKSBhbmQgdGhlbiB0cnkgdG8gZGVhbGxvY2F0ZSB0aGVtIGxhdGUgYXMgd2VsbC4KKy8vIFNvIGluc3RlYWQgb2YgdW5wYXRjaGluZywgd2UganVzdCBtb2RpZnkgYWxsIHRoZSB0Y21hbGxvYyByb3V0aW5lcworLy8gc28gdGhleSBjYWxsIHRocm91Z2ggdG8gdGhlIGxpYmMgcm91bnRpbmVzIGlmIHRoZSBtZW1vcnkgaW4KKy8vIHF1ZXN0aW9uIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggdGNtYWxsb2MuICBJIGtlZXAKKy8vIHRoaXMgdW5wYXRjaCBjb2RlIGFyb3VuZCBmb3IgcmVmZXJlbmNlLgorCit2b2lkIFVucGF0Y2hXaW5kb3dzRnVuY3Rpb25zKCkgeworICAvLyBXZSBuZWVkIHRvIGdvIGJhY2sgdG8gdGhlIHN5c3RlbSBtYWxsb2MvZXRjIGF0IGdsb2JhbCBkZXN0cnVjdCB0aW1lLAorICAvLyBzbyBvYmplY3RzIHRoYXQgd2VyZSBjb25zdHJ1Y3RlZCBiZWZvcmUgdGNtYWxsb2MsIHVzaW5nIHRoZSBzeXN0ZW0KKyAgLy8gbWFsbG9jLCBjYW4gZGVzdHJveSB0aGVtc2VsdmVzIHVzaW5nIHRoZSBzeXN0ZW0gZnJlZS4gIFRoaXMgZGVwZW5kcworICAvLyBvbiBETExzIHVubG9hZGluZyBpbiB0aGUgcmV2ZXJzZSBvcmRlciBpbiB3aGljaCB0aGV5IGxvYWQhCisgIC8vCisgIC8vIFdlIGFsc28gZ28gYmFjayB0byB0aGUgZGVmYXVsdCBIZWFwQWxsb2MvZXRjLCBqdXN0IGZvciBjb25zaXN0ZW5jeS4KKyAgLy8gV2hvIGtub3dzLCBpdCBtYXkgaGVscCBhdm9pZCB3ZWlyZCBidWdzIGluIHNvbWUgc2l0dWF0aW9ucy4KKyAgbWFpbl9leGVjdXRhYmxlX3dpbmRvd3MuVW5wYXRjaCgpOworICBtYWluX2V4ZWN1dGFibGUuVW5wYXRjaCgpOworICBpZiAobGliYzEuaXNfdmFsaWQoKSkgbGliYzEuVW5wYXRjaCgpOworICBpZiAobGliYzIuaXNfdmFsaWQoKSkgbGliYzIuVW5wYXRjaCgpOworICBpZiAobGliYzMuaXNfdmFsaWQoKSkgbGliYzMuVW5wYXRjaCgpOworICBpZiAobGliYzQuaXNfdmFsaWQoKSkgbGliYzQuVW5wYXRjaCgpOworICBpZiAobGliYzUuaXNfdmFsaWQoKSkgbGliYzUuVW5wYXRjaCgpOworICBpZiAobGliYzYuaXNfdmFsaWQoKSkgbGliYzYuVW5wYXRjaCgpOworICBpZiAobGliYzcuaXNfdmFsaWQoKSkgbGliYzcuVW5wYXRjaCgpOworICBpZiAobGliYzguaXNfdmFsaWQoKSkgbGliYzguVW5wYXRjaCgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvd2luZG93cy9wb3J0LmNjIGIvc3JjL3dpbmRvd3MvcG9ydC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjIyNGEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3MvcG9ydC5jYwpAQCAtMCwwICsxLDIzNSBAQAorLy8gLSotIE1vZGU6IEMrKzsgYy1iYXNpYy1vZmZzZXQ6IDI7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKy8qIENvcHlyaWdodCAoYykgMjAwNywgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogLS0tCisgKiBBdXRob3I6IENyYWlnIFNpbHZlcnN0ZWluCisgKi8KKworI2lmbmRlZiBfV0lOMzIKKyMgZXJyb3IgWW91IHNob3VsZCBvbmx5IGJlIGluY2x1ZGluZyB3aW5kb3dzL3BvcnQuY2MgaW4gYSB3aW5kb3dzIGVudmlyb25tZW50IQorI2VuZGlmCisKKyNkZWZpbmUgTk9NSU5NQVggICAgICAgLy8gc28gc3RkOjptYXgsIGJlbG93LCBjb21waWxlcyBjb3JyZWN0bHkKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgLy8gZm9yIHN0cmxlbigpLCBtZW1zZXQoKSwgbWVtY21wKCkKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4gICAgLy8gZm9yIHZhX2xpc3QsIHZhX3N0YXJ0LCB2YV9lbmQKKyNpbmNsdWRlIDxhbGdvcml0aG0+ICAgLy8gZm9yIHN0ZDp7bWluLG1heH0KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2Uvc3BpbmxvY2suaCIKKyNpbmNsdWRlICJpbnRlcm5hbF9sb2dnaW5nLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCYXNpYyBsaWJyYXJpZXMKKworUEVSRlRPT0xTX0RMTF9ERUNMCitpbnQgZ2V0cGFnZXNpemUoKSB7CisgIHN0YXRpYyBpbnQgcGFnZXNpemUgPSAwOworICBpZiAocGFnZXNpemUgPT0gMCkgeworICAgIFNZU1RFTV9JTkZPIHN5c3RlbV9pbmZvOworICAgIEdldFN5c3RlbUluZm8oJnN5c3RlbV9pbmZvKTsKKyAgICBwYWdlc2l6ZSA9IHN0ZDo6bWF4KHN5c3RlbV9pbmZvLmR3UGFnZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1faW5mby5kd0FsbG9jYXRpb25HcmFudWxhcml0eSk7CisgIH0KKyAgcmV0dXJuIHBhZ2VzaXplOworfQorCitleHRlcm4gIkMiIFBFUkZUT09MU19ETExfREVDTCB2b2lkKiBfX3NicmsocHRyZGlmZl90IGluY3JlbWVudCkgeworICBMT0coRkFUQUwsICJXaW5kb3dzIGRvZXNuJ3QgaW1wbGVtZW50IHNicmshXG4iKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIFdlIG5lZWQgdG8gd3JpdGUgdG8gJ3N0ZGVycicgd2l0aG91dCBoYXZpbmcgd2luZG93cyBhbGxvY2F0ZSBtZW1vcnkuCisvLyBUaGUgc2FmZXN0IHdheSBpcyB2aWEgYSBsb3ctbGV2ZWwgY2FsbCBsaWtlIFdyaXRlQ29uc29sZUEoKS4gIEJ1dAorLy8gZXZlbiB0aGVuIHdlIG5lZWQgdG8gYmUgc3VyZSB0byBwcmludCBpbiBzbWFsbCBidXJzdHMgc28gYXMgdG8gbm90CisvLyByZXF1aXJlIG1lbW9yeSBhbGxvY2F0aW9uLgorZXh0ZXJuICJDIiBQRVJGVE9PTFNfRExMX0RFQ0wgdm9pZCBXcml0ZVRvU3RkZXJyKGNvbnN0IGNoYXIqIGJ1ZiwgaW50IGxlbikgeworICAvLyBMb29rcyBsaWtlIHdpbmRvd3MgYWxsb2NhdGVzIGZvciB3cml0ZXMgb2YgPjgwIGJ5dGVzCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpICs9IDgwKSB7CisgICAgd3JpdGUoU1RERVJSX0ZJTEVOTywgYnVmICsgaSwgc3RkOjptaW4oODAsIGxlbiAtIGkpKTsKKyAgfQorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaHJlYWRzIGNvZGUKKworLy8gV2luZG93cyBkb2Vzbid0IHN1cHBvcnQgcHRocmVhZF9rZXlfY3JlYXRlJ3MgZGVzdHJfZnVuY3Rpb24sIGFuZCBpbgorLy8gZmFjdCBpdCdzIGEgYml0IHRyaWNreSB0byBnZXQgY29kZSB0byBydW4gd2hlbiBhIHRocmVhZCBleGl0cy4gIFRoaXMKKy8vIGlzIGNhcmdvLWN1bHQgbWFnaWMgZnJvbSBodHRwOi8vd3d3LmNvZGVwcm9qZWN0LmNvbS90aHJlYWRzL3Rscy5hc3AuCisvLyBUaGlzIGNvZGUgaXMgZm9yIFZDKysgNy4xIGFuZCBsYXRlcjsgVkMrKyA2LjAgc3VwcG9ydCBpcyBwb3NzaWJsZQorLy8gYnV0IG1vcmUgYnVzeS13b3JrIC0tIHNlZSB0aGUgd2VicGFnZSBmb3IgaG93IHRvIGRvIGl0LiAgSWYgYWxsCisvLyB0aGlzIGZhaWxzLCB3ZSBjb3VsZCB1c2UgRGxsTWFpbiBpbnN0ZWFkLiAgVGhlIGJpZyBwcm9ibGVtIHdpdGgKKy8vIERsbE1haW4gaXMgaXQgZG9lc24ndCBydW4gaWYgdGhpcyBjb2RlIGlzIHN0YXRpY2FsbHkgbGlua2VkIGludG8gYQorLy8gYmluYXJ5IChpdCBhbHNvIGRvZXNuJ3QgcnVuIGlmIHRoZSB0aHJlYWQgaXMgdGVybWluYXRlZCB2aWEKKy8vIFRlcm1pbmF0ZVRocmVhZCwgd2hpY2ggaWYgd2UncmUgbHVja3kgdGhpcyByb3V0aW5lIGRvZXMpLgorCisvLyBGb3JjZSBhIHJlZmVyZW5jZSB0byBfdGxzX3VzZWQgdG8gbWFrZSB0aGUgbGlua2VyIGNyZWF0ZSB0aGUgVExTIGRpcmVjdG9yeQorLy8gaWYgaXQncyBub3QgYWxyZWFkeSB0aGVyZSAodGhhdCBpcywgZXZlbiBpZiBfX2RlY2xzcGVjKHRocmVhZCkgaXMgbm90IHVzZWQpLgorLy8gRm9yY2UgYSByZWZlcmVuY2UgdG8gcF90aHJlYWRfY2FsbGJhY2tfdGNtYWxsb2MgYW5kIHBfcHJvY2Vzc190ZXJtX3RjbWFsbG9jCisvLyB0byBwcmV2ZW50IHdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uIGZyb20gZGlzY2FyZGluZyB0aGUgdmFyaWFibGVzLgorI2lmZGVmIF9NU0NfVkVSCisjaWYgZGVmaW5lZChfTV9JWDg2KQorI3ByYWdtYSBjb21tZW50KGxpbmtlciwgIi9JTkNMVURFOl9fdGxzX3VzZWQiKQorI3ByYWdtYSBjb21tZW50KGxpbmtlciwgIi9JTkNMVURFOl9wX3RocmVhZF9jYWxsYmFja190Y21hbGxvYyIpCisjcHJhZ21hIGNvbW1lbnQobGlua2VyLCAiL0lOQ0xVREU6X3BfcHJvY2Vzc190ZXJtX3RjbWFsbG9jIikKKyNlbGlmIGRlZmluZWQoX01fWDY0KQorI3ByYWdtYSBjb21tZW50KGxpbmtlciwgIi9JTkNMVURFOl90bHNfdXNlZCIpCisjcHJhZ21hIGNvbW1lbnQobGlua2VyLCAiL0lOQ0xVREU6cF90aHJlYWRfY2FsbGJhY2tfdGNtYWxsb2MiKQorI3ByYWdtYSBjb21tZW50KGxpbmtlciwgIi9JTkNMVURFOnBfcHJvY2Vzc190ZXJtX3RjbWFsbG9jIikKKyNlbmRpZgorI2VuZGlmCisKKy8vIFdoZW4gZGVzdHJfZm4gZXZlbnR1YWxseSBydW5zLCBpdCdzIHN1cHBvc2VkIHRvIHRha2UgYXMgaXRzCisvLyBhcmd1bWVudCB0aGUgdGxzLXZhbHVlIGFzc29jaWF0ZWQgd2l0aCBrZXkgdGhhdCBwdGhyZWFkX2tleV9jcmVhdGUKKy8vIGNyZWF0ZXMuICAoWWVhaCwgaXQgc291bmRzIGNvbmZ1c2luZyBidXQgaXQncyByZWFsbHkgbm90LikgIFdlCisvLyBzdG9yZSB0aGUgZGVzdHJfZm4va2V5IHBhaXIgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZS4gIEJlY2F1c2Ugd2UKKy8vIHN0b3JlIHRoaXMgaW4gYSBzaW5nbGUgdmFyLCB0aGlzIGltcGxpZXMgd2UgY2FuIG9ubHkgaGF2ZSBvbmUKKy8vIGRlc3RyX2ZuIGluIGEgcHJvZ3JhbSEgIFRoYXQncyBlbm91Z2ggaW4gcHJhY3RpY2UuICBJZiBhc3NlcnRzCisvLyB0cmlnZ2VyIGJlY2F1c2Ugd2UgZW5kIHVwIG5lZWRpbmcgbW9yZSwgd2UnbGwgaGF2ZSB0byB0dXJuIHRoaXMKKy8vIGludG8gYW4gYXJyYXkuCitzdHJ1Y3QgRGVzdHJGbkNsb3N1cmUgeworICB2b2lkICgqZGVzdHJfZm4pKHZvaWQqKTsKKyAgcHRocmVhZF9rZXlfdCBrZXlfZm9yX2Rlc3RyX2ZuX2FyZzsKK307CisKK3N0YXRpYyBEZXN0ckZuQ2xvc3VyZSBkZXN0cl9mbl9pbmZvOyAgIC8vIGluaXR0ZWQgdG8gYWxsIE5VTEwvMC4KKworc3RhdGljIGludCBvbl9wcm9jZXNzX3Rlcm0odm9pZCkgeworICBpZiAoZGVzdHJfZm5faW5mby5kZXN0cl9mbikgeworICAgIHZvaWQgKnB0ciA9IFRsc0dldFZhbHVlKGRlc3RyX2ZuX2luZm8ua2V5X2Zvcl9kZXN0cl9mbl9hcmcpOworICAgIC8vIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IGluIFJlbGVhc2UgbW9kZSwgV2luZG93cworICAgIC8vIHNvbWV0aW1lcyB0cmFzaGVzIHRoZSBwb2ludGVyIGluIHRoZSBUTFMgc2xvdCwgc28gd2UgbmVlZCB0bworICAgIC8vIHJlbW92ZSB0aGUgcG9pbnRlciBmcm9tIHRoZSBUTFMgc2xvdCBiZWZvcmUgdGhlIHRocmVhZCBkaWVzLgorICAgIFRsc1NldFZhbHVlKGRlc3RyX2ZuX2luZm8ua2V5X2Zvcl9kZXN0cl9mbl9hcmcsIE5VTEwpOworICAgIGlmIChwdHIpICAvLyBwdGhyZWFkIHNlbWFudGljcyBzYXkgbm90IHRvIGNhbGwgaWYgcHRyIGlzIE5VTEwKKyAgICAgICgqZGVzdHJfZm5faW5mby5kZXN0cl9mbikocHRyKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgTlRBUEkgb25fdGxzX2NhbGxiYWNrKEhJTlNUQU5DRSBoLCBEV09SRCBkd1JlYXNvbiwgUFZPSUQgcHYpIHsKKyAgaWYgKGR3UmVhc29uID09IERMTF9USFJFQURfREVUQUNIKSB7ICAgLy8gdGhyZWFkIGlzIGJlaW5nIGRlc3Ryb3llZCEKKyAgICBvbl9wcm9jZXNzX3Rlcm0oKTsKKyAgfQorfQorCisjaWZkZWYgX01TQ19WRVIKKworLy8gZXh0ZXJuICJDIiBzdXBwcmVzc2VzIEMrKyBuYW1lIG1hbmdsaW5nIHNvIHdlIGtub3cgdGhlIHN5bWJvbCBuYW1lcworLy8gZm9yIHRoZSBsaW5rZXIgL0lOQ0xVREU6c3ltYm9sIHByYWdtYXMgYWJvdmUuCitleHRlcm4gIkMiIHsKKy8vIFRoaXMgdGVsbHMgdGhlIGxpbmtlciB0byBydW4gdGhlc2UgZnVuY3Rpb25zLgorI3ByYWdtYSBkYXRhX3NlZyhwdXNoLCBvbGRfc2VnKQorI3ByYWdtYSBkYXRhX3NlZygiLkNSVCRYTEIiKQordm9pZCAoTlRBUEkgKnBfdGhyZWFkX2NhbGxiYWNrX3RjbWFsbG9jKSgKKyAgICBISU5TVEFOQ0UgaCwgRFdPUkQgZHdSZWFzb24sIFBWT0lEIHB2KSA9IG9uX3Rsc19jYWxsYmFjazsKKyNwcmFnbWEgZGF0YV9zZWcoIi5DUlQkWFRVIikKK2ludCAoKnBfcHJvY2Vzc190ZXJtX3RjbWFsbG9jKSh2b2lkKSA9IG9uX3Byb2Nlc3NfdGVybTsKKyNwcmFnbWEgZGF0YV9zZWcocG9wLCBvbGRfc2VnKQorfSAgLy8gZXh0ZXJuICJDIgorCisjZWxzZSAgLy8gI2lmZGVmIF9NU0NfVkVSICBbcHJvYmFibHkgbXN5cy9taW5nd10KKworLy8gV2UgaGF2ZSB0byB0cnkgdGhlIERsbE1haW4gc29sdXRpb24gaGVyZSwgYmVjYXVzZSB3ZSBjYW4ndCB1c2UgdGhlCisvLyBtc3ZjLXNwZWNpZmljIHByYWdtYXMuCitCT09MIFdJTkFQSSBEbGxNYWluKEhJTlNUQU5DRSBoLCBEV09SRCBkd1JlYXNvbiwgUFZPSUQgcHYpIHsKKyAgaWYgKGR3UmVhc29uID09IERMTF9USFJFQURfREVUQUNIKQorICAgIG9uX3Rsc19jYWxsYmFjayhoLCBkd1JlYXNvbiwgcHYpOworICBlbHNlIGlmIChkd1JlYXNvbiA9PSBETExfUFJPQ0VTU19ERVRBQ0gpCisgICAgb25fcHJvY2Vzc190ZXJtKCk7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgIC8vICNpZmRlZiBfTVNDX1ZFUgorCitleHRlcm4gIkMiIHB0aHJlYWRfa2V5X3QgUHRocmVhZEtleUNyZWF0ZSh2b2lkICgqZGVzdHJfZm4pKHZvaWQqKSkgeworICAvLyBTZW1hbnRpY3MgYXJlOiB3ZSBjcmVhdGUgYSBuZXcga2V5LCBhbmQgdGhlbiBwcm9taXNlIHRvIGNhbGwKKyAgLy8gZGVzdHJfZm4gd2l0aCBUbHNHZXRWYWx1ZShrZXkpIHdoZW4gdGhlIHRocmVhZCBpcyBkZXN0cm95ZWQKKyAgLy8gKGFzIGxvbmcgYXMgVGxzR2V0VmFsdWUoa2V5KSBpcyBub3QgTlVMTCkuCisgIHB0aHJlYWRfa2V5X3Qga2V5ID0gVGxzQWxsb2MoKTsKKyAgaWYgKGRlc3RyX2ZuKSB7ICAgLy8gcmVnaXN0ZXIgaXQKKyAgICAvLyBJZiB0aGlzIGFzc2VydCBmYWlscywgd2UnbGwgbmVlZCB0byBzdXBwb3J0IGFuIGFycmF5IG9mIGRlc3RyX2ZuX2luZm9zCisgICAgYXNzZXJ0KGRlc3RyX2ZuX2luZm8uZGVzdHJfZm4gPT0gTlVMTCk7CisgICAgZGVzdHJfZm5faW5mby5kZXN0cl9mbiA9IGRlc3RyX2ZuOworICAgIGRlc3RyX2ZuX2luZm8ua2V5X2Zvcl9kZXN0cl9mbl9hcmcgPSBrZXk7CisgIH0KKyAgcmV0dXJuIGtleTsKK30KKworLy8gTk9URTogdGhpcyBpcyBXaW4ySyBhbmQgbGF0ZXIuICBGb3IgV2luOTggd2UgY291bGQgdXNlIGEgQ1JJVElDQUxfU0VDVElPTi4uLgorZXh0ZXJuICJDIiBpbnQgcGVyZnRvb2xzX3B0aHJlYWRfb25jZShwdGhyZWFkX29uY2VfdCAqb25jZV9jb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqaW5pdF9yb3V0aW5lKSh2b2lkKSkgeworICAvLyBUcnkgZm9yIGEgZmFzdCBwYXRoIGZpcnN0LiBOb3RlOiB0aGlzIHNob3VsZCBiZSBhbiBhY3F1aXJlIHNlbWFudGljcyByZWFkLgorICAvLyBJdCBpcyBvbiB4ODYgYW5kIHg2NCwgd2hlcmUgV2luZG93cyBydW5zLgorICBpZiAoKm9uY2VfY29udHJvbCAhPSAxKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2Uob25jZV9jb250cm9sLCAyLCAwKSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgaW5pdF9yb3V0aW5lKCk7CisgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZShvbmNlX2NvbnRyb2wsIDEpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgLy8gVGhlIGluaXRpYWxpemVyIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvLyBUaGUgaW5pdGlhbGl6ZXIgaXMgYmVpbmcgcHJvY2Vzc2VkIGJ5IGFub3RoZXIgdGhyZWFkCisgICAgICAgICAgU3dpdGNoVG9UaHJlYWQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZXNlIGZ1bmN0aW9ucyByZXdvcmsgZXhpc3RpbmcgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlCisvLyBHb29nbGUgY29kZWJhc2UuCisKKy8vIEEgcmVwbGFjZW1lbnQgZm9yIEhlYXBQcm9maWxlcjo6Q2xlYW51cE9sZFByb2ZpbGVzLgordm9pZCBEZWxldGVNYXRjaGluZ0ZpbGVzKGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhciogZnVsbF9nbG9iKSB7CisgIFdJTjMyX0ZJTkRfREFUQUEgZm91bmQ7ICAvLyB0aGF0IGZpbmFsIEEgaXMgZm9yIEFuc2kgKGFzIG9wcG9zZWQgdG8gVW5pY29kZSkKKyAgSEFORExFIGhGaW5kID0gRmluZEZpcnN0RmlsZUEoZnVsbF9nbG9iLCAmZm91bmQpOyAgIC8vIEEgaXMgZm9yIEFuc2kKKyAgaWYgKGhGaW5kICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgY29uc3QgaW50IHByZWZpeF9sZW5ndGggPSBzdHJsZW4ocHJlZml4KTsKKyAgICBkbyB7CisgICAgICBjb25zdCBjaGFyICpmbmFtZSA9IGZvdW5kLmNGaWxlTmFtZTsKKyAgICAgIGlmICgoc3RybGVuKGZuYW1lKSA+PSBwcmVmaXhfbGVuZ3RoKSAmJgorICAgICAgICAgIChtZW1jbXAoZm5hbWUsIHByZWZpeCwgcHJlZml4X2xlbmd0aCkgPT0gMCkpIHsKKyAgICAgICAgUkFXX1ZMT0coMCwgIlJlbW92aW5nIG9sZCBoZWFwIHByb2ZpbGUgJXNcbiIsIGZuYW1lKTsKKyAgICAgICAgLy8gVE9ETyhjc2lsdmVycyk6IHdlIHJlYWxseSBuZWVkIHRvIHVubGluayBkaXJuYW1lICsgZm5hbWUKKyAgICAgICAgX3VubGluayhmbmFtZSk7CisgICAgICB9CisgICAgfSB3aGlsZSAoRmluZE5leHRGaWxlQShoRmluZCwgJmZvdW5kKSAhPSBGQUxTRSk7ICAvLyBBIGlzIGZvciBBbnNpCisgICAgRmluZENsb3NlKGhGaW5kKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3dpbmRvd3MvcG9ydC5oIGIvc3JjL3dpbmRvd3MvcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTBmNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvd2luZG93cy9wb3J0LmgKQEAgLTAsMCArMSw0OTcgQEAKKy8vIC0qLSBNb2RlOiBDKys7IGMtYmFzaWMtb2Zmc2V0OiAyOyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisvKiBDb3B5cmlnaHQgKGMpIDIwMDcsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIC0tLQorICogQXV0aG9yOiBDcmFpZyBTaWx2ZXJzdGVpbgorICoKKyAqIFRoZXNlIGFyZSBzb21lIHBvcnRhYmlsaXR5IHR5cGVkZWZzIGFuZCBkZWZpbmVzIHRvIG1ha2UgaXQgYSBiaXQKKyAqIGVhc2llciB0byBjb21waWxlIHRoaXMgY29kZSB1bmRlciBWQysrLgorICoKKyAqIFNldmVyYWwgb2YgdGhlc2UgYXJlIHRha2VuIGZyb20gZ2xpYjoKKyAqICAgIGh0dHA6Ly9kZXZlbG9wZXIuZ25vbWUub3JnL2RvYy9BUEkvZ2xpYi9nbGliLXdpbmRvd3MtY29tcGF0YWJpbGl0eS1mdW5jdGlvbnMuaHRtbAorICovCisKKyNpZm5kZWYgR09PR0xFX0JBU0VfV0lORE9XU19IXworI2RlZmluZSBHT09HTEVfQkFTRV9XSU5ET1dTX0hfCisKKy8qIFlvdSBzaG91bGQgbmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHksIGJ1dCBhbHdheXMgaW5jbHVkZSBpdAorICAgZnJvbSBlaXRoZXIgY29uZmlnLmggKE1TVkMpIG9yIG1pbmd3LmggKE1pbkdXL21zeXMpLiAqLworI2lmICFkZWZpbmVkKEdPT0dMRV9QRVJGVE9PTFNfV0lORE9XU19DT05GSUdfSF8pICYmIFwKKyAgICAhZGVmaW5lZChHT09HTEVfUEVSRlRPT0xTX1dJTkRPV1NfTUlOR1dfSF8pCisjIGVycm9yICJwb3J0Lmggc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgZnJvbSBjb25maWcuaCBvciBtaW5ndy5oIgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKworI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gIC8qIFdlIGFsd2F5cyB3YW50IG1pbmltYWwgaW5jbHVkZXMgKi8KKyNlbmRpZgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxpby5oPiAgICAgICAgICAgICAgLyogYmVjYXVzZSB3ZSBzbyBvZnRlbiB1c2Ugb3Blbi9jbG9zZS9ldGMgKi8KKyNpbmNsdWRlIDxkaXJlY3QuaD4gICAgICAgICAgLyogZm9yIF9nZXRjd2QgKi8KKyNpbmNsdWRlIDxwcm9jZXNzLmg+ICAgICAgICAgLyogZm9yIF9nZXRwaWQgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4gICAgICAgICAgLyogZm9yIFBBVEhfTUFYICovCisjaW5jbHVkZSA8c3RkYXJnLmg+ICAgICAgICAgIC8qIGZvciB2YV9saXN0ICovCisjaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgICAgIC8qIG5lZWQgdGhpcyB0byBvdmVycmlkZSBzdGRpbydzICh2KXNucHJpbnRmICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgIC8qIGZvciBfb2ZmX3QgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgICAgICAgLyogZm9yIHJhbmQsIHNyYW5kLCBfc3RydG94eHggKi8KKworI2lmIF9NU0NfVkVSID49IDE5MDAKKyNkZWZpbmUgX1RJTUVTUEVDX0RFRklORUQKKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworLyoKKyAqIDQwMTg6IHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaCBpcyBjb21tb24gKGFuZCBvayBmb3Igc2lnbmVkX2kgPCB1bnNpZ25lZF9pKQorICogNDI0NDogb3RoZXJ3aXNlIHdlIGdldCBwcm9ibGVtcyB3aGVuIHN1YnRyYWN0aW5nIHR3byBzaXplX3QncyB0byBhbiBpbnQKKyAqIDQyODg6IFZDKys3IGdldHMgY29uZnVzZWQgd2hlbiBhIHZhciBpcyBkZWZpbmVkIGluIGEgbG9vcCBhbmQgdGhlbiBhZnRlciBpdAorICogNDI2NzogdG9vIG1hbnkgZmFsc2UgcG9zaXRpdmVzIGZvciAiY29udmVyc2lvbiBnaXZlcyBwb3NzaWJsZSBkYXRhIGxvc3MiCisgKiA0MjkwOiBpdCdzIG9rIHdpbmRvd3MgaWdub3JlcyB0aGUgInRocm93IiBkaXJlY3RpdmUKKyAqIDQ5OTY6IFllcywgd2UncmUgb2sgdXNpbmcgInVuc2FmZSIgZnVuY3Rpb25zIGxpa2UgdnNucHJpbnRmIGFuZCBnZXRlbnYoKQorICogNDE0NjogaW50ZXJuYWxfbG9nZ2luZy5jYyBpbnRlbnRpb25hbGx5IG5lZ2F0ZXMgYW4gdW5zaWduZWQgdmFsdWUKKyAqLworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MDE4IDQyNDQgNDI4OCA0MjY3IDQyOTAgNDk5NiA0MTQ2KQorI2VuZGlmCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKy8qIE1TVkMgZG9lcyBub3Qgc3VwcG9ydCBDOTkgKi8KKyMgaWYgIWRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgfHwgX19TVERDX1ZFUlNJT05fXyA8IDE5OTkwMUwKKyMgIGlmZGVmIF9NU0NfVkVSCisjICAgIGRlZmluZSBpbmxpbmUgX19pbmxpbmUKKyMgIGVsc2UKKyMgICAgZGVmaW5lIGlubGluZSBzdGF0aWMKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjIGRlZmluZSBFWFRFUk5fQyAgZXh0ZXJuICJDIgorI2Vsc2UKKyMgZGVmaW5lIEVYVEVSTl9DICBleHRlcm4KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCQVNJQyBUWVBFUyAqLworCisjaWZuZGVmIEhBVkVfU1RESU5UX0gKKyNpZm5kZWYgSEFWRV9fX0lOVDY0ICAgIC8qIHdlIG5lZWQgdG8gaGF2ZSBhbGwgdGhlIF9faW50WCBuYW1lcyAqLworIyBlcnJvciAgRG8gbm90IGtub3cgaG93IHRvIHNldCB1cCB0eXBlIGFsaWFzZXMuICBFZGl0IHBvcnQuaCBmb3IgeW91ciBzeXN0ZW0uCisjZW5kaWYKKwordHlwZWRlZiBfX2ludDggaW50OF90OwordHlwZWRlZiBfX2ludDE2IGludDE2X3Q7Cit0eXBlZGVmIF9faW50MzIgaW50MzJfdDsKK3R5cGVkZWYgX19pbnQ2NCBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDggdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQxNiB1aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiB1aW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsKKyNlbmRpZiAgLyogI2lmbmRlZiBIQVZFX1NURElOVF9IICovCisKKy8qIEkgZ3Vlc3MgTVNWQydzIDx0eXBlcy5oPiBkb2Vzbid0IGluY2x1ZGUgc3NpemVfdCBieSBkZWZhdWx0PyAqLworI2lmZGVmIF9NU0NfVkVSCit0eXBlZGVmIGludHB0cl90IHNzaXplX3Q7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVEhSRUFEUyAqLworCisjaWZuZGVmIEhBVkVfUFRIUkVBRCAgIC8qIG5vdCB0cnVlIGZvciBNU1ZDLCBidXQgbWF5IGJlIHRydWUgZm9yIE1TWVMgKi8KK3R5cGVkZWYgRFdPUkQgcHRocmVhZF90OwordHlwZWRlZiBEV09SRCBwdGhyZWFkX2tleV90OwordHlwZWRlZiBMT05HIHB0aHJlYWRfb25jZV90OworZW51bSB7IFBUSFJFQURfT05DRV9JTklUID0gMCB9OyAgIC8qIGltcG9ydGFudCB0aGF0IHRoaXMgYmUgMCEgZm9yIFNwaW5Mb2NrICovCisKK2lubGluZSBwdGhyZWFkX3QgcHRocmVhZF9zZWxmKHZvaWQpIHsKKyAgcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2lubGluZSBib29sIHB0aHJlYWRfZXF1YWwocHRocmVhZF90IGxlZnQsIHB0aHJlYWRfdCByaWdodCkgeworICByZXR1cm4gbGVmdCA9PSByaWdodDsKK30KKworLyoKKyAqIHdpbmRvd3MvcG9ydC5oIGRlZmluZXMgY29tcGF0aWJpbGl0eSBBUElzIGZvciBzZXZlcmFsIC5oIGZpbGVzLCB3aGljaAorICogd2UgdGhlcmVmb3JlIHNob3VsZG4ndCBiZSAjaW5jbHVkaW5nIGRpcmVjdGx5LiAgVGhpcyBoYWNrIGtlZXBzIHVzIGZyb20KKyAqIGRvaW5nIHNvLiAgVE9ETyhjc2lsdmVycyk6IGRvIHNvbWV0aGluZyBtb3JlIHByaW5jaXBsZWQuCisgKi8KKyNkZWZpbmUgR09PR0xFX01BWUJFX1RIUkVBRFNfSF8gMQorLyogVGhpcyByZXBsYWNlcyBtYXliZV90aHJlYWRzLntoLGNjfSAqLworCitFWFRFUk5fQyBwdGhyZWFkX2tleV90IFB0aHJlYWRLZXlDcmVhdGUodm9pZCAoKmRlc3RyX2ZuKSh2b2lkKikpOyAgLyogcG9ydC5jYyAqLworCitpbmxpbmUgaW50IHBlcmZ0b29sc19wdGhyZWFkX2tleV9jcmVhdGUocHRocmVhZF9rZXlfdCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZGVzdHJ1Y3Rvcikodm9pZCopKSB7CisgIHB0aHJlYWRfa2V5X3Qga2V5ID0gUHRocmVhZEtleUNyZWF0ZShkZXN0cnVjdG9yKTsKKyAgaWYgKGtleSAhPSBUTFNfT1VUX09GX0lOREVYRVMpIHsKKyAgICAqKHBrZXkpID0ga2V5OworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiBHZXRMYXN0RXJyb3IoKTsKKyAgfQorfQorCitpbmxpbmUgdm9pZCogcGVyZnRvb2xzX3B0aHJlYWRfZ2V0c3BlY2lmaWMoRFdPUkQga2V5KSB7CisgIERXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOworICB2b2lkKiBydiA9IFRsc0dldFZhbHVlKGtleSk7CisgIGlmIChlcnIpIFNldExhc3RFcnJvcihlcnIpOworICByZXR1cm4gcnY7Cit9CisKK2lubGluZSBpbnQgcGVyZnRvb2xzX3B0aHJlYWRfc2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXksIGNvbnN0IHZvaWQgKnZhbHVlKSB7CisgIGlmIChUbHNTZXRWYWx1ZShrZXksIChMUFZPSUQpdmFsdWUpKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIEdldExhc3RFcnJvcigpOworfQorCitFWFRFUk5fQyBpbnQgcGVyZnRvb2xzX3B0aHJlYWRfb25jZShwdGhyZWFkX29uY2VfdCAqb25jZV9jb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmluaXRfcm91dGluZSkodm9pZCkpOworCisjZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCisKK2lubGluZSB2b2lkIHNjaGVkX3lpZWxkKHZvaWQpIHsKKyAgU2xlZXAoMCk7Cit9CisKKyNlbmRpZiAgLyogSEFWRV9QVEhSRUFEICovCisKKy8qCisgKiBfX2RlY2xzcGVjKHRocmVhZCkgaXNuJ3QgdXNhYmxlIGluIGEgZGxsIG9wZW5lZCB2aWEgTG9hZExpYnJhcnkoKS4KKyAqIEJ1dCBpdCBkb2Vzbid0IHdvcmsgdG8gTG9hZExpYnJhcnkoKSB1cyBhbnl3YXksIGJlY2F1c2Ugb2YgYWxsIHRoZQorICogdGhpbmdzIHdlIG5lZWQgdG8gZG8gYmVmb3JlIG1haW4oKSEgIFNvIHRoaXMga2luZCBvZiBUTFMgaXMgc2FmZSBmb3IgdXMuCisgKi8KKyNkZWZpbmUgX190aHJlYWQgX19kZWNsc3BlYyh0aHJlYWQpCisKKy8qCisgKiBUaGlzIGNvZGUgaXMgb2Jzb2xldGUsIGJ1dCBJIGtlZXAgaXQgYXJvdW5kIGluIGNhc2Ugd2UgYXJlIGV2ZXIgaW4KKyAqIGFuIGVudmlyb25tZW50IHdoZXJlIHdlIGNhbid0IG9yIGRvbid0IHdhbnQgdG8gdXNlIGdvb2dsZSBzcGlubG9ja3MKKyAqIChmcm9tIGJhc2Uvc3BpbmxvY2sue2gsY2N9KS4gIEluIHRoYXQgY2FzZSwgdW5jb21tZW50aW5nIHRoaXMgb3V0LAorICogYW5kIHJlbW92aW5nIHNwaW5sb2NrLmNjIGZyb20gdGhlIGJ1aWxkLCBzaG91bGQgYmUgZW5vdWdoIHRvIHJldmVydAorICogYmFjayB0byB1c2luZyBuYXRpdmUgc3BpbmxvY2tzLgorICovCisjaWYgMAorLy8gV2luZG93cyB1c2VzIGEgc3BpbmxvY2sgaW50ZXJuYWxseSBmb3IgaXRzIG11dGV4ZXMsIG1ha2luZyBvdXIgbGlmZSBlYXN5IQorLy8gSG93ZXZlciwgdGhlIFdpbmRvd3Mgc3BpbmxvY2sgbXVzdCBhbHdheXMgYmUgaW5pdGlhbGl6ZWQsIG1ha2luZyBsaWZlIGhhcmQsCisvLyBzaW5jZSB3ZSB3YW50IExJTktFUl9JTklUSUFMSVpFRC4gIFdlIHdvcmsgYXJvdW5kIHRoaXMgYnkgaGF2aW5nIHRoZQorLy8gbGlua2VyIGluaXRpYWxpemUgYSBib29sIHRvIDAsIGFuZCBjaGVjayB0aGF0IGJlZm9yZSBhY2Nlc3NpbmcgdGhlIG11dGV4LgorLy8gVGhpcyByZXBsYWNlcyBzcGlubG9jay57aCxjY30sIGFuZCBhbGwgdGhlIHN0dWZmIGl0IGRlcGVuZHMgb24gKGF0b21pY29wcykKKyNpZmRlZiBfX2NwbHVzcGx1cworY2xhc3MgU3BpbkxvY2sgeworIHB1YmxpYzoKKyAgU3BpbkxvY2soKSA6IGluaXRpYWxpemVfdG9rZW5fKFBUSFJFQURfT05DRV9JTklUKSB7fQorICAvLyBVc2VkIGZvciBnbG9iYWwgU3BpbkxvY2sgdmFycyAoc2VlIGJhc2Uvc3BpbmxvY2suaCBmb3IgbW9yZSBkZXRhaWxzKS4KKyAgZW51bSBTdGF0aWNJbml0aWFsaXplciB7IExJTktFUl9JTklUSUFMSVpFRCB9OworICBleHBsaWNpdCBTcGluTG9jayhTdGF0aWNJbml0aWFsaXplcikgOiBpbml0aWFsaXplX3Rva2VuXyhQVEhSRUFEX09OQ0VfSU5JVCkgeworICAgIHBlcmZ0b29sc19wdGhyZWFkX29uY2UoJmluaXRpYWxpemVfdG9rZW5fLCBJbml0aWFsaXplTXV0ZXgpOworICB9CisKKyAgLy8gSXQncyBpbXBvcnRhbnQgU3BpbkxvY2sgbm90IGhhdmUgYSBkZXN0cnVjdG9yOiBvdGhlcndpc2Ugd2UgcnVuCisgIC8vIGludG8gcHJvYmxlbXMgd2hlbiB0aGUgbWFpbiB0aHJlYWQgaGFzIGV4aXRlZCwgYnV0IG90aGVyIHRocmVhZHMKKyAgLy8gYXJlIHN0aWxsIHJ1bm5pbmcgYW5kIHRyeSB0byBhY2Nlc3MgYSBtYWluLXRocmVhZCBzcGlubG9jay4gIFRoaXMKKyAgLy8gbWVhbnMgd2UgbGVhayBtdXRleF8gKHdlIHNob3VsZCBjYWxsIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigpCisgIC8vIGhlcmUpLiAgSG93ZXZlciwgSSd2ZSB2ZXJpZmllZCB0aGF0IGFsbCBTcGluTG9ja3MgdXNlZCBpbgorICAvLyBwZXJmdG9vbHMgaGF2ZSBwcm9ncmFtLWxvbmcgc2NvcGUgYW55d2F5LCBzbyB0aGUgbGVhayBpcworICAvLyBwZXJmZWN0bHkgZmluZS4gIEJ1dCBiZSBhd2FyZSBvZiB0aGlzIGZvciB0aGUgZnV0dXJlIQorCisgIHZvaWQgTG9jaygpIHsKKyAgICAvLyBZb3UnZCB0aGlvbmsgdGhpcyB3b3VsZCBiZSB1bm5lY2Vzc2FyeSwgc2luY2Ugd2UgY2FsbAorICAgIC8vIEluaXRpYWxpemVNdXRleCgpIGluIG91ciBjb25zdHJ1Y3Rvci4gIEJ1dCBzb21ldGltZXMgTG9jaygpIGNhbgorICAgIC8vIGJlIGNhbGxlZCBiZWZvcmUgb3VyIGNvbnN0cnVjdG9yIGlzISAgVGhpcyBjYW4gb25seSBoYXBwZW4gaW4KKyAgICAvLyBnbG9iYWwgY29uc3RydWN0b3JzLCB3aGVuIHRoaXMgaXMgYSBnbG9iYWwuICBJZiB3ZSBsaXZlIGluCisgICAgLy8gYmFyLmNjLCBhbmQgc29tZSBnbG9iYWwgY29uc3RydWN0b3IgaW4gZm9vLmNjIGNhbGxzIGEgcm91dGluZQorICAgIC8vIGluIGJhci5jYyB0aGF0IGNhbGxzIHRoaXMtPkxvY2soKSwgdGhlbiBMb2NrKCkgbWF5IHdlbGwgcnVuCisgICAgLy8gYmVmb3JlIG91ciBnbG9iYWwgY29uc3RydWN0b3IgZG9lcy4gIFRvIHByb3RlY3QgYWdhaW5zdCB0aGF0LAorICAgIC8vIHdlIGRvIHRoaXMgY2hlY2suICBGb3IgU3BpbkxvY2sgb2JqZWN0cyBjcmVhdGVkIGFmdGVyIG1haW4oKQorICAgIC8vIGhhcyBzdGFydGVkLCB0aGlzIHB0aHJlYWRfb25jZSBjYWxsIHdpbGwgYWx3YXlzIGJlIGEgbm9vcC4KKyAgICBwZXJmdG9vbHNfcHRocmVhZF9vbmNlKCZpbml0aWFsaXplX3Rva2VuXywgSW5pdGlhbGl6ZU11dGV4KTsKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmbXV0ZXhfKTsKKyAgfQorICB2b2lkIFVubG9jaygpIHsKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbXV0ZXhfKTsKKyAgfQorCisgIC8vIFVzZWQgaW4gYXNzZXJ0aW9uIGNoZWNrczogYXNzZXJ0KGxvY2suSXNIZWxkKCkpIChzZWUgYmFzZS9zcGlubG9jay5oKS4KKyAgaW5saW5lIGJvb2wgSXNIZWxkKCkgY29uc3QgeworICAgIC8vIFRoaXMgd29ya3MsIGJ1dCBwcm9iZXMgdW5kb2N1bWVudGVkIGludGVybmFscywgc28gSSd2ZSBjb21tZW50ZWQgaXQgb3V0LgorICAgIC8vIGMuZi4gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9tc2RubWFnL2lzc3Vlcy8wMy8xMi9Dcml0aWNhbFNlY3Rpb25zLworICAgIC8vcmV0dXJuIG11dGV4Xy5Mb2NrQ291bnQ+PTAgJiYgbXV0ZXhfLk93bmluZ1RocmVhZD09R2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyBwcml2YXRlOgorICB2b2lkIEluaXRpYWxpemVNdXRleCgpIHsgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbXV0ZXhfKTsgfQorCisgIHB0aHJlYWRfb25jZV90IGluaXRpYWxpemVfdG9rZW5fOworICBDUklUSUNBTF9TRUNUSU9OIG11dGV4XzsKK307CisKK2NsYXNzIFNwaW5Mb2NrSG9sZGVyIHsgIC8vIEFjcXVpcmVzIGEgc3BpbmxvY2sgZm9yIGFzIGxvbmcgYXMgdGhlIHNjb3BlIGxhc3RzCisgcHJpdmF0ZToKKyAgU3BpbkxvY2sqIGxvY2tfOworIHB1YmxpYzoKKyAgaW5saW5lIGV4cGxpY2l0IFNwaW5Mb2NrSG9sZGVyKFNwaW5Mb2NrKiBsKSA6IGxvY2tfKGwpIHsgbC0+TG9jaygpOyB9CisgIGlubGluZSB+U3BpbkxvY2tIb2xkZXIoKSB7IGxvY2tfLT5VbmxvY2soKTsgfQorfTsKKyNlbmRpZiAgLy8gI2lmZGVmIF9fY3BsdXNwbHVzCisKKy8vIFRoaXMga2VlcHMgdXMgZnJvbSB1c2luZyBiYXNlL3NwaW5sb2NrLmgncyBpbXBsZW1lbnRhdGlvbiBvZiBTcGluTG9jay4KKyNkZWZpbmUgQkFTRV9TUElOTE9DS19IXyAxCisKKyNlbmRpZiAgLyogI2lmIDAgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTU1BUCBhbmQgb3RoZXIgbWVtb3J5IGFsbG9jYXRpb24gKi8KKworI2lmbmRlZiBIQVZFX01NQVAgICAvKiBub3QgdHJ1ZSBmb3IgTVNWQywgYnV0IG1heSBiZSB0cnVlIGZvciBtc3lzICovCisjZGVmaW5lIE1BUF9GQUlMRUQgIDAKKyNkZWZpbmUgTVJFTUFQX0ZJWEVEICAyICAvKiB0aGUgdmFsdWUgaW4gbGludXgsIHRob3VnaCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgKi8KKy8qIFRoZXNlLCB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIG1tYXAgaW52YXJpYW50cyBiZWxvdywgeWllbGQgdGhlIHByb3BlciBhY3Rpb24gKi8KKyNkZWZpbmUgUFJPVF9SRUFEICAgICAgUEFHRV9SRUFEV1JJVEUKKyNkZWZpbmUgUFJPVF9XUklURSAgICAgUEFHRV9SRUFEV1JJVEUKKyNkZWZpbmUgTUFQX0FOT05ZTU9VUyAgTUVNX1JFU0VSVkUKKyNkZWZpbmUgTUFQX1BSSVZBVEUgICAgTUVNX0NPTU1JVAorI2RlZmluZSBNQVBfU0hBUkVEICAgICBNRU1fUkVTRVJWRSAgIC8qIHZhbHVlIG9mIHRoaXMgI2RlZmluZSBpcyAxMDAlIGFyYml0cmFyeSAqLworCisjaWYgX19TVERDX18gJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCit0eXBlZGVmIF9vZmZfdCBvZmZfdDsKKyNlbmRpZgorCisvKiBWaXJ0dWFsQWxsb2Mgb25seSByZXBsYWNlcyBmb3IgbW1hcCB3aGVuIGNlcnRhaW4gaW52YXJpYW50cyBhcmUga2VwdC4gKi8KK2lubGluZSB2b2lkICptbWFwKHZvaWQgKmFkZHIsIHNpemVfdCBsZW5ndGgsIGludCBwcm90LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICBpbnQgZmQsIG9mZl90IG9mZnNldCkgeworICBpZiAoYWRkciA9PSBOVUxMICYmIGZkID09IC0xICYmIG9mZnNldCA9PSAwICYmCisgICAgICBwcm90ID09IChQUk9UX1JFQUR8UFJPVF9XUklURSkgJiYgZmxhZ3MgPT0gKE1BUF9QUklWQVRFfE1BUF9BTk9OWU1PVVMpKSB7CisgICAgcmV0dXJuIFZpcnR1YWxBbGxvYygwLCBsZW5ndGgsIE1FTV9SRVNFUlZFIHwgTUVNX0NPTU1JVCwgUEFHRV9SRUFEV1JJVEUpOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2lubGluZSBpbnQgbXVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBsZW5ndGgpIHsKKyAgcmV0dXJuIFZpcnR1YWxGcmVlKGFkZHIsIDAsIE1FTV9SRUxFQVNFKSA/IDAgOiAtMTsKK30KKyNlbmRpZiAgLyogSEFWRV9NTUFQICovCisKKy8qIFdlIGNvdWxkIG1heWJlIHVzZSBWaXJ0dWFsQWxsb2MgZm9yIHNicmsgYXMgd2VsbCwgYnV0IG5vIG5lZWQgKi8KK2lubGluZSB2b2lkICpzYnJrKGludHB0cl90IGluY3JlbWVudCkgeworICAvLyBzYnJrIHJldHVybnMgLTEgb24gZmFpbHVyZQorICByZXR1cm4gKHZvaWQqKS0xOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNUUklORyBST1VUSU5FUyAqLworCisvKgorICogV2UgY2FuJ3QganVzdCB1c2UgX3ZzbnByaW50ZiBhbmQgX3NucHJpbnRmIGFzIGRyb3AtaW4tcmVwbGFjZW1lbnRzLAorICogYmVjYXVzZSB0aGV5IGRvbid0IGFsd2F5cyBOVUwtdGVybWluYXRlLiA6LSggIFdlIGFsc28gY2FuJ3QgdXNlIHRoZQorICogbmFtZSB2c25wcmludGYsIHNpbmNlIHdpbmRvd3MgZGVmaW5lcyB0aGF0IChidXQgbm90IHNucHJpbnRmICghKSkuCisgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNDAwCisvKiBXZSBjYW4gdXNlIHNhZmUgQ1JUIGZ1bmN0aW9ucywgd2hpY2ggdGhlIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkgKi8KK2lubGluZSBpbnQgcGVyZnRvb2xzX3ZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcCkgeworICByZXR1cm4gdnNucHJpbnRmX3Moc3RyLCBzaXplLCBfVFJVTkNBVEUsIGZvcm1hdCwgYXApOworfQorI2Vsc2UKK2lubGluZSBpbnQgcGVyZnRvb2xzX3ZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcCkgeworICBpZiAoc2l6ZSA9PSAwKSAgICAgICAgLyogbm90IGV2ZW4gcm9vbSBmb3IgYSBcMD8gKi8KKyAgICByZXR1cm4gLTE7ICAgICAgICAvKiBub3Qgd2hhdCBDOTkgc2F5cyB0byBkbywgYnV0IHdoYXQgd2luZG93cyBkb2VzICovCisgIHN0cltzaXplLTFdID0gJ1wwJzsKKyAgcmV0dXJuIF92c25wcmludGYoc3RyLCBzaXplLTEsIGZvcm1hdCwgYXApOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TTlBSSU5URgoraW5saW5lIGludCBzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFwOworICBpbnQgcjsKKyAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgIHIgPSBwZXJmdG9vbHNfdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm9ybWF0LCBhcCk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiByOworfQorI2VuZGlmCisKKyNkZWZpbmUgUFJJeDY0ICAiSTY0eCIKKyNkZWZpbmUgU0NOeDY0ICAiSTY0eCIKKyNkZWZpbmUgUFJJZDY0ICAiSTY0ZCIKKyNkZWZpbmUgU0NOZDY0ICAiSTY0ZCIKKyNkZWZpbmUgUFJJdTY0ICAiSTY0dSIKKyNpZmRlZiBfV0lONjQKKyMgZGVmaW5lIFBSSXVQVFIgImxsdSIKKyMgZGVmaW5lIFBSSXhQVFIgImxseCIKKyNlbHNlCisjIGRlZmluZSBQUkl1UFRSICJsdSIKKyMgZGVmaW5lIFBSSXhQVFIgImx4IgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZJTEUgSU8gKi8KKworI2lmbmRlZiBQQVRIX01BWAorI2RlZmluZSBQQVRIX01BWCAxMDI0CisjZW5kaWYKKyNpZm5kZWYgX19NSU5HVzMyX18KK2VudW0geyBTVERJTl9GSUxFTk8gPSAwLCBTVERPVVRfRklMRU5PID0gMSwgU1RERVJSX0ZJTEVOTyA9IDIgfTsKKyNlbmRpZgorI2lmbmRlZiBPX1JET05MWQorI2RlZmluZSBPX1JET05MWSAgX09fUkRPTkxZCisjZW5kaWYKKworI2lmIF9fU1REQ19fICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKQorLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBjb25zaWRlcmVkIG5vbi1zdGFuZGFyZCAqLworaW5saW5lIGludCBhY2Nlc3MoY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBtb2RlKSB7CisgIHJldHVybiBfYWNjZXNzKHBhdGhuYW1lLCBtb2RlKTsKK30KK2lubGluZSBpbnQgb3Blbihjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSA9IDApIHsKKyAgcmV0dXJuIF9vcGVuKHBhdGhuYW1lLCBmbGFncywgbW9kZSk7Cit9CitpbmxpbmUgaW50IGNsb3NlKGludCBmZCkgeworICByZXR1cm4gX2Nsb3NlKGZkKTsKK30KK2lubGluZSBzc2l6ZV90IHJlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkgeworICByZXR1cm4gX3JlYWQoZmQsIGJ1ZiwgY291bnQpOworfQoraW5saW5lIHNzaXplX3Qgd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkgeworICByZXR1cm4gX3dyaXRlKGZkLCBidWYsIGNvdW50KTsKK30KK2lubGluZSBvZmZfdCBsc2VlayhpbnQgZmQsIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkgeworICByZXR1cm4gX2xzZWVrKGZkLCBvZmZzZXQsIHdoZW5jZSk7Cit9CitpbmxpbmUgY2hhciAqZ2V0Y3dkKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgcmV0dXJuIF9nZXRjd2QoYnVmLCBzaXplKTsKK30KK2lubGluZSBpbnQgbWtkaXIoY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCkgeworICByZXR1cm4gX21rZGlyKHBhdGhuYW1lKTsKK30KKworaW5saW5lIEZJTEUgKnBvcGVuKGNvbnN0IGNoYXIgKmNvbW1hbmQsIGNvbnN0IGNoYXIgKnR5cGUpIHsKKyAgcmV0dXJuIF9wb3Blbihjb21tYW5kLCB0eXBlKTsKK30KK2lubGluZSBpbnQgcGNsb3NlKEZJTEUgKnN0cmVhbSkgeworICByZXR1cm4gX3BjbG9zZShzdHJlYW0pOworfQorI2VuZGlmCisKK0VYVEVSTl9DIFBFUkZUT09MU19ETExfREVDTCB2b2lkIFdyaXRlVG9TdGRlcnIoY29uc3QgY2hhciogYnVmLCBpbnQgbGVuKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1lTVEVNL1BST0NFU1MgKi8KKworI2lmbmRlZiBIQVZFX1BJRF9UCit0eXBlZGVmIGludCBwaWRfdDsKKyNlbmRpZgorCisjaWYgX19TVERDX18gJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCitpbmxpbmUgcGlkX3QgZ2V0cGlkKHZvaWQpIHsgcmV0dXJuIF9nZXRwaWQoKTsgfQorI2VuZGlmCitpbmxpbmUgcGlkX3QgZ2V0cHBpZCh2b2lkKSB7IHJldHVybiAwOyB9CisKKy8qIEhhbmRsZSBjYXNlIHdoZW4gcG9sbCBpcyB1c2VkIHRvIHNpbXVsYXRlIHNsZWVwLiAqLworaW5saW5lIGludCBwb2xsKHN0cnVjdCBwb2xsZmQqIGZkcywgaW50IG5mZHMsIGludCB0aW1lb3V0KSB7CisgIGFzc2VydChmZHMgPT0gTlVMTCk7CisgIGFzc2VydChuZmRzID09IDApOworICBTbGVlcCh0aW1lb3V0KTsKKyAgcmV0dXJuIDA7Cit9CisKK0VYVEVSTl9DIFBFUkZUT09MU19ETExfREVDTCBpbnQgZ2V0cGFnZXNpemUoKTsgICAvKiBpbiBwb3J0LmNjICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9USEVSICovCisKK2lubGluZSB2b2lkIHNyYW5kb20odW5zaWduZWQgaW50IHNlZWQpIHsgc3JhbmQoc2VlZCk7IH0KK2lubGluZSBsb25nIHJhbmRvbSh2b2lkKSB7IHJldHVybiByYW5kKCk7IH0KKworI2lmbmRlZiBIQVZFX0RFQ0xfU0xFRVAKKyNkZWZpbmUgSEFWRV9ERUNMX1NMRUVQIDAKKyNlbmRpZgorCisjaWYgIUhBVkVfREVDTF9TTEVFUAoraW5saW5lIHVuc2lnbmVkIGludCBzbGVlcCh1bnNpZ25lZCBpbnQgc2Vjb25kcykgeworICBTbGVlcChzZWNvbmRzICogMTAwMCk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8vIG1pbmd3NjQgc2VlbXMgdG8gZGVmaW5lIHRpbWVzcGVjICh0aG91Z2ggbWluZ3cub3JnIG1pbmd3IGRvZXNuJ3QpLAorLy8gcHJvdGVjdGVkIGJ5IHRoZSBfVElNRVNQRUNfREVGSU5FRCBtYWNyby4KKyNpZm5kZWYgX1RJTUVTUEVDX0RFRklORUQKK3N0cnVjdCB0aW1lc3BlYyB7CisgIGludCB0dl9zZWM7CisgIGludCB0dl9uc2VjOworfTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfREVDTF9OQU5PU0xFRVAKKyNkZWZpbmUgSEFWRV9ERUNMX05BTk9TTEVFUCAwCisjZW5kaWYKKworLy8gbGF0ZXN0IG1pbmd3NjQgaGFzIG5hbm9zbGVlcC4gRWFybGllciBtaW5ndyBhbmQgTVNWQyBkbyBub3QKKyNpZiAhSEFWRV9ERUNMX05BTk9TTEVFUAoraW5saW5lIGludCBuYW5vc2xlZXAoY29uc3Qgc3RydWN0IHRpbWVzcGVjICpyZXEsIHN0cnVjdCB0aW1lc3BlYyAqcmVtKSB7CisgIFNsZWVwKHJlcS0+dHZfc2VjICogMTAwMCArIHJlcS0+dHZfbnNlYyAvIDEwMDAwMDApOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fTUlOR1czMl9fCisjaWYgX01TQ19WRVIgPCAxODAwCitpbmxpbmUgbG9uZyBsb25nIGludCBzdHJ0b2xsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CisgICAgcmV0dXJuIF9zdHJ0b2k2NChucHRyLCBlbmRwdHIsIGJhc2UpOworfQoraW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgc3RydG91bGwoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlKSB7CisgICAgcmV0dXJuIF9zdHJ0b3VpNjQobnB0ciwgZW5kcHRyLCBiYXNlKTsKK30KK2lubGluZSBsb25nIGxvbmcgaW50IHN0cnRvcShjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkgeworICAgIHJldHVybiBfc3RydG9pNjQobnB0ciwgZW5kcHRyLCBiYXNlKTsKK30KKyNlbmRpZgoraW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgc3RydG91cShjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZSkgeworICAgIHJldHVybiBfc3RydG91aTY0KG5wdHIsIGVuZHB0ciwgYmFzZSk7Cit9CitpbmxpbmUgbG9uZyBsb25nIGF0b2xsKGNvbnN0IGNoYXIgKm5wdHIpIHsKKyAgcmV0dXJuIF9hdG9pNjQobnB0cik7Cit9CisjZW5kaWYKKworI2RlZmluZSBfX1RIUk9XIHRocm93KCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVENNQUxMT0MtU1BFQ0lGSUMgKi8KKworLyogdGNtYWxsb2MuY2MgY2FsbHMgdGhpcyBzbyB3ZSBjYW4gcGF0Y2ggVmlydHVhbEFsbG9jKCkgZXQgYWwuICovCitleHRlcm4gdm9pZCBQYXRjaFdpbmRvd3NGdW5jdGlvbnMoKTsKKworI2VuZGlmICAvKiBfV0lOMzIgKi8KKworI3VuZGVmIGlubGluZQorI3VuZGVmIEVYVEVSTl9DCisKKyNlbmRpZiAgLyogR09PR0xFX0JBU0VfV0lORE9XU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3dpbmRvd3MvcHJlYW1ibGVfcGF0Y2hlci5jYyBiL3NyYy93aW5kb3dzL3ByZWFtYmxlX3BhdGNoZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwNTUzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93aW5kb3dzL3ByZWFtYmxlX3BhdGNoZXIuY2MKQEAgLTAsMCArMSw3MzYgQEAKKy8vIC0qLSBNb2RlOiBDKys7IGMtYmFzaWMtb2Zmc2V0OiAyOyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisvKiBDb3B5cmlnaHQgKGMpIDIwMDcsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIC0tLQorICogQXV0aG9yOiBKb2kgU2lndXJkc3NvbgorICogQXV0aG9yOiBTY290dCBGcmFuY2lzCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgUHJlYW1ibGVQYXRjaGVyCisgKi8KKworI2luY2x1ZGUgInByZWFtYmxlX3BhdGNoZXIuaCIKKworI2luY2x1ZGUgIm1pbmlfZGlzYXNzZW1ibGVyLmgiCisKKy8vIGNvbXBhdGliaWxpdHkgc2hpbXMKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKworLy8gRGVmaW5pdGlvbnMgb2YgYXNzZW1ibHkgc3RhdGVtZW50cyB3ZSBuZWVkCisjZGVmaW5lIEFTTV9KTVAzMlJFTCAweEU5CisjZGVmaW5lIEFTTV9JTlQzIDB4Q0MKKyNkZWZpbmUgQVNNX0pNUDMyQUJTXzAgMHhGRgorI2RlZmluZSBBU01fSk1QMzJBQlNfMSAweDI1CisjZGVmaW5lIEFTTV9KTVA4UkVMIDB4RUIKKyNkZWZpbmUgQVNNX0pDQzMyUkVMXzAgMHgwRgorI2RlZmluZSBBU01fSkNDMzJSRUxfMV9NQVNLIDB4ODAKKyNkZWZpbmUgQVNNX05PUCAweDkwCisvLyBYNjQgb3Bjb2RlcworI2RlZmluZSBBU01fUkVYVyAweDQ4CisjZGVmaW5lIEFTTV9NT1ZSQVhfSU1NIDB4QjgKKyNkZWZpbmUgQVNNX0pNUCAweEZGCisjZGVmaW5lIEFTTV9KTVBfUkFYIDB4RTAKKworbmFtZXNwYWNlIHNpZGVzdGVwIHsKKworUHJlYW1ibGVQYXRjaGVyOjpQcmVhbWJsZVBhZ2UqIFByZWFtYmxlUGF0Y2hlcjo6cHJlYW1ibGVfcGFnZXNfID0gTlVMTDsKK2xvbmcgUHJlYW1ibGVQYXRjaGVyOjpncmFudWxhcml0eV8gPSAwOworbG9uZyBQcmVhbWJsZVBhdGNoZXI6OnBhZ2VzaXplXyA9IDA7Citib29sIFByZWFtYmxlUGF0Y2hlcjo6aW5pdGlhbGl6ZWRfID0gZmFsc2U7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga1ByZWFtYmxlUGFnZU1hZ2ljID0gMHg0MzQ3NDE0RDsgLy8gIk1BR0MiCisKKy8vIEhhbmRsZSBhIHNwZWNpYWwgY2FzZSB0aGF0IHdlIHNlZSB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBvaW50IGludG8gYW4KKy8vIElBVCB0YWJsZSAoaW5jbHVkaW5nIGZ1bmN0aW9ucyBsaW5rZWQgc3RhdGljYWxseSBpbnRvIHRoZQorLy8gYXBwbGljYXRpb24pOiB0aGVzZSBmdW5jdGlvbiBhbHJlYWR5IHN0YXJ0cyB3aXRoIEFTTV9KTVAzMiouICBGb3IKKy8vIGluc3RhbmNlLCBtYWxsb2MoKSBtaWdodCBiZSBpbXBsZW1lbnRlZCBhcyBhIEpNUCB0byBfX21hbGxvYygpLgorLy8gVGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBpbml0aWFsIEpNUHMgZm9yIHVzLCB1bnRpbCB3ZSBnZXQgdG8gdGhlCisvLyBwbGFjZSB3aGVyZSB0aGUgYWN0dWFsIGNvZGUgaXMgZGVmaW5lZC4gIElmIHdlIGdldCB0byBTVE9QX0JFRk9SRSwKKy8vIHdlIHJldHVybiB0aGUgYWRkcmVzcyBiZWZvcmUgc3RvcF9iZWZvcmUuICBUaGUgc3RvcF9iZWZvcmVfdHJhbXBvbGluZQorLy8gZmxhZyBpcyB1c2VkIGluIDY0LWJpdCBtb2RlLiAgSWYgdHJ1ZSwgd2Ugd2lsbCByZXR1cm4gdGhlIGFkZHJlc3MKKy8vIGJlZm9yZSBhIHRyYW1wb2xpbmUgaXMgZGV0ZWN0ZWQuICBUcmFtcG9saW5lcyBhcmUgZGVmaW5lZCBhczoKKy8vCisvLyAgICBub3AKKy8vICAgIG1vdiByYXgsIDxyZXBsYWNlbWVudF9mdW5jdGlvbj4KKy8vICAgIGptcCByYXgKKy8vCisvLyBTZWUgUHJlYW1ibGVQYXRjaGVyOjpSYXdQYXRjaFdpdGhTdHViIGZvciBtb3JlIGluZm9ybWF0aW9uLgordm9pZCogUHJlYW1ibGVQYXRjaGVyOjpSZXNvbHZlVGFyZ2V0SW1wbCh1bnNpZ25lZCBjaGFyKiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHN0b3BfYmVmb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0b3BfYmVmb3JlX3RyYW1wb2xpbmUpIHsKKyAgaWYgKHRhcmdldCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICB3aGlsZSAoMSkgeworICAgIHVuc2lnbmVkIGNoYXIqIG5ld190YXJnZXQ7CisgICAgaWYgKHRhcmdldFswXSA9PSBBU01fSk1QMzJSRUwpIHsKKyAgICAgIC8vIHRhcmdldFsxLTRdIGhvbGRzIHRoZSBwbGFjZSB0aGUgam1wIGdvZXMgdG8sIGJ1dCBpdCdzCisgICAgICAvLyByZWxhdGl2ZSB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KKyAgICAgIGludCByZWxhdGl2ZV9vZmZzZXQ7ICAgLy8gV2luZG93cyBndWFyYW50ZWVzIGludCBpcyA0IGJ5dGVzCisgICAgICBTSURFU1RFUF9BU1NFUlQoc2l6ZW9mKHJlbGF0aXZlX29mZnNldCkgPT0gNCk7CisgICAgICBtZW1jcHkocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oJnJlbGF0aXZlX29mZnNldCksCisgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4odGFyZ2V0ICsgMSksIDQpOworICAgICAgbmV3X3RhcmdldCA9IHRhcmdldCArIDUgKyByZWxhdGl2ZV9vZmZzZXQ7CisgICAgfSBlbHNlIGlmICh0YXJnZXRbMF0gPT0gQVNNX0pNUDhSRUwpIHsKKyAgICAgIC8vIFZpc3VhbCBTdHVkaW8gNy4xIGltcGxlbWVudHMgbmV3W10gYXMgYW4gOCBiaXQganVtcCB0byBuZXcKKyAgICAgIHNpZ25lZCBjaGFyIHJlbGF0aXZlX29mZnNldDsKKyAgICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHZvaWQqPigmcmVsYXRpdmVfb2Zmc2V0KSwKKyAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPih0YXJnZXQgKyAxKSwgMSk7CisgICAgICBuZXdfdGFyZ2V0ID0gdGFyZ2V0ICsgMiArIHJlbGF0aXZlX29mZnNldDsKKyAgICB9IGVsc2UgaWYgKHRhcmdldFswXSA9PSBBU01fSk1QMzJBQlNfMCAmJgorICAgICAgICAgICAgICAgdGFyZ2V0WzFdID09IEFTTV9KTVAzMkFCU18xKSB7CisgICAgam1wMzJyZWw6CisgICAgICAvLyBWaXN1YWwgc3R1ZGlvIHNlZW1zIHRvIHNvbWV0aW1lcyBkbyBpdCB0aGlzIHdheSBpbnN0ZWFkIG9mIHRoZQorICAgICAgLy8gcHJldmlvdXMgd2F5LiAgTm90IHN1cmUgd2hhdCB0aGUgcnVsZXMgYXJlLCBidXQgaXQgd2FzIGhhcHBlbmluZworICAgICAgLy8gd2l0aCBvcGVyYXRvciBuZXcgaW4gc29tZSBiaW5hcmllcy4KKyAgICAgIHZvaWQqKiBuZXdfdGFyZ2V0X3Y7CisgICAgICBpZiAoa0lzNjRCaXRCaW5hcnkpIHsKKyAgICAgICAgLy8gSW4gNjQtYml0IG1vZGUgSk1QcyBhcmUgUklQLXJlbGF0aXZlLCBub3QgYWJzb2x1dGUKKyAgICAgICAgaW50IHRhcmdldF9vZmZzZXQ7CisgICAgICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHZvaWQqPigmdGFyZ2V0X29mZnNldCksCisgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPih0YXJnZXQgKyAyKSwgNCk7CisgICAgICAgIG5ld190YXJnZXRfdiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPih0YXJnZXQgKyB0YXJnZXRfb2Zmc2V0ICsgNik7CisgICAgICB9IGVsc2UgeworICAgICAgICBTSURFU1RFUF9BU1NFUlQoc2l6ZW9mKG5ld190YXJnZXQpID09IDQpOworICAgICAgICBtZW1jcHkoJm5ld190YXJnZXRfdiwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4odGFyZ2V0ICsgMiksIDQpOworICAgICAgfQorICAgICAgbmV3X3RhcmdldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KCpuZXdfdGFyZ2V0X3YpOworICAgIH0gZWxzZSBpZiAoa0lzNjRCaXRCaW5hcnkgJiYgdGFyZ2V0WzBdID09IEFTTV9SRVhXCisgICAgICAgICAgICAgICAmJiB0YXJnZXRbMV0gPT0gQVNNX0pNUDMyQUJTXzAKKyAgICAgICAgICAgICAgICYmIHRhcmdldFsyXSA9PSBBU01fSk1QMzJBQlNfMSkgeworICAgICAgLy8gaW4gVmlzdWFsIFN0dWRpbyAyMDEyIHdlJ3JlIHNlZWluZyBqdW1wIGxpa2UgdGhhdDoKKyAgICAgIC8vICAgcmV4Llcgam1wcSAqMHgxMWQwMTkoJXJpcCkKKyAgICAgIC8vCisgICAgICAvLyBhY2NvcmRpbmcgdG8gZG9jcyBJIGhhdmUsIHJleCBwcmVmaXggaXMgYWN0dWFsbHkgdW5uZWVkZWQgYW5kCisgICAgICAvLyBjYW4gYmUgaWdub3JlZC4gSS5lLiBkb2NzIHNheSBmb3IganVtcHMgbGlrZSB0aGF0IG9wZXJhbmQKKyAgICAgIC8vIGFscmVhZHkgZGVmYXVsdHMgdG8gNjQtYml0LiBCdXQgY2xlYXJseSBpdCBicmVha3MgYWJzLiBqdW1wCisgICAgICAvLyBkZXRlY3Rpb24gYWJvdmUgYW5kIHdlIGp1c3Qgc2tpcCByZXgKKyAgICAgIHRhcmdldCsrOworICAgICAgZ290byBqbXAzMnJlbDsKKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChuZXdfdGFyZ2V0ID09IHN0b3BfYmVmb3JlKQorICAgICAgYnJlYWs7CisgICAgaWYgKHN0b3BfYmVmb3JlX3RyYW1wb2xpbmUgJiYgKm5ld190YXJnZXQgPT0gQVNNX05PUAorICAgICAgICAmJiBuZXdfdGFyZ2V0WzFdID09IEFTTV9SRVhXICYmIG5ld190YXJnZXRbMl0gPT0gQVNNX01PVlJBWF9JTU0pCisgICAgICBicmVhazsKKyAgICB0YXJnZXQgPSBuZXdfdGFyZ2V0OworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKKy8vIFNwZWNpYWwgY2FzZSBzY29wZWRfcHRyIHRvIGF2b2lkIGRlcGVuZGVuY3kgb24gc2NvcGVkX3B0ciBiZWxvdy4KK2NsYXNzIERlbGV0ZVVuc2lnbmVkQ2hhckFycmF5IHsKKyBwdWJsaWM6CisgIERlbGV0ZVVuc2lnbmVkQ2hhckFycmF5KHVuc2lnbmVkIGNoYXIqIGFycmF5KSA6IGFycmF5XyhhcnJheSkgeworICB9CisKKyAgfkRlbGV0ZVVuc2lnbmVkQ2hhckFycmF5KCkgeworICAgIGlmIChhcnJheV8pIHsKKyAgICAgIFByZWFtYmxlUGF0Y2hlcjo6RnJlZVByZWFtYmxlQmxvY2soYXJyYXlfKTsKKyAgICB9CisgIH0KKworICB1bnNpZ25lZCBjaGFyKiBSZWxlYXNlKCkgeworICAgIHVuc2lnbmVkIGNoYXIqIHRlbXAgPSBhcnJheV87CisgICAgYXJyYXlfID0gTlVMTDsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorCisgcHJpdmF0ZToKKyAgdW5zaWduZWQgY2hhciogYXJyYXlfOworfTsKKworU2lkZVN0ZXBFcnJvciBQcmVhbWJsZVBhdGNoZXI6OlJhd1BhdGNoV2l0aFN0dWJBbmRQcm90ZWN0aW9ucygKKyAgICB2b2lkKiB0YXJnZXRfZnVuY3Rpb24sIHZvaWQgKnJlcGxhY2VtZW50X2Z1bmN0aW9uLAorICAgIHVuc2lnbmVkIGNoYXIqIHByZWFtYmxlX3N0dWIsIHVuc2lnbmVkIGxvbmcgc3R1Yl9zaXplLAorICAgIHVuc2lnbmVkIGxvbmcqIGJ5dGVzX25lZWRlZCkgeworICAvLyBXZSBuZWVkIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gYSBwcm9jZXNzLWxvY2FsIGNvcHkgb2YgdGhlIGZpcnN0CisgIC8vIE1BWF9QUkVBTUJMRV9TVFVCX1NJWkUgYnl0ZXMgb2YgdGFyZ2V0X2Z1bmN0aW9uCisgIERXT1JEIG9sZF90YXJnZXRfZnVuY3Rpb25fcHJvdGVjdCA9IDA7CisgIEJPT0wgc3VjY2VlZGVkID0gOjpWaXJ0dWFsUHJvdGVjdChyZWludGVycHJldF9jYXN0PHZvaWQqPih0YXJnZXRfZnVuY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BSRUFNQkxFX1NUVUJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkX3RhcmdldF9mdW5jdGlvbl9wcm90ZWN0KTsKKyAgaWYgKCFzdWNjZWVkZWQpIHsKKyAgICBTSURFU1RFUF9BU1NFUlQoZmFsc2UgJiYgIkZhaWxlZCB0byBtYWtlIHBhZ2UgY29udGFpbmluZyB0YXJnZXQgZnVuY3Rpb24gIgorICAgICAgICAgICAgICAgICAgICAiY29weS1vbi13cml0ZS4iKTsKKyAgICByZXR1cm4gU0lERVNURVBfQUNDRVNTX0RFTklFRDsKKyAgfQorCisgIFNpZGVTdGVwRXJyb3IgZXJyb3JfY29kZSA9IFJhd1BhdGNoV2l0aFN0dWIodGFyZ2V0X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFtYmxlX3N0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R1Yl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX25lZWRlZCk7CisKKyAgLy8gUmVzdG9yZSB0aGUgcHJvdGVjdGlvbiBvZiB0aGUgZmlyc3QgTUFYX1BSRUFNQkxFX1NUVUJfU0laRSBieXRlcyBvZgorICAvLyBwVGFyZ2V0RnVuY3Rpb24gdG8gd2hhdCB0aGV5IHdlcmUgYmVmb3JlIHdlIHN0YXJ0ZWQgZ29vZmluZyBhcm91bmQuCisgIC8vIFdlIGRvIHRoaXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwYXRjaCBzdWNjZWVkZWQgb3Igbm90LgorICBzdWNjZWVkZWQgPSA6OlZpcnR1YWxQcm90ZWN0KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHRhcmdldF9mdW5jdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BSRUFNQkxFX1NUVUJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfdGFyZ2V0X2Z1bmN0aW9uX3Byb3RlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF90YXJnZXRfZnVuY3Rpb25fcHJvdGVjdCk7CisgIGlmICghc3VjY2VlZGVkKSB7CisgICAgU0lERVNURVBfQVNTRVJUKGZhbHNlICYmCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVzdG9yZSBwcm90ZWN0aW9uIHRvIHRhcmdldCBmdW5jdGlvbi4iKTsKKyAgICAvLyBXZSBtdXN0IG5vdCByZXR1cm4gYW4gZXJyb3IgaGVyZSBiZWNhdXNlIHRoZSBmdW5jdGlvbiBoYXMKKyAgICAvLyBsaWtlbHkgYWN0dWFsbHkgYmVlbiBwYXRjaGVkLCBhbmQgcmV0dXJuaW5nIGFuIGVycm9yIG1pZ2h0CisgICAgLy8gY2F1c2Ugb3VyIGNsaWVudCBjb2RlIG5vdCB0byB1bnBhdGNoIGl0LiAgU28gd2UganVzdCBrZWVwCisgICAgLy8gZ29pbmcuCisgIH0KKworICBpZiAoU0lERVNURVBfU1VDQ0VTUyAhPSBlcnJvcl9jb2RlKSB7ICAvLyBUZXN0aW5nIFJhd1BhdGNoV2l0aFN0dWIsIGFib3ZlCisgICAgU0lERVNURVBfQVNTRVJUKGZhbHNlKTsKKyAgICByZXR1cm4gZXJyb3JfY29kZTsKKyAgfQorCisgIC8vIEZsdXNoIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSB0byBtYWtlIHN1cmUgdGhlIHByb2Nlc3NvciBkb2Vzbid0IGV4ZWN1dGUgdGhlCisgIC8vIG9sZCB2ZXJzaW9uIG9mIHRoZSBpbnN0cnVjdGlvbnMgKGJlZm9yZSBvdXIgcGF0Y2gpLgorICAvLworICAvLyBGbHVzaEluc3RydWN0aW9uQ2FjaGUgaXMgYWN0dWFsbHkgYSBuby1vcCBhdCBsZWFzdCBvbgorICAvLyBzaW5nbGUtcHJvY2Vzc29yIFhQIG1hY2hpbmVzLiAgSSdtIG5vdCBzdXJlIHdoeSB0aGlzIGlzIHNvLCBidXQKKyAgLy8gaXQgaXMsIHlldCBJIHdhbnQgdG8ga2VlcCB0aGUgY2FsbCB0byB0aGUgQVBJIGhlcmUgZm9yCisgIC8vIGNvcnJlY3RuZXNzIGluIGNhc2UgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGluIHNvbWUgdmFyaWFudHMgb2YKKyAgLy8gV2luZG93cy9oYXJkd2FyZS4KKyAgc3VjY2VlZGVkID0gOjpGbHVzaEluc3RydWN0aW9uQ2FjaGUoOjpHZXRDdXJyZW50UHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QUkVBTUJMRV9TVFVCX1NJWkUpOworICBpZiAoIXN1Y2NlZWRlZCkgeworICAgIFNJREVTVEVQX0FTU0VSVChmYWxzZSAmJiAiRmFpbGVkIHRvIGZsdXNoIGluc3RydWN0aW9uIGNhY2hlLiIpOworICAgIC8vIFdlIG11c3Qgbm90IHJldHVybiBhbiBlcnJvciBoZXJlIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGhhcyBhY3R1YWxseQorICAgIC8vIGJlZW4gcGF0Y2hlZCwgYW5kIHJldHVybmluZyBhbiBlcnJvciB3b3VsZCBsaWtlbHkgY2F1c2Ugb3VyIGNsaWVudAorICAgIC8vIGNvZGUgbm90IHRvIHVucGF0Y2ggaXQuICBTbyB3ZSBqdXN0IGtlZXAgZ29pbmcuCisgIH0KKworICByZXR1cm4gU0lERVNURVBfU1VDQ0VTUzsKK30KKworU2lkZVN0ZXBFcnJvciBQcmVhbWJsZVBhdGNoZXI6OlJhd1BhdGNoKHZvaWQqIHRhcmdldF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiByZXBsYWNlbWVudF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogb3JpZ2luYWxfZnVuY3Rpb25fc3R1YikgeworICBpZiAoIXRhcmdldF9mdW5jdGlvbiB8fCAhcmVwbGFjZW1lbnRfZnVuY3Rpb24gfHwgIW9yaWdpbmFsX2Z1bmN0aW9uX3N0dWIgfHwKKyAgICAgICgqb3JpZ2luYWxfZnVuY3Rpb25fc3R1YikgfHwgdGFyZ2V0X2Z1bmN0aW9uID09IHJlcGxhY2VtZW50X2Z1bmN0aW9uKSB7CisgICAgU0lERVNURVBfQVNTRVJUKGZhbHNlICYmICJQcmVjb25kaXRpb25zIG5vdCBtZXQiKTsKKyAgICByZXR1cm4gU0lERVNURVBfSU5WQUxJRF9QQVJBTUVURVI7CisgIH0KKworICBCT09MIHN1Y2NlZWRlZCA9IEZBTFNFOworCisgIC8vIEZpcnN0LCBkZWFsIHdpdGggYSBzcGVjaWFsIGNhc2UgdGhhdCB3ZSBzZWUgd2l0aCBmdW5jdGlvbnMgdGhhdAorICAvLyBwb2ludCBpbnRvIGFuIElBVCB0YWJsZSAoaW5jbHVkaW5nIGZ1bmN0aW9ucyBsaW5rZWQgc3RhdGljYWxseQorICAvLyBpbnRvIHRoZSBhcHBsaWNhdGlvbik6IHRoZXNlIGZ1bmN0aW9uIGFscmVhZHkgc3RhcnRzIHdpdGgKKyAgLy8gQVNNX0pNUDMyUkVMLiAgRm9yIGluc3RhbmNlLCBtYWxsb2MoKSBtaWdodCBiZSBpbXBsZW1lbnRlZCBhcyBhCisgIC8vIEpNUCB0byBfX21hbGxvYygpLiAgSW4gdGhhdCBjYXNlLCB3ZSByZXBsYWNlIHRoZSBkZXN0aW5hdGlvbiBvZgorICAvLyB0aGUgSk1QIChfX21hbGxvYyksIHJhdGhlciB0aGFuIHRoZSBKTVAgaXRzZWxmIChtYWxsb2MpLiAgVGhpcworICAvLyB3YXkgd2UgZ2V0IHRoZSBjb3JyZWN0IGJlaGF2aW9yIG5vIG1hdHRlciBob3cgbWFsbG9jIGdldHMgY2FsbGVkLgorICB2b2lkKiBuZXdfdGFyZ2V0ID0gUmVzb2x2ZVRhcmdldCh0YXJnZXRfZnVuY3Rpb24pOworICBpZiAobmV3X3RhcmdldCAhPSB0YXJnZXRfZnVuY3Rpb24pIHsKKyAgICB0YXJnZXRfZnVuY3Rpb24gPSBuZXdfdGFyZ2V0OworICB9CisKKyAgLy8gSW4gNjQtYml0IG1vZGUsIHByZWFtYmxlX3N0dWIgbXVzdCBiZSB3aXRoaW4gMkdCIG9mIHRhcmdldCBmdW5jdGlvbgorICAvLyBzbyB0aGF0IGlmIHRhcmdldCBjb250YWlucyBhIGp1bXAsIHdlIGNhbiB0cmFuc2xhdGUgaXQuCisgIHVuc2lnbmVkIGNoYXIqIHByZWFtYmxlX3N0dWIgPSBBbGxvY1ByZWFtYmxlQmxvY2tOZWFyKHRhcmdldF9mdW5jdGlvbik7CisgIGlmICghcHJlYW1ibGVfc3R1YikgeworICAgIFNJREVTVEVQX0FTU0VSVChmYWxzZSAmJiAiVW5hYmxlIHRvIGFsbG9jYXRlIHByZWFtYmxlLXN0dWIuIik7CisgICAgcmV0dXJuIFNJREVTVEVQX0lOU1VGRklDSUVOVF9CVUZGRVI7CisgIH0KKworICAvLyBGcmVlcyB0aGUgYXJyYXkgYXQgZW5kIG9mIHNjb3BlLgorICBEZWxldGVVbnNpZ25lZENoYXJBcnJheSBndWFyZF9wcmVhbWJsZV9zdHViKHByZWFtYmxlX3N0dWIpOworCisgIFNpZGVTdGVwRXJyb3IgZXJyb3JfY29kZSA9IFJhd1BhdGNoV2l0aFN0dWJBbmRQcm90ZWN0aW9ucygKKyAgICAgIHRhcmdldF9mdW5jdGlvbiwgcmVwbGFjZW1lbnRfZnVuY3Rpb24sIHByZWFtYmxlX3N0dWIsCisgICAgICBNQVhfUFJFQU1CTEVfU1RVQl9TSVpFLCBOVUxMKTsKKworICBpZiAoU0lERVNURVBfU1VDQ0VTUyAhPSBlcnJvcl9jb2RlKSB7CisgICAgU0lERVNURVBfQVNTRVJUKGZhbHNlKTsKKyAgICByZXR1cm4gZXJyb3JfY29kZTsKKyAgfQorCisgIC8vIEZsdXNoIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSB0byBtYWtlIHN1cmUgdGhlIHByb2Nlc3NvciBkb2Vzbid0IGV4ZWN1dGUgdGhlCisgIC8vIG9sZCB2ZXJzaW9uIG9mIHRoZSBpbnN0cnVjdGlvbnMgKGJlZm9yZSBvdXIgcGF0Y2gpLgorICAvLworICAvLyBGbHVzaEluc3RydWN0aW9uQ2FjaGUgaXMgYWN0dWFsbHkgYSBuby1vcCBhdCBsZWFzdCBvbgorICAvLyBzaW5nbGUtcHJvY2Vzc29yIFhQIG1hY2hpbmVzLiAgSSdtIG5vdCBzdXJlIHdoeSB0aGlzIGlzIHNvLCBidXQKKyAgLy8gaXQgaXMsIHlldCBJIHdhbnQgdG8ga2VlcCB0aGUgY2FsbCB0byB0aGUgQVBJIGhlcmUgZm9yCisgIC8vIGNvcnJlY3RuZXNzIGluIGNhc2UgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGluIHNvbWUgdmFyaWFudHMgb2YKKyAgLy8gV2luZG93cy9oYXJkd2FyZS4KKyAgc3VjY2VlZGVkID0gOjpGbHVzaEluc3RydWN0aW9uQ2FjaGUoOjpHZXRDdXJyZW50UHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QUkVBTUJMRV9TVFVCX1NJWkUpOworICBpZiAoIXN1Y2NlZWRlZCkgeworICAgIFNJREVTVEVQX0FTU0VSVChmYWxzZSAmJiAiRmFpbGVkIHRvIGZsdXNoIGluc3RydWN0aW9uIGNhY2hlLiIpOworICAgIC8vIFdlIG11c3Qgbm90IHJldHVybiBhbiBlcnJvciBoZXJlIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGhhcyBhY3R1YWxseQorICAgIC8vIGJlZW4gcGF0Y2hlZCwgYW5kIHJldHVybmluZyBhbiBlcnJvciB3b3VsZCBsaWtlbHkgY2F1c2Ugb3VyIGNsaWVudAorICAgIC8vIGNvZGUgbm90IHRvIHVucGF0Y2ggaXQuICBTbyB3ZSBqdXN0IGtlZXAgZ29pbmcuCisgIH0KKworICBTSURFU1RFUF9MT0coIlByZWFtYmxlUGF0Y2hlcjo6UmF3UGF0Y2ggc3VjY2Vzc2Z1bGx5IHBhdGNoZWQuIik7CisKKyAgLy8gZGV0YWNoIHRoZSBzY29wZWQgcG9pbnRlciBzbyB0aGUgbWVtb3J5IGlzIG5vdCBmcmVlZAorICAqb3JpZ2luYWxfZnVuY3Rpb25fc3R1YiA9CisgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihndWFyZF9wcmVhbWJsZV9zdHViLlJlbGVhc2UoKSk7CisgIHJldHVybiBTSURFU1RFUF9TVUNDRVNTOworfQorCitTaWRlU3RlcEVycm9yIFByZWFtYmxlUGF0Y2hlcjo6VW5wYXRjaCh2b2lkKiB0YXJnZXRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiByZXBsYWNlbWVudF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG9yaWdpbmFsX2Z1bmN0aW9uX3N0dWIpIHsKKyAgU0lERVNURVBfQVNTRVJUKHRhcmdldF9mdW5jdGlvbiAmJiByZXBsYWNlbWVudF9mdW5jdGlvbiAmJgorICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfZnVuY3Rpb25fc3R1Yik7CisgIGlmICghdGFyZ2V0X2Z1bmN0aW9uIHx8ICFyZXBsYWNlbWVudF9mdW5jdGlvbiB8fAorICAgICAgIW9yaWdpbmFsX2Z1bmN0aW9uX3N0dWIpIHsKKyAgICByZXR1cm4gU0lERVNURVBfSU5WQUxJRF9QQVJBTUVURVI7CisgIH0KKworICAvLyBCZWZvcmUgdW5wYXRjaGluZywgdGFyZ2V0X2Z1bmN0aW9uIHNob3VsZCBiZSBhIEpNUCB0bworICAvLyByZXBsYWNlbWVudF9mdW5jdGlvbi4gIElmIGl0J3Mgbm90LCB0aGVuIGVpdGhlciBpdCdzIGFuIGVycm9yLCBvcgorICAvLyB3ZSdyZSBmYWxsaW5nIGludG8gdGhlIGNhc2Ugd2hlcmUgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIHdhcyBhCisgIC8vIEpNUCwgYW5kIHdlIHBhdGNoZWQgdGhlIGp1bXBlZF90byBhZGRyZXNzIHJhdGhlciB0aGFuIHRoZSBKTVAKKyAgLy8gaXRzZWxmLiAgKEZvciBpbnN0YW5jZSwgaWYgbWFsbG9jKCkgaXMganVzdCBhIEpNUCB0byBfX21hbGxvYygpLAorICAvLyB3ZSBwYXRjaGVkIF9fbWFsbG9jKCkgYW5kIG5vdCBtYWxsb2MoKS4pCisgIHVuc2lnbmVkIGNoYXIqIHRhcmdldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHRhcmdldF9mdW5jdGlvbik7CisgIHRhcmdldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KAorICAgICAgUmVzb2x2ZVRhcmdldEltcGwoCisgICAgICAgICAgdGFyZ2V0LCByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihyZXBsYWNlbWVudF9mdW5jdGlvbiksCisgICAgICAgICAgdHJ1ZSkpOworICAvLyBXZSBzaG91bGQgZW5kIGF0IHRoZSBmdW5jdGlvbiB3ZSBwYXRjaGVkLiAgV2hlbiB3ZSBwYXRjaCwgd2UgaW5zZXJ0CisgIC8vIGEgQVNNX0pNUDMyUkVMIGluc3RydWN0aW9uLCBzbyBsb29rIGZvciB0aGF0IGFzIGEgc2FuaXR5IGNoZWNrLgorICBpZiAodGFyZ2V0WzBdICE9IEFTTV9KTVAzMlJFTCkgeworICAgIFNJREVTVEVQX0FTU0VSVChmYWxzZSAmJgorICAgICAgICAgICAgICAgICAgICAidGFyZ2V0X2Z1bmN0aW9uIGRvZXMgbm90IGxvb2sgbGlrZSBpdCB3YXMgcGF0Y2hlZC4iKTsKKyAgICByZXR1cm4gU0lERVNURVBfSU5WQUxJRF9QQVJBTUVURVI7CisgIH0KKworICBjb25zdCB1bnNpZ25lZCBpbnQga1JlcXVpcmVkVGFyZ2V0UGF0Y2hCeXRlcyA9IDU7CisKKyAgLy8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIHdyaXRlIHRvIGEgcHJvY2Vzcy1sb2NhbCBjb3B5IG9mIHRoZSBmaXJzdAorICAvLyBrUmVxdWlyZWRUYXJnZXRQYXRjaEJ5dGVzIGJ5dGVzIG9mIHRhcmdldF9mdW5jdGlvbgorICBEV09SRCBvbGRfdGFyZ2V0X2Z1bmN0aW9uX3Byb3RlY3QgPSAwOworICBCT09MIHN1Y2NlZWRlZCA9IDo6VmlydHVhbFByb3RlY3QocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4odGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlZFRhcmdldFBhdGNoQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF90YXJnZXRfZnVuY3Rpb25fcHJvdGVjdCk7CisgIGlmICghc3VjY2VlZGVkKSB7CisgICAgU0lERVNURVBfQVNTRVJUKGZhbHNlICYmICJGYWlsZWQgdG8gbWFrZSBwYWdlIGNvbnRhaW5pbmcgdGFyZ2V0IGZ1bmN0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgImNvcHktb24td3JpdGUuIik7CisgICAgcmV0dXJuIFNJREVTVEVQX0FDQ0VTU19ERU5JRUQ7CisgIH0KKworICB1bnNpZ25lZCBjaGFyKiBwcmVhbWJsZV9zdHViID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsX2Z1bmN0aW9uX3N0dWIpOworCisgIC8vIERpc2Fzc2VtYmxlIHRoZSBwcmVhbWJsZSBvZiBzdHViIGFuZCBjb3B5IHRoZSBieXRlcyBiYWNrIHRvIHRhcmdldC4KKyAgLy8gSWYgd2UndmUgZG9uZSBhbnkgY29uZGl0aW9uYWwganVtcHMgaW4gdGhlIHByZWFtYmxlIHdlIG5lZWQgdG8gY29udmVydAorICAvLyB0aGVtIGJhY2sgdG8gdGhlIG9yaWdpbmFsIFJFTDgganVtcHMgaW4gdGhlIHRhcmdldC4KKyAgTWluaURpc2Fzc2VtYmxlciBkaXNhc3NlbWJsZXI7CisgIHVuc2lnbmVkIGludCBwcmVhbWJsZV9ieXRlcyA9IDA7CisgIHVuc2lnbmVkIGludCB0YXJnZXRfYnl0ZXMgPSAwOworICB3aGlsZSAodGFyZ2V0X2J5dGVzIDwga1JlcXVpcmVkVGFyZ2V0UGF0Y2hCeXRlcykgeworICAgIHVuc2lnbmVkIGludCBjdXJfYnl0ZXMgPSAwOworICAgIEluc3RydWN0aW9uVHlwZSBpbnN0cnVjdGlvbl90eXBlID0KKyAgICAgICAgZGlzYXNzZW1ibGVyLkRpc2Fzc2VtYmxlKHByZWFtYmxlX3N0dWIgKyBwcmVhbWJsZV9ieXRlcywgY3VyX2J5dGVzKTsKKyAgICBpZiAoSVRfSlVNUCA9PSBpbnN0cnVjdGlvbl90eXBlKSB7CisgICAgICB1bnNpZ25lZCBpbnQganVtcF9ieXRlcyA9IDA7CisgICAgICBTaWRlU3RlcEVycm9yIGp1bXBfcmV0ID0gU0lERVNURVBfSlVNUF9JTlNUUlVDVElPTjsKKyAgICAgIGlmIChJc05lYXJDb25kaXRpb25hbEp1bXAocHJlYW1ibGVfc3R1YiArIHByZWFtYmxlX2J5dGVzLCBjdXJfYnl0ZXMpIHx8CisgICAgICAgICAgSXNOZWFyUmVsYXRpdmVKdW1wKHByZWFtYmxlX3N0dWIgKyBwcmVhbWJsZV9ieXRlcywgY3VyX2J5dGVzKSB8fAorICAgICAgICAgIElzTmVhckFic29sdXRlQ2FsbChwcmVhbWJsZV9zdHViICsgcHJlYW1ibGVfYnl0ZXMsIGN1cl9ieXRlcykgfHwKKyAgICAgICAgICBJc05lYXJSZWxhdGl2ZUNhbGwocHJlYW1ibGVfc3R1YiArIHByZWFtYmxlX2J5dGVzLCBjdXJfYnl0ZXMpKSB7CisgICAgICAgIGp1bXBfcmV0ID0gUGF0Y2hOZWFySnVtcE9yQ2FsbChwcmVhbWJsZV9zdHViICsgcHJlYW1ibGVfYnl0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2J5dGVzLCB0YXJnZXQgKyB0YXJnZXRfYnl0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmp1bXBfYnl0ZXMsIE1BWF9QUkVBTUJMRV9TVFVCX1NJWkUpOworICAgICAgfQorICAgICAgaWYgKGp1bXBfcmV0ID09IFNJREVTVEVQX0pVTVBfSU5TVFJVQ1RJT04pIHsKKyAgICAgICAgU0lERVNURVBfQVNTRVJUKGZhbHNlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgdW5zdXBwb3J0ZWQganVtcCBpbnN0cnVjdGlvbiBpbiBzdHViISEiKTsKKyAgICAgICAgcmV0dXJuIFNJREVTVEVQX1VOU1VQUE9SVEVEX0lOU1RSVUNUSU9OOworICAgICAgfQorICAgICAgdGFyZ2V0X2J5dGVzICs9IGp1bXBfYnl0ZXM7CisgICAgfSBlbHNlIGlmIChJVF9HRU5FUklDID09IGluc3RydWN0aW9uX3R5cGUpIHsKKyAgICAgIGlmIChJc01vdldpdGhEaXNwbGFjZW1lbnQocHJlYW1ibGVfc3R1YiArIHByZWFtYmxlX2J5dGVzLCBjdXJfYnl0ZXMpKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBtb3ZfYnl0ZXMgPSAwOworICAgICAgICBpZiAoUGF0Y2hNb3ZXaXRoRGlzcGxhY2VtZW50KHByZWFtYmxlX3N0dWIgKyBwcmVhbWJsZV9ieXRlcywgY3VyX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCArIHRhcmdldF9ieXRlcywgJm1vdl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUFJFQU1CTEVfU1RVQl9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IFNJREVTVEVQX1NVQ0NFU1MpIHsKKyAgICAgICAgICBTSURFU1RFUF9BU1NFUlQoZmFsc2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvdW5kIHVuc3VwcG9ydGVkIGdlbmVyaWMgaW5zdHJ1Y3Rpb24gaW4gc3R1YiEhIik7CisgICAgICAgICAgcmV0dXJuIFNJREVTVEVQX1VOU1VQUE9SVEVEX0lOU1RSVUNUSU9OOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4odGFyZ2V0ICsgdGFyZ2V0X2J5dGVzKSwKKyAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KAorICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsX2Z1bmN0aW9uX3N0dWIpICsgcHJlYW1ibGVfYnl0ZXMpLCBjdXJfYnl0ZXMpOworICAgICAgICB0YXJnZXRfYnl0ZXMgKz0gY3VyX2J5dGVzOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBTSURFU1RFUF9BU1NFUlQoZmFsc2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgdW5zdXBwb3J0ZWQgaW5zdHJ1Y3Rpb24gaW4gc3R1YiEhIik7CisgICAgICByZXR1cm4gU0lERVNURVBfVU5TVVBQT1JURURfSU5TVFJVQ1RJT047CisgICAgfQorICAgIHByZWFtYmxlX2J5dGVzICs9IGN1cl9ieXRlczsKKyAgfQorCisgIEZyZWVQcmVhbWJsZUJsb2NrKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KG9yaWdpbmFsX2Z1bmN0aW9uX3N0dWIpKTsKKworICAvLyBSZXN0b3JlIHRoZSBwcm90ZWN0aW9uIG9mIHRoZSBmaXJzdCBrUmVxdWlyZWRUYXJnZXRQYXRjaEJ5dGVzIGJ5dGVzIG9mCisgIC8vIHRhcmdldCB0byB3aGF0IHRoZXkgd2VyZSBiZWZvcmUgd2Ugc3RhcnRlZCBnb29maW5nIGFyb3VuZC4KKyAgc3VjY2VlZGVkID0gOjpWaXJ0dWFsUHJvdGVjdChyZWludGVycHJldF9jYXN0PHZvaWQqPih0YXJnZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlZFRhcmdldFBhdGNoQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3RhcmdldF9mdW5jdGlvbl9wcm90ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGRfdGFyZ2V0X2Z1bmN0aW9uX3Byb3RlY3QpOworCisgIC8vIEZsdXNoIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSB0byBtYWtlIHN1cmUgdGhlIHByb2Nlc3NvciBkb2Vzbid0IGV4ZWN1dGUgdGhlCisgIC8vIG9sZCB2ZXJzaW9uIG9mIHRoZSBpbnN0cnVjdGlvbnMgKGJlZm9yZSBvdXIgcGF0Y2gpLgorICAvLworICAvLyBTZWUgY29tbWVudCBvbiBGbHVzaEluc3RydWN0aW9uQ2FjaGUgZWxzZXdoZXJlIGluIHRoaXMgZmlsZS4KKyAgc3VjY2VlZGVkID0gOjpGbHVzaEluc3RydWN0aW9uQ2FjaGUoOjpHZXRDdXJyZW50UHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QUkVBTUJMRV9TVFVCX1NJWkUpOworICBpZiAoIXN1Y2NlZWRlZCkgeworICAgIFNJREVTVEVQX0FTU0VSVChmYWxzZSAmJiAiRmFpbGVkIHRvIGZsdXNoIGluc3RydWN0aW9uIGNhY2hlLiIpOworICAgIHJldHVybiBTSURFU1RFUF9VTkVYUEVDVEVEOworICB9CisKKyAgU0lERVNURVBfTE9HKCJQcmVhbWJsZVBhdGNoZXI6OlVucGF0Y2ggc3VjY2Vzc2Z1bGx5IHVucGF0Y2hlZC4iKTsKKyAgcmV0dXJuIFNJREVTVEVQX1NVQ0NFU1M7Cit9CisKK3ZvaWQgUHJlYW1ibGVQYXRjaGVyOjpJbml0aWFsaXplKCkgeworICBpZiAoIWluaXRpYWxpemVkXykgeworICAgIFNZU1RFTV9JTkZPIHNpID0geyAwIH07CisgICAgOjpHZXRTeXN0ZW1JbmZvKCZzaSk7CisgICAgZ3JhbnVsYXJpdHlfID0gc2kuZHdBbGxvY2F0aW9uR3JhbnVsYXJpdHk7CisgICAgcGFnZXNpemVfID0gc2kuZHdQYWdlU2l6ZTsKKyAgICBpbml0aWFsaXplZF8gPSB0cnVlOworICB9Cit9CisKK3Vuc2lnbmVkIGNoYXIqIFByZWFtYmxlUGF0Y2hlcjo6QWxsb2NQcmVhbWJsZUJsb2NrTmVhcih2b2lkKiB0YXJnZXQpIHsKKyAgUHJlYW1ibGVQYWdlKiBwcmVhbWJsZV9wYWdlID0gcHJlYW1ibGVfcGFnZXNfOworICB3aGlsZSAocHJlYW1ibGVfcGFnZSAhPSBOVUxMKSB7CisgICAgaWYgKHByZWFtYmxlX3BhZ2UtPmZyZWVfICE9IE5VTEwpIHsKKyAgICAgIF9faW50NjQgdmFsID0gcmVpbnRlcnByZXRfY2FzdDxfX2ludDY0PihwcmVhbWJsZV9wYWdlKSAtCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxfX2ludDY0Pih0YXJnZXQpOworICAgICAgaWYgKCh2YWwgPiAwICYmIHZhbCArIHBhZ2VzaXplXyA8PSBJTlRfTUFYKSB8fAorICAgICAgICAgICh2YWwgPCAwICYmIHZhbCA+PSBJTlRfTUlOKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcHJlYW1ibGVfcGFnZSA9IHByZWFtYmxlX3BhZ2UtPm5leHRfOworICB9CisKKyAgLy8gVGhlIGZyZWVfIG1lbWJlciBvZiB0aGUgcGFnZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBuZXh0IGF2YWlsYWJsZSBibG9jaworICAvLyBvZiBtZW1vcnkgdG8gdXNlIG9yIE5VTEwgaWYgdGhlcmUgYXJlIG5vIGNodW5rcyBhdmFpbGFibGUsIGluIHdoaWNoIGNhc2UKKyAgLy8gd2UnbGwgYWxsb2NhdGUgYSBuZXcgcGFnZS4KKyAgaWYgKHByZWFtYmxlX3BhZ2UgPT0gTlVMTCB8fCBwcmVhbWJsZV9wYWdlLT5mcmVlXyA9PSBOVUxMKSB7CisgICAgLy8gQ3JlYXRlIGEgbmV3IHByZWFtYmxlIHBhZ2UgYW5kIGluaXRpYWxpemUgdGhlIGZyZWUgbGlzdAorICAgIHByZWFtYmxlX3BhZ2UgPSByZWludGVycHJldF9jYXN0PFByZWFtYmxlUGFnZSo+KEFsbG9jUGFnZU5lYXIodGFyZ2V0KSk7CisgICAgU0lERVNURVBfQVNTRVJUKHByZWFtYmxlX3BhZ2UgIT0gTlVMTCAmJiAiQ291bGQgbm90IGFsbG9jYXRlIHBhZ2UhIik7CisgICAgdm9pZCoqIHBwID0gJnByZWFtYmxlX3BhZ2UtPmZyZWVfOworICAgIHVuc2lnbmVkIGNoYXIqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHByZWFtYmxlX3BhZ2UpICsKKyAgICAgICAgTUFYX1BSRUFNQkxFX1NUVUJfU0laRTsKKyAgICB1bnNpZ25lZCBjaGFyKiBsaW1pdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHByZWFtYmxlX3BhZ2UpICsKKyAgICAgICAgcGFnZXNpemVfOworICAgIHdoaWxlIChwdHIgPCBsaW1pdCkgeworICAgICAgKnBwID0gcHRyOworICAgICAgcHAgPSByZWludGVycHJldF9jYXN0PHZvaWQqKj4ocHRyKTsKKyAgICAgIHB0ciArPSBNQVhfUFJFQU1CTEVfU1RVQl9TSVpFOworICAgIH0KKyAgICAqcHAgPSBOVUxMOworICAgIC8vIEluc2VydCB0aGUgbmV3IHBhZ2UgaW50byB0aGUgbGlzdAorICAgIHByZWFtYmxlX3BhZ2UtPm1hZ2ljXyA9IGtQcmVhbWJsZVBhZ2VNYWdpYzsKKyAgICBwcmVhbWJsZV9wYWdlLT5uZXh0XyA9IHByZWFtYmxlX3BhZ2VzXzsKKyAgICBwcmVhbWJsZV9wYWdlc18gPSBwcmVhbWJsZV9wYWdlOworICB9CisgIHVuc2lnbmVkIGNoYXIqIHJldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHByZWFtYmxlX3BhZ2UtPmZyZWVfKTsKKyAgcHJlYW1ibGVfcGFnZS0+ZnJlZV8gPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPihwcmVhbWJsZV9wYWdlLT5mcmVlXykpOworICByZXR1cm4gcmV0OworfQorCit2b2lkIFByZWFtYmxlUGF0Y2hlcjo6RnJlZVByZWFtYmxlQmxvY2sodW5zaWduZWQgY2hhciogYmxvY2spIHsKKyAgU0lERVNURVBfQVNTRVJUKGJsb2NrICE9IE5VTEwpOworICBTSURFU1RFUF9BU1NFUlQoZ3JhbnVsYXJpdHlfICE9IDApOworICB1aW50cHRyX3QgcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGJsb2NrKTsKKyAgcHRyIC09IHB0ciAmIChncmFudWxhcml0eV8gLSAxKTsKKyAgUHJlYW1ibGVQYWdlKiBwcmVhbWJsZV9wYWdlID0gcmVpbnRlcnByZXRfY2FzdDxQcmVhbWJsZVBhZ2UqPihwdHIpOworICBTSURFU1RFUF9BU1NFUlQocHJlYW1ibGVfcGFnZS0+bWFnaWNfID09IGtQcmVhbWJsZVBhZ2VNYWdpYyk7CisgICoocmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KGJsb2NrKSkgPSBwcmVhbWJsZV9wYWdlLT5mcmVlXzsKKyAgcHJlYW1ibGVfcGFnZS0+ZnJlZV8gPSBibG9jazsKK30KKwordm9pZCogUHJlYW1ibGVQYXRjaGVyOjpBbGxvY1BhZ2VOZWFyKHZvaWQqIHRhcmdldCkgeworICBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04gbWJpID0geyAwIH07CisgIGlmICghOjpWaXJ0dWFsUXVlcnkodGFyZ2V0LCAmbWJpLCBzaXplb2YobWJpKSkpIHsKKyAgICBTSURFU1RFUF9BU1NFUlQoZmFsc2UgJiYgIlZpcnR1YWxRdWVyeSBmYWlsZWQgb24gdGFyZ2V0IGFkZHJlc3MiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoaW5pdGlhbGl6ZWRfID09IGZhbHNlKSB7CisgICAgUHJlYW1ibGVQYXRjaGVyOjpJbml0aWFsaXplKCk7CisgICAgU0lERVNURVBfQVNTRVJUKGluaXRpYWxpemVkXyk7CisgIH0KKyAgdm9pZCogcHYgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyKiBhbGxvY2F0aW9uX2Jhc2UgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPigKKyAgICAgIG1iaS5BbGxvY2F0aW9uQmFzZSk7CisgIF9faW50NjQgaSA9IDE7CisgIGJvb2wgaGlnaF90YXJnZXQgPSByZWludGVycHJldF9jYXN0PF9faW50NjQ+KHRhcmdldCkgPiBVSU5UX01BWDsKKyAgd2hpbGUgKHB2ID09IE5VTEwpIHsKKyAgICBfX2ludDY0IHZhbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8X19pbnQ2ND4oYWxsb2NhdGlvbl9iYXNlKSAtCisgICAgICAgIChpICogZ3JhbnVsYXJpdHlfKTsKKyAgICBpZiAoaGlnaF90YXJnZXQgJiYKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxfX2ludDY0Pih0YXJnZXQpIC0gdmFsID4gSU5UX01BWCkgeworICAgICAgICAvLyBXZSdyZSBmdXJ0aGVyIHRoYW4gMkdCIGZyb20gdGhlIHRhcmdldAorICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmICh2YWwgPD0gTlVMTCkgeworICAgICAgLy8gTGVzcyB0aGFuIDAKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwdiA9IDo6VmlydHVhbEFsbG9jKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFsbG9jYXRpb25fYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkrKyAqIGdyYW51bGFyaXR5XykpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFnZXNpemVfLCBNRU1fQ09NTUlUIHwgTUVNX1JFU0VSVkUsCisgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFKTsKKyAgfQorCisgIC8vIFdlIGNvdWxkbid0IGFsbG9jYXRlIGxvdywgdHJ5IHRvIGFsbG9jYXRlIGhpZ2gKKyAgaWYgKHB2ID09IE5VTEwpIHsKKyAgICBpID0gMTsKKyAgICAvLyBSb3VuZCB1cCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiBwYWdlIGdyYW51bGFyaXR5CisgICAgYWxsb2NhdGlvbl9iYXNlID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oCisgICAgICAgIChyZWludGVycHJldF9jYXN0PF9faW50NjQ+KHRhcmdldCkgJgorICAgICAgICAofihncmFudWxhcml0eV8gLSAxKSkpICsgZ3JhbnVsYXJpdHlfKTsKKyAgICB3aGlsZSAocHYgPT0gTlVMTCkgeworICAgICAgX19pbnQ2NCB2YWwgPSByZWludGVycHJldF9jYXN0PF9faW50NjQ+KGFsbG9jYXRpb25fYmFzZSkgKworICAgICAgICAgIChpICogZ3JhbnVsYXJpdHlfKSAtIHJlaW50ZXJwcmV0X2Nhc3Q8X19pbnQ2ND4odGFyZ2V0KTsKKyAgICAgIGlmICh2YWwgPiBJTlRfTUFYIHx8IHZhbCA8IDApIHsKKyAgICAgICAgLy8gV2UncmUgdG9vIGZhciBvciB3ZSBvdmVyZmxvd2VkCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcHYgPSA6OlZpcnR1YWxBbGxvYyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhbGxvY2F0aW9uX2Jhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkrKyAqIGdyYW51bGFyaXR5XykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlc2l6ZV8sIE1FTV9DT01NSVQgfCBNRU1fUkVTRVJWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9FWEVDVVRFX1JFQURXUklURSk7CisgICAgfQorICB9CisgIHJldHVybiBwdjsKK30KKworYm9vbCBQcmVhbWJsZVBhdGNoZXI6OklzU2hvcnRDb25kaXRpb25hbEp1bXAoCisgICAgdW5zaWduZWQgY2hhciogdGFyZ2V0LAorICAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbl9zaXplKSB7CisgIHJldHVybiAoKih0YXJnZXQpICYgMHg3MCkgPT0gMHg3MCAmJiBpbnN0cnVjdGlvbl9zaXplID09IDI7Cit9CisKK2Jvb2wgUHJlYW1ibGVQYXRjaGVyOjpJc1Nob3J0SnVtcCgKKyAgICB1bnNpZ25lZCBjaGFyKiB0YXJnZXQsCisgICAgdW5zaWduZWQgaW50IGluc3RydWN0aW9uX3NpemUpIHsKKyAgcmV0dXJuIHRhcmdldFswXSA9PSAweGViICYmIGluc3RydWN0aW9uX3NpemUgPT0gMjsKK30KKworYm9vbCBQcmVhbWJsZVBhdGNoZXI6OklzTmVhckNvbmRpdGlvbmFsSnVtcCgKKyAgICB1bnNpZ25lZCBjaGFyKiB0YXJnZXQsCisgICAgdW5zaWduZWQgaW50IGluc3RydWN0aW9uX3NpemUpIHsKKyAgcmV0dXJuICoodGFyZ2V0KSA9PSAweGYgJiYgKCoodGFyZ2V0ICsgMSkgJiAweDgwKSA9PSAweDgwICYmCisgICAgICBpbnN0cnVjdGlvbl9zaXplID09IDY7Cit9CisKK2Jvb2wgUHJlYW1ibGVQYXRjaGVyOjpJc05lYXJSZWxhdGl2ZUp1bXAoCisgICAgdW5zaWduZWQgY2hhciogdGFyZ2V0LAorICAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbl9zaXplKSB7CisgIHJldHVybiAqKHRhcmdldCkgPT0gMHhlOSAmJiBpbnN0cnVjdGlvbl9zaXplID09IDU7Cit9CisKK2Jvb2wgUHJlYW1ibGVQYXRjaGVyOjpJc05lYXJBYnNvbHV0ZUNhbGwoCisgICAgdW5zaWduZWQgY2hhciogdGFyZ2V0LAorICAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbl9zaXplKSB7CisgIHJldHVybiAqKHRhcmdldCkgPT0gMHhmZiAmJiAoKih0YXJnZXQgKyAxKSAmIDB4MTApID09IDB4MTAgJiYKKyAgICAgIGluc3RydWN0aW9uX3NpemUgPT0gNjsKK30KKworYm9vbCBQcmVhbWJsZVBhdGNoZXI6OklzTmVhclJlbGF0aXZlQ2FsbCgKKyAgICB1bnNpZ25lZCBjaGFyKiB0YXJnZXQsCisgICAgdW5zaWduZWQgaW50IGluc3RydWN0aW9uX3NpemUpIHsKKyAgcmV0dXJuICoodGFyZ2V0KSA9PSAweGU4ICYmIGluc3RydWN0aW9uX3NpemUgPT0gNTsKK30KKworYm9vbCBQcmVhbWJsZVBhdGNoZXI6OklzTW92V2l0aERpc3BsYWNlbWVudCgKKyAgICB1bnNpZ25lZCBjaGFyKiB0YXJnZXQsCisgICAgdW5zaWduZWQgaW50IGluc3RydWN0aW9uX3NpemUpIHsKKyAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgTW9kUk0gYnl0ZSdzIG1vZCBmaWVsZCB3aWxsIGJlIDAgYW5kIHIvbSB3aWxsIGJlIDEwMWIgKDUpCisgIHJldHVybiBpbnN0cnVjdGlvbl9zaXplID09IDcgJiYgKnRhcmdldCA9PSAweDQ4ICYmICoodGFyZ2V0ICsgMSkgPT0gMHg4YiAmJgorICAgICAgKCoodGFyZ2V0ICsgMikgPj4gNikgPT0gMCAmJiAoKih0YXJnZXQgKyAyKSAmIDB4NykgPT0gNTsKK30KKworU2lkZVN0ZXBFcnJvciBQcmVhbWJsZVBhdGNoZXI6OlBhdGNoU2hvcnRDb25kaXRpb25hbEp1bXAoCisgICAgdW5zaWduZWQgY2hhciogc291cmNlLAorICAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbl9zaXplLAorICAgIHVuc2lnbmVkIGNoYXIqIHRhcmdldCwKKyAgICB1bnNpZ25lZCBpbnQqIHRhcmdldF9ieXRlcywKKyAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X3NpemUpIHsKKyAgLy8gbm90ZTogcmVsOCBvZmZzZXQgaXMgc2lnbmVkLiBUaHVzIHdlIG5lZWQgdG8gYXNrIGZvciBzaWduZWQgY2hhcgorICAvLyB0byBuZWdhdGl2ZSBvZmZzZXRzIHJpZ2h0CisgIHVuc2lnbmVkIGNoYXIqIG9yaWdpbmFsX2p1bXBfZGVzdCA9IChzb3VyY2UgKyAyKSArIHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPihzb3VyY2VbMV0pOworICB1bnNpZ25lZCBjaGFyKiBzdHViX2p1bXBfZnJvbSA9IHRhcmdldCArIDY7CisgIF9faW50NjQgZml4dXBfanVtcF9vZmZzZXQgPSBvcmlnaW5hbF9qdW1wX2Rlc3QgLSBzdHViX2p1bXBfZnJvbTsKKyAgaWYgKGZpeHVwX2p1bXBfb2Zmc2V0ID4gSU5UX01BWCB8fCBmaXh1cF9qdW1wX29mZnNldCA8IElOVF9NSU4pIHsKKyAgICBTSURFU1RFUF9BU1NFUlQoZmFsc2UgJiYKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaXggdXAgc2hvcnQganVtcCBiZWNhdXNlIHRhcmdldCIKKyAgICAgICAgICAgICAgICAgICAgIiBpcyB0b28gZmFyIGF3YXkuIik7CisgICAgcmV0dXJuIFNJREVTVEVQX0pVTVBfSU5TVFJVQ1RJT047CisgIH0KKworICAqdGFyZ2V0X2J5dGVzID0gNjsKKyAgaWYgKHRhcmdldF9zaXplID4gKnRhcmdldF9ieXRlcykgeworICAgIC8vIENvbnZlcnQgdGhlIHNob3J0IGp1bXAgdG8gYSBuZWFyIGp1bXAuCisgICAgLy8KKyAgICAvLyAwZiA4eCB4eCB4eCB4eCB4eCA9IEpjYyByZWwzMm9mZgorICAgIHVuc2lnbmVkIHNob3J0IGptcGNvZGUgPSAoKDB4ODAgfCAoc291cmNlWzBdICYgMHhmKSkgPDwgOCkgfCAweDBmOworICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHZvaWQqPih0YXJnZXQpLAorICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPigmam1wY29kZSksIDIpOworICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHZvaWQqPih0YXJnZXQgKyAyKSwKKyAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oJmZpeHVwX2p1bXBfb2Zmc2V0KSwgNCk7CisgIH0KKworICByZXR1cm4gU0lERVNURVBfU1VDQ0VTUzsKK30KKworU2lkZVN0ZXBFcnJvciBQcmVhbWJsZVBhdGNoZXI6OlBhdGNoU2hvcnRKdW1wKAorICAgIHVuc2lnbmVkIGNoYXIqIHNvdXJjZSwKKyAgICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb25fc2l6ZSwKKyAgICB1bnNpZ25lZCBjaGFyKiB0YXJnZXQsCisgICAgdW5zaWduZWQgaW50KiB0YXJnZXRfYnl0ZXMsCisgICAgdW5zaWduZWQgaW50IHRhcmdldF9zaXplKSB7CisgIC8vIG5vdGU6IHJlbDggb2Zmc2V0IGlzIF9zaWduZWRfLiBUaHVzIHdlIG5lZWQgc2lnbmVkIGNoYXIgaGVyZS4KKyAgdW5zaWduZWQgY2hhciogb3JpZ2luYWxfanVtcF9kZXN0ID0gKHNvdXJjZSArIDIpICsgc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KHNvdXJjZVsxXSk7CisgIHVuc2lnbmVkIGNoYXIqIHN0dWJfanVtcF9mcm9tID0gdGFyZ2V0ICsgNTsKKyAgX19pbnQ2NCBmaXh1cF9qdW1wX29mZnNldCA9IG9yaWdpbmFsX2p1bXBfZGVzdCAtIHN0dWJfanVtcF9mcm9tOworICBpZiAoZml4dXBfanVtcF9vZmZzZXQgPiBJTlRfTUFYIHx8IGZpeHVwX2p1bXBfb2Zmc2V0IDwgSU5UX01JTikgeworICAgIFNJREVTVEVQX0FTU0VSVChmYWxzZSAmJgorICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGZpeCB1cCBzaG9ydCBqdW1wIGJlY2F1c2UgdGFyZ2V0IgorICAgICAgICAgICAgICAgICAgICAiIGlzIHRvbyBmYXIgYXdheS4iKTsKKyAgICByZXR1cm4gU0lERVNURVBfSlVNUF9JTlNUUlVDVElPTjsKKyAgfQorCisgICp0YXJnZXRfYnl0ZXMgPSA1OworICBpZiAodGFyZ2V0X3NpemUgPiAqdGFyZ2V0X2J5dGVzKSB7CisgICAgLy8gQ29udmVydCB0aGUgc2hvcnQganVtcCB0byBhIG5lYXIganVtcC4KKyAgICAvLworICAgIC8vIGU5IHh4IHh4IHh4IHh4ID0gam1wIHJlbDMyb2ZmCisgICAgdGFyZ2V0WzBdID0gMHhlOTsKKyAgICBtZW1jcHkocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4odGFyZ2V0ICsgMSksCisgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCZmaXh1cF9qdW1wX29mZnNldCksIDQpOworICB9CisKKyAgcmV0dXJuIFNJREVTVEVQX1NVQ0NFU1M7Cit9CisKK1NpZGVTdGVwRXJyb3IgUHJlYW1ibGVQYXRjaGVyOjpQYXRjaE5lYXJKdW1wT3JDYWxsKAorICAgIHVuc2lnbmVkIGNoYXIqIHNvdXJjZSwKKyAgICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb25fc2l6ZSwKKyAgICB1bnNpZ25lZCBjaGFyKiB0YXJnZXQsCisgICAgdW5zaWduZWQgaW50KiB0YXJnZXRfYnl0ZXMsCisgICAgdW5zaWduZWQgaW50IHRhcmdldF9zaXplKSB7CisgIFNJREVTVEVQX0FTU0VSVChpbnN0cnVjdGlvbl9zaXplID09IDUgfHwgaW5zdHJ1Y3Rpb25fc2l6ZSA9PSA2KTsKKyAgdW5zaWduZWQgaW50IGptcF9vZmZzZXRfaW5faW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl9zaXplID09IDUgPyAxIDogMjsKKyAgdW5zaWduZWQgY2hhciogb3JpZ2luYWxfanVtcF9kZXN0ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyICo+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxfX2ludDY0Pihzb3VyY2UgKyBpbnN0cnVjdGlvbl9zaXplKSArCisgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50Kj4oc291cmNlICsgam1wX29mZnNldF9pbl9pbnN0cnVjdGlvbikpKTsKKyAgdW5zaWduZWQgY2hhciogc3R1Yl9qdW1wX2Zyb20gPSB0YXJnZXQgKyBpbnN0cnVjdGlvbl9zaXplOworICBfX2ludDY0IGZpeHVwX2p1bXBfb2Zmc2V0ID0gb3JpZ2luYWxfanVtcF9kZXN0IC0gc3R1Yl9qdW1wX2Zyb207CisgIGlmIChmaXh1cF9qdW1wX29mZnNldCA+IElOVF9NQVggfHwgZml4dXBfanVtcF9vZmZzZXQgPCBJTlRfTUlOKSB7CisgICAgU0lERVNURVBfQVNTRVJUKGZhbHNlICYmCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZml4IHVwIG5lYXIganVtcCBiZWNhdXNlIHRhcmdldCIKKyAgICAgICAgICAgICAgICAgICAgIiBpcyB0b28gZmFyIGF3YXkuIik7CisgICAgcmV0dXJuIFNJREVTVEVQX0pVTVBfSU5TVFJVQ1RJT047CisgIH0KKworICBpZiAoKGZpeHVwX2p1bXBfb2Zmc2V0IDwgU0NIQVJfTUFYICYmIGZpeHVwX2p1bXBfb2Zmc2V0ID4gU0NIQVJfTUlOKSkgeworICAgICp0YXJnZXRfYnl0ZXMgPSAyOworICAgIGlmICh0YXJnZXRfc2l6ZSA+ICp0YXJnZXRfYnl0ZXMpIHsKKyAgICAgIC8vIElmIHRoZSBuZXcgb2Zmc2V0IGlzIGluIHJhbmdlLCB1c2UgYSBzaG9ydCBqdW1wIGluc3RlYWQgb2YgYSBuZWFyIGp1bXAuCisgICAgICBpZiAoc291cmNlWzBdID09IEFTTV9KQ0MzMlJFTF8wICYmCisgICAgICAgICAgKHNvdXJjZVsxXSAmIEFTTV9KQ0MzMlJFTF8xX01BU0spID09IEFTTV9KQ0MzMlJFTF8xX01BU0spIHsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgam1wY29kZSA9IChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigKKyAgICAgICAgICAgIGZpeHVwX2p1bXBfb2Zmc2V0KSA8PCA4KSB8ICgweDcwIHwgKHNvdXJjZVsxXSAmIDB4ZikpOworICAgICAgICBtZW1jcHkocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4odGFyZ2V0KSwKKyAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCZqbXBjb2RlKSwKKyAgICAgICAgICAgICAgIDIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFyZ2V0WzBdID0gQVNNX0pNUDhSRUw7CisgICAgICAgIHRhcmdldFsxXSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGZpeHVwX2p1bXBfb2Zmc2V0KTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgKnRhcmdldF9ieXRlcyA9IGluc3RydWN0aW9uX3NpemU7CisgICAgaWYgKHRhcmdldF9zaXplID4gKnRhcmdldF9ieXRlcykgeworICAgICAgbWVtY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHRhcmdldCksCisgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oc291cmNlKSwKKyAgICAgICAgICAgICBqbXBfb2Zmc2V0X2luX2luc3RydWN0aW9uKTsKKyAgICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHZvaWQqPih0YXJnZXQgKyBqbXBfb2Zmc2V0X2luX2luc3RydWN0aW9uKSwKKyAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPigmZml4dXBfanVtcF9vZmZzZXQpLAorICAgICAgICAgICAgIDQpOworICAgIH0KKyAgfQorCisgIHJldHVybiBTSURFU1RFUF9TVUNDRVNTOworfQorCitTaWRlU3RlcEVycm9yIFByZWFtYmxlUGF0Y2hlcjo6UGF0Y2hNb3ZXaXRoRGlzcGxhY2VtZW50KAorICAgICB1bnNpZ25lZCBjaGFyKiBzb3VyY2UsCisgICAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbl9zaXplLAorICAgICB1bnNpZ25lZCBjaGFyKiB0YXJnZXQsCisgICAgIHVuc2lnbmVkIGludCogdGFyZ2V0X2J5dGVzLAorICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X3NpemUpIHsKKyAgU0lERVNURVBfQVNTRVJUKGluc3RydWN0aW9uX3NpemUgPT0gNyk7CisgIGNvbnN0IGludCBtb3Zfb2Zmc2V0X2luX2luc3RydWN0aW9uID0gMzsgLy8gMHg0OCAweDhiIDB4MGQgPG9mZnNldD4KKyAgdW5zaWduZWQgY2hhciogb3JpZ2luYWxfbW92X2Rlc3QgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8X19pbnQ2ND4oc291cmNlICsgaW5zdHJ1Y3Rpb25fc2l6ZSkgKworICAgICAgKihyZWludGVycHJldF9jYXN0PGludCo+KHNvdXJjZSArIG1vdl9vZmZzZXRfaW5faW5zdHJ1Y3Rpb24pKSk7CisgIHVuc2lnbmVkIGNoYXIqIHN0dWJfbW92X2Zyb20gPSB0YXJnZXQgKyBpbnN0cnVjdGlvbl9zaXplOworICBfX2ludDY0IGZpeHVwX21vdl9vZmZzZXQgPSBvcmlnaW5hbF9tb3ZfZGVzdCAtIHN0dWJfbW92X2Zyb207CisgIGlmIChmaXh1cF9tb3Zfb2Zmc2V0ID4gSU5UX01BWCB8fCBmaXh1cF9tb3Zfb2Zmc2V0IDwgSU5UX01JTikgeworICAgIFNJREVTVEVQX0FTU0VSVChmYWxzZSAmJgorICAgICAgICAiVW5hYmxlIHRvIGZpeCB1cCBuZWFyIE1PViBiZWNhdXNlIHRhcmdldCBpcyB0b28gZmFyIGF3YXkuIik7CisgICAgcmV0dXJuIFNJREVTVEVQX1VORVhQRUNURUQ7CisgIH0KKyAgKnRhcmdldF9ieXRlcyA9IGluc3RydWN0aW9uX3NpemU7CisgIGlmICh0YXJnZXRfc2l6ZSA+ICp0YXJnZXRfYnl0ZXMpIHsKKyAgICBtZW1jcHkocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4odGFyZ2V0KSwKKyAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oc291cmNlKSwKKyAgICAgICAgICAgbW92X29mZnNldF9pbl9pbnN0cnVjdGlvbik7CisgICAgbWVtY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHRhcmdldCArIG1vdl9vZmZzZXRfaW5faW5zdHJ1Y3Rpb24pLAorICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPigmZml4dXBfbW92X29mZnNldCksCisgICAgICAgICAgIDQpOworICB9CisgIHJldHVybiBTSURFU1RFUF9TVUNDRVNTOworfQorCit9OyAgLy8gbmFtZXNwYWNlIHNpZGVzdGVwCmRpZmYgLS1naXQgYS9zcmMvd2luZG93cy9wcmVhbWJsZV9wYXRjaGVyLmggYi9zcmMvd2luZG93cy9wcmVhbWJsZV9wYXRjaGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmMTU4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93aW5kb3dzL3ByZWFtYmxlX3BhdGNoZXIuaApAQCAtMCwwICsxLDYyMCBAQAorLy8gLSotIE1vZGU6IEMrKzsgYy1iYXNpYy1vZmZzZXQ6IDI7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKy8qIENvcHlyaWdodCAoYykgMjAwNywgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogLS0tCisgKiBBdXRob3I6IEpvaSBTaWd1cmRzc29uCisgKiBBdXRob3I6IFNjb3R0IEZyYW5jaXMKKyAqCisgKiBEZWZpbml0aW9uIG9mIFByZWFtYmxlUGF0Y2hlcgorICovCisKKyNpZm5kZWYgR09PR0xFX1BFUkZUT09MU19QUkVBTUJMRV9QQVRDSEVSX0hfCisjZGVmaW5lIEdPT0dMRV9QRVJGVE9PTFNfUFJFQU1CTEVfUEFUQ0hFUl9IXworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisvLyBjb21wYXRpYmlsaXR5IHNoaW0KKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNkZWZpbmUgU0lERVNURVBfQVNTRVJUKGNvbmQpICBSQVdfRENIRUNLKGNvbmQsICNjb25kKQorI2RlZmluZSBTSURFU1RFUF9MT0cobXNnKSAgICAgIFJBV19WTE9HKDEsIG1zZykKKworLy8gTWF4aW11bSBzaXplIG9mIHRoZSBwcmVhbWJsZSBzdHViLiBXZSBvdmVyd3JpdGUgYXQgbGVhc3QgdGhlIGZpcnN0IDUKKy8vIGJ5dGVzIG9mIHRoZSBmdW5jdGlvbi4gQ29uc2lkZXJpbmcgdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW8sIHdlIG5lZWQgNAorLy8gYnl0ZXMgKyB0aGUgbWF4IGluc3RydWN0aW9uIHNpemUgKyA1IG1vcmUgYnl0ZXMgZm9yIG91ciBqdW1wIGJhY2sgdG8KKy8vIHRoZSBvcmlnaW5hbCBjb2RlLiBXaXRoIHRoYXQgaW4gbWluZCwgMzIgaXMgYSBnb29kIG51bWJlciA6KQorI2lmZGVmIF9NX1g2NAorLy8gSW4gNjQtYml0IG1vZGUgd2UgbWF5IG5lZWQgbW9yZSByb29tLiAgSW4gNjQtYml0IG1vZGUgYWxsIGp1bXBzIG11c3QgYmUKKy8vIHdpdGhpbiArLy0yR0Igb2YgUklQLiAgQmVjYXVzZSBvZiB0aGlzIGxpbWl0YXRpb24gd2UgbWF5IG5lZWQgdG8gdXNlIGEKKy8vIHRyYW1wb2xpbmUgdG8ganVtcCB0byB0aGUgcmVwbGFjZW1lbnQgZnVuY3Rpb24gaWYgaXQgaXMgZnVydGhlciB0aGFuIDJHQgorLy8gYXdheSBmcm9tIHRoZSB0YXJnZXQuIFRoZSB0cmFtcG9saW5lIGlzIDE0IGJ5dGVzLgorLy8KKy8vIFNvIDQgYnl0ZXMgKyBtYXggaW5zdHJ1Y3Rpb24gc2l6ZSAoMTcgYnl0ZXMpICsgNSBieXRlcyB0byBqdW1wIGJhY2sgdG8gdGhlCisvLyBvcmlnaW5hbCBjb2RlICsgdHJhbXBvbGluZSBzaXplLiAgNjQgYnl0ZXMgaXMgYSBuaWNlIG51bWJlciA6LSkKKyNkZWZpbmUgTUFYX1BSRUFNQkxFX1NUVUJfU0laRSAgICAoNjQpCisjZWxzZQorI2RlZmluZSBNQVhfUFJFQU1CTEVfU1RVQl9TSVpFICAgICgzMikKKyNlbmRpZgorCisvLyBEZXRlcm1pbmVzIGlmIHRoaXMgaXMgYSA2NC1iaXQgYmluYXJ5LgorI2lmZGVmIF9NX1g2NAorc3RhdGljIGNvbnN0IGJvb2wga0lzNjRCaXRCaW5hcnkgPSB0cnVlOworI2Vsc2UKK3N0YXRpYyBjb25zdCBib29sIGtJczY0Qml0QmluYXJ5ID0gZmFsc2U7CisjZW5kaWYKKworbmFtZXNwYWNlIHNpZGVzdGVwIHsKKworLy8gUG9zc2libGUgcmVzdWx0cyBvZiBwYXRjaGluZy91bnBhdGNoaW5nCitlbnVtIFNpZGVTdGVwRXJyb3IgeworICBTSURFU1RFUF9TVUNDRVNTID0gMCwKKyAgU0lERVNURVBfSU5WQUxJRF9QQVJBTUVURVIsCisgIFNJREVTVEVQX0lOU1VGRklDSUVOVF9CVUZGRVIsCisgIFNJREVTVEVQX0pVTVBfSU5TVFJVQ1RJT04sCisgIFNJREVTVEVQX0ZVTkNUSU9OX1RPT19TTUFMTCwKKyAgU0lERVNURVBfVU5TVVBQT1JURURfSU5TVFJVQ1RJT04sCisgIFNJREVTVEVQX05PX1NVQ0hfTU9EVUxFLAorICBTSURFU1RFUF9OT19TVUNIX0ZVTkNUSU9OLAorICBTSURFU1RFUF9BQ0NFU1NfREVOSUVELAorICBTSURFU1RFUF9VTkVYUEVDVEVELAorfTsKKworI2RlZmluZSBTSURFU1RFUF9UT19IUkVTVUxUKGVycm9yKSAgICAgICAgICAgICAgICAgICAgICBcCisgIE1BS0VfSFJFU1VMVChTRVZFUklUWV9FUlJPUiwgRkFDSUxJVFlfTlVMTCwgZXJyb3IpCisKK2NsYXNzIERlbGV0ZVVuc2lnbmVkQ2hhckFycmF5OworCisvLyBJbXBsZW1lbnRzIGEgcGF0Y2hpbmcgbWVjaGFuaXNtIHRoYXQgb3ZlcndyaXRlcyB0aGUgZmlyc3QgZmV3IGJ5dGVzIG9mCisvLyBhIGZ1bmN0aW9uIHByZWFtYmxlIHdpdGggYSBqdW1wIHRvIG91ciBob29rIGZ1bmN0aW9uLCB3aGljaCBpcyB0aGVuCisvLyBhYmxlIHRvIGNhbGwgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHZpYSBhIHNwZWNpYWxseS1tYWRlIHByZWFtYmxlLXN0dWIKKy8vIHRoYXQgaW1pdGF0ZXMgdGhlIGFjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcHJlYW1ibGUuCisvLworLy8gTk9URTogIFRoaXMgcGF0Y2hpbmcgbWVjaGFuaXNtIHNob3VsZCBjdXJyZW50bHkgb25seSBiZSB1c2VkIGZvcgorLy8gbm9uLXByb2R1Y3Rpb24gY29kZSwgZS5nLiB1bml0IHRlc3RzLCBiZWNhdXNlIGl0IGlzIG5vdCB0aHJlYWRzYWZlLgorLy8gU2VlIHRoZSBUT0RPIGluIHByZWFtYmxlX3BhdGNoZXJfd2l0aF9zdHViLmNjIGZvciBpbnN0cnVjdGlvbnMgb24gd2hhdAorLy8gd2UgbmVlZCB0byBkbyBiZWZvcmUgdXNpbmcgaXQgaW4gcHJvZHVjdGlvbiBjb2RlOyBpdCdzIGZhaXJseSBzaW1wbGUKKy8vIGJ1dCB1bm5lY2Vzc2FyeSBmb3Igbm93IHNpbmNlIHdlIG9ubHkgaW50ZW5kIHRvIHVzZSBpdCBpbiB1bml0IHRlc3RzLgorLy8KKy8vIFRvIHBhdGNoIGEgZnVuY3Rpb24sIHVzZSBlaXRoZXIgb2YgdGhlIHR5cGVzYWZlIFBhdGNoKCkgbWV0aG9kcy4gIFlvdQorLy8gY2FuIHVucGF0Y2ggYSBmdW5jdGlvbiB1c2luZyBVbnBhdGNoKCkuCisvLworLy8gVHlwaWNhbCB1c2FnZSBnb2VzIHNvbWV0aGluZyBsaWtlIHRoaXM6CisvLyBAY29kZQorLy8gdHlwZWRlZiBpbnQgKCpNeVR5cGVzYWZlRnVuY1B0cikoaW50IHgpOworLy8gTXlUeXBlc2FmZUZ1bmNQdHIgb3JpZ2luYWxfZnVuY19zdHViOworLy8gaW50IE15VHlwZXNhZmVGdW5jKGludCB4KSB7IHJldHVybiB4ICsgMTsgfQorLy8gaW50IEhvb2tNeVR5cGVzYWZlRnVuYyhpbnQgeCkgeyByZXR1cm4gMSArIG9yaWdpbmFsX2Z1bmNfc3R1Yih4KTsgfQorLy8gCisvLyB2b2lkIE15UGF0Y2hJbml0aWFsaXppbmdGdW5jdGlvbigpIHsKKy8vICAgb3JpZ2luYWxfZnVuY19zdHViID0gUHJlYW1ibGVQYXRjaGVyOjpQYXRjaCgKKy8vICAgICAgICAgICAgICBNeVR5cGVzYWZlRnVuYywgSG9va015VHlwZXNhZmVGdW5jKTsKKy8vICAgaWYgKCFvcmlnaW5hbF9mdW5jX3N0dWIpIHsKKy8vICAgICAvLyAuLi4gZXJyb3IgaGFuZGxpbmcgLi4uCisvLyAgIH0KKy8vCisvLyAgIC8vIC4uLiBjb250aW51ZSAtIHlvdSBoYXZlIHBhdGNoZWQgdGhlIGZ1bmN0aW9uIHN1Y2Nlc3NmdWxseSAuLi4KKy8vIH0KKy8vIEBlbmRjb2RlCisvLworLy8gTm90ZSB0aGF0IHRoZXJlIGFyZSBhIG51bWJlciBvZiB3YXlzIHRoYXQgdGhpcyBtZXRob2Qgb2YgcGF0Y2hpbmcgY2FuCisvLyBmYWlsLiAgVGhlIG1vc3QgY29tbW9uIGFyZToKKy8vICAgIC0gSWYgdGhlcmUgaXMgYSBqdW1wIChqeHgpIGluc3RydWN0aW9uIGluIHRoZSBmaXJzdCA1IGJ5dGVzIG9mCisvLyAgICB0aGUgZnVuY3Rpb24gYmVpbmcgcGF0Y2hlZCwgd2UgY2Fubm90IHBhdGNoIGl0IGJlY2F1c2UgaW4gdGhlCisvLyAgICBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdlIGRvIG5vdCBrbm93IGhvdyB0byByZXdyaXRlIHJlbGF0aXZlCisvLyAgICBqdW1wcyBhZnRlciByZWxvY2F0aW5nIHRoZW0gdG8gdGhlIHByZWFtYmxlLXN0dWIuICBOb3RlIHRoYXQKKy8vICAgIGlmIHlvdSByZWFsbHkgcmVhbGx5IG5lZWQgdG8gcGF0Y2ggYSBmdW5jdGlvbiBsaWtlIHRoaXMsIGl0CisvLyAgICB3b3VsZCBiZSBwb3NzaWJsZSB0byBhZGQgdGhpcyBmdW5jdGlvbmFsaXR5IChidXQgYXQgc29tZSBjb3N0KS4KKy8vICAgIC0gSWYgdGhlcmUgaXMgYSByZXR1cm4gKHJldCkgaW5zdHJ1Y3Rpb24gaW4gdGhlIGZpcnN0IDUgYnl0ZXMKKy8vICAgIHdlIGNhbm5vdCBwYXRjaCB0aGUgZnVuY3Rpb24gYmVjYXVzZSBpdCBtYXkgbm90IGJlIGxvbmcgZW5vdWdoCisvLyAgICBmb3IgdGhlIGptcCBpbnN0cnVjdGlvbiB3ZSB1c2UgdG8gaW5qZWN0IG91ciBwYXRjaC4KKy8vICAgIC0gSWYgdGhlcmUgaXMgYW5vdGhlciB0aHJlYWQgY3VycmVudGx5IGV4ZWN1dGluZyB3aXRoaW4gdGhlIGJ5dGVzCisvLyAgICB0aGF0IGFyZSBjb3BpZWQgdG8gdGhlIHByZWFtYmxlIHN0dWIsIGl0IHdpbGwgY3Jhc2ggaW4gYW4gdW5kZWZpbmVkCisvLyAgICB3YXkuCisvLworLy8gSWYgeW91IGdldCBhbnkgb3RoZXIgZXJyb3IgdGhhbiB0aGUgYWJvdmUsIHlvdSdyZSBlaXRoZXIgcG9pbnRpbmcgdGhlCisvLyBwYXRjaGVyIGF0IGFuIGludmFsaWQgaW5zdHJ1Y3Rpb24gKGUuZy4gaW50byB0aGUgbWlkZGxlIG9mIGEgbXVsdGktCisvLyBieXRlIGluc3RydWN0aW9uLCBvciBub3QgYXQgbWVtb3J5IGNvbnRhaW5pbmcgZXhlY3V0YWJsZSBpbnN0cnVjdGlvbnMpCisvLyBvciwgdGhlcmUgbWF5IGJlIGEgYnVnIGluIHRoZSBkaXNhc3NlbWJsZXIgd2UgdXNlIHRvIGZpbmQKKy8vIGluc3RydWN0aW9uIGJvdW5kYXJpZXMuCisvLworLy8gTk9URTogIEluIG9wdGltaXplZCBidWlsZHMsIHdoZW4geW91IGhhdmUgdmVyeSB0cml2aWFsIGZ1bmN0aW9ucyB0aGF0CisvLyB0aGUgY29tcGlsZXIgY2FuIHJlYXNvbiBkbyBub3QgaGF2ZSBzaWRlIGVmZmVjdHMsIHRoZSBjb21waWxlciBtYXkKKy8vIHJldXNlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgZnVuY3Rpb24gd2l0aCBhIGdpdmVuIHBhcmFtZXRlciwgd2hpY2gKKy8vIG1heSBtZWFuIGlmIHlvdSBwYXRjaCB0aGUgZnVuY3Rpb24gaW4gYmV0d2VlbiB5b3VyIHBhdGNoIHdpbGwgbmV2ZXIgZ2V0CisvLyBpbnZva2VkLiAgU2VlIHByZWFtYmxlX3BhdGNoZXJfdGVzdC5jYyBmb3IgYW4gZXhhbXBsZS4KK2NsYXNzIFBFUkZUT09MU19ETExfREVDTCBQcmVhbWJsZVBhdGNoZXIgeworIHB1YmxpYzoKKworICAvLyBUaGlzIGlzIGEgdHlwZXNhZmUgdmVyc2lvbiBvZiBSYXdQYXRjaCgpLCBpZGVudGljYWwgaW4gYWxsIG90aGVyCisgIC8vIHdheXMgdGhhbiBpdCB0YWtlcyBhIHRlbXBsYXRlIHBhcmFtZXRlciBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIHRoZQorICAvLyBmdW5jdGlvbiBiZWluZyBwYXRjaGVkLgorICAvLworICAvLyBAcGFyYW0gVCBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24geW91IGFyZSBwYXRjaGluZy4gVXN1YWxseQorICAvLyB5b3Ugd2lsbCBlc3RhYmxpc2ggdGhpcyB0eXBlIHVzaW5nIGEgdHlwZWRlZiwgYXMgaW4gdGhlIGZvbGxvd2luZworICAvLyBleGFtcGxlOgorICAvLyBAY29kZQorICAvLyB0eXBlZGVmIEJPT0wgKFdJTkFQSSAqTWVzc2FnZUJveFB0cikoSFdORCwgTFBDVFNUUiwgTFBDVFNUUiwgVUlOVCk7CisgIC8vIE1lc3NhZ2VCb3hQdHIgb3JpZ2luYWwgPSBOVUxMOworICAvLyBQcmVhbWJsZVBhdGNoZXI6OlBhdGNoKE1lc3NhZ2VCb3gsIEhvb2tfTWVzc2FnZUJveCwgJm9yaWdpbmFsKTsKKyAgLy8gQGVuZGNvZGUKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHN0YXRpYyBTaWRlU3RlcEVycm9yIFBhdGNoKFQgdGFyZ2V0X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIHJlcGxhY2VtZW50X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUKiBvcmlnaW5hbF9mdW5jdGlvbl9zdHViKSB7CisgICAgLy8gTk9URTogY2FzdGluZyBmcm9tIGEgZnVuY3Rpb24gdG8gYSBwb2ludGVyIGlzIGNvbnRyYSB0aGUgQysrCisgICAgLy8gICAgICAgc3BlYy4gIEl0J3Mgbm90IHNhZmUgb24gSUE2NCwgYnV0IGlzIG9uIGkzODYuICBXZSB1c2UKKyAgICAvLyAgICAgICBhIEMtc3R5bGUgY2FzdCBoZXJlIHRvIGVtcGhhc2l6ZSB0aGlzIGlzIG5vdCBsZWdhbCBDKysuCisgICAgcmV0dXJuIFJhd1BhdGNoKCh2b2lkKikodGFyZ2V0X2Z1bmN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQqKShyZXBsYWNlbWVudF9mdW5jdGlvbiksCisgICAgICAgICAgICAgICAgICAgICh2b2lkKiopKG9yaWdpbmFsX2Z1bmN0aW9uX3N0dWIpKTsKKyAgfQorCisgIC8vIFBhdGNoZXMgYSBuYW1lZCBmdW5jdGlvbiBpbXBvcnRlZCBmcm9tIHRoZSBuYW1lZCBtb2R1bGUgdXNpbmcKKyAgLy8gcHJlYW1ibGUgcGF0Y2hpbmcuICBVc2VzIFJhd1BhdGNoKCkgdG8gZG8gdGhlIGFjdHVhbCBwYXRjaGluZworICAvLyB3b3JrLgorICAvLworICAvLyBAcGFyYW0gVCBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24geW91IGFyZSBwYXRjaGluZy4gIE11c3QKKyAgLy8gZXhhY3RseSBtYXRjaCB0aGUgZnVuY3Rpb24geW91IHNwZWNpZnkgdXNpbmcgbW9kdWxlX25hbWUgYW5kCisgIC8vIGZ1bmN0aW9uX25hbWUuCisgIC8vCisgIC8vIEBwYXJhbSBtb2R1bGVfbmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGZyb20gd2hpY2ggdGhlIGZ1bmN0aW9uCisgIC8vIGlzIGJlaW5nIGltcG9ydGVkLiAgTm90ZSB0aGF0IHRoZSBwYXRjaCB3aWxsIGZhaWwgaWYgdGhpcyBtb2R1bGUKKyAgLy8gaGFzIG5vdCBhbHJlYWR5IGJlZW4gbG9hZGVkIGludG8gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgLy8KKyAgLy8gQHBhcmFtIGZ1bmN0aW9uX25hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHlvdSB3aXNoIHRvIHBhdGNoLgorICAvLworICAvLyBAcGFyYW0gcmVwbGFjZW1lbnRfZnVuY3Rpb24gWW91ciByZXBsYWNlbWVudCBmdW5jdGlvbiB3aGljaAorICAvLyB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBjb2RlIHRyaWVzIHRvIGNhbGwgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLgorICAvLworICAvLyBAcGFyYW0gb3JpZ2luYWxfZnVuY3Rpb25fc3R1YiBQb2ludGVyIHRvIG1lbW9yeSB0aGF0IHNob3VsZCByZWNlaXZlIGEKKyAgLy8gcG9pbnRlciB0aGF0IGNhbiBiZSB1c2VkIChlLmcuIGluIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbikgdG8gY2FsbCB0aGUKKyAgLy8gb3JpZ2luYWwgZnVuY3Rpb24sIG9yIE5VTEwgdG8gaW5kaWNhdGUgZmFpbHVyZS4KKyAgLy8KKyAgLy8gQHJldHVybiBPbmUgb2YgdGhlIEVuU2lkZVN0ZXBFcnJvciBlcnJvciBjb2Rlczsgb25seSBTSURFU1RFUF9TVUNDRVNTCisgIC8vIGluZGljYXRlcyBzdWNjZXNzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgc3RhdGljIFNpZGVTdGVwRXJyb3IgUGF0Y2goTFBDVFNUUiBtb2R1bGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGZ1bmN0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgcmVwbGFjZW1lbnRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQqIG9yaWdpbmFsX2Z1bmN0aW9uX3N0dWIpIHsKKyAgICBTSURFU1RFUF9BU1NFUlQobW9kdWxlX25hbWUgJiYgZnVuY3Rpb25fbmFtZSk7CisgICAgaWYgKCFtb2R1bGVfbmFtZSB8fCAhZnVuY3Rpb25fbmFtZSkgeworICAgICAgU0lERVNURVBfQVNTRVJUKGZhbHNlICYmCisgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgYSBtb2R1bGUgbmFtZSBhbmQgZnVuY3Rpb24gbmFtZS4iKTsKKyAgICAgIHJldHVybiBTSURFU1RFUF9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgSE1PRFVMRSBtb2R1bGUgPSA6OkdldE1vZHVsZUhhbmRsZShtb2R1bGVfbmFtZSk7CisgICAgU0lERVNURVBfQVNTRVJUKG1vZHVsZSAhPSBOVUxMKTsKKyAgICBpZiAoIW1vZHVsZSkgeworICAgICAgU0lERVNURVBfQVNTRVJUKGZhbHNlICYmICJJbnZhbGlkIG1vZHVsZSBuYW1lLiIpOworICAgICAgcmV0dXJuIFNJREVTVEVQX05PX1NVQ0hfTU9EVUxFOworICAgIH0KKyAgICBGQVJQUk9DIGV4aXN0aW5nX2Z1bmN0aW9uID0gOjpHZXRQcm9jQWRkcmVzcyhtb2R1bGUsIGZ1bmN0aW9uX25hbWUpOworICAgIGlmICghZXhpc3RpbmdfZnVuY3Rpb24pIHsKKyAgICAgIFNJREVTVEVQX0FTU0VSVCgKKyAgICAgICAgICBmYWxzZSAmJiAiRGlkIG5vdCBmaW5kIGFueSBmdW5jdGlvbiB3aXRoIHRoYXQgbmFtZSBpbiB0aGUgbW9kdWxlLiIpOworICAgICAgcmV0dXJuIFNJREVTVEVQX05PX1NVQ0hfRlVOQ1RJT047CisgICAgfQorICAgIC8vIE5PVEU6IGNhc3RpbmcgZnJvbSBhIGZ1bmN0aW9uIHRvIGEgcG9pbnRlciBpcyBjb250cmEgdGhlIEMrKworICAgIC8vICAgICAgIHNwZWMuICBJdCdzIG5vdCBzYWZlIG9uIElBNjQsIGJ1dCBpcyBvbiBpMzg2LiAgV2UgdXNlCisgICAgLy8gICAgICAgYSBDLXN0eWxlIGNhc3QgaGVyZSB0byBlbXBoYXNpemUgdGhpcyBpcyBub3QgbGVnYWwgQysrLgorICAgIHJldHVybiBSYXdQYXRjaCgodm9pZCopZXhpc3RpbmdfZnVuY3Rpb24sICh2b2lkKilyZXBsYWNlbWVudF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQqKikob3JpZ2luYWxfZnVuY3Rpb25fc3R1YikpOworICB9CisKKyAgLy8gUGF0Y2hlcyBhIGZ1bmN0aW9uIGJ5IG92ZXJ3cml0aW5nIGl0cyBmaXJzdCBmZXcgYnl0ZXMgd2l0aAorICAvLyBhIGp1bXAgdG8gYSBkaWZmZXJlbnQgZnVuY3Rpb24uICBUaGlzIGlzIHRoZSAid29ya2VyIiBmdW5jdGlvbgorICAvLyBmb3IgZWFjaCBvZiB0aGUgdHlwZXNhZmUgUGF0Y2goKSBmdW5jdGlvbnMuICBJbiBtb3N0IGNhc2VzLAorICAvLyBpdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSB0aGUgUGF0Y2goKSBmdW5jdGlvbnMgcmF0aGVyIHRoYW4KKyAgLy8gdGhpcyBvbmUgYXMgdGhleSBkbyBtb3JlIGNoZWNraW5nIGF0IGNvbXBpbGUgdGltZS4KKyAgLy8KKyAgLy8gQHBhcmFtIHRhcmdldF9mdW5jdGlvbiBBIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlCisgIC8vIHBhdGNoZWQuCisgIC8vCisgIC8vIEBwYXJhbSByZXBsYWNlbWVudF9mdW5jdGlvbiBBIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2hvdWxkCisgIC8vIHJlcGxhY2UgdGhlIHRhcmdldCBmdW5jdGlvbi4gIFRoZSByZXBsYWNlbWVudCBmdW5jdGlvbiBtdXN0IGhhdmUKKyAgLy8gZXhhY3RseSB0aGUgc2FtZSBjYWxsaW5nIGNvbnZlbnRpb24gYW5kIHBhcmFtZXRlcnMgYXMgdGhlIG9yaWdpbmFsCisgIC8vIGZ1bmN0aW9uLgorICAvLworICAvLyBAcGFyYW0gb3JpZ2luYWxfZnVuY3Rpb25fc3R1YiBQb2ludGVyIHRvIG1lbW9yeSB0aGF0IHNob3VsZCByZWNlaXZlIGEKKyAgLy8gcG9pbnRlciB0aGF0IGNhbiBiZSB1c2VkIChlLmcuIGluIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbikgdG8gY2FsbCB0aGUKKyAgLy8gb3JpZ2luYWwgZnVuY3Rpb24sIG9yIE5VTEwgdG8gaW5kaWNhdGUgZmFpbHVyZS4KKyAgLy8KKyAgLy8gQHBhcmFtIG9yaWdpbmFsX2Z1bmN0aW9uX3N0dWIgUG9pbnRlciB0byBtZW1vcnkgdGhhdCBzaG91bGQgcmVjZWl2ZSBhCisgIC8vIHBvaW50ZXIgdGhhdCBjYW4gYmUgdXNlZCAoZS5nLiBpbiB0aGUgcmVwbGFjZW1lbnQgZnVuY3Rpb24pIHRvIGNhbGwgdGhlCisgIC8vIG9yaWdpbmFsIGZ1bmN0aW9uLCBvciBOVUxMIHRvIGluZGljYXRlIGZhaWx1cmUuCisgIC8vCisgIC8vIEByZXR1cm4gT25lIG9mIHRoZSBFblNpZGVTdGVwRXJyb3IgZXJyb3IgY29kZXM7IG9ubHkgU0lERVNURVBfU1VDQ0VTUworICAvLyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAgLy8KKyAgLy8gQG5vdGUgVGhlIHByZWFtYmxlLXN0dWIgKHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieQorICAvLyAqb3JpZ2luYWxfZnVuY3Rpb25fc3R1YikgaXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBhbmQgKGluCisgIC8vIHByb2R1Y3Rpb24gYmluYXJpZXMpIG5ldmVyIGRlc3Ryb3llZCwgcmVzdWx0aW5nIGluIGEgbWVtb3J5IGxlYWsuICBUaGlzCisgIC8vIHdpbGwgYmUgdGhlIGNhc2UgdW50aWwgd2UgaW1wbGVtZW50IHNhZmUgdW5wYXRjaGluZyBvZiBhIG1ldGhvZC4KKyAgLy8gSG93ZXZlciwgaXQgaXMgcXVpdGUgZGlmZmljdWx0IHRvIHVucGF0Y2ggYSBtZXRob2QgKGJlY2F1c2Ugb3RoZXIKKyAgLy8gdGhyZWFkcyBpbiB0aGUgcHJvY2VzcyBtYXkgYmUgdXNpbmcgaXQpIHNvIHdlIGFyZSBsZWF2aW5nIGl0IGZvciBub3cuCisgIC8vIFNlZSBob3dldmVyIFVuc2FmZVVucGF0Y2gsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBiaW5hcmllcyB3aGVyZSB5b3UKKyAgLy8ga25vdyBvbmx5IG9uZSB0aHJlYWQgaXMgcnVubmluZywgZS5nLiB1bml0IHRlc3RzLgorICBzdGF0aWMgU2lkZVN0ZXBFcnJvciBSYXdQYXRjaCh2b2lkKiB0YXJnZXRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHJlcGxhY2VtZW50X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogb3JpZ2luYWxfZnVuY3Rpb25fc3R1Yik7CisKKyAgLy8gVW5wYXRjaGVzIHRhcmdldF9mdW5jdGlvbiBhbmQgZGVsZXRlcyB0aGUgc3R1YiB0aGF0IHByZXZpb3VzbHkgY291bGQgYmUKKyAgLy8gdXNlZCB0byBjYWxsIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbi4KKyAgLy8KKyAgLy8gREVMRVRFUyB0aGUgc3R1YiB0aGF0IGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCisgIC8vCisgIC8vIEBwYXJhbSB0YXJnZXRfZnVuY3Rpb24gUG9pbnRlciB0byB0aGUgdGFyZ2V0IGZ1bmN0aW9uIHdoaWNoIHdhcworICAvLyBwcmV2aW91c2x5IHBhdGNoZWQsIGkuZS4gYSBwb2ludGVyIHdoaWNoIHZhbHVlIHNob3VsZCBtYXRjaCB0aGUgdmFsdWUKKyAgLy8gb2YgdGhlIHN5bWJvbCBwcmlvciB0byBwYXRjaGluZyBpdC4KKyAgLy8KKyAgLy8gQHBhcmFtIHJlcGxhY2VtZW50X2Z1bmN0aW9uIFBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRhcmdldF9mdW5jdGlvbgorICAvLyB3YXMgcGF0Y2hlZCB0by4KKyAgLy8KKyAgLy8gQHBhcmFtIG9yaWdpbmFsX2Z1bmN0aW9uX3N0dWIgUG9pbnRlciB0byB0aGUgc3R1YiByZXR1cm5lZCB3aGVuCisgIC8vIHBhdGNoaW5nLCB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gY2FsbCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUKKyAgLy8gcGF0Y2hlZCBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGRlbGV0ZSB0aGUgc3R1Yiwgd2hpY2ggYWZ0ZXIKKyAgLy8gdW5wYXRjaGluZyBpcyB1c2VsZXNzLgorICAvLworICAvLyBJZiB5b3VyIG9yaWdpbmFsIGNhbGwgd2FzCisgIC8vICAgIFBhdGNoKFZpcnR1YWxBbGxvYywgTXlWaXJ0dWFsQWxsb2MsICZvcmlncHRyKQorICAvLyB0aGVuIHRvIHVuZG8gaXQgeW91IHdvdWxkIGNhbGwKKyAgLy8gICAgVW5wYXRjaChWaXJ0dWFsQWxsb2MsIE15VmlydHVhbEFsbG9jLCBvcmlncHRyKTsKKyAgLy8KKyAgLy8gQHJldHVybiBPbmUgb2YgdGhlIEVuU2lkZVN0ZXBFcnJvciBlcnJvciBjb2Rlczsgb25seSBTSURFU1RFUF9TVUNDRVNTCisgIC8vIGluZGljYXRlcyBzdWNjZXNzLgorICBzdGF0aWMgU2lkZVN0ZXBFcnJvciBVbnBhdGNoKHZvaWQqIHRhcmdldF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiByZXBsYWNlbWVudF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcmlnaW5hbF9mdW5jdGlvbl9zdHViKTsKKworICAvLyBBIGhlbHBlciByb3V0aW5lIHdoZW4gcGF0Y2hpbmcsIHdoaWNoIGZvbGxvd3Mgam1wIGluc3RydWN0aW9ucyBhdAorICAvLyBmdW5jdGlvbiBhZGRyZXNzZXMsIHRvIGdldCB0byB0aGUgImFjdHVhbCIgZnVuY3Rpb24gY29udGVudHMuCisgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGlkZW50aWZ5IHR3byBmdW5jdGlvbnMgdGhhdCBhcmUgYXQgZGlmZmVyZW50CisgIC8vIGFkZHJlc3NlcyBidXQgYWN0dWFsbHkgcmVzb2x2ZSB0byB0aGUgc2FtZSBjb2RlLgorICAvLworICAvLyBAcGFyYW0gdGFyZ2V0X2Z1bmN0aW9uIFBvaW50ZXIgdG8gYSBmdW5jdGlvbi4KKyAgLy8KKyAgLy8gQHJldHVybiBFaXRoZXIgdGFyZ2V0X2Z1bmN0aW9uICh0aGUgaW5wdXQgcGFyYW1ldGVyKSwgb3IgaWYKKyAgLy8gdGFyZ2V0X2Z1bmN0aW9uJ3MgYm9keSBjb25zaXN0cyBlbnRpcmVseSBvZiBhIEpNUCBpbnN0cnVjdGlvbiwKKyAgLy8gdGhlIGFkZHJlc3MgaXQgSk1QcyB0byAob3IgbW9yZSBwcmVjaXNlbHksIHRoZSBhZGRyZXNzIGF0IHRoZSBlbmQKKyAgLy8gb2YgYSBjaGFpbiBvZiBKTVBzKS4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHN0YXRpYyBUIFJlc29sdmVUYXJnZXQoVCB0YXJnZXRfZnVuY3Rpb24pIHsKKyAgICByZXR1cm4gKFQpUmVzb2x2ZVRhcmdldEltcGwoKHVuc2lnbmVkIGNoYXIqKXRhcmdldF9mdW5jdGlvbiwgTlVMTCk7CisgIH0KKworICAvLyBBbGxvY2F0ZXMgYSBibG9jayBvZiBtZW1vcnkgb2Ygc2l6ZSBNQVhfUFJFQU1CTEVfU1RVQl9TSVpFIHRoYXQgaXMgYXMKKyAgLy8gY2xvc2UgKHdpdGhpbiAyR0IpIGFzIHBvc3NpYmxlIHRvIHRhcmdldC4gIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCAKKyAgLy8gd2UgY2FuIHBlcmZvcm0gYSByZWxhdGl2ZSBqdW1wIGZyb20gdGFyZ2V0IHRvIGEgdHJhbXBvbGluZSBpZiB0aGUgCisgIC8vIHJlcGxhY2VtZW50IGZ1bmN0aW9uIGlzID4gKy0yR0IgZnJvbSB0YXJnZXQuICBUaGlzIG1lYW5zIHRoYXQgd2Ugb25seSBuZWVkIAorICAvLyB0byBwYXRjaCA1IGJ5dGVzIGluIHRoZSB0YXJnZXQgZnVuY3Rpb24uCisgIC8vCisgIC8vIEBwYXJhbSB0YXJnZXQgICAgUG9pbnRlciB0byB0YXJnZXQgZnVuY3Rpb24uCisgIC8vCisgIC8vIEByZXR1cm4gIFJldHVybnMgYSBibG9jayBvZiBtZW1vcnkgb2Ygc2l6ZSBNQVhfUFJFQU1CTEVfU1RVQl9TSVpFIHRoYXQgY2FuCisgIC8vICAgICAgICAgIGJlIHVzZWQgdG8gc3RvcmUgYSBmdW5jdGlvbiBwcmVhbWJsZSBibG9jay4KKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIqIEFsbG9jUHJlYW1ibGVCbG9ja05lYXIodm9pZCogdGFyZ2V0KTsKKworICAvLyBGcmVlcyBhIGJsb2NrIGFsbG9jYXRlZCBieSBBbGxvY1ByZWFtYmxlQmxvY2tOZWFyLgorICAvLworICAvLyBAcGFyYW0gYmxvY2sgICAgIEJsb2NrIHRoYXQgd2FzIHJldHVybmVkIGJ5IEFsbG9jUHJlYW1ibGVCbG9ja05lYXIuCisgIHN0YXRpYyB2b2lkIEZyZWVQcmVhbWJsZUJsb2NrKHVuc2lnbmVkIGNoYXIqIGJsb2NrKTsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBEZWxldGVVbnNpZ25lZENoYXJBcnJheTsKKworICAgLy8gVXNlZCB0byBzdG9yZSBkYXRhIGFsbG9jYXRlZCBmb3IgcHJlYW1ibGUgc3R1YnMKKyAgc3RydWN0IFByZWFtYmxlUGFnZSB7CisgICAgdW5zaWduZWQgaW50IG1hZ2ljXzsKKyAgICBQcmVhbWJsZVBhZ2UqIG5leHRfOworICAgIC8vIFRoaXMgbWVtYmVyIHBvaW50cyB0byBhIGxpbmtlZCBsaXN0IG9mIGZyZWUgYmxvY2tzIHdpdGhpbiB0aGUgcGFnZQorICAgIC8vIG9yIE5VTEwgaWYgYXQgdGhlIGVuZAorICAgIHZvaWQqIGZyZWVfOworICB9OworCisgIC8vIEluIDY0LWJpdCBtb2RlLCB0aGUgcmVwbGFjZW1lbnQgZnVuY3Rpb24gbXVzdCBiZSB3aXRoaW4gMkdCIG9mIHRoZSBvcmlnaW5hbAorICAvLyB0YXJnZXQgaW4gb3JkZXIgdG8gb25seSByZXF1aXJlIDUgYnl0ZXMgZm9yIHRoZSBmdW5jdGlvbiBwYXRjaC4gIFRvIG1lZXQKKyAgLy8gdGhpcyByZXF1aXJlbWVudCB3ZSdyZSBjcmVhdGluZyBhbiBhbGxvY2F0b3Igd2l0aGluIHRoaXMgY2xhc3MgdG8KKyAgLy8gYWxsb2NhdGUgYmxvY2tzIHRoYXQgYXJlIHdpdGhpbiAyR0Igb2YgYSBnaXZlbiB0YXJnZXQuIFRoaXMgbWVtYmVyIGlzIHRoZQorICAvLyBoZWFkIG9mIGEgbGlua2VkIGxpc3Qgb2YgcGFnZXMgdXNlZCB0byBhbGxvY2F0ZSBibG9ja3MgdGhhdCBhcmUgd2l0aGluCisgIC8vIDJHQiBvZiB0aGUgdGFyZ2V0LgorICBzdGF0aWMgUHJlYW1ibGVQYWdlKiBwcmVhbWJsZV9wYWdlc187CisgIAorICAvLyBQYWdlIGdyYW51bGFyaXR5CisgIHN0YXRpYyBsb25nIGdyYW51bGFyaXR5XzsKKworICAvLyBQYWdlIHNpemUKKyAgc3RhdGljIGxvbmcgcGFnZXNpemVfOworCisgIC8vIERldGVybWluZXMgaWYgdGhlIHBhdGNoZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgIHN0YXRpYyBib29sIGluaXRpYWxpemVkXzsKKworICAvLyBVc2VkIHRvIGluaXRpYWxpemUgc3RhdGljIG1lbWJlcnMuCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsKKworICAvLyBQYXRjaGVzIGEgZnVuY3Rpb24gYnkgb3ZlcndyaXRpbmcgaXRzIGZpcnN0IGZldyBieXRlcyB3aXRoCisgIC8vIGEganVtcCB0byBhIGRpZmZlcmVudCBmdW5jdGlvbi4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgUmF3UGF0Y2gKKyAgLy8gZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgdXNlcyB0aGUgc3R1YiBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcgorICAvLyBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgaXQuCisgIC8vCisgIC8vIFdlIGNhbGwgVmlydHVhbFByb3RlY3QgdG8gbWFrZSB0aGUKKyAgLy8gdGFyZ2V0IGZ1bmN0aW9uIHdyaXRhYmxlIGF0IGxlYXN0IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNhbGwuCisgIC8vCisgIC8vIEBwYXJhbSB0YXJnZXRfZnVuY3Rpb24gQSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZQorICAvLyBwYXRjaGVkLgorICAvLworICAvLyBAcGFyYW0gcmVwbGFjZW1lbnRfZnVuY3Rpb24gQSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZAorICAvLyByZXBsYWNlIHRoZSB0YXJnZXQgZnVuY3Rpb24uICBUaGUgcmVwbGFjZW1lbnQgZnVuY3Rpb24gbXVzdCBoYXZlCisgIC8vIGV4YWN0bHkgdGhlIHNhbWUgY2FsbGluZyBjb252ZW50aW9uIGFuZCBwYXJhbWV0ZXJzIGFzIHRoZSBvcmlnaW5hbAorICAvLyBmdW5jdGlvbi4KKyAgLy8KKyAgLy8gQHBhcmFtIHByZWFtYmxlX3N0dWIgQSBwb2ludGVyIHRvIGEgYnVmZmVyIHdoZXJlIHRoZSBwcmVhbWJsZSBzdHViCisgIC8vIHNob3VsZCBiZSBjb3BpZWQuIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8KKyAgLy8gaG9sZCB0aGUgcHJlYW1ibGUgYnl0ZXMuCisgIC8vCisgIC8vIEBwYXJhbSBzdHViX3NpemUgU2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCBmb3IgdGhlCisgIC8vIHByZWFtYmxlX3N0dWIKKyAgLy8KKyAgLy8gQHBhcmFtIGJ5dGVzX25lZWRlZCBQb2ludGVyIHRvIGEgdmFyaWFibGUgdGhhdCByZWNlaXZlcyB0aGUgbWluaW11bQorICAvLyBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzdHViLiAgQ2FuIGJlIHNldCB0byBOVUxMIGlmIHlvdSdyZQorICAvLyBub3QgaW50ZXJlc3RlZC4KKyAgLy8KKyAgLy8gQHJldHVybiBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgdGhlIHJlc3VsdCBvZiBwYXRjaGluZy4KKyAgc3RhdGljIFNpZGVTdGVwRXJyb3IgUmF3UGF0Y2hXaXRoU3R1YkFuZFByb3RlY3Rpb25zKAorICAgICAgdm9pZCogdGFyZ2V0X2Z1bmN0aW9uLAorICAgICAgdm9pZCogcmVwbGFjZW1lbnRfZnVuY3Rpb24sCisgICAgICB1bnNpZ25lZCBjaGFyKiBwcmVhbWJsZV9zdHViLAorICAgICAgdW5zaWduZWQgbG9uZyBzdHViX3NpemUsCisgICAgICB1bnNpZ25lZCBsb25nKiBieXRlc19uZWVkZWQpOworCisgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgUmF3UGF0Y2hXaXRoU3R1YkFuZFByb3RlY3Rpb25zIC0tIGl0CisgIC8vIGRvZXMgZXZlcnl0aGluZyBidXQgdGhlIFZpcnR1YWxQcm90ZWN0IHdvcmsuICBEZWZpbmVkIGluCisgIC8vIHByZWFtYmxlX3BhdGNoZXJfd2l0aF9zdHViLmNjLgorICAvLworICAvLyBAcGFyYW0gdGFyZ2V0X2Z1bmN0aW9uIEEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUKKyAgLy8gcGF0Y2hlZC4KKyAgLy8KKyAgLy8gQHBhcmFtIHJlcGxhY2VtZW50X2Z1bmN0aW9uIEEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzaG91bGQKKyAgLy8gcmVwbGFjZSB0aGUgdGFyZ2V0IGZ1bmN0aW9uLiAgVGhlIHJlcGxhY2VtZW50IGZ1bmN0aW9uIG11c3QgaGF2ZQorICAvLyBleGFjdGx5IHRoZSBzYW1lIGNhbGxpbmcgY29udmVudGlvbiBhbmQgcGFyYW1ldGVycyBhcyB0aGUgb3JpZ2luYWwKKyAgLy8gZnVuY3Rpb24uCisgIC8vCisgIC8vIEBwYXJhbSBwcmVhbWJsZV9zdHViIEEgcG9pbnRlciB0byBhIGJ1ZmZlciB3aGVyZSB0aGUgcHJlYW1ibGUgc3R1YgorICAvLyBzaG91bGQgYmUgY29waWVkLiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHNob3VsZCBiZSBzdWZmaWNpZW50IHRvCisgIC8vIGhvbGQgdGhlIHByZWFtYmxlIGJ5dGVzLgorICAvLworICAvLyBAcGFyYW0gc3R1Yl9zaXplIFNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIHRoZQorICAvLyBwcmVhbWJsZV9zdHViCisgIC8vCisgIC8vIEBwYXJhbSBieXRlc19uZWVkZWQgUG9pbnRlciB0byBhIHZhcmlhYmxlIHRoYXQgcmVjZWl2ZXMgdGhlIG1pbmltdW0KKyAgLy8gbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3R1Yi4gIENhbiBiZSBzZXQgdG8gTlVMTCBpZiB5b3UncmUKKyAgLy8gbm90IGludGVyZXN0ZWQuCisgIC8vCisgIC8vIEByZXR1cm4gQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSByZXN1bHQgb2YgcGF0Y2hpbmcuCisgIHN0YXRpYyBTaWRlU3RlcEVycm9yIFJhd1BhdGNoV2l0aFN0dWIodm9pZCogdGFyZ2V0X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHJlcGxhY2VtZW50X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHByZWFtYmxlX3N0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzdHViX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyogYnl0ZXNfbmVlZGVkKTsKKworCisgIC8vIEEgaGVscGVyIHJvdXRpbmUgd2hlbiBwYXRjaGluZywgd2hpY2ggZm9sbG93cyBqbXAgaW5zdHJ1Y3Rpb25zIGF0CisgIC8vIGZ1bmN0aW9uIGFkZHJlc3NlcywgdG8gZ2V0IHRvIHRoZSAiYWN0dWFsIiBmdW5jdGlvbiBjb250ZW50cy4KKyAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gaWRlbnRpZnkgdHdvIGZ1bmN0aW9ucyB0aGF0IGFyZSBhdCBkaWZmZXJlbnQKKyAgLy8gYWRkcmVzc2VzIGJ1dCBhY3R1YWxseSByZXNvbHZlIHRvIHRoZSBzYW1lIGNvZGUuCisgIC8vCisgIC8vIEBwYXJhbSB0YXJnZXRfZnVuY3Rpb24gUG9pbnRlciB0byBhIGZ1bmN0aW9uLgorICAvLworICAvLyBAcGFyYW0gc3RvcF9iZWZvcmUgSWYsIHdoZW4gZm9sbG93aW5nIEpNUCBpbnN0cnVjdGlvbnMgZnJvbQorICAvLyB0YXJnZXRfZnVuY3Rpb24sIHdlIGdldCB0byB0aGUgYWRkcmVzcyBzdG9wLCB3ZSByZXR1cm4KKyAgLy8gaW1tZWRpYXRlbHksIHRoZSBhZGRyZXNzIHRoYXQganVtcHMgdG8gc3RvcF9iZWZvcmUuCisgIC8vCisgIC8vIEBwYXJhbSBzdG9wX2JlZm9yZV90cmFtcG9saW5lICBXaGVuIGZvbGxvd2luZyBKTVAgaW5zdHJ1Y3Rpb25zIGZyb20gCisgIC8vIHRhcmdldF9mdW5jdGlvbiwgc3RvcCBiZWZvcmUgYSB0cmFtcG9saW5lIGlzIGRldGVjdGVkLiAgU2VlIGNvbW1lbnQgaW4KKyAgLy8gUHJlYW1ibGVQYXRjaGVyOjpSYXdQYXRjaFdpdGhTdHViIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgVGhpcyBwYXJhbWV0ZXIgCisgIC8vIGhhcyBubyBlZmZlY3QgaW4gMzItYml0IG1vZGUuCisgIC8vCisgIC8vIEByZXR1cm4gRWl0aGVyIHRhcmdldF9mdW5jdGlvbiAodGhlIGlucHV0IHBhcmFtZXRlciksIG9yIGlmCisgIC8vIHRhcmdldF9mdW5jdGlvbidzIGJvZHkgY29uc2lzdHMgZW50aXJlbHkgb2YgYSBKTVAgaW5zdHJ1Y3Rpb24sCisgIC8vIHRoZSBhZGRyZXNzIGl0IEpNUHMgdG8gKG9yIG1vcmUgcHJlY2lzZWx5LCB0aGUgYWRkcmVzcyBhdCB0aGUgZW5kCisgIC8vIG9mIGEgY2hhaW4gb2YgSk1QcykuCisgIHN0YXRpYyB2b2lkKiBSZXNvbHZlVGFyZ2V0SW1wbCh1bnNpZ25lZCBjaGFyKiB0YXJnZXRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzdG9wX2JlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RvcF9iZWZvcmVfdHJhbXBvbGluZSA9IGZhbHNlKTsKKworICAvLyBIZWxwZXIgcm91dGluZSB0aGF0IGF0dGVtcHRzIHRvIGFsbG9jYXRlIGEgcGFnZSBhcyBjbG9zZSAod2l0aGluIDJHQikKKyAgLy8gYXMgcG9zc2libGUgdG8gdGFyZ2V0LgorICAvLworICAvLyBAcGFyYW0gdGFyZ2V0ICAgIFBvaW50ZXIgdG8gdGFyZ2V0IGZ1bmN0aW9uLgorICAvLworICAvLyBAcmV0dXJuICAgUmV0dXJucyBhbiBhZGRyZXNzIHRoYXQgaXMgd2l0aGluIDJHQiBvZiB0YXJnZXQuCisgIHN0YXRpYyB2b2lkKiBBbGxvY1BhZ2VOZWFyKHZvaWQqIHRhcmdldCk7CisKKyAgLy8gSGVscGVyIHJvdXRpbmUgdGhhdCBkZXRlcm1pbmVzIGlmIGEgdGFyZ2V0IGluc3RydWN0aW9uIGlzIGEgc2hvcnQKKyAgLy8gY29uZGl0aW9uYWwganVtcC4KKyAgLy8KKyAgLy8gQHBhcmFtIHRhcmdldCAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24uCisgIC8vCisgIC8vIEBwYXJhbSBpbnN0cnVjdGlvbl9zaXplICBTaXplIG9mIHRoZSBpbnN0cnVjdGlvbiBpbiBieXRlcy4KKyAgLy8KKyAgLy8gQHJldHVybiAgUmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIHNob3J0IGNvbmRpdGlvbmFsIGp1bXAuCisgIHN0YXRpYyBib29sIElzU2hvcnRDb25kaXRpb25hbEp1bXAodW5zaWduZWQgY2hhciogdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbl9zaXplKTsKKworICBzdGF0aWMgYm9vbCBJc1Nob3J0SnVtcCh1bnNpZ25lZCBjaGFyICp0YXJnZXQsIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbl9zaXplKTsKKworICAvLyBIZWxwZXIgcm91dGluZSB0aGF0IGRldGVybWluZXMgaWYgYSB0YXJnZXQgaW5zdHJ1Y3Rpb24gaXMgYSBuZWFyCisgIC8vIGNvbmRpdGlvbmFsIGp1bXAuCisgIC8vCisgIC8vIEBwYXJhbSB0YXJnZXQgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RydWN0aW9uLgorICAvLworICAvLyBAcGFyYW0gaW5zdHJ1Y3Rpb25fc2l6ZSAgU2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuCisgIC8vCisgIC8vIEByZXR1cm4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSBuZWFyIGNvbmRpdGlvbmFsIGp1bXAuCisgIHN0YXRpYyBib29sIElzTmVhckNvbmRpdGlvbmFsSnVtcCh1bnNpZ25lZCBjaGFyKiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb25fc2l6ZSk7CisKKyAgLy8gSGVscGVyIHJvdXRpbmUgdGhhdCBkZXRlcm1pbmVzIGlmIGEgdGFyZ2V0IGluc3RydWN0aW9uIGlzIGEgbmVhcgorICAvLyByZWxhdGl2ZSBqdW1wLgorICAvLworICAvLyBAcGFyYW0gdGFyZ2V0ICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0cnVjdGlvbi4KKyAgLy8KKyAgLy8gQHBhcmFtIGluc3RydWN0aW9uX3NpemUgIFNpemUgb2YgdGhlIGluc3RydWN0aW9uIGluIGJ5dGVzLgorICAvLworICAvLyBAcmV0dXJuICBSZXR1cm5zIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGEgbmVhciBhYnNvbHV0ZSBqdW1wLgorICBzdGF0aWMgYm9vbCBJc05lYXJSZWxhdGl2ZUp1bXAodW5zaWduZWQgY2hhciogdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluc3RydWN0aW9uX3NpemUpOworCisgIC8vIEhlbHBlciByb3V0aW5lIHRoYXQgZGV0ZXJtaW5lcyBpZiBhIHRhcmdldCBpbnN0cnVjdGlvbiBpcyBhIG5lYXIgCisgIC8vIGFic29sdXRlIGNhbGwuCisgIC8vCisgIC8vIEBwYXJhbSB0YXJnZXQgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RydWN0aW9uLgorICAvLworICAvLyBAcGFyYW0gaW5zdHJ1Y3Rpb25fc2l6ZSAgU2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuCisgIC8vCisgIC8vIEByZXR1cm4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSBuZWFyIGFic29sdXRlIGNhbGwuCisgIHN0YXRpYyBib29sIElzTmVhckFic29sdXRlQ2FsbCh1bnNpZ25lZCBjaGFyKiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb25fc2l6ZSk7CisKKyAgLy8gSGVscGVyIHJvdXRpbmUgdGhhdCBkZXRlcm1pbmVzIGlmIGEgdGFyZ2V0IGluc3RydWN0aW9uIGlzIGEgbmVhciAKKyAgLy8gYWJzb2x1dGUgY2FsbC4KKyAgLy8KKyAgLy8gQHBhcmFtIHRhcmdldCAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24uCisgIC8vCisgIC8vIEBwYXJhbSBpbnN0cnVjdGlvbl9zaXplICBTaXplIG9mIHRoZSBpbnN0cnVjdGlvbiBpbiBieXRlcy4KKyAgLy8KKyAgLy8gQHJldHVybiAgUmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIG5lYXIgYWJzb2x1dGUgY2FsbC4KKyAgc3RhdGljIGJvb2wgSXNOZWFyUmVsYXRpdmVDYWxsKHVuc2lnbmVkIGNoYXIqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbl9zaXplKTsKKworICAvLyBIZWxwZXIgcm91dGluZSB0aGF0IGRldGVybWluZXMgaWYgYSB0YXJnZXQgaW5zdHJ1Y3Rpb24gaXMgYSA2NC1iaXQgTU9WCisgIC8vIHRoYXQgdXNlcyBhIFJJUC1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQuCisgIC8vCisgIC8vIEBwYXJhbSB0YXJnZXQgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RydWN0aW9uLgorICAvLworICAvLyBAcGFyYW0gaW5zdHJ1Y3Rpb25fc2l6ZSAgU2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuCisgIC8vCisgIC8vIEByZXR1cm4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSBNT1Ygd2l0aCBkaXNwbGFjZW1lbnQuCisgIHN0YXRpYyBib29sIElzTW92V2l0aERpc3BsYWNlbWVudCh1bnNpZ25lZCBjaGFyKiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb25fc2l6ZSk7CisKKyAgLy8gSGVscGVyIHJvdXRpbmUgdGhhdCBjb252ZXJ0cyBhIHNob3J0IGNvbmRpdGlvbmFsIGp1bXAgaW5zdHJ1Y3Rpb24KKyAgLy8gdG8gYSBuZWFyIGNvbmRpdGlvbmFsIGp1bXAgaW4gYSB0YXJnZXQgYnVmZmVyLiAgTm90ZSB0aGF0IHRoZSB0YXJnZXQKKyAgLy8gYnVmZmVyIG11c3QgYmUgd2l0aGluIDJHQiBvZiB0aGUgc291cmNlIGZvciB0aGUgbmVhciBqdW1wIHRvIHdvcmsuCisgIC8vCisgIC8vIEEgc2hvcnQgY29uZGl0aW9uYWwganVtcCBpbnN0cnVjdGlvbiBpcyBpbiB0aGUgZm9ybWF0OgorICAvLyA3eCB4eCA9IEpjYyByZWw4b2ZmCisgIC8vCisgIC8vIEBwYXJhbSBzb3VyY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24uCisgIC8vCisgIC8vIEBwYXJhbSBpbnN0cnVjdGlvbl9zaXplICAgIFNpemUgb2YgdGhlIGluc3RydWN0aW9uLgorICAvLworICAvLyBAcGFyYW0gdGFyZ2V0ICAgICAgICAgICAgICBUYXJnZXQgYnVmZmVyIHRvIHdyaXRlIHRoZSBuZXcgaW5zdHJ1Y3Rpb24uCisgIC8vCisgIC8vIEBwYXJhbSB0YXJnZXRfYnl0ZXMgICAgICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgc2l6ZQorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdGFyZ2V0IGluc3RydWN0aW9uLCBpbiBieXRlcy4KKyAgLy8KKyAgLy8gQHBhcmFtIHRhcmdldF9zaXplICAgICAgICAgU2l6ZSBvZiB0aGUgdGFyZ2V0IGJ1ZmZlci4KKyAgLy8KKyAgLy8gQHJldHVybiAgUmV0dXJucyBTSURFU1RFUF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhbiBlcnJvci4KKyAgc3RhdGljIFNpZGVTdGVwRXJyb3IgUGF0Y2hTaG9ydENvbmRpdGlvbmFsSnVtcCh1bnNpZ25lZCBjaGFyKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluc3RydWN0aW9uX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogdGFyZ2V0X2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfc2l6ZSk7CisKKyAgc3RhdGljIFNpZGVTdGVwRXJyb3IgUGF0Y2hTaG9ydEp1bXAodW5zaWduZWQgY2hhciogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb25fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIHRhcmdldF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdldF9zaXplKTsKKworICAvLyBIZWxwZXIgcm91dGluZSB0aGF0IGNvbnZlcnRzIGFuIGluc3RydWN0aW9uIHRoYXQgd2lsbCBjb252ZXJ0IHZhcmlvdXMKKyAgLy8ganVtcC1saWtlIGluc3RydWN0aW9ucyB0byBjb3JyZXNwb25kaW5nIGluc3RydWN0aW9ucyBpbiB0aGUgdGFyZ2V0IGJ1ZmZlci4KKyAgLy8gV2hhdCB0aGlzIHJvdXRpbmUgZG9lcyBpcyBmaXggdXAgdGhlIHJlbGF0aXZlIG9mZnNldHMgY29udGFpbmVkIGluIGp1bXAKKyAgLy8gaW5zdHJ1Y3Rpb25zIHRvIHBvaW50IGJhY2sgdG8gdGhlIG9yaWdpbmFsIHRhcmdldCByb3V0aW5lLiAgTGlrZSB3aXRoCisgIC8vIFBhdGNoU2hvcnRDb25kaXRpb25hbEp1bXAsIHRoZSB0YXJnZXQgYnVmZmVyIG11c3QgYmUgd2l0aGluIDJHQiBvZiB0aGUKKyAgLy8gc291cmNlLgorICAvLworICAvLyBXZSBjdXJyZW50bHkgaGFuZGxlIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zOgorICAvLworICAvLyBFOSB4eCB4eCB4eCB4eCAgICAgPSBKTVAgcmVsMzJvZmYKKyAgLy8gMEYgOHggeHggeHggeHggeHggID0gSmNjIHJlbDMyb2ZmCisgIC8vIEZGIC8yIHh4IHh4IHh4IHh4ICA9IENBTEwgcmVnL21lbTMyL21lbTY0CisgIC8vIEU4IHh4IHh4IHh4IHh4ICAgICA9IENBTEwgcmVsMzJvZmYKKyAgLy8KKyAgLy8gSXQgc2hvdWxkIG5vdCBiZSBoYXJkIHRvIHVwZGF0ZSB0aGlzIGZ1bmN0aW9uIHRvIHN1cHBvcnQgb3RoZXIKKyAgLy8gaW5zdHJ1Y3Rpb25zIHRoYXQganVtcCB0byByZWxhdGl2ZSB0YXJnZXRzLgorICAvLworICAvLyBAcGFyYW0gc291cmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RydWN0aW9uLgorICAvLworICAvLyBAcGFyYW0gaW5zdHJ1Y3Rpb25fc2l6ZSAgICBTaXplIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgLy8KKyAgLy8gQHBhcmFtIHRhcmdldCAgICAgICAgICAgICAgVGFyZ2V0IGJ1ZmZlciB0byB3cml0ZSB0aGUgbmV3IGluc3RydWN0aW9uLgorICAvLworICAvLyBAcGFyYW0gdGFyZ2V0X2J5dGVzICAgICAgICBQb2ludGVyIHRvIGEgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHNpemUKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHRhcmdldCBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuCisgIC8vCisgIC8vIEBwYXJhbSB0YXJnZXRfc2l6ZSAgICAgICAgIFNpemUgb2YgdGhlIHRhcmdldCBidWZmZXIuCisgIC8vCisgIC8vIEByZXR1cm4gIFJldHVybnMgU0lERVNURVBfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgYW4gZXJyb3IuCisgIHN0YXRpYyBTaWRlU3RlcEVycm9yIFBhdGNoTmVhckp1bXBPckNhbGwodW5zaWduZWQgY2hhciogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIHRhcmdldF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X3NpemUpOworICAKKyAgLy8gSGVscGVyIHJvdXRpbmUgdGhhdCBwYXRjaGVzIGEgNjQtYml0IE1PViBpbnN0cnVjdGlvbiB3aXRoIGEgUklQLXJlbGF0aXZlCisgIC8vIGRpc3BsYWNlbWVudC4gIFRoZSB0YXJnZXQgYnVmZmVyIG11c3QgYmUgd2l0aGluIDJHQiBvZiB0aGUgc291cmNlLgorICAvLworICAvLyA0OCA4QiAwRCBYWCBYWCBYWCBYWCA9IE1PViByZWwzMm9mZgorICAvLworICAvLyBAcGFyYW0gc291cmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RydWN0aW9uLgorICAvLworICAvLyBAcGFyYW0gaW5zdHJ1Y3Rpb25fc2l6ZSAgICBTaXplIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgLy8KKyAgLy8gQHBhcmFtIHRhcmdldCAgICAgICAgICAgICAgVGFyZ2V0IGJ1ZmZlciB0byB3cml0ZSB0aGUgbmV3IGluc3RydWN0aW9uLgorICAvLworICAvLyBAcGFyYW0gdGFyZ2V0X2J5dGVzICAgICAgICBQb2ludGVyIHRvIGEgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHNpemUKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHRhcmdldCBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuCisgIC8vCisgIC8vIEBwYXJhbSB0YXJnZXRfc2l6ZSAgICAgICAgIFNpemUgb2YgdGhlIHRhcmdldCBidWZmZXIuCisgIC8vCisgIC8vIEByZXR1cm4gIFJldHVybnMgU0lERVNURVBfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgYW4gZXJyb3IuCisgIHN0YXRpYyBTaWRlU3RlcEVycm9yIFBhdGNoTW92V2l0aERpc3BsYWNlbWVudCh1bnNpZ25lZCBjaGFyKiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb25fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogdGFyZ2V0X2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdldF9zaXplKTsKK307CisKK307ICAvLyBuYW1lc3BhY2Ugc2lkZXN0ZXAKKworI2VuZGlmICAvLyBHT09HTEVfUEVSRlRPT0xTX1BSRUFNQkxFX1BBVENIRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy93aW5kb3dzL3ByZWFtYmxlX3BhdGNoZXJfdGVzdC5jYyBiL3NyYy93aW5kb3dzL3ByZWFtYmxlX3BhdGNoZXJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDYwNWM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3MvcHJlYW1ibGVfcGF0Y2hlcl90ZXN0LmNjCkBAIC0wLDAgKzEsMzY4IEBACisvLyAtKi0gTW9kZTogQysrOyBjLWJhc2ljLW9mZnNldDogMjsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorLyogQ29weXJpZ2h0IChjKSAyMDExLCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAtLS0KKyAqIEF1dGhvcjogSm9pIFNpZ3VyZHNzb24KKyAqIEF1dGhvcjogU2NvdHQgRnJhbmNpcworICoKKyAqIFVuaXQgdGVzdHMgZm9yIFByZWFtYmxlUGF0Y2hlcgorICovCisKKyNpbmNsdWRlICJjb25maWdfZm9yX3VuaXR0ZXN0cy5oIgorI2luY2x1ZGUgInByZWFtYmxlX3BhdGNoZXIuaCIKKyNpbmNsdWRlICJtaW5pX2Rpc2Fzc2VtYmxlci5oIgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0NTUzKQorI2luY2x1ZGUgImF1dG9fdGVzdGluZ19ob29rLmgiCisjcHJhZ21hIHdhcm5pbmcocG9wKQorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8dGNoYXIuaD4KKworLy8gVHVybmluZyBvZmYgYWxsIG9wdGltaXphdGlvbnMgZm9yIHRoaXMgZmlsZSwgc2luY2UgdGhlIG9mZmljaWFsIGJ1aWxkJ3MKKy8vICJXaG9sZSBwcm9ncmFtIG9wdGltaXphdGlvbiIgc2VlbXMgdG8gY2F1c2UgdGhlIFRlc3RQYXRjaFVzaW5nRHluYW1pY1N0dWIKKy8vIHRlc3QgdG8gY3Jhc2ggd2l0aCBhbiBhY2Nlc3MgdmlvbGF0aW9uLiAgV2UgZGVidWdnZWQgdGhpcyBhbmQgZm91bmQKKy8vIHRoYXQgdGhlIG9wdGltaXplZCBhY2Nlc3MgYSByZWdpc3RlciB0aGF0IGlzIGNoYW5nZWQgYnkgYSBjYWxsIHRvIHRoZSBob29rCisvLyBmdW5jdGlvbi4KKyNwcmFnbWEgb3B0aW1pemUoIiIsIG9mZikKKworLy8gQSBjb252ZW5pZW5jZSBtYWNybyB0byBhdm9pZCBhIGxvdCBvZiBjYXN0aW5nIGluIHRoZSB0ZXN0cy4KKy8vIEkgdHJpZWQgdG8gbWFrZSB0aGlzIGEgdGVtcGxhdGVkIGZ1bmN0aW9uLCBidXQgd2luZG93cyBjb21wbGFpbmVkOgorLy8gICAgIGVycm9yIEMyNzgyOiAnc2lkZXN0ZXA6OlNpZGVTdGVwRXJyb3IgYGFub255bW91cy1uYW1lc3BhY2UnOjpVbnBhdGNoKFQsVCxUICopJyA6IHRlbXBsYXRlIHBhcmFtZXRlciAnVCcgaXMgYW1iaWd1b3VzCisvLyAgICAgICAgY291bGQgYmUgJ2ludCAoaW50KScKKy8vICAgICAgICBvciAgICAgICAnaW50IChfX2NkZWNsICopKGludCknCisvLyBNeSBsaWZlIGlzbid0IGxvbmcgZW5vdWdoIHRvIHRyeSB0byBmaWd1cmUgb3V0IGhvdyB0byBmaXggdGhpcy4KKyNkZWZpbmUgVU5QQVRDSCh0YXJnZXRfZnVuY3Rpb24sIHJlcGxhY2VtZW50X2Z1bmN0aW9uLCBvcmlnaW5hbF9mdW5jdGlvbl9zdHViKSBcCisgIHNpZGVzdGVwOjpQcmVhbWJsZVBhdGNoZXI6OlVucGF0Y2goKHZvaWQqKSh0YXJnZXRfZnVuY3Rpb24pLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKShyZXBsYWNlbWVudF9mdW5jdGlvbiksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKShvcmlnaW5hbF9mdW5jdGlvbikpCisKK25hbWVzcGFjZSB7CisKKy8vIEZ1bmN0aW9uIGZvciB0ZXN0aW5nIC0gdGhpcyBpcyB3aGF0IHdlIHBhdGNoCisvLworLy8gTk9URTogIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgY29tcGlsZXIgb3B0aW1pemVzIHRoaXMgZnVuY3Rpb24gaW4KKy8vIHJlbGVhc2UgYnVpbGRzLCB3ZSBuZWVkIHRvIHVzZSBhIGRpZmZlcmVudCBpbnB1dCB2YWx1ZSBldmVyeSB0aW1lIHdlCisvLyBjYWxsIGl0IHdpdGhpbiBhIGZ1bmN0aW9uLCBvdGhlcndpc2UgdGhlIGNvbXBpbGVyIHdpbGwganVzdCByZXVzZSB0aGUKKy8vIGxhc3QgY2FsY3VsYXRlZCBpbmNyZW1lbnRlZCB2YWx1ZS4KK2ludCBfX2RlY2xzcGVjKG5vaW5saW5lKSBJbmNyZW1lbnROdW1iZXIoaW50IGkpIHsKKyNpZmRlZiBfTV9YNjQKKyAgX19pbnQ2NCBpMiA9IGkgKyAxOworICByZXR1cm4gKGludCkgaTI7CisjZWxzZQorICAgcmV0dXJuIGkgKyAxOworI2VuZGlmCit9CisKK2V4dGVybiAiQyIgaW50IFRvb1Nob3J0RnVuY3Rpb24oaW50KTsKKworZXh0ZXJuICJDIiBpbnQgSnVtcFNob3J0Q29uZEZ1bmN0aW9uKGludCk7CisKK2V4dGVybiAiQyIgaW50IEp1bXBOZWFyQ29uZEZ1bmN0aW9uKGludCk7CisKK2V4dGVybiAiQyIgaW50IEp1bXBBYnNvbHV0ZUZ1bmN0aW9uKGludCk7CisKK2V4dGVybiAiQyIgaW50IENhbGxOZWFyUmVsYXRpdmVGdW5jdGlvbihpbnQpOworCit0eXBlZGVmIGludCAoKkluY3JlbWVudGluZ0Z1bmMpKGludCk7CitJbmNyZW1lbnRpbmdGdW5jIG9yaWdpbmFsX2Z1bmN0aW9uID0gTlVMTDsKKworaW50IEhvb2tJbmNyZW1lbnROdW1iZXIoaW50IGkpIHsKKyAgU0lERVNURVBfQVNTRVJUKG9yaWdpbmFsX2Z1bmN0aW9uICE9IE5VTEwpOworICBpbnQgaW5jcmVtZW50ZWRfb25jZSA9IG9yaWdpbmFsX2Z1bmN0aW9uKGkpOworICByZXR1cm4gaW5jcmVtZW50ZWRfb25jZSArIDE7Cit9CisKKy8vIEZvciB0aGUgQXV0b1Rlc3RpbmdIb29rIHRlc3QsIHdlIGNhbid0IHVzZSBvcmlnaW5hbF9mdW5jdGlvbiwgYmVjYXVzZQorLy8gYWxsIHRoYXQgaXMgZW5jYXBzdWxhdGVkLgorLy8gVGhpcyBmdW5jdGlvbiAiaW5jcmVtZW50cyIgYnkgMTAsIGp1c3QgdG8gc2V0IGl0IGFwYXJ0IGZyb20gdGhlIG90aGVyCisvLyBmdW5jdGlvbnMuCitpbnQgX19kZWNsc3BlYyhub2lubGluZSkgQXV0b0hvb2tJbmNyZW1lbnROdW1iZXIoaW50IGkpIHsKKyAgcmV0dXJuIGkgKyAxMDsKK30KKworfTsgIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc2lkZXN0ZXAgeworCitib29sIFRlc3REaXNhc3NlbWJsZXIoKSB7CisgICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb25fc2l6ZSA9IDA7CisgICBzaWRlc3RlcDo6TWluaURpc2Fzc2VtYmxlciBkaXNhc3NlbWJsZXI7CisgICB2b2lkICogdGFyZ2V0ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyICo+KEluY3JlbWVudE51bWJlcik7CisgICB2b2lkICogbmV3X3RhcmdldCA9IFByZWFtYmxlUGF0Y2hlcjo6UmVzb2x2ZVRhcmdldCh0YXJnZXQpOworICAgaWYgKHRhcmdldCAhPSBuZXdfdGFyZ2V0KQorICAgICAgdGFyZ2V0ID0gbmV3X3RhcmdldDsKKworICAgd2hpbGUgKDEpIHsKKyAgICAgIHNpZGVzdGVwOjpJbnN0cnVjdGlvblR5cGUgaW5zdHJ1Y3Rpb25UeXBlID0gZGlzYXNzZW1ibGVyLkRpc2Fzc2VtYmxlKAorICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyICo+KHRhcmdldCkgKyBpbnN0cnVjdGlvbl9zaXplLAorICAgICAgICAgaW5zdHJ1Y3Rpb25fc2l6ZSk7CisgICAgICBpZiAoc2lkZXN0ZXA6OklUX1JFVFVSTiA9PSBpbnN0cnVjdGlvblR5cGUpIHsKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgfQorfQorCitib29sIFRlc3RQYXRjaFdpdGhMb25nSnVtcCgpIHsKKyAgb3JpZ2luYWxfZnVuY3Rpb24gPSBOVUxMOworICB2b2lkICpwID0gOjpWaXJ0dWFsQWxsb2MocmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KDB4MDAwMDAyMDAwMDAwMDAwMCksIDQwOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1fUkVTRVJWRSB8IE1FTV9DT01NSVQsIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShwICE9IE5VTEwpOworICBtZW1zZXQocCwgMHhjYywgNDA5Nik7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKHNpZGVzdGVwOjpTSURFU1RFUF9TVUNDRVNTID09CisgICAgICAgICAgICAgICAgICAgICAgIHNpZGVzdGVwOjpQcmVhbWJsZVBhdGNoZXI6OlBhdGNoKEluY3JlbWVudE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEluY3JlbWVudGluZ0Z1bmMpIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmlnaW5hbF9mdW5jdGlvbikpOworICBTSURFU1RFUF9BU1NFUlQoKCpvcmlnaW5hbF9mdW5jdGlvbikoMSkgPT0gMik7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKHNpZGVzdGVwOjpTSURFU1RFUF9TVUNDRVNTID09CisgICAgICAgICAgICAgICAgICAgICAgIFVOUEFUQ0goSW5jcmVtZW50TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbmNyZW1lbnRpbmdGdW5jKXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfZnVuY3Rpb24pKTsKKyAgOjpWaXJ0dWFsRnJlZShwLCAwLCBNRU1fUkVMRUFTRSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFRlc3RQYXRjaFdpdGhQcmVhbWJsZVNob3J0Q29uZEp1bXAoKSB7CisgIG9yaWdpbmFsX2Z1bmN0aW9uID0gTlVMTDsKKyAgU0lERVNURVBfRVhQRUNUX1RSVUUoc2lkZXN0ZXA6OlNJREVTVEVQX1NVQ0NFU1MgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgc2lkZXN0ZXA6OlByZWFtYmxlUGF0Y2hlcjo6UGF0Y2goSnVtcFNob3J0Q29uZEZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rSW5jcmVtZW50TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JpZ2luYWxfZnVuY3Rpb24pKTsKKyAgKCpvcmlnaW5hbF9mdW5jdGlvbikoMSk7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKHNpZGVzdGVwOjpTSURFU1RFUF9TVUNDRVNTID09CisgICAgICAgICAgICAgICAgICAgICAgIFVOUEFUQ0goSnVtcFNob3J0Q29uZEZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilIb29rSW5jcmVtZW50TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsX2Z1bmN0aW9uKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFRlc3RQYXRjaFdpdGhQcmVhbWJsZU5lYXJSZWxhdGl2ZUNvbmRKdW1wKCkgeworICBvcmlnaW5hbF9mdW5jdGlvbiA9IE5VTEw7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKHNpZGVzdGVwOjpTSURFU1RFUF9TVUNDRVNTID09CisgICAgICAgICAgICAgICAgICAgICAgIHNpZGVzdGVwOjpQcmVhbWJsZVBhdGNoZXI6OlBhdGNoKEp1bXBOZWFyQ29uZEZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rSW5jcmVtZW50TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JpZ2luYWxfZnVuY3Rpb24pKTsKKyAgKCpvcmlnaW5hbF9mdW5jdGlvbikoMCk7CisgICgqb3JpZ2luYWxfZnVuY3Rpb24pKDEpOworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShzaWRlc3RlcDo6U0lERVNURVBfU1VDQ0VTUyA9PQorICAgICAgICAgICAgICAgICAgICAgICBVTlBBVENIKEp1bXBOZWFyQ29uZEZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvb2tJbmNyZW1lbnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfZnVuY3Rpb24pKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVGVzdFBhdGNoV2l0aFByZWFtYmxlQWJzb2x1dGVKdW1wKCkgeworICBvcmlnaW5hbF9mdW5jdGlvbiA9IE5VTEw7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKHNpZGVzdGVwOjpTSURFU1RFUF9TVUNDRVNTID09CisgICAgICAgICAgICAgICAgICAgICAgIHNpZGVzdGVwOjpQcmVhbWJsZVBhdGNoZXI6OlBhdGNoKEp1bXBBYnNvbHV0ZUZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rSW5jcmVtZW50TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JpZ2luYWxfZnVuY3Rpb24pKTsKKyAgKCpvcmlnaW5hbF9mdW5jdGlvbikoMCk7CisgICgqb3JpZ2luYWxfZnVuY3Rpb24pKDEpOworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShzaWRlc3RlcDo6U0lERVNURVBfU1VDQ0VTUyA9PQorICAgICAgICAgICAgICAgICAgICAgICBVTlBBVENIKEp1bXBBYnNvbHV0ZUZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvb2tJbmNyZW1lbnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfZnVuY3Rpb24pKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVGVzdFBhdGNoV2l0aFByZWFtYmxlTmVhclJlbGF0aXZlQ2FsbCgpIHsKKyAgb3JpZ2luYWxfZnVuY3Rpb24gPSBOVUxMOworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShzaWRlc3RlcDo6U0lERVNURVBfU1VDQ0VTUyA9PQorICAgICAgICAgICAgICAgICAgICAgICBzaWRlc3RlcDo6UHJlYW1ibGVQYXRjaGVyOjpQYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsTmVhclJlbGF0aXZlRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9va0luY3JlbWVudE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JpZ2luYWxfZnVuY3Rpb24pKTsKKyAgKCpvcmlnaW5hbF9mdW5jdGlvbikoMCk7CisgICgqb3JpZ2luYWxfZnVuY3Rpb24pKDEpOworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShzaWRlc3RlcDo6U0lERVNURVBfU1VDQ0VTUyA9PQorICAgICAgICAgICAgICAgICAgICAgICBVTlBBVENIKENhbGxOZWFyUmVsYXRpdmVGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rSW5jcmVtZW50TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsX2Z1bmN0aW9uKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFRlc3RQYXRjaFVzaW5nRHluYW1pY1N0dWIoKSB7CisgIG9yaWdpbmFsX2Z1bmN0aW9uID0gTlVMTDsKKyAgU0lERVNURVBfRVhQRUNUX1RSVUUoSW5jcmVtZW50TnVtYmVyKDEpID09IDIpOworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShzaWRlc3RlcDo6U0lERVNURVBfU1VDQ0VTUyA9PQorICAgICAgICAgICAgICAgICAgICAgICBzaWRlc3RlcDo6UHJlYW1ibGVQYXRjaGVyOjpQYXRjaChJbmNyZW1lbnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvb2tJbmNyZW1lbnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmlnaW5hbF9mdW5jdGlvbikpOworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShvcmlnaW5hbF9mdW5jdGlvbik7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKEluY3JlbWVudE51bWJlcigyKSA9PSA0KTsKKyAgU0lERVNURVBfRVhQRUNUX1RSVUUob3JpZ2luYWxfZnVuY3Rpb24oMykgPT0gNCk7CisKKyAgLy8gQ2xlYXJib3ggdGVzdCB0byBzZWUgdGhhdCB0aGUgZnVuY3Rpb24gaGFzIGJlZW4gcGF0Y2hlZC4KKyAgc2lkZXN0ZXA6Ok1pbmlEaXNhc3NlbWJsZXIgZGlzYXNzZW1ibGVyOworICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb25fc2l6ZSA9IDA7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKHNpZGVzdGVwOjpJVF9KVU1QID09IGRpc2Fzc2VtYmxlci5EaXNhc3NlbWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KEluY3JlbWVudE51bWJlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl9zaXplKSk7CisKKyAgLy8gU2luY2Ugd2UgcGF0Y2hlZCBJbmNyZW1lbnROdW1iZXIsIGl0cyBmaXJzdCBzdGF0ZW1lbnQgaXMgYQorICAvLyBqbXAgdG8gdGhlIGhvb2sgZnVuY3Rpb24uICBTbyB2ZXJpZnkgdGhhdCB3ZSBub3cgY2FuIG5vdCBwYXRjaAorICAvLyBJbmNyZW1lbnROdW1iZXIgYmVjYXVzZSBpdCBzdGFydHMgd2l0aCBhIGp1bXAuCisjaWYgMAorICBJbmNyZW1lbnRpbmdGdW5jIGR1bW15ID0gTlVMTDsKKyAgLy8gVE9ETyhqb2lAY2hyb21pdW0ub3JnKTogcmVzdG9yZSB0aGlzIHRlc3Qgb25jZSBmbGFnIGlzIGFkZGVkIHRvCisgIC8vIGRpc2FibGUgSk1QIGZvbGxvd2luZworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShzaWRlc3RlcDo6U0lERVNURVBfSlVNUF9JTlNUUlVDVElPTiA9PQorICAgICAgICAgICAgICAgICAgICAgICBzaWRlc3RlcDo6UHJlYW1ibGVQYXRjaGVyOjpQYXRjaChJbmNyZW1lbnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvb2tJbmNyZW1lbnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teSkpOworCisgIC8vIFRoaXMgdGVzdCBkaXNhYmxlZCBiZWNhdXNlIGNvZGUgaW4gcHJlYW1ibGVfcGF0Y2hlcl93aXRoX3N0dWIuY2MKKyAgLy8gYXNzZXJ0cyBiZWZvcmUgcmV0dXJuaW5nIHRoZSBlcnJvciBjb2RlIC0tIHNvIHRoZXJlIGlzIG5vIHdheQorICAvLyB0byBnZXQgYW4gZXJyb3IgY29kZSBoZXJlLCBpbiBkZWJ1ZyBidWlsZC4KKyAgZHVtbXkgPSBOVUxMOworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShzaWRlc3RlcDo6U0lERVNURVBfRlVOQ1RJT05fVE9PX1NNQUxMID09CisgICAgICAgICAgICAgICAgICAgICAgIHNpZGVzdGVwOjpQcmVhbWJsZVBhdGNoZXI6OlBhdGNoKFRvb1Nob3J0RnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvb2tJbmNyZW1lbnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teSkpOworI2VuZGlmCisKKyAgU0lERVNURVBfRVhQRUNUX1RSVUUoc2lkZXN0ZXA6OlNJREVTVEVQX1NVQ0NFU1MgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgVU5QQVRDSChJbmNyZW1lbnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9va0luY3JlbWVudE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbF9mdW5jdGlvbikpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXRjaFRoZW5VbnBhdGNoKCkgeworICBvcmlnaW5hbF9mdW5jdGlvbiA9IE5VTEw7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKHNpZGVzdGVwOjpTSURFU1RFUF9TVUNDRVNTID09CisgICAgICAgICAgICAgICAgICAgICAgIHNpZGVzdGVwOjpQcmVhbWJsZVBhdGNoZXI6OlBhdGNoKEluY3JlbWVudE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9va0luY3JlbWVudE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yaWdpbmFsX2Z1bmN0aW9uKSk7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKG9yaWdpbmFsX2Z1bmN0aW9uKTsKKyAgU0lERVNURVBfRVhQRUNUX1RSVUUoSW5jcmVtZW50TnVtYmVyKDEpID09IDMpOworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShvcmlnaW5hbF9mdW5jdGlvbigyKSA9PSAzKTsKKworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShzaWRlc3RlcDo6U0lERVNURVBfU1VDQ0VTUyA9PQorICAgICAgICAgICAgICAgICAgICAgICBVTlBBVENIKEluY3JlbWVudE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rSW5jcmVtZW50TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsX2Z1bmN0aW9uKSk7CisgIG9yaWdpbmFsX2Z1bmN0aW9uID0gTlVMTDsKKyAgU0lERVNURVBfRVhQRUNUX1RSVUUoSW5jcmVtZW50TnVtYmVyKDMpID09IDQpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIEF1dG9UZXN0aW5nSG9va1Rlc3QoKSB7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKEluY3JlbWVudE51bWJlcigxKSA9PSAyKTsKKworICAvLyBJbm5lciBzY29wZSwgc28gd2UgY2FuIHRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIEF1dG9UZXN0aW5nSG9vaworICAvLyBnb2VzIG91dCBvZiBzY29wZQorICB7CisgICAgQXV0b1Rlc3RpbmdIb29rIGhvb2sgPSBNYWtlVGVzdGluZ0hvb2soSW5jcmVtZW50TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9Ib29rSW5jcmVtZW50TnVtYmVyKTsKKyAgICAodm9pZCkgaG9vazsKKyAgICBTSURFU1RFUF9FWFBFQ1RfVFJVRShJbmNyZW1lbnROdW1iZXIoMikgPT0gMTIpOworICB9CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKEluY3JlbWVudE51bWJlcigzKSA9PSA0KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBdXRvVGVzdGluZ0hvb2tJbkNvbnRhaW5lclRlc3QoKSB7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKEluY3JlbWVudE51bWJlcigxKSA9PSAyKTsKKworICAvLyBJbm5lciBzY29wZSwgc28gd2UgY2FuIHRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIEF1dG9UZXN0aW5nSG9vaworICAvLyBnb2VzIG91dCBvZiBzY29wZQorICB7CisgICAgQXV0b1Rlc3RpbmdIb29rSG9sZGVyIGhvb2soTWFrZVRlc3RpbmdIb29rSG9sZGVyKEluY3JlbWVudE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b0hvb2tJbmNyZW1lbnROdW1iZXIpKTsKKyAgICAodm9pZCkgaG9vazsKKyAgICBTSURFU1RFUF9FWFBFQ1RfVFJVRShJbmNyZW1lbnROdW1iZXIoMikgPT0gMTIpOworICB9CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKEluY3JlbWVudE51bWJlcigzKSA9PSA0KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUZXN0UHJlYW1ibGVBbGxvY2F0aW9uKCkgeworICBfX2ludDY0IGRpZmYgPSAwOworICB2b2lkKiBwMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KDB4MTEwMDAwMDAwKTsKKyAgdm9pZCogcDIgPSByZWludGVycHJldF9jYXN0PHZvaWQqPigweDgxMDAwMDAwMCk7CisgIHVuc2lnbmVkIGNoYXIqIGIxID0gUHJlYW1ibGVQYXRjaGVyOjpBbGxvY1ByZWFtYmxlQmxvY2tOZWFyKHAxKTsKKyAgU0lERVNURVBfRVhQRUNUX1RSVUUoYjEgIT0gTlVMTCk7CisgIGRpZmYgPSByZWludGVycHJldF9jYXN0PF9faW50NjQ+KHAxKSAtIHJlaW50ZXJwcmV0X2Nhc3Q8X19pbnQ2ND4oYjEpOworICAvLyBFbnN1cmUgYmxvY2tzIGFyZSB3aXRoaW4gMkdCCisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKGRpZmYgPD0gSU5UX01BWCAmJiBkaWZmID49IElOVF9NSU4pOworICB1bnNpZ25lZCBjaGFyKiBiMiA9IFByZWFtYmxlUGF0Y2hlcjo6QWxsb2NQcmVhbWJsZUJsb2NrTmVhcihwMik7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKGIyICE9IE5VTEwpOworICBkaWZmID0gcmVpbnRlcnByZXRfY2FzdDxfX2ludDY0PihwMikgLSByZWludGVycHJldF9jYXN0PF9faW50NjQ+KGIyKTsKKyAgU0lERVNURVBfRVhQRUNUX1RSVUUoZGlmZiA8PSBJTlRfTUFYICYmIGRpZmYgPj0gSU5UX01JTik7CisKKyAgLy8gRW5zdXJlIHdlJ3JlIHJldXNpbmcgZnJlZSBibG9ja3MKKyAgdW5zaWduZWQgY2hhciogYjMgPSBiMTsKKyAgdW5zaWduZWQgY2hhciogYjQgPSBiMjsKKyAgUHJlYW1ibGVQYXRjaGVyOjpGcmVlUHJlYW1ibGVCbG9jayhiMSk7CisgIFByZWFtYmxlUGF0Y2hlcjo6RnJlZVByZWFtYmxlQmxvY2soYjIpOworICBiMSA9IFByZWFtYmxlUGF0Y2hlcjo6QWxsb2NQcmVhbWJsZUJsb2NrTmVhcihwMSk7CisgIFNJREVTVEVQX0VYUEVDVF9UUlVFKGIxID09IGIzKTsKKyAgYjIgPSBQcmVhbWJsZVBhdGNoZXI6OkFsbG9jUHJlYW1ibGVCbG9ja05lYXIocDIpOworICBTSURFU1RFUF9FWFBFQ1RfVFJVRShiMiA9PSBiNCk7CisgIFByZWFtYmxlUGF0Y2hlcjo6RnJlZVByZWFtYmxlQmxvY2soYjEpOworICBQcmVhbWJsZVBhdGNoZXI6OkZyZWVQcmVhbWJsZUJsb2NrKGIyKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBVbml0VGVzdHMoKSB7CisgIHJldHVybiBUZXN0UGF0Y2hXaXRoUHJlYW1ibGVOZWFyUmVsYXRpdmVDYWxsKCkgJiYKKyAgICAgIFRlc3RQYXRjaFdpdGhQcmVhbWJsZUFic29sdXRlSnVtcCgpICYmCisgICAgICBUZXN0UGF0Y2hXaXRoUHJlYW1ibGVOZWFyUmVsYXRpdmVDb25kSnVtcCgpICYmIAorICAgICAgVGVzdFBhdGNoV2l0aFByZWFtYmxlU2hvcnRDb25kSnVtcCgpICYmCisgICAgICBUZXN0RGlzYXNzZW1ibGVyKCkgJiYgVGVzdFBhdGNoV2l0aExvbmdKdW1wKCkgJiYKKyAgICAgIFRlc3RQYXRjaFVzaW5nRHluYW1pY1N0dWIoKSAmJiBQYXRjaFRoZW5VbnBhdGNoKCkgJiYKKyAgICAgIEF1dG9UZXN0aW5nSG9va1Rlc3QoKSAmJiBBdXRvVGVzdGluZ0hvb2tJbkNvbnRhaW5lclRlc3QoKSAmJgorICAgICAgVGVzdFByZWFtYmxlQWxsb2NhdGlvbigpOworfQorCit9OyAgLy8gbmFtZXNwYWNlIHNpZGVzdGVwCisKK2ludCBzYWZlX3ZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApIHsKKyAgaWYgKHNpemUgPT0gMCkgICAgICAgIC8vIG5vdCBldmVuIHJvb20gZm9yIGEgXDA/CisgICAgcmV0dXJuIC0xOyAgICAgICAgICAvLyBub3Qgd2hhdCBDOTkgc2F5cyB0byBkbywgYnV0IHdoYXQgd2luZG93cyBkb2VzCisgIHN0cltzaXplLTFdID0gJ1wwJzsKKyAgcmV0dXJuIF92c25wcmludGYoc3RyLCBzaXplLTEsIGZvcm1hdCwgYXApOworfQorCitpbnQgX3RtYWluKGludCBhcmdjLCBfVENIQVIqIGFyZ3ZbXSkKK3sKKyAgYm9vbCByZXQgPSBzaWRlc3RlcDo6VW5pdFRlc3RzKCk7CisgIHByaW50ZigiJXNcbiIsIHJldCA/ICJQQVNTIiA6ICJGQUlMIik7CisgIHJldHVybiByZXQgPyAwIDogLTE7Cit9CisKKyNwcmFnbWEgb3B0aW1pemUoIiIsIG9uKQpkaWZmIC0tZ2l0IGEvc3JjL3dpbmRvd3MvcHJlYW1ibGVfcGF0Y2hlcl93aXRoX3N0dWIuY2MgYi9zcmMvd2luZG93cy9wcmVhbWJsZV9wYXRjaGVyX3dpdGhfc3R1Yi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Y5ZDNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3MvcHJlYW1ibGVfcGF0Y2hlcl93aXRoX3N0dWIuY2MKQEAgLTAsMCArMSwzMDIgQEAKKy8vIC0qLSBNb2RlOiBDKys7IGMtYmFzaWMtb2Zmc2V0OiAyOyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisvKiBDb3B5cmlnaHQgKGMpIDIwMDcsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIC0tLQorICogQXV0aG9yOiBKb2kgU2lndXJkc3NvbgorICogQXV0aG9yOiBTY290dCBGcmFuY2lzCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgUHJlYW1ibGVQYXRjaGVyCisgKi8KKworI2luY2x1ZGUgInByZWFtYmxlX3BhdGNoZXIuaCIKKworI2luY2x1ZGUgIm1pbmlfZGlzYXNzZW1ibGVyLmgiCisKKy8vIERlZmluaXRpb25zIG9mIGFzc2VtYmx5IHN0YXRlbWVudHMgd2UgbmVlZAorI2RlZmluZSBBU01fSk1QMzJSRUwgMHhFOQorI2RlZmluZSBBU01fSU5UMyAweENDCisjZGVmaW5lIEFTTV9OT1AgMHg5MAorLy8gWDY0IG9wY29kZXMKKyNkZWZpbmUgQVNNX01PVlJBWF9JTU0gMHhCOAorI2RlZmluZSBBU01fUkVYVyAweDQ4CisjZGVmaW5lIEFTTV9KTVAgMHhGRgorI2RlZmluZSBBU01fSk1QX1JBWCAweEUwCisjZGVmaW5lIEFTTV9QVVNIIDB4NjgKKyNkZWZpbmUgQVNNX1JFVCAweEMzCisKK25hbWVzcGFjZSBzaWRlc3RlcCB7CisKK1NpZGVTdGVwRXJyb3IgUHJlYW1ibGVQYXRjaGVyOjpSYXdQYXRjaFdpdGhTdHViKAorICAgIHZvaWQqIHRhcmdldF9mdW5jdGlvbiwKKyAgICB2b2lkKiByZXBsYWNlbWVudF9mdW5jdGlvbiwKKyAgICB1bnNpZ25lZCBjaGFyKiBwcmVhbWJsZV9zdHViLAorICAgIHVuc2lnbmVkIGxvbmcgc3R1Yl9zaXplLAorICAgIHVuc2lnbmVkIGxvbmcqIGJ5dGVzX25lZWRlZCkgeworICBpZiAoKE5VTEwgPT0gdGFyZ2V0X2Z1bmN0aW9uKSB8fAorICAgICAgKE5VTEwgPT0gcmVwbGFjZW1lbnRfZnVuY3Rpb24pIHx8CisgICAgICAoTlVMTCA9PSBwcmVhbWJsZV9zdHViKSkgeworICAgIFNJREVTVEVQX0FTU0VSVChmYWxzZSAmJgorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBwYXJhbWV0ZXJzIC0gZWl0aGVyIHBUYXJnZXRGdW5jdGlvbiBvciAiCisgICAgICAgICAgICAgICAgICAgICJwUmVwbGFjZW1lbnRGdW5jdGlvbiBvciBwUHJlYW1ibGVTdHViIHdlcmUgTlVMTC4iKTsKKyAgICByZXR1cm4gU0lERVNURVBfSU5WQUxJRF9QQVJBTUVURVI7CisgIH0KKworICAvLyBUT0RPKFY3OmpvaSkgU2lnZ2kgYW5kIEkganVzdCBoYWQgYSBkaXNjdXNzaW9uIGFuZCBkZWNpZGVkIHRoYXQgYm90aAorICAvLyBwYXRjaGluZyBhbmQgdW5wYXRjaGluZyBhcmUgYWN0dWFsbHkgdW5zYWZlLiAgV2UgYWxzbyBkaXNjdXNzZWQgYQorICAvLyBtZXRob2Qgb2YgbWFraW5nIGl0IHNhZmUsIHdoaWNoIGlzIHRvIGZyZWV6ZSBhbGwgb3RoZXIgdGhyZWFkcyBpbiB0aGUKKyAgLy8gcHJvY2VzcywgY2hlY2sgdGhlaXIgdGhyZWFkIGNvbnRleHQgdG8gc2VlIGlmIHRoZWlyIGVpcCBpcyBjdXJyZW50bHkKKyAgLy8gaW5zaWRlIHRoZSBibG9jayBvZiBpbnN0cnVjdGlvbnMgd2UgbmVlZCB0byBjb3B5IHRvIHRoZSBzdHViLCBhbmQgaWYgc28KKyAgLy8gd2FpdCBhIGJpdCBhbmQgdHJ5IGFnYWluLCB0aGVuIHVuZnJlZXplIGFsbCB0aHJlYWRzIG9uY2Ugd2UndmUgcGF0Y2hlZC4KKyAgLy8gTm90IGltcGxlbWVudGluZyB0aGlzIGZvciBub3cgc2luY2Ugd2UncmUgb25seSB1c2luZyBTaWRlU3RlcCBmb3IgdW5pdAorICAvLyB0ZXN0aW5nLCBidXQgaWYgd2UgZXZlciB1c2UgaXQgZm9yIHByb2R1Y3Rpb24gY29kZSB0aGlzIGlzIHdoYXQgd2UKKyAgLy8gc2hvdWxkIGRvLgorICAvLworICAvLyBOT1RFOiBTdG95YW4gc3VnZ2VzdHMgd2UgY2FuIHdyaXRlIDggb3IgZXZlbiAxMCBieXRlcyBhdG9taWNhbGx5IHVzaW5nCisgIC8vIEZQVSBpbnN0cnVjdGlvbnMsIGFuZCBvbiBuZXdlciBwcm9jZXNzb3JzIHdlIGNvdWxkIHVzZSBjbXB4Y2hnOGIgb3IKKyAgLy8gY21weGNoZzE2Yi4gU28gaXQgbWlnaHQgYmUgcG9zc2libGUgdG8gZG8gdGhlIHBhdGNoaW5nL3VucGF0Y2hpbmcKKyAgLy8gYXRvbWljYWxseSBhbmQgYXZvaWQgaGF2aW5nIHRvIGZyZWV6ZSBvdGhlciB0aHJlYWRzLiAgTm90ZSB0aG91Z2gsIHRoYXQKKyAgLy8gZG9pbmcgaXQgYXRvbWljYWxseSBkb2VzIG5vdCBoZWxwIGlmIG9uZSBvZiB0aGUgb3RoZXIgdGhyZWFkcyBoYXBwZW5zCisgIC8vIHRvIGhhdmUgaXRzIGVpcCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBieXRlcyB5b3UgY2hhbmdlIHdoaWxlIHlvdSBjaGFuZ2UKKyAgLy8gdGhlbS4KKyAgdW5zaWduZWQgY2hhciogdGFyZ2V0ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4odGFyZ2V0X2Z1bmN0aW9uKTsKKyAgdW5zaWduZWQgaW50IHJlcXVpcmVkX3RyYW1wb2xpbmVfYnl0ZXMgPSAwOworICBjb25zdCB1bnNpZ25lZCBpbnQga1JlcXVpcmVkU3R1Ykp1bXBCeXRlcyA9IDU7CisgIGNvbnN0IHVuc2lnbmVkIGludCBrUmVxdWlyZWRUYXJnZXRQYXRjaEJ5dGVzID0gNTsKKworICAvLyBJbml0aWFsaXplIHRoZSBzdHViIHdpdGggSU5UMydzIGp1c3QgaW4gY2FzZS4KKyAgaWYgKHN0dWJfc2l6ZSkgeworICAgIG1lbXNldChwcmVhbWJsZV9zdHViLCAweGNjLCBzdHViX3NpemUpOworICB9CisgIGlmIChrSXM2NEJpdEJpbmFyeSkgeworICAgIC8vIEluIDY0LWJpdCBtb2RlIEpNUCBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyByZWxhdGl2ZSB0byBSSVAuICBJZiB0aGUKKyAgICAvLyByZXBsYWNlbWVudCAtIHRhcmdldCBvZmZzZXQgaXMgPiAyR0IsIHdlIGNhbid0IEpNUCB0byB0aGUgcmVwbGFjZW1lbnQKKyAgICAvLyBmdW5jdGlvbi4gIEluIHRoaXMgY2FzZSwgd2UncmUgZ29pbmcgdG8gdXNlIGEgdHJhbXBvbGluZSAtIHRoYXQgaXMsCisgICAgLy8gd2UncmUgZ29pbmcgdG8gZG8gYSByZWxhdGl2ZSBqdW1wIHRvIGEgc21hbGwgY2h1bmsgb2YgY29kZSBpbiB0aGUgc3R1YgorICAgIC8vIHRoYXQgd2lsbCB0aGVuIGRvIHRoZSBhYnNvbHV0ZSBqdW1wIHRvIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbi4gIEJ5CisgICAgLy8gZG9pbmcgdGhpcywgd2Ugb25seSBuZWVkIHRvIHBhdGNoIDUgYnl0ZXMgaW4gdGhlIHRhcmdldCBmdW5jdGlvbiwgYXMKKyAgICAvLyBvcHBvc2VkIHRvIHBhdGNoaW5nIDEyIGJ5dGVzIGlmIHdlIHdlcmUgdG8gZG8gYW4gYWJzb2x1dGUganVtcC4KKyAgICAvLworICAgIC8vIE5vdGUgdGhhdCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgdHJhbXBvbGluZSBpcyBhIE5PUCBpbnN0cnVjdGlvbi4gIFRoaXMKKyAgICAvLyBpcyB1c2VkIGFzIGEgdHJhbXBvbGluZSBzaWduYXR1cmUgdGhhdCB3aWxsIGJlIGRldGVjdGVkIHdoZW4gdW5wYXRjaGluZworICAgIC8vIHRoZSBmdW5jdGlvbi4KKyAgICAvLworICAgIC8vIGptcCA8dHJhbXBvbGluZT4KKyAgICAvLworICAgIC8vIHRyYW1wb2xpbmU6CisgICAgLy8gICAgbm9wCisgICAgLy8gICAgbW92IHJheCwgPHJlcGxhY2VtZW50X2Z1bmN0aW9uPgorICAgIC8vICAgIGptcCByYXgKKyAgICAvLworICAgIF9faW50NjQgcmVwbGFjZW1lbnRfdGFyZ2V0X29mZnNldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8X19pbnQ2ND4oCisgICAgICAgIHJlcGxhY2VtZW50X2Z1bmN0aW9uKSAtIHJlaW50ZXJwcmV0X2Nhc3Q8X19pbnQ2ND4odGFyZ2V0KSAtIDU7CisgICAgaWYgKHJlcGxhY2VtZW50X3RhcmdldF9vZmZzZXQgPiBJTlRfTUFYCisgICAgICAgIHx8IHJlcGxhY2VtZW50X3RhcmdldF9vZmZzZXQgPCBJTlRfTUlOKSB7CisgICAgICAvLyBUaGUgc3R1YiBuZWVkcyB0byBiZSB3aXRoaW4gMkdCIG9mIHRoZSB0YXJnZXQgZm9yIHRoZSB0cmFtcG9saW5lIHRvCisgICAgICAvLyB3b3JrIQorICAgICAgX19pbnQ2NCB0cmFtcG9saW5lX29mZnNldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8X19pbnQ2ND4ocHJlYW1ibGVfc3R1YikKKyAgICAgICAgICAtIHJlaW50ZXJwcmV0X2Nhc3Q8X19pbnQ2ND4odGFyZ2V0KSAtIDU7CisgICAgICBpZiAodHJhbXBvbGluZV9vZmZzZXQgPiBJTlRfTUFYIHx8IHRyYW1wb2xpbmVfb2Zmc2V0IDwgSU5UX01JTikgeworICAgICAgICAvLyBXZSdyZSBzY3Jld2VkLgorICAgICAgICBTSURFU1RFUF9BU1NFUlQoZmFsc2UgCisgICAgICAgICAgICAgICAgICAgICAgICYmICJQcmVhbWJsZSBzdHViIGlzIHRvbyBmYXIgZnJvbSB0YXJnZXQgdG8gcGF0Y2guIik7CisgICAgICAgIHJldHVybiBTSURFU1RFUF9VTkVYUEVDVEVEOworICAgICAgfQorICAgICAgcmVxdWlyZWRfdHJhbXBvbGluZV9ieXRlcyA9IDEzOworICAgIH0KKyAgfQorCisgIC8vIExldCdzIGRpc2Fzc2VtYmxlIHRoZSBwcmVhbWJsZSBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIHRvIHNlZSBpZiB3ZSBjYW4KKyAgLy8gcGF0Y2gsIGFuZCB0byBzZWUgaG93IG11Y2ggb2YgdGhlIHByZWFtYmxlIHdlIG5lZWQgdG8gdGFrZS4gIFdlIG5lZWQgNQorICAvLyBieXRlcyBmb3Igb3VyIGptcCBpbnN0cnVjdGlvbiwgc28gbGV0J3MgZmluZCB0aGUgbWluaW11bSBudW1iZXIgb2YKKyAgLy8gaW5zdHJ1Y3Rpb25zIHRvIGdldCA1IGJ5dGVzLgorICBNaW5pRGlzYXNzZW1ibGVyIGRpc2Fzc2VtYmxlcjsKKyAgdW5zaWduZWQgaW50IHByZWFtYmxlX2J5dGVzID0gMDsKKyAgdW5zaWduZWQgaW50IHN0dWJfYnl0ZXMgPSAwOworICB3aGlsZSAocHJlYW1ibGVfYnl0ZXMgPCBrUmVxdWlyZWRUYXJnZXRQYXRjaEJ5dGVzKSB7CisgICAgdW5zaWduZWQgaW50IGN1cl9ieXRlcyA9IDA7CisgICAgSW5zdHJ1Y3Rpb25UeXBlIGluc3RydWN0aW9uX3R5cGUgPQorICAgICAgICBkaXNhc3NlbWJsZXIuRGlzYXNzZW1ibGUodGFyZ2V0ICsgcHJlYW1ibGVfYnl0ZXMsIGN1cl9ieXRlcyk7CisgICAgaWYgKElUX0pVTVAgPT0gaW5zdHJ1Y3Rpb25fdHlwZSkgeworICAgICAgdW5zaWduZWQgaW50IGp1bXBfYnl0ZXMgPSAwOworICAgICAgU2lkZVN0ZXBFcnJvciBqdW1wX3JldCA9IFNJREVTVEVQX0pVTVBfSU5TVFJVQ1RJT047CisgICAgICBpZiAoSXNTaG9ydENvbmRpdGlvbmFsSnVtcCh0YXJnZXQgKyBwcmVhbWJsZV9ieXRlcywgY3VyX2J5dGVzKSkgeworICAgICAgICBqdW1wX3JldCA9IFBhdGNoU2hvcnRDb25kaXRpb25hbEp1bXAodGFyZ2V0ICsgcHJlYW1ibGVfYnl0ZXMsIGN1cl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFtYmxlX3N0dWIgKyBzdHViX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmp1bXBfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHViX3NpemUgLSBzdHViX2J5dGVzKTsKKyAgICAgIH0gZWxzZSBpZiAoSXNTaG9ydEp1bXAodGFyZ2V0ICsgcHJlYW1ibGVfYnl0ZXMsIGN1cl9ieXRlcykpIHsKKyAgICAgICAganVtcF9yZXQgPSBQYXRjaFNob3J0SnVtcCh0YXJnZXQgKyBwcmVhbWJsZV9ieXRlcywgY3VyX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFtYmxlX3N0dWIgKyBzdHViX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqdW1wX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0dWJfc2l6ZSAtIHN0dWJfYnl0ZXMpOworICAgICAgfSBlbHNlIGlmIChJc05lYXJDb25kaXRpb25hbEp1bXAodGFyZ2V0ICsgcHJlYW1ibGVfYnl0ZXMsIGN1cl9ieXRlcykgfHwKKyAgICAgICAgICAgICAgICAgSXNOZWFyUmVsYXRpdmVKdW1wKHRhcmdldCArIHByZWFtYmxlX2J5dGVzLCBjdXJfYnl0ZXMpIHx8CisgICAgICAgICAgICAgICAgIElzTmVhckFic29sdXRlQ2FsbCh0YXJnZXQgKyBwcmVhbWJsZV9ieXRlcywgY3VyX2J5dGVzKSB8fAorICAgICAgICAgICAgICAgICBJc05lYXJSZWxhdGl2ZUNhbGwodGFyZ2V0ICsgcHJlYW1ibGVfYnl0ZXMsIGN1cl9ieXRlcykpIHsKKyAgICAgICAgIGp1bXBfcmV0ID0gUGF0Y2hOZWFySnVtcE9yQ2FsbCh0YXJnZXQgKyBwcmVhbWJsZV9ieXRlcywgY3VyX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFtYmxlX3N0dWIgKyBzdHViX2J5dGVzLCAmanVtcF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHViX3NpemUgLSBzdHViX2J5dGVzKTsKKyAgICAgIH0KKyAgICAgIGlmIChqdW1wX3JldCAhPSBTSURFU1RFUF9TVUNDRVNTKSB7CisgICAgICAgIFNJREVTVEVQX0FTU0VSVChmYWxzZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBwYXRjaCBiZWNhdXNlIHRoZXJlIGlzIGFuIHVuaGFuZGxlZCBicmFuY2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgImluc3RydWN0aW9uIGluIHRoZSBpbml0aWFsIHByZWFtYmxlIGJ5dGVzLiIpOworICAgICAgICByZXR1cm4gU0lERVNURVBfSlVNUF9JTlNUUlVDVElPTjsKKyAgICAgIH0KKyAgICAgIHN0dWJfYnl0ZXMgKz0ganVtcF9ieXRlczsKKyAgICB9IGVsc2UgaWYgKElUX1JFVFVSTiA9PSBpbnN0cnVjdGlvbl90eXBlKSB7CisgICAgICBTSURFU1RFUF9BU1NFUlQoZmFsc2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHBhdGNoIGJlY2F1c2UgZnVuY3Rpb24gaXMgdG9vIHNob3J0Iik7CisgICAgICByZXR1cm4gU0lERVNURVBfRlVOQ1RJT05fVE9PX1NNQUxMOworICAgIH0gZWxzZSBpZiAoSVRfR0VORVJJQyA9PSBpbnN0cnVjdGlvbl90eXBlKSB7CisgICAgICBpZiAoSXNNb3ZXaXRoRGlzcGxhY2VtZW50KHRhcmdldCArIHByZWFtYmxlX2J5dGVzLCBjdXJfYnl0ZXMpKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBtb3ZfYnl0ZXMgPSAwOworICAgICAgICBpZiAoUGF0Y2hNb3ZXaXRoRGlzcGxhY2VtZW50KHRhcmdldCArIHByZWFtYmxlX2J5dGVzLCBjdXJfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYW1ibGVfc3R1YiArIHN0dWJfYnl0ZXMsICZtb3ZfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R1Yl9zaXplIC0gc3R1Yl9ieXRlcykKKyAgICAgICAgICAgICE9IFNJREVTVEVQX1NVQ0NFU1MpIHsKKyAgICAgICAgICByZXR1cm4gU0lERVNURVBfVU5TVVBQT1JURURfSU5TVFJVQ1RJT047CisgICAgICAgIH0KKyAgICAgICAgc3R1Yl9ieXRlcyArPSBtb3ZfYnl0ZXM7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocHJlYW1ibGVfc3R1YiArIHN0dWJfYnl0ZXMpLAorICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4odGFyZ2V0ICsgcHJlYW1ibGVfYnl0ZXMpLCBjdXJfYnl0ZXMpOworICAgICAgICBzdHViX2J5dGVzICs9IGN1cl9ieXRlczsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgU0lERVNURVBfQVNTRVJUKGZhbHNlICYmCisgICAgICAgICAgICAgICAgICAgICAgIkRpc2Fzc2VtYmxlciBlbmNvdW50ZXJlZCB1bnN1cHBvcnRlZCBpbnN0cnVjdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgIihlaXRoZXIgdW51c2VkIG9yIHVua25vd24iKTsKKyAgICAgIHJldHVybiBTSURFU1RFUF9VTlNVUFBPUlRFRF9JTlNUUlVDVElPTjsKKyAgICB9CisgICAgcHJlYW1ibGVfYnl0ZXMgKz0gY3VyX2J5dGVzOworICB9CisKKyAgaWYgKE5VTEwgIT0gYnl0ZXNfbmVlZGVkKQorICAgICpieXRlc19uZWVkZWQgPSBzdHViX2J5dGVzICsga1JlcXVpcmVkU3R1Ykp1bXBCeXRlcworICAgICAgICArIHJlcXVpcmVkX3RyYW1wb2xpbmVfYnl0ZXM7CisKKyAgLy8gSW52OiBjYlByZWFtYmxlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgKGF0IGxlYXN0IDUpIHRoYXQgd2UgbmVlZCB0byB0YWtlCisgIC8vIGZyb20gdGhlIHByZWFtYmxlIHRvIGhhdmUgd2hvbGUgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIDUgYnl0ZXMgb3IgbW9yZQorICAvLyBpbiBzaXplIHRvdGFsLiBUaGUgc2l6ZSBvZiB0aGUgc3R1YiByZXF1aXJlZCBpcyBjYlByZWFtYmxlICsKKyAgLy8ga1JlcXVpcmVkU3R1Ykp1bXBCeXRlcyAoNSkgKyByZXF1aXJlZF90cmFtcG9saW5lX2J5dGVzICgwIG9yIDEzKQorICBpZiAoc3R1Yl9ieXRlcyArIGtSZXF1aXJlZFN0dWJKdW1wQnl0ZXMgKyByZXF1aXJlZF90cmFtcG9saW5lX2J5dGVzCisgICAgICA+IHN0dWJfc2l6ZSkgeworICAgIFNJREVTVEVQX0FTU0VSVChmYWxzZSk7CisgICAgcmV0dXJuIFNJREVTVEVQX0lOU1VGRklDSUVOVF9CVUZGRVI7CisgIH0KKworICAvLyBOb3csIG1ha2UgYSBqbXAgaW5zdHJ1Y3Rpb24gdG8gdGhlIHJlc3Qgb2YgdGhlIHRhcmdldCBmdW5jdGlvbiAobWludXMgdGhlCisgIC8vIHByZWFtYmxlIGJ5dGVzIHdlIG1vdmVkIGludG8gdGhlIHN0dWIpIGFuZCBjb3B5IGl0IGludG8gb3VyIHByZWFtYmxlLXN0dWIuCisgIC8vIGZpbmQgYWRkcmVzcyB0byBqdW1wIHRvLCByZWxhdGl2ZSB0byBuZXh0IGFkZHJlc3MgYWZ0ZXIgam1wIGluc3RydWN0aW9uCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDI0NCkKKyNlbmRpZgorICBpbnQgcmVsYXRpdmVfb2Zmc2V0X3RvX3RhcmdldF9yZXN0CisgICAgICA9ICgocmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4odGFyZ2V0KSArIHByZWFtYmxlX2J5dGVzKSAtCisgICAgICAgICAocHJlYW1ibGVfc3R1YiArIHN0dWJfYnl0ZXMgKyBrUmVxdWlyZWRTdHViSnVtcEJ5dGVzKSk7CisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKyAgLy8gam1wIChKdW1wIG5lYXIsIHJlbGF0aXZlLCBkaXNwbGFjZW1lbnQgcmVsYXRpdmUgdG8gbmV4dCBpbnN0cnVjdGlvbikKKyAgcHJlYW1ibGVfc3R1YltzdHViX2J5dGVzXSA9IEFTTV9KTVAzMlJFTDsKKyAgLy8gY29weSB0aGUgYWRkcmVzcworICBtZW1jcHkocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocHJlYW1ibGVfc3R1YiArIHN0dWJfYnl0ZXMgKyAxKSwKKyAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCZyZWxhdGl2ZV9vZmZzZXRfdG9fdGFyZ2V0X3Jlc3QpLCA0KTsKKworICBpZiAoa0lzNjRCaXRCaW5hcnkgJiYgcmVxdWlyZWRfdHJhbXBvbGluZV9ieXRlcyAhPSAwKSB7CisgICAgLy8gQ29uc3RydWN0IHRoZSB0cmFtcG9saW5lCisgICAgdW5zaWduZWQgaW50IHRyYW1wb2xpbmVfcG9zID0gc3R1Yl9ieXRlcyArIGtSZXF1aXJlZFN0dWJKdW1wQnl0ZXM7CisgICAgcHJlYW1ibGVfc3R1Ylt0cmFtcG9saW5lX3Bvc10gPSBBU01fTk9QOworICAgIHByZWFtYmxlX3N0dWJbdHJhbXBvbGluZV9wb3MgKyAxXSA9IEFTTV9SRVhXOworICAgIHByZWFtYmxlX3N0dWJbdHJhbXBvbGluZV9wb3MgKyAyXSA9IEFTTV9NT1ZSQVhfSU1NOworICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHZvaWQqPihwcmVhbWJsZV9zdHViICsgdHJhbXBvbGluZV9wb3MgKyAzKSwKKyAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oJnJlcGxhY2VtZW50X2Z1bmN0aW9uKSwKKyAgICAgICAgICAgc2l6ZW9mKHZvaWQgKikpOworICAgIHByZWFtYmxlX3N0dWJbdHJhbXBvbGluZV9wb3MgKyAxMV0gPSBBU01fSk1QOworICAgIHByZWFtYmxlX3N0dWJbdHJhbXBvbGluZV9wb3MgKyAxMl0gPSBBU01fSk1QX1JBWDsKKworICAgIC8vIE5vdyB1cGRhdGUgcmVwbGFjZW1lbnRfZnVuY3Rpb24gdG8gcG9pbnQgdG8gdGhlIHRyYW1wb2xpbmUKKyAgICByZXBsYWNlbWVudF9mdW5jdGlvbiA9IHByZWFtYmxlX3N0dWIgKyB0cmFtcG9saW5lX3BvczsKKyAgfQorCisgIC8vIEludjogcHJlYW1ibGVfc3R1YiBwb2ludHMgdG8gYXNzZW1ibHkgY29kZSB0aGF0IHdpbGwgZXhlY3V0ZSB0aGUKKyAgLy8gb3JpZ2luYWwgZnVuY3Rpb24gYnkgZmlyc3QgZXhlY3V0aW5nIHRoZSBmaXJzdCBjYlByZWFtYmxlIGJ5dGVzIG9mIHRoZQorICAvLyBwcmVhbWJsZSwgdGhlbiBqdW1waW5nIHRvIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbi4KKworICAvLyBPdmVyd3JpdGUgdGhlIGZpcnN0IDUgYnl0ZXMgb2YgdGhlIHRhcmdldCBmdW5jdGlvbiB3aXRoIGEganVtcCB0byBvdXIKKyAgLy8gcmVwbGFjZW1lbnQgZnVuY3Rpb24uCisgIC8vIChKdW1wIG5lYXIsIHJlbGF0aXZlLCBkaXNwbGFjZW1lbnQgcmVsYXRpdmUgdG8gbmV4dCBpbnN0cnVjdGlvbikKKyAgdGFyZ2V0WzBdID0gQVNNX0pNUDMyUkVMOworCisgIC8vIEZpbmQgb2Zmc2V0IGZyb20gaW5zdHJ1Y3Rpb24gYWZ0ZXIgam1wLCB0byB0aGUgcmVwbGFjZW1lbnQgZnVuY3Rpb24uCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDI0NCkKKyNlbmRpZgorICBpbnQgb2Zmc2V0X3RvX3JlcGxhY2VtZW50X2Z1bmN0aW9uID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHJlcGxhY2VtZW50X2Z1bmN0aW9uKSAtCisgICAgICByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPih0YXJnZXQpIC0gNTsKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorICAvLyBjb21wbGV0ZSB0aGUgam1wIGluc3RydWN0aW9uCisgIG1lbWNweShyZWludGVycHJldF9jYXN0PHZvaWQqPih0YXJnZXQgKyAxKSwKKyAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCZvZmZzZXRfdG9fcmVwbGFjZW1lbnRfZnVuY3Rpb24pLCA0KTsKKworICAvLyBTZXQgYW55IHJlbWFpbmluZyBieXRlcyB0aGF0IHdlcmUgbW92ZWQgdG8gdGhlIHByZWFtYmxlLXN0dWIgdG8gSU5UMyBzbworICAvLyBhcyBub3QgdG8gY2F1c2UgY29uZnVzaW9uIChvdGhlcndpc2UgeW91IG1pZ2h0IHNlZSBzb21lIHN0cmFuZ2UKKyAgLy8gaW5zdHJ1Y3Rpb25zIGlmIHlvdSBsb29rIGF0IHRoZSBkaXNhc3NlbWJseSwgb3IgZXZlbiBpbnZhbGlkCisgIC8vIGluc3RydWN0aW9ucykuIEFsc28sIGJ5IGRvaW5nIHRoaXMsIHdlIHdpbGwgYnJlYWsgaW50byB0aGUgZGVidWdnZXIgaWYKKyAgLy8gc29tZSBjb2RlIGNhbGxzIGludG8gdGhpcyBwb3J0aW9uIG9mIHRoZSBjb2RlLiAgSWYgdGhpcyBoYXBwZW5zLCBpdAorICAvLyBtZWFucyB0aGF0IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIHBhdGNoZWQgdXNpbmcgdGhpcyBwYXRjaGVyIHdpdGhvdXQKKyAgLy8gZnVydGhlciB0aG91Z2h0LgorICBpZiAocHJlYW1ibGVfYnl0ZXMgPiBrUmVxdWlyZWRUYXJnZXRQYXRjaEJ5dGVzKSB7CisgICAgbWVtc2V0KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHRhcmdldCArIGtSZXF1aXJlZFRhcmdldFBhdGNoQnl0ZXMpLAorICAgICAgICAgICBBU01fSU5UMywgcHJlYW1ibGVfYnl0ZXMgLSBrUmVxdWlyZWRUYXJnZXRQYXRjaEJ5dGVzKTsKKyAgfQorCisgIC8vIEludjogVGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHRhcmdldF9mdW5jdGlvbiBub3cgcG9pbnRzIHRvIGEgcmVsYXRpdmUKKyAgLy8ganVtcCBpbnN0cnVjdGlvbiB0aGF0IGp1bXBzIG92ZXIgdG8gdGhlIHByZWFtYmxlX3N0dWIuICBUaGUgcHJlYW1ibGUKKyAgLy8gc3R1YiBjb250YWlucyB0aGUgZmlyc3Qgc3R1Yl9zaXplIGJ5dGVzIG9mIHRoZSBvcmlnaW5hbCB0YXJnZXQKKyAgLy8gZnVuY3Rpb24ncyBwcmVhbWJsZSBjb2RlLCBmb2xsb3dlZCBieSBhIHJlbGF0aXZlIGp1bXAgYmFjayB0byB0aGUgbmV4dAorICAvLyBpbnN0cnVjdGlvbiBhZnRlciB0aGUgZmlyc3QgY2JQcmVhbWJsZSBieXRlcy4KKyAgLy8KKyAgLy8gSW4gNjQtYml0IG1vZGUgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHRhcmdldF9mdW5jdGlvbiAqbWF5KiBwb2ludCB0byBhCisgIC8vIHJlbGF0aXZlIGp1bXAgaW5zdHJ1Y3Rpb24gdGhhdCBqdW1wcyB0byBhIHRyYW1wb2xpbmUgd2hpY2ggd2lsbCB0aGVuCisgIC8vIHBlcmZvcm0gYW4gYWJzb2x1dGUganVtcCB0byB0aGUgcmVwbGFjZW1lbnQgZnVuY3Rpb24uICBUaGUgcHJlYW1ibGUgc3R1YgorICAvLyBzdGlsbCBjb250YWlucyB0aGUgb3JpZ2luYWwgdGFyZ2V0IGZ1bmN0aW9uJ3MgcHJlYW1ibGUgY29kZSwgZm9sbG93ZWQgYnkgYQorICAvLyBqdW1wIGJhY2sgdG8gdGhlIGluc3RydWN0aW9ucyBhZnRlciB0aGUgZmlyc3QgcHJlYW1ibGUgYnl0ZXMuCisgIC8vCisgIHJldHVybiBTSURFU1RFUF9TVUNDRVNTOworfQorCit9OyAgLy8gbmFtZXNwYWNlIHNpZGVzdGVwCmRpZmYgLS1naXQgYS9zcmMvd2luZG93cy9zaG9ydHByb2MuYXNtIGIvc3JjL3dpbmRvd3Mvc2hvcnRwcm9jLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZThlM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpbmRvd3Mvc2hvcnRwcm9jLmFzbQpAQCAtMCwwICsxLDE2OSBAQAorOyBDb3B5cmlnaHQgKGMpIDIwMTEsIEdvb2dsZSBJbmMuCis7IEFsbCByaWdodHMgcmVzZXJ2ZWQuCis7IAorOyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKzsgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorOyBtZXQ6Cis7IAorOyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorOyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCis7ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKzsgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorOyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCis7IGRpc3RyaWJ1dGlvbi4KKzsgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworOyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorOyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorOyAKKzsgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworOyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorOyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKzsgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKzsgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCis7IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKzsgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCis7IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorOyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCis7IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorOyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorOworOyAtLS0KKzsgQXV0aG9yOiBTY290dCBGcmFuY2lzCis7Cis7IFVuaXQgdGVzdHMgZm9yIFByZWFtYmxlUGF0Y2hlcg0KKyANCisuTU9ERUwgc21hbGwNCisgDQorLkNPREUNCisNCitUb29TaG9ydEZ1bmN0aW9uIFBST0MNCisJcmV0DQorVG9vU2hvcnRGdW5jdGlvbiBFTkRQDQorDQorSnVtcFNob3J0Q29uZEZ1bmN0aW9uIFBST0MNCisJdGVzdCBjbCwgMQ0KKwlqbnoganVtcHNwb3QNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCisJaW50IDMNCitqdW1wc3BvdDoNCisJbm9wDQorCW5vcA0KKwlub3ANCisJbm9wDQorCW1vdiByYXgsIDENCisJcmV0DQorSnVtcFNob3J0Q29uZEZ1bmN0aW9uIEVORFANCisNCitKdW1wTmVhckNvbmRGdW5jdGlvbiBQUk9DDQorCXRlc3QgY2wsIDENCisJam56IGp1bXBzcG90DQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KK2p1bXBzcG90Og0KKwlub3ANCisJbm9wDQorCW1vdiByYXgsIDENCisJcmV0DQorSnVtcE5lYXJDb25kRnVuY3Rpb24gRU5EUA0KKw0KK0p1bXBBYnNvbHV0ZUZ1bmN0aW9uIFBST0MNCisJdGVzdCBjbCwgMQ0KKwlqbXAganVtcHNwb3QNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCitqdW1wc3BvdDoNCisJbm9wDQorCW5vcA0KKwltb3YgcmF4LCAxDQorCXJldA0KK0p1bXBBYnNvbHV0ZUZ1bmN0aW9uIEVORFANCisNCitDYWxsTmVhclJlbGF0aXZlRnVuY3Rpb24gUFJPQw0KKwl0ZXN0IGNsLCAxDQorCWNhbGwgVG9vU2hvcnRGdW5jdGlvbg0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW1vdiByZHgsIDBmZmZmMTExMUgNCisJbW92IHJkeCwgMGZmZmYxMTExSA0KKwltb3YgcmR4LCAwZmZmZjExMTFIDQorCW5vcA0KKwlub3ANCisJbm9wDQorCXJldA0KK0NhbGxOZWFyUmVsYXRpdmVGdW5jdGlvbiBFTkRQDQorDQorRU5EDQpkaWZmIC0tZ2l0IGEvc3JjL3dpbmRvd3Mvc3lzdGVtLWFsbG9jLmNjIGIvc3JjL3dpbmRvd3Mvc3lzdGVtLWFsbG9jLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1Mzc3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvd2luZG93cy9zeXN0ZW0tYWxsb2MuY2MKQEAgLTAsMCArMSwyMDQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgR29vZ2xlIEluYy4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8gCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIC0tLQorLy8gQXV0aG9yOiBQZXRyIEhvc2VrCisKKyNpZm5kZWYgX1dJTjMyCisjIGVycm9yIFlvdSBzaG91bGQgb25seSBiZSBpbmNsdWRpbmcgd2luZG93cy9zeXN0ZW0tYWxsb2MuY2MgaW4gYSB3aW5kb3dzIGVudmlyb25tZW50IQorI2VuZGlmCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyBzdGQ6Om1pbgorI2luY2x1ZGUgPGdwZXJmdG9vbHMvbWFsbG9jX2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2Uvc3BpbmxvY2suaCIKKyNpbmNsdWRlICJpbnRlcm5hbF9sb2dnaW5nLmgiCisjaW5jbHVkZSAic3lzdGVtLWFsbG9jLmgiCisKK3N0YXRpYyBTcGluTG9jayBzcGlubG9jayhTcGluTG9jazo6TElOS0VSX0lOSVRJQUxJWkVEKTsKKworLy8gVGhlIGN1cnJlbnQgc3lzdGVtIGFsbG9jYXRvciBkZWNsYXJhdGlvbgorU3lzQWxsb2NhdG9yKiBzeXNfYWxsb2MgPSBOVUxMOworLy8gTnVtYmVyIG9mIGJ5dGVzIHRha2VuIGZyb20gc3lzdGVtLgorc2l6ZV90IFRDTWFsbG9jX1N5c3RlbVRha2VuID0gMDsKKworY2xhc3MgVmlydHVhbFN5c0FsbG9jYXRvciA6IHB1YmxpYyBTeXNBbGxvY2F0b3IgeworcHVibGljOgorICBWaXJ0dWFsU3lzQWxsb2NhdG9yKCkgOiBTeXNBbGxvY2F0b3IoKSB7CisgIH0KKyAgdm9pZCogQWxsb2Moc2l6ZV90IHNpemUsIHNpemVfdCAqYWN0dWFsX3NpemUsIHNpemVfdCBhbGlnbm1lbnQpOworfTsKK3N0YXRpYyBjaGFyIHZpcnR1YWxfc3BhY2Vbc2l6ZW9mKFZpcnR1YWxTeXNBbGxvY2F0b3IpXTsKKworLy8gVGhpcyBpcyBtb3N0bHkgbGlrZSBNbWFwU3lzQWxsb2NhdG9yOjpBbGxvYywgZXhjZXB0IGl0IGRvZXMgdGhlc2Ugd2VpcmQKKy8vIG11bm1hcCdzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHBhZ2UsIHdoaWNoIGlzIGZvcmJpZGRlbiBpbiB3aW5kb3dzLgordm9pZCogVmlydHVhbFN5c0FsbG9jYXRvcjo6QWxsb2Moc2l6ZV90IHNpemUsIHNpemVfdCAqYWN0dWFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWxpZ25tZW50KSB7CisgIC8vIEFsaWduIG9uIHRoZSBwYWdlc2l6ZSBib3VuZGFyeQorICBjb25zdCBpbnQgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworICBpZiAoYWxpZ25tZW50IDwgcGFnZXNpemUpIGFsaWdubWVudCA9IHBhZ2VzaXplOworICBzaXplID0gKChzaXplICsgYWxpZ25tZW50IC0gMSkgLyBhbGlnbm1lbnQpICogYWxpZ25tZW50OworCisgIC8vIFJlcG9ydCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRoZSBPUyBhY3R1YWxseSBkZWxpdmVyZWQuICBUaGlzIG1pZ2h0IGJlCisgIC8vIGdyZWF0ZXIgdGhhbiB8c2l6ZXwgYmVjYXVzZSBvZiBhbGlnbm1lbnQgY29uY2VybnMuICBUaGUgZnVsbCBzaXplIGlzCisgIC8vIG5lY2Vzc2FyeSBzbyB0aGF0IGFkamFjZW50IHNwYW5zIGNhbiBiZSBjb2FsZXNjZWQuCisgIC8vIFRPRE8oYW50b25tKTogcHJvcGVyIHByb2Nlc3Npbmcgb2YgYWxpZ25tZW50cworICAvLyBpbiBhY3R1YWxfc2l6ZSBhbmQgZGVjb21taXR0aW5nLgorICBpZiAoYWN0dWFsX3NpemUpIHsKKyAgICAqYWN0dWFsX3NpemUgPSBzaXplOworICB9CisKKyAgLy8gV2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IGFsaWdubWVudHMgbGFyZ2VyIHRoYW4gdGhlIHBhZ2VzaXplIG9yCisgIC8vIGFsaWdubWVudHMgdGhhdCBhcmUgbm90IG11bHRpcGxlcyBvZiB0aGUgcGFnZXNpemUgYWZ0ZXIgYmVpbmcgZmxvb3JlZC4KKyAgLy8gSWYgdGhpcyBhYmlsaXR5IGlzIG5lZWRlZCBpdCBjYW4gYmUgZG9uZSBieSB0aGUgY2FsbGVyIChhc3N1bWluZyBpdCBrbm93cworICAvLyB0aGUgcGFnZSBzaXplKS4KKyAgYXNzZXJ0KGFsaWdubWVudCA8PSBwYWdlc2l6ZSk7CisKKyAgdm9pZCogcmVzdWx0ID0gVmlydHVhbEFsbG9jKDAsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1fQ09NTUlUfE1FTV9SRVNFUlZFLCBQQUdFX1JFQURXUklURSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvLyBJZiB0aGUgcmVzdWx0IGlzIG5vdCBhbGlnbmVkIG1lbW9yeSBmcmFnbWVudGF0aW9uIHdpbGwgcmVzdWx0IHdoaWNoIGNhbgorICAvLyBsZWFkIHRvIHBhdGhvbG9naWNhbCBtZW1vcnkgdXNlLgorICBhc3NlcnQoKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihyZXN1bHQpICYgKGFsaWdubWVudCAtIDEpKSA9PSAwKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgX01TQ19WRVIKKworZXh0ZXJuICJDIiBTeXNBbGxvY2F0b3IqIHRjX2dldF9zeXNhbGxvY19vdmVycmlkZShTeXNBbGxvY2F0b3IgKmRlZik7CitleHRlcm4gIkMiIFN5c0FsbG9jYXRvciogdGNfZ2V0X3N5c2FsbG9jX2RlZmF1bHQoU3lzQWxsb2NhdG9yICpkZWYpCit7CisgIHJldHVybiBkZWY7Cit9CisKKyNpZiBkZWZpbmVkKF9NX0lYODYpCisjcHJhZ21hIGNvbW1lbnQobGlua2VyLCAiL2FsdGVybmF0ZW5hbWU6X3RjX2dldF9zeXNhbGxvY19vdmVycmlkZT1fdGNfZ2V0X3N5c2FsbG9jX2RlZmF1bHQiKQorI2VsaWYgZGVmaW5lZChfTV9YNjQpCisjcHJhZ21hIGNvbW1lbnQobGlua2VyLCAiL2FsdGVybmF0ZW5hbWU6dGNfZ2V0X3N5c2FsbG9jX292ZXJyaWRlPXRjX2dldF9zeXNhbGxvY19kZWZhdWx0IikKKyNlbmRpZgorCisjZWxzZSAvLyAhX01TQ19WRVIKKworZXh0ZXJuICJDIiBBVFRSSUJVVEVfTk9JTkxJTkUKK1N5c0FsbG9jYXRvciogdGNfZ2V0X3N5c2FsbG9jX292ZXJyaWRlKFN5c0FsbG9jYXRvciAqZGVmKQoreworICByZXR1cm4gZGVmOworfQorCisjZW5kaWYKKworc3RhdGljIGJvb2wgc3lzdGVtX2FsbG9jX2luaXRlZCA9IGZhbHNlOwordm9pZCBJbml0U3lzdGVtQWxsb2NhdG9ycyh2b2lkKSB7CisgIFZpcnR1YWxTeXNBbGxvY2F0b3IgKmFsbG9jID0gbmV3ICh2aXJ0dWFsX3NwYWNlKSBWaXJ0dWFsU3lzQWxsb2NhdG9yKCk7CisgIHN5c19hbGxvYyA9IHRjX2dldF9zeXNhbGxvY19vdmVycmlkZShhbGxvYyk7Cit9CisKK2V4dGVybiBQRVJGVE9PTFNfRExMX0RFQ0wKK3ZvaWQqIFRDTWFsbG9jX1N5c3RlbUFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgKmFjdHVhbF9zaXplLAorCQkJICAgc2l6ZV90IGFsaWdubWVudCkgeworICBTcGluTG9ja0hvbGRlciBsb2NrX2hvbGRlcigmc3BpbmxvY2spOworCisgIGlmICghc3lzdGVtX2FsbG9jX2luaXRlZCkgeworICAgIEluaXRTeXN0ZW1BbGxvY2F0b3JzKCk7CisgICAgc3lzdGVtX2FsbG9jX2luaXRlZCA9IHRydWU7CisgIH0KKworICB2b2lkKiByZXN1bHQgPSBzeXNfYWxsb2MtPkFsbG9jKHNpemUsIGFjdHVhbF9zaXplLCBhbGlnbm1lbnQpOworICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICBpZiAoYWN0dWFsX3NpemUpIHsKKyAgICAgIFRDTWFsbG9jX1N5c3RlbVRha2VuICs9ICphY3R1YWxfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgVENNYWxsb2NfU3lzdGVtVGFrZW4gKz0gc2l6ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworZXh0ZXJuIFBFUkZUT09MU19ETExfREVDTAorYm9vbCBUQ01hbGxvY19TeXN0ZW1SZWxlYXNlKHZvaWQqIHN0YXJ0LCBzaXplX3QgbGVuZ3RoKSB7CisgIGlmIChWaXJ0dWFsRnJlZShzdGFydCwgbGVuZ3RoLCBNRU1fREVDT01NSVQpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFRoZSBkZWNvbW1pdCBtYXkgZmFpbCBpZiB0aGUgbWVtb3J5IHJlZ2lvbiBjb25zaXN0cyBvZiBhbGxvY2F0aW9ucworICAvLyBmcm9tIG1vcmUgdGhhbiBvbmUgY2FsbCB0byBWaXJ0dWFsQWxsb2MuICBJbiB0aGlzIGNhc2UsIGZhbGwgYmFjayB0bworICAvLyB1c2luZyBWaXJ0dWFsUXVlcnkgdG8gcmV0cmlldmUgdGhlIGFsbG9jYXRpb24gYm91bmRhcmllcyBhbmQgZGVjb21taXQKKyAgLy8gdGhlbSBlYWNoIGluZGl2aWR1YWxseS4KKworICBjaGFyKiBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oc3RhcnQpOworICBjaGFyKiBlbmQgPSBwdHIgKyBsZW5ndGg7CisgIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBpbmZvOworICB3aGlsZSAocHRyIDwgZW5kKSB7CisgICAgc2l6ZV90IHJlc3VsdFNpemUgPSBWaXJ0dWFsUXVlcnkocHRyLCAmaW5mbywgc2l6ZW9mKGluZm8pKTsKKyAgICBhc3NlcnQocmVzdWx0U2l6ZSA9PSBzaXplb2YoaW5mbykpOworICAgIHNpemVfdCBkZWNvbW1pdFNpemUgPSBzdGQ6Om1pbjxzaXplX3Q+KGluZm8uUmVnaW9uU2l6ZSwgZW5kIC0gcHRyKTsKKyAgICBCT09MIHN1Y2Nlc3MgPSBWaXJ0dWFsRnJlZShwdHIsIGRlY29tbWl0U2l6ZSwgTUVNX0RFQ09NTUlUKTsKKyAgICBhc3NlcnQoc3VjY2VzcyA9PSBUUlVFKTsKKyAgICBwdHIgKz0gZGVjb21taXRTaXplOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiBQRVJGVE9PTFNfRExMX0RFQ0wKK3ZvaWQgVENNYWxsb2NfU3lzdGVtQ29tbWl0KHZvaWQqIHN0YXJ0LCBzaXplX3QgbGVuZ3RoKSB7CisgIGlmIChWaXJ0dWFsQWxsb2Moc3RhcnQsIGxlbmd0aCwgTUVNX0NPTU1JVCwgUEFHRV9SRUFEV1JJVEUpID09IHN0YXJ0KQorICAgIHJldHVybjsKKworICAvLyBUaGUgY29tbWl0IG1heSBmYWlsIGlmIHRoZSBtZW1vcnkgcmVnaW9uIGNvbnNpc3RzIG9mIGFsbG9jYXRpb25zCisgIC8vIGZyb20gbW9yZSB0aGFuIG9uZSBjYWxsIHRvIFZpcnR1YWxBbGxvYy4gIEluIHRoaXMgY2FzZSwgZmFsbCBiYWNrIHRvCisgIC8vIHVzaW5nIFZpcnR1YWxRdWVyeSB0byByZXRyaWV2ZSB0aGUgYWxsb2NhdGlvbiBib3VuZGFyaWVzIGFuZCBjb21taXQgdGhlbQorICAvLyBlYWNoIGluZGl2aWR1YWxseS4KKworICBjaGFyKiBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oc3RhcnQpOworICBjaGFyKiBlbmQgPSBwdHIgKyBsZW5ndGg7CisgIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBpbmZvOworICB3aGlsZSAocHRyIDwgZW5kKSB7CisgICAgc2l6ZV90IHJlc3VsdFNpemUgPSBWaXJ0dWFsUXVlcnkocHRyLCAmaW5mbywgc2l6ZW9mKGluZm8pKTsKKyAgICBhc3NlcnQocmVzdWx0U2l6ZSA9PSBzaXplb2YoaW5mbykpOworCisgICAgc2l6ZV90IGNvbW1pdFNpemUgPSBzdGQ6Om1pbjxzaXplX3Q+KGluZm8uUmVnaW9uU2l6ZSwgZW5kIC0gcHRyKTsKKyAgICB2b2lkKiBuZXdBZGRyZXNzID0gVmlydHVhbEFsbG9jKHB0ciwgY29tbWl0U2l6ZSwgTUVNX0NPTU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfUkVBRFdSSVRFKTsKKyAgICBhc3NlcnQobmV3QWRkcmVzcyA9PSBwdHIpOworICAgIHB0ciArPSBjb21taXRTaXplOworICB9Cit9CisKK2Jvb2wgUmVnaXN0ZXJTeXN0ZW1BbGxvY2F0b3IoU3lzQWxsb2NhdG9yICphbGxvY2F0b3IsIGludCBwcmlvcml0eSkgeworICByZXR1cm4gZmFsc2U7ICAgLy8gd2UgZG9uJ3QgYWxsb3cgcmVnaXN0cmF0aW9uIG9uIHdpbmRvd3MsIHJpZ2h0IG5vdworfQorCit2b2lkIER1bXBTeXN0ZW1BbGxvY2F0b3JTdGF0cyhUQ01hbGxvY19QcmludGVyKiBwcmludGVyKSB7CisgIC8vIFdlIGRvbid0IGR1bXAgc3RhdHMgb24gd2luZG93cywgcmlnaHQgbm93Cit9Cg==