ZGlmZiAtLWdpdCBhL0JVSUxELm1kIGIvQlVJTEQubWQKaW5kZXggNzljM2YyYy4uMWJkMDFhNSAxMDA2NDQKLS0tIGEvQlVJTEQubWQKKysrIGIvQlVJTEQubWQKQEAgLTE2LDcgKzE2LDcgQEAKIAogVGhlc2UgcGFja2FnZXMgYXJlIHVzZWQgZm9yIGJ1aWxkaW5nIGFuZCBydW5uaW5nIHRoZSBzYW1wbGVzLgogYGBgCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCBnaXQgc3VidmVyc2lvbiBjbWFrZSBsaWJnbDEtbWVzYS1kZXYgZnJlZWdsdXQzLWRldiBsaWJnbG0tZGV2IGxpYnBuZzEyLWRldiBsaWJtYWdpY2t3YW5kLWRldiBxdDUtZGVmYXVsdCBsaWJwY2lhY2Nlc3MtZGV2IGxpYnB0aHJlYWQtc3R1YnMwLWRldiBsaWJ1ZGV2LWRldgorc3VkbyBhcHQtZ2V0IGluc3RhbGwgZ2l0IHN1YnZlcnNpb24gY21ha2UgbGliZ2wxLW1lc2EtZGV2IGZyZWVnbHV0My1kZXYgbGliZ2xtLWRldiBsaWJtYWdpY2t3YW5kLWRldiBxdDUtZGVmYXVsdCBsaWJwY2lhY2Nlc3MtZGV2IGxpYnB0aHJlYWQtc3R1YnMwLWRldiBsaWJ1ZGV2LWRldgogc3VkbyBhcHQtZ2V0IGJ1aWxkLWRlcCBtZXNhCiBgYGAKIApkaWZmIC0tZ2l0IGEvTElDRU5TRS50eHQgYi9MSUNFTlNFLnR4dAppbmRleCAyYjJlZDk5Li5hNjkzMDhjIDEwMDY0NAotLS0gYS9MSUNFTlNFLnR4dAorKysgYi9MSUNFTlNFLnR4dApAQCAtMTgsMyArMTgsMTU4IEBACiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSDQogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KIA0KKy8qDQorICBDb3B5cmlnaHQgKGMpIDIwMDkgRGF2ZSBHYW1ibGUNCisNCisgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkNCisgIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsDQorICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzDQorICB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQorICBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCisgIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQorDQorICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KKyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQorDQorICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KKyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCisgIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQorICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQorICBUSEUgU09GVFdBUkUuDQorKi8NCisNCisvKg0KKw0KKyAgICBDb3B5cmlnaHQgS2V2bGluIEhlbm5leSwgMTk5NywgMjAwMywgMjAxMi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisNCisgICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzDQorICAgIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZA0KKyAgICB0aGF0IHRoaXMgY29weXJpZ2h0IGFuZCBwZXJtaXNzaW9ucyBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kDQorICAgIGRlcml2YXRpdmVzLg0KKyAgICANCisgICAgVGhpcyBzb2Z0d2FyZSBpcyBzdXBwbGllZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5Lg0KKw0KKyAgICBCdXQgdGhhdCBzYWlkLCBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zIHBsZWFzZSBnZXQgaW4gdG91Y2guDQorDQorKi8NCisNCitDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4NCitBbGwgcmlnaHRzIHJlc2VydmVkLg0KKw0KK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCittZXQ6DQorDQorICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCitub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KK2NvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCitpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorZGlzdHJpYnV0aW9uLg0KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCitjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KK3RoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorDQorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorDQorDQorLyoNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIFZhbHZlIFNvZnR3YXJlLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyAqIA0KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KKyAqIGFyZSBtZXQ6DQorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlDQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIE5WSURJQSBDT1JQT1JBVElPTiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZA0KKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisgKiANCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQ0KKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSDQorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1INCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwNCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sDQorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SDQorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQ0KKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorICovDQorDQorLyoNCisgICAgICAgICAgICBETyBXSEFUIFRIRSAqKioqIFlPVSBXQU5UIFRPIFBVQkxJQyBMSUNFTlNFDQorICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIsIERlY2VtYmVyIDIwMDQNCisNCisgQ29weXJpZ2h0IChDKSAyMDEzIFdvbGZnYW5nICdkYXRlbndvbGYnIERyYXhpbmdlciA8Y29kZUBkYXRlbndvbGYubmV0Pg0KKw0KKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBvciBtb2RpZmllZA0KKyBjb3BpZXMgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBhbmQgY2hhbmdpbmcgaXQgaXMgYWxsb3dlZCBhcyBsb25nDQorIGFzIHRoZSBuYW1lIGlzIGNoYW5nZWQuDQorDQorICAgICAgICAgICAgRE8gV0hBVCBUSEUgKioqKiBZT1UgV0FOVCBUTyBQVUJMSUMgTElDRU5TRQ0KKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTg0KKw0KKyAgMC4gWW91IGp1c3QgRE8gV0hBVCBUSEUgRlVDSyBZT1UgV0FOVCBUTy4NCisqLw0KKw0KKy8qDQorKiogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhlIEtocm9ub3MgR3JvdXAgSW5jLg0KKyoqDQorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGENCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlDQorKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nDQorKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLA0KKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8NCisqKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bw0KKyoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCisqKg0KKyoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkDQorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLg0KKyoqDQorKiogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YNCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuDQorKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkNCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULA0KKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFDQorKiogTUFURVJJQUxTIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4NCisqLw0KKw0KKy8vLyBDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE0IEctVHJ1YyBDcmVhdGlvbiAod3d3LmctdHJ1Yy5uZXQpDQorLy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkNCisvLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCisvLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KKy8vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQorLy8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KKy8vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KKy8vLyANCisvLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCisvLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQorLy8vIA0KKy8vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KKy8vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCisvLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQorLy8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCisvLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCisvLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTg0KKy8vLyBUSEUgU09GVFdBUkUuDQorLy8vDQorDQpkaWZmIC0tZ2l0IGEvZGVtb3MvQ01ha2VMaXN0cy50eHQgYi9kZW1vcy9DTWFrZUxpc3RzLnR4dAppbmRleCBhMTdiZDgzLi5hNGJiYzg0IDEwMDY0NAotLS0gYS9kZW1vcy9DTWFrZUxpc3RzLnR4dAorKysgYi9kZW1vcy9DTWFrZUxpc3RzLnR4dApAQCAtMiwxNCArMiw4IEBACiAgICAgZmluZF9wYWNrYWdlKFhDQiBSRVFVSVJFRCkKIGVuZGlmKCkKIAotaWYoTk9UIFdJTjMyKQotICAgIGlmKE5PVCBFWElTVFMgL3Vzci9pbmNsdWRlL3BuZy5oKQotICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJOZWNlc3NhcnkgcG5nMTItZGV2IGhlYWRlcnMgY2Fubm90IGJlIGZvdW5kOiBzdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJwbmcxMi1kZXYiKQotICAgIGVuZGlmKCkKLWVuZGlmKCkKLQogZmlsZShHTE9CIFRFWFRVUkVTCi0gICIke1BST0pFQ1RfU09VUkNFX0RJUn0vZGVtb3MvKi5wbmciCisgICIke1BST0pFQ1RfU09VUkNFX0RJUn0vZGVtb3MvKi5wcG0iCiAgICkKIGZpbGUoQ09QWSAke1RFWFRVUkVTfSBERVNUSU5BVElPTiAke0NNQUtFX0JJTkFSWV9ESVJ9L2RlbW9zKQogCkBAIC03MywxMyArNjcsMTEgQEAKICAgICAgICAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2ljZC9jb21tb24iCiAgICAgICAgKQogCi0gICAgbGlua19saWJyYXJpZXMoJHtYQ0JfTElCUkFSSUVTfSB2dWxrYW4gcG5nIG0pCisgICAgbGlua19saWJyYXJpZXMoJHtYQ0JfTElCUkFSSUVTfSB2dWxrYW4gbSkKIGVuZGlmKCkKIGlmKFdJTjMyKQogICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgKAogICAgICAgICIke1BST0pFQ1RfU09VUkNFX0RJUn0vaWNkL2NvbW1vbiIKLSAgICAgICAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYnMvbGlicG5nIgotICAgICAgICIke1BST0pFQ1RfU09VUkNFX0RJUn0vbGlicy96bGliIgogICAgICAgICkKIAogICAgIHNldCAoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIC1EX1VTRV9NQVRIX0RFRklORVMiKQpAQCAtMTA5LDEwICsxMDEsNyBAQAogICAgIGVsc2UoKQogICAgICAgICBzZXQgKExJQl9ESVIgIldpbjMyIikKICAgICBlbmRpZigpCi0gICAgYWRkX2xpYnJhcnkobGlicG5nZCBTVEFUSUMgSU1QT1JURUQpCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGxpYnBuZ2QgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTiAke1BST0pFQ1RfU09VUkNFX0RJUn0vbGlicy8ke0xJQl9ESVJ9L2xpYnBuZ2QubGliKQotICAgIGFkZF9saWJyYXJ5KHpsaWJkIFNUQVRJQyBJTVBPUlRFRCkKLSAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoemxpYmQgUFJPUEVSVElFUyBJTVBPUlRFRF9MT0NBVElPTiAke1BST0pFQ1RfU09VUkNFX0RJUn0vbGlicy8ke0xJQl9ESVJ9L3psaWJkLmxpYikKKwogICAgIGFkZF9leGVjdXRhYmxlKGN1YmUgV0lOMzIgY3ViZS5jICR7Q01BS0VfQklOQVJZX0RJUn0vZGVtb3MvY3ViZS12ZXJ0LnNwdiAke0NNQUtFX0JJTkFSWV9ESVJ9L2RlbW9zL2N1YmUtZnJhZy5zcHYpCi0gICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGN1YmUgJHtMSUJSQVJJRVN9IGxpYnBuZ2QgemxpYmQpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGN1YmUgJHtMSUJSQVJJRVN9ICkKIGVuZGlmKCkKZGlmZiAtLWdpdCBhL2RlbW9zL2N1YmUuYyBiL2RlbW9zL2N1YmUuYwppbmRleCA5YzUwZmViLi5lOTM0MTgwIDEwMDY0NAotLS0gYS9kZW1vcy9jdWJlLmMKKysrIGIvZGVtb3MvY3ViZS5jCkBAIC00NSw3ICs0NSw2IEBACiAKICNpbmNsdWRlICJ2a19zZGtfcGxhdGZvcm0uaCIKICNpbmNsdWRlICJsaW5tYXRoLmgiCi0jaW5jbHVkZSA8cG5nLmg+CiAKICNkZWZpbmUgREVNT19CVUZGRVJfQ09VTlQgMgogI2RlZmluZSBERU1PX1RFWFRVUkVfQ09VTlQgMQpAQCAtMTEwLDcgKzEwOSw3IEBACiB9OwogCiBzdGF0aWMgY2hhciAqdGV4X2ZpbGVzW10gPSB7Ci0gICAgImx1bmFyZy1sb2dvLTI1NngyNTYtc29saWQucG5nIgorICAgICJsdW5hcmcucHBtIgogfTsKIAogc3RydWN0IHZrY3ViZV92c191bmlmb3JtIHsKQEAgLTg5MCwxNTYgKzg4OSw0NiBAQAogICAgIGFzc2VydCghZXJyKTsKIH0KIAotLyoqIGxvYWRUZXh0dXJlCi0gKiAgICAgbG9hZHMgYSBwbmcgZmlsZSBpbnRvIGFuIG1lbW9yeSBvYmplY3QsIHVzaW5nIGNzdGRpbyAsIGxpYnBuZy4KLSAqCi0gKiAgICAgICAgXHBhcmFtIGRlbW8gOiBOZWVkZWQgdG8gYWNjZXNzIFZLIGNhbGxzCi0gKiAgICAgXHBhcmFtIGZpbGVuYW1lIDogdGhlIHBuZyBmaWxlIHRvIGJlIGxvYWRlZAotICogICAgIFxwYXJhbSB3aWR0aCA6IHdpZHRoIG9mIHBuZywgdG8gYmUgdXBkYXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHRoaXMgZnVuY3Rpb24KLSAqICAgICBccGFyYW0gaGVpZ2h0IDogaGVpZ2h0IG9mIHBuZywgdG8gYmUgdXBkYXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHRoaXMgZnVuY3Rpb24KLSAqCi0gKiAgICAgXHJldHVybiBib29sIDogYW4gb3BlbmdsIHRleHR1cmUgaWQuICB0cnVlIGlmIHN1Y2Nlc3NmdWw/LAotICogICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgdmFsaWRhdGVkIGJ5IHRoZSBjbGllbnQgb2YgdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBTb3VyY2U6IGh0dHA6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvT3BlbkdMX1Byb2dyYW1taW5nL0ludGVybWVkaWF0ZS9UZXh0dXJlcwotICogTW9kaWZpZWQgdG8gY29weSBpbWFnZSB0byBtZW1vcnkKLSAqCi0gKi8KKy8qIExvYWQgYSBwcG0gZmlsZSBpbnRvIG1lbW9yeSAqLwogYm9vbCBsb2FkVGV4dHVyZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdWludDhfdCAqcmdiYV9kYXRhLAogICAgICAgICAgICAgICAgICBWa1N1YnJlc291cmNlTGF5b3V0ICpsYXlvdXQsCiAgICAgICAgICAgICAgICAgIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpCiB7Ci0gIC8vaGVhZGVyIGZvciB0ZXN0aW5nIGlmIGl0IGlzIGEgcG5nCi0gIHBuZ19ieXRlIGhlYWRlcls4XTsKLSAgaW50IGlzX3BuZywgYml0X2RlcHRoLCBjb2xvcl90eXBlLCByb3dieXRlczsKLSAgc2l6ZV90IHJldHZhbDsKLSAgcG5nX3VpbnRfMzIgaSwgdHdpZHRoLCB0aGVpZ2h0OwotICBwbmdfc3RydWN0cCAgcG5nX3B0cjsKLSAgcG5nX2luZm9wIGluZm9fcHRyLCBlbmRfaW5mbzsKLSAgcG5nX2J5dGUgKmltYWdlX2RhdGE7Ci0gIHBuZ19ieXRlcCAqcm93X3BvaW50ZXJzOworICAgIEZJTEUgKmZQdHIgPSBmb3BlbihmaWxlbmFtZSwicmIiKTsKKyAgICBjaGFyIGhlYWRlclsyNTZdLCAqY1B0cjsKIAotICAvL29wZW4gZmlsZSBhcyBiaW5hcnkKLSAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7Ci0gIGlmICghZnApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKyAgICBpZiAoIWZQdHIpCisgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAvL3JlYWQgdGhlIGhlYWRlcgotICByZXR2YWwgPSBmcmVhZChoZWFkZXIsIDEsIDgsIGZwKTsKLSAgaWYgKHJldHZhbCAhPSA4KSB7Ci0gICAgICBmY2xvc2UoZnApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9CisgICAgY1B0ciA9IGZnZXRzKGhlYWRlciwgMjU2LCBmUHRyKTsgLy8gUDYKKyAgICBpZiAoY1B0ciA9PSBOVUxMIHx8IHN0cm5jbXAoaGVhZGVyLCAiUDZcbiIsIDMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgLy90ZXN0IGlmIHBuZwotICBpc19wbmcgPSAhcG5nX3NpZ19jbXAoaGVhZGVyLCAwLCA4KTsKLSAgaWYgKCFpc19wbmcpIHsKLSAgICBmY2xvc2UoZnApOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQorICAgIGRvIHsKKyAgICAgICAgY1B0ciA9IGZnZXRzKGhlYWRlciwgMjU2LCBmUHRyKTsKKyAgICAgICAgaWYgKGNQdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IHdoaWxlICggIXN0cm5jbXAoaGVhZGVyLCAiIyIsIDEpICk7CiAKLSAgLy9jcmVhdGUgcG5nIHN0cnVjdAotICBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgaWYgKCFwbmdfcHRyKSB7Ci0gICAgZmNsb3NlKGZwKTsKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgfQorICAgIHNzY2FuZihoZWFkZXIsICIldSAldSIsIGhlaWdodCwgd2lkdGgpOworICAgIGlmIChyZ2JhX2RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZmdldHMoaGVhZGVyLCAyNTYsIGZQdHIpOyAvLyBGb3JtYXQKKyAgICBpZiAoY1B0ciA9PSBOVUxMIHx8IHN0cm5jbXAoaGVhZGVyLCAiMjU1XG4iLCAzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gIC8vY3JlYXRlIHBuZyBpbmZvIHN0cnVjdAotICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gIGlmICghaW5mb19wdHIpIHsKLSAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwsIChwbmdfaW5mb3BwKSBOVUxMKTsKLSAgICBmY2xvc2UoZnApOwotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci0KLSAgLy9jcmVhdGUgcG5nIGluZm8gc3RydWN0Ci0gIGVuZF9pbmZvID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgaWYgKCFlbmRfaW5mbykgewotICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIChwbmdfaW5mb3BwKSBOVUxMKTsKLSAgICBmY2xvc2UoZnApOwotICAgIHJldHVybiAoZmFsc2UpOwotICB9Ci0KLSAgLy9wbmcgZXJyb3Igc3R1ZmYsIG5vdCBzdXJlIGxpYnBuZyBtYW4gc3VnZ2VzdHMgdGhpcy4KLSAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkgewotICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsICZlbmRfaW5mbyk7Ci0gICAgZmNsb3NlKGZwKTsKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgfQotCi0gIC8vaW5pdCBwbmcgcmVhZGluZwotICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmcCk7Ci0KLSAgLy9sZXQgbGlicG5nIGtub3cgeW91IGFscmVhZHkgcmVhZCB0aGUgZmlyc3QgOCBieXRlcwotICBwbmdfc2V0X3NpZ19ieXRlcyhwbmdfcHRyLCA4KTsKLQotICAvLyByZWFkIGFsbCB0aGUgaW5mbyB1cCB0byB0aGUgaW1hZ2UgZGF0YQotICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAvLyBnZXQgaW5mbyBhYm91dCBwbmcKLSAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmdHdpZHRoLCAmdGhlaWdodCwgJmJpdF9kZXB0aCwgJmNvbG9yX3R5cGUsCi0gICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKLQotICAvL3VwZGF0ZSB3aWR0aCBhbmQgaGVpZ2h0IGJhc2VkIG9uIHBuZyBpbmZvCi0gICp3aWR0aCA9IHR3aWR0aDsKLSAgKmhlaWdodCA9IHRoZWlnaHQ7Ci0KLSAgLy8gUmVxdWlyZSB0aGF0IGluY29taW5nIHRleHR1cmUgYmUgOGJpdHMgcGVyIGNvbG9yIGNvbXBvbmVudAotICAvLyBhbmQgNCBjb21wb25lbnRzIChSR0JBKS4KLSAgaWYgKHBuZ19nZXRfYml0X2RlcHRoKHBuZ19wdHIsIGluZm9fcHRyKSAhPSA4IHx8Ci0gICAgICBwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKSAhPSA0KSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAocmdiYV9kYXRhID09IE5VTEwpIHsKLSAgICAgIC8vIElmIGRhdGEgcG9pbnRlciBpcyBudWxsLCB3ZSBqdXN0IHdhbnQgdGhlIHdpZHRoICYgaGVpZ2h0Ci0gICAgICAvLyBjbGVhbiB1cCBtZW1vcnkgYW5kIGNsb3NlIHN0dWZmCi0gICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCAmZW5kX2luZm8pOwotICAgICAgZmNsb3NlKGZwKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBVcGRhdGUgdGhlIHBuZyBpbmZvIHN0cnVjdC4KLSAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gIC8vIFJvdyBzaXplIGluIGJ5dGVzLgotICByb3dieXRlcyA9IHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gIC8vIEFsbG9jYXRlIHRoZSBpbWFnZV9kYXRhIGFzIGEgYmlnIGJsb2NrLCB0byBiZSBnaXZlbiB0byBvcGVuZ2wKLSAgaW1hZ2VfZGF0YSA9IChwbmdfYnl0ZSAqKW1hbGxvYyhyb3dieXRlcyAqIHRoZWlnaHQgKiBzaXplb2YocG5nX2J5dGUpKTsKLSAgaWYgKCFpbWFnZV9kYXRhKSB7Ci0gICAgLy9jbGVhbiB1cCBtZW1vcnkgYW5kIGNsb3NlIHN0dWZmCi0gICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgJmVuZF9pbmZvKTsKLSAgICBmY2xvc2UoZnApOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIHJvd19wb2ludGVycyBpcyBmb3IgcG9pbnRpbmcgdG8gaW1hZ2VfZGF0YSBmb3IgcmVhZGluZyB0aGUgcG5nIHdpdGggbGlicG5nCi0gIHJvd19wb2ludGVycyA9IChwbmdfYnl0ZXAgKiltYWxsb2ModGhlaWdodCAqIHNpemVvZihwbmdfYnl0ZXApKTsKLSAgaWYgKCFyb3dfcG9pbnRlcnMpIHsKLSAgICAvL2NsZWFuIHVwIG1lbW9yeSBhbmQgY2xvc2Ugc3R1ZmYKLSAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCAmZW5kX2luZm8pOwotICAgIC8vIGRlbGV0ZVtdIGltYWdlX2RhdGE7Ci0gICAgZmNsb3NlKGZwKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gc2V0IHRoZSBpbmRpdmlkdWFsIHJvd19wb2ludGVycyB0byBwb2ludCBhdCB0aGUgY29ycmVjdCBvZmZzZXRzIG9mIGltYWdlX2RhdGEKLSAgZm9yIChpID0gMDsgaSA8IHRoZWlnaHQ7ICsraSkKLSAgICByb3dfcG9pbnRlcnNbdGhlaWdodCAtIDEgLSBpXSA9IHJnYmFfZGF0YSArIGkgKiBsYXlvdXQtPnJvd1BpdGNoOwotCi0gIC8vIHJlYWQgdGhlIHBuZyBpbnRvIGltYWdlX2RhdGEgdGhyb3VnaCByb3dfcG9pbnRlcnMKLSAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKLQotICAvLyBjbGVhbiB1cCBtZW1vcnkgYW5kIGNsb3NlIHN0dWZmCi0gIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsICZlbmRfaW5mbyk7Ci0gIGZyZWUocm93X3BvaW50ZXJzKTsKLSAgZnJlZShpbWFnZV9kYXRhKTsKLSAgZmNsb3NlKGZwKTsKLQorICAgIGZvcihpbnQgeSA9IDA7IHkgPCAqaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICB1aW50OF90ICpyb3dQdHIgPSByZ2JhX2RhdGE7CisgICAgICAgIGZvcihpbnQgeCA9IDA7IHggPCAqd2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgZnJlYWQocm93UHRyLCAzLCAxLCBmUHRyKTsKKyAgICAgICAgICAgIHJvd1B0clszXSA9IDI1NTsgLyogQWxwaGEgb2YgMSAqLworICAgICAgICAgICAgcm93UHRyICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgcmdiYV9kYXRhICs9IGxheW91dC0+cm93UGl0Y2g7CisgICAgfQorICAgIGZjbG9zZShmUHRyKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTIxMjcsNyArMjAxNiw3IEBACiAgICAgICAgIC8vIFdhaXQgZm9yIHdvcmsgdG8gZmluaXNoIGJlZm9yZSB1cGRhdGluZyBNVlAuCiAgICAgICAgIHZrRGV2aWNlV2FpdElkbGUoZGVtby0+ZGV2aWNlKTsKICAgICAgICAgZGVtby0+Y3VyRnJhbWUrKzsKLSAgICAgICAgaWYgKGRlbW8tPmZyYW1lQ291bnQgIT0gSU5UX01BWCAmJiBkZW1vLT5jdXJGcmFtZSA9PSBkZW1vLT5mcmFtZUNvdW50KQorICAgICAgICBpZiAoZGVtby0+ZnJhbWVDb3VudCAhPSBJTlQzMl9NQVggJiYgZGVtby0+Y3VyRnJhbWUgPT0gZGVtby0+ZnJhbWVDb3VudCkKICAgICAgICAgICAgIGRlbW8tPnF1aXQgPSB0cnVlOwogCiAgICAgfQpAQCAtMjYyNCw3ICsyNTEzLDcgQEAKICAgICB2ZWMzIHVwID0gezAuMGYsIDEuMGYsIDAuMH07CiAKICAgICBtZW1zZXQoZGVtbywgMCwgc2l6ZW9mKCpkZW1vKSk7Ci0gICAgZGVtby0+ZnJhbWVDb3VudCA9IElOVF9NQVg7CisgICAgZGVtby0+ZnJhbWVDb3VudCA9IElOVDMyX01BWDsKIAogICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi0tdXNlX3N0YWdpbmciKSA9PSAwKSB7CkBAIC0yNjQ0LDcgKzI1MzMsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLS1jIikgPT0gMCAmJgotICAgICAgICAgICAgZGVtby0+ZnJhbWVDb3VudCA9PSBJTlRfTUFYICYmCisgICAgICAgICAgICBkZW1vLT5mcmFtZUNvdW50ID09IElOVDMyX01BWCAmJgogICAgICAgICAgICAgaSA8IGFyZ2MtMSAmJgogICAgICAgICAgICAgc3NjYW5mKGFyZ3ZbaSsxXSwiJWQiLCAmZGVtby0+ZnJhbWVDb3VudCkgPT0gMSAmJgogICAgICAgICAgICAgZGVtby0+ZnJhbWVDb3VudCA+PSAwKQpkaWZmIC0tZ2l0IGEvZGVtb3MvbHVuYXJnLWxvZ28tMjU2eDI1Ni1zb2xpZC5wbmcgYi9kZW1vcy9sdW5hcmctbG9nby0yNTZ4MjU2LXNvbGlkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1NWM3Mi4uMDAwMDAwMAotLS0gYS9kZW1vcy9sdW5hcmctbG9nby0yNTZ4MjU2LXNvbGlkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RlbW9zL2x1bmFyZy1sb2dvLTI1NngyNTYucG5nIGIvZGVtb3MvbHVuYXJnLWxvZ28tMjU2eDI1Ni5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTA2MWYuLjAwMDAwMDAKLS0tIGEvZGVtb3MvbHVuYXJnLWxvZ28tMjU2eDI1Ni5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kZW1vcy9sdW5hcmcucHBtIGIvZGVtb3MvbHVuYXJnLnBwbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzgwOGUxCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvbHVuYXJnLnBwbQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL1hDQi9yYW5kci5oIGIvaW5jbHVkZS9YQ0IvcmFuZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1Yjk3My4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL1hDQi9yYW5kci5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jaWZuZGVmIF9fUkFORFJfSAotI2RlZmluZSBfX1JBTkRSX0gKLQotdHlwZWRlZiB2b2lkICogeGNiX3JhbmRyX3Byb3ZpZGVyX3Q7Ci10eXBlZGVmIHVpbnQzMl90IHhjYl9yYW5kcl9jcnRjX3Q7Ci0KLSNlbmRpZiAvLyBfX1JBTkRSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvWENCL3hjYi5oIGIvaW5jbHVkZS9YQ0IveGNiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZWQyMmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9YQ0IveGNiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IEJhcnQgTWFzc2V5LCBKYW1leSBTaGFycCwgYW5kIEpvc2ggVHJpcGxldHQuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0gKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKLSAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotICogQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICoKLSAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBvciB0aGVpcgotICogaW5zdGl0dXRpb25zIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZQotICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiBhdXRob3JpemF0aW9uIGZyb20gdGhlIGF1dGhvcnMuCi0gKi8KLQotI2lmbmRlZiBfX1hDQl9IX18KLSNkZWZpbmUgX19YQ0JfSF9fCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkKF9fc29sYXJpc19fKQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1dJTjMyCi0jaW5jbHVkZSA8c3lzL3Vpby5oPgotI2Vsc2UKLSNpbmNsdWRlICJ4Y2Jfd2luZGVmcy5oIgotI2VuZGlmCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqIEBmaWxlIHhjYi5oCi0gKi8KLQotI2RlZmluZSBYQ0JfUEFDS0VEIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKQotCi0vKioKLSAqIEBkZWZncm91cCBYQ0JfQ29yZV9BUEkgWENCIENvcmUgQVBJCi0gKiBAYnJpZWYgQ29yZSBBUEkgb2YgdGhlIFhDQiBsaWJyYXJ5LgotICoKLSAqIEB7Ci0gKi8KLQotLyogUHJlLWRlZmluZWQgY29uc3RhbnRzICovCi0KLS8qKiBDdXJyZW50IHByb3RvY29sIHZlcnNpb24gKi8KLSNkZWZpbmUgWF9QUk9UT0NPTCAxMQotCi0vKiogQ3VycmVudCBtaW5vciB2ZXJzaW9uICovCi0jZGVmaW5lIFhfUFJPVE9DT0xfUkVWSVNJT04gMAotCi0vKiogWF9UQ1BfUE9SVCArIGRpc3BsYXkgbnVtYmVyID0gc2VydmVyIHBvcnQgZm9yIFRDUCB0cmFuc3BvcnQgKi8KLSNkZWZpbmUgWF9UQ1BfUE9SVCA2MDAwCi0KLS8qKiB4Y2IgY29ubmVjdGlvbiBlcnJvcnMgYmVjYXVzZSBvZiBzb2NrZXQsIHBpcGUgYW5kIG90aGVyIHN0cmVhbSBlcnJvcnMuICovCi0jZGVmaW5lIFhDQl9DT05OX0VSUk9SIDEKLQotLyoqIHhjYiBjb25uZWN0aW9uIHNodXRkb3duIGJlY2F1c2Ugb2YgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgWENCX0NPTk5fQ0xPU0VEX0VYVF9OT1RTVVBQT1JURUQgMgotCi0vKiogbWFsbG9jKCksIGNhbGxvYygpIGFuZCByZWFsbG9jKCkgZXJyb3IgdXBvbiBmYWlsdXJlLCBmb3IgZWcgRU5PTUVNICovCi0jZGVmaW5lIFhDQl9DT05OX0NMT1NFRF9NRU1fSU5TVUZGSUNJRU5UIDMKLQotLyoqIENvbm5lY3Rpb24gY2xvc2VkLCBleGNlZWRpbmcgcmVxdWVzdCBsZW5ndGggdGhhdCBzZXJ2ZXIgYWNjZXB0cy4gKi8KLSNkZWZpbmUgWENCX0NPTk5fQ0xPU0VEX1JFUV9MRU5fRVhDRUVEIDQKLQotLyoqIENvbm5lY3Rpb24gY2xvc2VkLCBlcnJvciBkdXJpbmcgcGFyc2luZyBkaXNwbGF5IHN0cmluZy4gKi8KLSNkZWZpbmUgWENCX0NPTk5fQ0xPU0VEX1BBUlNFX0VSUiA1Ci0KLS8qKiBDb25uZWN0aW9uIGNsb3NlZCBiZWNhdXNlIHRoZSBzZXJ2ZXIgZG9lcyBub3QgaGF2ZSBhIHNjcmVlbiBtYXRjaGluZyB0aGUgZGlzcGxheS4gKi8KLSNkZWZpbmUgWENCX0NPTk5fQ0xPU0VEX0lOVkFMSURfU0NSRUVOIDYKLQotLyoqIENvbm5lY3Rpb24gY2xvc2VkIGJlY2F1c2Ugc29tZSBGRCBwYXNzaW5nIG9wZXJhdGlvbiBmYWlsZWQgKi8KLSNkZWZpbmUgWENCX0NPTk5fQ0xPU0VEX0ZEUEFTU0lOR19GQUlMRUQgNwotCi0jZGVmaW5lIFhDQl9UWVBFX1BBRChULEkpICgtKEkpICYgKHNpemVvZihUKSA+IDQgPyAzIDogc2l6ZW9mKFQpIC0gMSkpCi0KLS8qIE9wYXF1ZSBzdHJ1Y3R1cmVzICovCi0KLS8qKgotICogQGJyaWVmIFhDQiBDb25uZWN0aW9uIHN0cnVjdHVyZS4KLSAqCi0gKiBBIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW4gYWxsIGRhdGEgdGhhdCAgWENCIG5lZWRzIHRvIGNvbW11bmljYXRlIHdpdGggYW4gWCBzZXJ2ZXIuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHhjYl9jb25uZWN0aW9uX3QgeGNiX2Nvbm5lY3Rpb25fdDsgIC8qKjwgT3BhcXVlIHN0cnVjdHVyZSBjb250YWluaW5nIGFsbCBkYXRhIHRoYXQgIFhDQiBuZWVkcyB0byBjb21tdW5pY2F0ZSB3aXRoIGFuIFggc2VydmVyLiAqLwotCi0KLS8qIE90aGVyIHR5cGVzICovCi0KLS8qKgotICogQGJyaWVmIEdlbmVyaWMgaXRlcmF0b3IuCi0gKgotICogQSBnZW5lcmljIGl0ZXJhdG9yIHN0cnVjdHVyZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHZvaWQgKmRhdGE7ICAgLyoqPCBEYXRhIG9mIHRoZSBjdXJyZW50IGl0ZXJhdG9yICovCi0gICAgaW50IHJlbTsgICAgLyoqPCByZW1haW5pbmcgZWxlbWVudHMgKi8KLSAgICBpbnQgaW5kZXg7ICAvKio8IGluZGV4IG9mIHRoZSBjdXJyZW50IGl0ZXJhdG9yICovCi19IHhjYl9nZW5lcmljX2l0ZXJhdG9yX3Q7Ci0KLS8qKgotICogQGJyaWVmIEdlbmVyaWMgcmVwbHkuCi0gKgotICogQSBnZW5lcmljIHJlcGx5IHN0cnVjdHVyZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQ4X3QgICByZXNwb25zZV90eXBlOyAgLyoqPCBUeXBlIG9mIHRoZSByZXNwb25zZSAqLwotICAgIHVpbnQ4X3QgIHBhZDA7ICAgICAgICAgICAvKio8IFBhZGRpbmcgKi8KLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgICAgICAgLyoqPCBTZXF1ZW5jZSBudW1iZXIgKi8KLSAgICB1aW50MzJfdCBsZW5ndGg7ICAgICAgICAgLyoqPCBMZW5ndGggb2YgdGhlIHJlc3BvbnNlICovCi19IHhjYl9nZW5lcmljX3JlcGx5X3Q7Ci0KLS8qKgotICogQGJyaWVmIEdlbmVyaWMgZXZlbnQuCi0gKgotICogQSBnZW5lcmljIGV2ZW50IHN0cnVjdHVyZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQ4X3QgICByZXNwb25zZV90eXBlOyAgLyoqPCBUeXBlIG9mIHRoZSByZXNwb25zZSAqLwotICAgIHVpbnQ4X3QgIHBhZDA7ICAgICAgICAgICAvKio8IFBhZGRpbmcgKi8KLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgICAgICAgLyoqPCBTZXF1ZW5jZSBudW1iZXIgKi8KLSAgICB1aW50MzJfdCBwYWRbN107ICAgICAgICAgLyoqPCBQYWRkaW5nICovCi0gICAgdWludDMyX3QgZnVsbF9zZXF1ZW5jZTsgIC8qKjwgZnVsbCBzZXF1ZW5jZSAqLwotfSB4Y2JfZ2VuZXJpY19ldmVudF90OwotCi0vKioKLSAqIEBicmllZiBHRSBldmVudAotICoKLSAqIEFuIGV2ZW50IGFzIHNlbnQgYnkgdGhlIFhHRSBleHRlbnNpb24uIFRoZSBsZW5ndGggZmllbGQgc3BlY2lmaWVzIHRoZQotICogbnVtYmVyIG9mIDQtYnl0ZSBibG9ja3MgdHJhaWxpbmcgdGhlIHN0cnVjdC4KLSAqCi0gKiBAZGVwcmVjYXRlZCBTaW5jZSBzb21lIGZpZWxkcyBpbiB0aGlzIHN0cnVjdCBoYXZlIHVuZm9ydHVuYXRlIG5hbWVzLCBpdCBpcwotICogcmVjb21tZW5kZWQgdG8gdXNlIHhjYl9nZV9nZW5lcmljX2V2ZW50X3QgaW5zdGVhZC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7ICAvKio8IFR5cGUgb2YgdGhlIHJlc3BvbnNlICovCi0gICAgdWludDhfdCAgcGFkMDsgICAgICAgICAgIC8qKjwgUGFkZGluZyAqLwotICAgIHVpbnQxNl90IHNlcXVlbmNlOyAgICAgICAvKio8IFNlcXVlbmNlIG51bWJlciAqLwotICAgIHVpbnQzMl90IGxlbmd0aDsKLSAgICB1aW50MTZfdCBldmVudF90eXBlOwotICAgIHVpbnQxNl90IHBhZDE7Ci0gICAgdWludDMyX3QgcGFkWzVdOyAgICAgICAgIC8qKjwgUGFkZGluZyAqLwotICAgIHVpbnQzMl90IGZ1bGxfc2VxdWVuY2U7ICAvKio8IGZ1bGwgc2VxdWVuY2UgKi8KLX0geGNiX2dlX2V2ZW50X3Q7Ci0KLS8qKgotICogQGJyaWVmIEdlbmVyaWMgZXJyb3IuCi0gKgotICogQSBnZW5lcmljIGVycm9yIHN0cnVjdHVyZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQ4X3QgICByZXNwb25zZV90eXBlOyAgLyoqPCBUeXBlIG9mIHRoZSByZXNwb25zZSAqLwotICAgIHVpbnQ4X3QgICBlcnJvcl9jb2RlOyAgICAgLyoqPCBFcnJvciBjb2RlICovCi0gICAgdWludDE2X3Qgc2VxdWVuY2U7ICAgICAgIC8qKjwgU2VxdWVuY2UgbnVtYmVyICovCi0gICAgdWludDMyX3QgcmVzb3VyY2VfaWQ7ICAgICAvKiogPCBSZXNvdXJjZSBJRCBmb3IgcmVxdWVzdHMgd2l0aCBzaWRlIGVmZmVjdHMgb25seSAqLwotICAgIHVpbnQxNl90IG1pbm9yX2NvZGU7ICAgICAgLyoqIDwgTWlub3Igb3Bjb2RlIG9mIHRoZSBmYWlsZWQgcmVxdWVzdCAqLwotICAgIHVpbnQ4X3QgbWFqb3JfY29kZTsgICAgICAgLyoqIDwgTWFqb3Igb3Bjb2RlIG9mIHRoZSBmYWlsZWQgcmVxdWVzdCAqLwotICAgIHVpbnQ4X3QgcGFkMDsKLSAgICB1aW50MzJfdCBwYWRbNV07ICAgICAgICAgLyoqPCBQYWRkaW5nICovCi0gICAgdWludDMyX3QgZnVsbF9zZXF1ZW5jZTsgIC8qKjwgZnVsbCBzZXF1ZW5jZSAqLwotfSB4Y2JfZ2VuZXJpY19lcnJvcl90OwotCi0vKioKLSAqIEBicmllZiBHZW5lcmljIGNvb2tpZS4KLSAqCi0gKiBBIGdlbmVyaWMgY29va2llIHN0cnVjdHVyZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgIC8qKjwgU2VxdWVuY2UgbnVtYmVyICovCi19IHhjYl92b2lkX2Nvb2tpZV90OwotCi0KLS8qIEluY2x1ZGUgdGhlIGdlbmVyYXRlZCB4cHJvdG8gaGVhZGVyLiAqLwotI2luY2x1ZGUgInhwcm90by5oIgotCi0KLS8qKiBYQ0JfTk9ORSBpcyB0aGUgdW5pdmVyc2FsIG51bGwgcmVzb3VyY2Ugb3IgbnVsbCBhdG9tIHBhcmFtZXRlciB2YWx1ZSBmb3IgbWFueSBjb3JlIFggcmVxdWVzdHMgKi8KLSNkZWZpbmUgWENCX05PTkUgMEwKLQotLyoqIFhDQl9DT1BZX0ZST01fUEFSRU5UIGNhbiBiZSB1c2VkIGZvciBtYW55IHhjYl9jcmVhdGVfd2luZG93IHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgWENCX0NPUFlfRlJPTV9QQVJFTlQgMEwKLQotLyoqIFhDQl9DVVJSRU5UX1RJTUUgY2FuIGJlIHVzZWQgaW4gbW9zdCByZXF1ZXN0cyB0aGF0IHRha2UgYW4geGNiX3RpbWVzdGFtcF90ICovCi0jZGVmaW5lIFhDQl9DVVJSRU5UX1RJTUUgMEwKLQotLyoqIFhDQl9OT19TWU1CT0wgZmlsbHMgaW4gdW51c2VkIGVudHJpZXMgaW4geGNiX2tleXN5bV90IHRhYmxlcyAqLwotI2RlZmluZSBYQ0JfTk9fU1lNQk9MIDBMCi0KLQotLyogeGNiX2F1dGguYyAqLwotCi0vKioKLSAqIEBicmllZiBDb250YWluZXIgZm9yIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24uCi0gKgotICogQSBjb250YWluZXIgZm9yIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24gdG8gYmUgc2VudCB0byB0aGUgWCBzZXJ2ZXIuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHhjYl9hdXRoX2luZm9fdCB7Ci0gICAgaW50ICAgbmFtZWxlbjsgIC8qKjwgTGVuZ3RoIG9mIHRoZSBzdHJpbmcgbmFtZSAoYXMgcmV0dXJuZWQgYnkgc3RybGVuKS4gKi8KLSAgICBjaGFyICpuYW1lOyAgICAgLyoqPCBTdHJpbmcgY29udGFpbmluZyB0aGUgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgbmFtZSwgc3VjaCBhcyAiTUlULU1BR0lDLUNPT0tJRS0xIiBvciAiWERNLUFVVEhPUklaQVRJT04tMSIuICovCi0gICAgaW50ICAgZGF0YWxlbjsgIC8qKjwgTGVuZ3RoIG9mIHRoZSBkYXRhIG1lbWJlci4gKi8KLSAgICBjaGFyICpkYXRhOyAgIC8qKjwgRGF0YSBpbnRlcnByZXRlZCBpbiBhIHByb3RvY29sLXNwZWNpZmljIG1hbm5lci4gKi8KLX0geGNiX2F1dGhfaW5mb190OwotCi0KLS8qIHhjYl9vdXQuYyAqLwotCi0vKioKLSAqIEBicmllZiBGb3JjZXMgYW55IGJ1ZmZlcmVkIG91dHB1dCB0byBiZSB3cml0dGVuIHRvIHRoZSBzZXJ2ZXIuCi0gKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIFggc2VydmVyLgotICogQHJldHVybiA+IEBjIDAgb24gc3VjY2VzcywgPD0gQGMgMCBvdGhlcndpc2UuCi0gKgotICogRm9yY2VzIGFueSBidWZmZXJlZCBvdXRwdXQgdG8gYmUgd3JpdHRlbiB0byB0aGUgc2VydmVyLiBCbG9ja3MKLSAqIHVudGlsIHRoZSB3cml0ZSBpcyBjb21wbGV0ZS4KLSAqLwotaW50IHhjYl9mbHVzaCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKLQotLyoqCi0gKiBAYnJpZWYgUmV0dXJucyB0aGUgbWF4aW11bSByZXF1ZXN0IGxlbmd0aCB0aGF0IHRoaXMgc2VydmVyIGFjY2VwdHMuCi0gKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIFggc2VydmVyLgotICogQHJldHVybiBUaGUgbWF4aW11bSByZXF1ZXN0IGxlbmd0aCBmaWVsZC4KLSAqCi0gKiBJbiB0aGUgYWJzZW5jZSBvZiB0aGUgQklHLVJFUVVFU1RTIGV4dGVuc2lvbiwgcmV0dXJucyB0aGUKLSAqIG1heGltdW0gcmVxdWVzdCBsZW5ndGggZmllbGQgZnJvbSB0aGUgY29ubmVjdGlvbiBzZXR1cCBkYXRhLCB3aGljaAotICogbWF5IGJlIGFzIG11Y2ggYXMgNjU1MzUuIElmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgQklHLVJFUVVFU1RTLCB0aGVuCi0gKiB0aGUgbWF4aW11bSByZXF1ZXN0IGxlbmd0aCBmaWVsZCBmcm9tIHRoZSByZXBseSB0byB0aGUKLSAqIEJpZ1JlcXVlc3RzRW5hYmxlIHJlcXVlc3Qgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkLgotICoKLSAqIE5vdGUgdGhhdCB0aGlzIGxlbmd0aCBpcyBtZWFzdXJlZCBpbiBmb3VyLWJ5dGUgdW5pdHMsIG1ha2luZyB0aGUKLSAqIHRoZW9yZXRpY2FsIG1heGltdW0gbGVuZ3RocyByb3VnaGx5IDI1NmtCIHdpdGhvdXQgQklHLVJFUVVFU1RTIGFuZAotICogMTZHQiB3aXRoLgotICovCi11aW50MzJfdCB4Y2JfZ2V0X21heGltdW1fcmVxdWVzdF9sZW5ndGgoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7Ci0KLS8qKgotICogQGJyaWVmIFByZWZldGNoIHRoZSBtYXhpbXVtIHJlcXVlc3QgbGVuZ3RoIHdpdGhvdXQgYmxvY2tpbmcuCi0gKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIFggc2VydmVyLgotICoKLSAqIFdpdGhvdXQgYmxvY2tpbmcsIGRvZXMgYXMgbXVjaCB3b3JrIGFzIHBvc3NpYmxlIHRvd2FyZCBjb21wdXRpbmcKLSAqIHRoZSBtYXhpbXVtIHJlcXVlc3QgbGVuZ3RoIGFjY2VwdGVkIGJ5IHRoZSBYIHNlcnZlci4KLSAqCi0gKiBJbnZva2luZyB0aGlzIGZ1bmN0aW9uIG1heSBjYXVzZSBhIGNhbGwgdG8geGNiX2JpZ19yZXF1ZXN0c19lbmFibGUsCi0gKiBidXQgd2lsbCBub3QgYmxvY2sgd2FpdGluZyBmb3IgdGhlIHJlcGx5LgotICogeGNiX2dldF9tYXhpbXVtX3JlcXVlc3RfbGVuZ3RoIHdpbGwgcmV0dXJuIHRoZSBwcmVmZXRjaGVkIGRhdGEKLSAqIGFmdGVyIHBvc3NpYmx5IGJsb2NraW5nIHdoaWxlIHRoZSByZXBseSBpcyByZXRyaWV2ZWQuCi0gKgotICogTm90ZSB0aGF0IGluIG9yZGVyIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGZ1bGx5IG5vbi1ibG9ja2luZywgdGhlCi0gKiBhcHBsaWNhdGlvbiBtdXN0IHByZXZpb3VzbHkgaGF2ZSBjYWxsZWQKLSAqIHhjYl9wcmVmZXRjaF9leHRlbnNpb25fZGF0YShjLCAmeGNiX2JpZ19yZXF1ZXN0c19pZCkgYW5kIHRoZSByZXBseQotICogbXVzdCBoYXZlIGFscmVhZHkgYXJyaXZlZC4KLSAqLwotdm9pZCB4Y2JfcHJlZmV0Y2hfbWF4aW11bV9yZXF1ZXN0X2xlbmd0aCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKLQotCi0vKiB4Y2JfaW4uYyAqLwotCi0vKioKLSAqIEBicmllZiBSZXR1cm5zIHRoZSBuZXh0IGV2ZW50IG9yIGVycm9yIGZyb20gdGhlIHNlcnZlci4KLSAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbiB0byB0aGUgWCBzZXJ2ZXIuCi0gKiBAcmV0dXJuIFRoZSBuZXh0IGV2ZW50IGZyb20gdGhlIHNlcnZlci4KLSAqCi0gKiBSZXR1cm5zIHRoZSBuZXh0IGV2ZW50IG9yIGVycm9yIGZyb20gdGhlIHNlcnZlciwgb3IgcmV0dXJucyBudWxsIGluCi0gKiB0aGUgZXZlbnQgb2YgYW4gSS9PIGVycm9yLiBCbG9ja3MgdW50aWwgZWl0aGVyIGFuIGV2ZW50IG9yIGVycm9yCi0gKiBhcnJpdmUsIG9yIGFuIEkvTyBlcnJvciBvY2N1cnMuCi0gKi8KLXhjYl9nZW5lcmljX2V2ZW50X3QgKnhjYl93YWl0X2Zvcl9ldmVudCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKLQotLyoqCi0gKiBAYnJpZWYgUmV0dXJucyB0aGUgbmV4dCBldmVudCBvciBlcnJvciBmcm9tIHRoZSBzZXJ2ZXIuCi0gKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIFggc2VydmVyLgotICogQHJldHVybiBUaGUgbmV4dCBldmVudCBmcm9tIHRoZSBzZXJ2ZXIuCi0gKgotICogUmV0dXJucyB0aGUgbmV4dCBldmVudCBvciBlcnJvciBmcm9tIHRoZSBzZXJ2ZXIsIGlmIG9uZSBpcwotICogYXZhaWxhYmxlLCBvciByZXR1cm5zIEBjIE5VTEwgb3RoZXJ3aXNlLiBJZiBubyBldmVudCBpcyBhdmFpbGFibGUsIHRoYXQKLSAqIG1pZ2h0IGJlIGJlY2F1c2UgYW4gSS9PIGVycm9yIGxpa2UgY29ubmVjdGlvbiBjbG9zZSBvY2N1cnJlZCB3aGlsZQotICogYXR0ZW1wdGluZyB0byByZWFkIHRoZSBuZXh0IGV2ZW50LCBpbiB3aGljaCBjYXNlIHRoZSBjb25uZWN0aW9uIGlzCi0gKiBzaHV0IGRvd24gd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCi0gKi8KLXhjYl9nZW5lcmljX2V2ZW50X3QgKnhjYl9wb2xsX2Zvcl9ldmVudCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKLQotLyoqCi0gKiBAYnJpZWYgUmV0dXJucyB0aGUgbmV4dCBldmVudCB3aXRob3V0IHJlYWRpbmcgZnJvbSB0aGUgY29ubmVjdGlvbi4KLSAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbiB0byB0aGUgWCBzZXJ2ZXIuCi0gKiBAcmV0dXJuIFRoZSBuZXh0IGFscmVhZHkgcXVldWVkIGV2ZW50IGZyb20gdGhlIHNlcnZlci4KLSAqCi0gKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiB4Y2JfcG9sbF9mb3JfZXZlbnQgdGhhdCBvbmx5IGV4YW1pbmVzIHRoZQotICogZXZlbnQgcXVldWUgZm9yIG5ldyBldmVudHMuIFRoZSBmdW5jdGlvbiBkb2Vzbid0IHRyeSB0byByZWFkIG5ldwotICogZXZlbnRzIGZyb20gdGhlIGNvbm5lY3Rpb24gaWYgbm8gcXVldWVkIGV2ZW50cyBhcmUgZm91bmQuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIGNhbGxlcnMgdGhhdCBrbm93IGluIGFkdmFuY2UgdGhhdCBhbGwKLSAqIGludGVyZXN0aW5nIGV2ZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZWFkIGZyb20gdGhlIGNvbm5lY3Rpb24uIEZvcgotICogZXhhbXBsZSwgY2FsbGVycyBtaWdodCB1c2UgeGNiX3dhaXRfZm9yX3JlcGx5IGFuZCBiZSBpbnRlcmVzdGVkCi0gKiBvbmx5IG9mIGV2ZW50cyB0aGF0IHByZWNlZGVkIGEgc3BlY2lmaWMgcmVwbHkuCi0gKi8KLXhjYl9nZW5lcmljX2V2ZW50X3QgKnhjYl9wb2xsX2Zvcl9xdWV1ZWRfZXZlbnQoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zcGVjaWFsX2V2ZW50IHhjYl9zcGVjaWFsX2V2ZW50X3Q7Ci0KLS8qKgotICogQGJyaWVmIFJldHVybnMgdGhlIG5leHQgZXZlbnQgZnJvbSBhIHNwZWNpYWwgcXVldWUKLSAqLwoteGNiX2dlbmVyaWNfZXZlbnRfdCAqeGNiX3BvbGxfZm9yX3NwZWNpYWxfZXZlbnQoeGNiX2Nvbm5lY3Rpb25fdCAqYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9zcGVjaWFsX2V2ZW50X3QgKnNlKTsKLQotLyoqCi0gKiBAYnJpZWYgUmV0dXJucyB0aGUgbmV4dCBldmVudCBmcm9tIGEgc3BlY2lhbCBxdWV1ZSwgYmxvY2tpbmcgdW50aWwgb25lIGFycml2ZXMKLSAqLwoteGNiX2dlbmVyaWNfZXZlbnRfdCAqeGNiX3dhaXRfZm9yX3NwZWNpYWxfZXZlbnQoeGNiX2Nvbm5lY3Rpb25fdCAqYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9zcGVjaWFsX2V2ZW50X3QgKnNlKTsKLS8qKgotICogQHR5cGVkZWYgdHlwZWRlZiBzdHJ1Y3QgeGNiX2V4dGVuc2lvbl90IHhjYl9leHRlbnNpb25fdAotICovCi10eXBlZGVmIHN0cnVjdCB4Y2JfZXh0ZW5zaW9uX3QgeGNiX2V4dGVuc2lvbl90OyAgLyoqPCBPcGFxdWUgc3RydWN0dXJlIHVzZWQgYXMga2V5IGZvciB4Y2JfZ2V0X2V4dGVuc2lvbl9kYXRhX3QuICovCi0KLS8qKgotICogQGJyaWVmIExpc3RlbiBmb3IgYSBzcGVjaWFsIGV2ZW50Ci0gKi8KLXhjYl9zcGVjaWFsX2V2ZW50X3QgKnhjYl9yZWdpc3Rlcl9mb3Jfc3BlY2lhbF94Z2UoeGNiX2Nvbm5lY3Rpb25fdCAqYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2V4dGVuc2lvbl90ICpleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnN0YW1wKTsKLQotLyoqCi0gKiBAYnJpZWYgU3RvcCBsaXN0ZW5pbmcgZm9yIGEgc3BlY2lhbCBldmVudAotICovCi12b2lkIHhjYl91bnJlZ2lzdGVyX2Zvcl9zcGVjaWFsX2V2ZW50KHhjYl9jb25uZWN0aW9uX3QgKmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9zcGVjaWFsX2V2ZW50X3QgKnNlKTsKLQotLyoqCi0gKiBAYnJpZWYgUmV0dXJuIHRoZSBlcnJvciBmb3IgYSByZXF1ZXN0LCBvciBOVUxMIGlmIG5vbmUgY2FuIGV2ZXIgYXJyaXZlLgotICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uIHRvIHRoZSBYIHNlcnZlci4KLSAqIEBwYXJhbSBjb29raWU6IFRoZSByZXF1ZXN0IGNvb2tpZS4KLSAqIEByZXR1cm4gVGhlIGVycm9yIGZvciB0aGUgcmVxdWVzdCwgb3IgTlVMTCBpZiBub25lIGNhbiBldmVyIGFycml2ZS4KLSAqCi0gKiBUaGUgeGNiX3ZvaWRfY29va2llX3QgY29va2llIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBoYXZlIHJlc3VsdGVkCi0gKiBmcm9tIGEgY2FsbCB0byB4Y2JfW3JlcXVlc3RfbmFtZV1fY2hlY2tlZCgpLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrCi0gKiB1bnRpbCBvbmUgb2YgdHdvIGNvbmRpdGlvbnMgaGFwcGVucy4gIElmIGFuIGVycm9yIGlzIHJlY2VpdmVkLCBpdCB3aWxsIGJlCi0gKiByZXR1cm5lZC4gIElmIGEgcmVwbHkgdG8gYSBzdWJzZXF1ZW50IHJlcXVlc3QgaGFzIGFscmVhZHkgYXJyaXZlZCwgbm8gZXJyb3IKLSAqIGNhbiBhcnJpdmUgZm9yIHRoaXMgcmVxdWVzdCwgc28gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBOVUxMLgotICoKLSAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgcGVyZm9ybSBhIHN5bmMgaWYgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IHRoZQotICogc2VxdWVuY2UgbnVtYmVyIHdpbGwgYWR2YW5jZSBiZXlvbmQgdGhhdCBwcm92aWRlZCBpbiBjb29raWU7IHRoaXMgaXMgYQotICogY29udmVuaWVuY2UgdG8gYXZvaWQgcmFjZXMgaW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgc3luYyBpcyBuZWVkZWQuCi0gKi8KLXhjYl9nZW5lcmljX2Vycm9yX3QgKnhjYl9yZXF1ZXN0X2NoZWNrKHhjYl9jb25uZWN0aW9uX3QgKmMsIHhjYl92b2lkX2Nvb2tpZV90IGNvb2tpZSk7Ci0KLS8qKgotICogQGJyaWVmIERpc2NhcmRzIHRoZSByZXBseSBmb3IgYSByZXF1ZXN0LgotICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uIHRvIHRoZSBYIHNlcnZlci4KLSAqIEBwYXJhbSBzZXF1ZW5jZTogVGhlIHJlcXVlc3Qgc2VxdWVuY2UgbnVtYmVyIGZyb20gYSBjb29raWUuCi0gKgotICogRGlzY2FyZHMgdGhlIHJlcGx5IGZvciBhIHJlcXVlc3QuIEFkZGl0aW9uYWxseSwgYW55IGVycm9yIGdlbmVyYXRlZAotICogYnkgdGhlIHJlcXVlc3QgaXMgYWxzbyBkaXNjYXJkZWQgKHVubGVzcyBpdCB3YXMgYW4gX3VuY2hlY2tlZCByZXF1ZXN0Ci0gKiBhbmQgdGhlIGVycm9yIGhhcyBhbHJlYWR5IGFycml2ZWQpLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmxvY2sgZXZlbiBpZiB0aGUgcmVwbHkgaXMgbm90IHlldCBhdmFpbGFibGUuCi0gKgotICogTm90ZSB0aGF0IHRoZSBzZXF1ZW5jZSByZWFsbHkgZG9lcyBoYXZlIHRvIGNvbWUgZnJvbSBhbiB4Y2IgY29va2llOwotICogdGhpcyBmdW5jdGlvbiBpcyBub3QgZGVzaWduZWQgdG8gb3BlcmF0ZSBvbiBzb2NrZXQtaGFuZG9mZiByZXBsaWVzLgotICovCi12b2lkIHhjYl9kaXNjYXJkX3JlcGx5KHhjYl9jb25uZWN0aW9uX3QgKmMsIHVuc2lnbmVkIGludCBzZXF1ZW5jZSk7Ci0KLQotLyogeGNiX2V4dC5jICovCi0KLS8qKgotICogQGJyaWVmIENhY2hlcyByZXBseSBpbmZvcm1hdGlvbiBmcm9tIFF1ZXJ5RXh0ZW5zaW9uIHJlcXVlc3RzLgotICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uLgotICogQHBhcmFtIGV4dDogVGhlIGV4dGVuc2lvbiBkYXRhLgotICogQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIHhjYl9xdWVyeV9leHRlbnNpb25fcmVwbHlfdCBmb3IgdGhlIGV4dGVuc2lvbi4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBwcmltYXJ5IGludGVyZmFjZSB0byB0aGUgImV4dGVuc2lvbiBjYWNoZSIsCi0gKiB3aGljaCBjYWNoZXMgcmVwbHkgaW5mb3JtYXRpb24gZnJvbSBRdWVyeUV4dGVuc2lvbgotICogcmVxdWVzdHMuIEludm9raW5nIHRoaXMgZnVuY3Rpb24gbWF5IGNhdXNlIGEgY2FsbCB0bwotICogeGNiX3F1ZXJ5X2V4dGVuc2lvbiB0byByZXRyaWV2ZSBleHRlbnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUKLSAqIHNlcnZlciwgYW5kIG1heSBibG9jayB1bnRpbCBleHRlbnNpb24gZGF0YSBpcyByZWNlaXZlZCBmcm9tIHRoZQotICogc2VydmVyLgotICoKLSAqIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgZnJlZWQuIFRoaXMgc3RvcmFnZSBpcyBtYW5hZ2VkIGJ5IHRoZSBjYWNoZQotICogaXRzZWxmLgotICovCi1jb25zdCBzdHJ1Y3QgeGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXBseV90ICp4Y2JfZ2V0X2V4dGVuc2lvbl9kYXRhKHhjYl9jb25uZWN0aW9uX3QgKmMsIHhjYl9leHRlbnNpb25fdCAqZXh0KTsKLQotLyoqCi0gKiBAYnJpZWYgUHJlZmV0Y2ggb2YgZXh0ZW5zaW9uIGRhdGEgaW50byB0aGUgZXh0ZW5zaW9uIGNhY2hlCi0gKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24uCi0gKiBAcGFyYW0gZXh0OiBUaGUgZXh0ZW5zaW9uIGRhdGEuCi0gKgotICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSAicHJlZmV0Y2giIG9mIGV4dGVuc2lvbiBkYXRhIGludG8gdGhlCi0gKiBleHRlbnNpb24gY2FjaGUuIEludm9raW5nIHRoZSBmdW5jdGlvbiBtYXkgY2F1c2UgYSBjYWxsIHRvCi0gKiB4Y2JfcXVlcnlfZXh0ZW5zaW9uLCBidXQgd2lsbCBub3QgYmxvY2sgd2FpdGluZyBmb3IgdGhlCi0gKiByZXBseS4geGNiX2dldF9leHRlbnNpb25fZGF0YSB3aWxsIHJldHVybiB0aGUgcHJlZmV0Y2hlZCBkYXRhIGFmdGVyCi0gKiBwb3NzaWJseSBibG9ja2luZyB3aGlsZSBpdCBpcyByZXRyaWV2ZWQuCi0gKi8KLXZvaWQgeGNiX3ByZWZldGNoX2V4dGVuc2lvbl9kYXRhKHhjYl9jb25uZWN0aW9uX3QgKmMsIHhjYl9leHRlbnNpb25fdCAqZXh0KTsKLQotCi0vKiB4Y2JfY29ubi5jICovCi0KLS8qKgotICogQGJyaWVmIEFjY2VzcyB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgc2VydmVyLgotICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uLgotICogQHJldHVybiBBIHBvaW50ZXIgdG8gYW4geGNiX3NldHVwX3Qgc3RydWN0dXJlLgotICoKLSAqIEFjY2Vzc29yIGZvciB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgc2VydmVyIHdoZW4gdGhlIHhjYl9jb25uZWN0aW9uX3QKLSAqIHdhcyBpbml0aWFsaXplZC4gVGhpcyBkYXRhIGluY2x1ZGVzCi0gKiAtIHRoZSBzZXJ2ZXIncyByZXF1aXJlZCBmb3JtYXQgZm9yIGltYWdlcywKLSAqIC0gYSBsaXN0IG9mIGF2YWlsYWJsZSB2aXN1YWxzLAotICogLSBhIGxpc3Qgb2YgYXZhaWxhYmxlIHNjcmVlbnMsCi0gKiAtIHRoZSBzZXJ2ZXIncyBtYXhpbXVtIHJlcXVlc3QgbGVuZ3RoIChpbiB0aGUgYWJzZW5jZSBvZiB0aGUKLSAqIEJJRy1SRVFVRVNUUyBleHRlbnNpb24pLAotICogLSBhbmQgb3RoZXIgYXNzb3J0ZWQgaW5mb3JtYXRpb24uCi0gKgotICogU2VlIHRoZSBYIHByb3RvY29sIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkLgotICovCi1jb25zdCBzdHJ1Y3QgeGNiX3NldHVwX3QgKnhjYl9nZXRfc2V0dXAoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7Ci0KLS8qKgotICogQGJyaWVmIEFjY2VzcyB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBjb25uZWN0aW9uLgotICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uLgotICogQHJldHVybiBUaGUgZmlsZSBkZXNjcmlwdG9yLgotICoKLSAqIEFjY2Vzc29yIGZvciB0aGUgZmlsZSBkZXNjcmlwdG9yIHRoYXQgd2FzIHBhc3NlZCB0byB0aGUKLSAqIHhjYl9jb25uZWN0X3RvX2ZkIGNhbGwgdGhhdCByZXR1cm5lZCBAcCBjLgotICovCi1pbnQgeGNiX2dldF9maWxlX2Rlc2NyaXB0b3IoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7Ci0KLS8qKgotICogQGJyaWVmIFRlc3Qgd2hldGhlciB0aGUgY29ubmVjdGlvbiBoYXMgc2h1dCBkb3duIGR1ZSB0byBhIGZhdGFsIGVycm9yLgotICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uLgotICogQHJldHVybiA+IDAgaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW4gYW4gZXJyb3Igc3RhdGU7IDAgb3RoZXJ3aXNlLgotICoKLSAqIFNvbWUgZXJyb3JzIHRoYXQgb2NjdXIgaW4gdGhlIGNvbnRleHQgb2YgYW4geGNiX2Nvbm5lY3Rpb25fdAotICogYXJlIHVucmVjb3ZlcmFibGUuIFdoZW4gc3VjaCBhbiBlcnJvciBvY2N1cnMsIHRoZQotICogY29ubmVjdGlvbiBpcyBzaHV0IGRvd24gYW5kIGZ1cnRoZXIgb3BlcmF0aW9ucyBvbiB0aGUKLSAqIHhjYl9jb25uZWN0aW9uX3QgaGF2ZSBubyBlZmZlY3QsIGJ1dCBtZW1vcnkgd2lsbCBub3QgYmUgZnJlZWQgdW50aWwKLSAqIHhjYl9kaXNjb25uZWN0KCkgaXMgY2FsbGVkIG9uIHRoZSB4Y2JfY29ubmVjdGlvbl90LgotICoKLSAqIEByZXR1cm4gWENCX0NPTk5fRVJST1IsIGJlY2F1c2Ugb2Ygc29ja2V0IGVycm9ycywgcGlwZSBlcnJvcnMgb3Igb3RoZXIgc3RyZWFtIGVycm9ycy4KLSAqIEByZXR1cm4gWENCX0NPTk5fQ0xPU0VEX0VYVF9OT1RTVVBQT1JURUQsIHdoZW4gZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuCi0gKiBAcmV0dXJuIFhDQl9DT05OX0NMT1NFRF9NRU1fSU5TVUZGSUNJRU5ULCB3aGVuIG1lbW9yeSBub3QgYXZhaWxhYmxlLgotICogQHJldHVybiBYQ0JfQ09OTl9DTE9TRURfUkVRX0xFTl9FWENFRUQsIGV4Y2VlZGluZyByZXF1ZXN0IGxlbmd0aCB0aGF0IHNlcnZlciBhY2NlcHRzLgotICogQHJldHVybiBYQ0JfQ09OTl9DTE9TRURfUEFSU0VfRVJSLCBlcnJvciBkdXJpbmcgcGFyc2luZyBkaXNwbGF5IHN0cmluZy4KLSAqIEByZXR1cm4gWENCX0NPTk5fQ0xPU0VEX0lOVkFMSURfU0NSRUVOLCBiZWNhdXNlIHRoZSBzZXJ2ZXIgZG9lcyBub3QgaGF2ZSBhIHNjcmVlbiBtYXRjaGluZyB0aGUgZGlzcGxheS4KLSAqLwotaW50IHhjYl9jb25uZWN0aW9uX2hhc19lcnJvcih4Y2JfY29ubmVjdGlvbl90ICpjKTsKLQotLyoqCi0gKiBAYnJpZWYgQ29ubmVjdHMgdG8gdGhlIFggc2VydmVyLgotICogQHBhcmFtIGZkOiBUaGUgZmlsZSBkZXNjcmlwdG9yLgotICogQHBhcmFtIGF1dGhfaW5mbzogQXV0aGVudGljYXRpb24gZGF0YS4KLSAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgeGNiX2Nvbm5lY3Rpb25fdCBzdHJ1Y3R1cmUuCi0gKgotICogQ29ubmVjdHMgdG8gYW4gWCBzZXJ2ZXIsIGdpdmVuIHRoZSBvcGVuIHNvY2tldCBAcCBmZCBhbmQgdGhlCi0gKiB4Y2JfYXV0aF9pbmZvX3QgQHAgYXV0aF9pbmZvLiBUaGUgZmlsZSBkZXNjcmlwdG9yIEBwIGZkIGlzCi0gKiBiaWRpcmVjdGlvbmFsbHkgY29ubmVjdGVkIHRvIGFuIFggc2VydmVyLiBJZiB0aGUgY29ubmVjdGlvbgotICogc2hvdWxkIGJlIHVuYXV0aGVudGljYXRlZCwgQHAgYXV0aF9pbmZvIG11c3QgYmUgQGMKLSAqIE5VTEwuCi0gKgotICogQWx3YXlzIHJldHVybnMgYSBub24tTlVMTCBwb2ludGVyIHRvIGEgeGNiX2Nvbm5lY3Rpb25fdCwgZXZlbiBvbiBmYWlsdXJlLgotICogQ2FsbGVycyBuZWVkIHRvIHVzZSB4Y2JfY29ubmVjdGlvbl9oYXNfZXJyb3IoKSB0byBjaGVjayBmb3IgZmFpbHVyZS4KLSAqIFdoZW4gZmluaXNoZWQsIHVzZSB4Y2JfZGlzY29ubmVjdCgpIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCBmcmVlCi0gKiB0aGUgc3RydWN0dXJlLgotICovCi14Y2JfY29ubmVjdGlvbl90ICp4Y2JfY29ubmVjdF90b19mZChpbnQgZmQsIHhjYl9hdXRoX2luZm9fdCAqYXV0aF9pbmZvKTsKLQotLyoqCi0gKiBAYnJpZWYgQ2xvc2VzIHRoZSBjb25uZWN0aW9uLgotICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uLgotICoKLSAqIENsb3NlcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGFuZCBmcmVlcyBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAqIGNvbm5lY3Rpb24gQGMgYy4gSWYgQHAgYyBpcyBAYyBOVUxMLCBub3RoaW5nIGlzIGRvbmUuCi0gKi8KLXZvaWQgeGNiX2Rpc2Nvbm5lY3QoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7Ci0KLQotLyogeGNiX3V0aWwuYyAqLwotCi0vKioKLSAqIEBicmllZiBQYXJzZXMgYSBkaXNwbGF5IHN0cmluZyBuYW1lIGluIHRoZSBmb3JtIGRvY3VtZW50ZWQgYnkgWCg3eCkuCi0gKiBAcGFyYW0gbmFtZTogVGhlIG5hbWUgb2YgdGhlIGRpc3BsYXkuCi0gKiBAcGFyYW0gaG9zdDogQSBwb2ludGVyIHRvIGEgbWFsbG9jJ2QgY29weSBvZiB0aGUgaG9zdG5hbWUuCi0gKiBAcGFyYW0gZGlzcGxheTogQSBwb2ludGVyIHRvIHRoZSBkaXNwbGF5IG51bWJlci4KLSAqIEBwYXJhbSBzY3JlZW46IEEgcG9pbnRlciB0byB0aGUgc2NyZWVuIG51bWJlci4KLSAqIEByZXR1cm4gMCBvbiBmYWlsdXJlLCBub24gMCBvdGhlcndpc2UuCi0gKgotICogUGFyc2VzIHRoZSBkaXNwbGF5IHN0cmluZyBuYW1lIEBwIGRpc3BsYXlfbmFtZSBpbiB0aGUgZm9ybQotICogZG9jdW1lbnRlZCBieSBYKDd4KS4gSGFzIG5vIHNpZGUgZWZmZWN0cyBvbiBmYWlsdXJlLiBJZgotICogQHAgZGlzcGxheW5hbWUgaXMgQGMgTlVMTCBvciBlbXB0eSwgaXQgdXNlcyB0aGUgZW52aXJvbm1lbnQKLSAqIHZhcmlhYmxlIERJU1BMQVkuIEBwIGhvc3RwIGlzIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBzdHJpbmcKLSAqIHRoYXQgY29udGFpbiB0aGUgaG9zdCBuYW1lLiBAcCBkaXNwbGF5cCBpcyBzZXQgdG8gdGhlIGRpc3BsYXkKLSAqIG51bWJlciBhbmQgQHAgc2NyZWVucCB0byB0aGUgcHJlZmVycmVkIHNjcmVlbiBudW1iZXIuIEBwIHNjcmVlbnAKLSAqIGNhbiBiZSBAYyBOVUxMLiBJZiBAcCBkaXNwbGF5bmFtZSBkb2VzIG5vdCBjb250YWluIGEgc2NyZWVuIG51bWJlciwKLSAqIGl0IGlzIHNldCB0byBAYyAwLgotICovCi1pbnQgeGNiX3BhcnNlX2Rpc3BsYXkoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqKmhvc3QsIGludCAqZGlzcGxheSwgaW50ICpzY3JlZW4pOwotCi0vKioKLSAqIEBicmllZiBDb25uZWN0cyB0byB0aGUgWCBzZXJ2ZXIuCi0gKiBAcGFyYW0gZGlzcGxheW5hbWU6IFRoZSBuYW1lIG9mIHRoZSBkaXNwbGF5LgotICogQHBhcmFtIHNjcmVlbnA6IEEgcG9pbnRlciB0byBhIHByZWZlcnJlZCBzY3JlZW4gbnVtYmVyLgotICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCB4Y2JfY29ubmVjdGlvbl90IHN0cnVjdHVyZS4KLSAqCi0gKiBDb25uZWN0cyB0byB0aGUgWCBzZXJ2ZXIgc3BlY2lmaWVkIGJ5IEBwIGRpc3BsYXluYW1lLiBJZiBAcAotICogZGlzcGxheW5hbWUgaXMgQGMgTlVMTCwgdXNlcyB0aGUgdmFsdWUgb2YgdGhlIERJU1BMQVkgZW52aXJvbm1lbnQKLSAqIHZhcmlhYmxlLiBJZiBhIHBhcnRpY3VsYXIgc2NyZWVuIG9uIHRoYXQgc2VydmVyIGlzIHByZWZlcnJlZCwgdGhlCi0gKiBpbnQgcG9pbnRlZCB0byBieSBAcCBzY3JlZW5wIChpZiBub3QgQGMgTlVMTCkgd2lsbCBiZSBzZXQgdG8gdGhhdAotICogc2NyZWVuOyBvdGhlcndpc2UgdGhlIHNjcmVlbiB3aWxsIGJlIHNldCB0byAwLgotICoKLSAqIEFsd2F5cyByZXR1cm5zIGEgbm9uLU5VTEwgcG9pbnRlciB0byBhIHhjYl9jb25uZWN0aW9uX3QsIGV2ZW4gb24gZmFpbHVyZS4KLSAqIENhbGxlcnMgbmVlZCB0byB1c2UgeGNiX2Nvbm5lY3Rpb25faGFzX2Vycm9yKCkgdG8gY2hlY2sgZm9yIGZhaWx1cmUuCi0gKiBXaGVuIGZpbmlzaGVkLCB1c2UgeGNiX2Rpc2Nvbm5lY3QoKSB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgZnJlZQotICogdGhlIHN0cnVjdHVyZS4KLSAqLwoteGNiX2Nvbm5lY3Rpb25fdCAqeGNiX2Nvbm5lY3QoY29uc3QgY2hhciAqZGlzcGxheW5hbWUsIGludCAqc2NyZWVucCk7Ci0KLS8qKgotICogQGJyaWVmIENvbm5lY3RzIHRvIHRoZSBYIHNlcnZlciwgdXNpbmcgYW4gYXV0aG9yaXphdGlvbiBpbmZvcm1hdGlvbi4KLSAqIEBwYXJhbSBkaXNwbGF5OiBUaGUgbmFtZSBvZiB0aGUgZGlzcGxheS4KLSAqIEBwYXJhbSBhdXRoOiBUaGUgYXV0aG9yaXphdGlvbiBpbmZvcm1hdGlvbi4KLSAqIEBwYXJhbSBzY3JlZW46IEEgcG9pbnRlciB0byBhIHByZWZlcnJlZCBzY3JlZW4gbnVtYmVyLgotICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCB4Y2JfY29ubmVjdGlvbl90IHN0cnVjdHVyZS4KLSAqCi0gKiBDb25uZWN0cyB0byB0aGUgWCBzZXJ2ZXIgc3BlY2lmaWVkIGJ5IEBwIGRpc3BsYXluYW1lLCB1c2luZyB0aGUKLSAqIGF1dGhvcml6YXRpb24gQHAgYXV0aC4gSWYgYSBwYXJ0aWN1bGFyIHNjcmVlbiBvbiB0aGF0IHNlcnZlciBpcwotICogcHJlZmVycmVkLCB0aGUgaW50IHBvaW50ZWQgdG8gYnkgQHAgc2NyZWVucCAoaWYgbm90IEBjIE5VTEwpIHdpbGwKLSAqIGJlIHNldCB0byB0aGF0IHNjcmVlbjsgb3RoZXJ3aXNlIEBwIHNjcmVlbnAgd2lsbCBiZSBzZXQgdG8gMC4KLSAqCi0gKiBBbHdheXMgcmV0dXJucyBhIG5vbi1OVUxMIHBvaW50ZXIgdG8gYSB4Y2JfY29ubmVjdGlvbl90LCBldmVuIG9uIGZhaWx1cmUuCi0gKiBDYWxsZXJzIG5lZWQgdG8gdXNlIHhjYl9jb25uZWN0aW9uX2hhc19lcnJvcigpIHRvIGNoZWNrIGZvciBmYWlsdXJlLgotICogV2hlbiBmaW5pc2hlZCwgdXNlIHhjYl9kaXNjb25uZWN0KCkgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIGZyZWUKLSAqIHRoZSBzdHJ1Y3R1cmUuCi0gKi8KLXhjYl9jb25uZWN0aW9uX3QgKnhjYl9jb25uZWN0X3RvX2Rpc3BsYXlfd2l0aF9hdXRoX2luZm8oY29uc3QgY2hhciAqZGlzcGxheSwgeGNiX2F1dGhfaW5mb190ICphdXRoLCBpbnQgKnNjcmVlbik7Ci0KLQotLyogeGNiX3hpZC5jICovCi0KLS8qKgotICogQGJyaWVmIEFsbG9jYXRlcyBhbiBYSUQgZm9yIGEgbmV3IG9iamVjdC4KLSAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbi4KLSAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgWElELgotICoKLSAqIEFsbG9jYXRlcyBhbiBYSUQgZm9yIGEgbmV3IG9iamVjdC4gVHlwaWNhbGx5IHVzZWQganVzdCBwcmlvciB0bwotICogdmFyaW91cyBvYmplY3QgY3JlYXRpb24gZnVuY3Rpb25zLCBzdWNoIGFzIHhjYl9jcmVhdGVfd2luZG93LgotICovCi11aW50MzJfdCB4Y2JfZ2VuZXJhdGVfaWQoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7Ci0KLQotLyoqCi0gKiBAfQotICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qIF9fWENCX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9YQ0IveGNiX3dpbmRlZnMuaCBiL2luY2x1ZGUvWENCL3hjYl93aW5kZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNWM0YjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9YQ0IveGNiX3dpbmRlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwOSBKYXRpbiBHb2xhbmkuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLSAqIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqIAotICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG9yIHRoZWlyCi0gKiBpbnN0aXR1dGlvbnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlCi0gKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgYXV0aG9ycy4KLSAqLwotCi0KLSNpZm5kZWYgX1hDQl9XSU5ERUZTX0gKLSNkZWZpbmUgX1hDQl9XSU5ERUZTX0gKLQotI2lmbmRlZiBXSU5WRVIKLSNkZWZpbmUgV0lOVkVSIDB4MDUwMSAvKiByZXF1aXJlZCBmb3IgZ2V0YWRkcmluZm8vZnJlZWFkZHJpbmZvIGRlZmluZWQgb25seSBmb3IgV2luWFAgYW5kIGFib3ZlICovCi0jZW5kaWYKLQotI2RlZmluZSBWQ19FWFRSQUxFQU4KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotI2luY2x1ZGUgPHdzMnRjcGlwLmg+Ci0jaW5jbHVkZSA8d2luZGVmLmg+Ci0KLXN0cnVjdCBpb3ZlYyAgewotICAgIHZvaWQgKmlvdl9iYXNlOyAgICAvKiBQb2ludGVyIHRvIGRhdGEuICAqLwotICAgIGludCBpb3ZfbGVuOyAgICAgICAvKiBMZW5ndGggb2YgZGF0YS4gICovCi19OwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBpbl9hZGRyX3Q7Ci0KLSNlbmRpZiAvKiB4Y2Jfd2luZGVmcy5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL1hDQi94cHJvdG8uaCBiL2luY2x1ZGUvWENCL3hwcm90by5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWZiOTU4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvWENCL3hwcm90by5oCisrKyAvZGV2L251bGwKQEAgLTEsNTc4MyArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20geHByb3RvLnhtbCBieSBjX2NsaWVudC5weS4KLSAqIEVkaXQgYXQgeW91ciBwZXJpbC4KLSAqLwotCi0jaWZuZGVmIF9fWFBST1RPX0gKLSNkZWZpbmUgX19YUFJPVE9fSAotCi0jaW5jbHVkZSAieGNiLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYXIyYl90IHsKLSAgICB1aW50OF90IGJ5dGUxOyAKLSAgICB1aW50OF90IGJ5dGUyOyAKLX0geGNiX2NoYXIyYl90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfY2hhcjJiX2l0ZXJhdG9yX3QgewotICAgIHhjYl9jaGFyMmJfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgaW5kZXg7IAotfSB4Y2JfY2hhcjJiX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX3dpbmRvd190OwotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfd2luZG93X2l0ZXJhdG9yX3QgewotICAgIHhjYl93aW5kb3dfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgaW5kZXg7IAotfSB4Y2Jfd2luZG93X2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX3BpeG1hcF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcGl4bWFwX2l0ZXJhdG9yX3QgewotICAgIHhjYl9waXhtYXBfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgaW5kZXg7IAotfSB4Y2JfcGl4bWFwX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX2N1cnNvcl90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfY3Vyc29yX2l0ZXJhdG9yX3QgewotICAgIHhjYl9jdXJzb3JfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgaW5kZXg7IAotfSB4Y2JfY3Vyc29yX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX2ZvbnRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2ZvbnRfaXRlcmF0b3JfdCB7Ci0gICAgeGNiX2ZvbnRfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgcmVtOyAKLSAgICBpbnQgICAgICAgICBpbmRleDsgCi19IHhjYl9mb250X2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX2djb250ZXh0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9nY29udGV4dF9pdGVyYXRvcl90IHsKLSAgICB4Y2JfZ2NvbnRleHRfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICAgIHJlbTsgCi0gICAgaW50ICAgICAgICAgICAgIGluZGV4OyAKLX0geGNiX2djb250ZXh0X2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX2NvbG9ybWFwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9jb2xvcm1hcF9pdGVyYXRvcl90IHsKLSAgICB4Y2JfY29sb3JtYXBfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICAgIHJlbTsgCi0gICAgaW50ICAgICAgICAgICAgIGluZGV4OyAKLX0geGNiX2NvbG9ybWFwX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX2F0b21fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2F0b21faXRlcmF0b3JfdCB7Ci0gICAgeGNiX2F0b21fdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgcmVtOyAKLSAgICBpbnQgICAgICAgICBpbmRleDsgCi19IHhjYl9hdG9tX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX2RyYXdhYmxlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9kcmF3YWJsZV9pdGVyYXRvcl90IHsKLSAgICB4Y2JfZHJhd2FibGVfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICAgIHJlbTsgCi0gICAgaW50ICAgICAgICAgICAgIGluZGV4OyAKLX0geGNiX2RyYXdhYmxlX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX2ZvbnRhYmxlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9mb250YWJsZV9pdGVyYXRvcl90IHsKLSAgICB4Y2JfZm9udGFibGVfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICAgIHJlbTsgCi0gICAgaW50ICAgICAgICAgICAgIGluZGV4OyAKLX0geGNiX2ZvbnRhYmxlX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX3Zpc3VhbGlkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl92aXN1YWxpZF9pdGVyYXRvcl90IHsKLSAgICB4Y2JfdmlzdWFsaWRfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICAgIHJlbTsgCi0gICAgaW50ICAgICAgICAgICAgIGluZGV4OyAKLX0geGNiX3Zpc3VhbGlkX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX3RpbWVzdGFtcF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfdGltZXN0YW1wX2l0ZXJhdG9yX3QgewotICAgIHhjYl90aW1lc3RhbXBfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgICAgaW5kZXg7IAotfSB4Y2JfdGltZXN0YW1wX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDMyX3QgeGNiX2tleXN5bV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfa2V5c3ltX2l0ZXJhdG9yX3QgewotICAgIHhjYl9rZXlzeW1fdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgaW5kZXg7IAotfSB4Y2Jfa2V5c3ltX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgdWludDhfdCB4Y2Jfa2V5Y29kZV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfa2V5Y29kZV9pdGVyYXRvcl90IHsKLSAgICB4Y2Jfa2V5Y29kZV90ICpkYXRhOyAKLSAgICBpbnQgICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgIGluZGV4OyAKLX0geGNiX2tleWNvZGVfaXRlcmF0b3JfdDsKLQotdHlwZWRlZiB1aW50OF90IHhjYl9idXR0b25fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2J1dHRvbl9pdGVyYXRvcl90IHsKLSAgICB4Y2JfYnV0dG9uX3QgKmRhdGE7IAotICAgIGludCAgICAgICAgICAgcmVtOyAKLSAgICBpbnQgICAgICAgICAgIGluZGV4OyAKLX0geGNiX2J1dHRvbl9pdGVyYXRvcl90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcG9pbnRfdCB7Ci0gICAgaW50MTZfdCB4OyAKLSAgICBpbnQxNl90IHk7IAotfSB4Y2JfcG9pbnRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3BvaW50X2l0ZXJhdG9yX3QgewotICAgIHhjYl9wb2ludF90ICpkYXRhOyAKLSAgICBpbnQgICAgICAgICAgcmVtOyAKLSAgICBpbnQgICAgICAgICAgaW5kZXg7IAotfSB4Y2JfcG9pbnRfaXRlcmF0b3JfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3JlY3RhbmdsZV90IHsKLSAgICBpbnQxNl90ICB4OyAKLSAgICBpbnQxNl90ICB5OyAKLSAgICB1aW50MTZfdCB3aWR0aDsgCi0gICAgdWludDE2X3QgaGVpZ2h0OyAKLX0geGNiX3JlY3RhbmdsZV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcmVjdGFuZ2xlX2l0ZXJhdG9yX3QgewotICAgIHhjYl9yZWN0YW5nbGVfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgICAgaW5kZXg7IAotfSB4Y2JfcmVjdGFuZ2xlX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9hcmNfdCB7Ci0gICAgaW50MTZfdCAgeDsgCi0gICAgaW50MTZfdCAgeTsgCi0gICAgdWludDE2X3Qgd2lkdGg7IAotICAgIHVpbnQxNl90IGhlaWdodDsgCi0gICAgaW50MTZfdCAgYW5nbGUxOyAKLSAgICBpbnQxNl90ICBhbmdsZTI7IAotfSB4Y2JfYXJjX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9hcmNfaXRlcmF0b3JfdCB7Ci0gICAgeGNiX2FyY190ICpkYXRhOyAKLSAgICBpbnQgICAgICAgIHJlbTsgCi0gICAgaW50ICAgICAgICBpbmRleDsgCi19IHhjYl9hcmNfaXRlcmF0b3JfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2Zvcm1hdF90IHsKLSAgICB1aW50OF90IGRlcHRoOyAKLSAgICB1aW50OF90IGJpdHNfcGVyX3BpeGVsOyAKLSAgICB1aW50OF90IHNjYW5saW5lX3BhZDsgCi0gICAgdWludDhfdCBwYWQwWzVdOyAKLX0geGNiX2Zvcm1hdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZm9ybWF0X2l0ZXJhdG9yX3QgewotICAgIHhjYl9mb3JtYXRfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgaW5kZXg7IAotfSB4Y2JfZm9ybWF0X2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfdmlzdWFsX2NsYXNzX3QgewotICAgIFhDQl9WSVNVQUxfQ0xBU1NfU1RBVElDX0dSQVkgPSAwLAotICAgIFhDQl9WSVNVQUxfQ0xBU1NfR1JBWV9TQ0FMRSA9IDEsCi0gICAgWENCX1ZJU1VBTF9DTEFTU19TVEFUSUNfQ09MT1IgPSAyLAotICAgIFhDQl9WSVNVQUxfQ0xBU1NfUFNFVURPX0NPTE9SID0gMywKLSAgICBYQ0JfVklTVUFMX0NMQVNTX1RSVUVfQ09MT1IgPSA0LAotICAgIFhDQl9WSVNVQUxfQ0xBU1NfRElSRUNUX0NPTE9SID0gNQotfSB4Y2JfdmlzdWFsX2NsYXNzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl92aXN1YWx0eXBlX3QgewotICAgIHhjYl92aXN1YWxpZF90IHZpc3VhbF9pZDsgCi0gICAgdWludDhfdCAgICAgICAgX2NsYXNzOyAKLSAgICB1aW50OF90ICAgICAgICBiaXRzX3Blcl9yZ2JfdmFsdWU7IAotICAgIHVpbnQxNl90ICAgICAgIGNvbG9ybWFwX2VudHJpZXM7IAotICAgIHVpbnQzMl90ICAgICAgIHJlZF9tYXNrOyAKLSAgICB1aW50MzJfdCAgICAgICBncmVlbl9tYXNrOyAKLSAgICB1aW50MzJfdCAgICAgICBibHVlX21hc2s7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDBbNF07IAotfSB4Y2JfdmlzdWFsdHlwZV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfdmlzdWFsdHlwZV9pdGVyYXRvcl90IHsKLSAgICB4Y2JfdmlzdWFsdHlwZV90ICpkYXRhOyAKLSAgICBpbnQgICAgICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgICAgIGluZGV4OyAKLX0geGNiX3Zpc3VhbHR5cGVfaXRlcmF0b3JfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2RlcHRoX3QgewotICAgIHVpbnQ4X3QgIGRlcHRoOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCB2aXN1YWxzX2xlbjsgCi0gICAgdWludDhfdCAgcGFkMVs0XTsgCi19IHhjYl9kZXB0aF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZGVwdGhfaXRlcmF0b3JfdCB7Ci0gICAgeGNiX2RlcHRoX3QgKmRhdGE7IAotICAgIGludCAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICBpbmRleDsgCi19IHhjYl9kZXB0aF9pdGVyYXRvcl90OwotCi10eXBlZGVmIGVudW0geGNiX2V2ZW50X21hc2tfdCB7Ci0gICAgWENCX0VWRU5UX01BU0tfTk9fRVZFTlQgPSAwLAotICAgIFhDQl9FVkVOVF9NQVNLX0tFWV9QUkVTUyA9IDEsCi0gICAgWENCX0VWRU5UX01BU0tfS0VZX1JFTEVBU0UgPSAyLAotICAgIFhDQl9FVkVOVF9NQVNLX0JVVFRPTl9QUkVTUyA9IDQsCi0gICAgWENCX0VWRU5UX01BU0tfQlVUVE9OX1JFTEVBU0UgPSA4LAotICAgIFhDQl9FVkVOVF9NQVNLX0VOVEVSX1dJTkRPVyA9IDE2LAotICAgIFhDQl9FVkVOVF9NQVNLX0xFQVZFX1dJTkRPVyA9IDMyLAotICAgIFhDQl9FVkVOVF9NQVNLX1BPSU5URVJfTU9USU9OID0gNjQsCi0gICAgWENCX0VWRU5UX01BU0tfUE9JTlRFUl9NT1RJT05fSElOVCA9IDEyOCwKLSAgICBYQ0JfRVZFTlRfTUFTS19CVVRUT05fMV9NT1RJT04gPSAyNTYsCi0gICAgWENCX0VWRU5UX01BU0tfQlVUVE9OXzJfTU9USU9OID0gNTEyLAotICAgIFhDQl9FVkVOVF9NQVNLX0JVVFRPTl8zX01PVElPTiA9IDEwMjQsCi0gICAgWENCX0VWRU5UX01BU0tfQlVUVE9OXzRfTU9USU9OID0gMjA0OCwKLSAgICBYQ0JfRVZFTlRfTUFTS19CVVRUT05fNV9NT1RJT04gPSA0MDk2LAotICAgIFhDQl9FVkVOVF9NQVNLX0JVVFRPTl9NT1RJT04gPSA4MTkyLAotICAgIFhDQl9FVkVOVF9NQVNLX0tFWU1BUF9TVEFURSA9IDE2Mzg0LAotICAgIFhDQl9FVkVOVF9NQVNLX0VYUE9TVVJFID0gMzI3NjgsCi0gICAgWENCX0VWRU5UX01BU0tfVklTSUJJTElUWV9DSEFOR0UgPSA2NTUzNiwKLSAgICBYQ0JfRVZFTlRfTUFTS19TVFJVQ1RVUkVfTk9USUZZID0gMTMxMDcyLAotICAgIFhDQl9FVkVOVF9NQVNLX1JFU0laRV9SRURJUkVDVCA9IDI2MjE0NCwKLSAgICBYQ0JfRVZFTlRfTUFTS19TVUJTVFJVQ1RVUkVfTk9USUZZID0gNTI0Mjg4LAotICAgIFhDQl9FVkVOVF9NQVNLX1NVQlNUUlVDVFVSRV9SRURJUkVDVCA9IDEwNDg1NzYsCi0gICAgWENCX0VWRU5UX01BU0tfRk9DVVNfQ0hBTkdFID0gMjA5NzE1MiwKLSAgICBYQ0JfRVZFTlRfTUFTS19QUk9QRVJUWV9DSEFOR0UgPSA0MTk0MzA0LAotICAgIFhDQl9FVkVOVF9NQVNLX0NPTE9SX01BUF9DSEFOR0UgPSA4Mzg4NjA4LAotICAgIFhDQl9FVkVOVF9NQVNLX09XTkVSX0dSQUJfQlVUVE9OID0gMTY3NzcyMTYKLX0geGNiX2V2ZW50X21hc2tfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9iYWNraW5nX3N0b3JlX3QgewotICAgIFhDQl9CQUNLSU5HX1NUT1JFX05PVF9VU0VGVUwgPSAwLAotICAgIFhDQl9CQUNLSU5HX1NUT1JFX1dIRU5fTUFQUEVEID0gMSwKLSAgICBYQ0JfQkFDS0lOR19TVE9SRV9BTFdBWVMgPSAyCi19IHhjYl9iYWNraW5nX3N0b3JlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zY3JlZW5fdCB7Ci0gICAgeGNiX3dpbmRvd190ICAgcm9vdDsgCi0gICAgeGNiX2NvbG9ybWFwX3QgZGVmYXVsdF9jb2xvcm1hcDsgCi0gICAgdWludDMyX3QgICAgICAgd2hpdGVfcGl4ZWw7IAotICAgIHVpbnQzMl90ICAgICAgIGJsYWNrX3BpeGVsOyAKLSAgICB1aW50MzJfdCAgICAgICBjdXJyZW50X2lucHV0X21hc2tzOyAKLSAgICB1aW50MTZfdCAgICAgICB3aWR0aF9pbl9waXhlbHM7IAotICAgIHVpbnQxNl90ICAgICAgIGhlaWdodF9pbl9waXhlbHM7IAotICAgIHVpbnQxNl90ICAgICAgIHdpZHRoX2luX21pbGxpbWV0ZXJzOyAKLSAgICB1aW50MTZfdCAgICAgICBoZWlnaHRfaW5fbWlsbGltZXRlcnM7IAotICAgIHVpbnQxNl90ICAgICAgIG1pbl9pbnN0YWxsZWRfbWFwczsgCi0gICAgdWludDE2X3QgICAgICAgbWF4X2luc3RhbGxlZF9tYXBzOyAKLSAgICB4Y2JfdmlzdWFsaWRfdCByb290X3Zpc3VhbDsgCi0gICAgdWludDhfdCAgICAgICAgYmFja2luZ19zdG9yZXM7IAotICAgIHVpbnQ4X3QgICAgICAgIHNhdmVfdW5kZXJzOyAKLSAgICB1aW50OF90ICAgICAgICByb290X2RlcHRoOyAKLSAgICB1aW50OF90ICAgICAgICBhbGxvd2VkX2RlcHRoc19sZW47IAotfSB4Y2Jfc2NyZWVuX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zY3JlZW5faXRlcmF0b3JfdCB7Ci0gICAgeGNiX3NjcmVlbl90ICpkYXRhOyAKLSAgICBpbnQgICAgICAgICAgIHJlbTsgCi0gICAgaW50ICAgICAgICAgICBpbmRleDsgCi19IHhjYl9zY3JlZW5faXRlcmF0b3JfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3NldHVwX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgYnl0ZV9vcmRlcjsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3QgcHJvdG9jb2xfbWFqb3JfdmVyc2lvbjsgCi0gICAgdWludDE2X3QgcHJvdG9jb2xfbWlub3JfdmVyc2lvbjsgCi0gICAgdWludDE2X3QgYXV0aG9yaXphdGlvbl9wcm90b2NvbF9uYW1lX2xlbjsgCi0gICAgdWludDE2X3QgYXV0aG9yaXphdGlvbl9wcm90b2NvbF9kYXRhX2xlbjsgCi0gICAgdWludDhfdCAgcGFkMVsyXTsgCi19IHhjYl9zZXR1cF9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zZXR1cF9yZXF1ZXN0X2l0ZXJhdG9yX3QgewotICAgIHhjYl9zZXR1cF9yZXF1ZXN0X3QgKmRhdGE7IAotICAgIGludCAgICAgICAgICAgICAgICAgIHJlbTsgCi0gICAgaW50ICAgICAgICAgICAgICAgICAgaW5kZXg7IAotfSB4Y2Jfc2V0dXBfcmVxdWVzdF9pdGVyYXRvcl90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0dXBfZmFpbGVkX3QgewotICAgIHVpbnQ4X3QgIHN0YXR1czsgCi0gICAgdWludDhfdCAgcmVhc29uX2xlbjsgCi0gICAgdWludDE2X3QgcHJvdG9jb2xfbWFqb3JfdmVyc2lvbjsgCi0gICAgdWludDE2X3QgcHJvdG9jb2xfbWlub3JfdmVyc2lvbjsgCi0gICAgdWludDE2X3QgbGVuZ3RoOyAKLX0geGNiX3NldHVwX2ZhaWxlZF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0dXBfZmFpbGVkX2l0ZXJhdG9yX3QgewotICAgIHhjYl9zZXR1cF9mYWlsZWRfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgICAgICAgaW5kZXg7IAotfSB4Y2Jfc2V0dXBfZmFpbGVkX2l0ZXJhdG9yX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfdCB7Ci0gICAgdWludDhfdCAgc3RhdHVzOyAKLSAgICB1aW50OF90ICBwYWQwWzVdOyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotfSB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfaXRlcmF0b3JfdCB7Ci0gICAgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90ICpkYXRhOyAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIHJlbTsgCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsgCi19IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfaXRlcmF0b3JfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9pbWFnZV9vcmRlcl90IHsKLSAgICBYQ0JfSU1BR0VfT1JERVJfTFNCX0ZJUlNUID0gMCwKLSAgICBYQ0JfSU1BR0VfT1JERVJfTVNCX0ZJUlNUID0gMQotfSB4Y2JfaW1hZ2Vfb3JkZXJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3NldHVwX3QgewotICAgIHVpbnQ4X3QgICAgICAgc3RhdHVzOyAKLSAgICB1aW50OF90ICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgcHJvdG9jb2xfbWFqb3JfdmVyc2lvbjsgCi0gICAgdWludDE2X3QgICAgICBwcm90b2NvbF9taW5vcl92ZXJzaW9uOyAKLSAgICB1aW50MTZfdCAgICAgIGxlbmd0aDsgCi0gICAgdWludDMyX3QgICAgICByZWxlYXNlX251bWJlcjsgCi0gICAgdWludDMyX3QgICAgICByZXNvdXJjZV9pZF9iYXNlOyAKLSAgICB1aW50MzJfdCAgICAgIHJlc291cmNlX2lkX21hc2s7IAotICAgIHVpbnQzMl90ICAgICAgbW90aW9uX2J1ZmZlcl9zaXplOyAKLSAgICB1aW50MTZfdCAgICAgIHZlbmRvcl9sZW47IAotICAgIHVpbnQxNl90ICAgICAgbWF4aW11bV9yZXF1ZXN0X2xlbmd0aDsgCi0gICAgdWludDhfdCAgICAgICByb290c19sZW47IAotICAgIHVpbnQ4X3QgICAgICAgcGl4bWFwX2Zvcm1hdHNfbGVuOyAKLSAgICB1aW50OF90ICAgICAgIGltYWdlX2J5dGVfb3JkZXI7IAotICAgIHVpbnQ4X3QgICAgICAgYml0bWFwX2Zvcm1hdF9iaXRfb3JkZXI7IAotICAgIHVpbnQ4X3QgICAgICAgYml0bWFwX2Zvcm1hdF9zY2FubGluZV91bml0OyAKLSAgICB1aW50OF90ICAgICAgIGJpdG1hcF9mb3JtYXRfc2NhbmxpbmVfcGFkOyAKLSAgICB4Y2Jfa2V5Y29kZV90IG1pbl9rZXljb2RlOyAKLSAgICB4Y2Jfa2V5Y29kZV90IG1heF9rZXljb2RlOyAKLSAgICB1aW50OF90ICAgICAgIHBhZDFbNF07IAotfSB4Y2Jfc2V0dXBfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3NldHVwX2l0ZXJhdG9yX3QgewotICAgIHhjYl9zZXR1cF90ICpkYXRhOyAKLSAgICBpbnQgICAgICAgICAgcmVtOyAKLSAgICBpbnQgICAgICAgICAgaW5kZXg7IAotfSB4Y2Jfc2V0dXBfaXRlcmF0b3JfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9tb2RfbWFza190IHsKLSAgICBYQ0JfTU9EX01BU0tfU0hJRlQgPSAxLAotICAgIFhDQl9NT0RfTUFTS19MT0NLID0gMiwKLSAgICBYQ0JfTU9EX01BU0tfQ09OVFJPTCA9IDQsCi0gICAgWENCX01PRF9NQVNLXzEgPSA4LAotICAgIFhDQl9NT0RfTUFTS18yID0gMTYsCi0gICAgWENCX01PRF9NQVNLXzMgPSAzMiwKLSAgICBYQ0JfTU9EX01BU0tfNCA9IDY0LAotICAgIFhDQl9NT0RfTUFTS181ID0gMTI4LAotICAgIFhDQl9NT0RfTUFTS19BTlkgPSAzMjc2OAotfSB4Y2JfbW9kX21hc2tfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9rZXlfYnV0X21hc2tfdCB7Ci0gICAgWENCX0tFWV9CVVRfTUFTS19TSElGVCA9IDEsCi0gICAgWENCX0tFWV9CVVRfTUFTS19MT0NLID0gMiwKLSAgICBYQ0JfS0VZX0JVVF9NQVNLX0NPTlRST0wgPSA0LAotICAgIFhDQl9LRVlfQlVUX01BU0tfTU9EXzEgPSA4LAotICAgIFhDQl9LRVlfQlVUX01BU0tfTU9EXzIgPSAxNiwKLSAgICBYQ0JfS0VZX0JVVF9NQVNLX01PRF8zID0gMzIsCi0gICAgWENCX0tFWV9CVVRfTUFTS19NT0RfNCA9IDY0LAotICAgIFhDQl9LRVlfQlVUX01BU0tfTU9EXzUgPSAxMjgsCi0gICAgWENCX0tFWV9CVVRfTUFTS19CVVRUT05fMSA9IDI1NiwKLSAgICBYQ0JfS0VZX0JVVF9NQVNLX0JVVFRPTl8yID0gNTEyLAotICAgIFhDQl9LRVlfQlVUX01BU0tfQlVUVE9OXzMgPSAxMDI0LAotICAgIFhDQl9LRVlfQlVUX01BU0tfQlVUVE9OXzQgPSAyMDQ4LAotICAgIFhDQl9LRVlfQlVUX01BU0tfQlVUVE9OXzUgPSA0MDk2Ci19IHhjYl9rZXlfYnV0X21hc2tfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl93aW5kb3dfZW51bV90IHsKLSAgICBYQ0JfV0lORE9XX05PTkUgPSAwCi19IHhjYl93aW5kb3dfZW51bV90OwotCi0jZGVmaW5lIFhDQl9LRVlfUFJFU1MgMgotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfa2V5X3ByZXNzX2V2ZW50X3QgewotICAgIHVpbnQ4X3QgICAgICAgICByZXNwb25zZV90eXBlOyAKLSAgICB4Y2Jfa2V5Y29kZV90ICAgZGV0YWlsOyAKLSAgICB1aW50MTZfdCAgICAgICAgc2VxdWVuY2U7IAotICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAKLSAgICB4Y2Jfd2luZG93X3QgICAgcm9vdDsgCi0gICAgeGNiX3dpbmRvd190ICAgIGV2ZW50OyAKLSAgICB4Y2Jfd2luZG93X3QgICAgY2hpbGQ7IAotICAgIGludDE2X3QgICAgICAgICByb290X3g7IAotICAgIGludDE2X3QgICAgICAgICByb290X3k7IAotICAgIGludDE2X3QgICAgICAgICBldmVudF94OyAKLSAgICBpbnQxNl90ICAgICAgICAgZXZlbnRfeTsgCi0gICAgdWludDE2X3QgICAgICAgIHN0YXRlOyAKLSAgICB1aW50OF90ICAgICAgICAgc2FtZV9zY3JlZW47IAotICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAKLX0geGNiX2tleV9wcmVzc19ldmVudF90OwotCi0jZGVmaW5lIFhDQl9LRVlfUkVMRUFTRSAzCi0KLXR5cGVkZWYgeGNiX2tleV9wcmVzc19ldmVudF90IHhjYl9rZXlfcmVsZWFzZV9ldmVudF90OwotCi10eXBlZGVmIGVudW0geGNiX2J1dHRvbl9tYXNrX3QgewotICAgIFhDQl9CVVRUT05fTUFTS18xID0gMjU2LAotICAgIFhDQl9CVVRUT05fTUFTS18yID0gNTEyLAotICAgIFhDQl9CVVRUT05fTUFTS18zID0gMTAyNCwKLSAgICBYQ0JfQlVUVE9OX01BU0tfNCA9IDIwNDgsCi0gICAgWENCX0JVVFRPTl9NQVNLXzUgPSA0MDk2LAotICAgIFhDQl9CVVRUT05fTUFTS19BTlkgPSAzMjc2OAotfSB4Y2JfYnV0dG9uX21hc2tfdDsKLQotI2RlZmluZSBYQ0JfQlVUVE9OX1BSRVNTIDQKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2J1dHRvbl9wcmVzc19ldmVudF90IHsKLSAgICB1aW50OF90ICAgICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgeGNiX2J1dHRvbl90ICAgIGRldGFpbDsgCi0gICAgdWludDE2X3QgICAgICAgIHNlcXVlbmNlOyAKLSAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgCi0gICAgeGNiX3dpbmRvd190ICAgIHJvb3Q7IAotICAgIHhjYl93aW5kb3dfdCAgICBldmVudDsgCi0gICAgeGNiX3dpbmRvd190ICAgIGNoaWxkOyAKLSAgICBpbnQxNl90ICAgICAgICAgcm9vdF94OyAKLSAgICBpbnQxNl90ICAgICAgICAgcm9vdF95OyAKLSAgICBpbnQxNl90ICAgICAgICAgZXZlbnRfeDsgCi0gICAgaW50MTZfdCAgICAgICAgIGV2ZW50X3k7IAotICAgIHVpbnQxNl90ICAgICAgICBzdGF0ZTsgCi0gICAgdWludDhfdCAgICAgICAgIHNhbWVfc2NyZWVuOyAKLSAgICB1aW50OF90ICAgICAgICAgcGFkMDsgCi19IHhjYl9idXR0b25fcHJlc3NfZXZlbnRfdDsKLQotI2RlZmluZSBYQ0JfQlVUVE9OX1JFTEVBU0UgNQotCi10eXBlZGVmIHhjYl9idXR0b25fcHJlc3NfZXZlbnRfdCB4Y2JfYnV0dG9uX3JlbGVhc2VfZXZlbnRfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9tb3Rpb25fdCB7Ci0gICAgWENCX01PVElPTl9OT1JNQUwgPSAwLAotICAgIFhDQl9NT1RJT05fSElOVCA9IDEKLX0geGNiX21vdGlvbl90OwotCi0jZGVmaW5lIFhDQl9NT1RJT05fTk9USUZZIDYKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX21vdGlvbl9ub3RpZnlfZXZlbnRfdCB7Ci0gICAgdWludDhfdCAgICAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBkZXRhaWw7IAotICAgIHVpbnQxNl90ICAgICAgICBzZXF1ZW5jZTsgCi0gICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IAotICAgIHhjYl93aW5kb3dfdCAgICByb290OyAKLSAgICB4Y2Jfd2luZG93X3QgICAgZXZlbnQ7IAotICAgIHhjYl93aW5kb3dfdCAgICBjaGlsZDsgCi0gICAgaW50MTZfdCAgICAgICAgIHJvb3RfeDsgCi0gICAgaW50MTZfdCAgICAgICAgIHJvb3RfeTsgCi0gICAgaW50MTZfdCAgICAgICAgIGV2ZW50X3g7IAotICAgIGludDE2X3QgICAgICAgICBldmVudF95OyAKLSAgICB1aW50MTZfdCAgICAgICAgc3RhdGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBzYW1lX3NjcmVlbjsgCi0gICAgdWludDhfdCAgICAgICAgIHBhZDA7IAotfSB4Y2JfbW90aW9uX25vdGlmeV9ldmVudF90OwotCi10eXBlZGVmIGVudW0geGNiX25vdGlmeV9kZXRhaWxfdCB7Ci0gICAgWENCX05PVElGWV9ERVRBSUxfQU5DRVNUT1IgPSAwLAotICAgIFhDQl9OT1RJRllfREVUQUlMX1ZJUlRVQUwgPSAxLAotICAgIFhDQl9OT1RJRllfREVUQUlMX0lORkVSSU9SID0gMiwKLSAgICBYQ0JfTk9USUZZX0RFVEFJTF9OT05MSU5FQVIgPSAzLAotICAgIFhDQl9OT1RJRllfREVUQUlMX05PTkxJTkVBUl9WSVJUVUFMID0gNCwKLSAgICBYQ0JfTk9USUZZX0RFVEFJTF9QT0lOVEVSID0gNSwKLSAgICBYQ0JfTk9USUZZX0RFVEFJTF9QT0lOVEVSX1JPT1QgPSA2LAotICAgIFhDQl9OT1RJRllfREVUQUlMX05PTkUgPSA3Ci19IHhjYl9ub3RpZnlfZGV0YWlsX3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2Jfbm90aWZ5X21vZGVfdCB7Ci0gICAgWENCX05PVElGWV9NT0RFX05PUk1BTCA9IDAsCi0gICAgWENCX05PVElGWV9NT0RFX0dSQUIgPSAxLAotICAgIFhDQl9OT1RJRllfTU9ERV9VTkdSQUIgPSAyLAotICAgIFhDQl9OT1RJRllfTU9ERV9XSElMRV9HUkFCQkVEID0gMwotfSB4Y2Jfbm90aWZ5X21vZGVfdDsKLQotI2RlZmluZSBYQ0JfRU5URVJfTk9USUZZIDcKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2VudGVyX25vdGlmeV9ldmVudF90IHsKLSAgICB1aW50OF90ICAgICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgICAgIGRldGFpbDsgCi0gICAgdWludDE2X3QgICAgICAgIHNlcXVlbmNlOyAKLSAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgCi0gICAgeGNiX3dpbmRvd190ICAgIHJvb3Q7IAotICAgIHhjYl93aW5kb3dfdCAgICBldmVudDsgCi0gICAgeGNiX3dpbmRvd190ICAgIGNoaWxkOyAKLSAgICBpbnQxNl90ICAgICAgICAgcm9vdF94OyAKLSAgICBpbnQxNl90ICAgICAgICAgcm9vdF95OyAKLSAgICBpbnQxNl90ICAgICAgICAgZXZlbnRfeDsgCi0gICAgaW50MTZfdCAgICAgICAgIGV2ZW50X3k7IAotICAgIHVpbnQxNl90ICAgICAgICBzdGF0ZTsgCi0gICAgdWludDhfdCAgICAgICAgIG1vZGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBzYW1lX3NjcmVlbl9mb2N1czsgCi19IHhjYl9lbnRlcl9ub3RpZnlfZXZlbnRfdDsKLQotI2RlZmluZSBYQ0JfTEVBVkVfTk9USUZZIDgKLQotdHlwZWRlZiB4Y2JfZW50ZXJfbm90aWZ5X2V2ZW50X3QgeGNiX2xlYXZlX25vdGlmeV9ldmVudF90OwotCi0jZGVmaW5lIFhDQl9GT0NVU19JTiA5Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9mb2N1c19pbl9ldmVudF90IHsKLSAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgIGRldGFpbDsgCi0gICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAKLSAgICB4Y2Jfd2luZG93X3QgZXZlbnQ7IAotICAgIHVpbnQ4X3QgICAgICBtb2RlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMFszXTsgCi19IHhjYl9mb2N1c19pbl9ldmVudF90OwotCi0jZGVmaW5lIFhDQl9GT0NVU19PVVQgMTAKLQotdHlwZWRlZiB4Y2JfZm9jdXNfaW5fZXZlbnRfdCB4Y2JfZm9jdXNfb3V0X2V2ZW50X3Q7Ci0KLSNkZWZpbmUgWENCX0tFWU1BUF9OT1RJRlkgMTEKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2tleW1hcF9ub3RpZnlfZXZlbnRfdCB7Ci0gICAgdWludDhfdCByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90IGtleXNbMzFdOyAKLX0geGNiX2tleW1hcF9ub3RpZnlfZXZlbnRfdDsKLQotI2RlZmluZSBYQ0JfRVhQT1NFIDEyCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9leHBvc2VfZXZlbnRfdCB7Ci0gICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IAotICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IAotICAgIHVpbnQxNl90ICAgICB4OyAKLSAgICB1aW50MTZfdCAgICAgeTsgCi0gICAgdWludDE2X3QgICAgIHdpZHRoOyAKLSAgICB1aW50MTZfdCAgICAgaGVpZ2h0OyAKLSAgICB1aW50MTZfdCAgICAgY291bnQ7IAotICAgIHVpbnQ4X3QgICAgICBwYWQxWzJdOyAKLX0geGNiX2V4cG9zZV9ldmVudF90OwotCi0jZGVmaW5lIFhDQl9HUkFQSElDU19FWFBPU1VSRSAxMwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhcGhpY3NfZXhwb3N1cmVfZXZlbnRfdCB7Ci0gICAgdWludDhfdCAgICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgICAgc2VxdWVuY2U7IAotICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAKLSAgICB1aW50MTZfdCAgICAgICB4OyAKLSAgICB1aW50MTZfdCAgICAgICB5OyAKLSAgICB1aW50MTZfdCAgICAgICB3aWR0aDsgCi0gICAgdWludDE2X3QgICAgICAgaGVpZ2h0OyAKLSAgICB1aW50MTZfdCAgICAgICBtaW5vcl9vcGNvZGU7IAotICAgIHVpbnQxNl90ICAgICAgIGNvdW50OyAKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDFbM107IAotfSB4Y2JfZ3JhcGhpY3NfZXhwb3N1cmVfZXZlbnRfdDsKLQotI2RlZmluZSBYQ0JfTk9fRVhQT1NVUkUgMTQKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX25vX2V4cG9zdXJlX2V2ZW50X3QgewotICAgIHVpbnQ4X3QgICAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgIHNlcXVlbmNlOyAKLSAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgCi0gICAgdWludDE2X3QgICAgICAgbWlub3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDE7IAotfSB4Y2Jfbm9fZXhwb3N1cmVfZXZlbnRfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl92aXNpYmlsaXR5X3QgewotICAgIFhDQl9WSVNJQklMSVRZX1VOT0JTQ1VSRUQgPSAwLAotICAgIFhDQl9WSVNJQklMSVRZX1BBUlRJQUxMWV9PQlNDVVJFRCA9IDEsCi0gICAgWENCX1ZJU0lCSUxJVFlfRlVMTFlfT0JTQ1VSRUQgPSAyCi19IHhjYl92aXNpYmlsaXR5X3Q7Ci0KLSNkZWZpbmUgWENCX1ZJU0lCSUxJVFlfTk9USUZZIDE1Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl92aXNpYmlsaXR5X25vdGlmeV9ldmVudF90IHsKLSAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgCi0gICAgeGNiX3dpbmRvd190IHdpbmRvdzsgCi0gICAgdWludDhfdCAgICAgIHN0YXRlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMVszXTsgCi19IHhjYl92aXNpYmlsaXR5X25vdGlmeV9ldmVudF90OwotCi0jZGVmaW5lIFhDQl9DUkVBVEVfTk9USUZZIDE2Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9jcmVhdGVfbm90aWZ5X2V2ZW50X3QgewotICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAKLSAgICB4Y2Jfd2luZG93X3QgcGFyZW50OyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLSAgICBpbnQxNl90ICAgICAgeDsgCi0gICAgaW50MTZfdCAgICAgIHk7IAotICAgIHVpbnQxNl90ICAgICB3aWR0aDsgCi0gICAgdWludDE2X3QgICAgIGhlaWdodDsgCi0gICAgdWludDE2X3QgICAgIGJvcmRlcl93aWR0aDsgCi0gICAgdWludDhfdCAgICAgIG92ZXJyaWRlX3JlZGlyZWN0OyAKLSAgICB1aW50OF90ICAgICAgcGFkMTsgCi19IHhjYl9jcmVhdGVfbm90aWZ5X2V2ZW50X3Q7Ci0KLSNkZWZpbmUgWENCX0RFU1RST1lfTk9USUZZIDE3Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9kZXN0cm95X25vdGlmeV9ldmVudF90IHsKLSAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgCi0gICAgeGNiX3dpbmRvd190IGV2ZW50OyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLX0geGNiX2Rlc3Ryb3lfbm90aWZ5X2V2ZW50X3Q7Ci0KLSNkZWZpbmUgWENCX1VOTUFQX05PVElGWSAxOAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfdW5tYXBfbm90aWZ5X2V2ZW50X3QgewotICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAKLSAgICB4Y2Jfd2luZG93X3QgZXZlbnQ7IAotICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IAotICAgIHVpbnQ4X3QgICAgICBmcm9tX2NvbmZpZ3VyZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDFbM107IAotfSB4Y2JfdW5tYXBfbm90aWZ5X2V2ZW50X3Q7Ci0KLSNkZWZpbmUgWENCX01BUF9OT1RJRlkgMTkKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX21hcF9ub3RpZnlfZXZlbnRfdCB7Ci0gICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IAotICAgIHhjYl93aW5kb3dfdCBldmVudDsgCi0gICAgeGNiX3dpbmRvd190IHdpbmRvdzsgCi0gICAgdWludDhfdCAgICAgIG92ZXJyaWRlX3JlZGlyZWN0OyAKLSAgICB1aW50OF90ICAgICAgcGFkMVszXTsgCi19IHhjYl9tYXBfbm90aWZ5X2V2ZW50X3Q7Ci0KLSNkZWZpbmUgWENCX01BUF9SRVFVRVNUIDIwCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9tYXBfcmVxdWVzdF9ldmVudF90IHsKLSAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgCi0gICAgeGNiX3dpbmRvd190IHBhcmVudDsgCi0gICAgeGNiX3dpbmRvd190IHdpbmRvdzsgCi19IHhjYl9tYXBfcmVxdWVzdF9ldmVudF90OwotCi0jZGVmaW5lIFhDQl9SRVBBUkVOVF9OT1RJRlkgMjEKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3JlcGFyZW50X25vdGlmeV9ldmVudF90IHsKLSAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgCi0gICAgeGNiX3dpbmRvd190IGV2ZW50OyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLSAgICB4Y2Jfd2luZG93X3QgcGFyZW50OyAKLSAgICBpbnQxNl90ICAgICAgeDsgCi0gICAgaW50MTZfdCAgICAgIHk7IAotICAgIHVpbnQ4X3QgICAgICBvdmVycmlkZV9yZWRpcmVjdDsgCi0gICAgdWludDhfdCAgICAgIHBhZDFbM107IAotfSB4Y2JfcmVwYXJlbnRfbm90aWZ5X2V2ZW50X3Q7Ci0KLSNkZWZpbmUgWENCX0NPTkZJR1VSRV9OT1RJRlkgMjIKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NvbmZpZ3VyZV9ub3RpZnlfZXZlbnRfdCB7Ci0gICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IAotICAgIHhjYl93aW5kb3dfdCBldmVudDsgCi0gICAgeGNiX3dpbmRvd190IHdpbmRvdzsgCi0gICAgeGNiX3dpbmRvd190IGFib3ZlX3NpYmxpbmc7IAotICAgIGludDE2X3QgICAgICB4OyAKLSAgICBpbnQxNl90ICAgICAgeTsgCi0gICAgdWludDE2X3QgICAgIHdpZHRoOyAKLSAgICB1aW50MTZfdCAgICAgaGVpZ2h0OyAKLSAgICB1aW50MTZfdCAgICAgYm9yZGVyX3dpZHRoOyAKLSAgICB1aW50OF90ICAgICAgb3ZlcnJpZGVfcmVkaXJlY3Q7IAotICAgIHVpbnQ4X3QgICAgICBwYWQxOyAKLX0geGNiX2NvbmZpZ3VyZV9ub3RpZnlfZXZlbnRfdDsKLQotI2RlZmluZSBYQ0JfQ09ORklHVVJFX1JFUVVFU1QgMjMKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NvbmZpZ3VyZV9yZXF1ZXN0X2V2ZW50X3QgewotICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICAgICAgc3RhY2tfbW9kZTsgCi0gICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAKLSAgICB4Y2Jfd2luZG93X3QgcGFyZW50OyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLSAgICB4Y2Jfd2luZG93X3Qgc2libGluZzsgCi0gICAgaW50MTZfdCAgICAgIHg7IAotICAgIGludDE2X3QgICAgICB5OyAKLSAgICB1aW50MTZfdCAgICAgd2lkdGg7IAotICAgIHVpbnQxNl90ICAgICBoZWlnaHQ7IAotICAgIHVpbnQxNl90ICAgICBib3JkZXJfd2lkdGg7IAotICAgIHVpbnQxNl90ICAgICB2YWx1ZV9tYXNrOyAKLX0geGNiX2NvbmZpZ3VyZV9yZXF1ZXN0X2V2ZW50X3Q7Ci0KLSNkZWZpbmUgWENCX0dSQVZJVFlfTk9USUZZIDI0Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9ncmF2aXR5X25vdGlmeV9ldmVudF90IHsKLSAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgCi0gICAgeGNiX3dpbmRvd190IGV2ZW50OyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLSAgICBpbnQxNl90ICAgICAgeDsgCi0gICAgaW50MTZfdCAgICAgIHk7IAotfSB4Y2JfZ3Jhdml0eV9ub3RpZnlfZXZlbnRfdDsKLQotI2RlZmluZSBYQ0JfUkVTSVpFX1JFUVVFU1QgMjUKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3Jlc2l6ZV9yZXF1ZXN0X2V2ZW50X3QgewotICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLSAgICB1aW50MTZfdCAgICAgd2lkdGg7IAotICAgIHVpbnQxNl90ICAgICBoZWlnaHQ7IAotfSB4Y2JfcmVzaXplX3JlcXVlc3RfZXZlbnRfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9wbGFjZV90IHsKLSAgICBYQ0JfUExBQ0VfT05fVE9QID0gMCwKLSAgICBYQ0JfUExBQ0VfT05fQk9UVE9NID0gMQotfSB4Y2JfcGxhY2VfdDsKLQotI2RlZmluZSBYQ0JfQ0lSQ1VMQVRFX05PVElGWSAyNgotCi10eXBlZGVmIHN0cnVjdCB4Y2JfY2lyY3VsYXRlX25vdGlmeV9ldmVudF90IHsKLSAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgCi0gICAgeGNiX3dpbmRvd190IGV2ZW50OyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLSAgICB1aW50OF90ICAgICAgcGFkMVs0XTsgCi0gICAgdWludDhfdCAgICAgIHBsYWNlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMlszXTsgCi19IHhjYl9jaXJjdWxhdGVfbm90aWZ5X2V2ZW50X3Q7Ci0KLSNkZWZpbmUgWENCX0NJUkNVTEFURV9SRVFVRVNUIDI3Ci0KLXR5cGVkZWYgeGNiX2NpcmN1bGF0ZV9ub3RpZnlfZXZlbnRfdCB4Y2JfY2lyY3VsYXRlX3JlcXVlc3RfZXZlbnRfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9wcm9wZXJ0eV90IHsKLSAgICBYQ0JfUFJPUEVSVFlfTkVXX1ZBTFVFID0gMCwKLSAgICBYQ0JfUFJPUEVSVFlfREVMRVRFID0gMQotfSB4Y2JfcHJvcGVydHlfdDsKLQotI2RlZmluZSBYQ0JfUFJPUEVSVFlfTk9USUZZIDI4Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9wcm9wZXJ0eV9ub3RpZnlfZXZlbnRfdCB7Ci0gICAgdWludDhfdCAgICAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICAgc2VxdWVuY2U7IAotICAgIHhjYl93aW5kb3dfdCAgICB3aW5kb3c7IAotICAgIHhjYl9hdG9tX3QgICAgICBhdG9tOyAKLSAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgCi0gICAgdWludDhfdCAgICAgICAgIHN0YXRlOyAKLSAgICB1aW50OF90ICAgICAgICAgcGFkMVszXTsgCi19IHhjYl9wcm9wZXJ0eV9ub3RpZnlfZXZlbnRfdDsKLQotI2RlZmluZSBYQ0JfU0VMRUNUSU9OX0NMRUFSIDI5Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zZWxlY3Rpb25fY2xlYXJfZXZlbnRfdCB7Ci0gICAgdWludDhfdCAgICAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICAgc2VxdWVuY2U7IAotICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAKLSAgICB4Y2Jfd2luZG93X3QgICAgb3duZXI7IAotICAgIHhjYl9hdG9tX3QgICAgICBzZWxlY3Rpb247IAotfSB4Y2Jfc2VsZWN0aW9uX2NsZWFyX2V2ZW50X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfdGltZV90IHsKLSAgICBYQ0JfVElNRV9DVVJSRU5UX1RJTUUgPSAwCi19IHhjYl90aW1lX3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfYXRvbV9lbnVtX3QgewotICAgIFhDQl9BVE9NX05PTkUgPSAwLAotICAgIFhDQl9BVE9NX0FOWSA9IDAsCi0gICAgWENCX0FUT01fUFJJTUFSWSA9IDEsCi0gICAgWENCX0FUT01fU0VDT05EQVJZID0gMiwKLSAgICBYQ0JfQVRPTV9BUkMgPSAzLAotICAgIFhDQl9BVE9NX0FUT00gPSA0LAotICAgIFhDQl9BVE9NX0JJVE1BUCA9IDUsCi0gICAgWENCX0FUT01fQ0FSRElOQUwgPSA2LAotICAgIFhDQl9BVE9NX0NPTE9STUFQID0gNywKLSAgICBYQ0JfQVRPTV9DVVJTT1IgPSA4LAotICAgIFhDQl9BVE9NX0NVVF9CVUZGRVIwID0gOSwKLSAgICBYQ0JfQVRPTV9DVVRfQlVGRkVSMSA9IDEwLAotICAgIFhDQl9BVE9NX0NVVF9CVUZGRVIyID0gMTEsCi0gICAgWENCX0FUT01fQ1VUX0JVRkZFUjMgPSAxMiwKLSAgICBYQ0JfQVRPTV9DVVRfQlVGRkVSNCA9IDEzLAotICAgIFhDQl9BVE9NX0NVVF9CVUZGRVI1ID0gMTQsCi0gICAgWENCX0FUT01fQ1VUX0JVRkZFUjYgPSAxNSwKLSAgICBYQ0JfQVRPTV9DVVRfQlVGRkVSNyA9IDE2LAotICAgIFhDQl9BVE9NX0RSQVdBQkxFID0gMTcsCi0gICAgWENCX0FUT01fRk9OVCA9IDE4LAotICAgIFhDQl9BVE9NX0lOVEVHRVIgPSAxOSwKLSAgICBYQ0JfQVRPTV9QSVhNQVAgPSAyMCwKLSAgICBYQ0JfQVRPTV9QT0lOVCA9IDIxLAotICAgIFhDQl9BVE9NX1JFQ1RBTkdMRSA9IDIyLAotICAgIFhDQl9BVE9NX1JFU09VUkNFX01BTkFHRVIgPSAyMywKLSAgICBYQ0JfQVRPTV9SR0JfQ09MT1JfTUFQID0gMjQsCi0gICAgWENCX0FUT01fUkdCX0JFU1RfTUFQID0gMjUsCi0gICAgWENCX0FUT01fUkdCX0JMVUVfTUFQID0gMjYsCi0gICAgWENCX0FUT01fUkdCX0RFRkFVTFRfTUFQID0gMjcsCi0gICAgWENCX0FUT01fUkdCX0dSQVlfTUFQID0gMjgsCi0gICAgWENCX0FUT01fUkdCX0dSRUVOX01BUCA9IDI5LAotICAgIFhDQl9BVE9NX1JHQl9SRURfTUFQID0gMzAsCi0gICAgWENCX0FUT01fU1RSSU5HID0gMzEsCi0gICAgWENCX0FUT01fVklTVUFMSUQgPSAzMiwKLSAgICBYQ0JfQVRPTV9XSU5ET1cgPSAzMywKLSAgICBYQ0JfQVRPTV9XTV9DT01NQU5EID0gMzQsCi0gICAgWENCX0FUT01fV01fSElOVFMgPSAzNSwKLSAgICBYQ0JfQVRPTV9XTV9DTElFTlRfTUFDSElORSA9IDM2LAotICAgIFhDQl9BVE9NX1dNX0lDT05fTkFNRSA9IDM3LAotICAgIFhDQl9BVE9NX1dNX0lDT05fU0laRSA9IDM4LAotICAgIFhDQl9BVE9NX1dNX05BTUUgPSAzOSwKLSAgICBYQ0JfQVRPTV9XTV9OT1JNQUxfSElOVFMgPSA0MCwKLSAgICBYQ0JfQVRPTV9XTV9TSVpFX0hJTlRTID0gNDEsCi0gICAgWENCX0FUT01fV01fWk9PTV9ISU5UUyA9IDQyLAotICAgIFhDQl9BVE9NX01JTl9TUEFDRSA9IDQzLAotICAgIFhDQl9BVE9NX05PUk1fU1BBQ0UgPSA0NCwKLSAgICBYQ0JfQVRPTV9NQVhfU1BBQ0UgPSA0NSwKLSAgICBYQ0JfQVRPTV9FTkRfU1BBQ0UgPSA0NiwKLSAgICBYQ0JfQVRPTV9TVVBFUlNDUklQVF9YID0gNDcsCi0gICAgWENCX0FUT01fU1VQRVJTQ1JJUFRfWSA9IDQ4LAotICAgIFhDQl9BVE9NX1NVQlNDUklQVF9YID0gNDksCi0gICAgWENCX0FUT01fU1VCU0NSSVBUX1kgPSA1MCwKLSAgICBYQ0JfQVRPTV9VTkRFUkxJTkVfUE9TSVRJT04gPSA1MSwKLSAgICBYQ0JfQVRPTV9VTkRFUkxJTkVfVEhJQ0tORVNTID0gNTIsCi0gICAgWENCX0FUT01fU1RSSUtFT1VUX0FTQ0VOVCA9IDUzLAotICAgIFhDQl9BVE9NX1NUUklLRU9VVF9ERVNDRU5UID0gNTQsCi0gICAgWENCX0FUT01fSVRBTElDX0FOR0xFID0gNTUsCi0gICAgWENCX0FUT01fWF9IRUlHSFQgPSA1NiwKLSAgICBYQ0JfQVRPTV9RVUFEX1dJRFRIID0gNTcsCi0gICAgWENCX0FUT01fV0VJR0hUID0gNTgsCi0gICAgWENCX0FUT01fUE9JTlRfU0laRSA9IDU5LAotICAgIFhDQl9BVE9NX1JFU09MVVRJT04gPSA2MCwKLSAgICBYQ0JfQVRPTV9DT1BZUklHSFQgPSA2MSwKLSAgICBYQ0JfQVRPTV9OT1RJQ0UgPSA2MiwKLSAgICBYQ0JfQVRPTV9GT05UX05BTUUgPSA2MywKLSAgICBYQ0JfQVRPTV9GQU1JTFlfTkFNRSA9IDY0LAotICAgIFhDQl9BVE9NX0ZVTExfTkFNRSA9IDY1LAotICAgIFhDQl9BVE9NX0NBUF9IRUlHSFQgPSA2NiwKLSAgICBYQ0JfQVRPTV9XTV9DTEFTUyA9IDY3LAotICAgIFhDQl9BVE9NX1dNX1RSQU5TSUVOVF9GT1IgPSA2OAotfSB4Y2JfYXRvbV9lbnVtX3Q7Ci0KLSNkZWZpbmUgWENCX1NFTEVDVElPTl9SRVFVRVNUIDMwCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9zZWxlY3Rpb25fcmVxdWVzdF9ldmVudF90IHsKLSAgICB1aW50OF90ICAgICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgICBzZXF1ZW5jZTsgCi0gICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IAotICAgIHhjYl93aW5kb3dfdCAgICBvd25lcjsgCi0gICAgeGNiX3dpbmRvd190ICAgIHJlcXVlc3RvcjsgCi0gICAgeGNiX2F0b21fdCAgICAgIHNlbGVjdGlvbjsgCi0gICAgeGNiX2F0b21fdCAgICAgIHRhcmdldDsgCi0gICAgeGNiX2F0b21fdCAgICAgIHByb3BlcnR5OyAKLX0geGNiX3NlbGVjdGlvbl9yZXF1ZXN0X2V2ZW50X3Q7Ci0KLSNkZWZpbmUgWENCX1NFTEVDVElPTl9OT1RJRlkgMzEKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3NlbGVjdGlvbl9ub3RpZnlfZXZlbnRfdCB7Ci0gICAgdWludDhfdCAgICAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICAgc2VxdWVuY2U7IAotICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAKLSAgICB4Y2Jfd2luZG93X3QgICAgcmVxdWVzdG9yOyAKLSAgICB4Y2JfYXRvbV90ICAgICAgc2VsZWN0aW9uOyAKLSAgICB4Y2JfYXRvbV90ICAgICAgdGFyZ2V0OyAKLSAgICB4Y2JfYXRvbV90ICAgICAgcHJvcGVydHk7IAotfSB4Y2Jfc2VsZWN0aW9uX25vdGlmeV9ldmVudF90OwotCi10eXBlZGVmIGVudW0geGNiX2NvbG9ybWFwX3N0YXRlX3QgewotICAgIFhDQl9DT0xPUk1BUF9TVEFURV9VTklOU1RBTExFRCA9IDAsCi0gICAgWENCX0NPTE9STUFQX1NUQVRFX0lOU1RBTExFRCA9IDEKLX0geGNiX2NvbG9ybWFwX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfY29sb3JtYXBfZW51bV90IHsKLSAgICBYQ0JfQ09MT1JNQVBfTk9ORSA9IDAKLX0geGNiX2NvbG9ybWFwX2VudW1fdDsKLQotI2RlZmluZSBYQ0JfQ09MT1JNQVBfTk9USUZZIDMyCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9jb2xvcm1hcF9ub3RpZnlfZXZlbnRfdCB7Ci0gICAgdWludDhfdCAgICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgICAgc2VxdWVuY2U7IAotICAgIHhjYl93aW5kb3dfdCAgIHdpbmRvdzsgCi0gICAgeGNiX2NvbG9ybWFwX3QgY29sb3JtYXA7IAotICAgIHVpbnQ4X3QgICAgICAgIF9uZXc7IAotICAgIHVpbnQ4X3QgICAgICAgIHN0YXRlOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQxWzJdOyAKLX0geGNiX2NvbG9ybWFwX25vdGlmeV9ldmVudF90OwotCi10eXBlZGVmIHVuaW9uIHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX3QgewotICAgIHVpbnQ4X3QgIGRhdGE4WzIwXTsgCi0gICAgdWludDE2X3QgZGF0YTE2WzEwXTsgCi0gICAgdWludDMyX3QgZGF0YTMyWzVdOyAKLX0geGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfaXRlcmF0b3JfdCB7Ci0gICAgeGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfdCAqZGF0YTsgCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgcmVtOyAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsgCi19IHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX2l0ZXJhdG9yX3Q7Ci0KLSNkZWZpbmUgWENCX0NMSUVOVF9NRVNTQUdFIDMzCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9jbGllbnRfbWVzc2FnZV9ldmVudF90IHsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgZm9ybWF0OyAKLSAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgIHNlcXVlbmNlOyAKLSAgICB4Y2Jfd2luZG93X3QgICAgICAgICAgICAgIHdpbmRvdzsgCi0gICAgeGNiX2F0b21fdCAgICAgICAgICAgICAgICB0eXBlOyAKLSAgICB4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV90IGRhdGE7IAotfSB4Y2JfY2xpZW50X21lc3NhZ2VfZXZlbnRfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9tYXBwaW5nX3QgewotICAgIFhDQl9NQVBQSU5HX01PRElGSUVSID0gMCwKLSAgICBYQ0JfTUFQUElOR19LRVlCT0FSRCA9IDEsCi0gICAgWENCX01BUFBJTkdfUE9JTlRFUiA9IDIKLX0geGNiX21hcHBpbmdfdDsKLQotI2RlZmluZSBYQ0JfTUFQUElOR19OT1RJRlkgMzQKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX21hcHBpbmdfbm90aWZ5X2V2ZW50X3QgewotICAgIHVpbnQ4X3QgICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgIHNlcXVlbmNlOyAKLSAgICB1aW50OF90ICAgICAgIHJlcXVlc3Q7IAotICAgIHhjYl9rZXljb2RlX3QgZmlyc3Rfa2V5Y29kZTsgCi0gICAgdWludDhfdCAgICAgICBjb3VudDsgCi0gICAgdWludDhfdCAgICAgICBwYWQxOyAKLX0geGNiX21hcHBpbmdfbm90aWZ5X2V2ZW50X3Q7Ci0KLSNkZWZpbmUgWENCX0dFX0dFTkVSSUMgMzUKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dlX2dlbmVyaWNfZXZlbnRfdCB7Ci0gICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgZXh0ZW5zaW9uOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICB1aW50MTZfdCBldmVudF90eXBlOyAKLSAgICB1aW50OF90ICBwYWQwWzIyXTsgCi0gICAgdWludDMyX3QgZnVsbF9zZXF1ZW5jZTsgCi19IHhjYl9nZV9nZW5lcmljX2V2ZW50X3Q7Ci0KLSNkZWZpbmUgWENCX1JFUVVFU1QgMQotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcmVxdWVzdF9lcnJvcl90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBlcnJvcl9jb2RlOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgYmFkX3ZhbHVlOyAKLSAgICB1aW50MTZfdCBtaW5vcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi19IHhjYl9yZXF1ZXN0X2Vycm9yX3Q7Ci0KLSNkZWZpbmUgWENCX1ZBTFVFIDIKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3ZhbHVlX2Vycm9yX3QgewotICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgIGVycm9yX2NvZGU7IAotICAgIHVpbnQxNl90IHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCBiYWRfdmFsdWU7IAotICAgIHVpbnQxNl90IG1pbm9yX29wY29kZTsgCi0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLX0geGNiX3ZhbHVlX2Vycm9yX3Q7Ci0KLSNkZWZpbmUgWENCX1dJTkRPVyAzCi0KLXR5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX3dpbmRvd19lcnJvcl90OwotCi0jZGVmaW5lIFhDQl9QSVhNQVAgNAotCi10eXBlZGVmIHhjYl92YWx1ZV9lcnJvcl90IHhjYl9waXhtYXBfZXJyb3JfdDsKLQotI2RlZmluZSBYQ0JfQVRPTSA1Ci0KLXR5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX2F0b21fZXJyb3JfdDsKLQotI2RlZmluZSBYQ0JfQ1VSU09SIDYKLQotdHlwZWRlZiB4Y2JfdmFsdWVfZXJyb3JfdCB4Y2JfY3Vyc29yX2Vycm9yX3Q7Ci0KLSNkZWZpbmUgWENCX0ZPTlQgNwotCi10eXBlZGVmIHhjYl92YWx1ZV9lcnJvcl90IHhjYl9mb250X2Vycm9yX3Q7Ci0KLSNkZWZpbmUgWENCX01BVENIIDgKLQotdHlwZWRlZiB4Y2JfcmVxdWVzdF9lcnJvcl90IHhjYl9tYXRjaF9lcnJvcl90OwotCi0jZGVmaW5lIFhDQl9EUkFXQUJMRSA5Ci0KLXR5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX2RyYXdhYmxlX2Vycm9yX3Q7Ci0KLSNkZWZpbmUgWENCX0FDQ0VTUyAxMAotCi10eXBlZGVmIHhjYl9yZXF1ZXN0X2Vycm9yX3QgeGNiX2FjY2Vzc19lcnJvcl90OwotCi0jZGVmaW5lIFhDQl9BTExPQyAxMQotCi10eXBlZGVmIHhjYl9yZXF1ZXN0X2Vycm9yX3QgeGNiX2FsbG9jX2Vycm9yX3Q7Ci0KLSNkZWZpbmUgWENCX0NPTE9STUFQIDEyCi0KLXR5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX2NvbG9ybWFwX2Vycm9yX3Q7Ci0KLSNkZWZpbmUgWENCX0dfQ09OVEVYVCAxMwotCi10eXBlZGVmIHhjYl92YWx1ZV9lcnJvcl90IHhjYl9nX2NvbnRleHRfZXJyb3JfdDsKLQotI2RlZmluZSBYQ0JfSURfQ0hPSUNFIDE0Ci0KLXR5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX2lkX2Nob2ljZV9lcnJvcl90OwotCi0jZGVmaW5lIFhDQl9OQU1FIDE1Ci0KLXR5cGVkZWYgeGNiX3JlcXVlc3RfZXJyb3JfdCB4Y2JfbmFtZV9lcnJvcl90OwotCi0jZGVmaW5lIFhDQl9MRU5HVEggMTYKLQotdHlwZWRlZiB4Y2JfcmVxdWVzdF9lcnJvcl90IHhjYl9sZW5ndGhfZXJyb3JfdDsKLQotI2RlZmluZSBYQ0JfSU1QTEVNRU5UQVRJT04gMTcKLQotdHlwZWRlZiB4Y2JfcmVxdWVzdF9lcnJvcl90IHhjYl9pbXBsZW1lbnRhdGlvbl9lcnJvcl90OwotCi10eXBlZGVmIGVudW0geGNiX3dpbmRvd19jbGFzc190IHsKLSAgICBYQ0JfV0lORE9XX0NMQVNTX0NPUFlfRlJPTV9QQVJFTlQgPSAwLAotICAgIFhDQl9XSU5ET1dfQ0xBU1NfSU5QVVRfT1VUUFVUID0gMSwKLSAgICBYQ0JfV0lORE9XX0NMQVNTX0lOUFVUX09OTFkgPSAyCi19IHhjYl93aW5kb3dfY2xhc3NfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9jd190IHsKLSAgICBYQ0JfQ1dfQkFDS19QSVhNQVAgPSAxLAotICAgIFhDQl9DV19CQUNLX1BJWEVMID0gMiwKLSAgICBYQ0JfQ1dfQk9SREVSX1BJWE1BUCA9IDQsCi0gICAgWENCX0NXX0JPUkRFUl9QSVhFTCA9IDgsCi0gICAgWENCX0NXX0JJVF9HUkFWSVRZID0gMTYsCi0gICAgWENCX0NXX1dJTl9HUkFWSVRZID0gMzIsCi0gICAgWENCX0NXX0JBQ0tJTkdfU1RPUkUgPSA2NCwKLSAgICBYQ0JfQ1dfQkFDS0lOR19QTEFORVMgPSAxMjgsCi0gICAgWENCX0NXX0JBQ0tJTkdfUElYRUwgPSAyNTYsCi0gICAgWENCX0NXX09WRVJSSURFX1JFRElSRUNUID0gNTEyLAotICAgIFhDQl9DV19TQVZFX1VOREVSID0gMTAyNCwKLSAgICBYQ0JfQ1dfRVZFTlRfTUFTSyA9IDIwNDgsCi0gICAgWENCX0NXX0RPTlRfUFJPUEFHQVRFID0gNDA5NiwKLSAgICBYQ0JfQ1dfQ09MT1JNQVAgPSA4MTkyLAotICAgIFhDQl9DV19DVVJTT1IgPSAxNjM4NAotfSB4Y2JfY3dfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9iYWNrX3BpeG1hcF90IHsKLSAgICBYQ0JfQkFDS19QSVhNQVBfTk9ORSA9IDAsCi0gICAgWENCX0JBQ0tfUElYTUFQX1BBUkVOVF9SRUxBVElWRSA9IDEKLX0geGNiX2JhY2tfcGl4bWFwX3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfZ3Jhdml0eV90IHsKLSAgICBYQ0JfR1JBVklUWV9CSVRfRk9SR0VUID0gMCwKLSAgICBYQ0JfR1JBVklUWV9XSU5fVU5NQVAgPSAwLAotICAgIFhDQl9HUkFWSVRZX05PUlRIX1dFU1QgPSAxLAotICAgIFhDQl9HUkFWSVRZX05PUlRIID0gMiwKLSAgICBYQ0JfR1JBVklUWV9OT1JUSF9FQVNUID0gMywKLSAgICBYQ0JfR1JBVklUWV9XRVNUID0gNCwKLSAgICBYQ0JfR1JBVklUWV9DRU5URVIgPSA1LAotICAgIFhDQl9HUkFWSVRZX0VBU1QgPSA2LAotICAgIFhDQl9HUkFWSVRZX1NPVVRIX1dFU1QgPSA3LAotICAgIFhDQl9HUkFWSVRZX1NPVVRIID0gOCwKLSAgICBYQ0JfR1JBVklUWV9TT1VUSF9FQVNUID0gOSwKLSAgICBYQ0JfR1JBVklUWV9TVEFUSUMgPSAxMAotfSB4Y2JfZ3Jhdml0eV90OwotCi0jZGVmaW5lIFhDQl9DUkVBVEVfV0lORE9XIDEKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NyZWF0ZV93aW5kb3dfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIGRlcHRoOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCAgIHdpZDsgCi0gICAgeGNiX3dpbmRvd190ICAgcGFyZW50OyAKLSAgICBpbnQxNl90ICAgICAgICB4OyAKLSAgICBpbnQxNl90ICAgICAgICB5OyAKLSAgICB1aW50MTZfdCAgICAgICB3aWR0aDsgCi0gICAgdWludDE2X3QgICAgICAgaGVpZ2h0OyAKLSAgICB1aW50MTZfdCAgICAgICBib3JkZXJfd2lkdGg7IAotICAgIHVpbnQxNl90ICAgICAgIF9jbGFzczsgCi0gICAgeGNiX3Zpc3VhbGlkX3QgdmlzdWFsOyAKLSAgICB1aW50MzJfdCAgICAgICB2YWx1ZV9tYXNrOyAKLX0geGNiX2NyZWF0ZV93aW5kb3dfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9DSEFOR0VfV0lORE9XX0FUVFJJQlVURVMgMgotCi10eXBlZGVmIHN0cnVjdCB4Y2JfY2hhbmdlX3dpbmRvd19hdHRyaWJ1dGVzX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IAotICAgIHVpbnQzMl90ICAgICB2YWx1ZV9tYXNrOyAKLX0geGNiX2NoYW5nZV93aW5kb3dfYXR0cmlidXRlc19yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfbWFwX3N0YXRlX3QgewotICAgIFhDQl9NQVBfU1RBVEVfVU5NQVBQRUQgPSAwLAotICAgIFhDQl9NQVBfU1RBVEVfVU5WSUVXQUJMRSA9IDEsCi0gICAgWENCX01BUF9TVEFURV9WSUVXQUJMRSA9IDIKLX0geGNiX21hcF9zdGF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX2Nvb2tpZV90IHsKLSAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IAotfSB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9HRVRfV0lORE9XX0FUVFJJQlVURVMgMwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IAotfSB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19yZXBseV90IHsKLSAgICB1aW50OF90ICAgICAgICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICAgICAgICBiYWNraW5nX3N0b3JlOyAKLSAgICB1aW50MTZfdCAgICAgICBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfdmlzdWFsaWRfdCB2aXN1YWw7IAotICAgIHVpbnQxNl90ICAgICAgIF9jbGFzczsgCi0gICAgdWludDhfdCAgICAgICAgYml0X2dyYXZpdHk7IAotICAgIHVpbnQ4X3QgICAgICAgIHdpbl9ncmF2aXR5OyAKLSAgICB1aW50MzJfdCAgICAgICBiYWNraW5nX3BsYW5lczsgCi0gICAgdWludDMyX3QgICAgICAgYmFja2luZ19waXhlbDsgCi0gICAgdWludDhfdCAgICAgICAgc2F2ZV91bmRlcjsgCi0gICAgdWludDhfdCAgICAgICAgbWFwX2lzX2luc3RhbGxlZDsgCi0gICAgdWludDhfdCAgICAgICAgbWFwX3N0YXRlOyAKLSAgICB1aW50OF90ICAgICAgICBvdmVycmlkZV9yZWRpcmVjdDsgCi0gICAgeGNiX2NvbG9ybWFwX3QgY29sb3JtYXA7IAotICAgIHVpbnQzMl90ICAgICAgIGFsbF9ldmVudF9tYXNrczsgCi0gICAgdWludDMyX3QgICAgICAgeW91cl9ldmVudF9tYXNrOyAKLSAgICB1aW50MTZfdCAgICAgICBkb19ub3RfcHJvcGFnYXRlX21hc2s7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDBbMl07IAotfSB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcGx5X3Q7Ci0KLSNkZWZpbmUgWENCX0RFU1RST1lfV0lORE9XIDQKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2Rlc3Ryb3lfd2luZG93X3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IAotfSB4Y2JfZGVzdHJveV93aW5kb3dfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9ERVNUUk9ZX1NVQldJTkRPV1MgNQotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZGVzdHJveV9zdWJ3aW5kb3dzX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IAotfSB4Y2JfZGVzdHJveV9zdWJ3aW5kb3dzX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9zZXRfbW9kZV90IHsKLSAgICBYQ0JfU0VUX01PREVfSU5TRVJUID0gMCwKLSAgICBYQ0JfU0VUX01PREVfREVMRVRFID0gMQotfSB4Y2Jfc2V0X21vZGVfdDsKLQotI2RlZmluZSBYQ0JfQ0hBTkdFX1NBVkVfU0VUIDYKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYW5nZV9zYXZlX3NldF9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICBtb2RlOyAKLSAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLX0geGNiX2NoYW5nZV9zYXZlX3NldF9yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX1JFUEFSRU5UX1dJTkRPVyA3Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9yZXBhcmVudF93aW5kb3dfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgIGxlbmd0aDsgCi0gICAgeGNiX3dpbmRvd190IHdpbmRvdzsgCi0gICAgeGNiX3dpbmRvd190IHBhcmVudDsgCi0gICAgaW50MTZfdCAgICAgIHg7IAotICAgIGludDE2X3QgICAgICB5OyAKLX0geGNiX3JlcGFyZW50X3dpbmRvd19yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX01BUF9XSU5ET1cgOAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfbWFwX3dpbmRvd19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLX0geGNiX21hcF93aW5kb3dfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9NQVBfU1VCV0lORE9XUyA5Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9tYXBfc3Vid2luZG93c19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLX0geGNiX21hcF9zdWJ3aW5kb3dzX3JlcXVlc3RfdDsKLQotI2RlZmluZSBYQ0JfVU5NQVBfV0lORE9XIDEwCi0KLXR5cGVkZWYgc3RydWN0IHhjYl91bm1hcF93aW5kb3dfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgIGxlbmd0aDsgCi0gICAgeGNiX3dpbmRvd190IHdpbmRvdzsgCi19IHhjYl91bm1hcF93aW5kb3dfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9VTk1BUF9TVUJXSU5ET1dTIDExCi0KLXR5cGVkZWYgc3RydWN0IHhjYl91bm1hcF9zdWJ3aW5kb3dzX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IAotfSB4Y2JfdW5tYXBfc3Vid2luZG93c19yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfY29uZmlnX3dpbmRvd190IHsKLSAgICBYQ0JfQ09ORklHX1dJTkRPV19YID0gMSwKLSAgICBYQ0JfQ09ORklHX1dJTkRPV19ZID0gMiwKLSAgICBYQ0JfQ09ORklHX1dJTkRPV19XSURUSCA9IDQsCi0gICAgWENCX0NPTkZJR19XSU5ET1dfSEVJR0hUID0gOCwKLSAgICBYQ0JfQ09ORklHX1dJTkRPV19CT1JERVJfV0lEVEggPSAxNiwKLSAgICBYQ0JfQ09ORklHX1dJTkRPV19TSUJMSU5HID0gMzIsCi0gICAgWENCX0NPTkZJR19XSU5ET1dfU1RBQ0tfTU9ERSA9IDY0Ci19IHhjYl9jb25maWdfd2luZG93X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2Jfc3RhY2tfbW9kZV90IHsKLSAgICBYQ0JfU1RBQ0tfTU9ERV9BQk9WRSA9IDAsCi0gICAgWENCX1NUQUNLX01PREVfQkVMT1cgPSAxLAotICAgIFhDQl9TVEFDS19NT0RFX1RPUF9JRiA9IDIsCi0gICAgWENCX1NUQUNLX01PREVfQk9UVE9NX0lGID0gMywKLSAgICBYQ0JfU1RBQ0tfTU9ERV9PUFBPU0lURSA9IDQKLX0geGNiX3N0YWNrX21vZGVfdDsKLQotI2RlZmluZSBYQ0JfQ09ORklHVVJFX1dJTkRPVyAxMgotCi10eXBlZGVmIHN0cnVjdCB4Y2JfY29uZmlndXJlX3dpbmRvd19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLSAgICB1aW50MTZfdCAgICAgdmFsdWVfbWFzazsgCi0gICAgdWludDhfdCAgICAgIHBhZDFbMl07IAotfSB4Y2JfY29uZmlndXJlX3dpbmRvd19yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfY2lyY3VsYXRlX3QgewotICAgIFhDQl9DSVJDVUxBVEVfUkFJU0VfTE9XRVNUID0gMCwKLSAgICBYQ0JfQ0lSQ1VMQVRFX0xPV0VSX0hJR0hFU1QgPSAxCi19IHhjYl9jaXJjdWxhdGVfdDsKLQotI2RlZmluZSBYQ0JfQ0lSQ1VMQVRFX1dJTkRPVyAxMwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfY2lyY3VsYXRlX3dpbmRvd19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICBkaXJlY3Rpb247IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IAotfSB4Y2JfY2lyY3VsYXRlX3dpbmRvd19yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9nZXRfZ2VvbWV0cnlfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9nZXRfZ2VvbWV0cnlfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX0dFVF9HRU9NRVRSWSAxNAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2dlb21ldHJ5X3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAKLX0geGNiX2dldF9nZW9tZXRyeV9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9nZXRfZ2VvbWV0cnlfcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICBkZXB0aDsgCi0gICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3Qgcm9vdDsgCi0gICAgaW50MTZfdCAgICAgIHg7IAotICAgIGludDE2X3QgICAgICB5OyAKLSAgICB1aW50MTZfdCAgICAgd2lkdGg7IAotICAgIHVpbnQxNl90ICAgICBoZWlnaHQ7IAotICAgIHVpbnQxNl90ICAgICBib3JkZXJfd2lkdGg7IAotICAgIHVpbnQ4X3QgICAgICBwYWQwWzJdOyAKLX0geGNiX2dldF9nZW9tZXRyeV9yZXBseV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfdHJlZV9jb29raWVfdCB7Ci0gICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAKLX0geGNiX3F1ZXJ5X3RyZWVfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX1FVRVJZX1RSRUUgMTUKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X3RyZWVfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgIGxlbmd0aDsgCi0gICAgeGNiX3dpbmRvd190IHdpbmRvdzsgCi19IHhjYl9xdWVyeV90cmVlX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X3RyZWVfcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCByb290OyAKLSAgICB4Y2Jfd2luZG93X3QgcGFyZW50OyAKLSAgICB1aW50MTZfdCAgICAgY2hpbGRyZW5fbGVuOyAKLSAgICB1aW50OF90ICAgICAgcGFkMVsxNF07IAotfSB4Y2JfcXVlcnlfdHJlZV9yZXBseV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfaW50ZXJuX2F0b21fY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfSU5URVJOX0FUT00gMTYKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2ludGVybl9hdG9tX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBvbmx5X2lmX2V4aXN0czsgCi0gICAgdWludDE2X3QgbGVuZ3RoOyAKLSAgICB1aW50MTZfdCBuYW1lX2xlbjsgCi0gICAgdWludDhfdCAgcGFkMFsyXTsgCi19IHhjYl9pbnRlcm5fYXRvbV9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9pbnRlcm5fYXRvbV9yZXBseV90IHsKLSAgICB1aW50OF90ICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgICBsZW5ndGg7IAotICAgIHhjYl9hdG9tX3QgYXRvbTsgCi19IHhjYl9pbnRlcm5fYXRvbV9yZXBseV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2F0b21fbmFtZV9jb29raWVfdCB7Ci0gICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAKLX0geGNiX2dldF9hdG9tX25hbWVfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX0dFVF9BVE9NX05BTUUgMTcKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9hdG9tX25hbWVfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgIGxlbmd0aDsgCi0gICAgeGNiX2F0b21fdCBhdG9tOyAKLX0geGNiX2dldF9hdG9tX25hbWVfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICB1aW50MTZfdCBuYW1lX2xlbjsgCi0gICAgdWludDhfdCAgcGFkMVsyMl07IAotfSB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseV90OwotCi10eXBlZGVmIGVudW0geGNiX3Byb3BfbW9kZV90IHsKLSAgICBYQ0JfUFJPUF9NT0RFX1JFUExBQ0UgPSAwLAotICAgIFhDQl9QUk9QX01PREVfUFJFUEVORCA9IDEsCi0gICAgWENCX1BST1BfTU9ERV9BUFBFTkQgPSAyCi19IHhjYl9wcm9wX21vZGVfdDsKLQotI2RlZmluZSBYQ0JfQ0hBTkdFX1BST1BFUlRZIDE4Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9jaGFuZ2VfcHJvcGVydHlfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgbW9kZTsgCi0gICAgdWludDE2X3QgICAgIGxlbmd0aDsgCi0gICAgeGNiX3dpbmRvd190IHdpbmRvdzsgCi0gICAgeGNiX2F0b21fdCAgIHByb3BlcnR5OyAKLSAgICB4Y2JfYXRvbV90ICAgdHlwZTsgCi0gICAgdWludDhfdCAgICAgIGZvcm1hdDsgCi0gICAgdWludDhfdCAgICAgIHBhZDBbM107IAotICAgIHVpbnQzMl90ICAgICBkYXRhX2xlbjsgCi19IHhjYl9jaGFuZ2VfcHJvcGVydHlfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9ERUxFVEVfUFJPUEVSVFkgMTkKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2RlbGV0ZV9wcm9wZXJ0eV9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLSAgICB4Y2JfYXRvbV90ICAgcHJvcGVydHk7IAotfSB4Y2JfZGVsZXRlX3Byb3BlcnR5X3JlcXVlc3RfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9nZXRfcHJvcGVydHlfdHlwZV90IHsKLSAgICBYQ0JfR0VUX1BST1BFUlRZX1RZUEVfQU5ZID0gMAotfSB4Y2JfZ2V0X3Byb3BlcnR5X3R5cGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9wcm9wZXJ0eV9jb29raWVfdCB7Ci0gICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAKLX0geGNiX2dldF9wcm9wZXJ0eV9jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfR0VUX1BST1BFUlRZIDIwCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9nZXRfcHJvcGVydHlfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgX2RlbGV0ZTsgCi0gICAgdWludDE2X3QgICAgIGxlbmd0aDsgCi0gICAgeGNiX3dpbmRvd190IHdpbmRvdzsgCi0gICAgeGNiX2F0b21fdCAgIHByb3BlcnR5OyAKLSAgICB4Y2JfYXRvbV90ICAgdHlwZTsgCi0gICAgdWludDMyX3QgICAgIGxvbmdfb2Zmc2V0OyAKLSAgICB1aW50MzJfdCAgICAgbG9uZ19sZW5ndGg7IAotfSB4Y2JfZ2V0X3Byb3BlcnR5X3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9wcm9wZXJ0eV9yZXBseV90IHsKLSAgICB1aW50OF90ICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgZm9ybWF0OyAKLSAgICB1aW50MTZfdCAgIHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCAgIGxlbmd0aDsgCi0gICAgeGNiX2F0b21fdCB0eXBlOyAKLSAgICB1aW50MzJfdCAgIGJ5dGVzX2FmdGVyOyAKLSAgICB1aW50MzJfdCAgIHZhbHVlX2xlbjsgCi0gICAgdWludDhfdCAgICBwYWQwWzEyXTsgCi19IHhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfcHJvcGVydGllc19jb29raWVfdCB7Ci0gICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAKLX0geGNiX2xpc3RfcHJvcGVydGllc19jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfTElTVF9QUk9QRVJUSUVTIDIxCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9saXN0X3Byb3BlcnRpZXNfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgIGxlbmd0aDsgCi0gICAgeGNiX3dpbmRvd190IHdpbmRvdzsgCi19IHhjYl9saXN0X3Byb3BlcnRpZXNfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9wcm9wZXJ0aWVzX3JlcGx5X3QgewotICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotICAgIHVpbnQxNl90IHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCBsZW5ndGg7IAotICAgIHVpbnQxNl90IGF0b21zX2xlbjsgCi0gICAgdWludDhfdCAgcGFkMVsyMl07IAotfSB4Y2JfbGlzdF9wcm9wZXJ0aWVzX3JlcGx5X3Q7Ci0KLSNkZWZpbmUgWENCX1NFVF9TRUxFQ1RJT05fT1dORVIgMjIKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9zZWxlY3Rpb25fb3duZXJfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX3dpbmRvd190ICAgIG93bmVyOyAKLSAgICB4Y2JfYXRvbV90ICAgICAgc2VsZWN0aW9uOyAKLSAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgCi19IHhjYl9zZXRfc2VsZWN0aW9uX293bmVyX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9HRVRfU0VMRUNUSU9OX09XTkVSIDIzCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICBsZW5ndGg7IAotICAgIHhjYl9hdG9tX3Qgc2VsZWN0aW9uOyAKLX0geGNiX2dldF9zZWxlY3Rpb25fb3duZXJfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9yZXBseV90IHsKLSAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgICAgIGxlbmd0aDsgCi0gICAgeGNiX3dpbmRvd190IG93bmVyOyAKLX0geGNiX2dldF9zZWxlY3Rpb25fb3duZXJfcmVwbHlfdDsKLQotI2RlZmluZSBYQ0JfQ09OVkVSVF9TRUxFQ1RJT04gMjQKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NvbnZlcnRfc2VsZWN0aW9uX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCAgICByZXF1ZXN0b3I7IAotICAgIHhjYl9hdG9tX3QgICAgICBzZWxlY3Rpb247IAotICAgIHhjYl9hdG9tX3QgICAgICB0YXJnZXQ7IAotICAgIHhjYl9hdG9tX3QgICAgICBwcm9wZXJ0eTsgCi0gICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IAotfSB4Y2JfY29udmVydF9zZWxlY3Rpb25fcmVxdWVzdF90OwotCi10eXBlZGVmIGVudW0geGNiX3NlbmRfZXZlbnRfZGVzdF90IHsKLSAgICBYQ0JfU0VORF9FVkVOVF9ERVNUX1BPSU5URVJfV0lORE9XID0gMCwKLSAgICBYQ0JfU0VORF9FVkVOVF9ERVNUX0lURU1fRk9DVVMgPSAxCi19IHhjYl9zZW5kX2V2ZW50X2Rlc3RfdDsKLQotI2RlZmluZSBYQ0JfU0VORF9FVkVOVCAyNQotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfc2VuZF9ldmVudF9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICBwcm9wYWdhdGU7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCBkZXN0aW5hdGlvbjsgCi0gICAgdWludDMyX3QgICAgIGV2ZW50X21hc2s7IAotICAgIGNoYXIgICAgICAgICBldmVudFszMl07IAotfSB4Y2Jfc2VuZF9ldmVudF9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfZ3JhYl9tb2RlX3QgewotICAgIFhDQl9HUkFCX01PREVfU1lOQyA9IDAsCi0gICAgWENCX0dSQUJfTU9ERV9BU1lOQyA9IDEKLX0geGNiX2dyYWJfbW9kZV90OwotCi10eXBlZGVmIGVudW0geGNiX2dyYWJfc3RhdHVzX3QgewotICAgIFhDQl9HUkFCX1NUQVRVU19TVUNDRVNTID0gMCwKLSAgICBYQ0JfR1JBQl9TVEFUVVNfQUxSRUFEWV9HUkFCQkVEID0gMSwKLSAgICBYQ0JfR1JBQl9TVEFUVVNfSU5WQUxJRF9USU1FID0gMiwKLSAgICBYQ0JfR1JBQl9TVEFUVVNfTk9UX1ZJRVdBQkxFID0gMywKLSAgICBYQ0JfR1JBQl9TVEFUVVNfRlJPWkVOID0gNAotfSB4Y2JfZ3JhYl9zdGF0dXNfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9jdXJzb3JfZW51bV90IHsKLSAgICBYQ0JfQ1VSU09SX05PTkUgPSAwCi19IHhjYl9jdXJzb3JfZW51bV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9wb2ludGVyX2Nvb2tpZV90IHsKLSAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IAotfSB4Y2JfZ3JhYl9wb2ludGVyX2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9HUkFCX1BPSU5URVIgMjYKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dyYWJfcG9pbnRlcl9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBvd25lcl9ldmVudHM7IAotICAgIHVpbnQxNl90ICAgICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCAgICBncmFiX3dpbmRvdzsgCi0gICAgdWludDE2X3QgICAgICAgIGV2ZW50X21hc2s7IAotICAgIHVpbnQ4X3QgICAgICAgICBwb2ludGVyX21vZGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBrZXlib2FyZF9tb2RlOyAKLSAgICB4Y2Jfd2luZG93X3QgICAgY29uZmluZV90bzsgCi0gICAgeGNiX2N1cnNvcl90ICAgIGN1cnNvcjsgCi0gICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IAotfSB4Y2JfZ3JhYl9wb2ludGVyX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dyYWJfcG9pbnRlcl9yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBzdGF0dXM7IAotICAgIHVpbnQxNl90IHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCBsZW5ndGg7IAotfSB4Y2JfZ3JhYl9wb2ludGVyX3JlcGx5X3Q7Ci0KLSNkZWZpbmUgWENCX1VOR1JBQl9QT0lOVEVSIDI3Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl91bmdyYWJfcG9pbnRlcl9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgCi19IHhjYl91bmdyYWJfcG9pbnRlcl9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfYnV0dG9uX2luZGV4X3QgewotICAgIFhDQl9CVVRUT05fSU5ERVhfQU5ZID0gMCwKLSAgICBYQ0JfQlVUVE9OX0lOREVYXzEgPSAxLAotICAgIFhDQl9CVVRUT05fSU5ERVhfMiA9IDIsCi0gICAgWENCX0JVVFRPTl9JTkRFWF8zID0gMywKLSAgICBYQ0JfQlVUVE9OX0lOREVYXzQgPSA0LAotICAgIFhDQl9CVVRUT05fSU5ERVhfNSA9IDUKLX0geGNiX2J1dHRvbl9pbmRleF90OwotCi0jZGVmaW5lIFhDQl9HUkFCX0JVVFRPTiAyOAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9idXR0b25fcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgb3duZXJfZXZlbnRzOyAKLSAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3QgZ3JhYl93aW5kb3c7IAotICAgIHVpbnQxNl90ICAgICBldmVudF9tYXNrOyAKLSAgICB1aW50OF90ICAgICAgcG9pbnRlcl9tb2RlOyAKLSAgICB1aW50OF90ICAgICAga2V5Ym9hcmRfbW9kZTsgCi0gICAgeGNiX3dpbmRvd190IGNvbmZpbmVfdG87IAotICAgIHhjYl9jdXJzb3JfdCBjdXJzb3I7IAotICAgIHVpbnQ4X3QgICAgICBidXR0b247IAotICAgIHVpbnQ4X3QgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgbW9kaWZpZXJzOyAKLX0geGNiX2dyYWJfYnV0dG9uX3JlcXVlc3RfdDsKLQotI2RlZmluZSBYQ0JfVU5HUkFCX0JVVFRPTiAyOQotCi10eXBlZGVmIHN0cnVjdCB4Y2JfdW5ncmFiX2J1dHRvbl9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICBidXR0b247IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCBncmFiX3dpbmRvdzsgCi0gICAgdWludDE2X3QgICAgIG1vZGlmaWVyczsgCi0gICAgdWludDhfdCAgICAgIHBhZDBbMl07IAotfSB4Y2JfdW5ncmFiX2J1dHRvbl9yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX0NIQU5HRV9BQ1RJVkVfUE9JTlRFUl9HUkFCIDMwCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9jaGFuZ2VfYWN0aXZlX3BvaW50ZXJfZ3JhYl9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfY3Vyc29yX3QgICAgY3Vyc29yOyAKLSAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgCi0gICAgdWludDE2X3QgICAgICAgIGV2ZW50X21hc2s7IAotICAgIHVpbnQ4X3QgICAgICAgICBwYWQxWzJdOyAKLX0geGNiX2NoYW5nZV9hY3RpdmVfcG9pbnRlcl9ncmFiX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dyYWJfa2V5Ym9hcmRfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9ncmFiX2tleWJvYXJkX2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9HUkFCX0tFWUJPQVJEIDMxCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9ncmFiX2tleWJvYXJkX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgIG93bmVyX2V2ZW50czsgCi0gICAgdWludDE2X3QgICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX3dpbmRvd190ICAgIGdyYWJfd2luZG93OyAKLSAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgCi0gICAgdWludDhfdCAgICAgICAgIHBvaW50ZXJfbW9kZTsgCi0gICAgdWludDhfdCAgICAgICAgIGtleWJvYXJkX21vZGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBwYWQwWzJdOyAKLX0geGNiX2dyYWJfa2V5Ym9hcmRfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9rZXlib2FyZF9yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBzdGF0dXM7IAotICAgIHVpbnQxNl90IHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCBsZW5ndGg7IAotfSB4Y2JfZ3JhYl9rZXlib2FyZF9yZXBseV90OwotCi0jZGVmaW5lIFhDQl9VTkdSQUJfS0VZQk9BUkQgMzIKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3VuZ3JhYl9rZXlib2FyZF9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgCi19IHhjYl91bmdyYWJfa2V5Ym9hcmRfcmVxdWVzdF90OwotCi10eXBlZGVmIGVudW0geGNiX2dyYWJfdCB7Ci0gICAgWENCX0dSQUJfQU5ZID0gMAotfSB4Y2JfZ3JhYl90OwotCi0jZGVmaW5lIFhDQl9HUkFCX0tFWSAzMwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9rZXlfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICBvd25lcl9ldmVudHM7IAotICAgIHVpbnQxNl90ICAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3QgIGdyYWJfd2luZG93OyAKLSAgICB1aW50MTZfdCAgICAgIG1vZGlmaWVyczsgCi0gICAgeGNiX2tleWNvZGVfdCBrZXk7IAotICAgIHVpbnQ4X3QgICAgICAgcG9pbnRlcl9tb2RlOyAKLSAgICB1aW50OF90ICAgICAgIGtleWJvYXJkX21vZGU7IAotICAgIHVpbnQ4X3QgICAgICAgcGFkMFszXTsgCi19IHhjYl9ncmFiX2tleV9yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX1VOR1JBQl9LRVkgMzQKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3VuZ3JhYl9rZXlfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgeGNiX2tleWNvZGVfdCBrZXk7IAotICAgIHVpbnQxNl90ICAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3QgIGdyYWJfd2luZG93OyAKLSAgICB1aW50MTZfdCAgICAgIG1vZGlmaWVyczsgCi0gICAgdWludDhfdCAgICAgICBwYWQwWzJdOyAKLX0geGNiX3VuZ3JhYl9rZXlfcmVxdWVzdF90OwotCi10eXBlZGVmIGVudW0geGNiX2FsbG93X3QgewotICAgIFhDQl9BTExPV19BU1lOQ19QT0lOVEVSID0gMCwKLSAgICBYQ0JfQUxMT1dfU1lOQ19QT0lOVEVSID0gMSwKLSAgICBYQ0JfQUxMT1dfUkVQTEFZX1BPSU5URVIgPSAyLAotICAgIFhDQl9BTExPV19BU1lOQ19LRVlCT0FSRCA9IDMsCi0gICAgWENCX0FMTE9XX1NZTkNfS0VZQk9BUkQgPSA0LAotICAgIFhDQl9BTExPV19SRVBMQVlfS0VZQk9BUkQgPSA1LAotICAgIFhDQl9BTExPV19BU1lOQ19CT1RIID0gNiwKLSAgICBYQ0JfQUxMT1dfU1lOQ19CT1RIID0gNwotfSB4Y2JfYWxsb3dfdDsKLQotI2RlZmluZSBYQ0JfQUxMT1dfRVZFTlRTIDM1Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9hbGxvd19ldmVudHNfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICAgbW9kZTsgCi0gICAgdWludDE2X3QgICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IAotfSB4Y2JfYWxsb3dfZXZlbnRzX3JlcXVlc3RfdDsKLQotI2RlZmluZSBYQ0JfR1JBQl9TRVJWRVIgMzYKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dyYWJfc2VydmVyX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotfSB4Y2JfZ3JhYl9zZXJ2ZXJfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9VTkdSQUJfU0VSVkVSIDM3Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl91bmdyYWJfc2VydmVyX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotfSB4Y2JfdW5ncmFiX3NlcnZlcl9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9wb2ludGVyX2Nvb2tpZV90IHsKLSAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IAotfSB4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfUVVFUllfUE9JTlRFUiAzOAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfcG9pbnRlcl9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLX0geGNiX3F1ZXJ5X3BvaW50ZXJfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfcG9pbnRlcl9yZXBseV90IHsKLSAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgIHNhbWVfc2NyZWVuOyAKLSAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCByb290OyAKLSAgICB4Y2Jfd2luZG93X3QgY2hpbGQ7IAotICAgIGludDE2X3QgICAgICByb290X3g7IAotICAgIGludDE2X3QgICAgICByb290X3k7IAotICAgIGludDE2X3QgICAgICB3aW5feDsgCi0gICAgaW50MTZfdCAgICAgIHdpbl95OyAKLSAgICB1aW50MTZfdCAgICAgbWFzazsgCi0gICAgdWludDhfdCAgICAgIHBhZDBbMl07IAotfSB4Y2JfcXVlcnlfcG9pbnRlcl9yZXBseV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfdGltZWNvb3JkX3QgewotICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAKLSAgICBpbnQxNl90ICAgICAgICAgeDsgCi0gICAgaW50MTZfdCAgICAgICAgIHk7IAotfSB4Y2JfdGltZWNvb3JkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl90aW1lY29vcmRfaXRlcmF0b3JfdCB7Ci0gICAgeGNiX3RpbWVjb29yZF90ICpkYXRhOyAKLSAgICBpbnQgICAgICAgICAgICAgIHJlbTsgCi0gICAgaW50ICAgICAgICAgICAgICBpbmRleDsgCi19IHhjYl90aW1lY29vcmRfaXRlcmF0b3JfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9tb3Rpb25fZXZlbnRzX2Nvb2tpZV90IHsKLSAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IAotfSB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX0dFVF9NT1RJT05fRVZFTlRTIDM5Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3QgICAgd2luZG93OyAKLSAgICB4Y2JfdGltZXN0YW1wX3Qgc3RhcnQ7IAotICAgIHhjYl90aW1lc3RhbXBfdCBzdG9wOyAKLX0geGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcGx5X3QgewotICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotICAgIHVpbnQxNl90IHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCBsZW5ndGg7IAotICAgIHVpbnQzMl90IGV2ZW50c19sZW47IAotICAgIHVpbnQ4X3QgIHBhZDFbMjBdOyAKLX0geGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcGx5X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX1RSQU5TTEFURV9DT09SRElOQVRFUyA0MAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCBzcmNfd2luZG93OyAKLSAgICB4Y2Jfd2luZG93X3QgZHN0X3dpbmRvdzsgCi0gICAgaW50MTZfdCAgICAgIHNyY194OyAKLSAgICBpbnQxNl90ICAgICAgc3JjX3k7IAotfSB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19yZXBseV90IHsKLSAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgIHNhbWVfc2NyZWVuOyAKLSAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCBjaGlsZDsgCi0gICAgaW50MTZfdCAgICAgIGRzdF94OyAKLSAgICBpbnQxNl90ICAgICAgZHN0X3k7IAotfSB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcGx5X3Q7Ci0KLSNkZWZpbmUgWENCX1dBUlBfUE9JTlRFUiA0MQotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfd2FycF9wb2ludGVyX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCBzcmNfd2luZG93OyAKLSAgICB4Y2Jfd2luZG93X3QgZHN0X3dpbmRvdzsgCi0gICAgaW50MTZfdCAgICAgIHNyY194OyAKLSAgICBpbnQxNl90ICAgICAgc3JjX3k7IAotICAgIHVpbnQxNl90ICAgICBzcmNfd2lkdGg7IAotICAgIHVpbnQxNl90ICAgICBzcmNfaGVpZ2h0OyAKLSAgICBpbnQxNl90ICAgICAgZHN0X3g7IAotICAgIGludDE2X3QgICAgICBkc3RfeTsgCi19IHhjYl93YXJwX3BvaW50ZXJfcmVxdWVzdF90OwotCi10eXBlZGVmIGVudW0geGNiX2lucHV0X2ZvY3VzX3QgewotICAgIFhDQl9JTlBVVF9GT0NVU19OT05FID0gMCwKLSAgICBYQ0JfSU5QVVRfRk9DVVNfUE9JTlRFUl9ST09UID0gMSwKLSAgICBYQ0JfSU5QVVRfRk9DVVNfUEFSRU5UID0gMiwKLSAgICBYQ0JfSU5QVVRfRk9DVVNfRk9MTE9XX0tFWUJPQVJEID0gMwotfSB4Y2JfaW5wdXRfZm9jdXNfdDsKLQotI2RlZmluZSBYQ0JfU0VUX0lOUFVUX0ZPQ1VTIDQyCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9zZXRfaW5wdXRfZm9jdXNfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICAgcmV2ZXJ0X3RvOyAKLSAgICB1aW50MTZfdCAgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3QgICAgZm9jdXM7IAotICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAKLX0geGNiX3NldF9pbnB1dF9mb2N1c19yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9nZXRfaW5wdXRfZm9jdXNfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9nZXRfaW5wdXRfZm9jdXNfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX0dFVF9JTlBVVF9GT0NVUyA0MwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2lucHV0X2ZvY3VzX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotfSB4Y2JfZ2V0X2lucHV0X2ZvY3VzX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9pbnB1dF9mb2N1c19yZXBseV90IHsKLSAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgICAgIHJldmVydF90bzsgCi0gICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3QgZm9jdXM7IAotfSB4Y2JfZ2V0X2lucHV0X2ZvY3VzX3JlcGx5X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9rZXltYXBfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9xdWVyeV9rZXltYXBfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX1FVRVJZX0tFWU1BUCA0NAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfa2V5bWFwX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotfSB4Y2JfcXVlcnlfa2V5bWFwX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2tleW1hcF9yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICB1aW50OF90ICBrZXlzWzMyXTsgCi19IHhjYl9xdWVyeV9rZXltYXBfcmVwbHlfdDsKLQotI2RlZmluZSBYQ0JfT1BFTl9GT05UIDQ1Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9vcGVuX2ZvbnRfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgIGxlbmd0aDsgCi0gICAgeGNiX2ZvbnRfdCBmaWQ7IAotICAgIHVpbnQxNl90ICAgbmFtZV9sZW47IAotICAgIHVpbnQ4X3QgICAgcGFkMVsyXTsgCi19IHhjYl9vcGVuX2ZvbnRfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9DTE9TRV9GT05UIDQ2Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9jbG9zZV9mb250X3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICBsZW5ndGg7IAotICAgIHhjYl9mb250X3QgZm9udDsgCi19IHhjYl9jbG9zZV9mb250X3JlcXVlc3RfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9mb250X2RyYXdfdCB7Ci0gICAgWENCX0ZPTlRfRFJBV19MRUZUX1RPX1JJR0hUID0gMCwKLSAgICBYQ0JfRk9OVF9EUkFXX1JJR0hUX1RPX0xFRlQgPSAxCi19IHhjYl9mb250X2RyYXdfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2ZvbnRwcm9wX3QgewotICAgIHhjYl9hdG9tX3QgbmFtZTsgCi0gICAgdWludDMyX3QgICB2YWx1ZTsgCi19IHhjYl9mb250cHJvcF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZm9udHByb3BfaXRlcmF0b3JfdCB7Ci0gICAgeGNiX2ZvbnRwcm9wX3QgKmRhdGE7IAotICAgIGludCAgICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgICBpbmRleDsgCi19IHhjYl9mb250cHJvcF9pdGVyYXRvcl90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfY2hhcmluZm9fdCB7Ci0gICAgaW50MTZfdCAgbGVmdF9zaWRlX2JlYXJpbmc7IAotICAgIGludDE2X3QgIHJpZ2h0X3NpZGVfYmVhcmluZzsgCi0gICAgaW50MTZfdCAgY2hhcmFjdGVyX3dpZHRoOyAKLSAgICBpbnQxNl90ICBhc2NlbnQ7IAotICAgIGludDE2X3QgIGRlc2NlbnQ7IAotICAgIHVpbnQxNl90IGF0dHJpYnV0ZXM7IAotfSB4Y2JfY2hhcmluZm9fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3QgewotICAgIHhjYl9jaGFyaW5mb190ICpkYXRhOyAKLSAgICBpbnQgICAgICAgICAgICAgcmVtOyAKLSAgICBpbnQgICAgICAgICAgICAgaW5kZXg7IAotfSB4Y2JfY2hhcmluZm9faXRlcmF0b3JfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2ZvbnRfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9xdWVyeV9mb250X2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9RVUVSWV9GT05UIDQ3Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9mb250X3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9mb250YWJsZV90IGZvbnQ7IAotfSB4Y2JfcXVlcnlfZm9udF9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgewotICAgIHVpbnQ4X3QgICAgICAgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgIHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9jaGFyaW5mb190IG1pbl9ib3VuZHM7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDFbNF07IAotICAgIHhjYl9jaGFyaW5mb190IG1heF9ib3VuZHM7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDJbNF07IAotICAgIHVpbnQxNl90ICAgICAgIG1pbl9jaGFyX29yX2J5dGUyOyAKLSAgICB1aW50MTZfdCAgICAgICBtYXhfY2hhcl9vcl9ieXRlMjsgCi0gICAgdWludDE2X3QgICAgICAgZGVmYXVsdF9jaGFyOyAKLSAgICB1aW50MTZfdCAgICAgICBwcm9wZXJ0aWVzX2xlbjsgCi0gICAgdWludDhfdCAgICAgICAgZHJhd19kaXJlY3Rpb247IAotICAgIHVpbnQ4X3QgICAgICAgIG1pbl9ieXRlMTsgCi0gICAgdWludDhfdCAgICAgICAgbWF4X2J5dGUxOyAKLSAgICB1aW50OF90ICAgICAgICBhbGxfY2hhcnNfZXhpc3Q7IAotICAgIGludDE2X3QgICAgICAgIGZvbnRfYXNjZW50OyAKLSAgICBpbnQxNl90ICAgICAgICBmb250X2Rlc2NlbnQ7IAotICAgIHVpbnQzMl90ICAgICAgIGNoYXJfaW5mb3NfbGVuOyAKLX0geGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdCB7Ci0gICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAKLX0geGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfUVVFUllfVEVYVF9FWFRFTlRTIDQ4Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIG9kZF9sZW5ndGg7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2ZvbnRhYmxlX3QgZm9udDsgCi19IHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3JlcGx5X3QgewotICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgIGRyYXdfZGlyZWN0aW9uOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICBpbnQxNl90ICBmb250X2FzY2VudDsgCi0gICAgaW50MTZfdCAgZm9udF9kZXNjZW50OyAKLSAgICBpbnQxNl90ICBvdmVyYWxsX2FzY2VudDsgCi0gICAgaW50MTZfdCAgb3ZlcmFsbF9kZXNjZW50OyAKLSAgICBpbnQzMl90ICBvdmVyYWxsX3dpZHRoOyAKLSAgICBpbnQzMl90ICBvdmVyYWxsX2xlZnQ7IAotICAgIGludDMyX3QgIG92ZXJhbGxfcmlnaHQ7IAotfSB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3JlcGx5X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zdHJfdCB7Ci0gICAgdWludDhfdCBuYW1lX2xlbjsgCi19IHhjYl9zdHJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3N0cl9pdGVyYXRvcl90IHsKLSAgICB4Y2Jfc3RyX3QgKmRhdGE7IAotICAgIGludCAgICAgICAgcmVtOyAKLSAgICBpbnQgICAgICAgIGluZGV4OyAKLX0geGNiX3N0cl9pdGVyYXRvcl90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9mb250c19jb29raWVfdCB7Ci0gICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAKLX0geGNiX2xpc3RfZm9udHNfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX0xJU1RfRk9OVFMgNDkKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfZm9udHNfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotICAgIHVpbnQxNl90IGxlbmd0aDsgCi0gICAgdWludDE2X3QgbWF4X25hbWVzOyAKLSAgICB1aW50MTZfdCBwYXR0ZXJuX2xlbjsgCi19IHhjYl9saXN0X2ZvbnRzX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfZm9udHNfcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3Qgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90IGxlbmd0aDsgCi0gICAgdWludDE2X3QgbmFtZXNfbGVuOyAKLSAgICB1aW50OF90ICBwYWQxWzIyXTsgCi19IHhjYl9saXN0X2ZvbnRzX3JlcGx5X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19jb29raWVfdCB7Ci0gICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAKLX0geGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9MSVNUX0ZPTlRTX1dJVEhfSU5GTyA1MAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotICAgIHVpbnQxNl90IGxlbmd0aDsgCi0gICAgdWludDE2X3QgbWF4X25hbWVzOyAKLSAgICB1aW50MTZfdCBwYXR0ZXJuX2xlbjsgCi19IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90IHsKLSAgICB1aW50OF90ICAgICAgICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICAgICAgICBuYW1lX2xlbjsgCi0gICAgdWludDE2X3QgICAgICAgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2NoYXJpbmZvX3QgbWluX2JvdW5kczsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMFs0XTsgCi0gICAgeGNiX2NoYXJpbmZvX3QgbWF4X2JvdW5kczsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMVs0XTsgCi0gICAgdWludDE2X3QgICAgICAgbWluX2NoYXJfb3JfYnl0ZTI7IAotICAgIHVpbnQxNl90ICAgICAgIG1heF9jaGFyX29yX2J5dGUyOyAKLSAgICB1aW50MTZfdCAgICAgICBkZWZhdWx0X2NoYXI7IAotICAgIHVpbnQxNl90ICAgICAgIHByb3BlcnRpZXNfbGVuOyAKLSAgICB1aW50OF90ICAgICAgICBkcmF3X2RpcmVjdGlvbjsgCi0gICAgdWludDhfdCAgICAgICAgbWluX2J5dGUxOyAKLSAgICB1aW50OF90ICAgICAgICBtYXhfYnl0ZTE7IAotICAgIHVpbnQ4X3QgICAgICAgIGFsbF9jaGFyc19leGlzdDsgCi0gICAgaW50MTZfdCAgICAgICAgZm9udF9hc2NlbnQ7IAotICAgIGludDE2X3QgICAgICAgIGZvbnRfZGVzY2VudDsgCi0gICAgdWludDMyX3QgICAgICAgcmVwbGllc19oaW50OyAKLX0geGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3Q7Ci0KLSNkZWZpbmUgWENCX1NFVF9GT05UX1BBVEggNTEKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9mb250X3BhdGhfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotICAgIHVpbnQxNl90IGxlbmd0aDsgCi0gICAgdWludDE2X3QgZm9udF9xdHk7IAotICAgIHVpbnQ4X3QgIHBhZDFbMl07IAotfSB4Y2Jfc2V0X2ZvbnRfcGF0aF9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9nZXRfZm9udF9wYXRoX2Nvb2tpZV90IHsKLSAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IAotfSB4Y2JfZ2V0X2ZvbnRfcGF0aF9jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfR0VUX0ZPTlRfUEFUSCA1MgotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3QgbGVuZ3RoOyAKLX0geGNiX2dldF9mb250X3BhdGhfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICB1aW50MTZfdCBwYXRoX2xlbjsgCi0gICAgdWludDhfdCAgcGFkMVsyMl07IAotfSB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseV90OwotCi0jZGVmaW5lIFhDQl9DUkVBVEVfUElYTUFQIDUzCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9jcmVhdGVfcGl4bWFwX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBkZXB0aDsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfcGl4bWFwX3QgICBwaWQ7IAotICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAKLSAgICB1aW50MTZfdCAgICAgICB3aWR0aDsgCi0gICAgdWludDE2X3QgICAgICAgaGVpZ2h0OyAKLX0geGNiX2NyZWF0ZV9waXhtYXBfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9GUkVFX1BJWE1BUCA1NAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZnJlZV9waXhtYXBfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgIGxlbmd0aDsgCi0gICAgeGNiX3BpeG1hcF90IHBpeG1hcDsgCi19IHhjYl9mcmVlX3BpeG1hcF9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfZ2NfdCB7Ci0gICAgWENCX0dDX0ZVTkNUSU9OID0gMSwKLSAgICBYQ0JfR0NfUExBTkVfTUFTSyA9IDIsCi0gICAgWENCX0dDX0ZPUkVHUk9VTkQgPSA0LAotICAgIFhDQl9HQ19CQUNLR1JPVU5EID0gOCwKLSAgICBYQ0JfR0NfTElORV9XSURUSCA9IDE2LAotICAgIFhDQl9HQ19MSU5FX1NUWUxFID0gMzIsCi0gICAgWENCX0dDX0NBUF9TVFlMRSA9IDY0LAotICAgIFhDQl9HQ19KT0lOX1NUWUxFID0gMTI4LAotICAgIFhDQl9HQ19GSUxMX1NUWUxFID0gMjU2LAotICAgIFhDQl9HQ19GSUxMX1JVTEUgPSA1MTIsCi0gICAgWENCX0dDX1RJTEUgPSAxMDI0LAotICAgIFhDQl9HQ19TVElQUExFID0gMjA0OCwKLSAgICBYQ0JfR0NfVElMRV9TVElQUExFX09SSUdJTl9YID0gNDA5NiwKLSAgICBYQ0JfR0NfVElMRV9TVElQUExFX09SSUdJTl9ZID0gODE5MiwKLSAgICBYQ0JfR0NfRk9OVCA9IDE2Mzg0LAotICAgIFhDQl9HQ19TVUJXSU5ET1dfTU9ERSA9IDMyNzY4LAotICAgIFhDQl9HQ19HUkFQSElDU19FWFBPU1VSRVMgPSA2NTUzNiwKLSAgICBYQ0JfR0NfQ0xJUF9PUklHSU5fWCA9IDEzMTA3MiwKLSAgICBYQ0JfR0NfQ0xJUF9PUklHSU5fWSA9IDI2MjE0NCwKLSAgICBYQ0JfR0NfQ0xJUF9NQVNLID0gNTI0Mjg4LAotICAgIFhDQl9HQ19EQVNIX09GRlNFVCA9IDEwNDg1NzYsCi0gICAgWENCX0dDX0RBU0hfTElTVCA9IDIwOTcxNTIsCi0gICAgWENCX0dDX0FSQ19NT0RFID0gNDE5NDMwNAotfSB4Y2JfZ2NfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9neF90IHsKLSAgICBYQ0JfR1hfQ0xFQVIgPSAwLAotICAgIFhDQl9HWF9BTkQgPSAxLAotICAgIFhDQl9HWF9BTkRfUkVWRVJTRSA9IDIsCi0gICAgWENCX0dYX0NPUFkgPSAzLAotICAgIFhDQl9HWF9BTkRfSU5WRVJURUQgPSA0LAotICAgIFhDQl9HWF9OT09QID0gNSwKLSAgICBYQ0JfR1hfWE9SID0gNiwKLSAgICBYQ0JfR1hfT1IgPSA3LAotICAgIFhDQl9HWF9OT1IgPSA4LAotICAgIFhDQl9HWF9FUVVJViA9IDksCi0gICAgWENCX0dYX0lOVkVSVCA9IDEwLAotICAgIFhDQl9HWF9PUl9SRVZFUlNFID0gMTEsCi0gICAgWENCX0dYX0NPUFlfSU5WRVJURUQgPSAxMiwKLSAgICBYQ0JfR1hfT1JfSU5WRVJURUQgPSAxMywKLSAgICBYQ0JfR1hfTkFORCA9IDE0LAotICAgIFhDQl9HWF9TRVQgPSAxNQotfSB4Y2JfZ3hfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9saW5lX3N0eWxlX3QgewotICAgIFhDQl9MSU5FX1NUWUxFX1NPTElEID0gMCwKLSAgICBYQ0JfTElORV9TVFlMRV9PTl9PRkZfREFTSCA9IDEsCi0gICAgWENCX0xJTkVfU1RZTEVfRE9VQkxFX0RBU0ggPSAyCi19IHhjYl9saW5lX3N0eWxlX3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfY2FwX3N0eWxlX3QgewotICAgIFhDQl9DQVBfU1RZTEVfTk9UX0xBU1QgPSAwLAotICAgIFhDQl9DQVBfU1RZTEVfQlVUVCA9IDEsCi0gICAgWENCX0NBUF9TVFlMRV9ST1VORCA9IDIsCi0gICAgWENCX0NBUF9TVFlMRV9QUk9KRUNUSU5HID0gMwotfSB4Y2JfY2FwX3N0eWxlX3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2Jfam9pbl9zdHlsZV90IHsKLSAgICBYQ0JfSk9JTl9TVFlMRV9NSVRFUiA9IDAsCi0gICAgWENCX0pPSU5fU1RZTEVfUk9VTkQgPSAxLAotICAgIFhDQl9KT0lOX1NUWUxFX0JFVkVMID0gMgotfSB4Y2Jfam9pbl9zdHlsZV90OwotCi10eXBlZGVmIGVudW0geGNiX2ZpbGxfc3R5bGVfdCB7Ci0gICAgWENCX0ZJTExfU1RZTEVfU09MSUQgPSAwLAotICAgIFhDQl9GSUxMX1NUWUxFX1RJTEVEID0gMSwKLSAgICBYQ0JfRklMTF9TVFlMRV9TVElQUExFRCA9IDIsCi0gICAgWENCX0ZJTExfU1RZTEVfT1BBUVVFX1NUSVBQTEVEID0gMwotfSB4Y2JfZmlsbF9zdHlsZV90OwotCi10eXBlZGVmIGVudW0geGNiX2ZpbGxfcnVsZV90IHsKLSAgICBYQ0JfRklMTF9SVUxFX0VWRU5fT0REID0gMCwKLSAgICBYQ0JfRklMTF9SVUxFX1dJTkRJTkcgPSAxCi19IHhjYl9maWxsX3J1bGVfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9zdWJ3aW5kb3dfbW9kZV90IHsKLSAgICBYQ0JfU1VCV0lORE9XX01PREVfQ0xJUF9CWV9DSElMRFJFTiA9IDAsCi0gICAgWENCX1NVQldJTkRPV19NT0RFX0lOQ0xVREVfSU5GRVJJT1JTID0gMQotfSB4Y2Jfc3Vid2luZG93X21vZGVfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9hcmNfbW9kZV90IHsKLSAgICBYQ0JfQVJDX01PREVfQ0hPUkQgPSAwLAotICAgIFhDQl9BUkNfTU9ERV9QSUVfU0xJQ0UgPSAxCi19IHhjYl9hcmNfbW9kZV90OwotCi0jZGVmaW5lIFhDQl9DUkVBVEVfR0MgNTUKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NyZWF0ZV9nY19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfZ2NvbnRleHRfdCBjaWQ7IAotICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAKLSAgICB1aW50MzJfdCAgICAgICB2YWx1ZV9tYXNrOyAKLX0geGNiX2NyZWF0ZV9nY19yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX0NIQU5HRV9HQyA1NgotCi10eXBlZGVmIHN0cnVjdCB4Y2JfY2hhbmdlX2djX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9nY29udGV4dF90IGdjOyAKLSAgICB1aW50MzJfdCAgICAgICB2YWx1ZV9tYXNrOyAKLX0geGNiX2NoYW5nZV9nY19yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX0NPUFlfR0MgNTcKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NvcHlfZ2NfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2djb250ZXh0X3Qgc3JjX2djOyAKLSAgICB4Y2JfZ2NvbnRleHRfdCBkc3RfZ2M7IAotICAgIHVpbnQzMl90ICAgICAgIHZhbHVlX21hc2s7IAotfSB4Y2JfY29weV9nY19yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX1NFVF9EQVNIRVMgNTgKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9kYXNoZXNfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2djb250ZXh0X3QgZ2M7IAotICAgIHVpbnQxNl90ICAgICAgIGRhc2hfb2Zmc2V0OyAKLSAgICB1aW50MTZfdCAgICAgICBkYXNoZXNfbGVuOyAKLX0geGNiX3NldF9kYXNoZXNfcmVxdWVzdF90OwotCi10eXBlZGVmIGVudW0geGNiX2NsaXBfb3JkZXJpbmdfdCB7Ci0gICAgWENCX0NMSVBfT1JERVJJTkdfVU5TT1JURUQgPSAwLAotICAgIFhDQl9DTElQX09SREVSSU5HX1lfU09SVEVEID0gMSwKLSAgICBYQ0JfQ0xJUF9PUkRFUklOR19ZWF9TT1JURUQgPSAyLAotICAgIFhDQl9DTElQX09SREVSSU5HX1lYX0JBTkRFRCA9IDMKLX0geGNiX2NsaXBfb3JkZXJpbmdfdDsKLQotI2RlZmluZSBYQ0JfU0VUX0NMSVBfUkVDVEFOR0xFUyA1OQotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0X2NsaXBfcmVjdGFuZ2xlc19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgb3JkZXJpbmc7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2djb250ZXh0X3QgZ2M7IAotICAgIGludDE2X3QgICAgICAgIGNsaXBfeF9vcmlnaW47IAotICAgIGludDE2X3QgICAgICAgIGNsaXBfeV9vcmlnaW47IAotfSB4Y2Jfc2V0X2NsaXBfcmVjdGFuZ2xlc19yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX0ZSRUVfR0MgNjAKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2ZyZWVfZ2NfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2djb250ZXh0X3QgZ2M7IAotfSB4Y2JfZnJlZV9nY19yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX0NMRUFSX0FSRUEgNjEKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NsZWFyX2FyZWFfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgZXhwb3N1cmVzOyAKLSAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAKLSAgICBpbnQxNl90ICAgICAgeDsgCi0gICAgaW50MTZfdCAgICAgIHk7IAotICAgIHVpbnQxNl90ICAgICB3aWR0aDsgCi0gICAgdWludDE2X3QgICAgIGhlaWdodDsgCi19IHhjYl9jbGVhcl9hcmVhX3JlcXVlc3RfdDsKLQotI2RlZmluZSBYQ0JfQ09QWV9BUkVBIDYyCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9jb3B5X2FyZWFfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2RyYXdhYmxlX3Qgc3JjX2RyYXdhYmxlOyAKLSAgICB4Y2JfZHJhd2FibGVfdCBkc3RfZHJhd2FibGU7IAotICAgIHhjYl9nY29udGV4dF90IGdjOyAKLSAgICBpbnQxNl90ICAgICAgICBzcmNfeDsgCi0gICAgaW50MTZfdCAgICAgICAgc3JjX3k7IAotICAgIGludDE2X3QgICAgICAgIGRzdF94OyAKLSAgICBpbnQxNl90ICAgICAgICBkc3RfeTsgCi0gICAgdWludDE2X3QgICAgICAgd2lkdGg7IAotICAgIHVpbnQxNl90ICAgICAgIGhlaWdodDsgCi19IHhjYl9jb3B5X2FyZWFfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9DT1BZX1BMQU5FIDYzCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9jb3B5X3BsYW5lX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9kcmF3YWJsZV90IHNyY19kcmF3YWJsZTsgCi0gICAgeGNiX2RyYXdhYmxlX3QgZHN0X2RyYXdhYmxlOyAKLSAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgCi0gICAgaW50MTZfdCAgICAgICAgc3JjX3g7IAotICAgIGludDE2X3QgICAgICAgIHNyY195OyAKLSAgICBpbnQxNl90ICAgICAgICBkc3RfeDsgCi0gICAgaW50MTZfdCAgICAgICAgZHN0X3k7IAotICAgIHVpbnQxNl90ICAgICAgIHdpZHRoOyAKLSAgICB1aW50MTZfdCAgICAgICBoZWlnaHQ7IAotICAgIHVpbnQzMl90ICAgICAgIGJpdF9wbGFuZTsgCi19IHhjYl9jb3B5X3BsYW5lX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9jb29yZF9tb2RlX3QgewotICAgIFhDQl9DT09SRF9NT0RFX09SSUdJTiA9IDAsCi0gICAgWENCX0NPT1JEX01PREVfUFJFVklPVVMgPSAxCi19IHhjYl9jb29yZF9tb2RlX3Q7Ci0KLSNkZWZpbmUgWENCX1BPTFlfUE9JTlQgNjQKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3BvbHlfcG9pbnRfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIGNvb3JkaW5hdGVfbW9kZTsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgCi0gICAgeGNiX2djb250ZXh0X3QgZ2M7IAotfSB4Y2JfcG9seV9wb2ludF9yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX1BPTFlfTElORSA2NQotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcG9seV9saW5lX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBjb29yZGluYXRlX21vZGU7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IAotICAgIHhjYl9nY29udGV4dF90IGdjOyAKLX0geGNiX3BvbHlfbGluZV9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zZWdtZW50X3QgewotICAgIGludDE2X3QgeDE7IAotICAgIGludDE2X3QgeTE7IAotICAgIGludDE2X3QgeDI7IAotICAgIGludDE2X3QgeTI7IAotfSB4Y2Jfc2VnbWVudF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfc2VnbWVudF9pdGVyYXRvcl90IHsKLSAgICB4Y2Jfc2VnbWVudF90ICpkYXRhOyAKLSAgICBpbnQgICAgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgICAgIGluZGV4OyAKLX0geGNiX3NlZ21lbnRfaXRlcmF0b3JfdDsKLQotI2RlZmluZSBYQ0JfUE9MWV9TRUdNRU5UIDY2Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9wb2x5X3NlZ21lbnRfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IAotICAgIHhjYl9nY29udGV4dF90IGdjOyAKLX0geGNiX3BvbHlfc2VnbWVudF9yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX1BPTFlfUkVDVEFOR0xFIDY3Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9wb2x5X3JlY3RhbmdsZV9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgCi0gICAgeGNiX2djb250ZXh0X3QgZ2M7IAotfSB4Y2JfcG9seV9yZWN0YW5nbGVfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9QT0xZX0FSQyA2OAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcG9seV9hcmNfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IAotICAgIHhjYl9nY29udGV4dF90IGdjOyAKLX0geGNiX3BvbHlfYXJjX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9wb2x5X3NoYXBlX3QgewotICAgIFhDQl9QT0xZX1NIQVBFX0NPTVBMRVggPSAwLAotICAgIFhDQl9QT0xZX1NIQVBFX05PTkNPTlZFWCA9IDEsCi0gICAgWENCX1BPTFlfU0hBUEVfQ09OVkVYID0gMgotfSB4Y2JfcG9seV9zaGFwZV90OwotCi0jZGVmaW5lIFhDQl9GSUxMX1BPTFkgNjkKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2ZpbGxfcG9seV9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgCi0gICAgeGNiX2djb250ZXh0X3QgZ2M7IAotICAgIHVpbnQ4X3QgICAgICAgIHNoYXBlOyAKLSAgICB1aW50OF90ICAgICAgICBjb29yZGluYXRlX21vZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDFbMl07IAotfSB4Y2JfZmlsbF9wb2x5X3JlcXVlc3RfdDsKLQotI2RlZmluZSBYQ0JfUE9MWV9GSUxMX1JFQ1RBTkdMRSA3MAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcG9seV9maWxsX3JlY3RhbmdsZV9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgCi0gICAgeGNiX2djb250ZXh0X3QgZ2M7IAotfSB4Y2JfcG9seV9maWxsX3JlY3RhbmdsZV9yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX1BPTFlfRklMTF9BUkMgNzEKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3BvbHlfZmlsbF9hcmNfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IAotICAgIHhjYl9nY29udGV4dF90IGdjOyAKLX0geGNiX3BvbHlfZmlsbF9hcmNfcmVxdWVzdF90OwotCi10eXBlZGVmIGVudW0geGNiX2ltYWdlX2Zvcm1hdF90IHsKLSAgICBYQ0JfSU1BR0VfRk9STUFUX1hZX0JJVE1BUCA9IDAsCi0gICAgWENCX0lNQUdFX0ZPUk1BVF9YWV9QSVhNQVAgPSAxLAotICAgIFhDQl9JTUFHRV9GT1JNQVRfWl9QSVhNQVAgPSAyCi19IHhjYl9pbWFnZV9mb3JtYXRfdDsKLQotI2RlZmluZSBYQ0JfUFVUX0lNQUdFIDcyCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9wdXRfaW1hZ2VfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIGZvcm1hdDsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgCi0gICAgeGNiX2djb250ZXh0X3QgZ2M7IAotICAgIHVpbnQxNl90ICAgICAgIHdpZHRoOyAKLSAgICB1aW50MTZfdCAgICAgICBoZWlnaHQ7IAotICAgIGludDE2X3QgICAgICAgIGRzdF94OyAKLSAgICBpbnQxNl90ICAgICAgICBkc3RfeTsgCi0gICAgdWludDhfdCAgICAgICAgbGVmdF9wYWQ7IAotICAgIHVpbnQ4X3QgICAgICAgIGRlcHRoOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwWzJdOyAKLX0geGNiX3B1dF9pbWFnZV9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9nZXRfaW1hZ2VfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9nZXRfaW1hZ2VfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX0dFVF9JTUFHRSA3MwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2ltYWdlX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBmb3JtYXQ7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IAotICAgIGludDE2X3QgICAgICAgIHg7IAotICAgIGludDE2X3QgICAgICAgIHk7IAotICAgIHVpbnQxNl90ICAgICAgIHdpZHRoOyAKLSAgICB1aW50MTZfdCAgICAgICBoZWlnaHQ7IAotICAgIHVpbnQzMl90ICAgICAgIHBsYW5lX21hc2s7IAotfSB4Y2JfZ2V0X2ltYWdlX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9pbWFnZV9yZXBseV90IHsKLSAgICB1aW50OF90ICAgICAgICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICAgICAgICBkZXB0aDsgCi0gICAgdWludDE2X3QgICAgICAgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX3Zpc3VhbGlkX3QgdmlzdWFsOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwWzIwXTsgCi19IHhjYl9nZXRfaW1hZ2VfcmVwbHlfdDsKLQotI2RlZmluZSBYQ0JfUE9MWV9URVhUXzggNzQKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3BvbHlfdGV4dF84X3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAKLSAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgCi0gICAgaW50MTZfdCAgICAgICAgeDsgCi0gICAgaW50MTZfdCAgICAgICAgeTsgCi19IHhjYl9wb2x5X3RleHRfOF9yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX1BPTFlfVEVYVF8xNiA3NQotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcG9seV90ZXh0XzE2X3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAKLSAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgCi0gICAgaW50MTZfdCAgICAgICAgeDsgCi0gICAgaW50MTZfdCAgICAgICAgeTsgCi19IHhjYl9wb2x5X3RleHRfMTZfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9JTUFHRV9URVhUXzggNzYKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2ltYWdlX3RleHRfOF9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgc3RyaW5nX2xlbjsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgCi0gICAgeGNiX2djb250ZXh0X3QgZ2M7IAotICAgIGludDE2X3QgICAgICAgIHg7IAotICAgIGludDE2X3QgICAgICAgIHk7IAotfSB4Y2JfaW1hZ2VfdGV4dF84X3JlcXVlc3RfdDsKLQotI2RlZmluZSBYQ0JfSU1BR0VfVEVYVF8xNiA3NwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfaW1hZ2VfdGV4dF8xNl9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgc3RyaW5nX2xlbjsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgCi0gICAgeGNiX2djb250ZXh0X3QgZ2M7IAotICAgIGludDE2X3QgICAgICAgIHg7IAotICAgIGludDE2X3QgICAgICAgIHk7IAotfSB4Y2JfaW1hZ2VfdGV4dF8xNl9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfY29sb3JtYXBfYWxsb2NfdCB7Ci0gICAgWENCX0NPTE9STUFQX0FMTE9DX05PTkUgPSAwLAotICAgIFhDQl9DT0xPUk1BUF9BTExPQ19BTEwgPSAxCi19IHhjYl9jb2xvcm1hcF9hbGxvY190OwotCi0jZGVmaW5lIFhDQl9DUkVBVEVfQ09MT1JNQVAgNzgKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NyZWF0ZV9jb2xvcm1hcF9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgYWxsb2M7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2NvbG9ybWFwX3QgbWlkOyAKLSAgICB4Y2Jfd2luZG93X3QgICB3aW5kb3c7IAotICAgIHhjYl92aXN1YWxpZF90IHZpc3VhbDsgCi19IHhjYl9jcmVhdGVfY29sb3JtYXBfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9GUkVFX0NPTE9STUFQIDc5Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9mcmVlX2NvbG9ybWFwX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IAotfSB4Y2JfZnJlZV9jb2xvcm1hcF9yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX0NPUFlfQ09MT1JNQVBfQU5EX0ZSRUUgODAKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NvcHlfY29sb3JtYXBfYW5kX2ZyZWVfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2NvbG9ybWFwX3QgbWlkOyAKLSAgICB4Y2JfY29sb3JtYXBfdCBzcmNfY21hcDsgCi19IHhjYl9jb3B5X2NvbG9ybWFwX2FuZF9mcmVlX3JlcXVlc3RfdDsKLQotI2RlZmluZSBYQ0JfSU5TVEFMTF9DT0xPUk1BUCA4MQotCi10eXBlZGVmIHN0cnVjdCB4Y2JfaW5zdGFsbF9jb2xvcm1hcF9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfY29sb3JtYXBfdCBjbWFwOyAKLX0geGNiX2luc3RhbGxfY29sb3JtYXBfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9VTklOU1RBTExfQ09MT1JNQVAgODIKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3VuaW5zdGFsbF9jb2xvcm1hcF9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfY29sb3JtYXBfdCBjbWFwOyAKLX0geGNiX3VuaW5zdGFsbF9jb2xvcm1hcF9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX0xJU1RfSU5TVEFMTEVEX0NPTE9STUFQUyA4MwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IAotfSB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICB1aW50MTZfdCBjbWFwc19sZW47IAotICAgIHVpbnQ4X3QgIHBhZDFbMjJdOyAKLX0geGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfYWxsb2NfY29sb3JfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9hbGxvY19jb2xvcl9jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfQUxMT0NfQ09MT1IgODQKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX2NvbG9yX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IAotICAgIHVpbnQxNl90ICAgICAgIHJlZDsgCi0gICAgdWludDE2X3QgICAgICAgZ3JlZW47IAotICAgIHVpbnQxNl90ICAgICAgIGJsdWU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDFbMl07IAotfSB4Y2JfYWxsb2NfY29sb3JfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfYWxsb2NfY29sb3JfcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3Qgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90IGxlbmd0aDsgCi0gICAgdWludDE2X3QgcmVkOyAKLSAgICB1aW50MTZfdCBncmVlbjsgCi0gICAgdWludDE2X3QgYmx1ZTsgCi0gICAgdWludDhfdCAgcGFkMVsyXTsgCi0gICAgdWludDMyX3QgcGl4ZWw7IAotfSB4Y2JfYWxsb2NfY29sb3JfcmVwbHlfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX25hbWVkX2NvbG9yX2Nvb2tpZV90IHsKLSAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IAotfSB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX0FMTE9DX05BTUVEX0NPTE9SIDg1Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9hbGxvY19uYW1lZF9jb2xvcl9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfY29sb3JtYXBfdCBjbWFwOyAKLSAgICB1aW50MTZfdCAgICAgICBuYW1lX2xlbjsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMVsyXTsgCi19IHhjYl9hbGxvY19uYW1lZF9jb2xvcl9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9hbGxvY19uYW1lZF9jb2xvcl9yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICB1aW50MzJfdCBwaXhlbDsgCi0gICAgdWludDE2X3QgZXhhY3RfcmVkOyAKLSAgICB1aW50MTZfdCBleGFjdF9ncmVlbjsgCi0gICAgdWludDE2X3QgZXhhY3RfYmx1ZTsgCi0gICAgdWludDE2X3QgdmlzdWFsX3JlZDsgCi0gICAgdWludDE2X3QgdmlzdWFsX2dyZWVuOyAKLSAgICB1aW50MTZfdCB2aXN1YWxfYmx1ZTsgCi19IHhjYl9hbGxvY19uYW1lZF9jb2xvcl9yZXBseV90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9hbGxvY19jb2xvcl9jZWxsc19jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfQUxMT0NfQ09MT1JfQ0VMTFMgODYKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBjb250aWd1b3VzOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IAotICAgIHVpbnQxNl90ICAgICAgIGNvbG9yczsgCi0gICAgdWludDE2X3QgICAgICAgcGxhbmVzOyAKLX0geGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgewotICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotICAgIHVpbnQxNl90IHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCBsZW5ndGg7IAotICAgIHVpbnQxNl90IHBpeGVsc19sZW47IAotICAgIHVpbnQxNl90IG1hc2tzX2xlbjsgCi0gICAgdWludDhfdCAgcGFkMVsyMF07IAotfSB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19jb29raWVfdCB7Ci0gICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAKLX0geGNiX2FsbG9jX2NvbG9yX3BsYW5lc19jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfQUxMT0NfQ09MT1JfUExBTkVTIDg3Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIGNvbnRpZ3VvdXM7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2NvbG9ybWFwX3QgY21hcDsgCi0gICAgdWludDE2X3QgICAgICAgY29sb3JzOyAKLSAgICB1aW50MTZfdCAgICAgICByZWRzOyAKLSAgICB1aW50MTZfdCAgICAgICBncmVlbnM7IAotICAgIHVpbnQxNl90ICAgICAgIGJsdWVzOyAKLX0geGNiX2FsbG9jX2NvbG9yX3BsYW5lc19yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3Qgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90IGxlbmd0aDsgCi0gICAgdWludDE2X3QgcGl4ZWxzX2xlbjsgCi0gICAgdWludDhfdCAgcGFkMVsyXTsgCi0gICAgdWludDMyX3QgcmVkX21hc2s7IAotICAgIHVpbnQzMl90IGdyZWVuX21hc2s7IAotICAgIHVpbnQzMl90IGJsdWVfbWFzazsgCi0gICAgdWludDhfdCAgcGFkMls4XTsgCi19IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdDsKLQotI2RlZmluZSBYQ0JfRlJFRV9DT0xPUlMgODgKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2ZyZWVfY29sb3JzX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IAotICAgIHVpbnQzMl90ICAgICAgIHBsYW5lX21hc2s7IAotfSB4Y2JfZnJlZV9jb2xvcnNfcmVxdWVzdF90OwotCi10eXBlZGVmIGVudW0geGNiX2NvbG9yX2ZsYWdfdCB7Ci0gICAgWENCX0NPTE9SX0ZMQUdfUkVEID0gMSwKLSAgICBYQ0JfQ09MT1JfRkxBR19HUkVFTiA9IDIsCi0gICAgWENCX0NPTE9SX0ZMQUdfQkxVRSA9IDQKLX0geGNiX2NvbG9yX2ZsYWdfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NvbG9yaXRlbV90IHsKLSAgICB1aW50MzJfdCBwaXhlbDsgCi0gICAgdWludDE2X3QgcmVkOyAKLSAgICB1aW50MTZfdCBncmVlbjsgCi0gICAgdWludDE2X3QgYmx1ZTsgCi0gICAgdWludDhfdCAgZmxhZ3M7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotfSB4Y2JfY29sb3JpdGVtX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9jb2xvcml0ZW1faXRlcmF0b3JfdCB7Ci0gICAgeGNiX2NvbG9yaXRlbV90ICpkYXRhOyAKLSAgICBpbnQgICAgICAgICAgICAgIHJlbTsgCi0gICAgaW50ICAgICAgICAgICAgICBpbmRleDsgCi19IHhjYl9jb2xvcml0ZW1faXRlcmF0b3JfdDsKLQotI2RlZmluZSBYQ0JfU1RPUkVfQ09MT1JTIDg5Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zdG9yZV9jb2xvcnNfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgCi0gICAgeGNiX2NvbG9ybWFwX3QgY21hcDsgCi19IHhjYl9zdG9yZV9jb2xvcnNfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9TVE9SRV9OQU1FRF9DT0xPUiA5MAotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfc3RvcmVfbmFtZWRfY29sb3JfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIGZsYWdzOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IAotICAgIHVpbnQzMl90ICAgICAgIHBpeGVsOyAKLSAgICB1aW50MTZfdCAgICAgICBuYW1lX2xlbjsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMFsyXTsgCi19IHhjYl9zdG9yZV9uYW1lZF9jb2xvcl9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9yZ2JfdCB7Ci0gICAgdWludDE2X3QgcmVkOyAKLSAgICB1aW50MTZfdCBncmVlbjsgCi0gICAgdWludDE2X3QgYmx1ZTsgCi0gICAgdWludDhfdCAgcGFkMFsyXTsgCi19IHhjYl9yZ2JfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3JnYl9pdGVyYXRvcl90IHsKLSAgICB4Y2JfcmdiX3QgKmRhdGE7IAotICAgIGludCAgICAgICAgcmVtOyAKLSAgICBpbnQgICAgICAgIGluZGV4OyAKLX0geGNiX3JnYl9pdGVyYXRvcl90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfY29sb3JzX2Nvb2tpZV90IHsKLSAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IAotfSB4Y2JfcXVlcnlfY29sb3JzX2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9RVUVSWV9DT0xPUlMgOTEKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2NvbG9yc19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfY29sb3JtYXBfdCBjbWFwOyAKLX0geGNiX3F1ZXJ5X2NvbG9yc19yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9jb2xvcnNfcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3Qgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90IGxlbmd0aDsgCi0gICAgdWludDE2X3QgY29sb3JzX2xlbjsgCi0gICAgdWludDhfdCAgcGFkMVsyMl07IAotfSB4Y2JfcXVlcnlfY29sb3JzX3JlcGx5X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9sb29rdXBfY29sb3JfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9sb29rdXBfY29sb3JfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX0xPT0tVUF9DT0xPUiA5MgotCi10eXBlZGVmIHN0cnVjdCB4Y2JfbG9va3VwX2NvbG9yX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IAotICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IAotICAgIHVpbnQxNl90ICAgICAgIG5hbWVfbGVuOyAKLSAgICB1aW50OF90ICAgICAgICBwYWQxWzJdOyAKLX0geGNiX2xvb2t1cF9jb2xvcl9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9sb29rdXBfY29sb3JfcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3Qgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90IGxlbmd0aDsgCi0gICAgdWludDE2X3QgZXhhY3RfcmVkOyAKLSAgICB1aW50MTZfdCBleGFjdF9ncmVlbjsgCi0gICAgdWludDE2X3QgZXhhY3RfYmx1ZTsgCi0gICAgdWludDE2X3QgdmlzdWFsX3JlZDsgCi0gICAgdWludDE2X3QgdmlzdWFsX2dyZWVuOyAKLSAgICB1aW50MTZfdCB2aXN1YWxfYmx1ZTsgCi19IHhjYl9sb29rdXBfY29sb3JfcmVwbHlfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9waXhtYXBfZW51bV90IHsKLSAgICBYQ0JfUElYTUFQX05PTkUgPSAwCi19IHhjYl9waXhtYXBfZW51bV90OwotCi0jZGVmaW5lIFhDQl9DUkVBVEVfQ1VSU09SIDkzCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9jcmVhdGVfY3Vyc29yX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl9jdXJzb3JfdCBjaWQ7IAotICAgIHhjYl9waXhtYXBfdCBzb3VyY2U7IAotICAgIHhjYl9waXhtYXBfdCBtYXNrOyAKLSAgICB1aW50MTZfdCAgICAgZm9yZV9yZWQ7IAotICAgIHVpbnQxNl90ICAgICBmb3JlX2dyZWVuOyAKLSAgICB1aW50MTZfdCAgICAgZm9yZV9ibHVlOyAKLSAgICB1aW50MTZfdCAgICAgYmFja19yZWQ7IAotICAgIHVpbnQxNl90ICAgICBiYWNrX2dyZWVuOyAKLSAgICB1aW50MTZfdCAgICAgYmFja19ibHVlOyAKLSAgICB1aW50MTZfdCAgICAgeDsgCi0gICAgdWludDE2X3QgICAgIHk7IAotfSB4Y2JfY3JlYXRlX2N1cnNvcl9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfZm9udF9lbnVtX3QgewotICAgIFhDQl9GT05UX05PTkUgPSAwCi19IHhjYl9mb250X2VudW1fdDsKLQotI2RlZmluZSBYQ0JfQ1JFQVRFX0dMWVBIX0NVUlNPUiA5NAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfY3JlYXRlX2dseXBoX2N1cnNvcl9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICBwYWQwOyAKLSAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfY3Vyc29yX3QgY2lkOyAKLSAgICB4Y2JfZm9udF90ICAgc291cmNlX2ZvbnQ7IAotICAgIHhjYl9mb250X3QgICBtYXNrX2ZvbnQ7IAotICAgIHVpbnQxNl90ICAgICBzb3VyY2VfY2hhcjsgCi0gICAgdWludDE2X3QgICAgIG1hc2tfY2hhcjsgCi0gICAgdWludDE2X3QgICAgIGZvcmVfcmVkOyAKLSAgICB1aW50MTZfdCAgICAgZm9yZV9ncmVlbjsgCi0gICAgdWludDE2X3QgICAgIGZvcmVfYmx1ZTsgCi0gICAgdWludDE2X3QgICAgIGJhY2tfcmVkOyAKLSAgICB1aW50MTZfdCAgICAgYmFja19ncmVlbjsgCi0gICAgdWludDE2X3QgICAgIGJhY2tfYmx1ZTsgCi19IHhjYl9jcmVhdGVfZ2x5cGhfY3Vyc29yX3JlcXVlc3RfdDsKLQotI2RlZmluZSBYQ0JfRlJFRV9DVVJTT1IgOTUKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2ZyZWVfY3Vyc29yX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl9jdXJzb3JfdCBjdXJzb3I7IAotfSB4Y2JfZnJlZV9jdXJzb3JfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9SRUNPTE9SX0NVUlNPUiA5NgotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcmVjb2xvcl9jdXJzb3JfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgcGFkMDsgCi0gICAgdWludDE2X3QgICAgIGxlbmd0aDsgCi0gICAgeGNiX2N1cnNvcl90IGN1cnNvcjsgCi0gICAgdWludDE2X3QgICAgIGZvcmVfcmVkOyAKLSAgICB1aW50MTZfdCAgICAgZm9yZV9ncmVlbjsgCi0gICAgdWludDE2X3QgICAgIGZvcmVfYmx1ZTsgCi0gICAgdWludDE2X3QgICAgIGJhY2tfcmVkOyAKLSAgICB1aW50MTZfdCAgICAgYmFja19ncmVlbjsgCi0gICAgdWludDE2X3QgICAgIGJhY2tfYmx1ZTsgCi19IHhjYl9yZWNvbG9yX2N1cnNvcl9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfcXVlcnlfc2hhcGVfb2ZfdCB7Ci0gICAgWENCX1FVRVJZX1NIQVBFX09GX0xBUkdFU1RfQ1VSU09SID0gMCwKLSAgICBYQ0JfUVVFUllfU0hBUEVfT0ZfRkFTVEVTVF9USUxFID0gMSwKLSAgICBYQ0JfUVVFUllfU0hBUEVfT0ZfRkFTVEVTVF9TVElQUExFID0gMgotfSB4Y2JfcXVlcnlfc2hhcGVfb2ZfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9jb29raWVfdCB7Ci0gICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAKLX0geGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfUVVFUllfQkVTVF9TSVpFIDk3Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9iZXN0X3NpemVfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgIF9jbGFzczsgCi0gICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAKLSAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgCi0gICAgdWludDE2X3QgICAgICAgd2lkdGg7IAotICAgIHVpbnQxNl90ICAgICAgIGhlaWdodDsgCi19IHhjYl9xdWVyeV9iZXN0X3NpemVfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfYmVzdF9zaXplX3JlcGx5X3QgewotICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotICAgIHVpbnQxNl90IHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCBsZW5ndGg7IAotICAgIHVpbnQxNl90IHdpZHRoOyAKLSAgICB1aW50MTZfdCBoZWlnaHQ7IAotfSB4Y2JfcXVlcnlfYmVzdF9zaXplX3JlcGx5X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9leHRlbnNpb25fY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9xdWVyeV9leHRlbnNpb25fY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX1FVRVJZX0VYVEVOU0lPTiA5OAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotICAgIHVpbnQxNl90IG5hbWVfbGVuOyAKLSAgICB1aW50OF90ICBwYWQxWzJdOyAKLX0geGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9leHRlbnNpb25fcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3Qgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90IGxlbmd0aDsgCi0gICAgdWludDhfdCAgcHJlc2VudDsgCi0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBmaXJzdF9ldmVudDsgCi0gICAgdWludDhfdCAgZmlyc3RfZXJyb3I7IAotfSB4Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcGx5X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9saXN0X2V4dGVuc2lvbnNfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9saXN0X2V4dGVuc2lvbnNfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX0xJU1RfRVhURU5TSU9OUyA5OQotCi10eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotfSB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfZXh0ZW5zaW9uc19yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBuYW1lc19sZW47IAotICAgIHVpbnQxNl90IHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCBsZW5ndGg7IAotICAgIHVpbnQ4X3QgIHBhZDBbMjRdOyAKLX0geGNiX2xpc3RfZXh0ZW5zaW9uc19yZXBseV90OwotCi0jZGVmaW5lIFhDQl9DSEFOR0VfS0VZQk9BUkRfTUFQUElORyAxMDAKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYW5nZV9rZXlib2FyZF9tYXBwaW5nX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAga2V5Y29kZV9jb3VudDsgCi0gICAgdWludDE2X3QgICAgICBsZW5ndGg7IAotICAgIHhjYl9rZXljb2RlX3QgZmlyc3Rfa2V5Y29kZTsgCi0gICAgdWludDhfdCAgICAgICBrZXlzeW1zX3Blcl9rZXljb2RlOyAKLSAgICB1aW50OF90ICAgICAgIHBhZDBbMl07IAotfSB4Y2JfY2hhbmdlX2tleWJvYXJkX21hcHBpbmdfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfR0VUX0tFWUJPQVJEX01BUFBJTkcgMTAxCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgICAgICAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICAgbGVuZ3RoOyAKLSAgICB4Y2Jfa2V5Y29kZV90IGZpcnN0X2tleWNvZGU7IAotICAgIHVpbnQ4X3QgICAgICAgY291bnQ7IAotfSB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAga2V5c3ltc19wZXJfa2V5Y29kZTsgCi0gICAgdWludDE2X3Qgc2VxdWVuY2U7IAotICAgIHVpbnQzMl90IGxlbmd0aDsgCi0gICAgdWludDhfdCAgcGFkMFsyNF07IAotfSB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHlfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9rYl90IHsKLSAgICBYQ0JfS0JfS0VZX0NMSUNLX1BFUkNFTlQgPSAxLAotICAgIFhDQl9LQl9CRUxMX1BFUkNFTlQgPSAyLAotICAgIFhDQl9LQl9CRUxMX1BJVENIID0gNCwKLSAgICBYQ0JfS0JfQkVMTF9EVVJBVElPTiA9IDgsCi0gICAgWENCX0tCX0xFRCA9IDE2LAotICAgIFhDQl9LQl9MRURfTU9ERSA9IDMyLAotICAgIFhDQl9LQl9LRVkgPSA2NCwKLSAgICBYQ0JfS0JfQVVUT19SRVBFQVRfTU9ERSA9IDEyOAotfSB4Y2Jfa2JfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9sZWRfbW9kZV90IHsKLSAgICBYQ0JfTEVEX01PREVfT0ZGID0gMCwKLSAgICBYQ0JfTEVEX01PREVfT04gPSAxCi19IHhjYl9sZWRfbW9kZV90OwotCi10eXBlZGVmIGVudW0geGNiX2F1dG9fcmVwZWF0X21vZGVfdCB7Ci0gICAgWENCX0FVVE9fUkVQRUFUX01PREVfT0ZGID0gMCwKLSAgICBYQ0JfQVVUT19SRVBFQVRfTU9ERV9PTiA9IDEsCi0gICAgWENCX0FVVE9fUkVQRUFUX01PREVfREVGQVVMVCA9IDIKLX0geGNiX2F1dG9fcmVwZWF0X21vZGVfdDsKLQotI2RlZmluZSBYQ0JfQ0hBTkdFX0tFWUJPQVJEX0NPTlRST0wgMTAyCi0KLXR5cGVkZWYgc3RydWN0IHhjYl9jaGFuZ2Vfa2V5Ym9hcmRfY29udHJvbF9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3QgbGVuZ3RoOyAKLSAgICB1aW50MzJfdCB2YWx1ZV9tYXNrOyAKLX0geGNiX2NoYW5nZV9rZXlib2FyZF9jb250cm9sX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9rZXlib2FyZF9jb250cm9sX2Nvb2tpZV90IHsKLSAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IAotfSB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfY29va2llX3Q7Ci0KLSNkZWZpbmUgWENCX0dFVF9LRVlCT0FSRF9DT05UUk9MIDEwMwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotICAgIHVpbnQxNl90IGxlbmd0aDsgCi19IHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBnbG9iYWxfYXV0b19yZXBlYXQ7IAotICAgIHVpbnQxNl90IHNlcXVlbmNlOyAKLSAgICB1aW50MzJfdCBsZW5ndGg7IAotICAgIHVpbnQzMl90IGxlZF9tYXNrOyAKLSAgICB1aW50OF90ICBrZXlfY2xpY2tfcGVyY2VudDsgCi0gICAgdWludDhfdCAgYmVsbF9wZXJjZW50OyAKLSAgICB1aW50MTZfdCBiZWxsX3BpdGNoOyAKLSAgICB1aW50MTZfdCBiZWxsX2R1cmF0aW9uOyAKLSAgICB1aW50OF90ICBwYWQwWzJdOyAKLSAgICB1aW50OF90ICBhdXRvX3JlcGVhdHNbMzJdOyAKLX0geGNiX2dldF9rZXlib2FyZF9jb250cm9sX3JlcGx5X3Q7Ci0KLSNkZWZpbmUgWENCX0JFTEwgMTA0Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9iZWxsX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICBpbnQ4X3QgICBwZXJjZW50OyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotfSB4Y2JfYmVsbF9yZXF1ZXN0X3Q7Ci0KLSNkZWZpbmUgWENCX0NIQU5HRV9QT0lOVEVSX0NPTlRST0wgMTA1Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9jaGFuZ2VfcG9pbnRlcl9jb250cm9sX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotICAgIGludDE2X3QgIGFjY2VsZXJhdGlvbl9udW1lcmF0b3I7IAotICAgIGludDE2X3QgIGFjY2VsZXJhdGlvbl9kZW5vbWluYXRvcjsgCi0gICAgaW50MTZfdCAgdGhyZXNob2xkOyAKLSAgICB1aW50OF90ICBkb19hY2NlbGVyYXRpb247IAotICAgIHVpbnQ4X3QgIGRvX3RocmVzaG9sZDsgCi19IHhjYl9jaGFuZ2VfcG9pbnRlcl9jb250cm9sX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9wb2ludGVyX2NvbnRyb2xfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9HRVRfUE9JTlRFUl9DT05UUk9MIDEwNgotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3QgbGVuZ3RoOyAKLX0geGNiX2dldF9wb2ludGVyX2NvbnRyb2xfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICB1aW50MTZfdCBhY2NlbGVyYXRpb25fbnVtZXJhdG9yOyAKLSAgICB1aW50MTZfdCBhY2NlbGVyYXRpb25fZGVub21pbmF0b3I7IAotICAgIHVpbnQxNl90IHRocmVzaG9sZDsgCi0gICAgdWludDhfdCAgcGFkMVsxOF07IAotfSB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXBseV90OwotCi10eXBlZGVmIGVudW0geGNiX2JsYW5raW5nX3QgewotICAgIFhDQl9CTEFOS0lOR19OT1RfUFJFRkVSUkVEID0gMCwKLSAgICBYQ0JfQkxBTktJTkdfUFJFRkVSUkVEID0gMSwKLSAgICBYQ0JfQkxBTktJTkdfREVGQVVMVCA9IDIKLX0geGNiX2JsYW5raW5nX3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfZXhwb3N1cmVzX3QgewotICAgIFhDQl9FWFBPU1VSRVNfTk9UX0FMTE9XRUQgPSAwLAotICAgIFhDQl9FWFBPU1VSRVNfQUxMT1dFRCA9IDEsCi0gICAgWENCX0VYUE9TVVJFU19ERUZBVUxUID0gMgotfSB4Y2JfZXhwb3N1cmVzX3Q7Ci0KLSNkZWZpbmUgWENCX1NFVF9TQ1JFRU5fU0FWRVIgMTA3Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zZXRfc2NyZWVuX3NhdmVyX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotICAgIGludDE2X3QgIHRpbWVvdXQ7IAotICAgIGludDE2X3QgIGludGVydmFsOyAKLSAgICB1aW50OF90ICBwcmVmZXJfYmxhbmtpbmc7IAotICAgIHVpbnQ4X3QgIGFsbG93X2V4cG9zdXJlczsgCi19IHhjYl9zZXRfc2NyZWVuX3NhdmVyX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9zY3JlZW5fc2F2ZXJfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9nZXRfc2NyZWVuX3NhdmVyX2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9HRVRfU0NSRUVOX1NBVkVSIDEwOAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3QgbGVuZ3RoOyAKLX0geGNiX2dldF9zY3JlZW5fc2F2ZXJfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICB1aW50MTZfdCB0aW1lb3V0OyAKLSAgICB1aW50MTZfdCBpbnRlcnZhbDsgCi0gICAgdWludDhfdCAgcHJlZmVyX2JsYW5raW5nOyAKLSAgICB1aW50OF90ICBhbGxvd19leHBvc3VyZXM7IAotICAgIHVpbnQ4X3QgIHBhZDFbMThdOyAKLX0geGNiX2dldF9zY3JlZW5fc2F2ZXJfcmVwbHlfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9ob3N0X21vZGVfdCB7Ci0gICAgWENCX0hPU1RfTU9ERV9JTlNFUlQgPSAwLAotICAgIFhDQl9IT1NUX01PREVfREVMRVRFID0gMQotfSB4Y2JfaG9zdF9tb2RlX3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfZmFtaWx5X3QgewotICAgIFhDQl9GQU1JTFlfSU5URVJORVQgPSAwLAotICAgIFhDQl9GQU1JTFlfREVDTkVUID0gMSwKLSAgICBYQ0JfRkFNSUxZX0NIQU9TID0gMiwKLSAgICBYQ0JfRkFNSUxZX1NFUlZFUl9JTlRFUlBSRVRFRCA9IDUsCi0gICAgWENCX0ZBTUlMWV9JTlRFUk5FVF82ID0gNgotfSB4Y2JfZmFtaWx5X3Q7Ci0KLSNkZWZpbmUgWENCX0NIQU5HRV9IT1NUUyAxMDkKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYW5nZV9ob3N0c19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgbW9kZTsgCi0gICAgdWludDE2X3QgbGVuZ3RoOyAKLSAgICB1aW50OF90ICBmYW1pbHk7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotICAgIHVpbnQxNl90IGFkZHJlc3NfbGVuOyAKLX0geGNiX2NoYW5nZV9ob3N0c19yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9ob3N0X3QgewotICAgIHVpbnQ4X3QgIGZhbWlseTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3QgYWRkcmVzc19sZW47IAotfSB4Y2JfaG9zdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfaG9zdF9pdGVyYXRvcl90IHsKLSAgICB4Y2JfaG9zdF90ICpkYXRhOyAKLSAgICBpbnQgICAgICAgICByZW07IAotICAgIGludCAgICAgICAgIGluZGV4OyAKLX0geGNiX2hvc3RfaXRlcmF0b3JfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfaG9zdHNfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9saXN0X2hvc3RzX2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9MSVNUX0hPU1RTIDExMAotCi10eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9ob3N0c19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3QgbGVuZ3RoOyAKLX0geGNiX2xpc3RfaG9zdHNfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9ob3N0c19yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBtb2RlOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICB1aW50MTZfdCBob3N0c19sZW47IAotICAgIHVpbnQ4X3QgIHBhZDBbMjJdOyAKLX0geGNiX2xpc3RfaG9zdHNfcmVwbHlfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9hY2Nlc3NfY29udHJvbF90IHsKLSAgICBYQ0JfQUNDRVNTX0NPTlRST0xfRElTQUJMRSA9IDAsCi0gICAgWENCX0FDQ0VTU19DT05UUk9MX0VOQUJMRSA9IDEKLX0geGNiX2FjY2Vzc19jb250cm9sX3Q7Ci0KLSNkZWZpbmUgWENCX1NFVF9BQ0NFU1NfQ09OVFJPTCAxMTEKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9hY2Nlc3NfY29udHJvbF9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgbW9kZTsgCi0gICAgdWludDE2X3QgbGVuZ3RoOyAKLX0geGNiX3NldF9hY2Nlc3NfY29udHJvbF9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfY2xvc2VfZG93bl90IHsKLSAgICBYQ0JfQ0xPU0VfRE9XTl9ERVNUUk9ZX0FMTCA9IDAsCi0gICAgWENCX0NMT1NFX0RPV05fUkVUQUlOX1BFUk1BTkVOVCA9IDEsCi0gICAgWENCX0NMT1NFX0RPV05fUkVUQUlOX1RFTVBPUkFSWSA9IDIKLX0geGNiX2Nsb3NlX2Rvd25fdDsKLQotI2RlZmluZSBYQ0JfU0VUX0NMT1NFX0RPV05fTU9ERSAxMTIKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9jbG9zZV9kb3duX21vZGVfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgIG1vZGU7IAotICAgIHVpbnQxNl90IGxlbmd0aDsgCi19IHhjYl9zZXRfY2xvc2VfZG93bl9tb2RlX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBlbnVtIHhjYl9raWxsX3QgewotICAgIFhDQl9LSUxMX0FMTF9URU1QT1JBUlkgPSAwCi19IHhjYl9raWxsX3Q7Ci0KLSNkZWZpbmUgWENCX0tJTExfQ0xJRU5UIDExMwotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfa2lsbF9jbGllbnRfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotICAgIHVpbnQxNl90IGxlbmd0aDsgCi0gICAgdWludDMyX3QgcmVzb3VyY2U7IAotfSB4Y2Jfa2lsbF9jbGllbnRfcmVxdWVzdF90OwotCi0jZGVmaW5lIFhDQl9ST1RBVEVfUFJPUEVSVElFUyAxMTQKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3JvdGF0ZV9wcm9wZXJ0aWVzX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgICAgIHBhZDA7IAotICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IAotICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IAotICAgIHVpbnQxNl90ICAgICBhdG9tc19sZW47IAotICAgIGludDE2X3QgICAgICBkZWx0YTsgCi19IHhjYl9yb3RhdGVfcHJvcGVydGllc19yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2Jfc2NyZWVuX3NhdmVyX3QgewotICAgIFhDQl9TQ1JFRU5fU0FWRVJfUkVTRVQgPSAwLAotICAgIFhDQl9TQ1JFRU5fU0FWRVJfQUNUSVZFID0gMQotfSB4Y2Jfc2NyZWVuX3NhdmVyX3Q7Ci0KLSNkZWZpbmUgWENCX0ZPUkNFX1NDUkVFTl9TQVZFUiAxMTUKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2ZvcmNlX3NjcmVlbl9zYXZlcl9yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgbW9kZTsgCi0gICAgdWludDE2X3QgbGVuZ3RoOyAKLX0geGNiX2ZvcmNlX3NjcmVlbl9zYXZlcl9yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfbWFwcGluZ19zdGF0dXNfdCB7Ci0gICAgWENCX01BUFBJTkdfU1RBVFVTX1NVQ0NFU1MgPSAwLAotICAgIFhDQl9NQVBQSU5HX1NUQVRVU19CVVNZID0gMSwKLSAgICBYQ0JfTUFQUElOR19TVEFUVVNfRkFJTFVSRSA9IDIKLX0geGNiX21hcHBpbmdfc3RhdHVzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90IHsKLSAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IAotfSB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfU0VUX1BPSU5URVJfTUFQUElORyAxMTYKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9wb2ludGVyX21hcHBpbmdfcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgIG1hcF9sZW47IAotICAgIHVpbnQxNl90IGxlbmd0aDsgCi19IHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX3JlcXVlc3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgc3RhdHVzOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLX0geGNiX3NldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9HRVRfUE9JTlRFUl9NQVBQSU5HIDExNwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAgcGFkMDsgCi0gICAgdWludDE2X3QgbGVuZ3RoOyAKLX0geGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90IHsKLSAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAKLSAgICB1aW50OF90ICBtYXBfbGVuOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICB1aW50OF90ICBwYWQwWzI0XTsgCi19IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5X3Q7Ci0KLXR5cGVkZWYgZW51bSB4Y2JfbWFwX2luZGV4X3QgewotICAgIFhDQl9NQVBfSU5ERVhfU0hJRlQgPSAwLAotICAgIFhDQl9NQVBfSU5ERVhfTE9DSyA9IDEsCi0gICAgWENCX01BUF9JTkRFWF9DT05UUk9MID0gMiwKLSAgICBYQ0JfTUFQX0lOREVYXzEgPSAzLAotICAgIFhDQl9NQVBfSU5ERVhfMiA9IDQsCi0gICAgWENCX01BUF9JTkRFWF8zID0gNSwKLSAgICBYQ0JfTUFQX0lOREVYXzQgPSA2LAotICAgIFhDQl9NQVBfSU5ERVhfNSA9IDcKLX0geGNiX21hcF9pbmRleF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QgewotICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgCi19IHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdDsKLQotI2RlZmluZSBYQ0JfU0VUX01PRElGSUVSX01BUFBJTkcgMTE4Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19yZXF1ZXN0X3QgewotICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgCi0gICAgdWludDhfdCAga2V5Y29kZXNfcGVyX21vZGlmaWVyOyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotfSB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAgc3RhdHVzOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLX0geGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdCB7Ci0gICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAKLX0geGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90OwotCi0jZGVmaW5lIFhDQl9HRVRfTU9ESUZJRVJfTUFQUElORyAxMTkKLQotdHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcXVlc3RfdCB7Ci0gICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAKLSAgICB1aW50OF90ICBwYWQwOyAKLSAgICB1aW50MTZfdCBsZW5ndGg7IAotfSB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdCB7Ci0gICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgCi0gICAgdWludDhfdCAga2V5Y29kZXNfcGVyX21vZGlmaWVyOyAKLSAgICB1aW50MTZfdCBzZXF1ZW5jZTsgCi0gICAgdWludDMyX3QgbGVuZ3RoOyAKLSAgICB1aW50OF90ICBwYWQwWzI0XTsgCi19IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90OwotCi0jZGVmaW5lIFhDQl9OT19PUEVSQVRJT04gMTI3Ci0KLXR5cGVkZWYgc3RydWN0IHhjYl9ub19vcGVyYXRpb25fcmVxdWVzdF90IHsKLSAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IAotICAgIHVpbnQ4X3QgIHBhZDA7IAotICAgIHVpbnQxNl90IGxlbmd0aDsgCi19IHhjYl9ub19vcGVyYXRpb25fcmVxdWVzdF90OwotCi12b2lkCi14Y2JfY2hhcjJiX25leHQgKHhjYl9jaGFyMmJfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2NoYXIyYl9lbmQgKHhjYl9jaGFyMmJfaXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2Jfd2luZG93X25leHQgKHhjYl93aW5kb3dfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX3dpbmRvd19lbmQgKHhjYl93aW5kb3dfaXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2JfcGl4bWFwX25leHQgKHhjYl9waXhtYXBfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX3BpeG1hcF9lbmQgKHhjYl9waXhtYXBfaXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2JfY3Vyc29yX25leHQgKHhjYl9jdXJzb3JfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2N1cnNvcl9lbmQgKHhjYl9jdXJzb3JfaXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2JfZm9udF9uZXh0ICh4Y2JfZm9udF9pdGVyYXRvcl90ICppICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfZm9udF9lbmQgKHhjYl9mb250X2l0ZXJhdG9yX3QgaSAgKTsKLQotdm9pZAoteGNiX2djb250ZXh0X25leHQgKHhjYl9nY29udGV4dF9pdGVyYXRvcl90ICppICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfZ2NvbnRleHRfZW5kICh4Y2JfZ2NvbnRleHRfaXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2JfY29sb3JtYXBfbmV4dCAoeGNiX2NvbG9ybWFwX2l0ZXJhdG9yX3QgKmkgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9jb2xvcm1hcF9lbmQgKHhjYl9jb2xvcm1hcF9pdGVyYXRvcl90IGkgICk7Ci0KLXZvaWQKLXhjYl9hdG9tX25leHQgKHhjYl9hdG9tX2l0ZXJhdG9yX3QgKmkgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9hdG9tX2VuZCAoeGNiX2F0b21faXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2JfZHJhd2FibGVfbmV4dCAoeGNiX2RyYXdhYmxlX2l0ZXJhdG9yX3QgKmkgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9kcmF3YWJsZV9lbmQgKHhjYl9kcmF3YWJsZV9pdGVyYXRvcl90IGkgICk7Ci0KLXZvaWQKLXhjYl9mb250YWJsZV9uZXh0ICh4Y2JfZm9udGFibGVfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2ZvbnRhYmxlX2VuZCAoeGNiX2ZvbnRhYmxlX2l0ZXJhdG9yX3QgaSAgKTsKLQotdm9pZAoteGNiX3Zpc3VhbGlkX25leHQgKHhjYl92aXN1YWxpZF9pdGVyYXRvcl90ICppICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfdmlzdWFsaWRfZW5kICh4Y2JfdmlzdWFsaWRfaXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2JfdGltZXN0YW1wX25leHQgKHhjYl90aW1lc3RhbXBfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX3RpbWVzdGFtcF9lbmQgKHhjYl90aW1lc3RhbXBfaXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2Jfa2V5c3ltX25leHQgKHhjYl9rZXlzeW1faXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2tleXN5bV9lbmQgKHhjYl9rZXlzeW1faXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2Jfa2V5Y29kZV9uZXh0ICh4Y2Jfa2V5Y29kZV9pdGVyYXRvcl90ICppICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2Jfa2V5Y29kZV9lbmQgKHhjYl9rZXljb2RlX2l0ZXJhdG9yX3QgaSAgKTsKLQotdm9pZAoteGNiX2J1dHRvbl9uZXh0ICh4Y2JfYnV0dG9uX2l0ZXJhdG9yX3QgKmkgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9idXR0b25fZW5kICh4Y2JfYnV0dG9uX2l0ZXJhdG9yX3QgaSAgKTsKLQotdm9pZAoteGNiX3BvaW50X25leHQgKHhjYl9wb2ludF9pdGVyYXRvcl90ICppICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfcG9pbnRfZW5kICh4Y2JfcG9pbnRfaXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2JfcmVjdGFuZ2xlX25leHQgKHhjYl9yZWN0YW5nbGVfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX3JlY3RhbmdsZV9lbmQgKHhjYl9yZWN0YW5nbGVfaXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2JfYXJjX25leHQgKHhjYl9hcmNfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2FyY19lbmQgKHhjYl9hcmNfaXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2JfZm9ybWF0X25leHQgKHhjYl9mb3JtYXRfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2Zvcm1hdF9lbmQgKHhjYl9mb3JtYXRfaXRlcmF0b3JfdCBpICApOwotCi12b2lkCi14Y2JfdmlzdWFsdHlwZV9uZXh0ICh4Y2JfdmlzdWFsdHlwZV9pdGVyYXRvcl90ICppICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfdmlzdWFsdHlwZV9lbmQgKHhjYl92aXN1YWx0eXBlX2l0ZXJhdG9yX3QgaSAgKTsKLQotaW50Ci14Y2JfZGVwdGhfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX3Zpc3VhbHR5cGVfdCAqCi14Y2JfZGVwdGhfdmlzdWFscyAoY29uc3QgeGNiX2RlcHRoX3QgKlIgICk7Ci0KLWludAoteGNiX2RlcHRoX3Zpc3VhbHNfbGVuZ3RoIChjb25zdCB4Y2JfZGVwdGhfdCAqUiAgKTsKLQoteGNiX3Zpc3VhbHR5cGVfaXRlcmF0b3JfdAoteGNiX2RlcHRoX3Zpc3VhbHNfaXRlcmF0b3IgKGNvbnN0IHhjYl9kZXB0aF90ICpSICApOwotCi12b2lkCi14Y2JfZGVwdGhfbmV4dCAoeGNiX2RlcHRoX2l0ZXJhdG9yX3QgKmkgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9kZXB0aF9lbmQgKHhjYl9kZXB0aF9pdGVyYXRvcl90IGkgICk7Ci0KLWludAoteGNiX3NjcmVlbl9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi1pbnQKLXhjYl9zY3JlZW5fYWxsb3dlZF9kZXB0aHNfbGVuZ3RoIChjb25zdCB4Y2Jfc2NyZWVuX3QgKlIgICk7Ci0KLXhjYl9kZXB0aF9pdGVyYXRvcl90Ci14Y2Jfc2NyZWVuX2FsbG93ZWRfZGVwdGhzX2l0ZXJhdG9yIChjb25zdCB4Y2Jfc2NyZWVuX3QgKlIgICk7Ci0KLXZvaWQKLXhjYl9zY3JlZW5fbmV4dCAoeGNiX3NjcmVlbl9pdGVyYXRvcl90ICppICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2Jfc2NyZWVuX2VuZCAoeGNiX3NjcmVlbl9pdGVyYXRvcl90IGkgICk7Ci0KLWludAoteGNiX3NldHVwX3JlcXVlc3Rfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQotY2hhciAqCi14Y2Jfc2V0dXBfcmVxdWVzdF9hdXRob3JpemF0aW9uX3Byb3RvY29sX25hbWUgKGNvbnN0IHhjYl9zZXR1cF9yZXF1ZXN0X3QgKlIgICk7Ci0KLWludAoteGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9uYW1lX2xlbmd0aCAoY29uc3QgeGNiX3NldHVwX3JlcXVlc3RfdCAqUiAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9uYW1lX2VuZCAoY29uc3QgeGNiX3NldHVwX3JlcXVlc3RfdCAqUiAgKTsKLQotY2hhciAqCi14Y2Jfc2V0dXBfcmVxdWVzdF9hdXRob3JpemF0aW9uX3Byb3RvY29sX2RhdGEgKGNvbnN0IHhjYl9zZXR1cF9yZXF1ZXN0X3QgKlIgICk7Ci0KLWludAoteGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9kYXRhX2xlbmd0aCAoY29uc3QgeGNiX3NldHVwX3JlcXVlc3RfdCAqUiAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9kYXRhX2VuZCAoY29uc3QgeGNiX3NldHVwX3JlcXVlc3RfdCAqUiAgKTsKLQotdm9pZAoteGNiX3NldHVwX3JlcXVlc3RfbmV4dCAoeGNiX3NldHVwX3JlcXVlc3RfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX3NldHVwX3JlcXVlc3RfZW5kICh4Y2Jfc2V0dXBfcmVxdWVzdF9pdGVyYXRvcl90IGkgICk7Ci0KLWludAoteGNiX3NldHVwX2ZhaWxlZF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi1jaGFyICoKLXhjYl9zZXR1cF9mYWlsZWRfcmVhc29uIChjb25zdCB4Y2Jfc2V0dXBfZmFpbGVkX3QgKlIgICk7Ci0KLWludAoteGNiX3NldHVwX2ZhaWxlZF9yZWFzb25fbGVuZ3RoIChjb25zdCB4Y2Jfc2V0dXBfZmFpbGVkX3QgKlIgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9zZXR1cF9mYWlsZWRfcmVhc29uX2VuZCAoY29uc3QgeGNiX3NldHVwX2ZhaWxlZF90ICpSICApOwotCi12b2lkCi14Y2Jfc2V0dXBfZmFpbGVkX25leHQgKHhjYl9zZXR1cF9mYWlsZWRfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX3NldHVwX2ZhaWxlZF9lbmQgKHhjYl9zZXR1cF9mYWlsZWRfaXRlcmF0b3JfdCBpICApOwotCi1pbnQKLXhjYl9zZXR1cF9hdXRoZW50aWNhdGVfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQotY2hhciAqCi14Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3JlYXNvbiAoY29uc3QgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90ICpSICApOwotCi1pbnQKLXhjYl9zZXR1cF9hdXRoZW50aWNhdGVfcmVhc29uX2xlbmd0aCAoY29uc3QgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90ICpSICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3JlYXNvbl9lbmQgKGNvbnN0IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfdCAqUiAgKTsKLQotdm9pZAoteGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9uZXh0ICh4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX2l0ZXJhdG9yX3QgKmkgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9zZXR1cF9hdXRoZW50aWNhdGVfZW5kICh4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX2l0ZXJhdG9yX3QgaSAgKTsKLQotaW50Ci14Y2Jfc2V0dXBfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQotY2hhciAqCi14Y2Jfc2V0dXBfdmVuZG9yIChjb25zdCB4Y2Jfc2V0dXBfdCAqUiAgKTsKLQotaW50Ci14Y2Jfc2V0dXBfdmVuZG9yX2xlbmd0aCAoY29uc3QgeGNiX3NldHVwX3QgKlIgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9zZXR1cF92ZW5kb3JfZW5kIChjb25zdCB4Y2Jfc2V0dXBfdCAqUiAgKTsKLQoteGNiX2Zvcm1hdF90ICoKLXhjYl9zZXR1cF9waXhtYXBfZm9ybWF0cyAoY29uc3QgeGNiX3NldHVwX3QgKlIgICk7Ci0KLWludAoteGNiX3NldHVwX3BpeG1hcF9mb3JtYXRzX2xlbmd0aCAoY29uc3QgeGNiX3NldHVwX3QgKlIgICk7Ci0KLXhjYl9mb3JtYXRfaXRlcmF0b3JfdAoteGNiX3NldHVwX3BpeG1hcF9mb3JtYXRzX2l0ZXJhdG9yIChjb25zdCB4Y2Jfc2V0dXBfdCAqUiAgKTsKLQotaW50Ci14Y2Jfc2V0dXBfcm9vdHNfbGVuZ3RoIChjb25zdCB4Y2Jfc2V0dXBfdCAqUiAgKTsKLQoteGNiX3NjcmVlbl9pdGVyYXRvcl90Ci14Y2Jfc2V0dXBfcm9vdHNfaXRlcmF0b3IgKGNvbnN0IHhjYl9zZXR1cF90ICpSICApOwotCi12b2lkCi14Y2Jfc2V0dXBfbmV4dCAoeGNiX3NldHVwX2l0ZXJhdG9yX3QgKmkgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9zZXR1cF9lbmQgKHhjYl9zZXR1cF9pdGVyYXRvcl90IGkgICk7Ci0KLXZvaWQKLXhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX25leHQgKHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX2l0ZXJhdG9yX3QgKmkgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX2VuZCAoeGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfaXRlcmF0b3JfdCBpICApOwotCi1pbnQKLXhjYl9jcmVhdGVfd2luZG93X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY3JlYXRlX3dpbmRvd19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBkZXB0aCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2lkICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBwYXJlbnQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJvcmRlcl93aWR0aCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgX2NsYXNzICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdmlzdWFsaWRfdCAgICB2aXN1YWwgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY3JlYXRlX3dpbmRvdyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGRlcHRoICAsCi0gICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2lkICAsCi0gICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgcGFyZW50ICAsCi0gICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLAotICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgICwKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLAotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLAotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJvcmRlcl93aWR0aCAgLAotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIF9jbGFzcyAgLAotICAgICAgICAgICAgICAgICAgIHhjYl92aXN1YWxpZF90ICAgIHZpc3VhbCAgLAotICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgICwKLSAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0ICApOwotCi1pbnQKLXhjYl9jaGFuZ2Vfd2luZG93X2F0dHJpYnV0ZXNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jaGFuZ2Vfd2luZG93X2F0dHJpYnV0ZXNfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzayAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0ICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2NoYW5nZV93aW5kb3dfYXR0cmlidXRlcyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0ICApOwotCi14Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX2Nvb2tpZV90Ci14Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICk7Ci0KLXhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfY29va2llX3QKLXhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICApOwotCi14Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcGx5X3QgKgoteGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAgKiplICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2Rlc3Ryb3lfd2luZG93X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfZGVzdHJveV93aW5kb3cgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2Rlc3Ryb3lfc3Vid2luZG93c19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9kZXN0cm95X3N1YndpbmRvd3MgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jaGFuZ2Vfc2F2ZV9zZXRfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jaGFuZ2Vfc2F2ZV9zZXQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgICwKLSAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9yZXBhcmVudF93aW5kb3dfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgcGFyZW50ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9yZXBhcmVudF93aW5kb3cgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgcGFyZW50ICAsCi0gICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAsCi0gICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX21hcF93aW5kb3dfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX21hcF93aW5kb3cgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfbWFwX3N1YndpbmRvd3NfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9tYXBfc3Vid2luZG93cyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfdW5tYXBfd2luZG93X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3VubWFwX3dpbmRvdyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3VubWFwX3N1YndpbmRvd3NfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3VubWFwX3N1YndpbmRvd3MgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICk7Ci0KLWludAoteGNiX2NvbmZpZ3VyZV93aW5kb3dfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jb25maWd1cmVfd2luZG93X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgdmFsdWVfbWFzayAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jb25maWd1cmVfd2luZG93ICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgdmFsdWVfbWFzayAgLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY2lyY3VsYXRlX3dpbmRvd19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBkaXJlY3Rpb24gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jaXJjdWxhdGVfd2luZG93ICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZGlyZWN0aW9uICAsCi0gICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICApOwotCi14Y2JfZ2V0X2dlb21ldHJ5X2Nvb2tpZV90Ci14Y2JfZ2V0X2dlb21ldHJ5ICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgKTsKLQoteGNiX2dldF9nZW9tZXRyeV9jb29raWVfdAoteGNiX2dldF9nZW9tZXRyeV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgKTsKLQoteGNiX2dldF9nZW9tZXRyeV9yZXBseV90ICoKLXhjYl9nZXRfZ2VvbWV0cnlfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X2dlb21ldHJ5X2Nvb2tpZV90ICAgY29va2llICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZSAgKTsKLQotaW50Ci14Y2JfcXVlcnlfdHJlZV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi14Y2JfcXVlcnlfdHJlZV9jb29raWVfdAoteGNiX3F1ZXJ5X3RyZWUgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICk7Ci0KLXhjYl9xdWVyeV90cmVlX2Nvb2tpZV90Ci14Y2JfcXVlcnlfdHJlZV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICApOwotCi14Y2Jfd2luZG93X3QgKgoteGNiX3F1ZXJ5X3RyZWVfY2hpbGRyZW4gKGNvbnN0IHhjYl9xdWVyeV90cmVlX3JlcGx5X3QgKlIgICk7Ci0KLWludAoteGNiX3F1ZXJ5X3RyZWVfY2hpbGRyZW5fbGVuZ3RoIChjb25zdCB4Y2JfcXVlcnlfdHJlZV9yZXBseV90ICpSICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfcXVlcnlfdHJlZV9jaGlsZHJlbl9lbmQgKGNvbnN0IHhjYl9xdWVyeV90cmVlX3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9xdWVyeV90cmVlX3JlcGx5X3QgKgoteGNiX3F1ZXJ5X3RyZWVfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgIHhjYl9xdWVyeV90cmVlX2Nvb2tpZV90ICAgY29va2llICAsCi0gICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgKiplICApOwotCi1pbnQKLXhjYl9pbnRlcm5fYXRvbV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi14Y2JfaW50ZXJuX2F0b21fY29va2llX3QKLXhjYl9pbnRlcm5fYXRvbSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvbmx5X2lmX2V4aXN0cyAgLAotICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICApOwotCi14Y2JfaW50ZXJuX2F0b21fY29va2llX3QKLXhjYl9pbnRlcm5fYXRvbV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG9ubHlfaWZfZXhpc3RzICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSAgKTsKLQoteGNiX2ludGVybl9hdG9tX3JlcGx5X3QgKgoteGNiX2ludGVybl9hdG9tX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgKiplICApOwotCi1pbnQKLXhjYl9nZXRfYXRvbV9uYW1lX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXhjYl9nZXRfYXRvbV9uYW1lX2Nvb2tpZV90Ci14Y2JfZ2V0X2F0b21fbmFtZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIGF0b20gICk7Ci0KLXhjYl9nZXRfYXRvbV9uYW1lX2Nvb2tpZV90Ci14Y2JfZ2V0X2F0b21fbmFtZV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgYXRvbSAgKTsKLQotY2hhciAqCi14Y2JfZ2V0X2F0b21fbmFtZV9uYW1lIChjb25zdCB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseV90ICpSICApOwotCi1pbnQKLXhjYl9nZXRfYXRvbV9uYW1lX25hbWVfbGVuZ3RoIChjb25zdCB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseV90ICpSICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfZ2V0X2F0b21fbmFtZV9uYW1lX2VuZCAoY29uc3QgeGNiX2dldF9hdG9tX25hbWVfcmVwbHlfdCAqUiAgKTsKLQoteGNiX2dldF9hdG9tX25hbWVfcmVwbHlfdCAqCi14Y2JfZ2V0X2F0b21fbmFtZV9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9hdG9tX25hbWVfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAqKmUgICk7Ci0KLWludAoteGNiX2NoYW5nZV9wcm9wZXJ0eV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2NoYW5nZV9wcm9wZXJ0eV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHR5cGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZm9ybWF0ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGRhdGFfbGVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgKmRhdGEgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY2hhbmdlX3Byb3BlcnR5ICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAsCi0gICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5ICAsCi0gICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICB0eXBlICAsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmb3JtYXQgICwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGRhdGFfbGVuICAsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICpkYXRhICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2RlbGV0ZV9wcm9wZXJ0eV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBwcm9wZXJ0eSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9kZWxldGVfcHJvcGVydHkgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkgICk7Ci0KLWludAoteGNiX2dldF9wcm9wZXJ0eV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi14Y2JfZ2V0X3Byb3BlcnR5X2Nvb2tpZV90Ci14Y2JfZ2V0X3Byb3BlcnR5ICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBfZGVsZXRlICAsCi0gICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5ICAsCi0gICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICB0eXBlICAsCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBsb25nX29mZnNldCAgLAotICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgbG9uZ19sZW5ndGggICk7Ci0KLXhjYl9nZXRfcHJvcGVydHlfY29va2llX3QKLXhjYl9nZXRfcHJvcGVydHlfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgX2RlbGV0ZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgdHlwZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGxvbmdfb2Zmc2V0ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgbG9uZ19sZW5ndGggICk7Ci0KLXZvaWQgKgoteGNiX2dldF9wcm9wZXJ0eV92YWx1ZSAoY29uc3QgeGNiX2dldF9wcm9wZXJ0eV9yZXBseV90ICpSICApOwotCi1pbnQKLXhjYl9nZXRfcHJvcGVydHlfdmFsdWVfbGVuZ3RoIChjb25zdCB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9nZXRfcHJvcGVydHlfdmFsdWVfZW5kIChjb25zdCB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdCAqCi14Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9wcm9wZXJ0eV9jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAqKmUgICk7Ci0KLWludAoteGNiX2xpc3RfcHJvcGVydGllc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi14Y2JfbGlzdF9wcm9wZXJ0aWVzX2Nvb2tpZV90Ci14Y2JfbGlzdF9wcm9wZXJ0aWVzICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICk7Ci0KLXhjYl9saXN0X3Byb3BlcnRpZXNfY29va2llX3QKLXhjYl9saXN0X3Byb3BlcnRpZXNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICApOwotCi14Y2JfYXRvbV90ICoKLXhjYl9saXN0X3Byb3BlcnRpZXNfYXRvbXMgKGNvbnN0IHhjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHlfdCAqUiAgKTsKLQotaW50Ci14Y2JfbGlzdF9wcm9wZXJ0aWVzX2F0b21zX2xlbmd0aCAoY29uc3QgeGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90ICpSICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfbGlzdF9wcm9wZXJ0aWVzX2F0b21zX2VuZCAoY29uc3QgeGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90ICpSICApOwotCi14Y2JfbGlzdF9wcm9wZXJ0aWVzX3JlcGx5X3QgKgoteGNiX2xpc3RfcHJvcGVydGllc19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9saXN0X3Byb3BlcnRpZXNfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgKiplICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3NldF9zZWxlY3Rpb25fb3duZXJfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgb3duZXIgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHNlbGVjdGlvbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9zZXRfc2VsZWN0aW9uX293bmVyICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgb3duZXIgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICApOwotCi14Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9jb29raWVfdAoteGNiX2dldF9zZWxlY3Rpb25fb3duZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24gICk7Ci0KLXhjYl9nZXRfc2VsZWN0aW9uX293bmVyX2Nvb2tpZV90Ci14Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgc2VsZWN0aW9uICApOwotCi14Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9yZXBseV90ICoKLXhjYl9nZXRfc2VsZWN0aW9uX293bmVyX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICoqZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jb252ZXJ0X3NlbGVjdGlvbl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgcmVxdWVzdG9yICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgc2VsZWN0aW9uICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgdGFyZ2V0ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2NvbnZlcnRfc2VsZWN0aW9uICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHJlcXVlc3RvciAgLAotICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24gICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgdGFyZ2V0ICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5ICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2Jfc2VuZF9ldmVudF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwcm9wYWdhdGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGRlc3RpbmF0aW9uICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBldmVudF9tYXNrICAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpldmVudCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9zZW5kX2V2ZW50ICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgcHJvcGFnYXRlICAsCi0gICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZGVzdGluYXRpb24gICwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBldmVudF9tYXNrICAsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZXZlbnQgICk7Ci0KLXhjYl9ncmFiX3BvaW50ZXJfY29va2llX3QKLXhjYl9ncmFiX3BvaW50ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cyAgLAotICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sgICwKLSAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZSAgLAotICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgLAotICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgY29uZmluZV90byAgLAotICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAsCi0gICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICApOwotCi14Y2JfZ3JhYl9wb2ludGVyX2Nvb2tpZV90Ci14Y2JfZ3JhYl9wb2ludGVyX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZXZlbnRfbWFzayAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBjb25maW5lX3RvICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgKTsKLQoteGNiX2dyYWJfcG9pbnRlcl9yZXBseV90ICoKLXhjYl9ncmFiX3BvaW50ZXJfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ3JhYl9wb2ludGVyX2Nvb2tpZV90ICAgY29va2llICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl91bmdyYWJfcG9pbnRlcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl91bmdyYWJfcG9pbnRlciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2dyYWJfYnV0dG9uX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBrZXlib2FyZF9tb2RlICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgY29uZmluZV90byAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvciAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGJ1dHRvbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9ncmFiX2J1dHRvbiAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMgICwKLSAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZXZlbnRfbWFzayAgLAotICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUgICwKLSAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgLAotICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBjb25maW5lX3RvICAsCi0gICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvciAgLAotICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBidXR0b24gICwKLSAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3VuZ3JhYl9idXR0b25fY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgYnV0dG9uICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3VuZ3JhYl9idXR0b24gKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBidXR0b24gICwKLSAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jaGFuZ2VfYWN0aXZlX3BvaW50ZXJfZ3JhYl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY2hhbmdlX2FjdGl2ZV9wb2ludGVyX2dyYWIgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZXZlbnRfbWFzayAgKTsKLQoteGNiX2dyYWJfa2V5Ym9hcmRfY29va2llX3QKLXhjYl9ncmFiX2tleWJvYXJkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgb3duZXJfZXZlbnRzICAsCi0gICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAsCi0gICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgcG9pbnRlcl9tb2RlICAsCi0gICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgKTsKLQoteGNiX2dyYWJfa2V5Ym9hcmRfY29va2llX3QKLXhjYl9ncmFiX2tleWJvYXJkX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgKTsKLQoteGNiX2dyYWJfa2V5Ym9hcmRfcmVwbHlfdCAqCi14Y2JfZ3JhYl9rZXlib2FyZF9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dyYWJfa2V5Ym9hcmRfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAqKmUgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfdW5ncmFiX2tleWJvYXJkX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl91bmdyYWJfa2V5Ym9hcmQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfZ3JhYl9rZXlfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cyAgLAotICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93ICAsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzICAsCi0gICAgICAgICAgICAgICAgICAgICAgeGNiX2tleWNvZGVfdCAgICAga2V5ICAsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgcG9pbnRlcl9tb2RlICAsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9ncmFiX2tleSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMgICwKLSAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgICwKLSAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzICAsCi0gICAgICAgICAgICAgIHhjYl9rZXljb2RlX3QgICAgIGtleSAgLAotICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUgICwKLSAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl91bmdyYWJfa2V5X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9rZXljb2RlX3QgICAgIGtleSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl91bmdyYWJfa2V5ICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgeGNiX2tleWNvZGVfdCAgICAga2V5ICAsCi0gICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgICwKLSAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfYWxsb3dfZXZlbnRzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbW9kZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2FsbG93X2V2ZW50cyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbW9kZSAgLAotICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9ncmFiX3NlcnZlcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2dyYWJfc2VydmVyICh4Y2JfY29ubmVjdGlvbl90ICpjICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3VuZ3JhYl9zZXJ2ZXJfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl91bmdyYWJfc2VydmVyICh4Y2JfY29ubmVjdGlvbl90ICpjICApOwotCi14Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdAoteGNiX3F1ZXJ5X3BvaW50ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICk7Ci0KLXhjYl9xdWVyeV9wb2ludGVyX2Nvb2tpZV90Ci14Y2JfcXVlcnlfcG9pbnRlcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICApOwotCi14Y2JfcXVlcnlfcG9pbnRlcl9yZXBseV90ICoKLXhjYl9xdWVyeV9wb2ludGVyX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICoqZSAgKTsKLQotdm9pZAoteGNiX3RpbWVjb29yZF9uZXh0ICh4Y2JfdGltZWNvb3JkX2l0ZXJhdG9yX3QgKmkgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl90aW1lY29vcmRfZW5kICh4Y2JfdGltZWNvb3JkX2l0ZXJhdG9yX3QgaSAgKTsKLQotaW50Ci14Y2JfZ2V0X21vdGlvbl9ldmVudHNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX2dldF9tb3Rpb25fZXZlbnRzX2Nvb2tpZV90Ci14Y2JfZ2V0X21vdGlvbl9ldmVudHMgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHN0YXJ0ICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHN0b3AgICk7Ci0KLXhjYl9nZXRfbW90aW9uX2V2ZW50c19jb29raWVfdAoteGNiX2dldF9tb3Rpb25fZXZlbnRzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICBzdGFydCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgc3RvcCAgKTsKLQoteGNiX3RpbWVjb29yZF90ICoKLXhjYl9nZXRfbW90aW9uX2V2ZW50c19ldmVudHMgKGNvbnN0IHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseV90ICpSICApOwotCi1pbnQKLXhjYl9nZXRfbW90aW9uX2V2ZW50c19ldmVudHNfbGVuZ3RoIChjb25zdCB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHlfdCAqUiAgKTsKLQoteGNiX3RpbWVjb29yZF9pdGVyYXRvcl90Ci14Y2JfZ2V0X21vdGlvbl9ldmVudHNfZXZlbnRzX2l0ZXJhdG9yIChjb25zdCB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHlfdCAqUiAgKTsKLQoteGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcGx5X3QgKgoteGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfbW90aW9uX2V2ZW50c19jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgKiplICApOwotCi14Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX2Nvb2tpZV90Ci14Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBzcmNfd2luZG93ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBkc3Rfd2luZG93ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3kgICk7Ci0KLXhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfY29va2llX3QKLXhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgc3JjX3dpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGRzdF93aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY195ICApOwotCi14Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcGx5X3QgKgoteGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAgKiplICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3dhcnBfcG9pbnRlcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHNyY193aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZHN0X3dpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBzcmNfd2lkdGggICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgc3JjX2hlaWdodCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl93YXJwX3BvaW50ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHNyY193aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGRzdF93aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY194ICAsCi0gICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeSAgLAotICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgc3JjX3dpZHRoICAsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBzcmNfaGVpZ2h0ICAsCi0gICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeCAgLAotICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3kgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2Jfc2V0X2lucHV0X2ZvY3VzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgcmV2ZXJ0X3RvICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGZvY3VzICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2Jfc2V0X2lucHV0X2ZvY3VzICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICByZXZlcnRfdG8gICwKLSAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGZvY3VzICAsCi0gICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICApOwotCi14Y2JfZ2V0X2lucHV0X2ZvY3VzX2Nvb2tpZV90Ci14Y2JfZ2V0X2lucHV0X2ZvY3VzICh4Y2JfY29ubmVjdGlvbl90ICpjICApOwotCi14Y2JfZ2V0X2lucHV0X2ZvY3VzX2Nvb2tpZV90Ci14Y2JfZ2V0X2lucHV0X2ZvY3VzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgKTsKLQoteGNiX2dldF9pbnB1dF9mb2N1c19yZXBseV90ICoKLXhjYl9nZXRfaW5wdXRfZm9jdXNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X2lucHV0X2ZvY3VzX2Nvb2tpZV90ICAgY29va2llICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICoqZSAgKTsKLQoteGNiX3F1ZXJ5X2tleW1hcF9jb29raWVfdAoteGNiX3F1ZXJ5X2tleW1hcCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgKTsKLQoteGNiX3F1ZXJ5X2tleW1hcF9jb29raWVfdAoteGNiX3F1ZXJ5X2tleW1hcF91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICk7Ci0KLXhjYl9xdWVyeV9rZXltYXBfcmVwbHlfdCAqCi14Y2JfcXVlcnlfa2V5bWFwX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3F1ZXJ5X2tleW1hcF9jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAqKmUgICk7Ci0KLWludAoteGNiX29wZW5fZm9udF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX29wZW5fZm9udF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl9mb250X3QgICAgICAgIGZpZCAgLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX29wZW5fZm9udCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgeGNiX2ZvbnRfdCAgICAgICAgZmlkICAsCi0gICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jbG9zZV9mb250X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9mb250X3QgICAgICAgIGZvbnQgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY2xvc2VfZm9udCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgIHhjYl9mb250X3QgICAgICAgIGZvbnQgICk7Ci0KLXZvaWQKLXhjYl9mb250cHJvcF9uZXh0ICh4Y2JfZm9udHByb3BfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2ZvbnRwcm9wX2VuZCAoeGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QgaSAgKTsKLQotdm9pZAoteGNiX2NoYXJpbmZvX25leHQgKHhjYl9jaGFyaW5mb19pdGVyYXRvcl90ICppICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfY2hhcmluZm9fZW5kICh4Y2JfY2hhcmluZm9faXRlcmF0b3JfdCBpICApOwotCi1pbnQKLXhjYl9xdWVyeV9mb250X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXhjYl9xdWVyeV9mb250X2Nvb2tpZV90Ci14Y2JfcXVlcnlfZm9udCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgIHhjYl9mb250YWJsZV90ICAgIGZvbnQgICk7Ci0KLXhjYl9xdWVyeV9mb250X2Nvb2tpZV90Ci14Y2JfcXVlcnlfZm9udF91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2ZvbnRhYmxlX3QgICAgZm9udCAgKTsKLQoteGNiX2ZvbnRwcm9wX3QgKgoteGNiX3F1ZXJ5X2ZvbnRfcHJvcGVydGllcyAoY29uc3QgeGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdCAqUiAgKTsKLQotaW50Ci14Y2JfcXVlcnlfZm9udF9wcm9wZXJ0aWVzX2xlbmd0aCAoY29uc3QgeGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdCAqUiAgKTsKLQoteGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QKLXhjYl9xdWVyeV9mb250X3Byb3BlcnRpZXNfaXRlcmF0b3IgKGNvbnN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9jaGFyaW5mb190ICoKLXhjYl9xdWVyeV9mb250X2NoYXJfaW5mb3MgKGNvbnN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKlIgICk7Ci0KLWludAoteGNiX3F1ZXJ5X2ZvbnRfY2hhcl9pbmZvc19sZW5ndGggKGNvbnN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9jaGFyaW5mb19pdGVyYXRvcl90Ci14Y2JfcXVlcnlfZm9udF9jaGFyX2luZm9zX2l0ZXJhdG9yIChjb25zdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICpSICApOwotCi14Y2JfcXVlcnlfZm9udF9yZXBseV90ICoKLXhjYl9xdWVyeV9mb250X3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICB4Y2JfcXVlcnlfZm9udF9jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICoqZSAgKTsKLQotaW50Ci14Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgc3RyaW5nX2xlbiAgKTsKLQoteGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdAoteGNiX3F1ZXJ5X3RleHRfZXh0ZW50cyAoeGNiX2Nvbm5lY3Rpb25fdCAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udGFibGVfdCAgICAgIGZvbnQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgc3RyaW5nX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2NoYXIyYl90ICpzdHJpbmcgICk7Ci0KLXhjYl9xdWVyeV90ZXh0X2V4dGVudHNfY29va2llX3QKLXhjYl9xdWVyeV90ZXh0X2V4dGVudHNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udGFibGVfdCAgICAgIGZvbnQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIHN0cmluZ19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfY2hhcjJiX3QgKnN0cmluZyAgKTsKLQoteGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19yZXBseV90ICoKLXhjYl9xdWVyeV90ZXh0X2V4dGVudHNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX2Nvb2tpZV90ICAgY29va2llICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICoqZSAgKTsKLQotaW50Ci14Y2Jfc3RyX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLWNoYXIgKgoteGNiX3N0cl9uYW1lIChjb25zdCB4Y2Jfc3RyX3QgKlIgICk7Ci0KLWludAoteGNiX3N0cl9uYW1lX2xlbmd0aCAoY29uc3QgeGNiX3N0cl90ICpSICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2Jfc3RyX25hbWVfZW5kIChjb25zdCB4Y2Jfc3RyX3QgKlIgICk7Ci0KLXZvaWQKLXhjYl9zdHJfbmV4dCAoeGNiX3N0cl9pdGVyYXRvcl90ICppICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2Jfc3RyX2VuZCAoeGNiX3N0cl9pdGVyYXRvcl90IGkgICk7Ci0KLWludAoteGNiX2xpc3RfZm9udHNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX2xpc3RfZm9udHNfY29va2llX3QKLXhjYl9saXN0X2ZvbnRzICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbWF4X25hbWVzICAsCi0gICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgcGF0dGVybl9sZW4gICwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpwYXR0ZXJuICApOwotCi14Y2JfbGlzdF9mb250c19jb29raWVfdAoteGNiX2xpc3RfZm9udHNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1heF9uYW1lcyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBwYXR0ZXJuX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpwYXR0ZXJuICApOwotCi1pbnQKLXhjYl9saXN0X2ZvbnRzX25hbWVzX2xlbmd0aCAoY29uc3QgeGNiX2xpc3RfZm9udHNfcmVwbHlfdCAqUiAgKTsKLQoteGNiX3N0cl9pdGVyYXRvcl90Ci14Y2JfbGlzdF9mb250c19uYW1lc19pdGVyYXRvciAoY29uc3QgeGNiX2xpc3RfZm9udHNfcmVwbHlfdCAqUiAgKTsKLQoteGNiX2xpc3RfZm9udHNfcmVwbHlfdCAqCi14Y2JfbGlzdF9mb250c19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgeGNiX2xpc3RfZm9udHNfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAqKmUgICk7Ci0KLWludAoteGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19jb29raWVfdAoteGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1heF9uYW1lcyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBwYXR0ZXJuX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpwYXR0ZXJuICApOwotCi14Y2JfbGlzdF9mb250c193aXRoX2luZm9fY29va2llX3QKLXhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1heF9uYW1lcyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgcGF0dGVybl9sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnBhdHRlcm4gICk7Ci0KLXhjYl9mb250cHJvcF90ICoKLXhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19wcm9wZXJ0aWVzIChjb25zdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqUiAgKTsKLQotaW50Ci14Y2JfbGlzdF9mb250c193aXRoX2luZm9fcHJvcGVydGllc19sZW5ndGggKGNvbnN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICpSICApOwotCi14Y2JfZm9udHByb3BfaXRlcmF0b3JfdAoteGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3Byb3BlcnRpZXNfaXRlcmF0b3IgKGNvbnN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICpSICApOwotCi1jaGFyICoKLXhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19uYW1lIChjb25zdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqUiAgKTsKLQotaW50Ci14Y2JfbGlzdF9mb250c193aXRoX2luZm9fbmFtZV9sZW5ndGggKGNvbnN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICpSICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfbGlzdF9mb250c193aXRoX2luZm9fbmFtZV9lbmQgKGNvbnN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICpSICApOwotCi14Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqCi14Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX2Nvb2tpZV90ICAgY29va2llICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUgICk7Ci0KLWludAoteGNiX3NldF9mb250X3BhdGhfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9zZXRfZm9udF9wYXRoX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvbnRfcXR5ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2Jfc3RyX3QgICpmb250ICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3NldF9mb250X3BhdGggKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb250X3F0eSAgLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9zdHJfdCAgKmZvbnQgICk7Ci0KLWludAoteGNiX2dldF9mb250X3BhdGhfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX2dldF9mb250X3BhdGhfY29va2llX3QKLXhjYl9nZXRfZm9udF9wYXRoICh4Y2JfY29ubmVjdGlvbl90ICpjICApOwotCi14Y2JfZ2V0X2ZvbnRfcGF0aF9jb29raWVfdAoteGNiX2dldF9mb250X3BhdGhfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICApOwotCi1pbnQKLXhjYl9nZXRfZm9udF9wYXRoX3BhdGhfbGVuZ3RoIChjb25zdCB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseV90ICpSICApOwotCi14Y2Jfc3RyX2l0ZXJhdG9yX3QKLXhjYl9nZXRfZm9udF9wYXRoX3BhdGhfaXRlcmF0b3IgKGNvbnN0IHhjYl9nZXRfZm9udF9wYXRoX3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9nZXRfZm9udF9wYXRoX3JlcGx5X3QgKgoteGNiX2dldF9mb250X3BhdGhfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfZm9udF9wYXRoX2Nvb2tpZV90ICAgY29va2llICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgKiplICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2NyZWF0ZV9waXhtYXBfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZGVwdGggICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIHBpZCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY3JlYXRlX3BpeG1hcCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGRlcHRoICAsCi0gICAgICAgICAgICAgICAgICAgeGNiX3BpeG1hcF90ICAgICAgcGlkICAsCi0gICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLAotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9mcmVlX3BpeG1hcF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3BpeG1hcF90ICAgICAgcGl4bWFwICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2ZyZWVfcGl4bWFwICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIHBpeG1hcCAgKTsKLQotaW50Ci14Y2JfY3JlYXRlX2djX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY3JlYXRlX2djX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgY2lkICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgICwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jcmVhdGVfZ2MgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGNpZCAgLAotICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgICwKLSAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgICk7Ci0KLWludAoteGNiX2NoYW5nZV9nY19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2NoYW5nZV9nY19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgICwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jaGFuZ2VfZ2MgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAsCi0gICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrICAsCi0gICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0ICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2NvcHlfZ2NfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgc3JjX2djICAsCi0gICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBkc3RfZ2MgICwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY29weV9nYyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIHNyY19nYyAgLAotICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGRzdF9nYyAgLAotICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgICk7Ci0KLWludAoteGNiX3NldF9kYXNoZXNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9zZXRfZGFzaGVzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBkYXNoX29mZnNldCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZGFzaGVzX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAgICAqZGFzaGVzICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3NldF9kYXNoZXMgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLAotICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGRhc2hfb2Zmc2V0ICAsCi0gICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZGFzaGVzX2xlbiAgLAotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKmRhc2hlcyAgKTsKLQotaW50Ci14Y2Jfc2V0X2NsaXBfcmVjdGFuZ2xlc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICByZWN0YW5nbGVzX2xlbiAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9zZXRfY2xpcF9yZWN0YW5nbGVzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgICBvcmRlcmluZyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgICBnYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICAgICBjbGlwX3hfb3JpZ2luICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICAgIGNsaXBfeV9vcmlnaW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9zZXRfY2xpcF9yZWN0YW5nbGVzICh4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgICAgIG9yZGVyaW5nICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgICBnYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgICAgICAgY2xpcF94X29yaWdpbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgICAgICAgY2xpcF95X29yaWdpbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcmVjdGFuZ2xlX3QgKnJlY3RhbmdsZXMgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfZnJlZV9nY19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9mcmVlX2djICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY2xlYXJfYXJlYV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBleHBvc3VyZXMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jbGVhcl9hcmVhICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZXhwb3N1cmVzICAsCi0gICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAsCi0gICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLAotICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgICwKLSAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLAotICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jb3B5X2FyZWFfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBzcmNfZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHN0X2RyYXdhYmxlICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY194ICAsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY195ICAsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF94ICAsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF95ICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jb3B5X2FyZWEgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIHNyY19kcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHN0X2RyYXdhYmxlICAsCi0gICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLAotICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3ggICwKLSAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY195ICAsCi0gICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeCAgLAotICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3kgICwKLSAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAsCi0gICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY29weV9wbGFuZV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBzcmNfZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRzdF9kcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY194ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3ggICwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF95ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBiaXRfcGxhbmUgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY29weV9wbGFuZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIHNyY19kcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRzdF9kcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAsCi0gICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3ggICwKLSAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeSAgLAotICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF94ICAsCi0gICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3kgICwKLSAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLAotICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLAotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGJpdF9wbGFuZSAgKTsKLQotaW50Ci14Y2JfcG9seV9wb2ludF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBwb2ludHNfbGVuICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3BvbHlfcG9pbnRfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgIGdjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3BvaW50X3QgKnBvaW50cyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9wb2x5X3BvaW50ICh4Y2JfY29ubmVjdGlvbl90ICAqYyAgLAotICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUgICwKLSAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgZ2MgICwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbiAgLAotICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9wb2ludF90ICpwb2ludHMgICk7Ci0KLWludAoteGNiX3BvbHlfbGluZV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIHBvaW50c19sZW4gICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfcG9seV9saW5lX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICBnYyAgLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcG9pbnRfdCAqcG9pbnRzICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3BvbHlfbGluZSAoeGNiX2Nvbm5lY3Rpb25fdCAgKmMgICwKLSAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUgICwKLSAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgIGdjICAsCi0gICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbiAgLAotICAgICAgICAgICAgICAgY29uc3QgeGNiX3BvaW50X3QgKnBvaW50cyAgKTsKLQotdm9pZAoteGNiX3NlZ21lbnRfbmV4dCAoeGNiX3NlZ21lbnRfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX3NlZ21lbnRfZW5kICh4Y2Jfc2VnbWVudF9pdGVyYXRvcl90IGkgICk7Ci0KLWludAoteGNiX3BvbHlfc2VnbWVudF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIHNlZ21lbnRzX2xlbiAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9wb2x5X3NlZ21lbnRfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgICBnYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBzZWdtZW50c19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3NlZ21lbnRfdCAqc2VnbWVudHMgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfcG9seV9zZWdtZW50ICh4Y2JfY29ubmVjdGlvbl90ICAgICpjICAsCi0gICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgZ2MgICwKLSAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIHNlZ21lbnRzX2xlbiAgLAotICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3NlZ21lbnRfdCAqc2VnbWVudHMgICk7Ci0KLWludAoteGNiX3BvbHlfcmVjdGFuZ2xlX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICByZWN0YW5nbGVzX2xlbiAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9wb2x5X3JlY3RhbmdsZV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgICAgIGRyYXdhYmxlICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgICBnYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcmVjdGFuZ2xlX3QgKnJlY3RhbmdsZXMgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfcG9seV9yZWN0YW5nbGUgKHhjYl9jb25uZWN0aW9uX3QgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgICAgIGRyYXdhYmxlICAsCi0gICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICAgICAgZ2MgICwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICByZWN0YW5nbGVzX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcmVjdGFuZ2xlX3QgKnJlY3RhbmdsZXMgICk7Ci0KLWludAoteGNiX3BvbHlfYXJjX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBhcmNzX2xlbiAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9wb2x5X2FyY19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGFyY3NfbGVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2FyY190ICAqYXJjcyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9wb2x5X2FyYyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLAotICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBhcmNzX2xlbiAgLAotICAgICAgICAgICAgICBjb25zdCB4Y2JfYXJjX3QgICphcmNzICApOwotCi1pbnQKLXhjYl9maWxsX3BvbHlfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBwb2ludHNfbGVuICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2ZpbGxfcG9seV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgIGdjICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBzaGFwZSAgLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgY29vcmRpbmF0ZV9tb2RlICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBwb2ludHNfbGVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9wb2ludF90ICpwb2ludHMgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfZmlsbF9wb2x5ICh4Y2JfY29ubmVjdGlvbl90ICAqYyAgLAotICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlICAsCi0gICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgZ2MgICwKLSAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBzaGFwZSAgLAotICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgIGNvb3JkaW5hdGVfbW9kZSAgLAotICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgIHBvaW50c19sZW4gICwKLSAgICAgICAgICAgICAgIGNvbnN0IHhjYl9wb2ludF90ICpwb2ludHMgICk7Ci0KLWludAoteGNiX3BvbHlfZmlsbF9yZWN0YW5nbGVfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgcmVjdGFuZ2xlc19sZW4gICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfcG9seV9maWxsX3JlY3RhbmdsZV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICAgICAgZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICAgICAgZ2MgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9wb2x5X2ZpbGxfcmVjdGFuZ2xlICh4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgICAgIGRyYXdhYmxlICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgICBnYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcmVjdGFuZ2xlX3QgKnJlY3RhbmdsZXMgICk7Ci0KLWludAoteGNiX3BvbHlfZmlsbF9hcmNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgYXJjc19sZW4gICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfcG9seV9maWxsX2FyY19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGFyY3NfbGVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfYXJjX3QgICphcmNzICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3BvbHlfZmlsbF9hcmMgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAsCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgYXJjc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfYXJjX3QgICphcmNzICApOwotCi1pbnQKLXhjYl9wdXRfaW1hZ2Vfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBkYXRhX2xlbiAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9wdXRfaW1hZ2VfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmb3JtYXQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgICwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggICwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICAsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF94ICAsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF95ICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGxlZnRfcGFkICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGRlcHRoICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGRhdGFfbGVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKmRhdGEgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfcHV0X2ltYWdlICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmb3JtYXQgICwKLSAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAsCi0gICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLAotICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggICwKLSAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLAotICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3ggICwKLSAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF95ICAsCi0gICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBsZWZ0X3BhZCAgLAotICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZGVwdGggICwKLSAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGRhdGFfbGVuICAsCi0gICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICpkYXRhICApOwotCi1pbnQKLXhjYl9nZXRfaW1hZ2Vfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX2dldF9pbWFnZV9jb29raWVfdAoteGNiX2dldF9pbWFnZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZm9ybWF0ICAsCi0gICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLAotICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLAotICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggICwKLSAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLAotICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGxhbmVfbWFzayAgKTsKLQoteGNiX2dldF9pbWFnZV9jb29raWVfdAoteGNiX2dldF9pbWFnZV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmb3JtYXQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggICwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBwbGFuZV9tYXNrICApOwotCi11aW50OF90ICoKLXhjYl9nZXRfaW1hZ2VfZGF0YSAoY29uc3QgeGNiX2dldF9pbWFnZV9yZXBseV90ICpSICApOwotCi1pbnQKLXhjYl9nZXRfaW1hZ2VfZGF0YV9sZW5ndGggKGNvbnN0IHhjYl9nZXRfaW1hZ2VfcmVwbHlfdCAqUiAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2dldF9pbWFnZV9kYXRhX2VuZCAoY29uc3QgeGNiX2dldF9pbWFnZV9yZXBseV90ICpSICApOwotCi14Y2JfZ2V0X2ltYWdlX3JlcGx5X3QgKgoteGNiX2dldF9pbWFnZV9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfaW1hZ2VfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgKiplICApOwotCi1pbnQKLXhjYl9wb2x5X3RleHRfOF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgaXRlbXNfbGVuICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3BvbHlfdGV4dF84X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBpdGVtc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICppdGVtcyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9wb2x5X3RleHRfOCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLAotICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAsCi0gICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgICwKLSAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgaXRlbXNfbGVuICAsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKml0ZW1zICApOwotCi1pbnQKLXhjYl9wb2x5X3RleHRfMTZfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBpdGVtc19sZW4gICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfcG9seV90ZXh0XzE2X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGl0ZW1zX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICppdGVtcyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9wb2x5X3RleHRfMTYgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAsCi0gICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLAotICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLAotICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLAotICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgaXRlbXNfbGVuICAsCi0gICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICppdGVtcyAgKTsKLQotaW50Ci14Y2JfaW1hZ2VfdGV4dF84X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfaW1hZ2VfdGV4dF84X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgc3RyaW5nX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqc3RyaW5nICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2ltYWdlX3RleHRfOCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgc3RyaW5nX2xlbiAgLAotICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgICwKLSAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAsCi0gICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAsCi0gICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICAsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpzdHJpbmcgICk7Ci0KLWludAoteGNiX2ltYWdlX3RleHRfMTZfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9pbWFnZV90ZXh0XzE2X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBzdHJpbmdfbGVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgIGRyYXdhYmxlICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgIGdjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgIHggICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgICAgeSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2NoYXIyYl90ICpzdHJpbmcgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfaW1hZ2VfdGV4dF8xNiAoeGNiX2Nvbm5lY3Rpb25fdCAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBzdHJpbmdfbGVuICAsCi0gICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICAgZ2MgICwKLSAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgIHggICwKLSAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgIHkgICwKLSAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfY2hhcjJiX3QgKnN0cmluZyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jcmVhdGVfY29sb3JtYXBfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBhbGxvYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBtaWQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl92aXN1YWxpZF90ICAgIHZpc3VhbCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jcmVhdGVfY29sb3JtYXAgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGFsbG9jICAsCi0gICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBtaWQgICwKLSAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgeGNiX3Zpc3VhbGlkX3QgICAgdmlzdWFsICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2ZyZWVfY29sb3JtYXBfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9mcmVlX2NvbG9ybWFwICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jb3B5X2NvbG9ybWFwX2FuZF9mcmVlX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIG1pZCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgc3JjX2NtYXAgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY29weV9jb2xvcm1hcF9hbmRfZnJlZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIG1pZCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIHNyY19jbWFwICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2luc3RhbGxfY29sb3JtYXBfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9pbnN0YWxsX2NvbG9ybWFwICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl91bmluc3RhbGxfY29sb3JtYXBfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3VuaW5zdGFsbF9jb2xvcm1hcCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgKTsKLQotaW50Ci14Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY29va2llX3QKLXhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHMgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgKTsKLQoteGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19jb29raWVfdAoteGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICk7Ci0KLXhjYl9jb2xvcm1hcF90ICoKLXhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY21hcHMgKGNvbnN0IHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfcmVwbHlfdCAqUiAgKTsKLQotaW50Ci14Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2NtYXBzX2xlbmd0aCAoY29uc3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90ICpSICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2NtYXBzX2VuZCAoY29uc3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90ICpSICApOwotCi14Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3QgKgoteGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAgICAgKiplICApOwotCi14Y2JfYWxsb2NfY29sb3JfY29va2llX3QKLXhjYl9hbGxvY19jb2xvciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAsCi0gICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHJlZCAgLAotICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBncmVlbiAgLAotICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBibHVlICApOwotCi14Y2JfYWxsb2NfY29sb3JfY29va2llX3QKLXhjYl9hbGxvY19jb2xvcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHJlZCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZ3JlZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJsdWUgICk7Ci0KLXhjYl9hbGxvY19jb2xvcl9yZXBseV90ICoKLXhjYl9hbGxvY19jb2xvcl9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYWxsb2NfY29sb3JfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICoqZSAgKTsKLQotaW50Ci14Y2JfYWxsb2NfbmFtZWRfY29sb3Jfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX2FsbG9jX25hbWVkX2NvbG9yX2Nvb2tpZV90Ci14Y2JfYWxsb2NfbmFtZWRfY29sb3IgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICApOwotCi14Y2JfYWxsb2NfbmFtZWRfY29sb3JfY29va2llX3QKLXhjYl9hbGxvY19uYW1lZF9jb2xvcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICApOwotCi14Y2JfYWxsb2NfbmFtZWRfY29sb3JfcmVwbHlfdCAqCi14Y2JfYWxsb2NfbmFtZWRfY29sb3JfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2FsbG9jX25hbWVkX2NvbG9yX2Nvb2tpZV90ICAgY29va2llICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAqKmUgICk7Ci0KLWludAoteGNiX2FsbG9jX2NvbG9yX2NlbGxzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXhjYl9hbGxvY19jb2xvcl9jZWxsc19jb29raWVfdAoteGNiX2FsbG9jX2NvbG9yX2NlbGxzICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGNvbnRpZ3VvdXMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBjb2xvcnMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgcGxhbmVzICApOwotCi14Y2JfYWxsb2NfY29sb3JfY2VsbHNfY29va2llX3QKLXhjYl9hbGxvY19jb2xvcl9jZWxsc191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGNvbnRpZ3VvdXMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGNvbG9ycyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgcGxhbmVzICApOwotCi11aW50MzJfdCAqCi14Y2JfYWxsb2NfY29sb3JfY2VsbHNfcGl4ZWxzIChjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUiAgKTsKLQotaW50Ci14Y2JfYWxsb2NfY29sb3JfY2VsbHNfcGl4ZWxzX2xlbmd0aCAoY29uc3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9hbGxvY19jb2xvcl9jZWxsc19waXhlbHNfZW5kIChjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUiAgKTsKLQotdWludDMyX3QgKgoteGNiX2FsbG9jX2NvbG9yX2NlbGxzX21hc2tzIChjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUiAgKTsKLQotaW50Ci14Y2JfYWxsb2NfY29sb3JfY2VsbHNfbWFza3NfbGVuZ3RoIChjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUiAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2FsbG9jX2NvbG9yX2NlbGxzX21hc2tzX2VuZCAoY29uc3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseV90ICoKLXhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICoqZSAgKTsKLQotaW50Ci14Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXhjYl9hbGxvY19jb2xvcl9wbGFuZXNfY29va2llX3QKLXhjYl9hbGxvY19jb2xvcl9wbGFuZXMgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGNvbnRpZ3VvdXMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGNvbG9ycyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgcmVkcyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZ3JlZW5zICAsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBibHVlcyAgKTsKLQoteGNiX2FsbG9jX2NvbG9yX3BsYW5lc19jb29raWVfdAoteGNiX2FsbG9jX2NvbG9yX3BsYW5lc191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBjb250aWd1b3VzICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGNvbG9ycyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHJlZHMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBncmVlbnMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBibHVlcyAgKTsKLQotdWludDMyX3QgKgoteGNiX2FsbG9jX2NvbG9yX3BsYW5lc19waXhlbHMgKGNvbnN0IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCAqUiAgKTsKLQotaW50Ci14Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3BpeGVsc19sZW5ndGggKGNvbnN0IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCAqUiAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2FsbG9jX2NvbG9yX3BsYW5lc19waXhlbHNfZW5kIChjb25zdCB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCAqCi14Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAqKmUgICk7Ci0KLWludAoteGNiX2ZyZWVfY29sb3JzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBwaXhlbHNfbGVuICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2ZyZWVfY29sb3JzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGxhbmVfbWFzayAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHBpeGVsc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICpwaXhlbHMgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfZnJlZV9jb2xvcnMgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLAotICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBwbGFuZV9tYXNrICAsCi0gICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHBpeGVsc19sZW4gICwKLSAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqcGl4ZWxzICApOwotCi12b2lkCi14Y2JfY29sb3JpdGVtX25leHQgKHhjYl9jb2xvcml0ZW1faXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2NvbG9yaXRlbV9lbmQgKHhjYl9jb2xvcml0ZW1faXRlcmF0b3JfdCBpICApOwotCi1pbnQKLXhjYl9zdG9yZV9jb2xvcnNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBpdGVtc19sZW4gICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2Jfc3RvcmVfY29sb3JzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICAgICAgIGNtYXAgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICBpdGVtc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2NvbG9yaXRlbV90ICppdGVtcyAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9zdG9yZV9jb2xvcnMgKHhjYl9jb25uZWN0aW9uX3QgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgICAgICBjbWFwICAsCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIGl0ZW1zX2xlbiAgLAotICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2NvbG9yaXRlbV90ICppdGVtcyAgKTsKLQotaW50Ci14Y2Jfc3RvcmVfbmFtZWRfY29sb3Jfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9zdG9yZV9uYW1lZF9jb2xvcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZmxhZ3MgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGl4ZWwgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm5hbWUgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2Jfc3RvcmVfbmFtZWRfY29sb3IgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZmxhZ3MgICwKLSAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBwaXhlbCAgLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICApOwotCi12b2lkCi14Y2JfcmdiX25leHQgKHhjYl9yZ2JfaXRlcmF0b3JfdCAqaSAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX3JnYl9lbmQgKHhjYl9yZ2JfaXRlcmF0b3JfdCBpICApOwotCi1pbnQKLXhjYl9xdWVyeV9jb2xvcnNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBwaXhlbHNfbGVuICApOwotCi14Y2JfcXVlcnlfY29sb3JzX2Nvb2tpZV90Ci14Y2JfcXVlcnlfY29sb3JzICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAsCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBwaXhlbHNfbGVuICAsCi0gICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICpwaXhlbHMgICk7Ci0KLXhjYl9xdWVyeV9jb2xvcnNfY29va2llX3QKLXhjYl9xdWVyeV9jb2xvcnNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHBpeGVsc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICpwaXhlbHMgICk7Ci0KLXhjYl9yZ2JfdCAqCi14Y2JfcXVlcnlfY29sb3JzX2NvbG9ycyAoY29uc3QgeGNiX3F1ZXJ5X2NvbG9yc19yZXBseV90ICpSICApOwotCi1pbnQKLXhjYl9xdWVyeV9jb2xvcnNfY29sb3JzX2xlbmd0aCAoY29uc3QgeGNiX3F1ZXJ5X2NvbG9yc19yZXBseV90ICpSICApOwotCi14Y2JfcmdiX2l0ZXJhdG9yX3QKLXhjYl9xdWVyeV9jb2xvcnNfY29sb3JzX2l0ZXJhdG9yIChjb25zdCB4Y2JfcXVlcnlfY29sb3JzX3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9xdWVyeV9jb2xvcnNfcmVwbHlfdCAqCi14Y2JfcXVlcnlfY29sb3JzX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3F1ZXJ5X2NvbG9yc19jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAqKmUgICk7Ci0KLWludAoteGNiX2xvb2t1cF9jb2xvcl9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi14Y2JfbG9va3VwX2NvbG9yX2Nvb2tpZV90Ci14Y2JfbG9va3VwX2NvbG9yICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSAgKTsKLQoteGNiX2xvb2t1cF9jb2xvcl9jb29raWVfdAoteGNiX2xvb2t1cF9jb2xvcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICApOwotCi14Y2JfbG9va3VwX2NvbG9yX3JlcGx5X3QgKgoteGNiX2xvb2t1cF9jb2xvcl9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9sb29rdXBfY29sb3JfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgKiplICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2NyZWF0ZV9jdXJzb3JfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY2lkICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfcGl4bWFwX3QgICAgICBzb3VyY2UgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIG1hc2sgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2dyZWVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2JsdWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2dyZWVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2JsdWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHggICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHkgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY3JlYXRlX2N1cnNvciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGNpZCAgLAotICAgICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIHNvdXJjZSAgLAotICAgICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIG1hc2sgICwKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX3JlZCAgLAotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4gICwKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2JsdWUgICwKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX3JlZCAgLAotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4gICwKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2JsdWUgICwKLSAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB4ICAsCi0gICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgeSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jcmVhdGVfZ2x5cGhfY3Vyc29yX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGNpZCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2ZvbnRfdCAgICAgICAgc291cmNlX2ZvbnQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9mb250X3QgICAgICAgIG1hc2tfZm9udCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgc291cmNlX2NoYXIgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1hc2tfY2hhciAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9yZWQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfYmx1ZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19yZWQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfYmx1ZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jcmVhdGVfZ2x5cGhfY3Vyc29yICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY2lkICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2ZvbnRfdCAgICAgICAgc291cmNlX2ZvbnQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udF90ICAgICAgICBtYXNrX2ZvbnQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBzb3VyY2VfY2hhciAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1hc2tfY2hhciAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9ncmVlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfYmx1ZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19ncmVlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfYmx1ZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9mcmVlX2N1cnNvcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2ZyZWVfY3Vyc29yICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvciAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9yZWNvbG9yX2N1cnNvcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9yZWQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2dyZWVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9ibHVlICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19yZWQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2dyZWVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19ibHVlICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3JlY29sb3JfY3Vyc29yICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvciAgLAotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX3JlZCAgLAotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2dyZWVuICAsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfYmx1ZSAgLAotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX3JlZCAgLAotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2dyZWVuICAsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfYmx1ZSAgKTsKLQoteGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9jb29raWVfdAoteGNiX3F1ZXJ5X2Jlc3Rfc2l6ZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgX2NsYXNzICAsCi0gICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggICwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgKTsKLQoteGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9jb29raWVfdAoteGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBfY2xhc3MgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICApOwotCi14Y2JfcXVlcnlfYmVzdF9zaXplX3JlcGx5X3QgKgoteGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9xdWVyeV9iZXN0X3NpemVfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgKiplICApOwotCi1pbnQKLXhjYl9xdWVyeV9leHRlbnNpb25fc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX3F1ZXJ5X2V4dGVuc2lvbl9jb29raWVfdAoteGNiX3F1ZXJ5X2V4dGVuc2lvbiAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm5hbWUgICk7Ci0KLXhjYl9xdWVyeV9leHRlbnNpb25fY29va2llX3QKLXhjYl9xdWVyeV9leHRlbnNpb25fdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICApOwotCi14Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcGx5X3QgKgoteGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9xdWVyeV9leHRlbnNpb25fY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgKiplICApOwotCi1pbnQKLXhjYl9saXN0X2V4dGVuc2lvbnNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX2xpc3RfZXh0ZW5zaW9uc19jb29raWVfdAoteGNiX2xpc3RfZXh0ZW5zaW9ucyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgKTsKLQoteGNiX2xpc3RfZXh0ZW5zaW9uc19jb29raWVfdAoteGNiX2xpc3RfZXh0ZW5zaW9uc191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICk7Ci0KLWludAoteGNiX2xpc3RfZXh0ZW5zaW9uc19uYW1lc19sZW5ndGggKGNvbnN0IHhjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHlfdCAqUiAgKTsKLQoteGNiX3N0cl9pdGVyYXRvcl90Ci14Y2JfbGlzdF9leHRlbnNpb25zX25hbWVzX2l0ZXJhdG9yIChjb25zdCB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHlfdCAqCi14Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2xpc3RfZXh0ZW5zaW9uc19jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAqKmUgICk7Ci0KLWludAoteGNiX2NoYW5nZV9rZXlib2FyZF9tYXBwaW5nX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY2hhbmdlX2tleWJvYXJkX21hcHBpbmdfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBrZXljb2RlX2NvdW50ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2tleWNvZGVfdCAgICAgICBmaXJzdF9rZXljb2RlICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBrZXlzeW1zX3Blcl9rZXljb2RlICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2tleXN5bV90ICprZXlzeW1zICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2NoYW5nZV9rZXlib2FyZF9tYXBwaW5nICh4Y2JfY29ubmVjdGlvbl90ICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBrZXljb2RlX2NvdW50ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9rZXljb2RlX3QgICAgICAgZmlyc3Rfa2V5Y29kZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgIGtleXN5bXNfcGVyX2tleWNvZGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2tleXN5bV90ICprZXlzeW1zICApOwotCi1pbnQKLXhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi14Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfY29va2llX3QKLXhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfa2V5Y29kZV90ICAgICBmaXJzdF9rZXljb2RlICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGNvdW50ICApOwotCi14Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfY29va2llX3QKLXhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9rZXljb2RlX3QgICAgIGZpcnN0X2tleWNvZGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGNvdW50ICApOwotCi14Y2Jfa2V5c3ltX3QgKgoteGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2tleXN5bXMgKGNvbnN0IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXBseV90ICpSICApOwotCi1pbnQKLXhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19rZXlzeW1zX2xlbmd0aCAoY29uc3QgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19rZXlzeW1zX2VuZCAoY29uc3QgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXBseV90ICoKLXhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICoqZSAgKTsKLQotaW50Ci14Y2JfY2hhbmdlX2tleWJvYXJkX2NvbnRyb2xfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9jaGFuZ2Vfa2V5Ym9hcmRfY29udHJvbF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzayAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY2hhbmdlX2tleWJvYXJkX2NvbnRyb2wgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzayAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0ICApOwotCi14Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfY29va2llX3QKLXhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgKTsKLQoteGNiX2dldF9rZXlib2FyZF9jb250cm9sX2Nvb2tpZV90Ci14Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICApOwotCi14Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfcmVwbHlfdCAqCi14Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9rZXlib2FyZF9jb250cm9sX2Nvb2tpZV90ICAgY29va2llICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfYmVsbF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICBpbnQ4X3QgICAgICAgICAgICBwZXJjZW50ICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2JlbGwgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICBpbnQ4X3QgICAgICAgICAgICBwZXJjZW50ICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2NoYW5nZV9wb2ludGVyX2NvbnRyb2xfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgYWNjZWxlcmF0aW9uX251bWVyYXRvciAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgYWNjZWxlcmF0aW9uX2Rlbm9taW5hdG9yICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB0aHJlc2hvbGQgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGRvX2FjY2VsZXJhdGlvbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZG9fdGhyZXNob2xkICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2NoYW5nZV9wb2ludGVyX2NvbnRyb2wgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBhY2NlbGVyYXRpb25fbnVtZXJhdG9yICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgYWNjZWxlcmF0aW9uX2Rlbm9taW5hdG9yICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgdGhyZXNob2xkICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZG9fYWNjZWxlcmF0aW9uICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZG9fdGhyZXNob2xkICApOwotCi14Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9jb29raWVfdAoteGNiX2dldF9wb2ludGVyX2NvbnRyb2wgKHhjYl9jb25uZWN0aW9uX3QgKmMgICk7Ci0KLXhjYl9nZXRfcG9pbnRlcl9jb250cm9sX2Nvb2tpZV90Ci14Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICk7Ci0KLXhjYl9nZXRfcG9pbnRlcl9jb250cm9sX3JlcGx5X3QgKgoteGNiX2dldF9wb2ludGVyX2NvbnRyb2xfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX2Nvb2tpZV90ICAgY29va2llICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgKiplICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3NldF9zY3JlZW5fc2F2ZXJfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgdGltZW91dCAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgaW50ZXJ2YWwgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHByZWZlcl9ibGFua2luZyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgYWxsb3dfZXhwb3N1cmVzICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3NldF9zY3JlZW5fc2F2ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB0aW1lb3V0ICAsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgaW50ZXJ2YWwgICwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwcmVmZXJfYmxhbmtpbmcgICwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBhbGxvd19leHBvc3VyZXMgICk7Ci0KLXhjYl9nZXRfc2NyZWVuX3NhdmVyX2Nvb2tpZV90Ci14Y2JfZ2V0X3NjcmVlbl9zYXZlciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgKTsKLQoteGNiX2dldF9zY3JlZW5fc2F2ZXJfY29va2llX3QKLXhjYl9nZXRfc2NyZWVuX3NhdmVyX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgKTsKLQoteGNiX2dldF9zY3JlZW5fc2F2ZXJfcmVwbHlfdCAqCi14Y2JfZ2V0X3NjcmVlbl9zYXZlcl9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9zY3JlZW5fc2F2ZXJfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAqKmUgICk7Ci0KLWludAoteGNiX2NoYW5nZV9ob3N0c19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2NoYW5nZV9ob3N0c19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZmFtaWx5ICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGFkZHJlc3NfbGVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKmFkZHJlc3MgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfY2hhbmdlX2hvc3RzICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAsCi0gICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmYW1pbHkgICwKLSAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGFkZHJlc3NfbGVuICAsCi0gICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICphZGRyZXNzICApOwotCi1pbnQKLXhjYl9ob3N0X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXVpbnQ4X3QgKgoteGNiX2hvc3RfYWRkcmVzcyAoY29uc3QgeGNiX2hvc3RfdCAqUiAgKTsKLQotaW50Ci14Y2JfaG9zdF9hZGRyZXNzX2xlbmd0aCAoY29uc3QgeGNiX2hvc3RfdCAqUiAgKTsKLQoteGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoteGNiX2hvc3RfYWRkcmVzc19lbmQgKGNvbnN0IHhjYl9ob3N0X3QgKlIgICk7Ci0KLXZvaWQKLXhjYl9ob3N0X25leHQgKHhjYl9ob3N0X2l0ZXJhdG9yX3QgKmkgICk7Ci0KLXhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKLXhjYl9ob3N0X2VuZCAoeGNiX2hvc3RfaXRlcmF0b3JfdCBpICApOwotCi1pbnQKLXhjYl9saXN0X2hvc3RzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgICk7Ci0KLXhjYl9saXN0X2hvc3RzX2Nvb2tpZV90Ci14Y2JfbGlzdF9ob3N0cyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgKTsKLQoteGNiX2xpc3RfaG9zdHNfY29va2llX3QKLXhjYl9saXN0X2hvc3RzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgKTsKLQotaW50Ci14Y2JfbGlzdF9ob3N0c19ob3N0c19sZW5ndGggKGNvbnN0IHhjYl9saXN0X2hvc3RzX3JlcGx5X3QgKlIgICk7Ci0KLXhjYl9ob3N0X2l0ZXJhdG9yX3QKLXhjYl9saXN0X2hvc3RzX2hvc3RzX2l0ZXJhdG9yIChjb25zdCB4Y2JfbGlzdF9ob3N0c19yZXBseV90ICpSICApOwotCi14Y2JfbGlzdF9ob3N0c19yZXBseV90ICoKLXhjYl9saXN0X2hvc3RzX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICB4Y2JfbGlzdF9ob3N0c19jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICoqZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9zZXRfYWNjZXNzX2NvbnRyb2xfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3NldF9hY2Nlc3NfY29udHJvbCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbW9kZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9zZXRfY2xvc2VfZG93bl9tb2RlX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2Jfc2V0X2Nsb3NlX2Rvd25fbW9kZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2Jfa2lsbF9jbGllbnRfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHJlc291cmNlICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX2tpbGxfY2xpZW50ICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHJlc291cmNlICApOwotCi1pbnQKLXhjYl9yb3RhdGVfcHJvcGVydGllc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3JvdGF0ZV9wcm9wZXJ0aWVzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBhdG9tc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkZWx0YSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9hdG9tX3QgKmF0b21zICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX3JvdGF0ZV9wcm9wZXJ0aWVzICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBhdG9tc19sZW4gICwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZGVsdGEgICwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2F0b21fdCAqYXRvbXMgICk7Ci0KLXhjYl92b2lkX2Nvb2tpZV90Ci14Y2JfZm9yY2Vfc2NyZWVuX3NhdmVyX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbW9kZSAgKTsKLQoteGNiX3ZvaWRfY29va2llX3QKLXhjYl9mb3JjZV9zY3JlZW5fc2F2ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgICk7Ci0KLWludAoteGNiX3NldF9wb2ludGVyX21hcHBpbmdfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX3NldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QKLXhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nICh4Y2JfY29ubmVjdGlvbl90ICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbWFwX2xlbiAgLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKm1hcCAgKTsKLQoteGNiX3NldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QKLXhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtYXBfbGVuICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKm1hcCAgKTsKLQoteGNiX3NldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqCi14Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3NldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAqKmUgICk7Ci0KLWludAoteGNiX2dldF9wb2ludGVyX21hcHBpbmdfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX2dldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QKLXhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nICh4Y2JfY29ubmVjdGlvbl90ICpjICApOwotCi14Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdAoteGNiX2dldF9wb2ludGVyX21hcHBpbmdfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICApOwotCi11aW50OF90ICoKLXhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX21hcCAoY29uc3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqUiAgKTsKLQotaW50Ci14Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19tYXBfbGVuZ3RoIChjb25zdCB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90ICpSICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19tYXBfZW5kIChjb25zdCB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90ICpSICApOwotCi14Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90ICoKLXhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICoqZSAgKTsKLQotaW50Ci14Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90Ci14Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmcgKHhjYl9jb25uZWN0aW9uX3QgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAga2V5Y29kZXNfcGVyX21vZGlmaWVyICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9rZXljb2RlX3QgKmtleWNvZGVzICApOwotCi14Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QKLXhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICAgKmMgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgIGtleWNvZGVzX3Blcl9tb2RpZmllciAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2tleWNvZGVfdCAqa2V5Y29kZXMgICk7Ci0KLXhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICoKLXhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYyAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QgICBjb29raWUgICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICoqZSAgKTsKLQotaW50Ci14Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgKTsKLQoteGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90Ci14Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmcgKHhjYl9jb25uZWN0aW9uX3QgKmMgICk7Ci0KLXhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdAoteGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgKTsKLQoteGNiX2tleWNvZGVfdCAqCi14Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfa2V5Y29kZXMgKGNvbnN0IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICpSICApOwotCi1pbnQKLXhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19rZXljb2Rlc19sZW5ndGggKGNvbnN0IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICpSICApOwotCi14Y2JfZ2VuZXJpY19pdGVyYXRvcl90Ci14Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfa2V5Y29kZXNfZW5kIChjb25zdCB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdCAqUiAgKTsKLQoteGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QgKgoteGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICpjICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdCAgIGNvb2tpZSAgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAgKiplICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX25vX29wZXJhdGlvbl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICApOwotCi14Y2Jfdm9pZF9jb29raWVfdAoteGNiX25vX29wZXJhdGlvbiAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvV2luMzIvbGlicG5nZC5saWIgYi9saWJzL1dpbjMyL2xpYnBuZ2QubGliCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzE3MmU4Li4wMDAwMDAwCi0tLSBhL2xpYnMvV2luMzIvbGlicG5nZC5saWIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL1dpbjMyL3psaWJkLmxpYiBiL2xpYnMvV2luMzIvemxpYmQubGliCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDNjY2FkLi4wMDAwMDAwCi0tLSBhL2xpYnMvV2luMzIvemxpYmQubGliCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9XaW42NC9saWJwbmdkLmxpYiBiL2xpYnMvV2luNjQvbGlicG5nZC5saWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTQ4NWEuLjAwMDAwMDAKLS0tIGEvbGlicy9XaW42NC9saWJwbmdkLmxpYgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvV2luNjQvemxpYmQubGliIGIvbGlicy9XaW42NC96bGliZC5saWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZTIwZmUuLjAwMDAwMDAKLS0tIGEvbGlicy9XaW42NC96bGliZC5saWIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9BTk5PVU5DRSBiL2xpYnMvbGlicG5nL0FOTk9VTkNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDc4NjczLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL0FOTk9VTkNFCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotCi1MaWJwbmcgMS4yLjM3IC0gSnVuZSA0LCAyMDA5Ci0KLVRoaXMgaXMgYSBwdWJsaWMgcmVsZWFzZSBvZiBsaWJwbmcsIGludGVuZGVkIGZvciB1c2UgaW4gcHJvZHVjdGlvbiBjb2Rlcy4KLQotRmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZDoKLQotU291cmNlIGZpbGVzIHdpdGggTEYgbGluZSBlbmRpbmdzIChmb3IgVW5peC9MaW51eCkgYW5kIHdpdGggYQotImNvbmZpZ3VyZSIgc2NyaXB0Ci0KLSAgIGxpYnBuZy0xLjIuMzcudGFyLmd6Ci0gICBsaWJwbmctMS4yLjM3LnRhci5sem1hCi0gICAgIChHZXQgdGhlIGx6bWEgY29kZWMgZnJvbSA8aHR0cDovL3R1a2Fhbmkub3JnL2x6bWE+KS4KLSAgIGxpYnBuZy0xLjIuMzcudGFyLmJ6MgotCi1Tb3VyY2UgZmlsZXMgd2l0aCBMRiBsaW5lIGVuZGluZ3MgKGZvciBVbml4L0xpbnV4KSB3aXRob3V0IHRoZQotImNvbmZpZ3VyZSIgc2NyaXB0Ci0KLSAgIGxpYnBuZy0xLjIuMzctbm8tY29uZmlnLnRhci5negotICAgbGlicG5nLTEuMi4zNy1uby1jb25maWcudGFyLmx6bWEKLSAgIGxpYnBuZy0xLjIuMzctbm8tY29uZmlnLnRhci5iejIKLQotU291cmNlIGZpbGVzIHdpdGggQ1JMRiBsaW5lIGVuZGluZ3MgKGZvciBXaW5kb3dzKSwgd2l0aG91dCB0aGUKLSJjb25maWd1cmUiIHNjcmlwdAotCi0gICBscG5nMTIzNy56aXAKLSAgIGxwbmcxMjM3Ljd6Ci0gICBscG5nMTIzNy50YXIuYnoyCi0KLVByb2plY3QgZmlsZXMKLQotICAgbGlicG5nLTEuMi4zNy1wcm9qZWN0LW5ldHdhcmUuemlwCi0gICBsaWJwbmctMS4yLjM3LXByb2plY3Qtd2luY2UuemlwCi0KLU90aGVyIGluZm9ybWF0aW9uOgotCi0gICBsaWJwbmctMS4yLjM3LVJFQURNRS50eHQKLSAgIGxpYnBuZy0xLjIuMzctS05PV05CVUdTLnR4dAotICAgbGlicG5nLTEuMi4zNy1MSUNFTlNFLnR4dAotICAgbGlicG5nLTEuMi4zNy1ZMkstY29tcGxpYW5jZS50eHQKLSAgIGxpYnBuZy0xLjIuMzctW3ByZXZpb3VzIHZlcnNpb25dLWRpZmYudHh0Ci0KLUNoYW5nZXMgc2luY2UgdGhlIGxhc3QgcHVibGljIHJlbGVhc2UgKDEuMi4zNik6Ci0KLXZlcnNpb24gMS4yLjM3IFtKdW5lIDQsIDIwMDldCi0KLSAgRml4ZWQgaW5jb25zaXN0ZW5jeSBpbiBwbmdydXRpbC5jLCBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuMzYuICBUaGUKLSAgICBtZW1zZXQoKSB3YXMgdXNpbmcgInBuZ19wdHItPnJvd2J5dGVzIiBpbnN0ZWFkIG9mICJyb3dfYnl0ZXMiLCB3aGljaAotICAgIHRoZSBjb3JyZXNwb25kaW5nIHBuZ19tYWxsb2MoKSB1c2VzIChKb2UgRHJldykuCi0gIENsYXJpZmllZCB1c2FnZSBvZiBzaWdfYml0IHZlcnN1cyBzaWdfYml0X3AgaW4gZXhhbXBsZS5jIChWaW5jZW50IFRvcnJpKQotICBVcGRhdGVkIHNvbWUgb2YgdGhlIG1ha2VmaWxlcyBpbiB0aGUgc2NyaXB0cyBkaXJlY3RvcnkuCi0gIEZpeGVkIHR5cG8gaW4gbGlicG5nIGRvY3VtZW50YXRpb24gKEZJTFRFUl9BVkUgc2hvdWxkIGJlIEZJTFRFUl9BVkcpCi0gIFJlbG9jYXRlZCBtaXNwbGFjZWQgI2VuZGlmIGluIHBuZ3dyaXRlLmMsIHNDQUwgY2h1bmsgaGFuZGxlci4KLSAgQ29uZGl0aW9uYWxseSBjb21waWxlIHBuZ19yZWFkX2ZpbmlzaF9yb3coKSB3aGljaCBpcyBub3QgdXNlZCBieQotICAgIHByb2dyZXNzaXZlIHJlYWRlcnMuCi0gIEFkZGVkIGNvbnRyaWIvcG5nbWluaW0vcHJlYWRlciB0byBkZW1vbnN0cmF0ZSBidWlsZGluZyBtaW5pbWFsIHByb2dyZXNzaXZlCi0gICAgZGVjb2RlciwgYmFzZWQgb24gY29udHJpYi9ncmVnYm9vayB3aXRoIGVtYmVkZGVkIGxpYnBuZyBhbmQgemxpYi4KLSAgSW4gY29udHJpYi9wbmdtaW5pbS8qLCByZW5hbWVkICJtYWtlZmlsZS5zdGQiIHRvICJtYWtlZmlsZSIsIHNpbmNlIHRoZXJlCi0gICAgaXMgb25seSBvbmUgbWFrZWZpbGUgaW4gdGhvc2UgZGlyZWN0b3JpZXMsIGFuZCByZXZpc2VkIHRoZSBSRUFETUUgZmlsZXMKLSAgICBhY2NvcmRpbmdseS4KLSAgUmVmb3JtYXRlZCBzb3VyY2VzIGluIGxpYnBuZyBzdHlsZSAoMy1zcGFjZSBpbmRlbnRhdGlvbiwgY29tbWVudCBmb3JtYXQpCi0gIEFkZGVkIHNlY3Rpb25zIGFib3V0IHRoZSBnaXQgcmVwb3NpdG9yeSBhbmQgb3VyIGNvZGluZyBzdHlsZSB0byB0aGUKLSAgICBkb2N1bWVudGF0aW9uIChtZXJnZWQgZnJvbSBsaWJwbmctMS40LjBiZXRhNjIpCi0gIEFkZGVkIGEgc2VjdGlvbiBhYm91dCB1c2luZyBwbmdfZ2V0X2lvX3B0cigpIGluIGNvbmZpZ3VyZSBzY3JpcHRzIHRvIGRldGVjdAotICAgIHRoZSBwcmVzZW5jZSBvZiBsaWJwbmcuCi0KLVNlbmQgY29tbWVudHMvY29ycmVjdGlvbnMvY29tbWVuZGF0aW9ucyB0byBwbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zZi5uZXQKLShzdWJzY3JpcHRpb24gcmVxdWlyZWQ7IHZpc2l0IAotaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vcG5nLW1uZy1pbXBsZW1lbnQKLXRvIHN1YnNjcmliZSkgb3IgdG8gZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKLQotR2xlbm4gUi1QCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9DSEFOR0VTIGIvbGlicy9saWJwbmcvQ0hBTkdFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI4MTExZS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9DSEFOR0VTCisrKyAvZGV2L251bGwKQEAgLTEsMjQxMyArMCwwIEBACi0vKgotQ0hBTkdFUyAtIGNoYW5nZXMgZm9yIGxpYnBuZwotCi12ZXJzaW9uIDAuMgotICBhZGRlZCByZWFkZXIgaW50byBwbmcuaAotICBmaXhlZCBzbWFsbCBwcm9ibGVtcyBpbiBzdHViIGZpbGUKLQotdmVyc2lvbiAwLjMKLSAgYWRkZWQgcHVsbCByZWFkZXIKLSAgc3BsaXQgdXAgcG5nd3JpdGUuYyB0byBzZXZlcmFsIGZpbGVzCi0gIGFkZGVkIHBuZ2xpYi50eHQKLSAgYWRkZWQgZXhhbXBsZS5jCi0gIGNsZWFuZWQgdXAgd3JpdGVyLCBhZGRpbmcgYSBmZXcgbmV3IHRyYW5zZm9ybWF0aW9ucwotICBmaXhlZCBzb21lIGJ1Z3MgaW4gd3JpdGVyCi0gIGludGVyZmFjZWQgd2l0aCB6bGliIDAuNQotICBhZGRlZCBLJlIgc3VwcG9ydAotICBhZGRlZCBjaGVjayBmb3IgNjQgS0IgYmxvY2tzIGZvciAxNiBiaXQgbWFjaGluZXMKLQotdmVyc2lvbiAwLjQKLSAgY2xlYW5lZCB1cCBjb2RlIGFuZCBjb21tZW50ZWQgY29kZQotICBzaW1wbGlmaWVkIHRpbWUgaGFuZGxpbmcgaW50byBwbmdfdGltZQotICBjcmVhdGVkIHBuZ19jb2xvcl8xNiBhbmQgcG5nX2NvbG9yXzggdG8gaGFuZGxlIGNvbG9yIG5lZWRzCi0gIGNsZWFuZWQgdXAgY29sb3IgdHlwZSBkZWZpbmVzCi0gIGZpeGVkIHZhcmlvdXMgYnVncwotICBtYWRlIHZhcmlvdXMgbmFtZXMgbW9yZSBjb25zaXN0ZW50Ci0gIGludGVyZmFjZWQgd2l0aCB6bGliIDAuNzEKLSAgY2xlYW5lZCB1cCB6VFh0IHJlYWRlciBhbmQgd3JpdGVyICh1c2luZyB6bGliJ3MgUmVzZXQgZnVuY3Rpb25zKQotICBzcGxpdCB0cmFuc2Zvcm1hdGlvbnMgaW50byBwbmdydHJhbi5jIGFuZCBwbmd3dHJhbi5jCi0KLXZlcnNpb24gMC41Ci0gIGludGVyZmFjZWQgd2l0aCB6bGliIDAuOAotICBmaXhlZCBtYW55IHJlYWRpbmcgYW5kIHdyaXRpbmcgYnVncwotICBzYXZlZCB1c2luZyAzIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYnMKLQotdmVyc2lvbiAwLjYKLSAgYWRkZWQgcG5nX2xhcmdlX21hbGxvYygpIGFuZCBwbmdfbGFyZ2VfZnJlZSgpCi0gIGFkZGVkIHBuZ19zaXplX3QKLSAgY2xlYW5lZCB1cCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzCi0gIGFkZGVkIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkKLQotdmVyc2lvbiAwLjcKLSAgY2xlYW5lZCB1cCBsb3RzIG9mIGJ1Z3MKLSAgZmluaXNoZWQgZGl0aGVyaW5nIGFuZCBvdGhlciBzdHVmZgotICBhZGRlZCB0ZXN0IHByb2dyYW0KLSAgY2hhbmdlZCBuYW1lIGZyb20gcG5nbGliIHRvIGxpYnBuZwotCi12ZXJzaW9uIDAuNzEgW0p1bmUsIDE5OTVdCi0gIGNoYW5nZWQgcG5ndGVzdC5wbmcgZm9yIHpsaWIgMC45MwotICBmaXhlZCBlcnJvciBpbiBsaWJwbmcudHh0IGFuZCBleGFtcGxlLmMKLQotdmVyc2lvbiAwLjgKLSAgY2xlYW5lZCB1cCBzb21lIGJ1Z3MKLSAgYWRkZWQgcG5nX3NldF9maWxsZXIoKQotICBzcGxpdCB1cCBwbmdzdHViLmMgaW50byBwbmdtZW0uYywgcG5naW8uYywgYW5kIHBuZ2Vycm9yLmMKLSAgYWRkZWQgI2RlZmluZSdzIHRvIHJlbW92ZSB1bndhbnRlZCBjb2RlCi0gIG1vdmVkIHBuZ19pbmZvX2luaXQoKSB0byBwbmcuYwotICBhZGRlZCBvbGRfc2l6ZSBpbnRvIHBuZ19yZWFsbG9jKCkKLSAgYWRkZWQgZnVuY3Rpb25zIHRvIG1hbnVhbGx5IHNldCBmaWx0ZXJpbmcgYW5kIGNvbXByZXNzaW9uIGluZm8KLSAgY2hhbmdlZCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJhc2VkIG9uIGltYWdlIHR5cGUKLSAgb3B0aW1pemVkIGZpbHRlciBzZWxlY3Rpb24gY29kZQotICBhZGRlZCB2ZXJzaW9uIGluZm8KLSAgY2hhbmdlZCBleHRlcm5hbCBmdW5jdGlvbnMgcGFzc2luZyBmbG9hdHMgdG8gZG91YmxlcyAoayZyIHByb2JsZW1zPykKLSAgcHV0IGFsbCB0aGUgY29uZmlndXJhYmxlIHN0dWZmIGluIHBuZ2NvbmYuaAotICBlbmFibGVkIHBuZ19zZXRfc2hpZnQgdG8gd29yayB3aXRoIHBhbGV0dGVkIGltYWdlcyBvbiByZWFkCi0gIGFkZGVkIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgLSB1cGRhdGVzIGluZm8gc3RydWN0dXJlIHdpdGgKLSAgICAgdHJhbnNmb3JtYXRpb25zCi0KLXZlcnNpb24gMC44MSBbQXVndXN0LCAxOTk1XQotICBpbmNvcnBvcmF0ZWQgVGltIFdlZ25lcidzIG1lZGl1bSBtb2RlbCBjb2RlICh0aGFua3MsIFRpbSkKLQotdmVyc2lvbiAwLjgyIFtTZXB0ZW1iZXIsIDE5OTVdCi0gIFt1bnNwZWNpZmllZCBjaGFuZ2VzXQotCi12ZXJzaW9uIDAuODUgW0RlY2VtYmVyLCAxOTk1XQotICBhZGRlZCBtb3JlIG1lZGl1bSBtb2RlbCBjb2RlIChhbG1vc3QgZXZlcnl0aGluZydzIGEgZmFyKQotICBhZGRlZCBpL28sIGVycm9yLCBhbmQgbWVtb3J5IGNhbGxiYWNrIGZ1bmN0aW9ucwotICBmaXhlZCBzb21lIGJ1Z3MgKDE2IGJpdCwgNCBiaXQgaW50ZXJsYWNlZCwgZXRjLikKLSAgYWRkZWQgZmlyc3QgcnVuIHByb2dyZXNzaXZlIHJlYWRlciAoYmFyZWx5IHRlc3RlZCkKLQotdmVyc2lvbiAwLjg2IFtKYW51YXJ5LCAxOTk2XQotICBmaXhlZCBidWdzCi0gIGltcHJvdmVkIGRvY3VtZW50YXRpb24KLQotdmVyc2lvbiAwLjg3IFtKYW51YXJ5LCAxOTk2XQotICBmaXhlZCBtZWRpdW0gbW9kZWwgYnVncwotICBmaXhlZCBvdGhlciBidWdzIGludHJvZHVjZWQgaW4gMC44NSBhbmQgMC44NgotICBhZGRlZCBzb21lIG1pbm9yIGRvY3VtZW50YXRpb24KLQotdmVyc2lvbiAwLjg4IFtKYW51YXJ5LCAxOTk2XQotICBmaXhlZCBwcm9ncmVzc2l2ZSBidWdzCi0gIHJlcGxhY2VkIHRhYnMgd2l0aCBzcGFjZXMKLSAgY2xlYW5lZCB1cCBkb2N1bWVudGF0aW9uCi0gIGFkZGVkIGNhbGxiYWNrcyBmb3IgcmVhZC93cml0ZSBhbmQgd2FybmluZy9lcnJvciBmdW5jdGlvbnMKLQotdmVyc2lvbiAwLjg5IFtKdWx5LCAxOTk2XQotICBhZGRlZCBuZXcgaW5pdGlhbGl6YXRpb24gQVBJIHRvIG1ha2UgbGlicG5nIHdvcmsgYmV0dGVyIHdpdGggc2hhcmVkIGxpYnMKLSAgICAgd2Ugbm93IGhhdmUgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpLCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpLAotICAgICBwbmdfY3JlYXRlX2luZm9fc3RydWN0KCksIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCksIGFuZAotICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSBpbnN0ZWFkIG9mIHRoZSBzZXBhcmF0ZSBjYWxscyB0bwotICAgICBtYWxsb2MgYW5kIHBuZ19yZWFkX2luaXQoKSwgcG5nX2luZm9faW5pdCgpLCBhbmQgcG5nX3dyaXRlX2luaXQoKQotICBjaGFuZ2VkIHdhcm5pbmcvZXJyb3IgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIGZpeCBidWcgLSB0aGlzIG1lYW5zIHlvdQotICAgICBzaG91bGQgdXNlIHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gQVBJIGlmIHlvdSB3ZXJlIHVzaW5nIHRoZSBvbGQKLSAgICAgcG5nX3NldF9tZXNzYWdlX2ZuKCkgY2FsbHMsIGFuZCB0aGF0IHRoZSBvbGQgQVBJIG5vIGxvbmdlciBleGlzdHMKLSAgICAgc28gdGhhdCBwZW9wbGUgYXJlIGF3YXJlIHRoYXQgdGhleSBuZWVkIHRvIGNoYW5nZSB0aGVpciBjb2RlCi0gIGNoYW5nZWQgZmlsdGVyIHNlbGVjdGlvbiBBUEkgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIG11bHRpcGxlIGZpbHRlcnMKLSAgICAgc2luY2UgaXQgZGlkbid0IHdvcmsgaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgbGlicG5nIGFueXdheXMKLSAgb3B0aW1pemVkIGZpbHRlciBzZWxlY3Rpb24gY29kZQotICBmaXhlZCBwbmdfc2V0X2JhY2tncm91bmQoKSB0byBhbGxvdyB1c2luZyBhbiBhcmJpdHJhcnkgUkdCIGNvbG9yIGZvcgotICAgICBwYWxldHRlZCBpbWFnZXMKLSAgZml4ZWQgZ2FtbWEgYW5kIGJhY2tncm91bmQgY29ycmVjdGlvbiBmb3IgcGFsZXR0ZWQgaW1hZ2VzLCBzbwotICAgICBwbmdfY29ycmVjdF9wYWxldHRlIGlzIG5vdCBuZWVkZWQgdW5sZXNzIHlvdSBhcmUgY29ycmVjdGluZyBhbgotICAgICBleHRlcm5hbCBwYWxldHRlICh5b3Ugd2lsbCBuZWVkIHRvICNkZWZpbmUgUE5HX0NPUlJFQ1RfUEFMRVRURV9TVVBQT1JURUQKLSAgICAgaW4gcG5nY29uZi5oKSAtIGlmIG5vYm9keSB1c2VzIHRoaXMsIGl0IG1heSBkaXNhcHBlYXIgaW4gdGhlIGZ1dHVyZS4KLSAgZml4ZWQgYnVnIHdpdGggQm9ybGFuZCA2NEsgbWVtb3J5IGFsbG9jYXRpb24gKEFsZXhhbmRlciBMZWhtYW5uKQotICBmaXhlZCBidWcgaW4gaW50ZXJsYWNlIGhhbmRsaW5nIChTbWFyYXNkZXJhZ2QsIEkgdGhpbmspCi0gIGFkZGVkIG1vcmUgZXJyb3IgY2hlY2tpbmcgZm9yIHdyaXRpbmcgYW5kIGltYWdlIHRvIHJlZHVjZSBpbnZhbGlkIGZpbGVzCi0gIHNlcGFyYXRlZCByZWFkIGFuZCB3cml0ZSBmdW5jdGlvbnMgc28gdGhhdCB0aGV5IHdvbid0IGJvdGggYmUgbGlua2VkCi0gICAgIGludG8gYSBiaW5hcnkgd2hlbiBvbmx5IHJlYWRpbmcgb3Igd3JpdGluZyBmdW5jdGlvbmFsaXR5IGlzIHVzZWQKLSAgbmV3IHBuZ3Rlc3QgaW1hZ2UgYWxzbyBoYXMgaW50ZXJsYWNpbmcgYW5kIHpUWHQKLSAgdXBkYXRlZCBkb2N1bWVudGF0aW9uIHRvIHJlZmxlY3QgbmV3IEFQSQotCi12ZXJzaW9uIDAuOTAgW0phbnVhcnksIDE5OTddCi0gIG1hZGUgQ1JDIGVycm9ycy93YXJuaW5ncyBvbiBjcml0aWNhbCBhbmQgYW5jaWxsYXJ5IGNodW5rcyBjb25maWd1cmFibGUKLSAgbGlicG5nIHdpbGwgdXNlIHRoZSB6bGliIENSQyByb3V0aW5lcyBieSAoY29tcGlsZS10aW1lKSBkZWZhdWx0Ci0gIGNoYW5nZWQgRE9TIHNtYWxsL21lZGl1bSBtb2RlbCBtZW1vcnkgc3VwcG9ydCAtIG5lZWRzIHpsaWIgMS4wNCAoVGltIFdlZ25lcikKLSAgYWRkZWQgZXh0ZXJuYWwgQysrIHdyYXBwZXIgc3RhdGVtZW50cyB0byBwbmcuaCAoR2lsbGVzIERhdXBoaW4pCi0gIGFsbG93IFBORyBmaWxlIHRvIGJlIHJlYWQgd2hlbiBzb21lIG9yIGFsbCBvZiBmaWxlIHNpZ25hdHVyZSBoYXMgYWxyZWFkeQotICAgICBiZWVuIHJlYWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uICAqKioqVGhpcyBhZmZlY3RzIHRoZSBzaXplCi0gICAgIG9mIGluZm9fc3RydWN0IGFuZCBpbnZhbGlkYXRlcyBhbGwgcHJvZ3JhbXMgdGhhdCB1c2UgYSBzaGFyZWQgbGlicG5nKioqKgotICBmaXhlZCBwbmdfZmlsbGVyKCkgZGVjbGFyYXRpb25zCi0gIGZpeGVkPyBiYWNrZ3JvdW5kIGNvbG9yIGNvbnZlcnNpb25zCi0gIGZpeGVkIG9yZGVyIG9mIGVycm9yIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIG1hdGNoIGRvY3VtZW50YXRpb24KLSAgY3VycmVudCBjaHVuayBuYW1lIGlzIG5vdyBhdmFpbGFibGUgaW4gcG5nX3N0cnVjdCB0byByZWR1Y2UgdGhlIG51bWJlcgotICAgICBvZiBuZWFybHkgaWRlbnRpY2FsIGVycm9yIG1lc3NhZ2VzICh3aWxsIHNpbXBsaWZ5IG11bHRpLWxpbmd1YWwKLSAgICAgc3VwcG9ydCB3aGVuIGF2YWlsYWJsZSkKLSAgdHJ5IHRvIGdldCByZWFkeSBmb3IgdW5rbm93bi1jaHVuayBjYWxsYmFjayBmdW5jdGlvbnM6Ci0gICAgIC0gcHJldmlvdXNseSByZWFkIGNyaXRpY2FsIGNodW5rcyBhcmUgZmxhZ2dlZCwgc28gdGhlIGNodW5rIGhhbmRsaW5nCi0gICAgICAgcm91dGluZXMgY2FuIGRldGVybWluZSBpZiB0aGUgY2h1bmsgaXMgaW4gdGhlIHJpZ2h0IHBsYWNlCi0gICAgIC0gYWxsIGNodW5rIGhhbmRsaW5nIHJvdXRpbmVzIGhhdmUgdGhlIHNhbWUgcHJvdG90eXBlcywgc28gd2Ugd2lsbAotICAgICAgIGJlIGFibGUgdG8gaGFuZGxlIGFsbCBjaHVua3MgdmlhIGEgY2FsbGJhY2sgbWVjaGFuaXNtCi0gIHRyeSB0byBmaXggTGludXggInNldGptcCIgYnVmZmVyIHNpemUgcHJvYmxlbXMKLSAgcmVtb3ZlZCBwbmdfbGFyZ2VfbWFsbG9jLCBwbmdfbGFyZ2VfZnJlZSwgYW5kIHBuZ19yZWFsbG9jIGZ1bmN0aW9ucy4KLQotdmVyc2lvbiAwLjk1IFtNYXJjaCwgMTk5N10KLSAgZml4ZWQgYnVnIGluIHBuZ3d1dGlsLmMgYWxsb2NhdGluZyAidXBfcm93IiB0d2ljZSBhbmQgImF2Z19yb3ciIG5ldmVyCi0gIGZpeGVkIGJ1ZyBpbiBQTkcgZmlsZSBzaWduYXR1cmUgY29tcGFyZXMgd2hlbiBzdGFydCAhPSAwCi0gIGNoYW5nZWQgcGFyYW1ldGVyIHR5cGUgb2YgcG5nX3NldF9maWxsZXIoLi4uZmlsbGVyLi4uKSBmcm9tIHBuZ19ieXRlCi0gICAgIHRvIHBuZ191aW50XzMyCi0gIGFkZGVkIHRlc3QgZm9yIE1BQ09TIHRvIGVuc3VyZSB0aGF0IGJvdGggbWF0aC5oIGFuZCBmcC5oIGFyZSBub3QgI2luY2x1ZGVkCi0gIGFkZGVkIG1hY3JvcyBmb3IgbGlicG5nIHRvIGJlIGNvbXBpbGVkIGFzIGEgV2luZG93cyBETEwgKEFuZHJlYXMgS3VwcmllcykKLSAgYWRkZWQgInBhY2tzd2FwIiB0cmFuc2Zvcm1hdGlvbiwgd2hpY2ggY2hhbmdlcyB0aGUgZW5kaWFubmVzcyBvZgotICAgICBwYWNrZWQtcGl4ZWwgYnl0ZXMgKEtldmluIEJyYWNleSkKLSAgYWRkZWQgInN0cmlwX2FscGhhIiB0cmFuc2Zvcm1hdGlvbiwgd2hpY2ggcmVtb3ZlcyB0aGUgYWxwaGEgY2hhbm5lbCBvZgotICAgICBpbnB1dCBpbWFnZXMgd2l0aG91dCB1c2luZyBpdCAobm90IG5lY2Vzc2FyaWx5IGEgZ29vZCBpZGVhKQotICBhZGRlZCAic3dhcF9hbHBoYSIgdHJhbnNmb3JtYXRpb24sIHdoaWNoIHB1dHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gZnJvbnQKLSAgICAgb2YgdGhlIGNvbG9yIGJ5dGVzIGluc3RlYWQgb2YgYWZ0ZXIKLSAgcmVtb3ZlZCBhbGwgaW1wbGljaXQgdmFyaWFibGUgdGVzdHMgd2hpY2ggYXNzdW1lIE5VTEwgPT0gMCAoSSB0aGluaykKLSAgY2hhbmdlZCBzZXZlcmFsIHZhcmlhYmxlcyB0byAicG5nX3NpemVfdCIgdG8gc2hvdyAxNi8zMi1iaXQgbGltaXRhdGlvbnMKLSAgYWRkZWQgbmV3IHBDQUwgY2h1bmsgcmVhZC93cml0ZSBzdXBwb3J0Ci0gIGFkZGVkIGV4cGVyaW1lbnRhbCBmaWx0ZXIgc2VsZWN0aW9uIHdlaWdodGluZyAoR3JlZyBSb2Vsb2ZzKQotICByZW1vdmVkIG9sZCBwbmdfc2V0X3JnYngoKSBhbmQgcG5nX3NldF94cmdiKCkgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuCi0gICAgIG9ic29sZXRlIGZvciBhYm91dCAyIHllYXJzIG5vdyAodXNlIHBuZ19zZXRfZmlsbGVyKCkgaW5zdGVhZCkKLSAgYWRkZWQgbWFjcm9zIHRvIHJlYWQgMTYtIGFuZCAzMi1iaXQgaW50cyBkaXJlY3RseSBmcm9tIGJ1ZmZlciwgdG8gYmUKLSAgICAgdXNlZCBvbmx5IG9uIHRob3NlIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGl0IChuYW1lbHkgUG93ZXJQQyBhbmQgNjgweDApCi0gICAgIFdpdGggc29tZSB0ZXN0aW5nLCB0aGlzIG1heSBiZWNvbWUgdGhlIGRlZmF1bHQgZm9yIE1BQ09TL1BQQyBzeXN0ZW1zLgotICBvbmx5IGNhbGN1bGF0ZSBDUkMgb24gZGF0YSBpZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGl0Ci0gIGFkZGVkIG1hY3JvcyBmb3IgelRYdCBjb21wcmVzc2lvbiB0eXBlIFBOR196VFh0X0NPTVBSRVNTSU9OXz8/PwotICBhZGRlZCBtYWNyb3MgZm9yIHNpbXBsZSBsaWJwbmcgZGVidWdnaW5nIG91dHB1dCBzZWxlY3RhYmxlIGF0IGNvbXBpbGUgdGltZQotICByZW1vdmVkIFBOR19SRUFEX0VORF9NT0RFIGluIHByb2dyZXNzaXZlIHJlYWRlciAoU21hcmFzZGVyYWdkKQotICBtb3JlIGRlc2NyaXB0aW9uIG9mIGluZm9fc3RydWN0IGluIGxpYnBuZy50eHQgYW5kIHBuZy5oCi0gIG1vcmUgaW5zdHJ1Y3Rpb25zIGluIGV4YW1wbGUuYwotICBtb3JlIGNodW5rIHR5cGVzIHRlc3RlZCBpbiBwbmd0ZXN0LmMKLSAgcmVuYW1lZCBwbmdyY2IuYyB0byBwbmdzZXQuYywgYW5kIGFsbCBwbmdfcmVhZF88Y2h1bms+IGZ1bmN0aW9ucyB0byBiZQotICAgICBwbmdfc2V0XzxjaHVuaz4uICBXZSBub3cgaGF2ZSBjb3JyZXNwb25kaW5nIHBuZ19nZXRfPGNodW5rPgotICAgICBmdW5jdGlvbnMgaW4gcG5nZ2V0LmMgdG8gZ2V0IGluZm9ybWF0aW9uIGluIGluZm9fcHRyLiAgVGhpcyBpc29sYXRlcwotICAgICB0aGUgYXBwbGljYXRpb24gZnJvbSB0aGUgaW50ZXJuYWwgb3JnYW5pemF0aW9uIG9mIHBuZ19pbmZvX3N0cnVjdAotICAgICAoZ29vZCBmb3Igc2hhcmVkIGxpYnJhcnkgaW1wbGVtZW50YXRpb25zKS4KLQotdmVyc2lvbiAwLjk2IFtNYXksIDE5OTddCi0gIGZpeGVkIHNlcmlvdXMgYnVnIHdpdGggPCA4YnBwIGltYWdlcyBpbnRyb2R1Y2VkIGluIDAuOTUKLSAgZml4ZWQgMjU2LWNvbG9yIHRyYW5zcGFyZW5jeSBidWcgKEdyZWcgUm9lbG9mcykKLSAgZml4ZWQgdXAgZG9jdW1lbnRhdGlvbiAoR3JlZyBSb2Vsb2ZzLCBMYXN6bG8gTnl1bCkKLSAgZml4ZWQgImVycm9yIiBpbiBwbmdjb25mLmggZm9yIExpbnV4IHNldGptcCgpIGJlaGF2aW91cgotICBmaXhlZCBET1MgbWVkaXVtIG1vZGVsIHN1cHBvcnQgKFRpbSBXZWduZXIpCi0gIGZpeGVkIHBuZ19jaGVja19rZXl3b3JkKCkgZm9yIGNhc2Ugd2l0aCBlcnJvciBpbiBzdGF0aWMgc3RyaW5nIHRleHQKLSAgYWRkZWQgcmVhZCBvZiBDUkMgYWZ0ZXIgSUVORCBjaHVuayBmb3IgZW1iZWRkZWQgUE5HcyAoTGFzemxvIE55dWwpCi0gIGFkZGVkIHR5cGVjYXN0cyB0byBxdWlldCBjb21waWxlciBlcnJvcnMKLSAgYWRkZWQgbW9yZSBkZWJ1Z2dpbmcgaW5mbwotCi12ZXJzaW9uIDAuOTcgW0phbnVhcnksIDE5OThdCi0gIHJlbW92ZWQgUE5HX1VTRV9PV05fQ1JDIGNhcGFiaWxpdHkKLSAgcmVsb2NhdGVkIHBuZ19zZXRfY3JjX2FjdGlvbiBmcm9tIHBuZ3J1dGlsLmMgdG8gcG5ncnRyYW4uYwotICBmaXhlZCB0eXBlY2FzdHMgb2YgIm5ld19rZXkiLCBldGMuIChBbmRyZWFzIERpbGdlcikKLSAgYWRkZWQgUkZDIDExNTIgW3NpY10gZGF0ZSBzdXBwb3J0Ci0gIGZpeGVkIGJ1ZyBpbiBnYW1tYSBoYW5kbGluZyBvZiA0LWJpdCBncmF5c2NhbGUKLSAgYWRkZWQgMi1iaXQgZ3JheXNjYWxlIGdhbW1hIGhhbmRsaW5nIChHbGVubiBSLVApCi0gIGFkZGVkIG1vcmUgdHlwZWNhc3RzLiA2NTUzNkwgYmVjb21lcyAocG5nX3VpbnRfMzIpNjU1MzZMLCBldGMuIChHbGVubiBSLVApCi0gIG1pbm9yIGNvcnJlY3Rpb25zIGluIGxpYnBuZy50eHQKLSAgYWRkZWQgc2ltcGxlIHNSR0Igc3VwcG9ydCAoR2xlbm4gUi1QKQotICBlYXNpZXIgY29uZGl0aW9uYWwgY29tcGlsaW5nLCBlLmcuIGRlZmluZSBQTkdfUkVBRC9XUklURV9OT1RfRlVMTFlfU1VQUE9SVEVEOwotICAgICBhbGwgY29uZmlndXJhYmxlIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIGZyb20gY29tbWFuZC1saW5lIGluc3RlYWQKLSAgICAgb2YgaGF2aW5nIHRvIGVkaXQgcG5nY29uZi5oIChHbGVubiBSLVApCi0gIGZpeGVkIG1lbW9yeSBsZWFrIGluIHBuZ3dyaXRlLmMgKGZyZWUgaW5mb19wdHItPnRleHQpIChHbGVubiBSLVApCi0gIGFkZGVkIG1vcmUgY29uZGl0aW9ucyBmb3IgcG5nX2RvX2JhY2tncm91bmQsIHRvIGF2b2lkIGNoYW5naW5nCi0gICAgIGJsYWNrIHBpeGVscyB0byBiYWNrZ3JvdW5kIHdoZW4gYSBiYWNrZ3JvdW5kIGlzIHN1cHBsaWVkIGFuZAotICAgICBubyBwaXhlbHMgYXJlIHRyYW5zcGFyZW50Ci0gIHJlcGFpcmVkIFBOR19OT19TVERJTyBiZWhhdmlvdXIKLSAgdGVzdGVkIE5PRElWIHN1cHBvcnQgYW5kIG1hZGUgaXQgZGVmYXVsdCBiZWhhdmlvdXIgKEdyZWcgUm9lbG9mcykKLSAgYWRkZWQgIi1tIiBvcHRpb24gYW5kIFBOR1RFU1RfREVCVUdfTUVNT1JZIHRvIHBuZ3Rlc3QgKEpvaG4gQm93bGVyKQotICByZWd1bGFyaXplZCB2ZXJzaW9uIG51bWJlcmluZyBzY2hlbWUgYW5kIGJ1bXBlZCBzaGFyZWQtbGlicmFyeSBtYWpvcgotICAgICB2ZXJzaW9uIG51bWJlciB0byAyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggbGlicG5nIDAuODkgYXBwcyAoR3JlZyBSb2Vsb2ZzKQotCi12ZXJzaW9uIDAuOTggW0phbnVhcnksIDE5OThdCi0gIGNsZWFuZWQgdXAgc29tZSB0eXBvcyBpbiBsaWJwbmcudHh0IGFuZCBpbiBjb2RlIGRvY3VtZW50YXRpb24KLSAgZml4ZWQgbWVtb3J5IGxlYWtzIGluIHBDQUwgY2h1bmsgcHJvY2Vzc2luZyAoR2xlbm4gUi1QIGFuZCBKb2huIEJvd2xlcikKLSAgY29zbWV0aWMgY2hhbmdlICJkaXNwbGF5X2dhbW1hIiB0byAic2NyZWVuX2dhbW1hIiBpbiBwbmdydHJhbi5jCi0gIGNoYW5nZWQgcmVjb21tZW5kYXRpb24gYWJvdXQgZmlsZV9nYW1tYSBmb3IgUEMgaW1hZ2VzIHRvIC41MSBmcm9tIC40NSwKLSAgICAgaW4gZXhhbXBsZS5jIGFuZCBsaWJwbmcudHh0LCBhZGRlZCBjb21tZW50cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCi0gICAgIHNjcmVlbl9nYW1tYSwgdmlld2luZ19nYW1tYSwgYW5kIGRpc3BsYXlfZ2FtbWEuCi0gIGNoYW5nZWQgYWxsIHJlZmVyZW5jZXMgdG8gUkZDMTE1MiB0byByZWFkIFJGQzExMjMgYW5kIGNoYW5nZWQgdGhlCi0gICAgIFBOR19USU1FX1JGQzExNTJfU1VQUE9SVEVEIG1hY3JvIHRvIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECi0gIGFkZGVkIHBuZ19pbnZlcnRfYWxwaGEgY2FwYWJpbGl0eSAoR2xlbm4gUi1QIC0tIHN1Z2dlc3Rpb24gYnkgSm9uIFZpbmNlbnQpCi0gIGNoYW5nZWQgc3JnYl9pbnRlbnQgZnJvbSBwbmdfYnl0ZSB0byBpbnQgdG8gYXZvaWQgY29tcGlsZXIgYnVncwotCi12ZXJzaW9uIDAuOTkgW0phbnVhcnkgMzAsIDE5OThdCi0gIGZyZWUgaW5mb19wdHItPnRleHQgaW5zdGVhZCBvZiBlbmRfaW5mb19wdHItPnRleHQgaW4gcG5ncmVhZC5jIChKb2huIEJvd2xlcikKLSAgZml4ZWQgYSBsb25nc3RhbmRpbmcgInBhY2tzd2FwIiBidWcgaW4gcG5ndHJhbnMuYwotICBmaXhlZCBzb21lIGluY29uc2lzdGVuY2llcyBpbiBwbmdjb25mLmggdGhhdCBwcmV2ZW50ZWQgY29tcGlsaW5nIHdpdGgKLSAgICAgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEIGFuZCBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRCB1bmRlZmluZWQKLSAgZml4ZWQgc29tZSB0eXBvcyBhbmQgbWFkZSBvdGhlciBtaW5vciByZWFycmFuZ2VtZW50IG9mIGxpYnBuZy50eHQgKEFuZHJlYXMpCi0gIGNoYW5nZWQgcmVjb21tZW5kYXRpb24gYWJvdXQgZmlsZV9nYW1tYSBmb3IgUEMgaW1hZ2VzIHRvIC41MCBmcm9tIC41MSBpbgotICAgICBleGFtcGxlLmMgYW5kIGxpYnBuZy50eHQsIGFuZCBjaGFuZ2VkIGZpbGVfZ2FtbWEgZm9yIHNSR0IgaW1hZ2VzIHRvIC40NQotICBhZGRlZCBhIG51bWJlciBvZiBmdW5jdGlvbnMgdG8gYWNjZXNzIGluZm9ybWF0aW9uIGZyb20gdGhlIHBuZyBzdHJ1Y3R1cmUKLSAgICAgcG5nX2dldF9pbWFnZV9oZWlnaHQoKSwgZXRjLiAoR2xlbm4gUi1QLCBzdWdnZXN0aW9uIGJ5IEJyYWQgUGV0dGl0KQotICBhZGRlZCBUQVJHRVRfTUFDT1Mgc2ltaWxhciB0byB6bGliLTEuMC44Ci0gIGRlZmluZSBQTkdfQUxXQVlTX0VYVEVSTiB3aGVuIF9fTVdFUktTX18gJiYgV0lOMzIgYXJlIGRlZmluZWQKLSAgYWRkZWQgdHlwZSBjYXN0aW5nIHRvIGFsbCBwbmdfbWFsbG9jKCkgZnVuY3Rpb24gY2FsbHMKLXZlcnNpb24gMC45OWEgW0phbnVhcnkgMzEsIDE5OThdCi0gIEFkZGVkIHR5cGUgY2FzdHMgYW5kIHBhcmVudGhlc2VzIHRvIGFsbCByZXR1cm5zIHRoYXQgcmV0dXJuIGEgdmFsdWUuKFRpbSBXLikKLXZlcnNpb24gMC45OWIgW0ZlYnJ1YXJ5IDQsIDE5OThdCi0gIEFkZGVkIHR5cGUgY2FzdCBwbmdfdWludF8zMiBvbiBtYWxsb2MgZnVuY3Rpb24gY2FsbHMgd2hlcmUgbmVlZGVkLgotICBDaGFuZ2VkIHR5cGUgb2YgbnVtX2hpc3QgZnJvbSBwbmdfdWludF8zMiB0byBpbnQgKHNhbWUgYXMgbnVtX3BhbGV0dGUpLgotICBBZGRlZCBjaGVja3MgZm9yIHJvd2J5dGVzIG92ZXJmbG93LCBpbiBjYXNlIHBuZ19zaXplX3QgaXMgbGVzcyB0aGFuIDMyIGJpdHMuCi0gIFJlbmFtZWQgbWFrZWZpbGUuZWxmIHRvIG1ha2VmaWxlLmxueC4KLXZlcnNpb24gMC45OWMgW0ZlYnJ1YXJ5IDcsIDE5OThdCi0gIE1vcmUgdHlwZSBjYXN0aW5nLiAgUmVtb3ZlZCBlcnJvbmVvdXMgb3ZlcmZsb3cgdGVzdCBpbiBwbmdtZW0uYy4KLSAgQWRkZWQgcG5nX2J1ZmZlcmVkX21lbWNweSgpIGFuZCBwbmdfYnVmZmVyZWRfbWVtc2V0KCksIGFwcGx5IHRoZW0gdG8gcm93Ynl0ZXMuCi0gIEFkZGVkIFVOSVggbWFudWFsIHBhZ2VzIGxpYnBuZy4zIChpbmNvcnBvcmF0aW5nIGxpYnBuZy50eHQpIGFuZCAgcG5nLjUuCi12ZXJzaW9uIDAuOTlkIFtGZWJydWFyeSAxMSwgMTk5OF0KLSAgUmVuYW1lZCAiZmFyX3RvX25lYXIoKSIgInBuZ19mYXJfdG9fbmVhcigpIgotICBSZXZpc2VkIGxpYnBuZy4zCi0gIFZlcnNpb24gOTljICJidWZmZXJlZCIgb3BlcmF0aW9ucyBkaWRuJ3Qgd29yayBhcyBpbnRlbmRlZC4gIFJlcGxhY2VkIHRoZW0KLSAgICB3aXRoIHBuZ19tZW1jcHlfY2hlY2soKSBhbmQgcG5nX21lbXNldF9jaGVjaygpLgotICBBZGRlZCBtYW55ICJpZiAocG5nX3B0ciA9PSBOVUxMKSByZXR1cm4iIHRvIHF1ZWxsIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0Ci0gICAgdW51c2VkIHBuZ19wdHIsIG1vc3RseSBpbiBwbmdnZXQuYyBhbmQgcG5nc2V0LmMuCi0gIENoZWNrIGZvciBvdmVybGVuZ3RoIHRSTlMgY2h1bmsgcHJlc2VudCB3aGVuIGluZGV4ZWQtY29sb3IgUExURSBpcyByZWFkLgotICBDbGVhbmVkIHVwIHNwZWxsaW5nIGVycm9ycyBpbiBsaWJwbmcuMy9saWJwbmcudHh0Ci0gIENvcnJlY3RlZCBhIHByb2JsZW0gd2l0aCBwbmdfZ2V0X3RSTlMoKSB3aGljaCByZXR1cm5lZCB1bmRlZmluZWQgdHJhbnMgYXJyYXkKLXZlcnNpb24gMC45OWUgW0ZlYnJ1YXJ5IDI4LCAxOTk4XQotICBDb3JyZWN0ZWQgcG5nX2dldF90Uk5TKCkgYWdhaW4uCi0gIEFkZCBwYXJlbnRoZXNlcyBmb3IgZWFzaWVyIHJlYWRpbmcgb2YgcG5nZ2V0LmMsIGZpeGVkICJ8fCIgc2hvdWxkIGJlICImJiIuCi0gIFRvdWNoZWQgdXAgZXhhbXBsZS5jIHRvIG1ha2UgbW9yZSBvZiBpdCBjb21waWxlYWJsZSwgYWx0aG91Z2ggdGhlIGVudGlyZQotICAgIGZpbGUgc3RpbGwgY2FuJ3QgYmUgY29tcGlsZWQgKFdpbGxlbSB2YW4gU2NoYWlrKQotICBGaXhlZCBhIGJ1ZyBpbiBwbmdfZG9fc2hpZnQoKSAoQnJ5YW4gVHNhaSkKLSAgQWRkZWQgYSBzcGFjZSBpbiBwbmcuaCBwcm90b3R5cGUgZm9yIHBuZ193cml0ZV9jaHVua19zdGFydCgpCi0gIFJlcGxhY2VkIHBuZ3Rlc3QucG5nIHdpdGggb25lIGNyZWF0ZWQgd2l0aCB6bGliIDEuMS4xCi0gIENoYW5nZWQgcG5ndGVzdCB0byByZXBvcnQgUEFTUyBldmVuIHdoZW4gZmlsZSBzaXplIGlzIGRpZmZlcmVudCAoSmVhbi1sb3VwIEcuKQotICBDb3JyZWN0ZWQgc29tZSBsb2dpYyBlcnJvcnMgaW4gcG5nX2RvX2ludmVydF9hbHBoYSgpIChDaHJpcyBQYXR0ZXJzb24pCi12ZXJzaW9uIDAuOTlmIFtNYXJjaCA1LCAxOTk4XQotICBDb3JyZWN0ZWQgYSBidWcgaW4gcG5ncHJlYWQoKSBpbnRyb2R1Y2VkIGluIHZlcnNpb24gOTljIChLZXZpbiBCcmFjZXkpCi0gIE1vdmVkIG1ha2VmaWxlcyBpbnRvIGEgInNjcmlwdHMiIGRpcmVjdG9yeSwgYW5kIGFkZGVkIElOU1RBTEwgaW5zdHJ1Y3Rpb24gZmlsZQotICBBZGRlZCBtYWtlZmlsZS5vczIgYW5kIHBuZ29zMi5kZWYgKEEuIFphYm9sb3RueSkgYW5kIG1ha2VmaWxlLnMyeCAoVy4gU2Vib2spCi0gIEFkZGVkIHBvaW50ZXJzIHRvICJub3RlIG9uIGxpYnBuZyB2ZXJzaW9ucyIgaW4gbWFrZWZpbGUubG54IGFuZCBSRUFETUUKLSAgQWRkZWQgcm93IGNhbGxiYWNrIGZlYXR1cmUgd2hlbiByZWFkaW5nIGFuZCB3cml0aW5nIG5vbnByb2dyZXNzaXZlIHJvd3MKLSAgICAgYW5kIGFkZGVkIGEgdGVzdCBvZiB0aGlzIGZlYXR1cmUgaW4gcG5ndGVzdC5jCi0gIEFkZGVkIHVzZXIgdHJhbnNmb3JtIGNhbGxiYWNrcywgd2l0aCB0ZXN0IG9mIHRoZSBmZWF0dXJlIGluIHBuZ3Rlc3QuYwotdmVyc2lvbiAwLjk5ZyBbTWFyY2ggNiwgMTk5OCwgbW9ybmluZ10KLSAgTWlub3IgY2hhbmdlcyB0byBwbmd0ZXN0LmMgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZ3MuCi0gIFJlbW92ZWQgImJldGEiIGxhbmd1YWdlIGZyb20gZG9jdW1lbnRhdGlvbi4KLXZlcnNpb24gMC45OWggW01hcmNoIDYsIDE5OTgsIGV2ZW5pbmddCi0gIE1pbm9yIGNoYW5nZXMgdG8gcHJldmlvdXMgbWlub3IgY2hhbmdlcyB0byBwbmd0ZXN0LmMKLSAgQ2hhbmdlZCBQTkdfUkVBRF9OT1RfRlVMTFlfU1VQUE9SVEVEIHRvIFBOR19SRUFEX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRAotICBhbmQgYWRkZWQgUE5HX1BST0dSRVNTSVZFX1JFQURfTk9UX1NVUFBPUlRFRCBtYWNybwotICBBZGRlZCB1c2VyIHRyYW5zZm9ybSBjYXBhYmlsaXR5Ci0KLXZlcnNpb24gMS4wMCBbTWFyY2ggNywgMTk5OF0KLSAgQ2hhbmdlZCBzZXZlcmFsIHR5cGVkZWZzIGluIHBuZ3J1dGlsLmMKLSAgQWRkZWQgbWFrZWZpbGUud2F0IChQYXdlbCBNcm9jaGVuKSwgdXBkYXRlZCBtYWtlZmlsZS50YzMgKFdpbGxlbSB2YW4gU2NoYWlrKQotICByZXBsYWNlZCAid2hpbGUoMSkiIHdpdGggImZvcig7OykiCi0gIGFkZGVkIFBOR0FSRygpIHRvIHByb3RvdHlwZXMgaW4gcG5ndGVzdC5jIGFuZCByZW1vdmVkIHNvbWUgcHJvdG90eXBlcwotICB1cGRhdGVkIHNvbWUgb2YgdGhlIG1ha2VmaWxlcyAoVG9tIExhbmUpCi0gIGNoYW5nZWQgc29tZSB0eXBlZGVmcyAoc19zdGFydCwgZXRjLikgaW4gcG5ncnV0aWwuYwotICBmaXhlZCBkaW1lbnNpb25zIG9mICJzaG9ydF9tb250aHMiIGFycmF5IGluIHBuZ3dyaXRlLmMKLSAgUmVwbGFjZWQgYW5zaTJrbnIuYyB3aXRoIHRoZSBvbmUgZnJvbSBqcGVnLXY2Ci0KLXZlcnNpb24gMS4wLjAgW01hcmNoIDgsIDE5OThdCi0gIENoYW5nZWQgbmFtZSBmcm9tIDEuMDAgdG8gMS4wLjAgKEFkYW0gQ29zdGVsbG8pCi0gIEFkZGVkIHNtYWtlZmlsZS5wcGMgKHdpdGggU0NPUFRJT05TLnBwYykgZm9yIEFtaWdhIFBQQyAoQW5kcmVhcyBLbGVpbmVydCkKLXZlcnNpb24gMS4wLjBhIFtNYXJjaCA5LCAxOTk4XQotICBGaXhlZCB0aHJlZSBidWdzIGluIHBuZ3J0cmFuLmMgdG8gbWFrZSBnYW1tYStiYWNrZ3JvdW5kIGhhbmRsaW5nIGNvbnNpc3RlbnQKLSAgKEdyZWcgUm9lbG9mcykKLSAgQ2hhbmdlZCBmb3JtYXQgb2YgdGhlIFBOR19MSUJQTkdfVkVSIGludGVnZXIgdG8geHl5enogaW5zdGVhZCBvZiB4eXoKLSAgZm9yIG1ham9yLCBtaW5vciwgYW5kIGJ1Z2ZpeCByZWxlYXNlcy4gIFRoaXMgaXMgMTAwMDEuIChBZGFtIENvc3RlbGxvLAotICBUb20gTGFuZSkKLSAgTWFrZSBtb250aHMgcmFuZ2UgZnJvbSAxLTEyIGluIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMKLXZlcnNpb24gMS4wLjBiIFtNYXJjaCAxMywgMTk5OF0KLSAgUXVpZXRlZCBjb21waWxlciBjb21wbGFpbnRzIGFib3V0IHR3byBlbXB0eSAiZm9yIiBsb29wcyBpbiBwbmdydXRpbC5jCi0gIE1pbm9yIGNoYW5nZXMgdG8gbWFrZWZpbGUuczJ4Ci0gIFJlbW92ZWQgI2lmZGVmLyNlbmRpZiBhcm91bmQgYSBwbmdfZnJlZSgpIGluIHBuZ3JlYWQuYwotCi12ZXJzaW9uIDEuMC4xIFtNYXJjaCAxNCwgMTk5OF0KLSAgQ2hhbmdlZCBtYWtlZmlsZS5zMnggdG8gcmVkdWNlIHNlY3VyaXR5IHJpc2sgb2YgdXNpbmcgYSByZWxhdGl2ZSBwYXRobmFtZQotICBGaXhlZCBzb21lIHR5cG9zIGluIHRoZSBkb2N1bWVudGF0aW9uIChHcmVnKS4KLSAgRml4ZWQgYSBwcm9ibGVtIHdpdGggdmFsdWUgb2YgImNoYW5uZWxzIiByZXR1cm5lZCBieSBwbmdfcmVhZF91cGRhdGVfaW5mbygpCi12ZXJzaW9uIDEuMC4xYSBbQXByaWwgMjEsIDE5OThdCi0gIE9wdGltaXplZCBQYWV0aCBjYWxjdWxhdGlvbnMgYnkgcmVwbGFjaW5nIGFicygpIGZ1bmN0aW9uIGNhbGxzIHdpdGggaW50cmluc2ljcwotICBwbHVzIG90aGVyIGxvb3Agb3B0aW1pemF0aW9ucy4gSW1wcm92ZXMgYXZnIGRlY29kaW5nIHNwZWVkIGJ5IGFib3V0IDIwJS4KLSAgQ29tbWVudGVkIG91dCBpMzg2aXN0aWMgImFsaWduIiBjb21waWxlciBmbGFncyBpbiBtYWtlZmlsZS5sbnguCi0gIFJlZHVjZWQgdGhlIGRlZmF1bHQgd2FybmluZyBsZXZlbCBpbiBzb21lIG1ha2VmaWxlcywgdG8gbWFrZSB0aGVtIGNvbnNpc3RlbnQuCi0gIFJlbW92ZWQgcmVmZXJlbmNlcyB0byBJSkcgYW5kIEpQRUcgaW4gdGhlIGFuc2kya25yLmMgY29weXJpZ2h0IHN0YXRlbWVudC4KLSAgRml4ZWQgYSBidWcgaW4gcG5nX2RvX3N0cmlwX2ZpbGxlciB3aXRoIFhYUlJHR0JCID0+IFJSR0dCQiB0cmFuc2Zvcm1hdGlvbi4KLSAgQWRkZWQgZ3JheXNjYWxlIGFuZCAxNi1iaXQgY2FwYWJpbGl0eSB0byBwbmdfZG9fcmVhZF9maWxsZXIoKS4KLSAgRml4ZWQgYSBidWcgaW4gcG5nc2V0LmMsIGludHJvZHVjZWQgaW4gdmVyc2lvbiAwLjk5YywgdGhhdCBzZXRzIHJvd2J5dGVzCi0gICAgdG9vIGxhcmdlIHdoZW4gd3JpdGluZyBhbiBpbWFnZSB3aXRoIGJpdF9kZXB0aCA8IDggKEJvYiBEZWxsYWNhKS4KLSAgQ29ycmVjdGVkIHNvbWUgYnVncyBpbiB0aGUgZXhwZXJpbWVudGFsIHdlaWdodGVkIGZpbHRlcmluZyBoZXVyaXN0aWNzLgotICBNb3ZlZCBhIG1pc3BsYWNlZCBwbmdydXRpbCBjb2RlIGJsb2NrIHRoYXQgdHJ1bmNhdGVzIHRSTlMgaWYgaXQgaGFzIG1vcmUKLSAgICB0aGFuIG51bV9wYWxldHRlIGVudHJpZXMgLS0gdGVzdCB3YXMgZG9uZSBiZWZvcmUgbnVtX3BhbGV0dGUgd2FzIGRlZmluZWQuCi0gIEZpeGVkIGEgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMygpIGJ1ZyB0aGF0IGNvbnZlcnRzIGRheSAzMSB0byAwIChTdGV2ZSBFZGRpbnMpLgotICBDaGFuZ2VkIGNvbXBpbGVyIGZsYWdzIGluIG1ha2VmaWxlLndhdCBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiAoUGF3ZWwgTXJvY2hlbikuCi12ZXJzaW9uIDEuMC4xYiBbTWF5IDIsIDE5OThdCi0gIFJlbG9jYXRlZCBwbmdfZG9fZ3JheV90b19yZ2IoKSB3aXRoaW4gcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zKCkgKEdyZWcpLgotICBSZWxvY2F0ZWQgdGhlIHBuZ19jb21wb3NpdGUgbWFjcm9zIGZyb20gcG5ncnRyYW4uYyB0byBwbmcuaCAoR3JlZykuCi0gIEFkZGVkIG1ha2VmaWxlLnNjbyAoY29udHJpYnV0ZWQgYnkgTWlrZSBIb3BraXJrKS4KLSAgRml4ZWQgdHdvIGJ1Z3MgKG1pc3NpbmcgZGVmaW5pdGlvbnMgb2YgImlzdG9wIikgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4wLjFhLgotICBGaXhlZCBhIGJ1ZyBpbiBwbmdydHJhbi5jIHRoYXQgd291bGQgc2V0IGNoYW5uZWxzPTUgdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzLgotICBNb3JlIHdvcmsgb24gdGhlIFBhZXRoLWZpbHRlcmluZywgYWNoaWV2aW5nIGltcGVyY2VwdGlibGUgc3BlZWR1cCAoQSBLbGVpbmVydCkuCi0gIE1vcmUgd29yayBvbiBsb29wIG9wdGltaXphdGlvbiB3aGljaCBtYXkgaGVscCB3aGVuIGNvbXBpbGVkIHdpdGggQysrIGNvbXBpbGVycy4KLSAgQWRkZWQgd2FybmluZ3Mgd2hlbiBwZW9wbGUgdHJ5IHRvIHVzZSB0cmFuc2Zvcm1zIHRoZXkndmUgZGVmaW5lZCBvdXQuCi0gIENvbGxhcHNlZCA0ICJpIiBhbmQgImMiIGxvb3BzIGludG8gc2luZ2xlICJpIiBsb29wcyBpbiBwbmdydHJhbiBhbmQgcG5nd3RyYW4uCi0gIFJldmlzZWQgcGFyYWdyYXBoIGFib3V0IHBuZ19zZXRfZXhwYW5kKCkgaW4gbGlicG5nLnR4dCBhbmQgbGlicG5nLjMgKEdyZWcpCi12ZXJzaW9uIDEuMC4xYyBbTWF5IDExLCAxOTk4XQotICBGaXhlZCBhIGJ1ZyBpbiBwbmdydHJhbi5jIChpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjAuMWEpIHdoZXJlIHRoZSBtYXNrcyBmb3IKLSAgICBmaWxsZXIgYnl0ZXMgc2hvdWxkIGhhdmUgYmVlbiAweGZmIGluc3RlYWQgb2YgMHhmLgotICBBZGRlZCBtYXhfcGl4ZWxfZGVwdGg9MzIgaW4gcG5ncnV0aWwuYyB3aGVuIHVzaW5nIEZJTExFUiB3aXRoIHBhbGV0dGUgaW1hZ2VzLgotICBNb3ZlZCBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCBhbmQgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRAotICAgIG91dCBvZiB0aGUgUE5HX1dSSVRFX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRCBibG9jayBvZiBwbmdjb25mLmgKLSAgQWRkZWQgIlBOR19OT19XUklURV9UUkFOU0ZPUk1TIiBldGMuLCBhcyBhbHRlcm5hdGl2ZXMgZm9yICpfTk9UX1NVUFBPUlRFRCwKLSAgICBmb3IgY29uc2lzdGVuY3ksIGluIHBuZ2NvbmYuaAotICBBZGRlZCBpbmRpdmlkdWFsICJpZm5kZWYgUE5HX05PX1tDQVBBQklMSVRZXSIgaW4gcG5nY29uZi5oIHRvIG1ha2UgaXQgZWFzaWVyCi0gICAgdG8gcmVtb3ZlIHVud2FudGVkIGNhcGFiaWxpdGllcyB2aWEgdGhlIGNvbXBpbGUgbGluZQotICBNYWRlIHNvbWUgY29ycmVjdGlvbnMgdG8gZ3JhbW1hciAod2hpY2gsIGl0J3MpIGluIGRvY3VtZW50YXRpb24gKEdyZWcpLgotICBDb3JyZWN0ZWQgZXhhbXBsZS5jLCB1c2Ugb2Ygcm93X3BvaW50ZXJzIGluIHBuZ193cml0ZV9pbWFnZSgpLgotdmVyc2lvbiAxLjAuMWQgW01heSAyNCwgMTk5OF0KLSAgQ29ycmVjdGVkIHNldmVyYWwgc3RhdGVtZW50cyB0aGF0IHVzZWQgc2lkZSBlZmZlY3RzIGlsbGVnYWxseSBpbiBwbmdydXRpbC5jCi0gICAgYW5kIHBuZ3RyYW5zLmMsIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4wLjFiCi0gIFJldmlzZWQgcG5nX3JlYWRfcm93cygpIHRvIGF2b2lkIHJlcGVhdGVkIGlmLXRlc3RpbmcgZm9yIE5VTEwgKEEgS2xlaW5lcnQpCi0gIE1vcmUgY29ycmVjdGlvbnMgdG8gZXhhbXBsZS5jLCB1c2Ugb2Ygcm93X3BvaW50ZXJzIGluIHBuZ193cml0ZV9pbWFnZSgpCi0gICAgYW5kIHBuZ19yZWFkX3Jvd3MoKS4KLSAgQWRkZWQgcG5nZGxsLm1hayBhbmQgcG5nZGVmLnBhcyB0byBzY3JpcHRzIGRpcmVjdG9yeSwgY29udHJpYnV0ZWQgYnkKLSAgICBCb2IgRGVsbGFjYSwgdG8gbWFrZSBhIHBuZzMyYmQuZGxsIHdpdGggQm9ybGFuZCBDKysgNC41Ci0gIEZpeGVkIGVycm9yIGluIGV4YW1wbGUuYyB3aXRoIHBuZ19zZXRfdGV4dDogbnVtX3RleHQgaXMgMywgbm90IDIgKEd1aWRvIFYuKQotICBDaGFuZ2VkIHNldmVyYWwgbG9vcHMgZnJvbSBjb3VudC1kb3duIHRvIGNvdW50LXVwLCBmb3IgY29uc2lzdGVuY3kuCi12ZXJzaW9uIDEuMC4xZSBbSnVuZSA2LCAxOTk4XQotICBSZXZpc2VkIGxpYnBuZy50eHQgYW5kIGxpYnBuZy4zIGRlc2NyaXB0aW9uIG9mIHBuZ19zZXRfcmVhZHx3cml0ZV9mbigpLCBhbmQKLSAgICBhZGRlZCB3YXJuaW5ncyB3aGVuIHBlb3BsZSB0cnkgdG8gc2V0IHBuZ19yZWFkX2ZuIGFuZCBwbmdfd3JpdGVfZm4gaW4KLSAgICB0aGUgc2FtZSBzdHJ1Y3R1cmUuCi0gIEFkZGVkIGEgdGVzdCBzdWNoIHRoYXQgcG5nX2RvX2dhbW1hIHdpbGwgYmUgZG9uZSB3aGVuIG51bV90cmFucz09MAotICAgIGZvciB0cnVlY29sb3IgaW1hZ2VzIHRoYXQgaGF2ZSBkZWZpbmVkIGEgYmFja2dyb3VuZC4gIFRoaXMgY29ycmVjdHMgYW4KLSAgICBlcnJvciB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0wLjkwIHRoYXQgY2FuIGNhdXNlIGdhbW1hIHByb2Nlc3NpbmcKLSAgICB0byBiZSBza2lwcGVkLgotICBBZGRlZCB0ZXN0cyBpbiBwbmcuaCB0byBpbmNsdWRlICJ0cmFucyIgYW5kICJ0cmFuc192YWx1ZXMiIGluIHN0cnVjdHVyZXMKLSAgICB3aGVuIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEIG9yIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQgaXMgZGVmaW5lZC4KLSAgQWRkIHBuZ19mcmVlKHBuZ19wdHItPnRpbWVfYnVmZmVyKSBpbiBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgpCi0gIE1vdmVkIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkgZnJvbSBwbmd3cml0ZS5jIHRvIHBuZy5jCi0gIEFkZGVkIGNhcGFiaWxpdHkgZm9yIHVzZXItcHJvdmlkZWQgbWFsbG9jX2ZuKCkgYW5kIGZyZWVfZm4oKSBmdW5jdGlvbnMsCi0gICAgYW5kIHJldmlzZWQgcG5ndGVzdC5jIHRvIGRlbW9uc3RyYXRlIHRoZWlyIHVzZSwgcmVwbGFjaW5nIHRoZQotICAgIFBOR1RFU1RfREVCVUdfTUVNIGZlYXR1cmUuCi0gIEFkZGVkIG1ha2VmaWxlLnczMiwgZm9yIE1pY3Jvc29mdCBDKysgNC4wIGFuZCBsYXRlciAoVGltIFdlZ25lcikuCi0KLXZlcnNpb24gMS4wLjIgW0p1bmUgMTQsIDE5OThdCi0gIEZpeGVkIHR3byBidWdzIGluIG1ha2VmaWxlLmJvciAuCi12ZXJzaW9uIDEuMC4yYSBbRGVjZW1iZXIgMzAsIDE5OThdCi0gIFJlcGxhY2VkIGFuZCBleHRlbmRlZCBjb2RlIHRoYXQgd2FzIHJlbW92ZWQgZnJvbSBwbmdfc2V0X2ZpbGxlcigpIGluIDEuMC4xYS4KLSAgRml4ZWQgYSBidWcgaW4gcG5nX2RvX2ZpbGxlcigpIHRoYXQgbWFkZSBpdCBmYWlsIHRvIHdyaXRlIGZpbGxlciBieXRlcyBpbgotICAgIHRoZSBsZWZ0LW1vc3QgcGl4ZWwgb2YgZWFjaCByb3cgKEtldmluIEJyYWNleSkuCi0gIENoYW5nZWQgInN0YXRpYyBwbmdjaGFycCB0SU1FX3N0cmluZyIgdG8gInN0YXRpYyBjaGFyIHRJTUVfc3RyaW5nWzMwXSIKLSAgICBpbiBwbmd0ZXN0LmMgKER1bmNhbiBTaW1wc29uKS4KLSAgRml4ZWQgYSBidWcgaW4gcG5ndGVzdC5jIHRoYXQgY2F1c2VkIHBuZ3Rlc3QgdG8gdHJ5IHRvIHdyaXRlIGEgdElNRSBjaHVuawotICAgIGV2ZW4gd2hlbiBubyB0SU1FIGNodW5rIHdhcyBwcmVzZW50IGluIHRoZSBzb3VyY2UgZmlsZS4KLSAgRml4ZWQgYSBwcm9ibGVtIGluIHBuZ3J1dGlsLmM6IGdyYXlfdG9fcmdiIGRpZG4ndCBhbHdheXMgd29yayB3aXRoIDE2LWJpdC4KLSAgRml4ZWQgYSBwcm9ibGVtIGluIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdygpLCB3aGljaCB3b3VsZCBub3Qgc2tpcCBzb21lCi0gICAgcGFzc2VzIHRoYXQgaXQgc2hvdWxkIHNraXAsIGZvciBpbWFnZXMgdGhhdCBhcmUgbGVzcyB0aGFuIDMgcGl4ZWxzIGhpZ2guCi0gIEludGVyY2hhbmdlZCB0aGUgb3JkZXIgb2YgY2FsbHMgdG8gcG5nX2RvX3N3YXAoKSBhbmQgcG5nX2RvX3NoaWZ0KCkKLSAgICBpbiBwbmd3dHJhbi5jIChKb2huIENyb21lcikuCi0gIEFkZGVkICNpZmRlZiBQTkdfREVCVUcvI2VuZGlmIHN1cnJvdW5kaW5nIHVzZSBvZiBQTkdfREVCVUcgaW4gcG5nLmggLgotICBDaGFuZ2VkICJiYWQgYWRhcHRpdmUgZmlsdGVyIHR5cGUiIGZyb20gZXJyb3IgdG8gd2FybmluZyBpbiBwbmdydXRpbC5jIC4KLSAgRml4ZWQgYSBkb2N1bWVudGF0aW9uIGVycm9yIGFib3V0IGRlZmF1bHQgZmlsdGVyaW5nIHdpdGggOC1iaXQgaW5kZXhlZC1jb2xvci4KLSAgU2VwYXJhdGVkIHRoZSBQTkdfTk9fU1RESU8gbWFjcm8gaW50byBQTkdfTk9fU1RESU8gYW5kIFBOR19OT19DT05TT0xFX0lPCi0gICAgKEwuIFBldGVyIERldXRzY2gpLgotICBBZGRlZCBwbmdfc2V0X3JnYl90b19ncmF5KCkgYW5kIHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzKCkgZnVuY3Rpb25zLgotICBBZGRlZCBwbmdfZ2V0X2NvcHlyaWdodCgpIGFuZCBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uKCkgZnVuY3Rpb25zLgotICBSZXZpc2VkIGNvbW1lbnRzIG9uIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigpIGluIGxpYnBuZy50eHQgYW5kIGV4YW1wbGUuYwotICBBZGRlZCBpbmZvcm1hdGlvbiBhYm91dCBkZWJ1Z2dpbmcgaW4gbGlicG5nLnR4dCBhbmQgbGlicG5nLjMgLgotICBDaGFuZ2VkICJsbiAtc2YiIHRvICJsbiAtcyAtZiIgaW4gbWFrZWZpbGUuczJ4LCBtYWtlZmlsZS5sbngsIGFuZCBtYWtlZmlsZS5zY28uCi0gIFJlbW92ZWQgbGluZXMgYWZ0ZXIgRHluYW1pYyBEZXBlbmRlbmNpZXMiIGluIG1ha2VmaWxlLmFjbyAuCi0gIFJldmlzZWQgbWFrZWZpbGUuZGVjIHRvIG1ha2UgYSBzaGFyZWQgbGlicmFyeSAoSmVyZW1pZSBQZXRpdCkuCi0gIFJlbW92ZWQgdHJhaWxpbmcgYmxhbmtzIGZyb20gYWxsIGZpbGVzLgotdmVyc2lvbiAxLjAuMmEgW0phbnVhcnkgNiwgMTk5OV0KLSAgUmVtb3ZlZCBtaXNwbGFjZWQgI2VuZGlmIGFuZCAjaWZkZWYgUE5HX05PX0VYVEVSTiBuZWFyIHRoZSBlbmQgb2YgcG5nLmgKLSAgQWRkZWQgImlmIiB0ZXN0cyB0byBzaWxlbmNlIGNvbXBsYWludHMgYWJvdXQgdW51c2VkIHBuZ19wdHIgaW4gcG5nLmggYW5kIHBuZy5jCi0gIENoYW5nZWQgImNoZWNrX2lmX3BuZyIgZnVuY3Rpb24gaW4gZXhhbXBsZS5jIHRvIHJldHVybiB0cnVlIChub256ZXJvKSBpZiBQTkcuCi0gIENoYW5nZWQgbGlicG5nLnR4dCB0byBkZW1vbnN0cmF0ZSBwbmdfc2lnX2NtcCgpIGluc3RlYWQgb2YgcG5nX2NoZWNrX3NpZygpCi0gICAgd2hpY2ggaXMgb2Jzb2xldGUuCi0KLXZlcnNpb24gMS4wLjMgW0phbnVhcnkgMTQsIDE5OTldCi0gIEFkZGVkIG1ha2VmaWxlLmh1eCwgZm9yIEhld2xldHQgUGFja2FyZCBIUFVYIDEwLjIwIGFuZCAxMS4wMCAoSmltIFJpY2UpCi0gIEFkZGVkIGEgc3RhdGVtZW50IG9mIFkySyBjb21wbGlhbmNlIGluIHBuZy5oLCBsaWJwbmcuMywgYW5kIFkyS0lORk8uCi12ZXJzaW9uIDEuMC4zYSBbQXVndXN0IDEyLCAxOTk5XQotICBBZGRlZCBjaGVjayBmb3IgUE5HX1JFQURfSU5URVJMQUNFX1NVUFBPUlRFRCBpbiBwbmdyZWFkLmM7IGlzc3VlIGEgd2FybmluZwotICAgICBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVhZCBhbiBpbnRlcmxhY2VkIGltYWdlIHdoZW4gaXQncyBub3Qgc3VwcG9ydGVkLgotICBBZGRlZCBjaGVjayBpZiBwbmdfcHRyLT50cmFucyBpcyBkZWZpbmVkIGJlZm9yZSBmcmVlaW5nIGl0IGluIHBuZ3JlYWQuYwotICBNb2RpZmllZCB0aGUgWTJLIHN0YXRlbWVudCB0byBpbmNsdWRlIHZlcnNpb25zIGJhY2sgdG8gdmVyc2lvbiAwLjcxCi0gIEZpeGVkIGEgYnVnIGluIHRoZSBjaGVjayBmb3IgdmFsaWQgSUhEUiBiaXRfZGVwdGgvY29sb3JfdHlwZXMgaW4gcG5ncnV0aWwuYwotICBNb2RpZmllZCBtYWtlZmlsZS53YXQgKGFkZGVkIC16cDggZmxhZywgIi5zeW1ib2xpYyIsIGNoYW5nZWQgc29tZSBjb21tZW50cykKLSAgUmVwbGFjZWQgbGVhZGluZyBibGFua3Mgd2l0aCB0YWIgY2hhcmFjdGVycyBpbiBtYWtlZmlsZS5odXgKLSAgQ2hhbmdlZCAiZHdvcmtpbi53dXN0bC5lZHUiIHRvICJjY3JjLnd1c3RsLmVkdSIgaW4gdmFyaW91cyBkb2N1bWVudHMuCi0gIENoYW5nZWQgKGZsb2F0KXJlZCBhbmQgKGZsb2F0KWdyZWVuIHRvIChkb3VibGUpcmVkLCAoZG91YmxlKWdyZWVuCi0gICAgIGluIHBuZ19zZXRfcmdiX3RvX2dyYXkoKSB0byBhdm9pZCAicHJvbW90aW9uIiBwcm9ibGVtcyBpbiBBSVguCi0gIEZpeGVkIGEgYnVnIGluIHBuZ2NvbmYuaCB0aGF0IG9taXR0ZWQgPHN0ZGlvLmg+IHdoZW4gUE5HX0RFQlVHPT0wIChLIEJyYWNleSkuCi0gIFJlZm9ybWF0dGVkIGxpYnBuZy4zIGFuZCBsaWJwbmdwZi4zIHdpdGggcHJvcGVyIGZvbnRzIChzY3JpcHQgYnkgSi4gdmFuWmFuZHQpLgotICBVcGRhdGVkIGRvY3VtZW50YXRpb24gdG8gcmVmZXIgdG8gdGhlIFBORy0xLjIgc3BlY2lmaWNhdGlvbi4KLSAgUmVtb3ZlZCBhbnNpMmtuci5jIGFuZCBsZWZ0IHBvaW50ZXJzIHRvIHRoZSBsYXRlc3Qgc291cmNlIGZvciBhbnNpMmtuci5jCi0gICAgaW4gbWFrZWZpbGUua25yLCBJTlNUQUxMLCBhbmQgUkVBRE1FIChMLiBQZXRlciBEZXV0c2NoKQotICBGaXhlZCBidWdzIGluIGNhbGN1bGF0aW9uIG9mIHRoZSBsZW5ndGggb2Ygcm93Ynl0ZXMgd2hlbiBhZGRpbmcgYWxwaGEKLSAgICBjaGFubmVscyB0byAxNi1iaXQgaW1hZ2VzLCBpbiBwbmdydHJhbi5jIChDaHJpcyBOb2tsZWJlcmcpCi0gIEFkZGVkIGZ1bmN0aW9uIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbygpIHRvIHN0b3JlIHVzZXJfdHJhbnNmb3JtX3B0ciwKLSAgICB1c2VyX2RlcHRoLCBhbmQgdXNlcl9jaGFubmVscyBpbnRvIHRoZSBwbmdfc3RydWN0LCBhbmQgYSBmdW5jdGlvbgotICAgIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKCkgdG8gcmV0cmlldmUgdGhlIHBvaW50ZXIgKENocmlzIE5va2xlYmVyZykKLSAgQWRkZWQgZnVuY3Rpb24gcG5nX3NldF9lbXB0eV9wbHRlX3Blcm1pdHRlZCgpIHRvIG1ha2UgbGlicG5nIHVzZWFibGUKLSAgICBpbiBNTkcgYXBwbGljYXRpb25zLgotICBDb3JyZWN0ZWQgdGhlIHR5cGVkZWYgZm9yIHBuZ19mcmVlX3B0ciBpbiBwbmcuaCAoSmVzc2UgSm9uZXMpLgotICBDb3JyZWN0IGdhbW1hIHdpdGggc3JnYiBpcyA0NTQ1NSBpbnN0ZWFkIG9mIDQ1MDAwIGluIHBuZ3J1dGlsLmMsIHRvIGJlCi0gICAgY29uc2lzdGVudCB3aXRoIFBORy0xLjIsIGFuZCBhbGxvdyB2YXJpYW5jZSBvZiA1MDAgYmVmb3JlIGNvbXBsYWluaW5nLgotICBBZGRlZCBhc3NlbWJsZXIgY29kZSBjb250cmlidXRlZCBieSBJbnRlbCBpbiBmaWxlIHBuZ3ZjcmQuYyBhbmQgbW9kaWZpZWQKLSAgICBtYWtlZmlsZS53MzIgdG8gdXNlIGl0IChOaXJhdiBDaGhhdHJhcGF0aSwgSU5URUwgQ29ycG9yYXRpb24sIEdpbGxlcyBWb2xsYW50KQotICBDaGFuZ2VkICJsbiAtcyAtZiIgdG8gImxuIC1mIC1zIiBpbiB0aGUgbWFrZWZpbGVzIHRvIG1ha2UgU29sYXJpcyBoYXBweS4KLSAgQWRkZWQgc29tZSBhbGlhc2VzIGZvciBwbmdfc2V0X2V4cGFuZCgpIGluIHBuZ3J0cmFuLmMsIG5hbWVseQotICAgIHBuZ19zZXRfZXhwYW5kX1BMVEUoKSwgcG5nX3NldF9leHBhbmRfZGVwdGgoKSwgYW5kIHBuZ19zZXRfZXhwYW5kX3RSTlMoKQotICAgIChHcmVnIFJvZWxvZnMsIGluICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlIikuCi0gIEFkZGVkIG1ha2VmaWxlLmJlbyBmb3IgQkVPUyBvbiBYODYsIGNvbnRyaWJ1dGVkIGJ5IFNhbmRlciBTdG9rLgotdmVyc2lvbiAxLjAuM2IgW0F1Z3VzdCAyNiwgMTk5OV0KLSAgUmVwbGFjZWQgMjE0NzQ4MzY0N0wgc2V2ZXJhbCBwbGFjZXMgd2l0aCBQTkdfTUFYX1VJTlQgbWFjcm8sIGRlZmluZWQgaW4gcG5nLmgKLSAgQ2hhbmdlZCBsZWFkaW5nIGJsYW5rcyB0byB0YWJzIGluIGFsbCBtYWtlZmlsZXMuCi0gIERlZmluZSBQTkdfVVNFX1BOR1ZDUkQgaW4gbWFrZWZpbGUudzMyLCB0byBnZXQgTU1YIGFzc2VtYmxlciBjb2RlLgotICBNYWRlIGFsdGVybmF0ZSB2ZXJzaW9ucyBvZiAgcG5nX3NldF9leHBhbmQoKSBpbiBwbmdydHJhbi5jLCBuYW1lbHkKLSAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCwgcG5nX3NldF9wYWxldHRlX3RvX3JnYiwgYW5kIHBuZ19zZXRfdFJOU190b19hbHBoYQotICAgIChHcmVnIFJvZWxvZnMsIGluICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlIikuICBEZWxldGVkIHRoZSAxLjAuM2EgYWxpYXNlcy4KLSAgUmVsb2NhdGVkIHN0YXJ0IG9mICdleHRlcm4gIkMiJyBibG9jayBpbiBwbmcuaCBzbyBpdCBkb2Vzbid0IGluY2x1ZGUgcG5nY29uZi5oCi0gIFJldmlzZWQgY2FsY3VsYXRpb24gb2YgbnVtX2Jsb2NrcyBpbiBwbmdtZW0uYyB0byBhdm9pZCBhIHBvdGVudGlhbGx5Ci0gICAgbmVnYXRpdmUgc2hpZnQgZGlzdGFuY2UsIHdob3NlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCBpbiB0aGUgQyBsYW5ndWFnZS4KLSAgQWRkZWQgYSBjaGVjayBpbiBwbmdzZXQuYyB0byBwcmV2ZW50IHdyaXRpbmcgbXVsdGlwbGUgdElNRSBjaHVua3MuCi0gIEFkZGVkIGEgY2hlY2sgaW4gcG5nd3JpdGUuYyB0byBkZXRlY3QgaW52YWxpZCBzbWFsbCB3aW5kb3dfYml0cyBzaXplcy4KLXZlcnNpb24gMS4wLjNkIFtTZXB0ZW1iZXIgNCwgMTk5OV0KLSAgRml4ZWQgdHlwZSBjYXN0aW5nIG9mIGlnYW1tYSBpbiBwbmdydXRpbC5jCi0gIEFkZGVkIG5ldyBwbmdfZXhwYW5kIGZ1bmN0aW9ucyB0byBzY3JpcHRzL3BuZ2RlZi5wYXMgYW5kIHBuZ29zMi5kZWYKLSAgQWRkZWQgYSBkZW1vIHJlYWRfdXNlcl90cmFuc2Zvcm1fZm4gdGhhdCBleGFtaW5lcyB0aGUgcm93IGZpbHRlcnMgaW4gcG5ndGVzdC5jCi0KLXZlcnNpb24gMS4wLjQgW1NlcHRlbWJlciAyNCwgMTk5OV0KLSAgRGVmaW5lIFBOR19BTFdBWVNfRVhURVJOIGluIHBuZ2NvbmYuaCBpZiBfX1NURENfXyBpcyBkZWZpbmVkCi0gIERlbGV0ZSAjZGVmaW5lIFBOR19JTlRFUk5BTCBhbmQgaW5jbHVkZSAicG5nLmgiIGZyb20gcG5nYXNtcmQuaAotICBNYWRlIHNldmVyYWwgbWlub3IgY29ycmVjdGlvbnMgdG8gcG5ndGVzdC5jCi0gIFJlbmFtZWQgdGhlIG1ha2VmaWxlcyB3aXRoIGxvbmdlciBidXQgbW9yZSB1c2VyIGZyaWVuZGx5IGV4dGVuc2lvbnMuCi0gIENvcGllZCB0aGUgUE5HIGNvcHlyaWdodCBhbmQgbGljZW5zZSB0byBhIHNlcGFyYXRlIExJQ0VOU0UgZmlsZS4KLSAgUmV2aXNlZCBkb2N1bWVudGF0aW9uLCBwbmcuaCwgYW5kIGV4YW1wbGUuYyB0byByZW1vdmUgcmVmZXJlbmNlIHRvCi0gICAgInZpZXdpbmdfZ2FtbWEiIHdoaWNoIG5vIGxvbmdlciBhcHBlYXJzIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbi4KLSAgUmV2aXNlZCBwbmd2Y3JkLmMgdG8gdXNlIE1NWCBjb2RlIGZvciBpbnRlcmxhY2luZyBvbmx5IG9uIHRoZSBmaW5hbCBwYXNzLgotICBVcGRhdGVkIHBuZ3ZjcmQuYyB0byB1c2UgdGhlIGZhc3RlciBDIGZpbHRlciBhbGdvcml0aG1zIGZyb20gbGlicG5nLTEuMC4xYQotICBTcGxpdCBtYWtlZmlsZS53aW4zMnZjIGludG8gdHdvIHZlcnNpb25zLCBtYWtlZmlsZS52Y2F3aW4zMiAodXNlcyBNTVgKLSAgICBhc3NlbWJsZXIgY29kZSkgYW5kIG1ha2VmaWxlLnZjd2luMzIgKGRvZXNuJ3QpLgotICBBZGRlZCBhIENQVSB0aW1pbmcgcmVwb3J0IHRvIHBuZ3Rlc3QuYyAoZW5hYmxlZCBieSBkZWZpbmluZyBQTkdURVNUX1RJTUlORykKLSAgQWRkZWQgYSBjb3B5IG9mIHBuZ25vdy5wbmcgdG8gdGhlIGRpc3RyaWJ1dGlvbi4KLXZlcnNpb24gMS4wLjRhIFtTZXB0ZW1iZXIgMjUsIDE5OTldCi0gIEluY3JlYXNlIG1heF9waXhlbF9kZXB0aCBpbiBwbmdydXRpbC5jIGlmIGEgdXNlciB0cmFuc2Zvcm0gbmVlZHMgaXQuCi0gIENoYW5nZWQgc2V2ZXJhbCBkaXZpc2lvbiBvcGVyYXRpb25zIHRvIHJpZ2h0LXNoaWZ0cyBpbiBwbmd2Y3JkLmMKLXZlcnNpb24gMS4wLjRiIFtTZXB0ZW1iZXIgMzAsIDE5OTldCi0gIEFkZGVkIHBhcmVudGhlc2VzIGluIGxpbmUgMzczMiBvZiBwbmd2Y3JkLmMKLSAgQWRkZWQgYSBjb21tZW50IGluIG1ha2VmaWxlLmxpbnV4IHdhcm5pbmcgYWJvdXQgYnVnZ3kgLU8zIGluIHBnY2MgMi45NS4xCi12ZXJzaW9uIDEuMC40YyBbT2N0b2JlciAxLCAxOTk5XQotICBBZGRlZCBhICJwbmdfY2hlY2tfdmVyc2lvbiIgZnVuY3Rpb24gaW4gcG5nLmMgYW5kIHBuZ3Rlc3QuYyB0aGF0IHdpbGwgZ2VuZXJhdGUKLSAgICBhIGhlbHBmdWwgY29tcGlsZXIgZXJyb3IgaWYgYW4gb2xkIHBuZy5oIGlzIGZvdW5kIGluIHRoZSBzZWFyY2ggcGF0aC4KLSAgQ2hhbmdlZCB0eXBlIG9mIHBuZ191c2VyX3RyYW5zZm9ybV9kZXB0aHxjaGFubmVscyBmcm9tIGludCB0byBwbmdfYnl0ZS4KLXZlcnNpb24gMS4wLjRkIFtPY3RvYmVyIDYsIDE5OTldCi0gIENoYW5nZWQgMC40NSB0byAwLjQ1NDU1IGluIHBuZ19zZXRfc1JHQigpCi0gIFJlbW92ZWQgdW51c2VkIFBMVEUgZW50cmllcyBmcm9tIHBuZ25vdy5wbmcKLSAgUmUtZW5hYmxlZCBzb21lIHBhcnRzIG9mIHBuZ3ZjcmQuYyAocG5nX2NvbWJpbmVfcm93KSB0aGF0IHdvcmsgcHJvcGVybHkuCi12ZXJzaW9uIDEuMC40ZSBbT2N0b2JlciAxMCwgMTk5OV0KLSAgRml4ZWQgc2lnbiBlcnJvciBpbiBwbmd2Y3JkLmMgKEdyZWcgUm9lbG9mcykKLSAgUmVwbGFjZWQgc29tZSBpbnN0YW5jZXMgb2YgbWVtY3B5IHdpdGggc2ltcGxlIGFzc2lnbm1lbnRzIGluIHBuZ3ZjcmQgKEdSLVApCi12ZXJzaW9uIDEuMC40ZiBbT2N0b2JlciAxNSwgMTk5OV0KLSAgU3Vycm91bmRlZCBleGFtcGxlLmMgY29kZSB3aXRoICNpZiAwIC4uICNlbmRpZiB0byBwcmV2ZW50IHBlb3BsZSBmcm9tCi0gICAgaW5hZHZlcnRlbnRseSB0cnlpbmcgdG8gY29tcGlsZSBpdC4KLSAgQ2hhbmdlZCBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uKCkgZnJvbSBhIGZ1bmN0aW9uIHRvIGEgbWFjcm8gaW4gcG5nLmgKLSAgQWRkZWQgdHlwZSBjYXN0aW5nIG1vc3RseSBpbiBwbmdydHJhbi5jIGFuZCBwbmd3dHJhbi5jCi0gIFJlbW92ZWQgc29tZSBwb2ludGxlc3MgInB0ciA9IE5VTEwiIGluIHBuZ21lbS5jCi0gIEFkZGVkIGEgImNvbnRyaWIiIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzb3VyY2UgY29kZSBmcm9tIEdyZWcncyBib29rLgotCi12ZXJzaW9uIDEuMC41IFtPY3RvYmVyIDE1LCAxOTk5XQotICBNaW5vciBlZGl0aW5nIG9mIHRoZSBJTlNUQUxMIGFuZCBSRUFETUUgZmlsZXMuCi12ZXJzaW9uIDEuMC41YSBbT2N0b2JlciAyMywgMTk5OV0KLSAgQWRkZWQgY29udHJpYi9wbmdzdWl0ZSBhbmQgY29udHJpYi9wbmdtaW51cyAoV2lsbGVtIHZhbiBTY2hhaWspCi0gIEZpeGVkIGEgdHlwbyBpbiB0aGUgcG5nX3NldF9zUkdCKCkgZnVuY3Rpb24gY2FsbCBpbiBleGFtcGxlLmMgKEphbiBOaWp0bWFucykKLSAgRnVydGhlciBvcHRpbWl6YXRpb24gYW5kIGJ1Z2ZpeCBvZiBwbmd2Y3JkLmMKLSAgUmV2aXNlZCBwbmdzZXQuYyBzbyB0aGF0IGl0IGRvZXMgbm90IGFsbG9jYXRlIG9yIGZyZWUgbWVtb3J5IGluIHRoZSB1c2VyJ3MKLSAgICB0ZXh0X3B0ciBzdHJ1Y3R1cmUuICBJbnN0ZWFkLCBpdCBtYWtlcyBpdHMgb3duIGNvcHkuCi0gIENyZWF0ZWQgc2VwYXJhdGUgd3JpdGVfZW5kX2luZm9fc3RydWN0IGluIHBuZ3Rlc3QuYyBmb3IgYSBtb3JlIHNldmVyZSB0ZXN0LgotICBBZGRlZCBjb2RlIGluIHBuZ3dyaXRlLmMgdG8gZnJlZSBpbmZvX3B0ci0+dGV4dFtpXS5rZXkgdG8gc3RvcCBhIG1lbW9yeSBsZWFrLgotdmVyc2lvbiAxLjAuNWIgW05vdmVtYmVyIDIzLCAxOTk5XQotICBNb3ZlZCBQTkdfRkxBR19IQVZFX0NIVU5LX0hFQURFUiwgUE5HX0ZMQUdfQkFDS0dST1VORF9JU19HUkFZIGFuZAotICAgIFBOR19GTEFHX1dST1RFX3RJTUUgZnJvbSBmbGFncyB0byBtb2RlLgotICBBZGRlZCBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSgpIGZ1bmN0aW9uLgotICBGaXhlZCBzb21lIHR5cGVjYXN0aW5nIGluIGNvbnRyaWIvZ3JlZ2Jvb2svKi5jCi0gIFVwZGF0ZWQgc2NyaXB0cy9tYWtldm1zLmNvbSBhbmQgYWRkZWQgbWFrZXZtcy5jb20gdG8gY29udHJpYi9ncmVnYm9vawotICAgIGFuZCBjb250cmliL3BuZ21pbnVzIChNYXJ0aW4gWmluc2VyKQotdmVyc2lvbiAxLjAuNWMgW05vdmVtYmVyIDI2LCAxOTk5XQotICBNb3ZlZCBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uIGZyb20gcG5nLmggdG8gcG5nLmMsIHRvIGFjY29tbW9kYXRlIGFuc2kya25yLgotICBSZW1vdmVkIGFsbCBnbG9iYWwgYXJyYXlzIChhY2NvcmRpbmcgdG8gUE5HX05PX0dMT0JBTF9BUlJBWVMgbWFjcm8pLCB0bwotICAgIGFjY29tbW9kYXRlIG1ha2luZyBETEwnczogTW92ZWQgdXNyX3BuZ192ZXIgZnJvbSBnbG9iYWwgdmFyaWFibGUgdG8gZnVuY3Rpb24KLSAgICBwbmdfZ2V0X2hlYWRlcl92ZXIoKSBpbiBwbmcuYy4gIE1vdmVkIHBuZ19zaWcgdG8gcG5nX3NpZ19ieXRlcyBpbiBwbmcuYyBhbmQKLSAgICBlbGltaW5hdGVkIHVzZSBvZiBwbmdfc2lnIGluIHBuZ3d1dGlsLmMuICBNb3ZlZCB0aGUgdmFyaW91cyBwbmdfQ0hOSyBhcnJheXMKLSAgICBpbnRvIHBuZ3R5cGVzLmguICBFbGltaW5hdGVkIHVzZSBvZiBnbG9iYWwgcG5nX3Bhc3MgYXJyYXlzLiAgRGVjbGFyZWQgdGhlCi0gICAgcG5nX0NITksgYW5kIHBuZ19wYXNzIGFycmF5cyB0byBiZSAiY29uc3QiLiAgTWFkZSB0aGUgZ2xvYmFsIGFycmF5cwotICAgIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMgKGFsdGhvdWdoIG5vbmUgYXJlIHVzZWQgaW4gbGlicG5nIGl0c2VsZikgd2hlbgotICAgIFBOR19OT19HTE9CQUxfQVJSQVlTIGlzIG5vdCBkZWZpbmVkIG9yIHdoZW4gUE5HX0dMT0JBTF9BUlJBWVMgaXMgZGVmaW5lZC4KLSAgUmVtb3ZlZCBzb21lIGV4dHJhbmVvdXMgIi1JIiBmcm9tIGNvbnRyaWIvcG5nbWludXMvbWFrZWZpbGUuc3RkCi0gIENoYW5nZWQgdGhlIFBOR19zUkdCX0lOVEVOVCBtYWNyb3MgaW4gcG5nLmggdG8gYmUgY29uc2lzdGVudCB3aXRoIFBORy0xLjIuCi0gIENoYW5nZSBQTkdfU1JHQl9JTlRFTlQgdG8gUE5HX3NSR0JfSU5URU5UIGluIGxpYnBuZy50eHQgYW5kIGxpYnBuZy4zCi12ZXJzaW9uIDEuMC41ZCBbTm92ZW1iZXIgMjksIDE5OTldCi0gIEFkZCB0eXBlIGNhc3QgKHBuZ19jb25zdF9jaGFycCkgdHdvIHBsYWNlcyBpbiBwbmcuYwotICBFbGltaW5hdGVkIHBuZ3R5cGVzLmg7IHVzZSBtYWNyb3MgaW5zdGVhZCB0byBkZWNsYXJlIFBOR19DSE5LIGFycmF5cy4KLSAgUmVuYW1lZCAiUE5HX0dMT0JBTF9BUlJBWVMiIHRvICJQTkdfVVNFX0dMT0JBTF9BUlJBWVMiIGFuZCBtYWRlIGF2YWlsYWJsZQotICAgIHRvIGFwcGxpY2F0aW9ucyBhIG1hY3JvICJQTkdfVVNFX0xPQ0FMX0FSUkFZUyIuCi0gICNpZmRlZiBvdXQgYWxsIHRoZSBuZXcgZGVjbGFyYXRpb25zIHdoZW4gUE5HX1VTRV9HTE9CQUxfQVJSQVlTIGlzIGRlZmluZWQuCi0gIEFkZGVkIFBOR19FWFBPUlRfVkFSIG1hY3JvIHRvIGFjY29tbW9kYXRlIG1ha2luZyBETEwncy4KLXZlcnNpb24gMS4wLjVlIFtOb3ZlbWJlciAzMCwgMTk5OV0KLSAgQWRkZWQgaUNDUCwgaVRYdCwgYW5kIHNQTFQgc3VwcG9ydDsgYWRkZWQgImxhbmciIG1lbWJlciB0byB0aGUgcG5nX3RleHQKLSAgICBzdHJ1Y3R1cmU7IHJlZmFjdG9yZWQgdGhlIGluZmxhdGUvZGVmbGF0ZSBzdXBwb3J0IHRvIG1ha2UgYWRkaW5nIG5ldyBjaHVua3MKLSAgICB3aXRoIHRyYWlsaW5nIGNvbXByZXNzZWQgcGFydHMgZWFzaWVyIGluIHRoZSBmdXR1cmUsIGFuZCBhZGRlZCBuZXcgZnVuY3Rpb25zCi0gICAgcG5nX2ZyZWVfaUNDUCwgcG5nX2ZyZWVfcENBTCwgcG5nX2ZyZWVfc1BMVCwgcG5nX2ZyZWVfdGV4dCwgcG5nX2dldF9pQ0NQLAotICAgIHBuZ19nZXRfc3BhbGV0dGVzLCBwbmdfc2V0X2lDQ1AsIHBuZ19zZXRfc3BhbGV0dGVzIChFcmljIFMuIFJheW1vbmQpLgotICBOT1RFOiBBcHBsaWNhdGlvbnMgdGhhdCB3cml0ZSB0ZXh0IGNodW5rcyBNVVNUIGRlZmluZSBwbmdfdGV4dC0+bGFuZwotICAgIGJlZm9yZSBjYWxsaW5nIHBuZ19zZXRfdGV4dCgpLiBJdCBtdXN0IGJlIHNldCB0byBOVUxMIGlmIHlvdSB3YW50IHRvCi0gICAgd3JpdGUgdEVYdCBvciB6VFh0IGNodW5rcy4gIElmIHlvdSB3YW50IHlvdXIgYXBwbGljYXRpb24gdG8gYmUgYWJsZSB0bwotICAgIHJ1biB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGxpYnBuZywgdXNlCi0KLSAgICAgICNpZmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKLSAgICAgICAgIHBuZ190ZXh0W2ldLmxhbmcgPSBOVUxMOwotICAgICAgI2VuZGlmCi0KLSAgQ2hhbmdlZCBwbmdfZ2V0X29GRnMoKSBhbmQgcG5nX3NldF9vRkZzKCkgdG8gdXNlIHNpZ25lZCByYXRoZXIgdGhhbiB1bnNpZ25lZAotICAgIG9mZnNldHMgKEVyaWMgUy4gUmF5bW9uZCkuCi0gIENvbWJpbmVkIFBOR19SRUFEX2NITktfU1VQUE9SVEVEIGFuZCBQTkdfV1JJVEVfY0hOS19TVVBQT1JURUQgbWFjcm9zIGludG8KLSAgICBQTkdfY0hOS19TVVBQT1JURUQgYW5kIGNvbWJpbmVkIHRoZSB0aHJlZSB0eXBlcyBvZiBQTkdfdGV4dF9TVVBQT1JURUQKLSAgICBtYWNyb3MsIGxlYXZpbmcgdGhlIHNlcGFyYXRlIG1hY3JvcyBhbHNvIGF2YWlsYWJsZS4KLSAgUmVtb3ZlZCBjb21tZW50cyBvbiAjZW5kaWZzIGF0IHRoZSBlbmQgb2YgbWFueSBzaG9ydCwgbm9uLW5lc3RlZCAjaWYtYmxvY2tzLgotdmVyc2lvbiAxLjAuNWYgW0RlY2VtYmVyIDYsIDE5OTldCi0gIENoYW5nZWQgbWFrZWZpbGUuc29sYXJpcyB0byBpc3N1ZSBhIHdhcm5pbmcgYWJvdXQgcG90ZW50aWFsIHByb2JsZW1zIHdoZW4KLSAgICB0aGUgdWNiICJsZCIgaXMgaW4gdGhlIHBhdGggYWhlYWQgb2YgdGhlIGNjcyAibGQiLgotICBSZW1vdmVkICItIFtkYXRlXSIgZnJvbSB0aGUgInN5bm9wc2lzIiBsaW5lIGluIGxpYnBuZy4zIGFuZCBsaWJwbmdwZi4zLgotICBBZGRlZCBzQ0FMIGNodW5rIHN1cHBvcnQgKEVyaWMgUy4gUmF5bW9uZCkuCi12ZXJzaW9uIDEuMC41ZyBbRGVjZW1iZXIgNywgMTk5OV0KLSAgRml4ZWQgInBuZ19mcmVlX3NwYWxsZXR0ZXMiIHR5cG8gaW4gcG5nLmgKLSAgQWRkZWQgY29kZSB0byBoYW5kbGUgbmV3IGNodW5rcyBpbiBwbmdwcmVhZC5jCi0gIE1vdmVkIFBOR19DSE5LIHN0cmluZyBtYWNybyBkZWZpbml0aW9ucyBvdXRzaWRlIG9mIFBOR19OT19FWFRFUk4gYmxvY2sKLSAgQWRkZWQgInRyYW5zbGF0ZWRfa2V5IiB0byBwbmdfdGV4dCBzdHJ1Y3R1cmUgYW5kIHBuZ193cml0ZV9pVFh0KCkuCi0gIEFkZGVkIGNvZGUgaW4gcG5nd3JpdGUuYyB0byB3b3JrIGFyb3VuZCBhIG5ld2x5IGRpc2NvdmVyZWQgemxpYiBidWcuCi12ZXJzaW9uIDEuMC41aCBbRGVjZW1iZXIgMTAsIDE5OTldCi0gIE5PVEU6IHJlZ2FyZGluZyB0aGUgbm90ZSBmb3IgdmVyc2lvbiAxLjAuNWUsIHRoZSBmb2xsb3dpbmcgbXVzdCBhbHNvCi0gICAgYmUgaW5jbHVkZWQgaW4geW91ciBjb2RlOgotICAgICAgICBwbmdfdGV4dFtpXS50cmFuc2xhdGVkX2tleSA9IE5VTEw7Ci0gIFVua25vd24gY2h1bmsgaGFuZGxpbmcgaXMgbm93IHN1cHBvcnRlZC4KLSAgT3B0aW9uIHRvIGVsaW1pbmF0ZSBhbGwgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCB3YXMgYWRkZWQuICBTb21lIG5ldwotICAgIGZpeGVkLXBvaW50IGZ1bmN0aW9ucyBzdWNoIGFzIHBuZ19zZXRfZ0FNQV9maXhlZCgpIHdlcmUgYWRkZWQuCi0gIEV4cGFuZGVkIHRhYnMgYW5kIHJlbW92ZWQgdHJhaWxpbmcgYmxhbmtzIGluIHNvdXJjZSBmaWxlcy4KLXZlcnNpb24gMS4wLjVpIFtEZWNlbWJlciAxMywgMTk5OV0KLSAgQWRkZWQgc29tZSB0eXBlIGNhc3RzIHRvIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MuCi0gIFJlbmFtZWQgInBuZ19mcmVlX3NwYWxldHRlIiB0byAicG5nX2ZyZWVfc3BhbGV0dGVzIiBmb3IgY29uc2lzdGVuY3kuCi0gIFJlbW92ZWQgbGVhZGluZyBibGFua3MgZnJvbSBhICNkZWZpbmUgaW4gcG5ndmNyZC5jCi0gIEFkZGVkIHNvbWUgcGFyYW1ldGVycyB0byB0aGUgbmV3IHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpIGZ1bmN0aW9uLgotICBBZGRlZCBhIHRlc3QgZm9yIHVwLT5sb2NhdGlvbiAhPSAwIGluIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB3cml0aW5nCi0gICAgdW5rbm93biBjaHVua3MgaW4gcG5nd3JpdGUuYwotICBDaGFuZ2VkICJudW0iIHRvICJpIiBpbiBwbmdfZnJlZV9zcGFsZXR0ZXMoKSBhbmQgcG5nX2ZyZWVfdW5rbm93bnMoKSB0bwotICAgIHByZXZlbnQgcmVjdXJzaW9uLgotICBBZGRlZCBwbmdfZnJlZV9oSVNUKCkgZnVuY3Rpb24uCi0gIFZhcmlvdXMgcGF0Y2hlcyB0byBmaXggYnVncyBpbiB0aGUgc0NBTCBhbmQgaW50ZWdlciBjSFJNIHByb2Nlc3NpbmcsCi0gICAgYW5kIHRvIGFkZCBzb21lIGNvbnZlbmllbmNlIG1hY3JvcyBmb3IgdXNlIHdpdGggc0NBTC4KLXZlcnNpb24gMS4wLjVqIFtEZWNlbWJlciAyMSwgMTk5OV0KLSAgQ2hhbmdlZCAidW5pdCIgcGFyYW1ldGVyIG9mIHBuZ193cml0ZV9zQ0FMIGZyb20gcG5nX2J5dGUgdG8gaW50LCB0byB3b3JrCi0gICAgYXJvdW5kIGJ1Z2d5IGNvbXBpbGVycy4KLSAgQWRkZWQgbmV3IHR5cGUgInBuZ19maXhlZF9wb2ludCIgZm9yIGludGVnZXJzIHRoYXQgaG9sZCBmbG9hdCoxMDAwMDAgdmFsdWVzCi0gIFJlc3RvcmVkIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb2YgdEVYdC96VFh0IGNodW5rIHByb2Nlc3Npbmc6Ci0gICAgUmVzdG9yZWQgdGhlIGZpcnN0IGZvdXIgbWVtYmVycyBvZiBwbmdfdGV4dCB0byB0aGUgc2FtZSBvcmRlciBhcyB2LjEuMC41ZC4KLSAgICBBZGRlZCBtZW1iZXJzICJsYW5nX2tleSIgYW5kICJpdHh0X2xlbmd0aCIgdG8gcG5nX3RleHQgc3RydWN0LiAgU2V0Ci0gICAgdGV4dF9sZW5ndGg9MCB3aGVuICJ0ZXh0IiBjb250YWlucyBpVFh0IGRhdGEuICBVc2UgdGhlICJjb21wcmVzc2lvbiIKLSAgICBtZW1iZXIgdG8gZGlzdGluZ3Vpc2ggYW1vbmcgdEVYdC96VFh0L2lUWHQgdHlwZXMuICBBZGRlZAotICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUgKDEpIGFuZCBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0KDIpIG1hY3Jvcy4KLSAgICBUaGUgIk5vdGUiIGFib3ZlLCBhYm91dCBiYWNrd2FyZCBpbmNvbXBhdGliaWxpdHkgb2YgbGlicG5nLTEuMC41ZSwgbm8KLSAgICBsb25nZXIgYXBwbGllcy4KLSAgRml4ZWQgcG5nX3JlYWR8d3JpdGVfaVRYdCgpIHRvIHJlYWR8d3JpdGUgcGFyYW1ldGVycyBpbiB0aGUgcmlnaHQgb3JkZXIsCi0gICAgYW5kIHRvIHdyaXRlIHRoZSBpVFh0IGNodW5rIGFmdGVyIElEQVQgaWYgaXQgYXBwZWFycyBpbiB0aGUgZW5kX3B0ci4KLSAgQWRkZWQgcG5nZ2NjcmQuYywgdmVyc2lvbiBvZiBwbmd2Y3JkLmMgSW50ZWwgYXNzZW1ibGVyIGZvciBnY2MgKEdyZWcgUm9lbG9mcykKLSAgUmV2ZXJzZWQgdGhlIG9yZGVyIG9mIHRyeWluZyB0byB3cml0ZSBmbG9hdGluZy1wb2ludCBhbmQgZml4ZWQtcG9pbnQgZ0FNQS4KLXZlcnNpb24gMS4wLjVrIFtEZWNlbWJlciAyNywgMTk5OV0KLSAgQWRkZWQgbWFueSBwYXJlbnRoZXNlcywgZS5nLiwgImlmIChhICYmIGIgJiBjKSIgYmVjb21lcyAiaWYgKGEgJiYgKGIgJiBjKSkiCi0gIEFkZGVkIHBuZ19oYW5kbGVfYXNfdW5rbm93bigpIGZ1bmN0aW9uIChHbGVubikKLSAgQWRkZWQgcG5nX2ZyZWVfY2h1bmtfbGlzdCgpIGZ1bmN0aW9uIGFuZCBjaHVua19saXN0IGFuZCBudW1fY2h1bmtfbGlzdCBtZW1iZXJzCi0gICAgb2YgcG5nX3B0ci4KLSAgRWxpbWluYXRlZCBlcnJvbmVvdXMgd2FybmluZ3MgYWJvdXQgbXVsdGlwbGUgc1BMVCBjaHVua3MgYW5kIHNQTFQtYWZ0ZXItUExURS4KLSAgRml4ZWQgYSBsaWJwbmctMS4wLjVoIGJ1ZyBpbiBwbmdydXRpbC5jIHRoYXQgd2FzIGlzc3VpbmcgZXJyb25lb3VzIHdhcm5pbmdzCi0gICAgYWJvdXQgaWdub3JpbmcgaW5jb3JyZWN0IGdBTUEgd2l0aCBzUkdCIChnQU1BIHdhcyBpbiBmYWN0IG5vdCBpZ25vcmVkKQotICBBZGRlZCBwbmdfZnJlZV90Uk5TKCk7IHBuZ19zZXRfdFJOUygpIG5vdyBtYWxsb2MncyBpdHMgb3duIHRyYW5zIGFycmF5IChFU1IpLgotICBEZWZpbmUgcG5nX2dldF9pbnRfMzIgd2hlbiBvRkZzIGNodW5rIGlzIHN1cHBvcnRlZCBhcyB3ZWxsIGFzIHdoZW4gcENBTCBpcy4KLSAgQ2hhbmdlZCB0eXBlIG9mIHByb2ZsZW4gZnJvbSBwbmdfaW50XzMyIHRvIHBuZ191aW50XzMyIGluIHBuZ19nZXRfaUNDUCgpLgotdmVyc2lvbiAxLjAuNWwgW0phbnVhcnkgMSwgMjAwMF0KLSAgQWRkZWQgZnVuY3Rpb25zIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuKCkgYW5kIHBuZ19nZXRfdXNlcl9jaHVua19wdHIoKQotICAgIGZvciBzZXR0aW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIHVua25vd24gY2h1bmtzIGFuZCBmb3IKLSAgICByZXRyaWV2aW5nIHRoZSBhc3NvY2lhdGVkIHVzZXIgcG9pbnRlciAoR2xlbm4pLgotdmVyc2lvbiAxLjAuNW0gW0phbnVhcnkgNywgMjAwMF0KLSAgQWRkZWQgaGlnaC1sZXZlbCBmdW5jdGlvbnMgcG5nX3JlYWRfcG5nKCksIHBuZ193cml0ZV9wbmcoKSwgcG5nX2ZyZWVfcGl4ZWxzKCkuCi12ZXJzaW9uIDEuMC41biBbSmFudWFyeSA5LCAyMDAwXQotICBBZGRlZCBwbmdfZnJlZV9QTFRFKCkgZnVuY3Rpb24sIGFuZCBtb2RpZmllZCBwbmdfc2V0X1BMVEUoKSB0byBtYWxsb2MgaXRzCi0gICAgb3duIG1lbW9yeSBmb3IgaW5mb19wdHItPnBhbGV0dGUuICBUaGlzIG1ha2VzIGl0IHNhZmUgZm9yIHRoZSBjYWxsaW5nCi0gICAgYXBwbGljYXRpb24gdG8gZnJlZSBpdHMgY29weSBvZiB0aGUgcGFsZXR0ZSBhbnkgdGltZSBhZnRlciBpdCBjYWxscwotICAgIHBuZ19zZXRfUExURSgpLgotdmVyc2lvbiAxLjAuNW8gW0phbnVhcnkgMjAsIDIwMDBdCi0gIENvc21ldGljIGNoYW5nZXMgb25seSAocmVtb3ZlZCBzb21lIHRyYWlsaW5nIGJsYW5rcyBhbmQgVEFCcykKLXZlcnNpb24gMS4wLjVwIFtKYW51YXJ5IDMxLCAyMDAwXQotICBSZW5hbWVkIHBuZ2RsbC5tYWsgdG8gbWFrZWZpbGUuYmQzMgotICBDb3NtZXRpYyBjaGFuZ2VzIGluIHBuZ3Rlc3QuYwotdmVyc2lvbiAxLjAuNXEgW0ZlYnJ1YXJ5IDUsIDIwMDBdCi0gIFJlbG9jYXRlZCB0aGUgbWFrZWZpbGUuc29sYXJpcyB3YXJuaW5nIGFib3V0IFBBVEggcHJvYmxlbXMuCi0gIEZpeGVkIHBuZ3ZjcmQuYyBidWcgYnkgcHVzaGluZy9wb3BwaW5nIHJlZ2lzdGVycyBpbiBtbXhzdXBwb3J0IChCcnVjZSBPYmVyZykKLSAgUmV2aXNlZCBtYWtlZmlsZS5nY21teAotICBBZGRlZCBQTkdfU0VUSk1QX1NVUFBPUlRFRCwgUE5HX1NFVEpNUF9OT1RfU1VQUE9SVEVELCBhbmQgUE5HX0FCT1JUKCkgbWFjcm9zCi12ZXJzaW9uIDEuMC41ciBbRmVicnVhcnkgNywgMjAwMF0KLSAgUmVtb3ZlZCBzdXBlcmZsdW91cyBwcm90b3R5cGUgZm9yIHBuZ19nZXRfaXR4dCBmcm9tIHBuZy5oCi0gIEZpeGVkIGEgYnVnIGluIHBuZ3J0cmFuLmMgdGhhdCBpbXByb3Blcmx5IGV4cGFuZGVkIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgotICBSZXR1cm4gKm51bV90ZXh0PTAgZnJvbSBwbmdfZ2V0X3RleHQoKSB3aGVuIGFwcHJvcHJpYXRlLCBhbmQgZml4IGRvY3VtZW50YXRpb24KLSAgICBvZiBwbmdfZ2V0X3RleHQoKSBpbiBsaWJwbmcudHh0L2xpYnBuZy4zLgotdmVyc2lvbiAxLjAuNXMgW0ZlYnJ1YXJ5IDE4LCAyMDAwXQotICBBZGRlZCAicG5nX2ptcF9lbnYoKSIgbWFjcm8gdG8gcG5nY29uZi5oLCB0byBoZWxwIHBlb3BsZSBtaWdyYXRlIHRvIHRoZQotICAgIG5ldyBlcnJvciBoYW5kbGVyIHRoYXQncyBwbGFubmVkIGZvciB0aGUgbmV4dCBsaWJwbmcgcmVsZWFzZSwgYW5kIGNoYW5nZWQKLSAgICBleGFtcGxlLmMsIHBuZ3Rlc3QuYywgYW5kIGNvbnRyaWIgcHJvZ3JhbXMgdG8gdXNlIHRoaXMgbWFjcm8uCi0gIFJldmlzZWQgc29tZSBvZiB0aGUgRExMLWV4cG9ydCBtYWNyb3MgaW4gcG5nY29uZi5oIChHcmVnIFJvZWxvZnMpCi0gIEZpeGVkIGEgYnVnIGluIHBuZ19yZWFkX3BuZygpIHRoYXQgY2F1c2VkIGl0IHRvIGZhaWwgdG8gZXhwYW5kIHNvbWUgaW1hZ2VzCi0gICAgdGhhdCBpdCBzaG91bGQgaGF2ZSBleHBhbmRlZC4KLSAgRml4ZWQgc29tZSBtaXN0YWtlcyBpbiB0aGUgdW51c2VkIGFuZCB1bmRvY3VtZW50ZWQgSU5DSF9DT05WRVJTSU9OUyBmdW5jdGlvbnMKLSAgICBpbiBwbmdnZXQuYwotICBDaGFuZ2VkIHRoZSBhbGxvY2F0aW9uIG9mIHBhbGV0dGUsIGhpc3RvcnksIGFuZCB0cmFucyBhcnJheXMgYmFjayB0bwotICAgIHRoZSB2ZXJzaW9uIDEuMC41IG1ldGhvZCAobGlua2luZyBpbnN0ZWFkIG9mIGNvcHlpbmcpIHdoaWNoIHJlc3RvcmVzCi0gICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb24gMS4wLjUuICBBZGRlZCBzb21lIHJlbWFya3MgYWJvdXQKLSAgICB0aGF0IGluIGV4YW1wbGUuYy4gIEFkZGVkICJmcmVlX21lIiBtZW1iZXIgdG8gaW5mb19wdHIgYW5kIHBuZ19wdHIKLSAgICBhbmQgYWRkZWQgcG5nX2ZyZWVfZGF0YSgpIGZ1bmN0aW9uLgotICBVcGRhdGVkIG1ha2VmaWxlLmxpbnV4IGFuZCBtYWtlZmlsZS5nY2NtbXggdG8gbWFrZSBkaXJlY3RvcmllcyBjb25kaXRpb25hbGx5LgotICBNYWRlIGNvc21ldGljIGNoYW5nZXMgdG8gcG5nYXNtcmQuaAotICBBZGRlZCBwbmdfc2V0X3Jvd3MoKSBhbmQgcG5nX2dldF9yb3dzKCksIGZvciB1c2Ugd2l0aCBwbmdfcmVhZHx3cml0ZV9wbmcoKS4KLSAgTW9kaWZpZWQgcG5nX3JlYWRfcG5nKCkgdG8gYWxsb2NhdGUgaW5mb19wdHItPnJvd19wb2ludGVycyBvbmx5IGlmIGl0Ci0gICAgaGFzbid0IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuCi12ZXJzaW9uIDEuMC41dCBbTWFyY2ggNCwgMjAwMF0KLSAgQ2hhbmdlZCBwbmdfam1wX2VudigpIG1pZ3JhdGlvbiBhaWRpbmcgbWFjcm8gdG8gcG5nX2ptcGJ1ZigpLgotICBGaXhlZCAiaW50ZXJsYWNlIiB0eXBvIChzaG91bGQgYmUgImludGVybGFjZWQiKSBpbiBjb250cmliL2dyZWdib29rL3JlYWQyLXguYwotICBGaXhlZCBidWcgd2l0aCB1c2Ugb2YgUE5HX0JFRk9SRV9JSERSIGJpdCBpbiBwbmdfcHRyLT5tb2RlLCBpbnRyb2R1Y2VkIHdoZW4KLSAgICBQTkdfRkxBR19IQVZFX0NIVU5LX0hFQURFUiB3YXMgbW92ZWQgaW50byBwbmdfcHRyLT5tb2RlIGluIHZlcnNpb24gMS4wLjViCi0gIEZpbGVzIGluIGNvbnRyaWIvZ3JlZ2Jvb2sgd2VyZSByZXZpc2VkIHRvIHVzZSBwbmdfam1wYnVmKCkgYW5kIHRvIHNlbGVjdAotICAgIGEgMjQtYml0IHZpc3VhbCBpZiBvbmUgaXMgYXZhaWxhYmxlLCBhbmQgdG8gYWxsb3cgYWJicmV2aWF0ZWQgb3B0aW9ucy4KLSAgRmlsZXMgaW4gY29udHJpYi9wbmdtaW51cyB3ZXJlIHJldmlzZWQgdG8gdXNlIHRoZSBwbmdfam1wYnVmKCkgbWFjcm8uCi0gIFJlbW92ZWQgc3BhY2VzIGluIG1ha2VmaWxlLmxpbnV4IGFuZCBtYWtlZmlsZS5nY21teCwgaW50cm9kdWNlZCBpbiAxLjAuNXMKLXZlcnNpb24gMS4wLjV1IFtNYXJjaCA1LCAyMDAwXQotICBTaW1wbGlmaWVkIHRoZSBjb2RlIHRoYXQgZGV0ZWN0cyBvbGQgcG5nLmggaW4gcG5nLmMgYW5kIHBuZ3Rlc3QuYwotICBSZW5hbWVkIHBuZ19zcGFsZXR0ZSAoX3AsIF9wcCkgdG8gcG5nX3NQTFRfdCAoX3RwLCBfdHBwKQotICBJbmNyZWFzZWQgcHJlY2lzaW9uIG9mIHJnYl90b19ncmF5IGNhbGN1bGF0aW9ucyBmcm9tIDggdG8gMTUgYml0cyBhbmQKLSAgICBhZGRlZCBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKCkgZnVuY3Rpb24uCi0gIEFkZGVkIG1ha2VmaWxlLmJjMzIgKDMyLWJpdCBCb3JsYW5kIEMrKywgQyBtb2RlKQotdmVyc2lvbiAxLjAuNXYgW01hcmNoIDExLCAyMDAwXQotICBBZGRlZCBzb21lIHBhcmVudGhlc2VzIHRvIHRoZSBwbmdfam1wYnVmIG1hY3JvIGRlZmluaXRpb24uCi0gIFVwZGF0ZWQgcmVmZXJlbmNlcyB0byB0aGUgemxpYiBob21lIHBhZ2UsIHdoaWNoIGhhcyBtb3ZlZCB0byBmcmVlc29mdHdhcmUuY29tLgotICBDb3JyZWN0ZWQgYnVncyBpbiBkb2N1bWVudGF0aW9uIHJlZ2FyZGluZyBwbmdfcmVhZF9yb3coKSBhbmQgcG5nX3dyaXRlX3JvdygpLgotICBVcGRhdGVkIGRvY3VtZW50YXRpb24gb2YgcG5nX3JnYl90b19ncmF5IGNhbGN1bGF0aW9ucyBpbiBsaWJwbmcuMy9saWJwbmcudHh0LgotICBSZW5hbWVkIG1ha2VmaWxlLmJvcmxhbmQsdHVyYm9jMyBiYWNrIHRvIG1ha2VmaWxlLmJvcix0YzMgYXMgaW4gdmVyc2lvbiAxLjAuMywKLSAgICByZXZpc2VkIGJvcmxhbmQgbWFrZWZpbGVzOyBhZGRlZCBtYWtlZmlsZS5pYm12YWMzIGFuZCBtYWtlZmlsZS5nY2MgKENvc21pbikKLQotdmVyc2lvbiAxLjAuNiBbTWFyY2ggMjAsIDIwMDBdCi0gIE1pbm9yIHJldmlzaW9ucyBvZiBtYWtlZmlsZS5ib3IsIGxpYnBuZy50eHQsIGFuZCBncmVnYm9vay9ycG5nMi13aW4uYwotICBBZGRlZCBtYWtlZmlsZS5zZ2djYyAoU0dJIElSSVggd2l0aCBnY2MpCi12ZXJzaW9uIDEuMC42ZCBbQXByaWwgNywgMjAwMF0KLSAgQ2hhbmdlZCBzcHJpbnRmKCkgdG8gc3RyY3B5KCkgaW4gcG5nX3dyaXRlX3NDQUxfcygpIHRvIHdvcmsgd2l0aG91dCBTVERJTwotICBBZGRlZCBkYXRhX2xlbmd0aCBwYXJhbWV0ZXIgdG8gcG5nX2RlY29tcHJlc3NfY2h1bmsoKSBmdW5jdGlvbgotICBSZXZpc2VkIGRvY3VtZW50YXRpb24gdG8gcmVtb3ZlIHJlZmVyZW5jZSB0byBhYmFuZG9uZWQgcG5nX2ZyZWVfY2huayBmdW5jdGlvbnMKLSAgRml4ZWQgYW4gZXJyb3IgaW4gcG5nX3JnYl90b19ncmF5X2ZpeGVkKCkKLSAgUmV2aXNlZCBleGFtcGxlLmMsIHVzYWdlIG9mIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpLgotICBSZW5hbWVkIG1ha2VmaWxlLmlibXZhYzMgdG8gbWFrZWZpbGUuaWJtYywgYWRkZWQgbGlicG5nLmljYyBJQk0gcHJvamVjdCBmaWxlCi0gIEFkZGVkIGEgY2hlY2sgZm9yIGluZm9fcHRyLT5mcmVlX21lJlBOR19GUkVFX1RFWFQgd2hlbiBmcmVlaW5nIHRleHQgaW4gcG5nLmMKLSAgU2ltcGxpZnkgcG5nX3NpZ19ieXRlcygpIGZ1bmN0aW9uIHRvIHJlbW92ZSB1c2Ugb2Ygbm9uLUlTTy1DIHN0cmR1cCgpLgotdmVyc2lvbiAxLjAuNmUgW0FwcmlsIDksIDIwMDBdCi0gIEFkZGVkIHBuZ19kYXRhX2ZyZWVyKCkgZnVuY3Rpb24uCi0gIEluIHRoZSBjb2RlIHRoYXQgY2hlY2tzIGZvciBvdmVyLWxlbmd0aCB0Uk5TIGNodW5rcywgYWRkZWQgY2hlY2sgb2YKLSAgICBpbmZvX3B0ci0+bnVtX3RyYW5zIGFzIHdlbGwgYXMgcG5nX3B0ci0+bnVtX3RyYW5zIChNYXR0aGlhcyBCZW5ja21hbm4pCi0gIE1pbm9yIHJldmlzaW9ucyBvZiBsaWJwbmcudHh0L2xpYnBuZy4zLgotICBDaGVjayBmb3IgZXhpc3RpbmcgZGF0YSBhbmQgZnJlZSBpdCBpZiB0aGUgZnJlZV9tZSBmbGFnIGlzIHNldCwgaW4gcG5nX3NldF8qKCkKLSAgICBhbmQgcG5nX2hhbmRsZV8qKCkuCi0gIE9ubHkgZGVmaW5lIFBOR19XRUlHSFRFRF9GSUxURVJTX1NVUFBPUlRFRCB3aGVuIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgICBpcyBkZWZpbmVkLgotICBDaGFuZ2VkIHNldmVyYWwgaW5zdGFuY2VzIG9mIFBOR19OT19DT05TT0xFX0lEIHRvIFBOR19OT19TVERJTyBpbiBwbmdydXRpbC5jCi0gICAgYW5kIG1lbnRpb25lZCB0aGUgcHVycG9zZXMgb2YgdGhlIHR3byBtYWNyb3MgaW4gbGlicG5nLnR4dC9saWJwbmcuMy4KLXZlcnNpb24gMS4wLjZmIFtBcHJpbCAxNCwgMjAwMF0KLSAgUmV2aXNlZCBwbmdfc2V0X2lDQ1AoKSBhbmQgcG5nX3NldF9yb3dzKCkgdG8gYXZvaWQgcHJlbWF0dXJlbHkgZnJlZWluZyBkYXRhLgotICBBZGQgY2hlY2tzIGluIHBuZ19zZXRfdGV4dCgpIGZvciBOVUxMIG1lbWJlcnMgb2YgdGhlIGlucHV0IHRleHQgc3RydWN0dXJlLgotICBSZXZpc2VkIGxpYnBuZy50eHQvbGlicG5nLjMuCi0gIFJlbW92ZWQgc3VwZXJmbHVvdXMgcHJvdG90eXBlIGZvciBwbmdfc2V0X2l0eHQgZnJvbSBwbmcuaAotICBSZW1vdmVkICJlbHNlIiBmcm9tIHBuZ3JlYWQuYywgYWZ0ZXIgcG5nX2Vycm9yKCksIGFuZCBjaGFuZ2VkICIwIiB0byAibGVuZ3RoIi4KLSAgQ2hhbmdlZCBzZXZlcmFsIHBuZ19lcnJvcnMgYWJvdXQgbWFsZm9ybWVkIGFuY2lsbGFyeSBjaHVua3MgdG8gcG5nX3dhcm5pbmdzLgotdmVyc2lvbiAxLjAuNmcgW0FwcmlsIDI0LCAyMDAwXQotICBBZGRlZCBwbmdfcGFzcy0qIGFycmF5cyB0byBwbmdnY2NyZC5jIHdoZW4gUE5HX1VTRV9MT0NBTF9BUlJBWVMgaXMgZGVmaW5lZC4KLSAgUmVsb2NhdGVkIHBhcmFncmFwaCBhYm91dCBwbmdfc2V0X2JhY2tncm91bmQoKSBpbiBsaWJwbmcuMy9saWJwbmcudHh0Ci0gICAgYW5kIG90aGVyIHJldmlzaW9ucyAoTWF0dGhpYXMgQmVuY2ttYW5uKQotICBSZWxvY2F0ZWQgaW5mb19wdHItPmZyZWVfbWUsIHBuZ19wdHItPmZyZWVfbWUsIGFuZCBvdGhlciBpbmZvX3B0ciBhbmQKLSAgICBwbmdfcHRyIG1lbWJlcnMgdG8gcmVzdG9yZSBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGxpYnBuZy0xLjAuNQotICAgIChicmVha3MgY29tcGF0aWJpbGl0eSB3aXRoIGxpYnBuZy0xLjAuNikuCi12ZXJzaW9uIDEuMC42aCBbQXByaWwgMjQsIDIwMDBdCi0gIENoYW5nZWQgc2hhcmVkIGxpYnJhcnkgc28tbnVtYmVyIHBhdHRlcm4gZnJvbSAyLngueS56IHRvIHh5LnogKHRoaXMgYnVpbGRzCi0gICAgbGlicG5nLnNvLjEwICYgbGlicG5nLnNvLjEwLjZoIGluc3RlYWQgb2YgbGlicG5nLnNvLjIgJiBsaWJwbmcuc28uMi4xLjAuNmgpCi0gICAgVGhpcyBpcyBhIHRlbXBvcmFyeSBjaGFuZ2UgZm9yIHRlc3QgcHVycG9zZXMuCi12ZXJzaW9uIDEuMC42aSBbTWF5IDIsIDIwMDBdCi0gIFJlYXJyYW5nZWQgc29tZSBtZW1iZXJzIGF0IHRoZSBlbmQgb2YgcG5nX2luZm8gYW5kIHBuZ19zdHJ1Y3QsIHRvIHB1dAotICAgIHVua25vd25fY2h1bmtzX251bSBhbmQgZnJlZV9tZSB3aXRoaW4gdGhlIG9yaWdpbmFsIHNpemUgb2YgdGhlIHBuZ19zdHJ1Y3RzCi0gICAgYW5kIGZyZWVfbWUsIHBuZ19yZWFkX3VzZXJfZm4sIGFuZCBwbmdfZnJlZV9mbiB3aXRoaW4gdGhlIG9yaWdpbmFsIHBuZ19pbmZvLAotICAgIGJlY2F1c2Ugc29tZSBvbGQgYXBwbGljYXRpb25zIGFsbG9jYXRlIHRoZSBzdHJ1Y3RzIGRpcmVjdGx5IGluc3RlYWQgb2YKLSAgICB1c2luZyBwbmdfY3JlYXRlXyooKS4KLSAgQWRkZWQgZG9jdW1lbnRhdGlvbiBvZiB1c2VyIG1lbW9yeSBmdW5jdGlvbnMgaW4gbGlicG5nLnR4dC9saWJwbmcuMwotICBNb2RpZmllZCBwbmdfcmVhZF9wbmcgc28gdGhhdCBpdCB3aWxsIHVzZSB1c2VyX2FsbG9jYXRlZCByb3dfcG9pbnRlcnMKLSAgICBpZiBwcmVzZW50LCB1bmxlc3MgZnJlZV9tZSBkaXJlY3RzIHRoYXQgaXQgYmUgZnJlZWQsIGFuZCBhZGRlZCBkZXNjcmlwdGlvbgotICAgIG9mIHRoZSB1c2Ugb2YgcG5nX3NldF9yb3dzKCkgYW5kIHBuZ19nZXRfcm93cygpIGluIGxpYnBuZy50eHQvbGlicG5nLjMuCi0gIEFkZGVkIFBOR19MRUdBQ1lfU1VQUE9SVEVEIG1hY3JvLCBhbmQgI2lmZGVmIG91dCBhbGwgbmV3IChzaW5jZSB2ZXJzaW9uCi0gICAgMS4wMCkgbWVtYmVycyBvZiBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbywgdG8gcmVnYWluIGJpbmFyeSBjb21wYXRpYmlsaXR5Ci0gICAgd2hlbiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8uICBDYXBhYmlsaXRpZXMgbG9zdCBpbiB0aGlzIGV2ZW50Ci0gICAgYXJlIHVzZXIgdHJhbnNmb3JtcyAobmV3IGluIHZlcnNpb24gMS4wLjApLHRoZSB1c2VyIHRyYW5zZm9ybSBwb2ludGVyCi0gICAgKG5ldyBpbiB2ZXJzaW9uIDEuMC4yKSwgcmdiX3RvX2dyYXkgKG5ldyBpbiAxLjAuNSksIGlDQ1AsIHNDQUwsIHNQTFQsCi0gICAgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlLCBhbmQgdW5rbm93biBjaHVua3Mgc3VwcG9ydCAoYWxsIG5ldyBpbiAxLjAuNikuCi0gICAgVGhpcyB3YXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2Ygb2xkIGFwcGxpY2F0aW9ucyB0aGF0IGFsbG9jYXRlIHRoZSBzdHJ1Y3RzCi0gICAgZGlyZWN0bHkgYXMgYXV0aG9ycyB3ZXJlIGluc3RydWN0ZWQgdG8gZG8gaW4gbGlicG5nLTAuODggYW5kIGVhcmxpZXIsCi0gICAgaW5zdGVhZCBvZiB1c2luZyBwbmdfY3JlYXRlXyooKS4KLSAgQWRkZWQgbW9kZXMgUE5HX0NSRUFURURfUkVBRF9TVFJVQ1QgYW5kIFBOR19DUkVBVEVEX1dSSVRFX1NUUlVDVCB3aGljaAotICAgIGNhbiBiZSB1c2VkIHRvIGRldGVjdCBjb2RlcyB0aGF0IGRpcmVjdGx5IGFsbG9jYXRlIHRoZSBzdHJ1Y3RzLCBhbmQKLSAgICBjb2RlIHRvIGNoZWNrIHRoZXNlIG1vZGVzIGluIHBuZ19yZWFkX2luaXQoKSBhbmQgcG5nX3dyaXRlX2luaXQoKSBhbmQKLSAgICBnZW5lcmF0ZSBhIGxpYnBuZyBlcnJvciBpZiB0aGUgbW9kZXMgYXJlbid0IHNldCBhbmQgUE5HX0xFR0FDWV9TVVBQT1JURUQKLSAgICB3YXMgbm90IGRlZmluZWQuCi0gIEFkZGVkIG1ha2VmaWxlLmludGVsIGFuZCB1cGRhdGVkIG1ha2VmaWxlLndhdGNvbSAoUGF3ZWwgTXJvY2hlbikKLXZlcnNpb24gMS4wLjZqIFtNYXkgMywgMjAwMF0KLSAgT3ZlcmxvYWRlZCBwbmdfcmVhZF9pbml0KCkgYW5kIHBuZ193cml0ZV9pbml0KCkgd2l0aCBtYWNyb3MgdGhhdCBjb252ZXJ0Ci0gICAgY2FsbHMgdG8gcG5nX3JlYWRfaW5pdF8yKCkgb3IgcG5nX3dyaXRlX2luaXRfMigpIHRoYXQgY2hlY2sgdGhlIHZlcnNpb24KLSAgICBhbmQgc3RydWN0dXJlIHNpemVzLgotdmVyc2lvbiAxLjAuN2JldGExMSBbTWF5IDcsIDIwMDBdCi0gIFJlbW92ZWQgdGhlIG5ldyBQTkdfQ1JFQVRFRF9SRUFEX1NUUlVDVCBhbmQgUE5HX0NSRUFURURfV1JJVEVfU1RSVUNUIG1vZGVzCi0gICAgd2hpY2ggYXJlIG5vIGxvbmdlciB1c2VkLgotICBFbGltaW5hdGVkIHRoZSB0aHJlZSBuZXcgbWVtYmVycyBvZiBwbmdfdGV4dCB3aGVuIFBOR19MRUdBQ1lfU1VQUE9SVEVEIGlzCi0gICAgZGVmaW5lZCBvciB3aGVuIG5laXRoZXIgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQgbm9yIFBOR19XUklURV9pVFhUX1NVUFBPUlRFRAotICAgIGlzIGRlZmluZWQuCi0gIE1hZGUgUE5HX05PX1JFQUR8V1JJVEVfaVRYdCB0aGUgZGVmYXVsdCBzZXR0aW5nLCB0byBhdm9pZCBtZW1vcnkKLSAgICBvdmVycnVuIHdoZW4gb2xkIGFwcGxpY2F0aW9ucyBmaWxsIHRoZSBpbmZvX3B0ci0+dGV4dCBzdHJ1Y3R1cmUgZGlyZWN0bHkuCi0gIEFkZGVkIFBOR0FQSSBtYWNybywgYW5kIGFkZGVkIGl0IHRvIHRoZSBkZWZpbml0aW9ucyBvZiBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zLgotICBSZWxvY2F0ZWQgdmVyc2lvbiBtYWNybyBkZWZpbml0aW9ucyBhaGVhZCBvZiB0aGUgaW5jbHVkZXMgb2YgemxpYi5oIGFuZAotICAgIHBuZ2NvbmYuaCBpbiBwbmcuaC4KLXZlcnNpb24gMS4wLjdiZXRhMTIgW01heSAxMiwgMjAwMF0KLSAgUmV2aXNlZCBwbmdzZXQuYyB0byBhdm9pZCBhIHByb2JsZW0gd2l0aCBleHBhbmRpbmcgdGhlIHBuZ19kZWJ1ZyBtYWNyby4KLSAgRGVsZXRlZCBzb21lIGV4dHJhbmVvdXMgZGVmaW5lcyBmcm9tIHBuZ2NvbmYuaAotICBNYWRlIFBOR19OT19DT05TT0xFX0lPIHRoZSBkZWZhdWx0IGNvbmRpdGlvbiB3aGVuIFBOR19CVUlMRF9ETEwgaXMgZGVmaW5lZC4KLSAgVXNlIE1TQyBfUlBUbiBkZWJ1Z2dpbmcgaW5zdGVhZCBvZiBmcHJpbnRmIGlmIF9NU0NfVkVSIGlzIGRlZmluZWQuCi0gIEFkZGVkIHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIoKSBmdW5jdGlvbi4KLSAgQ2hlY2sgZm9yIG1hc2smUE5HX0ZSRUVfQ0hOSyAoZm9yIFRFWFQsIFNDQUwsIFBDQUwpIGluIHBuZ19mcmVlX2RhdGEoKS4KLSAgRXhwYW5kZWQgbGlicG5nLjMvbGlicG5nLnR4dCBpbmZvcm1hdGlvbiBhYm91dCBwbmdfZGF0YV9mcmVlcigpLgotdmVyc2lvbiAxLjAuN2JldGExNCBbTWF5IDE3LCAyMDAwXSAoYmV0YTEzIHdhcyBub3QgcHVibGlzaGVkKQotICBDaGFuZ2VkIHBuZ2djY3JkLmMgYW5kIHBuZ3ZjcmQuYyB0byBoYW5kbGUgYmFkIGFkYXB0aXZlIGZpbHRlciB0eXBlcyBhcwotICAgIHdhcm5pbmdzIGluc3RlYWQgb2YgZXJyb3JzLCBhcyBwbmdydXRpbC5jIGRvZXMuCi0gIFNldCB0aGUgUE5HX0lORk9fSURBVCB2YWxpZCBmbGFnIGluIHBuZ19zZXRfcm93cygpIHNvIHBuZ193cml0ZV9wbmcoKQotICAgIHdpbGwgYWN0dWFsbHkgd3JpdGUgSURBVHMuCi0gIE1hZGUgdGhlIGRlZmF1bHQgUE5HX1VTRV9MT0NBTF9BUlJBWVMgZGVwZW5kIG9uIFBOR19ETEwgaW5zdGVhZCBvZiBXSU4zMi4KLSAgTWFrZSBwbmdfZnJlZV9kYXRhKCkgaWdub3JlIGl0cyBmaW5hbCBwYXJhbWV0ZXIgZXhjZXB0IHdoZW4gZnJlZWluZyBkYXRhCi0gICAgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgKHRleHQsIHNQTFQsIHVua25vd25zKS4KLSAgRml4ZWQgYSBuZXcgYnVnIGluIHBuZ19zZXRfcm93cygpLgotICBSZW1vdmVkIGluZm9fcHRyLT52YWxpZCB0ZXN0cyBmcm9tIHBuZ19mcmVlX2RhdGEoKSwgYXMgaW4gdmVyc2lvbiAxLjAuNS4KLSAgQWRkZWQgcG5nX3NldF9pbnZhbGlkKCkgZnVuY3Rpb24uCi0gIEZpeGVkIGluY29ycmVjdCBpbGx1c3RyYXRpb25zIG9mIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpIGluIGV4YW1wbGUuYy4KLXZlcnNpb24gMS4wLjdiZXRhMTUgW01heSAzMCwgMjAwMF0KLSAgUmV2aXNlZCB0aGUgZGVsaWJlcmF0ZWx5IGVycm9uZW91cyBMaW51eCBzZXRqbXAgY29kZSBpbiBwbmdjb25mLmggdG8gcHJvZHVjZQotICAgIGZld2VyIGVycm9yIG1lc3NhZ2VzLgotICBSZWFycmFuZ2VkIGNoZWNrcyBmb3IgWl9PSyB0byBjaGVjayB0aGUgbW9zdCBsaWtlbHkgcGF0aCBmaXJzdCBpbiBwbmdwcmVhZC5jCi0gICAgYW5kIHBuZ3d1dGlsLmMuCi0gIEFkZGVkIGNoZWNrcyBpbiBwbmd0ZXN0LmMgZm9yIHBuZ19jcmVhdGVfKigpIHJldHVybmluZyBOVUxMLCBhbmQgbWVudGlvbmVkCi0gICAgaW4gbGlicG5nLnR4dC9saWJwbmcuMyB0aGUgbmVlZCBmb3IgYXBwbGljYXRpb25zIHRvIGNoZWNrIHRoaXMuCi0gIENoYW5nZWQgbmFtZXMgb2YgcG5nX2RlZmF1bHRfKigpIGZ1bmN0aW9ucyBpbiBwbmd0ZXN0IHRvIHBuZ3Rlc3RfKigpLgotICBDaGFuZ2VkIHJldHVybiB0eXBlIG9mIHBuZ19nZXRfeHx5X29mZnNldF8qKCkgZnJvbSBwbmdfdWludF8zMiB0byBwbmdfaW50XzMyLgotICBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIHVudXNlZCBQTkdfSU5DSF9DT05WRVJTSU9OUyBmdW5jdGlvbnMgaW4gcG5nZ2V0LmMKLSAgU2V0IGVhY2ggcG9pbnRlciB0byBOVUxMIGFmdGVyIGZyZWVpbmcgaXQgaW4gcG5nX2ZyZWVfZGF0YSgpLgotICBXb3JrZWQgYXJvdW5kIGEgcHJvYmxlbSBpbiBwbmdjb25mLmg7IEFJWCdzIHN0cmluZ3MuaCBkZWZpbmVzIGFuICJpbmRleCIKLSAgICBtYWNybyB0aGF0IGNvbmZsaWN0cyB3aXRoIGxpYnBuZydzIHBuZ19jb2xvcl8xNi5pbmRleC4gKERpbWl0cmkgUGFwYWRhcG91bG9zKQotICBBZGRlZCAibXN2YyIgZGlyZWN0b3J5IHdpdGggTVNWQysrIHByb2plY3QgZmlsZXMgKFNpbW9uLVBpZXJyZSBDYWRpZXV4KS4KLXZlcnNpb24gMS4wLjdiZXRhMTYgW0p1bmUgNCwgMjAwMF0KLSAgUmV2aXNlZCB0aGUgd29ya2Fyb3VuZCBvZiBBSVggc3RyaW5nLmggImluZGV4IiBidWcuCi0gIEFkZGVkIGEgY2hlY2sgZm9yIG92ZXJsZW5ndGggUExURSBjaHVuayBpbiBwbmdydXRpbC5jLgotICBBZGRlZCBQTkdfTk9fUE9JTlRFUl9JTkRFWElORyBtYWNybyB0byB1c2UgYXJyYXktaW5kZXhpbmcgaW5zdGVhZCBvZiBwb2ludGVyCi0gICAgaW5kZXhpbmcgaW4gcG5ncnV0aWwuYyBhbmQgcG5nd3V0aWwuYyB0byBhY2NvbW1vZGF0ZSBhIGJ1Z2d5IGNvbXBpbGVyLgotICBBZGRlZCBhIHdhcm5pbmcgaW4gcG5nX2RlY29tcHJlc3NfY2h1bmsoKSB3aGVuIGl0IHJ1bnMgb3V0IG9mIGRhdGEsIGUuZy4KLSAgICB3aGVuIGl0IHRyaWVzIHRvIHJlYWQgYW4gZXJyb25lb3VzIFBob3RvU2hvcCBpQ0NQIGNodW5rLgotICBBZGRlZCBQTkdfVVNFX0RMTCBtYWNyby4KLSAgUmV2aXNlZCB0aGUgY29weXJpZ2h0L2Rpc2NsYWltZXIvbGljZW5zZSBub3RpY2UuCi0gIEFkZGVkIGNvbnRyaWIvbXN2Y3Rlc3QgZGlyZWN0b3J5Ci12ZXJzaW9uIDEuMC43cmMxIFtKdW5lIDksIDIwMDBdCi0gIENvcnJlY3RlZCB0aGUgZGVmaW5pdGlvbiBvZiBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSAgKDB4MDQwMCBub3QgMHgwMjAwKQotICBBZGRlZCBjb250cmliL3Zpc3VwbmcgZGlyZWN0b3J5IChXaWxsZW0gdmFuIFNjaGFpaykKLXZlcnNpb24gMS4wLjdiZXRhMTggW0p1bmUgMjMsIDIwMDBdCi0gIFJldmlzZWQgUE5HQVBJIGRlZmluaXRpb24sIGFuZCBwbmd2Y3JkLmMgdG8gd29yayB3aXRoIF9fR0NDX18KLSAgICBhbmQgZG8gbm90IHJlZGVmaW5lIFBOR0FQSSBpZiBpdCBpcyBwYXNzZWQgaW4gdmlhIGEgY29tcGlsZXIgZGlyZWN0aXZlLgotICBSZXZpc2VkIHZpc3VwbmcvUG5nRmlsZS5jIHRvIHJlbW92ZSByZXR1cm5zIGZyb20gd2l0aGluIHRoZSBUcnkgYmxvY2suCi0gIFJlbW92ZWQgbGVhZGluZyB1bmRlcnNjb3JlcyBmcm9tICJfUE5HX0giIGFuZCAiX1BOR19TQVZFX0JTRF9TT1VSQ0UiIG1hY3Jvcy4KLSAgVXBkYXRlZCBjb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oIHRvIHZlcnNpb24gMS4wLjAuCi0gIEZpeGVkIGJ1Z3MgaW4gcG5nd3JpdGUuYyBhbmQgcG5nd3V0aWwuYyB0aGF0IHByZXZlbnRlZCB3cml0aW5nIGlDQ1AgY2h1bmtzLgotdmVyc2lvbiAxLjAuN3JjMiBbSnVuZSAyOCwgMjAwMF0KLSAgVXBkYXRlZCBsaWNlbnNlIHRvIGluY2x1ZGUgZGlzY2xhaW1lcnMgcmVxdWlyZWQgYnkgVUNJVEEuCi0gIEZpeGVkICJESkJQUCIgdHlwbyBpbiBwbmdnY2NyZC5jIGludHJvZHVjZWQgaW4gYmV0YTE4LgotCi12ZXJzaW9uIDEuMC43IFtKdWx5IDEsIDIwMDBdCi0gIFJldmlzZWQgdGhlIGRlZmluaXRpb24gb2YgInRyYW5zX3ZhbHVlcyIgaW4gbGlicG5nLjMvbGlicG5nLnR4dAotdmVyc2lvbiAxLjAuOGJldGExIFtKdWx5IDgsIDIwMDBdCi0gIEFkZGVkIHBuZ19mcmVlKHBuZ19wdHIsIGtleSkgdHdvIHBsYWNlcyBpbiBwbmdwcmVhZC5jIHRvIHN0b3AgbWVtb3J5IGxlYWtzLgotICBDaGFuZ2VkIFBOR19OT19TVERJTyB0byBQTkdfTk9fQ09OU09MRV9JTywgc2V2ZXJhbCBwbGFjZXMgaW4gcG5ncnV0aWwuYyBhbmQKLSAgICAgcG5nd3V0aWwuYy4KLSAgQ2hhbmdlZCBQTkdfRVhQT1JUX1ZBUiB0byB1c2UgUE5HX0lNUEVYUCwgaW4gcG5nY29uZi5oLgotICBSZW1vdmVkIHVudXNlZCAiI2luY2x1ZGUgPGFzc2VydC5oPiIgZnJvbSBwbmcuYwotICBBZGRlZCBXaW5kb3dzQ0Ugc3VwcG9ydC4KLSAgUmV2aXNlZCBwbmdnY2NyZC5jIHRvIHdvcmsgd2l0aCBnY2MtMi45NS4yIGFuZCBpbiB0aGUgQ3lnd2luIGVudmlyb25tZW50LgotdmVyc2lvbiAxLjAuOGJldGEyIFtKdWx5IDEwLCAyMDAwXQotICBBZGRlZCBwcm9qZWN0IGZpbGVzIHRvIHRoZSB3aW5jZSBkaXJlY3RvcnkgYW5kIG1hZGUgZnVydGhlciByZXZpc2lvbnMKLSAgICAgb2YgcG5ndGVzdC5jLCBwbmdyaW8uYywgYW5kIHBuZ3dpby5jIGluIHN1cHBvcnQgb2YgV2luZG93c0NFLgotdmVyc2lvbiAxLjAuOGJldGEzIFtKdWx5IDExLCAyMDAwXQotICBPbmx5IHNldCB0aGUgUE5HX0ZMQUdfRlJFRV9UUk5TIG9yIFBOR19GUkVFX1RSTlMgZmxhZyBpbiBwbmdfaGFuZGxlX3RSTlMoKQotICAgICBmb3IgaW5kZXhlZC1jb2xvciBpbnB1dCBmaWxlcyB0byBhdm9pZCBwb3RlbnRpYWwgZG91YmxlLWZyZWVpbmcgdHJhbnMgYXJyYXkKLSAgICAgdW5kZXIgc29tZSB1bnVzdWFsIGNvbmRpdGlvbnM7IHByb2JsZW0gd2FzIGludHJvZHVjZWQgaW4gdmVyc2lvbiAxLjAuNmYuCi0gIEZ1cnRoZXIgcmV2aXNpb25zIHRvIHBuZ3Rlc3QuYyBhbmQgZmlsZXMgaW4gdGhlIHdpbmNlIHN1YmRpcmVjdG9yeS4KLXZlcnNpb24gMS4wLjhiZXRhNCBbSnVseSAxNCwgMjAwMF0KLSAgQWRkZWQgdGhlIGZpbGVzIHBuZ2Jhci5wbmcgYW5kIHBuZ2Jhci5qcGcgdG8gdGhlIGRpc3RyaWJ1dGlvbi4KLSAgQWRkZWQgbWFrZWZpbGUuY3lnd2luLCBhbmQgY3lnd2luIHN1cHBvcnQgaW4gcG5nY29uZi5oCi0gIEFkZGVkIFBOR19OT19aQUxMT0NfWkVSTyBtYWNybyAobWFrZXMgcG5nX3phbGxvYyBza2lwIHplcm9pbmcgbWVtb3J5KQotdmVyc2lvbiAxLjAuOHJjMSBbSnVseSAxNiwgMjAwMF0KLSAgUmV2aXNlZCBwbmdfZGVidWcoKSBtYWNyb3MgYW5kIHN0YXRlbWVudHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotCi12ZXJzaW9uIDEuMC44IFtKdWx5IDI0LCAyMDAwXQotICBBZGRlZCBwbmdfZmx1c2goKSBpbiBwbmd3cml0ZS5jLCBhZnRlciBwbmdfd3JpdGVfSUVORCgpLgotICBVcGRhdGVkIG1ha2VmaWxlLmhwdXggdG8gYnVpbGQgYSBzaGFyZWQgbGlicmFyeS4KLXZlcnNpb24gMS4wLjliZXRhMSBbTm92ZW1iZXIgMTAsIDIwMDBdCi0gIEZpeGVkIHR5cG8gaW4gc2NyaXB0cy9tYWtlZmlsZS5ocHV4Ci0gIFVwZGF0ZWQgbWFrZXZtcy5jb20gaW4gc2NyaXB0cyBhbmQgY29udHJpYi8qIGFuZCBjb250cmliLyogKE1hcnRpbiBaaW5zZXIpCi0gIEZpeGVkIHNlcWVuY2UtcG9pbnQgYnVnIGluIGNvbnRyaWIvcG5nbWludXMvcG5nMnBubSAoTWFydGluIFppbnNlcikKLSAgQ2hhbmdlZCAiY2Ryb20uY29tIiBpbiBkb2N1bWVudGF0aW9uIHRvICJsaWJwbmcub3JnIgotICBSZXZpc2VkIHBuZ2djY3JkLmMgdG8gZ2V0IGl0IGFsbCB3b3JraW5nLCBhbmQgdXBkYXRlZCBtYWtlZmlsZS5nY21teCAoR3JlZykuCi0gIENoYW5nZWQgdHlwZSBvZiAicGFyYW1zIiBmcm9tIHZvaWRwIHRvIHBuZ192b2lkcCBpbiBwbmdfcmVhZHx3cml0ZV9wbmcoKS4KLSAgTWFrZSBzdXJlIFBOR0FQSSBhbmQgUE5HX0lNUEVYUCBhcmUgZGVmaW5lZCBpbiBwbmdjb25mLmguCi0gIFJldmlzZWQgdGhlIDMgaW5zdGFuY2VzIG9mIFdSSVRFRklMRSBpbiBwbmd0ZXN0LmMuCi0gIFJlbG9jYXRlZCAibXN2YyIgYW5kICJ3aW5jZSIgcHJvamVjdCBzdWJkaXJlY3RvcmllcyBpbnRvICJkbGwiIHN1YmRpcmVjdG9yeS4KLSAgVXBkYXRlZCBwbmcucmMgaW4gZGxsL21zdmMgcHJvamVjdAotICBSZXZpc2VkIG1ha2VmaWxlLmRlYyB0byBkZWZpbmUgYW5kIHVzZSBMSUJQQVRIIGFuZCBJTkNQQVRICi0gIEluY3JlYXNlZCBzaXplIG9mIGdsb2JhbCBwbmdfbGlicG5nX3ZlcltdIGFycmF5IGZyb20gMTIgdG8gMTggY2hhcnMuCi0gIE1hZGUgZ2xvYmFsIHBuZ19saWJwbmdfdmVyW10sIHBuZ19zaWdbXSBhbmQgcG5nX3Bhc3NfKltdIGFycmF5cyBjb25zdC4KLSAgUmVtb3ZlZCBkdXBsaWNhdGUgcG5nX2NyY19maW5pc2goKSBmcm9tIHBuZ19oYW5kbGVfYktHRCgpIGZ1bmN0aW9uLgotICBBZGRlZCBhIHdhcm5pbmcgd2hlbiBhcHBsaWNhdGlvbiBjYWxscyBwbmdfcmVhZF91cGRhdGVfaW5mbygpIG11bHRpcGxlIHRpbWVzLgotICBSZXZpc2VkIG1ha2VmaWxlLmN5Z3dpbgotICBGaXhlZCBidWdzIGluIGlDQ1Agc3VwcG9ydCBpbiBwbmdydXRpbC5jIGFuZCBwbmd3dXRpbC5jLgotICBSZXBsYWNlZCBwbmdfc2V0X2VtcHR5X3BsdGVfcGVybWl0dGVkKCkgd2l0aCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcygpLgotdmVyc2lvbiAxLjAuOWJldGEyIFtOb3ZlbWJlciAxOSwgMjAwMF0KLSAgUmVuYW1lZCB0aGUgImRsbCIgc3ViZGlyZWN0b3J5ICJwcm9qZWN0cyIuCi0gIEFkZGVkIGJvcmxhbmQgcHJvamVjdCBmaWxlcyB0byAicHJvamVjdHMiIHN1YmRpcmVjdG9yeS4KLSAgU2V0IFZTX0ZGX1BSRVJFTEVBU0UgYW5kIFZTX0ZGX1BBVENIRUQgZmxhZ3MgaW4gbXN2Yy9wbmcucmMgd2hlbiBhcHByb3ByaWF0ZS4KLSAgQWRkIGVycm9yIG1lc3NhZ2UgaW4gcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSgpIHdoZW4gbWFsbG9jIGZhaWxzLgotdmVyc2lvbiAxLjAuOWJldGEzIFtOb3ZlbWJlciAyMywgMjAwMF0KLSAgUmV2aXNlZCBQTkdfTElCUE5HX0JVSUxEX1RZUEUgbWFjcm8gaW4gcG5nLmgsIHVzZWQgaW4gdGhlIG1zdmMgcHJvamVjdC4KLSAgUmVtb3ZlZCB0aGUgcG5nX2ZsdXNoKCkgaW4gcG5nd3JpdGUuYyB0aGF0IGNyYXNoZXMgc29tZSBhcHBsaWNhdGlvbnMKLSAgICB0aGF0IGRvbid0IHNldCBwbmdfb3V0cHV0X2ZsdXNoX2ZuLgotICBBZGRlZCBtYWtlZmlsZS5tYWNvc3ggYW5kIG1ha2VmaWxlLmFpeCB0byBzY3JpcHRzIGRpcmVjdG9yeS4KLXZlcnNpb24gMS4wLjliZXRhNCBbRGVjZW1iZXIgMSwgMjAwMF0KLSAgQ2hhbmdlIHBuZ19jaHVua193YXJuaW5nIHRvIHBuZ193YXJuaW5nIGluIHBuZ19jaGVja19rZXl3b3JkKCkuCi0gIEluY3JlYXNlZCB0aGUgZmlyc3QgcGFydCBvZiBtc2cgYnVmZmVyIGZyb20gMTYgdG8gMTggaW4gcG5nX2NodW5rX2Vycm9yKCkuCi12ZXJzaW9uIDEuMC45YmV0YTUgW0RlY2VtYmVyIDE1LCAyMDAwXQotICBBZGRlZCBzdXBwb3J0IGZvciBmaWx0ZXIgbWV0aG9kIDY0IChmb3IgUE5HIGRhdGFzdHJlYW1zIGVtYmVkZGVkIGluIE1ORykuCi12ZXJzaW9uIDEuMC45YmV0YTYgW0RlY2VtYmVyIDE4LCAyMDAwXQotICBSZXZpc2VkIHBuZ19zZXRfZmlsdGVyKCkgdG8gYWNjZXB0IGZpbHRlciBtZXRob2QgNjQgd2hlbiBhcHByb3ByaWF0ZS4KLSAgQWRkZWQgbmV3IFBOR19IQVZFX1BOR19TSUdOQVRVUkUgYml0IHRvIHBuZ19wdHItPm1vZGUgYW5kIHVzZSBpdCB0bwotICAgIGhlbHAgcHJldmVudCBhcHBsaWNhdGlvbnMgZnJvbSB1c2luZyBNTkcgZmVhdHVyZXMgaW4gUE5HIGRhdGFzdHJlYW1zLgotICBBZGRlZCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcygpIGZ1bmN0aW9uLgotICBSZXZpc2VkIGxpYnBuZy4zL2xpYnBuZy50eHQuICBDaGFuZ2VkICJmaWx0ZXIgdHlwZSIgdG8gImZpbHRlciBtZXRob2QiLgotdmVyc2lvbiAxLjAuOXJjMSBbRGVjZW1iZXIgMjMsIDIwMDBdCi0gIFJldmlzZWQgdGVzdCBmb3IgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSBpbiBwbmdydXRpbC5jCi0gIEZpeGVkIGVycm9yIGhhbmRsaW5nIG9mIHVua25vd24gY29tcHJlc3Npb24gdHlwZSBpbiBwbmdfZGVjb21wcmVzc19jaHVuaygpLgotICBJbiBwbmdjb25mLmgsIGRlZmluZSBfX2NkZWNsIHdoZW4gX01TQ19WRVIgaXMgZGVmaW5lZC4KLXZlcnNpb24gMS4wLjliZXRhNyBbRGVjZW1iZXIgMjgsIDIwMDBdCi0gIENoYW5nZWQgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdCB0byBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIHNldmVyYWwgcGxhY2VzLgotICBSZXZpc2VkIG1lbW9yeSBtYW5hZ2VtZW50IGluIHBuZ19zZXRfaElTVCBhbmQgcG5nX2hhbmRsZV9oSVNUIGluIGEgYmFja3dhcmQKLSAgICBjb21wYXRpYmxlIG1hbm5lci4gIFBMVEUgYW5kIHRSTlMgd2VyZSByZXZpc2VkIHNpbWlsYXJseS4KLSAgUmV2aXNlZCB0aGUgaUNDUCBjaHVuayByZWFkZXIgdG8gaWdub3JlIHRyYWlsaW5nIGdhcmJhZ2UuCi12ZXJzaW9uIDEuMC45YmV0YTggW0phbnVhcnkgMTIsIDIwMDFdCi0gIE1vdmVkIHBuZ2FzbXJkLmggaW50byBwbmdjb25mLmguCi0gIEltcHJvdmVkIGhhbmRsaW5nIG9mIG91dC1vZi1zcGVjIGdhcmJhZ2UgaUNDUCBjaHVua3MgZ2VuZXJhdGVkIGJ5IFBob3RvU2hvcC4KLXZlcnNpb24gMS4wLjliZXRhOSBbSmFudWFyeSAxNSwgMjAwMV0KLSAgQWRkZWQgcG5nX3NldF9pbnZhbGlkLCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcywgYW5kIHBuZ19tbXhfc3VwcG9ydGVkIHRvCi0gICAgd2luY2UgYW5kIG1zdmMgcHJvamVjdCBtb2R1bGUgZGVmaW5pdGlvbiBmaWxlcy4KLSAgTWlub3IgcmV2aXNpb24gb2YgbWFrZWZpbGUuY3lnd2luLgotICBGaXhlZCBidWcgd2l0aCBwcm9ncmVzc2l2ZSByZWFkaW5nIG9mIG5hcnJvdyBpbnRlcmxhY2VkIGltYWdlcyBpbiBwbmdwcmVhZC5jCi12ZXJzaW9uIDEuMC45YmV0YTEwIFtKYW51YXJ5IDE2LCAyMDAxXQotICBEbyBub3QgdHlwZWRlZiBwbmdfRklMRV9wIGluIHBuZ2NvbmYuaCB3aGVuIFBOR19OT19TVERJTyBpcyBkZWZpbmVkLgotICBGaXhlZCAicG5nX21teF9zdXBwb3J0ZWQiIHR5cG8gaW4gcHJvamVjdCBkZWZpbml0aW9uIGZpbGVzLgotdmVyc2lvbiAxLjAuOWJldGExMSBbSmFudWFyeSAxOSwgMjAwMV0KLSAgVXBkYXRlZCBtYWtlZmlsZS5zZ2kgdG8gbWFrZSBzaGFyZWQgbGlicmFyeS4KLSAgUmVtb3ZlZCBwbmdfbW14X3N1cHBvcnQoKSBmdW5jdGlvbiBhbmQgZGlzYWJsZWQgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKLSAgICBieSBkZWZhdWx0LCBmb3IgdGhlIGJlbmVmaXQgb2YgRExMIGZvcndhcmQgY29tcGF0aWJpbGl0eS4gIFRoZXNlIHdpbGwKLSAgICBiZSByZS1lbmFibGVkIGluIHZlcnNpb24gMS4yLjAuCi12ZXJzaW9uIDEuMC45cmMyIFtKYW51YXJ5IDIyLCAyMDAxXQotICBSZXZpc2VkIGN5Z3dpbiBzdXBwb3J0LgotCi12ZXJzaW9uIDEuMC45IFtKYW51YXJ5IDMxLCAyMDAxXQotICBBZGRlZCBjaGVjayBvZiBjeWd3aW4ncyBBTExfU1RBVElDIGluIHBuZ2NvbmYuaAotICBBZGRlZCAiLW5vbW14IiBwYXJhbWV0ZXIgdG8gY29udHJpYi9ncmVnYm9vay9ycG5nMi13aW4gYW5kIHJwbmcyLXggZGVtb3MuCi12ZXJzaW9uIDEuMC4xMGJldGExIFtNYXJjaCAxNCwgMjAwMV0KLSAgUmV2aXNlZCBtYWtlZmlsZS5kZWMsIG1ha2VmaWxlLnNnaSwgYW5kIG1ha2VmaWxlLnNnZ2NjOyBhZGRlZCBtYWtlZmlsZS5ocGdjYy4KLSAgUmVmb3JtYXR0ZWQgbGlicG5nLjMgdG8gZWxpbWluYXRlIGJhZCBsaW5lIGJyZWFrcy4KLSAgQWRkZWQgY2hlY2tzIGZvciBfbW14X3N1cHBvcnRlZCBpbiB0aGUgcmVhZF9maWx0ZXJfcm93IGZ1bmN0aW9uIG9mIHBuZ2djY3JkLmMKLSAgQWRkZWQgcHJvdG90eXBlIGZvciBwbmdfbW14X3N1cHBvcnQoKSBuZWFyIHRoZSB0b3Agb2YgcG5nZ2NjcmQuYwotICBNb3ZlZCBzb21lIGVycm9yIGNoZWNraW5nIGZyb20gcG5nX2hhbmRsZV9JSERSIHRvIHBuZ19zZXRfSUhEUi4KLSAgQWRkZWQgUE5HX05PX1JFQURfU1VQUE9SVEVEIGFuZCBQTkdfTk9fV1JJVEVfU1VQUE9SVEVEIG1hY3Jvcy4KLSAgUmV2aXNlZCBwbmdfbW14X3N1cHBvcnQoKSBmdW5jdGlvbiBpbiBwbmdnY2NyZC5jCi0gIFJlc3RvcmVkIHZlcnNpb24gMS4wLjggUE5HX1dSSVRFX0VNUFRZX1BMVEVfU1VQUE9SVEVEIGJlaGF2aW9yIGluIHBuZ3d1dGlsLmMKLSAgRml4ZWQgbWVtb3J5IGxlYWsgaW4gY29udHJpYi92aXN1cG5nL1BuZ0ZpbGUuYwotICBGaXhlZCBidWdzIGluIHBuZ19jb21iaW5lX3JvdygpIGluIHBuZ2djY3JkLmMgYW5kIHBuZ3ZjcmQuYyAoQyB2ZXJzaW9uKQotICBBZGRlZCB3YXJuaW5ncyB3aGVuIHJldHJpZXZpbmcgb3Igc2V0dGluZyBnYW1tYT0wLgotICBJbmNyZWFzZWQgdGhlIGZpcnN0IHBhcnQgb2YgbXNnIGJ1ZmZlciBmcm9tIDE2IHRvIDE4IGluIHBuZ19jaHVua193YXJuaW5nKCkuCi12ZXJzaW9uIDEuMC4xMHJjMSBbTWFyY2ggMjMsIDIwMDFdCi0gIENoYW5nZWQgYWxsIGluc3RhbmNlcyBvZiBtZW1jcHksIHN0cmNweSwgYW5kIHN0cmxlbiB0byBwbmdfbWVtY3B5LCBwbmdfc3RyY3B5LAotICAgIGFuZCBwbmdfc3RybGVuLgotICBSZXZpc2VkIHBuZ19tbXhfc3VwcG9ydGVkKCkgZnVuY3Rpb24gaW4gcG5nZ2NjcmQuYyB0byByZXR1cm4gcHJvcGVyIHZhbHVlLgotICBGaXhlZCBidWcgaW4gcHJvZ3Jlc3NpdmUgcmVhZGluZyAocG5ncHJlYWQuYykgd2l0aCBzbWFsbCBpbWFnZXMgKGhlaWdodCA8IDgpLgotCi12ZXJzaW9uIDEuMC4xMCBbTWFyY2ggMzAsIDIwMDFdCi0gIERlbGV0ZWQgZXh0cmFuZW91cyBzcGFjZSAoaW50cm9kdWNlZCBpbiAxLjAuOSkgZnJvbSBsaW5lIDQyIG9mIG1ha2VmaWxlLmN5Z3dpbgotICBBZGRlZCBiZW9zIHByb2plY3QgZmlsZXMgKENocmlzIEhlcmJvcnRoKQotdmVyc2lvbiAxLjAuMTFiZXRhMSBbQXByaWwgMywgMjAwMV0KLSAgQWRkZWQgdHlwZSBjYXN0cyBvbiBzZXZlcmFsIHBuZ19tYWxsb2MoKSBjYWxscyAoRGltaXRyaSBQYXBhZGFwb3Vsb3MpLgotICBSZW1vdmVkIGEgbm8tbG9uZ2VyIG5lZWRlZCBBSVggd29yay1hcm91bmQgZnJvbSBwbmdjb25mLmgKLSAgQ2hhbmdlZCBzZXZlcmFsICIvLyIgc2luZ2xlLWxpbmUgY29tbWVudHMgdG8gQy1zdHlsZSBpbiBwbmdnY2NyZC5jCi12ZXJzaW9uIDEuMC4xMWJldGEyIFtBcHJpbCAxMSwgMjAwMV0KLSAgUmVtb3ZlZCBQTkdBUEkgZnJvbSBzZXZlcmFsIGZ1bmN0aW9ucyB3aG9zZSBwcm90b3R5cGVzIGRpZCBub3QgaGF2ZSBQTkdBUEkuCi0gIFVwZGF0ZWQgc2NyaXB0cy9wbmdvczIuZGVmCi12ZXJzaW9uIDEuMC4xMWJldGEzIFtBcHJpbCAxNCwgMjAwMV0KLSAgQWRkZWQgY2hlY2tpbmcgdGhlIHJlc3VsdHMgb2YgbWFueSBpbnN0YW5jZXMgb2YgcG5nX21hbGxvYygpIGZvciBOVUxMCi12ZXJzaW9uIDEuMC4xMWJldGE0IFtBcHJpbCAyMCwgMjAwMV0KLSAgVW5kaWQgdGhlIGNoYW5nZXMgZnJvbSB2ZXJzaW9uIDEuMC4xMWJldGEzLiAgQWRkZWQgYSBjaGVjayBmb3IgTlVMTCByZXR1cm4KLSAgICBmcm9tIHVzZXIncyBtYWxsb2NfZm4oKS4KLSAgUmVtb3ZlZCBzb21lIHVzZWxlc3MgdHlwZSBjYXN0cyBvZiB0aGUgTlVMTCBwb2ludGVyLgotICBBZGRlZCBtYWtlZmlsZS5uZXRic2QKLQotdmVyc2lvbiAxLjAuMTEgW0FwcmlsIDI3LCAyMDAxXQotICBSZXZpc2VkIG1ha2VmaWxlLm5ldGJzZAotdmVyc2lvbiAxLjAuMTJiZXRhMSBbTWF5IDE0LCAyMDAxXQotICBUZXN0IGZvciBXaW5kb3dzIHBsYXRmb3JtIGluIHBuZ2NvbmYuaCB3aGVuIGluY2x1ZGluZyBtYWxsb2MuaCAoRW1tYW51ZWwgQmxvdCkKLSAgVXBkYXRlZCBtYWtlZmlsZS5jeWd3aW4gYW5kIGhhbmRsaW5nIG9mIEN5Z3dpbidzIEFMTF9TVEFUSUMgaW4gcG5nY29uZi5oCi0gIEFkZGVkIHNvbWUgbmV2ZXItdG8tYmUtZXhlY3V0ZWQgY29kZSBpbiBwbmdnY2NyZC5jIHRvIHF1aWV0IGNvbXBpbGVyIHdhcm5pbmdzLgotICBFbGltaW5hdGVkIHRoZSBwbmdfZXJyb3IgYWJvdXQgYXBwcyB1c2luZyBwbmdfcmVhZHx3cml0ZV9pbml0KCkuICBJbnN0ZWFkLAotICAgIGxpYnBuZyB3aWxsIHJlYWxsb2NhdGUgdGhlIHBuZ19zdHJ1Y3QgYW5kIGluZm9fc3RydWN0IGlmIHRoZXkgYXJlIHRvbyBzbWFsbC4KLSAgICBUaGlzIHJldGFpbnMgZnV0dXJlIGJpbmFyeSBjb21wYXRpYmlsaXR5IGZvciBvbGQgYXBwbGljYXRpb25zIHdyaXR0ZW4gZm9yCi0gICAgbGlicG5nLTAuODggYW5kIGVhcmxpZXIuCi12ZXJzaW9uIDEuMi4wYmV0YTEgW01heSA2LCAyMDAxXQotICBCdW1wZWQgRExMTlVNIHRvIDIuCi0gIFJlLWVuYWJsZWQgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQgYW5kIGVuYWJsZWQgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRAotICAgIGJ5IGRlZmF1bHQuCi0gIEFkZGVkIHJ1bnRpbWUgc2VsZWN0aW9uIG9mIE1NWCBmZWF0dXJlcy4KLSAgQWRkZWQgcG5nX3NldF9zdHJpcF9lcnJvcl9udW1iZXJzIGZ1bmN0aW9uIGFuZCByZWxhdGVkIG1hY3Jvcy4KLXZlcnNpb24gMS4yLjBiZXRhMiBbTWF5IDcsIDIwMDFdCi0gIEZpbmlzaGVkIG1lcmdpbmcgMS4yLjBiZXRhMSB3aXRoIHZlcnNpb24gMS4wLjExCi0gIEFkZGVkIGEgY2hlY2sgZm9yIGF0dGVtcHRzIHRvIHJlYWQgb3Igd3JpdGUgUExURSBpbiBncmF5c2NhbGUgUE5HIGRhdGFzdHJlYW1zLgotdmVyc2lvbiAxLjIuMGJldGEzIFtNYXkgMTcsIDIwMDFdCi0gIEVuYWJsZWQgdXNlciBtZW1vcnkgZnVuY3Rpb24gYnkgZGVmYXVsdC4KLSAgTW9kaWZpZWQgcG5nX2NyZWF0ZV9zdHJ1Y3Qgc28gaXQgcGFzc2VzIHVzZXIgbWVtX3B0ciB0byB1c2VyIG1lbW9yeSBhbGxvY2F0b3IuCi0gIEluY3JlYXNlZCBwbmdfbW5nX2ZlYXR1cmVzIGZsYWcgZnJvbSBwbmdfYnl0ZSB0byBwbmdfdWludF8zMi4KLSAgQnVtcGVkIHNoYXJlZC1saWJyYXJ5IChzby1udW1iZXIpIGFuZCBkbGwtbnVtYmVyIHRvIDMuCi12ZXJzaW9uIDEuMi4wYmV0YTQgW0p1bmUgMjMsIDIwMDFdCi0gIENoZWNrIGZvciBtaXNzaW5nIHByb2ZpbGUgbGVuZ3RoIGZpZWxkIGluIGlDQ1AgY2h1bmsgYW5kIGZyZWUgY2h1bmtfZGF0YQotICAgICBpbiBjYXNlIG9mIHRydW5jYXRlZCBpQ0NQIGNodW5rLgotICBCdW1wZWQgc2hhcmVkLWxpYnJhcnkgbnVtYmVyIHRvIDMgaW4gbWFrZWZpbGUuc2dpIGFuZCBtYWtlZmlsZS5zZ2djYwotICBCdW1wZWQgZGxsLW51bWJlciBmcm9tIDIgdG8gMyBpbiBtYWtlZmlsZS5jeWd3aW4KLSAgUmV2aXNlZCBjb250cmliL2dyZWdib29rL3JwbmcqLXguYyB0byBhdm9pZCBhIG1lbW9yeSBsZWFrIGFuZCB0byBleGl0IGNsZWFubHkKLSAgICAgaWYgdXNlciBhdHRlbXB0cyB0byBydW4gaXQgb24gYW4gOC1iaXQgZGlzcGxheS4KLSAgVXBkYXRlZCBjb250cmliL2dyZWdib29rCi0gIFVzZSBwbmdfbWFsbG9jIGluc3RlYWQgb2YgcG5nX3phbGxvYyB0byBhbGxvY2F0ZSBwYWxldHRlIGluIHBuZ3NldC5jCi0gIFVwZGF0ZWQgbWFrZWZpbGUuaWJtYwotICBBZGRlZCBzb21lIHR5cGVjYXN0cyB0byBlbGltaW5hdGUgZ2NjIDMuMCB3YXJuaW5ncy4gIENoYW5nZWQgcHJvdG90eXBlcwotICAgICBvZiBwbmdfd3JpdGVfb0ZGUyB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gcG5nX3VpbnRfMzIgdG8gcG5nX2ludF8zMi4KLSAgVXBkYXRlZCBleGFtcGxlLmMKLSAgUmV2aXNlZCBwcm90b3R5cGVzIGZvciBwbmdfZGVidWdfbWFsbG9jIGFuZCBwbmdfZGVidWdfZnJlZSBpbiBwbmd0ZXN0LmMKLXZlcnNpb24gMS4yLjBiZXRhNSBbQXVndXN0IDgsIDIwMDFdCi0gIFJldmlzZWQgY29udHJpYi9ncmVnYm9vawotICBSZXZpc2VkIG1ha2VmaWxlLmdjbW14Ci0gIFJldmlzZWQgcG5nZ2NjcmQuYyB0byBjb25kaXRpb25hbGx5IGNvbXBpbGUgc29tZSB0aHJlYWQtdW5zYWZlIGNvZGUgb25seQotICAgICB3aGVuIFBOR19USFJFQURfVU5TQUZFX09LIGlzIGRlZmluZWQuCi0gIEFkZGVkIHRlc3RzIHRvIHByZXZlbnQgcG5nd3V0aWwuYyBmcm9tIHdyaXRpbmcgYSBiS0dEIG9yIHRSTlMgY2h1bmsgd2l0aAotICAgICB2YWx1ZSBleGNlZWRpbmcgMl5iaXRfZGVwdGgtMQotICBSZXZpc2VkIG1ha2VmaWxlLnNnaSBhbmQgbWFrZWZpbGUuc2dnY2MKLSAgUmVwbGFjZWQgY2FsbHMgdG8gZnByaW50ZihzdGRlcnIsLi4uKSB3aXRoIHBuZ193YXJuaW5nKCkgaW4gcG5nZ2NjcmQuYwotICBSZW1vdmVkIHJlc3RyaWN0aW9uIHRoYXQgZG9faW52ZXJ0X21vbm8gb25seSBvcGVyYXRlIG9uIDEtYml0IG9wYXF1ZSBmaWxlcwotCi12ZXJzaW9uIDEuMi4wIFtTZXB0ZW1iZXIgMSwgMjAwMV0KLSAgQ2hhbmdlZCBhIHBuZ193YXJuaW5nKCkgdG8gcG5nX2RlYnVnKCkgaW4gcG5nZ2NjcmQuYwotICBGaXhlZCBjb250cmliL2dyZWdib29rL3JwbmcteC5jLCBycG5nMi14LmMgdG8gYXZvaWQgY3Jhc2ggd2l0aCBYRnJlZUdDKCkuCi12ZXJzaW9uIDEuMi4xYmV0YTEgW09jdG9iZXIgMTksIDIwMDFdCi0gIFJldmlzZWQgbWFrZWZpbGUuc3RkIGluIGNvbnRyaWIvcG5nbWludXMKLSAgSW5jbHVkZSBiYWNrZ3JvdW5kXzEgaW4gcG5nX3N0cnVjdCByZWdhcmRsZXNzIG9mIGdhbW1hIHN1cHBvcnQuCi0gIFJldmlzZWQgbWFrZWZpbGUubmV0YnNkIGFuZCBtYWtlZmlsZS5tYWNvc3gsIGFkZGVkIG1ha2VmaWxlLmRhcndpbi4KLSAgUmV2aXNlZCBleGFtcGxlLmMgdG8gcHJvdmlkZSBtb3JlIGRldGFpbHMgYWJvdXQgdXNpbmcgcm93X2NhbGxiYWNrKCkuCi12ZXJzaW9uIDEuMi4xYmV0YTIgW09jdG9iZXIgMjUsIDIwMDFdCi0gIEFkZGVkIHR5cGUgY2FzdCB0byBlYWNoIE5VTEwgYXBwZWFyaW5nIGluIGEgZnVuY3Rpb24gY2FsbCwgZXhjZXB0IGZvcgotICAgIFdJTkNFIGZ1bmN0aW9ucy4KLSAgQWRkZWQgbWFrZWZpbGUuc285LgotdmVyc2lvbiAxLjIuMWJldGEzIFtPY3RvYmVyIDI3LCAyMDAxXQotICBSZW1vdmVkIHR5cGUgY2FzdHMgZnJvbSBhbGwgTlVMTHMuCi0gIFNpbXBsaWZpZWQgcG5nX2NyZWF0ZV9zdHJ1Y3RfMigpLgotdmVyc2lvbiAxLjIuMWJldGE0IFtOb3ZlbWJlciA3LCAyMDAxXQotICBSZXZpc2VkIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKSBhbmQgcG5nX2NyZWF0X3N0cnVjdF8yKCkuCi0gIEFkZGVkIGVycm9yIG1lc3NhZ2UgaWYgcG5nX3dyaXRlX2luZm8oKSB3YXMgb21pdHRlZC4KLSAgVHlwZSBjYXN0IE5VTExzIGFwcGVhcmluZyBpbiBmdW5jdGlvbiBjYWxscyB3aGVuIF9OT19QUk9UTyBvcgotICAgIFBOR19UWVBFQ0FTVF9OVUxMIGlzIGRlZmluZWQuCi12ZXJzaW9uIDEuMi4xcmMxIFtOb3ZlbWJlciAyNCwgMjAwMV0KLSAgVHlwZSBjYXN0IE5VTExzIGFwcGVhcmluZyBpbiBmdW5jdGlvbiBjYWxscyBleGNlcHQgd2hlbiBQTkdfTk9fVFlQRUNBU1RfTlVMTAotICAgIGlzIGRlZmluZWQuCi0gIENoYW5nZWQgdHlwZWNhc3Qgb2YgInNpemUiIGFyZ3VtZW50IHRvIHBuZ19zaXplX3QgaW4gcG5nbWVtLmMgY2FsbHMgdG8KLSAgICB0aGUgdXNlciBtYWxsb2NfZm4sIHRvIGFncmVlIHdpdGggdGhlIHByb3RvdHlwZSBpbiBwbmcuaAotICBBZGRlZCBhIHBvcC9wdXNoIG9wZXJhdGlvbiB0byBwbmdnY2NyZC5jLCB0byBwcmVzZXJ2ZSBFZmxhZyAoTWF4aW0gU29ib2xldikKLSAgVXBkYXRlZCBtYWtlZmlsZS5zZ2kgdG8gcmVjb2duaXplIExJQlBBVEggYW5kIElOQ1BBVEguCi0gIFVwZGF0ZWQgdmFyaW91cyBtYWtlZmlsZXMgc28gIm1ha2UgY2xlYW4iIGRvZXMgbm90IHJlbW92ZSBwcmV2aW91cyBtYWpvcgotICAgIHZlcnNpb24gb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgotdmVyc2lvbiAxLjIuMXJjMiBbRGVjZW1iZXIgNCwgMjAwMV0KLSAgQWx3YXlzIGFsbG9jYXRlIDI1Ni1lbnRyeSBpbnRlcm5hbCBwYWxldHRlLCBoaXN0LCBhbmQgdHJhbnMgYXJyYXlzLCB0bwotICAgIGF2b2lkIG91dC1vZi1ib3VuZHMgbWVtb3J5IHJlZmVyZW5jZSBjYXVzZWQgYnkgaW52YWxpZCBQTkcgZGF0YXN0cmVhbXMuCi0gIEFkZGVkIGEgY2hlY2sgZm9yIHByZWZpeF9sZW5ndGggPiBkYXRhX2xlbmd0aCBpbiBpQ0NQIGNodW5rIGhhbmRsZXIuCi0KLXZlcnNpb24gMS4yLjEgW0RlY2VtYmVyIDcsIDIwMDFdCi0gIE5vbmUuCi12ZXJzaW9uIDEuMi4yYmV0YTEgW0ZlYnJ1YXJ5IDIyLCAyMDAyXQotICBGaXhlZCBhIGJ1ZyB3aXRoIHJlYWRpbmcgdGhlIGxlbmd0aCBvZiBpQ0NQIHByb2ZpbGVzIChMYXJyeSBSZWV2ZXMpLgotICBSZXZpc2VkIG1ha2VmaWxlLmxpbnV4LCBtYWtlZmlsZS5nY21teCwgYW5kIG1ha2VmaWxlLnNnaSB0byBnZW5lcmF0ZQotICAgIGxpYnBuZy5hLCBsaWJwbmcxMi5zbyAobm90IGxpYnBuZy5zby4zKSwgYW5kIGxpYnBuZzEyL3BuZy5oCi0gIFJldmlzZWQgbWFrZWZpbGUuZGFyd2luIHRvIHJlbW92ZSAiLXVuZGVmaW5lZCBzdXBwcmVzcyIgb3B0aW9uLgotICBBZGRlZCBjaGVja3MgZm9yIGdhbW1hIGFuZCBjaHJvbWF0aWNpdHkgdmFsdWVzIG92ZXIgMjE0NzQuODMsIHdoaWNoIGV4Y2VlZAotICAgIHRoZSBsaW1pdCBmb3IgUE5HIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VycyB3aGVuIGVuY29kZWQuCi0gIFJldmlzZWQgY2FsbHMgdG8gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpIGFuZCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpCi0gICAgZm9yIHNpbXBsZXIgZGVidWdnaW5nLgotICBSZXZpc2VkIHBuZ196YWxsb2MoKSBzbyB6bGliIGhhbmRsZXMgZXJyb3JzICh1c2VzIFBOR19GTEFHX01BTExPQ19OVUxMX01FTV9PSykKLXZlcnNpb24gMS4yLjJiZXRhMiBbRmVicnVhcnkgMjMsIDIwMDJdCi0gIENoZWNrIGNodW5rX2xlbmd0aCBhbmQgaWRhdF9zaXplIGZvciBpbnZhbGlkIChvdmVyIFBOR19NQVhfVUlOVCkgbGVuZ3Rocy4KLSAgQ2hlY2sgZm9yIGludmFsaWQgaW1hZ2UgZGltZW5zaW9ucyBpbiBwbmdfZ2V0X0lIRFIuCi0gIEFkZGVkIG1pc3NpbmcgImZpOyIgaW4gdGhlIGluc3RhbGwgdGFyZ2V0IG9mIHRoZSBTR0kgbWFrZWZpbGVzLgotICBBZGRlZCBpbnN0YWxsLXN0YXRpYyB0byBhbGwgbWFrZWZpbGVzIHRoYXQgbWFrZSBzaGFyZWQgbGlicmFyaWVzLgotICBBbHdheXMgZG8gZ2FtbWEgY29tcGVuc2F0aW9uIHdoZW4gaW1hZ2UgaXMgcGFydGlhbGx5IHRyYW5zcGFyZW50LgotdmVyc2lvbiAxLjIuMmJldGEzIFtNYXJjaCA3LCAyMDAyXQotICBDb21wdXRlIGJhY2tncm91bmQuZ3JheSBhbmQgYmFja2dyb3VuZF8xLmdyYXkgZXZlbiB3aGVuIGNvbG9yX3R5cGUgaXMgUkdCCi0gICAgaW4gY2FzZSBpbWFnZSBnZXRzIHJlZHVjZWQgdG8gZ3JheSBsYXRlci4KLSAgTW9kaWZpZWQgc2hhcmVkLWxpYnJhcnkgbWFrZWZpbGVzIHRvIGluc3RhbGwgcGtnY29uZmlnL2xpYnBuZ05OLnBjLgotICBFeHBvcnQgKHdpdGggUE5HQVBJKSBwbmdfemFsbG9jLCBwbmdfemZyZWUsIGFuZCBwbmdfaGFuZGxlX2FzX3Vua25vd24KLSAgUmVtb3ZlZCB1bnVzZWQgcG5nX3dyaXRlX2Rlc3Ryb3lfaW5mbyBwcm90b3R5cGUgZnJvbSBwbmcuaAotICBFbGltaW5hdGVkIGluY29ycmVjdCB1c2Ugb2Ygd2lkdGhfbW14IGZyb20gcG5nZ2NjcmQuYyBpbiBwaXhlbF9ieXRlcyA9PSA4IGNhc2UKLSAgQWRkZWQgaW5zdGFsbC1zaGFyZWQgdGFyZ2V0IHRvIGFsbCBtYWtlZmlsZXMgdGhhdCBtYWtlIHNoYXJlZCBsaWJyYXJpZXMuCi0gIFN0b3BwZWQgYSBkb3VibGUgZnJlZSBvZiBwYWxldHRlLCBoaXN0LCBhbmQgdHJhbnMgd2hlbiBub3QgdXNpbmcgZnJlZV9tZS4KLSAgQWRkZWQgbWFrZWZpbGUuMzJzdW51IGZvciBTdW4gVWx0cmEgMzIgYW5kIG1ha2VmaWxlLjY0c3VudSBmb3IgU3VuIFVsdHJhIDY0LgotdmVyc2lvbiAxLjIuMmJldGE0IFtNYXJjaCA4LCAyMDAyXQotICBDb21wdXRlIGJhY2tncm91bmQuZ3JheSBhbmQgYmFja2dyb3VuZF8xLmdyYXkgZXZlbiB3aGVuIGNvbG9yX3R5cGUgaXMgUkdCCi0gICAgaW4gY2FzZSBpbWFnZSBnZXRzIHJlZHVjZWQgdG8gZ3JheSBsYXRlciAoSmFzb24gU3VtbWVycykuCi0gIFJlbG9jYXRlZCBhIG1pc3BsYWNlZCAvYmluL3JtIGluIHRoZSAiaW5zdGFsbC1zaGFyZWQiIG1ha2VmaWxlIHRhcmdldHMKLSAgQWRkZWQgUE5HXzFfMF9YIG1hY3JvIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgMS4wLngtY29tcGF0aWJsZSBsaWJyYXJ5LgotdmVyc2lvbiAxLjIuMmJldGE1IFtNYXJjaCAyNiwgMjAwMl0KLSAgQWRkZWQgbWlzc2luZyBQTkdBUEkgdG8gc2V2ZXJhbCBmdW5jdGlvbiBkZWZpbml0aW9ucy4KLSAgQ2hlY2sgZm9yIGludmFsaWQgYml0X2RlcHRoIG9yIGNvbG9yX3R5cGUgaW4gcG5nX2dldF9JSERSKCksIGFuZAotICAgIGNoZWNrIGZvciBtaXNzaW5nIFBMVEUgb3IgSUhEUiBpbiBwbmdfcHVzaF9yZWFkX2NodW5rKCkgKE1hdHRoaWFzIENsYXNlbikuCi0gIFJldmlzZWQgaVRYdCBzdXBwb3J0IHRvIGFjY2VwdCBOVUxMIGZvciBsYW5nIGFuZCBsYW5nX2tleS4KLSAgQ29tcHV0ZSBnYW1tYSBmb3IgY29sb3IgY29tcG9uZW50cyBvZiBiYWNrZ3JvdW5kIGV2ZW4gd2hlbiBjb2xvcl90eXBlIGlzIGdyYXkuCi0gIENoYW5nZWQgIigpIiB0byAie30iIGluIHNjcmlwdHMvbGlicG5nLnBjLmluLgotICBSZXZpc2VkIG1ha2VmaWxlcyB0byBwdXQgcG5nLmggYW5kIHBuZ2NvbmYuaCBvbmx5IGluICRwcmVmaXgvaW5jbHVkZS9saWJwbmdOTgotICBSZXZpc2VkIG1ha2VmaWxlcyB0byBtYWtlIHN5bWxpbmsgdG8gbGlicG5nLnNvLk5OIGluIGFkZGl0aW9uIHRvIGxpYnBuZ05OLnNvCi12ZXJzaW9uIDEuMi4yYmV0YTYgW01hcmNoIDMxLCAyMDAyXQotdmVyc2lvbiAxLjAuMTNiZXRhMSBbTWFyY2ggMzEsIDIwMDJdCi0gIFByZXZlbnQgcG5nX3phbGxvYygpIGZyb20gdHJ5aW5nIHRvIG1lbXNldCBtZW1vcnkgdGhhdCBpdCBmYWlsZWQgdG8gYWNxdWlyZS4KLSAgQWRkIHR5cGVjYXN0cyBvZiBQTkdfTUFYX1VJTlQgaW4gcG5nc2V0X2NIUk1fZml4ZWQoKSAoTWF0dCBIb2xnYXRlKS4KLSAgRW5zdXJlIHRoYXQgdGhlIHJpZ2h0IGZ1bmN0aW9uICh1c2VyIG9yIGRlZmF1bHQpIGlzIHVzZWQgdG8gZnJlZSB0aGUKLSAgICBwbmdfc3RydWN0IGFmdGVyIGFuIGVycm9yIGluIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMigpLgotdmVyc2lvbiAxLjIuMnJjMSBbQXByaWwgNywgMjAwMl0KLXZlcnNpb24gMS4wLjEzcmMxIFtBcHJpbCA3LCAyMDAyXQotICBTYXZlIHRoZSBlYnggcmVnaXN0ZXIgaW4gcG5nZ2NjcmQuYyAoU2FtaSBGYXJpbikKLSAgQWRkICJtZW1fcHRyID0gcG5nX3B0ci0+bWVtX3B0ciIgaW4gcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkgKFBhdWwgR2FyZG5lcikuCi0gIFVwZGF0ZWQgbWFrZWZpbGVzIHRvIHB1dCBoZWFkZXJzIGluIGluY2x1ZGUvbGlicG5nIGFuZCByZW1vdmUgb2xkIGluY2x1ZGUvKi5oLgotCi12ZXJzaW9uIDEuMi4yIFtBcHJpbCAxNSwgMjAwMl0KLXZlcnNpb24gMS4wLjEzIFtBcHJpbCAxNSwgMjAwMl0KLSAgUmV2aXNlZCBkZXNjcmlwdGlvbiBvZiBwbmdfc2V0X2ZpbHRlcigpIGluIGxpYnBuZy4zL2xpYnBuZy50eHQuCi0gIFJldmlzZWQgbWFrZWZpbGUubmV0YnNkIGFuZCBhZGRlZCBtYWtlZmlsZS5uZU5OYnNkIGFuZCBtYWtlZmlsZS5mcmVlYnNkCi12ZXJzaW9uIDEuMC4xM3BhdGNoMDEgW0FwcmlsIDE3LCAyMDAyXQotdmVyc2lvbiAxLjIuMnBhdGNoMDEgW0FwcmlsIDE3LCAyMDAyXQotICBDaGFuZ2VkICR7UE5HTUFKfS4ke1BOR1ZFUn0gYnVnIHRvICR7UE5HVkVSfSBpbiBtYWtlZmlsZS5zZ2kgYW5kIG1ha2VmaWxlLnNnZ2NjCi0gIEZpeGVkIFZFUiAtPiBQTkdWRVIgdHlwbyBpbiBtYWtlZmlsZS5tYWNvc3ggYW5kIGFkZGVkIGluc3RhbGwtc3RhdGljIHRvIGluc3RhbGwKLSAgQWRkZWQgaW5zdGFsbDogdGFyZ2V0IHRvIG1ha2VmaWxlLjMyc3VudSBhbmQgbWFrZWZpbGUuNjRzdW51Ci12ZXJzaW9uIDEuMC4xM3BhdGNoMDMgW0FwcmlsIDE4LCAyMDAyXQotdmVyc2lvbiAxLjIuMnBhdGNoMDMgW0FwcmlsIDE4LCAyMDAyXQotICBSZXZpc2VkIDE1IG1ha2VmaWxlcyB0byBsaW5rIGxpYnBuZy5hIHRvIGxpYnBuZ05OLmEgYW5kIHRoZSBpbmNsdWRlIGxpYnBuZwotICBzdWJkaXJlY3RvcnkgdG8gbGlicG5nTk4gc3ViZGlyZWN0b3J5IHdpdGhvdXQgdGhlIGZ1bGwgcGF0aG5hbWUuCi0gIE1vdmVkIGdlbmVyYXRpb24gb2YgbGlicG5nLnBjIGZyb20gImluc3RhbGwiIHRvICJhbGwiIGluIDE1IG1ha2VmaWxlcy4KLXZlcnNpb24gMS4yLjNyYzEgW0FwcmlsIDI4LCAyMDAyXQotICBBZGRlZCBpbnN0YWxsLW1hbiB0YXJnZXQgdG8gMTUgbWFrZWZpbGVzIChEaW1pdHJpIFBhcGFkb3BvbG91cy1PcmZhbm9zKS4KLSAgQWRkZWQgJChERVNURElSKSBmZWF0dXJlIHRvIDI0IG1ha2VmaWxlcyAoVGltIE1vb25leSkKLSAgRml4ZWQgYnVnIHdpdGggJHByZWZpeCwgc2hvdWxkIGJlICQocHJlZml4KSBpbiBtYWtlZmlsZS5ocHV4LgotICBVcGRhdGVkIGN5Z3dpbi1zcGVjaWZpYyBwb3J0aW9uIG9mIHBuZ2NvbmYuaCBhbmQgcmV2aXNlZCBtYWtlZmlsZS5jeWd3aW4KLSAgQWRkZWQgYSBsaW5rIGZyb20gbGlicG5nTk4ucGMgdG8gbGlicG5nLnBjIGluIDE1IG1ha2VmaWxlcy4KLSAgQWRkZWQgbGlua3MgZnJvbSBpbmNsdWRlL2xpYnBuZ05OLyouaCB0byBpbmNsdWRlLyouaCBpbiAyNCBtYWtlZmlsZXMuCi0gIFJldmlzZWQgbWFrZWZpbGUuZGFyd2luIHRvIG1ha2UgcmVsYXRpdmUgbGlua3Mgd2l0aG91dCBmdWxsIHBhdGhuYW1lLgotICBBZGRlZCBzZXRqbXAoKSBhdCB0aGUgZW5kIG9mIHBuZ19jcmVhdGVfKl9zdHJ1Y3RfMigpIGluIGNhc2UgdXNlciBmb3JnZXRzCi0gICAgdG8gcHV0IG9uZSBpbiB0aGVpciBhcHBsaWNhdGlvbi4KLSAgUmVzdG9yZWQgcG5nX3phbGxvYygpIGFuZCBwbmdfemZyZWUoKSBwcm90b3R5cGVzIHRvIHZlcnNpb24gMS4yLjEgYW5kCi0gICAgcmVtb3ZlZCB0aGVtIGZyb20gbW9kdWxlIGRlZmluaXRpb24gZmlsZXMuCi12ZXJzaW9uIDEuMi4zcmMyIFtNYXkgMSwgMjAwMl0KLSAgRml4ZWQgYnVnIGluIHJlcG9ydGluZyBudW1iZXIgb2YgY2hhbm5lbHMgaW4gcG5nZ2V0LmMgYW5kIHBuZ3NldC5jLAotICAgIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gdmVyc2lvbiAxLjIuMmJldGE1LgotICBFeHBvcnRlZCBwbmdfemFsbG9jKCksIHBuZ196ZnJlZSgpLCBwbmdfZGVmYXVsdF9yZWFkKCksIHBuZ19kZWZhdWx0X3dyaXRlKCksCi0gICAgcG5nX2RlZmF1bHRfZmx1c2goKSwgYW5kIHBuZ19wdXNoX2ZpbGxfYnVmZmVyKCkgYW5kIGluY2x1ZGVkIHRoZW0gaW4KLSAgICBtb2R1bGUgZGVmaW5pdGlvbiBmaWxlcy4KLSAgQWRkZWQgImxpYnBuZy5wYyIgZGVwZW5kZW5jeSB0byB0aGUgImluc3RhbGwtc2hhcmVkIiB0YXJnZXQgaW4gMTUgbWFrZWZpbGVzLgotdmVyc2lvbiAxLjIuM3JjMyBbTWF5IDEsIDIwMDJdCi0gIFJldmlzZWQgcHJvdG90eXBlIGZvciBwbmdfZGVmYXVsdF9mbHVzaCgpCi0gIFJlbW92ZSBvbGQgbGlicG5nLnBjIGFuZCBsaWJwbmdOTi5wYyBiZWZvcmUgaW5zdGFsbGluZyBuZXcgb25lcy4KLXZlcnNpb24gMS4yLjNyYzQgW01heSAyLCAyMDAyXQotICBUeXBvcyBpbiAqLmRlZiBmaWxlcyAocG5nX2RlZmF1bHRfcmVhZHx3cml0ZSAtPiBwbmdfZGVmYXVsdF9yZWFkfHdyaXRlX2RhdGEpCi0gIEluIG1ha2VmaWxlcywgY2hhbmdlZCBybSBsaWJwbmcuTk4ucGMgdG8gcm0gbGlicG5nTk4ucGMKLSAgQWRkZWQgbGlicG5nLWNvbmZpZyBhbmQgbGlicG5nTk4tY29uZmlnIGFuZCBtb2RpZmllZCBtYWtlZmlsZXMgdG8gaW5zdGFsbCB0aGVtLgotICBDaGFuZ2VkICQoTUFOUEFUSCkgdG8gJChERVNURElSKSQoTUFOUEFUSCkgaW4gbWFrZWZpbGVzCi0gIEFkZGVkICJXaW4zMiBETEwgVkIiIGNvbmZpZ3VyYXRpb24gdG8gcHJvamVjdHMvbXN2Yy9saWJwbmcuZHNwCi12ZXJzaW9uIDEuMi4zcmM1IFtNYXkgMTEsIDIwMDJdCi0gIENoYW5nZWQgImVycm9yIiBhbmQgIm1lc3NhZ2UiIGluIHByb3RvdHlwZXMgdG8gImVycm9yX21lc3NhZ2UiIGFuZAotICAgICJ3YXJuaW5nX21lc3NhZ2UiIHRvIGF2b2lkIG5hbWVzcGFjZSBjb25mbGljdC4KLSAgUmV2aXNlZCAxNSBtYWtlZmlsZXMgdG8gYnVpbGQgbGlicG5nLWNvbmZpZyBmcm9tIGxpYnBuZy1jb25maWctKi5pbgotICBPbmNlIG1vcmUgcmVzdG9yZWQgcG5nX3phbGxvYyBhbmQgcG5nX3pmcmVlIHRvIHJlZ3VsYXIgbm9uZXhwb3J0ZWQgZm9ybS4KLSAgUmVzdG9yZWQgcG5nX2RlZmF1bHRfcmVhZHx3cml0ZV9kYXRhLCBwbmdfZGVmYXVsdF9mbHVzaCwgcG5nX3JlYWRfZmlsbF9idWZmZXIKLSAgICB0byBub25leHBvcnRlZCBmb3JtLCBidXQgd2l0aCBQTkdBUEksIGFuZCByZW1vdmVkIHRoZW0gZnJvbSBtb2R1bGUgZGVmIGZpbGVzLgotdmVyc2lvbiAxLjIuM3JjNiBbTWF5IDE0LCAyMDAyXQotICBSZW1vdmVkICJQTkdBUEkiIGZyb20gcG5nX3phbGxvYygpIGFuZCBwbmdfemZyZWUoKSBpbiBwbmcuYwotICBDaGFuZ2VkICJHeiIgdG8gIkdkIiBpbiBwcm9qZWN0cy9tc3ZjL2xpYnBuZy5kc3AgYW5kIHpsaWIuZHNwLgotICBSZW1vdmVkIGxlZnRvdmVyIGxpYnBuZy1jb25maWcgInNlZCIgc2NyaXB0IGZyb20gZm91ciBtYWtlZmlsZXMuCi0gIFJldmlzZWQgbGlicG5nLWNvbmZpZyBjcmVhdGluZyBzY3JpcHQgaW4gMTYgbWFrZWZpbGVzLgotCi12ZXJzaW9uIDEuMi4zIFtNYXkgMjIsIDIwMDJdCi0gIFJldmlzZWQgbGlicG5nLWNvbmZpZyB0YXJnZXQgaW4gbWFrZWZpbGUuY3lnd2luLgotICBSZW1vdmVkIGRlc2NyaXB0aW9uIG9mIHBuZ19zZXRfbWVtX2ZuKCkgZnJvbSBkb2N1bWVudGF0aW9uLgotICBSZXZpc2VkIG1ha2VmaWxlLmZyZWVic2QuCi0gIE1pbm9yIGNvc21ldGljIGNoYW5nZXMgdG8gMTUgbWFrZWZpbGVzLCBlLmcuLCAkKERJKSA9ICQoREVTVERJUikvJChJTkNESVIpLgotICBSZXZpc2VkIHByb2plY3RzL21zdmMvUkVBRE1FLnR4dAotICBDaGFuZ2VkIC1scG5nIHRvIC1scG5nTk4gaW4gTERGTEFHUyBpbiBzZXZlcmFsIG1ha2VmaWxlcy4KLXZlcnNpb24gMS4yLjRiZXRhMSBbTWF5IDI0LCAyMDAyXQotICBBZGRlZCBsaWJwbmcucGMgYW5kIGxpYnBuZy1jb25maWcgdG8gImFsbDoiIHRhcmdldCBpbiAxNiBtYWtlZmlsZXMuCi0gIEZpeGVkIGJ1ZyBpbiAxNiBtYWtlZmlsZXM6ICQoREVTVERJUikvJChMSUJQQVRIKSB0byAkKERFU1RESVIpJChMSUJQQVRIKQotICBBZGRlZCBtaXNzaW5nICJcIiBiZWZvcmUgY2xvc2luZyBkb3VibGUgcXVvdGUgaW4gbWFrZWZpbGUuZ2NtbXguCi0gIFBsdWdnZWQgdmFyaW91cyBtZW1vcnkgbGVha3M7IGFkZGVkIHBuZ19tYWxsb2Nfd2FybigpIGFuZCBwbmdfc2V0X3RleHRfMigpCi0gICAgZnVuY3Rpb25zLgotdmVyc2lvbiAxLjIuNGJldGEyIFtKdW5lIDI1LCAyMDAyXQotICBQbHVnZ2VkIG1lbW9yeSBsZWFrIG9mIHBuZ19wdHItPmN1cnJlbnRfdGV4dCAoTWF0dCBIb2xnYXRlKS4KLSAgQ2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvdyBiZWZvcmUgcmVhZGluZyBDUkMgaW4gcG5ncHJlYWQuYyAoV2Fyd2ljayBBbGxpc29uKQotICBBZGRlZCAtc29uYW1lIHRvIHRoZSBsb2FkZXIgZmxhZ3MgaW4gbWFrZWZpbGUuZGVjLCBtYWtlZmlsZS5zZ2ksIGFuZAotICAgIG1ha2VmaWxlLnNnZ2NjLgotICBBZGRlZCAidGVzdC1pbnN0YWxsZWQiIHRhcmdldCB0byBtYWtlZmlsZS5saW51eCwgbWFrZWZpbGUuZ2NtbXgsCi0gICAgbWFrZWZpbGUuc2dpLCBhbmQgbWFrZWZpbGUuc2dnY2MuCi12ZXJzaW9uIDEuMi40YmV0YTMgW0p1bmUgMjgsIDIwMDJdCi0gIFBsdWdnZWQgbWVtb3J5IGxlYWsgb2Ygcm93X2J1ZiBpbiBwbmd0ZXN0LmMgd2hlbiB0aGVyZSBpcyBhIHBuZ19lcnJvcigpLgotICBEZXRlY3QgYnVmZmVyIG92ZXJmbG93IGluIHBuZ3ByZWFkLmMgd2hlbiBJREFUIGlzIGNvcnJ1cHRlZCB3aXRoIGV4dHJhIGRhdGEuCi0gIEFkZGVkICJ0ZXN0LWluc3RhbGxlZCIgdGFyZ2V0IHRvIG1ha2VmaWxlLjMyc3VudSwgbWFrZWZpbGUuNjRzdW51LAotICAgIG1ha2VmaWxlLmJlb3MsIG1ha2VmaWxlLmRhcndpbiwgbWFrZWZpbGUuZGVjLCBtYWtlZmlsZS5tYWNvc3gsIAotICAgIG1ha2VmaWxlLnNvbGFyaXMsIG1ha2VmaWxlLmhwdXgsIG1ha2VmaWxlLmhwZ2NjLCBhbmQgbWFrZWZpbGUuc285LgotdmVyc2lvbiAxLjIuNHJjMSBhbmQgMS4wLjE0cmMxIFtKdWx5IDIsIDIwMDJdCi0gIEFkZGVkICJ0ZXN0LWluc3RhbGxlZCIgdGFyZ2V0IHRvIG1ha2VmaWxlLmN5Z3dpbiBhbmQgbWFrZWZpbGUuc2NvLgotICBSZXZpc2VkIHBuZ2djY3JkLmMgdG8gYmUgYWJsZSB0byBiYWNrIG91dCB2ZXJzaW9uIDEuMC54IHZpYSBQTkdfMV8wX1ggbWFjcm8uCi0KLXZlcnNpb24gMS4yLjQgYW5kIDEuMC4xNCBbSnVseSA4LCAyMDAyXQotICBDaGFuZ2VkIHBuZ193YXJuaW5nKCkgdG8gcG5nX2Vycm9yKCkgd2hlbiB3aWR0aCBpcyB0b28gbGFyZ2UgdG8gcHJvY2Vzcy4KLXZlcnNpb24gMS4yLjRwYXRjaDAxIFtKdWx5IDIwLCAyMDAyXQotICBSZXZpc2VkIG1ha2VmaWxlLmN5Z3dpbiB0byB1c2UgRExMIG51bWJlciAxMiBpbnN0ZWFkIG9mIDEzLgotdmVyc2lvbiAxLjIuNWJldGExIFtBdWd1c3QgNiwgMjAwMl0KLSAgQWRkZWQgY29kZSB0byBjb250cmliL2dyZWdib29rL3JlYWRwbmcyLmMgdG8gaWdub3JlIHVudXNlZCBjaHVua3MuCi0gIFJlcGxhY2VkIHRvdWNhbi5wbmcgaW4gY29udHJpYi9ncmVnYm9vayAoaXQgaGFzIGJlZW4gY29ycnVwdCBzaW5jZSAxLjAuMTEpCi0gIFJlbW92ZWQgc29tZSBzdHJheSAqLm8gZmlsZXMgZnJvbSBjb250cmliL2dyZWdib29rLgotICBDaGFuZ2VkIHBuZ19lcnJvcigpIHRvIHBuZ193YXJuaW5nKCkgYWJvdXQgIlRvbyBtdWNoIGRhdGEiIGluIHBuZ3ByZWFkLmMKLSAgICBhbmQgYWJvdXQgIkV4dHJhIGNvbXByZXNzZWQgZGF0YSIgaW4gcG5ncnV0aWwuYy4KLSAgUHJldmVudCBwbmdfcHRyLT5wYXNzIGZyb20gZXhjZWVkaW5nIDcgaW4gcG5nX3B1c2hfZmluaXNoX3JvdygpLgotICBVcGRhdGVkIG1ha2VmaWxlLmhwZ2NjCi0gIFVwZGF0ZWQgcG5nLmMgYW5kIHBuZ2djY3JkLmMgaGFuZGxpbmcgb2YgcmV0dXJuIGZyb20gcG5nX21teF9zdXBwb3J0KCkKLXZlcnNpb24gMS4yLjViZXRhMiBbQXVndXN0IDE1LCAyMDAyXQotICBPbmx5IGlzc3VlIHBuZ193YXJuaW5nKCkgYWJvdXQgIlRvbyBtdWNoIGRhdGEiIGluIHBuZ3ByZWFkLmMgd2hlbiBhdmFpbF9pbgotICAgIGlzIG5vbnplcm8uCi0gIFVwZGF0ZWQgbWFrZWZpbGVzIHRvIGluc3RhbGwgYSBzZXBhcmF0ZSBsaWJwbmcuc28uMyB3aXRoIGl0cyBvd24gcnBhdGguCi12ZXJzaW9uIDEuMi41cmMxIGFuZCAxLjAuMTVyYzEgW0F1Z3VzdCAyNCwgMjAwMl0KLSAgUmV2aXNlZCBtYWtlZmlsZXMgdG8gbm90IHJlbW92ZSBwcmV2aW91cyBtaW5vciB2ZXJzaW9ucyBvZiBzaGFyZWQgbGlicmFyaWVzLgotdmVyc2lvbiAxLjIuNXJjMiBhbmQgMS4wLjE1cmMyIFtTZXB0ZW1iZXIgMTYsIDIwMDJdCi0gIFJldmlzZWQgMTMgbWFrZWZpbGVzIHRvIHJlbW92ZSAiLWx6IiBhbmQgIi1MJChaTElCTElCKSIsIGV0Yy4sIGZyb20gc2hhcmVkCi0gICAgbGlicmFyeSBsb2FkZXIgZGlyZWN0aXZlLgotICBBZGRlZCBtaXNzaW5nICIkT0JKU0RMTCIgbGluZSB0byBtYWtlZmlsZS5nY21teC4KLSAgQWRkZWQgbWlzc2luZyAiOyBmaSIgdG8gbWFrZWZpbGUuMzJzdW51LgotdmVyc2lvbiAxLjIuNXJjMyBhbmQgMS4wLjE1cmMzIFtTZXB0ZW1iZXIgMTgsIDIwMDJdCi0gIFJldmlzZWQgbGlicG5nLWNvbmZpZyBzY3JpcHQuCi0KLXZlcnNpb24gMS4yLjUgYW5kIDEuMC4xNSBbT2N0b2JlciAzLCAyMDAyXQotICBSZXZpc2VkIG1ha2VmaWxlLm1hY29zeCwgbWFrZWZpbGUuZGFyd2luLCBtYWtlZmlsZS5ocGdjYywgYW5kIG1ha2VmaWxlLmhwdXgsCi0gICAgYW5kIG1ha2VmaWxlLmFpeC4KLSAgUmVsb2NhdGVkIHR3byBtaXNwbGFjZWQgUE5HQVBJIGxpbmVzIGluIHBuZ3Rlc3QuYwotdmVyc2lvbiAxLjIuNmJldGExIFtPY3RvYmVyIDIyLCAyMDAyXQotICBDb21tZW50ZWQgb3V0IHdhcm5pbmcgYWJvdXQgdW5pbml0aWFsaXplZCBtbXhfc3VwcG9ydCBpbiBwbmdnY2NyZC5jLgotICBDaGFuZ2VkICJJQk1DUFBfXyIgZmxhZyB0byAiX19JQk1DUFBfXyIgaW4gcG5nY29uZi5oLgotICBSZWxvY2F0ZWQgdHdvIG1vcmUgbWlzcGxhY2VkIFBOR0FQSSBsaW5lcyBpbiBwbmd0ZXN0LmMKLSAgRml4ZWQgbWVtb3J5IG92ZXJydW4gYnVnIGluIHBuZ19kb19yZWFkX2ZpbGxlcigpIHdpdGggMTYtYml0IGRhdGFzdHJlYW1zLAotICAgIGludHJvZHVjZWQgaW4gdmVyc2lvbiAxLjAuMi4KLSAgUmV2aXNlZCBtYWtlZmlsZS5tYWNvc3gsIG1ha2VmaWxlLmRlYywgbWFrZWZpbGUuYWl4LCBhbmQgbWFrZWZpbGUuMzJzdW51LgotdmVyc2lvbiAxLjIuNmJldGEyIFtOb3ZlbWJlciAxLCAyMDAyXQotICBBZGRlZCBsaWJwbmctY29uZmlnICItLWxkb3B0cyIgb3V0cHV0LgotICBBZGRlZCAiQVI9YXIiIGFuZCAiQVJGTEFHUz1yYyIgYW5kIGNoYW5nZWQgImFyIHJjIiB0byAiJChBUikgJChBUkZMQUdTKSIKLSAgICBpbiBtYWtlZmlsZXMuCi12ZXJzaW9uIDEuMi42YmV0YTMgW0p1bHkgMTgsIDIwMDRdCi0gIFJldmVydGVkIG1ha2VmaWxlIGNoYW5nZXMgZnJvbSB2ZXJzaW9uIDEuMi42YmV0YTIgYW5kIHNvbWUgb2YgdGhlIGNoYW5nZXMKLSAgICBmcm9tIHZlcnNpb24gMS4yLjZiZXRhMTsgdGhlc2Ugd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgdmVyc2lvbiAxLjIuNy4KLSAgICBWZXJzaW9uIDEuMi42IGlzIGdvaW5nIHRvIGJlIGEgc2ltcGxlIGJ1Z2ZpeCByZWxlYXNlLgotICBDaGFuZ2VkIHRoZSBvbmUgaW5zdGFuY2Ugb2YgImxuIC1zZiIgdG8gImxuIC1mIC1zIiBpbiBlYWNoIFN1biBtYWtlZmlsZS4KLSAgRml4ZWQgcG90ZW50aWFsIG92ZXJydW4gaW4gcG5nZXJyb3IuYyBieSB1c2luZyBzdHJuY3B5IGluc3RlYWQgb2YgbWVtY3B5LgotICBBZGRlZCAiIyEvYmluL3NoIiBhdCB0aGUgdG9wIG9mIGNvbmZpZ3VyZSwgZm9yIHJlY29nbml0aW9uIG9mIHRoZQotICAgICd4JyBmbGFnIHVuZGVyIEN5Z3dpbiAoQ29zbWluKS4KLSAgT3B0aW1pemVkIHZhY3VvdXMgdGVzdHMgdGhhdCBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzLCBpbiBwbmcuYyAoQ29zbWluKS4KLSAgQWRkZWQgc3VwcG9ydCBmb3IgUE5HX1VTRVJfQ09ORklHLCBpbiBwbmdjb25mLmggKENvc21pbikuCi0gIEZpeGVkIHRoZSBzcGVjaWFsIG1lbW9yeSBoYW5kbGVyIGZvciBCb3JsYW5kIEMgdW5kZXIgRE9TLCBpbiBwbmdtZW0uYwotICAgIChDb3NtaW4pLgotICBSZW1vdmVkIHNvbWUgc3B1cmlvdXMgYXNzaWdubWVudHMgaW4gcG5ncnV0aWwuYyAoQ29zbWluKS4KLSAgUmVwbGFjZWQgNjU1MzYgd2l0aCA2NTUzNkwsIGFuZCAweGZmZmYgd2l0aCAweGZmZmZMLCB0byBzaWxlbmNlIHdhcm5pbmdzCi0gICAgb24gMTYtYml0IHBsYXRmb3JtcyAoQ29zbWluKS4KLSAgRW5jbG9zZWQgc2hpZnQgb3AgZXhwcmVzc2lvbnMgaW4gcGFyZW50aGVzZXMsIHRvIHNpbGVuY2Ugd2FybmluZ3MgKENvc21pbikuCi0gIFVzZWQgcHJvcGVyIHR5cGUgcG5nX2ZpeGVkX3BvaW50LCB0byBhdm9pZCBwcm9ibGVtcyBvbiAxNi1iaXQgcGxhdGZvcm1zLAotICAgIGluIHBuZ19oYW5kbGVfc1JHQigpIChDb3NtaW4pLgotICBBZGRlZCBjb21wcmVzc2lvbl90eXBlIHRvIHBuZ19zdHJ1Y3QsIGFuZCBvcHRpbWl6ZWQgdGhlIHdpbmRvdyBzaXplCi0gICAgaW5zaWRlIHRoZSBkZWZsYXRlIHN0cmVhbSAoQ29zbWluKS4KLSAgRml4ZWQgZGVmaW5pdGlvbiBvZiBpc25vbmFscGhhKCksIGluIHBuZ2Vycm9yLmMgYW5kIHBuZ3J1dGlsLmMgKENvc21pbikuCi0gIEZpeGVkIGhhbmRsaW5nIG9mIHVua25vd24gY2h1bmtzIHRoYXQgY29tZSBhZnRlciBJREFUIChDb3NtaW4pLgotICBBbGxvd2VkIHBuZ19lcnJvcigpIGFuZCBwbmdfd2FybmluZygpIHRvIHdvcmsgZXZlbiBpZiBwbmdfcHRyID09IE5VTEwKLSAgICAoQ29zbWluKS4KLSAgUmVwbGFjZWQgcm93X2luZm8tPnJvd2J5dGVzIHdpdGggcm93X2J5dGVzIGluIHBuZ193cml0ZV9maW5kX2ZpbHRlcigpCi0gICAgKENvc21pbikuCi0gIEZpeGVkIGRlZmluaXRpb24gb2YgUE5HX0xJQlBOR19WRVJfRExMTlVNIChTaW1vbi1QaWVycmUpLgotICBVc2VkIFBOR19MSUJQTkdfVkVSIGFuZCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcgaW5zdGVhZCBvZiB0aGUgaGFyZGNvZGVkCi0gICAgdmFsdWVzIGluIHBuZy5jIChTaW1vbi1QaWVycmUsIENvc21pbikuCi0gIEluaXRpYWxpemVkIHBuZ19saWJwbmdfdmVyW10gd2l0aCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcgKFNpbW9uLVBpZXJyZSkuCi0gIFJlcGxhY2VkIFBOR19MSUJQTkdfVkVSX01BSk9SIHdpdGggUE5HX0xJQlBOR19WRVJfRExMTlVNIGluIHBuZy5yYwotICAgIChTaW1vbi1QaWVycmUpLgotICBNb3ZlZCB0aGUgZGVmaW5pdGlvbiBvZiBQTkdfSEVBREVSX1ZFUlNJT05fU1RSSU5HIG5lYXIgdGhlIGRlZmluaXRpb25zCi0gICAgb2YgdGhlIG90aGVyIFBOR19MSUJQTkdfVkVSXy4uLiBzeW1ib2xzIGluIHBuZy5oIChDb3NtaW4pLgotICBSZWxvY2F0ZWQgI2lmbmRlZiBQTkdBUEkgZ3VhcmRzIGluIHBuZ2NvbmYuaCAoU2ltb24tUGllcnJlLCBDb3NtaW4pLgotICBVcGRhdGVkIHNjcmlwdHMvbWFrZWZpbGUudmMoYSl3aW4zMiAoQ29zbWluKS4KLSAgVXBkYXRlZCB0aGUgTVNWQyBwcm9qZWN0IChTaW1vbi1QaWVycmUsIENvc21pbikuCi0gIFVwZGF0ZWQgdGhlIEJvcmxhbmQgQysrIEJ1aWxkZXIgcHJvamVjdCAoQ29zbWluKS4KLSAgQXZvaWRlZCBhY2Nlc3MgdG8gYXNtX2ZsYWdzIGluIHBuZ3ZjcmQuYywgaWYgUE5HXzFfMF9YIGlzIGRlZmluZWQgKENvc21pbikuCi0gIENvbW1lbnRlZCBvdXQgd2FybmluZyBhYm91dCB1bmluaXRpYWxpemVkIG1teF9zdXBwb3J0IGluIHBuZ3ZjcmQuYyAoQ29zbWluKS4KLSAgUmVtb3ZlZCBzY3JpcHRzL21ha2VmaWxlLmJkMzIgYW5kIHNjcmlwdHMvcG5nZGVmLnBhcyAoQ29zbWluKS4KLSAgQWRkZWQgZXh0cmEgZ3VhcmQgYXJvdW5kIGluY2x1c2lvbiBvZiBUdXJibyBDIG1lbW9yeSBoZWFkZXJzLCBpbiBwbmdjb25mLmgKLSAgICAoQ29zbWluKS4KLSAgUmVuYW1lZCBwcm9qZWN0cy9tc3ZjLyB0byBwcm9qZWN0cy92aXN1YWxjNi8sIGFuZCBwcm9qZWN0cy9ib3JsYW5kLyB0bwotICAgIHByb2plY3RzL2NidWlsZGVyNS8gKENvc21pbikuCi0gIE1vdmVkIHByb2plY3RzL3Zpc3VhbGM2L3BuZzMybXMuZGVmIHRvIHNjcmlwdHMvcG5ndzMyLmRlZiwKLSAgICBhbmQgcHJvamVjdHMvdmlzdWFsYzYvcG5nLnJjIHRvIHNjcmlwdHMvcG5ndzMyLnJjIChDb3NtaW4pLgotICBBZGRlZCBwcm9qZWN0cy92aXN1YWxjNi9wbmd0ZXN0LmRzcDsgcmVtb3ZlZCBjb250cmliL21zdmN0ZXN0LyAoQ29zbWluKS4KLSAgQ2hhbmdlZCBsaW5lIGVuZGluZ3MgdG8gRE9TIHN0eWxlIGluIGNidWlsZGVyNSBhbmQgdmlzdWFsYzYgZmlsZXMsIGV2ZW4KLSAgICBpbiB0aGUgdGFyLiogZGlzdHJpYnV0aW9ucyAoQ29zbWluKS4KLSAgVXBkYXRlZCBjb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcCAoQ29zbWluKS4KLSAgVXBkYXRlZCBjb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oIHRvIHZlcnNpb24gMi4wLjAgKENvc21pbikuCi0gIEFkZGVkIGEgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIHdpdGggImNvbmZpZ3VyZSIgYW5kIHN1cHBvcnRpbmcgZmlsZXMgKEp1bmljaGkpLgotdmVyc2lvbiAxLjIuNmJldGE0IFtKdWx5IDI4LCAyMDA0XQotICBBZGRlZCB1c2VyIGFiaWxpdHkgdG8gY2hhbmdlIHBuZ19zaXplX3QgdmlhIGEgUE5HX1NJWkVfVCBtYWNyby4KLSAgQWRkZWQgcG5nX3NpemVvZigpIGFuZCBwbmdfY29udmVydF9zaXplKCkgZnVuY3Rpb25zLgotICBBZGRlZCBQTkdfU0laRV9NQVggKG1heGltdW0gdmFsdWUgb2YgYSBwbmdfc2l6ZV90IHZhcmlhYmxlLgotICBBZGRlZCBjaGVjayBpbiBwbmdfbWFsbG9jX2RlZmF1bHQoKSBmb3IgKHNpemVfdClzaXplICE9IChwbmdfdWludF8zMilzaXplCi0gICAgd2hpY2ggd291bGQgaW5kaWNhdGUgYW4gb3ZlcmZsb3cuCi0gIENoYW5nZWQgc1BMVCBmYWlsdXJlIGFjdGlvbiBmcm9tIHBuZ19lcnJvciB0byBwbmdfd2FybmluZyBhbmQgYWJhbmRvbiBjaHVuay4KLSAgQ2hhbmdlZCBzQ0FMIGFuZCBpQ0NQIGZhaWx1cmVzIGZyb20gcG5nX2Vycm9yIHRvIHBuZ193YXJuaW5nIGFuZCBhYmFuZG9uLgotICBBZGRlZCBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgYnVmKSBmdW5jdGlvbi4KLSAgQWRkZWQgUE5HX1VJTlRfMzJfTUFYIG1hY3JvLgotICBSZW5hbWVkIFBOR19NQVhfVUlOVCB0byBQTkdfVUlOVF8zMV9NQVguCi0gIE1hZGUgcG5nX3phbGxvYygpIGlzc3VlIGEgcG5nX3dhcm5pbmcgYW5kIHJldHVybiBOVUxMIG9uIHBvdGVudGlhbAotICAgIG92ZXJmbG93LgotICBUdXJuIG9uIFBOR19OT19aQUxMT0NfWkVSTyBieSBkZWZhdWx0IGluIHZlcnNpb24gMS4yLngKLSAgUmV2aXNlZCAiY2xvYmJlciBsaXN0IiBpbiBwbmdnY2NyZC5jIHNvIGl0IHdpbGwgY29tcGlsZSB1bmRlciBnY2MtMy40LgotICBSZXZpc2VkIEJvcmxhbmQgcG9ydGlvbiBvZiBwbmdfbWFsbG9jKCkgdG8gcmV0dXJuIE5VTEwgb3IgaXNzdWUKLSAgICBwbmdfZXJyb3IoKSBhY2NvcmRpbmcgdG8gc2V0dGluZyBvZiBQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0suCi0gIEFkZGVkIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEIG1hY3JvIHRvIGNvbmRpdGlvbmFsbHkgcmVtb3ZlCi0gICAgc2VxdWVudGlhbCByZWFkIHN1cHBvcnQuCi0gIEFkZGVkIHNvbWUgIiNpZiBQTkdfV1JJVEVfU1VQUE9SVEVEIiBibG9ja3MuCi0gICNpZmRlZidlZCBvdXQgc29tZSByZWR1bmRhbmN5IGluIHBuZ19tYWxsb2NfZGVmYXVsdCgpLgotICBVc2UgcG5nX21hbGxvYyBpbnN0ZWFkIG9mIHBuZ196YWxsb2MgdG8gYWxsb2NhdGUgdGhlIHBhbGxldGUuCi12ZXJzaW9uIDEuMC4xNnJjMSBhbmQgMS4yLjZyYzEgW0F1Z3VzdCA0LCAyMDA0XQotICBGaXhlZCBidWZmZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSBpbiBwbmdfaGFuZGxlX3RSTlMoKQotICBGaXhlZCBpbnRlZ2VyIGFyaXRobWV0aWMgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSBpbiBwbmdfcmVhZF9wbmcoKS4KLSAgRml4ZWQgc29tZSBoYXJtbGVzcyBidWdzIGluIHBuZ19oYW5kbGVfc0JJVCwgZXRjLCB0aGF0IHdvdWxkIGNhdXNlCi0gICAgZHVwbGljYXRlIGNodW5rIHR5cGVzIHRvIGdvIHVuZGV0ZWN0ZWQuCi0gIEZpeGVkIHNvbWUgdGltZXN0YW1wcyBpbiB0aGUgLWNvbmZpZyB2ZXJzaW9uCi0gIFJlYXJyYW5nZWQgb3JkZXIgb2YgcHJvY2Vzc2luZyBvZiBjb2xvciB0eXBlcyBpbiBwbmdfaGFuZGxlX3RSTlMoKS4KLSAgQWRkZWQgUk9XQllURVMgbWFjcm8gdG8gY2FsY3VsYXRlIHJvd2J5dGVzIHdpdGhvdXQgaW50ZWdlciBvdmVyZmxvdy4KLSAgVXBkYXRlZCBtYWtlZmlsZS5kYXJ3aW4gYW5kIHJlbW92ZWQgbWFrZWZpbGUubWFjb3N4IGZyb20gc2NyaXB0cyBkaXJlY3RvcnkuCi0gIEltcG9zZWQgZGVmYXVsdCBvbmUgbWlsbGlvbiBjb2x1bW4sIG9uZS1taWxsaW9uIHJvdyBsaW1pdHMgb24gdGhlIGltYWdlCi0gICAgZGltZW5zaW9ucywgYW5kIGFkZGVkIHBuZ19zZXRfdXNlcl9saW1pdHMoKSBmdW5jdGlvbiB0byBvdmVycmlkZSB0aGVtLgotICBSZXZpc2VkIHVzZSBvZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRCBtYWNyby4KLSAgRml4ZWQgd3JvbmcgY2FzdCBvZiByZXR1cm5zIGZyb20gcG5nX2dldF91c2VyX3dpZHRofGhlaWdodF9tYXgoKS4KLSAgQ2hhbmdlZCBzb21lICJrZWVwIHRoZSBjb21waWxlciBoYXBweSIgZnJvbSBlbXB0eSBzdGF0ZW1lbnRzIHRvIHJldHVybnMsCi0gIFJldmlzZWQgbGlicG5nLnR4dCB0byByZW1vdmUgMS4yLnggc3R1ZmYgZnJvbSB0aGUgMS4wLnggZGlzdHJpYnV0aW9uCi12ZXJzaW9uIDEuMC4xNnJjMiBhbmQgMS4yLjZyYzIgW0F1Z3VzdCA3LCAyMDA0XQotICBSZXZpc2VkIG1ha2VmaWxlLmRhcndpbiBhbmQgbWFrZWZpbGUuc29sYXJpcy4gIFJlbW92ZWQgbWFrZWZpbGUubWFjb3N4LgotICBSZXZpc2VkIHBuZ3Rlc3QncyBwbmdfZGVidWdfbWFsbG9jKCkgdG8gdXNlIHBuZ19tYWxsb2MoKSBpbnN0ZWFkIG9mCi0gICAgcG5nX21hbGxvY19kZWZhdWx0KCkgd2hpY2ggaXMgbm90IHN1cHBvc2VkIHRvIGJlIGV4cG9ydGVkLgotICBGaXhlZCBvZmYtYnktb25lIGVycm9yIGluIG9uZSBvZiB0aGUgY29udmVyc2lvbnMgdG8gUE5HX1JPV0JZVEVTKCkgaW4KLSAgICBwbmdwcmVhZC5jLiAgQnVnIHdhcyBpbnRyb2R1Y2VkIGluIDEuMi42cmMxLgotICBGaXhlZCBidWcgaW4gUkdCIHRvIFJHQlggdHJhbnNmb3JtYXRpb24gaW50cm9kdWNlZCBpbiAxLjIuNnJjMS4KLSAgRml4ZWQgb2xkIGJ1ZyBpbiBSR0IgdG8gR3JheSB0cmFuc2Zvcm1hdGlvbi4KLSAgRml4ZWQgcHJvYmxlbSB3aXRoIDY0LWJpdCBjb21waWxlcnMgYnkgY2FzdGluZyBhcmd1bWVudHMgdG8gYWJzKCkKLSAgICB0byBwbmdfaW50XzMyLgotICBDaGFuZ2VkICJsbiAtc2YiIHRvICJsbiAtZiAtcyIgaW4gdGhyZWUgbWFrZWZpbGVzIChzb2xhcmlzLCBzY28sIHNvOSkuCi0gIENoYW5nZWQgIkhBTkRMRV9DSFVOS18qIiB0byAiUE5HX0hBTkRMRV9DSFVOS18qIiAoQ29zbWluKQotICBBZGRlZCAiLUAvYmluL3JtIC1mICQoREwpLyQoTElCTkFNRSkuc28uJChQTkdNQUopIiB0byAxNSAqTklYIG1ha2VmaWxlcy4KLSAgQWRkZWQgY29kZSB0byB1cGRhdGUgdGhlIHJvd19pbmZvLT5jb2xvcnR5cGUgaW4gcG5nX2RvX3JlYWRfZmlsbGVyKCkgKE1TQikuCi12ZXJzaW9uIDEuMC4xNnJjMyBhbmQgMS4yLjZyYzMgW0F1Z3VzdCA5LCAyMDA0XQotICBFbGltaW5hdGVkIHVzZSBvZiAiYWJzKCkiIGluIHRlc3RpbmcgY0hSTSBhbmQgZ0FNQSB2YWx1ZXMsIHRvIGF2b2lkCi0gICAgdHJvdWJsZSB3aXRoIHNvbWUgNjQtYml0IGNvbXBpbGVycy4gIENyZWF0ZWQgUE5HX09VVF9PRl9SQU5HRSgpIG1hY3JvLgotICBSZXZpc2VkIGRvY3VtZW50YXRpb24gb2YgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCkuCi0gIENoZWNrIGhhbmRsZV9hc191bmtub3duIHN0YXR1cyBpbiBwbmdwcmVhZC5jLCBhcyBpbiBwbmdyZWFkLmMgcHJldmlvdXNseS4KLSAgTW92ZWQgICJQTkdfSEFORExFX0NIVU5LXyoiIG1hY3JvcyBvdXQgb2YgUE5HX0lOVEVSTkFMIHNlY3Rpb24gb2YgcG5nLmgKLSAgQWRkZWQgInJpbSIgZGVmaW5pdGlvbnMgZm9yIENPTlNUNCBhbmQgQ09OU1Q2IGluIHBuZ2djY3JkLmMKLXZlcnNpb24gMS4wLjE2cmM0IGFuZCAxLjIuNnJjNCBbQXVndXN0IDEwLCAyMDA0XQotICBGaXhlZCBtaXN0YWtlIGluIHBuZ3Rlc3QuYyBpbnRyb2R1Y2VkIGluIDEuMi42cmMyIChkZWNsYXJhdGlvbiBvZgotICAgICJwaW5mbyIgd2FzIG91dCBvZiBwbGFjZSkuCi12ZXJzaW9uIDEuMC4xNnJjNSBhbmQgMS4yLjZyYzUgW0F1Z3VzdCAxMCwgMjAwNF0KLSAgTW92ZWQgICJQTkdfSEFORExFX0NIVU5LXyoiIG1hY3JvcyBvdXQgb2YgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRAotICAgICBzZWN0aW9uIG9mIHBuZy5oIHdoZXJlIHRoZXkgd2VyZSBpbmFkdmVydGVudGx5IHBsYWNlZCBpbiB2ZXJzaW9uIHJjMy4KLQotdmVyc2lvbiAxLjIuNiBhbmQgMS4wLjE2IFtBdWd1c3QgMTUsIDIwMDRdCi0gIFJldmlzZWQgcG5ndGVzdCBzbyBtZW1vcnkgYWxsb2NhdGlvbiB0ZXN0aW5nIGlzIG9ubHkgZG9uZSB3aGVuIFBOR19ERUJVRz09MS4KLXZlcnNpb24gMS4yLjdiZXRhMSBbQXVndXN0IDI2LCAyMDA0XQotICBSZW1vdmVkIHVudXNlZCBwbmdhc21yZC5oIGZpbGUuCi0gIFJlbW92ZWQgcmVmZXJlbmNlcyB0byB1dS5uZXQgZm9yIGFyY2hpdmVkIGZpbGVzLiAgQWRkZWQgcmVmZXJlbmNlcyB0bwotICAgIFBORyBTcGVjIChzZWNvbmQgZWRpdGlvbikgYW5kIHRoZSBQTkcgSVNPL0lFQyBTdGFuZGFyZC4KLSAgQWRkZWQgInRlc3QtZGQiIHRhcmdldCBpbiAxNSBtYWtlZmlsZXMsIHRvIHJ1biBwbmd0ZXN0IGluIERFU1RESVIuCi0gIEZpeGVkIGJ1ZyB3aXRoICJvcHRpbWl6ZWQgd2luZG93IHNpemUiIGluIHRoZSBJREFUIGRhdGFzdHJlYW0sIHRoYXQKLSAgICBjYXVzZXMgbGlicG5nIHRvIHdyaXRlIFBORyBmaWxlcyB3aXRoIGluY29ycmVjdCB6bGliIGhlYWRlciBieXRlcy4KLXZlcnNpb24gMS4yLjdiZXRhMiBbQXVndXN0IDI4LCAyMDA0XQotICBGaXhlZCBidWcgd2l0aCBzQ0FMIGNodW5rIGFuZCBiaWctZW5kaWFuIG1hY2hpbmVzIChEYXZpZCBNdW5ybykuCi0gIFVuZGlkIG5ldyBjb2RlIGFkZGVkIGluIDEuMi42cmMyIHRvIHVwZGF0ZSB0aGUgY29sb3JfdHlwZSBpbgotICAgIHBuZ19zZXRfZmlsbGVyKCkuCi0gIEFkZGVkIHBuZ19zZXRfYWRkX2FscGhhKCkgdGhhdCB1cGRhdGVzIGNvbG9yIHR5cGUuCi12ZXJzaW9uIDEuMC4xN3JjMSBhbmQgMS4yLjdyYzEgW1NlcHRlbWJlciA0LCAyMDA0XQotICBSZXZpc2VkIHBuZ19zZXRfc3RyaXBfZmlsbGVyKCkgdG8gbm90IHJlbW92ZSBhbHBoYSBpZiBjb2xvcl90eXBlIGhhcyBhbHBoYS4KLQotdmVyc2lvbiAxLjIuNyBhbmQgMS4wLjE3IFtTZXB0ZW1iZXIgMTIsIDIwMDRdCi0gIEFkZGVkIG1ha2VmaWxlLmhwNjQKLSAgQ2hhbmdlZCBwcm9qZWN0cy9tc3ZjL3BuZzMybXMuZGVmIHRvIHNjcmlwdHMvcG5nMzJtcy5kZWYgaW4gbWFrZWZpbGUuY3lnd2luCi12ZXJzaW9uIDEuMi44YmV0YTEgW05vdmVtYmVyIDEsIDIwMDRdCi0gIEZpeGVkIGJ1ZyBpbiBwbmdfdGV4dF9jb21wcmVzcygpIHRoYXQgd291bGQgZmFpbCB0byBjb21wbGV0ZSBhIGxhcmdlIGJsb2NrLgotICBGaXhlZCBidWcsIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMi43LCB0aGF0IG92ZXJydW5zIGEgYnVmZmVyIGR1cmluZwotICAgIHN0cmlwIGFscGhhIG9wZXJhdGlvbiBpbiBwbmdfZG9fc3RyaXBfZmlsbGVyKCkuCi0gIEFkZGVkIFBOR18xXzJfWCBkZWZpbml0aW9uIGluIHBuZ2NvbmYuaAotICAjaWZkZWYgb3V0IHBuZ19pbmZvX2luaXQgaW4gcG5nLmMgYW5kIHBuZ19yZWFkX2luaXQgaW4gcG5ncmVhZC5jIChhcyBvZiAxLjMuMCkKLXZlcnNpb24gMS4yLjhiZXRhMiBbTm92ZW1iZXIgMiwgMjAwNF0KLSAgUmVkdWNlIGNvbG9yX3R5cGUgdG8gYSBub25hbHBoYSB0eXBlIGFmdGVyIHN0cmlwIGFscGhhIG9wZXJhdGlvbiBpbgotICAgIHBuZ19kb19zdHJpcF9maWxsZXIoKS4KLXZlcnNpb24gMS4yLjhiZXRhMyBbTm92ZW1iZXIgMywgMjAwNF0KLSAgUmV2aXNlZCBkZWZpbml0aW9ucyBvZiBQTkdfTUFYX1VJTlRfMzIsIFBOR19NQVhfU0laRSwgYW5kIFBOR19NQVhTVU0KLXZlcnNpb24gMS4yLjhiZXRhNCBbTm92ZW1iZXIgMTIsIDIwMDRdCi0gIEZpeGVkIChhZ2FpbikgZGVmaW5pdGlvbiBvZiBQTkdfTElCUE5HX1ZFUl9ETExOVU0gaW4gcG5nLmggKENvc21pbikuCi0gIEFkZGVkIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURSBpbiBwbmcuaCAoQ29zbWluKS4KLSAgU2V0IHBuZ19wdHItPnpzdHJlYW0uZGF0YV90eXBlIHRvIFpfQklOQVJZLCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBkZXRlY3Rpb24KLSAgICBvZiBkYXRhIHR5cGUgaW4gZGVmbGF0ZSAoQ29zbWluKS4KLSAgRGVwcmVjYXRlZCBidXQgY29udGludWUgdG8gc3VwcG9ydCBTUEVDSUFMQlVJTEQgYW5kIFBSSVZBVEVCVUlMRCBpbiBmYXZvciBvZgotICAgIFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTF9TVFJJTkcgYW5kIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURV9TVFJJTkcuCi12ZXJzaW9uIDEuMi44YmV0YTUgW05vdmVtYmVyIDIwLCAyMDA0XQotICBVc2UgcG5nX3B0ci0+ZmxhZ3MgaW5zdGVhZCBvZiBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgdG8gcGFzcwotICAgIFBOR19TVFJJUF9BTFBIQSBpbmZvIHRvIHBuZ19kb19zdHJpcF9maWxsZXIoKSwgdG8gcHJlc2VydmUgQUJJCi0gICAgY29tcGF0aWJpbGl0eS4KLSAgUmV2aXNlZCBoYW5kbGluZyBvZiBTUEVDSUFMQlVJTEQsIFBSSVZBVEVCVUlMRCwgCi0gICAgUE5HX0xJQlBOR19CVUlMRF9TUEVDSUFMX1NUUklORyBhbmQgUE5HX0xJQlBOR19CVUlMRF9QUklWQVRFX1NUUklORy4KLXZlcnNpb24gMS4yLjhyYzEgW05vdmVtYmVyIDI0LCAyMDA0XQotICBNb3ZlZCBoYW5kbGluZyBvZiBCVUlMRCBtYWNyb3MgZnJvbSBwbmdjb25mLmggdG8gcG5nLmgKLSAgQWRkZWQgZGVmaW5pdGlvbiBvZiBQTkdfTElCUE5HX0JBU0VfVFlQRSBpbiBwbmcuaCwgaW5hZHZlcnRlbnRseQotICAgIG9taXR0ZWQgZnJvbSBiZXRhNS4KLSAgUmV2aXNlZCBzY3JpcHRzL3BuZ3czMi5yYwotICBEZXNwYW1tZWQgbWFpbGluZyBhZGRyZXNzZXMgYnkgbWFza2luZyAiQCIgd2l0aCAiYXQiLgotICBJbmFkdmVydGVudGx5IGluc3RhbGxlZCBhIHN1cHBvc2VkbHkgZmFzdGVyIHRlc3QgdmVyc2lvbiBvZiBwbmdydXRpbC5jCi12ZXJzaW9uIDEuMi44cmMyIFtOb3ZlbWJlciAyNiwgMjAwNF0KLSAgQWRkZWQgdHdvIG1pc3NpbmcgIlwiIGluIHBuZy5oCi0gIENoYW5nZSB0ZXN0cyBpbiBwbmdyZWFkLmMgYW5kIHBuZ3ByZWFkLmMgdG8KLSAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHx8IChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19TVFJJUF9BTFBIQSkpCi0gICAgICAgcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zKHBuZ19wdHIpOwotdmVyc2lvbiAxLjIuOHJjMyBbTm92ZW1iZXIgMjgsIDIwMDRdCi0gIFJldmVydGVkIHBuZ3J1dGlsLmMgdG8gdmVyc2lvbiBsaWJwbmctMS4yLjhiZXRhNS4KLSAgQWRkZWQgc2NyaXB0cy9tYWtlZmlsZS5lbGYgd2l0aCBzdXBwb3J0aW5nIGNvZGUgaW4gcG5nY29uZi5oIGZvciBzeW1ib2wKLSAgICB2ZXJzaW9uaW5nIChKb2huIEJvd2xlcikuCi12ZXJzaW9uIDEuMi44cmM0IFtOb3ZlbWJlciAyOSwgMjAwNF0KLSAgQWRkZWQgcHJvamVjdHMvdmlzdWFsYzcgKFNpbW9uLXBpZXJyZSkuCi12ZXJzaW9uIDEuMi44cmM1IFtOb3ZlbWJlciAyOSwgMjAwNF0KLSAgRml4ZWQgbmV3IHR5cG8gaW4gc2NyaXB0cy9wbmd3MzIucmMKLQotdmVyc2lvbiAxLjIuOCBbRGVjZW1iZXIgMywgMjAwNF0KLSAgUmVtb3ZlZCBwcm9qZWN0cy92aXN1YWxjNywgYWRkZWQgcHJvamVjdHMvdmlzdWFsYzcxLgotCi12ZXJzaW9uIDEuMi45YmV0YTEgW0ZlYnJ1YXJ5IDIxLCAyMDA2XQotCi0gIEluaXRpYWxpemVkIHNvbWUgc3RydWN0dXJlIG1lbWJlcnMgaW4gcG5nd3V0aWwuYyB0byBhdm9pZCBnY2MtNC4wLjAgY29tcGxhaW50cwotICBSZXZpc2VkIG1hbiBwYWdlIGFuZCBsaWJwbmcudHh0IHRvIG1ha2UgaXQgY2xlYXIgdGhhdCBvbmUgc2hvdWxkIG5vdCBjYWxsCi0gICAgcG5nX3JlYWRfZW5kIG9yIHBuZ193cml0ZV9lbmQgYWZ0ZXIgcG5nX3JlYWRfcG5nIG9yIHBuZ193cml0ZV9wbmcuCi0gIFVwZGF0ZWQgcmVmZXJlbmNlcyB0byBwbmctbW5nLWltcGxlbWVudCBtYWlsaW5nIGxpc3QuCi0gIEZpeGVkIGFuIGluY29ycmVjdCB0eXBlY2FzdCBpbiBwbmdydXRpbC5jCi0gIEFkZGVkIFBOR19OT19SRUFEX1NVUFBPUlRFRCBjb25kaXRpb25hbCBmb3IgbWFraW5nIGEgd3JpdGUtb25seSBsaWJyYXJ5LgotICBBZGRlZCBQTkdfTk9fV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEIGNvbmRpdGlvbmFsLgotICBPcHRpbWl6ZWQgYWxwaGEtaW52ZXJzaW9uIGxvb3BzIGluIHBuZ3d0cmFuLmMKLSAgTW92ZWQgdGVzdCBmb3Igbm9uemVybyBnYW1tYSBvdXRzaWRlIG9mIHBuZ19idWlsZF9nYW1tYV90YWJsZSgpIGluIHBuZ3J0cmFuLmMKLSAgTWFrZSBzdXJlIG51bV90cmFucyBpcyA8PSAyNTYgYmVmb3JlIGNvcHlpbmcgZGF0YSBpbiBwbmdfc2V0X3RSTlMoKS4KLSAgTWFrZSBzdXJlIG51bV9wYWxldHRlIGlzIDw9IDI1NiBiZWZvcmUgY29weWluZyBkYXRhIGluIHBuZ19zZXRfUExURSgpLgotICBJbnRlcmNoYW5nZWQgb3JkZXIgb2Ygd3JpdGVfc3dhcF9hbHBoYSBhbmQgd3JpdGVfaW52ZXJ0X2FscGhhIHRyYW5zZm9ybXMuCi0gIEFkZGVkIHBhcmVudGhlc2VzIGluIHRoZSBkZWZpbml0aW9uIG9mIFBOR19MSUJQTkdfQlVJTERfVFlQRSAoQ29zbWluKS4KLSAgT3B0aW1pemVkIHpsaWIgd2luZG93IGZsYWcgKENJTkZPKSBpbiBjb250cmliL3BuZ3N1aXRlLyoucG5nIChDb3NtaW4pLgotICBVcGRhdGVkIHNjcmlwdHMvbWFrZWZpbGUuYmMzMiBmb3IgQm9ybGFuZCBDKysgNS42IChDb3NtaW4pLgotICBFeHBvcnRlZCBwbmdfZ2V0X3VpbnRfMzIsIHBuZ19zYXZlX3VpbnRfMzIsIHBuZ19nZXRfdWludF8xNiwgcG5nX3NhdmVfdWludF8xNiwKLSAgICBwbmdfZ2V0X2ludF8zMiwgcG5nX3NhdmVfaW50XzMyLCBwbmdfZ2V0X3VpbnRfMzEgKENvc21pbikuCi0gIEFkZGVkIHR5cGUgY2FzdCAocG5nX2J5dGUpIGluIHBuZ193cml0ZV9zQ0FMKCkgKENvc21pbikuCi0gIEZpeGVkIHNjcmlwdHMvbWFrZWZpbGUuY3lnd2luIChDaHJpc3RpYW4gQmllc2luZ2VyLCBDb3NtaW4pLgotICBEZWZhdWx0IGlUWHQgc3VwcG9ydCB3YXMgaW5hZHZlcnRlbnRseSBlbmFibGVkLgotCi12ZXJzaW9uIDEuMi45YmV0YTIgW0ZlYnJ1YXJ5IDIxLCAyMDA2XQotCi0gIENoZWNrIGZvciBwbmdfcmdiX3RvX2dyYXkgYW5kIHBuZ19ncmF5X3RvX3JnYiByZWFkIHRyYW5zZm9ybWF0aW9ucyBiZWZvcmUKLSAgICBjaGVja2luZyBmb3IgcG5nX3JlYWRfZGl0aGVyIGluIHBuZ3J0cmFuLmMKLSAgUmV2aXNlZCBjaGVja2luZyBvZiBjaHJvbWF0aWNpdHkgbGltaXRzIHRvIGFjY29tbW9kYXRlIGV4dGVuZGVkIFJHQgotICAgIGNvbG9yc3BhY2UgKEpvaG4gRGVua2VyKS4KLSAgQ2hhbmdlZCBsaW5lIGVuZGluZ3MgaW4gc29tZSBvZiB0aGUgcHJvamVjdCBmaWxlcyB0byBDUkxGLCBldmVuIGluIHRoZQotICAgICJVbml4IiB0YXIgZGlzdHJpYnV0aW9ucyAoQ29zbWluKS4KLSAgTWFkZSBwbmdfZ2V0X2ludF8zMiBhbmQgcG5nX3NhdmVfaW50XzMyIGFsd2F5cyBhdmFpbGFibGUgKENvc21pbikuCi0gIFVwZGF0ZWQgc2NyaXB0cy9wbmdvczIuZGVmLCBzY3JpcHRzL3BuZ3czMi5kZWYgYW5kIHByb2plY3RzL3dpbmNlL3BuZzMyY2UuZGVmCi0gICAgd2l0aCB0aGUgbmV3bHkgZXhwb3J0ZWQgZnVuY3Rpb25zLgotICBFbGltaW5hdGVkIGRpc3RyaWJ1dGlvbnMgd2l0aG91dCB0aGUgImNvbmZpZ3VyZSIgc2NyaXB0LgotICBVcGRhdGVkIElOU1RBTEwgaW5zdHJ1Y3Rpb25zLgotCi12ZXJzaW9uIDEuMi45YmV0YTMgW0ZlYnJ1YXJ5IDI0LCAyMDA2XQotCi0gIEZpeGVkIENSQ1JMRiBsaW5lIGVuZGluZ3MgaW4gY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5kc3AKLSAgTWFkZSBsaWJwbmcucGMgcmVzcGVjdCBFWEVDX1BSRUZJWCAoRC4gUC4gS3JlaWwsIEouIEJvd2xlcikKLSAgUmVtb3ZlZCByZWZlcmVuY2UgdG8gcG5nYXNtcmQuaCBmcm9tIE1ha2VmaWxlLmFtCi0gIFJlbmFtZWQgQ0hBTkdFUyB0byBDaGFuZ2VMb2cuCi0gIFJlbmFtZWQgTElDRU5TRSB0byBDT1BZSU5HLgotICBSZW5hbWVkIEFOTk9VTkNFIHRvIE5FV1MuCi0gIENyZWF0ZWQgQVVUSE9SUyBmaWxlLgotCi12ZXJzaW9uIDEuMi45YmV0YTQgW01hcmNoIDMsIDIwMDZdCi0KLSAgQ2hhbmdlZCBkZWZpbml0aW9uIG9mIFBLR0NPTkZJRyBmcm9tICRwcmVmaXgvbGliIHRvICRsaWJkaXIgaW4gY29uZmlndXJlLmFjCi0gIFJldmVydGVkIHRvIGZpbGVuYW1lcyBMSUNFTlNFIGFuZCBBTk5PVU5DRTsgcmVtb3ZlZCBBVVRIT1JTIGFuZCBDT1BZSU5HLgotICBSZW1vdmVkIG5ld2xpbmUgZnJvbSB0aGUgZW5kIG9mIHNvbWUgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMuCi0gIFJlbW92ZWQgdGVzdCBmb3Igc3FydCgpIGZyb20gY29uZmlndXJlLmFjIGFuZCBjb25maWd1cmUuCi0gIE1hZGUgc3dhcCB0YWJsZXMgaW4gcG5ndHJhbnMuYyBQTkdfQ09OU1QgKENhcmxvIEJyYW1peCkuCi0gIERpc2FibGVkIGRlZmF1bHQgaVRYdCBzdXBwb3J0IHRoYXQgd2FzIGluYWR2ZXJ0ZW50bHkgZW5hYmxlZCBpbgotICAgIGxpYnBuZy0xLjIuOWJldGExLgotICBBZGRlZCAiT1MyIiB0byBsaXN0IG9mIHN5c3RlbXMgdGhhdCBkb24ndCBuZWVkIHVuZGVyc2NvcmVzLCBpbiBwbmdnY2NyZC5jCi0gIFJlbW92ZWQgbGlicG5nIHZlcnNpb24gYW5kIGRhdGUgZnJvbSAqLmMgZmlsZXMuCi0KLXZlcnNpb24gMS4yLjliZXRhNSBbTWFyY2ggNCwgMjAwNl0KLSAgUmVtb3ZlZCB0cmFpbGluZyBibGFua3MgZnJvbSBzb3VyY2UgZmlsZXMuCi0gIFB1dCB2ZXJzaW9uIGFuZCBkYXRlIG9mIGxhdGVzdCBjaGFuZ2UgaW4gZWFjaCBzb3VyY2UgZmlsZSwgYW5kIGNoYW5nZWQKLSAgICBjb3B5cmlnaHQgeWVhciBhY2NvcmRpbmdseS4KLSAgTW9yZSBjbGVhbnVwIG9mIGNvbmZpZ3VyZS5hYywgTWFrZWZpbGUuYWMsIGFuZCBhc3NvY2lhdGVkIHNjcmlwdHMuCi0gIFJlc3RvcmVkIHNjcmlwdHMvbWFrZWZpbGUuZWxmIHdoaWNoIHdhcyBpbmFkdmVydGVudGx5IGRlbGV0ZWQuCi0KLXZlcnNpb24gMS4yLjliZXRhNiBbTWFyY2ggNiwgMjAwNl0KLSAgRml4ZWQgdHlwbyAoUkVMRUFTRSkgaW4gY29uZmlndXJhdGlvbiBmaWxlcy4KLQotdmVyc2lvbiAxLjIuOWJldGE3IFtNYXJjaCA3LCAyMDA2XQotICBSZW1vdmVkIGxpYnBuZy52ZXJzIGFuZCBsaWJwbmcuc3ltIGZyb20gbGlicG5nMTJfbGFfU09VUkNFUyBpbiBNYWtlZmlsZS5hbQotICBGaXhlZCBpbmNvbnNpc3RlbnQgI2lmZGVmJ3MgYXJvdW5kIHBuZ19zaWdfYnl0ZXMoKSBhbmQgcG5nX3NldF9zQ0FMX3MoKQotICAgIGluIHBuZy5oLgotICBVcGRhdGVkIG1ha2VmaWxlLmVsZiBhcyBzdWdnZXN0ZWQgYnkgZGViaWFuLgotICBNYWRlIGNvc21ldGljIGNoYW5nZXMgdG8gc29tZSBtYWtlZmlsZXMsIGFkZGluZyBMTl9TRiBhbmQgb3RoZXIgbWFjcm9zLgotICBNYWRlIHNvbWUgbWFrZWZpbGVzIGFjY2VwdCAiZXhlY19wcmVmaXgiLgotCi12ZXJzaW9uIDEuMi45YmV0YTggW01hcmNoIDksIDIwMDZdCi0gIEZpeGVkIHNvbWUgIiNpZiBkZWZpbmVkICguLi4iIHdoaWNoIHNob3VsZCBiZSAiI2lmIGRlZmluZWQoLi4uIgotICAgIEJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuOC4KLSAgRml4ZWQgaW5jb25zaXN0ZW5jeSBpbiBkZWZpbml0aW9uIG9mIHBuZ19kZWZhdWx0X3JlYWRfZGF0YSgpCi0gIFJlc3RvcmVkIGJsYW5rIHRoYXQgd2FzIGxvc3QgZnJvbSBtYWtlZmlsZS5zZ2djYyAiY2xlYW4iIHRhcmdldCBpbiBiZXRhNy4KLSAgUmV2aXNlZCBjYWxjdWxhdGlvbiBvZiAiY3VycmVudCIgYW5kICJtYWpvciIgZm9yIGlyaXggaW4gbHRtYWluLnNoCi0gIENoYW5nZWQgIm1rZGlyIiB0byAiTUtESVJfUCIgaW4gc29tZSBtYWtlZmlsZXMuCi0gIFNlcGFyYXRlZCBQTkdfRVhQQU5EIGFuZCBQTkdfRVhQQU5EX3RSTlMuCi0gIEFkZGVkIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpIGFuZCBkZXByZWNhdGVkCi0gICAgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSB3aGljaCBhbHNvIGV4cGFuZHMgdFJOUyB0byBhbHBoYS4KLQotdmVyc2lvbiAxLjIuOWJldGE5IFtNYXJjaCAxMCwgMjAwNl0KLSAgSW5jbHVkZSAiY29uZmlnLmgiIGluIHBuZ2NvbmYuaCB3aGVuIGF2YWlsYWJsZS4KLSAgQWRkZWQgc29tZSBjaGVja3MgZm9yIE5VTEwgcG5nX3B0ciBvciBOVUxMIGluZm9fcHRyICh0aW1lbGVzcykKLQotdmVyc2lvbiAxLjIuOWJldGExMCBbTWFyY2ggMjAsIDIwMDZdCi0gIFJlbW92ZWQgZXh0cmEgQ1IgZnJvbSBjb250cmliL3Zpc3VhbHBuZy9WaXN1YWxQbmcuZHN3IChDb3NtaW4pCi0gIE1hZGUgcG5nZ2NjcmQuYyBQSUMtY29tcGxpYW50IChDaHJpc3RpYW4gQWljaGluZ2VyKS4KLSAgQWRkZWQgbWFrZWZpbGUubWluZ3cgKFdvbGZnYW5nIEdsYXMpLgotICBSZXZpc2VkIHBuZ2NvbmYuaCBNTVggY2hlY2tpbmcuCi0KLXZlcnNpb24gMS4yLjliZXRhMTEgW01hcmNoIDIyLCAyMDA2XQotICBGaXhlZCBvdXQtb2Ytb3JkZXIgZGVjbGFyYXRpb24gaW4gcG5nd3JpdGUuYyB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIGJldGE5Ci0gIFNpbXBsaWZpZWQgc29tZSBtYWtlZmlsZXMgYnkgdXNpbmcgTElCU08sIExJQlNPTUFKLCBhbmQgTElCU09WRVIgbWFjcm9zLgotCi12ZXJzaW9uIDEuMi45cmMxIFtNYXJjaCAzMSwgMjAwNl0KLSAgRGVmaW5lZCBQTkdfVVNFUl9QUklWQVRFQlVJTEQgd2hlbiBpbmNsdWRpbmcgInBuZ3Vzci5oIiAoQ29zbWluKS4KLSAgUmVtb3ZlZCBub25zZW5zaWNhbCBhc3NlcnRpb24gY2hlY2sgZnJvbSBwbmd0ZXN0LmMgKENvc21pbikuCi0KLXZlcnNpb24gMS4yLjkgW0FwcmlsIDE0LCAyMDA2XQotICBSZXZpc2VkIG1ha2VmaWxlLmJlb3MgYW5kIGFkZGVkICJub25lIiBzZWxlY3RvciBpbiBsdG1haW4uc2gKLQotdmVyc2lvbiAxLjIuMTBiZXRhMSBbQXByaWwgMTUsIDIwMDZdCi0gIFJlbmFtZWQgImNvbmZpZy5oIiB0byAicG5nX2NvbmYuaCIgYW5kIHJldmlzZWQgTWFrZWZpbGUuYW0gdG8gYWRkCi0gICAgLURQTkdfQlVJTERJTkdfTElCUE5HIHRvIGNvbXBpbGUgZGlyZWN0aXZlLCBhbmQgbW9kaWZpZWQgcG5nY29uZi5oCi0gICAgdG8gaW5jbHVkZSBwbmdfY29uZi5oIG9ubHkgd2hlbiBQTkdfQlVJTERJTkdfTElCUE5HIGlzIGRlZmluZWQuCi0KLXZlcnNpb24gMS4yLjEwYmV0YTIgW0FwcmlsIDE1LCAyMDA2XQotICBNYW51YWxseSB1cGRhdGVkIE1ha2VmaWxlLmluIGFuZCBjb25maWd1cmUuICBDaGFuZ2VkIHBuZ19jb25mLmguaW4KLSAgICBiYWNrIHRvIGNvbmZpZy5oLgotCi12ZXJzaW9uIDEuMi4xMGJldGEzIFtBcHJpbCAxNSwgMjAwNl0KLSAgQ2hhbmdlIHBuZ19jb25mLmggYmFjayB0byBjb25maWcuaCBpbiBwbmdjb25mLmguCi0KLXZlcnNpb24gMS4yLjEwYmV0YTQgW0FwcmlsIDE2LCAyMDA2XQotICBDaGFuZ2UgUE5HX0JVSUxESU5HX0xJQlBORyB0byBQTkdfQ09ORklHVVJFX0xJQlBORyBpbiBjb25maWcvTWFrZWZpbGUqLgotCi12ZXJzaW9uIDEuMi4xMGJldGE1IFtBcHJpbCAxNiwgMjAwNl0KLSAgQWRkZWQgYSBjb25maWd1cmUgY2hlY2sgZm9yIGNvbXBpbGluZyBhc3NlbWJsZXIgY29kZSBpbiBwbmdnY2NyZC5jCi0KLXZlcnNpb24gMS4yLjEwYmV0YTYgW0FwcmlsIDE3LCAyMDA2XQotICBSZXZpc2VkIHRoZSBjb25maWd1cmUgY2hlY2sgZm9yIHBuZ2djY3JkLmMKLSAgTW92ZWQgLURQTkdfQ09ORklHVVJFX0xJQlBORyBpbnRvIEBMSUJQTkdfREVGSU5FU0AKLSAgQWRkZWQgQExJQlBOR19ERUZJTkVTQCB0byBhcmd1bWVudHMgd2hlbiBidWlsZGluZyBsaWJwbmcuc3ltCi0KLXZlcnNpb24gMS4yLjEwYmV0YTcgW0FwcmlsIDE4LCAyMDA2XQotICBDaGFuZ2UgImV4ZWNfcHJlZml4PSRwcmVmaXgiIHRvICJleGVjX3ByZWZpeD0kKHByZWZpeCkiIGluIG1ha2VmaWxlcy4KLQotdmVyc2lvbiAxLjIuMTByYzEgW0FwcmlsIDE5LCAyMDA2XQotICBFbnN1cmUgcG5nY29uZi5oIGRvZXNuJ3QgZGVmaW5lIGJvdGggUE5HX1VTRV9QTkdHQ0NSRCBhbmQgUE5HX1VTRV9QTkdWQ1JECi0gIEZpeGVkICJMTl9GUyIgdHlwbyBpbiBtYWtlZmlsZS5zY28gYW5kIG1ha2VmaWxlLnNvbGFyaXMuCi0KLXZlcnNpb24gMS4yLjEwcmMyIFtBcHJpbCAyMCwgMjAwNl0KLSAgQWRkZWQgYSBiYWNrc2xhc2ggYmV0d2VlbiAtRFBOR19DT05GSUdVUkVfTElCUE5HIGFuZCAtRFBOR19OT19BU1NFTUJMRVJfQ09ERQotICAgaW4gY29uZmlndXJlLmFjIGFuZCBjb25maWd1cmUKLSAgTWFkZSB0aGUgY29uZmlndXJlIHdhcm5pbmcgYWJvdXQgdmVyc2lvbmVkIHN5bWJvbHMgbGVzcyBhcnJvZ2FudC4KLQotdmVyc2lvbiAxLjIuMTByYzMgW0FwcmlsIDIxLCAyMDA2XQotICBBZGRlZCBhIG5vdGUgaW4gbGlicG5nLnR4dCB0aGF0IHBuZ19zZXRfc2lnX2J5dGVzKDgpIGNhbiBiZSB1c2VkIHdoZW4KLSAgICB3cml0aW5nIGFuIGVtYmVkZGVkIFBORyB3aXRob3V0IHRoZSA4LWJ5dGUgc2lnbmF0dXJlLgotICBSZXZpc2VkIG1ha2VmaWxlcyBhbmQgY29uZmlndXJlIHRvIGF2b2lkIG1ha2luZyBsaW5rcyB0byBsaWJwbmcuc28uKgotCi12ZXJzaW9uIDEuMi4xMCBbQXByaWwgMjMsIDIwMDZdCi0gIFJldmVydGVkIGNvbmZpZ3VyZSB0byAicmMyIiBzdGF0ZS4KLQotdmVyc2lvbiAxLjIuMTFiZXRhMSBbTWF5IDMxLCAyMDA2XQotICBzY3JpcHRzL2xpYnBuZy5wYy5pbiBjb250YWluZWQgImNvbmZpZ3VyZSIgc3R5bGUgdmVyc2lvbiBpbmZvIGFuZCB3b3VsZAotICAgIG5vdCB3b3JrIHdpdGggbWFrZWZpbGVzLgotICBUaGUgc2hhcmVkLWxpYnJhcnkgbWFrZWZpbGVzIHdlcmUgbGlua2luZyB0byBsaWJwbmcuc28uMCBpbnN0ZWFkIG9mCi0gICAgbGlicG5nLnNvLjMgY29tcGF0aWJpbGl0eSBhcyB0aGUgbGlicmFyeS4KLQotdmVyc2lvbiAxLjIuMTFiZXRhMiBbSnVuZSAyLCAyMDA2XQotICBJbmNyZWFzZWQgc3ByaW50ZiBidWZmZXIgZnJvbSA1MCB0byA1MiBjaGFycyBpbiBwbmdydXRpbC5jIHRvIGF2b2lkCi0gICAgYnVmZmVyIG92ZXJmbG93LgotICBGaXhlZCBidWcgaW4gZXhhbXBsZS5jIChwbmdfc2V0X3BhbGV0dGVfcmdiIC0+IHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IpCi0KLXZlcnNpb24gMS4yLjExYmV0YTMgW0p1bmUgNSwgMjAwNl0KLSAgUHJlcGVuZGVkICIjISAvYmluL3NoIiB0byBsdG1haWwuc2ggYW5kIGNvbnRyaWIvcG5nbWludXMvKi5zaCAoQ29zbWluKS4KLSAgUmVtb3ZlZCB0aGUgYWNjaWRlbnRhbCBsZWZ0b3ZlciBNYWtlZmlsZS5pbn4gKENvc21pbikuCi0gIEF2b2lkZWQgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdyBhbmQgb3B0aW1pemVkIGJ1ZmZlciBpbgotICAgIHBuZ193cml0ZV9zQ0FMKCksIHBuZ193cml0ZV9zQ0FMX3MoKSAoQ29zbWluKS4KLSAgUmVtb3ZlZCB0aGUgaW5jbHVkZSBkaXJlY3RvcmllcyBhbmQgbGlicmFyaWVzIGZyb20gQ0ZMQUdTIGFuZCBMREZMQUdTCi0gICAgaW4gc2NyaXB0cy9tYWtlZmlsZS5nY2MgKE5lbHNvbiBBLiBkZSBPbGl2ZWlyYSwgQ29zbWluKS4KLQotdmVyc2lvbiAxLjIuMTFiZXRhNCBbSnVuZSA2LCAyMDA2XQotICBBbGxvdyB6ZXJvLWxlbmd0aCBJREFUIGNodW5rcyBhZnRlciB0aGUgZW50aXJlIHpsaWIgZGF0YXN0cmVhbSwgYnV0IG5vdAotICAgIGFmdGVyIGFub3RoZXIgaW50ZXJ2ZW5pbmcgY2h1bmsgdHlwZS4KLQotdmVyc2lvbiAxLjAuMTlyYzEsIDEuMi4xMXJjMSBbSnVuZSAxMywgMjAwNl0KLSAgRGVsZXRlZCBleHRyYW5lb3VzIHNxdWFyZSBicmFja2V0cyBmcm9tIFtjb25maWcuaF0gaW4gY29uZmlndXJlLmFjCi0KLXZlcnNpb24gMS4wLjE5cmMyLCAxLjIuMTFyYzIgW0p1bmUgMTQsIDIwMDZdCi0gIEFkZGVkIHByb3RvdHlwZXMgZm9yIFBOR19JTkNIX0NPTlZFUlNJT05TIGZ1bmN0aW9ucyB0byBwbmcuaAotICBSZXZpc2VkIElOU1RBTEwgYW5kIGF1dG9nZW4uc2gKLSAgRml4ZWQgdHlwbyBpbiBzZXZlcmFsIG1ha2VmaWxlcyAoLVcxIHNob3VsZCBiZSAtV2wpCi0gIEFkZGVkIHR5cGVkZWYgZm9yIHBuZ19pbnRfMzIgYW5kIHBuZ191aW50XzMyIG9uIDY0LWJpdCBzeXN0ZW1zLgotCi12ZXJzaW9uIDEuMC4xOXJjMywgMS4yLjExcmMzIFtKdW5lIDE1LCAyMDA2XQotICBSZW1vdmVkIHRoZSBuZXcgdHlwZWRlZnMgZm9yIDY0LWJpdCBzeXN0ZW1zIChkZWxheSB1bnRpbCB2ZXJzaW9uIDEuNC4wKQotICBBZGRlZCBvbmUgemVybyBlbGVtZW50IHRvIHBuZ19nYW1tYV9zaGlmdFtdIGFycmF5IGluIHBuZ3J0cmFuLmMgdG8gYXZvaWQKLSAgICByZWFkaW5nIG91dCBvZiBib3VuZHMuCi0KLXZlcnNpb24gMS4wLjE5cmM0LCAxLjIuMTFyYzQgW0p1bmUgMTUsIDIwMDZdCi0gIFJlYWxseSByZW1vdmVkIHRoZSBuZXcgdHlwZWRlZnMgZm9yIDY0LWJpdCBzeXN0ZW1zLgotCi12ZXJzaW9uIDEuMC4xOXJjNSwgMS4yLjExcmM1IFtKdW5lIDIyLCAyMDA2XQotICBSZW1vdmVkIHBuZ19zaWdfYnl0ZXMgZW50cnkgZnJvbSBzY3JpcHRzL3BuZ3czMi5kZWYKLQotdmVyc2lvbiAxLjAuMTksIDEuMi4xMSBbSnVuZSAyNiwgMjAwNl0KLSAgTm9uZS4KLQotdmVyc2lvbiAxLjAuMjAsIDEuMi4xMiBbSnVuZSAyNywgMjAwNl0KLSAgUmVhbGx5IGluY3JlYXNlZCBzcHJpbnRmIGJ1ZmZlciBmcm9tIDUwIHRvIDUyIGNoYXJzIGluIHBuZ3J1dGlsLmMgdG8gYXZvaWQKLSAgICBidWZmZXIgb3ZlcmZsb3cuCi0KLXZlcnNpb24gMS4yLjEzYmV0YTEgW09jdG9iZXIgMiwgMjAwNl0KLSAgUmVtb3ZlZCBBQ19GVU5DX01BTExPQyBmcm9tIGNvbmZpZ3VyZS5hYwotICBXb3JrIGFyb3VuZCBJbnRlbC1NYWMgY29tcGlsZXIgYnVnIGJ5IHNldHRpbmcgUE5HX05PX01NWF9DT0RFIGluIHBuZ2NvbmYuaAotICBDaGFuZ2UgImxvZ2ljYWwiIHRvICJiaXR3aXNlIiB0aHJvdWdob3V0IGRvY3VtZW50YXRpb24uCi0gIERldGVjdCBhbmQgZml4IGF0dGVtcHQgdG8gd3JpdGUgd3JvbmcgaUNDUCBwcm9maWxlIGxlbmd0aC4KLQotdmVyc2lvbiAxLjAuMjEsIDEuMi4xMyBbTm92ZW1iZXIgMTQsIDIwMDZdCi0gIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93IGluIHNQTFQgY2h1bmsgaGFuZGxlci4KLSAgRml4IE1ha2VmaWxlLmFtIHRvIG5vdCB0cnkgdG8gbGluayB0byBub2V4aXN0ZW50IGZpbGVzLgotICBDaGVjayBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIGZvciBOVUxMIHBuZ19wdHIuCi0KLXZlcnNpb24gMS4yLjE0YmV0YTEgW05vdmVtYmVyIDE3LCAyMDA2XQotICBSZWxvY2F0ZWQgdGhyZWUgbWlzcGxhY2VkIHRlc3RzIGZvciBOVUxMIHBuZ19wdHIuCi0gIEJ1aWx0IE1ha2VmaWxlLmluIHdpdGggYXV0b21ha2UtMS45LjYgaW5zdGVhZCBvZiAxLjkuMi4KLSAgQnVpbGQgY29uZmlndXJlIHdpdGggYXV0b2NvbmYtMi42MCBpbnN0ZWFkIG9mIDIuNTkKLQotdmVyc2lvbiAxLjIuMTRiZXRhMiBbTm92ZW1iZXIgMTcsIDIwMDZdCi0gIEFkZGVkIHNvbWUgdHlwZWNhc3RzIGluIHBuZ196YWxsb2MoKS4KLQotdmVyc2lvbiAxLjIuMTRyYzEgW05vdmVtYmVyIDIwLCAyMDA2XQotICBDaGFuZ2VkICJzdHJ0b2QiIHRvICJwbmdfc3RydG9kIiBpbiBwbmdydXRpbC5jCi0KLXZlcnNpb24gMS4wLjIyLCAxLjIuMTQgICAgW05vdmVtYmVyIDI3LCAyMDA2XQotICBBZGRlZCBtaXNzaW5nICIkKHNyY2RpcikiIGluIE1ha2VmaWxlLmFtIGFuZCBNYWtlZmlsZS5pbgotCi12ZXJzaW9uIDEuMi4xNWJldGExIFtEZWNlbWJlciAzLCAyMDA2XQotICBHZW5lcmF0ZWQgY29uZmlndXJlIHdpdGggYXV0b2NvbmYtMi42MSBpbnN0ZWFkIG9mIDIuNjAKLSAgUmV2aXNlZCBjb25maWd1cmUuYWMgdG8gdXBkYXRlIGxpYnBuZy5wYyBhbmQgbGlicG5nLWNvbmZpZy4KLQotdmVyc2lvbiAxLjIuMTViZXRhMiBbRGVjZW1iZXIgMywgMjAwNl0KLSAgQWx3YXlzIGV4cG9ydCBNTVggYXNtIGZ1bmN0aW9ucywganVzdCBzdHVicyBpZiBub3QgYnVpbGRpbmcgcG5nZ2NjcmQuYwotCi12ZXJzaW9uIDEuMi4xNWJldGEzIFtEZWNlbWJlciA0LCAyMDA2XQotICBBZGQgInBuZ19ieXRlcCIgdHlwZWNhc3QgdG8gcHJvZmlsZSB3aGlsZSBjYWxjdWxhdGluZyBsZW5ndGggaW4gcG5nd3V0aWwuYwotCi12ZXJzaW9uIDEuMi4xNWJldGE0IFtEZWNlbWJlciA3LCAyMDA2XQotICBBZGRlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0Ci0gIENoYW5nZWQgUE5HX05PX0FTU0VNQkxFUl9DT0RFIHRvIFBOR19OT19NTVhfQ09ERSBpbiBzY3JpcHRzLCBsaWtlIDEuNC4wYmV0YQotCi12ZXJzaW9uIDEuMi4xNWJldGE1IFtEZWNlbWJlciA3LCAyMDA2XQotICBDaGFuZ2VkIHNvbWUgaW5zdGFuY2VzIG9mIFBOR19BU1NFTUJMRVJfKiB0byBQTkdfTU1YXyogaW4gcG5nZ2NjcmQuYwotICBSZXZpc2VkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKLQotdmVyc2lvbiAxLjIuMTViZXRhNiBbRGVjZW1iZXIgMTMsIDIwMDZdCi0gIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dCBhbmQgY29uZmlndXJlLmFjCi0KLXZlcnNpb24gMS4yLjE1cmMxIFtEZWNlbWJlciAxOCwgMjAwNl0KLSAgUmV2aXNlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0Ci0KLXZlcnNpb24gMS4yLjE1cmMyIFtEZWNlbWJlciAyMSwgMjAwNl0KLSAgQWRkZWQgY29uZGl0aW9uYWwgI3VuZGVmIGptcGJ1ZiBpbiBwbmd0ZXN0LmMgdG8gdW5kbyAjZGVmaW5lIGluIEFJWCBoZWFkZXJzLgotICBBZGRlZCBzY3JpcHRzL21ha2VmaWxlLm5vbW14Ci0KLXZlcnNpb24gMS4yLjE1cmMzIFtEZWNlbWJlciAyNSwgMjAwNl0KLSAgRml4ZWQgc2hhcmVkIGxpYnJhcnkgbnVtYmVyaW5nIGVycm9yIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gMS4yLjE1YmV0YTYuCi0KLXZlcnNpb24gMS4yLjE1cmM0IFtEZWNlbWJlciAyNywgMjAwNl0KLSAgRml4ZWQgaGFuZGxpbmcgb2YgcmdiX3RvX2dyYXkgd2hlbiBwbmdfcHRyLT5jb2xvci5ncmF5IGlzbid0IHNldC4KLQotdmVyc2lvbiAxLjIuMTVyYzUgW0RlY2VtYmVyIDMxLCAyMDA2XQotICBSZXZpc2VkIGhhbmRsaW5nIG9mIHJnYl90b19ncmF5LgotCi12ZXJzaW9uIDEuMC4yMywgMS4yLjE1IFtKYW51YXJ5IDUsIDIwMDddCi0gIEFkZGVkIHNvbWUgKHVuc2lnbmVkIGxvbmcpIHR5cGVjYXN0cyBpbiBwbmd0ZXN0LmMgdG8gYXZvaWQgcHJpbnRpbmcgZXJyb3JzLgotCi12ZXJzaW9uIDEuMi4xNmJldGExIFtKYW51YXJ5IDYsIDIwMDddCi0gIEZpeCBidWdzIGluIG1ha2VmaWxlLm5vbW14Ci0KLXZlcnNpb24gMS4yLjE2YmV0YTIgW0phbnVhcnkgMTYsIDIwMDddCi0gIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dAotIAotdmVyc2lvbiAxLjAuMjQsIDEuMi4xNiBbSmFudWFyeSAzMSwgMjAwN10KLSAgTm8gY2hhbmdlcy4KLSAKLXZlcnNpb24gMS4yLjE3YmV0YTEgW01hcmNoIDYsIDIwMDddCi0gIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dCB0byBpbnN0YWxsIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzLgotICBEZWxldGVkIGEgcmVkdW5kYW50IGxpbmUgZnJvbSBwbmdzZXQuYy4KLSAKLXZlcnNpb24gMS4yLjE3YmV0YTIgW0FwcmlsIDI2LCAyMDA3XQotICBSZWxvY2F0ZWQgbWlzcGxhY2VkIHRlc3QgZm9yIHBuZ19wdHIgPT0gTlVMTCBpbiBwbmdwcmVhZC5jCi0gIENoYW5nZSAiPT0iIHRvICImIiBmb3IgdGVzdGluZyBQTkdfUkdCX1RPX0dSQVlfRVJSICYgUE5HX1JHQl9UT19HUkFZX1dBUk4KLSAgICBmbGFncy4KLSAgQ2hhbmdlZCByZW1haW5pbmcgaW5zdGFuY2VzIG9mIFBOR19BU1NFTUJMRVJfKiB0byBQTkdfTU1YXyoKLSAgQWRkZWQgcG5nZXJyb3IoKSB3aGVuIHdyaXRlX0lIRFIgZmFpbHMgaW4gZGVmbGF0ZUluaXQyKCkuCi0gIEFkZGVkICJjb25zdCIgdG8gc29tZSBhcnJheSBkZWNsYXJhdGlvbnMuCi0gIE1lbnRpb24gZXhhbXBsZXMgb2YgbGlicG5nIHVzYWdlIGluIHRoZSBsaWJwbmcqLnR4dCBhbmQgbGlicG5nLjMgZG9jdW1lbnRzLgotCi12ZXJzaW9uIDEuMi4xN3JjMSBbTWF5IDQsIDIwMDddCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS4yLjE3cmMyIFtNYXkgOCwgMjAwN10KLSAgTW92ZWQgc2V2ZXJhbCBQTkdfSEFWRV8qIG1hY3JvcyBvdXQgb2YgUE5HX0lOVEVSTkFMIGJlY2F1c2UgYXBwbGljYXRpb25zCi0gICAgY2FsbGluZyBzZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbigpIG5lZWQgdGhlbS4KLSAgQ2hhbmdlZCB0cmFuc2Zvcm1hdGlvbiBmbGFnIGZyb20gUE5HX0VYUEFORF90Uk5TIHRvIFBOR19FWFBBTkQgaW4KLSAgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKS4KLSAgQWRkZWQgcG5nX3B0ci0+dW5rbm93bl9jaHVuayB0byBob2xkIHdvcmtpbmcgdW5rbm93biBjaHVuayBkYXRhLCBzbyBpdAotICAgIGNhbiBiZSBmcmVlJ2VkIGluIGNhc2Ugb2YgZXJyb3IuICBSZXZpc2VkIHVua25vd24gY2h1bmsgaGFuZGxpbmcgaW4KLSAgICBwbmdydXRpbC5jIGFuZCBwbmdwcmVhZC5jIHRvIHVzZSB0aGlzIHN0cnVjdHVyZS4KLSAKLXZlcnNpb24gMS4yLjE3cmMzIFtNYXkgOCwgMjAwN10KLSAgUmV2aXNlZCBzeW1ib2wtaGFuZGxpbmcgaW4gY29uZmlndXJlIHNjcmlwdC4KLQotdmVyc2lvbiAxLjIuMTdyYzQgW01heSAxMCwgMjAwN10KLSAgUmV2aXNlZCB1bmtub3duIGNodW5rIGhhbmRsaW5nIHRvIGF2b2lkIHN0b3JpbmcgdW5rbm93biBjcml0aWNhbCBjaHVua3MuCi0KLXZlcnNpb24gMS4wLjI1IFtNYXkgMTUsIDIwMDddCi12ZXJzaW9uIDEuMi4xNyBbTWF5IDE1LCAyMDA3XQotICBBZGRlZCAicG5nX3B0ci0+bnVtX3RyYW5zPTAiIGJlZm9yZSBlcnJvciByZXR1cm4gaW4gcG5nX2hhbmRsZV90Uk5TLAotICAgIHRvIGVsaW1pbmF0ZSBhIHZ1bG5lcmFiaWxpdHkgKENWRS0yMDA3LTI0NDUsIENFUlQgVlUjNjg0NjY0KQotCi12ZXJzaW9uIDEuMC4yNiBbTWF5IDE1LCAyMDA3XQotdmVyc2lvbiAxLjIuMTggW01heSAxNSwgMjAwN10KLSAgUmV2ZXJ0ZWQgdGhlIGxpYnBuZy0xLjIuMTdyYzMgY2hhbmdlIHRvIHN5bWJvbC1oYW5kbGluZyBpbiBjb25maWd1cmUgc2NyaXB0Ci0KLXZlcnNpb24gMS4yLjE5YmV0YTEgW01heSAxOCwgMjAwN10KLSAgQ2hhbmdlZCAiY29uc3Qgc3RhdGljIiB0byAic3RhdGljIFBOR19DT05TVCIgZXZlcnl3aGVyZSwgbW9zdGx5IHVuZG9pbmcKLSAgICBjaGFuZ2Ugb2YgbGlicG5nLTEuMi4xN2JldGEyLiAgQ2hhbmdlZCBvdGhlciAiY29uc3QiIHRvICJQTkdfQ09OU1QiCi0gIENoYW5nZWQgc29tZSBoYW5kbGluZyBvZiB1bnVzZWQgcGFyYW1ldGVycywgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0gICAgImlmICh1bnVzZWQgPT0gTlVMTCkgcmV0dXJuOyIgYmVjb21lcyAidW51c2VkID0gdW51c2VkIi4KLQotdmVyc2lvbiAxLjIuMTliZXRhMiBbTWF5IDE4LCAyMDA3XQotICBPbmx5IHVzZSB0aGUgdmFsaWQgYml0cyBvZiB0Uk5TIHZhbHVlIGluIHBuZ19kb19leHBhbmQoKSAoQnJpYW4gQ2FydGllcikKLQotdmVyc2lvbiAxLjIuMTliZXRhMyBbTWF5IDE5LCAyMDA3XQotICBBZGQgc29tZSAicG5nX2J5dGUiIHR5cGVjYXN0cyBpbiBwbmdfY2hlY2tfa2V5d29yZCgpIGFuZCB3cml0ZSBuZXdfa2V5Ci0gIGluc3RlYWQgb2Yga2V5IGluIHpUWHQgY2h1bmsgKEtldmluIFJ5ZGUpLgotCi12ZXJzaW9uIDEuMi4xOWJldGE0IFtNYXkgMjEsIDIwMDddCi0gIEFkZCBwbmdfc25wcmludGYoKSBmdW5jdGlvbiBhbmQgdXNlIGl0IGluIHBsYWNlIG9mIHNwcmludCgpIGZvciBpbXByb3ZlZAotICAgIGRlZmVuc2UgYWdhaW5zdCBidWZmZXIgb3ZlcmZsb3dzLgotCi12ZXJzaW9uIDEuMi4xOWJldGE1IFtNYXkgMjEsIDIwMDddCi0gIEZpeGVkIHBuZ19oYW5kbGVfdFJOUygpIHRvIG9ubHkgdXNlIHRoZSB2YWxpZCBiaXRzIG9mIHRSTlMgdmFsdWUuCi0gIENoYW5nZWQgaGFuZGxpbmcgb2YgbW9yZSB1bnVzZWQgcGFyYW1ldGVycywgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0gIFJlbW92ZWQgc29tZSBQTkdfQ09OU1QgaW4gcG5nd3V0aWwuYyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLQotdmVyc2lvbiAxLjIuMTliZXRhNiBbTWF5IDIyLCAyMDA3XQotICBBZGRlZCBzb21lICNpZmRlZiBQTkdfTU1YX0NPREVfU1VQUE9SVEVEIHdoZXJlIG5lZWRlZCBpbiBwbmd2Y3JkLmMKLSAgQWRkZWQgYSBzcGVjaWFsICJfTVNDX1ZFUiIgY2FzZSB0aGF0IGRlZmluZXMgcG5nX3NucHJpbnRmIHRvIF9zbnByaW50ZgotCi12ZXJzaW9uIDEuMi4xOWJldGE3IFtNYXkgMjIsIDIwMDddCi0gIFNxdWVsY2hlZCBwbmdfc3F1ZWxjaF93YXJuaW5ncygpIGluIHBuZ2djY3JkLmMgYW5kIGFkZGVkIGFuCi0gICAgI2lmZGVmIFBOR19NTVhfQ09ERV9TVVBQT1JURUQgYmxvY2sgYXJvdW5kIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCBjYXVzZWQKLSAgICB0aGUgd2FybmluZ3MgdGhhdCBwbmdfc3F1ZWxjaF93YXJuaW5ncyB3YXMgc3F1ZWxjaGluZy4KLQotdmVyc2lvbiAxLjIuMTliZXRhOCBbTWF5IDIyLCAyMDA3XQotICBSZW1vdmVkIF9fTU1YX18gZnJvbSB0ZXN0IGluIHBuZ2NvbmYuaC4KLQotdmVyc2lvbiAxLjIuMTliZXRhOSBbTWF5IDIzLCAyMDA3XQotICBNYWRlIHBuZ19zcXVlbGNoX3dhcm5pbmdzKCkgYXZhaWxhYmxlIHZpYSBQTkdfU1FVRUxDSF9XQVJOSU5HUyBtYWNyby4KLSAgUmV2aXNlZCBwbmdfc3F1ZWxjaF93YXJuaW5ncygpIHNvIGl0IG1pZ2h0IHdvcmsuCi0gIFVwZGF0ZWQgbWFrZWZpbGUuc2djYyBhbmQgbWFrZWZpbGUuc29sYXJpczsgYWRkZWQgbWFrZWZpbGUuc29sYXJpcy14ODYuCi0KLXZlcnNpb24gMS4yLjE5YmV0YTEwIFtNYXkgMjQsIDIwMDddCi0gIFJlc3F1ZWxjaGVkIHBuZ19zcXVlbGNoX3dhcm5pbmdzKCksIHVzZSAiX19hdHRyaWJ1dGVfXygodXNlZCkpIiBpbnN0ZWFkLgotCi12ZXJzaW9uIDEuMi4xOWJldGExMSBbTWF5IDI4LCAyMDA3XQotICBSZXR1cm4gMCBmcm9tIHBuZ19nZXRfc1BMVCgpIGFuZCBwbmdfZ2V0X3Vua25vd25fY2h1bmtzKCkgaWYgcG5nX3B0ciBpcyBOVUxMOwotICAgIGNoYW5nZWQgdGhyZWUgcmVtYWluaW5nIGluc3RhbmNlcyBvZiBwbmdfc3RyY3B5KCkgdG8gcG5nX3N0cm5jcHkoKSAoRGF2aWQKLSAgICBIaWxsKS4KLSAgTWFrZSB0ZXN0IGZvciBOVUxMIHJvd19idWYgYXQgdGhlIGJlZ2lubmluZyBvZiBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMKLSAgICB1bmNvbmRpdGlvbmFsLgotCi12ZXJzaW9uIDEuMi4xOWJldGExMiBbTWF5IDI4LCAyMDA3XQotICBSZXZpc2VkIHBuZ2djY3JkLmMuCi0KLXZlcnNpb24gMS4yLjE5YmV0YTEzIFtKdW5lIDE0LCAyMDA3XQotICBQcmVmZXIgUE5HX1VTRV9QTkdWQ1JEIHdoZW4gX01TQ19WRVIgaXMgZGVmaW5lZCBpbiBwbmdjb25mLmgKLQotdmVyc2lvbiAxLjIuMTliZXRhMTQgW0p1bmUgMTYsIDIwMDddCi0gIEZpeCBidWcgd2l0aCBoYW5kbGluZyBvZiAxNi1iaXQgdHJhbnNwYXJlbmN5LCBpbnRyb2R1Y2VkIGluIDEuMi4xOWJldGEyCi0KLXZlcnNpb24gMS4yLjE5YmV0YTE1IFtKdW5lIDE3LCAyMDA3XQotICBSZXZpc2VkIHBuZ2djY3JkLmMuCi0KLXZlcnNpb24gMS4yLjE5YmV0YTE2IFtKdW5lIDE4LCAyMDA3XQotICBSZXZpc2VkIHBuZ2djY3JkLmMgYWdhaW4uCi0gIFVwZGF0ZWQgY29udHJpYi9ncmVnYm9vay4KLSAgQ2hhbmdlZCAnI2luY2x1ZGUgInBuZ2djY3JkLmMiJyB0byAnaW5jbHVkZSAiJHNyY2Rpci9wbmdnY2NyZC5jIicKLSAgICBpbiBjb25maWd1cmUuYWMKLQotdmVyc2lvbiAxLjIuMTliZXRhMTcgW0p1bmUgMTksIDIwMDddCi0gIFJldmlzZWQgbWFueSBvZiB0aGUgbWFrZWZpbGVzLCB0byBzZXQgLURQTkdfTk9fTU1YX0NPREUgd2hlcmUgbmVlZGVkCi0gICAgYW5kIHRvIG5vdCB1c2UgLU8zIHVubGVzcyAtRFBOR19OT19NTVhfQ09ERSBpcyBhbHNvIHNldC4KLQotdmVyc2lvbiAxLjIuMTliZXRhMTggW0p1bmUgMjMsIDIwMDddCi0gIFJlcGxhY2VkIHNvbWUgQysrIHN0eWxlIGNvbW1lbnRzIHdpdGggQyBzdHlsZSBjb21tZW50cyBpbiBwbmdnY2NyZC5jLgotICBDb3BpZWQgb3B0aW1pemVkIEMgY29kZSBmcm9tIHBuZ2djY3JkLmMgdG8gcG5ncnV0aWwuYywgcmVtb3ZlZCBkZXBlbmRlbmN5Ci0gICAgb24gcG5nZ2NjcmQubyBmcm9tIG1hbnkgbWFrZWZpbGVzLgotICBBZGRlZCBzbCBhbmQgZHlsaWIgdG8gbGlzdCBvZiBleHRlbnNpb25zIGJlIGluc3RhbGxlZCBieSBNYWtlZmlsZS5hbQotCi12ZXJzaW9uIDEuMi4xOWJldGExOSBbSnVuZSAyOCwgMjAwN10KLSAgRml4ZWQgdGVzdGluZyBQTkdfUkdCX1RPX0dSQVlfRVJSICYgUE5HX1JHQl9UT19HUkFZX1dBUk4gaW4gcG5ncnRyYW4uYwotICBNb3JlIGNsZWFudXAgb2YgcG5nZ2NjcmQuYyBhbmQgcG5ndmNyZC5jCi0KLXZlcnNpb24gMS4yLjE5YmV0YTIwIFtKdW5lIDI5LCAyMDA3XQotICBSZWJ1aWx0IE1ha2VmaWxlLmluIGFuZCBjb25maWd1cmUgdXNpbmcgbGlidG9vbC0xLjUuMjQuCi0gIEZpeGVkIHR5cG8gaW4gcG5nZ2NjcmQuYwotCi12ZXJzaW9uIDEuMi4xOWJldGEyMSBbSnVuZSAzMCwgMjAwN10KLSAgTW9yZSByZXZpc2lvbiBvZiBwbmdnY2NyZC5jCi0gIEFkZGVkICJ0ZXN0IiB0YXJnZXQgdG8gTWFrZWZpbGUuaW4gYW5kIE1ha2VmaWxlLmFtCi0KLXZlcnNpb24gMS4yLjE5YmV0YTIyIFtKdWx5IDMsIDIwMDddCi0gIEFkZGVkIGluZm8gYWJvdXQgcG5ncnV0aWwvcG5nZ2NjcmQvcG5ndmNyZCB0byBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uKCkKLSAgRml4IHR5cGUgZGVmaW5pdGlvbiBvZiBkdW1teV92YWx1ZV9hLCBiIGluIHBuZ2djY3JkLmMKLQotdmVyc2lvbiAxLjIuMTliZXRhMjMgW0p1bHkgMTAsIDIwMDddCi0gIFJldmVydCBjaGFuZ2UgdG8gdHlwZSBkZWZpbml0aW9uIG9mIGR1bW15X3ZhbHVlX2EsIGIgaW4gcG5nZ2NjcmQuYwotICBNYWtlIHN1cmUgX19QSUNfXyBpcyBkZWZpbmVkIGluIHBuZ2djY3JkLmMgd2hlbiBQSUMgaXMgZGVmaW5lZC4KLSAgUmVxdWlyZSBnY2MtNC4xIG9yIGJldHRlciB0byB1c2UgUE5HX0hBVkVfTU1YX0ZJTFRFUl9ST1cgb24geDg2XzY0IHBsYXRmb3JtcwotCi12ZXJzaW9uIDEuMi4xOWJldGEyNCBbSnVseSAxNCwgMjAwN10KLSAgQWRkZWQgUE5HX05PX1JFQURfRklMVEVSLCBQTkdfTk9fV1JJVEVfRklMVEVSLCBQTkdfTk9fV0FSTklORyBtYWNyb3MuCi0gIEFkZGVkIGNvbnRyaWIvcG5nbWluaW0gdG8gZGVtb25zdHJhdGUgYnVpbGRpbmcgbWluaW1hbCBlbmNvZGVyIGFuZCBkZWNvZGVyCi0KLXZlcnNpb24gMS4yLjE5YmV0YTI1IFtKdWx5IDE1LCAyMDA3XQotICBSZW1vdmVkIHRoZSBuZXcgUE5HX05PX1JFQURfRklMVEVSIG1hY3JvIHNpbmNlIGl0IHdvdWxkIG1ha2UgdGhlIGxpYnJhcnkKLSAgICB1bmFibGUgdG8gcmVhZCB2YWxpZCBQTkcgZmlsZXMsIGFuZCBmaWx0ZXJpbmcgaXMgYXQgdGhlIGhlYXJ0IG9mIHRoZQotICAgIFBORyBmb3JtYXQuCi0KLXZlcnNpb24gMS4yLjE5YmV0YTI2IFtKdWx5IDE2LCAyMDA3XQotICBDaGFuZ2VkICJwbmdfZnJlZShzdHIpIiB0byAicG5nX2ZyZWUocG5nX3B0cixzdHIpIiBpbiBwbmdydXRpbC5jIFdpbkNFCi0gICAgY29kZSAoWXZlcyBQaWd1ZXQpLiAgVGhpcyBidWcgd2FzIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMi4xNC4KLSAgVXBkYXRlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0Ci0gIFJlbG9jYXRlZCBhIG1pc3BsYWNlZCAjZW5kaWYgaW4gcG5nZ2NjcmQuYwotCi12ZXJzaW9uIDEuMi4xOWJldGEyNyBbSnVseSAxNywgMjAwN10KLSAgRml4ZWQgaW5jb3JyZWN0IHN0cmlkZSBhbmQgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCAod2FzIDQgaW5zdGVhZCBvZgotICAgIDYgYnl0ZXMpIGluIHRoZSBjbGVhbnVwIGxvb3Agb2YgcG5nZ2NjcmQuYyBhbmQgcG5ndmNyZC5jIGZvciBoYW5kbGluZwotICAgIHRoZSBlbmQgb2YgNDgtYml0IGludGVybGFjZWQgcm93cyAoR2xlbm4gUi1QKS4KLQotdmVyc2lvbiAxLjIuMTliZXRhMjggW0p1bHkgMTksIDIwMDddCi0gIFJlbW92ZWQgcmVxdWlyZW1lbnQgZm9yIGdjYy00LjEgb3IgYmV0dGVyIHRvIHVzZSBQTkdfSEFWRV9NTVhfRklMVEVSX1JPVwotICAgIG9uIHg4Nl82NCBwbGF0Zm9ybXMKLSAgQWRkZWQgcG5nX3dhcm5pbmcoKSBpbiBwbmdydXRpbC5jIGZvciBzaG9ydCBpQ0NQLCBpVFh0LCBzUExULCBvciB6VFhUIGNodW5rcy4KLSAgUmV2aXNlZCBwbmd0ZXN0LmMgc28gd2FybmluZ3MgYXJlIGRpc3BsYXllZCByZWdhcmRsZXNzIG9mIFBOR19OT19TVERJTy4KLQotdmVyc2lvbiAxLjIuMTliZXRhMjkgW0p1bHkgMjAsIDIwMDddCi0gIEZpeCB0eXBvIGluIHBuZ2djY3JkLmMgKCUlZWF4IHNob3VsZCBiZSAlJWF4IGluIHNlY29uZGxvb3A0OCkKLQotdmVyc2lvbiAxLjIuMTliZXRhMzAgW0p1bHkgMjYsIDIwMDddCi0gIFJldmlzZWQgcG5nZ2NjcmQuYwotCi12ZXJzaW9uIDEuMi4xOWJldGEzMSBbSnVseSAyNywgMjAwN10KLSAgRml4IHR5cG9zIGluIHBuZ2djY3JkLmMKLQotdmVyc2lvbiAxLjAuMjdyYzEgYW5kIDEuMi4xOXJjMSBbSnVseSAzMSwgMjAwN10KLSAgRGlzYWJsZSBQTkdfTU1YX0NPREVfU1VQUE9SVEVEIHdoZW4gUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRCBpcyBvZmYuCi0gIEVuYWJsZSBQTkdfTU1YX1JFQURfRklMVEVSXyogYnkgZGVmYXVsdCwgZXhjZXB0IHdoZW4gZ2NjLTMueCBpcyBiZWluZwotICAgIHVzZWQgKHRoZXkgd2VyZSBpbmFkdmVydGVudGx5IGRpc2FibGVkIGluIGxpYnBuZy0xLjIuMTliZXRhMjMpLgotICBGaXggc29tZSBkZWJ1Z2dpbmcgc3RhdGVtZW50cyBpbiBwbmdnY2NyZC5jIGFuZCBwbmdydXRpbC5jCi0gIEFkZGVkIGluZm9ybWF0aW9uIGFib3V0IGRpc2FibGluZyB0aGUgTU1YIGNvZGUgaW4gbGlicG5nIGRvY3VtZW50YXRpb24uCi0KLXZlcnNpb24gMS4wLjI3cmMyIGFuZCAxLjIuMTlyYzIgW0F1Z3VzdCA0LCAyMDA3XQotICBSZW1vdmVkIHNvbWUgIiNpZiAwIiBibG9ja3MuCi0gIE1hZGUgYSBnbG9iYWwgc3RydWN0IGxvY2FsIGluIHBuZ3ZjcmQuYyB0byBtYWtlIGl0IHRocmVhZCBzYWZlLgotICBJc3N1ZSBhIHBuZ19lcnJvcigpIGlmIGFwcGxpY2F0aW9uIGF0dGVtcHRzIHRvIHRyYW5zZm9ybSBhIHJvdyB0aHQKLSAgICBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuCi0KLXZlcnNpb24gMS4wLjI3cmMzIGFuZCAxLjIuMTlyYzMgW0F1Z3VzdCA5LCAyMDA3XQotICBTbGlnaHRseSByZXZpc2VkIHBuZ3ZjcmQuYwotCi12ZXJzaW9uIDEuMC4yN3JjNCBhbmQgMS4yLjE5cmM0IFtBdWd1c3QgOSwgMjAwN10KLSAgUmV2aXNlZCBwbmdnY2NyZC5jIGRlYnVnZ2luZyBjaGFuZ2Ugb2YgcmMxLCB3aGljaCB3YXMgYnJva2VuLgotICBSZXZpc2VkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKLSAgQ2hhbmdlIGRlZmF1bHQgdG8gUE5HX05PX0dMT0JBTF9BUlJBWVMgZm9yIE1TVkMuCi0gIFR1cm4gb2ZmIFBOR19GTEFHX1JPV19JTklUIGZsYWcgd2hlbiBzZXR0aW5nIHRyYW5zZm9ybXMgdGhhdCBleHBhbmQgcGl4ZWxzLgotCi12ZXJzaW9uIDEuMC4yN3JjNSBhbmQgMS4yLjE5cmM1IFtBdWd1c3QgMTAsIDIwMDddCi0gIEZpeCB0eXBvIChtaXNzaW5nICciJykgaW4gcG5nZ2NjcmQuYwotICBSZXZpc2UgaGFuZGxpbmcgb2YgcG5nX3N0cnRvZCBpbiByZWNlbnQgdmVyc2lvbnMgb2YgV0lOQ0UKLQotdmVyc2lvbiAxLjAuMjdyYzYgYW5kIDEuMi4xOXJjNiBbQXVndXN0IDE1LCAyMDA3XQotICBGaXggdHlwbyAobWlzc2luZyAnLCcpIGluIGNvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuYwotICBVbmRpZCByb3cgaW5pdGlhbGl6YXRpb24gZXJyb3IgZXhpdCBhZGRlZCB0byByYzIgYW5kIHJjNC4KLQotdmVyc2lvbiAxLjAuMjcgYW5kIDEuMi4xOSBbQXVndXN0IDE4LCAyMDA3XQotICBDb25kaXRpb25hbGx5IHJlc3RvcmVkIHJvdyBpbml0aWFsaXphdGlvbiBlcnJvciBleGl0LgotCi12ZXJzaW9uIDEuMi4yMGJldGEwMSBbQXVndXN0IDE5LCAyMDA3XQotICBGaXhlZCBwcm9ibGVtIHdpdGggY29tcGlsaW5nIHBuZ2djY3JkLmMgb24gSW50ZWwtQXBwbGUgcGxhdGZvcm1zLgotICBDaGFuZ2VkIHBuZ19tYWxsb2MoKSB0byBwbmdfbWFsbG9jX3dhcm4oKSBpbiBwbmdfc2V0X3NQTFQoKS4KLSAgQWRkZWQgUE5HX05PX0VSUk9SX1RFWFQgZmVhdHVyZSwgd2l0aCBkZW1vIGluIGNvbnRyaWIvcG5nbWluaW0KLSAgUmVtb3ZlZCBkZWZpbmUgUE5HX1dBUk5fVU5JTklUSUFMSVpFRF9ST1cgMSAvKiAwOiB3YXJuaW5nOyAxOiBlcnJvciAqLwotICAgIGJlY2F1c2UgaXQgY2F1c2VkIHNvbWUgdHJvdWJsZS4KLQotdmVyc2lvbiAxLjIuMjBiZXRhMDIgW0F1Z3VzdCAyMCwgMjAwN10KLSAgQXZvaWQgY29tcGlsaW5nIHBuZ2djY3JkLmMgb24gSW50ZWwtQXBwbGUgcGxhdGZvcm1zLgotCi12ZXJzaW9uIDEuMi4yMGJldGEwMyBbQXVndXN0IDIwLCAyMDA3XQotICBBZGRlZCAiL0QgUE5HX05PX01NWF9DT0RFIiB0byB0aGUgbm9uLW1teCBidWlsZHMgb2YgcHJvamVjdHMvdmlzdWFsYzYKLSAgICBhbmQgdmlzdWFsYzcxLgotCi12ZXJzaW9uIDEuMi4yMGJldGEwNCBbQXVndXN0IDIxLCAyMDA3XQotICBSZXZpc2VkIHBuZ3ZjcmQuYyBmb3IgaW1wcm92ZWQgZWZmaWNpZW5jeSAoU3RldmUgU255ZGVyKS4KLQotdmVyc2lvbiAxLjIuMjByYzEgW0F1Z3VzdCAyMywgMjAwN10KLSAgUmV2aXNlZCBwbmdjb25mLmggdG8gc2V0IFBOR19OT19NTVhfQ09ERSBmb3IgZ2NjLTMueCBjb21waWxlcnMuCi0KLXZlcnNpb24gMS4yLjIwcmMyIFtBdWd1c3QgMjcsIDIwMDddCi0gIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dAotICBSZXZpc2VkICNpZmRlZnMgdG8gZW5zdXJlIG9uZSBhbmQgb25seSBvbmUgb2YgcG5nZ2NjcmQuYywgcG5ndmNyZC5jLAotICAgIG9yIHBhcnQgb2YgcG5ncnV0aWwuYyBpcyBzZWxlY3RlZC4KLQotdmVyc2lvbiAxLjIuMjByYzMgW0F1Z3VzdCAzMCwgMjAwN10KLSAgUmVtb3ZlIGEgbGl0dGxlIG1vcmUgY29kZSBpbiBwbmd3dXRpbC5jIHdoZW4gUE5HX05PX1dSSVRFX0ZJTFRFUiBpcyBzZWxlY3RlZC4KLSAgQWRkZWQgL0QgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgdG8gdmlzdWFsNmMgYW5kIHZpc3VhbGM3MSBwcm9qZWN0cy4KLSAgQ29tcGlsZSBwbmdfbW14X3N1cHBvcnQoKSBpbiBwbmcuYyBldmVuIHdoZW4gUE5HX05PX01NWF9DT0RFIGlzIGRlZmluZWQuCi0gIFJlc3RvcmVkIGEgInN1cGVyZmx1b3VzIiAjaWZkZWYgdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIDEuMi4yMHJjMiBwbmdnY2NyZC5jLAotICAgIGJyZWFraW5nIHRoZSBwbmdfbW14X3N1cHBvcnQoKSBmdW5jdGlvbi4KLQotdmVyc2lvbiAxLjIuMjByYzQgW1NlcHRlbWJlciAxLCAyMDA3XQotICBSZW1vdmVkIEludGVsIGNvbnRyaWJ1dGlvbnMgKE1NWCwgT3B0aW1pemVkIEMpLgotCi12ZXJzaW9uIDEuMi4yMHJjNSBbU2VwdGVtYmVyIDIsIDIwMDddCi0gIFJlc3RvcmVkIGNvbmZpZ3VyZSBhbmQgTWFrZWZpbGUuaW4gdG8gcmMzIGFuZCBwdXQgYSBzbmlwcGV0IG9mIGNvZGUgaW4KLSAgICBwbmdnY2NyZC5jLCB0byBlbnN1cmUgY29uZmlndXJlIG1ha2VzIHRoZSBzYW1lIFBOR19OT19NTVhfQ09ERSBzZWxlY3Rpb24KLQotdmVyc2lvbiAxLjIuMjByYzYgW1NlcHRlbWJlciAyLCAyMDA3XQotICBGaXhlZCBidWdzIGluIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKLSAgUmVtb3ZlZCBwbmd2Y3JkLmMgcmVmZXJlbmNlcyBmcm9tIG1zdmMgcHJvamVjdHMuCi0KLXZlcnNpb24gMS4wLjI4IGFuZCAxLjIuMjAgW1NlcHRlbWJlciA4LCAyMDA3XQotICBSZW1vdmVkICIoTk8gUkVBRCBTVVBQT1JUKSIgZnJvbSBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uKCkgc3RyaW5nLgotCi12ZXJzaW9uIDEuMi4yMWJldGExIFtTZXB0ZW1iZXIgMTQsIDIwMDddCi0gIEZpeGVkIHZhcmlvdXMgbWlzdGFrZXMgcmVwb3J0ZWQgYnkgR2VvcmdlIENvb2sgYW5kIEplZmYgUGhpbGxpcHM6Ci0gIGxvZ2ljYWwgdnMgYml0d2lzZSBOT1QgaW4gcG5ncnRyYW4uYywgYnVnIGludHJvZHVjZWQgaW4gMS4yLjE5cmMyCi0gIDE2LWJpdCBjaGVhcCB0cmFuc3BhcmVuY3kgZXhwYW5zaW9uLCBidWcgaW50cm9kdWNlZCBpbiAxLjIuMTliZXRhMgotICBlcnJvcnMgd2l0aCBzaXplb2YodW5rbm93bl9jaHVuay5uYW1lKSwgYnVncyBpbnRyb2R1Y2VkIGluIDEuMi4xOWJldGExMQotICA8PSBjb21wYXJlIHdpdGggdW5zaWduZWQgdmFyIGluIHBuZ3NldC5jLCBzaG91bGQgYmUgPT0uCi0KLXZlcnNpb24gMS4yLjIxYmV0YTIgW1NlcHRlbWJlciAxOCwgMjAwN10KLSAgUmVtb3ZlZCBzb21lIGV4dHJhbmVvdXMgdHlwZWNhc3RzLgotCi12ZXJzaW9uIDEuMi4yMXJjMSBbU2VwdGVtYmVyIDI1LCAyMDA3XQotICBGaXhlZCBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyByZWFkcyBpbiBwbmdfaGFuZGxlX3BDQUwoKSBhbmQKLSAgICBwbmdfaGFuZGxlX3p0WHQoKSAoImZsYXllciIgcmVzdWx0cyByZXBvcnRlZCBieSBUYXZpcyBPcm1hbmR5KS4KLQotdmVyc2lvbiAxLjIuMjFyYzIgW1NlcHRlbWJlciAyNiwgMjAwN10KLSAgRml4ZWQgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgcmVhZHMgaW4gcG5nX2hhbmRsZV9zQ0FMKCksCi0gICAgcG5nX2hhbmRsZV9pVFh0KCksIGFuZCBwbmdfcHVzaF9yZWFkX3RFWHQoKS4KLSAgUmVtb3ZlIHNvbWUgUE5HX0NPTlNUIGRlY2xhcmF0aW9ucyBmcm9tIHBuZ3d1dGlsLmMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKLSAgUmV2aXNlZCBtYWtlZmlsZXMgdG8gdXBkYXRlIHBhdGhzIGluIGxpYnBuZy5wYyBwcm9wZXJseS4KLQotdmVyc2lvbiAxLjIuMjFyYzMgW1NlcHRlbWJlciAyNywgMjAwN10KLSAgUmV2aXNlZCBtYWtlZmlsZXMgdG8gdXBkYXRlICJMaWJzIiBpbiBsaWJwbmcucGMgcHJvcGVybHkuCi0KLXZlcnNpb24gMS4wLjI5IGFuZCAxLjIuMjFyYzMgW09jdG9iZXIgNCwgMjAwN10KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjIuMjJiZXRhMSBbT2N0b2JlciA0LCAyMDA3XQotICBBZ2FpbiwgZml4ZWQgbG9naWNhbCB2cyBiaXR3aXNlIE5PVCBpbiBwbmdydHJhbi5jLCBidWcgaW50cm9kdWNlZAotICAgIGluIDEuMi4xOXJjMgotCi12ZXJzaW9uIDEuMi4yMmJldGEyIFtPY3RvYmVyIDUsIDIwMDddCi0gIEZpeGVkIHN0cmluZyBsZW5ndGggZXJyb3IgaW4gcG5nc2V0LmMgKGNhdXNlZCBjcmFzaGVzIHdoaWxlIGRlY29kaW5nIGlDQ1ApCi0gIEFkZCB0ZXJtaW5hdGluZyBOVUxMIGFmdGVyIGVhY2ggaW5zdGFuY2Ugb2YgcG5nX3N0cm5jcHkoKS4KLQotdmVyc2lvbiAxLjIuMjJiZXRhMyBbT2N0b2JlciA2LCAyMDA3XQotICBGaXggdHdvIG9mZi1ieS1vbmUgdGVybWluYXRpbmcgTlVMTCBhZnRlciBwbmdfc3RybmNweSgpLgotCi12ZXJzaW9uIDEuMi4yMmJldGE0IFtPY3RvYmVyIDcsIDIwMDddCi0gIENoYW5nZWQgc29tZSAwIHRvICdcMCcuCi0KLXZlcnNpb24gMS4wLjMwcmMxIGFuZCAxLjIuMjJyYzEgW09jdG9iZXIgOCwgMjAwN10KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjAuMzAgYW5kIDEuMi4yMiBbT2N0b2JlciAxMywgMjAwN10KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjIuMjNiZXRhMDEgW09jdG9iZXIgMTUsIDIwMDddCi0gIFJlZHVjZWQgbnVtYmVyIG9mIGludm9jYXRpb25zIG9mIHBuZ19zdHJsZW4oKSBpbiBwbmdzZXQuYy4KLSAgQ2hhbmdlZCBbYXpBWjA5X10gdG8gW19hYmNkZS4uLjg5XSBpbiBNYWtlZmlsZS5hbSBmb3IgYmV0dGVyIGxvY2FsaXphdGlvbi4KLQotdmVyc2lvbiAxLjIuMjNiZXRhMDIgW09jdG9iZXIgMTYsIDIwMDddCi0gIEVsaW1pbmF0ZWQgcG5nX3N0cm5jcHkoKSBhbmQgcG5nX3N0cmNweSgpIChQaWVycmUgUG9pc3NpbmdlcikKLSAgQ2hhbmdlZCAkQU4gdG8gJChBTikgaW4gTWFrZWZpbGUuYW0uCi0KLXZlcnNpb24gMS4yLjIzYmV0YTAzIFtPY3RvYmVyIDE2LCAyMDA3XQotICBGaXhlZCBvZmYtYnktb25lIGVycm9yIGluIHBuZ3NldC5jCi0gIFJlc3RvcmUgc3RhdGVtZW50IHRvIHNldCBsYXN0IGNoYXJhY3RlciBvZiBidWZmZXIgdG8gXDAgaW4gcG5nZXJyb3IuYwotCi12ZXJzaW9uIDEuMi4yM2JldGEwNCBbT2N0b2JlciAyMywgMjAwN10KLSAgUmVqZWN0IGF0dGVtcHQgdG8gc2V0IGFsbC16ZXJvIGNIUk0gdmFsdWVzLgotCi12ZXJzaW9uIDEuMi4yM2JldGEwNSBbT2N0b2JlciAyNiwgMjAwN10KLSAgQWRkIG1pc3NpbmcgcXVvdGVzIGluIHByb2plY3RzL3Zpc3VhbGM2LCBsb3N0IGluIHZlcnNpb24gMS4yLjIwcmMzCi0KLXZlcnNpb24gMS4yLjIzcmMwMSBbTm92ZW1iZXIgMiwgMjAwN10KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjIuMjMgW05vdmVtYmVyIDYsIDIwMDddCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS4yLjI0YmV0YTAxIFtOb3ZlbWJlciAxOSwgMjAwN10KLSAgTW92ZWQgbWlzcGxhY2VkIHRlc3QgZm9yIG1hbGxvYyBmYWlsdXJlIGluIHBuZ19zZXRfc1BMVCgpLiAgVGhpcyBidWcgd2FzCi0gICAgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjIwYmV0YTAxLgotICBJZmRlZiBvdXQgYXZnX3JvdyBldGMgZnJvbSBwbmcuaCBhbmQgcG5nd3JpdGUuYyB3aGVuIFBOR19OT19XUklURV9GSUxURVIKLSAgRG8gbm90IHVzZSBwbmdfcHRyLT5mcmVlX2ZuIGFuZCBwbmdfcHRyLT5tZW1fZm4gaW4gcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKQotICAgIHdoZW4gcG5nX3B0ciBpcyBOVUxMIChNYXJzaGFsbCBDbG93KS4KLSAgVXBkYXRlZCBoYW5kbGluZyBvZiBzeW1ib2wgcHJlZml4ZXMgaW4gTWFrZWZpbGUuYW0gYW5kIGNvbmZpZ3VyZS5hYyAoTWlrZQotICAgIEZyeXNpbmdlcikuCi0KLXZlcnNpb24gMS4yLjI0YmV0YTAyIFtOb3ZlbWJlciAzMCwgMjAwN10KLSAgUmVtb3ZlZCBhIHVzZWxlc3MgdGVzdCBhbmQgZml4ZWQgaW5jb3JyZWN0IHRlc3QgaW4gcG5nX3NldF9jSFJNX2ZpeGVkKCkKLSAgICAoRGF2aWQgSGlsbCkuCi0KLXZlcnNpb24gMS4yLjI0cmMwMSBbRGVjZW1iZXIgNywgMjAwN10KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjIuMjQgICAgIFtEZWNlbWJlciAxNCwgMjAwN10KLSAgTWFrZSBzdXJlIG5vdCB0byByZWRlZmluZSBfQlNEX1NPVVJDRSBpbiBwbmdjb25mLmgKLSAgUmV2aXNlZCBnYXRoZXIuc2ggYW5kIG1ha2VmaWxlLnN0ZCBpbiBjb250cmliL3BuZ21pbmltIHRvIGF2b2lkIGNvbXBpbGluZwotICAgIHVudXNlZCBmaWxlcy4KLQotdmVyc2lvbiAxLjIuMjViZXRhMDEgW0phbnVhcnkgNywgMjAwOF0KLSAgRml4ZWQgYnVnIHdpdGggdW5rbm93biBjaHVuayBoYW5kbGluZywgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEuMi4xN3JjMgotCi12ZXJzaW9uIDEuMi4yNWJldGEwMiBbSmFudWFyeSAxMCwgMjAwOF0KLSAgUHJldmVudCBnYW1tYSBmcm9tIGJlaW5nIGFwcGxpZWQgdHdpY2UuCi0KLXZlcnNpb24gMS4yLjI1cmMwMSBbSmFudWFyeSAxNywgMjAwOF0KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjIuMjViZXRhMDMgW0phbnVhcnkgMjIsIDIwMDhdCi0gIEZpeGVkIHNvbWUgY29udGludWUtYWZ0ZXItbWFsbG9jLWZhaWx1cmUgZXJyb3JzIGluIHBuZ3NldC5jIChEYXZpZCBIaWxsKQotICBDaGVjayBmb3IgaW5mb19wdHIgPT0gTlVMTCBpbiBwbmdfcmVhZF9pbmZvKCkgYW5kIHBuZ19wcm9jZXNzX2RhdGEoKS4KLSAgQ2hlY2sgZm9yIHBvc3NpYmxlIHVzZSBvZiBOVUxMIHVzZXJfcG5nX3ZlcltdIGluIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoKS4KLSAgQ2hhbmdlICJpZiAoc3dpZHRoID09IE5VTEwpIiB0byAiaWYgKHNoZWlnaHQgPT0gTlVMTCkiIGluIHBuZ19oYW5kbGVfc0NBTAotICAgIChidWcgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjQvMS4wLjEzKS4KLSAgUmV0dXJuIGZyb20gcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSBpZiBwbmdfcHRyX3B0ciBpcyBOVUxMLgotICBGaXggb3ZlcmZsb3cgb2YgIm1zZyIgaW4gcG5nX2RlY29tcHJlc3NfY2h1bmsoKS4KLQotdmVyc2lvbiAxLjIuMjViZXRhMDQgW0phbnVhcnkgMjYsIDIwMDhdCi0gIFdvcmsgYXJvdW5kIENvdmVyaXR5IGJ1ZyByZXBvcnQgYnkgc2xpZ2h0bHkgcmVmYWN0b3JpbmcKLSAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3coKQotCi12ZXJzaW9uIDEuMi4yNWJldGEwNSBbSmFudWFyeSAzMSwgMjAwOF0KLSAgQWRkZWQgbGlicG5nLTEuMi4yNWJldGEwNS50YXIubHptYSB0byBkaXN0cmlidXRpb24uICBHZXQgdGhlIGx6bWEgY29kZWMKLSAgICBmcm9tIDxodHRwOi8vdHVrYWFuaS5vcmcvbHptYT4uCi0gIEFkZGVkIGxwMTIyNWIwNS43eiB0byBkaXN0cmlidXRpb24uICBHZXQgdGhlIDctemlwIGRlY29kZXIgZnJvbQotICAgIGZyb20gPGh0dHA6Ly93d3cuNy16aXAub3JnPi4KLSAgRml4ZWQgc29tZSBicm9rZW4gbGlua3MgaW4gdGhlIFJFQURNRSBmaWxlLgotCi12ZXJzaW9uIDEuMi4yNWJldGEwNiBbRmVicnVhcnkgNiwgMjAwOF0KLSAgUmVmYWN0b3JlZCBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3coKSBhZ2FpbiwgdHJ5aW5nIHRvIHNhdGlzZnkgQ292ZXJpdHkuCi0gIEZpeGVkIHBvdGVudGlhbCBOVUxMIGRlcmVmZXJlbmNlIG9mIHBuZ19wdHIgaW4gcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCk7Ci0gIGNsYXJpZmllZCBwb3RlbnRpYWwgTlVMTCBkZXJlZmVyZW5jZSBvZiBwbmdfcHRyIGluIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCk7Ci0gIGZpeGVkIHBvdGVudGlhbCBOVUxMIGRlcmVmZXJlbmNlIG9mIGluZm9fcHRyIGluIHBuZ19oYW5kbGVfYktHRCgpOwotICBmaXhlZCBwb3RlbnRpYWwgTlVMTCBkZXJlZmVyZW5jZSBvZiB1c2VyX3BuZ192ZXJbXSBpbgotICAgIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKS4gKENvdmVyaXR5KQotCi12ZXJzaW9uIDEuMi4yNXJjMDIgW0ZlYnJ1YXJ5IDEwLCAyMDA4XQotICBSZXNldCBwbmdfcHRyLT5wYXNzIGluIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdygpIGJlZm9yZSBicmVhay4KLSAgQ2hhbmdlZCAicGFzcyIgZnJvbSBwbmdfYnl0ZSB0byBpbnQuCi0KLXZlcnNpb24gMS4yLjI1IGFuZCAxLjAuMzEgW0ZlYnJ1YXJ5IDE4LCAyMDA4XQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuMi4yNmJldGEwMSBbRmVicnVhcnkgMjEsIDIwMDhdCi0gIEFkZGVkIG1pc3NpbmcgIigiIGluIHBuZ21lbS5jLiAgQnVnIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMi4yLzEuMC4xMwotCi12ZXJzaW9uIDEuMi4yNmJldGEwMiBbTWFyY2ggMTIsIDIwMDhdCi0gIFJlZmluZWQgZXJyb3IgbWVzc2FnZSByZXR1cm5lZCBmcm9tIGRlZmxhdGVJbml0MiBpbiBwbmd3dXRpbC5jCi0gIENoZWNrIElIRFIgbGVuZ3RoIGluIHBuZ19wdXNoX3JlYWRfY2h1bmsoKSBiZWZvcmUgc2F2aW5nIGl0LgotCi12ZXJzaW9uIDEuMi4yNmJldGEwMyBbTWFyY2ggMTYsIDIwMDhdCi0gIFJldmlzZWQgY29udHJpYi9ncmVnYm9vayB0byBoYW5kbGUgcHJlbWF0dXJlIGVuZC1vZi1maWxlIGFuZCBmaWxlCi0gICAgcmVhZCBlcnJvcnMgY29ycmVjdGx5LgotCi12ZXJzaW9uIDEuMi4yNmJldGEwNCBbTWFyY2ggMTgsIDIwMDhdCi0gIEZyZWUgcG5nX3B0ci0+YmlnX3Jvd19idWYgYW5kIHBuZ19wdHItPnByZXZfcm93IGJlZm9yZSBhbGxvY2F0aW5nCi0gICAgbmV3IGNvcGllcyBpbiBwbmdfcmVhZF9zdGFydF9yb3coKS4gIEJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuMjIuCi0KLXZlcnNpb24gMS4yLjI2YmV0YTA1IFtNYXJjaCAxOSwgMjAwOF0KLSAgUmVtb3ZlZCBleHRyYSBwbmdfZnJlZSgpIGFkZGVkIGluIGxpYnBuZy0xLjIuMjZiZXRhMDQuCi0KLXZlcnNpb24gMS4yLjI2YmV0YTA2IFtNYXJjaCAxOSwgMjAwOF0KLSAgQXZvaWQgcmVhbGxvY2F0aW5nIGJpZ19yb3dfYnVmIGFuZCBwcmV2X3JvdyB3aGVuIHRoZSBzaXplIGRvZXMgbm90IGluY3JlYXNlLgotCi12ZXJzaW9uIDEuMi4yNnJjMDEgW01hcmNoIDI2LCAyMDA4XQotICBJZmRlZiBvdXQgc29tZSBjb2RlIHRoYXQgaXMgdW51c2VkIHdoZW4gaW50ZXJsYWNpbmcgaXMgbm90IHN1cHBvcnRlZC4KLQotdmVyc2lvbnMgMS4wLjMyIGFuZCAxLjIuMjYgW0FwcmlsIDIsIDIwMDhdCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS4yLjI3YmV0YTAxIFtBcHJpbCAxMiwgMjAwOF0KLSAgRml4ZWQgYnVnIChpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjAuNWgpIHdpdGggaGFuZGxpbmcgemVyby1sZW5ndGgKLSAgICB1bmtub3duIGNodW5rcy4KLSAgQWRkZWQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSB0byB0aGUKLSAgICBkb2N1bWVudGF0aW9uLgotICBSZWplY3QgdFJOUyBjaHVuayB3aXRoIG91dC1vZi1yYW5nZSBzYW1wbGVzIGluc3RlYWQgb2YgbWFza2luZyBvZmYKLSAgICB0aGUgaW52YWxpZCBoaWdoIGJpdHMgYXMgZG9uZSBpbiBzaW5jZSBsaWJwbmctMS4yLjE5YmV0YTUuCi0KLXZlcnNpb24gMS4yLjI3YmV0YTAyIFtBcHJpbCAxMywgMjAwOF0KLSAgUmV2aXNlZCBkb2N1bWVudGF0aW9uIGFib3V0IHVua25vd24gY2h1bmsgYW5kIHVzZXIgY2h1bmsgaGFuZGxpbmcuCi0gIEtlZXAgdFJOUyBjaHVuayB3aXRoIG91dC1vZi1yYW5nZSBzYW1wbGVzIGFuZCBpc3N1ZSBhIHBuZ193YXJuaW5nKCkuCi0KLXZlcnNpb24gMS4yLjI3YmV0YTAzIFtBcHJpbCAxNCwgMjAwOF0KLSAgQWRkZWQgY2hlY2sgZm9yIE5VTEwgcHRyIGluIFRVUkJPQyB2ZXJzaW9uIG9mIHBuZ19mcmVlX2RlZmF1bHQoKS4KLSAgUmVtb3ZlZCBzZXZlcmFsIHVubmVjZXNzYXJ5IGNoZWNrcyBmb3IgTlVMTCBiZWZvcmUgY2FsbGluZyBwbmdfZnJlZSgpLgotICBSZXZpc2VkIHBuZ19zZXRfdFJOUygpIHNvIHRoYXQgY2FsbGluZyBpdCB0d2ljZSByZW1vdmVzIGFuZCBpbnZhbGlkYXRlcwotICAgIHRoZSBwcmV2aW91cyBjYWxsLgotICBSZXZpc2VkIHBuZ3Rlc3QgdG8gY2hlY2sgZm9yIG91dC1vZi1yYW5nZSB0Uk5TIHNhbXBsZXMuCi0KLXZlcnNpb24gMS4yLjI3YmV0YTA0IFtBcHJpbCAxOCwgMjAwOF0KLSAgQWRkZWQgQUNfTElCVE9PTF9XSU4zMl9ETEwgdG8gY29uZmlndXJlLmFjCi0gIFJlYnVpbHQgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQsIGFuZCBjb25maWd1cmUgd2l0aCBhdXRvY29uZi0yLjYyCi0KLXZlcnNpb24gMS4yLjI3YmV0YTA1IFtBcHJpbCAxOSwgMjAwOF0KLSAgQWRkZWQgTUFJTlRBSU5FUkNMRUFORklMRVMgdmFyaWFibGUgdG8gTWFrZWZpbGUuYW0KLQotdmVyc2lvbiAxLjIuMjdiZXRhMDYgW0FwcmlsIDIxLCAyMDA4XQotICBBdm9pZCBjaGFuZ2luZyBjb2xvcl90eXBlIGZyb20gR1JBWSB0byBSR0IgYnkKLSAgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKS4KLQotdmVyc2lvbiAxLjIuMjdyYzAxIFtBcHJpbCAyMywgMjAwOF0KLSAgRml4IGJyb2tlbiBVUkwgZm9yIHJmYzIwODMgaW4gcG5nLjUgYW5kIGxpYnBuZy0qLnR4dAotCi12ZXJzaW9uIDEuMC4zMyBhbmQgMS4yLjI3IFtBcHJpbCAzMCwgMjAwOF0KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjAuMzQgYW5kIDEuMi4yOCBbQXByaWwgMzAsIDIwMDhdCi0gIFJlYnVpbHQgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQsIGFuZCBjb25maWd1cmUgd2l0aCBhdXRvY29uZi0yLjYxCi0gICAgZHVlIHRvIGJhY2t3YXJkIGluY29tcGF0aWJpbGl0aWVzLgotICBSZW1vdmVkIGEgc3RyYXkgb2JqZWN0IGZpbGUgZnJvbSBjb250cmliL2dyZWdib29rCi0KLXZlcnNpb24gMS4yLjI5YmV0YTAxIFtNYXkgMSwgMjAwOF0KLSAgUmVtb3ZlZCBzb21lIHN0cmF5ICouZGlmZiBhbmQgKi5vcmlnIGZpbGVzCi0KLXZlcnNpb24gMS4yLjI5YmV0YTAyIFtNYXkgMSwgMjAwOF0KLSAgUmV2ZXJ0ZWQgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQsIGFuZCBjb25maWd1cmUgdG8gdGhlIGxpYnBuZy0xLjIuMjYKLSAgICB2ZXJzaW9ucy4KLQotdmVyc2lvbiAxLjIuMjliZXRhMDMgW01heSAyLCAyMDA4XQotICBBZGRlZCAtLWZvcmNlIHRvIGF1dG9nZW4gbGlidG9vbGl6ZSBvcHRpb25zIGFuZCAtLWZvcmNlLW1pc3NpbmcgdG8KLSAgICBhdXRvbWFrZSBvcHRpb25zLgotICBDaGFuZ2VkICQoRUNITykgdG8gZWNobyBpbiBNYWtlZmlsZS5hbSBhbmQgTWFrZWZpbGUuaW4KLSAgVXBkYXRlZCBhbGwgY29uZmlndXJlIGZpbGVzIHRvIGF1dG9jb25mLTIuNjIKLSAgI2lmZGVmIG91dCBwbmdnY3JkLmMgY29kZSBpZiB1c2luZyBNU0NfVkVSCi0KLXZlcnNpb24gMS4yLjI5cmMwMSBbTWF5IDQsIDIwMDhdCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS4wLjM1IGFuZCAxLjIuMjkgW01heSA4LCAyMDA4XQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuMC4zNyBbTWF5IDksIDIwMDhdCi0gIFVwZGF0ZWQgTWFrZWZpbGUuaW4gYW5kIGNvbmZpZ3VyZSAob21pdHRlZCB2ZXJzaW9uIDEuMC4zNikuCi0KLXZlcnNpb24gMS4yLjMwYmV0YTAxIFtNYXkgMjksIDIwMDhdCi0gIFVwZGF0ZWQgbGlicG5nLnBjLWNvbmZpZ3VyZS5pbiBhbmQgbGlicG5nLWNvbmZpZy5pbiBwZXIgZGViaWFuIGJ1ZyByZXBvcnRzLgotCi12ZXJzaW9uIDEuMi4zMGJldGEwMiBbSnVuZSAyNSwgMjAwOF0KLSAgUmVzdG9yZWQgcG5nX2ZsdXNoKHBuZ19wdHIpIGF0IHRoZSBlbmQgb2YgcG5nX3dyaXRlX2VuZCgpLCB0aGF0IHdhcwotICAgIHJlbW92ZWQgZnJvbSBsaWJwbmctMS4wLjliZXRhMDMuCi0KLXZlcnNpb24gMS4yLjMwYmV0YTAzIFtKdWx5IDYsIDIwMDhdCi0gIE1lcmdlZCBzb21lIGNvc21ldGljIHdoaXRlc3BhY2UgY2hhbmdlcyBmcm9tIGxpYnBuZy0xLjQuMGJldGExOS4KLSAgSW5saW5lIGNhbGwgb2YgcG5nX2dldF91aW50XzMyKCkgaW4gcG5nX2dldF91aW50XzMxKCksIGFzIGluIDEuNC4wYmV0YTE5LgotICBBZGRlZCBkZW1vIG9mIGRlY29kaW5nIHZwQWcgYW5kIHNURVIgY2h1bmtzIHRvIHBuZ3Rlc3QuYywgZnJvbSAxLjQuMGJldGExOS4KLSAgQ2hhbmdlZCBQTkdNQUogZnJvbSAwIHRvIDEyIGluIG1ha2VmaWxlLmRhcndpbiwgd2hpY2ggZG9lcyBub3QgbGlrZSAwLgotICBBZGRlZCBuZXcgcHJpdmF0ZSBmdW5jdGlvbiBwbmdfcmVhZF9jaHVua19oZWFkZXIoKSBmcm9tIDEuNC4wYmV0YTE5LgotICBNZXJnZSByZWFkaW5nIG9mIGNodW5rIGxlbmd0aCBhbmQgY2h1bmsgdHlwZSBpbnRvIGEgc2luZ2xlIDgtYnl0ZSByZWFkLgotICBNZXJnZSB3cml0aW5nIG9mIGNodW5rIGxlbmd0aCBhbmQgY2h1bmsgdHlwZSBpbnRvIGEgc2luZ2xlIDgtYnl0ZSB3cml0ZS4KLQotdmVyc2lvbiAxLjIuMzBiZXRhMDQgW0p1bHkgMTAsIDIwMDhdCi0gIE1lcmdlZCBtb3JlIGNvc21ldGljIHdoaXRlc3BhY2UgY2hhbmdlcyBmcm9tIGxpYnBuZy0xLjQuMGJldGExOS4KLQotdmVyc2lvbiAxLjAuMzhyYzAxLCAxLjIuMzByYzAxIFtKdWx5IDE4LCAyMDA4XQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuMC4zOHJjMDIsIDEuMi4zMHJjMDIgW0p1bHkgMjEsIDIwMDhdCi0gIE1vdmVkIGxvY2FsIGFycmF5ICJjaHVua2RhdGEiIGZyb20gcG5ncnV0aWwuYyB0byB0aGUgcG5nX3N0cnVjdCwgc28KLSAgICBpdCB3aWxsIGJlIGZyZWVkIGJ5IHBuZ19yZWFkX2Rlc3Ryb3koKSBpbiBjYXNlIG9mIGEgcmVhZCBlcnJvciAoS3VydAotICAgIENocmlzdGVuc2VuKS4KLQotdmVyc2lvbiAxLjAuMzhyYzAzLCAxLjIuMzByYzAzIFtKdWx5IDIxLCAyMDA4XQotICBDaGFuZ2VkICJwdXJwb3NlIiBhbmQgImJ1ZmZlciIgdG8gcG5nX3B0ci0+Y2h1bmtkYXRhIHRvIGF2b2lkIG1lbW9yeSBsZWFraW5nLgotCi12ZXJzaW9uIDEuMC4zOHJjMDQsIDEuMi4zMHJjMDQgW0p1bHkgMjIsIDIwMDhdCi0gIENoYW5nZWQgImNodW5rZGF0YSA9IE5VTEwiIHRvICJwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMIiBzZXZlcmFsIHBsYWNlcyBpbgotICAgIHBuZ19kZWNvbXByZXNzX2NodW5rKCkuCi0KLXZlcnNpb24gMS4wLjM4cmMwNSwgMS4yLjMwcmMwNSBbSnVseSAyNSwgMjAwOF0KLSAgQ2hhbmdlZCBhbGwgcmVtYWluaW5nICJjaHVua2RhdGEiIHRvICJwbmdfcHRyLT5jaHVua2RhdGEiIGluCi0gICAgcG5nX2RlY29tcHJlc3NfY2h1bmsoKSBhbmQgcmVtb3ZlIGNodW5rZGF0YSBmcm9tIHBhcmFtZXRlciBsaXN0LgotICBQdXQgYSBjYWxsIHRvIHBuZ19jaGVja19jaHVua19uYW1lKCkgaW4gcG5nX3JlYWRfY2h1bmtfaGVhZGVyKCkuCi0gIFJldmlzZWQgcG5nX2NoZWNrX2NodW5rX25hbWUoKSB0byByZWplY3QgYSBuYW1lIHdpdGggYSBsb3dlcmNhc2UgM3JkIGJ5dGUuCi0gIFJlbW92ZWQgdHdvIGNhbGxzIHRvIHBuZ19jaGVja19jaHVua19uYW1lKCkgb2NjdXJpbmcgbGF0ZXIgaW4gdGhlIHByb2Nlc3MuCi0KLXZlcnNpb24gMS4wLjM4cmMwNiwgMS4yLjMwcmMwNiBbSnVseSAyOSwgMjAwOF0KLSAgQWRkZWQgYSBjYWxsIHRvIHBuZ19jaGVja19jaHVua19uYW1lKCkgaW4gcG5ncHJlYWQuYwotICBSZXZlcnRlZCBwbmdfY2hlY2tfY2h1bmtfbmFtZSgpIHRvIGFjY2VwdCBhIG5hbWUgd2l0aCBhIGxvd2VyY2FzZSAzcmQgYnl0ZS4KLQotdmVyc2lvbiAxLjAuMzhyMDcsIDEuMi4zMHIwNyBbQXVndXN0IDIsIDIwMDhdCi0gIENoYW5nZWQgIi1XYWxsIiB0byAiLVcgLVdhbGwiIGluIHRoZSBDRkxBR1MgaW4gYWxsIG1ha2VmaWxlcyAoQ29zbWluIFRydXRhKQotICBEZWNsYXJlZCBwbmdfcHRyICJ2b2xhdGlsZSIgaW4gcG5ncmVhZC5jIGFuZCBwbmd3cml0ZS5jIHRvIGF2b2lkIHdhcm5pbmdzLgotICBBZGRlZCBjb2RlIGluIHBuZ3NldC5jIHRvIHF1aWV0IGNvbXBpbGVyIHdhcm5pbmdzLgotICBVcGRhdGVkIGNvbnRyaWIvdmlzdXBuZy9jZXhjZXB0LmggdG8gdmVyc2lvbiAyLjAuMQotICBSZWxvY2F0ZWQgYSBtaXNwbGFjZWQgIiNlbmRpZiAvKiBQTkdfTk9fV1JJVEVfRklMVEVSICovIiBpbiBwbmd3dXRpbC5jCi0KLXZlcnNpb24gMS4wLjM4cjA4LCAxLjIuMzByMDggW0F1Z3VzdCAyLCAyMDA4XQotICBFbmNsb3NlICJ2b2xhdGlsZSIgZGVjbGFyYXRpb25zIGluICNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRCAoQ29zbWluKS4KLQotdmVyc2lvbiAxLjAuMzgsIDEuMi4zMCBbQXVndXN0IDE0LCAyMDA4XQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuMi4zMXJjMDEgW0F1Z3VzdCAxOSwgMjAwOF0KLSAgUmVtb3ZlZCBleHRyYSBjcmMgY2hlY2sgYXQgdGhlIGVuZCBvZiBwbmdfaGFuZGxlX2NIUk0oKS4gIEJ1ZyBpbnRyb2R1Y2VkCi0gICAgaW4gbGlicG5nLTEuMi4zMGJldGEwMyAoSGVpa28gTml0enNjaGUpLgotCi12ZXJzaW9uIDEuMi4zMXJjMDIgW0F1Z3VzdCAxOSwgMjAwOF0KLSAgQWRkZWQgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCBibG9jayBhcm91bmQgbmV3IHBuZ19mbHVzaCgpIGNhbGwuCi0KLXZlcnNpb24gMS4yLjMxcmMwMyBbQXVndXN0IDE5LCAyMDA4XQotICBBZGRlZCBQTkdfV1JJVEVfRkxVU0hfQUZURVJfSUVORF9TVVBQT1JURUQgYmxvY2ssIG9mZiBieSBkZWZhdWx0LCBhcm91bmQKLSAgICBuZXcgcG5nX2ZsdXNoKCkuCi0KLXZlcnNpb24gMS4wLjM5LCAxLjIuMzEgW0F1Z3VzdCAyMSwgMjAwOF0KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjIuMzJiZXRhMDEgW1NlcHRlbWJlciA2LCAyMDA4XQotICBTaG9ydGVuZWQgdElNRV9zdHJpbmcgdG8gMjkgYnl0ZXMgaW4gcG5ndGVzdC5jIChidWcgaW50cm9kdWNlZCBpbgotICAgIGxpYnBuZy0xLjIuMjIpLgotICBGaXhlZCBvZmYtYnktb25lIGVycm9yIGludHJvZHVjZWQgaW4gcG5nX3B1c2hfcmVhZF96VFh0KCkgZnVuY3Rpb24gaW4KLSAgICBsaWJwbmctMS4yLjMwYmV0YTA0L3BuZ3ByZWFkLmMgKEhhcmFsZCB2YW4gRGlqaykKLSAgVGhlc2UgYnVncyBoYXZlIGJlZW4gZ2l2ZW4gdGhlIHZ1bG5lcmFiaWxpdHkgaWQgQ1ZFLTIwMDgtMzk2NC4KLQotdmVyc2lvbiAxLjAuNDAsIDEuMi4zMiBbU2VwdGVtYmVyIDE4LCAyMDA4XQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuMi4zM2JldGEwMSBbT2N0b2JlciA2LCAyMDA4XQotICBSZXZpc2VkIG1ha2VmaWxlLmRhcndpbiB0byBmaXggc2hhcmVkIGxpYnJhcnkgbnVtYmVyaW5nLgotICBDaGFuZ2UgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSB0byBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKQotICAgIGluIGV4YW1wbGUuYyAoZGViaWFuIGJ1ZyByZXBvcnQpCi0KLXZlcnNpb24gMS4yLjMzcmMwMSBbT2N0b2JlciAxNSwgMjAwOF0KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjAuNDFyYzAxLCB2ZXJzaW9uIDEuMi4zM3JjMDIgW09jdG9iZXIgMjMsIDIwMDhdCi0gIENoYW5nZWQgcmVtYWluaW5nICJrZXkiIHRvICJwbmdfcHRyLT5jaHVua2RhdGEiIGluIHBuZ19oYW5kbGVfdEVYdCgpCi0gICAgdG8gYXZvaWQgbWVtb3J5IGxlYWsgYWZ0ZXIgbWVtb3J5IGZhaWx1cmUgd2hpbGUgcmVhZGluZyB0RVh0IGNodW5rLmAKLQotdmVyc2lvbiAxLjIuMzMgW09jdG9iZXIgMzEsIDIwMDhdCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS4yLjM0YmV0YTAxIFtOb3ZlbWJlciAyNywgMjAwOF0KLSAgUmV2aXNlZCBwbmdfd2FybmluZygpIHRvIHdyaXRlIGl0cyBtZXNzYWdlIG9uIHN0YW5kYXJkIG91dHB1dCBieSBkZWZhdWx0Ci0gICAgd2hlbiB3YXJuaW5nX2ZuIGlzIE5VTEwuIFRoaXMgd2FzIHRoZSBiZWhhdmlvciBwcmlvciB0byBsaWJwbmctMS4yLjliZXRhOS4KLSAgRml4ZWQgc3RyaW5nIHZzIHBvaW50ZXItdG8tc3RyaW5nIGVycm9yIGluIHBuZ19jaGVja19rZXl3b3JkKCkuCi0gIEFkZGVkIHBuZ19jaGVja19jSFJNX2ZpeGVkKCkgaW4gcG5nLmMgYW5kIG1vdmVkIGNoZWNraW5nIGZyb20gcG5nZ2V0LmMsCi0gICAgcG5ncnV0aWwuYywgYW5kIHBuZ3dyaXRlLmMsIGFuZCBlbGltaW5hdGVkIGZsb2F0aW5nIHBvaW50IGNIUk0gY2hlY2tpbmcuCi0gIEFkZGVkIGNoZWNrIGZvciB6ZXJvLWFyZWEgUkdCIGNIUk0gdHJpYW5nbGUgaW4gcG5nX2NoZWNrX2NIUk1fZml4ZWQoKS4KLSAgSW4gcG5nX2NoZWNrX2NIUk1fZml4ZWQoKSwgZW5zdXJlIHdoaXRlX3kgaXMgPiAwLCBhbmQgcmVtb3ZlZCByZWR1bmRhbnQKLSAgICBjaGVjayBmb3IgYWxsLXplcm8gY29vcmRpbmF0ZXMgdGhhdCBpcyBkZXRlY3RlZCBieSB0aGUgdHJpYW5nbGUgY2hlY2suCi0gIFJldmlzZWQgcG5nX3dhcm5pbmcoKSB0byB3cml0ZSBpdHMgbWVzc2FnZSBvbiBzdGFuZGFyZCBvdXRwdXQgYnkgZGVmYXVsdAotICAgIHdoZW4gd2FybmluZ19mbiBpcyBOVUxMLgotCi12ZXJzaW9uIDEuMi4zNGJldGEwMiBbTm92ZW1iZXIgMjgsIDIwMDhdCi0gIENvcnJlY3RlZCBvZmYtYnktb25lIGVycm9yIGluIGJLR0QgdmFsaWRpdHkgY2hlY2sgaW4gcG5nX3dyaXRlX2JLR0QoKQotICAgIGFuZCBpbiBwbmdfaGFuZGxlX2JLR0QoKS4KLQotdmVyc2lvbiAxLjIuMzRiZXRhMDMgW0RlY2VtYmVyIDEsIDIwMDhdCi0gIFJldmlzZWQgYktHRCB2YWxpZGl0eSBjaGVjayB0byB1c2UgPj0geCBpbnN0ZWFkIG9mID4geCArIDEKLSAgTWVyZ2VkIHdpdGggcG5nX2RlYnVnIGZyb20gbGlicG5nLTEuNC4wIHRvIHJlbW92ZSBuZXdsaW5lcy4KLQotdmVyc2lvbiAxLjIuMzRiZXRhMDQgW0RlY2VtYmVyIDIsIDIwMDhdCi0gIE1vcmUgbWVyZ2luZyB3aXRoIHBuZ19kZWJ1ZyBmcm9tIGxpYnBuZy0xLjQuMCB0byByZW1vdmUgbmV3bGluZXMuCi0KLXZlcnNpb24gMS4yLjM0YmV0YTA1IFtEZWNlbWJlciA1LCAyMDA4XQotICBSZW1vdmVkIHJlZHVuZGFudCBjaGVjayBmb3Iga2V5PT1OVUxMIGJlZm9yZSBjYWxsaW5nIHBuZ19jaGVja19rZXl3b3JkKCkKLSAgICB0byBlbnN1cmUgdGhhdCBuZXdfa2V5IGdldHMgaW5pdGlhbGl6ZWQgYW5kIHJlbW92ZWQgZXh0cmEgd2FybmluZwotICAgIChBcnZhbiBQcml0Y2hhcmQpLgotCi12ZXJzaW9uIDEuMi4zNGJldGEwNiBbRGVjZW1iZXIgOSwgMjAwOF0KLSAgSW4gcG5nX3dyaXRlX3BuZygpLCByZXNwZWN0IHRoZSBwbGFjZW1lbnQgb2YgdGhlIGZpbGxlciBieXRlcyBpbiBhbiBlYXJsaWVyCi0gICAgY2FsbCB0byBwbmdfc2V0X2ZpbGxlcigpIChKaW0gQmFycnkpLgotCi12ZXJzaW9uIDEuMi4zNGJldGEwNyBbRGVjZW1iZXIgOSwgMjAwOF0KLSAgVW5kaWQgcHJldmlvdXMgY2hhbmdlIGFuZCBhZGRlZCBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9CRUZPUkUgYW5kCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQUZURVIgY29uZGl0aW9uYWxzIGFuZCBkZXByZWNhdGVkCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVIgKEppbSBCYXJyeSkuCi0KLXZlcnNpb24gMS4wLjQycmMwMSwgMS4yLjM0cmMwMSBbRGVjZW1iZXIgMTEsIDIwMDhdCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS4wLjQyLCAxLjIuMzQgW0RlY2VtYmVyIDE4LCAyMDA4XQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuMi4zNWJldGEwMSBbRmVicnVhcnkgNCwgMjAwOV0KLSAgWmVybyBvdXQgc29tZSBhcnJheXMgb2YgcG9pbnRlcnMgYWZ0ZXIgcG5nX21hbGxvYygpLiAoVGF2aXMgT3JtYW5keSkKLQotdmVyc2lvbiAxLjIuMzViZXRhMDIgW0ZlYnJ1YXJ5IDQsIDIwMDldCi0gIFplcm8gb3V0IG1vcmUgYXJyYXlzIG9mIHBvaW50ZXJzIGFmdGVyIHBuZ19tYWxsb2MoKS4KLQotdmVyc2lvbiAxLjIuMzViZXRhMDMgW0ZlYnJ1YXJ5IDUsIDIwMDldCi0gIFVzZSBwbmdfbWVtc2V0KCkgaW5zdGVhZCBvZiBhIGxvb3AgdG8gaW50aWFsaXplIHBvaW50ZXJzLiAgV2UgcmVhbGl6ZQotICAgIHRoaXMgd2lsbCBub3Qgd29yayBvbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIE5VTEwgcG9pbnRlciBpcyBub3QgYWxsIHplcm9lcy4KLQotdmVyc2lvbiAxLjIuMzVyYzAxIFtGZWJydWFyeSAxMSwgMjAwOV0KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjIuMzVyYzAyIFtGZWJydWFyeSAxMiwgMjAwOV0KLSAgRml4IHR5cG8gaW4gbmV3IHBuZ19tZW1zZXQgY2FsbCBpbiBwbmdzZXQuYyAocG5nX2NvbG9yIHNob3VsZCBiZSBwbmdfY2hhcnApCi0KLXZlcnNpb24gMS4yLjM1IFtGZWJydWFyeSAxNCwgMjAwOV0KLSAgTm8gY2hhbmdlcy4KLQotdmVyc2lvbiAxLjAuNDMgYW5kIDEuMi4zNSBbRmVicnVhcnkgMTQsIDIwMDldCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS4yLjM2YmV0YTAxIFtGZWJydWFyeSAyOCwgMjAwOV0KLSAgUmV2aXNlZCBjb21tZW50cyBpbiBwbmdfc2V0X3JlYWRfZm4oKSBhbmQgcG5nX3NldF93cml0ZV9mbigpLgotICBSZXZpc2VkIG9yZGVyIG9mICNpZmRlZidzIGFuZCBpbmRlbnRhdGlvbiBpbiBwbmdfZGVidWcgZGVmaW5pdGlvbnMgb2YgcG5nLmgKLSAgICBidWcgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4yLjM0LgotCi12ZXJzaW9uIDEuMi4zNmJldGEwMiBbTWFyY2ggMjEsIDIwMDldCi0gIFVzZSBwbmdfbWVtc2V0KCkgYWZ0ZXIgcG5nX21hbGxvYygpIG9mIGJpZ19yb3dfYnVmIHdoZW4gcmVhZGluZyBhbgotICAgIGludGVybGFjZWQgZmlsZSwgdG8gYXZvaWQgYSBwb3NzaWJsZSBVTVIuCi0gIFVuZGlkIHJlY2VudCByZXZpc2lvbiBvZiBQTkdfTk9fU1RESU8gdmVyc2lvbiBvZiBwbmdfd3JpdGVfZmx1c2goKS4gIFVzZXJzCi0gICAgaGF2aW5nIHRyb3VibGUgd2l0aCBmZmx1c2goKSBjYW4gYnVpbGQgd2l0aCBQTkdfTk9fV1JJVEVfRkxVU0ggZGVmaW5lZC4KLSAgUmV2aXNlZCBsaWJwbmcqLnR4dCBkb2N1bWVudGF0aW9uIGFib3V0IHVzZSBvZiBwbmdfd3JpdGVfZmx1c2goKS4KLSAgUmVtb3ZlZCBmZmx1c2goKSBmcm9tIHBuZ3Rlc3QuYy4KLSAgQWRkZWQgIiNkZWZpbmUgUE5HX05PX1dSSVRFX0ZMVVNIIiB0byBjb250cmliL3BuZ21pbmltL2VuY29kZXIvcG5ndXNyLmgKLQotdmVyc2lvbiAxLjIuMzZiZXRhMDMgW01hcmNoIDI3LCAyMDA5XQotICBSZWxvY2F0ZWQgbWlzcGxhY2VkIFBOR18xXzBfWCBkZWZpbmUgaW4gcG5nLmggdGhhdCBjYXVzZWQgdGhlIHByb3RvdHlwZQotICAgIGZvciBwbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMoKSB0byBiZSBvbWl0dGVkIGZyb20gUE5HX05PX0FTU0VNQkxFUl9DT0RFCi0gICAgYnVpbGRzLiAgVGhpcyBidWcgd2FzIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMi4xNWJldGE0LgotICBBZGRlZCBhIHNlY3Rpb24gb24gZGlmZmVyZW5jZXMgYmV0d2VlbiAxLjAueCBhbmQgMS4yLnggdG8gbGlicG5nLjMvbGlicG5nLnR4dAotCi12ZXJzaW9uIDEuMi4zNmJldGEwNCBbQXByaWwgNSwgMjAwOV0KLSAgRml4ZWQgcG90ZW50aWFsIG1lbW9yeSBsZWFrIG9mICJuZXdfbmFtZSIgaW4gcG5nX3dyaXRlX2lDQ1AoKSAoUmFscGggR2lsZXMpCi0KLXZlcnNpb24gMS4yLjM2YmV0YTA1IFtBcHJpbCAyNCwgMjAwOV0KLSAgQWRkZWQgImlmbmRlZiBQTkdfU0tJUF9TRVRKTVBfQ0hFQ0siIGJsb2NrIGluIHBuZ2NvbmYuaCB0byBhbGxvdwotICAgIGFwcGxpY2F0aW9uIGNvZGUgd3JpdGVycyB0byBieXBhc3MgdGhlIGNoZWNrIGZvciBtdWx0aXBsZSBpbmNsdXNpb24KLSAgICBvZiBzZXRqbXAuaCB3aGVuIHRoZXkga25vdyB0aGF0IGl0IGlzIHNhZmUgdG8gaWdub3JlIHRoZSBzaXR1YXRpb24uCi0gIE1hZGUgc29tZSBjb3NtZXRpYyBjaGFuZ2VzIHRvIHdoaXRlc3BhY2UgaW4gcG5ndGVzdCBvdXRwdXQuCi0gIFJlbmFtZWQgInVzZXJfY2h1bmtfZGF0YSIgdG8gIm15X3VzZXJfY2h1bmtfZGF0YSIgaW4gcG5ndGVzdC5jIHRvIHN1cHByZXNzCi0gICAgInNoYWRvd2VkIGRlY2xhcmF0aW9uIiB3YXJuaW5nIGZyb20gZ2NjLTQuMy4zLgotICBSZW5hbWVkICJnYW1tYSIgdG8gInBuZ19nYW1tYSIgaW4gcG5nc2V0LmMgdG8gYXZvaWQgInNoYWRvd2VkIGRlY2xhcmF0aW9uIgotICAgIHdhcm5pbmcgYWJvdXQgYSBnbG9iYWwgImdhbW1hIiB2YXJpYWJsZSBpbiBtYXRoLmggb24gc29tZSBwbGF0Zm9ybXMuCi0KLXZlcnNpb24gMS4yLjM2cmMwMSBbQXByaWwgMzAsIDIwMDldCi0gIE5vIGNoYW5nZXMuCi0KLXZlcnNpb24gMS4wLjQ0IGFuZCAxLjIuMzYgW01heSA3LCAyMDA5XQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuMi4zN2JldGEwMSBbTWF5IDE0LCAyMDA5XQotICBGaXhlZCBpbmNvbnNpc3RlbmN5IGluIHBuZ3J1dGlsLmMsIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMi4zNi4gIFRoZQotICAgIG1lbXNldCgpIHdhcyB1c2luZyAicG5nX3B0ci0+cm93Ynl0ZXMiIGluc3RlYWQgb2YgInJvd19ieXRlcyIsIHdoaWNoCi0gICAgdGhlIGNvcnJlc3BvbmRpbmcgcG5nX21hbGxvYygpIHVzZXMgKEpvZSBEcmV3KS4KLSAgQ2xhcmlmaWVkIHVzYWdlIG9mIHNpZ19iaXQgdmVyc3VzIHNpZ19iaXRfcCBpbiBleGFtcGxlLmMgKFZpbmNlbnQgVG9ycmkpCi0gIFVwZGF0ZWQgc29tZSBvZiB0aGUgbWFrZWZpbGVzIGluIHRoZSBzY3JpcHRzIGRpcmVjdG9yeSAobWVyZ2VkIHdpdGgKLSAgICB0aG9zZSBpbiBsaWJwbmctMS40LjBiZXRhNTcpLgotCi12ZXJzaW9uIDEuMi4zN2JldGEwMiBbTWF5IDE5LCAyMDA5XQotICBGaXhlZCB0eXBvIGluIGxpYnBuZyBkb2N1bWVudGF0aW9uIChGSUxURVJfQVZFIHNob3VsZCBiZSBGSUxURVJfQVZHKQotICBSZWxvY2F0ZWQgbWlzcGxhY2VkICNlbmRpZiBpbiBwbmd3cml0ZS5jLCBzQ0FMIGNodW5rIGhhbmRsZXIuCi0gIENvbmRpdGlvbmFsbHkgY29tcGlsZSBwbmdfcmVhZF9maW5pc2hfcm93KCkgd2hpY2ggaXMgbm90IHVzZWQgYnkKLSAgICBwcm9ncmVzc2l2ZSByZWFkZXJzLgotICBBZGRlZCBjb250cmliL3BuZ21pbmltL3ByZWFkZXIgdG8gZGVtb25zdHJhdGUgYnVpbGRpbmcgbWluaW1hbCBwcm9ncmVzc2l2ZQotICAgIGRlY29kZXIsIGJhc2VkIG9uIGNvbnRyaWIvZ3JlZ2Jvb2sgd2l0aCBlbWJlZGRlZCBsaWJwbmcgYW5kIHpsaWIuCi0KLXZlcnNpb24gMS4yLjM3YmV0YTAzIFtNYXkgMjAsIDIwMDldCi0gIEluIGNvbnRyaWIvcG5nbWluaW0vKiwgcmVuYW1lZCAibWFrZWZpbGUuc3RkIiB0byAibWFrZWZpbGUiLCBzaW5jZSB0aGVyZQotICAgIGlzIG9ubHkgb25lIG1ha2VmaWxlIGluIHRob3NlIGRpcmVjdG9yaWVzLCBhbmQgcmV2aXNlZCB0aGUgUkVBRE1FIGZpbGVzCi0gICAgYWNjb3JkaW5nbHkuCi0gIFJlZm9ybWF0ZWQgc291cmNlcyBpbiBsaWJwbmcgc3R5bGUgKDMtc3BhY2UgaW5kZW50YXRpb24sIGNvbW1lbnQgZm9ybWF0KQotICAKLXZlcnNpb24gMS4yLjM3cmMwMSBbTWF5IDI3LCAyMDA5XQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9ucyAxLjIuMzcgYW5kIDEuMC40NSBbSnVuZSA0LCAyMDA5XQotICBSZWZvcm1hdHRlZCBzZXZlcmFsIHJlbWFpbmluZyAiZWxzZSBzdGF0ZW1lbnQ7IiBhbmQgImlmICgpIHN0YXRtZW50OyIgaW50bwotICAgIHR3byBsaW5lcy4KLSAgQWRkZWQgIiNkZWZpbmUgUE5HX05PX1dSSVRFX1NXQVAiIHRvIGNvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuaAotICAgIGFuZCAiZGVmaW5lIFBOR19OT19SRUFEX1NXQVAiIHRvIGRlY29kZXIvcG5ndXNyLmggYW5kIHByZWFkZXIvcG5ndXNyLmgKLSAgQWRkZWQgc2VjdGlvbnMgYWJvdXQgdGhlIGdpdCByZXBvc2l0b3J5IGFuZCBvdXIgY29kaW5nIHN0eWxlIHRvIHRoZQotICAgIGRvY3VtZW50YXRpb24gKG1lcmdlZCBmcm9tIGxpYnBuZy0xLjQuMGJldGE2MikKLSAgQWRkZWQgYSBzZWN0aW9uIGFib3V0IHVzaW5nIHBuZ19nZXRfaW9fcHRyKCkgaW4gY29uZmlndXJlIHNjcmlwdHMgdG8gZGV0ZWN0Ci0gICAgdGhlIHByZXNlbmNlIG9mIGxpYnBuZy4KLQotU2VuZCBjb21tZW50cy9jb3JyZWN0aW9ucy9jb21tZW5kYXRpb25zIHRvIHBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNmLm5ldAotKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQKLWh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3BuZy1tbmctaW1wbGVtZW50Ci10byBzdWJzY3JpYmUpCi1vciB0byBnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldAotCi1HbGVubiBSLVAKLSovCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9JTlNUQUxMIGIvbGlicy9saWJwbmcvSU5TVEFMTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzYmY1YS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9JTlNUQUxMCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLQotSW5zdGFsbGluZyBsaWJwbmcgdmVyc2lvbiAxLjIuMzcgLSBKdW5lIDQsIDIwMDkKLQotT24gVW5peC9MaW51eCBhbmQgc2ltaWxhciBzeXN0ZW1zLCB5b3UgY2FuIHNpbXBseSB0eXBlCi0KLSAgICAuL2NvbmZpZ3VyZSBbLS1wcmVmaXg9L3BhdGhdCi0gICAgbWFrZSBjaGVjawotICAgIG1ha2UgaW5zdGFsbAotCi1hbmQgaWdub3JlIHRoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQuCi0KLUlmIGNvbmZpZ3VyZSBkb2VzIG5vdCB3b3JrIG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UgaGF2ZSBhIHJlYXNvbmFibHkKLXVwLXRvLWRhdGUgc2V0IG9mIHRvb2xzLCBydW5uaW5nIC4vYXV0b2dlbi5zaCBiZWZvcmUgcnVubmluZyAuL2NvbmZpZ3VyZQotbWF5IGZpeCB0aGUgcHJvYmxlbS4gIFlvdSBjYW4gYWxzbyBydW4gdGhlIGluZGl2aWR1YWwgY29tbWFuZHMgaW4KLWF1dG9nZW4uc2ggd2l0aCB0aGUgLS1mb3JjZSBvcHRpb24sIGlmIHN1cHBvcnRlZCBieSB5b3VyIHZlcnNpb24gb2YKLXRoZSB0b29scy4gIElmIHlvdSBydW4gJ2xpYnRvb2xpemUgLS1mb3JjZScsIHRob3VnaCwgdGhpcyB3aWxsIHJlcGxhY2UKLXRoZSBkaXN0cmlidXRlZCwgcGF0Y2hlZCwgdmVyc2lvbiBvZiBsdG1haW4uc2ggd2l0aCBhbiB1bnBhdGNoZWQgdmVyc2lvbgotYW5kIHlvdXIgc2hhcmVkIGxpYnJhcnkgYnVpbGRzIG1heSBmYWlsIHRvIHByb2R1Y2UgbGlicmFyaWVzIHdpdGggdGhlCi1jb3JyZWN0IHZlcnNpb24gbnVtYmVycy4KLQotSW5zdGVhZCwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBjdXN0b20tYnVpbHQgbWFrZWZpbGVzIGluIHRoZQotInNjcmlwdHMiIGRpcmVjdG9yeQotCi0gICAgY3Agc2NyaXB0cy9tYWtlZmlsZS5zeXN0ZW0gbWFrZWZpbGUKLSAgICBtYWtlIHRlc3QKLSAgICBtYWtlIGluc3RhbGwKLQotT3IgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSAicHJvamVjdHMiIGluIHRoZSAicHJvamVjdHMiIGRpcmVjdG9yeS4KLQotSWYgeW91IHdhbnQgdG8gdXNlICJjbWFrZSIgKHNlZSB3d3cuY21ha2Uub3JnKSwgY29weSBDTWFrZUxpc3RzLnR4dAotZnJvbSB0aGUgInNjcmlwdHMiIGRpcmVjdG9yeSB0byB0aGlzIGRpcmVjdG9yeSBhbmQgdHlwZQotCi0gICBjbWFrZSAuIFstRFBOR19NTVg9WUVTXSAtRENNQUtFX0lOU1RBTExfUFJFRklYPS9wYXRoCi0gICBtYWtlCi0gICBtYWtlIGluc3RhbGwKLQotQmVmb3JlIGluc3RhbGxpbmcgbGlicG5nLCB5b3UgbXVzdCBmaXJzdCBpbnN0YWxsIHpsaWIsIGlmIGl0Ci1pcyBub3QgYWxyZWFkeSBvbiB5b3VyIHN5c3RlbS4gIHpsaWIgY2FuIHVzdWFsbHkgYmUgZm91bmQKLXdoZXJldmVyIHlvdSBnb3QgbGlicG5nLiAgemxpYiBjYW4gYmUgcGxhY2VkIGluIGFub3RoZXIgZGlyZWN0b3J5LAotYXQgdGhlIHNhbWUgbGV2ZWwgYXMgbGlicG5nLgotCi1JZiB5b3VyIHN5c3RlbSBhbHJlYWR5IGhhcyBhIHByZWluc3RhbGxlZCB6bGliIHlvdSB3aWxsIHN0aWxsIG5lZWQKLXRvIGhhdmUgYWNjZXNzIHRvIHRoZSB6bGliLmggYW5kIHpjb25mLmggaW5jbHVkZSBmaWxlcyB0aGF0Ci1jb3JyZXNwb25kIHRvIHRoZSB2ZXJzaW9uIG9mIHpsaWIgdGhhdCdzIGluc3RhbGxlZC4KLQotWW91IGNhbiByZW5hbWUgdGhlIGRpcmVjdG9yaWVzIHRoYXQgeW91IGRvd25sb2FkZWQgKHRoZXkKLW1pZ2h0IGJlIGNhbGxlZCAibGlicG5nLTEuMi4zNyIgb3IgImxwbmcxMDkiIGFuZCAiemxpYi0xLjIuMSIKLW9yICJ6bGliMTIxIikgc28gdGhhdCB5b3UgaGF2ZSBkaXJlY3RvcmllcyBjYWxsZWQgInpsaWIiIGFuZCAibGlicG5nIi4KLQotWW91ciBkaXJlY3Rvcnkgc3RydWN0dXJlIHNob3VsZCBsb29rIGxpa2UgdGhpczoKLQotICAgLi4gICAgICAgKHRoZSBwYXJlbnQgZGlyZWN0b3J5KQotICAgICAgbGlicG5nICAodGhpcyBkaXJlY3RvcnkpCi0gICAgICAgICAgSU5TVEFMTCAodGhpcyBmaWxlKQotICAgICAgICAgIFJFQURNRQotICAgICAgICAgICouaAotICAgICAgICAgICouYwotICAgICAgICAgIGNvbnRyaWIKLSAgICAgICAgICAgICBncmVnYm9vawotICAgICAgICAgICAgIHBuZ21pbnVzCi0gICAgICAgICAgICAgcG5nc3VpdGUKLSAgICAgICAgICAgICB2aXN1cG5nCi0gICAgICAgICAgcHJvamVjdHMKLSAgICAgICAgICAgICBiZW9zCi0gICAgICAgICAgICAgYzVidWlsZGVyIChCb3JsYW5kKQotICAgICAgICAgICAgIHZpc3VhbGM2IChtc3ZjKQotICAgICAgICAgICAgIG5ldHdhcmUudHh0Ci0gICAgICAgICAgICAgd2luY2UudHh0Ci0gICAgICAgICAgc2NyaXB0cwotICAgICAgICAgICAgIG1ha2VmaWxlLioKLSAgICAgICAgICBwbmd0ZXN0LnBuZwotICAgICAgICAgIGV0Yy4KLSAgICAgIHpsaWIKLSAgICAgICAgICBSRUFETUUKLSAgICAgICAgICAqLmgKLSAgICAgICAgICAqLmMKLSAgICAgICAgICBjb250cmliCi0gICAgICAgICAgZXRjLgotCi1JZiB0aGUgbGluZSBlbmRpbmdzIGluIHRoZSBmaWxlcyBsb29rIGZ1bm55LCB5b3UgbWF5IHdpc2ggdG8gZ2V0IHRoZSBvdGhlcgotZGlzdHJpYnV0aW9uIG9mIGxpYnBuZy4gIEl0IGlzIGF2YWlsYWJsZSBpbiBib3RoIHRhci5neiAoVU5JWCBzdHlsZSBsaW5lCi1lbmRpbmdzKSBhbmQgemlwIChET1Mgc3R5bGUgbGluZSBlbmRpbmdzKSBmb3JtYXRzLgotCi1JZiB5b3UgYXJlIGJ1aWxkaW5nIGxpYnBuZyB3aXRoIE1TVkMsIHlvdSBjYW4gZW50ZXIgdGhlCi1saWJwbmcgcHJvamVjdHNcdmlzdWFsYzYgZGlyZWN0b3J5IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbgotcHJvamVjdHNcdmlzdWFsYzZcUkVBRE1FLnR4dC4KLQotWW91IGNhbiBidWlsZCBsaWJwbmcgZm9yIFdpbmRvd3NDRSBieSBkb3dubG9hZGluZyBhbmQgaW5zdGFsbGluZwotdGhlIHByb2plY3RzXHdpbmNlIGRpcmVjdG9yeSBhcyBpbnN0cnVjdGVkIGluIHRoZSBwcm9qZWN0c1x3aW5jZS50eHQgZmlsZSwgYW5kCi10aGVuIGZvbGxvd2luZyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBSRUFETUUqIGZpbGVzLiAgU2ltaWxhcmx5LCB5b3UgY2FuCi1idWlsZCBsaWJwbmcgZm9yIE5ldHdhcmUgb3IgQmVvcyBhcyBpbnN0cnVjdGVkIGluIHByb2plY3RzXG5ldHdhcmUudHh0Ci1vciBwcm9qZWN0c1xiZW9zLgotCi1FbHNlIGVudGVyIHRoZSB6bGliIGRpcmVjdG9yeSBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4gemxpYi9SRUFETUUsCi10aGVuIGNvbWUgYmFjayBoZXJlIGFuZCBydW4gImNvbmZpZ3VyZSIgb3IgY2hvb3NlIHRoZSBhcHByb3ByaWF0ZQotbWFrZWZpbGUuc3lzIGluIHRoZSBzY3JpcHRzIGRpcmVjdG9yeS4KLQotVGhlIGZpbGVzIHRoYXQgYXJlIHByZXNlbnRseSBhdmFpbGFibGUgaW4gdGhlIHNjcmlwdHMgZGlyZWN0b3J5Ci1pbmNsdWRlCi0KLSBDTWFrZUxpc3RzLnR4dCAgICA9PiAgImNtYWtlIiBzY3JpcHQKLSBtYWtlZmlsZS5zdGQgICAgICA9PiAgR2VuZXJpYyBVTklYIG1ha2VmaWxlIChjYywgY3JlYXRlcyBzdGF0aWMgbGlicG5nLmEpCi0gbWFrZWZpbGUuZWxmICAgICAgPT4gIExpbnV4L0VMRiBtYWtlZmlsZSBzeW1ib2wgdmVyc2lvbmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgZ2NjLCBjcmVhdGVzIGxpYnBuZzEyLnNvLjAuMS4yLjM3KQotIG1ha2VmaWxlLmxpbnV4ICAgID0+ICBMaW51eC9FTEYgbWFrZWZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgKGdjYywgY3JlYXRlcyBsaWJwbmcxMi5zby4wLjEuMi4zNykKLSBtYWtlZmlsZS5nY2MgICAgICA9PiAgR2VuZXJpYyBtYWtlZmlsZSAoZ2NjLCBjcmVhdGVzIHN0YXRpYyBsaWJwbmcuYSkKLSBtYWtlZmlsZS5rbnIgICAgICA9PiAgQXJjaGFpYyBVTklYIE1ha2VmaWxlIHRoYXQgY29udmVydHMgZmlsZXMgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICBhbnNpMmtuciAoUmVxdWlyZXMgYW5zaTJrbnIuYyBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgIGZ0cDovL2Z0cC5jcy53aXNjLmVkdS9naG9zdCkKLSBtYWtlZmlsZS5haXggICAgICA9PiAgQUlYL2djYyBtYWtlZmlsZQotIG1ha2VmaWxlLmN5Z3dpbiAgID0+ICBDeWd3aW4vZ2NjIG1ha2VmaWxlCi0gbWFrZWZpbGUuZGFyd2luICAgPT4gIERhcndpbiBtYWtlZmlsZSwgY2FuIHVzZSBvbiBNYWNvc1gKLSBtYWtlZmlsZS5kZWMgICAgICA9PiAgREVDIEFscGhhIFVOSVggbWFrZWZpbGUKLSBtYWtlZmlsZS5mcmVlYnNkICA9PiAgRnJlZUJTRCBtYWtlZmlsZQotIG1ha2VmaWxlLmhwZ2NjICAgID0+ICBIUFVYIG1ha2VmaWxlIHVzaW5nIGdjYwotIG1ha2VmaWxlLmhwdXggICAgID0+ICBIUFVYICgxMC4yMCBhbmQgMTEuMDApIG1ha2VmaWxlCi0gbWFrZWZpbGUuaHA2NCAgICAgPT4gIEhQVVggKDEwLjIwIGFuZCAxMS4wMCkgbWFrZWZpbGUsIDY0LWJpdAotIG1ha2VmaWxlLmlibWMgICAgID0+ICBJQk0gQy9DKysgdmVyc2lvbiAzLnggZm9yIFdpbjMyIGFuZCBPUy8yIChzdGF0aWMpCi0gbWFrZWZpbGUuaW50ZWwgICAgPT4gIEludGVsIEMvQysrIHZlcnNpb24gNC4wIGFuZCBsYXRlcgotIGxpYnBuZy5pY2MgICAgICAgID0+ICBQcm9qZWN0IGZpbGUgZm9yIElCTSBWaXN1YWxBZ2UvQysrIHZlcnNpb24gNC4wIG9yIGxhdGVyCi0gbWFrZWZpbGUubmV0YnNkICAgPT4gIE5ldEJTRC9jYyBtYWtlZmlsZSwgdXNlcyBQTkdHQ0NSRCwgbWFrZXMgbGlicG5nLnNvLgotIG1ha2VmaWxlLm5lMTJic2QgID0+ICBOZXRCU0QvY2MgbWFrZWZpbGUsIHVzZXMgUE5HR0NDUkQsCi0gICAgICAgICAgICAgICAgICAgICAgIG1ha2VzIGxpYnBuZzEyLnNvCi0gbWFrZWZpbGUub3BlbmJzZCAgPT4gIE9wZW5CU0QgbWFrZWZpbGUKLSBtYWtlZmlsZS5zZ2kgICAgICA9PiAgU2lsaWNvbiBHcmFwaGljcyBJUklYIG1ha2VmaWxlIChjYywgY3JlYXRlcyBzdGF0aWMgbGliKQotIG1ha2VmaWxlLnNnZ2NjICAgID0+ICBTaWxpY29uIEdyYXBoaWNzIChnY2MsCi0gICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgbGlicG5nMTIuc28uMC4xLjIuMzcpCi0gbWFrZWZpbGUuc3Vub3MgICAgPT4gIFN1biBtYWtlZmlsZQotIG1ha2VmaWxlLnNvbGFyaXMgID0+ICBTb2xhcmlzIDIuWCBtYWtlZmlsZSAoZ2NjLAotICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVzIGxpYnBuZzEyLnNvLjAuMS4yLjM3KQotIG1ha2VmaWxlLnNvbGFyaXMteDg2ID0+ICBTb2xhcmlzL2ludGVsTU1YIDIuWCBtYWtlZmlsZSAoZ2NjLAotICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVzIGxpYnBuZzEyLnNvLjAuMS4yLjM3KQotIG1ha2VmaWxlLnNvOSAgICAgID0+ICBTb2xhcmlzIDkgbWFrZWZpbGUgKGdjYywKLSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlcyBsaWJwbmcxMi5zby4wLjEuMi4zNykKLSBtYWtlZmlsZS4zMnN1bnUgICA9PiAgU3VuIFVsdHJhIDMyLWJpdCBtYWtlZmlsZQotIG1ha2VmaWxlLjY0c3VudSAgID0+ICBTdW4gVWx0cmEgNjQtYml0IG1ha2VmaWxlCi0gbWFrZWZpbGUuc2NvICAgICAgPT4gIEZvciBTQ08gT1NyNSAgRUxGIGFuZCBVbml4d2FyZSA3IHdpdGggTmF0aXZlIGNjCi0gbWFrZWZpbGUubWlwcyAgICAgPT4gIE1JUFMgbWFrZWZpbGUKLSBtYWtlZmlsZS5hY29ybiAgICA9PiAgQWNvcm4gbWFrZWZpbGUKLSBtYWtlZmlsZS5hbWlnYSAgICA9PiAgQW1pZ2EgbWFrZWZpbGUKLSBzbWFrZWZpbGUucHBjICAgICA9PiAgQU1JR0Egc21ha2VmaWxlIGZvciBTQVMgQyBWNi41OC83LjAwIFBQQyBjb21waWxlcgotICAgICAgICAgICAgICAgICAgICAgICAoUmVxdWlyZXMgU0NPUFRJT05TLCBjb3BpZWQgZnJvbSBzY3JpcHRzL1NDT1BUSU9OUy5wcGMpCi0gbWFrZWZpbGUuYXRhcmkgICAgPT4gIEF0YXJpIG1ha2VmaWxlCi0gbWFrZWZpbGUuYmVvcyAgICAgPT4gIEJFT1MgbWFrZWZpbGUgZm9yIFg4NgotIG1ha2VmaWxlLmJvciAgICAgID0+ICBCb3JsYW5kIG1ha2VmaWxlICh1c2VzIGJjYykKLSBtYWtlZmlsZS5iYzMyICAgICA9PiAgMzItYml0IEJvcmxhbmQgQysrIChhbGwgbW9kdWxlcyBjb21waWxlZCBpbiBDIG1vZGUpCi0gbWFrZWZpbGUudGMzICAgICAgPT4gIFR1cmJvIEMgMy4wIG1ha2VmaWxlCi0gbWFrZWZpbGUuZGoyICAgICAgPT4gIERKR1BQIDIgbWFrZWZpbGUKLSBtYWtlZmlsZS5tc2MgICAgICA9PiAgTWljcm9zb2Z0IEMgbWFrZWZpbGUKLSBtYWtlZmlsZS52Y3dpbjMyICA9PiAgbWFrZWZpbGUgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIDQuMCBhbmQgbGF0ZXIKLSBtYWtlZmlsZS5vczIgICAgICA9PiAgT1MvMiBNYWtlZmlsZSAoZ2NjIGFuZCBlbXgsIHJlcXVpcmVzIHBuZ29zMi5kZWYpCi0gcG5nb3MyLmRlZiAgICAgICAgPT4gIE9TLzIgbW9kdWxlIGRlZmluaXRpb24gZmlsZSB1c2VkIGJ5IG1ha2VmaWxlLm9zMgotIG1ha2VmaWxlLndhdGNvbSAgID0+ICBXYXRjb20gMTBhKyBNYWtlZmlsZSwgMzItYml0IGZsYXQgbWVtb3J5IG1vZGVsCi0gbWFrZXZtcy5jb20gICAgICAgPT4gIFZNUyBidWlsZCBzY3JpcHQKLSBkZXNjcmlwLm1tcyAgICAgICA9PiAgVk1TIG1ha2VmaWxlIGZvciBNTVMgb3IgTU1LCi0gU0NPUFRJT05TLnBwYyAgICAgPT4gIFVzZWQgd2l0aCBzbWFrZWZpbGUucHBjCi0KLUNvcHkgdGhlIGZpbGUgKG9yIGZpbGVzKSB0aGF0IHlvdSBuZWVkIGZyb20gdGhlCi1zY3JpcHRzIGRpcmVjdG9yeSBpbnRvIHRoaXMgZGlyZWN0b3J5LCBmb3IgZXhhbXBsZQotCi0gICBNU0RPUyBleGFtcGxlOiBjb3B5IHNjcmlwdHNcbWFrZWZpbGUubXNjIG1ha2VmaWxlCi0gICBVTklYIGV4YW1wbGU6ICAgIGNwIHNjcmlwdHMvbWFrZWZpbGUuc3RkIG1ha2VmaWxlCi0KLVJlYWQgdGhlIG1ha2VmaWxlIHRvIHNlZSBpZiB5b3UgbmVlZCB0byBjaGFuZ2UgYW55IHNvdXJjZSBvcgotdGFyZ2V0IGRpcmVjdG9yaWVzIHRvIG1hdGNoIHlvdXIgcHJlZmVyZW5jZXMuCi0KLVRoZW4gcmVhZCBwbmdjb25mLmggdG8gc2VlIGlmIHlvdSB3YW50IHRvIG1ha2UgYW55IGNvbmZpZ3VyYXRpb24KLWNoYW5nZXMuCi0KLVRoZW4ganVzdCBydW4gIm1ha2UiIHdoaWNoIHdpbGwgY3JlYXRlIHRoZSBsaWJwbmcgbGlicmFyeSBpbgotdGhpcyBkaXJlY3RvcnkgYW5kICJtYWtlIHRlc3QiIHdoaWNoIHdpbGwgcnVuIGEgcXVpY2sgdGVzdCB0aGF0IHJlYWRzCi10aGUgInBuZ3Rlc3QucG5nIiBmaWxlIGFuZCB3cml0ZXMgYSAicG5nb3V0LnBuZyIgZmlsZSB0aGF0IHNob3VsZCBiZQotaWRlbnRpY2FsIHRvIGl0LiAgTG9vayBmb3IgIjk3ODIgemVybyBzYW1wbGVzIiBpbiB0aGUgb3V0cHV0IG9mIHRoZQotdGVzdC4gIEZvciBtb3JlIGNvbmZpZGVuY2UsIHlvdSBjYW4gcnVuIGFub3RoZXIgdGVzdCBieSB0eXBpbmcKLSJwbmd0ZXN0IHBuZ25vdy5wbmciIGFuZCBsb29raW5nIGZvciAiMjg5IHplcm8gc2FtcGxlcyIgaW4gdGhlIG91dHB1dC4KLUFsc28sIHlvdSBjYW4gcnVuICJwbmd0ZXN0IC1tIGNvbnRyaWIvcG5nc3VpdGUvKi5wbmciIGFuZCBjb21wYXJlCi15b3VyIG91dHB1dCB3aXRoIHRoZSByZXN1bHQgc2hvd24gaW4gY29udHJpYi9wbmdzdWl0ZS9SRUFETUUuCi0KLU1vc3Qgb2YgdGhlIG1ha2VmaWxlcyB3aWxsIGFsbG93IHlvdSB0byBydW4gIm1ha2UgaW5zdGFsbCIgdG8KLXB1dCB0aGUgbGlicmFyeSBpbiBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoaWYgeW91IHdhbnQgdG8KLWRvIHRoYXQsIHJ1biAibWFrZSBpbnN0YWxsIiBpbiB0aGUgemxpYiBkaXJlY3RvcnkgZmlyc3QgaWYgbmVjZXNzYXJ5KS4KLVNvbWUgYWxzbyBhbGxvdyB5b3UgdG8gcnVuICJtYWtlIHRlc3QtaW5zdGFsbGVkIiBhZnRlciB5b3UgaGF2ZQotcnVuICJtYWtlIGluc3RhbGwiLgotCi1JZiB5b3UgZW5jb3VudGVyIGEgY29tcGlsZXIgZXJyb3IgbWVzc2FnZSBjb21wbGFpbmluZyBhYm91dCB0aGUKLWxpbmVzCi0gICAgICBfX3BuZy5oX18gYWxyZWFkeSBpbmNsdWRlcyBzZXRqbXAuaDsKLSAgICAgIF9fZG9udF9fIGluY2x1ZGUgaXQgYWdhaW4uOwotVGhpcyBtZWFucyB5b3UgaGF2ZSBjb21waWxlZCBhbm90aGVyIG1vZHVsZSB0aGF0IGluY2x1ZGVzIHNldGptcC5oLAotd2hpY2ggaXMgaGF6YXJkb3VzIGJlY2F1c2UgdGhlIHR3byBtb2R1bGVzIG1pZ2h0IG5vdCBpbmNsdWRlIGV4YWN0bHkKLXRoZSBzYW1lIHNldGptcC5oLiAgSWYgeW91IGFyZSBzdXJlIHRoYXQgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nCi1hbmQgdGhhdCB0aGV5IGFyZSBleGFjdGx5IHRoZSBzYW1lLCB0aGVuIHlvdSBjYW4gY29tbWVudCBvdXQgb3IKLWRlbGV0ZSB0aGUgdHdvIGxpbmVzLiAgQmV0dGVyIHlldCwgdXNlIHRoZSBjZXhjZXB0IGludGVyZmFjZQotaW5zdGVhZCwgYXMgZGVtb25zdHJhdGVkIGluIGNvbnRyaWIvdmlzdXBuZyBvZiB0aGUgbGlicG5nIGRpc3RyaWJ1dGlvbi4KLQotRnVydGhlciBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIFJFQURNRSBhbmQgbGlicG5nLnR4dAotZmlsZXMsIGluIHRoZSBpbmRpdmlkdWFsIG1ha2VmaWxlcywgaW4gcG5nLmgsIGFuZCB0aGUgbWFudWFsIHBhZ2VzCi1saWJwbmcuMyBhbmQgcG5nLjUuCi0KLQotVXNpbmcgdGhlIC4vY29uZmlndXJlIHNjcmlwdCAtLSAxNiBEZWNlbWJlciAyMDAyLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLVRoZSAuL2NvbmZpZ3VyZSBzY3JpcHQgc2hvdWxkIHdvcmsgY29tcGF0aWJseSB3aXRoIHdoYXQgc2NyaXB0cy9tYWtlZmlsZS4qCi1kaWQsIGhvd2V2ZXIgdGhlcmUgYXJlIHNvbWUgb3B0aW9ucyB5b3UgbmVlZCB0byBhZGQgdG8gY29uZmlndXJlIGV4cGxpY2l0bHksCi13aGljaCBwcmV2aW91c2x5IHdhcyBkb25lIHNlbWktYXV0b21hdGljYWxseSAoaWYgeW91IGRpZG4ndCBlZGl0Ci1zY3JpcHRzL21ha2VmaWxlLiogeW91cnNlbGYsIHRoYXQgaXMpCi0KLQotQ0ZMQUdTPSItV2FsbCAtTyAtZnVucm9sbC1sb29wcyBcCi0tbWFsaWduLWxvb3BzPTIgLW1hbGlnbi1mdW5jdGlvbnM9MiIgLi9jb25maWd1cmUgLS1wcmVmaXg9L3Vzci9pbmNsdWRlIFwKLS0td2l0aC1wa2djb25maWdkaXI9L3Vzci9saWIvcGtnY29uZmlnIC0taW5jbHVkZWRpcj0vdXNyL2luY2x1ZGUKLQotWW91IGNhbiBhbHRlcm5hdGl2ZWx5IHNwZWNpZnkgLS1pbmNsdWRlZGlyPS91c3IvaW5jbHVkZSwgL3Vzci9sb2NhbC9pbmNsdWRlLAotL3Vzci9pbmNsdWRlL3BuZzEyLCBvciB3aGF0ZXZlci4KLQotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9LTk9XTkJVRyBiL2xpYnMvbGlicG5nL0tOT1dOQlVHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTBmNzQyLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL0tOT1dOQlVHCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotCi1Lbm93biBidWdzIGluIGxpYnBuZyB2ZXJzaW9uIDEuMi4zNwotCi0xLiBGZWJydWFyeSAyMywgMjAwNjogVGhlIGN1c3RvbSBtYWtlZmlsZXMgZG9uJ3QgYnVpbGQgbGlicG5nIHdpdGggLWx6LgotCi0gICBTVEFUVVM6IFRoaXMgaXMgYSBzdWJqZWN0IG9mIGRlYmF0ZS4gVGhlIGNoYW5nZSB3aWxsIHByb2JhYmx5IGJlIG1hZGUKLSAgIGFzIGEgcGFydCBvZiBhIG1ham9yIG92ZXJoYXVsIG9mIHRoZSBtYWtlZmlsZXMgaW4gbGlicG5nIHZlcnNpb24gMS40LjAuCi0KLTIuIEZlYnJ1YXJ5IDI0LCAyMDA2OiBUaGUgTWFrZWZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSAiY29uZmlndXJlIiBzY3JpcHQKLSAgIGZhaWxzIHRvIGluc3RhbGwgc3ltYm9saWMgbGlua3MKLSAgIGxpYnBuZzEyLnNvID0+IGxpYnBuZzEyLnNvLjAuMS4yLjliZXRhTgotICAgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBjdXN0b20gbWFrZWZpbGVzLgotCi0zLiBTZXB0ZW1iZXIgNCwgMjAwNzogIFRoZXJlIGlzIGEgcmVwb3J0IHRoYXQgcG5ndGVzdCBjcmFzaGVzIG9uIE1hY09TIDEwLgotCi0gICBTVEFUVVM6IHdvcmthcm91bmRzIGFyZQotICAgICAgMSkgQ29tcGlsZSB3aXRob3V0IG9wdGltaXphdGlvbiAoY3Jhc2hlcyBhcmUgb2JzZXJ2ZWQgd2l0aAotICAgICAgICAgLWFyY2ggaTM4NiBhbmQgLU8yIG9yIC1PMywgdXNpbmcgZ2NjLTQuMC4xKS4KLSAgICAgIDIpIENvbXBpbGUgcG5ndGVzdC5jIHdpdGggUE5HX0RFQlVHIGRlZmluZWQgKHRoZSBidWcgZ29lcyBhd2F5IGlmCi0gICAgICAgICB5b3UgdHJ5IHRvIGxvb2sgYXQgaXQpLgotICAgICAgMykgSWdub3JlIHRoZSBjcmFzaC4gIFRoZSBsaWJyYXJ5IGl0c2VsZiBzZWVtcyB0byBiZSBPSy4KLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvTElDRU5TRSBiL2xpYnMvbGlicG5nL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjc4N2QuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0KLVRoaXMgY29weSBvZiB0aGUgbGlicG5nIG5vdGljZXMgaXMgcHJvdmlkZWQgZm9yIHlvdXIgY29udmVuaWVuY2UuICBJbiBjYXNlIG9mCi1hbnkgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIGNvcHkgYW5kIHRoZSBub3RpY2VzIGluIHRoZSBmaWxlIHBuZy5oIHRoYXQgaXMKLWluY2x1ZGVkIGluIHRoZSBsaWJwbmcgZGlzdHJpYnV0aW9uLCB0aGUgbGF0dGVyIHNoYWxsIHByZXZhaWwuCi0KLUNPUFlSSUdIVCBOT1RJQ0UsIERJU0NMQUlNRVIsIGFuZCBMSUNFTlNFOgotCi1JZiB5b3UgbW9kaWZ5IGxpYnBuZyB5b3UgbWF5IGluc2VydCBhZGRpdGlvbmFsIG5vdGljZXMgaW1tZWRpYXRlbHkgZm9sbG93aW5nCi10aGlzIHNlbnRlbmNlLgotCi1saWJwbmcgdmVyc2lvbnMgMS4yLjYsIEF1Z3VzdCAxNSwgMjAwNCwgdGhyb3VnaCAxLjIuMzcsIEp1bmUgNCwgMjAwOSwgYXJlCi1Db3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKLWRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjIuNQotd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWwgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnMKLQotICAgQ29zbWluIFRydXRhCi0KLWxpYnBuZyB2ZXJzaW9ucyAxLjAuNywgSnVseSAxLCAyMDAwLCB0aHJvdWdoIDEuMi41IC0gT2N0b2JlciAzLCAyMDAyLCBhcmUKLUNvcHlyaWdodCAoYykgMjAwMC0yMDAyIEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQotZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMC42Ci13aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnMKLQotICAgU2ltb24tUGllcnJlIENhZGlldXgKLSAgIEVyaWMgUy4gUmF5bW9uZAotICAgR2lsbGVzIFZvbGxhbnQKLQotYW5kIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdG8gdGhlIGRpc2NsYWltZXI6Ci0KLSAgIFRoZXJlIGlzIG5vIHdhcnJhbnR5IGFnYWluc3QgaW50ZXJmZXJlbmNlIHdpdGggeW91ciBlbmpveW1lbnQgb2YgdGhlCi0gICBsaWJyYXJ5IG9yIGFnYWluc3QgaW5mcmluZ2VtZW50LiAgVGhlcmUgaXMgbm8gd2FycmFudHkgdGhhdCBvdXIKLSAgIGVmZm9ydHMgb3IgdGhlIGxpYnJhcnkgd2lsbCBmdWxmaWxsIGFueSBvZiB5b3VyIHBhcnRpY3VsYXIgcHVycG9zZXMKLSAgIG9yIG5lZWRzLiAgVGhpcyBsaWJyYXJ5IGlzIHByb3ZpZGVkIHdpdGggYWxsIGZhdWx0cywgYW5kIHRoZSBlbnRpcmUKLSAgIHJpc2sgb2Ygc2F0aXNmYWN0b3J5IHF1YWxpdHksIHBlcmZvcm1hbmNlLCBhY2N1cmFjeSwgYW5kIGVmZm9ydCBpcyB3aXRoCi0gICB0aGUgdXNlci4KLQotbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjAuNiwgTWFyY2ggMjAsIDIwMDAsIGFyZQotQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQotZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTAuOTYsCi13aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6Ci0KLSAgIFRvbSBMYW5lCi0gICBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAgIFdpbGxlbSB2YW4gU2NoYWlrCi0KLWxpYnBuZyB2ZXJzaW9ucyAwLjg5LCBKdW5lIDE5OTYsIHRocm91Z2ggMC45NiwgTWF5IDE5OTcsIGFyZQotQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi1EaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMC44OCwKLXdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9yczoKLQotICAgSm9obiBCb3dsZXIKLSAgIEtldmluIEJyYWNleQotICAgU2FtIEJ1c2hlbGwKLSAgIE1hZ251cyBIb2xtZ3JlbgotICAgR3JlZyBSb2Vsb2ZzCi0gICBUb20gVGFubmVyCi0KLWxpYnBuZyB2ZXJzaW9ucyAwLjUsIE1heSAxOTk1LCB0aHJvdWdoIDAuODgsIEphbnVhcnkgMTk5NiwgYXJlCi1Db3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCi0KLUZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UsICJDb250cmlidXRpbmcgQXV0aG9ycyIKLWlzIGRlZmluZWQgYXMgdGhlIGZvbGxvd2luZyBzZXQgb2YgaW5kaXZpZHVhbHM6Ci0KLSAgIEFuZHJlYXMgRGlsZ2VyCi0gICBEYXZlIE1hcnRpbmRhbGUKLSAgIEd1eSBFcmljIFNjaGFsbmF0Ci0gICBQYXVsIFNjaG1pZHQKLSAgIFRpbSBXZWduZXIKLQotVGhlIFBORyBSZWZlcmVuY2UgTGlicmFyeSBpcyBzdXBwbGllZCAiQVMgSVMiLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzCi1hbmQgR3JvdXAgNDIsIEluYy4gZGlzY2xhaW0gYWxsIHdhcnJhbnRpZXMsIGV4cHJlc3NlZCBvciBpbXBsaWVkLAotaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZSB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgb2YKLWZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLgotYXNzdW1lIG5vIGxpYWJpbGl0eSBmb3IgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAotb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCB3aGljaCBtYXkgcmVzdWx0IGZyb20gdGhlIHVzZSBvZiB0aGUgUE5HCi1SZWZlcmVuY2UgTGlicmFyeSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcwotc291cmNlIGNvZGUsIG9yIHBvcnRpb25zIGhlcmVvZiwgZm9yIGFueSBwdXJwb3NlLCB3aXRob3V0IGZlZSwgc3ViamVjdAotdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLTEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZC4KLQotMi4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2ggYW5kIG11c3Qgbm90Ci0gICBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc291cmNlLgotCi0zLiBUaGlzIENvcHlyaWdodCBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkKLSAgIHNvdXJjZSBvciBhbHRlcmVkIHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLVRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4gc3BlY2lmaWNhbGx5IHBlcm1pdCwgd2l0aG91dAotZmVlLCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBhcyBhIGNvbXBvbmVudCB0bwotc3VwcG9ydGluZyB0aGUgUE5HIGZpbGUgZm9ybWF0IGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuICBJZiB5b3UgdXNlIHRoaXMKLXNvdXJjZSBjb2RlIGluIGEgcHJvZHVjdCwgYWNrbm93bGVkZ21lbnQgaXMgbm90IHJlcXVpcmVkIGJ1dCB3b3VsZCBiZQotYXBwcmVjaWF0ZWQuCi0KLQotQSAicG5nX2dldF9jb3B5cmlnaHQiIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgZm9yIGNvbnZlbmllbnQgdXNlIGluICJhYm91dCIKLWJveGVzIGFuZCB0aGUgbGlrZToKLQotICAgcHJpbnRmKCIlcyIscG5nX2dldF9jb3B5cmlnaHQoTlVMTCkpOwotCi1BbHNvLCB0aGUgUE5HIGxvZ28gKGluIFBORyBmb3JtYXQsIG9mIGNvdXJzZSkgaXMgc3VwcGxpZWQgaW4gdGhlCi1maWxlcyAicG5nYmFyLnBuZyIgYW5kICJwbmdiYXIuanBnICg4OHgzMSkgYW5kICJwbmdub3cucG5nIiAoOTh4MzEpLgotCi1MaWJwbmcgaXMgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBTb2Z0d2FyZS4gIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgaXMgYQotY2VydGlmaWNhdGlvbiBtYXJrIG9mIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgotCi1HbGVubiBSYW5kZXJzLVBlaHJzb24KLWdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0Ci1KdW5lIDQsIDIwMDkKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL01ha2VmaWxlLmFtIGIvbGlicy9saWJwbmcvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGE0NjEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotIyBNYWtlZmlsZS5hbToKLSMgICBTb3VyY2UgZmlsZSBmb3IgTWFrZWZpbGUuaW4gKGFuZCBoZW5jZSBNYWtlZmlsZSkKLSMKLSMgTWFrZWZpbGUuYW0gbmVlZCBvbmx5IGJlIGNoYW5nZWQgb24gYSBtYWpvciB2ZXJzaW9uIG51bWJlcgotIyBjaGFuZ2UgKGUuZy4gbGlicG5nMTIgLS0+IGxpYnBuZzEzKS4gIEluIHRoYXQgY2FzZSBzZWFjaAotIyB0aGlzIGZpbGUgZm9yIGV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBvbGQgYmFzZSBuYW1lIChsaWJwbmcxMikKLSMgYW5kIGNoYW5nZSB0byB0aGUgbmV3IG9uZSAobGlicG5nMTMpLCB0aGVuIGNoYW5nZSB0aGUKLSMgLXZlcnNpb24tbnVtYmVyIHNldHRpbmdzIGJlbG93IHNvIHRoYXQgdGhlIG5ldyB2YWx1ZXMgaGF2ZQotIyB0aGUgY29ycmVjdCBtYWpvciBwYXJ0IChmaXJzdCBmaWVsZCkuCi0KLVBOR0xJQl9CQVNFTkFNRT0gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQAotCi0jIGxpYnBuZyBkb2VzIG5vdCBmb2xsb3cgR05VIGZpbGUgbmFtZSBjb252ZW50aW9ucwotQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24KLQotIyB0ZXN0IHByb2dyYW1zIC0gcnVuIG9uIG1ha2UgY2hlY2ssIG1ha2UgZGlzdGNoZWNrCi1jaGVja19QUk9HUkFNUz0gcG5ndGVzdAotcG5ndGVzdF9TT1VSQ0VTID0gcG5ndGVzdC5jCi1wbmd0ZXN0X0xEQUREID0gbGlicG5nMTIubGEKLVRFU1RTID0gdGVzdC1wbmd0ZXN0LnNoCi1URVNUU19FTlZJUk9OTUVOVD0gc3JjZGlyPSQoc3JjZGlyKSAKLQotIyBtYW4gcGFnZXMKLWRpc3RfbWFuX01BTlM9IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQotIyBnZW5lcmF0ZSB0aGUgLWNvbmZpZyBzY3JpcHRzIGlmIHJlcXVpcmVkCi1iaW5jb25maWdzPSBsaWJwbmcxMi1jb25maWcgCi1FWFRSQV9TQ1JJUFRTPSBsaWJwbmctY29uZmlnIGxpYnBuZzEyLWNvbmZpZwotYmluX1NDUklQVFM9IEBiaW5jb25maWdzQAotCi0jIHJ1bGVzIHRvIGJ1aWxkIGxpYnBuZywgb25seSBidWlsZCB0aGUgb2xkIGxpYnJhcnkgb24gcmVxdWVzdAotbGliX0xUTElCUkFSSUVTPWxpYnBuZzEyLmxhIEBjb21wYXRsaWJACi1FWFRSQV9MVExJQlJBUklFUz0gbGlicG5nLmxhCi1saWJwbmcxMl9sYV9TT1VSQ0VTID0gcG5nLmMgcG5nc2V0LmMgcG5nZ2V0LmMgcG5ncnV0aWwuYyBwbmd0cmFucy5jIHBuZ3d1dGlsLmMgXAotCXBuZ3JlYWQuYyBwbmdyaW8uYyBwbmd3aW8uYyBwbmd3cml0ZS5jIHBuZ3J0cmFuLmMgXAotCXBuZ3d0cmFuLmMgcG5nbWVtLmMgcG5nZXJyb3IuYyBwbmdwcmVhZC5jIFwKLQlwbmcuaCBwbmdjb25mLmgKLWxpYnBuZ19sYV9TT1VSQ0VTID0gJChsaWJwbmcxMl9sYV9TT1VSQ0VTKQotCi1saWJwbmdfbGFfQ1BQRkxBR1MgPSBATElCUE5HX0RFRklORVNACi1saWJwbmcxMl9sYV9DUFBGTEFHUyA9IEBMSUJQTkdfREVGSU5FU0AKLQotIyBNQUpPUiBVUEdSQURFOiB0aGUgdmVyc2lvbi1udW1iZXIgc2V0dGluZ3MgYmVsb3cgbXVzdCBiZSBjaGFuZ2VkLgotbGlicG5nMTJfbGFfTERGTEFHUyA9IC1uby11bmRlZmluZWQgLWV4cG9ydC1keW5hbWljIFwKLQktdmVyc2lvbi1udW1iZXIgMDpAUE5HTElCX1JFTEVBU0VAOjAKLSMgLXJwYXRoIGlzIG5lZWRlZCBhcyBhdXRvbWFrZSBkb2Vzbid0IGtub3cgdGhlIGRpcmVjdG9yeQotbGlicG5nX2xhX0xERkxBR1MgPSAtcnBhdGggJyQobGliZGlyKScgLW5vLXVuZGVmaW5lZCAtZXhwb3J0LWR5bmFtaWMgXAotCS12ZXJzaW9uLW51bWJlciAzOkBQTkdMSUJfUkVMRUFTRUA6MAotCi1pZiBIQVZFX0xEX1ZFUlNJT05fU0NSSVBUCi0gICMgVmVyc2lvbmVkIHN5bWJvbHMgYW5kIHJlc3RyaWN0ZWQgZXhwb3J0cwotICBsaWJwbmcxMl9sYV9MREZMQUdTICs9IC1XbCwtLXZlcnNpb24tc2NyaXB0PWxpYnBuZy52ZXJzCi0gIGxpYnBuZzEyX2xhX0RFUEVOREVOQ0lFUyA9IGxpYnBuZy52ZXJzCi1lbHNlCi0gICMgT25seSByZXN0cmljdGVkIGV4cG9ydHMgd2hlbiBwb3NzaWJsZQotICBsaWJwbmcxMl9sYV9MREZMQUdTICs9IC1leHBvcnQtc3ltYm9scyBsaWJwbmcuc3ltCi0gIGxpYnBuZzEyX2xhX0RFUEVOREVOQ0lFUyA9IGxpYnBuZy5zeW0KLWVuZGlmCi1saWJwbmdfbGFfREVQRU5ERU5DSUVTID0gJChsaWJwbmcxMl9sYV9ERVBFTkRFTkNJRVMpCi0KLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLUFOID0gJ19hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OScKLQotI2Rpc3RyaWJ1dGUgaGVhZGVycyBpbiAvdXNyL2luY2x1ZGUvbGlicG5nLyoKLXBrZ2luY2x1ZGVkaXI9ICQoaW5jbHVkZWRpcikvJChQTkdMSUJfQkFTRU5BTUUpCi1wa2dpbmNsdWRlX0hFQURFUlM9IHBuZy5oIHBuZ2NvbmYuaAotCi0jIHBrZy1jb25maWcgc3R1ZmYsIG5vdGUgdGhhdCBsaWJwbmcucGMgaXMgYWx3YXlzIHJlcXVpcmVkIGluIG9yZGVyCi0jIHRvIGdldCB0aGUgY29ycmVjdCBsaWJyYXJ5Ci1wa2djb25maWdkaXIgPSBAcGtnY29uZmlnZGlyQAotcGtnY29uZmlnX0RBVEEgPSBsaWJwbmcxMi5wYwotCi0jZXh0cmEgc291cmNlIGRpc3RyaWJ1dGlvbiBmaWxlcy4KLUVYVFJBX0RJU1Q9IFwKLQlBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPIFwKLQlwbmd0ZXN0LnBuZyBwbmdiYXIucG5nIHBuZ25vdy5wbmcgcG5nYmFyLmpwZyBhdXRvZ2VuLnNoIFwKLQkke3NyY2Rpcn0vcHJvamVjdHMvY2J1aWxkZXI1LyogXAotCSR7c3JjZGlyfS9wcm9qZWN0cy9iZW9zLyogXAotCSR7c3JjZGlyfS9wcm9qZWN0cy92aXN1YWxjNi8qIFwKLQkke3NyY2Rpcn0vcHJvamVjdHMvdmlzdWFsYzcxLyogXAotCSR7c3JjZGlyfS9wcm9qZWN0cy93aW5jZS50eHQgXAotCSR7c3JjZGlyfS9wcm9qZWN0cy9uZXR3YXJlLnR4dCBcCi0JJHtzcmNkaXJ9L3NjcmlwdHMvKiBcCi0JJHtzcmNkaXJ9L2NvbnRyaWIvZ3JlZ2Jvb2svKiBcCi0JJHtzcmNkaXJ9L2NvbnRyaWIvcG5nbWludXMvKiBcCi0JJHtzcmNkaXJ9L2NvbnRyaWIvcG5nc3VpdGUvKiBcCi0JJHtzcmNkaXJ9L2NvbnRyaWIvdmlzdXBuZy8qIFwKLQkkKFRFU1RTKSBcCi0JZXhhbXBsZS5jIGxpYnBuZy0xLjIuMzcudHh0IHBuZ3ZjcmQuYyAKLQotQ0xFQU5GSUxFUz0gcG5nb3V0LnBuZyBsaWJwbmcxMi5wYyBsaWJwbmcxMi1jb25maWcgbGlicG5nLnZlcnMgXAotbGlicG5nLnN5bQotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluIGFjbG9jYWwubTQgY29uZmlnLmd1ZXNzIGNvbmZpZy5oLmluIFwKLWNvbmZpZy5zdWIgY29uZmlndXJlIGRlcGNvbXAgaW5zdGFsbC1zaCBsdG1haW4uc2ggbWlzc2luZwotCi0kKFBOR0xJQl9CQVNFTkFNRSkucGM6IGxpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkQAotCi0kKFBOR0xJQl9CQVNFTkFNRSktY29uZmlnOiBsaWJwbmctY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkQAotCi1saWJwbmcuc3ltOiBwbmcuaCBwbmdjb25mLmgKLQlybSAtZiAkQCAkQC5uZXcKLQkkKENQUCkgQExJQlBOR19ERUZJTkVTQCAkKENQUEZMQUdTKSAtRFBOR19CVUlMRFNZTVMgJChzcmNkaXIpL3BuZy5oIHwgXAotCQkkKFNFRCkgLW4gLWUgXAotCQknc3xeLipQTkdfRlVOQ1RJT05fRVhQT1JUWyAJXSpcKFskKEFOKV0qXCkuKiQkfCQoU1lNQk9MX1BSRUZJWClcMXxwJyBcCi0JCS1lICdzfF4uKlBOR19EQVRBX0VYUE9SVFsgCV0qXChbJChBTildKlwpLiokJHwkKFNZTUJPTF9QUkVGSVgpXDF8cCcgXAotCQkJPiRALm5ldwotCW12ICRALm5ldyAkQAotCi1saWJwbmcudmVyczogbGlicG5nLnN5bQotCXJtIC1mICRAICRALm5ldwotCWVjaG8gUE5HQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF8wICd7Z2xvYmFsOicgPiAkQC5uZXcKLQkkKFNFRCkgcy8kJC9cOy8gbGlicG5nLnN5bSA+PiAkQC5uZXcKLQllY2hvICdsb2NhbDogKjsgfTsnID4+ICRALm5ldwotCW12ICRALm5ldyAkQAotCi10ZXN0OiBjaGVjawotCi0jIGluc3RhbGwgdGhlIC4uLi9pbmNsdWRlIGhlYWRlcnMgYXMgbGlua3MgdG8gdGhlIG5ldyBvbmVzCi1pbnN0YWxsLWRhdGEtaG9vazoKLQljZCAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgcm0gLWYgcG5nLmggcG5nY29uZi5oCi0JY2QgJChERVNURElSKSQoaW5jbHVkZWRpcik7ICQoTE5fUykgJChQTkdMSUJfQkFTRU5BTUUpL3BuZy5oIHBuZy5oCi0JY2QgJChERVNURElSKSQoaW5jbHVkZWRpcik7ICQoTE5fUykgJChQTkdMSUJfQkFTRU5BTUUpL3BuZ2NvbmYuaCBwbmdjb25mLmgKLQljZCAkKERFU1RESVIpJChwa2djb25maWdkaXIpOyBybSAtZiBsaWJwbmcucGMKLQljZCAkKERFU1RESVIpJChwa2djb25maWdkaXIpOyAkKExOX1MpICQoUE5HTElCX0JBU0VOQU1FKS5wYyBsaWJwbmcucGMKLQotIyBkbyBldmlsIHRoaW5ncyB0byBsaWJwbmcgdG8gY2F1c2UgbGlicG5nMTIgdG8gYmUgdXNlZAotaW5zdGFsbC1leGVjLWhvb2s6Ci0JY2QgJChERVNURElSKSQoYmluZGlyKTsgcm0gLWYgbGlicG5nLWNvbmZpZwotCWNkICQoREVTVERJUikkKGJpbmRpcik7ICQoTE5fUykgJChQTkdMSUJfQkFTRU5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnCi0JQHNldCAteDtcCi0JY2QgJChERVNURElSKSQobGliZGlyKTtcCi0JZm9yIGV4dCBpbiBhIGxhIHNvIHNsIGR5bGliOyBkb1wKLQkJcm0gLWYgbGlicG5nLiQkZXh0O1wKLSAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICQoUE5HTElCX0JBU0VOQU1FKS4kJGV4dDsgdGhlblwKLSAgICAgICAgICAgICAgICAgICAgICAgJChMTl9TKSAkKFBOR0xJQl9CQVNFTkFNRSkuJCRleHQgbGlicG5nLiQkZXh0O1wKLSAgICAgICAgICAgICAgICBmaTtcCi0JZG9uZQotCi11bmluc3RhbGwtaG9vazoKLQljZCAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgcm0gLWYgcG5nLmggcG5nY29uZi5oCi0Jcm0gLWYgJChERVNURElSKSQocGtnY29uZmlnZGlyKS9saWJwbmcucGMKLQlybSAtZiAkKERFU1RESVIpJChiaW5kaXIpL2xpYnBuZy1jb25maWcKLQlAaWYgdGVzdCAtbiAiQGNvbXBhdGxpYkAiOyB0aGVuXAotCQlzZXQgLXg7XAotCQljZCAkKERFU1RESVIpJChsaWJkaXIpO1wKLQkJZm9yIGV4dCBpbiBhIGxhIHNvIHNsIGR5bGliOyBkb1wKLQkJCXJtIC1mIGxpYnBuZy4kJGV4dDtcCi0JCWRvbmU7XAotCWZpCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9NYWtlZmlsZS5pbiBiL2xpYnMvbGlicG5nL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjFhNTAzLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTM0MiArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjEwLjIgZnJvbSBNYWtlZmlsZS5hbS4KLSMgQGNvbmZpZ3VyZV9pbnB1dEAKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCi0jIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotQFNFVF9NQUtFQAotCi0jIE1ha2VmaWxlLmFtOgotIyAgIFNvdXJjZSBmaWxlIGZvciBNYWtlZmlsZS5pbiAoYW5kIGhlbmNlIE1ha2VmaWxlKQotIwotIyBNYWtlZmlsZS5hbSBuZWVkIG9ubHkgYmUgY2hhbmdlZCBvbiBhIG1ham9yIHZlcnNpb24gbnVtYmVyCi0jIGNoYW5nZSAoZS5nLiBsaWJwbmcxMiAtLT4gbGlicG5nMTMpLiAgSW4gdGhhdCBjYXNlIHNlYWNoCi0jIHRoaXMgZmlsZSBmb3IgZXZlcnkgaW5zdGFuY2Ugb2YgdGhlIG9sZCBiYXNlIG5hbWUgKGxpYnBuZzEyKQotIyBhbmQgY2hhbmdlIHRvIHRoZSBuZXcgb25lIChsaWJwbmcxMyksIHRoZW4gY2hhbmdlIHRoZQotIyAtdmVyc2lvbi1udW1iZXIgc2V0dGluZ3MgYmVsb3cgc28gdGhhdCB0aGUgbmV3IHZhbHVlcyBoYXZlCi0jIHRoZSBjb3JyZWN0IG1ham9yIHBhcnQgKGZpcnN0IGZpZWxkKS4KLQotCi0KLQotcmVzZGlyID0gLi9yZXNvdXJjZQotcG5nbWludXNkaXIgPSBjb250cmliL3BuZ21pbnVzCi1WUEFUSCA9IEBzcmNkaXJAICQocmVzZGlyKSAkKHNyY2RpcikvJChwbmdtaW51c2RpcikKLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAotaW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKLWluc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKLWluc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYwotSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKLXRyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotY2hlY2tfUFJPR1JBTVMgPSBwbmd0ZXN0JChFWEVFWFQpCi1ASEFWRV9MRF9WRVJTSU9OX1NDUklQVF9UUlVFQGFtX19hcHBlbmRfMSA9IC1XbCwtLXZlcnNpb24tc2NyaXB0PWxpYnBuZy52ZXJzCi1ASEFWRV9MRF9WRVJTSU9OX1NDUklQVF9GQUxTRUBhbV9fYXBwZW5kXzIgPSAtZXhwb3J0LXN5bWJvbHMgbGlicG5nLnN5bQotc3ViZGlyID0gLgotRElTVF9DT01NT04gPSBSRUFETUUgJChhbV9fY29uZmlndXJlX2RlcHMpICQoZGlzdF9tYW5fTUFOUykgXAotCSQocGtnaW5jbHVkZV9IRUFERVJTKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAotCSQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvY29uZmlnLmguaW4gXAotCSQodG9wX3NyY2RpcikvY29uZmlndXJlICQodG9wX3NyY2Rpcikvc2NyaXB0cy9saWJwbmctY29uZmlnLmluIFwKLQkkKHRvcF9zcmNkaXIpL3NjcmlwdHMvbGlicG5nLnBjLWNvbmZpZ3VyZS5pbiBJTlNUQUxMIFRPRE8gXAotCWNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGRlcGNvbXAgaW5zdGFsbC1zaCBsdG1haW4uc2ggbWlzc2luZyBcCi0JbWtpbnN0YWxsZGlycwotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLWFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTID0gY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBcCi0gY29uZmlndXJlLmxpbmVubyBjb25maWcuc3RhdHVzLmxpbmVubwotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7Ci1hbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAotICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCi0gICAgKikgZj0kJHA7OyBcCi0gIGVzYWM7Ci1hbV9fc3RyaXBfZGlyID0gYGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgOwotYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKGxpYmRpcikiICIkKERFU1RESVIpJChiaW5kaXIpIiBcCi0JIiQoREVTVERJUikkKG1hbjNkaXIpIiAiJChERVNURElSKSQobWFuNWRpcikiIFwKLQkiJChERVNURElSKSQocGtnY29uZmlnZGlyKSIgIiQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpIgotbGliTFRMSUJSQVJJRVNfSU5TVEFMTCA9ICQoSU5TVEFMTCkKLUxUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpCi1saWJwbmdfbGFfTElCQUREID0KLWFtX19vYmplY3RzXzEgPSBsaWJwbmdfbGEtcG5nLmxvIGxpYnBuZ19sYS1wbmdzZXQubG8gXAotCWxpYnBuZ19sYS1wbmdnZXQubG8gbGlicG5nX2xhLXBuZ3J1dGlsLmxvIFwKLQlsaWJwbmdfbGEtcG5ndHJhbnMubG8gbGlicG5nX2xhLXBuZ3d1dGlsLmxvIFwKLQlsaWJwbmdfbGEtcG5ncmVhZC5sbyBsaWJwbmdfbGEtcG5ncmlvLmxvIGxpYnBuZ19sYS1wbmd3aW8ubG8gXAotCWxpYnBuZ19sYS1wbmd3cml0ZS5sbyBsaWJwbmdfbGEtcG5ncnRyYW4ubG8gXAotCWxpYnBuZ19sYS1wbmd3dHJhbi5sbyBsaWJwbmdfbGEtcG5nbWVtLmxvIFwKLQlsaWJwbmdfbGEtcG5nZXJyb3IubG8gbGlicG5nX2xhLXBuZ3ByZWFkLmxvIFwKLQlsaWJwbmctZGxsdmVyc2lvbi5sbyBsaWJwbmctZGxsLXJlcy5sbwotYW1fbGlicG5nX2xhX09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzEpCi1saWJwbmdfbGFfT0JKRUNUUyA9ICQoYW1fbGlicG5nX2xhX09CSkVDVFMpCi1saWJwbmdfbGFfTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKLQkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKLQkkKGxpYnBuZ19sYV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACi1saWJwbmcxMl9sYV9MSUJBREQgPQotYW1fbGlicG5nMTJfbGFfT0JKRUNUUyA9IGxpYnBuZzEyX2xhLXBuZy5sbyBsaWJwbmcxMl9sYS1wbmdzZXQubG8gXAotCWxpYnBuZzEyX2xhLXBuZ2dldC5sbyBsaWJwbmcxMl9sYS1wbmdydXRpbC5sbyBcCi0JbGlicG5nMTJfbGEtcG5ndHJhbnMubG8gbGlicG5nMTJfbGEtcG5nd3V0aWwubG8gXAotCWxpYnBuZzEyX2xhLXBuZ3JlYWQubG8gbGlicG5nMTJfbGEtcG5ncmlvLmxvIFwKLQlsaWJwbmcxMl9sYS1wbmd3aW8ubG8gbGlicG5nMTJfbGEtcG5nd3JpdGUubG8gXAotCWxpYnBuZzEyX2xhLXBuZ3J0cmFuLmxvIGxpYnBuZzEyX2xhLXBuZ3d0cmFuLmxvIFwKLQlsaWJwbmcxMl9sYS1wbmdtZW0ubG8gbGlicG5nMTJfbGEtcG5nZXJyb3IubG8gXAotCWxpYnBuZzEyX2xhLXBuZ3ByZWFkLmxvIFwKLQlsaWJwbmcxMi1kbGx2ZXJzaW9uLmxvIGxpYnBuZzEyLWRsbC1yZXMubG8KLWxpYnBuZzEyX2xhX09CSkVDVFMgPSAkKGFtX2xpYnBuZzEyX2xhX09CSkVDVFMpCi1saWJwbmcxMl9sYV9MSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAotCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAotCSQobGlicG5nMTJfbGFfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAotYW1fcG5ndGVzdF9PQkpFQ1RTID0gcG5ndGVzdC4kKE9CSkVYVCkKLXBuZ3Rlc3RfT0JKRUNUUyA9ICQoYW1fcG5ndGVzdF9PQkpFQ1RTKQotcG5ndGVzdF9ERVBFTkRFTkNJRVMgPSBsaWJwbmcxMi5sYQotYmluU0NSSVBUX0lOU1RBTEwgPSAkKElOU1RBTExfU0NSSVBUKQotU0NSSVBUUyA9ICQoYmluX1NDUklQVFMpCi1ERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQAotZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAotYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAotCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCi0JLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKLQkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAotCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKLQkkKExERkxBR1MpIC1vICRACi1TT1VSQ0VTID0gJChsaWJwbmdfbGFfU09VUkNFUykgJChsaWJwbmcxMl9sYV9TT1VSQ0VTKSBcCi0JJChwbmd0ZXN0X1NPVVJDRVMpCi1ESVNUX1NPVVJDRVMgPSAkKGxpYnBuZ19sYV9TT1VSQ0VTKSAkKGxpYnBuZzEyX2xhX1NPVVJDRVMpIFwKLQkkKHBuZ3Rlc3RfU09VUkNFUykKLW1hbjNkaXIgPSAkKG1hbmRpcikvbWFuMwotbWFuNWRpciA9ICQobWFuZGlyKS9tYW41Ci1OUk9GRiA9IG5yb2ZmCi1NQU5TID0gJChkaXN0X21hbl9NQU5TKQotcGtnY29uZmlnREFUQV9JTlNUQUxMID0gJChJTlNUQUxMX0RBVEEpCi1EQVRBID0gJChwa2djb25maWdfREFUQSkKLXBrZ2luY2x1ZGVIRUFERVJTX0lOU1RBTEwgPSAkKElOU1RBTExfSEVBREVSKQotSEVBREVSUyA9ICQocGtnaW5jbHVkZV9IRUFERVJTKQotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotYW1fX3JlbW92ZV9kaXN0ZGlyID0gXAotICB7IHRlc3QgISAtZCAkKGRpc3RkaXIpIFwKLSAgICB8fCB7IGZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkICEgLXBlcm0gLTIwMCAtZXhlYyBjaG1vZCB1K3cge30gJzsnIFwKLSAgICAgICAgICYmIHJtIC1mciAkKGRpc3RkaXIpOyB9OyB9Ci1ESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKLUdaSVBfRU5WID0gLS1iZXN0Ci1kaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50Ci1kaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKLQotI2Rpc3RyaWJ1dGUgaGVhZGVycyBpbiAvdXNyL2luY2x1ZGUvbGlicG5nLyoKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpLyQoUE5HTElCX0JBU0VOQU1FKQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQU1UQVIgPSBAQU1UQVJACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFXSyA9IEBBV0tACi1DQyA9IEBDQ0AKLUNDREVQTU9ERSA9IEBDQ0RFUE1PREVACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQID0gQENQUEAKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKLURFRlMgPSBAREVGU0AKLURFUERJUiA9IEBERVBESVJACi1ETExUT09MID0gQERMTFRPT0xACi1EU1lNVVRJTCA9IEBEU1lNVVRJTEAKLURVTVBCSU4gPSBARFVNUEJJTkAKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUZHUkVQID0gQEZHUkVQQAotR1JFUCA9IEBHUkVQQAotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLUlOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACi1MRCA9IEBMREAKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQk9CSlMgPSBATElCT0JKU0AKLUxJQlBOR19ERUZJTkVTID0gQExJQlBOR19ERUZJTkVTQAotTElCUE5HX05PX01NWCA9IEBMSUJQTkdfTk9fTU1YQAotTElCUyA9IEBMSUJTQAotTElCVE9PTCA9IEBMSUJUT09MQAotTElQTyA9IEBMSVBPQAotTE5fUyA9IEBMTl9TQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0RJUl9QID0gQE1LRElSX1BACi1OTSA9IEBOTUAKLU5NRURJVCA9IEBOTUVESVRACi1PQkpEVU1QID0gQE9CSkRVTVBACi1PVE9PTCA9IEBPVE9PTEAKLU9UT09MNjQgPSBAT1RPT0w2NEAKLU9CSkVYVCA9IEBPQkpFWFRACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKLVBBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACi1QQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKLVBBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACi1QQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAotUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACi1QTkdMSUJfTUFKT1IgPSBAUE5HTElCX01BSk9SQAotUE5HTElCX01JTk9SID0gQFBOR0xJQl9NSU5PUkAKLVBOR0xJQl9SRUxFQVNFID0gQFBOR0xJQl9SRUxFQVNFQAotUE5HTElCX1ZFUlNJT04gPSBAUE5HTElCX1ZFUlNJT05ACi1QT1dfTElCID0gQFBPV19MSUJACi1SQU5MSUIgPSBAUkFOTElCQAotU0VEID0gQFNFREAKLVNFVF9NQUtFID0gQFNFVF9NQUtFQAotU0hFTEwgPSBAU0hFTExACi1TVFJJUCA9IEBTVFJJUEAKLVNZTUJPTF9QUkVGSVggPSBAU1lNQk9MX1BSRUZJWEAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLUxERkxBR1MgKz0gLVdsLC0tbWFqb3ItaW1hZ2UtdmVyc2lvbj0kKFBOR0xJQl9NQUpPUikgLVdsLC0tbWlub3ItaW1hZ2UtdmVyc2lvbj0kKFBOR0xJQl9NSU5PUikgCi1hYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAotYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAotYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAotYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACi1hY19jdF9DQyA9IEBhY19jdF9DQ0AKLWFjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKLWFtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAotYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKLWFtX19xdW90ZSA9IEBhbV9fcXVvdGVACi1hbV9fdGFyID0gQGFtX190YXJACi1hbV9fdW50YXIgPSBAYW1fX3VudGFyQAotCi0jIGdlbmVyYXRlIHRoZSAtY29uZmlnIHNjcmlwdHMgaWYgcmVxdWlyZWQKLWJpbmNvbmZpZ3MgPSBsaWJwbmcxMi1jb25maWcgCi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWNvbXBhdGxpYiA9IEBjb21wYXRsaWJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRvY2RpciA9IEBkb2NkaXJACi1kdmlkaXIgPSBAZHZpZGlyQAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1ob3N0ID0gQGhvc3RACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X2NwdSA9IEBob3N0X2NwdUAKLWhvc3Rfb3MgPSBAaG9zdF9vc0AKLWhvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAotaHRtbGRpciA9IEBodG1sZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotaW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAotbGliZGlyID0gQGxpYmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWxvY2FsZWRpciA9IEBsb2NhbGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1sdF9FQ0hPID0gQGx0X0VDSE9ACi1tYW5kaXIgPSBAbWFuZGlyQAotbWtkaXJfcCA9IEBta2Rpcl9wQAotb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAotcGRmZGlyID0gQHBkZmRpckAKLQotIyBwa2ctY29uZmlnIHN0dWZmLCBub3RlIHRoYXQgbGlicG5nLnBjIGlzIGFsd2F5cyByZXF1aXJlZCBpbiBvcmRlcgotIyB0byBnZXQgdGhlIGNvcnJlY3QgbGlicmFyeQotcGtnY29uZmlnZGlyID0gQHBrZ2NvbmZpZ2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1wc2RpciA9IEBwc2RpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotc3JjZGlyID0gQHNyY2RpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACi10b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotUE5HTElCX0JBU0VOQU1FID0gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQAotCi0jIGxpYnBuZyBkb2VzIG5vdCBmb2xsb3cgR05VIGZpbGUgbmFtZSBjb252ZW50aW9ucwotQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24KLXBuZ3Rlc3RfU09VUkNFUyA9IHBuZ3Rlc3QuYwotcG5ndGVzdF9MREFERCA9IGxpYnBuZzEyLmxhCi1URVNUUyA9IHRlc3QtcG5ndGVzdC5zaAotVEVTVFNfRU5WSVJPTk1FTlQgPSBzcmNkaXI9JChzcmNkaXIpIAotCi0jIG1hbiBwYWdlcwotZGlzdF9tYW5fTUFOUyA9IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLUVYVFJBX1NDUklQVFMgPSBsaWJwbmctY29uZmlnIGxpYnBuZzEyLWNvbmZpZwotYmluX1NDUklQVFMgPSBAYmluY29uZmlnc0AKLQotIyBydWxlcyB0byBidWlsZCBsaWJwbmcsIG9ubHkgYnVpbGQgdGhlIG9sZCBsaWJyYXJ5IG9uIHJlcXVlc3QKLWxpYl9MVExJQlJBUklFUyA9IGxpYnBuZzEyLmxhIEBjb21wYXRsaWJACi1FWFRSQV9MVExJQlJBUklFUyA9IGxpYnBuZy5sYQotbGlicG5nMTJfbGFfU09VUkNFUyA9IHBuZy5jIHBuZ3NldC5jIHBuZ2dldC5jIHBuZ3J1dGlsLmMgcG5ndHJhbnMuYyBwbmd3dXRpbC5jIFwKLQlwbmdyZWFkLmMgcG5ncmlvLmMgcG5nd2lvLmMgcG5nd3JpdGUuYyBwbmdydHJhbi5jIFwKLQlwbmd3dHJhbi5jIHBuZ21lbS5jIHBuZ2Vycm9yLmMgcG5ncHJlYWQuYyBcCi0JcG5nLmggcG5nY29uZi5oCi0KLWxpYnBuZ19sYV9TT1VSQ0VTID0gJChsaWJwbmcxMl9sYV9TT1VSQ0VTKQotbGlicG5nX2xhX0NQUEZMQUdTID0gQExJQlBOR19ERUZJTkVTQAotbGlicG5nMTJfbGFfQ1BQRkxBR1MgPSBATElCUE5HX0RFRklORVNACi0KLSMgTUFKT1IgVVBHUkFERTogdGhlIHZlcnNpb24tbnVtYmVyIHNldHRpbmdzIGJlbG93IG11c3QgYmUgY2hhbmdlZC4KLWxpYnBuZzEyX2xhX0xERkxBR1MgPSAtbm8tdW5kZWZpbmVkIC1leHBvcnQtZHluYW1pYyAtdmVyc2lvbi1udW1iZXIgXAotCTA6QFBOR0xJQl9SRUxFQVNFQDowICQoYW1fX2FwcGVuZF8xKSAkKGFtX19hcHBlbmRfMikKLSMgLXJwYXRoIGlzIG5lZWRlZCBhcyBhdXRvbWFrZSBkb2Vzbid0IGtub3cgdGhlIGRpcmVjdG9yeQotbGlicG5nX2xhX0xERkxBR1MgPSAtcnBhdGggJyQobGliZGlyKScgLW5vLXVuZGVmaW5lZCAtZXhwb3J0LWR5bmFtaWMgXAotCS12ZXJzaW9uLW51bWJlciAzOkBQTkdMSUJfUkVMRUFTRUA6MAotCi1ASEFWRV9MRF9WRVJTSU9OX1NDUklQVF9GQUxTRUBsaWJwbmcxMl9sYV9ERVBFTkRFTkNJRVMgPSBsaWJwbmcuc3ltCi1ASEFWRV9MRF9WRVJTSU9OX1NDUklQVF9UUlVFQGxpYnBuZzEyX2xhX0RFUEVOREVOQ0lFUyA9IGxpYnBuZy52ZXJzCi1saWJwbmdfbGFfREVQRU5ERU5DSUVTID0gJChsaWJwbmcxMl9sYV9ERVBFTkRFTkNJRVMpCi0KLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLUFOID0gJ19hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OScKLXBrZ2luY2x1ZGVfSEVBREVSUyA9IHBuZy5oIHBuZ2NvbmYuaAotcGtnY29uZmlnX0RBVEEgPSBsaWJwbmcxMi5wYwotCi0jZXh0cmEgc291cmNlIGRpc3RyaWJ1dGlvbiBmaWxlcy4KLUVYVFJBX0RJU1QgPSBcCi0JQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTyBcCi0JcG5ndGVzdC5wbmcgcG5nYmFyLnBuZyBwbmdub3cucG5nIHBuZ2Jhci5qcGcgYXV0b2dlbi5zaCBcCi0JJHtzcmNkaXJ9L3Byb2plY3RzL2NidWlsZGVyNS8qIFwKLQkke3NyY2Rpcn0vcHJvamVjdHMvYmVvcy8qIFwKLQkke3NyY2Rpcn0vcHJvamVjdHMvdmlzdWFsYzYvKiBcCi0JJHtzcmNkaXJ9L3Byb2plY3RzL3Zpc3VhbGM3MS8qIFwKLQkke3NyY2Rpcn0vcHJvamVjdHMvd2luY2UudHh0IFwKLQkke3NyY2Rpcn0vcHJvamVjdHMvbmV0d2FyZS50eHQgXAotCSR7c3JjZGlyfS9zY3JpcHRzLyogXAotCSR7c3JjZGlyfS9jb250cmliL2dyZWdib29rLyogXAotCSR7c3JjZGlyfS9jb250cmliL3BuZ21pbnVzLyogXAotCSR7c3JjZGlyfS9jb250cmliL3BuZ3N1aXRlLyogXAotCSR7c3JjZGlyfS9jb250cmliL3Zpc3VwbmcvKiBcCi0JJChURVNUUykgXAotCWV4YW1wbGUuYyBsaWJwbmctMS4yLjM3LnR4dCBwbmd2Y3JkLmMgCi0KLUNMRUFORklMRVMgPSBwbmdvdXQucG5nIGxpYnBuZzEyLnBjIGxpYnBuZzEyLWNvbmZpZyBsaWJwbmcudmVycyBcCi1saWJwbmcuc3ltCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4gYWNsb2NhbC5tNCBjb25maWcuZ3Vlc3MgY29uZmlnLmguaW4gXAotY29uZmlnLnN1YiBjb25maWd1cmUgZGVwY29tcCBpbnN0YWxsLXNoIGx0bWFpbi5zaCBtaXNzaW5nCi0KLWFsbDogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtYW0KLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iaiAucmMgLmRsbCAuZXhlCi1hbS0tcmVmcmVzaDoKLQlAOgotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCi0JQGZvciBkZXAgaW4gJD87IGRvIFwKLQkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAotCSAgICAqJCRkZXAqKSBcCi0JICAgICAgZWNobyAnIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gJzsgXAotCSAgICAgIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIFwKLQkJJiYgZXhpdCAwOyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIE1ha2VmaWxlJzsgXAotCWNkICQodG9wX3NyY2RpcikgJiYgXAotCSAgJChBVVRPTUFLRSkgLS1mb3JlaWduICBNYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGVjaG8gJyAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMnOyBcCi0JICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1czs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAotCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKLQllc2FjOwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLSQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQotCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCi0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCi0KLWNvbmZpZy5oOiBzdGFtcC1oMQotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCSAgcm0gLWYgc3RhbXAtaDE7IFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHN0YW1wLWgxOyBcCi0JZWxzZSA6OyBmaQotCi1zdGFtcC1oMTogJChzcmNkaXIpL2NvbmZpZy5oLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JQHJtIC1mIHN0YW1wLWgxCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyBjb25maWcuaAotJChzcmNkaXIpL2NvbmZpZy5oLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlybSAtZiBzdGFtcC1oMQotCXRvdWNoICRACi0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oIHN0YW1wLWgxCi1saWJwbmcucGM6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQodG9wX3NyY2Rpcikvc2NyaXB0cy9saWJwbmcucGMtY29uZmlndXJlLmluCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQAotbGlicG5nLWNvbmZpZzogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgJCh0b3Bfc3JjZGlyKS9zY3JpcHRzL2xpYnBuZy1jb25maWcuaW4KLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRACi1pbnN0YWxsLWxpYkxUTElCUkFSSUVTOiAkKGxpYl9MVExJQlJBUklFUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQl0ZXN0IC16ICIkKGxpYmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGxpYmRpcikiCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBmPSQoYW1fX3N0cmlwX2RpcikgXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQobGliTFRMSUJSQVJJRVNfSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICckJHAnICckKERFU1RESVIpJChsaWJkaXIpLyQkZiciOyBcCi0JICAgICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKGxpYkxUTElCUkFSSUVTX0lOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAiJCRwIiAiJChERVNURElSKSQobGliZGlyKS8kJGYiOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBwPSQoYW1fX3N0cmlwX2RpcikgXAotCSAgZWNobyAiICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICckKERFU1RESVIpJChsaWJkaXIpLyQkcCciOyBcCi0JICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAiJChERVNURElSKSQobGliZGlyKS8kJHAiOyBcCi0JZG9uZQotCi1jbGVhbi1saWJMVExJQlJBUklFUzoKLQktdGVzdCAteiAiJChsaWJfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKGxpYl9MVExJQlJBUklFUykKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBkaXI9ImBlY2hvICQkcCB8IHNlZCAtZSAnc3wvW14vXSokJHx8J2AiOyBcCi0JICB0ZXN0ICIkJGRpciIgIT0gIiQkcCIgfHwgZGlyPS47IFwKLQkgIGVjaG8gInJtIC1mIFwiJCR7ZGlyfS9zb19sb2NhdGlvbnNcIiI7IFwKLQkgIHJtIC1mICIkJHtkaXJ9L3NvX2xvY2F0aW9ucyI7IFwKLQlkb25lCi1saWJwbmcubGE6ICQobGlicG5nX2xhX09CSkVDVFMpICQobGlicG5nX2xhX0RFUEVOREVOQ0lFUykgCi0JJChsaWJwbmdfbGFfTElOSykgICQobGlicG5nX2xhX09CSkVDVFMpICQobGlicG5nX2xhX0xJQkFERCkgJChMSUJTKSAtZGxsbmFtZSBsaWJwbmcKLWxpYnBuZzEyLmxhOiAkKGxpYnBuZzEyX2xhX09CSkVDVFMpICQobGlicG5nMTJfbGFfREVQRU5ERU5DSUVTKSAKLQkkKGxpYnBuZzEyX2xhX0xJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJwbmcxMl9sYV9PQkpFQ1RTKSAkKGxpYnBuZzEyX2xhX0xJQkFERCkgJChMSUJTKSAtZGxsbmFtZSBsaWJwbmcxMgotCi1jbGVhbi1jaGVja1BST0dSQU1TOgotCUBsaXN0PSckKGNoZWNrX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgZj1gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAotCSAgZWNobyAiIHJtIC1mICQkcCAkJGYiOyBcCi0JICBybSAtZiAkJHAgJCRmIDsgXAotCWRvbmUKLXBuZ3Rlc3QkKEVYRUVYVCk6ICQocG5ndGVzdF9PQkpFQ1RTKSAkKHBuZ3Rlc3RfREVQRU5ERU5DSUVTKSAKLQlAcm0gLWYgcG5ndGVzdCQoRVhFRVhUKQotCSQoTElOSykgJChwbmd0ZXN0X09CSkVDVFMpICQocG5ndGVzdF9MREFERCkgJChMSUJTKQotaW5zdGFsbC1iaW5TQ1JJUFRTOiAkKGJpbl9TQ1JJUFRTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCXRlc3QgLXogIiQoYmluZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoYmluZGlyKSIKLQlAbGlzdD0nJChiaW5fU0NSSVBUUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCi0JICBpZiB0ZXN0IC1mICQkZCQkcDsgdGhlbiBcCi0JICAgIGY9YGVjaG8gIiQkcCIgfCBzZWQgJ3N8Xi4qL3x8OyQodHJhbnNmb3JtKSdgOyBcCi0JICAgIGVjaG8gIiAkKGJpblNDUklQVF9JTlNUQUxMKSAnJCRkJCRwJyAnJChERVNURElSKSQoYmluZGlyKS8kJGYnIjsgXAotCSAgICAkKGJpblNDUklQVF9JTlNUQUxMKSAiJCRkJCRwIiAiJChERVNURElSKSQoYmluZGlyKS8kJGYiOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtYmluU0NSSVBUUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKGJpbl9TQ1JJUFRTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgZj1gZWNobyAiJCRwIiB8IHNlZCAnc3xeLiovfHw7JCh0cmFuc2Zvcm0pJ2A7IFwKLQkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQoYmluZGlyKS8kJGYnIjsgXAotCSAgcm0gLWYgIiQoREVTVERJUikkKGJpbmRpcikvJCRmIjsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi4kKE9CSkVYVCkKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZy5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ2Vycm9yLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nMTJfbGEtcG5nZ2V0LlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nMTJfbGEtcG5nbWVtLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nMTJfbGEtcG5ncHJlYWQuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmcxMl9sYS1wbmdyZWFkLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nMTJfbGEtcG5ncmlvLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nMTJfbGEtcG5ncnRyYW4uUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmcxMl9sYS1wbmdydXRpbC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3NldC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3RyYW5zLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nMTJfbGEtcG5nd2lvLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nMTJfbGEtcG5nd3JpdGUuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmcxMl9sYS1wbmd3dHJhbi5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3d1dGlsLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nX2xhLXBuZy5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZ19sYS1wbmdlcnJvci5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZ19sYS1wbmdnZXQuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmdfbGEtcG5nbWVtLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nX2xhLXBuZ3ByZWFkLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nX2xhLXBuZ3JlYWQuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmdfbGEtcG5ncmlvLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nX2xhLXBuZ3J0cmFuLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nX2xhLXBuZ3J1dGlsLlBsb0BhbV9fcXVvdGVACi1AQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGlicG5nX2xhLXBuZ3NldC5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZ19sYS1wbmd0cmFucy5QbG9AYW1fX3F1b3RlQAotQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYnBuZ19sYS1wbmd3aW8uUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmdfbGEtcG5nd3JpdGUuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmdfbGEtcG5nd3RyYW4uUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJwbmdfbGEtcG5nd3V0aWwuUGxvQGFtX19xdW90ZUAKLUBBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wbmd0ZXN0LlBvQGFtX19xdW90ZUAKLQotIyBSdWxlIHRvIG1ha2UgY29tcGlsZWQgcmVzb3VyY2UgKFdpbmRvd3MpCi1SQ1RPT0xfQ09NUElMRSA9IHJjdG9vbAotLnJjLm86Ci0Jd2luZHJlcyAtLWluY2x1ZGUtZGlyICQocmVzZGlyKSAtaSAkPCAtbyAkQAotLnJjLmxvOgotCSQoUkNUT09MX0NPTVBJTEUpICQ8Ci0KLS5jLm86Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8Ci1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKLQotLmMub2JqOgotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAotCi0uYy5sbzoKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAotCi1saWJwbmdfbGEtcG5nLmxvOiBwbmcuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ19sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nX2xhLXBuZy5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nX2xhLXBuZy5UcG8gLWMgLW8gbGlicG5nX2xhLXBuZy5sbyBgdGVzdCAtZiAncG5nLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicG5nX2xhLXBuZy5UcG8gJChERVBESVIpL2xpYnBuZ19sYS1wbmcuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmcuYycgb2JqZWN0PSdsaWJwbmdfbGEtcG5nLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ19sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmdfbGEtcG5nLmxvIGB0ZXN0IC1mICdwbmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nLmMKLQotbGlicG5nX2xhLXBuZ3NldC5sbzogcG5nc2V0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZ19sYS1wbmdzZXQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZ19sYS1wbmdzZXQuVHBvIC1jIC1vIGxpYnBuZ19sYS1wbmdzZXQubG8gYHRlc3QgLWYgJ3BuZ3NldC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdzZXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZ19sYS1wbmdzZXQuVHBvICQoREVQRElSKS9saWJwbmdfbGEtcG5nc2V0LlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5nc2V0LmMnIG9iamVjdD0nbGlicG5nX2xhLXBuZ3NldC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nX2xhLXBuZ3NldC5sbyBgdGVzdCAtZiAncG5nc2V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3NldC5jCi0KLWxpYnBuZ19sYS1wbmdnZXQubG86IHBuZ2dldC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmdfbGEtcG5nZ2V0LmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmdfbGEtcG5nZ2V0LlRwbyAtYyAtbyBsaWJwbmdfbGEtcG5nZ2V0LmxvIGB0ZXN0IC1mICdwbmdnZXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nZ2V0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwbmdfbGEtcG5nZ2V0LlRwbyAkKERFUERJUikvbGlicG5nX2xhLXBuZ2dldC5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ2dldC5jJyBvYmplY3Q9J2xpYnBuZ19sYS1wbmdnZXQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZ19sYS1wbmdnZXQubG8gYHRlc3QgLWYgJ3BuZ2dldC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdnZXQuYwotCi1saWJwbmdfbGEtcG5ncnV0aWwubG86IHBuZ3J1dGlsLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZ19sYS1wbmdydXRpbC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nX2xhLXBuZ3J1dGlsLlRwbyAtYyAtbyBsaWJwbmdfbGEtcG5ncnV0aWwubG8gYHRlc3QgLWYgJ3BuZ3J1dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3J1dGlsLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwbmdfbGEtcG5ncnV0aWwuVHBvICQoREVQRElSKS9saWJwbmdfbGEtcG5ncnV0aWwuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdydXRpbC5jJyBvYmplY3Q9J2xpYnBuZ19sYS1wbmdydXRpbC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nX2xhLXBuZ3J1dGlsLmxvIGB0ZXN0IC1mICdwbmdydXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdydXRpbC5jCi0KLWxpYnBuZ19sYS1wbmd0cmFucy5sbzogcG5ndHJhbnMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ19sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nX2xhLXBuZ3RyYW5zLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmdfbGEtcG5ndHJhbnMuVHBvIC1jIC1vIGxpYnBuZ19sYS1wbmd0cmFucy5sbyBgdGVzdCAtZiAncG5ndHJhbnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ndHJhbnMuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZ19sYS1wbmd0cmFucy5UcG8gJChERVBESVIpL2xpYnBuZ19sYS1wbmd0cmFucy5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ3RyYW5zLmMnIG9iamVjdD0nbGlicG5nX2xhLXBuZ3RyYW5zLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ19sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmdfbGEtcG5ndHJhbnMubG8gYHRlc3QgLWYgJ3BuZ3RyYW5zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3RyYW5zLmMKLQotbGlicG5nX2xhLXBuZ3d1dGlsLmxvOiBwbmd3dXRpbC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmdfbGEtcG5nd3V0aWwubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZ19sYS1wbmd3dXRpbC5UcG8gLWMgLW8gbGlicG5nX2xhLXBuZ3d1dGlsLmxvIGB0ZXN0IC1mICdwbmd3dXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwbmd3dXRpbC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicG5nX2xhLXBuZ3d1dGlsLlRwbyAkKERFUERJUikvbGlicG5nX2xhLXBuZ3d1dGlsLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5nd3V0aWwuYycgb2JqZWN0PSdsaWJwbmdfbGEtcG5nd3V0aWwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZ19sYS1wbmd3dXRpbC5sbyBgdGVzdCAtZiAncG5nd3V0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nd3V0aWwuYwotCi1saWJwbmdfbGEtcG5ncmVhZC5sbzogcG5ncmVhZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmdfbGEtcG5ncmVhZC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nX2xhLXBuZ3JlYWQuVHBvIC1jIC1vIGxpYnBuZ19sYS1wbmdyZWFkLmxvIGB0ZXN0IC1mICdwbmdyZWFkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3JlYWQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZ19sYS1wbmdyZWFkLlRwbyAkKERFUERJUikvbGlicG5nX2xhLXBuZ3JlYWQuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdyZWFkLmMnIG9iamVjdD0nbGlicG5nX2xhLXBuZ3JlYWQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZ19sYS1wbmdyZWFkLmxvIGB0ZXN0IC1mICdwbmdyZWFkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3JlYWQuYwotCi1saWJwbmdfbGEtcG5ncmlvLmxvOiBwbmdyaW8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ19sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nX2xhLXBuZ3Jpby5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nX2xhLXBuZ3Jpby5UcG8gLWMgLW8gbGlicG5nX2xhLXBuZ3Jpby5sbyBgdGVzdCAtZiAncG5ncmlvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3Jpby5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicG5nX2xhLXBuZ3Jpby5UcG8gJChERVBESVIpL2xpYnBuZ19sYS1wbmdyaW8uUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdyaW8uYycgb2JqZWN0PSdsaWJwbmdfbGEtcG5ncmlvLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ19sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmdfbGEtcG5ncmlvLmxvIGB0ZXN0IC1mICdwbmdyaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncmlvLmMKLQotbGlicG5nX2xhLXBuZ3dpby5sbzogcG5nd2lvLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZ19sYS1wbmd3aW8ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZ19sYS1wbmd3aW8uVHBvIC1jIC1vIGxpYnBuZ19sYS1wbmd3aW8ubG8gYHRlc3QgLWYgJ3BuZ3dpby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwbmd3aW8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZ19sYS1wbmd3aW8uVHBvICQoREVQRElSKS9saWJwbmdfbGEtcG5nd2lvLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5nd2lvLmMnIG9iamVjdD0nbGlicG5nX2xhLXBuZ3dpby5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nX2xhLXBuZ3dpby5sbyBgdGVzdCAtZiAncG5nd2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3dpby5jCi0KLWxpYnBuZ19sYS1wbmd3cml0ZS5sbzogcG5nd3JpdGUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ19sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nX2xhLXBuZ3dyaXRlLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmdfbGEtcG5nd3JpdGUuVHBvIC1jIC1vIGxpYnBuZ19sYS1wbmd3cml0ZS5sbyBgdGVzdCAtZiAncG5nd3JpdGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nd3JpdGUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZ19sYS1wbmd3cml0ZS5UcG8gJChERVBESVIpL2xpYnBuZ19sYS1wbmd3cml0ZS5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ3dyaXRlLmMnIG9iamVjdD0nbGlicG5nX2xhLXBuZ3dyaXRlLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ19sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmdfbGEtcG5nd3JpdGUubG8gYHRlc3QgLWYgJ3BuZ3dyaXRlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3dyaXRlLmMKLQotbGlicG5nX2xhLXBuZ3J0cmFuLmxvOiBwbmdydHJhbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmdfbGEtcG5ncnRyYW4ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZ19sYS1wbmdydHJhbi5UcG8gLWMgLW8gbGlicG5nX2xhLXBuZ3J0cmFuLmxvIGB0ZXN0IC1mICdwbmdydHJhbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdydHJhbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicG5nX2xhLXBuZ3J0cmFuLlRwbyAkKERFUERJUikvbGlicG5nX2xhLXBuZ3J0cmFuLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5ncnRyYW4uYycgb2JqZWN0PSdsaWJwbmdfbGEtcG5ncnRyYW4ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZ19sYS1wbmdydHJhbi5sbyBgdGVzdCAtZiAncG5ncnRyYW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncnRyYW4uYwotCi1saWJwbmdfbGEtcG5nd3RyYW4ubG86IHBuZ3d0cmFuLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZ19sYS1wbmd3dHJhbi5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nX2xhLXBuZ3d0cmFuLlRwbyAtYyAtbyBsaWJwbmdfbGEtcG5nd3RyYW4ubG8gYHRlc3QgLWYgJ3BuZ3d0cmFuLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3d0cmFuLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwbmdfbGEtcG5nd3RyYW4uVHBvICQoREVQRElSKS9saWJwbmdfbGEtcG5nd3RyYW4uUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmd3dHJhbi5jJyBvYmplY3Q9J2xpYnBuZ19sYS1wbmd3dHJhbi5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nX2xhLXBuZ3d0cmFuLmxvIGB0ZXN0IC1mICdwbmd3dHJhbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwbmd3dHJhbi5jCi0KLWxpYnBuZ19sYS1wbmdtZW0ubG86IHBuZ21lbS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmdfbGEtcG5nbWVtLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmdfbGEtcG5nbWVtLlRwbyAtYyAtbyBsaWJwbmdfbGEtcG5nbWVtLmxvIGB0ZXN0IC1mICdwbmdtZW0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nbWVtLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwbmdfbGEtcG5nbWVtLlRwbyAkKERFUERJUikvbGlicG5nX2xhLXBuZ21lbS5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ21lbS5jJyBvYmplY3Q9J2xpYnBuZ19sYS1wbmdtZW0ubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZ19sYS1wbmdtZW0ubG8gYHRlc3QgLWYgJ3BuZ21lbS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdtZW0uYwotCi1saWJwbmdfbGEtcG5nZXJyb3IubG86IHBuZ2Vycm9yLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZ19sYS1wbmdlcnJvci5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nX2xhLXBuZ2Vycm9yLlRwbyAtYyAtbyBsaWJwbmdfbGEtcG5nZXJyb3IubG8gYHRlc3QgLWYgJ3BuZ2Vycm9yLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ2Vycm9yLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwbmdfbGEtcG5nZXJyb3IuVHBvICQoREVQRElSKS9saWJwbmdfbGEtcG5nZXJyb3IuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdlcnJvci5jJyBvYmplY3Q9J2xpYnBuZ19sYS1wbmdlcnJvci5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmdfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nX2xhLXBuZ2Vycm9yLmxvIGB0ZXN0IC1mICdwbmdlcnJvci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdlcnJvci5jCi0KLWxpYnBuZ19sYS1wbmdwcmVhZC5sbzogcG5ncHJlYWQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ19sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nX2xhLXBuZ3ByZWFkLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmdfbGEtcG5ncHJlYWQuVHBvIC1jIC1vIGxpYnBuZ19sYS1wbmdwcmVhZC5sbyBgdGVzdCAtZiAncG5ncHJlYWQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncHJlYWQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZ19sYS1wbmdwcmVhZC5UcG8gJChERVBESVIpL2xpYnBuZ19sYS1wbmdwcmVhZC5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ3ByZWFkLmMnIG9iamVjdD0nbGlicG5nX2xhLXBuZ3ByZWFkLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZ19sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmdfbGEtcG5ncHJlYWQubG8gYHRlc3QgLWYgJ3BuZ3ByZWFkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3ByZWFkLmMKLQotbGlicG5nMTJfbGEtcG5nLmxvOiBwbmcuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZzEyX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmcxMl9sYS1wbmcubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZy5UcG8gLWMgLW8gbGlicG5nMTJfbGEtcG5nLmxvIGB0ZXN0IC1mICdwbmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmcuVHBvICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmcuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmcuYycgb2JqZWN0PSdsaWJwbmcxMl9sYS1wbmcubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nMTJfbGEtcG5nLmxvIGB0ZXN0IC1mICdwbmcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nLmMKLQotbGlicG5nMTJfbGEtcG5nc2V0LmxvOiBwbmdzZXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZzEyX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmcxMl9sYS1wbmdzZXQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3NldC5UcG8gLWMgLW8gbGlicG5nMTJfbGEtcG5nc2V0LmxvIGB0ZXN0IC1mICdwbmdzZXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nc2V0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmdzZXQuVHBvICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmdzZXQuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdzZXQuYycgb2JqZWN0PSdsaWJwbmcxMl9sYS1wbmdzZXQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nMTJfbGEtcG5nc2V0LmxvIGB0ZXN0IC1mICdwbmdzZXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nc2V0LmMKLQotbGlicG5nMTJfbGEtcG5nZ2V0LmxvOiBwbmdnZXQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZzEyX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmcxMl9sYS1wbmdnZXQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ2dldC5UcG8gLWMgLW8gbGlicG5nMTJfbGEtcG5nZ2V0LmxvIGB0ZXN0IC1mICdwbmdnZXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nZ2V0LmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmdnZXQuVHBvICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmdnZXQuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdnZXQuYycgb2JqZWN0PSdsaWJwbmcxMl9sYS1wbmdnZXQubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nMTJfbGEtcG5nZ2V0LmxvIGB0ZXN0IC1mICdwbmdnZXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nZ2V0LmMKLQotbGlicG5nMTJfbGEtcG5ncnV0aWwubG86IHBuZ3J1dGlsLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmcxMl9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nMTJfbGEtcG5ncnV0aWwubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3J1dGlsLlRwbyAtYyAtbyBsaWJwbmcxMl9sYS1wbmdydXRpbC5sbyBgdGVzdCAtZiAncG5ncnV0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncnV0aWwuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3J1dGlsLlRwbyAkKERFUERJUikvbGlicG5nMTJfbGEtcG5ncnV0aWwuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdydXRpbC5jJyBvYmplY3Q9J2xpYnBuZzEyX2xhLXBuZ3J1dGlsLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZzEyX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZzEyX2xhLXBuZ3J1dGlsLmxvIGB0ZXN0IC1mICdwbmdydXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdydXRpbC5jCi0KLWxpYnBuZzEyX2xhLXBuZ3RyYW5zLmxvOiBwbmd0cmFucy5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZzEyX2xhLXBuZ3RyYW5zLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmd0cmFucy5UcG8gLWMgLW8gbGlicG5nMTJfbGEtcG5ndHJhbnMubG8gYHRlc3QgLWYgJ3BuZ3RyYW5zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3RyYW5zLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmd0cmFucy5UcG8gJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3RyYW5zLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5ndHJhbnMuYycgb2JqZWN0PSdsaWJwbmcxMl9sYS1wbmd0cmFucy5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmcxMl9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmcxMl9sYS1wbmd0cmFucy5sbyBgdGVzdCAtZiAncG5ndHJhbnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ndHJhbnMuYwotCi1saWJwbmcxMl9sYS1wbmd3dXRpbC5sbzogcG5nd3V0aWwuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZzEyX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmcxMl9sYS1wbmd3dXRpbC5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nMTJfbGEtcG5nd3V0aWwuVHBvIC1jIC1vIGxpYnBuZzEyX2xhLXBuZ3d1dGlsLmxvIGB0ZXN0IC1mICdwbmd3dXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwbmd3dXRpbC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicG5nMTJfbGEtcG5nd3V0aWwuVHBvICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmd3dXRpbC5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ3d1dGlsLmMnIG9iamVjdD0nbGlicG5nMTJfbGEtcG5nd3V0aWwubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nMTJfbGEtcG5nd3V0aWwubG8gYHRlc3QgLWYgJ3BuZ3d1dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3d1dGlsLmMKLQotbGlicG5nMTJfbGEtcG5ncmVhZC5sbzogcG5ncmVhZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZzEyX2xhLXBuZ3JlYWQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3JlYWQuVHBvIC1jIC1vIGxpYnBuZzEyX2xhLXBuZ3JlYWQubG8gYHRlc3QgLWYgJ3BuZ3JlYWQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncmVhZC5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicG5nMTJfbGEtcG5ncmVhZC5UcG8gJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3JlYWQuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdyZWFkLmMnIG9iamVjdD0nbGlicG5nMTJfbGEtcG5ncmVhZC5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmcxMl9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmcxMl9sYS1wbmdyZWFkLmxvIGB0ZXN0IC1mICdwbmdyZWFkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3JlYWQuYwotCi1saWJwbmcxMl9sYS1wbmdyaW8ubG86IHBuZ3Jpby5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZzEyX2xhLXBuZ3Jpby5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nMTJfbGEtcG5ncmlvLlRwbyAtYyAtbyBsaWJwbmcxMl9sYS1wbmdyaW8ubG8gYHRlc3QgLWYgJ3BuZ3Jpby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdyaW8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3Jpby5UcG8gJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3Jpby5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ3Jpby5jJyBvYmplY3Q9J2xpYnBuZzEyX2xhLXBuZ3Jpby5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmcxMl9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmcxMl9sYS1wbmdyaW8ubG8gYHRlc3QgLWYgJ3BuZ3Jpby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdyaW8uYwotCi1saWJwbmcxMl9sYS1wbmd3aW8ubG86IHBuZ3dpby5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZzEyX2xhLXBuZ3dpby5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nMTJfbGEtcG5nd2lvLlRwbyAtYyAtbyBsaWJwbmcxMl9sYS1wbmd3aW8ubG8gYHRlc3QgLWYgJ3BuZ3dpby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwbmd3aW8uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3dpby5UcG8gJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3dpby5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ3dpby5jJyBvYmplY3Q9J2xpYnBuZzEyX2xhLXBuZ3dpby5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmcxMl9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmcxMl9sYS1wbmd3aW8ubG8gYHRlc3QgLWYgJ3BuZ3dpby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwbmd3aW8uYwotCi1saWJwbmcxMl9sYS1wbmd3cml0ZS5sbzogcG5nd3JpdGUuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZzEyX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmcxMl9sYS1wbmd3cml0ZS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nMTJfbGEtcG5nd3JpdGUuVHBvIC1jIC1vIGxpYnBuZzEyX2xhLXBuZ3dyaXRlLmxvIGB0ZXN0IC1mICdwbmd3cml0ZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bwbmd3cml0ZS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicG5nMTJfbGEtcG5nd3JpdGUuVHBvICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmd3cml0ZS5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ3dyaXRlLmMnIG9iamVjdD0nbGlicG5nMTJfbGEtcG5nd3JpdGUubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nMTJfbGEtcG5nd3JpdGUubG8gYHRlc3QgLWYgJ3BuZ3dyaXRlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3dyaXRlLmMKLQotbGlicG5nMTJfbGEtcG5ncnRyYW4ubG86IHBuZ3J0cmFuLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmcxMl9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nMTJfbGEtcG5ncnRyYW4ubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3J0cmFuLlRwbyAtYyAtbyBsaWJwbmcxMl9sYS1wbmdydHJhbi5sbyBgdGVzdCAtZiAncG5ncnRyYW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncnRyYW4uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3J0cmFuLlRwbyAkKERFUERJUikvbGlicG5nMTJfbGEtcG5ncnRyYW4uUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdydHJhbi5jJyBvYmplY3Q9J2xpYnBuZzEyX2xhLXBuZ3J0cmFuLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZzEyX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZzEyX2xhLXBuZ3J0cmFuLmxvIGB0ZXN0IC1mICdwbmdydHJhbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdydHJhbi5jCi0KLWxpYnBuZzEyX2xhLXBuZ3d0cmFuLmxvOiBwbmd3dHJhbi5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZzEyX2xhLXBuZ3d0cmFuLmxvIC1NRCAtTVAgLU1GICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmd3dHJhbi5UcG8gLWMgLW8gbGlicG5nMTJfbGEtcG5nd3RyYW4ubG8gYHRlc3QgLWYgJ3BuZ3d0cmFuLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ3d0cmFuLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACW12IC1mICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmd3dHJhbi5UcG8gJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3d0cmFuLlBsbwotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncG5nd3RyYW4uYycgb2JqZWN0PSdsaWJwbmcxMl9sYS1wbmd3dHJhbi5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmcxMl9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmcxMl9sYS1wbmd3dHJhbi5sbyBgdGVzdCAtZiAncG5nd3RyYW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5nd3RyYW4uYwotCi1saWJwbmcxMl9sYS1wbmdtZW0ubG86IHBuZ21lbS5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYnBuZzEyX2xhLXBuZ21lbS5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nMTJfbGEtcG5nbWVtLlRwbyAtYyAtbyBsaWJwbmcxMl9sYS1wbmdtZW0ubG8gYHRlc3QgLWYgJ3BuZ21lbS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdtZW0uYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ21lbS5UcG8gJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ21lbS5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ21lbS5jJyBvYmplY3Q9J2xpYnBuZzEyX2xhLXBuZ21lbS5sbycgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAotQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAotQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmcxMl9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJwbmcxMl9sYS1wbmdtZW0ubG8gYHRlc3QgLWYgJ3BuZ21lbS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdtZW0uYwotCi1saWJwbmcxMl9sYS1wbmdlcnJvci5sbzogcG5nZXJyb3IuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZzEyX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJwbmcxMl9sYS1wbmdlcnJvci5sbyAtTUQgLU1QIC1NRiAkKERFUERJUikvbGlicG5nMTJfbGEtcG5nZXJyb3IuVHBvIC1jIC1vIGxpYnBuZzEyX2xhLXBuZ2Vycm9yLmxvIGB0ZXN0IC1mICdwbmdlcnJvci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdlcnJvci5jCi1AYW1fX2Zhc3RkZXBDQ19UUlVFQAltdiAtZiAkKERFUERJUikvbGlicG5nMTJfbGEtcG5nZXJyb3IuVHBvICQoREVQRElSKS9saWJwbmcxMl9sYS1wbmdlcnJvci5QbG8KLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3BuZ2Vycm9yLmMnIG9iamVjdD0nbGlicG5nMTJfbGEtcG5nZXJyb3IubG8nIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKLUBBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKLUBhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobGlicG5nMTJfbGFfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGlicG5nMTJfbGEtcG5nZXJyb3IubG8gYHRlc3QgLWYgJ3BuZ2Vycm9yLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHBuZ2Vycm9yLmMKLQotbGlicG5nMTJfbGEtcG5ncHJlYWQubG86IHBuZ3ByZWFkLmMKLUBhbV9fZmFzdGRlcENDX1RSVUVACSQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChsaWJwbmcxMl9sYV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGlicG5nMTJfbGEtcG5ncHJlYWQubG8gLU1EIC1NUCAtTUYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3ByZWFkLlRwbyAtYyAtbyBsaWJwbmcxMl9sYS1wbmdwcmVhZC5sbyBgdGVzdCAtZiAncG5ncHJlYWQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcG5ncHJlYWQuYwotQGFtX19mYXN0ZGVwQ0NfVFJVRUAJbXYgLWYgJChERVBESVIpL2xpYnBuZzEyX2xhLXBuZ3ByZWFkLlRwbyAkKERFUERJUikvbGlicG5nMTJfbGEtcG5ncHJlYWQuUGxvCi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwbmdwcmVhZC5jJyBvYmplY3Q9J2xpYnBuZzEyX2xhLXBuZ3ByZWFkLmxvJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACi1AQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACi1AYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKGxpYnBuZzEyX2xhX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYnBuZzEyX2xhLXBuZ3ByZWFkLmxvIGB0ZXN0IC1mICdwbmdwcmVhZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwbmdwcmVhZC5jCi0KLWxpYnBuZy1kbGwtcmVzLmxvOiAkKHJlc2RpcikvbGlicG5nLWRsbC1yZXMucmMKLQkkKFJDVE9PTF9DT01QSUxFKSAkPAotCQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mIGxpYnRvb2wgY29uZmlnLmx0Ci1pbnN0YWxsLW1hbjM6ICQobWFuM19NQU5TKSAkKG1hbl9NQU5TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCXRlc3QgLXogIiQobWFuM2RpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKG1hbjNkaXIpIgotCUBsaXN0PSckKG1hbjNfTUFOUykgJChkaXN0X21hbjNfTUFOUykgJChub2Rpc3RfbWFuM19NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUykgJChkaXN0X21hbl9NQU5TKSAkKG5vZGlzdF9tYW5fTUFOUyknOyBcCi0JZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMyopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkaTsgdGhlbiBmaWxlPSQkaTsgXAotCSAgZWxzZSBmaWxlPSQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGNhc2UgIiQkZXh0IiBpbiBcCi0JICAgIDMqKSA7OyBcCi0JICAgICopIGV4dD0nMycgOzsgXAotCSAgZXNhYzsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAtZSAncy9eLipcLy8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRmaWxlJyAnJChERVNURElSKSQobWFuM2RpcikvJCRpbnN0JyI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAiJCRmaWxlIiAiJChERVNURElSKSQobWFuM2RpcikvJCRpbnN0IjsgXAotCWRvbmUKLXVuaW5zdGFsbC1tYW4zOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQobWFuM19NQU5TKSAkKGRpc3RfbWFuM19NQU5TKSAkKG5vZGlzdF9tYW4zX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSAkKGRpc3RfbWFuX01BTlMpICQobm9kaXN0X21hbl9NQU5TKSc7IFwKLQlmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4zKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgY2FzZSAiJCRleHQiIGluIFwKLQkgICAgMyopIDs7IFwKLQkgICAgKikgZXh0PSczJyA7OyBcCi0JICBlc2FjOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkIC1lICdzL14uKlwvLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgcm0gLWYgJyQoREVTVERJUikkKG1hbjNkaXIpLyQkaW5zdCciOyBcCi0JICBybSAtZiAiJChERVNURElSKSQobWFuM2RpcikvJCRpbnN0IjsgXAotCWRvbmUKLWluc3RhbGwtbWFuNTogJChtYW41X01BTlMpICQobWFuX01BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JdGVzdCAteiAiJChtYW41ZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobWFuNWRpcikiCi0JQGxpc3Q9JyQobWFuNV9NQU5TKSAkKGRpc3RfbWFuNV9NQU5TKSAkKG5vZGlzdF9tYW41X01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSAkKGRpc3RfbWFuX01BTlMpICQobm9kaXN0X21hbl9NQU5TKSc7IFwKLQlmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi41KikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRpOyB0aGVuIGZpbGU9JCRpOyBcCi0JICBlbHNlIGZpbGU9JChzcmNkaXIpLyQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgY2FzZSAiJCRleHQiIGluIFwKLQkgICAgNSopIDs7IFwKLQkgICAgKikgZXh0PSc1JyA7OyBcCi0JICBlc2FjOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkIC1lICdzL14uKlwvLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGZpbGUnICckKERFU1RESVIpJChtYW41ZGlyKS8kJGluc3QnIjsgXAotCSAgJChJTlNUQUxMX0RBVEEpICIkJGZpbGUiICIkKERFU1RESVIpJChtYW41ZGlyKS8kJGluc3QiOyBcCi0JZG9uZQotdW5pbnN0YWxsLW1hbjU6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlAbGlzdD0nJChtYW41X01BTlMpICQoZGlzdF9tYW41X01BTlMpICQobm9kaXN0X21hbjVfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpICQoZGlzdF9tYW5fTUFOUykgJChub2Rpc3RfbWFuX01BTlMpJzsgXAotCWZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjUqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBjYXNlICIkJGV4dCIgaW4gXAotCSAgICA1KikgOzsgXAotCSAgICAqKSBleHQ9JzUnIDs7IFwKLQkgIGVzYWM7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgLWUgJ3MvXi4qXC8vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQobWFuNWRpcikvJCRpbnN0JyI7IFwKLQkgIHJtIC1mICIkKERFU1RESVIpJChtYW41ZGlyKS8kJGluc3QiOyBcCi0JZG9uZQotaW5zdGFsbC1wa2djb25maWdEQVRBOiAkKHBrZ2NvbmZpZ19EQVRBKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCXRlc3QgLXogIiQocGtnY29uZmlnZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQocGtnY29uZmlnZGlyKSIKLQlAbGlzdD0nJChwa2djb25maWdfREFUQSknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCi0JICBmPSQoYW1fX3N0cmlwX2RpcikgXAotCSAgZWNobyAiICQocGtnY29uZmlnREFUQV9JTlNUQUxMKSAnJCRkJCRwJyAnJChERVNURElSKSQocGtnY29uZmlnZGlyKS8kJGYnIjsgXAotCSAgJChwa2djb25maWdEQVRBX0lOU1RBTEwpICIkJGQkJHAiICIkKERFU1RESVIpJChwa2djb25maWdkaXIpLyQkZiI7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1wa2djb25maWdEQVRBOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQocGtnY29uZmlnX0RBVEEpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBmPSQoYW1fX3N0cmlwX2RpcikgXAotCSAgZWNobyAiIHJtIC1mICckKERFU1RESVIpJChwa2djb25maWdkaXIpLyQkZiciOyBcCi0JICBybSAtZiAiJChERVNURElSKSQocGtnY29uZmlnZGlyKS8kJGYiOyBcCi0JZG9uZQotaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUzogJChwa2dpbmNsdWRlX0hFQURFUlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JdGVzdCAteiAiJChwa2dpbmNsdWRlZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQocGtnaW5jbHVkZWRpcikiCi0JQGxpc3Q9JyQocGtnaW5jbHVkZV9IRUFERVJTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAiJCRwIjsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKLQkgIGY9JChhbV9fc3RyaXBfZGlyKSBcCi0JICBlY2hvICIgJChwa2dpbmNsdWRlSEVBREVSU19JTlNUQUxMKSAnJCRkJCRwJyAnJChERVNURElSKSQocGtnaW5jbHVkZWRpcikvJCRmJyI7IFwKLQkgICQocGtnaW5jbHVkZUhFQURFUlNfSU5TVEFMTCkgIiQkZCQkcCIgIiQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpLyQkZiI7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCUBsaXN0PSckKHBrZ2luY2x1ZGVfSEVBREVSUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGY9JChhbV9fc3RyaXBfZGlyKSBcCi0JICBlY2hvICIgcm0gLWYgJyQoREVTVERJUikkKHBrZ2luY2x1ZGVkaXIpLyQkZiciOyBcCi0JICBybSAtZiAiJChERVNURElSKSQocGtnaW5jbHVkZWRpcikvJCRmIjsgXAotCWRvbmUKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQlta2lkIC1mSUQgJCR1bmlxdWUKLXRhZ3M6IFRBR1MKLQotVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCi0JCSQoVEFHU19GSUxFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCi0JICBkb25lIHwgXAotCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAotCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAotCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCi0JICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCi0JICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICQkdGFncyAkJHVuaXF1ZTsgXAotCWZpCi1jdGFnczogQ1RBR1MKLUNUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKLQkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0JdGFncz07IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotCSAgZG9uZSB8IFwKLQkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLQkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKLQl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKLQkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKLQkgICAgICQkdGFncyAkJHVuaXF1ZQotCi1HVEFHUzoKLQloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAotCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCi0JICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1jaGVjay1URVNUUzogJChURVNUUykKLQlAZmFpbGVkPTA7IGFsbD0wOyB4ZmFpbD0wOyB4cGFzcz0wOyBza2lwPTA7IFwKLQlzcmNkaXI9JChzcmNkaXIpOyBleHBvcnQgc3JjZGlyOyBcCi0JbGlzdD0nICQoVEVTVFMpICc7IFwKLQlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKLQkgIGZvciB0c3QgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgLi8kJHRzdDsgdGhlbiBkaXI9Li87IFwKLQkgICAgZWxpZiB0ZXN0IC1mICQkdHN0OyB0aGVuIGRpcj07IFwKLQkgICAgZWxzZSBkaXI9IiQoc3JjZGlyKS8iOyBmaTsgXAotCSAgICBpZiAkKFRFU1RTX0VOVklST05NRU5UKSAkJHtkaXJ9JCR0c3Q7IHRoZW4gXAotCSAgICAgIGFsbD1gZXhwciAkJGFsbCArIDFgOyBcCi0JICAgICAgY2FzZSAiICQoWEZBSUxfVEVTVFMpICIgaW4gXAotCSAgICAgICpbXCBcCV0kJHRzdFtcIFwJXSopIFwKLQkJeHBhc3M9YGV4cHIgJCR4cGFzcyArIDFgOyBcCi0JCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCi0JCWVjaG8gIlhQQVNTOiAkJHRzdCI7IFwKLQkgICAgICA7OyBcCi0JICAgICAgKikgXAotCQllY2hvICJQQVNTOiAkJHRzdCI7IFwKLQkgICAgICA7OyBcCi0JICAgICAgZXNhYzsgXAotCSAgICBlbGlmIHRlc3QgJCQ/IC1uZSA3NzsgdGhlbiBcCi0JICAgICAgYWxsPWBleHByICQkYWxsICsgMWA7IFwKLQkgICAgICBjYXNlICIgJChYRkFJTF9URVNUUykgIiBpbiBcCi0JICAgICAgKltcIFwJXSQkdHN0W1wgXAldKikgXAotCQl4ZmFpbD1gZXhwciAkJHhmYWlsICsgMWA7IFwKLQkJZWNobyAiWEZBSUw6ICQkdHN0IjsgXAotCSAgICAgIDs7IFwKLQkgICAgICAqKSBcCi0JCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCi0JCWVjaG8gIkZBSUw6ICQkdHN0IjsgXAotCSAgICAgIDs7IFwKLQkgICAgICBlc2FjOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHNraXA9YGV4cHIgJCRza2lwICsgMWA7IFwKLQkgICAgICBlY2hvICJTS0lQOiAkJHRzdCI7IFwKLQkgICAgZmk7IFwKLQkgIGRvbmU7IFwKLQkgIGlmIHRlc3QgIiQkYWxsIiAtZXEgMTsgdGhlbiBcCi0JICAgIHRlc3RzPSJ0ZXN0IjsgXAotCSAgICBBbGw9IiI7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0cz0idGVzdHMiOyBcCi0JICAgIEFsbD0iQWxsICI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0ICIkJGZhaWxlZCIgLWVxIDA7IHRoZW4gXAotCSAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMDsgdGhlbiBcCi0JICAgICAgYmFubmVyPSIkJEFsbCQkYWxsICQkdGVzdHMgcGFzc2VkIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMTsgdGhlbiBmYWlsdXJlcz1mYWlsdXJlOyBlbHNlIGZhaWx1cmVzPWZhaWx1cmVzOyBmaTsgXAotCSAgICAgIGJhbm5lcj0iJCRBbGwkJGFsbCAkJHRlc3RzIGJlaGF2ZWQgYXMgZXhwZWN0ZWQgKCQkeGZhaWwgZXhwZWN0ZWQgJCRmYWlsdXJlcykiOyBcCi0JICAgIGZpOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAiJCR4cGFzcyIgLWVxIDA7IHRoZW4gXAotCSAgICAgIGJhbm5lcj0iJCRmYWlsZWQgb2YgJCRhbGwgJCR0ZXN0cyBmYWlsZWQiOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGlmIHRlc3QgIiQkeHBhc3MiIC1lcSAxOyB0aGVuIHBhc3Nlcz1wYXNzOyBlbHNlIHBhc3Nlcz1wYXNzZXM7IGZpOyBcCi0JICAgICAgYmFubmVyPSIkJGZhaWxlZCBvZiAkJGFsbCAkJHRlc3RzIGRpZCBub3QgYmVoYXZlIGFzIGV4cGVjdGVkICgkJHhwYXNzIHVuZXhwZWN0ZWQgJCRwYXNzZXMpIjsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQkgIGRhc2hlcz0iJCRiYW5uZXIiOyBcCi0JICBza2lwcGVkPSIiOyBcCi0JICBpZiB0ZXN0ICIkJHNraXAiIC1uZSAwOyB0aGVuIFwKLQkgICAgaWYgdGVzdCAiJCRza2lwIiAtZXEgMTsgdGhlbiBcCi0JICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0IHdhcyBub3QgcnVuKSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0cyB3ZXJlIG5vdCBydW4pIjsgXAotCSAgICBmaTsgXAotCSAgICB0ZXN0IGBlY2hvICIkJHNraXBwZWQiIHwgd2MgLWNgIC1sZSBgZWNobyAiJCRiYW5uZXIiIHwgd2MgLWNgIHx8IFwKLQkgICAgICBkYXNoZXM9IiQkc2tpcHBlZCI7IFwKLQkgIGZpOyBcCi0JICByZXBvcnQ9IiI7IFwKLQkgIGlmIHRlc3QgIiQkZmFpbGVkIiAtbmUgMCAmJiB0ZXN0IC1uICIkKFBBQ0tBR0VfQlVHUkVQT1JUKSI7IHRoZW4gXAotCSAgICByZXBvcnQ9IlBsZWFzZSByZXBvcnQgdG8gJChQQUNLQUdFX0JVR1JFUE9SVCkiOyBcCi0JICAgIHRlc3QgYGVjaG8gIiQkcmVwb3J0IiB8IHdjIC1jYCAtbGUgYGVjaG8gIiQkYmFubmVyIiB8IHdjIC1jYCB8fCBcCi0JICAgICAgZGFzaGVzPSIkJHJlcG9ydCI7IFwKLQkgIGZpOyBcCi0JICBkYXNoZXM9YGVjaG8gIiQkZGFzaGVzIiB8IHNlZCBzLy4vPS9nYDsgXAotCSAgZWNobyAiJCRkYXNoZXMiOyBcCi0JICBlY2hvICIkJGJhbm5lciI7IFwKLQkgIHRlc3QgLXogIiQkc2tpcHBlZCIgfHwgZWNobyAiJCRza2lwcGVkIjsgXAotCSAgdGVzdCAteiAiJCRyZXBvcnQiIHx8IGVjaG8gIiQkcmVwb3J0IjsgXAotCSAgZWNobyAiJCRkYXNoZXMiOyBcCi0JICB0ZXN0ICIkJGZhaWxlZCIgLWVxIDA7IFwKLQllbHNlIDo7IGZpCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCXRlc3QgLWQgJChkaXN0ZGlyKSB8fCBta2RpciAkKGRpc3RkaXIpCi0JQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKLQlsaXN0PSckKERJU1RGSUxFUyknOyBcCi0JICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAotCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKLQkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCi0JY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAotCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAotCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAotCQkJICAgc29ydCAtdWAgOzsgXAotCWVzYWM7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCi0JICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAotCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKLQkgICAgZmk7IFwKLQkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLQktZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgISAtcGVybSAtNzc3IC1leGVjIGNobW9kIGErcnd4IHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWxpbmtzIDEgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00MDAgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKLQkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWV4ZWMgJChpbnN0YWxsX3NoKSAtYyAtbSBhK3Ige30ge30gXDsgXAotCXx8IGNobW9kIC1SIGErciAkKGRpc3RkaXIpCi1kaXN0LWd6aXA6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi1kaXN0LWJ6aXAyOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGJ6aXAyIC05IC1jID4kKGRpc3RkaXIpLnRhci5iejIKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC1sem1hOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGx6bWEgLTkgLWMgPiQoZGlzdGRpcikudGFyLmx6bWEKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQotZGlzdC10YXJaOiBkaXN0ZGlyCi0JdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGNvbXByZXNzIC1jID4kKGRpc3RkaXIpLnRhci5aCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3Qtc2hhcjogZGlzdGRpcgotCXNoYXIgJChkaXN0ZGlyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS5zaGFyLmd6Ci0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QtemlwOiBkaXN0ZGlyCi0JLXJtIC1mICQoZGlzdGRpcikuemlwCi0JemlwIC1ycSAkKGRpc3RkaXIpLnppcCAkKGRpc3RkaXIpCi0JJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCi0KLWRpc3QgZGlzdC1hbGw6IGRpc3RkaXIKLQl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negotCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQljYXNlICckKERJU1RfQVJDSElWRVMpJyBpbiBcCi0JKi50YXIuZ3oqKSBcCi0JICBHWklQPSQoR1pJUF9FTlYpIGd1bnppcCAtYyAkKGRpc3RkaXIpLnRhci5neiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnRhci5iejIqKSBcCi0JICBidW56aXAyIC1jICQoZGlzdGRpcikudGFyLmJ6MiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnRhci5sem1hKikgXAotCSAgdW5sem1hIC1jICQoZGlzdGRpcikudGFyLmx6bWEgfCAkKGFtX191bnRhcikgOztcCi0JKi50YXIuWiopIFwKLQkgIHVuY29tcHJlc3MgLWMgJChkaXN0ZGlyKS50YXIuWiB8ICQoYW1fX3VudGFyKSA7O1wKLQkqLnNoYXIuZ3oqKSBcCi0JICBHWklQPSQoR1pJUF9FTlYpIGd1bnppcCAtYyAkKGRpc3RkaXIpLnNoYXIuZ3ogfCB1bnNoYXIgOztcCi0JKi56aXAqKSBcCi0JICB1bnppcCAkKGRpc3RkaXIpLnppcCA7O1wKLQllc2FjCi0JY2htb2QgLVIgYS13ICQoZGlzdGRpcik7IGNobW9kIGErdyAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKS9fYnVpbGQKLQlta2RpciAkKGRpc3RkaXIpL19pbnN0Ci0JY2htb2QgYS13ICQoZGlzdGRpcikKLQlkY19pbnN0YWxsX2Jhc2U9YCQoYW1fX2NkKSAkKGRpc3RkaXIpL19pbnN0ICYmIHB3ZCB8IHNlZCAtZSAncyxeW146XFwvXTpbXFwvXSwvLCdgIFwKLQkgICYmIGRjX2Rlc3RkaXI9IiQke1RNUERJUi0vdG1wfS9hbS1kYy0kJCQkLyIgXAotCSAgJiYgY2QgJChkaXN0ZGlyKS9fYnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSIkJGRjX2luc3RhbGxfYmFzZSIgXAotCSAgICAkKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKLQkgICAgICAgIGRpc3R1bmluc3RhbGxjaGVjayBcCi0JICAmJiBjaG1vZCAtUiBhLXcgIiQkZGNfaW5zdGFsbF9iYXNlIiBcCi0JICAmJiAoeyBcCi0JICAgICAgIChjZCAuLi8uLiAmJiB1bWFzayAwNzcgJiYgbWtkaXIgIiQkZGNfZGVzdGRpciIpIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBpbnN0YWxsIFwKLQkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiB1bmluc3RhbGwgXAotCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIFwKLQkgICAgICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2Rlc3RkaXIiIGRpc3R1bmluc3RhbGxjaGVjazsgXAotCSAgICAgIH0gfHwgeyBybSAtcmYgIiQkZGNfZGVzdGRpciI7IGV4aXQgMTsgfSkgXAotCSAgJiYgcm0gLXJmICIkJGRjX2Rlc3RkaXIiIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QgXAotCSAgJiYgcm0gLXJmICQoRElTVF9BUkNISVZFUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdGNsZWFuY2hlY2sKLQkkKGFtX19yZW1vdmVfZGlzdGRpcikKLQlAKGVjaG8gIiQoZGlzdGRpcikgYXJjaGl2ZXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbjogIjsgXAotCSAgbGlzdD0nJChESVNUX0FSQ0hJVkVTKSc7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUpIHwgXAotCSAgc2VkIC1lIDFoIC1lIDFzLy4vPS9nIC1lIDFwIC1lIDF4IC1lICckJHAnIC1lICckJHgnCi1kaXN0dW5pbnN0YWxsY2hlY2s6Ci0JQGNkICQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpcikgXAotCSYmIHRlc3QgYCQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWxlIDEgXAotCSAgIHx8IHsgZWNobyAiRVJST1I6IGZpbGVzIGxlZnQgYWZ0ZXIgdW5pbnN0YWxsOiIgOyBcCi0JICAgICAgICBpZiB0ZXN0IC1uICIkKERFU1RESVIpIjsgdGhlbiBcCi0JICAgICAgICAgIGVjaG8gIiAgKGNoZWNrIERFU1RESVIgc3VwcG9ydCkiOyBcCi0JICAgICAgICBmaSA7IFwKLQkgICAgICAgICQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgOyBcCi0JICAgICAgICBleGl0IDE7IH0gPiYyCi1kaXN0Y2xlYW5jaGVjazogZGlzdGNsZWFuCi0JQGlmIHRlc3QgJyQoc3JjZGlyKScgPSAuIDsgdGhlbiBcCi0JICBlY2hvICJFUlJPUjogZGlzdGNsZWFuY2hlY2sgY2FuIG9ubHkgcnVuIGZyb20gYSBWUEFUSCBidWlsZCIgOyBcCi0JICBleGl0IDEgOyBcCi0JZmkKLQlAdGVzdCBgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1lcSAwIFwKLQkgIHx8IHsgZWNobyAiRVJST1I6IGZpbGVzIGxlZnQgaW4gYnVpbGQgZGlyZWN0b3J5IGFmdGVyIGRpc3RjbGVhbjoiIDsgXAotCSAgICAgICAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgOyBcCi0JICAgICAgIGV4aXQgMTsgfSA+JjIKLWNoZWNrLWFtOiBhbGwtYW0KLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkKGNoZWNrX1BST0dSQU1TKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLVRFU1RTCi1jaGVjazogY2hlY2stYW0KLWFsbC1hbTogTWFrZWZpbGUgJChMVExJQlJBUklFUykgJChTQ1JJUFRTKSAkKE1BTlMpICQoREFUQSkgJChIRUFERVJTKSBcCi0JCWNvbmZpZy5oCi1pbnN0YWxsZGlyczoKLQlmb3IgZGlyIGluICIkKERFU1RESVIpJChsaWJkaXIpIiAiJChERVNURElSKSQoYmluZGlyKSIgIiQoREVTVERJUikkKG1hbjNkaXIpIiAiJChERVNURElSKSQobWFuNWRpcikiICIkKERFU1RESVIpJChwa2djb25maWdkaXIpIiAiJChERVNURElSKSQocGtnaW5jbHVkZWRpcikiOyBkbyBcCi0JICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCi0JZG9uZQotaW5zdGFsbDogaW5zdGFsbC1hbQotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCi0JICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKLQkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKLWNsZWFuOiBjbGVhbi1hbQotCi1jbGVhbi1hbTogY2xlYW4tY2hlY2tQUk9HUkFNUyBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLQljbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLWFtCi0JLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCi0JZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1hbQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtYW0KLQotaW5mbzogaW5mby1hbQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuIGluc3RhbGwtcGtnY29uZmlnREFUQSBcCi0JaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUwotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZGF0YS1ob29rCi0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluU0NSSVBUUyBpbnN0YWxsLWxpYkxUTElCUkFSSUVTCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWhvb2sKLQotaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KLQotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLQotaW5zdGFsbC1tYW46IGluc3RhbGwtbWFuMyBpbnN0YWxsLW1hbjUKLQotaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCi0KLWluc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KLQotaW5zdGFsbGNoZWNrLWFtOgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0JLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCi0JLXJtIC1yZiAkKHRvcF9zcmNkaXIpL2F1dG9tNHRlLmNhY2hlCi0JLXJtIC1yZiAuLyQoREVQRElSKQotCS1ybSAtZiBNYWtlZmlsZQotbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KLQotbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi0JbW9zdGx5Y2xlYW4tbGlidG9vbAotCi1wZGY6IHBkZi1hbQotCi1wZGYtYW06Ci0KLXBzOiBwcy1hbQotCi1wcy1hbToKLQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluU0NSSVBUUyB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgXAotCXVuaW5zdGFsbC1tYW4gdW5pbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgXAotCXVuaW5zdGFsbC1wa2dpbmNsdWRlSEVBREVSUwotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbC1ob29rCi0KLXVuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW4zIHVuaW5zdGFsbC1tYW41Ci0KLS5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1zdHJpcCBcCi0JdW5pbnN0YWxsLWFtCi0KLS5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBhbS0tcmVmcmVzaCBjaGVjayBjaGVjay1URVNUUyBjaGVjay1hbSBcCi0JY2xlYW4gY2xlYW4tY2hlY2tQUk9HUkFNUyBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLQljbGVhbi1saWJ0b29sIGN0YWdzIGRpc3QgZGlzdC1hbGwgZGlzdC1iemlwMiBkaXN0LWd6aXAgXAotCWRpc3QtbHptYSBkaXN0LXNoYXIgZGlzdC10YXJaIGRpc3QtemlwIGRpc3RjaGVjayBkaXN0Y2xlYW4gXAotCWRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1oZHIgXAotCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbmNoZWNrIGRpc3RkaXIgXAotCWRpc3R1bmluc3RhbGxjaGVjayBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAotCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWJpblNDUklQVFMgaW5zdGFsbC1kYXRhIFwKLQlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhLWhvb2sgaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAotCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjLWhvb2sgaW5zdGFsbC1odG1sIFwKLQlpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBcCi0JaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLW1hbiBpbnN0YWxsLW1hbjMgaW5zdGFsbC1tYW41IFwKLQlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgXAotCWluc3RhbGwtcGtnaW5jbHVkZUhFQURFUlMgaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIFwKLQlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAotCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIFwKLQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gXAotCXVuaW5zdGFsbC1iaW5TQ1JJUFRTIHVuaW5zdGFsbC1ob29rIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCi0JdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtbWFuMyB1bmluc3RhbGwtbWFuNSBcCi0JdW5pbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgdW5pbnN0YWxsLXBrZ2luY2x1ZGVIRUFERVJTCi0KLQotQEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfVFJVRUAgICMgVmVyc2lvbmVkIHN5bWJvbHMgYW5kIHJlc3RyaWN0ZWQgZXhwb3J0cwotQEhBVkVfTERfVkVSU0lPTl9TQ1JJUFRfRkFMU0VAICAjIE9ubHkgcmVzdHJpY3RlZCBleHBvcnRzIHdoZW4gcG9zc2libGUKLQotJChQTkdMSUJfQkFTRU5BTUUpLnBjOiBsaWJwbmcucGMKLQljcCAtZnAgbGlicG5nLnBjICRACi0KLSQoUE5HTElCX0JBU0VOQU1FKS1jb25maWc6IGxpYnBuZy1jb25maWcKLQljcCAtZnAgbGlicG5nLWNvbmZpZyAkQAotCi1saWJwbmcuc3ltOiBwbmcuaCBwbmdjb25mLmgKLQlybSAtZiAkQCAkQC5uZXcKLQkkKENQUCkgQExJQlBOR19ERUZJTkVTQCAkKENQUEZMQUdTKSAtRFBOR19CVUlMRFNZTVMgJChzcmNkaXIpL3BuZy5oIHwgXAotCQkkKFNFRCkgLW4gLWUgXAotCQknc3xeLipQTkdfRlVOQ1RJT05fRVhQT1JUWyAJXSpcKFskKEFOKV0qXCkuKiQkfCQoU1lNQk9MX1BSRUZJWClcMXxwJyBcCi0JCS1lICdzfF4uKlBOR19EQVRBX0VYUE9SVFsgCV0qXChbJChBTildKlwpLiokJHwkKFNZTUJPTF9QUkVGSVgpXDF8cCcgXAotCQkJPiRALm5ldwotCW12ICRALm5ldyAkQAotCi1saWJwbmcudmVyczogbGlicG5nLnN5bQotCXJtIC1mICRAICRALm5ldwotCWVjaG8gUE5HQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF8wICd7Z2xvYmFsOicgPiAkQC5uZXcKLQkkKFNFRCkgcy8kJC9cOy8gbGlicG5nLnN5bSA+PiAkQC5uZXcKLQllY2hvICdsb2NhbDogKjsgfTsnID4+ICRALm5ldwotCW12ICRALm5ldyAkQAotCi10ZXN0OiBjaGVjawotCi0jIGluc3RhbGwgdGhlIC4uLi9pbmNsdWRlIGhlYWRlcnMgYXMgbGlua3MgdG8gdGhlIG5ldyBvbmVzCi1pbnN0YWxsLWRhdGEtaG9vazoKLQljZCAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgcm0gLWYgcG5nLmggcG5nY29uZi5oCi0JY2QgJChERVNURElSKSQoaW5jbHVkZWRpcik7ICQoTE5fUykgJChQTkdMSUJfQkFTRU5BTUUpL3BuZy5oIHBuZy5oCi0JY2QgJChERVNURElSKSQoaW5jbHVkZWRpcik7ICQoTE5fUykgJChQTkdMSUJfQkFTRU5BTUUpL3BuZ2NvbmYuaCBcCi0JCXBuZ2NvbmYuaAotCWNkICQoREVTVERJUikkKHBrZ2NvbmZpZ2Rpcik7IHJtIC1mIGxpYnBuZy5wYwotCWNkICQoREVTVERJUikkKHBrZ2NvbmZpZ2Rpcik7ICQoTE5fUykgJChQTkdMSUJfQkFTRU5BTUUpLnBjIGxpYnBuZy5wYwotCi0jIGRvIGV2aWwgdGhpbmdzIHRvIGxpYnBuZyB0byBjYXVzZSBsaWJwbmcxMiB0byBiZSB1c2VkCi1pbnN0YWxsLWV4ZWMtaG9vazoKLQljZCAkKERFU1RESVIpJChiaW5kaXIpOyBybSAtZiBsaWJwbmctY29uZmlnCi0JY2QgJChERVNURElSKSQoYmluZGlyKTsgJChMTl9TKSAkKFBOR0xJQl9CQVNFTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcKLQlAc2V0IC14O1wKLQljZCAkKERFU1RESVIpJChsaWJkaXIpO1wKLQlmb3IgZXh0IGluIGEgbGEgc28gc2wgZHlsaWI7IGRvXAotCQlybSAtZiBsaWJwbmcuJCRleHQ7XAotICAgICAgICAgICAgICAgIGlmIHRlc3QgLWYgJChQTkdMSUJfQkFTRU5BTUUpLiQkZXh0OyB0aGVuXAotICAgICAgICAgICAgICAgICAgICAgICAkKExOX1MpICQoUE5HTElCX0JBU0VOQU1FKS4kJGV4dCBsaWJwbmcuJCRleHQ7XAotICAgICAgICAgICAgICAgIGZpO1wKLQlkb25lCi0KLXVuaW5zdGFsbC1ob29rOgotCWNkICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBybSAtZiBwbmcuaCBwbmdjb25mLmgKLQlybSAtZiAkKERFU1RESVIpJChwa2djb25maWdkaXIpL2xpYnBuZy5wYwotCXJtIC1mICQoREVTVERJUikkKGJpbmRpcikvbGlicG5nLWNvbmZpZwotCUBpZiB0ZXN0IC1uICJAY29tcGF0bGliQCI7IHRoZW5cCi0JCXNldCAteDtcCi0JCWNkICQoREVTVERJUikkKGxpYmRpcik7XAotCQlmb3IgZXh0IGluIGEgbGEgc28gc2wgZHlsaWI7IGRvXAotCQkJcm0gLWYgbGlicG5nLiQkZXh0O1wKLQkJZG9uZTtcCi0JZmkKLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL1JFQURNRSBiL2xpYnMvbGlicG5nL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkYzM0Mi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotUkVBRE1FIGZvciBsaWJwbmcgdmVyc2lvbiAxLjIuMzcgLSBKdW5lIDQsIDIwMDkgKHNoYXJlZCBsaWJyYXJ5IDEyLjApCi1TZWUgdGhlIG5vdGUgYWJvdXQgdmVyc2lvbiBudW1iZXJzIG5lYXIgdGhlIHRvcCBvZiBwbmcuaAotCi1TZWUgSU5TVEFMTCBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBpbnN0YWxsIGxpYnBuZy4KLQotTGlicG5nIGNvbWVzIGluIHNldmVyYWwgZGlzdHJpYnV0aW9uIGZvcm1hdHMuICBHZXQgbGlicG5nLSoudGFyLmd6LAotbGlicG5nLSoudGFyLmx6bWEsIG9yIGxpYnBuZy0qLnRhci5iejIgaWYgeW91IHdhbnQgVU5JWC1zdHlsZSBsaW5lCi1lbmRpbmdzIGluIHRoZSB0ZXh0IGZpbGVzLCBvciBscG5nKi43eiBvciBscG5nKi56aXAgaWYgeW91IHdhbnQgRE9TLXN0eWxlCi1saW5lIGVuZGluZ3MuICBZb3UgY2FuIGdldCBVTklYLXN0eWxlIGxpbmUgZW5kaW5ncyBmcm9tIHRoZSAqLnppcCBmaWxlCi1ieSB1c2luZyAidW56aXAgLWEiIGJ1dCB0aGVyZSBzZWVtcyB0byBiZSBubyBzaW1wbGUgd2F5IHRvIHJlY292ZXIKLVVOSVgtc3R5bGUgbGluZSBlbmRpbmdzIGZyb20gdGhlICouN3ogZmlsZS4gIFRoZSAqLnRhci5sem1hIGZpbGUgaXMKLXJlY29tbWVuZGVkIGZvciAqTklYIHVzZXJzIGluc3RlYWQuCi0KLVZlcnNpb24gMC44OSB3YXMgdGhlIGZpcnN0IG9mZmljaWFsIHJlbGVhc2Ugb2YgbGlicG5nLiAgRG9uJ3QgbGV0IHRoZQotZmFjdCB0aGF0IGl0J3MgdGhlIGZpcnN0IHJlbGVhc2UgZm9vbCB5b3UuICBUaGUgbGlicG5nIGxpYnJhcnkgaGFzIGJlZW4gaW4KLWV4dGVuc2l2ZSB1c2UgYW5kIHRlc3Rpbmcgc2luY2UgbWlkLTE5OTUuICBCeSBsYXRlIDE5OTcgaXQgaGFkCi1maW5hbGx5IGdvdHRlbiB0byB0aGUgc3RhZ2Ugd2hlcmUgdGhlcmUgaGFkbid0IGJlZW4gc2lnbmlmaWNhbnQKLWNoYW5nZXMgdG8gdGhlIEFQSSBpbiBzb21lIHRpbWUsIGFuZCBwZW9wbGUgaGF2ZSBhIGJhZCBmZWVsaW5nIGFib3V0Ci1saWJyYXJpZXMgd2l0aCB2ZXJzaW9ucyA8IDEuMC4gIFZlcnNpb24gMS4wLjAgd2FzIHJlbGVhc2VkIGluCi1NYXJjaCAxOTk4LgotCi0qKioqCi1Ob3RlIHRoYXQgc29tZSBvZiB0aGUgY2hhbmdlcyB0byB0aGUgcG5nX2luZm8gc3RydWN0dXJlIHJlbmRlciB0aGlzCi12ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCBsaWJwbmctMC44OSBvcgotZWFybGllciB2ZXJzaW9ucyBpZiB5b3UgYXJlIHVzaW5nIGEgc2hhcmVkIGxpYnJhcnkuICBUaGUgdHlwZSBvZiB0aGUKLSJmaWxsZXIiIHBhcmFtZXRlciBmb3IgcG5nX3NldF9maWxsZXIoKSBoYXMgY2hhbmdlZCBmcm9tIHBuZ19ieXRlIHRvCi1wbmdfdWludF8zMiwgd2hpY2ggd2lsbCBhZmZlY3Qgc2hhcmVkLWxpYnJhcnkgYXBwbGljYXRpb25zIHRoYXQgdXNlCi10aGlzIGZ1bmN0aW9uLgotCi1UbyBhdm9pZCBwcm9ibGVtcyB3aXRoIGNoYW5nZXMgdG8gdGhlIGludGVybmFscyBvZiBwbmdfaW5mb19zdHJ1Y3QsCi1uZXcgQVBJcyBoYXZlIGJlZW4gbWFkZSBhdmFpbGFibGUgaW4gMC45NSB0byBhdm9pZCBkaXJlY3QgYXBwbGljYXRpb24KLWFjY2VzcyB0byBpbmZvX3B0ci4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdGhlIHBuZ19zZXRfPGNodW5rPiBhbmQKLXBuZ19nZXRfPGNodW5rPiBmdW5jdGlvbnMuICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgd2hlbgotYWNjZXNzaW5nL3N0b3JpbmcgdGhlIGluZm9fc3RydWN0IGRhdGEsIHJhdGhlciB0aGFuIG1hbmlwdWxhdGluZyBpdAotZGlyZWN0bHksIHRvIGF2b2lkIHN1Y2ggcHJvYmxlbXMgaW4gdGhlIGZ1dHVyZS4KLQotSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgQVBJcyBkbyBub3QgbWFrZSBjdXJyZW50IHByb2dyYW1zCi10aGF0IGFjY2VzcyB0aGUgaW5mbyBzdHJ1Y3QgZGlyZWN0bHkgaW5jb21wYXRpYmxlIHdpdGggdGhlIG5ldwotbGlicmFyeS4gIEhvd2V2ZXIsIGl0IGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCB0aGF0IG5ldyBwcm9ncmFtcyB1c2UKLXRoZSBuZXcgQVBJcyAoYXMgc2hvd24gaW4gZXhhbXBsZS5jIGFuZCBwbmd0ZXN0LmMpLCBhbmQgb2xkZXIgcHJvZ3JhbXMKLWJlIGNvbnZlcnRlZCB0byB0aGUgbmV3IGZvcm1hdCwgdG8gZmFjaWxpdGF0ZSB1cGdyYWRlcyBpbiB0aGUgZnV0dXJlLgotKioqKgotCi1BZGRpdGlvbnMgc2luY2UgMC45MCBpbmNsdWRlIHRoZSBhYmlsaXR5IHRvIGNvbXBpbGUgbGlicG5nIGFzIGEKLVdpbmRvd3MgRExMLCBhbmQgbmV3IEFQSXMgZm9yIGFjY2Vzc2luZyBkYXRhIGluIHRoZSBpbmZvIHN0cnVjdC4KLUV4cGVyaW1lbnRhbCBmdW5jdGlvbnMgaW5jbHVkZSB0aGUgYWJpbGl0eSB0byBzZXQgd2VpZ2h0aW5nIGFuZCBjb3N0Ci1mYWN0b3JzIGZvciByb3cgZmlsdGVyIHNlbGVjdGlvbiwgZGlyZWN0IHJlYWRzIG9mIGludGVnZXJzIGZyb20gYnVmZmVycwotb24gYmlnLWVuZGlhbiBwcm9jZXNzb3JzIHRoYXQgc3VwcG9ydCBtaXNhbGlnbmVkIGRhdGEgYWNjZXNzLCBmYXN0ZXIKLW1ldGhvZHMgb2YgZG9pbmcgYWxwaGEgY29tcG9zaXRpb24sIGFuZCBtb3JlIGFjY3VyYXRlIDE2LT44IGJpdCBjb2xvcgotY29udmVyc2lvbi4KLQotVGhlIGFkZGl0aW9ucyBzaW5jZSAwLjg5IGluY2x1ZGUgdGhlIGFiaWxpdHkgdG8gcmVhZCBmcm9tIGEgUE5HIHN0cmVhbQotd2hpY2ggaGFzIGhhZCBzb21lIChvciBhbGwpIG9mIHRoZSBzaWduYXR1cmUgYnl0ZXMgcmVhZCBieSB0aGUgY2FsbGluZwotYXBwbGljYXRpb24uICBUaGlzIGFsc28gYWxsb3dzIHRoZSByZWFkaW5nIG9mIGVtYmVkZGVkIFBORyBzdHJlYW1zIHRoYXQKLWRvIG5vdCBoYXZlIHRoZSBQTkcgZmlsZSBzaWduYXR1cmUuICBBcyB3ZWxsLCBpdCBpcyBub3cgcG9zc2libGUgdG8gc2V0Ci10aGUgbGlicmFyeSBhY3Rpb24gb24gdGhlIGRldGVjdGlvbiBvZiBjaHVuayBDUkMgZXJyb3JzLiAgSXQgaXMgcG9zc2libGUKLXRvIHNldCBkaWZmZXJlbnQgYWN0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZSBDUkMgZXJyb3Igb2NjdXJyZWQgaW4gYQotY3JpdGljYWwgb3IgYW4gYW5jaWxsYXJ5IGNodW5rLgotCi1UaGUgY2hhbmdlcyBtYWRlIHRvIHRoZSBsaWJyYXJ5LCBhbmQgYnVncyBmaXhlZCBhcmUgYmFzZWQgb24gZGlzY3Vzc2lvbnMKLW9uIHRoZSBwbmctbW5nLWltcGxlbWVudCBtYWlsaW5nIGxpc3QKLWFuZCBub3Qgb24gbWF0ZXJpYWwgc3VibWl0dGVkIHByaXZhdGVseSB0byBHdXksIEFuZHJlYXMsIG9yIEdsZW5uLiAgVGhleSB3aWxsCi1mb3J3YXJkIGFueSBnb29kIHN1Z2dlc3Rpb25zIHRvIHRoZSBsaXN0LgotCi1Gb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvbiB1c2luZyBsaWJwbmcsIHJlYWQgbGlicG5nLnR4dC4gIEZvcgotZXhhbXBsZXMgb2YgbGlicG5nIGluIGEgcHJvZ3JhbSwgc2VlIGV4YW1wbGUuYyBhbmQgcG5ndGVzdC5jLiAgRm9yIHVzYWdlCi1pbmZvcm1hdGlvbiBhbmQgcmVzdHJpY3Rpb25zICh3aGF0IGxpdHRsZSB0aGV5IGFyZSkgb24gbGlicG5nLCBzZWUKLXBuZy5oLiAgRm9yIGEgZGVzY3JpcHRpb24gb24gdXNpbmcgemxpYiAodGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgdXNlZCBieQotbGlicG5nKSBhbmQgemxpYidzIHJlc3RyaWN0aW9ucywgc2VlIHpsaWIuaAotCi1JIGhhdmUgaW5jbHVkZWQgYSBnZW5lcmFsIG1ha2VmaWxlLCBhcyB3ZWxsIGFzIHNldmVyYWwgbWFjaGluZSBhbmQKLWNvbXBpbGVyIHNwZWNpZmljIG9uZXMsIGJ1dCB5b3UgbWF5IGhhdmUgdG8gbW9kaWZ5IG9uZSBmb3IgeW91ciBvd24gbmVlZHMuCi0KLVlvdSBzaG91bGQgdXNlIHpsaWIgMS4wLjQgb3IgbGF0ZXIgdG8gcnVuIHRoaXMsIGJ1dCBpdCBNQVkgd29yayB3aXRoCi12ZXJzaW9ucyBhcyBvbGQgYXMgemxpYiAwLjk1LiAgRXZlbiBzbywgdGhlcmUgYXJlIGJ1Z3MgaW4gb2xkZXIgemxpYgotdmVyc2lvbnMgd2hpY2ggY2FuIGNhdXNlIHRoZSBvdXRwdXQgb2YgaW52YWxpZCBjb21wcmVzc2lvbiBzdHJlYW1zIGZvcgotc29tZSBpbWFnZXMuICBZb3Ugd2lsbCBkZWZpbml0ZWx5IG5lZWQgemxpYiAxLjAuNCBvciBsYXRlciBpZiB5b3UgYXJlCi10YWtpbmcgYWR2YW50YWdlIG9mIHRoZSBNUy1ET1MgImZhciIgc3RydWN0dXJlIGFsbG9jYXRpb24gZm9yIHRoZSBzbWFsbAotYW5kIG1lZGl1bSBtZW1vcnkgbW9kZWxzLiAgWW91IHNob3VsZCBhbHNvIG5vdGUgdGhhdCB6bGliIGlzIGEKLWNvbXByZXNzaW9uIGxpYnJhcnkgdGhhdCBpcyB1c2VmdWwgZm9yIG1vcmUgdGhpbmdzIHRoYW4ganVzdCBQTkcgZmlsZXMuCi1Zb3UgY2FuIHVzZSB6bGliIGFzIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgZnJlYWQoKSBhbmQgZndyaXRlKCkgaWYKLXlvdSBhcmUgc28gaW5jbGluZWQuCi0KLXpsaWIgc2hvdWxkIGJlIGF2YWlsYWJsZSBhdCB0aGUgc2FtZSBwbGFjZSB0aGF0IGxpYnBuZyBpcywgb3IgYXQKLWZ0cDovL2Z0cC5zaW1wbGVzeXN0ZW1zLm9yZy9wdWIvcG5nL3NyYy8KLQotWW91IG1heSBhbHNvIHdhbnQgYSBjb3B5IG9mIHRoZSBQTkcgc3BlY2lmaWNhdGlvbi4gIEl0IGlzIGF2YWlsYWJsZQotYXMgYW4gUkZDLCBhIFczQyBSZWNvbW1lbmRhdGlvbiwgYW5kIGFuIElTTy9JRUMgU3RhbmRhcmQuICBZb3UgY2FuIGZpbmQKLXRoZXNlIGF0IGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL3BuZ2RvY3MuaHRtbAotCi1UaGlzIGNvZGUgaXMgY3VycmVudGx5IGJlaW5nIGFyY2hpdmVkIGF0IGxpYnBuZy5zZi5uZXQgaW4gdGhlCi1bRE9XTkxPQURdIGFyZWEsIGFuZCBvbiBDb21wdVNlcnZlLCBMaWIgMjAgKFBORyBTVVBQT1JUKQotYXQgR08gR1JBUEhTVVAuICBJZiB5b3UgY2FuJ3QgZmluZCBpdCBpbiBhbnkgb2YgdGhvc2UgcGxhY2VzLAotZS1tYWlsIG1lLCBhbmQgSSdsbCBoZWxwIHlvdSBmaW5kIGl0LgotCi1JZiB5b3UgaGF2ZSBhbnkgY29kZSBjaGFuZ2VzLCByZXF1ZXN0cywgcHJvYmxlbXMsIGV0Yy4sIHBsZWFzZSBlLW1haWwKLXRoZW0gdG8gbWUuICBBbHNvLCBJJ2QgYXBwcmVjaWF0ZSBhbnkgbWFrZSBmaWxlcyBvciBwcm9qZWN0IGZpbGVzLAotYW5kIGFueSBtb2RpZmljYXRpb25zIHlvdSBuZWVkZWQgdG8gbWFrZSB0byBnZXQgbGlicG5nIHRvIGNvbXBpbGUsCi1hbG9uZyB3aXRoIGEgI2RlZmluZSB2YXJpYWJsZSB0byB0ZWxsIHdoYXQgY29tcGlsZXIvc3lzdGVtIHlvdSBhcmUgb24uCi1JZiB5b3UgbmVlZGVkIHRvIGFkZCB0cmFuc2Zvcm1hdGlvbnMgdG8gbGlicG5nLCBvciB3aXNoIGxpYnBuZyB3b3VsZAotcHJvdmlkZSB0aGUgaW1hZ2UgaW4gYSBkaWZmZXJlbnQgd2F5LCBkcm9wIG1lIGEgbm90ZSAoYW5kIGNvZGUsIGlmCi1wb3NzaWJsZSksIHNvIEkgY2FuIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHRyYW5zZm9ybWF0aW9uLgotRmluYWxseSwgaWYgeW91IGdldCBhbnkgd2FybmluZyBtZXNzYWdlcyB3aGVuIGNvbXBpbGluZyBsaWJwbmcKLShub3RlOiBub3QgemxpYiksIGFuZCB0aGV5IGFyZSBlYXN5IHRvIGZpeCwgSSdkIGFwcHJlY2lhdGUgdGhlCi1maXguICBQbGVhc2UgbWVudGlvbiAibGlicG5nIiBzb21ld2hlcmUgaW4gdGhlIHN1YmplY3QgbGluZS4gIFRoYW5rcy4KLQotVGhpcyByZWxlYXNlIHdhcyBjcmVhdGVkIGFuZCB3aWxsIGJlIHN1cHBvcnRlZCBieSBteXNlbGYgKG9mIGNvdXJzZQotYmFzZWQgaW4gYSBsYXJnZSB3YXkgb24gR3V5J3MgYW5kIEFuZHJlYXMnIGVhcmxpZXIgd29yayksIGFuZCB0aGUgUE5HIGdyb3VwLgotCi1TZW5kIGNvbW1lbnRzL2NvcnJlY3Rpb25zL2NvbW1lbmRhdGlvbnMgdG8gcG5nLW1uZy1pbXBsZW1lbnQgYXQgbGlzdHMuc2YubmV0Ci0oc3Vic2NyaXB0aW9uIHJlcXVpcmVkOyB2aXNpdCAKLWh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3BuZy1tbmctaW1wbGVtZW50Ci10byBzdWJzY3JpYmUpIG9yIHRvIGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0Ci0KLVlvdSBjYW4ndCByZWFjaCBHdXksIHRoZSBvcmlnaW5hbCBsaWJwbmcgYXV0aG9yLCBhdCB0aGUgYWRkcmVzc2VzCi1naXZlbiBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGRvY3VtZW50LiAgSGUgYW5kIEFuZHJlYXMgd2lsbCByZWFkIG1haWwKLWFkZHJlc3NlZCB0byB0aGUgcG5nLW1uZy1pbXBsZW1lbnQgbGlzdCwgaG93ZXZlci4KLQotUGxlYXNlIGRvIG5vdCBzZW5kIGdlbmVyYWwgcXVlc3Rpb25zIGFib3V0IFBORy4gIFNlbmQgdGhlbSB0bwotdGhlIChwbmctbW5nLW1pc2MgYXQgbGlzdHMuc291cmNlZm9yZ2UubmV0LCBzdWJzY3JpcHRpb24gcmVxdWlyZWQsIHZpc2l0Ci1odHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9wbmctbW5nLWltcGxlbWVudCB0byBzdWJzY3JpYmUpCi1PbiB0aGUgb3RoZXIgaGFuZCwKLXBsZWFzZSBkbyBub3Qgc2VuZCBsaWJwbmcgcXVlc3Rpb25zIHRvIHRoYXQgYWRkcmVzcywgc2VuZCB0aGVtIHRvIG1lCi1vciB0byB0aGUgcG5nLW1uZy1pbXBsZW1lbnQgbGlzdC4gIEknbGwKLWdldCB0aGVtIGluIHRoZSBlbmQgYW55d2F5LiAgSWYgeW91IGhhdmUgYSBxdWVzdGlvbiBhYm91dCBzb21ldGhpbmcKLWluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiB0aGF0IGlzIHJlbGF0ZWQgdG8gdXNpbmcgbGlicG5nLCBzZW5kIGl0Ci10byBtZS4gIFNlbmQgbWUgYW55IHF1ZXN0aW9ucyB0aGF0IHN0YXJ0IHdpdGggIkkgd2FzIHVzaW5nIGxpYnBuZywKLWFuZCAuLi4iLiAgSWYgaW4gZG91YnQsIHNlbmQgcXVlc3Rpb25zIHRvIG1lLiAgSSdsbCBib3VuY2UgdGhlbQotdG8gb3RoZXJzLCBpZiBuZWNlc3NhcnkuCi0KLVBsZWFzZSBkbyBub3Qgc2VuZCBzdWdnZXN0aW9ucyBvbiBob3cgdG8gY2hhbmdlIFBORy4gIFdlIGhhdmUKLWJlZW4gZGlzY3Vzc2luZyBQTkcgZm9yIHR3ZWx2ZSB5ZWFycyBub3csIGFuZCBpdCBpcyBvZmZpY2lhbCBhbmQKLWZpbmlzaGVkLiAgSWYgeW91IGhhdmUgc3VnZ2VzdGlvbnMgZm9yIGxpYnBuZywgaG93ZXZlciwgSSdsbAotZ2xhZGx5IGxpc3Rlbi4gIEV2ZW4gaWYgeW91ciBzdWdnZXN0aW9uIGlzIG5vdCB1c2VkIGltbWVkaWF0ZWx5LAotaXQgbWF5IGJlIHVzZWQgbGF0ZXIuCi0KLUZpbGVzIGluIHRoaXMgZGlzdHJpYnV0aW9uOgotCi0gICAgICBBTk5PVU5DRSAgICAgID0+ICBBbm5vdW5jZW1lbnQgb2YgdGhpcyB2ZXJzaW9uLCB3aXRoIHJlY2VudCBjaGFuZ2VzCi0gICAgICBDSEFOR0VTICAgICAgID0+ICBEZXNjcmlwdGlvbiBvZiBjaGFuZ2VzIGJldHdlZW4gbGlicG5nIHZlcnNpb25zCi0gICAgICBLTk9XTkJVRyAgICAgID0+ICBMaXN0IG9mIGtub3duIGJ1Z3MgYW5kIGRlZmljaWVuY2llcwotICAgICAgTElDRU5TRSAgICAgICA9PiAgTGljZW5zZSB0byB1c2UgYW5kIHJlZGlzdHJpYnV0ZSBsaWJwbmcKLSAgICAgIFJFQURNRSAgICAgICAgPT4gIFRoaXMgZmlsZQotICAgICAgVE9ETyAgICAgICAgICA9PiAgVGhpbmdzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5Ci0gICAgICBZMktJTkZPICAgICAgID0+ICBTdGF0ZW1lbnQgb2YgWTJLIGNvbXBsaWFuY2UKLSAgICAgIGV4YW1wbGUuYyAgICAgPT4gIEV4YW1wbGUgY29kZSBmb3IgdXNpbmcgbGlicG5nIGZ1bmN0aW9ucwotICAgICAgbGlicG5nLSotKi1kaWZmLnR4dCA9PiBEaWZmIGZyb20gcHJldmlvdXMgcmVsZWFzZQotICAgICAgbGlicG5nLjMgICAgICA9PiAgbWFudWFsIHBhZ2UgZm9yIGxpYnBuZyAoaW5jbHVkZXMgbGlicG5nLnR4dCkKLSAgICAgIGxpYnBuZy50eHQgICAgPT4gIERlc2NyaXB0aW9uIG9mIGxpYnBuZyBhbmQgaXRzIGZ1bmN0aW9ucwotICAgICAgbGlicG5ncGYuMyAgICA9PiAgbWFudWFsIHBhZ2UgZm9yIGxpYnBuZydzIHByaXZhdGUgZnVuY3Rpb25zCi0gICAgICBwbmcuNSAgICAgICAgID0+ICBtYW51YWwgcGFnZSBmb3IgdGhlIFBORyBmb3JtYXQKLSAgICAgIHBuZy5jICAgICAgICAgPT4gIEJhc2ljIGludGVyZmFjZSBmdW5jdGlvbnMgY29tbW9uIHRvIGxpYnJhcnkKLSAgICAgIHBuZy5oICAgICAgICAgPT4gIExpYnJhcnkgZnVuY3Rpb24gYW5kIGludGVyZmFjZSBkZWNsYXJhdGlvbnMKLSAgICAgIHBuZ2NvbmYuaCAgICAgPT4gIFN5c3RlbSBzcGVjaWZpYyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KLSAgICAgIHBuZ2Vycm9yLmMgICAgPT4gIEVycm9yL3dhcm5pbmcgbWVzc2FnZSBJL08gZnVuY3Rpb25zCi0gICAgICBwbmdnZXQuYyAgICAgID0+ICBGdW5jdGlvbnMgZm9yIHJldHJpZXZpbmcgaW5mbyBmcm9tIHN0cnVjdAotICAgICAgcG5nbWVtLmMgICAgICA9PiAgTWVtb3J5IGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgICAgcG5nYmFyLnBuZyAgICA9PiAgUE5HIGxvZ28sIDg4eDMxCi0gICAgICBwbmdub3cucG5nICAgID0+ICBQTkcgbG9nbywgOTh4MzEKLSAgICAgIHBuZ3ByZWFkLmMgICAgPT4gIFByb2dyZXNzaXZlIHJlYWRpbmcgZnVuY3Rpb25zCi0gICAgICBwbmdyZWFkLmMgICAgID0+ICBSZWFkIGRhdGEvaGVscGVyIGhpZ2gtbGV2ZWwgZnVuY3Rpb25zCi0gICAgICBwbmdyaW8uYyAgICAgID0+ICBMb3dlc3QtbGV2ZWwgZGF0YSByZWFkIEkvTyBmdW5jdGlvbnMKLSAgICAgIHBuZ3J0cmFuLmMgICAgPT4gIFJlYWQgZGF0YSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMKLSAgICAgIHBuZ3J1dGlsLmMgICAgPT4gIFJlYWQgZGF0YSB1dGlsaXR5IGZ1bmN0aW9ucwotICAgICAgcG5nc2V0LmMgICAgICA9PiAgRnVuY3Rpb25zIGZvciBzdG9yaW5nIGRhdGEgaW50byB0aGUgaW5mb19zdHJ1Y3QKLSAgICAgIHBuZ3Rlc3QuYyAgICAgPT4gIExpYnJhcnkgdGVzdCBwcm9ncmFtCi0gICAgICBwbmd0ZXN0LnBuZyAgID0+ICBMaWJyYXJ5IHRlc3Qgc2FtcGxlIGltYWdlCi0gICAgICBwbmd0cmFucy5jICAgID0+ICBDb21tb24gZGF0YSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMKLSAgICAgIHBuZ3dpby5jICAgICAgPT4gIExvd2VzdC1sZXZlbCB3cml0ZSBJL08gZnVuY3Rpb25zCi0gICAgICBwbmd3cml0ZS5jICAgID0+ICBIaWdoLWxldmVsIHdyaXRlIGZ1bmN0aW9ucwotICAgICAgcG5nd3RyYW4uYyAgICA9PiAgV3JpdGUgZGF0YSB0cmFuc2Zvcm1hdGlvbnMKLSAgICAgIHBuZ3d1dGlsLmMgICAgPT4gIFdyaXRlIHV0aWxpdHkgZnVuY3Rpb25zCi0gICAgICBjb250cmliICAgICAgID0+ICBDb250cmlidXRpb25zCi0gICAgICAgZ3JlZ2Jvb2sgICAgICAgICA9PiAgc291cmNlIGNvZGUgZm9yIFBORyByZWFkaW5nIGFuZCB3cml0aW5nLCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JlZyBSb2Vsb2ZzJyAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTydSZWlsbHksIDE5OTkKLSAgICAgICBtc3ZjdGVzdCAgICAgPT4gIEJ1aWxkcyBhbmQgcnVucyBwbmd0ZXN0IHVzaW5nIGEgTVNWQyB3b3Jrc3BhY2UKLSAgICAgICBwbmdtaW51cyAgICAgPT4gIFNpbXBsZSBwbm0ycG5nIGFuZCBwbmcycG5tIHByb2dyYW1zCi0gICAgICAgcG5nc3VpdGUgICAgID0+ICBUZXN0IGltYWdlcwotICAgICAgIHZpc3VwbmcgICAgICA9PiAgQ29udGFpbnMgYSBNU1ZDIHdvcmtzcGFjZSBmb3IgVmlzdWFsUG5nCi0gICAgICBwcm9qZWN0cyAgICAgID0+ICBDb250YWlucyBwcm9qZWN0IGZpbGVzIGFuZCB3b3Jrc3BhY2VzIGZvciBidWlsZGluZyBETEwKLSAgICAgICBiZW9zICAgICAgICAgICAgID0+ICBDb250YWlucyBhIEJlb3Mgd29ya3NwYWNlIGZvciBidWlsZGluZyBsaWJwbmcKLSAgICAgICBjNWJ1aWxkZXIgICAgICAgID0+ICBDb250YWlucyBhIEJvcmxhbmQgd29ya3NwYWNlIGZvciBidWlsZGluZyBsaWJwbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgemxpYgotICAgICAgIHZpc3VhbGM2ICAgICAgICAgPT4gIENvbnRhaW5zIGEgTWljcm9zb2Z0IFZpc3VhbCBDKysgKE1TVkMpIHdvcmtzcGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBidWlsZGluZyBsaWJwbmcgYW5kIHpsaWIKLSAgICAgICBuZXR3YXJlLnR4dCAgICAgID0+ICBDb250YWlucyBpbnN0cnVjdGlvbnMgZm9yIGRvd25sb2FkaW5nIGEgc2V0IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCBmaWxlcyBmb3IgYnVpbGRpbmcgbGlicG5nIGFuZCB6bGliIG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d2FyZS4KLSAgICAgICB3aW5jZS50eHQgICAgICAgID0+ICBDb250YWlucyBpbnN0cnVjdGlvbnMgZm9yIGRvd25sb2FkaW5nIGEgTWljcm9zb2Z0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzdWFsIEMrKyAoV2luZG93cyBDRCBUb29sa2l0KSB3b3Jrc3BhY2UgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRpbmcgbGlicG5nIGFuZCB6bGliIG9uIFdpbmRvd3NDRQotICAgICAgc2NyaXB0cyAgICAgICA9PiAgRGlyZWN0b3J5IGNvbnRhaW5pbmcgc2NyaXB0cyBmb3IgYnVpbGRpbmcgbGlicG5nOgotICAgICAgIGRlc2NyaXAubW1zICAgICAgPT4gIFZNUyBtYWtlZmlsZSBmb3IgTU1TIG9yIE1NSwotICAgICAgIG1ha2VmaWxlLnN0ZCAgICAgPT4gIEdlbmVyaWMgVU5JWCBtYWtlZmlsZSAoY2MsIGNyZWF0ZXMgc3RhdGljIGxpYnBuZy5hKQotICAgICAgIG1ha2VmaWxlLmVsZiAgICAgPT4gIExpbnV4L0VMRiBtYWtlZmlsZSBzeW1ib2wgdmVyc2lvbmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2MsIGNyZWF0ZXMgbGlicG5nMTIuc28uMC4xLjIuMzcpCi0gICAgICAgbWFrZWZpbGUubGludXggICA9PiAgTGludXgvRUxGIG1ha2VmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjYywgY3JlYXRlcyBsaWJwbmcxMi5zby4wLjEuMi4zNykKLSAgICAgICBtYWtlZmlsZS5nY21teCAgID0+ICBMaW51eC9FTEYgbWFrZWZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2NjLCBjcmVhdGVzIGxpYnBuZzEyLnNvLjAuMS4yLjM3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXMgYXNzZW1ibGVyIGNvZGUgdHVuZWQgZm9yIEludGVsIE1NWCBwbGF0Zm9ybSkKLSAgICAgICBtYWtlZmlsZS5nY2MgICAgID0+ICBHZW5lcmljIG1ha2VmaWxlIChnY2MsIGNyZWF0ZXMgc3RhdGljIGxpYnBuZy5hKQotICAgICAgIG1ha2VmaWxlLmtuciAgICAgPT4gIEFyY2hhaWMgVU5JWCBNYWtlZmlsZSB0aGF0IGNvbnZlcnRzIGZpbGVzIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnNpMmtuciAoUmVxdWlyZXMgYW5zaTJrbnIuYyBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwOi8vZnRwLmNzLndpc2MuZWR1L2dob3N0KQotICAgICAgIG1ha2VmaWxlLmFpeCAgICAgPT4gIEFJWCBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLmN5Z3dpbiAgPT4gIEN5Z3dpbi9nY2MgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5kYXJ3aW4gID0+ICBEYXJ3aW4gbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5kZWMgICAgID0+ICBERUMgQWxwaGEgVU5JWCBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLmZyZWVic2QgPT4gIEZyZWVCU0QgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5ocGdjYyAgID0+ICBIUFVYIG1ha2VmaWxlIHVzaW5nIGdjYwotICAgICAgIG1ha2VmaWxlLmhwdXggICAgPT4gIEhQVVggKDEwLjIwIGFuZCAxMS4wMCkgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5ocDY0ICAgID0+ICBIUFVYICgxMC4yMCBhbmQgMTEuMDApIG1ha2VmaWxlLCA2NCBiaXQKLSAgICAgICBtYWtlZmlsZS5pYm1jICAgID0+ICBJQk0gQy9DKysgdmVyc2lvbiAzLnggZm9yIFdpbjMyIGFuZCBPUy8yIChzdGF0aWMpCi0gICAgICAgbWFrZWZpbGUuaW50ZWwgICA9PiAgSW50ZWwgQy9DKysgdmVyc2lvbiA0LjAgYW5kIGxhdGVyCi0gICAgICAgbGlicG5nLmljYyAgICAgICA9PiAgUHJvamVjdCBmaWxlLCBJQk0gVmlzdWFsQWdlL0MrKyA0LjAgb3IgbGF0ZXIKLSAgICAgICBtYWtlZmlsZS5uZXRic2QgID0+ICBOZXRCU0QvY2MgbWFrZWZpbGUsIFBOR0dDQ1JELCBtYWtlcyBsaWJwbmcuc28uCi0gICAgICAgbWFrZWZpbGUubmUxMmJzZCAgPT4gIE5ldEJTRC9jYyBtYWtlZmlsZSwgUE5HR0NDUkQsIG1ha2VzIGxpYnBuZzEyLnNvCi0gICAgICAgbWFrZWZpbGUub3BlbmJzZCA9PiAgT3BlbkJTRCBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLnNnaSAgICAgPT4gIFNpbGljb24gR3JhcGhpY3MgSVJJWCAoY2MsIGNyZWF0ZXMgc3RhdGljIGxpYikKLSAgICAgICBtYWtlZmlsZS5zZ2djYyAgID0+ICBTaWxpY29uIEdyYXBoaWNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjYywgY3JlYXRlcyBsaWJwbmcxMi5zby4wLjEuMi4zNykKLSAgICAgICBtYWtlZmlsZS5zdW5vcyAgID0+ICBTdW4gbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5zb2xhcmlzID0+ICBTb2xhcmlzIDIuWCBtYWtlZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnY2MsIGNyZWF0ZXMgbGlicG5nMTIuc28uMC4xLjIuMzcpCi0gICAgICAgbWFrZWZpbGUuc285ICAgICA9PiAgU29sYXJpcyA5IG1ha2VmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjYywgY3JlYXRlcyBsaWJwbmcxMi5zby4wLjEuMi4zNykKLSAgICAgICBtYWtlZmlsZS4zMnN1bnUgID0+ICBTdW4gVWx0cmEgMzItYml0IG1ha2VmaWxlCi0gICAgICAgbWFrZWZpbGUuNjRzdW51ICA9PiAgU3VuIFVsdHJhIDY0LWJpdCBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLnNjbyAgICAgPT4gIEZvciBTQ08gT1NyNSAgRUxGIGFuZCBVbml4d2FyZSA3IHdpdGggTmF0aXZlIGNjCi0gICAgICAgbWFrZWZpbGUubWlwcyAgICA9PiAgTUlQUyBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLmFjb3JuICAgPT4gIEFjb3JuIG1ha2VmaWxlCi0gICAgICAgbWFrZWZpbGUuYW1pZ2EgICA9PiAgQW1pZ2EgbWFrZWZpbGUKLSAgICAgICBzbWFrZWZpbGUucHBjICAgID0+ICBBTUlHQSBzbWFrZWZpbGUgZm9yIFNBUyBDIFY2LjU4LzcuMDAgUFBDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIgKFJlcXVpcmVzIFNDT1BUSU9OUywgY29waWVkIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzL1NDT1BUSU9OUy5wcGMpCi0gICAgICAgbWFrZWZpbGUuYXRhcmkgICA9PiAgQXRhcmkgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5iZW9zICAgID0+ICBCRU9TIG1ha2VmaWxlIGZvciBYODYKLSAgICAgICBtYWtlZmlsZS5ib3IgICAgID0+ICBCb3JsYW5kIG1ha2VmaWxlICh1c2VzIGJjYykKLSAgICAgICBtYWtlZmlsZS5iYzMyICAgID0+ICAzMi1iaXQgQm9ybGFuZCBDKysgKGFsbCBtb2R1bGVzIGNvbXBpbGVkIGluIEMgbW9kZSkKLSAgICAgICBtYWtlZmlsZS50YzMgICAgID0+ICBUdXJibyBDIDMuMCBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLmRqMiAgICAgPT4gIERKR1BQIDIgbWFrZWZpbGUKLSAgICAgICBtYWtlZmlsZS5tc2MgICAgID0+ICBNaWNyb3NvZnQgQyBtYWtlZmlsZQotICAgICAgIG1ha2VmaWxlLnZjYXdpbjMyPT4gIG1ha2VmaWxlIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyA1LjAgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXIgKHVzZXMgYXNzZW1ibGVyIGNvZGUgdHVuZWQgZm9yIEludGVsIE1NWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtKQotICAgICAgIG1ha2VmaWxlLnZjd2luMzIgPT4gIG1ha2VmaWxlIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyA0LjAgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXIgKGRvZXMgbm90IHVzZSBhc3NlbWJsZXIgY29kZSkKLSAgICAgICBtYWtlZmlsZS5vczIgICAgID0+ICBPUy8yIE1ha2VmaWxlIChnY2MgYW5kIGVteCwgcmVxdWlyZXMgcG5nb3MyLmRlZikKLSAgICAgICBwbmdvczIuZGVmICAgICAgID0+ICBPUy8yIG1vZHVsZSBkZWZpbml0aW9uIGZpbGUgdXNlZCBieSBtYWtlZmlsZS5vczIKLSAgICAgICBtYWtlZmlsZS53YXRjb20gID0+ICBXYXRjb20gMTBhKyBNYWtlZmlsZSwgMzItYml0IGZsYXQgbWVtb3J5IG1vZGVsCi0gICAgICAgbWFrZXZtcy5jb20gICAgICA9PiAgVk1TIGJ1aWxkIHNjcmlwdAotICAgICAgIFNDT1BUSU9OUy5wcGMgICAgPT4gIFVzZWQgd2l0aCBzbWFrZWZpbGUucHBjCi0KLUdvb2QgbHVjaywgYW5kIGhhcHB5IGNvZGluZy4KLQotLUdsZW5uIFJhbmRlcnMtUGVocnNvbiAoY3VycmVudCBtYWludGFpbmVyKQotIEludGVybmV0OiBnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldAotCi0tQW5kcmVhcyBFcmljIERpbGdlciAoZm9ybWVyIG1haW50YWluZXIsIDE5OTYtMTk5NykKLSBJbnRlcm5ldDogYWRpbGdlciBhdCBlbmVsLnVjYWxnYXJ5LmNhCi0gV2ViOiBodHRwOi8vbWVtYmVycy5zaGF3LmNhL2FkaWxnZXIvCi0KLS1HdXkgRXJpYyBTY2hhbG5hdCAob3JpZ2luYWwgYXV0aG9yIGFuZCBmb3JtZXIgbWFpbnRhaW5lciwgMTk5NS0xOTk2KQotIChmb3JtZXJseSBvZiBHcm91cCA0MiwgSW5jKQotIEludGVybmV0OiBnc2NoYWwgYXQgaW5maW5ldC5jb20KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL1RPRE8gYi9saWJzL2xpYnBuZy9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWY2Mzk1Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1UT0RPIC0gbGlzdCBvZiB0aGluZ3MgdG8gZG8gZm9yIGxpYnBuZzoKLQotRmluYWwgYnVnIGZpeGVzLgotSW1wcm92ZSBBUEkgYnkgaGlkaW5nIHRoZSBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBzdHJ1Y3RzLgotRmluaXNoIHdvcmsgb24gdGhlIG5vLWZsb2F0aW5nLXBvaW50IHZlcnNpb24gKGluY2x1ZGluZyBnYW1tYSBjb21wZW5zYXRpb24pCi1CZXR0ZXIgQysrIHdyYXBwZXIvZnVsbCBDKysgaW1wbGVtZW50YXRpb24/Ci1GaXggcHJvYmxlbSB3aXRoIEMrKyBhbmQgRVhURVJOICJDIi4KLWNIUk0gdHJhbnNmb3JtYXRpb24uCi1JbXByb3ZlIHNldGptcC9sb25nam1wIHVzYWdlIG9yIHJlbW92ZSBpdCBpbiBmYXZvciBvZiByZXR1cm5pbmcgZXJyb3IgY29kZXMuCi1BZGQgImdyYXlzY2FsZS0+cGFsZXR0ZSIgdHJhbnNmb3JtYXRpb24gYW5kICJwYWxldHRlLT5ncmF5c2NhbGUiIGRldGVjdGlvbi4KLUltcHJvdmVkIGRpdGhlcmluZy4KLU11bHRpLWxpbmd1YWwgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZSBzdXBwb3J0LgotQ29tcGxldGUgc1JHQiB0cmFuc2Zvcm1hdGlvbiAocHJlc2VudGx5IGl0IHNpbXBseSB1c2VzIGdhbW1hPTAuNDU0NTUpLgotTWFuIHBhZ2VzIGZvciBmdW5jdGlvbiBjYWxscy4KLUJldHRlciBkb2N1bWVudGF0aW9uLgotQmV0dGVyIGZpbHRlciBzZWxlY3Rpb24KLSAgIChjb3VudGluZyBodWZmbWFuIGJpdHMvcHJlY29tcHJlc3Npb24/ICBmaWx0ZXIgaW5lcnRpYT8gIGZpbHRlciBjb3N0cz8pLgotSGlzdG9ncmFtIGNyZWF0aW9uLgotVGV4dCBjb252ZXJzaW9uIGJldHdlZW4gZGlmZmVyZW50IGNvZGUgcGFnZXMgKExhdGluLTEgLT4gTWFjIGFuZCBET1MpLgotU2hvdWxkIHdlIGFsd2F5cyBtYWxsb2MgMl5iaXRfZGVwdGggUExURS90Uk5TL2hJU1QgZW50cmllcyBmb3Igc2FmZXR5PwotQnVpbGQgZ2FtbWEgdGFibGVzIHVzaW5nIGZpeGVkIHBvaW50IChhbmQgZG8gYXdheSB3aXRoIGZsb2F0aW5nIHBvaW50IGVudGlyZWx5KS4KLVVzZSBncmVhdGVyIHByZWNpc2lvbiB3aGVuIGNoYW5naW5nIHRvIGxpbmVhciBnYW1tYSBmb3IgY29tcG9zaXRpbmcgYWdhaW5zdAotICBiYWNrZ3JvdW5kIGFuZCBkb2luZyByZ2ItdG8tZ3JheSB0cmFuc2Zvcm1hdGlvbi4KLUludmVzdGlnYXRlIHByZS1pbmNyZW1lbnRlZCBsb29wIGNvdW50ZXJzIGFuZCBvdGhlciBsb29wIGNvbnN0cnVjdGlvbnMuCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9ZMktJTkZPIGIvbGlicy9saWJwbmcvWTJLSU5GTwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiMTgwYy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9ZMktJTkZPCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotICAgWTJLIGNvbXBsaWFuY2UgaW4gbGlicG5nOgotICAgPT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICBKdW5lIDQsIDIwMDkKLQotICAgICAgU2luY2UgdGhlIFBORyBEZXZlbG9wbWVudCBncm91cCBpcyBhbiBhZC1ob2MgYm9keSwgd2UgY2FuJ3QgbWFrZQotICAgICAgYW4gb2ZmaWNpYWwgZGVjbGFyYXRpb24uCi0KLSAgICAgIFRoaXMgaXMgeW91ciB1bm9mZmljaWFsIGFzc3VyYW5jZSB0aGF0IGxpYnBuZyBmcm9tIHZlcnNpb24gMC43MSBhbmQKLSAgICAgIHVwd2FyZCB0aHJvdWdoIDEuMi4zNyBhcmUgWTJLIGNvbXBsaWFudC4gIEl0IGlzIG15IGJlbGllZiB0aGF0IGVhcmxpZXIKLSAgICAgIHZlcnNpb25zIHdlcmUgYWxzbyBZMksgY29tcGxpYW50LgotCi0gICAgICBMaWJwbmcgb25seSBoYXMgdGhyZWUgeWVhciBmaWVsZHMuICBPbmUgaXMgYSAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlcgotICAgICAgdGhhdCB3aWxsIGhvbGQgeWVhcnMgdXAgdG8gNjU1MzUuICBUaGUgb3RoZXIgdHdvIGhvbGQgdGhlIGRhdGUgaW4gdGV4dAotICAgICAgZm9ybWF0LCBhbmQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDk5OTkuCi0KLSAgICAgIFRoZSBpbnRlZ2VyIGlzCi0gICAgICAgICAgInBuZ191aW50XzE2IHllYXIiIGluIHBuZ190aW1lX3N0cnVjdC4KLQotICAgICAgVGhlIHN0cmluZ3MgYXJlCi0gICAgICAgICAgInBuZ19jaGFycCB0aW1lX2J1ZmZlciIgaW4gcG5nX3N0cnVjdCBhbmQKLSAgICAgICAgICAibmVhcl90aW1lX2J1ZmZlciIsIHdoaWNoIGlzIGEgbG9jYWwgY2hhcmFjdGVyIHN0cmluZyBpbiBwbmcuYy4KLQotICAgICAgVGhlcmUgYXJlIHNldmVuIHRpbWUtcmVsYXRlZCBmdW5jdGlvbnM6Ci0KLSAgICAgICAgICBwbmdfY29udmVydF90b19yZmNfMTEyMygpIGluIHBuZy5jCi0gICAgICAgICAgICAoZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExNTIoKSBpbiBlcnJvcikKLSAgICAgICAgICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGluIHBuZ3dyaXRlLmMsIGNhbGxlZCBpbiBwbmd3cml0ZS5jCi0gICAgICAgICAgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBpbiBwbmd3cml0ZS5jCi0gICAgICAgICAgcG5nX2dldF90SU1FKCkgaW4gcG5nZ2V0LmMKLSAgICAgICAgICBwbmdfaGFuZGxlX3RJTUUoKSBpbiBwbmdydXRpbC5jLCBjYWxsZWQgaW4gcG5ncmVhZC5jCi0gICAgICAgICAgcG5nX3NldF90SU1FKCkgaW4gcG5nc2V0LmMKLSAgICAgICAgICBwbmdfd3JpdGVfdElNRSgpIGluIHBuZ3d1dGlsLmMsIGNhbGxlZCBpbiBwbmd3cml0ZS5jCi0KLSAgICAgIEFsbCBhcHBlYXIgdG8gaGFuZGxlIGRhdGVzIHByb3Blcmx5IGluIGEgWTJLIGVudmlyb25tZW50LiAgVGhlCi0gICAgICBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGZ1bmN0aW9uIGNhbGxzIGdtdGltZSgpIHRvIGNvbnZlcnQgZnJvbSBzeXN0ZW0KLSAgICAgIGNsb2NrIHRpbWUsIHdoaWNoIHJldHVybnMgKHllYXIgLSAxOTAwKSwgd2hpY2ggd2UgcHJvcGVybHkgY29udmVydCB0bwotICAgICAgdGhlIGZ1bGwgNC1kaWdpdCB5ZWFyLiAgVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGFwcGxpY2F0aW9ucyB1c2luZwotICAgICAgbGlicG5nIGFyZSBub3QgcGFzc2luZyA0LWRpZ2l0IHllYXJzIGludG8gdGhlIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkKLSAgICAgIGZ1bmN0aW9uLCBvciB0aGF0IHRoZXkgYXJlIGluY29ycmVjdGx5IHBhc3Npbmcgb25seSBhIDItZGlnaXQgeWVhcgotICAgICAgaW5zdGVhZCBvZiAieWVhciAtIDE5MDAiIGludG8gdGhlIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgZnVuY3Rpb24sCi0gICAgICBidXQgdGhpcyBpcyBub3QgdW5kZXIgb3VyIGNvbnRyb2wuICBUaGUgbGlicG5nIGRvY3VtZW50YXRpb24gaGFzIGFsd2F5cwotICAgICAgc3RhdGVkIHRoYXQgaXQgd29ya3Mgd2l0aCA0LWRpZ2l0IHllYXJzLCBhbmQgdGhlIEFQSXMgaGF2ZSBiZWVuCi0gICAgICBkb2N1bWVudGVkIGFzIHN1Y2guCi0KLSAgICAgIFRoZSB0SU1FIGNodW5rIGl0c2VsZiBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCB1c2VzIGEgMi1ieXRlIHVuc2lnbmVkCi0gICAgICBpbnRlZ2VyIHRvIGhvbGQgdGhlIHllYXIsIGFuZCBjYW4gaG9sZCB5ZWFycyBhcyBsYXJnZSBhcyA2NTUzNS4KLQotICAgICAgemxpYiwgdXBvbiB3aGljaCBsaWJwbmcgZGVwZW5kcywgaXMgYWxzbyBZMksgY29tcGxpYW50LiAgSXQgY29udGFpbnMKLSAgICAgIG5vIGRhdGUtcmVsYXRlZCBjb2RlLgotCi0KLSAgICAgICAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICAgICAgICAgbGlicG5nIG1haW50YWluZXIKLSAgICAgICAgIFBORyBEZXZlbG9wbWVudCBHcm91cApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvYWNsb2NhbC5tNCBiL2xpYnMvbGlicG5nL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMWE0YzQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDg4MDEgKzAsMCBAQAotIyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuMTAuMSAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAotIyAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKLSAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAotbTRfaWYoQUNfQVVUT0NPTkZfVkVSU0lPTiwgWzIuNjJdLCwKLVttNF93YXJuaW5nKFt0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmb3IgYXV0b2NvbmYgMi42Mi4KLVlvdSBoYXZlIGFub3RoZXIgdmVyc2lvbiBvZiBhdXRvY29uZi4gIEl0IG1heSB3b3JrLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8uCi1JZiB5b3UgaGF2ZSBwcm9ibGVtcywgeW91IG1heSBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIGJ1aWxkIHN5c3RlbSBlbnRpcmVseS4KLVRvIGRvIHNvLCB1c2UgdGhlIHByb2NlZHVyZSBkb2N1bWVudGVkIGJ5IHRoZSBwYWNrYWdlLCB0eXBpY2FsbHkgYGF1dG9yZWNvbmYnLl0pXSkKLQotIyBsaWJ0b29sLm00IC0gQ29uZmlndXJlIGxpYnRvb2wgZm9yIHRoZSBob3N0IHN5c3RlbS4gLSotQXV0b2NvbmYtKi0KLSMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCi0jICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyAgIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQsIDE5OTYKLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKLSMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1tNF9kZWZpbmUoW19MVF9DT1BZSU5HXSwgW2RubAotIyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwKLSMgICAgICAgICAgICAgICAgIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgotIwotIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sLgotIwotIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0Ci0jIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQotIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLSMKLSMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5Ci0jIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLCBvcgotIyBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0jIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotXSkKLQotIyBzZXJpYWwgNTUgTFRfSU5JVAotCi0KLSMgTFRfUFJFUkVRKFZFUlNJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb21wbGFpbiBhbmQgZXhpdCBpZiB0aGlzIGxpYnRvb2wgdmVyc2lvbiBpcyBsZXNzIHRoYXQgVkVSU0lPTi4KLW00X2RlZnVuKFtMVF9QUkVSRVFdLAotW200X2lmKG00X3ZlcnNpb25fY29tcGFyZShtNF9kZWZuKFtMVF9QQUNLQUdFX1ZFUlNJT05dKSwgWyQxXSksIC0xLAotICAgICAgIFttNF9kZWZhdWx0KFskM10sCi0JCSAgIFttNF9mYXRhbChbTGlidG9vbCB2ZXJzaW9uICQxIG9yIGhpZ2hlciBpcyByZXF1aXJlZF0sCi0JCSAgICAgICAgICAgICA2MyldKV0sCi0gICAgICAgWyQyXSldKQotCi0KLSMgX0xUX0NIRUNLX0JVSUxERElSCi0jIC0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb21wbGFpbiBpZiB0aGUgYWJzb2x1dGUgYnVpbGQgZGlyZWN0b3J5IG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzCi1tNF9kZWZ1bihbX0xUX0NIRUNLX0JVSUxERElSXSwKLVtjYXNlIGBwd2RgIGluCi0gICpcICogfCAqXAkqKQotICAgIEFDX01TR19XQVJOKFtMaWJ0b29sIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHdoaXRlc3BhY2UgaW4gYHB3ZGBdKSA7OwotZXNhYwotXSkKLQotCi0jIExUX0lOSVQoW09QVElPTlNdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtMVF9JTklUXSwKLVtBQ19QUkVSRVEoWzIuNThdKWRubCBXZSB1c2UgQUNfSU5DTFVERVNfREVGQVVMVAotQUNfQkVGT1JFKFskMF0sIFtMVF9MQU5HXSlkbmwKLUFDX0JFRk9SRShbJDBdLCBbTFRfT1VUUFVUXSlkbmwKLUFDX0JFRk9SRShbJDBdLCBbTFRETF9JTklUXSlkbmwKLW00X3JlcXVpcmUoW19MVF9DSEVDS19CVUlMRERJUl0pZG5sCi0KLWRubCBBdXRvY29uZiBkb2Vzbid0IGNhdGNoIHVuZXhwYW5kZWQgTFRfIG1hY3JvcyBieSBkZWZhdWx0OgotbTRfcGF0dGVybl9mb3JiaWQoW15fP0xUX1tBLVpfXSskXSlkbmwKLW00X3BhdHRlcm5fYWxsb3coW14oX0xUX0VPRnxMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XfExUX01VTFRJX01PRFVMRSkkXSlkbmwKLWRubCBhY2xvY2FsIGRvZXNuJ3QgcHVsbCBsdG9wdGlvbnMubTQsIGx0c3VnYXIubTQsIG9yIGx0dmVyc2lvbi5tNAotZG5sIHVubGVzcyB3ZSByZXF1aXJlIGFuIEFDX0RFRlVOZWQgbWFjcm86Ci1BQ19SRVFVSVJFKFtMVE9QVElPTlNfVkVSU0lPTl0pZG5sCi1BQ19SRVFVSVJFKFtMVFNVR0FSX1ZFUlNJT05dKWRubAotQUNfUkVRVUlSRShbTFRWRVJTSU9OX1ZFUlNJT05dKWRubAotQUNfUkVRVUlSRShbTFRPQlNPTEVURV9WRVJTSU9OXSlkbmwKLW00X3JlcXVpcmUoW19MVF9QUk9HX0xUTUFJTl0pZG5sCi0KLWRubCBQYXJzZSBPUFRJT05TCi1fTFRfU0VUX09QVElPTlMoWyQwXSwgWyQxXSkKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkbHRtYWluIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi1fTFRfU0VUVVAKLQotIyBPbmx5IGV4cGFuZCBvbmNlOgotbTRfZGVmaW5lKFtMVF9JTklUXSkKLV0pIyBMVF9JTklUCi0KLSMgT2xkIG5hbWVzOgotQVVfQUxJQVMoW0FDX1BST0dfTElCVE9PTF0sIFtMVF9JTklUXSkKLUFVX0FMSUFTKFtBTV9QUk9HX0xJQlRPT0xdLCBbTFRfSU5JVF0pCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0FDX1BST0dfTElCVE9PTF0sIFtdKQotZG5sIEFDX0RFRlVOKFtBTV9QUk9HX0xJQlRPT0xdLCBbXSkKLQotCi0jIF9MVF9DQ19CQVNFTkFNRShDQykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDYWxjdWxhdGUgY2NfYmFzZW5hbWUuICBTa2lwIGtub3duIGNvbXBpbGVyIHdyYXBwZXJzIGFuZCBjcm9zcy1wcmVmaXguCi1tNF9kZWZ1bihbX0xUX0NDX0JBU0VOQU1FXSwKLVtmb3IgY2NfdGVtcCBpbiAkMSIiOyBkbwotICBjYXNlICRjY190ZW1wIGluCi0gICAgY29tcGlsZSB8ICpbW1xcL11dY29tcGlsZSB8IGNjYWNoZSB8ICpbW1xcL11dY2NhY2hlICkgOzsKLSAgICBkaXN0Y2MgfCAqW1tcXC9dXWRpc3RjYyB8IHB1cmlmeSB8ICpbW1xcL11dcHVyaWZ5ICkgOzsKLSAgICBcLSopIDs7Ci0gICAgKikgYnJlYWs7OwotICBlc2FjCi1kb25lCi1jY19iYXNlbmFtZT1gJEVDSE8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKLV0pCi0KLQotIyBfTFRfRklMRVVUSUxTX0RFRkFVTFRTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSXQgaXMgb2theSB0byB1c2UgdGhlc2UgZmlsZSBjb21tYW5kcyBhbmQgYXNzdW1lIHRoZXkgaGF2ZSBiZWVuIHNldAotIyBzZW5zaWJseSBhZnRlciBgbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pJy4KLW00X2RlZnVuKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSwKLVs6ICR7Q1A9ImNwIC1mIn0KLTogJHtNVj0ibXYgLWYifQotOiAke1JNPSJybSAtZiJ9Ci1dKSMgX0xUX0ZJTEVVVElMU19ERUZBVUxUUwotCi0KLSMgX0xUX1NFVFVQCi0jIC0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9TRVRVUF0sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLV9MVF9ERUNMKFtdLCBbaG9zdF9hbGlhc10sIFswXSwgW1RoZSBob3N0IHN5c3RlbV0pZG5sCi1fTFRfREVDTChbXSwgW2hvc3RdLCBbMF0pZG5sCi1fTFRfREVDTChbXSwgW2hvc3Rfb3NdLCBbMF0pZG5sCi1kbmwKLV9MVF9ERUNMKFtdLCBbYnVpbGRfYWxpYXNdLCBbMF0sIFtUaGUgYnVpbGQgc3lzdGVtXSlkbmwKLV9MVF9ERUNMKFtdLCBbYnVpbGRdLCBbMF0pZG5sCi1fTFRfREVDTChbXSwgW2J1aWxkX29zXSwgWzBdKWRubAotZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAotQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCi1kbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi10ZXN0IC16ICIkTE5fUyIgJiYgTE5fUz0ibG4gLXMiCi1fTFRfREVDTChbXSwgW0xOX1NdLCBbMV0sIFtXaGV0aGVyIHdlIG5lZWQgc29mdCBvciBoYXJkIGxpbmtzXSlkbmwKLWRubAotQUNfUkVRVUlSRShbTFRfQ01EX01BWF9MRU5dKWRubAotX0xUX0RFQ0woW29iamV4dF0sIFthY19vYmpleHRdLCBbMF0sIFtPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIildKWRubAotX0xUX0RFQ0woW10sIFtleGVleHRdLCBbMF0sIFtFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIildKWRubAotZG5sCi1tNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKLW00X3JlcXVpcmUoW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10pZG5sCi1tNF9yZXF1aXJlKFtfTFRfQ01EX1JFTE9BRF0pZG5sCi1tNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9EXSlkbmwKLW00X3JlcXVpcmUoW19MVF9DTURfT0xEX0FSQ0hJVkVdKWRubAotbTRfcmVxdWlyZShbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10pZG5sCi0KLV9MVF9DT05GSUdfTElCVE9PTF9JTklUKFsKLSMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKLSMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCi1pZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KLSAgIHNldG9wdCBOT19HTE9CX1NVQlNUCi1maQotXSkKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCi0gICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZmkKLQotX0xUX0NIRUNLX09CSkRJUgotCi1tNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKLV9MVF9QUk9HX0VDSE9fQkFDS1NMQVNICi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeDMqKQotICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0gICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLSAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gICAgQ09MTEVDVF9OQU1FUz0KLSAgICBleHBvcnQgQ09MTEVDVF9OQU1FUwotICBmaQotICA7OwotZXNhYwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotc2VkX3F1b3RlX3N1YnN0PSdzL1woW1siYCRcXF1dXCkvXFxcMS9nJwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KLWRvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtbImBcXF1dXCkvXFxcMS9nJwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQotIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgotZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZS4KLWRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdD0ncy8nXCcnLydcJ1xcXFxcXFwnXCcnL2cnCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucwotbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLW9maWxlPWxpYnRvb2wKLWNhbl9idWlsZF9zaGFyZWQ9eWVzCi0KLSMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAotIyB3aGljaCBuZWVkcyAnLmxpYicpLgotbGliZXh0PWEKLQotd2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKLQotb2xkX0NDPSIkQ0MiCi1vbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgotCi0jIFNldCBzYW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzIHZhcmlhYmxlcwotdGVzdCAteiAiJENDIiAmJiBDQz1jYwotdGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCi10ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKLXRlc3QgLXogIiRMRCIgJiYgTEQ9bGQKLXRlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCi0KLV9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLQotIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0Ci10ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQotY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLWZpbGVfbWFnaWMqKQotICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCi0gICAgX0xUX1BBVEhfTUFHSUMKLSAgZmkKLSAgOzsKLWVzYWMKLQotIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKLUxUX1NVUFBPUlRFRF9UQUcoW0NDXSkKLV9MVF9MQU5HX0NfQ09ORklHCi1fTFRfTEFOR19ERUZBVUxUX0NPTkZJRwotX0xUX0NPTkZJR19DT01NQU5EUwotXSkjIF9MVF9TRVRVUAotCi0KLSMgX0xUX1BST0dfTFRNQUlOCi0jIC0tLS0tLS0tLS0tLS0tLQotIyBOb3RlIHRoYXQgdGhpcyBjb2RlIGlzIGNhbGxlZCBib3RoIGZyb20gYGNvbmZpZ3VyZScsIGFuZCBgY29uZmlnLnN0YXR1cycKLSMgbm93IHRoYXQgd2UgdXNlIEFDX0NPTkZJR19DT01NQU5EUyB0byBnZW5lcmF0ZSBsaWJ0b29sLiAgTm90YWJseSwKLSMgYGNvbmZpZy5zdGF0dXMnIGhhcyBubyB2YWx1ZSBmb3IgYWNfYXV4X2RpciB1bmxlc3Mgd2UgYXJlIHVzaW5nIEF1dG9tYWtlLAotIyBzbyB3ZSBwYXNzIGEgY29weSBhbG9uZyB0byBtYWtlIHN1cmUgaXQgaGFzIGEgc2Vuc2libGUgdmFsdWUgYW55d2F5LgotbTRfZGVmdW4oW19MVF9QUk9HX0xUTUFJTl0sCi1bbTRfaWZkZWYoW0FDX1JFUVVJUkVfQVVYX0ZJTEVdLCBbQUNfUkVRVUlSRV9BVVhfRklMRShbbHRtYWluLnNoXSldKWRubAotX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW2FjX2F1eF9kaXI9JyRhY19hdXhfZGlyJ10pCi1sdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLV0pIyBfTFRfUFJPR19MVE1BSU4KLQotCi0KLSMgU28gdGhhdCB3ZSBjYW4gcmVjcmVhdGUgYSBmdWxsIGxpYnRvb2wgc2NyaXB0IGluY2x1ZGluZyBhZGRpdGlvbmFsCi0jIHRhZ3MsIHdlIGFjY3VtdWxhdGUgdGhlIGNodW5rcyBvZiBjb2RlIHRvIHNlbmQgdG8gQUNfQ09ORklHX0NPTU1BTkRTCi0jIGluIG1hY3JvcyBhbmQgdGhlbiBtYWtlIGEgc2luZ2xlIGNhbGwgYXQgdGhlIGVuZCB1c2luZyB0aGUgYGxpYnRvb2wnCi0jIGxhYmVsLgotCi0KLSMgX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW0lOSVQtQ09NTUFORFNdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFJlZ2lzdGVyIElOSVQtQ09NTUFORFMgdG8gYmUgcGFzc2VkIHRvIEFDX0NPTkZJR19DT01NQU5EUyBsYXRlci4KLW00X2RlZmluZShbX0xUX0NPTkZJR19MSUJUT09MX0lOSVRdLAotW200X2lmdmFsKFskMV0sCi0gICAgICAgICAgW200X2FwcGVuZChbX0xUX09VVFBVVF9MSUJUT09MX0lOSVRdLAotICAgICAgICAgICAgICAgICAgICAgWyQxCi1dKV0pXSkKLQotIyBJbml0aWFsaXplLgotbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVF0pCi0KLQotIyBfTFRfQ09ORklHX0xJQlRPT0woW0NPTU1BTkRTXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFJlZ2lzdGVyIENPTU1BTkRTIHRvIGJlIHBhc3NlZCB0byBBQ19DT05GSUdfQ09NTUFORFMgbGF0ZXIuCi1tNF9kZWZpbmUoW19MVF9DT05GSUdfTElCVE9PTF0sCi1bbTRfaWZ2YWwoWyQxXSwKLSAgICAgICAgICBbbTRfYXBwZW5kKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdLAotICAgICAgICAgICAgICAgICAgICAgWyQxCi1dKV0pXSkKLQotIyBJbml0aWFsaXplLgotbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdKQotCi0KLSMgX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTKFtDT01NQU5EU10sIFtJTklUX0NPTU1BTkRTXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZnVuKFtfTFRfQ09ORklHX1NBVkVfQ09NTUFORFNdLAotW19MVF9DT05GSUdfTElCVE9PTChbJDFdKQotX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoWyQyXSkKLV0pCi0KLQotIyBfTFRfRk9STUFUX0NPTU1FTlQoW0NPTU1FTlRdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBZGQgbGVhZGluZyBjb21tZW50IG1hcmtzIHRvIHRoZSBzdGFydCBvZiBlYWNoIGxpbmUsIGFuZCBhIHRyYWlsaW5nCi0jIGZ1bGwtc3RvcCB0byB0aGUgd2hvbGUgY29tbWVudCBpZiBvbmUgaXMgbm90IHByZXNlbnQgYWxyZWFkeS4KLW00X2RlZmluZShbX0xUX0ZPUk1BVF9DT01NRU5UXSwKLVttNF9pZnZhbChbJDFdLCBbCi1tNF9icGF0c3Vic3QoW200X2JwYXRzdWJzdChbJDFdLCBbXiAqXSwgWyMgXSldLAotICAgICAgICAgICAgICBbWydgJFxdXSwgW1xcXCZdKV1tNF9ibWF0Y2goWyQxXSwgW1shPy5dJF0sIFtdLCBbLl0pCi0pXSkKLQotCi0KLQotCi0jIF9MVF9ERUNMKFtDT05GSUdOQU1FXSwgVkFSTkFNRSwgVkFMVUUsIFtERVNDUklQVElPTl0sIFtJUy1UQUdHRUQ/XSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDT05GSUdOQU1FIGlzIHRoZSBuYW1lIGdpdmVuIHRvIHRoZSB2YWx1ZSBpbiB0aGUgbGlidG9vbCBzY3JpcHQuCi0jIFZBUk5BTUUgaXMgdGhlIChiYXNlKSBuYW1lIHVzZWQgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCi0jIFZBTFVFIG1heSBiZSAwLCAxIG9yIDIgZm9yIGEgY29tcHV0ZWQgcXVvdGUgZXNjYXBlZCB2YWx1ZSBiYXNlZCBvbgotIyBWQVJOQU1FLiAgQW55IG90aGVyIHZhbHVlIHdpbGwgYmUgdXNlZCBkaXJlY3RseS4KLW00X2RlZmluZShbX0xUX0RFQ0xdLAotW2x0X2lmX2FwcGVuZF91bmlxKFtsdF9kZWNsX3Zhcm5hbWVzXSwgWyQyXSwgWywgXSwKLSAgICBbbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbbGlidG9vbF9uYW1lXSwKLQlbbTRfaWZ2YWwoWyQxXSwgWyQxXSwgWyQyXSldKQotICAgIGx0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW3ZhbHVlXSwgWyQzXSkKLSAgICBtNF9pZnZhbChbJDRdLAotCVtsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFtkZXNjcmlwdGlvbl0sIFskNF0pXSkKLSAgICBsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sCi0JW3RhZ2dlZD9dLCBbbTRfaWZ2YWwoWyQ1XSwgW3llc10sIFtub10pXSldKQotXSkKLQotCi0jIF9MVF9UQUdERUNMKFtDT05GSUdOQU1FXSwgVkFSTkFNRSwgVkFMVUUsIFtERVNDUklQVElPTl0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZpbmUoW19MVF9UQUdERUNMXSwgW19MVF9ERUNMKFskMV0sIFskMl0sIFskM10sIFskNF0sIFt5ZXNdKV0pCi0KLQotIyBsdF9kZWNsX3RhZ192YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZpbmUoW2x0X2RlY2xfdGFnX3Zhcm5hbWVzXSwKLVtfbHRfZGVjbF9maWx0ZXIoW3RhZ2dlZD9dLCBbeWVzXSwgJEApXSkKLQotCi0jIF9sdF9kZWNsX2ZpbHRlcihTVUJLRVksIFZBTFVFLCBbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi5dKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbX2x0X2RlY2xfZmlsdGVyXSwKLVttNF9jYXNlKFskI10sCi0gIFswXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjXSldLAotICBbMV0sIFttNF9mYXRhbChbJDA6IHRvbyBmZXcgYXJndW1lbnRzOiAkIzogJDFdKV0sCi0gIFsyXSwgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbJDJdLCBbXSwgbHRfZGVjbF92YXJuYW1lcyldLAotICBbM10sIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgWyQxXSwgWyQyXSwgWyQzXSwgbHRfZGVjbF92YXJuYW1lcyldLAotICBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sICRAKV0pW11kbmwKLV0pCi0KLQotIyBsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzXSwKLVtfbHRfZGVjbF9maWx0ZXIoW3ZhbHVlXSwgWzFdLCAkQCldKQotCi0KLSMgbHRfZGVjbF9kcXVvdGVfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtsdF9kZWNsX2RxdW90ZV92YXJuYW1lc10sCi1bX2x0X2RlY2xfZmlsdGVyKFt2YWx1ZV0sIFsyXSwgJEApXSkKLQotCi0jIGx0X2RlY2xfdmFybmFtZXNfdGFnZ2VkKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbbHRfZGVjbF92YXJuYW1lc190YWdnZWRdLAotW18kMChtNF9xdW90ZShtNF9kZWZhdWx0KFskMV0sIFtbLCBdXSkpLAotICAgICBtNF9xdW90ZShtNF9pZihbJDJdLCBbXSwKLQkJICAgICBtNF9xdW90ZShsdF9kZWNsX3RhZ192YXJuYW1lcyksCi0JCSAgbTRfcXVvdGUobTRfc2hpZnQoJEApKSkpLAotICAgICBtNF9zcGxpdChtNF9ub3JtYWxpemUobTRfcXVvdGUoX0xUX1RBR1MpKSkpXSkKLW00X2RlZmluZShbX2x0X2RlY2xfdmFybmFtZXNfdGFnZ2VkXSwgW2x0X2NvbWJpbmUoWyQxXSwgWyQyXSwgW19dLCAkMyldKQotCi0KLSMgbHRfZGVjbF9hbGxfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtsdF9kZWNsX2FsbF92YXJuYW1lc10sCi1bXyQwKG00X3F1b3RlKG00X2RlZmF1bHQoWyQxXSwgW1ssIF1dKSksCi0gICAgIG00X2lmKFskMl0sIFtdLAotCSAgIG00X3F1b3RlKGx0X2RlY2xfdmFybmFtZXMpLAotCW00X3F1b3RlKG00X3NoaWZ0KCRAKSkpKVtdZG5sCi1dKQotbTRfZGVmaW5lKFtfbHRfZGVjbF9hbGxfdmFybmFtZXNdLAotW2x0X2pvaW4oJEAsIGx0X2RlY2xfdmFybmFtZXNfdGFnZ2VkKFskMV0sCi0JCQlsdF9kZWNsX3RhZ192YXJuYW1lcyhbWywgXV0sIG00X3NoaWZ0KCRAKSkpKWRubAotXSkKLQotCi0jIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkUoW1ZBUk5BTUVdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUXVvdGUgYSB2YXJpYWJsZSB2YWx1ZSwgYW5kIGZvcndhcmQgaXQgdG8gYGNvbmZpZy5zdGF0dXMnIHNvIHRoYXQgaXRzCi0jIGRlY2xhcmF0aW9uIHRoZXJlIHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBpbiBgY29uZmlndXJlJy4gIFZBUk5BTUUKLSMgbXVzdCBoYXZlIGEgc2luZ2xlIHF1b3RlIGRlbGltaXRlZCB2YWx1ZSBmb3IgdGhpcyB0byB3b3JrLgotbTRfZGVmaW5lKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFXSwKLVskMT0nYCRFQ0hPICJYJF1bJDEiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCddKQotCi0KLSMgX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBXZSBkZWxpbWl0IGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcyB3aXRoIHNpbmdsZSBxdW90ZXMsIHNvIHdoZW4KLSMgd2Ugd3JpdGUgdGhlbSB0byBjb25maWcuc3RhdHVzLCB3ZSBoYXZlIHRvIGJlIHN1cmUgdG8gcXVvdGUgYWxsCi0jIGVtYmVkZGVkIHNpbmdsZSBxdW90ZXMgcHJvcGVybHkuICBJbiBjb25maWd1cmUsIHRoaXMgbWFjcm8gZXhwYW5kcwotIyBlYWNoIHZhcmlhYmxlIGRlY2xhcmVkIHdpdGggX0xUX0RFQ0wgKGFuZCBfTFRfVEFHREVDTCkgaW50bzoKLSMKLSMgICAgPHZhcj49J2AkRUNITyAiWCQ8dmFyPiIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJwotbTRfZGVmdW4oW19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OU10sCi1bbTRfZm9yZWFjaChbX2x0X3Zhcl0sIG00X3F1b3RlKGx0X2RlY2xfYWxsX3Zhcm5hbWVzKSwKLSAgICBbbTRfbihbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSRShfbHRfdmFyKV0pXSldKQotCi0KLSMgX0xUX0xJQlRPT0xfVEFHUwotIyAtLS0tLS0tLS0tLS0tLS0tCi0jIE91dHB1dCBjb21tZW50IGFuZCBsaXN0IG9mIHRhZ3Mgc3VwcG9ydGVkIGJ5IHRoZSBzY3JpcHQKLW00X2RlZnVuKFtfTFRfTElCVE9PTF9UQUdTXSwKLVtfTFRfRk9STUFUX0NPTU1FTlQoW1RoZSBuYW1lcyBvZiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdF0pZG5sCi1hdmFpbGFibGVfdGFncz0iX0xUX1RBR1MiZG5sCi1dKQotCi0KLSMgX0xUX0xJQlRPT0xfREVDTEFSRShWQVJOQU1FLCBbVEFHXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRXh0cmFjdCB0aGUgZGljdGlvbmFyeSB2YWx1ZXMgZm9yIFZBUk5BTUUgKG9wdGlvbmFsbHkgd2l0aCBUQUcpIGFuZAotIyBleHBhbmQgdG8gYSBjb21tZW50ZWQgc2hlbGwgdmFyaWFibGUgc2V0dGluZzoKLSMKLSMgICAgIyBTb21lIGNvbW1lbnQgYWJvdXQgd2hhdCBWQVIgaXMgZm9yLgotIyAgICB2aXNpYmxlX25hbWU9JGx0X2ludGVybmFsX25hbWUKLW00X2RlZmluZShbX0xUX0xJQlRPT0xfREVDTEFSRV0sCi1bX0xUX0ZPUk1BVF9DT01NRU5UKG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sCi0JCQkJCSAgIFtkZXNjcmlwdGlvbl0pKSlbXWRubAotbTRfcHVzaGRlZihbX2xpYnRvb2xfbmFtZV0sCi0gICAgbTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwgW2xpYnRvb2xfbmFtZV0pKSlbXWRubAotbTRfY2FzZShtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbdmFsdWVdKSksCi0gICAgWzBdLCBbX2xpYnRvb2xfbmFtZT1bJF0kMV0sCi0gICAgWzFdLCBbX2xpYnRvb2xfbmFtZT0kbHRfW10kMV0sCi0gICAgWzJdLCBbX2xpYnRvb2xfbmFtZT0kbHRfW10kMV0sCi0gICAgW19saWJ0b29sX25hbWU9bHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwgW3ZhbHVlXSldKVtdZG5sCi1tNF9pZnZhbChbJDJdLCBbXyQyXSlbXW00X3BvcGRlZihbX2xpYnRvb2xfbmFtZV0pW11kbmwKLV0pCi0KLQotIyBfTFRfTElCVE9PTF9DT05GSUdfVkFSUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcm9kdWNlIGNvbW1lbnRlZCBkZWNsYXJhdGlvbnMgb2Ygbm9uLXRhZ2dlZCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMKLSMgc3VpdGFibGUgZm9yIGluc2VydGlvbiBpbiB0aGUgTElCVE9PTCBDT05GSUcgc2VjdGlvbiBvZiB0aGUgYGxpYnRvb2wnCi0jIHNjcmlwdC4gIFRhZ2dlZCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMgKGV2ZW4gZm9yIHRoZSBMSUJUT09MIENPTkZJRwotIyBzZWN0aW9uKSBhcmUgcHJvZHVjZWQgYnkgX0xUX0xJQlRPT0xfVEFHX1ZBUlMuCi1tNF9kZWZ1bihbX0xUX0xJQlRPT0xfQ09ORklHX1ZBUlNdLAotW200X2ZvcmVhY2goW19sdF92YXJdLAotICAgIG00X3F1b3RlKF9sdF9kZWNsX2ZpbHRlcihbdGFnZ2VkP10sIFtub10sIFtdLCBsdF9kZWNsX3Zhcm5hbWVzKSksCi0gICAgW200X24oW19MVF9MSUJUT09MX0RFQ0xBUkUoX2x0X3ZhcildKV0pXSkKLQotCi0jIF9MVF9MSUJUT09MX1RBR19WQVJTKFRBRykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtfTFRfTElCVE9PTF9UQUdfVkFSU10sCi1bbTRfZm9yZWFjaChbX2x0X3Zhcl0sIG00X3F1b3RlKGx0X2RlY2xfdGFnX3Zhcm5hbWVzKSwKLSAgICBbbTRfbihbX0xUX0xJQlRPT0xfREVDTEFSRShfbHRfdmFyLCBbJDFdKV0pXSldKQotCi0KLSMgX0xUX1RBR1ZBUihWQVJOQU1FLCBbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtfTFRfVEFHVkFSXSwgW200X2lmdmFsKFskMl0sIFskMV8kMl0sIFskMV0pXSkKLQotCi0jIF9MVF9DT05GSUdfQ09NTUFORFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZW5kIGFjY3VtdWxhdGVkIG91dHB1dCB0byAkQ09ORklHX1NUQVRVUy4gIFRoYW5rcyB0byB0aGUgbGlzdHMgb2YKLSMgdmFyaWFibGVzIGZvciBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZSBlc2NhcGluZyB3ZSBzYXZlZCBmcm9tIGNhbGxzCi0jIHRvIF9MVF9ERUNMLCB3ZSBjYW4gcHV0IHF1b3RlIGVzY2FwZWQgdmFyaWFibGVzIGRlY2xhcmF0aW9ucwotIyBpbnRvIGBjb25maWcuc3RhdHVzJywgYW5kIHRoZW4gdGhlIHNoZWxsIGNvZGUgdG8gcXVvdGUgZXNjYXBlIHRoZW0gaW4KLSMgZm9yIGxvb3BzIGluIGBjb25maWcuc3RhdHVzJy4gIEZpbmFsbHksIGFueSBhZGRpdGlvbmFsIGNvZGUgYWNjdW11bGF0ZWQKLSMgZnJvbSBjYWxscyB0byBfTFRfQ09ORklHX0xJQlRPT0xfSU5JVCBpcyBleHBhbmRlZC4KLW00X2RlZnVuKFtfTFRfQ09ORklHX0NPTU1BTkRTXSwKLVtBQ19QUk9WSURFX0lGRUxTRShbTFRfT1VUUFVUXSwKLQlkbmwgSWYgdGhlIGxpYnRvb2wgZ2VuZXJhdGlvbiBjb2RlIGhhcyBiZWVuIHBsYWNlZCBpbiAkQ09ORklHX0xULAotCWRubCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGl0IGFsbCBvdmVyIGFnYWluIGludG8gY29uZmlnLnN0YXR1cywKLQlkbmwgdGhlbiB3ZSB3aWxsIGhhdmUgY29uZmlnLnN0YXR1cyBydW4gJENPTkZJR19MVCBsYXRlciwgc28gaXQKLQlkbmwgbmVlZHMgdG8ga25vdyB3aGF0IG5hbWUgaXMgc3RvcmVkIHRoZXJlOgotICAgICAgICBbQUNfQ09ORklHX0NPTU1BTkRTKFtsaWJ0b29sXSwKLSAgICAgICAgICAgIFskU0hFTEwgJENPTkZJR19MVCB8fCBBU19FWElUKDEpXSwgW0NPTkZJR19MVD0nJENPTkZJR19MVCddKV0sCi0gICAgZG5sIElmIHRoZSBsaWJ0b29sIGdlbmVyYXRpb24gY29kZSBpcyBkZXN0aW5lZCBmb3IgY29uZmlnLnN0YXR1cywKLSAgICBkbmwgZXhwYW5kIHRoZSBhY2N1bXVsYXRlZCBjb21tYW5kcyBhbmQgaW5pdCBjb2RlIG5vdzoKLSAgICBbQUNfQ09ORklHX0NPTU1BTkRTKFtsaWJ0b29sXSwKLSAgICAgICAgW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10sIFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNfSU5JVF0pXSkKLV0pI19MVF9DT05GSUdfQ09NTUFORFMKLQotCi0jIEluaXRpYWxpemUuCi1tNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUXSwKLVsKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwotZG91YmxlX3F1b3RlX3N1YnN0PSckZG91YmxlX3F1b3RlX3N1YnN0JwotZGVsYXlfdmFyaWFibGVfc3Vic3Q9JyRkZWxheV92YXJpYWJsZV9zdWJzdCcKLV9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OUwotTFRDQz0nJExUQ0MnCi1MVENGTEFHUz0nJExUQ0ZMQUdTJwotY29tcGlsZXI9JyRjb21waWxlcl9ERUZBVUxUJwotCi0jIFF1b3RlIGV2YWxlZCBzdHJpbmdzLgotZm9yIHZhciBpbiBsdF9kZWNsX2FsbF92YXJuYW1lcyhbWyBcCi1dXSwgbHRfZGVjbF9xdW90ZV92YXJuYW1lcyk7IGRvCi0gICAgY2FzZSBcYGV2YWwgXFxcXFwkRUNITyAiWFxcXFxcJFwkdmFyIlxgIGluCi0gICAgKltbXFxcXFxcXGBcXCJcXFwkXV0qKQotICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJYXFxcJFwkdmFyXFwiIHwgXFxcJFhzZWQgLWUgXFwiXFxcJHNlZF9xdW90ZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgotICAgICAgOzsKLSAgICAqKQotICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotZm9yIHZhciBpbiBsdF9kZWNsX2FsbF92YXJuYW1lcyhbWyBcCi1dXSwgbHRfZGVjbF9kcXVvdGVfdmFybmFtZXMpOyBkbwotICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gIlhcXFxcXCRcJHZhciJcYCBpbgotICAgICpbW1xcXFxcXFxgXFwiXFxcJF1dKikKLSAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiWFxcXCRcJHZhclxcIiB8IFxcXCRYc2VkIC1lIFxcIlxcXCRkb3VibGVfcXVvdGVfc3Vic3RcXCIgLWUgXFwiXFxcJHNlZF9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkZGVsYXlfdmFyaWFibGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgotICAgICAgOzsKLSAgICBlc2FjCi1kb25lCi0KLSMgRml4LXVwIGZhbGxiYWNrIGVjaG8gaWYgaXQgd2FzIG1hbmdsZWQgYnkgdGhlIGFib3ZlIHF1b3RpbmcgcnVsZXMuCi1jYXNlIFwkbHRfRUNITyBpbgotKidcXFxbJF0wIC0tZmFsbGJhY2stZWNobyInKWRubCAiCi0gIGx0X0VDSE89XGBcJEVDSE8gIlhcJGx0X0VDSE8iIHwgXCRYc2VkIC1lICdzL1xcXFxcXFxcXFxcXFxcXFskXTAgLS1mYWxsYmFjay1lY2hvIlxbJF0vXFskXTAgLS1mYWxsYmFjay1lY2hvIi8nXGAKLSAgOzsKLWVzYWMKLQotX0xUX09VVFBVVF9MSUJUT09MX0lOSVQKLV0pCi0KLQotIyBMVF9PVVRQVVQKLSMgLS0tLS0tLS0tCi0jIFRoaXMgbWFjcm8gYWxsb3dzIGVhcmx5IGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0IChiZWZvcmUKLSMgQUNfT1VUUFVUIGlzIGNhbGxlZCksIGluY2FzZSBpdCBpcyB1c2VkIGluIGNvbmZpZ3VyZSBmb3IgY29tcGlsYXRpb24KLSMgdGVzdHMuCi1BQ19ERUZVTihbTFRfT1VUUFVUXSwKLVs6ICR7Q09ORklHX0xUPS4vY29uZmlnLmx0fQotQUNfTVNHX05PVElDRShbY3JlYXRpbmcgJENPTkZJR19MVF0pCi1jYXQgPiIkQ09ORklHX0xUIiA8PF9MVEVPRgotIyEgJFNIRUxMCi0jIEdlbmVyYXRlZCBieSAkYXNfbWUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgYSBsaWJ0b29sIHN0dWIgd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCi1sdF9jbF9zaWxlbnQ9ZmFsc2UKLVNIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9Ci1fTFRFT0YKLQotY2F0ID4+IiRDT05GSUdfTFQiIDw8XF9MVEVPRgotQVNfU0hFTExfU0FOSVRJWkUKLV9BU19QUkVQQVJFCi0KLWV4ZWMgQVNfTUVTU0FHRV9GRD4mMQotZXhlYyBBU19NRVNTQUdFX0xPR19GRD4+Y29uZmlnLmxvZwotewotICBlY2hvCi0gIEFTX0JPWChbUnVubmluZyAkYXNfbWUuXSkKLX0gPiZBU19NRVNTQUdFX0xPR19GRAotCi1sdF9jbF9oZWxwPSJcCi1cYCRhc19tZScgY3JlYXRlcyBhIGxvY2FsIGxpYnRvb2wgc3R1YiBmcm9tIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24sCi1mb3IgdXNlIGluIGZ1cnRoZXIgY29uZmlndXJlIHRpbWUgdGVzdHMgYmVmb3JlIHRoZSByZWFsIGxpYnRvb2wgaXMKLWdlbmVyYXRlZC4KLQotVXNhZ2U6ICRbMF0gW1tPUFRJT05TXV0KLQotICAtaCwgLS1oZWxwICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKLSAgLVYsIC0tdmVyc2lvbiAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLSAgLXEsIC0tcXVpZXQgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcwotICAtZCwgLS1kZWJ1ZyAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcwotCi1SZXBvcnQgYnVncyB0byA8YnVnLWxpYnRvb2xAZ251Lm9yZz4uIgotCi1sdF9jbF92ZXJzaW9uPSJcCi1tNF9pZnNldChbQUNfUEFDS0FHRV9OQU1FXSwgW0FDX1BBQ0tBR0VfTkFNRSBdKWNvbmZpZy5sdFtdZG5sCi1tNF9pZnNldChbQUNfUEFDS0FHRV9WRVJTSU9OXSwgWyBBQ19QQUNLQUdFX1ZFUlNJT05dKQotY29uZmlndXJlZCBieSAkWzBdLCBnZW5lcmF0ZWQgYnkgbTRfUEFDS0FHRV9TVFJJTkcuCi0KLUNvcHlyaWdodCAoQykgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLVRoaXMgY29uZmlnLmx0IHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCi0KLXdoaWxlIHRlc3QgJFsjXSAhPSAwCi1kbwotICBjYXNlICRbMV0gaW4KLSAgICAtLXZlcnNpb24gfCAtLXYqIHwgLVYgKQotICAgICAgZWNobyAiJGx0X2NsX3ZlcnNpb24iOyBleGl0IDAgOzsKLSAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQotICAgICAgZWNobyAiJGx0X2NsX2hlbHAiOyBleGl0IDAgOzsKLSAgICAtLWRlYnVnIHwgLS1kKiB8IC1kICkKLSAgICAgIGRlYnVnPTogOzsKLSAgICAtLXF1aWV0IHwgLS1xKiB8IC0tc2lsZW50IHwgLS1zKiB8IC1xICkKLSAgICAgIGx0X2NsX3NpbGVudD06IDs7Ci0KLSAgICAtKikgQUNfTVNHX0VSUk9SKFt1bnJlY29nbml6ZWQgb3B0aW9uOiAkWzFdCi1UcnkgXGAkWzBdIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXSkgOzsKLQotICAgICopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIGFyZ3VtZW50OiAkWzFdCi1UcnkgXGAkWzBdIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXSkgOzsKLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1pZiAkbHRfY2xfc2lsZW50OyB0aGVuCi0gIGV4ZWMgQVNfTUVTU0FHRV9GRD4vZGV2L251bGwKLWZpCi1fTFRFT0YKLQotY2F0ID4+IiRDT05GSUdfTFQiIDw8X0xURU9GCi1fTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNfSU5JVAotX0xURU9GCi0KLWNhdCA+PiIkQ09ORklHX0xUIiA8PFxfTFRFT0YKLUFDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRvZmlsZV0pCi1fTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFMKLUFTX0VYSVQoMCkKLV9MVEVPRgotY2htb2QgK3ggIiRDT05GSUdfTFQiCi0KLSMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYnV0IGNvbmZpZy5sdCBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sCi0jIGFwcGVuZGluZyB0byBjb25maWcubG9nLCB3aGljaCBmYWlscyBvbiBET1MsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdAotIyBvcGVuIGJ5IGNvbmZpZ3VyZS4gIEhlcmUgd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLCBlZmZlY3RpdmVseSBjbG9zaW5nCi0jIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZCBhcHBlbmRlZCB0byBieSBjb25maWcubHQuCi1pZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KLSAgbHRfY2xfc3VjY2Vzcz06Ci0gIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCi0gICAgbHRfY29uZmlnX2x0X2FyZ3M9IiRsdF9jb25maWdfbHRfYXJncyAtLXF1aWV0IgotICBleGVjIEFTX01FU1NBR0VfTE9HX0ZEPi9kZXYvbnVsbAotICAkU0hFTEwgIiRDT05GSUdfTFQiICRsdF9jb25maWdfbHRfYXJncyB8fCBsdF9jbF9zdWNjZXNzPWZhbHNlCi0gIGV4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKLSAgJGx0X2NsX3N1Y2Nlc3MgfHwgQVNfRVhJVCgxKQotZmkKLV0pIyBMVF9PVVRQVVQKLQotCi0jIF9MVF9DT05GSUcoVEFHKQotIyAtLS0tLS0tLS0tLS0tLS0KLSMgSWYgVEFHIGlzIHRoZSBidWlsdC1pbiB0YWcsIGNyZWF0ZSBhbiBpbml0aWFsIGxpYnRvb2wgc2NyaXB0IHdpdGggYQotIyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdW50YWdnZWQgY29uZmlnIHZhcnMuICBPdGhlcndpc2UgYWRkIGNvZGUKLSMgdG8gY29uZmlnLnN0YXR1cyBmb3IgYXBwZW5kaW5nIHRoZSBjb25maWd1cmF0aW9uIG5hbWVkIGJ5IFRBRyBmcm9tIHRoZQotIyBtYXRjaGluZyB0YWdnZWQgY29uZmlnIHZhcnMuCi1tNF9kZWZ1bihbX0xUX0NPTkZJR10sCi1bbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCi1fTFRfQ09ORklHX1NBVkVfQ09NTUFORFMoWwotICBtNF9kZWZpbmUoW19MVF9UQUddLCBtNF9pZihbJDFdLCBbXSwgW0NdLCBbJDFdKSlkbmwKLSAgbTRfaWYoX0xUX1RBRywgW0NdLCBbCi0gICAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91cgotICAgICMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgotICAgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCi0gICAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotICAgIGZpCi0KLSAgICBjZmdmaWxlPSIke29maWxlfVQiCi0gICAgdHJhcCAiJFJNIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKLSAgICAkUk0gIiRjZmdmaWxlIgotCi0gICAgY2F0IDw8X0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCi0jISAkU0hFTEwKLQotIyBgJEVDSE8gIiRvZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJGFzX21lICgkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCi0jIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0bWFpbi5zaC4KLSMKLV9MVF9DT1BZSU5HCi1fTFRfTElCVE9PTF9UQUdTCi0KLSMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCi1fTFRfTElCVE9PTF9DT05GSUdfVkFSUwotX0xUX0xJQlRPT0xfVEFHX1ZBUlMKLSMgIyMjIEVORCBMSUJUT09MIENPTkZJRwotCi1fTFRfRU9GCi0KLSAgY2FzZSAkaG9zdF9vcyBpbgotICBhaXgzKikKLSAgICBjYXQgPDxcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCi0jIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcwotIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCi0gIENPTExFQ1RfTkFNRVM9Ci0gIGV4cG9ydCBDT0xMRUNUX05BTUVTCi1maQotX0xUX0VPRgotICAgIDs7Ci0gIGVzYWMKLQotICBfTFRfUFJPR19MVE1BSU4KLQotICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKLSAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgotICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQotICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPwotICBzZWQgJy9eIyBHZW5lcmF0ZWQgc2hlbGwgZnVuY3Rpb25zIGluc2VydGVkIGhlcmUvcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgXAotICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCi0KLSAgX0xUX1BST0dfWFNJX1NIRUxMRk5TCi0KLSAgc2VkIC1uICcvXiMgR2VuZXJhdGVkIHNoZWxsIGZ1bmN0aW9ucyBpbnNlcnRlZCBoZXJlLywkcCcgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgXAotICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCi0KLSAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fAotICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCi0gIGNobW9kICt4ICIkb2ZpbGUiCi1dLAotW2NhdCA8PF9MVF9FT0YgPj4gIiRvZmlsZSIKLQotZG5sIFVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0byB1c2UgJDEgaGVyZSwgc2luY2UgX0xUX1RBRyBpcyBub3QgZXhwYW5kZWQKLWRubCBpbiBhIGNvbW1lbnQgKGllIGFmdGVyIGEgIykuCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICQxCi1fTFRfTElCVE9PTF9UQUdfVkFSUyhfTFRfVEFHKQotIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJDEKLV9MVF9FT0YKLV0pZG5sIC9tNF9pZgotXSwKLVttNF9pZihbJDFdLCBbXSwgWwotICAgIFBBQ0tBR0U9JyRQQUNLQUdFJwotICAgIFZFUlNJT049JyRWRVJTSU9OJwotICAgIFRJTUVTVEFNUD0nJFRJTUVTVEFNUCcKLSAgICBSTT0nJFJNJwotICAgIG9maWxlPSckb2ZpbGUnXSwgW10pCi1dKWRubCAvX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTCi1dKSMgX0xUX0NPTkZJRwotCi0KLSMgTFRfU1VQUE9SVEVEX1RBRyhUQUcpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUcmFjZSB0aGlzIG1hY3JvIHRvIGRpc2NvdmVyIHdoYXQgdGFncyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBsaWJ0b29sCi0jIC0tdGFnIG9wdGlvbiwgdXNpbmc6Ci0jICAgIGF1dG9jb25mIC0tdHJhY2UgJ0xUX1NVUFBPUlRFRF9UQUc6JDEnCi1BQ19ERUZVTihbTFRfU1VQUE9SVEVEX1RBR10sIFtdKQotCi0KLSMgQyBzdXBwb3J0IGlzIGJ1aWx0LWluIGZvciBub3cKLW00X2RlZmluZShbX0xUX0xBTkdfQ19lbmFibGVkXSwgW10pCi1tNF9kZWZpbmUoW19MVF9UQUdTXSwgW10pCi0KLQotIyBMVF9MQU5HKExBTkcpCi0jIC0tLS0tLS0tLS0tLS0KLSMgRW5hYmxlIGxpYnRvb2wgc3VwcG9ydCBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQuCi1BQ19ERUZVTihbTFRfTEFOR10sCi1bQUNfQkVGT1JFKFskMF0sIFtMVF9PVVRQVVRdKWRubAotbTRfY2FzZShbJDFdLAotICBbQ10sCQkJW19MVF9MQU5HKEMpXSwKLSAgW0MrK10sCQlbX0xUX0xBTkcoQ1hYKV0sCi0gIFtKYXZhXSwJCVtfTFRfTEFORyhHQ0opXSwKLSAgW0ZvcnRyYW4gNzddLAkJW19MVF9MQU5HKEY3NyldLAotICBbRm9ydHJhbl0sCQlbX0xUX0xBTkcoRkMpXSwKLSAgW1dpbmRvd3MgUmVzb3VyY2VdLAlbX0xUX0xBTkcoUkMpXSwKLSAgW200X2lmZGVmKFtfTFRfTEFOR19dJDFbX0NPTkZJR10sCi0gICAgW19MVF9MQU5HKCQxKV0sCi0gICAgW200X2ZhdGFsKFskMDogdW5zdXBwb3J0ZWQgbGFuZ3VhZ2U6ICIkMSJdKV0pXSlkbmwKLV0pIyBMVF9MQU5HCi0KLQotIyBfTFRfTEFORyhMQU5HTkFNRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZ1bihbX0xUX0xBTkddLAotW200X2lmZGVmKFtfTFRfTEFOR19dJDFbX2VuYWJsZWRdLCBbXSwKLSAgW0xUX1NVUFBPUlRFRF9UQUcoWyQxXSlkbmwKLSAgbTRfYXBwZW5kKFtfTFRfVEFHU10sIFskMSBdKWRubAotICBtNF9kZWZpbmUoW19MVF9MQU5HX10kMVtfZW5hYmxlZF0sIFtdKWRubAotICBfTFRfTEFOR18kMV9DT05GSUcoJDEpXSlkbmwKLV0pIyBfTFRfTEFORwotCi0KLSMgX0xUX0xBTkdfREVGQVVMVF9DT05GSUcKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZnVuKFtfTFRfTEFOR19ERUZBVUxUX0NPTkZJR10sCi1bQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKLSAgW0xUX0xBTkcoQ1hYKV0sCi0gIFttNF9kZWZpbmUoW0FDX1BST0dfQ1hYXSwgZGVmbihbQUNfUFJPR19DWFhdKVtMVF9MQU5HKENYWCldKV0pCi0KLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0Y3N10sCi0gIFtMVF9MQU5HKEY3NyldLAotICBbbTRfZGVmaW5lKFtBQ19QUk9HX0Y3N10sIGRlZm4oW0FDX1BST0dfRjc3XSlbTFRfTEFORyhGNzcpXSldKQotCi1BQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GQ10sCi0gIFtMVF9MQU5HKEZDKV0sCi0gIFttNF9kZWZpbmUoW0FDX1BST0dfRkNdLCBkZWZuKFtBQ19QUk9HX0ZDXSlbTFRfTEFORyhGQyldKV0pCi0KLWRubCBUaGUgY2FsbCB0byBbQV1bTV9QUk9HX0dDSl0gaXMgcXVvdGVkIGxpa2UgdGhhdCB0byBzdG9wIGFjbG9jYWwKLWRubCBwdWxsaW5nIHRoaW5ncyBpbiBuZWVkbGVzc2x5LgotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfR0NKXSwKLSAgW0xUX0xBTkcoR0NKKV0sCi0gIFtBQ19QUk9WSURFX0lGRUxTRShbQV1bTV9QUk9HX0dDSl0sCi0gICAgW0xUX0xBTkcoR0NKKV0sCi0gICAgW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9QUk9HX0dDSl0sCi0gICAgICBbTFRfTEFORyhHQ0opXSwKLSAgICAgIFttNF9pZmRlZihbQUNfUFJPR19HQ0pdLAotCVttNF9kZWZpbmUoW0FDX1BST0dfR0NKXSwgZGVmbihbQUNfUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pCi0gICAgICAgbTRfaWZkZWYoW0FdW01fUFJPR19HQ0pdLAotCVttNF9kZWZpbmUoW0FdW01fUFJPR19HQ0pdLCBkZWZuKFtBXVtNX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKQotICAgICAgIG00X2lmZGVmKFtMVF9QUk9HX0dDSl0sCi0JW200X2RlZmluZShbTFRfUFJPR19HQ0pdLCBkZWZuKFtMVF9QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSldKV0pXSkKLQotQUNfUFJPVklERV9JRkVMU0UoW0xUX1BST0dfUkNdLAotICBbTFRfTEFORyhSQyldLAotICBbbTRfZGVmaW5lKFtMVF9QUk9HX1JDXSwgZGVmbihbTFRfUFJPR19SQ10pW0xUX0xBTkcoUkMpXSldKQotXSkjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCi0KLSMgT2Jzb2xldGUgbWFjcm9zOgotQVVfREVGVU4oW0FDX0xJQlRPT0xfQ1hYXSwgW0xUX0xBTkcoQysrKV0pCi1BVV9ERUZVTihbQUNfTElCVE9PTF9GNzddLCBbTFRfTEFORyhGb3J0cmFuIDc3KV0pCi1BVV9ERUZVTihbQUNfTElCVE9PTF9GQ10sIFtMVF9MQU5HKEZvcnRyYW4pXSkKLUFVX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sIFtMVF9MQU5HKEphdmEpXSkKLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQUNfTElCVE9PTF9DWFhdLCBbXSkKLWRubCBBQ19ERUZVTihbQUNfTElCVE9PTF9GNzddLCBbXSkKLWRubCBBQ19ERUZVTihbQUNfTElCVE9PTF9GQ10sIFtdKQotZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sIFtdKQotCi0KLSMgX0xUX1RBR19DT01QSUxFUgotIyAtLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZ1bihbX0xUX1RBR19DT01QSUxFUl0sCi1bQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0KLV9MVF9ERUNMKFtMVENDXSwgW0NDXSwgWzFdLCBbQSBDIGNvbXBpbGVyXSlkbmwKLV9MVF9ERUNMKFtMVENGTEFHU10sIFtDRkxBR1NdLCBbMV0sIFtMVENDIGNvbXBpbGVyIGZsYWdzXSlkbmwKLV9MVF9UQUdERUNMKFtDQ10sIFtjb21waWxlcl0sIFsxXSwgW0EgbGFuZ3VhZ2Ugc3BlY2lmaWMgY29tcGlsZXJdKWRubAotX0xUX1RBR0RFQ0woW3dpdGhfZ2NjXSwgW0dDQ10sIFswXSwgW0lzIHRoZSBjb21waWxlciB0aGUgR05VIGNvbXBpbGVyP10pZG5sCi0KLSMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCi1MVENDPSR7TFRDQy0iJENDIn0KLQotIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgotTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9Ci0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1jb21waWxlcj0kQ0MKLV0pIyBfTFRfVEFHX0NPTVBJTEVSCi0KLQotIyBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIGZvciBjb21waWxlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAotIyB0aGUgc2ltcGxlIGNvbXBpbGVyIHRlc3QgY29kZS4KLW00X2RlZnVuKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdLAotW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCi1hY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKLWVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0Ci1ldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKLV9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRSTSBjb25mdGVzdCoKLV0pIyBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLQotCi0jIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayBmb3IgbGlua2VyIGJvaWxlcnBsYXRlIG91dHB1dCBvciB3YXJuaW5ncyB3aXRoCi0jIHRoZSBzaW1wbGUgbGluayB0ZXN0IGNvZGUuCi1tNF9kZWZ1bihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0sCi1bbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKLWFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAotZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKLWV2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgotX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKLSRSTSAtciBjb25mdGVzdCoKLV0pIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCi0KLSMgX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1MKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW5fb25jZShbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdLFsKLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIHJoYXBzb2R5KiB8IGRhcndpbiopCi0gICAgQUNfQ0hFQ0tfVE9PTChbRFNZTVVUSUxdLCBbZHN5bXV0aWxdLCBbOl0pCi0gICAgQUNfQ0hFQ0tfVE9PTChbTk1FRElUXSwgW25tZWRpdF0sIFs6XSkKLSAgICBBQ19DSEVDS19UT09MKFtMSVBPXSwgW2xpcG9dLCBbOl0pCi0gICAgX0xUX0RFQ0woW10sIFtEU1lNVVRJTF0sIFsxXSwKLSAgICAgIFtUb29sIHRvIG1hbmlwdWxhdGUgYXJjaGl2ZWQgRFdBUkYgZGVidWcgc3ltYm9sIGZpbGVzIG9uIE1hYyBPUyBYXSkKLSAgICBfTFRfREVDTChbXSwgW05NRURJVF0sIFsxXSwKLSAgICAgIFtUb29sIHRvIGNoYW5nZSBnbG9iYWwgdG8gbG9jYWwgc3ltYm9scyBvbiBNYWMgT1MgWF0pCi0gICAgX0xUX0RFQ0woW10sIFtMSVBPXSwgWzFdLAotICAgICAgW1Rvb2wgdG8gbWFuaXB1bGF0ZSBmYXQgb2JqZWN0cyBhbmQgYXJjaGl2ZXMgb24gTWFjIE9TIFhdKQotCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAtc2luZ2xlX21vZHVsZSBsaW5rZXIgZmxhZ10sW2x0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2RdLAotICAgICAgW2x0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2Q9bm8KLSAgICAgIGlmIHRlc3QgLXogIiR7TFRfTVVMVElfTU9EVUxFfSI7IHRoZW4KLQkjIEJ5IGRlZmF1bHQgd2Ugd2lsbCBhZGQgdGhlIC1zaW5nbGVfbW9kdWxlIGZsYWcuIFlvdSBjYW4gb3ZlcnJpZGUKLQkjIGJ5IGVpdGhlciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMVF9NVUxUSV9NT0RVTEUKLQkjIG5vbi1lbXB0eSBhdCBjb25maWd1cmUgdGltZSwgb3IgYnkgYWRkaW5nIC1tdWx0aV9tb2R1bGUgdG8gdGhlCi0JIyBsaW5rIGZsYWdzLgotCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKLQllY2hvICJpbnQgZm9vKHZvaWQpe3JldHVybiAxO30iID4gY29uZnRlc3QuYwotCWVjaG8gIiRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBsaWJjb25mdGVzdC5keWxpYiBcCi0tZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgY29uZnRlc3QuYyIgPiZBU19NRVNTQUdFX0xPR19GRAotCSRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBsaWJjb25mdGVzdC5keWxpYiBcCi0JICAtZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgY29uZnRlc3QuYyAyPmNvbmZ0ZXN0LmVycgotICAgICAgICBfbHRfcmVzdWx0PSQ/Ci0JaWYgdGVzdCAtZiBsaWJjb25mdGVzdC5keWxpYiAmJiB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyICYmIHRlc3QgJF9sdF9yZXN1bHQgPSAwOyB0aGVuCi0JICBsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPXllcwotCWVsc2UKLQkgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAotCWZpCi0Jcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgotCXJtIC1mIGNvbmZ0ZXN0LioKLSAgICAgIGZpXSkKLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWddLAotICAgICAgW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdF0sCi0gICAgICBbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCi0gICAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKLSAgICAgIGVjaG8gIl9tYWluIiA+IGNvbmZ0ZXN0LnN5bQotICAgICAgTERGTEFHUz0iJExERkxBR1MgLVdsLC1leHBvcnRlZF9zeW1ib2xzX2xpc3QsY29uZnRlc3Quc3ltIgotICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSxbXSldLAotCVtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9eWVzXSwKLQlbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vXSkKLQlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotICAgIF0pCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKLSAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKLSAgICBkYXJ3aW4xLiopCi0gICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7Ci0gICAgZGFyd2luKikgIyBkYXJ3aW4gNS54IG9uIAotICAgICAgIyBpZiBydW5uaW5nIG9uIDEwLjUgb3IgbGF0ZXIsIHRoZSBkZXBsb3ltZW50IHRhcmdldCBkZWZhdWx0cwotICAgICAgIyB0byB0aGUgT1MgdmVyc2lvbiwgaWYgb24geDg2LCBhbmQgMTAuNCwgdGhlIGRlcGxveW1lbnQKLSAgICAgICMgdGFyZ2V0IGRlZmF1bHRzIHRvIDEwLjQuIERvbid0IHlvdSBsb3ZlIGl0PyAKLSAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQtMTAuMH0sJGhvc3QgaW4KLQkxMC4wLCo4NiotZGFyd2luOCp8MTAuMCwqLWRhcndpbltbOTFdXSopCi0JICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7Ci0JMTAuW1swMTJdXSopCi0JICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7Ci0JMTAuKikKLQkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKLSAgICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0gICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gInllcyI7IHRoZW4KLSAgICAgIF9sdF9kYXJfc2luZ2xlX21vZD0nJHNpbmdsZV9tb2R1bGUnCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPScgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sc19saXN0LCRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0nCi0gICAgZWxzZQotICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nfiROTUVESVQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkRFNZTVVUSUwiICE9ICI6IjsgdGhlbgotICAgICAgX2x0X2RzeW11dGlsPSd+JERTWU1VVElMICRsaWIgfHwgOicKLSAgICBlbHNlCi0gICAgICBfbHRfZHN5bXV0aWw9Ci0gICAgZmkKLSAgICA7OwotICBlc2FjCi1dKQotCi0KLSMgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2tzIGZvciBsaW5rZXIgYW5kIGNvbXBpbGVyIGZlYXR1cmVzIG9uIGRhcndpbgotbTRfZGVmdW4oW19MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTXSwKLVsKLSAgbTRfcmVxdWlyZShbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdKQotICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICBfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPXllcwotICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAotICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKLSAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0gIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iJF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkIgotICBpZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiOyB0aGVuCi0gICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZWNobwotICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9IlwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICRfbHRfZGFyX3NpbmdsZV9tb2Qke19sdF9kc3ltdXRpbH0iCi0gICAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPSJcJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kc3ltdXRpbH0iCi0gICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJHtfbHRfZGFyX3NpbmdsZV9tb2R9JHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKLSAgICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSJzZWQgLWUgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCi0gICAgbTRfaWYoWyQxXSwgW0NYWF0sCi1bICAgaWYgdGVzdCAiJGx0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2QiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSJcJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZHN5bXV0aWx9IgotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vIFwke2xpYn0tbWFzdGVyLm8gXCRsaWJvYmpzflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJHtsaWJ9LW1hc3Rlci5vIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCi0gICAgZmkKLV0sW10pCi0gIGVsc2UKLSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICBmaQotXSkKLQotIyBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBMaW5rcyBhIG1pbmltYWwgcHJvZ3JhbSBhbmQgY2hlY2tzIHRoZSBleGVjdXRhYmxlCi0jIGZvciB0aGUgc3lzdGVtIGRlZmF1bHQgaGFyZGNvZGVkIGxpYnJhcnkgcGF0aC4gSW4gbW9zdCBjYXNlcywKLSMgdGhpcyBpcyAvdXNyL2xpYjovbGliLCBidXQgd2hlbiB0aGUgTVBJIGNvbXBpbGVycyBhcmUgdXNlZAotIyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbW11bmljYXRpb24gYW5kIE1QSSBsaWJzIGFyZSBpbmNsdWRlZCB0b28uCi0jIElmIHdlIGRvbid0IGZpbmQgYW55dGhpbmcsIHVzZSB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggYWNjb3JkaW5nCi0jIHRvIHRoZSBhaXggbGQgbWFudWFsLgotbTRfZGVmdW4oW19MVF9TWVNfTU9EVUxFX1BBVEhfQUlYXSwKLVttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAotQUNfTElOS19JRkVMU0UoQUNfTEFOR19QUk9HUkFNLFsKLWx0X2FpeF9saWJwYXRoX3NlZD0nCi0gICAgL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8gewotCS9eMC8gewotCSAgICBzL14wICAqXCguKlwpJC9cMS8KLQkgICAgcAotCX0KLSAgICB9JwotYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCi0jIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCi1pZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuCi0gIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAotZmldLFtdKQotaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCi1dKSMgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKLQotCi0jIF9MVF9TSEVMTF9JTklUKEFSRykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtfTFRfU0hFTExfSU5JVF0sCi1baWZkZWYoW0FDX0RJVkVSU0lPTl9OT1RJQ0VdLAotCSAgICAgW0FDX0RJVkVSVF9QVVNIKEFDX0RJVkVSU0lPTl9OT1RJQ0UpXSwKLQkgW0FDX0RJVkVSVF9QVVNIKE5PVElDRSldKQotJDEKLUFDX0RJVkVSVF9QT1AKLV0pIyBfTFRfU0hFTExfSU5JVAotCi0KLSMgX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQWRkIHNvbWUgY29kZSB0byB0aGUgc3RhcnQgb2YgdGhlIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0IHdoaWNoCi0jIHdpbGwgZmluZCBhbiBlY2hvIGNvbW1hbmQgd2hpY2ggZG9lc24ndCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1tNF9kZWZ1bihbX0xUX1BST0dfRUNIT19CQUNLU0xBU0hdLAotW19MVF9TSEVMTF9JTklUKFsKLSMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0KLWNhc2UgWCRsdF9FQ0hPIGluCi1YKi0tZmFsbGJhY2stZWNobykKLSAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KLSAgRUNITz1gZWNobyAiJGx0X0VDSE8iIHwgc2VkICdzLFxcXFxcWyRdXFxbJF0wLCdbJF0wJywnYAotICA7OwotZXNhYwotCi1FQ0hPPSR7bHRfRUNITy1lY2hvfQotaWYgdGVzdCAiWFskXTEiID0gWC0tbm8tcmVleGVjOyB0aGVuCi0gICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICBzaGlmdAotZWxpZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKLSAgOgotZWxpZiB0ZXN0ICJYYHsgJEVDSE8gJ1x0JzsgfSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgOyB0aGVuCi0gICMgWWlwcGVlLCAkRUNITyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi0gIGV4ZWMgJFNIRUxMICJbJF0wIiAtLW5vLXJlZXhlYyAkezErIlskXUAifQotZmkKLQotaWYgdGVzdCAiWFskXTEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgotICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobwotICBzaGlmdAotICBjYXQgPDxfTFRfRU9GCi1bJF0qCi1fTFRfRU9GCi0gIGV4aXQgMAotZmkKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotaWYgdGVzdCAteiAiJGx0X0VDSE8iOyB0aGVuCi0gIGlmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgotICAgICMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAotICAgIGZvciBjbWQgaW4gJ3NlZCA1MHEgIlskXTAiJyAnc2VkIDIwcSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAycSAiWyRdMCInICdlY2hvIHRlc3QnOyBkbwotICAgICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KLSAgICAgIGlmIHsgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkY21kYDsgfSAyPi9kZXYvbnVsbCAmJgotCSB7IHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgfSAyPi9kZXYvbnVsbAotICAgICAgdGhlbgotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0KLSAgaWYgdGVzdCAiWGB7ICRFQ0hPICdcdCc7IH0gMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YHsgJEVDSE8gIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgfSAyPi9kZXYvbnVsbGAgJiYKLSAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgOgotICBlbHNlCi0gICAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCi0gICAgIyBiYWNrc2xhc2hlcy4gIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBxdW90ZSBiYWNrc2xhc2hlcyB1c2luZwotICAgICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCi0gICAgIwotICAgICMgU28sIGZpcnN0IHdlIGxvb2sgZm9yIGEgd29ya2luZyBlY2hvIGluIHRoZSB1c2VyJ3MgUEFUSC4KLQotICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotICAgIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIGlmICh0ZXN0IC1mICRkaXIvZWNobyB8fCB0ZXN0IC1mICRkaXIvZWNobyRhY19leGVleHQpICYmCi0gICAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgotICAgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgICAgIEVDSE89IiRkaXIvZWNobyIKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotCi0gICAgaWYgdGVzdCAiWCRFQ0hPIiA9IFhlY2hvOyB0aGVuCi0gICAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KLSAgICAgIGlmIHRlc3QgIlhgeyBwcmludCAtciAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1geyBwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciOyB9IDI+L2Rldi9udWxsYCAmJgotICAgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCi0gICAgICAgIEVDSE89J3ByaW50IC1yJwotICAgICAgZWxpZiB7IHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQ7IH0gJiYKLQkgICB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCi0gICAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGNvbmZpZ3VyZSBhZ2FpbiB3aXRoIGl0LgotICAgICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSAgICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAotICAgICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKLSAgICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgICBleGVjICRDT05GSUdfU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9Ci0gICAgICBlbHNlCi0gICAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KLSAgICAgICAgRUNITz0ncHJpbnRmICVzXG4nCi0gICAgICAgIGlmIHRlc3QgIlhgeyAkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YHsgJEVDSE8gIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgfSAyPi9kZXYvbnVsbGAgJiYKLQkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQkgICMgQ29vbCwgcHJpbnRmIHdvcmtzCi0JICA6Ci0gICAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKLQkgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgotCSAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKLQkgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCSAgQ09ORklHX1NIRUxMPSRPUklHSU5BTF9DT05GSUdfU0hFTEwKLQkgIGV4cG9ydCBDT05GSUdfU0hFTEwKLQkgIFNIRUxMPSIkQ09ORklHX1NIRUxMIgotCSAgZXhwb3J0IFNIRUxMCi0JICBFQ0hPPSIkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCi0JICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKLQkgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCi0JICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQkgIEVDSE89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICAgIGVsc2UKLQkgICMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCi0JICBwcmV2PToKLQotCSAgZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDIwcSAiWyRdMCInICdzZWQgNTBxICJbJF0wIic7IGRvCi0JICAgIGlmIHsgdGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYYGV2YWwgJGNtZGAiOyB9IDI+L2Rldi9udWxsCi0JICAgIHRoZW4KLQkgICAgICBicmVhawotCSAgICBmaQotCSAgICBwcmV2PSIkY21kIgotCSAgZG9uZQotCi0JICBpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIlskXTAiJzsgdGhlbgotCSAgICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAotCSAgICBleHBvcnQgZWNob190ZXN0X3N0cmluZwotCSAgICBleGVjICR7T1JJR0lOQUxfQ09ORklHX1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fSAiWyRdMCIgJHsxKyJbJF1AIn0KLQkgIGVsc2UKLQkgICAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KLQkgICAgRUNITz1lY2hvCi0JICBmaQotICAgICAgICBmaQotICAgICAgZmkKLSAgICBmaQotICBmaQotZmkKLQotIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5IHN1aXRhYmx5IGZvciBwYXNzaW5nIHRvIGxpYnRvb2wgZnJvbQotIyB0aGUgTWFrZWZpbGUsIGluc3RlYWQgb2YgcXVvdGluZyB0aGUgb3JpZ2luYWwsIHdoaWNoIGlzIHVzZWQgbGF0ZXIuCi1sdF9FQ0hPPSRFQ0hPCi1pZiB0ZXN0ICJYJGx0X0VDSE8iID0gIlgkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotICAgbHRfRUNITz0iJENPTkZJR19TSEVMTCBcXFwkXFskXTAgLS1mYWxsYmFjay1lY2hvIgotZmkKLQotQUNfU1VCU1QobHRfRUNITykKLV0pCi1fTFRfREVDTChbXSwgW1NIRUxMXSwgWzFdLCBbU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0c10pCi1fTFRfREVDTChbXSwgW0VDSE9dLCBbMV0sCi0gICAgW0FuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlc10pCi1dKSMgX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKLQotCi0jIF9MVF9FTkFCTEVfTE9DSwotIyAtLS0tLS0tLS0tLS0tLS0KLW00X2RlZnVuKFtfTFRfRU5BQkxFX0xPQ0tdLAotW0FDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCi0gIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWxpYnRvb2wtbG9ja10sCi0gICAgW2F2b2lkIGxvY2tpbmcgKG1pZ2h0IGJyZWFrIHBhcmFsbGVsIGJ1aWxkcyldKV0pCi10ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcwotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAkaG9zdCBpbgotaWE2NC0qLWhwdXgqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgotICAgICAgKkVMRi0zMiopCi0JSFBVWF9JQTY0X01PREU9IjMyIgotCTs7Ci0gICAgICAqRUxGLTY0KikKLQlIUFVYX0lBNjRfTU9ERT0iNjQiCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLQkqMzItYml0KikKLQkgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCi0JICA7OwotCSpOMzIqKQotCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgotCSAgOzsKLQkqNjQtYml0KikKLQkgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKLQk7OwotICAgICAgZXNhYwotICAgIGVsc2UKLSAgICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KLQkqMzItYml0KikKLQkgIExEPSIke0xELWxkfSAtMzIiCi0JICA7OwotCSpOMzIqKQotCSAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0JICA7OwotCSo2NC1iaXQqKQotCSAgTEQ9IiR7TEQtbGR9IC02NCIKLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi14ODZfNjQtKmtmcmVlYnNkKi1nbnV8eDg2XzY0LSpsaW51eCp8cHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCp8IFwKLXMzOTAqLSpsaW51eCp8czM5MCotKnRwZip8c3BhcmMqLSpsaW51eCopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCi0gICAgICAqMzItYml0KikKLQljYXNlICRob3N0IGluCi0JICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCi0JICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4Nl9mYnNkIgotCSAgICA7OwotCSAgeDg2XzY0LSpsaW51eCopCi0JICAgIExEPSIke0xELWxkfSAtbSBlbGZfaTM4NiIKLQkgICAgOzsKLQkgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCi0JICAgIExEPSIke0xELWxkfSAtbSBlbGYzMnBwY2xpbnV4IgotCSAgICA7OwotCSAgczM5MHgtKmxpbnV4KikKLQkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9zMzkwIgotCSAgICA7OwotCSAgc3BhcmM2NC0qbGludXgqKQotCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJfc3BhcmMiCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICAqNjQtYml0KikKLQljYXNlICRob3N0IGluCi0JICB4ODZfNjQtKmtmcmVlYnNkKi1nbnUpCi0JICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0X2Zic2QiCi0JICAgIDs7Ci0JICB4ODZfNjQtKmxpbnV4KikKLQkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCi0JICAgIDs7Ci0JICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKLQkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgotCSAgICA7OwotCSAgczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKikKLQkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCi0JICAgIDs7Ci0JICBzcGFyYyotKmxpbnV4KikKLQkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgotCSAgICA7OwotCWVzYWMKLQk7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfTEFOR19QVVNIKEMpCi0gICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSxbW11dKV0sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pCi0gICAgIEFDX0xBTkdfUE9QXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLXNwYXJjKi0qc29sYXJpcyopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCi0gICAgKjY0LWJpdCopCi0gICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgotICAgICAgeWVzKikgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIiA7OwotICAgICAgKikKLQlpZiAke0xELWxkfSAtNjQgLXIgLW8gY29uZnRlc3QyLm8gY29uZnRlc3QubyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIExEPSIke0xELWxkfSAtNjQiCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLWVzYWMKLQotbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi1dKSMgX0xUX0VOQUJMRV9MT0NLCi0KLQotIyBfTFRfQ01EX09MRF9BUkNISVZFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZnVuKFtfTFRfQ01EX09MRF9BUkNISVZFXSwKLVtBQ19DSEVDS19UT09MKEFSLCBhciwgZmFsc2UpCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi10ZXN0IC16ICIkQVJfRkxBR1MiICYmIEFSX0ZMQUdTPWNydQotX0xUX0RFQ0woW10sIFtBUl0sIFsxXSwgW1RoZSBhcmNoaXZlcl0pCi1fTFRfREVDTChbXSwgW0FSX0ZMQUdTXSwgWzFdKQotCi1BQ19DSEVDS19UT09MKFNUUklQLCBzdHJpcCwgOikKLXRlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgotX0xUX0RFQ0woW10sIFtTVFJJUF0sIFsxXSwgW0Egc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtXSkKLQotQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKLXRlc3QgLXogIiRSQU5MSUIiICYmIFJBTkxJQj06Ci1fTFRfREVDTChbXSwgW1JBTkxJQl0sIFsxXSwKLSAgICBbQ29tbWFuZHMgdXNlZCB0byBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKLQotIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCi1vbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcycKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9Ci0KLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgb3BlbmJzZCopCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiAtdCBcJG9sZGxpYiIKLSAgICA7OwotICAqKQotICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCi0gICAgOzsKLSAgZXNhYwotICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKLWZpCi1fTFRfREVDTChbXSwgW29sZF9wb3N0aW5zdGFsbF9jbWRzXSwgWzJdKQotX0xUX0RFQ0woW10sIFtvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXSwgWzJdKQotX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9jbWRzXSwgWzJdLAotICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuIG9sZC1zdHlsZSBhcmNoaXZlXSkKLV0pIyBfTFRfQ01EX09MRF9BUkNISVZFCi0KLQotIyBfTFRfQ09NUElMRVJfT1BUSU9OKE1FU1NBR0UsIFZBUklBQkxFLU5BTUUsIEZMQUdTLAotIwkJW09VVFBVVC1GSUxFXSwgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb21waWxlciBvcHRpb24gd29ya3MKLUFDX0RFRlVOKFtfTFRfQ09NUElMRVJfT1BUSU9OXSwKLVttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKLW00X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCi1BQ19DQUNIRV9DSEVDSyhbJDFdLCBbJDJdLAotICBbJDI9bm8KLSAgIG00X2lmKFskNF0sICwgW2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dF0sIFthY19vdXRmaWxlPSQ0XSkKLSAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotICAgbHRfY29tcGlsZXJfZmxhZz0iJDMiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgotICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCi0gICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCi0gICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKLSAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCi0gICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQotICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KLSAgICAgJEVDSE8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKLSAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgICQyPXllcwotICAgICBmaQotICAgZmkKLSAgICRSTSBjb25mdGVzdCoKLV0pCi0KLWlmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCi0gICAgbTRfaWYoWyQ1XSwgLCA6LCBbJDVdKQotZWxzZQotICAgIG00X2lmKFskNl0sICwgOiwgWyQ2XSkKLWZpCi1dKSMgX0xUX0NPTVBJTEVSX09QVElPTgotCi0jIE9sZCBuYW1lOgotQVVfQUxJQVMoW0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OXSwgW19MVF9DT01QSUxFUl9PUFRJT05dKQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTl0sIFtdKQotCi0KLSMgX0xUX0xJTktFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCi0jICAgICAgICAgICAgICAgICAgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBsaW5rZXIgb3B0aW9uIHdvcmtzCi1BQ19ERUZVTihbX0xUX0xJTktFUl9PUFRJT05dLAotW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAotbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKLUFDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCi0gIFskMj1ubwotICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgIExERkxBR1M9IiRMREZMQUdTICQzIgotICAgZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0gICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiZBU19NRVNTQUdFX0xPR19GRAotICAgICAgICRFQ0hPICJYJF9sdF9saW5rZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IGNvbmZ0ZXN0LmV4cAotICAgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgotICAgICAgIGlmIGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgICAkMj15ZXMKLSAgICAgICBmaQotICAgICBlbHNlCi0gICAgICAgJDI9eWVzCi0gICAgIGZpCi0gICBmaQotICAgJFJNIC1yIGNvbmZ0ZXN0KgotICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLV0pCi0KLWlmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCi0gICAgbTRfaWYoWyQ0XSwgLCA6LCBbJDRdKQotZWxzZQotICAgIG00X2lmKFskNV0sICwgOiwgWyQ1XSkKLWZpCi1dKSMgX0xUX0xJTktFUl9PUFRJT04KLQotIyBPbGQgbmFtZToKLUFVX0FMSUFTKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbX0xUX0xJTktFUl9PUFRJT05dKQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLCBbXSkKLQotCi0jIExUX0NNRF9NQVhfTEVOCi0jLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbTFRfQ01EX01BWF9MRU5dLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLSMgZmluZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotQUNfTVNHX0NIRUNLSU5HKFt0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50c10pCi1BQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19tYXhfY21kX2xlbl0sIFtkbmwKLSAgaT0wCi0gIHRlc3RzdHJpbmc9IkFCQ0QiCi0KLSAgY2FzZSAkYnVpbGRfb3MgaW4KLSAgbXNkb3NkamdwcCopCi0gICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYwotICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KLSAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcwotICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKLSAgICA7OwotCi0gIGdudSopCi0gICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCi0gICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7Ci0gICAgOzsKLQotICBjeWd3aW4qIHwgbWluZ3cqKQotICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCi0gICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KLSAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAotICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKLSAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCi0gICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5Ci0gICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKLSAgICA7OwotCi0gIGFtaWdhb3MqKQotICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KLSAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOwotICAgIDs7Ci0KLSAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKLSAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KLSAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCi0gICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKLSAgICBlbHNlCi0gICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKLSAgICBmaQotICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAotICAgIDs7Ci0KLSAgaW50ZXJpeCopCi0gICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAotICAgIDs7Ci0KLSAgb3NmKikKLSAgICAjIERyLiBIYW5zIEVra2VoYXJkIFBsZXNzZXIgcmVwb3J0cyBzZWVpbmcgYSBrZXJuZWwgcGFuaWMgcnVubmluZyBjb25maWd1cmUKLSAgICAjIGR1ZSB0byB0aGlzIHRlc3Qgd2hlbiBleGVjX2Rpc2FibGVfYXJnX2xpbWl0IGlzIDEgb24gVHJ1NjQuIEl0IGlzIG5vdAotICAgICMgbmljZSB0byBjYXVzZSBrZXJuZWwgcGFuaWNzIHNvIGxldHMgYXZvaWQgdGhlIGxvb3AgYmVsb3cuCi0gICAgIyBGaXJzdCBzZXQgYSByZWFzb25hYmxlIGRlZmF1bHQuCi0gICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE2Mzg0Ci0gICAgIwotICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY29uZmlnOyB0aGVuCi0gICAgICBjYXNlIGAvc2Jpbi9zeXNjb25maWcgLXEgcHJvYyBleGVjX2Rpc2FibGVfYXJnX2xpbWl0YCBpbgotICAgICAgICAqMSopIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMSA7OwotICAgICAgZXNhYwotICAgIGZpCi0gICAgOzsKLSAgc2NvMy4ydjUqKQotICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMDI0MDAKLSAgICA7OwotICBzeXN2NSogfCBzY281djYqIHwgc3lzdjQuMnV3MiopCi0gICAga2FyZ21heD1gZ3JlcCBBUkdfTUFYIC9ldGMvY29uZi9jZi5kL3N0dW5lIDI+L2Rldi9udWxsYAotICAgIGlmIHRlc3QgLW4gIiRrYXJnbWF4IjsgdGhlbgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBlY2hvICRrYXJnbWF4IHwgc2VkICdzLy4qW1sJIF1dLy8nYAotICAgIGVsc2UKLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0zMjc2OAotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YChnZXRjb25mIEFSR19NQVgpIDI+IC9kZXYvbnVsbGAKLSAgICBpZiB0ZXN0IC1uICIkbHRfY3Zfc3lzX21heF9jbWRfbGVuIjsgdGhlbgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCi0gICAgZWxzZQotICAgICAgIyBNYWtlIHRlc3RzdHJpbmcgYSBsaXR0bGUgYmlnZ2VyIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyB3aXRoIGl0LgotICAgICAgIyBhIDFLIHN0cmluZyBzaG91bGQgYmUgYSByZWFzb25hYmxlIHN0YXJ0LgotICAgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4IDsgZG8KLSAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCi0gICAgICBkb25lCi0gICAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQotICAgICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKLSAgICAgICMgbWF4aW11bSBsZW5ndGggdGhhdCBpcyBvbmx5IGhhbGYgb2YgdGhlIGFjdHVhbCBtYXhpbXVtIGxlbmd0aCwgYnV0Ci0gICAgICAjIHdlIGNhbid0IHRlbGwuCi0gICAgICB3aGlsZSB7IHRlc3QgIlgiYCRTSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyAiWCR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciIDI+L2Rldi9udWxsYCBcCi0JICAgICAgICAgPSAiWFgkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIjsgfSA+L2Rldi9udWxsIDI+JjEgJiYKLQkgICAgICB0ZXN0ICRpICE9IDE3ICMgMS8yIE1CIHNob3VsZCBiZSBlbm91Z2gKLSAgICAgIGRvCi0gICAgICAgIGk9YGV4cHIgJGkgKyAxYAotICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKLSAgICAgIGRvbmUKLSAgICAgICMgT25seSBjaGVjayB0aGUgc3RyaW5nIGxlbmd0aCBvdXRzaWRlIHRoZSBsb29wLgotICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYAotICAgICAgdGVzdHN0cmluZz0KLSAgICAgICMgQWRkIGEgc2lnbmlmaWNhbnQgc2FmZXR5IGZhY3RvciBiZWNhdXNlIEMrKyBjb21waWxlcnMgY2FuIHRhY2sgb24KLSAgICAgICMgbWFzc2l2ZSBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlCi0gICAgICAjIGxpbmtlci4gIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KLSAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDJgCi0gICAgZmkKLSAgICA7OwotICBlc2FjCi1dKQotaWYgdGVzdCAtbiAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIDsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRsdF9jdl9zeXNfbWF4X2NtZF9sZW4pCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1tYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCi1fTFRfREVDTChbXSwgW21heF9jbWRfbGVuXSwgWzBdLAotICAgIFtXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/XSkKLV0pIyBMVF9DTURfTUFYX0xFTgotCi0jIE9sZCBuYW1lOgotQVVfQUxJQVMoW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwgW0xUX0NNRF9NQVhfTEVOXSkKLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU5dLCBbXSkKLQotCi0jIF9MVF9IRUFERVJfRExGQ04KLSMgLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9IRUFERVJfRExGQ05dLAotW0FDX0NIRUNLX0hFQURFUlMoW2RsZmNuLmhdLCBbXSwgW10sIFtBQ19JTkNMVURFU19ERUZBVUxUXSlkbmwKLV0pIyBfTFRfSEVBREVSX0RMRkNOCi0KLQotIyBfTFRfVFJZX0RMT1BFTl9TRUxGIChBQ1RJT04tSUYtVFJVRSwgQUNUSU9OLUlGLVRSVUUtVy1VU0NPUkUsCi0jICAgICAgICAgICAgICAgICAgICAgIEFDVElPTi1JRi1GQUxTRSwgQUNUSU9OLUlGLUNST1NTLUNPTVBJTElORykKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9UUllfRExPUEVOX1NFTEZdLAotW200X3JlcXVpcmUoW19MVF9IRUFERVJfRExGQ05dKWRubAotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBbJDRdCi1lbHNlCi0gIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKLSAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKLVsjbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCi0jZWxzZQotIyAgaWZkZWYgRExfR0xPQkFMCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCi0jICBlbHNlCi0jICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCi0gICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCi0jaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKLSMgIGlmZGVmIFJUTERfTEFaWQotIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCi0jICBlbHNlCi0jICAgIGlmZGVmIERMX0xBWlkKLSMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQotIyAgICBlbHNlCi0jICAgICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgICAgZWxzZQotIyAgICAgICAgaWZkZWYgRExfTk9XCi0jICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVwotIyAgICAgICAgZWxzZQotIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7Ci0jZW5kaWYKLQotdm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQotaW50IG1haW4gKCkKLXsKLSAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7Ci0gIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOwotCi0gIGlmIChzZWxmKQotICAgIHsKLSAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOwotICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKLSAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLwotICAgIH0KLSAgZWxzZQotICAgIHB1dHMgKGRsZXJyb3IgKCkpOwotCi0gICAgZXhpdCAoc3RhdHVzKTsKLX1dCi1fTFRfRU9GCi0gIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KLSAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+L2Rldi9udWxsCi0gICAgbHRfc3RhdHVzPSQ/Ci0gICAgY2FzZSB4JGx0X3N0YXR1cyBpbgotICAgICAgeCRsdF9kbG5vX3VzY29yZSkgJDEgOzsKLSAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgJDIgOzsKLSAgICAgIHgkbHRfZGx1bmtub3dufHgqKSAkMyA7OwotICAgIGVzYWMKLSAgZWxzZSA6Ci0gICAgIyBjb21waWxhdGlvbiBmYWlsZWQKLSAgICAkMwotICBmaQotZmkKLXJtIC1mciBjb25mdGVzdCoKLV0pIyBfTFRfVFJZX0RMT1BFTl9TRUxGCi0KLQotIyBMVF9TWVNfRExPUEVOX1NFTEYKLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi1BQ19ERUZVTihbTFRfU1lTX0RMT1BFTl9TRUxGXSwKLVttNF9yZXF1aXJlKFtfTFRfSEVBREVSX0RMRkNOXSlkbmwKLWlmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgotICBlbmFibGVfZGxvcGVuPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCi1lbHNlCi0gIGx0X2N2X2Rsb3Blbj1ubwotICBsdF9jdl9kbG9wZW5fbGlicz0KLQotICBjYXNlICRob3N0X29zIGluCi0gIGJlb3MqKQotICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCi0gICAgbHRfY3ZfZGxvcGVuX2xpYnM9Ci0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi0gICAgOzsKLQotICBtaW5ndyogfCBwdzMyKikKLSAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgotICAgIGx0X2N2X2Rsb3Blbl9saWJzPQotICAgIDs7Ci0KLSAgY3lnd2luKikKLSAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgICA7OwotCi0gIGRhcndpbiopCi0gICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0Ci0gICAgQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbG9wZW5dLAotCQlbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIl0sWwotICAgIGx0X2N2X2Rsb3Blbj0iZHlsZCIKLSAgICBsdF9jdl9kbG9wZW5fbGlicz0KLSAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKLSAgICBdKQotICAgIDs7Ci0KLSAgKikKLSAgICBBQ19DSEVDS19GVU5DKFtzaGxfbG9hZF0sCi0JICBbbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCJdLAotICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW3NobF9sb2FkXSwKLQkgICAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCJdLAotCVtBQ19DSEVDS19GVU5DKFtkbG9wZW5dLAotCSAgICAgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiJdLAotCSAgW0FDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKLQkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLAotCSAgICBbQUNfQ0hFQ0tfTElCKFtzdmxkXSwgW2Rsb3Blbl0sCi0JCSAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIl0sCi0JICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW2RsZF9saW5rXSwKLQkJICAgIFtsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiXSkKLQkgICAgICBdKQotCSAgICBdKQotCSAgXSkKLQldKQotICAgICAgXSkKLSAgICA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgotICAgIGVuYWJsZV9kbG9wZW49eWVzCi0gIGVsc2UKLSAgICBlbmFibGVfZGxvcGVuPW5vCi0gIGZpCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCi0gIGRsb3BlbikKLSAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0gICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCi0KLSAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgotICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLQotICAgIHNhdmVfTElCUz0iJExJQlMiCi0gICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgotCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmXSwKLQkgIGx0X2N2X2Rsb3Blbl9zZWxmLCBbZG5sCi0JICBfTFRfVFJZX0RMT1BFTl9TRUxGKAotCSAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywKLQkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8sIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzKQotICAgIF0pCi0KLSAgICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHh5ZXM7IHRoZW4KLSAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNcIgotICAgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmXSwKLQkgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYywgW2RubAotCSAgX0xUX1RSWV9ETE9QRU5fU0VMRigKLQkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywKLQkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vLCAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzKQotICAgICAgXSkKLSAgICBmaQotCi0gICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgotICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0gICAgTElCUz0iJHNhdmVfTElCUyIKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7Ci0gIGVzYWMKLQotICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7Ci0gIGVzYWMKLWZpCi1fTFRfREVDTChbZGxvcGVuX3N1cHBvcnRdLCBbZW5hYmxlX2Rsb3Blbl0sIFswXSwKLQkgW1doZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZF0pCi1fTFRfREVDTChbZGxvcGVuX3NlbGZdLCBbZW5hYmxlX2Rsb3Blbl9zZWxmXSwgWzBdLAotCSBbV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkXSkKLV9MVF9ERUNMKFtkbG9wZW5fc2VsZl9zdGF0aWNdLCBbZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpY10sIFswXSwKLQkgW1doZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZF0pCi1dKSMgTFRfU1lTX0RMT1BFTl9TRUxGCi0KLSMgT2xkIG5hbWU6Ci1BVV9BTElBUyhbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sIFtMVF9TWVNfRExPUEVOX1NFTEZdKQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl9TRUxGXSwgW10pCi0KLQotIyBfTFRfQ09NUElMRVJfQ19PKFtUQUdOQU1FXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1jIGFuZCAtbyBhcmUgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyLgotIyBUaGlzIG1hY3JvIGRvZXMgbm90IGhhcmQgY29kZSB0aGUgY29tcGlsZXIgbGlrZSBBQ19QUk9HX0NDX0NfTy4KLW00X2RlZnVuKFtfTFRfQ09NUElMRVJfQ19PXSwKLVttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAotbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCi1tNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKLUFDX0NBQ0hFX0NIRUNLKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0XSwKLSAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKV0sCi0gIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9bm8KLSAgICRSTSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAotICAgbWtkaXIgY29uZnRlc3QKLSAgIGNkIGNvbmZ0ZXN0Ci0gICBta2RpciBvdXQKLSAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAotCi0gICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCi0gICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgotICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KLSAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKLSAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCi0gICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKLSAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKLSAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAotICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKLSAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCi0gICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKLSAgIGFjX3N0YXR1cz0kPwotICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAotICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKLSAgIHRoZW4KLSAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCi0gICAgICRFQ0hPICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAotICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgotICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPXllcwotICAgICBmaQotICAgZmkKLSAgIGNobW9kIHUrdyAuIDI+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAkUk0gY29uZnRlc3QqCi0gICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCi0gICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRSTSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKLSAgICRSTSBvdXQvKiAmJiBybWRpciBvdXQKLSAgIGNkIC4uCi0gICAkUk0gLXIgY29uZnRlc3QKLSAgICRSTSBjb25mdGVzdCoKLV0pCi1fTFRfVEFHREVDTChbY29tcGlsZXJfY19vXSwgW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgWzFdLAotCVtEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/XSkKLV0pIyBfTFRfQ09NUElMRVJfQ19PCi0KLQotIyBfTFRfQ09NUElMRVJfRklMRV9MT0NLUyhbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBkbyBoYXJkIGxpbmtzIHRvIGxvY2sgc29tZSBmaWxlcyBpZiBuZWVkZWQKLW00X2RlZnVuKFtfTFRfQ09NUElMRVJfRklMRV9MT0NLU10sCi1bbTRfcmVxdWlyZShbX0xUX0VOQUJMRV9MT0NLXSlkbmwKLW00X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAotX0xUX0NPTVBJTEVSX0NfTyhbJDFdKQotCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3NdKQotICBoYXJkX2xpbmtzPXllcwotICAkUk0gY29uZnRlc3QqCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIHRvdWNoIGNvbmZ0ZXN0LmEKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubwotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICBBQ19NU0dfUkVTVUxUKFskaGFyZF9saW5rc10pCi0gIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCi0gICAgQUNfTVNHX1dBUk4oW2AkQ0MnIGRvZXMgbm90IHN1cHBvcnQgYC1jIC1vJywgc28gYG1ha2UgLWonIG1heSBiZSB1bnNhZmVdKQotICAgIG5lZWRfbG9ja3M9d2FybgotICBmaQotZWxzZQotICBuZWVkX2xvY2tzPW5vCi1maQotX0xUX0RFQ0woW10sIFtuZWVkX2xvY2tzXSwgWzFdLCBbTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/XSkKLV0pIyBfTFRfQ09NUElMRVJfRklMRV9MT0NLUwotCi0KLSMgX0xUX0NIRUNLX09CSkRJUgotIyAtLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZ1bihbX0xUX0NIRUNLX09CSkRJUl0sCi1bQUNfQ0FDSEVfQ0hFQ0soW2ZvciBvYmpkaXJdLCBbbHRfY3Zfb2JqZGlyXSwKLVtybSAtZiAubGlicyAyPi9kZXYvbnVsbAotbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLmxpYnM7IHRoZW4KLSAgbHRfY3Zfb2JqZGlyPS5saWJzCi1lbHNlCi0gICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCi0gIGx0X2N2X29iamRpcj1fbGlicwotZmkKLXJtZGlyIC5saWJzIDI+L2Rldi9udWxsXSkKLW9iamRpcj0kbHRfY3Zfb2JqZGlyCi1fTFRfREVDTChbXSwgW29iamRpcl0sIFswXSwKLSAgICAgICAgIFtUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXNdKWRubAotbTRfcGF0dGVybl9hbGxvdyhbTFRfT0JKRElSXSlkbmwKLUFDX0RFRklORV9VTlFVT1RFRChMVF9PQkpESVIsICIkbHRfY3Zfb2JqZGlyLyIsCi0gIFtEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3RvcnkgaW4gd2hpY2ggbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLl0pCi1dKSMgX0xUX0NIRUNLX09CSkRJUgotCi0KLSMgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKFtUQUdOQU1FXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgotbTRfZGVmdW4oW19MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSF0sCi1bQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zXSkKLV9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9Ci1pZiB0ZXN0IC1uICIkX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkiIHx8Ci0gICB0ZXN0IC1uICIkX0xUX1RBR1ZBUihydW5wYXRoX3ZhciwgJDEpIiB8fAotICAgdGVzdCAiWCRfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIiA9ICJYeWVzIiA7IHRoZW4KLQotICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RlbnQgZGlyZWN0b3JpZXMuCi0gIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpIiAhPSBubyAmJgotICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCi0gICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKLSAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQotICAgICAjIyB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSkiICE9IG5vICYmCi0gICAgIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKSIgIT0gbm87IHRoZW4KLSAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgotICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9aW1tZWRpYXRlCi0gIGZpCi1lbHNlCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCi0gICMgZGlyZWN0b3JpZXMuCi0gIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9dW5zdXBwb3J0ZWQKLWZpCi1BQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKV0pCi0KLWlmIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpIiA9IHJlbGluayB8fAotICAgdGVzdCAiJF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpIiA9IHllczsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLV9MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfYWN0aW9uXSwgWzBdLAotICAgIFtIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZV0pCi1dKSMgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRICi0KLQotIyBfTFRfQ01EX1NUUklQTElCCi0jIC0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZnVuKFtfTFRfQ01EX1NUUklQTElCXSwKLVttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCi1zdHJpcGxpYj0KLW9sZF9zdHJpcGxpYj0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlXSkKLWlmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCAkR1JFUCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCi0gIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCi0gIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgotICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQotZWxzZQotIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgZGFyd2luKikKLSAgICBpZiB0ZXN0IC1uICIkU1RSSVAiIDsgdGhlbgotICAgICAgc3RyaXBsaWI9IiRTVFJJUCAteCIKLSAgICAgIG9sZF9zdHJpcGxpYj0iJFNUUklQIC1TIgotICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLSAgICBlbHNlCi0gICAgICBBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgZmkKLSAgICA7OwotICAqKQotICAgIEFDX01TR19SRVNVTFQoW25vXSkKLSAgICA7OwotICBlc2FjCi1maQotX0xUX0RFQ0woW10sIFtvbGRfc3RyaXBsaWJdLCBbMV0sIFtDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXNdKQotX0xUX0RFQ0woW10sIFtzdHJpcGxpYl0sIFsxXSkKLV0pIyBfTFRfQ01EX1NUUklQTElCCi0KLQotIyBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKFtUQUddKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcwotbTRfZGVmdW4oW19MVF9TWVNfRFlOQU1JQ19MSU5LRVJdLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLW00X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKLW00X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAotbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKLUFDX01TR19DSEVDS0lORyhbZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzXSkKLW00X2lmKFskMV0sCi0JW10sIFsKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBkYXJ3aW4qKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovLC9MUi8iIDs7Ci0gICAgKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LyIgOzsKLSAgZXNhYwotICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgYXdrICRsdF9hd2tfYXJnIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAotICBpZiAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJEdSRVAgJzsnID4vZGV2L251bGwgOyB0aGVuCi0gICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgotICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcwotICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAotICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgotICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKLSAgZWxzZQotICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKLSAgZmkKLSAgIyBPaywgbm93IHdlIGhhdmUgdGhlIHBhdGgsIHNlcGFyYXRlZCBieSBzcGFjZXMsIHdlIGNhbiBzdGVwIHRocm91Z2ggaXQKLSAgIyBhbmQgYWRkIG11bHRpbGliIGRpciBpZiBuZWNlc3NhcnkuCi0gIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPQotICBsdF9tdWx0aV9vc19kaXI9YCRDQyAkQ1BQRkxBR1MgJENGTEFHUyAkTERGTEFHUyAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5IDI+L2Rldi9udWxsYAotICBmb3IgbHRfc3lzX3BhdGggaW4gJGx0X3NlYXJjaF9wYXRoX3NwZWM7IGRvCi0gICAgaWYgdGVzdCAtZCAiJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiOyB0aGVuCi0gICAgICBsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aC8kbHRfbXVsdGlfb3NfZGlyIgotICAgIGVsc2UKLSAgICAgIHRlc3QgLWQgIiRsdF9zeXNfcGF0aCIgJiYgXAotCWx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoIgotICAgIGZpCi0gIGRvbmUKLSAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIHwgYXdrICcKLUJFR0lOIHtSUz0iICI7IEZTPSIvfFxuIjt9IHsKLSAgbHRfZm9vPSIiOwotICBsdF9jb3VudD0wOwotICBmb3IgKGx0X2kgPSBORjsgbHRfaSA+IDA7IGx0X2ktLSkgewotICAgIGlmICgkbHRfaSAhPSAiIiAmJiAkbHRfaSAhPSAiLiIpIHsKLSAgICAgIGlmICgkbHRfaSA9PSAiLi4iKSB7Ci0gICAgICAgIGx0X2NvdW50Kys7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAobHRfY291bnQgPT0gMCkgewotICAgICAgICAgIGx0X2Zvbz0iLyIgJGx0X2kgbHRfZm9vOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGx0X2NvdW50LS07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKGx0X2ZvbyAhPSAiIikgeyBsdF9mcmVxW1tsdF9mb29dXSsrOyB9Ci0gIGlmIChsdF9mcmVxW1tsdF9mb29dXSA9PSAxKSB7IHByaW50IGx0X2ZvbzsgfQotfSdgCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gJGx0X3NlYXJjaF9wYXRoX3NwZWNgCi1lbHNlCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpXSkKLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXNocmV4dF9jbWRzPSIuc28iCi1wb3N0aW5zdGFsbF9jbWRzPQotcG9zdHVuaW5zdGFsbF9jbWRzPQotZmluaXNoX2NtZHM9Ci1maW5pc2hfZXZhbD0KLXNobGlicGF0aF92YXI9Ci1zaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgotbmVlZF9saWJfcHJlZml4PXVua25vd24KLWhhcmRjb2RlX2ludG9fbGlicz1ubwotCi0jIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KLSMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cwotbmVlZF92ZXJzaW9uPXVua25vd24KLQotY2FzZSAkaG9zdF9vcyBpbgotYWl4MyopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0KLSAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICA7OwotCi1haXhbWzQtOV1dKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGVsc2UKLSAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCi0gICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAotICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KLSAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgotICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4NCB8IGFpeDQuW1swMV1dIHwgYWl4NC5bWzAxXV0uKikKLSAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCi0JICAgZWNobyAnIHllcyAnCi0JICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCAkR1JFUCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKLSAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCi0gICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KLSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbwotICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKLSAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIGVsc2UKLSAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCi0gICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJwotICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBmaQotICAgIHNobGlicGF0aF92YXI9TElCUEFUSAotICBmaQotICA7OwotCi1hbWlnYW9zKikKLSAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgcG93ZXJwYykKLSAgICAjIFNpbmNlIEp1bHkgMjAwNyBBbWlnYU9TNCBvZmZpY2lhbGx5IHN1cHBvcnRzIC5zbyBsaWJyYXJpZXMuCi0gICAgIyBXaGVuIGNvbXBpbGluZyB0aGUgZXhlY3V0YWJsZSwgYWRkIC11c2UtZHlubGQgLUxzb2JqczogdG8gdGhlIGNvbXBpbGVsaW5lLgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIDs7Ci0gIG02OGspCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKLSAgICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICAgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJEVDSE8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFtbXi9dXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkUk0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAotICA7OwotCi1ic2RpW1s0NV1dKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKLSAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93Ci0gICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gIHZlcnNpb25fdHlwZT13aW5kb3dzCi0gIHNocmV4dF9jbWRzPSIuZGxsIgotICBuZWVkX3ZlcnNpb249bm8KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0KLSAgY2FzZSAkR0NDLCRob3N0X29zIGluCi0gIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJwotICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KLSAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+Ci0gICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KLSAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KLSAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWV+Ci0gICAgICBpZiB0ZXN0IC1uICdcJyckc3RyaXBtZSdcJycgJiYgdGVzdCAtbiAnXCcnJHN0cmlwbGliJ1wnJzsgdGhlbgotICAgICAgICBldmFsICdcJyckc3RyaXBsaWIgXCRkbGRpci8kZGxuYW1lJ1wnJyB8fCBleGl0IFwkPzsKLSAgICAgIGZpJwotICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+Ci0gICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgotICAgICAgICRSTSBcJGRscGF0aCcKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgY3lnd2luKikKLSAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gICAgICA7OwotICAgIG1pbmd3KikKLSAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4Ci0gICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8ICRHUkVQICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCi0gICAgICBpZiAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBbJEdSRVAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsXTsgdGhlbgotICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKLSAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAotICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCi0gICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKLSAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAotICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCi0gICAgICBlbHNlCi0gICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCi0gICAgICBmaQotICAgICAgOzsKLSAgICBwdzMyKikKLSAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJwotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCi0gICAgICA7OwotICAgIGVzYWMKLSAgICA7OwotCi0gICopCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKLSAgICA7OwotICBlc2FjCi0gIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCi0gICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgotICBzaGxpYnBhdGhfdmFyPVBBVEgKLSAgOzsKLQotZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCi0gIHZlcnNpb25fdHlwZT1kYXJ3aW4KLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAotICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKLW00X2lmKFskMV0sIFtdLFsKLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbG9jYWwvbGliIl0pCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJwotICA7OwotCi1kZ3V4KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLWZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldwotICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KLSAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KLSAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKLSAgZWxzZQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBmcmVlYnNkW1sxMjNdXSopIG9iamZvcm1hdD1hb3V0IDs7Ci0gICAgKikgb2JqZm9ybWF0PWVsZiA7OwotICAgIGVzYWMKLSAgZmkKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAotICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLSAgICBmcmVlYnNkLWVsZiopCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgICA7OwotICAgIGZyZWVic2QtKikKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgICAgbmVlZF92ZXJzaW9uPXllcwotICAgICAgOzsKLSAgZXNhYwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICRob3N0X29zIGluCi0gIGZyZWVic2QyKikKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICAgOzsKLSAgZnJlZWJzZDMuW1swMV1dKiB8IGZyZWVic2RlbGYzLltbMDFdXSopCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICA7OwotICBmcmVlYnNkMy5bWzItOV1dKiB8IGZyZWVic2RlbGYzLltbMi05XV0qIHwgXAotICBmcmVlYnNkNC5bWzAtNV1dIHwgZnJlZWJzZGVsZjQuW1swLTVdXSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgKikgIyBmcm9tIDQuNiBvbiwgYW5kIERyYWdvbkZseQotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICAgOzsKLSAgZXNhYwotICA7OwotCi1nbnUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KLSAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGNhc2UgJGhvc3RfY3B1IGluCi0gIGlhNjQqKQotICAgIHNocmV4dF9jbWRzPScuc28nCi0gICAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCi0gICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgotICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgotICAgIGVsc2UKLSAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKLSAgICBmaQotICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKLSAgICA7OwotICBocHBhKjY0KikKLSAgICBzaHJleHRfY21kcz0nLnNsJwotICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAotICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0gICAgOzsKLSAgKikKLSAgICBzaHJleHRfY21kcz0nLnNsJwotICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIDs7Ci0gIGVzYWMKLSAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJwotICA7OwotCi1pbnRlcml4W1szLTldXSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi1pcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICBjYXNlICRob3N0X29zIGluCi0gICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OwotICAgICopCi0JaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgotCQl2ZXJzaW9uX3R5cGU9bGludXgKLQllbHNlCi0JCXZlcnNpb25fdHlwZT1pcml4Ci0JZmkgOzsKLSAgZXNhYwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgY2FzZSAkaG9zdF9vcyBpbgotICBpcml4NSogfCBub25zdG9wdXgqKQotICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KLSAgICA7OwotICAqKQotICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKLSAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQotICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OwotICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCi0gICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKLSAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKLSAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi0jIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCi1saW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eCogfCBrKmJzZCotZ251KQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgU29tZSBiaW51dGlscyBsZCBhcmUgcGF0Y2hlZCB0byBzZXQgRFRfUlVOUEFUSAotICBzYXZlX0xERkxBR1M9JExERkxBR1MKLSAgc2F2ZV9saWJkaXI9JGxpYmRpcgotICBldmFsICJsaWJkaXI9L2Zvbzsgd2w9XCIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSlcIjsgXAotICAgICAgIExERkxBR1M9XCJcJExERkxBR1MgJF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpXCIiCi0gIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sW10pXSwKLSAgICBbQVNfSUYoWyAoJE9CSkRVTVAgLXAgY29uZnRlc3QkYWNfZXhlZXh0KSAyPi9kZXYvbnVsbCB8IGdyZXAgIlJVTlBBVEguKiRsaWJkaXIiID4vZGV2L251bGxdLAotICAgICAgIFtzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzXSldKQotICBMREZMQUdTPSRzYXZlX0xERkxBR1MKLSAgbGliZGlyPSRzYXZlX2xpYmRpcgotCi0gICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgotICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKLSAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotCi0gICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCi0gIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIDI+L2Rldi9udWxsIiwgXFskXTIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFxbJF0wOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKLSAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCi0gIGZpCi0KLSAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCi0gICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKLSAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCi0gICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCi0gICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQotICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KLSAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKLSAgOzsKLQotbmV0YnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKLSAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgOzsKLQotbmV3c29zNikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIDs7Ci0KLSpudG8qIHwgKnFueCopCi0gIHZlcnNpb25fdHlwZT1xbngKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKLSAgZHluYW1pY19saW5rZXI9J2xkcW54LnNvJwotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KLSAgY2FzZSAkaG9zdF9vcyBpbgotICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopCW5lZWRfdmVyc2lvbj15ZXMgOzsKLSAgICAqKQkJCQluZWVkX3ZlcnNpb249bm8gIDs7Ci0gIGVzYWMKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIG9wZW5ic2QyLltbODldXSB8IG9wZW5ic2QyLltbODldXS4qKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotCTs7Ci0gICAgICAqKQotCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLQk7OwotICAgICAgZXNhYwotICBlbHNlCi0gICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBmaQotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBzaHJleHRfY21kcz0iLmRsbCIKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCi0gIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotcmRvcyopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgZmkKLSAgbmVlZF92ZXJzaW9uPXllcwotICA7OwotCi1zeXN2NCB8IHN5c3Y0LjMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgJGhvc3RfdmVuZG9yIGluCi0gICAgc25pKQotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgICA7OwotICAgIHNpZW1lbnMpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIDs7Ci0gICAgbW90b3JvbGEpCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIG5lZWRfdmVyc2lvbj1ubwotICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJwotICAgICAgOzsKLSAgZXNhYwotICA7OwotCi1zeXN2NCpNUCopCi0gIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KLSAgICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJwotICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGZpCi0gIDs7Ci0KLXN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKLSAgZWxzZQotICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIHNjbzMuMnY1KikKLSAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCi0JOzsKLSAgICBlc2FjCi0gIGZpCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKLSAgOzsKLQotdHBmKikKLSAgIyBUUEYgaXMgYSBjcm9zcy10YXJnZXQgb25seS4gIFByZWZlcnJlZCBjcm9zcy1ob3N0ID0gR05VL0xpbnV4LgotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgaGFyZGNvZGVfaW50b19saWJzPXllcwotICA7OwotCi11dHM0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi0qKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotZXNhYwotQUNfTVNHX1JFU1VMVChbJGR5bmFtaWNfbGlua2VyXSkKLXRlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLXZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKLWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgotZmkKLSAKLWlmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLWZpCi1pZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCi1maQotCi1fTFRfREVDTChbXSwgW3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rXSwgWzFdLAotICAgIFtWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKLSAgICByZXN0b3JlZCBhdCBsaW5rIHRpbWVdKQotX0xUX0RFQ0woW10sIFtuZWVkX2xpYl9wcmVmaXhdLCBbMF0sCi0gICAgW0RvIHdlIG5lZWQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcz9dKQotX0xUX0RFQ0woW10sIFtuZWVkX3ZlcnNpb25dLCBbMF0sIFtEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzP10pCi1fTFRfREVDTChbXSwgW3ZlcnNpb25fdHlwZV0sIFswXSwgW0xpYnJhcnkgdmVyc2lvbmluZyB0eXBlXSkKLV9MVF9ERUNMKFtdLCBbcnVucGF0aF92YXJdLCBbMF0sICBbU2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlXSkKLV9MVF9ERUNMKFtdLCBbc2hsaWJwYXRoX3Zhcl0sIFswXSxbU2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZV0pCi1fTFRfREVDTChbXSwgW3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aF0sIFswXSwKLSAgICBbSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoP10pCi1fTFRfREVDTChbXSwgW2xpYm5hbWVfc3BlY10sIFsxXSwgW0Zvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4XSkKLV9MVF9ERUNMKFtdLCBbbGlicmFyeV9uYW1lc19zcGVjXSwgWzFdLAotICAgIFtbTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KLSAgICBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FXV0pCi1fTFRfREVDTChbXSwgW3NvbmFtZV9zcGVjXSwgWzFdLAotICAgIFtbVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWVdXSkKLV9MVF9ERUNMKFtdLCBbcG9zdGluc3RhbGxfY21kc10sIFsyXSwKLSAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQotX0xUX0RFQ0woW10sIFtwb3N0dW5pbnN0YWxsX2NtZHNdLCBbMl0sCi0gICAgW0NvbW1hbmQgdG8gdXNlIGFmdGVyIHVuaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQotX0xUX0RFQ0woW10sIFtmaW5pc2hfY21kc10sIFsyXSwKLSAgICBbQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5XSkKLV9MVF9ERUNMKFtdLCBbZmluaXNoX2V2YWxdLCBbMV0sCi0gICAgW1tBcyAiZmluaXNoX2NtZHMiLCBleGNlcHQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQKLSAgICBub3Qgc2hvd25dXSkKLV9MVF9ERUNMKFtdLCBbaGFyZGNvZGVfaW50b19saWJzXSwgWzBdLAotICAgIFtXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzXSkKLV9MVF9ERUNMKFtdLCBbc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXSwgWzJdLAotICAgIFtDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQotX0xUX0RFQ0woW10sIFtzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY10sIFsyXSwKLSAgICBbUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQotXSkjIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIKLQotCi0jIF9MVF9QQVRIX1RPT0xfUFJFRklYKFRPT0wpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyeQotQUNfREVGVU4oW19MVF9QQVRIX1RPT0xfUFJFRklYXSwKLVttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMV0pCi1BQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9NQUdJQ19DTUQsCi1bY2FzZSAkTUFHSUNfQ01EIGluCi1bW1xcLypdIHwgID86W1xcL10qXSkKLSAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotKikKLSAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCi0gIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZG5sICRhY19kdW1teSBmb3JjZXMgc3BsaXR0aW5nIG9uIGNvbnN0YW50IHVzZXItc3VwcGxpZWQgcGF0aHMuCi1kbmwgUE9TSVguMiB3b3JkIHNwbGl0dGluZyBpcyBkb25lIG9ubHkgb24gdGhlIG91dHB1dCBvZiB3b3JkIGV4cGFuc2lvbnMsCi1kbmwgbm90IGV2ZXJ5IHdvcmQuICBUaGlzIGNsb3NlcyBhIGxvbmdzdGFuZGluZyBzaCBzZWN1cml0eSBob2xlLgotICBhY19kdW1teT0ibTRfaWYoWyQyXSwgLCAkUEFUSCwgWyQyXSkiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIElGUz0iJGx0X3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyQxOyB0aGVuCi0gICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8kMSIKLSAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KLQljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgotCSJmaWxlX21hZ2ljICIqKQotCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCi0JICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKLQkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKLQkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgOgotCSAgZWxzZQotCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKLSoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KLSoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcwotKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0Ci0qKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKLSoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKLSoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KLSoqKiBidWctbGlidG9vbEBnbnUub3JnCi0KLV9MVF9FT0YKLQkgIGZpIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCi0gIDs7Ci1lc2FjXSkKLU1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgotaWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTUFHSUNfQ01EKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLV9MVF9ERUNMKFtdLCBbTUFHSUNfQ01EXSwgWzBdLAotCSBbVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyB3aXRoICJmaWxlIl0pZG5sCi1dKSMgX0xUX1BBVEhfVE9PTF9QUkVGSVgKLQotIyBPbGQgbmFtZToKLUFVX0FMSUFTKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW19MVF9QQVRIX1RPT0xfUFJFRklYXSkKLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQUNfUEFUSF9UT09MX1BSRUZJWF0sIFtdKQotCi0KLSMgX0xUX1BBVEhfTUFHSUMKLSMgLS0tLS0tLS0tLS0tLS0KLSMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIGEgc2hhcmVkIGxpYnJhcnkKLW00X2RlZnVuKFtfTFRfUEFUSF9NQUdJQ10sCi1bX0xUX1BBVEhfVE9PTF9QUkVGSVgoJHthY190b29sX3ByZWZpeH1maWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQotaWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAgX0xUX1BBVEhfVE9PTF9QUkVGSVgoZmlsZSwgL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCkKLSAgZWxzZQotICAgIE1BR0lDX0NNRD06Ci0gIGZpCi1maQotXSkjIF9MVF9QQVRIX01BR0lDCi0KLQotIyBMVF9QQVRIX0xECi0jIC0tLS0tLS0tLS0KLSMgZmluZCB0aGUgcGF0aG5hbWUgdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oW0xUX1BBVEhfTERdLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLW00X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCi1tNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCi0KLUFDX0FSR19XSVRIKFtnbnUtbGRdLAotICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWdudS1sZF0sCi0JW2Fzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkBdKV0sCi0gICAgW3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllc10sCi0gICAgW3dpdGhfZ251X2xkPW5vXSlkbmwKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgJENDXSkKLSAgY2FzZSAkaG9zdCBpbgotICAqLSotbWluZ3cqKQotICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7Ci0gICopCi0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OwotICBlc2FjCi0gIGNhc2UgJGFjX3Byb2cgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICBbW1xcL11dKiB8ID86W1tcXC9dXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bW14vXV1bW14vXV0qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCi0gICAgICBhY19wcm9nPWAkRUNITyAiJGFjX3Byb2cifCAkU0VEICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlICRFQ0hPICIkYWNfcHJvZyIgfCAkR1JFUCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWAkRUNITyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKLWVsc2UKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCi1maQotQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfTEQsCi1baWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgotICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgotICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotCTs7Ci0gICAgICAqKQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0JOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGx0X3NhdmVfaWZzIgotZWxzZQotICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRsdF9jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotX0xUX1BBVEhfTERfR05VCi1BQ19TVUJTVChbTERdKQotCi1fTFRfVEFHREVDTChbXSwgW0xEXSwgWzFdLCBbVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllc10pCi1dKSMgTFRfUEFUSF9MRAotCi0jIE9sZCBuYW1lczoKLUFVX0FMSUFTKFtBTV9QUk9HX0xEXSwgW0xUX1BBVEhfTERdKQotQVVfQUxJQVMoW0FDX1BST0dfTERdLCBbTFRfUEFUSF9MRF0pCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0FNX1BST0dfTERdLCBbXSkKLWRubCBBQ19ERUZVTihbQUNfUFJPR19MRF0sIFtdKQotCi0KLSMgX0xUX1BBVEhfTERfR05VCi0jLSAtLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9QQVRIX0xEX0dOVV0sCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgbHRfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgotY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KLSpHTlUqIHwgKid3aXRoIEJGRCcqKQotICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKLSAgOzsKLSopCi0gIGx0X2N2X3Byb2dfZ251X2xkPW5vCi0gIDs7Ci1lc2FjXSkKLXdpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAotXSkjIF9MVF9QQVRIX0xEX0dOVQotCi0KLSMgX0xUX0NNRF9SRUxPQUQKLSMgLS0tLS0tLS0tLS0tLS0KLSMgZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCi0jICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KLW00X2RlZnVuKFtfTFRfQ01EX1JFTE9BRF0sCi1bQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXNdLAotICBsdF9jdl9sZF9yZWxvYWRfZmxhZywKLSAgW2x0X2N2X2xkX3JlbG9hZF9mbGFnPSctciddKQotcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCi1jYXNlICRyZWxvYWRfZmxhZyBpbgotIiIgfCAiICIqKSA7OwotKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Ci1lc2FjCi1yZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi1jYXNlICRob3N0X29zIGluCi0gIGRhcndpbiopCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKLSAgICBlbHNlCi0gICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi0gICAgZmkKLSAgICA7OwotZXNhYwotX0xUX0RFQ0woW10sIFtyZWxvYWRfZmxhZ10sIFsxXSwgW0hvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXNdKWRubAotX0xUX0RFQ0woW10sIFtyZWxvYWRfY21kc10sIFsyXSlkbmwKLV0pIyBfTFRfQ01EX1JFTE9BRAotCi0KLSMgX0xUX0NIRUNLX01BR0lDX01FVEhPRAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGhvdyB0byBjaGVjayBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKLSMgIC0tIFBPUlRNRSBmaWxsIGluIHdpdGggdGhlIGR5bmFtaWMgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MKLW00X2RlZnVuKFtfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9EXSwKLVttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCi1BQ19DQUNIRV9DSEVDSyhbaG93IHRvIHJlY29nbml6ZSBkZXBlbmRlbnQgbGlicmFyaWVzXSwKLWx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kLAotW2x0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJwotbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9Ci1sdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKLSMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAotIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgotIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCi0jIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KLSMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KLSMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KLSMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKLSMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCi0jIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKLSMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCi0KLWNhc2UgJGhvc3Rfb3MgaW4KLWFpeFtbNC05XV0qKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1iZW9zKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotYnNkaVtbNDVdXSopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIDs7Ci0KLWN5Z3dpbiopCi0gICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCi0gIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJwotICA7OwotCi1taW5ndyogfCBwdzMyKikKLSAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQotICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJywKLSAgIyB1bmxlc3Mgd2UgZmluZCAnZmlsZScsIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgYXJlIGNyb3NzLWNvbXBpbGluZy4KLSAgaWYgKCBmaWxlIC8gKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJwotICBlbHNlCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJwotICBmaQotICA7OwotCi1kYXJ3aW4qIHwgcmhhcHNvZHkqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1mcmVlYnNkKiB8IGRyYWdvbmZseSopCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgaSo4NiApCi0gICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIE9wZW5CU0QgaGVyZSB3YXMgYSBtaXN0YWtlLgotICAgICAgIyBMZXQncyBhY2NlcHQgYm90aCBvZiB0aGVtIHVudGlsIHRoaXMgaXMgY2xlYXJlZCB1cC4KLSAgICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChGcmVlQlNEfE9wZW5CU0R8RHJhZ29uRmx5KS9pW1szLTldXTg2IChjb21wYWN0ICk/ZGVtYW5kIHBhZ2VkIHNoYXJlZCBsaWJyYXJ5JwotICAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICBmaQotICA7OwotCi1nbnUqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1ocHV4MTAuMjAqIHwgaHB1eDExKikKLSAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBjYXNlICRob3N0X2NwdSBpbgotICBpYTY0KikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxFTEYtW1swLTldXVtbMC05XV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KLSAgICA7OwotICBocHBhKjY0KikKLSAgICBbbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIFBBLVJJU0MgWzAtOV0uWzAtOV0nXQotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL3BhMjBfNjQvbGliYy5zbAotICAgIDs7Ci0gICopCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18UEEtUklTQ1tbMC05XV0uW1swLTldXSkgc2hhcmVkIGxpYnJhcnknCi0gICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGliYy5zbAotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotaW50ZXJpeFtbMy05XV0qKQotICAjIFBJQyBjb2RlIGlzIGJyb2tlbiBvbiBJbnRlcml4IDMueCwgdGhhdCdzIHdoeSB8XC5hIG5vdCB8X3BpY1wuYSBoZXJlCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc298XC5hKSQnCi0gIDs7Ci0KLWlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCi0gIGNhc2UgJExEIGluCi0gICotMzJ8KiItMzIgIikgbGlibWFnaWM9MzItYml0OzsKLSAgKi1uMzJ8KiItbjMyICIpIGxpYm1hZ2ljPU4zMjs7Ci0gICotNjR8KiItNjQgIikgbGlibWFnaWM9NjQtYml0OzsKLSAgKikgbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICBlc2FjCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4KiB8IGsqYnNkKi1nbnUpCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLW5ldGJzZCopCi0gIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCi0gIGVsc2UKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfF9waWNcLmEpJCcKLSAgZmkKLSAgOzsKLQotbmV3b3M2KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKGV4ZWN1dGFibGV8ZHluYW1pYyBsaWIpJwotICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYm5scy5zbwotICA7OwotCi0qbnRvKiB8ICpxbngqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1vcGVuYnNkKikKLSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xcLnNvfF9waWNcLmEpJCcKLSAgZWxzZQotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCi0gIGZpCi0gIDs7Ci0KLW9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotcmRvcyopCi0gIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLXNvbGFyaXMqKQotICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1zeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLQotc3lzdjQgfCBzeXN2NC4zKikKLSAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLSAgbW90b3JvbGEpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bWzAtOV1dW1swLTldXSogVmVyc2lvbiBbWzAtOV1dJwotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAotICAgIDs7Ci0gIG5jcikKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICAgIDs7Ci0gIHNlcXVlbnQpCi0gICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJwotICAgIDs7Ci0gIHNuaSkKLSAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJwotICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIGR5bmFtaWMgbGliIgotICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbwotICAgIDs7Ci0gIHNpZW1lbnMpCi0gICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgICA7OwotICBwYykKLSAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotdHBmKikKLSAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKLSAgOzsKLWVzYWMKLV0pCi1maWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAotdGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCi0KLV9MVF9ERUNMKFtdLCBbZGVwbGlic19jaGVja19tZXRob2RdLCBbMV0sCi0gICAgW01ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzXSkKLV9MVF9ERUNMKFtdLCBbZmlsZV9tYWdpY19jbWRdLCBbMV0sCi0gICAgW0NvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gImZpbGVfbWFnaWMiXSkKLV0pIyBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ECi0KLQotIyBMVF9QQVRIX05NCi0jIC0tLS0tLS0tLS0KLSMgZmluZCB0aGUgcGF0aG5hbWUgdG8gYSBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKFtMVF9QQVRIX05NXSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX0NBQ0hFX0NIRUNLKFtmb3IgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyIChubSldLCBsdF9jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGx0X2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgbHRfbm1fdG9fY2hlY2s9IiR7YWNfdG9vbF9wcmVmaXh9bm0iCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCIgJiYgdGVzdCAiJGJ1aWxkIiA9ICIkaG9zdCI7IHRoZW4KLSAgICBsdF9ubV90b19jaGVjaz0iJGx0X25tX3RvX2NoZWNrIG5tIgotICBmaQotICBmb3IgbHRfdG1wX25tIGluICRsdF9ubV90b19jaGVjazsgZG8KLSAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2Jpbi9lbGYgL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICB0bXBfbm09IiRhY19kaXIvJGx0X3RtcF9ubSIKLSAgICAgIGlmIHRlc3QgLWYgIiR0bXBfbm0iIHx8IHRlc3QgLWYgIiR0bXBfbm0kYWNfZXhlZXh0IiA7IHRoZW4KLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLQkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLQkjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKLQljYXNlIGAiJHRtcF9ubSIgLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KLQkqL2Rldi9udWxsKiB8IConSW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlJyopCi0JICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1CIgotCSAgYnJlYWsKLQkgIDs7Ci0JKikKLQkgIGNhc2UgYCIkdG1wX25tIiAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgotCSAgKi9kZXYvbnVsbCopCi0JICAgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLXAiCi0JICAgIGJyZWFrCi0JICAgIDs7Ci0JICAqKQotCSAgICBsdF9jdl9wYXRoX05NPSR7bHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCSAgICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgZG9uZQotICA6ICR7bHRfY3ZfcGF0aF9OTT1ub30KLWZpXSkKLWlmIHRlc3QgIiRsdF9jdl9wYXRoX05NIiAhPSAibm8iOyB0aGVuCi0gIE5NPSIkbHRfY3ZfcGF0aF9OTSIKLWVsc2UKLSAgIyBEaWRuJ3QgZmluZCBhbnkgQlNEIGNvbXBhdGlibGUgbmFtZSBsaXN0ZXIsIGxvb2sgZm9yIGR1bXBiaW4uCi0gIEFDX0NIRUNLX1RPT0xTKERVTVBCSU4sIFsiZHVtcGJpbiAtc3ltYm9scyIgImxpbmsgLWR1bXAgLXN5bWJvbHMiXSwgOikKLSAgQUNfU1VCU1QoW0RVTVBCSU5dKQotICBpZiB0ZXN0ICIkRFVNUEJJTiIgIT0gIjoiOyB0aGVuCi0gICAgTk09IiREVU1QQklOIgotICBmaQotZmkKLXRlc3QgLXogIiROTSIgJiYgTk09bm0KLUFDX1NVQlNUKFtOTV0pCi1fTFRfREVDTChbXSwgW05NXSwgWzFdLCBbQSBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXJdKWRubAotCi1BQ19DQUNIRV9DSEVDSyhbdGhlIG5hbWUgbGlzdGVyICgkTk0pIGludGVyZmFjZV0sIFtsdF9jdl9ubV9pbnRlcmZhY2VdLAotICBbbHRfY3Zfbm1faW50ZXJmYWNlPSJCU0Qgbm0iCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuJGFjX2V4dAotICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkYWNfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQotICAoZXZhbCAiJGFjX2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQotICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJE5NIFxcXCJjb25mdGVzdC4kYWNfb2JqZXh0XFxcIlwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQotICAoZXZhbCAiJE5NIFwiY29uZnRlc3QuJGFjX29iamV4dFwiIiAyPmNvbmZ0ZXN0LmVyciA+IGNvbmZ0ZXN0Lm91dCkKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECi0gIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186IG91dHB1dFwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQotICBjYXQgY29uZnRlc3Qub3V0ID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgaWYgJEdSRVAgJ0V4dGVybmFsLipzb21lX3ZhcmlhYmxlJyBjb25mdGVzdC5vdXQgPiAvZGV2L251bGw7IHRoZW4KLSAgICBsdF9jdl9ubV9pbnRlcmZhY2U9Ik1TIGR1bXBiaW4iCi0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0Kl0pCi1dKSMgTFRfUEFUSF9OTQotCi0jIE9sZCBuYW1lczoKLUFVX0FMSUFTKFtBTV9QUk9HX05NXSwgW0xUX1BBVEhfTk1dKQotQVVfQUxJQVMoW0FDX1BST0dfTk1dLCBbTFRfUEFUSF9OTV0pCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0FNX1BST0dfTk1dLCBbXSkKLWRubCBBQ19ERUZVTihbQUNfUFJPR19OTV0sIFtdKQotCi0KLSMgTFRfTElCX00KLSMgLS0tLS0tLS0KLSMgY2hlY2sgZm9yIG1hdGggbGlicmFyeQotQUNfREVGVU4oW0xUX0xJQl9NXSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1MSUJNPQotY2FzZSAkaG9zdCBpbgotKi0qLWJlb3MqIHwgKi0qLWN5Z3dpbiogfCAqLSotcHczMiogfCAqLSotZGFyd2luKikKLSAgIyBUaGVzZSBzeXN0ZW0gZG9uJ3QgaGF2ZSBsaWJtLCBvciBkb24ndCBuZWVkIGl0Ci0gIDs7Ci0qLW5jci1zeXN2NC4zKikKLSAgQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCwgTElCTT0iLWxtdyIpCi0gIEFDX0NIRUNLX0xJQihtLCBjb3MsIExJQk09IiRMSUJNIC1sbSIpCi0gIDs7Ci0qKQotICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSItbG0iKQotICA7OwotZXNhYwotQUNfU1VCU1QoW0xJQk1dKQotXSkjIExUX0xJQl9NCi0KLSMgT2xkIG5hbWU6Ci1BVV9BTElBUyhbQUNfQ0hFQ0tfTElCTV0sIFtMVF9MSUJfTV0pCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0FDX0NIRUNLX0xJQk1dLCBbXSkKLQotCi0jIF9MVF9DT01QSUxFUl9OT19SVFRJKFtUQUdOQU1FXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9DT01QSUxFUl9OT19SVFRJXSwKLVttNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKLQotX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPQotCi1pZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nCi0KLSAgX0xUX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLAotICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zLAotICAgIFstZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwgW10sCi0gICAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0iJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIl0pCi1maQotX0xUX1RBR0RFQ0woW25vX2J1aWx0aW5fZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ10sIFsxXSwKLQlbQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9uc10pCi1dKSMgX0xUX0NPTVBJTEVSX05PX1JUVEkKLQotCi0jIF9MVF9DTURfR0xPQkFMX1NZTUJPTFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmdW4oW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCi1BQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKLW00X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCi1tNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCi1tNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLUFDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdF0pCi1BQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGVdLAotWwotIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1zeW1jb2RlPSdbW0JDREVHUlNUXV0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotc3ltcGF0PSdcKFtbX0EtWmEtel1dW1tfQS1aYS16MC05XV0qXCknCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICRob3N0X29zIGluCi1haXgqKQotICBzeW1jb2RlPSdbW0JDRFRdXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgc3ltY29kZT0nW1tBQkNER0lTVFddXScKLSAgOzsKLWhwdXgqKQotICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgotICAgIHN5bWNvZGU9J1tbQUJDREVHUlNUXV0nCi0gIGZpCi0gIDs7Ci1pcml4KiB8IG5vbnN0b3B1eCopCi0gIHN5bWNvZGU9J1tbQkNERUdSU1RdXScKLSAgOzsKLW9zZiopCi0gIHN5bWNvZGU9J1tbQkNERUdRUlNUXV0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgc3ltY29kZT0nW1tCRFJUXV0nCi0gIDs7Ci1zY28zLjJ2NSopCi0gIHN5bWNvZGU9J1tbRFRdXScKLSAgOzsKLXN5c3Y0LjJ1dzIqKQotICBzeW1jb2RlPSdbW0RUXV0nCi0gIDs7Ci1zeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICBzeW1jb2RlPSdbW0FCRFRdXScKLSAgOzsKLXN5c3Y0KQotICBzeW1jb2RlPSdbW0RGTlNUVV1dJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWNhc2UgYCROTSAtViAyPiYxYCBpbgotKkdOVSogfCAqJ3dpdGggQkZEJyopCi0gIHN5bWNvZGU9J1tbQUJDREdJUlNUV11dJyA7OwotZXNhYwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uLgotIyBTb21lIHN5c3RlbXMgKGVzcC4gb24gaWE2NCkgbGluayBkYXRhIGFuZCBjb2RlIHN5bWJvbHMgZGlmZmVyZW50bHksCi0jIHNvIHVzZSB0aGlzIGdlbmVyYWwgYXBwcm9hY2guCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBzeW1ib2wgbmFtZSBhbmQgc3ltYm9sIGFkZHJlc3MKLWx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCi1sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4PSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAodm9pZCAqKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKGxpYltbXiBdXSpcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJsaWJcMlwiLCAodm9pZCAqKSBcJlwyfSwvcCciCi0KLSMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgotb3B0X2NyPQotY2FzZSAkYnVpbGRfb3MgaW4KLW1pbmd3KikKLSAgb3B0X2NyPWAkRUNITyAneFx7MCwxXH0nIHwgdHIgeCAnXDAxNSdgICMgb3B0aW9uIGNyIGluIHJlZ2V4cAotICA7OwotZXNhYwotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyc2NvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICAjIFRyYW5zZm9ybSBzeW1jb2RlLCBzeW1wYXQsIGFuZCBzeW1wcmZ4IGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotICBzeW14ZnJtPSJcXDEgJGFjX3N5bXByZnhcXDIgXFwyIgotCi0gICMgV3JpdGUgdGhlIHJhdyBhbmQgQyBpZGVudGlmaWVycy4KLSAgaWYgdGVzdCAiJGx0X2N2X25tX2ludGVyZmFjZSIgPSAiTVMgZHVtcGJpbiI7IHRoZW4KLSAgICAjIEZha2UgaXQgZm9yIGR1bXBiaW4gYW5kIHNheSBUIGZvciBhbnkgbm9uLXN0YXRpYyBmdW5jdGlvbgotICAgICMgYW5kIEQgZm9yIGFueSBnbG9iYWwgdmFyaWFibGUuCi0gICAgIyBBbHNvIGZpbmQgQysrIGFuZCBfX2Zhc3RjYWxsIHN5bWJvbHMgZnJvbSBNU1ZDKyssCi0gICAgIyB3aGljaCBzdGFydCB3aXRoIEAgb3IgPy4KLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSIkQVdLIFsnIlwKLSIgICAgIHtsYXN0X3NlY3Rpb249c2VjdGlvbjsgc2VjdGlvbj1cJCAzfTsiXAotIiAgICAgL1NlY3Rpb24gbGVuZ3RoIC4qI3JlbG9jcy4qKHBpY2sgYW55KS97aGlkZVtsYXN0X3NlY3Rpb25dPTF9OyJcCi0iICAgICBcJCAwIX4vRXh0ZXJuYWwgKlx8L3tuZXh0fTsiXAotIiAgICAgLyAwKyBVTkRFRiAve25leHR9OyAvIFVOREVGIFwoW158XVwpKigpL3tuZXh0fTsiXAotIiAgICAge2lmKGhpZGVbc2VjdGlvbl0pIG5leHR9OyJcCi0iICAgICB7Zj0wfTsgXCQgMH4vXChcKS4qXHwve2Y9MX07IHtwcmludGYgZiA/IFwiVCBcIiA6IFwiRCBcIn07IlwKLSIgICAgIHtzcGxpdChcJCAwLCBhLCAvXHx8XHIvKTsgc3BsaXQoYVsyXSwgcyl9OyJcCi0iICAgICBzWzFdfi9eW0A/XS97cHJpbnQgc1sxXSwgc1sxXTsgbmV4dH07IlwKLSIgICAgIHNbMV1+cHJmeCB7c3BsaXQoc1sxXSx0LFwiQFwiKTsgcHJpbnQgdFsxXSwgc3Vic3RyKHRbMV0sbGVuZ3RoKHByZngpKX0iXAotIiAgICAgJyBwcmZ4PV4kYWNfc3ltcHJmeF0iCi0gIGVsc2UKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qW1sJIF1dXCgkc3ltY29kZSRzeW1jb2RlKlwpW1sJIF1dW1sJIF1dKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgotICBmaQotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBwaXBlX3dvcmtzPW5vCi0KLSAgcm0gLWYgY29uZnRlc3QqCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmModm9pZCk7Ci12b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KLV9MVF9FT0YKLQotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCi0gICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkbmxpc3QpICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgotCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgJEdSRVAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiAkR1JFUCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PF9MVF9FT0YgPiBjb25mdGVzdC4kYWNfZXh0Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLV9MVF9FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQnCi0KLQkgIGNhdCA8PF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICB2b2lkICAgICAgICphZGRyZXNzOwotfQotbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tbXV0gPQotewotICB7ICJAUFJPR1JBTUAiLCAodm9pZCAqKSAwIH0sCi1fTFRfRU9GCi0JICAkU0VEICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC8iIDwgIiRubGlzdCIgfCAkR1JFUCAtdiBtYWluID4+IGNvbmZ0ZXN0LiRhY19leHQKLQkgIGNhdCA8PFxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKLSAgezAsICh2b2lkICopIDB9Ci19OwotCi0vKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KLSNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKLXN0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7Ci0gIHJldHVybiBsdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzOwotfQotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1fTFRfRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdHN0bS4kYWNfb2JqZXh0Ci0JICBsdF9zYXZlX0xJQlM9IiRMSUJTIgotCSAgbHRfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdHN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKSIKLQkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLQkgICAgcGlwZV93b3Jrcz15ZXMKLQkgIGZpCi0JICBMSUJTPSIkbHRfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkbHRfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFTX01FU1NBR0VfTE9HX0ZECi0gICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCogY29uZnRzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotXSkKLWlmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KLWZpCi1pZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChmYWlsZWQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQob2spCi1maQotCi1fTFRfREVDTChbZ2xvYmFsX3N5bWJvbF9waXBlXSwgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGVdLCBbMV0sCi0gICAgW1Rha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXNdKQotX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfdG9fY2RlY2xdLCBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2xdLCBbMV0sCi0gICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb25dKQotX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NdLAotICAgIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc10sIFsxXSwKLSAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyXSkKLV9MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXhdLAotICAgIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4XSwgWzFdLAotICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIgd2hlbiBsaWIgcHJlZml4IGlzIG5lZWRlZF0pCi1dKSAjIF9MVF9DTURfR0xPQkFMX1NZTUJPTFMKLQotCi0jIF9MVF9DT01QSUxFUl9QSUMoW1RBR05BTUVdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZnVuKFtfTFRfQ09NUElMRVJfUElDXSwKLVttNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKLV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPQotX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQotX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPQotCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDXSkKLW00X2lmKFskMV0sIFtDWFhdLCBbCi0gICMgQysrIHNwZWNpZmljIGNhc2VzIGZvciBwaWMsIHN0YXRpYywgd2wsIGV0Yy4KLSAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCi0KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBwb3dlcnBjKQotICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAotICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLSAgICAgICAgOzsKLSAgICAgIG02OGspCi0gICAgICAgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgICAgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAgICAgICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0gICAgbWluZ3cqIHwgY3lnd2luKiB8IG9zMiogfCBwdzMyKikKLSAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKLSAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCi0gICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCi0gICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcwotICAgICAgbTRfaWYoWyQxXSwgW0dDSl0sIFtdLAotCVtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCddKQotICAgICAgOzsKLSAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQotICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcwotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKLSAgICAgIDs7Ci0gICAgKmRqZ3BwKikKLSAgICAgICMgREpHUFAgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIGF0IGFsbAotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQotICAgICAgOzsKLSAgICBpbnRlcml4W1szLTldXSopCi0gICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgotICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCi0gICAgICA7OwotICAgIHN5c3Y0Kk1QKikKLSAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9LUtjb25mb3JtX3BpYwotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQk7OwotICAgICAgKikKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotICAgICpxbngqIHwgKm50byopCi0gICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQotICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJwotICAgICAgOzsKLSAgICAqKQotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbHNlCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4W1s0LTldXSopCi0JIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JICAjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgotCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQllbHNlCi0JICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLQlmaQotCTs7Ci0gICAgICBjaG9ydXMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JY3hjaDY4KikKLQkgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JICAjIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0iLS1ub19hdXRvX2luc3RhbnRpYXRpb24gLXUgX19tYWluIC11IF9fcHJlbWFpbiAtdSBfYWJvcnQgLXIgJENPT0xfRElSL2xpYi9saWJPcmIuYSAkTVZNRV9ESVIvbGliL0NDL2xpYkMuYSAkTVZNRV9ESVIvbGliL2NsYXNzaXgvbGliY3gucy5hIgotCSAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGRndXgqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBlYysrKikKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLQkgICAgOzsKLQkgIGdoY3gqKQotCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQotCSMgRnJlZUJTRCB1c2VzIEdOVSBDKysKLQk7OwotICAgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIENDKikKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCi0JICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgotCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCi0JICAgIGZpCi0JICAgIDs7Ci0JICBhQ0MqKQotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKLQkgICAgY2FzZSAkaG9zdF9jcHUgaW4KLQkgICAgaHBwYSo2NCp8aWE2NCopCi0JICAgICAgIyArWiB0aGUgZGVmYXVsdAotCSAgICAgIDs7Ci0JICAgICopCi0JICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgaW50ZXJpeCopCi0JIyBUaGlzIGlzIGM4OSwgd2hpY2ggaXMgTVMgVmlzdWFsIEMrKyAobm8gc2hhcmVkIGxpYnMpCi0JIyBBbnlvbmUgd2FudHMgdG8gZG8gYSBwb3J0PwotCTs7Ci0gICAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotCSAgICAjIENDIHBpYyBmbGFnIC1LUElDIGlzIHRoZSBkZWZhdWx0LgotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUpCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIEtDQyopCi0JICAgICMgS0FJIEMrKyBDb21waWxlcgotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCi0JICAgIDs7Ci0JICBpY3BjKiB8IGVjcGMqICkKLQkgICAgIyBJbnRlbCBDKysKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKLQkgICAgOzsKLQkgIHBnQ0MqIHwgcGdjcHAqKQotCSAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQkgICAgOzsKLQkgIGN4eCopCi0JICAgICMgQ29tcGFxIEMrKwotCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCi0JICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotCSAgICA7OwotCSAgeGxjKiB8IHhsQyopCi0JICAgICMgSUJNIFhMIDguMCBvbiBQUEMKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFwaWMnCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJwotCSAgICA7OwotCSAgKikKLQkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCi0JICAgICpTdW5cIEMqKQotCSAgICAgICMgU3VuIEMrKyA1LjkKLQkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0JICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBseW54b3MqKQotCTs7Ci0gICAgICBtODhrKikKLQk7OwotICAgICAgbXZzKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgY3h4KikKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctVyBjLGV4cG9ydGFsbCcKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBuZXRic2QqKQotCTs7Ci0gICAgICAqcW54KiB8ICpudG8qKQotICAgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQotICAgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCi0gICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKLSAgICAgICAgOzsKLSAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgS0NDKikKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJwotCSAgICA7OwotCSAgUkNDKikKLQkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJwotCSAgICA7OwotCSAgY3h4KikKLQkgICAgIyBEaWdpdGFsL0NvbXBhcSBDKysKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKLQkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Ci0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgcHNvcyopCi0JOzsKLSAgICAgIHNvbGFyaXMqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKLQkgICAgOzsKLQkgIGdjeCopCi0JICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKLQkgICAgOzsKLQkgICopCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBzdW5vczQqKQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0JICBDQyopCi0JICAgICMgU3VuIEMrKyA0LngKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJwotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotCSAgICA7OwotCSAgbGNjKikKLQkgICAgIyBMdWNpZAotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCi0JICAgIDs7Ci0JICAqKQotCSAgICA7OwotCWVzYWMKLQk7OwotICAgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgQ0MqKQotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLQkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHRhbmRlbSopCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQkgIE5DQyopCi0JICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAotCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotCSAgICA7OwotCSAgKikKLQkgICAgOzsKLQllc2FjCi0JOzsKLSAgICAgIHZ4d29ya3MqKQotCTs7Ci0gICAgICAqKQotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KLQk7OwotICAgIGVzYWMKLSAgZmkKLV0sCi1bCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJwotCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4KikKLSAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBwb3dlcnBjKQotICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAotICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLSAgICAgICAgOzsKLSAgICAgIG02OGspCi0gICAgICAgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgICAgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKLSAgICAgICAgICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KLSAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBjeWd3aW4qIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKLSAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCi0gICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCi0JW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCi0gICAgICA7OwotCi0gICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KLSAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCi0gICAgICA7OwotCi0gICAgaHB1eCopCi0gICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKLSAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBocHBhKjY0KnxpYTY0KikKLQkjICtaIHRoZSBkZWZhdWx0Ci0JOzsKLSAgICAgICopCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKLQk7OwotICAgICAgZXNhYwotICAgICAgOzsKLQotICAgIGludGVyaXhbWzMtOV1dKikKLSAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCi0gICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KLSAgICAgIDs7Ci0KLSAgICBtc2Rvc2RqZ3BwKikKLSAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCi0gICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCi0gICAgICBlbmFibGVfc2hhcmVkPW5vCi0gICAgICA7OwotCi0gICAgKm50byogfCAqcW54KikKLSAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCi0gICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCi0gICAgICBmaQotICAgICAgOzsKLQotICAgICopCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJwotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICAjIFBPUlRNRSBDaGVjayBmb3IgZmxhZyB0byBwYXNzIGxpbmtlciBmbGFncyB0aHJvdWdoIHRoZSBzeXN0ZW0gY29tcGlsZXIuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeCopCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKLSAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgZWxzZQotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBtaW5ndyogfCBjeWd3aW4qIHwgcHczMiogfCBvczIqKQotICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZwotICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KLSAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKLQlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKLSAgICAgIDs7Ci0KLSAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0Ci0gICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCi0gICAgICBjYXNlICRob3N0X2NwdSBpbgotICAgICAgaHBwYSo2NCp8aWE2NCopCi0JIyArWiB0aGUgZGVmYXVsdAotCTs7Ci0gICAgICAqKQotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPwotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKLSAgICAgIDs7Ci0KLSAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUpCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgaWNjKiB8IGVjYyogfCBpZm9ydCopCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCi0gICAgICAgIDs7Ci0gICAgICBwZ2NjKiB8IHBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikKLSAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBjb21waWxlcnMgKCpub3QqIHRoZSBQZW50aXVtIGdjYyBjb21waWxlciwKLQkjIHdoaWNoIGxvb2tzIHRvIGJlIGEgZGVhZCBwcm9qZWN0KQotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZwaWMnCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgICAgOzsKLSAgICAgIGNjYyopCi0gICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KLSAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLSAgICAgICAgOzsKLSAgICAgIHhsKikKLQkjIElCTSBYTCBDIDguMC9Gb3J0cmFuIDEwLjEgb24gUFBDCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0JX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcXBpYycKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1xc3RhdGljbGluaycKLQk7OwotICAgICAgKikKLQljYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KLQkqU3VuXCBDKikKLQkgICMgU3VuIEMgNS45Ci0JICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLQkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotCSAgOzsKLQkqU3VuXCBGKikKLQkgICMgU3VuIEZvcnRyYW4gOC4zIHBhc3NlcyBhbGwgdW5yZWNvZ25pemVkIGZsYWdzIHRvIHRoZSBsaW5rZXIKLQkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0JICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9JycKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgbmV3c29zNikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgICpudG8qIHwgKnFueCopCi0gICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQotICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJwotICAgICAgOzsKLQotICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJwotICAgICAgOzsKLQotICAgIHJkb3MqKQotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgIGY3NyogfCBmOTAqIHwgZjk1KikKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJzs7Ci0gICAgICAqKQotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJzs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKikKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJwotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgotCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtjb25mb3JtX3BpYycKLQlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJwotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKLSAgICAgIDs7Ci0KLSAgICB1bmljb3MqKQotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgdXRzNCopCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJwotICAgICAgOzsKLQotICAgICopCi0gICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLV0pCi1jYXNlICRob3N0X29zIGluCi0gICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgotICAqZGpncHAqKQotICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KLSAgICA7OwotICAqKQotICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKUAmdEBtNF9pZihbJDFdLFtdLFsgLURQSUNdLFttNF9pZihbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pIgotICAgIDs7Ci1lc2FjCi1BQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpXSkKLV9MVF9UQUdERUNMKFt3bF0sIFtsdF9wcm9nX2NvbXBpbGVyX3dsXSwgWzFdLAotCVtIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyXSkKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgotIwotaWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSI7IHRoZW4KLSAgX0xUX0NPTVBJTEVSX09QVElPTihbaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkgd29ya3NdLAotICAgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzLCAkMSldLAotICAgIFskX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpQCZ0QG00X2lmKFskMV0sW10sWyAtRFBJQ10sW200X2lmKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSldLCBbXSwKLSAgICBbY2FzZSAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIGluCi0gICAgICIiIHwgIiAiKikgOzsKLSAgICAgKikgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSIgOzsKLSAgICAgZXNhY10sCi0gICAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KLSAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ub10pCi1maQotX0xUX1RBR0RFQ0woW3BpY19mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfcGljXSwgWzFdLAotCVtBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHNdKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCi0jCi13bD0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkgZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpXCIKLV9MVF9MSU5LRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrc10sCi0gIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MsICQxKSwKLSAgJGx0X3RtcF9zdGF0aWNfZmxhZywKLSAgW10sCi0gIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9XSkKLV9MVF9UQUdERUNMKFtsaW5rX3N0YXRpY19mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfc3RhdGljXSwgWzFdLAotCVtDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nXSkKLV0pIyBfTFRfQ09NUElMRVJfUElDCi0KLQotIyBfTFRfTElOS0VSX1NITElCUyhbVEFHTkFNRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLW00X2RlZnVuKFtfTFRfTElOS0VSX1NITElCU10sCi1bQUNfUkVRVUlSRShbTFRfUEFUSF9MRF0pZG5sCi1BQ19SRVFVSVJFKFtMVF9QQVRIX05NXSlkbmwKLW00X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAotbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAotbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKLW00X3JlcXVpcmUoW19MVF9DTURfR0xPQkFMX1NZTUJPTFNdKWRubAotbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCi1tNF9pZihbJDFdLCBbQ1hYXSwgWwotICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICBjYXNlICRob3N0X29zIGluCi0gIGFpeFtbNC05XV0qKQotICAgICMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotICAgICMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLSAgICBpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotICAgIGVsc2UKLSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotICAgIGZpCi0gICAgOzsKLSAgcHczMiopCi0gICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9IiRsdGRsbF9jbWRzIgotICA7OwotICBjeWd3aW4qIHwgbWluZ3cqKQotICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvOy9eLipbWyBdXV9fbm1fXy9zL14uKltbIF1dX19ubV9fXChbW14gXV0qXClbWyBdXVtbXiBdXSovXDEgREFUQS87L15JW1sgXV0vZDsvXltbQUlUV11dW1sgXV0vcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSAgOzsKLSAgKikKLSAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotICA7OwotICBlc2FjCi0gIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionXQotXSwgWwotICBydW5wYXRoX3Zhcj0KLSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQotICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCi0gIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9Ci0gIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQotICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPW5vCi0gIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCi0gIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Ci0gIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0gIF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KLSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCi0gIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQotICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KLSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci0gIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCi0gIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCi0gIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCi0gIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KLSAgX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQotICBfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQotICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0KLSAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpPQotICBfTFRfVEFHVkFSKHRocmVhZF9zYWZlX2ZsYWdfc3BlYywgJDEpPQotICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Ci0gICMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKLSAgIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKLSAgX0xUX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKT0KLSAgIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGV4dGVuZGVkIHJlZ2V4cCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSAgIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotICAjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCi0gICMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KLSAgIyBBbHRob3VnaCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaXMgYSB2YWxpZCBzeW1ib2wgQyBuYW1lLCBtb3N0IGEub3V0Ci0gICMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgotICAjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKLSAgIyByZWx5IG9uIHRoaXMgc3ltYm9sIG5hbWUsIGl0J3MgcHJvYmFibHkgZmluZSB0byBuZXZlciBpbmNsdWRlIGl0IGluCi0gICMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCi0gICMgRXhjbHVkZSBzaGFyZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gc3ltYm9scy4KLWRubCBOb3RlIGFsc28gYWRqdXN0IGV4Y2x1ZGVfZXhwc3ltcyBmb3IgQysrIGFib3ZlLgotICBleHRyYWN0X2V4cHN5bXNfY21kcz0KLQotICBjYXNlICRob3N0X29zIGluCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCi0gICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgotICAgICAgd2l0aF9nbnVfbGQ9bm8KLSAgICBmaQotICAgIDs7Ci0gIGludGVyaXgqKQotICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCi0gICAgd2l0aF9nbnVfbGQ9eWVzCi0gICAgOzsKLSAgb3BlbmJzZCopCi0gICAgd2l0aF9nbnVfbGQ9bm8KLSAgICA7OwotICBlc2FjCi0KLSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gICAgd2xhcmM9JyR7d2x9JwotCi0gICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKLSAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KLSAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLSAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgZWxzZQotICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotICAgIGZpCi0gICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCi0gICAgY2FzZSBgJExEIC12IDI+JjFgIGluCi0gICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQotICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KLSAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KLSAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCi0gICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgIGFpeFtbMy05XV0qKQotICAgICAgIyBPbiBBSVgvUFBDLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCi0JX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCWNhdCA8PF9MVF9FT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCi0qKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KLSoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQotKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAotKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotX0xUX0VPRgotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBhbWlnYW9zKikKLSAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0gICAgICBwb3dlcnBjKQotICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAotICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJwotICAgICAgICA7OwotICAgICAgbTY4aykKLSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgYmVvcyopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0JIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYwotCSMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICBlbHNlCi0JX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCi0gICAgICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAotICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLSAgICAgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bW0FJVFddXVtbIF1dL3MvLipbWyBdXS8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJwotCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKLQkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgotCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgotCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCWVsc2UKLQkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKLQlmaX4KLQkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGludGVyaXhbWzMtOV1dKikKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0gICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCi0gICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5Ci0gICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0gICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCi0gICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCi0gICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKLSAgICAgIDs7Ci0KLSAgICBnbnUqIHwgbGludXgqIHwgdHBmKiB8IGsqYnNkKi1nbnUpCi0gICAgICB0bXBfZGlldD1ubwotICAgICAgaWYgdGVzdCAiJGhvc3Rfb3MiID0gbGludXgtZGlldGxpYmM7IHRoZW4KLQljYXNlICRjY19iYXNlbmFtZSBpbgotCSAgZGlldFwgKikgdG1wX2RpZXQ9eWVzOzsJIyBsaW51eC1kaWV0bGliYyB3aXRoIHN0YXRpYyBsaW5raW5nICghZGlldC1keW4pCi0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRFR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsIFwKLQkgJiYgdGVzdCAiJHRtcF9kaWV0IiA9IG5vCi0gICAgICB0aGVuCi0JdG1wX2FkZGZsYWc9Ci0JdG1wX3NoYXJlZGZsYWc9Jy1zaGFyZWQnCi0JY2FzZSAkY2NfYmFzZW5hbWUsJGhvc3RfY3B1IGluCi0gICAgICAgIHBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKLQkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcnCi0JICA7OwotCXBnZjc3KiB8IHBnZjkwKiB8IHBnZjk1KikJIyBQb3J0bGFuZCBHcm91cCBmNzcgYW5kIGY5MCBjb21waWxlcnMKLQkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgdG1wX2FkZGZsYWc9JyAkcGljX2ZsYWcgLU1ub21haW4nIDs7Ci0JZWNjKixpYTY0KiB8IGljYyosaWE2NCopCSMgSW50ZWwgQyBjb21waWxlciBvbiBpYTY0Ci0JICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMnIDs7Ci0JZWZjKixpYTY0KiB8IGlmb3J0KixpYTY0KikJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyIG9uIGlhNjQKLQkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYyAtbm9mb3JfbWFpbicgOzsKLQlpZmMqIHwgaWZvcnQqKQkJCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlcgotCSAgdG1wX2FkZGZsYWc9JyAtbm9mb3JfbWFpbicgOzsKLQl4bFtbY0NdXSopCQkJIyBJQk0gWEwgQyA4LjAgb24gUFBDIChkZWFsIHdpdGggeGxmIGJlbG93KQotCSAgdG1wX3NoYXJlZGZsYWc9Jy1xbWtzaHJvYmonCi0JICB0bXBfYWRkZmxhZz0gOzsKLQllc2FjCi0JY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCi0JKlN1blwgQyopCQkJIyBTdW4gQyA1LjkKLQkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkRUNITyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0JICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllcwotCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OwotCSpTdW5cIEYqKQkJCSMgU3VuIEZvcnRyYW4gOC4zCi0JICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7Ci0JZXNhYwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0KLSAgICAgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgotICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCSAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCSAgICAkQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJwotICAgICAgICBmaQotCi0JY2FzZSAkY2NfYmFzZW5hbWUgaW4KLQl4bGYqKQotCSAgIyBJQk0gWEwgRm9ydHJhbiAxMC4xIG9uIFBQQyBjYW5ub3QgY3JlYXRlIHNoYXJlZCBsaWJzIGl0c2VsZgotCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSctLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgLS1uby13aG9sZS1hcmNoaXZlJwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Ci0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nLXJwYXRoICRsaWJkaXInCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC1vICRsaWInCi0JICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkgICAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KLQkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC12ZXJzaW9uLXNjcmlwdCAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKLQkgIGZpCi0JICA7OwotCWVzYWMKLSAgICAgIGVsc2UKLSAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBuZXRic2QqKQotICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJwotCXdsYXJjPQotICAgICAgZWxzZQotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc29sYXJpcyopCi0gICAgICBpZiAkTEQgLXYgMj4mMSB8ICRHUkVQICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KLQlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JY2F0IDw8X0xUX0VPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5Ci0qKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1fTFRfRU9GCi0gICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0gICAgICBlbHNlCi0JX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQotICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCi0gICAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjFbWzAtNV1dLiopCi0JX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCWNhdCA8PF9MVF9FT0YgMT4mMgotCi0qKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAotKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCi0qKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCi0qKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQotKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKLSoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgotCi1fTFRfRU9GCi0JOzsKLQkqKQotCSAgIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cwotCSAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKLQkgICMgRFRfUlVOUEFUSCB0YWcgZnJvbSBleGVjdXRhYmxlcyBhbmQgbGlicmFyaWVzLiAgQnV0IGRvaW5nIHNvCi0JICAjIHJlcXVpcmVzIHRoYXQgeW91IGNvbXBpbGUgZXZlcnl0aGluZyB0d2ljZSwgd2hpY2ggaXMgYSBwYWluLgotCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCSAgZWxzZQotCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JICBmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICB3bGFyYz0KLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZWxzZQotCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vOyB0aGVuCi0gICAgICBydW5wYXRoX3Zhcj0KLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQotICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KLSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KLSAgICBmaQotICBlbHNlCi0gICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBhaXgzKikKLSAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAotICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKLSAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCi0gICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KLQkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLQkjIGJyb2tlbiBjb2xsZWN0Mi4KLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFpeFtbNC05XV0qKQotICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0Ci0JIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCi0Jbm9fZW50cnlfZmxhZz0iIgotICAgICAgZWxzZQotCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgotCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KLQlpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCi0JICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWVsc2UKLQkgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJwotCWZpCi0JYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCi0JIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCi0JIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0JIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KLQljYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCi0JICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KLQkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCi0JICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCi0JICAgIGJyZWFrCi0JICBmaQotCSAgZG9uZQotCSAgOzsKLQllc2FjCi0KLQlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JwotCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKLSAgICAgIGZpCi0KLSAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KLSAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQotICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KLSAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90Ci0gICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KLQotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKLSAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQljYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKLQkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKLQkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKLQkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKLQkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCi0JICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLQkgIHRoZW4KLQkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgotCSAgOgotCSAgZWxzZQotCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAotCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAotCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci0JICBmaQotCSAgOzsKLQllc2FjCi0Jc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCi0JaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKLQlmaQotICAgICAgZWxzZQotCSMgbm90IHVzaW5nIGdjYwotCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKLQkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgotCSAgc2hhcmVkX2ZsYWc9Jy1HJwotCWVsc2UKLQkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKLQkgIGVsc2UKLQkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAotICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KLSAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCi0gICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KLQkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKLQkjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCi0gICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgotICAgICAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCi0gICAgICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCi0gICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gJEVDSE8gIlgke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiB8ICRYc2VkOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKLQkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0JZWxzZQotCSAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KLQkgIyBlbXB0eSBleGVjdXRhYmxlLgotCSBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAotCSBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCi0JICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCi0JICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKLQkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm9rJwotCSAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCi0JICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKLQkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJwotCWZpCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIGFtaWdhb3MqKQotICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgIHBvd2VycGMpCi0gICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0Ci0gICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPScnCi0gICAgICAgIDs7Ci0gICAgICBtNjhrKQotICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICBic2RpW1s0NV1dKikKLSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9LXJkeW5hbWljCi0gICAgICA7OwotCi0gICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCi0gICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyAnCi0gICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKLSAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCi0gICAgICBsaWJleHQ9bGliCi0gICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KLSAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgotICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGAkRUNITyAiWCRkZXBsaWJzIiB8ICRYc2VkIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCi0gICAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgotICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSk9J3RydWUnCi0gICAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgotICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J2xpYiAtT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKLSAgICAgIF9MVF9UQUdWQVIoZml4X3NyY2ZpbGVfcGF0aCwgJDEpPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKLSAgICAgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcwotICAgICAgOzsKLQotICAgIGRhcndpbiogfCByaGFwc29keSopCi0gICAgICBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUygkMSkKLSAgICAgIDs7Ci0KLSAgICBkZ3V4KikKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgIGZyZWVic2QxKikKLSAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKLSAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgICAjIGV4dHJhIHNwYWNlKS4KLSAgICBmcmVlYnNkMi4yKikKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgotICAgIGZyZWVic2QyKikKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBocHV4OSopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICBlbHNlCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCi0gICAgICBmaQotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLQotICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLSAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotICAgICAgOzsKLQotICAgIGhwdXgxMCopCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nK2IgJGxpYmRpcicKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0JX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcwotCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0JIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQlfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaHB1eDExKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqKQotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCWlhNjQqKQotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JY2FzZSAkaG9zdF9jcHUgaW4KLQlocHBhKjY0KikKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JaWE2NCopCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgotCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0KLQljYXNlICRob3N0X2NwdSBpbgotCWhwcGEqNjQqfGlhNjQqKQotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQkgIDs7Ci0JKikKLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcwotCSAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKLQotCSAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKLQkgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCSMgVHJ5IHRvIHVzZSB0aGUgLWV4cG9ydGVkX3N5bWJvbCBsZCBvcHRpb24sIGlmIGl0IGRvZXMgbm90Ci0JIyB3b3JrLCBhc3N1bWUgdGhhdCAtZXhwb3J0c19maWxlIGRvZXMgbm90IHdvcmsgZWl0aGVyIGFuZAotCSMgaW1wbGljaXRseSBleHBvcnQgYWxsIHN5bWJvbHMuCi0gICAgICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCi0gICAgICAgIExERkxBR1M9IiRMREZMQUdTIC1zaGFyZWQgJHt3bH0tZXhwb3J0ZWRfc3ltYm9sICR7d2x9Zm9vICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfS9kZXYvbnVsbCIKLSAgICAgICAgQUNfTElOS19JRkVMU0UoaW50IGZvbyh2b2lkKSB7fSwKLSAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAke3dsfS1leHBvcnRzX2ZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICAgICAgKQotICAgICAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotICAgICAgZWxzZQotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtZXhwb3J0c19maWxlICRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgICAgZmkKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0nbm8nCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgICAgX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9eWVzCi0gICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLSAgICAgIDs7Ci0KLSAgICBuZXRic2QqKQotICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAotICAgICAgZWxzZQotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgotICAgICAgZmkKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIDs7Ci0KLSAgICBuZXdzb3M2KQotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgICpudG8qIHwgKnFueCopCi0gICAgICA7OwotCi0gICAgb3BlbmJzZCopCi0gICAgICBpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgotCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0JX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcwotCWlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMnCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKLQkgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0JZWxzZQotCSAgY2FzZSAkaG9zdF9vcyBpbgotCSAgIG9wZW5ic2RbWzAxXV0uKiB8IG9wZW5ic2QyLltbMC03XV0gfCBvcGVuYnNkMi5bWzAtN11dLiopCi0JICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLQkgICAgIDs7Ci0JICAgKikKLQkgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotCSAgICAgOzsKLQkgIGVzYWMKLQlmaQotICAgICAgZWxzZQotCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgb3MyKikKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKLSAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJEVDSE8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSk9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICAgIDs7Ci0KLSAgICBvc2YzKikKLSAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0gICAgICBmaQotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06Ci0gICAgICA7OwotCi0gICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgICAgZWxzZQotCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBwcmludGYgIiVzXFxuIiAiLWhpZGRlbiI+PiAkbGliLmV4cH4KLQkkQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LWlucHV0ICR7d2x9JGxpYi5leHAgJGNvbXBpbGVyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRSTSAkbGliLmV4cCcKLQotCSMgQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCi0gICAgICBmaQotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLSAgICAgIDs7Ci0KLSAgICBzb2xhcmlzKikKLSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16IGRlZnMnCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCXdsYXJjPScke3dsfScKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgotCSAgJENDIC1zaGFyZWQgJHt3bH0teiAke3dsfXRleHQgJHt3bH0tTSAke3dsfSRsaWIuZXhwICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKLSAgICAgIGVsc2UKLQljYXNlIGAkQ0MgLVYgMj4mMWAgaW4KLQkqIkNvbXBpbGVycyA1LjAiKikKLQkgIHdsYXJjPScnCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JICAkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kUk0gJGxpYi5leHAnCi0JICA7OwotCSopCi0JICB3bGFyYz0nJHt3bH0nCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJwotCSAgOzsKLQllc2FjCi0gICAgICBmaQotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OwotICAgICAgKikKLQkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAotCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuICBHQ0MgZGlzY2FyZHMgaXQgd2l0aG91dCBgJHdsJywKLQkjIGJ1dCBpcyBjYXJlZnVsIGVub3VnaCBub3QgdG8gcmVvcmRlci4KLQkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQotCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0JICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKLQllbHNlCi0JICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0gICAgICA7OwotCi0gICAgc3Vub3M0KikKLSAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KLQkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCi0JIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgIHN5c3Y0KQotICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KLQlzbmkpCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KLQk7OwotCXNpZW1lbnMpCi0JICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKLQkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0JICBfTFRfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotICAgICAgICA7OwotCW1vdG9yb2xhKQotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICA7OwotCi0gICAgc3lzdjQuMyopCi0gICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nLUJleHBvcnQnCi0gICAgICA7OwotCi0gICAgc3lzdjQqTVAqKQotICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0JaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCi0JX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bWzAyNF1dKikKLSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JwotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZWxzZQotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0gICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAotICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bwotICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0gICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0Ci0gICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKLSAgICAgICMgYXMgLXogZGVmcy4KLSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JwotICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LG5vZGVmcycKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SLCRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKLSAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKLSAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLSAgICAgIGVsc2UKLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotICAgICAgZmkKLSAgICAgIDs7Ci0KLSAgICB1dHM0KikKLSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKLSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgOzsKLQotICAgICopCi0gICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgeCRob3N0X3ZlbmRvciA9IHhzbmk7IHRoZW4KLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgIHN5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKLQlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CbGFyZ2VkeW5zeW0nCi0JOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICBmaQotXSkKLUFDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpXSkKLXRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotX0xUX1RBR1ZBUih3aXRoX2dudV9sZCwgJDEpPSR3aXRoX2dudV9sZAotCi1fTFRfREVDTChbXSwgW2xpYmV4dF0sIFswXSwgW09sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKV0pZG5sCi1fTFRfREVDTChbXSwgW3NocmV4dF9jbWRzXSwgWzFdLCBbU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIildKWRubAotX0xUX0RFQ0woW10sIFtleHRyYWN0X2V4cHN5bXNfY21kc10sIFsyXSwKLSAgICBbVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZV0pCi0KLSMKLSMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KLSMKLWNhc2UgIngkX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpIiBpbgoteHx4eWVzKQotICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCi0gIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKLQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBjYXNlICRfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIGluCi0gICAgKid+JyopCi0gICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCi0gICAgICA7OwotICAgICckQ0MgJyopCi0gICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCi0gICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKLSAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW5dKQotICAgICAgJFJNIGNvbmZ0ZXN0KgotICAgICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgICAgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICAgIHNvbmFtZT1jb25mdGVzdAotICAgICAgICBsaWI9Y29uZnRlc3QKLSAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0Ci0gICAgICAgIGRlcGxpYnM9Ci0gICAgICAgIHdsPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKQotCXBpY19mbGFnPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkKLSAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKLSAgICAgICAgbGlua2VyX2ZsYWdzPS12Ci0gICAgICAgIHZlcnN0cmluZz0KLSAgICAgICAgb3V0cHV0X29iamRpcj0uCi0gICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKLSAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpCi0gICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KLSAgICAgICAgaWYgQUNfVFJZX0VWQUwoX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSAyXD5cJjEgXHwgJEdSRVAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkKLSAgICAgICAgdGhlbgotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0gICAgICAgIGVsc2UKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKLSAgICAgICAgZmkKLSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCi0gICAgICBlbHNlCi0gICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgICAgZmkKLSAgICAgICRSTSBjb25mdGVzdCoKLSAgICAgIEFDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSldKQotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLV9MVF9UQUdERUNMKFtidWlsZF9saWJ0b29sX25lZWRfbGNdLCBbYXJjaGl2ZV9jbWRzX25lZWRfbGNdLCBbMF0sCi0gICAgW1doZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXNdKQotX0xUX1RBR0RFQ0woW2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lc10sCi0gICAgW2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNdLCBbMF0sCi0gICAgW1doZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWNdKQotX0xUX1RBR0RFQ0woW10sIFtleHBvcnRfZHluYW1pY19mbGFnX3NwZWNdLCBbMV0sCi0gICAgW0NvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnNdKQotX0xUX1RBR0RFQ0woW10sIFt3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY10sIFsxXSwKLSAgICBbQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzXSkKLV9MVF9UQUdERUNMKFtdLCBbY29tcGlsZXJfbmVlZHNfb2JqZWN0XSwgWzFdLAotICAgIFtXaGV0aGVyIHRoZSBjb21waWxlciBjb3BlcyB3aXRoIHBhc3Npbmcgbm8gb2JqZWN0cyBkaXJlY3RseV0pCi1fTFRfVEFHREVDTChbXSwgW29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNdLCBbMl0sCi0gICAgW0NyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmVdKQotX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc10sIFsyXSwKLSAgICBbQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlXSkKLV9MVF9UQUdERUNMKFtdLCBbYXJjaGl2ZV9jbWRzXSwgWzJdLCBbQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIHNoYXJlZCBhcmNoaXZlXSkKLV9MVF9UQUdERUNMKFtdLCBbYXJjaGl2ZV9leHBzeW1fY21kc10sIFsyXSkKLV9MVF9UQUdERUNMKFtdLCBbbW9kdWxlX2NtZHNdLCBbMl0sCi0gICAgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgaWYgZGlmZmVyZW50IGZyb20gYnVpbGRpbmcKLSAgICBhIHNoYXJlZCBhcmNoaXZlLl0pCi1fTFRfVEFHREVDTChbXSwgW21vZHVsZV9leHBzeW1fY21kc10sIFsyXSkKLV9MVF9UQUdERUNMKFtdLCBbd2l0aF9nbnVfbGRdLCBbMV0sCi0gICAgW1doZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIHdpdGggR05VIGxkIG9yIG5vdF0pCi1fTFRfVEFHREVDTChbXSwgW2FsbG93X3VuZGVmaW5lZF9mbGFnXSwgWzFdLAotICAgIFtGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdF0pCi1fTFRfVEFHREVDTChbXSwgW25vX3VuZGVmaW5lZF9mbGFnXSwgWzFdLAotICAgIFtGbGFnIHRoYXQgZW5mb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHNdKQotX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXSwgWzFdLAotICAgIFtGbGFnIHRvIGhhcmRjb2RlICRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSAgICBUaGlzIG11c3Qgd29yayBldmVuIGlmICRsaWJkaXIgZG9lcyBub3QgZXhpc3RdKQotX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXSwgWzFdLAotICAgIFtbSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgJGxpYmRpciBpbnRvIGEgYmluYXJ5Ci0gICAgZHVyaW5nIGxpbmtpbmcuICBUaGlzIG11c3Qgd29yayBldmVuIGlmICRsaWJkaXIgZG9lcyBub3QgZXhpc3RdXSkKLV9MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl0sIFsxXSwKLSAgICBbV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlICItcnBhdGgiIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudF0pCi1fTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2RpcmVjdF0sIFswXSwKLSAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKLSAgICBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeV0pCi1fTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZV0sIFswXSwKLSAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMKLSAgICBESVIgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeSBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMKLSAgICAiYWJzb2x1dGUiLCBpLmUgaW1wb3NzaWJsZSB0byBjaGFuZ2UgYnkgc2V0dGluZyAke3NobGlicGF0aF92YXJ9IGlmIHRoZQotICAgIGxpYnJhcnkgaXMgcmVsb2NhdGVkXSkKLV9MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbWludXNfTF0sIFswXSwKLSAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKLSAgICBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKLV9MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl0sIFswXSwKLSAgICBbU2V0IHRvICJ5ZXMiIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIKLSAgICBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKLV9MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfYXV0b21hdGljXSwgWzBdLAotICAgIFtTZXQgdG8gInllcyIgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIKLSAgICBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZAotICAgIGFnYWluc3QgaXRdKQotX0xUX1RBR0RFQ0woW10sIFtpbmhlcml0X3JwYXRoXSwgWzBdLAotICAgIFtTZXQgdG8geWVzIGlmIGxpbmtlciBhZGRzIHJ1bnRpbWUgcGF0aHMgb2YgZGVwZW5kZW50IGxpYnJhcmllcwotICAgIHRvIHJ1bnRpbWUgcGF0aCBsaXN0XSkKLV9MVF9UQUdERUNMKFtdLCBbbGlua19hbGxfZGVwbGlic10sIFswXSwKLSAgICBbV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzXSkKLV9MVF9UQUdERUNMKFtdLCBbZml4X3NyY2ZpbGVfcGF0aF0sIFsxXSwKLSAgICBbRml4IHRoZSBzaGVsbCB2YXJpYWJsZSAkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyXSkKLV9MVF9UQUdERUNMKFtdLCBbYWx3YXlzX2V4cG9ydF9zeW1ib2xzXSwgWzBdLAotICAgIFtTZXQgdG8gInllcyIgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWRdKQotX0xUX1RBR0RFQ0woW10sIFtleHBvcnRfc3ltYm9sc19jbWRzXSwgWzJdLAotICAgIFtUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzXSkKLV9MVF9UQUdERUNMKFtdLCBbZXhjbHVkZV9leHBzeW1zXSwgWzFdLAotICAgIFtTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzXSkKLV9MVF9UQUdERUNMKFtdLCBbaW5jbHVkZV9leHBzeW1zXSwgWzFdLAotICAgIFtTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWRdKQotX0xUX1RBR0RFQ0woW10sIFtwcmVsaW5rX2NtZHNdLCBbMl0sCi0gICAgW0NvbW1hbmRzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyBwcm9ncmFtcyAoYWdhaW5zdCBsaWJyYXJpZXMpIHdpdGggdGVtcGxhdGVzXSkKLV9MVF9UQUdERUNMKFtdLCBbZmlsZV9saXN0X3NwZWNdLCBbMV0sCi0gICAgW1NwZWNpZnkgZmlsZW5hbWUgY29udGFpbmluZyBpbnB1dCBmaWxlc10pCi1kbmwgRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50ZWQKLWRubCBfTFRfVEFHREVDTChbXSwgW3RocmVhZF9zYWZlX2ZsYWdfc3BlY10sIFsxXSwKLWRubCAgICBbQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQgc2FmZSBvYmplY3RzXSkKLV0pIyBfTFRfTElOS0VSX1NITElCUwotCi0KLSMgX0xUX0xBTkdfQ19DT05GSUcoW1RBR10pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgQyBjb21waWxlciBhcmUgc3VpdGFibHkKLSMgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRyB0byB3cml0ZQotIyB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCi1tNF9kZWZ1bihbX0xUX0xBTkdfQ19DT05GSUddLAotW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKLWx0X3NhdmVfQ0M9IiRDQyIKLUFDX0xBTkdfUFVTSChDKQotCi0jIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9YwotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCi1vYmpleHQ9bwotX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0Ci0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi1sdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDsiCi0KLSMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi1sdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKCl7cmV0dXJuKDApO30nCi0KLV9MVF9UQUdfQ09NUElMRVIKLSMgU2F2ZSB0aGUgZGVmYXVsdCBjb21waWxlciwgc2luY2UgaXQgZ2V0cyBvdmVyd3JpdHRlbiB3aGVuIHRoZSBvdGhlcgotIyB0YWdzIGFyZSBiZWluZyB0ZXN0ZWQsIGFuZCBfTFRfVEFHVkFSKGNvbXBpbGVyLCBbXSkgaXMgYSBOT1AuCi1jb21waWxlcl9ERUZBVUxUPSRDQwotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi1fTFRfTElOS0VSX0JPSUxFUlBMQVRFCi0KLWlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KLSAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCi0gIF9MVF9DT01QSUxFUl9QSUMoJDEpCi0gIF9MVF9DT01QSUxFUl9DX08oJDEpCi0gIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQotICBfTFRfTElOS0VSX1NITElCUygkMSkKLSAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKLSAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQotICBMVF9TWVNfRExPUEVOX1NFTEYKLSAgX0xUX0NNRF9TVFJJUExJQgotCi0gICMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAotICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCi0gIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKLQotICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCi0gIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0gICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi0gIGNhc2UgJGhvc3Rfb3MgaW4KLSAgYWl4MyopCi0gICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICAgIGZpCi0gICAgOzsKLQotICBhaXhbWzQtOV1dKikKLSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCi0gICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICAgIGZpCi0gICAgOzsKLSAgZXNhYwotICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCi0KLSAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQotICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KLSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCi0gIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKLQotICBfTFRfQ09ORklHKCQxKQotZmkKLUFDX0xBTkdfUE9QCi1DQz0iJGx0X3NhdmVfQ0MiCi1dKSMgX0xUX0xBTkdfQ19DT05GSUcKLQotCi0jIF9MVF9QUk9HX0NYWAotIyAtLS0tLS0tLS0tLS0KLSMgU2luY2UgQUNfUFJPR19DWFggaXMgYnJva2VuLCBpbiB0aGF0IGl0IHJldHVybnMgZysrIGlmIHRoZXJlIGlzIG5vIGMrKwotIyBjb21waWxlciwgd2UgaGF2ZSBvdXIgb3duIHZlcnNpb24gaGVyZS4KLW00X2RlZnVuKFtfTFRfUFJPR19DWFhdLAotWwotcHVzaGRlZihbQUNfTVNHX0VSUk9SXSwgW19sdF9jYXVnaHRfQ1hYX2Vycm9yPXllc10pCi1BQ19QUk9HX0NYWAotaWYgdGVzdCAtbiAiJENYWCIgJiYgKCB0ZXN0ICJYJENYWCIgIT0gIlhubyIgJiYKLSAgICAoICh0ZXN0ICJYJENYWCIgPSAiWGcrKyIgJiYgYGcrKyAtdiA+L2Rldi9udWxsIDI+JjFgICkgfHwKLSAgICAodGVzdCAiWCRDWFgiICE9ICJYZysrIikpKSA7IHRoZW4KLSAgQUNfUFJPR19DWFhDUFAKLWVsc2UKLSAgX2x0X2NhdWdodF9DWFhfZXJyb3I9eWVzCi1maQotcG9wZGVmKFtBQ19NU0dfRVJST1JdKQotXSkjIF9MVF9QUk9HX0NYWAotCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW19MVF9QUk9HX0NYWF0sIFtdKQotCi0KLSMgX0xUX0xBTkdfQ1hYX0NPTkZJRyhbVEFHXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEMrKyBjb21waWxlciBhcmUgc3VpdGFibHkKLSMgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRyB0byB3cml0ZQotIyB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCi1tNF9kZWZ1bihbX0xUX0xBTkdfQ1hYX0NPTkZJR10sCi1bQUNfUkVRVUlSRShbX0xUX1BST0dfQ1hYXSlkbmwKLW00X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAotbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAotCi1BQ19MQU5HX1BVU0goQysrKQotX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi1fTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci1fTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCi1fTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KLV9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9bm8KLV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi1fTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCi1fTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQotX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci1fTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubwotX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKLV9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KLV9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCi1fTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9Ci1fTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQotX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgotX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKLV9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KLV9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KLV9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCi0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDKysgdGVzdCBzb3VyY2VzLgotYWNfZXh0PWNwcAotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQysrIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1fTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKLQotIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAotIyB0aGUgQ1hYIGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQotIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAotIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCi1pZiB0ZXN0ICIkX2x0X2NhdWdodF9DWFhfZXJyb3IiICE9IHllczsgdGhlbgotICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cwotICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDsiCi0KLSAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLSAgbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbihpbnQsIGNoYXIgKltbXV0pIHsgcmV0dXJuKDApOyB9JwotCi0gICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLSAgX0xUX1RBR19DT01QSUxFUgotCi0gICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi0gIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotICBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCi0KLSAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLSAgbHRfc2F2ZV9DQz0kQ0MKLSAgbHRfc2F2ZV9MRD0kTEQKLSAgbHRfc2F2ZV9HQ0M9JEdDQwotICBHQ0M9JEdYWAotICBsdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAotICBsdF9zYXZlX3BhdGhfTEQ9JGx0X2N2X3BhdGhfTEQKLSAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wcm9nX2dudV9sZGN4eCtzZXR9IjsgdGhlbgotICAgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAotICBlbHNlCi0gICAgJGFzX3Vuc2V0IGx0X2N2X3Byb2dfZ251X2xkCi0gIGZpCi0gIGlmIHRlc3QgLW4gIiR7bHRfY3ZfcGF0aF9MRENYWCtzZXR9IjsgdGhlbgotICAgIGx0X2N2X3BhdGhfTEQ9JGx0X2N2X3BhdGhfTERDWFgKLSAgZWxzZQotICAgICRhc191bnNldCBsdF9jdl9wYXRoX0xECi0gIGZpCi0gIHRlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCi0gIENDPSR7Q1hYLSJjKysifQotICBjb21waWxlcj0kQ0MKLSAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQwotICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi0KLSAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgotICAgICMgV2UgZG9uJ3Qgd2FudCAtZm5vLWV4Y2VwdGlvbiB3aGVuIGNvbXBpbGluZyBDKysgY29kZSwgc28gc2V0IHRoZQotICAgICMgbm9fYnVpbHRpbl9mbGFnIHNlcGFyYXRlbHkKLSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJwotICAgIGVsc2UKLSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KLSAgICBmaQotCi0gICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KLSAgICAgICMgU2V0IHVwIGRlZmF1bHQgR05VIEMrKyBjb25maWd1cmF0aW9uCi0KLSAgICAgIExUX1BBVEhfTEQKLQotICAgICAgIyBDaGVjayBpZiBHTlUgQysrIHVzZXMgR05VIGxkIGFzIHRoZSB1bmRlcmx5aW5nIGxpbmtlciwgc2luY2UgdGhlCi0gICAgICAjIGFyY2hpdmluZyBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhhdCBHTlUgbGQgaXMgYmVpbmcgdXNlZC4KLSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotCi0gICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQotICAgICAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQotICAgICAgICAjIFhYWCBJIHRoaW5rIHdsYXJjIGNhbiBiZSBlbGltaW5hdGVkIGluIGx0Y2YtY3h4LCBidXQgSSBuZWVkIHRvCi0gICAgICAgICMgICAgIGludmVzdGlnYXRlIGl0IGEgbGl0dGxlIGJpdCBtb3JlLiAoTU0pCi0gICAgICAgIHdsYXJjPScke3dsfScKLQotICAgICAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCi0gICAgICAgIGlmIGV2YWwgImAkQ0MgLXByaW50LXByb2ctbmFtZT1sZGAgLS1oZWxwIDI+JjEiIHwKLQkgICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgICAgICAgZWxzZQotICAgICAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KLSAgICAgICAgZmkKLSAgICAgIGVsc2UKLSAgICAgICAgd2l0aF9nbnVfbGQ9bm8KLSAgICAgICAgd2xhcmM9Ci0KLSAgICAgICAgIyBBIGdlbmVyaWMgYW5kIHZlcnkgc2ltcGxlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgY3JlYXRpb24KLSAgICAgICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKLSAgICAgICAgIyBsaW5rZXIsIGluc3RlYWQgb2YgR05VIGxkLiAgSWYgcG9zc2libGUsIHRoaXMgc2V0dGluZyBzaG91bGQKLSAgICAgICAgIyBvdmVycmlkZGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBuYXRpdmUgbGlua2VyIGZlYXR1cmVzIG9uCi0gICAgICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCi0gICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKLSAgICAgIGZpCi0KLSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLSAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0gICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAiXC1MIicKLQotICAgIGVsc2UKLSAgICAgIEdYWD1ubwotICAgICAgd2l0aF9nbnVfbGQ9bm8KLSAgICAgIHdsYXJjPQotICAgIGZpCi0KLSAgICAjIFBPUlRNRTogZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgQysrIGxpbmsgY2hhcmFjdGVyaXN0aWNzCi0gICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQotICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCi0gICAgY2FzZSAkaG9zdF9vcyBpbgotICAgICAgYWl4MyopCi0gICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICAgIDs7Ci0gICAgICBhaXhbWzQtOV1dKikKLSAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLSAgICAgICAgICAjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0Ci0gICAgICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCi0gICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotICAgICAgICAgIGV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCi0gICAgICAgICAgbm9fZW50cnlfZmxhZz0iIgotICAgICAgICBlbHNlCi0gICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubwotCi0gICAgICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCi0gICAgICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCi0gICAgICAgICAgIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KLSAgICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCi0JICAgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbwotCSAgICAgIGNhc2UgJGxkX2ZsYWcgaW4KLQkgICAgICAqLWJydGwqKQotCSAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKLQkgICAgICAgIGJyZWFrCi0JICAgICAgICA7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgICA7OwotICAgICAgICAgIGVzYWMKLQotICAgICAgICAgIGV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCi0gICAgICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JwotICAgICAgICBmaQotCi0gICAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KLSAgICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5Ci0gICAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCi0gICAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90Ci0gICAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgotCi0gICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCi0gICAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcwotICAgICAgICBfTFRfVEFHVkFSKGZpbGVfbGlzdF9zcGVjLCAkMSk9JyR7d2x9LWYsJwotCi0gICAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0gICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCi0gICAgICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCi0gICAgICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCi0JICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCi0JICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJgotCSAgICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLQkgIHRoZW4KLQkgICAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCi0JICAgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKLQkgICAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKLQkgICAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcwotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJwotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KLQkgIGZpCi0gICAgICAgICAgZXNhYwotICAgICAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJwotCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0JICAgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJwotCSAgZmkKLSAgICAgICAgZWxzZQotICAgICAgICAgICMgbm90IHVzaW5nIGdjYwotICAgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCi0JICAjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQotCSAgIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKLQkgIHNoYXJlZF9mbGFnPSctRycKLSAgICAgICAgICBlbHNlCi0JICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgotCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJwotCSAgICBlbHNlCi0JICAgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKLQkgICAgZmkKLSAgICAgICAgICBmaQotICAgICAgICBmaQotCi0gICAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAotICAgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8KLQkjIGV4cG9ydC4KLSAgICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKLSAgICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCi0gICAgICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCi0gICAgICAgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotICAgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJwotICAgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eQotICAgICAgICAgICMgZXhlY3V0YWJsZS4KLSAgICAgICAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAotICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgotCi0gICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuICRFQ0hPICJYJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgfCAkWHNlZDsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgotICAgICAgICBlbHNlCi0gICAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KLQkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJwotCSAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCi0gICAgICAgICAgZWxzZQotCSAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KLQkgICAgIyBlbXB0eSBleGVjdXRhYmxlLgotCSAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKLQkgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKLQkgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgotCSAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKLQkgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCi0JICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcwotCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcwotCSAgICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQKLQkgICAgIyBsaWJyYXJpZXMuCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCi0gICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgICAgOzsKLQotICAgICAgYmVvcyopCi0JaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0JICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCi0JICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0JZWxzZQotCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCWZpCi0JOzsKLQotICAgICAgY2hvcnVzKikKLSAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgICAqKQotCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0KLSAgICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKLSAgICAgICAgIyBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKLSAgICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKLSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCi0gICAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KLSAgICAgICAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCi0KLSAgICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKLSAgICAgICAgICAjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCi0gICAgICAgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KLSAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KLQkgICAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOwotICAgICAgICAgIGVsc2UKLQkgICAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0JICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7Ci0gICAgICAgICAgZml+Ci0gICAgICAgICAgJENDIC1zaGFyZWQgLW5vc3RkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJwotICAgICAgICBlbHNlCi0gICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgICBmaQotICAgICAgICA7OwotICAgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKLSAgICAgICAgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoJDEpCi0JOzsKLQotICAgICAgZGd1eCopCi0gICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICAgZWMrKyopCi0JICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JICAgIDs7Ci0gICAgICAgICAgZ2hjeCopCi0JICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCi0JICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JICAgIDs7Ci0gICAgICAgICAgKikKLQkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICA7OwotCi0gICAgICBmcmVlYnNkW1sxMl1dKikKLSAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZQotCSMgc3dpdGNoIHRvIEVMRgotICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICAgIDs7Ci0KLSAgICAgIGZyZWVic2QtZWxmKikKLSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0gICAgICAgIDs7Ci0KLSAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKLSAgICAgICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKLSAgICAgICAgIyBjb252ZW50aW9ucwotICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcwotICAgICAgICA7OwotCi0gICAgICBnbnUqKQotICAgICAgICA7OwotCi0gICAgICBocHV4OSopCi0gICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAotCQkJCSAgICAgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAotCQkJCSAgICAgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICAgQ0MqKQotICAgICAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICAgICAgICA7OwotICAgICAgICAgIGFDQyopCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLWIgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLSAgICAgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotICAgICAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0gICAgICAgICAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotICAgICAgICAgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotICAgICAgICAgICAgIyBkZXBlbmRlbmNpZXMuCi0gICAgICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgJEVHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7ICRFQ0hPICJYJGxpc3QiIHwgJFhzZWQnCi0gICAgICAgICAgICA7OwotICAgICAgICAgICopCi0gICAgICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotICAgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICAgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLSAgICAgICAgICAgIGZpCi0gICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0KLSAgICAgIGhwdXgxMCp8aHB1eDExKikKLSAgICAgICAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotCi0gICAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgICAgICAgIGhwcGEqNjQqfGlhNjQqKQotICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgKikKLQkgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJwotICAgICAgICAgICAgICA7OwotICAgICAgICAgIGVzYWMKLSAgICAgICAgZmkKLSAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLSAgICAgICAgICBocHBhKjY0KnxpYTY0KikKLSAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLSAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0gICAgICAgICAgICA7OwotICAgICAgICAgICopCi0gICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKLSAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCi0JCQkJCSAgICAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0Ci0JCQkJCSAgICAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgICBDQyopCi0JICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JICAgIDs7Ci0gICAgICAgICAgYUNDKikKLQkgICAgY2FzZSAkaG9zdF9jcHUgaW4KLQkgICAgICBocHBhKjY0KikKLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICAgIDs7Ci0JICAgICAgaWE2NCopCi0JICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICAgICA7OwotCSAgICAgICopCi0JICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICAgIDs7Ci0JICAgIGVzYWMKLQkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICAgICMKLQkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JICAgICMgZGVwZW5kZW5jaWVzLgotCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgJEdSRVAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgJEVDSE8gIlgkbGlzdCIgfCAkWHNlZCcKLQkgICAgOzsKLSAgICAgICAgICAqKQotCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgotCSAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KLQkgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCi0JICAgICAgICAgIGhwcGEqNjQqKQotCSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICAgICAgICA7OwotCSAgICAgICAgICBpYTY0KikKLQkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCi0JICAgICAgICAgICAgOzsKLQkgICAgICAgICAgKikKLQkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICAgICAgICA7OwotCSAgICAgICAgZXNhYwotCSAgICAgIGZpCi0JICAgIGVsc2UKLQkgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JICAgIGZpCi0JICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgOzsKLQotICAgICAgaW50ZXJpeFtbMy05XV0qKQotCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KLQlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0JIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgotCSMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKLQkjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5Ci0JIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAotCSMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKLQkjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KLQlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJwotCTs7Ci0gICAgICBpcml4NSogfCBpcml4NiopCi0gICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICAgQ0MqKQotCSAgICAjIFNHSSBDKysKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCi0JICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZwotCSAgICAjICJDQyAtYXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBJUklYIEMrKyBjb21waWxlci4gIFRoaXMgaXMKLQkgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCi0JICAgICMgaW4gdGhlIGFyY2hpdmUuCi0JICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLWFyIC1XUiwtdSAtbyAkb2xkbGliICRvbGRvYmpzJwotCSAgICA7OwotICAgICAgICAgICopCi0JICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCi0JICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCSAgICAgIGVsc2UKLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgIC1vICRsaWInCi0JICAgICAgZmkKLQkgICAgZmkKLQkgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCi0JICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotICAgICAgICBfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT15ZXMKLSAgICAgICAgOzsKLQotICAgICAgbGludXgqIHwgaypic2QqLWdudSkKLSAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KLSAgICAgICAgICBLQ0MqKQotCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCi0KLQkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQotCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5Ci0JICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKLQkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cwotCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JICAgICMKLQkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQotCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQotCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5Ci0JICAgICMgZGVwZW5kZW5jaWVzLgotCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgJEdSRVAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyAkRUNITyAiWCRsaXN0IiB8ICRYc2VkJwotCi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0KLQkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JICAgICMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KLQkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJwotCSAgICA7OwotCSAgaWNwYyogfCBlY3BjKiApCi0JICAgICMgSW50ZWwgQysrCi0JICAgIHdpdGhfZ251X2xkPXllcwotCSAgICAjIHZlcnNpb24gOC4wIGFuZCBhYm92ZSBvZiBpY3BjIGNob2tlIG9uIG11bHRpcGx5IGRlZmluZWQgc3ltYm9scwotCSAgICAjIGlmIHdlIGFkZCAkcHJlZGVwX29iamVjdHMgYW5kICRwb3N0ZGVwX29iamVjdHMsIGhvd2V2ZXIgNy4xIGFuZAotCSAgICAjIGVhcmxpZXIgZG8gbm90IGFkZCB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLgotCSAgICBjYXNlIGAkQ0MgLVYgMj4mMWAgaW4KLQkgICAgICAqIlZlcnNpb24gNy4iKikKLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JCTs7Ci0JICAgICAgKikgICMgVmVyc2lvbiA4LjAgb3IgbmV3ZXIKLQkgICAgICAgIHRtcF9pZHluPQotCSAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KLQkJICBpYTY0KikgdG1wX2lkeW49JyAtaV9keW5hbWljJzs7Ci0JCWVzYWMKLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQkJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkJOzsKLQkgICAgZXNhYwotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KLQkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKLQkgICAgOzsKLSAgICAgICAgICBwZ0NDKiB8IHBnY3BwKikKLSAgICAgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCi0JICAgIGNhc2UgYCRDQyAtVmAgaW4KLQkgICAgKnBnQ0NcIFtbMS01XV0qIHwgKnBnY3BwXCBbWzEtNV1dKikKLQkgICAgICBfTFRfVEFHVkFSKHByZWxpbmtfY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgotCQlybSAtcmYgJHRwbGRpcn4KLQkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2JqcyAkbGlib2JqcyAkY29tcGlsZV9kZXBsaWJzfgotCQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgJE5MMlNQYCInCi0JICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+Ci0JCXJtIC1yZiAkdHBsZGlyfgotCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvbGRvYmpzJG9sZF9kZXBsaWJzfgotCQkkQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCAkTkwyU1BgfgotCQkkUkFOTElCICRvbGRsaWInCi0JICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KLQkJcm0gLXJmICR0cGxkaXJ+Ci0JCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRjb252ZW5pZW5jZSAkcG9zdGRlcF9vYmplY3RzfgotCQkkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJwotCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgotCQlybSAtcmYgJHRwbGRpcn4KLQkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbnZlbmllbmNlICRwb3N0ZGVwX29iamVjdHN+Ci0JCSRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgICAgICA7OwotCSAgICAqKSAjIFZlcnNpb24gNiB3aWxsIHVzZSB3ZWFrIHN5bWJvbHMKLQkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKLQkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLQkgICAgICA7OwotCSAgICBlc2FjCi0KLQkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0JICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLQkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkRUNITyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCi0gICAgICAgICAgICA7OwotCSAgY3h4KikKLQkgICAgIyBDb21wYXEgQysrCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICAtbyAkbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzJwotCi0JICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKLQkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgotCi0JICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCi0JICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAjCi0JICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KLQkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KLQkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQotCSAgICAjIGRlcGVuZGVuY2llcy4KLQkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJsZCJgOyB0ZW1wbGlzdD1gJEVDSE8gIlgkdGVtcGxpc3QiIHwgJFhzZWQgLWUgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgJEVDSE8gIlgkbGlzdCIgfCAkWHNlZCcKLQkgICAgOzsKLQkgIHhsKikKLQkgICAgIyBJQk0gWEwgOC4wIG9uIFBQQywgd2l0aCBHTlUgbGQKLQkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLQkgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgotCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCQljYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+Ci0JCWVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgotCQkkQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKLQkgICAgZmkKLQkgICAgOzsKLQkgICopCi0JICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgotCSAgICAqU3VuXCBDKikKLQkgICAgICAjIFN1biBDKysgNS45Ci0JICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXpkZWZzJwotCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMnCi0JICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKLQkgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJwotCSAgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzCi0KLQkgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgc29tZXRoaW5nIGJhc2VkIG9uCi0JICAgICAgIyAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMQotCSAgICAgICMgd291bGQgYmUgYmV0dGVyLgotCSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJwotCi0JICAgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCi0JICAgICAgIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCi0JICAgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCi0JICAgICAgIyBpbiB0aGUgYXJjaGl2ZS4KLQkgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgIGx5bnhvcyopCi0gICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotCi0gICAgICBtODhrKikKLSAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0gICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQk7OwotCi0gICAgICBtdnMqKQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgIGN4eCopCi0JICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JICAgIDs7Ci0JICAqKQotCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgICA7OwotCWVzYWMKLQk7OwotCi0gICAgICBuZXRic2QqKQotICAgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRsaW5rZXJfZmxhZ3MnCi0JICB3bGFyYz0KLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KLQlmaQotCSMgV29ya2Fyb3VuZCBzb21lIGJyb2tlbiBwcmUtMS41IHRvb2xjaGFpbnMKLQlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCBjb25mdGVzdC4kb2JqZXh0IHwgJFNFRCAtZSAiczotbGdjYyAtbGMgLWxnY2M6OiInCi0JOzsKLQotICAgICAgKm50byogfCAqcW54KikKLSAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKLQk7OwotCi0gICAgICBvcGVuYnNkMiopCi0gICAgICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGZhaXJseSBicm9rZW4KLQlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JOzsKLQotICAgICAgb3BlbmJzZCopCi0JaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCi0JICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKLQkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKLQkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJwotCSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCi0JICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCi0JICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLQkgIGZpCi0JICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1lY2hvCi0JZWxzZQotCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCWZpCi0JOzsKLQotICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgIEtDQyopCi0JICAgICMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKLQotCSAgICAjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCi0JICAgICMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKLQkgICAgIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICIkbGliIiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCi0KLQkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkgICAgIyB0aGUgS0FJIEMrKyBjb21waWxlci4KLQkgICAgY2FzZSAkaG9zdCBpbgotCSAgICAgIG9zZjMqKSBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnIDs7Ci0JICAgICAgKikgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OwotCSAgICBlc2FjCi0JICAgIDs7Ci0gICAgICAgICAgUkNDKikKLQkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKLQkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgICAgOzsKLSAgICAgICAgICBjeHgqKQotCSAgICBjYXNlICRob3N0IGluCi0JICAgICAgb3NmMyopCi0JICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJwotCSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLQkJOzsKLQkgICAgICAqKQotCSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lfgotCSAgICAgICAgICBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgotCSAgICAgICAgICAkQ0MgLXNoYXJlZCRhbGxvd191bmRlZmluZWRfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lICR7d2x9LWlucHV0ICR7d2x9JGxpYi5leHAgIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+Ci0JICAgICAgICAgICRSTSAkbGliLmV4cCcKLQkgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKLQkJOzsKLQkgICAgZXNhYwotCi0JICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgotCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgICAgIwotCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCi0JICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCi0JICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKLQkgICAgIyBkZXBlbmRlbmNpZXMuCi0JICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAibGQiIHwgJEdSRVAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gJEVDSE8gIlgkdGVtcGxpc3QiIHwgJFhzZWQgLWUgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyAkRUNITyAiWCRsaXN0IiB8ICRYc2VkJwotCSAgICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCi0JICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKLQkgICAgICBjYXNlICRob3N0IGluCi0JICAgICAgICBvc2YzKikKLQkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKLQkJICA7OwotCSAgICAgICAgKikKLQkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCi0JCSAgOzsKLQkgICAgICBlc2FjCi0KLQkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKLQotCSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKLQkgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAiXC1MIicKLQotCSAgICBlbHNlCi0JICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgICBmaQotCSAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0KLSAgICAgIHBzb3MqKQotICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLSAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotICAgICAgICA7OwotCi0gICAgICBzdW5vczQqKQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgIENDKikKLQkgICAgIyBTdW4gQysrIDQueAotCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgICA7OwotICAgICAgICAgIGxjYyopCi0JICAgICMgTHVjaWQKLQkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0Ci0JICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KLQkgICAgOzsKLSAgICAgICAgICAqKQotCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIDs7Ci0KLSAgICAgIHNvbGFyaXMqKQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgIENDKikKLQkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKwotICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywkMSk9eWVzCi0JICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkgICAgICAkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1NICR7d2x9JGxpYi5leHAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKLQotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJwotCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotCSAgICBjYXNlICRob3N0X29zIGluCi0JICAgICAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKLQkgICAgICAqKQotCQkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAotCQkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLgotCSAgICAgICAgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKLQkJX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JwotCSAgICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLQotCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKLQotCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKLQkgICAgIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCi0JICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAotCSAgICAjIGluIHRoZSBhcmNoaXZlLgotCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQkgICAgOzsKLSAgICAgICAgICBnY3gqKQotCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCi0KLQkgICAgIyBUaGUgQysrIGNvbXBpbGVyIG11c3QgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFyY2hpdmUuCi0JICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgJExERkxBR1MgLWFyY2hpdmUgLW8gJG9sZGxpYiAkb2xkb2JqcycKLQkgICAgOzsKLSAgICAgICAgICAqKQotCSAgICAjIEdOVSBDKysgY29tcGlsZXIgd2l0aCBTb2xhcmlzIGxpbmtlcgotCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KLQkgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS16ICR7d2x9ZGVmcycKLQkgICAgICBpZiAkQ0MgLS12ZXJzaW9uIHwgJEdSRVAgLXYgJ14yXC43JyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSAgJENDIC1zaGFyZWQgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJwotCi0JICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgIlwtTCInCi0JICAgICAgZWxzZQotCSAgICAgICAgIyBnKysgMi43IGFwcGVhcnMgdG8gcmVxdWlyZSBgLUcnIE5PVCBgLXNoYXJlZCcgb24gdGhpcwotCSAgICAgICAgIyBwbGF0Zm9ybS4KLQkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJwotCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJICAkQ0MgLUcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJwotCi0JICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCi0JICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KLQkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtRyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJcLUwiJwotCSAgICAgIGZpCi0KLQkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkd2wkbGliZGlyJwotCSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KLQkJc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKLQkJKikKLQkJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKLQkJICA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICA7OwotCi0gICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bWzAyNF1dKikKLSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JwotICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0gICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubwotICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJwotCi0gICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICBDQyopCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICA7OwotCSopCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCi0JICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgOzsKLSAgICAgIGVzYWMKLSAgICAgIDs7Ci0KLSAgICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCi0JIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKLQkjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCi0JIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCi0JIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAotCSMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAotCSMgYXMgLXogZGVmcy4KLQlfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKLQlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJwotCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCi0JX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIsJGxpYmRpcicKLQlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKLQlfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKLQlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JwotCXJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKLQotCWNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gICAgICAgICAgQ0MqKQotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJwotCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgICAgOzsKLQkgICopCi0JICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKLQkgICAgOzsKLQllc2FjCi0gICAgICA7OwotCi0gICAgICB0YW5kZW0qKQotICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgotICAgICAgICAgIE5DQyopCi0JICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAotCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKLQkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubwotCSAgICA7OwotICAgICAgICAgICopCi0JICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0JICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgOzsKLQotICAgICAgdnh3b3JrcyopCi0gICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICAgIDs7Ci0KLSAgICAgICopCi0gICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAotICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCi0gICAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSldKQotICAgIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRHWFgiCi0gICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCi0KLSAgICAjIyBDQVZFQVQgRU1QVE9SOgotICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCi0gICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKLSAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KLSAgICBfTFRfU1lTX0hJRERFTl9MSUJERVBTKCQxKQotICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCi0gICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKLSAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKLSAgICBfTFRfTElOS0VSX1NITElCUygkMSkKLSAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQotICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKLQotICAgIF9MVF9DT05GSUcoJDEpCi0gIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgotCi0gIENDPSRsdF9zYXZlX0NDCi0gIExEQ1hYPSRMRAotICBMRD0kbHRfc2F2ZV9MRAotICBHQ0M9JGx0X3NhdmVfR0NDCi0gIHdpdGhfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCi0gIGx0X2N2X3BhdGhfTERDWFg9JGx0X2N2X3BhdGhfTEQKLSAgbHRfY3ZfcGF0aF9MRD0kbHRfc2F2ZV9wYXRoX0xECi0gIGx0X2N2X3Byb2dfZ251X2xkY3h4PSRsdF9jdl9wcm9nX2dudV9sZAotICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAotZmkgIyB0ZXN0ICIkX2x0X2NhdWdodF9DWFhfZXJyb3IiICE9IHllcwotCi1BQ19MQU5HX1BPUAotXSkjIF9MVF9MQU5HX0NYWF9DT05GSUcKLQotCi0jIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoW1RBR05BTUVdKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRmlndXJlIG91dCAiaGlkZGVuIiBsaWJyYXJ5IGRlcGVuZGVuY2llcyBmcm9tIHZlcmJvc2UKLSMgY29tcGlsZXIgb3V0cHV0IHdoZW4gbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgotIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKLSMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgotbTRfZGVmdW4oW19MVF9TWVNfSElEREVOX0xJQkRFUFNdLAotW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAotIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0IGJlaW5nIGxpbmtlZDoKLV9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0KLV9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9Ci1fTFRfVEFHVkFSKHByZWRlcHMsICQxKT0KLV9MVF9UQUdWQVIocG9zdGRlcHMsICQxKT0KLV9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9Ci0KLWRubCB3ZSBjYW4ndCB1c2UgdGhlIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSBoZXJlLAotZG5sIGJlY2F1c2UgaXQgY29udGFpbnMgY29kZSBpbnRlbmRlZCBmb3IgYW4gZXhlY3V0YWJsZSwKLWRubCBub3QgYSBsaWJyYXJ5LiAgSXQncyBwb3NzaWJsZSB3ZSBzaG91bGQgbGV0IGVhY2gKLWRubCB0YWcgZGVmaW5lIGEgbmV3IGx0Xz8/Pz9fbGlua190ZXN0X2NvZGUgdmFyaWFibGUsCi1kbmwgYnV0IGl0J3Mgb25seSB1c2VkIGhlcmUuLi4KLW00X2lmKFskMV0sIFtdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKLWludCBhOwotdm9pZCBmb28gKHZvaWQpIHsgYSA9IDA7IH0KLV9MVF9FT0YKLV0sIFskMV0sIFtDWFhdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKLWNsYXNzIEZvbwotewotcHVibGljOgotICBGb28gKHZvaWQpIHsgYSA9IDA7IH0KLXByaXZhdGU6Ci0gIGludCBhOwotfTsKLV9MVF9FT0YKLV0sIFskMV0sIFtGNzddLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKLSAgICAgIHN1YnJvdXRpbmUgZm9vCi0gICAgICBpbXBsaWNpdCBub25lCi0gICAgICBpbnRlZ2VyKjQgYQotICAgICAgYT0wCi0gICAgICByZXR1cm4KLSAgICAgIGVuZAotX0xUX0VPRgotXSwgWyQxXSwgW0ZDXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCi0gICAgICBzdWJyb3V0aW5lIGZvbwotICAgICAgaW1wbGljaXQgbm9uZQotICAgICAgaW50ZWdlciBhCi0gICAgICBhPTAKLSAgICAgIHJldHVybgotICAgICAgZW5kCi1fTFRfRU9GCi1dLCBbJDFdLCBbR0NKXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCi1wdWJsaWMgY2xhc3MgZm9vIHsKLSAgcHJpdmF0ZSBpbnQgYTsKLSAgcHVibGljIHZvaWQgYmFyICh2b2lkKSB7Ci0gICAgYSA9IDA7Ci0gIH0KLX07Ci1fTFRfRU9GCi1dKQotZG5sIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQotZG5sIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KLWlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5Ci0gICMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgotCi0gICMgU2VudGluZWwgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBiZWZvcmUKLSAgIyB0aGUgY29uZnRlc3Qgb2JqZWN0IGZpbGUuCi0gIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9bm8KLQotICBmb3IgcCBpbiBgZXZhbCAiJG91dHB1dF92ZXJib3NlX2xpbmtfY21kImA7IGRvCi0gICAgY2FzZSAkcCBpbgotCi0gICAgLUwqIHwgLVIqIHwgLWwqKQotICAgICAgICMgU29tZSBjb21waWxlcnMgcGxhY2Ugc3BhY2UgYmV0d2VlbiAiLXtMLFJ9IiBhbmQgdGhlIHBhdGguCi0gICAgICAgIyBSZW1vdmUgdGhlIHNwYWNlLgotICAgICAgIGlmIHRlc3QgJHAgPSAiLUwiIHx8Ci0gICAgICAgICAgdGVzdCAkcCA9ICItUiI7IHRoZW4KLQkgcHJldj0kcAotCSBjb250aW51ZQotICAgICAgIGVsc2UKLQkgcHJldj0KLSAgICAgICBmaQotCi0gICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KLQkgY2FzZSAkcCBpbgotCSAtTCogfCAtUiopCi0JICAgIyBJbnRlcm5hbCBjb21waWxlciBsaWJyYXJ5IHBhdGhzIHNob3VsZCBjb21lIGFmdGVyIHRob3NlCi0JICAgIyBwcm92aWRlZCB0aGUgdXNlci4gIFRoZSBwb3N0ZGVwcyBhbHJlYWR5IGNvbWUgYWZ0ZXIgdGhlCi0JICAgIyB1c2VyIHN1cHBsaWVkIGxpYnMgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBwcm9jZXNzIHRoZW0uCi0JICAgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSkiOyB0aGVuCi0JICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke3ByZXZ9JHtwfSIKLQkgICBlbHNlCi0JICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9ICR7cHJldn0ke3B9IgotCSAgIGZpCi0JICAgOzsKLQkgIyBUaGUgIi1sIiBjYXNlIHdvdWxkIG5ldmVyIGNvbWUgYmVmb3JlIHRoZSBvYmplY3QgYmVpbmcKLQkgIyBsaW5rZWQsIHNvIGRvbid0IGJvdGhlciBoYW5kbGluZyB0aGlzIGNhc2UuCi0JIGVzYWMKLSAgICAgICBlbHNlCi0JIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSkiOyB0aGVuCi0JICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke3ByZXZ9JHtwfSIKLQkgZWxzZQotCSAgIF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKT0iJHtfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSl9ICR7cHJldn0ke3B9IgotCSBmaQotICAgICAgIGZpCi0gICAgICAgOzsKLQotICAgICouJG9iamV4dCkKLSAgICAgICAjIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSB0ZXN0IG9iamVjdCBmaWxlIG9ubHkgc2hvd3MgdXAKLSAgICAgICAjIG9uY2UgaW4gdGhlIGNvbXBpbGVyIG91dHB1dC4KLSAgICAgICBpZiB0ZXN0ICIkcCIgPSAiY29uZnRlc3QuJG9iamV4dCI7IHRoZW4KLQkgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT15ZXMKLQkgY29udGludWUKLSAgICAgICBmaQotCi0gICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KLQkgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSI7IHRoZW4KLQkgICBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRwIgotCSBlbHNlCi0JICAgX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpICRwIgotCSBmaQotICAgICAgIGVsc2UKLQkgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCi0JICAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJHAiCi0JIGVsc2UKLQkgICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSAkcCIKLQkgZmkKLSAgICAgICBmaQotICAgICAgIDs7Ci0KLSAgICAqKSA7OyAjIElnbm9yZSB0aGUgcmVzdC4KLQotICAgIGVzYWMKLSAgZG9uZQotCi0gICMgQ2xlYW4gdXAuCi0gIHJtIC1mIGEub3V0IGEuZXhlCi1lbHNlCi0gIGVjaG8gImxpYnRvb2wubTQ6IGVycm9yOiBwcm9ibGVtIGNvbXBpbGluZyAkMSB0ZXN0IHByb2dyYW0iCi1maQotCi0kUk0gLWYgY29uZmVzdC4kb2JqZXh0Ci0KLSMgUE9SVE1FOiBvdmVycmlkZSBhYm92ZSB0ZXN0IG9uIHN5c3RlbXMgd2hlcmUgaXQgaXMgYnJva2VuCi1tNF9pZihbJDFdLCBbQ1hYXSwKLVtjYXNlICRob3N0X29zIGluCi1pbnRlcml4W1szLTldXSopCi0gICMgSW50ZXJpeCAzLjUgaW5zdGFsbHMgY29tcGxldGVseSBob3NlZCAubGEgZmlsZXMgZm9yIEMrKywgc28gcmF0aGVyIHRoYW4KLSAgIyBoYWNrIGFsbCBhcm91bmQgaXQsIGxldCdzIGp1c3QgdHJ1c3QgImcrKyIgdG8gRFRSVC4KLSAgX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywkMSk9Ci0gIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCQxKT0KLSAgX0xUX1RBR1ZBUihwb3N0ZGVwcywkMSk9Ci0gIDs7Ci0KLWxpbnV4KikKLSAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCi0gICpTdW5cIEMqKQotICAgICMgU3VuIEMrKyA1LjkKLQotICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcwotICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZwotICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKLSAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCi0gICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KLSAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKLSAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcwotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICIkc29sYXJpc191c2Vfc3RscG9ydDQiICE9IHllczsgdGhlbgotICAgICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywkMSk9Jy1saWJyYXJ5PUNzdGQgLWxpYnJhcnk9Q3J1bicKLSAgICBmaQotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLQotc29sYXJpcyopCi0gIGNhc2UgJGNjX2Jhc2VuYW1lIGluCi0gIENDKikKLSAgICAjIFRoZSBtb3JlIHN0YW5kYXJkcy1jb25mb3JtaW5nIHN0bHBvcnQ0IGxpYnJhcnkgaXMKLSAgICAjIGluY29tcGF0aWJsZSB3aXRoIHRoZSBDc3RkIGxpYnJhcnkuIEF2b2lkIHNwZWNpZnlpbmcKLSAgICAjIGl0IGlmIGl0J3MgaW4gQ1hYRkxBR1MuIElnbm9yZSBsaWJDcnVuIGFzCi0gICAgIyAtbGlicmFyeT1zdGxwb3J0NCBkZXBlbmRzIG9uIGl0LgotICAgIGNhc2UgIiAkQ1hYICRDWFhGTEFHUyAiIGluCi0gICAgKiIgLWxpYnJhcnk9c3RscG9ydDQgIiopCi0gICAgICBzb2xhcmlzX3VzZV9zdGxwb3J0ND15ZXMKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBBZGRpbmcgdGhpcyByZXF1aXJlcyBhIGtub3duLWdvb2Qgc2V0dXAgb2Ygc2hhcmVkIGxpYnJhcmllcyBmb3IKLSAgICAjIFN1biBjb21waWxlciB2ZXJzaW9ucyBiZWZvcmUgNS42LCBlbHNlIFBJQyBvYmplY3RzIGZyb20gYW4gb2xkCi0gICAgIyBhcmNoaXZlIHdpbGwgYmUgbGlua2VkIGludG8gdGhlIG91dHB1dCwgbGVhZGluZyB0byBzdWJ0bGUgYnVncy4KLSAgICBpZiB0ZXN0ICIkc29sYXJpc191c2Vfc3RscG9ydDQiICE9IHllczsgdGhlbgotICAgICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywkMSk9Jy1saWJyYXJ5PUNzdGQgLWxpYnJhcnk9Q3J1bicKLSAgICBmaQotICAgIDs7Ci0gIGVzYWMKLSAgOzsKLWVzYWMKLV0pCi0KLWNhc2UgIiAkX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpICIgaW4KLSoiIC1sYyAiKikgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vIDs7Ci1lc2FjCi0gX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX2RpcnMsICQxKT0KLWlmIHRlc3QgLW4gIiR7X0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0iOyB0aGVuCi0gX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX2RpcnMsICQxKT1gZWNobyAiICR7X0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0iIHwgJHtTRUR9IC1lICdzISAtTCEgIWcnIC1lICdzIV4gISEnYAotZmkKLV9MVF9UQUdERUNMKFtdLCBbY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzXSwgWzFdLAotICAgIFtUaGUgZGlyZWN0b3JpZXMgc2VhcmNoZWQgYnkgdGhpcyBjb21waWxlciB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnldKQotX0xUX1RBR0RFQ0woW10sIFtwcmVkZXBfb2JqZWN0c10sIFsxXSwKLSAgICBbRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvCi0gICAgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnldKQotX0xUX1RBR0RFQ0woW10sIFtwb3N0ZGVwX29iamVjdHNdLCBbMV0pCi1fTFRfVEFHREVDTChbXSwgW3ByZWRlcHNdLCBbMV0pCi1fTFRfVEFHREVDTChbXSwgW3Bvc3RkZXBzXSwgWzFdKQotX0xUX1RBR0RFQ0woW10sIFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbMV0sCi0gICAgW1RoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCi0gICAgYSBzaGFyZWQgbGlicmFyeV0pCi1dKSMgX0xUX1NZU19ISURERU5fTElCREVQUwotCi0KLSMgX0xUX1BST0dfRjc3Ci0jIC0tLS0tLS0tLS0tLQotIyBTaW5jZSBBQ19QUk9HX0Y3NyBpcyBicm9rZW4sIGluIHRoYXQgaXQgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nCi0jIGlmIHRoZXJlIGlzIG5vIGZvcnRyYW4gY29tcGlsZXIsIHdlIGhhdmUgb3VyIG93biB2ZXJzaW9uIGhlcmUuCi1tNF9kZWZ1bihbX0xUX1BST0dfRjc3XSwKLVsKLXB1c2hkZWYoW0FDX01TR19FUlJPUl0sIFtfbHRfZGlzYWJsZV9GNzc9eWVzXSkKLUFDX1BST0dfRjc3Ci1pZiB0ZXN0IC16ICIkRjc3IiB8fCB0ZXN0ICJYJEY3NyIgPSAiWG5vIjsgdGhlbgotICBfbHRfZGlzYWJsZV9GNzc9eWVzCi1maQotcG9wZGVmKFtBQ19NU0dfRVJST1JdKQotXSkjIF9MVF9QUk9HX0Y3NwotCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW19MVF9QUk9HX0Y3N10sIFtdKQotCi0KLSMgX0xUX0xBTkdfRjc3X0NPTkZJRyhbVEFHXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEZvcnRyYW4gNzcgY29tcGlsZXIgYXJlCi0jIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKLSMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgotbTRfZGVmdW4oW19MVF9MQU5HX0Y3N19DT05GSUddLAotW0FDX1JFUVVJUkUoW19MVF9QUk9HX0Y3N10pZG5sCi1BQ19MQU5HX1BVU0goRm9ydHJhbiA3NykKLQotX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi1fTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ci1fTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCi1fTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KLV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCi1fTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCi1fTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQotX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9Ci1fTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubwotX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubwotX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KLV9MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KLV9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9Ci1fTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCi1fTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcwotX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQotX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQotX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KLQotIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIGY3NyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9ZgotCi0jIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgZjc3IHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1fTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKLQotIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAotIyB0aGUgRjc3IGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQotIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAotIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCi1pZiB0ZXN0ICIkX2x0X2Rpc2FibGVfRjc3IiAhPSB5ZXM7IHRoZW4KLSAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLSAgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJcCi0gICAgICBzdWJyb3V0aW5lIHQKLSAgICAgIHJldHVybgotICAgICAgZW5kCi0iCi0KLSAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLSAgbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSJcCi0gICAgICBwcm9ncmFtIHQKLSAgICAgIGVuZAotIgotCi0gICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KLSAgX0xUX1RBR19DT01QSUxFUgotCi0gICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi0gIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQotICBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCi0KLSAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLSAgbHRfc2F2ZV9DQz0iJENDIgotICBsdF9zYXZlX0dDQz0kR0NDCi0gIENDPSR7Rjc3LSJmNzcifQotICBjb21waWxlcj0kQ0MKLSAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQwotICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCi0gIEdDQz0kRzc3Ci0gIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCi0gICAgQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQotCi0gICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQotICAgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0gICAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCi0gICAgIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICAgIGFpeDMqKQotICAgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICAgICAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICAgICAgICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKLSAgICAgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICBhaXhbWzQtOV1dKikKLQlpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCi0JICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotCWZpCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKLQotICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKLSAgICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KLSAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCi0KLSAgICBfTFRfVEFHVkFSKEdDQywgJDEpPSIkRzc3IgotICAgIF9MVF9UQUdWQVIoTEQsICQxKT0iJExEIgotCi0gICAgIyMgQ0FWRUFUIEVNUFRPUjoKLSAgICAjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQotICAgICMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5Ci0gICAgIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCi0gICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKLSAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQotICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQotICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQotICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCi0gICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQotCi0gICAgX0xUX0NPTkZJRygkMSkKLSAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCi0KLSAgR0NDPSRsdF9zYXZlX0dDQwotICBDQz0iJGx0X3NhdmVfQ0MiCi1maSAjIHRlc3QgIiRfbHRfZGlzYWJsZV9GNzciICE9IHllcwotCi1BQ19MQU5HX1BPUAotXSkjIF9MVF9MQU5HX0Y3N19DT05GSUcKLQotCi0jIF9MVF9QUk9HX0ZDCi0jIC0tLS0tLS0tLS0tCi0jIFNpbmNlIEFDX1BST0dfRkMgaXMgYnJva2VuLCBpbiB0aGF0IGl0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZwotIyBpZiB0aGVyZSBpcyBubyBmb3J0cmFuIGNvbXBpbGVyLCB3ZSBoYXZlIG91ciBvd24gdmVyc2lvbiBoZXJlLgotbTRfZGVmdW4oW19MVF9QUk9HX0ZDXSwKLVsKLXB1c2hkZWYoW0FDX01TR19FUlJPUl0sIFtfbHRfZGlzYWJsZV9GQz15ZXNdKQotQUNfUFJPR19GQwotaWYgdGVzdCAteiAiJEZDIiB8fCB0ZXN0ICJYJEZDIiA9ICJYbm8iOyB0aGVuCi0gIF9sdF9kaXNhYmxlX0ZDPXllcwotZmkKLXBvcGRlZihbQUNfTVNHX0VSUk9SXSkKLV0pIyBfTFRfUFJPR19GQwotCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW19MVF9QUk9HX0ZDXSwgW10pCi0KLQotIyBfTFRfTEFOR19GQ19DT05GSUcoW1RBR10pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEZvcnRyYW4gY29tcGlsZXIgYXJlCi0jIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKLSMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgotbTRfZGVmdW4oW19MVF9MQU5HX0ZDX0NPTkZJR10sCi1bQUNfUkVRVUlSRShbX0xUX1BST0dfRkNdKWRubAotQUNfTEFOR19QVVNIKEZvcnRyYW4pCi0KLV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubwotX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQotX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubwotX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9Ci1fTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQotX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubwotX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubwotX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Ci1fTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KLV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQotX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KLV9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KLV9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCi1fTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9Ci1fTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQotX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgotX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKLV9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KLV9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KLV9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCi0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmYyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9JHthY19mY19zcmNleHQtZn0KLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGZjIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1fTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKLQotIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAotIyB0aGUgRkMgY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCi0jIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCi0jIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KLWlmIHRlc3QgIiRfbHRfZGlzYWJsZV9GQyIgIT0geWVzOyB0aGVuCi0gICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCi0gIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iXAotICAgICAgc3Vicm91dGluZSB0Ci0gICAgICByZXR1cm4KLSAgICAgIGVuZAotIgotCi0gICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCi0gIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iXAotICAgICAgcHJvZ3JhbSB0Ci0gICAgICBlbmQKLSIKLQotICAjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi0gIF9MVF9UQUdfQ09NUElMRVIKLQotICAjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotICBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLSAgX0xUX0xJTktFUl9CT0lMRVJQTEFURQotCi0gICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi0gIGx0X3NhdmVfQ0M9IiRDQyIKLSAgbHRfc2F2ZV9HQ0M9JEdDQwotICBDQz0ke0ZDLSJmOTUifQotICBjb21waWxlcj0kQ0MKLSAgR0NDPSRhY19jdl9mY19jb21waWxlcl9nbnUKLQotICBfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCi0gIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLQotICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQotICAgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKLQotICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKLSAgICB0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KLQotICAgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAotICAgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KLSAgICBjYXNlICRob3N0X29zIGluCi0gICAgICBhaXgzKikKLSAgICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLSAgICAgICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgICAgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCi0gICAgICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJwotICAgICAgICBmaQotICAgICAgICA7OwotICAgICAgYWl4W1s0LTldXSopCi0JaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgotCSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KLQlmaQotICAgICAgICA7OwotICAgIGVzYWMKLSAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCi0KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCi0gICAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCi0gICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQotCi0gICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJGFjX2N2X2ZjX2NvbXBpbGVyX2dudSIKLSAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKLQotICAgICMjIENBVkVBVCBFTVBUT1I6Ci0gICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKLSAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQotICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgotICAgIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoJDEpCi0gICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKLSAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQotICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQotICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQotICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCi0gICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQotCi0gICAgX0xUX0NPTkZJRygkMSkKLSAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCi0KLSAgR0NDPSRsdF9zYXZlX0dDQwotICBDQz0iJGx0X3NhdmVfQ0MiCi1maSAjIHRlc3QgIiRfbHRfZGlzYWJsZV9GQyIgIT0geWVzCi0KLUFDX0xBTkdfUE9QCi1dKSMgX0xUX0xBTkdfRkNfQ09ORklHCi0KLQotIyBfTFRfTEFOR19HQ0pfQ09ORklHKFtUQUddKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBHTlUgSmF2YSBDb21waWxlciBjb21waWxlcgotIyBhcmUgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRwotIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCi1tNF9kZWZ1bihbX0xUX0xBTkdfR0NKX0NPTkZJR10sCi1bQUNfUkVRVUlSRShbTFRfUFJPR19HQ0pdKWRubAotQUNfTEFOR19TQVZFCi0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBKYXZhIHRlc3Qgc291cmNlcy4KLWFjX2V4dD1qYXZhCi0KLSMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBKYXZhIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1fTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iY2xhc3MgZm9vIHt9IgotCi0jIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cwotbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwdWJsaWMgY2xhc3MgY29uZnRlc3QgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbW11dIGFyZ3YpIHt9OyB9JwotCi0jIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCi1fTFRfVEFHX0NPTVBJTEVSCi0KLSMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCi1fTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKLV9MVF9MSU5LRVJfQk9JTEVSUExBVEUKLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLWx0X3NhdmVfQ0M9IiRDQyIKLWx0X3NhdmVfR0NDPSRHQ0MKLUdDQz15ZXMKLUNDPSR7R0NKLSJnY2oifQotY29tcGlsZXI9JENDCi1fTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCi1fTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKLV9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKLQotIyBHQ0ogZGlkIG5vdCBleGlzdCBhdCB0aGUgdGltZSBHQ0MgZGlkbid0IGltcGxpY2l0bHkgbGluayBsaWJjIGluLgotX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCi0KLV9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCi0KLWlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KLSAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCi0gIF9MVF9DT01QSUxFUl9QSUMoJDEpCi0gIF9MVF9DT01QSUxFUl9DX08oJDEpCi0gIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQotICBfTFRfTElOS0VSX1NITElCUygkMSkKLSAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQotCi0gIF9MVF9DT05GSUcoJDEpCi1maQotCi1BQ19MQU5HX1JFU1RPUkUKLQotR0NDPSRsdF9zYXZlX0dDQwotQ0M9IiRsdF9zYXZlX0NDIgotXSkjIF9MVF9MQU5HX0dDSl9DT05GSUcKLQotCi0jIF9MVF9MQU5HX1JDX0NPTkZJRyhbVEFHXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBXaW5kb3dzIHJlc291cmNlIGNvbXBpbGVyCi0jIGFyZSBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCi0jIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KLW00X2RlZnVuKFtfTFRfTEFOR19SQ19DT05GSUddLAotW0FDX1JFUVVJUkUoW0xUX1BST0dfUkNdKWRubAotQUNfTEFOR19TQVZFCi0KLSMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBSQyB0ZXN0IHNvdXJjZXMuCi1hY19leHQ9cmMKLQotIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIFJDIHRlc3Qgc291cmNlcy4KLW9iamV4dD1vCi1fTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKLWx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0nc2FtcGxlIE1FTlUgeyBNRU5VSVRFTSAiJlNvdXAiLCAxMDAsIENIRUNLRUQgfScKLQotIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKLWx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIKLQotIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgotX0xUX1RBR19DT01QSUxFUgotCi0jIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQotX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCi1fTFRfTElOS0VSX0JPSUxFUlBMQVRFCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1sdF9zYXZlX0NDPSIkQ0MiCi1sdF9zYXZlX0dDQz0kR0NDCi1HQ0M9Ci1DQz0ke1JDLSJ3aW5kcmVzIn0KLWNvbXBpbGVyPSRDQwotX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQwotX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQotX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPXllcwotCi1pZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCi0gIDoKLSAgX0xUX0NPTkZJRygkMSkKLWZpCi0KLUdDQz0kbHRfc2F2ZV9HQ0MKLUFDX0xBTkdfUkVTVE9SRQotQ0M9IiRsdF9zYXZlX0NDIgotXSkjIF9MVF9MQU5HX1JDX0NPTkZJRwotCi0KLSMgTFRfUFJPR19HQ0oKLSMgLS0tLS0tLS0tLS0KLUFDX0RFRlVOKFtMVF9QUk9HX0dDSl0sCi1bbTRfaWZkZWYoW0FDX1BST0dfR0NKXSwgW0FDX1BST0dfR0NKXSwKLSAgW200X2lmZGVmKFtBXVtNX1BST0dfR0NKXSwgW0FdW01fUFJPR19HQ0pdLAotICAgIFtBQ19DSEVDS19UT09MKEdDSiwgZ2NqLCkKLSAgICAgIHRlc3QgIngke0dDSkZMQUdTK3NldH0iID0geHNldCB8fCBHQ0pGTEFHUz0iLWcgLU8yIgotICAgICAgQUNfU1VCU1QoR0NKRkxBR1MpXSldKVtdZG5sCi1dKQotCi0jIE9sZCBuYW1lOgotQVVfQUxJQVMoW0xUX0FDX1BST0dfR0NKXSwgW0xUX1BST0dfR0NKXSkKLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbTFRfQUNfUFJPR19HQ0pdLCBbXSkKLQotCi0jIExUX1BST0dfUkMKLSMgLS0tLS0tLS0tLQotQUNfREVGVU4oW0xUX1BST0dfUkNdLAotW0FDX0NIRUNLX1RPT0woUkMsIHdpbmRyZXMsKQotXSkKLQotIyBPbGQgbmFtZToKLUFVX0FMSUFTKFtMVF9BQ19QUk9HX1JDXSwgW0xUX1BST0dfUkNdKQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX1JDXSwgW10pCi0KLQotIyBfTFRfREVDTF9FR1JFUAotIyAtLS0tLS0tLS0tLS0tLQotIyBJZiB3ZSBkb24ndCBoYXZlIGEgbmV3IGVub3VnaCBBdXRvY29uZiB0byBjaG9vc2UgdGhlIGJlc3QgZ3JlcAotIyBhdmFpbGFibGUsIGNob29zZSB0aGUgb25lIGZpcnN0IGluIHRoZSB1c2VyJ3MgUEFUSC4KLW00X2RlZnVuKFtfTFRfREVDTF9FR1JFUF0sCi1bQUNfUkVRVUlSRShbQUNfUFJPR19FR1JFUF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0ZHUkVQXSlkbmwKLXRlc3QgLXogIiRHUkVQIiAmJiBHUkVQPWdyZXAKLV9MVF9ERUNMKFtdLCBbR1JFUF0sIFsxXSwgW0EgZ3JlcCBwcm9ncmFtIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzXSkKLV9MVF9ERUNMKFtdLCBbRUdSRVBdLCBbMV0sIFtBbiBFUkUgbWF0Y2hlcl0pCi1fTFRfREVDTChbXSwgW0ZHUkVQXSwgWzFdLCBbQSBsaXRlcmFsIHN0cmluZyBtYXRjaGVyXSkKLWRubCBOb24tYmxlZWRpbmctZWRnZSBhdXRvY29uZiBkb2Vzbid0IHN1YnN0IEdSRVAsIHNvIGRvIGl0IGhlcmUgdG9vCi1BQ19TVUJTVChbR1JFUF0pCi1dKQotCi0KLSMgX0xUX0RFQ0xfU0VECi0jIC0tLS0tLS0tLS0tLQotIyBDaGVjayBmb3IgYSBmdWxseS1mdW5jdGlvbmFsIHNlZCBwcm9ncmFtLCB0aGF0IHRydW5jYXRlcwotIyBhcyBmZXcgY2hhcmFjdGVycyBhcyBwb3NzaWJsZS4gIFByZWZlciBHTlUgc2VkIGlmIGZvdW5kLgotbTRfZGVmdW4oW19MVF9ERUNMX1NFRF0sCi1bQUNfUFJPR19TRUQKLXRlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKLVhzZWQ9IiRTRUQgLWUgMXMvXlgvLyIKLV9MVF9ERUNMKFtdLCBbU0VEXSwgWzFdLCBbQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCi1fTFRfREVDTChbXSwgW1hzZWRdLCBbIlwkU0VEIC1lIDFzL15YLy8iXSwKLSAgICBbU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW5dKQotXSkjIF9MVF9ERUNMX1NFRAotCi1tNF9pZm5kZWYoW0FDX1BST0dfU0VEXSwgWwotIyBOT1RFOiBUaGlzIG1hY3JvIGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGludG8gICAjCi0jICBHTlUgQXV0b2NvbmYgYXMgQUNfUFJPR19TRUQuICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICMKLSMgIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBBdXRvY29uZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgICAgIwotIyAgbWFjcm8gYW5kIHVzZSBpdCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0KLW00X2RlZnVuKFtBQ19QUk9HX1NFRF0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXRdKQotQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfU0VELAotWyMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3Igc2VkIGFuZCBnc2VkLgotIyBUaGVuIHVzZSB0aGF0IGxpc3Qgb2Ygc2VkJ3MgYXMgb25lcyB0byB0ZXN0IGZvciB0cnVuY2F0aW9uLgotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgbHRfYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgICAgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCi0gICAgICAgIGx0X2FjX3NlZF9saXN0PSIkbHRfYWNfc2VkX2xpc3QgJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCIKLSAgICAgIGZpCi0gICAgZG9uZQotICBkb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi1sdF9hY19tYXg9MAotbHRfYWNfY291bnQ9MAotIyBBZGQgL3Vzci94cGc0L2Jpbi9zZWQgYXMgaXQgaXMgdHlwaWNhbGx5IGZvdW5kIG9uIFNvbGFyaXMKLSMgYWxvbmcgd2l0aCAvYmluL3NlZCB0aGF0IHRydW5jYXRlcyBvdXRwdXQuCi1mb3IgbHRfYWNfc2VkIGluICRsdF9hY19zZWRfbGlzdCAvdXNyL3hwZzQvYmluL3NlZDsgZG8KLSAgdGVzdCAhIC1mICRsdF9hY19zZWQgJiYgY29udGludWUKLSAgY2F0IC9kZXYvbnVsbCA+IGNvbmZ0ZXN0LmluCi0gIGx0X2FjX2NvdW50PTAKLSAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPmNvbmZ0ZXN0LmluCi0gICMgQ2hlY2sgZm9yIEdOVSBzZWQgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgaWYgIiRsdF9hY19zZWQiIC0tdmVyc2lvbiAyPiYxIDwgL2Rldi9udWxsIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKLSAgICBicmVhawotICBmaQotICB3aGlsZSB0cnVlOyBkbwotICAgIGNhdCBjb25mdGVzdC5pbiBjb25mdGVzdC5pbiA+Y29uZnRlc3QudG1wCi0gICAgbXYgY29uZnRlc3QudG1wIGNvbmZ0ZXN0LmluCi0gICAgY3AgY29uZnRlc3QuaW4gY29uZnRlc3QubmwKLSAgICBlY2hvID4+Y29uZnRlc3QubmwKLSAgICAkbHRfYWNfc2VkIC1lICdzL2EkLy8nIDwgY29uZnRlc3QubmwgPmNvbmZ0ZXN0Lm91dCB8fCBicmVhawotICAgIGNtcCAtcyBjb25mdGVzdC5vdXQgY29uZnRlc3QubmwgfHwgYnJlYWsKLSAgICAjIDEwMDAwIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSAgICB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSAgICBsdF9hY19jb3VudD1gZXhwciAkbHRfYWNfY291bnQgKyAxYAotICAgIGlmIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAkbHRfYWNfbWF4OyB0aGVuCi0gICAgICBsdF9hY19tYXg9JGx0X2FjX2NvdW50Ci0gICAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCi0gICAgZmkKLSAgZG9uZQotZG9uZQotXSkKLVNFRD0kbHRfY3ZfcGF0aF9TRUQKLUFDX1NVQlNUKFtTRURdKQotQUNfTVNHX1JFU1VMVChbJFNFRF0pCi1dKSNBQ19QUk9HX1NFRAotXSkjbTRfaWZuZGVmCi0KLSMgT2xkIG5hbWU6Ci1BVV9BTElBUyhbTFRfQUNfUFJPR19TRURdLCBbQUNfUFJPR19TRURdKQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0sIFtdKQotCi0KLSMgX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBGaW5kIG91dCB3aGV0aGVyIHRoZSBzaGVsbCBpcyBCb3VybmUgb3IgWFNJIGNvbXBhdGlibGUsCi0jIG9yIGhhcyBzb21lIG90aGVyIHVzZWZ1bCBmZWF0dXJlcy4KLW00X2RlZnVuKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgc29tZSBYU0kgY29uc3RydWN0c10pCi0jIFRyeSBzb21lIFhTSSBmZWF0dXJlcwoteHNpX3NoZWxsPW5vCi0oIF9sdF9kdW1teT0iYS9iL2MiCi0gIHRlc3QgIiR7X2x0X2R1bW15IyMqL30sJHtfbHRfZHVtbXklLyp9LCIke19sdF9kdW1teSUiJF9sdF9kdW1teSJ9LCBcCi0gICAgICA9IGMsYS9iLCwgXAotICAgICYmIGV2YWwgJ3Rlc3QgJCgoIDEgKyAxICkpIC1lcSAyIFwKLSAgICAmJiB0ZXN0ICIkeyNfbHRfZHVtbXl9IiAtZXEgNScgKSA+L2Rldi9udWxsIDI+JjEgXAotICAmJiB4c2lfc2hlbGw9eWVzCi1BQ19NU0dfUkVTVUxUKFskeHNpX3NoZWxsXSkKLV9MVF9DT05GSUdfTElCVE9PTF9JTklUKFt4c2lfc2hlbGw9JyR4c2lfc2hlbGwnXSkKLQotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAiKz0iXSkKLWx0X3NoZWxsX2FwcGVuZD1ubwotKCBmb289YmFyOyBzZXQgZm9vIGJhejsgZXZhbCAiJFsxXSs9XCRbMl0iICYmIHRlc3QgIiRmb28iID0gYmFyYmF6ICkgXAotICAgID4vZGV2L251bGwgMj4mMSBcCi0gICYmIGx0X3NoZWxsX2FwcGVuZD15ZXMKLUFDX01TR19SRVNVTFQoWyRsdF9zaGVsbF9hcHBlbmRdKQotX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW2x0X3NoZWxsX2FwcGVuZD0nJGx0X3NoZWxsX2FwcGVuZCddKQotCi1pZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgbHRfdW5zZXQ9dW5zZXQKLWVsc2UKLSAgbHRfdW5zZXQ9ZmFsc2UKLWZpCi1fTFRfREVDTChbXSwgW2x0X3Vuc2V0XSwgWzBdLCBbd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgInVuc2V0Il0pZG5sCi0KLSMgdGVzdCBFQkNESUMgb3IgQVNDSUkKLWNhc2UgYGVjaG8gWHx0ciBYICdcMTAxJ2AgaW4KLSBBKSAjIEFTQ0lJIGJhc2VkIHN5c3RlbQotICAgICMgXG4gaXMgbm90IGludGVycHJldGVkIGNvcnJlY3RseSBieSBTb2xhcmlzIDggL3Vzci91Y2IvdHIKLSAgbHRfU1AyTkw9J3RyIFwwNDAgXDAxMicKLSAgbHRfTkwyU1A9J3RyIFwwMTVcMDEyIFwwNDBcMDQwJwotICA7OwotICopICMgRUJDRElDIGJhc2VkIHN5c3RlbQotICBsdF9TUDJOTD0ndHIgXDEwMCBcbicKLSAgbHRfTkwyU1A9J3RyIFxyXG4gXDEwMFwxMDAnCi0gIDs7Ci1lc2FjCi1fTFRfREVDTChbU1AyTkxdLCBbbHRfU1AyTkxdLCBbMV0sIFt0dXJuIHNwYWNlcyBpbnRvIG5ld2xpbmVzXSlkbmwKLV9MVF9ERUNMKFtOTDJTUF0sIFtsdF9OTDJTUF0sIFsxXSwgW3R1cm4gbmV3bGluZXMgaW50byBzcGFjZXNdKWRubAotXSkjIF9MVF9DSEVDS19TSEVMTF9GRUFUVVJFUwotCi0KLSMgX0xUX1BST0dfWFNJX1NIRUxMRk5TCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBCb3VybmUgYW5kIFhTSSBjb21wYXRpYmxlIHZhcmlhbnRzIG9mIHNvbWUgdXNlZnVsIHNoZWxsIGZ1bmN0aW9ucy4KLW00X2RlZnVuKFtfTFRfUFJPR19YU0lfU0hFTExGTlNdLAotW2Nhc2UgJHhzaV9zaGVsbCBpbgotICB5ZXMpCi0gICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBmdW5jX2Rpcm5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50Ci0jIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LCBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsCi0jIG90aGVyd2lzZSBzZXQgcmVzdWx0IHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KLWZ1bmNfZGlybmFtZSAoKQotewotICBjYXNlICR7MX0gaW4KLSAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7OwotICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKLSAgZXNhYwotfQotCi0jIGZ1bmNfYmFzZW5hbWUgZmlsZQotZnVuY19iYXNlbmFtZSAoKQotewotICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iCi19Ci0KLSMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKLSMgcGVyZm9ybSBmdW5jX2Jhc2VuYW1lIGFuZCBmdW5jX2Rpcm5hbWUgaW4gYSBzaW5nbGUgZnVuY3Rpb24KLSMgY2FsbDoKLSMgICBkaXJuYW1lOiAgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksCi0jICAgICAgICAgICAgIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwgb3RoZXJ3aXNlIHNldCByZXN1bHQKLSMgICAgICAgICAgICAgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgotIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfZGlybmFtZV9yZXN1bHQiCi0jICAgYmFzZW5hbWU6IENvbXB1dGUgZmlsZW5hbWUgb2YgRklMRS4KLSMgICAgICAgICAgICAgdmFsdWUgcmV0dW5lZCBpbiAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotIyBJbXBsZW1lbnRhdGlvbiBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggZnVuY19kaXJuYW1lCi0jIGFuZCBmdW5jX2Jhc2VuYW1lLiBGb3IgZWZmaWNpZW5jeSwgd2UgZG8gbm90IGRlbGVnYXRlIHRvCi0jIHRob3NlIGZ1bmN0aW9ucyBidXQgaW5zdGVhZCBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgaGVyZS4KLWZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgKCkKLXsKLSAgY2FzZSAkezF9IGluCi0gICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOzsKLSAgICAqICApIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iIDs7Ci0gIGVzYWMKLSAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99IgotfQotCi0jIGZ1bmNfc3RyaXBuYW1lIHByZWZpeCBzdWZmaXggbmFtZQotIyBzdHJpcCBQUkVGSVggYW5kIFNVRkZJWCBvZmYgb2YgTkFNRS4KLSMgUFJFRklYIGFuZCBTVUZGSVggbXVzdCBub3QgY29udGFpbiBnbG9iYmluZyBvciByZWdleCBzcGVjaWFsCi0jIGNoYXJhY3RlcnMsIGhhc2hlcywgcGVyY2VudCBzaWducywgYnV0IFNVRkZJWCBtYXkgY29udGFpbiBhIGxlYWRpbmcKLSMgZG90IChpbiB3aGljaCBjYXNlIHRoYXQgbWF0Y2hlcyBvbmx5IGEgZG90KS4KLWZ1bmNfc3RyaXBuYW1lICgpCi17Ci0gICMgcGRrc2ggNS4yLjE0IGRvZXMgbm90IGRvICR7WCUkWX0gY29ycmVjdGx5IGlmIGJvdGggWCBhbmQgWSBhcmUKLSAgIyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIHNvIGFzc2lnbiBvbmUgdG8gb3JkaW5hcnkgcGFyYW1ldGVyIGZpcnN0LgotICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHszfQotICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQjIiR7MX0ifQotICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQlIiR7Mn0ifQotfQotCi0jIGZ1bmNfb3B0X3NwbGl0Ci1mdW5jX29wdF9zcGxpdCAoKQotewotICBmdW5jX29wdF9zcGxpdF9vcHQ9JHsxJSU9Kn0KLSAgZnVuY19vcHRfc3BsaXRfYXJnPSR7MSMqPX0KLX0KLQotIyBmdW5jX2xvMm8gb2JqZWN0Ci1mdW5jX2xvMm8gKCkKLXsKLSAgY2FzZSAkezF9IGluCi0gICAgKi5sbykgZnVuY19sbzJvX3Jlc3VsdD0kezElLmxvfS4ke29iamV4dH0gOzsKLSAgICAqKSAgICBmdW5jX2xvMm9fcmVzdWx0PSR7MX0gOzsKLSAgZXNhYwotfQotCi0jIGZ1bmNfeGZvcm0gbGlib2JqLW9yLXNvdXJjZQotZnVuY194Zm9ybSAoKQotewotICBmdW5jX3hmb3JtX3Jlc3VsdD0kezElLip9LmxvCi19Ci0KLSMgZnVuY19hcml0aCBhcml0aG1ldGljLXRlcm0uLi4KLWZ1bmNfYXJpdGggKCkKLXsKLSAgZnVuY19hcml0aF9yZXN1bHQ9JCgoICRbKl0gKSkKLX0KLQotIyBmdW5jX2xlbiBzdHJpbmcKLSMgU1RSSU5HIG1heSBub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbi4KLWZ1bmNfbGVuICgpCi17Ci0gIGZ1bmNfbGVuX3Jlc3VsdD0keyMxfQotfQotCi1fTFRfRU9GCi0gICAgOzsKLSAgKikgIyBCb3VybmUgY29tcGF0aWJsZSBmdW5jdGlvbnMuCi0gICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBmdW5jX2Rpcm5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50Ci0jIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LCBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsCi0jIG90aGVyd2lzZSBzZXQgcmVzdWx0IHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KLWZ1bmNfZGlybmFtZSAoKQotewotICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotICBmdW5jX2Rpcm5hbWVfcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRkaXJuYW1lImAKLSAgaWYgdGVzdCAiWCRmdW5jX2Rpcm5hbWVfcmVzdWx0IiA9ICJYJHsxfSI7IHRoZW4KLSAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgotICBlbHNlCi0gICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkezJ9IgotICBmaQotfQotCi0jIGZ1bmNfYmFzZW5hbWUgZmlsZQotZnVuY19iYXNlbmFtZSAoKQotewotICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkYmFzZW5hbWUiYAotfQotCi1kbmwgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZQotZG5sIEEgcG9ydGFibGUgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBnZW5lcmFsLm00c2gKLWRubCBzbyB0aGVyZSBpcyBubyBuZWVkIGZvciBpdCBoZXJlLgotCi0jIGZ1bmNfc3RyaXBuYW1lIHByZWZpeCBzdWZmaXggbmFtZQotIyBzdHJpcCBQUkVGSVggYW5kIFNVRkZJWCBvZmYgb2YgTkFNRS4KLSMgUFJFRklYIGFuZCBTVUZGSVggbXVzdCBub3QgY29udGFpbiBnbG9iYmluZyBvciByZWdleCBzcGVjaWFsCi0jIGNoYXJhY3RlcnMsIGhhc2hlcywgcGVyY2VudCBzaWducywgYnV0IFNVRkZJWCBtYXkgY29udGFpbiBhIGxlYWRpbmcKLSMgZG90IChpbiB3aGljaCBjYXNlIHRoYXQgbWF0Y2hlcyBvbmx5IGEgZG90KS4KLSMgZnVuY19zdHJpcF9zdWZmaXggcHJlZml4IG5hbWUKLWZ1bmNfc3RyaXBuYW1lICgpCi17Ci0gIGNhc2UgJHsyfSBpbgotICAgIC4qKSBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHszfSIgXAotICAgICAgICAgICB8ICRYc2VkIC1lICJzJV4kezF9JSUiIC1lICJzJVxcXFwkezJ9XCQlJSJgOzsKLSAgICAqKSAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiWCR7M30iIFwKLSAgICAgICAgICAgfCAkWHNlZCAtZSAicyVeJHsxfSUlIiAtZSAicyUkezJ9XCQlJSJgOzsKLSAgZXNhYwotfQotCi0jIHNlZCBzY3JpcHRzOgotbXlfc2VkX2xvbmdfb3B0PScxcy9eXCgtW1tePV1dKlwpPS4qL1wxLztxJwotbXlfc2VkX2xvbmdfYXJnPScxcy9eLVtbXj1dXSo9Ly8nCi0KLSMgZnVuY19vcHRfc3BsaXQKLWZ1bmNfb3B0X3NwbGl0ICgpCi17Ci0gIGZ1bmNfb3B0X3NwbGl0X29wdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkbXlfc2VkX2xvbmdfb3B0ImAKLSAgZnVuY19vcHRfc3BsaXRfYXJnPWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRteV9zZWRfbG9uZ19hcmciYAotfQotCi0jIGZ1bmNfbG8ybyBvYmplY3QKLWZ1bmNfbG8ybyAoKQotewotICBmdW5jX2xvMm9fcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRsbzJvImAKLX0KLQotIyBmdW5jX3hmb3JtIGxpYm9iai1vci1zb3VyY2UKLWZ1bmNfeGZvcm0gKCkKLXsKLSAgZnVuY194Zm9ybV9yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAncy9cLltbXi5dXSokLy5sby8nYAotfQotCi0jIGZ1bmNfYXJpdGggYXJpdGhtZXRpYy10ZXJtLi4uCi1mdW5jX2FyaXRoICgpCi17Ci0gIGZ1bmNfYXJpdGhfcmVzdWx0PWBleHByICIkW0BdImAKLX0KLQotIyBmdW5jX2xlbiBzdHJpbmcKLSMgU1RSSU5HIG1heSBub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbi4KLWZ1bmNfbGVuICgpCi17Ci0gIGZ1bmNfbGVuX3Jlc3VsdD1gZXhwciAiJFsxXSIgOiAiLioiIDI+L2Rldi9udWxsIHx8IGVjaG8gJG1heF9jbWRfbGVuYAotfQotCi1fTFRfRU9GCi1lc2FjCi0KLWNhc2UgJGx0X3NoZWxsX2FwcGVuZCBpbgotICB5ZXMpCi0gICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKLQotIyBmdW5jX2FwcGVuZCB2YXIgdmFsdWUKLSMgQXBwZW5kIFZBTFVFIHRvIHRoZSBlbmQgb2Ygc2hlbGwgdmFyaWFibGUgVkFSLgotZnVuY19hcHBlbmQgKCkKLXsKLSAgZXZhbCAiJFsxXSs9XCRbMl0iCi19Ci1fTFRfRU9GCi0gICAgOzsKLSAgKikKLSAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgotCi0jIGZ1bmNfYXBwZW5kIHZhciB2YWx1ZQotIyBBcHBlbmQgVkFMVUUgdG8gdGhlIGVuZCBvZiBzaGVsbCB2YXJpYWJsZSBWQVIuCi1mdW5jX2FwcGVuZCAoKQotewotICBldmFsICIkWzFdPVwkJFsxXVwkWzJdIgotfQotCi1fTFRfRU9GCi0gICAgOzsKLSAgZXNhYwotXSkKLQotIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0jCi0jICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyAgIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0Ci0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCi0jIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNSBsdG9wdGlvbnMubTQKLQotIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KLUFDX0RFRlVOKFtMVE9QVElPTlNfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKLQotCi0jIF9MVF9NQU5HTEVfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbX0xUX01BTkdMRV9PUFRJT05dLAotW1tfTFRfT1BUSU9OX11tNF9icGF0c3Vic3QoJDFfXyQyLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQotCi0KLSMgX0xUX1NFVF9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZXQgb3B0aW9uIE9QVElPTi1OQU1FIGZvciBtYWNybyBNQUNSTy1OQU1FLCBhbmQgaWYgdGhlcmUgaXMgYQotIyBtYXRjaGluZyBoYW5kbGVyIGRlZmluZWQsIGRpc3BhdGNoIHRvIGl0LiAgT3RoZXIgT1BUSU9OLU5BTUVzIGFyZQotIyBzYXZlZCBhcyBhIGZsYWcuCi1tNF9kZWZpbmUoW19MVF9TRVRfT1BUSU9OXSwKLVttNF9kZWZpbmUoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSkpZG5sCi1tNF9pZmRlZihfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAotICAgICAgICBfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAotICAgIFttNF93YXJuaW5nKFtVbmtub3duICQxIG9wdGlvbiBgJDInXSldKVtdZG5sCi1dKQotCi0KLSMgX0xUX0lGX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KLW00X2RlZmluZShbX0xUX0lGX09QVElPTl0sCi1bbTRfaWZkZWYoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSksIFskM10sIFskNF0pXSkKLQotCi0jIF9MVF9VTkxFU1NfT1BUSU9OUyhNQUNSTy1OQU1FLCBPUFRJT04tTElTVCwgSUYtTk9ULVNFVCkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFeGVjdXRlIElGLU5PVC1TRVQgdW5sZXNzIGFsbCBvcHRpb25zIGluIE9QVElPTi1MSVNUIGZvciBNQUNSTy1OQU1FCi0jIGFyZSBzZXQuCi1tNF9kZWZpbmUoW19MVF9VTkxFU1NfT1BUSU9OU10sCi1bbTRfZm9yZWFjaChbX0xUX09wdGlvbl0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDJdKSksCi0JICAgIFttNF9pZmRlZihfTFRfTUFOR0xFX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKSwKLQkJICAgICAgW200X2RlZmluZShbJDBfZm91bmRdKV0pXSlbXWRubAotbTRfaWZkZWYoWyQwX2ZvdW5kXSwgW200X3VuZGVmaW5lKFskMF9mb3VuZF0pXSwgWyQzCi1dKVtdZG5sCi1dKQotCi0KLSMgX0xUX1NFVF9PUFRJT05TKE1BQ1JPLU5BTUUsIE9QVElPTi1MSVNUKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE9QVElPTi1MSVNUIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgTGlidG9vbCBvcHRpb25zIGFzc29jaWF0ZWQKLSMgd2l0aCBNQUNSTy1OQU1FLiAgSWYgYW55IE9QVElPTiBoYXMgYSBtYXRjaGluZyBoYW5kbGVyIGRlY2xhcmVkIHdpdGgKLSMgTFRfT1BUSU9OX0RFRklORSwgZGlzcGF0Y2ggdG8gdGhhdCBtYWNybzsgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0Ci0jIHRoZSB1bmtub3duIG9wdGlvbiBhbmQgZXhpdC4KLW00X2RlZnVuKFtfTFRfU0VUX09QVElPTlNdLAotWyMgU2V0IG9wdGlvbnMKLW00X2ZvcmVhY2goW19MVF9PcHRpb25dLCBtNF9zcGxpdChtNF9ub3JtYWxpemUoWyQyXSkpLAotICAgIFtfTFRfU0VUX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKV0pCi0KLW00X2lmKFskMV0sW0xUX0lOSVRdLFsKLSAgZG5sCi0gIGRubCBTaW1wbHkgc2V0IHNvbWUgZGVmYXVsdCB2YWx1ZXMgKGkuZSBvZmYpIGlmIGJvb2xlYW4gb3B0aW9ucyB3ZXJlIG5vdAotICBkbmwgc3BlY2lmaWVkOgotICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49bm8KLSAgXSkKLSAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0sIFtlbmFibGVfd2luMzJfZGxsPW5vCi0gIF0pCi0gIGRubAotICBkbmwgSWYgbm8gcmVmZXJlbmNlIHdhcyBtYWRlIHRvIHZhcmlvdXMgcGFpcnMgb2Ygb3Bwb3Npbmcgb3B0aW9ucywgdGhlbgotICBkbmwgd2UgcnVuIHRoZSBkZWZhdWx0IG1vZGUgaGFuZGxlciBmb3IgdGhlIHBhaXIuICBGb3IgZXhhbXBsZSwgaWYgbmVpdGhlcgotICBkbmwgYHNoYXJlZCcgbm9yIGBkaXNhYmxlLXNoYXJlZCcgd2FzIHBhc3NlZCwgd2UgZW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZAotICBkbmwgYXJjaGl2ZXMgYnkgZGVmYXVsdDoKLSAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3NoYXJlZCBkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRF0pCi0gIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtzdGF0aWMgZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUNdKQotICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbcGljLW9ubHkgbm8tcGljXSwgW19MVF9XSVRIX1BJQ10pCi0gIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGwgZGlzYWJsZS1mYXN0LWluc3RhbGxdLAotICAJCSAgIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pCi0gIF0pCi1dKSMgX0xUX1NFVF9PUFRJT05TCi0KLQotCi0jIF9MVF9NQU5HTEVfREVGVU4oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZpbmUoW19MVF9NQU5HTEVfREVGVU5dLAotW1tfTFRfT1BUSU9OX0RFRlVOX11tNF9icGF0c3Vic3QobTRfdG91cHBlcihbJDFfXyQyXSksIFtbXkEtWjAtOV9dXSwgW19dKV0pCi0KLQotIyBMVF9PUFRJT05fREVGSU5FKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FLCBDT0RFKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtMVF9PUFRJT05fREVGSU5FXSwKLVttNF9kZWZpbmUoX0xUX01BTkdMRV9ERUZVTihbJDFdLCBbJDJdKSwgWyQzXSlbXWRubAotXSkjIExUX09QVElPTl9ERUZJTkUKLQotCi0jIGRsb3BlbgotIyAtLS0tLS0KLUxUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49eWVzCi1dKQotCi1BVV9ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLAotW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rsb3Blbl0pCi1BQ19ESUFHTk9TRShbb2Jzb2xldGVdLAotWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQotcHV0IHRoZSBgZGxvcGVuJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCi1dKQotCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwgW10pCi0KLQotIyB3aW4zMi1kbGwKLSMgLS0tLS0tLS0tCi0jIERlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBkbGwncy4KLUxUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbd2luMzItZGxsXSwKLVtlbmFibGVfd2luMzJfZGxsPXllcwotCi1jYXNlICRob3N0IGluCi0qLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiopCi0gIEFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLSAgQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKLSAgQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKLSAgOzsKLWVzYWMKLQotdGVzdCAteiAiJEFTIiAmJiBBUz1hcwotX0xUX0RFQ0woW10sIFtBU10sICAgICAgWzBdLCBbQXNzZW1ibGVyIHByb2dyYW1dKWRubAotCi10ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCi1fTFRfREVDTChbXSwgW0RMTFRPT0xdLCBbMF0sIFtETEwgY3JlYXRpb24gcHJvZ3JhbV0pZG5sCi0KLXRlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKLV9MVF9ERUNMKFtdLCBbT0JKRFVNUF0sIFswXSwgW09iamVjdCBkdW1wZXIgcHJvZ3JhbV0pZG5sCi1dKSMgd2luMzItZGxsCi0KLUFVX0RFRlVOKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbd2luMzItZGxsXSkKLUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCi1bJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91Ci1wdXQgdGhlIGB3aW4zMi1kbGwnIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKLV0pCi0KLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQUNfTElCVE9PTF9XSU4zMl9ETExdLCBbXSkKLQotCi0jIF9MVF9FTkFCTEVfU0hBUkVEKFtERUZBVUxUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnLCBhbmQgc3VwcG9ydHMgdGhlIGBzaGFyZWQnIGFuZAotIyBgZGlzYWJsZS1zaGFyZWQnIExUX0lOSVQgb3B0aW9ucy4KLSMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgotbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NIQVJFRF0sCi1bbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAotQUNfQVJHX0VOQUJMRShbc2hhcmVkXSwKLSAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNoYXJlZEA8OkA9UEtHU0A6PkBdLAotCVtidWlsZCBzaGFyZWQgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX1NIQVJFRF9ERUZBVUxUW0A6PkBdKV0sCi0gICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci0gICAgY2FzZSAkZW5hYmxldmFsIGluCi0gICAgeWVzKSBlbmFibGVfc2hhcmVkPXllcyA7OwotICAgIG5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0gICAgKikKLSAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KLSAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgotICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotCUlGUz0iJGx0X3NhdmVfaWZzIgotCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0JICBlbmFibGVfc2hhcmVkPXllcwotCWZpCi0gICAgICBkb25lCi0gICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKLSAgICAgIDs7Ci0gICAgZXNhY10sCi0gICAgW2VuYWJsZV9zaGFyZWQ9XV9MVF9FTkFCTEVfU0hBUkVEX0RFRkFVTFQpCi0KLSAgICBfTFRfREVDTChbYnVpbGRfbGlidG9vbF9saWJzXSwgW2VuYWJsZV9zaGFyZWRdLCBbMF0sCi0JW1doZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQotXSkjIF9MVF9FTkFCTEVfU0hBUkVECi0KLUxUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbc2hhcmVkXSwgW19MVF9FTkFCTEVfU0hBUkVEKFt5ZXNdKV0pCi1MVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Rpc2FibGUtc2hhcmVkXSwgW19MVF9FTkFCTEVfU0hBUkVEKFtub10pXSkKLQotIyBPbGQgbmFtZXM6Ci1BQ19ERUZVTihbQUNfRU5BQkxFX1NIQVJFRF0sCi1bX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBtNF9pZihbJDFdLCBbbm9dLCBbZGlzYWJsZS1dKVtzaGFyZWRdKQotXSkKLQotQUNfREVGVU4oW0FDX0RJU0FCTEVfU0hBUkVEXSwKLVtfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtkaXNhYmxlLXNoYXJlZF0pCi1dKQotCi1BVV9ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sIFtBQ19FTkFCTEVfU0hBUkVEKCRAKV0pCi1BVV9ERUZVTihbQU1fRElTQUJMRV9TSEFSRURdLCBbQUNfRElTQUJMRV9TSEFSRUQoJEApXSkKLQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtBTV9FTkFCTEVfU0hBUkVEXSwgW10pCi1kbmwgQUNfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW10pCi0KLQotCi0jIF9MVF9FTkFCTEVfU1RBVElDKFtERUZBVUxUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnLCBhbmQgc3VwcG9ydCB0aGUgYHN0YXRpYycgYW5kCi0jIGBkaXNhYmxlLXN0YXRpYycgTFRfSU5JVCBvcHRpb25zLgotIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCi1tNF9kZWZpbmUoW19MVF9FTkFCTEVfU1RBVElDXSwKLVttNF9kZWZpbmUoW19MVF9FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBbbTRfaWYoJDEsIG5vLCBubywgeWVzKV0pZG5sCi1BQ19BUkdfRU5BQkxFKFtzdGF0aWNdLAotICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RhdGljQDw6QD1QS0dTQDo+QF0sCi0JW2J1aWxkIHN0YXRpYyBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfU1RBVElDX0RFRkFVTFRbQDo+QF0pXSwKLSAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLSAgICBjYXNlICRlbmFibGV2YWwgaW4KLSAgICB5ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci0gICAgbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSAgICAqKQotICAgICBlbmFibGVfc3RhdGljPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX3N0YXRpYz15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWNdLAotICAgIFtlbmFibGVfc3RhdGljPV1fTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKQotCi0gICAgX0xUX0RFQ0woW2J1aWxkX29sZF9saWJzXSwgW2VuYWJsZV9zdGF0aWNdLCBbMF0sCi0JW1doZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQotXSkjIF9MVF9FTkFCTEVfU1RBVElDCi0KLUxUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbc3RhdGljXSwgW19MVF9FTkFCTEVfU1RBVElDKFt5ZXNdKV0pCi1MVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Rpc2FibGUtc3RhdGljXSwgW19MVF9FTkFCTEVfU1RBVElDKFtub10pXSkKLQotIyBPbGQgbmFtZXM6Ci1BQ19ERUZVTihbQUNfRU5BQkxFX1NUQVRJQ10sCi1bX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBtNF9pZihbJDFdLCBbbm9dLCBbZGlzYWJsZS1dKVtzdGF0aWNdKQotXSkKLQotQUNfREVGVU4oW0FDX0RJU0FCTEVfU1RBVElDXSwKLVtfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtkaXNhYmxlLXN0YXRpY10pCi1dKQotCi1BVV9ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sIFtBQ19FTkFCTEVfU1RBVElDKCRAKV0pCi1BVV9ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbQUNfRElTQUJMRV9TVEFUSUMoJEApXSkKLQotZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgotZG5sIEFDX0RFRlVOKFtBTV9FTkFCTEVfU1RBVElDXSwgW10pCi1kbmwgQUNfREVGVU4oW0FNX0RJU0FCTEVfU1RBVElDXSwgW10pCi0KLQotCi0jIF9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMKFtERUZBVUxUXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnLCBhbmQgc3VwcG9ydCB0aGUgYGZhc3QtaW5zdGFsbCcKLSMgYW5kIGBkaXNhYmxlLWZhc3QtaW5zdGFsbCcgTFRfSU5JVCBvcHRpb25zLgotIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCi1tNF9kZWZpbmUoW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMXSwKLVttNF9kZWZpbmUoW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBbbTRfaWYoJDEsIG5vLCBubywgeWVzKV0pZG5sCi1BQ19BUkdfRU5BQkxFKFtmYXN0LWluc3RhbGxdLAotICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZmFzdC1pbnN0YWxsQDw6QD1QS0dTQDo+QF0sCi0gICAgW29wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVFtAOj5AXSldLAotICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQotICAgIGNhc2UgJGVuYWJsZXZhbCBpbgotICAgIHllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLSAgICBubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotICAgICopCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKLSAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLQlJRlM9IiRsdF9zYXZlX2lmcyIKLQlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotCSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLQlmaQotICAgICAgZG9uZQotICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCi0gICAgICA7OwotICAgIGVzYWNdLAotICAgIFtlbmFibGVfZmFzdF9pbnN0YWxsPV1fTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKQotCi1fTFRfREVDTChbZmFzdF9pbnN0YWxsXSwgW2VuYWJsZV9mYXN0X2luc3RhbGxdLCBbMF0sCi0JIFtXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb25dKWRubAotXSkjIF9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMCi0KLUxUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZmFzdC1pbnN0YWxsXSwgW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMKFt5ZXNdKV0pCi1MVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Rpc2FibGUtZmFzdC1pbnN0YWxsXSwgW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMKFtub10pXSkKLQotIyBPbGQgbmFtZXM6Ci1BVV9ERUZVTihbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sCi1bX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBtNF9pZihbJDFdLCBbbm9dLCBbZGlzYWJsZS1dKVtmYXN0LWluc3RhbGxdKQotQUNfRElBR05PU0UoW29ic29sZXRlXSwKLVskMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UgcHV0Ci10aGUgYGZhc3QtaW5zdGFsbCcgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQotXSkKLQotQVVfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwKLVtfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtkaXNhYmxlLWZhc3QtaW5zdGFsbF0pCi1BQ19ESUFHTk9TRShbb2Jzb2xldGVdLAotWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdSBwdXQKLXRoZSBgZGlzYWJsZS1mYXN0LWluc3RhbGwnIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKLV0pCi0KLWRubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKLWRubCBBQ19ERUZVTihbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sIFtdKQotZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sIFtdKQotCi0KLSMgX0xUX1dJVEhfUElDKFtNT0RFXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgaW1wbGVtZW50IHRoZSAtLXdpdGgtcGljIGZsYWcsIGFuZCBzdXBwb3J0IHRoZSBgcGljLW9ubHknIGFuZCBgbm8tcGljJwotIyBMVF9JTklUIG9wdGlvbnMuCi0jIE1PREUgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgYm90aCcuCi1tNF9kZWZpbmUoW19MVF9XSVRIX1BJQ10sCi1bQUNfQVJHX1dJVEgoW3BpY10sCi0gICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtcGljXSwKLQlbdHJ5IHRvIHVzZSBvbmx5IFBJQy9ub24tUElDIG9iamVjdHMgQDw6QGRlZmF1bHQ9dXNlIGJvdGhAOj5AXSldLAotICAgIFtwaWNfbW9kZT0iJHdpdGh2YWwiXSwKLSAgICBbcGljX21vZGU9ZGVmYXVsdF0pCi0KLXRlc3QgLXogIiRwaWNfbW9kZSIgJiYgcGljX21vZGU9bTRfZGVmYXVsdChbJDFdLCBbZGVmYXVsdF0pCi0KLV9MVF9ERUNMKFtdLCBbcGljX21vZGVdLCBbMF0sIFtXaGF0IHR5cGUgb2Ygb2JqZWN0cyB0byBidWlsZF0pZG5sCi1dKSMgX0xUX1dJVEhfUElDCi0KLUxUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbcGljLW9ubHldLCBbX0xUX1dJVEhfUElDKFt5ZXNdKV0pCi1MVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW25vLXBpY10sIFtfTFRfV0lUSF9QSUMoW25vXSldKQotCi0jIE9sZCBuYW1lOgotQVVfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sCi1bX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbcGljLW9ubHldKQotQUNfRElBR05PU0UoW29ic29sZXRlXSwKLVskMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UKLXB1dCB0aGUgYHBpYy1vbmx5JyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCi1dKQotCi1kbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6Ci1kbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sIFtdKQotCi0KLW00X2RlZmluZShbX0xURExfTU9ERV0sIFtdKQotTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW25vbnJlY3Vyc2l2ZV0sCi0JCSBbbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW25vbnJlY3Vyc2l2ZV0pXSkKLUxUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtyZWN1cnNpdmVdLAotCQkgW200X2RlZmluZShbX0xURExfTU9ERV0sIFtyZWN1cnNpdmVdKV0pCi1MVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbc3VicHJvamVjdF0sCi0JCSBbbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW3N1YnByb2plY3RdKV0pCi0KLW00X2RlZmluZShbX0xURExfVFlQRV0sIFtdKQotTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW2luc3RhbGxhYmxlXSwKLQkJIFttNF9kZWZpbmUoW19MVERMX1RZUEVdLCBbaW5zdGFsbGFibGVdKV0pCi1MVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbY29udmVuaWVuY2VdLAotCQkgW200X2RlZmluZShbX0xURExfVFlQRV0sIFtjb252ZW5pZW5jZV0pXSkKLQotIyBsdHN1Z2FyLm00IC0tIGxpYnRvb2wgbTQgYmFzZSBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgLSotQXV0b2NvbmYtKi0KLSMKLSMgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jICAgV3JpdHRlbiBieSBHYXJ5IFYuIFZhdWdoYW4sIDIwMDQKLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKLSMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA1IGx0c3VnYXIubTQKLQotIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KLUFDX0RFRlVOKFtMVFNVR0FSX1ZFUlNJT05dLCBbbTRfaWYoWzAuMV0pXSkKLQotCi0jIGx0X2pvaW4oU0VQLCBBUkcxLCBbQVJHMi4uLl0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFByb2R1Y2UgQVJHMVNFUEFSRzIuLi5TRVBBUkduLCBvbWl0dGluZyBbXSBhcmd1bWVudHMgYW5kIHRoZWlyCi0jIGFzc29jaWF0ZWQgc2VwYXJhdG9yLgotIyBOZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gbTRfam9pbiBmcm9tIEF1dG9jb25mIDIuNjIsIHNpbmNlIGFsbCBlYXJsaWVyCi0jIHZlcnNpb25zIGluIG00c3VnYXIgaGFkIGJ1Z3MuCi1tNF9kZWZpbmUoW2x0X2pvaW5dLAotW200X2lmKFskI10sIFsxXSwgW10sCi0gICAgICAgWyQjXSwgWzJdLCBbWyQyXV0sCi0gICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMl1fXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKLW00X2RlZmluZShbX2x0X2pvaW5dLAotW200X2lmKFskIyQyXSwgWzJdLCBbXSwKLSAgICAgICBbbTRfaWYoWyQyXSwgW10sIFtdLCBbWyQxJDJdXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKLQotCi0jIGx0X2NhcihMSVNUKQotIyBsdF9jZHIoTElTVCkKLSMgLS0tLS0tLS0tLS0tCi0jIE1hbmlwdWxhdGUgbTQgbGlzdHMuCi0jIFRoZXNlIG1hY3JvcyBhcmUgbmVjZXNzYXJ5IGFzIGxvbmcgYXMgd2lsbCBzdGlsbCBuZWVkIHRvIHN1cHBvcnQKLSMgQXV0b2NvbmYtMi41OSB3aGljaCBxdW90ZXMgZGlmZmVyZW50bHkuCi1tNF9kZWZpbmUoW2x0X2Nhcl0sIFtbJDFdXSkKLW00X2RlZmluZShbbHRfY2RyXSwKLVttNF9pZihbJCNdLCAwLCBbbTRfZmF0YWwoWyQwOiBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzXSldLAotICAgICAgIFskI10sIDEsIFtdLAotICAgICAgIFttNF9kcXVvdGUobTRfc2hpZnQoJEApKV0pXSkKLW00X2RlZmluZShbbHRfdW5xdW90ZV0sICQxKQotCi0KLSMgbHRfYXBwZW5kKE1BQ1JPLU5BTUUsIFNUUklORywgW1NFUEFSQVRPUl0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBSZWRlZmluZSBNQUNSTy1OQU1FIHRvIGhvbGQgaXRzIGZvcm1lciBjb250ZW50IHBsdXMgYFNFUEFSQVRPUidgU1RSSU5HJy4KLSMgTm90ZSB0aGF0IG5laXRoZXIgU0VQQVJBVE9SIG5vciBTVFJJTkcgYXJlIGV4cGFuZGVkOyB0aGV5IGFyZSBhcHBlbmRlZAotIyB0byBNQUNSTy1OQU1FIGFzIGlzIChsZWF2aW5nIHRoZSBleHBhbnNpb24gZm9yIHdoZW4gTUFDUk8tTkFNRSBpcyBpbnZva2VkKS4KLSMgTm8gU0VQQVJBVE9SIGlzIG91dHB1dCBpZiBNQUNSTy1OQU1FIHdhcyBwcmV2aW91c2x5IHVuZGVmaW5lZCAoZGlmZmVyZW50Ci0jIHRoYW4gZGVmaW5lZCBhbmQgZW1wdHkpLgotIwotIyBUaGlzIG1hY3JvIGlzIG5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBBdXRvY29uZiAyLjYyLCBzaW5jZSBlYXJsaWVyCi0jIHZlcnNpb25zIG9mIG00c3VnYXIgbWlzdGFrZW5seSBleHBhbmRlZCBTRVBBUkFUT1IgYnV0IG5vdCBTVFJJTkcuCi1tNF9kZWZpbmUoW2x0X2FwcGVuZF0sCi1bbTRfZGVmaW5lKFskMV0sCi0JICAgbTRfaWZkZWYoWyQxXSwgW200X2RlZm4oWyQxXSlbJDNdXSlbJDJdKV0pCi0KLQotCi0jIGx0X2NvbWJpbmUoU0VQLCBQUkVGSVgtTElTVCwgSU5GSVgsIFNVRkZJWDEsIFtTVUZGSVgyLi4uXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcm9kdWNlIGEgU0VQIGRlbGltaXRlZCBsaXN0IG9mIGFsbCBwYWlyZWQgY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIG9mCi0jIFBSRUZJWC1MSVNUIHdpdGggU1VGRklYMSB0aHJvdWdoIFNVRkZJWG4uICBFYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QKLSMgaGFzIHRoZSBmb3JtIFBSRUZJWG1JTkZJWFNVRkZJWG4uCi1tNF9kZWZpbmUoW2x0X2NvbWJpbmVdLAotW200X2lmKFskMl0sIFtdLCBbXSwKLSAgW200X2lmKFskNF0sIFtdLCBbXSwKLSAgICBbbHRfam9pbihtNF9xdW90ZShtNF9kZWZhdWx0KFskMV0sIFtbLCBdXSkpLAotICAgICAgbHRfdW5xdW90ZShtNF9zcGxpdChtNF9ub3JtYWxpemUobTRfZm9yZWFjaChfTHRfcHJlZml4LCBbJDJdLAotCQkgICBbbTRfZm9yZWFjaChfTHRfc3VmZml4LCBsdF9jYXIoW200X3NoaWZ0bigzLCAkQCldKSwKLQkJCSAgICAgICBbX0x0X3ByZWZpeFtdJDNbXV9MdF9zdWZmaXggXSldKSkpKSldKV0pZG5sCi1dKQotCi0KLSMgbHRfaWZfYXBwZW5kX3VuaXEoTUFDUk8tTkFNRSwgVkFSTkFNRSwgW1NFUEFSQVRPUl0sIFtVTklRXSwgW05PVC1VTklRXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSWZmIE1BQ1JPLU5BTUUgZG9lcyBub3QgeWV0IGNvbnRhaW4gVkFSTkFNRSwgdGhlbiBhcHBlbmQgaXQgKGRlbGltaXRlZAotIyBieSBTRVBBUkFUT1IgaWYgc3VwcGxpZWQpIGFuZCBleHBhbmQgVU5JUSwgZWxzZSBOT1QtVU5JUS4KLW00X2RlZmluZShbbHRfaWZfYXBwZW5kX3VuaXFdLAotW200X2lmZGVmKFskMV0sCi0JICBbbTRfaWYobTRfaW5kZXgoWyQzXW00X2RlZm4oWyQxXSlbJDNdLCBbJDMkMiQzXSksIFstMV0sCi0JCSBbbHRfYXBwZW5kKFskMV0sIFskMl0sIFskM10pJDRdLAotCQkgWyQ1XSldLAotCSAgW2x0X2FwcGVuZChbJDFdLCBbJDJdLCBbJDNdKSQ0XSldKQotCi0KLSMgbHRfZGljdF9hZGQoRElDVCwgS0VZLCBWQUxVRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbbHRfZGljdF9hZGRdLAotW200X2RlZmluZShbJDEoJDIpXSwgWyQzXSldKQotCi0KLSMgbHRfZGljdF9hZGRfc3Via2V5KERJQ1QsIEtFWSwgU1VCS0VZLCBWQUxVRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW00X2RlZmluZShbbHRfZGljdF9hZGRfc3Via2V5XSwKLVttNF9kZWZpbmUoWyQxKCQyOiQzKV0sIFskNF0pXSkKLQotCi0jIGx0X2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtsdF9kaWN0X2ZldGNoXSwKLVttNF9pZnZhbChbJDNdLAotCW00X2lmZGVmKFskMSgkMjokMyldLCBbbTRfZGVmbihbJDEoJDI6JDMpXSldKSwKLSAgICBtNF9pZmRlZihbJDEoJDIpXSwgW200X2RlZm4oWyQxKCQyKV0pXSkpXSkKLQotCi0jIGx0X2lmX2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSwgVkFMVUUsIElGLVRSVUUsIFtJRi1GQUxTRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1tNF9kZWZpbmUoW2x0X2lmX2RpY3RfZmV0Y2hdLAotW200X2lmKGx0X2RpY3RfZmV0Y2goWyQxXSwgWyQyXSwgWyQzXSksIFskNF0sCi0JWyQ1XSwKLSAgICBbJDZdKV0pCi0KLQotIyBsdF9kaWN0X2ZpbHRlcihESUNULCBbU1VCS0VZXSwgVkFMVUUsIFtTRVBBUkFUT1JdLCBLRVksIFsuLi5dKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbTRfZGVmaW5lKFtsdF9kaWN0X2ZpbHRlcl0sCi1bbTRfaWYoWyQ1XSwgW10sIFtdLAotICBbbHRfam9pbihtNF9xdW90ZShtNF9kZWZhdWx0KFskNF0sIFtbLCBdXSkpLAotICAgICAgICAgICBsdF91bnF1b3RlKG00X3NwbGl0KG00X25vcm1hbGl6ZShtNF9mb3JlYWNoKF9MdF9rZXksIGx0X2NhcihbbTRfc2hpZnRuKDQsICRAKV0pLAotCQkgICAgICBbbHRfaWZfZGljdF9mZXRjaChbJDFdLCBfTHRfa2V5LCBbJDJdLCBbJDNdLCBbX0x0X2tleSBdKV0pKSkpKV0pW11kbmwKLV0pCi0KLSMgbHR2ZXJzaW9uLm00IC0tIHZlcnNpb24gbnVtYmVycwkJCS0qLSBBdXRvY29uZiAtKi0KLSMKLSMgICBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jICAgV3JpdHRlbiBieSBTY290dCBKYW1lcyBSZW1uYW50LCAyMDA0Ci0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCi0jIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBHZW5lcmF0ZWQgZnJvbSBsdHZlcnNpb24uaW4uCi0KLSMgc2VyaWFsIDI5NzEgbHR2ZXJzaW9uLm00Ci0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sCi0KLW00X2RlZmluZShbTFRfUEFDS0FHRV9WRVJTSU9OXSwgWzIuMi4zYV0pCi1tNF9kZWZpbmUoW0xUX1BBQ0tBR0VfUkVWSVNJT05dLCBbMS4yOTcxXSkKLQotQUNfREVGVU4oW0xUVkVSU0lPTl9WRVJTSU9OXSwKLVttYWNyb192ZXJzaW9uPScyLjIuM2EnCi1tYWNyb19yZXZpc2lvbj0nMS4yOTcxJwotX0xUX0RFQ0woLCBtYWNyb192ZXJzaW9uLCAwLCBbV2hpY2ggcmVsZWFzZSBvZiBsaWJ0b29sLm00IHdhcyB1c2VkP10pCi1fTFRfREVDTCgsIG1hY3JvX3JldmlzaW9uLCAwKQotXSkKLQotIyBsdH5vYnNvbGV0ZS5tNCAtLSBhY2xvY2FsIHNhdGlzZnlpbmcgb2Jzb2xldGUgZGVmaW5pdGlvbnMuICAgIC0qLUF1dG9jb25mLSotCi0jCi0jICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyAgIFdyaXR0ZW4gYnkgU2NvdHQgSmFtZXMgUmVtbmFudCwgMjAwNC4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKLSMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAzIGx0fm9ic29sZXRlLm00Ci0KLSMgVGhlc2UgZXhpc3QgZW50aXJlbHkgdG8gZm9vbCBhY2xvY2FsIHdoZW4gYm9vdHN0cmFwcGluZyBsaWJ0b29sLgotIwotIyBJbiB0aGUgcGFzdCBsaWJ0b29sLm00IGhhcyBwcm92aWRlZCBtYWNyb3MgdmlhIEFDX0RFRlVOIChvciBBVV9ERUZVTikKLSMgd2hpY2ggaGF2ZSBsYXRlciBiZWVuIGNoYW5nZWQgdG8gbTRfZGVmaW5lIGFzIHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlCi0jIGV4cG9ydGVkIEFQSSwgb3IgbW92ZWQgdG8gQXV0b2NvbmYgb3IgQXV0b21ha2Ugd2hlcmUgdGhleSBiZWxvbmcuCi0jCi0jIFRoZSB0cm91YmxlIGlzLCBhY2xvY2FsIGlzIGEgYml0IHRoaWNrLiAgSXQnbGwgc2VlIHRoZSBvbGQgQUNfREVGVU4KLSMgaW4gL3Vzci9zaGFyZS9hY2xvY2FsL2xpYnRvb2wubTQgYW5kIHJlbWVtYmVyIGl0LCB0aGVuIHdoZW4gaXQgc2VlcyB1cwotIyB1c2luZyBhIG1hY3JvIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBvdXIgbG9jYWwgbTQvbGlidG9vbC5tNCBpdCdsbAotIyBwdWxsIHRoZSBvbGQgbGlidG9vbC5tNCBpbiAoaXQgZG9lc24ndCBzZWUgb3VyIHNoaW55IG5ldyBtNF9kZWZpbmUKLSMgYW5kIGRvZXNuJ3Qga25vdyBhYm91dCBBdXRvY29uZiBtYWNyb3MgYXQgYWxsLikKLSMKLSMgU28gd2UgcHJvdmlkZSB0aGlzIGZpbGUsIHdoaWNoIGhhcyBhIHNpbGx5IGZpbGVuYW1lIHNvIGl0J3MgYWx3YXlzCi0jIGluY2x1ZGVkIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4gIFRoaXMgcHJvdmlkZXMgYWNsb2NhbCB3aXRoIHRoZQotIyBBQ19ERUZVTnMgaXQgd2FudHMsIGJ1dCB3aGVuIG00IHByb2Nlc3NlcyBpdCwgaXQgZG9lc24ndCBkbyBhbnl0aGluZwotIyBiZWNhdXNlIHRob3NlIG1hY3JvcyBhbHJlYWR5IGV4aXN0LCBvciB3aWxsIGJlIG92ZXJ3cml0dGVuIGxhdGVyLgotIyBXZSB1c2UgQUNfREVGVU4gb3ZlciBBVV9ERUZVTiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGFjbG9jYWwtMS42LiAKLSMKLSMgQW55dGltZSB3ZSB3aXRoZHJhdyBhbiBBQ19ERUZVTiBvciBBVV9ERUZVTiwgcmVtZW1iZXIgdG8gYWRkIGl0IGhlcmUuCi0jIFllcywgdGhhdCBtZWFucyBldmVyeSBuYW1lIG9uY2UgdGFrZW4gd2lsbCBuZWVkIHRvIHJlbWFpbiBoZXJlIHVudGlsCi0jIHdlIGdpdmUgdXAgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjcsIGF0IHdoaWNoIHBvaW50Ci0jIHdlIG5lZWQgdG8ga2VlcCBvbmx5IHRob3NlIG5hbWVzIHdoaWNoIHdlIHN0aWxsIHJlZmVyIHRvLgotCi0jIFRoaXMgaXMgdG8gaGVscCBhY2xvY2FsIGZpbmQgdGhlc2UgbWFjcm9zLCBhcyBpdCBjYW4ndCBzZWUgbTRfZGVmaW5lLgotQUNfREVGVU4oW0xUT0JTT0xFVEVfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKLQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0pXSkKLW00X2lmbmRlZihbQUNfUFJPR19FR1JFUF0sCQlbQUNfREVGVU4oW0FDX1BST0dfRUdSRVBdKV0pCi1tNF9pZm5kZWYoW19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNIXSwJW0FDX0RFRlVOKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pXSkKLW00X2lmbmRlZihbX0xUX0FDX1NIRUxMX0lOSVRdLAkJW0FDX0RFRlVOKFtfTFRfQUNfU0hFTExfSU5JVF0pXSkKLW00X2lmbmRlZihbX0xUX0FDX1NZU19MSUJQQVRIX0FJWF0sCVtBQ19ERUZVTihbX0xUX0FDX1NZU19MSUJQQVRIX0FJWF0pXSkKLW00X2lmbmRlZihbX0xUX1BST0dfTFRNQUlOXSwJCVtBQ19ERUZVTihbX0xUX1BST0dfTFRNQUlOXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfVEFHVkFSXSwJCVtBQ19ERUZVTihbX0xUX0FDX1RBR1ZBUl0pXSkKLW00X2lmbmRlZihbQUNfTFRETF9FTkFCTEVfSU5TVEFMTF0sCVtBQ19ERUZVTihbQUNfTFRETF9FTkFCTEVfSU5TVEFMTF0pXSkKLW00X2lmbmRlZihbQUNfTFRETF9QUkVPUEVOXSwJCVtBQ19ERUZVTihbQUNfTFRETF9QUkVPUEVOXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSwJW0FDX0RFRlVOKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfTE9DS10sCQlbQUNfREVGVU4oW19MVF9BQ19MT0NLXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19PTERfQVJDSElWRV0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfT0xEX0FSQ0hJVkVdKV0pCi1tNF9pZm5kZWYoW19MVF9BQ19UUllfRExPUEVOX1NFTEZdLAlbQUNfREVGVU4oW19MVF9BQ19UUllfRExPUEVOX1NFTEZdKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLU10sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX09CSkRJUl0sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfT0JKRElSXSldKQotbTRfaWZuZGVmKFtBQ19MVERMX09CSkRJUl0sCQlbQUNfREVGVU4oW0FDX0xURExfT0JKRElSXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEhdKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUF0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTElCX1NUUklQXSldKQotbTRfaWZuZGVmKFtBQ19QQVRIX01BR0lDXSwJCVtBQ19ERUZVTihbQUNfUEFUSF9NQUdJQ10pXSkKLW00X2lmbmRlZihbQUNfUFJPR19MRF9HTlVdLAkJW0FDX0RFRlVOKFtBQ19QUk9HX0xEX0dOVV0pXSkKLW00X2lmbmRlZihbQUNfUFJPR19MRF9SRUxPQURfRkxBR10sCVtBQ19ERUZVTihbQUNfUFJPR19MRF9SRUxPQURfRkxBR10pXSkKLW00X2lmbmRlZihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdLAlbQUNfREVGVU4oW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEldKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSldKQotbTRfaWZuZGVmKFtMVF9BQ19QUk9HX0VHUkVQXSwJCVtBQ19ERUZVTihbTFRfQUNfUFJPR19FR1JFUF0pXSkKLW00X2lmbmRlZihbTFRfQUNfUFJPR19TRURdLAkJW0FDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0pXSkKLW00X2lmbmRlZihbX0xUX0NDX0JBU0VOQU1FXSwJCVtBQ19ERUZVTihbX0xUX0NDX0JBU0VOQU1FXSldKQotbTRfaWZuZGVmKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdLAlbQUNfREVGVU4oW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0pXSkKLW00X2lmbmRlZihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0sCVtBQ19ERUZVTihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0pXSkKLW00X2lmbmRlZihbX0FDX1BST0dfTElCVE9PTF0sCQlbQUNfREVGVU4oW19BQ19QUk9HX0xJQlRPT0xdKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfU0VUVVBdLAkJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NFVFVQXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfQ0hFQ0tfRExGQ05dLAkJW0FDX0RFRlVOKFtfTFRfQUNfQ0hFQ0tfRExGQ05dKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUl0pXSkKLW00X2lmbmRlZihbX0xUX0FDX1RBR0NPTkZJR10sCQlbQUNfREVGVU4oW19MVF9BQ19UQUdDT05GSUddKV0pCi1tNF9pZm5kZWYoW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwJW0FDX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0pXSkKLW00X2lmbmRlZihbX0xUX0FDX0xBTkdfQ1hYXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19GNzddLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzddKV0pCi1tNF9pZm5kZWYoW19MVF9BQ19MQU5HX0dDSl0sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl0pXSkKLW00X2lmbmRlZihbQUNfTElCVE9PTF9SQ10sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUkNdKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ19DT05GSUddKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10pXSkKLW00X2lmbmRlZihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10pXSkKLW00X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUddKV0pCi1tNF9pZm5kZWYoW19MVF9BQ19MQU5HX0dDSl9DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl9DT05GSUddKV0pCi1tNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddKV0pCi1tNF9pZm5kZWYoW19MVF9BQ19MQU5HX1JDX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSldKQotbTRfaWZuZGVmKFtBQ19MSUJUT09MX0NPTkZJR10sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09ORklHXSldKQotbTRfaWZuZGVmKFtfTFRfQUNfRklMRV9MVERMTF9DXSwJW0FDX0RFRlVOKFtfTFRfQUNfRklMRV9MVERMTF9DXSldKQotCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiwgMjAwNyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCi0jIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgotIyAoVGhpcyBwcml2YXRlIG1hY3JvIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhpcyBmaWxlLikKLUFDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwKLVthbV9fYXBpX3ZlcnNpb249JzEuMTAnCi1kbmwgU29tZSB1c2VycyBmaW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIG1pc3Rha2UgaXQgZm9yIGEgd2F5IHRvCi1kbmwgcmVxdWlyZSBzb21lIG1pbmltdW0gdmVyc2lvbi4gIFBvaW50IHRoZW0gdG8gdGhlIHJpZ2h0IG1hY3JvLgotbTRfaWYoWyQxXSwgWzEuMTAuMV0sIFtdLAotICAgICAgW0FDX0ZBVEFMKFtEbyBub3QgY2FsbCAkMCwgdXNlIEFNX0lOSVRfQVVUT01BS0UoWyQxXSkuXSldKWRubAotXSkKLQotIyBfQU1fQVVUT0NPTkZfVkVSU0lPTihWRVJTSU9OKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBhY2xvY2FsIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGZpbmQgdGhlIEF1dG9jb25mIHZlcnNpb24uCi0jIFRoaXMgaXMgYSBwcml2YXRlIG1hY3JvIHRvby4gIFVzaW5nIG00X2RlZmluZSBzaW1wbGlmaWVzCi0jIHRoZSBsb2dpYyBpbiBhY2xvY2FsLCB3aGljaCBjYW4gc2ltcGx5IGlnbm9yZSB0aGlzIGRlZmluaXRpb24uCi1tNF9kZWZpbmUoW19BTV9BVVRPQ09ORl9WRVJTSU9OXSwgW10pCi0KLSMgQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENhbGwgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBzbyB0aGV5IGNhbiBiZSB0cmFjZWQuCi0jIFRoaXMgZnVuY3Rpb24gaXMgQUNfUkVRVUlSRWQgYnkgQUNfSU5JVF9BVVRPTUFLRS4KLUFDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwKLVtBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjEwLjFdKWRubAotbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKLSAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAotX0FNX0FVVE9DT05GX1ZFUlNJT04oQUNfQVVUT0NPTkZfVkVSU0lPTildKQotCi0jIEFNX0FVWF9ESVJfRVhQQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIEZvciBwcm9qZWN0cyB1c2luZyBBQ19DT05GSUdfQVVYX0RJUihbZm9vXSksIEF1dG9jb25mIHNldHMKLSMgJGFjX2F1eF9kaXIgdG8gYCRzcmNkaXIvZm9vJy4gIEluIG90aGVyIHByb2plY3RzLCBpdCBpcyBzZXQgdG8KLSMgYCRzcmNkaXInLCBgJHNyY2Rpci8uLicsIG9yIGAkc3JjZGlyLy4uLy4uJy4KLSMKLSMgT2YgY291cnNlLCBBdXRvbWFrZSBtdXN0IGhvbm9yIHRoaXMgdmFyaWFibGUgd2hlbmV2ZXIgaXQgY2FsbHMgYQotIyB0b29sIGZyb20gdGhlIGF1eGlsaWFyeSBkaXJlY3RvcnkuICBUaGUgcHJvYmxlbSBpcyB0aGF0ICRzcmNkaXIgKGFuZAotIyB0aGVyZWZvcmUgJGFjX2F1eF9kaXIgYXMgd2VsbCkgY2FuIGJlIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZSwKLSMgZGVwZW5kaW5nIG9uIGhvdyBjb25maWd1cmUgaXMgcnVuLiAgVGhpcyBpcyBwcmV0dHkgYW5ub3lpbmcsIHNpbmNlCi0jIGl0IG1ha2VzICRhY19hdXhfZGlyIHF1aXRlIHVudXNhYmxlIGluIHN1YmRpcmVjdG9yaWVzOiBpbiB0aGUgdG9wCi0jIHNvdXJjZSBkaXJlY3RvcnksIGFueSBmb3JtIHdpbGwgd29yayBmaW5lLCBidXQgaW4gc3ViZGlyZWN0b3JpZXMgYQotIyByZWxhdGl2ZSBwYXRoIG5lZWRzIHRvIGJlIGFkanVzdGVkIGZpcnN0LgotIwotIyAkYWNfYXV4X2Rpci9taXNzaW5nCi0jICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaWYgJGFjX2F1eF9kaXIgaXMgcmVsYXRpdmUKLSMgJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZwotIyAgICBmYWlscyBpZiAkYWNfYXV4X2RpciBpcyBhYnNvbHV0ZSwKLSMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpbiBhIFZQQVRIIGJ1aWxkIHdpdGgKLSMgICAgICAgICAgYSByZWxhdGl2ZSAkYWNfYXV4X2RpcgotIwotIyBUaGUgcmVhc29uIG9mIHRoZSBsYXR0ZXIgZmFpbHVyZSBpcyB0aGF0ICR0b3Bfc3JjZGlyIGFuZCAkYWNfYXV4X2RpcgotIyBhcmUgYm90aCBwcmVmaXhlZCBieSAkc3JjZGlyLiAgSW4gYW4gaW4tc291cmNlIGJ1aWxkIHRoaXMgaXMgdXN1YWxseQotIyBoYXJtbGVzcyBiZWNhdXNlICRzcmNkaXIgaXMgYC4nLCBidXQgdGhpbmdzIHdpbGwgYnJva2Ugd2hlbiB5b3UKLSMgc3RhcnQgYSBWUEFUSCBidWlsZCBvciB1c2UgYW4gYWJzb2x1dGUgJHNyY2Rpci4KLSMKLSMgU28gd2UgY291bGQgdXNlIHNvbWV0aGluZyBzaW1pbGFyIHRvICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcsCi0jIGlmZiB3ZSBzdHJpcCB0aGUgbGVhZGluZyAkc3JjZGlyIGZyb20gJGFjX2F1eF9kaXIuICBUaGF0IHdvdWxkIGJlOgotIyAgIGFtX2F1eF9kaXI9J1wkKHRvcF9zcmNkaXIpLydgZXhwciAiJGFjX2F1eF9kaXIiIDogIiRzcmNkaXIvLypcKC4qXCkiYAotIyBhbmQgdGhlbiB3ZSB3b3VsZCBkZWZpbmUgJE1JU1NJTkcgYXMKLSMgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKLSMgVGhpcyB3aWxsIHdvcmsgYXMgbG9uZyBhcyBNSVNTSU5HIGlzIG5vdCBjYWxsZWQgZnJvbSBjb25maWd1cmUsIGJlY2F1c2UKLSMgdW5mb3J0dW5hdGVseSAkKHRvcF9zcmNkaXIpIGhhcyBubyBtZWFuaW5nIGluIGNvbmZpZ3VyZS4KLSMgSG93ZXZlciB0aGVyZSBhcmUgb3RoZXIgdmFyaWFibGVzLCBsaWtlIENDLCB3aGljaCBhcmUgb2Z0ZW4gdXNlZCBpbgotIyBjb25maWd1cmUsIGFuZCBjb3VsZCB0aGVyZWZvcmUgbm90IHVzZSB0aGlzICJmaXhlZCIgJGFjX2F1eF9kaXIuCi0jCi0jIEFub3RoZXIgc29sdXRpb24sIHVzZWQgaGVyZSwgaXMgdG8gYWx3YXlzIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbgotIyBhYnNvbHV0ZSBQQVRILiAgVGhlIGRyYXdiYWNrIGlzIHRoYXQgdXNpbmcgYWJzb2x1dGUgcGF0aHMgcHJldmVudCBhCi0jIGNvbmZpZ3VyZWQgdHJlZSB0byBiZSBtb3ZlZCB3aXRob3V0IHJlY29uZmlndXJhdGlvbi4KLQotQUNfREVGVU4oW0FNX0FVWF9ESVJfRVhQQU5EXSwKLVtkbmwgUmVseSBvbiBhdXRvY29uZiB0byBzZXQgdXAgQ0RQQVRIIHByb3Blcmx5LgotQUNfUFJFUkVRKFsyLjUwXSlkbmwKLSMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKLWFtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLV0pCi0KLSMgQU1fQ09ORElUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgOAotCi0jIEFNX0NPTkRJVElPTkFMKE5BTUUsIFNIRUxMLUNPTkRJVElPTikKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLUFDX0RFRlVOKFtBTV9DT05ESVRJT05BTF0sCi1bQUNfUFJFUkVRKDIuNTIpZG5sCi0gaWZlbHNlKFskMV0sIFtUUlVFXSwgIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSwKLQlbJDFdLCBbRkFMU0VdLCBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0pZG5sCi1BQ19TVUJTVChbJDFfVFJVRV0pZG5sCi1BQ19TVUJTVChbJDFfRkFMU0VdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoWyQxX1RSVUVdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoWyQxX0ZBTFNFXSlkbmwKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpCi1BQ19DT05GSUdfQ09NTUFORFNfUFJFKAotW2lmIHRlc3QgLXogIiR7JDFfVFJVRX0iICYmIHRlc3QgLXogIiR7JDFfRkFMU0V9IjsgdGhlbgotICBBQ19NU0dfRVJST1IoW1tjb25kaXRpb25hbCAiJDEiIHdhcyBuZXZlciBkZWZpbmVkLgotVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuXV0pCi1maV0pXSkKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgOQotCi0jIFRoZXJlIGFyZSBhIGZldyBkaXJ0eSBoYWNrcyBiZWxvdyB0byBhdm9pZCBsZXR0aW5nIGBBQ19QUk9HX0NDJyBiZQotIyB3cml0dGVuIGluIGNsZWFyLCBpbiB3aGljaCBjYXNlIGF1dG9tYWtlLCB3aGVuIHJlYWRpbmcgYWNsb2NhbC5tNCwKLSMgd2lsbCB0aGluayBpdCBzZWVzIGEgKnVzZSosIGFuZCB0aGVyZWZvcmUgd2lsbCB0cmlnZ2VyIGFsbCBpdCdzCi0jIEMgc3VwcG9ydCBtYWNoaW5lcnkuICBBbHNvIG5vdGUgdGhhdCBpdCBtZWFucyB0aGF0IGF1dG9zY2FuLCBzZWVpbmcKLSMgQ0MgZXRjLiBpbiB0aGUgTWFrZWZpbGUsIHdpbGwgYXNrIGZvciBhbiBBQ19QUk9HX0NDIHVzZS4uLgotCi0KLSMgX0FNX0RFUEVOREVOQ0lFUyhOQU1FKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFNlZSBob3cgdGhlIGNvbXBpbGVyIGltcGxlbWVudHMgZGVwZW5kZW5jeSBjaGVja2luZy4KLSMgTkFNRSBpcyAiQ0MiLCAiQ1hYIiwgIkdDSiIsIG9yICJPQkpDIi4KLSMgV2UgdHJ5IGEgZmV3IHRlY2huaXF1ZXMgYW5kIHVzZSB0aGF0IHRvIHNldCBhIHNpbmdsZSBjYWNoZSB2YXJpYWJsZS4KLSMKLSMgV2UgZG9uJ3QgQUNfUkVRVUlSRSB0aGUgY29ycmVzcG9uZGluZyBBQ19QUk9HX0NDIHNpbmNlIHRoZSBsYXR0ZXIgd2FzCi0jIG1vZGlmaWVkIHRvIGludm9rZSBfQU1fREVQRU5ERU5DSUVTKENDKTsgd2Ugd291bGQgaGF2ZSBhIGNpcmN1bGFyCi0jIGRlcGVuZGVuY3ksIGFuZCBnaXZlbiB0aGF0IHRoZSB1c2VyIGlzIG5vdCBleHBlY3RlZCB0byBydW4gdGhpcyBtYWNybywKLSMganVzdCByZWx5IG9uIEFDX1BST0dfQ0MuCi1BQ19ERUZVTihbX0FNX0RFUEVOREVOQ0lFU10sCi1bQUNfUkVRVUlSRShbQU1fU0VUX0RFUERJUl0pZG5sCi1BQ19SRVFVSVJFKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10pZG5sCi1BQ19SRVFVSVJFKFtBTV9NQUtFX0lOQ0xVREVdKWRubAotQUNfUkVRVUlSRShbQU1fREVQX1RSQUNLXSlkbmwKLQotaWZlbHNlKFskMV0sIENDLCAgIFtkZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKLSAgICAgICBbJDFdLCBDWFgsICBbZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgT0JKQywgW2RlcGNjPSIkT0JKQyIgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKLSAgICAgICBbJDFdLCBVUEMsICBbZGVwY2M9IiRVUEMiICBhbV9jb21waWxlcl9saXN0PV0sCi0gICAgICAgWyQxXSwgR0NKLCAgW2RlcGNjPSIkR0NKIiAgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKLSAgICAgICAgICAgICAgICAgICBbZGVwY2M9IiQkMSIgICBhbV9jb21waWxlcl9saXN0PV0pCi0KLUFDX0NBQ0hFX0NIRUNLKFtkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjY10sCi0gICAgICAgICAgICAgICBbYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdLAotW2lmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KLSAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAotICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgotICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAotICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0Ci0gICMgaW4gRCcuCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQotICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgotICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgotICBjZCBjb25mdGVzdC5kaXIKLSAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCi0gICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCi0gICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCi0gICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgotICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKLSAgIyBkaXJlY3RvcnkuCi0gIG1rZGlyIHN1YgotCi0gIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKLSAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KLSAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uIFsncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCddIDwgLi9kZXBjb21wYAotICBmaQotICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KLSAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKLSAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCi0gICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgotICAgICMKLSAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQotICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCi0gICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCi0gICAgOiA+IHN1Yi9jb25mdGVzdC5jCi0gICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCi0gICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCi0gICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAotICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KLSAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAotICAgIGRvbmUKLSAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCi0KLSAgICBjYXNlICRkZXBtb2RlIGluCi0gICAgbm9zaWRlZWZmZWN0KQotICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCi0gICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KLQljb250aW51ZQotICAgICAgZWxzZQotCWJyZWFrCi0gICAgICBmaQotICAgICAgOzsKLSAgICBub25lKSBicmVhayA7OwotICAgIGVzYWMKLSAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKLSAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQotICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgotICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAotICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKLSAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAotICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCi0gICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCi0gICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgotICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncwotICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKLSAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgotICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKLSAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKLSAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6Ci0gICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAotICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8Ci0gICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICAgICAgICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0KLSAgY2QgLi4KLSAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgotZWxzZQotICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCi1maQotXSkKLUFDX1NVQlNUKFskMURFUE1PREVdLCBbZGVwbW9kZT0kYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdKQotQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwJDFdLCBbCi0gIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCi0gICYmIHRlc3QgIiRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKLV0pCi0KLQotIyBBTV9TRVRfREVQRElSCi0jIC0tLS0tLS0tLS0tLS0KLSMgQ2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUgZm9yIGRlcGVuZGVuY3kgZmlsZXMuCi0jIFRoaXMgbWFjcm8gaXMgQUNfUkVRVUlSRWQgaW4gX0FNX0RFUEVOREVOQ0lFUwotQUNfREVGVU4oW0FNX1NFVF9ERVBESVJdLAotW0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCi1BQ19TVUJTVChbREVQRElSXSwgWyIke2FtX19sZWFkaW5nX2RvdH1kZXBzIl0pZG5sCi1dKQotCi0KLSMgQU1fREVQX1RSQUNLCi0jIC0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FNX0RFUF9UUkFDS10sCi1bQUNfQVJHX0VOQUJMRShkZXBlbmRlbmN5LXRyYWNraW5nLAotWyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAotICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9yc10pCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KLSAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKLSAgQU1ERVBCQUNLU0xBU0g9J1wnCi1maQotQU1fQ09ORElUSU9OQUwoW0FNREVQXSwgW3Rlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhub10pCi1BQ19TVUJTVChbQU1ERVBCQUNLU0xBU0hdKWRubAotX0FNX1NVQlNUX05PVE1BS0UoW0FNREVQQkFDS1NMQVNIXSlkbmwKLV0pCi0KLSMgR2VuZXJhdGUgY29kZSB0byBzZXQgdXAgZGVwZW5kZW5jeSB0cmFja2luZy4gICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotI3NlcmlhbCAzCi0KLSMgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW19BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi1bZm9yIG1mIGluICRDT05GSUdfRklMRVM7IGRvCi0gICMgU3RyaXAgTUYgc28gd2UgZW5kIHVwIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCi0gICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCi0gICMgV2UgdXNlZCB0byBtYXRjaCBvbmx5IHRoZSBmaWxlcyBuYW1lZCBgTWFrZWZpbGUuaW4nLCBidXQKLSAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCi0gICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCi0gICMgZWFjaCBNYWtlZmlsZS5pbiBhbmQgYWRkIGEgbmV3IGxpbmUgb24gdG9wIG9mIGVhY2ggZmlsZSB0byBzYXkgc28uCi0gICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCi0gICMgbGltaXQgb2YgMjA0OCwgYnV0IGFsbCBzZWQncyB3ZSBrbm93IGhhdmUgdW5kZXJzdGFuZCBhdCBsZWFzdCA0MDAwLgotICBpZiBzZWQgLW4gJ3MsXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZS4qLFgscCcgIiRtZiIgfCBncmVwIFggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgZGlycGFydD1gQVNfRElSTkFNRSgiJG1mIilgCi0gIGVsc2UKLSAgICBjb250aW51ZQotICBmaQotICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQotICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCi0gIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCi0gIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCi0gIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAotICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKLSAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKLSAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKLSAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAotICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCi0gICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQotICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQotICAjIGV4cGFuc2lvbi4KLSAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCi0gICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCi0gICAgICAgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCi0gICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCi0gICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCi0gICAgZmRpcj1gQVNfRElSTkFNRShbIiRmaWxlIl0pYAotICAgIEFTX01LRElSX1AoWyRkaXJwYXJ0LyRmZGlyXSkKLSAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgotICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgotICBkb25lCi1kb25lCi1dKSMgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCi0KLQotIyBBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUaGlzIG1hY3JvIHNob3VsZCBvbmx5IGJlIGludm9rZWQgb25jZSAtLSB1c2UgdmlhIEFDX1JFUVVJUkUuCi0jCi0jIFRoaXMgY29kZSBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gYXV0b21hdGljIGRlcGVuZGVuY3kgdHJhY2tpbmcKLSMgaXMgZW5hYmxlZC4gIEZJWE1FLiAgVGhpcyBjcmVhdGVzIGVhY2ggYC5QJyBmaWxlIHRoYXQgd2Ugd2lsbAotIyBuZWVkIGluIG9yZGVyIHRvIGJvb3RzdHJhcCB0aGUgZGVwZW5kZW5jeSBoYW5kbGluZyBjb2RlLgotQUNfREVGVU4oW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKLVtBQ19DT05GSUdfQ09NTUFORFMoW2RlcGZpbGVzXSwKLSAgICAgW3Rlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCi0gICAgIFtBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiXSkKLV0pCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA1Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDgKLQotIyBBTV9DT05GSUdfSEVBREVSIGlzIG9ic29sZXRlLiAgSXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgQUNfQ09ORklHX0hFQURFUlMuCi1BVV9ERUZVTihbQU1fQ09ORklHX0hFQURFUl0sIFtBQ19DT05GSUdfSEVBREVSUygkQCldKQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAotIyAyMDA1LCAyMDA2LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDEzCi0KLSMgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoLiAgU29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmCi0jIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLiAgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLCBWRVJTSU9OLCBbTk8tREVGSU5FXSkKLSMgQU1fSU5JVF9BVVRPTUFLRShbT1BUSU9OU10pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRoZSBjYWxsIHdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTiBhcmd1bWVudHMgaXMgdGhlIG9sZCBzdHlsZQotIyBjYWxsIChwcmUgYXV0b2NvbmYtMi41MCksIHdoaWNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuICBQQUNLQUdFCi0jIGFuZCBWRVJTSU9OIHNob3VsZCBub3cgYmUgcGFzc2VkIHRvIEFDX0lOSVQgYW5kIHJlbW92ZWQgZnJvbQotIyB0aGUgY2FsbCB0byBBTV9JTklUX0FVVE9NQUtFLgotIyBXZSBzdXBwb3J0IGJvdGggY2FsbCBzdHlsZXMgZm9yIHRoZSB0cmFuc2l0aW9uLiAgQWZ0ZXIKLSMgdGhlIG5leHQgQXV0b21ha2UgcmVsZWFzZSwgQXV0b2NvbmYgY2FuIG1ha2UgdGhlIEFDX0lOSVQKLSMgYXJndW1lbnRzIG1hbmRhdG9yeSwgYW5kIHRoZW4gd2UgY2FuIGRlcGVuZCBvbiBhIG5ldyBBdXRvY29uZgotIyByZWxlYXNlIGFuZCBkcm9wIHRoZSBvbGQgY2FsbCBzdXBwb3J0LgotQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLAotW0FDX1BSRVJFUShbMi42MF0pZG5sCi1kbmwgQXV0b2NvbmYgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdwotZG5sIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuCi1tNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKLUFDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCI7IHRoZW4KLSAgIyBVc2UgLUkkKHNyY2Rpcikgb25seSB3aGVuICQoc3JjZGlyKSAhPSAuLCBzbyB0aGF0IG1ha2UncyBvdXRwdXQKLSAgIyBpcyBub3QgcG9sbHV0ZWQgd2l0aCByZXBlYXRlZCAiLUkuIgotICBBQ19TVUJTVChbYW1fX2lzcmNdLCBbJyAtSSQoc3JjZGlyKSddKV9BTV9TVUJTVF9OT1RNQUtFKFthbV9faXNyY10pZG5sCi0gICMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotICBpZiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICAgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLSAgZmkKLWZpCi0KLSMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAotaWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KLSAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JwotICBlbHNlCi0gICAgQ1lHUEFUSF9XPWVjaG8KLSAgZmkKLWZpCi1BQ19TVUJTVChbQ1lHUEFUSF9XXSkKLQotIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgotZG5sIERpc3Rpbmd1aXNoIGJldHdlZW4gb2xkLXN0eWxlIGFuZCBuZXctc3R5bGUgY2FsbHMuCi1tNF9pZnZhbChbJDJdLAotW200X2lmdmFsKFskM10sIFtfQU1fU0VUX09QVElPTihbbm8tZGVmaW5lXSldKWRubAotIEFDX1NVQlNUKFtQQUNLQUdFXSwgWyQxXSlkbmwKLSBBQ19TVUJTVChbVkVSU0lPTl0sIFskMl0pXSwKLVtfQU1fU0VUX09QVElPTlMoWyQxXSlkbmwKLWRubCBEaWFnbm9zZSBvbGQtc3R5bGUgQUNfSU5JVCB3aXRoIG5ldy1zdHlsZSBBTV9BVVRPTUFLRV9JTklULgotbTRfaWYobTRfaWZkZWYoW0FDX1BBQ0tBR0VfTkFNRV0sIDEpbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIDEpLCAxMSwsCi0gIFttNF9mYXRhbChbQUNfSU5JVCBzaG91bGQgYmUgY2FsbGVkIHdpdGggcGFja2FnZSBhbmQgdmVyc2lvbiBhcmd1bWVudHNdKV0pZG5sCi0gQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKWRubAotIEFDX1NVQlNUKFtWRVJTSU9OXSwgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKWRubAotCi1fQU1fSUZfT1BUSU9OKFtuby1kZWZpbmVdLCwKLVtBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi0gQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKWRubAotCi0jIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKWRubAotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKWRubAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259KQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvKQotQU1fUFJPR19JTlNUQUxMX1NICi1BTV9QUk9HX0lOU1RBTExfU1RSSVAKLUFDX1JFUVVJUkUoW0FNX1BST0dfTUtESVJfUF0pZG5sCi0jIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgotIyBzb21lIHBsYXRmb3Jtcy4KLUFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKLV9BTV9JRl9PUFRJT04oW3Rhci11c3Rhcl0sIFtfQU1fUFJPR19UQVIoW3VzdGFyXSldLAotICAgICAgICAgICAgICBbX0FNX0lGX09QVElPTihbdGFyLXBheF0sIFtfQU1fUFJPR19UQVIoW3BheF0pXSwKLQkgICAgICAJCSAgICAgW19BTV9QUk9HX1RBUihbdjddKV0pXSkKLV9BTV9JRl9PUFRJT04oW25vLWRlcGVuZGVuY2llc10sLAotW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENDKV0sCi0gICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAotQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKLSAgICAgICAgICAgICAgICAgIFtfQU1fREVQRU5ERU5DSUVTKENYWCldLAotICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DWFhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX0NYWF0pW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0pXSlkbmwKLUFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNdLAotICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAotICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19PQkpDXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19PQkpDXSlbX0FNX0RFUEVOREVOQ0lFUyhPQkpDKV0pXSlkbmwKLV0pCi1dKQotCi0KLSMgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLSMgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi0jIHRoYXQgaXMgZ2VuZXJhdGVkLiAgVGhlIHN0YW1wIGZpbGVzIGFyZSBudW1iZXJlZCB0byBoYXZlIGRpZmZlcmVudCBuYW1lcy4KLQotIyBBdXRvY29uZiBjYWxscyBfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LICh3aGVuIGRlZmluZWQpIGluIHRoZQotIyBsb29wIHdoZXJlIGNvbmZpZy5zdGF0dXMgY3JlYXRlcyB0aGUgaGVhZGVycywgc28gd2UgY2FuIGdlbmVyYXRlCi0jIG91ciBzdGFtcCBmaWxlcyB0aGVyZS4KLUFDX0RFRlVOKFtfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LXSwKLVsjIENvbXB1dGUgJDEncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCi1fYW1fYXJnPSQxCi1fYW1fc3RhbXBfY291bnQ9MQotZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCi0gIGNhc2UgJF9hbV9oZWFkZXIgaW4KLSAgICAkX2FtX2FyZyB8ICRfYW1fYXJnOiogKQotICAgICAgYnJlYWsgOzsKLSAgICAqICkKLSAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKLSAgZXNhYwotZG9uZQotZWNobyAidGltZXN0YW1wIGZvciAkX2FtX2FyZyIgPmBBU19ESVJOQU1FKFsiJF9hbV9hcmciXSlgL3N0YW1wLWhbXSRfYW1fc3RhbXBfY291bnRdKQotCi0jIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9QUk9HX0lOU1RBTExfU0gKLSMgLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSAkaW5zdGFsbF9zaC4KLUFDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU0hdLAotW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKLWluc3RhbGxfc2g9JHtpbnN0YWxsX3NoLSJcJChTSEVMTCkgJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9Ci1BQ19TVUJTVChpbnN0YWxsX3NoKV0pCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAyCi0KLSMgQ2hlY2sgd2hldGhlciB0aGUgdW5kZXJseWluZyBmaWxlLXN5c3RlbSBzdXBwb3J0cyBmaWxlbmFtZXMKLSMgd2l0aCBhIGxlYWRpbmcgZG90LiAgRm9yIGluc3RhbmNlIE1TLURPUyBkb2Vzbid0LgotQUNfREVGVU4oW0FNX1NFVF9MRUFESU5HX0RPVF0sCi1bcm0gLXJmIC50c3QgMj4vZGV2L251bGwKLW1rZGlyIC50c3QgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLnRzdDsgdGhlbgotICBhbV9fbGVhZGluZ19kb3Q9LgotZWxzZQotICBhbV9fbGVhZGluZ19kb3Q9XwotZmkKLXJtZGlyIC50c3QgMj4vZGV2L251bGwKLUFDX1NVQlNUKFthbV9fbGVhZGluZ19kb3RdKV0pCi0KLSMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLiAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKLSMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBzZXJpYWwgNAotCi1BQ19ERUZVTihbQU1fTUFJTlRBSU5FUl9NT0RFXSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKLSAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAotWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlICBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLQkJCSAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKFskVVNFX01BSU5UQUlORVJfTU9ERV0pCi0gIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgW3Rlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXNdKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLUFVX0RFRlVOKFtqbV9NQUlOVEFJTkVSX01PREVdLCBbQU1fTUFJTlRBSU5FUl9NT0RFXSkKLQotIyBDaGVjayB0byBzZWUgaG93ICdtYWtlJyB0cmVhdHMgaW5jbHVkZXMuCSAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDMKLQotIyBBTV9NQUtFX0lOQ0xVREUoKQotIyAtLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgotQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCi1bYW1fbWFrZT0ke01BS0UtbWFrZX0KLWNhdCA+IGNvbmZpbmMgPDwgJ0VORCcKLWFtX19kb2l0OgotCUBlY2hvIGRvbmUKLS5QSE9OWTogYW1fX2RvaXQKLUVORAotIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgotQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlXSkKLWFtX19pbmNsdWRlPSIjIgotYW1fX3F1b3RlPQotX2FtX3Jlc3VsdD1ub25lCi0jIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgotZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgotIyBXZSBncmVwIG91dCBgRW50ZXJpbmcgZGlyZWN0b3J5JyBhbmQgYExlYXZpbmcgZGlyZWN0b3J5JwotIyBtZXNzYWdlcyB3aGljaCBjYW4gb2NjdXIgaWYgYHcnIGVuZHMgdXAgaW4gTUFLRUZMQUdTLgotIyBJbiBwYXJ0aWN1bGFyIHdlIGRvbid0IGxvb2sgYXQgYF5tYWtlOicgYmVjYXVzZSBHTlUgbWFrZSBtaWdodAotIyBiZSBpbnZva2VkIHVuZGVyIHNvbWUgb3RoZXIgbmFtZSAodXN1YWxseSAiZ21ha2UiKSwgaW4gd2hpY2gKLSMgY2FzZSBpdCBwcmludHMgaXRzIG5ldyBuYW1lIGluc3RlYWQgb2YgYG1ha2UnLgotaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGwgfCBncmVwIC12ICdpbmcgZGlyZWN0b3J5J2AiID0gImRvbmUiOyB0aGVuCi0gICBhbV9faW5jbHVkZT1pbmNsdWRlCi0gICBhbV9fcXVvdGU9Ci0gICBfYW1fcmVzdWx0PUdOVQotZmkKLSMgTm93IHRyeSBCU0QgbWFrZSBzdHlsZSBpbmNsdWRlLgotaWYgdGVzdCAiJGFtX19pbmNsdWRlIiA9ICIjIjsgdGhlbgotICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgotICAgaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIiA9ICJkb25lIjsgdGhlbgotICAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKLSAgICAgIGFtX19xdW90ZT0iXCIiCi0gICAgICBfYW1fcmVzdWx0PUJTRAotICAgZmkKLWZpCi1BQ19TVUJTVChbYW1fX2luY2x1ZGVdKQotQUNfU1VCU1QoW2FtX19xdW90ZV0pCi1BQ19NU0dfUkVTVUxUKFskX2FtX3Jlc3VsdF0pCi1ybSAtZiBjb25maW5jIGNvbmZtZgotXSkKLQotIyBGYWtlIHRoZSBleGlzdGVuY2Ugb2YgcHJvZ3JhbXMgdGhhdCBHTlUgbWFpbnRhaW5lcnMgdXNlLiAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA1Ci0KLSMgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FNX01JU1NJTkdfUFJPR10sCi1bQUNfUkVRVUlSRShbQU1fTUlTU0lOR19IQVNfUlVOXSkKLSQxPSR7JDEtIiR7YW1fbWlzc2luZ19ydW59JDIifQotQUNfU1VCU1QoJDEpXSkKLQotCi0jIEFNX01JU1NJTkdfSEFTX1JVTgotIyAtLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIE1JU1NJTkcgaWYgbm90IGRlZmluZWQgc28gZmFyIGFuZCB0ZXN0IGlmIGl0IHN1cHBvcnRzIC0tcnVuLgotIyBJZiBpdCBkb2VzLCBzZXQgYW1fbWlzc2luZ19ydW4gdG8gdXNlIGl0LCBvdGhlcndpc2UsIHRvIG5vdGhpbmcuCi1BQ19ERUZVTihbQU1fTUlTU0lOR19IQVNfUlVOXSwKLVtBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCi1BQ19SRVFVSVJFX0FVWF9GSUxFKFttaXNzaW5nXSlkbmwKLXRlc3QgeCIke01JU1NJTkcrc2V0fSIgPSB4c2V0IHx8IE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgotIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCi1pZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgotICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgotZWxzZQotICBhbV9taXNzaW5nX3J1bj0KLSAgQUNfTVNHX1dBUk4oW2BtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nXSkKLWZpCi1dKQotCi0jIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBBTV9QUk9HX01LRElSX1AKLSMgLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIGZvciBgbWtkaXIgLXAnLgotQUNfREVGVU4oW0FNX1BST0dfTUtESVJfUF0sCi1bQUNfUFJFUkVRKFsyLjYwXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUtESVJfUF0pZG5sCi1kbmwgQXV0b21ha2UgMS44IHRvIDEuOS42IHVzZWQgdG8gZGVmaW5lIG1rZGlyX3AuICBXZSBub3cgdXNlIE1LRElSX1AsCi1kbmwgd2hpbGUga2VlcGluZyBhIGRlZmluaXRpb24gb2YgbWtkaXJfcCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLWRubCBATUtESVJfUEAgaXMgbWFnaWM6IEFDX09VVFBVVCBhZGp1c3RzIGl0cyB2YWx1ZSBmb3IgZWFjaCBNYWtlZmlsZS4KLWRubCBIb3dldmVyIHdlIGNhbm5vdCBkZWZpbmUgbWtkaXJfcCBhcyAkKE1LRElSX1ApIGZvciB0aGUgc2FrZSBvZgotZG5sIE1ha2VmaWxlLmlucyB0aGF0IGRvIG5vdCBkZWZpbmUgTUtESVJfUCwgc28gd2UgZG8gb3VyIG93bgotZG5sIGFkanVzdG1lbnQgdXNpbmcgdG9wX2J1aWxkZGlyICh3aGljaCBpcyBkZWZpbmVkIG1vcmUgb2Z0ZW4gdGhhbgotZG5sIE1LRElSX1ApLgotQUNfU1VCU1QoW21rZGlyX3BdLCBbIiRNS0RJUl9QIl0pZG5sCi1jYXNlICRta2Rpcl9wIGluCi0gIFtbXFwvJF1dKiB8ID86W1tcXC9dXSopIDs7Ci0gICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKLWVzYWMKLV0pCi0KLSMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgc2VyaWFsIDMKLQotIyBfQU1fTUFOR0xFX09QVElPTihOQU1FKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW19BTV9NQU5HTEVfT1BUSU9OXSwKLVtbX0FNX09QVElPTl9dbTRfYnBhdHN1YnN0KCQxLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQotCi0jIF9BTV9TRVRfT1BUSU9OKE5BTUUpCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTZXQgb3B0aW9uIE5BTUUuICBQcmVzZW50bHkgdGhhdCBvbmx5IG1lYW5zIGRlZmluaW5nIGEgZmxhZyBmb3IgdGhpcyBvcHRpb24uCi1BQ19ERUZVTihbX0FNX1NFVF9PUFRJT05dLAotW200X2RlZmluZShfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgMSldKQotCi0jIF9BTV9TRVRfT1BUSU9OUyhPUFRJT05TKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE9QVElPTlMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBBdXRvbWFrZSBvcHRpb25zLgotQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sCi1bQUNfRk9SRUFDSChbX0FNX09wdGlvbl0sIFskMV0sIFtfQU1fU0VUX09QVElPTihfQU1fT3B0aW9uKV0pXSkKLQotIyBfQU1fSUZfT1BUSU9OKE9QVElPTiwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRXhlY3V0ZSBJRi1TRVQgaWYgT1BUSU9OIGlzIHNldCwgSUYtTk9ULVNFVCBvdGhlcndpc2UuCi1BQ19ERUZVTihbX0FNX0lGX09QVElPTl0sCi1bbTRfaWZzZXQoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIFskMl0sIFskM10pXSkKLQotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4gICAgLSotIEF1dG9jb25mIC0qLQotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCA0Ci0KLSMgQU1fU0FOSVRZX0NIRUNLCi0jIC0tLS0tLS0tLS0tLS0tLQotQUNfREVGVU4oW0FNX1NBTklUWV9DSEVDS10sCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiRbKl0iID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGVgCi0gICBmaQotICAgcm0gLWYgY29uZnRlc3QuZmlsZQotICAgaWYgdGVzdCAiJFsqXSIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJFsqXSIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIiRbMl0iID0gY29uZnRlc3QuZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgQU1fUFJPR19JTlNUQUxMX1NUUklQCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPbmUgaXNzdWUgd2l0aCB2ZW5kb3IgYGluc3RhbGwnIChldmVuIEdOVSkgaXMgdGhhdCB5b3UgY2FuJ3QKLSMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5Ci0jIGFubm95aW5nIGluIGNyb3NzLWNvbXBpbGluZyBlbnZpcm9ubWVudHMsIHdoZXJlIHRoZSBidWlsZCdzIHN0cmlwCi0jIGlzIHVubGlrZWx5IHRvIGhhbmRsZSB0aGUgaG9zdCdzIGJpbmFyaWVzLgotIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCi0jIGFsd2F5cyB1c2UgaW5zdGFsbC1zaCBpbiBgbWFrZSBpbnN0YWxsLXN0cmlwJywgYW5kIGluaXRpYWxpemUKLSMgU1RSSVBQUk9HIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBTVFJJUCB2YXJpYWJsZSAoc2V0IGJ5IHRoZSB1c2VyKS4KLUFDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLAotW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCi0jIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKLSMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKLSMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKLSMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCi1kbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KLSAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQotZmkKLUlOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCi1BQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQotCi0jIENvcHlyaWdodCAoQykgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBfQU1fU1VCU1RfTk9UTUFLRShWQVJJQUJMRSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFByZXZlbnQgQXV0b21ha2UgZnJvbSBvdXRwdXR0aW5nIFZBUklBQkxFID0gQFZBUklBQkxFQCBpbiBNYWtlZmlsZS5pbi4KLSMgVGhpcyBtYWNybyBpcyB0cmFjZWQgYnkgQXV0b21ha2UuCi1BQ19ERUZVTihbX0FNX1NVQlNUX05PVE1BS0VdKQotCi0jIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIHNlcmlhbCAyCi0KLSMgX0FNX1BST0dfVEFSKEZPUk1BVCkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwgaW4gZm9ybWF0IEZPUk1BVC4KLSMgRk9STUFUIHNob3VsZCBiZSBvbmUgb2YgYHY3JywgYHVzdGFyJywgb3IgYHBheCcuCi0jCi0jIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX190YXIpIHRoYXQgaXMgYSBjb21tYW5kCi0jIHdyaXRpbmcgdG8gc3Rkb3V0IGEgRk9STUFULXRhcmJhbGwgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5Ci0jICR0YXJkaXIuCi0jICAgICB0YXJkaXI9ZGlyZWN0b3J5ICYmICQoYW1fX3RhcikgPiByZXN1bHQudGFyCi0jCi0jIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX191bnRhcikgdGhhdCBleHRyYWN0IHN1Y2gKLSMgYSB0YXJiYWxsIHJlYWQgZnJvbSBzdGRpbi4KLSMgICAgICQoYW1fX3VudGFyKSA8IHJlc3VsdC50YXIKLUFDX0RFRlVOKFtfQU1fUFJPR19UQVJdLAotWyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLUFNX01JU1NJTkdfUFJPRyhbQU1UQVJdLCBbdGFyXSkKLW00X2lmKFskMV0sIFt2N10sCi0gICAgIFthbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLSddLAotICAgICBbbTRfY2FzZShbJDFdLCBbdXN0YXJdLCwgW3BheF0sLAotICAgICAgICAgICAgICBbbTRfZmF0YWwoW1Vua25vd24gdGFyIGZvcm1hdF0pXSkKLUFDX01TR19DSEVDS0lORyhbaG93IHRvIGNyZWF0ZSBhICQxIHRhciBhcmNoaXZlXSkKLSMgTG9vcCBvdmVyIGFsbCBrbm93biBtZXRob2RzIHRvIGNyZWF0ZSBhIHRhciBhcmNoaXZlIHVudGlsIG9uZSB3b3Jrcy4KLV9hbV90b29scz0nZ251dGFyIG00X2lmKFskMV0sIFt1c3Rhcl0sIFtwbGFpbnRhcl0pIHBheCBjcGlvIG5vbmUnCi1fYW1fdG9vbHM9JHthbV9jdl9wcm9nX3Rhcl8kMS0kX2FtX3Rvb2xzfQotIyBEbyBub3QgZm9sZCB0aGUgYWJvdmUgdHdvIGxpbmUgaW50byBvbmUsIGJlY2F1c2UgVHJ1NjQgc2ggYW5kCi0jIFNvbGFyaXMgc2ggd2lsbCBub3QgZ3JvayBzcGFjZXMgaW4gdGhlIHJocyBvZiBgLScuCi1mb3IgX2FtX3Rvb2wgaW4gJF9hbV90b29scwotZG8KLSAgY2FzZSAkX2FtX3Rvb2wgaW4KLSAgZ251dGFyKQotICAgIGZvciBfYW1fdGFyIGluIHRhciBnbnV0YXIgZ3RhcjsKLSAgICBkbwotICAgICAgQU1fUlVOX0xPRyhbJF9hbV90YXIgLS12ZXJzaW9uXSkgJiYgYnJlYWsKLSAgICBkb25lCi0gICAgYW1fX3Rhcj0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkJHRhcmRpciInCi0gICAgYW1fX3Rhcl89IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJHRhcmRpciInCi0gICAgYW1fX3VudGFyPSIkX2FtX3RhciAteGYgLSIKLSAgICA7OwotICBwbGFpbnRhcikKLSAgICAjIE11c3Qgc2tpcCBHTlUgdGFyOiBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0IC0tZm9ybWF0PSBpdCBkb2Vzbid0IGNyZWF0ZQotICAgICMgdXN0YXIgdGFyYmFsbCBlaXRoZXIuCi0gICAgKHRhciAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMSAmJiBjb250aW51ZQotICAgIGFtX190YXI9J3RhciBjaGYgLSAiJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSd0YXIgY2hmIC0gIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0ndGFyIHhmIC0nCi0gICAgOzsKLSAgcGF4KQotICAgIGFtX190YXI9J3BheCAtTCAteCAkMSAtdyAiJCR0YXJkaXIiJwotICAgIGFtX190YXJfPSdwYXggLUwgLXggJDEgLXcgIiR0YXJkaXIiJwotICAgIGFtX191bnRhcj0ncGF4IC1yJwotICAgIDs7Ci0gIGNwaW8pCi0gICAgYW1fX3Rhcj0nZmluZCAiJCR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCi0gICAgYW1fX3Rhcl89J2ZpbmQgIiR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCi0gICAgYW1fX3VudGFyPSdjcGlvIC1pIC1IICQxIC1kJwotICAgIDs7Ci0gIG5vbmUpCi0gICAgYW1fX3Rhcj1mYWxzZQotICAgIGFtX190YXJfPWZhbHNlCi0gICAgYW1fX3VudGFyPWZhbHNlCi0gICAgOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHZhbHVlIHdhcyBjYWNoZWQsIHN0b3Agbm93LiAgV2UganVzdCB3YW50ZWQgdG8gaGF2ZSBhbV9fdGFyCi0gICMgYW5kIGFtX191bnRhciBzZXQuCi0gIHRlc3QgLW4gIiR7YW1fY3ZfcHJvZ190YXJfJDF9IiAmJiBicmVhawotCi0gICMgdGFyL3VudGFyIGEgZHVtbXkgZGlyZWN0b3J5LCBhbmQgc3RvcCBpZiB0aGUgY29tbWFuZCB3b3JrcwotICBybSAtcmYgY29uZnRlc3QuZGlyCi0gIG1rZGlyIGNvbmZ0ZXN0LmRpcgotICBlY2hvIEdyZXBNZSA+IGNvbmZ0ZXN0LmRpci9maWxlCi0gIEFNX1JVTl9MT0coW3RhcmRpcj1jb25mdGVzdC5kaXIgJiYgZXZhbCAkYW1fX3Rhcl8gPmNvbmZ0ZXN0LnRhcl0pCi0gIHJtIC1yZiBjb25mdGVzdC5kaXIKLSAgaWYgdGVzdCAtcyBjb25mdGVzdC50YXI7IHRoZW4KLSAgICBBTV9SVU5fTE9HKFskYW1fX3VudGFyIDxjb25mdGVzdC50YXJdKQotICAgIGdyZXAgR3JlcE1lIGNvbmZ0ZXN0LmRpci9maWxlID4vZGV2L251bGwgMj4mMSAmJiBicmVhawotICBmaQotZG9uZQotcm0gLXJmIGNvbmZ0ZXN0LmRpcgotCi1BQ19DQUNIRV9WQUwoW2FtX2N2X3Byb2dfdGFyXyQxXSwgW2FtX2N2X3Byb2dfdGFyXyQxPSRfYW1fdG9vbF0pCi1BQ19NU0dfUkVTVUxUKFskYW1fY3ZfcHJvZ190YXJfJDFdKV0pCi1BQ19TVUJTVChbYW1fX3Rhcl0pCi1BQ19TVUJTVChbYW1fX3VudGFyXSkKLV0pICMgX0FNX1BST0dfVEFSCi0KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2F1dG9nZW4uc2ggYi9saWJzL2xpYnBuZy9hdXRvZ2VuLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2I2MzA4Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2F1dG9nZW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jISAvYmluL3NoCi0jIGEgcXVpY2sgaGFjayBzY3JpcHQgdG8gZ2VuZXJhdGUgbmVjZXNzYXJ5IGZpbGVzIGZyb20gCi0jIGF1dG8qIHRvb2xzLgotIwotIyBXQVJOSU5HOiBpZiB5b3UgcnVuIHRoaXMgeW91IHdpbGwgY2hhbmdlIHRoZSB2ZXJzaW9ucwotIyBvZiB0aGUgdG9vbHMgd2hpY2ggYXJlIHVzZWQgYW5kLCBtYXliZSwgcmVxdWlyZWQhCi0gICAgICAgIHRvdWNoIE1ha2VmaWxlLmFtIGNvbmZpZ3VyZS5hYwotewotCWVjaG8gInJ1bm5pbmcgbGlidG9vbGl6ZSIgPiYyCi0JbGlidG9vbGl6ZSAtLWZvcmNlIC0tY29weSAtLWF1dG9tYWtlCi19ICYmIHsKLQllY2hvICJydW5uaW5nIGFjbG9jYWwiID4mMgotCWFjbG9jYWwKLX0gJiYgewotCWVjaG8gInJ1bm5pbmcgYXV0b2hlYWRlciBbaWdub3JlIHRoZSB3YXJuaW5nc10iID4mMgotCWF1dG9oZWFkZXIKLX0gJiYgewotCWVjaG8gInJ1bm5pbmcgYXV0b21ha2UiID4mMgotCWF1dG9tYWtlIC0tZm9yY2UtbWlzc2luZyAtLWZvcmVpZ24gLWEgLWMKLX0gJiYgewotCWVjaG8gInJ1bm5pbmcgYXV0b2NvbmYiID4mMgotCWF1dG9jb25mCi19ICYmCi0JZWNobyAiYXV0b2dlbiBjb21wbGV0ZSIgPiYyIHx8Ci0JZWNobyAiRVJST1I6IGF1dG9nZW4uc2ggZmFpbGVkLCBhdXRvZ2VuIGlzIGluY29tcGxldGUiID4mMgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29uZmlnLmd1ZXNzIGIvbGlicy9saWJwbmcvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTJhMDNjLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDE1MjYgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4Ci0jICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLXRpbWVzdGFtcD0nMjAwOC0wMS0wOCcKLQotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotIyAwMjExMC0xMzAxLCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPi4KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXQotCi1PdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKLQotT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAotMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDs7Ci0gICAgLS12ZXJzaW9uIHwgLXYgKQotICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgOzsKLSAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQotICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKLSAgICAgICBleGl0IDEgOzsKLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgZXhpdCAxCi1maQotCi10cmFwICdleGl0IDEnIDEgMiAxNQotCi0jIENDX0ZPUl9CVUlMRCAtLSBjb21waWxlciB1c2VkIGJ5IHRoaXMgc2NyaXB0LiBOb3RlIHRoYXQgdGhlIHVzZSBvZiBhCi0jIGNvbXBpbGVyIHRvIGFpZCBpbiBzeXN0ZW0gZGV0ZWN0aW9uIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IHJlcXVpcmVzCi0jIHRlbXBvcmFyeSBmaWxlcyB0byBiZSBjcmVhdGVkIGFuZCwgYXMgeW91IGNhbiBzZWUgYmVsb3csIGl0IGlzIGEKLSMgaGVhZGFjaGUgdG8gZGVhbCB3aXRoIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KLQotIyBIaXN0b3JpY2FsbHksIGBDQ19GT1JfQlVJTEQnIHVzZWQgdG8gYmUgbmFtZWQgYEhPU1RfQ0MnLiBXZSBzdGlsbAotIyB1c2UgYEhPU1RfQ0MnIGlmIGRlZmluZWQsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLgotCi0jIFBvcnRhYmxlIHRtcCBkaXJlY3RvcnkgY3JlYXRpb24gaW5zcGlyZWQgYnkgdGhlIEF1dG9jb25mIHRlYW0uCi0KLXNldF9jY19mb3JfYnVpbGQ9JwotdHJhcCAiZXhpdGNvZGU9XCQ/OyAocm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGwpICYmIGV4aXQgXCRleGl0Y29kZSIgMCA7Ci10cmFwICJybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbDsgZXhpdCAxIiAxIDIgMTMgMTUgOwotOiAke1RNUERJUj0vdG1wfSA7Ci0geyB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIkVE1QRElSL2NnWFhYWFhYIikgMj4vZGV2L251bGxgICYmIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiIDsgfSB8fAotIHsgdGVzdCAtbiAiJFJBTkRPTSIgJiYgdG1wPSRUTVBESVIvY2ckJC0kUkFORE9NICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgOyB9IHx8Ci0geyB0bXA9JFRNUERJUi9jZy0kJCAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApICYmIGVjaG8gIldhcm5pbmc6IGNyZWF0aW5nIGluc2VjdXJlIHRlbXAgZGlyZWN0b3J5IiA+JjIgOyB9IHx8Ci0geyBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMiA7IGV4aXQgMSA7IH0gOwotZHVtbXk9JHRtcC9kdW1teSA7Ci10bXBmaWxlcz0iJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXkiIDsKLWNhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KLSAsLCkgICAgZWNobyAiaW50IHg7IiA+ICRkdW1teS5jIDsKLQlmb3IgYyBpbiBjYyBnY2MgYzg5IGM5OSA7IGRvCi0JICBpZiAoJGMgLWMgLW8gJGR1bW15Lm8gJGR1bW15LmMpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7Ci0JICBmaSA7Ci0JZG9uZSA7Ci0JaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KLQkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7Ci0JZmkKLQk7OwotICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7Ci0gLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OwotZXNhYyA7IHNldF9jY19mb3JfYnVpbGQ9IDsnCi0KLSMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCi0jIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgMTk5NC0wOC0yNCkKLWlmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICi1maQotCi1VTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KLVVOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgotVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KLVVOQU1FX1ZFUlNJT049YCh1bmFtZSAtdikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1ZFUlNJT049dW5rbm93bgotCi0jIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCi0KLWNhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KLSAgICAqOk5ldEJTRDoqOiopCi0JIyBOZXRCU0QgKG5ic2QpIHRhcmdldHMgc2hvdWxkICh3aGVyZSBhcHBsaWNhYmxlKSBtYXRjaCBvbmUgb3IKLQkjIG1vcmUgb2YgdGhlIHR1cHBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCi0JIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKLQkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKLQkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCi0JIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCi0JIyBvYmplY3QgZmlsZSBmb3JtYXQuCi0JIwotCSMgTm90ZTogTmV0QlNEIGRvZXNuJ3QgcGFydGljdWxhcmx5IGNhcmUgYWJvdXQgdGhlIHZlbmRvcgotCSMgcG9ydGlvbiBvZiB0aGUgbmFtZS4gIFdlIGFsd2F5cyBzZXQgaXQgdG8gInVua25vd24iLgotCXN5c2N0bD0ic3lzY3RsIC1uIGh3Lm1hY2hpbmVfYXJjaCIKLQlVTkFNRV9NQUNISU5FX0FSQ0g9YCgvc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IFwKLQkgICAgL3Vzci9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKWAKLQljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCi0JICAgIGFybWViKSBtYWNoaW5lPWFybWViLXVua25vd24gOzsKLQkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OwotCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OwotCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7Ci0JICAgIHNoNWVsKSBtYWNoaW5lPXNoNWxlLXVua25vd24gOzsKLQkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OwotCWVzYWMKLQkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKLQkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgotCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KLQkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCi0JCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKLQkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKLQkJdGhlbgotCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgotCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/Ci0JCSAgICBvcz1uZXRic2QKLQkJZWxzZQotCQkgICAgb3M9bmV0YnNkZWxmCi0JCWZpCi0JCTs7Ci0JICAgICopCi0JICAgICAgICBvcz1uZXRic2QKLQkJOzsKLQllc2FjCi0JIyBUaGUgT1MgcmVsZWFzZQotCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCi0JIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAotCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKLQkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KLQljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgotCSAgICBEZWJpYW4qKQotCQlyZWxlYXNlPSctZ251JwotCQk7OwotCSAgICAqKQotCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCQk7OwotCWVzYWMKLQkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKLQkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKLQkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCi0JZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCi0JZXhpdCA7OwotICAgICo6T3BlbkJTRDoqOiopCi0JVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAotCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpla2tvQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlNvbGlkQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbWFjcHBjOk1pckJTRDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOk1pckJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBhbHBoYTpPU0YxOio6KikKLQljYXNlICRVTkFNRV9SRUxFQVNFIGluCi0JKjQuMCkKLQkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKLQkJOzsKLQkqNS4qKQotCSAgICAgICAgVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKLQkJOzsKLQllc2FjCi0JIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KLQkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAotCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKLQkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KLQlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCi0JY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgotCSAgICAiRVY0ICgyMTA2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkVWNC41ICgyMTA2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OwotCSAgICAiRVY1ICgyMTE2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKLQkgICAgIkVWNS42ICgyMTE2NEEpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OwotCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKLQkgICAgIkVWNS43ICgyMTE2NFBDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7Ci0JICAgICJFVjYgKDIxMjY0KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OwotCSAgICAiRVY2LjcgKDIxMjY0QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7Ci0JICAgICJFVjYuOENCICgyMTI2NEMpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OwotCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKLQkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7Ci0JICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKLQkgICAgIkVWNyAoMjEzNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7Ci0JICAgICJFVjcuOSAoMjEzNjRBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKLQllc2FjCi0JIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KLQkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KLQkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgotCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgotCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotCWV4aXQgOzsKLSAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKLQkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KLQllY2hvIGFscGhhLXBjLWludGVyaXgKLQlleGl0IDs7Ci0gICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQotCWVjaG8gYWxwaGEtZGVjLXdpbm50My41Ci0JZXhpdCA7OwotICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQotCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0Ci0JZXhpdCA7OwotICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcwotCWV4aXQgOzsKLSAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKLQlleGl0IDs7Ci0gICAgKjpPUy8zOTA6KjoqKQotCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KLQlleGl0IDs7Ci0gICAgKjp6L1ZNOio6KikKLQllY2hvIHMzOTAtaWJtLXp2bW9lCi0JZXhpdCA7OwotICAgICo6T1M0MDA6KjoqKQotICAgICAgICBlY2hvIHBvd2VycGMtaWJtLW9zNDAwCi0JZXhpdCA7OwotICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKLQllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIGFybTpyaXNjb3M6KjoqfGFybTpSSVNDT1M6KjoqKQotCWVjaG8gYXJtLXVua25vd24tcmlzY29zCi0JZXhpdCA7OwotICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCi0JZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAotCWV4aXQgOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKLQkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgotCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKLQllbHNlCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAotCWZpCi0JZXhpdCA7OwotICAgIE5JTEUqOio6KjpkY29zeCkKLQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0Ci0JZXhpdCA7OwotICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQotCWVjaG8gc3BhcmMtaWNsLW54NgotCWV4aXQgOzsKLSAgICBEUlM/NjAwMDpVTklYX1NWOjQuMio6NyogfCBEUlM/NjAwMDppc2lzOjQuMio6NyopCi0JY2FzZSBgL3Vzci9iaW4vdW5hbWUgLXBgIGluCi0JICAgIHNwYXJjKSBlY2hvIHNwYXJjLWljbC1ueDc7IGV4aXQgOzsKLQllc2FjIDs7Ci0gICAgc3VuNEg6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgOzsKLSAgICBpODZwYzpTdW5PUzo1Lio6KiB8IGk4NnhlbjpTdW5PUzo1Lio6KikKLQllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDs7Ci0gICAgc3VuNCo6U3VuT1M6Nio6KikKLQkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQotCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0Ci0JIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgOzsKLSAgICBzdW40KjpTdW5PUzoqOiopCi0JY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgotCSAgICBTZXJpZXMqfFM0KikKLQkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCi0JCTs7Ci0JZXNhYwotCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KLQllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAotCWV4aXQgOzsKLSAgICBzdW4zKjpTdW5PUzoqOiopCi0JZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgc3VuKjoqOjQuMkJTRDoqKQotCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCi0JdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MwotCWNhc2UgImAvYmluL2FyY2hgIiBpbgotCSAgICBzdW4zKQotCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCSAgICBzdW40KQotCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQllc2FjCi0JZXhpdCA7OwotICAgIGF1c2hwOlN1bk9TOio6KikKLQllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKLSAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKLSAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCi0gICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgotICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5Ci0gICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKLSAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKLSAgICAjIGJlIG5vIHByb2JsZW0uCi0gICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCi0JZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgOzsKLSAgICAqZmFsY29uKjoqTWlOVDoqOiogfCAqZmFsY29uKjoqbWludDoqOiogfCAqZmFsY29uKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgOzsKLSAgICBoYWRlcyo6Kk1pTlQ6KjoqIHwgaGFkZXMqOiptaW50Oio6KiB8ICpoYWRlcyo6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDs7Ci0gICAgKjoqTWlOVDoqOiogfCAqOiptaW50Oio6KiB8ICo6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay11bmtub3duLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgOzsKLSAgICBtNjhrOm1hY2h0ZW46KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBSSVNDKjpNYWNoOio6KikKLQllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCi0JZXhpdCA7OwotICAgIFJJU0MqOlVMVFJJWDoqOiopCi0JZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFZBWCo6VUxUUklYKjoqOiopCi0JZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCi0JZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIHByaW50ZigpIHByb3RvdHlwZSAqLwotCWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0jZWxzZQotCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqYXJndltdOyB7Ci0jZW5kaWYKLQkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2VuZGlmCi0JICBleGl0ICgtMSk7Ci0JfQotRU9GCi0JJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYKLQkgIGR1bW15YXJnPWBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgICYmCi0JICBTWVNURU1fTkFNRT1gJGR1bW15ICRkdW1teWFyZ2AgJiYKLQkgICAgeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9Ci0JZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBNb3Rvcm9sYTpQb3dlck1BWF9PUzoqOiopCi0JZWNobyBwb3dlcnBjLW1vdG9yb2xhLXBvd2VybWF4Ci0JZXhpdCA7OwotICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKLQlleGl0IDs7Ci0gICAgTmlnaHRfSGF3azoqOio6UG93ZXJNQVhfT1MgfCBTeW5lcmd5OlBvd2VyTUFYX09TOio6KikKLQllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4Ci0JZXhpdCA7OwotICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKLQlleGl0IDs7Ci0gICAgbTg4azpDWC9VWDo3KjoqKQotCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKLQlleGl0IDs7Ci0gICAgbTg4azoqOjQqOlI0KikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKLQlleGl0IDs7Ci0gICAgbTg4azoqOjMqOlIzKikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDs7Ci0gICAgQVZpaU9OOmRndXg6KjoqKQotICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcwotICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAotCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KLQl0aGVuCi0JICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAotCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQotCSAgICB0aGVuCi0JCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotCSAgICBlbHNlCi0JCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQotCSAgICBmaQotCWVsc2UKLQkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAJZXhpdCA7OwotICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCi0JZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKLQlleGl0IDs7Ci0gICAgTTg4KjoqOlIzKjoqKQotCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDs7Ci0gICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCi0JZWNobyBtODhrLXRla3Ryb25peC1zeXN2MwotCWV4aXQgOzsKLSAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQotCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCi0JZXhpdCA7OwotICAgICo6SVJJWCo6KjoqKQotCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKLQlleGl0IDs7Ci0gICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgotCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCi0JZXhpdCA7OyAgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJwotICAgIGkqODY6QUlYOio6KikKLQllY2hvIGkzODYtaWJtLWFpeAotCWV4aXQgOzsKLSAgICBpYTY0OkFJWDoqOiopCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9Ci0JZXhpdCA7OwotICAgICo6QUlYOjI6MykKLQlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KLQotCQltYWluKCkKLQkJCXsKLQkJCWlmICghX19wb3dlcl9wYygpKQotCQkJCWV4aXQoMSk7Ci0JCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOwotCQkJZXhpdCgwKTsKLQkJCX0KLUVPRgotCQlpZiAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YAotCQl0aGVuCi0JCQllY2hvICIkU1lTVEVNX05BTUUiCi0JCWVsc2UKLQkJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQotCQlmaQotCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAotCWVsc2UKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMgotCWZpCi0JZXhpdCA7OwotICAgICo6QUlYOio6WzQ1Nl0pCi0JSUJNX0NQVV9JRD1gL3Vzci9zYmluL2xzZGV2IC1DIC1jIHByb2Nlc3NvciAtUyBhdmFpbGFibGUgfCBzZWQgMXEgfCBhd2sgJ3sgcHJpbnQgJDEgfSdgCi0JaWYgL3Vzci9zYmluL2xzYXR0ciAtRWwgJHtJQk1fQ1BVX0lEfSB8IGdyZXAgJyBQT1dFUicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCUlCTV9BUkNIPXJzNjAwMAotCWVsc2UKLQkJSUJNX0FSQ0g9cG93ZXJwYwotCWZpCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgOzsKLSAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKLQllY2hvIHJvbXAtaWJtLWJzZDQuNAotCWV4aXQgOzsKLSAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgQlNEIGFuZAotCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KLQlleGl0IDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMwotICAgICo6Qk9TWDoqOiopCi0JZWNobyByczYwMDAtYnVsbC1ib3N4Ci0JZXhpdCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDs7Ci0gICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2QKLQlleGl0IDs7Ci0gICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKLQllY2hvIG02OGstaHAtYnNkNC40Ci0JZXhpdCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKLQkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KLQkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAotICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCi0gICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCi0gICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7Ci0JCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKLSAgICAgICAgICAgICAgICAgICAgZXNhYwotCQlmaQotCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KLQkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYwotCi0gICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCi0gICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQotICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgIGV4aXQgKDApOwotICAgICAgICAgICAgICB9Ci1FT0YKLQkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCi0JCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCi0JCWZpIDs7Ci0JZXNhYwotCWlmIFsgJHtIUF9BUkNIfSA9ICJocHBhMi4wdyIgXQotCXRoZW4KLQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCi0JICAgICMgaHBwYTIuMHctaHAtaHB1eCogaGFzIGEgNjQtYml0IGtlcm5lbCBhbmQgYSBjb21waWxlciBnZW5lcmF0aW5nCi0JICAgICMgMzItYml0IGNvZGUuICBocHBhNjQtaHAtaHB1eCogaGFzIHRoZSBzYW1lIGtlcm5lbCBhbmQgYSBjb21waWxlcgotCSAgICAjIGdlbmVyYXRpbmcgNjQtYml0IGNvZGUuICBHTlUgYW5kIEhQIHVzZSBkaWZmZXJlbnQgbm9tZW5jbGF0dXJlOgotCSAgICAjCi0JICAgICMgJCBDQ19GT1JfQlVJTEQ9Y2MgLi9jb25maWcuZ3Vlc3MKLQkgICAgIyA9PiBocHBhMi4wdy1ocC1ocHV4MTEuMjMKLQkgICAgIyAkIENDX0ZPUl9CVUlMRD0iY2MgK0RBMi4wdyIgLi9jb25maWcuZ3Vlc3MKLQkgICAgIyA9PiBocHBhNjQtaHAtaHB1eDExLjIzCi0KLQkgICAgaWYgZWNobyBfX0xQNjRfXyB8IChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfAotCQlncmVwIF9fTFA2NF9fID4vZGV2L251bGwKLQkgICAgdGhlbgotCQlIUF9BUkNIPSJocHBhMi4wdyIKLQkgICAgZWxzZQotCQlIUF9BUkNIPSJocHBhNjQiCi0JICAgIGZpCi0JZmkKLQllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9Ci0JZXhpdCA7OwotICAgIGlhNjQ6SFAtVVg6KjoqKQotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDs7Ci0gICAgMzA1MCo6SEktVVg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQKLQltYWluICgpCi0JewotCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKLQkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0Ci0JICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KLQkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoY3B1KQotCQl7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKLQkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7Ci0JICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZXhpdCAoMCk7Ci0JfQotRU9GCi0JJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKLQkJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9Ci0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgOzsKLSAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCi0JZWNobyBocHBhMS4xLWhwLWJzZAotCWV4aXQgOzsKLSAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1ic2QKLQlleGl0IDs7Ci0gICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgOzsKLSAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtb3NmCi0JZXhpdCA7OwotICAgIGhwOD8/Ok9TRjE6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1vc2YKLQlleGl0IDs7Ci0gICAgaSo4NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCA7OwotICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKLQllY2hvIGhwcGExLjEtaHAtbGl0ZXMKLQlleGl0IDs7Ci0gICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKLQllY2hvIGMxLWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDs7Ci0gICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCA7OwotICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDs7Ci0gICAgQ1JBWSpZLU1QOio6KjoqKQotCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCA7OwotICAgIENSQVkqW0EtWl05MDoqOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKLQl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKLQkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCi0JICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCA7OwotICAgIENSQVkqVDNFOio6KjoqKQotCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBDUkFZKlNWMToqOio6KikKLQllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICAqOlVOSUNPUy9tcDoqOiopCi0JZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgOzsKLSAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKLQlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0gICAgICAgIGV4aXQgOzsKLSAgICA1MDAwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCi0gICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKLSAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKLSAgICAgICAgZWNobyAic3BhcmMtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotCWV4aXQgOzsKLSAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgc3BhcmMqOkJTRC9PUzoqOiopCi0JZWNobyBzcGFyYy11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgotCSAgICBwYzk4KQotCQllY2hvIGkzODYtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OwotCSAgICBhbWQ2NCkKLQkJZWNobyB4ODZfNjQtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OwotCSAgICAqKQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OwotCWVzYWMKLQlleGl0IDs7Ci0gICAgaSo6Q1lHV0lOKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KLQlleGl0IDs7Ci0gICAgKjpNSU5HVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgotCWV4aXQgOzsKLSAgICBpKjp3aW5kb3dzMzIqOiopCi0gICAgCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCi0gICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1taW5ndzMyCi0JZXhpdCA7OwotICAgIGkqOlBXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCi0JZXhpdCA7OwotICAgICo6SW50ZXJpeCo6WzM0NTZdKikKLSAgICAJY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCi0JICAgIHg4NikKLQkJZWNobyBpNTg2LXBjLWludGVyaXgke1VOQU1FX1JFTEVBU0V9Ci0JCWV4aXQgOzsKLQkgICAgRU02NFQgfCBhdXRoZW50aWNhbWQpCi0JCWVjaG8geDg2XzY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KLQkJZXhpdCA7OwotCSAgICBJQTY0KQotCQllY2hvIGlhNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQotCQlleGl0IDs7Ci0JZXNhYyA7OwotICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKLQllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcwotCWV4aXQgOzsKLSAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKLQkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/Ci0JIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKLQkjIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mIGkzODY/Ci0JZWNobyBpNTg2LXBjLWludGVyaXgKLQlleGl0IDs7Ci0gICAgaSo6VVdJTio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgotCWV4aXQgOzsKLSAgICBhbWQ2NDpDWUdXSU4qOio6KiB8IHg4Nl82NDpDWUdXSU4qOio6KikKLQllY2hvIHg4Nl82NC11bmtub3duLWN5Z3dpbgotCWV4aXQgOzsKLSAgICBwKjpDWUdXSU4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KLQlleGl0IDs7Ci0gICAgcHJlcCo6U3VuT1M6NS4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgOzsKLSAgICAqOkdOVToqOiopCi0JIyB0aGUgR05VIHN5c3RlbQotCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAotCWV4aXQgOzsKLSAgICAqOkdOVS8qOio6KikKLQkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLWdudQotCWV4aXQgOzsKLSAgICBpKjg2Ok1pbml4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluaXgKLQlleGl0IDs7Ci0gICAgYXJtKjpMaW51eDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCWlmIGVjaG8gX19BUk1fRUFCSV9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKLQkgICAgfCBncmVwIC1xIF9fQVJNX0VBQklfXwotCXRoZW4KLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZWxzZQotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVlYWJpCi0JZmkKLQlleGl0IDs7Ci0gICAgYXZyMzIqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgY3JpczpMaW51eDoqOiopCi0JZWNobyBjcmlzLWF4aXMtbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGNyaXN2MzI6TGludXg6KjoqKQotCWVjaG8gY3Jpc3YzMi1heGlzLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBmcnY6TGludXg6KjoqKQotICAgIAllY2hvIGZydi11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBpYTY0OkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgbTMycio6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBtNjgqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgbWlwczpMaW51eDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI3VuZGVmIENQVQotCSN1bmRlZiBtaXBzCi0JI3VuZGVmIG1pcHNlbAotCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCi0JQ1BVPW1pcHNlbAotCSNlbHNlCi0JI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKLQlDUFU9bWlwcwotCSNlbHNlCi0JQ1BVPQotCSNlbmRpZgotCSNlbmRpZgotRU9GCi0JZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJwotCSAgICAvXkNQVS97Ci0JCXM6IDo6ZwotCQlwCi0JICAgIH0nYCIKLQl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQotCTs7Ci0gICAgbWlwczY0OkxpbnV4Oio6KikKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjdW5kZWYgQ1BVCi0JI3VuZGVmIG1pcHM2NAotCSN1bmRlZiBtaXBzNjRlbAotCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCi0JQ1BVPW1pcHM2NGVsCi0JI2Vsc2UKLQkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQotCUNQVT1taXBzNjQKLQkjZWxzZQotCUNQVT0KLQkjZW5kaWYKLQkjZW5kaWYKLUVPRgotCWV2YWwgImAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgc2VkIC1uICcKLQkgICAgL15DUFUvewotCQlzOiA6OmcKLQkJcAotCSAgICB9J2AiCi0JdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KLQk7OwotICAgIG9yMzI6TGludXg6KjoqKQotCWVjaG8gb3IzMi11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBwcGM6TGludXg6KjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICBwcGM2NDpMaW51eDoqOiopCi0JZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgYWxwaGE6TGludXg6KjoqKQotCWNhc2UgYHNlZCAtbiAnL15jcHUgbW9kZWwvcy9eLio6IFwoLipcKS9cMS9wJyA8IC9wcm9jL2NwdWluZm9gIGluCi0JICBFVjUpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NSA7OwotCSAgRVY1NikgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjU2IDs7Ci0JICBQQ0E1NikgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7Ci0JICBQQ0E1NykgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7Ci0JICBFVjYpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NiA7OwotCSAgRVY2NykgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY3IDs7Ci0JICBFVjY4KikgVU5BTUVfTUFDSElORT1hbHBoYWV2NjggOzsKLSAgICAgICAgZXNhYwotCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgbGQuc28uMSA+L2Rldi9udWxsCi0JaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4gTElCQz0ibGliYzEiIDsgZWxzZSBMSUJDPSIiIDsgZmkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9Ci0JZXhpdCA7OwotICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKLQkjIExvb2sgZm9yIENQVSBsZXZlbAotCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCi0JICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKLQkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OwotCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7Ci0JZXNhYwotCWV4aXQgOzsKLSAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQotCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHMzOTA6TGludXg6KjoqIHwgczM5MHg6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tbGludXgKLQlleGl0IDs7Ci0gICAgc2g2NCo6TGludXg6KjoqKQotICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgc2gqOkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIHZheDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1saW51eC1nbnUKLQlleGl0IDs7Ci0gICAgeDg2XzY0OkxpbnV4Oio6KikKLQllY2hvIHg4Nl82NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgOzsKLSAgICB4dGVuc2EqOkxpbnV4Oio6KikKLSAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCA7OwotICAgIGkqODY6TGludXg6KjoqKQotCSMgVGhlIEJGRCBsaW5rZXIga25vd3Mgd2hhdCB0aGUgZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMsIHNvCi0JIyBmaXJzdCBzZWUgaWYgaXQgd2lsbCB0ZWxsIHVzLiBjZCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gcHJldmVudAotCSMgcHJvYmxlbXMgd2l0aCBvdGhlciBwcm9ncmFtcyBvciBkaXJlY3RvcmllcyBjYWxsZWQgYGxkJyBpbiB0aGUgcGF0aC4KLQkjIFNldCBMQ19BTEw9QyB0byBlbnN1cmUgbGQgb3V0cHV0cyBtZXNzYWdlcyBpbiBFbmdsaXNoLgotCWxkX3N1cHBvcnRlZF90YXJnZXRzPWBjZCAvOyBMQ19BTEw9QyBsZCAtLWhlbHAgMj4mMSBcCi0JCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIHRhcmdldHM6LyFkCi0JCQkJICAgIHMvWyAJXVsgCV0qLyAvZwotCQkJCSAgICBzLy4qc3VwcG9ydGVkIHRhcmdldHM6ICovLwotCQkJCSAgICBzLyAuKi8vCi0JCQkJICAgIHAnYAotICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX3RhcmdldHMiIGluCi0JICBlbGYzMi1pMzg2KQotCQlURU5UQVRJVkU9IiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251IgotCQk7OwotCSAgYS5vdXQtaTM4Ni1saW51eCkKLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVhb3V0IgotCQlleGl0IDs7Ci0JICBjb2ZmLWkzODYpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIKLQkJZXhpdCA7OwotCSAgIiIpCi0JCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgotCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KLQkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKLQkJZXhpdCA7OwotCWVzYWMKLQkjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotCSNpZmRlZiBfX0VMRl9fCi0JIyBpZmRlZiBfX0dMSUJDX18KLQkjICBpZiBfX0dMSUJDX18gPj0gMgotCUxJQkM9Z251Ci0JIyAgZWxzZQotCUxJQkM9Z251bGliYzEKLQkjICBlbmRpZgotCSMgZWxzZQotCUxJQkM9Z251bGliYzEKLQkjIGVuZGlmCi0JI2Vsc2UKLQkjaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSB8fCBkZWZpbmVkKF9fUEdJKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0MpIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCi0JTElCQz1nbnUKLQkjZWxzZQotCUxJQkM9Z251YW91dAotCSNlbmRpZgotCSNlbmRpZgotCSNpZmRlZiBfX2RpZXRsaWJjX18KLQlMSUJDPWRpZXRsaWJjCi0JI2VuZGlmCi1FT0YKLQlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCi0JICAgIC9eTElCQy97Ci0JCXM6IDo6ZwotCQlwCi0JICAgIH0nYCIKLQl0ZXN0IHgiJHtMSUJDfSIgIT0geCAmJiB7Ci0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfSIKLQkJZXhpdAotCX0KLQl0ZXN0IHgiJHtURU5UQVRJVkV9IiAhPSB4ICYmIHsgZWNobyAiJHtURU5UQVRJVkV9IjsgZXhpdDsgfQotCTs7Ci0gICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKLQkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgotCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKLQkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgotCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0Ci0JZXhpdCA7OwotICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCi0gICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KLSAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgotICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCi0JIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgotICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgOzsKLSAgICBpKjg2Ok9TLzI6KjoqKQotCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5Ci0JIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKLQlleGl0IDs7Ci0gICAgaSo4NjpYVFMtMzAwOio6U1RPUCkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zdG9wCi0JZXhpdCA7OwotICAgIGkqODY6YXRoZW9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKLQlleGl0IDs7Ci0gICAgaSo4NjpzeWxsYWJsZToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5bGxhYmxlCi0JZXhpdCA7OwotICAgIGkqODY6THlueE9TOjIuKjoqIHwgaSo4NjpMeW54T1M6My5bMDFdKjoqIHwgaSo4NjpMeW54T1M6NC4wKjoqKQotCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgaSo4NjoqRE9TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAotCWV4aXQgOzsKLSAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQotCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAotCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9Ci0JZmkKLQlleGl0IDs7Ci0gICAgaSo4NjoqOjU6WzY3OF0qKQotICAgIAkjIFVuaXhXYXJlIDcueCwgT3BlblVOSVggYW5kIE9wZW5TZXJ2ZXIgNi4KLQljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgotCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKLQkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7Ci0JICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7Ci0JZXNhYwotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgOzsKLSAgICBpKjg2Oio6My4yOiopCi0JaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgotCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCi0JZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCi0JCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8Z3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKLQkJKC9iaW4vdW5hbWUgLVh8Z3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2Ci0JCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKLQkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnQgKklJJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKLQllbHNlCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKLQlmaQotCWV4aXQgOzsKLSAgICBwYzoqOio6KikKLQkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKLSAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKLSAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KLQllY2hvIGkzODYtcGMtbXNkb3NkamdwcAotICAgICAgICBleGl0IDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgOzsKLSAgICBwYXJhZ29uOio6KjoqKQotCWVjaG8gaTg2MC1pbnRlbC1vc2YxCi0JZXhpdCA7OwotICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKLQlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAotCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KLQkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0Ci0JZmkKLQlleGl0IDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDs7Ci0gICAgbWM2OGs6VU5JWDpTWVNURU01OjMuNTFtKQotCWVjaG8gbTY4ay1jb252ZXJnZW50LXN5c3YKLQlleGl0IDs7Ci0gICAgTTY4MD8wOkQtTklYOjUuMzoqKQotCWVjaG8gbTY4ay1kaWFiLWRuaXgKLQlleGl0IDs7Ci0gICAgTTY4KjoqOlIzVls1Njc4XSo6KikKLQl0ZXN0IC1yIC9zeXNWNjggJiYgeyBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnOyBleGl0OyB9IDs7Ci0gICAgM1szNDVdPz86Kjo0LjA6My4wIHwgM1szNF0/P0E6Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDNbMzRdPz8vKjoqOjQuMDozLjAgfCA0NDAwOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wIHwgU0RTMjoqOjQuMDozLjAgfCBTSEcyOio6NC4wOjMuMCB8IFM3NTAxKjoqOjQuMDozLjApCi0JT1NfUkVMPScnCi0JdGVzdCAtciAvZXRjLy5yZWxpZCBcCi0JJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLQkgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9Ci0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCi0JICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OwotICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQotICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLSAgICAgICAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKLSAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKLQllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKLQllY2hvIG02OGstYXRhcmktc3lzdjQKLQlleGl0IDs7Ci0gICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCi0JZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgcnM2MDAwOkx5bnhPUzoyLio6KikKLQllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LjAqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQotCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQotCWVjaG8gbWlwcy1zbmktc3lzdjQKLQlleGl0IDs7Ci0gICAgUk0qOlNJTklYLSo6KjoqKQotCWVjaG8gbWlwcy1zbmktc3lzdjQKLQlleGl0IDs7Ci0gICAgKjpTSU5JWC0qOio6KikKLQlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0Ci0JZWxzZQotCQllY2hvIG5zMzJrLXNuaS1zeXN2Ci0JZmkKLQlleGl0IDs7Ci0gICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKLSAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+Ci0gICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKLSAgICAgICAgZXhpdCA7OwotICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQotCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KLQkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KLQllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAotCWV4aXQgOzsKLSAgICAqOio6KjpGVFgqKQotCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgotCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCA7OwotICAgIGkqODY6Vk9TOio6KikKLQkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tc3RyYXR1cy12b3MKLQlleGl0IDs7Ci0gICAgKjpWT1M6KjoqKQotCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcwotCWV4aXQgOzsKLSAgICBtYzY4KjpBL1VYOio6KikKLQllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBuZXdzKjpORVdTLU9TOjYqOiopCi0JZWNobyBtaXBzLXNvbnktbmV3c29zNgotCWV4aXQgOzsKLSAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKLQlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KLQkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gICAgICAgIGV4aXQgOzsKLSAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCi0JZWNobyBwb3dlcnBjLWJlLWJlb3MKLQlleGl0IDs7Ci0gICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgotCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCi0JZXhpdCA7OwotICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWJlb3MKLQlleGl0IDs7Ci0gICAgU1gtNDpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFNYLTU6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g1LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTWC02OlNVUEVSLVVYOio6KikKLQllY2hvIHN4Ni1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgU1gtNzpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDctbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIFNYLTg6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g4LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBTWC04UjpTVVBFUi1VWDoqOiopCi0JZWNobyBzeDhyLW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDs7Ci0gICAgKjpSaGFwc29keToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOkRhcndpbjoqOiopCi0JVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAgfHwgVU5BTUVfUFJPQ0VTU09SPXVua25vd24KLQljYXNlICRVTkFNRV9QUk9DRVNTT1IgaW4KLQkgICAgdW5rbm93bikgVU5BTUVfUFJPQ0VTU09SPXBvd2VycGMgOzsKLQllc2FjCi0JZWNobyAke1VOQU1FX1BST0NFU1NPUn0tYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOnByb2NudG8qOio6KiB8ICo6UU5YOlswMTIzNDU2Nzg5XSo6KikKLQlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYAotCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gIng4NiI7IHRoZW4KLQkJVU5BTUVfUFJPQ0VTU09SPWkzODYKLQkJVU5BTUVfTUFDSElORT1wYwotCWZpCi0JZWNobyAke1VOQU1FX1BST0NFU1NPUn0tJHtVTkFNRV9NQUNISU5FfS1udG8tcW54JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlFOWDoqOjQqKQotCWVjaG8gaTM4Ni1wYy1xbngKLQlleGl0IDs7Ci0gICAgTlNFLT86Tk9OU1RPUF9LRVJORUw6KjoqKQotCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKLQllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOk5vblN0b3AtVVg6KjoqKQotCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4Ci0JZXhpdCA7OwotICAgIEJTMjAwMDpQT1NJWCo6KjoqKQotCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgotCWV4aXQgOzsKLSAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgOzsKLSAgICAqOlBsYW45Oio6KikKLQkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKLQkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgotCSMgb3BlcmF0aW5nIHN5c3RlbXMuCi0JaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KLQkgICAgVU5BTUVfTUFDSElORT1pMzg2Ci0JZWxzZQotCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45Ci0JZXhpdCA7OwotICAgICo6VE9QUy0xMDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAotCWV4aXQgOzsKLSAgICAqOlRFTkVYOio6KikKLQllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKLQlleGl0IDs7Ci0gICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLWRlYy10b3BzMjAKLQlleGl0IDs7Ci0gICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXhrbC10b3BzMjAKLQlleGl0IDs7Ci0gICAgKjpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCi0JZXhpdCA7OwotICAgICo6SVRTOio6KikKLQllY2hvIHBkcDEwLXVua25vd24taXRzCi0JZXhpdCA7OwotICAgIFNFSToqOio6U0VJVVgpCi0gICAgICAgIGVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCA7OwotICAgICo6RHJhZ29uRmx5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCi0JZXhpdCA7OwotICAgICo6KlZNUzoqOiopCi0gICAgCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgICAgQSopIGVjaG8gYWxwaGEtZGVjLXZtcyA7IGV4aXQgOzsKLQkgICAgSSopIGVjaG8gaWE2NC1kZWMtdm1zIDsgZXhpdCA7OwotCSAgICBWKikgZWNobyB2YXgtZGVjLXZtcyA7IGV4aXQgOzsKLQllc2FjIDs7Ci0gICAgKjpYRU5JWDoqOlN5c1YpCi0JZWNobyBpMzg2LXBjLXhlbml4Ci0JZXhpdCA7OwotICAgIGkqODY6c2t5b3M6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1za3lvc2BlY2hvICR7VU5BTUVfUkVMRUFTRX1gIHwgc2VkIC1lICdzLyAuKiQvLycKLQlleGl0IDs7Ci0gICAgaSo4NjpyZG9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcmRvcwotCWV4aXQgOzsKLWVzYWMKLQotI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCi0jZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCi0KLWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLWNhdCA+JGR1bW15LmMgPDxFT0YKLSNpZmRlZiBfU0VRVUVOVF8KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jZW5kaWYKLW1haW4gKCkKLXsKLSNpZiBkZWZpbmVkIChzb255KQotI2lmIGRlZmluZWQgKE1JUFNFQikKLSAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKLSAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KLSAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAotI2lmZGVmIE5FV1NPUzQKLSAgICAgICAgICAiNCIKLSNlbHNlCi0JICAiIgotI2VuZGlmCi0gICAgICAgICApOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQotICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKLSAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTmVYVCkKLSNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKLSNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKLSNlbmRpZgotICBpbnQgdmVyc2lvbjsKLSAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOwotICBpZiAodmVyc2lvbiA8IDQpCi0gICAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiVzLW5leHQtb3BlbnN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChNVUxUSU1BWCkgfHwgZGVmaW5lZCAobjE2KQotI2lmIGRlZmluZWQgKFVNQVhWKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtc3lzdlxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpZiBkZWZpbmVkIChDTVUpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1tYWNoXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotICBwcmludGYgKCJuczMyay1lbmNvcmUtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfXzM4NkJTRF9fKQotICBwcmludGYgKCJpMzg2LXBjLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChzZXF1ZW50KQotI2lmIGRlZmluZWQgKGkzODYpCi0gIHByaW50ZiAoImkzODYtc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAobnMzMjAwMCkKLSAgcHJpbnRmICgibnMzMmstc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9TRVFVRU5UXykKLSAgICBzdHJ1Y3QgdXRzbmFtZSB1bjsKLQotICAgIHVuYW1lKCZ1bik7Ci0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjIiLCAyKSA9PSAwKSB7Ci0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDJcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYxIiwgMikgPT0gMCkgeyAvKiBYWFggaXMgVjEgY29ycmVjdD8gKi8KLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MVxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4XG4iKTsgZXhpdCAoMCk7Ci0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAodmF4KQotIyBpZiAhZGVmaW5lZCAodWx0cml4KQotIyAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICBpZiBkZWZpbmVkIChCU0QpCi0jICAgaWYgQlNEID09IDQzCi0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM1xuIik7IGV4aXQgKDApOwotIyAgIGVsc2UKLSMgICAgaWYgQlNEID09IDE5OTAwNgotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNyZW5vXG4iKTsgZXhpdCAoMCk7Ci0jICAgIGVsc2UKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVsc2UKLSAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotIyAgZW5kaWYKLSMgZWxzZQotICAgIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCi0gIHByaW50ZiAoImk4NjAtYWxsaWFudC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0gIGV4aXQgKDEpOwotfQotRU9GCi0KLSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCi0JeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9Ci0KLSMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KLQotdGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0OyB9Ci0KLSMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKLQotaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KLXRoZW4KLSAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgotICAgIGMxKikKLQllY2hvIGMxLWNvbnZleC1ic2QKLQlleGl0IDs7Ci0gICAgYzIqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLQlleGl0IDs7Ci0gICAgYzM0KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIGMzOCopCi0JZWNobyBjMzgtY29udmV4LWJzZAotCWV4aXQgOzsKLSAgICBjNCopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCA7OwotICAgIGVzYWMKLWZpCi0KLWNhdCA+JjIgPDxFT0YKLSQwOiB1bmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUKLQotVGhpcyBzY3JpcHQsIGxhc3QgbW9kaWZpZWQgJHRpbWVzdGFtcCwgaGFzIGZhaWxlZCB0byByZWNvZ25pemUKLXRoZSBvcGVyYXRpbmcgc3lzdGVtIHlvdSBhcmUgdXNpbmcuIEl0IGlzIGFkdmlzZWQgdGhhdCB5b3UKLWRvd25sb2FkIHRoZSBtb3N0IHVwIHRvIGRhdGUgdmVyc2lvbiBvZiB0aGUgY29uZmlnIHNjcmlwdHMgZnJvbQotCi0gIGh0dHA6Ly9zYXZhbm5haC5nbnUub3JnL2NnaS1iaW4vdmlld2N2cy8qY2hlY2tvdXQqL2NvbmZpZy9jb25maWcvY29uZmlnLmd1ZXNzCi1hbmQKLSAgaHR0cDovL3NhdmFubmFoLmdudS5vcmcvY2dpLWJpbi92aWV3Y3ZzLypjaGVja291dCovY29uZmlnL2NvbmZpZy9jb25maWcuc3ViCi0KLUlmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQotc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKLXBlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCi1pbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCi0KLWNvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCi0KLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAotL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAotCi1ob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAotL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAotL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCi0KLVVOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9Ci1VTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQotVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQotVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KLUVPRgotCi1leGl0IDEKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29uZmlnLmguaW4gYi9saWJzL2xpYnBuZy9jb25maWcuaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExZDNiNS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb25maWcuaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfRExGQ05fSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG0nIGxpYnJhcnkgKC1sbSkuICovCi0jdW5kZWYgSEFWRV9MSUJNCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgeicgbGlicmFyeSAoLWx6KS4gKi8KLSN1bmRlZiBIQVZFX0xJQloKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtc2V0JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX01FTVNFVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBvdycgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9QT1cKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVERJTlRfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfU1RBVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3RvcnkgaW4gd2hpY2ggbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLgotICAgKi8KLSN1bmRlZiBMVF9PQkpESVIKLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KLSN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9OQU1FCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1NUUklORwotCi0vKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9UQVJOQU1FCi0KLS8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9WRVJTSU9OCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3VyIDxzeXMvdGltZS5oPiBkZWNsYXJlcyBgc3RydWN0IHRtJy4gKi8KLSN1bmRlZiBUTV9JTl9TWVNfVElNRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCi0jdW5kZWYgc2l6ZV90CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb25maWcuc3ViIGIvbGlicy9saWJwbmcvY29uZmlnLnN1YgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1OTgyNS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb25maWcuc3ViCisrKyAvZGV2L251bGwKQEAgLTEsMTY1OCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCi0jICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOAotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDgtMDEtMTYnCi0KLSMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgotIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCi0jIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0jIDAyMTEwLTEzMDEsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCi0jIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KLSMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCi0jIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCi0KLSMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCi0jIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcwotIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgotIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucwotIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKLSMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcwotIyBjb25maWd1cmF0aW9uLgotCi0jIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgotIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQotIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQotIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCi0KLW1lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAotCi11c2FnZT0iXAotVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKLSAgICAgICAkMCBbT1BUSU9OXSBBTElBUwotCi1DYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCi0KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCi13YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCi0KLWhlbHA9IgotVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0jIFBhcnNlIGNvbW1hbmQgbGluZQotd2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCi0gIGNhc2UgJDEgaW4KLSAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQotICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OwotICAgIC0tdmVyc2lvbiB8IC12ICkKLSAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7Ci0gICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCi0gICAgICAgc2hpZnQ7IGJyZWFrIDs7Ci0gICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgotICAgICAgIGJyZWFrIDs7Ci0gICAgLSogKQotICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKLSAgICAgICBleGl0IDEgOzsKLQotICAgICpsb2NhbCopCi0gICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCi0gICAgICAgZWNobyAkMQotICAgICAgIGV4aXQgOzsKLQotICAgICogKQotICAgICAgIGJyZWFrIDs7Ci0gIGVzYWMKLWRvbmUKLQotY2FzZSAkIyBpbgotIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotIDEpIDs7Ci0gKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCi0gICAgZXhpdCAxOzsKLWVzYWMKLQotIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgotIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KLW1heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAotY2FzZSAkbWF5YmVfb3MgaW4KLSAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgbGludXgtdWNsaWJjKiB8IFwKLSAgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAotICBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCi0gICAgb3M9LSRtYXliZV9vcwotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCi0gICAgOzsKLSAgKikKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCi0gICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCi0gICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAotICAgIGVsc2Ugb3M9OyBmaQotICAgIDs7Ci1lc2FjCi0KLSMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbwotIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KLSMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKLSMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgotY2FzZSAkb3MgaW4KLQktc3VuKm9zKikKLQkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCi0JCTs7Ci0JLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKLQktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKLQktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAotCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCi0JLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKLQktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKLQktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5KQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zY291dCkKLQkJOzsKLQktd3JzKQotCQlvcz0tdnh3b3JrcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLWNob3J1c29zKikKLQkJb3M9LWNob3J1c29zCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLSAJLWNob3J1c3JkYikKLSAJCW9zPS1jaG9ydXNyZGIKLQkJYmFzaWNfbWFjaGluZT0kMQotIAkJOzsKLQktaGl1eCopCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JLXNjbzYpCi0JCW9zPS1zY281djYKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY281KQotCQlvcz0tc2NvMy4ydjUKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY280KQotCQlvcz0tc2NvMy4ydjQKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjIuWzQtOV0qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4ydls0LTldKikKLQkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY281djYqKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbyopCi0JCW9zPS1zY28zLjJ2MgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXVkayopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCopCi0JCW9zPS1seW54b3MKLQkJOzsKLQktcHR4KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCi0JCTs7Ci0JLXdpbmRvd3NudCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKLQkJOzsKLQktcHNvcyopCi0JCW9zPS1wc29zCi0JCTs7Ci0JLW1pbnQgfCAtbWludFswLTldKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCi0JIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KLQkxNzUwYSB8IDU4MCBcCi0JfCBhMjlrIFwKLQl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFldjZbNzhdIHwgYWxwaGFwY2E1WzY3XSBcCi0JfCBhbHBoYTY0IHwgYWxwaGE2NGV2WzQtOF0gfCBhbHBoYTY0ZXY1NiB8IGFscGhhNjRldjZbNzhdIHwgYWxwaGE2NHBjYTVbNjddIFwKLQl8IGFtMzNfMi4wIFwKLQl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciB8IGF2cjMyIFwKLQl8IGJmaW4gXAotCXwgYzR4IHwgY2xpcHBlciBcCi0JfCBkMTB2IHwgZDMwdiB8IGRseCB8IGRzcDE2eHggXAotCXwgZmlkbyB8IGZyMzAgfCBmcnYgXAotCXwgaDgzMDAgfCBoODUwMCB8IGhwcGEgfCBocHBhMS5bMDFdIHwgaHBwYTIuMCB8IGhwcGEyLjBbbnddIHwgaHBwYTY0IFwKLQl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAotCXwgaXAyayB8IGlxMjAwMCBcCi0JfCBtMzJjIHwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIFwKLQl8IG1heHEgfCBtYiB8IG1pY3JvYmxhemUgfCBtY29yZSB8IG1lcCBcCi0JfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKLQl8IG1pcHMxNiBcCi0JfCBtaXBzNjQgfCBtaXBzNjRlbCBcCi0JfCBtaXBzNjR2ciB8IG1pcHM2NHZyZWwgXAotCXwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKLQl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKLQl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKLQl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKLQl8IG1pcHM2NHZyNTkwMCB8IG1pcHM2NHZyNTkwMGVsIFwKLQl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKLQl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCi0JfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCi0JfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAotCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAotCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKLQl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCi0JfCBtbjEwMjAwIHwgbW4xMDMwMCBcCi0JfCBtdCBcCi0JfCBtc3A0MzAgXAotCXwgbmlvcyB8IG5pb3MyIFwKLQl8IG5zMTZrIHwgbnMzMmsgXAotCXwgb3IzMiBcCi0JfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAotCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAotCXwgcHlyYW1pZCBcCi0JfCBzY29yZSBcCi0JfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAotCXwgc2g2NCB8IHNoNjRsZSBcCi0JfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCi0JfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAotCXwgc3B1IHwgc3Ryb25nYXJtIFwKLQl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCi0JfCB2ODUwIHwgdjg1MGUgXAotCXwgd2UzMmsgXAotCXwgeDg2IHwgeGMxNnggfCB4c2NhbGUgfCB4c2NhbGVlW2JsXSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCi0JfCB6OGspCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMikKLQkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQlvcz0tbm9uZQotCQk7OwotCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQotCQk7OwotCW1zMSkKLQkJYmFzaWNfbWFjaGluZT1tdC11bmtub3duCi0JCTs7Ci0KLQkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJwotCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAotCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KLQlpKjg2IHwgeDg2XzY0KQotCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYwotCSAgOzsKLQkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgotCSotKi0qKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KLQk1ODAtKiBcCi0JfCBhMjlrLSogXAotCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCi0JfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAotCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCi0JfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybWViLSogfCBhcm12Ki0qIFwKLQl8IGF2ci0qIHwgYXZyMzItKiBcCi0JfCBiZmluLSogfCBiczIwMDAtKiBcCi0JfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiB8IGM1NHgtKiB8IGM1NXgtKiB8IGM2eC0qIFwKLQl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCi0JfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCi0JfCBlbHhzaS0qIFwKLQl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKLQl8IGg4MzAwLSogfCBoODUwMC0qIFwKLQl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCi0JfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAotCXwgaXAyay0qIHwgaXEyMDAwLSogXAotCXwgbTMyYy0qIHwgbTMyci0qIHwgbTMycmxlLSogXAotCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKLQl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWF4cS0qIHwgbWNvcmUtKiBcCi0JfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCi0JfCBtaXBzMTYtKiBcCi0JfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAotCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCi0JfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKLQl8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCi0JfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAotCXwgbWlwczY0dnI1MDAwLSogfCBtaXBzNjR2cjUwMDBlbC0qIFwKLQl8IG1pcHM2NHZyNTkwMC0qIHwgbWlwczY0dnI1OTAwZWwtKiBcCi0JfCBtaXBzaXNhMzItKiB8IG1pcHNpc2EzMmVsLSogXAotCXwgbWlwc2lzYTMycjItKiB8IG1pcHNpc2EzMnIyZWwtKiBcCi0JfCBtaXBzaXNhNjQtKiB8IG1pcHNpc2E2NGVsLSogXAotCXwgbWlwc2lzYTY0cjItKiB8IG1pcHNpc2E2NHIyZWwtKiBcCi0JfCBtaXBzaXNhNjRzYjEtKiB8IG1pcHNpc2E2NHNiMWVsLSogXAotCXwgbWlwc2lzYTY0c3I3MWstKiB8IG1pcHNpc2E2NHNyNzFrZWwtKiBcCi0JfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKLQl8IG1taXgtKiBcCi0JfCBtdC0qIFwKLQl8IG1zcDQzMC0qIFwKLQl8IG5pb3MtKiB8IG5pb3MyLSogXAotCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCi0JfCBvcmlvbi0qIFwKLQl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAotCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogfCBwcGNiZS0qIFwKLQl8IHB5cmFtaWQtKiBcCi0JfCByb21wLSogfCByczYwMDAtKiBcCi0JfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzIzXWUtKiB8IHNoWzM0XWViLSogfCBzaGViLSogfCBzaGJlLSogXAotCXwgc2hsZS0qIHwgc2hbMTIzNF1sZS0qIHwgc2gzZWxlLSogfCBzaDY0LSogfCBzaDY0bGUtKiBcCi0JfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM2NGItKiB8IHNwYXJjNjR2LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiBcCi0JfCBzcGFyY2xpdGUtKiBcCi0JfCBzcGFyY3Y4LSogfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3BhcmN2OXYtKiB8IHN0cm9uZ2FybS0qIHwgc3YxLSogfCBzeD8tKiBcCi0JfCB0YWhvZS0qIHwgdGh1bWItKiBcCi0JfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiBcCi0JfCB0cm9uLSogXAotCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKLQl8IHdlMzJrLSogXAotCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCi0JfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYSotKiBcCi0JfCB5bXAtKiBcCi0JfCB6OGstKikKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLCB3aXRoIGdsb2IgbWF0Y2guCi0JeHRlbnNhKikKLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAotCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCi0JMzg2YnNkKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tYnNkCi0JCTs7Ci0JM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAotCQk7OwotCTNiKikKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlhMjlraGlmKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLSAgICAJYWJhY3VzKQotCQliYXNpY19tYWNoaW5lPWFiYWN1cy11bmtub3duCi0JCTs7Ci0JYWRvYmU2OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCi0JCW9zPS1zY291dAotCQk7OwotCWFsbGlhbnQgfCBmeDgwKQotCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAotCQk7OwotCWFsdG9zIHwgYWx0b3MzMDY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKLQkJOzsKLQlhbTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKLQkJb3M9LWJzZAotCQk7OwotCWFtZDY0KQotCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYwotCQk7OwotCWFtZDY0LSopCi0JCWJhc2ljX21hY2hpbmU9eDg2XzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JYW1kYWhsKQotCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKLQkJb3M9LXN5c3YKLQkJOzsKLQlhbWlnYSB8IGFtaWdhLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCTs7Ci0JYW1pZ2FvcyB8IGFtaWdhZG9zKQotCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgotCQlvcz0tYW1pZ2FvcwotCQk7OwotCWFtaWdhdW5peCB8IGFtaXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1zeXN2NAotCQk7OwotCWFwb2xsbzY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYXBvbGxvNjhic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LWJzZAotCQk7OwotCWF1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCW9zPS1hdXgKLQkJOzsKLQliYWxhbmNlKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKLQkJb3M9LWR5bml4Ci0JCTs7Ci0JYmxhY2tmaW4pCi0JCWJhc2ljX21hY2hpbmU9YmZpbi11bmtub3duCi0JCW9zPS1saW51eAotCQk7OwotCWJsYWNrZmluLSopCi0JCWJhc2ljX21hY2hpbmU9YmZpbi1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQlvcz0tbGludXgKLQkJOzsKLQljOTApCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCBqOTApCi0JCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyYXludikKLQkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQotCQlvcz0tdW5pY29zbXAKLQkJOzsKLQljcjE2KQotCQliYXNpY19tYWNoaW5lPWNyMTYtdW5rbm93bgotCQlvcz0tZWxmCi0JCTs7Ci0JY3JkcyB8IHVub3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCi0JCTs7Ci0JY3Jpc3YzMiB8IGNyaXN2MzItKiB8IGV0cmF4ZnMqKQotCQliYXNpY19tYWNoaW5lPWNyaXN2MzItYXhpcwotCQk7OwotCWNyaXMgfCBjcmlzLSogfCBldHJheCopCi0JCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCi0JCTs7Ci0JY3J4KQotCQliYXNpY19tYWNoaW5lPWNyeC11bmtub3duCi0JCW9zPS1lbGYKLQkJOzsKLQlkYTMwIHwgZGEzMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAotCQk7OwotCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKLQkJYmFzaWNfbWFjaGluZT1taXBzLWRlYwotCQk7OwotCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMxMAotCQk7OwotCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKLQkJb3M9LXRvcHMyMAotCQk7OwotCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCi0JICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQotCQk7OwotCWRlbHRhODgpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQotCQlvcz0tc3lzdjMKLQkJOzsKLQlkamdwcCkKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCi0JCW9zPS1tc2Rvc2RqZ3BwCi0JCTs7Ci0JZHB4MjAgfCBkcHgyMC0qKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCi0JCW9zPS1ib3N4Ci0JCTs7Ci0JZHB4MiogfCBkcHgyKi1idWxsKQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjMKLQkJOzsKLQllYm1vbjI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tZWJtb24KLQkJOzsKLQllbHhzaSkKLQkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQotCQlvcz0tYnNkCi0JCTs7Ci0JZW5jb3JlIHwgdW1heCB8IG1tYXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCi0JCTs7Ci0JZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQotCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCWZ4MjgwMCkKLQkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKLQkJOzsKLQlnZW5peCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1ucwotCQk7OwotCWdtaWNybykKLQkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybwotCQlvcz0tc3lzdgotCQk7OwotCWdvMzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tZ28zMgotCQk7OwotCWgzMDUwciogfCBoaXV4KikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQloODMwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloODMwMHhyYXkpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0teHJheQotCQk7OwotCWg4NTAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWhhcnJpcykKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tc3lzdjMKLQkJOzsKLQlocDMwMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDMwMGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ic2QKLQkJOzsKLQlocDMwMGhwdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0taHB1eAotCQk7OwotCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAotCQk7OwotCWhwOWszWzItOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHBwYS1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0JaHBwYW9zZikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1vc2YKLQkJOzsKLQlocHBybykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlpMzcwLWlibSogfCBpYm0qKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCTs7Ci0jIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KLQlpKjg2djMyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YzMgotCQk7OwotCWkqODZ2NCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjQKLQkJOzsKLQlpKjg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaSo4NnNvbDIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlpMzg2bWFjaCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKLQkJb3M9LW1hY2gKLQkJOzsKLQlpMzg2LXZzdGEgfCB2c3RhKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tdnN0YQotCQk7OwotCWlyaXMgfCBpcmlzNGQpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1pcml4KikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LWlyaXg0Ci0JCQk7OwotCQllc2FjCi0JCTs7Ci0JaXNpNjggfCBpc2kpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKLQkJb3M9LXN5c3YKLQkJOzsKLQltNjhrbm9tbXUpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1saW51eAotCQk7OwotCW02OGtub21tdS0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWluZ3czMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1taW5ndzMyCi0JCTs7Ci0JbWluZ3czMmNlKQotCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCi0JCW9zPS1taW5ndzMyY2UKLQkJOzsKLQltaW5pZnJhbWUpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKLQkJOzsKLQkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci0JbWlwczMqLSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCi0JCTs7Ci0JbWlwczMqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCi0JCTs7Ci0JbW9uaXRvcikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCW1vcnBob3MpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JCW9zPS1tb3JwaG9zCi0JCTs7Ci0JbXNkb3MpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tbXNkb3MKLQkJOzsKLQltczEtKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9tczEtL210LS8nYAotCQk7OwotCW12cykKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQlvcz0tbXZzCi0JCTs7Ci0JbmNyMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgotCQlvcz0tc3lzdjQKLQkJOzsKLQluZXRic2QzODYpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1uZXRic2QKLQkJOzsKLQluZXR3aW5kZXIpCi0JCWJhc2ljX21hY2hpbmU9YXJtdjRsLXJlYmVsCi0JCW9zPS1saW51eAotCQk7OwotCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzMTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmVjdjcwKQotCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQluZXh0IHwgbSotbmV4dCApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0Ci0JCWNhc2UgJG9zIGluCi0JCSAgICAtbmV4dHN0ZXAqICkKLQkJCTs7Ci0JCSAgICAtbnMyKikKLQkJICAgICAgb3M9LW5leHRzdGVwMgotCQkJOzsKLQkJICAgICopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDMKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQluaDMwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaFs0NV0wMDApCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaW5keTk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1uaW5keQotCQk7OwotCW1vbjk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1tb245NjAKLQkJOzsKLQlub25zdG9wdXgpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1jb21wYXEKLQkJb3M9LW5vbnN0b3B1eAotCQk7OwotCW5wMSkKLQkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKLQkJOzsKLQluc3ItdGFuZGVtKQotCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KLQkJOzsKLQlvcDUwbi0qIHwgb3A2MGMtKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0Jb3BlbnJpc2MgfCBvcGVucmlzYy0qKQotCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgotCQk7OwotCW9zNDAwKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCi0JCW9zPS1vczQwMAotCQk7OwotCU9TRTY4MDAwIHwgb3NlNjgwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlvczY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKLQkJb3M9LW9zNjhrCi0JCTs7Ci0JcGEtaGl0YWNoaSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQlwYXJhZ29uKQotCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKLQkJb3M9LW9zZgotCQk7OwotCXBhcmlzYykKLQkJYmFzaWNfbWFjaGluZT1ocHBhLXVua25vd24KLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JcGFyaXNjLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQlvcz0tbGludXgKLQkJOzsKLQlwYmQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCi0JCTs7Ci0JcGJiKQotCQliYXNpY19tYWNoaW5lPW02OGstdHRpCi0JCTs7Ci0JcGM1MzIgfCBwYzUzMi0qKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCi0JCTs7Ci0JcGM5OCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCTs7Ci0JcGM5OC0qKQotCQliYXNpY19tYWNoaW5lPWkzODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1wYwotCQk7OwotCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW00KQotCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKLQkJOzsKLQlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bTQtKikKLQkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcG4pCi0JCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKLQkJOzsKLQlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JCTs7Ci0JcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCi0JCTs7Ci0JcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgotCQk7OwotCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCi0JCTs7Ci0JcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwczIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KLQkJOzsKLQlwdzMyKQotCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgotCQlvcz0tcHczMgotCQk7OwotCXJkb3MpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tcmRvcwotCQk7OwotCXJvbTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCXJtWzQ2XTAwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwotCQk7OwotCXJ0cGMgfCBydHBjLSopCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlzMzkwIHwgczM5MC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCi0JCTs7Ci0JczM5MHggfCBzMzkweC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQotCQk7OwotCXNhMjkyMDApCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXNiMSkKLQkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgotCQk7OwotCXNiMWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KLQkJOzsKLQlzZGUpCi0JCWJhc2ljX21hY2hpbmU9bWlwc2lzYTMyLXNkZQotCQlvcz0tZWxmCi0JCTs7Ci0Jc2VpKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2VpCi0JCW9zPS1zZWl1eAotCQk7OwotCXNlcXVlbnQpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCTs7Ci0Jc2gpCi0JCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0Jc2g1ZWwpCi0JCWJhc2ljX21hY2hpbmU9c2g1bGUtdW5rbm93bgotCQk7OwotCXNoNjQpCi0JCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCi0JCTs7Ci0Jc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKLQkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jc3BzNykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YyCi0JCTs7Ci0Jc3B1cikKLQkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KLQkJOzsKLQlzdDIwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KLQkJOzsKLQlzdHJhdHVzKQotCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cwotCQlvcz0tc3lzdjQKLQkJOzsKLQlzdW4yKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJOzsKLQlzdW4yb3MzKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjJvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuM29zMykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuM29zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNG9zMykKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjRvczQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40c29sMikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0Jc3VuMyB8IHN1bjMtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQk7OwotCXN1bjQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0Jc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KLQkJOzsKLQlzdjEpCi0JCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXN5bW1ldHJ5KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQl0M2UpCi0JCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdDkwKQotCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0aWM1NHggfCBjNTR4KikKLQkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCXRpYzU1eCB8IGM1NXgqKQotCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JdGljNnggfCBjNngqKQotCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KLQkJb3M9LWNvZmYKLQkJOzsKLQl0aWxlKikKLQkJYmFzaWNfbWFjaGluZT10aWxlLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCXR4MzkpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgotCQk7OwotCXR4MzllbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KLQkJOzsKLQl0b2FkMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKLQkJb3M9LXRvcHMyMAotCQk7OwotCXRvd2VyIHwgdG93ZXItMzIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKLQkJOzsKLQl0cGYpCi0JCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCi0JCW9zPS10cGYKLQkJOzsKLQl1ZGkyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXVsdHJhMykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQotCQlvcz0tc3ltMQotCQk7OwotCXY4MTAgfCBuZWN2ODEwKQotCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCi0JCW9zPS1ub25lCi0JCTs7Ci0JdmF4dikKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0Jdm1zKQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXZtcwotCQk7OwotCXZwcCp8dnh8dngtKikKLQkJYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKLQkJOzsKLQl2eHdvcmtzOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczY4KQotCQliYXNpY19tYWNoaW5lPW02OGstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXc2NSopCi0JCWJhc2ljX21hY2hpbmU9dzY1LXdkYwotCQlvcz0tbm9uZQotCQk7OwotCXc4OWstKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJb3M9LXByb2VsZgotCQk7OwotCXhib3gpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQlvcz0tbWluZ3czMgotCQk7OwotCXhwcyB8IHhwczEwMCkKLQkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCi0JCTs7Ci0JeW1wKQotCQliYXNpY19tYWNoaW5lPXltcC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl6OGstKi1jb2ZmKQotCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCi0JCW9zPS1zaW0KLQkJOzsKLQlub25lKQotCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQotCQlvcz0tbm9uZQotCQk7OwotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCi0jIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCi0Jdzg5aykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJOzsKLQlvcDUwbikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCW9wNjBjKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jcm9tcCkKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCW1taXgpCi0JCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAotCQk7OwotCXJzNjAwMCkKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCi0JCTs7Ci0JdmF4KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJOzsKLQlwZHAxMCkKLQkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAotCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KLQkJOzsKLQlwZHAxMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKLQkJOzsKLQl3ZTMyaykKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFszNF1lYiB8IHNoWzEyMzRdbGUgfCBzaFsyM11lbGUpCi0JCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgotCQk7OwotCXNwYXJjIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCWN5ZHJhKQotCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKLQkJOzsKLQlvcmlvbikKLQkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKLQkJOzsKLQlvcmlvbjEwNSkKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAotCQk7OwotCW1hYyB8IG1wdyB8IG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQk7OwotCXBtYWMgfCBwbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCi0JCTs7Ci0JKi11bmtub3duKQotCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgotCQk7OwotCSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLQotIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1kaWdpdGFsKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCi0JCTs7Ci0JKi1jb21tb2RvcmUqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAotCQk7OwotCSopCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1pZiBbIHgiJG9zIiAhPSB4IiIgXQotdGhlbgotY2FzZSAkb3MgaW4KLSAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKLSAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KLQkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KLQktc29sYXJpczEgfCAtc29sYXJpczEuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAotCQk7OwotCS1zb2xhcmlzKQotCQlvcz0tc29sYXJpczIKLQkJOzsKLQktc3ZyNCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS11bml4d2FyZSopCi0JCW9zPS1zeXN2NC4ydXcKLQkJOzsKLQktZ251L2xpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgotCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCi0JIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCi0JLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAotCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCi0JICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKLQkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKLQkgICAgICB8IC1hb3MqIFwKLQkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAotCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAotCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIFwKLQkgICAgICB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAotCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAotCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKLQkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCi0JICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCi0JICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogXAotCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKLQkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtdWNsaWJjKiBcCi0JICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAotCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCi0JICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCi0JICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCi0JICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAotCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAotCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KiBcCi0JICAgICAgfCAtc2t5b3MqIHwgLWhhaWt1KiB8IC1yZG9zKiB8IC10b3BwZXJzKiB8IC1kcm9wcyopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1xbngqKQotCQljYXNlICRiYXNpY19tYWNoaW5lIGluCi0JCSAgICB4ODYtKiB8IGkqODYtKikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LW50byRvcwotCQkJOzsKLQkJZXNhYwotCQk7OwotCS1udG8tcW54KikKLQkJOzsKLQktbnRvKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCi0JCTs7Ci0JLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAotCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKLQkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQotCQk7OwotCS1tYWMqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCi0JCTs7Ci0JLWxpbnV4LWRpZXRsaWJjKQotCQlvcz0tbGludXgtZGlldGxpYmMKLQkJOzsKLQktbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JLXN1bm9zNSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKLQkJOzsKLQktc3Vub3M2KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAotCQk7OwotCS1vcGVuZWQqKQotCQlvcz0tb3BlbmVkaXRpb24KLQkJOzsKLSAgICAgICAgLW9zNDAwKikKLQkJb3M9LW9zNDAwCi0JCTs7Ci0JLXdpbmNlKikKLQkJb3M9LXdpbmNlCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS1hdGhlb3MqKQotCQlvcz0tYXRoZW9zCi0JCTs7Ci0JLXN5bGxhYmxlKikKLQkJb3M9LXN5bGxhYmxlCi0JCTs7Ci0JLTM4NmJzZCkKLQkJb3M9LWJzZAotCQk7OwotCS1jdGl4KiB8IC11dHMqKQotCQlvcz0tc3lzdgotCQk7OwotCS1ub3ZhKikKLQkJb3M9LXJ0bWstbm92YQotCQk7OwotCS1uczIgKQotCQlvcz0tbmV4dHN0ZXAyCi0JCTs7Ci0JLW5zayopCi0JCW9zPS1uc2sKLQkJOzsKLQkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCi0JLXNpbml4NS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAotCQk7OwotCS1zaW5peCopCi0JCW9zPS1zeXN2NAotCQk7OwotICAgICAgICAtdHBmKikKLQkJb3M9LXRwZgotCQk7OwotCS10cml0b24qKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktb3NzKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCS1zdnIzKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3lzdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCi0JLXN5c3YqKQotCQk7OwotCS1vc2UqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLWVzMTgwMCopCi0JCW9zPS1vc2UKLQkJOzsKLQkteGVuaXgpCi0JCW9zPS14ZW5peAotCQk7OwotCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JLWFyb3MqKQotCQlvcz0tYXJvcwotCQk7OwotCS1rYW9zKikKLQkJb3M9LWthb3MKLQkJOzsKLQktenZtb2UpCi0JCW9zPS16dm1vZQotCQk7OwotCS1ub25lKQotCQk7OwotCSopCi0JCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgotCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi1lbHNlCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KLSMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCi0jIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKLSMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKLSMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQotIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCi0jIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgotCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0gICAgICAgIHNjb3JlLSopCi0JCW9zPS1lbGYKLQkJOzsKLSAgICAgICAgc3B1LSopCi0JCW9zPS1lbGYKLQkJOzsKLQkqLWFjb3JuKQotCQlvcz0tcmlzY2l4MS4yCi0JCTs7Ci0JYXJtKi1yZWJlbCkKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JYXJtKi1zZW1pKQotCQlvcz0tYW91dAotCQk7OwotICAgICAgICBjNHgtKiB8IHRpYzR4LSopCi0gICAgICAgIAlvcz0tY29mZgotCQk7OwotCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KLQlwZHAxMC0qKQotCQlvcz0tdG9wczIwCi0JCTs7Ci0JcGRwMTEtKikKLQkJb3M9LW5vbmUKLQkJOzsKLQkqLWRlYyB8IHZheC0qKQotCQlvcz0tdWx0cml4NC4yCi0JCTs7Ci0JbTY4Ki1hcG9sbG8pCi0JCW9zPS1kb21haW4KLQkJOzsKLQlpMzg2LXN1bikKLQkJb3M9LXN1bm9zNC4wLjIKLQkJOzsKLQltNjgwMDAtc3VuKQotCQlvcz0tc3Vub3MzCi0JCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQotCQkjIGRlZmF1bHQuCi0JCSMgb3M9LXN1bm9zNAotCQk7OwotCW02OCotY2lzY28pCi0JCW9zPS1hb3V0Ci0JCTs7Ci0gICAgICAgIG1lcC0qKQotCQlvcz0tZWxmCi0JCTs7Ci0JbWlwcyotY2lzY28pCi0JCW9zPS1lbGYKLQkJOzsKLQltaXBzKi0qKQotCQlvcz0tZWxmCi0JCTs7Ci0Jb3IzMi0qKQotCQlvcz0tY29mZgotCQk7OwotCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCi0JCW9zPS1zeXN2MwotCQk7OwotCXNwYXJjLSogfCAqLXN1bikKLQkJb3M9LXN1bm9zNC4xLjEKLQkJOzsKLQkqLWJlKQotCQlvcz0tYmVvcwotCQk7OwotCSotaGFpa3UpCi0JCW9zPS1oYWlrdQotCQk7OwotCSotaWJtKQotCQlvcz0tYWl4Ci0JCTs7Ci0gICAgCSota251dGgpCi0JCW9zPS1tbWl4d2FyZQotCQk7OwotCSotd2VjKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi13aW5ib25kKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1va2kpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLWhwKQotCQlvcz0taHB1eAotCQk7OwotCSotaGl0YWNoaSkKLQkJb3M9LWhpdXgKLQkJOzsKLQlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1jYm0pCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JKi1kZykKLQkJb3M9LWRndXgKLQkJOzsKLQkqLWRvbHBoaW4pCi0JCW9zPS1zeXN2MwotCQk7OwotCW02OGstY2N1cikKLQkJb3M9LXJ0dQotCQk7OwotCW04OGstb21yb24qKQotCQlvcz0tbHVuYQotCQk7OwotCSotbmV4dCApCi0JCW9zPS1uZXh0c3RlcAotCQk7OwotCSotc2VxdWVudCkKLQkJb3M9LXB0eAotCQk7OwotCSotY3JkcykKLQkJb3M9LXVub3MKLQkJOzsKLQkqLW5zKQotCQlvcz0tZ2VuaXgKLQkJOzsKLQlpMzcwLSopCi0JCW9zPS1tdnMKLQkJOzsKLQkqLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLQkqLWdvdWxkKQotCQlvcz0tc3lzdgotCQk7OwotCSotaGlnaGxldmVsKQotCQlvcz0tYnNkCi0JCTs7Ci0JKi1lbmNvcmUpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLXNnaSkKLQkJb3M9LWlyaXgKLQkJOzsKLQkqLXNpZW1lbnMpCi0JCW9zPS1zeXN2NAotCQk7OwotCSotbWFzc2NvbXApCi0JCW9zPS1ydHUKLQkJOzsKLQlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCi0JCW9zPS11eHB2Ci0JCTs7Ci0JKi1yb202OGspCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi0qYnVnKQotCQlvcz0tY29mZgotCQk7OwotCSotYXBwbGUpCi0JCW9zPS1tYWNvcwotCQk7OwotCSotYXRhcmkqKQotCQlvcz0tbWludAotCQk7OwotCSopCi0JCW9zPS1ub25lCi0JCTs7Ci1lc2FjCi1maQotCi0jIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQotIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KLXZlbmRvcj11bmtub3duCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi11bmtub3duKQotCQljYXNlICRvcyBpbgotCQkJLXJpc2NpeCopCi0JCQkJdmVuZG9yPWFjb3JuCi0JCQkJOzsKLQkJCS1zdW5vcyopCi0JCQkJdmVuZG9yPXN1bgotCQkJCTs7Ci0JCQktYWl4KikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1iZW9zKikKLQkJCQl2ZW5kb3I9YmUKLQkJCQk7OwotCQkJLWhwdXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktbXBlaXgqKQotCQkJCXZlbmRvcj1ocAotCQkJCTs7Ci0JCQktaGl1eCopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLXVub3MqKQotCQkJCXZlbmRvcj1jcmRzCi0JCQkJOzsKLQkJCS1kZ3V4KikKLQkJCQl2ZW5kb3I9ZGcKLQkJCQk7OwotCQkJLWx1bmEqKQotCQkJCXZlbmRvcj1vbXJvbgotCQkJCTs7Ci0JCQktZ2VuaXgqKQotCQkJCXZlbmRvcj1ucwotCQkJCTs7Ci0JCQktbXZzKiB8IC1vcGVuZWQqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLW9zNDAwKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1wdHgqKQotCQkJCXZlbmRvcj1zZXF1ZW50Ci0JCQkJOzsKLQkJCS10cGYqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKLQkJCQl2ZW5kb3I9d3JzCi0JCQkJOzsKLQkJCS1hdXgqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktaG1zKikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktbXB3KiB8IC1tYWNvcyopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCi0JCQkJdmVuZG9yPWF0YXJpCi0JCQkJOzsKLQkJCS12b3MqKQotCQkJCXZlbmRvcj1zdHJhdHVzCi0JCQkJOzsKLQkJZXNhYwotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAotCQk7OwotZXNhYwotCi1lY2hvICRiYXNpY19tYWNoaW5lJG9zCi1leGl0Ci0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgotIyB0aW1lLXN0YW1wLWVuZDogIiciCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbmZpZ3VyZSBiL2xpYnMvbGlicG5nL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEzNzMxOS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb25maWd1cmUuYWMgYi9saWJzL2xpYnBuZy9jb25maWd1cmUuYWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZGIyZGQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29uZmlndXJlLmFjCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLSMgY29uZmlndXJlLmFjCi0KLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi1kbmwgTWlub3IgdXBncmFkZXMgKGNvbXBhdGlibGUgQUJJKTogaW5jcmVtZW50IHRoZSBwYWNrYWdlIHZlcnNpb24KLWRubCAodGhpcmQgZmllbGQgaW4gdHdvIHBsYWNlcyBiZWxvdykgYW5kIHNldCB0aGUgUE5HTElCX1JFTEVBU0UKLWRubCB2YXJpYWJsZS4KLWRubAotZG5sIE1ham9yIHVwZ3JhZGVzIChpbmNvbXBhdGlibGUgQUJJKTogaW5jcmVtZW50IHRoZSBwYWNrYWdlIG1ham9yCi1kbmwgdmVyc2lvbiAoc2Vjb25kIGZpZWxkLCBvciBmaXJzdCBpZiBkZXNpcmVkKSwgc2V0IHRoZSBtaW5vcgotZG5sIHRvIDAsIHNldCBQTkdMSUJfTUFKT1IgYmVsb3cgKmFuZCogZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4KLWRubCBNYWtlZmlsZS5hbSB0byB1cGdyYWRlIHRoZSBwYWNrYWdlIG5hbWUuCi0KLWRubCBUaGlzIGlzIGhlcmUgdG8gcHJldmVudCBlYXJsaWVyIGF1dG9jb25mIGZyb20gYmVpbmcgdXNlZCwgaXQKLWRubCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0byByZWdlbmVyYXRlIGNvbmZpZ3VyZSBpZiB0aGUgdGltZQotZG5sIHN0YW1wcyBhcmUgY29ycmVjdAotQUNfUFJFUkVRKDIuNTkpCi0KLWRubCBWZXJzaW9uIG51bWJlciBzdHVmZiBoZXJlOgotCi1BQ19JTklUKFtsaWJwbmddLCBbMS4yLjM3XSwgW3BuZy1tbmctaW1wbGVtZW50QGxpc3RzLnNvdXJjZWZvcmdlLm5ldF0pCi1BTV9JTklUX0FVVE9NQUtFCi1kbmwgc3RvcCBjb25maWd1cmUgZnJvbSBhdXRvbWFnaWNhbGx5IHJ1bm5pbmcgYXV0b21ha2UKLUFNX01BSU5UQUlORVJfTU9ERQotCi1QTkdMSUJfVkVSU0lPTj0xLjIuMzcKLVBOR0xJQl9NQUpPUj0xCi1QTkdMSUJfTUlOT1I9MgotUE5HTElCX1JFTEVBU0U9MzcKLQotZG5sIEVuZCBvZiB2ZXJzaW9uIG51bWJlciBzdHVmZgotCi1BQ19DT05GSUdfU1JDRElSKFtwbmdnZXQuY10pCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oKQotCi0jIENoZWNrcyBmb3IgcHJvZ3JhbXMuCi1BQ19QUk9HX0NDCi1BQ19QUk9HX0xECi1BQ19QUk9HX0NQUAotQUNfQ0hFQ0tfVE9PTChTRUQsIHNlZCwgOikKLUFDX0xJQlRPT0xfV0lOMzJfRExMCi1BQ19QUk9HX0lOU1RBTEwKLUFDX1BST0dfTE5fUwotQUNfUFJPR19NQUtFX1NFVAotQUNfUFJPR19MSUJUT09MCi0KLSMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCi1BQ19IRUFERVJfU1REQwotQUNfQ0hFQ0tfSEVBREVSUyhbbWFsbG9jLmggc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oXSkKLQotIyBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgotQUNfQ19DT05TVAotQUNfVFlQRV9TSVpFX1QKLUFDX1NUUlVDVF9UTQotCi0jIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCi1BQ19GVU5DX1NUUlRPRAotQUNfQ0hFQ0tfRlVOQ1MoW21lbXNldF0sICwgQUNfRVJST1IoW21lbXNldCBub3QgZm91bmQgaW4gbGliY10pKQotQUNfQ0hFQ0tfRlVOQ1MoW3Bvd10sICwgQUNfQ0hFQ0tfTElCKG0sIHBvdywgLCBBQ19FUlJPUihbY2Fubm90IGZpbmQgcG93XSkpICkKLUFDX0NIRUNLX0xJQih6LCB6bGliVmVyc2lvbiwgLCBBQ19FUlJPUihbemxpYiBub3QgaW5zdGFsbGVkXSkpCi0KLUxJQlBOR19ERUZJTkVTPS1EUE5HX0NPTkZJR1VSRV9MSUJQTkcKLUFDX01TR19DSEVDS0lORygKLSAgW2lmIGFzc2VtYmxlciBjb2RlIGluIHBuZ2djY3JkLmMgY2FuIGJlIGNvbXBpbGVkIHdpdGhvdXQgUE5HX05PX01NWF9DT0RFXSkKLUFDX1RSWV9DT01QSUxFKAotICBbI2luY2x1ZGUgIiRzcmNkaXIvcG5nZ2NjcmQuYyJdLAotICBbcmV0dXJuIDA7XSwKLSAgQUNfTVNHX1JFU1VMVCh5ZXMpCi0gIExJQlBOR19OT19NTVg9IiIsCi0gIEFDX01TR19SRVNVTFQobm8pCi0gIExJQlBOR19OT19NTVg9LURQTkdfTk9fTU1YX0NPREUpCi1MSUJQTkdfREVGSU5FUz0kTElCUE5HX0RFRklORVNcICRMSUJQTkdfTk9fTU1YCi1BQ19TVUJTVChMSUJQTkdfREVGSU5FUykKLUFDX1NVQlNUKExJQlBOR19OT19NTVgpCi0KLUFDX01TR19DSEVDS0lORyhbaWYgbGlicmFyaWVzIGNhbiBiZSB2ZXJzaW9uZWRdKQotR0xEPWAkTEQgLS1oZWxwIDwgL2Rldi9udWxsIDI+L2Rldi9udWxsIHwgZ3JlcCB2ZXJzaW9uLXNjcmlwdGAKLWlmIHRlc3QgIiRHTEQiOyB0aGVuCi0gICAgaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdD15ZXMKLSAgICBBQ19NU0dfUkVTVUxUKHllcykKLWVsc2UKLSAgICBoYXZlX2xkX3ZlcnNpb25fc2NyaXB0PW5vCi0gICAgQUNfTVNHX1JFU1VMVChubykKLSAgICBBQ19NU0dfV0FSTigqKiogWW91IGhhdmUgbm90IGVuYWJsZWQgdmVyc2lvbmVkIHN5bWJvbHMuKQotZmkKLUFNX0NPTkRJVElPTkFMKEhBVkVfTERfVkVSU0lPTl9TQ1JJUFQsIHRlc3QgIiRoYXZlX2xkX3ZlcnNpb25fc2NyaXB0IiA9ICJ5ZXMiKQotCi1pZiB0ZXN0ICIkaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdCIgPSAieWVzIjsgdGhlbgotICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHN5bWJvbCBwcmVmaXhdKQotICAgIFNZTUJPTF9QUkVGSVg9YGVjaG8gIlBSRUZJWD1fX1VTRVJfTEFCRUxfUFJFRklYX18iIFwKLSAgICAgICAgICAgICAgICAgICB8ICR7Q1BQLSR7Q0MtZ2NjfSAtRX0gLSAyPiYxIFwKLSAgICAgICAgICAgICAgICAgICB8ICR7RUdSRVAtZ3JlcH0gIl5QUkVGSVg9IiBcCi0gICAgICAgICAgICAgICAgICAgfCAke1NFRC1zZWR9ICJzOl5QUkVGSVg9OjoiYAotICAgIEFDX1NVQlNUKFNZTUJPTF9QUkVGSVgpCi0gICAgQUNfTVNHX1JFU1VMVCgkU1lNQk9MX1BSRUZJWCkKLWZpCi0KLSMgU3Vic3RpdHV0aW9ucyBmb3IgLmluIGZpbGVzCi1BQ19TVUJTVChQTkdMSUJfVkVSU0lPTikKLUFDX1NVQlNUKFBOR0xJQl9NQUpPUikKLUFDX1NVQlNUKFBOR0xJQl9NSU5PUikKLUFDX1NVQlNUKFBOR0xJQl9SRUxFQVNFKQotCi0jIEFkZGl0aW9uYWwgYXJndW1lbnRzIChhbmQgc3Vic3RpdHV0aW9ucykKLSMgQWxsb3cgdGhlIHBrZy1jb25maWcgZGlyZWN0b3J5IHRvIGJlIHNldAotQUNfQVJHX1dJVEgocGtnY29uZmlnZGlyLAotCUFDX0hFTFBfU1RSSU5HKFstLXdpdGgtcGtnY29uZmlnZGlyXSwKLQlbVXNlIHRoZSBzcGVjaWZpZWQgcGtnY29uZmlnIGRpciAoZGVmYXVsdCBpcyBsaWJkaXIvcGtnY29uZmlnKV0pLAotCVtwa2djb25maWdkaXI9JHt3aXRodmFsfV0sCi0JW3BrZ2NvbmZpZ2Rpcj0nJHtsaWJkaXJ9L3BrZ2NvbmZpZyddKQotCi1BQ19TVUJTVChbcGtnY29uZmlnZGlyXSkKLUFDX01TR19OT1RJQ0UoW3BrZ2NvbmZpZyBkaXJlY3RvcnkgaXMgJHtwa2djb25maWdkaXJ9XSkKLQotIyBNYWtlIHRoZSAqLWNvbmZpZyBiaW5hcnkgY29uZmlnIHNjcmlwdHMgb3B0aW9uYWwKLUFDX0FSR19XSVRIKGJpbmNvbmZpZ3MsCi0JQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1iaW5jb25maWdzXSwKLQkJW0dlbmVyYXRlIHNoZWxsIGxpYnBuZy1jb25maWcgc2NyaXB0cyBhcyB3ZWxsIGFzIHBrZy1jb25maWcgZGF0YV0KLQkJW0A8OkBkZWZhdWx0PXllc0A6PkBdKSwKLQlbaWYgdGVzdCAiJHt3aXRodmFsfSIgPSBubzsgdGhlbgotCQliaW5jb25maWdzPQotCQlBQ19NU0dfTk9USUNFKFtsaWJwbmctY29uZmlnIHNjcmlwdHMgd2lsbCBub3QgYmUgYnVpbHRdKQotCWVsc2UKLQkJYmluY29uZmlncz0nJHtiaW5jb25maWdzfScKLQlmaV0sCi0JW2JpbmNvbmZpZ3M9JyR7YmluY29uZmlnc30nXSkKLUFDX1NVQlNUKFtiaW5jb25maWdzXSkKLQotIyBBbGxvdyB0aGUgb2xkIHZlcnNpb24gbnVtYmVyIGxpYnJhcnksIGxpYnBuZy5zbywgdG8gYmUgcmVtb3ZlZCBmcm9tCi0jIHRoZSBidWlsZAotQUNfQVJHX1dJVEgobGlicG5nLWNvbXBhdCwKLQlBQ19IRUxQX1NUUklORyhbLS13aXRoLWxpYnBuZy1jb21wYXRdLAotCQlbR2VuZXJhdGUgdGhlIG9ic29sZXRlIGxpYnBuZy5zbyBsaWJyYXJ5IEA8OkBkZWZhdWx0PXllc0A6PkBdKSwKLQlbaWYgdGVzdCAiJHt3aXRodmFsfSIgPSBubzsgdGhlbgotCQljb21wYXRsaWI9Ci0JCUFDX01TR19OT1RJQ0UoW2xpYnBuZy5zbyB3aWxsIG5vdCBiZSBidWlsdF0pCi0JZWxzZQotCQljb21wYXRsaWI9bGlicG5nLmxhCi0JZmldLAotCVtjb21wYXRsaWI9bGlicG5nLmxhXSkKLUFDX1NVQlNUKFtjb21wYXRsaWJdKQotCi0jIENvbmZpZyBmaWxlcywgc3Vic3RpdHV0aW5nIGFzIGFib3ZlCi1BQ19DT05GSUdfRklMRVMoW01ha2VmaWxlIGxpYnBuZy5wYzpzY3JpcHRzL2xpYnBuZy5wYy1jb25maWd1cmUuaW5dKQotQUNfQ09ORklHX0ZJTEVTKFtsaWJwbmctY29uZmlnOnNjcmlwdHMvbGlicG5nLWNvbmZpZy5pbl0sCi0JCVtjaG1vZCAreCBsaWJwbmctY29uZmlnXSkKLQotQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL0NPUFlJTkcgYi9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGMzMWEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotDAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyICBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9MSUNFTlNFIGIvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTU2NzE3Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS5taW5ndzMyIGIvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS5taW5ndzMyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzBhNTlhLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUubWluZ3czMgorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0jIFNhbXBsZSBtYWtlZmlsZSBmb3IgcnBuZy13aW4gLyBycG5nMi13aW4gLyB3cG5nIHVzaW5nIG1pbmd3MzItZ2NjIGFuZCBtYWtlLgotIyBHcmVnIFJvZWxvZnMKLSMgTGFzdCBtb2RpZmllZDogIDIgSnVuZSAyMDA3Ci0jCi0jCVRoZSBwcm9ncmFtcyBidWlsdCBieSB0aGlzIG1ha2VmaWxlIGFyZSBkZXNjcmliZWQgaW4gdGhlIGJvb2ssCi0jCSJQTkc6ICBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiIGJ5IEdyZWcgUm9lbG9mcyAoTydSZWlsbHkgYW5kCi0jCUFzc29jaWF0ZXMsIDE5OTkpLiAgR28gYnV5IGEgY29weSwgZWg/ICBXZWxsLCBPSywgaXQncyBub3QKLSMJZ2VuZXJhbGx5IGZvciBzYWxlIGFueW1vcmUsIGJ1dCBpdCdzIHRoZSB0aG91Z2h0IHRoYXQgY291bnRzLAotIwlyaWdodD8gIChIaW50OiAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvYm9vay8gKQotIwotIyBJbnZva2UgdGhpcyBtYWtlZmlsZSBmcm9tIGEgRE9TLXByb21wdCB3aW5kb3cgdmlhOgotIwotIwltYWtlIC1mIE1ha2VmaWxlLm1pbmd3MzIKLSMKLSMgVGhpcyBtYWtlZmlsZSBhc3N1bWVzIGxpYnBuZyBhbmQgemxpYiBoYXZlIGFscmVhZHkgYmVlbiBidWlsdCBvciBkb3dubG9hZGVkCi0jIGFuZCBhcmUgaW4gc3ViZGlyZWN0b3JpZXMgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIGN1cnJlbnQgc3ViZGlyZWN0b3J5Ci0jIChhcyBpbmRpY2F0ZWQgYnkgdGhlIFBOR0RJUiBhbmQgWkRJUiBtYWNyb3MgYmVsb3cpLiAgSXQgbWFrZXMgbm8gYXNzdW1wdGlvbnMKLSMgYXQgYWxsIGFib3V0IHRoZSBtaW5ndzMyIGluc3RhbGxhdGlvbiB0cmVlIChXMzJESVIpLiAgRWRpdCBhcyBhcHByb3ByaWF0ZS4KLSMKLSMgTm90ZSB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgZHluYW1pYyBhbmQgc3RhdGljIGxpYnBuZyBhbmQgemxpYiBsaWJyYXJpZXMKLSMgdXNlZCBiZWxvdyBtYXkgY2hhbmdlIGluIGxhdGVyIHJlbGVhc2VzIG9mIHRoZSBsaWJyYXJpZXMuICBUaGlzIG1ha2VmaWxlCi0jIGJ1aWxkcyBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcyBieSBkZWZhdWx0LgotIyAoWW91IG5lZWQgb25seSBvbmUgc2V0LCBidXQgZm9yIHRlc3RpbmcgaXQgY2FuIGJlIGhhbmR5IHRvIGhhdmUgYm90aC4pCi0KLQotIyBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI1BOR0RJUiA9IC4uLy4uIwkJZm9yIGxpYnBuZy14Lnkuei9jb250cmliL2dyZWdib29rIGJ1aWxkcwotUE5HRElSID0gLi4vbGlicG5nLXdpbjMyCi1QTkdJTkMgPSAtSSQoUE5HRElSKQotUE5HTElCZCA9ICQoUE5HRElSKS9saWJwbmcuZGxsLmEJIyBkeW5hbWljYWxseSBsaW5rZWQKLVBOR0xJQnMgPSAkKFBOR0RJUikvbGlicG5nLmEJCSMgc3RhdGljYWxseSBsaW5rZWQsIGxvY2FsIGxpYnBuZwotCi0jWkRJUiA9IC4uLy4uLy4uL3psaWItd2luMzIjCWZvciBsaWJwbmcteC55LnovY29udHJpYi9ncmVnYm9vayBidWlsZHMKLVpESVIgPSAuLi96bGliLXdpbjMyCi1aSU5DID0gLUkkKFpESVIpCi1aTElCZCA9ICQoWkRJUikvbGliemRsbC5hCi1aTElCcyA9ICQoWkRJUikvbGliei5hCi0KLSMgY2hhbmdlIHRoaXMgdG8gYmUgdGhlIHBhdGggd2hlcmUgbWluZ3czMiBpbnN0YWxscyBpdHMgc3R1ZmY6Ci1XMzJESVIgPQotI1czMkRJUiA9IC91c3IvbG9jYWwvY3Jvc3MtdG9vbHMvaTM4Ni1taW5ndzMybXN2YwotVzMySU5DID0gLUkkKFczMkRJUikvaW5jbHVkZQotVzMyTElCID0gJChXMzJESVIpL2xpYi9saWJ1c2VyMzIuYSAkKFczMkRJUikvbGliL2xpYmdkaTMyLmEKLQotQ0MgPSBnY2MKLSNDQyA9IGkzODYtbWluZ3czMm1zdmMtZ2NjICMJZS5nLiwgTGludXggLT4gV2luMzIgY3Jvc3MtY29tcGlsYXRpb24KLUxEID0gJChDQykKLVJNID0gcm0gLWYKLUNGTEFHUyA9IC1PIC1XYWxsICQoSU5DUykgJChNSU5HV19DQ0ZMQUdTKQotIyBbbm90ZSB0aGF0IC1XYWxsIGlzIGEgZ2NjLXNwZWNpZmljIGNvbXBpbGF0aW9uIGZsYWcgKCJtb3N0IHdhcm5pbmdzIG9uIildCi0jIFstYW5zaSwgLXBlZGFudGljIGFuZCAtVyBjYW4gYWxzbyBiZSB1c2VkXQotTERGTEFHUyA9ICQoTUlOR1dfTERGTEFHUykKLU8gPSAubwotRSA9IC5leGUKLQotSU5DUyA9ICQoUE5HSU5DKSAkKFpJTkMpICQoVzMySU5DKQotUkxJQlNkID0gJChQTkdMSUJkKSAkKFpMSUJkKSAkKFczMkxJQikgLWxtCi1STElCU3MgPSAkKFBOR0xJQnMpICQoWkxJQnMpICQoVzMyTElCKSAtbG0KLVdMSUJTZCA9ICQoUE5HTElCZCkgJChaTElCZCkKLVdMSUJTcyA9ICQoUE5HTElCcykgJChaTElCcykKLQotUlBORyAgID0gcnBuZy13aW4KLVJQTkcyICA9IHJwbmcyLXdpbgotV1BORyAgID0gd3BuZwotCi1ST0JKU2QgID0gJChSUE5HKSQoTykgcmVhZHBuZy5waWMkKE8pCi1ST0JKUzJkID0gJChSUE5HMikkKE8pIHJlYWRwbmcyLnBpYyQoTykKLVdPQkpTZCAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZy5waWMkKE8pCi0KLVJQTkdzICA9ICQoUlBORyktc3RhdGljCi1SUE5HMnMgPSAkKFJQTkcyKS1zdGF0aWMKLVdQTkdzICA9ICQoV1BORyktc3RhdGljCi0KLVJPQkpTcyAgPSAkKFJQTkcpJChPKSByZWFkcG5nJChPKQotUk9CSlMycyA9ICQoUlBORzIpJChPKSByZWFkcG5nMiQoTykKLVdPQkpTcyAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZyQoTykKLQotU1RBVElDX0VYRVMgID0gJChSUE5HcykkKEUpICQoUlBORzJzKSQoRSkgJChXUE5HcykkKEUpCi1EWU5BTUlDX0VYRVMgPSAkKFJQTkcpJChFKSAkKFJQTkcyKSQoRSkgJChXUE5HKSQoRSkKLQotRVhFUyA9ICQoU1RBVElDX0VYRVMpICQoRFlOQU1JQ19FWEVTKQotCi0KLSMgaW1wbGljaXQgbWFrZSBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5jJChPKToKLQkkKENDKSAtYyAkKENGTEFHUykgJDwKLQotJS5waWMkKE8pOiAlLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLURQTkdfQlVJTERfRExMIC1vICRAICQ8Ci0KLQotIyBkZXBlbmRlbmNpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYWxsOiAgJChFWEVTKQotCi0kKFJQTkdzKSQoRSk6ICQoUk9CSlNzKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKU3MpICQoUkxJQlNzKQotCi0kKFJQTkcpJChFKTogJChST0JKU2QpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKFJPQkpTZCkgJChSTElCU2QpCi0KLSQoUlBORzJzKSQoRSk6ICQoUk9CSlMycykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMycykgJChSTElCU3MpCi0KLSQoUlBORzIpJChFKTogJChST0JKUzJkKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUzJkKSAkKFJMSUJTZCkKLQotJChXUE5HcykkKEUpOiAkKFdPQkpTcykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoV09CSlNzKSAkKFdMSUJTcykKLQotJChXUE5HKSQoRSk6ICQoV09CSlNkKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKU2QpICQoV0xJQlNkKQotCi0kKFJQTkcpJChPKToJJChSUE5HKS5jIHJlYWRwbmcuaAotJChSUE5HMikkKE8pOgkkKFJQTkcyKS5jIHJlYWRwbmcyLmgKLSQoV1BORykkKE8pOgkkKFdQTkcpLmMgd3JpdGVwbmcuaAotCi1yZWFkcG5nJChPKSByZWFkcG5nLnBpYyQoTyk6CXJlYWRwbmcuYyByZWFkcG5nLmgKLXJlYWRwbmcyJChPKSByZWFkcG5nMi5waWMkKE8pOglyZWFkcG5nMi5jIHJlYWRwbmcyLmgKLXdyaXRlcG5nJChPKSB3cml0ZXBuZy5waWMkKE8pOgl3cml0ZXBuZy5jIHdyaXRlcG5nLmgKLQotCi0jIG1haW50ZW5hbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGVhbjoKLQkkKFJNKSAkKEVYRVMpCi0JJChSTSkgJChST0JKU3MpICQoUk9CSlMycykgJChXT0JKU3MpCi0JJChSTSkgJChST0JKU2QpICQoUk9CSlMyZCkgJChXT0JKU2QpCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnNnaSBiL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUuc2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2NhNmNlLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUuc2dpCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLSMgU2FtcGxlIG1ha2VmaWxlIGZvciBycG5nLXggLyBycG5nMi14IC8gd3BuZyBmb3IgU0dJIHVzaW5nIGNjIGFuZCBtYWtlLgotIyBHcmVnIFJvZWxvZnMKLSMgTGFzdCBtb2RpZmllZDogIDcgTWFyY2ggMjAwMgotIwotIwlUaGUgcHJvZ3JhbXMgYnVpbHQgYnkgdGhpcyBtYWtlZmlsZSBhcmUgZGVzY3JpYmVkIGluIHRoZSBib29rLAotIwkiUE5HOiAgVGhlIERlZmluaXRpdmUgR3VpZGUsIiBieSBHcmVnIFJvZWxvZnMgKE8nUmVpbGx5IGFuZAotIwlBc3NvY2lhdGVzLCAxOTk5KS4gIEdvIGJ1eSBhIGNvcHksIGVoPyAgQnV5IHNvbWUgZm9yIGZyaWVuZHMKLSMJYW5kIGZhbWlseSwgdG9vLiAgKE5vdCB0aGF0IHRoaXMgaXMgYSBibGF0YW50IHBsdWcgb3IgYW55dGhpbmcuKQotIwotIyBJbnZva2UgdGhpcyBtYWtlZmlsZSBmcm9tIGEgc2hlbGwgcHJvbXB0IGluIHRoZSB1c3VhbCB3YXk7IGZvciBleGFtcGxlOgotIwotIwltYWtlIC1mIE1ha2VmaWxlLnNnaQotIwotIyBUaGlzIG1ha2VmaWxlIGFzc3VtZXMgbGlicG5nIGFuZCB6bGliIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0IG9yIGRvd25sb2FkZWQKLSMgYW5kIGFyZSBib3RoIGluc3RhbGxlZCBpbiAvdXNyL2xvY2FsL3tpbmNsdWRlLGxpYn0gKGFzIGluZGljYXRlZCBieSB0aGUKLSMgUE5HKiBhbmQgWiogbWFjcm9zIGJlbG93KS4gIEVkaXQgYXMgYXBwcm9wcmlhdGUtLWNob29zZSBvbmx5IE9ORSBlYWNoIG9mCi0jIHRoZSBQTkdJTkMsIFBOR0xJQiwgWklOQyBhbmQgWkxJQiBsaW5lcy4KLSMKLSMgVGhpcyBtYWtlZmlsZSBidWlsZHMgZHluYW1pY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzIChhZ2FpbnN0IGxpYnBuZyBhbmQgemxpYiwKLSMgdGhhdCBpcyksIGJ1dCB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5IHVuY29tbWVudGluZyB0aGUgYXBwcm9wcmlhdGUgUE5HTElCIGFuZAotIyBaTElCIGxpbmVzLgotCi0KLSMgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVBOR0lOQyA9IC1JL3Vzci9sb2NhbC9pbmNsdWRlL2xpYnBuZzEyCi1QTkdMSUIgPSAtTC91c3IvbG9jYWwvbGliIC1scG5nMTIJICAjIGR5bmFtaWNhbGx5IGxpbmtlZCBhZ2FpbnN0IGxpYnBuZwotI1BOR0xJQiA9IC91c3IvbG9jYWwvbGliL2xpYnBuZzEyLmEgIyBzdGF0aWNhbGx5IGxpbmtlZCBhZ2FpbnN0IGxpYnBuZwotIyBvcjoKLSNQTkdJTkMgPSAtSS4uLy4uCi0jUE5HTElCID0gLUwuLi8uLiAtbHBuZwotI1BOR0xJQiA9IC4uLy4uL2xpYnBuZy5hCi0KLVpJTkMgPSAtSS91c3IvbG9jYWwvaW5jbHVkZQotWkxJQiA9IC1ML3Vzci9sb2NhbC9saWIgLWx6CQkjIGR5bmFtaWNhbGx5IGxpbmtlZCBhZ2FpbnN0IHpsaWIKLSNaTElCID0gL3Vzci9sb2NhbC9saWIvbGliei5hCQkjIHN0YXRpY2FsbHkgbGlua2VkIGFnYWluc3QgemxpYgotI1pJTkMgPSAtSS4uL3psaWIKLSNaTElCID0gLUwuLi96bGliIC1segotI1pMSUIgPSAuLi8uLi8uLi96bGliL2xpYnouYQotCi1YSU5DID0gLUkvdXNyL2luY2x1ZGUvWDExCQkjIG9sZC1zdHlsZSwgc3RvY2sgWCBkaXN0cmlidXRpb25zCi1YTElCID0gLUwvdXNyL2xpYi9YMTEgLWxYMTEKLSNYSU5DID0gLUkvdXNyL29wZW53aW4vaW5jbHVkZSAgICAJIyBTdW4gd29ya3N0YXRpb25zIChPcGVuV2luZG93cykKLSNYTElCID0gLUwvdXNyL29wZW53aW4vbGliIC1sWDExCi0jWElOQyA9IC1JL3Vzci9YMTFSNi9pbmNsdWRlCQkjIG5ldyBYIGRpc3RyaWJ1dGlvbnMgKFhGcmVlODYsIGV0Yy4pCi0jWExJQiA9IC1ML3Vzci9YMTFSNi9saWIgLWxYMTEKLQotSU5DUyA9ICQoUE5HSU5DKSAkKFpJTkMpICQoWElOQykKLVJMSUJTID0gJChQTkdMSUIpICQoWkxJQikgJChYTElCKSAtbG0KLVdMSUJTID0gJChQTkdMSUIpICQoWkxJQikKLQotQ0MgPSBjYwotTEQgPSBjYwotUk0gPSBybSAtZgotIyBBQkkgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGF0IHVzZWQgdG8gYnVpbGQgbGlicG5nLgotQUJJPQotQ0ZMQUdTID0gJChBQkkpIC1PIC1mdWxsd2FybiAkKElOQ1MpCi1MREZMQUdTID0gJChBQkkpCi1PID0gLm8KLUUgPQotCi1SUE5HICA9IHJwbmcteAotUlBORzIgPSBycG5nMi14Ci1XUE5HICA9IHdwbmcKLQotUk9CSlMgID0gJChSUE5HKSQoTykgcmVhZHBuZyQoTykKLVJPQkpTMiA9ICQoUlBORzIpJChPKSByZWFkcG5nMiQoTykKLVdPQkpTICA9ICQoV1BORykkKE8pIHdyaXRlcG5nJChPKQotCi1FWEVTID0gJChSUE5HKSQoRSkgJChSUE5HMikkKEUpICQoV1BORykkKEUpCi0KLQotIyBpbXBsaWNpdCBtYWtlIHJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLmMkKE8pOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkPAotCi0KLSMgZGVwZW5kZW5jaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFsbDogICQoRVhFUykKLQotJChSUE5HKSQoRSk6ICQoUk9CSlMpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKFJPQkpTKSAkKFJMSUJTKQotCi0kKFJQTkcyKSQoRSk6ICQoUk9CSlMyKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUzIpICQoUkxJQlMpCi0KLSQoV1BORykkKEUpOiAkKFdPQkpTKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKUykgJChXTElCUykKLQotJChSUE5HKSQoTyk6CSQoUlBORykuYyByZWFkcG5nLmgKLSQoUlBORzIpJChPKToJJChSUE5HMikuYyByZWFkcG5nMi5oCi0kKFdQTkcpJChPKToJJChXUE5HKS5jIHdyaXRlcG5nLmgKLQotcmVhZHBuZyQoTyk6CXJlYWRwbmcuYyByZWFkcG5nLmgKLXJlYWRwbmcyJChPKToJcmVhZHBuZzIuYyByZWFkcG5nMi5oCi13cml0ZXBuZyQoTyk6CXdyaXRlcG5nLmMgd3JpdGVwbmcuaAotCi0KLSMgbWFpbnRlbmFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsZWFuOgotCSQoUk0pICQoRVhFUykgJChST0JKUykgJChST0JKUzIpICQoV09CSlMpCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnVueCBiL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUudW54CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmY2NWJmLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUudW54CisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLSMgU2FtcGxlIG1ha2VmaWxlIGZvciBycG5nLXggLyBycG5nMi14IC8gd3BuZyB1c2luZyBnY2MgYW5kIG1ha2UuCi0jIEdyZWcgUm9lbG9mcwotIyBMYXN0IG1vZGlmaWVkOiAgMiBKdW5lIDIwMDcKLSMKLSMJVGhlIHByb2dyYW1zIGJ1aWx0IGJ5IHRoaXMgbWFrZWZpbGUgYXJlIGRlc2NyaWJlZCBpbiB0aGUgYm9vaywKLSMJIlBORzogIFRoZSBEZWZpbml0aXZlIEd1aWRlLCIgYnkgR3JlZyBSb2Vsb2ZzIChPJ1JlaWxseSBhbmQKLSMJQXNzb2NpYXRlcywgMTk5OSkuICBHbyBidXkgYSBjb3B5LCBlaD8gIFdlbGwsIE9LLCBpdCdzIG5vdAotIwlnZW5lcmFsbHkgZm9yIHNhbGUgYW55bW9yZSwgYnV0IGl0J3MgdGhlIHRob3VnaHQgdGhhdCBjb3VudHMsCi0jCXJpZ2h0PyAgKEhpbnQ6ICBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9ib29rLyApCi0jCi0jIEludm9rZSB0aGlzIG1ha2VmaWxlIGZyb20gYSBzaGVsbCBwcm9tcHQgaW4gdGhlIHVzdWFsIHdheTsgZm9yIGV4YW1wbGU6Ci0jCi0jCW1ha2UgLWYgTWFrZWZpbGUudW54Ci0jCi0jIFRoaXMgbWFrZWZpbGUgYXNzdW1lcyBsaWJwbmcgYW5kIHpsaWIgaGF2ZSBhbHJlYWR5IGJlZW4gYnVpbHQgb3IgZG93bmxvYWRlZAotIyBhbmQgYXJlIGluc3RhbGxlZCBpbiAvdXNyL2xvY2FsL3tpbmNsdWRlLGxpYn0gb3IgYXMgb3RoZXJ3aXNlIGluZGljYXRlZCBieQotIyB0aGUgUE5HKiBhbmQgWiogbWFjcm9zIGJlbG93LiAgRWRpdCBhcyBhcHByb3ByaWF0ZS0tY2hvb3NlIG9ubHkgT05FIGVhY2ggb2YKLSMgdGhlIFBOR0lOQywgUE5HTElCZCwgUE5HTElCcywgWklOQywgWkxJQmQgYW5kIFpMSUJzIGxpbmVzLgotIwotIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGR5bmFtaWNhbGx5IGFuZCBzdGF0aWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcwotIyAoYWdhaW5zdCBsaWJwbmcgYW5kIHpsaWIsIHRoYXQgaXMpLCBidXQgdGhhdCBjYW4gYmUgY2hhbmdlZCBieSBtb2RpZnlpbmcKLSMgdGhlICJFWEVTID0iIGxpbmUuICAoWW91IG5lZWQgb25seSBvbmUgc2V0LCBidXQgZm9yIHRlc3RpbmcgaXQgY2FuIGJlIGhhbmR5Ci0jIHRvIGhhdmUgYm90aC4pCi0KLQotIyBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI1BOR0RJUiA9IC91c3IvbG9jYWwvbGliCi0jUE5HSU5DID0gLUkvdXNyL2xvY2FsL2luY2x1ZGUvbGlicG5nMTIKLSNQTkdMSUJkID0gLUwkKFBOR0RJUikgLWxwbmcxMiAjIGR5bmFtaWNhbGx5IGxpbmtlZCwgaW5zdGFsbGVkIGxpYnBuZwotI1BOR0xJQnMgPSAkKFBOR0RJUikvbGlicG5nMTIuYSAjIHN0YXRpY2FsbHkgbGlua2VkLCBpbnN0YWxsZWQgbGlicG5nCi0jIG9yOgotUE5HRElSID0gLi4vLi4jCXRoaXMgb25lIGlzIGZvciBsaWJwbmcteC55LnovY29udHJpYi9ncmVnYm9vayBidWlsZHMKLSNQTkdESVIgPSAuLi9saWJwbmcKLVBOR0lOQyA9IC1JJChQTkdESVIpCi1QTkdMSUJkID0gLVdsLC1ycGF0aCwkKFBOR0RJUikgLUwkKFBOR0RJUikgLWxwbmcxMgkjIGR5bmFtaWNhbGx5IGxpbmtlZAotUE5HTElCcyA9ICQoUE5HRElSKS9saWJwbmcuYQkJIyBzdGF0aWNhbGx5IGxpbmtlZCwgbG9jYWwgbGlicG5nCi0KLVpESVIgPSAvdXNyL2xvY2FsL2xpYgotI1pESVIgPSAvdXNyL2xpYjY0Ci1aSU5DID0gLUkvdXNyL2xvY2FsL2luY2x1ZGUKLVpMSUJkID0gLUwkKFpESVIpIC1segkJCSMgZHluYW1pY2FsbHkgbGlua2VkIGFnYWluc3QgemxpYgotWkxJQnMgPSAkKFpESVIpL2xpYnouYQkJCSMgc3RhdGljYWxseSBsaW5rZWQgYWdhaW5zdCB6bGliCi0jIG9yOgotI1pESVIgPSAuLi96bGliCi0jWklOQyA9IC1JJChaRElSKQotI1pMSUJkID0gLVdsLC1ycGF0aCwkKFpESVIpIC1MJChaRElSKSAtbHogICMgLXJwYXRoIGFsbG93cyBpbi1wbGFjZSB0ZXN0aW5nCi0jWkxJQnMgPSAkKFpESVIpL2xpYnouYQotCi0jWElOQyA9IC1JL3Vzci9pbmNsdWRlCQkJIyBvbGQtc3R5bGUsIHN0b2NrIFggZGlzdHJpYnV0aW9ucwotI1hMSUIgPSAtTC91c3IvbGliL1gxMSAtbFgxMQkJIyAgKGluY2x1ZGluZyBTR0kgSVJJWCkKLSNYSU5DID0gLUkvdXNyL29wZW53aW4vaW5jbHVkZQkJIyBTdW4gd29ya3N0YXRpb25zIChPcGVuV2luZG93cykKLSNYTElCID0gLUwvdXNyL29wZW53aW4vbGliIC1sWDExCi1YSU5DID0gLUkvdXNyL1gxMVI2L2luY2x1ZGUJCSMgbmV3IFggZGlzdHJpYnV0aW9ucyAoWC5vcmcsIGV0Yy4pCi1YTElCID0gLUwvdXNyL1gxMVI2L2xpYiAtbFgxMQotI1hMSUIgPSAtTC91c3IvWDExUjYvbGliNjQgLWxYMTEJIyBlLmcuLCBSZWQgSGF0IG9uIEFNRDY0Ci0KLUlOQ1MgPSAkKFBOR0lOQykgJChaSU5DKSAkKFhJTkMpCi1STElCU2QgPSAkKFBOR0xJQmQpICQoWkxJQmQpICQoWExJQikgLWxtCi1STElCU3MgPSAkKFBOR0xJQnMpICQoWkxJQnMpICQoWExJQikgLWxtCi1XTElCU2QgPSAkKFBOR0xJQmQpICQoWkxJQmQpIC1sbQotV0xJQlNzID0gJChQTkdMSUJzKSAkKFpMSUJzKQotCi1DQyA9IGdjYwotTEQgPSBnY2MKLVJNID0gcm0gLWYKLUNGTEFHUyA9IC1PIC1XYWxsICQoSU5DUykgLURGRUFUVVJFX0xPT1AKLSMgW25vdGUgdGhhdCAtV2FsbCBpcyBhIGdjYy1zcGVjaWZpYyBjb21waWxhdGlvbiBmbGFnICgibW9zdCB3YXJuaW5ncyBvbiIpXQotIyBbLWFuc2ksIC1wZWRhbnRpYyBhbmQgLVcgY2FuIGFsc28gYmUgdXNlZF0KLUxERkxBR1MgPQotTyA9IC5vCi1FID0KLQotUlBORyAgID0gcnBuZy14Ci1SUE5HMiAgPSBycG5nMi14Ci1XUE5HICAgPSB3cG5nCi0KLVJQTkdzICA9ICQoUlBORyktc3RhdGljCi1SUE5HMnMgPSAkKFJQTkcyKS1zdGF0aWMKLVdQTkdzICA9ICQoV1BORyktc3RhdGljCi0KLVJPQkpTICA9ICQoUlBORykkKE8pIHJlYWRwbmckKE8pCi1ST0JKUzIgPSAkKFJQTkcyKSQoTykgcmVhZHBuZzIkKE8pCi1XT0JKUyAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZyQoTykKLQotU1RBVElDX0VYRVMgID0gJChSUE5HcykkKEUpICQoUlBORzJzKSQoRSkgJChXUE5HcykkKEUpCi1EWU5BTUlDX0VYRVMgPSAkKFJQTkcpJChFKSAkKFJQTkcyKSQoRSkgJChXUE5HKSQoRSkKLQotRVhFUyA9ICQoU1RBVElDX0VYRVMpICQoRFlOQU1JQ19FWEVTKQotCi0KLSMgaW1wbGljaXQgbWFrZSBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5jJChPKToKLQkkKENDKSAtYyAkKENGTEFHUykgJDwKLQotCi0jIGRlcGVuZGVuY2llcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hbGw6ICAkKEVYRVMpCi0KLSQoUlBOR3MpJChFKTogJChST0JKUykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMpICQoUkxJQlNzKQotCi0kKFJQTkcpJChFKTogJChST0JKUykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMpICQoUkxJQlNkKQotCi0kKFJQTkcycykkKEUpOiAkKFJPQkpTMikKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMyKSAkKFJMSUJTcykKLQotJChSUE5HMikkKEUpOiAkKFJPQkpTMikKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMyKSAkKFJMSUJTZCkKLQotJChXUE5HcykkKEUpOiAkKFdPQkpTKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKUykgJChXTElCU3MpCi0KLSQoV1BORykkKEUpOiAkKFdPQkpTKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKUykgJChXTElCU2QpCi0KLSQoUlBORykkKE8pOgkkKFJQTkcpLmMgcmVhZHBuZy5oCi0kKFJQTkcyKSQoTyk6CSQoUlBORzIpLmMgcmVhZHBuZzIuaAotJChXUE5HKSQoTyk6CSQoV1BORykuYyB3cml0ZXBuZy5oCi0KLXJlYWRwbmckKE8pOglyZWFkcG5nLmMgcmVhZHBuZy5oCi1yZWFkcG5nMiQoTyk6CXJlYWRwbmcyLmMgcmVhZHBuZzIuaAotd3JpdGVwbmckKE8pOgl3cml0ZXBuZy5jIHdyaXRlcG5nLmgKLQotCi0jIG1haW50ZW5hbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGVhbjoKLQkkKFJNKSAkKEVYRVMpICQoUk9CSlMpICQoUk9CSlMyKSAkKFdPQkpTKQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS53MzIgYi9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnczMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwODA4NS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnczMgorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIFNhbXBsZSBtYWtlZmlsZSBmb3IgcnBuZy13aW4gLyBycG5nMi13aW4gLyB3cG5nIHVzaW5nIE1TVkMgYW5kIE5NQUtFLgotIyBHcmVnIFJvZWxvZnMKLSMgTGFzdCBtb2RpZmllZDogIDIgSnVuZSAyMDA3Ci0jCi0jCVRoZSBwcm9ncmFtcyBidWlsdCBieSB0aGlzIG1ha2VmaWxlIGFyZSBkZXNjcmliZWQgaW4gdGhlIGJvb2ssCi0jCSJQTkc6ICBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiIGJ5IEdyZWcgUm9lbG9mcyAoTydSZWlsbHkgYW5kCi0jCUFzc29jaWF0ZXMsIDE5OTkpLiAgR28gYnV5IGEgY29weSwgZWg/ICBXZWxsLCBPSywgaXQncyBub3QKLSMJZ2VuZXJhbGx5IGZvciBzYWxlIGFueW1vcmUsIGJ1dCBpdCdzIHRoZSB0aG91Z2h0IHRoYXQgY291bnRzLAotIwlyaWdodD8gIChIaW50OiAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvYm9vay8gKQotIwotIyBJbnZva2UgdGhpcyBtYWtlZmlsZSBmcm9tIGEgRE9TIHByb21wdCB3aW5kb3cgdmlhOgotIwotIwklZGV2c3R1ZGlvJVx2Y1xiaW5cdmN2YXJzMzIuYmF0Ci0jCW5tYWtlIC1ub2xvZ28gLWYgTWFrZWZpbGUudzMyCi0jCi0jIHdoZXJlICVkZXZzdHVkaW8lIGlzIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBNU1ZDIC8gRGV2U3R1ZGlvLiAgSWYKLSMgeW91IGdldCAiZW52aXJvbm1lbnQgb3V0IG9mIHNwYWNlIiBlcnJvcnMsIGNyZWF0ZSBhIGRlc2t0b3Agc2hvcnRjdXQgd2l0aAotIyAiYzpcd2luZG93c1xjb21tYW5kLmNvbSAvZTo0MDk2IiBhcyB0aGUgcHJvZ3JhbSBjb21tYW5kIGxpbmUgYW5kIHNldCB0aGUKLSMgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhpcyBkaXJlY3RvcnkuICBUaGVuIGRvdWJsZS1jbGljayB0byBvcGVuIHRoZSBuZXcKLSMgRE9TLXByb21wdCB3aW5kb3cgd2l0aCBhIGJpZ2dlciBlbnZpcm9ubWVudCBhbmQgcmV0cnkgdGhlIGNvbW1hbmRzIGFib3ZlLgotIyAKLSMgVGhpcyBtYWtlZmlsZSBhc3N1bWVzIGxpYnBuZyBhbmQgemxpYiBoYXZlIGFscmVhZHkgYmVlbiBidWlsdCBvciBkb3dubG9hZGVkCi0jIGFuZCBhcmUgaW4gc3ViZGlyZWN0b3JpZXMgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIGN1cnJlbnQgc3ViZGlyZWN0b3J5Ci0jIChhcyBpbmRpY2F0ZWQgYnkgdGhlIFBOR1BBVEggYW5kIFpQQVRIIG1hY3JvcyBiZWxvdykuICBFZGl0IGFzIGFwcHJvcHJpYXRlLgotIwotIyBOb3RlIHRoYXQgdGhlIG5hbWVzIG9mIHRoZSBkeW5hbWljIGFuZCBzdGF0aWMgbGlicG5nIGFuZCB6bGliIGxpYnJhcmllcwotIyB1c2VkIGJlbG93IG1heSBjaGFuZ2UgaW4gbGF0ZXIgcmVsZWFzZXMgb2YgdGhlIGxpYnJhcmllcy4gIFRoaXMgbWFrZWZpbGUKLSMgYnVpbGRzIHN0YXRpY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzLCBidXQgdGhhdCBjYW4gYmUgY2hhbmdlZCBieSB1bmNvbS0KLSMgbWVudGluZyB0aGUgYXBwcm9wcmlhdGUgUE5HTElCIGFuZCBaTElCIGxpbmVzLgotCi0haW5jbHVkZSA8bnR3aW4zMi5tYWs+Ci0KLQotIyBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUE5HUEFUSCA9IC4uL2xpYnBuZwotUE5HSU5DID0gLUkkKFBOR1BBVEgpCi0jUE5HTElCID0gJChQTkdQQVRIKS9wbmdkbGwubGliCi1QTkdMSUIgPSAkKFBOR1BBVEgpL2xpYnBuZy5saWIKLQotWlBBVEggPSAuLi96bGliCi1aSU5DID0gLUkkKFpQQVRIKQotI1pMSUIgPSAkKFpQQVRIKS96bGliZGxsLmxpYgotWkxJQiA9ICQoWlBBVEgpL3psaWJzdGF0LmxpYgotCi1XSU5MSUJTID0gLWRlZmF1bHRsaWI6dXNlcjMyLmxpYiBnZGkzMi5saWIKLSMgWyJyZWFsIiBhcHBzIG1heSBhbHNvIG5lZWQgY29tY3RsMzIubGliLCBjb21kbGczMi5saWIsIHdpbm1tLmxpYiwgZXRjLl0KLQotSU5DUyA9ICQoUE5HSU5DKSAkKFpJTkMpCi1STElCUyA9ICQoUE5HTElCKSAkKFpMSUIpICQoV0lOTElCUykKLVdMSUJTID0gJChQTkdMSUIpICQoWkxJQikKLQotQ0MgPSBjbAotTEQgPSBsaW5rCi1STSA9IGRlbAotQ0ZMQUdTID0gLW5vbG9nbyAtTyAtVzMgJChJTkNTKSAkKGN2YXJzKQotIyBbbm90ZSB0aGF0IC1XMyBpcyBhbiBNU1ZDLXNwZWNpZmljIGNvbXBpbGF0aW9uIGZsYWcgKCJhbGwgd2FybmluZ3Mgb24iKV0KLSMgW3NlZSAlZGV2c3R1ZGlvJVx2Y1xpbmNsdWRlXHdpbjMyLm1hayBmb3IgY3ZhcnMgbWFjcm8gZGVmaW5pdGlvbl0KLU8gPSAub2JqCi1FID0gLmV4ZQotCi1STERGTEFHUyA9IC1ub2xvZ28gLXN1YnN5c3RlbTp3aW5kb3dzCi1XTERGTEFHUyA9IC1ub2xvZ28KLQotUlBORyAgPSBycG5nLXdpbgotUlBORzIgPSBycG5nMi13aW4KLVdQTkcgID0gd3BuZwotCi1ST0JKUyAgPSAkKFJQTkcpJChPKSByZWFkcG5nJChPKQotUk9CSlMyID0gJChSUE5HMikkKE8pIHJlYWRwbmcyJChPKQotV09CSlMgID0gJChXUE5HKSQoTykgd3JpdGVwbmckKE8pCi0KLUVYRVMgPSAkKFJQTkcpJChFKSAkKFJQTkcyKSQoRSkgJChXUE5HKSQoRSkKLQotCi0jIGltcGxpY2l0IG1ha2UgcnVsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0uYyQoTyk6Ci0JJChDQykgLWMgJChDRkxBR1MpICQ8Ci0KLQotIyBkZXBlbmRlbmNpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYWxsOiAgJChFWEVTKQotCi0kKFJQTkcpJChFKTogJChST0JKUykKLQkkKExEKSAkKFJMREZMQUdTKSAtb3V0OiRAICQoUk9CSlMpICQoUkxJQlMpCi0KLSQoUlBORzIpJChFKTogJChST0JKUzIpCi0JJChMRCkgJChSTERGTEFHUykgLW91dDokQCAkKFJPQkpTMikgJChSTElCUykKLQotJChXUE5HKSQoRSk6ICQoV09CSlMpCi0JJChMRCkgJChXTERGTEFHUykgLW91dDokQCAkKFdPQkpTKSAkKFdMSUJTKQotCi0kKFJQTkcpJChPKToJJChSUE5HKS5jIHJlYWRwbmcuaAotJChSUE5HMikkKE8pOgkkKFJQTkcyKS5jIHJlYWRwbmcyLmgKLSQoV1BORykkKE8pOgkkKFdQTkcpLmMgd3JpdGVwbmcuaAotCi1yZWFkcG5nJChPKToJcmVhZHBuZy5jIHJlYWRwbmcuaAotcmVhZHBuZzIkKE8pOglyZWFkcG5nMi5jIHJlYWRwbmcyLmgKLXdyaXRlcG5nJChPKToJd3JpdGVwbmcuYyB3cml0ZXBuZy5oCi0KLQotIyBtYWludGVuYW5jZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xlYW46Ci0jCWlkZWFsbHkgd2UgY291bGQganVzdCBkbyB0aGlzOgotIwkkKFJNKSAkKEVYRVMpICQoUk9CSlMpICQoUk9CSlMyKSAkKFdPQkpTKQotIwkuLi5idXQgdGhlIFdpbmRvd3MgIkRFTCIgY29tbWFuZCBpcyBub25lIHRvbyBicmlnaHQsIHNvOgotCSQoUk0pIHIqJChFKQotCSQoUk0pIHcqJChFKQotCSQoUk0pIHIqJChPKQotCSQoUk0pIHcqJChPKQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9SRUFETUUgYi9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2ZTUyNS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICBQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlCi0gICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UgQ29kZQotCi1DaGFwdGVycyAxMywgMTQgYW5kIDE1IG9mICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlIiBkaXNjdXNzIHRocmVlIGZyZWUsCi1jcm9zcy1wbGF0Zm9ybSBkZW1vIHByb2dyYW1zIHRoYXQgc2hvdyBob3cgdG8gdXNlIHRoZSBsaWJwbmcgcmVmZXJlbmNlCi1saWJyYXJ5OiAgcnBuZywgcnBuZzIgYW5kIHdwbmcuICBycG5nIGFuZCBycG5nMiBhcmUgdmlld2VyczsgdGhlIGZpcnN0IGlzCi1hIHZlcnkgc2ltcGxlIGV4YW1wbGUgdGhhdCB0aGF0IHNob3dzIGhvdyBhIHN0YW5kYXJkIGZpbGUtdmlld2VyIG1pZ2h0IHVzZQotbGlicG5nLCB3aGlsZSB0aGUgc2Vjb25kIGlzIGRlc2lnbmVkIHRvIHByb2Nlc3Mgc3RyZWFtaW5nIGRhdGEgYW5kIHNob3dzCi1ob3cgYSB3ZWIgYnJvd3NlciBtaWdodCBiZSB3cml0dGVuLiAgd3BuZyBpcyBhIHNpbXBsZSBjb21tYW5kLWxpbmUgcHJvZ3JhbQotdGhhdCByZWFkcyBiaW5hcnkgUEdNIGFuZCBQUE0gZmlsZXMgKHRoZSBgYHJhdycnIGdyYXlzY2FsZSBhbmQgUkdCIHN1YnNldHMKLW9mIFBCTVBMVVMvTmV0UEJNKSBhbmQgY29udmVydHMgdGhlbSB0byBQTkcuCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIHRocmVlIGRlbW8gcHJvZ3JhbXMgY3VycmVudGx5IGNvbXBpbGVzIHVuZGVyCi1Vbml4LCBPcGVuVk1TLCBhbmQgMzItYml0IFdpbmRvd3MuICAoU3BlY2lhbCB0aGFua3MgdG8gTWFydGluIFppbnNlciwKLXppbnNlckBkZWN1cy5kZSwgZm9yIG1ha2luZyB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgZm9yIE9wZW5WTVMgYW5kIGZvcgotcHJvdmlkaW5nIGFuIGFwcHJvcHJpYXRlIGJ1aWxkIHNjcmlwdC4pICBCdWlsZCBpbnN0cnVjdGlvbnMgY2FuIGJlIGZvdW5kCi1iZWxvdy4KLQotRmlsZXM6Ci0KLSAgIFJFQURNRSAgICAgICAgICAgICB0aGlzIGZpbGUKLSAgIExJQ0VOU0UgICAgICAgICAgICB0ZXJtcyBvZiBkaXN0cmlidXRpb24gYW5kIHJldXNlIChCU0QtbGlrZSBvciBHTlUgR1BMKQotICAgQ09QWUlORyAgICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCi0KLSAgIE1ha2VmaWxlLnVueCAgICAgICBVbml4IG1ha2VmaWxlCi0gICBNYWtlZmlsZS53MzIgICAgICAgV2luZG93cyAoTVNWQykgbWFrZWZpbGUKLSAgIG1ha2V2bXMuY29tICAgICAgICBPcGVuVk1TIGJ1aWxkIHNjcmlwdAotCi0gICBycG5nLXdpbi5jICAgICAgICAgV2luZG93cyBmcm9udCBlbmQgZm9yIHRoZSBiYXNpYyB2aWV3ZXIKLSAgIHJwbmcteC5jICAgICAgICAgICBYIFdpbmRvdyBTeXN0ZW0gKFVuaXgsIE9wZW5WTVMpIGZyb250IGVuZAotICAgcmVhZHBuZy5jICAgICAgICAgIGdlbmVyaWMgYmFjayBlbmQgZm9yIHRoZSBiYXNpYyB2aWV3ZXIKLSAgIHJlYWRwbmcuaCAgICAgICAgICBoZWFkZXIgZmlsZSBmb3IgdGhlIGJhc2ljIHZpZXdlcgotCi0gICBycG5nMi13aW4uYyAgICAgICAgV2luZG93cyBmcm9udCBlbmQgZm9yIHRoZSBwcm9ncmVzc2l2ZSB2aWV3ZXIKLSAgIHJwbmcyLXguYyAgICAgICAgICBYIGZyb250IGVuZCBmb3IgdGhlIHByb2dyZXNzaXZlIHZpZXdlcgotICAgcmVhZHBuZzIuYyAgICAgICAgIGdlbmVyaWMgYmFjayBlbmQgZm9yIHRoZSBwcm9ncmVzc2l2ZSB2aWV3ZXIKLSAgIHJlYWRwbmcyLmggICAgICAgICBoZWFkZXIgZmlsZSBmb3IgdGhlIHByb2dyZXNzaXZlIHZpZXdlcgotCi0gICB3cG5nLmMgICAgICAgICAgICAgZ2VuZXJpYyAodGV4dCkgZnJvbnQgZW5kIGZvciB0aGUgY29udmVydGVyCi0gICB3cml0ZXBuZy5jICAgICAgICAgZ2VuZXJpYyBiYWNrIGVuZCBmb3IgdGhlIGNvbnZlcnRlcgotICAgd3JpdGVwbmcuaCAgICAgICAgIGhlYWRlciBmaWxlIGZvciB0aGUgY29udmVydGVyCi0KLSAgIHRvdWNhbi5wbmcgICAgICAgICB0cmFuc3BhcmVudCBQTkcgZm9yIHRlc3RpbmcgKGJ5IFN0ZWZhbiBTY2huZWlkZXIpCi0KLU5vdGUgdGhhdCwgYWx0aG91Z2ggdGhlIHByb2dyYW1zIGFyZSBkZXNpZ25lZCB0byBiZSBmdW5jdGlvbmFsLCB0aGVpcgotcHJpbWFyeSBwdXJwb3NlIGlzIHRvIGlsbHVzdHJhdGUgaG93IHRvIHVzZSBsaWJwbmcgdG8gYWRkIFBORyBzdXBwb3J0IHRvCi1vdGhlciBwcm9ncmFtcy4gIEFzIHN1Y2gsIHRoZWlyIHVzZXIgaW50ZXJmYWNlcyBhcmUgY3J1ZGUgYW5kIGRlZmluaXRlbHkKLWFyZSBub3QgaW50ZW5kZWQgZm9yIGV2ZXJ5ZGF5IHVzZS4KLQotUGxlYXNlIHNlZSBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9wbmdib29rLmh0bWwgZm9yIGZ1cnRoZXIgaW5mb3ItCi1tYXRpb24gYW5kIGxpbmtzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUsIGFuZCBDaGFwdGVycwotMTMtMTUgb2YgdGhlIGJvb2sgZm9yIGRldGFpbGVkIGRpc2N1c3Npb24gb2YgdGhlIHRocmVlIHByb2dyYW1zLgotCi1HcmVnIFJvZWxvZnMKLWh0dHA6Ly9wb2JveC5jb20vfm5ld3QvZ3JlZ19jb250YWN0Lmh0bWwKLTE2IE1hcmNoIDIwMDgKLQotCi1CVUlMRCBJTlNUUlVDVElPTlMKLQotIC0gUHJlcmVxdWlzaXRlcyAoaW4gb3JkZXIgb2YgY29tcGlsYXRpb24pOgotCi0gICAgICAtIHpsaWIJCWh0dHA6Ly96bGliLm5ldC8KLSAgICAgIC0gbGlicG5nCQlodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9saWJwbmcuaHRtbAotICAgICAgLSBwbmdib29rCQlodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9ib29rL3NvdXJjZXMuaHRtbAotCi0gICAgIFRoZSBwbmdib29rIGRlbW8gcHJvZ3JhbXMgYXJlIGV4cGxpY2l0bHkgZGVzaWduZWQgdG8gZGVtb25zdHJhdGUgcHJvcGVyCi0gICAgIGNvZGluZyB0ZWNobmlxdWVzIGZvciB1c2luZyB0aGUgbGlicG5nIHJlZmVyZW5jZSBsaWJyYXJ5LiAgQXMgYSByZXN1bHQsCi0gICAgIHlvdSBuZWVkIHRvIGRvd25sb2FkIGFuZCBidWlsZCBib3RoIHpsaWIgKG9uIHdoaWNoIGxpYnBuZyBkZXBlbmRzKSBhbmQKLSAgICAgbGlicG5nLiAgQSBjb21tb24gYnVpbGQgc2V0dXAgaXMgdG8gcGxhY2UgdGhlIHpsaWIsIGxpYnBuZyBhbmQgcG5nYm9vawotICAgICBzdWJkaXJlY3RvcnkgdHJlZXMgKCJmb2xkZXJzIikgaW4gdGhlIHNhbWUgcGFyZW50IGRpcmVjdG9yeS4gIFRoZW4gdGhlCi0gICAgIGxpYnBuZyBidWlsZCBjYW4gcmVmZXIgdG8gZmlsZXMgaW4gLi4vemxpYiAob3IgLi5cemxpYiBvciBbLS56bGliXSksCi0gICAgIGFuZCBzaW1pbGFybHkgZm9yIHRoZSBwbmdib29rIGJ1aWxkLgotCi0gICAgIE5vdGUgdGhhdCBhbGwgdGhyZWUgcGFja2FnZXMgYXJlIGRlc2lnbmVkIHRvIGJlIGJ1aWx0IGZyb20gYSBjb21tYW5kCi0gICAgIGxpbmUgYnkgZGVmYXVsdDsgdGhvc2Ugd2hvIHdpc2ggdG8gdXNlIGEgZ3JhcGhpY2FsIG9yIG90aGVyIGludGVncmF0ZWQKLSAgICAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGFyZSBvbiB0aGVpciBvd24uCi0KLQotIC0gVW5peDoKLQotICAgICBVbnBhY2sgdGhlIGxhdGVzdCBwbmdib29rIHNvdXJjZXMgKHdoaWNoIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoaXMKLSAgICAgUkVBRE1FIGZpbGUpIGludG8gYSBkaXJlY3RvcnkgYW5kIGNoYW5nZSBpbnRvIHRoYXQgZGlyZWN0b3J5LgotCi0gICAgIENvcHkgTWFrZWZpbGUudW54IHRvIE1ha2VmaWxlIGFuZCBlZGl0IHRoZSBQTkcqIGFuZCBaKiB2YXJpYWJsZXMKLSAgICAgYXBwcm9wcmlhdGVseSAocG9zc2libHkgYWxzbyB0aGUgWCogdmFyaWFibGVzIGlmIG5lY2Vzc2FyeSkuCi0KLSAgICAgbWFrZQotCi0gICAgIFRoZXJlIGlzIG5vICJpbnN0YWxsIiB0YXJnZXQsIHNvIGNvcHkgdGhlIHRocmVlIGV4ZWN1dGFibGVzIHNvbWV3aGVyZQotICAgICBpbiB5b3VyIHBhdGggb3IgcnVuIHRoZW0gZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBBbGwgdGhyZWUgd2lsbAotICAgICBwcmludCBhIGJhc2ljIHVzYWdlIHNjcmVlbiB3aGVuIHJ1biB3aXRob3V0IGFueSBjb21tYW5kLWxpbmUgYXJndW1lbnRzOwotICAgICBzZWUgdGhlIGJvb2sgZm9yIG1vcmUgZGV0YWlscy4KLQotCi0gLSBXaW5kb3dzOgotCi0gICAgIFVucGFjayB0aGUgbGF0ZXN0IHBuZ2Jvb2sgc291cmNlcyAod2hpY2ggc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhpcwotICAgICBSRUFETUUgZmlsZSkgaW50byBhIGZvbGRlciwgb3BlbiBhICJET1Mgc2hlbGwiIG9yICJjb21tYW5kIHByb21wdCIKLSAgICAgb3IgZXF1aXZhbGVudCBjb21tYW5kLWxpbmUgd2luZG93LCBhbmQgY2QgaW50byB0aGUgZm9sZGVyIHdoZXJlIHlvdQotICAgICB1bnBhY2tlZCB0aGUgc291cmNlIGNvZGUuCi0KLSAgICAgRm9yIE1TVkMsIHNldCB1cCB0aGUgbmVjZXNzYXJ5IGVudmlyb25tZW50IHZhcmlhYmxlcyBieSBpbnZva2luZwotIAotICAgICAgICAlZGV2c3R1ZGlvJVx2Y1xiaW5cdmN2YXJzMzIuYmF0Ci0KLSAgICAgd2hlcmUgd2hlcmUgJWRldnN0dWRpbyUgaXMgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIE1TVkMgLwotICAgICBEZXZTdHVkaW8uICBJZiB5b3UgZ2V0ICJlbnZpcm9ubWVudCBvdXQgb2Ygc3BhY2UiIGVycm9ycyB1bmRlciA5NS85OCwKLSAgICAgY3JlYXRlIGEgZGVza3RvcCBzaG9ydGN1dCB3aXRoICJjOlx3aW5kb3dzXGNvbW1hbmQuY29tIC9lOjQwOTYiIGFzCi0gICAgIHRoZSBwcm9ncmFtIGNvbW1hbmQgbGluZSBhbmQgc2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgcG5nYm9vawotICAgICBkaXJlY3RvcnkuICBUaGVuIGRvdWJsZS1jbGljayB0byBvcGVuIHRoZSBuZXcgRE9TLXByb21wdCB3aW5kb3cgd2l0aAotICAgICBhIGJpZ2dlciBlbnZpcm9ubWVudCBhbmQgcmV0cnkgdGhlIGNvbW1hbmRzIGFib3ZlLgotCi0gICAgIENvcHkgTWFrZWZpbGUudzMyIHRvIE1ha2VmaWxlIGFuZCBlZGl0IHRoZSBQTkdQQVRIIGFuZCBaUEFUSCB2YXJpYWJsZXMKLSAgICAgYXBwcm9wcmlhdGVseSAocG9zc2libHkgYWxzbyB0aGUgIklOQyIgYW5kICJMSUIiIHZhcmlhYmxlcyBpZiBuZWVkZWQpLgotICAgICBOb3RlIHRoYXQgdGhlIG5hbWVzIG9mIHRoZSBkeW5hbWljIGFuZCBzdGF0aWMgbGlicG5nIGFuZCB6bGliIGxpYnJhcmllcwotICAgICB1c2VkIGluIHRoZSBtYWtlZmlsZSBtYXkgY2hhbmdlIGluIGxhdGVyIHJlbGVhc2VzIG9mIHRoZSBsaWJyYXJpZXMuCi0gICAgIEFsc28gbm90ZSB0aGF0LCBhcyBvZiBsaWJwbmcgdmVyc2lvbiAxLjAuNSwgTVNWQyBETEwgYnVpbGRzIGRvIG5vdCB3b3JrLgotICAgICBUaGlzIG1ha2VmaWxlIHRoZXJlZm9yZSBidWlsZHMgc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMsIGJ1dCBpZgotICAgICB0aGUgRExMIHByb2JsZW1zIGV2ZXIgZ2V0IGZpeGVkLCB1bmNvbW1lbnRpbmcgdGhlIGFwcHJvcHJpYXRlIFBOR0xJQgotICAgICBhbmQgWkxJQiBsaW5lcyB3aWxsIGJ1aWxkIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcyBpbnN0ZWFkLgotCi0gICAgIERvIHRoZSBidWlsZCBieSB0eXBpbmcKLQotICAgICAgICBubWFrZQotCi0gICAgIFRoZSByZXN1bHQgc2hvdWxkIGJlIHRocmVlIGV4ZWN1dGFibGVzOiAgcnBuZy13aW4uZXhlLCBycG5nMi13aW4uZXhlLAotICAgICBhbmQgd3BuZy5leGUuICBDb3B5IHRoZW0gc29tZXdoZXJlIGluIHlvdXIgUEFUSCBvciBydW4gdGhlbSBmcm9tIHRoZQotICAgICBjdXJyZW50IGZvbGRlci4gIExpa2UgdGhlIFVuaXggdmVyc2lvbnMsIHRoZSB0d28gd2luZG93ZWQgcHJvZ3JhbXMKLSAgICAgKHJwbmcgYW5kIHJwbmcyKSBub3cgZGlzcGxheSBhIHVzYWdlIHNjcmVlbiBpbiBhIGNvbnNvbGUgd2luZG93IHdoZW4KLSAgICAgaW52b2tlZCB3aXRob3V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHM7IHRoaXMgaXMgbmV3IGJlaGF2aW9yIGFzIG9mCi0gICAgIHRoZSBKdW5lIDIwMDEgcmVsZWFzZS4gIE5vdGUgdGhhdCB0aGUgcHJvZ3JhbXMgdXNlIHRoZSBVbml4LXN0eWxlICItIgotICAgICBjaGFyYWN0ZXIgdG8gc3BlY2lmeSBvcHRpb25zLCBpbnN0ZWFkIG9mIHRoZSBtb3JlIGNvbW1vbiBET1MvV2luZG93cwotICAgICAiLyIgY2hhcmFjdGVyLiAgKEZvciBleGFtcGxlOiAgInJwbmcyLXdpbiAtYmdwYXQgNCBmb28ucG5nIiwgbm90Ci0gICAgICJycG5nMi13aW4gL2JncGF0IDQgZm9vLnBuZyIpCi0KLQotIC0gT3BlblZNUzoKLQotICAgICBVbnBhY2sgdGhlIHBuZ2Jvb2sgc291cmNlcyBpbnRvIGEgc3ViZGlyZWN0b3J5IGFuZCBjaGFuZ2UgaW50byB0aGF0Ci0gICAgIHN1YmRpcmVjdG9yeS4KLQotICAgICBFZGl0IG1ha2V2bXMuY29tIGFwcHJvcHJpYXRlbHksIHNwZWNpZmljYWxseSB0aGUgenBhdGggYW5kIHBuZ3BhdGgKLSAgICAgdmFyaWFibGVzLgotCi0gICAgIEBtYWtldm1zCi0KLSAgICAgVG8gcnVuIHRoZSBwcm9ncmFtcywgdGhleSBwcm9iYWJseSBmaXJzdCBuZWVkIHRvIGJlIHNldCB1cCBhcyAiZm9yZWlnbgotICAgICBzeW1ib2xzLCIgd2l0aCAiZGlzayIgYW5kICJkaXIiIHNldCBhcHByb3ByaWF0ZWx5OgotCi0gICAgICQgcnBuZyAgPT0gIiRkaXNrOltkaXJdcnBuZy14LmV4ZSIKLSAgICAgJCBycG5nMiA9PSAiJGRpc2s6W2Rpcl1ycG5nMi14LmV4ZSIKLSAgICAgJCB3cG5nICA9PSAiJGRpc2s6W2Rpcl13cG5nLmV4ZSIKLQotICAgICBBbGwgdGhyZWUgd2lsbCBwcmludCBhIGJhc2ljIHVzYWdlIHNjcmVlbiB3aGVuIHJ1biB3aXRob3V0IGFueSBjb21tYW5kLQotICAgICBsaW5lIGFyZ3VtZW50czsgc2VlIHRoZSBib29rIGZvciBtb3JlIGRldGFpbHMuICBOb3RlIHRoYXQgdGhlIG9wdGlvbnMKLSAgICAgc3R5bGUgaXMgVW5peC1saWtlLCBpLmUuLCBwcmVjZWRlZCBieSAiLSIgcmF0aGVyIHRoYW4gIi8iLgotCi0KLVJVTk5JTkcgVEhFIFBST0dSQU1TOiAgKFZFUlkpIEJSSUVGIElOVFJPCi0KLSAgICAgcnBuZyBpcyBhIHNpbXBsZSBQTkcgdmlld2VyIHRoYXQgY2FuIGRpc3BsYXkgdHJhbnNwYXJlbnQgUE5HcyB3aXRoIGEKLSAgICAgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3I7IGZvciBleGFtcGxlLAotCi0JcnBuZyAtYmdjb2xvciAjZmYwMDAwIHRvdWNhbi5wbmcKLQotICAgICB3b3VsZCBkaXNwbGF5IHRoZSBpbWFnZSB3aXRoIGEgcmVkIGJhY2tncm91bmQuICBycG5nMiBpcyBhIHByb2dyZXNzaXZlCi0gICAgIHZpZXdlciB0aGF0IHNpbXVsYXRlcyBhIHdlYiBicm93c2VyIGluIHNvbWUgcmVzcGVjdHM7IGl0IGNhbiBkaXNwbGF5Ci0gICAgIGltYWdlcyBhZ2FpbnN0IGVpdGhlciBhIGJhY2tncm91bmQgY29sb3Igb3IgYSBkeW5hbWljYWxseSBnZW5lcmF0ZWQKLSAgICAgYmFja2dyb3VuZCBpbWFnZS4gIEZvciBleGFtcGxlOgotCi0JcnBuZzIgLWJncGF0IDE2IHRvdWNhbi5wbmcKLQotICAgICB3cG5nIGlzIGEgcHVyZWx5IGNvbW1hbmQtbGluZSBpbWFnZSBjb252ZXJ0ZXIgZnJvbSBiaW5hcnkgUEJNUExVUy9OZXRQQk0KLSAgICAgZm9ybWF0ICgucGdtIG9yIC5wcG0pIHRvIFBORzsgZm9yIGV4YW1wbGUsCi0KLQl3cG5nIC10aW1lIDwgdG91Y2FuLW5vdHJhbnMucHBtID4gdG91Y2FuLW5vdHJhbnMucG5nCi0KLSAgICAgd291bGQgY29udmVydCB0aGUgc3BlY2lmaWVkIFBQTSBmaWxlICh1c2luZyByZWRpcmVjdGlvbikgdG8gUE5HLCBhdXRvLQotICAgICBtYXRpY2FsbHkgc2V0dGluZyB0aGUgUE5HIG1vZGlmaWNhdGlvbi10aW1lIGNodW5rLgotCi0gICAgIEFsbCBvcHRpb25zIGNhbiBiZSBhYmJyZXZpYXRlZCB0byB0aGUgc2hvcnRlc3QgdW5pcXVlIHZhbHVlOyBmb3IgZXhhbXBsZSwKLSAgICAgIi1iZ2MiIGZvciAtYmdjb2xvciAodmVyc3VzICItYmdwIiBmb3IgLWJncGF0KSwgb3IgIi1nIiBmb3IgLWdhbW1hLgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9tYWtldm1zLmNvbSBiL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svbWFrZXZtcy5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzdkYzAuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9tYWtldm1zLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEgbWFrZSAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSIgZGVtbyBwcm9ncmFtcyAoZm9yIFgpIHVuZGVyIE9wZW5WTVMKLSQhCi0kISBTY3JpcHQgY3JlYXRlZCBieSBNYXJ0aW4gWmluc2VyIGZvciBsaWJwbmc7IG1vZGlmaWVkIGJ5IEdyZWcgUm9lbG9mcwotJCEgZm9yIHN0YW5kYWxvbmUgcG5nYm9vayBzb3VyY2UgZGlzdHJpYnV0aW9uLgotJCEKLSQhCi0kISAgICBTZXQgbG9jYXRpb25zIHdoZXJlIHpsaWIgYW5kIGxpYnBuZyBzb3VyY2VzIGxpdmUuCi0kIQotJCB6cGF0aCAgID0gIiIKLSQgcG5ncGF0aCA9ICIiCi0kIQotJCBpZiBmJHNlYXJjaCgiWy0tLS56bGliXXpsaWIuaCIpLm5lcy4iIiB0aGVuIHpwYXRoID0gIlstLS0uemxpYl0iCi0kIGlmIGYkc2VhcmNoKCJbLS1dcG5nLmgiKS5uZXMuIiIgdGhlbiBwbmdwYXRoID0gIlstLV0iCi0kIQotJCBpZiBmJHNlYXJjaCgiWy0uemxpYl16bGliLmgiKS5uZXMuIiIgdGhlbiB6cGF0aCA9ICJbLS56bGliXSIKLSQgaWYgZiRzZWFyY2goIlstLmxpYnBuZ11wbmcuaCIpLm5lcy4iIiB0aGVuIHBuZ3BhdGggPSAiWy0ubGlicG5nXSIKLSQhCi0kIGlmIHpwYXRoIC5lcXMuICIiCi0kIHRoZW4KLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJ6bGliIGluY2x1ZGUgbm90IGZvdW5kLiBFeGl0aW5nLi4uIgotJCAgIGV4aXQgMgotJCBlbmRpZiAKLSQhCi0kIGlmIHBuZ3BhdGggLmVxcy4gIiIKLSQgdGhlbgotJCAgIHdyaXRlIHN5cyRvdXRwdXQgImxpYnBuZyBpbmNsdWRlIG5vdCBmb3VuZC4gRXhpdGluZy4uLiIKLSQgICBleGl0IDIKLSQgZW5kaWYgCi0kIQotJCEgICAgTG9vayBmb3IgdGhlIGNvbXBpbGVyIHVzZWQuCi0kIQotJCBjY29wdD0iL2luY2x1ZGU9KCcnenBhdGgnLCcncG5ncGF0aCcpIgotJCBpZiBmJGdldHN5aSgiSFdfTU9ERUwiKS5nZS4xMDI0Ci0kIHRoZW4KLSQgIGNjb3B0ID0gIi9wcmVmaXg9YWxsIitjY29wdAotJCAgY29tcCAgPSAiX19kZWNjX189MSIKLSQgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgotJCBlbHNlCi0kICBpZiBmJHNlYXJjaCgiU1lTJFNZU1RFTTpERUNDJENPTVBJTEVSLkVYRSIpLmVxcy4iIgotJCAgIHRoZW4KLSQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6Ci0kICAgIGlmIGYkc2VhcmNoKCJTWVMkU1lTVEVNOlZBWEMuRVhFIikuZXFzLiIiCi0kICAgICB0aGVuCi0kICAgICAgY29tcCAgPSAiX19nY2NfXz0xIgotJCAgICAgIENDIDo9PSBHQ0MKLSQgICAgIGVsc2UKLSQgICAgICBjb21wID0gIl9fdmF4Y19fPTEiCi0kICAgICBlbmRpZgotJCAgIGVsc2UKLSQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgZGVjYyRsaWJyYXJ5X2luY2x1ZGU6Ci0kICAgIGNjb3B0ID0gIi9kZWNjL3ByZWZpeD1hbGwiK2Njb3B0Ci0kICAgIGNvbXAgID0gIl9fZGVjY19fPTEiCi0kICBlbmRpZgotJCBlbmRpZgotJCBvcGVuL3dyaXRlIGxvcHQgbGliLm9wdAotJCB3cml0ZSBsb3B0ICInJ3BuZ3BhdGgnbGlicG5nLm9sYi9saWIiCi0kIHdyaXRlIGxvcHQgIicnenBhdGgnbGliei5vbGIvbGliIgotJCBjbG9zZSBsb3B0Ci0kIG9wZW4vd3JpdGUgeG9wdCB4MTEub3B0Ci0kIHdyaXRlIHhvcHQgInN5cyRsaWJyYXJ5OmRlY3ckeGxpYnNoci5leGUvc2hhcmUiCi0kIGNsb3NlIHhvcHQKLSQhCi0kISAgICBCdWlsZCAnZW0uCi0kIQotJCB3cml0ZSBzeXMkb3V0cHV0ICJDb21waWxpbmcgUE5HIGJvb2sgcHJvZ3JhbXMgLi4uIgotJCAgIENBTEwgTUFLRSByZWFkcG5nLk9CSiAiY2MgJydDQ09QVCcgcmVhZHBuZyIgLQotCXJlYWRwbmcuYyByZWFkcG5nLmgKLSQgICBDQUxMIE1BS0UgcmVhZHBuZzIuT0JKICJjYyAnJ0NDT1BUJyByZWFkcG5nMiIgLQotCXJlYWRwbmcyLmMgcmVhZHBuZzIuaAotJCAgIENBTEwgTUFLRSB3cml0ZXBuZy5PQkogImNjICcnQ0NPUFQnIHdyaXRlcG5nIiAtCi0Jd3JpdGVwbmcuYyB3cml0ZXBuZy5oCi0kICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgcnBuZy14Li4uIgotJCAgIENBTEwgTUFLRSBycG5nLXguT0JKICJjYyAnJ0NDT1BUJyBycG5nLXgiIC0KLQlycG5nLXguYyByZWFkcG5nLmgKLSQgICBjYWxsIG1ha2UgcnBuZy14LmV4ZSAtCi0JIkxJTksgcnBuZy14LHJlYWRwbmcsbGliLm9wdC9vcHQseDExLm9wdC9vcHQiIC0KLQlycG5nLXgub2JqIHJlYWRwbmcub2JqCi0kICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgcnBuZzIteC4uLiIKLSQgICBDQUxMIE1BS0UgcnBuZzIteC5PQkogImNjICcnQ0NPUFQnIHJwbmcyLXgiIC0KLQlycG5nMi14LmMgcmVhZHBuZzIuaAotJCAgIGNhbGwgbWFrZSBycG5nMi14LmV4ZSAtCi0JIkxJTksgcnBuZzIteCxyZWFkcG5nMixsaWIub3B0L29wdCx4MTEub3B0L29wdCIgLQotCXJwbmcyLXgub2JqIHJlYWRwbmcyLm9iagotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHdwbmcuLi4iCi0kICAgQ0FMTCBNQUtFIHdwbmcuT0JKICJjYyAnJ0NDT1BUJyB3cG5nIiAtCi0Jd3BuZy5jIHdyaXRlcG5nLmgKLSQgICBjYWxsIG1ha2Ugd3BuZy5leGUgLQotCSJMSU5LIHdwbmcsd3JpdGVwbmcsbGliLm9wdC9vcHQiIC0KLQl3cG5nLm9iaiB3cml0ZXBuZy5vYmoKLSQgZXhpdAotJCEKLSQhCi0kTUFLRTogU1VCUk9VVElORSAgICFTVUJST1VUSU5FIFRPIENIRUNLIERFUEVOREVOQ0lFUwotJCBWID0gJ0YkVmVyaWZ5KDApCi0kISBQMSA9IFdoYXQgd2UgYXJlIHRyeWluZyB0byBtYWtlCi0kISBQMiA9IENvbW1hbmQgdG8gbWFrZSBpdAotJCEgUDMgLSBQOCAgV2hhdCBpdCBkZXBlbmRzIG9uCi0kCi0kIElmIEYkU2VhcmNoKFAxKSAuRXFzLiAiIiBUaGVuIEdvdG8gTWFrZWl0Ci0kIFRpbWUgPSBGJEN2VGltZShGJEZpbGUoUDEsIlJEVCIpKQotJGFyZz0zCi0kTG9vcDoKLSQgICAgICAgQXJndW1lbnQgPSBQJ2FyZwotJCAgICAgICBJZiBBcmd1bWVudCAuRXFzLiAiIiBUaGVuIEdvdG8gRXhpdAotJCAgICAgICBFbD0wCi0kTG9vcDI6Ci0kICAgICAgIEZpbGUgPSBGJEVsZW1lbnQoRWwsIiAiLEFyZ3VtZW50KQotJCAgICAgICBJZiBGaWxlIC5FcXMuICIgIiBUaGVuIEdvdG8gRW5kbAotJCAgICAgICBBRmlsZSA9ICIiCi0kTG9vcDM6Ci0kICAgICAgIE9GaWxlID0gQUZpbGUKLSQgICAgICAgQUZpbGUgPSBGJFNlYXJjaChGaWxlKQotJCAgICAgICBJZiBBRmlsZSAuRXFzLiAiIiAuT3IuIEFGaWxlIC5FcXMuIE9GaWxlIFRoZW4gR290byBOZXh0RWwKLSQgICAgICAgSWYgRiRDdlRpbWUoRiRGaWxlKEFGaWxlLCJSRFQiKSkgLkdlcy4gVGltZSBUaGVuIEdvdG8gTWFrZWl0Ci0kICAgICAgIEdvdG8gTG9vcDMKLSROZXh0RUw6Ci0kICAgICAgIEVsID0gRWwgKyAxCi0kICAgICAgIEdvdG8gTG9vcDIKLSRFbmRMOgotJCBhcmc9YXJnKzEKLSQgSWYgYXJnIC5MZS4gOCBUaGVuIEdvdG8gTG9vcAotJCBHb3RvIEV4aXQKLSQKLSRNYWtlaXQ6Ci0kIFZWPUYkVkVSSUZZKDApCi0kIHdyaXRlIHN5cyRvdXRwdXQgUDIKLSQgJ1AyCi0kIFZWPSdGJFZlcmlmeShWVikKLSRFeGl0OgotJCBJZiBWIFRoZW4gU2V0IFZlcmlmeQotJEVORFNVQlJPVVRJTkUKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZy5jIGIvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4N2Y2YzcuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcnBuZyAtIHNpbXBsZSBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHBuZy5jCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAicG5nLmgiICAgICAgICAvKiBsaWJwbmcgaGVhZGVyOyBpbmNsdWRlcyB6bGliLmggKi8KLSNpbmNsdWRlICJyZWFkcG5nLmgiICAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCBwdWJsaWMgcHJvdG90eXBlcyAqLwotCi0vKiBmdXR1cmUgdmVyc2lvbnMgb2YgbGlicG5nIHdpbGwgcHJvdmlkZSB0aGlzIG1hY3JvOiAqLwotI2lmbmRlZiBwbmdfam1wYnVmCi0jICBkZWZpbmUgcG5nX2ptcGJ1ZihwbmdfcHRyKSAgICgocG5nX3B0ciktPmptcGJ1ZikKLSNlbmRpZgotCi0KLXN0YXRpYyBwbmdfc3RydWN0cCBwbmdfcHRyID0gTlVMTDsKLXN0YXRpYyBwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMOwotCi1wbmdfdWludF8zMiAgd2lkdGgsIGhlaWdodDsKLWludCAgYml0X2RlcHRoLCBjb2xvcl90eXBlOwotdWNoICAqaW1hZ2VfZGF0YSA9IE5VTEw7Ci0KLQotdm9pZCByZWFkcG5nX3ZlcnNpb25faW5mbyh2b2lkKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiICAgQ29tcGlsZWQgd2l0aCBsaWJwbmcgJXM7IHVzaW5nIGxpYnBuZyAlcy5cbiIsCi0gICAgICBQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHBuZ19saWJwbmdfdmVyKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIENvbXBpbGVkIHdpdGggemxpYiAlczsgdXNpbmcgemxpYiAlcy5cbiIsCi0gICAgICBaTElCX1ZFUlNJT04sIHpsaWJfdmVyc2lvbik7Ci19Ci0KLQotLyogcmV0dXJuIHZhbHVlID0gMCBmb3Igc3VjY2VzcywgMSBmb3IgYmFkIHNpZywgMiBmb3IgYmFkIElIRFIsIDQgZm9yIG5vIG1lbSAqLwotCi1pbnQgcmVhZHBuZ19pbml0KEZJTEUgKmluZmlsZSwgdWxnICpwV2lkdGgsIHVsZyAqcEhlaWdodCkKLXsKLSAgICB1Y2ggc2lnWzhdOwotCi0KLSAgICAvKiBmaXJzdCBkbyBhIHF1aWNrIGNoZWNrIHRoYXQgdGhlIGZpbGUgcmVhbGx5IGlzIGEgUE5HIGltYWdlOyBjb3VsZAotICAgICAqIGhhdmUgdXNlZCBzbGlnaHRseSBtb3JlIGdlbmVyYWwgcG5nX3NpZ19jbXAoKSBmdW5jdGlvbiBpbnN0ZWFkICovCi0KLSAgICBmcmVhZChzaWcsIDEsIDgsIGluZmlsZSk7Ci0gICAgaWYgKCFwbmdfY2hlY2tfc2lnKHNpZywgOCkpCi0gICAgICAgIHJldHVybiAxOyAgIC8qIGJhZCBzaWduYXR1cmUgKi8KLQotCi0gICAgLyogY291bGQgcGFzcyBwb2ludGVycyB0byB1c2VyLWRlZmluZWQgZXJyb3IgaGFuZGxlcnMgaW5zdGVhZCBvZiBOVUxMczogKi8KLQotICAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKCFwbmdfcHRyKQotICAgICAgICByZXR1cm4gNDsgICAvKiBvdXQgb2YgbWVtb3J5ICovCi0KLSAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICAgaWYgKCFpbmZvX3B0cikgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIHJldHVybiA0OyAgIC8qIG91dCBvZiBtZW1vcnkgKi8KLSAgICB9Ci0KLQotICAgIC8qIHdlIGNvdWxkIGNyZWF0ZSBhIHNlY29uZCBpbmZvIHN0cnVjdCBoZXJlIChlbmRfaW5mbyksIGJ1dCBpdCdzIG9ubHkKLSAgICAgKiB1c2VmdWwgaWYgd2Ugd2FudCB0byBrZWVwIHByZS0gYW5kIHBvc3QtSURBVCBjaHVuayBpbmZvIHNlcGFyYXRlZAotICAgICAqIChtYWlubHkgZm9yIFBORy1hd2FyZSBpbWFnZSBlZGl0b3JzIGFuZCBjb252ZXJ0ZXJzKSAqLwotCi0KLSAgICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXJlYWRpbmcKLSAgICAgKiBsaWJwbmcgZnVuY3Rpb24gKi8KLQotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotCi0gICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgaW5maWxlKTsKLSAgICBwbmdfc2V0X3NpZ19ieXRlcyhwbmdfcHRyLCA4KTsgIC8qIHdlIGFscmVhZHkgcmVhZCB0aGUgOCBzaWduYXR1cmUgYnl0ZXMgKi8KLQotICAgIHBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOyAgLyogcmVhZCBhbGwgUE5HIGluZm8gdXAgdG8gaW1hZ2UgZGF0YSAqLwotCi0KLSAgICAvKiBhbHRlcm5hdGl2ZWx5LCBjb3VsZCBtYWtlIHNlcGFyYXRlIGNhbGxzIHRvIHBuZ19nZXRfaW1hZ2Vfd2lkdGgoKSwKLSAgICAgKiBldGMuLCBidXQgd2FudCBiaXRfZGVwdGggYW5kIGNvbG9yX3R5cGUgZm9yIGxhdGVyIFtkb24ndCBjYXJlIGFib3V0Ci0gICAgICogY29tcHJlc3Npb25fdHlwZSBhbmQgZmlsdGVyX3R5cGUgPT4gTlVMTHNdICovCi0KLSAgICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsICZ3aWR0aCwgJmhlaWdodCwgJmJpdF9kZXB0aCwgJmNvbG9yX3R5cGUsCi0gICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICAqcFdpZHRoID0gd2lkdGg7Ci0gICAgKnBIZWlnaHQgPSBoZWlnaHQ7Ci0KLQotICAgIC8qIE9LLCB0aGF0J3MgYWxsIHdlIG5lZWQgZm9yIG5vdzsgcmV0dXJuIGhhcHB5ICovCi0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotLyogcmV0dXJucyAwIGlmIHN1Y2NlZWRzLCAxIGlmIGZhaWxzIGR1ZSB0byBubyBiS0dEIGNodW5rLCAyIGlmIGxpYnBuZyBlcnJvcjsKLSAqIHNjYWxlcyB2YWx1ZXMgdG8gOC1iaXQgaWYgbmVjZXNzYXJ5ICovCi0KLWludCByZWFkcG5nX2dldF9iZ2NvbG9yKHVjaCAqcmVkLCB1Y2ggKmdyZWVuLCB1Y2ggKmJsdWUpCi17Ci0gICAgcG5nX2NvbG9yXzE2cCBwQmFja2dyb3VuZDsKLQotCi0gICAgLyogc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhIFBORy1yZWFkaW5nCi0gICAgICogbGlicG5nIGZ1bmN0aW9uICovCi0KLSAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLQotICAgIGlmICghcG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fYktHRCkpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgLyogaXQgaXMgbm90IG9idmlvdXMgZnJvbSB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24sIGJ1dCB0aGlzIGZ1bmN0aW9uCi0gICAgICogdGFrZXMgYSBwb2ludGVyIHRvIGEgcG9pbnRlciwgYW5kIGl0IGFsd2F5cyByZXR1cm5zIHZhbGlkIHJlZCwgZ3JlZW4KLSAgICAgKiBhbmQgYmx1ZSB2YWx1ZXMsIHJlZ2FyZGxlc3Mgb2YgY29sb3JfdHlwZTogKi8KLQotICAgIHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJnBCYWNrZ3JvdW5kKTsKLQotCi0gICAgLyogaG93ZXZlciwgaXQgYWx3YXlzIHJldHVybnMgdGhlIHJhdyBiS0dEIGRhdGEsIHJlZ2FyZGxlc3Mgb2YgYW55Ci0gICAgICogYml0LWRlcHRoIHRyYW5zZm9ybWF0aW9ucywgc28gY2hlY2sgZGVwdGggYW5kIGFkanVzdCBpZiBuZWNlc3NhcnkgKi8KLQotICAgIGlmIChiaXRfZGVwdGggPT0gMTYpIHsKLSAgICAgICAgKnJlZCAgID0gcEJhY2tncm91bmQtPnJlZCAgID4+IDg7Ci0gICAgICAgICpncmVlbiA9IHBCYWNrZ3JvdW5kLT5ncmVlbiA+PiA4OwotICAgICAgICAqYmx1ZSAgPSBwQmFja2dyb3VuZC0+Ymx1ZSAgPj4gODsKLSAgICB9IGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBiaXRfZGVwdGggPCA4KSB7Ci0gICAgICAgIGlmIChiaXRfZGVwdGggPT0gMSkKLSAgICAgICAgICAgICpyZWQgPSAqZ3JlZW4gPSAqYmx1ZSA9IHBCYWNrZ3JvdW5kLT5ncmF5PyAyNTUgOiAwOwotICAgICAgICBlbHNlIGlmIChiaXRfZGVwdGggPT0gMikKLSAgICAgICAgICAgICpyZWQgPSAqZ3JlZW4gPSAqYmx1ZSA9ICgyNTUvMykgKiBwQmFja2dyb3VuZC0+Z3JheTsKLSAgICAgICAgZWxzZSAvKiBiaXRfZGVwdGggPT0gNCAqLwotICAgICAgICAgICAgKnJlZCA9ICpncmVlbiA9ICpibHVlID0gKDI1NS8xNSkgKiBwQmFja2dyb3VuZC0+Z3JheTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcmVkICAgPSAodWNoKXBCYWNrZ3JvdW5kLT5yZWQ7Ci0gICAgICAgICpncmVlbiA9ICh1Y2gpcEJhY2tncm91bmQtPmdyZWVuOwotICAgICAgICAqYmx1ZSAgPSAodWNoKXBCYWNrZ3JvdW5kLT5ibHVlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0KLQotCi0vKiBkaXNwbGF5X2V4cG9uZW50ID09IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudCAqLwotCi11Y2ggKnJlYWRwbmdfZ2V0X2ltYWdlKGRvdWJsZSBkaXNwbGF5X2V4cG9uZW50LCBpbnQgKnBDaGFubmVscywgdWxnICpwUm93Ynl0ZXMpCi17Ci0gICAgZG91YmxlICBnYW1tYTsKLSAgICBwbmdfdWludF8zMiAgaSwgcm93Ynl0ZXM7Ci0gICAgcG5nX2J5dGVwcCAgcm93X3BvaW50ZXJzID0gTlVMTDsKLQotCi0gICAgLyogc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhIFBORy1yZWFkaW5nCi0gICAgICogbGlicG5nIGZ1bmN0aW9uICovCi0KLSAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLQotICAgIC8qIGV4cGFuZCBwYWxldHRlIGltYWdlcyB0byBSR0IsIGxvdy1iaXQtZGVwdGggZ3JheXNjYWxlIGltYWdlcyB0byA4IGJpdHMsCi0gICAgICogdHJhbnNwYXJlbmN5IGNodW5rcyB0byBmdWxsIGFscGhhIGNoYW5uZWw7IHN0cmlwIDE2LWJpdC1wZXItc2FtcGxlCi0gICAgICogaW1hZ2VzIHRvIDggYml0cyBwZXIgc2FtcGxlOyBhbmQgY29udmVydCBncmF5c2NhbGUgdG8gUkdCW0FdICovCi0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIGJpdF9kZXB0aCA8IDgpCi0gICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOwotICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT190Uk5TKSkKLSAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0gICAgaWYgKGJpdF9kZXB0aCA9PSAxNikKLSAgICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8Ci0gICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKLSAgICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsKLQotCi0gICAgLyogdW5saWtlIHRoZSBleGFtcGxlIGluIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiwgd2UgaGF2ZSAqbm8qIGlkZWEgd2hlcmUKLSAgICAgKiB0aGlzIGZpbGUgbWF5IGhhdmUgY29tZSBmcm9tLS1zbyBpZiBpdCBkb2Vzbid0IGhhdmUgYSBmaWxlIGdhbW1hLCBkb24ndAotICAgICAqIGRvIGFueSBjb3JyZWN0aW9uICgiZG8gbm8gaGFybSIpICovCi0KLSAgICBpZiAocG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZ2FtbWEpKQotICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIGRpc3BsYXlfZXhwb25lbnQsIGdhbW1hKTsKLQotCi0gICAgLyogYWxsIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcmVnaXN0ZXJlZDsgbm93IHVwZGF0ZSBpbmZvX3B0ciBkYXRhLAotICAgICAqIGdldCByb3dieXRlcyBhbmQgY2hhbm5lbHMsIGFuZCBhbGxvY2F0ZSBpbWFnZSBtZW1vcnkgKi8KLQotICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgICpwUm93Ynl0ZXMgPSByb3dieXRlcyA9IHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgICpwQ2hhbm5lbHMgPSAoaW50KXBuZ19nZXRfY2hhbm5lbHMocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAgaWYgKChpbWFnZV9kYXRhID0gKHVjaCAqKW1hbGxvYyhyb3dieXRlcypoZWlnaHQpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKChyb3dfcG9pbnRlcnMgPSAocG5nX2J5dGVwcCltYWxsb2MoaGVpZ2h0KnNpemVvZihwbmdfYnl0ZXApKSkgPT0gTlVMTCkgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKLSAgICAgICAgaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFRyYWNlKChzdGRlcnIsICJyZWFkcG5nX2dldF9pbWFnZTogIGNoYW5uZWxzID0gJWQsIHJvd2J5dGVzID0gJWxkLCBoZWlnaHQgPSAlbGRcbiIsICpwQ2hhbm5lbHMsIHJvd2J5dGVzLCBoZWlnaHQpKTsKLQotCi0gICAgLyogc2V0IHRoZSBpbmRpdmlkdWFsIHJvd19wb2ludGVycyB0byBwb2ludCBhdCB0aGUgY29ycmVjdCBvZmZzZXRzICovCi0KLSAgICBmb3IgKGkgPSAwOyAgaSA8IGhlaWdodDsgICsraSkKLSAgICAgICAgcm93X3BvaW50ZXJzW2ldID0gaW1hZ2VfZGF0YSArIGkqcm93Ynl0ZXM7Ci0KLQotICAgIC8qIG5vdyB3ZSBjYW4gZ28gYWhlYWQgYW5kIGp1c3QgcmVhZCB0aGUgd2hvbGUgaW1hZ2UgKi8KLQotICAgIHBuZ19yZWFkX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7Ci0KLQotICAgIC8qIGFuZCB3ZSdyZSBkb25lISAgKHBuZ19yZWFkX2VuZCgpIGNhbiBiZSBvbWl0dGVkIGlmIG5vIHByb2Nlc3Npbmcgb2YKLSAgICAgKiBwb3N0LUlEQVQgdGV4dC90aW1lL2V0Yy4gaXMgZGVzaXJlZCkgKi8KLQotICAgIGZyZWUocm93X3BvaW50ZXJzKTsKLSAgICByb3dfcG9pbnRlcnMgPSBOVUxMOwotCi0gICAgcG5nX3JlYWRfZW5kKHBuZ19wdHIsIE5VTEwpOwotCi0gICAgcmV0dXJuIGltYWdlX2RhdGE7Ci19Ci0KLQotdm9pZCByZWFkcG5nX2NsZWFudXAoaW50IGZyZWVfaW1hZ2VfZGF0YSkKLXsKLSAgICBpZiAoZnJlZV9pbWFnZV9kYXRhICYmIGltYWdlX2RhdGEpIHsKLSAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKLSAgICAgICAgaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHBuZ19wdHIgJiYgaW5mb19wdHIpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0gICAgICAgIHBuZ19wdHIgPSBOVUxMOwotICAgICAgICBpbmZvX3B0ciA9IE5VTEw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmggYi9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkOWZlMy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHJwbmcgLSBzaW1wbGUgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRwbmcuaAotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCi0gICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycwotICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKLSAgICAgIHRoaXMgc29mdHdhcmUuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKLSAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQotICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgotCi0KLSAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6Ci0KLSAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQotICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCi0gICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KLSAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotCi0gICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwotICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKLSAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KLQotCi0gICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFRSVUUKLSMgIGRlZmluZSBUUlVFIDEKLSMgIGRlZmluZSBGQUxTRSAwCi0jZW5kaWYKLQotI2lmbmRlZiBNQVgKLSMgIGRlZmluZSBNQVgoYSxiKSAgKChhKSA+IChiKT8gKGEpIDogKGIpKQotIyAgZGVmaW5lIE1JTihhLGIpICAoKGEpIDwgKGIpPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0jICBkZWZpbmUgVHJhY2UoeCkgIHtmcHJpbnRmIHggOyBmZmx1c2goc3RkZXJyKTsgZmZsdXNoKHN0ZG91dCk7fQotI2Vsc2UKLSMgIGRlZmluZSBUcmFjZSh4KSAgOwotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVjaDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVzaDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVsZzsKLQotCi0vKiBwcm90b3R5cGVzIGZvciBwdWJsaWMgZnVuY3Rpb25zIGluIHJlYWRwbmcuYyAqLwotCi12b2lkIHJlYWRwbmdfdmVyc2lvbl9pbmZvKHZvaWQpOwotCi1pbnQgcmVhZHBuZ19pbml0KEZJTEUgKmluZmlsZSwgdWxnICpwV2lkdGgsIHVsZyAqcEhlaWdodCk7Ci0KLWludCByZWFkcG5nX2dldF9iZ2NvbG9yKHVjaCAqYmdfcmVkLCB1Y2ggKmJnX2dyZWVuLCB1Y2ggKmJnX2JsdWUpOwotCi11Y2ggKnJlYWRwbmdfZ2V0X2ltYWdlKGRvdWJsZSBkaXNwbGF5X2V4cG9uZW50LCBpbnQgKnBDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgdWxnICpwUm93Ynl0ZXMpOwotCi12b2lkIHJlYWRwbmdfY2xlYW51cChpbnQgZnJlZV9pbWFnZV9kYXRhKTsKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuYyBiL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxNTA0Mi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwbmcyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcnBuZzIgLSBwcm9ncmVzc2l2ZS1tb2RlbCBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICByZWFkcG5nMi5jCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgLyogZm9yIGV4aXQoKSBwcm90b3R5cGUgKi8KLQotI2luY2x1ZGUgInBuZy5oIiAgICAgICAgLyogbGlicG5nIGhlYWRlcjsgaW5jbHVkZXMgemxpYi5oIGFuZCBzZXRqbXAuaCAqLwotI2luY2x1ZGUgInJlYWRwbmcyLmgiICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHB1YmxpYyBwcm90b3R5cGVzICovCi0KLQotLyogbG9jYWwgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgdm9pZCByZWFkcG5nMl9pbmZvX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cik7Ci1zdGF0aWMgdm9pZCByZWFkcG5nMl9yb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIG5ld19yb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiByb3dfbnVtLCBpbnQgcGFzcyk7Ci1zdGF0aWMgdm9pZCByZWFkcG5nMl9lbmRfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKTsKLXN0YXRpYyB2b2lkIHJlYWRwbmcyX2Vycm9yX2hhbmRsZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZyk7Ci0KLQotCi0KLXZvaWQgcmVhZHBuZzJfdmVyc2lvbl9pbmZvKHZvaWQpCi17Ci0jaWYgZGVmaW5lZChQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVEKSAmJiBcCi0gICAgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkgJiYgXAotICAgIGRlZmluZWQoUE5HX0xJQlBOR19WRVIpICYmIChQTkdfTElCUE5HX1ZFUiA+PSAxMDIwMCkKLSAgICAvKgotICAgICAqIFdBUk5JTkc6ICBUaGlzIHByZXByb2Nlc3NvciBhcHByb2FjaCBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZQotICAgICAqICAgICAgICAgICBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgbGlicG5nIERMTCBvbGRlciB0aGFuIDEuMi4wLS10aGUKLSAgICAgKiAgICAgICAgICAgY29tcGlsZWQtaW4gc3ltYm9scyBmb3IgdGhlIG5ldyBmdW5jdGlvbnMgd2lsbCBub3QgZXhpc3QuCi0gICAgICogICAgICAgICAgIChDb3VsZCB1c2UgZGxvcGVuKCkgYW5kIGRsc3ltKCkgb24gVW5peCBhbmQgY29ycmVzcG9uZGluZwotICAgICAqICAgICAgICAgICBjYWxscyBmb3IgV2luZG93cywgYnV0IG5vdCBwb3J0YWJsZS4uLikKLSAgICAgKi8KLSAgICB7Ci0gICAgICAgIGludCBtbXhzdXBwb3J0ID0gcG5nX21teF9zdXBwb3J0KCk7Ci0gICAgICAgIGlmIChtbXhzdXBwb3J0IDwgMCkKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgQ29tcGlsZWQgd2l0aCBsaWJwbmcgJXM7IHVzaW5nIGxpYnBuZyAlcyAiCi0gICAgICAgICAgICAgICJ3aXRob3V0IE1NWCBzdXBwb3J0LlxuIiwgUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBwbmdfbGlicG5nX3Zlcik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaW50IGNvbXBpbGVySUQ7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBtbXhfbWFzayA9IHBuZ19nZXRfbW14X2ZsYWdtYXNrKAotICAgICAgICAgICAgICBQTkdfU0VMRUNUX1JFQUQgfCBQTkdfU0VMRUNUX1dSSVRFLCAmY29tcGlsZXJJRCk7Ci0KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgQ29tcGlsZWQgd2l0aCBsaWJwbmcgJXM7IHVzaW5nIGxpYnBuZyAlcyAiCi0gICAgICAgICAgICAgICJ3aXRoIE1NWCBzdXBwb3J0XG4gICAoJXMgdmVyc2lvbikuIiwgUE5HX0xJQlBOR19WRVJfU1RSSU5HLAotICAgICAgICAgICAgICBwbmdfbGlicG5nX3ZlciwgY29tcGlsZXJJRCA9PSAxPyAiTVNWQysrIiA6Ci0gICAgICAgICAgICAgIChjb21waWxlcklEID09IDI/ICJHTlUgQyIgOiAidW5rbm93biIpKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBQcm9jZXNzb3IgKHg4NiVzKSAlcyBNTVggaW5zdHJ1Y3Rpb25zLlxuIiwKLSNpZiBkZWZpbmVkKF9feDg2XzY0X18pCi0gICAgICAgICAgICAgICJfNjQiLAotI2Vsc2UKLSAgICAgICAgICAgICAgIiIsCi0jZW5kaWYKLSAgICAgICAgICAgICAgbW14c3VwcG9ydD8gInN1cHBvcnRzIiA6ICJkb2VzIG5vdCBzdXBwb3J0Iik7Ci0gICAgICAgICAgICBpZiAobW14c3VwcG9ydCA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgbnVtX29wdGltcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICIgICAgICBQb3RlbnRpYWwgTU1YIG9wdGltaXphdGlvbnMgc3VwcG9ydGVkIGJ5IGxpYnBuZzpcbiIpOwotICAgICAgICAgICAgICAgIGlmIChtbXhfbWFzayAmIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfU1VCKQotICAgICAgICAgICAgICAgICAgICArK251bV9vcHRpbXM7Ci0gICAgICAgICAgICAgICAgaWYgKG1teF9tYXNrICYgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9VUCkKLSAgICAgICAgICAgICAgICAgICAgKytudW1fb3B0aW1zOwotICAgICAgICAgICAgICAgIGlmIChtbXhfbWFzayAmIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfQVZHKQotICAgICAgICAgICAgICAgICAgICArK251bV9vcHRpbXM7Ci0gICAgICAgICAgICAgICAgaWYgKG1teF9tYXNrICYgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9QQUVUSCkKLSAgICAgICAgICAgICAgICAgICAgKytudW1fb3B0aW1zOwotICAgICAgICAgICAgICAgIGlmIChudW1fb3B0aW1zKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgZGVjb2RpbmcgJXMgcm93IGZpbHRlcnMgKHJlYWRpbmcpXG4iLAotICAgICAgICAgICAgICAgICAgICAgIChudW1fb3B0aW1zID09IDQpPyAiYWxsIG5vbi10cml2aWFsIiA6ICJzb21lIik7Ci0gICAgICAgICAgICAgICAgaWYgKG1teF9tYXNrICYgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0NPTUJJTkVfUk9XKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgY29tYmluaW5nIHJvd3MgKHJlYWRpbmcpXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgKytudW1fb3B0aW1zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobW14X21hc2sgJiBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfSU5URVJMQUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICBleHBhbmRpbmcgaW50ZXJsYWNpbmcgKHJlYWRpbmcpXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgKytudW1fb3B0aW1zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtbXhfbWFzayAmPSB+KCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfQ09NQklORV9ST1cgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfSU5URVJMQUNFICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1NVQiAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1VQICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX0FWRyAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1BBRVRIICk7Ci0gICAgICAgICAgICAgICAgaWYgKG1teF9tYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgb3RoZXIgKHVua25vd24pXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgKytudW1fb3B0aW1zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobnVtX29wdGltcyA9PSAwKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgIChub25lKVxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0jZWxzZQotICAgIGZwcmludGYoc3RkZXJyLCAiICAgQ29tcGlsZWQgd2l0aCBsaWJwbmcgJXM7IHVzaW5nIGxpYnBuZyAlcyAiCi0gICAgICAid2l0aG91dCBNTVggc3VwcG9ydC5cbiIsIFBOR19MSUJQTkdfVkVSX1NUUklORywgcG5nX2xpYnBuZ192ZXIpOwotI2VuZGlmCi0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIENvbXBpbGVkIHdpdGggemxpYiAlczsgdXNpbmcgemxpYiAlcy5cbiIsCi0gICAgICBaTElCX1ZFUlNJT04sIHpsaWJfdmVyc2lvbik7Ci19Ci0KLQotCi0KLWludCByZWFkcG5nMl9jaGVja19zaWcodWNoICpzaWcsIGludCBudW0pCi17Ci0gICAgcmV0dXJuIHBuZ19jaGVja19zaWcoc2lnLCBudW0pOwotfQotCi0KLQotCi0vKiByZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDIgZm9yIGxpYnBuZyBwcm9ibGVtLCA0IGZvciBvdXQgb2YgbWVtb3J5ICovCi0KLWludCByZWFkcG5nMl9pbml0KG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cikKLXsKLSAgICBwbmdfc3RydWN0cCAgcG5nX3B0cjsgICAgICAgLyogbm90ZTogIHRlbXBvcmFyeSB2YXJpYWJsZXMhICovCi0gICAgcG5nX2luZm9wICBpbmZvX3B0cjsKLQotCi0gICAgLyogY291bGQgYWxzbyByZXBsYWNlIGxpYnBuZyB3YXJuaW5nLWhhbmRsZXIgKGZpbmFsIE5VTEwpLCBidXQgbm8gbmVlZDogKi8KLQotICAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgbWFpbnByb2dfcHRyLAotICAgICAgcmVhZHBuZzJfZXJyb3JfaGFuZGxlciwgTlVMTCk7Ci0gICAgaWYgKCFwbmdfcHRyKQotICAgICAgICByZXR1cm4gNDsgICAvKiBvdXQgb2YgbWVtb3J5ICovCi0KLSAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICAgaWYgKCFpbmZvX3B0cikgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIHJldHVybiA0OyAgIC8qIG91dCBvZiBtZW1vcnkgKi8KLSAgICB9Ci0KLQotICAgIC8qIHdlIGNvdWxkIGNyZWF0ZSBhIHNlY29uZCBpbmZvIHN0cnVjdCBoZXJlIChlbmRfaW5mbyksIGJ1dCBpdCdzIG9ubHkKLSAgICAgKiB1c2VmdWwgaWYgd2Ugd2FudCB0byBrZWVwIHByZS0gYW5kIHBvc3QtSURBVCBjaHVuayBpbmZvIHNlcGFyYXRlZAotICAgICAqIChtYWlubHkgZm9yIFBORy1hd2FyZSBpbWFnZSBlZGl0b3JzIGFuZCBjb252ZXJ0ZXJzKSAqLwotCi0KLSAgICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXJlYWRpbmcKLSAgICAgKiBsaWJwbmcgZnVuY3Rpb24sIHVubGVzcyBhbiBhbHRlcm5hdGUgZXJyb3IgaGFuZGxlciB3YXMgaW5zdGFsbGVkLS0KLSAgICAgKiBidXQgY29tcGF0aWJsZSBlcnJvciBoYW5kbGVycyBtdXN0IGVpdGhlciB1c2UgbG9uZ2ptcCgpIHRoZW1zZWx2ZXMKLSAgICAgKiAoYXMgaW4gdGhpcyBwcm9ncmFtKSBvciBleGl0IGltbWVkaWF0ZWx5LCBzbyBoZXJlIHdlIGFyZTogKi8KLQotICAgIGlmIChzZXRqbXAobWFpbnByb2dfcHRyLT5qbXBidWYpKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLQotI2lmZGVmIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSAgICAvKiBwcmVwYXJlIHRoZSByZWFkZXIgdG8gaWdub3JlIGFsbCByZWNvZ25pemVkIGNodW5rcyB3aG9zZSBkYXRhIHdvbid0IGJlCi0gICAgICogdXNlZCwgaS5lLiwgYWxsIGNodW5rcyByZWNvZ25pemVkIGJ5IGxpYnBuZyBleGNlcHQgZm9yIElIRFIsIFBMVEUsIElEQVQsCi0gICAgICogSUVORCwgdFJOUywgYktHRCwgZ0FNQSwgYW5kIHNSR0IgKHNtYWxsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50KSAqLwotICAgIHsKLSAgICAgICAgLyogVGhlc2UgYnl0ZSBzdHJpbmdzIHdlcmUgY29waWVkIGZyb20gcG5nLmguICBJZiBhIGZ1dHVyZSBsaWJwbmcKLSAgICAgICAgICogdmVyc2lvbiByZWNvZ25pemVzIG1vcmUgY2h1bmtzLCBhZGQgdGhlbSB0byB0aGlzIGxpc3QuICBJZiBhCi0gICAgICAgICAqIGZ1dHVyZSB2ZXJzaW9uIG9mIHJlYWRwbmcyLmMgcmVjb2duaXplcyBtb3JlIGNodW5rcywgZGVsZXRlIHRoZW0KLSAgICAgICAgICogZnJvbSB0aGlzIGxpc3QuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBwbmdfYnl0ZSBjaHVua3NfdG9faWdub3JlW10gPSB7Ci0gICAgICAgICAgICAgOTksICA3MiwgIDgyLCAgNzcsICdcMCcsICAvKiBjSFJNICovCi0gICAgICAgICAgICAxMDQsICA3MywgIDgzLCAgODQsICdcMCcsICAvKiBoSVNUICovCi0gICAgICAgICAgICAxMDUsICA2NywgIDY3LCAgODAsICdcMCcsICAvKiBpQ0NQICovCi0gICAgICAgICAgICAxMDUsICA4NCwgIDg4LCAxMTYsICdcMCcsICAvKiBpVFh0ICovCi0gICAgICAgICAgICAxMTEsICA3MCwgIDcwLCAxMTUsICdcMCcsICAvKiBvRkZzICovCi0gICAgICAgICAgICAxMTIsICA2NywgIDY1LCAgNzYsICdcMCcsICAvKiBwQ0FMICovCi0gICAgICAgICAgICAxMTIsICA3MiwgIDg5LCAxMTUsICdcMCcsICAvKiBwSFlzICovCi0gICAgICAgICAgICAxMTUsICA2NiwgIDczLCAgODQsICdcMCcsICAvKiBzQklUICovCi0gICAgICAgICAgICAxMTUsICA2NywgIDY1LCAgNzYsICdcMCcsICAvKiBzQ0FMICovCi0gICAgICAgICAgICAxMTUsICA4MCwgIDc2LCAgODQsICdcMCcsICAvKiBzUExUICovCi0gICAgICAgICAgICAxMTUsICA4NCwgIDY5LCAgODIsICdcMCcsICAvKiBzVEVSICovCi0gICAgICAgICAgICAxMTYsICA2OSwgIDg4LCAxMTYsICdcMCcsICAvKiB0RVh0ICovCi0gICAgICAgICAgICAxMTYsICA3MywgIDc3LCAgNjksICdcMCcsICAvKiB0SU1FICovCi0gICAgICAgICAgICAxMjIsICA4NCwgIDg4LCAxMTYsICdcMCcgICAvKiB6VFh0ICovCi0gICAgICAgIH07Ci0KLSAgICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIDEgLyogUE5HX0hBTkRMRV9DSFVOS19ORVZFUiAqLywKLSAgICAgICAgICBjaHVua3NfdG9faWdub3JlLCBzaXplb2YoY2h1bmtzX3RvX2lnbm9yZSkvNSk7Ci0gICAgfQotI2VuZGlmIC8qIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQgKi8KLQotCi0gICAgLyogaW5zdGVhZCBvZiBkb2luZyBwbmdfaW5pdF9pbygpIGhlcmUsIG5vdyB3ZSBzZXQgdXAgb3VyIGNhbGxiYWNrCi0gICAgICogZnVuY3Rpb25zIGZvciBwcm9ncmVzc2l2ZSBkZWNvZGluZyAqLwotCi0gICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHBuZ19wdHIsIG1haW5wcm9nX3B0ciwKLSAgICAgIHJlYWRwbmcyX2luZm9fY2FsbGJhY2ssIHJlYWRwbmcyX3Jvd19jYWxsYmFjaywgcmVhZHBuZzJfZW5kX2NhbGxiYWNrKTsKLQotCi0gICAgLyoKLSAgICAgKiBtYXkgYXMgd2VsbCBlbmFibGUgb3IgZGlzYWJsZSBNTVggcm91dGluZXMgaGVyZSwgaWYgc3VwcG9ydGVkOwotICAgICAqCi0gICAgICogdG8gZW5hYmxlIGFsbDogIG1hc2sgPSBwbmdfZ2V0X21teF9mbGFnbWFzayAoCi0gICAgICogICAgICAgICAgICAgICAgICAgUE5HX1NFTEVDVF9SRUFEIHwgUE5HX1NFTEVDVF9XUklURSwgJmNvbXBpbGVySUQpOwotICAgICAqICAgICAgICAgICAgICAgICBmbGFncyA9IHBuZ19nZXRfYXNtX2ZsYWdzIChwbmdfcHRyKTsKLSAgICAgKiAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gbWFzazsKLSAgICAgKiAgICAgICAgICAgICAgICAgcG5nX3NldF9hc21fZmxhZ3MgKHBuZ19wdHIsIGZsYWdzKTsKLSAgICAgKgotICAgICAqIHRvIGRpc2FibGUgYWxsOiAgbWFzayA9IHBuZ19nZXRfbW14X2ZsYWdtYXNrICgKLSAgICAgKiAgICAgICAgICAgICAgICAgICBQTkdfU0VMRUNUX1JFQUQgfCBQTkdfU0VMRUNUX1dSSVRFLCAmY29tcGlsZXJJRCk7Ci0gICAgICogICAgICAgICAgICAgICAgICBmbGFncyA9IHBuZ19nZXRfYXNtX2ZsYWdzIChwbmdfcHRyKTsKLSAgICAgKiAgICAgICAgICAgICAgICAgIGZsYWdzICY9IH5tYXNrOwotICAgICAqICAgICAgICAgICAgICAgICAgcG5nX3NldF9hc21fZmxhZ3MgKHBuZ19wdHIsIGZsYWdzKTsKLSAgICAgKi8KLQotI2lmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX194ODZfNjRfXykpICYmIFwKLSAgICBkZWZpbmVkKFBOR19MSUJQTkdfVkVSKSAmJiAoUE5HX0xJQlBOR19WRVIgPj0gMTAyMDApCi0gICAgLyoKLSAgICAgKiBXQVJOSU5HOiAgVGhpcyBwcmVwcm9jZXNzb3IgYXBwcm9hY2ggbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUKLSAgICAgKiAgICAgICAgICAgY2Fubm90IGJlIHVzZWQgd2l0aCBhIGxpYnBuZyBETEwgb2xkZXIgdGhhbiAxLjIuMC0tdGhlCi0gICAgICogICAgICAgICAgIGNvbXBpbGVkLWluIHN5bWJvbHMgZm9yIHRoZSBuZXcgZnVuY3Rpb25zIHdpbGwgbm90IGV4aXN0LgotICAgICAqICAgICAgICAgICAoQ291bGQgdXNlIGRsb3BlbigpIGFuZCBkbHN5bSgpIG9uIFVuaXggYW5kIGNvcnJlc3BvbmRpbmcKLSAgICAgKiAgICAgICAgICAgY2FsbHMgZm9yIFdpbmRvd3MsIGJ1dCBub3QgcG9ydGFibGUuLi4pCi0gICAgICovCi0gICAgewotI2lmZGVmIFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQKLSAgICAgICAgcG5nX3VpbnRfMzIgbW14X2Rpc2FibGVfbWFzayA9IDA7Ci0gICAgICAgIHBuZ191aW50XzMyIGFzbV9mbGFncywgbW14X21hc2s7Ci0gICAgICAgIGludCBjb21waWxlcklEOwotCi0gICAgICAgIGlmIChtYWlucHJvZ19wdHItPm5vbW14ZmlsdGVycykKLSAgICAgICAgICAgIG1teF9kaXNhYmxlX21hc2sgfD0gKCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1NVQiAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1VQICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX0FWRyAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1BBRVRIICk7Ci0gICAgICAgIGlmIChtYWlucHJvZ19wdHItPm5vbW14Y29tYmluZSkKLSAgICAgICAgICAgIG1teF9kaXNhYmxlX21hc2sgfD0gUE5HX0FTTV9GTEFHX01NWF9SRUFEX0NPTUJJTkVfUk9XOwotICAgICAgICBpZiAobWFpbnByb2dfcHRyLT5ub21teGludGVybGFjZSkKLSAgICAgICAgICAgIG1teF9kaXNhYmxlX21hc2sgfD0gUE5HX0FTTV9GTEFHX01NWF9SRUFEX0lOVEVSTEFDRTsKLSAgICAgICAgYXNtX2ZsYWdzID0gcG5nX2dldF9hc21fZmxhZ3MocG5nX3B0cik7Ci0gICAgICAgIHBuZ19zZXRfYXNtX2ZsYWdzKHBuZ19wdHIsIGFzbV9mbGFncyAmIH5tbXhfZGlzYWJsZV9tYXNrKTsKLQotCi0gICAgICAgIC8qIE5vdyBxdWVyeSBsaWJwbmcncyBhc20gc2V0dGluZ3MsIGp1c3QgZm9yIHl1a3MuICBOb3RlIHRoYXQgdGhpcwotICAgICAgICAgKiBkaWZmZXJzIGZyb20gdGhlIHF1ZXJ5aW5nIG9mIGl0cyAqcG90ZW50aWFsKiBNTVggY2FwYWJpbGl0aWVzCi0gICAgICAgICAqIGluIHJlYWRwbmcyX3ZlcnNpb25faW5mbygpOyB0aGlzIGlzIHRydWUgcnVudGltZSB2ZXJpZmljYXRpb24uICovCi0KLSAgICAgICAgYXNtX2ZsYWdzID0gcG5nX2dldF9hc21fZmxhZ3MocG5nX3B0cik7Ci0gICAgICAgIG1teF9tYXNrID0gcG5nX2dldF9tbXhfZmxhZ21hc2soUE5HX1NFTEVDVF9SRUFEIHwgUE5HX1NFTEVDVF9XUklURSwKLSAgICAgICAgICAmY29tcGlsZXJJRCk7Ci0gICAgICAgIGlmIChhc21fZmxhZ3MgJiBQTkdfQVNNX0ZMQUdfTU1YX1NVUFBPUlRfQ09NUElMRUQpCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgIiAgTU1YIHN1cHBvcnQgKCVzIHZlcnNpb24pIGlzIGNvbXBpbGVkIGludG8gbGlicG5nXG4iLAotICAgICAgICAgICAgICBjb21waWxlcklEID09IDE/ICJNU1ZDKysiIDoKLSAgICAgICAgICAgICAgKGNvbXBpbGVySUQgPT0gMj8gIkdOVSBDIiA6ICJ1bmtub3duIikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgTU1YIHN1cHBvcnQgaXMgbm90IGNvbXBpbGVkIGludG8gbGlicG5nXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIE1NWCBpbnN0cnVjdGlvbnMgYXJlICVzc3VwcG9ydGVkIGJ5IENQVVxuIiwKLSAgICAgICAgICAoYXNtX2ZsYWdzICYgUE5HX0FTTV9GTEFHX01NWF9TVVBQT1JUX0lOX0NQVSk/ICIiIDogIm5vdCAiKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIE1NWCByZWFkIHN1cHBvcnQgZm9yIGNvbWJpbmluZyByb3dzIGlzICVzYWJsZWRcbiIsCi0gICAgICAgICAgKGFzbV9mbGFncyAmIFBOR19BU01fRkxBR19NTVhfUkVBRF9DT01CSU5FX1JPVyk/ICJlbiIgOiAiZGlzIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICIgIE1NWCByZWFkIHN1cHBvcnQgZm9yIGV4cGFuZGluZyBpbnRlcmxhY2luZyBpcyAlc2FibGVkXG4iLAotICAgICAgICAgIChhc21fZmxhZ3MgJiBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfSU5URVJMQUNFKT8gImVuIiA6ICJkaXMiKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIE1NWCByZWFkIHN1cHBvcnQgZm9yIFwic3ViXCIgZmlsdGVyIGlzICVzYWJsZWRcbiIsCi0gICAgICAgICAgKGFzbV9mbGFncyAmIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfU1VCKT8gImVuIiA6ICJkaXMiKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIE1NWCByZWFkIHN1cHBvcnQgZm9yIFwidXBcIiBmaWx0ZXIgaXMgJXNhYmxlZFxuIiwKLSAgICAgICAgICAoYXNtX2ZsYWdzICYgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9VUCk/ICJlbiIgOiAiZGlzIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBNTVggcmVhZCBzdXBwb3J0IGZvciBcImF2Z1wiIGZpbHRlciBpcyAlc2FibGVkXG4iLAotICAgICAgICAgIChhc21fZmxhZ3MgJiBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX0FWRyk/ICJlbiIgOiAiZGlzIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBNTVggcmVhZCBzdXBwb3J0IGZvciBcIlBhZXRoXCIgZmlsdGVyIGlzICVzYWJsZWRcbiIsCi0gICAgICAgICAgKGFzbV9mbGFncyAmIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfUEFFVEgpPyAiZW4iIDogImRpcyIpOwotICAgICAgICBhc21fZmxhZ3MgJj0gKG1teF9tYXNrICYgfiggUE5HX0FTTV9GTEFHX01NWF9SRUFEX0NPTUJJTkVfUk9XICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfSU5URVJMQUNFICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfU1VCICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9VUCAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX0FWRyAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfUEFFVEggKSk7Ci0gICAgICAgIGlmIChhc21fZmxhZ3MpCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgIiAgYWRkaXRpb25hbCBNTVggc3VwcG9ydCBpcyBhbHNvIGVuYWJsZWQgKDB4JTAybHgpXG4iLAotICAgICAgICAgICAgICBhc21fZmxhZ3MpOwotI2Vsc2UgIC8qICFQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVEICovCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBNTVggcXVlcnlpbmcgaXMgZGlzYWJsZWQgaW4gbGlicG5nLlxuIik7Ci0jZW5kaWYgLyogP1BOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQgKi8KLSAgICB9Ci0jZW5kaWYKLQotCi0gICAgLyogbWFrZSBzdXJlIHdlIHNhdmUgb3VyIHBvaW50ZXJzIGZvciB1c2UgaW4gcmVhZHBuZzJfZGVjb2RlX2RhdGEoKSAqLwotCi0gICAgbWFpbnByb2dfcHRyLT5wbmdfcHRyID0gcG5nX3B0cjsKLSAgICBtYWlucHJvZ19wdHItPmluZm9fcHRyID0gaW5mb19wdHI7Ci0KLQotICAgIC8qIGFuZCB0aGF0J3MgYWxsIHRoZXJlIGlzIHRvIGluaXRpYWxpemF0aW9uICovCi0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotLyogcmV0dXJucyAwIGZvciBzdWNjZXNzLCAyIGZvciBsaWJwbmcgKGxvbmdqbXApIHByb2JsZW0gKi8KLQotaW50IHJlYWRwbmcyX2RlY29kZV9kYXRhKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0ciwgdWNoICpyYXdidWYsIHVsZyBsZW5ndGgpCi17Ci0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IChwbmdfc3RydWN0cCltYWlucHJvZ19wdHItPnBuZ19wdHI7Ci0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gKHBuZ19pbmZvcCltYWlucHJvZ19wdHItPmluZm9fcHRyOwotCi0KLSAgICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXJlYWRpbmcKLSAgICAgKiBsaWJwbmcgZnVuY3Rpb24gKi8KLQotICAgIGlmIChzZXRqbXAobWFpbnByb2dfcHRyLT5qbXBidWYpKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgICAgICBtYWlucHJvZ19wdHItPnBuZ19wdHIgPSBOVUxMOwotICAgICAgICBtYWlucHJvZ19wdHItPmluZm9fcHRyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSAgICAvKiBoYW5kIG9mZiB0aGUgbmV4dCBjaHVuayBvZiBpbnB1dCBkYXRhIHRvIGxpYnBuZyBmb3IgZGVjb2RpbmcgKi8KLQotICAgIHBuZ19wcm9jZXNzX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIHJhd2J1ZiwgbGVuZ3RoKTsKLQotICAgIHJldHVybiAwOwotfQotCi0KLQotCi1zdGF0aWMgdm9pZCByZWFkcG5nMl9pbmZvX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgICBtYWlucHJvZ19pbmZvICAqbWFpbnByb2dfcHRyOwotICAgIGludCAgY29sb3JfdHlwZSwgYml0X2RlcHRoOwotICAgIGRvdWJsZSAgZ2FtbWE7Ci0KLQotICAgIC8qIHNldGptcCgpIGRvZXNuJ3QgbWFrZSBzZW5zZSBoZXJlLCBiZWNhdXNlIHdlJ2QgZWl0aGVyIGhhdmUgdG8gZXhpdCgpLAotICAgICAqIGxvbmdqbXAoKSBvdXJzZWx2ZXMsIG9yIHJldHVybiBjb250cm9sIHRvIGxpYnBuZywgd2hpY2ggZG9lc24ndCB3YW50Ci0gICAgICogdG8gc2VlIHVzIGFnYWluLiAgQnkgbm90IGRvaW5nIGFueXRoaW5nIGhlcmUsIGxpYnBuZyB3aWxsIGluc3RlYWQganVtcAotICAgICAqIHRvIHJlYWRwbmcyX2RlY29kZV9kYXRhKCksIHdoaWNoIGNhbiByZXR1cm4gYW4gZXJyb3IgdmFsdWUgdG8gdGhlIG1haW4KLSAgICAgKiBwcm9ncmFtLiAqLwotCi0KLSAgICAvKiByZXRyaWV2ZSB0aGUgcG9pbnRlciB0byBvdXIgc3BlY2lhbC1wdXJwb3NlIHN0cnVjdCwgdXNpbmcgdGhlIHBuZ19wdHIKLSAgICAgKiB0aGF0IGxpYnBuZyBwYXNzZWQgYmFjayB0byB1cyAoaS5lLiwgbm90IGEgZ2xvYmFsIHRoaXMgdGltZS0tdGhlcmUncwotICAgICAqIG5vIHJlYWwgZGlmZmVyZW5jZSBmb3IgYSBzaW5nbGUgaW1hZ2UsIGJ1dCBmb3IgYSBtdWx0aXRocmVhZGVkIGJyb3dzZXIKLSAgICAgKiBkZWNvZGluZyBzZXZlcmFsIFBORyBpbWFnZXMgYXQgdGhlIHNhbWUgdGltZSwgb25lIG5lZWRzIHRvIGF2b2lkIG1peGluZwotICAgICAqIHVwIGRpZmZlcmVudCBpbWFnZXMnIHN0cnVjdHMpICovCi0KLSAgICBtYWlucHJvZ19wdHIgPSBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKTsKLQotICAgIGlmIChtYWlucHJvZ19wdHIgPT0gTlVMTCkgeyAgICAgICAgIC8qIHdlIGJlIGhvc2VkICovCi0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICJyZWFkcG5nMiBlcnJvcjogIG1haW4gc3RydWN0IG5vdCByZWNvdmVyYWJsZSBpbiBpbmZvX2NhbGxiYWNrLlxuIik7Ci0gICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICByZXR1cm47Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHdlIGNvdWxkIGNhbGwgb3VyIGVycm9yLWhhbmRsZXIganVzdCBsaWtlIGxpYnBuZwotICAgICAgICAgKiBkb2VzLCB3aGljaCB3b3VsZCBlZmZlY3RpdmVseSB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uICBTaW5jZSB0aGlzCi0gICAgICAgICAqIGNhbiBvbmx5IGhhcHBlbiBpZiBwbmdfcHRyIGdldHMgcmVkaXJlY3RlZCBzb21ld2hlcmUgb2RkIG9yIHRoZQotICAgICAgICAgKiBtYWluIFBORyBzdHJ1Y3QgZ2V0cyB3aXBlZCwgd2UncmUgcHJvYmFibHkgdG9hc3QgYW55d2F5LiAgKElmCi0gICAgICAgICAqIHBuZ19wdHIgaXRzZWxmIGlzIE5VTEwsIHdlIHdvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkLikKLSAgICAgICAgICovCi0gICAgfQotCi0KLSAgICAvKiB0aGlzIGlzIGp1c3QgbGlrZSBpbiB0aGUgbm9uLXByb2dyZXNzaXZlIGNhc2UgKi8KLQotICAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJm1haW5wcm9nX3B0ci0+d2lkdGgsCi0gICAgICAmbWFpbnByb2dfcHRyLT5oZWlnaHQsICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQotCi0gICAgLyogc2luY2Ugd2Uga25vdyB3ZSd2ZSByZWFkIGFsbCBvZiB0aGUgUE5HIGZpbGUncyAiaGVhZGVyIiAoaS5lLiwgdXAKLSAgICAgKiB0byBJREFUKSwgd2UgY2FuIGNoZWNrIGZvciBhIGJhY2tncm91bmQgY29sb3IgaGVyZSAqLwotCi0gICAgaWYgKG1haW5wcm9nX3B0ci0+bmVlZF9iZ2NvbG9yICYmCi0gICAgICAgIHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX2JLR0QpKQotICAgIHsKLSAgICAgICAgcG5nX2NvbG9yXzE2cCBwQmFja2dyb3VuZDsKLQotICAgICAgICAvKiBpdCBpcyBub3Qgb2J2aW91cyBmcm9tIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiwgYnV0IHRoaXMgZnVuY3Rpb24KLSAgICAgICAgICogdGFrZXMgYSBwb2ludGVyIHRvIGEgcG9pbnRlciwgYW5kIGl0IGFsd2F5cyByZXR1cm5zIHZhbGlkIHJlZCwKLSAgICAgICAgICogZ3JlZW4gYW5kIGJsdWUgdmFsdWVzLCByZWdhcmRsZXNzIG9mIGNvbG9yX3R5cGU6ICovCi0gICAgICAgIHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJnBCYWNrZ3JvdW5kKTsKLQotICAgICAgICAvKiBob3dldmVyLCBpdCBhbHdheXMgcmV0dXJucyB0aGUgcmF3IGJLR0QgZGF0YSwgcmVnYXJkbGVzcyBvZiBhbnkKLSAgICAgICAgICogYml0LWRlcHRoIHRyYW5zZm9ybWF0aW9ucywgc28gY2hlY2sgZGVwdGggYW5kIGFkanVzdCBpZiBuZWNlc3NhcnkgKi8KLSAgICAgICAgaWYgKGJpdF9kZXB0aCA9PSAxNikgewotICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19yZWQgICA9IHBCYWNrZ3JvdW5kLT5yZWQgICA+PiA4OwotICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19ncmVlbiA9IHBCYWNrZ3JvdW5kLT5ncmVlbiA+PiA4OwotICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19ibHVlICA9IHBCYWNrZ3JvdW5kLT5ibHVlICA+PiA4OwotICAgICAgICB9IGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBiaXRfZGVwdGggPCA4KSB7Ci0gICAgICAgICAgICBpZiAoYml0X2RlcHRoID09IDEpCi0gICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19yZWQgPSBtYWlucHJvZ19wdHItPmJnX2dyZWVuID0KLSAgICAgICAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfYmx1ZSA9IHBCYWNrZ3JvdW5kLT5ncmF5PyAyNTUgOiAwOwotICAgICAgICAgICAgZWxzZSBpZiAoYml0X2RlcHRoID09IDIpCi0gICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19yZWQgPSBtYWlucHJvZ19wdHItPmJnX2dyZWVuID0KLSAgICAgICAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfYmx1ZSA9ICgyNTUvMykgKiBwQmFja2dyb3VuZC0+Z3JheTsKLSAgICAgICAgICAgIGVsc2UgLyogYml0X2RlcHRoID09IDQgKi8KLSAgICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX3JlZCA9IG1haW5wcm9nX3B0ci0+YmdfZ3JlZW4gPQotICAgICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19ibHVlID0gKDI1NS8xNSkgKiBwQmFja2dyb3VuZC0+Z3JheTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfcmVkICAgPSAodWNoKXBCYWNrZ3JvdW5kLT5yZWQ7Ci0gICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX2dyZWVuID0gKHVjaClwQmFja2dyb3VuZC0+Z3JlZW47Ci0gICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX2JsdWUgID0gKHVjaClwQmFja2dyb3VuZC0+Ymx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyogYXMgYmVmb3JlLCBsZXQgbGlicG5nIGV4cGFuZCBwYWxldHRlIGltYWdlcyB0byBSR0IsIGxvdy1iaXQtZGVwdGgKLSAgICAgKiBncmF5c2NhbGUgaW1hZ2VzIHRvIDggYml0cywgdHJhbnNwYXJlbmN5IGNodW5rcyB0byBmdWxsIGFscGhhIGNoYW5uZWw7Ci0gICAgICogc3RyaXAgMTYtYml0LXBlci1zYW1wbGUgaW1hZ2VzIHRvIDggYml0cyBwZXIgc2FtcGxlOyBhbmQgY29udmVydAotICAgICAqIGdyYXlzY2FsZSB0byBSR0JbQV0gKi8KLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOwotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYgYml0X2RlcHRoIDwgOCkKLSAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0gICAgaWYgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3RSTlMpKQotICAgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKLSAgICBpZiAoYml0X2RlcHRoID09IDE2KQotICAgICAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOwotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKLSAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOwotCi0KLSAgICAvKiBVbmxpa2UgdGhlIGJhc2ljIHZpZXdlciwgd2hpY2ggd2FzIGRlc2lnbmVkIHRvIG9wZXJhdGUgb24gbG9jYWwgZmlsZXMsCi0gICAgICogdGhpcyBwcm9ncmFtIGlzIGludGVuZGVkIHRvIHNpbXVsYXRlIGEgd2ViIGJyb3dzZXItLWV2ZW4gdGhvdWdoIHdlCi0gICAgICogYWN0dWFsbHkgcmVhZCBmcm9tIGEgbG9jYWwgZmlsZSwgdG9vLiAgQnV0IGJlY2F1c2Ugd2UgYXJlIHByZXRlbmRpbmcKLSAgICAgKiB0aGF0IG1vc3Qgb2YgdGhlIGltYWdlcyBvcmlnaW5hdGUgb24gdGhlIEludGVybmV0LCB3ZSBmb2xsb3cgdGhlIHJlY29tLQotICAgICAqIG1lbmRhdGlvbiBvZiB0aGUgc1JHQiBwcm9wb3NhbCBhbmQgdHJlYXQgdW5sYWJlbGxlZCBpbWFnZXMgKG5vIGdBTUEKLSAgICAgKiBjaHVuaykgYXMgZXhpc3RpbmcgaW4gdGhlIHNSR0IgY29sb3Igc3BhY2UuICBUaGF0IGlzLCB3ZSBhc3N1bWUgdGhhdAotICAgICAqIHN1Y2ggaW1hZ2VzIGhhdmUgYSBmaWxlIGdhbW1hIG9mIDAuNDU0NTUsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgUEMtbGlrZQotICAgICAqIGRpc3BsYXkgc3lzdGVtLiAgVGhpcyBjaGFuZ2UgaW4gYXNzdW1wdGlvbnMgd2lsbCBoYXZlIG5vIGVmZmVjdCBvbiBhCi0gICAgICogUEMtbGlrZSBzeXN0ZW0sIGJ1dCBvbiBhIE1hYywgU0dJLCBOZVhUIG9yIG90aGVyIHN5c3RlbSB3aXRoIGEgbm9uLQotICAgICAqIGlkZW50aXR5IGxvb2t1cCB0YWJsZSwgaXQgd2lsbCBkYXJrZW4gdW5sYWJlbGxlZCBpbWFnZXMsIHdoaWNoIGVmZmVjLQotICAgICAqIHRpdmVseSBmYXZvcnMgaW1hZ2VzIGZyb20gUEMtbGlrZSBzeXN0ZW1zIG92ZXIgdGhvc2Ugb3JpZ2luYXRpbmcgb24KLSAgICAgKiB0aGUgbG9jYWwgcGxhdGZvcm0uICBOb3RlIHRoYXQgbWFpbnByb2dfcHRyLT5kaXNwbGF5X2V4cG9uZW50IGlzIHRoZQotICAgICAqICJnYW1tYSIgdmFsdWUgZm9yIHRoZSBlbnRpcmUgZGlzcGxheSBzeXN0ZW0sIGkuZS4sIHRoZSBwcm9kdWN0IG9mCi0gICAgICogTFVUX2V4cG9uZW50IGFuZCBDUlRfZXhwb25lbnQuICovCi0KLSAgICBpZiAocG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZ2FtbWEpKQotICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIG1haW5wcm9nX3B0ci0+ZGlzcGxheV9leHBvbmVudCwgZ2FtbWEpOwotICAgIGVsc2UKLSAgICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBtYWlucHJvZ19wdHItPmRpc3BsYXlfZXhwb25lbnQsIDAuNDU0NTUpOwotCi0KLSAgICAvKiB3ZSdsbCBsZXQgbGlicG5nIGV4cGFuZCBpbnRlcmxhY2VkIGltYWdlcywgdG9vICovCi0KLSAgICBtYWlucHJvZ19wdHItPnBhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotCi0KLSAgICAvKiBhbGwgdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiByZWdpc3RlcmVkOyBub3cgdXBkYXRlIGluZm9fcHRyIGRhdGEgYW5kCi0gICAgICogdGhlbiBnZXQgcm93Ynl0ZXMgYW5kIGNoYW5uZWxzICovCi0KLSAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICBtYWlucHJvZ19wdHItPnJvd2J5dGVzID0gKGludClwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICBtYWlucHJvZ19wdHItPmNoYW5uZWxzID0gcG5nX2dldF9jaGFubmVscyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLQotICAgIC8qIENhbGwgdGhlIG1haW4gcHJvZ3JhbSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbWFnZSBidWZmZXIgYW5kCi0gICAgICogaW5pdGlhbGl6ZSB3aW5kb3dzIGFuZCB3aGF0bm90LiAgKFRoZSBvbGQtc3R5bGUgZnVuY3Rpb24tcG9pbnRlcgotICAgICAqIGludm9jYXRpb24gaXMgdXNlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGEgZmV3IHN1cHBvc2VkbHkgQU5TSQotICAgICAqIGNvbXBpbGVycyB0aGF0IG5ldmVydGhlbGVzcyBiYXJmIG9uICJmbl9wdHIoKSItc3R5bGUgc3ludGF4LikgKi8KLQotICAgICgqbWFpbnByb2dfcHRyLT5tYWlucHJvZ19pbml0KSgpOwotCi0KLSAgICAvKiBhbmQgdGhhdCB0YWtlcyBjYXJlIG9mIGluaXRpYWxpemF0aW9uICovCi0KLSAgICByZXR1cm47Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQgcmVhZHBuZzJfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd19udW0sIGludCBwYXNzKQotewotICAgIG1haW5wcm9nX2luZm8gICptYWlucHJvZ19wdHI7Ci0KLQotICAgIC8qIGZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlIHJvdyBkaWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIHBhc3M7IGlmIG5vdCwKLSAgICAgKiBub3RoaW5nIHRvIGNvbWJpbmUgb3IgZGlzcGxheSAqLwotCi0gICAgaWYgKCFuZXdfcm93KQotICAgICAgICByZXR1cm47Ci0KLQotICAgIC8qIHJldHJpZXZlIHRoZSBwb2ludGVyIHRvIG91ciBzcGVjaWFsLXB1cnBvc2Ugc3RydWN0IHNvIHdlIGNhbiBhY2Nlc3MKLSAgICAgKiB0aGUgb2xkIHJvd3MgYW5kIGltYWdlLWRpc3BsYXkgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQotICAgIG1haW5wcm9nX3B0ciA9IHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19wdHIpOwotCi0KLSAgICAvKiBzYXZlIHRoZSBwYXNzIG51bWJlciBmb3Igb3B0aW9uYWwgdXNlIGJ5IHRoZSBmcm9udCBlbmQgKi8KLQotICAgIG1haW5wcm9nX3B0ci0+cGFzcyA9IHBhc3M7Ci0KLQotICAgIC8qIGhhdmUgbGlicG5nIGVpdGhlciBjb21iaW5lIHRoZSBuZXcgcm93IGRhdGEgd2l0aCB0aGUgZXhpc3Rpbmcgcm93IGRhdGEKLSAgICAgKiBmcm9tIHByZXZpb3VzIHBhc3NlcyAoaWYgaW50ZXJsYWNlZCkgb3IgZWxzZSBqdXN0IGNvcHkgdGhlIG5ldyByb3cKLSAgICAgKiBpbnRvIHRoZSBtYWluIHByb2dyYW0ncyBpbWFnZSBidWZmZXIgKi8KLQotICAgIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyhwbmdfcHRyLCBtYWlucHJvZ19wdHItPnJvd19wb2ludGVyc1tyb3dfbnVtXSwKLSAgICAgIG5ld19yb3cpOwotCi0KLSAgICAvKiBmaW5hbGx5LCBjYWxsIHRoZSBkaXNwbGF5IHJvdXRpbmUgaW4gdGhlIG1haW4gcHJvZ3JhbSB3aXRoIHRoZSBudW1iZXIKLSAgICAgKiBvZiB0aGUgcm93IHdlIGp1c3QgdXBkYXRlZCAqLwotCi0gICAgKCptYWlucHJvZ19wdHItPm1haW5wcm9nX2Rpc3BsYXlfcm93KShyb3dfbnVtKTsKLQotCi0gICAgLyogYW5kIHdlJ3JlIHJlYWR5IGZvciBtb3JlICovCi0KLSAgICByZXR1cm47Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQgcmVhZHBuZzJfZW5kX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgICBtYWlucHJvZ19pbmZvICAqbWFpbnByb2dfcHRyOwotCi0KLSAgICAvKiByZXRyaWV2ZSB0aGUgcG9pbnRlciB0byBvdXIgc3BlY2lhbC1wdXJwb3NlIHN0cnVjdCAqLwotCi0gICAgbWFpbnByb2dfcHRyID0gcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7Ci0KLQotICAgIC8qIGxldCB0aGUgbWFpbiBwcm9ncmFtIGtub3cgdGhhdCBpdCBzaG91bGQgZmx1c2ggYW55IGJ1ZmZlcmVkIGltYWdlCi0gICAgICogZGF0YSB0byB0aGUgZGlzcGxheSBub3cgYW5kIHNldCBhICJkb25lIiBmbGFnIG9yIHdoYXRldmVyLCBidXQgbm90ZQotICAgICAqIHRoYXQgaXQgU0hPVUxEIE5PVCBERVNUUk9ZIFRIRSBQTkcgU1RSVUNUUyBZRVQtLWluIG90aGVyIHdvcmRzLCBkbwotICAgICAqIE5PVCBjYWxsIHJlYWRwbmcyX2NsZWFudXAoKSBlaXRoZXIgaGVyZSBvciBpbiB0aGUgZmluaXNoX2Rpc3BsYXkoKQotICAgICAqIHJvdXRpbmU7IHdhaXQgdW50aWwgY29udHJvbCByZXR1cm5zIHRvIHRoZSBtYWluIHByb2dyYW0gdmlhCi0gICAgICogcmVhZHBuZzJfZGVjb2RlX2RhdGEoKSAqLwotCi0gICAgKCptYWlucHJvZ19wdHItPm1haW5wcm9nX2ZpbmlzaF9kaXNwbGF5KSgpOwotCi0KLSAgICAvKiBhbGwgZG9uZSAqLwotCi0gICAgcmV0dXJuOwotfQotCi0KLQotCi0KLXZvaWQgcmVhZHBuZzJfY2xlYW51cChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpCi17Ci0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IChwbmdfc3RydWN0cCltYWlucHJvZ19wdHItPnBuZ19wdHI7Ci0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gKHBuZ19pbmZvcCltYWlucHJvZ19wdHItPmluZm9fcHRyOwotCi0gICAgaWYgKHBuZ19wdHIgJiYgaW5mb19wdHIpCi0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotCi0gICAgbWFpbnByb2dfcHRyLT5wbmdfcHRyID0gTlVMTDsKLSAgICBtYWlucHJvZ19wdHItPmluZm9fcHRyID0gTlVMTDsKLX0KLQotCi0KLQotCi1zdGF0aWMgdm9pZCByZWFkcG5nMl9lcnJvcl9oYW5kbGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtc2cpCi17Ci0gICAgbWFpbnByb2dfaW5mbyAgKm1haW5wcm9nX3B0cjsKLQotICAgIC8qIFRoaXMgZnVuY3Rpb24sIGFzaWRlIGZyb20gdGhlIGV4dHJhIHN0ZXAgb2YgcmV0cmlldmluZyB0aGUgImVycm9yCi0gICAgICogcG9pbnRlciIgKGJlbG93KSBhbmQgdGhlIGZhY3QgdGhhdCBpdCBleGlzdHMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIHJhdGhlciB0aGFuIHdpdGhpbiBsaWJwbmcsIGlzIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byBsaWJwbmcncwotICAgICAqIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4gIFRoZSBzZWNvbmQgcG9pbnQgaXMgY3JpdGljYWw6ICBzaW5jZSBib3RoCi0gICAgICogc2V0am1wKCkgYW5kIGxvbmdqbXAoKSBhcmUgY2FsbGVkIGZyb20gdGhlIHNhbWUgY29kZSwgdGhleSBhcmUKLSAgICAgKiBndWFyYW50ZWVkIHRvIGhhdmUgY29tcGF0aWJsZSBub3Rpb25zIG9mIGhvdyBiaWcgYSBqbXBfYnVmIGlzLAotICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBfQlNEX1NPVVJDRSBvciBhbnl0aGluZyBlbHNlIGhhcyAob3IgaGFzIG5vdCkKLSAgICAgKiBiZWVuIGRlZmluZWQuICovCi0KLSAgICBmcHJpbnRmKHN0ZGVyciwgInJlYWRwbmcyIGxpYnBuZyBlcnJvcjogJXNcbiIsIG1zZyk7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICBtYWlucHJvZ19wdHIgPSBwbmdfZ2V0X2Vycm9yX3B0cihwbmdfcHRyKTsKLSAgICBpZiAobWFpbnByb2dfcHRyID09IE5VTEwpIHsgICAgICAgICAvKiB3ZSBhcmUgY29tcGxldGVseSBob3NlZCBub3cgKi8KLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgInJlYWRwbmcyIHNldmVyZSBlcnJvcjogIGptcGJ1ZiBub3QgcmVjb3ZlcmFibGU7IHRlcm1pbmF0aW5nLlxuIik7Ci0gICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICBleGl0KDk5KTsKLSAgICB9Ci0KLSAgICBsb25nam1wKG1haW5wcm9nX3B0ci0+am1wYnVmLCAxKTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuaCBiL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmZmZiNC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JlYWRwbmcyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcnBuZzIgLSBwcm9ncmVzc2l2ZS1tb2RlbCBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICByZWFkcG5nMi5oCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgVFJVRQotIyAgZGVmaW5lIFRSVUUgMQotIyAgZGVmaW5lIEZBTFNFIDAKLSNlbmRpZgotCi0jaWZuZGVmIE1BWAotIyAgZGVmaW5lIE1BWChhLGIpICAoKGEpID4gKGIpPyAoYSkgOiAoYikpCi0jICBkZWZpbmUgTUlOKGEsYikgICgoYSkgPCAoYik/IChhKSA6IChiKSkKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSMgIGRlZmluZSBUcmFjZSh4KSAge2ZwcmludGYgeCA7IGZmbHVzaChzdGRlcnIpOyBmZmx1c2goc3Rkb3V0KTt9Ci0jZWxzZQotIyAgZGVmaW5lIFRyYWNlKHgpICA7Ci0jZW5kaWYKLQotZW51bSBycG5nMl9zdGF0ZXMgewotICAgIGtQcmVJbml0ID0gMCwKLSAgICBrV2luZG93SW5pdCwKLSAgICBrRG9uZQotfTsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWNoOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdXNoOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdWxnOwotCi10eXBlZGVmIHN0cnVjdCBfbWFpbnByb2dfaW5mbyB7Ci0gICAgZG91YmxlIGRpc3BsYXlfZXhwb25lbnQ7Ci0gICAgdWxnIHdpZHRoOwotICAgIHVsZyBoZWlnaHQ7Ci0gICAgdm9pZCAqcG5nX3B0cjsKLSAgICB2b2lkICppbmZvX3B0cjsKLSAgICB2b2lkICgqbWFpbnByb2dfaW5pdCkodm9pZCk7Ci0gICAgdm9pZCAoKm1haW5wcm9nX2Rpc3BsYXlfcm93KSh1bGcgcm93X251bSk7Ci0gICAgdm9pZCAoKm1haW5wcm9nX2ZpbmlzaF9kaXNwbGF5KSh2b2lkKTsKLSAgICB1Y2ggKmltYWdlX2RhdGE7Ci0gICAgdWNoICoqcm93X3BvaW50ZXJzOwotICAgIGptcF9idWYgam1wYnVmOwotICAgIGludCBwYXNzZXM7ICAgICAgICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgIGludCBwYXNzOwotICAgIGludCByb3dieXRlczsKLSAgICBpbnQgY2hhbm5lbHM7Ci0gICAgaW50IG5lZWRfYmdjb2xvcjsKLSNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQotICAgIGludCBub21teGZpbHRlcnM7Ci0gICAgaW50IG5vbW14Y29tYmluZTsKLSAgICBpbnQgbm9tbXhpbnRlcmxhY2U7Ci0jZW5kaWYKLSAgICBpbnQgc3RhdGU7Ci0gICAgdWNoIGJnX3JlZDsKLSAgICB1Y2ggYmdfZ3JlZW47Ci0gICAgdWNoIGJnX2JsdWU7Ci19IG1haW5wcm9nX2luZm87Ci0KLQotLyogcHJvdG90eXBlcyBmb3IgcHVibGljIGZ1bmN0aW9ucyBpbiByZWFkcG5nMi5jICovCi0KLXZvaWQgcmVhZHBuZzJfdmVyc2lvbl9pbmZvKHZvaWQpOwotCi1pbnQgcmVhZHBuZzJfY2hlY2tfc2lnKHVjaCAqc2lnLCBpbnQgbnVtKTsKLQotaW50IHJlYWRwbmcyX2luaXQobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKTsKLQotaW50IHJlYWRwbmcyX2RlY29kZV9kYXRhKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0ciwgdWNoICpyYXdidWYsIHVsZyBsZW5ndGgpOwotCi12b2lkIHJlYWRwbmcyX2NsZWFudXAobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKTsKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBwbS5jIGIvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcHBtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOWE1NmQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9yZWFkcHBtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcnBuZyAtIHNpbXBsZSBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHBwbS5jCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIFRoaXMgaXMgYSBzcGVjaWFsLXB1cnBvc2UgcmVwbGFjZW1lbnQgZm9yIHJlYWRwbmcuYyB0aGF0IGFsbG93cyBiaW5hcnkKLSAgIFBQTSBmaWxlcyB0byBiZSB1c2VkIGluIHBsYWNlIG9mIFBORyBpbWFnZXMuCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAicmVhZHBuZy5oIiAgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcHVibGljIHByb3RvdHlwZXMgKi8KLQotCi11bGcgIHdpZHRoLCBoZWlnaHQ7Ci1pbnQgIGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgY2hhbm5lbHM7Ci11Y2ggICppbWFnZV9kYXRhID0gTlVMTDsKLUZJTEUgKnNhdmVkX2luZmlsZTsKLQotCi12b2lkIHJlYWRwbmdfdmVyc2lvbl9pbmZvKCkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIENvbXBpbGVkIHdpdGhvdXQgbGlicG5nLCB6bGliIG9yIFBCTVBMVVMvTmV0UEJNLlxuIik7Ci19Ci0KLQotLyogcmV0dXJuIHZhbHVlID0gMCBmb3Igc3VjY2VzcywgMSBmb3IgYmFkIHNpZywgMiBmb3IgYmFkIElIRFIsIDQgZm9yIG5vIG1lbSAqLwotCi1pbnQgcmVhZHBuZ19pbml0KEZJTEUgKmluZmlsZSwgdWxnICpwV2lkdGgsIHVsZyAqcEhlaWdodCkKLXsKLSAgICBzdGF0aWMgdWNoIHBwbWxpbmVbMjU2XTsKLSAgICBpbnQgbWF4dmFsOwotCi0KLSAgICBzYXZlZF9pbmZpbGUgPSBpbmZpbGU7Ci0KLSAgICBmZ2V0cyhwcG1saW5lLCAyNTYsIGluZmlsZSk7Ci0gICAgaWYgKHBwbWxpbmVbMF0gIT0gJ1AnIHx8IHBwbWxpbmVbMV0gIT0gJzYnKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6ICBub3QgYSBQUE0gZmlsZVxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICAvKiBwb3NzaWJsZSBjb2xvciB0eXBlczogIFA1ID0gZ3JheXNjYWxlICgwKSwgUDYgPSBSR0IgKDIpLCBQOCA9IFJHQkEgKDYpICovCi0gICAgaWYgKHBwbWxpbmVbMV0gPT0gJzYnKSB7Ci0gICAgICAgIGNvbG9yX3R5cGUgPSAyOwotICAgICAgICBjaGFubmVscyA9IDM7Ci0gICAgfSBlbHNlIGlmIChwcG1saW5lWzFdID09ICc4JykgewotICAgICAgICBjb2xvcl90eXBlID0gNjsKLSAgICAgICAgY2hhbm5lbHMgPSA0OwotICAgIH0gZWxzZSAvKiBpZiAocHBtbGluZVsxXSA9PSAnNScpICovIHsKLSAgICAgICAgY29sb3JfdHlwZSA9IDA7Ci0gICAgICAgIGNoYW5uZWxzID0gMTsKLSAgICB9Ci0KLSAgICBkbyB7Ci0gICAgICAgIGZnZXRzKHBwbWxpbmUsIDI1NiwgaW5maWxlKTsKLSAgICB9IHdoaWxlIChwcG1saW5lWzBdID09ICcjJyk7Ci0gICAgc3NjYW5mKHBwbWxpbmUsICIlbHUgJWx1IiwgJndpZHRoLCAmaGVpZ2h0KTsKLQotICAgIGRvIHsKLSAgICAgICAgZmdldHMocHBtbGluZSwgMjU2LCBpbmZpbGUpOwotICAgIH0gd2hpbGUgKHBwbWxpbmVbMF0gPT0gJyMnKTsKLSAgICBzc2NhbmYocHBtbGluZSwgIiVkIiwgJm1heHZhbCk7Ci0gICAgaWYgKG1heHZhbCAhPSAyNTUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogIG1heHZhbCA9ICVkXG4iLCBtYXh2YWwpOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgYml0X2RlcHRoID0gODsKLQotICAgICpwV2lkdGggPSB3aWR0aDsKLSAgICAqcEhlaWdodCA9IGhlaWdodDsKLQotICAgIHJldHVybiAwOwotfQotCi0KLQotCi0vKiByZXR1cm5zIDAgaWYgc3VjY2VlZHMsIDEgaWYgZmFpbHMgZHVlIHRvIG5vIGJLR0QgY2h1bmssIDIgaWYgbGlicG5nIGVycm9yOwotICogc2NhbGVzIHZhbHVlcyB0byA4LWJpdCBpZiBuZWNlc3NhcnkgKi8KLQotaW50IHJlYWRwbmdfZ2V0X2JnY29sb3IodWNoICpyZWQsIHVjaCAqZ3JlZW4sIHVjaCAqYmx1ZSkKLXsKLSAgICByZXR1cm4gMTsKLX0KLQotCi0KLQotLyogZGlzcGxheV9leHBvbmVudCA9PSBMVVRfZXhwb25lbnQgKiBDUlRfZXhwb25lbnQgKi8KLQotdWNoICpyZWFkcG5nX2dldF9pbWFnZShkb3VibGUgZGlzcGxheV9leHBvbmVudCwgaW50ICpwQ2hhbm5lbHMsIHVsZyAqcFJvd2J5dGVzKQotewotICAgIHVsZyAgcm93Ynl0ZXM7Ci0KLQotICAgIC8qIGV4cGFuZCBwYWxldHRlIGltYWdlcyB0byBSR0IsIGxvdy1iaXQtZGVwdGggZ3JheXNjYWxlIGltYWdlcyB0byA4IGJpdHMsCi0gICAgICogdHJhbnNwYXJlbmN5IGNodW5rcyB0byBmdWxsIGFscGhhIGNoYW5uZWw7IHN0cmlwIDE2LWJpdC1wZXItc2FtcGxlCi0gICAgICogaW1hZ2VzIHRvIDggYml0cyBwZXIgc2FtcGxlOyBhbmQgY29udmVydCBncmF5c2NhbGUgdG8gUkdCW0FdICovCi0KLSAgICAvKiBHUlIgV0FSTklORzogIGdyYXlzY2FsZSBuZWVkcyB0byBiZSBleHBhbmRlZCBhbmQgY2hhbm5lbHMgcmVzZXQhICovCi0KLSAgICAqcFJvd2J5dGVzID0gcm93Ynl0ZXMgPSBjaGFubmVscyp3aWR0aDsKLSAgICAqcENoYW5uZWxzID0gY2hhbm5lbHM7Ci0KLSAgICBpZiAoKGltYWdlX2RhdGEgPSAodWNoICopbWFsbG9jKHJvd2J5dGVzKmhlaWdodCkpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgVHJhY2UoKHN0ZGVyciwgInJlYWRwbmdfZ2V0X2ltYWdlOiAgcm93Ynl0ZXMgPSAlbGQsIGhlaWdodCA9ICVsZFxuIiwgcm93Ynl0ZXMsIGhlaWdodCkpOwotCi0KLSAgICAvKiBub3cgd2UgY2FuIGdvIGFoZWFkIGFuZCBqdXN0IHJlYWQgdGhlIHdob2xlIGltYWdlICovCi0KLSAgICBmcmVhZChpbWFnZV9kYXRhLCAxTCwgcm93Ynl0ZXMqaGVpZ2h0LCBzYXZlZF9pbmZpbGUpOwotCi0KLSAgICByZXR1cm4gaW1hZ2VfZGF0YTsKLX0KLQotCi12b2lkIHJlYWRwbmdfY2xlYW51cChpbnQgZnJlZV9pbWFnZV9kYXRhKQotewotICAgIGlmIChmcmVlX2ltYWdlX2RhdGEgJiYgaW1hZ2VfZGF0YSkgewotICAgICAgICBmcmVlKGltYWdlX2RhdGEpOwotICAgICAgICBpbWFnZV9kYXRhID0gTlVMTDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL3Jwbmctd2luLmMgYi9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL3Jwbmctd2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMjA5NjEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9ycG5nLXdpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHJwbmcgLSBzaW1wbGUgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBuZy13aW4uYwotCi0gICBUaGlzIHByb2dyYW0gZGVjb2RlcyBhbmQgZGlzcGxheXMgUE5HIGltYWdlcywgd2l0aCBnYW1tYSBjb3JyZWN0aW9uIGFuZAotICAgb3B0aW9uYWxseSB3aXRoIGEgdXNlci1zcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvciAoaW4gY2FzZSB0aGUgaW1hZ2UgaGFzCi0gICB0cmFuc3BhcmVuY3kpLiAgSXQgaXMgdmVyeSBuZWFybHkgdGhlIG1vc3QgYmFzaWMgUE5HIHZpZXdlciBwb3NzaWJsZS4KLSAgIFRoaXMgdmVyc2lvbiBpcyBmb3IgMzItYml0IFdpbmRvd3M7IGl0IG1heSBjb21waWxlIHVuZGVyIDE2LWJpdCBXaW5kb3dzCi0gICB3aXRoIGEgbGl0dGxlIHR3ZWFraW5nIChvciBtYXliZSBub3QpLgotCi0gICB0byBkbzoKLSAgICAtIGhhbmRsZSBxdW90ZWQgY29tbWFuZC1saW5lIGFyZ3MgKGVzcGVjaWFsbHkgZmlsZW5hbWVzIHdpdGggc3BhY2VzKQotICAgIC0gaGF2ZSBtaW5pbXVtIHdpbmRvdyB3aWR0aDogIG9oIHdlbGwKLSAgICAtIHVzZSAlLjEwMjNzIHRvIHNpbXBsaWZ5IHRydW5jYXRpb24gb2YgdGl0bGUtYmFyIHN0cmluZz8KLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgQ2hhbmdlbG9nOgotICAgIC0gMS4wMDogIGluaXRpYWwgcHVibGljIHJlbGVhc2UKLSAgICAtIDEuMDE6ICBtb2RpZmllZCB0byBhbGxvdyBhYmJyZXZpYXRlZCBvcHRpb25zOyBmaXhlZCBsb25nL3Vsb25nIG1pcy0KLSAgICAgICAgICAgICAgbWF0Y2g7IHN3aXRjaGVkIHRvIHBuZ19qbXBidWYoKSBtYWNybwotICAgIC0gMS4wMjogIGFkZGVkIGV4dHJhIHNldCBvZiBwYXJlbnRoZXNlcyB0byBwbmdfam1wYnVmKCkgbWFjcm87IGZpeGVkCi0gICAgICAgICAgICAgIGNvbW1hbmQtbGluZSBwYXJzaW5nIGJ1ZwotICAgIC0gMS4xMDogIGVuYWJsZWQgIm1lc3NhZ2Ugd2luZG93Ii9jb25zb2xlICh0aGFua3MgdG8gRGF2aWQgR2VsZHJlaWNoKQotICAgIC0gMi4wMDogIGR1YWwtbGljZW5zZWQgKGFkZGVkIEdOVSBHUEwpCi0gICAgLSAyLjAxOiAgZml4ZWQgaW1wcm9wZXIgZGlzcGxheSBvZiB1c2FnZSBzY3JlZW4gb24gUE5HIGVycm9yKHMpCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgUFJPR05BTUUgICJycG5nLXdpbiIKLSNkZWZpbmUgTE9OR05BTUUgICJTaW1wbGUgUE5HIFZpZXdlciBmb3IgV2luZG93cyIKLSNkZWZpbmUgVkVSU0lPTiAgICIyLjAxIG9mIDE2IE1hcmNoIDIwMDgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8Y29uaW8uaD4gICAgICAvKiBvbmx5IGZvciBfZ2V0Y2goKSAqLwotCi0vKiAjZGVmaW5lIERFQlVHICA6ICB0aGlzIGVuYWJsZXMgdGhlIFRyYWNlKCkgbWFjcm9zICovCi0KLSNpbmNsdWRlICJyZWFkcG5nLmgiICAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCByZWFkcG5nIHByb3RvdHlwZXMgKi8KLQotCi0vKiBjb3VsZCBqdXN0IGluY2x1ZGUgcG5nLmgsIGJ1dCB0aGlzIG1hY3JvIGlzIHRoZSBvbmx5IHRoaW5nIHdlIG5lZWQKLSAqIChuYW1lIGFuZCB0eXBlZGVmcyBjaGFuZ2VkIHRvIGxvY2FsIHZlcnNpb25zKTsgbm90ZSB0aGF0IHNpZGUgZWZmZWN0cwotICogb25seSBoYXBwZW4gd2l0aCBhbHBoYSAod2hpY2ggY291bGQgZWFzaWx5IGJlIGF2b2lkZWQgd2l0aAotICogInVzaCBhY29weSA9IChhbHBoYSk7IikgKi8KLQotI2RlZmluZSBhbHBoYV9jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSB7ICAgICAgICAgICAgICAgXAotICAgIHVzaCB0ZW1wID0gKCh1c2gpKGZnKSoodXNoKShhbHBoYSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICh1c2gpKGJnKSoodXNoKSgyNTUgLSAodXNoKShhbHBoYSkpICsgKHVzaCkxMjgpOyAgXAotICAgIChjb21wb3NpdGUpID0gKHVjaCkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7ICAgICAgICAgICAgICAgXAotfQotCi0KLS8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBpbnQgICAgICAgIHJwbmdfd2luX2NyZWF0ZV93aW5kb3coSElOU1RBTkNFIGhJbnN0LCBpbnQgc2hvd21vZGUpOwotc3RhdGljIGludCAgICAgICAgcnBuZ193aW5fZGlzcGxheV9pbWFnZSh2b2lkKTsKLXN0YXRpYyB2b2lkICAgICAgIHJwbmdfd2luX2NsZWFudXAodm9pZCk7Ci1MUkVTVUxUIENBTExCQUNLICBycG5nX3dpbl93bmRwcm9jKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKLQotCi1zdGF0aWMgY2hhciB0aXRsZWJhclsxMDI0XTsKLXN0YXRpYyBjaGFyICpwcm9nbmFtZSA9IFBST0dOQU1FOwotc3RhdGljIGNoYXIgKmFwcG5hbWUgPSBMT05HTkFNRTsKLXN0YXRpYyBjaGFyICpmaWxlbmFtZTsKLXN0YXRpYyBGSUxFICppbmZpbGU7Ci0KLXN0YXRpYyBjaGFyICpiZ3N0cjsKLXN0YXRpYyB1Y2ggYmdfcmVkPTAsIGJnX2dyZWVuPTAsIGJnX2JsdWU9MDsKLQotc3RhdGljIGRvdWJsZSBkaXNwbGF5X2V4cG9uZW50OwotCi1zdGF0aWMgdWxnIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsIGltYWdlX3Jvd2J5dGVzOwotc3RhdGljIGludCBpbWFnZV9jaGFubmVsczsKLXN0YXRpYyB1Y2ggKmltYWdlX2RhdGE7Ci0KLS8qIFdpbmRvd3Mtc3BlY2lmaWMgdmFyaWFibGVzICovCi1zdGF0aWMgdWxnIHdpbWFnZV9yb3dieXRlczsKLXN0YXRpYyB1Y2ggKmRpYjsKLXN0YXRpYyB1Y2ggKndpbWFnZV9kYXRhOwotc3RhdGljIEJJVE1BUElORk9IRUFERVIgKmJtaWg7Ci0KLXN0YXRpYyBIV05EIGdsb2JhbF9od25kOwotCi0KLQotCi1pbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0LCBISU5TVEFOQ0UgaFByZXZJbnN0LCBQU1RSIGNtZCwgaW50IHNob3dtb2RlKQotewotICAgIGNoYXIgKmFyZ3NbMTAyNF07ICAgICAgICAgICAgICAgICAvKiBhcmJpdHJhcnkgbGltaXQsIGJ1dCBzaG91bGQgc3VmZmljZSAqLwotICAgIGNoYXIgKnAsICpxLCAqKmFyZ3YgPSBhcmdzOwotICAgIGludCBhcmdjID0gMDsKLSAgICBpbnQgcmMsIGFsZW4sIGZsZW47Ci0gICAgaW50IGVycm9yID0gMDsKLSAgICBpbnQgaGF2ZV9iZyA9IEZBTFNFOwotICAgIGRvdWJsZSBMVVRfZXhwb25lbnQ7ICAgICAgICAgICAgICAvKiBqdXN0IHRoZSBsb29rdXAgdGFibGUgKi8KLSAgICBkb3VibGUgQ1JUX2V4cG9uZW50ID0gMi4yOyAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwotICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAvKiB3aG9sZSBkaXNwbGF5IHN5c3RlbSAqLwotICAgIE1TRyBtc2c7Ci0KLQotICAgIGZpbGVuYW1lID0gKGNoYXIgKilOVUxMOwotCi0KLSAgICAvKiBGaXJzdCByZWVuYWJsZSBjb25zb2xlIG91dHB1dCwgd2hpY2ggbm9ybWFsbHkgZ29lcyB0byB0aGUgYml0IGJ1Y2tldAotICAgICAqIGZvciB3aW5kb3dlZCBhcHBzLiAgQ2xvc2luZyB0aGUgY29uc29sZSB3aW5kb3cgd2lsbCB0ZXJtaW5hdGUgdGhlCi0gICAgICogYXBwLiAgVGhhbmtzIHRvIERhdmlkLkdlbGRyZWljaEByZWFsdml6LmNvbSBmb3Igc3VwcGx5aW5nIHRoZSBtYWdpY2FsCi0gICAgICogaW5jYW50YXRpb24uICovCi0KLSAgICBBbGxvY0NvbnNvbGUoKTsKLSAgICBmcmVvcGVuKCJDT05PVVQkIiwgImEiLCBzdGRlcnIpOwotICAgIGZyZW9wZW4oIkNPTk9VVCQiLCAiYSIsIHN0ZG91dCk7Ci0KLQotICAgIC8qIE5leHQgc2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBvdXIgZGlzcGxheS1zeXN0ZW0gZXhwb25lbnQsIGkuZS4sCi0gICAgICogdGhlIHByb2R1Y3Qgb2YgdGhlIENSVCBleHBvbmVudCBhbmQgdGhlIGV4cG9uZW50IGNvcnJlc3BvbmRpbmcgdG8KLSAgICAgKiB0aGUgZnJhbWUtYnVmZmVyJ3MgbG9va3VwIHRhYmxlIChMVVQpLCBpZiBhbnkuICBUaGlzIGlzIG5vdCBhbgotICAgICAqIGV4aGF1c3RpdmUgbGlzdCBvZiBMVVQgdmFsdWVzIChlLmcuLCBPcGVuU3RlcCBoYXMgYSBsb3Qgb2Ygd2VpcmQKLSAgICAgKiBvbmVzKSwgYnV0IGl0IHNob3VsZCBjb3ZlciA5OSUgb2YgdGhlIGN1cnJlbnQgcG9zc2liaWxpdGllcy4gIEFuZAotICAgICAqIHllcywgdGhlc2UgaWZkZWZzIGFyZSBjb21wbGV0ZWx5IHdhc3RlZCBpbiBhIFdpbmRvd3MgcHJvZ3JhbS4uLiAqLwotCi0jaWYgZGVmaW5lZChOZVhUKQotICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDIuMjsKLSAgICAvKgotICAgIGlmIChzb21lX25leHRfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZuZXh0X2dhbW1hKSkKLSAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gbmV4dF9nYW1tYTsKLSAgICAgKi8KLSNlbGlmIGRlZmluZWQoc2dpKQotICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDEuNzsKLSAgICAvKiB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IGRvY3VtZW50ZWQgZnVuY3Rpb24gdG8gZ2V0IHRoZQotICAgICAqICJnYW1tYSIgdmFsdWUsIHNvIHdlIGRvIGl0IHRoZSBoYXJkIHdheSAqLwotICAgIGluZmlsZSA9IGZvcGVuKCIvZXRjL2NvbmZpZy9zeXN0ZW0uZ2xHYW1tYVZhbCIsICJyIik7Ci0gICAgaWYgKGluZmlsZSkgewotICAgICAgICBkb3VibGUgc2dpX2dhbW1hOwotCi0gICAgICAgIGZnZXRzKHRtcGxpbmUsIDgwLCBpbmZpbGUpOwotICAgICAgICBmY2xvc2UoaW5maWxlKTsKLSAgICAgICAgc2dpX2dhbW1hID0gYXRvZih0bXBsaW5lKTsKLSAgICAgICAgaWYgKHNnaV9nYW1tYSA+IDAuMCkKLSAgICAgICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIHNnaV9nYW1tYTsKLSAgICB9Ci0jZWxpZiBkZWZpbmVkKE1hY2ludG9zaCkKLSAgICBMVVRfZXhwb25lbnQgPSAxLjggLyAyLjYxOwotICAgIC8qCi0gICAgaWYgKHNvbWVfbWFjX2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbWFjX2dhbW1hKSkKLSAgICAgICAgTFVUX2V4cG9uZW50ID0gbWFjX2dhbW1hIC8gMi42MTsKLSAgICAgKi8KLSNlbHNlCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wOyAgIC8qIGFzc3VtZSBubyBMVVQ6ICBtb3N0IFBDcyAqLwotI2VuZGlmCi0KLSAgICAvKiB0aGUgZGVmYXVsdHMgYWJvdmUgZ2l2ZSAxLjAsIDEuMywgMS41IGFuZCAyLjIsIHJlc3BlY3RpdmVseTogKi8KLSAgICBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQgPSBMVVRfZXhwb25lbnQgKiBDUlRfZXhwb25lbnQ7Ci0KLQotICAgIC8qIElmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIFNDUkVFTl9HQU1NQSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBzdWdnZXN0ZWQKLSAgICAgKiAoc29tZXdoYXQgaW1wcmVjaXNlbHkpIGluIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiwgdXNlIHRoYXQ7IG90aGVyd2lzZQotICAgICAqIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSB3ZSBqdXN0IGNhbGN1bGF0ZWQuICBFaXRoZXIgd2F5LCB0aGUgdXNlciBtYXkKLSAgICAgKiBvdmVycmlkZSB0aGlzIHZpYSBhIGNvbW1hbmQtbGluZSBvcHRpb24uICovCi0KLSAgICBpZiAoKHAgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKSAhPSBOVUxMKQotICAgICAgICBkaXNwbGF5X2V4cG9uZW50ID0gYXRvZihwKTsKLSAgICBlbHNlCi0gICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7Ci0KLQotICAgIC8qIFdpbmRvd3MgcmVhbGx5IGhhdGVzIGNvbW1hbmQgbGluZXMsIHNvIHdlIGhhdmUgdG8gc2V0IHVwIG91ciBvd24gYXJndi4KLSAgICAgKiBOb3RlIHRoYXQgd2UgZG8gTk9UIGJvdGhlciB3aXRoIHF1b3RlZCBhcmd1bWVudHMgaGVyZSwgc28gZG9uJ3QgdXNlCi0gICAgICogZmlsZW5hbWVzIHdpdGggc3BhY2VzIGluICdlbSEgKi8KLQotICAgIGFyZ3ZbYXJnYysrXSA9IFBST0dOQU1FOwotICAgIHAgPSBjbWQ7Ci0gICAgZm9yICg7OykgewotICAgICAgICBpZiAoKnAgPT0gJyAnKQotICAgICAgICAgICAgd2hpbGUgKCorK3AgPT0gJyAnKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgLyogbm93IHAgcG9pbnRzIGF0IHRoZSBmaXJzdCBub24tc3BhY2UgYWZ0ZXIgc29tZSBzcGFjZXMgKi8KLSAgICAgICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAgICAgICBicmVhazsgICAgLyogbm90aGluZyBhZnRlciB0aGUgc3BhY2VzOiAgZG9uZSAqLwotICAgICAgICBhcmd2W2FyZ2MrK10gPSBxID0gcDsKLSAgICAgICAgd2hpbGUgKCpxICYmICpxICE9ICcgJykKLSAgICAgICAgICAgICsrcTsKLSAgICAgICAgLyogbm93IHEgcG9pbnRzIGF0IGEgc3BhY2Ugb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCi0gICAgICAgIGlmICgqcSA9PSAnXDAnKQotICAgICAgICAgICAgYnJlYWs7ICAgIC8qIGxhc3QgYXJndiBhbHJlYWR5IHRlcm1pbmF0ZWQ7IHF1aXQgKi8KLSAgICAgICAgKnEgPSAnXDAnOyAgICAvKiBjaGFuZ2Ugc3BhY2UgdG8gdGVybWluYXRvciAqLwotICAgICAgICBwID0gcSArIDE7Ci0gICAgfQotICAgIGFyZ3ZbYXJnY10gPSBOVUxMOyAgIC8qIHRlcm1pbmF0ZSB0aGUgYXJndiBhcnJheSBpdHNlbGYgKi8KLQotCi0gICAgLyogTm93IHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIG9wdGlvbnMgYW5kIHRoZSBQTkcgZmlsZW5hbWUuICovCi0KLSAgICB3aGlsZSAoKisrYXJndiAmJiAhZXJyb3IpIHsKLSAgICAgICAgaWYgKCFzdHJuY21wKCphcmd2LCAiLWdhbW1hIiwgMikpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGlzcGxheV9leHBvbmVudCA9IGF0b2YoKmFyZ3YpOwotICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5X2V4cG9uZW50IDw9IDAuMCkKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ2NvbG9yIiwgMikpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKLSAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGJnc3RyKSAhPSA3IHx8IGJnc3RyWzBdICE9ICcjJykKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCoqYXJndiAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9ICphcmd2OwotICAgICAgICAgICAgICAgIGlmIChhcmd2WzFdKSAgIC8qIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBhcmdzIGFmdGVyIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICArK2Vycm9yOyAgIC8qIG5vdCBleHBlY3RpbmcgYW55IG90aGVyIG9wdGlvbnMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZmlsZW5hbWUpCi0gICAgICAgICsrZXJyb3I7Ci0KLQotICAgIC8qIHByaW50IHVzYWdlIHNjcmVlbiBpZiBhbnkgZXJyb3JzIHVwIHRvIHRoaXMgcG9pbnQgKi8KLQotICAgIGlmIChlcnJvcikgewotICAgICAgICBpbnQgY2g7Ci0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcblxuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOwotICAgICAgICByZWFkcG5nX3ZlcnNpb25faW5mbygpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgotICAgICAgICAgICJVc2FnZTogICVzIFstZ2FtbWEgZXhwXSBbLWJnY29sb3IgYmddIGZpbGUucG5nXG4iCi0gICAgICAgICAgIiAgICBleHAgXHR0cmFuc2Zlci1mdW5jdGlvbiBleHBvbmVudCAoYGBnYW1tYScnKSBvZiB0aGUgZGlzcGxheVxuIgotICAgICAgICAgICJcdFx0ICBzeXN0ZW0gaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IChlLmcuLCBgYCUuMWYnJyk7IGVxdWFsXG4iCi0gICAgICAgICAgIlx0XHQgIHRvIHRoZSBwcm9kdWN0IG9mIHRoZSBsb29rdXAtdGFibGUgZXhwb25lbnQgKHZhcmllcylcbiIKLSAgICAgICAgICAiXHRcdCAgYW5kIHRoZSBDUlQgZXhwb25lbnQgKHVzdWFsbHkgMi4yKTsgbXVzdCBiZSBwb3NpdGl2ZVxuIgotICAgICAgICAgICIgICAgYmcgIFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIGNvbG9yIGluIDctY2hhcmFjdGVyIGhleCBSR0IgZm9ybWF0XG4iCi0gICAgICAgICAgIlx0XHQgIChlLmcuLCBgYCNmZjc3MDAnJyBmb3Igb3JhbmdlOiAgc2FtZSBhcyBIVE1MIGNvbG9ycyk7XG4iCi0gICAgICAgICAgIlx0XHQgIHVzZWQgd2l0aCB0cmFuc3BhcmVudCBpbWFnZXNcbiIKLSAgICAgICAgICAiXG5QcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgYWZ0ZXIgaW1hZ2UgaXMgZGlzcGxheWVkIHRvIHF1aXQuXG4iCi0gICAgICAgICAgIlByZXNzIFEgb3IgRXNjIHRvIHF1aXQgdGhpcyB1c2FnZSBzY3JlZW4uXG4iCi0gICAgICAgICAgIlxuIiwgUFJPR05BTUUsIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCk7Ci0gICAgICAgIGRvCi0gICAgICAgICAgICBjaCA9IF9nZXRjaCgpOwotICAgICAgICB3aGlsZSAoY2ggIT0gJ3EnICYmIGNoICE9ICdRJyAmJiBjaCAhPSAweDFCKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLQotICAgIGlmICghKGluZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIFBORyBmaWxlIFslc11cbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgKytlcnJvcjsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKHJjID0gcmVhZHBuZ19pbml0KGluZmlsZSwgJmltYWdlX3dpZHRoLCAmaW1hZ2VfaGVpZ2h0KSkgIT0gMCkgewotICAgICAgICAgICAgc3dpdGNoIChyYykgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaXMgbm90IGEgUE5HIGZpbGU6IGluY29ycmVjdCBzaWduYXR1cmVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgICAgICI6ICBbJXNdIGhhcyBiYWQgSUhEUiAobGlicG5nIGxvbmdqbXApXG4iLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIHVua25vd24gcmVhZHBuZ19pbml0KCkgZXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVycm9yKQotICAgICAgICAgICAgZmNsb3NlKGluZmlsZSk7Ci0gICAgfQotCi0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgaW50IGNoOwotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgYWJvcnRpbmcuXG4iKTsKLSAgICAgICAgZG8KLSAgICAgICAgICAgIGNoID0gX2dldGNoKCk7Ci0gICAgICAgIHdoaWxlIChjaCAhPSAncScgJiYgY2ggIT0gJ1EnICYmIGNoICE9IDB4MUIpOwotICAgICAgICBleGl0KDIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4lcyAlczogICVzXG4iLCBQUk9HTkFNRSwgVkVSU0lPTiwgYXBwbmFtZSk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICJcbiAgIFtjb25zb2xlIHdpbmRvdzogIGNsb3NpbmcgdGhpcyB3aW5kb3cgd2lsbCB0ZXJtaW5hdGUgJXNdXG5cbiIsCi0gICAgICAgICAgUFJPR05BTUUpOwotICAgIH0KLQotCi0gICAgLyogc2V0IHRoZSB0aXRsZS1iYXIgc3RyaW5nLCBidXQgbWFrZSBzdXJlIGJ1ZmZlciBkb2Vzbid0IG92ZXJmbG93ICovCi0KLSAgICBhbGVuID0gc3RybGVuKGFwcG5hbWUpOwotICAgIGZsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwotICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAuLi4lcyIsIGFwcG5hbWUsIGZpbGVuYW1lKyhhbGVuK2ZsZW4rNi0xMDIzKSk7Ci0gICAgZWxzZQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKLQotCi0gICAgLyogaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBiYWNrZ3JvdW5kIGNvbG9yIG9uIHRoZSBjb21tYW5kIGxpbmUsCi0gICAgICogY2hlY2sgZm9yIG9uZSBpbiB0aGUgUE5HIGZpbGUtLWlmIG5vdCwgdGhlIGluaXRpYWxpemVkIHZhbHVlcyBvZiAwCi0gICAgICogKGJsYWNrKSB3aWxsIGJlIHVzZWQgKi8KLQotICAgIGlmIChoYXZlX2JnKSB7Ci0gICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7ICAgLyogdGhpcyBhcHByb2FjaCBxdWlldHMgY29tcGlsZXIgd2FybmluZ3MgKi8KLQotICAgICAgICBzc2NhbmYoYmdzdHIrMSwgIiUyeCUyeCUyeCIsICZyLCAmZywgJmIpOwotICAgICAgICBiZ19yZWQgICA9ICh1Y2gpcjsKLSAgICAgICAgYmdfZ3JlZW4gPSAodWNoKWc7Ci0gICAgICAgIGJnX2JsdWUgID0gKHVjaCliOwotICAgIH0gZWxzZSBpZiAocmVhZHBuZ19nZXRfYmdjb2xvcigmYmdfcmVkLCAmYmdfZ3JlZW4sICZiZ19ibHVlKSA+IDEpIHsKLSAgICAgICAgcmVhZHBuZ19jbGVhbnVwKFRSVUUpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAiOiAgbGlicG5nIGVycm9yIHdoaWxlIGNoZWNraW5nIGZvciBiYWNrZ3JvdW5kIGNvbG9yXG4iKTsKLSAgICAgICAgZXhpdCgyKTsKLSAgICB9Ci0KLQotICAgIC8qIGRvIHRoZSBiYXNpYyBXaW5kb3dzIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3cgYW5kIGZpbGwgaXQKLSAgICAgKiB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yICovCi0KLSAgICBpZiAocnBuZ193aW5fY3JlYXRlX3dpbmRvdyhoSW5zdCwgc2hvd21vZGUpKQotICAgICAgICBleGl0KDIpOwotCi0KLSAgICAvKiBkZWNvZGUgdGhlIGltYWdlLCBhbGwgYXQgb25jZSAqLwotCi0gICAgVHJhY2UoKHN0ZGVyciwgImNhbGxpbmcgcmVhZHBuZ19nZXRfaW1hZ2UoKVxuIikpCi0gICAgaW1hZ2VfZGF0YSA9IHJlYWRwbmdfZ2V0X2ltYWdlKGRpc3BsYXlfZXhwb25lbnQsICZpbWFnZV9jaGFubmVscywKLSAgICAgICZpbWFnZV9yb3dieXRlcyk7Ci0gICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCByZWFkcG5nX2dldF9pbWFnZSgpXG4iKSkKLQotCi0gICAgLyogZG9uZSB3aXRoIFBORyBmaWxlLCBzbyBjbGVhbiB1cCB0byBtaW5pbWl6ZSBtZW1vcnkgdXNhZ2UgKGJ1dCBkbyBOT1QKLSAgICAgKiBudWtlIGltYWdlX2RhdGEhKSAqLwotCi0gICAgcmVhZHBuZ19jbGVhbnVwKEZBTFNFKTsKLSAgICBmY2xvc2UoaW5maWxlKTsKLQotICAgIGlmICghaW1hZ2VfZGF0YSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBkZWNvZGUgUE5HIGltYWdlXG4iKTsKLSAgICAgICAgZXhpdCgzKTsKLSAgICB9Ci0KLQotICAgIC8qIGRpc3BsYXkgaW1hZ2UgKGNvbXBvc2l0ZSB3aXRoIGJhY2tncm91bmQgaWYgcmVxdWVzdGVkKSAqLwotCi0gICAgVHJhY2UoKHN0ZGVyciwgImNhbGxpbmcgcnBuZ193aW5fZGlzcGxheV9pbWFnZSgpXG4iKSkKLSAgICBpZiAocnBuZ193aW5fZGlzcGxheV9pbWFnZSgpKSB7Ci0gICAgICAgIGZyZWUoaW1hZ2VfZGF0YSk7Ci0gICAgICAgIGV4aXQoNCk7Ci0gICAgfQotICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcnBuZ193aW5fZGlzcGxheV9pbWFnZSgpXG4iKSkKLQotCi0gICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KLQotICAgIHByaW50ZigKLSAgICAgICJEb25lLiAgUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93KSB0byBxdWl0LlxuIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICB3aGlsZSAoR2V0TWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwKSkgewotICAgICAgICBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOwotICAgICAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7Ci0gICAgfQotCi0KLSAgICAvKiBPSywgd2UncmUgZG9uZTogIGNsZWFuIHVwIGFsbCBpbWFnZSBhbmQgV2luZG93cyByZXNvdXJjZXMgYW5kIGdvIGF3YXkgKi8KLQotICAgIHJwbmdfd2luX2NsZWFudXAoKTsKLQotICAgIHJldHVybiBtc2cud1BhcmFtOwotfQotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZ193aW5fY3JlYXRlX3dpbmRvdyhISU5TVEFOQ0UgaEluc3QsIGludCBzaG93bW9kZSkKLXsKLSAgICB1Y2ggKmRlc3Q7Ci0gICAgaW50IGV4dHJhX3dpZHRoLCBleHRyYV9oZWlnaHQ7Ci0gICAgdWxnIGksIGo7Ci0gICAgV05EQ0xBU1NFWCB3bmRjbGFzczsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRpc3BsYXktc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaW1hZ2UgKHJvdW5kIHVwCi0gICAgdG8gbXVsdGlwbGUgb2YgNCBmb3IgV2luZG93cyBESUIpLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgd2ltYWdlX3Jvd2J5dGVzID0gKCgzKmltYWdlX3dpZHRoICsgM0wpID4+IDIpIDw8IDI7Ci0KLSAgICBpZiAoIShkaWIgPSAodWNoICopbWFsbG9jKHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW1hZ2Vfcm93Ynl0ZXMqaW1hZ2VfaGVpZ2h0KSkpCi0gICAgewotICAgICAgICByZXR1cm4gNDsgICAvKiBmYWlsICovCi0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEluaXRpYWxpemUgdGhlIERJQi4gIE5lZ2F0aXZlIGhlaWdodCBtZWFucyB0byB1c2UgdG9wLWRvd24gQk1QIG9yZGVyaW5nCi0gICAgKG11c3QgYmUgdW5jb21wcmVzc2VkLCBidXQgdGhhdCdzIHdoYXQgd2Ugd2FudCkuICBCaXQgY291bnQgb2YgMSwgNCBvciA4Ci0gICAgaW1wbGllcyBhIGNvbG9ybWFwIG9mIFJHQlggcXVhZHMsIGJ1dCAyNC1iaXQgQk1QcyBqdXN0IHVzZSBCLEcsUiB2YWx1ZXMKLSAgICBkaXJlY3RseSA9PiB3aW1hZ2VfZGF0YSBiZWdpbnMgaW1tZWRpYXRlbHkgYWZ0ZXIgQk1QIGhlYWRlci4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIG1lbXNldChkaWIsIDAsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7Ci0gICAgYm1paCA9IChCSVRNQVBJTkZPSEVBREVSICopZGliOwotICAgIGJtaWgtPmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgICBibWloLT5iaVdpZHRoID0gaW1hZ2Vfd2lkdGg7Ci0gICAgYm1paC0+YmlIZWlnaHQgPSAtKChsb25nKWltYWdlX2hlaWdodCk7Ci0gICAgYm1paC0+YmlQbGFuZXMgPSAxOwotICAgIGJtaWgtPmJpQml0Q291bnQgPSAyNDsKLSAgICBibWloLT5iaUNvbXByZXNzaW9uID0gMDsKLSAgICB3aW1hZ2VfZGF0YSA9IGRpYiArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGaWxsIGluIGJhY2tncm91bmQgY29sb3IgKGJsYWNrIGJ5IGRlZmF1bHQpOyBkYXRhIGFyZSBpbiBCR1Igb3JkZXIuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBmb3IgKGogPSAwOyAgaiA8IGltYWdlX2hlaWdodDsgICsraikgewotICAgICAgICBkZXN0ID0gd2ltYWdlX2RhdGEgKyBqKndpbWFnZV9yb3dieXRlczsKLSAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2JsdWU7Ci0gICAgICAgICAgICAqZGVzdCsrID0gYmdfZ3JlZW47Ci0gICAgICAgICAgICAqZGVzdCsrID0gYmdfcmVkOwotICAgICAgICB9Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFNldCB0aGUgd2luZG93IHBhcmFtZXRlcnMuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBtZW1zZXQoJnduZGNsYXNzLCAwLCBzaXplb2Yod25kY2xhc3MpKTsKLQotICAgIHduZGNsYXNzLmNiU2l6ZSA9IHNpemVvZih3bmRjbGFzcyk7Ci0gICAgd25kY2xhc3Muc3R5bGUgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKLSAgICB3bmRjbGFzcy5scGZuV25kUHJvYyA9IHJwbmdfd2luX3duZHByb2M7Ci0gICAgd25kY2xhc3MuaEluc3RhbmNlID0gaEluc3Q7Ci0gICAgd25kY2xhc3MuaEljb24gPSBMb2FkSWNvbihOVUxMLCBJRElfQVBQTElDQVRJT04pOwotICAgIHduZGNsYXNzLmhDdXJzb3IgPSBMb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyk7Ci0gICAgd25kY2xhc3MuaGJyQmFja2dyb3VuZCA9IChIQlJVU0gpR2V0U3RvY2tPYmplY3QoREtHUkFZX0JSVVNIKTsKLSAgICB3bmRjbGFzcy5scHN6TWVudU5hbWUgPSBOVUxMOwotICAgIHduZGNsYXNzLmxwc3pDbGFzc05hbWUgPSBwcm9nbmFtZTsKLSAgICB3bmRjbGFzcy5oSWNvblNtID0gTG9hZEljb24oTlVMTCwgSURJX0FQUExJQ0FUSU9OKTsKLQotICAgIFJlZ2lzdGVyQ2xhc3NFeCgmd25kY2xhc3MpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbmFsbHksIGNyZWF0ZSB0aGUgd2luZG93LgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgZXh0cmFfd2lkdGggID0gMiooR2V0U3lzdGVtTWV0cmljcyhTTV9DWEJPUkRFUikgKwotICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1hETEdGUkFNRSkpOwotICAgIGV4dHJhX2hlaWdodCA9IDIqKEdldFN5c3RlbU1ldHJpY3MoU01fQ1lCT1JERVIpICsKLSAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRExHRlJBTUUpKSArCi0gICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWUNBUFRJT04pOwotCi0gICAgZ2xvYmFsX2h3bmQgPSBDcmVhdGVXaW5kb3cocHJvZ25hbWUsIHRpdGxlYmFyLCBXU19PVkVSTEFQUEVEV0lORE9XLAotICAgICAgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgaW1hZ2Vfd2lkdGgrZXh0cmFfd2lkdGgsCi0gICAgICBpbWFnZV9oZWlnaHQrZXh0cmFfaGVpZ2h0LCBOVUxMLCBOVUxMLCBoSW5zdCwgTlVMTCk7Ci0KLSAgICBTaG93V2luZG93KGdsb2JhbF9od25kLCBzaG93bW9kZSk7Ci0gICAgVXBkYXRlV2luZG93KGdsb2JhbF9od25kKTsKLQotICAgIHJldHVybiAwOwotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nX3dpbl9jcmVhdGVfd2luZG93KCkgKi8KLQotCi0KLQotCi1zdGF0aWMgaW50IHJwbmdfd2luX2Rpc3BsYXlfaW1hZ2UoKQotewotICAgIHVjaCAqc3JjLCAqZGVzdDsKLSAgICB1Y2ggciwgZywgYiwgYTsKLSAgICB1bGcgaSwgcm93LCBsYXN0cm93OwotICAgIFJFQ1QgcmVjdDsKLQotCi0gICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBkaXNwbGF5IGxvb3AgKGltYWdlX2NoYW5uZWxzID09ICVkKVxuIiwKLSAgICAgIGltYWdlX2NoYW5uZWxzKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiKHdpZHRoID0gJWxkLCByb3dieXRlcyA9ICVsZCwgd2ltYWdlX3Jvd2J5dGVzID0gJWQpXG4iLAotICAgICAgaW1hZ2Vfd2lkdGgsIGltYWdlX3Jvd2J5dGVzLCB3aW1hZ2Vfcm93Ynl0ZXMpKQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQmxhc3QgaW1hZ2UgZGF0YSB0byBidWZmZXIuICBUaGlzIHdob2xlIHJvdXRpbmUgdGFrZXMgcGxhY2UgYmVmb3JlIHRoZQotICAgIG1lc3NhZ2UgbG9vcCBiZWdpbnMsIHNvIHRoZXJlJ3Mgbm8gcmVhbCBwb2ludCBpbiBhbnkgcHNldWRvLXByb2dyZXNzaXZlCi0gICAgZGlzcGxheS4uLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgZm9yIChsYXN0cm93ID0gcm93ID0gMDsgIHJvdyA8IGltYWdlX2hlaWdodDsgICsrcm93KSB7Ci0gICAgICAgIHNyYyA9IGltYWdlX2RhdGEgKyByb3cqaW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgIGRlc3QgPSB3aW1hZ2VfZGF0YSArIHJvdyp3aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgIGlmIChpbWFnZV9jaGFubmVscyA9PSAzKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGI7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGc7ICAgLyogbm90ZSByZXZlcnNlIG9yZGVyICovCi0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSAvKiBpZiAoaW1hZ2VfY2hhbm5lbHMgPT0gNCkgKi8gewotICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBiID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2JsdWU7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19ncmVlbjsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX3JlZDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChjb3BpZWQgZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAqIHJlc3VsdCBpbnRvIHRoZSBmaXJzdCBhcmd1bWVudDsgdGhlcmUgYXJlIG5vCi0gICAgICAgICAgICAgICAgICAgICAqIHNpZGUgZWZmZWN0cyB3aXRoIHRoZSBmaXJzdCBhcmd1bWVudCAqLwotICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoKmRlc3QrKywgYiwgYSwgYmdfYmx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCBnLCBhLCBiZ19ncmVlbik7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCByLCBhLCBiZ19yZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBkaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IGxpbmVzICovCi0gICAgICAgIGlmICgoKHJvdysxKSAmIDB4ZikgPT0gMCkgewotICAgICAgICAgICAgcmVjdC5sZWZ0ID0gMEw7Ci0gICAgICAgICAgICByZWN0LnRvcCA9IChMT05HKWxhc3Ryb3c7Ci0gICAgICAgICAgICByZWN0LnJpZ2h0ID0gKExPTkcpaW1hZ2Vfd2lkdGg7ICAgICAgLyogcG9zc2libHkgb2ZmIGJ5IG9uZT8gKi8KLSAgICAgICAgICAgIHJlY3QuYm90dG9tID0gKExPTkcpbGFzdHJvdyArIDE2TDsgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLwotICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QoZ2xvYmFsX2h3bmQsICZyZWN0LCBGQUxTRSk7Ci0gICAgICAgICAgICBVcGRhdGVXaW5kb3coZ2xvYmFsX2h3bmQpOyAgICAgLyogc2ltaWxhciB0byBYRmx1c2goKSAqLwotICAgICAgICAgICAgbGFzdHJvdyA9IHJvdyArIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBUcmFjZSgoc3RkZXJyLCAiY2FsbGluZyBmaW5hbCBpbWFnZS1mbHVzaCByb3V0aW5lXG4iKSkKLSAgICBpZiAobGFzdHJvdyA8IGltYWdlX2hlaWdodCkgewotICAgICAgICByZWN0LmxlZnQgPSAwTDsKLSAgICAgICAgcmVjdC50b3AgPSAoTE9ORylsYXN0cm93OwotICAgICAgICByZWN0LnJpZ2h0ID0gKExPTkcpaW1hZ2Vfd2lkdGg7ICAgICAgLyogcG9zc2libHkgb2ZmIGJ5IG9uZT8gKi8KLSAgICAgICAgcmVjdC5ib3R0b20gPSAoTE9ORylpbWFnZV9oZWlnaHQ7ICAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCi0gICAgICAgIEludmFsaWRhdGVSZWN0KGdsb2JhbF9od25kLCAmcmVjdCwgRkFMU0UpOwotICAgICAgICBVcGRhdGVXaW5kb3coZ2xvYmFsX2h3bmQpOyAgICAgLyogc2ltaWxhciB0byBYRmx1c2goKSAqLwotICAgIH0KLQotLyoKLSAgICBsYXN0IHBhcmFtIGRldGVybWluZXMgd2hldGhlciBvciBub3QgYmFja2dyb3VuZCBpcyB3aXBlZCBiZWZvcmUgcGFpbnQKLSAgICBJbnZhbGlkYXRlUmVjdChnbG9iYWxfaHduZCwgTlVMTCwgVFJVRSk7Ci0gICAgVXBkYXRlV2luZG93KGdsb2JhbF9od25kKTsKLSAqLwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQgcnBuZ193aW5fY2xlYW51cCgpCi17Ci0gICAgaWYgKGltYWdlX2RhdGEpIHsKLSAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKLSAgICAgICAgaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGRpYikgewotICAgICAgICBmcmVlKGRpYik7Ci0gICAgICAgIGRpYiA9IE5VTEw7Ci0gICAgfQotfQotCi0KLQotCi0KLUxSRVNVTFQgQ0FMTEJBQ0sgcnBuZ193aW5fd25kcHJvYyhIV05EIGh3bmQsIFVJTlQgaU1zZywgV1BBUkFNIHdQLCBMUEFSQU0gbFApCi17Ci0gICAgSERDICAgICAgICAgaGRjOwotICAgIFBBSU5UU1RSVUNUIHBzOwotICAgIGludCByYzsKLQotICAgIHN3aXRjaCAoaU1zZykgewotICAgICAgICBjYXNlIFdNX0NSRUFURToKLSAgICAgICAgICAgIC8qIG9uZS10aW1lIHByb2Nlc3NpbmcgaGVyZSwgaWYgYW55ICovCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBjYXNlIFdNX1BBSU5UOgotICAgICAgICAgICAgaGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOwotICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHJjID0gU3RyZXRjaERJQml0cyhoZGMsIDAsIDAsIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbWFnZV9kYXRhLCAoQklUTUFQSU5GTyAqKWJtaWgsCi0gICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBpVXNhZ2U6IG5vIGNsdWUgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU1JDQ09QWSk7Ci0gICAgICAgICAgICBFbmRQYWludChod25kLCAmcHMpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KLSAgICAgICAgY2FzZSBXTV9DSEFSOgotICAgICAgICAgICAgc3dpdGNoICh3UCkgeyAgICAgIC8qIG9ubHkgbmVlZCBvbmUsIHNvIGlnbm9yZSByZXBlYXQgY291bnQgKi8KLSAgICAgICAgICAgICAgICBjYXNlICdxJzoKLSAgICAgICAgICAgICAgICBjYXNlICdRJzoKLSAgICAgICAgICAgICAgICBjYXNlIDB4MUI6ICAgICAvKiBFc2Mga2V5ICovCi0gICAgICAgICAgICAgICAgICAgIFBvc3RRdWl0TWVzc2FnZSgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgV01fTEJVVFRPTkRPV046ICAgLyogYW5vdGhlciB3YXkgb2YgcXVpdHRpbmcgKi8KLSAgICAgICAgY2FzZSBXTV9ERVNUUk9ZOgotICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgaU1zZywgd1AsIGxQKTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZy14LmMgYi9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL3JwbmcteC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTk4MTcwLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZy14LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MDQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcnBuZyAtIHNpbXBsZSBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwbmcteC5jCi0KLSAgIFRoaXMgcHJvZ3JhbSBkZWNvZGVzIGFuZCBkaXNwbGF5cyBQTkcgaW1hZ2VzLCB3aXRoIGdhbW1hIGNvcnJlY3Rpb24gYW5kCi0gICBvcHRpb25hbGx5IHdpdGggYSB1c2VyLXNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIChpbiBjYXNlIHRoZSBpbWFnZSBoYXMKLSAgIHRyYW5zcGFyZW5jeSkuICBJdCBpcyB2ZXJ5IG5lYXJseSB0aGUgbW9zdCBiYXNpYyBQTkcgdmlld2VyIHBvc3NpYmxlLgotICAgVGhpcyB2ZXJzaW9uIGlzIGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtICh0ZXN0ZWQgYnkgYXV0aG9yIHVuZGVyIFVuaXggYW5kCi0gICBieSBNYXJ0aW4gWmluc2VyIHVuZGVyIE9wZW5WTVM7IG1heSB3b3JrIHVuZGVyIE9TLzIgd2l0aCBzb21lIHR3ZWFraW5nKS4KLQotICAgdG8gZG86Ci0gICAgLSA4LWJpdCAoY29sb3JtYXBwZWQpIFggc3VwcG9ydAotICAgIC0gdXNlICUuMTAyM3MgdG8gc2ltcGxpZnkgdHJ1bmNhdGlvbiBvZiB0aXRsZS1iYXIgc3RyaW5nPwotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBDaGFuZ2Vsb2c6Ci0gICAgLSAxLjAxOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQotICAgIC0gMS4wMjogIG1vZGlmaWVkIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnM7IGZpeGVkIGxvbmcvdWxvbmcgbWlzLQotICAgICAgICAgICAgICBtYXRjaDsgc3dpdGNoZWQgdG8gcG5nX2ptcGJ1ZigpIG1hY3JvCi0gICAgLSAxLjEwOiAgYWRkZWQgc3VwcG9ydCBmb3Igbm9uLWRlZmF1bHQgdmlzdWFsczsgZml4ZWQgWCBwaXhlbC1jb252ZXJzaW9uCi0gICAgLSAxLjExOiAgYWRkZWQgZXh0cmEgc2V0IG9mIHBhcmVudGhlc2VzIHRvIHBuZ19qbXBidWYoKSBtYWNybzsgZml4ZWQKLSAgICAgICAgICAgICAgY29tbWFuZC1saW5lIHBhcnNpbmcgYnVnCi0gICAgLSAxLjEyOiAgZml4ZWQgc29tZSBzbWFsbCBYIG1lbW9yeSBsZWFrcyAodGhhbmtzIHRvIEZyYW7nb2lzIFBldGl0amVhbikKLSAgICAtIDEuMTM6ICBmaXhlZCBYRnJlZUdDKCkgY3Jhc2ggYnVnICh0aGFua3MgdG8gUGF0cmljayBXZWxjaGUpCi0gICAgLSAxLjE0OiAgYWRkZWQgc3VwcG9ydCBmb3IgWCByZXNvdXJjZXMgKHRoYW5rcyB0byBHZXJoYXJkIE5pa2xhc2NoKQotICAgIC0gMi4wMDogIGR1YWwtbGljZW5zZWQgKGFkZGVkIEdOVSBHUEwpCi0gICAgLSAyLjAxOiAgZml4ZWQgaW1wcm9wZXIgZGlzcGxheSBvZiB1c2FnZSBzY3JlZW4gb24gUE5HIGVycm9yKHMpCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgUFJPR05BTUUgICJycG5nLXgiCi0jZGVmaW5lIExPTkdOQU1FICAiU2ltcGxlIFBORyBWaWV3ZXIgZm9yIFgiCi0jZGVmaW5lIFZFUlNJT04gICAiMi4wMSBvZiAxNiBNYXJjaCAyMDA4IgotI2RlZmluZSBSRVNOQU1FICAgInJwbmciCS8qIG91ciBYIHJlc291cmNlIGFwcGxpY2F0aW9uIG5hbWUgKi8KLSNkZWZpbmUgUkVTQ0xBU1MgICJScG5nIgkvKiBvdXIgWCByZXNvdXJjZSBjbGFzcyBuYW1lICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotI2luY2x1ZGUgPFgxMS9Yb3MuaD4KLSNpbmNsdWRlIDxYMTEva2V5c3ltLmg+Ci0KLS8qICNkZWZpbmUgREVCVUcgIDogIHRoaXMgZW5hYmxlcyB0aGUgVHJhY2UoKSBtYWNyb3MgKi8KLQotI2luY2x1ZGUgInJlYWRwbmcuaCIgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcmVhZHBuZyBwcm90b3R5cGVzICovCi0KLQotLyogY291bGQganVzdCBpbmNsdWRlIHBuZy5oLCBidXQgdGhpcyBtYWNybyBpcyB0aGUgb25seSB0aGluZyB3ZSBuZWVkCi0gKiAobmFtZSBhbmQgdHlwZWRlZnMgY2hhbmdlZCB0byBsb2NhbCB2ZXJzaW9ucyk7IG5vdGUgdGhhdCBzaWRlIGVmZmVjdHMKLSAqIG9ubHkgaGFwcGVuIHdpdGggYWxwaGEgKHdoaWNoIGNvdWxkIGVhc2lseSBiZSBhdm9pZGVkIHdpdGgKLSAqICJ1c2ggYWNvcHkgPSAoYWxwaGEpOyIpICovCi0KLSNkZWZpbmUgYWxwaGFfY29tcG9zaXRlKGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgeyAgICAgICAgICAgICAgIFwKLSAgICB1c2ggdGVtcCA9ICgodXNoKShmZykqKHVzaCkoYWxwaGEpICsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAodXNoKShiZykqKHVzaCkoMjU1IC0gKHVzaCkoYWxwaGEpKSArICh1c2gpMTI4KTsgIFwKLSAgICAoY29tcG9zaXRlKSA9ICh1Y2gpKCh0ZW1wICsgKHRlbXAgPj4gOCkpID4+IDgpOyAgICAgICAgICAgICAgIFwKLX0KLQotCi0vKiBsb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgaW50ICBycG5nX3hfY3JlYXRlX3dpbmRvdyh2b2lkKTsKLXN0YXRpYyBpbnQgIHJwbmdfeF9kaXNwbGF5X2ltYWdlKHZvaWQpOwotc3RhdGljIHZvaWQgcnBuZ194X2NsZWFudXAodm9pZCk7Ci1zdGF0aWMgaW50ICBycG5nX3hfbXNiKHVsZyB1MzJ2YWwpOwotCi0KLXN0YXRpYyBjaGFyIHRpdGxlYmFyWzEwMjRdLCAqd2luZG93X25hbWUgPSB0aXRsZWJhcjsKLXN0YXRpYyBjaGFyICphcHBuYW1lID0gTE9OR05BTUU7Ci1zdGF0aWMgY2hhciAqaWNvbl9uYW1lID0gUFJPR05BTUU7Ci1zdGF0aWMgY2hhciAqcmVzX25hbWUgPSBSRVNOQU1FOwotc3RhdGljIGNoYXIgKnJlc19jbGFzcyA9IFJFU0NMQVNTOwotc3RhdGljIGNoYXIgKmZpbGVuYW1lOwotc3RhdGljIEZJTEUgKmluZmlsZTsKLQotc3RhdGljIGNoYXIgKmJnc3RyOwotc3RhdGljIHVjaCBiZ19yZWQ9MCwgYmdfZ3JlZW49MCwgYmdfYmx1ZT0wOwotCi1zdGF0aWMgZG91YmxlIGRpc3BsYXlfZXhwb25lbnQ7Ci0KLXN0YXRpYyB1bGcgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgaW1hZ2Vfcm93Ynl0ZXM7Ci1zdGF0aWMgaW50IGltYWdlX2NoYW5uZWxzOwotc3RhdGljIHVjaCAqaW1hZ2VfZGF0YTsKLQotLyogWC1zcGVjaWZpYyB2YXJpYWJsZXMgKi8KLXN0YXRpYyBjaGFyICpkaXNwbGF5bmFtZTsKLXN0YXRpYyBYSW1hZ2UgKnhpbWFnZTsKLXN0YXRpYyBEaXNwbGF5ICpkaXNwbGF5Owotc3RhdGljIGludCBkZXB0aDsKLXN0YXRpYyBWaXN1YWwgKnZpc3VhbDsKLXN0YXRpYyBYVmlzdWFsSW5mbyAqdmlzdWFsX2xpc3Q7Ci1zdGF0aWMgaW50IFJTaGlmdCwgR1NoaWZ0LCBCU2hpZnQ7Ci1zdGF0aWMgdWxnIFJNYXNrLCBHTWFzaywgQk1hc2s7Ci1zdGF0aWMgV2luZG93IHdpbmRvdzsKLXN0YXRpYyBHQyBnYzsKLXN0YXRpYyBDb2xvcm1hcCBjb2xvcm1hcDsKLQotc3RhdGljIGludCBoYXZlX25vbmRlZmF1bHRfdmlzdWFsID0gRkFMU0U7Ci1zdGF0aWMgaW50IGhhdmVfY29sb3JtYXAgPSBGQUxTRTsKLXN0YXRpYyBpbnQgaGF2ZV93aW5kb3cgPSBGQUxTRTsKLXN0YXRpYyBpbnQgaGF2ZV9nYyA9IEZBTFNFOwotLyoKLXVsZyBudW1jb2xvcnM9MCwgcGl4ZWxzWzI1Nl07Ci11c2ggcmVkc1syNTZdLCBncmVlbnNbMjU2XSwgYmx1ZXNbMjU2XTsKLSAqLwotCi0KLQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0jaWZkZWYgc2dpCi0gICAgY2hhciB0bXBsaW5lWzgwXTsKLSNlbmRpZgotICAgIGNoYXIgKnA7Ci0gICAgaW50IHJjLCBhbGVuLCBmbGVuOwotICAgIGludCBlcnJvciA9IDA7Ci0gICAgaW50IGhhdmVfYmcgPSBGQUxTRTsKLSAgICBkb3VibGUgTFVUX2V4cG9uZW50OyAgICAgICAgICAgICAgIC8qIGp1c3QgdGhlIGxvb2t1cCB0YWJsZSAqLwotICAgIGRvdWJsZSBDUlRfZXhwb25lbnQgPSAyLjI7ICAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwotICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAgLyogd2hvbGUgZGlzcGxheSBzeXN0ZW0gKi8KLSAgICBYRXZlbnQgZTsKLSAgICBLZXlTeW0gazsKLQotCi0gICAgZGlzcGxheW5hbWUgPSAoY2hhciAqKU5VTEw7Ci0gICAgZmlsZW5hbWUgPSAoY2hhciAqKU5VTEw7Ci0KLQotICAgIC8qIEZpcnN0IHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLAotICAgICAqIHRoZSBwcm9kdWN0IG9mIHRoZSBDUlQgZXhwb25lbnQgYW5kIHRoZSBleHBvbmVudCBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogdGhlIGZyYW1lLWJ1ZmZlcidzIGxvb2t1cCB0YWJsZSAoTFVUKSwgaWYgYW55LiAgVGhpcyBpcyBub3QgYW4KLSAgICAgKiBleGhhdXN0aXZlIGxpc3Qgb2YgTFVUIHZhbHVlcyAoZS5nLiwgT3BlblN0ZXAgaGFzIGEgbG90IG9mIHdlaXJkCi0gICAgICogb25lcyksIGJ1dCBpdCBzaG91bGQgY292ZXIgOTklIG9mIHRoZSBjdXJyZW50IHBvc3NpYmlsaXRpZXMuICovCi0KLSNpZiBkZWZpbmVkKE5lWFQpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOwotICAgIC8qCi0gICAgaWYgKHNvbWVfbmV4dF9mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm5leHRfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOwotICAgICAqLwotI2VsaWYgZGVmaW5lZChzZ2kpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OwotICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0byBnZXQgdGhlCi0gICAgICogImdhbW1hIiB2YWx1ZSwgc28gd2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCi0gICAgaW5maWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKLSAgICBpZiAoaW5maWxlKSB7Ci0gICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7Ci0KLSAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7Ci0gICAgICAgIGZjbG9zZShpbmZpbGUpOwotICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOwotICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQotICAgICAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gc2dpX2dhbW1hOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQotICAgIExVVF9leHBvbmVudCA9IDEuOCAvIDIuNjE7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSBtYWNfZ2FtbWEgLyAyLjYxOwotICAgICAqLwotI2Vsc2UKLSAgICBMVVRfZXhwb25lbnQgPSAxLjA7ICAgLyogYXNzdW1lIG5vIExVVDogIG1vc3QgUENzICovCi0jZW5kaWYKLQotICAgIC8qIHRoZSBkZWZhdWx0cyBhYm92ZSBnaXZlIDEuMCwgMS4zLCAxLjUgYW5kIDIuMiwgcmVzcGVjdGl2ZWx5OiAqLwotICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKLQotCi0gICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAotICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCi0gICAgICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdlIGp1c3QgY2FsY3VsYXRlZC4gIEVpdGhlciB3YXksIHRoZSB1c2VyIG1heQotICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KLQotICAgIGlmICgocCA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpICE9IE5VTEwpCi0gICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKHApOwotICAgIGVsc2UKLSAgICAgICAgZGlzcGxheV9leHBvbmVudCA9IGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsKLQotCi0gICAgLyogTm93IHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIG9wdGlvbnMgYW5kIHRoZSBQTkcgZmlsZW5hbWUuICovCi0KLSAgICB3aGlsZSAoKisrYXJndiAmJiAhZXJyb3IpIHsKLSAgICAgICAgaWYgKCFzdHJuY21wKCphcmd2LCAiLWRpc3BsYXkiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGlzcGxheW5hbWUgPSAqYXJndjsKLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1nYW1tYSIsIDIpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKCphcmd2KTsKLSAgICAgICAgICAgICAgICBpZiAoZGlzcGxheV9leHBvbmVudCA8PSAwLjApCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdjb2xvciIsIDIpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJnc3RyID0gKmFyZ3Y7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmxlbihiZ3N0cikgIT0gNyB8fCBiZ3N0clswXSAhPSAnIycpCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7IAotICAgICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCoqYXJndiAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9ICphcmd2OwotICAgICAgICAgICAgICAgIGlmIChhcmd2WzFdKSAgIC8qIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBhcmdzIGFmdGVyIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICArK2Vycm9yOyAgIC8qIG5vdCBleHBlY3RpbmcgYW55IG90aGVyIG9wdGlvbnMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZmlsZW5hbWUpCi0gICAgICAgICsrZXJyb3I7Ci0KLQotICAgIC8qIHByaW50IHVzYWdlIHNjcmVlbiBpZiBhbnkgZXJyb3JzIHVwIHRvIHRoaXMgcG9pbnQgKi8KLQotICAgIGlmIChlcnJvcikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXM6ICAlc1xuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOwotICAgICAgICByZWFkcG5nX3ZlcnNpb25faW5mbygpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgotICAgICAgICAgICJVc2FnZTogICVzIFstZGlzcGxheSB4ZHB5XSBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnXSBmaWxlLnBuZ1xuIgotICAgICAgICAgICIgICAgeGRweVx0bmFtZSBvZiB0aGUgdGFyZ2V0IFggZGlzcGxheSAoZS5nLiwgYGBob3N0bmFtZTowJycpXG4iCi0gICAgICAgICAgIiAgICBleHAgXHR0cmFuc2Zlci1mdW5jdGlvbiBleHBvbmVudCAoYGBnYW1tYScnKSBvZiB0aGUgZGlzcGxheVxuIgotICAgICAgICAgICJcdFx0ICBzeXN0ZW0gaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IChlLmcuLCBgYCUuMWYnJyk7IGVxdWFsXG4iCi0gICAgICAgICAgIlx0XHQgIHRvIHRoZSBwcm9kdWN0IG9mIHRoZSBsb29rdXAtdGFibGUgZXhwb25lbnQgKHZhcmllcylcbiIKLSAgICAgICAgICAiXHRcdCAgYW5kIHRoZSBDUlQgZXhwb25lbnQgKHVzdWFsbHkgMi4yKTsgbXVzdCBiZSBwb3NpdGl2ZVxuIgotICAgICAgICAgICIgICAgYmcgIFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIGNvbG9yIGluIDctY2hhcmFjdGVyIGhleCBSR0IgZm9ybWF0XG4iCi0gICAgICAgICAgIlx0XHQgIChlLmcuLCBgYCNmZjc3MDAnJyBmb3Igb3JhbmdlOiAgc2FtZSBhcyBIVE1MIGNvbG9ycyk7XG4iCi0gICAgICAgICAgIlx0XHQgIHVzZWQgd2l0aCB0cmFuc3BhcmVudCBpbWFnZXNcbiIKLSAgICAgICAgICAiXG5QcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgKHdpdGhpbiBpbWFnZSB3aW5kb3csIGFmdGVyIGltYWdlXG4iCi0gICAgICAgICAgImlzIGRpc3BsYXllZCkgdG8gcXVpdC5cbiIKLSAgICAgICAgICAiXG4iLCBQUk9HTkFNRSwgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50KTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLQotICAgIGlmICghKGluZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIFBORyBmaWxlIFslc11cbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgKytlcnJvcjsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKHJjID0gcmVhZHBuZ19pbml0KGluZmlsZSwgJmltYWdlX3dpZHRoLCAmaW1hZ2VfaGVpZ2h0KSkgIT0gMCkgewotICAgICAgICAgICAgc3dpdGNoIChyYykgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaXMgbm90IGEgUE5HIGZpbGU6IGluY29ycmVjdCBzaWduYXR1cmVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgICAgICI6ICBbJXNdIGhhcyBiYWQgSUhEUiAobGlicG5nIGxvbmdqbXApXG4iLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIHVua25vd24gcmVhZHBuZ19pbml0KCkgZXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkaXNwbGF5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXluYW1lKTsKLSAgICAgICAgICAgIGlmICghZGlzcGxheSkgewotICAgICAgICAgICAgICAgIHJlYWRwbmdfY2xlYW51cChUUlVFKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gWCBkaXNwbGF5IFslc11cbiIsCi0gICAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZT8gZGlzcGxheW5hbWUgOiAiZGVmYXVsdCIpOwotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVycm9yKQotICAgICAgICAgICAgZmNsb3NlKGluZmlsZSk7Ci0gICAgfQotCi0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBhYm9ydGluZy5cbiIpOwotICAgICAgICBleGl0KDIpOwotICAgIH0KLQotCi0gICAgLyogc2V0IHRoZSB0aXRsZS1iYXIgc3RyaW5nLCBidXQgbWFrZSBzdXJlIGJ1ZmZlciBkb2Vzbid0IG92ZXJmbG93ICovCi0KLSAgICBhbGVuID0gc3RybGVuKGFwcG5hbWUpOwotICAgIGZsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwotICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAuLi4lcyIsIGFwcG5hbWUsIGZpbGVuYW1lKyhhbGVuK2ZsZW4rNi0xMDIzKSk7Ci0gICAgZWxzZQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKLQotCi0gICAgLyogaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBiYWNrZ3JvdW5kIGNvbG9yIG9uIHRoZSBjb21tYW5kIGxpbmUsCi0gICAgICogY2hlY2sgZm9yIG9uZSBpbiB0aGUgUE5HIGZpbGUtLWlmIG5vdCwgdGhlIGluaXRpYWxpemVkIHZhbHVlcyBvZiAwCi0gICAgICogKGJsYWNrKSB3aWxsIGJlIHVzZWQgKi8KLQotICAgIGlmIChoYXZlX2JnKSB7Ci0gICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7ICAgLyogdGhpcyBhcHByb2FjaCBxdWlldHMgY29tcGlsZXIgd2FybmluZ3MgKi8KLQotICAgICAgICBzc2NhbmYoYmdzdHIrMSwgIiUyeCUyeCUyeCIsICZyLCAmZywgJmIpOwotICAgICAgICBiZ19yZWQgICA9ICh1Y2gpcjsKLSAgICAgICAgYmdfZ3JlZW4gPSAodWNoKWc7Ci0gICAgICAgIGJnX2JsdWUgID0gKHVjaCliOwotICAgIH0gZWxzZSBpZiAocmVhZHBuZ19nZXRfYmdjb2xvcigmYmdfcmVkLCAmYmdfZ3JlZW4sICZiZ19ibHVlKSA+IDEpIHsKLSAgICAgICAgcmVhZHBuZ19jbGVhbnVwKFRSVUUpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAiOiAgbGlicG5nIGVycm9yIHdoaWxlIGNoZWNraW5nIGZvciBiYWNrZ3JvdW5kIGNvbG9yXG4iKTsKLSAgICAgICAgZXhpdCgyKTsKLSAgICB9Ci0KLQotICAgIC8qIGRvIHRoZSBiYXNpYyBYIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3cgYW5kIGZpbGwgaXQKLSAgICAgKiB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yICovCi0KLSAgICBpZiAocnBuZ194X2NyZWF0ZV93aW5kb3coKSkKLSAgICAgICAgZXhpdCgyKTsKLQotCi0gICAgLyogZGVjb2RlIHRoZSBpbWFnZSwgYWxsIGF0IG9uY2UgKi8KLQotICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIHJlYWRwbmdfZ2V0X2ltYWdlKClcbiIpKQotICAgIGltYWdlX2RhdGEgPSByZWFkcG5nX2dldF9pbWFnZShkaXNwbGF5X2V4cG9uZW50LCAmaW1hZ2VfY2hhbm5lbHMsCi0gICAgICAmaW1hZ2Vfcm93Ynl0ZXMpOwotICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcmVhZHBuZ19nZXRfaW1hZ2UoKVxuIikpCi0KLQotICAgIC8qIGRvbmUgd2l0aCBQTkcgZmlsZSwgc28gY2xlYW4gdXAgdG8gbWluaW1pemUgbWVtb3J5IHVzYWdlIChidXQgZG8gTk9UCi0gICAgICogbnVrZSBpbWFnZV9kYXRhISkgKi8KLQotICAgIHJlYWRwbmdfY2xlYW51cChGQUxTRSk7Ci0gICAgZmNsb3NlKGluZmlsZSk7Ci0KLSAgICBpZiAoIWltYWdlX2RhdGEpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICB1bmFibGUgdG8gZGVjb2RlIFBORyBpbWFnZVxuIik7Ci0gICAgICAgIGV4aXQoMyk7Ci0gICAgfQotCi0KLSAgICAvKiBkaXNwbGF5IGltYWdlIChjb21wb3NpdGUgd2l0aCBiYWNrZ3JvdW5kIGlmIHJlcXVlc3RlZCkgKi8KLQotICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIHJwbmdfeF9kaXNwbGF5X2ltYWdlKClcbiIpKQotICAgIGlmIChycG5nX3hfZGlzcGxheV9pbWFnZSgpKSB7Ci0gICAgICAgIGZyZWUoaW1hZ2VfZGF0YSk7Ci0gICAgICAgIGV4aXQoNCk7Ci0gICAgfQotICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcnBuZ194X2Rpc3BsYXlfaW1hZ2UoKVxuIikpCi0KLQotICAgIC8qIHdhaXQgZm9yIHRoZSB1c2VyIHRvIHRlbGwgdXMgd2hlbiB0byBxdWl0ICovCi0KLSAgICBwcmludGYoCi0gICAgICAiRG9uZS4gIFByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdykgdG8gcXVpdC5cbiIpOwotICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgZG8KLSAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7Ci0gICAgd2hpbGUgKCEoZS50eXBlID09IEJ1dHRvblByZXNzICYmIGUueGJ1dHRvbi5idXR0b24gPT0gQnV0dG9uMSkgJiYKLSAgICAgICAgICAgIShlLnR5cGUgPT0gS2V5UHJlc3MgJiYgICAgLyogIHYtLS0gb3IgMSBmb3Igc2hpZnRlZCBrZXlzICovCi0gICAgICAgICAgICAgKChrID0gWExvb2t1cEtleXN5bSgmZS54a2V5LCAwKSkgPT0gWEtfcSB8fCBrID09IFhLX0VzY2FwZSkgKSk7Ci0KLQotICAgIC8qIE9LLCB3ZSdyZSBkb25lOiAgY2xlYW4gdXAgYWxsIGltYWdlIGFuZCBYIHJlc291cmNlcyBhbmQgZ28gYXdheSAqLwotCi0gICAgcnBuZ194X2NsZWFudXAoKTsKLQotICAgIHJldHVybiAwOwotfQotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZ194X2NyZWF0ZV93aW5kb3codm9pZCkKLXsKLSAgICB1Y2ggKnhkYXRhOwotICAgIGludCBuZWVkX2NvbG9ybWFwID0gRkFMU0U7Ci0gICAgaW50IHNjcmVlbiwgcGFkOwotICAgIHVsZyBiZ19waXhlbCA9IDBMOwotICAgIHVsZyBhdHRybWFzazsKLSAgICBXaW5kb3cgcm9vdDsKLSAgICBYRXZlbnQgZTsKLSAgICBYR0NWYWx1ZXMgZ2N2YWx1ZXM7Ci0gICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKLSAgICBYVGV4dFByb3BlcnR5IHdpbmRvd05hbWUsICpwV2luZG93TmFtZSA9ICZ3aW5kb3dOYW1lOwotICAgIFhUZXh0UHJvcGVydHkgaWNvbk5hbWUsICpwSWNvbk5hbWUgPSAmaWNvbk5hbWU7Ci0gICAgWFZpc3VhbEluZm8gdmlzdWFsX2luZm87Ci0gICAgWFNpemVIaW50cyAqc2l6ZV9oaW50czsKLSAgICBYV01IaW50cyAqd21faGludHM7Ci0gICAgWENsYXNzSGludCAqY2xhc3NfaGludHM7Ci0KLQotICAgIHNjcmVlbiA9IERlZmF1bHRTY3JlZW4oZGlzcGxheSk7Ci0gICAgZGVwdGggPSBEaXNwbGF5UGxhbmVzKGRpc3BsYXksIHNjcmVlbik7Ci0gICAgcm9vdCA9IFJvb3RXaW5kb3coZGlzcGxheSwgc2NyZWVuKTsKLQotI2lmZGVmIERFQlVHCi0gICAgWFN5bmNocm9uaXplKGRpc3BsYXksIFRydWUpOwotI2VuZGlmCi0KLSNpZiAwCi0vKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwotICAgIGlmICgvKiBkZXB0aCAhPSA4ICYmICovIGRlcHRoICE9IDE2ICYmIGRlcHRoICE9IDI0ICYmIGRlcHRoICE9IDMyKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICJzY3JlZW4gZGVwdGggJWQgbm90IHN1cHBvcnRlZCAob25seSAxNi0sIDI0LSBvciAzMi1iaXQgVHJ1ZUNvbG9yKVxuIiwKLSAgICAgICAgICBkZXB0aCk7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAgIFhNYXRjaFZpc3VhbEluZm8oZGlzcGxheSwgc2NyZWVuLCBkZXB0aCwKLSAgICAgIChkZXB0aCA9PSA4KT8gUHNldWRvQ29sb3IgOiBUcnVlQ29sb3IsICZ2aXN1YWxfaW5mbyk7Ci0gICAgdmlzdWFsID0gdmlzdWFsX2luZm8udmlzdWFsOwotI2Vsc2UKLSAgICBpZiAoZGVwdGggIT0gMTYgJiYgZGVwdGggIT0gMjQgJiYgZGVwdGggIT0gMzIpIHsKLSAgICAgICAgaW50IHZpc3VhbHNfbWF0Y2hlZCA9IDA7Ci0KLSAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRlZmF1bHQgZGVwdGggaXMgJWQ6ICBjaGVja2luZyBvdGhlciB2aXN1YWxzXG4iLAotICAgICAgICAgIGRlcHRoKSkKLQotICAgICAgICAvKiAyNC1iaXQgZmlyc3QgKi8KLSAgICAgICAgdmlzdWFsX2luZm8uc2NyZWVuID0gc2NyZWVuOwotICAgICAgICB2aXN1YWxfaW5mby5kZXB0aCA9IDI0OwotICAgICAgICB2aXN1YWxfbGlzdCA9IFhHZXRWaXN1YWxJbmZvKGRpc3BsYXksCi0gICAgICAgICAgVmlzdWFsU2NyZWVuTWFzayB8IFZpc3VhbERlcHRoTWFzaywgJnZpc3VhbF9pbmZvLCAmdmlzdWFsc19tYXRjaGVkKTsKLSAgICAgICAgaWYgKHZpc3VhbHNfbWF0Y2hlZCA9PSAwKSB7Ci0vKiBHUlI6ICBhZGQgMTUtLCAxNi0gYW5kIDMyLWJpdCBUcnVlQ29sb3IgdmlzdWFscyAoYWxzbyBEaXJlY3RDb2xvcj8pICovCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlZmF1bHQgc2NyZWVuIGRlcHRoICVkIG5vdCBzdXBwb3J0ZWQsIGFuZCBubyIKLSAgICAgICAgICAgICAgIiAyNC1iaXQgdmlzdWFscyBmb3VuZFxuIiwgZGVwdGgpOwotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgVHJhY2UoKHN0ZGVyciwgIlhHZXRWaXN1YWxJbmZvKCkgcmV0dXJuZWQgJWQgMjQtYml0IHZpc3VhbHNcbiIsCi0gICAgICAgICAgdmlzdWFsc19tYXRjaGVkKSkKLSAgICAgICAgdmlzdWFsID0gdmlzdWFsX2xpc3RbMF0udmlzdWFsOwotICAgICAgICBkZXB0aCA9IHZpc3VhbF9saXN0WzBdLmRlcHRoOwotLyoKLSAgICAgICAgY29sb3JtYXBfc2l6ZSA9IHZpc3VhbF9saXN0WzBdLmNvbG9ybWFwX3NpemU7Ci0gICAgICAgIHZpc3VhbF9jbGFzcyA9IHZpc3VhbC0+Y2xhc3M7Ci0gICAgICAgIHZpc3VhbElEID0gWFZpc3VhbElERnJvbVZpc3VhbCh2aXN1YWwpOwotICovCi0gICAgICAgIGhhdmVfbm9uZGVmYXVsdF92aXN1YWwgPSBUUlVFOwotICAgICAgICBuZWVkX2NvbG9ybWFwID0gVFJVRTsKLSAgICB9IGVsc2UgewotICAgICAgICBYTWF0Y2hWaXN1YWxJbmZvKGRpc3BsYXksIHNjcmVlbiwgZGVwdGgsIFRydWVDb2xvciwgJnZpc3VhbF9pbmZvKTsKLSAgICAgICAgdmlzdWFsID0gdmlzdWFsX2luZm8udmlzdWFsOwotICAgIH0KLSNlbmRpZgotCi0gICAgUk1hc2sgPSB2aXN1YWwtPnJlZF9tYXNrOwotICAgIEdNYXNrID0gdmlzdWFsLT5ncmVlbl9tYXNrOwotICAgIEJNYXNrID0gdmlzdWFsLT5ibHVlX21hc2s7Ci0KLS8qIEdSUjogIGFkZC9jaGVjayA4LWJpdCBzdXBwb3J0ICovCi0gICAgaWYgKGRlcHRoID09IDggfHwgbmVlZF9jb2xvcm1hcCkgewotICAgICAgICBjb2xvcm1hcCA9IFhDcmVhdGVDb2xvcm1hcChkaXNwbGF5LCByb290LCB2aXN1YWwsIEFsbG9jTm9uZSk7Ci0gICAgICAgIGlmICghY29sb3JtYXApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWENyZWF0ZUNvbG9ybWFwKCkgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgICAgIGhhdmVfY29sb3JtYXAgPSBUUlVFOwotICAgIH0KLSAgICBpZiAoZGVwdGggPT0gMTUgfHwgZGVwdGggPT0gMTYpIHsKLSAgICAgICAgUlNoaWZ0ID0gMTUgLSBycG5nX3hfbXNiKFJNYXNrKTsgICAgLyogdGhlc2UgYXJlIHJpZ2h0LXNoaWZ0cyAqLwotICAgICAgICBHU2hpZnQgPSAxNSAtIHJwbmdfeF9tc2IoR01hc2spOwotICAgICAgICBCU2hpZnQgPSAxNSAtIHJwbmdfeF9tc2IoQk1hc2spOwotICAgIH0gZWxzZSBpZiAoZGVwdGggPiAxNikgewotI2RlZmluZSBOT18yNEJJVF9NQVNLUwotI2lmZGVmIE5PXzI0QklUX01BU0tTCi0gICAgICAgIFJTaGlmdCA9IHJwbmdfeF9tc2IoUk1hc2spIC0gNzsgICAgIC8qIHRoZXNlIGFyZSBsZWZ0LXNoaWZ0cyAqLwotICAgICAgICBHU2hpZnQgPSBycG5nX3hfbXNiKEdNYXNrKSAtIDc7Ci0gICAgICAgIEJTaGlmdCA9IHJwbmdfeF9tc2IoQk1hc2spIC0gNzsKLSNlbHNlCi0gICAgICAgIFJTaGlmdCA9IDcgLSBycG5nX3hfbXNiKFJNYXNrKTsgICAgIC8qIHRoZXNlIGFyZSByaWdodC1zaGlmdHMsIHRvbyAqLwotICAgICAgICBHU2hpZnQgPSA3IC0gcnBuZ194X21zYihHTWFzayk7Ci0gICAgICAgIEJTaGlmdCA9IDcgLSBycG5nX3hfbXNiKEJNYXNrKTsKLSNlbmRpZgotICAgIH0KLSAgICBpZiAoZGVwdGggPj0gMTUgJiYgKFJTaGlmdCA8IDAgfHwgR1NoaWZ0IDwgMCB8fCBCU2hpZnQgPCAwKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJwbmcgaW50ZXJuYWwgbG9naWMgZXJyb3I6ICBuZWdhdGl2ZSBYIHNoaWZ0KHMpIVxuIik7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGaW5hbGx5LCBjcmVhdGUgdGhlIHdpbmRvdy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGF0dHIuYmFja2luZ19zdG9yZSA9IEFsd2F5czsKLSAgICBhdHRyLmV2ZW50X21hc2sgPSBFeHBvc3VyZU1hc2sgfCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2s7Ci0gICAgYXR0cm1hc2sgPSBDV0JhY2tpbmdTdG9yZSB8IENXRXZlbnRNYXNrOwotICAgIGlmIChoYXZlX25vbmRlZmF1bHRfdmlzdWFsKSB7Ci0gICAgICAgIGF0dHIuY29sb3JtYXAgPSBjb2xvcm1hcDsKLSAgICAgICAgYXR0ci5iYWNrZ3JvdW5kX3BpeGVsID0gMDsKLSAgICAgICAgYXR0ci5ib3JkZXJfcGl4ZWwgPSAxOwotICAgICAgICBhdHRybWFzayB8PSBDV0NvbG9ybWFwIHwgQ1dCYWNrUGl4ZWwgfCBDV0JvcmRlclBpeGVsOwotICAgIH0KLQotICAgIHdpbmRvdyA9IFhDcmVhdGVXaW5kb3coZGlzcGxheSwgcm9vdCwgMCwgMCwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgMCwKLSAgICAgIGRlcHRoLCBJbnB1dE91dHB1dCwgdmlzdWFsLCBhdHRybWFzaywgJmF0dHIpOwotCi0gICAgaWYgKHdpbmRvdyA9PSBOb25lKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiWENyZWF0ZVdpbmRvdygpIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0gZWxzZQotICAgICAgICBoYXZlX3dpbmRvdyA9IFRSVUU7Ci0KLSAgICBpZiAoZGVwdGggPT0gOCkKLSAgICAgICAgWFNldFdpbmRvd0NvbG9ybWFwKGRpc3BsYXksIHdpbmRvdywgY29sb3JtYXApOwotCi0gICAgaWYgKCFYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KCZ3aW5kb3dfbmFtZSwgMSwgcFdpbmRvd05hbWUpKQotICAgICAgICBwV2luZG93TmFtZSA9IE5VTEw7Ci0gICAgaWYgKCFYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KCZpY29uX25hbWUsIDEsIHBJY29uTmFtZSkpCi0gICAgICAgIHBJY29uTmFtZSA9IE5VTEw7Ci0KLSAgICAvKiBPSyBpZiBhbnkgaGludHMgYWxsb2NhdGlvbiBmYWlsczsgWFNldFdNUHJvcGVydGllcygpIGFsbG93cyBOVUxMcyAqLwotCi0gICAgaWYgKChzaXplX2hpbnRzID0gWEFsbG9jU2l6ZUhpbnRzKCkpICE9IE5VTEwpIHsKLSAgICAgICAgLyogd2luZG93IHdpbGwgbm90IGJlIHJlc2l6YWJsZSAqLwotICAgICAgICBzaXplX2hpbnRzLT5mbGFncyA9IFBNaW5TaXplIHwgUE1heFNpemU7Ci0gICAgICAgIHNpemVfaGludHMtPm1pbl93aWR0aCA9IHNpemVfaGludHMtPm1heF93aWR0aCA9IChpbnQpaW1hZ2Vfd2lkdGg7Ci0gICAgICAgIHNpemVfaGludHMtPm1pbl9oZWlnaHQgPSBzaXplX2hpbnRzLT5tYXhfaGVpZ2h0ID0gKGludClpbWFnZV9oZWlnaHQ7Ci0gICAgfQotCi0gICAgaWYgKCh3bV9oaW50cyA9IFhBbGxvY1dNSGludHMoKSkgIT0gTlVMTCkgewotICAgICAgICB3bV9oaW50cy0+aW5pdGlhbF9zdGF0ZSA9IE5vcm1hbFN0YXRlOwotICAgICAgICB3bV9oaW50cy0+aW5wdXQgPSBUcnVlOwotICAgICAvKiB3bV9oaW50cy0+aWNvbl9waXhtYXAgPSBpY29uX3BpeG1hcDsgKi8KLSAgICAgICAgd21faGludHMtPmZsYWdzID0gU3RhdGVIaW50IHwgSW5wdXRIaW50ICAvKiB8IEljb25QaXhtYXBIaW50ICovIDsKLSAgICB9Ci0KLSAgICBpZiAoKGNsYXNzX2hpbnRzID0gWEFsbG9jQ2xhc3NIaW50KCkpICE9IE5VTEwpIHsKLSAgICAgICAgY2xhc3NfaGludHMtPnJlc19uYW1lID0gcmVzX25hbWU7Ci0gICAgICAgIGNsYXNzX2hpbnRzLT5yZXNfY2xhc3MgPSByZXNfY2xhc3M7Ci0gICAgfQotCi0gICAgWFNldFdNUHJvcGVydGllcyhkaXNwbGF5LCB3aW5kb3csIHBXaW5kb3dOYW1lLCBwSWNvbk5hbWUsIE5VTEwsIDAsCi0gICAgICBzaXplX2hpbnRzLCB3bV9oaW50cywgY2xhc3NfaGludHMpOwotCi0gICAgLyogdmFyaW91cyBwcm9wZXJ0aWVzIGFuZCBoaW50cyBubyBsb25nZXIgbmVlZGVkOyBmcmVlIG1lbW9yeSAqLwotICAgIGlmIChwV2luZG93TmFtZSkKLSAgICAgICBYRnJlZShwV2luZG93TmFtZS0+dmFsdWUpOwotICAgIGlmIChwSWNvbk5hbWUpCi0gICAgICAgWEZyZWUocEljb25OYW1lLT52YWx1ZSk7Ci0gICAgaWYgKHNpemVfaGludHMpCi0gICAgICAgIFhGcmVlKHNpemVfaGludHMpOwotICAgIGlmICh3bV9oaW50cykKLSAgICAgICBYRnJlZSh3bV9oaW50cyk7Ci0gICAgaWYgKGNsYXNzX2hpbnRzKQotICAgICAgIFhGcmVlKGNsYXNzX2hpbnRzKTsKLQotICAgIFhNYXBXaW5kb3coZGlzcGxheSwgd2luZG93KTsKLQotICAgIGdjID0gWENyZWF0ZUdDKGRpc3BsYXksIHdpbmRvdywgMCwgJmdjdmFsdWVzKTsKLSAgICBoYXZlX2djID0gVFJVRTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGaWxsIHdpbmRvdyB3aXRoIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvci4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICBiZ19waXhlbCA9ICgodWxnKWJnX3JlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICgodWxnKWJnX2dyZWVuIDw8IEdTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICgodWxnKWJnX2JsdWUgIDw8IEJTaGlmdCk7Ci0gICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewotICAgICAgICBiZ19waXhlbCA9ICgoKCh1bGcpYmdfcmVkICAgPDwgOCkgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgKCgoKHVsZyliZ19ncmVlbiA8PCA4KSA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAoKCgodWxnKWJnX2JsdWUgIDw8IDgpID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewotCi0gICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCi0KLSAgICB9Ci0KLSAgICBYU2V0Rm9yZWdyb3VuZChkaXNwbGF5LCBnYywgYmdfcGl4ZWwpOwotICAgIFhGaWxsUmVjdGFuZ2xlKGRpc3BsYXksIHdpbmRvdywgZ2MsIDAsIDAsIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFdhaXQgZm9yIGZpcnN0IEV4cG9zZSBldmVudCB0byBkbyBhbnkgZHJhd2luZywgdGhlbiBmbHVzaC4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGRvCi0gICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwotICAgIHdoaWxlIChlLnR5cGUgIT0gRXhwb3NlIHx8IGUueGV4cG9zZS5jb3VudCk7Ci0KLSAgICBYRmx1c2goZGlzcGxheSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgWC0gYW5kIGRpc3BsYXktc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaW1hZ2UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKLSAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKDQqaW1hZ2Vfd2lkdGgqaW1hZ2VfaGVpZ2h0KTsKLSAgICAgICAgcGFkID0gMzI7Ci0gICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewotICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MoMippbWFnZV93aWR0aCppbWFnZV9oZWlnaHQpOwotICAgICAgICBwYWQgPSAxNjsKLSAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7Ci0gICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYyhpbWFnZV93aWR0aCppbWFnZV9oZWlnaHQpOwotICAgICAgICBwYWQgPSA4OwotICAgIH0KLQotICAgIGlmICgheGRhdGEpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICB1bmFibGUgdG8gYWxsb2NhdGUgaW1hZ2UgbWVtb3J5XG4iKTsKLSAgICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotCi0gICAgeGltYWdlID0gWENyZWF0ZUltYWdlKGRpc3BsYXksIHZpc3VhbCwgZGVwdGgsIFpQaXhtYXAsIDAsCi0gICAgICAoY2hhciAqKXhkYXRhLCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LCBwYWQsIDApOwotCi0gICAgaWYgKCF4aW1hZ2UpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBYQ3JlYXRlSW1hZ2UoKSBmYWlsZWRcbiIpOwotICAgICAgICBmcmVlKHhkYXRhKTsKLSAgICAgICAgcmV0dXJuIDM7Ci0gICAgfQotCi0gICAgLyogdG8gYXZvaWQgdGVzdGluZyB0aGUgYnl0ZSBvcmRlciBldmVyeSBwaXhlbCAob3IgZG91YmxpbmcgdGhlIHNpemUgb2YKLSAgICAgKiB0aGUgZHJhd2luZyByb3V0aW5lIHdpdGggYSBnaWFudCBpZi10ZXN0KSwgd2UgYXJiaXRyYXJpbHkgc2V0IHRoZSBieXRlCi0gICAgICogb3JkZXIgdG8gTVNCRmlyc3QgYW5kIGxldCBYbGliIHdvcnJ5IGFib3V0IGludmVydGluZyB0aGluZ3Mgb24gbGl0dGxlLQotICAgICAqIGVuZGlhbiBtYWNoaW5lcyAobGlrZSBMaW51eC94ODYsIG9sZCBWQVhlbiwgZXRjLiktLXRoaXMgaXMgbm90IHRoZSBtb3N0Ci0gICAgICogZWZmaWNpZW50IGFwcHJvYWNoICh0aGUgZ2lhbnQgaWYtdGVzdCB3b3VsZCBiZSBiZXR0ZXIpLCBidXQgaW4gdGhlCi0gICAgICogaW50ZXJlc3Qgb2YgY2xhcml0eSwgd2UgdGFrZSB0aGUgZWFzeSB3YXkgb3V0Li4uICovCi0KLSAgICB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdDsKLQotICAgIHJldHVybiAwOwotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nX3hfY3JlYXRlX3dpbmRvdygpICovCi0KLQotCi0KLQotc3RhdGljIGludCBycG5nX3hfZGlzcGxheV9pbWFnZSh2b2lkKQotewotICAgIHVjaCAqc3JjOwotICAgIGNoYXIgKmRlc3Q7Ci0gICAgdWNoIHIsIGcsIGIsIGE7Ci0gICAgdWxnIGksIHJvdywgbGFzdHJvdyA9IDA7Ci0gICAgdWxnIHBpeGVsOwotICAgIGludCB4aW1hZ2Vfcm93Ynl0ZXMgPSB4aW1hZ2UtPmJ5dGVzX3Blcl9saW5lOwotLyogIGludCBicHAgPSB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsOyAgKi8KLQotCi0gICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBkaXNwbGF5IGxvb3AgKGltYWdlX2NoYW5uZWxzID09ICVkKVxuIiwKLSAgICAgIGltYWdlX2NoYW5uZWxzKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICAgKHdpZHRoID0gJWxkLCByb3dieXRlcyA9ICVsZCwgeGltYWdlX3Jvd2J5dGVzID0gJWQpXG4iLAotICAgICAgaW1hZ2Vfd2lkdGgsIGltYWdlX3Jvd2J5dGVzLCB4aW1hZ2Vfcm93Ynl0ZXMpKQotICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnBwID0gJWQpXG4iLCB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICAgKGJ5dGVfb3JkZXIgPSAlcylcbiIsIHhpbWFnZS0+Ynl0ZV9vcmRlciA9PSBNU0JGaXJzdD8KLSAgICAgICJNU0JGaXJzdCIgOiAoeGltYWdlLT5ieXRlX29yZGVyID09IExTQkZpcnN0PyAiTFNCRmlyc3QiIDogInVua25vd24iKSkpCi0KLSAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKLSAgICAgICAgdWxnIHJlZCwgZ3JlZW4sIGJsdWU7Ci0KLSAgICAgICAgZm9yIChsYXN0cm93ID0gcm93ID0gMDsgIHJvdyA8IGltYWdlX2hlaWdodDsgICsrcm93KSB7Ci0gICAgICAgICAgICBzcmMgPSBpbWFnZV9kYXRhICsgcm93KmltYWdlX3Jvd2J5dGVzOwotICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBpZiAoaW1hZ2VfY2hhbm5lbHMgPT0gMykgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IGltYWdlX3dpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKLSNpZmRlZiBOT18yNEJJVF9NQVNLUwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHOiAgdGhpcyBhc3N1bWVzIGJwcCA9PSAzMiwgYnV0IG1heSBiZSAyNDogKi8KLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICByZWQgICA9IChSU2hpZnQgPCAwKT8gcmVkICAgPDwgKC1SU2hpZnQpIDogcmVkICAgPj4gUlNoaWZ0OwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9IChHU2hpZnQgPCAwKT8gZ3JlZW4gPDwgKC1HU2hpZnQpIDogZ3JlZW4gPj4gR1NoaWZ0OwotICAgICAgICAgICAgICAgICAgICBibHVlICA9IChCU2hpZnQgPCAwKT8gYmx1ZSAgPDwgKC1CU2hpZnQpIDogYmx1ZSAgPj4gQlNoaWZ0OwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgJiBSTWFzaykgfCAoZ3JlZW4gJiBHTWFzaykgfCAoYmx1ZSAmIEJNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChpbWFnZV9jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBiID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gYmdfcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBiZ19ncmVlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYmdfYmx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHJlZCwgICByLCBhLCBiZ19yZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGdyZWVuLCBnLCBhLCBiZ19ncmVlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYmx1ZSwgIGIsIGEsIGJnX2JsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGRpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgbGluZXMgKi8KLSAgICAgICAgICAgIGlmICgoKHJvdysxKSAmIDB4ZikgPT0gMCkgewotICAgICAgICAgICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKLSAgICAgICAgICAgICAgICAgIChpbnQpbGFzdHJvdywgaW1hZ2Vfd2lkdGgsIDE2KTsKLSAgICAgICAgICAgICAgICBYRmx1c2goZGlzcGxheSk7Ci0gICAgICAgICAgICAgICAgbGFzdHJvdyA9IHJvdyArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKLSAgICAgICAgdXNoIHJlZCwgZ3JlZW4sIGJsdWU7Ci0KLSAgICAgICAgZm9yIChsYXN0cm93ID0gcm93ID0gMDsgIHJvdyA8IGltYWdlX2hlaWdodDsgICsrcm93KSB7Ci0gICAgICAgICAgICBzcmMgPSBpbWFnZV9kYXRhICsgcm93KmltYWdlX3Jvd2J5dGVzOwotICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBpZiAoaW1hZ2VfY2hhbm5lbHMgPT0gMykgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IGltYWdlX3dpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCkoKnNyYykgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKSgqc3JjKSA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgKytzcmM7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICArK3NyYzsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOwotICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAoaW1hZ2VfY2hhbm5lbHMgPT0gNCkgKi8gewotICAgICAgICAgICAgICAgIGZvciAoaSA9IGltYWdlX3dpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKXIgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKWJnX3JlZCAgIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCliZ19ncmVlbiA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYmdfYmx1ZSAgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBiYWNrIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCBhcmd1bWVudCAoPT0gZmcgYnl0ZSBoZXJlOiAgc2FmZSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyLCByLCBhLCBiZ19yZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGcsIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShiLCBiLCBhLCBiZ19ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLwotICAgICAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAotICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBpbWFnZV93aWR0aCwgMTYpOwotICAgICAgICAgICAgICAgIFhGbHVzaChkaXNwbGF5KTsKLSAgICAgICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewotCi0gICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCi0KLSAgICB9Ci0KLSAgICBUcmFjZSgoc3RkZXJyLCAiY2FsbGluZyBmaW5hbCBYUHV0SW1hZ2UoKVxuIikpCi0gICAgaWYgKGxhc3Ryb3cgPCBpbWFnZV9oZWlnaHQpIHsKLSAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAotICAgICAgICAgIChpbnQpbGFzdHJvdywgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodC1sYXN0cm93KTsKLSAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0KLQotCi1zdGF0aWMgdm9pZCBycG5nX3hfY2xlYW51cCh2b2lkKQotewotICAgIGlmIChpbWFnZV9kYXRhKSB7Ci0gICAgICAgIGZyZWUoaW1hZ2VfZGF0YSk7Ci0gICAgICAgIGltYWdlX2RhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIGlmICh4aW1hZ2UpIHsKLSAgICAgICAgaWYgKHhpbWFnZS0+ZGF0YSkgewotICAgICAgICAgICAgZnJlZSh4aW1hZ2UtPmRhdGEpOyAgICAgICAgICAgLyogd2UgYWxsb2NhdGVkIGl0LCBzbyB3ZSBmcmVlIGl0ICovCi0gICAgICAgICAgICB4aW1hZ2UtPmRhdGEgPSAoY2hhciAqKU5VTEw7ICAvKiAgaW5zdGVhZCBvZiBYRGVzdHJveUltYWdlKCkgKi8KLSAgICAgICAgfQotICAgICAgICBYRGVzdHJveUltYWdlKHhpbWFnZSk7Ci0gICAgICAgIHhpbWFnZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGhhdmVfZ2MpCi0gICAgICAgIFhGcmVlR0MoZGlzcGxheSwgZ2MpOwotCi0gICAgaWYgKGhhdmVfd2luZG93KQotICAgICAgICBYRGVzdHJveVdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpOwotCi0gICAgaWYgKGhhdmVfY29sb3JtYXApCi0gICAgICAgIFhGcmVlQ29sb3JtYXAoZGlzcGxheSwgY29sb3JtYXApOwotCi0gICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpCi0gICAgICAgIFhGcmVlKHZpc3VhbF9saXN0KTsKLX0KLQotCi0KLQotCi1zdGF0aWMgaW50IHJwbmdfeF9tc2IodWxnIHUzMnZhbCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDMxOyAgaSA+PSAwOyAgLS1pKSB7Ci0gICAgICAgIGlmICh1MzJ2YWwgJiAweDgwMDAwMDAwTCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB1MzJ2YWwgPDw9IDE7Ci0gICAgfQotICAgIHJldHVybiBpOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9ycG5nMi13aW4uYyBiL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZzItd2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmN2FkNzguLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9ycG5nMi13aW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEyMjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcnBuZzIgLSBwcm9ncmVzc2l2ZS1tb2RlbCBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgIHJwbmcyLXdpbi5jCi0KLSAgIFRoaXMgcHJvZ3JhbSBkZWNvZGVzIGFuZCBkaXNwbGF5cyBQTkcgZmlsZXMgcHJvZ3Jlc3NpdmVseSwgYXMgaWYgaXQgd2VyZQotICAgYSB3ZWIgYnJvd3NlciAodGhvdWdoIHRoZSBmcm9udCBlbmQgaXMgb25seSBzZXQgdXAgdG8gcmVhZCBmcm9tIGZpbGVzKS4KLSAgIEl0IHN1cHBvcnRzIGdhbW1hIGNvcnJlY3Rpb24sIHVzZXItc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3JzLCBhbmQgdXNlci0KLSAgIHNwZWNpZmllZCBiYWNrZ3JvdW5kIHBhdHRlcm5zIChmb3IgdHJhbnNwYXJlbnQgaW1hZ2VzKS4gIFRoaXMgdmVyc2lvbiBpcwotICAgZm9yIDMyLWJpdCBXaW5kb3dzOyBpdCBtYXkgY29tcGlsZSB1bmRlciAxNi1iaXQgV2luZG93cyB3aXRoIGEgbGl0dGxlCi0gICB0d2Vha2luZyAob3IgbWF5YmUgbm90KS4gIFRoYW5rcyB0byBBZGFtIENvc3RlbGxvIGFuZCBQaWV0ZXIgUy4gdmFuIGRlcgotICAgTWV1bGVuIGZvciB0aGUgImRpYW1vbmQiIGFuZCAicmFkaWFsIHdhdmVzIiBwYXR0ZXJucywgcmVzcGVjdGl2ZWx5LgotCi0gICB0byBkbyAoc29tZWRheSwgbWF5YmUpOgotICAgIC0gaGFuZGxlIHF1b3RlZCBjb21tYW5kLWxpbmUgYXJncyAoZXNwZWNpYWxseSBmaWxlbmFtZXMgd2l0aCBzcGFjZXMpCi0gICAgLSBmaW5pc2ggcmVzaXphYmxlIGNoZWNrZXJib2FyZC1ncmFkaWVudCAoc2l6ZXMgNC0xMjg/KQotICAgIC0gdXNlICUuMTAyM3MgdG8gc2ltcGxpZnkgdHJ1bmNhdGlvbiBvZiB0aXRsZS1iYXIgc3RyaW5nPwotICAgIC0gaGF2ZSBtaW5pbXVtIHdpbmRvdyB3aWR0aDogIG9oIHdlbGwKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgQ2hhbmdlbG9nOgotICAgIC0gMS4wMTogIGluaXRpYWwgcHVibGljIHJlbGVhc2UKLSAgICAtIDEuMDI6ICBmaXhlZCBjdXQtYW5kLXBhc3RlIGVycm9yIGluIHVzYWdlIHNjcmVlbiAob29wcy4uLikKLSAgICAtIDEuMDM6ICBtb2RpZmllZCB0byBhbGxvdyBhYmJyZXZpYXRlZCBvcHRpb25zCi0gICAgLSAxLjA0OiAgcmVtb3ZlZCBib2d1cyBleHRyYSBhcmd1bWVudCBmcm9tIHVzYWdlIGZwcmludGYoKSBbR2xlbm4gUi1QP107Ci0gICAgICAgICAgICAgIGZpeGVkIGNvbW1hbmQtbGluZSBwYXJzaW5nIGJ1ZwotICAgIC0gMS4xMDogIGVuYWJsZWQgIm1lc3NhZ2Ugd2luZG93Ii9jb25zb2xlICh0aGFua3MgdG8gRGF2aWQgR2VsZHJlaWNoKQotICAgIC0gMS4yMDogIGFkZGVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgbmV3IC1tbXgqIG9wdGlvbnMKLSAgICAtIDEuMjE6ICBtYWRlIG1pbm9yIHR3ZWFrIHRvIHVzYWdlIHNjcmVlbiB0byBmaXQgd2l0aGluIDI1LWxpbmUgY29uc29sZQotICAgIC0gMS4yMjogIGFkZGVkIEFNRDY0L0VNNjRUIHN1cHBvcnQgKF9feDg2XzY0X18pCi0gICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKLSAgICAtIDIuMDE6ICBmaXhlZCA2NC1iaXQgdHlwbyBpbiByZWFkcG5nMi5jCi0gICAgLSAyLjAyOiAgZml4ZWQgaW1wcm9wZXIgZGlzcGxheSBvZiB1c2FnZSBzY3JlZW4gb24gUE5HIGVycm9yKHMpOyBmaXhlZAotICAgICAgICAgICAgICB1bmV4cGVjdGVkLUVPRiBhbmQgZmlsZS1yZWFkLWVycm9yIGNhc2VzCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgUFJPR05BTUUgICJycG5nMi13aW4iCi0jZGVmaW5lIExPTkdOQU1FICAiUHJvZ3Jlc3NpdmUgUE5HIFZpZXdlciBmb3IgV2luZG93cyIKLSNkZWZpbmUgVkVSU0lPTiAgICIyLjAyIG9mIDE2IE1hcmNoIDIwMDgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHNldGptcC5oPiAgICAvKiBmb3Igam1wYnVmIGRlY2xhcmF0aW9uIGluIHJlYWRwbmcyLmggKi8KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPiAgICAgIC8qIG9ubHkgZm9yIFB2ZE0gYmFja2dyb3VuZCBjb2RlICovCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPGNvbmlvLmg+ICAgICAvKiBvbmx5IGZvciBfZ2V0Y2goKSAqLwotCi0vKiBhbGwgZm9yIFB2ZE0gYmFja2dyb3VuZCBjb2RlOiAqLwotI2lmbmRlZiBQSQotIyAgZGVmaW5lIFBJICAgICAgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4Ci0jZW5kaWYKLSNkZWZpbmUgUElfMiAgICAgICAgICAgICAoUEkqMC41KQotI2RlZmluZSBJTlZfUElfMzYwICAgICAgICgzNjAuMCAvIFBJKQotI2RlZmluZSBNQVgoYSxiKSAgICAgICAgIChhPmI/YTpiKQotI2RlZmluZSBNSU4oYSxiKSAgICAgICAgIChhPGI/YTpiKQotI2RlZmluZSBDTElQKGEsbWluLG1heCkgIE1BWChtaW4sTUlOKChhKSxtYXgpKQotI2RlZmluZSBBQlMoYSkgICAgICAgICAgICgoYSk8MD8tKGEpOihhKSkKLSNkZWZpbmUgQ0xJUDhQKGMpICAgICAgICBNQVgoMCwoTUlOKChjKSwyNTUpKSkgICAvKiA4LWJpdCBwb3MuIGludGVnZXIgKHVjaCkgKi8KLSNkZWZpbmUgUk9VTkRGKGYpICAgICAgICAoKGludCkoZiArIDAuNSkpCi0KLSNkZWZpbmUgcmdiMV9tYXggICBiZ19mcmVxCi0jZGVmaW5lIHJnYjFfbWluICAgYmdfZ3JheQotI2RlZmluZSByZ2IyX21heCAgIGJnX2JzYXQKLSNkZWZpbmUgcmdiMl9taW4gICBiZ19icm90Ci0KLS8qICNkZWZpbmUgREVCVUcgKi8gICAgIC8qIHRoaXMgZW5hYmxlcyB0aGUgVHJhY2UoKSBtYWNyb3MgKi8KLQotI2luY2x1ZGUgInJlYWRwbmcyLmgiICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHJlYWRwbmcyIHByb3RvdHlwZXMgKi8KLQotCi0vKiBjb3VsZCBqdXN0IGluY2x1ZGUgcG5nLmgsIGJ1dCB0aGlzIG1hY3JvIGlzIHRoZSBvbmx5IHRoaW5nIHdlIG5lZWQKLSAqIChuYW1lIGFuZCB0eXBlZGVmcyBjaGFuZ2VkIHRvIGxvY2FsIHZlcnNpb25zKTsgbm90ZSB0aGF0IHNpZGUgZWZmZWN0cwotICogb25seSBoYXBwZW4gd2l0aCBhbHBoYSAod2hpY2ggY291bGQgZWFzaWx5IGJlIGF2b2lkZWQgd2l0aAotICogInVzaCBhY29weSA9IChhbHBoYSk7IikgKi8KLQotI2RlZmluZSBhbHBoYV9jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSB7ICAgICAgICAgICAgICAgXAotICAgIHVzaCB0ZW1wID0gKCh1c2gpKGZnKSoodXNoKShhbHBoYSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICh1c2gpKGJnKSoodXNoKSgyNTUgLSAodXNoKShhbHBoYSkpICsgKHVzaCkxMjgpOyAgXAotICAgIChjb21wb3NpdGUpID0gKHVjaCkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7ICAgICAgICAgICAgICAgXAotfQotCi0KLSNkZWZpbmUgSU5CVUZTSVpFIDQwOTYgICAvKiB3aXRoIHBzZXVkby10aW1pbmcgb24gKDEgc2VjIGRlbGF5L2Jsb2NrKSwgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAqICBibG9jayBzaXplIGNvcnJlc3BvbmRzIHJvdWdobHkgdG8gYSBkb3dubG9hZAotICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzcGVlZCAxMCUgZmFzdGVyIHRoYW4gdGhlb3JldGljYWwgMzMuNksgbWF4aW11bQotICAgICAgICAgICAgICAgICAgICAgICAgICAqICAoYXNzdW1pbmcgOCBkYXRhIGJpdHMsIDEgc3RvcCBiaXQgYW5kIG5vIG90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogIG92ZXJoZWFkKSAqLwotCi0vKiBsb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZCAgICAgICBycG5nMl93aW5faW5pdCh2b2lkKTsKLXN0YXRpYyBpbnQgICAgICAgIHJwbmcyX3dpbl9jcmVhdGVfd2luZG93KHZvaWQpOwotc3RhdGljIGludCAgICAgICAgcnBuZzJfd2luX2xvYWRfYmdfaW1hZ2Uodm9pZCk7Ci1zdGF0aWMgdm9pZCAgICAgICBycG5nMl93aW5fZGlzcGxheV9yb3codWxnIHJvdyk7Ci1zdGF0aWMgdm9pZCAgICAgICBycG5nMl93aW5fZmluaXNoX2Rpc3BsYXkodm9pZCk7Ci1zdGF0aWMgdm9pZCAgICAgICBycG5nMl93aW5fY2xlYW51cCh2b2lkKTsKLUxSRVNVTFQgQ0FMTEJBQ0sgIHJwbmcyX3dpbl93bmRwcm9jKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKLQotCi1zdGF0aWMgY2hhciB0aXRsZWJhclsxMDI0XTsKLXN0YXRpYyBjaGFyICpwcm9nbmFtZSA9IFBST0dOQU1FOwotc3RhdGljIGNoYXIgKmFwcG5hbWUgPSBMT05HTkFNRTsKLXN0YXRpYyBjaGFyICpmaWxlbmFtZTsKLXN0YXRpYyBGSUxFICppbmZpbGU7Ci0KLXN0YXRpYyBtYWlucHJvZ19pbmZvIHJwbmcyX2luZm87Ci0KLXN0YXRpYyB1Y2ggaW5idWZbSU5CVUZTSVpFXTsKLXN0YXRpYyBpbnQgaW5jb3VudDsKLQotc3RhdGljIGludCBwYXQgPSA2OyAgICAgICAgIC8qIG11c3QgYmUgbGVzcyB0aGFuIG51bV9iZ3BhdCAqLwotc3RhdGljIGludCBiZ19pbWFnZSA9IDA7Ci1zdGF0aWMgaW50IGJnc2NhbGUgPSAxNjsKLXN0YXRpYyB1bGcgYmdfcm93Ynl0ZXM7Ci1zdGF0aWMgdWNoICpiZ19kYXRhOwotCi1zdGF0aWMgc3RydWN0IHJnYl9jb2xvciB7Ci0gICAgdWNoIHIsIGcsIGI7Ci19IHJnYltdID0gewotICAgIHsgIDAsICAgMCwgICAwfSwgICAgLyogIDA6ICBibGFjayAqLwotICAgIHsyNTUsIDI1NSwgMjU1fSwgICAgLyogIDE6ICB3aGl0ZSAqLwotICAgIHsxNzMsIDEzMiwgIDU3fSwgICAgLyogIDI6ICB0YW4gKi8KLSAgICB7IDY0LCAxMzIsICAgMH0sICAgIC8qICAzOiAgbWVkaXVtIGdyZWVuICovCi0gICAgezE4OSwgMTE3LCAgIDF9LCAgICAvKiAgNDogIGdvbGQgKi8KLSAgICB7MjUzLCAyNDksICAgMX0sICAgIC8qICA1OiAgeWVsbG93ICovCi0gICAgeyAgMCwgICAwLCAyNTV9LCAgICAvKiAgNjogIGJsdWUgKi8KLSAgICB7ICAwLCAgIDAsIDEyMH0sICAgIC8qICA3OiAgbWVkaXVtIGJsdWUgKi8KLSAgICB7MjU1LCAgIDAsIDI1NX0sICAgIC8qICA4OiAgbWFnZW50YSAqLwotICAgIHsgNjQsICAgMCwgIDY0fSwgICAgLyogIDk6ICBkYXJrIG1hZ2VudGEgKi8KLSAgICB7MjU1LCAgIDAsICAgMH0sICAgIC8qIDEwOiAgcmVkICovCi0gICAgeyA2NCwgICAwLCAgIDB9LCAgICAvKiAxMTogIGRhcmsgcmVkICovCi0gICAgezI1NSwgMTI3LCAgIDB9LCAgICAvKiAxMjogIG9yYW5nZSAqLwotICAgIHsxOTIsICA5NiwgICAwfSwgICAgLyogMTM6ICBkYXJrZXIgb3JhbmdlICovCi0gICAgeyAyNCwgIDYwLCAgIDB9LCAgICAvKiAxNDogIGRhcmsgZ3JlZW4teWVsbG93ICovCi0gICAgeyA4NSwgMTI1LCAyMDB9ICAgICAvKiAxNTogIGljZSBibHVlICovCi19OwotLyogbm90IHVzZWQgZm9yIG5vdywgYnV0IHNob3VsZCBiZSBmb3IgZXJyb3ItY2hlY2tpbmc6Ci1zdGF0aWMgaW50IG51bV9yZ2IgPSBzaXplb2YocmdiKSAvIHNpemVvZihzdHJ1Y3QgcmdiX2NvbG9yKTsKLSAqLwotCi0vKgotICAgIFRoaXMgd2hvbGUgc3RydWN0IGlzIGEgZmFpcmx5IGNoZWVzeSB3YXkgdG8ga2VlcCB0aGUgbnVtYmVyIG9mCi0gICAgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBtaW5pbXVtLiAgVGhlIHJhZGlhbC13YXZlcyBiYWNrZ3JvdW5kCi0gICAgdHlwZSBpcyBhIHBhcnRpY3VsYXJseSBwb29yIGZpdCB0byB0aGUgaW50ZWdlciBlbGVtZW50cyBvZiB0aGUKLSAgICBzdHJ1Y3QuLi5idXQgYSBmZXcgbWFjcm9zIGFuZCBhIGxpdHRsZSBmaXhlZC1wb2ludCBtYXRoIHdpbGwgZG8KLSAgICB3b25kZXJzIGZvciB5YS4KLQotICAgIHR5cGUgYml0czoKLSAgICAgICBGIEUgRCBDIEIgQSA5IDggNyA2IDUgNCAzIDIgMSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8IHwgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgKy0rLSstLSAwID0gc2hhcnAtZWRnZWQgY2hlY2tlcmJvYXJkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDEgPSBzb2Z0IGRpYW1vbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDIgPSByYWRpYWwgd2F2ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgIDMtNyA9IHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICstLSBncmFkaWVudCAjMiBpbnZlcnRlZD8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tIGFsdGVybmF0aW5nIGNvbHVtbnMgaW52ZXJ0ZWQ/Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgYmFja2dyb3VuZF9wYXR0ZXJuIHsKLSAgICB1c2ggdHlwZTsKLSAgICBpbnQgcmdiMV9tYXgsIHJnYjFfbWluOyAgICAgLyogb3IgYmdfZnJlcSwgYmdfZ3JheSAqLwotICAgIGludCByZ2IyX21heCwgcmdiMl9taW47ICAgICAvKiBvciBiZ19ic2F0LCBiZ19icm90IChib3RoIHNjYWxlZCBieSAxMCkqLwotfSBiZ1tdID0gewotICAgIHswKzgsICAgMiwwLCAgMSwxNX0sICAgICAgICAvKiBjaGVja2VyZWQ6ICB0YW4vYmxhY2sgdnMuIHdoaXRlL2ljZSBibHVlICovCi0gICAgezArMjQsICAyLDAsICAxLDB9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIHRhbi9ibGFjayB2cy4gd2hpdGUvYmxhY2sgKi8KLSAgICB7MCs4LCAgIDQsNSwgIDAsMn0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgZ29sZC95ZWxsb3cgdnMuIGJsYWNrL3RhbiAqLwotICAgIHswKzgsICAgNCw1LCAgMCw2fSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBnb2xkL3llbGxvdyB2cy4gYmxhY2svYmx1ZSAqLwotICAgIHswLCAgICAgNywwLCAgOCw5fSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBkZWVwIGJsdWUvYmxhY2sgdnMuIG1hZ2VudGEgKi8KLSAgICB7MCs4LCAgMTMsMCwgIDUsMTR9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgb3JhbmdlL2JsYWNrIHZzLiB5ZWxsb3cgKi8KLSAgICB7MCs4LCAgMTIsMCwgMTAsMTF9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgb3JhbmdlL2JsYWNrIHZzLiByZWQgKi8KLSAgICB7MSwgICAgIDcsMCwgIDgsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBkZWVwIGJsdWUvYmxhY2sgdnMuIG1hZ2VudGEgKi8KLSAgICB7MSwgICAgMTIsMCwgMTEsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBvcmFuZ2UgdnMuIGRhcmsgcmVkICovCi0gICAgezEsICAgIDEwLDAsICA3LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgcmVkIHZzLiBtZWRpdW0gYmx1ZSAqLwotICAgIHsxLCAgICAgNCwwLCAgNSwwfSwgICAgICAgICAvKiBkaWFtb25kczogIGdvbGQgdnMuIHllbGxvdyAqLwotICAgIHsxLCAgICAgMywwLCAgMCwwfSwgICAgICAgICAvKiBkaWFtb25kczogIG1lZGl1bSBncmVlbiB2cy4gYmxhY2sgKi8KLSAgICB7MiwgICAgMTYsIDEwMCwgIDIwLCAgIDB9LCAgLyogcmFkaWFsOiAgfmhhcmQgcmFkaWFsIGNvbG9yLWJlYW1zICovCi0gICAgezIsICAgIDE4LCAxMDAsICAxMCwgICAyfSwgIC8qIHJhZGlhbDogIHNvZnQsIGN1cnZlZCByYWRpYWwgY29sb3ItYmVhbXMgKi8KLSAgICB7MiwgICAgMTYsIDI1NiwgMTAwLCAyNTB9LCAgLyogcmFkaWFsOiAgdmVyeSB0aWdodCBzcGlyYWwgKi8KLSAgICB7MiwgMTAwMDAsIDI1NiwgIDExLCAgIDB9ICAgLyogcmFkaWFsOiAgZGlwb2xlLW1vaXJlJyAoYWxtb3N0IGZyYWN0YWwpICovCi19Owotc3RhdGljIGludCBudW1fYmdwYXQgPSBzaXplb2YoYmcpIC8gc2l6ZW9mKHN0cnVjdCBiYWNrZ3JvdW5kX3BhdHRlcm4pOwotCi0KLS8qIFdpbmRvd3Mtc3BlY2lmaWMgZ2xvYmFsIHZhcmlhYmxlcyAoY291bGQgZ28gaW4gc3RydWN0LCBidXQgbWVzc3kuLi4pICovCi1zdGF0aWMgdWxnIHdpbWFnZV9yb3dieXRlczsKLXN0YXRpYyB1Y2ggKmRpYjsKLXN0YXRpYyB1Y2ggKndpbWFnZV9kYXRhOwotc3RhdGljIEJJVE1BUElORk9IRUFERVIgKmJtaWg7Ci0KLXN0YXRpYyBIV05EIGdsb2JhbF9od25kOwotc3RhdGljIEhJTlNUQU5DRSBnbG9iYWxfaEluc3Q7Ci1zdGF0aWMgaW50IGdsb2JhbF9zaG93bW9kZTsKLQotCi0KLQotaW50IFdJTkFQSSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdCwgSElOU1RBTkNFIGhQcmV2SW5zdCwgUFNUUiBjbWQsIGludCBzaG93bW9kZSkKLXsKLSAgICBjaGFyICphcmdzWzEwMjRdOyAgICAgICAgICAgICAgICAgLyogYXJiaXRyYXJ5IGxpbWl0LCBidXQgc2hvdWxkIHN1ZmZpY2UgKi8KLSAgICBjaGFyICoqYXJndiA9IGFyZ3M7Ci0gICAgY2hhciAqcCwgKnEsICpiZ3N0ciA9IE5VTEw7Ci0gICAgaW50IGFyZ2MgPSAwOwotICAgIGludCByYywgYWxlbiwgZmxlbjsKLSAgICBpbnQgZXJyb3IgPSAwOwotICAgIGludCB0aW1pbmcgPSBGQUxTRTsKLSAgICBpbnQgaGF2ZV9iZyA9IEZBTFNFOwotICAgIGRvdWJsZSBMVVRfZXhwb25lbnQ7ICAgICAgICAgICAgICAvKiBqdXN0IHRoZSBsb29rdXAgdGFibGUgKi8KLSAgICBkb3VibGUgQ1JUX2V4cG9uZW50ID0gMi4yOyAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwotICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAvKiB3aG9sZSBkaXNwbGF5IHN5c3RlbSAqLwotICAgIE1TRyBtc2c7Ci0KLQotICAgIC8qIEZpcnN0IGluaXRpYWxpemUgYSBmZXcgdGhpbmdzLCBqdXN0IHRvIGJlIHN1cmUtLW1lbXNldCB0YWtlcyBjYXJlIG9mCi0gICAgICogZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIChibGFjayksIGJvb2xlYW5zIChGQUxTRSksIHBvaW50ZXJzIChOVUxMKSwKLSAgICAgKiBldGMuICovCi0KLSAgICBnbG9iYWxfaEluc3QgPSBoSW5zdDsKLSAgICBnbG9iYWxfc2hvd21vZGUgPSBzaG93bW9kZTsKLSAgICBmaWxlbmFtZSA9IChjaGFyICopTlVMTDsKLSAgICBtZW1zZXQoJnJwbmcyX2luZm8sIDAsIHNpemVvZihtYWlucHJvZ19pbmZvKSk7Ci0KLQotICAgIC8qIE5leHQgcmVlbmFibGUgY29uc29sZSBvdXRwdXQsIHdoaWNoIG5vcm1hbGx5IGdvZXMgdG8gdGhlIGJpdCBidWNrZXQKLSAgICAgKiBmb3Igd2luZG93ZWQgYXBwcy4gIENsb3NpbmcgdGhlIGNvbnNvbGUgd2luZG93IHdpbGwgdGVybWluYXRlIHRoZQotICAgICAqIGFwcC4gIFRoYW5rcyB0byBEYXZpZC5HZWxkcmVpY2hAcmVhbHZpei5jb20gZm9yIHN1cHBseWluZyB0aGUgbWFnaWNhbAotICAgICAqIGluY2FudGF0aW9uLiAqLwotCi0gICAgQWxsb2NDb25zb2xlKCk7Ci0gICAgZnJlb3BlbigiQ09OT1VUJCIsICJhIiwgc3RkZXJyKTsKLSAgICBmcmVvcGVuKCJDT05PVVQkIiwgImEiLCBzdGRvdXQpOwotCi0KLSAgICAvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIG91ciBkaXNwbGF5LXN5c3RlbSBleHBvbmVudCwgaS5lLiwgdGhlCi0gICAgICogcHJvZHVjdCBvZiB0aGUgQ1JUIGV4cG9uZW50IGFuZCB0aGUgZXhwb25lbnQgY29ycmVzcG9uZGluZyB0bwotICAgICAqIHRoZSBmcmFtZS1idWZmZXIncyBsb29rdXAgdGFibGUgKExVVCksIGlmIGFueS4gIFRoaXMgaXMgbm90IGFuCi0gICAgICogZXhoYXVzdGl2ZSBsaXN0IG9mIExVVCB2YWx1ZXMgKGUuZy4sIE9wZW5TdGVwIGhhcyBhIGxvdCBvZiB3ZWlyZAotICAgICAqIG9uZXMpLCBidXQgaXQgc2hvdWxkIGNvdmVyIDk5JSBvZiB0aGUgY3VycmVudCBwb3NzaWJpbGl0aWVzLiAgQW5kCi0gICAgICogeWVzLCB0aGVzZSBpZmRlZnMgYXJlIGNvbXBsZXRlbHkgd2FzdGVkIGluIGEgV2luZG93cyBwcm9ncmFtLi4uICovCi0KLSNpZiBkZWZpbmVkKE5lWFQpCi0gICAgLyogdGhpcmQtcGFydHkgdXRpbGl0aWVzIGNhbiBtb2RpZnkgdGhlIGRlZmF1bHQgTFVUIGV4cG9uZW50ICovCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOwotICAgIC8qCi0gICAgaWYgKHNvbWVfbmV4dF9mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm5leHRfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOwotICAgICAqLwotI2VsaWYgZGVmaW5lZChzZ2kpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OwotICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0bwotICAgICAqIGdldCB0aGUgImdhbW1hIiB2YWx1ZSwgc28gd2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCi0gICAgaW5maWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKLSAgICBpZiAoaW5maWxlKSB7Ci0gICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7Ci0KLSAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7Ci0gICAgICAgIGZjbG9zZShpbmZpbGUpOwotICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOwotICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQotICAgICAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gc2dpX2dhbW1hOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQotICAgIExVVF9leHBvbmVudCA9IDEuOCAvIDIuNjE7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSBtYWNfZ2FtbWEgLyAyLjYxOwotICAgICAqLwotI2Vsc2UKLSAgICBMVVRfZXhwb25lbnQgPSAxLjA7ICAgLyogYXNzdW1lIG5vIExVVDogIG1vc3QgUENzICovCi0jZW5kaWYKLQotICAgIC8qIHRoZSBkZWZhdWx0cyBhYm92ZSBnaXZlIDEuMCwgMS4zLCAxLjUgYW5kIDIuMiwgcmVzcGVjdGl2ZWx5OiAqLwotICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKLQotCi0gICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAotICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCi0gICAgICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdlIGp1c3QgY2FsY3VsYXRlZC4gIEVpdGhlciB3YXksIHRoZSB1c2VyIG1heQotICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KLQotICAgIGlmICgocCA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpICE9IE5VTEwpCi0gICAgICAgIHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA9IGF0b2YocCk7Ci0gICAgZWxzZQotICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7Ci0KLQotICAgIC8qIFdpbmRvd3MgcmVhbGx5IGhhdGVzIGNvbW1hbmQgbGluZXMsIHNvIHdlIGhhdmUgdG8gc2V0IHVwIG91ciBvd24gYXJndi4KLSAgICAgKiBOb3RlIHRoYXQgd2UgZG8gTk9UIGJvdGhlciB3aXRoIHF1b3RlZCBhcmd1bWVudHMgaGVyZSwgc28gZG9uJ3QgdXNlCi0gICAgICogZmlsZW5hbWVzIHdpdGggc3BhY2VzIGluICdlbSEgKi8KLQotICAgIGFyZ3ZbYXJnYysrXSA9IFBST0dOQU1FOwotICAgIHAgPSBjbWQ7Ci0gICAgZm9yICg7OykgewotICAgICAgICBpZiAoKnAgPT0gJyAnKQotICAgICAgICAgICAgd2hpbGUgKCorK3AgPT0gJyAnKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgLyogbm93IHAgcG9pbnRzIGF0IHRoZSBmaXJzdCBub24tc3BhY2UgYWZ0ZXIgc29tZSBzcGFjZXMgKi8KLSAgICAgICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAgICAgICBicmVhazsgICAgLyogbm90aGluZyBhZnRlciB0aGUgc3BhY2VzOiAgZG9uZSAqLwotICAgICAgICBhcmd2W2FyZ2MrK10gPSBxID0gcDsKLSAgICAgICAgd2hpbGUgKCpxICYmICpxICE9ICcgJykKLSAgICAgICAgICAgICsrcTsKLSAgICAgICAgLyogbm93IHEgcG9pbnRzIGF0IGEgc3BhY2Ugb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCi0gICAgICAgIGlmICgqcSA9PSAnXDAnKQotICAgICAgICAgICAgYnJlYWs7ICAgIC8qIGxhc3QgYXJndiBhbHJlYWR5IHRlcm1pbmF0ZWQ7IHF1aXQgKi8KLSAgICAgICAgKnEgPSAnXDAnOyAgICAvKiBjaGFuZ2Ugc3BhY2UgdG8gdGVybWluYXRvciAqLwotICAgICAgICBwID0gcSArIDE7Ci0gICAgfQotICAgIGFyZ3ZbYXJnY10gPSBOVUxMOyAgIC8qIHRlcm1pbmF0ZSB0aGUgYXJndiBhcnJheSBpdHNlbGYgKi8KLQotCi0gICAgLyogTm93IHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIG9wdGlvbnMgYW5kIHRoZSBQTkcgZmlsZW5hbWUuICovCi0KLSAgICB3aGlsZSAoKisrYXJndiAmJiAhZXJyb3IpIHsKLSAgICAgICAgaWYgKCFzdHJuY21wKCphcmd2LCAiLWdhbW1hIiwgMikpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50ID0gYXRvZigqYXJndik7Ci0gICAgICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA8PSAwLjApCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdjb2xvciIsIDQpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJnc3RyID0gKmFyZ3Y7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmxlbihiZ3N0cikgIT0gNyB8fCBiZ3N0clswXSAhPSAnIycpCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZSA9IEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ3BhdCIsIDQpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHBhdCA9IGF0b2koKmFyZ3YpIC0gMTsKLSAgICAgICAgICAgICAgICBpZiAocGF0IDwgMCB8fCBwYXQgPj0gbnVtX2JncGF0KQotICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItdGltaW5nIiwgMikpIHsKLSAgICAgICAgICAgIHRpbWluZyA9IFRSVUU7Ci0jaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkKLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1ub21teGZpbHRlcnMiLCA3KSkgewotICAgICAgICAgICAgcnBuZzJfaW5mby5ub21teGZpbHRlcnMgPSBUUlVFOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLW5vbW14Y29tYmluZSIsIDcpKSB7Ci0gICAgICAgICAgICBycG5nMl9pbmZvLm5vbW14Y29tYmluZSA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItbm9tbXhpbnRlcmxhY2UiLCA3KSkgewotICAgICAgICAgICAgcnBuZzJfaW5mby5ub21teGludGVybGFjZSA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi1ub21teCIpKSB7Ci0gICAgICAgICAgICBycG5nMl9pbmZvLm5vbW14ZmlsdGVycyA9IFRSVUU7Ci0gICAgICAgICAgICBycG5nMl9pbmZvLm5vbW14Y29tYmluZSA9IFRSVUU7Ci0gICAgICAgICAgICBycG5nMl9pbmZvLm5vbW14aW50ZXJsYWNlID0gVFJVRTsKLSNlbmRpZgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCoqYXJndiAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9ICphcmd2OwotICAgICAgICAgICAgICAgIGlmIChhcmd2WzFdKSAgIC8qIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBhcmdzIGFmdGVyIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICArK2Vycm9yOyAgIC8qIG5vdCBleHBlY3RpbmcgYW55IG90aGVyIG9wdGlvbnMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZmlsZW5hbWUpCi0gICAgICAgICsrZXJyb3I7Ci0KLQotICAgIC8qIHByaW50IHVzYWdlIHNjcmVlbiBpZiBhbnkgZXJyb3JzIHVwIHRvIHRoaXMgcG9pbnQgKi8KLQotICAgIGlmIChlcnJvcikgewotICAgICAgICBpbnQgY2g7Ci0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcblxuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOwotICAgICAgICByZWFkcG5nMl92ZXJzaW9uX2luZm8oKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIKLSAgICAgICAgICAiVXNhZ2U6ICAlcyBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnIHwgLWJncGF0IHBhdF0gWy10aW1pbmddXG4iCi0jaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkKLSAgICAgICAgICAiICAgICAgICAlKnMgW1stbm9tbXhmaWx0ZXJzXSBbLW5vbW14Y29tYmluZV0gWy1ub21teGludGVybGFjZV0gfCAtbm9tbXhdXG4iCi0jZW5kaWYKLSAgICAgICAgICAiICAgICAgICAlKnMgZmlsZS5wbmdcblxuIgotICAgICAgICAgICIgICAgZXhwIFx0dHJhbnNmZXItZnVuY3Rpb24gZXhwb25lbnQgKGBgZ2FtbWEnJykgb2YgdGhlIGRpc3BsYXlcbiIKLSAgICAgICAgICAiXHRcdCAgc3lzdGVtIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjFmJycpOyBlcXVhbFxuIgotICAgICAgICAgICJcdFx0ICB0byB0aGUgcHJvZHVjdCBvZiB0aGUgbG9va3VwLXRhYmxlIGV4cG9uZW50ICh2YXJpZXMpXG4iCi0gICAgICAgICAgIlx0XHQgIGFuZCB0aGUgQ1JUIGV4cG9uZW50ICh1c3VhbGx5IDIuMik7IG11c3QgYmUgcG9zaXRpdmVcbiIKLSAgICAgICAgICAiICAgIGJnICBcdGRlc2lyZWQgYmFja2dyb3VuZCBjb2xvciBpbiA3LWNoYXJhY3RlciBoZXggUkdCIGZvcm1hdFxuIgotICAgICAgICAgICJcdFx0ICAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTogIHNhbWUgYXMgSFRNTCBjb2xvcnMpO1xuIgotICAgICAgICAgICJcdFx0ICB1c2VkIHdpdGggdHJhbnNwYXJlbnQgaW1hZ2VzOyBvdmVycmlkZXMgLWJncGF0IG9wdGlvblxuIgotICAgICAgICAgICIgICAgcGF0IFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIHBhdHRlcm4gbnVtYmVyICgxLSVkKTsgdXNlZCB3aXRoXG4iCi0gICAgICAgICAgIlx0XHQgIHRyYW5zcGFyZW50IGltYWdlczsgb3ZlcnJpZGVzIC1iZ2NvbG9yIG9wdGlvblxuIgotICAgICAgICAgICIgICAgLXRpbWluZ1x0ZW5hYmxlcyBkZWxheSBmb3IgZXZlcnkgYmxvY2sgcmVhZCwgdG8gc2ltdWxhdGUgbW9kZW1cbiIKLSAgICAgICAgICAiXHRcdCAgZG93bmxvYWQgb2YgaW1hZ2UgKH4zNiBLYnBzKVxuIgotI2lmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX194ODZfNjRfXykpCi0gICAgICAgICAgIiAgICAtbm9tbXgqXHRkaXNhYmxlIG9wdGltaXplZCBNTVggcm91dGluZXMgZm9yIGRlY29kaW5nIHJvdyBmaWx0ZXJzLFxuIgotICAgICAgICAgICJcdFx0ICBjb21iaW5pbmcgcm93cywgYW5kIGV4cGFuZGluZyBpbnRlcmxhY2luZywgcmVzcGVjdGl2ZWx5XG4iCi0jZW5kaWYKLSAgICAgICAgICAiXG5QcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgYWZ0ZXIgaW1hZ2UgaXMgZGlzcGxheWVkIHRvIHF1aXQuXG4iCi0gICAgICAgICAgIlByZXNzIFEgb3IgRXNjIHRvIHF1aXQgdGhpcyB1c2FnZSBzY3JlZW4uICIsCi0gICAgICAgICAgUFJPR05BTUUsCi0jaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkKLSAgICAgICAgICAoaW50KXN0cmxlbihQUk9HTkFNRSksICIgIiwKLSNlbmRpZgotICAgICAgICAgIChpbnQpc3RybGVuKFBST0dOQU1FKSwgIiAiLCBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQsIG51bV9iZ3BhdCk7Ci0gICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICBkbwotICAgICAgICAgICAgY2ggPSBfZ2V0Y2goKTsKLSAgICAgICAgd2hpbGUgKGNoICE9ICdxJyAmJiBjaCAhPSAnUScgJiYgY2ggIT0gMHgxQik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0KLSAgICBpZiAoIShpbmZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBQTkcgZmlsZSBbJXNdXG4iLCBmaWxlbmFtZSk7Ci0gICAgICAgICsrZXJyb3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7Ci0gICAgICAgIGlmIChpbmNvdW50IDwgOCB8fCAhcmVhZHBuZzJfY2hlY2tfc2lnKGluYnVmLCA4KSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICI6ICBbJXNdIGlzIG5vdCBhIFBORyBmaWxlOiBpbmNvcnJlY3Qgc2lnbmF0dXJlXG4iLAotICAgICAgICAgICAgICBmaWxlbmFtZSk7Ci0gICAgICAgICAgICArK2Vycm9yOwotICAgICAgICB9IGVsc2UgaWYgKChyYyA9IHJlYWRwbmcyX2luaXQoJnJwbmcyX2luZm8pKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiOiAgWyVzXSBoYXMgYmFkIElIRFIgKGxpYnBuZyBsb25nam1wKVxuIiwgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5zdWZmaWNpZW50IG1lbW9yeVxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgICAgICI6ICB1bmtub3duIHJlYWRwbmcyX2luaXQoKSBlcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXJyb3IpCi0gICAgICAgICAgICBmY2xvc2UoaW5maWxlKTsKLSAgICB9Ci0KLQotICAgIGlmIChlcnJvcikgewotICAgICAgICBpbnQgY2g7Ci0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBhYm9ydGluZy5cbiIpOwotICAgICAgICBkbwotICAgICAgICAgICAgY2ggPSBfZ2V0Y2goKTsKLSAgICAgICAgd2hpbGUgKGNoICE9ICdxJyAmJiBjaCAhPSAnUScgJiYgY2ggIT0gMHgxQik7Ci0gICAgICAgIGV4aXQoMik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBhcHBuYW1lKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgIlxuICAgW2NvbnNvbGUgd2luZG93OiAgY2xvc2luZyB0aGlzIHdpbmRvdyB3aWxsIHRlcm1pbmF0ZSAlc11cblxuIiwKLSAgICAgICAgICBQUk9HTkFNRSk7Ci0gICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgIH0KLQotCi0gICAgLyogc2V0IHRoZSB0aXRsZS1iYXIgc3RyaW5nLCBidXQgbWFrZSBzdXJlIGJ1ZmZlciBkb2Vzbid0IG92ZXJmbG93ICovCi0KLSAgICBhbGVuID0gc3RybGVuKGFwcG5hbWUpOwotICAgIGZsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwotICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAuLi4lcyIsIGFwcG5hbWUsIGZpbGVuYW1lKyhhbGVuK2ZsZW4rNi0xMDIzKSk7Ci0gICAgZWxzZQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKLQotCi0gICAgLyogc2V0IHNvbWUgZmluYWwgcnBuZzJfaW5mbyB2YXJpYWJsZXMgYmVmb3JlIGVudGVyaW5nIG1haW4gZGF0YSBsb29wICovCi0KLSAgICBpZiAoaGF2ZV9iZykgewotICAgICAgICB1bnNpZ25lZCByLCBnLCBiOyAgIC8qIHRoaXMgYXBwcm9hY2ggcXVpZXRzIGNvbXBpbGVyIHdhcm5pbmdzICovCi0KLSAgICAgICAgc3NjYW5mKGJnc3RyKzEsICIlMnglMnglMngiLCAmciwgJmcsICZiKTsKLSAgICAgICAgcnBuZzJfaW5mby5iZ19yZWQgICA9ICh1Y2gpcjsKLSAgICAgICAgcnBuZzJfaW5mby5iZ19ncmVlbiA9ICh1Y2gpZzsKLSAgICAgICAgcnBuZzJfaW5mby5iZ19ibHVlICA9ICh1Y2gpYjsKLSAgICB9IGVsc2UKLSAgICAgICAgcnBuZzJfaW5mby5uZWVkX2JnY29sb3IgPSBUUlVFOwotCi0gICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtQcmVJbml0OwotICAgIHJwbmcyX2luZm8ubWFpbnByb2dfaW5pdCA9IHJwbmcyX3dpbl9pbml0OwotICAgIHJwbmcyX2luZm8ubWFpbnByb2dfZGlzcGxheV9yb3cgPSBycG5nMl93aW5fZGlzcGxheV9yb3c7Ci0gICAgcnBuZzJfaW5mby5tYWlucHJvZ19maW5pc2hfZGlzcGxheSA9IHJwbmcyX3dpbl9maW5pc2hfZGlzcGxheTsKLQotCi0gICAgLyogT0ssIHRoaXMgaXMgdGhlIGZ1biBwYXJ0OiAgY2FsbCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpIGF0IHRoZSBzdGFydCBvZgotICAgICAqIHRoZSBsb29wIHRvIGRlYWwgd2l0aCBvdXIgZmlyc3QgYnVmZmVyIG9mIGRhdGEgKHJlYWQgaW4gYWJvdmUgdG8gdmVyaWZ5Ci0gICAgICogdGhhdCB0aGUgZmlsZSBpcyBhIFBORyBpbWFnZSksIHRoZW4gbG9vcCB0aHJvdWdoIHRoZSBmaWxlIGFuZCBjb250aW51ZQotICAgICAqIGNhbGxpbmcgdGhlIHNhbWUgcm91dGluZSB0byBoYW5kbGUgZWFjaCBjaHVuayBvZiBkYXRhLiAgSXQgaW4gdHVybgotICAgICAqIHBhc3NlcyB0aGUgZGF0YSB0byBsaWJwbmcsIHdoaWNoIHdpbGwgaW52b2tlIG9uZSBvciBtb3JlIG9mIG91ciBjYWxsLQotICAgICAqIGJhY2tzIGFzIGRlY29kZWQgZGF0YSBiZWNvbWUgYXZhaWxhYmxlLiAgV2Ugb3B0aW9uYWxseSBjYWxsIFNsZWVwKCkgZm9yCi0gICAgICogb25lIHNlY29uZCBwZXIgaXRlcmF0aW9uIHRvIHNpbXVsYXRlIGRvd25sb2FkaW5nIHRoZSBpbWFnZSB2aWEgYW4gYW5hbG9nCi0gICAgICogbW9kZW0uICovCi0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJlYWRwbmcyX2RlY29kZV9kYXRhKClcbiIpKQotICAgICAgICBpZiAocmVhZHBuZzJfZGVjb2RlX2RhdGEoJnJwbmcyX2luZm8sIGluYnVmLCBpbmNvdW50KSkKLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcmVhZHBuZzJfZGVjb2RlX2RhdGEoKVxuIikpCi0KLSAgICAgICAgaWYgKGVycm9yIHx8IGluY291bnQgIT0gSU5CVUZTSVpFIHx8IHJwbmcyX2luZm8uc3RhdGUgPT0ga0RvbmUpIHsKLSAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLnN0YXRlID09IGtEb25lKSB7Ci0gICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgZGVjb2RpbmcgUE5HIGltYWdlXG4iKSkKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmVycm9yKGluZmlsZSkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICI6ICBlcnJvciB3aGlsZSByZWFkaW5nIFBORyBpbWFnZSBmaWxlXG4iKTsKLSAgICAgICAgICAgICAgICBleGl0KDMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmZW9mKGluZmlsZSkpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGVuZCBvZiBmaWxlIHJlYWNoZWQgIgotICAgICAgICAgICAgICAgICAgIih1bmV4cGVjdGVkbHkpIHdoaWxlIHJlYWRpbmcgUE5HIGltYWdlIGZpbGVcbiIpOwotICAgICAgICAgICAgICAgIGV4aXQoMyk7Ci0gICAgICAgICAgICB9IGVsc2UgLyogaWYgKGVycm9yKSAqLyB7Ci0gICAgICAgICAgICAgICAgLy8gd2lsbCBwcmludCBlcnJvciBtZXNzYWdlIGJlbG93Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aW1pbmcpCi0gICAgICAgICAgICBTbGVlcCgxMDAwTCk7Ci0KLSAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7Ci0gICAgfQotCi0KLSAgICAvKiBjbGVhbiB1cCBQTkcgc3R1ZmYgYW5kIHJlcG9ydCBhbnkgZGVjb2RpbmcgZXJyb3JzICovCi0KLSAgICBmY2xvc2UoaW5maWxlKTsKLSAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCByZWFkcG5nMl9jbGVhbnVwKClcbiIpKQotICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwotCi0gICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgbGlicG5nIGVycm9yIHdoaWxlIGRlY29kaW5nIFBORyBpbWFnZVxuIik7Ci0gICAgICAgIGV4aXQoMyk7Ci0gICAgfQotCi0KLSAgICAvKiB3YWl0IGZvciB0aGUgdXNlciB0byB0ZWxsIHVzIHdoZW4gdG8gcXVpdCAqLwotCi0gICAgd2hpbGUgKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpIHsKLSAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKLSAgICAgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwotICAgIH0KLQotCi0gICAgLyogd2UncmUgZG9uZTogIGNsZWFuIHVwIGFsbCBpbWFnZSBhbmQgV2luZG93cyByZXNvdXJjZXMgYW5kIGdvIGF3YXkgKi8KLQotICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJwbmcyX3dpbl9jbGVhbnVwKClcbiIpKQotICAgIHJwbmcyX3dpbl9jbGVhbnVwKCk7Ci0KLSAgICByZXR1cm4gbXNnLndQYXJhbTsKLX0KLQotCi0KLQotCi0vKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSByZWFkcG5nMl9pbmZvX2NhbGxiYWNrKCkgaW4gcmVhZHBuZzIuYywgd2hpY2gKLSAqIGluIHR1cm4gaXMgY2FsbGVkIGJ5IGxpYnBuZyBhZnRlciBhbGwgb2YgdGhlIHByZS1JREFUIGNodW5rcyBoYXZlIGJlZW4KLSAqIHJlYWQgYW5kIHByb2Nlc3NlZC0taS5lLiwgd2Ugbm93IGhhdmUgZW5vdWdoIGluZm8gdG8gZmluaXNoIGluaXRpYWxpemluZyAqLwotCi1zdGF0aWMgdm9pZCBycG5nMl93aW5faW5pdCgpCi17Ci0gICAgdWxnIGk7Ci0gICAgdWxnIHJvd2J5dGVzID0gcnBuZzJfaW5mby5yb3dieXRlczsKLQotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfd2luX2luaXQoKVxuIikpCi0gICAgVHJhY2UoKHN0ZGVyciwgIiAgcm93Ynl0ZXMgPSAlZFxuIiwgcnBuZzJfaW5mby5yb3dieXRlcykpCi0gICAgVHJhY2UoKHN0ZGVyciwgIiAgd2lkdGggID0gJWxkXG4iLCBycG5nMl9pbmZvLndpZHRoKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICBoZWlnaHQgPSAlbGRcbiIsIHJwbmcyX2luZm8uaGVpZ2h0KSkKLQotICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9ICh1Y2ggKiltYWxsb2Mocm93Ynl0ZXMgKiBycG5nMl9pbmZvLmhlaWdodCk7Ci0gICAgaWYgKCFycG5nMl9pbmZvLmltYWdlX2RhdGEpIHsKLSAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9ICh1Y2ggKiopbWFsbG9jKHJwbmcyX2luZm8uaGVpZ2h0ICogc2l6ZW9mKHVjaCAqKSk7Ci0gICAgaWYgKCFycG5nMl9pbmZvLnJvd19wb2ludGVycykgewotICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7Ci0gICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLmhlaWdodDsgICsraSkKLSAgICAgICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnNbaV0gPSBycG5nMl9pbmZvLmltYWdlX2RhdGEgKyBpKnJvd2J5dGVzOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIERvIHRoZSBiYXNpYyBXaW5kb3dzIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3csIGFuZCBmaWxsIGl0Ci0gICAgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQsIGZpbGUtc3BlY2lmaWVkIG9yIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChycG5nMl93aW5fY3JlYXRlX3dpbmRvdygpKSB7Ci0gICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtXaW5kb3dJbml0OwotfQotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZzJfd2luX2NyZWF0ZV93aW5kb3coKQotewotICAgIHVjaCBiZ19yZWQgICA9IHJwbmcyX2luZm8uYmdfcmVkOwotICAgIHVjaCBiZ19ncmVlbiA9IHJwbmcyX2luZm8uYmdfZ3JlZW47Ci0gICAgdWNoIGJnX2JsdWUgID0gcnBuZzJfaW5mby5iZ19ibHVlOwotICAgIHVjaCAqZGVzdDsKLSAgICBpbnQgZXh0cmFfd2lkdGgsIGV4dHJhX2hlaWdodDsKLSAgICB1bGcgaSwgajsKLSAgICBXTkRDTEFTU0VYIHduZGNsYXNzOwotICAgIFJFQ1QgcmVjdDsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRpc3BsYXktc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaW1hZ2UgKHJvdW5kIHVwCi0gICAgdG8gbXVsdGlwbGUgb2YgNCBmb3IgV2luZG93cyBESUIpLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgd2ltYWdlX3Jvd2J5dGVzID0gKCgzKnJwbmcyX2luZm8ud2lkdGggKyAzTCkgPj4gMikgPDwgMjsKLQotICAgIGlmICghKGRpYiA9ICh1Y2ggKiltYWxsb2Moc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbWFnZV9yb3dieXRlcypycG5nMl9pbmZvLmhlaWdodCkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDQ7ICAgLyogZmFpbCAqLwotICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBJbml0aWFsaXplIHRoZSBESUIuICBOZWdhdGl2ZSBoZWlnaHQgbWVhbnMgdG8gdXNlIHRvcC1kb3duIEJNUCBvcmRlcmluZwotICAgIChtdXN0IGJlIHVuY29tcHJlc3NlZCwgYnV0IHRoYXQncyB3aGF0IHdlIHdhbnQpLiAgQml0IGNvdW50IG9mIDEsIDQgb3IgOAotICAgIGltcGxpZXMgYSBjb2xvcm1hcCBvZiBSR0JYIHF1YWRzLCBidXQgMjQtYml0IEJNUHMganVzdCB1c2UgQixHLFIgdmFsdWVzCi0gICAgZGlyZWN0bHkgPT4gd2ltYWdlX2RhdGEgYmVnaW5zIGltbWVkaWF0ZWx5IGFmdGVyIEJNUCBoZWFkZXIuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBtZW1zZXQoZGliLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOwotICAgIGJtaWggPSAoQklUTUFQSU5GT0hFQURFUiAqKWRpYjsKLSAgICBibWloLT5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gICAgYm1paC0+YmlXaWR0aCA9IHJwbmcyX2luZm8ud2lkdGg7Ci0gICAgYm1paC0+YmlIZWlnaHQgPSAtKChsb25nKXJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICBibWloLT5iaVBsYW5lcyA9IDE7Ci0gICAgYm1paC0+YmlCaXRDb3VudCA9IDI0OwotICAgIGJtaWgtPmJpQ29tcHJlc3Npb24gPSAwOwotICAgIHdpbWFnZV9kYXRhID0gZGliICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbGwgd2luZG93IHdpdGggdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIChkZWZhdWx0IGlzIGJsYWNrKSwgYnV0Ci0gICAgZGVmZXIgbG9hZGluZyBmYWtlZCAiYmFja2dyb3VuZCBpbWFnZSIgdW50aWwgd2luZG93IGlzIGRpc3BsYXllZCAobWF5IGJlCi0gICAgc2xvdyB0byBjb21wdXRlKS4gIERhdGEgYXJlIGluIEJHUiBvcmRlci4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChiZ19pbWFnZSkgeyAgIC8qIGp1c3QgZmlsbCB3aXRoIGJsYWNrIGZvciBub3cgKi8KLSAgICAgICAgbWVtc2V0KHdpbWFnZV9kYXRhLCAwLCB3aW1hZ2Vfcm93Ynl0ZXMqcnBuZzJfaW5mby5oZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaiA9IDA7ICBqIDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK2opIHsKLSAgICAgICAgICAgIGRlc3QgPSB3aW1hZ2VfZGF0YSArIGoqd2ltYWdlX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2JsdWU7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2dyZWVuOwotICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19yZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgU2V0IHRoZSB3aW5kb3cgcGFyYW1ldGVycy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIG1lbXNldCgmd25kY2xhc3MsIDAsIHNpemVvZih3bmRjbGFzcykpOwotCi0gICAgd25kY2xhc3MuY2JTaXplID0gc2l6ZW9mKHduZGNsYXNzKTsKLSAgICB3bmRjbGFzcy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOwotICAgIHduZGNsYXNzLmxwZm5XbmRQcm9jID0gcnBuZzJfd2luX3duZHByb2M7Ci0gICAgd25kY2xhc3MuaEluc3RhbmNlID0gZ2xvYmFsX2hJbnN0OwotICAgIHduZGNsYXNzLmhJY29uID0gTG9hZEljb24oTlVMTCwgSURJX0FQUExJQ0FUSU9OKTsKLSAgICB3bmRjbGFzcy5oQ3Vyc29yID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOwotICAgIHduZGNsYXNzLmhickJhY2tncm91bmQgPSAoSEJSVVNIKUdldFN0b2NrT2JqZWN0KERLR1JBWV9CUlVTSCk7Ci0gICAgd25kY2xhc3MubHBzek1lbnVOYW1lID0gTlVMTDsKLSAgICB3bmRjbGFzcy5scHN6Q2xhc3NOYW1lID0gcHJvZ25hbWU7Ci0gICAgd25kY2xhc3MuaEljb25TbSA9IExvYWRJY29uKE5VTEwsIElESV9BUFBMSUNBVElPTik7Ci0KLSAgICBSZWdpc3RlckNsYXNzRXgoJnduZGNsYXNzKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGaW5hbGx5LCBjcmVhdGUgdGhlIHdpbmRvdy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGV4dHJhX3dpZHRoICA9IDIqKEdldFN5c3RlbU1ldHJpY3MoU01fQ1hCT1JERVIpICsKLSAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRExHRlJBTUUpKTsKLSAgICBleHRyYV9oZWlnaHQgPSAyKihHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQk9SREVSKSArCi0gICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWURMR0ZSQU1FKSkgKwotICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKTsKLQotICAgIGdsb2JhbF9od25kID0gQ3JlYXRlV2luZG93KHByb2duYW1lLCB0aXRsZWJhciwgV1NfT1ZFUkxBUFBFRFdJTkRPVywKLSAgICAgIENXX1VTRURFRkFVTFQsIENXX1VTRURFRkFVTFQsIHJwbmcyX2luZm8ud2lkdGgrZXh0cmFfd2lkdGgsCi0gICAgICBycG5nMl9pbmZvLmhlaWdodCtleHRyYV9oZWlnaHQsIE5VTEwsIE5VTEwsIGdsb2JhbF9oSW5zdCwgTlVMTCk7Ci0KLSAgICBTaG93V2luZG93KGdsb2JhbF9od25kLCBnbG9iYWxfc2hvd21vZGUpOwotICAgIFVwZGF0ZVdpbmRvdyhnbG9iYWxfaHduZCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgTm93IGNvbXB1dGUgdGhlIGJhY2tncm91bmQgaW1hZ2UgYW5kIGRpc3BsYXkgaXQuICBJZiBpdCBmYWlscyAobWVtb3J5Ci0gICAgYWxsb2NhdGlvbiksIHJldmVydCB0byBhIHBsYWluIGJhY2tncm91bmQgY29sb3IuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBpZiAoYmdfaW1hZ2UpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm1zZyA9ICJDb21wdXRpbmcgYmFja2dyb3VuZCBpbWFnZS4uLiI7Ci0gICAgICAgIGludCB4LCB5LCBsZW4gPSBzdHJsZW4obXNnKTsKLSAgICAgICAgSERDIGhkYyA9IEdldERDKGdsb2JhbF9od25kKTsKLSAgICAgICAgVEVYVE1FVFJJQyB0bTsKLQotICAgICAgICBHZXRUZXh0TWV0cmljcyhoZGMsICZ0bSk7Ci0gICAgICAgIHggPSAocnBuZzJfaW5mby53aWR0aCAtIGxlbip0bS50bUF2ZUNoYXJXaWR0aCkvMjsKLSAgICAgICAgeSA9IChycG5nMl9pbmZvLmhlaWdodCAtIHRtLnRtSGVpZ2h0KS8yOwotICAgICAgICBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7Ci0gICAgICAgIFNldFRleHRDb2xvcihoZGMsIEdldFN5c0NvbG9yKENPTE9SX0hJR0hMSUdIVFRFWFQpKTsKLSAgICAgICAgLyogdGhpcyBjYW4gc3RpbGwgYmVnaW4gb3V0IG9mIGJvdW5kcyBldmVuIGlmIHggaXMgcG9zaXRpdmUgKD8/Pyk6ICovCi0gICAgICAgIFRleHRPdXQoaGRjLCAoKHggPCAwKT8gMCA6IHgpLCAoKHkgPCAwKT8gMCA6IHkpLCBtc2csIGxlbik7Ci0gICAgICAgIFJlbGVhc2VEQyhnbG9iYWxfaHduZCwgaGRjKTsKLQotICAgICAgICBycG5nMl93aW5fbG9hZF9iZ19pbWFnZSgpOyAgIC8qIHJlc2V0cyBiZ19pbWFnZSBpZiBmYWlscyAqLwotICAgIH0KLQotICAgIGlmICghYmdfaW1hZ2UpIHsKLSAgICAgICAgZm9yIChqID0gMDsgIGogPCBycG5nMl9pbmZvLmhlaWdodDsgICsraikgewotICAgICAgICAgICAgZGVzdCA9IHdpbWFnZV9kYXRhICsgaip3aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfYmx1ZTsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfZ3JlZW47Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX3JlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJlY3QubGVmdCA9IDBMOwotICAgIHJlY3QudG9wID0gMEw7Ci0gICAgcmVjdC5yaWdodCA9IChMT05HKXJwbmcyX2luZm8ud2lkdGg7ICAgICAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCi0gICAgcmVjdC5ib3R0b20gPSAoTE9ORylycG5nMl9pbmZvLmhlaWdodDsgICAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCi0gICAgSW52YWxpZGF0ZVJlY3QoZ2xvYmFsX2h3bmQsICZyZWN0LCBGQUxTRSk7Ci0gICAgVXBkYXRlV2luZG93KGdsb2JhbF9od25kKTsgICAgICAgICAgICAgICAgIC8qIHNpbWlsYXIgdG8gWEZsdXNoKCkgKi8KLQotICAgIHJldHVybiAwOwotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nMl93aW5fY3JlYXRlX3dpbmRvdygpICovCi0KLQotCi0KLQotc3RhdGljIGludCBycG5nMl93aW5fbG9hZF9iZ19pbWFnZSgpCi17Ci0gICAgdWNoICpzcmMsICpkZXN0OwotICAgIHVjaCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOwotICAgIHVjaCByMV9pbnYsIHIyX2ludiwgZzFfaW52LCBnMl9pbnYsIGIxX2ludiwgYjJfaW52OwotICAgIGludCBrLCBobWF4LCBtYXg7Ci0gICAgaW50IHhpZHgsIHlpZHgsIHlpZHhfbWF4ID0gKGJnc2NhbGUtMSk7Ci0gICAgaW50IGV2ZW5fb2RkX3ZlcnQsIGV2ZW5fb2RkX2hvcml6LCBldmVuX29kZDsKLSAgICBpbnQgaW52ZXJ0X2dyYWRpZW50MiA9IChiZ1twYXRdLnR5cGUgJiAweDA4KTsKLSAgICBpbnQgaW52ZXJ0X2NvbHVtbjsKLSAgICB1bGcgaSwgcm93OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEFsbG9jYXRlIGJ1ZmZlciBmb3IgZmFrZSBiYWNrZ3JvdW5kIGltYWdlIHRvIGJlIHVzZWQgd2l0aCB0cmFuc3BhcmVudAotICAgIGltYWdlczsgaWYgdGhpcyBmYWlscywgcmV2ZXJ0IHRvIHBsYWluIGJhY2tncm91bmQgY29sb3IuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBiZ19yb3dieXRlcyA9IDMgKiBycG5nMl9pbmZvLndpZHRoOwotICAgIGJnX2RhdGEgPSAodWNoICopbWFsbG9jKGJnX3Jvd2J5dGVzICogcnBuZzJfaW5mby5oZWlnaHQpOwotICAgIGlmICghYmdfZGF0YSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAiOiAgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYmFja2dyb3VuZCBpbWFnZVxuIik7Ci0gICAgICAgIGJnX2ltYWdlID0gMDsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFZlcnRpY2FsIGdyYWRpZW50cyAocmFtcHMpIGluIE54TiBzcXVhcmVzLCBhbHRlcm5hdGluZyBkaXJlY3Rpb24gYW5kCi0gICAgY29sb3JzIChOID09IGJnc2NhbGUpLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAwKSB7Ci0gICAgICAgIHVjaCByMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLnI7Ci0gICAgICAgIHVjaCBnMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmc7Ci0gICAgICAgIHVjaCBiMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmI7Ci0gICAgICAgIHVjaCByMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLnI7Ci0gICAgICAgIHVjaCBnMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmc7Ci0gICAgICAgIHVjaCBiMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmI7Ci0gICAgICAgIGludCByMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnIgLSByMV9taW47Ci0gICAgICAgIGludCBnMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmcgLSBnMV9taW47Ci0gICAgICAgIGludCBiMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmIgLSBiMV9taW47Ci0gICAgICAgIGludCByMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnIgLSByMl9taW47Ci0gICAgICAgIGludCBnMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmcgLSBnMl9taW47Ci0gICAgICAgIGludCBiMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmIgLSBiMl9taW47Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgeWlkeCA9IHJvdyAlIGJnc2NhbGU7Ci0gICAgICAgICAgICBldmVuX29kZF92ZXJ0ID0gKHJvdyAvIGJnc2NhbGUpICYgMTsKLQotICAgICAgICAgICAgcjEgPSByMV9taW4gKyAocjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBnMSA9IGcxX21pbiArIChnMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGIxID0gYjFfbWluICsgKGIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgcjFfaW52ID0gcjFfbWluICsgKHIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBnMV9pbnYgPSBnMV9taW4gKyAoZzFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGIxX2ludiA9IGIxX21pbiArIChiMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotCi0gICAgICAgICAgICByMiA9IHIyX21pbiArIChyMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcyID0gZzJfbWluICsgKGcyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjIgPSBiMl9taW4gKyAoYjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICByMl9pbnYgPSByMl9taW4gKyAocjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcyX2ludiA9IGcyX21pbiArIChnMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjJfaW52ID0gYjJfbWluICsgKGIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0KLSAgICAgICAgICAgIGRlc3QgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7Ci0gICAgICAgICAgICAgICAgZXZlbl9vZGRfaG9yaXogPSAoaSAvIGJnc2NhbGUpICYgMTsKLSAgICAgICAgICAgICAgICBldmVuX29kZCA9IGV2ZW5fb2RkX3ZlcnQgXiBldmVuX29kZF9ob3JpejsKLSAgICAgICAgICAgICAgICBpbnZlcnRfY29sdW1uID0KLSAgICAgICAgICAgICAgICAgIChldmVuX29kZF9ob3JpeiAmJiAoYmdbcGF0XS50eXBlICYgMHgxMCkpOwotICAgICAgICAgICAgICAgIGlmIChldmVuX29kZCA9PSAwKSB7ICAgICAgICAgLyogZ3JhZGllbnQgIzEgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGludmVydF9jb2x1bW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMV9pbnY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzFfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIxX2ludjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgLyogZ3JhZGllbnQgIzIgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChpbnZlcnRfY29sdW1uICYmIGludmVydF9ncmFkaWVudDIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIWludmVydF9jb2x1bW4gJiYgIWludmVydF9ncmFkaWVudDIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjI7ICAgICAgICAvKiBub3QgaW52ZXJ0ZWQgb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMjsgICAgICAgIC8qICBkb3VibHkgaW52ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMl9pbnY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzJfaW52OyAgICAvKiBzaW5nbHkgaW52ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMl9pbnY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBTb2Z0IGdyYWRpZW50LWRpYW1vbmRzIHdpdGggc2NhbGUgPSBiZ3NjYWxlLiAgQ29kZSBjb250cmlidXRlZCBieSBBZGFtCi0gICAgTS4gQ29zdGVsbG8uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAxKSB7Ci0KLSAgICAgICAgaG1heCA9IChiZ3NjYWxlLTEpLzI7ICAgLyogaGFsZiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCi0gICAgICAgIG1heCA9IDIqaG1heDsgICAgICAgICAgIC8qIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KLQotICAgICAgICByMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yOwotICAgICAgICBnMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nOwotICAgICAgICBiMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iOwotICAgICAgICByMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yOwotICAgICAgICBnMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nOwotICAgICAgICBiMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHlpZHggPSByb3cgJSBiZ3NjYWxlOwotICAgICAgICAgICAgaWYgKHlpZHggPiBobWF4KQotICAgICAgICAgICAgICAgIHlpZHggPSBiZ3NjYWxlLTEgLSB5aWR4OwotICAgICAgICAgICAgZGVzdCA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKLSAgICAgICAgICAgICAgICB4aWR4ID0gaSAlIGJnc2NhbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHhpZHggPiBobWF4KQotICAgICAgICAgICAgICAgICAgICB4aWR4ID0gYmdzY2FsZS0xIC0geGlkeDsKLSAgICAgICAgICAgICAgICBrID0geGlkeCArIHlpZHg7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKnIxICsgKG1heC1rKSpyMikgLyBtYXg7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmcxICsgKG1heC1rKSpnMikgLyBtYXg7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmIxICsgKG1heC1rKSpiMikgLyBtYXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBSYWRpYWwgInN0YXJidXJzdCIgd2l0aCBhemltdXRoYWwgc2ludXNvaWRzOyBbZXZlbnR1YWxseSBudW1iZXIgb2Ygc2ludS0KLSAgICBzb2lkcyB3aWxsIGVxdWFsIGJnc2NhbGU/XS4gIFRoaXMgb25lIGlzIHNsb3cgYnV0IHZlcnkgY29vbC4gIENvZGUgY29uLQotICAgIHRyaWJ1dGVkIGJ5IFBpZXRlciBTLiB2YW4gZGVyIE1ldWxlbiAob3JpZ2luYWxseSBpbiBTbWFsbHRhbGspLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMikgewotICAgICAgICB1Y2ggY2g7Ci0gICAgICAgIGludCBpaSwgeCwgeSwgaHcsIGhoLCBncmF5c3BvdDsKLSAgICAgICAgZG91YmxlIGZyZXEsIHJvdGF0ZSwgc2F0dXJhdGUsIGdyYXksIGludGVuc2l0eTsKLSAgICAgICAgZG91YmxlIGFuZ2xlPTAuMCwgYW9mZnNldD0wLjAsIG1heERpc3QsIGRpc3Q7Ci0gICAgICAgIGRvdWJsZSByZWQ9MC4wLCBncmVlbj0wLjAsIGJsdWU9MC4wLCBodWUsIHMsIHYsIGYsIHAsIHEsIHQ7Ci0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogIGNvbXB1dGluZyByYWRpYWwgYmFja2dyb3VuZC4uLiIsCi0gICAgICAgICAgUFJPR05BTUUpOwotICAgICAgICBmZmx1c2goc3RkZXJyKTsKLQotICAgICAgICBoaCA9IHJwbmcyX2luZm8uaGVpZ2h0IC8gMjsKLSAgICAgICAgaHcgPSBycG5nMl9pbmZvLndpZHRoIC8gMjsKLQotICAgICAgICAvKiB2YXJpYWJsZXMgZm9yIHJhZGlhbCB3YXZlczoKLSAgICAgICAgICogICBhb2Zmc2V0OiAgbnVtYmVyIG9mIGRlZ3JlZXMgdG8gcm90YXRlIGh1ZSBbQ1VSUkVOVExZIE5PVCBVU0VEXQotICAgICAgICAgKiAgIGZyZXE6ICBudW1iZXIgb2YgY29sb3IgYmVhbXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgY2VudGVyCi0gICAgICAgICAqICAgZ3JheXNwb3Q6ICBzaXplIG9mIHRoZSBncmF5aW5nIGNlbnRlciBhcmVhIChhbnRpLWFsaWFzKQotICAgICAgICAgKiAgIHJvdGF0ZTogIHJvdGF0aW9uIG9mIHRoZSBiZWFtcyBhcyBhIGZ1bmN0aW9uIG9mIHJhZGl1cwotICAgICAgICAgKiAgIHNhdHVyYXRlOiAgc2F0dXJhdGlvbiBvZiBiZWFtcycgc2hhcGUgYXppbXV0aGFsbHkKLSAgICAgICAgICovCi0gICAgICAgIGFuZ2xlID0gQ0xJUChhbmdsZSwgMC4wLCAzNjAuMCk7Ci0gICAgICAgIGdyYXlzcG90ID0gQ0xJUChiZ1twYXRdLmJnX2dyYXksIDEsIChoaCArIGh3KSk7Ci0gICAgICAgIGZyZXEgPSBNQVgoKGRvdWJsZSliZ1twYXRdLmJnX2ZyZXEsIDAuMCk7Ci0gICAgICAgIHNhdHVyYXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2JzYXQgKiAwLjE7Ci0gICAgICAgIHJvdGF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19icm90ICogMC4xOwotICAgICAgICBncmF5ID0gMC4wOwotICAgICAgICBpbnRlbnNpdHkgPSAwLjA7Ci0gICAgICAgIG1heERpc3QgPSAoZG91YmxlKSgoaHcqaHcpICsgKGhoKmhoKSk7Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgeSA9IHJvdyAtIGhoOwotICAgICAgICAgICAgZGVzdCA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKLSAgICAgICAgICAgICAgICB4ID0gaSAtIGh3OwotICAgICAgICAgICAgICAgIGFuZ2xlID0gKHggPT0gMCk/IFBJXzIgOiBhdGFuKChkb3VibGUpeSAvIChkb3VibGUpeCk7Ci0gICAgICAgICAgICAgICAgZ3JheSA9IChkb3VibGUpTUFYKEFCUyh5KSwgQUJTKHgpKSAvIGdyYXlzcG90OwotICAgICAgICAgICAgICAgIGdyYXkgPSBNSU4oMS4wLCBncmF5KTsKLSAgICAgICAgICAgICAgICBkaXN0ID0gKGRvdWJsZSkoKHgqeCkgKyAoeSp5KSkgLyBtYXhEaXN0OwotICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IGNvcygoYW5nbGUrKHJvdGF0ZSpkaXN0KlBJKSkgKiBmcmVxKSAqCi0gICAgICAgICAgICAgICAgICBncmF5ICogc2F0dXJhdGU7Ci0gICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gKE1BWChNSU4oaW50ZW5zaXR5LDEuMCksLTEuMCkgKyAxLjApICogMC41OwotICAgICAgICAgICAgICAgIGh1ZSA9IChhbmdsZSArIFBJKSAqIElOVl9QSV8zNjAgKyBhb2Zmc2V0OwotICAgICAgICAgICAgICAgIHMgPSBncmF5ICogKChkb3VibGUpKEFCUyh4KStBQlMoeSkpIC8gKGRvdWJsZSkoaHcgKyBoaCkpOwotICAgICAgICAgICAgICAgIHMgPSBNSU4oTUFYKHMsMC4wKSwgMS4wKTsKLSAgICAgICAgICAgICAgICB2ID0gTUlOKE1BWChpbnRlbnNpdHksMC4wKSwgMS4wKTsKLQotICAgICAgICAgICAgICAgIGlmIChzID09IDAuMCkgewotICAgICAgICAgICAgICAgICAgICBjaCA9ICh1Y2gpKHYgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChodWUgPCAwLjApIHx8IChodWUgPj0gMzYwLjApKQotICAgICAgICAgICAgICAgICAgICAgICAgaHVlIC09ICgoKGludCkoaHVlIC8gMzYwLjApKSAqIDM2MC4wKTsKLSAgICAgICAgICAgICAgICAgICAgaHVlIC89IDYwLjA7Ci0gICAgICAgICAgICAgICAgICAgIGlpID0gKGludClodWU7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBodWUgLSAoZG91YmxlKWlpOwotICAgICAgICAgICAgICAgICAgICBwID0gKDEuMCAtIHMpICogdjsKLSAgICAgICAgICAgICAgICAgICAgcSA9ICgxLjAgLSAocyAqIGYpKSAqIHY7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSAoMS4wIC0gKHMgKiAoMS4wIC0gZikpKSAqIHY7Ci0gICAgICAgICAgICAgICAgICAgIGlmICAgICAgKGlpID09IDApIHsgcmVkID0gdjsgZ3JlZW4gPSB0OyBibHVlID0gcDsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAxKSB7IHJlZCA9IHE7IGdyZWVuID0gdjsgYmx1ZSA9IHA7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMikgeyByZWQgPSBwOyBncmVlbiA9IHY7IGJsdWUgPSB0OyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDMpIHsgcmVkID0gcDsgZ3JlZW4gPSBxOyBibHVlID0gdjsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA0KSB7IHJlZCA9IHQ7IGdyZWVuID0gcDsgYmx1ZSA9IHY7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNSkgeyByZWQgPSB2OyBncmVlbiA9IHA7IGJsdWUgPSBxOyB9Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShyZWQgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShncmVlbiAqIDI1NS4wKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGJsdWUgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZG9uZS5cbiIpOwotICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQmxhc3QgYmFja2dyb3VuZCBpbWFnZSB0byBkaXNwbGF5IGJ1ZmZlciBiZWZvcmUgYmVnaW5uaW5nIFBORyBkZWNvZGU7Ci0gICAgY2FsbGluZyBmdW5jdGlvbiB3aWxsIGhhbmRsZSBpbnZhbGlkYXRpb24gYW5kIFVwZGF0ZVdpbmRvdygpIGNhbGwuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7Ci0gICAgICAgIHNyYyA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgIGRlc3QgPSB3aW1hZ2VfZGF0YSArIHJvdyp3aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgcjEgPSAqc3JjKys7Ci0gICAgICAgICAgICBnMSA9ICpzcmMrKzsKLSAgICAgICAgICAgIGIxID0gKnNyYysrOwotICAgICAgICAgICAgKmRlc3QrKyA9IGIxOwotICAgICAgICAgICAgKmRlc3QrKyA9IGcxOyAgIC8qIG5vdGUgcmV2ZXJzZSBvcmRlciAqLwotICAgICAgICAgICAgKmRlc3QrKyA9IHIxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0KLX0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3dpbl9sb2FkX2JnX2ltYWdlKCkgKi8KLQotCi0KLQotCi1zdGF0aWMgdm9pZCBycG5nMl93aW5fZGlzcGxheV9yb3codWxnIHJvdykKLXsKLSAgICB1Y2ggYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKLSAgICB1Y2ggYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwotICAgIHVjaCBiZ19ibHVlICA9IHJwbmcyX2luZm8uYmdfYmx1ZTsKLSAgICB1Y2ggKnNyYywgKnNyYzI9TlVMTCwgKmRlc3Q7Ci0gICAgdWNoIHIsIGcsIGIsIGE7Ci0gICAgdWxnIGk7Ci0gICAgc3RhdGljIGludCByb3dzPTA7Ci0gICAgc3RhdGljIHVsZyBmaXJzdHJvdzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICByb3dzIGFuZCBmaXJzdHJvdyBzaW1wbHkgdHJhY2sgaG93IG1hbnkgcm93cyAoYW5kIHdoaWNoIG9uZXMpIGhhdmUgbm90Ci0gICAgeWV0IGJlZW4gZGlzcGxheWVkOyBhbHRlcm5hdGl2ZWx5LCB3ZSBjb3VsZCBjYWxsIEludmFsaWRhdGVSZWN0KCkgZm9yCi0gICAgZXZlcnkgcm93IGFuZCBub3QgYm90aGVyIHdpdGggdGhlIHJlY29yZHMta2VlcGluZy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfd2luX2Rpc3BsYXlfcm93KClcbiIpKQotCi0gICAgaWYgKHJvd3MgPT0gMCkKLSAgICAgICAgZmlyc3Ryb3cgPSByb3c7ICAgLyogZmlyc3Qgcm93IG5vdCB5ZXQgZGlzcGxheWVkICovCi0KLSAgICArK3Jvd3M7ICAgLyogY291bnQgb2Ygcm93cyByZWNlaXZlZCBidXQgbm90IHlldCBkaXNwbGF5ZWQgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBBc2lkZSBmcm9tIHRoZSB1c2Ugb2YgdGhlIHJwbmcyX2luZm8gc3RydWN0IGFuZCB0aGUgbGFjayBvZiBhbiBvdXRlcgotICAgIGxvb3AgKG92ZXIgcm93cyksIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgdG8gcnBuZ193aW5fZGlzcGxheV9pbWFnZSgpCi0gICAgaW4gdGhlIG5vbi1wcm9ncmVzc2l2ZSB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgc3JjID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgcm93KnJwbmcyX2luZm8ucm93Ynl0ZXM7Ci0gICAgaWYgKGJnX2ltYWdlKQotICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICBkZXN0ID0gd2ltYWdlX2RhdGEgKyByb3cqd2ltYWdlX3Jvd2J5dGVzOwotCi0gICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewotICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgIHIgPSAqc3JjKys7Ci0gICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICpkZXN0KysgPSBiOwotICAgICAgICAgICAgKmRlc3QrKyA9IGc7ICAgLyogbm90ZSByZXZlcnNlIG9yZGVyICovCi0gICAgICAgICAgICAqZGVzdCsrID0gcjsKLSAgICAgICAgfQotICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICBiID0gKnNyYysrOwotICAgICAgICAgICAgYSA9ICpzcmMrKzsKLSAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgewotICAgICAgICAgICAgICAgIGJnX3JlZCAgID0gKnNyYzIrKzsKLSAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGI7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGc7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IHI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewotICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19ibHVlOwotICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19ncmVlbjsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfcmVkOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChjb3BpZWQgZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUKLSAgICAgICAgICAgICAgICAgKiBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUKLSAgICAgICAgICAgICAgICAgKiByZXN1bHQgaW50byB0aGUgZmlyc3QgYXJndW1lbnQ7IHRoZXJlIGFyZSBubwotICAgICAgICAgICAgICAgICAqIHNpZGUgZWZmZWN0cyB3aXRoIHRoZSBmaXJzdCBhcmd1bWVudCAqLwotICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCBiLCBhLCBiZ19ibHVlKTsKLSAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoKmRlc3QrKywgZywgYSwgYmdfZ3JlZW4pOwotICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCByLCBhLCBiZ19yZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIERpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgcm93cyBvciB3aGVuIG9uIGxhc3Qgcm93LiAgKFJlZ2lvbiBtYXkgaW5jbHVkZQotICAgIHByZXZpb3VzbHkgZGlzcGxheWVkIGxpbmVzIGR1ZSB0byBpbnRlcmxhY2luZy0taS5lLiwgbm90IGNvbnRpZ3VvdXMuKQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKChyb3dzICYgMHhmKSA9PSAwIHx8IHJvdyA9PSBycG5nMl9pbmZvLmhlaWdodC0xKSB7Ci0gICAgICAgIFJFQ1QgcmVjdDsKLQotICAgICAgICByZWN0LmxlZnQgPSAwTDsKLSAgICAgICAgcmVjdC50b3AgPSAoTE9ORylmaXJzdHJvdzsKLSAgICAgICAgcmVjdC5yaWdodCA9IChMT05HKXJwbmcyX2luZm8ud2lkdGg7ICAgICAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCi0gICAgICAgIHJlY3QuYm90dG9tID0gKExPTkcpcm93ICsgMUw7ICAgICAgICAgICAgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLwotICAgICAgICBJbnZhbGlkYXRlUmVjdChnbG9iYWxfaHduZCwgJnJlY3QsIEZBTFNFKTsKLSAgICAgICAgVXBkYXRlV2luZG93KGdsb2JhbF9od25kKTsgICAgICAgICAgICAgICAgIC8qIHNpbWlsYXIgdG8gWEZsdXNoKCkgKi8KLSAgICAgICAgcm93cyA9IDA7Ci0gICAgfQotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nMl93aW5fZGlzcGxheV9yb3coKSAqLwotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHJwbmcyX3dpbl9maW5pc2hfZGlzcGxheSgpCi17Ci0gICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl93aW5fZmluaXNoX2Rpc3BsYXkoKVxuIikpCi0KLSAgICAvKiBsYXN0IHJvdyBoYXMgYWxyZWFkeSBiZWVuIGRpc3BsYXllZCBieSBycG5nMl93aW5fZGlzcGxheV9yb3coKSwgc28KLSAgICAgKiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gaGVyZSBleGNlcHQgc2V0IGEgZmxhZyBhbmQgbGV0IHRoZSB1c2VyIGtub3cKLSAgICAgKiB0aGF0IHRoZSBpbWFnZSBpcyBkb25lICovCi0KLSAgICBycG5nMl9pbmZvLnN0YXRlID0ga0RvbmU7Ci0gICAgcHJpbnRmKAotICAgICAgIkRvbmUuICBQcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgKHdpdGhpbiBpbWFnZSB3aW5kb3cpIHRvIHF1aXQuXG4iKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLX0KLQotCi0KLQotCi1zdGF0aWMgdm9pZCBycG5nMl93aW5fY2xlYW51cCgpCi17Ci0gICAgaWYgKGJnX2ltYWdlICYmIGJnX2RhdGEpIHsKLSAgICAgICAgZnJlZShiZ19kYXRhKTsKLSAgICAgICAgYmdfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSkgewotICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7Ci0gICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKSB7Ci0gICAgICAgIGZyZWUocnBuZzJfaW5mby5yb3dfcG9pbnRlcnMpOwotICAgICAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGRpYikgewotICAgICAgICBmcmVlKGRpYik7Ci0gICAgICAgIGRpYiA9IE5VTEw7Ci0gICAgfQotfQotCi0KLQotCi0KLUxSRVNVTFQgQ0FMTEJBQ0sgcnBuZzJfd2luX3duZHByb2MoSFdORCBod25kLCBVSU5UIGlNc2csIFdQQVJBTSB3UCwgTFBBUkFNIGxQKQotewotICAgIEhEQyAgICAgICAgIGhkYzsKLSAgICBQQUlOVFNUUlVDVCBwczsKLSAgICBpbnQgcmM7Ci0KLSAgICBzd2l0Y2ggKGlNc2cpIHsKLSAgICAgICAgY2FzZSBXTV9DUkVBVEU6Ci0gICAgICAgICAgICAvKiBvbmUtdGltZSBwcm9jZXNzaW5nIGhlcmUsIGlmIGFueSAqLwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgY2FzZSBXTV9QQUlOVDoKLSAgICAgICAgICAgIGhkYyA9IEJlZ2luUGFpbnQoaHduZCwgJnBzKTsKLSAgICAgICAgICAgIHJjID0gU3RyZXRjaERJQml0cyhoZGMsIDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW1hZ2VfZGF0YSwgKEJJVE1BUElORk8gKilibWloLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU1JDQ09QWSk7Ci0gICAgICAgICAgICBFbmRQYWludChod25kLCAmcHMpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KLSAgICAgICAgY2FzZSBXTV9DSEFSOgotICAgICAgICAgICAgc3dpdGNoICh3UCkgeyAgICAgICAvKiBvbmx5IG5lZWQgb25lLCBzbyBpZ25vcmUgcmVwZWF0IGNvdW50ICovCi0gICAgICAgICAgICAgICAgY2FzZSAncSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnUSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDFCOiAgICAgIC8qIEVzYyBrZXkgKi8KLSAgICAgICAgICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjogICAgLyogYW5vdGhlciB3YXkgb2YgcXVpdHRpbmcgKi8KLSAgICAgICAgY2FzZSBXTV9ERVNUUk9ZOgotICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgaU1zZywgd1AsIGxQKTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZzIteC5jIGIvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9ycG5nMi14LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3M2FmMjMuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay9ycG5nMi14LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTI3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHJwbmcyIC0gcHJvZ3Jlc3NpdmUtbW9kZWwgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgIHJwbmcyLXguYwotCi0gICBUaGlzIHByb2dyYW0gZGVjb2RlcyBhbmQgZGlzcGxheXMgUE5HIGZpbGVzIHByb2dyZXNzaXZlbHksIGFzIGlmIGl0IHdlcmUKLSAgIGEgd2ViIGJyb3dzZXIgKHRob3VnaCB0aGUgZnJvbnQgZW5kIGlzIG9ubHkgc2V0IHVwIHRvIHJlYWQgZnJvbSBmaWxlcykuCi0gICBJdCBzdXBwb3J0cyBnYW1tYSBjb3JyZWN0aW9uLCB1c2VyLXNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9ycywgYW5kIHVzZXItCi0gICBzcGVjaWZpZWQgYmFja2dyb3VuZCBwYXR0ZXJucyAoZm9yIHRyYW5zcGFyZW50IGltYWdlcykuICBUaGlzIHZlcnNpb24gaXMKLSAgIGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtICh0ZXN0ZWQgYnkgdGhlIGF1dGhvciB1bmRlciBVbml4IGFuZCBieSBNYXJ0aW4KLSAgIFppbnNlciB1bmRlciBPcGVuVk1TOyBtYXkgd29yayB1bmRlciBPUy8yIHdpdGggYSBsaXR0bGUgdHdlYWtpbmcpLgotCi0gICBUaGFua3MgdG8gQWRhbSBDb3N0ZWxsbyBhbmQgUGlldGVyIFMuIHZhbiBkZXIgTWV1bGVuIGZvciB0aGUgImRpYW1vbmQiCi0gICBhbmQgInJhZGlhbCB3YXZlcyIgcGF0dGVybnMsIHJlc3BlY3RpdmVseS4KLQotICAgdG8gZG8gKHNvbWVkYXksIG1heWJlKToKLSAgICAtIGZpeCBleHBvc2UvcmVkcmF3IGNvZGU6ICBkb24ndCBkcmF3IGVudGlyZSByb3cgaWYgb25seSBwYXJ0IGV4cG9zZWQKLSAgICAtIDgtYml0IChjb2xvcm1hcHBlZCkgWCBzdXBwb3J0Ci0gICAgLSBmaW5pc2ggcmVzaXphYmxlIGNoZWNrZXJib2FyZC1ncmFkaWVudCAoc2l6ZXMgNC0xMjg/KQotICAgIC0gdXNlICUuMTAyM3MgdG8gc2ltcGxpZnkgdHJ1bmNhdGlvbiBvZiB0aXRsZS1iYXIgc3RyaW5nPwotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBDaGFuZ2Vsb2c6Ci0gICAgLSAxLjAxOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQotICAgIC0gMS4wMjogIG1vZGlmaWVkIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnM7IGZpeGVkIGNoYXIvdWNoYXIgbWlzbWF0Y2gKLSAgICAtIDEuMTA6ICBhZGRlZCBzdXBwb3J0IGZvciBub24tZGVmYXVsdCB2aXN1YWxzOyBmaXhlZCBYIHBpeGVsLWNvbnZlcnNpb24KLSAgICAtIDEuMTE6ICBhZGRlZCAtdXNsZWVwIG9wdGlvbiBmb3IgZGVtb3M7IGZpeGVkIGNvbW1hbmQtbGluZSBwYXJzaW5nIGJ1ZwotICAgIC0gMS4xMjogIGFkZGVkIC1wYXVzZSBvcHRpb24gZm9yIGRlbW9zIGFuZCB0ZXN0aW5nCi0gICAgLSAxLjIwOiAgYWRkZWQgcnVudGltZSBNTVgtZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBuZXcgLW1teCogb3B0aW9ucwotICAgIC0gMS4yMTogIGZpeGVkIHNvbWUgc21hbGwgWCBtZW1vcnkgbGVha3MgKHRoYW5rcyB0byBGcmFu529pcyBQZXRpdGplYW4pCi0gICAgLSAxLjIyOiAgZml4ZWQgWEZyZWVHQygpIGNyYXNoIGJ1ZyAodGhhbmtzIHRvIFBhdHJpY2sgV2VsY2hlKQotICAgIC0gMS4yMzogIGFkZGVkIC1iZ3BhdCAwIG1vZGUgKHN0ZCB3aGl0ZS9ncmF5IGNoZWNrZXJib2FyZCwgOHg4IHNxdWFyZXMpCi0gICAgLSAxLjMwOiAgYWRkZWQgLWxvb3Agb3B0aW9uIGZvciAtYmdwYXQgKGlmZGVmIEZFQVRVUkVfTE9PUCk7IGZpeGVkIGJwcCA9Ci0gICAgICAgICAgICAgIDI0OyBhZGRlZCBzdXBwb3J0IGZvciBYIHJlc291cmNlcyAodGhhbmtzIHRvIEdlcmhhcmQgTmlrbGFzY2gpCi0gICAgLSAxLjMxOiAgYWRkZWQgY29kZSB0byBza2lwIHVudXNlZCBjaHVua3MgKHRoYW5rcyB0byBHbGVubiBSYW5kZXJzLVBlaHJzb24pCi0gICAgLSAxLjMyOiAgYWRkZWQgQU1ENjQvRU02NFQgc3VwcG9ydCAoX194ODZfNjRfXyk7IGFkZGVkIGJhc2ljIGV4cG9zZS9yZWRyYXcKLSAgICAgICAgICAgICAgaGFuZGxpbmcKLSAgICAtIDIuMDA6ICBkdWFsLWxpY2Vuc2VkIChhZGRlZCBHTlUgR1BMKQotICAgIC0gMi4wMTogIGZpeGVkIDY0LWJpdCB0eXBvIGluIHJlYWRwbmcyLmM7IGZpeGVkIC1wYXVzZSB1c2FnZSBkZXNjcmlwdGlvbgotICAgIC0gMi4wMjogIGZpeGVkIGltcHJvcGVyIGRpc3BsYXkgb2YgdXNhZ2Ugc2NyZWVuIG9uIFBORyBlcnJvcihzKTsgZml4ZWQKLSAgICAgICAgICAgICAgdW5leHBlY3RlZC1FT0YgYW5kIGZpbGUtcmVhZC1lcnJvciBjYXNlczsgZml4ZWQgVHJhY2UoKSBjdXQtYW5kLQotICAgICAgICAgICAgICBwYXN0ZSBidWdzCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgUFJPR05BTUUgICJycG5nMi14IgotI2RlZmluZSBMT05HTkFNRSAgIlByb2dyZXNzaXZlIFBORyBWaWV3ZXIgZm9yIFgiCi0jZGVmaW5lIFZFUlNJT04gICAiMi4wMiBvZiAxNiBNYXJjaCAyMDA4IgotI2RlZmluZSBSRVNOQU1FICAgInJwbmcyIgkvKiBvdXIgWCByZXNvdXJjZSBhcHBsaWNhdGlvbiBuYW1lICovCi0jZGVmaW5lIFJFU0NMQVNTICAiUnBuZyIJLyogb3VyIFggcmVzb3VyY2UgY2xhc3MgbmFtZSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHNldGptcC5oPiAgICAgICAvKiBmb3Igam1wYnVmIGRlY2xhcmF0aW9uIGluIHJlYWRwbmcyLmggKi8KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPiAgICAgICAgIC8qIG9ubHkgZm9yIFB2ZE0gYmFja2dyb3VuZCBjb2RlICovCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLSNpbmNsdWRlIDxYMTEvWG9zLmg+Ci0jaW5jbHVkZSA8WDExL2tleXN5bS5oPiAgIC8qIGRlZmluZXMgWEtfKiBtYWNyb3MgKi8KLQotI2lmZGVmIFZNUwotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotLyogYWxsIGZvciBQdmRNIGJhY2tncm91bmQgY29kZTogKi8KLSNpZm5kZWYgUEkKLSMgIGRlZmluZSBQSSAgICAgICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzOAotI2VuZGlmCi0jZGVmaW5lIFBJXzIgICAgICAgICAgICAgKFBJKjAuNSkKLSNkZWZpbmUgSU5WX1BJXzM2MCAgICAgICAoMzYwLjAgLyBQSSkKLSNkZWZpbmUgTUFYKGEsYikgICAgICAgICAoYT5iP2E6YikKLSNkZWZpbmUgTUlOKGEsYikgICAgICAgICAoYTxiP2E6YikKLSNkZWZpbmUgQ0xJUChhLG1pbixtYXgpICBNQVgobWluLE1JTigoYSksbWF4KSkKLSNkZWZpbmUgQUJTKGEpICAgICAgICAgICAoKGEpPDA/LShhKTooYSkpCi0jZGVmaW5lIENMSVA4UChjKSAgICAgICAgTUFYKDAsKE1JTigoYyksMjU1KSkpICAgLyogOC1iaXQgcG9zLiBpbnRlZ2VyICh1Y2gpICovCi0jZGVmaW5lIFJPVU5ERihmKSAgICAgICAgKChpbnQpKGYgKyAwLjUpKQotCi0jZGVmaW5lIFFVSVQoZSxrKSAoKGUudHlwZSA9PSBCdXR0b25QcmVzcyAmJiBlLnhidXR0b24uYnV0dG9uID09IEJ1dHRvbjEpIHx8ICBcCi0gICAgICAgICAgICAgICAgICAoZS50eXBlID09IEtleVByZXNzICYmICAgLyogIHYtLS0gb3IgMSBmb3Igc2hpZnRlZCBrZXlzICovICBcCi0gICAgICAgICAgICAgICAgICAoKGsgPSBYTG9va3VwS2V5c3ltKCZlLnhrZXksIDApKSA9PSBYS19xIHx8IGsgPT0gWEtfRXNjYXBlKSkpCi0KLSNkZWZpbmUgTk9fMjRCSVRfTUFTS1MJLyogdW5kZWYgY2FzZSBub3QgZnVsbHkgd3JpdHRlbi0tb25seSBmb3IgcmVkaXNwbGF5KCkgKi8KLQotI2RlZmluZSByZ2IxX21heCAgIGJnX2ZyZXEKLSNkZWZpbmUgcmdiMV9taW4gICBiZ19ncmF5Ci0jZGVmaW5lIHJnYjJfbWF4ICAgYmdfYnNhdAotI2RlZmluZSByZ2IyX21pbiAgIGJnX2Jyb3QKLQotLyogI2RlZmluZSBERUJVRyAqLyAgICAgLyogdGhpcyBlbmFibGVzIHRoZSBUcmFjZSgpIG1hY3JvcyAqLwotCi0jaW5jbHVkZSAicmVhZHBuZzIuaCIgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcmVhZHBuZzIgcHJvdG90eXBlcyAqLwotCi0KLS8qIGNvdWxkIGp1c3QgaW5jbHVkZSBwbmcuaCwgYnV0IHRoaXMgbWFjcm8gaXMgdGhlIG9ubHkgdGhpbmcgd2UgbmVlZAotICogKG5hbWUgYW5kIHR5cGVkZWZzIGNoYW5nZWQgdG8gbG9jYWwgdmVyc2lvbnMpOyBub3RlIHRoYXQgc2lkZSBlZmZlY3RzCi0gKiBvbmx5IGhhcHBlbiB3aXRoIGFscGhhICh3aGljaCBjb3VsZCBlYXNpbHkgYmUgYXZvaWRlZCB3aXRoCi0gKiAidXNoIGFjb3B5ID0gKGFscGhhKTsiKSAqLwotCi0jZGVmaW5lIGFscGhhX2NvbXBvc2l0ZShjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpIHsgICAgICAgICAgICAgICBcCi0gICAgdXNoIHRlbXAgPSAoKHVzaCkoZmcpKih1c2gpKGFscGhhKSArICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKHVzaCkoYmcpKih1c2gpKDI1NSAtICh1c2gpKGFscGhhKSkgKyAodXNoKTEyOCk7ICBcCi0gICAgKGNvbXBvc2l0ZSkgPSAodWNoKSgodGVtcCArICh0ZW1wID4+IDgpKSA+PiA4KTsgICAgICAgICAgICAgICBcCi19Ci0KLQotI2RlZmluZSBJTkJVRlNJWkUgNDA5NiAgIC8qIHdpdGggcHNldWRvLXRpbWluZyBvbiAoMSBzZWMgZGVsYXkvYmxvY2spLCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogIGJsb2NrIHNpemUgY29ycmVzcG9uZHMgcm91Z2hseSB0byBhIGRvd25sb2FkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogIHNwZWVkIDEwJSBmYXN0ZXIgdGhhbiB0aGVvcmV0aWNhbCAzMy42SyBtYXhpbXVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogIChhc3N1bWluZyA4IGRhdGEgYml0cywgMSBzdG9wIGJpdCBhbmQgbm8gb3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgb3ZlcmhlYWQpICovCi0KLS8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB2b2lkIHJwbmcyX3hfaW5pdCAodm9pZCk7Ci1zdGF0aWMgaW50ICBycG5nMl94X2NyZWF0ZV93aW5kb3cgKHZvaWQpOwotc3RhdGljIGludCAgcnBuZzJfeF9sb2FkX2JnX2ltYWdlICh2b2lkKTsKLXN0YXRpYyB2b2lkIHJwbmcyX3hfZGlzcGxheV9yb3cgKHVsZyByb3cpOwotc3RhdGljIHZvaWQgcnBuZzJfeF9maW5pc2hfZGlzcGxheSAodm9pZCk7Ci1zdGF0aWMgdm9pZCBycG5nMl94X3JlZGlzcGxheV9pbWFnZSAodWxnIHN0YXJ0Y29sLCB1bGcgc3RhcnRyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxnIHdpZHRoLCB1bGcgaGVpZ2h0KTsKLSNpZmRlZiBGRUFUVVJFX0xPT1AKLXN0YXRpYyB2b2lkIHJwbmcyX3hfcmVsb2FkX2JnX2ltYWdlICh2b2lkKTsKLXN0YXRpYyBpbnQgIGlzX251bWJlciAoY2hhciAqcCk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIHJwbmcyX3hfY2xlYW51cCAodm9pZCk7Ci1zdGF0aWMgaW50ICBycG5nMl94X21zYiAodWxnIHUzMnZhbCk7Ci0KLQotc3RhdGljIGNoYXIgdGl0bGViYXJbMTAyNF0sICp3aW5kb3dfbmFtZSA9IHRpdGxlYmFyOwotc3RhdGljIGNoYXIgKmFwcG5hbWUgPSBMT05HTkFNRTsKLXN0YXRpYyBjaGFyICppY29uX25hbWUgPSBQUk9HTkFNRTsKLXN0YXRpYyBjaGFyICpyZXNfbmFtZSA9IFJFU05BTUU7Ci1zdGF0aWMgY2hhciAqcmVzX2NsYXNzID0gUkVTQ0xBU1M7Ci1zdGF0aWMgY2hhciAqZmlsZW5hbWU7Ci1zdGF0aWMgRklMRSAqaW5maWxlOwotCi1zdGF0aWMgbWFpbnByb2dfaW5mbyBycG5nMl9pbmZvOwotCi1zdGF0aWMgdWNoIGluYnVmW0lOQlVGU0laRV07Ci1zdGF0aWMgaW50IGluY291bnQ7Ci0KLXN0YXRpYyBpbnQgcGF0ID0gNjsgICAgICAgIC8qIG11c3QgYmUgbGVzcyB0aGFuIG51bV9iZ3BhdCAqLwotc3RhdGljIGludCBiZ19pbWFnZSA9IDA7Ci1zdGF0aWMgaW50IGJnc2NhbGUsIGJnc2NhbGVfZGVmYXVsdCA9IDE2Owotc3RhdGljIHVsZyBiZ19yb3dieXRlczsKLXN0YXRpYyB1Y2ggKmJnX2RhdGE7Ci0KLWludCBwYXVzZV9hZnRlcl9wYXNzID0gRkFMU0U7Ci1pbnQgZGVtb190aW1pbmcgPSBGQUxTRTsKLXVsZyB1c2xlZXBfZHVyYXRpb24gPSAwTDsKLQotc3RhdGljIHN0cnVjdCByZ2JfY29sb3IgewotICAgIHVjaCByLCBnLCBiOwotfSByZ2JbXSA9IHsKLSAgICB7ICAwLCAgIDAsICAgMH0sICAgIC8qICAwOiAgYmxhY2sgKi8KLSAgICB7MjU1LCAyNTUsIDI1NX0sICAgIC8qICAxOiAgd2hpdGUgKi8KLSAgICB7MTczLCAxMzIsICA1N30sICAgIC8qICAyOiAgdGFuICovCi0gICAgeyA2NCwgMTMyLCAgIDB9LCAgICAvKiAgMzogIG1lZGl1bSBncmVlbiAqLwotICAgIHsxODksIDExNywgICAxfSwgICAgLyogIDQ6ICBnb2xkICovCi0gICAgezI1MywgMjQ5LCAgIDF9LCAgICAvKiAgNTogIHllbGxvdyAqLwotICAgIHsgIDAsICAgMCwgMjU1fSwgICAgLyogIDY6ICBibHVlICovCi0gICAgeyAgMCwgICAwLCAxMjB9LCAgICAvKiAgNzogIG1lZGl1bSBibHVlICovCi0gICAgezI1NSwgICAwLCAyNTV9LCAgICAvKiAgODogIG1hZ2VudGEgKi8KLSAgICB7IDY0LCAgIDAsICA2NH0sICAgIC8qICA5OiAgZGFyayBtYWdlbnRhICovCi0gICAgezI1NSwgICAwLCAgIDB9LCAgICAvKiAxMDogIHJlZCAqLwotICAgIHsgNjQsICAgMCwgICAwfSwgICAgLyogMTE6ICBkYXJrIHJlZCAqLwotICAgIHsyNTUsIDEyNywgICAwfSwgICAgLyogMTI6ICBvcmFuZ2UgKi8KLSAgICB7MTkyLCAgOTYsICAgMH0sICAgIC8qIDEzOiAgZGFya2VyIG9yYW5nZSAqLwotICAgIHsgMjQsICA2MCwgICAwfSwgICAgLyogMTQ6ICBkYXJrIGdyZWVuLXllbGxvdyAqLwotICAgIHsgODUsIDEyNSwgMjAwfSwgICAgLyogMTU6ICBpY2UgYmx1ZSAqLwotICAgIHsxOTIsIDE5MiwgMTkyfSAgICAgLyogMTY6ICBOZXRzY2FwZS9Nb3NhaWMgZ3JheSAqLwotfTsKLS8qIG5vdCB1c2VkIGZvciBub3csIGJ1dCBzaG91bGQgYmUgZm9yIGVycm9yLWNoZWNraW5nOgotc3RhdGljIGludCBudW1fcmdiID0gc2l6ZW9mKHJnYikgLyBzaXplb2Yoc3RydWN0IHJnYl9jb2xvcik7Ci0gKi8KLQotLyoKLSAgICBUaGlzIHdob2xlIHN0cnVjdCBpcyBhIGZhaXJseSBjaGVlc3kgd2F5IHRvIGtlZXAgdGhlIG51bWJlciBvZgotICAgIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGEgbWluaW11bS4gIFRoZSByYWRpYWwtd2F2ZXMgYmFja2dyb3VuZAotICAgIHR5cGUgaXMgYSBwYXJ0aWN1bGFybHkgcG9vciBmaXQgdG8gdGhlIGludGVnZXIgZWxlbWVudHMgb2YgdGhlCi0gICAgc3RydWN0Li4uYnV0IGEgZmV3IG1hY3JvcyBhbmQgYSBsaXR0bGUgZml4ZWQtcG9pbnQgbWF0aCB3aWxsIGRvCi0gICAgd29uZGVycyBmb3IgeWEuCi0KLSAgICB0eXBlIGJpdHM6Ci0gICAgICAgRiBFIEQgQyBCIEEgOSA4IDcgNiA1IDQgMyAyIDEgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfCB8IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICstKy0rLS0gMCA9IHNoYXJwLWVkZ2VkIGNoZWNrZXJib2FyZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgICAgICAgICAxID0gc29mdCBkaWFtb25kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgICAgICAgICAyID0gcmFkaWFsIHdhdmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAzLTcgPSB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCArLS0gZ3JhZGllbnQgIzIgaW52ZXJ0ZWQ/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLSBhbHRlcm5hdGluZyBjb2x1bW5zIGludmVydGVkPwotICovCi1zdGF0aWMgc3RydWN0IGJhY2tncm91bmRfcGF0dGVybiB7Ci0gICAgdXNoIHR5cGU7Ci0gICAgaW50IHJnYjFfbWF4LCByZ2IxX21pbjsgICAgIC8qIG9yIGJnX2ZyZXEsIGJnX2dyYXkgKi8KLSAgICBpbnQgcmdiMl9tYXgsIHJnYjJfbWluOyAgICAgLyogb3IgYmdfYnNhdCwgYmdfYnJvdCAoYm90aCBzY2FsZWQgYnkgMTApKi8KLX0gYmdbXSA9IHsKLSAgICB7MCwgICAgIDEsMSwgMTYsMTZ9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgd2hpdGUgdnMuIGxpZ2h0IGdyYXkgKGJhc2ljKSAqLwotICAgIHswKzgsICAgMiwwLCAgMSwxNX0sICAgICAgICAvKiBjaGVja2VyZWQ6ICB0YW4vYmxhY2sgdnMuIHdoaXRlL2ljZSBibHVlICovCi0gICAgezArMjQsICAyLDAsICAxLDB9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIHRhbi9ibGFjayB2cy4gd2hpdGUvYmxhY2sgKi8KLSAgICB7MCs4LCAgIDQsNSwgIDAsMn0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgZ29sZC95ZWxsb3cgdnMuIGJsYWNrL3RhbiAqLwotICAgIHswKzgsICAgNCw1LCAgMCw2fSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBnb2xkL3llbGxvdyB2cy4gYmxhY2svYmx1ZSAqLwotICAgIHswLCAgICAgNywwLCAgOCw5fSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBkZWVwIGJsdWUvYmxhY2sgdnMuIG1hZ2VudGEgKi8KLSAgICB7MCs4LCAgMTMsMCwgIDUsMTR9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgb3JhbmdlL2JsYWNrIHZzLiB5ZWxsb3cgKi8KLSAgICB7MCs4LCAgMTIsMCwgMTAsMTF9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgb3JhbmdlL2JsYWNrIHZzLiByZWQgKi8KLSAgICB7MSwgICAgIDcsMCwgIDgsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBkZWVwIGJsdWUvYmxhY2sgdnMuIG1hZ2VudGEgKi8KLSAgICB7MSwgICAgMTIsMCwgMTEsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBvcmFuZ2UgdnMuIGRhcmsgcmVkICovCi0gICAgezEsICAgIDEwLDAsICA3LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgcmVkIHZzLiBtZWRpdW0gYmx1ZSAqLwotICAgIHsxLCAgICAgNCwwLCAgNSwwfSwgICAgICAgICAvKiBkaWFtb25kczogIGdvbGQgdnMuIHllbGxvdyAqLwotICAgIHsxLCAgICAgMywwLCAgMCwwfSwgICAgICAgICAvKiBkaWFtb25kczogIG1lZGl1bSBncmVlbiB2cy4gYmxhY2sgKi8KLSAgICB7MiwgICAgMTYsIDEwMCwgIDIwLCAgIDB9LCAgLyogcmFkaWFsOiAgfmhhcmQgcmFkaWFsIGNvbG9yLWJlYW1zICovCi0gICAgezIsICAgIDE4LCAxMDAsICAxMCwgICAyfSwgIC8qIHJhZGlhbDogIHNvZnQsIGN1cnZlZCByYWRpYWwgY29sb3ItYmVhbXMgKi8KLSAgICB7MiwgICAgMTYsIDI1NiwgMTAwLCAyNTB9LCAgLyogcmFkaWFsOiAgdmVyeSB0aWdodCBzcGlyYWwgKi8KLSAgICB7MiwgMTAwMDAsIDI1NiwgIDExLCAgIDB9ICAgLyogcmFkaWFsOiAgZGlwb2xlLW1vaXJlJyAoYWxtb3N0IGZyYWN0YWwpICovCi19Owotc3RhdGljIGludCBudW1fYmdwYXQgPSBzaXplb2YoYmcpIC8gc2l6ZW9mKHN0cnVjdCBiYWNrZ3JvdW5kX3BhdHRlcm4pOwotCi0KLS8qIFgtc3BlY2lmaWMgdmFyaWFibGVzICovCi1zdGF0aWMgY2hhciAqZGlzcGxheW5hbWU7Ci1zdGF0aWMgWEltYWdlICp4aW1hZ2U7Ci1zdGF0aWMgRGlzcGxheSAqZGlzcGxheTsKLXN0YXRpYyBpbnQgZGVwdGg7Ci1zdGF0aWMgVmlzdWFsICp2aXN1YWw7Ci1zdGF0aWMgWFZpc3VhbEluZm8gKnZpc3VhbF9saXN0Owotc3RhdGljIGludCBSU2hpZnQsIEdTaGlmdCwgQlNoaWZ0Owotc3RhdGljIHVsZyBSTWFzaywgR01hc2ssIEJNYXNrOwotc3RhdGljIFdpbmRvdyB3aW5kb3c7Ci1zdGF0aWMgR0MgZ2M7Ci1zdGF0aWMgQ29sb3JtYXAgY29sb3JtYXA7Ci0KLXN0YXRpYyBpbnQgaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCA9IEZBTFNFOwotc3RhdGljIGludCBoYXZlX2NvbG9ybWFwID0gRkFMU0U7Ci1zdGF0aWMgaW50IGhhdmVfd2luZG93ID0gRkFMU0U7Ci1zdGF0aWMgaW50IGhhdmVfZ2MgPSBGQUxTRTsKLQotCi0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotI2lmZGVmIHNnaQotICAgIGNoYXIgdG1wbGluZVs4MF07Ci0jZW5kaWYKLSAgICBjaGFyICpwLCAqYmdzdHIgPSBOVUxMOwotICAgIGludCByYywgYWxlbiwgZmxlbjsKLSAgICBpbnQgZXJyb3IgPSAwOwotICAgIGludCB0aW1pbmcgPSBGQUxTRTsKLSAgICBpbnQgaGF2ZV9iZyA9IEZBTFNFOwotI2lmZGVmIEZFQVRVUkVfTE9PUAotICAgIGludCBsb29wID0gRkFMU0U7Ci0gICAgbG9uZyBsb29wX2ludGVydmFsID0gLTE7CQkvKiBzZWNvbmRzICgxMDAsMDAwIG1heCkgKi8KLSNlbmRpZgotICAgIGRvdWJsZSBMVVRfZXhwb25lbnQ7ICAgICAgICAgICAgICAgIC8qIGp1c3QgdGhlIGxvb2t1cCB0YWJsZSAqLwotICAgIGRvdWJsZSBDUlRfZXhwb25lbnQgPSAyLjI7ICAgICAgICAgIC8qIGp1c3QgdGhlIG1vbml0b3IgKi8KLSAgICBkb3VibGUgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OyAgICAvKiB3aG9sZSBkaXNwbGF5IHN5c3RlbSAqLwotICAgIFhFdmVudCBlOwotICAgIEtleVN5bSBrOwotCi0KLSAgICAvKiBGaXJzdCBpbml0aWFsaXplIGEgZmV3IHRoaW5ncywganVzdCB0byBiZSBzdXJlLS1tZW1zZXQgdGFrZXMgY2FyZSBvZgotICAgICAqIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciAoYmxhY2spLCBib29sZWFucyAoRkFMU0UpLCBwb2ludGVycyAoTlVMTCksCi0gICAgICogZXRjLiAqLwotCi0gICAgZGlzcGxheW5hbWUgPSAoY2hhciAqKU5VTEw7Ci0gICAgZmlsZW5hbWUgPSAoY2hhciAqKU5VTEw7Ci0gICAgbWVtc2V0KCZycG5nMl9pbmZvLCAwLCBzaXplb2YobWFpbnByb2dfaW5mbykpOwotCi0KLSAgICAvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIG91ciBkaXNwbGF5LXN5c3RlbSBleHBvbmVudCwgaS5lLiwgdGhlCi0gICAgICogcHJvZHVjdCBvZiB0aGUgQ1JUIGV4cG9uZW50IGFuZCB0aGUgZXhwb25lbnQgY29ycmVzcG9uZGluZyB0bwotICAgICAqIHRoZSBmcmFtZS1idWZmZXIncyBsb29rdXAgdGFibGUgKExVVCksIGlmIGFueS4gIFRoaXMgaXMgbm90IGFuCi0gICAgICogZXhoYXVzdGl2ZSBsaXN0IG9mIExVVCB2YWx1ZXMgKGUuZy4sIE9wZW5TdGVwIGhhcyBhIGxvdCBvZiB3ZWlyZAotICAgICAqIG9uZXMpLCBidXQgaXQgc2hvdWxkIGNvdmVyIDk5JSBvZiB0aGUgY3VycmVudCBwb3NzaWJpbGl0aWVzLiAqLwotCi0jaWYgZGVmaW5lZChOZVhUKQotICAgIC8qIHRoaXJkLXBhcnR5IHV0aWxpdGllcyBjYW4gbW9kaWZ5IHRoZSBkZWZhdWx0IExVVCBleHBvbmVudCAqLwotICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDIuMjsKLSAgICAvKgotICAgIGlmIChzb21lX25leHRfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZuZXh0X2dhbW1hKSkKLSAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gbmV4dF9nYW1tYTsKLSAgICAgKi8KLSNlbGlmIGRlZmluZWQoc2dpKQotICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDEuNzsKLSAgICAvKiB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IGRvY3VtZW50ZWQgZnVuY3Rpb24gdG8KLSAgICAgKiBnZXQgdGhlICJnYW1tYSIgdmFsdWUsIHNvIHdlIGRvIGl0IHRoZSBoYXJkIHdheSAqLwotICAgIGluZmlsZSA9IGZvcGVuKCIvZXRjL2NvbmZpZy9zeXN0ZW0uZ2xHYW1tYVZhbCIsICJyIik7Ci0gICAgaWYgKGluZmlsZSkgewotICAgICAgICBkb3VibGUgc2dpX2dhbW1hOwotCi0gICAgICAgIGZnZXRzKHRtcGxpbmUsIDgwLCBpbmZpbGUpOwotICAgICAgICBmY2xvc2UoaW5maWxlKTsKLSAgICAgICAgc2dpX2dhbW1hID0gYXRvZih0bXBsaW5lKTsKLSAgICAgICAgaWYgKHNnaV9nYW1tYSA+IDAuMCkKLSAgICAgICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIHNnaV9nYW1tYTsKLSAgICB9Ci0jZWxpZiBkZWZpbmVkKE1hY2ludG9zaCkKLSAgICBMVVRfZXhwb25lbnQgPSAxLjggLyAyLjYxOwotICAgIC8qCi0gICAgaWYgKHNvbWVfbWFjX2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbWFjX2dhbW1hKSkKLSAgICAgICAgTFVUX2V4cG9uZW50ID0gbWFjX2dhbW1hIC8gMi42MTsKLSAgICAgKi8KLSNlbHNlCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wOyAgIC8qIGFzc3VtZSBubyBMVVQ6ICBtb3N0IFBDcyAqLwotI2VuZGlmCi0KLSAgICAvKiB0aGUgZGVmYXVsdHMgYWJvdmUgZ2l2ZSAxLjAsIDEuMywgMS41IGFuZCAyLjIsIHJlc3BlY3RpdmVseTogKi8KLSAgICBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQgPSBMVVRfZXhwb25lbnQgKiBDUlRfZXhwb25lbnQ7Ci0KLQotICAgIC8qIElmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIFNDUkVFTl9HQU1NQSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBzdWdnZXN0ZWQKLSAgICAgKiAoc29tZXdoYXQgaW1wcmVjaXNlbHkpIGluIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiwgdXNlIHRoYXQ7IG90aGVyd2lzZQotICAgICAqIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSB3ZSBqdXN0IGNhbGN1bGF0ZWQuICBFaXRoZXIgd2F5LCB0aGUgdXNlciBtYXkKLSAgICAgKiBvdmVycmlkZSB0aGlzIHZpYSBhIGNvbW1hbmQtbGluZSBvcHRpb24uICovCi0KLSAgICBpZiAoKHAgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKSAhPSBOVUxMKQotICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKHApOwotICAgIGVsc2UKLSAgICAgICAgcnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50ID0gZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OwotCi0KLSAgICAvKiBOb3cgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBmb3Igb3B0aW9ucyBhbmQgdGhlIFBORyBmaWxlbmFtZS4gKi8KLQotICAgIHdoaWxlICgqKythcmd2ICYmICFlcnJvcikgewotICAgICAgICBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZGlzcGxheSIsIDIpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZSA9ICphcmd2OwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWdhbW1hIiwgMikpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50ID0gYXRvZigqYXJndik7Ci0gICAgICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA8PSAwLjApCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdjb2xvciIsIDQpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJnc3RyID0gKmFyZ3Y7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmxlbihiZ3N0cikgIT0gNyB8fCBiZ3N0clswXSAhPSAnIycpCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZSA9IEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ3BhdCIsIDQpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHBhdCA9IGF0b2koKmFyZ3YpOwotICAgICAgICAgICAgICAgIGlmIChwYXQgPj0gMCAmJiBwYXQgPCBudW1fYmdwYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgYmdfaW1hZ2UgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBoYXZlX2JnID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItdXNsZWVwIiwgMikpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXNsZWVwX2R1cmF0aW9uID0gKHVsZylhdG9sKCphcmd2KTsKLSAgICAgICAgICAgICAgICBkZW1vX3RpbWluZyA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItcGF1c2UiLCAyKSkgewotICAgICAgICAgICAgcGF1c2VfYWZ0ZXJfcGFzcyA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItdGltaW5nIiwgMikpIHsKLSAgICAgICAgICAgIHRpbWluZyA9IFRSVUU7Ci0jaWZkZWYgRkVBVFVSRV9MT09QCi0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItbG9vcCIsIDIpKSB7Ci0gICAgICAgICAgICBsb29wID0gVFJVRTsKLSAgICAgICAgICAgIGlmICghYXJndlsxXSB8fCAhaXNfbnVtYmVyKGFyZ3ZbMV0pKQotICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSAyOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgKythcmd2OwotICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSBhdG9sKCphcmd2KTsKLSAgICAgICAgICAgICAgICBpZiAobG9vcF9pbnRlcnZhbCA8IDApCi0gICAgICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSAyOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvb3BfaW50ZXJ2YWwgPiAxMDAwMDApICAgLyogYml0IG1vcmUgdGhhbiBvbmUgZGF5ICovCi0gICAgICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSAxMDAwMDA7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLW5vbW14ZmlsdGVycyIsIDcpKSB7Ci0gICAgICAgICAgICBycG5nMl9pbmZvLm5vbW14ZmlsdGVycyA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItbm9tbXhjb21iaW5lIiwgNykpIHsKLSAgICAgICAgICAgIHJwbmcyX2luZm8ubm9tbXhjb21iaW5lID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1ub21teGludGVybGFjZSIsIDcpKSB7Ci0gICAgICAgICAgICBycG5nMl9pbmZvLm5vbW14aW50ZXJsYWNlID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCAiLW5vbW14IikpIHsKLSAgICAgICAgICAgIHJwbmcyX2luZm8ubm9tbXhmaWx0ZXJzID0gVFJVRTsKLSAgICAgICAgICAgIHJwbmcyX2luZm8ubm9tbXhjb21iaW5lID0gVFJVRTsKLSAgICAgICAgICAgIHJwbmcyX2luZm8ubm9tbXhpbnRlcmxhY2UgPSBUUlVFOwotI2VuZGlmCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKiphcmd2ICE9ICctJykgewotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gKmFyZ3Y7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ3ZbMV0pICAgLyogc2hvdWxkbid0IGJlIGFueSBtb3JlIGFyZ3MgYWZ0ZXIgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICsrZXJyb3I7ICAgLyogbm90IGV4cGVjdGluZyBhbnkgb3RoZXIgb3B0aW9ucyAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFmaWxlbmFtZSkKLSAgICAgICAgKytlcnJvcjsKLQotCi0gICAgLyogcHJpbnQgdXNhZ2Ugc2NyZWVuIGlmIGFueSBlcnJvcnMgdXAgdG8gdGhpcyBwb2ludCAqLwotCi0gICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4lcyAlczogICVzXG5cbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBhcHBuYW1lKTsKLSAgICAgICAgcmVhZHBuZzJfdmVyc2lvbl9pbmZvKCk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iCi0gICAgICAgICAgIlVzYWdlOiAgJXMgWy1kaXNwbGF5IHhkcHldIFstZ2FtbWEgZXhwXSBbLWJnY29sb3IgYmcgfCAtYmdwYXQgcGF0XVxuIgotI2lmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX194ODZfNjRfXykpCi0gICAgICAgICAgIiAgICAgICAgJSpzIFtbLW5vbW14ZmlsdGVyc10gWy1ub21teGNvbWJpbmVdIFstbm9tbXhpbnRlcmxhY2VdIHwgLW5vbW14XVxuIgotI2VuZGlmCi0jaWZkZWYgRkVBVFVSRV9MT09QCi0gICAgICAgICAgIiAgICAgICAgJSpzIFstdXNsZWVwIGR1ciB8IC10aW1pbmddIFstcGF1c2VdIFstbG9vcCBbc2VjXV0gZmlsZS5wbmdcblxuIgotI2Vsc2UKLSAgICAgICAgICAiICAgICAgICAlKnMgWy11c2xlZXAgZHVyIHwgLXRpbWluZ10gWy1wYXVzZV0gZmlsZS5wbmdcblxuIgotI2VuZGlmCi0gICAgICAgICAgIiAgICB4ZHB5XHRuYW1lIG9mIHRoZSB0YXJnZXQgWCBkaXNwbGF5IChlLmcuLCBgYGhvc3RuYW1lOjAnJylcbiIKLSAgICAgICAgICAiICAgIGV4cCBcdHRyYW5zZmVyLWZ1bmN0aW9uIGV4cG9uZW50IChgYGdhbW1hJycpIG9mIHRoZSBkaXNwbGF5XG4iCi0gICAgICAgICAgIlx0XHQgIHN5c3RlbSBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQgKGUuZy4sIGBgJS4xZicnKTsgZXF1YWxcbiIKLSAgICAgICAgICAiXHRcdCAgdG8gdGhlIHByb2R1Y3Qgb2YgdGhlIGxvb2t1cC10YWJsZSBleHBvbmVudCAodmFyaWVzKVxuIgotICAgICAgICAgICJcdFx0ICBhbmQgdGhlIENSVCBleHBvbmVudCAodXN1YWxseSAyLjIpOyBtdXN0IGJlIHBvc2l0aXZlXG4iCi0gICAgICAgICAgIiAgICBiZyAgXHRkZXNpcmVkIGJhY2tncm91bmQgY29sb3IgaW4gNy1jaGFyYWN0ZXIgaGV4IFJHQiBmb3JtYXRcbiIKLSAgICAgICAgICAiXHRcdCAgKGUuZy4sIGBgI2ZmNzcwMCcnIGZvciBvcmFuZ2U6ICBzYW1lIGFzIEhUTUwgY29sb3JzKTtcbiIKLSAgICAgICAgICAiXHRcdCAgdXNlZCB3aXRoIHRyYW5zcGFyZW50IGltYWdlczsgb3ZlcnJpZGVzIC1iZ3BhdFxuIgotICAgICAgICAgICIgICAgcGF0IFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIHBhdHRlcm4gbnVtYmVyICgwLSVkKTsgdXNlZCB3aXRoXG4iCi0gICAgICAgICAgIlx0XHQgIHRyYW5zcGFyZW50IGltYWdlczsgb3ZlcnJpZGVzIC1iZ2NvbG9yXG4iCi0jaWZkZWYgRkVBVFVSRV9MT09QCi0gICAgICAgICAgIiAgICAtbG9vcFx0bG9vcHMgdGhyb3VnaCBiYWNrZ3JvdW5kIGltYWdlcyBhZnRlciBpbml0aWFsIGRpc3BsYXlcbiIKLSAgICAgICAgICAiXHRcdCAgaXMgY29tcGxldGUgKGRlcGVuZHMgb24gLWJncGF0KVxuIgotICAgICAgICAgICIgICAgc2VjIFx0c2Vjb25kcyB0byBkaXNwbGF5IGVhY2ggYmFja2dyb3VuZCBpbWFnZSAoZGVmYXVsdCA9IDIpXG4iCi0jZW5kaWYKLSNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQotICAgICAgICAgICIgICAgLW5vbW14Klx0ZGlzYWJsZSBvcHRpbWl6ZWQgTU1YIHJvdXRpbmVzIGZvciBkZWNvZGluZyByb3cgZmlsdGVycyxcbiIKLSAgICAgICAgICAiXHRcdCAgY29tYmluaW5nIHJvd3MsIGFuZCBleHBhbmRpbmcgaW50ZXJsYWNpbmcsIHJlc3BlY3RpdmVseVxuIgotI2VuZGlmCi0gICAgICAgICAgIiAgICBkdXIgXHRkdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMgdG8gd2FpdCBhZnRlciBkaXNwbGF5aW5nIGVhY2hcbiIKLSAgICAgICAgICAiXHRcdCAgcm93IChmb3IgZGVtbyBwdXJwb3NlcylcbiIKLSAgICAgICAgICAiICAgIC10aW1pbmdcdGVuYWJsZXMgZGVsYXkgZm9yIGV2ZXJ5IGJsb2NrIHJlYWQsIHRvIHNpbXVsYXRlIG1vZGVtXG4iCi0gICAgICAgICAgIlx0XHQgIGRvd25sb2FkIG9mIGltYWdlICh+MzYgS2JwcylcbiIKLSAgICAgICAgICAiICAgIC1wYXVzZVx0cGF1c2VzIGFmdGVyIGRpc3BsYXlpbmcgZWFjaCBwYXNzIHVudGlsIG1vdXNlIGNsaWNrZWRcbiIKLSAgICAgICAgICAiXG5QcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgKHdpdGhpbiBpbWFnZSB3aW5kb3csIGFmdGVyIGltYWdlXG4iCi0gICAgICAgICAgImlzIGRpc3BsYXllZCkgdG8gcXVpdC5cbiIKLSAgICAgICAgICAiXG4iLCBQUk9HTkFNRSwKLSNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQotICAgICAgICAgIChpbnQpc3RybGVuKFBST0dOQU1FKSwgIiAiLAotI2VuZGlmCi0gICAgICAgICAgKGludClzdHJsZW4oUFJPR05BTUUpLCAiICIsIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCwgbnVtX2JncGF0LTEpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotCi0gICAgaWYgKCEoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gUE5HIGZpbGUgWyVzXVxuIiwgZmlsZW5hbWUpOwotICAgICAgICArK2Vycm9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluY291bnQgPSBmcmVhZChpbmJ1ZiwgMSwgSU5CVUZTSVpFLCBpbmZpbGUpOwotICAgICAgICBpZiAoaW5jb3VudCA8IDggfHwgIXJlYWRwbmcyX2NoZWNrX3NpZyhpbmJ1ZiwgOCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAiOiAgWyVzXSBpcyBub3QgYSBQTkcgZmlsZTogaW5jb3JyZWN0IHNpZ25hdHVyZVxuIiwKLSAgICAgICAgICAgICAgZmlsZW5hbWUpOwotICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgfSBlbHNlIGlmICgocmMgPSByZWFkcG5nMl9pbml0KCZycG5nMl9pbmZvKSkgIT0gMCkgewotICAgICAgICAgICAgc3dpdGNoIChyYykgewotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaGFzIGJhZCBJSERSIChsaWJwbmcgbG9uZ2ptcClcbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnlcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiOiAgdW5rbm93biByZWFkcG5nMl9pbml0KCkgZXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCBYT3BlbkRpc3BsYXkoKVxuIikpCi0gICAgICAgICAgICBkaXNwbGF5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXluYW1lKTsKLSAgICAgICAgICAgIGlmICghZGlzcGxheSkgewotICAgICAgICAgICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBYIGRpc3BsYXkgWyVzXVxuIiwKLSAgICAgICAgICAgICAgICAgIGRpc3BsYXluYW1lPyBkaXNwbGF5bmFtZSA6ICJkZWZhdWx0Iik7Ci0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZXJyb3IpCi0gICAgICAgICAgICBmY2xvc2UoaW5maWxlKTsKLSAgICB9Ci0KLQotICAgIGlmIChlcnJvcikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGFib3J0aW5nLlxuIik7Ci0gICAgICAgIGV4aXQoMik7Ci0gICAgfQotCi0KLSAgICAvKiBzZXQgdGhlIHRpdGxlLWJhciBzdHJpbmcsIGJ1dCBtYWtlIHN1cmUgYnVmZmVyIGRvZXNuJ3Qgb3ZlcmZsb3cgKi8KLQotICAgIGFsZW4gPSBzdHJsZW4oYXBwbmFtZSk7Ci0gICAgZmxlbiA9IHN0cmxlbihmaWxlbmFtZSk7Ci0gICAgaWYgKGFsZW4gKyBmbGVuICsgMyA+IDEwMjMpCi0gICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogIC4uLiVzIiwgYXBwbmFtZSwgZmlsZW5hbWUrKGFsZW4rZmxlbis2LTEwMjMpKTsKLSAgICBlbHNlCi0gICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogICVzIiwgYXBwbmFtZSwgZmlsZW5hbWUpOwotCi0KLSAgICAvKiBzZXQgc29tZSBmaW5hbCBycG5nMl9pbmZvIHZhcmlhYmxlcyBiZWZvcmUgZW50ZXJpbmcgbWFpbiBkYXRhIGxvb3AgKi8KLQotICAgIGlmIChoYXZlX2JnKSB7Ci0gICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7ICAgLyogdGhpcyBhcHByb2FjaCBxdWlldHMgY29tcGlsZXIgd2FybmluZ3MgKi8KLQotICAgICAgICBzc2NhbmYoYmdzdHIrMSwgIiUyeCUyeCUyeCIsICZyLCAmZywgJmIpOwotICAgICAgICBycG5nMl9pbmZvLmJnX3JlZCAgID0gKHVjaClyOwotICAgICAgICBycG5nMl9pbmZvLmJnX2dyZWVuID0gKHVjaClnOwotICAgICAgICBycG5nMl9pbmZvLmJnX2JsdWUgID0gKHVjaCliOwotICAgIH0gZWxzZQotICAgICAgICBycG5nMl9pbmZvLm5lZWRfYmdjb2xvciA9IFRSVUU7Ci0KLSAgICBycG5nMl9pbmZvLnN0YXRlID0ga1ByZUluaXQ7Ci0gICAgcnBuZzJfaW5mby5tYWlucHJvZ19pbml0ID0gcnBuZzJfeF9pbml0OwotICAgIHJwbmcyX2luZm8ubWFpbnByb2dfZGlzcGxheV9yb3cgPSBycG5nMl94X2Rpc3BsYXlfcm93OwotICAgIHJwbmcyX2luZm8ubWFpbnByb2dfZmluaXNoX2Rpc3BsYXkgPSBycG5nMl94X2ZpbmlzaF9kaXNwbGF5OwotCi0KLSAgICAvKiBPSywgdGhpcyBpcyB0aGUgZnVuIHBhcnQ6ICBjYWxsIHJlYWRwbmcyX2RlY29kZV9kYXRhKCkgYXQgdGhlIHN0YXJ0IG9mCi0gICAgICogdGhlIGxvb3AgdG8gZGVhbCB3aXRoIG91ciBmaXJzdCBidWZmZXIgb2YgZGF0YSAocmVhZCBpbiBhYm92ZSB0byB2ZXJpZnkKLSAgICAgKiB0aGF0IHRoZSBmaWxlIGlzIGEgUE5HIGltYWdlKSwgdGhlbiBsb29wIHRocm91Z2ggdGhlIGZpbGUgYW5kIGNvbnRpbnVlCi0gICAgICogY2FsbGluZyB0aGUgc2FtZSByb3V0aW5lIHRvIGhhbmRsZSBlYWNoIGNodW5rIG9mIGRhdGEuICBJdCBpbiB0dXJuCi0gICAgICogcGFzc2VzIHRoZSBkYXRhIHRvIGxpYnBuZywgd2hpY2ggd2lsbCBpbnZva2Ugb25lIG9yIG1vcmUgb2Ygb3VyIGNhbGwtCi0gICAgICogYmFja3MgYXMgZGVjb2RlZCBkYXRhIGJlY29tZSBhdmFpbGFibGUuICBXZSBvcHRpb25hbGx5IGNhbGwgc2xlZXAoKSBmb3IKLSAgICAgKiBvbmUgc2Vjb25kIHBlciBpdGVyYXRpb24gdG8gc2ltdWxhdGUgZG93bmxvYWRpbmcgdGhlIGltYWdlIHZpYSBhbiBhbmFsb2cKLSAgICAgKiBtb2RlbS4gKi8KLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgcmVhZHBuZzJfZGVjb2RlX2RhdGEoKVxuIikpCi0gICAgICAgIGlmIChyZWFkcG5nMl9kZWNvZGVfZGF0YSgmcnBuZzJfaW5mbywgaW5idWYsIGluY291bnQpKQotICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpXG4iKSkKLQotICAgICAgICBpZiAoZXJyb3IgfHwgaW5jb3VudCAhPSBJTkJVRlNJWkUgfHwgcnBuZzJfaW5mby5zdGF0ZSA9PSBrRG9uZSkgewotICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uc3RhdGUgPT0ga0RvbmUpIHsKLSAgICAgICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZG9uZSBkZWNvZGluZyBQTkcgaW1hZ2VcbiIpKQotICAgICAgICAgICAgfSBlbHNlIGlmIChmZXJyb3IoaW5maWxlKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgIjogIGVycm9yIHdoaWxlIHJlYWRpbmcgUE5HIGltYWdlIGZpbGVcbiIpOwotICAgICAgICAgICAgICAgIGV4aXQoMyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZlb2YoaW5maWxlKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgZW5kIG9mIGZpbGUgcmVhY2hlZCAiCi0gICAgICAgICAgICAgICAgICAiKHVuZXhwZWN0ZWRseSkgd2hpbGUgcmVhZGluZyBQTkcgaW1hZ2UgZmlsZVxuIik7Ci0gICAgICAgICAgICAgICAgZXhpdCgzKTsKLSAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAoZXJyb3IpICovIHsKLSAgICAgICAgICAgICAgICAvLyB3aWxsIHByaW50IGVycm9yIG1lc3NhZ2UgYmVsb3cKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRpbWluZykKLSAgICAgICAgICAgIHNsZWVwKDEpOwotCi0gICAgICAgIGluY291bnQgPSBmcmVhZChpbmJ1ZiwgMSwgSU5CVUZTSVpFLCBpbmZpbGUpOwotICAgIH0KLQotCi0gICAgLyogY2xlYW4gdXAgUE5HIHN0dWZmIGFuZCByZXBvcnQgYW55IGRlY29kaW5nIGVycm9ycyAqLwotCi0gICAgZmNsb3NlKGluZmlsZSk7Ci0gICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgcmVhZHBuZzJfY2xlYW51cCgpXG4iKSkKLSAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKLQotICAgIGlmIChlcnJvcikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGxpYnBuZyBlcnJvciB3aGlsZSBkZWNvZGluZyBQTkcgaW1hZ2VcbiIpOwotICAgICAgICBleGl0KDMpOwotICAgIH0KLQotCi0jaWZkZWYgRkVBVFVSRV9MT09QCi0KLSAgICBpZiAobG9vcCAmJiBiZ19pbWFnZSkgewotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZW50ZXJpbmcgLWxvb3AgbG9vcCAoRkVBVFVSRV9MT09QKVxuIikpCi0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIGludCBpLCB1c2Vfc2xlZXA7Ci0gICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCBub3csIHRoZW47Ci0KLSAgICAgICAgICAgIC8qIGdldCBjdXJyZW50IHRpbWUgYW5kIGFkZCBsb29wX2ludGVydmFsIHRvIGdldCB0YXJnZXQgdGltZSAqLwotICAgICAgICAgICAgaWYgKGdldHRpbWVvZmRheSgmdGhlbiwgTlVMTCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHRoZW4udHZfc2VjICs9IGxvb3BfaW50ZXJ2YWw7Ci0gICAgICAgICAgICAgICAgdXNlX3NsZWVwID0gRkFMU0U7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB1c2Vfc2xlZXAgPSBUUlVFOwotCi0gICAgICAgICAgICAvKiBkbyBxdWljayBjaGVjayBmb3IgYSBxdWl0IGV2ZW50IGJ1dCBkb24ndCB3YWl0IGZvciBpdCAqLwotICAgICAgICAgICAgLyogR1JSIEJVRzogIHNob3VsZCBhbHNvIGNoZWNrIGZvciBFeHBvc2UgZXZlbnRzIGFuZCByZWRyYXcuLi4gKi8KLSAgICAgICAgICAgIGlmIChYQ2hlY2tNYXNrRXZlbnQoZGlzcGxheSwgS2V5UHJlc3NNYXNrIHwgQnV0dG9uUHJlc3NNYXNrLCAmZSkpCi0gICAgICAgICAgICAgICAgaWYgKFFVSVQoZSxrKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIGdlbmVyYXRlIG5leHQgYmFja2dyb3VuZCBpbWFnZSAqLwotICAgICAgICAgICAgaWYgKCsrcGF0ID49IG51bV9iZ3BhdCkKLSAgICAgICAgICAgICAgICBwYXQgPSAwOwotICAgICAgICAgICAgcnBuZzJfeF9yZWxvYWRfYmdfaW1hZ2UoKTsKLQotICAgICAgICAgICAgLyogd2FpdCBmb3IgdGltZW91dCwgdXNpbmcgd2hhdGV2ZXIgbWVhbnMgYXJlIGF2YWlsYWJsZSAqLwotICAgICAgICAgICAgaWYgKHVzZV9zbGVlcCB8fCBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IGxvb3BfaW50ZXJ2YWw7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICBzbGVlcCgxKTsKLSAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRzogIGFsc28gbmVlZCB0byBjaGVjayBmb3IgRXhwb3NlIChhbmQgcmVkcmF3ISkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKFhDaGVja01hc2tFdmVudChkaXNwbGF5LCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAmZSkgJiYgUVVJVChlLGspKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBZMjAzOCBCVUchICovCi0gICAgICAgICAgICAgICAgaWYgKG5vdy50dl9zZWMgPCB0aGVuLnR2X3NlYyB8fAotICAgICAgICAgICAgICAgICAgICAobm93LnR2X3NlYyA9PSB0aGVuLnR2X3NlYyAmJiBub3cudHZfdXNlYyA8IHRoZW4udHZfdXNlYykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcXVpdCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICBsb25nIHNlY29uZHNfdG9fZ28gPSB0aGVuLnR2X3NlYyAtIG5vdy50dl9zZWM7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgdXNsZWVwX3VzZWM7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogYmFzaWNhbGx5IGNoZXcgdXAgbW9zdCBvZiByZW1haW5pbmcgbG9vcC1pbnRlcnZhbCB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAqICBjYWxscyB0byBzbGVlcCgxKSBpbnRlcmxlYXZlZCB3aXRoIGNoZWNrcyBmb3IgcXVpdAotICAgICAgICAgICAgICAgICAgICAgKiAgZXZlbnRzLCBidXQgYWxzbyByZWNhbGMgdGltZS10by1nbyBwZXJpb2RpY2FsbHk7IHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICogIGRvbmUsIGNsZWFuIHVwIGFueSByZW1haW5pbmcgdGltZSB3aXRoIHVzbGVlcCgpIGNhbGwKLSAgICAgICAgICAgICAgICAgICAgICogIChjb3VsZCBhbHNvIHVzZSBTSUdBTFJNLCBidXQgc2lnbmFscyBhcmUgYSBwYWluLi4uKSAqLwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2Vjb25kc190b19nby0tID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlY29uZHNfZG9uZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IHNlY29uZHNfdG9fZ287ICBpID4gMCAmJiAhcXVpdDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc6ICBuZWVkIHRvIGNoZWNrIGZvciBFeHBvc2UgYW5kIHJlZHJhdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYQ2hlY2tNYXNrRXZlbnQoZGlzcGxheSwgS2V5UHJlc3NNYXNrIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnV0dG9uUHJlc3NNYXNrLCAmZSkgJiYgUVVJVChlLGspKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWl0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytzZWNvbmRzX2RvbmUgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAvKiB0aW1lIHRvIHJlZG8gc2Vjb25kc190b19nbyBtZWFzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1aXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9LLCBtb3JlIHRoYW4gMTAwMCBzZWNvbmRzIHNpbmNlIGxhc3QgY2hlY2s6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiAgY29ycmVjdCB0aGUgdGltZS10by1nbyBtZWFzdXJlbWVudCBmb3IgZHJpZnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3cudHZfc2VjID49IHRoZW4udHZfc2VjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzX3RvX2dvID0gdGhlbi50dl9zZWMgLSBub3cudHZfc2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytzZWNvbmRzX3RvX2dvOyAgLyogcmVzdG9yZSB3aGF0IHdlIHN1YnRyYWN0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocXVpdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8qIGJyZWFrcyBvdXRlciBkby1sb29wLCBza2lwcyByZWRpc3BsYXkgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBzaW5jZSBkaWZmZXJlbmNlIGJldHdlZW4gIm5vdyIgYW5kICJ0aGVuIiBpcyBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgICAqICBlYXRlbiB1cCB0byB3aXRoaW4gYSBjb3VwbGUgb2Ygc2Vjb25kcywgZG9uJ3QgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgKiAgd29ycnkgYWJvdXQgb3ZlcmZsb3ctLWJ1dCBtaWdodCBoYXZlIG92ZXJzaG90IChuZWcuKSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzbGVlcF91c2VjID0gMTAwMDAwMEwqKHRoZW4udHZfc2VjIC0gbm93LnR2X3NlYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuLnR2X3VzZWMgLSBub3cudHZfdXNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2xlZXBfdXNlYyA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwKCh1bGcpdXNsZWVwX3VzZWMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBjb21wb3NpdGUgaW1hZ2UgYWdhaW5zdCBuZXcgYmFja2dyb3VuZCBhbmQgZGlzcGxheSAobm90ZSB0aGF0Ci0gICAgICAgICAgICAgKiAgd2UgZG8gbm90IHRha2UgaW50byBhY2NvdW50IHRoZSB0aW1lIHNwZW50IGRvaW5nIHRoaXMuLi4pICovCi0gICAgICAgICAgICBycG5nMl94X3JlZGlzcGxheV9pbWFnZSAoMCwgMCwgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5oZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgLyogRkFMTCBUSFJPVUdIIGFuZCBkbyB0aGUgbm9ybWFsIHRoaW5nICovCi0KLSNlbmRpZiAvKiBGRUFUVVJFX0xPT1AgKi8KLQotICAgIC8qIHdhaXQgZm9yIHRoZSB1c2VyIHRvIHRlbGwgdXMgd2hlbiB0byBxdWl0ICovCi0KLSAgICBpZiAocnBuZzJfaW5mby5zdGF0ZSA+PSBrV2luZG93SW5pdCkgewotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZW50ZXJpbmcgZmluYWwgd2FpdC1mb3ItcXVpdC1ldmVudCBsb29wXG4iKSkKLSAgICAgICAgZG8gewotICAgICAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7Ci0gICAgICAgICAgICBpZiAoZS50eXBlID09IEV4cG9zZSkgewotICAgICAgICAgICAgICAgIFhFeHBvc2VFdmVudCAqZXggPSAoWEV4cG9zZUV2ZW50ICopJmU7Ci0gICAgICAgICAgICAgICAgcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UgKGV4LT54LCBleC0+eSwgZXgtPndpZHRoLCBleC0+aGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoIVFVSVQoZSxrKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbml0IGNhbGxiYWNrIG5ldmVyIGNhbGxlZDogIHByb2JhYmxlICIKLSAgICAgICAgICAibGlicG5nIGVycm9yIHdoaWxlIGRlY29kaW5nIFBORyBtZXRhZGF0YVxuIik7Ci0gICAgICAgIGV4aXQoNCk7Ci0gICAgfQotCi0KLSAgICAvKiB3ZSdyZSBkb25lOiAgY2xlYW4gdXAgYWxsIGltYWdlIGFuZCBYIHJlc291cmNlcyBhbmQgZ28gYXdheSAqLwotCi0gICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgcnBuZzJfeF9jbGVhbnVwKClcbiIpKQotICAgIHJwbmcyX3hfY2xlYW51cCgpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgcmVhZHBuZzJfaW5mb19jYWxsYmFjaygpIGluIHJlYWRwbmcyLmMsIHdoaWNoCi0gKiBpbiB0dXJuIGlzIGNhbGxlZCBieSBsaWJwbmcgYWZ0ZXIgYWxsIG9mIHRoZSBwcmUtSURBVCBjaHVua3MgaGF2ZSBiZWVuCi0gKiByZWFkIGFuZCBwcm9jZXNzZWQtLWkuZS4sIHdlIG5vdyBoYXZlIGVub3VnaCBpbmZvIHRvIGZpbmlzaCBpbml0aWFsaXppbmcgKi8KLQotc3RhdGljIHZvaWQgcnBuZzJfeF9pbml0KHZvaWQpCi17Ci0gICAgdWxnIGk7Ci0gICAgdWxnIHJvd2J5dGVzID0gcnBuZzJfaW5mby5yb3dieXRlczsKLQotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfeF9pbml0KClcbiIpKQotICAgIFRyYWNlKChzdGRlcnIsICIgIHJvd2J5dGVzID0gJWRcbiIsIHJwbmcyX2luZm8ucm93Ynl0ZXMpKQotICAgIFRyYWNlKChzdGRlcnIsICIgIHdpZHRoICA9ICVsZFxuIiwgcnBuZzJfaW5mby53aWR0aCkpCi0gICAgVHJhY2UoKHN0ZGVyciwgIiAgaGVpZ2h0ID0gJWxkXG4iLCBycG5nMl9pbmZvLmhlaWdodCkpCi0KLSAgICBycG5nMl9pbmZvLmltYWdlX2RhdGEgPSAodWNoICopbWFsbG9jKHJvd2J5dGVzICogcnBuZzJfaW5mby5oZWlnaHQpOwotICAgIGlmICghcnBuZzJfaW5mby5pbWFnZV9kYXRhKSB7Ci0gICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMgPSAodWNoICoqKW1hbGxvYyhycG5nMl9pbmZvLmhlaWdodCAqIHNpemVvZih1Y2ggKikpOwotICAgIGlmICghcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMpIHsKLSAgICAgICAgZnJlZShycG5nMl9pbmZvLmltYWdlX2RhdGEpOwotICAgICAgICBycG5nMl9pbmZvLmltYWdlX2RhdGEgPSBOVUxMOwotICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK2kpCi0gICAgICAgIHJwbmcyX2luZm8ucm93X3BvaW50ZXJzW2ldID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgaSpyb3dieXRlczsKLQotCi0gICAgLyogZG8gdGhlIGJhc2ljIFggaW5pdGlhbGl6YXRpb24gc3R1ZmYsIG1ha2UgdGhlIHdpbmRvdywgYW5kIGZpbGwgaXQgd2l0aAotICAgICAqIHRoZSB1c2VyLXNwZWNpZmllZCwgZmlsZS1zcGVjaWZpZWQgb3IgZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIG9yCi0gICAgICogcGF0dGVybiAqLwotCi0gICAgaWYgKHJwbmcyX3hfY3JlYXRlX3dpbmRvdygpKSB7Ci0KLSAgICAgICAgLyogR1JSIFRFTVBPUkFSWSBIQUNLOiAgdGhpcyBpcyBmdW5kYW1lbnRhbGx5IG5vIGRpZmZlcmVudCBmcm9tIGNhc2VzCi0gICAgICAgICAqIGFib3ZlOyBsaWJwbmcgc2hvdWxkIGxvbmdqbXAoKSBiYWNrIHRvIHVzIHdoZW4gcG5nX3B0ciBnb2VzIGF3YXkuCi0gICAgICAgICAqIElmIHdlL2l0IHNlZ2ZhdWx0IGluc3RlYWQsIHNlZW1zIGxpa2UgYSBsaWJwbmcgYnVnLi4uICovCi0KLSAgICAgICAgLyogd2UncmUgaGVyZSB2aWEgbGlicG5nIGNhbGxiYWNrLCBzbyBpZiB3aW5kb3cgZmFpbHMsIGNsZWFuIGFuZCBiYWlsICovCi0gICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwotICAgICAgICBycG5nMl94X2NsZWFudXAoKTsKLSAgICAgICAgZXhpdCgyKTsKLSAgICB9Ci0KLSAgICBycG5nMl9pbmZvLnN0YXRlID0ga1dpbmRvd0luaXQ7Ci19Ci0KLQotCi0KLQotc3RhdGljIGludCBycG5nMl94X2NyZWF0ZV93aW5kb3codm9pZCkKLXsKLSAgICB1bGcgYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKLSAgICB1bGcgYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwotICAgIHVsZyBiZ19ibHVlICA9IHJwbmcyX2luZm8uYmdfYmx1ZTsKLSAgICB1bGcgYmdfcGl4ZWwgPSAwTDsKLSAgICB1bGcgYXR0cm1hc2s7Ci0gICAgaW50IG5lZWRfY29sb3JtYXAgPSBGQUxTRTsKLSAgICBpbnQgc2NyZWVuLCBwYWQ7Ci0gICAgdWNoICp4ZGF0YTsKLSAgICBXaW5kb3cgcm9vdDsKLSAgICBYRXZlbnQgZTsKLSAgICBYR0NWYWx1ZXMgZ2N2YWx1ZXM7Ci0gICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKLSAgICBYVGV4dFByb3BlcnR5IHdpbmRvd05hbWUsICpwV2luZG93TmFtZSA9ICZ3aW5kb3dOYW1lOwotICAgIFhUZXh0UHJvcGVydHkgaWNvbk5hbWUsICpwSWNvbk5hbWUgPSAmaWNvbk5hbWU7Ci0gICAgWFZpc3VhbEluZm8gdmlzdWFsX2luZm87Ci0gICAgWFNpemVIaW50cyAqc2l6ZV9oaW50czsKLSAgICBYV01IaW50cyAqd21faGludHM7Ci0gICAgWENsYXNzSGludCAqY2xhc3NfaGludHM7Ci0KLQotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfeF9jcmVhdGVfd2luZG93KClcbiIpKQotCi0gICAgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkaXNwbGF5KTsKLSAgICBkZXB0aCA9IERpc3BsYXlQbGFuZXMoZGlzcGxheSwgc2NyZWVuKTsKLSAgICByb290ID0gUm9vdFdpbmRvdyhkaXNwbGF5LCBzY3JlZW4pOwotCi0jaWZkZWYgREVCVUcKLSAgICBYU3luY2hyb25pemUoZGlzcGxheSwgVHJ1ZSk7Ci0jZW5kaWYKLQotICAgIGlmIChkZXB0aCAhPSAxNiAmJiBkZXB0aCAhPSAyNCAmJiBkZXB0aCAhPSAzMikgewotICAgICAgICBpbnQgdmlzdWFsc19tYXRjaGVkID0gMDsKLQotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZGVmYXVsdCBkZXB0aCBpcyAlZDogIGNoZWNraW5nIG90aGVyIHZpc3VhbHNcbiIsCi0gICAgICAgICAgZGVwdGgpKQotCi0gICAgICAgIC8qIDI0LWJpdCBmaXJzdCAqLwotICAgICAgICB2aXN1YWxfaW5mby5zY3JlZW4gPSBzY3JlZW47Ci0gICAgICAgIHZpc3VhbF9pbmZvLmRlcHRoID0gMjQ7Ci0gICAgICAgIHZpc3VhbF9saXN0ID0gWEdldFZpc3VhbEluZm8oZGlzcGxheSwKLSAgICAgICAgICBWaXN1YWxTY3JlZW5NYXNrIHwgVmlzdWFsRGVwdGhNYXNrLCAmdmlzdWFsX2luZm8sICZ2aXN1YWxzX21hdGNoZWQpOwotICAgICAgICBpZiAodmlzdWFsc19tYXRjaGVkID09IDApIHsKLS8qIEdSUjogIGFkZCAxNS0sIDE2LSBhbmQgMzItYml0IFRydWVDb2xvciB2aXN1YWxzIChhbHNvIERpcmVjdENvbG9yPykgKi8KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmYXVsdCBzY3JlZW4gZGVwdGggJWQgbm90IHN1cHBvcnRlZCwgYW5kIG5vIgotICAgICAgICAgICAgICAiIDI0LWJpdCB2aXN1YWxzIGZvdW5kXG4iLCBkZXB0aCk7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiWEdldFZpc3VhbEluZm8oKSByZXR1cm5lZCAlZCAyNC1iaXQgdmlzdWFsc1xuIiwKLSAgICAgICAgICB2aXN1YWxzX21hdGNoZWQpKQotICAgICAgICB2aXN1YWwgPSB2aXN1YWxfbGlzdFswXS52aXN1YWw7Ci0gICAgICAgIGRlcHRoID0gdmlzdWFsX2xpc3RbMF0uZGVwdGg7Ci0vKgotICAgICAgICBjb2xvcm1hcF9zaXplID0gdmlzdWFsX2xpc3RbMF0uY29sb3JtYXBfc2l6ZTsKLSAgICAgICAgdmlzdWFsX2NsYXNzID0gdmlzdWFsLT5jbGFzczsKLSAgICAgICAgdmlzdWFsSUQgPSBYVmlzdWFsSURGcm9tVmlzdWFsKHZpc3VhbCk7Ci0gKi8KLSAgICAgICAgaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCA9IFRSVUU7Ci0gICAgICAgIG5lZWRfY29sb3JtYXAgPSBUUlVFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFhNYXRjaFZpc3VhbEluZm8oZGlzcGxheSwgc2NyZWVuLCBkZXB0aCwgVHJ1ZUNvbG9yLCAmdmlzdWFsX2luZm8pOwotICAgICAgICB2aXN1YWwgPSB2aXN1YWxfaW5mby52aXN1YWw7Ci0gICAgfQotCi0gICAgUk1hc2sgPSB2aXN1YWwtPnJlZF9tYXNrOwotICAgIEdNYXNrID0gdmlzdWFsLT5ncmVlbl9tYXNrOwotICAgIEJNYXNrID0gdmlzdWFsLT5ibHVlX21hc2s7Ci0KLS8qIEdSUjogIGFkZC9jaGVjayA4LWJpdCBzdXBwb3J0ICovCi0gICAgaWYgKGRlcHRoID09IDggfHwgbmVlZF9jb2xvcm1hcCkgewotICAgICAgICBjb2xvcm1hcCA9IFhDcmVhdGVDb2xvcm1hcChkaXNwbGF5LCByb290LCB2aXN1YWwsIEFsbG9jTm9uZSk7Ci0gICAgICAgIGlmICghY29sb3JtYXApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWENyZWF0ZUNvbG9ybWFwKCkgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgICAgIGhhdmVfY29sb3JtYXAgPSBUUlVFOwotICAgICAgICBpZiAoZGVwdGggPT0gOCkKLSAgICAgICAgICAgIGJnX2ltYWdlID0gRkFMU0U7ICAgLyogZ3JhZGllbnQganVzdCB3YXN0ZXMgcGFsZXR0ZSBlbnRyaWVzICovCi0gICAgfQotICAgIGlmIChkZXB0aCA9PSAxNSB8fCBkZXB0aCA9PSAxNikgewotICAgICAgICBSU2hpZnQgPSAxNSAtIHJwbmcyX3hfbXNiKFJNYXNrKTsgICAgLyogdGhlc2UgYXJlIHJpZ2h0LXNoaWZ0cyAqLwotICAgICAgICBHU2hpZnQgPSAxNSAtIHJwbmcyX3hfbXNiKEdNYXNrKTsKLSAgICAgICAgQlNoaWZ0ID0gMTUgLSBycG5nMl94X21zYihCTWFzayk7Ci0gICAgfSBlbHNlIGlmIChkZXB0aCA+IDE2KSB7Ci0gICAgICAgIFJTaGlmdCA9IHJwbmcyX3hfbXNiKFJNYXNrKSAtIDc7ICAgICAvKiB0aGVzZSBhcmUgbGVmdC1zaGlmdHMgKi8KLSAgICAgICAgR1NoaWZ0ID0gcnBuZzJfeF9tc2IoR01hc2spIC0gNzsKLSAgICAgICAgQlNoaWZ0ID0gcnBuZzJfeF9tc2IoQk1hc2spIC0gNzsKLSAgICB9Ci0gICAgaWYgKGRlcHRoID49IDE1ICYmIChSU2hpZnQgPCAwIHx8IEdTaGlmdCA8IDAgfHwgQlNoaWZ0IDwgMCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJycG5nMiBpbnRlcm5hbCBsb2dpYyBlcnJvcjogIG5lZ2F0aXZlIFggc2hpZnQocykhXG4iKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbmFsbHksIGNyZWF0ZSB0aGUgd2luZG93LgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgYXR0ci5iYWNraW5nX3N0b3JlID0gQWx3YXlzOwotICAgIGF0dHIuZXZlbnRfbWFzayA9IEV4cG9zdXJlTWFzayB8IEtleVByZXNzTWFzayB8IEJ1dHRvblByZXNzTWFzazsKLSAgICBhdHRybWFzayA9IENXQmFja2luZ1N0b3JlIHwgQ1dFdmVudE1hc2s7Ci0gICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpIHsKLSAgICAgICAgYXR0ci5jb2xvcm1hcCA9IGNvbG9ybWFwOwotICAgICAgICBhdHRyLmJhY2tncm91bmRfcGl4ZWwgPSAwOwotICAgICAgICBhdHRyLmJvcmRlcl9waXhlbCA9IDE7Ci0gICAgICAgIGF0dHJtYXNrIHw9IENXQ29sb3JtYXAgfCBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWw7Ci0gICAgfQotCi0gICAgd2luZG93ID0gWENyZWF0ZVdpbmRvdyhkaXNwbGF5LCByb290LCAwLCAwLCBycG5nMl9pbmZvLndpZHRoLAotICAgICAgcnBuZzJfaW5mby5oZWlnaHQsIDAsIGRlcHRoLCBJbnB1dE91dHB1dCwgdmlzdWFsLCBhdHRybWFzaywgJmF0dHIpOwotCi0gICAgaWYgKHdpbmRvdyA9PSBOb25lKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiWENyZWF0ZVdpbmRvdygpIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0gZWxzZQotICAgICAgICBoYXZlX3dpbmRvdyA9IFRSVUU7Ci0KLSAgICBpZiAoZGVwdGggPT0gOCkKLSAgICAgICAgWFNldFdpbmRvd0NvbG9ybWFwKGRpc3BsYXksIHdpbmRvdywgY29sb3JtYXApOwotCi0gICAgaWYgKCFYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KCZ3aW5kb3dfbmFtZSwgMSwgcFdpbmRvd05hbWUpKQotICAgICAgICBwV2luZG93TmFtZSA9IE5VTEw7Ci0gICAgaWYgKCFYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KCZpY29uX25hbWUsIDEsIHBJY29uTmFtZSkpCi0gICAgICAgIHBJY29uTmFtZSA9IE5VTEw7Ci0KLSAgICAvKiBPSyBpZiBlaXRoZXIgaGludHMgYWxsb2NhdGlvbiBmYWlsczsgWFNldFdNUHJvcGVydGllcygpIGFsbG93cyBOVUxMcyAqLwotCi0gICAgaWYgKChzaXplX2hpbnRzID0gWEFsbG9jU2l6ZUhpbnRzKCkpICE9IE5VTEwpIHsKLSAgICAgICAgLyogd2luZG93IHdpbGwgbm90IGJlIHJlc2l6YWJsZSAqLwotICAgICAgICBzaXplX2hpbnRzLT5mbGFncyA9IFBNaW5TaXplIHwgUE1heFNpemU7Ci0gICAgICAgIHNpemVfaGludHMtPm1pbl93aWR0aCA9IHNpemVfaGludHMtPm1heF93aWR0aCA9IChpbnQpcnBuZzJfaW5mby53aWR0aDsKLSAgICAgICAgc2l6ZV9oaW50cy0+bWluX2hlaWdodCA9IHNpemVfaGludHMtPm1heF9oZWlnaHQgPQotICAgICAgICAgIChpbnQpcnBuZzJfaW5mby5oZWlnaHQ7Ci0gICAgfQotCi0gICAgaWYgKCh3bV9oaW50cyA9IFhBbGxvY1dNSGludHMoKSkgIT0gTlVMTCkgewotICAgICAgICB3bV9oaW50cy0+aW5pdGlhbF9zdGF0ZSA9IE5vcm1hbFN0YXRlOwotICAgICAgICB3bV9oaW50cy0+aW5wdXQgPSBUcnVlOwotICAgICAvKiB3bV9oaW50cy0+aWNvbl9waXhtYXAgPSBpY29uX3BpeG1hcDsgKi8KLSAgICAgICAgd21faGludHMtPmZsYWdzID0gU3RhdGVIaW50IHwgSW5wdXRIaW50ICAvKiB8IEljb25QaXhtYXBIaW50ICovIDsKLSAgICB9Ci0KLSAgICBpZiAoKGNsYXNzX2hpbnRzID0gWEFsbG9jQ2xhc3NIaW50KCkpICE9IE5VTEwpIHsKLSAgICAgICAgY2xhc3NfaGludHMtPnJlc19uYW1lID0gcmVzX25hbWU7Ci0gICAgICAgIGNsYXNzX2hpbnRzLT5yZXNfY2xhc3MgPSByZXNfY2xhc3M7Ci0gICAgfQotCi0gICAgWFNldFdNUHJvcGVydGllcyhkaXNwbGF5LCB3aW5kb3csIHBXaW5kb3dOYW1lLCBwSWNvbk5hbWUsIE5VTEwsIDAsCi0gICAgICBzaXplX2hpbnRzLCB3bV9oaW50cywgY2xhc3NfaGludHMpOwotCi0gICAgLyogdmFyaW91cyBwcm9wZXJ0aWVzIGFuZCBoaW50cyBubyBsb25nZXIgbmVlZGVkOyBmcmVlIG1lbW9yeSAqLwotICAgIGlmIChwV2luZG93TmFtZSkKLSAgICAgICBYRnJlZShwV2luZG93TmFtZS0+dmFsdWUpOwotICAgIGlmIChwSWNvbk5hbWUpCi0gICAgICAgWEZyZWUocEljb25OYW1lLT52YWx1ZSk7Ci0gICAgaWYgKHNpemVfaGludHMpCi0gICAgICAgIFhGcmVlKHNpemVfaGludHMpOwotICAgIGlmICh3bV9oaW50cykKLSAgICAgICBYRnJlZSh3bV9oaW50cyk7Ci0gICAgaWYgKGNsYXNzX2hpbnRzKQotICAgICAgIFhGcmVlKGNsYXNzX2hpbnRzKTsKLQotICAgIFhNYXBXaW5kb3coZGlzcGxheSwgd2luZG93KTsKLQotICAgIGdjID0gWENyZWF0ZUdDKGRpc3BsYXksIHdpbmRvdywgMCwgJmdjdmFsdWVzKTsKLSAgICBoYXZlX2djID0gVFJVRTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBYLSBhbmQgZGlzcGxheS1zcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBpbWFnZS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MoNCpycG5nMl9pbmZvLndpZHRoKnJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICAgICAgcGFkID0gMzI7Ci0gICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewotICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MoMipycG5nMl9pbmZvLndpZHRoKnJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICAgICAgcGFkID0gMTY7Ci0gICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewotICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MocnBuZzJfaW5mby53aWR0aCpycG5nMl9pbmZvLmhlaWdodCk7Ci0gICAgICAgIHBhZCA9IDg7Ci0gICAgfQotCi0gICAgaWYgKCF4ZGF0YSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBpbWFnZSBtZW1vcnlcbiIpOwotICAgICAgICByZXR1cm4gNDsKLSAgICB9Ci0KLSAgICB4aW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoZGlzcGxheSwgdmlzdWFsLCBkZXB0aCwgWlBpeG1hcCwgMCwKLSAgICAgIChjaGFyICopeGRhdGEsIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0LCBwYWQsIDApOwotCi0gICAgaWYgKCF4aW1hZ2UpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBYQ3JlYXRlSW1hZ2UoKSBmYWlsZWRcbiIpOwotICAgICAgICBmcmVlKHhkYXRhKTsKLSAgICAgICAgcmV0dXJuIDM7Ci0gICAgfQotCi0gICAgLyogdG8gYXZvaWQgdGVzdGluZyB0aGUgYnl0ZSBvcmRlciBldmVyeSBwaXhlbCAob3IgZG91YmxpbmcgdGhlIHNpemUgb2YKLSAgICAgKiB0aGUgZHJhd2luZyByb3V0aW5lIHdpdGggYSBnaWFudCBpZi10ZXN0KSwgd2UgYXJiaXRyYXJpbHkgc2V0IHRoZSBieXRlCi0gICAgICogb3JkZXIgdG8gTVNCRmlyc3QgYW5kIGxldCBYbGliIHdvcnJ5IGFib3V0IGludmVydGluZyB0aGluZ3Mgb24gbGl0dGxlLQotICAgICAqIGVuZGlhbiBtYWNoaW5lcyAoZS5nLiwgTGludXgveDg2LCBvbGQgVkFYZW4sIGV0Yy4pLS10aGlzIGlzIG5vdCB0aGUKLSAgICAgKiBtb3N0IGVmZmljaWVudCBhcHByb2FjaCAodGhlIGdpYW50IGlmLXRlc3Qgd291bGQgYmUgYmV0dGVyKSwgYnV0IGluCi0gICAgICogdGhlIGludGVyZXN0IG9mIGNsYXJpdHksIHdlJ2xsIHRha2UgdGhlIGVhc3kgd2F5IG91dC4uLiAqLwotCi0gICAgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgRmlsbCB3aW5kb3cgd2l0aCB0aGUgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IgKGRlZmF1bHQgaXMgYmxhY2spIG9yCi0gICAgZmFrZWQgImJhY2tncm91bmQgaW1hZ2UiIChidXQgbGF0dGVyIGlzIGRpc2FibGVkIGlmIDgtYml0OyBncmFkaWVudHMKLSAgICBqdXN0IHdhc3RlIHBhbGV0dGUgZW50cmllcykuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBpZiAoYmdfaW1hZ2UpCi0gICAgICAgIHJwbmcyX3hfbG9hZF9iZ19pbWFnZSgpOyAgICAvKiByZXNldHMgYmdfaW1hZ2UgaWYgZmFpbHMgKi8KLQotICAgIGlmICghYmdfaW1hZ2UpIHsKLSAgICAgICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7Ci0gICAgICAgICAgICBiZ19waXhlbCA9IChiZ19yZWQgICA8PCBSU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKGJnX2dyZWVuIDw8IEdTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAoYmdfYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewotICAgICAgICAgICAgYmdfcGl4ZWwgPSAoKChiZ19yZWQgICA8PCA4KSA+PiBSU2hpZnQpICYgUk1hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKCgoYmdfZ3JlZW4gPDwgOCkgPj4gR1NoaWZ0KSAmIEdNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICgoKGJnX2JsdWUgIDw8IDgpID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKLQotICAgICAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KLQotICAgICAgICB9Ci0gICAgICAgIFhTZXRGb3JlZ3JvdW5kKGRpc3BsYXksIGdjLCBiZ19waXhlbCk7Ci0gICAgICAgIFhGaWxsUmVjdGFuZ2xlKGRpc3BsYXksIHdpbmRvdywgZ2MsIDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsCi0gICAgICAgICAgcnBuZzJfaW5mby5oZWlnaHQpOwotICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBXYWl0IGZvciBmaXJzdCBFeHBvc2UgZXZlbnQgdG8gZG8gYW55IGRyYXdpbmcsIHRoZW4gZmx1c2ggYW5kIHJldHVybi4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGRvCi0gICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwotICAgIHdoaWxlIChlLnR5cGUgIT0gRXhwb3NlIHx8IGUueGV4cG9zZS5jb3VudCk7Ci0KLSAgICBYRmx1c2goZGlzcGxheSk7Ci0KLSAgICByZXR1cm4gMDsKLQotfSAvKiBlbmQgZnVuY3Rpb24gcnBuZzJfeF9jcmVhdGVfd2luZG93KCkgKi8KLQotCi0KLQotCi1zdGF0aWMgaW50IHJwbmcyX3hfbG9hZF9iZ19pbWFnZSh2b2lkKQotewotICAgIHVjaCAqc3JjOwotICAgIGNoYXIgKmRlc3Q7Ci0gICAgdWNoIHIxLCByMiwgZzEsIGcyLCBiMSwgYjI7Ci0gICAgdWNoIHIxX2ludiwgcjJfaW52LCBnMV9pbnYsIGcyX2ludiwgYjFfaW52LCBiMl9pbnY7Ci0gICAgaW50IGssIGhtYXgsIG1heDsKLSAgICBpbnQgeGlkeCwgeWlkeCwgeWlkeF9tYXg7Ci0gICAgaW50IGV2ZW5fb2RkX3ZlcnQsIGV2ZW5fb2RkX2hvcml6LCBldmVuX29kZDsKLSAgICBpbnQgaW52ZXJ0X2dyYWRpZW50MiA9IChiZ1twYXRdLnR5cGUgJiAweDA4KTsKLSAgICBpbnQgaW52ZXJ0X2NvbHVtbjsKLSAgICBpbnQgeGltYWdlX3Jvd2J5dGVzID0geGltYWdlLT5ieXRlc19wZXJfbGluZTsKLSAgICB1bGcgaSwgcm93OwotICAgIHVsZyBwaXhlbDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBBbGxvY2F0ZSBidWZmZXIgZm9yIGZha2UgYmFja2dyb3VuZCBpbWFnZSB0byBiZSB1c2VkIHdpdGggdHJhbnNwYXJlbnQKLSAgICBpbWFnZXM7IGlmIHRoaXMgZmFpbHMsIHJldmVydCB0byBwbGFpbiBiYWNrZ3JvdW5kIGNvbG9yLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgYmdfcm93Ynl0ZXMgPSAzICogcnBuZzJfaW5mby53aWR0aDsKLSAgICBiZ19kYXRhID0gKHVjaCAqKW1hbGxvYyhiZ19yb3dieXRlcyAqIHJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICBpZiAoIWJnX2RhdGEpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJhY2tncm91bmQgaW1hZ2VcbiIpOwotICAgICAgICBiZ19pbWFnZSA9IDA7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGJnc2NhbGUgPSAocGF0ID09IDApPyA4IDogYmdzY2FsZV9kZWZhdWx0OwotICAgIHlpZHhfbWF4ID0gYmdzY2FsZSAtIDE7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgVmVydGljYWwgZ3JhZGllbnRzIChyYW1wcykgaW4gTnhOIHNxdWFyZXMsIGFsdGVybmF0aW5nIGRpcmVjdGlvbiBhbmQKLSAgICBjb2xvcnMgKE4gPT0gYmdzY2FsZSkuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDApIHsKLSAgICAgICAgdWNoIHIxX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IxX21pbl0ucjsKLSAgICAgICAgdWNoIGcxX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IxX21pbl0uZzsKLSAgICAgICAgdWNoIGIxX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IxX21pbl0uYjsKLSAgICAgICAgdWNoIHIyX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IyX21pbl0ucjsKLSAgICAgICAgdWNoIGcyX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IyX21pbl0uZzsKLSAgICAgICAgdWNoIGIyX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IyX21pbl0uYjsKLSAgICAgICAgaW50IHIxX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uciAtIHIxX21pbjsKLSAgICAgICAgaW50IGcxX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZyAtIGcxX21pbjsKLSAgICAgICAgaW50IGIxX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uYiAtIGIxX21pbjsKLSAgICAgICAgaW50IHIyX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uciAtIHIyX21pbjsKLSAgICAgICAgaW50IGcyX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZyAtIGcyX21pbjsKLSAgICAgICAgaW50IGIyX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uYiAtIGIyX21pbjsKLQotICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7Ci0gICAgICAgICAgICB5aWR4ID0gKGludCkocm93ICUgYmdzY2FsZSk7Ci0gICAgICAgICAgICBldmVuX29kZF92ZXJ0ID0gKGludCkoKHJvdyAvIGJnc2NhbGUpICYgMSk7Ci0KLSAgICAgICAgICAgIHIxID0gcjFfbWluICsgKHIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzEgPSBnMV9taW4gKyAoZzFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMSA9IGIxX21pbiArIChiMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIHIxX2ludiA9IHIxX21pbiArIChyMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzFfaW52ID0gZzFfbWluICsgKGcxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMV9pbnYgPSBiMV9taW4gKyAoYjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLQotICAgICAgICAgICAgcjIgPSByMl9taW4gKyAocjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBnMiA9IGcyX21pbiArIChnMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGIyID0gYjJfbWluICsgKGIyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgcjJfaW52ID0gcjJfbWluICsgKHIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBnMl9pbnYgPSBnMl9taW4gKyAoZzJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGIyX2ludiA9IGIyX21pbiArIChiMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotCi0gICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7Ci0gICAgICAgICAgICAgICAgZXZlbl9vZGRfaG9yaXogPSAoaW50KSgoaSAvIGJnc2NhbGUpICYgMSk7Ci0gICAgICAgICAgICAgICAgZXZlbl9vZGQgPSBldmVuX29kZF92ZXJ0IF4gZXZlbl9vZGRfaG9yaXo7Ci0gICAgICAgICAgICAgICAgaW52ZXJ0X2NvbHVtbiA9Ci0gICAgICAgICAgICAgICAgICAoZXZlbl9vZGRfaG9yaXogJiYgKGJnW3BhdF0udHlwZSAmIDB4MTApKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbl9vZGQgPT0gMCkgeyAgICAgICAgLyogZ3JhZGllbnQgIzEgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGludmVydF9jb2x1bW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMV9pbnY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzFfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIxX2ludjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBncmFkaWVudCAjMiAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKGludmVydF9jb2x1bW4gJiYgaW52ZXJ0X2dyYWRpZW50MikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICghaW52ZXJ0X2NvbHVtbiAmJiAhaW52ZXJ0X2dyYWRpZW50MikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMjsgICAgICAgLyogbm90IGludmVydGVkIG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzI7ICAgICAgIC8qICBkb3VibHkgaW52ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMl9pbnY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzJfaW52OyAgIC8qIHNpbmdseSBpbnZlcnRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIyX2ludjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFNvZnQgZ3JhZGllbnQtZGlhbW9uZHMgd2l0aCBzY2FsZSA9IGJnc2NhbGUuICBDb2RlIGNvbnRyaWJ1dGVkIGJ5IEFkYW0KLSAgICBNLiBDb3N0ZWxsby4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIH0gZWxzZSBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDEpIHsKLQotICAgICAgICBobWF4ID0gKGJnc2NhbGUtMSkvMjsgICAvKiBoYWxmIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KLSAgICAgICAgbWF4ID0gMipobWF4OyAgICAgICAgICAgLyogdGhlIG1heCB3ZWlnaHQgb2YgYSBjb2xvciAqLwotCi0gICAgICAgIHIxID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnI7Ci0gICAgICAgIGcxID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmc7Ci0gICAgICAgIGIxID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmI7Ci0gICAgICAgIHIyID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnI7Ci0gICAgICAgIGcyID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmc7Ci0gICAgICAgIGIyID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmI7Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgeWlkeCA9IChpbnQpKHJvdyAlIGJnc2NhbGUpOwotICAgICAgICAgICAgaWYgKHlpZHggPiBobWF4KQotICAgICAgICAgICAgICAgIHlpZHggPSBiZ3NjYWxlLTEgLSB5aWR4OwotICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewotICAgICAgICAgICAgICAgIHhpZHggPSAoaW50KShpICUgYmdzY2FsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHhpZHggPiBobWF4KQotICAgICAgICAgICAgICAgICAgICB4aWR4ID0gYmdzY2FsZS0xIC0geGlkeDsKLSAgICAgICAgICAgICAgICBrID0geGlkeCArIHlpZHg7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKnIxICsgKG1heC1rKSpyMikgLyBtYXg7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmcxICsgKG1heC1rKSpnMikgLyBtYXg7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmIxICsgKG1heC1rKSpiMikgLyBtYXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBSYWRpYWwgInN0YXJidXJzdCIgd2l0aCBhemltdXRoYWwgc2ludXNvaWRzOyBbZXZlbnR1YWxseSBudW1iZXIgb2Ygc2ludS0KLSAgICBzb2lkcyB3aWxsIGVxdWFsIGJnc2NhbGU/XS4gIFRoaXMgb25lIGlzIHNsb3cgYnV0IHZlcnkgY29vbC4gIENvZGUgY29uLQotICAgIHRyaWJ1dGVkIGJ5IFBpZXRlciBTLiB2YW4gZGVyIE1ldWxlbiAob3JpZ2luYWxseSBpbiBTbWFsbHRhbGspLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMikgewotICAgICAgICB1Y2ggY2g7Ci0gICAgICAgIGludCBpaSwgeCwgeSwgaHcsIGhoLCBncmF5c3BvdDsKLSAgICAgICAgZG91YmxlIGZyZXEsIHJvdGF0ZSwgc2F0dXJhdGUsIGdyYXksIGludGVuc2l0eTsKLSAgICAgICAgZG91YmxlIGFuZ2xlPTAuMCwgYW9mZnNldD0wLjAsIG1heERpc3QsIGRpc3Q7Ci0gICAgICAgIGRvdWJsZSByZWQ9MC4wLCBncmVlbj0wLjAsIGJsdWU9MC4wLCBodWUsIHMsIHYsIGYsIHAsIHEsIHQ7Ci0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogIGNvbXB1dGluZyByYWRpYWwgYmFja2dyb3VuZC4uLiIsCi0gICAgICAgICAgUFJPR05BTUUpOwotICAgICAgICBmZmx1c2goc3RkZXJyKTsKLQotICAgICAgICBoaCA9IChpbnQpKHJwbmcyX2luZm8uaGVpZ2h0IC8gMik7Ci0gICAgICAgIGh3ID0gKGludCkocnBuZzJfaW5mby53aWR0aCAvIDIpOwotCi0gICAgICAgIC8qIHZhcmlhYmxlcyBmb3IgcmFkaWFsIHdhdmVzOgotICAgICAgICAgKiAgIGFvZmZzZXQ6ICBudW1iZXIgb2YgZGVncmVlcyB0byByb3RhdGUgaHVlIFtDVVJSRU5UTFkgTk9UIFVTRURdCi0gICAgICAgICAqICAgZnJlcTogIG51bWJlciBvZiBjb2xvciBiZWFtcyBvcmlnaW5hdGluZyBmcm9tIHRoZSBjZW50ZXIKLSAgICAgICAgICogICBncmF5c3BvdDogIHNpemUgb2YgdGhlIGdyYXlpbmcgY2VudGVyIGFyZWEgKGFudGktYWxpYXMpCi0gICAgICAgICAqICAgcm90YXRlOiAgcm90YXRpb24gb2YgdGhlIGJlYW1zIGFzIGEgZnVuY3Rpb24gb2YgcmFkaXVzCi0gICAgICAgICAqICAgc2F0dXJhdGU6ICBzYXR1cmF0aW9uIG9mIGJlYW1zJyBzaGFwZSBhemltdXRoYWxseQotICAgICAgICAgKi8KLSAgICAgICAgYW5nbGUgPSBDTElQKGFuZ2xlLCAwLjAsIDM2MC4wKTsKLSAgICAgICAgZ3JheXNwb3QgPSBDTElQKGJnW3BhdF0uYmdfZ3JheSwgMSwgKGhoICsgaHcpKTsKLSAgICAgICAgZnJlcSA9IE1BWCgoZG91YmxlKWJnW3BhdF0uYmdfZnJlcSwgMC4wKTsKLSAgICAgICAgc2F0dXJhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnNhdCAqIDAuMTsKLSAgICAgICAgcm90YXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2Jyb3QgKiAwLjE7Ci0gICAgICAgIGdyYXkgPSAwLjA7Ci0gICAgICAgIGludGVuc2l0eSA9IDAuMDsKLSAgICAgICAgbWF4RGlzdCA9IChkb3VibGUpKChodypodykgKyAoaGgqaGgpKTsKLQotICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7Ci0gICAgICAgICAgICB5ID0gKGludCkocm93IC0gaGgpOwotICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewotICAgICAgICAgICAgICAgIHggPSAoaW50KShpIC0gaHcpOwotICAgICAgICAgICAgICAgIGFuZ2xlID0gKHggPT0gMCk/IFBJXzIgOiBhdGFuKChkb3VibGUpeSAvIChkb3VibGUpeCk7Ci0gICAgICAgICAgICAgICAgZ3JheSA9IChkb3VibGUpTUFYKEFCUyh5KSwgQUJTKHgpKSAvIGdyYXlzcG90OwotICAgICAgICAgICAgICAgIGdyYXkgPSBNSU4oMS4wLCBncmF5KTsKLSAgICAgICAgICAgICAgICBkaXN0ID0gKGRvdWJsZSkoKHgqeCkgKyAoeSp5KSkgLyBtYXhEaXN0OwotICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IGNvcygoYW5nbGUrKHJvdGF0ZSpkaXN0KlBJKSkgKiBmcmVxKSAqCi0gICAgICAgICAgICAgICAgICBncmF5ICogc2F0dXJhdGU7Ci0gICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gKE1BWChNSU4oaW50ZW5zaXR5LDEuMCksLTEuMCkgKyAxLjApICogMC41OwotICAgICAgICAgICAgICAgIGh1ZSA9IChhbmdsZSArIFBJKSAqIElOVl9QSV8zNjAgKyBhb2Zmc2V0OwotICAgICAgICAgICAgICAgIHMgPSBncmF5ICogKChkb3VibGUpKEFCUyh4KStBQlMoeSkpIC8gKGRvdWJsZSkoaHcgKyBoaCkpOwotICAgICAgICAgICAgICAgIHMgPSBNSU4oTUFYKHMsMC4wKSwgMS4wKTsKLSAgICAgICAgICAgICAgICB2ID0gTUlOKE1BWChpbnRlbnNpdHksMC4wKSwgMS4wKTsKLQotICAgICAgICAgICAgICAgIGlmIChzID09IDAuMCkgewotICAgICAgICAgICAgICAgICAgICBjaCA9ICh1Y2gpKHYgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChodWUgPCAwLjApIHx8IChodWUgPj0gMzYwLjApKQotICAgICAgICAgICAgICAgICAgICAgICAgaHVlIC09ICgoKGludCkoaHVlIC8gMzYwLjApKSAqIDM2MC4wKTsKLSAgICAgICAgICAgICAgICAgICAgaHVlIC89IDYwLjA7Ci0gICAgICAgICAgICAgICAgICAgIGlpID0gKGludClodWU7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBodWUgLSAoZG91YmxlKWlpOwotICAgICAgICAgICAgICAgICAgICBwID0gKDEuMCAtIHMpICogdjsKLSAgICAgICAgICAgICAgICAgICAgcSA9ICgxLjAgLSAocyAqIGYpKSAqIHY7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSAoMS4wIC0gKHMgKiAoMS4wIC0gZikpKSAqIHY7Ci0gICAgICAgICAgICAgICAgICAgIGlmICAgICAgKGlpID09IDApIHsgcmVkID0gdjsgZ3JlZW4gPSB0OyBibHVlID0gcDsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAxKSB7IHJlZCA9IHE7IGdyZWVuID0gdjsgYmx1ZSA9IHA7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMikgeyByZWQgPSBwOyBncmVlbiA9IHY7IGJsdWUgPSB0OyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDMpIHsgcmVkID0gcDsgZ3JlZW4gPSBxOyBibHVlID0gdjsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA0KSB7IHJlZCA9IHQ7IGdyZWVuID0gcDsgYmx1ZSA9IHY7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNSkgeyByZWQgPSB2OyBncmVlbiA9IHA7IGJsdWUgPSBxOyB9Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShyZWQgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShncmVlbiAqIDI1NS4wKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGJsdWUgKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZG9uZS5cbiIpOwotICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQmxhc3QgYmFja2dyb3VuZCBpbWFnZSB0byBkaXNwbGF5IGJ1ZmZlciBiZWZvcmUgYmVnaW5uaW5nIFBORyBkZWNvZGUuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKLSAgICAgICAgdWxnIHJlZCwgZ3JlZW4sIGJsdWU7Ci0gICAgICAgIGludCBicHAgPSB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHNyYyA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsJLyogc2xpZ2h0bHkgb3B0aW1pemVkIHZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwotICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwotICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRz8gIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCi0gICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKLSAgICAgICAgdXNoIHJlZCwgZ3JlZW4sIGJsdWU7Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgc3JjID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCkoKnNyYykgPDwgOCk7ICArK3NyYzsKLSAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKSgqc3JjKSA8PCA4KTsgICsrc3JjOwotICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpKCpzcmMpIDw8IDgpOyAgKytzcmM7Ci0gICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKLSAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewotCi0gICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCi0KLSAgICB9Ci0KLSAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAwLCAwLCAwLCBycG5nMl9pbmZvLndpZHRoLAotICAgICAgcnBuZzJfaW5mby5oZWlnaHQpOwotCi0gICAgcmV0dXJuIDA7Ci0KLX0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3hfbG9hZF9iZ19pbWFnZSgpICovCi0KLQotCi0KLQotc3RhdGljIHZvaWQgcnBuZzJfeF9kaXNwbGF5X3Jvdyh1bGcgcm93KQotewotICAgIHVjaCBiZ19yZWQgICA9IHJwbmcyX2luZm8uYmdfcmVkOwotICAgIHVjaCBiZ19ncmVlbiA9IHJwbmcyX2luZm8uYmdfZ3JlZW47Ci0gICAgdWNoIGJnX2JsdWUgID0gcnBuZzJfaW5mby5iZ19ibHVlOwotICAgIHVjaCAqc3JjLCAqc3JjMj1OVUxMOwotICAgIGNoYXIgKmRlc3Q7Ci0gICAgdWNoIHIsIGcsIGIsIGE7Ci0gICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0gICAgdWxnIGksIHBpeGVsOwotICAgIHN0YXRpYyBpbnQgcm93cz0wLCBwcmV2cGFzcz0oLTEpOwotICAgIHN0YXRpYyB1bGcgZmlyc3Ryb3c7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcm93cyBhbmQgZmlyc3Ryb3cgc2ltcGx5IHRyYWNrIGhvdyBtYW55IHJvd3MgKGFuZCB3aGljaCBvbmVzKSBoYXZlIG5vdAotICAgIHlldCBiZWVuIGRpc3BsYXllZDsgYWx0ZXJuYXRpdmVseSwgd2UgY291bGQgY2FsbCBYUHV0SW1hZ2UoKSBmb3IgZXZlcnkKLSAgICByb3cgYW5kIG5vdCBib3RoZXIgd2l0aCB0aGUgcmVjb3Jkcy1rZWVwaW5nLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl94X2Rpc3BsYXlfcm93KClcbiIpKQotCi0gICAgaWYgKHJwbmcyX2luZm8ucGFzcyAhPSBwcmV2cGFzcykgewotICAgICAgICBpZiAocGF1c2VfYWZ0ZXJfcGFzcyAmJiBycG5nMl9pbmZvLnBhc3MgPiAwKSB7Ci0gICAgICAgICAgICBYRXZlbnQgZTsKLSAgICAgICAgICAgIEtleVN5bSBrOwotCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgIiVzOiAgZW5kIG9mIHBhc3MgJWQgb2YgNzsgY2xpY2sgaW4gaW1hZ2Ugd2luZG93IHRvIGNvbnRpbnVlXG4iLAotICAgICAgICAgICAgICBQUk9HTkFNRSwgcHJldnBhc3MgKyAxKTsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7Ci0gICAgICAgICAgICB3aGlsZSAoIVFVSVQoZSxrKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogIHBhc3MgJWQgb2YgN1xyIiwgUFJPR05BTUUsIHJwbmcyX2luZm8ucGFzcyArIDEpOwotICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgICAgcHJldnBhc3MgPSBycG5nMl9pbmZvLnBhc3M7Ci0gICAgfQotCi0gICAgaWYgKHJvd3MgPT0gMCkKLSAgICAgICAgZmlyc3Ryb3cgPSByb3c7ICAgLyogZmlyc3Qgcm93IHRoYXQgaXMgbm90IHlldCBkaXNwbGF5ZWQgKi8KLQotICAgICsrcm93czsgICAvKiBjb3VudCBvZiByb3dzIHJlY2VpdmVkIGJ1dCBub3QgeWV0IGRpc3BsYXllZCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEFzaWRlIGZyb20gdGhlIHVzZSBvZiB0aGUgcnBuZzJfaW5mbyBzdHJ1Y3QsIHRoZSBsYWNrIG9mIGFuIG91dGVyIGxvb3AKLSAgICAob3ZlciByb3dzKSBhbmQgbW92aW5nIHRoZSBYUHV0SW1hZ2UoKSBjYWxsIG91dHNpZGUgdGhlICJpZiAoZGVwdGgpIgotICAgIHRlc3RzLCB0aGlzIHJvdXRpbmUgaXMgaWRlbnRpY2FsIHRvIHJwbmdfeF9kaXNwbGF5X2ltYWdlKCkgaW4gdGhlIG5vbi0KLSAgICBwcm9ncmVzc2l2ZSB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7Ci0gICAgICAgIHVsZyByZWQsIGdyZWVuLCBibHVlOwotICAgICAgICBpbnQgYnBwID0geGltYWdlLT5iaXRzX3Blcl9waXhlbDsKLQotICAgICAgICBzcmMgPSBycG5nMl9pbmZvLmltYWdlX2RhdGEgKyByb3cqcnBuZzJfaW5mby5yb3dieXRlczsKLSAgICAgICAgaWYgKGJnX2ltYWdlKQotICAgICAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwotICAgICAgICBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSAzKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwotICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRz8gIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCi0gICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBhID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgewotICAgICAgICAgICAgICAgICAgICBiZ19yZWQgICA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgIGJnX2dyZWVuID0gKnNyYzIrKzsKLSAgICAgICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSByOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGc7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZWQgICA9IGJnX3JlZDsKLSAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBiZ19ncmVlbjsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiZ19ibHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogZmlyc3QgYXJndW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHJlZCwgICByLCBhLCBiZ19yZWQpOwotICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZ3JlZW4sIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGJsdWUsICBiLCBhLCBiZ19ibHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc/ICB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwotICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7Ci0gICAgICAgIHVzaCByZWQsIGdyZWVuLCBibHVlOwotCi0gICAgICAgIHNyYyA9IHJwbmcyX2luZm8ucm93X3BvaW50ZXJzW3Jvd107Ci0gICAgICAgIGlmIChiZ19pbWFnZSkKLSAgICAgICAgICAgIHNyYzIgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewotICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCkoKnNyYykgPDwgOCk7Ci0gICAgICAgICAgICAgICAgKytzcmM7Ci0gICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCkoKnNyYykgPDwgOCk7Ci0gICAgICAgICAgICAgICAgKytzcmM7Ci0gICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7Ci0gICAgICAgICAgICAgICAgKytzcmM7Ci0gICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKLSAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIC8qIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDQpICovIHsKLSAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBiID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgaWYgKGJnX2ltYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJnX3JlZCAgID0gKnNyYzIrKzsKLSAgICAgICAgICAgICAgICAgICAgYmdfZ3JlZW4gPSAqc3JjMisrOwotICAgICAgICAgICAgICAgICAgICBiZ19ibHVlICA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKXIgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliIDw8IDgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpYmdfcmVkICAgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpYmdfZ3JlZW4gPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYmdfYmx1ZSAgPDwgOCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAotICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBiYWNrIGludG8KLSAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IGFyZ3VtZW50ICg9PSBmZyBieXRlIGhlcmU6ICBzYWZlKSAqLwotICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUociwgciwgYSwgYmdfcmVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGcsIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGIsIGIsIGEsIGJnX2JsdWUpOwotICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKXIgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliIDw8IDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOwotICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7Ci0KLSAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KLQotICAgIH0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIERpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgcm93cyBvciB3aGVuIG9uIG9uZSBvZiBsYXN0IHR3byByb3dzLiAgKFJlZ2lvbgotICAgIG1heSBpbmNsdWRlIHByZXZpb3VzbHkgZGlzcGxheWVkIGxpbmVzIGR1ZSB0byBpbnRlcmxhY2luZy0taS5lLiwgbm90Ci0gICAgY29udGlndW91cy4gIEFsc28sIHNlY29uZC10by1sYXN0IHJvdyBpcyBmaW5hbCBvbmUgaW4gaW50ZXJsYWNlZCBpbWFnZXMKLSAgICB3aXRoIG9kZCBudW1iZXIgb2Ygcm93cy4pICBGb3IgZGVtb3MsIGZsdXNoIChhbmQgZGVsYXkpIGFmdGVyIGV2ZXJ5IDE2dGgKLSAgICByb3cgc28gInNwYXJzZSIgcGFzc2VzIGRvbid0IGdvIHR3aWNlIGFzIGZhc3QuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBpZiAoZGVtb190aW1pbmcgJiYgKHJvdyAtIGZpcnN0cm93ID49IDE2IHx8IHJvdyA+PSBycG5nMl9pbmZvLmhlaWdodC0yKSkgewotICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWZpcnN0cm93LCAwLAotICAgICAgICAgIChpbnQpZmlyc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIHJvdyAtIGZpcnN0cm93ICsgMSk7Ci0gICAgICAgIFhGbHVzaChkaXNwbGF5KTsKLSAgICAgICAgcm93cyA9IDA7Ci0gICAgICAgIHVzbGVlcCh1c2xlZXBfZHVyYXRpb24pOwotICAgIH0gZWxzZQotICAgIGlmICghZGVtb190aW1pbmcgJiYgKChyb3dzICYgMHhmKSA9PSAwIHx8IHJvdyA+PSBycG5nMl9pbmZvLmhlaWdodC0yKSkgewotICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWZpcnN0cm93LCAwLAotICAgICAgICAgIChpbnQpZmlyc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIHJvdyAtIGZpcnN0cm93ICsgMSk7Ci0gICAgICAgIFhGbHVzaChkaXNwbGF5KTsKLSAgICAgICAgcm93cyA9IDA7Ci0gICAgfQotCi19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQgcnBuZzJfeF9maW5pc2hfZGlzcGxheSh2b2lkKQotewotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfeF9maW5pc2hfZGlzcGxheSgpXG4iKSkKLQotICAgIC8qIGxhc3Qgcm93IGhhcyBhbHJlYWR5IGJlZW4gZGlzcGxheWVkIGJ5IHJwbmcyX3hfZGlzcGxheV9yb3coKSwgc28gd2UKLSAgICAgKiBoYXZlIG5vdGhpbmcgdG8gZG8gaGVyZSBleGNlcHQgc2V0IGEgZmxhZyBhbmQgbGV0IHRoZSB1c2VyIGtub3cgdGhhdAotICAgICAqIHRoZSBpbWFnZSBpcyBkb25lICovCi0KLSAgICBycG5nMl9pbmZvLnN0YXRlID0ga0RvbmU7Ci0gICAgcHJpbnRmKAotICAgICAgIkRvbmUuICBQcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgKHdpdGhpbiBpbWFnZSB3aW5kb3cpIHRvIHF1aXQuXG4iKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLX0KLQotCi0KLQotCi1zdGF0aWMgdm9pZCBycG5nMl94X3JlZGlzcGxheV9pbWFnZSh1bGcgc3RhcnRjb2wsIHVsZyBzdGFydHJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsZyB3aWR0aCwgdWxnIGhlaWdodCkKLXsKLSAgICB1Y2ggYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKLSAgICB1Y2ggYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwotICAgIHVjaCBiZ19ibHVlICA9IHJwbmcyX2luZm8uYmdfYmx1ZTsKLSAgICB1Y2ggKnNyYywgKnNyYzI9TlVMTDsKLSAgICBjaGFyICpkZXN0OwotICAgIHVjaCByLCBnLCBiLCBhOwotICAgIHVsZyBpLCByb3csIGxhc3Ryb3cgPSAwOwotICAgIHVsZyBwaXhlbDsKLSAgICBpbnQgeGltYWdlX3Jvd2J5dGVzID0geGltYWdlLT5ieXRlc19wZXJfbGluZTsKLQotCi0gICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBkaXNwbGF5IGxvb3AgKGltYWdlX2NoYW5uZWxzID09ICVkKVxuIiwKLSAgICAgIHJwbmcyX2luZm8uY2hhbm5lbHMpKQotICAgIFRyYWNlKChzdGRlcnIsICIgICAod2lkdGggPSAlbGQsIHJvd2J5dGVzID0gJWQsIHhpbWFnZV9yb3dieXRlcyA9ICVkKVxuIiwKLSAgICAgIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8ucm93Ynl0ZXMsIHhpbWFnZV9yb3dieXRlcykpCi0gICAgVHJhY2UoKHN0ZGVyciwgIiAgIChicHAgPSAlZClcbiIsIHhpbWFnZS0+Yml0c19wZXJfcGl4ZWwpKQotICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnl0ZV9vcmRlciA9ICVzKVxuIiwgeGltYWdlLT5ieXRlX29yZGVyID09IE1TQkZpcnN0PwotICAgICAgIk1TQkZpcnN0IiA6ICh4aW1hZ2UtPmJ5dGVfb3JkZXIgPT0gTFNCRmlyc3Q/ICJMU0JGaXJzdCIgOiAidW5rbm93biIpKSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBBc2lkZSBmcm9tIHRoZSB1c2Ugb2YgdGhlIHJwbmcyX2luZm8gc3RydWN0IGFuZCBvZiBzcmMyIChmb3IgYmFja2dyb3VuZAotICAgIGltYWdlKSwgdGhpcyByb3V0aW5lIGlzIGlkZW50aWNhbCB0byBycG5nX3hfZGlzcGxheV9pbWFnZSgpIGluIHRoZSBub24tCi0gICAgcHJvZ3Jlc3NpdmUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbS0tZm9yIHRoZSBzaW1wbGUgcmVhc29uIHRoYXQgcmVkaXNwbGF5Ci0gICAgb2YgdGhlIGltYWdlIGFnYWluc3QgYSBuZXcgYmFja2dyb3VuZCBoYXBwZW5zIGFmdGVyIHRoZSBpbWFnZSBpcyBmdWxseQotICAgIGRlY29kZWQgYW5kIHRoZXJlZm9yZSBpcywgYnkgZGVmaW5pdGlvbiwgbm9uLXByb2dyZXNzaXZlLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7Ci0gICAgICAgIHVsZyByZWQsIGdyZWVuLCBibHVlOwotICAgICAgICBpbnQgYnBwID0geGltYWdlLT5iaXRzX3Blcl9waXhlbDsKLQotICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSBzdGFydHJvdzsgIHJvdyA8IHN0YXJ0cm93K2hlaWdodDsgICsrcm93KSB7Ci0gICAgICAgICAgICBzcmMgPSBycG5nMl9pbmZvLmltYWdlX2RhdGEgKyByb3cqcnBuZzJfaW5mby5yb3dieXRlczsKLSAgICAgICAgICAgIGlmIChiZ19pbWFnZSkKLSAgICAgICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwotICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOwotI2lmZGVmIE5PXzI0QklUX01BU0tTCi0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICByZWQgICA9IChSU2hpZnQgPCAwKT8gcmVkICAgPDwgKC1SU2hpZnQpIDogcmVkICAgPj4gUlNoaWZ0OwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9IChHU2hpZnQgPCAwKT8gZ3JlZW4gPDwgKC1HU2hpZnQpIDogZ3JlZW4gPj4gR1NoaWZ0OwotICAgICAgICAgICAgICAgICAgICBibHVlICA9IChCU2hpZnQgPCAwKT8gYmx1ZSAgPDwgKC1CU2hpZnQpIDogYmx1ZSAgPj4gQlNoaWZ0OwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgJiBSTWFzaykgfCAoZ3JlZW4gJiBHTWFzaykgfCAoYmx1ZSAmIEJNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQvUk1hc2svZXRjLiBoZXJlLCB0b28pICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDQpICovIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJnX2ltYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ19yZWQgICA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ19ibHVlICA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9IHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9IGI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9IGJnX3JlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gYmdfZ3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9IGJnX2JsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbnRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICogZmlyc3QgYXJndW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyZWQsICAgciwgYSwgYmdfcmVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShncmVlbiwgZywgYSwgYmdfZ3JlZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGJsdWUsICBiLCBhLCBiZ19ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIE5PXzI0QklUX01BU0tTCi0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICByZWQgICA9IChSU2hpZnQgPCAwKT8gcmVkICAgPDwgKC1SU2hpZnQpIDogcmVkICAgPj4gUlNoaWZ0OwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9IChHU2hpZnQgPCAwKT8gZ3JlZW4gPDwgKC1HU2hpZnQpIDogZ3JlZW4gPj4gR1NoaWZ0OwotICAgICAgICAgICAgICAgICAgICBibHVlICA9IChCU2hpZnQgPCAwKT8gYmx1ZSAgPDwgKC1CU2hpZnQpIDogYmx1ZSAgPj4gQlNoaWZ0OwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgJiBSTWFzaykgfCAoZ3JlZW4gJiBHTWFzaykgfCAoYmx1ZSAmIEJNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQvUk1hc2svZXRjLiBoZXJlLCB0b28pICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGRpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgbGluZXMgKi8KLSAgICAgICAgICAgIGlmICgoKHJvdysxKSAmIDB4ZikgPT0gMCkgewotICAgICAgICAgICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKLSAgICAgICAgICAgICAgICAgIChpbnQpbGFzdHJvdywgcnBuZzJfaW5mby53aWR0aCwgMTYpOwotICAgICAgICAgICAgICAgIFhGbHVzaChkaXNwbGF5KTsKLSAgICAgICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewotICAgICAgICB1c2ggcmVkLCBncmVlbiwgYmx1ZTsKLQotICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSBzdGFydHJvdzsgIHJvdyA8IHN0YXJ0cm93K2hlaWdodDsgICsrcm93KSB7Ci0gICAgICAgICAgICBzcmMgPSBycG5nMl9pbmZvLnJvd19wb2ludGVyc1tyb3ddOwotICAgICAgICAgICAgaWYgKGJnX2ltYWdlKQotICAgICAgICAgICAgICAgIHNyYzIgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICArK3NyYzsKLSAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCkoKnNyYykgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgKytzcmM7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8gewotICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBiID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJnX3JlZCAgID0gKnNyYzIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJnX2dyZWVuID0gKnNyYzIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpYmdfcmVkICAgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWJnX2dyZWVuIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliZ19ibHVlICA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGJhY2sgaW50bwotICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IGFyZ3VtZW50ICg9PSBmZyBieXRlIGhlcmU6ICBzYWZlKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHIsIHIsIGEsIGJnX3JlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZywgZywgYSwgYmdfZ3JlZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGIsIGIsIGEsIGJnX2JsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBkaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IGxpbmVzICovCi0gICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKLSAgICAgICAgICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCi0gICAgICAgICAgICAgICAgICAoaW50KWxhc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIDE2KTsKLSAgICAgICAgICAgICAgICBYRmx1c2goZGlzcGxheSk7Ci0gICAgICAgICAgICAgICAgbGFzdHJvdyA9IHJvdyArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKLQotICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwotCi0gICAgfQotCi0gICAgVHJhY2UoKHN0ZGVyciwgImNhbGxpbmcgZmluYWwgWFB1dEltYWdlKClcbiIpKQotICAgIGlmIChsYXN0cm93IDwgc3RhcnRyb3craGVpZ2h0KSB7Ci0gICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKLSAgICAgICAgICAoaW50KWxhc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0LWxhc3Ryb3cpOwotICAgICAgICBYRmx1c2goZGlzcGxheSk7Ci0gICAgfQotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X3JlZGlzcGxheV9pbWFnZSgpICovCi0KLQotCi0KLQotI2lmZGVmIEZFQVRVUkVfTE9PUAotCi1zdGF0aWMgdm9pZCBycG5nMl94X3JlbG9hZF9iZ19pbWFnZSh2b2lkKQotewotICAgIGNoYXIgKmRlc3Q7Ci0gICAgdWNoIHIxLCByMiwgZzEsIGcyLCBiMSwgYjI7Ci0gICAgdWNoIHIxX2ludiwgcjJfaW52LCBnMV9pbnYsIGcyX2ludiwgYjFfaW52LCBiMl9pbnY7Ci0gICAgaW50IGssIGhtYXgsIG1heDsKLSAgICBpbnQgeGlkeCwgeWlkeCwgeWlkeF9tYXg7Ci0gICAgaW50IGV2ZW5fb2RkX3ZlcnQsIGV2ZW5fb2RkX2hvcml6LCBldmVuX29kZDsKLSAgICBpbnQgaW52ZXJ0X2dyYWRpZW50MiA9IChiZ1twYXRdLnR5cGUgJiAweDA4KTsKLSAgICBpbnQgaW52ZXJ0X2NvbHVtbjsKLSAgICB1bGcgaSwgcm93OwotCi0KLSAgICBiZ3NjYWxlID0gKHBhdCA9PSAwKT8gOCA6IGJnc2NhbGVfZGVmYXVsdDsKLSAgICB5aWR4X21heCA9IGJnc2NhbGUgLSAxOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFZlcnRpY2FsIGdyYWRpZW50cyAocmFtcHMpIGluIE54TiBzcXVhcmVzLCBhbHRlcm5hdGluZyBkaXJlY3Rpb24gYW5kCi0gICAgY29sb3JzIChOID09IGJnc2NhbGUpLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAwKSB7Ci0gICAgICAgIHVjaCByMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLnI7Ci0gICAgICAgIHVjaCBnMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmc7Ci0gICAgICAgIHVjaCBiMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmI7Ci0gICAgICAgIHVjaCByMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLnI7Ci0gICAgICAgIHVjaCBnMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmc7Ci0gICAgICAgIHVjaCBiMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmI7Ci0gICAgICAgIGludCByMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnIgLSByMV9taW47Ci0gICAgICAgIGludCBnMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmcgLSBnMV9taW47Ci0gICAgICAgIGludCBiMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmIgLSBiMV9taW47Ci0gICAgICAgIGludCByMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnIgLSByMl9taW47Ci0gICAgICAgIGludCBnMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmcgLSBnMl9taW47Ci0gICAgICAgIGludCBiMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmIgLSBiMl9taW47Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgeWlkeCA9IChpbnQpKHJvdyAlIGJnc2NhbGUpOwotICAgICAgICAgICAgZXZlbl9vZGRfdmVydCA9IChpbnQpKChyb3cgLyBiZ3NjYWxlKSAmIDEpOwotCi0gICAgICAgICAgICByMSA9IHIxX21pbiArIChyMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcxID0gZzFfbWluICsgKGcxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjEgPSBiMV9taW4gKyAoYjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICByMV9pbnYgPSByMV9taW4gKyAocjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcxX2ludiA9IGcxX21pbiArIChnMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjFfaW52ID0gYjFfbWluICsgKGIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0KLSAgICAgICAgICAgIHIyID0gcjJfbWluICsgKHIyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzIgPSBnMl9taW4gKyAoZzJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMiA9IGIyX21pbiArIChiMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIHIyX2ludiA9IHIyX21pbiArIChyMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzJfaW52ID0gZzJfbWluICsgKGcyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMl9pbnYgPSBiMl9taW4gKyAoYjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLQotICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewotICAgICAgICAgICAgICAgIGV2ZW5fb2RkX2hvcml6ID0gKGludCkoKGkgLyBiZ3NjYWxlKSAmIDEpOwotICAgICAgICAgICAgICAgIGV2ZW5fb2RkID0gZXZlbl9vZGRfdmVydCBeIGV2ZW5fb2RkX2hvcml6OwotICAgICAgICAgICAgICAgIGludmVydF9jb2x1bW4gPQotICAgICAgICAgICAgICAgICAgKGV2ZW5fb2RkX2hvcml6ICYmIChiZ1twYXRdLnR5cGUgJiAweDEwKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW5fb2RkID09IDApIHsgICAgICAgIC8qIGdyYWRpZW50ICMxICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnRfY29sdW1uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjFfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxX2ludjsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMV9pbnY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogZ3JhZGllbnQgIzIgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChpbnZlcnRfY29sdW1uICYmIGludmVydF9ncmFkaWVudDIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIWludmVydF9jb2x1bW4gJiYgIWludmVydF9ncmFkaWVudDIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjI7ICAgICAgIC8qIG5vdCBpbnZlcnRlZCBvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyOyAgICAgICAvKiAgZG91Ymx5IGludmVydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjJfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyX2ludjsgICAvKiBzaW5nbHkgaW52ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMl9pbnY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBTb2Z0IGdyYWRpZW50LWRpYW1vbmRzIHdpdGggc2NhbGUgPSBiZ3NjYWxlLiAgQ29kZSBjb250cmlidXRlZCBieSBBZGFtCi0gICAgTS4gQ29zdGVsbG8uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAxKSB7Ci0KLSAgICAgICAgaG1heCA9IChiZ3NjYWxlLTEpLzI7ICAgLyogaGFsZiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCi0gICAgICAgIG1heCA9IDIqaG1heDsgICAgICAgICAgIC8qIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KLQotICAgICAgICByMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yOwotICAgICAgICBnMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nOwotICAgICAgICBiMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iOwotICAgICAgICByMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yOwotICAgICAgICBnMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nOwotICAgICAgICBiMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKLSAgICAgICAgICAgIGlmICh5aWR4ID4gaG1heCkKLSAgICAgICAgICAgICAgICB5aWR4ID0gYmdzY2FsZS0xIC0geWlkeDsKLSAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKLSAgICAgICAgICAgICAgICB4aWR4ID0gKGludCkoaSAlIGJnc2NhbGUpOwotICAgICAgICAgICAgICAgIGlmICh4aWR4ID4gaG1heCkKLSAgICAgICAgICAgICAgICAgICAgeGlkeCA9IGJnc2NhbGUtMSAtIHhpZHg7Ci0gICAgICAgICAgICAgICAgayA9IHhpZHggKyB5aWR4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypyMSArIChtYXgtaykqcjIpIC8gbWF4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypnMSArIChtYXgtaykqZzIpIC8gbWF4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypiMSArIChtYXgtaykqYjIpIC8gbWF4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUmFkaWFsICJzdGFyYnVyc3QiIHdpdGggYXppbXV0aGFsIHNpbnVzb2lkczsgW2V2ZW50dWFsbHkgbnVtYmVyIG9mIHNpbnUtCi0gICAgc29pZHMgd2lsbCBlcXVhbCBiZ3NjYWxlP10uICBUaGlzIG9uZSBpcyBzbG93IGJ1dCB2ZXJ5IGNvb2wuICBDb2RlIGNvbi0KLSAgICB0cmlidXRlZCBieSBQaWV0ZXIgUy4gdmFuIGRlciBNZXVsZW4gKG9yaWdpbmFsbHkgaW4gU21hbGx0YWxrKS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIH0gZWxzZSBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDIpIHsKLSAgICAgICAgdWNoIGNoOwotICAgICAgICBpbnQgaWksIHgsIHksIGh3LCBoaCwgZ3JheXNwb3Q7Ci0gICAgICAgIGRvdWJsZSBmcmVxLCByb3RhdGUsIHNhdHVyYXRlLCBncmF5LCBpbnRlbnNpdHk7Ci0gICAgICAgIGRvdWJsZSBhbmdsZT0wLjAsIGFvZmZzZXQ9MC4wLCBtYXhEaXN0LCBkaXN0OwotICAgICAgICBkb3VibGUgcmVkPTAuMCwgZ3JlZW49MC4wLCBibHVlPTAuMCwgaHVlLCBzLCB2LCBmLCBwLCBxLCB0OwotCi0gICAgICAgIGhoID0gKGludCkocnBuZzJfaW5mby5oZWlnaHQgLyAyKTsKLSAgICAgICAgaHcgPSAoaW50KShycG5nMl9pbmZvLndpZHRoIC8gMik7Ci0KLSAgICAgICAgLyogdmFyaWFibGVzIGZvciByYWRpYWwgd2F2ZXM6Ci0gICAgICAgICAqICAgYW9mZnNldDogIG51bWJlciBvZiBkZWdyZWVzIHRvIHJvdGF0ZSBodWUgW0NVUlJFTlRMWSBOT1QgVVNFRF0KLSAgICAgICAgICogICBmcmVxOiAgbnVtYmVyIG9mIGNvbG9yIGJlYW1zIG9yaWdpbmF0aW5nIGZyb20gdGhlIGNlbnRlcgotICAgICAgICAgKiAgIGdyYXlzcG90OiAgc2l6ZSBvZiB0aGUgZ3JheWluZyBjZW50ZXIgYXJlYSAoYW50aS1hbGlhcykKLSAgICAgICAgICogICByb3RhdGU6ICByb3RhdGlvbiBvZiB0aGUgYmVhbXMgYXMgYSBmdW5jdGlvbiBvZiByYWRpdXMKLSAgICAgICAgICogICBzYXR1cmF0ZTogIHNhdHVyYXRpb24gb2YgYmVhbXMnIHNoYXBlIGF6aW11dGhhbGx5Ci0gICAgICAgICAqLwotICAgICAgICBhbmdsZSA9IENMSVAoYW5nbGUsIDAuMCwgMzYwLjApOwotICAgICAgICBncmF5c3BvdCA9IENMSVAoYmdbcGF0XS5iZ19ncmF5LCAxLCAoaGggKyBodykpOwotICAgICAgICBmcmVxID0gTUFYKChkb3VibGUpYmdbcGF0XS5iZ19mcmVxLCAwLjApOwotICAgICAgICBzYXR1cmF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19ic2F0ICogMC4xOwotICAgICAgICByb3RhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnJvdCAqIDAuMTsKLSAgICAgICAgZ3JheSA9IDAuMDsKLSAgICAgICAgaW50ZW5zaXR5ID0gMC4wOwotICAgICAgICBtYXhEaXN0ID0gKGRvdWJsZSkoKGh3Kmh3KSArIChoaCpoaCkpOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHkgPSAoaW50KShyb3cgLSBoaCk7Ci0gICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7Ci0gICAgICAgICAgICAgICAgeCA9IChpbnQpKGkgLSBodyk7Ci0gICAgICAgICAgICAgICAgYW5nbGUgPSAoeCA9PSAwKT8gUElfMiA6IGF0YW4oKGRvdWJsZSl5IC8gKGRvdWJsZSl4KTsKLSAgICAgICAgICAgICAgICBncmF5ID0gKGRvdWJsZSlNQVgoQUJTKHkpLCBBQlMoeCkpIC8gZ3JheXNwb3Q7Ci0gICAgICAgICAgICAgICAgZ3JheSA9IE1JTigxLjAsIGdyYXkpOwotICAgICAgICAgICAgICAgIGRpc3QgPSAoZG91YmxlKSgoeCp4KSArICh5KnkpKSAvIG1heERpc3Q7Ci0gICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gY29zKChhbmdsZSsocm90YXRlKmRpc3QqUEkpKSAqIGZyZXEpICoKLSAgICAgICAgICAgICAgICAgIGdyYXkgKiBzYXR1cmF0ZTsKLSAgICAgICAgICAgICAgICBpbnRlbnNpdHkgPSAoTUFYKE1JTihpbnRlbnNpdHksMS4wKSwtMS4wKSArIDEuMCkgKiAwLjU7Ci0gICAgICAgICAgICAgICAgaHVlID0gKGFuZ2xlICsgUEkpICogSU5WX1BJXzM2MCArIGFvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgcyA9IGdyYXkgKiAoKGRvdWJsZSkoQUJTKHgpK0FCUyh5KSkgLyAoZG91YmxlKShodyArIGhoKSk7Ci0gICAgICAgICAgICAgICAgcyA9IE1JTihNQVgocywwLjApLCAxLjApOwotICAgICAgICAgICAgICAgIHYgPSBNSU4oTUFYKGludGVuc2l0eSwwLjApLCAxLjApOwotCi0gICAgICAgICAgICAgICAgaWYgKHMgPT0gMC4wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoID0gKHVjaCkodiAqIDI1NS4wKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGh1ZSA8IDAuMCkgfHwgKGh1ZSA+PSAzNjAuMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBodWUgLT0gKCgoaW50KShodWUgLyAzNjAuMCkpICogMzYwLjApOwotICAgICAgICAgICAgICAgICAgICBodWUgLz0gNjAuMDsKLSAgICAgICAgICAgICAgICAgICAgaWkgPSAoaW50KWh1ZTsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGh1ZSAtIChkb3VibGUpaWk7Ci0gICAgICAgICAgICAgICAgICAgIHAgPSAoMS4wIC0gcykgKiB2OwotICAgICAgICAgICAgICAgICAgICBxID0gKDEuMCAtIChzICogZikpICogdjsKLSAgICAgICAgICAgICAgICAgICAgdCA9ICgxLjAgLSAocyAqICgxLjAgLSBmKSkpICogdjsKLSAgICAgICAgICAgICAgICAgICAgaWYgICAgICAoaWkgPT0gMCkgeyByZWQgPSB2OyBncmVlbiA9IHQ7IGJsdWUgPSBwOyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDEpIHsgcmVkID0gcTsgZ3JlZW4gPSB2OyBibHVlID0gcDsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAyKSB7IHJlZCA9IHA7IGdyZWVuID0gdjsgYmx1ZSA9IHQ7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMykgeyByZWQgPSBwOyBncmVlbiA9IHE7IGJsdWUgPSB2OyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDQpIHsgcmVkID0gdDsgZ3JlZW4gPSBwOyBibHVlID0gdjsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA1KSB7IHJlZCA9IHY7IGdyZWVuID0gcDsgYmx1ZSA9IHE7IH0KLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKHJlZCAqIDI1NS4wKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGdyZWVuICogMjU1LjApOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoYmx1ZSAqIDI1NS4wKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3hfcmVsb2FkX2JnX2ltYWdlKCkgKi8KLQotCi0KLQotCi1zdGF0aWMgaW50IGlzX251bWJlcihjaGFyICpwKQotewotICAgIHdoaWxlICgqcCkgewotICAgICAgICBpZiAoIWlzZGlnaXQoKnApKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICArK3A7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi0jZW5kaWYgLyogRkVBVFVSRV9MT09QICovCi0KLQotCi0KLQotc3RhdGljIHZvaWQgcnBuZzJfeF9jbGVhbnVwKHZvaWQpCi17Ci0gICAgaWYgKGJnX2ltYWdlICYmIGJnX2RhdGEpIHsKLSAgICAgICAgZnJlZShiZ19kYXRhKTsKLSAgICAgICAgYmdfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSkgewotICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7Ci0gICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKSB7Ci0gICAgICAgIGZyZWUocnBuZzJfaW5mby5yb3dfcG9pbnRlcnMpOwotICAgICAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHhpbWFnZSkgewotICAgICAgICBpZiAoeGltYWdlLT5kYXRhKSB7Ci0gICAgICAgICAgICBmcmVlKHhpbWFnZS0+ZGF0YSk7ICAgICAgICAgICAvKiB3ZSBhbGxvY2F0ZWQgaXQsIHNvIHdlIGZyZWUgaXQgKi8KLSAgICAgICAgICAgIHhpbWFnZS0+ZGF0YSA9IChjaGFyICopTlVMTDsgIC8qICBpbnN0ZWFkIG9mIFhEZXN0cm95SW1hZ2UoKSAqLwotICAgICAgICB9Ci0gICAgICAgIFhEZXN0cm95SW1hZ2UoeGltYWdlKTsKLSAgICAgICAgeGltYWdlID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoaGF2ZV9nYykKLSAgICAgICAgWEZyZWVHQyhkaXNwbGF5LCBnYyk7Ci0KLSAgICBpZiAoaGF2ZV93aW5kb3cpCi0gICAgICAgIFhEZXN0cm95V2luZG93KGRpc3BsYXksIHdpbmRvdyk7Ci0KLSAgICBpZiAoaGF2ZV9jb2xvcm1hcCkKLSAgICAgICAgWEZyZWVDb2xvcm1hcChkaXNwbGF5LCBjb2xvcm1hcCk7Ci0KLSAgICBpZiAoaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCkKLSAgICAgICAgWEZyZWUodmlzdWFsX2xpc3QpOwotfQotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZzJfeF9tc2IodWxnIHUzMnZhbCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDMxOyAgaSA+PSAwOyAgLS1pKSB7Ci0gICAgICAgIGlmICh1MzJ2YWwgJiAweDgwMDAwMDAwTCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB1MzJ2YWwgPDw9IDE7Ci0gICAgfQotICAgIHJldHVybiBpOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay90b3VjYW4ucG5nIGIvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay90b3VjYW4ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzk2MGQ0Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svdG91Y2FuLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3BuZy5jIGIvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay93cG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNmUzNTIuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay93cG5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NTMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgd3BuZyAtIHNpbXBsZSBQTkctd3JpdGluZyBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BuZy5jCi0KLSAgIFRoaXMgcHJvZ3JhbSBjb252ZXJ0cyBjZXJ0YWluIE5ldFBCTSBiaW5hcnkgZmlsZXMgKGdyYXlzY2FsZSBhbmQgUkdCLAotICAgbWF4dmFsID0gMjU1KSB0byBQTkcuICBOb24taW50ZXJsYWNlZCBQTkdzIGFyZSB3cml0dGVuIHByb2dyZXNzaXZlbHk7Ci0gICBpbnRlcmxhY2VkIFBOR3MgYXJlIHJlYWQgYW5kIHdyaXR0ZW4gaW4gb25lIG1lbW9yeS1pbnRlbnNpdmUgYmxhc3QuCi0KLSAgIFRoYW5rcyB0byBKZWFuLWxvdXAgR2FpbGx5IGZvciBwcm92aWRpbmcgdGhlIG5lY2Vzc2FyeSB0cmljayB0byByZWFkCi0gICBpbnRlcmFjdGl2ZSB0ZXh0IGZyb20gdGhlIGtleWJvYXJkIHdoaWxlIHN0ZGluIGlzIHJlZGlyZWN0ZWQuICBUaGFua3MKLSAgIHRvIENvc21pbiBUcnV0YSBmb3IgQ3lnd2luIGZpeGVzLgotCi0gICBOT1RFOiAgaW5jbHVkZXMgcHJvdmlzaW9uYWwgc3VwcG9ydCBmb3IgUE5NIHR5cGUgIjgiIChwb3J0YWJsZSBhbHBoYW1hcCkKLSAgICAgICAgICBpbWFnZXMsIHByZXN1bWVkIHRvIGJlIGEgMzItYml0IGludGVybGVhdmVkIFJHQkEgZm9ybWF0OyBubyBwcm8tCi0gICAgICAgICAgdmlzaW9uIGZvciBwb3NzaWJsZSBpbnRlcmxlYXZlZCBncmF5c2NhbGUrYWxwaGEgKDE2LWJpdCkgZm9ybWF0LgotICAgICAgICAgIFRISVMgSVMgVU5MSUtFTFkgVE8gQkVDT01FIEFOIE9GRklDSUFMIE5FVFBCTSBBTFBIQSBGT1JNQVQhCi0KLSAgIHRvIGRvOgotICAgIC0gZGVsZXRlIG91dHB1dCBmaWxlIGlmIHF1aXQgYmVmb3JlIGNhbGxpbmcgYW55IHdyaXRlcG5nIHJvdXRpbmVzCi0gICAgLSBwcm9jZXNzIGJhY2tzcGFjZSB3aXRoIC10ZXh0IG9wdGlvbiB1bmRlciBET1MvV2luPyAoY3VycmVudGx5IGdldCBeSCkKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgQ2hhbmdlbG9nOgotICAgIC0gMS4wMTogIGluaXRpYWwgcHVibGljIHJlbGVhc2UKLSAgICAtIDEuMDI6ICBtb2RpZmllZCB0byBhbGxvdyBhYmJyZXZpYXRlZCBvcHRpb25zCi0gICAgLSAxLjAzOiAgcmVtb3ZlZCBleHRyYW5lb3VzIGNoYXJhY3RlciBmcm9tIHVzYWdlIHNjcmVlbjsgZml4ZWQgYnVnIGluCi0gICAgICAgICAgICAgIGNvbW1hbmQtbGluZSBwYXJzaW5nCi0gICAgLSAxLjA0OiAgZml4ZWQgRE9TL09TMi9XaW4zMiBkZXRlY3Rpb24sIGluY2x1ZGluZyBwYXJ0aWFsIEN5Z3dpbiBmaXgKLSAgICAgICAgICAgICAgKHNlZSBodHRwOi8vaG9tZS5hdHQubmV0L35wZXJsc3BpbnIvZGlmZnMvR3JlZ0Jvb2tfY3lnd2luLmRpZmYpCi0gICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKLQotICAgICAgICBbUkVQT1JURUQgQlVHICh3aW4zMiBvbmx5KTogICJjb250cmliL2dyZWdib29rL3dwbmcuYyAtIGNtZCBsaW5lCi0gICAgICAgICBkb3NlIG5vdCB3b3JrISAgSW4gb3JkZXIgdG8gZG8gc29tZXRoaW5nIHVzZWZ1bCBJIG5lZWRlZCB0byByZWRpcmVjdAotICAgICAgICAgYm90aCBpbnB1dCBhbmQgb3V0cHV0LCB3aXRoIGN5Z3dpbiBhbmQgd2l0aCBiY2MzMiBhcyB3ZWxsLiAgVW5kZXIKLSAgICAgICAgIExpbnV4LCB0aGUgc2FtZSB3cG5nIGFwcGVhcnMgdG8gd29yayBmaW5lLiAgSSBkb24ndCBrbm93IHdoYXQgaXMKLSAgICAgICAgIHRoZSBwcm9ibGVtLiJdCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgUFJPR05BTUUgICJ3cG5nIgotI2RlZmluZSBWRVJTSU9OICAgIjIuMDAgb2YgMiBKdW5lIDIwMDciCi0jZGVmaW5lIEFQUE5BTUUgICAiU2ltcGxlIFBHTS9QUE0vUEFNIHRvIFBORyBDb252ZXJ0ZXIiCi0KLSNpZiBkZWZpbmVkKF9fTVNET1NfXykgfHwgZGVmaW5lZChfX09TMl9fKQotIyAgZGVmaW5lIERPU19PUzJfVzMyCi0jZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0jICBpZm5kZWYgX19HTlVDX18gICAvKiB0cmVhdCBXaW4zMiBuYXRpdmUgcG9ydHMgb2YgZ2NjIGFzIFVuaXggZW52aXJvbm1lbnRzICovCi0jICAgIGRlZmluZSBET1NfT1MyX1czMgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4gICAgIC8qIGZvciBqbXBidWYgZGVjbGFyYXRpb24gaW4gd3JpdGVwbmcuaCAqLwotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2lmZGVmIERPU19PUzJfVzMyCi0jICBpbmNsdWRlIDxpby5oPiAgICAgICAvKiBmb3IgaXNhdHR5KCksIHNldG1vZGUoKSBwcm90b3R5cGVzICovCi0jICBpbmNsdWRlIDxmY250bC5oPiAgICAvKiBPX0JJTkFSWSBmb3IgZmRvcGVuKCkgd2l0aG91dCB0ZXh0IHRyYW5zbGF0aW9uICovCi0jICBpZmRlZiBfX0VNWF9fCi0jICAgIGlmbmRlZiBnZXRjaAotIyAgICAgIGRlZmluZSBnZXRjaCgpIF9yZWFkX2tiZCgwLCAxLCAwKSAgICAvKiBuZWVkIGdldGNoZSgpICovCi0jICAgIGVuZGlmCi0jICBlbHNlIC8qICFfX0VNWF9fICovCi0jICAgIGlmZGVmIF9fR08zMl9fCi0jICAgICAgaW5jbHVkZSA8cGMuaD4KLSMgICAgICBkZWZpbmUgZ2V0Y2goKSBnZXRrZXkoKSAgLyogR1JSOiAgbmVlZCBnZXRjaGUoKSAqLwotIyAgICBlbHNlCi0jICAgICAgaW5jbHVkZSA8Y29uaW8uaD4gICAgICAgIC8qIGZvciBnZXRjaGUoKSBjb25zb2xlIGlucHV0ICovCi0jICAgIGVuZGlmCi0jICBlbmRpZiAvKiA/X19FTVhfXyAqLwotIyAgZGVmaW5lIEZHRVRTKGJ1ZixsZW4sc3RyZWFtKSAgZG9zX2tiZF9nZXRzKGJ1ZixsZW4pCi0jZWxzZQotIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgICAvKiBmb3IgaXNhdHR5KCkgcHJvdG90eXBlICovCi0jICBkZWZpbmUgRkdFVFMgZmdldHMKLSNlbmRpZgotCi0vKiAjZGVmaW5lIERFQlVHICA6ICB0aGlzIGVuYWJsZXMgdGhlIFRyYWNlKCkgbWFjcm9zICovCi0KLS8qICNkZWZpbmUgRk9SQklEX0xBVElOMV9DVFJMICA6ICB0aGlzIHJlcXVpcmVzIHRoZSB1c2VyIHRvIHJlLWVudGVyIGFueQotICAgdGV4dCB0aGF0IGluY2x1ZGVzIGNvbnRyb2wgY2hhcmFjdGVycyBkaXNjb3VyYWdlZCBieSB0aGUgUE5HIHNwZWM7IHRleHQKLSAgIHRoYXQgaW5jbHVkZXMgYW4gZXNjYXBlIGNoYXJhY3RlciAoMjcpIG11c3QgYmUgcmUtZW50ZXJlZCByZWdhcmRsZXNzICovCi0KLSNpbmNsdWRlICJ3cml0ZXBuZy5oIiAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCB3cml0ZXBuZyBwcm90b3R5cGVzICovCi0KLQotCi0vKiBsb2NhbCBwcm90b3R5cGVzICovCi0KLXN0YXRpYyBpbnQgIHdwbmdfaXN2YWxpZF9sYXRpbjEodWNoICpwLCBpbnQgbGVuKTsKLXN0YXRpYyB2b2lkIHdwbmdfY2xlYW51cCh2b2lkKTsKLQotI2lmZGVmIERPU19PUzJfVzMyCi0gICBzdGF0aWMgY2hhciAqZG9zX2tiZF9nZXRzKGNoYXIgKmJ1ZiwgaW50IGxlbik7Ci0jZW5kaWYKLQotCi0KLXN0YXRpYyBtYWlucHJvZ19pbmZvIHdwbmdfaW5mbzsgICAvKiBsb25lIGdsb2JhbCAqLwotCi0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotI2lmbmRlZiBET1NfT1MyX1czMgotICAgIEZJTEUgKmtleWJkOwotI2VuZGlmCi0jaWZkZWYgc2dpCi0gICAgRklMRSAqdG1wZmlsZTsgICAgICAvKiBvciB3ZSBjb3VsZCBqdXN0IHVzZSBrZXliZCwgc2luY2Ugbm8gb3ZlcmxhcCAqLwotICAgIGNoYXIgdG1wbGluZVs4MF07Ci0jZW5kaWYKLSAgICBjaGFyICppbm5hbWUgPSBOVUxMLCBvdXRuYW1lWzI1Nl07Ci0gICAgY2hhciAqcCwgcG5tY2hhciwgcG5tbGluZVsyNTZdOwotICAgIGNoYXIgKmJnc3RyLCAqdGV4dGJ1ZiA9IE5VTEw7Ci0gICAgdWxnIHJvd2J5dGVzOwotICAgIGludCByYywgbGVuID0gMDsKLSAgICBpbnQgZXJyb3IgPSAwOwotICAgIGludCB0ZXh0ID0gRkFMU0U7Ci0gICAgaW50IG1heHZhbDsKLSAgICBkb3VibGUgTFVUX2V4cG9uZW50OyAgICAgICAgICAgICAgICAvKiBqdXN0IHRoZSBsb29rdXAgdGFibGUgKi8KLSAgICBkb3VibGUgQ1JUX2V4cG9uZW50ID0gMi4yOyAgICAgICAgICAvKiBqdXN0IHRoZSBtb25pdG9yICovCi0gICAgZG91YmxlIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsgICAgLyogd2hvbGUgZGlzcGxheSBzeXN0ZW0gKi8KLSAgICBkb3VibGUgZGVmYXVsdF9nYW1tYSA9IDAuMDsKLQotCi0gICAgd3BuZ19pbmZvLmluZmlsZSA9IE5VTEw7Ci0gICAgd3BuZ19pbmZvLm91dGZpbGUgPSBOVUxMOwotICAgIHdwbmdfaW5mby5pbWFnZV9kYXRhID0gTlVMTDsKLSAgICB3cG5nX2luZm8ucm93X3BvaW50ZXJzID0gTlVMTDsKLSAgICB3cG5nX2luZm8uZmlsdGVyID0gRkFMU0U7Ci0gICAgd3BuZ19pbmZvLmludGVybGFjZWQgPSBGQUxTRTsKLSAgICB3cG5nX2luZm8uaGF2ZV9iZyA9IEZBTFNFOwotICAgIHdwbmdfaW5mby5oYXZlX3RpbWUgPSBGQUxTRTsKLSAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ID0gMDsKLSAgICB3cG5nX2luZm8uZ2FtbWEgPSAwLjA7Ci0KLQotICAgIC8qIEZpcnN0IGdldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLAotICAgICAqIHRoZSBwcm9kdWN0IG9mIHRoZSBDUlQgZXhwb25lbnQgYW5kIHRoZSBleHBvbmVudCBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogdGhlIGZyYW1lLWJ1ZmZlcidzIGxvb2t1cCB0YWJsZSAoTFVUKSwgaWYgYW55LiAgSWYgdGhlIFBOTSBpbWFnZQotICAgICAqIGxvb2tzIGNvcnJlY3Qgb24gdGhlIHVzZXIncyBkaXNwbGF5IHN5c3RlbSwgaXRzIGZpbGUgZ2FtbWEgaXMgdGhlCi0gICAgICogaW52ZXJzZSBvZiB0aGlzIHZhbHVlLiAgKE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QKLSAgICAgKiBvZiBMVVQgdmFsdWVzLS1lLmcuLCBPcGVuU3RlcCBoYXMgYSBsb3Qgb2Ygd2VpcmQgb25lcy0tYnV0IGl0IHNob3VsZAotICAgICAqIGNvdmVyIDk5JSBvZiB0aGUgY3VycmVudCBwb3NzaWJpbGl0aWVzLiAgVGhpcyBzZWN0aW9uIG11c3QgZW5zdXJlCi0gICAgICogdGhhdCBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQgaXMgcG9zaXRpdmUuKSAqLwotCi0jaWYgZGVmaW5lZChOZVhUKQotICAgIC8qIHRoaXJkLXBhcnR5IHV0aWxpdGllcyBjYW4gbW9kaWZ5IHRoZSBkZWZhdWx0IExVVCBleHBvbmVudCAqLwotICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDIuMjsKLSAgICAvKgotICAgIGlmIChzb21lX25leHRfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZuZXh0X2dhbW1hKSkKLSAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gbmV4dF9nYW1tYTsKLSAgICAgKi8KLSNlbGlmIGRlZmluZWQoc2dpKQotICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDEuNzsKLSAgICAvKiB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IGRvY3VtZW50ZWQgZnVuY3Rpb24gdG8KLSAgICAgKiBnZXQgdGhlICJnYW1tYSIgdmFsdWUsIHNvIHdlIGRvIGl0IHRoZSBoYXJkIHdheSAqLwotICAgIHRtcGZpbGUgPSBmb3BlbigiL2V0Yy9jb25maWcvc3lzdGVtLmdsR2FtbWFWYWwiLCAiciIpOwotICAgIGlmICh0bXBmaWxlKSB7Ci0gICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7Ci0KLSAgICAgICAgZmdldHModG1wbGluZSwgODAsIHRtcGZpbGUpOwotICAgICAgICBmY2xvc2UodG1wZmlsZSk7Ci0gICAgICAgIHNnaV9nYW1tYSA9IGF0b2YodG1wbGluZSk7Ci0gICAgICAgIGlmIChzZ2lfZ2FtbWEgPiAwLjApCi0gICAgICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBzZ2lfZ2FtbWE7Ci0gICAgfQotI2VsaWYgZGVmaW5lZChNYWNpbnRvc2gpCi0gICAgTFVUX2V4cG9uZW50ID0gMS44IC8gMi42MTsKLSAgICAvKgotICAgIGlmIChzb21lX21hY19mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm1hY19nYW1tYSkpCi0gICAgICAgIExVVF9leHBvbmVudCA9IG1hY19nYW1tYSAvIDIuNjE7Ci0gICAgICovCi0jZWxzZQotICAgIExVVF9leHBvbmVudCA9IDEuMDsgICAvKiBhc3N1bWUgbm8gTFVUOiAgbW9zdCBQQ3MgKi8KLSNlbmRpZgotCi0gICAgLyogdGhlIGRlZmF1bHRzIGFib3ZlIGdpdmUgMS4wLCAxLjMsIDEuNSBhbmQgMi4yLCByZXNwZWN0aXZlbHk6ICovCi0gICAgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50ID0gTFVUX2V4cG9uZW50ICogQ1JUX2V4cG9uZW50OwotCi0KLSAgICAvKiBJZiB0aGUgdXNlciBoYXMgc2V0IHRoZSBTQ1JFRU5fR0FNTUEgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgc3VnZ2VzdGVkCi0gICAgICogKHNvbWV3aGF0IGltcHJlY2lzZWx5KSBpbiB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24sIHVzZSB0aGF0OyBvdGhlcndpc2UKLSAgICAgKiB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgd2UganVzdCBjYWxjdWxhdGVkLiAgRWl0aGVyIHdheSwgdGhlIHVzZXIgbWF5Ci0gICAgICogb3ZlcnJpZGUgdGhpcyB2aWEgYSBjb21tYW5kLWxpbmUgb3B0aW9uLiAqLwotCi0gICAgaWYgKChwID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkgIT0gTlVMTCkgewotICAgICAgICBkb3VibGUgZXhwb25lbnQgPSBhdG9mKHApOwotCi0gICAgICAgIGlmIChleHBvbmVudCA+IDAuMCkKLSAgICAgICAgICAgIGRlZmF1bHRfZ2FtbWEgPSAxLjAgLyBleHBvbmVudDsKLSAgICB9Ci0KLSAgICBpZiAoZGVmYXVsdF9nYW1tYSA9PSAwLjApCi0gICAgICAgIGRlZmF1bHRfZ2FtbWEgPSAxLjAgLyBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7Ci0KLQotICAgIC8qIE5vdyBwYXJzZSB0aGUgY29tbWFuZCBsaW5lIGZvciBvcHRpb25zIGFuZCB0aGUgUE5NIGZpbGVuYW1lLiAqLwotCi0gICAgd2hpbGUgKCorK2FyZ3YgJiYgIWVycm9yKSB7Ci0gICAgICAgIGlmICghc3RybmNtcCgqYXJndiwgIi1pIiwgMikpIHsKLSAgICAgICAgICAgIHdwbmdfaW5mby5pbnRlcmxhY2VkID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi10aW1lIiwgMykpIHsKLSAgICAgICAgICAgIHdwbmdfaW5mby5tb2R0aW1lID0gdGltZShOVUxMKTsKLSAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RpbWUgPSBUUlVFOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLXRleHQiLCAzKSkgewotICAgICAgICAgICAgdGV4dCA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZ2FtbWEiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cG5nX2luZm8uZ2FtbWEgPSBhdG9mKCphcmd2KTsKLSAgICAgICAgICAgICAgICBpZiAod3BuZ19pbmZvLmdhbW1hIDw9IDAuMCkKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICh3cG5nX2luZm8uZ2FtbWEgPiAxLjAxKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiIHdhcm5pbmc6ICBmaWxlIGdhbW1hcyBhcmUgdXN1YWxseSBsZXNzIHRoYW4gMS4wXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ2NvbG9yIiwgNCkpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKLSAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGJnc3RyKSAhPSA3IHx8IGJnc3RyWzBdICE9ICcjJykKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgciwgZywgYjsgIC8qIHRoaXMgd2F5IHF1aWV0cyBjb21waWxlciB3YXJuaW5ncyAqLwotCi0gICAgICAgICAgICAgICAgICAgIHNzY2FuZihiZ3N0cisxLCAiJTJ4JTJ4JTJ4IiwgJnIsICZnLCAmYik7Ci0gICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5iZ19yZWQgICA9ICh1Y2gpcjsKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmJnX2dyZWVuID0gKHVjaClnOwotICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uYmdfYmx1ZSAgPSAodWNoKWI7Ci0gICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX2JnID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKiphcmd2ICE9ICctJykgewotICAgICAgICAgICAgICAgIGlubmFtZSA9ICphcmd2OwotICAgICAgICAgICAgICAgIGlmIChhcmd2WzFdKSAgIC8qIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBhcmdzIGFmdGVyIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICArK2Vycm9yOyAgIC8qIG5vdCBleHBlY3RpbmcgYW55IG90aGVyIG9wdGlvbnMgKi8KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyogb3BlbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcywgb3IgcmVnaXN0ZXIgYW4gZXJyb3IgYW5kIGFib3J0ICovCi0KLSAgICBpZiAoIWlubmFtZSkgewotICAgICAgICBpZiAoaXNhdHR5KDApKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgIjogIG11c3QgZ2l2ZSBpbnB1dCBmaWxlbmFtZSBvciBwcm92aWRlIGltYWdlIGRhdGEgdmlhIHN0ZGluXG4iKTsKLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0jaWZkZWYgRE9TX09TMl9XMzIKLSAgICAgICAgICAgIC8qIHNvbWUgYnVnZ3kgQyBsaWJyYXJpZXMgcmVxdWlyZSBCT1RIIHNldG1vZGUoKSBhbmQgZmRvcGVuKGJpbikgKi8KLSAgICAgICAgICAgIHNldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpOwotICAgICAgICAgICAgc2V0bW9kZShmaWxlbm8oc3Rkb3V0KSwgT19CSU5BUlkpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAoKHdwbmdfaW5mby5pbmZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZGluKSwgInJiIikpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICI6ICB1bmFibGUgdG8gcmVvcGVuIHN0ZGluIGluIGJpbmFyeSBtb2RlXG4iKTsKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAoKHdwbmdfaW5mby5vdXRmaWxlID0gZmRvcGVuKGZpbGVubyhzdGRvdXQpLCAid2IiKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgIjogIHVuYWJsZSB0byByZW9wZW4gc3Rkb3V0IGluIGJpbmFyeSBtb2RlXG4iKTsKLSAgICAgICAgICAgICAgICBmY2xvc2Uod3BuZ19pbmZvLmluZmlsZSk7Ci0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5maWx0ZXIgPSBUUlVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgobGVuID0gc3RybGVuKGlubmFtZSkpID4gMjUwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5wdXQgZmlsZW5hbWUgaXMgdG9vIGxvbmcgWyVkIGNoYXJzXVxuIiwKLSAgICAgICAgICBsZW4pOwotICAgICAgICArK2Vycm9yOwotICAgIH0gZWxzZSBpZiAoISh3cG5nX2luZm8uaW5maWxlID0gZm9wZW4oaW5uYW1lLCAicmIiKSkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIGlucHV0IGZpbGUgWyVzXVxuIiwgaW5uYW1lKTsKLSAgICAgICAgKytlcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoIWVycm9yKSB7Ci0gICAgICAgIGZnZXRzKHBubWxpbmUsIDI1Niwgd3BuZ19pbmZvLmluZmlsZSk7Ci0gICAgICAgIGlmIChwbm1saW5lWzBdICE9ICdQJyB8fCAoKHBubWNoYXIgPSBwbm1saW5lWzFdKSAhPSAnNScgJiYKLSAgICAgICAgICAgIHBubWNoYXIgIT0gJzYnICYmIHBubWNoYXIgIT0gJzgnKSkKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICI6ICBpbnB1dCBmaWxlIFslc10gaXMgbm90IGEgYmluYXJ5IFBHTSwgUFBNIG9yIFBBTSBmaWxlXG4iLAotICAgICAgICAgICAgICBpbm5hbWUpOwotICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdwbmdfaW5mby5wbm10eXBlID0gKGludCkocG5tY2hhciAtICcwJyk7Ci0gICAgICAgICAgICBpZiAod3BuZ19pbmZvLnBubXR5cGUgIT0gOCkKLSAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV9iZyA9IEZBTFNFOyAgLyogbm8gbmVlZCBmb3IgYmcgaWYgb3BhcXVlICovCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgZmdldHMocG5tbGluZSwgMjU2LCB3cG5nX2luZm8uaW5maWxlKTsgIC8qIGxvc2UgYW55IGNvbW1lbnRzICovCi0gICAgICAgICAgICB9IHdoaWxlIChwbm1saW5lWzBdID09ICcjJyk7Ci0gICAgICAgICAgICBzc2NhbmYocG5tbGluZSwgIiVsZCAlbGQiLCAmd3BuZ19pbmZvLndpZHRoLCAmd3BuZ19pbmZvLmhlaWdodCk7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgZmdldHMocG5tbGluZSwgMjU2LCB3cG5nX2luZm8uaW5maWxlKTsgIC8qIG1vcmUgY29tbWVudCBsaW5lcyAqLwotICAgICAgICAgICAgfSB3aGlsZSAocG5tbGluZVswXSA9PSAnIycpOwotICAgICAgICAgICAgc3NjYW5mKHBubWxpbmUsICIlZCIsICZtYXh2YWwpOwotICAgICAgICAgICAgaWYgKHdwbmdfaW5mby53aWR0aCA8PSAwTCB8fCB3cG5nX2luZm8uaGVpZ2h0IDw9IDBMIHx8Ci0gICAgICAgICAgICAgICAgbWF4dmFsICE9IDI1NSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICI6ICBvbmx5IHBvc2l0aXZlIHdpZHRoL2hlaWdodCwgbWF4dmFsID09IDI1NSBhbGxvd2VkIFxuIik7Ci0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdwbmdfaW5mby5zYW1wbGVfZGVwdGggPSA4OyAgLyogPD09PiBtYXh2YWwgMjU1ICovCi0KLSAgICAgICAgICAgIGlmICghd3BuZ19pbmZvLmZpbHRlcikgewotICAgICAgICAgICAgICAgIC8qIG1ha2Ugb3V0bmFtZSBmcm9tIGlubmFtZSAqLwotICAgICAgICAgICAgICAgIGlmICgocCA9IHN0cnJjaHIoaW5uYW1lLCAnLicpKSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgIChwIC0gaW5uYW1lKSAhPSAobGVuIC0gNCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJjcHkob3V0bmFtZSwgaW5uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KG91dG5hbWUrbGVuLCAiLnBuZyIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiAtPSA0OwotICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KG91dG5hbWUsIGlubmFtZSwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KG91dG5hbWUrbGVuLCAiLnBuZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBvdXRuYW1lIGFscmVhZHkgZXhpc3RzOyBpZiBub3QsIG9wZW4gKi8KLSAgICAgICAgICAgICAgICBpZiAoKHdwbmdfaW5mby5vdXRmaWxlID0gZm9wZW4ob3V0bmFtZSwgInJiIikpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBvdXRwdXQgZmlsZSBleGlzdHMgWyVzXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgZmNsb3NlKHdwbmdfaW5mby5vdXRmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEod3BuZ19pbmZvLm91dGZpbGUgPSBmb3BlbihvdXRuYW1lLCAid2IiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIG91dHB1dCBmaWxlIFslc11cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgb3V0bmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgZmNsb3NlKHdwbmdfaW5mby5pbmZpbGUpOwotICAgICAgICAgICAgd3BuZ19pbmZvLmluZmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAod3BuZ19pbmZvLmZpbHRlcikgewotICAgICAgICAgICAgICAgIGZjbG9zZSh3cG5nX2luZm8ub3V0ZmlsZSk7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLm91dGZpbGUgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKiBpZiB3ZSBoYWQgYW55IGVycm9ycywgcHJpbnQgdXNhZ2UgYW5kIGRpZSBob3JyaWJsZSBkZWF0aC4uLmFycnIhICovCi0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBBUFBOQU1FKTsKLSAgICAgICAgd3JpdGVwbmdfdmVyc2lvbl9pbmZvKCk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iCi0iVXNhZ2U6ICAlcyBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnXSBbLXRleHRdIFstdGltZV0gWy1pbnRlcmxhY2VdIHBubWZpbGVcbiIKLSJvcjogLi4uIHwgJXMgWy1nYW1tYSBleHBdIFstYmdjb2xvciBiZ10gWy10ZXh0XSBbLXRpbWVdIFstaW50ZXJsYWNlXSB8IC4uLlxuIgotICAgICAgICAgIiAgICBleHAgXHR0cmFuc2Zlci1mdW5jdGlvbiBleHBvbmVudCAoYGBnYW1tYScnKSBvZiB0aGUgaW1hZ2UgaW5cbiIKLSAgICAgICAgICJcdFx0ICBmbG9hdGluZy1wb2ludCBmb3JtYXQgKGUuZy4sIGBgJS41ZicnKTsgaWYgaW1hZ2UgbG9va3NcbiIKLSAgICAgICAgICJcdFx0ICBjb3JyZWN0IG9uIGdpdmVuIGRpc3BsYXkgc3lzdGVtLCBpbWFnZSBnYW1tYSBpcyBlcXVhbCB0b1xuIgotICAgICAgICAgIlx0XHQgIGludmVyc2Ugb2YgZGlzcGxheS1zeXN0ZW0gZXhwb25lbnQsIGkuZS4sIDEgLyAoTFVUICogQ1JUKVxuIgotICAgICAgICAgIlx0XHQgICh3aGVyZSBMVVQgPSBsb29rdXAtdGFibGUgZXhwb25lbnQgYW5kIENSVCA9IENSVCBleHBvbmVudDtcbiIKLSAgICAgICAgICJcdFx0ICBmaXJzdCB2YXJpZXMsIHNlY29uZCBpcyB1c3VhbGx5IDIuMiwgYWxsIGFyZSBwb3NpdGl2ZSlcbiIKLSAgICAgICAgICIgICAgYmcgIFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBhbHBoYS1jaGFubmVsIGltYWdlcywgaW5cbiIKLSAgICAgICAgICJcdFx0ICA3LWNoYXJhY3RlciBoZXggUkdCIGZvcm1hdCAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTpcbiIKLSAgICAgICAgICJcdFx0ICBzYW1lIGFzIEhUTUwgY29sb3JzKVxuIgotICAgICAgICAgIiAgICAtdGV4dFx0cHJvbXB0IGludGVyYWN0aXZlbHkgZm9yIHRleHQgaW5mbyAodEVYdCBjaHVua3MpXG4iCi0gICAgICAgICAiICAgIC10aW1lXHRpbmNsdWRlIGEgdElNRSBjaHVuayAobGFzdCBtb2RpZmljYXRpb24gdGltZSlcbiIKLSAgICAgICAgICIgICAgLWludGVybGFjZVx0d3JpdGUgaW50ZXJsYWNlZCBQTkcgaW1hZ2VcbiIKLSAgICAgICAgICJcbiIKLSJwbm1maWxlIG9yIHN0ZGluIG11c3QgYmUgYSBiaW5hcnkgUEdNIChgUDUnKSwgUFBNIChgUDYnKSBvciAoZXh0cmVtZWx5XG4iCi0idW5vZmZpY2lhbCBhbmQgdW5zdXBwb3J0ZWQhKSBQQU0gKGBQOCcpIGZpbGUuICBDdXJyZW50bHkgaXQgaXMgcmVxdWlyZWRcbiIKLSJ0byBoYXZlIG1heHZhbCA9PSAyNTUgKGkuZS4sIG5vIHNjYWxpbmcpLiAgSWYgcG5tZmlsZSBpcyBzcGVjaWZpZWQsIGl0XG4iCi0iaXMgY29udmVydGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIFBORyBmaWxlIHdpdGggdGhlIHNhbWUgYmFzZSBuYW1lIGJ1dCBhXG4iCi0iYGAucG5nJycgZXh0ZW5zaW9uOyBmaWxlcyByZWFkIGZyb20gc3RkaW4gYXJlIGNvbnZlcnRlZCBhbmQgc2VudCB0byBzdGRvdXQuXG4iCi0iVGhlIGNvbnZlcnNpb24gaXMgcHJvZ3Jlc3NpdmUgKGxvdyBtZW1vcnkgdXNhZ2UpIHVubGVzcyBpbnRlcmxhY2luZyBpc1xuIgotInJlcXVlc3RlZDsgaW4gdGhhdCBjYXNlIHRoZSB3aG9sZSBpbWFnZSB3aWxsIGJlIGJ1ZmZlcmVkIGluIG1lbW9yeSBhbmRcbiIKLSJ3cml0dGVuIGluIG9uZSBjYWxsLlxuIgotICAgICAgICAgIlxuIiwgUFJPR05BTUUsIFBST0dOQU1FLCBkZWZhdWx0X2dhbW1hKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLQotICAgIC8qIHByZXBhcmUgdGhlIHRleHQgYnVmZmVycyBmb3IgbGlicG5nJ3MgdXNlOyBub3RlIHRoYXQgZXZlbiB0aG91Z2gKLSAgICAgKiBQTkcncyBwbmdfdGV4dCBzdHJ1Y3QgaW5jbHVkZXMgYSBsZW5ndGggZmllbGQsIHdlIGRvbid0IGhhdmUgdG8gZmlsbAotICAgICAqIGl0IG91dCAqLwotCi0gICAgaWYgKHRleHQgJiYKLSNpZm5kZWYgRE9TX09TMl9XMzIKLSAgICAgICAgKGtleWJkID0gZmRvcGVuKGZpbGVubyhzdGRlcnIpLCAiciIpKSAhPSBOVUxMICYmCi0jZW5kaWYKLSAgICAgICAgKHRleHRidWYgPSAoY2hhciAqKW1hbGxvYygoNSArIDkpKjc1KSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGludCBpLCB2YWxpZCwgcmVzdWx0OwotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICJFbnRlciB0ZXh0IGluZm8gKG5vIG1vcmUgdGhhbiA3MiBjaGFyYWN0ZXJzIHBlciBsaW5lKTtcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRvIHNraXAgYSBmaWVsZCwgaGl0IHRoZSA8RW50ZXI+IGtleS5cbiIpOwotICAgICAgICAvKiBub3RlOiAganVzdCA8RW50ZXI+IGxlYXZlcyBsZW4gPT0gMSAqLwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgIHAgPSB0ZXh0YnVmICsgVEVYVF9USVRMRV9PRkZTRVQ7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgVGl0bGU6ICIpOwotICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgICAgICBpZiAoRkdFVFMocCwgNzQsIGtleWJkKSAmJiAobGVuID0gc3RybGVuKHApKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFtsZW4tMV0gPT0gJ1xuJykKLSAgICAgICAgICAgICAgICAgICAgcFstLWxlbl0gPSAnXDAnOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby50aXRsZSA9IHA7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCB8PSBURVhUX1RJVExFOwotICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ID0gd3BuZ19pc3ZhbGlkX2xhdGluMSgodWNoICopcCwgbGVuKSkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAiIFBST0dOQU1FICIgd2FybmluZzogIGNoYXJhY3RlciBjb2RlIgotICAgICAgICAgICAgICAgICAgICAgICIgJXUgaXMgJXNkaXNjb3VyYWdlZCBieSB0aGUgUE5HXG4gICAgc3BlY2lmaWNhdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgIltmaXJzdCBvY2N1cnJlbmNlIHdhcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gIyVkXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcFtyZXN1bHRdLCAocFtyZXN1bHRdID09IDI3KT8gInN0cm9uZ2x5ICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrMSk7Ci0gICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotI2lmZGVmIEZPUkJJRF9MQVRJTjFfQ1RSTAotICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX1RJVExFOwotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBbcmVzdWx0XSA9PSAyNykgeyAgICAvKiBlc2NhcGUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX1RJVExFOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghdmFsaWQpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgIHAgPSB0ZXh0YnVmICsgVEVYVF9BVVRIT1JfT0ZGU0VUOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIEF1dGhvcjogIik7Ci0gICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgICAgICAgIGlmIChGR0VUUyhwLCA3NCwga2V5YmQpICYmIChsZW4gPSBzdHJsZW4ocCkpID4gMSkgewotICAgICAgICAgICAgICAgIGlmIChwW2xlbi0xXSA9PSAnXG4nKQotICAgICAgICAgICAgICAgICAgICBwWy0tbGVuXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmF1dGhvciA9IHA7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCB8PSBURVhUX0FVVEhPUjsKLSAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCA9IHdwbmdfaXN2YWxpZF9sYXRpbjEoKHVjaCAqKXAsIGxlbikpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgIiBQUk9HTkFNRSAiIHdhcm5pbmc6ICBjaGFyYWN0ZXIgY29kZSIKLSAgICAgICAgICAgICAgICAgICAgICAiICV1IGlzICVzZGlzY291cmFnZWQgYnkgdGhlIFBOR1xuICAgIHNwZWNpZmljYXRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICJbZmlyc3Qgb2NjdXJyZW5jZSB3YXMgYXQgY2hhcmFjdGVyIHBvc2l0aW9uICMlZF1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXBbcmVzdWx0XSwgKHBbcmVzdWx0XSA9PSAyNyk/ICJzdHJvbmdseSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KzEpOwotICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSNpZmRlZiBGT1JCSURfTEFUSU4xX0NUUkwKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9BVVRIT1I7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAocFtyZXN1bHRdID09IDI3KSB7ICAgIC8qIGVzY2FwZSBjaGFyYWN0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfQVVUSE9SOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghdmFsaWQpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgIHAgPSB0ZXh0YnVmICsgVEVYVF9ERVNDX09GRlNFVDsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBEZXNjcmlwdGlvbiAodXAgdG8gOSBsaW5lcyk6XG4iKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDE7ICBpIDwgMTA7ICArK2kpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICBbJWRdICIsIGkpOwotICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICAgICAgICAgIGlmIChGR0VUUyhwLCA3NCwga2V5YmQpICYmIChsZW4gPSBzdHJsZW4ocCkpID4gMSkKLSAgICAgICAgICAgICAgICAgICAgcCArPSBsZW47ICAgLyogbm93IHBvaW50cyBhdCBOVUxMOyBjaGFyIGJlZm9yZSBpcyBuZXdsaW5lICovCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobGVuID0gcCAtICh0ZXh0YnVmICsgVEVYVF9ERVNDX09GRlNFVCkpID4gMSkgewotICAgICAgICAgICAgICAgIGlmIChwWy0xXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBbLTFdID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgLS1sZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5kZXNjID0gdGV4dGJ1ZiArIFRFWFRfREVTQ19PRkZTRVQ7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCB8PSBURVhUX0RFU0M7Ci0gICAgICAgICAgICAgICAgcCA9IHRleHRidWYgKyBURVhUX0RFU0NfT0ZGU0VUOwotICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ID0gd3BuZ19pc3ZhbGlkX2xhdGluMSgodWNoICopcCwgbGVuKSkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAiIFBST0dOQU1FICIgd2FybmluZzogIGNoYXJhY3RlciBjb2RlIgotICAgICAgICAgICAgICAgICAgICAgICIgJXUgaXMgJXNkaXNjb3VyYWdlZCBieSB0aGUgUE5HXG4gICAgc3BlY2lmaWNhdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgIltmaXJzdCBvY2N1cnJlbmNlIHdhcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gIyVkXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcFtyZXN1bHRdLCAocFtyZXN1bHRdID09IDI3KT8gInN0cm9uZ2x5ICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrMSk7Ci0gICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotI2lmZGVmIEZPUkJJRF9MQVRJTjFfQ1RSTAotICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0RFU0M7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAocFtyZXN1bHRdID09IDI3KSB7ICAgIC8qIGVzY2FwZSBjaGFyYWN0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfREVTQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoIXZhbGlkKTsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB2YWxpZCA9IFRSVUU7Ci0gICAgICAgICAgICBwID0gdGV4dGJ1ZiArIFRFWFRfQ09QWV9PRkZTRVQ7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgQ29weXJpZ2h0OiAiKTsKLSAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICAgICAgaWYgKEZHRVRTKHAsIDc0LCBrZXliZCkgJiYgKGxlbiA9IHN0cmxlbihwKSkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBbbGVuLTFdID09ICdcbicpCi0gICAgICAgICAgICAgICAgICAgIHBbLS1sZW5dID0gJ1wwJzsKLSAgICAgICAgICAgICAgICB3cG5nX2luZm8uY29weXJpZ2h0ID0gcDsKLSAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0IHw9IFRFWFRfQ09QWTsKLSAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCA9IHdwbmdfaXN2YWxpZF9sYXRpbjEoKHVjaCAqKXAsIGxlbikpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgIiBQUk9HTkFNRSAiIHdhcm5pbmc6ICBjaGFyYWN0ZXIgY29kZSIKLSAgICAgICAgICAgICAgICAgICAgICAiICV1IGlzICVzZGlzY291cmFnZWQgYnkgdGhlIFBOR1xuICAgIHNwZWNpZmljYXRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICJbZmlyc3Qgb2NjdXJyZW5jZSB3YXMgYXQgY2hhcmFjdGVyIHBvc2l0aW9uICMlZF1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXBbcmVzdWx0XSwgKHBbcmVzdWx0XSA9PSAyNyk/ICJzdHJvbmdseSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KzEpOwotICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSNpZmRlZiBGT1JCSURfTEFUSU4xX0NUUkwKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9DT1BZOwotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBbcmVzdWx0XSA9PSAyNykgeyAgICAvKiBlc2NhcGUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0NPUFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCF2YWxpZCk7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgdmFsaWQgPSBUUlVFOwotICAgICAgICAgICAgcCA9IHRleHRidWYgKyBURVhUX0VNQUlMX09GRlNFVDsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBFLW1haWw6ICIpOwotICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgICAgICBpZiAoRkdFVFMocCwgNzQsIGtleWJkKSAmJiAobGVuID0gc3RybGVuKHApKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFtsZW4tMV0gPT0gJ1xuJykKLSAgICAgICAgICAgICAgICAgICAgcFstLWxlbl0gPSAnXDAnOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5lbWFpbCA9IHA7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCB8PSBURVhUX0VNQUlMOwotICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ID0gd3BuZ19pc3ZhbGlkX2xhdGluMSgodWNoICopcCwgbGVuKSkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAiIFBST0dOQU1FICIgd2FybmluZzogIGNoYXJhY3RlciBjb2RlIgotICAgICAgICAgICAgICAgICAgICAgICIgJXUgaXMgJXNkaXNjb3VyYWdlZCBieSB0aGUgUE5HXG4gICAgc3BlY2lmaWNhdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgIltmaXJzdCBvY2N1cnJlbmNlIHdhcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gIyVkXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcFtyZXN1bHRdLCAocFtyZXN1bHRdID09IDI3KT8gInN0cm9uZ2x5ICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrMSk7Ci0gICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotI2lmZGVmIEZPUkJJRF9MQVRJTjFfQ1RSTAotICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0VNQUlMOwotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBbcmVzdWx0XSA9PSAyNykgeyAgICAvKiBlc2NhcGUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0VNQUlMOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghdmFsaWQpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgIHAgPSB0ZXh0YnVmICsgVEVYVF9VUkxfT0ZGU0VUOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIFVSTDogIik7Ci0gICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgICAgICAgIGlmIChGR0VUUyhwLCA3NCwga2V5YmQpICYmIChsZW4gPSBzdHJsZW4ocCkpID4gMSkgewotICAgICAgICAgICAgICAgIGlmIChwW2xlbi0xXSA9PSAnXG4nKQotICAgICAgICAgICAgICAgICAgICBwWy0tbGVuXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLnVybCA9IHA7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCB8PSBURVhUX1VSTDsKLSAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCA9IHdwbmdfaXN2YWxpZF9sYXRpbjEoKHVjaCAqKXAsIGxlbikpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgIiBQUk9HTkFNRSAiIHdhcm5pbmc6ICBjaGFyYWN0ZXIgY29kZSIKLSAgICAgICAgICAgICAgICAgICAgICAiICV1IGlzICVzZGlzY291cmFnZWQgYnkgdGhlIFBOR1xuICAgIHNwZWNpZmljYXRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICJbZmlyc3Qgb2NjdXJyZW5jZSB3YXMgYXQgY2hhcmFjdGVyIHBvc2l0aW9uICMlZF1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXBbcmVzdWx0XSwgKHBbcmVzdWx0XSA9PSAyNyk/ICJzdHJvbmdseSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KzEpOwotICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSNpZmRlZiBGT1JCSURfTEFUSU4xX0NUUkwKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9VUkw7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAocFtyZXN1bHRdID09IDI3KSB7ICAgIC8qIGVzY2FwZSBjaGFyYWN0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfVVJMOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghdmFsaWQpOwotCi0jaWZuZGVmIERPU19PUzJfVzMyCi0gICAgICAgIGZjbG9zZShrZXliZCk7Ci0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAodGV4dCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRleHRcbiIpOwotICAgICAgICB0ZXh0ID0gRkFMU0U7Ci0gICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgPSAwOwotICAgIH0KLQotCi0gICAgLyogYWxsb2NhdGUgbGlicG5nIHN0dWZmLCBpbml0aWFsaXplIHRyYW5zZm9ybWF0aW9ucywgd3JpdGUgcHJlLUlEQVQgZGF0YSAqLwotCi0gICAgaWYgKChyYyA9IHdyaXRlcG5nX2luaXQoJndwbmdfaW5mbykpICE9IDApIHsKLSAgICAgICAgc3dpdGNoIChyYykgewotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgIjogIGxpYnBuZyBpbml0aWFsaXphdGlvbiBwcm9ibGVtIChsb25nam1wKVxuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAiOiAgaW50ZXJuYWwgbG9naWMgZXJyb3IgKHVuZXhwZWN0ZWQgUE5NIHR5cGUpXG4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAiOiAgdW5rbm93biB3cml0ZXBuZ19pbml0KCkgZXJyb3JcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGV4aXQocmMpOwotICAgIH0KLQotCi0gICAgLyogZnJlZSB0ZXh0YnVmLCBzaW5jZSBpdCdzIGEgY29tcGxldGVseSBsb2NhbCB2YXJpYWJsZSBhbmQgYWxsIHRleHQgaW5mbwotICAgICAqIGhhcyBqdXN0IGJlZW4gd3JpdHRlbiB0byB0aGUgUE5HIGZpbGUgKi8KLQotICAgIGlmICh0ZXh0ICYmIHRleHRidWYpIHsKLSAgICAgICAgZnJlZSh0ZXh0YnVmKTsKLSAgICAgICAgdGV4dGJ1ZiA9IE5VTEw7Ci0gICAgfQotCi0KLSAgICAvKiBjYWxjdWxhdGUgcm93Ynl0ZXMgb24gYmFzaXMgb2YgaW1hZ2UgdHlwZTsgbm90ZSB0aGF0IHRoaXMgYmVjb21lcyBtdWNoCi0gICAgICogbW9yZSBjb21wbGljYXRlZCBpZiB3ZSBjaG9vc2UgdG8gc3VwcG9ydCBQQk0gdHlwZSwgQVNDSUkgUE5NIHR5cGVzLCBvcgotICAgICAqIDE2LWJpdC1wZXItc2FtcGxlIGJpbmFyeSBkYXRhIFtjdXJyZW50bHkgbm90IGFuIG9mZmljaWFsIE5ldFBCTSB0eXBlXSAqLwotCi0gICAgaWYgKHdwbmdfaW5mby5wbm10eXBlID09IDUpCi0gICAgICAgIHJvd2J5dGVzID0gd3BuZ19pbmZvLndpZHRoOwotICAgIGVsc2UgaWYgKHdwbmdfaW5mby5wbm10eXBlID09IDYpCi0gICAgICAgIHJvd2J5dGVzID0gd3BuZ19pbmZvLndpZHRoICogMzsKLSAgICBlbHNlIC8qIGlmICh3cG5nX2luZm8ucG5tdHlwZSA9PSA4KSAqLwotICAgICAgICByb3dieXRlcyA9IHdwbmdfaW5mby53aWR0aCAqIDQ7Ci0KLQotICAgIC8qIHJlYWQgYW5kIHdyaXRlIHRoZSBpbWFnZSwgZWl0aGVyIGluIGl0cyBlbnRpcmV0eSAoaWYgd3JpdGluZyBpbnRlcmxhY2VkCi0gICAgICogUE5HKSBvciByb3cgYnkgcm93IChpZiBub24taW50ZXJsYWNlZCkgKi8KLQotICAgIGZwcmludGYoc3RkZXJyLCAiRW5jb2RpbmcgaW1hZ2UgZGF0YS4uLlxuIik7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICBpZiAod3BuZ19pbmZvLmludGVybGFjZWQpIHsKLSAgICAgICAgbG9uZyBpOwotICAgICAgICB1bGcgYnl0ZXM7Ci0gICAgICAgIHVsZyBpbWFnZV9ieXRlcyA9IHJvd2J5dGVzICogd3BuZ19pbmZvLmhlaWdodDsgICAvKiBvdmVyZmxvdz8gKi8KLQotICAgICAgICB3cG5nX2luZm8uaW1hZ2VfZGF0YSA9ICh1Y2ggKiltYWxsb2MoaW1hZ2VfYnl0ZXMpOwotICAgICAgICB3cG5nX2luZm8ucm93X3BvaW50ZXJzID0gKHVjaCAqKiltYWxsb2Mod3BuZ19pbmZvLmhlaWdodCpzaXplb2YodWNoICopKTsKLSAgICAgICAgaWYgKHdwbmdfaW5mby5pbWFnZV9kYXRhID09IE5VTEwgfHwgd3BuZ19pbmZvLnJvd19wb2ludGVycyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnkgZm9yIGltYWdlIGRhdGFcbiIpOwotICAgICAgICAgICAgd3JpdGVwbmdfY2xlYW51cCgmd3BuZ19pbmZvKTsKLSAgICAgICAgICAgIHdwbmdfY2xlYW51cCgpOwotICAgICAgICAgICAgZXhpdCg1KTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHdwbmdfaW5mby5oZWlnaHQ7ICArK2kpCi0gICAgICAgICAgICB3cG5nX2luZm8ucm93X3BvaW50ZXJzW2ldID0gd3BuZ19pbmZvLmltYWdlX2RhdGEgKyBpKnJvd2J5dGVzOwotICAgICAgICBieXRlcyA9IGZyZWFkKHdwbmdfaW5mby5pbWFnZV9kYXRhLCAxLCBpbWFnZV9ieXRlcywgd3BuZ19pbmZvLmluZmlsZSk7Ci0gICAgICAgIGlmIChieXRlcyAhPSBpbWFnZV9ieXRlcykgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBleHBlY3RlZCAlbHUgYnl0ZXMsIGdvdCAlbHUgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgIGltYWdlX2J5dGVzLCBieXRlcyk7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgKGNvbnRpbnVpbmcgYW55d2F5KVxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdyaXRlcG5nX2VuY29kZV9pbWFnZSgmd3BuZ19pbmZvKSAhPSAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgIjogIGxpYnBuZyBwcm9ibGVtIChsb25nam1wKSB3aGlsZSB3cml0aW5nIGltYWdlIGRhdGFcbiIpOwotICAgICAgICAgICAgd3JpdGVwbmdfY2xlYW51cCgmd3BuZ19pbmZvKTsKLSAgICAgICAgICAgIHdwbmdfY2xlYW51cCgpOwotICAgICAgICAgICAgZXhpdCgyKTsKLSAgICAgICAgfQotCi0gICAgfSBlbHNlIC8qIG5vdCBpbnRlcmxhY2VkOiAgd3JpdGUgcHJvZ3Jlc3NpdmVseSAocm93IGJ5IHJvdykgKi8gewotICAgICAgICBsb25nIGo7Ci0gICAgICAgIHVsZyBieXRlczsKLQotICAgICAgICB3cG5nX2luZm8uaW1hZ2VfZGF0YSA9ICh1Y2ggKiltYWxsb2Mocm93Ynl0ZXMpOwotICAgICAgICBpZiAod3BuZ19pbmZvLmltYWdlX2RhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5IGZvciByb3cgZGF0YVxuIik7Ci0gICAgICAgICAgICB3cml0ZXBuZ19jbGVhbnVwKCZ3cG5nX2luZm8pOwotICAgICAgICAgICAgd3BuZ19jbGVhbnVwKCk7Ci0gICAgICAgICAgICBleGl0KDUpOwotICAgICAgICB9Ci0gICAgICAgIGVycm9yID0gMDsKLSAgICAgICAgZm9yIChqID0gd3BuZ19pbmZvLmhlaWdodDsgIGogPiAwTDsgIC0taikgewotICAgICAgICAgICAgYnl0ZXMgPSBmcmVhZCh3cG5nX2luZm8uaW1hZ2VfZGF0YSwgMSwgcm93Ynl0ZXMsIHdwbmdfaW5mby5pbmZpbGUpOwotICAgICAgICAgICAgaWYgKGJ5dGVzICE9IHJvd2J5dGVzKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAiOiAgZXhwZWN0ZWQgJWx1IGJ5dGVzLCBnb3QgJWx1IGJ5dGVzIChyb3cgJWxkKVxuIiwgcm93Ynl0ZXMsCi0gICAgICAgICAgICAgICAgICBieXRlcywgd3BuZ19pbmZvLmhlaWdodC1qKTsKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHdyaXRlcG5nX2VuY29kZV9yb3coJndwbmdfaW5mbykgIT0gMCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgIjogIGxpYnBuZyBwcm9ibGVtIChsb25nam1wKSB3aGlsZSB3cml0aW5nIHJvdyAlbGRcbiIsCi0gICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGVpZ2h0LWopOwotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICB3cml0ZXBuZ19jbGVhbnVwKCZ3cG5nX2luZm8pOwotICAgICAgICAgICAgd3BuZ19jbGVhbnVwKCk7Ci0gICAgICAgICAgICBleGl0KDIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3cml0ZXBuZ19lbmNvZGVfZmluaXNoKCZ3cG5nX2luZm8pICE9IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgZXJyb3Igb24gZmluYWwgbGlicG5nIGNhbGxcbiIpOwotICAgICAgICAgICAgd3JpdGVwbmdfY2xlYW51cCgmd3BuZ19pbmZvKTsKLSAgICAgICAgICAgIHdwbmdfY2xlYW51cCgpOwotICAgICAgICAgICAgZXhpdCgyKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyogT0ssIHdlJ3JlIGRvbmUgKHN1Y2Nlc3NmdWxseSk6ICBjbGVhbiB1cCBhbGwgcmVzb3VyY2VzIGFuZCBxdWl0ICovCi0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIkRvbmUuXG4iKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLQotICAgIHdyaXRlcG5nX2NsZWFudXAoJndwbmdfaW5mbyk7Ci0gICAgd3BuZ19jbGVhbnVwKCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi1zdGF0aWMgaW50IHdwbmdfaXN2YWxpZF9sYXRpbjEodWNoICpwLCBpbnQgbGVuKQotewotICAgIGludCBpLCByZXN1bHQgPSAtMTsKLQotICAgIGZvciAoaSA9IDA7ICBpIDwgbGVuOyAgKytpKSB7Ci0gICAgICAgIGlmIChwW2ldID09IDEwIHx8IChwW2ldID4gMzEgJiYgcFtpXSA8IDEyNykgfHwgcFtpXSA+IDE2MCkKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogY2hhcmFjdGVyIGlzIGNvbXBsZXRlbHkgT0sgKi8KLSAgICAgICAgaWYgKHJlc3VsdCA8IDAgfHwgKHBbcmVzdWx0XSAhPSAyNyAmJiBwW2ldID09IDI3KSkKLSAgICAgICAgICAgIHJlc3VsdCA9IGk7ICAgICAgICAgLyogbWFyayBsb2NhdGlvbiBvZiBmaXJzdCBxdWVzdGlvbmFibGUgb25lICovCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBvciBvZiBmaXJzdCBlc2NhcGUgY2hhcmFjdGVyIChiYWQpICovCi0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHdwbmdfY2xlYW51cCh2b2lkKQotewotICAgIGlmICh3cG5nX2luZm8ub3V0ZmlsZSkgewotICAgICAgICBmY2xvc2Uod3BuZ19pbmZvLm91dGZpbGUpOwotICAgICAgICB3cG5nX2luZm8ub3V0ZmlsZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHdwbmdfaW5mby5pbmZpbGUpIHsKLSAgICAgICAgZmNsb3NlKHdwbmdfaW5mby5pbmZpbGUpOwotICAgICAgICB3cG5nX2luZm8uaW5maWxlID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAod3BuZ19pbmZvLmltYWdlX2RhdGEpIHsKLSAgICAgICAgZnJlZSh3cG5nX2luZm8uaW1hZ2VfZGF0YSk7Ci0gICAgICAgIHdwbmdfaW5mby5pbWFnZV9kYXRhID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAod3BuZ19pbmZvLnJvd19wb2ludGVycykgewotICAgICAgICBmcmVlKHdwbmdfaW5mby5yb3dfcG9pbnRlcnMpOwotICAgICAgICB3cG5nX2luZm8ucm93X3BvaW50ZXJzID0gTlVMTDsKLSAgICB9Ci19Ci0KLQotCi0KLSNpZmRlZiBET1NfT1MyX1czMgotCi1zdGF0aWMgY2hhciAqZG9zX2tiZF9nZXRzKGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLSAgICBpbnQgY2gsIGNvdW50PTA7Ci0KLSAgICBkbyB7Ci0gICAgICAgIGJ1Zltjb3VudCsrXSA9IGNoID0gZ2V0Y2hlKCk7Ci0gICAgfSB3aGlsZSAoY2ggIT0gJ1xyJyAmJiBjb3VudCA8IGxlbi0xKTsKLQotICAgIGJ1Zltjb3VudC0tXSA9ICdcMCc7ICAgICAgICAvKiB0ZXJtaW5hdGUgc3RyaW5nICovCi0gICAgaWYgKGJ1Zltjb3VudF0gPT0gJ1xyJykgICAgIC8qIEVudGVyIGtleSBtYWtlcyBDUiwgc28gY2hhbmdlIHRvIG5ld2xpbmUgKi8KLSAgICAgICAgYnVmW2NvdW50XSA9ICdcbic7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7ICAgICAgLyogRW50ZXIga2V5IGRvZXMgKm5vdCogY2F1c2UgYSBuZXdsaW5lICovCi0gICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICByZXR1cm4gYnVmOwotfQotCi0jZW5kaWYgLyogRE9TX09TMl9XMzIgKi8KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuYyBiL2xpYnMvbGlicG5nL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkODFlYS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL3dyaXRlcG5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgd3BuZyAtIHNpbXBsZSBQTkctd3JpdGluZyBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXBuZy5jCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgLyogZm9yIGV4aXQoKSBwcm90b3R5cGUgKi8KLQotI2luY2x1ZGUgInBuZy5oIiAgICAgICAgLyogbGlicG5nIGhlYWRlcjsgaW5jbHVkZXMgemxpYi5oIGFuZCBzZXRqbXAuaCAqLwotI2luY2x1ZGUgIndyaXRlcG5nLmgiICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHB1YmxpYyBwcm90b3R5cGVzICovCi0KLQotLyogbG9jYWwgcHJvdG90eXBlICovCi0KLXN0YXRpYyB2b2lkIHdyaXRlcG5nX2Vycm9yX2hhbmRsZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZyk7Ci0KLQotCi12b2lkIHdyaXRlcG5nX3ZlcnNpb25faW5mbyh2b2lkKQotewotICBmcHJpbnRmKHN0ZGVyciwgIiAgIENvbXBpbGVkIHdpdGggbGlicG5nICVzOyB1c2luZyBsaWJwbmcgJXMuXG4iLAotICAgIFBOR19MSUJQTkdfVkVSX1NUUklORywgcG5nX2xpYnBuZ192ZXIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgIENvbXBpbGVkIHdpdGggemxpYiAlczsgdXNpbmcgemxpYiAlcy5cbiIsCi0gICAgWkxJQl9WRVJTSU9OLCB6bGliX3ZlcnNpb24pOwotfQotCi0KLQotCi0vKiByZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDIgZm9yIGxpYnBuZyBwcm9ibGVtLCA0IGZvciBvdXQgb2YgbWVtb3J5LCAxMSBmb3IKLSAqICB1bmV4cGVjdGVkIHBubXR5cGU7IG5vdGUgdGhhdCBvdXRmaWxlIG1pZ2h0IGJlIHN0ZG91dCAqLwotCi1pbnQgd3JpdGVwbmdfaW5pdChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpCi17Ci0gICAgcG5nX3N0cnVjdHAgIHBuZ19wdHI7ICAgICAgIC8qIG5vdGU6ICB0ZW1wb3JhcnkgdmFyaWFibGVzISAqLwotICAgIHBuZ19pbmZvcCAgaW5mb19wdHI7Ci0gICAgaW50IGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlOwotCi0KLSAgICAvKiBjb3VsZCBhbHNvIHJlcGxhY2UgbGlicG5nIHdhcm5pbmctaGFuZGxlciAoZmluYWwgTlVMTCksIGJ1dCBubyBuZWVkOiAqLwotCi0gICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgbWFpbnByb2dfcHRyLAotICAgICAgd3JpdGVwbmdfZXJyb3JfaGFuZGxlciwgTlVMTCk7Ci0gICAgaWYgKCFwbmdfcHRyKQotICAgICAgICByZXR1cm4gNDsgICAvKiBvdXQgb2YgbWVtb3J5ICovCi0KLSAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICAgaWYgKCFpbmZvX3B0cikgewotICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsIE5VTEwpOwotICAgICAgICByZXR1cm4gNDsgICAvKiBvdXQgb2YgbWVtb3J5ICovCi0gICAgfQotCi0KLSAgICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXdyaXRpbmcKLSAgICAgKiBsaWJwbmcgZnVuY3Rpb24sIHVubGVzcyBhbiBhbHRlcm5hdGUgZXJyb3IgaGFuZGxlciB3YXMgaW5zdGFsbGVkLS0KLSAgICAgKiBidXQgY29tcGF0aWJsZSBlcnJvciBoYW5kbGVycyBtdXN0IGVpdGhlciB1c2UgbG9uZ2ptcCgpIHRoZW1zZWx2ZXMKLSAgICAgKiAoYXMgaW4gdGhpcyBwcm9ncmFtKSBvciBleGl0IGltbWVkaWF0ZWx5LCBzbyBoZXJlIHdlIGdvOiAqLwotCi0gICAgaWYgKHNldGptcChtYWlucHJvZ19wdHItPmptcGJ1ZikpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLQotICAgIC8qIG1ha2Ugc3VyZSBvdXRmaWxlIGlzIChyZSlvcGVuZWQgaW4gQklOQVJZIG1vZGUgKi8KLQotICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIG1haW5wcm9nX3B0ci0+b3V0ZmlsZSk7Ci0KLQotICAgIC8qIHNldCB0aGUgY29tcHJlc3Npb24gbGV2ZWxzLS1pbiBnZW5lcmFsLCBhbHdheXMgd2FudCB0byBsZWF2ZSBmaWx0ZXJpbmcKLSAgICAgKiB0dXJuZWQgb24gKGV4Y2VwdCBmb3IgcGFsZXR0ZSBpbWFnZXMpIGFuZCBhbGxvdyBhbGwgb2YgdGhlIGZpbHRlcnMsCi0gICAgICogd2hpY2ggaXMgdGhlIGRlZmF1bHQ7IHdhbnQgMzJLIHpsaWIgd2luZG93LCB1bmxlc3MgZW50aXJlIGltYWdlIGJ1ZmZlcgotICAgICAqIGlzIDE2SyBvciBzbWFsbGVyICh1bmtub3duIGhlcmUpLS1hbHNvIHRoZSBkZWZhdWx0OyB1c3VhbGx5IHdhbnQgbWF4Ci0gICAgICogY29tcHJlc3Npb24gKE5PVCB0aGUgZGVmYXVsdCk7IGFuZCByZW1haW5pbmcgY29tcHJlc3Npb24gZmxhZ3Mgc2hvdWxkCi0gICAgICogYmUgbGVmdCBhbG9uZSAqLwotCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbChwbmdfcHRyLCBaX0JFU1RfQ09NUFJFU1NJT04pOwotLyoKLSAgICA+PiB0aGlzIGlzIGRlZmF1bHQgZm9yIG5vIGZpbHRlcmluZzsgWl9GSUxURVJFRCBpcyBkZWZhdWx0IG90aGVyd2lzZToKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsIFpfREVGQVVMVF9TVFJBVEVHWSk7Ci0gICAgPj4gdGhlc2UgYXJlIGFsbCBkZWZhdWx0czoKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbChwbmdfcHRyLCA4KTsKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzKHBuZ19wdHIsIDE1KTsKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZChwbmdfcHRyLCA4KTsKLSAqLwotCi0KLSAgICAvKiBzZXQgdGhlIGltYWdlIHBhcmFtZXRlcnMgYXBwcm9wcmlhdGVseSAqLwotCi0gICAgaWYgKG1haW5wcm9nX3B0ci0+cG5tdHlwZSA9PSA1KQotICAgICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWTsKLSAgICBlbHNlIGlmIChtYWlucHJvZ19wdHItPnBubXR5cGUgPT0gNikKLSAgICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQjsKLSAgICBlbHNlIGlmIChtYWlucHJvZ19wdHItPnBubXR5cGUgPT0gOCkKLSAgICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsKLSAgICBlbHNlIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotICAgICAgICByZXR1cm4gMTE7Ci0gICAgfQotCi0gICAgaW50ZXJsYWNlX3R5cGUgPSBtYWlucHJvZ19wdHItPmludGVybGFjZWQ/IFBOR19JTlRFUkxBQ0VfQURBTTcgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX05PTkU7Ci0KLSAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIG1haW5wcm9nX3B0ci0+d2lkdGgsIG1haW5wcm9nX3B0ci0+aGVpZ2h0LAotICAgICAgbWFpbnByb2dfcHRyLT5zYW1wbGVfZGVwdGgsIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLAotICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfREVGQVVMVCwgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQpOwotCi0gICAgaWYgKG1haW5wcm9nX3B0ci0+Z2FtbWEgPiAwLjApCi0gICAgICAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgbWFpbnByb2dfcHRyLT5nYW1tYSk7Ci0KLSAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX2JnKSB7ICAgLyogd2Uga25vdyBpdCdzIFJHQkEsIG5vdCBncmF5K2FscGhhICovCi0gICAgICAgIHBuZ19jb2xvcl8xNiAgYmFja2dyb3VuZDsKLQotICAgICAgICBiYWNrZ3JvdW5kLnJlZCA9IG1haW5wcm9nX3B0ci0+YmdfcmVkOwotICAgICAgICBiYWNrZ3JvdW5kLmdyZWVuID0gbWFpbnByb2dfcHRyLT5iZ19ncmVlbjsKLSAgICAgICAgYmFja2dyb3VuZC5ibHVlID0gbWFpbnByb2dfcHRyLT5iZ19ibHVlOwotICAgICAgICBwbmdfc2V0X2JLR0QocG5nX3B0ciwgaW5mb19wdHIsICZiYWNrZ3JvdW5kKTsKLSAgICB9Ci0KLSAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RpbWUpIHsKLSAgICAgICAgcG5nX3RpbWUgIG1vZHRpbWU7Ci0KLSAgICAgICAgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoJm1vZHRpbWUsIG1haW5wcm9nX3B0ci0+bW9kdGltZSk7Ci0gICAgICAgIHBuZ19zZXRfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgJm1vZHRpbWUpOwotICAgIH0KLQotICAgIGlmIChtYWlucHJvZ19wdHItPmhhdmVfdGV4dCkgewotICAgICAgICBwbmdfdGV4dCAgdGV4dFs2XTsKLSAgICAgICAgaW50ICBudW1fdGV4dCA9IDA7Ci0KLSAgICAgICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV90ZXh0ICYgVEVYVF9USVRMRSkgewotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOwotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0ua2V5ID0gIlRpdGxlIjsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLnRleHQgPSBtYWlucHJvZ19wdHItPnRpdGxlOwotICAgICAgICAgICAgKytudW1fdGV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQgJiBURVhUX0FVVEhPUikgewotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOwotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0ua2V5ID0gIkF1dGhvciI7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS50ZXh0ID0gbWFpbnByb2dfcHRyLT5hdXRob3I7Ci0gICAgICAgICAgICArK251bV90ZXh0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYWlucHJvZ19wdHItPmhhdmVfdGV4dCAmIFRFWFRfREVTQykgewotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOwotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0ua2V5ID0gIkRlc2NyaXB0aW9uIjsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLnRleHQgPSBtYWlucHJvZ19wdHItPmRlc2M7Ci0gICAgICAgICAgICArK251bV90ZXh0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYWlucHJvZ19wdHItPmhhdmVfdGV4dCAmIFRFWFRfQ09QWSkgewotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOwotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0ua2V5ID0gIkNvcHlyaWdodCI7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS50ZXh0ID0gbWFpbnByb2dfcHRyLT5jb3B5cmlnaHQ7Ci0gICAgICAgICAgICArK251bV90ZXh0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYWlucHJvZ19wdHItPmhhdmVfdGV4dCAmIFRFWFRfRU1BSUwpIHsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmtleSA9ICJFLW1haWwiOwotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0udGV4dCA9IG1haW5wcm9nX3B0ci0+ZW1haWw7Ci0gICAgICAgICAgICArK251bV90ZXh0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYWlucHJvZ19wdHItPmhhdmVfdGV4dCAmIFRFWFRfVVJMKSB7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5rZXkgPSAiVVJMIjsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLnRleHQgPSBtYWlucHJvZ19wdHItPnVybDsKLSAgICAgICAgICAgICsrbnVtX3RleHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcG5nX3NldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0LCBudW1fdGV4dCk7Ci0gICAgfQotCi0KLSAgICAvKiB3cml0ZSBhbGwgY2h1bmtzIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgZmlyc3QgSURBVCAqLwotCi0gICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0KLSAgICAvKiBpZiB3ZSB3YW50ZWQgdG8gd3JpdGUgYW55IG1vcmUgdGV4dCBpbmZvICphZnRlciogdGhlIGltYWdlIGRhdGEsIHdlCi0gICAgICogd291bGQgc2V0IHVwIHRleHQgc3RydWN0KHMpIGhlcmUgYW5kIGNhbGwgcG5nX3NldF90ZXh0KCkgYWdhaW4sIHdpdGgKLSAgICAgKiBqdXN0IHRoZSBuZXcgZGF0YTsgcG5nX3NldF90SU1FKCkgY291bGQgYWxzbyBnbyBoZXJlLCBidXQgaXQgd291bGQKLSAgICAgKiBoYXZlIG5vIGVmZmVjdCBzaW5jZSB3ZSBhbHJlYWR5IGNhbGxlZCBpdCBhYm92ZSAob25seSBvbmUgdElNRSBjaHVuawotICAgICAqIGFsbG93ZWQpICovCi0KLQotICAgIC8qIHNldCB1cCB0aGUgdHJhbnNmb3JtYXRpb25zOiAgZm9yIG5vdywganVzdCBwYWNrIGxvdy1iaXQtZGVwdGggcGl4ZWxzCi0gICAgICogaW50byBieXRlcyAob25lLCB0d28gb3IgZm91ciBwaXhlbHMgcGVyIGJ5dGUpICovCi0KLSAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7Ci0vKiAgcG5nX3NldF9zaGlmdChwbmdfcHRyLCAmc2lnX2JpdCk7ICB0byBzY2FsZSBsb3ctYml0LWRlcHRoIHZhbHVlcyAqLwotCi0KLSAgICAvKiBtYWtlIHN1cmUgd2Ugc2F2ZSBvdXIgcG9pbnRlcnMgZm9yIHVzZSBpbiB3cml0ZXBuZ19lbmNvZGVfaW1hZ2UoKSAqLwotCi0gICAgbWFpbnByb2dfcHRyLT5wbmdfcHRyID0gcG5nX3B0cjsKLSAgICBtYWlucHJvZ19wdHItPmluZm9fcHRyID0gaW5mb19wdHI7Ci0KLQotICAgIC8qIE9LLCB0aGF0J3MgYWxsIHdlIG5lZWQgdG8gZG8gZm9yIG5vdzsgcmV0dXJuIGhhcHB5ICovCi0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi0vKiByZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDIgZm9yIGxpYnBuZyAobG9uZ2ptcCkgcHJvYmxlbSAqLwotCi1pbnQgd3JpdGVwbmdfZW5jb2RlX2ltYWdlKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cikKLXsKLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKW1haW5wcm9nX3B0ci0+cG5nX3B0cjsKLSAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSAocG5nX2luZm9wKW1haW5wcm9nX3B0ci0+aW5mb19wdHI7Ci0KLQotICAgIC8qIGFzIGFsd2F5cywgc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhCi0gICAgICogUE5HLXdyaXRpbmcgbGlicG5nIGZ1bmN0aW9uICovCi0KLSAgICBpZiAoc2V0am1wKG1haW5wcm9nX3B0ci0+am1wYnVmKSkgewotICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7Ci0gICAgICAgIG1haW5wcm9nX3B0ci0+cG5nX3B0ciA9IE5VTEw7Ci0gICAgICAgIG1haW5wcm9nX3B0ci0+aW5mb19wdHIgPSBOVUxMOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLQotICAgIC8qIGFuZCBub3cgd2UganVzdCB3cml0ZSB0aGUgd2hvbGUgaW1hZ2U7IGxpYnBuZyB0YWtlcyBjYXJlIG9mIGludGVybGFjaW5nCi0gICAgICogZm9yIHVzICovCi0KLSAgICBwbmdfd3JpdGVfaW1hZ2UocG5nX3B0ciwgbWFpbnByb2dfcHRyLT5yb3dfcG9pbnRlcnMpOwotCi0KLSAgICAvKiBzaW5jZSB0aGF0J3MgaXQsIHdlIGFsc28gY2xvc2Ugb3V0IHRoZSBlbmQgb2YgdGhlIFBORyBmaWxlIG5vdy0taWYgd2UKLSAgICAgKiBoYWQgYW55IHRleHQgb3IgdGltZSBpbmZvIHRvIHdyaXRlIGFmdGVyIHRoZSBJREFUcywgc2Vjb25kIGFyZ3VtZW50Ci0gICAgICogd291bGQgYmUgaW5mb19wdHIsIGJ1dCB3ZSBvcHRpbWl6ZSBzbGlnaHRseSBieSBzZW5kaW5nIE5VTEwgcG9pbnRlcjogKi8KLQotICAgIHBuZ193cml0ZV9lbmQocG5nX3B0ciwgTlVMTCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi0vKiByZXR1cm5zIDAgaWYgc3VjY2VlZHMsIDIgaWYgbGlicG5nIHByb2JsZW0gKi8KLQotaW50IHdyaXRlcG5nX2VuY29kZV9yb3cobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKSAgLyogTk9OLWludGVybGFjZWQgb25seSEgKi8KLXsKLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKW1haW5wcm9nX3B0ci0+cG5nX3B0cjsKLSAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSAocG5nX2luZm9wKW1haW5wcm9nX3B0ci0+aW5mb19wdHI7Ci0KLQotICAgIC8qIGFzIGFsd2F5cywgc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhCi0gICAgICogUE5HLXdyaXRpbmcgbGlicG5nIGZ1bmN0aW9uICovCi0KLSAgICBpZiAoc2V0am1wKG1haW5wcm9nX3B0ci0+am1wYnVmKSkgewotICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7Ci0gICAgICAgIG1haW5wcm9nX3B0ci0+cG5nX3B0ciA9IE5VTEw7Ci0gICAgICAgIG1haW5wcm9nX3B0ci0+aW5mb19wdHIgPSBOVUxMOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLQotICAgIC8qIGltYWdlX2RhdGEgcG9pbnRzIGF0IG91ciBvbmUgcm93IG9mIGltYWdlIGRhdGEgKi8KLQotICAgIHBuZ193cml0ZV9yb3cocG5nX3B0ciwgbWFpbnByb2dfcHRyLT5pbWFnZV9kYXRhKTsKLQotICAgIHJldHVybiAwOwotfQotCi0KLQotCi0KLS8qIHJldHVybnMgMCBpZiBzdWNjZWVkcywgMiBpZiBsaWJwbmcgcHJvYmxlbSAqLwotCi1pbnQgd3JpdGVwbmdfZW5jb2RlX2ZpbmlzaChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpICAgLyogTk9OLWludGVybGFjZWQhICovCi17Ci0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IChwbmdfc3RydWN0cCltYWlucHJvZ19wdHItPnBuZ19wdHI7Ci0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gKHBuZ19pbmZvcCltYWlucHJvZ19wdHItPmluZm9fcHRyOwotCi0KLSAgICAvKiBhcyBhbHdheXMsIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYQotICAgICAqIFBORy13cml0aW5nIGxpYnBuZyBmdW5jdGlvbiAqLwotCi0gICAgaWYgKHNldGptcChtYWlucHJvZ19wdHItPmptcGJ1ZikpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotICAgICAgICBtYWlucHJvZ19wdHItPnBuZ19wdHIgPSBOVUxMOwotICAgICAgICBtYWlucHJvZ19wdHItPmluZm9fcHRyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSAgICAvKiBjbG9zZSBvdXQgUE5HIGZpbGU7IGlmIHdlIGhhZCBhbnkgdGV4dCBvciB0aW1lIGluZm8gdG8gd3JpdGUgYWZ0ZXIKLSAgICAgKiB0aGUgSURBVHMsIHNlY29uZCBhcmd1bWVudCB3b3VsZCBiZSBpbmZvX3B0cjogKi8KLQotICAgIHBuZ193cml0ZV9lbmQocG5nX3B0ciwgTlVMTCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi12b2lkIHdyaXRlcG5nX2NsZWFudXAobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKQotewotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApbWFpbnByb2dfcHRyLT5wbmdfcHRyOwotICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IChwbmdfaW5mb3ApbWFpbnByb2dfcHRyLT5pbmZvX3B0cjsKLQotICAgIGlmIChwbmdfcHRyICYmIGluZm9fcHRyKQotICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQgd3JpdGVwbmdfZXJyb3JfaGFuZGxlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbXNnKQotewotICAgIG1haW5wcm9nX2luZm8gICptYWlucHJvZ19wdHI7Ci0KLSAgICAvKiBUaGlzIGZ1bmN0aW9uLCBhc2lkZSBmcm9tIHRoZSBleHRyYSBzdGVwIG9mIHJldHJpZXZpbmcgdGhlICJlcnJvcgotICAgICAqIHBvaW50ZXIiIChiZWxvdykgYW5kIHRoZSBmYWN0IHRoYXQgaXQgZXhpc3RzIHdpdGhpbiB0aGUgYXBwbGljYXRpb24KLSAgICAgKiByYXRoZXIgdGhhbiB3aXRoaW4gbGlicG5nLCBpcyBlc3NlbnRpYWxseSBpZGVudGljYWwgdG8gbGlicG5nJ3MKLSAgICAgKiBkZWZhdWx0IGVycm9yIGhhbmRsZXIuICBUaGUgc2Vjb25kIHBvaW50IGlzIGNyaXRpY2FsOiAgc2luY2UgYm90aAotICAgICAqIHNldGptcCgpIGFuZCBsb25nam1wKCkgYXJlIGNhbGxlZCBmcm9tIHRoZSBzYW1lIGNvZGUsIHRoZXkgYXJlCi0gICAgICogZ3VhcmFudGVlZCB0byBoYXZlIGNvbXBhdGlibGUgbm90aW9ucyBvZiBob3cgYmlnIGEgam1wX2J1ZiBpcywKLSAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgX0JTRF9TT1VSQ0Ugb3IgYW55dGhpbmcgZWxzZSBoYXMgKG9yIGhhcyBub3QpCi0gICAgICogYmVlbiBkZWZpbmVkLiAqLwotCi0gICAgZnByaW50ZihzdGRlcnIsICJ3cml0ZXBuZyBsaWJwbmcgZXJyb3I6ICVzXG4iLCBtc2cpOwotICAgIGZmbHVzaChzdGRlcnIpOwotCi0gICAgbWFpbnByb2dfcHRyID0gcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cik7Ci0gICAgaWYgKG1haW5wcm9nX3B0ciA9PSBOVUxMKSB7ICAgICAgICAgLyogd2UgYXJlIGNvbXBsZXRlbHkgaG9zZWQgbm93ICovCi0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICJ3cml0ZXBuZyBzZXZlcmUgZXJyb3I6ICBqbXBidWYgbm90IHJlY292ZXJhYmxlOyB0ZXJtaW5hdGluZy5cbiIpOwotICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgICAgZXhpdCg5OSk7Ci0gICAgfQotCi0gICAgbG9uZ2ptcChtYWlucHJvZ19wdHItPmptcGJ1ZiwgMSk7Ci19CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL3dyaXRlcG5nLmggYi9saWJzL2xpYnBuZy9jb250cmliL2dyZWdib29rL3dyaXRlcG5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Yjk2NmIuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9ncmVnYm9vay93cml0ZXBuZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHdwbmcgLSBzaW1wbGUgUE5HLXdyaXRpbmcgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVwbmcuaAotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCi0gICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycwotICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKLSAgICAgIHRoaXMgc29mdHdhcmUuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKLSAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQotICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgotCi0KLSAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6Ci0KLSAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQotICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCi0gICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KLSAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotCi0gICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwotICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKLSAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KLQotCi0gICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFRSVUUKLSMgIGRlZmluZSBUUlVFIDEKLSMgIGRlZmluZSBGQUxTRSAwCi0jZW5kaWYKLQotI2lmbmRlZiBNQVgKLSMgIGRlZmluZSBNQVgoYSxiKSAgKChhKSA+IChiKT8gKGEpIDogKGIpKQotIyAgZGVmaW5lIE1JTihhLGIpICAoKGEpIDwgKGIpPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0jICBkZWZpbmUgVHJhY2UoeCkgIHtmcHJpbnRmIHggOyBmZmx1c2goc3RkZXJyKTsgZmZsdXNoKHN0ZG91dCk7fQotI2Vsc2UKLSMgIGRlZmluZSBUcmFjZSh4KSAgOwotI2VuZGlmCi0KLSNkZWZpbmUgVEVYVF9USVRMRSAgICAweDAxCi0jZGVmaW5lIFRFWFRfQVVUSE9SICAgMHgwMgotI2RlZmluZSBURVhUX0RFU0MgICAgIDB4MDQKLSNkZWZpbmUgVEVYVF9DT1BZICAgICAweDA4Ci0jZGVmaW5lIFRFWFRfRU1BSUwgICAgMHgxMAotI2RlZmluZSBURVhUX1VSTCAgICAgIDB4MjAKLQotI2RlZmluZSBURVhUX1RJVExFX09GRlNFVCAgICAgICAgMAotI2RlZmluZSBURVhUX0FVVEhPUl9PRkZTRVQgICAgICA3MgotI2RlZmluZSBURVhUX0NPUFlfT0ZGU0VUICAgICAoMio3MikKLSNkZWZpbmUgVEVYVF9FTUFJTF9PRkZTRVQgICAgKDMqNzIpCi0jZGVmaW5lIFRFWFRfVVJMX09GRlNFVCAgICAgICg0KjcyKQotI2RlZmluZSBURVhUX0RFU0NfT0ZGU0VUICAgICAoNSo3MikKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWNoOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdXNoOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdWxnOwotCi10eXBlZGVmIHN0cnVjdCBfbWFpbnByb2dfaW5mbyB7Ci0gICAgZG91YmxlIGdhbW1hOwotICAgIGxvbmcgd2lkdGg7Ci0gICAgbG9uZyBoZWlnaHQ7Ci0gICAgdGltZV90IG1vZHRpbWU7Ci0gICAgRklMRSAqaW5maWxlOwotICAgIEZJTEUgKm91dGZpbGU7Ci0gICAgdm9pZCAqcG5nX3B0cjsKLSAgICB2b2lkICppbmZvX3B0cjsKLSAgICB1Y2ggKmltYWdlX2RhdGE7Ci0gICAgdWNoICoqcm93X3BvaW50ZXJzOwotICAgIGNoYXIgKnRpdGxlOwotICAgIGNoYXIgKmF1dGhvcjsKLSAgICBjaGFyICpkZXNjOwotICAgIGNoYXIgKmNvcHlyaWdodDsKLSAgICBjaGFyICplbWFpbDsKLSAgICBjaGFyICp1cmw7Ci0gICAgaW50IGZpbHRlcjsgICAgLyogY29tbWFuZC1saW5lLWZpbHRlciBmbGFnLCBub3QgUE5HIHJvdyBmaWx0ZXIhICovCi0gICAgaW50IHBubXR5cGU7Ci0gICAgaW50IHNhbXBsZV9kZXB0aDsKLSAgICBpbnQgaW50ZXJsYWNlZDsKLSAgICBpbnQgaGF2ZV9iZzsKLSAgICBpbnQgaGF2ZV90aW1lOwotICAgIGludCBoYXZlX3RleHQ7Ci0gICAgam1wX2J1ZiBqbXBidWY7Ci0gICAgdWNoIGJnX3JlZDsKLSAgICB1Y2ggYmdfZ3JlZW47Ci0gICAgdWNoIGJnX2JsdWU7Ci19IG1haW5wcm9nX2luZm87Ci0KLQotLyogcHJvdG90eXBlcyBmb3IgcHVibGljIGZ1bmN0aW9ucyBpbiB3cml0ZXBuZy5jICovCi0KLXZvaWQgd3JpdGVwbmdfdmVyc2lvbl9pbmZvKHZvaWQpOwotCi1pbnQgd3JpdGVwbmdfaW5pdChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpOwotCi1pbnQgd3JpdGVwbmdfZW5jb2RlX2ltYWdlKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cik7Ci0KLWludCB3cml0ZXBuZ19lbmNvZGVfcm93KG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cik7Ci0KLWludCB3cml0ZXBuZ19lbmNvZGVfZmluaXNoKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cik7Ci0KLXZvaWQgd3JpdGVwbmdfY2xlYW51cChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpOwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL1JFQURNRSBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTZlMGIuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotVGhpcyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBQTkdfVVNFUl9DT05GSUcgYW5kIHBuZ3Vzci5oCi0KLVRvIGJ1aWxkIGEgbWluaW1hbCByZWFkLW9ubHkgZGVjb2RlciB3aXRoIGVtYmVkZGVkIGxpYnBuZyBhbmQgemxpYiwgcnVuCi0KLSAgICBnYXRoZXIuc2ggICMgdG8gY29sbGVjdCBuZWVkZWQgZmlsZXMgZnJvbSBwbmdtaW51cywgbGlicG5nLCBhbmQgemxpYgotICAgIG1ha2UKLQotSWYgeW91IHByZWZlciB0byB1c2UgdGhlIHNoYXJlZCBsaWJyYXJpZXMsIGdvIHRvIGNvbnRyaWIvcG5nbWludXMKLWFuZCBidWlsZCB0aGUgcG5nMnBubSBhcHBsaWNhdGlvbiB0aGVyZS4gCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2RlY29kZXIvZ2F0aGVyLnNoIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL2dhdGhlci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzMGU4MS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2RlY29kZXIvZ2F0aGVyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1jcCAuLi8uLi9wbmdtaW51cy9wbmcycG5tLmMgcG5nbTJwbm0uYwotY3AgLi4vLi4vLi4vKi5oIC4KLWNwIC4uLy4uLy4uLyouYyAuCi1ybSBleGFtcGxlLmMgcG5nZ2NjcmQuYyBwbmd2Y3JkLmMgcG5ndGVzdC5jIHBuZ3ByZWFkLmMgcG5ndyouYwotIyBjaGFuZ2UgdGhlIGZvbGxvd2luZyAyIGxpbmVzIGlmIHpsaWIgaXMgc29tZXdoZXJlIGVsc2UKLWNwIC4uLy4uLy4uLy4uL3psaWIvKi5oIC4KLWNwIC4uLy4uLy4uLy4uL3psaWIvKi5jIC4KLXJtIG1pbmlnemlwLmMgZXhhbXBsZS5jIGNvbXByZXNzLmMgZGVmbGF0ZS5jIApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL3BuZ3Vzci5oIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL3BuZ3Vzci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGUzYjE5Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9wbmd1c3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIG1pbnJkcG5nY29uZi5oOiBoZWFkZXJzIHRvIG1ha2UgYSBtaW5pbWFsIHBuZy1yZWFkLW9ubHkgbGlicmFyeQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiBEZXJpdmVkIGZyb20gcG5nY3J1c2guaCwgQ29weXJpZ2h0IDE5OTgtMjAwNywgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKi8KLQotI2lmbmRlZiBNSU5SRFBOR0NPTkZfSAotI2RlZmluZSBNSU5SRFBOR0NPTkZfSAotCi0jaWZkZWYgTkpFVAotICAvKiBObyAxNi1iaXQgc3VwcG9ydCBiZXlvbmQgcmVhZGluZyB3aXRoIHN0cmlwXzE2ICovCi0jZW5kaWYKLQotI2RlZmluZSBQTkdfTk9fR0xPQkFMX0FSUkFZUwotCi0jZGVmaW5lIFBOR19OT19XQVJOSU5HUwotI2RlZmluZSBwbmdfd2FybmluZyhzMSxzMikgIiIKLSNkZWZpbmUgcG5nX2NodW5rX3dhcm5pbmcoczEsczIpICIiCi0jZGVmaW5lIFBOR19OT19FUlJPUl9URVhUCi0jZGVmaW5lIHBuZ19lcnJvcihzMSxzMikgcG5nX2VycihzMSkKLSNkZWZpbmUgcG5nX2NodW5rX2Vycm9yKHMxLHMyKSBwbmdfZXJyKHMxKQotCi0jZGVmaW5lIFBOR19OT19BU1NFTUJMRVJfQ09ERQotI2RlZmluZSBQTkdfTk9fT1BUSU1JWkVEX0NPREUKLSNkZWZpbmUgUE5HX05PX1JFQURfR0FNTUEKLSNkZWZpbmUgUE5HX05PX1JFQURfQkFDS0dST1VORAotI2RlZmluZSBQTkdfTk9fUkVBRF9ESVRIRVIKLSNkZWZpbmUgUE5HX05PX1JFQURfSU5WRVJUCi0jZGVmaW5lIFBOR19OT19SRUFEX1NISUZUCi0jZGVmaW5lIFBOR19OT19SRUFEX1BBQ0sKLSNkZWZpbmUgUE5HX05PX1JFQURfUEFDS1NXQVAKLSNkZWZpbmUgUE5HX05PX1JFQURfRklMTEVSCi0jZGVmaW5lIFBOR19OT19SRUFEX1NXQVAKLSNkZWZpbmUgUE5HX05PX1JFQURfU1dBUF9BTFBIQQotI2RlZmluZSBQTkdfTk9fUkVBRF9JTlZFUlRfQUxQSEEKLSNkZWZpbmUgUE5HX05PX1JFQURfUkdCX1RPX0dSQVkKLSNkZWZpbmUgUE5HX05PX1JFQURfVVNFUl9UUkFOU0ZPUk0KLSNkZWZpbmUgUE5HX05PX1JFQURfYktHRAotI2RlZmluZSBQTkdfTk9fUkVBRF9jSFJNCi0jZGVmaW5lIFBOR19OT19SRUFEX2dBTUEKLSNkZWZpbmUgUE5HX05PX1JFQURfaElTVAotI2RlZmluZSBQTkdfTk9fUkVBRF9pQ0NQCi0jZGVmaW5lIFBOR19OT19SRUFEX3BDQUwKLSNkZWZpbmUgUE5HX05PX1JFQURfcEhZcwotI2RlZmluZSBQTkdfTk9fUkVBRF9zQklUCi0jZGVmaW5lIFBOR19OT19SRUFEX3NDQUwKLSNkZWZpbmUgUE5HX05PX1JFQURfc1BMVAotI2RlZmluZSBQTkdfTk9fUkVBRF9zUkdCCi0jZGVmaW5lIFBOR19OT19SRUFEX1RFWFQKLSNkZWZpbmUgUE5HX05PX1JFQURfdElNRQotI2RlZmluZSBQTkdfTk9fUkVBRF9VTktOT1dOX0NIVU5LUwotI2RlZmluZSBQTkdfTk9fUkVBRF9VU0VSX0NIVU5LUwotI2RlZmluZSBQTkdfTk9fUkVBRF9FTVBUWV9QTFRFCi0jZGVmaW5lIFBOR19OT19SRUFEX09QVF9QTFRFCi0jZGVmaW5lIFBOR19OT19SRUFEX1NUUklQX0FMUEhBCi0jZGVmaW5lIFBOR19OT19SRUFEX29GRnMKLSNkZWZpbmUgUE5HX05PX1dBUk5fVU5JTklUSUFMSVpFRF9ST1cKLQotI2RlZmluZSBQTkdfTk9fV1JJVEVfU1VQUE9SVEVECi0KLSNkZWZpbmUgUE5HX05PX0lORk9fSU1BR0UKLSNkZWZpbmUgUE5HX05PX1VTRVJfTUVNCi0jZGVmaW5lIFBOR19OT19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSNkZWZpbmUgUE5HX05PX01OR19GRUFUVVJFUwotI2RlZmluZSBQTkdfTk9fVVNFUl9UUkFOU0ZPUk1fUFRSCi0jZGVmaW5lIFBOR19OT19IQU5ETEVfQVNfVU5LTk9XTgotI2RlZmluZSBQTkdfTk9fQ09OU09MRV9JTwotI2RlZmluZSBQTkdfTk9fWkFMTE9DX1pFUk8KLSNkZWZpbmUgUE5HX05PX0VSUk9SX05VTUJFUlMKLSNkZWZpbmUgUE5HX05PX0VBU1lfQUNDRVNTCi0jZGVmaW5lIFBOR19OT19QUk9HUkVTU0lWRV9SRUFECi0KLSNlbmRpZiAvKiBNSU5SRFBOR0NPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL1JFQURNRSBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyODU1NDQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotVGhpcyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBQTkdfVVNFUl9DT05GSUcgYW5kIHBuZ3Vzci5oCi0KLVRvIGJ1aWxkIGEgbWluaW1hbCB3cml0ZS1vbmx5IGRlY29kZXIgd2l0aCBlbWJlZGRlZCBsaWJwbmcgYW5kIHpsaWIsIHJ1bgotCi0gICAgZ2F0aGVyLnNoICAjIHRvIGNvbGxlY3QgbmVlZGVkIGZpbGVzIGZyb20gcG5nbWludXMsIGxpYnBuZywgYW5kIHpsaWIKLSAgICBtYWtlCi0gCi1JZiB5b3UgcHJlZmVyIHRvIHVzZSB0aGUgc2hhcmVkIGxpYnJhcmllcywgZ28gdG8gY29udHJpYi9wbmdtaW51cwotYW5kIGJ1aWxkIHRoZSBwbm0ycG5nIGFwcGxpY2F0aW9uIHRoZXJlLiAKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9kdW1teV9pbmZsYXRlLmMgYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2VuY29kZXIvZHVtbXlfaW5mbGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDIyZWRiLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9kdW1teV9pbmZsYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jaW5jbHVkZSAiemxpYi5oIgotCi1pbnQgWkVYUE9SVCBpbmZsYXRlKHN0cm0sIGZsdXNoKQotel9zdHJlYW1wIHN0cm07Ci1pbnQgZmx1c2g7Ci17IHJldHVybiBaX09LIDsgfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQoc3RybSkKLXpfc3RyZWFtcCBzdHJtOwoteyByZXR1cm4gWl9PSyA7IH0KLQotaW50IFpFWFBPUlQgaW5mbGF0ZUVuZChzdHJtKQotel9zdHJlYW1wIHN0cm07Ci17IHJldHVybiBaX1NUUkVBTV9FUlJPUiA7IH0KLQotaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfKHN0cm0sIHZlcnNpb24sIHN0cmVhbV9zaXplKQotel9zdHJlYW1wIHN0cm07Ci1jb25zdCBjaGFyICp2ZXJzaW9uOwotaW50IHN0cmVhbV9zaXplOwoteyByZXR1cm4gWl9PSyA7IH0KLQotaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyXyhzdHJtLCB3aW5kb3dCaXRzLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKLXpfc3RyZWFtcCBzdHJtOwotaW50IHdpbmRvd0JpdHM7Ci1jb25zdCBjaGFyICp2ZXJzaW9uOwotaW50IHN0cmVhbV9zaXplOwoteyByZXR1cm4gWl9TVFJFQU1fRVJST1IgOyB9CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2VuY29kZXIvZ2F0aGVyLnNoIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL2dhdGhlci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlMDRkYS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbmltL2VuY29kZXIvZ2F0aGVyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1jcCAuLi8uLi9wbmdtaW51cy9wbm0ycG5nLmMgcG5tMnBuZ20uYwotY3AgLi4vLi4vLi4vKi5oIC4KLWNwIC4uLy4uLy4uLyouYyAuCi1ybSBleGFtcGxlLmMgcG5nZ2NjcmQuYyBwbmd2Y3JkLmMgcG5ndGVzdC5jIHBuZ3IqLmMgcG5ncHJlYWQuYwotIyBDaGFuZ2UgdGhlIG5leHQgMiBsaW5lcyBpZiB6bGliIGlzIHNvbWV3aGVyZSBlbHNlLgotY3AgLi4vLi4vLi4vLi4vemxpYi8qLmggLgotY3AgLi4vLi4vLi4vLi4vemxpYi8qLmMgLgotcm0gaW5mKi5bY2hdCi1ybSBtaW5pZ3ppcC5jIGV4YW1wbGUuYwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5oIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTk1M2M2Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIG1pbndycG5nY29uZi5oOiBoZWFkZXJzIHRvIG1ha2UgYSBtaW5pbWFsIHBuZy13cml0ZS1vbmx5IGxpYnJhcnkKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotICogQ29weXJpZ2h0IChjKSAyMDA3IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICogRGVyaXZlZCBmcm9tIHBuZ2NydXNoLmgsIENvcHlyaWdodCAxOTk4LTIwMDcsIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICovCi0KLSNpZm5kZWYgTUlOV1JQTkdDT05GX0gKLSNkZWZpbmUgTUlOV1JQTkdDT05GX0gKLQotI2RlZmluZSBQTkdfTk9fR0xPQkFMX0FSUkFZUwotCi0jZGVmaW5lIFBOR19OT19SRUFEX1NVUFBPUlRFRAotCi0jZGVmaW5lIFBOR19OT19XQVJOSU5HUwotI2RlZmluZSBwbmdfd2FybmluZyhzMSxzMikgIiIKLSNkZWZpbmUgcG5nX2NodW5rX3dhcm5pbmcoczEsczIpICIiCi0jZGVmaW5lIFBOR19OT19FUlJPUl9URVhUCi0jZGVmaW5lIHBuZ19lcnJvcihzMSxzMikgcG5nX2VycihzMSkKLSNkZWZpbmUgcG5nX2NodW5rX2Vycm9yKHMxLHMyKSBwbmdfZXJyKHMxKQotCi0jZGVmaW5lIFBOR19OT19XUklURV9CQUNLR1JPVU5ECi0jZGVmaW5lIFBOR19OT19XUklURV9HQU1NQQotI2RlZmluZSBQTkdfTk9fV1JJVEVfRElUSEVSCi0jZGVmaW5lIFBOR19OT19XUklURV9JTlZFUlQKLSNkZWZpbmUgUE5HX05PX1dSSVRFX1NISUZUCi0jZGVmaW5lIFBOR19OT19XUklURV9QQUNLCi0jZGVmaW5lIFBOR19OT19XUklURV9QQUNLU1dBUAotI2RlZmluZSBQTkdfTk9fV1JJVEVfRklMTEVSCi0jZGVmaW5lIFBOR19OT19XUklURV9TV0FQCi0jZGVmaW5lIFBOR19OT19XUklURV9TV0FQX0FMUEhBCi0jZGVmaW5lIFBOR19OT19XUklURV9JTlZFUlRfQUxQSEEKLSNkZWZpbmUgUE5HX05PX1dSSVRFX1JHQl9UT19HUkFZCi0jZGVmaW5lIFBOR19OT19XUklURV9VU0VSX1RSQU5TRk9STQotI2RlZmluZSBQTkdfTk9fV1JJVEVfYktHRAotI2RlZmluZSBQTkdfTk9fV1JJVEVfY0hSTQotI2RlZmluZSBQTkdfTk9fV1JJVEVfZ0FNQQotI2RlZmluZSBQTkdfTk9fV1JJVEVfaElTVAotI2RlZmluZSBQTkdfTk9fV1JJVEVfaUNDUAotI2RlZmluZSBQTkdfTk9fV1JJVEVfb0ZGcwotI2RlZmluZSBQTkdfTk9fV1JJVEVfcENBTAotI2RlZmluZSBQTkdfTk9fV1JJVEVfcEhZcwotI2RlZmluZSBQTkdfTk9fV1JJVEVfc0JJVAotI2RlZmluZSBQTkdfTk9fV1JJVEVfc0NBTAotI2RlZmluZSBQTkdfTk9fV1JJVEVfc1BMVAotI2RlZmluZSBQTkdfTk9fV1JJVEVfc1JHQgotI2RlZmluZSBQTkdfTk9fV1JJVEVfVEVYVAotI2RlZmluZSBQTkdfTk9fV1JJVEVfdElNRQotI2RlZmluZSBQTkdfTk9fV1JJVEVfVU5LTk9XTl9DSFVOS1MKLSNkZWZpbmUgUE5HX05PX1dSSVRFX1VTRVJfQ0hVTktTCi0jZGVmaW5lIFBOR19OT19XUklURV9FTVBUWV9QTFRFCi0jZGVmaW5lIFBOR19OT19XUklURV9PUFRfUExURQotI2RlZmluZSBQTkdfTk9fV1JJVEVfRklMVEVSCi0jZGVmaW5lIFBOR19OT19XUklURV9XRUlHSFRFRF9GSUxURVIKLSNkZWZpbmUgUE5HX05PX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfTk9fV1JJVEVfRkxVU0gKLQotI2RlZmluZSBQTkdfTk9fSU5GT19JTUFHRQotI2RlZmluZSBQTkdfTk9fVVNFUl9NRU0KLSNkZWZpbmUgUE5HX05PX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfTk9fTU5HX0ZFQVRVUkVTCi0jZGVmaW5lIFBOR19OT19VU0VSX1RSQU5TRk9STV9QVFIKLSNkZWZpbmUgUE5HX05PX0hBTkRMRV9BU19VTktOT1dOCi0jZGVmaW5lIFBOR19OT19DT05TT0xFX0lPCi0jZGVmaW5lIFBOR19OT19aQUxMT0NfWkVSTwotI2RlZmluZSBQTkdfTk9fRVJST1JfTlVNQkVSUwotI2RlZmluZSBQTkdfTk9fRUFTWV9BQ0NFU1MKLQotI2VuZGlmIC8qIE1JTldSUE5HQ09ORl9IICovCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbmltL3ByZWFkZXIvUkVBRE1FIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3ZDY0MS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbmltL3ByZWFkZXIvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotVGhpcyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBQTkdfVVNFUl9DT05GSUcgYW5kIHBuZ3Vzci5oCi0KLVRvIGJ1aWxkIGEgbWluaW1hbCByZWFkLW9ubHkgcHJvZ3Jlc3NpdmUgZGVjb2RlciBlbWJlZGRlZCBsaWJwbmcgYW5kCi16bGliIGFuZCB3aXRoIHlvdXIgc3lzdGVtJ3MgWCBsaWJyYXJ5LCBydW4KLQotICAgIGdhdGhlci5zaCAjIHRvIGNvbGxlY3QgbmVlZGVkIGZpbGVzIGZyb20gZ3JlZ2Jvb2ssIGxpYnBuZywgYW5kIHpsaWIKLQotRWRpdCBtYWtlZmlsZSBpZiByZXF1aXJlZCwgdG8gZmluZCB5b3VyIFggbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcywKLXRoZW4KLSAgICAKLSAgICBtYWtlCi0gCi1JZiB5b3UgcHJlZmVyIHRvIHVzZSB0aGUgc2hhcmVkIGxpYnJhcmllcywgZ28gdG8gY29udHJpYi9ncmVnYm9vawotYW5kIGJ1aWxkIHRoZSBycG5nMi14IGFwcGxpY2F0aW9uIHRoZXJlLiAKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9nYXRoZXIuc2ggYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbmltL3ByZWFkZXIvZ2F0aGVyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTI5YTdiLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9nYXRoZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWNwIC4uLy4uL2dyZWdib29rL3JwbmcyLXguYyAuLi8uLi9ncmVnYm9vay9yZWFkcG5nMi5bY2hdIC4KLWNwIC4uLy4uL2dyZWdib29rL0NPUFlJTkcgLi4vLi4vZ3JlZ2Jvb2svTElDRU5TRSAuCi1jcCAuLi8uLi8uLi8qLmggLgotY3AgLi4vLi4vLi4vKi5jIC4KLXJtIGV4YW1wbGUuYyBwbmdnY2NyZC5jIHBuZ3ZjcmQuYyBwbmd0ZXN0LmMgcG5ndyouYwotIyBjaGFuZ2UgdGhlIGZvbGxvd2luZyAyIGxpbmVzIGlmIHpsaWIgaXMgc29tZXdoZXJlIGVsc2UKLWNwIC4uLy4uLy4uLy4uL3psaWIvKi5oIC4KLWNwIC4uLy4uLy4uLy4uL3psaWIvKi5jIC4KLXJtIG1pbmlnemlwLmMgZXhhbXBsZS5jIGNvbXByZXNzLmMgZGVmbGF0ZS5jIApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL3BuZ3Vzci5oIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL3BuZ3Vzci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2IwMDM4Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9wbmd1c3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIG1pbnJkcG5nY29uZi5oOiBoZWFkZXJzIHRvIG1ha2UgYSBtaW5pbWFsIHBuZy1yZWFkLW9ubHkgbGlicmFyeQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiBEZXJpdmVkIGZyb20gcG5nY3J1c2guaCwgQ29weXJpZ2h0IDE5OTgtMjAwNywgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKi8KLQotI2lmbmRlZiBNSU5SRFBOR0NPTkZfSAotI2RlZmluZSBNSU5SRFBOR0NPTkZfSAotCi0jZGVmaW5lIFBOR19OT19HTE9CQUxfQVJSQVlTCi0KLSNkZWZpbmUgUE5HX05PX1dBUk5JTkdTCi0jZGVmaW5lIHBuZ193YXJuaW5nKHMxLHMyKSAiIgotI2RlZmluZSBwbmdfY2h1bmtfd2FybmluZyhzMSxzMikgIiIKLSNkZWZpbmUgUE5HX05PX0VSUk9SX1RFWFQKLSNkZWZpbmUgcG5nX2Vycm9yKHMxLHMyKSBwbmdfZXJyKHMxKQotI2RlZmluZSBwbmdfY2h1bmtfZXJyb3IoczEsczIpIHBuZ19lcnIoczEpCi0KLSNkZWZpbmUgUE5HX05PX0FTU0VNQkxFUl9DT0RFCi0jZGVmaW5lIFBOR19OT19PUFRJTUlaRURfQ09ERQotI2RlZmluZSBQTkdfTk9fUkVBRF9ESVRIRVIKLSNkZWZpbmUgUE5HX05PX1JFQURfSU5WRVJUCi0jZGVmaW5lIFBOR19OT19SRUFEX1NISUZUCi0jZGVmaW5lIFBOR19OT19SRUFEX1BBQ0sKLSNkZWZpbmUgUE5HX05PX1JFQURfUEFDS1NXQVAKLSNkZWZpbmUgUE5HX05PX1JFQURfRklMTEVSCi0jZGVmaW5lIFBOR19OT19SRUFEX1NXQVAKLSNkZWZpbmUgUE5HX05PX1JFQURfU1dBUF9BTFBIQQotI2RlZmluZSBQTkdfTk9fUkVBRF9JTlZFUlRfQUxQSEEKLSNkZWZpbmUgUE5HX05PX1JFQURfUkdCX1RPX0dSQVkKLSNkZWZpbmUgUE5HX05PX1JFQURfVVNFUl9UUkFOU0ZPUk0KLSNkZWZpbmUgUE5HX05PX1JFQURfY0hSTQotI2RlZmluZSBQTkdfTk9fUkVBRF9oSVNUCi0jZGVmaW5lIFBOR19OT19SRUFEX2lDQ1AKLSNkZWZpbmUgUE5HX05PX1JFQURfcENBTAotI2RlZmluZSBQTkdfTk9fUkVBRF9wSFlzCi0jZGVmaW5lIFBOR19OT19SRUFEX3NCSVQKLSNkZWZpbmUgUE5HX05PX1JFQURfc0NBTAotI2RlZmluZSBQTkdfTk9fUkVBRF9zUExUCi0jZGVmaW5lIFBOR19OT19SRUFEX1RFWFQKLSNkZWZpbmUgUE5HX05PX1JFQURfdElNRQotI2RlZmluZSBQTkdfTk9fUkVBRF9VTktOT1dOX0NIVU5LUwotI2RlZmluZSBQTkdfTk9fUkVBRF9VU0VSX0NIVU5LUwotI2RlZmluZSBQTkdfTk9fUkVBRF9FTVBUWV9QTFRFCi0jZGVmaW5lIFBOR19OT19SRUFEX09QVF9QTFRFCi0jZGVmaW5lIFBOR19OT19SRUFEX1NUUklQX0FMUEhBCi0jZGVmaW5lIFBOR19OT19SRUFEX29GRnMKLSNkZWZpbmUgUE5HX05PX1dBUk5fVU5JTklUSUFMSVpFRF9ST1cKLQotI2RlZmluZSBQTkdfTk9fV1JJVEVfU1VQUE9SVEVECi0KLSNkZWZpbmUgUE5HX05PX0lORk9fSU1BR0UKLSNkZWZpbmUgUE5HX05PX1VTRVJfTUVNCi0jZGVmaW5lIFBOR19OT19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSNkZWZpbmUgUE5HX05PX01OR19GRUFUVVJFUwotI2RlZmluZSBQTkdfTk9fVVNFUl9UUkFOU0ZPUk1fUFRSCi0jZGVmaW5lIFBOR19OT19IQU5ETEVfQVNfVU5LTk9XTgotI2RlZmluZSBQTkdfTk9fQ09OU09MRV9JTwotI2RlZmluZSBQTkdfTk9fWkFMTE9DX1pFUk8KLSNkZWZpbmUgUE5HX05PX0VSUk9SX05VTUJFUlMKLSNkZWZpbmUgUE5HX05PX0VBU1lfQUNDRVNTCi0KLSNlbmRpZiAvKiBNSU5SRFBOR0NPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9SRUFETUUgYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlNzQwNy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi1QbmdNaW51cwotLS0tLS0tLS0KLShjb3B5cmlnaHQgV2lsbGVtIHZhbiBTY2hhaWssIDE5OTkpCi0KLQotTGljZW5zZQotLS0tLS0tLQotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAotaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKLXByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCi10aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAotZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotCi0KLVNvbWUgaGlzdG9yeQotLS0tLS0tLS0tLS0tCi1Tb29uIGFmdGVyIHRoZSBjcmVhdGlvbiBvZiBQTkcgaW4gMTk5NSwgdGhlIG5lZWQgd2FzIGZlbHQgZm9yIGEgc2V0IG9mCi1wbm10b3BuZyAvIHBuZ3RvcG5tIHV0aWxpdGllcy4gSW5kZXBlbmRhbnRseSBBbGV4YW5kZXIgTGVobWFubiBhbmQgSQotKFdpbGxlbSB2YW4gU2NoYWlrKSBzdGFydGVkIHN1Y2ggYSBwcm9qZWN0LiBMdWNraWx5IHdlIGRpc2NvdmVyZWQgdGhpcwotYW5kIG1lcmdlZCB0aGUgdHdvIHRvZ2V0aGVyIGludG8gcG5tdG9wbmcudGFyLmd6LCB3aGljaCBpcyBhdmFpbGFibGUKLWZyb20gYS9vIGZ0cDovL2Z0cC5zaW1wbGVzeXN0ZW1zLm9yZy9wdWIvbGlicG5nL3BuZy8uCi0KLVRoZXNlIHR3byB1dGlsaXRpZXMgaGF2ZSBtYW55LCBtYW55IG9wdGlvbnMgYW5kIG1ha2UgdXNlIG9mIG1vc3Qgb2YgdGhlCi1mZWF0dXJlcyBvZiBQTkcsIGxpa2UgZ2FtbWEsIGFscGhhLCBzYml0LCB0ZXh0LWNodW5rcywgZXRjLiBUaGlzIG1ha2VzCi10aGUgdXRpbGl0aWVzIHF1aXRlIGNvbXBsZXggYW5kIGJ5IG5vdyBub3QgYW55bW9yZSB2ZXJ5IG1haW50YWluYWJsZS4KLVdoZW4gd2Ugd3JvdGUgdGhlc2UgcHJvZ3JhbXMsIGxpYnBuZyB3YXMgc3RpbGwgaW4gYW4gZWFybHkgc3RhZ2UuCi1UaGVyZWZvcmUsIGxvdHMgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgdGhhdCB3ZSBwdXQgaW4gb3VyIHNvZnR3YXJlIGNhbiBub3cKLWJlIGRvbmUgdXNpbmcgdHJhbnNmb3JtLWZ1bmN0aW9ucyBpbiBsaWJwbmcuCi0KLUZpbmFsbHksIHRvIGNvbXBpbGUgdGhlc2UgcHJvZ3JhbXMsIHlvdSBuZWVkIHRvIGhhdmUgaW5zdGFsbGVkIGFuZAotY29tcGlsZWQgdGhyZWUgbGlicmFyaWVzOiBsaWJwbmcsIHpsaWIgYW5kIG5ldHBibS4gRXNwZWNpYWxseSB0aGUgbGF0dGVyCi1tYWtlcyB0aGUgd2hvbGUgc2V0dXAgYSBiaXQgYnVsa3kuIEJ1dCB0aGF0J3MgdW5hdm9pZGFibGUgZ2l2ZW4gdGhlIG1hbnkKLWZlYXR1cmVzIG9mIHBubXRvcG5nLgotCi0KLVdoYXQgbm93Ci0tLS0tLS0tLQotQXQgdGhpcyBtb21lbnQgbGlicG5nIGlzIGluIGEgdmVyeSBzdGFibGUgc3RhdGUgYW5kIGNhbiBkbyBtdWNoIG9mIHRoZQotd29yayBkb25lIGluIHBubXRvcG5nLiBBbHNvLCBwbm10b3BuZyBuZWVkcyB0byBiZSB1cGdyYWRlZCB0byB0aGUgbmV3Ci1pbnRlcmZhY2Ugb2YgbGlicG5nLiBIZW5jZSwgaXQgaXMgdGltZSBmb3IgYSByZXdyaXRlIGZyb20gdGhlIGdyb3VuZCB1cAotb2YgcG5tdG9wbmcgYW5kIHBuZ3RvcG5tLiBUaGlzIHdpbGwgaGFwcGVuIGluIHRoZSBuZWFyIGZ1dHVyZSAoc3RheQotdHVuZWQpLiBUaGUgbmV3IHBhY2thZ2Ugd2lsbCBnZXQgYSBkaWZmZXJlbnQgbmFtZSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tCi10aGUgb2xkIG9uZTogUG5nUGx1cy4KLQotVG8gZXhwZXJpbWVudCBhIGJpdCB3aXRoIHRoZSBuZXcgaW50ZXJmYWNlIG9mIGxpYnBuZywgSSBzdGFydGVkIG9mZiB3aXRoCi1hIHNtYWxsIHByb3RvdHlwZSB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkuIEl0IGRvZXNuJ3QKLWhhdmUgYW55IG9mIHRoZSBvcHRpb25zIHRvIHJlYWQgb3Igd3JpdGUgc3BlY2lhbCBjaHVua3MgYW5kIGl0IHdpbGwgZG8KLW5vIGdhbW1hIGNvcnJlY3Rpb24uIEJ1dCB0aGlzIG1ha2VzIGl0IGFsc28gYSBzaW1wbGUgcHJvZ3JhbSB0aGF0IGlzCi1xdWl0ZSBlYXN5IHRvIHVuZGVyc3RhbmQgYW5kIGNhbiBzZXJ2ZSB3ZWxsIGFzIGEgdGVtcGxhdGUgZm9yIG90aGVyCi1zb2Z0d2FyZSBkZXZlbG9wbWVudHMuIChCeSBub3cgdGhlcmUgYXJlIG9mIGNvdXJzZSBhIGNvdXBsZSBvZiBwcm9ncmFtcywKLWxpa2UgR3JlZyBSb2Vsb2ZzJyBycG5nL3dwbmcsIHRoYXQgY2FuIGJlIHVzZWQganVzdCBhcyBnb29kLikKLQotCi1DYW4gYW5kIGNhbiBub3QKLS0tLS0tLS0tLS0tLS0tLQotQXMgdGhpcyBpcyB0aGUgc21hbGwgYnJvdGhlciBvZiB0aGUgZnV0dXJlIFBuZ1BsdXMsIEkgY2FsbGVkIHRoaXMgZmVsbG93Ci1QbmdNaW51cy4gQmVjYXVzZSBJIHN0YXJ0ZWQgdGhpcyBkZXZlbG9wbWVudCBpbiBnb29kLW9sZCBUdXJiby1DLCBJCi1hdm9pZGVkIHRoZSB1c2UgdGhlIG5ldHBibSBsaWJyYXJ5LCB3aGljaCByZXF1aXJlcyBET1MgZXh0ZW5kZXJzLiBBZ2FpbiwKLWFub3RoZXIgcmVhc29uIHRvIGNhbGwgaXQgUG5nTWludXMgKG1pbnVzIG5ldHBibSA6LSkuIFNvLCBwYXJ0IG9mIHRoZQotcHJvZ3JhbSBhcmUgc29tZSBlbGVtZW50YXJ5IHJvdXRpbmVzIHRvIHJlYWQgLyB3cml0ZSBwZ20tIGFuZCBwcG0tZmlsZXMuCi1JdCBkb2VzIG5vdCByZWFkIGImdyBwYm0tZmlsZXMuCi0KLVRoZSBkb3duc2lkZSBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgeW91IGNhbiBub3QgdXNlIHRoZW0gb24gaW1hZ2VzCi10aGF0IHJlcXVpcmUgYmxvY2tzIG9mIG1lbW9yeSBiaWdnZXIgdGhhbiA2NGsgKHRoZSBET1MgdmVyc2lvbikuIEZvcgotbGFyZ2VyIGltYWdlcyB5b3Ugd2lsbCBnZXQgYW4gb3V0LW9mLW1lbW9yeSBlcnJvci4KLQotQXMgc2FpZCBiZWZvcmUsIFBuZ01pbnVzIGRvZXNuJ3QgY29ycmVjdCBmb3IgZ2FtbWEuIFdoZW4gcmVhZGluZwotcG5nLWZpbGVzIHlvdSBjYW4gZG8gdGhpcyBqdXN0IGFzIHdlbGwgYnkgcGlwaW5nIHRoZSBvdXRwdXQgb2YgcG5nMnBubQotdG8gcG5tZ2FtbWEsIG9uZSBvZiB0aGUgc3RhbmRhcmQgUGJtUGx1cyB0b29scy4gVGhpcyBzYW1lIHNjZW5hcmlvIHdpbGwKLW1vc3QgcHJvYmFibHkgYWxzbyBiZSBmb2xsb3dlZCBpbiB0aGUgZnVsbC1ibG93biBmdXR1cmUgUG5nUGx1cywgd2l0aAotdGhlIGFkZGl0aW9uIG9mIGNvdXJzZSBvZiB0aGUgcG9zc2liaWxpdHkgdG8gY3JlYXRlIGdhbW1hLWNodW5rcyB3aGVuCi13cml0aW5nIHBuZy1maWxlcy4KLQotT24gdGhlIG90aGVyIGhhbmQgaXQgc3VwcG9ydHMgYWxwaGEtY2hhbm5lbHMuIFdoZW4gcmVhZGluZyBhIHBuZy1pbWFnZQoteW91IGNhbiB3cml0ZSB0aGUgYWxwaGEtY2hhbm5lbCBpbnRvIGEgcGdtLWZpbGUuIEFuZCB3aGVuIGNyZWF0aW5nIGFuCi1SR0IrQSBwbmctaW1hZ2UsIHlvdSBqdXN0IGNvbWJpbmUgYSBwcG0tZmlsZSB3aXRoIGEgY29ycmVzcG9uZGluZwotcGdtLWZpbGUgY29udGFpbmluZyB0aGUgYWxwaGEtY2hhbm5lbC4gV2hlbiByZWFkaW5nLCB0cmFuc3BhcmVuY3kgY2h1bmtzCi1hcmUgY29udmVydGVkIGludG8gYW4gYWxwaGEtY2hhbm5lbCBhbmQgZnJvbSB0aGVyZSBvbiB0cmVhdGVkIHRoZSBzYW1lCi13YXkuCi0KLUZpbmFsbHkgeW91IGNhbiBvcHQgZm9yIHdyaXRpbmcgYXNjaWkgb3IgYmluYXJ5IHBnbS0gYW5kIHBwbS1maWxlcy4gV2hlbgotdGhlIGJpdC1kZXB0aCBpcyAxNiwgdGhlIGZvcm1hdCB3aWxsIGFsd2F5cyBiZSBhc2NpaS4KLQotCi1Vc2luZyBpdAotLS0tLS0tLS0KLVRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbSBwbm10b3BuZyBhbmQgUG5nUGx1cywgdGhlIHV0aWxpdGllcyBhcmUgbmFtZWQKLXBuZzJwbm0gYW5kIHBubTJwbmcgKDIgaW5zdGVhZCBvZiB0bykuIFRoZSBpbnB1dC0gYW5kIG91dHB1dC1maWxlcyBjYW4KLWJlIGdpdmVuIGFzIHBhcmFtZXRlcnMgb3IgdGhyb3VnaCByZWRpcmVjdGlvbi4gVGhlcmVmb3JlIHRoZSBwcm9ncmFtcwotY2FuIGJlIHBhcnQgb2YgYSBwaXBlLgotCi1UbyBsaXN0IHRoZSBvcHRpb25zIHR5cGUgInBuZzJwbm0gLWgiIG9yICJwbm0ycG5nIC1oIi4KLQotCi1KdXN0IGxpa2UgU2NhbmRpbmF2aWFuIGZ1cm5pdHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVlvdSBoYXZlIHRvIHB1dCBpdCB0b2dldGhlciB5b3Vyc2VsZi4gSSBkaWQgdGVzdCB0aGUgc29mdHdhcmUgdW5kZXIKLU1TLURPUyB3aXRoIFR1cmJvLUMgMy4wIGFuZCB1bmRlciBSZWRIYXQgTGludXggNC4yIHdpdGggZ2NjLiBJbiBib3RoCi1jYXNlcyBJIHVzZWQgbGlicG5nLTEuMC40IGFuZCB6bGliLTEuMS4zLiBMYXRlciB2ZXJzaW9ucyBzaG91bGQgYmUgT0ssCi1ob3dldmVyIHNvbWUgb2xkZXIgbGlicG5nIHZlcnNpb25zIGhhdmUgYSBidWcgaW4gcG5nbWVtLmMgd2hlbiB1c2luZwotVHVyYm8tQyAzLjAgKHNlZSBiZWxvdykuCi0KLVlvdSBjYW4gYnVpbGQgaXQgdXNpbmcgb25lIG9mIHRoZSB0d28gbWFrZWZpbGVzIChtYWtlIC1mIG1ha2VmaWxlLiMjIykKLW9yIHVzZSB0aGUgYmF0Y2gvc2NyaXB0IGZpbGVzIHBuZ21pbnVzLmJhdCAvIHBuZ21pbnVzLnNoLiBUaGlzIGFzc3VtZXMKLXRoYXQgeW91IGhhdmUgYnVpbHQgdGhlIGxpYnJhcmllcyBpbiAuLi9saWJwbmcgYW5kIC4uL3psaWIuIFVzaW5nIExpbnV4LAotbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYnVpbHQgbGlicG5nIHdpdGggbWFrZWZpbGUuc3RkIGFuZCBub3QKLW1ha2VmaWxlLmxpbnV4IChhbHNvIGNhbGxlZCAubG54IGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgbGlicG5nKS4gVGhlCi1sYXR0ZXIgY3JlYXRlcyBhIC5zbyBzaGFyZWQtbGlicmFyeSwgd2hpbGUgdGhlIFBuZ01pbnVzIG1ha2VmaWxlIGFzc3VtZXMKLWEgbm9ybWFsIC5hIHN0YXRpYyBsaWJyYXJ5LgotCi1JZiB5b3UgY3JlYXRlIGEgLi4vcG5nc3VpdGUgZGlyZWN0b3J5IGFuZCB0aGVuIHN0b3JlIHRoZSBiYXNuIyMjIy5wbmcKLWZpbGVzIGZyb20gUG5nU3VpdGUgKGh0dHA6Ly93d3cuc2NoYWlrLmNvbS9wbmdzdWl0ZS8pIGluIHRoZXJlLCB5b3UgY2FuCi10ZXN0IGluIG9uZSBnbyB0aGUgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIFBuZ01pbnVzLCBzZWUgcG5nMnBubS5iYXQgYW5kCi1wbm0ycG5nLmJhdCAob3IgdGhlIC5zaCB2ZXJzaW9ucykuCi0KLQotV2FycmFudHkKLS0tLS0tLS0KLVBsZWFzZSwgcmVtZW1iZXIgdGhhdCB0aGlzIHdhcyBqdXN0IGEgc21hbGwgZXhwZXJpbWVudCB0byBsZWFybiBhIGZldwotdGhpbmdzLiBJdCB3aWxsIGhhdmUgbWFueSB1bmZvcmVzZWVuIGZlYXR1cmVzIDx2Ymc+LiBXaG8gc2FpZCBidWdzPyBVc2UKLWl0IHdoZW4geW91IGFyZSBpbiBuZWVkIGZvciBzb21ldGhpbmcgc2ltcGxlIG9yIHdoZW4geW91IHdhbnQgdG8gc3RhcnQKLWRldmVsb3BpbmcgeW91ciBvd24gc3R1ZmYuCi0KLQotVGhlIFR1cmJvIGJ1ZwotLS0tLS0tLS0tLS0tLQotKiogcG5nbWVtLm9sZAotICAgICAgICAgIGhwdHIgPSAocG5nX2J5dGUgaHVnZSAqKSgobG9uZykoaHB0cikgJiAweGZmZmZmZmYwTCk7Ci0gICAgICAgICAgaHB0ciArPSAxNkw7Ci0qKiBwbmdtZW0uYwotICAgICAgICAgIGhwdHIgPSAocG5nX2J5dGUgaHVnZSAqKSgobG9uZykoaHB0cikgJiAweGZmZmZmZmYwTCk7Ci0gICAgICAgICAgaHB0ciA9IGhwdHIgKyAxNkw7Ci0qKgotCi0qKiBwbmdtZW0ub2xkCi0gICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0cltpXSA9IChwbmdfYnl0ZXApaHB0cjsKLSAgICAgICAgICBocHRyICs9IChwbmdfdWludF8zMik2NTUzNkw7Ci0qKiBwbmdtZW0uYwotICAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZV9wdHJbaV0gPSAocG5nX2J5dGVwKWhwdHI7Ci0gICAgICAgICAgaHB0ciA9IGhwdHIgKyA2NTUzNkw7Ci0qKgotCi0KLVRoZSBlbmQKLS0tLS0tLS0KLVdpbGxlbSB2YW4gU2NoYWlrCi1tYWlsdG86d2lsbGVtQHNjaGFpay5jb20KLWh0dHA6Ly93d3cuc2NoYWlrLmNvbS9wbmcvCi0tLS0tLS0tCi1PY3QgMTk5OQotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnN0ZCBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvbWFrZWZpbGUuc3RkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmIwNjFiLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvbWFrZWZpbGUuc3RkCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgUG5nTWludXMgKHBuZzJwbm0gYW5kIHBubTJwbmcpCi0jIExpbnV4IC8gVW5peAotCi0jQ0M9Y2MKLUNDPWdjYwotTEQ9JChDQykKLQotUk09cm0gLWYKLQotI1BOR1BBVEggPSAvdXNyL2xvY2FsCi0jUE5HSU5DID0gLUkkKFBOR1BBVEgpL2luY2x1ZGUvbGlicG5nMTIKLSNQTkdMSUIgPSAtTCQoUE5HUEFUSCkvbGliIC1scG5nMTIKLSNQTkdMSUJTID0gJChQTkdQQVRIKS9saWIvbGlicG5nMTIuYQotUE5HSU5DID0gLUkuLi8uLgotUE5HTElCID0gLUwuLi8uLiAtbHBuZwotUE5HTElCUyA9IC4uLy4uL2xpYnBuZy5hCi0KLSNaUEFUSCA9IC91c3IvbG9jYWwKLSNaSU5DID0gLUkkKFpQQVRIKS9pbmNsdWRlCi0jWkxJQiA9IC1MJChaUEFUSCkvbGliIC1segotI1pMSUJTID0gJChaUEFUSCkvbGliL2xpYnouYQotWklOQyA9IC1JLi4vLi4vLi4vemxpYgotWkxJQiA9IC1MLi4vLi4vLi4vemxpYiAtbHoKLVpMSUJTID0gLi4vLi4vLi4vemxpYi9saWJ6LmEKLQotQ0ZMQUdTPS1PMyAkKFBOR0lOQykgJChaSU5DKQotTERGTEFHUz0kKFBOR0xJQikgJChaTElCKQotTERGTEFHU1M9JChQTkdMSUJTKSAkKFpMSUJTKQotQz0uYwotTz0ubwotTD0uYQotRT0KLQotIyBkZXBlbmRlbmNpZXMKLQotI2FsbDogcG5nMnBubSQoRSkgcG5tMnBuZyQoRSkKLWFsbDogcG5nMnBubSQoRSkgcG5tMnBuZyQoRSkgcG5nMnBubS1zdGF0aWMkKEUpIHBubTJwbmctc3RhdGljJChFKQotCi1wbmcycG5tJChPKTogcG5nMnBubSQoQykKLQkkKENDKSAtYyAkKENGTEFHUykgcG5nMnBubSQoQykKLQotcG5nMnBubSQoRSk6IHBuZzJwbm0kKE8pCi0JJChMRCkgLW8gcG5nMnBubSQoRSkgcG5nMnBubSQoTykgJChMREZMQUdTKSAtbG0KLQotcG5nMnBubS1zdGF0aWMkKEUpOiBwbmcycG5tJChPKQotCSQoTEQpIC1vIHBuZzJwbm0tc3RhdGljJChFKSBwbmcycG5tJChPKSAkKExERkxBR1NTKSAtbG0KLQotcG5tMnBuZyQoTyk6IHBubTJwbmckKEMpCi0JJChDQykgLWMgJChDRkxBR1MpIHBubTJwbmckKEMpCi0KLXBubTJwbmckKEUpOiBwbm0ycG5nJChPKQotCSQoTEQpIC1vIHBubTJwbmckKEUpIHBubTJwbmckKE8pICQoTERGTEFHUykgLWxtCi0KLXBubTJwbmctc3RhdGljJChFKTogcG5tMnBuZyQoTykKLQkkKExEKSAtbyBwbm0ycG5nLXN0YXRpYyQoRSkgcG5tMnBuZyQoTykgJChMREZMQUdTUykgLWxtCi0KLWNsZWFuOgotCSQoUk0pIHBuZzJwbm0kKE8pCi0JJChSTSkgcG5tMnBuZyQoTykKLQkkKFJNKSBwbmcycG5tJChFKQotCSQoUk0pIHBubTJwbmckKEUpCi0JJChSTSkgcG5nMnBubS1zdGF0aWMkKEUpCi0JJChSTSkgcG5tMnBuZy1zdGF0aWMkKEUpCi0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBwbmcycG5tIC8gcG5tMnBuZwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtlZmlsZS50YzMgYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnRjMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0ZjE4ZC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnRjMworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIFBuZ01pbnVzIChwbmcycG5tIGFuZCBwbm0ycG5nKQotIyBUdXJib0MrKyAzLjAKLQotQ0M9dGNjIC1JYzpcdGMzXGluYwotTEQ9dGNjIC1MYzpcdGMzXGxpYgotTEI9dGxpYgotUk09ZGVsCi1DUD1jb3B5Ci1NT0RFTD1sCi1DQ0ZMQUdTPS1PIC1tJChNT0RFTCkgLUkuLlxsaWJwbmcgLUkuLlx6bGliCi1MREZMQUdTPS1tJChNT0RFTCkgLUwuLlxsaWJwbmcgLUwuLlx6bGliCi1DPS5jCi1PPS5vYmoKLUw9LmxpYgotRT0uZXhlCi0KLSMgZGVwZW5kZW5jaWVzCi0KLWFsbDogcG5nMnBubSQoRSkgcG5tMnBuZyQoRSkKLQotcG5nMnBubSQoTyk6IHBuZzJwbm0kKEMpCi0gICAgICAgICQoQ0MpIC1jICQoQ0NGTEFHUykgcG5nMnBubSQoQykKLQotcG5nMnBubSQoRSk6IHBuZzJwbm0kKE8pCi0gICAgICAgICQoTEQpICQoTERGTEFHUykgcG5nMnBubSQoTykgbGlicG5nJChMKSB6bGliJChMKQotCi1wbm0ycG5nJChPKTogcG5tMnBuZyQoQykKLSAgICAgICAgJChDQykgLWMgJChDQ0ZMQUdTKSBwbm0ycG5nJChDKQotCi1wbm0ycG5nJChFKTogcG5tMnBuZyQoTykKLSAgICAgICAgJChMRCkgJChMREZMQUdTKSBwbm0ycG5nJChPKSBsaWJwbmckKEwpIHpsaWIkKEwpCi0KLWNsZWFuOgotICAgICAgICAkKFJNKSAqJChPKQotICAgICAgICAkKFJNKSAqJChFKQotCi0jIEVuZCBvZiBtYWtlZmlsZSBmb3IgcG5nMnBubSAvIHBubTJwbmcKLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtldm1zLmNvbSBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvbWFrZXZtcy5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNTYxYmMuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9tYWtldm1zLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLSQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kISBtYWtlIENvbnRyaWIgcHJvZ3JhbXMgb2YgbGlicG5nIHVuZGVyIE9wZW5WTVMKLSQhCi0kIQotJCEgTG9vayBmb3IgdGhlIGNvbXBpbGVyIHVzZWQKLSQhCi0kIHpsaWJzcmMgPSAiWy0tLS56bGliXSIKLSQgY2NvcHQ9Ii9pbmNsdWRlPSgnJ3psaWJzcmMnLFstLV0pIgotJCBpZiBmJGdldHN5aSgiSFdfTU9ERUwiKS5nZS4xMDI0Ci0kIHRoZW4KLSQgIGNjb3B0ID0gIi9wcmVmaXg9YWxsIitjY29wdAotJCAgY29tcCAgPSAiX19kZWNjX189MSIKLSQgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgotJCBlbHNlCi0kICBpZiBmJHNlYXJjaCgiU1lTJFNZU1RFTTpERUNDJENPTVBJTEVSLkVYRSIpLmVxcy4iIgotJCAgIHRoZW4KLSQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6Ci0kICAgIGlmIGYkc2VhcmNoKCJTWVMkU1lTVEVNOlZBWEMuRVhFIikuZXFzLiIiCi0kICAgICB0aGVuCi0kICAgICAgY29tcCAgPSAiX19nY2NfXz0xIgotJCAgICAgIENDIDo9PSBHQ0MKLSQgICAgIGVsc2UKLSQgICAgICBjb21wID0gIl9fdmF4Y19fPTEiCi0kICAgICBlbmRpZgotJCAgIGVsc2UKLSQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgZGVjYyRsaWJyYXJ5X2luY2x1ZGU6Ci0kICAgIGNjb3B0ID0gIi9kZWNjL3ByZWZpeD1hbGwiK2Njb3B0Ci0kICAgIGNvbXAgID0gIl9fZGVjY19fPTEiCi0kICBlbmRpZgotJCBlbmRpZgotJCBvcGVuL3dyaXRlIGxvcHQgbGliLm9wdAotJCB3cml0ZSBsb3B0ICJbLS1dbGlicG5nLm9sYi9saWIiCi0kIHdyaXRlIGxvcHQgIicnemxpYnNyYydsaWJ6Lm9sYi9saWIiCi0kIGNsb3NlIGxvcHQKLSQgb3Blbi93cml0ZSB4b3B0IHgxMS5vcHQKLSQgd3JpdGUgeG9wdCAic3lzJGxpYnJhcnk6ZGVjdyR4bGlic2hyLmV4ZS9zaGFyZSIKLSQgY2xvc2UgeG9wdAotJCB3cml0ZSBzeXMkb3V0cHV0ICJDb21waWxpbmcgUE5HIGNvbnRyaWIgcHJvZ3JhbXMgLi4uIgotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHBubTJwbmcuLi4iCi0kICAgQ0FMTCBNQUtFIHBubTJwbmcuT0JKICJjYyAnJ0NDT1BUJyBwbm0ycG5nIiAtCi0JcG5tMnBuZy5jCi0kICAgY2FsbCBtYWtlIHBubTJwbmcuZXhlIC0KLQkiTElOSyBwbm0ycG5nLGxpYi5vcHQvb3B0IiAtCi0JcG5tMnBuZy5vYmoKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBwbmcycG5tLi4uIgotJCAgIENBTEwgTUFLRSBwbmcycG5tLk9CSiAiY2MgJydDQ09QVCcgcG5nMnBubSIgLQotCXBuZzJwbm0uYwotJCAgIGNhbGwgbWFrZSBwbmcycG5tLmV4ZSAtCi0JIkxJTksgcG5nMnBubSxsaWIub3B0L29wdCIgLQotCXBuZzJwbm0ub2JqCi0kIGV4aXQKLSQhCi0kIQotJE1BS0U6IFNVQlJPVVRJTkUgICAhU1VCUk9VVElORSBUTyBDSEVDSyBERVBFTkRFTkNJRVMKLSQgViA9ICdGJFZlcmlmeSgwKQotJCEgUDEgPSBXaGF0IHdlIGFyZSB0cnlpbmcgdG8gbWFrZQotJCEgUDIgPSBDb21tYW5kIHRvIG1ha2UgaXQKLSQhIFAzIC0gUDggIFdoYXQgaXQgZGVwZW5kcyBvbgotJAotJCBJZiBGJFNlYXJjaChQMSkgLkVxcy4gIiIgVGhlbiBHb3RvIE1ha2VpdAotJCBUaW1lID0gRiRDdlRpbWUoRiRGaWxlKFAxLCJSRFQiKSkKLSRhcmc9MwotJExvb3A6Ci0kICAgICAgIEFyZ3VtZW50ID0gUCdhcmcKLSQgICAgICAgSWYgQXJndW1lbnQgLkVxcy4gIiIgVGhlbiBHb3RvIEV4aXQKLSQgICAgICAgRWw9MAotJExvb3AyOgotJCAgICAgICBGaWxlID0gRiRFbGVtZW50KEVsLCIgIixBcmd1bWVudCkKLSQgICAgICAgSWYgRmlsZSAuRXFzLiAiICIgVGhlbiBHb3RvIEVuZGwKLSQgICAgICAgQUZpbGUgPSAiIgotJExvb3AzOgotJCAgICAgICBPRmlsZSA9IEFGaWxlCi0kICAgICAgIEFGaWxlID0gRiRTZWFyY2goRmlsZSkKLSQgICAgICAgSWYgQUZpbGUgLkVxcy4gIiIgLk9yLiBBRmlsZSAuRXFzLiBPRmlsZSBUaGVuIEdvdG8gTmV4dEVsCi0kICAgICAgIElmIEYkQ3ZUaW1lKEYkRmlsZShBRmlsZSwiUkRUIikpIC5HZXMuIFRpbWUgVGhlbiBHb3RvIE1ha2VpdAotJCAgICAgICBHb3RvIExvb3AzCi0kTmV4dEVMOgotJCAgICAgICBFbCA9IEVsICsgMQotJCAgICAgICBHb3RvIExvb3AyCi0kRW5kTDoKLSQgYXJnPWFyZysxCi0kIElmIGFyZyAuTGUuIDggVGhlbiBHb3RvIExvb3AKLSQgR290byBFeGl0Ci0kCi0kTWFrZWl0OgotJCBWVj1GJFZFUklGWSgwKQotJCB3cml0ZSBzeXMkb3V0cHV0IFAyCi0kICdQMgotJCBWVj0nRiRWZXJpZnkoVlYpCi0kRXhpdDoKLSQgSWYgViBUaGVuIFNldCBWZXJpZnkKLSRFTkRTVUJST1VUSU5FCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZzJwbm0uYmF0IGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbmcycG5tLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5Y2YzNi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZzJwbm0uYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotUkVNIC0tIGdyYXlzY2FsZQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzAxLnBuZyBiYXNuMGcwMS5wZ20KLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuMGcwMi5wbmcgYmFzbjBnMDIucGdtCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDQucG5nIGJhc24wZzA0LnBnbQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzA4LnBuZyBiYXNuMGcwOC5wZ20KLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuMGcxNi5wbmcgYmFzbjBnMTYucGdtCi1SRU0gLS0gZnVsbC1jb2xvcgotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24yYzA4LnBuZyBiYXNuMmMwOC5wcG0KLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuMmMxNi5wbmcgYmFzbjJjMTYucHBtCi1SRU0gLS0gcGFsbGV0dGVkCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDEucG5nIGJhc24zcDAxLnBwbQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24zcDAyLnBuZyBiYXNuM3AwMi5wcG0KLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuM3AwNC5wbmcgYmFzbjNwMDQucHBtCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDgucG5nIGJhc24zcDA4LnBwbQotUkVNIC0tIGdyYXkgd2l0aCBhbHBoYS1jaGFubmVsCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjRhMDgucG5nIGJhc240YTA4LnBnbQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc240YTE2LnBuZyBiYXNuNGExNi5wZ20KLVJFTSAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwKLXBuZzJwbm0uZXhlIC1ub3JhdyAtYWxwaGEgYmFzbjZhMDgucGdtIC4uXHBuZ3N1aXRlXGJhc242YTA4LnBuZyBiYXNuNmEwOC5wcG0KLXBuZzJwbm0uZXhlIC1ub3JhdyAtYWxwaGEgYmFzbjZhMTYucGdtIC4uXHBuZ3N1aXRlXGJhc242YTE2LnBuZyBiYXNuNmExNi5wcG0KLVJFTSAtLSBncmF5c2NhbGUKLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDEucG5nIHJhd24wZzAxLnBnbQotcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuMGcwMi5wbmcgcmF3bjBnMDIucGdtCi1wbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzA0LnBuZyByYXduMGcwNC5wZ20KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDgucG5nIHJhd24wZzA4LnBnbQotcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuMGcxNi5wbmcgcmF3bjBnMTYucGdtCi1SRU0gLS0gZnVsbC1jb2xvcgotcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuMmMwOC5wbmcgcmF3bjJjMDgucHBtCi1wbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc24yYzE2LnBuZyByYXduMmMxNi5wcG0KLVJFTSAtLSBwYWxsZXR0ZWQKLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDEucG5nIHJhd24zcDAxLnBwbQotcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuM3AwMi5wbmcgcmF3bjNwMDIucHBtCi1wbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc24zcDA0LnBuZyByYXduM3AwNC5wcG0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDgucG5nIHJhd24zcDA4LnBwbQotUkVNIC0tIGdyYXkgd2l0aCBhbHBoYS1jaGFubmVsCi1wbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc240YTA4LnBuZyByYXduNGEwOC5wZ20KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjRhMTYucG5nIHJhd240YTE2LnBnbQotUkVNIC0tIGNvbG9yIHdpdGggYWxwaGEtY2hhbm5lbAotcG5nMnBubS5leGUgLW5vcmF3IC1hbHBoYSByYXduNmEwOC5wZ20gLi5ccG5nc3VpdGVcYmFzbjZhMDgucG5nIHJhd242YTA4LnBwbQotcG5nMnBubS5leGUgLW5vcmF3IC1hbHBoYSByYXduNmExNi5wZ20gLi5ccG5nc3VpdGVcYmFzbjZhMTYucG5nIHJhd242YTE2LnBwbQotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZzJwbm0uYyBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjZlZTA3Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLS8qCi0gKiAgcG5nMnBubS5jIC0tLSBjb252ZXJzaW9uIGZyb20gUE5HLWZpbGUgdG8gUEdNL1BQTS1maWxlCi0gKiAgY29weXJpZ2h0IChDKSAxOTk5IGJ5IFdpbGxlbSB2YW4gU2NoYWlrIDx3aWxsZW1Ac2NoYWlrLmNvbT4KLSAqCi0gKiAgdmVyc2lvbiAxLjAgLSAxOTk5LjEwLjE1IC0gRmlyc3QgdmVyc2lvbi4KLSAqCi0gKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKLSAqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAotICogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCi0gKiAgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSAqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0Ci0gKiAgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2lmZGVmIF9fVFVSQk9DX18KLSNpbmNsdWRlIDxtZW0uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0KLSNpZmRlZiBfV0lOMzIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZGVmaW5lICBTVERJTiBTVERJTl9GSUxFTk8KLSNkZWZpbmUgIFNURE9VVCBTVERPVVRfRklMRU5PCi0jZW5kaWYKLQotI2lmbmRlZiBCT09MCi0jZGVmaW5lIEJPT0wgdW5zaWduZWQgY2hhcgotI2VuZGlmCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAoQk9PTCkgMQotI2VuZGlmCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFIChCT09MKSAwCi0jZW5kaWYKLQotI2lmZGVmIF9fVFVSQk9DX18KLSNkZWZpbmUgU1RESU4gIDAKLSNkZWZpbmUgU1RET1VUIDEKLSNkZWZpbmUgU1RERVJSIDIKLSNlbmRpZgotCi0vKiB0byBtYWtlIHBuZzJwbm0gdmVyYm9zZSBzbyB3ZSBjYW4gZmluZCBwcm9ibGVtcyAobmVlZHMgdG8gYmUgYmVmb3JlIHBuZy5oKSAqLwotI2lmbmRlZiBQTkdfREVCVUcKLSNkZWZpbmUgUE5HX0RFQlVHIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAicG5nLmgiCi0KLS8qIERlZmluZSBwbmdfam1wYnVmKCkgaW4gY2FzZSB3ZSBhcmUgdXNpbmcgYSBwcmUtMS4wLjYgdmVyc2lvbiBvZiBsaWJwbmcgKi8KLSNpZm5kZWYgcG5nX2ptcGJ1ZgotIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgKChwbmdfcHRyKS0+am1wYnVmKQotI2VuZGlmCi0KLS8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotaW50ICBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKLXZvaWQgdXNhZ2UgKCk7Ci1CT09MIHBuZzJwbm0gKEZJTEUgKnBuZ19maWxlLCBGSUxFICpwbm1fZmlsZSwgRklMRSAqYWxwaGFfZmlsZSwgQk9PTCByYXcsIEJPT0wgYWxwaGEpOwotCi0vKgotICogIG1haW4KLSAqLwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBGSUxFICpmcF9yZCA9IHN0ZGluOwotICBGSUxFICpmcF93ciA9IHN0ZG91dDsKLSAgRklMRSAqZnBfYWwgPSBOVUxMOwotICBCT09MIHJhdyA9IFRSVUU7Ci0gIEJPT0wgYWxwaGEgPSBGQUxTRTsKLSAgaW50IGFyZ2k7Ci0KLSAgZm9yIChhcmdpID0gMTsgYXJnaSA8IGFyZ2M7IGFyZ2krKykKLSAgewotICAgIGlmIChhcmd2W2FyZ2ldWzBdID09ICctJykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ3ZbYXJnaV1bMV0pCi0gICAgICB7Ci0gICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgIHJhdyA9IEZBTFNFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICByYXcgPSBUUlVFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgICBhbHBoYSA9IFRSVUU7Ci0gICAgICAgICAgYXJnaSsrOwotICAgICAgICAgIGlmICgoZnBfYWwgPSBmb3BlbiAoYXJndlthcmdpXSwgIndiIikpID09IE5VTEwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7Ci0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIGNhbiBub3QgY3JlYXRlIGFscGhhLWNoYW5uZWwgZmlsZSAlc1xuIiwgYXJndlthcmdpXSk7Ci0gICAgICAgICAgICBleGl0ICgxKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2gnOgotICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7Ci0gICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICB1bmtub3duIG9wdGlvbiAlc1xuIiwgYXJndlthcmdpXSk7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfSAvKiBlbmQgc3dpdGNoICovCi0gICAgfQotICAgIGVsc2UgaWYgKGZwX3JkID09IHN0ZGluKQotICAgIHsKLSAgICAgIGlmICgoZnBfcmQgPSBmb3BlbiAoYXJndlthcmdpXSwgInJiIikpID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7Ci0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIGZpbGUgJXMgZG9lcyBub3QgZXhpc3RcbiIsIGFyZ3ZbYXJnaV0pOwotICAgICAgICAgICAgZXhpdCAoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGZwX3dyID09IHN0ZG91dCkKLSAgICB7Ci0gICAgICBpZiAoKGZwX3dyID0gZm9wZW4gKGFyZ3ZbYXJnaV0sICJ3YiIpKSA9PSBOVUxMKQotICAgICAgewotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJQTkcyUE5NXG4iKTsKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICBjYW4gbm90IGNyZWF0ZSBmaWxlICVzXG4iLCBhcmd2W2FyZ2ldKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJQTkcyUE5NXG4iKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgdG9vIG1hbnkgcGFyYW1ldGVyc1xuIik7Ci0gICAgICB1c2FnZSgpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIH0gLyogZW5kIGZvciAqLwotCi0jaWYgZGVmaW5lZCBfX1RVUkJPQ19fIHx8IGRlZmluZWQgX1dJTjMyCi0gIC8qIHNldCBzdGRpbi9zdGRvdXQgaWYgcmVxdWlyZWQgdG8gYmluYXJ5ICovCi0gIGlmIChmcF9yZCA9PSBzdGRpbikKLSAgewotICAgIHNldG1vZGUgKFNURElOLCBPX0JJTkFSWSk7Ci0gIH0KLSAgaWYgKChyYXcpICYmIChmcF93ciA9PSBzdGRvdXQpKQotICB7Ci0gICAgc2V0bW9kZSAoU1RET1VULCBPX0JJTkFSWSk7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIGNhbGwgdGhlIGNvbnZlcnNpb24gcHJvZ3JhbSBpdHNlbGYgKi8KLSAgaWYgKHBuZzJwbm0gKGZwX3JkLCBmcF93ciwgZnBfYWwsIHJhdywgYWxwaGEpID09IEZBTFNFKQotICB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICB1bnN1Y2Nlc3NmdWwgY29udmVydGlvbiBvZiBQTkctaW1hZ2VcbiIpOwotICAgIGV4aXQoMSk7Ci0gIH0KLQotICAvKiBjbG9zZSBpbnB1dCBmaWxlICovCi0gIGZjbG9zZSAoZnBfcmQpOwotICAvKiBjbG9zZSBvdXRwdXQgZmlsZSAqLwotICBmY2xvc2UgKGZwX3dyKTsKLSAgLyogY2xvc2UgYWxwaGEgZmlsZSAqLwotICBpZiAoYWxwaGEpCi0gICAgZmNsb3NlIChmcF9hbCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAgdXNhZ2UKLSAqLwotCi12b2lkIHVzYWdlKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgIGJ5IFdpbGxlbSB2YW4gU2NoYWlrLCAxOTk5XG4iKTsKLSNpZmRlZiBfX1RVUkJPQ19fCi0gIGZwcmludGYgKHN0ZGVyciwgIiAgIGZvciBUdXJiby1DIGFuZCBCb3JsYW5kLUMgY29tcGlsZXJzXG4iKTsKLSNlbHNlCi0gIGZwcmludGYgKHN0ZGVyciwgIiAgIGZvciBMaW51eCAoYW5kIFVuaXgpIGNvbXBpbGVyc1xuIik7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICBwbmcycG5tIFtvcHRpb25zXSA8ZmlsZT4ucG5nIFs8ZmlsZT4ucG5tXVxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgIG9yOiAgLi4uIHwgcG5nMnBubSBbb3B0aW9uc11cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICJPcHRpb25zOlxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgIC1yW2F3XSAgIHdyaXRlIHBubS1maWxlIGluIGJpbmFyeSBmb3JtYXQgKFA0L1A1L1A2KSAoZGVmYXVsdClcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICAtbltvcmF3XSB3cml0ZSBwbm0tZmlsZSBpbiBhc2NpaSBmb3JtYXQgKFAxL1AyL1AzKVxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgIC1hW2xwaGFdIDxmaWxlPi5wZ20gd3JpdGUgUE5HIGFscGhhIGNoYW5uZWwgYXMgcGdtLWZpbGVcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICAtaCB8IC0/ICBwcmludCB0aGlzIGhlbHAtaW5mb3JtYXRpb25cbiIpOwotfQotCi0vKgotICogIHBuZzJwbm0KLSAqLwotCi1CT09MIHBuZzJwbm0gKEZJTEUgKnBuZ19maWxlLCBGSUxFICpwbm1fZmlsZSwgRklMRSAqYWxwaGFfZmlsZSwgQk9PTCByYXcsIEJPT0wgYWxwaGEpCi17Ci0gIHBuZ19zdHJ1Y3QgICAgKnBuZ19wdHIgPSBOVUxMOwotICBwbmdfaW5mbwkqaW5mb19wdHIgPSBOVUxMOwotICBwbmdfYnl0ZSAgICAgIGJ1Zls4XTsKLSAgcG5nX2J5dGUgICAgICAqcG5nX3BpeGVscyA9IE5VTEw7Ci0gIHBuZ19ieXRlICAgICAgKipyb3dfcG9pbnRlcnMgPSBOVUxMOwotICBwbmdfYnl0ZSAgICAgICpwaXhfcHRyID0gTlVMTDsKLSAgcG5nX3VpbnRfMzIgICByb3dfYnl0ZXM7Ci0KLSAgcG5nX3VpbnRfMzIgICB3aWR0aDsKLSAgcG5nX3VpbnRfMzIgICBoZWlnaHQ7Ci0gIGludCAgICAgICAgICAgYml0X2RlcHRoOwotICBpbnQgICAgICAgICAgIGNoYW5uZWxzOwotICBpbnQgICAgICAgICAgIGNvbG9yX3R5cGU7Ci0gIGludCAgICAgICAgICAgYWxwaGFfcHJlc2VudDsKLSAgaW50ICAgICAgICAgICByb3csIGNvbDsKLSAgaW50ICAgICAgICAgICByZXQ7Ci0gIGludCAgICAgICAgICAgaTsKLSAgbG9uZyAgICAgICAgICBkZXBfMTY7Ci0KLSAgLyogcmVhZCBhbmQgY2hlY2sgc2lnbmF0dXJlIGluIFBORyBmaWxlICovCi0gIHJldCA9IGZyZWFkIChidWYsIDEsIDgsIHBuZ19maWxlKTsKLSAgaWYgKHJldCAhPSA4KQotICAgIHJldHVybiBGQUxTRTsKLQotICByZXQgPSBwbmdfY2hlY2tfc2lnIChidWYsIDgpOwotICBpZiAoIXJldCkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgLyogY3JlYXRlIHBuZyBhbmQgaW5mbyBzdHJ1Y3R1cmVzICovCi0KLSAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QgKFBOR19MSUJQTkdfVkVSX1NUUklORywKLSAgICBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgaWYgKCFwbmdfcHRyKQotICAgIHJldHVybiBGQUxTRTsgICAvKiBvdXQgb2YgbWVtb3J5ICovCi0KLSAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0IChwbmdfcHRyKTsKLSAgaWYgKCFpbmZvX3B0cikKLSAgewotICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0ICgmcG5nX3B0ciwgTlVMTCwgTlVMTCk7Ci0gICAgcmV0dXJuIEZBTFNFOyAgIC8qIG91dCBvZiBtZW1vcnkgKi8KLSAgfQotCi0gIGlmIChzZXRqbXAgKHBuZ19qbXBidWYocG5nX3B0cikpKQotICB7Ci0gICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QgKCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIHNldCB1cCB0aGUgaW5wdXQgY29udHJvbCBmb3IgQyBzdHJlYW1zICovCi0gIHBuZ19pbml0X2lvIChwbmdfcHRyLCBwbmdfZmlsZSk7Ci0gIHBuZ19zZXRfc2lnX2J5dGVzIChwbmdfcHRyLCA4KTsgIC8qIHdlIGFscmVhZHkgcmVhZCB0aGUgOCBzaWduYXR1cmUgYnl0ZXMgKi8KLQotICAvKiByZWFkIHRoZSBmaWxlIGluZm9ybWF0aW9uICovCi0gIHBuZ19yZWFkX2luZm8gKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAvKiBnZXQgc2l6ZSBhbmQgYml0LWRlcHRoIG9mIHRoZSBQTkctaW1hZ2UgKi8KLSAgcG5nX2dldF9JSERSIChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLAotICAgIE5VTEwsIE5VTEwsIE5VTEwpOwotCi0gIC8qIHNldC11cCB0aGUgdHJhbnNmb3JtYXRpb25zICovCi0KLSAgLyogdHJhbnNmb3JtIHBhbGV0dGVkIGltYWdlcyBpbnRvIGZ1bGwtY29sb3IgcmdiICovCi0gIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgcG5nX3NldF9leHBhbmQgKHBuZ19wdHIpOwotICAvKiBleHBhbmQgaW1hZ2VzIHRvIGJpdC1kZXB0aCA4IChvbmx5IGFwcGxpY2FibGUgZm9yIGdyYXlzY2FsZSBpbWFnZXMpICovCi0gIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYgYml0X2RlcHRoIDwgOCkKLSAgICBwbmdfc2V0X2V4cGFuZCAocG5nX3B0cik7Ci0gIC8qIHRyYW5zZm9ybSB0cmFuc3BhcmVuY3kgbWFwcyBpbnRvIGZ1bGwgYWxwaGEtY2hhbm5lbCAqLwotICBpZiAocG5nX2dldF92YWxpZCAocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3RSTlMpKQotICAgIHBuZ19zZXRfZXhwYW5kIChwbmdfcHRyKTsKLQotI2lmZGVmIE5KRVQKLSAgLyogZG93bmdyYWRlIDE2LWJpdCBpbWFnZXMgdG8gOCBiaXQgKi8KLSAgaWYgKGJpdF9kZXB0aCA9PSAxNikKLSAgICBwbmdfc2V0X3N0cmlwXzE2IChwbmdfcHRyKTsKLSAgLyogdHJhbnNmb3JtIGdyYXlzY2FsZSBpbWFnZXMgaW50byBmdWxsLWNvbG9yICovCi0gIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKLSAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgcG5nX3NldF9ncmF5X3RvX3JnYiAocG5nX3B0cik7Ci0gIC8qIG9ubHkgaWYgZmlsZSBoYXMgYSBmaWxlIGdhbW1hLCB3ZSBkbyBhIGNvcnJlY3Rpb24gKi8KLSAgaWYgKHBuZ19nZXRfZ0FNQSAocG5nX3B0ciwgaW5mb19wdHIsICZmaWxlX2dhbW1hKSkKLSAgICBwbmdfc2V0X2dhbW1hIChwbmdfcHRyLCAoZG91YmxlKSAyLjIsIGZpbGVfZ2FtbWEpOwotI2VuZGlmCi0KLSAgLyogYWxsIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcmVnaXN0ZXJlZDsgbm93IHVwZGF0ZSBpbmZvX3B0ciBkYXRhLAotICAgKiBnZXQgcm93Ynl0ZXMgYW5kIGNoYW5uZWxzLCBhbmQgYWxsb2NhdGUgaW1hZ2UgbWVtb3J5ICovCi0KLSAgcG5nX3JlYWRfdXBkYXRlX2luZm8gKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAvKiBnZXQgdGhlIG5ldyBjb2xvci10eXBlIGFuZCBiaXQtZGVwdGggKGFmdGVyIGV4cGFuc2lvbi9zdHJpcHBpbmcpICovCi0gIHBuZ19nZXRfSUhEUiAocG5nX3B0ciwgaW5mb19wdHIsICZ3aWR0aCwgJmhlaWdodCwgJmJpdF9kZXB0aCwgJmNvbG9yX3R5cGUsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCk7Ci0KLSAgLyogY2hlY2sgZm9yIDE2LWJpdCBmaWxlcyAqLwotICBpZiAoYml0X2RlcHRoID09IDE2KQotICB7Ci0gICAgcmF3ID0gRkFMU0U7Ci0jaWZkZWYgX19UVVJCT0NfXwotICAgIHBubV9maWxlLT5mbGFncyAmPSB+KCh1bnNpZ25lZCkgX0ZfQklOKTsKLSNlbmRpZgotICB9Ci0KLSAgLyogY2FsY3VsYXRlIG5ldyBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHN0b3JlIGFscGhhLXByZXNlbmNlICovCi0gIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCi0gICAgY2hhbm5lbHMgPSAxOwotICBlbHNlIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgY2hhbm5lbHMgPSAyOwotICBlbHNlIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKLSAgICBjaGFubmVscyA9IDM7Ci0gIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgIGNoYW5uZWxzID0gNDsKLSAgZWxzZQotICAgIGNoYW5uZWxzID0gMDsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotICBhbHBoYV9wcmVzZW50ID0gKGNoYW5uZWxzIC0gMSkgJSAyOwotCi0gIC8qIGNoZWNrIGlmIGFscGhhIGlzIGV4cGVjdGVkIHRvIGJlIHByZXNlbnQgaW4gZmlsZSAqLwotICBpZiAoYWxwaGEgJiYgIWFscGhhX3ByZXNlbnQpCi0gIHsKLSAgICBmcHJpbnRmIChzdGRlcnIsICJQTkcyUE5NXG4iKTsKLSAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIFBORy1maWxlIGRvZXNuJ3QgY29udGFpbiBhbHBoYSBjaGFubmVsXG4iKTsKLSAgICBleGl0ICgxKTsKLSAgfQotCi0gIC8qIHJvd19ieXRlcyBpcyB0aGUgd2lkdGggeCBudW1iZXIgb2YgY2hhbm5lbHMgeCAoYml0LWRlcHRoIC8gOCkgKi8KLSAgcm93X2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyAocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gIGlmICgocG5nX3BpeGVscyA9IChwbmdfYnl0ZSAqKSBtYWxsb2MgKHJvd19ieXRlcyAqIGhlaWdodCAqIHNpemVvZiAocG5nX2J5dGUpKSkgPT0gTlVMTCkgewotICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0ICgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICBpZiAoKHJvd19wb2ludGVycyA9IChwbmdfYnl0ZSAqKikgbWFsbG9jIChoZWlnaHQgKiBzaXplb2YgKHBuZ19ieXRlcCkpKSA9PSBOVUxMKQotICB7Ci0gICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QgKCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgIGZyZWUgKHBuZ19waXhlbHMpOwotICAgIHBuZ19waXhlbHMgPSBOVUxMOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIHNldCB0aGUgaW5kaXZpZHVhbCByb3dfcG9pbnRlcnMgdG8gcG9pbnQgYXQgdGhlIGNvcnJlY3Qgb2Zmc2V0cyAqLwotICBmb3IgKGkgPSAwOyBpIDwgKGhlaWdodCk7IGkrKykKLSAgICByb3dfcG9pbnRlcnNbaV0gPSBwbmdfcGl4ZWxzICsgaSAqIHJvd19ieXRlczsKLQotICAvKiBub3cgd2UgY2FuIGdvIGFoZWFkIGFuZCBqdXN0IHJlYWQgdGhlIHdob2xlIGltYWdlICovCi0gIHBuZ19yZWFkX2ltYWdlIChwbmdfcHRyLCByb3dfcG9pbnRlcnMpOwotCi0gIC8qIHJlYWQgcmVzdCBvZiBmaWxlLCBhbmQgZ2V0IGFkZGl0aW9uYWwgY2h1bmtzIGluIGluZm9fcHRyIC0gUkVRVUlSRUQgKi8KLSAgcG5nX3JlYWRfZW5kIChwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgLyogY2xlYW4gdXAgYWZ0ZXIgdGhlIHJlYWQsIGFuZCBmcmVlIGFueSBtZW1vcnkgYWxsb2NhdGVkIC0gUkVRVUlSRUQgKi8KLSAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QgKCZwbmdfcHRyLCAmaW5mb19wdHIsIChwbmdfaW5mb3BwKSBOVUxMKTsKLQotICAvKiB3cml0ZSBoZWFkZXIgb2YgUE5NIGZpbGUgKi8KLQotICBpZiAoKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkgfHwKLSAgICAgIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpKQotICB7Ci0gICAgZnByaW50ZiAocG5tX2ZpbGUsICIlc1xuIiwgKHJhdykgPyAiUDUiIDogIlAyIik7Ci0gICAgZnByaW50ZiAocG5tX2ZpbGUsICIlZCAlZFxuIiwgKGludCkgd2lkdGgsIChpbnQpIGhlaWdodCk7Ci0gICAgZnByaW50ZiAocG5tX2ZpbGUsICIlbGRcbiIsICgoMUwgPDwgKGludCkgYml0X2RlcHRoKSAtIDFMKSk7Ci0gIH0KLSAgZWxzZSBpZiAoKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKSB8fAotICAgICAgICAgICAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpKQotICB7Ci0gICAgZnByaW50ZiAocG5tX2ZpbGUsICIlc1xuIiwgKHJhdykgPyAiUDYiIDogIlAzIik7Ci0gICAgZnByaW50ZiAocG5tX2ZpbGUsICIlZCAlZFxuIiwgKGludCkgd2lkdGgsIChpbnQpIGhlaWdodCk7Ci0gICAgZnByaW50ZiAocG5tX2ZpbGUsICIlbGRcbiIsICgoMUwgPDwgKGludCkgYml0X2RlcHRoKSAtIDFMKSk7Ci0gIH0KLQotICAvKiB3cml0ZSBoZWFkZXIgb2YgUEdNIGZpbGUgd2l0aCBhbHBoYSBjaGFubmVsICovCi0KLSAgaWYgKChhbHBoYSkgJiYKLSAgICAgICgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKSB8fAotICAgICAgIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkpKQotICB7Ci0gICAgZnByaW50ZiAoYWxwaGFfZmlsZSwgIiVzXG4iLCAocmF3KSA/ICJQNSIgOiAiUDIiKTsKLSAgICBmcHJpbnRmIChhbHBoYV9maWxlLCAiJWQgJWRcbiIsIChpbnQpIHdpZHRoLCAoaW50KSBoZWlnaHQpOwotICAgIGZwcmludGYgKGFscGhhX2ZpbGUsICIlbGRcbiIsICgoMUwgPDwgKGludCkgYml0X2RlcHRoKSAtIDFMKSk7Ci0gIH0KLQotICAvKiB3cml0ZSBkYXRhIHRvIFBOTSBmaWxlICovCi0gIHBpeF9wdHIgPSBwbmdfcGl4ZWxzOwotCi0gIGZvciAocm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykKLSAgewotICAgIGZvciAoY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAoY2hhbm5lbHMgLSBhbHBoYV9wcmVzZW50KTsgaSsrKQotICAgICAgewotICAgICAgICBpZiAocmF3KQotICAgICAgICAgIGZwdXRjICgoaW50KSAqcGl4X3B0cisrICwgcG5tX2ZpbGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaWYgKGJpdF9kZXB0aCA9PSAxNil7Ci0JICAgIGRlcF8xNiA9IChsb25nKSAqcGl4X3B0cisrOwotICAgICAgICAgICAgZnByaW50ZiAocG5tX2ZpbGUsICIlbGQgIiwgKGRlcF8xNiA8PCA4KSArICgobG9uZykgKnBpeF9wdHIrKykpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmIChwbm1fZmlsZSwgIiVsZCAiLCAobG9uZykgKnBpeF9wdHIrKyk7Ci0gICAgICB9Ci0gICAgICBpZiAoYWxwaGFfcHJlc2VudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFhbHBoYSkKLSAgICAgICAgewotICAgICAgICAgIHBpeF9wdHIrKzsgLyogYWxwaGEgKi8KLSAgICAgICAgICBpZiAoYml0X2RlcHRoID09IDE2KQotICAgICAgICAgICAgcGl4X3B0cisrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogb3V0cHV0IGFscGhhLWNoYW5uZWwgYXMgcGdtIGZpbGUgKi8KLSAgICAgICAgewotICAgICAgICAgIGlmIChyYXcpCi0gICAgICAgICAgICBmcHV0YyAoKGludCkgKnBpeF9wdHIrKyAsIGFscGhhX2ZpbGUpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmIChiaXRfZGVwdGggPT0gMTYpewotCSAgICAgIGRlcF8xNiA9IChsb25nKSAqcGl4X3B0cisrOwotICAgICAgICAgICAgICBmcHJpbnRmIChhbHBoYV9maWxlLCAiJWxkICIsIChkZXBfMTYgPDwgOCkgKyAobG9uZykgKnBpeF9wdHIrKyk7Ci0JICAgIH0gIAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBmcHJpbnRmIChhbHBoYV9maWxlLCAiJWxkICIsIChsb25nKSAqcGl4X3B0cisrKTsKLSAgICAgICAgfQotICAgICAgfSAvKiBpZiBhbHBoYV9wcmVzZW50ICovCi0KLSAgICAgIGlmICghcmF3KQotICAgICAgICBpZiAoY29sICUgNCA9PSAzKQotICAgICAgICAgIGZwcmludGYgKHBubV9maWxlLCAiXG4iKTsKLSAgICB9IC8qIGVuZCBmb3IgY29sICovCi0KLSAgICBpZiAoIXJhdykKLSAgICAgIGlmIChjb2wgJSA0ICE9IDApCi0gICAgICAgIGZwcmludGYgKHBubV9maWxlLCAiXG4iKTsKLSAgfSAvKiBlbmQgZm9yIHJvdyAqLwotCi0gIGlmIChyb3dfcG9pbnRlcnMgIT0gKHVuc2lnbmVkIGNoYXIqKikgTlVMTCkKLSAgICBmcmVlIChyb3dfcG9pbnRlcnMpOwotICBpZiAocG5nX3BpeGVscyAhPSAodW5zaWduZWQgY2hhciopIE5VTEwpCi0gICAgZnJlZSAocG5nX3BpeGVscyk7Ci0KLSAgcmV0dXJuIFRSVUU7Ci0KLX0gLyogZW5kIG9mIHNvdXJjZSAqLwotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZzJwbm0uc2ggYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZzJwbm0uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzA1MzcuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbmcycG5tLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyEvYmluL3NoCi0jIC0tIGdyYXlzY2FsZQotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwMS5wbmcgYmFzbjBnMDEucGdtCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZyBiYXNuMGcwMi5wZ20KLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMDQucG5nIGJhc24wZzA0LnBnbQotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwOC5wbmcgYmFzbjBnMDgucGdtCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZyBiYXNuMGcxNi5wZ20KLSMgLS0gZnVsbC1jb2xvcgotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcgYmFzbjJjMDgucHBtCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24yYzE2LnBuZyBiYXNuMmMxNi5wcG0KLSMgLS0gcGFsbGV0dGVkCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZyBiYXNuM3AwMS5wcG0KLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjNwMDIucG5nIGJhc24zcDAyLnBwbQotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwNC5wbmcgYmFzbjNwMDQucHBtCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZyBiYXNuM3AwOC5wcG0KLSMgLS0gZ3JheSB3aXRoIGFscGhhLWNoYW5uZWwKLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjRhMDgucG5nIGJhc240YTA4LnBnbQotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuNGExNi5wbmcgYmFzbjRhMTYucGdtCi0jIC0tIGNvbG9yIHdpdGggYWxwaGEtY2hhbm5lbAotLi9wbmcycG5tIC1ub3JhdyAtYWxwaGEgYmFzbjZhMDgucGdtIC4uL3BuZ3N1aXRlL2Jhc242YTA4LnBuZyBiYXNuNmEwOC5wcG0KLS4vcG5nMnBubSAtbm9yYXcgLWFscGhhIGJhc242YTE2LnBnbSAuLi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcgYmFzbjZhMTYucHBtCi0jIC0tIGdyYXlzY2FsZQotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMDEucG5nIHJhd24wZzAxLnBnbQotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMDIucG5nIHJhd24wZzAyLnBnbQotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMDQucG5nIHJhd24wZzA0LnBnbQotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMDgucG5nIHJhd24wZzA4LnBnbQotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMTYucG5nIHJhd24wZzE2LnBnbQotIyAtLSBmdWxsLWNvbG9yCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcgcmF3bjJjMDgucHBtCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMmMxNi5wbmcgcmF3bjJjMTYucHBtCi0jIC0tIHBhbGxldHRlZAotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjNwMDEucG5nIHJhd24zcDAxLnBwbQotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjNwMDIucG5nIHJhd24zcDAyLnBwbQotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjNwMDQucG5nIHJhd24zcDA0LnBwbQotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjNwMDgucG5nIHJhd24zcDA4LnBwbQotIyAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbAotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjRhMDgucG5nIHJhd240YTA4LnBnbQotLi9wbmcycG5tIC1yYXcgLi4vcG5nc3VpdGUvYmFzbjRhMTYucG5nIHJhd240YTE2LnBnbQotIyAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwKLS4vcG5nMnBubSAtbm9yYXcgLWFscGhhIHJhd242YTA4LnBnbSAuLi9wbmdzdWl0ZS9iYXNuNmEwOC5wbmcgcmF3bjZhMDgucHBtCi0uL3BuZzJwbm0gLW5vcmF3IC1hbHBoYSByYXduNmExNi5wZ20gLi4vcG5nc3VpdGUvYmFzbjZhMTYucG5nIHJhd242YTE2LnBwbQotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZ21pbnVzLmJhdCBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nbWludXMuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTFiYjhkLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5nbWludXMuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1tYWtlIC1mIG1ha2VmaWxlLnRjMwotY2FsbCBwbmcycG5tLmJhdAotY2FsbCBwbm0ycG5nLmJhdAotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZ21pbnVzLnNoIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbmdtaW51cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwYTlkOC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BuZ21pbnVzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIS9iaW4vc2gKLW1ha2UgLWYgbWFrZWZpbGUuc3RkCi1zaCBwbmcycG5tLnNoCi1zaCBwbm0ycG5nLnNoCi0KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5tMnBuZy5iYXQgYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzU2Y2I4Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5tMnBuZy5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1SRU0gLS0gZ3JheXNjYWxlCi1wbm0ycG5nLmV4ZSBiYXNuMGcwMS5wZ20gYmFzbjBnMDEucG5nCi1wbm0ycG5nLmV4ZSBiYXNuMGcwMi5wZ20gYmFzbjBnMDIucG5nCi1wbm0ycG5nLmV4ZSBiYXNuMGcwNC5wZ20gYmFzbjBnMDQucG5nCi1wbm0ycG5nLmV4ZSBiYXNuMGcwOC5wZ20gYmFzbjBnMDgucG5nCi1wbm0ycG5nLmV4ZSBiYXNuMGcxNi5wZ20gYmFzbjBnMTYucG5nCi1SRU0gLS0gZnVsbC1jb2xvcgotcG5tMnBuZy5leGUgYmFzbjJjMDgucHBtIGJhc24yYzA4LnBuZwotcG5tMnBuZy5leGUgYmFzbjJjMTYucHBtIGJhc24yYzE2LnBuZwotUkVNIC0tIHBhbGxldHRlZAotcG5tMnBuZy5leGUgYmFzbjNwMDEucHBtIGJhc24zcDAxLnBuZwotcG5tMnBuZy5leGUgYmFzbjNwMDIucHBtIGJhc24zcDAyLnBuZwotcG5tMnBuZy5leGUgYmFzbjNwMDQucHBtIGJhc24zcDA0LnBuZwotcG5tMnBuZy5leGUgYmFzbjNwMDgucHBtIGJhc24zcDA4LnBuZwotUkVNIC0tIGdyYXkgd2l0aCBhbHBoYS1jaGFubmVsCi1wbm0ycG5nLmV4ZSAtYWxwaGEgYmFzbjZhMDgucGdtIGJhc240YTA4LnBnbSBiYXNuNGEwOC5wbmcKLXBubTJwbmcuZXhlIC1hbHBoYSBiYXNuNmExNi5wZ20gYmFzbjRhMTYucGdtIGJhc240YTE2LnBuZwotUkVNIC0tIGNvbG9yIHdpdGggYWxwaGEtY2hhbm5lbAotcG5tMnBuZy5leGUgLWFscGhhIGJhc242YTA4LnBnbSBiYXNuNmEwOC5wcG0gYmFzbjZhMDgucG5nCi1wbm0ycG5nLmV4ZSAtYWxwaGEgYmFzbjZhMTYucGdtIGJhc242YTE2LnBwbSBiYXNuNmExNi5wbmcKLVJFTSAtLSBncmF5c2NhbGUKLXBubTJwbmcuZXhlIHJhd24wZzAxLnBnbSByYXduMGcwMS5wbmcKLXBubTJwbmcuZXhlIHJhd24wZzAyLnBnbSByYXduMGcwMi5wbmcKLXBubTJwbmcuZXhlIHJhd24wZzA0LnBnbSByYXduMGcwNC5wbmcKLXBubTJwbmcuZXhlIHJhd24wZzA4LnBnbSByYXduMGcwOC5wbmcKLXBubTJwbmcuZXhlIHJhd24wZzE2LnBnbSByYXduMGcxNi5wbmcKLVJFTSAtLSBmdWxsLWNvbG9yCi1wbm0ycG5nLmV4ZSByYXduMmMwOC5wcG0gcmF3bjJjMDgucG5nCi1wbm0ycG5nLmV4ZSByYXduMmMxNi5wcG0gcmF3bjJjMTYucG5nCi1SRU0gLS0gcGFsbGV0dGVkCi1wbm0ycG5nLmV4ZSByYXduM3AwMS5wcG0gcmF3bjNwMDEucG5nCi1wbm0ycG5nLmV4ZSByYXduM3AwMi5wcG0gcmF3bjNwMDIucG5nCi1wbm0ycG5nLmV4ZSByYXduM3AwNC5wcG0gcmF3bjNwMDQucG5nCi1wbm0ycG5nLmV4ZSByYXduM3AwOC5wcG0gcmF3bjNwMDgucG5nCi1SRU0gLS0gZ3JheSB3aXRoIGFscGhhLWNoYW5uZWwKLXBubTJwbmcuZXhlIC1hbHBoYSByYXduNmEwOC5wZ20gcmF3bjRhMDgucGdtIHJhd240YTA4LnBuZwotcG5tMnBuZy5leGUgLWFscGhhIHJhd242YTE2LnBnbSByYXduNGExNi5wZ20gcmF3bjRhMTYucG5nCi1SRU0gLS0gY29sb3Igd2l0aCBhbHBoYS1jaGFubmVsCi1wbm0ycG5nLmV4ZSAtYWxwaGEgcmF3bjZhMDgucGdtIHJhd242YTA4LnBwbSByYXduNmEwOC5wbmcKLXBubTJwbmcuZXhlIC1hbHBoYSByYXduNmExNi5wZ20gcmF3bjZhMTYucHBtIHJhd242YTE2LnBuZwotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuYyBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5tMnBuZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTFjZjBlLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nbWludXMvcG5tMnBuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQyICswLDAgQEAKLS8qCi0gKiAgcG5tMnBuZy5jIC0tLSBjb252ZXJzaW9uIGZyb20gUEJNL1BHTS9QUE0tZmlsZSB0byBQTkctZmlsZQotICogIGNvcHlyaWdodCAoQykgMTk5OSBieSBXaWxsZW0gdmFuIFNjaGFpayA8d2lsbGVtQHNjaGFpay5jb20+Ci0gKgotICogIHZlcnNpb24gMS4wIC0gMTk5OS4xMC4xNSAtIEZpcnN0IHZlcnNpb24uCi0gKgotICogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCi0gKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKLSAqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAotICogIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0gKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAotICogIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZmRlZiBfX1RVUkJPQ19fCi0jaW5jbHVkZSA8bWVtLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2RlZmluZSAgU1RESU4gU1RESU5fRklMRU5PCi0jZGVmaW5lICBTVERPVVQgU1RET1VUX0ZJTEVOTwotI2VuZGlmCi0KLSNpZm5kZWYgQk9PTAotI2RlZmluZSBCT09MIHVuc2lnbmVkIGNoYXIKLSNlbmRpZgotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgKEJPT0wpIDEKLSNlbmRpZgotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAoQk9PTCkgMAotI2VuZGlmCi0KLSNpZmRlZiBfX1RVUkJPQ19fCi0jZGVmaW5lIFNURElOICAwCi0jZGVmaW5lIFNURE9VVCAxCi0jZGVmaW5lIFNUREVSUiAyCi0jZW5kaWYKLQotLyogdG8gbWFrZSBwbm0ycG5nIHZlcmJvc2Ugc28gd2UgY2FuIGZpbmQgcHJvYmxlbXMgKG5lZWRzIHRvIGJlIGJlZm9yZSBwbmcuaCkgKi8KLSNpZm5kZWYgUE5HX0RFQlVHCi0jZGVmaW5lIFBOR19ERUJVRyAwCi0jZW5kaWYKLQotI2luY2x1ZGUgInBuZy5oIgotCi0vKiBEZWZpbmUgcG5nX2ptcGJ1ZigpIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGEgcHJlLTEuMC42IHZlcnNpb24gb2YgbGlicG5nICovCi0jaWZuZGVmIHBuZ19qbXBidWYKLSMgIGRlZmluZSBwbmdfam1wYnVmKHBuZ19wdHIpICgocG5nX3B0ciktPmptcGJ1ZikKLSNlbmRpZgotCi0vKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0KLWludCAgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7Ci12b2lkIHVzYWdlICgpOwotQk9PTCBwbm0ycG5nIChGSUxFICpwbm1fZmlsZSwgRklMRSAqcG5nX2ZpbGUsIEZJTEUgKmFscGhhX2ZpbGUsIEJPT0wgaW50ZXJsYWNlLCBCT09MIGFscGhhKTsKLXZvaWQgZ2V0X3Rva2VuKEZJTEUgKnBubV9maWxlLCBjaGFyICp0b2tlbik7Ci1wbmdfdWludF8zMiBnZXRfZGF0YSAoRklMRSAqcG5tX2ZpbGUsIGludCBkZXB0aCk7Ci1wbmdfdWludF8zMiBnZXRfdmFsdWUgKEZJTEUgKnBubV9maWxlLCBpbnQgZGVwdGgpOwotCi0vKgotICogIG1haW4KLSAqLwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBGSUxFICpmcF9yZCA9IHN0ZGluOwotICBGSUxFICpmcF9hbCA9IE5VTEw7Ci0gIEZJTEUgKmZwX3dyID0gc3Rkb3V0OwotICBCT09MIGludGVybGFjZSA9IEZBTFNFOwotICBCT09MIGFscGhhID0gRkFMU0U7Ci0gIGludCBhcmdpOwotCi0gIGZvciAoYXJnaSA9IDE7IGFyZ2kgPCBhcmdjOyBhcmdpKyspCi0gIHsKLSAgICBpZiAoYXJndlthcmdpXVswXSA9PSAnLScpCi0gICAgewotICAgICAgc3dpdGNoIChhcmd2W2FyZ2ldWzFdKQotICAgICAgewotICAgICAgICBjYXNlICdpJzoKLSAgICAgICAgICBpbnRlcmxhY2UgPSBUUlVFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgICBhbHBoYSA9IFRSVUU7Ci0gICAgICAgICAgYXJnaSsrOwotICAgICAgICAgIGlmICgoZnBfYWwgPSBmb3BlbiAoYXJndlthcmdpXSwgInJiIikpID09IE5VTEwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7Ci0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIGFscGhhLWNoYW5uZWwgZmlsZSAlcyBkb2VzIG5vdCBleGlzdFxuIiwKLSAgICAgICAgICAgICAgIGFyZ3ZbYXJnaV0pOwotICAgICAgICAgICAgZXhpdCAoMSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdoJzoKLSAgICAgICAgY2FzZSAnPyc6Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICBleGl0KDApOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBOTTJQTkdcbiIpOwotICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgdW5rbm93biBvcHRpb24gJXNcbiIsIGFyZ3ZbYXJnaV0pOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0gLyogZW5kIHN3aXRjaCAqLwotICAgIH0KLSAgICBlbHNlIGlmIChmcF9yZCA9PSBzdGRpbikKLSAgICB7Ci0gICAgICBpZiAoKGZwX3JkID0gZm9wZW4gKGFyZ3ZbYXJnaV0sICJyYiIpKSA9PSBOVUxMKQotICAgICAgewotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJQTk0yUE5HXG4iKTsKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICBmaWxlICVzIGRvZXMgbm90IGV4aXN0XG4iLCBhcmd2W2FyZ2ldKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGZwX3dyID09IHN0ZG91dCkKLSAgICB7Ci0gICAgICBpZiAoKGZwX3dyID0gZm9wZW4gKGFyZ3ZbYXJnaV0sICJ3YiIpKSA9PSBOVUxMKQotICAgICAgewotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJQTk0yUE5HXG4iKTsKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICBjYW4gbm90IGNyZWF0ZSBQTkctZmlsZSAlc1xuIiwgYXJndlthcmdpXSk7Ci0gICAgICAgIGV4aXQgKDEpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIHRvbyBtYW55IHBhcmFtZXRlcnNcbiIpOwotICAgICAgdXNhZ2UoKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgfSAvKiBlbmQgZm9yICovCi0KLSNpZiBkZWZpbmVkIF9fVFVSQk9DX18gfHwgZGVmaW5lZCBfV0lOMzIKLSAgLyogc2V0IHN0ZGluL3N0ZG91dCB0byBiaW5hcnksIHdlJ3JlIHJlYWRpbmcgdGhlIFBOTSBhbHdheXMhIGluIGJpbmFyeSBmb3JtYXQgKi8KLSAgaWYgKGZwX3JkID09IHN0ZGluKQotICB7Ci0gICAgc2V0bW9kZSAoU1RESU4sIE9fQklOQVJZKTsKLSAgfQotICBpZiAoZnBfd3IgPT0gc3Rkb3V0KQotICB7Ci0gICAgc2V0bW9kZSAoU1RET1VULCBPX0JJTkFSWSk7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIGNhbGwgdGhlIGNvbnZlcnNpb24gcHJvZ3JhbSBpdHNlbGYgKi8KLSAgaWYgKHBubTJwbmcgKGZwX3JkLCBmcF93ciwgZnBfYWwsIGludGVybGFjZSwgYWxwaGEpID09IEZBTFNFKQotICB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICB1bnN1Y2Nlc3NmdWwgY29udmVydGluZyB0byBQTkctaW1hZ2VcbiIpOwotICAgIGV4aXQgKDEpOwotICB9Ci0KLSAgLyogY2xvc2UgaW5wdXQgZmlsZSAqLwotICBmY2xvc2UgKGZwX3JkKTsKLSAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KLSAgZmNsb3NlIChmcF93cik7Ci0gIC8qIGNsb3NlIGFscGhhIGZpbGUgKi8KLSAgaWYgKGFscGhhKQotICAgIGZjbG9zZSAoZnBfYWwpOwotCi0gIHJldHVybiAwOwotfQotCi0vKgotICogIHVzYWdlCi0gKi8KLQotdm9pZCB1c2FnZSgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgIlBOTTJQTkdcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICBieSBXaWxsZW0gdmFuIFNjaGFpaywgMTk5OVxuIik7Ci0jaWZkZWYgX19UVVJCT0NfXwotICBmcHJpbnRmIChzdGRlcnIsICIgICBmb3IgVHVyYm8tQyBhbmQgQm9ybGFuZC1DIGNvbXBpbGVyc1xuIik7Ci0jZWxzZQotICBmcHJpbnRmIChzdGRlcnIsICIgICBmb3IgTGludXggKGFuZCBVbml4KSBjb21waWxlcnNcbiIpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiAgcG5tMnBuZyBbb3B0aW9uc10gPGZpbGU+Ljxwbm0+IFs8ZmlsZT4ucG5nXVxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgIG9yOiAgLi4uIHwgcG5tMnBuZyBbb3B0aW9uc11cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICJPcHRpb25zOlxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgIC1pW250ZXJsYWNlXSAgIHdyaXRlIHBuZy1maWxlIHdpdGggaW50ZXJsYWNpbmcgb25cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICAtYVtscGhhXSA8ZmlsZT4ucGdtIHJlYWQgUE5HIGFscGhhIGNoYW5uZWwgYXMgcGdtLWZpbGVcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICAtaCB8IC0/ICBwcmludCB0aGlzIGhlbHAtaW5mb3JtYXRpb25cbiIpOwotfQotCi0vKgotICogIHBubTJwbmcKLSAqLwotCi1CT09MIHBubTJwbmcgKEZJTEUgKnBubV9maWxlLCBGSUxFICpwbmdfZmlsZSwgRklMRSAqYWxwaGFfZmlsZSwgQk9PTCBpbnRlcmxhY2UsIEJPT0wgYWxwaGEpCi17Ci0gIHBuZ19zdHJ1Y3QgICAgKnBuZ19wdHIgPSBOVUxMOwotICBwbmdfaW5mbyAgICAgICppbmZvX3B0ciA9IE5VTEw7Ci0gIHBuZ19ieXRlICAgICAgKnBuZ19waXhlbHMgPSBOVUxMOwotICBwbmdfYnl0ZSAgICAgICoqcm93X3BvaW50ZXJzID0gTlVMTDsKLSAgcG5nX2J5dGUgICAgICAqcGl4X3B0ciA9IE5VTEw7Ci0gIHBuZ191aW50XzMyICAgcm93X2J5dGVzOwotCi0gIGNoYXIgICAgICAgICAgdHlwZV90b2tlblsxNl07Ci0gIGNoYXIgICAgICAgICAgd2lkdGhfdG9rZW5bMTZdOwotICBjaGFyICAgICAgICAgIGhlaWdodF90b2tlblsxNl07Ci0gIGNoYXIgICAgICAgICAgbWF4dmFsX3Rva2VuWzE2XTsKLSAgaW50ICAgICAgICAgICBjb2xvcl90eXBlOwotICBwbmdfdWludF8zMiAgIHdpZHRoLCBhbHBoYV93aWR0aDsKLSAgcG5nX3VpbnRfMzIgICBoZWlnaHQsIGFscGhhX2hlaWdodDsKLSAgcG5nX3VpbnRfMzIgICBtYXh2YWw7Ci0gIGludCAgICAgICAgICAgYml0X2RlcHRoID0gMDsKLSAgaW50ICAgICAgICAgICBjaGFubmVsczsKLSAgaW50ICAgICAgICAgICBhbHBoYV9kZXB0aCA9IDA7Ci0gIGludCAgICAgICAgICAgYWxwaGFfcHJlc2VudDsKLSAgaW50ICAgICAgICAgICByb3csIGNvbDsKLSAgQk9PTCAgICAgICAgICByYXcsIGFscGhhX3JhdyA9IEZBTFNFOwotICBwbmdfdWludF8zMiAgIHRtcDE2OwotICBpbnQgICAgICAgICAgIGk7Ci0KLSAgLyogcmVhZCBoZWFkZXIgb2YgUE5NIGZpbGUgKi8KLQotICBnZXRfdG9rZW4ocG5tX2ZpbGUsIHR5cGVfdG9rZW4pOwotICBpZiAodHlwZV90b2tlblswXSAhPSAnUCcpCi0gIHsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLSAgZWxzZSBpZiAoKHR5cGVfdG9rZW5bMV0gPT0gJzEnKSB8fCAodHlwZV90b2tlblsxXSA9PSAnNCcpKQotICB7Ci0gICAgcmF3ID0gKHR5cGVfdG9rZW5bMV0gPT0gJzQnKTsKLSAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWTsKLSAgICBiaXRfZGVwdGggPSAxOwotICB9Ci0gIGVsc2UgaWYgKCh0eXBlX3Rva2VuWzFdID09ICcyJykgfHwgKHR5cGVfdG9rZW5bMV0gPT0gJzUnKSkKLSAgewotICAgIHJhdyA9ICh0eXBlX3Rva2VuWzFdID09ICc1Jyk7Ci0gICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVk7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCB3aWR0aF90b2tlbik7Ci0gICAgc3NjYW5mICh3aWR0aF90b2tlbiwgIiVsdSIsICZ3aWR0aCk7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBoZWlnaHRfdG9rZW4pOwotICAgIHNzY2FuZiAoaGVpZ2h0X3Rva2VuLCAiJWx1IiwgJmhlaWdodCk7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBtYXh2YWxfdG9rZW4pOwotICAgIHNzY2FuZiAobWF4dmFsX3Rva2VuLCAiJWx1IiwgJm1heHZhbCk7Ci0gICAgaWYgKG1heHZhbCA8PSAxKQotICAgICAgYml0X2RlcHRoID0gMTsKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMykKLSAgICAgIGJpdF9kZXB0aCA9IDI7Ci0gICAgZWxzZSBpZiAobWF4dmFsIDw9IDE1KQotICAgICAgYml0X2RlcHRoID0gNDsKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMjU1KQotICAgICAgYml0X2RlcHRoID0gODsKLSAgICBlbHNlIC8qIGlmIChtYXh2YWwgPD0gNjU1MzUpICovCi0gICAgICBiaXRfZGVwdGggPSAxNjsKLSAgfQotICBlbHNlIGlmICgodHlwZV90b2tlblsxXSA9PSAnMycpIHx8ICh0eXBlX3Rva2VuWzFdID09ICc2JykpCi0gIHsKLSAgICByYXcgPSAodHlwZV90b2tlblsxXSA9PSAnNicpOwotICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCB3aWR0aF90b2tlbik7Ci0gICAgc3NjYW5mICh3aWR0aF90b2tlbiwgIiVsdSIsICZ3aWR0aCk7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBoZWlnaHRfdG9rZW4pOwotICAgIHNzY2FuZiAoaGVpZ2h0X3Rva2VuLCAiJWx1IiwgJmhlaWdodCk7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBtYXh2YWxfdG9rZW4pOwotICAgIHNzY2FuZiAobWF4dmFsX3Rva2VuLCAiJWx1IiwgJm1heHZhbCk7Ci0gICAgaWYgKG1heHZhbCA8PSAxKQotICAgICAgYml0X2RlcHRoID0gMTsKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMykKLSAgICAgIGJpdF9kZXB0aCA9IDI7Ci0gICAgZWxzZSBpZiAobWF4dmFsIDw9IDE1KQotICAgICAgYml0X2RlcHRoID0gNDsKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMjU1KQotICAgICAgYml0X2RlcHRoID0gODsKLSAgICBlbHNlIC8qIGlmIChtYXh2YWwgPD0gNjU1MzUpICovCi0gICAgICBiaXRfZGVwdGggPSAxNjsKLSAgfQotICBlbHNlCi0gIHsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiByZWFkIGhlYWRlciBvZiBQR00gZmlsZSB3aXRoIGFscGhhIGNoYW5uZWwgKi8KLQotICBpZiAoYWxwaGEpCi0gIHsKLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE7Ci0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsKLQotICAgIGdldF90b2tlbihhbHBoYV9maWxlLCB0eXBlX3Rva2VuKTsKLSAgICBpZiAodHlwZV90b2tlblswXSAhPSAnUCcpCi0gICAgewotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlIGlmICgodHlwZV90b2tlblsxXSA9PSAnMicpIHx8ICh0eXBlX3Rva2VuWzFdID09ICc1JykpCi0gICAgewotICAgICAgYWxwaGFfcmF3ID0gKHR5cGVfdG9rZW5bMV0gPT0gJzUnKTsKLSAgICAgIGdldF90b2tlbihhbHBoYV9maWxlLCB3aWR0aF90b2tlbik7Ci0gICAgICBzc2NhbmYgKHdpZHRoX3Rva2VuLCAiJWx1IiwgJmFscGhhX3dpZHRoKTsKLSAgICAgIGlmIChhbHBoYV93aWR0aCAhPSB3aWR0aCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgZ2V0X3Rva2VuKGFscGhhX2ZpbGUsIGhlaWdodF90b2tlbik7Ci0gICAgICBzc2NhbmYgKGhlaWdodF90b2tlbiwgIiVsdSIsICZhbHBoYV9oZWlnaHQpOwotICAgICAgaWYgKGFscGhhX2hlaWdodCAhPSBoZWlnaHQpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgIGdldF90b2tlbihhbHBoYV9maWxlLCBtYXh2YWxfdG9rZW4pOwotICAgICAgc3NjYW5mIChtYXh2YWxfdG9rZW4sICIlbHUiLCAmbWF4dmFsKTsKLSAgICAgIGlmIChtYXh2YWwgPD0gMSkKLSAgICAgICAgYWxwaGFfZGVwdGggPSAxOwotICAgICAgZWxzZSBpZiAobWF4dmFsIDw9IDMpCi0gICAgICAgIGFscGhhX2RlcHRoID0gMjsKLSAgICAgIGVsc2UgaWYgKG1heHZhbCA8PSAxNSkKLSAgICAgICAgYWxwaGFfZGVwdGggPSA0OwotICAgICAgZWxzZSBpZiAobWF4dmFsIDw9IDI1NSkKLSAgICAgICAgYWxwaGFfZGVwdGggPSA4OwotICAgICAgZWxzZSAvKiBpZiAobWF4dmFsIDw9IDY1NTM1KSAqLwotICAgICAgICBhbHBoYV9kZXB0aCA9IDE2OwotICAgICAgaWYgKGFscGhhX2RlcHRoICE9IGJpdF9kZXB0aCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgfSAvKiBlbmQgaWYgYWxwaGEgKi8KLQotICAvKiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFubmVscyBhbmQgc3RvcmUgYWxwaGEtcHJlc2VuY2UgKi8KLSAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgICBjaGFubmVscyA9IDE7Ci0gIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKLSAgICBjaGFubmVscyA9IDI7Ci0gIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgIGNoYW5uZWxzID0gMzsKLSAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgY2hhbm5lbHMgPSA0OwotICBlbHNlCi0gICAgY2hhbm5lbHMgPSAwOyAvKiBzaG91bGQgbm90IGhhcHBlbiAqLwotCi0gIGFscGhhX3ByZXNlbnQgPSAoY2hhbm5lbHMgLSAxKSAlIDI7Ci0KLSAgLyogcm93X2J5dGVzIGlzIHRoZSB3aWR0aCB4IG51bWJlciBvZiBjaGFubmVscyB4IChiaXQtZGVwdGggLyA4KSAqLwotICByb3dfYnl0ZXMgPSB3aWR0aCAqIGNoYW5uZWxzICogKChiaXRfZGVwdGggPD0gOCkgPyAxIDogMik7Ci0KLSAgaWYgKChwbmdfcGl4ZWxzID0gKHBuZ19ieXRlICopIG1hbGxvYyAocm93X2J5dGVzICogaGVpZ2h0ICogc2l6ZW9mIChwbmdfYnl0ZSkpKSA9PSBOVUxMKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiByZWFkIGRhdGEgZnJvbSBQTk0gZmlsZSAqLwotICBwaXhfcHRyID0gcG5nX3BpeGVsczsKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspCi0gIHsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgKGNoYW5uZWxzIC0gYWxwaGFfcHJlc2VudCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHJhdykKLSAgICAgICAgICAqcGl4X3B0cisrID0gZ2V0X2RhdGEgKHBubV9maWxlLCBiaXRfZGVwdGgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaWYgKGJpdF9kZXB0aCA8PSA4KQotICAgICAgICAgICAgKnBpeF9wdHIrKyA9IGdldF92YWx1ZSAocG5tX2ZpbGUsIGJpdF9kZXB0aCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRtcDE2ID0gZ2V0X3ZhbHVlIChwbm1fZmlsZSwgYml0X2RlcHRoKTsKLSAgICAgICAgICAgICpwaXhfcHRyID0gKHBuZ19ieXRlKSAoKHRtcDE2ID4+IDgpICYgMHhGRik7Ci0gICAgICAgICAgICBwaXhfcHRyKys7Ci0gICAgICAgICAgICAqcGl4X3B0ciA9IChwbmdfYnl0ZSkgKHRtcDE2ICYgMHhGRik7Ci0gICAgICAgICAgICBwaXhfcHRyKys7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoYWxwaGEpIC8qIHJlYWQgYWxwaGEtY2hhbm5lbCBmcm9tIHBnbSBmaWxlICovCi0gICAgICB7Ci0gICAgICAgIGlmIChhbHBoYV9yYXcpCi0gICAgICAgICAgKnBpeF9wdHIrKyA9IGdldF9kYXRhIChhbHBoYV9maWxlLCBhbHBoYV9kZXB0aCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBpZiAoYWxwaGFfZGVwdGggPD0gOCkKLSAgICAgICAgICAgICpwaXhfcHRyKysgPSBnZXRfdmFsdWUgKGFscGhhX2ZpbGUsIGJpdF9kZXB0aCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRtcDE2ID0gZ2V0X3ZhbHVlIChhbHBoYV9maWxlLCBiaXRfZGVwdGgpOwotICAgICAgICAgICAgKnBpeF9wdHIrKyA9IChwbmdfYnl0ZSkgKCh0bXAxNiA+PiA4KSAmIDB4RkYpOwotICAgICAgICAgICAgKnBpeF9wdHIrKyA9IChwbmdfYnl0ZSkgKHRtcDE2ICYgMHhGRik7Ci0gICAgICAgICAgfQotICAgICAgfSAvKiBpZiBhbHBoYSAqLwotCi0gICAgfSAvKiBlbmQgZm9yIGNvbCAqLwotICB9IC8qIGVuZCBmb3Igcm93ICovCi0KLSAgLyogcHJlcGFyZSB0aGUgc3RhbmRhcmQgUE5HIHN0cnVjdHVyZXMgKi8KLSAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0IChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsIE5VTEwsIE5VTEwpOwotICBpZiAoIXBuZ19wdHIpCi0gIHsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLSAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0IChwbmdfcHRyKTsKLSAgaWYgKCFpbmZvX3B0cikKLSAgewotICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCAoJnBuZ19wdHIsIChwbmdfaW5mb3BwKSBOVUxMKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXJlYWRpbmcgbGlicG5nIGZ1bmN0aW9uICovCi0gIGlmIChzZXRqbXAgKHBuZ19qbXBidWYocG5nX3B0cikpKQotICB7Ci0gICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmcG5nX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIGluaXRpYWxpemUgdGhlIHBuZyBzdHJ1Y3R1cmUgKi8KLSAgcG5nX2luaXRfaW8gKHBuZ19wdHIsIHBuZ19maWxlKTsKLQotICAvKiB3ZSdyZSBnb2luZyB0byB3cml0ZSBtb3JlIG9yIGxlc3MgdGhlIHNhbWUgUE5HIGFzIHRoZSBpbnB1dCBmaWxlICovCi0gIHBuZ19zZXRfSUhEUiAocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwgY29sb3JfdHlwZSwKLSAgICAoIWludGVybGFjZSkgPyBQTkdfSU5URVJMQUNFX05PTkUgOiBQTkdfSU5URVJMQUNFX0FEQU03LAotICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsIFBOR19GSUxURVJfVFlQRV9CQVNFKTsKLQotICAvKiB3cml0ZSB0aGUgZmlsZSBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLSAgcG5nX3dyaXRlX2luZm8gKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAvKiBpZiBuZWVkZWQgd2Ugd2lsbCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIG5ldyBhcnJheSBvZiByb3ctcG9pbnRlcnMgKi8KLSAgaWYgKHJvd19wb2ludGVycyA9PSAodW5zaWduZWQgY2hhcioqKSBOVUxMKQotICB7Ci0gICAgaWYgKChyb3dfcG9pbnRlcnMgPSAocG5nX2J5dGUgKiopIG1hbGxvYyAoaGVpZ2h0ICogc2l6ZW9mIChwbmdfYnl0ZXApKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QgKCZwbmdfcHRyLCAocG5nX2luZm9wcCkgTlVMTCk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICB9Ci0KLSAgLyogc2V0IHRoZSBpbmRpdmlkdWFsIHJvd19wb2ludGVycyB0byBwb2ludCBhdCB0aGUgY29ycmVjdCBvZmZzZXRzICovCi0gIGZvciAoaSA9IDA7IGkgPCAoaGVpZ2h0KTsgaSsrKQotICAgIHJvd19wb2ludGVyc1tpXSA9IHBuZ19waXhlbHMgKyBpICogcm93X2J5dGVzOwotCi0gIC8qIHdyaXRlIG91dCB0aGUgZW50aXJlIGltYWdlIGRhdGEgaW4gb25lIGNhbGwgKi8KLSAgcG5nX3dyaXRlX2ltYWdlIChwbmdfcHRyLCByb3dfcG9pbnRlcnMpOwotCi0gIC8qIHdyaXRlIHRoZSBhZGRpdGlvbmFsIGNodW5ja3MgdG8gdGhlIFBORyBmaWxlIChub3QgcmVhbGx5IG5lZWRlZCkgKi8KLSAgcG5nX3dyaXRlX2VuZCAocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gIC8qIGNsZWFuIHVwIGFmdGVyIHRoZSB3cml0ZSwgYW5kIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgKi8KLSAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmcG5nX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOwotCi0gIGlmIChyb3dfcG9pbnRlcnMgIT0gKHVuc2lnbmVkIGNoYXIqKikgTlVMTCkKLSAgICBmcmVlIChyb3dfcG9pbnRlcnMpOwotICBpZiAocG5nX3BpeGVscyAhPSAodW5zaWduZWQgY2hhciopIE5VTEwpCi0gICAgZnJlZSAocG5nX3BpeGVscyk7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19IC8qIGVuZCBvZiBwbm0ycG5nICovCi0KLS8qCi0gKiBnZXRfdG9rZW4oKSAtIGdldHMgdGhlIGZpcnN0IHN0cmluZyBhZnRlciB3aGl0ZXNwYWNlCi0gKi8KLQotdm9pZCBnZXRfdG9rZW4oRklMRSAqcG5tX2ZpbGUsIGNoYXIgKnRva2VuKQotewotICBpbnQgaSA9IDA7Ci0KLSAgLyogcmVtb3ZlIHdoaXRlLXNwYWNlICovCi0gIGRvCi0gIHsKLSAgICB0b2tlbltpXSA9ICh1bnNpZ25lZCBjaGFyKSBmZ2V0YyAocG5tX2ZpbGUpOwotICB9Ci0gIHdoaWxlICgodG9rZW5baV0gPT0gJ1xuJykgfHwgKHRva2VuW2ldID09ICdccicpIHx8ICh0b2tlbltpXSA9PSAnICcpKTsKLQotICAvKiByZWFkIHN0cmluZyAqLwotICBkbwotICB7Ci0gICAgaSsrOwotICAgIHRva2VuW2ldID0gKHVuc2lnbmVkIGNoYXIpIGZnZXRjIChwbm1fZmlsZSk7Ci0gIH0KLSAgd2hpbGUgKCh0b2tlbltpXSAhPSAnXG4nKSAmJiAodG9rZW5baV0gIT0gJ1xyJykgJiYgKHRva2VuW2ldICE9ICcgJykpOwotCi0gIHRva2VuW2ldID0gJ1wwJzsKLQotICByZXR1cm47Ci19Ci0KLS8qCi0gKiBnZXRfZGF0YSgpIC0gdGFrZXMgZmlyc3QgYnl0ZSBhbmQgY29udmVydHMgaW50byBuZXh0IHBpeGVsIHZhbHVlLAotICogICAgICAgIHRha2luZyBhcyBtdWNoIGJpdHMgYXMgZGVmaW5lZCBieSBiaXQtZGVwdGggYW5kCi0gKiAgICAgICAgdXNpbmcgdGhlIGJpdC1kZXB0aCB0byBmaWxsIHVwIGEgYnl0ZSAoMEFoIC0+IEFBaCkKLSAqLwotCi1wbmdfdWludF8zMiBnZXRfZGF0YSAoRklMRSAqcG5tX2ZpbGUsIGludCBkZXB0aCkKLXsKLSAgc3RhdGljIGludCBiaXRzX2xlZnQgPSAwOwotICBzdGF0aWMgaW50IG9sZF92YWx1ZSA9IDA7Ci0gIHN0YXRpYyBpbnQgbWFzayA9IDA7Ci0gIGludCBpOwotICBwbmdfdWludF8zMiByZXRfdmFsdWU7Ci0KLSAgaWYgKG1hc2sgPT0gMCkKLSAgICBmb3IgKGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKLSAgICAgIG1hc2sgPSAobWFzayA+PiAxKSB8IDB4ODA7Ci0KLSAgaWYgKGJpdHNfbGVmdCA8PSAwKQotICB7Ci0gICAgb2xkX3ZhbHVlID0gZmdldGMgKHBubV9maWxlKTsKLSAgICBiaXRzX2xlZnQgPSA4OwotICB9Ci0KLSAgcmV0X3ZhbHVlID0gb2xkX3ZhbHVlICYgbWFzazsKLSAgZm9yIChpID0gMTsgaSA8ICg4IC8gZGVwdGgpOyBpKyspCi0gICAgcmV0X3ZhbHVlID0gcmV0X3ZhbHVlIHx8IChyZXRfdmFsdWUgPj4gZGVwdGgpOwotCi0gIG9sZF92YWx1ZSA9IChvbGRfdmFsdWUgPDwgZGVwdGgpICYgMHhGRjsKLSAgYml0c19sZWZ0IC09IGRlcHRoOwotCi0gIHJldHVybiByZXRfdmFsdWU7Ci19Ci0KLS8qCi0gKiBnZXRfdmFsdWUoKSAtIHRha2VzIGZpcnN0IChudW1lcmljKSBzdHJpbmcgYW5kIGNvbnZlcnRzIGludG8gbnVtYmVyLAotICogICAgICAgICB1c2luZyB0aGUgYml0LWRlcHRoIHRvIGZpbGwgdXAgYSBieXRlICgwQWggLT4gQUFoKQotICovCi0KLXBuZ191aW50XzMyIGdldF92YWx1ZSAoRklMRSAqcG5tX2ZpbGUsIGludCBkZXB0aCkKLXsKLSAgc3RhdGljIHBuZ191aW50XzMyIG1hc2sgPSAwOwotICBwbmdfYnl0ZSB0b2tlblsxNl07Ci0gIHBuZ191aW50XzMyIHJldF92YWx1ZTsKLSAgaW50IGkgPSAwOwotCi0gIGlmIChtYXNrID09IDApCi0gICAgZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspCi0gICAgICBtYXNrID0gKG1hc2sgPDwgMSkgfCAweDAxOwotCi0gIGdldF90b2tlbiAocG5tX2ZpbGUsIChjaGFyICopIHRva2VuKTsKLSAgc3NjYW5mICgoY29uc3QgY2hhciAqKSB0b2tlbiwgIiVsdSIsICZyZXRfdmFsdWUpOwotCi0gIHJldF92YWx1ZSAmPSBtYXNrOwotCi0gIGlmIChkZXB0aCA8IDgpCi0gICAgZm9yIChpID0gMDsgaSA8ICg4IC8gZGVwdGgpOyBpKyspCi0gICAgICByZXRfdmFsdWUgPSAocmV0X3ZhbHVlIDw8IGRlcHRoKSB8fCByZXRfdmFsdWU7Ci0KLSAgcmV0dXJuIHJldF92YWx1ZTsKLX0KLQotLyogZW5kIG9mIHNvdXJjZSAqLwotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuc2ggYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OWRmMmYuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyEvYmluL3NoCi0jIC0tIGdyYXlzY2FsZQotLi9wbm0ycG5nIGJhc24wZzAxLnBnbSBiYXNuMGcwMS5wbmcKLS4vcG5tMnBuZyBiYXNuMGcwMi5wZ20gYmFzbjBnMDIucG5nCi0uL3BubTJwbmcgYmFzbjBnMDQucGdtIGJhc24wZzA0LnBuZwotLi9wbm0ycG5nIGJhc24wZzA4LnBnbSBiYXNuMGcwOC5wbmcKLS4vcG5tMnBuZyBiYXNuMGcxNi5wZ20gYmFzbjBnMTYucG5nCi0jIC0tIGZ1bGwtY29sb3IKLS4vcG5tMnBuZyBiYXNuMmMwOC5wcG0gYmFzbjJjMDgucG5nCi0uL3BubTJwbmcgYmFzbjJjMTYucHBtIGJhc24yYzE2LnBuZwotIyAtLSBwYWxsZXR0ZWQKLS4vcG5tMnBuZyBiYXNuM3AwMS5wcG0gYmFzbjNwMDEucG5nCi0uL3BubTJwbmcgYmFzbjNwMDIucHBtIGJhc24zcDAyLnBuZwotLi9wbm0ycG5nIGJhc24zcDA0LnBwbSBiYXNuM3AwNC5wbmcKLS4vcG5tMnBuZyBiYXNuM3AwOC5wcG0gYmFzbjNwMDgucG5nCi0jIC0tIGdyYXkgd2l0aCBhbHBoYS1jaGFubmVsCi0uL3BubTJwbmcgLWFscGhhIGJhc242YTA4LnBnbSBiYXNuNGEwOC5wZ20gYmFzbjRhMDgucG5nCi0uL3BubTJwbmcgLWFscGhhIGJhc242YTE2LnBnbSBiYXNuNGExNi5wZ20gYmFzbjRhMTYucG5nCi0jIC0tIGNvbG9yIHdpdGggYWxwaGEtY2hhbm5lbAotLi9wbm0ycG5nIC1hbHBoYSBiYXNuNmEwOC5wZ20gYmFzbjZhMDgucHBtIGJhc242YTA4LnBuZwotLi9wbm0ycG5nIC1hbHBoYSBiYXNuNmExNi5wZ20gYmFzbjZhMTYucHBtIGJhc242YTE2LnBuZwotIyAtLSBncmF5c2NhbGUKLS4vcG5tMnBuZyByYXduMGcwMS5wZ20gcmF3bjBnMDEucG5nCi0uL3BubTJwbmcgcmF3bjBnMDIucGdtIHJhd24wZzAyLnBuZwotLi9wbm0ycG5nIHJhd24wZzA0LnBnbSByYXduMGcwNC5wbmcKLS4vcG5tMnBuZyByYXduMGcwOC5wZ20gcmF3bjBnMDgucG5nCi0uL3BubTJwbmcgcmF3bjBnMTYucGdtIHJhd24wZzE2LnBuZwotIyAtLSBmdWxsLWNvbG9yCi0uL3BubTJwbmcgcmF3bjJjMDgucHBtIHJhd24yYzA4LnBuZwotLi9wbm0ycG5nIHJhd24yYzE2LnBwbSByYXduMmMxNi5wbmcKLSMgLS0gcGFsbGV0dGVkCi0uL3BubTJwbmcgcmF3bjNwMDEucHBtIHJhd24zcDAxLnBuZwotLi9wbm0ycG5nIHJhd24zcDAyLnBwbSByYXduM3AwMi5wbmcKLS4vcG5tMnBuZyByYXduM3AwNC5wcG0gcmF3bjNwMDQucG5nCi0uL3BubTJwbmcgcmF3bjNwMDgucHBtIHJhd24zcDA4LnBuZwotIyAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbAotLi9wbm0ycG5nIC1hbHBoYSByYXduNmEwOC5wZ20gcmF3bjRhMDgucGdtIHJhd240YTA4LnBuZwotLi9wbm0ycG5nIC1hbHBoYSByYXduNmExNi5wZ20gcmF3bjRhMTYucGdtIHJhd240YTE2LnBuZwotIyAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwKLS4vcG5tMnBuZyAtYWxwaGEgcmF3bjZhMDgucGdtIHJhd242YTA4LnBwbSByYXduNmEwOC5wbmcKLS4vcG5tMnBuZyAtYWxwaGEgcmF3bjZhMTYucGdtIHJhd242YTE2LnBwbSByYXduNmExNi5wbmcKLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9SRUFETUUgYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0ZDEyYy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLQotcG5nc3VpdGUKLS0tLS0tLS0tCi0oYykgV2lsbGVtIHZhbiBTY2hhaWssIDE5OTkKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIGFuZCBkaXN0cmlidXRlIHRoZXNlIGltYWdlcyBmb3IgYW55IHB1cnBvc2UgYW5kCi13aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4KLQotVGhlc2UgMTUgaW1hZ2VzIGFyZSBwYXJ0IG9mIHRoZSBtdWNoIGxhcmdlciBQbmdTdWl0ZSB0ZXN0LXNldCBvZiAKLWltYWdlcywgYXZhaWxhYmxlIGZvciBkZXZlbG9wZXJzIG9mIFBORyBzdXBwb3J0aW5nIHNvZnR3YXJlLiBUaGUgCi1jb21wbGV0ZSBzZXQsIGF2YWlsYWJsZSBhdCBodHRwOi93d3cuc2NoYWlrLmNvbS9wbmdzdWl0ZS8sIGNvbnRhaW5zIAotYSB2YXJpZXR5IG9mIGltYWdlcyB0byB0ZXN0IGludGVybGFjaW5nLCBnYW1tYSBzZXR0aW5ncywgYW5jaWxsYXJ5Ci1jaHVua3MsIGV0Yy4KLQotVGhlIGltYWdlcyBpbiB0aGlzIGRpcmVjdG9yeSByZXByZXNlbnQgdGhlIGJhc2ljIFBORyBjb2xvci10eXBlczoKLWdyYXlzY2FsZSAoMS0xNiBiaXQgZGVlcCksIGZ1bGwgY29sb3IgKDggb3IgMTYgYml0KSwgcGFsZXR0ZWQKLSgxLTggYml0KSBhbmQgZ3JheXNjYWxlIG9yIGNvbG9yIGltYWdlcyB3aXRoIGFscGhhIGNoYW5uZWwuIFlvdQotY2FuIHVzZSB0aGVtIHRvIHRlc3QgdGhlIHByb3BlciBmdW5jdGlvbmluZyBvZiBQTkcgc29mdHdhcmUuCi0KLSAgICBmaWxlbmFtZSAgICAgIGRlcHRoIHR5cGUKLSAgICAtLS0tLS0tLS0tLS0gLS0tLS0tIC0tLS0tLS0tLS0tLS0tCi0gICAgYmFzbjBnMDEucG5nICAxLWJpdCBncmF5c2NhbGUKLSAgICBiYXNuMGcwMi5wbmcgIDItYml0IGdyYXlzY2FsZQotICAgIGJhc24wZzA0LnBuZyAgNC1iaXQgZ3JheXNjYWxlCi0gICAgYmFzbjBnMDgucG5nICA4LWJpdCBncmF5c2NhbGUKLSAgICBiYXNuMGcxNi5wbmcgMTYtYml0IGdyYXlzY2FsZQotICAgIGJhc24yYzA4LnBuZyAgOC1iaXQgdHJ1ZWNvbG9yCi0gICAgYmFzbjJjMTYucG5nIDE2LWJpdCB0cnVlY29sb3IKLSAgICBiYXNuM3AwMS5wbmcgIDEtYml0IHBhbGV0dGVkCi0gICAgYmFzbjNwMDIucG5nICAyLWJpdCBwYWxldHRlZAotICAgIGJhc24zcDA0LnBuZyAgNC1iaXQgcGFsZXR0ZWQKLSAgICBiYXNuM3AwOC5wbmcgIDgtYml0IHBhbGV0dGVkCi0gICAgYmFzbjRhMDgucG5nICA4LWJpdCBncmF5IHdpdGggYWxwaGEKLSAgICBiYXNuNGExNi5wbmcgMTYtYml0IGdyYXkgd2l0aCBhbHBoYQotICAgIGJhc242YTA4LnBuZyAgOC1iaXQgUkdCQQotICAgIGJhc242YTE2LnBuZyAxNi1iaXQgUkdCQQotCi1IZXJlIGlzIHRoZSBjb3JyZWN0IHJlc3VsdCBvZiB0eXBpbmcgInBuZ3Rlc3QgLW0gKi5wbmciIGluCi10aGlzIGRpcmVjdG9yeToKLQotVGVzdGluZyBiYXNuMGcwMS5wbmc6IFBBU1MgKDUyNCB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDAgd2FzIHVzZWQgMzIgdGltZXMKLVRlc3RpbmcgYmFzbjBnMDIucG5nOiBQQVNTICg0NDggemVybyBzYW1wbGVzKQotIEZpbHRlciAwIHdhcyB1c2VkIDMyIHRpbWVzCi1UZXN0aW5nIGJhc24wZzA0LnBuZzogUEFTUyAoNTIwIHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMCB3YXMgdXNlZCAzMiB0aW1lcwotVGVzdGluZyBiYXNuMGcwOC5wbmc6IFBBU1MgKDMgemVybyBzYW1wbGVzKQotIEZpbHRlciAxIHdhcyB1c2VkIDkgdGltZXMKLSBGaWx0ZXIgNCB3YXMgdXNlZCAyMyB0aW1lcwotVGVzdGluZyBiYXNuMGcxNi5wbmc6IFBBU1MgKDEgemVybyBzYW1wbGVzKQotIEZpbHRlciAxIHdhcyB1c2VkIDEgdGltZXMKLSBGaWx0ZXIgMiB3YXMgdXNlZCAzMSB0aW1lcwotVGVzdGluZyBiYXNuMmMwOC5wbmc6IFBBU1MgKDYgemVybyBzYW1wbGVzKQotIEZpbHRlciAxIHdhcyB1c2VkIDUgdGltZXMKLSBGaWx0ZXIgNCB3YXMgdXNlZCAyNyB0aW1lcwotVGVzdGluZyBiYXNuMmMxNi5wbmc6IFBBU1MgKDU5MiB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDEgd2FzIHVzZWQgMSB0aW1lcwotIEZpbHRlciA0IHdhcyB1c2VkIDMxIHRpbWVzCi1UZXN0aW5nIGJhc24zcDAxLnBuZzogUEFTUyAoNTEyIHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMCB3YXMgdXNlZCAzMiB0aW1lcwotVGVzdGluZyBiYXNuM3AwMi5wbmc6IFBBU1MgKDQ0OCB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDAgd2FzIHVzZWQgMzIgdGltZXMKLVRlc3RpbmcgYmFzbjNwMDQucG5nOiBQQVNTICg1NDQgemVybyBzYW1wbGVzKQotIEZpbHRlciAwIHdhcyB1c2VkIDMyIHRpbWVzCi1UZXN0aW5nIGJhc24zcDA4LnBuZzogUEFTUyAoNCB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDAgd2FzIHVzZWQgMzIgdGltZXMKLVRlc3RpbmcgYmFzbjRhMDgucG5nOiBQQVNTICgzMiB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDEgd2FzIHVzZWQgMSB0aW1lcwotIEZpbHRlciA0IHdhcyB1c2VkIDMxIHRpbWVzCi1UZXN0aW5nIGJhc240YTE2LnBuZzogUEFTUyAoNjQgemVybyBzYW1wbGVzKQotIEZpbHRlciAwIHdhcyB1c2VkIDEgdGltZXMKLSBGaWx0ZXIgMSB3YXMgdXNlZCAyIHRpbWVzCi0gRmlsdGVyIDIgd2FzIHVzZWQgMSB0aW1lcwotIEZpbHRlciA0IHdhcyB1c2VkIDI4IHRpbWVzCi1UZXN0aW5nIGJhc242YTA4LnBuZzogUEFTUyAoMTYwIHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMSB3YXMgdXNlZCAxIHRpbWVzCi0gRmlsdGVyIDQgd2FzIHVzZWQgMzEgdGltZXMKLVRlc3RpbmcgYmFzbjZhMTYucG5nOiBQQVNTICgxMDcyIHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMSB3YXMgdXNlZCA0IHRpbWVzCi0gRmlsdGVyIDQgd2FzIHVzZWQgMjggdGltZXMKLWxpYnBuZyBwYXNzZXMgdGVzdAotCi1XaWxsZW0gdmFuIFNjaGFpawotPHdpbGxlbUBzY2hhaWsuY29tPgotT2N0b2JlciAxOTk5CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAxLnBuZyBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzFlMWM3Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMi5wbmcgYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4MDlkZC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDQucG5nIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTA4OWMuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA4LnBuZyBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjUyMmVlLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcxNi5wbmcgYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4ZWJjYS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjJjMDgucG5nIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDJmOTEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzE2LnBuZyBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjJjMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmQ0YTRkLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjJjMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMS5wbmcgYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxZGI1OS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDIucG5nIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMGFiNjEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA0LnBuZyBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGM2ZWFjLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwOC5wbmcgYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwN2Y0OC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjRhMDgucG5nIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYjBkZDAuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc240YTE2LnBuZyBiL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjRhMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJlZTlmLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjRhMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuNmEwOC5wbmcgYi9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc242YTA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwNjIzMC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3BuZ3N1aXRlL2Jhc242YTA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjZhMTYucG5nIGIvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YmYzY2IuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUG5nRmlsZS5jIGIvbGlicy9saWJwbmcvY29udHJpYi92aXN1cG5nL1BuZ0ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5YWZlOS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUG5nRmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIFBOR0ZJTEUuQyAtLSBJbWFnZSBGaWxlIEZ1bmN0aW9ucwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIENvcHlyaWdodCAyMDAwLCBXaWxsZW0gdmFuIFNjaGFpay4gIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQKLS8vIHVzZSwgc2VlIHRoZSBjb3B5cmlnaHQvbGljZW5zZS9kaXNjbGFpbWVyIG5vdGljZSBpbiBwbmcuaAotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPGNvbW1kbGcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAicG5nLmgiCi0jaW5jbHVkZSAicG5nZmlsZS5oIgotI2luY2x1ZGUgImNleGNlcHQuaCIKLQotZGVmaW5lX2V4Y2VwdGlvbl90eXBlKGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IHRoZV9leGNlcHRpb25fY29udGV4dFsxXTsKLXN0cnVjdCBleGNlcHRpb25fY29udGV4dCB0aGVfZXhjZXB0aW9uX2NvbnRleHRbMV07Ci1wbmdfY29uc3RfY2hhcnAgbXNnOwotCi1zdGF0aWMgT1BFTkZJTEVOQU1FIG9mbjsKLQotc3RhdGljIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBOVUxMOwotc3RhdGljIHBuZ19pbmZvcCBpbmZvX3B0ciA9IE5VTEw7Ci0KLQotLy8gY2V4Y2VwdCBpbnRlcmZhY2UKLQotc3RhdGljIHZvaWQKLXBuZ19jZXhjZXB0X2Vycm9yKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtc2cpCi17Ci0gICBpZihwbmdfcHRyKQotICAgICA7Ci0jaWZuZGVmIFBOR19OT19DT05TT0xFX0lPCi0gICBmcHJpbnRmKHN0ZGVyciwgImxpYnBuZyBlcnJvcjogJXNcbiIsIG1zZyk7Ci0jZW5kaWYKLSAgIHsKLSAgICAgIFRocm93IG1zZzsKLSAgIH0KLX0KLQotLy8gV2luZG93cyBvcGVuLWZpbGUgZnVuY3Rpb25zCi0KLXZvaWQgUG5nRmlsZUluaXRpYWxpemUgKEhXTkQgaHduZCkKLXsKLSAgICBzdGF0aWMgVENIQVIgc3pGaWx0ZXJbXSA9IFRFWFQgKCJQTkcgRmlsZXMgKCouUE5HKVwwKi5wbmdcMCIpCi0gICAgICAgIFRFWFQgKCJBbGwgRmlsZXMgKCouKilcMCouKlwwXDAiKTsKLQotICAgIG9mbi5sU3RydWN0U2l6ZSAgICAgICA9IHNpemVvZiAoT1BFTkZJTEVOQU1FKTsKLSAgICBvZm4uaHduZE93bmVyICAgICAgICAgPSBod25kOwotICAgIG9mbi5oSW5zdGFuY2UgICAgICAgICA9IE5VTEw7Ci0gICAgb2ZuLmxwc3RyRmlsdGVyICAgICAgID0gc3pGaWx0ZXI7Ci0gICAgb2ZuLmxwc3RyQ3VzdG9tRmlsdGVyID0gTlVMTDsKLSAgICBvZm4ubk1heEN1c3RGaWx0ZXIgICAgPSAwOwotICAgIG9mbi5uRmlsdGVySW5kZXggICAgICA9IDA7Ci0gICAgb2ZuLmxwc3RyRmlsZSAgICAgICAgID0gTlVMTDsgICAgICAgICAgLy8gU2V0IGluIE9wZW4gYW5kIENsb3NlIGZ1bmN0aW9ucwotICAgIG9mbi5uTWF4RmlsZSAgICAgICAgICA9IE1BWF9QQVRIOwotICAgIG9mbi5scHN0ckZpbGVUaXRsZSAgICA9IE5VTEw7ICAgICAgICAgIC8vIFNldCBpbiBPcGVuIGFuZCBDbG9zZSBmdW5jdGlvbnMKLSAgICBvZm4ubk1heEZpbGVUaXRsZSAgICAgPSBNQVhfUEFUSDsKLSAgICBvZm4ubHBzdHJJbml0aWFsRGlyICAgPSBOVUxMOwotICAgIG9mbi5scHN0clRpdGxlICAgICAgICA9IE5VTEw7Ci0gICAgb2ZuLkZsYWdzICAgICAgICAgICAgID0gMDsgICAgICAgICAgICAgLy8gU2V0IGluIE9wZW4gYW5kIENsb3NlIGZ1bmN0aW9ucwotICAgIG9mbi5uRmlsZU9mZnNldCAgICAgICA9IDA7Ci0gICAgb2ZuLm5GaWxlRXh0ZW5zaW9uICAgID0gMDsKLSAgICBvZm4ubHBzdHJEZWZFeHQgICAgICAgPSBURVhUICgicG5nIik7Ci0gICAgb2ZuLmxDdXN0RGF0YSAgICAgICAgID0gMDsKLSAgICBvZm4ubHBmbkhvb2sgICAgICAgICAgPSBOVUxMOwotICAgIG9mbi5scFRlbXBsYXRlTmFtZSAgICA9IE5VTEw7Ci19Ci0KLUJPT0wgUG5nRmlsZU9wZW5EbGcgKEhXTkQgaHduZCwgUFRTVFIgcHN0ckZpbGVOYW1lLCBQVFNUUiBwc3RyVGl0bGVOYW1lKQotewotICAgIG9mbi5od25kT3duZXIgICAgICAgICA9IGh3bmQ7Ci0gICAgb2ZuLmxwc3RyRmlsZSAgICAgICAgID0gcHN0ckZpbGVOYW1lOwotICAgIG9mbi5scHN0ckZpbGVUaXRsZSAgICA9IHBzdHJUaXRsZU5hbWU7Ci0gICAgb2ZuLkZsYWdzICAgICAgICAgICAgID0gT0ZOX0hJREVSRUFET05MWTsKLQotICAgIHJldHVybiBHZXRPcGVuRmlsZU5hbWUgKCZvZm4pOwotfQotCi1CT09MIFBuZ0ZpbGVTYXZlRGxnIChIV05EIGh3bmQsIFBUU1RSIHBzdHJGaWxlTmFtZSwgUFRTVFIgcHN0clRpdGxlTmFtZSkKLXsKLSAgICBvZm4uaHduZE93bmVyICAgICAgICAgPSBod25kOwotICAgIG9mbi5scHN0ckZpbGUgICAgICAgICA9IHBzdHJGaWxlTmFtZTsKLSAgICBvZm4ubHBzdHJGaWxlVGl0bGUgICAgPSBwc3RyVGl0bGVOYW1lOwotICAgIG9mbi5GbGFncyAgICAgICAgICAgICA9IE9GTl9ISURFUkVBRE9OTFkgfCBPRk5fT1ZFUldSSVRFUFJPTVBUOwotCi0gICAgcmV0dXJuIEdldFNhdmVGaWxlTmFtZSAoJm9mbik7Ci19Ci0KLS8vIFBORyBpbWFnZSBoYW5kbGVyIGZ1bmN0aW9ucwotCi1CT09MIFBuZ0xvYWRJbWFnZSAoUFRTVFIgcHN0ckZpbGVOYW1lLCBwbmdfYnl0ZSAqKnBwYkltYWdlRGF0YSwKLSAgICAgICAgICAgICAgICAgICBpbnQgKnBpV2lkdGgsIGludCAqcGlIZWlnaHQsIGludCAqcGlDaGFubmVscywgcG5nX2NvbG9yICpwQmtnQ29sb3IpCi17Ci0gICAgc3RhdGljIEZJTEUgICAgICAgICpwZkZpbGU7Ci0gICAgcG5nX2J5dGUgICAgICAgICAgICBwYlNpZ1s4XTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGlCaXREZXB0aDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGlDb2xvclR5cGU7Ci0gICAgZG91YmxlICAgICAgICAgICAgICBkR2FtbWE7Ci0gICAgcG5nX2NvbG9yXzE2ICAgICAgICpwQmFja2dyb3VuZDsKLSAgICBwbmdfdWludF8zMiAgICAgICAgIHVsQ2hhbm5lbHM7Ci0gICAgcG5nX3VpbnRfMzIgICAgICAgICB1bFJvd0J5dGVzOwotICAgIHBuZ19ieXRlICAgICAgICAgICAqcGJJbWFnZURhdGEgPSAqcHBiSW1hZ2VEYXRhOwotICAgIHN0YXRpYyBwbmdfYnl0ZSAgICoqcHBiUm93UG9pbnRlcnMgPSBOVUxMOwotICAgIGludCAgICAgICAgICAgICAgICAgaTsKLQotICAgIC8vIG9wZW4gdGhlIFBORyBpbnB1dCBmaWxlCi0KLSAgICBpZiAoIXBzdHJGaWxlTmFtZSkKLSAgICB7Ci0gICAgICAgICpwcGJJbWFnZURhdGEgPSBwYkltYWdlRGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoIShwZkZpbGUgPSBmb3Blbihwc3RyRmlsZU5hbWUsICJyYiIpKSkKLSAgICB7Ci0gICAgICAgICpwcGJJbWFnZURhdGEgPSBwYkltYWdlRGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBmaXJzdCBjaGVjayB0aGUgZWlnaHQgYnl0ZSBQTkcgc2lnbmF0dXJlCi0KLSAgICBmcmVhZChwYlNpZywgMSwgOCwgcGZGaWxlKTsKLSAgICBpZiAoIXBuZ19jaGVja19zaWcocGJTaWcsIDgpKQotICAgIHsKLSAgICAgICAgKnBwYkltYWdlRGF0YSA9IHBiSW1hZ2VEYXRhID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSB0aGUgdHdvIHBuZygtaW5mbykgc3RydWN0dXJlcwotCi0gICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLAotICAgICAgKHBuZ19lcnJvcl9wdHIpcG5nX2NleGNlcHRfZXJyb3IsIChwbmdfZXJyb3JfcHRyKU5VTEwpOwotICAgIGlmICghcG5nX3B0cikKLSAgICB7Ci0gICAgICAgICpwcGJJbWFnZURhdGEgPSBwYkltYWdlRGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICAgaWYgKCFpbmZvX3B0cikKLSAgICB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgKnBwYkltYWdlRGF0YSA9IHBiSW1hZ2VEYXRhID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIFRyeQotICAgIHsKLSAgICAgICAgCi0gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHBuZyBzdHJ1Y3R1cmUKLSAgICAgICAgCi0jaWYgIWRlZmluZWQoUE5HX05PX1NURElPKQotICAgICAgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBwZkZpbGUpOwotI2Vsc2UKLSAgICAgICAgcG5nX3NldF9yZWFkX2ZuKHBuZ19wdHIsIChwbmdfdm9pZHApcGZGaWxlLCBwbmdfcmVhZF9kYXRhKTsKLSNlbmRpZgotICAgICAgICAKLSAgICAgICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgOCk7Ci0gICAgICAgIAotICAgICAgICAvLyByZWFkIGFsbCBQTkcgaW5mbyB1cCB0byBpbWFnZSBkYXRhCi0gICAgICAgIAotICAgICAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGdldCB3aWR0aCwgaGVpZ2h0LCBiaXQtZGVwdGggYW5kIGNvbG9yLXR5cGUKLSAgICAgICAgCi0gICAgICAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgcGlXaWR0aCwgcGlIZWlnaHQsICZpQml0RGVwdGgsCi0gICAgICAgICAgICAmaUNvbG9yVHlwZSwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIAotICAgICAgICAvLyBleHBhbmQgaW1hZ2VzIG9mIGFsbCBjb2xvci10eXBlIGFuZCBiaXQtZGVwdGggdG8gM3g4IGJpdCBSR0IgaW1hZ2VzCi0gICAgICAgIC8vIGxldCB0aGUgbGlicmFyeSBwcm9jZXNzIHRoaW5ncyBsaWtlIGFscGhhLCB0cmFuc3BhcmVuY3ksIGJhY2tncm91bmQKLSAgICAgICAgCi0gICAgICAgIGlmIChpQml0RGVwdGggPT0gMTYpCi0gICAgICAgICAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOwotICAgICAgICBpZiAoaUNvbG9yVHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0gICAgICAgIGlmIChpQml0RGVwdGggPCA4KQotICAgICAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0gICAgICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT190Uk5TKSkKLSAgICAgICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOwotICAgICAgICBpZiAoaUNvbG9yVHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8Ci0gICAgICAgICAgICBpQ29sb3JUeXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOwotICAgICAgICAKLSAgICAgICAgLy8gc2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIGRyYXcgdHJhbnNwYXJlbnQgYW5kIGFscGhhIGltYWdlcyBvdmVyLgotICAgICAgICBpZiAocG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmcEJhY2tncm91bmQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfc2V0X2JhY2tncm91bmQocG5nX3B0ciwgcEJhY2tncm91bmQsIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUsIDEsIDEuMCk7Ci0gICAgICAgICAgICBwQmtnQ29sb3ItPnJlZCAgID0gKGJ5dGUpIHBCYWNrZ3JvdW5kLT5yZWQ7Ci0gICAgICAgICAgICBwQmtnQ29sb3ItPmdyZWVuID0gKGJ5dGUpIHBCYWNrZ3JvdW5kLT5ncmVlbjsKLSAgICAgICAgICAgIHBCa2dDb2xvci0+Ymx1ZSAgPSAoYnl0ZSkgcEJhY2tncm91bmQtPmJsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQmtnQ29sb3IgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBpZiByZXF1aXJlZCBzZXQgZ2FtbWEgY29udmVyc2lvbgotICAgICAgICBpZiAocG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZEdhbW1hKSkKLSAgICAgICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgKGRvdWJsZSkgMi4yLCBkR2FtbWEpOwotICAgICAgICAKLSAgICAgICAgLy8gYWZ0ZXIgdGhlIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB1cGRhdGUgaW5mb19wdHIgZGF0YQotICAgICAgICAKLSAgICAgICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotICAgICAgICAKLSAgICAgICAgLy8gZ2V0IGFnYWluIHdpZHRoLCBoZWlnaHQgYW5kIHRoZSBuZXcgYml0LWRlcHRoIGFuZCBjb2xvci10eXBlCi0gICAgICAgIAotICAgICAgICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHBpV2lkdGgsIHBpSGVpZ2h0LCAmaUJpdERlcHRoLAotICAgICAgICAgICAgJmlDb2xvclR5cGUsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIHJvd19ieXRlcyBpcyB0aGUgd2lkdGggeCBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgCi0gICAgICAgIHVsUm93Qnl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgICAgdWxDaGFubmVscyA9IHBuZ19nZXRfY2hhbm5lbHMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgICAgICAKLSAgICAgICAgKnBpQ2hhbm5lbHMgPSB1bENoYW5uZWxzOwotICAgICAgICAKLSAgICAgICAgLy8gbm93IHdlIGNhbiBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgdGhlIGltYWdlCi0gICAgICAgIAotICAgICAgICBpZiAocGJJbWFnZURhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUgKHBiSW1hZ2VEYXRhKTsKLSAgICAgICAgICAgIHBiSW1hZ2VEYXRhID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHBiSW1hZ2VEYXRhID0gKHBuZ19ieXRlICopIG1hbGxvYyh1bFJvd0J5dGVzICogKCpwaUhlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihwbmdfYnl0ZSkpKSA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlZpc3VhbCBQTkc6IG91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgfQotICAgICAgICAqcHBiSW1hZ2VEYXRhID0gcGJJbWFnZURhdGE7Ci0gICAgICAgIAotICAgICAgICAvLyBhbmQgYWxsb2NhdGUgbWVtb3J5IGZvciBhbiBhcnJheSBvZiByb3ctcG9pbnRlcnMKLSAgICAgICAgCi0gICAgICAgIGlmICgocHBiUm93UG9pbnRlcnMgPSAocG5nX2J5dGVwcCkgbWFsbG9jKCgqcGlIZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YocG5nX2J5dGVwKSkpID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVmlzdWFsIFBORzogb3V0IG9mIG1lbW9yeSIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzZXQgdGhlIGluZGl2aWR1YWwgcm93LXBvaW50ZXJzIHRvIHBvaW50IGF0IHRoZSBjb3JyZWN0IG9mZnNldHMKLSAgICAgICAgCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAoKnBpSGVpZ2h0KTsgaSsrKQotICAgICAgICAgICAgcHBiUm93UG9pbnRlcnNbaV0gPSBwYkltYWdlRGF0YSArIGkgKiB1bFJvd0J5dGVzOwotICAgICAgICAKLSAgICAgICAgLy8gbm93IHdlIGNhbiBnbyBhaGVhZCBhbmQganVzdCByZWFkIHRoZSB3aG9sZSBpbWFnZQotICAgICAgICAKLSAgICAgICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgcHBiUm93UG9pbnRlcnMpOwotICAgICAgICAKLSAgICAgICAgLy8gcmVhZCB0aGUgYWRkaXRpb25hbCBjaHVua3MgaW4gdGhlIFBORyBmaWxlIChub3QgcmVhbGx5IG5lZWRlZCkKLSAgICAgICAgCi0gICAgICAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBOVUxMKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFuZCB3ZSdyZSBkb25lCi0gICAgICAgIAotICAgICAgICBmcmVlIChwcGJSb3dQb2ludGVycyk7Ci0gICAgICAgIHBwYlJvd1BvaW50ZXJzID0gTlVMTDsKLSAgICAgICAgCi0gICAgICAgIC8vIHllcHAsIGRvbmUKLSAgICB9Ci0KLSAgICBDYXRjaCAobXNnKQotICAgIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0KLSAgICAgICAgKnBwYkltYWdlRGF0YSA9IHBiSW1hZ2VEYXRhID0gTlVMTDsKLSAgICAgICAgCi0gICAgICAgIGlmKHBwYlJvd1BvaW50ZXJzKQotICAgICAgICAgICAgZnJlZSAocHBiUm93UG9pbnRlcnMpOwotCi0gICAgICAgIGZjbG9zZShwZkZpbGUpOwotCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBmY2xvc2UgKHBmRmlsZSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi1CT09MIFBuZ1NhdmVJbWFnZSAoUFRTVFIgcHN0ckZpbGVOYW1lLCBwbmdfYnl0ZSAqcERpRGF0YSwKLSAgICAgICAgICAgICAgICAgICBpbnQgaVdpZHRoLCBpbnQgaUhlaWdodCwgcG5nX2NvbG9yIGJrZ0NvbG9yKQotewotICAgIGNvbnN0IGludCAgICAgICAgICAgY2lCaXREZXB0aCA9IDg7Ci0gICAgY29uc3QgaW50ICAgICAgICAgICBjaUNoYW5uZWxzID0gMzsKLQotICAgIHN0YXRpYyBGSUxFICAgICAgICAqcGZGaWxlOwotICAgIHBuZ191aW50XzMyICAgICAgICAgdWxSb3dCeXRlczsKLSAgICBzdGF0aWMgcG5nX2J5dGUgICAqKnBwYlJvd1BvaW50ZXJzID0gTlVMTDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0KLSAgICAvLyBvcGVuIHRoZSBQTkcgb3V0cHV0IGZpbGUKLQotICAgIGlmICghcHN0ckZpbGVOYW1lKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAoIShwZkZpbGUgPSBmb3Blbihwc3RyRmlsZU5hbWUsICJ3YiIpKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gcHJlcGFyZSB0aGUgc3RhbmRhcmQgUE5HIHN0cnVjdHVyZXMKLQotICAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsCi0gICAgICAocG5nX2Vycm9yX3B0cilwbmdfY2V4Y2VwdF9lcnJvciwgKHBuZ19lcnJvcl9wdHIpTlVMTCk7Ci0gICAgaWYgKCFwbmdfcHRyKQotICAgIHsKLSAgICAgICAgZmNsb3NlKHBmRmlsZSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICAgaWYgKCFpbmZvX3B0cikgewotICAgICAgICBmY2xvc2UocGZGaWxlKTsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAocG5nX2luZm9wcCkgTlVMTCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBUcnkKLSAgICB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHBuZyBzdHJ1Y3R1cmUKLSAgICAgICAgCi0jaWYgIWRlZmluZWQoUE5HX05PX1NURElPKQotICAgICAgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBwZkZpbGUpOwotI2Vsc2UKLSAgICAgICAgcG5nX3NldF93cml0ZV9mbihwbmdfcHRyLCAocG5nX3ZvaWRwKXBmRmlsZSwgcG5nX3dyaXRlX2RhdGEsIHBuZ19mbHVzaCk7Ci0jZW5kaWYKLSAgICAgICAgCi0gICAgICAgIC8vIHdlJ3JlIGdvaW5nIHRvIHdyaXRlIGEgdmVyeSBzaW1wbGUgM3g4IGJpdCBSR0IgaW1hZ2UKLSAgICAgICAgCi0gICAgICAgIHBuZ19zZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgaVdpZHRoLCBpSGVpZ2h0LCBjaUJpdERlcHRoLAotICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCLCBQTkdfSU5URVJMQUNFX05PTkUsIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsCi0gICAgICAgICAgICBQTkdfRklMVEVSX1RZUEVfQkFTRSk7Ci0gICAgICAgIAotICAgICAgICAvLyB3cml0ZSB0aGUgZmlsZSBoZWFkZXIgaW5mb3JtYXRpb24KLSAgICAgICAgCi0gICAgICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHN3YXAgdGhlIEJHUiBwaXhlbHMgaW4gdGhlIERpRGF0YSBzdHJ1Y3R1cmUgdG8gUkdCCi0gICAgICAgIAotICAgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHJvd19ieXRlcyBpcyB0aGUgd2lkdGggeCBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgCi0gICAgICAgIHVsUm93Qnl0ZXMgPSBpV2lkdGggKiBjaUNoYW5uZWxzOwotICAgICAgICAKLSAgICAgICAgLy8gd2UgY2FuIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gYXJyYXkgb2Ygcm93LXBvaW50ZXJzCi0gICAgICAgIAotICAgICAgICBpZiAoKHBwYlJvd1BvaW50ZXJzID0gKHBuZ19ieXRlcHApIG1hbGxvYyhpSGVpZ2h0ICogc2l6ZW9mKHBuZ19ieXRlcCkpKSA9PSBOVUxMKQotICAgICAgICAgICAgVGhyb3cgIlZpc3VhbHBuZzogT3V0IG9mIG1lbW9yeSI7Ci0gICAgICAgIAotICAgICAgICAvLyBzZXQgdGhlIGluZGl2aWR1YWwgcm93LXBvaW50ZXJzIHRvIHBvaW50IGF0IHRoZSBjb3JyZWN0IG9mZnNldHMKLSAgICAgICAgCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpSGVpZ2h0OyBpKyspCi0gICAgICAgICAgICBwcGJSb3dQb2ludGVyc1tpXSA9IHBEaURhdGEgKyBpICogKCgodWxSb3dCeXRlcyArIDMpID4+IDIpIDw8IDIpOwotICAgICAgICAKLSAgICAgICAgLy8gd3JpdGUgb3V0IHRoZSBlbnRpcmUgaW1hZ2UgZGF0YSBpbiBvbmUgY2FsbAotICAgICAgICAKLSAgICAgICAgcG5nX3dyaXRlX2ltYWdlIChwbmdfcHRyLCBwcGJSb3dQb2ludGVycyk7Ci0gICAgICAgIAotICAgICAgICAvLyB3cml0ZSB0aGUgYWRkaXRpb25hbCBjaHVua3MgdG8gdGhlIFBORyBmaWxlIChub3QgcmVhbGx5IG5lZWRlZCkKLSAgICAgICAgCi0gICAgICAgIHBuZ193cml0ZV9lbmQocG5nX3B0ciwgaW5mb19wdHIpOwotICAgICAgICAKLSAgICAgICAgLy8gYW5kIHdlJ3JlIGRvbmUKLSAgICAgICAgCi0gICAgICAgIGZyZWUgKHBwYlJvd1BvaW50ZXJzKTsKLSAgICAgICAgcHBiUm93UG9pbnRlcnMgPSBOVUxMOwotICAgICAgICAKLSAgICAgICAgLy8gY2xlYW4gdXAgYWZ0ZXIgdGhlIHdyaXRlLCBhbmQgZnJlZSBhbnkgbWVtb3J5IGFsbG9jYXRlZAotICAgICAgICAKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAocG5nX2luZm9wcCkgTlVMTCk7Ci0gICAgICAgIAotICAgICAgICAvLyB5ZXBwLCBkb25lCi0gICAgfQotCi0gICAgQ2F0Y2ggKG1zZykKLSAgICB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOwotCi0gICAgICAgIGlmKHBwYlJvd1BvaW50ZXJzKQotICAgICAgICAgICAgZnJlZSAocHBiUm93UG9pbnRlcnMpOwotCi0gICAgICAgIGZjbG9zZShwZkZpbGUpOwotCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgCi0gICAgZmNsb3NlIChwZkZpbGUpOwotICAgIAotICAgIHJldHVybiBUUlVFOwotfQotCi0jaWZkZWYgUE5HX05PX1NURElPCi0KLXN0YXRpYyB2b2lkCi1wbmdfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIHBuZ19zaXplX3QgY2hlY2s7Ci0KLSAgIC8qIGZyZWFkKCkgcmV0dXJucyAwIG9uIGVycm9yLCBzbyBpdCBpcyBPSyB0byBzdG9yZSB0aGlzIGluIGEgcG5nX3NpemVfdAotICAgICogaW5zdGVhZCBvZiBhbiBpbnQsIHdoaWNoIGlzIHdoYXQgZnJlYWQoKSBhY3R1YWxseSByZXR1cm5zLgotICAgICovCi0gICBjaGVjayA9IChwbmdfc2l6ZV90KWZyZWFkKGRhdGEsIChwbmdfc2l6ZV90KTEsIGxlbmd0aCwKLSAgICAgIChGSUxFICopcG5nX3B0ci0+aW9fcHRyKTsKLQotICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKLSAgIHsKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUmVhZCBFcnJvciIpOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotcG5nX3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQotewotICAgcG5nX3VpbnRfMzIgY2hlY2s7Ci0KLSAgIGNoZWNrID0gZndyaXRlKGRhdGEsIDEsIGxlbmd0aCwgKEZJTEUgKikocG5nX3B0ci0+aW9fcHRyKSk7Ci0gICBpZiAoY2hlY2sgIT0gbGVuZ3RoKQotICAgewotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJXcml0ZSBFcnJvciIpOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotcG5nX2ZsdXNoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBGSUxFICppb19wdHI7Ci0gICBpb19wdHIgPSAoRklMRSAqKUNWVF9QVFIoKHBuZ19wdHItPmlvX3B0cikpOwotICAgaWYgKGlvX3B0ciAhPSBOVUxMKQotICAgICAgZmZsdXNoKGlvX3B0cik7Ci19Ci0KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgZW5kIG9mIHNvdXJjZQotLy8tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi92aXN1cG5nL1BuZ0ZpbGUuaCBiL2xpYnMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9QbmdGaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDBmZDQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvY29udHJpYi92aXN1cG5nL1BuZ0ZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgUE5HRklMRS5IIC0tIEhlYWRlciBGaWxlIGZvciBwbmdmaWxlLmMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIENvcHlyaWdodCAyMDAwLCBXaWxsZW0gdmFuIFNjaGFpay4gIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQKLS8vIHVzZSwgc2VlIHRoZSBjb3B5cmlnaHQvbGljZW5zZS9kaXNjbGFpbWVyIG5vdGljZSBpbiBwbmcuaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLXZvaWQgUG5nRmlsZUluaXRpYWxpemUgKEhXTkQgaHduZCkgOwotQk9PTCBQbmdGaWxlT3BlbkRsZyAoSFdORCBod25kLCBQVFNUUiBwc3RyRmlsZU5hbWUsIFBUU1RSIHBzdHJUaXRsZU5hbWUpIDsKLUJPT0wgUG5nRmlsZVNhdmVEbGcgKEhXTkQgaHduZCwgUFRTVFIgcHN0ckZpbGVOYW1lLCBQVFNUUiBwc3RyVGl0bGVOYW1lKSA7Ci0KLUJPT0wgUG5nTG9hZEltYWdlIChQVFNUUiBwc3RyRmlsZU5hbWUsIHBuZ19ieXRlICoqcHBiSW1hZ2VEYXRhLCAKLSAgICAgICAgICAgICAgICAgICBpbnQgKnBpV2lkdGgsIGludCAqcGlIZWlnaHQsIGludCAqcGlDaGFubmVscywgcG5nX2NvbG9yICpwQmtnQ29sb3IpOwotQk9PTCBQbmdTYXZlSW1hZ2UgKFBUU1RSIHBzdHJGaWxlTmFtZSwgcG5nX2J5dGUgKnBEaURhdGEsCi0gICAgICAgICAgICAgICAgICAgaW50IGlXaWR0aCwgaW50IGlIZWlnaHQsIHBuZ19jb2xvciBCa2dDb2xvcik7Ci0KLSNpZiBkZWZpbmVkKFBOR19OT19TVERJTykKLXN0YXRpYyB2b2lkIHBuZ19yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKTsKLXN0YXRpYyB2b2lkIHBuZ193cml0ZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBwbmdfZmx1c2gocG5nX3N0cnVjdHAgcG5nX3B0cik7Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi92aXN1cG5nL1JFQURNRS50eHQgYi9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3NTNkOC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLU1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAgZm9yIFZpc3VhbFBuZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvcHlyaWdodCAyMDAwLCBXaWxsZW0gdmFuIFNjaGFpay4gIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQKLXVzZSwgc2VlIHRoZSBjb3B5cmlnaHQvbGljZW5zZS9kaXNjbGFpbWVyIG5vdGljZSBpbiBwbmcuaAotCi1BcyBhIFBORyAuZGxsIGRlbW8gVmlzdWFsUG5nIGlzIGZpbmlzaGVkLiBNb3JlIGZlYXR1cmVzIHdvdWxkIG9ubHkgaGluZGVyCi10aGUgcHJvZ3JhbSdzIG9iamVjdGl2ZS4gSG93ZXZlciwgZnVydGhlciBleHRlbnNpb25zIChsaWtlIHN1cHBvcnQgZm9yIG90aGVyIAotZ3JhcGhpY3MgZm9ybWF0cykgYXJlIGluIGRldmVsb3BtZW50LiBUbyBnZXQgdGhlc2UsIG9yIGZvciBwcmUtY29tcGlsZWQgCi1iaW5hcmllcywgZ28gdG8gImh0dHA6Ly93d3cuc2NoYWlrLmNvbS9wbmcvdmlzdWFscG5nLmh0bWwiLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQXNzdW1lcyB0aGF0Ci0KLSAgIGxpYnBuZyBETExzIGFuZCBMSUJzIGFyZSBpbiAuLlwuLlxwcm9qZWN0c1xtc3ZjXHdpbjMyXGxpYnBuZwotICAgemxpYiBETExzIGFuZCBMSUJzIGFyZSBpbiAgIC4uXC4uXHByb2plY3RzXG1zdmNcd2luMzJcemxpYgotICAgbGlicG5nIGhlYWRlciBmaWxlcyBhcmUgaW4gIC4uXC4uXC4uXGxpYnBuZwotICAgemxpYiBoZWFkZXIgZmlsZXMgYXJlIGluICAgIC4uXC4uXC4uXHpsaWIKLSAgIHRoZSBwbmdzdWl0ZSBpbWFnZXMgYXJlIGluICAuLlxwbmdzdWl0ZQotCi1UbyBidWlsZDoKLQotMSkgT24gdGhlIG1haW4gbWVudSBTZWxlY3QgIkJ1aWxkfFNldCBBY3RpdmUgY29uZmlndXJhdGlvbiIuCi0gICBDaG9vc2UgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbGlicmFyeSB5b3Ugd2FudCB0byB0ZXN0LgotICAgVGhpcyBsaWJyYXJ5IG11c3QgaGF2ZSBiZWVuIGJ1aWx0IHVzaW5nIHRoZSBsaWJwbmcgTVMgcHJvamVjdCBsb2NhdGVkIGluCi0gICB0aGUgIi4uXC4uXG1zY3YiIHN1YmRpcmVjdG9yeS4KLQotMikgU2VsZWN0ICJCdWlsZHxDbGVhbiIKLQotMykgU2VsZWN0ICJCdWlsZHxSZWJ1aWxkIEFsbCIKLQotNCkgQWZ0ZXIgY29tcGlsaW5nIGFuZCBsaW5raW5nIFZpc3VhbFBuZyB3aWxsIGJlIHN0YXJ0ZWQgdG8gdmlldyBhbiBpbWFnZQotICAgZnJvbSB0aGUgUG5nU3VpdGUgZGlyZWN0b3J5LiAgUHJlc3MgQ3RybC1OIChhbmQgQ3RybC1WKSBmb3Igb3RoZXIgaW1hZ2VzLgotCi0KLVRvIGluc3RhbGw6Ci0KLVdoZW4gZGlzdHJpYnV0aW5nIFZpc3VhbFBuZyAob3IgYSBmdXJ0aGVyIGRldmVsb3BtZW50KSB0aGUgZm9sbG93aW5nIG9wdGlvbnMKLWFyZSBhdmFpbGFibGU6Ci0KLTEpIEJ1aWxkIHRoZSBwcm9ncmFtIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gIldpbjMyIExJQiIgYW5kIHlvdSBvbmx5IG5lZWQgdG8KLSAgIGluY2x1ZGUgdGhlIGV4ZWN1dGFibGUgZnJvbSB0aGUgLi9saWIgZGlyZWN0b3J5IGluIHlvdXIgZGlzdHJpYnV0aW9uLgotCi0yKSBCdWlsZCB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBjb25maWd1cmF0aW9uICJXaW4zMiBETEwiIGFuZCB5b3UgbmVlZCB0byBwdXQKLSAgIGluIHlvdXIgZGlzdHJpYnV0aW9uIHRoZSBleGVjdXRhYmxlIGZyb20gdGhlIC4vZGxsIGRpcmVjdG9yeSBhbmQgdGhlIGRsbCdzCi0gICBsaWJwbmcxLmRsbCwgemxpYi5kbGwgYW5kIG1zdmNydC5kbGwuICBUaGVzZSBuZWVkIHRvIGJlIGluIHRoZSB1c2VyJ3MgUEFUSC4KLQotCi1XaWxsZW0gdmFuIFNjaGFpawotQ2FsZ2FyeSwgSnVuZSA2dGggMjAwMAotCi1QLlMuIFZpc3VhbFBuZyB3YXMgd3JpdHRlbiBiYXNlZCBvbiBwcmVsaW1pbmFyeSB3b3JrIG9mOgotCi0gICAgLSBTaW1vbi1QaWVycmUgQ2FkaWV1eAotICAgIC0gR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gICAgLSBHcmVnIFJvZWxvZnMKLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5jIGIvbGlicy9saWJwbmcvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmNmNmVlLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDk2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIFZpc3VhbFBuZy5DIC0tIFNob3dzIGEgUE5HIGltYWdlCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBDb3B5cmlnaHQgMjAwMCwgV2lsbGVtIHZhbiBTY2hhaWsuICBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kCi0vLyB1c2UsIHNlZSB0aGUgY29weXJpZ2h0L2xpY2Vuc2UvZGlzY2xhaW1lciBub3RpY2UgaW4gcG5nLmgKLQotLy8gc3dpdGNoZXMKLQotLy8gZGVmaW5lcwotCi0jZGVmaW5lIFBST0dOQU1FICAiVmlzdWFsUG5nIgotI2RlZmluZSBMT05HTkFNRSAgIldpbjMyIFZpZXdlciBmb3IgUE5HLWZpbGVzIgotI2RlZmluZSBWRVJTSU9OICAgIjEuMCBvZiAyMDAwIEp1bmUgMDciCi0KLS8vIGNvbnN0YW50cwotCi0jZGVmaW5lIE1BUkdJTiA4Ci0KLS8vIHN0YW5kYXJkIGluY2x1ZGVzCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotLy8gYXBwbGljYXRpb24gaW5jbHVkZXMKLQotI2luY2x1ZGUgInBuZy5oIgotI2luY2x1ZGUgInBuZ2ZpbGUuaCIKLSNpbmNsdWRlICJyZXNvdXJjZS5oIgotCi0vLyBtYWNyb3MKLQotLy8gZnVuY3Rpb24gcHJvdG90eXBlcwotCi1MUkVTVUxUIENBTExCQUNLIFduZFByb2MgKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKLUJPT0wgICAgQ0FMTEJBQ0sgQWJvdXREbGdQcm9jIChIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSkgOwotCi1CT09MIENlbnRlckFib3V0IChIV05EIGh3bmRDaGlsZCwgSFdORCBod25kUGFyZW50KTsKLQotQk9PTCBCdWlsZFBuZ0xpc3QgKFBUU1RSIHBzdHJQYXRoTmFtZSwgVENIQVIgKipwcEZpbGVMaXN0LCBpbnQgKnBGaWxlQ291bnQsCi0gICAgICAgIGludCAqcEZpbGVJbmRleCk7Ci0KLUJPT0wgU2VhcmNoUG5nTGlzdCAoVENIQVIgKnBGaWxlTGlzdCwgaW50IEZpbGVDb3VudCwgaW50ICpwRmlsZUluZGV4LAotICAgICAgICBQVFNUUiBwc3RyUHJldk5hbWUsIFBUU1RSIHBzdHJOZXh0TmFtZSk7Ci0KLUJPT0wgTG9hZEltYWdlRmlsZShIV05EIGh3bmQsIFBUU1RSIHBzdHJQYXRoTmFtZSwKLSAgICAgICAgcG5nX2J5dGUgKipwcGJJbWFnZSwgaW50ICpweEltZ1NpemUsIGludCAqcHlJbWdTaXplLCBpbnQgKnBpQ2hhbm5lbHMsCi0gICAgICAgIHBuZ19jb2xvciAqcEJrZ0NvbG9yKTsKLQotQk9PTCBEaXNwbGF5SW1hZ2UgKEhXTkQgaHduZCwgQllURSAqKnBwRGliLAotICAgICAgICBCWVRFICoqcHBEaURhdGEsIGludCBjeFdpblNpemUsIGludCBjeVdpblNpemUsCi0gICAgICAgIEJZVEUgKnBiSW1hZ2UsIGludCBjeEltZ1NpemUsIGludCBjeUltZ1NpemUsIGludCBjSW1nQ2hhbm5lbHMsCi0gICAgICAgIEJPT0wgYlN0cmV0Y2hlZCk7Ci0KLUJPT0wgSW5pdEJpdG1hcCAoCi0gICAgICAgIEJZVEUgKnBEaURhdGEsIGludCBjeFdpblNpemUsIGludCBjeVdpblNpemUpOwotCi1CT09MIEZpbGxCaXRtYXAgKAotICAgICAgICBCWVRFICpwRGlEYXRhLCBpbnQgY3hXaW5TaXplLCBpbnQgY3lXaW5TaXplLAotICAgICAgICBCWVRFICpwYkltYWdlLCBpbnQgY3hJbWdTaXplLCBpbnQgY3lJbWdTaXplLCBpbnQgY0ltZ0NoYW5uZWxzLAotICAgICAgICBCT09MIGJTdHJldGNoZWQpOwotCi0vLyBhIGZldyBnbG9iYWwgdmFyaWFibGVzCi0KLXN0YXRpYyBjaGFyICpzelByb2dOYW1lID0gUFJPR05BTUU7Ci1zdGF0aWMgY2hhciAqc3pBcHBOYW1lID0gTE9OR05BTUU7Ci1zdGF0aWMgY2hhciAqc3pJY29uTmFtZSA9IFBST0dOQU1FOwotc3RhdGljIGNoYXIgc3pDbWRGaWxlTmFtZSBbTUFYX1BBVEhdOwotCi0vLyBNQUlOIHJvdXRpbmUKLQotaW50IFdJTkFQSSBXaW5NYWluIChISU5TVEFOQ0UgaEluc3RhbmNlLCBISU5TVEFOQ0UgaFByZXZJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgUFNUUiBzekNtZExpbmUsIGludCBpQ21kU2hvdykKLXsKLSAgICBIQUNDRUwgICBoQWNjZWw7Ci0gICAgSFdORCAgICAgaHduZDsKLSAgICBNU0cgICAgICBtc2c7Ci0gICAgV05EQ0xBU1Mgd25kY2xhc3M7Ci0gICAgaW50IGl4Qm9yZGVycywgaXlCb3JkZXJzOwotCi0gICAgd25kY2xhc3Muc3R5bGUgICAgICAgICA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOwotICAgIHduZGNsYXNzLmxwZm5XbmRQcm9jICAgPSBXbmRQcm9jOwotICAgIHduZGNsYXNzLmNiQ2xzRXh0cmEgICAgPSAwOwotICAgIHduZGNsYXNzLmNiV25kRXh0cmEgICAgPSAwOwotICAgIHduZGNsYXNzLmhJbnN0YW5jZSAgICAgPSBoSW5zdGFuY2U7Ci0gICAgd25kY2xhc3MuaEljb24gICAgICAgICA9IExvYWRJY29uIChoSW5zdGFuY2UsIHN6SWNvbk5hbWUpIDsKLSAgICB3bmRjbGFzcy5oQ3Vyc29yICAgICAgID0gTG9hZEN1cnNvciAoTlVMTCwgSURDX0FSUk9XKTsKLSAgICB3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kID0gTlVMTDsgLy8gKEhCUlVTSCkgR2V0U3RvY2tPYmplY3QgKEdSQVlfQlJVU0gpOwotICAgIHduZGNsYXNzLmxwc3pNZW51TmFtZSAgPSBzelByb2dOYW1lOwotICAgIHduZGNsYXNzLmxwc3pDbGFzc05hbWUgPSBzelByb2dOYW1lOwotCi0gICAgaWYgKCFSZWdpc3RlckNsYXNzICgmd25kY2xhc3MpKQotICAgIHsKLSAgICAgICAgTWVzc2FnZUJveCAoTlVMTCwgVEVYVCAoIkVycm9yOiB0aGlzIHByb2dyYW0gcmVxdWlyZXMgV2luZG93cyBOVCEiKSwKLSAgICAgICAgICAgIHN6UHJvZ05hbWUsIE1CX0lDT05FUlJPUik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIGlmIGZpbGVuYW1lIGdpdmVuIG9uIGNvbW1hbmRsaW5lLCBzdG9yZSBpdAotICAgIGlmICgoc3pDbWRMaW5lICE9IE5VTEwpICYmICgqc3pDbWRMaW5lICE9ICdcMCcpKQotICAgICAgICBpZiAoc3pDbWRMaW5lWzBdID09ICciJykKLSAgICAgICAgICAgIHN0cm5jcHkgKHN6Q21kRmlsZU5hbWUsIHN6Q21kTGluZSArIDEsIHN0cmxlbihzekNtZExpbmUpIC0gMik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0cmNweSAoc3pDbWRGaWxlTmFtZSwgc3pDbWRMaW5lKTsKLSAgICBlbHNlCi0gICAgICAgIHN0cmNweSAoc3pDbWRGaWxlTmFtZSwgIiIpOwotCi0gICAgLy8gY2FsY3VsYXRlIHNpemUgb2Ygd2luZG93LWJvcmRlcnMKLSAgICBpeEJvcmRlcnMgPSAyICogKEdldFN5c3RlbU1ldHJpY3MgKFNNX0NYQk9SREVSKSArCi0gICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzIChTTV9DWERMR0ZSQU1FKSk7Ci0gICAgaXlCb3JkZXJzID0gMiAqIChHZXRTeXN0ZW1NZXRyaWNzIChTTV9DWUJPUkRFUikgKwotICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyAoU01fQ1lETEdGUkFNRSkpICsKLSAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MgKFNNX0NZQ0FQVElPTikgKwotICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyAoU01fQ1lNRU5VU0laRSkgKwotICAgICAgICAgICAgICAgICAgICAgMTsgLyogV3ZTOiBkb24ndCBhc2sgbWUgd2h5PyAqLwotCi0gICAgaHduZCA9IENyZWF0ZVdpbmRvdyAoc3pQcm9nTmFtZSwgc3pBcHBOYW1lLAotICAgICAgICBXU19PVkVSTEFQUEVEV0lORE9XLAotICAgICAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULAotICAgICAgICA1MTIgKyAyICogTUFSR0lOICsgaXhCb3JkZXJzLCAzODQgKyAyICogTUFSR0lOICsgaXlCb3JkZXJzLAotLy8gICAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULAotICAgICAgICBOVUxMLCBOVUxMLCBoSW5zdGFuY2UsIE5VTEwpOwotCi0gICAgU2hvd1dpbmRvdyAoaHduZCwgaUNtZFNob3cpOwotICAgIFVwZGF0ZVdpbmRvdyAoaHduZCk7Ci0KLSAgICBoQWNjZWwgPSBMb2FkQWNjZWxlcmF0b3JzIChoSW5zdGFuY2UsIHN6UHJvZ05hbWUpOwotCi0gICAgd2hpbGUgKEdldE1lc3NhZ2UgKCZtc2csIE5VTEwsIDAsIDApKQotICAgIHsKLSAgICAgICAgaWYgKCFUcmFuc2xhdGVBY2NlbGVyYXRvciAoaHduZCwgaEFjY2VsLCAmbXNnKSkKLSAgICAgICAgewotICAgICAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSAoJm1zZyk7Ci0gICAgICAgICAgICBEaXNwYXRjaE1lc3NhZ2UgKCZtc2cpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtc2cud1BhcmFtOwotfQotCi1MUkVTVUxUIENBTExCQUNLIFduZFByb2MgKEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLAotICAgICAgICBMUEFSQU0gbFBhcmFtKQotewotICAgIHN0YXRpYyBISU5TVEFOQ0UgICAgICAgICAgaEluc3RhbmNlIDsKLSAgICBzdGF0aWMgSERDICAgICAgICAgICAgICAgIGhkYzsKLSAgICBzdGF0aWMgUEFJTlRTVFJVQ1QgICAgICAgIHBzOwotICAgIHN0YXRpYyBITUVOVSAgICAgICAgICAgICAgaE1lbnU7Ci0KLSAgICBzdGF0aWMgQklUTUFQRklMRUhFQURFUiAgKnBibWZoOwotICAgIHN0YXRpYyBCSVRNQVBJTkZPSEVBREVSICAqcGJtaWg7Ci0gICAgc3RhdGljIEJZVEUgICAgICAgICAgICAgICpwYkltYWdlOwotICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgICAgY3hXaW5TaXplLCBjeVdpblNpemU7Ci0gICAgc3RhdGljIGludCAgICAgICAgICAgICAgICBjeEltZ1NpemUsIGN5SW1nU2l6ZTsKLSAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGNJbWdDaGFubmVsczsKLSAgICBzdGF0aWMgcG5nX2NvbG9yICAgICAgICAgIGJrZ0NvbG9yID0gezEyNywgMTI3LCAxMjd9OwotCi0gICAgc3RhdGljIEJPT0wgICAgICAgICAgICAgICBiU3RyZXRjaGVkID0gVFJVRTsKLQotICAgIHN0YXRpYyBCWVRFICAgICAgICAgICAgICAqcERpYiA9IE5VTEw7Ci0gICAgc3RhdGljIEJZVEUgICAgICAgICAgICAgICpwRGlEYXRhID0gTlVMTDsKLQotICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAgc3pJbWdQYXRoTmFtZSBbTUFYX1BBVEhdOwotICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAgc3pUaXRsZU5hbWUgW01BWF9QQVRIXTsKLQotICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAqcFBuZ0ZpbGVMaXN0ID0gTlVMTDsKLSAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGlQbmdGaWxlQ291bnQ7Ci0gICAgc3RhdGljIGludCAgICAgICAgICAgICAgICBpUG5nRmlsZUluZGV4OwotCi0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICBiT2s7Ci0KLSAgICBzd2l0Y2ggKG1lc3NhZ2UpCi0gICAgewotICAgIGNhc2UgV01fQ1JFQVRFOgotICAgICAgICBoSW5zdGFuY2UgPSAoKExQQ1JFQVRFU1RSVUNUKSBsUGFyYW0pLT5oSW5zdGFuY2UgOwotICAgICAgICBQbmdGaWxlSW5pdGlhbGl6ZSAoaHduZCk7Ci0KLSAgICAgICAgc3RyY3B5IChzekltZ1BhdGhOYW1lLCAiIik7Ci0KLSAgICAgICAgLy8gaW4gY2FzZSB3ZSBwcm9jZXNzIGZpbGUgZ2l2ZW4gb24gY29tbWFuZC1saW5lCi0KLSAgICAgICAgaWYgKHN6Q21kRmlsZU5hbWVbMF0gIT0gJ1wwJykKLSAgICAgICAgewotICAgICAgICAgICAgc3RyY3B5IChzekltZ1BhdGhOYW1lLCBzekNtZEZpbGVOYW1lKTsKLQotICAgICAgICAgICAgLy8gcmVhZCB0aGUgb3RoZXIgcG5nLWZpbGVzIGluIHRoZSBkaXJlY3RvcnkgZm9yIGxhdGVyCi0gICAgICAgICAgICAvLyBuZXh0L3ByZXZpb3VzIGNvbW1hbmRzCi0KLSAgICAgICAgICAgIEJ1aWxkUG5nTGlzdCAoc3pJbWdQYXRoTmFtZSwgJnBQbmdGaWxlTGlzdCwgJmlQbmdGaWxlQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZpUG5nRmlsZUluZGV4KTsKLQotICAgICAgICAgICAgLy8gbG9hZCB0aGUgaW1hZ2UgZnJvbSBmaWxlCi0KLSAgICAgICAgICAgIGlmICghTG9hZEltYWdlRmlsZSAoaHduZCwgc3pJbWdQYXRoTmFtZSwKLSAgICAgICAgICAgICAgICAmcGJJbWFnZSwgJmN4SW1nU2l6ZSwgJmN5SW1nU2l6ZSwgJmNJbWdDaGFubmVscywgJmJrZ0NvbG9yKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgZm9yIGxhdGVyIHVwZGF0ZQotCi0gICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCAoaHduZCwgTlVMTCwgVFJVRSk7Ci0KLSAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIFBORyBpbnRvIHRoZSBESUJpdG1hcAotCi0gICAgICAgICAgICBEaXNwbGF5SW1hZ2UgKGh3bmQsICZwRGliLCAmcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywgYlN0cmV0Y2hlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgV01fU0laRToKLSAgICAgICAgY3hXaW5TaXplID0gTE9XT1JEIChsUGFyYW0pOwotICAgICAgICBjeVdpblNpemUgPSBISVdPUkQgKGxQYXJhbSk7Ci0KLSAgICAgICAgLy8gaW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgZm9yIGxhdGVyIHVwZGF0ZQotCi0gICAgICAgIEludmFsaWRhdGVSZWN0IChod25kLCBOVUxMLCBUUlVFKTsKLQotICAgICAgICAvLyBkaXNwbGF5IHRoZSBQTkcgaW50byB0aGUgRElCaXRtYXAKLQotICAgICAgICBEaXNwbGF5SW1hZ2UgKGh3bmQsICZwRGliLCAmcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICBwYkltYWdlLCBjeEltZ1NpemUsIGN5SW1nU2l6ZSwgY0ltZ0NoYW5uZWxzLCBiU3RyZXRjaGVkKTsKLQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgV01fSU5JVE1FTlVQT1BVUDoKLSAgICAgICAgaE1lbnUgPSBHZXRNZW51IChod25kKTsKLQotICAgICAgICBpZiAocGJJbWFnZSkKLSAgICAgICAgICAgIEVuYWJsZU1lbnVJdGVtIChoTWVudSwgSURNX0ZJTEVfU0FWRSwgTUZfRU5BQkxFRCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEVuYWJsZU1lbnVJdGVtIChoTWVudSwgSURNX0ZJTEVfU0FWRSwgTUZfR1JBWUVEKTsKLQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgV01fQ09NTUFORDoKLSAgICAgICAgaE1lbnUgPSBHZXRNZW51IChod25kKTsKLQotICAgICAgICBzd2l0Y2ggKExPV09SRCAod1BhcmFtKSkKLSAgICAgICAgewotICAgICAgICBjYXNlIElETV9GSUxFX09QRU46Ci0KLSAgICAgICAgICAgIC8vIHNob3cgdGhlIEZpbGUgT3BlbiBkaWFsb2cgYm94Ci0KLSAgICAgICAgICAgIGlmICghUG5nRmlsZU9wZW5EbGcgKGh3bmQsIHN6SW1nUGF0aE5hbWUsIHN6VGl0bGVOYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgLy8gcmVhZCB0aGUgb3RoZXIgcG5nLWZpbGVzIGluIHRoZSBkaXJlY3RvcnkgZm9yIGxhdGVyCi0gICAgICAgICAgICAvLyBuZXh0L3ByZXZpb3VzIGNvbW1hbmRzCi0KLSAgICAgICAgICAgIEJ1aWxkUG5nTGlzdCAoc3pJbWdQYXRoTmFtZSwgJnBQbmdGaWxlTGlzdCwgJmlQbmdGaWxlQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZpUG5nRmlsZUluZGV4KTsKLQotICAgICAgICAgICAgLy8gbG9hZCB0aGUgaW1hZ2UgZnJvbSBmaWxlCi0KLSAgICAgICAgICAgIGlmICghTG9hZEltYWdlRmlsZSAoaHduZCwgc3pJbWdQYXRoTmFtZSwKLSAgICAgICAgICAgICAgICAmcGJJbWFnZSwgJmN4SW1nU2l6ZSwgJmN5SW1nU2l6ZSwgJmNJbWdDaGFubmVscywgJmJrZ0NvbG9yKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgZm9yIGxhdGVyIHVwZGF0ZQotCi0gICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCAoaHduZCwgTlVMTCwgVFJVRSk7Ci0KLSAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIFBORyBpbnRvIHRoZSBESUJpdG1hcAotCi0gICAgICAgICAgICBEaXNwbGF5SW1hZ2UgKGh3bmQsICZwRGliLCAmcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywgYlN0cmV0Y2hlZCk7Ci0KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX0ZJTEVfU0FWRToKLQotICAgICAgICAgICAgLy8gc2hvdyB0aGUgRmlsZSBTYXZlIGRpYWxvZyBib3gKLQotICAgICAgICAgICAgaWYgKCFQbmdGaWxlU2F2ZURsZyAoaHduZCwgc3pJbWdQYXRoTmFtZSwgc3pUaXRsZU5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICAvLyBzYXZlIHRoZSBQTkcgdG8gYSBkaXNrIGZpbGUKLQotICAgICAgICAgICAgU2V0Q3Vyc29yIChMb2FkQ3Vyc29yIChOVUxMLCBJRENfV0FJVCkpOwotICAgICAgICAgICAgU2hvd0N1cnNvciAoVFJVRSk7Ci0KLSAgICAgICAgICAgIGJPayA9IFBuZ1NhdmVJbWFnZSAoc3pJbWdQYXRoTmFtZSwgcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICAgICAgICBia2dDb2xvcik7Ci0KLSAgICAgICAgICAgIFNob3dDdXJzb3IgKEZBTFNFKTsKLSAgICAgICAgICAgIFNldEN1cnNvciAoTG9hZEN1cnNvciAoTlVMTCwgSURDX0FSUk9XKSk7Ci0KLSAgICAgICAgICAgIGlmICghYk9rKQotICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3ggKGh3bmQsIFRFWFQgKCJFcnJvciBpbiBzYXZpbmcgdGhlIFBORyBpbWFnZSIpLAotICAgICAgICAgICAgICAgIHN6UHJvZ05hbWUsIE1CX0lDT05FWENMQU1BVElPTiB8IE1CX09LKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX0ZJTEVfTkVYVDoKLQotICAgICAgICAgICAgLy8gcmVhZCBuZXh0IGVudHJ5IGluIHRoZSBkaXJlY3RvcnkKLQotICAgICAgICAgICAgaWYgKFNlYXJjaFBuZ0xpc3QgKHBQbmdGaWxlTGlzdCwgaVBuZ0ZpbGVDb3VudCwgJmlQbmdGaWxlSW5kZXgsCi0gICAgICAgICAgICAgICAgTlVMTCwgc3pJbWdQYXRoTmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcCAoc3pJbWdQYXRoTmFtZSwgIiIpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIGltYWdlIGZyb20gZmlsZQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICghTG9hZEltYWdlRmlsZSAoaHduZCwgc3pJbWdQYXRoTmFtZSwgJnBiSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAmY3hJbWdTaXplLCAmY3lJbWdTaXplLCAmY0ltZ0NoYW5uZWxzLCAmYmtnQ29sb3IpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlIHRoZSBjbGllbnQgYXJlYSBmb3IgbGF0ZXIgdXBkYXRlCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QgKGh3bmQsIE5VTEwsIFRSVUUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIFBORyBpbnRvIHRoZSBESUJpdG1hcAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIERpc3BsYXlJbWFnZSAoaHduZCwgJnBEaWIsICZwRGlEYXRhLCBjeFdpblNpemUsIGN5V2luU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywgYlN0cmV0Y2hlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX0ZJTEVfUFJFVklPVVM6Ci0KLSAgICAgICAgICAgIC8vIHJlYWQgcHJldmlvdXMgZW50cnkgaW4gdGhlIGRpcmVjdG9yeQotCi0gICAgICAgICAgICBpZiAoU2VhcmNoUG5nTGlzdCAocFBuZ0ZpbGVMaXN0LCBpUG5nRmlsZUNvdW50LCAmaVBuZ0ZpbGVJbmRleCwKLSAgICAgICAgICAgICAgICBzekltZ1BhdGhOYW1lLCBOVUxMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wIChzekltZ1BhdGhOYW1lLCAiIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgaW1hZ2UgZnJvbSBmaWxlCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCFMb2FkSW1hZ2VGaWxlIChod25kLCBzekltZ1BhdGhOYW1lLCAmcGJJbWFnZSwgJmN4SW1nU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgJmN5SW1nU2l6ZSwgJmNJbWdDaGFubmVscywgJmJrZ0NvbG9yKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgZm9yIGxhdGVyIHVwZGF0ZQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEludmFsaWRhdGVSZWN0IChod25kLCBOVUxMLCBUUlVFKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBQTkcgaW50byB0aGUgRElCaXRtYXAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBEaXNwbGF5SW1hZ2UgKGh3bmQsICZwRGliLCAmcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICAgICAgICAgIHBiSW1hZ2UsIGN4SW1nU2l6ZSwgY3lJbWdTaXplLCBjSW1nQ2hhbm5lbHMsIGJTdHJldGNoZWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBjYXNlIElETV9GSUxFX0VYSVQ6Ci0KLSAgICAgICAgICAgIC8vIG1vcmUgY2xlYW51cCBuZWVkZWQuLi4KLQotICAgICAgICAgICAgLy8gZnJlZSBpbWFnZSBidWZmZXIKLQotICAgICAgICAgICAgaWYgKHBEaWIgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlIChwRGliKTsKLSAgICAgICAgICAgICAgICBwRGliID0gTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZnJlZSBmaWxlLWxpc3QKLQotICAgICAgICAgICAgaWYgKHBQbmdGaWxlTGlzdCAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUgKHBQbmdGaWxlTGlzdCk7Ci0gICAgICAgICAgICAgICAgcFBuZ0ZpbGVMaXN0ID0gTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbGV0J3MgZ28gLi4uCi0KLSAgICAgICAgICAgIGV4aXQgKDApOwotCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBjYXNlIElETV9PUFRJT05TX1NUUkVUQ0g6Ci0gICAgICAgICAgICBiU3RyZXRjaGVkID0gIWJTdHJldGNoZWQ7Ci0gICAgICAgICAgICBpZiAoYlN0cmV0Y2hlZCkKLSAgICAgICAgICAgICAgICBDaGVja01lbnVJdGVtIChoTWVudSwgSURNX09QVElPTlNfU1RSRVRDSCwgTUZfQ0hFQ0tFRCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQ2hlY2tNZW51SXRlbSAoaE1lbnUsIElETV9PUFRJT05TX1NUUkVUQ0gsIE1GX1VOQ0hFQ0tFRCk7Ci0KLSAgICAgICAgICAgIC8vIGludmFsaWRhdGUgdGhlIGNsaWVudCBhcmVhIGZvciBsYXRlciB1cGRhdGUKLQotICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QgKGh3bmQsIE5VTEwsIFRSVUUpOwotCi0gICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBQTkcgaW50byB0aGUgRElCaXRtYXAKLQotICAgICAgICAgICAgRGlzcGxheUltYWdlIChod25kLCAmcERpYiwgJnBEaURhdGEsIGN4V2luU2l6ZSwgY3lXaW5TaXplLAotICAgICAgICAgICAgICAgIHBiSW1hZ2UsIGN4SW1nU2l6ZSwgY3lJbWdTaXplLCBjSW1nQ2hhbm5lbHMsIGJTdHJldGNoZWQpOwotCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBjYXNlIElETV9IRUxQX0FCT1VUOgotICAgICAgICAgICAgRGlhbG9nQm94IChoSW5zdGFuY2UsIFRFWFQgKCJBYm91dEJveCIpLCBod25kLCBBYm91dERsZ1Byb2MpIDsKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIH0gLy8gZW5kIHN3aXRjaAotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBXTV9QQUlOVDoKLSAgICAgICAgaGRjID0gQmVnaW5QYWludCAoaHduZCwgJnBzKTsKLQotICAgICAgICBpZiAocERpYikKLSAgICAgICAgICAgIFNldERJQml0c1RvRGV2aWNlIChoZGMsIDAsIDAsIGN4V2luU2l6ZSwgY3lXaW5TaXplLCAwLCAwLAotICAgICAgICAgICAgICAgIDAsIGN5V2luU2l6ZSwgcERpRGF0YSwgKEJJVE1BUElORk8gKikgcERpYiwgRElCX1JHQl9DT0xPUlMpOwotCi0gICAgICAgIEVuZFBhaW50IChod25kLCAmcHMpOwotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgV01fREVTVFJPWToKLSAgICAgICAgaWYgKHBibWZoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlIChwYm1maCk7Ci0gICAgICAgICAgICBwYm1maCA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBQb3N0UXVpdE1lc3NhZ2UgKDApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRGVmV2luZG93UHJvYyAoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotfQotCi1CT09MIENBTExCQUNLIEFib3V0RGxnUHJvYyAoSFdORCBoRGxnLCBVSU5UIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgICAgc3dpdGNoIChtZXNzYWdlKQotICAgICB7Ci0gICAgIGNhc2UgV01fSU5JVERJQUxPRyA6Ci0gICAgICAgICAgU2hvd1dpbmRvdyAoaERsZywgU1dfSElERSk7Ci0gICAgICAgICAgQ2VudGVyQWJvdXQgKGhEbGcsIEdldFdpbmRvdyAoaERsZywgR1dfT1dORVIpKTsKLSAgICAgICAgICBTaG93V2luZG93IChoRGxnLCBTV19TSE9XKTsKLSAgICAgICAgICByZXR1cm4gVFJVRSA7Ci0KLSAgICAgY2FzZSBXTV9DT01NQU5EIDoKLSAgICAgICAgICBzd2l0Y2ggKExPV09SRCAod1BhcmFtKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBJRE9LIDoKLSAgICAgICAgICBjYXNlIElEQ0FOQ0VMIDoKLSAgICAgICAgICAgICAgIEVuZERpYWxvZyAoaERsZywgMCkgOwotICAgICAgICAgICAgICAgcmV0dXJuIFRSVUUgOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhayA7Ci0gICAgIH0KLSAgICAgcmV0dXJuIEZBTFNFIDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0KLS8vICBDZW50ZXJBYm91dAotLy8tLS0tLS0tLS0tLS0tLS0KLQotQk9PTCBDZW50ZXJBYm91dCAoSFdORCBod25kQ2hpbGQsIEhXTkQgaHduZFBhcmVudCkKLXsKLSAgIFJFQ1QgICAgckNoaWxkLCByUGFyZW50LCByV29ya0FyZWE7Ci0gICBpbnQgICAgIHdDaGlsZCwgaENoaWxkLCB3UGFyZW50LCBoUGFyZW50OwotICAgaW50ICAgICB4TmV3LCB5TmV3OwotICAgQk9PTCAgYlJlc3VsdDsKLQotICAgLy8gR2V0IHRoZSBIZWlnaHQgYW5kIFdpZHRoIG9mIHRoZSBjaGlsZCB3aW5kb3cKLSAgIEdldFdpbmRvd1JlY3QgKGh3bmRDaGlsZCwgJnJDaGlsZCk7Ci0gICB3Q2hpbGQgPSByQ2hpbGQucmlnaHQgLSByQ2hpbGQubGVmdDsKLSAgIGhDaGlsZCA9IHJDaGlsZC5ib3R0b20gLSByQ2hpbGQudG9wOwotCi0gICAvLyBHZXQgdGhlIEhlaWdodCBhbmQgV2lkdGggb2YgdGhlIHBhcmVudCB3aW5kb3cKLSAgIEdldFdpbmRvd1JlY3QgKGh3bmRQYXJlbnQsICZyUGFyZW50KTsKLSAgIHdQYXJlbnQgPSByUGFyZW50LnJpZ2h0IC0gclBhcmVudC5sZWZ0OwotICAgaFBhcmVudCA9IHJQYXJlbnQuYm90dG9tIC0gclBhcmVudC50b3A7Ci0KLSAgIC8vIEdldCB0aGUgbGltaXRzIG9mIHRoZSAnd29ya2FyZWEnCi0gICBiUmVzdWx0ID0gU3lzdGVtUGFyYW1ldGVyc0luZm8oCi0gICAgICBTUElfR0VUV09SS0FSRUEsICAvLyBzeXN0ZW0gcGFyYW1ldGVyIHRvIHF1ZXJ5IG9yIHNldAotICAgICAgc2l6ZW9mKFJFQ1QpLAotICAgICAgJnJXb3JrQXJlYSwKLSAgICAgIDApOwotICAgaWYgKCFiUmVzdWx0KSB7Ci0gICAgICByV29ya0FyZWEubGVmdCA9IHJXb3JrQXJlYS50b3AgPSAwOwotICAgICAgcldvcmtBcmVhLnJpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7Ci0gICAgICByV29ya0FyZWEuYm90dG9tID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7Ci0gICB9Ci0KLSAgIC8vIENhbGN1bGF0ZSBuZXcgWCBwb3NpdGlvbiwgdGhlbiBhZGp1c3QgZm9yIHdvcmthcmVhCi0gICB4TmV3ID0gclBhcmVudC5sZWZ0ICsgKCh3UGFyZW50IC0gd0NoaWxkKSAvMik7Ci0gICBpZiAoeE5ldyA8IHJXb3JrQXJlYS5sZWZ0KSB7Ci0gICAgICB4TmV3ID0gcldvcmtBcmVhLmxlZnQ7Ci0gICB9IGVsc2UgaWYgKCh4TmV3K3dDaGlsZCkgPiByV29ya0FyZWEucmlnaHQpIHsKLSAgICAgIHhOZXcgPSByV29ya0FyZWEucmlnaHQgLSB3Q2hpbGQ7Ci0gICB9Ci0KLSAgIC8vIENhbGN1bGF0ZSBuZXcgWSBwb3NpdGlvbiwgdGhlbiBhZGp1c3QgZm9yIHdvcmthcmVhCi0gICB5TmV3ID0gclBhcmVudC50b3AgICsgKChoUGFyZW50IC0gaENoaWxkKSAvMik7Ci0gICBpZiAoeU5ldyA8IHJXb3JrQXJlYS50b3ApIHsKLSAgICAgIHlOZXcgPSByV29ya0FyZWEudG9wOwotICAgfSBlbHNlIGlmICgoeU5ldytoQ2hpbGQpID4gcldvcmtBcmVhLmJvdHRvbSkgewotICAgICAgeU5ldyA9IHJXb3JrQXJlYS5ib3R0b20gLSBoQ2hpbGQ7Ci0gICB9Ci0KLSAgIC8vIFNldCBpdCwgYW5kIHJldHVybgotICAgcmV0dXJuIFNldFdpbmRvd1BvcyAoaHduZENoaWxkLCBOVUxMLCB4TmV3LCB5TmV3LCAwLCAwLCBTV1BfTk9TSVpFIHwKLSAgICAgICAgICBTV1BfTk9aT1JERVIpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0KLS8vICBCdWlsZFBuZ0xpc3QKLS8vLS0tLS0tLS0tLS0tLS0tLQotCi1CT09MIEJ1aWxkUG5nTGlzdCAoUFRTVFIgcHN0clBhdGhOYW1lLCBUQ0hBUiAqKnBwRmlsZUxpc3QsIGludCAqcEZpbGVDb3VudCwKLSAgICAgaW50ICpwRmlsZUluZGV4KQotewotICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAgc3pJbWdQYXRoTmFtZSBbTUFYX1BBVEhdOwotICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAgc3pJbWdGaWxlTmFtZSBbTUFYX1BBVEhdOwotICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAgc3pJbWdGaW5kTmFtZSBbTUFYX1BBVEhdOwotCi0gICAgV0lOMzJfRklORF9EQVRBICAgICAgICAgICBmaW5kZGF0YTsKLSAgICBIQU5ETEUgICAgICAgICAgICAgICAgICAgIGhGaW5kOwotCi0gICAgc3RhdGljIFRDSEFSICAgICAgICAgICAgICBzelRtcCBbTUFYX1BBVEhdOwotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgYk9rOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgaSwgaWk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBqLCBqajsKLQotICAgIC8vIGZyZWUgcHJldmlvdXMgZmlsZS1saXN0Ci0KLSAgICBpZiAoKnBwRmlsZUxpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUgKCpwcEZpbGVMaXN0KTsKLSAgICAgICAgKnBwRmlsZUxpc3QgPSBOVUxMOwotICAgIH0KLQotICAgIC8vIGV4dHJhY3QgZm9sZGVybmFtZSwgZmlsZW5hbWUgYW5kIHNlYXJjaC1uYW1lCi0KLSAgICBzdHJjcHkgKHN6SW1nUGF0aE5hbWUsIHBzdHJQYXRoTmFtZSk7Ci0gICAgc3RyY3B5IChzekltZ0ZpbGVOYW1lLCBzdHJyY2hyIChwc3RyUGF0aE5hbWUsICdcXCcpICsgMSk7Ci0KLSAgICBzdHJjcHkgKHN6SW1nRmluZE5hbWUsIHN6SW1nUGF0aE5hbWUpOwotICAgICooc3RycmNociAoc3pJbWdGaW5kTmFtZSwgJ1xcJykgKyAxKSA9ICdcMCc7Ci0gICAgc3RyY2F0IChzekltZ0ZpbmROYW1lLCAiKi5wbmciKTsKLQotICAgIC8vIGZpcnN0IGN5Y2xlOiBjb3VudCBudW1iZXIgb2YgZmlsZXMgaW4gZGlyZWN0b3J5IGZvciBtZW1vcnkgYWxsb2NhdGlvbgotCi0gICAgKnBGaWxlQ291bnQgPSAwOwotCi0gICAgaEZpbmQgPSBGaW5kRmlyc3RGaWxlKHN6SW1nRmluZE5hbWUsICZmaW5kZGF0YSk7Ci0gICAgYk9rID0gKGhGaW5kICE9IChIQU5ETEUpIC0xKTsKLQotICAgIHdoaWxlIChiT2spCi0gICAgewotICAgICAgICAqcEZpbGVDb3VudCArPSAxOwotICAgICAgICBiT2sgPSBGaW5kTmV4dEZpbGUoaEZpbmQsICZmaW5kZGF0YSk7Ci0gICAgfQotICAgIEZpbmRDbG9zZShoRmluZCk7Ci0KLSAgICAvLyBhbGxvY2F0aW9uIG1lbW9yeSBmb3IgZmlsZS1saXN0Ci0KLSAgICAqcHBGaWxlTGlzdCA9IChUQ0hBUiAqKSBtYWxsb2MgKCpwRmlsZUNvdW50ICogTUFYX1BBVEgpOwotCi0gICAgLy8gc2Vjb25kIGN5Y2xlOiByZWFkIGRpcmVjdG9yeSBhbmQgc3RvcmUgZmlsZW5hbWVzIGluIGZpbGUtbGlzdAotCi0gICAgaEZpbmQgPSBGaW5kRmlyc3RGaWxlKHN6SW1nRmluZE5hbWUsICZmaW5kZGF0YSk7Ci0gICAgYk9rID0gKGhGaW5kICE9IChIQU5ETEUpIC0xKTsKLQotICAgIGkgPSAwOwotICAgIGlpID0gMDsKLSAgICB3aGlsZSAoYk9rKQotICAgIHsKLSAgICAgICAgc3RyY3B5ICgqcHBGaWxlTGlzdCArIGlpLCBzekltZ1BhdGhOYW1lKTsKLSAgICAgICAgc3RyY3B5IChzdHJyY2hyKCpwcEZpbGVMaXN0ICsgaWksICdcXCcpICsgMSwgZmluZGRhdGEuY0ZpbGVOYW1lKTsKLQotICAgICAgICBpZiAoc3RyY21wKHBzdHJQYXRoTmFtZSwgKnBwRmlsZUxpc3QgKyBpaSkgPT0gMCkKLSAgICAgICAgICAgICpwRmlsZUluZGV4ID0gaTsKLQotICAgICAgICBpaSArPSBNQVhfUEFUSDsKLSAgICAgICAgaSsrOwotCi0gICAgICAgIGJPayA9IEZpbmROZXh0RmlsZShoRmluZCwgJmZpbmRkYXRhKTsKLSAgICB9Ci0gICAgRmluZENsb3NlKGhGaW5kKTsKLQotICAgIC8vIGZpbmFsbHkgd2UgbXVzdCBzb3J0IHRoZSBmaWxlLWxpc3QKLQotICAgIGZvciAoaSA9IDA7IGkgPCAqcEZpbGVDb3VudCAtIDE7IGkrKykKLSAgICB7Ci0gICAgICAgIGlpID0gaSAqIE1BWF9QQVRIOwotICAgICAgICBmb3IgKGogPSBpKzE7IGogPCAqcEZpbGVDb3VudDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBqaiA9IGogKiBNQVhfUEFUSDsKLSAgICAgICAgICAgIGlmIChzdHJjbXAgKCpwcEZpbGVMaXN0ICsgaWksICpwcEZpbGVMaXN0ICsgamopID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJjcHkgKHN6VG1wLCAqcHBGaWxlTGlzdCArIGpqKTsKLSAgICAgICAgICAgICAgICBzdHJjcHkgKCpwcEZpbGVMaXN0ICsgamosICpwcEZpbGVMaXN0ICsgaWkpOwotICAgICAgICAgICAgICAgIHN0cmNweSAoKnBwRmlsZUxpc3QgKyBpaSwgc3pUbXApOwotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyB3YXMgdGhlIGN1cnJlbnQgaW1hZ2UgdGhhdCB3ZSBtb3ZlZAotCi0gICAgICAgICAgICAgICAgaWYgKCpwRmlsZUluZGV4ID09IGkpCi0gICAgICAgICAgICAgICAgICAgICpwRmlsZUluZGV4ID0gajsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmICgqcEZpbGVJbmRleCA9PSBqKQotICAgICAgICAgICAgICAgICAgICAgICAgKnBGaWxlSW5kZXggPSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLQotLy8gIFNlYXJjaFBuZ0xpc3QKLS8vLS0tLS0tLS0tLS0tLS0tLQotCi1CT09MIFNlYXJjaFBuZ0xpc3QgKAotICAgICAgICBUQ0hBUiAqcEZpbGVMaXN0LCBpbnQgRmlsZUNvdW50LCBpbnQgKnBGaWxlSW5kZXgsCi0gICAgICAgIFBUU1RSIHBzdHJQcmV2TmFtZSwgUFRTVFIgcHN0ck5leHROYW1lKQotewotICAgIGlmIChGaWxlQ291bnQgPiAwKQotICAgIHsKLSAgICAgICAgLy8gZ2V0IHByZXZpb3VzIGVudHJ5Ci0gICAgICAgIAotICAgICAgICBpZiAocHN0clByZXZOYW1lICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqcEZpbGVJbmRleCA+IDApCi0gICAgICAgICAgICAgICAgKnBGaWxlSW5kZXggLT0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcEZpbGVJbmRleCA9IEZpbGVDb3VudCAtIDE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN0cmNweSAocHN0clByZXZOYW1lLCBwRmlsZUxpc3QgKyAoKnBGaWxlSW5kZXggKiBNQVhfUEFUSCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgbmV4dCBlbnRyeQotICAgICAgICAKLSAgICAgICAgaWYgKHBzdHJOZXh0TmFtZSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKnBGaWxlSW5kZXggPCBGaWxlQ291bnQgLSAxKQotICAgICAgICAgICAgICAgICpwRmlsZUluZGV4ICs9IDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKnBGaWxlSW5kZXggPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdHJjcHkgKHBzdHJOZXh0TmFtZSwgcEZpbGVMaXN0ICsgKCpwRmlsZUluZGV4ICogTUFYX1BBVEgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBMb2FkSW1hZ2VGaWxlCi0vLy0tLS0tLS0tLS0tLS0tLS0tCi0KLUJPT0wgTG9hZEltYWdlRmlsZSAoSFdORCBod25kLCBQVFNUUiBwc3RyUGF0aE5hbWUsCi0gICAgICAgICAgICAgICAgcG5nX2J5dGUgKipwcGJJbWFnZSwgaW50ICpweEltZ1NpemUsIGludCAqcHlJbWdTaXplLAotICAgICAgICAgICAgICAgIGludCAqcGlDaGFubmVscywgcG5nX2NvbG9yICpwQmtnQ29sb3IpCi17Ci0gICAgc3RhdGljIFRDSEFSIHN6VG1wIFtNQVhfUEFUSF07Ci0KLSAgICAvLyBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIFBORywgZnJlZSB0aGUgbWVtb3J5Ci0KLSAgICBpZiAoKnBwYkltYWdlKQotICAgIHsKLSAgICAgICAgZnJlZSAoKnBwYkltYWdlKTsKLSAgICAgICAgKnBwYkltYWdlID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBMb2FkIHRoZSBlbnRpcmUgUE5HIGludG8gbWVtb3J5Ci0KLSAgICBTZXRDdXJzb3IgKExvYWRDdXJzb3IgKE5VTEwsIElEQ19XQUlUKSk7Ci0gICAgU2hvd0N1cnNvciAoVFJVRSk7Ci0KLSAgICBQbmdMb2FkSW1hZ2UgKHBzdHJQYXRoTmFtZSwgcHBiSW1hZ2UsIHB4SW1nU2l6ZSwgcHlJbWdTaXplLCBwaUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgcEJrZ0NvbG9yKTsKLQotICAgIFNob3dDdXJzb3IgKEZBTFNFKTsKLSAgICBTZXRDdXJzb3IgKExvYWRDdXJzb3IgKE5VTEwsIElEQ19BUlJPVykpOwotCi0gICAgaWYgKCpwcGJJbWFnZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgc3ByaW50ZiAoc3pUbXAsICJWaXN1YWxQbmcgLSAlcyIsIHN0cnJjaHIocHN0clBhdGhOYW1lLCAnXFwnKSArIDEpOwotICAgICAgICBTZXRXaW5kb3dUZXh0IChod25kLCBzelRtcCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE1lc3NhZ2VCb3ggKGh3bmQsIFRFWFQgKCJFcnJvciBpbiBsb2FkaW5nIHRoZSBQTkcgaW1hZ2UiKSwKLSAgICAgICAgICAgIHN6UHJvZ05hbWUsIE1CX0lDT05FWENMQU1BVElPTiB8IE1CX09LKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0KLS8vICBEaXNwbGF5SW1hZ2UKLS8vLS0tLS0tLS0tLS0tLS0tLQotCi1CT09MIERpc3BsYXlJbWFnZSAoSFdORCBod25kLCBCWVRFICoqcHBEaWIsCi0gICAgICAgIEJZVEUgKipwcERpRGF0YSwgaW50IGN4V2luU2l6ZSwgaW50IGN5V2luU2l6ZSwKLSAgICAgICAgQllURSAqcGJJbWFnZSwgaW50IGN4SW1nU2l6ZSwgaW50IGN5SW1nU2l6ZSwgaW50IGNJbWdDaGFubmVscywKLSAgICAgICAgQk9PTCBiU3RyZXRjaGVkKQotewotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICpwRGliID0gKnBwRGliOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICpwRGlEYXRhID0gKnBwRGlEYXRhOwotICAgIC8vIEJJVE1BUEZJTEVIRUFERVIgICAgICAgICpwYm1maDsKLSAgICBCSVRNQVBJTkZPSEVBREVSICAgICAgICAgICAqcGJtaWg7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgIHdESVJvd0J5dGVzOwotICAgIHBuZ19jb2xvciAgICAgICAgICAgICAgICAgICBia2dCbGFjayA9IHswLCAwLCAwfTsKLSAgICBwbmdfY29sb3IgICAgICAgICAgICAgICAgICAgYmtnR3JheSAgPSB7MTI3LCAxMjcsIDEyN307Ci0gICAgcG5nX2NvbG9yICAgICAgICAgICAgICAgICAgIGJrZ1doaXRlID0gezI1NSwgMjU1LCAyNTV9OwotCi0gICAgLy8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgRGV2aWNlIEluZGVwZW5kYW50IGJpdG1hcAotCi0gICAgd0RJUm93Qnl0ZXMgPSAoV09SRCkgKCgzICogY3hXaW5TaXplICsgM0wpID4+IDIpIDw8IDI7Ci0KLSAgICBpZiAocERpYikKLSAgICB7Ci0gICAgICAgIGZyZWUgKHBEaWIpOwotICAgICAgICBwRGliID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIShwRGliID0gKEJZVEUgKikgbWFsbG9jIChzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKwotICAgICAgICB3RElSb3dCeXRlcyAqIGN5V2luU2l6ZSkpKQotICAgIHsKLSAgICAgICAgTWVzc2FnZUJveCAoaHduZCwgVEVYVCAoIkVycm9yIGluIGRpc3BsYXlpbmcgdGhlIFBORyBpbWFnZSIpLAotICAgICAgICAgICAgc3pQcm9nTmFtZSwgTUJfSUNPTkVYQ0xBTUFUSU9OIHwgTUJfT0spOwotICAgICAgICAqcHBEaWIgPSBwRGliID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICAqcHBEaWIgPSBwRGliOwotICAgIG1lbXNldCAocERpYiwgMCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKLQotICAgIC8vIGluaXRpYWxpemUgdGhlIGRpYi1zdHJ1Y3R1cmUKLQotICAgIHBibWloID0gKEJJVE1BUElORk9IRUFERVIgKikgcERpYjsKLSAgICBwYm1paC0+YmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgIHBibWloLT5iaVdpZHRoID0gY3hXaW5TaXplOwotICAgIHBibWloLT5iaUhlaWdodCA9IC0oKGxvbmcpIGN5V2luU2l6ZSk7Ci0gICAgcGJtaWgtPmJpUGxhbmVzID0gMTsKLSAgICBwYm1paC0+YmlCaXRDb3VudCA9IDI0OwotICAgIHBibWloLT5iaUNvbXByZXNzaW9uID0gMDsKLSAgICBwRGlEYXRhID0gcERpYiArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgICAqcHBEaURhdGEgPSBwRGlEYXRhOwotCi0gICAgLy8gZmlyc3QgZmlsbCBiaXRtYXAgd2l0aCBncmF5IGFuZCBpbWFnZSBib3JkZXIKLQotICAgIEluaXRCaXRtYXAgKHBEaURhdGEsIGN4V2luU2l6ZSwgY3lXaW5TaXplKTsKLQotICAgIC8vIHRoZW4gZmlsbCBiaXRtYXAgd2l0aCBpbWFnZQotCi0gICAgaWYgKHBiSW1hZ2UpCi0gICAgewotICAgICAgICBGaWxsQml0bWFwICgKLSAgICAgICAgICAgIHBEaURhdGEsIGN4V2luU2l6ZSwgY3lXaW5TaXplLAotICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywKLSAgICAgICAgICAgIGJTdHJldGNoZWQpOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tCi0vLyAgSW5pdEJpdG1hcAotLy8tLS0tLS0tLS0tLS0tLQotCi1CT09MIEluaXRCaXRtYXAgKEJZVEUgKnBEaURhdGEsIGludCBjeFdpblNpemUsIGludCBjeVdpblNpemUpCi17Ci0gICAgQllURSAqZHN0OwotICAgIGludCB4LCB5LCBjb2w7Ci0KLSAgICAvLyBpbml0aWFsaXplIHRoZSBiYWNrZ3JvdW5kIHdpdGggZ3JheQotCi0gICAgZHN0ID0gcERpRGF0YTsKLSAgICBmb3IgKHkgPSAwOyB5IDwgY3lXaW5TaXplOyB5KyspCi0gICAgewotICAgICAgICBjb2wgPSAwOwotICAgICAgICBmb3IgKHggPSAwOyB4IDwgY3hXaW5TaXplOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGZpbGwgd2l0aCBHUkFZCi0gICAgICAgICAgICAqZHN0KysgPSAxMjc7Ci0gICAgICAgICAgICAqZHN0KysgPSAxMjc7Ci0gICAgICAgICAgICAqZHN0KysgPSAxMjc7Ci0gICAgICAgICAgICBjb2wgKz0gMzsKLSAgICAgICAgfQotICAgICAgICAvLyByb3dzIHN0YXJ0IG9uIDQgYnl0ZSBib3VuZGFyaWVzCi0gICAgICAgIHdoaWxlICgoY29sICUgNCkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZHN0Kys7Ci0gICAgICAgICAgICBjb2wrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tCi0vLyAgRmlsbEJpdG1hcAotLy8tLS0tLS0tLS0tLS0tLQotCi1CT09MIEZpbGxCaXRtYXAgKAotICAgICAgICBCWVRFICpwRGlEYXRhLCBpbnQgY3hXaW5TaXplLCBpbnQgY3lXaW5TaXplLAotICAgICAgICBCWVRFICpwYkltYWdlLCBpbnQgY3hJbWdTaXplLCBpbnQgY3lJbWdTaXplLCBpbnQgY0ltZ0NoYW5uZWxzLAotICAgICAgICBCT09MIGJTdHJldGNoZWQpCi17Ci0gICAgQllURSAqcFN0cmV0Y2hlZEltYWdlOwotICAgIEJZVEUgKnBJbWc7Ci0gICAgQllURSAqc3JjLCAqZHN0OwotICAgIEJZVEUgciwgZywgYiwgYTsKLSAgICBjb25zdCBpbnQgY0RJQ2hhbm5lbHMgPSAzOwotICAgIFdPUkQgd0ltZ1Jvd0J5dGVzOwotICAgIFdPUkQgd0RJUm93Qnl0ZXM7Ci0gICAgaW50IGN4TmV3U2l6ZSwgY3lOZXdTaXplOwotICAgIGludCBjeEltZ1BvcywgY3lJbWdQb3M7Ci0gICAgaW50IHhJbWcsIHlJbWc7Ci0gICAgaW50IHhXaW4sIHlXaW47Ci0gICAgaW50IHhPbGQsIHlPbGQ7Ci0gICAgaW50IHhOZXcsIHlOZXc7Ci0KLSAgICBpZiAoYlN0cmV0Y2hlZCkKLSAgICB7Ci0gICAgICAgIGN4TmV3U2l6ZSA9IGN4V2luU2l6ZSAtIDIgKiBNQVJHSU47Ci0gICAgICAgIGN5TmV3U2l6ZSA9IGN5V2luU2l6ZSAtIDIgKiBNQVJHSU47Ci0KLSAgICAgICAgLy8gc3RyZXRjaCB0aGUgaW1hZ2UgdG8gaXQncyB3aW5kb3cgZGV0ZXJtaW5lZCBzaXplCi0KLSAgICAgICAgLy8gdGhlIGZvbGxvd2luZyB0d28gYXJlIHRoZSBzYW1lLCBidXQgdGhlIGZpcnN0IGhhcyBzaWRlLWVmZmVjdHMKLSAgICAgICAgLy8gYmVjYXVzZSBvZiByb3VuZGluZwotLy8gICAgICBpZiAoKGN5TmV3U2l6ZSAvIGN4TmV3U2l6ZSkgPiAoY3lJbWdTaXplIC8gY3hJbWdTaXplKSkKLSAgICAgICAgaWYgKChjeU5ld1NpemUgKiBjeEltZ1NpemUpID4gKGN5SW1nU2l6ZSAqIGN4TmV3U2l6ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN5TmV3U2l6ZSA9IGN4TmV3U2l6ZSAqIGN5SW1nU2l6ZSAvIGN4SW1nU2l6ZTsKLSAgICAgICAgICAgIGN4SW1nUG9zID0gTUFSR0lOOwotICAgICAgICAgICAgY3lJbWdQb3MgPSAoY3lXaW5TaXplIC0gY3lOZXdTaXplKSAvIDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBjeE5ld1NpemUgPSBjeU5ld1NpemUgKiBjeEltZ1NpemUgLyBjeUltZ1NpemU7Ci0gICAgICAgICAgICBjeUltZ1BvcyA9IE1BUkdJTjsKLSAgICAgICAgICAgIGN4SW1nUG9zID0gKGN4V2luU2l6ZSAtIGN4TmV3U2l6ZSkgLyAyOwotICAgICAgICB9Ci0KLSAgICAgICAgcFN0cmV0Y2hlZEltYWdlID0gbWFsbG9jIChjSW1nQ2hhbm5lbHMgKiBjeE5ld1NpemUgKiBjeU5ld1NpemUpOwotICAgICAgICBwSW1nID0gcFN0cmV0Y2hlZEltYWdlOwotCi0gICAgICAgIGZvciAoeU5ldyA9IDA7IHlOZXcgPCBjeU5ld1NpemU7IHlOZXcrKykKLSAgICAgICAgewotICAgICAgICAgICAgeU9sZCA9IHlOZXcgKiBjeUltZ1NpemUgLyBjeU5ld1NpemU7Ci0gICAgICAgICAgICBmb3IgKHhOZXcgPSAwOyB4TmV3IDwgY3hOZXdTaXplOyB4TmV3KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeE9sZCA9IHhOZXcgKiBjeEltZ1NpemUgLyBjeE5ld1NpemU7Ci0KLSAgICAgICAgICAgICAgICByID0gKihwYkltYWdlICsgY0ltZ0NoYW5uZWxzICogKCh5T2xkICogY3hJbWdTaXplKSArIHhPbGQpICsgMCk7Ci0gICAgICAgICAgICAgICAgZyA9ICoocGJJbWFnZSArIGNJbWdDaGFubmVscyAqICgoeU9sZCAqIGN4SW1nU2l6ZSkgKyB4T2xkKSArIDEpOwotICAgICAgICAgICAgICAgIGIgPSAqKHBiSW1hZ2UgKyBjSW1nQ2hhbm5lbHMgKiAoKHlPbGQgKiBjeEltZ1NpemUpICsgeE9sZCkgKyAyKTsKLSAgICAgICAgICAgICAgICAqcEltZysrID0gcjsKLSAgICAgICAgICAgICAgICAqcEltZysrID0gZzsKLSAgICAgICAgICAgICAgICAqcEltZysrID0gYjsKLSAgICAgICAgICAgICAgICBpZiAoY0ltZ0NoYW5uZWxzID09IDQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhID0gKihwYkltYWdlICsgY0ltZ0NoYW5uZWxzICogKCh5T2xkICogY3hJbWdTaXplKSArIHhPbGQpCi0gICAgICAgICAgICAgICAgICAgICAgICArIDMpOwotICAgICAgICAgICAgICAgICAgICAqcEltZysrID0gYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjYWxjdWxhdGUgcm93LWJ5dGVzCi0KLSAgICAgICAgd0ltZ1Jvd0J5dGVzID0gY0ltZ0NoYW5uZWxzICogY3hOZXdTaXplOwotICAgICAgICB3RElSb3dCeXRlcyA9IChXT1JEKSAoKGNESUNoYW5uZWxzICogY3hXaW5TaXplICsgM0wpID4+IDIpIDw8IDI7Ci0KLSAgICAgICAgLy8gY29weSBpbWFnZSB0byBzY3JlZW4KLQotICAgICAgICBmb3IgKHlJbWcgPSAwLCB5V2luID0gY3lJbWdQb3M7IHlJbWcgPCBjeU5ld1NpemU7IHlJbWcrKywgeVdpbisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeVdpbiA+PSBjeVdpblNpemUgLSBjeUltZ1BvcykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHNyYyA9IHBTdHJldGNoZWRJbWFnZSArIHlJbWcgKiB3SW1nUm93Qnl0ZXM7Ci0gICAgICAgICAgICBkc3QgPSBwRGlEYXRhICsgeVdpbiAqIHdESVJvd0J5dGVzICsgY3hJbWdQb3MgKiBjRElDaGFubmVsczsKLQotICAgICAgICAgICAgZm9yICh4SW1nID0gMCwgeFdpbiA9IGN4SW1nUG9zOyB4SW1nIDwgY3hOZXdTaXplOyB4SW1nKyssIHhXaW4rKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoeFdpbiA+PSBjeFdpblNpemUgLSBjeEltZ1BvcykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gYjsgLyogbm90ZSB0aGUgcmV2ZXJzZSBvcmRlciAqLwotICAgICAgICAgICAgICAgICpkc3QrKyA9IGc7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gcjsKLSAgICAgICAgICAgICAgICBpZiAoY0ltZ0NoYW5uZWxzID09IDQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZyZWUgbWVtb3J5Ci0KLSAgICAgICAgaWYgKHBTdHJldGNoZWRJbWFnZSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlIChwU3RyZXRjaGVkSW1hZ2UpOwotICAgICAgICAgICAgcFN0cmV0Y2hlZEltYWdlID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLy8gcHJvY2VzcyB0aGUgaW1hZ2Ugbm90LXN0cmV0Y2hlZAotCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBjZW50cmFsIHBvc2l0aW9uCi0KLSAgICAgICAgY3hJbWdQb3MgPSAoY3hXaW5TaXplIC0gY3hJbWdTaXplKSAvIDI7Ci0gICAgICAgIGN5SW1nUG9zID0gKGN5V2luU2l6ZSAtIGN5SW1nU2l6ZSkgLyAyOwotCi0gICAgICAgIC8vIGNoZWNrIGZvciBpbWFnZSBsYXJnZXIgdGhhbiB3aW5kb3cKLQotICAgICAgICBpZiAoY3hJbWdQb3MgPCBNQVJHSU4pCi0gICAgICAgICAgICBjeEltZ1BvcyA9IE1BUkdJTjsKLSAgICAgICAgaWYgKGN5SW1nUG9zIDwgTUFSR0lOKQotICAgICAgICAgICAgY3lJbWdQb3MgPSBNQVJHSU47Ci0KLSAgICAgICAgLy8gY2FsY3VsYXRlIGJvdGggcm93LWJ5dGVzCi0KLSAgICAgICAgd0ltZ1Jvd0J5dGVzID0gY0ltZ0NoYW5uZWxzICogY3hJbWdTaXplOwotICAgICAgICB3RElSb3dCeXRlcyA9IChXT1JEKSAoKGNESUNoYW5uZWxzICogY3hXaW5TaXplICsgM0wpID4+IDIpIDw8IDI7Ci0KLSAgICAgICAgLy8gY29weSBpbWFnZSB0byBzY3JlZW4KLQotICAgICAgICBmb3IgKHlJbWcgPSAwLCB5V2luID0gY3lJbWdQb3M7IHlJbWcgPCBjeUltZ1NpemU7IHlJbWcrKywgeVdpbisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeVdpbiA+PSBjeVdpblNpemUgLSBNQVJHSU4pCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBzcmMgPSBwYkltYWdlICsgeUltZyAqIHdJbWdSb3dCeXRlczsKLSAgICAgICAgICAgIGRzdCA9IHBEaURhdGEgKyB5V2luICogd0RJUm93Qnl0ZXMgKyBjeEltZ1BvcyAqIGNESUNoYW5uZWxzOwotCi0gICAgICAgICAgICBmb3IgKHhJbWcgPSAwLCB4V2luID0gY3hJbWdQb3M7IHhJbWcgPCBjeEltZ1NpemU7IHhJbWcrKywgeFdpbisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh4V2luID49IGN4V2luU2l6ZSAtIE1BUkdJTikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gYjsgLyogbm90ZSB0aGUgcmV2ZXJzZSBvcmRlciAqLwotICAgICAgICAgICAgICAgICpkc3QrKyA9IGc7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gcjsKLSAgICAgICAgICAgICAgICBpZiAoY0ltZ0NoYW5uZWxzID09IDQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgZW5kIG9mIHNvdXJjZQotLy8tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5kc3AgYi9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEzYzVhNy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IlZpc3VhbFBuZyIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIgMHgwMTAxCi0KLUNGRz1WaXN1YWxQbmcgLSBXaW4zMiBEZWJ1ZwotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJWaXN1YWxQbmcubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJWaXN1YWxQbmcubWFrIiBDRkc9IlZpc3VhbFBuZyAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIlZpc3VhbFBuZyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgIlZpc3VhbFBuZyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCi0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIlZpc3VhbFBuZyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9PMiAvSSAiLi5cLi4iIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJQTkdfTk9fU1RESU8iIC9EICJQTkdfTk9fR0xPQkFMX0FSUkFZUyIgL0ZEIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiUE5HX05PX1NURElPIiAvRCAiUE5HX05PX0dMT0JBTF9BUlJBWVMiIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0xJQl9SZWxlYXNlXGxpYnBuZy5saWIgLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9MSUJfUmVsZWFzZVx6bGliLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2Ci0jIEJlZ2luIFNwZWNpYWwgQnVpbGQgVG9vbAotT3V0RGlyPS5cUmVsZWFzZQotU09VUkNFPSIkKElucHV0UGF0aCkiCi1Qb3N0QnVpbGRfQ21kcz0kKG91dGRpcilcVmlzdWFsUG5nLmV4ZSAuLlwuLlxjb250cmliXHBuZ3N1aXRlXGJhc242YTE2LnBuZwotIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJWaXN1YWxQbmcgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvWkkgL09kIC9JICIuLlwuLiIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIlBOR19OT19TVERJTyIgL0QgIlBOR19OT19HTE9CQUxfQVJSQVlTIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiUE5HX05PX1NURElPIiAvRCAiUE5HX05PX0dMT0JBTF9BUlJBWVMiIC9GRCAvR1ogL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWAotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiAuLlwuLlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9MSUJfUmVsZWFzZVxsaWJwbmcubGliIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfTElCX1JlbGVhc2VcemxpYi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL25vZGVmYXVsdGxpYjoibXN2Y3J0LmxpYiIgL3BkYnR5cGU6c2VwdAotIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wKLU91dERpcj0uXERlYnVnCi1TT1VSQ0U9IiQoSW5wdXRQYXRoKSIKLVBvc3RCdWlsZF9DbWRzPSQob3V0ZGlyKVxWaXN1YWxQbmcuZXhlIC4uXC4uXGNvbnRyaWJccG5nc3VpdGVcYmFzbjZhMTYucG5nCi0jIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIlZpc3VhbFBuZyAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIlZpc3VhbFBuZyAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXFBuZ0ZpbGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cVmlzdWFsUG5nLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGNleGNlcHQuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cUG5nRmlsZS5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZXNvdXJjZS5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cVmlzdWFsUG5nLmljbwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cVmlzdWFsUG5nLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5kc3cgYi9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhZDgzYS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzdworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLU1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJWaXN1YWxQbmciPS5cVmlzdWFsUG5nLmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTw0Pgote3t7Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1HbG9iYWw6Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTwzPgote3t7Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmljbyBiL2xpYnMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGFhMzcxLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5wbmcgYi9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhYTgwYS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcucmMgYi9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTFjNjhjLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcucmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy9NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBnZW5lcmF0ZWQgcmVzb3VyY2Ugc2NyaXB0LgotLy8KLSNpbmNsdWRlICJyZXNvdXJjZS5oIgotCi0jZGVmaW5lIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDIgcmVzb3VyY2UuCi0vLwotI2luY2x1ZGUgImFmeHJlcy5oIgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcwotCi0jaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19FTlUpCi0jaWZkZWYgX1dJTjMyCi1MQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUwotI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikKLSNlbmRpZiAvL19XSU4zMgotCi0jaWZkZWYgQVBTVFVESU9fSU5WT0tFRAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBURVhUSU5DTFVERQotLy8KLQotMSBURVhUSU5DTFVERSBESVNDQVJEQUJMRSAKLUJFR0lOCi0gICAgInJlc291cmNlLmhcMCIKLUVORAotCi0yIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIAotQkVHSU4KLSAgICAiI2luY2x1ZGUgIiJhZnhyZXMuaCIiXHJcbiIKLSAgICAiXDAiCi1FTkQKLQotMyBURVhUSU5DTFVERSBESVNDQVJEQUJMRSAKLUJFR0lOCi0gICAgIlxyXG4iCi0gICAgIlwwIgotRU5ECi0KLSNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VECi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBNZW51Ci0vLwotCi1WSVNVQUxQTkcgTUVOVSBESVNDQVJEQUJMRSAKLUJFR0lOCi0gICAgUE9QVVAgIiZGaWxlIgotICAgIEJFR0lOCi0gICAgICAgIE1FTlVJVEVNICImT3BlbiBJbWFnZS4uLlx0Q3RybCtPIiwgICAgICBJRE1fRklMRV9PUEVOCi0gICAgICAgIE1FTlVJVEVNICJTYXZlICZBcy4uLiIsICAgICAgICAgICAgICAgICBJRE1fRklMRV9TQVZFCi0gICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgotICAgICAgICBNRU5VSVRFTSAiJk5leHQgSW1hZ2VcdEN0cmwrTiIsICAgICAgICAgSURNX0ZJTEVfTkVYVAotICAgICAgICBNRU5VSVRFTSAiUHJlJnZpb3VzIEltYWdlXHRDdHJsK1YiLCAgICAgSURNX0ZJTEVfUFJFVklPVVMKLSAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCi0gICAgICAgIE1FTlVJVEVNICJFJnhpdFx0QWx0K1giLCAgICAgICAgICAgICAgICBJRE1fRklMRV9FWElUCi0gICAgRU5ECi0gICAgUE9QVVAgIiZPcHRpb25zIgotICAgIEJFR0lOCi0gICAgICAgIE1FTlVJVEVNICImU3RyZXRjaCIsICAgICAgICAgICAgICAgICAgICBJRE1fT1BUSU9OU19TVFJFVENILCBDSEVDS0VECi0gICAgRU5ECi0gICAgUE9QVVAgIiZIZWxwIgotICAgIEJFR0lOCi0gICAgICAgIE1FTlVJVEVNICImQWJvdXQiLCAgICAgICAgICAgICAgICAgICAgICBJRE1fSEVMUF9BQk9VVAotICAgIEVORAotRU5ECi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBBY2NlbGVyYXRvcgotLy8KLQotVklTVUFMUE5HIEFDQ0VMRVJBVE9SUyBESVNDQVJEQUJMRSAKLUJFR0lOCi0gICAgIk4iLCAgICAgICAgICAgIElETV9GSUxFX05FWFQsICAgICAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUCi0gICAgIk8iLCAgICAgICAgICAgIElETV9GSUxFX09QRU4sICAgICAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUCi0gICAgIlAiLCAgICAgICAgICAgIElETV9GSUxFX1BSRVZJT1VTLCAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUCi0gICAgIlYiLCAgICAgICAgICAgIElETV9GSUxFX1BSRVZJT1VTLCAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUCi0gICAgIlgiLCAgICAgICAgICAgIElETV9GSUxFX0VYSVQsICAgICAgICAgIFZJUlRLRVksIEFMVCwgTk9JTlZFUlQKLUVORAotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gSWNvbgotLy8KLQotLy8gSWNvbiB3aXRoIGxvd2VzdCBJRCB2YWx1ZSBwbGFjZWQgZmlyc3QgdG8gZW5zdXJlIGFwcGxpY2F0aW9uIGljb24KLS8vIHJlbWFpbnMgY29uc2lzdGVudCBvbiBhbGwgc3lzdGVtcy4KLVZJU1VBTFBORyAgICAgICAgICAgICAgIElDT04gICAgRElTQ0FSREFCTEUgICAgICJWaXN1YWxQbmcuaWNvIgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vIERpYWxvZwotLy8KLQotQUJPVVRCT1ggRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAxODYsIDk0Ci1TVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAKLUZPTlQgOCwgIk1TIFNhbnMgU2VyaWYiCi1CRUdJTgotICAgIERFRlBVU0hCVVRUT04gICAiT0siLElET0ssNjgsNjcsNTAsMTQKLSAgICBDVEVYVCAgICAgICAgICAgIlZpc3VhbFBuZyAxLjAgIC0gIEp1bmUgMjAwMCIsSURDX1NUQVRJQyw0OSwxNCw4OCw4Ci0gICAgTFRFWFQgICAgICAgICAgICJhIFBORyBpbWFnZSB2aWV3ZXIiLElEQ19TVEFUSUMsNjAsMzAsNjYsOAotICAgIExURVhUICAgICAgICAgICAiKGMpIFdpbGxlbSB2YW4gU2NoYWlrLCAyMDAwIixJRENfU1RBVElDLDQ4LDUyLDkwLDgKLSAgICBMVEVYVCAgICAgICAgICAgInRvIGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgbGlicG5nIGluIFZpc3VhbCBDIiwKLSAgICAgICAgICAgICAgICAgICAgSURDX1NUQVRJQywyNSwzOCwxMzYsOAotRU5ECi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBERVNJR05JTkZPCi0vLwotCi0jaWZkZWYgQVBTVFVESU9fSU5WT0tFRAotR1VJREVMSU5FUyBERVNJR05JTkZPIERJU0NBUkRBQkxFIAotQkVHSU4KLSAgICAiQUJPVVRCT1giLCBESUFMT0cKLSAgICBCRUdJTgotICAgICAgICBMRUZUTUFSR0lOLCA3Ci0gICAgICAgIFJJR0hUTUFSR0lOLCAxNzkKLSAgICAgICAgVE9QTUFSR0lOLCA3Ci0gICAgICAgIEJPVFRPTU1BUkdJTiwgODcKLSAgICBFTkQKLUVORAotI2VuZGlmICAgIC8vIEFQU1RVRElPX0lOVk9LRUQKLQotI2VuZGlmICAgIC8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi0KLSNpZm5kZWYgQVBTVFVESU9fSU5WT0tFRAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMyByZXNvdXJjZS4KLS8vCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNlbmRpZiAgICAvLyBub3QgQVBTVFVESU9fSU5WT0tFRAotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oIGIvbGlicy9saWJwbmcvY29udHJpYi92aXN1cG5nL2NleGNlcHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0NWQ3Ni4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qPT09Ci1jZXhjZXB0LmggMi4wLjEgKDIwMDgtSnVsLTE5LVNhdCkKLWh0dHA6Ly93d3cubmljZW1pY2UubmV0L2NleGNlcHQvCi1BZGFtIE0uIENvc3RlbGxvCi1odHRwOi8vd3d3Lm5pY2VtaWNlLm5ldC9hbWMvCi0KLUFuIGludGVyZmFjZSBmb3IgZXhjZXB0aW9uLWhhbmRsaW5nIGluIEFOU0kgQyAoQzg5IGFuZCBzdWJzZXF1ZW50IElTTwotc3RhbmRhcmRzKSwgZGV2ZWxvcGVkIGpvaW50bHkgd2l0aCBDb3NtaW4gVHJ1dGEuCi0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwOCBBZGFtIE0uIENvc3RlbGxvIGFuZCBDb3NtaW4gVHJ1dGEuCi0gICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgbW9kaWZpZWQgb25seSBpZiBpdHMgYXV0aG9yIGFuZCB2ZXJzaW9uCi0gICAgaW5mb3JtYXRpb24gaXMgdXBkYXRlZCBhY2N1cmF0ZWx5LCBhbmQgbWF5IGJlIHJlZGlzdHJpYnV0ZWQKLSAgICBvbmx5IGlmIGFjY29tcGFuaWVkIGJ5IHRoaXMgdW5hbHRlcmVkIG5vdGljZS4gIFN1YmplY3QgdG8gdGhvc2UKLSAgICByZXN0cmljdGlvbnMsIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gZG8gYW55dGhpbmcKLSAgICB3aXRoIHRoaXMgc29mdHdhcmUuICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyBndWFyYW50ZWVzCi0gICAgcmVnYXJkaW5nIHRoaXMgc29mdHdhcmUsIGFuZCBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBhbnkgZGFtYWdlCi0gICAgcmVzdWx0aW5nIGZyb20gaXRzIHVzZS4KLQotVGhlIGNleGNlcHQgaW50ZXJmYWNlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggYW5kIGNhbm5vdCBpbnRlcmFjdAotd2l0aCBzeXN0ZW0gZXhjZXB0aW9ucyAobGlrZSBkaXZpc2lvbiBieSB6ZXJvIG9yIG1lbW9yeSBzZWdtZW50YXRpb24KLXZpb2xhdGlvbiksIGNvbXBpbGVyLWdlbmVyYXRlZCBleGNlcHRpb25zIChsaWtlIEMrKyBleGNlcHRpb25zKSwgb3IKLW90aGVyIGV4Y2VwdGlvbi1oYW5kbGluZyBpbnRlcmZhY2VzLgotCi1XaGVuIHVzaW5nIHRoaXMgaW50ZXJmYWNlIGFjcm9zcyBtdWx0aXBsZSAuYyBmaWxlcywgZG8gbm90IGluY2x1ZGUKLXRoaXMgaGVhZGVyIGZpbGUgZGlyZWN0bHkuICBJbnN0ZWFkLCBjcmVhdGUgYSB3cmFwcGVyIGhlYWRlciBmaWxlIHRoYXQKLWluY2x1ZGVzIHRoaXMgaGVhZGVyIGZpbGUgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVmaW5lX2V4Y2VwdGlvbl90eXBlCi1tYWNybyAoc2VlIGJlbG93KS4gIFRoZSAuYyBmaWxlcyBzaG91bGQgdGhlbiBpbmNsdWRlIHRoYXQgaGVhZGVyIGZpbGUuCi0KLVRoZSBpbnRlcmZhY2UgY29uc2lzdHMgb2Ygb25lIHR5cGUsIG9uZSB3ZWxsLWtub3duIG5hbWUsIGFuZCBzaXggbWFjcm9zLgotCi0KLWRlZmluZV9leGNlcHRpb25fdHlwZSh0eXBlX25hbWUpOwotCi0gICAgVGhpcyBtYWNybyBpcyB1c2VkIGxpa2UgYW4gZXh0ZXJuYWwgZGVjbGFyYXRpb24uICBJdCBzcGVjaWZpZXMKLSAgICB0aGUgdHlwZSBvZiBvYmplY3QgdGhhdCBnZXRzIGNvcGllZCBmcm9tIHRoZSBleGNlcHRpb24gdGhyb3dlciB0bwotICAgIHRoZSBleGNlcHRpb24gY2F0Y2hlci4gIFRoZSB0eXBlX25hbWUgY2FuIGJlIGFueSB0eXBlIHRoYXQgY2FuIGJlCi0gICAgYXNzaWduZWQgdG8sIHRoYXQgaXMsIGEgbm9uLWNvbnN0YW50IGFyaXRobWV0aWMgdHlwZSwgc3RydWN0LCB1bmlvbiwKLSAgICBvciBwb2ludGVyLiAgRXhhbXBsZXM6Ci0KLSAgICAgICAgZGVmaW5lX2V4Y2VwdGlvbl90eXBlKGludCk7Ci0KLSAgICAgICAgZW51bSBleGNlcHRpb24geyBvdXRfb2ZfbWVtb3J5LCBiYWRfYXJndW1lbnRzLCBkaXNrX2Z1bGwgfTsKLSAgICAgICAgZGVmaW5lX2V4Y2VwdGlvbl90eXBlKGVudW0gZXhjZXB0aW9uKTsKLQotICAgICAgICBzdHJ1Y3QgZXhjZXB0aW9uIHsgaW50IGNvZGU7IGNvbnN0IGNoYXIgKm1zZzsgfTsKLSAgICAgICAgZGVmaW5lX2V4Y2VwdGlvbl90eXBlKHN0cnVjdCBleGNlcHRpb24pOwotCi0gICAgQmVjYXVzZSB0aHJvd2luZyBhbiBleGNlcHRpb24gY2F1c2VzIHRoZSBvYmplY3QgdG8gYmUgY29waWVkIChub3QKLSAgICBqdXN0IG9uY2UsIGJ1dCB0d2ljZSksIHByb2dyYW1tZXJzIG1heSB3aXNoIHRvIGNvbnNpZGVyIHNpemUgd2hlbgotICAgIGNob29zaW5nIHRoZSBleGNlcHRpb24gdHlwZS4KLQotCi1zdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQ7Ci0KLSAgICBUaGlzIHR5cGUgbWF5IGJlIHVzZWQgYWZ0ZXIgdGhlIGRlZmluZV9leGNlcHRpb25fdHlwZSgpIG1hY3JvIGhhcwotICAgIGJlZW4gaW52b2tlZC4gIEEgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IG11c3QgYmUga25vd24gdG8gYm90aAotICAgIHRoZSB0aHJvd2VyIGFuZCB0aGUgY2F0Y2hlci4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlcmUgYmUgb25lCi0gICAgY29udGV4dCBmb3IgZWFjaCB0aHJlYWQgdGhhdCB1c2VzIGV4Y2VwdGlvbnMuICBJdCB3b3VsZCBjZXJ0YWlubHkKLSAgICBiZSBkYW5nZXJvdXMgZm9yIG11bHRpcGxlIHRocmVhZHMgdG8gYWNjZXNzIHRoZSBzYW1lIGNvbnRleHQuCi0gICAgT25lIHRocmVhZCBjYW4gdXNlIG11bHRpcGxlIGNvbnRleHRzLCBidXQgdGhhdCBpcyBsaWtlbHkgdG8gYmUKLSAgICBjb25mdXNpbmcgYW5kIG5vdCB0eXBpY2FsbHkgdXNlZnVsLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBhbGxvY2F0ZQotICAgIHRoaXMgc3RydWN0dXJlIGluIGFueSB3YXkgaXQgcGxlYXNlcy0tYXV0b21hdGljLCBzdGF0aWMsIG9yIGR5bmFtaWMuCi0gICAgVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgc2hvdWxkIHByZXRlbmQgbm90IHRvIGtub3cgdGhlIHN0cnVjdHVyZQotICAgIG1lbWJlcnMsIHdoaWNoIGFyZSBzdWJqZWN0IHRvIGNoYW5nZS4KLQotCi1zdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dDsKLQotICAgIFRoZSBUcnkvQ2F0Y2ggYW5kIFRocm93IHN0YXRlbWVudHMgKGRlc2NyaWJlZCBiZWxvdykgaW1wbGljaXRseQotICAgIHJlZmVyIHRvIGEgY29udGV4dCwgdXNpbmcgdGhlIG5hbWUgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LiAgSXQgaXMKLSAgICB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIG5hbWUgeWllbGRzCi0gICAgdGhlIGFkZHJlc3Mgb2YgYSBtdXRhYmxlIChub24tY29uc3RhbnQpIHN0cnVjdCBleGNlcHRpb25fY29udGV4dAotICAgIHdoZXJldmVyIHRob3NlIHN0YXRlbWVudHMgYXJlIHVzZWQuICBTdWJqZWN0IHRvIHRoYXQgY29uc3RyYWludCwgdGhlCi0gICAgYXBwbGljYXRpb24gbWF5IGRlY2xhcmUgYSB2YXJpYWJsZSBvZiB0aGlzIG5hbWUgYW55d2hlcmUgaXQgbGlrZXMKLSAgICAoaW5zaWRlIGEgZnVuY3Rpb24sIGluIGEgcGFyYW1ldGVyIGxpc3QsIG9yIGV4dGVybmFsbHkpLCBhbmQgbWF5Ci0gICAgdXNlIHdoYXRldmVyIHN0b3JhZ2UgY2xhc3Mgc3BlY2lmaWVycyAoc3RhdGljLCBleHRlcm4sIGV0Yykgb3IgdHlwZQotICAgIHF1YWxpZmllcnMgKGNvbnN0LCB2b2xhdGlsZSwgZXRjKSBpdCBsaWtlcy4gIEV4YW1wbGVzOgotCi0gICAgICAgIHN0YXRpYyBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQKLSAgICAgICAgICAqIGNvbnN0IHRoZV9leGNlcHRpb25fY29udGV4dCA9ICZmb287Ci0KLSAgICAgICAgeyBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dCA9IGJhcjsgLi4uIH0KLQotICAgICAgICBpbnQgYmxhaChzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dCwgLi4uKTsKLQotICAgICAgICBleHRlcm4gc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IHRoZV9leGNlcHRpb25fY29udGV4dFsxXTsKLQotICAgIFRoZSBsYXN0IGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSB0cmljayB0aGF0IGF2b2lkcyBjcmVhdGluZyBhIHBvaW50ZXIKLSAgICBvYmplY3Qgc2VwYXJhdGUgZnJvbSB0aGUgc3RydWN0dXJlIG9iamVjdC4KLQotICAgIFRoZSBuYW1lIGNvdWxkIGV2ZW4gYmUgYSBtYWNybywgZm9yIGV4YW1wbGU6Ci0KLSAgICAgICAgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IGVjX2FycmF5W251bXRocmVhZHNdOwotICAgICAgICAjZGVmaW5lIHRoZV9leGNlcHRpb25fY29udGV4dCAoZWNfYXJyYXkgKyB0aHJlYWRfaWQpCi0KLSAgICBCZSBhd2FyZSB0aGF0IHRoZV9leGNlcHRpb25fY29udGV4dCBpcyB1c2VkIHNldmVyYWwgdGltZXMgYnkgdGhlCi0gICAgVHJ5L0NhdGNoL1Rocm93IG1hY3Jvcywgc28gaXQgc2hvdWxkbid0IGJlIGV4cGVuc2l2ZSBvciBoYXZlIHNpZGUKLSAgICBlZmZlY3RzLiAgVGhlIGV4cGFuc2lvbiBtdXN0IGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgYW4KLSAgICBpZGVudGlmaWVyLCBzbyBpdCdzIHNhZmVzdCB0byBwdXQgcGFyZW50aGVzZXMgYXJvdW5kIGl0LgotCi0KLXZvaWQgaW5pdF9leGNlcHRpb25fY29udGV4dChzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKmVjKTsKLQotICAgIEZvciBjb250ZXh0IHN0cnVjdHVyZXMgYWxsb2NhdGVkIHN0YXRpY2FsbHkgKGJ5IGFuIGV4dGVybmFsCi0gICAgZGVmaW5pdGlvbiBvciB1c2luZyB0aGUgInN0YXRpYyIga2V5d29yZCksIHRoZSBpbXBsaWNpdAotICAgIGluaXRpYWxpemF0aW9uIHRvIGFsbCB6ZXJvcyBpcyBzdWZmaWNpZW50LCBidXQgY29udGV4dHMgYWxsb2NhdGVkCi0gICAgYnkgb3RoZXIgbWVhbnMgbXVzdCBiZSBpbml0aWFsaXplZCB1c2luZyB0aGlzIG1hY3JvIGJlZm9yZSB0aGV5Ci0gICAgYXJlIHVzZWQgYnkgYSBUcnkvQ2F0Y2ggc3RhdGVtZW50LiAgSXQgZG9lcyBubyBoYXJtIHRvIGluaXRpYWxpemUKLSAgICBhIGNvbnRleHQgbW9yZSB0aGFuIG9uY2UgKGJ5IHVzaW5nIHRoaXMgbWFjcm8gb24gYSBzdGF0aWNhbGx5Ci0gICAgYWxsb2NhdGVkIGNvbnRleHQsIG9yIHVzaW5nIHRoaXMgbWFjcm8gdHdpY2Ugb24gdGhlIHNhbWUgY29udGV4dCksCi0gICAgYnV0IGEgY29udGV4dCBtdXN0IG5vdCBiZSByZS1pbml0aWFsaXplZCBhZnRlciBpdCBoYXMgYmVlbiB1c2VkIGJ5IGEKLSAgICBUcnkvQ2F0Y2ggc3RhdGVtZW50LgotCi0KLVRyeSBzdGF0ZW1lbnQKLUNhdGNoIChleHByZXNzaW9uKSBzdGF0ZW1lbnQKLQotICAgIFRoZSBUcnkvQ2F0Y2gvVGhyb3cgbWFjcm9zIGFyZSBjYXBpdGFsaXplZCBpbiBvcmRlciB0byBhdm9pZAotICAgIGNvbmZ1c2lvbiB3aXRoIHRoZSBDKysga2V5d29yZHMsIHdoaWNoIGhhdmUgc3VidGx5IGRpZmZlcmVudAotICAgIHNlbWFudGljcy4KLQotICAgIEEgVHJ5L0NhdGNoIHN0YXRlbWVudCBoYXMgYSBzeW50YXggc2ltaWxhciB0byBhbiBpZi9lbHNlIHN0YXRlbWVudCwKLSAgICBleGNlcHQgdGhhdCB0aGUgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIGdvZXMgYWZ0ZXIgdGhlIHNlY29uZAotICAgIGtleXdvcmQgcmF0aGVyIHRoYW4gdGhlIGZpcnN0LiAgQXMgd2l0aCBpZi9lbHNlLCB0aGVyZSBhcmUgdHdvCi0gICAgY2xhdXNlcywgZWFjaCBvZiB3aGljaCBtYXkgYmUgYSBzaW1wbGUgc3RhdGVtZW50IGVuZGluZyB3aXRoIGEKLSAgICBzZW1pY29sb24gb3IgYSBicmFjZS1lbmNsb3NlZCBjb21wb3VuZCBzdGF0ZW1lbnQuICBCdXQgd2hlcmVhcwotICAgIHRoZSBlbHNlIGNsYXVzZSBpcyBvcHRpb25hbCwgdGhlIENhdGNoIGNsYXVzZSBpcyByZXF1aXJlZC4gIFRoZQotICAgIGV4cHJlc3Npb24gbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlIChzb21ldGhpbmcgY2FwYWJsZSBvZiBiZWluZwotICAgIGFzc2lnbmVkIHRvKSBvZiB0aGUgc2FtZSB0eXBlIChkaXNyZWdhcmRpbmcgdHlwZSBxdWFsaWZpZXJzKSB0aGF0Ci0gICAgd2FzIHBhc3NlZCB0byBkZWZpbmVfZXhjZXB0aW9uX3R5cGUoKS4KLQotICAgIElmIGEgVGhyb3cgdGhhdCB1c2VzIHRoZSBzYW1lIGV4Y2VwdGlvbiBjb250ZXh0IGFzIHRoZSBUcnkvQ2F0Y2ggaXMKLSAgICBleGVjdXRlZCB3aXRoaW4gdGhlIFRyeSBjbGF1c2UgKHR5cGljYWxseSB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsZWQKLSAgICBieSB0aGUgVHJ5IGNsYXVzZSksIGFuZCB0aGUgZXhjZXB0aW9uIGlzIG5vdCBjYXVnaHQgYnkgYSBuZXN0ZWQKLSAgICBUcnkvQ2F0Y2ggc3RhdGVtZW50LCB0aGVuIGEgY29weSBvZiB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgYXNzaWduZWQKLSAgICB0byB0aGUgZXhwcmVzc2lvbiwgYW5kIGNvbnRyb2wgd2lsbCBqdW1wIHRvIHRoZSBDYXRjaCBjbGF1c2UuICBJZiBubwotICAgIHN1Y2ggVGhyb3cgaXMgZXhlY3V0ZWQsIHRoZW4gdGhlIGFzc2lnbm1lbnQgaXMgbm90IHBlcmZvcm1lZCwgYW5kCi0gICAgdGhlIENhdGNoIGNsYXVzZSBpcyBub3QgZXhlY3V0ZWQuCi0KLSAgICBUaGUgZXhwcmVzc2lvbiBpcyBub3QgZXZhbHVhdGVkIHVubGVzcyBhbmQgdW50aWwgdGhlIGV4Y2VwdGlvbiBpcwotICAgIGNhdWdodCwgd2hpY2ggaXMgc2lnbmlmaWNhbnQgaWYgaXQgaGFzIHNpZGUgZWZmZWN0cywgZm9yIGV4YW1wbGU6Ci0KLSAgICAgICAgVHJ5IGZvbygpOwotICAgICAgICBDYXRjaCAocFsrK2ldLmUpIHsgLi4uIH0KLQotICAgIElNUE9SVEFOVDogSnVtcGluZyBpbnRvIG9yIG91dCBvZiBhIFRyeSBjbGF1c2UgKGZvciBleGFtcGxlIHZpYQotICAgIHJldHVybiwgYnJlYWssIGNvbnRpbnVlLCBnb3RvLCBsb25nam1wKSBpcyBmb3JiaWRkZW4tLXRoZSBjb21waWxlcgotICAgIHdpbGwgbm90IGNvbXBsYWluLCBidXQgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbiBhdCBydW4tdGltZS4gIEp1bXBpbmcKLSAgICBpbnRvIG9yIG91dCBvZiBhIENhdGNoIGNsYXVzZSBpcyBva2F5LCBhbmQgc28gaXMganVtcGluZyBhcm91bmQKLSAgICBpbnNpZGUgYSBUcnkgY2xhdXNlLiAgSW4gbWFueSBjYXNlcyB3aGVyZSBvbmUgaXMgdGVtcHRlZCB0byByZXR1cm4KLSAgICBmcm9tIGEgVHJ5IGNsYXVzZSwgaXQgd2lsbCBzdWZmaWNlIHRvIHVzZSBUaHJvdywgYW5kIHRoZW4gcmV0dXJuCi0gICAgZnJvbSB0aGUgQ2F0Y2ggY2xhdXNlLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gc2V0IGEgZmxhZyB2YXJpYWJsZSBhbmQKLSAgICB1c2UgZ290byB0byBqdW1wIHRvIHRoZSBlbmQgb2YgdGhlIFRyeSBjbGF1c2UsIHRoZW4gY2hlY2sgdGhlIGZsYWcKLSAgICBhZnRlciB0aGUgVHJ5L0NhdGNoIHN0YXRlbWVudC4KLQotICAgIElNUE9SVEFOVDogVGhlIHZhbHVlcyBvZiBhbnkgbm9uLXZvbGF0aWxlIGF1dG9tYXRpYyB2YXJpYWJsZXMKLSAgICBjaGFuZ2VkIHdpdGhpbiB0aGUgVHJ5IGNsYXVzZSBhcmUgdW5kZWZpbmVkIGFmdGVyIGFuIGV4Y2VwdGlvbiBpcwotICAgIGNhdWdodC4gIFRoZXJlZm9yZSwgdmFyaWFibGVzIG1vZGlmaWVkIGluc2lkZSB0aGUgVHJ5IGJsb2NrIHdob3NlCi0gICAgdmFsdWVzIGFyZSBuZWVkZWQgbGF0ZXIgb3V0c2lkZSB0aGUgVHJ5IGJsb2NrIG11c3QgZWl0aGVyIHVzZSBzdGF0aWMKLSAgICBzdG9yYWdlIG9yIGJlIGRlY2xhcmVkIHdpdGggdGhlICJ2b2xhdGlsZSIgdHlwZSBxdWFsaWZpZXIuCi0KLQotVGhyb3cgZXhwcmVzc2lvbjsKLQotICAgIEEgVGhyb3cgc3RhdGVtZW50IGlzIHZlcnkgbXVjaCBsaWtlIGEgcmV0dXJuIHN0YXRlbWVudCwgZXhjZXB0IHRoYXQKLSAgICB0aGUgZXhwcmVzc2lvbiBpcyByZXF1aXJlZC4gIFdoZXJlYXMgcmV0dXJuIGp1bXBzIGJhY2sgdG8gdGhlIHBsYWNlCi0gICAgd2hlcmUgdGhlIGN1cnJlbnQgZnVuY3Rpb24gd2FzIGNhbGxlZCwgVGhyb3cganVtcHMgYmFjayB0byB0aGUgQ2F0Y2gKLSAgICBjbGF1c2Ugb2YgdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgVHJ5IGNsYXVzZS4gIFRoZSBleHByZXNzaW9uIG11c3QKLSAgICBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgcGFzc2VkIHRvIGRlZmluZV9leGNlcHRpb25fdHlwZSgpLiAgVGhlCi0gICAgZXhjZXB0aW9uIG11c3QgYmUgY2F1Z2h0LCBvdGhlcndpc2UgdGhlIHByb2dyYW0gbWF5IGNyYXNoLgotCi0gICAgU2xpZ2h0IGxpbWl0YXRpb246ICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIGNvbW1hLWV4cHJlc3Npb24sIGl0IG11c3QKLSAgICBiZSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcy4KLQotCi1Ucnkgc3RhdGVtZW50Ci1DYXRjaF9hbm9ueW1vdXMgc3RhdGVtZW50Ci0KLSAgICBXaGVuIHRoZSB2YWx1ZSBvZiB0aGUgZXhjZXB0aW9uIGlzIG5vdCBuZWVkZWQsIGEgVHJ5L0NhdGNoIHN0YXRlbWVudAotICAgIGNhbiB1c2UgQ2F0Y2hfYW5vbnltb3VzIGluc3RlYWQgb2YgQ2F0Y2ggKGV4cHJlc3Npb24pLgotCi0KLUV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyBwb2ludCBpcyBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIGNvbXBpbGVyLiAgVGhlCi1hcHBsaWNhdGlvbiBwcm9ncmFtbWVyIHNob3VsZCBwcmV0ZW5kIG5vdCB0byBrbm93IGFueSBvZiBpdCwgYmVjYXVzZSBpdAotaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0KLT09PSovCi0KLQotI2lmbmRlZiBDRVhDRVBUX0gKLSNkZWZpbmUgQ0VYQ0VQVF9ICi0KLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi0jZGVmaW5lIGRlZmluZV9leGNlcHRpb25fdHlwZShldHlwZSkgXAotc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IHsgXAotICBqbXBfYnVmICpwZW52OyBcCi0gIGludCBjYXVnaHQ7IFwKLSAgdm9sYXRpbGUgc3RydWN0IHsgZXR5cGUgZXRtcDsgfSB2OyBcCi19Ci0KLS8qIGV0bXAgbXVzdCBiZSB2b2xhdGlsZSBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiBtaWdodCB1c2UgYXV0b21hdGljICovCi0vKiBzdG9yYWdlIGZvciB0aGVfZXhjZXB0aW9uX2NvbnRleHQsIGFuZCBldG1wIGlzIG1vZGlmaWVkIGJldHdlZW4gICAqLwotLyogdGhlIGNhbGxzIHRvIHNldGptcCgpIGFuZCBsb25nam1wKCkuICBBIHdyYXBwZXIgc3RydWN0IGlzIHVzZWQgdG8gKi8KLS8qIGF2b2lkIHdhcm5pbmdzIGFib3V0IGEgZHVwbGljYXRlIHZvbGF0aWxlIHF1YWxpZmllciBpbiBjYXNlIGV0eXBlICovCi0vKiBhbHJlYWR5IGluY2x1ZGVzIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIGluaXRfZXhjZXB0aW9uX2NvbnRleHQoZWMpICgodm9pZCkoKGVjKS0+cGVudiA9IDApKQotCi0jZGVmaW5lIFRyeSBcCi0gIHsgXAotICAgIGptcF9idWYgKmV4Y2VwdGlvbl9fcHJldiwgZXhjZXB0aW9uX19lbnY7IFwKLSAgICBleGNlcHRpb25fX3ByZXYgPSB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPnBlbnY7IFwKLSAgICB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPnBlbnYgPSAmZXhjZXB0aW9uX19lbnY7IFwKLSAgICBpZiAoc2V0am1wKGV4Y2VwdGlvbl9fZW52KSA9PSAwKSB7IFwKLSAgICAgIGRvCi0KLSNkZWZpbmUgZXhjZXB0aW9uX19jYXRjaChhY3Rpb24pIFwKLSAgICAgIHdoaWxlICh0aGVfZXhjZXB0aW9uX2NvbnRleHQtPmNhdWdodCA9IDAsIFwKLSAgICAgICAgICAgICB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPmNhdWdodCk7IFwKLSAgICB9IFwKLSAgICBlbHNlIHsgXAotICAgICAgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5jYXVnaHQgPSAxOyBcCi0gICAgfSBcCi0gICAgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5wZW52ID0gZXhjZXB0aW9uX19wcmV2OyBcCi0gIH0gXAotICBpZiAoIXRoZV9leGNlcHRpb25fY29udGV4dC0+Y2F1Z2h0IHx8IGFjdGlvbikgeyB9IFwKLSAgZWxzZQotCi0jZGVmaW5lIENhdGNoKGUpIGV4Y2VwdGlvbl9fY2F0Y2goKChlKSA9IHRoZV9leGNlcHRpb25fY29udGV4dC0+di5ldG1wLCAwKSkKLSNkZWZpbmUgQ2F0Y2hfYW5vbnltb3VzIGV4Y2VwdGlvbl9fY2F0Y2goMCkKLQotLyogVHJ5IGVuZHMgd2l0aCBkbywgYW5kIENhdGNoIGJlZ2lucyB3aXRoIHdoaWxlKDApIGFuZCBlbmRzIHdpdGggICAgICovCi0vKiBlbHNlLCB0byBlbnN1cmUgdGhhdCBUcnkvQ2F0Y2ggc3ludGF4IGlzIHNpbWlsYXIgdG8gaWYvZWxzZSAgICAgICAgKi8KLS8qIHN5bnRheC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgMCBpbiB3aGlsZSgwKSBpcyBleHByZXNzZWQgYXMgeD0wLHggaW4gb3JkZXIgdG8gYXBwZWFzZSAgICAgICAgKi8KLS8qIGNvbXBpbGVycyB0aGF0IHdhcm4gYWJvdXQgY29uc3RhbnQgZXhwcmVzc2lvbnMgaW5zaWRlIHdoaWxlKCkuICAgICAqLwotLyogTW9zdCBjb21waWxlcnMgc2hvdWxkIHN0aWxsIHJlY29nbml6ZSB0aGF0IHRoZSBjb25kaXRpb24gaXMgYWx3YXlzICovCi0vKiBmYWxzZSBhbmQgYXZvaWQgZ2VuZXJhdGluZyBjb2RlIGZvciBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBUaHJvdyBcCi0gIGZvciAoOzsgbG9uZ2ptcCgqdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5wZW52LCAxKSkgXAotICAgIHRoZV9leGNlcHRpb25fY29udGV4dC0+di5ldG1wID0KLQotCi0jZW5kaWYgLyogQ0VYQ0VQVF9IICovCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9jb250cmliL3Zpc3VwbmcvcmVzb3VyY2UuaCBiL2xpYnMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9yZXNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTFkZDAzLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2NvbnRyaWIvdmlzdXBuZy9yZXNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy97e05PX0RFUEVOREVOQ0lFU319Ci0vLyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlLgotLy8gVXNlZCBieSBWaXN1YWxQbmcucmMKLS8vCi0jZGVmaW5lIElETV9GSUxFX09QRU4gICAgICAgICAgICAgICAgICAgNDAwMDEKLSNkZWZpbmUgSURNX0ZJTEVfU0FWRSAgICAgICAgICAgICAgICAgICA0MDAwMgotI2RlZmluZSBJRE1fRklMRV9ORVhUICAgICAgICAgICAgICAgICAgIDQwMDAzCi0jZGVmaW5lIElETV9GSUxFX1BSRVZJT1VTICAgICAgICAgICAgICAgNDAwMDQKLSNkZWZpbmUgSURNX0ZJTEVfRVhJVCAgICAgICAgICAgICAgICAgICA0MDAwNQotI2RlZmluZSBJRE1fT1BUSU9OU19CQUNLR1JPVU5EICAgICAgICAgIDQwMDA2Ci0jZGVmaW5lIElETV9PUFRJT05TX1NUUkVUQ0ggICAgICAgICAgICAgNDAwMDcKLSNkZWZpbmUgSURNX0hFTFBfQUJPVVQgICAgICAgICAgICAgICAgICA0MDAwOAotCi0vLyBOZXh0IGRlZmF1bHQgdmFsdWVzIGZvciBuZXcgb2JqZWN0cwotLy8gCi0jaWZkZWYgQVBTVFVESU9fSU5WT0tFRAotI2lmbmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCi0jZGVmaW5lIF9BUFNfTkVYVF9SRVNPVVJDRV9WQUxVRSAgICAgICAgMTEzCi0jZGVmaW5lIF9BUFNfTkVYVF9DT01NQU5EX1ZBTFVFICAgICAgICAgNDAwMDkKLSNkZWZpbmUgX0FQU19ORVhUX0NPTlRST0xfVkFMVUUgICAgICAgICAxMDAxCi0jZGVmaW5lIF9BUFNfTkVYVF9TWU1FRF9WQUxVRSAgICAgICAgICAgMTAxCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvZGVwY29tcCBiL2xpYnMvbGlicG5nL2RlcGNvbXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1Zjk3MzYuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvZGVwY29tcAorKysgL2Rldi9udWxsCkBAIC0xLDU4OSArMCwwIEBACi0jISAvYmluL3NoCi0jIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKLQotc2NyaXB0dmVyc2lvbj0yMDA3LTAzLTI5LjAxCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0jIDAyMTEwLTEzMDEsIFVTQS4KLQotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IEFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+LgotCi1jYXNlICQxIGluCi0gICcnKQotICAgICBlY2hvICIkMDogTm8gY29tbWFuZC4gIFRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gICAgIGV4aXQgMTsKLSAgICAgOzsKLSAgLWggfCAtLWgqKQotICAgIGNhdCA8PFxFT0YKLVVzYWdlOiBkZXBjb21wIFstLWhlbHBdIFstLXZlcnNpb25dIFBST0dSQU0gW0FSR1NdCi0KLVJ1biBQUk9HUkFNUyBBUkdTIHRvIGNvbXBpbGUgYSBmaWxlLCBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcwotYXMgc2lkZS1lZmZlY3RzLgotCi1FbnZpcm9ubWVudCB2YXJpYWJsZXM6Ci0gIGRlcG1vZGUgICAgIERlcGVuZGVuY3kgdHJhY2tpbmcgbW9kZS4KLSAgc291cmNlICAgICAgU291cmNlIGZpbGUgcmVhZCBieSBgUFJPR1JBTVMgQVJHUycuCi0gIG9iamVjdCAgICAgIE9iamVjdCBmaWxlIG91dHB1dCBieSBgUFJPR1JBTVMgQVJHUycuCi0gIERFUERJUiAgICAgIGRpcmVjdG9yeSB3aGVyZSB0byBzdG9yZSBkZXBlbmRlbmNpZXMuCi0gIGRlcGZpbGUgICAgIERlcGVuZGVuY3kgZmlsZSB0byBvdXRwdXQuCi0gIHRtcGRlcGZpbGUgIFRlbXBvcmFyeSBmaWxlIHRvIHVzZSB3aGVuIG91dHB1dGluZyBkZXBlbmRlbmNpZXMuCi0gIGxpYnRvb2wgICAgIFdoZXRoZXIgbGlidG9vbCBpcyB1c2VkICh5ZXMvbm8pLgotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgotRU9GCi0gICAgZXhpdCAkPwotICAgIDs7Ci0gIC12IHwgLS12KikKLSAgICBlY2hvICJkZXBjb21wICRzY3JpcHR2ZXJzaW9uIgotICAgIGV4aXQgJD8KLSAgICA7OwotZXNhYwotCi1pZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KLSAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCi1kZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAotICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KLXRtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9Ci0KLXJtIC1mICIkdG1wZGVwZmlsZSIKLQotIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCi0jIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAotIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQotIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KLWlmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCi0gICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgotICBnY2NmbGFnPS1NCi0gIGRlcG1vZGU9Z2NjCi1maQotCi1pZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KLSAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KLSAgIGRhc2htZmxhZz0teE0KLSAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKLWZpCi0KLWNhc2UgIiRkZXBtb2RlIiBpbgotZ2NjMykKLSMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0Ci0jIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQotIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgotIyMgVW5mb3J0dW5hdGVseSwgRnJlZUJTRCBjODkgYWNjZXB0YW5jZSBvZiBmbGFncyBkZXBlbmRzIHVwb24KLSMjIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgb3JkZXI7IHNvIGFkZCB0aGUgZmxhZ3Mgd2hlcmUgdGhleQotIyMgYXBwZWFyIGluIGRlcGVuZDIuYW0uICBOb3RlIHRoYXQgdGhlIHNsb3dkb3duIGluY3VycmVkIGhlcmUKLSMjIGFmZmVjdHMgb25seSBjb25maWd1cmU6IGluIG1ha2VmaWxlcywgJUZBU1RERVAlIHNob3J0Y3V0cyB0aGlzLgotICBmb3IgYXJnCi0gIGRvCi0gICAgY2FzZSAkYXJnIGluCi0gICAgLWMpIHNldCBmbm9yZCAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIiAiJGFyZyIgOzsKLSAgICAqKSAgc2V0IGZub3JkICIkQCIgIiRhcmciIDs7Ci0gICAgZXNhYwotICAgIHNoaWZ0ICMgZm5vcmQKLSAgICBzaGlmdCAjICRhcmcKLSAgZG9uZQotICAiJEAiCi0gIHN0YXQ9JD8KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICAgZXhpdCAkc3RhdAotICBmaQotICBtdiAiJHRtcGRlcGZpbGUiICIkZGVwZmlsZSIKLSAgOzsKLQotZ2NjKQotIyMgVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBnZXQgZGVwZW5kZW5jeSBvdXRwdXQgZnJvbSBnY2MuICBIZXJlJ3MKLSMjIHdoeSB3ZSBwaWNrIHRoaXMgcmF0aGVyIG9ic2N1cmUgbWV0aG9kOgotIyMgLSBEb24ndCB3YW50IHRvIHVzZSAtTUQgYmVjYXVzZSB3ZSdkIGxpa2UgdGhlIGRlcGVuZGVuY2llcyB0byBlbmQKLSMjICAgdXAgaW4gYSBzdWJkaXIuICBIYXZpbmcgdG8gcmVuYW1lIGJ5IGhhbmQgaXMgdWdseS4KLSMjICAgKFdlIG1pZ2h0IGVuZCB1cCBkb2luZyB0aGlzIGFueXdheSB0byBzdXBwb3J0IG90aGVyIGNvbXBpbGVycy4pCi0jIyAtIFRoZSBERVBFTkRFTkNJRVNfT1VUUFVUIGVudmlyb25tZW50IHZhcmlhYmxlIG1ha2VzIGdjYyBhY3QgbGlrZQotIyMgICAtTU0sIG5vdCAtTSAoZGVzcGl0ZSB3aGF0IHRoZSBkb2NzIHNheSkuCi0jIyAtIFVzaW5nIC1NIGRpcmVjdGx5IG1lYW5zIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIHR3aWNlIChldmVuIHdvcnNlCi0jIyAgIHRoYW4gcmVuYW1pbmcpLgotICBpZiB0ZXN0IC16ICIkZ2NjZmxhZyI7IHRoZW4KLSAgICBnY2NmbGFnPS1NRCwKLSAgZmkKLSAgIiRAIiAtV3AsIiRnY2NmbGFnJHRtcGRlcGZpbGUiCi0gIHN0YXQ9JD8KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICAgZXhpdCAkc3RhdAotICBmaQotICBybSAtZiAiJGRlcGZpbGUiCi0gIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCi0gIGFscGhhPUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKLSMjIFRoZSBzZWNvbmQgLWUgZXhwcmVzc2lvbiBoYW5kbGVzIERPUy1zdHlsZSBmaWxlIG5hbWVzIHdpdGggZHJpdmUgbGV0dGVycy4KLSAgc2VkIC1lICdzL15bXjpdKjogLyAvJyBcCi0gICAgICAtZSAncy9eWyckYWxwaGEnXTpcL1teOl0qOiAvIC8nIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0jIyBUaGlzIG5leHQgcGllY2Ugb2YgbWFnaWMgYXZvaWRzIHRoZSBgZGVsZXRlZCBoZWFkZXIgZmlsZScgcHJvYmxlbS4KLSMjIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2hlbiBhIGhlYWRlciBmaWxlIHdoaWNoIGFwcGVhcnMgaW4gYSAuUCBmaWxlCi0jIyBpcyBkZWxldGVkLCB0aGUgZGVwZW5kZW5jeSBjYXVzZXMgbWFrZSB0byBkaWUgKGJlY2F1c2UgdGhlcmUgaXMKLSMjIHR5cGljYWxseSBubyB3YXkgdG8gcmVidWlsZCB0aGUgaGVhZGVyKS4gIFdlIGF2b2lkIHRoaXMgYnkgYWRkaW5nCi0jIyBkdW1teSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggaGVhZGVyIGZpbGUuICBUb28gYmFkIGdjYyBkb2Vzbid0IGRvCi0jIyB0aGlzIGZvciB1cyBkaXJlY3RseS4KLSAgdHIgJyAnICcKLScgPCAiJHRtcGRlcGZpbGUiIHwKLSMjIFNvbWUgdmVyc2lvbnMgb2YgZ2NjIHB1dCBhIHNwYWNlIGJlZm9yZSB0aGUgYDonLiAgT24gdGhlIHRoZW9yeQotIyMgdGhhdCB0aGUgc3BhY2UgbWVhbnMgc29tZXRoaW5nLCB3ZSBhZGQgYSBzcGFjZSB0byB0aGUgb3V0cHV0IGFzCi0jIyB3ZWxsLgotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotaHApCi0gICMgVGhpcyBjYXNlIGV4aXN0cyBvbmx5IHRvIGxldCBkZXBlbmQubTQgZG8gaXRzIHdvcmsuICBJdCB3b3JrcyBieQotICAjIGxvb2tpbmcgYXQgdGhlIHRleHQgb2YgdGhpcyBzY3JpcHQuICBUaGlzIGNhc2Ugd2lsbCBuZXZlciBiZSBydW4sCi0gICMgc2luY2UgaXQgaXMgY2hlY2tlZCBmb3IgYWJvdmUuCi0gIGV4aXQgMQotICA7OwotCi1zZ2kpCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgICIkQCIgIi1XcCwtTUR1cGRhdGUsJHRtcGRlcGZpbGUiCi0gIGVsc2UKLSAgICAiJEAiIC1NRHVwZGF0ZSAiJHRtcGRlcGZpbGUiCi0gIGZpCi0gIHN0YXQ9JD8KLSAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gICAgZXhpdCAkc3RhdAotICBmaQotICBybSAtZiAiJGRlcGZpbGUiCi0KLSAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuICAjIHllcywgdGhlIHNvdXJjZWZpbGUgZGVwZW5kIG9uIG90aGVyIGZpbGVzCi0gICAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLQotICAgICMgQ2xpcCBvZmYgdGhlIGluaXRpYWwgZWxlbWVudCAodGhlIGRlcGVuZGVudCkuICBEb24ndCB0cnkgdG8gYmUKLSAgICAjIGNsZXZlciBhbmQgcmVwbGFjZSB0aGlzIHdpdGggc2VkIGNvZGUsIGFzIElSSVggc2VkIHdvbid0IGhhbmRsZQotICAgICMgbGluZXMgd2l0aCBtb3JlIHRoYW4gYSBmaXhlZCBudW1iZXIgb2YgY2hhcmFjdGVycyAoNDA5NiBpbgotICAgICMgSVJJWCA2LjIgc2VkLCA4MTkyIGluIElSSVggNi41KS4gIFdlIGFsc28gcmVtb3ZlIGNvbW1lbnQgbGluZXM7Ci0gICAgIyB0aGUgSVJJWCBjYyBhZGRzIGNvbW1lbnRzIGxpa2UgYCM6ZmVjJyB0byB0aGUgZW5kIG9mIHRoZQotICAgICMgZGVwZW5kZW5jeSBsaW5lLgotICAgIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiBcCi0gICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIHwgXAotICAgIHRyICcKLScgJyAnID4+ICRkZXBmaWxlCi0gICAgZWNobyA+PiAkZGVwZmlsZQotCi0gICAgIyBUaGUgc2Vjb25kIHBhc3MgZ2VuZXJhdGVzIGEgZHVtbXkgZW50cnkgZm9yIGVhY2ggaGVhZGVyIGZpbGUuCi0gICAgdHIgJyAnICcKLScgPCAiJHRtcGRlcGZpbGUiIFwKLSAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyAtZSAncy8kLzovJyBcCi0gICA+PiAkZGVwZmlsZQotICBlbHNlCi0gICAgIyBUaGUgc291cmNlZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBkZXBlbmRlbmNpZXMsIHNvIGp1c3QKLSAgICAjIHN0b3JlIGEgZHVtbXkgY29tbWVudCBsaW5lLCB0byBhdm9pZCBlcnJvcnMgd2l0aCB0aGUgTWFrZWZpbGUKLSAgICAjICJpbmNsdWRlIGJhc2VuYW1lLlBsbyIgc2NoZW1lLgotICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCi0gIGZpCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotYWl4KQotICAjIFRoZSBDIGZvciBBSVggQ29tcGlsZXIgdXNlcyAtTSBhbmQgb3V0cHV0cyB0aGUgZGVwZW5kZW5jaWVzCi0gICMgaW4gYSAudSBmaWxlLiAgSW4gb2xkZXIgdmVyc2lvbnMsIHRoaXMgZmlsZSBhbHdheXMgbGl2ZXMgaW4gdGhlCi0gICMgY3VycmVudCBkaXJlY3RvcnkuICBBbHNvLCB0aGUgQUlYIGNvbXBpbGVyIHB1dHMgYCRvYmplY3Q6JyBhdCB0aGUKLSAgIyBzdGFydCBvZiBlYWNoIGxpbmU7ICRvYmplY3QgZG9lc24ndCBoYXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KLSAgIyBWZXJzaW9uIDYgdXNlcyB0aGUgZGlyZWN0b3J5IGluIGJvdGggY2FzZXMuCi0gIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCi0gIHRlc3QgIngkZGlyIiA9ICJ4JG9iamVjdCIgJiYgZGlyPQotICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS51Ci0gICAgdG1wZGVwZmlsZTI9JGJhc2UudQotICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS51Ci0gICAgIiRAIiAtV2MsLU0KLSAgZWxzZQotICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS51Ci0gICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLnUKLSAgICB0bXBkZXBmaWxlMz0kZGlyJGJhc2UudQotICAgICIkQCIgLU0KLSAgZmkKLSAgc3RhdD0kPwotCi0gIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgotICBlbHNlCi0gICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0KLSAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIKLSAgZG8KLSAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKLSAgZG9uZQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KLSAgICAjIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybSBgZm9vLm86IGRlcGVuZGVudC5oJy4KLSAgICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bwotICAgICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KLSAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KLSAgICBzZWQgLWUgJ3MsXi4qXC5bYS16XSo6WwkgXSosLCcgLWUgJ3MsJCw6LCcgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0Ci0gICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCi0gICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KLSAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICBmaQotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWljYykKLSAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCi0gICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYwotICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKLSAgIyAgICBmb28ubzogc3ViL2Zvby5jCi0gICMgICAgZm9vLm86IHN1Yi9mb28uaAotICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKLSAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYwotICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCi0gICMgICAgc3ViL2Zvby5jOgotICAjICAgIHN1Yi9mb28uaDoKLSAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKLSAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6Ci0gICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAotICAjICAgICBzdWIvZm9vLmggLi4uIFwKLSAgIyAgICAgLi4uCi0KLSAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgICBleGl0ICRzdGF0Ci0gIGZpCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCi0gICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCi0gICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCi0gICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KLSAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0gICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KLSAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8Ci0gICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgOzsKLQotaHAyKQotICAjIFRoZSAiaHAiIHN0YW56YSBhYm92ZSBkb2VzIG5vdCB3b3JrIHdpdGggYUNDIChDKyspIGFuZCBIUCdzIGlhNjQKLSAgIyBjb21waWxlcnMsIHdoaWNoIGhhdmUgaW50ZWdyYXRlZCBwcmVwcm9jZXNzb3JzLiAgVGhlIGNvcnJlY3Qgb3B0aW9uCi0gICMgdG8gdXNlIHdpdGggdGhlc2UgaXMgK01ha2VkOyBpdCB3cml0ZXMgZGVwZW5kZW5jaWVzIHRvIGEgZmlsZSBuYW1lZAotICAjICdmb28uZCcsIHdoaWNoIGxhbmRzIG5leHQgdG8gdGhlIG9iamVjdCBmaWxlLCB3aGVyZXZlciB0aGF0Ci0gICMgaGFwcGVucyB0byBiZS4KLSAgIyBNdWNoIG9mIHRoaXMgaXMgc2ltaWxhciB0byB0aGUgdHJ1NjQgY2FzZTsgc2VlIGNvbW1lbnRzIHRoZXJlLgotICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAotICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAotICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KLSAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UuZAotICAgIHRtcGRlcGZpbGUyPSRkaXIubGlicy8kYmFzZS5kCi0gICAgIiRAIiAtV2MsK01ha2VkCi0gIGVsc2UKLSAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UuZAotICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5kCi0gICAgIiRAIiArTWFrZWQKLSAgZmkKLSAgc3RhdD0kPwotICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKLSAgZWxzZQotICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIgotICAgICBleGl0ICRzdGF0Ci0gIGZpCi0KLSAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKLSAgZG8KLSAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKLSAgZG9uZQotICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KLSAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKLSAgICAjIEFkZCBgZGVwZW5kZW50Lmg6JyBsaW5lcy4KLSAgICBzZWQgLW5lICcyLCR7OyBzL14gKi8vOyBzLyBcXCokLy87IHMvJC86LzsgcDt9JyAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgZWxzZQotICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCi0gIGZpCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlMiIKLSAgOzsKLQotdHJ1NjQpCi0gICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCi0gICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCi0gICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0Ci0gICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KLSAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KLSAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCi0gICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KLSAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKLQotICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgICAjIFdpdGggVHJ1NjQgY2MsIHNoYXJlZCBvYmplY3RzIGNhbiBhbHNvIGJlIHVzZWQgdG8gbWFrZSBhCi0gICAgICAjIHN0YXRpYyBsaWJyYXJ5LiAgVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBpbiBsaWJ0b29sIDEuNCBzZXJpZXMgdG8KLSAgICAgICMgaGFuZGxlIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzIGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uLgotICAgICAgIyBXaXRoIGxpYnRvb2wgMS40LCBkZXBlbmRlbmNpZXMgd2VyZSBvdXRwdXQgaW4gJGRpci5saWJzLyRiYXNlLmxvLmQuCi0gICAgICAjCi0gICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhpcyBleGNlcHRpb24gd2FzIHJlbW92ZWQsIGFuZCBsaWJ0b29sIG5vdwotICAgICAgIyBnZW5lcmF0ZXMgMiBzZXBhcmF0ZSBvYmplY3RzIGZvciB0aGUgMiBsaWJyYXJpZXMuICBUaGVzZSB0d28KLSAgICAgICMgY29tcGlsYXRpb25zIG91dHB1dCBkZXBlbmRlbmNpZXMgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQKLSAgICAgICMgaW4gJGRpciRiYXNlLm8uZC4gIFdlIGhhdmUgdG8gY2hlY2sgZm9yIGJvdGggZmlsZXMsIGJlY2F1c2UKLSAgICAgICMgb25lIG9mIHRoZSB0d28gY29tcGlsYXRpb25zIGNhbiBiZSBkaXNhYmxlZC4gIFdlIHNob3VsZCBwcmVmZXIKLSAgICAgICMgJGRpciRiYXNlLm8uZCBvdmVyICRkaXIubGlicy8kYmFzZS5vLmQgYmVjYXVzZSB0aGUgbGF0dGVyIGlzCi0gICAgICAjIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB3aGVuIC5saWJzLyBpcyBkZWxldGVkLCB3aGlsZSBpZ25vcmluZwotICAgICAgIyB0aGUgZm9ybWVyIHdvdWxkIGNhdXNlIGEgZGlzdGNsZWFuY2hlY2sgcGFuaWMuCi0gICAgICB0bXBkZXBmaWxlMT0kZGlyLmxpYnMvJGJhc2UubG8uZCAgICMgbGlidG9vbCAxLjQKLSAgICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5vLmQgICAgICAgICAgIyBsaWJ0b29sIDEuNQotICAgICAgdG1wZGVwZmlsZTM9JGRpci5saWJzLyRiYXNlLm8uZCAgICAjIGxpYnRvb2wgMS41Ci0gICAgICB0bXBkZXBmaWxlND0kZGlyLmxpYnMvJGJhc2UuZCAgICAgICMgQ29tcGFxIENDQyBWNi4yLTUwNAotICAgICAgIiRAIiAtV2MsLU1ECi0gICBlbHNlCi0gICAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2Uuby5kCi0gICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAotICAgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLmQKLSAgICAgIHRtcGRlcGZpbGU0PSRkaXIkYmFzZS5kCi0gICAgICAiJEAiIC1NRAotICAgZmkKLQotICAgc3RhdD0kPwotICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6Ci0gICBlbHNlCi0gICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIiAiJHRtcGRlcGZpbGU0IgotICAgICAgZXhpdCAkc3RhdAotICAgZmkKLQotICAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKLSAgIGRvCi0gICAgIHRlc3QgLWYgIiR0bXBkZXBmaWxlIiAmJiBicmVhawotICAgZG9uZQotICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCi0gICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgotICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgotICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCi0gICBlbHNlCi0gICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgotICAgZmkKLSAgIHJtIC1mICIkdG1wZGVwZmlsZSIKLSAgIDs7Ci0KLSNub3NpZGVlZmZlY3QpCi0gICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAotICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgotCi1kYXNobXN0ZG91dCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCi0gICIkQCIgfHwgZXhpdCAkPwotCi0gICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0KLSAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgotICBJRlM9IiAiCi0gIGZvciBhcmcKLSAgZG8KLSAgICBjYXNlICRhcmcgaW4KLSAgICAtbykKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICRvYmplY3QpCi0gICAgICBzaGlmdAotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgICBzaGlmdCAjICRhcmcKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCi0gICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKLSAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgotICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgotICAiJEAiICRkYXNobWZsYWcgfAotICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHRyICcgJyAnCi0nIDwgIiR0bXBkZXBmaWxlIiB8IFwKLSMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCi0jIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgotICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLWRhc2hYbXN0ZG91dCkKLSAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQotICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KLSAgZXhpdCAxCi0gIDs7Ci0KLW1ha2VkZXBlbmQpCi0gICIkQCIgfHwgZXhpdCAkPwotICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCi0gIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgotICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotICAgIHNoaWZ0Ci0gIGZpCi0gICMgWCBtYWtlZGVwZW5kCi0gIHNoaWZ0Ci0gIGNsZWFyZWQ9bm8KLSAgZm9yIGFyZyBpbiAiJEAiOyBkbwotICAgIGNhc2UgJGNsZWFyZWQgaW4KLSAgICBubykKLSAgICAgIHNldCAiIjsgc2hpZnQKLSAgICAgIGNsZWFyZWQ9eWVzIDs7Ci0gICAgZXNhYwotICAgIGNhc2UgIiRhcmciIGluCi0gICAgLUQqfC1JKikKLSAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKLSAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQotICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KLSAgICAtKnwkb2JqZWN0KQotICAgICAgOzsKLSAgICAqKQotICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OwotICAgIGVzYWMKLSAgZG9uZQotICBvYmpfc3VmZml4PSJgZWNobyAkb2JqZWN0IHwgc2VkICdzL14uKlwuLy4vJ2AiCi0gIHRvdWNoICIkdG1wZGVwZmlsZSIKLSAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgotICBybSAtZiAiJGRlcGZpbGUiCi0gIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCi0gIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCi0nIHwgXAotIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KLSMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCi0gICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCi0gIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKLSAgOzsKLQotY3BwKQotICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKLSAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0KLSAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KLSAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCi0gICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbwotICAgICAgc2hpZnQKLSAgICBkb25lCi0gICAgc2hpZnQKLSAgZmkKLQotICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCi0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgJGFyZyBpbgotICAgIC1vKQotICAgICAgc2hpZnQKLSAgICAgIDs7Ci0gICAgJG9iamVjdCkKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgICopCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKLSAgICAgIHNoaWZ0ICMgZm5vcmQKLSAgICAgIHNoaWZ0ICMgJGFyZwotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotICAiJEAiIC1FIHwKLSAgICBzZWQgLW4gLWUgJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgXAotICAgICAgIC1lICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLiovIHM6OiBcMSBcXDpwJyB8Ci0gICAgc2VkICckIHM6IFxcJDo6JyA+ICIkdG1wZGVwZmlsZSIKLSAgcm0gLWYgIiRkZXBmaWxlIgotICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgotICBjYXQgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKLSAgc2VkIDwgIiR0bXBkZXBmaWxlIiAnL14kL2Q7cy9eIC8vO3MvIFxcJC8vO3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKLSAgcm0gLWYgIiR0bXBkZXBmaWxlIgotICA7OwotCi1tc3Zpc3VhbGNwcCkKLSAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCi0gICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8sCi0gICMgYmVjYXVzZSB3ZSBtdXN0IHVzZSAtbyB3aGVuIHJ1bm5pbmcgbGlidG9vbC4KLSAgIiRAIiB8fCBleGl0ICQ/Ci0gIElGUz0iICIKLSAgZm9yIGFyZwotICBkbwotICAgIGNhc2UgIiRhcmciIGluCi0gICAgIi1HbSJ8Ii9HbSJ8Ii1HaSJ8Ii9HaSJ8Ii1aSSJ8Ii9aSSIpCi0Jc2V0IGZub3JkICIkQCIKLQlzaGlmdAotCXNoaWZ0Ci0JOzsKLSAgICAqKQotCXNldCBmbm9yZCAiJEAiICIkYXJnIgotCXNoaWZ0Ci0Jc2hpZnQKLQk7OwotICAgIGVzYWMKLSAgZG9uZQotICAiJEAiIC1FIHwKLSAgc2VkIC1uICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLyBzOjplY2hvICJgY3lncGF0aCAtdSBcXCJcMVxcImAiOnAnIHwgc29ydCB8IHVuaXEgPiAiJHRtcGRlcGZpbGUiCi0gIHJtIC1mICIkZGVwZmlsZSIKLSAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKLSAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OglcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCi0gIGVjaG8gIgkiID4+ICIkZGVwZmlsZSIKLSAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OlwxXDo6cCcgPj4gIiRkZXBmaWxlIgotICBybSAtZiAiJHRtcGRlcGZpbGUiCi0gIDs7Ci0KLW5vbmUpCi0gIGV4ZWMgIiRAIgotICA7OwotCi0qKQotICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKLSAgZXhpdCAxCi0gIDs7Ci1lc2FjCi0KLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTogc2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOiAyCi0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC1lbmQ6ICIkIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9leGFtcGxlLmMgYi9saWJzL2xpYnBuZy9leGFtcGxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZjM4ZGUuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvZXhhbXBsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODM1ICswLDAgQEAKLQotI2lmIDAgLyogaW4gY2FzZSBzb21lb25lIGFjdHVhbGx5IHRyaWVzIHRvIGNvbXBpbGUgdGhpcyAqLwotCi0vKiBleGFtcGxlLmMgLSBhbiBleGFtcGxlIG9mIHVzaW5nIGxpYnBuZwotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuMzcgW0p1bmUgNCwgMjAwOV0KLSAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgdGhlIGF1dGhvcnMuCi0gKiBNYWludGFpbmVkIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIE1haW50YWluZWQgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIFdyaXR0ZW4gMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCi0gKi8KLQotLyogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgbGlicG5nIHRvIHJlYWQgYW5kIHdyaXRlIFBORyBmaWxlcy4KLSAqIFRoZSBmaWxlIGxpYnBuZy50eHQgaXMgbXVjaCBtb3JlIHZlcmJvc2UgdGhlbiB0aGlzLiAgSWYgeW91IGhhdmUgbm90Ci0gKiByZWFkIGl0LCBkbyBzbyBmaXJzdC4gIFRoaXMgd2FzIGRlc2lnbmVkIHRvIGJlIGEgc3RhcnRpbmcgcG9pbnQgb2YgYW4KLSAqIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcyBub3Qgb2ZmaWNpYWxseSBwYXJ0IG9mIGxpYnBuZywgaXMgaGVyZWJ5IHBsYWNlZAotICogaW4gdGhlIHB1YmxpYyBkb21haW4sIGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgcmVxdWlyZSBhIGNvcHlyaWdodCBub3RpY2UuCi0gKgotICogVGhpcyBmaWxlIGRvZXMgbm90IGN1cnJlbnRseSBjb21waWxlLCBiZWNhdXNlIGl0IGlzIG1pc3NpbmcgY2VydGFpbgotICogcGFydHMsIGxpa2UgYWxsb2NhdGluZyBtZW1vcnkgdG8gaG9sZCBhbiBpbWFnZS4gIFlvdSB3aWxsIGhhdmUgdG8KLSAqIHN1cHBseSB0aGVzZSBwYXJ0cyB0byBnZXQgaXQgdG8gY29tcGlsZS4gIEZvciBhbiBleGFtcGxlIG9mIGEgbWluaW1hbAotICogd29ya2luZyBQTkcgcmVhZGVyL3dyaXRlciwgc2VlIHBuZ3Rlc3QuYywgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb247Ci0gKiBzZWUgYWxzbyB0aGUgcHJvZ3JhbXMgaW4gdGhlIGNvbnRyaWIgZGlyZWN0b3J5LgotICovCi0KLSNpbmNsdWRlICJwbmcuaCIKLQotIC8qIFRoZSBwbmdfam1wYnVmKCkgbWFjcm8sIHVzZWQgaW4gZXJyb3IgaGFuZGxpbmcsIGJlY2FtZSBhdmFpbGFibGUgaW4KLSAgKiBsaWJwbmcgdmVyc2lvbiAxLjAuNi4gIElmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcnVuIHlvdXIgY29kZSB3aXRoIG9sZGVyCi0gICogdmVyc2lvbnMgb2YgbGlicG5nLCB5b3UgbXVzdCBkZWZpbmUgdGhlIG1hY3JvIHlvdXJzZWxmIChidXQgb25seSBpZiBpdAotICAqIGlzIG5vdCBhbHJlYWR5IGRlZmluZWQgYnkgbGlicG5nISkuCi0gICovCi0KLSNpZm5kZWYgcG5nX2ptcGJ1ZgotIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgKChwbmdfcHRyKS0+am1wYnVmKQotI2VuZGlmCi0KLS8qIENoZWNrIHRvIHNlZSBpZiBhIGZpbGUgaXMgYSBQTkcgZmlsZSB1c2luZyBwbmdfc2lnX2NtcCgpLiAgcG5nX3NpZ19jbXAoKQotICogcmV0dXJucyB6ZXJvIGlmIHRoZSBpbWFnZSBpcyBhIFBORyBhbmQgbm9uemVybyBpZiBpdCBpc24ndCBhIFBORy4KLSAqCi0gKiBUaGUgZnVuY3Rpb24gY2hlY2tfaWZfcG5nKCkgc2hvd24gaGVyZSwgYnV0IG5vdCB1c2VkLCByZXR1cm5zIG5vbnplcm8gKHRydWUpCi0gKiBpZiB0aGUgZmlsZSBjYW4gYmUgb3BlbmVkIGFuZCBpcyBhIFBORywgMCAoZmFsc2UpIG90aGVyd2lzZS4KLSAqCi0gKiBJZiB0aGlzIGNhbGwgaXMgc3VjY2Vzc2Z1bCwgYW5kIHlvdSBhcmUgZ29pbmcgdG8ga2VlcCB0aGUgZmlsZSBvcGVuLAotICogeW91IHNob3VsZCBjYWxsIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIFBOR19CWVRFU19UT19DSEVDSyk7IG9uY2UKLSAqIHlvdSBoYXZlIGNyZWF0ZWQgdGhlIHBuZ19wdHIsIHNvIHRoYXQgbGlicG5nIGtub3dzIHlvdXIgYXBwbGljYXRpb24KLSAqIGhhcyByZWFkIHRoYXQgbWFueSBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIE1ha2Ugc3VyZSB5b3UKLSAqIGRvbid0IGNhbGwgcG5nX3NldF9zaWdfYnl0ZXMoKSB3aXRoIG1vcmUgdGhhbiA4IGJ5dGVzIHJlYWQgb3IgZ2l2ZSBpdAotICogYW4gaW5jb3JyZWN0IG51bWJlciBvZiBieXRlcyByZWFkLCBvciB5b3Ugd2lsbCBlaXRoZXIgaGF2ZSByZWFkIHRvbwotICogbWFueSBieXRlcyAoeW91ciBmYXVsdCksIG9yIHlvdSBhcmUgdGVsbGluZyBsaWJwbmcgdG8gcmVhZCB0aGUgd3JvbmcKLSAqIG51bWJlciBvZiBtYWdpYyBieXRlcyAoYWxzbyB5b3VyIGZhdWx0KS4KLSAqCi0gKiBNYW55IGFwcGxpY2F0aW9ucyBhbHJlYWR5IHJlYWQgdGhlIGZpcnN0IDIgb3IgNCBieXRlcyBmcm9tIHRoZSBzdGFydAotICogb2YgdGhlIGltYWdlIHRvIGRldGVybWluZSB0aGUgZmlsZSB0eXBlLCBzbyBpdCB3b3VsZCBiZSBlYXNpZXN0IGp1c3QKLSAqIHRvIHBhc3MgdGhlIGJ5dGVzIHRvIHBuZ19zaWdfY21wKCkgb3IgZXZlbiBza2lwIHRoYXQgaWYgeW91IGtub3cKLSAqIHlvdSBoYXZlIGEgUE5HIGZpbGUsIGFuZCBjYWxsIHBuZ19zZXRfc2lnX2J5dGVzKCkuCi0gKi8KLSNkZWZpbmUgUE5HX0JZVEVTX1RPX0NIRUNLIDQKLWludCBjaGVja19pZl9wbmcoY2hhciAqZmlsZV9uYW1lLCBGSUxFICoqZnApCi17Ci0gICBjaGFyIGJ1ZltQTkdfQllURVNfVE9fQ0hFQ0tdOwotCi0gICAvKiBPcGVuIHRoZSBwcm9zcGVjdGl2ZSBQTkcgZmlsZS4gKi8KLSAgIGlmICgoKmZwID0gZm9wZW4oZmlsZV9uYW1lLCAicmIiKSkgPT0gTlVMTCkKLSAgICAgIHJldHVybiAwOwotCi0gICAvKiBSZWFkIGluIHNvbWUgb2YgdGhlIHNpZ25hdHVyZSBieXRlcyAqLwotICAgaWYgKGZyZWFkKGJ1ZiwgMSwgUE5HX0JZVEVTX1RPX0NIRUNLLCAqZnApICE9IFBOR19CWVRFU19UT19DSEVDSykKLSAgICAgIHJldHVybiAwOwotCi0gICAvKiBDb21wYXJlIHRoZSBmaXJzdCBQTkdfQllURVNfVE9fQ0hFQ0sgYnl0ZXMgb2YgdGhlIHNpZ25hdHVyZS4KLSAgICAgIFJldHVybiBub256ZXJvICh0cnVlKSBpZiB0aGV5IG1hdGNoICovCi0KLSAgIHJldHVybighcG5nX3NpZ19jbXAoYnVmLCAocG5nX3NpemVfdCkwLCBQTkdfQllURVNfVE9fQ0hFQ0spKTsKLX0KLQotLyogUmVhZCBhIFBORyBmaWxlLiAgWW91IG1heSB3YW50IHRvIHJldHVybiBhbiBlcnJvciBjb2RlIGlmIHRoZSByZWFkCi0gKiBmYWlscyAoZGVwZW5kaW5nIHVwb24gdGhlIGZhaWx1cmUpLiAgVGhlcmUgYXJlIHR3byAicHJvdG90eXBlcyIgZ2l2ZW4KLSAqIGhlcmUgLSBvbmUgd2hlcmUgd2UgYXJlIGdpdmVuIHRoZSBmaWxlbmFtZSwgYW5kIHdlIG5lZWQgdG8gb3BlbiB0aGUKLSAqIGZpbGUsIGFuZCB0aGUgb3RoZXIgd2hlcmUgd2UgYXJlIGdpdmVuIGFuIG9wZW4gZmlsZSAocG9zc2libHkgd2l0aAotICogc29tZSBvciBhbGwgb2YgdGhlIG1hZ2ljIGJ5dGVzIHJlYWQgLSBzZWUgY29tbWVudHMgYWJvdmUpLgotICovCi0jaWZkZWYgb3Blbl9maWxlIC8qIHByb3RvdHlwZSAxICovCi12b2lkIHJlYWRfcG5nKGNoYXIgKmZpbGVfbmFtZSkgIC8qIFdlIG5lZWQgdG8gb3BlbiB0aGUgZmlsZSAqLwotewotICAgcG5nX3N0cnVjdHAgcG5nX3B0cjsKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cjsKLSAgIHVuc2lnbmVkIGludCBzaWdfcmVhZCA9IDA7Ci0gICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OwotICAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgaW50ZXJsYWNlX3R5cGU7Ci0gICBGSUxFICpmcDsKLQotICAgaWYgKChmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIikpID09IE5VTEwpCi0gICAgICByZXR1cm4gKEVSUk9SKTsKLQotI2Vsc2Ugbm9fb3Blbl9maWxlIC8qIHByb3RvdHlwZSAyICovCi12b2lkIHJlYWRfcG5nKEZJTEUgKmZwLCB1bnNpZ25lZCBpbnQgc2lnX3JlYWQpICAvKiBGaWxlIGlzIGFscmVhZHkgb3BlbiAqLwotewotICAgcG5nX3N0cnVjdHAgcG5nX3B0cjsKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cjsKLSAgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQ7Ci0gICBpbnQgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZTsKLSNlbmRpZiBub19vcGVuX2ZpbGUgLyogT25seSB1c2Ugb25lIHByb3RvdHlwZSEgKi8KLQotICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIGRlc2lyZWQgZXJyb3IgaGFuZGxlcgotICAgICogZnVuY3Rpb25zLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IHN0ZGVyciBhbmQgbG9uZ2p1bXAgbWV0aG9kLAotICAgICogeW91IGNhbiBzdXBwbHkgTlVMTCBmb3IgdGhlIGxhc3QgdGhyZWUgcGFyYW1ldGVycy4gIFdlIGFsc28gc3VwcGx5IHRoZQotICAgICogdGhlIGNvbXBpbGVyIGhlYWRlciBmaWxlIHZlcnNpb24sIHNvIHRoYXQgd2Uga25vdyBpZiB0aGUgYXBwbGljYXRpb24KLSAgICAqIHdhcyBjb21waWxlZCB3aXRoIGEgY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAgUkVRVUlSRUQKLSAgICAqLwotICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAotICAgICAgcG5nX3ZvaWRwIHVzZXJfZXJyb3JfcHRyLCB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgewotICAgICAgZmNsb3NlKGZwKTsKLSAgICAgIHJldHVybiAoRVJST1IpOwotICAgfQotCi0gICAvKiBBbGxvY2F0ZS9pbml0aWFsaXplIHRoZSBtZW1vcnkgZm9yIGltYWdlIGluZm9ybWF0aW9uLiAgUkVRVUlSRUQuICovCi0gICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICBpZiAoaW5mb19wdHIgPT0gTlVMTCkKLSAgIHsKLSAgICAgIGZjbG9zZShmcCk7Ci0gICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgcG5nX2luZm9wcF9OVUxMLCBwbmdfaW5mb3BwX05VTEwpOwotICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICB9Ci0KLSAgIC8qIFNldCBlcnJvciBoYW5kbGluZyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBzZXRqbXAvbG9uZ2ptcCBtZXRob2QgKHRoaXMgaXMKLSAgICAqIHRoZSBub3JtYWwgbWV0aG9kIG9mIGRvaW5nIHRoaW5ncyB3aXRoIGxpYnBuZykuICBSRVFVSVJFRCB1bmxlc3MgeW91Ci0gICAgKiBzZXQgdXAgeW91ciBvd24gZXJyb3IgaGFuZGxlcnMgaW4gdGhlIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoKSBlYXJsaWVyLgotICAgICovCi0KLSAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICB7Ci0gICAgICAvKiBGcmVlIGFsbCBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG5nX3B0ciBhbmQgaW5mb19wdHIgKi8KLSAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIHBuZ19pbmZvcHBfTlVMTCk7Ci0gICAgICBmY2xvc2UoZnApOwotICAgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGhhZCBhIHByb2JsZW0gcmVhZGluZyB0aGUgZmlsZSAqLwotICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICB9Ci0KLSAgIC8qIE9uZSBvZiB0aGUgZm9sbG93aW5nIEkvTyBpbml0aWFsaXphdGlvbiBtZXRob2RzIGlzIFJFUVVJUkVEICovCi0jaWZkZWYgc3RyZWFtcyAvKiBQTkcgZmlsZSBJL08gbWV0aG9kIDEgKi8KLSAgIC8qIFNldCB1cCB0aGUgaW5wdXQgY29udHJvbCBpZiB5b3UgYXJlIHVzaW5nIHN0YW5kYXJkIEMgc3RyZWFtcyAqLwotICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOwotCi0jZWxzZSBub19zdHJlYW1zIC8qIFBORyBmaWxlIEkvTyBtZXRob2QgMiAqLwotICAgLyogSWYgeW91IGFyZSB1c2luZyByZXBsYWNlbWVudCByZWFkIGZ1bmN0aW9ucywgaW5zdGVhZCBvZiBjYWxsaW5nCi0gICAgKiBwbmdfaW5pdF9pbygpIGhlcmUgeW91IHdvdWxkIGNhbGw6Ci0gICAgKi8KLSAgIHBuZ19zZXRfcmVhZF9mbihwbmdfcHRyLCAodm9pZCAqKXVzZXJfaW9fcHRyLCB1c2VyX3JlYWRfZm4pOwotICAgLyogd2hlcmUgdXNlcl9pb19wdHIgaXMgYSBzdHJ1Y3R1cmUgeW91IHdhbnQgYXZhaWxhYmxlIHRvIHRoZSBjYWxsYmFja3MgKi8KLSNlbmRpZiBub19zdHJlYW1zIC8qIFVzZSBvbmx5IG9uZSBJL08gbWV0aG9kISAqLwotCi0gICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBzb21lIG9mIHRoZSBzaWduYXR1cmUgKi8KLSAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIHNpZ19yZWFkKTsKLQotI2lmZGVmIGhpbGV2ZWwKLSAgIC8qCi0gICAgKiBJZiB5b3UgaGF2ZSBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgaW4gdGhlIGVudGlyZSBpbWFnZSBhdCBvbmNlLAotICAgICogYW5kIHlvdSBuZWVkIHRvIHNwZWNpZnkgb25seSB0cmFuc2Zvcm1zIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQKLSAgICAqIHdpdGggb25lIG9mIHRoZSBQTkdfVFJBTlNGT1JNXyogYml0cyAodGhpcyBwcmVzZW50bHkgZXhjbHVkZXMKLSAgICAqIGRpdGhlcmluZywgZmlsbGluZywgc2V0dGluZyBiYWNrZ3JvdW5kLCBhbmQgZG9pbmcgZ2FtbWEKLSAgICAqIGFkanVzdG1lbnQpLCB0aGVuIHlvdSBjYW4gcmVhZCB0aGUgZW50aXJlIGltYWdlIChpbmNsdWRpbmcKLSAgICAqIHBpeGVscykgaW50byB0aGUgaW5mbyBzdHJ1Y3R1cmUgd2l0aCB0aGlzIGNhbGw6Ci0gICAgKi8KLSAgIHBuZ19yZWFkX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIHBuZ192b2lkcF9OVUxMKTsKLQotI2Vsc2UKLSAgIC8qIE9LLCB5b3UncmUgZG9pbmcgaXQgdGhlIGhhcmQgd2F5LCB3aXRoIHRoZSBsb3dlci1sZXZlbCBmdW5jdGlvbnMgKi8KLQotICAgLyogVGhlIGNhbGwgdG8gcG5nX3JlYWRfaW5mbygpIGdpdmVzIHVzIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUKLSAgICAqIFBORyBmaWxlIGJlZm9yZSB0aGUgZmlyc3QgSURBVCAoaW1hZ2UgZGF0YSBjaHVuaykuICBSRVFVSVJFRAotICAgICovCi0gICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLAotICAgICAgICZpbnRlcmxhY2VfdHlwZSwgaW50X3BfTlVMTCwgaW50X3BfTlVMTCk7Ci0KLSAgIC8qIFNldCB1cCB0aGUgZGF0YSB0cmFuc2Zvcm1hdGlvbnMgeW91IHdhbnQuICBOb3RlIHRoYXQgdGhlc2UgYXJlIGFsbAotICAgICogb3B0aW9uYWwuICBPbmx5IGNhbGwgdGhlbSBpZiB5b3Ugd2FudC9uZWVkIHRoZW0uICBNYW55IG9mIHRoZQotICAgICogdHJhbnNmb3JtYXRpb25zIG9ubHkgd29yayBvbiBzcGVjaWZpYyB0eXBlcyBvZiBpbWFnZXMsIGFuZCBtYW55Ci0gICAgKiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgotICAgICovCi0KLSAgIC8qIFRlbGwgbGlicG5nIHRvIHN0cmlwIDE2IGJpdC9jb2xvciBmaWxlcyBkb3duIHRvIDggYml0cy9jb2xvciAqLwotICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKLQotICAgLyogU3RyaXAgYWxwaGEgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgZGF0YSB3aXRob3V0IGNvbWJpbmluZyB3aXRoIHRoZQotICAgICogYmFja2dyb3VuZCAobm90IHJlY29tbWVuZGVkKS4KLSAgICAqLwotICAgcG5nX3NldF9zdHJpcF9hbHBoYShwbmdfcHRyKTsKLQotICAgLyogRXh0cmFjdCBtdWx0aXBsZSBwaXhlbHMgd2l0aCBiaXQgZGVwdGhzIG9mIDEsIDIsIGFuZCA0IGZyb20gYSBzaW5nbGUKLSAgICAqIGJ5dGUgaW50byBzZXBhcmF0ZSBieXRlcyAodXNlZnVsIGZvciBwYWxldHRlZCBhbmQgZ3JheXNjYWxlIGltYWdlcykuCi0gICAgKi8KLSAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKLQotICAgLyogQ2hhbmdlIHRoZSBvcmRlciBvZiBwYWNrZWQgcGl4ZWxzIHRvIGxlYXN0IHNpZ25pZmljYW50IGJpdCBmaXJzdAotICAgICogKG5vdCB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBwbmdfc2V0X3BhY2tpbmcpLiAqLwotICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKLQotICAgLyogRXhwYW5kIHBhbGV0dGVkIGNvbG9ycyBpbnRvIHRydWUgUkdCIHRyaXBsZXRzICovCi0gICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfcHRyKTsKLQotICAgLyogRXhwYW5kIGdyYXlzY2FsZSBpbWFnZXMgdG8gdGhlIGZ1bGwgOCBiaXRzIGZyb20gMSwgMiwgb3IgNCBiaXRzL3BpeGVsICovCi0gICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIGJpdF9kZXB0aCA8IDgpCi0gICAgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nX3B0cik7Ci0KLSAgIC8qIEV4cGFuZCBwYWxldHRlZCBvciBSR0IgaW1hZ2VzIHdpdGggdHJhbnNwYXJlbmN5IHRvIGZ1bGwgYWxwaGEgY2hhbm5lbHMKLSAgICAqIHNvIHRoZSBkYXRhIHdpbGwgYmUgYXZhaWxhYmxlIGFzIFJHQkEgcXVhcnRldHMuCi0gICAgKi8KLSAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT190Uk5TKSkKLSAgICAgIHBuZ19zZXRfdFJOU190b19hbHBoYShwbmdfcHRyKTsKLQotICAgLyogU2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIGRyYXcgdHJhbnNwYXJlbnQgYW5kIGFscGhhIGltYWdlcyBvdmVyLgotICAgICogSXQgaXMgcG9zc2libGUgdG8gc2V0IHRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjb21wb25lbnRzIGRpcmVjdGx5Ci0gICAgKiBmb3IgcGFsZXR0ZWQgaW1hZ2VzIGluc3RlYWQgb2Ygc3VwcGx5aW5nIGEgcGFsZXR0ZSBpbmRleC4gIE5vdGUgdGhhdAotICAgICogZXZlbiBpZiB0aGUgUE5HIGZpbGUgc3VwcGxpZXMgYSBiYWNrZ3JvdW5kLCB5b3UgYXJlIG5vdCByZXF1aXJlZCB0bwotICAgICogdXNlIGl0IC0geW91IHNob3VsZCB1c2UgdGhlIChzb2xpZCkgYXBwbGljYXRpb24gYmFja2dyb3VuZCBpZiBpdCBoYXMgb25lLgotICAgICovCi0KLSAgIHBuZ19jb2xvcl8xNiBteV9iYWNrZ3JvdW5kLCAqaW1hZ2VfYmFja2dyb3VuZDsKLQotICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2JhY2tncm91bmQpKQotICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsIGltYWdlX2JhY2tncm91bmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRSwgMSwgMS4wKTsKLSAgIGVsc2UKLSAgICAgIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCAmbXlfYmFja2dyb3VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAsIDEuMCk7Ci0KLSAgIC8qIFNvbWUgc3VnZ2VzdGlvbnMgYXMgdG8gaG93IHRvIGdldCBhIHNjcmVlbiBnYW1tYSB2YWx1ZQotICAgICoKLSAgICAqIE5vdGUgdGhhdCBzY3JlZW4gZ2FtbWEgaXMgdGhlIGRpc3BsYXlfZXhwb25lbnQsIHdoaWNoIGluY2x1ZGVzCi0gICAgKiB0aGUgQ1JUX2V4cG9uZW50IGFuZCBhbnkgY29ycmVjdGlvbiBmb3Igdmlld2luZyBjb25kaXRpb25zCi0gICAgKi8KLSAgIGlmICgvKiBXZSBoYXZlIGEgdXNlci1kZWZpbmVkIHNjcmVlbiBnYW1tYSB2YWx1ZSAqLykKLSAgIHsKLSAgICAgIHNjcmVlbl9nYW1tYSA9IHVzZXItZGVmaW5lZCBzY3JlZW5fZ2FtbWE7Ci0gICB9Ci0gICAvKiBUaGlzIGlzIG9uZSB3YXkgdGhhdCBhcHBsaWNhdGlvbnMgc2hhcmUgdGhlIHNhbWUgc2NyZWVuIGdhbW1hIHZhbHVlICovCi0gICBlbHNlIGlmICgoZ2FtbWFfc3RyID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHNjcmVlbl9nYW1tYSA9IGF0b2YoZ2FtbWFfc3RyKTsKLSAgIH0KLSAgIC8qIElmIHdlIGRvbid0IGhhdmUgYW5vdGhlciB2YWx1ZSAqLwotICAgZWxzZQotICAgewotICAgICAgc2NyZWVuX2dhbW1hID0gMi4yOyAgLyogQSBnb29kIGd1ZXNzIGZvciBhIFBDIG1vbml0b3IgaW4gYSBkaW1seQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl0IHJvb20gKi8KLSAgICAgIHNjcmVlbl9nYW1tYSA9IDEuNyBvciAxLjA7ICAvKiBBIGdvb2QgZ3Vlc3MgZm9yIE1hYyBzeXN0ZW1zICovCi0gICB9Ci0KLSAgIC8qIFRlbGwgbGlicG5nIHRvIGhhbmRsZSB0aGUgZ2FtbWEgY29udmVyc2lvbiBmb3IgeW91LiAgVGhlIGZpbmFsIGNhbGwKLSAgICAqIGlzIGEgZ29vZCBndWVzcyBmb3IgUEMgZ2VuZXJhdGVkIGltYWdlcywgYnV0IGl0IHNob3VsZCBiZSBjb25maWd1cmFibGUKLSAgICAqIGJ5IHRoZSB1c2VyIGF0IHJ1biB0aW1lIGJ5IHRoZSB1c2VyLiAgSXQgaXMgc3Ryb25nbHkgc3VnZ2VzdGVkIHRoYXQKLSAgICAqIHlvdXIgYXBwbGljYXRpb24gc3VwcG9ydCBnYW1tYSBjb3JyZWN0aW9uLgotICAgICovCi0KLSAgIGludCBpbnRlbnQ7Ci0KLSAgIGlmIChwbmdfZ2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsICZpbnRlbnQpKQotICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIDAuNDU0NTUpOwotICAgZWxzZQotICAgewotICAgICAgZG91YmxlIGltYWdlX2dhbW1hOwotICAgICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2dhbW1hKSkKLSAgICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCBpbWFnZV9nYW1tYSk7Ci0gICAgICBlbHNlCi0gICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgMC40NTQ1NSk7Ci0gICB9Ci0KLSAgIC8qIERpdGhlciBSR0IgZmlsZXMgZG93biB0byA4IGJpdCBwYWxldHRlIG9yIHJlZHVjZSBwYWxldHRlcwotICAgICogdG8gdGhlIG51bWJlciBvZiBjb2xvcnMgYXZhaWxhYmxlIG9uIHlvdXIgc2NyZWVuLgotICAgICovCi0gICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgewotICAgICAgaW50IG51bV9wYWxldHRlOwotICAgICAgcG5nX2NvbG9ycCBwYWxldHRlOwotCi0gICAgICAvKiBUaGlzIHJlZHVjZXMgdGhlIGltYWdlIHRvIHRoZSBhcHBsaWNhdGlvbiBzdXBwbGllZCBwYWxldHRlICovCi0gICAgICBpZiAoLyogV2UgaGF2ZSBvdXIgb3duIHBhbGV0dGUgKi8pCi0gICAgICB7Ci0gICAgICAgICAvKiBBbiBhcnJheSBvZiBjb2xvcnMgdG8gd2hpY2ggdGhlIGltYWdlIHNob3VsZCBiZSBkaXRoZXJlZCAqLwotICAgICAgICAgcG5nX2NvbG9yIHN0ZF9jb2xvcl9jdWJlW01BWF9TQ1JFRU5fQ09MT1JTXTsKLQotICAgICAgICAgcG5nX3NldF9kaXRoZXIocG5nX3B0ciwgc3RkX2NvbG9yX2N1YmUsIE1BWF9TQ1JFRU5fQ09MT1JTLAotICAgICAgICAgICAgTUFYX1NDUkVFTl9DT0xPUlMsIHBuZ191aW50XzE2cF9OVUxMLCAwKTsKLSAgICAgIH0KLSAgICAgIC8qIFRoaXMgcmVkdWNlcyB0aGUgaW1hZ2UgdG8gdGhlIHBhbGV0dGUgc3VwcGxpZWQgaW4gdGhlIGZpbGUgKi8KLSAgICAgIGVsc2UgaWYgKHBuZ19nZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGUsICZudW1fcGFsZXR0ZSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8xNnAgaGlzdG9ncmFtID0gTlVMTDsKLQotICAgICAgICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCAmaGlzdG9ncmFtKTsKLQotICAgICAgICAgcG5nX3NldF9kaXRoZXIocG5nX3B0ciwgcGFsZXR0ZSwgbnVtX3BhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhfc2NyZWVuX2NvbG9ycywgaGlzdG9ncmFtLCAwKTsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogSW52ZXJ0IG1vbm9jaHJvbWUgZmlsZXMgdG8gaGF2ZSAwIGFzIHdoaXRlIGFuZCAxIGFzIGJsYWNrICovCi0gICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOwotCi0gICAvKiBJZiB5b3Ugd2FudCB0byBzaGlmdCB0aGUgcGl4ZWwgdmFsdWVzIGZyb20gdGhlIHJhbmdlIFswLDI1NV0gb3IKLSAgICAqIFswLDY1NTM1XSB0byB0aGUgb3JpZ2luYWwgWzAsN10gb3IgWzAsMzFdLCBvciB3aGF0ZXZlciByYW5nZSB0aGUKLSAgICAqIGNvbG9ycyB3ZXJlIG9yaWdpbmFsbHkgaW46Ci0gICAgKi8KLSAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT19zQklUKSkKLSAgIHsKLSAgICAgIHBuZ19jb2xvcl84cCBzaWdfYml0X3A7Ci0KLSAgICAgIHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXRfcCk7Ci0gICAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsIHNpZ19iaXRfcCk7Ci0gICB9Ci0KLSAgIC8qIEZsaXAgdGhlIFJHQiBwaXhlbHMgdG8gQkdSIChvciBSR0JBIHRvIEJHUkEpICovCi0gICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7Ci0KLSAgIC8qIFN3YXAgdGhlIFJHQkEgb3IgR0EgZGF0YSB0byBBUkdCIG9yIEFHIChvciBCR1JBIHRvIEFCR1IpICovCi0gICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7Ci0KLSAgIC8qIFN3YXAgYnl0ZXMgb2YgMTYgYml0IGZpbGVzIHRvIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KLSAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKLQotICAgLyogQWRkIGZpbGxlciAob3IgYWxwaGEpIGJ5dGUgKGJlZm9yZS9hZnRlciBlYWNoIFJHQiB0cmlwbGV0KSAqLwotICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgMHhmZiwgUE5HX0ZJTExFUl9BRlRFUik7Ci0KLSAgIC8qIFR1cm4gb24gaW50ZXJsYWNlIGhhbmRsaW5nLiAgUkVRVUlSRUQgaWYgeW91IGFyZSBub3QgdXNpbmcKLSAgICAqIHBuZ19yZWFkX2ltYWdlKCkuICBUbyBzZWUgaG93IHRvIGhhbmRsZSBpbnRlcmxhY2luZyBwYXNzZXMsCi0gICAgKiBzZWUgdGhlIHBuZ19yZWFkX3JvdygpIG1ldGhvZCBiZWxvdzoKLSAgICAqLwotICAgbnVtYmVyX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotCi0gICAvKiBPcHRpb25hbCBjYWxsIHRvIGdhbW1hIGNvcnJlY3QgYW5kIGFkZCB0aGUgYmFja2dyb3VuZCB0byB0aGUgcGFsZXR0ZQotICAgICogYW5kIHVwZGF0ZSBpbmZvIHN0cnVjdHVyZS4gIFJFUVVJUkVEIGlmIHlvdSBhcmUgZXhwZWN0aW5nIGxpYnBuZyB0bwotICAgICogdXBkYXRlIHRoZSBwYWxldHRlIGZvciB5b3UgKGllIHlvdSBzZWxlY3RlZCBzdWNoIGEgdHJhbnNmb3JtIGFib3ZlKS4KLSAgICAqLwotICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IHRvIGhvbGQgdGhlIGltYWdlIHVzaW5nIHRoZSBmaWVsZHMgb2YgaW5mb19wdHIuICovCi0KLSAgIC8qIFRoZSBlYXNpZXN0IHdheSB0byByZWFkIHRoZSBpbWFnZTogKi8KLSAgIHBuZ19ieXRlcCByb3dfcG9pbnRlcnNbaGVpZ2h0XTsKLQotICAgLyogQ2xlYXIgdGhlIHBvaW50ZXIgYXJyYXkgKi8KLSAgIGZvciAocm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykKLSAgICAgIHJvd19wb2ludGVyc1tyb3ddID0gTlVMTDsKLQotICAgZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKQotICAgICAgcm93X3BvaW50ZXJzW3Jvd10gPSBwbmdfbWFsbG9jKHBuZ19wdHIsIHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwKLSAgICAgICAgIGluZm9fcHRyKSk7Ci0KLSAgIC8qIE5vdyBpdCdzIHRpbWUgdG8gcmVhZCB0aGUgaW1hZ2UuICBPbmUgb2YgdGhlc2UgbWV0aG9kcyBpcyBSRVFVSVJFRCAqLwotI2lmZGVmIGVudGlyZSAvKiBSZWFkIHRoZSBlbnRpcmUgaW1hZ2UgaW4gb25lIGdvICovCi0gICBwbmdfcmVhZF9pbWFnZShwbmdfcHRyLCByb3dfcG9pbnRlcnMpOwotCi0jZWxzZSBub19lbnRpcmUgLyogUmVhZCB0aGUgaW1hZ2Ugb25lIG9yIG1vcmUgc2NhbmxpbmVzIGF0IGEgdGltZSAqLwotICAgLyogVGhlIG90aGVyIHdheSB0byByZWFkIGltYWdlcyAtIGRlYWwgd2l0aCBpbnRlcmxhY2luZzogKi8KLQotICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IG51bWJlcl9wYXNzZXM7IHBhc3MrKykKLSAgIHsKLSNpZmRlZiBzaW5nbGUgLyogUmVhZCB0aGUgaW1hZ2UgYSBzaW5nbGUgcm93IGF0IGEgdGltZSAqLwotICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQotICAgICAgewotICAgICAgICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCAmcm93X3BvaW50ZXJzW3ldLCBwbmdfYnl0ZXBwX05VTEwsIDEpOwotICAgICAgfQotCi0jZWxzZSBub19zaW5nbGUgLyogUmVhZCB0aGUgaW1hZ2Ugc2V2ZXJhbCByb3dzIGF0IGEgdGltZSAqLwotICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSBudW1iZXJfb2Zfcm93cykKLSAgICAgIHsKLSNpZmRlZiBzcGFya2xlIC8qIFJlYWQgdGhlIGltYWdlIHVzaW5nIHRoZSAic3BhcmtsZSIgZWZmZWN0LiAqLwotICAgICAgICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCAmcm93X3BvaW50ZXJzW3ldLCBwbmdfYnl0ZXBwX05VTEwsCi0gICAgICAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0jZWxzZSBub19zcGFya2xlIC8qIFJlYWQgdGhlIGltYWdlIHVzaW5nIHRoZSAicmVjdGFuZ2xlIiBlZmZlY3QgKi8KLSAgICAgICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgcG5nX2J5dGVwcF9OVUxMLCAmcm93X3BvaW50ZXJzW3ldLAotICAgICAgICAgICAgbnVtYmVyX29mX3Jvd3MpOwotI2VuZGlmIG5vX3NwYXJrbGUgLyogVXNlIG9ubHkgb25lIG9mIHRoZXNlIHR3byBtZXRob2RzICovCi0gICAgICB9Ci0KLSAgICAgIC8qIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgdGhlIGltYWdlIGFmdGVyIGV2ZXJ5IHBhc3MsIGRvIHNvIGhlcmUgKi8KLSNlbmRpZiBub19zaW5nbGUgLyogVXNlIG9ubHkgb25lIG9mIHRoZXNlIHR3byBtZXRob2RzICovCi0gICB9Ci0jZW5kaWYgbm9fZW50aXJlIC8qIFVzZSBvbmx5IG9uZSBvZiB0aGVzZSB0d28gbWV0aG9kcyAqLwotCi0gICAvKiBSZWFkIHJlc3Qgb2YgZmlsZSwgYW5kIGdldCBhZGRpdGlvbmFsIGNodW5rcyBpbiBpbmZvX3B0ciAtIFJFUVVJUkVEICovCi0gICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgaW5mb19wdHIpOwotI2VuZGlmIGhpbGV2ZWwKLQotICAgLyogQXQgdGhpcyBwb2ludCB5b3UgaGF2ZSByZWFkIHRoZSBlbnRpcmUgaW1hZ2UgKi8KLQotICAgLyogQ2xlYW4gdXAgYWZ0ZXIgdGhlIHJlYWQsIGFuZCBmcmVlIGFueSBtZW1vcnkgYWxsb2NhdGVkIC0gUkVRVUlSRUQgKi8KLSAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIHBuZ19pbmZvcHBfTlVMTCk7Ci0KLSAgIC8qIENsb3NlIHRoZSBmaWxlICovCi0gICBmY2xvc2UoZnApOwotCi0gICAvKiBUaGF0J3MgaXQgKi8KLSAgIHJldHVybiAoT0spOwotfQotCi0vKiBQcm9ncmVzc2l2ZWx5IHJlYWQgYSBmaWxlICovCi0KLWludAotaW5pdGlhbGl6ZV9wbmdfcmVhZGVyKHBuZ19zdHJ1Y3RwICpwbmdfcHRyLCBwbmdfaW5mb3AgKmluZm9fcHRyKQotewotICAgLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIGRlc2lyZWQgZXJyb3IgaGFuZGxlcgotICAgICogZnVuY3Rpb25zLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IHN0ZGVyciBhbmQgbG9uZ2p1bXAgbWV0aG9kLAotICAgICogeW91IGNhbiBzdXBwbHkgTlVMTCBmb3IgdGhlIGxhc3QgdGhyZWUgcGFyYW1ldGVycy4gIFdlIGFsc28gY2hlY2sgdGhhdAotICAgICogdGhlIGxpYnJhcnkgdmVyc2lvbiBpcyBjb21wYXRpYmxlIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGR5bmFtaWNhbGx5Ci0gICAgKiBsaW5rZWQgbGlicmFyaWVzLgotICAgICovCi0gICAqcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAotICAgICAgIHBuZ192b2lkcCB1c2VyX2Vycm9yX3B0ciwgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKLQotICAgaWYgKCpwbmdfcHRyID09IE5VTEwpCi0gICB7Ci0gICAgICAqaW5mb19wdHIgPSBOVUxMOwotICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICB9Ci0KLSAgICppbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0KLSAgIGlmICgqaW5mb19wdHIgPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfaW5mb3BwX05VTEwpOwotICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICB9Ci0KLSAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZigoKnBuZ19wdHIpKSkpCi0gICB7Ci0gICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX2luZm9wcF9OVUxMKTsKLSAgICAgIHJldHVybiAoRVJST1IpOwotICAgfQotCi0gICAvKiBUaGlzIG9uZSdzIG5ldy4gIFlvdSB3aWxsIG5lZWQgdG8gcHJvdmlkZSBhbGwgdGhyZWUKLSAgICAqIGZ1bmN0aW9uIGNhbGxiYWNrcywgZXZlbiBpZiB5b3UgYXJlbid0IHVzaW5nIHRoZW0gYWxsLgotICAgICogSWYgeW91IGFyZW4ndCB1c2luZyBhbGwgZnVuY3Rpb25zLCB5b3UgY2FuIHNwZWNpZnkgTlVMTAotICAgICogcGFyYW1ldGVycy4gIEV2ZW4gd2hlbiBhbGwgdGhyZWUgZnVuY3Rpb25zIGFyZSBOVUxMLAotICAgICogeW91IG5lZWQgdG8gY2FsbCBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKS4KLSAgICAqIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGRuJ3QgYmUgZGVwZW5kZW50IG9uIGdsb2JhbCBvcgotICAgICogc3RhdGljIHZhcmlhYmxlcyBpZiB5b3UgYXJlIGRlY29kaW5nIHNldmVyYWwgaW1hZ2VzCi0gICAgKiBzaW11bHRhbmVvdXNseS4gIFlvdSBzaG91bGQgc3RvcmUgc3RyZWFtIHNwZWNpZmljIGRhdGEKLSAgICAqIGluIGEgc2VwYXJhdGUgc3RydWN0LCBnaXZlbiBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciwKLSAgICAqIGFuZCByZXRyaWV2ZSB0aGUgcG9pbnRlciBmcm9tIGluc2lkZSB0aGUgY2FsbGJhY2tzIHVzaW5nCi0gICAgKiB0aGUgZnVuY3Rpb24gcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cikuCi0gICAgKi8KLSAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigqcG5nX3B0ciwgKHZvaWQgKilzdHJlYW1fZGF0YSwKLSAgICAgIGluZm9fY2FsbGJhY2ssIHJvd19jYWxsYmFjaywgZW5kX2NhbGxiYWNrKTsKLQotICAgcmV0dXJuIChPSyk7Ci19Ci0KLWludAotcHJvY2Vzc19kYXRhKHBuZ19zdHJ1Y3RwICpwbmdfcHRyLCBwbmdfaW5mb3AgKmluZm9fcHRyLAotICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgaWYgKHNldGptcChwbmdfam1wYnVmKCgqcG5nX3B0cikpKSkKLSAgIHsKLSAgICAgIC8qIEZyZWUgdGhlIHBuZ19wdHIgYW5kIGluZm9fcHRyIG1lbW9yeSBvbiBlcnJvciAqLwotICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19pbmZvcHBfTlVMTCk7Ci0gICAgICByZXR1cm4gKEVSUk9SKTsKLSAgIH0KLQotICAgLyogVGhpcyBvbmUncyBuZXcgYWxzby4gIFNpbXBseSBnaXZlIGl0IGNodW5rcyBvZiBkYXRhIGFzCi0gICAgKiB0aGV5IGFycml2ZSBmcm9tIHRoZSBkYXRhIHN0cmVhbSAoaW4gb3JkZXIsIG9mIGNvdXJzZSkuCi0gICAgKiBPbiBzZWdtZW50ZWQgbWFjaGluZXMsIGRvbid0IGdpdmUgaXQgYW55IG1vcmUgdGhhbiA2NEsuCi0gICAgKiBUaGUgbGlicmFyeSBzZWVtcyB0byBydW4gZmluZSB3aXRoIHNpemVzIG9mIDRLLCBhbHRob3VnaAotICAgICogeW91IGNhbiBnaXZlIGl0IG11Y2ggbGVzcyBpZiBuZWNlc3NhcnkgKEkgYXNzdW1lIHlvdSBjYW4KLSAgICAqIGdpdmUgaXQgY2h1bmtzIG9mIDEgYnl0ZSwgYnV0IEkgaGF2ZW4ndCB0cmllZCB3aXRoIGxlc3MKLSAgICAqIHRoYW4gMjU2IGJ5dGVzIHlldCkuICBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgeW91IG1heQotICAgICogd2FudCB0byBkaXNwbGF5IGFueSByb3dzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgaW4gdGhlIHJvdwotICAgICogY2FsbGJhY2ssIGlmIHlvdSBhcmVuJ3QgYWxyZWFkeSBkaXNwbGF5aW5nIHRoZW0gdGhlcmUuCi0gICAgKi8KLSAgIHBuZ19wcm9jZXNzX2RhdGEoKnBuZ19wdHIsICppbmZvX3B0ciwgYnVmZmVyLCBsZW5ndGgpOwotICAgcmV0dXJuIChPSyk7Ci19Ci0KLWluZm9fY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCi17Ci0gICAvKiBEbyBhbnkgc2V0dXAgaGVyZSwgaW5jbHVkaW5nIHNldHRpbmcgYW55IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbnMKLSAgICAqIG1lbnRpb25lZCBpbiB0aGUgUmVhZGluZyBQTkcgZmlsZXMgc2VjdGlvbi4gIEZvciBub3csIHlvdSBfbXVzdF8KLSAgICAqIGNhbGwgZWl0aGVyIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkgb3IgcG5nX3JlYWRfdXBkYXRlX2luZm8oKQotICAgICogYWZ0ZXIgYWxsIHRoZSB0cmFuc2Zvcm1hdGlvbnMgYXJlIHNldCAoZXZlbiBpZiB5b3UgZG9uJ3Qgc2V0Ci0gICAgKiBhbnkpLiAgWW91IG1heSBzdGFydCBnZXR0aW5nIHJvd3MgYmVmb3JlIHBuZ19wcm9jZXNzX2RhdGEoKQotICAgICogcmV0dXJucywgc28gdGhpcyBpcyB5b3VyIGxhc3QgY2hhbmNlIHRvIHByZXBhcmUgZm9yIHRoYXQuCi0gICAgKi8KLX0KLQotcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LAotICAgcG5nX3VpbnRfMzIgcm93X251bSwgaW50IHBhc3MpCi17Ci0gICAvKgotICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IHJvdyBpbiB0aGUgaW1hZ2UuICBJZiB0aGUKLSAgICAqIGltYWdlIGlzIGludGVybGFjZWQsIGFuZCB5b3UgdHVybmVkIG9uIHRoZSBpbnRlcmxhY2UgaGFuZGxlciwKLSAgICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IHJvdyBpbiBldmVyeSBwYXNzLgotICAgICoKLSAgICAqIEluIHRoaXMgZnVuY3Rpb24geW91IHdpbGwgcmVjZWl2ZSBhIHBvaW50ZXIgdG8gbmV3IHJvdyBkYXRhIGZyb20KLSAgICAqIGxpYnBuZyBjYWxsZWQgbmV3X3JvdyB0aGF0IGlzIHRvIHJlcGxhY2UgYSBjb3JyZXNwb25kaW5nIHJvdyAob2YKLSAgICAqIHRoZSBzYW1lIGRhdGEgZm9ybWF0KSBpbiBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgeW91ciBhcHBsaWNhdGlvbi4KLSAgICAqCi0gICAgKiBUaGUgbmV3IHJvdyBkYXRhIHBvaW50ZXIgIm5ld19yb3ciIG1heSBiZSBOVUxMLCBpbmRpY2F0aW5nIHRoZXJlIGlzCi0gICAgKiBubyBuZXcgZGF0YSB0byBiZSByZXBsYWNlZCAoaW4gY2FzZXMgb2YgaW50ZXJsYWNlIGxvYWRpbmcpLgotICAgICoKLSAgICAqIElmIG5ld19yb3cgaXMgbm90IE5VTEwgdGhlbiB5b3UgbmVlZCB0byBjYWxsCi0gICAgKiBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3coKSB0byByZXBsYWNlIHRoZSBjb3JyZXNwb25kaW5nIHJvdyBhcwotICAgICogc2hvd24gYmVsb3c6Ci0gICAgKi8KLQotICAgLyogQ2hlY2sgaWYgcm93X251bSBpcyBpbiBib3VuZHMuICovCi0gICBpZiAoKHJvd19udW0gPj0gMCkgJiYgKHJvd19udW0gPCBoZWlnaHQpKQotICAgewotICAgICAvKiBHZXQgcG9pbnRlciB0byBjb3JyZXNwb25kaW5nIHJvdyBpbiBvdXIKLSAgICAgICogUE5HIHJlYWQgYnVmZmVyLgotICAgICAgKi8KLSAgICAgcG5nX2J5dGVwIG9sZF9yb3cgPSAoKHBuZ19ieXRlcCAqKW91cl9kYXRhKVtyb3dfbnVtXTsKLQotICAgICAvKiBJZiBib3RoIHJvd3MgYXJlIGFsbG9jYXRlZCB0aGVuIGNvcHkgdGhlIG5ldyByb3cKLSAgICAgICogZGF0YSB0byB0aGUgY29ycmVzcG9uZGluZyByb3cgZGF0YS4KLSAgICAgICovCi0gICAgIGlmICgob2xkX3JvdyAhPSBOVUxMKSAmJiAobmV3X3JvdyAhPSBOVUxMKSkKLSAgICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIG9sZF9yb3csIG5ld19yb3cpOwotICAgfQotICAgLyoKLSAgICAqIFRoZSByb3dzIGFuZCBwYXNzZXMgYXJlIGNhbGxlZCBpbiBvcmRlciwgc28geW91IGRvbid0IHJlYWxseQotICAgICogbmVlZCB0aGUgcm93X251bSBhbmQgcGFzcywgYnV0IEknbSBzdXBwbHlpbmcgdGhlbSBiZWNhdXNlIGl0Ci0gICAgKiBtYXkgbWFrZSB5b3VyIGxpZmUgZWFzaWVyLgotICAgICoKLSAgICAqIEZvciB0aGUgbm9uLU5VTEwgcm93cyBvZiBpbnRlcmxhY2VkIGltYWdlcywgeW91IG11c3QgY2FsbAotICAgICogcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KCkgcGFzc2luZyBpbiB0aGUgbmV3IHJvdyBhbmQgdGhlCi0gICAgKiBvbGQgcm93LCBhcyBkZW1vbnN0cmF0ZWQgYWJvdmUuICBZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IKLSAgICAqIE5VTEwgcm93cyAoaXQgd2lsbCBqdXN0IHJldHVybikgYW5kIGZvciBub24taW50ZXJsYWNlZCBpbWFnZXMKLSAgICAqIChpdCBqdXN0IGRvZXMgdGhlIHBuZ19tZW1jcHkgZm9yIHlvdSkgaWYgaXQgd2lsbCBtYWtlIHRoZSBjb2RlCi0gICAgKiBlYXNpZXIuICBUaHVzLCB5b3UgY2FuIGp1c3QgZG8gdGhpcyBmb3IgYWxsIGNhc2VzOgotICAgICovCi0KLSAgIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyhwbmdfcHRyLCBvbGRfcm93LCBuZXdfcm93KTsKLQotICAgLyogd2hlcmUgb2xkX3JvdyBpcyB3aGF0IHdhcyBkaXNwbGF5ZWQgZm9yIHByZXZpb3VzIHJvd3MuICBOb3RlCi0gICAgKiB0aGF0IHRoZSBmaXJzdCBwYXNzIChwYXNzID09IDAgcmVhbGx5KSB3aWxsIGNvbXBsZXRlbHkgY292ZXIKLSAgICAqIHRoZSBvbGQgcm93LCBzbyB0aGUgcm93cyBkbyBub3QgaGF2ZSB0byBiZSBpbml0aWFsaXplZC4gIEFmdGVyCi0gICAgKiB0aGUgZmlyc3QgcGFzcyAoYW5kIG9ubHkgZm9yIGludGVybGFjZWQgaW1hZ2VzKSwgeW91IHdpbGwgaGF2ZQotICAgICogdG8gcGFzcyB0aGUgY3VycmVudCByb3cgYXMgbmV3X3JvdywgYW5kIHRoZSBmdW5jdGlvbiB3aWxsIGNvbWJpbmUKLSAgICAqIHRoZSBvbGQgcm93IGFuZCB0aGUgbmV3IHJvdy4KLSAgICAqLwotfQotCi1lbmRfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCi17Ci0gICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB3aG9sZSBpbWFnZSBoYXMgYmVlbiByZWFkLAotICAgICogaW5jbHVkaW5nIGFueSBjaHVua3MgYWZ0ZXIgdGhlIGltYWdlICh1cCB0byBhbmQgaW5jbHVkaW5nCi0gICAgKiB0aGUgSUVORCkuICBZb3Ugd2lsbCB1c3VhbGx5IGhhdmUgdGhlIHNhbWUgaW5mbyBjaHVuayBhcyB5b3UKLSAgICAqIGhhZCBpbiB0aGUgaGVhZGVyLCBhbHRob3VnaCBzb21lIGRhdGEgbWF5IGhhdmUgYmVlbiBhZGRlZAotICAgICogdG8gdGhlIGNvbW1lbnRzIGFuZCB0aW1lIGZpZWxkcy4KLSAgICAqCi0gICAgKiBNb3N0IHBlb3BsZSB3b24ndCBkbyBtdWNoIGhlcmUsIHBlcmhhcHMgc2V0dGluZyBhIGZsYWcgdGhhdAotICAgICogbWFya3MgdGhlIGltYWdlIGFzIGZpbmlzaGVkLgotICAgICovCi19Ci0KLS8qIFdyaXRlIGEgcG5nIGZpbGUgKi8KLXZvaWQgd3JpdGVfcG5nKGNoYXIgKmZpbGVfbmFtZSAvKiAsIC4uLiBvdGhlciBpbWFnZSBpbmZvcm1hdGlvbiAuLi4gKi8pCi17Ci0gICBGSUxFICpmcDsKLSAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7Ci0gICBwbmdfaW5mb3AgaW5mb19wdHI7Ci0gICBwbmdfY29sb3JwIHBhbGV0dGU7Ci0KLSAgIC8qIE9wZW4gdGhlIGZpbGUgKi8KLSAgIGZwID0gZm9wZW4oZmlsZV9uYW1lLCAid2IiKTsKLSAgIGlmIChmcCA9PSBOVUxMKQotICAgICAgcmV0dXJuIChFUlJPUik7Ci0KLSAgIC8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgcG5nX3N0cnVjdCB3aXRoIHRoZSBkZXNpcmVkIGVycm9yIGhhbmRsZXIKLSAgICAqIGZ1bmN0aW9ucy4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgZGVmYXVsdCBzdGRlcnIgYW5kIGxvbmdqdW1wIG1ldGhvZCwKLSAgICAqIHlvdSBjYW4gc3VwcGx5IE5VTEwgZm9yIHRoZSBsYXN0IHRocmVlIHBhcmFtZXRlcnMuICBXZSBhbHNvIGNoZWNrIHRoYXQKLSAgICAqIHRoZSBsaWJyYXJ5IHZlcnNpb24gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvbmUgdXNlZCBhdCBjb21waWxlIHRpbWUsCi0gICAgKiBpbiBjYXNlIHdlIGFyZSB1c2luZyBkeW5hbWljYWxseSBsaW5rZWQgbGlicmFyaWVzLiAgUkVRVUlSRUQuCi0gICAgKi8KLSAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsCi0gICAgICBwbmdfdm9pZHAgdXNlcl9lcnJvcl9wdHIsIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICB7Ci0gICAgICBmY2xvc2UoZnApOwotICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICB9Ci0KLSAgIC8qIEFsbG9jYXRlL2luaXRpYWxpemUgdGhlIGltYWdlIGluZm9ybWF0aW9uIGRhdGEuICBSRVFVSVJFRCAqLwotICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgaWYgKGluZm9fcHRyID09IE5VTEwpCi0gICB7Ci0gICAgICBmY2xvc2UoZnApOwotICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAgcG5nX2luZm9wcF9OVUxMKTsKLSAgICAgIHJldHVybiAoRVJST1IpOwotICAgfQotCi0gICAvKiBTZXQgZXJyb3IgaGFuZGxpbmcuICBSRVFVSVJFRCBpZiB5b3UgYXJlbid0IHN1cHBseWluZyB5b3VyIG93bgotICAgICogZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zIGluIHRoZSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpIGNhbGwuCi0gICAgKi8KLSAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICB7Ci0gICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGFkIGEgcHJvYmxlbSB3cml0aW5nIHRoZSBmaWxlICovCi0gICAgICBmY2xvc2UoZnApOwotICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICB9Ci0KLSAgIC8qIE9uZSBvZiB0aGUgZm9sbG93aW5nIEkvTyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgaXMgUkVRVUlSRUQgKi8KLQotI2lmZGVmIHN0cmVhbXMgLyogSS9PIGluaXRpYWxpemF0aW9uIG1ldGhvZCAxICovCi0gICAvKiBTZXQgdXAgdGhlIG91dHB1dCBjb250cm9sIGlmIHlvdSBhcmUgdXNpbmcgc3RhbmRhcmQgQyBzdHJlYW1zICovCi0gICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmcCk7Ci0KLSNlbHNlIG5vX3N0cmVhbXMgLyogSS9PIGluaXRpYWxpemF0aW9uIG1ldGhvZCAyICovCi0gICAvKiBJZiB5b3UgYXJlIHVzaW5nIHJlcGxhY2VtZW50IHdyaXRlIGZ1bmN0aW9ucywgaW5zdGVhZCBvZiBjYWxsaW5nCi0gICAgKiBwbmdfaW5pdF9pbygpIGhlcmUgeW91IHdvdWxkIGNhbGwKLSAgICAqLwotICAgcG5nX3NldF93cml0ZV9mbihwbmdfcHRyLCAodm9pZCAqKXVzZXJfaW9fcHRyLCB1c2VyX3dyaXRlX2ZuLAotICAgICAgdXNlcl9JT19mbHVzaF9mdW5jdGlvbik7Ci0gICAvKiB3aGVyZSB1c2VyX2lvX3B0ciBpcyBhIHN0cnVjdHVyZSB5b3Ugd2FudCBhdmFpbGFibGUgdG8gdGhlIGNhbGxiYWNrcyAqLwotI2VuZGlmIG5vX3N0cmVhbXMgLyogT25seSB1c2Ugb25lIGluaXRpYWxpemF0aW9uIG1ldGhvZCAqLwotCi0jaWZkZWYgaGlsZXZlbAotICAgLyogVGhpcyBpcyB0aGUgZWFzeSB3YXkuICBVc2UgaXQgaWYgeW91IGFscmVhZHkgaGF2ZSBhbGwgdGhlCi0gICAgKiBpbWFnZSBpbmZvIGxpdmluZyBpbiB0aGUgc3RydWN0dXJlLiAgWW91IGNvdWxkICJ8IiBtYW55Ci0gICAgKiBQTkdfVFJBTlNGT1JNIGZsYWdzIGludG8gdGhlIHBuZ190cmFuc2Zvcm1zIGludGVnZXIgaGVyZS4KLSAgICAqLwotICAgcG5nX3dyaXRlX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIHBuZ192b2lkcF9OVUxMKTsKLQotI2Vsc2UKLSAgIC8qIFRoaXMgaXMgdGhlIGhhcmQgd2F5ICovCi0KLSAgIC8qIFNldCB0aGUgaW1hZ2UgaW5mb3JtYXRpb24gaGVyZS4gIFdpZHRoIGFuZCBoZWlnaHQgYXJlIHVwIHRvIDJeMzEsCi0gICAgKiBiaXRfZGVwdGggaXMgb25lIG9mIDEsIDIsIDQsIDgsIG9yIDE2LCBidXQgdmFsaWQgdmFsdWVzIGFsc28gZGVwZW5kIG9uCi0gICAgKiB0aGUgY29sb3JfdHlwZSBzZWxlY3RlZC4gY29sb3JfdHlwZSBpcyBvbmUgb2YgUE5HX0NPTE9SX1RZUEVfR1JBWSwKLSAgICAqIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEsIFBOR19DT0xPUl9UWVBFX1BBTEVUVEUsIFBOR19DT0xPUl9UWVBFX1JHQiwKLSAgICAqIG9yIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQS4gIGludGVybGFjZSBpcyBlaXRoZXIgUE5HX0lOVEVSTEFDRV9OT05FIG9yCi0gICAgKiBQTkdfSU5URVJMQUNFX0FEQU03LCBhbmQgdGhlIGNvbXByZXNzaW9uX3R5cGUgYW5kIGZpbHRlcl90eXBlIE1VU1QKLSAgICAqIGN1cnJlbnRseSBiZSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIGFuZCBQTkdfRklMVEVSX1RZUEVfQkFTRS4gUkVRVUlSRUQKLSAgICAqLwotICAgcG5nX3NldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCB3aWR0aCwgaGVpZ2h0LCBiaXRfZGVwdGgsIFBOR19DT0xPUl9UWVBFXz8/PywKLSAgICAgIFBOR19JTlRFUkxBQ0VfPz8/PywgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOwotCi0gICAvKiBTZXQgdGhlIHBhbGV0dGUgaWYgdGhlcmUgaXMgb25lLiAgUkVRVUlSRUQgZm9yIGluZGV4ZWQtY29sb3IgaW1hZ2VzICovCi0gICBwYWxldHRlID0gKHBuZ19jb2xvcnApcG5nX21hbGxvYyhwbmdfcHRyLCBQTkdfTUFYX1BBTEVUVEVfTEVOR1RICi0gICAgICAgICAgICAgKiBwbmdfc2l6ZW9mKHBuZ19jb2xvcikpOwotICAgLyogLi4uIFNldCBwYWxldHRlIGNvbG9ycyAuLi4gKi8KLSAgIHBuZ19zZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgcGFsZXR0ZSwgUE5HX01BWF9QQUxFVFRFX0xFTkdUSCk7Ci0gICAvKiBZb3UgbXVzdCBub3QgZnJlZSBwYWxldHRlIGhlcmUsIGJlY2F1c2UgcG5nX3NldF9QTFRFIG9ubHkgbWFrZXMgYSBsaW5rIHRvCi0gICAgKiB0aGUgcGFsZXR0ZSB0aGF0IHlvdSBtYWxsb2NlZC4gIFdhaXQgdW50aWwgeW91IGFyZSBhYm91dCB0byBkZXN0cm95Ci0gICAgKiB0aGUgcG5nIHN0cnVjdHVyZS4KLSAgICAqLwotCi0gICAvKiBPcHRpb25hbCBzaWduaWZpY2FudCBiaXQgKHNCSVQpIGNodW5rICovCi0gICBwbmdfY29sb3JfOCBzaWdfYml0OwotICAgLyogSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGdyYXlzY2FsZSBpbWFnZSB0aGVuICovCi0gICBzaWdfYml0LmdyYXkgPSB0cnVlX2JpdF9kZXB0aDsKLSAgIC8qIE90aGVyd2lzZSwgaWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGNvbG9yIGltYWdlIHRoZW4gKi8KLSAgIHNpZ19iaXQucmVkID0gdHJ1ZV9yZWRfYml0X2RlcHRoOwotICAgc2lnX2JpdC5ncmVlbiA9IHRydWVfZ3JlZW5fYml0X2RlcHRoOwotICAgc2lnX2JpdC5ibHVlID0gdHJ1ZV9ibHVlX2JpdF9kZXB0aDsKLSAgIC8qIElmIHRoZSBpbWFnZSBoYXMgYW4gYWxwaGEgY2hhbm5lbCB0aGVuICovCi0gICBzaWdfYml0LmFscGhhID0gdHJ1ZV9hbHBoYV9iaXRfZGVwdGg7Ci0gICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICZzaWdfYml0KTsKLQotCi0gICAvKiBPcHRpb25hbCBnYW1tYSBjaHVuayBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgaWYgeW91IGhhdmUgYW55IGd1ZXNzCi0gICAgKiBhcyB0byB0aGUgY29ycmVjdCBnYW1tYSBvZiB0aGUgaW1hZ2UuCi0gICAgKi8KLSAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgZ2FtbWEpOwotCi0gICAvKiBPcHRpb25hbGx5IHdyaXRlIGNvbW1lbnRzIGludG8gdGhlIGltYWdlICovCi0gICB0ZXh0X3B0clswXS5rZXkgPSAiVGl0bGUiOwotICAgdGV4dF9wdHJbMF0udGV4dCA9ICJNb25hIExpc2EiOwotICAgdGV4dF9wdHJbMF0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOwotICAgdGV4dF9wdHJbMV0ua2V5ID0gIkF1dGhvciI7Ci0gICB0ZXh0X3B0clsxXS50ZXh0ID0gIkxlb25hcmRvIERhVmluY2kiOwotICAgdGV4dF9wdHJbMV0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOwotICAgdGV4dF9wdHJbMl0ua2V5ID0gIkRlc2NyaXB0aW9uIjsKLSAgIHRleHRfcHRyWzJdLnRleHQgPSAiPGxvbmcgdGV4dD4iOwotICAgdGV4dF9wdHJbMl0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0OwotI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAotICAgdGV4dF9wdHJbMF0ubGFuZyA9IE5VTEw7Ci0gICB0ZXh0X3B0clsxXS5sYW5nID0gTlVMTDsKLSAgIHRleHRfcHRyWzJdLmxhbmcgPSBOVUxMOwotI2VuZGlmCi0gICBwbmdfc2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsIHRleHRfcHRyLCAzKTsKLQotICAgLyogT3RoZXIgb3B0aW9uYWwgY2h1bmtzIGxpa2UgY0hSTSwgYktHRCwgdFJOUywgdElNRSwgb0ZGcywgcEhZcyAqLwotCi0gICAvKiBOb3RlIHRoYXQgaWYgc1JHQiBpcyBwcmVzZW50IHRoZSBnQU1BIGFuZCBjSFJNIGNodW5rcyBtdXN0IGJlIGlnbm9yZWQKLSAgICAqIG9uIHJlYWQgYW5kLCBpZiB5b3VyIGFwcGxpY2F0aW9uIGNob29zZXMgdG8gd3JpdGUgdGhlbSwgdGhleSBtdXN0Ci0gICAgKiBiZSB3cml0dGVuIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgc1JHQiBwcm9maWxlCi0gICAgKi8KLQotICAgLyogV3JpdGUgdGhlIGZpbGUgaGVhZGVyIGluZm9ybWF0aW9uLiAgUkVRVUlSRUQgKi8KLSAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgLyogSWYgeW91IHdhbnQsIHlvdSBjYW4gd3JpdGUgdGhlIGluZm8gaW4gdHdvIHN0ZXBzLCBpbiBjYXNlIHlvdSBuZWVkIHRvCi0gICAgKiB3cml0ZSB5b3VyIHByaXZhdGUgY2h1bmsgYWhlYWQgb2YgUExURToKLSAgICAqCi0gICAgKiAgIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIpOwotICAgICogICB3cml0ZV9teV9jaHVuaygpOwotICAgICogICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgKgotICAgICogSG93ZXZlciwgZ2l2ZW4gdGhlIGxldmVsIG9mIGtub3duLSBhbmQgdW5rbm93bi1jaHVuayBzdXBwb3J0IGluIDEuMi4wCi0gICAgKiBhbmQgdXAsIHRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBuZWNlc3NhcnkuCi0gICAgKi8KLQotICAgLyogT25jZSB3ZSB3cml0ZSBvdXQgdGhlIGhlYWRlciwgdGhlIGNvbXByZXNzaW9uIHR5cGUgb24gdGhlIHRleHQKLSAgICAqIGNodW5rcyBnZXRzIGNoYW5nZWQgdG8gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORV9XUiBvcgotICAgICogUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUiwgc28gaXQgZG9lc24ndCBnZXQgd3JpdHRlbiBvdXQgYWdhaW4KLSAgICAqIGF0IHRoZSBlbmQuCi0gICAgKi8KLQotICAgLyogU2V0IHVwIHRoZSB0cmFuc2Zvcm1hdGlvbnMgeW91IHdhbnQuICBOb3RlIHRoYXQgdGhlc2UgYXJlCi0gICAgKiBhbGwgb3B0aW9uYWwuICBPbmx5IGNhbGwgdGhlbSBpZiB5b3Ugd2FudCB0aGVtLgotICAgICovCi0KLSAgIC8qIEludmVydCBtb25vY2hyb21lIHBpeGVscyAqLwotICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKLQotICAgLyogU2hpZnQgdGhlIHBpeGVscyB1cCB0byBhIGxlZ2FsIGJpdCBkZXB0aCBhbmQgZmlsbCBpbgotICAgICogYXMgYXBwcm9wcmlhdGUgdG8gY29ycmVjdGx5IHNjYWxlIHRoZSBpbWFnZS4KLSAgICAqLwotICAgcG5nX3NldF9zaGlmdChwbmdfcHRyLCAmc2lnX2JpdCk7Ci0KLSAgIC8qIFBhY2sgcGl4ZWxzIGludG8gYnl0ZXMgKi8KLSAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKLQotICAgLyogU3dhcCBsb2NhdGlvbiBvZiBhbHBoYSBieXRlcyBmcm9tIEFSR0IgdG8gUkdCQSAqLwotICAgcG5nX3NldF9zd2FwX2FscGhhKHBuZ19wdHIpOwotCi0gICAvKiBHZXQgcmlkIG9mIGZpbGxlciAoT1IgQUxQSEEpIGJ5dGVzLCBwYWNrIFhSR0IvUkdCWC9BUkdCL1JHQkEgaW50bwotICAgICogUkdCICg0IGNoYW5uZWxzIC0+IDMgY2hhbm5lbHMpLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBub3QgdXNlZC4KLSAgICAqLwotICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgMCwgUE5HX0ZJTExFUl9CRUZPUkUpOwotCi0gICAvKiBGbGlwIEJHUiBwaXhlbHMgdG8gUkdCICovCi0gICBwbmdfc2V0X2JncihwbmdfcHRyKTsKLQotICAgLyogU3dhcCBieXRlcyBvZiAxNi1iaXQgZmlsZXMgdG8gbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0ICovCi0gICBwbmdfc2V0X3N3YXAocG5nX3B0cik7Ci0KLSAgIC8qIFN3YXAgYml0cyBvZiAxLCAyLCA0IGJpdCBwYWNrZWQgcGl4ZWwgZm9ybWF0cyAqLwotICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKLQotICAgLyogVHVybiBvbiBpbnRlcmxhY2UgaGFuZGxpbmcgaWYgeW91IGFyZSBub3QgdXNpbmcgcG5nX3dyaXRlX2ltYWdlKCkgKi8KLSAgIGlmIChpbnRlcmxhY2luZykKLSAgICAgIG51bWJlcl9wYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLSAgIGVsc2UKLSAgICAgIG51bWJlcl9wYXNzZXMgPSAxOwotCi0gICAvKiBUaGUgZWFzaWVzdCB3YXkgdG8gd3JpdGUgdGhlIGltYWdlICh5b3UgbWF5IGhhdmUgYSBkaWZmZXJlbnQgbWVtb3J5Ci0gICAgKiBsYXlvdXQsIGhvd2V2ZXIsIHNvIGNob29zZSB3aGF0IGZpdHMgeW91ciBuZWVkcyBiZXN0KS4gIFlvdSBuZWVkIHRvCi0gICAgKiB1c2UgdGhlIGZpcnN0IG1ldGhvZCBpZiB5b3UgYXJlbid0IGhhbmRsaW5nIGludGVybGFjaW5nIHlvdXJzZWxmLgotICAgICovCi0gICBwbmdfdWludF8zMiBrLCBoZWlnaHQsIHdpZHRoOwotICAgcG5nX2J5dGUgaW1hZ2VbaGVpZ2h0XVt3aWR0aCpieXRlc19wZXJfcGl4ZWxdOwotICAgcG5nX2J5dGVwIHJvd19wb2ludGVyc1toZWlnaHRdOwotCi0gICBpZiAoaGVpZ2h0ID4gUE5HX1VJTlRfMzJfTUFYL3BuZ19zaXplb2YocG5nX2J5dGVwKSkKLSAgICAgcG5nX2Vycm9yIChwbmdfcHRyLCAiSW1hZ2UgaXMgdG9vIHRhbGwgdG8gcHJvY2VzcyBpbiBtZW1vcnkiKTsKLQotICAgZm9yIChrID0gMDsgayA8IGhlaWdodDsgaysrKQotICAgICByb3dfcG9pbnRlcnNba10gPSBpbWFnZSArIGsqd2lkdGgqYnl0ZXNfcGVyX3BpeGVsOwotCi0gICAvKiBPbmUgb2YgdGhlIGZvbGxvd2luZyBvdXRwdXQgbWV0aG9kcyBpcyBSRVFVSVJFRCAqLwotCi0jaWZkZWYgZW50aXJlIC8qIFdyaXRlIG91dCB0aGUgZW50aXJlIGltYWdlIGRhdGEgaW4gb25lIGNhbGwgKi8KLSAgIHBuZ193cml0ZV9pbWFnZShwbmdfcHRyLCByb3dfcG9pbnRlcnMpOwotCi0gICAvKiBUaGUgb3RoZXIgd2F5IHRvIHdyaXRlIHRoZSBpbWFnZSAtIGRlYWwgd2l0aCBpbnRlcmxhY2luZyAqLwotCi0jZWxzZSBub19lbnRpcmUgLyogV3JpdGUgb3V0IHRoZSBpbWFnZSBkYXRhIGJ5IG9uZSBvciBtb3JlIHNjYW5saW5lcyAqLwotCi0gICAvKiBUaGUgbnVtYmVyIG9mIHBhc3NlcyBpcyBlaXRoZXIgMSBmb3Igbm9uLWludGVybGFjZWQgaW1hZ2VzLAotICAgICogb3IgNyBmb3IgaW50ZXJsYWNlZCBpbWFnZXMuCi0gICAgKi8KLSAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBudW1iZXJfcGFzc2VzOyBwYXNzKyspCi0gICB7Ci0gICAgICAvKiBXcml0ZSBhIGZldyByb3dzIGF0IGEgdGltZS4gKi8KLSAgICAgIHBuZ193cml0ZV9yb3dzKHBuZ19wdHIsICZyb3dfcG9pbnRlcnNbZmlyc3Rfcm93XSwgbnVtYmVyX29mX3Jvd3MpOwotCi0gICAgICAvKiBJZiB5b3UgYXJlIG9ubHkgd3JpdGluZyBvbmUgcm93IGF0IGEgdGltZSwgdGhpcyB3b3JrcyAqLwotICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQotICAgICAgICAgcG5nX3dyaXRlX3Jvd3MocG5nX3B0ciwgJnJvd19wb2ludGVyc1t5XSwgMSk7Ci0gICB9Ci0jZW5kaWYgbm9fZW50aXJlIC8qIFVzZSBvbmx5IG9uZSBvdXRwdXQgbWV0aG9kICovCi0KLSAgIC8qIFlvdSBjYW4gd3JpdGUgb3B0aW9uYWwgY2h1bmtzIGxpa2UgdEVYdCwgelRYdCwgYW5kIHRJTUUgYXQgdGhlIGVuZAotICAgICogYXMgd2VsbC4gIFNob3VsZG4ndCBiZSBuZWNlc3NhcnkgaW4gMS4yLjAgYW5kIHVwIGFzIGFsbCB0aGUgcHVibGljCi0gICAgKiBjaHVua3MgYXJlIHN1cHBvcnRlZCBhbmQgeW91IGNhbiB1c2UgcG5nX3NldF91bmtub3duX2NodW5rcygpIHRvCi0gICAgKiByZWdpc3RlciB1bmtub3duIGNodW5rcyBpbnRvIHRoZSBpbmZvIHN0cnVjdHVyZSB0byBiZSB3cml0dGVuIG91dC4KLSAgICAqLwotCi0gICAvKiBJdCBpcyBSRVFVSVJFRCB0byBjYWxsIHRoaXMgdG8gZmluaXNoIHdyaXRpbmcgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgKi8KLSAgIHBuZ193cml0ZV9lbmQocG5nX3B0ciwgaW5mb19wdHIpOwotI2VuZGlmIGhpbGV2ZWwKLQotICAgLyogSWYgeW91IHBuZ19tYWxsb2NlZCBhIHBhbGV0dGUsIGZyZWUgaXQgaGVyZSAoZG9uJ3QgZnJlZSBpbmZvX3B0ci0+cGFsZXR0ZSwKLSAgICAqIGFzIHJlY29tbWVuZGVkIGluIHZlcnNpb25zIDEuMC41bSBhbmQgZWFybGllciBvZiB0aGlzIGV4YW1wbGU7IGlmCi0gICAgKiBsaWJwbmcgbWFsbG9jcyBpbmZvX3B0ci0+cGFsZXR0ZSwgbGlicG5nIHdpbGwgZnJlZSBpdCkuICBJZiB5b3UKLSAgICAqIGFsbG9jYXRlZCBpdCB3aXRoIG1hbGxvYygpIGluc3RlYWQgb2YgcG5nX21hbGxvYygpLCB1c2UgZnJlZSgpIGluc3RlYWQKLSAgICAqIG9mIHBuZ19mcmVlKCkuCi0gICAgKi8KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBhbGV0dGUpOwotICAgcGFsZXR0ZSA9IE5VTEw7Ci0KLSAgIC8qIFNpbWlsYXJseSwgaWYgeW91IHBuZ19tYWxsb2NlZCBhbnkgZGF0YSB0aGF0IHlvdSBwYXNzZWQgaW4gd2l0aAotICAgICogcG5nX3NldF9zb21ldGhpbmcoKSwgc3VjaCBhcyBhIGhpc3Qgb3IgdHJhbnMgYXJyYXksIGZyZWUgaXQgaGVyZSwKLSAgICAqIHdoZW4geW91IGNhbiBiZSBzdXJlIHRoYXQgbGlicG5nIGlzIHRocm91Z2ggd2l0aCBpdC4KLSAgICAqLwotICAgcG5nX2ZyZWUocG5nX3B0ciwgdHJhbnMpOwotICAgdHJhbnMgPSBOVUxMOwotICAgLyogV2hlbmV2ZXIgeW91IHVzZSBwbmdfZnJlZSgpIGl0IGlzIGEgZ29vZCBpZGVhIHRvIHNldCB0aGUgcG9pbnRlciB0bwotICAgICogTlVMTCBpbiBjYXNlIHlvdXIgYXBwbGljYXRpb24gaW5hZHZlcnRlbnRseSB0cmllcyB0byBwbmdfZnJlZSgpIGl0Ci0gICAgKiBhZ2Fpbi4gIFdoZW4gcG5nX2ZyZWUoKSBzZWVzIGEgTlVMTCBpdCByZXR1cm5zIHdpdGhvdXQgYWN0aW9uLCB0aHVzCi0gICAgKiBhdm9pZGluZyB0aGUgZG91YmxlLWZyZWUgc2VjdXJpdHkgcHJvYmxlbS4KLSAgICAqLwotCi0gICAvKiBDbGVhbiB1cCBhZnRlciB0aGUgd3JpdGUsIGFuZCBmcmVlIGFueSBtZW1vcnkgYWxsb2NhdGVkICovCi0gICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7Ci0KLSAgIC8qIENsb3NlIHRoZSBmaWxlICovCi0gICBmY2xvc2UoZnApOwotCi0gICAvKiBUaGF0J3MgaXQgKi8KLSAgIHJldHVybiAoT0spOwotfQotCi0jZW5kaWYgLyogaWYgMCAqLwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvaW5zdGFsbC1zaCBiL2xpYnMvbGlicG5nL2luc3RhbGwtc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ODk3ZGUuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvaW5zdGFsbC1zaAorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0jIS9iaW4vc2gKLSMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCi0KLXNjcmlwdHZlcnNpb249MjAwNi0xMi0yNS4wMAotCi0jIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKLSMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCi0jIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCi0jCi0jIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KLSMKLSMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KLSMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKLSMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCi0jIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi0jIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0jCi0jIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0jIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotIwotIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCi0jIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KLSMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSMKLSMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKLSMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCi0jIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KLSMgdGl1bS4KLSMKLSMKLSMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KLSMKLSMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKLSMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKLSMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KLSMKLSMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgotIyBmcm9tIHNjcmF0Y2guCi0KLW5sPScKLScKLUlGUz0iICIiCSRubCIKLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9JHtET0lUUFJPRy19Ci1pZiB0ZXN0IC16ICIkZG9pdCI7IHRoZW4KLSAgZG9pdF9leGVjPWV4ZWMKLWVsc2UKLSAgZG9pdF9leGVjPSRkb2l0Ci1maQotCi0jIFB1dCBpbiBhYnNvbHV0ZSBmaWxlIG5hbWVzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOwotIyBvciB1c2UgZW52aXJvbm1lbnQgdmFycy4KLQotY2hncnBwcm9nPSR7Q0hHUlBQUk9HLWNoZ3JwfQotY2htb2Rwcm9nPSR7Q0hNT0RQUk9HLWNobW9kfQotY2hvd25wcm9nPSR7Q0hPV05QUk9HLWNob3dufQotY21wcHJvZz0ke0NNUFBST0ctY21wfQotY3Bwcm9nPSR7Q1BQUk9HLWNwfQotbWtkaXJwcm9nPSR7TUtESVJQUk9HLW1rZGlyfQotbXZwcm9nPSR7TVZQUk9HLW12fQotcm1wcm9nPSR7Uk1QUk9HLXJtfQotc3RyaXBwcm9nPSR7U1RSSVBQUk9HLXN0cmlwfQotCi1wb3NpeF9nbG9iPSc/JwotaW5pdGlhbGl6ZV9wb3NpeF9nbG9iPScKLSAgdGVzdCAiJHBvc2l4X2dsb2IiICE9ICI/IiB8fCB7Ci0gICAgaWYgKHNldCAtZikgMj4vZGV2L251bGw7IHRoZW4KLSAgICAgIHBvc2l4X2dsb2I9Ci0gICAgZWxzZQotICAgICAgcG9zaXhfZ2xvYj06Ci0gICAgZmkKLSAgfQotJwotCi1wb3NpeF9ta2Rpcj0KLQotIyBEZXNpcmVkIG1vZGUgb2YgaW5zdGFsbGVkIGZpbGUuCi1tb2RlPTA3NTUKLQotY2hncnBjbWQ9Ci1jaG1vZGNtZD0kY2htb2Rwcm9nCi1jaG93bmNtZD0KLW12Y21kPSRtdnByb2cKLXJtY21kPSIkcm1wcm9nIC1mIgotc3RyaXBjbWQ9Ci0KLXNyYz0KLWRzdD0KLWRpcl9hcmc9Ci1kc3RfYXJnPQotCi1jb3B5X29uX2NoYW5nZT1mYWxzZQotbm9fdGFyZ2V0X2RpcmVjdG9yeT0KLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQotICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQotICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgotICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCi0KLUluIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCi1JbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KLUluIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KLQotT3B0aW9uczoKLSAgICAgLS1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdC4KLSAgICAgLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KLQotICAtYyAgICAgICAgICAgIChpZ25vcmVkKQotICAtQyAgICAgICAgICAgIGluc3RhbGwgb25seSBpZiBkaWZmZXJlbnQgKHByZXNlcnZlIHRoZSBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uIHRpbWUpCi0gIC1kICAgICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KLSAgLWcgR1JPVVAgICAgICAkY2hncnBwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBHUk9VUC4KLSAgLW0gTU9ERSAgICAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgotICAtbyBVU0VSICAgICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCi0gIC1zICAgICAgICAgICAgJHN0cmlwcHJvZyBpbnN0YWxsZWQgZmlsZXMuCi0gIC10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KLSAgLVQgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KLQotRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgotICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDTVBQUk9HIENQUFJPRyBNS0RJUlBST0cgTVZQUk9HCi0gIFJNUFJPRyBTVFJJUFBST0cKLSIKLQotd2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC1jKSA7OwotCi0gICAgLUMpIGNvcHlfb25fY2hhbmdlPXRydWU7OwotCi0gICAgLWQpIGRpcl9hcmc9dHJ1ZTs7Ci0KLSAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCi0Jc2hpZnQ7OwotCi0gICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKLQotICAgIC1tKSBtb2RlPSQyCi0JY2FzZSAkbW9kZSBpbgotCSAgKicgJyogfCAqJwknKiB8IConCi0nKgkgIHwgKicqJyogfCAqJz8nKiB8IConWycqKQotCSAgICBlY2hvICIkMDogaW52YWxpZCBtb2RlOiAkbW9kZSIgPiYyCi0JICAgIGV4aXQgMTs7Ci0JZXNhYwotCXNoaWZ0OzsKLQotICAgIC1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKLQlzaGlmdDs7Ci0KLSAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZzs7Ci0KLSAgICAtdCkgZHN0X2FyZz0kMgotCXNoaWZ0OzsKLQotICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWU7OwotCi0gICAgLS12ZXJzaW9uKSBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgJD87OwotCi0gICAgLS0pCXNoaWZ0Ci0JYnJlYWs7OwotCi0gICAgLSopCWVjaG8gIiQwOiBpbnZhbGlkIG9wdGlvbjogJDEiID4mMgotCWV4aXQgMTs7Ci0KLSAgICAqKSAgYnJlYWs7OwotICBlc2FjCi0gIHNoaWZ0Ci1kb25lCi0KLWlmIHRlc3QgJCMgLW5lIDAgJiYgdGVzdCAteiAiJGRpcl9hcmckZHN0X2FyZyI7IHRoZW4KLSAgIyBXaGVuIC1kIGlzIHVzZWQsIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBkaXJlY3RvcmllcyB0byBjcmVhdGUuCi0gICMgV2hlbiAtdCBpcyB1c2VkLCB0aGUgZGVzdGluYXRpb24gaXMgYWxyZWFkeSBzcGVjaWZpZWQuCi0gICMgT3RoZXJ3aXNlLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgZGVzdGluYXRpb24uICBSZW1vdmUgaXQgZnJvbSAkQC4KLSAgZm9yIGFyZwotICBkbwotICAgIGlmIHRlc3QgLW4gIiRkc3RfYXJnIjsgdGhlbgotICAgICAgIyAkQCBpcyBub3QgZW1wdHk6IGl0IGNvbnRhaW5zIGF0IGxlYXN0ICRhcmcuCi0gICAgICBzZXQgZm5vcmQgIiRAIiAiJGRzdF9hcmciCi0gICAgICBzaGlmdCAjIGZub3JkCi0gICAgZmkKLSAgICBzaGlmdCAjIGFyZwotICAgIGRzdF9hcmc9JGFyZwotICBkb25lCi1maQotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgotICAgIGVjaG8gIiQwOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZC4iID4mMgotICAgIGV4aXQgMQotICBmaQotICAjIEl0J3MgT0sgdG8gY2FsbCBgaW5zdGFsbC1zaCAtZCcgd2l0aG91dCBhcmd1bWVudC4KLSAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBjcmVhdGluZyBjb25kaXRpb25hbCBkaXJlY3Rvcmllcy4KLSAgZXhpdCAwCi1maQotCi1pZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KLSAgdHJhcCAnKGV4aXQgJD8pOyBleGl0JyAxIDIgMTMgMTUKLQotICAjIFNldCB1bWFzayBzbyBhcyBub3QgdG8gY3JlYXRlIHRlbXBzIHdpdGggdG9vLWdlbmVyb3VzIG1vZGVzLgotICAjIEhvd2V2ZXIsICdzdHJpcCcgcmVxdWlyZXMgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gdGVtcHMuCi0gIGNhc2UgJG1vZGUgaW4KLSAgICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KLSAgICAqNjQ0KSBjcF91bWFzaz0xMzM7OwotICAgICo3NTUpIGNwX3VtYXNrPTIyOzsKLQotICAgICpbMC03XSkKLSAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KLQl1X3BsdXNfcnc9Ci0gICAgICBlbHNlCi0JdV9wbHVzX3J3PSclIDIwMCcKLSAgICAgIGZpCi0gICAgICBjcF91bWFzaz1gZXhwciAnKCcgNzc3IC0gJG1vZGUgJSAxMDAwICcpJyAkdV9wbHVzX3J3YDs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KLQl1X3BsdXNfcnc9Ci0gICAgICBlbHNlCi0JdV9wbHVzX3J3PSx1K3J3Ci0gICAgICBmaQotICAgICAgY3BfdW1hc2s9JG1vZGUkdV9wbHVzX3J3OzsKLSAgZXNhYwotZmkKLQotZm9yIHNyYwotZG8KLSAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgotICBjYXNlICRzcmMgaW4KLSAgICAtKikgc3JjPS4vJHNyYzs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLSAgICBkc3Q9JHNyYwotICAgIGRzdGRpcj0kZHN0Ci0gICAgdGVzdCAtZCAiJGRzdGRpciIKLSAgICBkc3RkaXJfc3RhdHVzPSQ/Ci0gIGVsc2UKLQotICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0gICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAotICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgotICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgotICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZHN0X2FyZyI7IHRoZW4KLSAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBkc3Q9JGRzdF9hcmcKLSAgICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCi0gICAgY2FzZSAkZHN0IGluCi0gICAgICAtKikgZHN0PS4vJGRzdDs7Ci0gICAgZXNhYwotCi0gICAgIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgd29uJ3Qgd29yawotICAgICMgaWYgZG91YmxlIHNsYXNoZXMgYXJlbid0IGlnbm9yZWQuCi0gICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLW4gIiRub190YXJnZXRfZGlyZWN0b3J5IjsgdGhlbgotCWVjaG8gIiQwOiAkZHN0X2FyZzogSXMgYSBkaXJlY3RvcnkiID4mMgotCWV4aXQgMQotICAgICAgZmkKLSAgICAgIGRzdGRpcj0kZHN0Ci0gICAgICBkc3Q9JGRzdGRpci9gYmFzZW5hbWUgIiRzcmMiYAotICAgICAgZHN0ZGlyX3N0YXR1cz0wCi0gICAgZWxzZQotICAgICAgIyBQcmVmZXIgZGlybmFtZSwgYnV0IGZhbGwgYmFjayBvbiBhIHN1YnN0aXR1dGUgaWYgZGlybmFtZSBmYWlscy4KLSAgICAgIGRzdGRpcj1gCi0JKGRpcm5hbWUgIiRkc3QiKSAyPi9kZXYvbnVsbCB8fAotCWV4cHIgWCIkZHN0IiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpJCcgXHwgXAotCSAgICAgWCIkZHN0IiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLQllY2hvIFgiJGRzdCIgfAotCSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQvewotCQkgICBzLy9cMS8KLQkJICAgcQotCQkgfQotCQkgL15YXChcL1wvXClbXi9dLiovewotCQkgICBzLy9cMS8KLQkJICAgcQotCQkgfQotCQkgL15YXChcL1wvXCkkL3sKLQkJICAgcy8vXDEvCi0JCSAgIHEKLQkJIH0KLQkJIC9eWFwoXC9cKS4qL3sKLQkJICAgcy8vXDEvCi0JCSAgIHEKLQkJIH0KLQkJIHMvLiovLi87IHEnCi0gICAgICBgCi0KLSAgICAgIHRlc3QgLWQgIiRkc3RkaXIiCi0gICAgICBkc3RkaXJfc3RhdHVzPSQ/Ci0gICAgZmkKLSAgZmkKLQotICBvYnNvbGV0ZV9ta2Rpcl91c2VkPWZhbHNlCi0KLSAgaWYgdGVzdCAkZHN0ZGlyX3N0YXR1cyAhPSAwOyB0aGVuCi0gICAgY2FzZSAkcG9zaXhfbWtkaXIgaW4KLSAgICAgICcnKQotCSMgQ3JlYXRlIGludGVybWVkaWF0ZSBkaXJzIHVzaW5nIG1vZGUgNzU1IGFzIG1vZGlmaWVkIGJ5IHRoZSB1bWFzay4KLQkjIFRoaXMgaXMgbGlrZSBGcmVlQlNEICdpbnN0YWxsJyBhcyBvZiAxOTk3LTEwLTI4LgotCXVtYXNrPWB1bWFza2AKLQljYXNlICRzdHJpcGNtZC4kdW1hc2sgaW4KLQkgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgotCSAgKlsyMzY3XVsyMzY3XSkgbWtkaXJfdW1hc2s9JHVtYXNrOzsKLQkgIC4qMFswMl1bMDJdIHwgLlswMl1bMDJdIHwgLlswMl0pIG1rZGlyX3VtYXNrPTIyOzsKLQotCSAgKlswLTddKQotCSAgICBta2Rpcl91bWFzaz1gZXhwciAkdW1hc2sgKyAyMiBcCi0JICAgICAgLSAkdW1hc2sgJSAxMDAgJSA0MCArICR1bWFzayAlIDIwIFwKLQkgICAgICAtICR1bWFzayAlIDEwICUgNCArICR1bWFzayAlIDIKLQkgICAgYDs7Ci0JICAqKSBta2Rpcl91bWFzaz0kdW1hc2ssZ28tdzs7Ci0JZXNhYwotCi0JIyBXaXRoIC1kLCBjcmVhdGUgdGhlIG5ldyBkaXJlY3Rvcnkgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgbW9kZS4KLQkjIE90aGVyd2lzZSwgcmVseSBvbiAkbWtkaXJfdW1hc2suCi0JaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCi0JICBta2Rpcl9tb2RlPS1tJG1vZGUKLQllbHNlCi0JICBta2Rpcl9tb2RlPQotCWZpCi0KLQlwb3NpeF9ta2Rpcj1mYWxzZQotCWNhc2UgJHVtYXNrIGluCi0JICAqWzEyMzU2N11bMC03XVswLTddKQotCSAgICAjIFBPU0lYIG1rZGlyIC1wIHNldHMgdSt3eCBiaXRzIHJlZ2FyZGxlc3Mgb2YgdW1hc2ssIHdoaWNoCi0JICAgICMgaXMgaW5jb21wYXRpYmxlIHdpdGggRnJlZUJTRCAnaW5zdGFsbCcgd2hlbiAodW1hc2sgJiAzMDApICE9IDAuCi0JICAgIDs7Ci0JICAqKQotCSAgICB0bXBkaXI9JHtUTVBESVItL3RtcH0vaW5zJFJBTkRPTS0kJAotCSAgICB0cmFwICdyZXQ9JD87IHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIiAyPi9kZXYvbnVsbDsgZXhpdCAkcmV0JyAwCi0KLQkgICAgaWYgKHVtYXNrICRta2Rpcl91bWFzayAmJgotCQlleGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiR0bXBkaXIvZCIpID4vZGV2L251bGwgMj4mMQotCSAgICB0aGVuCi0JICAgICAgaWYgdGVzdCAteiAiJGRpcl9hcmciIHx8IHsKLQkJICAgIyBDaGVjayBmb3IgUE9TSVggaW5jb21wYXRpYmlsaXRpZXMgd2l0aCAtbS4KLQkJICAgIyBIUC1VWCAxMS4yMyBhbmQgSVJJWCA2LjUgbWtkaXIgLW0gLXAgc2V0cyBncm91cC0gb3IKLQkJICAgIyBvdGhlci13cml0ZWFibGUgYml0IG9mIHBhcmVudCBkaXJlY3Rvcnkgd2hlbiBpdCBzaG91bGRuJ3QuCi0JCSAgICMgRnJlZUJTRCA2LjEgbWtkaXIgLW0gLXAgc2V0cyBtb2RlIG9mIGV4aXN0aW5nIGRpcmVjdG9yeS4KLQkJICAgbHNfbGRfdG1wZGlyPWBscyAtbGQgIiR0bXBkaXIiYAotCQkgICBjYXNlICRsc19sZF90bXBkaXIgaW4KLQkJICAgICBkPz8/Py0/ci0qKSBkaWZmZXJlbnRfbW9kZT03MDA7OwotCQkgICAgIGQ/Pz8/LT8tLSopIGRpZmZlcmVudF9tb2RlPTc1NTs7Ci0JCSAgICAgKikgZmFsc2U7OwotCQkgICBlc2FjICYmCi0JCSAgICRta2RpcnByb2cgLW0kZGlmZmVyZW50X21vZGUgLXAgLS0gIiR0bXBkaXIiICYmIHsKLQkJICAgICBsc19sZF90bXBkaXJfMT1gbHMgLWxkICIkdG1wZGlyImAKLQkJICAgICB0ZXN0ICIkbHNfbGRfdG1wZGlyIiA9ICIkbHNfbGRfdG1wZGlyXzEiCi0JCSAgIH0KLQkJIH0KLQkgICAgICB0aGVuIHBvc2l4X21rZGlyPToKLQkgICAgICBmaQotCSAgICAgIHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIgotCSAgICBlbHNlCi0JICAgICAgIyBSZW1vdmUgYW55IGRpcnMgbGVmdCBiZWhpbmQgYnkgYW5jaWVudCBta2RpciBpbXBsZW1lbnRhdGlvbnMuCi0JICAgICAgcm1kaXIgLi8kbWtkaXJfbW9kZSAuLy1wIC4vLS0gMj4vZGV2L251bGwKLQkgICAgZmkKLQkgICAgdHJhcCAnJyAwOzsKLQllc2FjOzsKLSAgICBlc2FjCi0KLSAgICBpZgotICAgICAgJHBvc2l4X21rZGlyICYmICgKLQl1bWFzayAkbWtkaXJfdW1hc2sgJiYKLQkkZG9pdF9leGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiRkc3RkaXIiCi0gICAgICApCi0gICAgdGhlbiA6Ci0gICAgZWxzZQotCi0gICAgICAjIFRoZSB1bWFzayBpcyByaWRpY3Vsb3VzLCBvciBta2RpciBkb2VzIG5vdCBjb25mb3JtIHRvIFBPU0lYLAotICAgICAgIyBvciBpdCBmYWlsZWQgcG9zc2libHkgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24uICBDcmVhdGUgdGhlCi0gICAgICAjIGRpcmVjdG9yeSB0aGUgc2xvdyB3YXksIHN0ZXAgYnkgc3RlcCwgY2hlY2tpbmcgZm9yIHJhY2VzIGFzIHdlIGdvLgotCi0gICAgICBjYXNlICRkc3RkaXIgaW4KLQkvKikgcHJlZml4PScvJzs7Ci0JLSopIHByZWZpeD0nLi8nOzsKLQkqKSAgcHJlZml4PScnOzsKLSAgICAgIGVzYWMKLQotICAgICAgZXZhbCAiJGluaXRpYWxpemVfcG9zaXhfZ2xvYiIKLQotICAgICAgb0lGUz0kSUZTCi0gICAgICBJRlM9LwotICAgICAgJHBvc2l4X2dsb2Igc2V0IC1mCi0gICAgICBzZXQgZm5vcmQgJGRzdGRpcgotICAgICAgc2hpZnQKLSAgICAgICRwb3NpeF9nbG9iIHNldCArZgotICAgICAgSUZTPSRvSUZTCi0KLSAgICAgIHByZWZpeGVzPQotCi0gICAgICBmb3IgZAotICAgICAgZG8KLQl0ZXN0IC16ICIkZCIgJiYgY29udGludWUKLQotCXByZWZpeD0kcHJlZml4JGQKLQlpZiB0ZXN0IC1kICIkcHJlZml4IjsgdGhlbgotCSAgcHJlZml4ZXM9Ci0JZWxzZQotCSAgaWYgJHBvc2l4X21rZGlyOyB0aGVuCi0JICAgICh1bWFzaz0kbWtkaXJfdW1hc2sgJiYKLQkgICAgICRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIpICYmIGJyZWFrCi0JICAgICMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KLQkgICAgdGVzdCAtZCAiJHByZWZpeCIgfHwgZXhpdCAxCi0JICBlbHNlCi0JICAgIGNhc2UgJHByZWZpeCBpbgotCSAgICAgICpcJyopIHFwcmVmaXg9YGVjaG8gIiRwcmVmaXgiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKLQkgICAgICAqKSBxcHJlZml4PSRwcmVmaXg7OwotCSAgICBlc2FjCi0JICAgIHByZWZpeGVzPSIkcHJlZml4ZXMgJyRxcHJlZml4JyIKLQkgIGZpCi0JZmkKLQlwcmVmaXg9JHByZWZpeC8KLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAtbiAiJHByZWZpeGVzIjsgdGhlbgotCSMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KLQkodW1hc2sgJG1rZGlyX3VtYXNrICYmCi0JIGV2YWwgIlwkZG9pdF9leGVjIFwkbWtkaXJwcm9nICRwcmVmaXhlcyIpIHx8Ci0JICB0ZXN0IC1kICIkZHN0ZGlyIiB8fCBleGl0IDEKLQlvYnNvbGV0ZV9ta2Rpcl91c2VkPXRydWUKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLQotICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLSAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSAmJgotICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9ICYmCi0gICAgeyB0ZXN0ICIkb2Jzb2xldGVfbWtkaXJfdXNlZCRjaG93bmNtZCRjaGdycGNtZCIgPSBmYWxzZSB8fAotICAgICAgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3QiOyB9IHx8IGV4aXQgMQotICBlbHNlCi0KLSAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgotICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXwotICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXwotCi0gICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KLSAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKLQotICAgICMgQ29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUuCi0gICAgKHVtYXNrICRjcF91bWFzayAmJiAkZG9pdF9leGVjICRjcHByb2cgIiRzcmMiICIkZHN0dG1wIikgJiYKLQotICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KLSAgICAjCi0gICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQotICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KLSAgICAjCi0gICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gJiYKLSAgICB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0dG1wIjsgfSAmJgotICAgIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3R0bXAiOyB9ICYmCi0gICAgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdHRtcCI7IH0gJiYKLQotICAgICMgSWYgLUMsIGRvbid0IGJvdGhlciB0byBjb3B5IGlmIGl0IHdvdWxkbid0IGNoYW5nZSB0aGUgZmlsZS4KLSAgICBpZiAkY29weV9vbl9jaGFuZ2UgJiYKLSAgICAgICBvbGQ9YExDX0FMTD1DIGxzIC1kbEwgIiRkc3QiCTI+L2Rldi9udWxsYCAmJgotICAgICAgIG5ldz1gTENfQUxMPUMgbHMgLWRsTCAiJGRzdHRtcCIJMj4vZGV2L251bGxgICYmCi0KLSAgICAgICBldmFsICIkaW5pdGlhbGl6ZV9wb3NpeF9nbG9iIiAmJgotICAgICAgICRwb3NpeF9nbG9iIHNldCAtZiAmJgotICAgICAgIHNldCBYICRvbGQgJiYgb2xkPTokMjokNDokNTokNiAmJgotICAgICAgIHNldCBYICRuZXcgJiYgbmV3PTokMjokNDokNTokNiAmJgotICAgICAgICRwb3NpeF9nbG9iIHNldCArZiAmJgotCi0gICAgICAgdGVzdCAiJG9sZCIgPSAiJG5ldyIgJiYKLSAgICAgICAkY21wcHJvZyAiJGRzdCIgIiRkc3R0bXAiID4vZGV2L251bGwgMj4mMQotICAgIHRoZW4KLSAgICAgIHJtIC1mICIkZHN0dG1wIgotICAgIGVsc2UKLSAgICAgICMgUmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotICAgICAgJGRvaXQgJG12Y21kIC1mICIkZHN0dG1wIiAiJGRzdCIgMj4vZGV2L251bGwgfHwKLQotICAgICAgIyBUaGUgcmVuYW1lIGZhaWxlZCwgcGVyaGFwcyBiZWNhdXNlIG12IGNhbid0IHJlbmFtZSBzb21ldGhpbmcgZWxzZQotICAgICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKLSAgICAgICMgc3VwcG9ydCAtZi4KLSAgICAgIHsKLQkjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCi0JIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKLQkjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCi0JIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3Ci0JIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KLQl7Ci0JICB0ZXN0ICEgLWYgIiRkc3QiIHx8Ci0JICAkZG9pdCAkcm1jbWQgLWYgIiRkc3QiIDI+L2Rldi9udWxsIHx8Ci0JICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdCIgIiRybXRtcCIgMj4vZGV2L251bGwgJiYKLQkgICAgeyAkZG9pdCAkcm1jbWQgLWYgIiRybXRtcCIgMj4vZGV2L251bGw7IDo7IH0KLQkgIH0gfHwKLQkgIHsgZWNobyAiJDA6IGNhbm5vdCB1bmxpbmsgb3IgcmVuYW1lICRkc3QiID4mMgotCSAgICAoZXhpdCAxKTsgZXhpdCAxCi0JICB9Ci0JfSAmJgotCi0JIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotCSRkb2l0ICRtdmNtZCAiJGRzdHRtcCIgIiRkc3QiCi0gICAgICB9Ci0gICAgZmkgfHwgZXhpdCAxCi0KLSAgICB0cmFwICcnIDAKLSAgZmkKLWRvbmUKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC1lbmQ6ICIkIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9saWJwbmctMS4yLjM3LnR4dCBiL2xpYnMvbGlicG5nL2xpYnBuZy0xLjIuMzcudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDg0NTJhLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2xpYnBuZy0xLjIuMzcudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzExNSArMCwwIEBACi1saWJwbmcudHh0IC0gQSBkZXNjcmlwdGlvbiBvbiBob3cgdG8gdXNlIGFuZCBtb2RpZnkgbGlicG5nCi0KLSBsaWJwbmcgdmVyc2lvbiAxLjIuMzcgLSBKdW5lIDQsIDIwMDkKLSBVcGRhdGVkIGFuZCBkaXN0cmlidXRlZCBieSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSA8Z2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQKLSBub3RpY2UgaW4gcG5nLmguCi0KLSBCYXNlZCBvbjoKLQotIGxpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS4yLjM3IC0gSnVuZSA0LCAyMDA5Ci0gVXBkYXRlZCBhbmQgZGlzdHJpYnV0ZWQgYnkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0KLSBsaWJwbmcgMS4wIGJldGEgNiAgdmVyc2lvbiAwLjk2IE1heSAyOCwgMTk5NwotIFVwZGF0ZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IEFuZHJlYXMgRGlsZ2VyCi0gQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0KLSBsaWJwbmcgMS4wIGJldGEgMiAtIHZlcnNpb24gMC44OCAgSmFudWFyeSAyNiwgMTk5NgotIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0Ci0gbm90aWNlIGluIHBuZy5oLiBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMKLSBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLQotIFVwZGF0ZWQvcmV3cml0dGVuIHBlciByZXF1ZXN0IGluIHRoZSBsaWJwbmcgRkFRCi0gQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEZyYW5rIEouIFQuIFdvamNpawotIERlY2VtYmVyIDE4LCAxOTk1ICYgSmFudWFyeSAyMCwgMTk5NgotCi1JLiBJbnRyb2R1Y3Rpb24KLQotVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gdXNlIGFuZCBtb2RpZnkgdGhlIFBORyByZWZlcmVuY2UgbGlicmFyeQotKGtub3duIGFzIGxpYnBuZykgZm9yIHlvdXIgb3duIHVzZS4gIFRoZXJlIGFyZSBmaXZlIHNlY3Rpb25zIHRvIHRoaXMKLWZpbGU6IGludHJvZHVjdGlvbiwgc3RydWN0dXJlcywgcmVhZGluZywgd3JpdGluZywgYW5kIG1vZGlmaWNhdGlvbiBhbmQKLWNvbmZpZ3VyYXRpb24gbm90ZXMgZm9yIHZhcmlvdXMgc3BlY2lhbCBwbGF0Zm9ybXMuICBJbiBhZGRpdGlvbiB0byB0aGlzCi1maWxlLCBleGFtcGxlLmMgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZyB0aGUgbGlicmFyeSwgYXMKLWl0IGlzIGhlYXZpbHkgY29tbWVudGVkIGFuZCBzaG91bGQgaW5jbHVkZSBldmVyeXRoaW5nIG1vc3QgcGVvcGxlCi13aWxsIG5lZWQuICBXZSBhc3N1bWUgdGhhdCBsaWJwbmcgaXMgYWxyZWFkeSBpbnN0YWxsZWQ7IHNlZSB0aGUKLUlOU1RBTEwgZmlsZSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBpbnN0YWxsIGxpYnBuZy4KLQotRm9yIGV4YW1wbGVzIG9mIGxpYnBuZyB1c2FnZSwgc2VlIHRoZSBmaWxlcyAiZXhhbXBsZS5jIiwgInBuZ3Rlc3QuYyIsCi1hbmQgdGhlIGZpbGVzIGluIHRoZSAiY29udHJpYiIgZGlyZWN0b3J5LCBhbGwgb2Ygd2hpY2ggYXJlIGluY2x1ZGVkIGluIHRoZQotbGlicG5nIGRpc3RyaWJ1dGlvbi4KLQotTGlicG5nIHdhcyB3cml0dGVuIGFzIGEgY29tcGFuaW9uIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgYXMgYSB3YXkKLW9mIHJlZHVjaW5nIHRoZSBhbW91bnQgb2YgdGltZSBhbmQgZWZmb3J0IGl0IHRha2VzIHRvIHN1cHBvcnQgdGhlIFBORwotZmlsZSBmb3JtYXQgaW4gYXBwbGljYXRpb24gcHJvZ3JhbXMuCi0KLVRoZSBQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pLCBOb3ZlbWJlciAyMDAzLCBpcyBhdmFpbGFibGUgYXMKLWEgVzNDIFJlY29tbWVuZGF0aW9uIGFuZCBhcyBhbiBJU08gU3RhbmRhcmQgKElTTy9JRUMgMTU5NDg6MjAwMyAoRSkpIGF0Ci08aHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9SRUMtUE5HLTIwMDMxMTEwLwotVGhlIFczQyBhbmQgSVNPIGRvY3VtZW50cyBoYXZlIGlkZW50aWNhbCB0ZWNobmljYWwgY29udGVudC4KLQotVGhlIFBORy0xLjIgc3BlY2lmaWNhdGlvbiBpcyBhdmFpbGFibGUgYXQKLTxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9kb2N1bWVudHMvPi4gIEl0IGlzIHRlY2huaWNhbGx5IGVxdWl2YWxlbnQKLXRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pIGJ1dCBoYXMgc29tZSBhZGRpdGlvbmFsIG1hdGVyaWFsLgotCi1UaGUgUE5HLTEuMCBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZQotYXMgUkZDIDIwODMgPGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL2RvY3VtZW50cy8+IGFuZCBhcyBhCi1XM0MgUmVjb21tZW5kYXRpb24gPGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy5wbmcuaHRtbD4uCi0KLVNvbWUgYWRkaXRpb25hbCBjaHVua3MgYXJlIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lhbC1wdXJwb3NlIHB1YmxpYyBjaHVua3MKLWRvY3VtZW50cyBhdCA8aHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvZG9jdW1lbnRzLz4uCi0KLU90aGVyIGluZm9ybWF0aW9uCi1hYm91dCBQTkcsIGFuZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgbGlicG5nLCBjYW4gYmUgZm91bmQgYXQgdGhlIFBORyBob21lCi1wYWdlLCA8aHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvPi4KLQotTW9zdCB1c2VycyB3aWxsIG5vdCBoYXZlIHRvIG1vZGlmeSB0aGUgbGlicmFyeSBzaWduaWZpY2FudGx5OyBhZHZhbmNlZAotdXNlcnMgbWF5IHdhbnQgdG8gbW9kaWZ5IGl0IG1vcmUuICBBbGwgYXR0ZW1wdHMgd2VyZSBtYWRlIHRvIG1ha2UgaXQgYXMKLWNvbXBsZXRlIGFzIHBvc3NpYmxlLCB3aGlsZSBrZWVwaW5nIHRoZSBjb2RlIGVhc3kgdG8gdW5kZXJzdGFuZC4KLUN1cnJlbnRseSwgdGhpcyBsaWJyYXJ5IG9ubHkgc3VwcG9ydHMgQy4gIFN1cHBvcnQgZm9yIG90aGVyIGxhbmd1YWdlcwotaXMgYmVpbmcgY29uc2lkZXJlZC4KLQotTGlicG5nIGhhcyBiZWVuIGRlc2lnbmVkIHRvIGhhbmRsZSBtdWx0aXBsZSBzZXNzaW9ucyBhdCBvbmUgdGltZSwKLXRvIGJlIGVhc2lseSBtb2RpZmlhYmxlLCB0byBiZSBwb3J0YWJsZSB0byB0aGUgdmFzdCBtYWpvcml0eSBvZgotbWFjaGluZXMgKEFOU0ksIEsmUiwgMTYtLCAzMi0sIGFuZCA2NC1iaXQpIGF2YWlsYWJsZSwgYW5kIHRvIGJlIGVhc3kKLXRvIHVzZS4gIFRoZSB1bHRpbWF0ZSBnb2FsIG9mIGxpYnBuZyBpcyB0byBwcm9tb3RlIHRoZSBhY2NlcHRhbmNlIG9mCi10aGUgUE5HIGZpbGUgZm9ybWF0IGluIHdoYXRldmVyIHdheSBwb3NzaWJsZS4gIFdoaWxlIHRoZXJlIGlzIHN0aWxsCi13b3JrIHRvIGJlIGRvbmUgKHNlZSB0aGUgVE9ETyBmaWxlKSwgbGlicG5nIHNob3VsZCBjb3ZlciB0aGUKLW1ham9yaXR5IG9mIHRoZSBuZWVkcyBvZiBpdHMgdXNlcnMuCi0KLUxpYnBuZyB1c2VzIHpsaWIgZm9yIGl0cyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvZiBQTkcgZmlsZXMuCi1GdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHpsaWIsIGFuZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgemxpYiwgY2FuCi1iZSBmb3VuZCBhdCB0aGUgemxpYiBob21lIHBhZ2UsIDxodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC96bGliLz4uCi1UaGUgemxpYiBjb21wcmVzc2lvbiB1dGlsaXR5IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIHV0aWxpdHkgdGhhdCBpcwotdXNlZnVsIGZvciBtb3JlIHRoYW4gUE5HIGZpbGVzLCBhbmQgY2FuIGJlIHVzZWQgd2l0aG91dCBsaWJwbmcuCi1TZWUgdGhlIGRvY3VtZW50YXRpb24gZGVsaXZlcmVkIHdpdGggemxpYiBmb3IgbW9yZSBkZXRhaWxzLgotWW91IGNhbiB1c3VhbGx5IGZpbmQgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlIHpsaWIgdXRpbGl0eSB3aGVyZXZlciB5b3UKLWZpbmQgdGhlIGxpYnBuZyBzb3VyY2UgZmlsZXMuCi0KLUxpYnBuZyBpcyB0aHJlYWQgc2FmZSwgcHJvdmlkZWQgdGhlIHRocmVhZHMgYXJlIHVzaW5nIGRpZmZlcmVudAotaW5zdGFuY2VzIG9mIHRoZSBzdHJ1Y3R1cmVzLiAgRWFjaCB0aHJlYWQgc2hvdWxkIGhhdmUgaXRzIG93bgotcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gaW5zdGFuY2VzLCBhbmQgdGh1cyBpdHMgb3duIGltYWdlLgotTGlicG5nIGRvZXMgbm90IHByb3RlY3QgaXRzZWxmIGFnYWluc3QgdHdvIHRocmVhZHMgdXNpbmcgdGhlCi1zYW1lIGluc3RhbmNlIG9mIGEgc3RydWN0dXJlLgotCi1JSS4gU3RydWN0dXJlcwotCi1UaGVyZSBhcmUgdHdvIG1haW4gc3RydWN0dXJlcyB0aGF0IGFyZSBpbXBvcnRhbnQgdG8gbGlicG5nLCBwbmdfc3RydWN0Ci1hbmQgcG5nX2luZm8uICBUaGUgZmlyc3QsIHBuZ19zdHJ1Y3QsIGlzIGFuIGludGVybmFsIHN0cnVjdHVyZSB0aGF0Ci13aWxsIG5vdCwgZm9yIHRoZSBtb3N0IHBhcnQsIGJlIHVzZWQgYnkgYSB1c2VyIGV4Y2VwdCBhcyB0aGUgZmlyc3QKLXZhcmlhYmxlIHBhc3NlZCB0byBldmVyeSBsaWJwbmcgZnVuY3Rpb24gY2FsbC4KLQotVGhlIHBuZ19pbmZvIHN0cnVjdHVyZSBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZQotUE5HIGZpbGUuICBBdCBvbmUgdGltZSwgdGhlIGZpZWxkcyBvZiBwbmdfaW5mbyB3ZXJlIGludGVuZGVkIHRvIGJlCi1kaXJlY3RseSBhY2Nlc3NpYmxlIHRvIHRoZSB1c2VyLiAgSG93ZXZlciwgdGhpcyB0ZW5kZWQgdG8gY2F1c2UgcHJvYmxlbXMKLXdpdGggYXBwbGljYXRpb25zIHVzaW5nIGR5bmFtaWNhbGx5IGxvYWRlZCBsaWJyYXJpZXMsIGFuZCBhcyBhIHJlc3VsdAotYSBzZXQgb2YgaW50ZXJmYWNlIGZ1bmN0aW9ucyBmb3IgcG5nX2luZm8gKHRoZSBwbmdfZ2V0XyooKSBhbmQgcG5nX3NldF8qKCkKLWZ1bmN0aW9ucykgd2FzIGRldmVsb3BlZC4gIFRoZSBmaWVsZHMgb2YgcG5nX2luZm8gYXJlIHN0aWxsIGF2YWlsYWJsZSBmb3IKLW9sZGVyIGFwcGxpY2F0aW9ucywgYnV0IGl0IGlzIHN1Z2dlc3RlZCB0aGF0IGFwcGxpY2F0aW9ucyB1c2UgdGhlIG5ldwotaW50ZXJmYWNlcyBpZiBhdCBhbGwgcG9zc2libGUuCi0KLUFwcGxpY2F0aW9ucyB0aGF0IGRvIG1ha2UgZGlyZWN0IGFjY2VzcyB0byB0aGUgbWVtYmVycyBvZiBwbmdfc3RydWN0IChleGNlcHQKLWZvciBwbmdfcHRyLT5qbXBidWYpIG11c3QgYmUgcmVjb21waWxlZCB3aGVuZXZlciB0aGUgbGlicmFyeSBpcyB1cGRhdGVkLAotYW5kIGFwcGxpY2F0aW9ucyB0aGF0IG1ha2UgZGlyZWN0IGFjY2VzcyB0byB0aGUgbWVtYmVycyBvZiBwbmdfaW5mbyBtdXN0Ci1iZSByZWNvbXBpbGVkIGlmIHRoZXkgd2VyZSBjb21waWxlZCBvciBsb2FkZWQgd2l0aCBsaWJwbmcgdmVyc2lvbiAxLjAuNiwKLWluIHdoaWNoIHRoZSBtZW1iZXJzIHdlcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXIuICBJbiB2ZXJzaW9uIDEuMC43LCB0aGUKLW1lbWJlcnMgb2YgdGhlIHBuZ19pbmZvIHN0cnVjdHVyZSByZXZlcnRlZCB0byB0aGUgb2xkIG9yZGVyLCBhcyB0aGV5IHdlcmUKLWluIHZlcnNpb25zIDAuOTdjIHRocm91Z2ggMS4wLjUuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMi4wLjAsIGJvdGgKLXN0cnVjdHVyZXMgYXJlIGdvaW5nIHRvIGJlIGhpZGRlbiwgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgc3RydWN0dXJlcyB3aWxsCi1vbmx5IGJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgcG5nX2dldC9wbmdfc2V0IGZ1bmN0aW9ucy4KLQotVGhlIHBuZy5oIGhlYWRlciBmaWxlIGlzIGFuIGludmFsdWFibGUgcmVmZXJlbmNlIGZvciBwcm9ncmFtbWluZyB3aXRoIGxpYnBuZy4KLUFuZCB3aGlsZSBJJ20gb24gdGhlIHRvcGljLCBtYWtlIHN1cmUgeW91IGluY2x1ZGUgdGhlIGxpYnBuZyBoZWFkZXIgZmlsZToKLQotI2luY2x1ZGUgPHBuZy5oPgotCi1JSUkuIFJlYWRpbmcKLQotV2UnbGwgbm93IHdhbGsgeW91IHRocm91Z2ggdGhlIHBvc3NpYmxlIGZ1bmN0aW9ucyB0byBjYWxsIHdoZW4gcmVhZGluZwotaW4gYSBQTkcgZmlsZSBzZXF1ZW50aWFsbHksIGJyaWVmbHkgZXhwbGFpbmluZyB0aGUgc3ludGF4IGFuZCBwdXJwb3NlCi1vZiBlYWNoIG9uZS4gIFNlZSBleGFtcGxlLmMgYW5kIHBuZy5oIGZvciBtb3JlIGRldGFpbC4gIFdoaWxlCi1wcm9ncmVzc2l2ZSByZWFkaW5nIGlzIGNvdmVyZWQgaW4gdGhlIG5leHQgc2VjdGlvbiwgeW91IHdpbGwgc3RpbGwKLW5lZWQgc29tZSBvZiB0aGUgZnVuY3Rpb25zIGRpc2N1c3NlZCBpbiB0aGlzIHNlY3Rpb24gdG8gcmVhZCBhIFBORwotZmlsZS4KLQotU2V0dXAKLQotWW91IHdpbGwgd2FudCB0byBkbyB0aGUgSS9PIGluaXRpYWxpemF0aW9uKCopIGJlZm9yZSB5b3UgZ2V0IGludG8gbGlicG5nLAotc28gaWYgaXQgZG9lc24ndCB3b3JrLCB5b3UgZG9uJ3QgaGF2ZSBtdWNoIHRvIHVuZG8uICBPZiBjb3Vyc2UsIHlvdQotd2lsbCBhbHNvIHdhbnQgdG8gaW5zdXJlIHRoYXQgeW91IGFyZSwgaW4gZmFjdCwgZGVhbGluZyB3aXRoIGEgUE5HCi1maWxlLiAgTGlicG5nIHByb3ZpZGVzIGEgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhIGZpbGUgaXMgYSBQTkcgZmlsZS4KLVRvIHVzZSBpdCwgcGFzcyBpbiB0aGUgZmlyc3QgMSB0byA4IGJ5dGVzIG9mIHRoZSBmaWxlIHRvIHRoZSBmdW5jdGlvbgotcG5nX3NpZ19jbXAoKSwgYW5kIGl0IHdpbGwgcmV0dXJuIDAgKGZhbHNlKSBpZiB0aGUgYnl0ZXMgbWF0Y2ggdGhlCi1jb3JyZXNwb25kaW5nIGJ5dGVzIG9mIHRoZSBQTkcgc2lnbmF0dXJlLCBvciBub256ZXJvICh0cnVlKSBvdGhlcndpc2UuCi1PZiBjb3Vyc2UsIHRoZSBtb3JlIGJ5dGVzIHlvdSBwYXNzIGluLCB0aGUgZ3JlYXRlciB0aGUgYWNjdXJhY3kgb2YgdGhlCi1wcmVkaWN0aW9uLgotCi1JZiB5b3UgYXJlIGludGVuZGluZyB0byBrZWVwIHRoZSBmaWxlIHBvaW50ZXIgb3BlbiBmb3IgdXNlIGluIGxpYnBuZywKLXlvdSBtdXN0IGVuc3VyZSB5b3UgZG9uJ3QgcmVhZCBtb3JlIHRoYW4gOCBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcKLW9mIHRoZSBmaWxlLCBhbmQgeW91IGFsc28gaGF2ZSB0byBtYWtlIGEgY2FsbCB0byBwbmdfc2V0X3NpZ19ieXRlc19yZWFkKCkKLXdpdGggdGhlIG51bWJlciBvZiBieXRlcyB5b3UgcmVhZCBmcm9tIHRoZSBiZWdpbm5pbmcuICBMaWJwbmcgd2lsbAotdGhlbiBvbmx5IGNoZWNrIHRoZSBieXRlcyAoaWYgYW55KSB0aGF0IHlvdXIgcHJvZ3JhbSBkaWRuJ3QgcmVhZC4KLQotKCopOiBJZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgc3RhbmRhcmQgSS9PIGZ1bmN0aW9ucywgeW91IHdpbGwgbmVlZAotdG8gcmVwbGFjZSB0aGVtIHdpdGggY3VzdG9tIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZGlzY3Vzc2lvbiB1bmRlcgotQ3VzdG9taXppbmcgbGlicG5nLgotCi0KLSAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIik7Ci0gICAgaWYgKCFmcCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLSAgICBmcmVhZChoZWFkZXIsIDEsIG51bWJlciwgZnApOwotICAgIGlzX3BuZyA9ICFwbmdfc2lnX2NtcChoZWFkZXIsIDAsIG51bWJlcik7Ci0gICAgaWYgKCFpc19wbmcpCi0gICAgewotICAgICAgICByZXR1cm4gKE5PVF9QTkcpOwotICAgIH0KLQotCi1OZXh0LCBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuICBJbgotb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHNpemUgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBjb3JyZWN0IGV2ZW4gd2l0aCBhCi1keW5hbWljYWxseSBsaW5rZWQgbGlicG5nLCB0aGVyZSBhcmUgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kCi1hbGxvY2F0ZSB0aGUgc3RydWN0dXJlcy4gIFdlIGFsc28gcGFzcyB0aGUgbGlicmFyeSB2ZXJzaW9uLCBvcHRpb25hbAotcG9pbnRlcnMgdG8gZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zLCBhbmQgYSBwb2ludGVyIHRvIGEgZGF0YSBzdHJ1Y3QgZm9yCi11c2UgYnkgdGhlIGVycm9yIGZ1bmN0aW9ucywgaWYgbmVjZXNzYXJ5ICh0aGUgcG9pbnRlciBhbmQgZnVuY3Rpb25zIGNhbgotYmUgTlVMTCBpZiB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVycyBhcmUgdG8gYmUgdXNlZCkuICBTZWUgdGhlIHNlY3Rpb24KLW9uIENoYW5nZXMgdG8gTGlicG5nIGJlbG93IHJlZ2FyZGluZyB0aGUgb2xkIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KLVRoZSBzdHJ1Y3R1cmUgYWxsb2NhdGlvbiBmdW5jdGlvbnMgcXVpZXRseSByZXR1cm4gTlVMTCBpZiB0aGV5IGZhaWwgdG8KLWNyZWF0ZSB0aGUgc3RydWN0dXJlLCBzbyB5b3VyIGFwcGxpY2F0aW9uIHNob3VsZCBjaGVjayBmb3IgdGhhdC4KLQotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0Ci0gICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKLSAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKLSAgICBpZiAoIXBuZ19wdHIpCi0gICAgICAgIHJldHVybiAoRVJST1IpOwotCi0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgICBpZiAoIWluZm9fcHRyKQotICAgIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsCi0gICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwsIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICBwbmdfaW5mb3AgZW5kX2luZm8gPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghZW5kX2luZm8pCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLUlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywKLWRlZmluZSBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEIGFuZCB1c2UKLXBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMigpIGluc3RlYWQgb2YgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpOgotCi0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMgotICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbiwgKHBuZ192b2lkcCkKLSAgICAgICAgdXNlcl9tZW1fcHRyLCB1c2VyX21hbGxvY19mbiwgdXNlcl9mcmVlX2ZuKTsKLQotVGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIHBhc3NlZCB0byBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCkKLWFuZCB0aGUgbWVtb3J5IGFsbG9jL2ZyZWUgcm91dGluZXMgcGFzc2VkIHRvIHBuZ19jcmVhdGVfc3RydWN0XzIoKQotYXJlIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBsaWJwbmcgc3VwcGxpZWQgZXJyb3IKLWhhbmRsaW5nIGFuZCBtZW1vcnkgYWxsb2MvZnJlZSBmdW5jdGlvbnMuCi0KLVdoZW4gbGlicG5nIGVuY291bnRlcnMgYW4gZXJyb3IsIGl0IGV4cGVjdHMgdG8gbG9uZ2ptcCBiYWNrCi10byB5b3VyIHJvdXRpbmUuICBUaGVyZWZvcmUsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBzZXRqbXAgYW5kIHBhc3MKLXlvdXIgcG5nX2ptcGJ1ZihwbmdfcHRyKS4gIElmIHlvdSByZWFkIHRoZSBmaWxlIGZyb20gZGlmZmVyZW50Ci1yb3V0aW5lcywgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlIGptcGJ1ZiBmaWVsZCBldmVyeSB0aW1lIHlvdSBlbnRlcgotYSBuZXcgcm91dGluZSB0aGF0IHdpbGwgY2FsbCBhIHBuZ18qKCkgZnVuY3Rpb24uCi0KLVNlZSB5b3VyIGRvY3VtZW50YXRpb24gb2Ygc2V0am1wL2xvbmdqbXAgZm9yIHlvdXIgY29tcGlsZXIgZm9yIG1vcmUKLWluZm9ybWF0aW9uIG9uIHNldGptcC9sb25nam1wLiAgU2VlIHRoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBlcnJvcgotaGFuZGxpbmcgaW4gdGhlIEN1c3RvbWl6aW5nIExpYnBuZyBzZWN0aW9uIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uCi1vbiB0aGUgbGlicG5nIGVycm9yIGhhbmRsaW5nLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCBhbmQgbGlicG5nIGxvbmdqbXAncwotYmFjayB0byB5b3VyIHNldGptcCwgeW91IHdpbGwgd2FudCB0byBjYWxsIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCkgdG8KLWZyZWUgYW55IG1lbW9yeS4KLQotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgICAmZW5kX2luZm8pOwotICAgICAgICBmY2xvc2UoZnApOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLUlmIHlvdSB3b3VsZCByYXRoZXIgYXZvaWQgdGhlIGNvbXBsZXhpdHkgb2Ygc2V0am1wL2xvbmdqbXAgaXNzdWVzLAoteW91IGNhbiBjb21waWxlIGxpYnBuZyB3aXRoIFBOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCwgaW4gd2hpY2ggY2FzZQotZXJyb3JzIHdpbGwgcmVzdWx0IGluIGEgY2FsbCB0byBQTkdfQUJPUlQoKSB3aGljaCBkZWZhdWx0cyB0byBhYm9ydCgpLgotCi1Ob3cgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBpbnB1dCBjb2RlLiAgVGhlIGRlZmF1bHQgZm9yIGxpYnBuZyBpcyB0bwotdXNlIHRoZSBDIGZ1bmN0aW9uIGZyZWFkKCkuICBJZiB5b3UgdXNlIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gcGFzcyBhCi12YWxpZCBGSUxFICogaW4gdGhlIGZ1bmN0aW9uIHBuZ19pbml0X2lvKCkuICBCZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMKLW9wZW5lZCBpbiBiaW5hcnkgbW9kZS4gIElmIHlvdSB3aXNoIHRvIGhhbmRsZSByZWFkaW5nIGRhdGEgaW4gYW5vdGhlcgotd2F5LCB5b3UgbmVlZCBub3QgY2FsbCB0aGUgcG5nX2luaXRfaW8oKSBmdW5jdGlvbiwgYnV0IHlvdSBtdXN0IHRoZW4KLWltcGxlbWVudCB0aGUgbGlicG5nIEkvTyBtZXRob2RzIGRpc2N1c3NlZCBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nCi1zZWN0aW9uIGJlbG93LgotCi0gICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOwotCi1JZiB5b3UgaGFkIHByZXZpb3VzbHkgb3BlbmVkIHRoZSBmaWxlIGFuZCByZWFkIGFueSBvZiB0aGUgc2lnbmF0dXJlIGZyb20KLXRoZSBiZWdpbm5pbmcgaW4gb3JkZXIgdG8gc2VlIGlmIHRoaXMgd2FzIGEgUE5HIGZpbGUsIHlvdSBuZWVkIHRvIGxldAotbGlicG5nIGtub3cgdGhhdCB0aGVyZSBhcmUgc29tZSBieXRlcyBtaXNzaW5nIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotCi0gICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgbnVtYmVyKTsKLQotU2V0dGluZyB1cCBjYWxsYmFjayBjb2RlCi0KLVlvdSBjYW4gc2V0IHVwIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGFueSB1bmtub3duIGNodW5rcyBpbiB0aGUKLWlucHV0IHN0cmVhbS4gWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgotCi0gICAgcmVhZF9jaHVua19jYWxsYmFjayhwbmdfcHRyIHB0ciwKLSAgICAgICAgIHBuZ191bmtub3duX2NodW5rcCBjaHVuayk7Ci0gICAgewotICAgICAgIC8qIFRoZSB1bmtub3duIGNodW5rIHN0cnVjdHVyZSBjb250YWlucyB5b3VyCi0gICAgICAgICAgY2h1bmsgZGF0YSwgYWxvbmcgd2l0aCBzaW1pbGFyIGRhdGEgZm9yIGFueSBvdGhlcgotICAgICAgICAgIHVua25vd24gY2h1bmtzOiAqLwotCi0gICAgICAgICAgIHBuZ19ieXRlIG5hbWVbNV07Ci0gICAgICAgICAgIHBuZ19ieXRlICpkYXRhOwotICAgICAgICAgICBwbmdfc2l6ZV90IHNpemU7Ci0KLSAgICAgICAvKiBOb3RlIHRoYXQgbGlicG5nIGhhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YKLSAgICAgICAgICB0aGUgQ1JDIGhhbmRsaW5nICovCi0KLSAgICAgICAvKiBwdXQgeW91ciBjb2RlIGhlcmUuICBTZWFyY2ggZm9yIHlvdXIgY2h1bmsgaW4gdGhlCi0gICAgICAgICAgdW5rbm93biBjaHVuayBzdHJ1Y3R1cmUsIHByb2Nlc3MgaXQsIGFuZCByZXR1cm4gb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZzogKi8KLQotICAgICAgIHJldHVybiAoLW4pOyAvKiBjaHVuayBoYWQgYW4gZXJyb3IgKi8KLSAgICAgICByZXR1cm4gKDApOyAvKiBkaWQgbm90IHJlY29nbml6ZSAqLwotICAgICAgIHJldHVybiAobik7IC8qIHN1Y2Nlc3MgKi8KLSAgICB9Ci0KLShZb3UgY2FuIGdpdmUgeW91ciBmdW5jdGlvbiBhbm90aGVyIG5hbWUgdGhhdCB5b3UgbGlrZSBpbnN0ZWFkIG9mCi0icmVhZF9jaHVua19jYWxsYmFjayIpCi0KLVRvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCi0KLSAgICBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbihwbmdfcHRyLCB1c2VyX2NodW5rX3B0ciwKLSAgICAgICAgcmVhZF9jaHVua19jYWxsYmFjayk7Ci0KLVRoaXMgbmFtZXMgbm90IG9ubHkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCBidXQgYWxzbyBhIHVzZXIgcG9pbnRlciB0aGF0Ci15b3UgY2FuIHJldHJpZXZlIHdpdGgKLQotICAgIHBuZ19nZXRfdXNlcl9jaHVua19wdHIocG5nX3B0cik7Ci0KLUlmIHlvdSBjYWxsIHRoZSBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbigpIGZ1bmN0aW9uLCB0aGVuIGFsbCB1bmtub3duCi1jaHVua3Mgd2lsbCBiZSBzYXZlZCB3aGVuIHJlYWQsIGluIGNhc2UgeW91ciBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIG5lZWQKLW9uZSBvciBtb3JlIG9mIHRoZW0uICBUaGlzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlCi1wbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSBmdW5jdGlvbiwgZGVzY3JpYmVkIGJlbG93LgotCi1BdCB0aGlzIHBvaW50LCB5b3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZQotY2FsbGVkIGFmdGVyIGVhY2ggcm93IGhhcyBiZWVuIHJlYWQsIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGNvbnRyb2wKLWEgcHJvZ3Jlc3MgbWV0ZXIgb3IgdGhlIGxpa2UuICBJdCdzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuCi1Zb3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvbgotCi0gICAgdm9pZCByZWFkX3Jvd19jYWxsYmFjayhwbmdfcHRyIHB0ciwgcG5nX3VpbnRfMzIgcm93LAotICAgICAgIGludCBwYXNzKTsKLSAgICB7Ci0gICAgICAvKiBwdXQgeW91ciBjb2RlIGhlcmUgKi8KLSAgICB9Ci0KLShZb3UgY2FuIGdpdmUgaXQgYW5vdGhlciBuYW1lIHRoYXQgeW91IGxpa2UgaW5zdGVhZCBvZiAicmVhZF9yb3dfY2FsbGJhY2siKQotCi1UbyBpbmZvcm0gbGlicG5nIGFib3V0IHlvdXIgZnVuY3Rpb24sIHVzZQotCi0gICAgcG5nX3NldF9yZWFkX3N0YXR1c19mbihwbmdfcHRyLCByZWFkX3Jvd19jYWxsYmFjayk7Ci0KLVdpZHRoIGFuZCBoZWlnaHQgbGltaXRzCi0KLVRoZSBQTkcgc3BlY2lmaWNhdGlvbiBhbGxvd3MgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYW4gaW1hZ2UgdG8gYmUgYXMKLWxhcmdlIGFzIDJeMzEtMSAoMHg3ZmZmZmZmZiksIG9yIGFib3V0IDIuMTQ3IGJpbGxpb24gcm93cyBhbmQgY29sdW1ucy4KLVNpbmNlIHZlcnkgZmV3IGFwcGxpY2F0aW9ucyByZWFsbHkgbmVlZCB0byBwcm9jZXNzIHN1Y2ggbGFyZ2UgaW1hZ2VzLAotd2UgaGF2ZSBpbXBvc2VkIGFuIGFyYml0cmFyeSAxLW1pbGxpb24gbGltaXQgb24gcm93cyBhbmQgY29sdW1ucy4KLUxhcmdlciBpbWFnZXMgd2lsbCBiZSByZWplY3RlZCBpbW1lZGlhdGVseSB3aXRoIGEgcG5nX2Vycm9yKCkgY2FsbC4gSWYKLXlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbGltaXQsIHlvdSBjYW4gdXNlCi0KLSAgIHBuZ19zZXRfdXNlcl9saW1pdHMocG5nX3B0ciwgd2lkdGhfbWF4LCBoZWlnaHRfbWF4KTsKLQotdG8gc2V0IHlvdXIgb3duIGxpbWl0cywgb3IgdXNlIHdpZHRoX21heCA9IGhlaWdodF9tYXggPSAweDdmZmZmZmZmTAotdG8gYWxsb3cgYWxsIHZhbGlkIGRpbWVuc2lvbnMgKGxpYnBuZyBtYXkgcmVqZWN0IHNvbWUgdmVyeSBsYXJnZSBpbWFnZXMKLWFueXdheSBiZWNhdXNlIG9mIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgY29uZGl0aW9ucykuCi0KLVlvdSBzaG91bGQgcHV0IHRoaXMgc3RhdGVtZW50IGFmdGVyIHlvdSBjcmVhdGUgdGhlIFBORyBzdHJ1Y3R1cmUgYW5kCi1iZWZvcmUgY2FsbGluZyBwbmdfcmVhZF9pbmZvKCksIHBuZ19yZWFkX3BuZygpLCBvciBwbmdfcHJvY2Vzc19kYXRhKCkuCi1JZiB5b3UgbmVlZCB0byByZXRyaWV2ZSB0aGUgbGltaXRzIHRoYXQgYXJlIGJlaW5nIGFwcGxpZWQsIHVzZQotCi0gICB3aWR0aF9tYXggPSBwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4KHBuZ19wdHIpOwotICAgaGVpZ2h0X21heCA9IHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4KHBuZ19wdHIpOwotCi1Vbmtub3duLWNodW5rIGhhbmRsaW5nCi0KLU5vdyB5b3UgZ2V0IHRvIHNldCB0aGUgd2F5IHRoZSBsaWJyYXJ5IHByb2Nlc3NlcyB1bmtub3duIGNodW5rcyBpbiB0aGUKLWlucHV0IFBORyBzdHJlYW0uIEJvdGgga25vd24gYW5kIHVua25vd24gY2h1bmtzIHdpbGwgYmUgcmVhZC4gIE5vcm1hbAotYmVoYXZpb3IgaXMgdGhhdCBrbm93biBjaHVua3Mgd2lsbCBiZSBwYXJzZWQgaW50byBpbmZvcm1hdGlvbiBpbgotdmFyaW91cyBpbmZvX3B0ciBtZW1iZXJzIHdoaWxlIHVua25vd24gY2h1bmtzIHdpbGwgYmUgZGlzY2FyZGVkLiBUaGlzCi1iZWhhdmlvciBjYW4gYmUgd2FzdGVmdWwgaWYgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIHVzZSBzb21lIGtub3duCi1jaHVuayB0eXBlcy4gVG8gY2hhbmdlIHRoaXMsIHlvdSBjYW4gY2FsbDoKLQotICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBrZWVwLAotICAgICAgICBjaHVua19saXN0LCBudW1fY2h1bmtzKTsKLSAgICBrZWVwICAgICAgIC0gMDogZGVmYXVsdCB1bmtub3duIGNodW5rIGhhbmRsaW5nCi0gICAgICAgICAgICAgICAgIDE6IGlnbm9yZTsgZG8gbm90IGtlZXAKLSAgICAgICAgICAgICAgICAgMjoga2VlcCBvbmx5IGlmIHNhZmUtdG8tY29weQotICAgICAgICAgICAgICAgICAzOiBrZWVwIGV2ZW4gaWYgdW5zYWZlLXRvLWNvcHkKLSAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoZXNlIGRlZmluaXRpb25zOgotICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQgICAwCi0gICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgICAgICAgIDEKLSAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICAgICAgMgotICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyAgICAgICAzCi0gICAgY2h1bmtfbGlzdCAtIGxpc3Qgb2YgY2h1bmtzIGFmZmVjdGVkIChhIGJ5dGUgc3RyaW5nLAotICAgICAgICAgICAgICAgICBmaXZlIGJ5dGVzIHBlciBjaHVuaywgTlVMTCBvciAnXDAnIGlmCi0gICAgICAgICAgICAgICAgIG51bV9jaHVua3MgaXMgMCkKLSAgICBudW1fY2h1bmtzIC0gbnVtYmVyIG9mIGNodW5rcyBhZmZlY3RlZDsgaWYgMCwgYWxsCi0gICAgICAgICAgICAgICAgIHVua25vd24gY2h1bmtzIGFyZSBhZmZlY3RlZC4gIElmIG5vbnplcm8sCi0gICAgICAgICAgICAgICAgIG9ubHkgdGhlIGNodW5rcyBpbiB0aGUgbGlzdCBhcmUgYWZmZWN0ZWQKLQotVW5rbm93biBjaHVua3MgZGVjbGFyZWQgaW4gdGhpcyB3YXkgd2lsbCBiZSBzYXZlZCBhcyByYXcgZGF0YSBvbnRvIGEKLWxpc3Qgb2YgcG5nX3Vua25vd25fY2h1bmsgc3RydWN0dXJlcy4gIElmIGEgY2h1bmsgdGhhdCBpcyBub3JtYWxseQota25vd24gdG8gbGlicG5nIGlzIG5hbWVkIGluIHRoZSBsaXN0LCBpdCB3aWxsIGJlIGhhbmRsZWQgYXMgdW5rbm93biwKLWFjY29yZGluZyB0byB0aGUgImtlZXAiIGRpcmVjdGl2ZS4gIElmIGEgY2h1bmsgaXMgbmFtZWQgaW4gc3VjY2Vzc2l2ZQotaW5zdGFuY2VzIG9mIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpLCB0aGUgZmluYWwgaW5zdGFuY2Ugd2lsbAotdGFrZSBwcmVjZWRlbmNlLiAgVGhlIElIRFIgYW5kIElFTkQgY2h1bmtzIHNob3VsZCBub3QgYmUgbmFtZWQgaW4KLWNodW5rX2xpc3Q7IGlmIHRoZXkgYXJlLCBsaWJwbmcgd2lsbCBwcm9jZXNzIHRoZW0gbm9ybWFsbHkgYW55d2F5LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIHVzYWdlIG9mIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpLAotd2hlcmUgdGhlIHByaXZhdGUgInZwQWciIGNodW5rIHdpbGwgbGF0ZXIgYmUgcHJvY2Vzc2VkIGJ5IGEgdXNlciBjaHVuawotY2FsbGJhY2sgZnVuY3Rpb246Ci0KLSAgICBwbmdfYnl0ZSB2cEFnWzVdPXsxMTgsIDExMiwgIDY1LCAxMDMsIChwbmdfYnl0ZSkgJ1wwJ307Ci0KLSAgICAjaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotICAgICAgcG5nX2J5dGUgdW51c2VkX2NodW5rc1tdPQotICAgICAgewotICAgICAgICAxMDQsICA3MywgIDgzLCAgODQsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBoSVNUICovCi0gICAgICAgIDEwNSwgIDg0LCAgODgsIDExNiwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIGlUWHQgKi8KLSAgICAgICAgMTEyLCAgNjcsICA2NSwgIDc2LCAocG5nX2J5dGUpICdcMCcsICAgLyogcENBTCAqLwotICAgICAgICAxMTUsICA2NywgIDY1LCAgNzYsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBzQ0FMICovCi0gICAgICAgIDExNSwgIDgwLCAgNzYsICA4NCwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHNQTFQgKi8KLSAgICAgICAgMTE2LCAgNzMsICA3NywgIDY5LCAocG5nX2J5dGUpICdcMCcsICAgLyogdElNRSAqLwotICAgICAgfTsKLSAgICAjZW5kaWYKLQotICAgIC4uLgotCi0gICAgI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgICAgIC8qIGlnbm9yZSBhbGwgdW5rbm93biBjaHVua3M6ICovCi0gICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDEsIE5VTEwsIDApOwotICAgICAgLyogZXhjZXB0IGZvciB2cEFnOiAqLwotICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCAyLCB2cEFnLCAxKTsKLSAgICAgIC8qIGFsc28gaWdub3JlIHVudXNlZCBrbm93biBjaHVua3M6ICovCi0gICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDEsIHVudXNlZF9jaHVua3MsCi0gICAgICAgICAoaW50KXNpemVvZih1bnVzZWRfY2h1bmtzKS81KTsKLSAgICAjZW5kaWYKLQotVXNlciBsaW1pdHMKLQotVGhlIFBORyBzcGVjaWZpY2F0aW9uIGFsbG93cyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBhbiBpbWFnZSB0byBiZSBhcwotbGFyZ2UgYXMgMl4zMS0xICgweDdmZmZmZmZmKSwgb3IgYWJvdXQgMi4xNDcgYmlsbGlvbiByb3dzIGFuZCBjb2x1bW5zLgotU2luY2UgdmVyeSBmZXcgYXBwbGljYXRpb25zIHJlYWxseSBuZWVkIHRvIHByb2Nlc3Mgc3VjaCBsYXJnZSBpbWFnZXMsCi13ZSBoYXZlIGltcG9zZWQgYW4gYXJiaXRyYXJ5IDEtbWlsbGlvbiBsaW1pdCBvbiByb3dzIGFuZCBjb2x1bW5zLgotTGFyZ2VyIGltYWdlcyB3aWxsIGJlIHJlamVjdGVkIGltbWVkaWF0ZWx5IHdpdGggYSBwbmdfZXJyb3IoKSBjYWxsLiBJZgoteW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBsaW1pdCwgeW91IGNhbiB1c2UKLQotICAgcG5nX3NldF91c2VyX2xpbWl0cyhwbmdfcHRyLCB3aWR0aF9tYXgsIGhlaWdodF9tYXgpOwotCi10byBzZXQgeW91ciBvd24gbGltaXRzLCBvciB1c2Ugd2lkdGhfbWF4ID0gaGVpZ2h0X21heCA9IDB4N2ZmZmZmZmZMCi10byBhbGxvdyBhbGwgdmFsaWQgZGltZW5zaW9ucyAobGlicG5nIG1heSByZWplY3Qgc29tZSB2ZXJ5IGxhcmdlIGltYWdlcwotYW55d2F5IGJlY2F1c2Ugb2YgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdyBjb25kaXRpb25zKS4KLQotWW91IHNob3VsZCBwdXQgdGhpcyBzdGF0ZW1lbnQgYWZ0ZXIgeW91IGNyZWF0ZSB0aGUgUE5HIHN0cnVjdHVyZSBhbmQKLWJlZm9yZSBjYWxsaW5nIHBuZ19yZWFkX2luZm8oKSwgcG5nX3JlYWRfcG5nKCksIG9yIHBuZ19wcm9jZXNzX2RhdGEoKS4KLUlmIHlvdSBuZWVkIHRvIHJldHJpZXZlIHRoZSBsaW1pdHMgdGhhdCBhcmUgYmVpbmcgYXBwbGllZCwgdXNlCi0KLSAgIHdpZHRoX21heCA9IHBuZ19nZXRfdXNlcl93aWR0aF9tYXgocG5nX3B0cik7Ci0gICBoZWlnaHRfbWF4ID0gcG5nX2dldF91c2VyX2hlaWdodF9tYXgocG5nX3B0cik7Ci0KLVRoZSBoaWdoLWxldmVsIHJlYWQgaW50ZXJmYWNlCi0KLUF0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHByb2NlZWQ7IHRocm91Z2ggdGhlIGhpZ2gtbGV2ZWwKLXJlYWQgaW50ZXJmYWNlLCBvciB0aHJvdWdoIGEgc2VxdWVuY2Ugb2YgbG93LWxldmVsIHJlYWQgb3BlcmF0aW9ucy4KLVlvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiAoYSkgeW91IGFyZSB3aWxsaW5nIHRvIHJlYWQKLXRoZSBlbnRpcmUgaW1hZ2UgaW50byBtZW1vcnksIGFuZCAoYikgdGhlIGlucHV0IHRyYW5zZm9ybWF0aW9ucwoteW91IHdhbnQgdG8gZG8gYXJlIGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBzZXQ6Ci0KLSAgICBQTkdfVFJBTlNGT1JNX0lERU5USVRZICAgICAgTm8gdHJhbnNmb3JtYXRpb24KLSAgICBQTkdfVFJBTlNGT1JNX1NUUklQXzE2ICAgICAgU3RyaXAgMTYtYml0IHNhbXBsZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCBiaXRzCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9BTFBIQSAgIERpc2NhcmQgdGhlIGFscGhhIGNoYW5uZWwKLSAgICBQTkdfVFJBTlNGT1JNX1BBQ0tJTkcgICAgICAgRXhwYW5kIDEsIDIgYW5kIDQtYml0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgdG8gYnl0ZXMKLSAgICBQTkdfVFJBTlNGT1JNX1BBQ0tTV0FQICAgICAgQ2hhbmdlIG9yZGVyIG9mIHBhY2tlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMgdG8gTFNCIGZpcnN0Ci0gICAgUE5HX1RSQU5TRk9STV9FWFBBTkQgICAgICAgIFBlcmZvcm0gc2V0X2V4cGFuZCgpCi0gICAgUE5HX1RSQU5TRk9STV9JTlZFUlRfTU9OTyAgIEludmVydCBtb25vY2hyb21lIGltYWdlcwotICAgIFBOR19UUkFOU0ZPUk1fU0hJRlQgICAgICAgICBOb3JtYWxpemUgcGl4ZWxzIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQklUIGRlcHRoCi0gICAgUE5HX1RSQU5TRk9STV9CR1IgICAgICAgICAgIEZsaXAgUkdCIHRvIEJHUiwgUkdCQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBCR1JBCi0gICAgUE5HX1RSQU5TRk9STV9TV0FQX0FMUEhBICAgIEZsaXAgUkdCQSB0byBBUkdCIG9yIEdBCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEFHCi0gICAgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEgIENoYW5nZSBhbHBoYSBmcm9tIG9wYWNpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdHJhbnNwYXJlbmN5Ci0gICAgUE5HX1RSQU5TRk9STV9TV0FQX0VORElBTiAgIEJ5dGUtc3dhcCAxNi1iaXQgc2FtcGxlcwotCi0oVGhpcyBleGNsdWRlcyBzZXR0aW5nIGEgYmFja2dyb3VuZCBjb2xvciwgZG9pbmcgZ2FtbWEgdHJhbnNmb3JtYXRpb24sCi1kaXRoZXJpbmcsIGFuZCBzZXR0aW5nIGZpbGxlci4pICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBzaW1wbHkgZG8gdGhpczoKLQotICAgIHBuZ19yZWFkX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIE5VTEwpCi0KLXdoZXJlIHBuZ190cmFuc2Zvcm1zIGlzIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZgotc29tZSBzZXQgb2YgdHJhbnNmb3JtYXRpb24gZmxhZ3MuICBUaGlzIGNhbGwgaXMgZXF1aXZhbGVudCB0byBwbmdfcmVhZF9pbmZvKCksCi1mb2xsb3dlZCB0aGUgc2V0IG9mIHRyYW5zZm9ybWF0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIHRyYW5zZm9ybSBtYXNrLAotdGhlbiBwbmdfcmVhZF9pbWFnZSgpLCBhbmQgZmluYWxseSBwbmdfcmVhZF9lbmQoKS4KLQotKFRoZSBmaW5hbCBwYXJhbWV0ZXIgb2YgdGhpcyBjYWxsIGlzIG5vdCB5ZXQgdXNlZC4gIFNvbWVkYXkgaXQgbWlnaHQgcG9pbnQKLXRvIHRyYW5zZm9ybWF0aW9uIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgc29tZSBmdXR1cmUgaW5wdXQgdHJhbnNmb3JtLikKLQotWW91IG11c3QgdXNlIHBuZ190cmFuc2Zvcm1zIGFuZCBub3QgY2FsbCBhbnkgcG5nX3NldF90cmFuc2Zvcm0oKSBmdW5jdGlvbnMKLXdoZW4geW91IHVzZSBwbmdfcmVhZF9wbmcoKS4KLQotQWZ0ZXIgeW91IGhhdmUgY2FsbGVkIHBuZ19yZWFkX3BuZygpLCB5b3UgY2FuIHJldHJpZXZlIHRoZSBpbWFnZSBkYXRhCi13aXRoCi0KLSAgIHJvd19wb2ludGVycyA9IHBuZ19nZXRfcm93cyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLXdoZXJlIHJvd19wb2ludGVycyBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB0byB0aGUgcGl4ZWwgZGF0YSBmb3IgZWFjaCByb3c6Ci0KLSAgIHBuZ19ieXRlcCByb3dfcG9pbnRlcnNbaGVpZ2h0XTsKLQotSWYgeW91IGtub3cgeW91ciBpbWFnZSBzaXplIGFuZCBwaXhlbCBzaXplIGFoZWFkIG9mIHRpbWUsIHlvdSBjYW4gYWxsb2NhdGUKLXJvd19wb2ludGVycyBwcmlvciB0byBjYWxsaW5nIHBuZ19yZWFkX3BuZygpIHdpdGgKLQotICAgaWYgKGhlaWdodCA+IFBOR19VSU5UXzMyX01BWC9wbmdfc2l6ZW9mKHBuZ19ieXRlKSkKLSAgICAgIHBuZ19lcnJvciAocG5nX3B0ciwKLSAgICAgICAgICJJbWFnZSBpcyB0b28gdGFsbCB0byBwcm9jZXNzIGluIG1lbW9yeSIpOwotICAgaWYgKHdpZHRoID4gUE5HX1VJTlRfMzJfTUFYL3BpeGVsX3NpemUpCi0gICAgICBwbmdfZXJyb3IgKHBuZ19wdHIsCi0gICAgICAgICAiSW1hZ2UgaXMgdG9vIHdpZGUgdG8gcHJvY2VzcyBpbiBtZW1vcnkiKTsKLSAgIHJvd19wb2ludGVycyA9IHBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgIGhlaWdodCpwbmdfc2l6ZW9mKHBuZ19ieXRlcCkpOwotICAgZm9yIChpbnQgaT0wOyBpPGhlaWdodCwgaSsrKQotICAgICAgcm93X3BvaW50ZXJzW2ldPU5VTEw7ICAvKiBzZWN1cml0eSBwcmVjYXV0aW9uICovCi0gICBmb3IgKGludCBpPTA7IGk8aGVpZ2h0LCBpKyspCi0gICAgICByb3dfcG9pbnRlcnNbaV09cG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgd2lkdGgqcGl4ZWxfc2l6ZSk7Ci0gICBwbmdfc2V0X3Jvd3MocG5nX3B0ciwgaW5mb19wdHIsICZyb3dfcG9pbnRlcnMpOwotCi1BbHRlcm5hdGl2ZWx5IHlvdSBjb3VsZCBhbGxvY2F0ZSB5b3VyIGltYWdlIGluIG9uZSBiaWcgYmxvY2sgYW5kIGRlZmluZQotcm93X3BvaW50ZXJzW2ldIHRvIHBvaW50IGludG8gdGhlIHByb3BlciBwbGFjZXMgaW4geW91ciBibG9jay4KLQotSWYgeW91IHVzZSBwbmdfc2V0X3Jvd3MoKSwgdGhlIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nCi1yb3dfcG9pbnRlcnMgKGFuZCByb3dfcG9pbnRlcnNbaV0sIGlmIHRoZXkgd2VyZSBzZXBhcmF0ZWx5IGFsbG9jYXRlZCkuCi0KLUlmIHlvdSBkb24ndCBhbGxvY2F0ZSByb3dfcG9pbnRlcnMgYWhlYWQgb2YgdGltZSwgcG5nX3JlYWRfcG5nKCkgd2lsbAotZG8gaXQsIGFuZCBpdCdsbCBiZSBmcmVlJ2VkIHdoZW4geW91IGNhbGwgcG5nX2Rlc3Ryb3lfKigpLgotCi1UaGUgbG93LWxldmVsIHJlYWQgaW50ZXJmYWNlCi0KLUlmIHlvdSBhcmUgZ29pbmcgdGhlIGxvdy1sZXZlbCByb3V0ZSwgeW91IGFyZSBub3cgcmVhZHkgdG8gcmVhZCBhbGwKLXRoZSBmaWxlIGluZm9ybWF0aW9uIHVwIHRvIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFlvdSBkbyB0aGlzIHdpdGggYQotY2FsbCB0byBwbmdfcmVhZF9pbmZvKCkuCi0KLSAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotVGhpcyB3aWxsIHByb2Nlc3MgYWxsIGNodW5rcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgaW1hZ2UgZGF0YS4KLQotUXVlcnlpbmcgdGhlIGluZm8gc3RydWN0dXJlCi0KLUZ1bmN0aW9ucyBhcmUgdXNlZCB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGluZm9fcHRyIG9uY2UgaXQKLWhhcyBiZWVuIHJlYWQuICBOb3RlIHRoYXQgdGhlc2UgZmllbGRzIG1heSBub3QgYmUgY29tcGxldGVseSBmaWxsZWQKLWluIHVudGlsIHBuZ19yZWFkX2VuZCgpIGhhcyByZWFkIHRoZSBjaHVuayBkYXRhIGZvbGxvd2luZyB0aGUgaW1hZ2UuCi0KLSAgICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsICZ3aWR0aCwgJmhlaWdodCwKLSAgICAgICAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwgJmludGVybGFjZV90eXBlLAotICAgICAgICZjb21wcmVzc2lvbl90eXBlLCAmZmlsdGVyX21ldGhvZCk7Ci0KLSAgICB3aWR0aCAgICAgICAgICAtIGhvbGRzIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGluIHBpeGVscyAodXAgdG8gMl4zMSkuCi0gICAgaGVpZ2h0ICAgICAgICAgLSBob2xkcyB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KLSAgICBiaXRfZGVwdGggICAgICAtIGhvbGRzIHRoZSBiaXQgZGVwdGggb2Ygb25lIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgY2hhbm5lbHMuICAodmFsaWQgdmFsdWVzIGFyZQotICAgICAgICAgICAgICAgICAgICAgMSwgMiwgNCwgOCwgMTYgYW5kIGRlcGVuZCBhbHNvIG9uCi0gICAgICAgICAgICAgICAgICAgICB0aGUgY29sb3JfdHlwZS4gIFNlZSBhbHNvCi0gICAgICAgICAgICAgICAgICAgICBzaWduaWZpY2FudCBiaXRzIChzQklUKSBiZWxvdykuCi0gICAgY29sb3JfdHlwZSAgICAgLSBkZXNjcmliZXMgd2hpY2ggY29sb3IvYWxwaGEgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgcHJlc2VudC4KLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVkKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDEsIDIsIDQsIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0X2RlcHRocyA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCi0KLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX0NPTE9SCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19BTFBIQQotCi0gICAgZmlsdGVyX21ldGhvZCAgLSAobXVzdCBiZSBQTkdfRklMVEVSX1RZUEVfQkFTRQotICAgICAgICAgICAgICAgICAgICAgZm9yIFBORyAxLjAsIGFuZCBjYW4gYWxzbyBiZQotICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HIGlmCi0gICAgICAgICAgICAgICAgICAgICB0aGUgUE5HIGRhdGFzdHJlYW0gaXMgZW1iZWRkZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgIGEgTU5HLTEuMCBkYXRhc3RyZWFtKQotICAgIGNvbXByZXNzaW9uX3R5cGUgLSAobXVzdCBiZSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFCi0gICAgICAgICAgICAgICAgICAgICBmb3IgUE5HIDEuMCkKLSAgICBpbnRlcmxhY2VfdHlwZSAtIChQTkdfSU5URVJMQUNFX05PTkUgb3IKLSAgICAgICAgICAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfQURBTTcpCi0gICAgQW55IG9yIGFsbCBvZiBpbnRlcmxhY2VfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgb2YKLSAgICBmaWx0ZXJfbWV0aG9kIGNhbiBiZSBOVUxMIGlmIHlvdSBhcmUKLSAgICBub3QgaW50ZXJlc3RlZCBpbiB0aGVpciB2YWx1ZXMuCi0KLSAgICBjaGFubmVscyA9IHBuZ19nZXRfY2hhbm5lbHMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIGNoYW5uZWxzICAgICAgIC0gbnVtYmVyIG9mIGNoYW5uZWxzIG9mIGluZm8gZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgY29sb3IgdHlwZSAodmFsaWQgdmFsdWVzIGFyZSAxIChHUkFZLAotICAgICAgICAgICAgICAgICAgICAgUEFMRVRURSksIDIgKEdSQVlfQUxQSEEpLCAzIChSR0IpLAotICAgICAgICAgICAgICAgICAgICAgNCAoUkdCX0FMUEhBIG9yIFJHQiArIGZpbGxlciBieXRlKSkKLSAgICByb3dieXRlcyA9IHBuZ19nZXRfcm93Ynl0ZXMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIHJvd2J5dGVzICAgICAgIC0gbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBob2xkIGEgcm93Ci0KLSAgICBzaWduYXR1cmUgPSBwbmdfZ2V0X3NpZ25hdHVyZShwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgc2lnbmF0dXJlICAgICAgLSBob2xkcyB0aGUgc2lnbmF0dXJlIHJlYWQgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUgKGlmIGFueSkuICBUaGUgZGF0YSBpcyBrZXB0IGluCi0gICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBvZmZzZXQgaXQgd291bGQgYmUgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICB3aG9sZSBzaWduYXR1cmUgd2VyZSByZWFkIChpLmUuIGlmIGFuCi0gICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBoYWQgYWxyZWFkeSByZWFkIGluIDQKLSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIG9mIHNpZ25hdHVyZSBiZWZvcmUgc3RhcnRpbmcKLSAgICAgICAgICAgICAgICAgICAgIGxpYnBuZywgdGhlIHJlbWFpbmluZyA0IGJ5dGVzIHdvdWxkCi0gICAgICAgICAgICAgICAgICAgICBiZSBpbiBzaWduYXR1cmVbNF0gdGhyb3VnaCBzaWduYXR1cmVbN10KLSAgICAgICAgICAgICAgICAgICAgIChzZWUgcG5nX3NldF9zaWdfYnl0ZXMoKSkpLgotCi0KLSAgICB3aWR0aCAgICAgICAgICAgID0gcG5nX2dldF9pbWFnZV93aWR0aChwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKLSAgICBoZWlnaHQgICAgICAgICAgID0gcG5nX2dldF9pbWFnZV9oZWlnaHQocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0gICAgYml0X2RlcHRoICAgICAgICA9IHBuZ19nZXRfYml0X2RlcHRoKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotICAgIGNvbG9yX3R5cGUgICAgICAgPSBwbmdfZ2V0X2NvbG9yX3R5cGUocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0gICAgZmlsdGVyX21ldGhvZCAgICA9IHBuZ19nZXRfZmlsdGVyX3R5cGUocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0gICAgY29tcHJlc3Npb25fdHlwZSA9IHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZShwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKLSAgICBpbnRlcmxhY2VfdHlwZSAgID0gcG5nX2dldF9pbnRlcmxhY2VfdHlwZShwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKLQotCi1UaGVzZSBhcmUgYWxzbyBpbXBvcnRhbnQsIGJ1dCB0aGVpciB2YWxpZGl0eSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGNodW5rCi1oYXMgYmVlbiByZWFkLiAgVGhlIHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPXzxjaHVuaz4pIGFuZAotcG5nX2dldF88Y2h1bms+KHBuZ19wdHIsIGluZm9fcHRyLCAuLi4pIGZ1bmN0aW9ucyByZXR1cm4gbm9uLXplcm8gaWYgdGhlCi1kYXRhIGhhcyBiZWVuIHJlYWQsIG9yIHplcm8gaWYgaXQgaXMgbWlzc2luZy4gIFRoZSBwYXJhbWV0ZXJzIHRvIHRoZQotcG5nX2dldF88Y2h1bms+IGFyZSBzZXQgZGlyZWN0bHkgaWYgdGhleSBhcmUgc2ltcGxlIGRhdGEgdHlwZXMsIG9yIGEgcG9pbnRlcgotaW50byB0aGUgaW5mb19wdHIgaXMgcmV0dXJuZWQgZm9yIGFueSBjb21wbGV4IHR5cGVzLgotCi0gICAgcG5nX2dldF9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCAmcGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICZudW1fcGFsZXR0ZSk7Ci0gICAgcGFsZXR0ZSAgICAgICAgLSB0aGUgcGFsZXR0ZSBmb3IgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgIChhcnJheSBvZiBwbmdfY29sb3IpCi0gICAgbnVtX3BhbGV0dGUgICAgLSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcGFsZXR0ZQotCi0gICAgcG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZ2FtbWEpOwotICAgIGdhbW1hICAgICAgICAgIC0gdGhlIGdhbW1hIHRoZSBmaWxlIGlzIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgIGF0IChQTkdfSU5GT19nQU1BKQotCi0gICAgcG5nX2dldF9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCAmc3JnYl9pbnRlbnQpOwotICAgIHNyZ2JfaW50ZW50ICAgIC0gdGhlIHJlbmRlcmluZyBpbnRlbnQgKFBOR19JTkZPX3NSR0IpCi0gICAgICAgICAgICAgICAgICAgICBUaGUgcHJlc2VuY2Ugb2YgdGhlIHNSR0IgY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgIG1lYW5zIHRoYXQgdGhlIHBpeGVsIGRhdGEgaXMgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzUkdCIGNvbG9yIHNwYWNlLiAgVGhpcyBjaHVuayBhbHNvCi0gICAgICAgICAgICAgICAgICAgICBpbXBsaWVzIHNwZWNpZmljIHZhbHVlcyBvZiBnQU1BIGFuZAotICAgICAgICAgICAgICAgICAgICAgY0hSTS4KLQotICAgIHBuZ19nZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgJm5hbWUsCi0gICAgICAgJmNvbXByZXNzaW9uX3R5cGUsICZwcm9maWxlLCAmcHJvZmxlbik7Ci0gICAgbmFtZSAgICAgICAgICAgIC0gVGhlIHByb2ZpbGUgbmFtZS4KLSAgICBjb21wcmVzc2lvbiAgICAgLSBUaGUgY29tcHJlc3Npb24gdHlwZTsgYWx3YXlzCi0gICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSBmb3IgUE5HIDEuMC4KLSAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IGdpdmUgTlVMTCB0byB0aGlzIGFyZ3VtZW50IHRvCi0gICAgICAgICAgICAgICAgICAgICAgaWdub3JlIGl0LgotICAgIHByb2ZpbGUgICAgICAgICAtIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBjb2xvcgotICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgZGF0YS4gTWF5IGNvbnRhaW4gTlVMcy4KLSAgICBwcm9mbGVuICAgICAgICAgLSBsZW5ndGggb2YgcHJvZmlsZSBkYXRhIGluIGJ5dGVzLgotCi0gICAgcG5nX2dldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCk7Ci0gICAgc2lnX2JpdCAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc0JJVCkgZWFjaCBvZiB0aGUgZ3JheSwKLSAgICAgICAgICAgICAgICAgICAgIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgd2hpY2hldmVyIGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICBnaXZlbiBjb2xvciB0eXBlIChwbmdfY29sb3JfMTYpCi0KLSAgICBwbmdfZ2V0X3RSTlMocG5nX3B0ciwgaW5mb19wdHIsICZ0cmFucywgJm51bV90cmFucywKLSAgICAgICAgICAgICAgICAgICAgICZ0cmFuc192YWx1ZXMpOwotICAgIHRyYW5zICAgICAgICAgIC0gYXJyYXkgb2YgdHJhbnNwYXJlbnQgZW50cmllcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgKFBOR19JTkZPX3RSTlMpCi0gICAgdHJhbnNfdmFsdWVzICAgLSBncmF5bGV2ZWwgb3IgY29sb3Igc2FtcGxlIHZhbHVlcyBvZgotICAgICAgICAgICAgICAgICAgICAgdGhlIHNpbmdsZSB0cmFuc3BhcmVudCBjb2xvciBmb3IKLSAgICAgICAgICAgICAgICAgICAgIG5vbi1wYWxldHRlZCBpbWFnZXMgKFBOR19JTkZPX3RSTlMpCi0gICAgbnVtX3RyYW5zICAgICAgLSBudW1iZXIgb2YgdHJhbnNwYXJlbnQgZW50cmllcwotICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3RSTlMpCi0KLSAgICBwbmdfZ2V0X2hJU1QocG5nX3B0ciwgaW5mb19wdHIsICZoaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19oSVNUKQotICAgIGhpc3QgICAgICAgICAgIC0gaGlzdG9ncmFtIG9mIHBhbGV0dGUgKGFycmF5IG9mCi0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNikKLQotICAgIHBuZ19nZXRfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgJm1vZF90aW1lKTsKLSAgICBtb2RfdGltZSAgICAgICAtIHRpbWUgaW1hZ2Ugd2FzIGxhc3QgbW9kaWZpZWQKLSAgICAgICAgICAgICAgICAgICAgKFBOR19WQUxJRF90SU1FKQotCi0gICAgcG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmYmFja2dyb3VuZCk7Ci0gICAgYmFja2dyb3VuZCAgICAgLSBiYWNrZ3JvdW5kIGNvbG9yIChQTkdfVkFMSURfYktHRCkKLSAgICAgICAgICAgICAgICAgICAgIHZhbGlkIDE2LWJpdCByZWQsIGdyZWVuIGFuZCBibHVlCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIHJlZ2FyZGxlc3Mgb2YgY29sb3JfdHlwZQotCi0gICAgbnVtX2NvbW1lbnRzICAgPSBwbmdfZ2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAmdGV4dF9wdHIsICZudW1fdGV4dCk7Ci0gICAgbnVtX2NvbW1lbnRzICAgLSBudW1iZXIgb2YgY29tbWVudHMKLSAgICB0ZXh0X3B0ciAgICAgICAtIGFycmF5IG9mIHBuZ190ZXh0IGhvbGRpbmcgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzCi0gICAgdGV4dF9wdHJbaV0uY29tcHJlc3Npb24gLSB0eXBlIG9mIGNvbXByZXNzaW9uIHVzZWQKLSAgICAgICAgICAgICAgICAgb24gInRleHQiIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQKLSAgICB0ZXh0X3B0cltpXS5rZXkgICAtIGtleXdvcmQgZm9yIGNvbW1lbnQuICBNdXN0IGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAxLTc5IGNoYXJhY3RlcnMuCi0gICAgdGV4dF9wdHJbaV0udGV4dCAgLSB0ZXh0IGNvbW1lbnRzIGZvciBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZC4gIENhbiBiZSBlbXB0eS4KLSAgICB0ZXh0X3B0cltpXS50ZXh0X2xlbmd0aCAtIGxlbmd0aCBvZiB0ZXh0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgaVRYdAotICAgIHRleHRfcHRyW2ldLml0eHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIGl0eHQgc3RyaW5nLAotICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciB0RVh0L3pUWHQKLSAgICB0ZXh0X3B0cltpXS5sYW5nICAtIGxhbmd1YWdlIG9mIGNvbW1lbnQgKGVtcHR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciB1bmtub3duKS4KLSAgICB0ZXh0X3B0cltpXS5sYW5nX2tleSAgLSBrZXl3b3JkIGluIFVURi04Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKGVtcHR5IHN0cmluZyBmb3IgdW5rbm93bikuCi0gICAgbnVtX3RleHQgICAgICAgLSBudW1iZXIgb2YgY29tbWVudHMgKHNhbWUgYXMKLSAgICAgICAgICAgICAgICAgICAgIG51bV9jb21tZW50czsgeW91IGNhbiBwdXQgTlVMTCBoZXJlCi0gICAgICAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgZHVwbGljYXRpb24pCi0gICAgTm90ZSB3aGlsZSBwbmdfc2V0X3RleHQoKSB3aWxsIGFjY2VwdCB0ZXh0LCBsYW5ndWFnZSwKLSAgICBhbmQgdHJhbnNsYXRlZCBrZXl3b3JkcyB0aGF0IGNhbiBiZSBOVUxMIHBvaW50ZXJzLCB0aGUKLSAgICBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgcG5nX2dldF90ZXh0IHdpbGwgYWx3YXlzIGNvbnRhaW4KLSAgICByZWd1bGFyIHplcm8tdGVybWluYXRlZCBDIHN0cmluZ3MuICBUaGV5IG1pZ2h0IGJlCi0gICAgZW1wdHkgc3RyaW5ncyBidXQgdGhleSB3aWxsIG5ldmVyIGJlIE5VTEwgcG9pbnRlcnMuCi0KLSAgICBudW1fc3BhbGV0dGVzID0gcG5nX2dldF9zUExUKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICZwYWxldHRlX3B0cik7Ci0gICAgcGFsZXR0ZV9wdHIgICAgLSBhcnJheSBvZiBwYWxldHRlIHN0cnVjdHVyZXMgaG9sZGluZwotICAgICAgICAgICAgICAgICAgICAgY29udGVudHMgb2Ygb25lIG9yIG1vcmUgc1BMVCBjaHVua3MKLSAgICAgICAgICAgICAgICAgICAgIHJlYWQuCi0gICAgbnVtX3NwYWxldHRlcyAgLSBudW1iZXIgb2Ygc1BMVCBjaHVua3MgcmVhZC4KLQotICAgIHBuZ19nZXRfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgJm9mZnNldF94LCAmb2Zmc2V0X3ksCi0gICAgICAgJnVuaXRfdHlwZSk7Ci0gICAgb2Zmc2V0X3ggICAgICAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgbGVmdCBlZGdlCi0gICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2NyZWVuCi0gICAgb2Zmc2V0X3kgICAgICAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgdG9wIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzY3JlZW4KLSAgICB1bml0X3R5cGUgICAgICAtIFBOR19PRkZTRVRfUElYRUwsIFBOR19PRkZTRVRfTUlDUk9NRVRFUgotCi0gICAgcG5nX2dldF9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCAmcmVzX3gsICZyZXNfeSwKLSAgICAgICAmdW5pdF90eXBlKTsKLSAgICByZXNfeCAgICAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24gaW4KLSAgICAgICAgICAgICAgICAgICAgIHggZGlyZWN0aW9uCi0gICAgcmVzX3kgICAgICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uIGluCi0gICAgICAgICAgICAgICAgICAgICB4IGRpcmVjdGlvbgotICAgIHVuaXRfdHlwZSAgICAgIC0gUE5HX1JFU09MVVRJT05fVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgIFBOR19SRVNPTFVUSU9OX01FVEVSCi0KLSAgICBwbmdfZ2V0X3NDQUwocG5nX3B0ciwgaW5mb19wdHIsICZ1bml0LCAmd2lkdGgsCi0gICAgICAgJmhlaWdodCkKLSAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQotICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIGRvdWJsZXMpCi0KLSAgICBwbmdfZ2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnVuaXQsICZ3aWR0aCwKLSAgICAgICAmaGVpZ2h0KQotICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCi0gICAgd2lkdGggICAgICAgLSB3aWR0aCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgaGVpZ2h0ICAgICAgLSBoZWlnaHQgb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgICAgICAgICAgICAgICAod2lkdGggYW5kIGhlaWdodCBhcmUgc3RyaW5ncyBsaWtlICIyLjU0IikKLQotICAgIG51bV91bmtub3duX2NodW5rcyA9IHBuZ19nZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0ciwgJnVua25vd25zKQotICAgIHVua25vd25zICAgICAgICAgIC0gYXJyYXkgb2YgcG5nX3Vua25vd25fY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgaG9sZGluZyB1bmtub3duIGNodW5rcwotICAgIHVua25vd25zW2ldLm5hbWUgIC0gbmFtZSBvZiB1bmtub3duIGNodW5rCi0gICAgdW5rbm93bnNbaV0uZGF0YSAgLSBkYXRhIG9mIHVua25vd24gY2h1bmsKLSAgICB1bmtub3duc1tpXS5zaXplICAtIHNpemUgb2YgdW5rbm93biBjaHVuaydzIGRhdGEKLSAgICB1bmtub3duc1tpXS5sb2NhdGlvbiAtIHBvc2l0aW9uIG9mIGNodW5rIGluIGZpbGUKLQotICAgIFRoZSB2YWx1ZSBvZiAiaSIgY29ycmVzcG9uZHMgdG8gdGhlIG9yZGVyIGluIHdoaWNoIHRoZQotICAgIGNodW5rcyB3ZXJlIHJlYWQgZnJvbSB0aGUgUE5HIGZpbGUgb3IgaW5zZXJ0ZWQgd2l0aCB0aGUKLSAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkgZnVuY3Rpb24uCi0KLVRoZSBkYXRhIGZyb20gdGhlIHBIWXMgY2h1bmsgY2FuIGJlIHJldHJpZXZlZCBpbiBzZXZlcmFsIGNvbnZlbmllbnQKLWZvcm1zOgotCi0gICAgcmVzX3ggPSBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotICAgIHJlc195ID0gcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLSAgICByZXNfeF9hbmRfeSA9IHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotICAgIHJlc194ID0gcG5nX2dldF94X3BpeGVsc19wZXJfaW5jaChwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotICAgIHJlc195ID0gcG5nX2dldF95X3BpeGVsc19wZXJfaW5jaChwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotICAgIHJlc194X2FuZF95ID0gcG5nX2dldF9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLSAgICBhc3BlY3RfcmF0aW8gPSBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpbyhwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotCi0gICAoRWFjaCBvZiB0aGVzZSByZXR1cm5zIDAgW3NpZ25pZnlpbmcgInVua25vd24iXSBpZgotICAgICAgIHRoZSBkYXRhIGlzIG5vdCBwcmVzZW50IG9yIGlmIHJlc194IGlzIDA7Ci0gICAgICAgcmVzX3hfYW5kX3kgaXMgMCBpZiByZXNfeCAhPSByZXNfeSkKLQotVGhlIGRhdGEgZnJvbSB0aGUgb0ZGcyBjaHVuayBjYW4gYmUgcmV0cmlldmVkIGluIHNldmVyYWwgY29udmVuaWVudAotZm9ybXM6Ci0KLSAgICB4X29mZnNldCA9IHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgeV9vZmZzZXQgPSBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIHhfb2Zmc2V0ID0gcG5nX2dldF94X29mZnNldF9pbmNoZXMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIHlfb2Zmc2V0ID0gcG5nX2dldF95X29mZnNldF9pbmNoZXMocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAoRWFjaCBvZiB0aGVzZSByZXR1cm5zIDAgW3NpZ25pZnlpbmcgInVua25vd24iIGlmIGJvdGgKLSAgICAgICB4IGFuZCB5IGFyZSAwXSBpZiB0aGUgZGF0YSBpcyBub3QgcHJlc2VudCBvciBpZiB0aGUKLSAgICAgICBjaHVuayBpcyBwcmVzZW50IGJ1dCB0aGUgdW5pdCBpcyB0aGUgcGl4ZWwpCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIHBuZ19pbmZvIGRlZmluaXRpb24gaW4gcG5nLmggYW5kIHRoZQotUE5HIHNwZWNpZmljYXRpb24gZm9yIGNodW5rIGNvbnRlbnRzLiAgQmUgY2FyZWZ1bCB3aXRoIHRydXN0aW5nCi1yb3dieXRlcywgYXMgc29tZSBvZiB0aGUgdHJhbnNmb3JtYXRpb25zIGNvdWxkIGluY3JlYXNlIHRoZSBzcGFjZQotbmVlZGVkIHRvIGhvbGQgYSByb3cgKGV4cGFuZCwgZmlsbGVyLCBncmF5X3RvX3JnYiwgZXRjLikuCi1TZWUgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSwgYmVsb3cuCi0KLUEgcXVpY2sgd29yZCBhYm91dCB0ZXh0X3B0ciBhbmQgbnVtX3RleHQuICBQTkcgc3RvcmVzIGNvbW1lbnRzIGluCi1rZXl3b3JkL3RleHQgcGFpcnMsIG9uZSBwYWlyIHBlciBjaHVuaywgd2l0aCBubyBsaW1pdCBvbiB0aGUgbnVtYmVyCi1vZiB0ZXh0IGNodW5rcywgYW5kIGEgMl4zMSBieXRlIGxpbWl0IG9uIHRoZWlyIHNpemUuICBXaGlsZSB0aGVyZSBhcmUKLXN1Z2dlc3RlZCBrZXl3b3JkcywgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdG8gcmVzdHJpY3QgdGhlIHVzZSB0byB0aGVzZQotc3RyaW5ncy4gIEl0IGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCB0aGF0IGtleXdvcmRzIGFuZCB0ZXh0IGJlIHNlbnNpYmxlCi10byBodW1hbnMgKHRoYXQncyB0aGUgcG9pbnQpLCBzbyBkb24ndCB1c2UgYWJicmV2aWF0aW9ucy4gIE5vbi1wcmludGluZwotc3ltYm9scyBhcmUgbm90IGFsbG93ZWQuICBTZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCi1UaGVyZSBpcyBhbHNvIG5vIHJlcXVpcmVtZW50IHRvIGhhdmUgdGV4dCBhZnRlciB0aGUga2V5d29yZC4KLQotS2V5d29yZHMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gNzkgTGF0aW4tMSBjaGFyYWN0ZXJzIHdpdGhvdXQgbGVhZGluZyBvcgotdHJhaWxpbmcgc3BhY2VzLCBidXQgbm9uLWNvbnNlY3V0aXZlIHNwYWNlcyBhcmUgYWxsb3dlZCB3aXRoaW4gdGhlCi1rZXl3b3JkLiAgSXQgaXMgcG9zc2libGUgdG8gaGF2ZSB0aGUgc2FtZSBrZXl3b3JkIGFueSBudW1iZXIgb2YgdGltZXMuCi1UaGUgdGV4dF9wdHIgaXMgYW4gYXJyYXkgb2YgcG5nX3RleHQgc3RydWN0dXJlcywgZWFjaCBob2xkaW5nIGEKLXBvaW50ZXIgdG8gYSBsYW5ndWFnZSBzdHJpbmcsIGEgcG9pbnRlciB0byBhIGtleXdvcmQgYW5kIGEgcG9pbnRlciB0bwotYSB0ZXh0IHN0cmluZy4gIFRoZSB0ZXh0IHN0cmluZywgbGFuZ3VhZ2UgY29kZSwgYW5kIHRyYW5zbGF0ZWQKLWtleXdvcmQgbWF5IGJlIGVtcHR5IG9yIE5VTEwgcG9pbnRlcnMuICBUaGUga2V5d29yZC90ZXh0Ci1wYWlycyBhcmUgcHV0IGludG8gdGhlIGFycmF5IGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJlY2VpdmVkLgotSG93ZXZlciwgc29tZSBvciBhbGwgb2YgdGhlIHRleHQgY2h1bmtzIG1heSBiZSBhZnRlciB0aGUgaW1hZ2UsIHNvLCB0bwotbWFrZSBzdXJlIHlvdSBoYXZlIHJlYWQgYWxsIHRoZSB0ZXh0IGNodW5rcywgZG9uJ3QgbWVzcyB3aXRoIHRoZXNlCi11bnRpbCBhZnRlciB5b3UgcmVhZCB0aGUgc3R1ZmYgYWZ0ZXIgdGhlIGltYWdlLiAgVGhpcyB3aWxsIGJlCi1tZW50aW9uZWQgYWdhaW4gYmVsb3cgaW4gdGhlIGRpc2N1c3Npb24gdGhhdCBnb2VzIHdpdGggcG5nX3JlYWRfZW5kKCkuCi0KLUlucHV0IHRyYW5zZm9ybWF0aW9ucwotCi1BZnRlciB5b3UndmUgcmVhZCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLCB5b3UgY2FuIHNldCB1cCB0aGUgbGlicmFyeQotdG8gaGFuZGxlIGFueSBzcGVjaWFsIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgaW1hZ2UgZGF0YS4gIFRoZSB2YXJpb3VzCi13YXlzIHRvIHRyYW5zZm9ybSB0aGUgZGF0YSB3aWxsIGJlIGRlc2NyaWJlZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5Ci1zaG91bGQgb2NjdXIuICBUaGlzIGlzIGltcG9ydGFudCwgYXMgc29tZSBvZiB0aGVzZSBjaGFuZ2UgdGhlIGNvbG9yCi10eXBlIGFuZC9vciBiaXQgZGVwdGggb2YgdGhlIGRhdGEsIGFuZCBzb21lIG90aGVycyBvbmx5IHdvcmsgb24KLWNlcnRhaW4gY29sb3IgdHlwZXMgYW5kIGJpdCBkZXB0aHMuICBFdmVuIHRob3VnaCBlYWNoIHRyYW5zZm9ybWF0aW9uCi1jaGVja3MgdG8gc2VlIGlmIGl0IGhhcyBkYXRhIHRoYXQgaXQgY2FuIGRvIHNvbWV0aGluZyB3aXRoLCB5b3Ugc2hvdWxkCi1tYWtlIHN1cmUgdG8gb25seSBlbmFibGUgYSB0cmFuc2Zvcm1hdGlvbiBpZiBpdCB3aWxsIGJlIHZhbGlkIGZvciB0aGUKLWRhdGEuICBGb3IgZXhhbXBsZSwgZG9uJ3Qgc3dhcCByZWQgYW5kIGJsdWUgb24gZ3JheXNjYWxlIGRhdGEuCi0KLVRoZSBjb2xvcnMgdXNlZCBmb3IgdGhlIGJhY2tncm91bmQgYW5kIHRyYW5zcGFyZW5jeSB2YWx1ZXMgc2hvdWxkIGJlCi1zdXBwbGllZCBpbiB0aGUgc2FtZSBmb3JtYXQvZGVwdGggYXMgdGhlIGN1cnJlbnQgaW1hZ2UgZGF0YS4gIFRoZXkKLWFyZSBzdG9yZWQgaW4gdGhlIHNhbWUgZm9ybWF0L2RlcHRoIGFzIHRoZSBpbWFnZSBkYXRhIGluIGEgYktHRCBvciB0Uk5TCi1jaHVuaywgc28gdGhpcyBpcyB3aGF0IGxpYnBuZyBleHBlY3RzIGZvciB0aGlzIGRhdGEuICBUaGUgY29sb3JzIGFyZQotdHJhbnNmb3JtZWQgdG8ga2VlcCBpbiBzeW5jIHdpdGggdGhlIGltYWdlIGRhdGEgd2hlbiBhbiBhcHBsaWNhdGlvbgotY2FsbHMgdGhlIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgcm91dGluZSAoc2VlIGJlbG93KS4KLQotRGF0YSB3aWxsIGJlIGRlY29kZWQgaW50byB0aGUgc3VwcGxpZWQgcm93IGJ1ZmZlcnMgcGFja2VkIGludG8gYnl0ZXMKLXVubGVzcyB0aGUgbGlicmFyeSBoYXMgYmVlbiB0b2xkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGFub3RoZXIgZm9ybWF0LgotRm9yIGV4YW1wbGUsIDQgYml0L3BpeGVsIHBhbGV0dGVkIG9yIGdyYXlzY2FsZSBkYXRhIHdpbGwgYmUgcmV0dXJuZWQKLTIgcGl4ZWxzL2J5dGUgd2l0aCB0aGUgbGVmdG1vc3QgcGl4ZWwgaW4gdGhlIGhpZ2gtb3JkZXIgYml0cyBvZiB0aGUKLWJ5dGUsIHVubGVzcyBwbmdfc2V0X3BhY2tpbmcoKSBpcyBjYWxsZWQuICA4LWJpdCBSR0IgZGF0YSB3aWxsIGJlIHN0b3JlZAotaW4gUkdCIFJHQiBSR0IgZm9ybWF0IHVubGVzcyBwbmdfc2V0X2ZpbGxlcigpIG9yIHBuZ19zZXRfYWRkX2FscGhhKCkKLWlzIGNhbGxlZCB0byBpbnNlcnQgZmlsbGVyIGJ5dGVzLCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIGVhY2ggUkdCIHRyaXBsZXQuCi0xNi1iaXQgUkdCIGRhdGEgd2lsbCBiZSByZXR1cm5lZCBSUkdHQkIgUlJHR0JCLCB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50Ci1ieXRlIG9mIHRoZSBjb2xvciB2YWx1ZSBmaXJzdCwgdW5sZXNzIHBuZ19zZXRfc3RyaXBfMTYoKSBpcyBjYWxsZWQgdG8KLXRyYW5zZm9ybSBpdCB0byByZWd1bGFyIFJHQiBSR0IgdHJpcGxldHMsIG9yIHBuZ19zZXRfZmlsbGVyKCkgb3IKLXBuZ19zZXRfYWRkIGFscGhhKCkgaXMgY2FsbGVkIHRvIGluc2VydCBmaWxsZXIgYnl0ZXMsIGVpdGhlciBiZWZvcmUgb3IKLWFmdGVyIGVhY2ggUlJHR0JCIHRyaXBsZXQuICBTaW1pbGFybHksIDgtYml0IG9yIDE2LWJpdCBncmF5c2NhbGUgZGF0YSBjYW4KLWJlIG1vZGlmaWVkIHdpdGgKLXBuZ19zZXRfZmlsbGVyKCksIHBuZ19zZXRfYWRkX2FscGhhKCksIG9yIHBuZ19zZXRfc3RyaXBfMTYoKS4KLQotVGhlIGZvbGxvd2luZyBjb2RlIHRyYW5zZm9ybXMgZ3JheXNjYWxlIGltYWdlcyBvZiBsZXNzIHRoYW4gOCB0byA4IGJpdHMsCi1jaGFuZ2VzIHBhbGV0dGVkIGltYWdlcyB0byBSR0IsIGFuZCBhZGRzIGEgZnVsbCBhbHBoYSBjaGFubmVsIGlmIHRoZXJlIGlzCi10cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24gaW4gYSB0Uk5TIGNodW5rLiAgVGhpcyBpcyBtb3N0IHVzZWZ1bCBvbgotZ3JheXNjYWxlIGltYWdlcyB3aXRoIGJpdCBkZXB0aHMgb2YgMiBvciA0IG9yIGlmIHRoZXJlIGlzIGEgbXVsdGlwbGUtaW1hZ2UKLXZpZXdpbmcgYXBwbGljYXRpb24gdGhhdCB3aXNoZXMgdG8gdHJlYXQgYWxsIGltYWdlcyBpbiB0aGUgc2FtZSB3YXkuCi0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKHBuZ19wdHIpOwotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJgotICAgICAgICBiaXRfZGVwdGggPCA4KSBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nX3B0cik7Ci0KLSAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgUE5HX0lORk9fdFJOUykpIHBuZ19zZXRfdFJOU190b19hbHBoYShwbmdfcHRyKTsKLQotVGhlc2UgdGhyZWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBhbGlhc2VzIGZvciBwbmdfc2V0X2V4cGFuZCgpLCBhZGRlZAotaW4gbGlicG5nIHZlcnNpb24gMS4wLjQsIHdpdGggdGhlIGZ1bmN0aW9uIG5hbWVzIGV4cGFuZGVkIHRvIGltcHJvdmUgY29kZQotcmVhZGFiaWxpdHkuICBJbiBzb21lIGZ1dHVyZSB2ZXJzaW9uIHRoZXkgbWF5IGFjdHVhbGx5IGRvIGRpZmZlcmVudAotdGhpbmdzLgotCi1BcyBvZiBsaWJwbmcgdmVyc2lvbiAxLjIuOSwgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgd2FzCi1hZGRlZC4gIEl0IGV4cGFuZHMgdGhlIHNhbXBsZSBkZXB0aCB3aXRob3V0IGNoYW5naW5nIHRSTlMgdG8gYWxwaGEuCi0KLVBORyBjYW4gaGF2ZSBmaWxlcyB3aXRoIDE2IGJpdHMgcGVyIGNoYW5uZWwuICBJZiB5b3Ugb25seSBjYW4gaGFuZGxlCi04IGJpdHMgcGVyIGNoYW5uZWwsIHRoaXMgd2lsbCBzdHJpcCB0aGUgcGl4ZWxzIGRvd24gdG8gOCBiaXQuCi0KLSAgICBpZiAoYml0X2RlcHRoID09IDE2KQotICAgICAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOwotCi1JZiwgZm9yIHNvbWUgcmVhc29uLCB5b3UgZG9uJ3QgbmVlZCB0aGUgYWxwaGEgY2hhbm5lbCBvbiBhbiBpbWFnZSwKLWFuZCB5b3Ugd2FudCB0byByZW1vdmUgaXQgcmF0aGVyIHRoYW4gY29tYmluaW5nIGl0IHdpdGggdGhlIGJhY2tncm91bmQKLShidXQgdGhlIGltYWdlIGF1dGhvciBjZXJ0YWlubHkgaGFkIGluIG1pbmQgdGhhdCB5b3UgKndvdWxkKiBjb21iaW5lCi1pdCB3aXRoIHRoZSBiYWNrZ3JvdW5kLCBzbyB0aGF0J3Mgd2hhdCB5b3Ugc2hvdWxkIHByb2JhYmx5IGRvKToKLQotICAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0gICAgICAgIHBuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3B0cik7Ci0KLUluIFBORyBmaWxlcywgdGhlIGFscGhhIGNoYW5uZWwgaW4gYW4gaW1hZ2UKLWlzIHRoZSBsZXZlbCBvZiBvcGFjaXR5LiAgSWYgeW91IG5lZWQgdGhlIGFscGhhIGNoYW5uZWwgaW4gYW4gaW1hZ2UgdG8KLWJlIHRoZSBsZXZlbCBvZiB0cmFuc3BhcmVuY3kgaW5zdGVhZCBvZiBvcGFjaXR5LCB5b3UgY2FuIGludmVydCB0aGUKLWFscGhhIGNoYW5uZWwgKG9yIHRoZSB0Uk5TIGNodW5rIGRhdGEpIGFmdGVyIGl0J3MgcmVhZCwgc28gdGhhdCAwIGlzCi1mdWxseSBvcGFxdWUgYW5kIDI1NSAoaW4gOC1iaXQgb3IgcGFsZXR0ZWQgaW1hZ2VzKSBvciA2NTUzNSAoaW4gMTYtYml0Ci1pbWFnZXMpIGlzIGZ1bGx5IHRyYW5zcGFyZW50LCB3aXRoCi0KLSAgICBwbmdfc2V0X2ludmVydF9hbHBoYShwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHBhY2sgcGl4ZWxzIG9mIGJpdCBkZXB0aHMgMSwgMiwgYW5kIDQgaW50byBieXRlcyBhcyBzbWFsbCBhcwotdGhleSBjYW4sIHJlc3VsdGluZyBpbiwgZm9yIGV4YW1wbGUsIDggcGl4ZWxzIHBlciBieXRlIGZvciAxIGJpdAotZmlsZXMuICBUaGlzIGNvZGUgZXhwYW5kcyB0byAxIHBpeGVsIHBlciBieXRlIHdpdGhvdXQgY2hhbmdpbmcgdGhlCi12YWx1ZXMgb2YgdGhlIHBpeGVsczoKLQotICAgIGlmIChiaXRfZGVwdGggPCA4KQotICAgICAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7Ci0KLVBORyBmaWxlcyBoYXZlIHBvc3NpYmxlIGJpdCBkZXB0aHMgb2YgMSwgMiwgNCwgOCwgYW5kIDE2LiAgQWxsIHBpeGVscwotc3RvcmVkIGluIGEgUE5HIGltYWdlIGhhdmUgYmVlbiAic2NhbGVkIiBvciAic2hpZnRlZCIgdXAgdG8gdGhlIG5leHQKLWhpZ2hlciBwb3NzaWJsZSBiaXQgZGVwdGggKGUuZy4gZnJvbSA1IGJpdHMvc2FtcGxlIGluIHRoZSByYW5nZSBbMCwzMV0gdG8KLTggYml0cy9zYW1wbGUgaW4gdGhlIHJhbmdlIFswLCAyNTVdKS4gIEhvd2V2ZXIsIGl0IGlzIGFsc28gcG9zc2libGUgdG8KLWNvbnZlcnQgdGhlIFBORyBwaXhlbCBkYXRhIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aCBvZiB0aGUgaW1hZ2UuCi1UaGlzIGNhbGwgcmVkdWNlcyB0aGUgcGl4ZWxzIGJhY2sgZG93biB0byB0aGUgb3JpZ2luYWwgYml0IGRlcHRoOgotCi0gICAgcG5nX2NvbG9yXzhwIHNpZ19iaXQ7Ci0KLSAgICBpZiAocG5nX2dldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCkpCi0gICAgICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgc2lnX2JpdCk7Ci0KLVBORyBmaWxlcyBzdG9yZSAzLWNvbG9yIHBpeGVscyBpbiByZWQsIGdyZWVuLCBibHVlIG9yZGVyLiAgVGhpcyBjb2RlCi1jaGFuZ2VzIHRoZSBzdG9yYWdlIG9mIHRoZSBwaXhlbHMgdG8gYmx1ZSwgZ3JlZW4sIHJlZDoKLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAotICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7Ci0KLVBORyBmaWxlcyBzdG9yZSBSR0IgcGl4ZWxzIHBhY2tlZCBpbnRvIDMgb3IgNiBieXRlcy4gVGhpcyBjb2RlIGV4cGFuZHMgdGhlbQotaW50byA0IG9yIDggYnl0ZXMgZm9yIHdpbmRvd2luZyBzeXN0ZW1zIHRoYXQgbmVlZCB0aGVtIGluIHRoaXMgZm9ybWF0OgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCBmaWxsZXIsIFBOR19GSUxMRVJfQkVGT1JFKTsKLQotd2hlcmUgImZpbGxlciIgaXMgdGhlIDggb3IgMTYtYml0IG51bWJlciB0byBmaWxsIHdpdGgsIGFuZCB0aGUgbG9jYXRpb24gaXMKLWVpdGhlciBQTkdfRklMTEVSX0JFRk9SRSBvciBQTkdfRklMTEVSX0FGVEVSLCBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyCi15b3Ugd2FudCB0aGUgZmlsbGVyIGJlZm9yZSB0aGUgUkdCIG9yIGFmdGVyLiAgVGhpcyB0cmFuc2Zvcm1hdGlvbgotZG9lcyBub3QgYWZmZWN0IGltYWdlcyB0aGF0IGFscmVhZHkgaGF2ZSBmdWxsIGFscGhhIGNoYW5uZWxzLiAgVG8gYWRkIGFuCi1vcGFxdWUgYWxwaGEgY2hhbm5lbCwgdXNlIGZpbGxlcj0weGZmIG9yIDB4ZmZmZiBhbmQgUE5HX0ZJTExFUl9BRlRFUiB3aGljaAotd2lsbCBnZW5lcmF0ZSBSR0JBIHBpeGVscy4KLQotTm90ZSB0aGF0IHBuZ19zZXRfZmlsbGVyKCkgZG9lcyBub3QgY2hhbmdlIHRoZSBjb2xvciB0eXBlLiAgSWYgeW91IHdhbnQKLXRvIGRvIHRoYXQsIHlvdSBjYW4gYWRkIGEgdHJ1ZSBhbHBoYSBjaGFubmVsIHdpdGgKLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAotICAgICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCi0gICAgcG5nX3NldF9hZGRfYWxwaGEocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0FGVEVSKTsKLQotd2hlcmUgImZpbGxlciIgY29udGFpbnMgdGhlIGFscGhhIHZhbHVlIHRvIGFzc2lnbiB0byBlYWNoIHBpeGVsLgotVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgaW4gbGlicG5nLTEuMi43LgotCi1JZiB5b3UgYXJlIHJlYWRpbmcgYW4gaW1hZ2Ugd2l0aCBhbiBhbHBoYSBjaGFubmVsLCBhbmQgeW91IG5lZWQgdGhlCi1kYXRhIGFzIEFSR0IgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIFBORyBmb3JtYXQgUkdCQToKLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICAgICAgcG5nX3NldF9zd2FwX2FscGhhKHBuZ19wdHIpOwotCi1Gb3Igc29tZSB1c2VzLCB5b3UgbWF5IHdhbnQgYSBncmF5c2NhbGUgaW1hZ2UgdG8gYmUgcmVwcmVzZW50ZWQgYXMKLVJHQi4gIFRoaXMgY29kZSB3aWxsIGRvIHRoYXQgY29udmVyc2lvbjoKLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKLSAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgICAgIHBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7Ci0KLUNvbnZlcnNlbHksIHlvdSBjYW4gY29udmVydCBhbiBSR0Igb3IgUkdCQSBpbWFnZSB0byBncmF5c2NhbGUgb3IgZ3JheXNjYWxlCi13aXRoIGFscGhhLgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8Ci0gICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQocG5nX3B0ciwgZXJyb3JfYWN0aW9uLAotICAgICAgICAgICAgIGludCByZWRfd2VpZ2h0LCBpbnQgZ3JlZW5fd2VpZ2h0KTsKLQotICAgIGVycm9yX2FjdGlvbiA9IDE6IHNpbGVudGx5IGRvIHRoZSBjb252ZXJzaW9uCi0gICAgZXJyb3JfYWN0aW9uID0gMjogaXNzdWUgYSB3YXJuaW5nIGlmIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhhcyBhbnkgcGl4ZWwgd2hlcmUKLSAgICAgICAgICAgICAgICAgICAgICByZWQgIT0gZ3JlZW4gb3IgcmVkICE9IGJsdWUKLSAgICBlcnJvcl9hY3Rpb24gPSAzOiBpc3N1ZSBhbiBlcnJvciBhbmQgYWJvcnQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiBpZiB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoYXMgYW55IHBpeGVsIHdoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgcmVkICE9IGdyZWVuIG9yIHJlZCAhPSBibHVlCi0KLSAgICByZWRfd2VpZ2h0OiAgICAgICB3ZWlnaHQgb2YgcmVkIGNvbXBvbmVudCB0aW1lcyAxMDAwMDAKLSAgICBncmVlbl93ZWlnaHQ6ICAgICB3ZWlnaHQgb2YgZ3JlZW4gY29tcG9uZW50IHRpbWVzIDEwMDAwMAotICAgICAgICAgICAgICAgICAgICAgIElmIGVpdGhlciB3ZWlnaHQgaXMgbmVnYXRpdmUsIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzICgyMTI2OCwgNzE1MTQpIGFyZSB1c2VkLgotCi1JZiB5b3UgaGF2ZSBzZXQgZXJyb3JfYWN0aW9uID0gMSBvciAyLCB5b3UgY2FuCi1sYXRlciBjaGVjayB3aGV0aGVyIHRoZSBpbWFnZSByZWFsbHkgd2FzIGdyYXksIGFmdGVyIHByb2Nlc3NpbmcKLXRoZSBpbWFnZSByb3dzLCB3aXRoIHRoZSBwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cyhwbmdfcHRyKSBmdW5jdGlvbi4KLUl0IHdpbGwgcmV0dXJuIGEgcG5nX2J5dGUgdGhhdCBpcyB6ZXJvIGlmIHRoZSBpbWFnZSB3YXMgZ3JheSBvcgotMSBpZiB0aGVyZSB3ZXJlIGFueSBub24tZ3JheSBwaXhlbHMuICBiS0dEIGFuZCBzQklUIGRhdGEKLXdpbGwgYmUgc2lsZW50bHkgY29udmVydGVkIHRvIGdyYXlzY2FsZSwgdXNpbmcgdGhlIGdyZWVuIGNoYW5uZWwKLWRhdGEsIHJlZ2FyZGxlc3Mgb2YgdGhlIGVycm9yX2FjdGlvbiBzZXR0aW5nLgotCi1XaXRoIHJlZF93ZWlnaHQrZ3JlZW5fd2VpZ2h0PD0xMDAwMDAsCi10aGUgbm9ybWFsaXplZCBncmF5bGV2ZWwgaXMgY29tcHV0ZWQ6Ci0KLSAgICBpbnQgcncgPSByZWRfd2VpZ2h0ICogNjU1MzY7Ci0gICAgaW50IGd3ID0gZ3JlZW5fd2VpZ2h0ICogNjU1MzY7Ci0gICAgaW50IGJ3ID0gNjU1MzYgLSAocncgKyBndyk7Ci0gICAgZ3JheSA9IChydypyZWQgKyBndypncmVlbiArIGJ3KmJsdWUpLzY1NTM2OwotCi1UaGUgZGVmYXVsdCB2YWx1ZXMgYXBwcm94aW1hdGUgdGhvc2UgcmVjb21tZW5kZWQgaW4gdGhlIENoYXJsZXMKLVBveW50b24ncyBDb2xvciBGQVEsIDxodHRwOi8vd3d3LmluZm9yYW1wLm5ldC9+cG95bnRvbi8+Ci1Db3B5cmlnaHQgKGMpIDE5OTgtMDEtMDQgQ2hhcmxlcyBQb3ludG9uIDxwb3ludG9uIGF0IGluZm9yYW1wLm5ldD4KLQotICAgIFkgPSAwLjIxMjY3MSAqIFIgKyAwLjcxNTE2MCAqIEcgKyAwLjA3MjE2OSAqIEIKLQotTGlicG5nIGFwcHJveGltYXRlcyB0aGlzIHdpdGgKLQotICAgIFkgPSAwLjIxMjY4ICogUiAgICArIDAuNzE1MSAqIEcgICAgKyAwLjA3MjE3ICogQgotCi13aGljaCBjYW4gYmUgZXhwcmVzc2VkIHdpdGggaW50ZWdlcnMgYXMKLQotICAgIFkgPSAoNjk2OSAqIFIgKyAyMzQzNCAqIEcgKyAyMzY1ICogQikvMzI3NjgKLQotVGhlIGNhbGN1bGF0aW9uIGlzIGRvbmUgaW4gYSBsaW5lYXIgY29sb3JzcGFjZSwgaWYgdGhlIGltYWdlIGdhbW1hCi1pcyBrbm93bi4KLQotSWYgeW91IGhhdmUgYSBncmF5c2NhbGUgYW5kIHlvdSBhcmUgdXNpbmcgcG5nX3NldF9leHBhbmRfZGVwdGgoKSwKLXBuZ19zZXRfZXhwYW5kKCksIG9yIHBuZ19zZXRfZ3JheV90b19yZ2IgdG8gY2hhbmdlIHRvIHRydWVjb2xvciBvciB0bwotYSBoaWdoZXIgYml0LWRlcHRoLCB5b3UgbXVzdCBlaXRoZXIgc3VwcGx5IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIGEgZ3JheQotdmFsdWUgYXQgdGhlIG9yaWdpbmFsIGZpbGUgYml0LWRlcHRoIChuZWVkX2V4cGFuZCA9IDEpIG9yIGVsc2Ugc3VwcGx5IHRoZQotYmFja2dyb3VuZCBjb2xvciBhcyBhbiBSR0IgdHJpcGxldCBhdCB0aGUgZmluYWwsIGV4cGFuZGVkIGJpdCBkZXB0aAotKG5lZWRfZXhwYW5kID0gMCkuICBTaW1pbGFybHksIGlmIHlvdSBhcmUgcmVhZGluZyBhIHBhbGV0dGVkIGltYWdlLCB5b3UKLW11c3QgZWl0aGVyIHN1cHBseSB0aGUgYmFja2dyb3VuZCBjb2xvciBhcyBhIHBhbGV0dGUgaW5kZXggKG5lZWRfZXhwYW5kID0gMSkKLW9yIGFzIGFuIFJHQiB0cmlwbGV0IHRoYXQgbWF5IG9yIG1heSBub3QgYmUgaW4gdGhlIHBhbGV0dGUgKG5lZWRfZXhwYW5kID0gMCkuCi0KLSAgICBwbmdfY29sb3JfMTYgbXlfYmFja2dyb3VuZDsKLSAgICBwbmdfY29sb3JfMTZwIGltYWdlX2JhY2tncm91bmQ7Ci0KLSAgICBpZiAocG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmaW1hZ2VfYmFja2dyb3VuZCkpCi0gICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCBpbWFnZV9iYWNrZ3JvdW5kLAotICAgICAgICAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUsIDEsIDEuMCk7Ci0gICAgZWxzZQotICAgICAgICBwbmdfc2V0X2JhY2tncm91bmQocG5nX3B0ciwgJm15X2JhY2tncm91bmQsCi0gICAgICAgICAgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOLCAwLCAxLjApOwotCi1UaGUgcG5nX3NldF9iYWNrZ3JvdW5kKCkgZnVuY3Rpb24gdGVsbHMgbGlicG5nIHRvIGNvbXBvc2l0ZSBpbWFnZXMKLXdpdGggYWxwaGEgb3Igc2ltcGxlIHRyYW5zcGFyZW5jeSBhZ2FpbnN0IHRoZSBzdXBwbGllZCBiYWNrZ3JvdW5kCi1jb2xvci4gIElmIHRoZSBQTkcgZmlsZSBjb250YWlucyBhIGJLR0QgY2h1bmsgKFBOR19JTkZPX2JLR0QgdmFsaWQpLAoteW91IG1heSB1c2UgdGhpcyBjb2xvciwgb3Igc3VwcGx5IGFub3RoZXIgY29sb3IgbW9yZSBzdWl0YWJsZSBmb3IKLXRoZSBjdXJyZW50IGRpc3BsYXkgKGUuZy4sIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYSB3ZWIgcGFnZSkuICBZb3UKLW5lZWQgdG8gdGVsbCBsaWJwbmcgd2hldGhlciB0aGUgY29sb3IgaXMgaW4gdGhlIGdhbW1hIHNwYWNlIG9mIHRoZQotZGlzcGxheSAoUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOIGZvciBjb2xvcnMgeW91IHN1cHBseSksIHRoZSBmaWxlCi0oUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRSBmb3IgY29sb3JzIGZyb20gdGhlIGJLR0QgY2h1bmspLCBvciBvbmUKLXRoYXQgaXMgbmVpdGhlciBvZiB0aGVzZSBnYW1tYXMgKFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOSVFVRSAtIEkgZG9uJ3QKLWtub3cgd2h5IGFueW9uZSB3b3VsZCB1c2UgdGhpcywgYnV0IGl0J3MgaGVyZSkuCi0KLVRvIHByb3Blcmx5IGRpc3BsYXkgUE5HIGltYWdlcyBvbiBhbnkga2luZCBvZiBzeXN0ZW0sIHRoZSBhcHBsaWNhdGlvbiBuZWVkcwotdG8ga25vdyB3aGF0IHRoZSBkaXNwbGF5IGdhbW1hIGlzLiAgSWRlYWxseSwgdGhlIHVzZXIgd2lsbCBrbm93IHRoaXMsIGFuZAotdGhlIGFwcGxpY2F0aW9uIHdpbGwgYWxsb3cgdGhlbSB0byBzZXQgaXQuICBPbmUgbWV0aG9kIG9mIGFsbG93aW5nIHRoZSB1c2VyCi10byBzZXQgdGhlIGRpc3BsYXkgZ2FtbWEgc2VwYXJhdGVseSBmb3IgZWFjaCBzeXN0ZW0gaXMgdG8gY2hlY2sgZm9yIGEKLVNDUkVFTl9HQU1NQSBvciBESVNQTEFZX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aGljaCB3aWxsIGhvcGVmdWxseSBiZQotY29ycmVjdGx5IHNldC4KLQotTm90ZSB0aGF0IGRpc3BsYXlfZ2FtbWEgaXMgdGhlIG92ZXJhbGwgZ2FtbWEgY29ycmVjdGlvbiByZXF1aXJlZCB0byBwcm9kdWNlCi1wbGVhc2luZyByZXN1bHRzLCB3aGljaCBkZXBlbmRzIG9uIHRoZSBsaWdodGluZyBjb25kaXRpb25zIGluIHRoZSBzdXJyb3VuZGluZwotZW52aXJvbm1lbnQuICBJbiBhIGRpbSBvciBicmlnaHRseSBsaXQgcm9vbSwgbm8gY29tcGVuc2F0aW9uIG90aGVyIHRoYW4KLXRoZSBwaHlzaWNhbCBnYW1tYSBleHBvbmVudCBvZiB0aGUgbW9uaXRvciBpcyBuZWVkZWQsIHdoaWxlIGluIGEgZGFyayByb29tCi1hIHNsaWdodGx5IHNtYWxsZXIgZXhwb25lbnQgaXMgYmV0dGVyLgotCi0gICBkb3VibGUgZ2FtbWEsIHNjcmVlbl9nYW1tYTsKLQotICAgaWYgKC8qIFdlIGhhdmUgYSB1c2VyLWRlZmluZWQgc2NyZWVuCi0gICAgICAgZ2FtbWEgdmFsdWUgKi8pCi0gICB7Ci0gICAgICBzY3JlZW5fZ2FtbWEgPSB1c2VyX2RlZmluZWRfc2NyZWVuX2dhbW1hOwotICAgfQotICAgLyogT25lIHdheSB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gc2hhcmUgdGhlIHNhbWUKLSAgICAgIHNjcmVlbiBnYW1tYSB2YWx1ZSAqLwotICAgZWxzZSBpZiAoKGdhbW1hX3N0ciA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpCi0gICAgICAhPSBOVUxMKQotICAgewotICAgICAgc2NyZWVuX2dhbW1hID0gKGRvdWJsZSlhdG9mKGdhbW1hX3N0cik7Ci0gICB9Ci0gICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFub3RoZXIgdmFsdWUgKi8KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHNjcmVlbl9nYW1tYSA9IDIuMjsgLyogQSBnb29kIGd1ZXNzIGZvciBhCi0gICAgICAgICAgIFBDIG1vbml0b3IgaW4gYSBicmlnaHQgb2ZmaWNlIG9yIGEgZGltIHJvb20gKi8KLSAgICAgIHNjcmVlbl9nYW1tYSA9IDIuMDsgLyogQSBnb29kIGd1ZXNzIGZvciBhCi0gICAgICAgICAgIFBDIG1vbml0b3IgaW4gYSBkYXJrIHJvb20gKi8KLSAgICAgIHNjcmVlbl9nYW1tYSA9IDEuNyBvciAxLjA7ICAvKiBBIGdvb2QKLSAgICAgICAgICAgZ3Vlc3MgZm9yIE1hYyBzeXN0ZW1zICovCi0gICB9Ci0KLVRoZSBwbmdfc2V0X2dhbW1hKCkgZnVuY3Rpb24gaGFuZGxlcyBnYW1tYSB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGRhdGEuCi1QYXNzIGJvdGggdGhlIGZpbGUgZ2FtbWEgYW5kIHRoZSBjdXJyZW50IHNjcmVlbl9nYW1tYS4gIElmIHRoZSBmaWxlIGRvZXMKLW5vdCBoYXZlIGEgZ2FtbWEgdmFsdWUsIHlvdSBjYW4gcGFzcyBvbmUgYW55d2F5IGlmIHlvdSBoYXZlIGFuIGlkZWEgd2hhdAotaXQgaXMgKHVzdWFsbHkgMC40NTQ1NSBpcyBhIGdvb2QgZ3Vlc3MgZm9yIEdJRiBpbWFnZXMgb24gUENzKS4gIE5vdGUKLXRoYXQgZmlsZSBnYW1tYXMgYXJlIGludmVydGVkIGZyb20gc2NyZWVuIGdhbW1hcy4gIFNlZSB0aGUgZGlzY3Vzc2lvbnMKLW9uIGdhbW1hIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgYW4gZXhjZWxsZW50IGRlc2NyaXB0aW9uIG9mIHdoYXQKLWdhbW1hIGlzLCBhbmQgd2h5IGFsbCBhcHBsaWNhdGlvbnMgc2hvdWxkIHN1cHBvcnQgaXQuICBJdCBpcyBzdHJvbmdseQotcmVjb21tZW5kZWQgdGhhdCBQTkcgdmlld2VycyBzdXBwb3J0IGdhbW1hIGNvcnJlY3Rpb24uCi0KLSAgIGlmIChwbmdfZ2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsICZnYW1tYSkpCi0gICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgZ2FtbWEpOwotICAgZWxzZQotICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIDAuNDU0NTUpOwotCi1JZiB5b3UgbmVlZCB0byByZWR1Y2UgYW4gUkdCIGZpbGUgdG8gYSBwYWxldHRlZCBmaWxlLCBvciBpZiBhIHBhbGV0dGVkCi1maWxlIGhhcyBtb3JlIGVudHJpZXMgdGhlbiB3aWxsIGZpdCBvbiB5b3VyIHNjcmVlbiwgcG5nX3NldF9kaXRoZXIoKQotd2lsbCBkbyB0aGF0LiAgTm90ZSB0aGF0IHRoaXMgaXMgYSBzaW1wbGUgbWF0Y2ggZGl0aGVyIHRoYXQgbWVyZWx5Ci1maW5kcyB0aGUgY2xvc2VzdCBjb2xvciBhdmFpbGFibGUuICBUaGlzIHNob3VsZCB3b3JrIGZhaXJseSB3ZWxsIHdpdGgKLW9wdGltaXplZCBwYWxldHRlcywgYW5kIGZhaXJseSBiYWRseSB3aXRoIGxpbmVhciBjb2xvciBjdWJlcy4gIElmIHlvdQotcGFzcyBhIHBhbGV0dGUgdGhhdCBpcyBsYXJnZXIgdGhlbiBtYXhpbXVtX2NvbG9ycywgdGhlIGZpbGUgd2lsbAotcmVkdWNlIHRoZSBudW1iZXIgb2YgY29sb3JzIGluIHRoZSBwYWxldHRlIHNvIGl0IHdpbGwgZml0IGludG8KLW1heGltdW1fY29sb3JzLiAgSWYgdGhlcmUgaXMgYSBoaXN0b2dyYW0sIGl0IHdpbGwgdXNlIGl0IHRvIG1ha2UKLW1vcmUgaW50ZWxsaWdlbnQgY2hvaWNlcyB3aGVuIHJlZHVjaW5nIHRoZSBwYWxldHRlLiAgSWYgdGhlcmUgaXMgbm8KLWhpc3RvZ3JhbSwgaXQgbWF5IG5vdCBkbyBhcyBnb29kIGEgam9iLgotCi0gICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgewotICAgICAgaWYgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgICBQTkdfSU5GT19QTFRFKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ191aW50XzE2cCBoaXN0b2dyYW0gPSBOVUxMOwotCi0gICAgICAgICBwbmdfZ2V0X2hJU1QocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgICAgICAmaGlzdG9ncmFtKTsKLSAgICAgICAgIHBuZ19zZXRfZGl0aGVyKHBuZ19wdHIsIHBhbGV0dGUsIG51bV9wYWxldHRlLAotICAgICAgICAgICAgbWF4X3NjcmVlbl9jb2xvcnMsIGhpc3RvZ3JhbSwgMSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBwbmdfY29sb3Igc3RkX2NvbG9yX2N1YmVbTUFYX1NDUkVFTl9DT0xPUlNdID0KLSAgICAgICAgICAgIHsgLi4uIGNvbG9ycyAuLi4gfTsKLQotICAgICAgICAgcG5nX3NldF9kaXRoZXIocG5nX3B0ciwgc3RkX2NvbG9yX2N1YmUsCi0gICAgICAgICAgICBNQVhfU0NSRUVOX0NPTE9SUywgTUFYX1NDUkVFTl9DT0xPUlMsCi0gICAgICAgICAgICBOVUxMLDApOwotICAgICAgfQotICAgfQotCi1QTkcgZmlsZXMgZGVzY3JpYmUgbW9ub2Nocm9tZSBhcyBibGFjayBiZWluZyB6ZXJvIGFuZCB3aGl0ZSBiZWluZyBvbmUuCi1UaGUgZm9sbG93aW5nIGNvZGUgd2lsbCByZXZlcnNlIHRoaXMgKG1ha2UgYmxhY2sgYmUgb25lIGFuZCB3aGl0ZSBiZQotemVybyk6Ci0KLSAgIGlmIChiaXRfZGVwdGggPT0gMSAmJiBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCi0gICAgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOwotCi1UaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHVzZWQgdG8gaW52ZXJ0IGdyYXlzY2FsZSBhbmQgZ3JheS1hbHBoYSBpbWFnZXM6Ci0KLSAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKLSAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHN0b3JlIDE2IGJpdCBwaXhlbHMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWctZW5kaWFuLAotaWUuIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBmaXJzdCkuICBUaGlzIGNvZGUgY2hhbmdlcyB0aGUgc3RvcmFnZSB0byB0aGUKLW90aGVyIHdheSAobGl0dGxlLWVuZGlhbiwgaS5lLiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0LCB0aGUKLXdheSBQQ3Mgc3RvcmUgdGhlbSk6Ci0KLSAgICBpZiAoYml0X2RlcHRoID09IDE2KQotICAgICAgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7Ci0KLUlmIHlvdSBhcmUgdXNpbmcgcGFja2VkLXBpeGVsIGltYWdlcyAoMSwgMiwgb3IgNCBiaXRzL3BpeGVsKSwgYW5kIHlvdQotbmVlZCB0byBjaGFuZ2UgdGhlIG9yZGVyIHRoZSBwaXhlbHMgYXJlIHBhY2tlZCBpbnRvIGJ5dGVzLCB5b3UgY2FuIHVzZToKLQotICAgIGlmIChiaXRfZGVwdGggPCA4KQotICAgICAgIHBuZ19zZXRfcGFja3N3YXAocG5nX3B0cik7Ci0KLUZpbmFsbHksIHlvdSBjYW4gd3JpdGUgeW91ciBvd24gdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gaWYgbm9uZSBvZgotdGhlIGV4aXN0aW5nIG9uZXMgbWVldHMgeW91ciBuZWVkcy4gIFRoaXMgaXMgZG9uZSBieSBzZXR0aW5nIGEgY2FsbGJhY2sKLXdpdGgKLQotICAgIHBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbihwbmdfcHRyLAotICAgICAgIHJlYWRfdHJhbnNmb3JtX2ZuKTsKLQotWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgotCi0gICAgdm9pZCByZWFkX3RyYW5zZm9ybV9mbihwbmdfcHRyIHB0ciwgcm93X2luZm9fcHRyCi0gICAgICAgcm93X2luZm8sIHBuZ19ieXRlcCBkYXRhKQotCi1TZWUgcG5ndGVzdC5jIGZvciBhIHdvcmtpbmcgZXhhbXBsZS4gIFlvdXIgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKLWFmdGVyIGFsbCBvZiB0aGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiBwcm9jZXNzZWQuCi0KLVlvdSBjYW4gYWxzbyBzZXQgdXAgYSBwb2ludGVyIHRvIGEgdXNlciBzdHJ1Y3R1cmUgZm9yIHVzZSBieSB5b3VyCi1jYWxsYmFjayBmdW5jdGlvbiwgYW5kIHlvdSBjYW4gaW5mb3JtIGxpYnBuZyB0aGF0IHlvdXIgdHJhbnNmb3JtCi1mdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGJpdCBkZXB0aCB3aXRoIHRoZQotZnVuY3Rpb24KLQotICAgIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCB1c2VyX3B0ciwKLSAgICAgICB1c2VyX2RlcHRoLCB1c2VyX2NoYW5uZWxzKTsKLQotVGhlIHVzZXIncyBhcHBsaWNhdGlvbiwgbm90IGxpYnBuZywgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcgYW5kCi1mcmVlaW5nIGFueSBtZW1vcnkgcmVxdWlyZWQgZm9yIHRoZSB1c2VyIHN0cnVjdHVyZS4KLQotWW91IGNhbiByZXRyaWV2ZSB0aGUgcG9pbnRlciB2aWEgdGhlIGZ1bmN0aW9uCi1wbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cigpLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICB2b2lkcCByZWFkX3VzZXJfdHJhbnNmb3JtX3B0ciA9Ci0gICAgICAgcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIocG5nX3B0cik7Ci0KLVRoZSBsYXN0IHRoaW5nIHRvIGhhbmRsZSBpcyBpbnRlcmxhY2luZzsgdGhpcyBpcyBjb3ZlcmVkIGluIGRldGFpbCBiZWxvdywKLWJ1dCB5b3UgbXVzdCBjYWxsIHRoZSBmdW5jdGlvbiBoZXJlIGlmIHlvdSB3YW50IGxpYnBuZyB0byBoYW5kbGUgZXhwYW5zaW9uCi1vZiB0aGUgaW50ZXJsYWNlZCBpbWFnZS4KLQotICAgIG51bWJlcl9vZl9wYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLQotQWZ0ZXIgc2V0dGluZyB0aGUgdHJhbnNmb3JtYXRpb25zLCBsaWJwbmcgY2FuIHVwZGF0ZSB5b3VyIHBuZ19pbmZvCi1zdHJ1Y3R1cmUgdG8gcmVmbGVjdCBhbnkgdHJhbnNmb3JtYXRpb25zIHlvdSd2ZSByZXF1ZXN0ZWQgd2l0aCB0aGlzCi1jYWxsLiAgVGhpcyBpcyBtb3N0IHVzZWZ1bCB0byB1cGRhdGUgdGhlIGluZm8gc3RydWN0dXJlJ3Mgcm93Ynl0ZXMKLWZpZWxkIHNvIHlvdSBjYW4gdXNlIGl0IHRvIGFsbG9jYXRlIHlvdXIgaW1hZ2UgbWVtb3J5LiAgVGhpcyBmdW5jdGlvbgotd2lsbCBhbHNvIHVwZGF0ZSB5b3VyIHBhbGV0dGUgd2l0aCB0aGUgY29ycmVjdCBzY3JlZW5fZ2FtbWEgYW5kCi1iYWNrZ3JvdW5kIGlmIHRoZXNlIGhhdmUgYmVlbiBnaXZlbiB3aXRoIHRoZSBjYWxscyBhYm92ZS4KLQotICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotQWZ0ZXIgeW91IGNhbGwgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSwgeW91IGNhbiBhbGxvY2F0ZSBhbnkKLW1lbW9yeSB5b3UgbmVlZCB0byBob2xkIHRoZSBpbWFnZS4gIFRoZSByb3cgZGF0YSBpcyBzaW1wbHkKLXJhdyBieXRlIGRhdGEgZm9yIGFsbCBmb3JtcyBvZiBpbWFnZXMuICBBcyB0aGUgYWN0dWFsIGFsbG9jYXRpb24KLXZhcmllcyBhbW9uZyBhcHBsaWNhdGlvbnMsIG5vIGV4YW1wbGUgd2lsbCBiZSBnaXZlbi4gIElmIHlvdQotYXJlIGFsbG9jYXRpbmcgb25lIGxhcmdlIGNodW5rLCB5b3Ugd2lsbCBuZWVkIHRvIGJ1aWxkIGFuCi1hcnJheSBvZiBwb2ludGVycyB0byBlYWNoIHJvdywgYXMgaXQgd2lsbCBiZSBuZWVkZWQgZm9yIHNvbWUKLW9mIHRoZSBmdW5jdGlvbnMgYmVsb3cuCi0KLVJlYWRpbmcgaW1hZ2UgZGF0YQotCi1BZnRlciB5b3UndmUgYWxsb2NhdGVkIG1lbW9yeSwgeW91IGNhbiByZWFkIHRoZSBpbWFnZSBkYXRhLgotVGhlIHNpbXBsZXN0IHdheSB0byBkbyB0aGlzIGlzIGluIG9uZSBmdW5jdGlvbiBjYWxsLiAgSWYgeW91IGFyZQotYWxsb2NhdGluZyBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHdob2xlIGltYWdlLCB5b3UgY2FuIGp1c3QKLWNhbGwgcG5nX3JlYWRfaW1hZ2UoKSBhbmQgbGlicG5nIHdpbGwgcmVhZCBpbiBhbGwgdGhlIGltYWdlIGRhdGEKLWFuZCBwdXQgaXQgaW4gdGhlIG1lbW9yeSBhcmVhIHN1cHBsaWVkLiAgWW91IHdpbGwgbmVlZCB0byBwYXNzIGluCi1hbiBhcnJheSBvZiBwb2ludGVycyB0byBlYWNoIHJvdy4KLQotVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW50ZXJsYWNpbmcsIHNvIHlvdSBkb24ndCBuZWVkCi10byBjYWxsIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgb3IgY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlCi10aW1lcywgb3IgYW55IG9mIHRoYXQgb3RoZXIgc3R1ZmYgbmVjZXNzYXJ5IHdpdGggcG5nX3JlYWRfcm93cygpLgotCi0gICBwbmdfcmVhZF9pbWFnZShwbmdfcHRyLCByb3dfcG9pbnRlcnMpOwotCi13aGVyZSByb3dfcG9pbnRlcnMgaXM6Ci0KLSAgIHBuZ19ieXRlcCByb3dfcG9pbnRlcnNbaGVpZ2h0XTsKLQotWW91IGNhbiBwb2ludCB0byB2b2lkIG9yIGNoYXIgb3Igd2hhdGV2ZXIgeW91IHVzZSBmb3IgcGl4ZWxzLgotCi1JZiB5b3UgZG9uJ3Qgd2FudCB0byByZWFkIGluIHRoZSB3aG9sZSBpbWFnZSBhdCBvbmNlLCB5b3UgY2FuCi11c2UgcG5nX3JlYWRfcm93cygpIGluc3RlYWQuICBJZiB0aGVyZSBpcyBubyBpbnRlcmxhY2luZyAoY2hlY2sKLWludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfTk9ORSksIHRoaXMgaXMgc2ltcGxlOgotCi0gICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCByb3dfcG9pbnRlcnMsIE5VTEwsCi0gICAgICAgbnVtYmVyX29mX3Jvd3MpOwotCi13aGVyZSByb3dfcG9pbnRlcnMgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHBuZ19yZWFkX2ltYWdlKCkgY2FsbC4KLQotSWYgeW91IGFyZSBkb2luZyB0aGlzIGp1c3Qgb25lIHJvdyBhdCBhIHRpbWUsIHlvdSBjYW4gZG8gdGhpcyB3aXRoCi1hIHNpbmdsZSByb3dfcG9pbnRlciBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIHJvd19wb2ludGVyczoKLQotICAgIHBuZ19ieXRlcCByb3dfcG9pbnRlciA9IHJvdzsKLSAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcm93X3BvaW50ZXIsIE5VTEwpOwotCi1JZiB0aGUgZmlsZSBpcyBpbnRlcmxhY2VkIChpbnRlcmxhY2VfdHlwZSAhPSAwIGluIHRoZSBJSERSIGNodW5rKSwgdGhpbmdzCi1nZXQgc29tZXdoYXQgaGFyZGVyLiAgVGhlIG9ubHkgY3VycmVudCAoUE5HIFNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIpCi1pbnRlcmxhY2luZyB0eXBlIGZvciBQTkcgaXMgKGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCi1pcyBhIHNvbWV3aGF0IGNvbXBsaWNhdGVkIDJEIGludGVybGFjZSBzY2hlbWUsIGtub3duIGFzIEFkYW03LCB0aGF0Ci1icmVha3MgZG93biBhbiBpbWFnZSBpbnRvIHNldmVuIHNtYWxsZXIgaW1hZ2VzIG9mIHZhcnlpbmcgc2l6ZSwgYmFzZWQKLW9uIGFuIDh4OCBncmlkLgotCi1saWJwbmcgY2FuIGZpbGwgb3V0IHRob3NlIGltYWdlcyBvciBpdCBjYW4gZ2l2ZSB0aGVtIHRvIHlvdSAiYXMgaXMiLgotSWYgeW91IHdhbnQgdGhlbSBmaWxsZWQgb3V0LCB0aGVyZSBhcmUgdHdvIHdheXMgdG8gZG8gdGhhdC4gIFRoZSBvbmUKLW1lbnRpb25lZCBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24gaXMgdG8gZXhwYW5kIGVhY2ggcGl4ZWwgdG8gY292ZXIKLXRob3NlIHBpeGVscyB0aGF0IGhhdmUgbm90IGJlZW4gcmVhZCB5ZXQgKHRoZSAicmVjdGFuZ2xlIiBtZXRob2QpLgotVGhpcyByZXN1bHRzIGluIGEgYmxvY2t5IGltYWdlIGZvciB0aGUgZmlyc3QgcGFzcywgd2hpY2ggZ3JhZHVhbGx5Ci1zbW9vdGhzIG91dCBhcyBtb3JlIHBpeGVscyBhcmUgcmVhZC4gIFRoZSBvdGhlciBtZXRob2QgaXMgdGhlICJzcGFya2xlIgotbWV0aG9kLCB3aGVyZSBwaXhlbHMgYXJlIGRyYXduIG9ubHkgaW4gdGhlaXIgZmluYWwgbG9jYXRpb25zLCB3aXRoIHRoZQotcmVzdCBvZiB0aGUgaW1hZ2UgcmVtYWluaW5nIHdoYXRldmVyIGNvbG9ycyB0aGV5IHdlcmUgaW5pdGlhbGl6ZWQgdG8KLWJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHJlYWQuICBUaGUgZmlyc3QgbWV0aG9kIHVzdWFsbHkgbG9va3MgYmV0dGVyLAotYnV0IHRlbmRzIHRvIGJlIHNsb3dlciwgYXMgdGhlcmUgYXJlIG1vcmUgcGl4ZWxzIHRvIHB1dCBpbiB0aGUgcm93cy4KLQotSWYgeW91IGRvbid0IHdhbnQgbGlicG5nIHRvIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcgZGV0YWlscywganVzdCBjYWxsCi1wbmdfcmVhZF9yb3dzKCkgc2V2ZW4gdGltZXMgdG8gcmVhZCBpbiBhbGwgc2V2ZW4gaW1hZ2VzLiAgRWFjaCBvZiB0aGUKLWltYWdlcyBpcyBhIHZhbGlkIGltYWdlIGJ5IGl0c2VsZiwgb3IgdGhleSBjYW4gYWxsIGJlIGNvbWJpbmVkIG9uIGFuCi04eDggZ3JpZCB0byBmb3JtIGEgc2luZ2xlIGltYWdlIChhbHRob3VnaCBpZiB5b3UgaW50ZW5kIHRvIGNvbWJpbmUgdGhlbQoteW91IHdvdWxkIGJlIGZhciBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBsaWJwbmcgaW50ZXJsYWNlIGhhbmRsaW5nKS4KLQotVGhlIGZpcnN0IHBhc3Mgd2lsbCByZXR1cm4gYW4gaW1hZ2UgMS84IGFzIHdpZGUgYXMgdGhlIGVudGlyZSBpbWFnZQotKGV2ZXJ5IDh0aCBjb2x1bW4gc3RhcnRpbmcgaW4gY29sdW1uIDApIGFuZCAxLzggYXMgaGlnaCBhcyB0aGUgb3JpZ2luYWwKLShldmVyeSA4dGggcm93IHN0YXJ0aW5nIGluIHJvdyAwKSwgdGhlIHNlY29uZCB3aWxsIGJlIDEvOCBhcyB3aWRlCi0oc3RhcnRpbmcgaW4gY29sdW1uIDQpIGFuZCAxLzggYXMgaGlnaCAoYWxzbyBzdGFydGluZyBpbiByb3cgMCkuICBUaGUKLXRoaXJkIHBhc3Mgd2lsbCBiZSAxLzQgYXMgd2lkZSAoZXZlcnkgNHRoIHBpeGVsIHN0YXJ0aW5nIGluIGNvbHVtbiAwKSBhbmQKLTEvOCBhcyBoaWdoIChldmVyeSA4dGggcm93IHN0YXJ0aW5nIGluIHJvdyA0KSwgYW5kIHRoZSBmb3VydGggcGFzcyB3aWxsCi1iZSAxLzQgYXMgd2lkZSBhbmQgMS80IGFzIGhpZ2ggKGV2ZXJ5IDR0aCBjb2x1bW4gc3RhcnRpbmcgaW4gY29sdW1uIDIsCi1hbmQgZXZlcnkgNHRoIHJvdyBzdGFydGluZyBpbiByb3cgMCkuICBUaGUgZmlmdGggcGFzcyB3aWxsIHJldHVybiBhbgotaW1hZ2UgMS8yIGFzIHdpZGUsIGFuZCAxLzQgYXMgaGlnaCAoc3RhcnRpbmcgYXQgY29sdW1uIDAgYW5kIHJvdyAyKSwKLXdoaWxlIHRoZSBzaXh0aCBwYXNzIHdpbGwgYmUgMS8yIGFzIHdpZGUgYW5kIDEvMiBhcyBoaWdoIGFzIHRoZSBvcmlnaW5hbAotKHN0YXJ0aW5nIGluIGNvbHVtbiAxIGFuZCByb3cgMCkuICBUaGUgc2V2ZW50aCBhbmQgZmluYWwgcGFzcyB3aWxsIGJlIGFzCi13aWRlIGFzIHRoZSBvcmlnaW5hbCwgYW5kIDEvMiBhcyBoaWdoLCBjb250YWluaW5nIGFsbCBvZiB0aGUgb2RkCi1udW1iZXJlZCBzY2FubGluZXMuICBQaGV3IQotCi1JZiB5b3Ugd2FudCBsaWJwbmcgdG8gZXhwYW5kIHRoZSBpbWFnZXMsIGNhbGwgdGhpcyBiZWZvcmUgY2FsbGluZwotcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKSBvciBwbmdfcmVhZF91cGRhdGVfaW5mbygpOgotCi0gICAgaWYgKGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCi0gICAgICAgIG51bWJlcl9vZl9wYXNzZXMKLSAgICAgICAgICAgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLQotVGhpcyB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhc3NlcyBuZWVkZWQuICBDdXJyZW50bHksIHRoaXMKLWlzIHNldmVuLCBidXQgbWF5IGNoYW5nZSBpZiBhbm90aGVyIGludGVybGFjZSB0eXBlIGlzIGFkZGVkLgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGV2ZW4gaWYgdGhlIGZpbGUgaXMgbm90IGludGVybGFjZWQsCi13aGVyZSBpdCB3aWxsIHJldHVybiBvbmUgcGFzcy4KLQotSWYgeW91IGFyZSBub3QgZ29pbmcgdG8gZGlzcGxheSB0aGUgaW1hZ2UgYWZ0ZXIgZWFjaCBwYXNzLCBidXQgYXJlCi1nb2luZyB0byB3YWl0IHVudGlsIHRoZSBlbnRpcmUgaW1hZ2UgaXMgcmVhZCBpbiwgdXNlIHRoZSBzcGFya2xlCi1lZmZlY3QuICBUaGlzIGVmZmVjdCBpcyBmYXN0ZXIgYW5kIHRoZSBlbmQgcmVzdWx0IG9mIGVpdGhlciBtZXRob2QKLWlzIGV4YWN0bHkgdGhlIHNhbWUuICBJZiB5b3UgYXJlIHBsYW5uaW5nIG9uIGRpc3BsYXlpbmcgdGhlIGltYWdlCi1hZnRlciBlYWNoIHBhc3MsIHRoZSAicmVjdGFuZ2xlIiBlZmZlY3QgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgdGhlCi1iZXR0ZXIgbG9va2luZyBvbmUuCi0KLUlmIHlvdSBvbmx5IHdhbnQgdGhlICJzcGFya2xlIiBlZmZlY3QsIGp1c3QgY2FsbCBwbmdfcmVhZF9yb3dzKCkgYXMKLW5vcm1hbCwgd2l0aCB0aGUgdGhpcmQgcGFyYW1ldGVyIE5VTEwuICBNYWtlIHN1cmUgeW91IG1ha2UgcGFzcyBvdmVyCi10aGUgaW1hZ2UgbnVtYmVyX29mX3Bhc3NlcyB0aW1lcywgYW5kIHlvdSBkb24ndCBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlCi1yb3dzIGJldHdlZW4gY2FsbHMuICBZb3UgY2FuIGNoYW5nZSB0aGUgbG9jYXRpb25zIG9mIHRoZSBkYXRhLCBqdXN0Ci1ub3QgdGhlIGRhdGEuICBFYWNoIHBhc3Mgb25seSB3cml0ZXMgdGhlIHBpeGVscyBhcHByb3ByaWF0ZSBmb3IgdGhhdAotcGFzcywgYW5kIGFzc3VtZXMgdGhlIGRhdGEgZnJvbSBwcmV2aW91cyBwYXNzZXMgaXMgc3RpbGwgdmFsaWQuCi0KLSAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywgTlVMTCwKLSAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0KLUlmIHlvdSBvbmx5IHdhbnQgdGhlIGZpcnN0IGVmZmVjdCAodGhlIHJlY3RhbmdsZXMpLCBkbyB0aGUgc2FtZSBhcwotYmVmb3JlIGV4Y2VwdCBwYXNzIHRoZSByb3cgYnVmZmVyIGluIHRoZSB0aGlyZCBwYXJhbWV0ZXIsIGFuZCBsZWF2ZQotdGhlIHNlY29uZCBwYXJhbWV0ZXIgTlVMTC4KLQotICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgTlVMTCwgcm93X3BvaW50ZXJzLAotICAgICAgIG51bWJlcl9vZl9yb3dzKTsKLQotRmluaXNoaW5nIGEgc2VxdWVudGlhbCByZWFkCi0KLUFmdGVyIHlvdSBhcmUgZmluaXNoZWQgcmVhZGluZyB0aGUgaW1hZ2UgdGhyb3VnaCB0aGUKLWxvdy1sZXZlbCBpbnRlcmZhY2UsIHlvdSBjYW4gZmluaXNoIHJlYWRpbmcgdGhlIGZpbGUuICBJZiB5b3UgYXJlCi1pbnRlcmVzdGVkIGluIGNvbW1lbnRzIG9yIHRpbWUsIHdoaWNoIG1heSBiZSBzdG9yZWQgZWl0aGVyIGJlZm9yZSBvcgotYWZ0ZXIgdGhlIGltYWdlIGRhdGEsIHlvdSBzaG91bGQgcGFzcyB0aGUgc2VwYXJhdGUgcG5nX2luZm8gc3RydWN0IGlmCi15b3Ugd2FudCB0byBrZWVwIHRoZSBjb21tZW50cyBmcm9tIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGltYWdlCi1zZXBhcmF0ZS4gIElmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQsIHlvdSBjYW4gcGFzcyBOVUxMLgotCi0gICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgZW5kX2luZm8pOwotCi1XaGVuIHlvdSBhcmUgZG9uZSwgeW91IGNhbiBmcmVlIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGxpYnBuZyBsaWtlIHRoaXM6Ci0KLSAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCi0gICAgICAgJmVuZF9pbmZvKTsKLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmRpdmlkdWFsbHkgZnJlZSB0aGUgaW5mb19wdHIgbWVtYmVycyB0aGF0Ci1wb2ludCB0byBsaWJwbmctYWxsb2NhdGVkIHN0b3JhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgotCi0gICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgbWFzaywgc2VxKQotICAgIG1hc2sgLSBpZGVudGlmaWVzIGRhdGEgdG8gYmUgZnJlZWQsIGEgbWFzawotICAgICAgICAgICBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvcgotICAgICAgICAgICBtb3JlIG9mCi0gICAgICAgICAgICAgUE5HX0ZSRUVfUExURSwgUE5HX0ZSRUVfVFJOUywKLSAgICAgICAgICAgICBQTkdfRlJFRV9ISVNULCBQTkdfRlJFRV9JQ0NQLAotICAgICAgICAgICAgIFBOR19GUkVFX1BDQUwsIFBOR19GUkVFX1JPV1MsCi0gICAgICAgICAgICAgUE5HX0ZSRUVfU0NBTCwgUE5HX0ZSRUVfU1BMVCwKLSAgICAgICAgICAgICBQTkdfRlJFRV9URVhULCBQTkdfRlJFRV9VTktOLAotICAgICAgICAgICBvciBzaW1wbHkgUE5HX0ZSRUVfQUxMCi0gICAgc2VxICAtIHNlcXVlbmNlIG51bWJlciBvZiBpdGVtIHRvIGJlIGZyZWVkCi0gICAgICAgICAgICgtMSBmb3IgYWxsIGl0ZW1zKQotCi1UaGlzIGZ1bmN0aW9uIG1heSBiZSBzYWZlbHkgY2FsbGVkIHdoZW4gdGhlIHJlbGV2YW50IHN0b3JhZ2UgaGFzCi1hbHJlYWR5IGJlZW4gZnJlZWQsIG9yIGhhcyBub3QgeWV0IGJlZW4gYWxsb2NhdGVkLCBvciB3YXMgYWxsb2NhdGVkCi1ieSB0aGUgdXNlciBhbmQgbm90IGJ5IGxpYnBuZywgIGFuZCB3aWxsIGluIHRob3NlCi1jYXNlcyBkbyBub3RoaW5nLiAgVGhlICJzZXEiIHBhcmFtZXRlciBpcyBpZ25vcmVkIGlmIG9ubHkgb25lIGl0ZW0KLW9mIHRoZSBzZWxlY3RlZCBkYXRhIHR5cGUsIHN1Y2ggYXMgUExURSwgaXMgYWxsb3dlZC4gIElmICJzZXEiIGlzIG5vdAotLTEsIGFuZCBtdWx0aXBsZSBpdGVtcyBhcmUgYWxsb3dlZCBmb3IgdGhlIGRhdGEgdHlwZSBpZGVudGlmaWVkIGluCi10aGUgbWFzaywgc3VjaCBhcyB0ZXh0IG9yIHNQTFQsIG9ubHkgdGhlIG4ndGggaXRlbSBpbiB0aGUgc3RydWN0dXJlCi1pcyBmcmVlZCwgd2hlcmUgbiBpcyAic2VxIi4KLQotVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgb25seSB0byBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGludGVybmFsbHkKLWJ5IGxpYnBuZy4gIFRoaXMgY2FuIGJlIGNoYW5nZWQsIHNvIHRoYXQgbGlicG5nIHdpbGwgbm90IGZyZWUgdGhlIGRhdGEsCi1vciBzbyB0aGF0IGl0IHdpbGwgZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBieSB0aGUgdXNlciB3aXRoIHBuZ19tYWxsb2MoKQotb3IgcG5nX3phbGxvYygpIGFuZCBwYXNzZWQgaW4gdmlhIGEgcG5nX3NldF8qKCkgZnVuY3Rpb24sIHdpdGgKLQotICAgIHBuZ19kYXRhX2ZyZWVyKHBuZ19wdHIsIGluZm9fcHRyLCBmcmVlciwgbWFzaykKLSAgICBtYXNrICAgLSB3aGljaCBkYXRhIGVsZW1lbnRzIGFyZSBhZmZlY3RlZAotICAgICAgICAgICAgIHNhbWUgY2hvaWNlcyBhcyBpbiBwbmdfZnJlZV9kYXRhKCkKLSAgICBmcmVlciAgLSBvbmUgb2YKLSAgICAgICAgICAgICAgIFBOR19ERVNUUk9ZX1dJTExfRlJFRV9EQVRBCi0gICAgICAgICAgICAgICBQTkdfU0VUX1dJTExfRlJFRV9EQVRBCi0gICAgICAgICAgICAgICBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQQotCi1UaGlzIGZ1bmN0aW9uIG9ubHkgYWZmZWN0cyBkYXRhIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuCi1Zb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciByZWFkaW5nIHRoZSBQTkcgZGF0YSBidXQgYmVmb3JlIGNhbGxpbmcKLWFueSBwbmdfc2V0XyooKSBmdW5jdGlvbnMsIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgdXNlciBvciB0aGUgcG5nX3NldF8qKCkKLWZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGFueSBleGlzdGluZyBkYXRhIHRoYXQgbWlnaHQgYmUgcHJlc2VudCwKLWFuZCBhZ2FpbiBhZnRlciB0aGUgcG5nX3NldF8qKCkgZnVuY3Rpb25zIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgdXNlcgotb3IgcG5nX2Rlc3Ryb3lfKigpIGlzIHN1cHBvc2VkIHRvIGZyZWUgdGhlIGRhdGEuICBXaGVuIHRoZSB1c2VyIGFzc3VtZXMKLXJlc3BvbnNpYmlsaXR5IGZvciBsaWJwbmctYWxsb2NhdGVkIGRhdGEsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHVzZQotcG5nX2ZyZWUoKSB0byBmcmVlIGl0LCBhbmQgd2hlbiB0aGUgdXNlciB0cmFuc2ZlcnMgcmVzcG9uc2liaWxpdHkgdG8gbGlicG5nCi1mb3IgZGF0YSB0aGF0IHRoZSB1c2VyIGhhcyBhbGxvY2F0ZWQsIHRoZSB1c2VyIG11c3QgaGF2ZSB1c2VkIHBuZ19tYWxsb2MoKQotb3IgcG5nX3phbGxvYygpIHRvIGFsbG9jYXRlIGl0LgotCi1JZiB5b3UgYWxsb2NhdGVkIHlvdXIgcm93X3BvaW50ZXJzIGluIGEgc2luZ2xlIGJsb2NrLCBhcyBzdWdnZXN0ZWQgYWJvdmUgaW4KLXRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaGlnaCBsZXZlbCByZWFkIGludGVyZmFjZSwgeW91IG11c3Qgbm90IHRyYW5zZmVyCi1yZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyBpdCB0byB0aGUgcG5nX3NldF9yb3dzIG9yIHBuZ19yZWFkX2Rlc3Ryb3kgZnVuY3Rpb24sCi1iZWNhdXNlIHRoZXkgd291bGQgYWxzbyB0cnkgdG8gZnJlZSB0aGUgaW5kaXZpZHVhbCByb3dfcG9pbnRlcnNbaV0uCi0KLUlmIHlvdSBhbGxvY2F0ZWQgdGV4dF9wdHIudGV4dCwgdGV4dF9wdHIubGFuZywgYW5kIHRleHRfcHRyLnRyYW5zbGF0ZWRfa2V5d29yZAotc2VwYXJhdGVseSwgZG8gbm90IHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIHRleHRfcHRyIHRvIGxpYnBuZywKLWJlY2F1c2Ugd2hlbiBsaWJwbmcgZmlsbHMgYSBwbmdfdGV4dCBzdHJ1Y3R1cmUgaXQgY29tYmluZXMgdGhlc2UgbWVtYmVycyB3aXRoCi10aGUga2V5IG1lbWJlciwgYW5kIHBuZ19mcmVlX2RhdGEoKSB3aWxsIGZyZWUgb25seSB0ZXh0X3B0ci5rZXkuICBTaW1pbGFybHksCi1pZiB5b3UgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWUnaW5nIHRleHRfcHRyIGZyb20gbGlicG5nIHRvIHlvdXIKLWFwcGxpY2F0aW9uLCB5b3VyIGFwcGxpY2F0aW9uIG11c3Qgbm90IHNlcGFyYXRlbHkgZnJlZSB0aG9zZSBtZW1iZXJzLgotCi1UaGUgcG5nX2ZyZWVfZGF0YSgpIGZ1bmN0aW9uIHdpbGwgdHVybiBvZmYgdGhlICJ2YWxpZCIgZmxhZyBmb3IgYW55dGhpbmcKLWl0IGZyZWVzLiAgSWYgeW91IG5lZWQgdG8gdHVybiB0aGUgZmxhZyBvZmYgZm9yIGEgY2h1bmsgdGhhdCB3YXMgZnJlZWQgYnkgeW91cgotYXBwbGljYXRpb24gaW5zdGVhZCBvZiBieSBsaWJwbmcsIHlvdSBjYW4gdXNlCi0KLSAgICBwbmdfc2V0X2ludmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIG1hc2spOwotICAgIG1hc2sgLSBpZGVudGlmaWVzIHRoZSBjaHVua3MgdG8gYmUgbWFkZSBpbnZhbGlkLAotICAgICAgICAgICBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvcgotICAgICAgICAgICBtb3JlIG9mCi0gICAgICAgICAgICAgUE5HX0lORk9fZ0FNQSwgUE5HX0lORk9fc0JJVCwKLSAgICAgICAgICAgICBQTkdfSU5GT19jSFJNLCBQTkdfSU5GT19QTFRFLAotICAgICAgICAgICAgIFBOR19JTkZPX3RSTlMsIFBOR19JTkZPX2JLR0QsCi0gICAgICAgICAgICAgUE5HX0lORk9faElTVCwgUE5HX0lORk9fcEhZcywKLSAgICAgICAgICAgICBQTkdfSU5GT19vRkZzLCBQTkdfSU5GT190SU1FLAotICAgICAgICAgICAgIFBOR19JTkZPX3BDQUwsIFBOR19JTkZPX3NSR0IsCi0gICAgICAgICAgICAgUE5HX0lORk9faUNDUCwgUE5HX0lORk9fc1BMVCwKLSAgICAgICAgICAgICBQTkdfSU5GT19zQ0FMLCBQTkdfSU5GT19JREFUCi0KLUZvciBhIG1vcmUgY29tcGFjdCBleGFtcGxlIG9mIHJlYWRpbmcgYSBQTkcgaW1hZ2UsIHNlZSB0aGUgZmlsZSBleGFtcGxlLmMuCi0KLVJlYWRpbmcgUE5HIGZpbGVzIHByb2dyZXNzaXZlbHkKLQotVGhlIHByb2dyZXNzaXZlIHJlYWRlciBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdGhlbiB0aGUgbm9uLXByb2dyZXNzaXZlCi1yZWFkZXIuICBJbnN0ZWFkIG9mIGNhbGxpbmcgcG5nX3JlYWRfaW5mbygpLCBwbmdfcmVhZF9yb3dzKCksIGFuZAotcG5nX3JlYWRfZW5kKCksIHlvdSBtYWtlIG9uZSBjYWxsIHRvIHBuZ19wcm9jZXNzX2RhdGEoKSwgd2hpY2ggY2FsbHMKLWNhbGxiYWNrcyB3aGVuIGl0IGhhcyB0aGUgaW5mbywgYSByb3csIG9yIHRoZSBlbmQgb2YgdGhlIGltYWdlLiAgWW91Ci1zZXQgdXAgdGhlc2UgY2FsbGJhY2tzIHdpdGggcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkuICBZb3UgZG9uJ3QKLWhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGlucHV0L291dHB1dCBmdW5jdGlvbnMgb2YgbGlicG5nLCBhcyB5b3UgYXJlCi1naXZpbmcgdGhlIGxpYnJhcnkgdGhlIGRhdGEgZGlyZWN0bHkgaW4gcG5nX3Byb2Nlc3NfZGF0YSgpLiAgSSB3aWxsCi1hc3N1bWUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBzZWN0aW9uIG9uIHJlYWRpbmcgUE5HIGZpbGVzIGFib3ZlLAotc28gSSB3aWxsIG9ubHkgaGlnaGxpZ2h0IHRoZSBkaWZmZXJlbmNlcyAoYWx0aG91Z2ggSSB3aWxsIHNob3cKLWFsbCBvZiB0aGUgY29kZSkuCi0KLXBuZ19zdHJ1Y3RwIHBuZ19wdHI7Ci1wbmdfaW5mb3AgaW5mb19wdHI7Ci0KLSAvKiAgQW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50IG9mIGhvdyB5b3Ugd291bGQKLSAgICAgaW5pdGlhbGl6ZSB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIGluIHlvdXIKLSAgICAgYXBwbGljYXRpb24uICovCi0gaW50Ci0gaW5pdGlhbGl6ZV9wbmdfcmVhZGVyKCkKLSB7Ci0gICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QKLSAgICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKLSAgICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7Ci0gICAgaWYgKCFwbmdfcHRyKQotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICAgaWYgKCFpbmZvX3B0cikKLSAgICB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAocG5nX2luZm9wcClOVUxMLAotICAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotCi0gICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgICB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCi0gICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIG9uZSdzIG5ldy4gIFlvdSBjYW4gcHJvdmlkZSBmdW5jdGlvbnMKLSAgICAgICB0byBiZSBjYWxsZWQgd2hlbiB0aGUgaGVhZGVyIGluZm8gaXMgdmFsaWQsCi0gICAgICAgd2hlbiBlYWNoIHJvdyBpcyBjb21wbGV0ZWQsIGFuZCB3aGVuIHRoZSBpbWFnZQotICAgICAgIGlzIGZpbmlzaGVkLiAgSWYgeW91IGFyZW4ndCB1c2luZyBhbGwgZnVuY3Rpb25zLAotICAgICAgIHlvdSBjYW4gc3BlY2lmeSBOVUxMIHBhcmFtZXRlcnMuICBFdmVuIHdoZW4gYWxsCi0gICAgICAgdGhyZWUgZnVuY3Rpb25zIGFyZSBOVUxMLCB5b3UgbmVlZCB0byBjYWxsCi0gICAgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkuICBZb3UgY2FuIHVzZQotICAgICAgIGFueSBzdHJ1Y3QgYXMgdGhlIHVzZXJfcHRyIChjYXN0IHRvIGEgdm9pZCBwb2ludGVyCi0gICAgICAgZm9yIHRoZSBmdW5jdGlvbiBjYWxsKSwgYW5kIHJldHJpZXZlIHRoZSBwb2ludGVyCi0gICAgICAgZnJvbSBpbnNpZGUgdGhlIGNhbGxiYWNrcyB1c2luZyB0aGUgZnVuY3Rpb24KLQotICAgICAgICAgIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19wdHIpOwotCi0gICAgICAgd2hpY2ggd2lsbCByZXR1cm4gYSB2b2lkIHBvaW50ZXIsIHdoaWNoIHlvdSBoYXZlCi0gICAgICAgdG8gY2FzdCBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwbmdfcHRyLCAodm9pZCAqKXVzZXJfcHRyLAotICAgICAgICBpbmZvX2NhbGxiYWNrLCByb3dfY2FsbGJhY2ssIGVuZF9jYWxsYmFjayk7Ci0KLSAgICByZXR1cm4gMDsKLSB9Ci0KLSAvKiBBIGNvZGUgZnJhZ21lbnQgdGhhdCB5b3UgY2FsbCBhcyB5b3UgcmVjZWl2ZSBibG9ja3MKLSAgIG9mIGRhdGEgKi8KLSBpbnQKLSBwcm9jZXNzX2RhdGEocG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotIHsKLSAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQotICAgIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKLSAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7Ci0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotICAgIC8qIFRoaXMgb25lJ3MgbmV3IGFsc28uICBTaW1wbHkgZ2l2ZSBpdCBhIGNodW5rCi0gICAgICAgb2YgZGF0YSBmcm9tIHRoZSBmaWxlIHN0cmVhbSAoaW4gb3JkZXIsIG9mCi0gICAgICAgY291cnNlKS4gIE9uIG1hY2hpbmVzIHdpdGggc2VnbWVudGVkIG1lbW9yeQotICAgICAgIG1vZGVscyBtYWNoaW5lcywgZG9uJ3QgZ2l2ZSBpdCBhbnkgbW9yZSB0aGFuCi0gICAgICAgNjRLLiAgVGhlIGxpYnJhcnkgc2VlbXMgdG8gcnVuIGZpbmUgd2l0aCBzaXplcwotICAgICAgIG9mIDRLLiBBbHRob3VnaCB5b3UgY2FuIGdpdmUgaXQgbXVjaCBsZXNzIGlmCi0gICAgICAgbmVjZXNzYXJ5IChJIGFzc3VtZSB5b3UgY2FuIGdpdmUgaXQgY2h1bmtzIG9mCi0gICAgICAgMSBieXRlLCBJIGhhdmVuJ3QgdHJpZWQgbGVzcyB0aGVuIDI1NiBieXRlcwotICAgICAgIHlldCkuICBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgeW91IG1heQotICAgICAgIHdhbnQgdG8gZGlzcGxheSBhbnkgcm93cyB0aGF0IHdlcmUgZ2VuZXJhdGVkCi0gICAgICAgaW4gdGhlIHJvdyBjYWxsYmFjayBpZiB5b3UgZG9uJ3QgYWxyZWFkeSBkbwotICAgICAgIHNvIHRoZXJlLgotICAgICAqLwotICAgIHBuZ19wcm9jZXNzX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICByZXR1cm4gMDsKLSB9Ci0KLSAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAoYXMgc2V0IGJ5Ci0gICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkgYWJvdmUpIHdoZW4gZW5vdWdoIGRhdGEKLSAgICBoYXMgYmVlbiBzdXBwbGllZCBzbyBhbGwgb2YgdGhlIGhlYWRlciBoYXMgYmVlbgotICAgIHJlYWQuCi0gKi8KLSB2b2lkCi0gaW5mb19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mbykKLSB7Ci0gICAgLyogRG8gYW55IHNldHVwIGhlcmUsIGluY2x1ZGluZyBzZXR0aW5nIGFueSBvZgotICAgICAgIHRoZSB0cmFuc2Zvcm1hdGlvbnMgbWVudGlvbmVkIGluIHRoZSBSZWFkaW5nCi0gICAgICAgUE5HIGZpbGVzIHNlY3Rpb24uICBGb3Igbm93LCB5b3UgX211c3RfIGNhbGwKLSAgICAgICBlaXRoZXIgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKSBvcgotICAgICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgYWZ0ZXIgYWxsIHRoZQotICAgICAgIHRyYW5zZm9ybWF0aW9ucyBhcmUgc2V0IChldmVuIGlmIHlvdSBkb24ndCBzZXQKLSAgICAgICBhbnkpLiAgWW91IG1heSBzdGFydCBnZXR0aW5nIHJvd3MgYmVmb3JlCi0gICAgICAgcG5nX3Byb2Nlc3NfZGF0YSgpIHJldHVybnMsIHNvIHRoaXMgaXMgeW91cgotICAgICAgIGxhc3QgY2hhbmNlIHRvIHByZXBhcmUgZm9yIHRoYXQuCi0gICAgICovCi0gfQotCi0gLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBlYWNoIHJvdyBvZiBpbWFnZQotICAgIGRhdGEgaXMgY29tcGxldGUgKi8KLSB2b2lkCi0gcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LAotICAgIHBuZ191aW50XzMyIHJvd19udW0sIGludCBwYXNzKQotIHsKLSAgICAvKiBJZiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCwgYW5kIHlvdSB0dXJuZWQKLSAgICAgICBvbiB0aGUgaW50ZXJsYWNlIGhhbmRsZXIsIHRoaXMgZnVuY3Rpb24gd2lsbAotICAgICAgIGJlIGNhbGxlZCBmb3IgZXZlcnkgcm93IGluIGV2ZXJ5IHBhc3MuICBTb21lCi0gICAgICAgb2YgdGhlc2Ugcm93cyB3aWxsIG5vdCBiZSBjaGFuZ2VkIGZyb20gdGhlCi0gICAgICAgcHJldmlvdXMgcGFzcy4gIFdoZW4gdGhlIHJvdyBpcyBub3QgY2hhbmdlZCwKLSAgICAgICB0aGUgbmV3X3JvdyB2YXJpYWJsZSB3aWxsIGJlIE5VTEwuICBUaGUgcm93cwotICAgICAgIGFuZCBwYXNzZXMgYXJlIGNhbGxlZCBpbiBvcmRlciwgc28geW91IGRvbid0Ci0gICAgICAgcmVhbGx5IG5lZWQgdGhlIHJvd19udW0gYW5kIHBhc3MsIGJ1dCBJJ20KLSAgICAgICBzdXBwbHlpbmcgdGhlbSBiZWNhdXNlIGl0IG1heSBtYWtlIHlvdXIgbGlmZQotICAgICAgIGVhc2llci4KLQotICAgICAgIEZvciB0aGUgbm9uLU5VTEwgcm93cyBvZiBpbnRlcmxhY2VkIGltYWdlcywKLSAgICAgICB5b3UgbXVzdCBjYWxsIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdygpCi0gICAgICAgcGFzc2luZyBpbiB0aGUgcm93IGFuZCB0aGUgb2xkIHJvdy4gIFlvdSBjYW4KLSAgICAgICBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIE5VTEwgcm93cyAoaXQgd2lsbCBqdXN0Ci0gICAgICAgcmV0dXJuKSBhbmQgZm9yIG5vbi1pbnRlcmxhY2VkIGltYWdlcyAoaXQganVzdAotICAgICAgIGRvZXMgdGhlIG1lbWNweSBmb3IgeW91KSBpZiBpdCB3aWxsIG1ha2UgdGhlCi0gICAgICAgY29kZSBlYXNpZXIuICBUaHVzLCB5b3UgY2FuIGp1c3QgZG8gdGhpcyBmb3IKLSAgICAgICBhbGwgY2FzZXM6Ci0gICAgICovCi0KLSAgICAgICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIG9sZF9yb3csCi0gICAgICAgICAgbmV3X3Jvdyk7Ci0KLSAgICAvKiB3aGVyZSBvbGRfcm93IGlzIHdoYXQgd2FzIGRpc3BsYXllZCBmb3IKLSAgICAgICBwcmV2aW91c2x5IGZvciB0aGUgcm93LiAgTm90ZSB0aGF0IHRoZSBmaXJzdAotICAgICAgIHBhc3MgKHBhc3MgPT0gMCwgcmVhbGx5KSB3aWxsIGNvbXBsZXRlbHkgY292ZXIKLSAgICAgICB0aGUgb2xkIHJvdywgc28gdGhlIHJvd3MgZG8gbm90IGhhdmUgdG8gYmUKLSAgICAgICBpbml0aWFsaXplZC4gIEFmdGVyIHRoZSBmaXJzdCBwYXNzIChhbmQgb25seQotICAgICAgIGZvciBpbnRlcmxhY2VkIGltYWdlcyksIHlvdSB3aWxsIGhhdmUgdG8gcGFzcwotICAgICAgIHRoZSBjdXJyZW50IHJvdywgYW5kIHRoZSBmdW5jdGlvbiB3aWxsIGNvbWJpbmUKLSAgICAgICB0aGUgb2xkIHJvdyBhbmQgdGhlIG5ldyByb3cuCi0gICAgKi8KLSB9Ci0KLSB2b2lkCi0gZW5kX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvKQotIHsKLSAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgd2hvbGUgaW1hZ2UKLSAgICAgICBoYXMgYmVlbiByZWFkLCBpbmNsdWRpbmcgYW55IGNodW5rcyBhZnRlciB0aGUKLSAgICAgICBpbWFnZSAodXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgSUVORCkuICBZb3UKLSAgICAgICB3aWxsIHVzdWFsbHkgaGF2ZSB0aGUgc2FtZSBpbmZvIGNodW5rIGFzIHlvdQotICAgICAgIGhhZCBpbiB0aGUgaGVhZGVyLCBhbHRob3VnaCBzb21lIGRhdGEgbWF5IGhhdmUKLSAgICAgICBiZWVuIGFkZGVkIHRvIHRoZSBjb21tZW50cyBhbmQgdGltZSBmaWVsZHMuCi0KLSAgICAgICBNb3N0IHBlb3BsZSB3b24ndCBkbyBtdWNoIGhlcmUsIHBlcmhhcHMgc2V0dGluZwotICAgICAgIGEgZmxhZyB0aGF0IG1hcmtzIHRoZSBpbWFnZSBhcyBmaW5pc2hlZC4KLSAgICAgKi8KLSB9Ci0KLQotCi1JVi4gV3JpdGluZwotCi1NdWNoIG9mIHRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHJlYWRpbmcuICBIb3dldmVyLCBldmVyeXRoaW5nIG9mCi1pbXBvcnRhbmNlIGlzIHJlcGVhdGVkIGhlcmUsIHNvIHlvdSB3b24ndCBoYXZlIHRvIGNvbnN0YW50bHkgbG9vawotYmFjayB1cCBpbiB0aGUgcmVhZGluZyBzZWN0aW9uIHRvIHVuZGVyc3RhbmQgd3JpdGluZy4KLQotU2V0dXAKLQotWW91IHdpbGwgd2FudCB0byBkbyB0aGUgSS9PIGluaXRpYWxpemF0aW9uIGJlZm9yZSB5b3UgZ2V0IGludG8gbGlicG5nLAotc28gaWYgaXQgZG9lc24ndCB3b3JrLCB5b3UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byB1bmRvLiBJZiB5b3UgYXJlIG5vdAotdXNpbmcgdGhlIHN0YW5kYXJkIEkvTyBmdW5jdGlvbnMsIHlvdSB3aWxsIG5lZWQgdG8gcmVwbGFjZSB0aGVtIHdpdGgKLWN1c3RvbSB3cml0aW5nIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZGlzY3Vzc2lvbiB1bmRlciBDdXN0b21pemluZyBsaWJwbmcuCi0KLSAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgIndiIik7Ci0gICAgaWYgKCFmcCkKLSAgICB7Ci0gICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotCi1OZXh0LCBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuCi1BcyB0aGVzZSBjYW4gYmUgYm90aCByZWxhdGl2ZWx5IGxhcmdlLCB5b3UgbWF5IG5vdCB3YW50IHRvIHN0b3JlIHRoZXNlCi1vbiB0aGUgc3RhY2ssIHVubGVzcyB5b3UgaGF2ZSBzdGFjayBzcGFjZSB0byBzcGFyZS4gIE9mIGNvdXJzZSwgeW91Ci13aWxsIHdhbnQgdG8gY2hlY2sgaWYgdGhleSByZXR1cm4gTlVMTC4gIElmIHlvdSBhcmUgYWxzbyByZWFkaW5nLAoteW91IHdvbid0IHdhbnQgdG8gbmFtZSB5b3VyIHJlYWQgc3RydWN0dXJlIGFuZCB5b3VyIHdyaXRlIHN0cnVjdHVyZQotYm90aCAicG5nX3B0ciI7IHlvdSBjYW4gY2FsbCB0aGVtIGFueXRoaW5nIHlvdSBsaWtlLCBzdWNoIGFzCi0icmVhZF9wdHIiIGFuZCAid3JpdGVfcHRyIi4gIExvb2sgYXQgcG5ndGVzdC5jLCBmb3IgZXhhbXBsZS4KLQotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdAotICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7Ci0gICAgaWYgKCFwbmdfcHRyKQotICAgICAgIHJldHVybiAoRVJST1IpOwotCi0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgICBpZiAoIWluZm9fcHRyKQotICAgIHsKLSAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsCi0gICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLUlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywKLWRlZmluZSBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEIGFuZCB1c2UKLXBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSBpbnN0ZWFkIG9mIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCk6Ci0KLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMgotICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbiwgKHBuZ192b2lkcCkKLSAgICAgICAgdXNlcl9tZW1fcHRyLCB1c2VyX21hbGxvY19mbiwgdXNlcl9mcmVlX2ZuKTsKLQotQWZ0ZXIgeW91IGhhdmUgdGhlc2Ugc3RydWN0dXJlcywgeW91IHdpbGwgbmVlZCB0byBzZXQgdXAgdGhlCi1lcnJvciBoYW5kbGluZy4gIFdoZW4gbGlicG5nIGVuY291bnRlcnMgYW4gZXJyb3IsIGl0IGV4cGVjdHMgdG8KLWxvbmdqbXAoKSBiYWNrIHRvIHlvdXIgcm91dGluZS4gIFRoZXJlZm9yZSwgeW91IHdpbGwgbmVlZCB0byBjYWxsCi1zZXRqbXAoKSBhbmQgcGFzcyB0aGUgcG5nX2ptcGJ1ZihwbmdfcHRyKS4gIElmIHlvdQotd3JpdGUgdGhlIGZpbGUgZnJvbSBkaWZmZXJlbnQgcm91dGluZXMsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlCi10aGUgcG5nX2ptcGJ1ZihwbmdfcHRyKSBldmVyeSB0aW1lIHlvdSBlbnRlciBhIG5ldyByb3V0aW5lIHRoYXQgd2lsbAotY2FsbCBhIHBuZ18qKCkgZnVuY3Rpb24uICBTZWUgeW91ciBkb2N1bWVudGF0aW9uIG9mIHNldGptcC9sb25nam1wCi1mb3IgeW91ciBjb21waWxlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzZXRqbXAvbG9uZ2ptcC4gIFNlZQotdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIGVycm9yIGhhbmRsaW5nIGluIHRoZSBDdXN0b21pemluZyBMaWJwbmcKLXNlY3Rpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGxpYnBuZyBlcnJvciBoYW5kbGluZy4KLQotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICAgewotICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLSAgICAgICBmY2xvc2UoZnApOwotICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLSAgICAuLi4KLSAgICByZXR1cm47Ci0KLUlmIHlvdSB3b3VsZCByYXRoZXIgYXZvaWQgdGhlIGNvbXBsZXhpdHkgb2Ygc2V0am1wL2xvbmdqbXAgaXNzdWVzLAoteW91IGNhbiBjb21waWxlIGxpYnBuZyB3aXRoIFBOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCwgaW4gd2hpY2ggY2FzZQotZXJyb3JzIHdpbGwgcmVzdWx0IGluIGEgY2FsbCB0byBQTkdfQUJPUlQoKSB3aGljaCBkZWZhdWx0cyB0byBhYm9ydCgpLgotCi1Ob3cgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBvdXRwdXQgY29kZS4gIFRoZSBkZWZhdWx0IGZvciBsaWJwbmcgaXMgdG8KLXVzZSB0aGUgQyBmdW5jdGlvbiBmd3JpdGUoKS4gIElmIHlvdSB1c2UgdGhpcywgeW91IHdpbGwgbmVlZCB0byBwYXNzIGEKLXZhbGlkIEZJTEUgKiBpbiB0aGUgZnVuY3Rpb24gcG5nX2luaXRfaW8oKS4gIEJlIHN1cmUgdGhhdCB0aGUgZmlsZSBpcwotb3BlbmVkIGluIGJpbmFyeSBtb2RlLiAgQWdhaW4sIGlmIHlvdSB3aXNoIHRvIGhhbmRsZSB3cml0aW5nIGRhdGEgaW4KLWFub3RoZXIgd2F5LCBzZWUgdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIEkvTyBoYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcKLUxpYnBuZyBzZWN0aW9uIGJlbG93LgotCi0gICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOwotCi1JZiB5b3UgYXJlIGVtYmVkZGluZyB5b3VyIFBORyBpbnRvIGEgZGF0YXN0cmVhbSBzdWNoIGFzIE1ORywgYW5kIGRvbid0Ci13YW50IGxpYnBuZyB0byB3cml0ZSB0aGUgOC1ieXRlIHNpZ25hdHVyZSwgb3IgaWYgeW91IGhhdmUgYWxyZWFkeQotd3JpdHRlbiB0aGUgc2lnbmF0dXJlIGluIHlvdXIgYXBwbGljYXRpb24sIHVzZQotCi0gICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgOCk7Ci0KLXRvIGluZm9ybSBsaWJwbmcgdGhhdCBpdCBzaG91bGQgbm90IHdyaXRlIGEgc2lnbmF0dXJlLgotCi1Xcml0ZSBjYWxsYmFja3MKLQotQXQgdGhpcyBwb2ludCwgeW91IGNhbiBzZXQgdXAgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUKLWNhbGxlZCBhZnRlciBlYWNoIHJvdyBoYXMgYmVlbiB3cml0dGVuLCB3aGljaCB5b3UgY2FuIHVzZSB0byBjb250cm9sCi1hIHByb2dyZXNzIG1ldGVyIG9yIHRoZSBsaWtlLiAgSXQncyBkZW1vbnN0cmF0ZWQgaW4gcG5ndGVzdC5jLgotWW91IG11c3Qgc3VwcGx5IGEgZnVuY3Rpb24KLQotICAgIHZvaWQgd3JpdGVfcm93X2NhbGxiYWNrKHBuZ19wdHIsIHBuZ191aW50XzMyIHJvdywKLSAgICAgICBpbnQgcGFzcyk7Ci0gICAgewotICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlICovCi0gICAgfQotCi0oWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSB0aGF0IHlvdSBsaWtlIGluc3RlYWQgb2YgIndyaXRlX3Jvd19jYWxsYmFjayIpCi0KLVRvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCi0KLSAgICBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbihwbmdfcHRyLCB3cml0ZV9yb3dfY2FsbGJhY2spOwotCi1Zb3Ugbm93IGhhdmUgdGhlIG9wdGlvbiBvZiBtb2RpZnlpbmcgaG93IHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwKLXJ1bi4gIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCBtYXkgYmUgdXNlZnVsCi1pbiBzb21lIGNhc2VzLCBsaWtlIGlmIHlvdSBuZWVkIHRvIHdyaXRlIFBORyBmaWxlcyBleHRyZW1lbHkgZmFzdCBhbmQKLWFyZSB3aWxsaW5nIHRvIGdpdmUgdXAgc29tZSBjb21wcmVzc2lvbiwgb3IgaWYgeW91IHdhbnQgdG8gZ2V0IHRoZQotbWF4aW11bSBwb3NzaWJsZSBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBzbG93ZXIgd3JpdGluZy4gIElmIHlvdQotaGF2ZSBubyBzcGVjaWFsIG5lZWRzIGluIHRoaXMgYXJlYSwgbGV0IHRoZSBsaWJyYXJ5IGRvIHdoYXQgaXQgd2FudHMgYnkKLW5vdCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYXQgYWxsLCBhcyBpdCBoYXMgYmVlbiB0dW5lZCB0byBkZWxpdmVyIGEgZ29vZAotc3BlZWQvY29tcHJlc3Npb24gcmF0aW8uIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHBuZ19zZXRfZmlsdGVyKCkgaXMKLXRoZSBmaWx0ZXIgbWV0aG9kLCBmb3Igd2hpY2ggdGhlIG9ubHkgdmFsaWQgdmFsdWVzIGFyZSAwIChhcyBvZiB0aGUKLUp1bHkgMTk5OSBQTkcgc3BlY2lmaWNhdGlvbiwgdmVyc2lvbiAxLjIpIG9yIDY0IChpZiB5b3UgYXJlIHdyaXRpbmcKLWEgUE5HIGRhdGFzdHJlYW0gdGhhdCBpcyB0byBiZSBlbWJlZGRlZCBpbiBhIE1ORyBkYXRhc3RyZWFtKS4gIFRoZSB0aGlyZAotcGFyYW1ldGVyIGlzIGEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGljaCBmaWx0ZXIgdHlwZShzKSBhcmUgdG8gYmUgdGVzdGVkCi1mb3IgZWFjaCBzY2FubGluZS4gIFNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIHNwZWNpZmljIGZpbHRlcgotdHlwZXMuCi0KLQotICAgIC8qIHR1cm4gb24gb3Igb2ZmIGZpbHRlcmluZywgYW5kL29yIGNob29zZQotICAgICAgIHNwZWNpZmljIGZpbHRlcnMuICBZb3UgY2FuIHVzZSBlaXRoZXIgYSBzaW5nbGUKLSAgICAgICBQTkdfRklMVEVSX1ZBTFVFX05BTUUgb3IgdGhlIGJpdHdpc2UgT1Igb2Ygb25lCi0gICAgICAgb3IgbW9yZSBQTkdfRklMVEVSX05BTUUgbWFza3MuICovCi0gICAgcG5nX3NldF9maWx0ZXIocG5nX3B0ciwgMCwKLSAgICAgICBQTkdfRklMVEVSX05PTkUgIHwgUE5HX0ZJTFRFUl9WQUxVRV9OT05FIHwKLSAgICAgICBQTkdfRklMVEVSX1NVQiAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9TVUIgIHwKLSAgICAgICBQTkdfRklMVEVSX1VQICAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9VUCAgIHwKLSAgICAgICBQTkdfRklMVEVSX0FWRyAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9BVkcgIHwKLSAgICAgICBQTkdfRklMVEVSX1BBRVRIIHwgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSHwKLSAgICAgICBQTkdfQUxMX0ZJTFRFUlMpOwotCi1JZiBhbiBhcHBsaWNhdGlvbgotd2FudHMgdG8gc3RhcnQgYW5kIHN0b3AgdXNpbmcgcGFydGljdWxhciBmaWx0ZXJzIGR1cmluZyBjb21wcmVzc2lvbiwKLWl0IHNob3VsZCBzdGFydCBvdXQgd2l0aCBhbGwgb2YgdGhlIGZpbHRlcnMgKHRvIGVuc3VyZSB0aGF0IHRoZSBwcmV2aW91cwotcm93IG9mIHBpeGVscyB3aWxsIGJlIHN0b3JlZCBpbiBjYXNlIGl0J3MgbmVlZGVkIGxhdGVyKSwgYW5kIHRoZW4gYWRkCi1hbmQgcmVtb3ZlIHRoZW0gYWZ0ZXIgdGhlIHN0YXJ0IG9mIGNvbXByZXNzaW9uLgotCi1JZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgZGF0YXN0cmVhbSB0aGF0IGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgTU5HCi1kYXRhc3RyZWFtLCB0aGUgc2Vjb25kIHBhcmFtZXRlciBjYW4gYmUgZWl0aGVyIDAgb3IgNjQuCi0KLVRoZSBwbmdfc2V0X2NvbXByZXNzaW9uXyooKSBmdW5jdGlvbnMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGNvbXByZXNzaW9uCi1saWJyYXJ5LCBhbmQgc2hvdWxkIG1vc3RseSBiZSBpZ25vcmVkIHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgYXJlCi1kb2luZy4gIFRoZSBvbmx5IGdlbmVyYWxseSB1c2VmdWwgY2FsbCBpcyBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKCkKLXdoaWNoIGNoYW5nZXMgaG93IG11Y2ggdGltZSB6bGliIHNwZW5kcyBvbiB0cnlpbmcgdG8gY29tcHJlc3MgdGhlIGltYWdlCi1kYXRhLiAgU2VlIHRoZSBDb21wcmVzc2lvbiBMaWJyYXJ5ICh6bGliLmggYW5kIGFsZ29yaXRobS50eHQsIGRpc3RyaWJ1dGVkCi13aXRoIHpsaWIpIGZvciBkZXRhaWxzIG9uIHRoZSBjb21wcmVzc2lvbiBsZXZlbHMuCi0KLSAgICAvKiBzZXQgdGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwgKi8KLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsCi0gICAgICAgIFpfQkVTVF9DT01QUkVTU0lPTik7Ci0KLSAgICAvKiBzZXQgb3RoZXIgemxpYiBwYXJhbWV0ZXJzICovCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgOCk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLAotICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1kpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwgMTUpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIDgpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgODE5MikKLQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3pidWZfc2l6ZSkKLQotU2V0dGluZyB0aGUgY29udGVudHMgb2YgaW5mbyBmb3Igb3V0cHV0Ci0KLVlvdSBub3cgbmVlZCB0byBmaWxsIGluIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgd2l0aCBhbGwgdGhlIGRhdGEgeW91Ci13aXNoIHRvIHdyaXRlIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlLiAgTm90ZSB0aGF0IHRoZSBvbmx5IHRoaW5nIHlvdQotYXJlIGFsbG93ZWQgdG8gd3JpdGUgYWZ0ZXIgdGhlIGltYWdlIGlzIHRoZSB0ZXh0IGNodW5rcyBhbmQgdGhlIHRpbWUKLWNodW5rIChhcyBvZiBQTkcgU3BlY2lmaWNhdGlvbiAxLjIsIGFueXdheSkuICBTZWUgcG5nX3dyaXRlX2VuZCgpIGFuZAotdGhlIGxhdGVzdCBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGF0LiAgSWYgeW91Ci13aXNoIHRvIHdyaXRlIHRoZW0gYmVmb3JlIHRoZSBpbWFnZSwgZmlsbCB0aGVtIGluIG5vdywgYW5kIGZsYWcgdGhhdAotZGF0YSBhcyBiZWluZyB2YWxpZC4gIElmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRhdGEsIGRvbid0Ci1maWxsIHRoZW0gdW50aWwgcG5nX3dyaXRlX2VuZCgpLiAgRm9yIGFsbCB0aGUgZmllbGRzIGluIHBuZ19pbmZvIGFuZAotdGhlaXIgZGF0YSB0eXBlcywgc2VlIHBuZy5oLiAgRm9yIGV4cGxhbmF0aW9ucyBvZiB3aGF0IHRoZSBmaWVsZHMKLWNvbnRhaW4sIHNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24uCi0KLVNvbWUgb2YgdGhlIG1vcmUgaW1wb3J0YW50IHBhcnRzIG9mIHRoZSBwbmdfaW5mbyBhcmU6Ci0KLSAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwKLSAgICAgICBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfbWV0aG9kKQotICAgIHdpZHRoICAgICAgICAgIC0gaG9sZHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KLSAgICBoZWlnaHQgICAgICAgICAtIGhvbGRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCi0gICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgotICAgIGJpdF9kZXB0aCAgICAgIC0gaG9sZHMgdGhlIGJpdCBkZXB0aCBvZiBvbmUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICBpbWFnZSBjaGFubmVscy4KLSAgICAgICAgICAgICAgICAgICAgICh2YWxpZCB2YWx1ZXMgYXJlIDEsIDIsIDQsIDgsIDE2Ci0gICAgICAgICAgICAgICAgICAgICBhbmQgZGVwZW5kIGFsc28gb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICBjb2xvcl90eXBlLiAgU2VlIGFsc28gc2lnbmlmaWNhbnQKLSAgICAgICAgICAgICAgICAgICAgIGJpdHMgKHNCSVQpIGJlbG93KS4KLSAgICBjb2xvcl90eXBlICAgICAtIGRlc2NyaWJlcyB3aGljaCBjb2xvci9hbHBoYQotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCkKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQgotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQotCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUgotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQUxQSEEKLQotICAgIGludGVybGFjZV90eXBlIC0gUE5HX0lOVEVSTEFDRV9OT05FIG9yCi0gICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03Ci0gICAgY29tcHJlc3Npb25fdHlwZSAtIChtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxUKQotICAgIGZpbHRlcl9tZXRob2QgIC0gKG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQKLSAgICAgICAgICAgICAgICAgICAgIG9yLCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgdG8KLSAgICAgICAgICAgICAgICAgICAgIGJlIGVtYmVkZGVkIGluIGEgTU5HIGRhdGFzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBiZQotICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKQotCi1JZiB5b3UgY2FsbCBwbmdfc2V0X0lIRFIoKSwgdGhlIGNhbGwgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBvZiB0aGUKLW90aGVyIHBuZ19zZXRfKigpIGZ1bmN0aW9ucywgd2hpY2ggbWlnaHQgcmVxdWlyZSBhY2Nlc3MgdG8gc29tZSBvZgotdGhlIElIRFIgc2V0dGluZ3MuICBUaGUgcmVtYWluaW5nIHBuZ19zZXRfKigpIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkCi1pbiBhbnkgb3JkZXIuCi0KLSAgICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsCi0gICAgICAgbnVtX3BhbGV0dGUpOwotICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQotICAgIG51bV9wYWxldHRlICAgIC0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBhbGV0dGUKLQotICAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgZ2FtbWEpOwotICAgIGdhbW1hICAgICAgICAgIC0gdGhlIGdhbW1hIHRoZSBpbWFnZSB3YXMgY3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAgYXQgKFBOR19JTkZPX2dBTUEpCi0KLSAgICBwbmdfc2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIHNyZ2JfaW50ZW50KTsKLSAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc1JHQikgVGhlIHByZXNlbmNlIG9mCi0gICAgICAgICAgICAgICAgICAgICB0aGUgc1JHQiBjaHVuayBtZWFucyB0aGF0IHRoZSBwaXhlbAotICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBpbiB0aGUgc1JHQiBjb2xvciBzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2h1bmsgYWxzbyBpbXBsaWVzIHNwZWNpZmljCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb2YgZ0FNQSBhbmQgY0hSTS4gIFJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICAgaW50ZW50IGlzIHRoZSBDU1MtMSBwcm9wZXJ0eSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICBDb2xvciBDb25zb3J0aXVtCi0gICAgICAgICAgICAgICAgICAgICAoaHR0cDovL3d3dy5jb2xvci5vcmcpLgotICAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlIG9uZSBvZgotICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfSU5URU5UX1NBVFVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfUEVSQ0VQVFVBTCwKLSAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9BQlNPTFVURSwgb3IKLSAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9SRUxBVElWRS4KLQotCi0gICAgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgc3JnYl9pbnRlbnQpOwotICAgIHNyZ2JfaW50ZW50ICAgIC0gdGhlIHJlbmRlcmluZyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zUkdCKSBUaGUgcHJlc2VuY2Ugb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICBzUkdCIGNodW5rIG1lYW5zIHRoYXQgdGhlIHBpeGVsCi0gICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGluIHRoZSBzUkdCIGNvbG9yIHNwYWNlLgotICAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIGNhdXNlcyBnQU1BIGFuZAotICAgICAgICAgICAgICAgICAgICAgY0hSTSBjaHVua3Mgd2l0aCB0aGUgc3BlY2lmaWMgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICB0aGF0IGFyZSBjb25zaXN0ZW50IHdpdGggc1JHQiB0byBiZQotICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbi4KLQotICAgIHBuZ19zZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgbmFtZSwgY29tcHJlc3Npb25fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBwcm9mbGVuKTsKLSAgICBuYW1lICAgICAgICAgICAgLSBUaGUgcHJvZmlsZSBuYW1lLgotICAgIGNvbXByZXNzaW9uICAgICAtIFRoZSBjb21wcmVzc2lvbiB0eXBlOyBhbHdheXMKLSAgICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIGZvciBQTkcgMS4wLgotICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgZ2l2ZSBOVUxMIHRvIHRoaXMgYXJndW1lbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgaXQuCi0gICAgcHJvZmlsZSAgICAgICAgIC0gSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtIGNvbG9yCi0gICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSBkYXRhLiBNYXkgY29udGFpbiBOVUxzLgotICAgIHByb2ZsZW4gICAgICAgICAtIGxlbmd0aCBvZiBwcm9maWxlIGRhdGEgaW4gYnl0ZXMuCi0KLSAgICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsIHNpZ19iaXQpOwotICAgIHNpZ19iaXQgICAgICAgIC0gdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGZvcgotICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3NCSVQpIGVhY2ggb2YgdGhlIGdyYXksIHJlZCwKLSAgICAgICAgICAgICAgICAgICAgIGdyZWVuLCBhbmQgYmx1ZSBjaGFubmVscywgd2hpY2hldmVyIGFyZQotICAgICAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBjb2xvciB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAocG5nX2NvbG9yXzE2KQotCi0gICAgcG5nX3NldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCB0cmFucywgbnVtX3RyYW5zLAotICAgICAgIHRyYW5zX3ZhbHVlcyk7Ci0gICAgdHJhbnMgICAgICAgICAgLSBhcnJheSBvZiB0cmFuc3BhcmVudCBlbnRyaWVzIGZvcgotICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSAoUE5HX0lORk9fdFJOUykKLSAgICB0cmFuc192YWx1ZXMgICAtIGdyYXlsZXZlbCBvciBjb2xvciBzYW1wbGUgdmFsdWVzIG9mCi0gICAgICAgICAgICAgICAgICAgICB0aGUgc2luZ2xlIHRyYW5zcGFyZW50IGNvbG9yIGZvcgotICAgICAgICAgICAgICAgICAgICAgbm9uLXBhbGV0dGVkIGltYWdlcyAoUE5HX0lORk9fdFJOUykKLSAgICBudW1fdHJhbnMgICAgICAtIG51bWJlciBvZiB0cmFuc3BhcmVudCBlbnRyaWVzCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fdFJOUykKLQotICAgIHBuZ19zZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgaGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19oSVNUKQotICAgIGhpc3QgICAgICAgICAgIC0gaGlzdG9ncmFtIG9mIHBhbGV0dGUgKGFycmF5IG9mCi0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNikKLQotICAgIHBuZ19zZXRfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgbW9kX3RpbWUpOwotICAgIG1vZF90aW1lICAgICAgIC0gdGltZSBpbWFnZSB3YXMgbGFzdCBtb2RpZmllZAotICAgICAgICAgICAgICAgICAgICAgKFBOR19WQUxJRF90SU1FKQotCi0gICAgcG5nX3NldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCBiYWNrZ3JvdW5kKTsKLSAgICBiYWNrZ3JvdW5kICAgICAtIGJhY2tncm91bmQgY29sb3IgKFBOR19WQUxJRF9iS0dEKQotCi0gICAgcG5nX3NldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgbnVtX3RleHQpOwotICAgIHRleHRfcHRyICAgICAgIC0gYXJyYXkgb2YgcG5nX3RleHQgaG9sZGluZyBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMKLSAgICB0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiAtIHR5cGUgb2YgY29tcHJlc3Npb24gdXNlZAotICAgICAgICAgICAgICAgICBvbiAidGV4dCIgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05felRYdAotICAgIHRleHRfcHRyW2ldLmtleSAgIC0ga2V5d29yZCBmb3IgY29tbWVudC4gIE11c3QgY29udGFpbgotICAgICAgICAgICAgICAgICAxLTc5IGNoYXJhY3RlcnMuCi0gICAgdGV4dF9wdHJbaV0udGV4dCAgLSB0ZXh0IGNvbW1lbnRzIGZvciBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZC4gIENhbiBiZSBOVUxMIG9yIGVtcHR5LgotICAgIHRleHRfcHRyW2ldLnRleHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIHRleHQgc3RyaW5nLAotICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciBpVFh0Ci0gICAgdGV4dF9wdHJbaV0uaXR4dF9sZW5ndGggLSBsZW5ndGggb2YgaXR4dCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgIGFmdGVyIGRlY29tcHJlc3Npb24sIDAgZm9yIHRFWHQvelRYdAotICAgIHRleHRfcHRyW2ldLmxhbmcgIC0gbGFuZ3VhZ2Ugb2YgY29tbWVudCAoTlVMTCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5IGZvciB1bmtub3duKS4KLSAgICB0ZXh0X3B0cltpXS50cmFuc2xhdGVkX2tleXdvcmQgIC0ga2V5d29yZCBpbiBVVEYtOCAoTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGVtcHR5IGZvciB1bmtub3duKS4KLSAgICBudW1fdGV4dCAgICAgICAtIG51bWJlciBvZiBjb21tZW50cwotCi0gICAgcG5nX3NldF9zUExUKHBuZ19wdHIsIGluZm9fcHRyLCAmcGFsZXR0ZV9wdHIsCi0gICAgICAgbnVtX3NwYWxldHRlcyk7Ci0gICAgcGFsZXR0ZV9wdHIgICAgLSBhcnJheSBvZiBwbmdfc1BMVF9zdHJ1Y3Qgc3RydWN0dXJlcwotICAgICAgICAgICAgICAgICAgICAgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcGFsZXR0ZXMKLSAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBpbmZvIHN0cnVjdHVyZS4KLSAgICBudW1fc3BhbGV0dGVzICAtIG51bWJlciBvZiBwYWxldHRlIHN0cnVjdHVyZXMgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgIGFkZGVkLgotCi0gICAgcG5nX3NldF9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLCBvZmZzZXRfeCwgb2Zmc2V0X3ksCi0gICAgICAgIHVuaXRfdHlwZSk7Ci0gICAgb2Zmc2V0X3ggIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIGxlZnQKLSAgICAgICAgICAgICAgICAgICAgIGVkZ2Ugb2YgdGhlIHNjcmVlbgotICAgIG9mZnNldF95ICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSB0b3AKLSAgICAgICAgICAgICAgICAgICAgIGVkZ2Ugb2YgdGhlIHNjcmVlbgotICAgIHVuaXRfdHlwZSAtIFBOR19PRkZTRVRfUElYRUwsIFBOR19PRkZTRVRfTUlDUk9NRVRFUgotCi0gICAgcG5nX3NldF9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCByZXNfeCwgcmVzX3ksCi0gICAgICAgIHVuaXRfdHlwZSk7Ci0gICAgcmVzX3ggICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uCi0gICAgICAgICAgICAgICAgICBpbiB4IGRpcmVjdGlvbgotICAgIHJlc195ICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgaW4geSBkaXJlY3Rpb24KLSAgICB1bml0X3R5cGUgICAtIFBOR19SRVNPTFVUSU9OX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICBQTkdfUkVTT0xVVElPTl9NRVRFUgotCi0gICAgcG5nX3NldF9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCB1bml0LCB3aWR0aCwgaGVpZ2h0KQotICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCi0gICAgd2lkdGggICAgICAgLSB3aWR0aCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgaGVpZ2h0ICAgICAgLSBoZWlnaHQgb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIGRvdWJsZXMpCi0KLSAgICBwbmdfc2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgdW5pdCwgd2lkdGgsIGhlaWdodCkKLSAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQotICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIHN0cmluZ3MgbGlrZSAiMi41NCIpCi0KLSAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCAmdW5rbm93bnMsCi0gICAgICAgbnVtX3Vua25vd25zKQotICAgIHVua25vd25zICAgICAgICAgIC0gYXJyYXkgb2YgcG5nX3Vua25vd25fY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgaG9sZGluZyB1bmtub3duIGNodW5rcwotICAgIHVua25vd25zW2ldLm5hbWUgIC0gbmFtZSBvZiB1bmtub3duIGNodW5rCi0gICAgdW5rbm93bnNbaV0uZGF0YSAgLSBkYXRhIG9mIHVua25vd24gY2h1bmsKLSAgICB1bmtub3duc1tpXS5zaXplICAtIHNpemUgb2YgdW5rbm93biBjaHVuaydzIGRhdGEKLSAgICB1bmtub3duc1tpXS5sb2NhdGlvbiAtIHBvc2l0aW9uIHRvIHdyaXRlIGNodW5rIGluIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IGRvIG5vdCB3cml0ZSBjaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0hBVkVfSUhEUjogYmVmb3JlIFBMVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19IQVZFX1BMVEU6IGJlZm9yZSBJREFUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfQUZURVJfSURBVDogYWZ0ZXIgSURBVAotCi1UaGUgImxvY2F0aW9uIiBtZW1iZXIgaXMgc2V0IGF1dG9tYXRpY2FsbHkgYWNjb3JkaW5nIHRvCi13aGF0IHBhcnQgb2YgdGhlIG91dHB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbi4KLVlvdSBjYW4gY2hhbmdlIGl0cyB2YWx1ZSBhZnRlciBjYWxsaW5nIHBuZ19zZXRfdW5rbm93bl9jaHVua3MoKQotYXMgZGVtb25zdHJhdGVkIGluIHBuZ3Rlc3QuYy4gIFdpdGhpbiBlYWNoIG9mIHRoZSAibG9jYXRpb25zIiwKLXRoZSBjaHVua3MgYXJlIHNlcXVlbmNlZCBhY2NvcmRpbmcgdG8gdGhlaXIgcG9zaXRpb24gaW4gdGhlCi1zdHJ1Y3R1cmUgKHRoYXQgaXMsIHRoZSB2YWx1ZSBvZiAiaSIsIHdoaWNoIGlzIHRoZSBvcmRlciBpbiB3aGljaAotdGhlIGNodW5rIHdhcyBlaXRoZXIgcmVhZCBmcm9tIHRoZSBpbnB1dCBmaWxlIG9yIGRlZmluZWQgd2l0aAotcG5nX3NldF91bmtub3duX2NodW5rcykuCi0KLUEgcXVpY2sgd29yZCBhYm91dCB0ZXh0IGFuZCBudW1fdGV4dC4gIHRleHQgaXMgYW4gYXJyYXkgb2YgcG5nX3RleHQKLXN0cnVjdHVyZXMuICBudW1fdGV4dCBpcyB0aGUgbnVtYmVyIG9mIHZhbGlkIHN0cnVjdHVyZXMgaW4gdGhlIGFycmF5LgotRWFjaCBwbmdfdGV4dCBzdHJ1Y3R1cmUgaG9sZHMgYSBsYW5ndWFnZSBjb2RlLCBhIGtleXdvcmQsIGEgdGV4dCB2YWx1ZSwKLWFuZCBhIGNvbXByZXNzaW9uIHR5cGUuCi0KLVRoZSBjb21wcmVzc2lvbiB0eXBlcyBoYXZlIHRoZSBzYW1lIHZhbGlkIG51bWJlcnMgYXMgdGhlIGNvbXByZXNzaW9uCi10eXBlcyBvZiB0aGUgaW1hZ2UgZGF0YS4gIEN1cnJlbnRseSwgdGhlIG9ubHkgdmFsaWQgbnVtYmVyIGlzIHplcm8uCi1Ib3dldmVyLCB5b3UgY2FuIHN0b3JlIHRleHQgZWl0aGVyIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkLCB1bmxpa2UKLWltYWdlcywgd2hpY2ggYWx3YXlzIGhhdmUgdG8gYmUgY29tcHJlc3NlZC4gIFNvIGlmIHlvdSBkb24ndCB3YW50IHRoZQotdGV4dCBjb21wcmVzc2VkLCBzZXQgdGhlIGNvbXByZXNzaW9uIHR5cGUgdG8gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORS4KLUJlY2F1c2UgdEVYdCBhbmQgelRYdCBjaHVua3MgZG9uJ3QgaGF2ZSBhIGxhbmd1YWdlIGZpZWxkLCBpZiB5b3UKLXNwZWNpZnkgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSBvciBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0Ci1hbnkgbGFuZ3VhZ2UgY29kZSBvciB0cmFuc2xhdGVkIGtleXdvcmQgd2lsbCBub3QgYmUgd3JpdHRlbiBvdXQuCi0KLVVudGlsIHRleHQgZ2V0cyBhcm91bmQgMTAwMCBieXRlcywgaXQgaXMgbm90IHdvcnRoIGNvbXByZXNzaW5nIGl0LgotQWZ0ZXIgdGhlIHRleHQgaGFzIGJlZW4gd3JpdHRlbiBvdXQgdG8gdGhlIGZpbGUsIHRoZSBjb21wcmVzc2lvbiB0eXBlCi1pcyBzZXQgdG8gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORV9XUiBvciBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0X1dSLAotc28gdGhhdCBpdCBpc24ndCB3cml0dGVuIG91dCBhZ2FpbiBhdCB0aGUgZW5kIChpbiBjYXNlIHlvdSBhcmUgY2FsbGluZwotcG5nX3dyaXRlX2VuZCgpIHdpdGggdGhlIHNhbWUgc3RydWN0LgotCi1UaGUga2V5d29yZHMgdGhhdCBhcmUgZ2l2ZW4gaW4gdGhlIFBORyBTcGVjaWZpY2F0aW9uIGFyZToKLQotICAgIFRpdGxlICAgICAgICAgICAgU2hvcnQgKG9uZSBsaW5lKSB0aXRsZSBvcgotICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiBmb3IgaW1hZ2UKLSAgICBBdXRob3IgICAgICAgICAgIE5hbWUgb2YgaW1hZ2UncyBjcmVhdG9yCi0gICAgRGVzY3JpcHRpb24gICAgICBEZXNjcmlwdGlvbiBvZiBpbWFnZSAocG9zc2libHkgbG9uZykKLSAgICBDb3B5cmlnaHQgICAgICAgIENvcHlyaWdodCBub3RpY2UKLSAgICBDcmVhdGlvbiBUaW1lICAgIFRpbWUgb2Ygb3JpZ2luYWwgaW1hZ2UgY3JlYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICh1c3VhbGx5IFJGQyAxMTIzIGZvcm1hdCwgc2VlIGJlbG93KQotICAgIFNvZnR3YXJlICAgICAgICAgU29mdHdhcmUgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlCi0gICAgRGlzY2xhaW1lciAgICAgICBMZWdhbCBkaXNjbGFpbWVyCi0gICAgV2FybmluZyAgICAgICAgICBXYXJuaW5nIG9mIG5hdHVyZSBvZiBjb250ZW50Ci0gICAgU291cmNlICAgICAgICAgICBEZXZpY2UgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlCi0gICAgQ29tbWVudCAgICAgICAgICBNaXNjZWxsYW5lb3VzIGNvbW1lbnQ7IGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgIGZyb20gb3RoZXIgaW1hZ2UgZm9ybWF0Ci0KLVRoZSBrZXl3b3JkLXRleHQgcGFpcnMgd29yayBsaWtlIHRoaXMuICBLZXl3b3JkcyBzaG91bGQgYmUgc2hvcnQKLXNpbXBsZSBkZXNjcmlwdGlvbnMgb2Ygd2hhdCB0aGUgY29tbWVudCBpcyBhYm91dC4gIFNvbWUgdHlwaWNhbAota2V5d29yZHMgYXJlIGZvdW5kIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgYXMgaXMgc29tZSByZWNvbW1lbmRhdGlvbnMKLW9uIGtleXdvcmRzLiAgWW91IGNhbiByZXBlYXQga2V5d29yZHMgaW4gYSBmaWxlLiAgWW91IGNhbiBldmVuIHdyaXRlCi1zb21lIHRleHQgYmVmb3JlIHRoZSBpbWFnZSBhbmQgc29tZSBhZnRlci4gIEZvciBleGFtcGxlLCB5b3UgbWF5IHdhbnQKLXRvIHB1dCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpbWFnZSBiZWZvcmUgdGhlIGltYWdlLCBidXQgbGVhdmUgdGhlCi1kaXNjbGFpbWVyIHVudGlsIGFmdGVyLCBzbyB2aWV3ZXJzIHdvcmtpbmcgb3ZlciBtb2RlbSBjb25uZWN0aW9ucwotZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciB0aGUgZGlzY2xhaW1lciB0byBnbyBvdmVyIHRoZSBtb2RlbSBiZWZvcmUKLXRoZXkgc3RhcnQgc2VlaW5nIHRoZSBpbWFnZS4gIEZpbmFsbHksIGtleXdvcmRzIHNob3VsZCBiZSBmdWxsCi13b3Jkcywgbm90IGFiYnJldmlhdGlvbnMuICBLZXl3b3JkcyBhbmQgdGV4dCBhcmUgaW4gdGhlIElTTyA4ODU5LTEKLShMYXRpbi0xKSBjaGFyYWN0ZXIgc2V0IChhIHN1cGVyc2V0IG9mIHJlZ3VsYXIgQVNDSUkpIGFuZCBjYW4gbm90Ci1jb250YWluIE5VTCBjaGFyYWN0ZXJzLCBhbmQgc2hvdWxkIG5vdCBjb250YWluIGNvbnRyb2wgb3Igb3RoZXIKLXVucHJpbnRhYmxlIGNoYXJhY3RlcnMuICBUbyBtYWtlIHRoZSBjb21tZW50cyB3aWRlbHkgcmVhZGFibGUsIHN0aWNrCi13aXRoIGJhc2ljIEFTQ0lJLCBhbmQgYXZvaWQgbWFjaGluZSBzcGVjaWZpYyBjaGFyYWN0ZXIgc2V0IGV4dGVuc2lvbnMKLWxpa2UgdGhlIElCTS1QQyBjaGFyYWN0ZXIgc2V0LiAgVGhlIGtleXdvcmQgbXVzdCBiZSBwcmVzZW50LCBidXQKLXlvdSBjYW4gbGVhdmUgb2ZmIHRoZSB0ZXh0IHN0cmluZyBvbiBub24tY29tcHJlc3NlZCBwYWlycy4KLUNvbXByZXNzZWQgcGFpcnMgbXVzdCBoYXZlIGEgdGV4dCBzdHJpbmcsIGFzIG9ubHkgdGhlIHRleHQgc3RyaW5nCi1pcyBjb21wcmVzc2VkIGFueXdheSwgc28gdGhlIGNvbXByZXNzaW9uIHdvdWxkIGJlIG1lYW5pbmdsZXNzLgotCi1QTkcgc3VwcG9ydHMgbW9kaWZpY2F0aW9uIHRpbWUgdmlhIHRoZSBwbmdfdGltZSBzdHJ1Y3R1cmUuICBUd28KLWNvbnZlcnNpb24gcm91dGluZXMgYXJlIHByb3ZpZGVkLCBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGZvcgotdGltZV90IGFuZCBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZvciBzdHJ1Y3QgdG0uICBUaGUKLXRpbWVfdCByb3V0aW5lIHVzZXMgZ210aW1lKCkuICBZb3UgZG9uJ3QgaGF2ZSB0byB1c2UgZWl0aGVyIG9mCi10aGVzZSwgYnV0IGlmIHlvdSB3aXNoIHRvIGZpbGwgaW4gdGhlIHBuZ190aW1lIHN0cnVjdHVyZSBkaXJlY3RseSwKLXlvdSBzaG91bGQgcHJvdmlkZSB0aGUgdGltZSBpbiB1bml2ZXJzYWwgdGltZSAoR01UKSBpZiBwb3NzaWJsZQotaW5zdGVhZCBvZiB5b3VyIGxvY2FsIHRpbWUuICBOb3RlIHRoYXQgdGhlIHllYXIgbnVtYmVyIGlzIHRoZSBmdWxsCi15ZWFyIChlLmcuIDE5OTgsIHJhdGhlciB0aGFuIDk4IC0gUE5HIGlzIHllYXIgMjAwMCBjb21wbGlhbnQhKSwgYW5kCi10aGF0IG1vbnRocyBzdGFydCB3aXRoIDEuCi0KLUlmIHlvdSB3YW50IHRvIHN0b3JlIHRoZSB0aW1lIG9mIHRoZSBvcmlnaW5hbCBpbWFnZSBjcmVhdGlvbiwgeW91IHNob3VsZAotdXNlIGEgcGxhaW4gdEVYdCBjaHVuayB3aXRoIHRoZSAiQ3JlYXRpb24gVGltZSIga2V5d29yZC4gIFRoaXMgaXMKLW5lY2Vzc2FyeSBiZWNhdXNlIHRoZSAiY3JlYXRpb24gdGltZSIgb2YgYSBQTkcgaW1hZ2UgaXMgc29tZXdoYXQgdmFndWUsCi1kZXBlbmRpbmcgb24gd2hldGhlciB5b3UgbWVhbiB0aGUgUE5HIGZpbGUsIHRoZSB0aW1lIHRoZSBpbWFnZSB3YXMKLWNyZWF0ZWQgaW4gYSBub24tUE5HIGZvcm1hdCwgYSBzdGlsbCBwaG90byBmcm9tIHdoaWNoIHRoZSBpbWFnZSB3YXMKLXNjYW5uZWQsIG9yIHBvc3NpYmx5IHRoZSBzdWJqZWN0IG1hdHRlciBpdHNlbGYuICBJbiBvcmRlciB0byBmYWNpbGl0YXRlCi1tYWNoaW5lLXJlYWRhYmxlIGRhdGVzLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSAiQ3JlYXRpb24gVGltZSIKLXRFWHQgY2h1bmsgdXNlIFJGQyAxMTIzIGZvcm1hdCBkYXRlcyAoZS5nLiAiMjIgTWF5IDE5OTcgMTg6MDc6MTAgR01UIiksCi1hbHRob3VnaCB0aGlzIGlzbid0IGEgcmVxdWlyZW1lbnQuICBVbmxpa2UgdGhlIHRJTUUgY2h1bmssIHRoZQotIkNyZWF0aW9uIFRpbWUiIHRFWHQgY2h1bmsgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGF1dG9tYXRpY2FsbHkgY2hhbmdlZAotYnkgdGhlIHNvZnR3YXJlLiAgVG8gZmFjaWxpdGF0ZSB0aGUgdXNlIG9mIFJGQyAxMTIzIGRhdGVzLCBhIGZ1bmN0aW9uCi1wbmdfY29udmVydF90b19yZmMxMTIzKHBuZ190aW1lcCkgaXMgcHJvdmlkZWQgdG8gY29udmVydCBmcm9tIFBORwotdGltZSB0byBhbiBSRkMgMTEyMyBmb3JtYXQgc3RyaW5nLgotCi1Xcml0aW5nIHVua25vd24gY2h1bmtzCi0KLVlvdSBjYW4gdXNlIHRoZSBwbmdfc2V0X3Vua25vd25fY2h1bmtzIGZ1bmN0aW9uIHRvIHF1ZXVlIHVwIGNodW5rcwotZm9yIHdyaXRpbmcuICBZb3UgZ2l2ZSBpdCBhIGNodW5rIG5hbWUsIHJhdyBkYXRhLCBhbmQgYSBzaXplOyB0aGF0J3MKLWFsbCB0aGVyZSBpcyB0byBpdC4gIFRoZSBjaHVua3Mgd2lsbCBiZSB3cml0dGVuIGJ5IHRoZSBuZXh0IGZvbGxvd2luZwotcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUsIHBuZ193cml0ZV9pbmZvLCBvciBwbmdfd3JpdGVfZW5kIGZ1bmN0aW9uLgotQW55IGNodW5rcyBwcmV2aW91c2x5IHJlYWQgaW50byB0aGUgaW5mbyBzdHJ1Y3R1cmUncyB1bmtub3duLWNodW5rCi1saXN0IHdpbGwgYWxzbyBiZSB3cml0dGVuIG91dCBpbiBhIHNlcXVlbmNlIHRoYXQgc2F0aXNmaWVzIHRoZSBQTkcKLXNwZWNpZmljYXRpb24ncyBvcmRlcmluZyBydWxlcy4KLQotVGhlIGhpZ2gtbGV2ZWwgd3JpdGUgaW50ZXJmYWNlCi0KLUF0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHByb2NlZWQ7IHRocm91Z2ggdGhlIGhpZ2gtbGV2ZWwKLXdyaXRlIGludGVyZmFjZSwgb3IgdGhyb3VnaCBhIHNlcXVlbmNlIG9mIGxvdy1sZXZlbCB3cml0ZSBvcGVyYXRpb25zLgotWW91IGNhbiB1c2UgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGlmIHlvdXIgaW1hZ2UgZGF0YSBpcyBwcmVzZW50Ci1pbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBBbGwgZGVmaW5lZCBvdXRwdXQKLXRyYW5zZm9ybWF0aW9ucyBhcmUgcGVybWl0dGVkLCBlbmFibGVkIGJ5IHRoZSBmb2xsb3dpbmcgbWFza3MuCi0KLSAgICBQTkdfVFJBTlNGT1JNX0lERU5USVRZICAgICAgTm8gdHJhbnNmb3JtYXRpb24KLSAgICBQTkdfVFJBTlNGT1JNX1BBQ0tJTkcgICAgICAgUGFjayAxLCAyIGFuZCA0LWJpdCBzYW1wbGVzCi0gICAgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgIENoYW5nZSBvcmRlciBvZiBwYWNrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRvIExTQiBmaXJzdAotICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICBJbnZlcnQgbW9ub2Nocm9tZSBpbWFnZXMKLSAgICBQTkdfVFJBTlNGT1JNX1NISUZUICAgICAgICAgTm9ybWFsaXplIHBpeGVscyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JJVCBkZXB0aAotICAgIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICBGbGlwIFJHQiB0byBCR1IsIFJHQkEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQkdSQQotICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICBGbGlwIFJHQkEgdG8gQVJHQiBvciBHQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBBRwotICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICBDaGFuZ2UgYWxwaGEgZnJvbSBvcGFjaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRyYW5zcGFyZW5jeQotICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICBCeXRlLXN3YXAgMTYtYml0IHNhbXBsZXMKLSAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUiAgICAgICAgU3RyaXAgb3V0IGZpbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyAoZGVwcmVjYXRlZCkuCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFIFN0cmlwIG91dCBsZWFkaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlciBieXRlcwotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0FGVEVSICBTdHJpcCBvdXQgdHJhaWxpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbGVyIGJ5dGVzCi0KLUlmIHlvdSBoYXZlIHZhbGlkIGltYWdlIGRhdGEgaW4gdGhlIGluZm8gc3RydWN0dXJlICh5b3UgY2FuIHVzZQotcG5nX3NldF9yb3dzKCkgdG8gcHV0IGltYWdlIGRhdGEgaW4gdGhlIGluZm8gc3RydWN0dXJlKSwgc2ltcGx5IGRvIHRoaXM6Ci0KLSAgICBwbmdfd3JpdGVfcG5nKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfdHJhbnNmb3JtcywgTlVMTCkKLQotd2hlcmUgcG5nX3RyYW5zZm9ybXMgaXMgYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIHNvbWUgc2V0IG9mCi10cmFuc2Zvcm1hdGlvbiBmbGFncy4gIFRoaXMgY2FsbCBpcyBlcXVpdmFsZW50IHRvIHBuZ193cml0ZV9pbmZvKCksCi1mb2xsb3dlZCB0aGUgc2V0IG9mIHRyYW5zZm9ybWF0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIHRyYW5zZm9ybSBtYXNrLAotdGhlbiBwbmdfd3JpdGVfaW1hZ2UoKSwgYW5kIGZpbmFsbHkgcG5nX3dyaXRlX2VuZCgpLgotCi0oVGhlIGZpbmFsIHBhcmFtZXRlciBvZiB0aGlzIGNhbGwgaXMgbm90IHlldCB1c2VkLiAgU29tZWRheSBpdCBtaWdodCBwb2ludAotdG8gdHJhbnNmb3JtYXRpb24gcGFyYW1ldGVycyByZXF1aXJlZCBieSBzb21lIGZ1dHVyZSBvdXRwdXQgdHJhbnNmb3JtLikKLQotWW91IG11c3QgdXNlIHBuZ190cmFuc2Zvcm1zIGFuZCBub3QgY2FsbCBhbnkgcG5nX3NldF90cmFuc2Zvcm0oKSBmdW5jdGlvbnMKLXdoZW4geW91IHVzZSBwbmdfd3JpdGVfcG5nKCkuCi0KLVRoZSBsb3ctbGV2ZWwgd3JpdGUgaW50ZXJmYWNlCi0KLUlmIHlvdSBhcmUgZ29pbmcgdGhlIGxvdy1sZXZlbCByb3V0ZSBpbnN0ZWFkLCB5b3UgYXJlIG5vdyByZWFkeSB0bwotd3JpdGUgYWxsIHRoZSBmaWxlIGluZm9ybWF0aW9uIHVwIHRvIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFlvdSBkbwotdGhpcyB3aXRoIGEgY2FsbCB0byBwbmdfd3JpdGVfaW5mbygpLgotCi0gICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi1Ob3RlIHRoYXQgdGhlcmUgaXMgb25lIHRyYW5zZm9ybWF0aW9uIHlvdSBtYXkgbmVlZCB0byBkbyBiZWZvcmUKLXBuZ193cml0ZV9pbmZvKCkuICBJbiBQTkcgZmlsZXMsIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlIGlzIHRoZQotbGV2ZWwgb2Ygb3BhY2l0eS4gIElmIHlvdXIgZGF0YSBpcyBzdXBwbGllZCBhcyBhIGxldmVsIG9mCi10cmFuc3BhcmVuY3ksIHlvdSBjYW4gaW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsIGJlZm9yZSB5b3Ugd3JpdGUgaXQsIHNvCi10aGF0IDAgaXMgZnVsbHkgdHJhbnNwYXJlbnQgYW5kIDI1NSAoaW4gOC1iaXQgb3IgcGFsZXR0ZWQgaW1hZ2VzKSBvcgotNjU1MzUgKGluIDE2LWJpdCBpbWFnZXMpIGlzIGZ1bGx5IG9wYXF1ZSwgd2l0aAotCi0gICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7Ci0KLVRoaXMgbXVzdCBhcHBlYXIgYmVmb3JlIHBuZ193cml0ZV9pbmZvKCkgaW5zdGVhZCBvZiBsYXRlciB3aXRoIHRoZQotb3RoZXIgdHJhbnNmb3JtYXRpb25zIGJlY2F1c2UgaW4gdGhlIGNhc2Ugb2YgcGFsZXR0ZWQgaW1hZ2VzIHRoZSB0Uk5TCi1jaHVuayBkYXRhIGhhcyB0byBiZSBpbnZlcnRlZCBiZWZvcmUgdGhlIHRSTlMgY2h1bmsgaXMgd3JpdHRlbi4gIElmCi15b3VyIGltYWdlIGlzIG5vdCBhIHBhbGV0dGVkIGltYWdlLCB0aGUgdFJOUyBkYXRhICh3aGljaCBpbiBzdWNoIGNhc2VzCi1yZXByZXNlbnRzIGEgc2luZ2xlIGNvbG9yIHRvIGJlIHJlbmRlcmVkIGFzIHRyYW5zcGFyZW50KSB3b24ndCBuZWVkIHRvCi1iZSBjaGFuZ2VkLCBhbmQgeW91IGNhbiBzYWZlbHkgZG8gdGhpcyB0cmFuc2Zvcm1hdGlvbiBhZnRlciB5b3VyCi1wbmdfd3JpdGVfaW5mbygpIGNhbGwuCi0KLUlmIHlvdSBuZWVkIHRvIHdyaXRlIGEgcHJpdmF0ZSBjaHVuayB0aGF0IHlvdSB3YW50IHRvIGFwcGVhciBiZWZvcmUKLXRoZSBQTFRFIGNodW5rIHdoZW4gUExURSBpcyBwcmVzZW50LCB5b3UgY2FuIHdyaXRlIHRoZSBQTkcgaW5mbyBpbgotdHdvIHN0ZXBzLCBhbmQgaW5zZXJ0IGNvZGUgdG8gd3JpdGUgeW91ciBvd24gY2h1bmsgYmV0d2VlbiB0aGVtOgotCi0gICAgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsIC4uLik7Ci0gICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi1BZnRlciB5b3UndmUgd3JpdHRlbiB0aGUgZmlsZSBpbmZvcm1hdGlvbiwgeW91IGNhbiBzZXQgdXAgdGhlIGxpYnJhcnkKLXRvIGhhbmRsZSBhbnkgc3BlY2lhbCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGltYWdlIGRhdGEuICBUaGUgdmFyaW91cwotd2F5cyB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleQotc2hvdWxkIG9jY3VyLiAgVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHNvbWUgb2YgdGhlc2UgY2hhbmdlIHRoZSBjb2xvcgotdHlwZSBhbmQvb3IgYml0IGRlcHRoIG9mIHRoZSBkYXRhLCBhbmQgc29tZSBvdGhlcnMgb25seSB3b3JrIG9uCi1jZXJ0YWluIGNvbG9yIHR5cGVzIGFuZCBiaXQgZGVwdGhzLiAgRXZlbiB0aG91Z2ggZWFjaCB0cmFuc2Zvcm1hdGlvbgotY2hlY2tzIHRvIHNlZSBpZiBpdCBoYXMgZGF0YSB0aGF0IGl0IGNhbiBkbyBzb21ldGhpbmcgd2l0aCwgeW91IHNob3VsZAotbWFrZSBzdXJlIHRvIG9ubHkgZW5hYmxlIGEgdHJhbnNmb3JtYXRpb24gaWYgaXQgd2lsbCBiZSB2YWxpZCBmb3IgdGhlCi1kYXRhLiAgRm9yIGV4YW1wbGUsIGRvbid0IHN3YXAgcmVkIGFuZCBibHVlIG9uIGdyYXlzY2FsZSBkYXRhLgotCi1QTkcgZmlsZXMgc3RvcmUgUkdCIHBpeGVscyBwYWNrZWQgaW50byAzIG9yIDYgYnl0ZXMuICBUaGlzIGNvZGUgdGVsbHMKLXRoZSBsaWJyYXJ5IHRvIHN0cmlwIGlucHV0IGRhdGEgdGhhdCBoYXMgNCBvciA4IGJ5dGVzIHBlciBwaXhlbCBkb3duCi10byAzIG9yIDYgYnl0ZXMgKG9yIHN0cmlwIDIgb3IgNC1ieXRlIGdyYXlzY2FsZStmaWxsZXIgZGF0YSB0byAxIG9yIDIKLWJ5dGVzIHBlciBwaXhlbCkuCi0KLSAgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAwLCBQTkdfRklMTEVSX0JFRk9SRSk7Ci0KLXdoZXJlIHRoZSAwIGlzIHVudXNlZCwgYW5kIHRoZSBsb2NhdGlvbiBpcyBlaXRoZXIgUE5HX0ZJTExFUl9CRUZPUkUgb3IKLVBOR19GSUxMRVJfQUZURVIsIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgdGhlIGZpbGxlciBieXRlIGluIHRoZSBwaXhlbAotaXMgc3RvcmVkIFhSR0Igb3IgUkdCWC4KLQotUE5HIGZpbGVzIHBhY2sgcGl4ZWxzIG9mIGJpdCBkZXB0aHMgMSwgMiwgYW5kIDQgaW50byBieXRlcyBhcyBzbWFsbCBhcwotdGhleSBjYW4sIHJlc3VsdGluZyBpbiwgZm9yIGV4YW1wbGUsIDggcGl4ZWxzIHBlciBieXRlIGZvciAxIGJpdCBmaWxlcy4KLUlmIHRoZSBkYXRhIGlzIHN1cHBsaWVkIGF0IDEgcGl4ZWwgcGVyIGJ5dGUsIHVzZSB0aGlzIGNvZGUsIHdoaWNoIHdpbGwKLWNvcnJlY3RseSBwYWNrIHRoZSBwaXhlbHMgaW50byBhIHNpbmdsZSBieXRlOgotCi0gICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOwotCi1QTkcgZmlsZXMgcmVkdWNlIHBvc3NpYmxlIGJpdCBkZXB0aHMgdG8gMSwgMiwgNCwgOCwgYW5kIDE2LiAgSWYgeW91cgotZGF0YSBpcyBvZiBhbm90aGVyIGJpdCBkZXB0aCwgeW91IGNhbiB3cml0ZSBhbiBzQklUIGNodW5rIGludG8gdGhlCi1maWxlIHNvIHRoYXQgZGVjb2RlcnMgY2FuIHJlY292ZXIgdGhlIG9yaWdpbmFsIGRhdGEgaWYgZGVzaXJlZC4KLQotICAgIC8qIFNldCB0aGUgdHJ1ZSBiaXQgZGVwdGggb2YgdGhlIGltYWdlIGRhdGEgKi8KLSAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgIHsKLSAgICAgICAgc2lnX2JpdC5yZWQgPSB0cnVlX2JpdF9kZXB0aDsKLSAgICAgICAgc2lnX2JpdC5ncmVlbiA9IHRydWVfYml0X2RlcHRoOwotICAgICAgICBzaWdfYml0LmJsdWUgPSB0cnVlX2JpdF9kZXB0aDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc2lnX2JpdC5ncmF5ID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgfQotICAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0gICAgewotICAgICAgICBzaWdfYml0LmFscGhhID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgfQotCi0gICAgcG5nX3NldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCk7Ci0KLUlmIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgcm93IGJ1ZmZlciBpbiBhIGJpdCBkZXB0aCBvdGhlciB0aGFuCi1vbmUgc3VwcG9ydGVkIGJ5IFBORyAoZS5nLiAzIGJpdCBkYXRhIGluIHRoZSByYW5nZSAwLTcgZm9yIGEgNC1iaXQgUE5HKSwKLXRoaXMgd2lsbCBzY2FsZSB0aGUgdmFsdWVzIHRvIGFwcGVhciB0byBiZSB0aGUgY29ycmVjdCBiaXQgZGVwdGggYXMKLWlzIHJlcXVpcmVkIGJ5IFBORy4KLQotICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgJnNpZ19iaXQpOwotCi1QTkcgZmlsZXMgc3RvcmUgMTYgYml0IHBpeGVscyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZy1lbmRpYW4sCi1pZS4gbW9zdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0KS4gIFRoaXMgY29kZSB3b3VsZCBiZSB1c2VkIGlmIHRoZXkgYXJlCi1zdXBwbGllZCB0aGUgb3RoZXIgd2F5IChsaXR0bGUtZW5kaWFuLCBpLmUuIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKLWZpcnN0LCB0aGUgd2F5IFBDcyBzdG9yZSB0aGVtKToKLQotICAgIGlmIChiaXRfZGVwdGggPiA4KQotICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKLQotSWYgeW91IGFyZSB1c2luZyBwYWNrZWQtcGl4ZWwgaW1hZ2VzICgxLCAyLCBvciA0IGJpdHMvcGl4ZWwpLCBhbmQgeW91Ci1uZWVkIHRvIGNoYW5nZSB0aGUgb3JkZXIgdGhlIHBpeGVscyBhcmUgcGFja2VkIGludG8gYnl0ZXMsIHlvdSBjYW4gdXNlOgotCi0gICAgaWYgKGJpdF9kZXB0aCA8IDgpCi0gICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHN0b3JlIDMgY29sb3IgcGl4ZWxzIGluIHJlZCwgZ3JlZW4sIGJsdWUgb3JkZXIuICBUaGlzIGNvZGUKLXdvdWxkIGJlIHVzZWQgaWYgdGhleSBhcmUgc3VwcGxpZWQgYXMgYmx1ZSwgZ3JlZW4sIHJlZDoKLQotICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOwotCi1QTkcgZmlsZXMgZGVzY3JpYmUgbW9ub2Nocm9tZSBhcyBibGFjayBiZWluZyB6ZXJvIGFuZCB3aGl0ZSBiZWluZwotb25lLiBUaGlzIGNvZGUgd291bGQgYmUgdXNlZCBpZiB0aGUgcGl4ZWxzIGFyZSBzdXBwbGllZCB3aXRoIHRoaXMgcmV2ZXJzZWQKLShibGFjayBiZWluZyBvbmUgYW5kIHdoaXRlIGJlaW5nIHplcm8pOgotCi0gICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKLQotRmluYWxseSwgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpZiBub25lIG9mCi10aGUgZXhpc3Rpbmcgb25lcyBtZWV0cyB5b3VyIG5lZWRzLiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgYSBjYWxsYmFjawotd2l0aAotCi0gICAgcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbihwbmdfcHRyLAotICAgICAgIHdyaXRlX3RyYW5zZm9ybV9mbik7Ci0KLVlvdSBtdXN0IHN1cHBseSB0aGUgZnVuY3Rpb24KLQotICAgIHZvaWQgd3JpdGVfdHJhbnNmb3JtX2ZuKHBuZ19wdHIgcHRyLCByb3dfaW5mb19wdHIKLSAgICAgICByb3dfaW5mbywgcG5nX2J5dGVwIGRhdGEpCi0KLVNlZSBwbmd0ZXN0LmMgZm9yIGEgd29ya2luZyBleGFtcGxlLiAgWW91ciBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAotYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIGFyZSBwcm9jZXNzZWQuCi0KLVlvdSBjYW4gYWxzbyBzZXQgdXAgYSBwb2ludGVyIHRvIGEgdXNlciBzdHJ1Y3R1cmUgZm9yIHVzZSBieSB5b3VyCi1jYWxsYmFjayBmdW5jdGlvbi4KLQotICAgIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCB1c2VyX3B0ciwgMCwgMCk7Ci0KLVRoZSB1c2VyX2NoYW5uZWxzIGFuZCB1c2VyX2RlcHRoIHBhcmFtZXRlcnMgb2YgdGhpcyBmdW5jdGlvbiBhcmUgaWdub3JlZAotd2hlbiB3cml0aW5nOyB5b3UgY2FuIHNldCB0aGVtIHRvIHplcm8gYXMgc2hvd24uCi0KLVlvdSBjYW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgdmlhIHRoZSBmdW5jdGlvbiBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cigpLgotRm9yIGV4YW1wbGU6Ci0KLSAgICB2b2lkcCB3cml0ZV91c2VyX3RyYW5zZm9ybV9wdHIgPQotICAgICAgIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKHBuZ19wdHIpOwotCi1JdCBpcyBwb3NzaWJsZSB0byBoYXZlIGxpYnBuZyBmbHVzaCBhbnkgcGVuZGluZyBvdXRwdXQsIGVpdGhlciBtYW51YWxseSwKLW9yIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgYSBjZXJ0YWluIG51bWJlciBvZiBsaW5lcyBoYXZlIGJlZW4gd3JpdHRlbi4gIFRvCi1mbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBhIHNpbmdsZSB0aW1lIGNhbGw6Ci0KLSAgICBwbmdfd3JpdGVfZmx1c2gocG5nX3B0cik7Ci0KLWFuZCB0byBoYXZlIGxpYnBuZyBmbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBwZXJpb2RpY2FsbHkgYWZ0ZXIgYSBjZXJ0YWluCi1udW1iZXIgb2Ygc2NhbmxpbmVzIGhhdmUgYmVlbiB3cml0dGVuLCBjYWxsOgotCi0gICAgcG5nX3NldF9mbHVzaChwbmdfcHRyLCBucm93cyk7Ci0KLU5vdGUgdGhhdCB0aGUgZGlzdGFuY2UgYmV0d2VlbiByb3dzIGlzIGZyb20gdGhlIGxhc3QgdGltZSBwbmdfd3JpdGVfZmx1c2goKQotd2FzIGNhbGxlZCwgb3IgdGhlIGZpcnN0IHJvdyBvZiB0aGUgaW1hZ2UgaWYgaXQgaGFzIG5ldmVyIGJlZW4gY2FsbGVkLgotU28gaWYgeW91IHdyaXRlIDUwIGxpbmVzLCBhbmQgdGhlbiBwbmdfc2V0X2ZsdXNoIDI1LCBpdCB3aWxsIGZsdXNoIHRoZQotb3V0cHV0IG9uIHRoZSBuZXh0IHNjYW5saW5lLCBhbmQgZXZlcnkgMjUgbGluZXMgdGhlcmVhZnRlciwgdW5sZXNzCi1wbmdfd3JpdGVfZmx1c2goKSBpcyBjYWxsZWQgYmVmb3JlIDI1IG1vcmUgbGluZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uCi1JZiBucm93cyBpcyB0b28gc21hbGwgKGxlc3MgdGhhbiBhYm91dCAxMCBsaW5lcyBmb3IgYSA2NDAgcGl4ZWwgd2lkZQotUkdCIGltYWdlKSB0aGUgaW1hZ2UgY29tcHJlc3Npb24gbWF5IGRlY3JlYXNlIG5vdGljZWFibHkgKGFsdGhvdWdoIHRoaXMKLW1heSBiZSBhY2NlcHRhYmxlIGZvciByZWFsLXRpbWUgYXBwbGljYXRpb25zKS4gIEluZnJlcXVlbnQgZmx1c2hpbmcgd2lsbAotb25seSBkZWdyYWRlIHRoZSBjb21wcmVzc2lvbiBwZXJmb3JtYW5jZSBieSBhIGZldyBwZXJjZW50IG92ZXIgaW1hZ2VzCi10aGF0IGRvIG5vdCB1c2UgZmx1c2hpbmcuCi0KLVdyaXRpbmcgdGhlIGltYWdlIGRhdGEKLQotVGhhdCdzIGl0IGZvciB0aGUgdHJhbnNmb3JtYXRpb25zLiAgTm93IHlvdSBjYW4gd3JpdGUgdGhlIGltYWdlIGRhdGEuCi1UaGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgaW4gb25lIGZ1bmN0aW9uIGNhbGwuICBJZiB5b3UgaGF2ZSB0aGUKLXdob2xlIGltYWdlIGluIG1lbW9yeSwgeW91IGNhbiBqdXN0IGNhbGwgcG5nX3dyaXRlX2ltYWdlKCkgYW5kIGxpYnBuZwotd2lsbCB3cml0ZSB0aGUgaW1hZ2UuICBZb3Ugd2lsbCBuZWVkIHRvIHBhc3MgaW4gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8KLWVhY2ggcm93LiAgVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW50ZXJsYWNpbmcsIHNvIHlvdSBkb24ndAotbmVlZCB0byBjYWxsIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgb3IgY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlCi10aW1lcywgb3IgYW55IG9mIHRoYXQgb3RoZXIgc3R1ZmYgbmVjZXNzYXJ5IHdpdGggcG5nX3dyaXRlX3Jvd3MoKS4KLQotICAgIHBuZ193cml0ZV9pbWFnZShwbmdfcHRyLCByb3dfcG9pbnRlcnMpOwotCi13aGVyZSByb3dfcG9pbnRlcnMgaXM6Ci0KLSAgICBwbmdfYnl0ZSAqcm93X3BvaW50ZXJzW2hlaWdodF07Ci0KLVlvdSBjYW4gcG9pbnQgdG8gdm9pZCBvciBjaGFyIG9yIHdoYXRldmVyIHlvdSB1c2UgZm9yIHBpeGVscy4KLQotSWYgeW91IGRvbid0IHdhbnQgdG8gd3JpdGUgdGhlIHdob2xlIGltYWdlIGF0IG9uY2UsIHlvdSBjYW4KLXVzZSBwbmdfd3JpdGVfcm93cygpIGluc3RlYWQuICBJZiB0aGUgZmlsZSBpcyBub3QgaW50ZXJsYWNlZCwKLXRoaXMgaXMgc2ltcGxlOgotCi0gICAgcG5nX3dyaXRlX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLAotICAgICAgIG51bWJlcl9vZl9yb3dzKTsKLQotcm93X3BvaW50ZXJzIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBwbmdfd3JpdGVfaW1hZ2UoKSBjYWxsLgotCi1JZiB5b3UgYXJlIGp1c3Qgd3JpdGluZyBvbmUgcm93IGF0IGEgdGltZSwgeW91IGNhbiBkbyB0aGlzIHdpdGgKLWEgc2luZ2xlIHJvd19wb2ludGVyIGluc3RlYWQgb2YgYW4gYXJyYXkgb2Ygcm93X3BvaW50ZXJzOgotCi0gICAgcG5nX2J5dGVwIHJvd19wb2ludGVyID0gcm93OwotCi0gICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCByb3dfcG9pbnRlcik7Ci0KLVdoZW4gdGhlIGZpbGUgaXMgaW50ZXJsYWNlZCwgdGhpbmdzIGNhbiBnZXQgYSBnb29kIGRlYWwgbW9yZQotY29tcGxpY2F0ZWQuICBUaGUgb25seSBjdXJyZW50bHkgKGFzIG9mIHRoZSBQTkcgU3BlY2lmaWNhdGlvbgotdmVyc2lvbiAxLjIsIGRhdGVkIEp1bHkgMTk5OSkgZGVmaW5lZCBpbnRlcmxhY2luZyBzY2hlbWUgZm9yIFBORyBmaWxlcwotaXMgdGhlICJBZGFtNyIgaW50ZXJsYWNlIHNjaGVtZSwgdGhhdCBicmVha3MgZG93biBhbgotaW1hZ2UgaW50byBzZXZlbiBzbWFsbGVyIGltYWdlcyBvZiB2YXJ5aW5nIHNpemUuICBsaWJwbmcgd2lsbCBidWlsZAotdGhlc2UgaW1hZ2VzIGZvciB5b3UsIG9yIHlvdSBjYW4gZG8gdGhlbSB5b3Vyc2VsZi4gIElmIHlvdSB3YW50IHRvCi1idWlsZCB0aGVtIHlvdXJzZWxmLCBzZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9mIHdoaWNoCi1waXhlbHMgdG8gd3JpdGUgd2hlbi4KLQotSWYgeW91IGRvbid0IHdhbnQgbGlicG5nIHRvIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcgZGV0YWlscywganVzdAotdXNlIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgYW5kIGNhbGwgcG5nX3dyaXRlX3Jvd3MoKSB0aGUKLWNvcnJlY3QgbnVtYmVyIG9mIHRpbWVzIHRvIHdyaXRlIGFsbCBzZXZlbiBzdWItaW1hZ2VzLgotCi1JZiB5b3Ugd2FudCBsaWJwbmcgdG8gYnVpbGQgdGhlIHN1Yi1pbWFnZXMsIGNhbGwgdGhpcyBiZWZvcmUgeW91IHN0YXJ0Ci13cml0aW5nIGFueSByb3dzOgotCi0gICAgbnVtYmVyX29mX3Bhc3NlcyA9Ci0gICAgICAgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7Ci0KLVRoaXMgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXNzZXMgbmVlZGVkLiAgQ3VycmVudGx5LCB0aGlzCi1pcyBzZXZlbiwgYnV0IG1heSBjaGFuZ2UgaWYgYW5vdGhlciBpbnRlcmxhY2UgdHlwZSBpcyBhZGRlZC4KLQotVGhlbiB3cml0ZSB0aGUgY29tcGxldGUgaW1hZ2UgbnVtYmVyX29mX3Bhc3NlcyB0aW1lcy4KLQotICAgIHBuZ193cml0ZV9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywKLSAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0KLUFzIHNvbWUgb2YgdGhlc2Ugcm93cyBhcmUgbm90IHVzZWQsIGFuZCB0aHVzIHJldHVybiBpbW1lZGlhdGVseSwKLXlvdSBtYXkgd2FudCB0byByZWFkIGFib3V0IGludGVybGFjaW5nIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwKLWFuZCBvbmx5IHVwZGF0ZSB0aGUgcm93cyB0aGF0IGFyZSBhY3R1YWxseSB1c2VkLgotCi1GaW5pc2hpbmcgYSBzZXF1ZW50aWFsIHdyaXRlCi0KLUFmdGVyIHlvdSBhcmUgZmluaXNoZWQgd3JpdGluZyB0aGUgaW1hZ2UsIHlvdSBzaG91bGQgZmluaXNoIHdyaXRpbmcKLXRoZSBmaWxlLiAgSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHdyaXRpbmcgY29tbWVudHMgb3IgdGltZSwgeW91IHNob3VsZAotcGFzcyBhbiBhcHByb3ByaWF0ZWx5IGZpbGxlZCBwbmdfaW5mbyBwb2ludGVyLiAgSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCwKLXlvdSBjYW4gcGFzcyBOVUxMLgotCi0gICAgcG5nX3dyaXRlX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLVdoZW4geW91IGFyZSBkb25lLCB5b3UgY2FuIGZyZWUgYWxsIG1lbW9yeSB1c2VkIGJ5IGxpYnBuZyBsaWtlIHRoaXM6Ci0KLSAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7Ci0KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gaW5kaXZpZHVhbGx5IGZyZWUgdGhlIGluZm9fcHRyIG1lbWJlcnMgdGhhdAotcG9pbnQgdG8gbGlicG5nLWFsbG9jYXRlZCBzdG9yYWdlIHdpdGggdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKLQotICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIG1hc2ssIHNlcSkKLSAgICBtYXNrICAtIGlkZW50aWZpZXMgZGF0YSB0byBiZSBmcmVlZCwgYSBtYXNrCi0gICAgICAgICAgICBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvcgotICAgICAgICAgICAgbW9yZSBvZgotICAgICAgICAgICAgICBQTkdfRlJFRV9QTFRFLCBQTkdfRlJFRV9UUk5TLAotICAgICAgICAgICAgICBQTkdfRlJFRV9ISVNULCBQTkdfRlJFRV9JQ0NQLAotICAgICAgICAgICAgICBQTkdfRlJFRV9QQ0FMLCBQTkdfRlJFRV9ST1dTLAotICAgICAgICAgICAgICBQTkdfRlJFRV9TQ0FMLCBQTkdfRlJFRV9TUExULAotICAgICAgICAgICAgICBQTkdfRlJFRV9URVhULCBQTkdfRlJFRV9VTktOLAotICAgICAgICAgICAgb3Igc2ltcGx5IFBOR19GUkVFX0FMTAotICAgIHNlcSAgIC0gc2VxdWVuY2UgbnVtYmVyIG9mIGl0ZW0gdG8gYmUgZnJlZWQKLSAgICAgICAgICAgICgtMSBmb3IgYWxsIGl0ZW1zKQotCi1UaGlzIGZ1bmN0aW9uIG1heSBiZSBzYWZlbHkgY2FsbGVkIHdoZW4gdGhlIHJlbGV2YW50IHN0b3JhZ2UgaGFzCi1hbHJlYWR5IGJlZW4gZnJlZWQsIG9yIGhhcyBub3QgeWV0IGJlZW4gYWxsb2NhdGVkLCBvciB3YXMgYWxsb2NhdGVkCi1ieSB0aGUgdXNlciAgYW5kIG5vdCBieSBsaWJwbmcsICBhbmQgd2lsbCBpbiB0aG9zZQotY2FzZXMgZG8gbm90aGluZy4gIFRoZSAic2VxIiBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpZiBvbmx5IG9uZSBpdGVtCi1vZiB0aGUgc2VsZWN0ZWQgZGF0YSB0eXBlLCBzdWNoIGFzIFBMVEUsIGlzIGFsbG93ZWQuICBJZiAic2VxIiBpcyBub3QKLS0xLCBhbmQgbXVsdGlwbGUgaXRlbXMgYXJlIGFsbG93ZWQgZm9yIHRoZSBkYXRhIHR5cGUgaWRlbnRpZmllZCBpbgotdGhlIG1hc2ssIHN1Y2ggYXMgdGV4dCBvciBzUExULCBvbmx5IHRoZSBuJ3RoIGl0ZW0gaW4gdGhlIHN0cnVjdHVyZQotaXMgZnJlZWQsIHdoZXJlIG4gaXMgInNlcSIuCi0KLUlmIHlvdSBhbGxvY2F0ZWQgZGF0YSBzdWNoIGFzIGEgcGFsZXR0ZSB0aGF0IHlvdSBwYXNzZWQKLWluIHRvIGxpYnBuZyB3aXRoIHBuZ19zZXRfKiwgeW91IG11c3Qgbm90IGZyZWUgaXQgdW50aWwganVzdCBiZWZvcmUgdGhlIGNhbGwgdG8KLXBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpLgotCi1UaGUgZGVmYXVsdCBiZWhhdmlvciBpcyBvbmx5IHRvIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW50ZXJuYWxseQotYnkgbGlicG5nLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCwgc28gdGhhdCBsaWJwbmcgd2lsbCBub3QgZnJlZSB0aGUgZGF0YSwKLW9yIHNvIHRoYXQgaXQgd2lsbCBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIHdpdGggcG5nX21hbGxvYygpCi1vciBwbmdfemFsbG9jKCkgYW5kIHBhc3NlZCBpbiB2aWEgYSBwbmdfc2V0XyooKSBmdW5jdGlvbiwgd2l0aAotCi0gICAgcG5nX2RhdGFfZnJlZXIocG5nX3B0ciwgaW5mb19wdHIsIGZyZWVyLCBtYXNrKQotICAgIG1hc2sgICAtIHdoaWNoIGRhdGEgZWxlbWVudHMgYXJlIGFmZmVjdGVkCi0gICAgICAgICAgICAgc2FtZSBjaG9pY2VzIGFzIGluIHBuZ19mcmVlX2RhdGEoKQotICAgIGZyZWVyICAtIG9uZSBvZgotICAgICAgICAgICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEKLSAgICAgICAgICAgICAgIFBOR19TRVRfV0lMTF9GUkVFX0RBVEEKLSAgICAgICAgICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBCi0KLUZvciBleGFtcGxlLCB0byB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3Igc29tZSBkYXRhIGZyb20gYSByZWFkIHN0cnVjdHVyZQotdG8gYSB3cml0ZSBzdHJ1Y3R1cmUsIHlvdSBjb3VsZCB1c2UKLQotICAgIHBuZ19kYXRhX2ZyZWVyKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLAotICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBLAotICAgICAgIFBOR19GUkVFX1BMVEV8UE5HX0ZSRUVfdFJOU3xQTkdfRlJFRV9oSVNUKQotICAgIHBuZ19kYXRhX2ZyZWVyKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsCi0gICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEsCi0gICAgICAgUE5HX0ZSRUVfUExURXxQTkdfRlJFRV90Uk5TfFBOR19GUkVFX2hJU1QpCi0KLXRoZXJlYnkgYnJpZWZseSByZWFzc2lnbmluZyByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0byB0aGUgdXNlciBidXQKLWltbWVkaWF0ZWx5IGFmdGVyd2FyZHMgcmVhc3NpZ25pbmcgaXQgb25jZSBtb3JlIHRvIHRoZSB3cml0ZV9kZXN0cm95Ci1mdW5jdGlvbi4gIEhhdmluZyBkb25lIHRoaXMsIGl0IHdvdWxkIHRoZW4gYmUgc2FmZSB0byBkZXN0cm95IHRoZSByZWFkCi1zdHJ1Y3R1cmUgYW5kIGNvbnRpbnVlIHRvIHVzZSB0aGUgUExURSwgdFJOUywgYW5kIGhJU1QgZGF0YSBpbiB0aGUgd3JpdGUKLXN0cnVjdHVyZS4KLQotVGhpcyBmdW5jdGlvbiBvbmx5IGFmZmVjdHMgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLgotWW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgYWZ0ZXIgdGhlIHBuZ19zZXRfKigpIGZ1bmN0aW9ucwotdG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyIG9yIHBuZ19kZXN0cm95XyooKSBpcyBzdXBwb3NlZCB0byBmcmVlIHRoZSBkYXRhLgotV2hlbiB0aGUgdXNlciBhc3N1bWVzIHJlc3BvbnNpYmlsaXR5IGZvciBsaWJwbmctYWxsb2NhdGVkIGRhdGEsIHRoZQotYXBwbGljYXRpb24gbXVzdCB1c2UKLXBuZ19mcmVlKCkgdG8gZnJlZSBpdCwgYW5kIHdoZW4gdGhlIHVzZXIgdHJhbnNmZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGxpYnBuZwotZm9yIGRhdGEgdGhhdCB0aGUgdXNlciBoYXMgYWxsb2NhdGVkLCB0aGUgdXNlciBtdXN0IGhhdmUgdXNlZCBwbmdfbWFsbG9jKCkKLW9yIHBuZ196YWxsb2MoKSB0byBhbGxvY2F0ZSBpdC4KLQotSWYgeW91IGFsbG9jYXRlZCB0ZXh0X3B0ci50ZXh0LCB0ZXh0X3B0ci5sYW5nLCBhbmQgdGV4dF9wdHIudHJhbnNsYXRlZF9rZXl3b3JkCi1zZXBhcmF0ZWx5LCBkbyBub3QgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGV4dF9wdHIgdG8gbGlicG5nLAotYmVjYXVzZSB3aGVuIGxpYnBuZyBmaWxscyBhIHBuZ190ZXh0IHN0cnVjdHVyZSBpdCBjb21iaW5lcyB0aGVzZSBtZW1iZXJzIHdpdGgKLXRoZSBrZXkgbWVtYmVyLCBhbmQgcG5nX2ZyZWVfZGF0YSgpIHdpbGwgZnJlZSBvbmx5IHRleHRfcHRyLmtleS4gIFNpbWlsYXJseSwKLWlmIHlvdSB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZSdpbmcgdGV4dF9wdHIgZnJvbSBsaWJwbmcgdG8geW91cgotYXBwbGljYXRpb24sIHlvdXIgYXBwbGljYXRpb24gbXVzdCBub3Qgc2VwYXJhdGVseSBmcmVlIHRob3NlIG1lbWJlcnMuCi1Gb3IgYSBtb3JlIGNvbXBhY3QgZXhhbXBsZSBvZiB3cml0aW5nIGEgUE5HIGltYWdlLCBzZWUgdGhlIGZpbGUgZXhhbXBsZS5jLgotCi1WLiBNb2RpZnlpbmcvQ3VzdG9taXppbmcgbGlicG5nOgotCi1UaGVyZSBhcmUgdHdvIGlzc3VlcyBoZXJlLiAgVGhlIGZpcnN0IGlzIGNoYW5naW5nIGhvdyBsaWJwbmcgZG9lcwotc3RhbmRhcmQgdGhpbmdzIGxpa2UgbWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nLgotVGhlIHNlY29uZCBkZWFscyB3aXRoIG1vcmUgY29tcGxpY2F0ZWQgdGhpbmdzIGxpa2UgYWRkaW5nIG5ldyBjaHVua3MsCi1hZGRpbmcgbmV3IHRyYW5zZm9ybWF0aW9ucywgYW5kIGdlbmVyYWxseSBjaGFuZ2luZyBob3cgbGlicG5nIHdvcmtzLgotQm90aCBvZiB0aG9zZSBhcmUgY29tcGlsZS10aW1lIGlzc3VlczsgdGhhdCBpcywgdGhleSBhcmUgZ2VuZXJhbGx5Ci1kZXRlcm1pbmVkIGF0IHRoZSB0aW1lIHRoZSBjb2RlIGlzIHdyaXR0ZW4sIGFuZCB0aGVyZSBpcyByYXJlbHkgYSBuZWVkCi10byBwcm92aWRlIHRoZSB1c2VyIHdpdGggYSBtZWFucyBvZiBjaGFuZ2luZyB0aGVtLgotCi1NZW1vcnkgYWxsb2NhdGlvbiwgaW5wdXQvb3V0cHV0LCBhbmQgZXJyb3IgaGFuZGxpbmcKLQotQWxsIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiwgaW5wdXQvb3V0cHV0LCBhbmQgZXJyb3IgaGFuZGxpbmcgaW4gbGlicG5nCi1nb2VzIHRocm91Z2ggY2FsbGJhY2tzIHRoYXQgYXJlIHVzZXItc2V0dGFibGUuICBUaGUgZGVmYXVsdCByb3V0aW5lcyBhcmUKLWluIHBuZ21lbS5jLCBwbmdyaW8uYywgcG5nd2lvLmMsIGFuZCBwbmdlcnJvci5jLCByZXNwZWN0aXZlbHkuICBUbyBjaGFuZ2UKLXRoZXNlIGZ1bmN0aW9ucywgY2FsbCB0aGUgYXBwcm9wcmlhdGUgcG5nX3NldF8qX2ZuKCkgZnVuY3Rpb24uCi0KLU1lbW9yeSBhbGxvY2F0aW9uIGlzIGRvbmUgdGhyb3VnaCB0aGUgZnVuY3Rpb25zIHBuZ19tYWxsb2MoKQotYW5kIHBuZ19mcmVlKCkuICBUaGVzZSBjdXJyZW50bHkganVzdCBjYWxsIHRoZSBzdGFuZGFyZCBDIGZ1bmN0aW9ucy4gIElmCi15b3VyIHBvaW50ZXJzIGNhbid0IGFjY2VzcyBtb3JlIHRoZW4gNjRLIGF0IGEgdGltZSwgeW91IHdpbGwgd2FudCB0byBzZXQKLU1BWFNFR182NEsgaW4gemxpYi5oLiAgU2luY2UgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgbWV0aG9kIG9mIGhhbmRsaW5nCi1tZW1vcnkgYWxsb2NhdGlvbiBvbiBhIHBsYXRmb3JtIHdpbGwgY2hhbmdlIGJldHdlZW4gYXBwbGljYXRpb25zLCB0aGVzZQotZnVuY3Rpb25zIG11c3QgYmUgbW9kaWZpZWQgaW4gdGhlIGxpYnJhcnkgYXQgY29tcGlsZSB0aW1lLiAgSWYgeW91IHByZWZlcgotdG8gdXNlIGEgZGlmZmVyZW50IG1ldGhvZCBvZiBhbGxvY2F0aW5nIGFuZCBmcmVlaW5nIGRhdGEsIHlvdSBjYW4gdXNlCi1wbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoKSBvciBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKCkgdG8gcmVnaXN0ZXIKLXlvdXIgb3duIGZ1bmN0aW9ucyBhcyBkZXNjcmliZWQgYWJvdmUuCi1UaGVzZSBmdW5jdGlvbnMgYWxzbyBwcm92aWRlIGEgdm9pZCBwb2ludGVyIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB2aWEKLQotICAgIG1lbV9wdHI9cG5nX2dldF9tZW1fcHRyKHBuZ19wdHIpOwotCi1Zb3VyIHJlcGxhY2VtZW50IG1lbW9yeSBmdW5jdGlvbnMgbXVzdCBoYXZlIHByb3RvdHlwZXMgYXMgZm9sbG93czoKLQotICAgIHBuZ192b2lkcCBtYWxsb2NfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICBwbmdfc2l6ZV90IHNpemUpOwotICAgIHZvaWQgZnJlZV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyKTsKLQotWW91ciBtYWxsb2NfZm4oKSBtdXN0IHJldHVybiBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4gIFRoZSBwbmdfbWFsbG9jKCkKLWZ1bmN0aW9uIHdpbGwgbm9ybWFsbHkgY2FsbCBwbmdfZXJyb3IoKSBpZiBpdCByZWNlaXZlcyBhIE5VTEwgZnJvbSB0aGUKLXN5c3RlbSBtZW1vcnkgYWxsb2NhdG9yIG9yIGZyb20geW91ciByZXBsYWNlbWVudCBtYWxsb2NfZm4oKS4KLQotWW91ciBmcmVlX2ZuKCkgd2lsbCBuZXZlciBiZSBjYWxsZWQgd2l0aCBhIE5VTEwgcHRyLCBzaW5jZSBsaWJwbmcncwotcG5nX2ZyZWUoKSBjaGVja3MgZm9yIE5VTEwgYmVmb3JlIGNhbGxpbmcgZnJlZV9mbigpLgotCi1JbnB1dC9PdXRwdXQgaW4gbGlicG5nIGlzIGRvbmUgdGhyb3VnaCBwbmdfcmVhZCgpIGFuZCBwbmdfd3JpdGUoKSwKLXdoaWNoIGN1cnJlbnRseSBqdXN0IGNhbGwgZnJlYWQoKSBhbmQgZndyaXRlKCkuICBUaGUgRklMRSAqIGlzIHN0b3JlZCBpbgotcG5nX3N0cnVjdCBhbmQgaXMgaW5pdGlhbGl6ZWQgdmlhIHBuZ19pbml0X2lvKCkuICBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UKLXRoZSBtZXRob2Qgb2YgSS9PLCB0aGUgbGlicmFyeSBzdXBwbGllcyBjYWxsYmFja3MgdGhhdCB5b3UgY2FuIHNldAotdGhyb3VnaCB0aGUgZnVuY3Rpb24gcG5nX3NldF9yZWFkX2ZuKCkgYW5kIHBuZ19zZXRfd3JpdGVfZm4oKSBhdCBydW4KLXRpbWUsIGluc3RlYWQgb2YgY2FsbGluZyB0aGUgcG5nX2luaXRfaW8oKSBmdW5jdGlvbi4gIFRoZXNlIGZ1bmN0aW9ucwotYWxzbyBwcm92aWRlIGEgdm9pZCBwb2ludGVyIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB2aWEgdGhlIGZ1bmN0aW9uCi1wbmdfZ2V0X2lvX3B0cigpLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICBwbmdfc2V0X3JlYWRfZm4ocG5nX3N0cnVjdHAgcmVhZF9wdHIsCi0gICAgICAgIHZvaWRwIHJlYWRfaW9fcHRyLCBwbmdfcndfcHRyIHJlYWRfZGF0YV9mbikKLQotICAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nX3N0cnVjdHAgd3JpdGVfcHRyLAotICAgICAgICB2b2lkcCB3cml0ZV9pb19wdHIsIHBuZ19yd19wdHIgd3JpdGVfZGF0YV9mbiwKLSAgICAgICAgcG5nX2ZsdXNoX3B0ciBvdXRwdXRfZmx1c2hfZm4pOwotCi0gICAgdm9pZHAgcmVhZF9pb19wdHIgPSBwbmdfZ2V0X2lvX3B0cihyZWFkX3B0cik7Ci0gICAgdm9pZHAgd3JpdGVfaW9fcHRyID0gcG5nX2dldF9pb19wdHIod3JpdGVfcHRyKTsKLQotVGhlIHJlcGxhY2VtZW50IEkvTyBmdW5jdGlvbnMgbXVzdCBoYXZlIHByb3RvdHlwZXMgYXMgZm9sbG93czoKLQotICAgIHZvaWQgdXNlcl9yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKTsKLSAgICB2b2lkIHVzZXJfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOwotICAgIHZvaWQgdXNlcl9mbHVzaF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOwotCi1UaGUgdXNlcl9yZWFkX2RhdGEoKSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZWN0aW5nIGFuZAotaGFuZGxpbmcgZW5kLW9mLWRhdGEgZXJyb3JzLgotCi1TdXBwbHlpbmcgTlVMTCBmb3IgdGhlIHJlYWQsIHdyaXRlLCBvciBmbHVzaCBmdW5jdGlvbnMgc2V0cyB0aGVtIGJhY2sKLXRvIHVzaW5nIHRoZSBkZWZhdWx0IEMgc3RyZWFtIGZ1bmN0aW9ucywgd2hpY2ggZXhwZWN0IHRoZSBpb19wdHIgdG8KLXBvaW50IHRvIGEgc3RhbmRhcmQgKkZJTEUgc3RydWN0dXJlLiAgSXQgaXMgcHJvYmFibHkgYSBtaXN0YWtlCi10byB1c2UgTlVMTCBmb3Igb25lIG9mIHdyaXRlX2RhdGFfZm4gYW5kIG91dHB1dF9mbHVzaF9mbiBidXQgbm90IGJvdGgKLW9mIHRoZW0sIHVubGVzcyB5b3UgaGF2ZSBidWlsdCBsaWJwbmcgd2l0aCBQTkdfTk9fV1JJVEVfRkxVU0ggZGVmaW5lZC4KLUl0IGlzIGFuIGVycm9yIHRvIHJlYWQgZnJvbSBhIHdyaXRlIHN0cmVhbSwgYW5kIHZpY2UgdmVyc2EuCi0KLUVycm9yIGhhbmRsaW5nIGluIGxpYnBuZyBpcyBkb25lIHRocm91Z2ggcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkuCi1FcnJvcnMgaGFuZGxlZCB0aHJvdWdoIHBuZ19lcnJvcigpIGFyZSBmYXRhbCwgbWVhbmluZyB0aGF0IHBuZ19lcnJvcigpCi1zaG91bGQgbmV2ZXIgcmV0dXJuIHRvIGl0cyBjYWxsZXIuICBDdXJyZW50bHksIHRoaXMgaXMgaGFuZGxlZCB2aWEKLXNldGptcCgpIGFuZCBsb25nam1wKCkgKHVubGVzcyB5b3UgaGF2ZSBjb21waWxlZCBsaWJwbmcgd2l0aAotUE5HX1NFVEpNUF9OT1RfU1VQUE9SVEVELCBpbiB3aGljaCBjYXNlIGl0IGlzIGhhbmRsZWQgdmlhIFBOR19BQk9SVCgpKSwKLWJ1dCB5b3UgY291bGQgY2hhbmdlIHRoaXMgdG8gZG8gdGhpbmdzIGxpa2UgZXhpdCgpIGlmIHlvdSBzaG91bGQgd2lzaC4KLQotT24gbm9uLWZhdGFsIGVycm9ycywgcG5nX3dhcm5pbmcoKSBpcyBjYWxsZWQKLXRvIHByaW50IGEgd2FybmluZyBtZXNzYWdlLCBhbmQgdGhlbiBjb250cm9sIHJldHVybnMgdG8gdGhlIGNhbGxpbmcgY29kZS4KLUJ5IGRlZmF1bHQgcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkgcHJpbnQgYSBtZXNzYWdlIG9uIHN0ZGVyciB2aWEKLWZwcmludGYoKSB1bmxlc3MgdGhlIGxpYnJhcnkgaXMgY29tcGlsZWQgd2l0aCBQTkdfTk9fQ09OU09MRV9JTyBkZWZpbmVkCi0oYmVjYXVzZSB5b3UgZG9uJ3Qgd2FudCB0aGUgbWVzc2FnZXMpIG9yIFBOR19OT19TVERJTyBkZWZpbmVkIChiZWNhdXNlCi1mcHJpbnRmKCkgaXNuJ3QgYXZhaWxhYmxlKS4gIElmIHlvdSB3aXNoIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGVycm9yCi1mdW5jdGlvbnMsIHlvdSB3aWxsIG5lZWQgdG8gc2V0IHVwIHlvdXIgb3duIG1lc3NhZ2UgY2FsbGJhY2tzLiAgVGhlc2UKLWZ1bmN0aW9ucyBhcmUgbm9ybWFsbHkgc3VwcGxpZWQgYXQgdGhlIHRpbWUgdGhhdCB0aGUgcG5nX3N0cnVjdCBpcyBjcmVhdGVkLgotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byByZWRpcmVjdCBlcnJvcnMgYW5kIHdhcm5pbmdzIHRvIHlvdXIgb3duIHJlcGxhY2VtZW50Ci1mdW5jdGlvbnMgYWZ0ZXIgcG5nX2NyZWF0ZV8qX3N0cnVjdCgpIGhhcyBiZWVuIGNhbGxlZCBieSBjYWxsaW5nOgotCi0gICAgcG5nX3NldF9lcnJvcl9mbihwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICBwbmdfdm9pZHAgZXJyb3JfcHRyLCBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLAotICAgICAgICBwbmdfZXJyb3JfcHRyIHdhcm5pbmdfZm4pOwotCi0gICAgcG5nX3ZvaWRwIGVycm9yX3B0ciA9IHBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpOwotCi1JZiBOVUxMIGlzIHN1cHBsaWVkIGZvciBlaXRoZXIgZXJyb3JfZm4gb3Igd2FybmluZ19mbiwgdGhlbiB0aGUgbGlicG5nCi1kZWZhdWx0IGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCwgY2FsbGluZyBmcHJpbnRmKCkgYW5kL29yIGxvbmdqbXAoKSBpZiBhCi1wcm9ibGVtIGlzIGVuY291bnRlcmVkLiAgVGhlIHJlcGxhY2VtZW50IGVycm9yIGZ1bmN0aW9ucyBzaG91bGQgaGF2ZQotcGFyYW1ldGVycyBhcyBmb2xsb3dzOgotCi0gICAgdm9pZCB1c2VyX2Vycm9yX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tc2cpOwotICAgIHZvaWQgdXNlcl93YXJuaW5nX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21zZyk7Ci0KLVRoZSBtb3RpdmF0aW9uIGJlaGluZCB1c2luZyBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpIGlzIHRoZSBDKysgdGhyb3cgYW5kCi1jYXRjaCBleGNlcHRpb24gaGFuZGxpbmcgbWV0aG9kcy4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgbXVjaCBlYXNpZXIgdG8gd3JpdGUsCi1hcyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGV2ZXJ5IHJldHVybiBjb2RlIG9mIGV2ZXJ5IGZ1bmN0aW9uIGNhbGwuCi1Ib3dldmVyLCB0aGVyZSBhcmUgc29tZSB1bmNlcnRhaW50aWVzIGFib3V0IHRoZSBzdGF0dXMgb2YgbG9jYWwgdmFyaWFibGVzCi1hZnRlciBhIGxvbmdqbXAsIHNvIHRoZSB1c2VyIG1heSB3YW50IHRvIGJlIGNhcmVmdWwgYWJvdXQgZG9pbmcgYW55dGhpbmcgYWZ0ZXIKLXNldGptcCByZXR1cm5zIG5vbi16ZXJvIGJlc2lkZXMgcmV0dXJuaW5nIGl0c2VsZi4gIENvbnN1bHQgeW91ciBjb21waWxlcgotZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAgRm9yIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoLCB5b3UgbWF5IHdpc2gKLXRvIHVzZSB0aGUgImNleGNlcHQiIGZhY2lsaXR5IChzZWUgaHR0cDovL2NleGNlcHQuc291cmNlZm9yZ2UubmV0KS4KLQotQ3VzdG9tIGNodW5rcwotCi1JZiB5b3UgbmVlZCB0byByZWFkIG9yIHdyaXRlIGN1c3RvbSBjaHVua3MsIHlvdSBtYXkgbmVlZCB0byBnZXQgZGVlcGVyCi1pbnRvIHRoZSBsaWJwbmcgY29kZS4gIFRoZSBsaWJyYXJ5IG5vdyBoYXMgbWVjaGFuaXNtcyBmb3Igc3RvcmluZwotYW5kIHdyaXRpbmcgY2h1bmtzIG9mIHVua25vd24gdHlwZTsgeW91IGNhbiBldmVuIGRlY2xhcmUgY2FsbGJhY2tzCi1mb3IgY3VzdG9tIGNodW5rcy4gIEhvd2V2ZXIsIHRoaXMgbWF5IG5vdCBiZSBnb29kIGVub3VnaCBpZiB0aGUKLWxpYnJhcnkgY29kZSBpdHNlbGYgbmVlZHMgdG8ga25vdyBhYm91dCBpbnRlcmFjdGlvbnMgYmV0d2VlbiB5b3VyCi1jaHVuayBhbmQgZXhpc3RpbmcgYGludHJpbnNpYycgY2h1bmtzLgotCi1JZiB5b3UgbmVlZCB0byB3cml0ZSBhIG5ldyBpbnRyaW5zaWMgY2h1bmssIGZpcnN0IHJlYWQgdGhlIFBORwotc3BlY2lmaWNhdGlvbi4gQWNxdWlyZSBhIGZpcnN0IGxldmVsIG9mCi11bmRlcnN0YW5kaW5nIG9mIGhvdyBpdCB3b3Jrcy4gIFBheSBwYXJ0aWN1bGFyIGF0dGVudGlvbiB0byB0aGUKLXNlY3Rpb25zIHRoYXQgZGVzY3JpYmUgY2h1bmsgbmFtZXMsIGFuZCBsb29rIGF0IGhvdyBvdGhlciBjaHVua3Mgd2VyZQotZGVzaWduZWQsIHNvIHlvdSBjYW4gZG8gdGhpbmdzIHNpbWlsYXJseS4gIFNlY29uZCwgY2hlY2sgb3V0IHRoZQotc2VjdGlvbnMgb2YgbGlicG5nIHRoYXQgcmVhZCBhbmQgd3JpdGUgY2h1bmtzLiAgVHJ5IHRvIGZpbmQgYSBjaHVuawotdGhhdCBpcyBzaW1pbGFyIHRvIHlvdXJzIGFuZCB1c2UgaXQgYXMgYSB0ZW1wbGF0ZS4gIE1vcmUgZGV0YWlscyBjYW4KLWJlIGZvdW5kIGluIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGNvZGUuICBJdCBpcyBiZXN0IHRvIGhhbmRsZSB1bmtub3duCi1jaHVua3MgaW4gYSBnZW5lcmljIG1ldGhvZCwgdmlhIGNhbGxiYWNrIGZ1bmN0aW9ucywgaW5zdGVhZCBvZiBieQotbW9kaWZ5aW5nIGxpYnBuZyBmdW5jdGlvbnMuCi0KLUlmIHlvdSB3aXNoIHRvIHdyaXRlIHlvdXIgb3duIHRyYW5zZm9ybWF0aW9uIGZvciB0aGUgZGF0YSwgbG9vayB0aHJvdWdoCi10aGUgcGFydCBvZiB0aGUgY29kZSB0aGF0IGRvZXMgdGhlIHRyYW5zZm9ybWF0aW9ucywgYW5kIGNoZWNrIG91dCBzb21lIG9mCi10aGUgc2ltcGxlciBvbmVzIHRvIGdldCBhbiBpZGVhIG9mIGhvdyB0aGV5IHdvcmsuICBUcnkgdG8gZmluZCBhIHNpbWlsYXIKLXRyYW5zZm9ybWF0aW9uIHRvIHRoZSBvbmUgeW91IHdhbnQgdG8gYWRkIGFuZCBjb3B5IG9mZiBvZiBpdC4gIE1vcmUgZGV0YWlscwotY2FuIGJlIGZvdW5kIGluIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGNvZGUgaXRzZWxmLgotCi1Db25maWd1cmluZyBmb3IgMTYgYml0IHBsYXRmb3JtcwotCi1Zb3Ugd2lsbCB3YW50IHRvIGxvb2sgaW50byB6Y29uZi5oIHRvIHRlbGwgemxpYiAoYW5kIHRodXMgbGlicG5nKSB0aGF0Ci1pdCBjYW5ub3QgYWxsb2NhdGUgbW9yZSB0aGVuIDY0SyBhdCBhIHRpbWUuICBFdmVuIGlmIHlvdSBjYW4sIHRoZSBtZW1vcnkKLXdvbid0IGJlIGFjY2Vzc2libGUuICBTbyBsaW1pdCB6bGliIGFuZCBsaWJwbmcgdG8gNjRLIGJ5IGRlZmluaW5nIE1BWFNFR182NEsuCi0KLUNvbmZpZ3VyaW5nIGZvciBET1MKLQotRm9yIERPUyB1c2VycyB3aG8gb25seSBoYXZlIGFjY2VzcyB0byB0aGUgbG93ZXIgNjQwSywgeW91IHdpbGwKLWhhdmUgdG8gbGltaXQgemxpYidzIG1lbW9yeSB1c2FnZSB2aWEgYSBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbCgpCi1jYWxsLiAgU2VlIHpsaWIuaCBvciB6Y29uZi5oIGluIHRoZSB6bGliIGxpYnJhcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUNvbmZpZ3VyaW5nIGZvciBNZWRpdW0gTW9kZWwKLQotTGlicG5nJ3Mgc3VwcG9ydCBmb3IgbWVkaXVtIG1vZGVsIGhhcyBiZWVuIHRlc3RlZCBvbiBtb3N0IG9mIHRoZSBwb3B1bGFyCi1jb21waWxlcnMuICBNYWtlIHN1cmUgTUFYU0VHXzY0SyBnZXRzIGRlZmluZWQsIFVTRV9GQVJfS0VZV09SRCBnZXRzCi1kZWZpbmVkLCBhbmQgRkFSIGdldHMgZGVmaW5lZCB0byBmYXIgaW4gcG5nY29uZi5oLCBhbmQgeW91IHNob3VsZCBiZQotYWxsIHNldC4gIEV2ZXJ5dGhpbmcgaW4gdGhlIGxpYnJhcnkgKGV4Y2VwdCBmb3IgemxpYidzIHN0cnVjdHVyZSkgaXMKLWV4cGVjdGluZyBmYXIgZGF0YS4gIFlvdSBtdXN0IHVzZSB0aGUgdHlwZWRlZnMgd2l0aCB0aGUgcCBvciBwcCBvbgotdGhlIGVuZCBmb3IgcG9pbnRlcnMgKG9yIGF0IGxlYXN0IGxvb2sgYXQgdGhlbSBhbmQgYmUgY2FyZWZ1bCkuICBNYWtlCi1ub3RlIHRoYXQgdGhlIHJvd3Mgb2YgZGF0YSBhcmUgZGVmaW5lZCBhcyBwbmdfYnl0ZXBwLCB3aGljaCBpcyBhbgotdW5zaWduZWQgY2hhciBmYXIgKiBmYXIgKi4KLQotQ29uZmlndXJpbmcgZm9yIGd1aS93aW5kb3dpbmcgcGxhdGZvcm1zOgotCi1Zb3Ugd2lsbCBuZWVkIHRvIHdyaXRlIG5ldyBlcnJvciBhbmQgd2FybmluZyBmdW5jdGlvbnMgdGhhdCB1c2UgdGhlIEdVSQotaW50ZXJmYWNlLCBhcyBkZXNjcmliZWQgcHJldmlvdXNseSwgYW5kIHNldCB0aGVtIHRvIGJlIHRoZSBlcnJvciBhbmQKLXdhcm5pbmcgZnVuY3Rpb25zIGF0IHRoZSB0aW1lIHRoYXQgcG5nX2NyZWF0ZV8qX3N0cnVjdCgpIGlzIGNhbGxlZCwKLWluIG9yZGVyIHRvIGhhdmUgdGhlbSBhdmFpbGFibGUgZHVyaW5nIHRoZSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24uCi1UaGV5IGNhbiBiZSBjaGFuZ2VkIGxhdGVyIHZpYSBwbmdfc2V0X2Vycm9yX2ZuKCkuICBPbiBzb21lIGNvbXBpbGVycywKLXlvdSBtYXkgYWxzbyBoYXZlIHRvIGNoYW5nZSB0aGUgbWVtb3J5IGFsbG9jYXRvcnMgKHBuZ19tYWxsb2MsIGV0Yy4pLgotCi1Db25maWd1cmluZyBmb3IgY29tcGlsZXIgeHh4OgotCi1BbGwgaW5jbHVkZXMgZm9yIGxpYnBuZyBhcmUgaW4gcG5nY29uZi5oLiAgSWYgeW91IG5lZWQgdG8gYWRkLCBjaGFuZ2UKLW9yIGRlbGV0ZSBhbiBpbmNsdWRlLCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KLVRoZSBpbmNsdWRlcyB0aGF0IGFyZSBub3QgbmVlZGVkIG91dHNpZGUgbGlicG5nIGFyZSBwcm90ZWN0ZWQgYnkgdGhlCi1QTkdfSU5URVJOQUwgZGVmaW5pdGlvbiwgd2hpY2ggaXMgb25seSBkZWZpbmVkIGZvciB0aG9zZSByb3V0aW5lcyBpbnNpZGUKLWxpYnBuZyBpdHNlbGYuICBUaGUgZmlsZXMgaW4gbGlicG5nIHByb3BlciBvbmx5IGluY2x1ZGUgcG5nLmgsIHdoaWNoCi1pbmNsdWRlcyBwbmdjb25mLmguCi0KLUNvbmZpZ3VyaW5nIHpsaWI6Ci0KLVRoZXJlIGFyZSBzcGVjaWFsIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgdGhlIGNvbXByZXNzaW9uLiAgUGVyaGFwcyB0aGUKLW1vc3QgdXNlZnVsIG9uZSBjaGFuZ2VzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCwgd2hpY2ggY3VycmVudGx5IHVzZXMKLWlucHV0IGNvbXByZXNzaW9uIHZhbHVlcyBpbiB0aGUgcmFuZ2UgMCAtIDkuICBUaGUgbGlicmFyeSBub3JtYWxseQotdXNlcyB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCAoWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gNikuICBUZXN0cwotaGF2ZSBzaG93biB0aGF0IGZvciBhIGxhcmdlIG1ham9yaXR5IG9mIGltYWdlcywgY29tcHJlc3Npb24gdmFsdWVzIGluCi10aGUgcmFuZ2UgMy02IGNvbXByZXNzIG5lYXJseSBhcyB3ZWxsIGFzIGhpZ2hlciBsZXZlbHMsIGFuZCBkbyBzbyBtdWNoCi1mYXN0ZXIuICBGb3Igb25saW5lIGFwcGxpY2F0aW9ucyBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGhhdmUgbWF4aW11bSBzcGVlZAotKFpfQkVTVF9TUEVFRCA9IDEpLiAgV2l0aCB2ZXJzaW9ucyBvZiB6bGliIGFmdGVyIHYwLjk5LCB5b3UgY2FuIGFsc28KLXNwZWNpZnkgbm8gY29tcHJlc3Npb24gKFpfTk9fQ09NUFJFU1NJT04gPSAwKSwgYnV0IHRoaXMgd291bGQgY3JlYXRlCi1maWxlcyBsYXJnZXIgdGhhbiBqdXN0IHN0b3JpbmcgdGhlIHJhdyBiaXRtYXAuICBZb3UgY2FuIHNwZWNpZnkgdGhlCi1jb21wcmVzc2lvbiBsZXZlbCBieSBjYWxsaW5nOgotCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbChwbmdfcHRyLCBsZXZlbCk7Ci0KLUFub3RoZXIgdXNlZnVsIG9uZSBpcyB0byByZWR1Y2UgdGhlIG1lbW9yeSBsZXZlbCB1c2VkIGJ5IHRoZSBsaWJyYXJ5LgotVGhlIG1lbW9yeSBsZXZlbCBkZWZhdWx0cyB0byA4LCBidXQgaXQgY2FuIGJlIGxvd2VyZWQgaWYgeW91IGFyZQotc2hvcnQgb24gbWVtb3J5IChydW5uaW5nIERPUywgZm9yIGV4YW1wbGUsIHdoZXJlIHlvdSBvbmx5IGhhdmUgNjQwSykuCi1Ob3RlIHRoYXQgdGhlIG1lbW9yeSBsZXZlbCBkb2VzIGhhdmUgYW4gZWZmZWN0IG9uIGNvbXByZXNzaW9uOyBhbW9uZwotb3RoZXIgdGhpbmdzLCBsb3dlciBsZXZlbHMgd2lsbCByZXN1bHQgaW4gc2VjdGlvbnMgb2YgaW5jb21wcmVzc2libGUKLWRhdGEgYmVpbmcgZW1pdHRlZCBpbiBzbWFsbGVyIHN0b3JlZCBibG9ja3MsIHdpdGggYSBjb3JyZXNwb25kaW5nbHkKLWxhcmdlciByZWxhdGl2ZSBvdmVyaGVhZCBvZiB1cCB0byAxNSUgaW4gdGhlIHdvcnN0IGNhc2UuCi0KLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbChwbmdfcHRyLCBsZXZlbCk7Ci0KLVRoZSBvdGhlciBmdW5jdGlvbnMgYXJlIGZvciBjb25maWd1cmluZyB6bGliLiAgVGhleSBhcmUgbm90IHJlY29tbWVuZGVkCi1mb3Igbm9ybWFsIHVzZSBhbmQgbWF5IHJlc3VsdCBpbiB3cml0aW5nIGFuIGludmFsaWQgUE5HIGZpbGUuICBTZWUKLXpsaWIuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aGF0IHRoZXNlIG1lYW4uCi0KLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCi0gICAgICAgIHN0cmF0ZWd5KTsKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzKHBuZ19wdHIsCi0gICAgICAgIHdpbmRvd19iaXRzKTsKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZChwbmdfcHRyLCBtZXRob2QpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgc2l6ZSk7Ci0KLUNvbnRyb2xsaW5nIHJvdyBmaWx0ZXJpbmcKLQotSWYgeW91IHdhbnQgdG8gY29udHJvbCB3aGV0aGVyIGxpYnBuZyB1c2VzIGZpbHRlcmluZyBvciBub3QsIHdoaWNoCi1maWx0ZXJzIGFyZSB1c2VkLCBhbmQgaG93IGl0IGdvZXMgYWJvdXQgcGlja2luZyByb3cgZmlsdGVycywgeW91Ci1jYW4gY2FsbCBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLiAgVGhlIHNlbGVjdGlvbiBhbmQgY29uZmlndXJhdGlvbgotb2Ygcm93IGZpbHRlcnMgY2FuIGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIHNpemUgYW5kCi1lbmNvZGluZyBzcGVlZCBhbmQgYSBzb21ld2hhdCBsZXNzZXIgaW1wYWN0IG9uIHRoZSBkZWNvZGluZyBzcGVlZAotb2YgYW4gaW1hZ2UuICBGaWx0ZXJpbmcgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBSR0IgYW5kIGdyYXlzY2FsZQotaW1hZ2VzICh3aXRoIGFuZCB3aXRob3V0IGFscGhhKSwgYnV0IG5vdCBmb3IgcGFsZXR0ZWQgaW1hZ2VzIG5vcgotZm9yIGFueSBpbWFnZXMgd2l0aCBiaXQgZGVwdGhzIGxlc3MgdGhhbiA4IGJpdHMvcGl4ZWwuCi0KLVRoZSAnbWV0aG9kJyBwYXJhbWV0ZXIgc2V0cyB0aGUgbWFpbiBmaWx0ZXJpbmcgbWV0aG9kLCB3aGljaCBpcwotY3VycmVudGx5IG9ubHkgJzAnIGluIHRoZSBQTkcgMS4yIHNwZWNpZmljYXRpb24uICBUaGUgJ2ZpbHRlcnMnCi1wYXJhbWV0ZXIgc2V0cyB3aGljaCBmaWx0ZXIocyksIGlmIGFueSwgc2hvdWxkIGJlIHVzZWQgZm9yIGVhY2gKLXNjYW5saW5lLiAgUG9zc2libGUgdmFsdWVzIGFyZSBQTkdfQUxMX0ZJTFRFUlMgYW5kIFBOR19OT19GSUxURVJTCi10byB0dXJuIGZpbHRlcmluZyBvbiBhbmQgb2ZmLCByZXNwZWN0aXZlbHkuCi0KLUluZGl2aWR1YWwgZmlsdGVyIHR5cGVzIGFyZSBQTkdfRklMVEVSX05PTkUsIFBOR19GSUxURVJfU1VCLAotUE5HX0ZJTFRFUl9VUCwgUE5HX0ZJTFRFUl9BVkcsIFBOR19GSUxURVJfUEFFVEgsIHdoaWNoIGNhbiBiZSBiaXR3aXNlCi1PUmVkIHRvZ2V0aGVyIHdpdGggJ3wnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsdGVycyB0byB1c2UuCi1UaGVzZSBmaWx0ZXJzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLgotSWYgeW91IGludGVuZCB0byBjaGFuZ2UgdGhlIGZpbHRlciB0eXBlIGR1cmluZyB0aGUgY291cnNlIG9mIHdyaXRpbmcKLXRoZSBpbWFnZSwgeW91IHNob3VsZCBzdGFydCB3aXRoIGZsYWdzIHNldCBmb3IgYWxsIG9mIHRoZSBmaWx0ZXJzCi15b3UgaW50ZW5kIHRvIHVzZSBzbyB0aGF0IGxpYnBuZyBjYW4gaW5pdGlhbGl6ZSBpdHMgaW50ZXJuYWwKLXN0cnVjdHVyZXMgYXBwcm9wcmlhdGVseSBmb3IgYWxsIG9mIHRoZSBmaWx0ZXIgdHlwZXMuICAoTm90ZSB0aGF0IHRoaXMKLW1lYW5zIHRoZSBmaXJzdCByb3cgbXVzdCBhbHdheXMgYmUgYWRhcHRpdmVseSBmaWx0ZXJlZCwgYmVjYXVzZSBsaWJwbmcKLWN1cnJlbnRseSBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgZmlsdGVyIGJ1ZmZlcnMgdW50aWwgcG5nX3dyaXRlX3JvdygpCi1pcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLikKLQotICAgIGZpbHRlcnMgPSBQTkdfRklMVEVSX05PTkUgfCBQTkdfRklMVEVSX1NVQgotICAgICAgICAgICAgICBQTkdfRklMVEVSX1VQIHwgUE5HX0ZJTFRFUl9BVkcgfAotICAgICAgICAgICAgICBQTkdfRklMVEVSX1BBRVRIIHwgUE5HX0FMTF9GSUxURVJTOwotCi0gICAgcG5nX3NldF9maWx0ZXIocG5nX3B0ciwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UsCi0gICAgICAgZmlsdGVycyk7Ci0gICAgICAgICAgICAgIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGNhbiBhbHNvIGJlCi0gICAgICAgICAgICAgIFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORyBpZiB5b3UgYXJlCi0gICAgICAgICAgICAgIHdyaXRpbmcgYSBQTkcgdG8gYmUgZW1iZWRkZWQgaW4gYSBNTkcKLSAgICAgICAgICAgICAgZGF0YXN0cmVhbS4gIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgdGhlCi0gICAgICAgICAgICAgIHNhbWUgYXMgdGhlIHZhbHVlIG9mIGZpbHRlcl9tZXRob2QgdXNlZAotICAgICAgICAgICAgICBpbiBwbmdfc2V0X0lIRFIoKS4KLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmZsdWVuY2UgaG93IGxpYnBuZyBjaG9vc2VzIGZyb20gYW1vbmcgdGhlCi1hdmFpbGFibGUgZmlsdGVycy4gIFRoaXMgaXMgZG9uZSBpbiBvbmUgb3IgYm90aCBvZiB0d28gd2F5cyAtIGJ5Ci10ZWxsaW5nIGl0IGhvdyBpbXBvcnRhbnQgaXQgaXMgdG8ga2VlcCB0aGUgc2FtZSBmaWx0ZXIgZm9yIHN1Y2Nlc3NpdmUKLXJvd3MsIGFuZCBieSB0ZWxsaW5nIGl0IHRoZSByZWxhdGl2ZSBjb21wdXRhdGlvbmFsIGNvc3RzIG9mIHRoZSBmaWx0ZXJzLgotCi0gICAgZG91YmxlIHdlaWdodHNbM10gPSB7MS41LCAxLjMsIDEuMX0sCi0gICAgICAgY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9MQVNUXSA9Ci0gICAgICAgezEuMCwgMS4zLCAxLjMsIDEuNSwgMS43fTsKLQotICAgIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MocG5nX3B0ciwKLSAgICAgICBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCwgMywKLSAgICAgICB3ZWlnaHRzLCBjb3N0cyk7Ci0KLVRoZSB3ZWlnaHRzIGFyZSBtdWx0aXBseWluZyBmYWN0b3JzIHRoYXQgaW5kaWNhdGUgdG8gbGlicG5nIHRoYXQgdGhlCi1yb3cgZmlsdGVyIHNob3VsZCBiZSB0aGUgc2FtZSBmb3Igc3VjY2Vzc2l2ZSByb3dzIHVubGVzcyBhbm90aGVyIHJvdyBmaWx0ZXIKLWlzIHRoYXQgbWFueSB0aW1lcyBiZXR0ZXIgdGhhbiB0aGUgcHJldmlvdXMgZmlsdGVyLiAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsCi1pZiB0aGUgcHJldmlvdXMgMyBmaWx0ZXJzIHdlcmUgU1VCLCBTVUIsIE5PTkUsIHRoZSBTVUIgZmlsdGVyIGNvdWxkIGhhdmUgYQotInN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcyIgMS41IHggMS4zIHRpbWVzIGhpZ2hlciB0aGFuIG90aGVyIGZpbHRlcnMKLWFuZCBzdGlsbCBiZSBjaG9zZW4sIHdoaWxlIHRoZSBOT05FIGZpbHRlciBjb3VsZCBoYXZlIGEgc3VtIDEuMSB0aW1lcwotaGlnaGVyIHRoYW4gb3RoZXIgZmlsdGVycyBhbmQgc3RpbGwgYmUgY2hvc2VuLiAgVW5zcGVjaWZpZWQgd2VpZ2h0cyBhcmUKLXRha2VuIHRvIGJlIDEuMCwgYW5kIHRoZSBzcGVjaWZpZWQgd2VpZ2h0cyBzaG91bGQgcHJvYmFibHkgYmUgZGVjbGluaW5nCi1saWtlIHRob3NlIGFib3ZlIGluIG9yZGVyIHRvIGVtcGhhc2l6ZSByZWNlbnQgZmlsdGVycyBvdmVyIG9sZGVyIGZpbHRlcnMuCi0KLVRoZSBmaWx0ZXIgY29zdHMgc3BlY2lmeSBmb3IgZWFjaCBmaWx0ZXIgdHlwZSBhIHJlbGF0aXZlIGRlY29kaW5nIGNvc3QKLXRvIGJlIGNvbnNpZGVyZWQgd2hlbiBzZWxlY3Rpbmcgcm93IGZpbHRlcnMuICBUaGlzIG1lYW5zIHRoYXQgZmlsdGVycwotd2l0aCBoaWdoZXIgY29zdHMgYXJlIGxlc3MgbGlrZWx5IHRvIGJlIGNob3NlbiBvdmVyIGZpbHRlcnMgd2l0aCBsb3dlcgotY29zdHMsIHVubGVzcyB0aGVpciAic3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIiBpcyB0aGF0IG11Y2ggc21hbGxlci4KLVRoZSBjb3N0cyBkbyBub3QgbmVjZXNzYXJpbHkgcmVmbGVjdCB0aGUgZXhhY3QgY29tcHV0YXRpb25hbCBzcGVlZHMgb2YKLXRoZSB2YXJpb3VzIGZpbHRlcnMsIHNpbmNlIHRoaXMgd291bGQgdW5kdWx5IGluZmx1ZW5jZSB0aGUgZmluYWwgaW1hZ2UKLXNpemUuCi0KLU5vdGUgdGhhdCB0aGUgbnVtYmVycyBhYm92ZSB3ZXJlIGludmVudGVkIHB1cmVseSBmb3IgdGhpcyBleGFtcGxlIGFuZAotYXJlIGdpdmVuIG9ubHkgdG8gaGVscCBleHBsYWluIHRoZSBmdW5jdGlvbiB1c2FnZS4gIExpdHRsZSB0ZXN0aW5nIGhhcwotYmVlbiBkb25lIHRvIGZpbmQgb3B0aW11bSB2YWx1ZXMgZm9yIGVpdGhlciB0aGUgY29zdHMgb3IgdGhlIHdlaWdodHMuCi0KLVJlbW92aW5nIHVud2FudGVkIG9iamVjdCBjb2RlCi0KLVRoZXJlIGFyZSBhIGJ1bmNoIG9mICNkZWZpbmUncyBpbiBwbmdjb25mLmggdGhhdCBjb250cm9sIHdoYXQgcGFydHMgb2YKLWxpYnBuZyBhcmUgY29tcGlsZWQuICBBbGwgdGhlIGRlZmluZXMgZW5kIGluIF9TVVBQT1JURUQuICBJZiB5b3UgYXJlCi1uZXZlciBnb2luZyB0byB1c2UgYSBjYXBhYmlsaXR5LCB5b3UgY2FuIGNoYW5nZSB0aGUgI2RlZmluZSB0byAjdW5kZWYKLWJlZm9yZSByZWNvbXBpbGluZyBsaWJwbmcgYW5kIHNhdmUgeW91cnNlbGYgY29kZSBhbmQgZGF0YSBzcGFjZSwgb3IKLXlvdSBjYW4gdHVybiBvZmYgaW5kaXZpZHVhbCBjYXBhYmlsaXRpZXMgd2l0aCBkZWZpbmVzIHRoYXQgYmVnaW4gd2l0aAotUE5HX05PXy4KLQotWW91IGNhbiBhbHNvIHR1cm4gYWxsIG9mIHRoZSB0cmFuc2Zvcm1zIGFuZCBhbmNpbGxhcnkgY2h1bmsgY2FwYWJpbGl0aWVzCi1vZmYgZW4gbWFzc2Ugd2l0aCBjb21waWxlciBkaXJlY3RpdmVzIHRoYXQgZGVmaW5lCi1QTkdfTk9fUkVBRFtvciBXUklURV1fVFJBTlNGT1JNUywgb3IgUE5HX05PX1JFQURbb3IgV1JJVEVdX0FOQ0lMTEFSWV9DSFVOS1MsCi1vciBhbGwgZm91ciwKLWFsb25nIHdpdGggZGlyZWN0aXZlcyB0byB0dXJuIG9uIGFueSBvZiB0aGUgY2FwYWJpbGl0aWVzIHRoYXQgeW91IGRvCi13YW50LiAgVGhlIFBOR19OT19SRUFEW29yIFdSSVRFXV9UUkFOU0ZPUk1TIGRpcmVjdGl2ZXMgZGlzYWJsZQotdGhlIGV4dHJhIHRyYW5zZm9ybWF0aW9ucyBidXQgc3RpbGwgbGVhdmUgdGhlIGxpYnJhcnkgZnVsbHkgY2FwYWJsZSBvZiByZWFkaW5nCi1hbmQgd3JpdGluZyBQTkcgZmlsZXMgd2l0aCBhbGwga25vd24gcHVibGljIGNodW5rcwotVXNlIG9mIHRoZSBQTkdfTk9fUkVBRFtvciBXUklURV1fQU5DSUxMQVJZX0NIVU5LUyBkaXJlY3RpdmUKLXByb2R1Y2VzIGEgbGlicmFyeSB0aGF0IGlzIGluY2FwYWJsZSBvZiByZWFkaW5nIG9yIHdyaXRpbmcgYW5jaWxsYXJ5IGNodW5rcy4KLUlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBwcm9ncmVzc2l2ZSByZWFkaW5nIGNhcGFiaWxpdHksIHlvdSBjYW4KLXR1cm4gdGhhdCBvZmYgd2l0aCBQTkdfTk9fUFJPR1JFU1NJVkVfUkVBRCAoZG9uJ3QgY29uZnVzZQotdGhpcyB3aXRoIHRoZSBJTlRFUkxBQ0lORyBjYXBhYmlsaXR5LCB3aGljaCB5b3UnbGwgc3RpbGwgaGF2ZSkuCi0KLUFsbCB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBzcGVjaWZpYyBjb2RlIGFyZSBpbiBzZXBhcmF0ZSBmaWxlcywgc28gdGhlCi1saW5rZXIgc2hvdWxkIG9ubHkgZ3JhYiB0aGUgZmlsZXMgaXQgbmVlZHMuICBIb3dldmVyLCBpZiB5b3Ugd2FudCB0bwotbWFrZSBzdXJlLCBvciBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgc3RhbmQgYWxvbmUgbGlicmFyeSwgYWxsIHRoZQotcmVhZGluZyBmaWxlcyBzdGFydCB3aXRoIHBuZ3IgYW5kIGFsbCB0aGUgd3JpdGluZyBmaWxlcyBzdGFydCB3aXRoCi1wbmd3LiAgVGhlIGZpbGVzIHRoYXQgZG9uJ3QgbWF0Y2ggZWl0aGVyIChsaWtlIHBuZy5jLCBwbmd0cmFucy5jLCBldGMuKQotYXJlIHVzZWQgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZywgYW5kIGFsd2F5cyBuZWVkIHRvIGJlIGluY2x1ZGVkLgotVGhlIHByb2dyZXNzaXZlIHJlYWRlciBpcyBpbiBwbmdwcmVhZC5jCi0KLUlmIHlvdSBhcmUgY3JlYXRpbmcgb3IgZGlzdHJpYnV0aW5nIGEgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcnkgKGEgLnNvCi1vciBETEwgZmlsZSksIHlvdSBzaG91bGQgbm90IHJlbW92ZSBvciBkaXNhYmxlIGFueSBwYXJ0cyBvZiB0aGUgbGlicmFyeSwKLWFzIHRoaXMgd2lsbCBjYXVzZSBhcHBsaWNhdGlvbnMgbGlua2VkIHdpdGggZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZQotbGlicmFyeSB0byBmYWlsIGlmIHRoZXkgY2FsbCBmdW5jdGlvbnMgbm90IGF2YWlsYWJsZSBpbiB5b3VyIGxpYnJhcnkuCi1UaGUgc2l6ZSBvZiB0aGUgbGlicmFyeSBpdHNlbGYgc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZSwgYmVjYXVzZSBvbmx5Ci10aG9zZSBzZWN0aW9ucyB0aGF0IGFyZSBhY3R1YWxseSB1c2VkIHdpbGwgYmUgbG9hZGVkIGludG8gbWVtb3J5LgotCi1SZXF1ZXN0aW5nIGRlYnVnIHByaW50b3V0Ci0KLVRoZSBtYWNybyBkZWZpbml0aW9uIFBOR19ERUJVRyBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGRlYnVnZ2luZwotcHJpbnRvdXQuICBTZXQgaXQgdG8gYW4gaW50ZWdlciB2YWx1ZSBpbiB0aGUgcmFuZ2UgMCB0byAzLiAgSGlnaGVyCi1udW1iZXJzIHJlc3VsdCBpbiBpbmNyZWFzaW5nIGFtb3VudHMgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhlCi1pbmZvcm1hdGlvbiBpcyBwcmludGVkIHRvIHRoZSAic3RkZXJyIiBmaWxlLCB1bmxlc3MgYW5vdGhlciBmaWxlCi1uYW1lIGlzIHNwZWNpZmllZCBpbiB0aGUgUE5HX0RFQlVHX0ZJTEUgbWFjcm8gZGVmaW5pdGlvbi4KLQotV2hlbiBQTkdfREVCVUcgPiAwLCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyAobWFjcm9zKSBiZWNvbWUgYXZhaWxhYmxlOgotCi0gICBwbmdfZGVidWcobGV2ZWwsIG1lc3NhZ2UpCi0gICBwbmdfZGVidWcxKGxldmVsLCBtZXNzYWdlLCBwMSkKLSAgIHBuZ19kZWJ1ZzIobGV2ZWwsIG1lc3NhZ2UsIHAxLCBwMikKLQotaW4gd2hpY2ggImxldmVsIiBpcyBjb21wYXJlZCB0byBQTkdfREVCVUcgdG8gZGVjaWRlIHdoZXRoZXIgdG8gcHJpbnQKLXRoZSBtZXNzYWdlLCAibWVzc2FnZSIgaXMgdGhlIGZvcm1hdHRlZCBzdHJpbmcgdG8gYmUgcHJpbnRlZCwKLWFuZCBwMSBhbmQgcDIgYXJlIHBhcmFtZXRlcnMgdGhhdCBhcmUgdG8gYmUgZW1iZWRkZWQgaW4gdGhlIHN0cmluZwotYWNjb3JkaW5nIHRvIHByaW50Zi1zdHlsZSBmb3JtYXR0aW5nIGRpcmVjdGl2ZXMuICBGb3IgZXhhbXBsZSwKLQotICAgcG5nX2RlYnVnMSgyLCAiZm9vPSVkXG4iLCBmb28pOwotCi1pcyBleHBhbmRlZCB0bwotCi0gICBpZihQTkdfREVCVUcgPiAyKQotICAgICBmcHJpbnRmKFBOR19ERUJVR19GSUxFLCAiZm9vPSVkXG4iLCBmb28pOwotCi1XaGVuIFBOR19ERUJVRyBpcyBkZWZpbmVkIGJ1dCBpcyB6ZXJvLCB0aGUgbWFjcm9zIGFyZW4ndCBkZWZpbmVkLCBidXQgeW91Ci1jYW4gc3RpbGwgdXNlIFBOR19ERUJVRyB0byBjb250cm9sIHlvdXIgb3duIGRlYnVnZ2luZzoKLQotICAgI2lmZGVmIFBOR19ERUJVRwotICAgICAgIGZwcmludGYoc3RkZXJyLCAuLi4KLSAgICNlbmRpZgotCi1XaGVuIFBOR19ERUJVRyA9IDEsIHRoZSBtYWNyb3MgYXJlIGRlZmluZWQsIGJ1dCBvbmx5IHBuZ19kZWJ1ZyBzdGF0ZW1lbnRzCi1oYXZpbmcgbGV2ZWwgPSAwIHdpbGwgYmUgcHJpbnRlZC4gIFRoZXJlIGFyZW4ndCBhbnkgc3VjaCBzdGF0ZW1lbnRzIGluCi10aGlzIHZlcnNpb24gb2YgbGlicG5nLCBidXQgaWYgeW91IGluc2VydCBzb21lIHRoZXkgd2lsbCBiZSBwcmludGVkLgotCi1WSS4gIE1ORyBzdXBwb3J0Ci0KLVRoZSBNTkcgc3BlY2lmaWNhdGlvbiAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvbW5nKSBhbGxvd3MKLWNlcnRhaW4gZXh0ZW5zaW9ucyB0byBQTkcgZm9yIFBORyBpbWFnZXMgdGhhdCBhcmUgZW1iZWRkZWQgaW4gTU5HIGRhdGFzdHJlYW1zLgotTGlicG5nIGNhbiBzdXBwb3J0IHNvbWUgb2YgdGhlc2UgZXh0ZW5zaW9ucy4gIFRvIGVuYWJsZSB0aGVtLCB1c2UgdGhlCi1wbmdfcGVybWl0X21uZ19mZWF0dXJlcygpIGZ1bmN0aW9uOgotCi0gICBmZWF0dXJlX3NldCA9IHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKHBuZ19wdHIsIG1hc2spCi0gICBtYXNrIGlzIGEgcG5nX3VpbnRfMzIgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiB0aGUKLSAgICAgICAgZmVhdHVyZXMgeW91IHdhbnQgdG8gZW5hYmxlLiAgVGhlc2UgaW5jbHVkZQotICAgICAgICBQTkdfRkxBR19NTkdfRU1QVFlfUExURQotICAgICAgICBQTkdfRkxBR19NTkdfRklMVEVSXzY0Ci0gICAgICAgIFBOR19BTExfTU5HX0ZFQVRVUkVTCi0gICBmZWF0dXJlX3NldCBpcyBhIHBuZ191aW50XzMyIHRoYXQgaXMgdGhlIGJpdHdpc2UgQU5EIG9mCi0gICAgICB5b3VyIG1hc2sgd2l0aCB0aGUgc2V0IG9mIE1ORyBmZWF0dXJlcyB0aGF0IGlzCi0gICAgICBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgbGlicG5nIHRoYXQgeW91IGFyZSB1c2luZy4KLQotSXQgaXMgYW4gZXJyb3IgdG8gdXNlIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgYSBzdGFuZGFsb25lCi1QTkcgZmlsZSB3aXRoIHRoZSBQTkcgOC1ieXRlIHNpZ25hdHVyZS4gIFRoZSBQTkcgZGF0YXN0cmVhbSBtdXN0IGJlIHdyYXBwZWQKLWluIGEgTU5HIGRhdGFzdHJlYW0uICBBcyBhIG1pbmltdW0sIGl0IG11c3QgaGF2ZSB0aGUgTU5HIDgtYnl0ZSBzaWduYXR1cmUKLWFuZCB0aGUgTUhEUiBhbmQgTUVORCBjaHVua3MuICBMaWJwbmcgZG9lcyBub3QgcHJvdmlkZSBzdXBwb3J0IGZvciB0aGVzZQotb3IgYW55IG90aGVyIE1ORyBjaHVua3M7IHlvdXIgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIGl0cyBvd24gc3VwcG9ydCBmb3IKLXRoZW0uICBZb3UgbWF5IHdpc2ggdG8gY29uc2lkZXIgdXNpbmcgbGlibW5nIChhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cubGlibW5nLmNvbSkgaW5zdGVhZC4KLQotVklJLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDAuODgKLQotSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdmVyc2lvbnMgb2YgbGlicG5nIGxhdGVyIHRoYW4gMC45NiBhcmUgbm90Ci1kaXN0cmlidXRlZCBieSB0aGUgb3JpZ2luYWwgbGlicG5nIGF1dGhvciwgR3V5IFNjaGFsbmF0LCBub3IgYnkKLUFuZHJlYXMgRGlsZ2VyLCB3aG8gaGFkIHRha2VuIG92ZXIgZnJvbSBHdXkgZHVyaW5nIDE5OTYgYW5kIDE5OTcsIGFuZAotZGlzdHJpYnV0ZWQgdmVyc2lvbnMgMC44OSB0aHJvdWdoIDAuOTYsIGJ1dCByYXRoZXIgYnkgYW5vdGhlciBtZW1iZXIKLW9mIHRoZSBvcmlnaW5hbCBQTkcgR3JvdXAsIEdsZW5uIFJhbmRlcnMtUGVocnNvbi4gIEd1eSBhbmQgQW5kcmVhcyBhcmUKLXN0aWxsIGFsaXZlIGFuZCB3ZWxsLCBidXQgdGhleSBoYXZlIG1vdmVkIG9uIHRvIG90aGVyIHRoaW5ncy4KLQotVGhlIG9sZCBsaWJwbmcgZnVuY3Rpb25zIHBuZ19yZWFkX2luaXQoKSwgcG5nX3dyaXRlX2luaXQoKSwKLXBuZ19pbmZvX2luaXQoKSwgcG5nX3JlYWRfZGVzdHJveSgpLCBhbmQgcG5nX3dyaXRlX2Rlc3Ryb3koKSBoYXZlIGJlZW4KLW1vdmVkIHRvIFBOR19JTlRFUk5BTCBpbiB2ZXJzaW9uIDAuOTUgdG8gZGlzY291cmFnZSB0aGVpciB1c2UuICBUaGVzZQotZnVuY3Rpb25zIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZyB2ZXJzaW9uIDIuMC4wLgotCi1UaGUgcHJlZmVycmVkIG1ldGhvZCBvZiBjcmVhdGluZyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBsaWJwbmcgc3RydWN0dXJlcyBpcwotdmlhIHRoZSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCksIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCksIGFuZAotcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCgpIGJlY2F1c2UgdGhleSBpc29sYXRlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmVzCi1mcm9tIHRoZSBhcHBsaWNhdGlvbiwgYWxsb3cgdmVyc2lvbiBlcnJvciBjaGVja2luZywgYW5kIGFsc28gYWxsb3cgdGhlCi11c2Ugb2YgY3VzdG9tIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24sIHdoaWNoCi10aGUgb2xkIGZ1bmN0aW9ucyBkbyBub3QuICBUaGUgZnVuY3Rpb25zIHBuZ19yZWFkX2Rlc3Ryb3koKSBhbmQKLXBuZ193cml0ZV9kZXN0cm95KCkgZG8gbm90IGFjdHVhbGx5IGZyZWUgdGhlIG1lbW9yeSB0aGF0IGxpYnBuZwotYWxsb2NhdGVkIGZvciB0aGVzZSBzdHJ1Y3RzLCBidXQganVzdCByZXNldCB0aGUgZGF0YSBzdHJ1Y3R1cmVzLCBzbyB0aGV5Ci1jYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCkgYW5kCi1wbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSBpZiB5b3UgZmVlbCB0aGVyZSBpcyB0b28gbXVjaCBzeXN0ZW0gb3ZlcmhlYWQKLWFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgdGhlIHBuZ19zdHJ1Y3QgZm9yIGVhY2ggaW1hZ2UgcmVhZC4KLQotU2V0dGluZyB0aGUgZXJyb3IgY2FsbGJhY2tzIHZpYSBwbmdfc2V0X21lc3NhZ2VfZm4oKSBiZWZvcmUKLXBuZ19yZWFkX2luaXQoKSBhcyB3YXMgc3VnZ2VzdGVkIGluIGxpYnBuZy0wLjg4IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQKLWJlY2F1c2UgdGhpcyBjYXVzZWQgYXBwbGljYXRpb25zIHRoYXQgZG8gbm90IHVzZSBjdXN0b20gZXJyb3IgZnVuY3Rpb25zCi10byBmYWlsIGlmIHRoZSBwbmdfcHRyIHdhcyBub3QgaW5pdGlhbGl6ZWQgdG8gemVyby4gIEl0IGlzIHN0aWxsIHBvc3NpYmxlCi10byBzZXQgdGhlIGVycm9yIGNhbGxiYWNrcyBBRlRFUiBwbmdfcmVhZF9pbml0KCksIG9yIHRvIGNoYW5nZSB0aGVtIHdpdGgKLXBuZ19zZXRfZXJyb3JfZm4oKSwgd2hpY2ggaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgZnVuY3Rpb24sIGJ1dCB3aXRoIGEgbmV3Ci1uYW1lIHRvIGZvcmNlIGNvbXBpbGF0aW9uIGVycm9ycyB3aXRoIGFwcGxpY2F0aW9ucyB0aGF0IHRyeSB0byB1c2UgdGhlIG9sZAotbWV0aG9kLgotCi1TdGFydGluZyB3aXRoIHZlcnNpb24gMS4wLjcsIHlvdSBjYW4gZmluZCBvdXQgd2hpY2ggdmVyc2lvbiBvZiB0aGUgbGlicmFyeQoteW91IGFyZSB1c2luZyBhdCBydW4tdGltZToKLQotICAgcG5nX3VpbnRfMzIgbGlicG5nX3ZuID0gcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcigpOwotCi1UaGUgbnVtYmVyIGxpYnBuZ192biBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBtYWpvciB2ZXJzaW9uLCBtaW5vcgotdmVyc2lvbiB3aXRoIGxlYWRpbmcgemVybywgYW5kIHJlbGVhc2UgbnVtYmVyIHdpdGggbGVhZGluZyB6ZXJvLAotKGUuZy4sIGxpYnBuZ192biBmb3IgdmVyc2lvbiAxLjAuNyBpcyAxMDAwNykuCi0KLVlvdSBjYW4gYWxzbyBjaGVjayB3aGljaCB2ZXJzaW9uIG9mIHBuZy5oIHlvdSB1c2VkIHdoZW4gY29tcGlsaW5nIHlvdXIKLWFwcGxpY2F0aW9uOgotCi0gICBwbmdfdWludF8zMiBhcHBsaWNhdGlvbl92biA9IFBOR19MSUJQTkdfVkVSOwotCi1WSUlJLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDEuMC54IHRvIDEuMi54Ci0KLVN1cHBvcnQgZm9yIHVzZXIgbWVtb3J5IG1hbmFnZW1lbnQgd2FzIGVuYWJsZWQgYnkgZGVmYXVsdC4gIFRvCi1hY2NvbXBsaXNoIHRoaXMsIHRoZSBmdW5jdGlvbnMgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCksCi1wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKCksIHBuZ19zZXRfbWVtX2ZuKCksIHBuZ19nZXRfbWVtX3B0cigpLAotcG5nX21hbGxvY19kZWZhdWx0KCksIGFuZCBwbmdfZnJlZV9kZWZhdWx0KCkgd2VyZSBhZGRlZC4KLQotU3VwcG9ydCBmb3IgY2VydGFpbiBNTkcgZmVhdHVyZXMgd2FzIGVuYWJsZWQuCi0KLVN1cHBvcnQgZm9yIG51bWJlcmVkIGVycm9yIG1lc3NhZ2VzIHdhcyBhZGRlZC4gIEhvd2V2ZXIsIHdlIG5ldmVyIGdvdAotYXJvdW5kIHRvIGFjdHVhbGx5IG51bWJlcmluZyB0aGUgZXJyb3IgbWVzc2FnZXMuICBUaGUgZnVuY3Rpb24KLXBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycygpIHdhcyBhZGRlZCAoTm90ZTogdGhlIHByb3RvdHlwZSBmb3IgdGhpcwotZnVuY3Rpb24gd2FzIGluYWR2ZXJ0ZW50bHkgcmVtb3ZlZCBmcm9tIHBuZy5oIGluIFBOR19OT19BU1NFTUJMRVJfQ09ERQotYnVpbGRzIG9mIGxpYnBuZy0xLjIuMTUuICBJdCB3YXMgcmVzdG9yZWQgaW4gbGlicG5nLTEuMi4zNikuCi0KLVRoZSBwbmdfbWFsbG9jX3dhcm4oKSBmdW5jdGlvbiB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMi4zLiAgVGhpcyBpc3N1ZXMKLWEgcG5nX3dhcm5pbmcgYW5kIHJldHVybnMgTlVMTCBpbnN0ZWFkIG9mIGFib3J0aW5nIHdoZW4gaXQgZmFpbHMgdG8KLWFjcXVpcmUgdGhlIHJlcXVlc3RlZCBtZW1vcnkgYWxsb2NhdGlvbi4KLQotU3VwcG9ydCBmb3Igc2V0dGluZyB1c2VyIGxpbWl0cyBvbiBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0IHdhcyBlbmFibGVkCi1ieSBkZWZhdWx0LiAgVGhlIGZ1bmN0aW9ucyBwbmdfc2V0X3VzZXJfbGltaXRzKCksIHBuZ19nZXRfdXNlcl93aWR0aF9tYXgoKSwKLWFuZCBwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heCgpIHdlcmUgYWRkZWQgYXQgbGlicG5nLTEuMi42LgotCi1UaGUgcG5nX3NldF9hZGRfYWxwaGEoKSBmdW5jdGlvbiB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMi43LgotCi1UaGUgZnVuY3Rpb24gcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjIuOS4KLVVubGlrZSBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpLCB0aGUgbmV3IGZ1bmN0aW9uIGRvZXMgbm90IGV4cGFuZCB0aGUKLXRSTlMgY2h1bmsgdG8gYWxwaGEuIFRoZSBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIGZ1bmN0aW9uIGlzCi1kZXByZWNhdGVkLgotCi1BIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucyBpbiBzdXBwb3J0IG9mIHJ1bnRpbWUgc2VsZWN0aW9uIG9mCi1hc3NlbWJsZXIgY29kZSBmZWF0dXJlcyAoZXNwZWNpYWxseSBJbnRlbCBNTVggY29kZSBzdXBwb3J0KSB3ZXJlCi1hZGRlZCBhdCBsaWJwbmctMS4yLjA6Ci0KLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1NVUFBPUlRfQ09NUElMRUQKLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1NVUFBPUlRfSU5fQ1BVCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0NPTUJJTkVfUk9XCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0lOVEVSTEFDRQotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfU1VCCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9VUAotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfQVZHCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9QQUVUSAotICAgIFBOR19BU01fRkxBR1NfSU5JVElBTElaRUQKLSAgICBQTkdfTU1YX1JFQURfRkxBR1MKLSAgICBQTkdfTU1YX0ZMQUdTCi0gICAgUE5HX01NWF9XUklURV9GTEFHUwotICAgIFBOR19NTVhfRkxBR1MKLQotV2UgYWRkZWQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaW4gc3VwcG9ydCBvZiBydW50aW1lCi1zZWxlY3Rpb24gb2YgYXNzZW1ibGVyIGNvZGUgZmVhdHVyZXM6Ci0KLSAgICBwbmdfZ2V0X21teF9mbGFnbWFzaygpCi0gICAgcG5nX3NldF9tbXhfdGhyZXNob2xkcygpCi0gICAgcG5nX2dldF9hc21fZmxhZ3MoKQotICAgIHBuZ19nZXRfbW14X2JpdGRlcHRoX3RocmVzaG9sZCgpCi0gICAgcG5nX2dldF9tbXhfcm93Ynl0ZXNfdGhyZXNob2xkKCkKLSAgICBwbmdfc2V0X2FzbV9mbGFncygpCi0KLVdlIHJlcGxhY2VkIGFsbCBvZiB0aGVzZSBmdW5jdGlvbnMgd2l0aCBzaW1wbGUgc3R1YnMgaW4gbGlicG5nLTEuMi4yMCwKLXdoZW4gdGhlIEludGVsIGFzc2VtYmxlciBjb2RlIHdhcyByZW1vdmVkIGR1ZSB0byBhIGxpY2Vuc2luZyBpc3N1ZS4KLQotSVguICAoT21pdHRlZCkKLQotWC4gRGV0ZWN0aW5nIGxpYnBuZwotCi1UaGUgcG5nX2dldF9pb19wdHIoKSBmdW5jdGlvbiBoYXMgYmVlbiBwcmVzZW50IHNpbmNlIGxpYnBuZy0wLjg4LCBoYXMgbmV2ZXIKLWNoYW5nZWQsIGFuZCBpcyB1bmFmZmVjdGVkIGJ5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIG1hY3Jvcy4gIEl0IGlzIHRoZQotYmVzdCBjaG9pY2UgZm9yIHVzZSBpbiBjb25maWd1cmUgc2NyaXB0cyBmb3IgZGV0ZWN0aW5nIHRoZSBwcmVzZW5jZSBvZiBhbnkKLWxpYnBuZyB2ZXJzaW9uIHNpbmNlIDAuODguCi0KLVhJLiBTb3VyY2UgY29kZSByZXBvc2l0b3J5Ci0KLVNpbmNlIGFib3V0IEZlYnJ1YXJ5IDIwMDksIHZlcnNpb24gMS4yLjM0LCBsaWJwbmcgaGFzIGJlZW4gdW5kZXIgImdpdCIgc291cmNlCi1jb250cm9sLiAgVGhlIGdpdCByZXBvc2l0b3J5IHdhcyBidWlsdCBmcm9tIG9sZCBsaWJwbmcteC55LnoudGFyLmd6IGZpbGVzCi1nb2luZyBiYWNrIHRvIHZlcnNpb24gMC43MC4gIFlvdSBjYW4gYWNjZXNzIHRoZSBnaXQgcmVwb3NpdG9yeSAocmVhZCBvbmx5KQotYXQKLQotICAgIGdpdDovL2xpYnBuZy5naXQuc291cmNlZm9yZ2UubmV0L2dpdHJvb3QvbGlicG5nCi0KLW9yIHlvdSBjYW4gYnJvd3NlIGl0IHZpYSAiZ2l0d2ViIiBhdAotCi0gICAgaHR0cDovL2xpYnBuZy5naXQuc291cmNlZm9yZ2UubmV0L2dpdC9naXR3ZWIuY2dpP3A9bGlicG5nCi0KLVBhdGNoZXMgY2FuIGJlIHNlbnQgdG8gZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQgb3IgdG8KLXBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNvdXJjZWZvcmdlLm5ldCBvciB5b3UgY2FuIHVwbG9hZCB0aGVtIHRvCi10aGUgbGlicG5nIGJ1ZyB0cmFja2VyIGF0Ci0KLSAgICBodHRwOi8vbGlicG5nLnNvdXJjZWZvcmdlLm5ldAotCi1YSUkuIENvZGluZyBzdHlsZQotCi1PdXIgY29kaW5nIHN0eWxlIGlzIHNpbWlsYXIgdG8gdGhlICJBbGxtYW4iIHN0eWxlLCB3aXRoIGN1cmx5Ci1icmFjZXMgb24gc2VwYXJhdGUgbGluZXM6Ci0KLSAgICBpZiAoY29uZGl0aW9uKQotICAgIHsKLSAgICAgICBhY3Rpb247Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoYW5vdGhlciBjb25kaXRpb24pCi0gICAgewotICAgICAgIGFub3RoZXIgYWN0aW9uOwotICAgIH0KLQotVGhlIGJyYWNlcyBjYW4gYmUgb21pdHRlZCBmcm9tIHNpbXBsZSBvbmUtbGluZSBhY3Rpb25zOgotCi0gICAgaWYgKGNvbmRpdGlvbikKLSAgICAgICByZXR1cm4gKDApOwotCi1XZSB1c2UgMy1zcGFjZSBpbmRlbnRhdGlvbiwgZXhjZXB0IGZvciBjb250aW51ZWQgc3RhdGVtZW50cyB3aGljaAotYXJlIHVzdWFsbHkgaW5kZW50ZWQgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHN0YXRlbWVudAotcGx1cyBmb3VyIG1vcmUgc3BhY2VzLgotCi1Db21tZW50cyBhcHBlYXIgd2l0aCB0aGUgbGVhZGluZyAiLyoiIGF0IHRoZSBzYW1lIGluZGVudGF0aW9uIGFzCi10aGUgc3RhdGVtZW50IHRoYXQgZm9sbG93cyB0aGUgY29tbWVudDoKLQotICAgIC8qIFNpbmdsZS1saW5lIGNvbW1lbnQgKi8KLSAgICBzdGF0ZW1lbnQ7Ci0KLSAgICAvKiBNdWx0aXBsZS1saW5lCi0gICAgICogY29tbWVudAotICAgICAqLwotICAgIHN0YXRlbWVudDsKLQotVmVyeSBzaG9ydCBjb21tZW50cyBjYW4gYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIHN0YXRlbWVudAotdG8gd2hpY2ggdGhleSBwZXJ0YWluOgotCi0gICAgc3RhdGVtZW50OyAgICAvKiBjb21tZW50ICovCi0KLVdlIGRvbid0IHVzZSBDKysgc3R5bGUgKCIvLyIpIGNvbW1lbnRzLiBXZSBoYXZlLCBob3dldmVyLAotdXNlZCB0aGVtIGluIHRoZSBwYXN0IGluIHNvbWUgbm93LWFiYW5kb25lZCBNTVggYXNzZW1ibGVyCi1jb2RlLgotCi1GdW5jdGlvbnMgYW5kIHRoZWlyIGN1cmx5IGJyYWNrZXRzIGFyZSBub3QgaW5kZW50ZWQsIGFuZAotZXhwb3J0ZWQgZnVuY3Rpb25zIGFyZSBtYXJrZWQgd2l0aCBQTkdBUEk6Ci0KLSAvKiBUaGlzIGlzIGEgcHVibGljIGZ1bmN0aW9uIHRoYXQgaXMgdmlzaWJsZSB0bwotICAqIGFwcGxpY2F0aW9uIHByb2dyYW1lcnMuIEl0IGRvZXMgdGh1cy1hbmQtc28uCi0gICovCi0gdm9pZCBQTkdBUEkKLSBwbmdfZXhwb3J0ZWRfZnVuY3Rpb24ocG5nX3B0ciwgcG5nX2luZm8sIGZvbykKLSB7Ci0gICAgYm9keTsKLSB9Ci0KLVRoZSBwcm90b3R5cGVzIGZvciBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIGFwcGVhciBpbiBwbmcuaC4KLQotV2UgbWFyayBhbGwgbm9uLWV4cG9ydGVkIGZ1bmN0aW9ucyB3aXRoICIvKiBQUklWQVRFICovIiI6Ci0KLSB2b2lkIC8qIFBSSVZBVEUgKi8KLSBwbmdfbm9uX2V4cG9ydGVkX2Z1bmN0aW9uKHBuZ19wdHIsIHBuZ19pbmZvLCBmb28pCi0gewotICAgIGJvZHk7Ci0gfQotCi1UaGUgcHJvdG90eXBlcyBmb3Igbm9uLWV4cG9ydGVkIGZ1bmN0aW9ucyBjYW4gYXBwZWFyIGluCi1wbmdwcml2Lmggb3IgaW4gdGhlIGZpbGUgd2hlcmUgdGhlIGZ1bmN0aW9uIGlzIGxvY2F0ZWQuCi0KLVRoZSBuYW1lcyBvZiBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgYmVnaW4KLXdpdGggICJwbmdfIiwgYW5kIGFsbCBwdWJsaWNseSB2aXNpYmxlIEMgcHJlcHJvY2Vzc29yCi1tYWNyb3MgYmVnaW4gd2l0aCAiUE5HXyIuCi0KLVdlIHB1dCBhIHNwYWNlIGFmdGVyIGVhY2ggY29tbWEgYW5kIGFmdGVyIGVhY2ggc2VtaWNvbG9uCi1pbiAiZm9yIiBzdGF0bWVudHMsIGFuZCB3ZSBwdXQgc3BhY2VzIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaAotQyBiaW5hcnkgb3BlcmF0b3IgYW5kIGFmdGVyICJmb3IiIG9yICJ3aGlsZSIuICBXZSBkb24ndAotcHV0IGEgc3BhY2UgYmV0d2VlbiBhIHR5cGVjYXN0IGFuZCB0aGUgZXhwcmVzc2lvbiBiZWluZwotY2FzdCwgbm9yIGRvIHdlIHB1dCBvbmUgYmV0d2VlbiBhIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZQotbGVmdCBwYXJlbnRoZXNpcyB0aGF0IGZvbGxvd3MgaXQ6Ci0KLSAgICBmb3IgKGkgPSAyOyBpID4gMDsgLS1pKQotICAgICAgIHhbaV0gPSBhKHgpICsgKGludCliOwotCi1PdGhlciBydWxlcyBjYW4gYmUgaW5mZXJyZWQgYnkgaW5zcGVjdGluZyB0aGUgbGlicG5nCi1zb3VyY2UuCi0KLVhJSUkuIFkySyBDb21wbGlhbmNlIGluIGxpYnBuZwotCi1KdW5lIDQsIDIwMDkKLQotU2luY2UgdGhlIFBORyBEZXZlbG9wbWVudCBncm91cCBpcyBhbiBhZC1ob2MgYm9keSwgd2UgY2FuJ3QgbWFrZQotYW4gb2ZmaWNpYWwgZGVjbGFyYXRpb24uCi0KLVRoaXMgaXMgeW91ciB1bm9mZmljaWFsIGFzc3VyYW5jZSB0aGF0IGxpYnBuZyBmcm9tIHZlcnNpb24gMC43MSBhbmQKLXVwd2FyZCB0aHJvdWdoIDEuMi4zNyBhcmUgWTJLIGNvbXBsaWFudC4gIEl0IGlzIG15IGJlbGllZiB0aGF0IGVhcmxpZXIKLXZlcnNpb25zIHdlcmUgYWxzbyBZMksgY29tcGxpYW50LgotCi1MaWJwbmcgb25seSBoYXMgdGhyZWUgeWVhciBmaWVsZHMuICBPbmUgaXMgYSAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlciB0aGF0Ci13aWxsIGhvbGQgeWVhcnMgdXAgdG8gNjU1MzUuICBUaGUgb3RoZXIgdHdvIGhvbGQgdGhlIGRhdGUgaW4gdGV4dAotZm9ybWF0LCBhbmQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDk5OTkuCi0KLVRoZSBpbnRlZ2VyIGlzCi0gICAgInBuZ191aW50XzE2IHllYXIiIGluIHBuZ190aW1lX3N0cnVjdC4KLQotVGhlIHN0cmluZ3MgYXJlCi0gICAgInBuZ19jaGFycCB0aW1lX2J1ZmZlciIgaW4gcG5nX3N0cnVjdCBhbmQKLSAgICAibmVhcl90aW1lX2J1ZmZlciIsIHdoaWNoIGlzIGEgbG9jYWwgY2hhcmFjdGVyIHN0cmluZyBpbiBwbmcuYy4KLQotVGhlcmUgYXJlIHNldmVuIHRpbWUtcmVsYXRlZCBmdW5jdGlvbnM6Ci0KLSAgICBwbmdfY29udmVydF90b19yZmNfMTEyMygpIGluIHBuZy5jCi0gICAgICAoZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExNTIoKSBpbiBlcnJvcikKLSAgICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGluIHBuZ3dyaXRlLmMsIGNhbGxlZAotICAgICAgaW4gcG5nd3JpdGUuYwotICAgIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCkgaW4gcG5nd3JpdGUuYwotICAgIHBuZ19nZXRfdElNRSgpIGluIHBuZ2dldC5jCi0gICAgcG5nX2hhbmRsZV90SU1FKCkgaW4gcG5ncnV0aWwuYywgY2FsbGVkIGluIHBuZ3JlYWQuYwotICAgIHBuZ19zZXRfdElNRSgpIGluIHBuZ3NldC5jCi0gICAgcG5nX3dyaXRlX3RJTUUoKSBpbiBwbmd3dXRpbC5jLCBjYWxsZWQgaW4gcG5nd3JpdGUuYwotCi1BbGwgYXBwZWFyIHRvIGhhbmRsZSBkYXRlcyBwcm9wZXJseSBpbiBhIFkySyBlbnZpcm9ubWVudC4gIFRoZQotcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmdW5jdGlvbiBjYWxscyBnbXRpbWUoKSB0byBjb252ZXJ0IGZyb20gc3lzdGVtCi1jbG9jayB0aW1lLCB3aGljaCByZXR1cm5zICh5ZWFyIC0gMTkwMCksIHdoaWNoIHdlIHByb3Blcmx5IGNvbnZlcnQgdG8KLXRoZSBmdWxsIDQtZGlnaXQgeWVhci4gIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhcHBsaWNhdGlvbnMgdXNpbmcKLWxpYnBuZyBhcmUgbm90IHBhc3NpbmcgNC1kaWdpdCB5ZWFycyBpbnRvIHRoZSBwbmdfY29udmVydF90b19yZmNfMTEyMygpCi1mdW5jdGlvbiwgb3IgdGhhdCB0aGV5IGFyZSBpbmNvcnJlY3RseSBwYXNzaW5nIG9ubHkgYSAyLWRpZ2l0IHllYXIKLWluc3RlYWQgb2YgInllYXIgLSAxOTAwIiBpbnRvIHRoZSBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZ1bmN0aW9uLAotYnV0IHRoaXMgaXMgbm90IHVuZGVyIG91ciBjb250cm9sLiAgVGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uIGhhcyBhbHdheXMKLXN0YXRlZCB0aGF0IGl0IHdvcmtzIHdpdGggNC1kaWdpdCB5ZWFycywgYW5kIHRoZSBBUElzIGhhdmUgYmVlbgotZG9jdW1lbnRlZCBhcyBzdWNoLgotCi1UaGUgdElNRSBjaHVuayBpdHNlbGYgaXMgYWxzbyBZMksgY29tcGxpYW50LiAgSXQgdXNlcyBhIDItYnl0ZSB1bnNpZ25lZAotaW50ZWdlciB0byBob2xkIHRoZSB5ZWFyLCBhbmQgY2FuIGhvbGQgeWVhcnMgYXMgbGFyZ2UgYXMgNjU1MzUuCi0KLXpsaWIsIHVwb24gd2hpY2ggbGlicG5nIGRlcGVuZHMsIGlzIGFsc28gWTJLIGNvbXBsaWFudC4gIEl0IGNvbnRhaW5zCi1ubyBkYXRlLXJlbGF0ZWQgY29kZS4KLQotCi0gICBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAgIGxpYnBuZyBtYWludGFpbmVyCi0gICBQTkcgRGV2ZWxvcG1lbnQgR3JvdXAKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL2xpYnBuZy4zIGIvbGlicy9saWJwbmcvbGlicG5nLjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZGY4NzEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvbGlicG5nLjMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzM3ICswLDAgQEAKLS5USCBMSUJQTkcgMyAiSnVuZSA0LCAyMDA5IgotLlNIIE5BTUUKLWxpYnBuZyBcLSBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFJlZmVyZW5jZSBMaWJyYXJ5IDEuMi4zNwotLlNIIFNZTk9QU0lTCi1cZklcZkIKLQotXGZCI2luY2x1ZGUgPHBuZy5oPlxmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlciBcZkkodm9pZFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJpbnQgcG5nX2NoZWNrX3NpZyAocG5nX2J5dGVwIFxmUFxmSXNpZ1xmUFxmQiwgaW50IFxmSW51bVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19jaHVua19lcnJvciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmSWVycm9yXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2NodW5rX3dhcm5pbmcgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZkltZXNzYWdlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0gKHBuZ190aW1lcCBcZlBcZklwdGltZVxmUFxmQiwgc3RydWN0IHRtIEZBUiAqIFxmSXR0aW1lXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QgKHBuZ190aW1lcCBcZlBcZklwdGltZVxmUFxmQiwgdGltZV90IFxmSXR0aW1lXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ19jaGFycCBwbmdfY29udmVydF90b19yZmMxMTIzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdGltZXAgXGZJcHRpbWVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2luZm9wIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3N0cnVjdHAgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCAocG5nX2NvbnN0X2NoYXJwIFxmUFxmSXVzZXJfcG5nX3ZlclxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSWVycm9yX3B0clxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkllcnJvcl9mblxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZkl3YXJuX2ZuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ19zdHJ1Y3RwIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMihwbmdfY29uc3RfY2hhcnAgXGZQXGZJdXNlcl9wbmdfdmVyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJZXJyb3JfcHRyXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSWVycm9yX2ZuXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSXdhcm5fZm5cZlBcZkIsIHBuZ192b2lkcCBcZlBcZkltZW1fcHRyXGZQXGZCLCBwbmdfbWFsbG9jX3B0ciBcZlBcZkltYWxsb2NfZm5cZlBcZkIsIHBuZ19mcmVlX3B0ciBcZklmcmVlX2ZuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ19zdHJ1Y3RwIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0IChwbmdfY29uc3RfY2hhcnAgXGZQXGZJdXNlcl9wbmdfdmVyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJZXJyb3JfcHRyXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSWVycm9yX2ZuXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmSXdhcm5fZm5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3N0cnVjdHAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMihwbmdfY29uc3RfY2hhcnAgXGZQXGZJdXNlcl9wbmdfdmVyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJZXJyb3JfcHRyXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSWVycm9yX2ZuXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSXdhcm5fZm5cZlBcZkIsIHBuZ192b2lkcCBcZlBcZkltZW1fcHRyXGZQXGZCLCBwbmdfbWFsbG9jX3B0ciBcZlBcZkltYWxsb2NfZm5cZlBcZkIsIHBuZ19mcmVlX3B0ciBcZklmcmVlX2ZuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQmludCBwbmdfZGVidWcoaW50IFxmUFxmSWxldmVsXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZJbWVzc2FnZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJpbnQgcG5nX2RlYnVnMShpbnQgXGZQXGZJbGV2ZWxcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZlBcZkltZXNzYWdlXGZQXGZCLCBcZklwMVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJpbnQgcG5nX2RlYnVnMihpbnQgXGZQXGZJbGV2ZWxcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZlBcZkltZXNzYWdlXGZQXGZCLCBcZlBcZklwMVxmUFxmQiwgXGZJcDJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wcCBcZklpbmZvX3B0cl9wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCAocG5nX3N0cnVjdHBwIFxmUFxmSXBuZ19wdHJfcHRyXGZQXGZCLCBwbmdfaW5mb3BwIFxmUFxmSWluZm9fcHRyX3B0clxmUFxmQiwgcG5nX2luZm9wcCBcZkllbmRfaW5mb19wdHJfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0IChwbmdfc3RydWN0cHAgXGZQXGZJcG5nX3B0cl9wdHJcZlBcZkIsIHBuZ19pbmZvcHAgXGZJaW5mb19wdHJfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2Vycm9yIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZJZXJyb3JcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZnJlZSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3ZvaWRwIFxmSXB0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19mcmVlX2NodW5rX2xpc3QgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZnJlZV9kZWZhdWx0KHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZklwdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZnJlZV9kYXRhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZkludW1cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9iaXRfZGVwdGggKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2JLR0QgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZkkqYmFja2dyb3VuZFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2NoYW5uZWxzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9jSFJNIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGRvdWJsZSBcZlBcZkkqd2hpdGVfeFxmUFxmQiwgZG91YmxlIFxmUFxmSSp3aGl0ZV95XGZQXGZCLCBkb3VibGUgXGZQXGZJKnJlZF94XGZQXGZCLCBkb3VibGUgXGZQXGZJKnJlZF95XGZQXGZCLCBkb3VibGUgXGZQXGZJKmdyZWVuX3hcZlBcZkIsIGRvdWJsZSBcZlBcZkkqZ3JlZW5feVxmUFxmQiwgZG91YmxlIFxmUFxmSSpibHVlX3hcZlBcZkIsIGRvdWJsZSBcZkkqYmx1ZV95XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfY0hSTV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqd2hpdGVfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKndoaXRlX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpyZWRfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKnJlZF95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqZ3JlZW5feFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKmdyZWVuX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpibHVlX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmSSpibHVlX3lcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9jb2xvcl90eXBlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9jb21wcmVzc2lvbl90eXBlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9jb3B5cmlnaHQgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19nZXRfZXJyb3JfcHRyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ19ieXRlIHBuZ19nZXRfZmlsdGVyX3R5cGUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2dBTUEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgZG91YmxlIFxmSSpmaWxlX2dhbW1hXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfZ0FNQV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZkkqaW50X2ZpbGVfZ2FtbWFcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9oZWFkZXJfdmVyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ19ieXRlIHBuZ19nZXRfaGVhZGVyX3ZlcnNpb24gKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9oSVNUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzE2cCBcZkkqaGlzdFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2lDQ1AgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NoYXJwcCBcZlBcZkluYW1lXGZQXGZCLCBpbnQgXGZQXGZJKmNvbXByZXNzaW9uX3R5cGVcZlBcZkIsIHBuZ19jaGFycHAgXGZQXGZJcHJvZmlsZVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJKnByb2ZsZW5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9JSERSIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSp3aWR0aFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKmhlaWdodFxmUFxmQiwgaW50IFxmUFxmSSpiaXRfZGVwdGhcZlBcZkIsIGludCBcZlBcZkkqY29sb3JfdHlwZVxmUFxmQiwgaW50IFxmUFxmSSppbnRlcmxhY2VfdHlwZVxmUFxmQiwgaW50IFxmUFxmSSpjb21wcmVzc2lvbl90eXBlXGZQXGZCLCBpbnQgXGZJKmZpbHRlcl90eXBlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfaW1hZ2VfaGVpZ2h0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9pbWFnZV93aWR0aCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQiNpZiBcZkkhZGVmaW5lZChQTkdfMV8wX1gpCi0KLVxmQnBuZ19pbnRfMzIgcG5nX2dldF9pbnRfMzIgKHBuZ19ieXRlcCBcZklidWZcZlBcZkIpO1xmUAotCi1cZklcZkIjZW5kaWYKLQotXGZJXGZCCi0KLVxmQnBuZ19ieXRlIHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdm9pZHAgcG5nX2dldF9pb19wdHIgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9saWJwbmdfdmVyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ192b2lkcCBwbmdfZ2V0X21lbV9wdHIocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X29GRnMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKm9mZnNldF94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqb2Zmc2V0X3lcZlBcZkIsIGludCBcZkkqdW5pdF90eXBlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfcENBTCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJKnB1cnBvc2VcZlBcZkIsIHBuZ19pbnRfMzIgXGZQXGZJKlgwXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSSpYMVxmUFxmQiwgaW50IFxmUFxmSSp0eXBlXGZQXGZCLCBpbnQgXGZQXGZJKm5wYXJhbXNcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkkqdW5pdHNcZlBcZkIsIHBuZ19jaGFycHAgXGZJKnBhcmFtc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3BIWXMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKnJlc194XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqcmVzX3lcZlBcZkIsIGludCBcZkkqdW5pdF90eXBlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQmZsb2F0IHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9waXhlbHNfcGVyX21ldGVyIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfUExURSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY29sb3JwIFxmUFxmSSpwYWxldHRlXGZQXGZCLCBpbnQgXGZJKm51bV9wYWxldHRlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ19ieXRlIHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzIChwbmdfc3RydWN0cCBcZklwbmdfcHRyKQotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3Jvd2J5dGVzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2J5dGVwcCBwbmdfZ2V0X3Jvd3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3NCSVQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9yXzhwIFxmSSpzaWdfYml0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ19ieXRlcCBwbmdfZ2V0X3NpZ25hdHVyZSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfc1BMVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfc3BhbGV0dGVfcCBcZkkqc3BsdF9wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9zUkdCIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZkkqaW50ZW50XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfdGV4dCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdGV4dHAgXGZQXGZJKnRleHRfcHRyXGZQXGZCLCBpbnQgXGZJKm51bV90ZXh0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfdElNRSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdGltZXAgXGZJKm1vZF90aW1lXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfdFJOUyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJKnRyYW5zXGZQXGZCLCBpbnQgXGZQXGZJKm51bV90cmFuc1xmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZkkqdHJhbnNfdmFsdWVzXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQiNpZiBcZkkhZGVmaW5lZChQTkdfMV8wX1gpCi0KLVxmQnBuZ191aW50XzE2IHBuZ19nZXRfdWludF8xNiAocG5nX2J5dGVwIFxmSWJ1ZlxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3VpbnRfMzEgKHBuZ19ieXRlcCBcZklidWZcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF91aW50XzMyIChwbmdfYnl0ZXAgXGZJYnVmXGZQXGZCKTtcZlAKLQotXGZJXGZCI2VuZGlmCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3Vua25vd25fY2h1bmtzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191bmtub3duX2NodW5rcHAgXGZJdW5rbm93bnNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19nZXRfdXNlcl9jaHVua19wdHIgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF91c2VyX2hlaWdodF9tYXgoIHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfdXNlcl93aWR0aF9tYXggKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF92YWxpZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklmbGFnXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ19pbnRfMzIgcG5nX2dldF94X29mZnNldF9taWNyb25zIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2ludF8zMiBwbmdfZ2V0X3hfb2Zmc2V0X3BpeGVscyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX2ludF8zMiBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfaW50XzMyIHBuZ19nZXRfeV9vZmZzZXRfcGl4ZWxzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQmludCBwbmdfaGFuZGxlX2FzX3Vua25vd24gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZkljaHVua19uYW1lXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2luaXRfaW8gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIEZJTEUgXGZJKmZwXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQkRFUFJFQ0FURUQ6IHZvaWQgcG5nX2luZm9faW5pdCAocG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQkRFUFJFQ0FURUQ6IHZvaWQgcG5nX2luZm9faW5pdF8yIChwbmdfaW5mb3BwIFxmUFxmSXB0cl9wdHJcZlBcZkIsIHBuZ19zaXplX3QgXGZJcG5nX2luZm9fc3RydWN0X3NpemVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19tYWxsb2MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSXNpemVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19tYWxsb2NfZGVmYXVsdChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklzaXplXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWRwIHBuZ19tZW1jcHkgKHBuZ192b2lkcCBcZlBcZklzMVxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSXMyXGZQXGZCLCBwbmdfc2l6ZV90IFxmSXNpemVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19tZW1jcHlfY2hlY2sgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZklzMVxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSXMyXGZQXGZCLCBwbmdfdWludF8zMiBcZklzaXplXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWRwIHBuZ19tZW1zZXQgKHBuZ192b2lkcCBcZlBcZklzMVxmUFxmQiwgaW50IFxmUFxmSXZhbHVlXGZQXGZCLCBwbmdfc2l6ZV90IFxmSXNpemVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19tZW1zZXRfY2hlY2sgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZklzMVxmUFxmQiwgaW50IFxmUFxmSXZhbHVlXGZQXGZCLCBwbmdfdWludF8zMiBcZklzaXplXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQkRFUFJFQ0FURUQ6IHZvaWQgcG5nX3Blcm1pdF9lbXB0eV9wbHRlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJZW1wdHlfcGx0ZV9wZXJtaXR0ZWRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHJvY2Vzc19kYXRhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklidWZmZXJcZlBcZkIsIHBuZ19zaXplX3QgXGZJYnVmZmVyX3NpemVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklvbGRfcm93XGZQXGZCLCBwbmdfYnl0ZXAgXGZJbmV3X3Jvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX2Rlc3Ryb3kgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWVuZF9pbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX2VuZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3JlYWRfaW1hZ2UgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcHAgXGZJaW1hZ2VcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCREVQUkVDQVRFRDogdm9pZCBwbmdfcmVhZF9pbml0IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQkRFUFJFQ0FURUQ6IHZvaWQgcG5nX3JlYWRfaW5pdF8yIChwbmdfc3RydWN0cHAgXGZQXGZJcHRyX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmUFxmSXVzZXJfcG5nX3ZlclxmUFxmQiwgcG5nX3NpemVfdCBcZlBcZklwbmdfc3RydWN0X3NpemVcZlBcZkIsIHBuZ19zaXplX3QgXGZJcG5nX2luZm9fc2l6ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX2luZm8gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX3BuZyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZQXGZJdHJhbnNmb3Jtc1xmUFxmQiwgcG5nX3ZvaWRwIFxmSXBhcmFtc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX3JvdyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXJvd1xmUFxmQiwgcG5nX2J5dGVwIFxmSWRpc3BsYXlfcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3JlYWRfcm93cyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19ieXRlcHAgXGZQXGZJZGlzcGxheV9yb3dcZlBcZkIsIHBuZ191aW50XzMyIFxmSW51bV9yb3dzXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3JlYWRfdXBkYXRlX2luZm8gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkIjaWYgXGZJIWRlZmluZWQoUE5HXzFfMF9YKQotCi1cZkJwbmdfc2F2ZV9pbnRfMzIgKHBuZ19ieXRlcCBcZlBcZklidWZcZlBcZkIsIHBuZ19pbnRfMzIgXGZJaVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zYXZlX3VpbnRfMTYgKHBuZ19ieXRlcCBcZlBcZklidWZcZlBcZkIsIHVuc2lnbmVkIGludCBcZklpXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NhdmVfdWludF8zMiAocG5nX2J5dGVwIFxmUFxmSWJ1ZlxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJaVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfYWRkX2FscGhhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklmaWxsZXJcZlBcZkIsIGludCBcZklmbGFnc1xmUFxmQik7XGZQCi0KLVxmSVxmQiNlbmRpZgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2JhY2tncm91bmQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZQXGZJYmFja2dyb3VuZF9jb2xvclxmUFxmQiwgaW50IFxmUFxmSWJhY2tncm91bmRfZ2FtbWFfY29kZVxmUFxmQiwgaW50IFxmUFxmSW5lZWRfZXhwYW5kXGZQXGZCLCBkb3VibGUgXGZJYmFja2dyb3VuZF9nYW1tYVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfYmdyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9iS0dEIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZJYmFja2dyb3VuZFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfY0hSTSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBkb3VibGUgXGZQXGZJd2hpdGVfeFxmUFxmQiwgZG91YmxlIFxmUFxmSXdoaXRlX3lcZlBcZkIsIGRvdWJsZSBcZlBcZklyZWRfeFxmUFxmQiwgZG91YmxlIFxmUFxmSXJlZF95XGZQXGZCLCBkb3VibGUgXGZQXGZJZ3JlZW5feFxmUFxmQiwgZG91YmxlIFxmUFxmSWdyZWVuX3lcZlBcZkIsIGRvdWJsZSBcZlBcZklibHVlX3hcZlBcZkIsIGRvdWJsZSBcZklibHVlX3lcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2NIUk1fZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJd2hpdGVfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJd2hpdGVfeVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJcmVkX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXJlZF95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklncmVlbl94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklncmVlbl95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklibHVlX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmSWJsdWVfeVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZklsZXZlbFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbWVtX2xldmVsXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZkltZXRob2RcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJc3RyYXRlZ3lcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJd2luZG93X2JpdHNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2NyY19hY3Rpb24gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZlBcZkljcml0X2FjdGlvblxmUFxmQiwgaW50IFxmSWFuY2lsX2FjdGlvblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfZGl0aGVyIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29sb3JwIFxmUFxmSXBhbGV0dGVcZlBcZkIsIGludCBcZlBcZkludW1fcGFsZXR0ZVxmUFxmQiwgaW50IFxmUFxmSW1heGltdW1fY29sb3JzXGZQXGZCLCBwbmdfdWludF8xNnAgXGZQXGZJaGlzdG9ncmFtXGZQXGZCLCBpbnQgXGZJZnVsbF9kaXRoZXJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2Vycm9yX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJZXJyb3JfcHRyXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSWVycm9yX2ZuXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmSXdhcm5pbmdfZm5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2V4cGFuZCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9maWxsZXIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSWZpbGxlclxmUFxmQiwgaW50IFxmSWZsYWdzXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9maWx0ZXIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZlBcZkltZXRob2RcZlBcZkIsIGludCBcZklmaWx0ZXJzXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSWhldXJpc3RpY19tZXRob2RcZlBcZkIsIGludCBcZlBcZkludW1fd2VpZ2h0c1xmUFxmQiwgcG5nX2RvdWJsZXAgXGZQXGZJZmlsdGVyX3dlaWdodHNcZlBcZkIsIHBuZ19kb3VibGVwIFxmSWZpbHRlcl9jb3N0c1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfZmx1c2ggKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZklucm93c1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfZ2FtbWEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGRvdWJsZSBcZlBcZklzY3JlZW5fZ2FtbWFcZlBcZkIsIGRvdWJsZSBcZklkZWZhdWx0X2ZpbGVfZ2FtbWFcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2dBTUEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgZG91YmxlIFxmSWZpbGVfZ2FtbWFcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2dBTUFfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJZmlsZV9nYW1tYVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2dyYXlfdG9fcmdiIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9oSVNUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzE2cCBcZkloaXN0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9pQ0NQIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkluYW1lXGZQXGZCLCBpbnQgXGZQXGZJY29tcHJlc3Npb25fdHlwZVxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXByb2ZpbGVcZlBcZkIsIHBuZ191aW50XzMyIFxmSXByb2ZsZW5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCaW50IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9pbnZhbGlkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZkltYXNrXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9pbnZlcnRfYWxwaGEgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2ludmVydF9tb25vIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9JSERSIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkloZWlnaHRcZlBcZkIsIGludCBcZlBcZkliaXRfZGVwdGhcZlBcZkIsIGludCBcZlBcZkljb2xvcl90eXBlXGZQXGZCLCBpbnQgXGZQXGZJaW50ZXJsYWNlX3R5cGVcZlBcZkIsIGludCBcZlBcZkljb21wcmVzc2lvbl90eXBlXGZQXGZCLCBpbnQgXGZJZmlsdGVyX3R5cGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZlBcZklrZWVwXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJY2h1bmtfbGlzdFxmUFxmQiwgaW50IFxmSW51bV9jaHVua3NcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X21lbV9mbihwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJbWVtX3B0clxmUFxmQiwgcG5nX21hbGxvY19wdHIgXGZQXGZJbWFsbG9jX2ZuXGZQXGZCLCBwbmdfZnJlZV9wdHIgXGZJZnJlZV9mblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfb0ZGcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklvZmZzZXRfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJb2Zmc2V0X3lcZlBcZkIsIGludCBcZkl1bml0X3R5cGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3BhY2tpbmcgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3BhY2tzd2FwIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9wQ0FMIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZklwdXJwb3NlXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSVgwXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSVgxXGZQXGZCLCBpbnQgXGZQXGZJdHlwZVxmUFxmQiwgaW50IFxmUFxmSW5wYXJhbXNcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl1bml0c1xmUFxmQiwgcG5nX2NoYXJwcCBcZklwYXJhbXNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3BIWXMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJcmVzX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXJlc195XGZQXGZCLCBpbnQgXGZJdW5pdF90eXBlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJcHJvZ3Jlc3NpdmVfcHRyXGZQXGZCLCBwbmdfcHJvZ3Jlc3NpdmVfaW5mb19wdHIgXGZQXGZJaW5mb19mblxmUFxmQiwgcG5nX3Byb2dyZXNzaXZlX3Jvd19wdHIgXGZQXGZJcm93X2ZuXGZQXGZCLCBwbmdfcHJvZ3Jlc3NpdmVfZW5kX3B0ciBcZkllbmRfZm5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X1BMVEUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9ycCBcZlBcZklwYWxldHRlXGZQXGZCLCBpbnQgXGZJbnVtX3BhbGV0dGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3JlYWRfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZklpb19wdHJcZlBcZkIsIHBuZ19yd19wdHIgXGZJcmVhZF9kYXRhX2ZuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9yZWFkX3N0YXR1c19mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3JlYWRfc3RhdHVzX3B0ciBcZklyZWFkX3Jvd19mblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciBcZklyZWFkX3VzZXJfdHJhbnNmb3JtX2ZuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9yZ2JfdG9fZ3JheSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSWVycm9yX2FjdGlvblxmUFxmQiwgZG91YmxlIFxmUFxmSXJlZFxmUFxmQiwgZG91YmxlIFxmSWdyZWVuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IGVycm9yX2FjdGlvbiBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJcmVkXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZJZ3JlZW5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3Jvd3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2J5dGVwcCBcZklyb3dfcG9pbnRlcnNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3NCSVQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9yXzhwIFxmSXNpZ19iaXRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3NDQUwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXVuaXRcZlBcZkIsIGRvdWJsZSBcZlBcZkl3aWR0aFxmUFxmQiwgZG91YmxlIFxmSWhlaWdodFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc2hpZnQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb2xvcl84cCBcZkl0cnVlX2JpdHNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3NpZ19ieXRlcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSW51bV9ieXRlc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc1BMVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfc3BhbGV0dGVfcCBcZlBcZklzcGx0X3B0clxmUFxmQiwgaW50IFxmSW51bV9zcGFsZXR0ZXNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3NSR0IgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmSWludGVudFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc1JHQl9nQU1BX2FuZF9jSFJNIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZklpbnRlbnRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3N0cmlwXzE2IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF9zdHJpcF9hbHBoYSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc3dhcCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfc3dhcF9hbHBoYSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfdGV4dCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdGV4dHAgXGZQXGZJdGV4dF9wdHJcZlBcZkIsIGludCBcZkludW1fdGV4dFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfdElNRSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdGltZXAgXGZJbW9kX3RpbWVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3RSTlMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXRyYW5zXGZQXGZCLCBpbnQgXGZQXGZJbnVtX3RyYW5zXGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmSXRyYW5zX3ZhbHVlc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfdFJOU190b19hbHBoYShwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnBuZ191aW50XzMyIHBuZ19zZXRfdW5rbm93bl9jaHVua3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3Vua25vd25fY2h1bmtwIFxmUFxmSXVua25vd25zXGZQXGZCLCBpbnQgXGZQXGZJbnVtXGZQXGZCLCBpbnQgXGZJbG9jYXRpb25cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24ocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZQXGZJY2h1bmtcZlBcZkIsIGludCBcZklsb2NhdGlvblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJdXNlcl9jaHVua19wdHJcZlBcZkIsIHBuZ191c2VyX2NodW5rX3B0ciBcZklyZWFkX3VzZXJfY2h1bmtfZm5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3VzZXJfbGltaXRzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl1c2VyX3dpZHRoX21heFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJdXNlcl9oZWlnaHRfbWF4XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJdXNlcl90cmFuc2Zvcm1fcHRyXGZQXGZCLCBpbnQgXGZQXGZJdXNlcl90cmFuc2Zvcm1fZGVwdGhcZlBcZkIsIGludCBcZkl1c2VyX3RyYW5zZm9ybV9jaGFubmVsc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfd3JpdGVfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZklpb19wdHJcZlBcZkIsIHBuZ19yd19wdHIgXGZQXGZJd3JpdGVfZGF0YV9mblxmUFxmQiwgcG5nX2ZsdXNoX3B0ciBcZklvdXRwdXRfZmx1c2hfZm5cZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3dyaXRlX3N0YXR1c19wdHIgXGZJd3JpdGVfcm93X2ZuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciBcZkl3cml0ZV91c2VyX3RyYW5zZm9ybV9mblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJc2l6ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJpbnQgcG5nX3NpZ19jbXAgKHBuZ19ieXRlcCBcZlBcZklzaWdcZlBcZkIsIHBuZ19zaXplX3QgXGZQXGZJc3RhcnRcZlBcZkIsIHBuZ19zaXplX3QgXGZJbnVtX3RvX2NoZWNrXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd2FybmluZyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmSW1lc3NhZ2VcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfY2h1bmsgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkljaHVua19uYW1lXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJZGF0YVxmUFxmQiwgcG5nX3NpemVfdCBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfY2h1bmtfZGF0YSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWRhdGFcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2NodW5rX2VuZCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9jaHVua19zdGFydCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWNodW5rX25hbWVcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9kZXN0cm95IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2VuZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2ZsdXNoIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2ltYWdlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXBwIFxmSWltYWdlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQkRFUFJFQ0FURUQ6IHZvaWQgcG5nX3dyaXRlX2luaXQgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCREVQUkVDQVRFRDogdm9pZCBwbmdfd3JpdGVfaW5pdF8yIChwbmdfc3RydWN0cHAgXGZQXGZJcHRyX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmUFxmSXVzZXJfcG5nX3ZlclxmUFxmQiwgcG5nX3NpemVfdCBcZlBcZklwbmdfc3RydWN0X3NpemVcZlBcZkIsIHBuZ19zaXplX3QgXGZJcG5nX2luZm9fc2l6ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3BuZyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZQXGZJdHJhbnNmb3Jtc1xmUFxmQiwgcG5nX3ZvaWRwIFxmSXBhcmFtc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfcm93cyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwcCBcZlBcZklyb3dcZlBcZkIsIHBuZ191aW50XzMyIFxmSW51bV9yb3dzXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWRwZiBwbmdfemFsbG9jICh2b2lkcGYgXGZQXGZJcG5nX3B0clxmUFxmQiwgdUludCBcZlBcZklpdGVtc1xmUFxmQiwgdUludCBcZklzaXplXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3pmcmVlICh2b2lkcGYgXGZQXGZJcG5nX3B0clxmUFxmQiwgdm9pZHBmIFxmSXB0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi0uU0ggREVTQ1JJUFRJT04KLVRoZQotLkkgbGlicG5nCi1saWJyYXJ5IHN1cHBvcnRzIGVuY29kaW5nLCBkZWNvZGluZywgYW5kIHZhcmlvdXMgbWFuaXB1bGF0aW9ucyBvZgotdGhlIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORykgZm9ybWF0IGltYWdlIGZpbGVzLiAgSXQgdXNlcyB0aGUKLS5JUiB6bGliKDMpCi1jb21wcmVzc2lvbiBsaWJyYXJ5LgotRm9sbG93aW5nIGlzIGEgY29weSBvZiB0aGUgbGlicG5nLnR4dCBmaWxlIHRoYXQgYWNjb21wYW5pZXMgbGlicG5nLgotLlNIIExJQlBORy5UWFQKLWxpYnBuZy50eHQgLSBBIGRlc2NyaXB0aW9uIG9uIGhvdyB0byB1c2UgYW5kIG1vZGlmeSBsaWJwbmcKLQotIGxpYnBuZyB2ZXJzaW9uIDEuMi4zNyAtIEp1bmUgNCwgMjAwOQotIFVwZGF0ZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIDxnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodAotIG5vdGljZSBpbiBwbmcuaC4KLQotIEJhc2VkIG9uOgotCi0gbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjIuMzcgLSBKdW5lIDQsIDIwMDkKLSBVcGRhdGVkIGFuZCBkaXN0cmlidXRlZCBieSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLQotIGxpYnBuZyAxLjAgYmV0YSA2ICB2ZXJzaW9uIDAuOTYgTWF5IDI4LCAxOTk3Ci0gVXBkYXRlZCBhbmQgZGlzdHJpYnV0ZWQgYnkgQW5kcmVhcyBEaWxnZXIKLSBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLQotIGxpYnBuZyAxLjAgYmV0YSAyIC0gdmVyc2lvbiAwLjg4ICBKYW51YXJ5IDI2LCAxOTk2Ci0gRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQKLSBub3RpY2UgaW4gcG5nLmguIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYwotIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotCi0gVXBkYXRlZC9yZXdyaXR0ZW4gcGVyIHJlcXVlc3QgaW4gdGhlIGxpYnBuZyBGQVEKLSBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgRnJhbmsgSi4gVC4gV29qY2lrCi0gRGVjZW1iZXIgMTgsIDE5OTUgJiBKYW51YXJ5IDIwLCAxOTk2Ci0KLS5TSCBJLiBJbnRyb2R1Y3Rpb24KLQotVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gdXNlIGFuZCBtb2RpZnkgdGhlIFBORyByZWZlcmVuY2UgbGlicmFyeQotKGtub3duIGFzIGxpYnBuZykgZm9yIHlvdXIgb3duIHVzZS4gIFRoZXJlIGFyZSBmaXZlIHNlY3Rpb25zIHRvIHRoaXMKLWZpbGU6IGludHJvZHVjdGlvbiwgc3RydWN0dXJlcywgcmVhZGluZywgd3JpdGluZywgYW5kIG1vZGlmaWNhdGlvbiBhbmQKLWNvbmZpZ3VyYXRpb24gbm90ZXMgZm9yIHZhcmlvdXMgc3BlY2lhbCBwbGF0Zm9ybXMuICBJbiBhZGRpdGlvbiB0byB0aGlzCi1maWxlLCBleGFtcGxlLmMgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZyB0aGUgbGlicmFyeSwgYXMKLWl0IGlzIGhlYXZpbHkgY29tbWVudGVkIGFuZCBzaG91bGQgaW5jbHVkZSBldmVyeXRoaW5nIG1vc3QgcGVvcGxlCi13aWxsIG5lZWQuICBXZSBhc3N1bWUgdGhhdCBsaWJwbmcgaXMgYWxyZWFkeSBpbnN0YWxsZWQ7IHNlZSB0aGUKLUlOU1RBTEwgZmlsZSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBpbnN0YWxsIGxpYnBuZy4KLQotRm9yIGV4YW1wbGVzIG9mIGxpYnBuZyB1c2FnZSwgc2VlIHRoZSBmaWxlcyAiZXhhbXBsZS5jIiwgInBuZ3Rlc3QuYyIsCi1hbmQgdGhlIGZpbGVzIGluIHRoZSAiY29udHJpYiIgZGlyZWN0b3J5LCBhbGwgb2Ygd2hpY2ggYXJlIGluY2x1ZGVkIGluIHRoZQotbGlicG5nIGRpc3RyaWJ1dGlvbi4KLQotTGlicG5nIHdhcyB3cml0dGVuIGFzIGEgY29tcGFuaW9uIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgYXMgYSB3YXkKLW9mIHJlZHVjaW5nIHRoZSBhbW91bnQgb2YgdGltZSBhbmQgZWZmb3J0IGl0IHRha2VzIHRvIHN1cHBvcnQgdGhlIFBORwotZmlsZSBmb3JtYXQgaW4gYXBwbGljYXRpb24gcHJvZ3JhbXMuCi0KLVRoZSBQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pLCBOb3ZlbWJlciAyMDAzLCBpcyBhdmFpbGFibGUgYXMKLWEgVzNDIFJlY29tbWVuZGF0aW9uIGFuZCBhcyBhbiBJU08gU3RhbmRhcmQgKElTTy9JRUMgMTU5NDg6MjAwMyAoRSkpIGF0Ci08aHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9SRUMtUE5HLTIwMDMxMTEwLwotVGhlIFczQyBhbmQgSVNPIGRvY3VtZW50cyBoYXZlIGlkZW50aWNhbCB0ZWNobmljYWwgY29udGVudC4KLQotVGhlIFBORy0xLjIgc3BlY2lmaWNhdGlvbiBpcyBhdmFpbGFibGUgYXQKLTxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9kb2N1bWVudHMvPi4gIEl0IGlzIHRlY2huaWNhbGx5IGVxdWl2YWxlbnQKLXRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pIGJ1dCBoYXMgc29tZSBhZGRpdGlvbmFsIG1hdGVyaWFsLgotCi1UaGUgUE5HLTEuMCBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZQotYXMgUkZDIDIwODMgPGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL2RvY3VtZW50cy8+IGFuZCBhcyBhCi1XM0MgUmVjb21tZW5kYXRpb24gPGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy5wbmcuaHRtbD4uCi0KLVNvbWUgYWRkaXRpb25hbCBjaHVua3MgYXJlIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lhbC1wdXJwb3NlIHB1YmxpYyBjaHVua3MKLWRvY3VtZW50cyBhdCA8aHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvZG9jdW1lbnRzLz4uCi0KLU90aGVyIGluZm9ybWF0aW9uCi1hYm91dCBQTkcsIGFuZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgbGlicG5nLCBjYW4gYmUgZm91bmQgYXQgdGhlIFBORyBob21lCi1wYWdlLCA8aHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvPi4KLQotTW9zdCB1c2VycyB3aWxsIG5vdCBoYXZlIHRvIG1vZGlmeSB0aGUgbGlicmFyeSBzaWduaWZpY2FudGx5OyBhZHZhbmNlZAotdXNlcnMgbWF5IHdhbnQgdG8gbW9kaWZ5IGl0IG1vcmUuICBBbGwgYXR0ZW1wdHMgd2VyZSBtYWRlIHRvIG1ha2UgaXQgYXMKLWNvbXBsZXRlIGFzIHBvc3NpYmxlLCB3aGlsZSBrZWVwaW5nIHRoZSBjb2RlIGVhc3kgdG8gdW5kZXJzdGFuZC4KLUN1cnJlbnRseSwgdGhpcyBsaWJyYXJ5IG9ubHkgc3VwcG9ydHMgQy4gIFN1cHBvcnQgZm9yIG90aGVyIGxhbmd1YWdlcwotaXMgYmVpbmcgY29uc2lkZXJlZC4KLQotTGlicG5nIGhhcyBiZWVuIGRlc2lnbmVkIHRvIGhhbmRsZSBtdWx0aXBsZSBzZXNzaW9ucyBhdCBvbmUgdGltZSwKLXRvIGJlIGVhc2lseSBtb2RpZmlhYmxlLCB0byBiZSBwb3J0YWJsZSB0byB0aGUgdmFzdCBtYWpvcml0eSBvZgotbWFjaGluZXMgKEFOU0ksIEsmUiwgMTYtLCAzMi0sIGFuZCA2NC1iaXQpIGF2YWlsYWJsZSwgYW5kIHRvIGJlIGVhc3kKLXRvIHVzZS4gIFRoZSB1bHRpbWF0ZSBnb2FsIG9mIGxpYnBuZyBpcyB0byBwcm9tb3RlIHRoZSBhY2NlcHRhbmNlIG9mCi10aGUgUE5HIGZpbGUgZm9ybWF0IGluIHdoYXRldmVyIHdheSBwb3NzaWJsZS4gIFdoaWxlIHRoZXJlIGlzIHN0aWxsCi13b3JrIHRvIGJlIGRvbmUgKHNlZSB0aGUgVE9ETyBmaWxlKSwgbGlicG5nIHNob3VsZCBjb3ZlciB0aGUKLW1ham9yaXR5IG9mIHRoZSBuZWVkcyBvZiBpdHMgdXNlcnMuCi0KLUxpYnBuZyB1c2VzIHpsaWIgZm9yIGl0cyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvZiBQTkcgZmlsZXMuCi1GdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHpsaWIsIGFuZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgemxpYiwgY2FuCi1iZSBmb3VuZCBhdCB0aGUgemxpYiBob21lIHBhZ2UsIDxodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC96bGliLz4uCi1UaGUgemxpYiBjb21wcmVzc2lvbiB1dGlsaXR5IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIHV0aWxpdHkgdGhhdCBpcwotdXNlZnVsIGZvciBtb3JlIHRoYW4gUE5HIGZpbGVzLCBhbmQgY2FuIGJlIHVzZWQgd2l0aG91dCBsaWJwbmcuCi1TZWUgdGhlIGRvY3VtZW50YXRpb24gZGVsaXZlcmVkIHdpdGggemxpYiBmb3IgbW9yZSBkZXRhaWxzLgotWW91IGNhbiB1c3VhbGx5IGZpbmQgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlIHpsaWIgdXRpbGl0eSB3aGVyZXZlciB5b3UKLWZpbmQgdGhlIGxpYnBuZyBzb3VyY2UgZmlsZXMuCi0KLUxpYnBuZyBpcyB0aHJlYWQgc2FmZSwgcHJvdmlkZWQgdGhlIHRocmVhZHMgYXJlIHVzaW5nIGRpZmZlcmVudAotaW5zdGFuY2VzIG9mIHRoZSBzdHJ1Y3R1cmVzLiAgRWFjaCB0aHJlYWQgc2hvdWxkIGhhdmUgaXRzIG93bgotcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gaW5zdGFuY2VzLCBhbmQgdGh1cyBpdHMgb3duIGltYWdlLgotTGlicG5nIGRvZXMgbm90IHByb3RlY3QgaXRzZWxmIGFnYWluc3QgdHdvIHRocmVhZHMgdXNpbmcgdGhlCi1zYW1lIGluc3RhbmNlIG9mIGEgc3RydWN0dXJlLgotCi0uU0ggSUkuIFN0cnVjdHVyZXMKLQotVGhlcmUgYXJlIHR3byBtYWluIHN0cnVjdHVyZXMgdGhhdCBhcmUgaW1wb3J0YW50IHRvIGxpYnBuZywgcG5nX3N0cnVjdAotYW5kIHBuZ19pbmZvLiAgVGhlIGZpcnN0LCBwbmdfc3RydWN0LCBpcyBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgdGhhdAotd2lsbCBub3QsIGZvciB0aGUgbW9zdCBwYXJ0LCBiZSB1c2VkIGJ5IGEgdXNlciBleGNlcHQgYXMgdGhlIGZpcnN0Ci12YXJpYWJsZSBwYXNzZWQgdG8gZXZlcnkgbGlicG5nIGZ1bmN0aW9uIGNhbGwuCi0KLVRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLVBORyBmaWxlLiAgQXQgb25lIHRpbWUsIHRoZSBmaWVsZHMgb2YgcG5nX2luZm8gd2VyZSBpbnRlbmRlZCB0byBiZQotZGlyZWN0bHkgYWNjZXNzaWJsZSB0byB0aGUgdXNlci4gIEhvd2V2ZXIsIHRoaXMgdGVuZGVkIHRvIGNhdXNlIHByb2JsZW1zCi13aXRoIGFwcGxpY2F0aW9ucyB1c2luZyBkeW5hbWljYWxseSBsb2FkZWQgbGlicmFyaWVzLCBhbmQgYXMgYSByZXN1bHQKLWEgc2V0IG9mIGludGVyZmFjZSBmdW5jdGlvbnMgZm9yIHBuZ19pbmZvICh0aGUgcG5nX2dldF8qKCkgYW5kIHBuZ19zZXRfKigpCi1mdW5jdGlvbnMpIHdhcyBkZXZlbG9wZWQuICBUaGUgZmllbGRzIG9mIHBuZ19pbmZvIGFyZSBzdGlsbCBhdmFpbGFibGUgZm9yCi1vbGRlciBhcHBsaWNhdGlvbnMsIGJ1dCBpdCBpcyBzdWdnZXN0ZWQgdGhhdCBhcHBsaWNhdGlvbnMgdXNlIHRoZSBuZXcKLWludGVyZmFjZXMgaWYgYXQgYWxsIHBvc3NpYmxlLgotCi1BcHBsaWNhdGlvbnMgdGhhdCBkbyBtYWtlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG1lbWJlcnMgb2YgcG5nX3N0cnVjdCAoZXhjZXB0Ci1mb3IgcG5nX3B0ci0+am1wYnVmKSBtdXN0IGJlIHJlY29tcGlsZWQgd2hlbmV2ZXIgdGhlIGxpYnJhcnkgaXMgdXBkYXRlZCwKLWFuZCBhcHBsaWNhdGlvbnMgdGhhdCBtYWtlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG1lbWJlcnMgb2YgcG5nX2luZm8gbXVzdAotYmUgcmVjb21waWxlZCBpZiB0aGV5IHdlcmUgY29tcGlsZWQgb3IgbG9hZGVkIHdpdGggbGlicG5nIHZlcnNpb24gMS4wLjYsCi1pbiB3aGljaCB0aGUgbWVtYmVycyB3ZXJlIGluIGEgZGlmZmVyZW50IG9yZGVyLiAgSW4gdmVyc2lvbiAxLjAuNywgdGhlCi1tZW1iZXJzIG9mIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgcmV2ZXJ0ZWQgdG8gdGhlIG9sZCBvcmRlciwgYXMgdGhleSB3ZXJlCi1pbiB2ZXJzaW9ucyAwLjk3YyB0aHJvdWdoIDEuMC41LiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIuMC4wLCBib3RoCi1zdHJ1Y3R1cmVzIGFyZSBnb2luZyB0byBiZSBoaWRkZW4sIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIHN0cnVjdHVyZXMgd2lsbAotb25seSBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIHBuZ19nZXQvcG5nX3NldCBmdW5jdGlvbnMuCi0KLVRoZSBwbmcuaCBoZWFkZXIgZmlsZSBpcyBhbiBpbnZhbHVhYmxlIHJlZmVyZW5jZSBmb3IgcHJvZ3JhbW1pbmcgd2l0aCBsaWJwbmcuCi1BbmQgd2hpbGUgSSdtIG9uIHRoZSB0b3BpYywgbWFrZSBzdXJlIHlvdSBpbmNsdWRlIHRoZSBsaWJwbmcgaGVhZGVyIGZpbGU6Ci0KLSNpbmNsdWRlIDxwbmcuaD4KLQotLlNIIElJSS4gUmVhZGluZwotCi1XZSdsbCBub3cgd2FsayB5b3UgdGhyb3VnaCB0aGUgcG9zc2libGUgZnVuY3Rpb25zIHRvIGNhbGwgd2hlbiByZWFkaW5nCi1pbiBhIFBORyBmaWxlIHNlcXVlbnRpYWxseSwgYnJpZWZseSBleHBsYWluaW5nIHRoZSBzeW50YXggYW5kIHB1cnBvc2UKLW9mIGVhY2ggb25lLiAgU2VlIGV4YW1wbGUuYyBhbmQgcG5nLmggZm9yIG1vcmUgZGV0YWlsLiAgV2hpbGUKLXByb2dyZXNzaXZlIHJlYWRpbmcgaXMgY292ZXJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLCB5b3Ugd2lsbCBzdGlsbAotbmVlZCBzb21lIG9mIHRoZSBmdW5jdGlvbnMgZGlzY3Vzc2VkIGluIHRoaXMgc2VjdGlvbiB0byByZWFkIGEgUE5HCi1maWxlLgotCi0uU1MgU2V0dXAKLQotWW91IHdpbGwgd2FudCB0byBkbyB0aGUgSS9PIGluaXRpYWxpemF0aW9uKCopIGJlZm9yZSB5b3UgZ2V0IGludG8gbGlicG5nLAotc28gaWYgaXQgZG9lc24ndCB3b3JrLCB5b3UgZG9uJ3QgaGF2ZSBtdWNoIHRvIHVuZG8uICBPZiBjb3Vyc2UsIHlvdQotd2lsbCBhbHNvIHdhbnQgdG8gaW5zdXJlIHRoYXQgeW91IGFyZSwgaW4gZmFjdCwgZGVhbGluZyB3aXRoIGEgUE5HCi1maWxlLiAgTGlicG5nIHByb3ZpZGVzIGEgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhIGZpbGUgaXMgYSBQTkcgZmlsZS4KLVRvIHVzZSBpdCwgcGFzcyBpbiB0aGUgZmlyc3QgMSB0byA4IGJ5dGVzIG9mIHRoZSBmaWxlIHRvIHRoZSBmdW5jdGlvbgotcG5nX3NpZ19jbXAoKSwgYW5kIGl0IHdpbGwgcmV0dXJuIDAgKGZhbHNlKSBpZiB0aGUgYnl0ZXMgbWF0Y2ggdGhlCi1jb3JyZXNwb25kaW5nIGJ5dGVzIG9mIHRoZSBQTkcgc2lnbmF0dXJlLCBvciBub256ZXJvICh0cnVlKSBvdGhlcndpc2UuCi1PZiBjb3Vyc2UsIHRoZSBtb3JlIGJ5dGVzIHlvdSBwYXNzIGluLCB0aGUgZ3JlYXRlciB0aGUgYWNjdXJhY3kgb2YgdGhlCi1wcmVkaWN0aW9uLgotCi1JZiB5b3UgYXJlIGludGVuZGluZyB0byBrZWVwIHRoZSBmaWxlIHBvaW50ZXIgb3BlbiBmb3IgdXNlIGluIGxpYnBuZywKLXlvdSBtdXN0IGVuc3VyZSB5b3UgZG9uJ3QgcmVhZCBtb3JlIHRoYW4gOCBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcKLW9mIHRoZSBmaWxlLCBhbmQgeW91IGFsc28gaGF2ZSB0byBtYWtlIGEgY2FsbCB0byBwbmdfc2V0X3NpZ19ieXRlc19yZWFkKCkKLXdpdGggdGhlIG51bWJlciBvZiBieXRlcyB5b3UgcmVhZCBmcm9tIHRoZSBiZWdpbm5pbmcuICBMaWJwbmcgd2lsbAotdGhlbiBvbmx5IGNoZWNrIHRoZSBieXRlcyAoaWYgYW55KSB0aGF0IHlvdXIgcHJvZ3JhbSBkaWRuJ3QgcmVhZC4KLQotKCopOiBJZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgc3RhbmRhcmQgSS9PIGZ1bmN0aW9ucywgeW91IHdpbGwgbmVlZAotdG8gcmVwbGFjZSB0aGVtIHdpdGggY3VzdG9tIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZGlzY3Vzc2lvbiB1bmRlcgotQ3VzdG9taXppbmcgbGlicG5nLgotCi0KLSAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIik7Ci0gICAgaWYgKCFmcCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLSAgICBmcmVhZChoZWFkZXIsIDEsIG51bWJlciwgZnApOwotICAgIGlzX3BuZyA9ICFwbmdfc2lnX2NtcChoZWFkZXIsIDAsIG51bWJlcik7Ci0gICAgaWYgKCFpc19wbmcpCi0gICAgewotICAgICAgICByZXR1cm4gKE5PVF9QTkcpOwotICAgIH0KLQotCi1OZXh0LCBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuICBJbgotb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHNpemUgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBjb3JyZWN0IGV2ZW4gd2l0aCBhCi1keW5hbWljYWxseSBsaW5rZWQgbGlicG5nLCB0aGVyZSBhcmUgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kCi1hbGxvY2F0ZSB0aGUgc3RydWN0dXJlcy4gIFdlIGFsc28gcGFzcyB0aGUgbGlicmFyeSB2ZXJzaW9uLCBvcHRpb25hbAotcG9pbnRlcnMgdG8gZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zLCBhbmQgYSBwb2ludGVyIHRvIGEgZGF0YSBzdHJ1Y3QgZm9yCi11c2UgYnkgdGhlIGVycm9yIGZ1bmN0aW9ucywgaWYgbmVjZXNzYXJ5ICh0aGUgcG9pbnRlciBhbmQgZnVuY3Rpb25zIGNhbgotYmUgTlVMTCBpZiB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVycyBhcmUgdG8gYmUgdXNlZCkuICBTZWUgdGhlIHNlY3Rpb24KLW9uIENoYW5nZXMgdG8gTGlicG5nIGJlbG93IHJlZ2FyZGluZyB0aGUgb2xkIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KLVRoZSBzdHJ1Y3R1cmUgYWxsb2NhdGlvbiBmdW5jdGlvbnMgcXVpZXRseSByZXR1cm4gTlVMTCBpZiB0aGV5IGZhaWwgdG8KLWNyZWF0ZSB0aGUgc3RydWN0dXJlLCBzbyB5b3VyIGFwcGxpY2F0aW9uIHNob3VsZCBjaGVjayBmb3IgdGhhdC4KLQotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0Ci0gICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKLSAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKLSAgICBpZiAoIXBuZ19wdHIpCi0gICAgICAgIHJldHVybiAoRVJST1IpOwotCi0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgICBpZiAoIWluZm9fcHRyKQotICAgIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsCi0gICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwsIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICBwbmdfaW5mb3AgZW5kX2luZm8gPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghZW5kX2luZm8pCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLUlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywKLWRlZmluZSBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEIGFuZCB1c2UKLXBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMigpIGluc3RlYWQgb2YgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpOgotCi0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMgotICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbiwgKHBuZ192b2lkcCkKLSAgICAgICAgdXNlcl9tZW1fcHRyLCB1c2VyX21hbGxvY19mbiwgdXNlcl9mcmVlX2ZuKTsKLQotVGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIHBhc3NlZCB0byBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCkKLWFuZCB0aGUgbWVtb3J5IGFsbG9jL2ZyZWUgcm91dGluZXMgcGFzc2VkIHRvIHBuZ19jcmVhdGVfc3RydWN0XzIoKQotYXJlIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBsaWJwbmcgc3VwcGxpZWQgZXJyb3IKLWhhbmRsaW5nIGFuZCBtZW1vcnkgYWxsb2MvZnJlZSBmdW5jdGlvbnMuCi0KLVdoZW4gbGlicG5nIGVuY291bnRlcnMgYW4gZXJyb3IsIGl0IGV4cGVjdHMgdG8gbG9uZ2ptcCBiYWNrCi10byB5b3VyIHJvdXRpbmUuICBUaGVyZWZvcmUsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBzZXRqbXAgYW5kIHBhc3MKLXlvdXIgcG5nX2ptcGJ1ZihwbmdfcHRyKS4gIElmIHlvdSByZWFkIHRoZSBmaWxlIGZyb20gZGlmZmVyZW50Ci1yb3V0aW5lcywgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlIGptcGJ1ZiBmaWVsZCBldmVyeSB0aW1lIHlvdSBlbnRlcgotYSBuZXcgcm91dGluZSB0aGF0IHdpbGwgY2FsbCBhIHBuZ18qKCkgZnVuY3Rpb24uCi0KLVNlZSB5b3VyIGRvY3VtZW50YXRpb24gb2Ygc2V0am1wL2xvbmdqbXAgZm9yIHlvdXIgY29tcGlsZXIgZm9yIG1vcmUKLWluZm9ybWF0aW9uIG9uIHNldGptcC9sb25nam1wLiAgU2VlIHRoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBlcnJvcgotaGFuZGxpbmcgaW4gdGhlIEN1c3RvbWl6aW5nIExpYnBuZyBzZWN0aW9uIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uCi1vbiB0aGUgbGlicG5nIGVycm9yIGhhbmRsaW5nLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCBhbmQgbGlicG5nIGxvbmdqbXAncwotYmFjayB0byB5b3VyIHNldGptcCwgeW91IHdpbGwgd2FudCB0byBjYWxsIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCkgdG8KLWZyZWUgYW55IG1lbW9yeS4KLQotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgICAmZW5kX2luZm8pOwotICAgICAgICBmY2xvc2UoZnApOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLUlmIHlvdSB3b3VsZCByYXRoZXIgYXZvaWQgdGhlIGNvbXBsZXhpdHkgb2Ygc2V0am1wL2xvbmdqbXAgaXNzdWVzLAoteW91IGNhbiBjb21waWxlIGxpYnBuZyB3aXRoIFBOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCwgaW4gd2hpY2ggY2FzZQotZXJyb3JzIHdpbGwgcmVzdWx0IGluIGEgY2FsbCB0byBQTkdfQUJPUlQoKSB3aGljaCBkZWZhdWx0cyB0byBhYm9ydCgpLgotCi1Ob3cgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBpbnB1dCBjb2RlLiAgVGhlIGRlZmF1bHQgZm9yIGxpYnBuZyBpcyB0bwotdXNlIHRoZSBDIGZ1bmN0aW9uIGZyZWFkKCkuICBJZiB5b3UgdXNlIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gcGFzcyBhCi12YWxpZCBGSUxFICogaW4gdGhlIGZ1bmN0aW9uIHBuZ19pbml0X2lvKCkuICBCZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMKLW9wZW5lZCBpbiBiaW5hcnkgbW9kZS4gIElmIHlvdSB3aXNoIHRvIGhhbmRsZSByZWFkaW5nIGRhdGEgaW4gYW5vdGhlcgotd2F5LCB5b3UgbmVlZCBub3QgY2FsbCB0aGUgcG5nX2luaXRfaW8oKSBmdW5jdGlvbiwgYnV0IHlvdSBtdXN0IHRoZW4KLWltcGxlbWVudCB0aGUgbGlicG5nIEkvTyBtZXRob2RzIGRpc2N1c3NlZCBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nCi1zZWN0aW9uIGJlbG93LgotCi0gICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOwotCi1JZiB5b3UgaGFkIHByZXZpb3VzbHkgb3BlbmVkIHRoZSBmaWxlIGFuZCByZWFkIGFueSBvZiB0aGUgc2lnbmF0dXJlIGZyb20KLXRoZSBiZWdpbm5pbmcgaW4gb3JkZXIgdG8gc2VlIGlmIHRoaXMgd2FzIGEgUE5HIGZpbGUsIHlvdSBuZWVkIHRvIGxldAotbGlicG5nIGtub3cgdGhhdCB0aGVyZSBhcmUgc29tZSBieXRlcyBtaXNzaW5nIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotCi0gICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgbnVtYmVyKTsKLQotLlNTIFNldHRpbmcgdXAgY2FsbGJhY2sgY29kZQotCi1Zb3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBhbnkgdW5rbm93biBjaHVua3MgaW4gdGhlCi1pbnB1dCBzdHJlYW0uIFlvdSBtdXN0IHN1cHBseSB0aGUgZnVuY3Rpb24KLQotICAgIHJlYWRfY2h1bmtfY2FsbGJhY2socG5nX3B0ciBwdHIsCi0gICAgICAgICBwbmdfdW5rbm93bl9jaHVua3AgY2h1bmspOwotICAgIHsKLSAgICAgICAvKiBUaGUgdW5rbm93biBjaHVuayBzdHJ1Y3R1cmUgY29udGFpbnMgeW91cgotICAgICAgICAgIGNodW5rIGRhdGEsIGFsb25nIHdpdGggc2ltaWxhciBkYXRhIGZvciBhbnkgb3RoZXIKLSAgICAgICAgICB1bmtub3duIGNodW5rczogKi8KLQotICAgICAgICAgICBwbmdfYnl0ZSBuYW1lWzVdOwotICAgICAgICAgICBwbmdfYnl0ZSAqZGF0YTsKLSAgICAgICAgICAgcG5nX3NpemVfdCBzaXplOwotCi0gICAgICAgLyogTm90ZSB0aGF0IGxpYnBuZyBoYXMgYWxyZWFkeSB0YWtlbiBjYXJlIG9mCi0gICAgICAgICAgdGhlIENSQyBoYW5kbGluZyAqLwotCi0gICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlLiAgU2VhcmNoIGZvciB5b3VyIGNodW5rIGluIHRoZQotICAgICAgICAgIHVua25vd24gY2h1bmsgc3RydWN0dXJlLCBwcm9jZXNzIGl0LCBhbmQgcmV0dXJuIG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmc6ICovCi0KLSAgICAgICByZXR1cm4gKC1uKTsgLyogY2h1bmsgaGFkIGFuIGVycm9yICovCi0gICAgICAgcmV0dXJuICgwKTsgLyogZGlkIG5vdCByZWNvZ25pemUgKi8KLSAgICAgICByZXR1cm4gKG4pOyAvKiBzdWNjZXNzICovCi0gICAgfQotCi0oWW91IGNhbiBnaXZlIHlvdXIgZnVuY3Rpb24gYW5vdGhlciBuYW1lIHRoYXQgeW91IGxpa2UgaW5zdGVhZCBvZgotInJlYWRfY2h1bmtfY2FsbGJhY2siKQotCi1UbyBpbmZvcm0gbGlicG5nIGFib3V0IHlvdXIgZnVuY3Rpb24sIHVzZQotCi0gICAgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4ocG5nX3B0ciwgdXNlcl9jaHVua19wdHIsCi0gICAgICAgIHJlYWRfY2h1bmtfY2FsbGJhY2spOwotCi1UaGlzIG5hbWVzIG5vdCBvbmx5IHRoZSBjYWxsYmFjayBmdW5jdGlvbiwgYnV0IGFsc28gYSB1c2VyIHBvaW50ZXIgdGhhdAoteW91IGNhbiByZXRyaWV2ZSB3aXRoCi0KLSAgICBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyKHBuZ19wdHIpOwotCi1JZiB5b3UgY2FsbCB0aGUgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4oKSBmdW5jdGlvbiwgdGhlbiBhbGwgdW5rbm93bgotY2h1bmtzIHdpbGwgYmUgc2F2ZWQgd2hlbiByZWFkLCBpbiBjYXNlIHlvdXIgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBuZWVkCi1vbmUgb3IgbW9yZSBvZiB0aGVtLiAgVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCB3aXRoIHRoZQotcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCkgZnVuY3Rpb24sIGRlc2NyaWJlZCBiZWxvdy4KLQotQXQgdGhpcyBwb2ludCwgeW91IGNhbiBzZXQgdXAgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUKLWNhbGxlZCBhZnRlciBlYWNoIHJvdyBoYXMgYmVlbiByZWFkLCB3aGljaCB5b3UgY2FuIHVzZSB0byBjb250cm9sCi1hIHByb2dyZXNzIG1ldGVyIG9yIHRoZSBsaWtlLiAgSXQncyBkZW1vbnN0cmF0ZWQgaW4gcG5ndGVzdC5jLgotWW91IG11c3Qgc3VwcGx5IGEgZnVuY3Rpb24KLQotICAgIHZvaWQgcmVhZF9yb3dfY2FsbGJhY2socG5nX3B0ciBwdHIsIHBuZ191aW50XzMyIHJvdywKLSAgICAgICBpbnQgcGFzcyk7Ci0gICAgewotICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlICovCi0gICAgfQotCi0oWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSB0aGF0IHlvdSBsaWtlIGluc3RlYWQgb2YgInJlYWRfcm93X2NhbGxiYWNrIikKLQotVG8gaW5mb3JtIGxpYnBuZyBhYm91dCB5b3VyIGZ1bmN0aW9uLCB1c2UKLQotICAgIHBuZ19zZXRfcmVhZF9zdGF0dXNfZm4ocG5nX3B0ciwgcmVhZF9yb3dfY2FsbGJhY2spOwotCi0uU1MgV2lkdGggYW5kIGhlaWdodCBsaW1pdHMKLQotVGhlIFBORyBzcGVjaWZpY2F0aW9uIGFsbG93cyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBhbiBpbWFnZSB0byBiZSBhcwotbGFyZ2UgYXMgMl4zMS0xICgweDdmZmZmZmZmKSwgb3IgYWJvdXQgMi4xNDcgYmlsbGlvbiByb3dzIGFuZCBjb2x1bW5zLgotU2luY2UgdmVyeSBmZXcgYXBwbGljYXRpb25zIHJlYWxseSBuZWVkIHRvIHByb2Nlc3Mgc3VjaCBsYXJnZSBpbWFnZXMsCi13ZSBoYXZlIGltcG9zZWQgYW4gYXJiaXRyYXJ5IDEtbWlsbGlvbiBsaW1pdCBvbiByb3dzIGFuZCBjb2x1bW5zLgotTGFyZ2VyIGltYWdlcyB3aWxsIGJlIHJlamVjdGVkIGltbWVkaWF0ZWx5IHdpdGggYSBwbmdfZXJyb3IoKSBjYWxsLiBJZgoteW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBsaW1pdCwgeW91IGNhbiB1c2UKLQotICAgcG5nX3NldF91c2VyX2xpbWl0cyhwbmdfcHRyLCB3aWR0aF9tYXgsIGhlaWdodF9tYXgpOwotCi10byBzZXQgeW91ciBvd24gbGltaXRzLCBvciB1c2Ugd2lkdGhfbWF4ID0gaGVpZ2h0X21heCA9IDB4N2ZmZmZmZmZMCi10byBhbGxvdyBhbGwgdmFsaWQgZGltZW5zaW9ucyAobGlicG5nIG1heSByZWplY3Qgc29tZSB2ZXJ5IGxhcmdlIGltYWdlcwotYW55d2F5IGJlY2F1c2Ugb2YgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdyBjb25kaXRpb25zKS4KLQotWW91IHNob3VsZCBwdXQgdGhpcyBzdGF0ZW1lbnQgYWZ0ZXIgeW91IGNyZWF0ZSB0aGUgUE5HIHN0cnVjdHVyZSBhbmQKLWJlZm9yZSBjYWxsaW5nIHBuZ19yZWFkX2luZm8oKSwgcG5nX3JlYWRfcG5nKCksIG9yIHBuZ19wcm9jZXNzX2RhdGEoKS4KLUlmIHlvdSBuZWVkIHRvIHJldHJpZXZlIHRoZSBsaW1pdHMgdGhhdCBhcmUgYmVpbmcgYXBwbGllZCwgdXNlCi0KLSAgIHdpZHRoX21heCA9IHBuZ19nZXRfdXNlcl93aWR0aF9tYXgocG5nX3B0cik7Ci0gICBoZWlnaHRfbWF4ID0gcG5nX2dldF91c2VyX2hlaWdodF9tYXgocG5nX3B0cik7Ci0KLS5TUyBVbmtub3duLWNodW5rIGhhbmRsaW5nCi0KLU5vdyB5b3UgZ2V0IHRvIHNldCB0aGUgd2F5IHRoZSBsaWJyYXJ5IHByb2Nlc3NlcyB1bmtub3duIGNodW5rcyBpbiB0aGUKLWlucHV0IFBORyBzdHJlYW0uIEJvdGgga25vd24gYW5kIHVua25vd24gY2h1bmtzIHdpbGwgYmUgcmVhZC4gIE5vcm1hbAotYmVoYXZpb3IgaXMgdGhhdCBrbm93biBjaHVua3Mgd2lsbCBiZSBwYXJzZWQgaW50byBpbmZvcm1hdGlvbiBpbgotdmFyaW91cyBpbmZvX3B0ciBtZW1iZXJzIHdoaWxlIHVua25vd24gY2h1bmtzIHdpbGwgYmUgZGlzY2FyZGVkLiBUaGlzCi1iZWhhdmlvciBjYW4gYmUgd2FzdGVmdWwgaWYgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIHVzZSBzb21lIGtub3duCi1jaHVuayB0eXBlcy4gVG8gY2hhbmdlIHRoaXMsIHlvdSBjYW4gY2FsbDoKLQotICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBrZWVwLAotICAgICAgICBjaHVua19saXN0LCBudW1fY2h1bmtzKTsKLSAgICBrZWVwICAgICAgIC0gMDogZGVmYXVsdCB1bmtub3duIGNodW5rIGhhbmRsaW5nCi0gICAgICAgICAgICAgICAgIDE6IGlnbm9yZTsgZG8gbm90IGtlZXAKLSAgICAgICAgICAgICAgICAgMjoga2VlcCBvbmx5IGlmIHNhZmUtdG8tY29weQotICAgICAgICAgICAgICAgICAzOiBrZWVwIGV2ZW4gaWYgdW5zYWZlLXRvLWNvcHkKLSAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoZXNlIGRlZmluaXRpb25zOgotICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQgICAwCi0gICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgICAgICAgIDEKLSAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICAgICAgMgotICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyAgICAgICAzCi0gICAgY2h1bmtfbGlzdCAtIGxpc3Qgb2YgY2h1bmtzIGFmZmVjdGVkIChhIGJ5dGUgc3RyaW5nLAotICAgICAgICAgICAgICAgICBmaXZlIGJ5dGVzIHBlciBjaHVuaywgTlVMTCBvciAnXDAnIGlmCi0gICAgICAgICAgICAgICAgIG51bV9jaHVua3MgaXMgMCkKLSAgICBudW1fY2h1bmtzIC0gbnVtYmVyIG9mIGNodW5rcyBhZmZlY3RlZDsgaWYgMCwgYWxsCi0gICAgICAgICAgICAgICAgIHVua25vd24gY2h1bmtzIGFyZSBhZmZlY3RlZC4gIElmIG5vbnplcm8sCi0gICAgICAgICAgICAgICAgIG9ubHkgdGhlIGNodW5rcyBpbiB0aGUgbGlzdCBhcmUgYWZmZWN0ZWQKLQotVW5rbm93biBjaHVua3MgZGVjbGFyZWQgaW4gdGhpcyB3YXkgd2lsbCBiZSBzYXZlZCBhcyByYXcgZGF0YSBvbnRvIGEKLWxpc3Qgb2YgcG5nX3Vua25vd25fY2h1bmsgc3RydWN0dXJlcy4gIElmIGEgY2h1bmsgdGhhdCBpcyBub3JtYWxseQota25vd24gdG8gbGlicG5nIGlzIG5hbWVkIGluIHRoZSBsaXN0LCBpdCB3aWxsIGJlIGhhbmRsZWQgYXMgdW5rbm93biwKLWFjY29yZGluZyB0byB0aGUgImtlZXAiIGRpcmVjdGl2ZS4gIElmIGEgY2h1bmsgaXMgbmFtZWQgaW4gc3VjY2Vzc2l2ZQotaW5zdGFuY2VzIG9mIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpLCB0aGUgZmluYWwgaW5zdGFuY2Ugd2lsbAotdGFrZSBwcmVjZWRlbmNlLiAgVGhlIElIRFIgYW5kIElFTkQgY2h1bmtzIHNob3VsZCBub3QgYmUgbmFtZWQgaW4KLWNodW5rX2xpc3Q7IGlmIHRoZXkgYXJlLCBsaWJwbmcgd2lsbCBwcm9jZXNzIHRoZW0gbm9ybWFsbHkgYW55d2F5LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIHVzYWdlIG9mIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpLAotd2hlcmUgdGhlIHByaXZhdGUgInZwQWciIGNodW5rIHdpbGwgbGF0ZXIgYmUgcHJvY2Vzc2VkIGJ5IGEgdXNlciBjaHVuawotY2FsbGJhY2sgZnVuY3Rpb246Ci0KLSAgICBwbmdfYnl0ZSB2cEFnWzVdPXsxMTgsIDExMiwgIDY1LCAxMDMsIChwbmdfYnl0ZSkgJ1wwJ307Ci0KLSAgICAjaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotICAgICAgcG5nX2J5dGUgdW51c2VkX2NodW5rc1tdPQotICAgICAgewotICAgICAgICAxMDQsICA3MywgIDgzLCAgODQsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBoSVNUICovCi0gICAgICAgIDEwNSwgIDg0LCAgODgsIDExNiwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIGlUWHQgKi8KLSAgICAgICAgMTEyLCAgNjcsICA2NSwgIDc2LCAocG5nX2J5dGUpICdcMCcsICAgLyogcENBTCAqLwotICAgICAgICAxMTUsICA2NywgIDY1LCAgNzYsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBzQ0FMICovCi0gICAgICAgIDExNSwgIDgwLCAgNzYsICA4NCwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHNQTFQgKi8KLSAgICAgICAgMTE2LCAgNzMsICA3NywgIDY5LCAocG5nX2J5dGUpICdcMCcsICAgLyogdElNRSAqLwotICAgICAgfTsKLSAgICAjZW5kaWYKLQotICAgIC4uLgotCi0gICAgI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgICAgIC8qIGlnbm9yZSBhbGwgdW5rbm93biBjaHVua3M6ICovCi0gICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDEsIE5VTEwsIDApOwotICAgICAgLyogZXhjZXB0IGZvciB2cEFnOiAqLwotICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCAyLCB2cEFnLCAxKTsKLSAgICAgIC8qIGFsc28gaWdub3JlIHVudXNlZCBrbm93biBjaHVua3M6ICovCi0gICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDEsIHVudXNlZF9jaHVua3MsCi0gICAgICAgICAoaW50KXNpemVvZih1bnVzZWRfY2h1bmtzKS81KTsKLSAgICAjZW5kaWYKLQotLlNTIFVzZXIgbGltaXRzCi0KLVRoZSBQTkcgc3BlY2lmaWNhdGlvbiBhbGxvd3MgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYW4gaW1hZ2UgdG8gYmUgYXMKLWxhcmdlIGFzIDJeMzEtMSAoMHg3ZmZmZmZmZiksIG9yIGFib3V0IDIuMTQ3IGJpbGxpb24gcm93cyBhbmQgY29sdW1ucy4KLVNpbmNlIHZlcnkgZmV3IGFwcGxpY2F0aW9ucyByZWFsbHkgbmVlZCB0byBwcm9jZXNzIHN1Y2ggbGFyZ2UgaW1hZ2VzLAotd2UgaGF2ZSBpbXBvc2VkIGFuIGFyYml0cmFyeSAxLW1pbGxpb24gbGltaXQgb24gcm93cyBhbmQgY29sdW1ucy4KLUxhcmdlciBpbWFnZXMgd2lsbCBiZSByZWplY3RlZCBpbW1lZGlhdGVseSB3aXRoIGEgcG5nX2Vycm9yKCkgY2FsbC4gSWYKLXlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbGltaXQsIHlvdSBjYW4gdXNlCi0KLSAgIHBuZ19zZXRfdXNlcl9saW1pdHMocG5nX3B0ciwgd2lkdGhfbWF4LCBoZWlnaHRfbWF4KTsKLQotdG8gc2V0IHlvdXIgb3duIGxpbWl0cywgb3IgdXNlIHdpZHRoX21heCA9IGhlaWdodF9tYXggPSAweDdmZmZmZmZmTAotdG8gYWxsb3cgYWxsIHZhbGlkIGRpbWVuc2lvbnMgKGxpYnBuZyBtYXkgcmVqZWN0IHNvbWUgdmVyeSBsYXJnZSBpbWFnZXMKLWFueXdheSBiZWNhdXNlIG9mIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgY29uZGl0aW9ucykuCi0KLVlvdSBzaG91bGQgcHV0IHRoaXMgc3RhdGVtZW50IGFmdGVyIHlvdSBjcmVhdGUgdGhlIFBORyBzdHJ1Y3R1cmUgYW5kCi1iZWZvcmUgY2FsbGluZyBwbmdfcmVhZF9pbmZvKCksIHBuZ19yZWFkX3BuZygpLCBvciBwbmdfcHJvY2Vzc19kYXRhKCkuCi1JZiB5b3UgbmVlZCB0byByZXRyaWV2ZSB0aGUgbGltaXRzIHRoYXQgYXJlIGJlaW5nIGFwcGxpZWQsIHVzZQotCi0gICB3aWR0aF9tYXggPSBwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4KHBuZ19wdHIpOwotICAgaGVpZ2h0X21heCA9IHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4KHBuZ19wdHIpOwotCi0uU1MgVGhlIGhpZ2gtbGV2ZWwgcmVhZCBpbnRlcmZhY2UKLQotQXQgdGhpcyBwb2ludCB0aGVyZSBhcmUgdHdvIHdheXMgdG8gcHJvY2VlZDsgdGhyb3VnaCB0aGUgaGlnaC1sZXZlbAotcmVhZCBpbnRlcmZhY2UsIG9yIHRocm91Z2ggYSBzZXF1ZW5jZSBvZiBsb3ctbGV2ZWwgcmVhZCBvcGVyYXRpb25zLgotWW91IGNhbiB1c2UgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGlmIChhKSB5b3UgYXJlIHdpbGxpbmcgdG8gcmVhZAotdGhlIGVudGlyZSBpbWFnZSBpbnRvIG1lbW9yeSwgYW5kIChiKSB0aGUgaW5wdXQgdHJhbnNmb3JtYXRpb25zCi15b3Ugd2FudCB0byBkbyBhcmUgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIHNldDoKLQotICAgIFBOR19UUkFOU0ZPUk1fSURFTlRJVFkgICAgICBObyB0cmFuc2Zvcm1hdGlvbgotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgICAgICBTdHJpcCAxNi1iaXQgc2FtcGxlcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IGJpdHMKLSAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0FMUEhBICAgRGlzY2FyZCB0aGUgYWxwaGEgY2hhbm5lbAotICAgIFBOR19UUkFOU0ZPUk1fUEFDS0lORyAgICAgICBFeHBhbmQgMSwgMiBhbmQgNC1iaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyB0byBieXRlcwotICAgIFBOR19UUkFOU0ZPUk1fUEFDS1NXQVAgICAgICBDaGFuZ2Ugb3JkZXIgb2YgcGFja2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyB0byBMU0IgZmlyc3QKLSAgICBQTkdfVFJBTlNGT1JNX0VYUEFORCAgICAgICAgUGVyZm9ybSBzZXRfZXhwYW5kKCkKLSAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PICAgSW52ZXJ0IG1vbm9jaHJvbWUgaW1hZ2VzCi0gICAgUE5HX1RSQU5TRk9STV9TSElGVCAgICAgICAgIE5vcm1hbGl6ZSBwaXhlbHMgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCSVQgZGVwdGgKLSAgICBQTkdfVFJBTlNGT1JNX0JHUiAgICAgICAgICAgRmxpcCBSR0IgdG8gQkdSLCBSR0JBCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEJHUkEKLSAgICBQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEgICAgRmxpcCBSR0JBIHRvIEFSR0Igb3IgR0EKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQUcKLSAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSAgQ2hhbmdlIGFscGhhIGZyb20gb3BhY2l0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0cmFuc3BhcmVuY3kKLSAgICBQTkdfVFJBTlNGT1JNX1NXQVBfRU5ESUFOICAgQnl0ZS1zd2FwIDE2LWJpdCBzYW1wbGVzCi0KLShUaGlzIGV4Y2x1ZGVzIHNldHRpbmcgYSBiYWNrZ3JvdW5kIGNvbG9yLCBkb2luZyBnYW1tYSB0cmFuc2Zvcm1hdGlvbiwKLWRpdGhlcmluZywgYW5kIHNldHRpbmcgZmlsbGVyLikgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHNpbXBseSBkbyB0aGlzOgotCi0gICAgcG5nX3JlYWRfcG5nKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfdHJhbnNmb3JtcywgTlVMTCkKLQotd2hlcmUgcG5nX3RyYW5zZm9ybXMgaXMgYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mCi1zb21lIHNldCBvZiB0cmFuc2Zvcm1hdGlvbiBmbGFncy4gIFRoaXMgY2FsbCBpcyBlcXVpdmFsZW50IHRvIHBuZ19yZWFkX2luZm8oKSwKLWZvbGxvd2VkIHRoZSBzZXQgb2YgdHJhbnNmb3JtYXRpb25zIGluZGljYXRlZCBieSB0aGUgdHJhbnNmb3JtIG1hc2ssCi10aGVuIHBuZ19yZWFkX2ltYWdlKCksIGFuZCBmaW5hbGx5IHBuZ19yZWFkX2VuZCgpLgotCi0oVGhlIGZpbmFsIHBhcmFtZXRlciBvZiB0aGlzIGNhbGwgaXMgbm90IHlldCB1c2VkLiAgU29tZWRheSBpdCBtaWdodCBwb2ludAotdG8gdHJhbnNmb3JtYXRpb24gcGFyYW1ldGVycyByZXF1aXJlZCBieSBzb21lIGZ1dHVyZSBpbnB1dCB0cmFuc2Zvcm0uKQotCi1Zb3UgbXVzdCB1c2UgcG5nX3RyYW5zZm9ybXMgYW5kIG5vdCBjYWxsIGFueSBwbmdfc2V0X3RyYW5zZm9ybSgpIGZ1bmN0aW9ucwotd2hlbiB5b3UgdXNlIHBuZ19yZWFkX3BuZygpLgotCi1BZnRlciB5b3UgaGF2ZSBjYWxsZWQgcG5nX3JlYWRfcG5nKCksIHlvdSBjYW4gcmV0cmlldmUgdGhlIGltYWdlIGRhdGEKLXdpdGgKLQotICAgcm93X3BvaW50ZXJzID0gcG5nX2dldF9yb3dzKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotd2hlcmUgcm93X3BvaW50ZXJzIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHRoZSBwaXhlbCBkYXRhIGZvciBlYWNoIHJvdzoKLQotICAgcG5nX2J5dGVwIHJvd19wb2ludGVyc1toZWlnaHRdOwotCi1JZiB5b3Uga25vdyB5b3VyIGltYWdlIHNpemUgYW5kIHBpeGVsIHNpemUgYWhlYWQgb2YgdGltZSwgeW91IGNhbiBhbGxvY2F0ZQotcm93X3BvaW50ZXJzIHByaW9yIHRvIGNhbGxpbmcgcG5nX3JlYWRfcG5nKCkgd2l0aAotCi0gICBpZiAoaGVpZ2h0ID4gUE5HX1VJTlRfMzJfTUFYL3BuZ19zaXplb2YocG5nX2J5dGUpKQotICAgICAgcG5nX2Vycm9yIChwbmdfcHRyLAotICAgICAgICAgIkltYWdlIGlzIHRvbyB0YWxsIHRvIHByb2Nlc3MgaW4gbWVtb3J5Iik7Ci0gICBpZiAod2lkdGggPiBQTkdfVUlOVF8zMl9NQVgvcGl4ZWxfc2l6ZSkKLSAgICAgIHBuZ19lcnJvciAocG5nX3B0ciwKLSAgICAgICAgICJJbWFnZSBpcyB0b28gd2lkZSB0byBwcm9jZXNzIGluIG1lbW9yeSIpOwotICAgcm93X3BvaW50ZXJzID0gcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgaGVpZ2h0KnBuZ19zaXplb2YocG5nX2J5dGVwKSk7Ci0gICBmb3IgKGludCBpPTA7IGk8aGVpZ2h0LCBpKyspCi0gICAgICByb3dfcG9pbnRlcnNbaV09TlVMTDsgIC8qIHNlY3VyaXR5IHByZWNhdXRpb24gKi8KLSAgIGZvciAoaW50IGk9MDsgaTxoZWlnaHQsIGkrKykKLSAgICAgIHJvd19wb2ludGVyc1tpXT1wbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICB3aWR0aCpwaXhlbF9zaXplKTsKLSAgIHBuZ19zZXRfcm93cyhwbmdfcHRyLCBpbmZvX3B0ciwgJnJvd19wb2ludGVycyk7Ci0KLUFsdGVybmF0aXZlbHkgeW91IGNvdWxkIGFsbG9jYXRlIHlvdXIgaW1hZ2UgaW4gb25lIGJpZyBibG9jayBhbmQgZGVmaW5lCi1yb3dfcG9pbnRlcnNbaV0gdG8gcG9pbnQgaW50byB0aGUgcHJvcGVyIHBsYWNlcyBpbiB5b3VyIGJsb2NrLgotCi1JZiB5b3UgdXNlIHBuZ19zZXRfcm93cygpLCB0aGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcKLXJvd19wb2ludGVycyAoYW5kIHJvd19wb2ludGVyc1tpXSwgaWYgdGhleSB3ZXJlIHNlcGFyYXRlbHkgYWxsb2NhdGVkKS4KLQotSWYgeW91IGRvbid0IGFsbG9jYXRlIHJvd19wb2ludGVycyBhaGVhZCBvZiB0aW1lLCBwbmdfcmVhZF9wbmcoKSB3aWxsCi1kbyBpdCwgYW5kIGl0J2xsIGJlIGZyZWUnZWQgd2hlbiB5b3UgY2FsbCBwbmdfZGVzdHJveV8qKCkuCi0KLS5TUyBUaGUgbG93LWxldmVsIHJlYWQgaW50ZXJmYWNlCi0KLUlmIHlvdSBhcmUgZ29pbmcgdGhlIGxvdy1sZXZlbCByb3V0ZSwgeW91IGFyZSBub3cgcmVhZHkgdG8gcmVhZCBhbGwKLXRoZSBmaWxlIGluZm9ybWF0aW9uIHVwIHRvIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFlvdSBkbyB0aGlzIHdpdGggYQotY2FsbCB0byBwbmdfcmVhZF9pbmZvKCkuCi0KLSAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotVGhpcyB3aWxsIHByb2Nlc3MgYWxsIGNodW5rcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgaW1hZ2UgZGF0YS4KLQotLlNTIFF1ZXJ5aW5nIHRoZSBpbmZvIHN0cnVjdHVyZQotCi1GdW5jdGlvbnMgYXJlIHVzZWQgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbmZvX3B0ciBvbmNlIGl0Ci1oYXMgYmVlbiByZWFkLiAgTm90ZSB0aGF0IHRoZXNlIGZpZWxkcyBtYXkgbm90IGJlIGNvbXBsZXRlbHkgZmlsbGVkCi1pbiB1bnRpbCBwbmdfcmVhZF9lbmQoKSBoYXMgcmVhZCB0aGUgY2h1bmsgZGF0YSBmb2xsb3dpbmcgdGhlIGltYWdlLgotCi0gICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsCi0gICAgICAgJmJpdF9kZXB0aCwgJmNvbG9yX3R5cGUsICZpbnRlcmxhY2VfdHlwZSwKLSAgICAgICAmY29tcHJlc3Npb25fdHlwZSwgJmZpbHRlcl9tZXRob2QpOwotCi0gICAgd2lkdGggICAgICAgICAgLSBob2xkcyB0aGUgd2lkdGggb2YgdGhlIGltYWdlCi0gICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgotICAgIGhlaWdodCAgICAgICAgIC0gaG9sZHMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGluIHBpeGVscyAodXAgdG8gMl4zMSkuCi0gICAgYml0X2RlcHRoICAgICAgLSBob2xkcyB0aGUgYml0IGRlcHRoIG9mIG9uZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGltYWdlIGNoYW5uZWxzLiAgKHZhbGlkIHZhbHVlcyBhcmUKLSAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDQsIDgsIDE2IGFuZCBkZXBlbmQgYWxzbyBvbgotICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbG9yX3R5cGUuICBTZWUgYWxzbwotICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQgYml0cyAoc0JJVCkgYmVsb3cpLgotICAgIGNvbG9yX3R5cGUgICAgIC0gZGVzY3JpYmVzIHdoaWNoIGNvbG9yL2FscGhhIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCkKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQgotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQotCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUgotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQUxQSEEKLQotICAgIGZpbHRlcl9tZXRob2QgIC0gKG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0JBU0UKLSAgICAgICAgICAgICAgICAgICAgIGZvciBQTkcgMS4wLCBhbmQgY2FuIGFsc28gYmUKLSAgICAgICAgICAgICAgICAgICAgIFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORyBpZgotICAgICAgICAgICAgICAgICAgICAgdGhlIFBORyBkYXRhc3RyZWFtIGlzIGVtYmVkZGVkIGluCi0gICAgICAgICAgICAgICAgICAgICBhIE1ORy0xLjAgZGF0YXN0cmVhbSkKLSAgICBjb21wcmVzc2lvbl90eXBlIC0gKG11c3QgYmUgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRQotICAgICAgICAgICAgICAgICAgICAgZm9yIFBORyAxLjApCi0gICAgaW50ZXJsYWNlX3R5cGUgLSAoUE5HX0lOVEVSTEFDRV9OT05FIG9yCi0gICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03KQotICAgIEFueSBvciBhbGwgb2YgaW50ZXJsYWNlX3R5cGUsIGNvbXByZXNzaW9uX3R5cGUsIG9mCi0gICAgZmlsdGVyX21ldGhvZCBjYW4gYmUgTlVMTCBpZiB5b3UgYXJlCi0gICAgbm90IGludGVyZXN0ZWQgaW4gdGhlaXIgdmFsdWVzLgotCi0gICAgY2hhbm5lbHMgPSBwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICBjaGFubmVscyAgICAgICAtIG51bWJlciBvZiBjaGFubmVscyBvZiBpbmZvIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGNvbG9yIHR5cGUgKHZhbGlkIHZhbHVlcyBhcmUgMSAoR1JBWSwKLSAgICAgICAgICAgICAgICAgICAgIFBBTEVUVEUpLCAyIChHUkFZX0FMUEhBKSwgMyAoUkdCKSwKLSAgICAgICAgICAgICAgICAgICAgIDQgKFJHQl9BTFBIQSBvciBSR0IgKyBmaWxsZXIgYnl0ZSkpCi0gICAgcm93Ynl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICByb3dieXRlcyAgICAgICAtIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gaG9sZCBhIHJvdwotCi0gICAgc2lnbmF0dXJlID0gcG5nX2dldF9zaWduYXR1cmUocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIHNpZ25hdHVyZSAgICAgIC0gaG9sZHMgdGhlIHNpZ25hdHVyZSByZWFkIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICBmaWxlIChpZiBhbnkpLiAgVGhlIGRhdGEgaXMga2VwdCBpbgotICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgb2Zmc2V0IGl0IHdvdWxkIGJlIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgd2hvbGUgc2lnbmF0dXJlIHdlcmUgcmVhZCAoaS5lLiBpZiBhbgotICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gaGFkIGFscmVhZHkgcmVhZCBpbiA0Ci0gICAgICAgICAgICAgICAgICAgICBieXRlcyBvZiBzaWduYXR1cmUgYmVmb3JlIHN0YXJ0aW5nCi0gICAgICAgICAgICAgICAgICAgICBsaWJwbmcsIHRoZSByZW1haW5pbmcgNCBieXRlcyB3b3VsZAotICAgICAgICAgICAgICAgICAgICAgYmUgaW4gc2lnbmF0dXJlWzRdIHRocm91Z2ggc2lnbmF0dXJlWzddCi0gICAgICAgICAgICAgICAgICAgICAoc2VlIHBuZ19zZXRfc2lnX2J5dGVzKCkpKS4KLQotCi0gICAgd2lkdGggICAgICAgICAgICA9IHBuZ19nZXRfaW1hZ2Vfd2lkdGgocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0gICAgaGVpZ2h0ICAgICAgICAgICA9IHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotICAgIGJpdF9kZXB0aCAgICAgICAgPSBwbmdfZ2V0X2JpdF9kZXB0aChwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKLSAgICBjb2xvcl90eXBlICAgICAgID0gcG5nX2dldF9jb2xvcl90eXBlKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotICAgIGZpbHRlcl9tZXRob2QgICAgPSBwbmdfZ2V0X2ZpbHRlcl90eXBlKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotICAgIGNvbXByZXNzaW9uX3R5cGUgPSBwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0gICAgaW50ZXJsYWNlX3R5cGUgICA9IHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0KLQotVGhlc2UgYXJlIGFsc28gaW1wb3J0YW50LCBidXQgdGhlaXIgdmFsaWRpdHkgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBjaHVuawotaGFzIGJlZW4gcmVhZC4gIFRoZSBwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT188Y2h1bms+KSBhbmQKLXBuZ19nZXRfPGNodW5rPihwbmdfcHRyLCBpbmZvX3B0ciwgLi4uKSBmdW5jdGlvbnMgcmV0dXJuIG5vbi16ZXJvIGlmIHRoZQotZGF0YSBoYXMgYmVlbiByZWFkLCBvciB6ZXJvIGlmIGl0IGlzIG1pc3NpbmcuICBUaGUgcGFyYW1ldGVycyB0byB0aGUKLXBuZ19nZXRfPGNodW5rPiBhcmUgc2V0IGRpcmVjdGx5IGlmIHRoZXkgYXJlIHNpbXBsZSBkYXRhIHR5cGVzLCBvciBhIHBvaW50ZXIKLWludG8gdGhlIGluZm9fcHRyIGlzIHJldHVybmVkIGZvciBhbnkgY29tcGxleCB0eXBlcy4KLQotICAgIHBuZ19nZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAmbnVtX3BhbGV0dGUpOwotICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQotICAgIG51bV9wYWxldHRlICAgIC0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBhbGV0dGUKLQotICAgIHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmdhbW1hKTsKLSAgICBnYW1tYSAgICAgICAgICAtIHRoZSBnYW1tYSB0aGUgZmlsZSBpcyB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICBhdCAoUE5HX0lORk9fZ0FNQSkKLQotICAgIHBuZ19nZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgJnNyZ2JfaW50ZW50KTsKLSAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50IChQTkdfSU5GT19zUkdCKQotICAgICAgICAgICAgICAgICAgICAgVGhlIHByZXNlbmNlIG9mIHRoZSBzUkdCIGNodW5rCi0gICAgICAgICAgICAgICAgICAgICBtZWFucyB0aGF0IHRoZSBwaXhlbCBkYXRhIGlzIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgc1JHQiBjb2xvciBzcGFjZS4gIFRoaXMgY2h1bmsgYWxzbwotICAgICAgICAgICAgICAgICAgICAgaW1wbGllcyBzcGVjaWZpYyB2YWx1ZXMgb2YgZ0FNQSBhbmQKLSAgICAgICAgICAgICAgICAgICAgIGNIUk0uCi0KLSAgICBwbmdfZ2V0X2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsICZuYW1lLAotICAgICAgICZjb21wcmVzc2lvbl90eXBlLCAmcHJvZmlsZSwgJnByb2ZsZW4pOwotICAgIG5hbWUgICAgICAgICAgICAtIFRoZSBwcm9maWxlIG5hbWUuCi0gICAgY29tcHJlc3Npb24gICAgIC0gVGhlIGNvbXByZXNzaW9uIHR5cGU7IGFsd2F5cwotICAgICAgICAgICAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgZm9yIFBORyAxLjAuCi0gICAgICAgICAgICAgICAgICAgICAgWW91IG1heSBnaXZlIE5VTEwgdG8gdGhpcyBhcmd1bWVudCB0bwotICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSBpdC4KLSAgICBwcm9maWxlICAgICAgICAgLSBJbnRlcm5hdGlvbmFsIENvbG9yIENvbnNvcnRpdW0gY29sb3IKLSAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlIGRhdGEuIE1heSBjb250YWluIE5VTHMuCi0gICAgcHJvZmxlbiAgICAgICAgIC0gbGVuZ3RoIG9mIHByb2ZpbGUgZGF0YSBpbiBieXRlcy4KLQotICAgIHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOwotICAgIHNpZ19iaXQgICAgICAgIC0gdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGZvcgotICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3NCSVQpIGVhY2ggb2YgdGhlIGdyYXksCi0gICAgICAgICAgICAgICAgICAgICByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgIHdoaWNoZXZlciBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gY29sb3IgdHlwZSAocG5nX2NvbG9yXzE2KQotCi0gICAgcG5nX2dldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCAmdHJhbnMsICZudW1fdHJhbnMsCi0gICAgICAgICAgICAgICAgICAgICAmdHJhbnNfdmFsdWVzKTsKLSAgICB0cmFucyAgICAgICAgICAtIGFycmF5IG9mIHRyYW5zcGFyZW50IGVudHJpZXMgZm9yCi0gICAgICAgICAgICAgICAgICAgICBwYWxldHRlIChQTkdfSU5GT190Uk5TKQotICAgIHRyYW5zX3ZhbHVlcyAgIC0gZ3JheWxldmVsIG9yIGNvbG9yIHNhbXBsZSB2YWx1ZXMgb2YKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBzaW5nbGUgdHJhbnNwYXJlbnQgY29sb3IgZm9yCi0gICAgICAgICAgICAgICAgICAgICBub24tcGFsZXR0ZWQgaW1hZ2VzIChQTkdfSU5GT190Uk5TKQotICAgIG51bV90cmFucyAgICAgIC0gbnVtYmVyIG9mIHRyYW5zcGFyZW50IGVudHJpZXMKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT190Uk5TKQotCi0gICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCAmaGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9faElTVCkKLSAgICBoaXN0ICAgICAgICAgICAtIGhpc3RvZ3JhbSBvZiBwYWxldHRlIChhcnJheSBvZgotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYpCi0KLSAgICBwbmdfZ2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZtb2RfdGltZSk7Ci0gICAgbW9kX3RpbWUgICAgICAgLSB0aW1lIGltYWdlIHdhcyBsYXN0IG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgICAgIChQTkdfVkFMSURfdElNRSkKLQotICAgIHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmJhY2tncm91bmQpOwotICAgIGJhY2tncm91bmQgICAgIC0gYmFja2dyb3VuZCBjb2xvciAoUE5HX1ZBTElEX2JLR0QpCi0gICAgICAgICAgICAgICAgICAgICB2YWxpZCAxNi1iaXQgcmVkLCBncmVlbiBhbmQgYmx1ZQotICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCByZWdhcmRsZXNzIG9mIGNvbG9yX3R5cGUKLQotICAgIG51bV9jb21tZW50cyAgID0gcG5nX2dldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICAgICAgICAgICAgICAgJnRleHRfcHRyLCAmbnVtX3RleHQpOwotICAgIG51bV9jb21tZW50cyAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzCi0gICAgdGV4dF9wdHIgICAgICAgLSBhcnJheSBvZiBwbmdfdGV4dCBob2xkaW5nIGltYWdlCi0gICAgICAgICAgICAgICAgICAgICBjb21tZW50cwotICAgIHRleHRfcHRyW2ldLmNvbXByZXNzaW9uIC0gdHlwZSBvZiBjb21wcmVzc2lvbiB1c2VkCi0gICAgICAgICAgICAgICAgIG9uICJ0ZXh0IiBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSVRYVF9DT01QUkVTU0lPTl9OT05FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0Ci0gICAgdGV4dF9wdHJbaV0ua2V5ICAgLSBrZXl3b3JkIGZvciBjb21tZW50LiAgTXVzdCBjb250YWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgMS03OSBjaGFyYWN0ZXJzLgotICAgIHRleHRfcHRyW2ldLnRleHQgIC0gdGV4dCBjb21tZW50cyBmb3IgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQuICBDYW4gYmUgZW1wdHkuCi0gICAgdGV4dF9wdHJbaV0udGV4dF9sZW5ndGggLSBsZW5ndGggb2YgdGV4dCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgIGFmdGVyIGRlY29tcHJlc3Npb24sIDAgZm9yIGlUWHQKLSAgICB0ZXh0X3B0cltpXS5pdHh0X2xlbmd0aCAtIGxlbmd0aCBvZiBpdHh0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgdEVYdC96VFh0Ci0gICAgdGV4dF9wdHJbaV0ubGFuZyAgLSBsYW5ndWFnZSBvZiBjb21tZW50IChlbXB0eQotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmb3IgdW5rbm93bikuCi0gICAgdGV4dF9wdHJbaV0ubGFuZ19rZXkgIC0ga2V5d29yZCBpbiBVVEYtOAotICAgICAgICAgICAgICAgICAgICAgICAgIChlbXB0eSBzdHJpbmcgZm9yIHVua25vd24pLgotICAgIG51bV90ZXh0ICAgICAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzIChzYW1lIGFzCi0gICAgICAgICAgICAgICAgICAgICBudW1fY29tbWVudHM7IHlvdSBjYW4gcHV0IE5VTEwgaGVyZQotICAgICAgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIGR1cGxpY2F0aW9uKQotICAgIE5vdGUgd2hpbGUgcG5nX3NldF90ZXh0KCkgd2lsbCBhY2NlcHQgdGV4dCwgbGFuZ3VhZ2UsCi0gICAgYW5kIHRyYW5zbGF0ZWQga2V5d29yZHMgdGhhdCBjYW4gYmUgTlVMTCBwb2ludGVycywgdGhlCi0gICAgc3RydWN0dXJlIHJldHVybmVkIGJ5IHBuZ19nZXRfdGV4dCB3aWxsIGFsd2F5cyBjb250YWluCi0gICAgcmVndWxhciB6ZXJvLXRlcm1pbmF0ZWQgQyBzdHJpbmdzLiAgVGhleSBtaWdodCBiZQotICAgIGVtcHR5IHN0cmluZ3MgYnV0IHRoZXkgd2lsbCBuZXZlciBiZSBOVUxMIHBvaW50ZXJzLgotCi0gICAgbnVtX3NwYWxldHRlcyA9IHBuZ19nZXRfc1BMVChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAmcGFsZXR0ZV9wdHIpOwotICAgIHBhbGV0dGVfcHRyICAgIC0gYXJyYXkgb2YgcGFsZXR0ZSBzdHJ1Y3R1cmVzIGhvbGRpbmcKLSAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzIG9mIG9uZSBvciBtb3JlIHNQTFQgY2h1bmtzCi0gICAgICAgICAgICAgICAgICAgICByZWFkLgotICAgIG51bV9zcGFsZXR0ZXMgIC0gbnVtYmVyIG9mIHNQTFQgY2h1bmtzIHJlYWQuCi0KLSAgICBwbmdfZ2V0X29GRnMocG5nX3B0ciwgaW5mb19wdHIsICZvZmZzZXRfeCwgJm9mZnNldF95LAotICAgICAgICZ1bml0X3R5cGUpOwotICAgIG9mZnNldF94ICAgICAgIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIGxlZnQgZWRnZQotICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNjcmVlbgotICAgIG9mZnNldF95ICAgICAgIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIHRvcCBlZGdlCi0gICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2NyZWVuCi0gICAgdW5pdF90eXBlICAgICAgLSBQTkdfT0ZGU0VUX1BJWEVMLCBQTkdfT0ZGU0VUX01JQ1JPTUVURVIKLQotICAgIHBuZ19nZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnJlc194LCAmcmVzX3ksCi0gICAgICAgJnVuaXRfdHlwZSk7Ci0gICAgcmVzX3ggICAgICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uIGluCi0gICAgICAgICAgICAgICAgICAgICB4IGRpcmVjdGlvbgotICAgIHJlc195ICAgICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbiBpbgotICAgICAgICAgICAgICAgICAgICAgeCBkaXJlY3Rpb24KLSAgICB1bml0X3R5cGUgICAgICAtIFBOR19SRVNPTFVUSU9OX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICBQTkdfUkVTT0xVVElPTl9NRVRFUgotCi0gICAgcG5nX2dldF9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCAmdW5pdCwgJndpZHRoLAotICAgICAgICZoZWlnaHQpCi0gICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKLSAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBkb3VibGVzKQotCi0gICAgcG5nX2dldF9zQ0FMX3MocG5nX3B0ciwgaW5mb19wdHIsICZ1bml0LCAmd2lkdGgsCi0gICAgICAgJmhlaWdodCkKLSAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQotICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIHN0cmluZ3MgbGlrZSAiMi41NCIpCi0KLSAgICBudW1fdW5rbm93bl9jaHVua3MgPSBwbmdfZ2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIsICZ1bmtub3ducykKLSAgICB1bmtub3ducyAgICAgICAgICAtIGFycmF5IG9mIHBuZ191bmtub3duX2NodW5rCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGhvbGRpbmcgdW5rbm93biBjaHVua3MKLSAgICB1bmtub3duc1tpXS5uYW1lICAtIG5hbWUgb2YgdW5rbm93biBjaHVuawotICAgIHVua25vd25zW2ldLmRhdGEgIC0gZGF0YSBvZiB1bmtub3duIGNodW5rCi0gICAgdW5rbm93bnNbaV0uc2l6ZSAgLSBzaXplIG9mIHVua25vd24gY2h1bmsncyBkYXRhCi0gICAgdW5rbm93bnNbaV0ubG9jYXRpb24gLSBwb3NpdGlvbiBvZiBjaHVuayBpbiBmaWxlCi0KLSAgICBUaGUgdmFsdWUgb2YgImkiIGNvcnJlc3BvbmRzIHRvIHRoZSBvcmRlciBpbiB3aGljaCB0aGUKLSAgICBjaHVua3Mgd2VyZSByZWFkIGZyb20gdGhlIFBORyBmaWxlIG9yIGluc2VydGVkIHdpdGggdGhlCi0gICAgcG5nX3NldF91bmtub3duX2NodW5rcygpIGZ1bmN0aW9uLgotCi1UaGUgZGF0YSBmcm9tIHRoZSBwSFlzIGNodW5rIGNhbiBiZSByZXRyaWV2ZWQgaW4gc2V2ZXJhbCBjb252ZW5pZW50Ci1mb3JtczoKLQotICAgIHJlc194ID0gcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLSAgICByZXNfeSA9IHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0gICAgcmVzX3hfYW5kX3kgPSBwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLSAgICByZXNfeCA9IHBuZ19nZXRfeF9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLSAgICByZXNfeSA9IHBuZ19nZXRfeV9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLSAgICByZXNfeF9hbmRfeSA9IHBuZ19nZXRfcGl4ZWxzX3Blcl9pbmNoKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0gICAgYXNwZWN0X3JhdGlvID0gcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8ocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLQotICAgKEVhY2ggb2YgdGhlc2UgcmV0dXJucyAwIFtzaWduaWZ5aW5nICJ1bmtub3duIl0gaWYKLSAgICAgICB0aGUgZGF0YSBpcyBub3QgcHJlc2VudCBvciBpZiByZXNfeCBpcyAwOwotICAgICAgIHJlc194X2FuZF95IGlzIDAgaWYgcmVzX3ggIT0gcmVzX3kpCi0KLVRoZSBkYXRhIGZyb20gdGhlIG9GRnMgY2h1bmsgY2FuIGJlIHJldHJpZXZlZCBpbiBzZXZlcmFsIGNvbnZlbmllbnQKLWZvcm1zOgotCi0gICAgeF9vZmZzZXQgPSBwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIHlfb2Zmc2V0ID0gcG5nX2dldF95X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICB4X29mZnNldCA9IHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICB5X29mZnNldCA9IHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgKEVhY2ggb2YgdGhlc2UgcmV0dXJucyAwIFtzaWduaWZ5aW5nICJ1bmtub3duIiBpZiBib3RoCi0gICAgICAgeCBhbmQgeSBhcmUgMF0gaWYgdGhlIGRhdGEgaXMgbm90IHByZXNlbnQgb3IgaWYgdGhlCi0gICAgICAgY2h1bmsgaXMgcHJlc2VudCBidXQgdGhlIHVuaXQgaXMgdGhlIHBpeGVsKQotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBwbmdfaW5mbyBkZWZpbml0aW9uIGluIHBuZy5oIGFuZCB0aGUKLVBORyBzcGVjaWZpY2F0aW9uIGZvciBjaHVuayBjb250ZW50cy4gIEJlIGNhcmVmdWwgd2l0aCB0cnVzdGluZwotcm93Ynl0ZXMsIGFzIHNvbWUgb2YgdGhlIHRyYW5zZm9ybWF0aW9ucyBjb3VsZCBpbmNyZWFzZSB0aGUgc3BhY2UKLW5lZWRlZCB0byBob2xkIGEgcm93IChleHBhbmQsIGZpbGxlciwgZ3JheV90b19yZ2IsIGV0Yy4pLgotU2VlIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCksIGJlbG93LgotCi1BIHF1aWNrIHdvcmQgYWJvdXQgdGV4dF9wdHIgYW5kIG51bV90ZXh0LiAgUE5HIHN0b3JlcyBjb21tZW50cyBpbgota2V5d29yZC90ZXh0IHBhaXJzLCBvbmUgcGFpciBwZXIgY2h1bmssIHdpdGggbm8gbGltaXQgb24gdGhlIG51bWJlcgotb2YgdGV4dCBjaHVua3MsIGFuZCBhIDJeMzEgYnl0ZSBsaW1pdCBvbiB0aGVpciBzaXplLiAgV2hpbGUgdGhlcmUgYXJlCi1zdWdnZXN0ZWQga2V5d29yZHMsIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRvIHJlc3RyaWN0IHRoZSB1c2UgdG8gdGhlc2UKLXN0cmluZ3MuICBJdCBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgdGhhdCBrZXl3b3JkcyBhbmQgdGV4dCBiZSBzZW5zaWJsZQotdG8gaHVtYW5zICh0aGF0J3MgdGhlIHBvaW50KSwgc28gZG9uJ3QgdXNlIGFiYnJldmlhdGlvbnMuICBOb24tcHJpbnRpbmcKLXN5bWJvbHMgYXJlIG5vdCBhbGxvd2VkLiAgU2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgotVGhlcmUgaXMgYWxzbyBubyByZXF1aXJlbWVudCB0byBoYXZlIHRleHQgYWZ0ZXIgdGhlIGtleXdvcmQuCi0KLUtleXdvcmRzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDc5IExhdGluLTEgY2hhcmFjdGVycyB3aXRob3V0IGxlYWRpbmcgb3IKLXRyYWlsaW5nIHNwYWNlcywgYnV0IG5vbi1jb25zZWN1dGl2ZSBzcGFjZXMgYXJlIGFsbG93ZWQgd2l0aGluIHRoZQota2V5d29yZC4gIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgdGhlIHNhbWUga2V5d29yZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgotVGhlIHRleHRfcHRyIGlzIGFuIGFycmF5IG9mIHBuZ190ZXh0IHN0cnVjdHVyZXMsIGVhY2ggaG9sZGluZyBhCi1wb2ludGVyIHRvIGEgbGFuZ3VhZ2Ugc3RyaW5nLCBhIHBvaW50ZXIgdG8gYSBrZXl3b3JkIGFuZCBhIHBvaW50ZXIgdG8KLWEgdGV4dCBzdHJpbmcuICBUaGUgdGV4dCBzdHJpbmcsIGxhbmd1YWdlIGNvZGUsIGFuZCB0cmFuc2xhdGVkCi1rZXl3b3JkIG1heSBiZSBlbXB0eSBvciBOVUxMIHBvaW50ZXJzLiAgVGhlIGtleXdvcmQvdGV4dAotcGFpcnMgYXJlIHB1dCBpbnRvIHRoZSBhcnJheSBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSByZWNlaXZlZC4KLUhvd2V2ZXIsIHNvbWUgb3IgYWxsIG9mIHRoZSB0ZXh0IGNodW5rcyBtYXkgYmUgYWZ0ZXIgdGhlIGltYWdlLCBzbywgdG8KLW1ha2Ugc3VyZSB5b3UgaGF2ZSByZWFkIGFsbCB0aGUgdGV4dCBjaHVua3MsIGRvbid0IG1lc3Mgd2l0aCB0aGVzZQotdW50aWwgYWZ0ZXIgeW91IHJlYWQgdGhlIHN0dWZmIGFmdGVyIHRoZSBpbWFnZS4gIFRoaXMgd2lsbCBiZQotbWVudGlvbmVkIGFnYWluIGJlbG93IGluIHRoZSBkaXNjdXNzaW9uIHRoYXQgZ29lcyB3aXRoIHBuZ19yZWFkX2VuZCgpLgotCi0uU1MgSW5wdXQgdHJhbnNmb3JtYXRpb25zCi0KLUFmdGVyIHlvdSd2ZSByZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24sIHlvdSBjYW4gc2V0IHVwIHRoZSBsaWJyYXJ5Ci10byBoYW5kbGUgYW55IHNwZWNpYWwgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBpbWFnZSBkYXRhLiAgVGhlIHZhcmlvdXMKLXdheXMgdG8gdHJhbnNmb3JtIHRoZSBkYXRhIHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkKLXNob3VsZCBvY2N1ci4gIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBzb21lIG9mIHRoZXNlIGNoYW5nZSB0aGUgY29sb3IKLXR5cGUgYW5kL29yIGJpdCBkZXB0aCBvZiB0aGUgZGF0YSwgYW5kIHNvbWUgb3RoZXJzIG9ubHkgd29yayBvbgotY2VydGFpbiBjb2xvciB0eXBlcyBhbmQgYml0IGRlcHRocy4gIEV2ZW4gdGhvdWdoIGVhY2ggdHJhbnNmb3JtYXRpb24KLWNoZWNrcyB0byBzZWUgaWYgaXQgaGFzIGRhdGEgdGhhdCBpdCBjYW4gZG8gc29tZXRoaW5nIHdpdGgsIHlvdSBzaG91bGQKLW1ha2Ugc3VyZSB0byBvbmx5IGVuYWJsZSBhIHRyYW5zZm9ybWF0aW9uIGlmIGl0IHdpbGwgYmUgdmFsaWQgZm9yIHRoZQotZGF0YS4gIEZvciBleGFtcGxlLCBkb24ndCBzd2FwIHJlZCBhbmQgYmx1ZSBvbiBncmF5c2NhbGUgZGF0YS4KLQotVGhlIGNvbG9ycyB1c2VkIGZvciB0aGUgYmFja2dyb3VuZCBhbmQgdHJhbnNwYXJlbmN5IHZhbHVlcyBzaG91bGQgYmUKLXN1cHBsaWVkIGluIHRoZSBzYW1lIGZvcm1hdC9kZXB0aCBhcyB0aGUgY3VycmVudCBpbWFnZSBkYXRhLiAgVGhleQotYXJlIHN0b3JlZCBpbiB0aGUgc2FtZSBmb3JtYXQvZGVwdGggYXMgdGhlIGltYWdlIGRhdGEgaW4gYSBiS0dEIG9yIHRSTlMKLWNodW5rLCBzbyB0aGlzIGlzIHdoYXQgbGlicG5nIGV4cGVjdHMgZm9yIHRoaXMgZGF0YS4gIFRoZSBjb2xvcnMgYXJlCi10cmFuc2Zvcm1lZCB0byBrZWVwIGluIHN5bmMgd2l0aCB0aGUgaW1hZ2UgZGF0YSB3aGVuIGFuIGFwcGxpY2F0aW9uCi1jYWxscyB0aGUgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSByb3V0aW5lIChzZWUgYmVsb3cpLgotCi1EYXRhIHdpbGwgYmUgZGVjb2RlZCBpbnRvIHRoZSBzdXBwbGllZCByb3cgYnVmZmVycyBwYWNrZWQgaW50byBieXRlcwotdW5sZXNzIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIHRvbGQgdG8gdHJhbnNmb3JtIGl0IGludG8gYW5vdGhlciBmb3JtYXQuCi1Gb3IgZXhhbXBsZSwgNCBiaXQvcGl4ZWwgcGFsZXR0ZWQgb3IgZ3JheXNjYWxlIGRhdGEgd2lsbCBiZSByZXR1cm5lZAotMiBwaXhlbHMvYnl0ZSB3aXRoIHRoZSBsZWZ0bW9zdCBwaXhlbCBpbiB0aGUgaGlnaC1vcmRlciBiaXRzIG9mIHRoZQotYnl0ZSwgdW5sZXNzIHBuZ19zZXRfcGFja2luZygpIGlzIGNhbGxlZC4gIDgtYml0IFJHQiBkYXRhIHdpbGwgYmUgc3RvcmVkCi1pbiBSR0IgUkdCIFJHQiBmb3JtYXQgdW5sZXNzIHBuZ19zZXRfZmlsbGVyKCkgb3IgcG5nX3NldF9hZGRfYWxwaGEoKQotaXMgY2FsbGVkIHRvIGluc2VydCBmaWxsZXIgYnl0ZXMsIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgZWFjaCBSR0IgdHJpcGxldC4KLTE2LWJpdCBSR0IgZGF0YSB3aWxsIGJlIHJldHVybmVkIFJSR0dCQiBSUkdHQkIsIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLWJ5dGUgb2YgdGhlIGNvbG9yIHZhbHVlIGZpcnN0LCB1bmxlc3MgcG5nX3NldF9zdHJpcF8xNigpIGlzIGNhbGxlZCB0bwotdHJhbnNmb3JtIGl0IHRvIHJlZ3VsYXIgUkdCIFJHQiB0cmlwbGV0cywgb3IgcG5nX3NldF9maWxsZXIoKSBvcgotcG5nX3NldF9hZGQgYWxwaGEoKSBpcyBjYWxsZWQgdG8gaW5zZXJ0IGZpbGxlciBieXRlcywgZWl0aGVyIGJlZm9yZSBvcgotYWZ0ZXIgZWFjaCBSUkdHQkIgdHJpcGxldC4gIFNpbWlsYXJseSwgOC1iaXQgb3IgMTYtYml0IGdyYXlzY2FsZSBkYXRhIGNhbgotYmUgbW9kaWZpZWQgd2l0aAotcG5nX3NldF9maWxsZXIoKSwgcG5nX3NldF9hZGRfYWxwaGEoKSwgb3IgcG5nX3NldF9zdHJpcF8xNigpLgotCi1UaGUgZm9sbG93aW5nIGNvZGUgdHJhbnNmb3JtcyBncmF5c2NhbGUgaW1hZ2VzIG9mIGxlc3MgdGhhbiA4IHRvIDggYml0cywKLWNoYW5nZXMgcGFsZXR0ZWQgaW1hZ2VzIHRvIFJHQiwgYW5kIGFkZHMgYSBmdWxsIGFscGhhIGNoYW5uZWwgaWYgdGhlcmUgaXMKLXRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbiBpbiBhIHRSTlMgY2h1bmsuICBUaGlzIGlzIG1vc3QgdXNlZnVsIG9uCi1ncmF5c2NhbGUgaW1hZ2VzIHdpdGggYml0IGRlcHRocyBvZiAyIG9yIDQgb3IgaWYgdGhlcmUgaXMgYSBtdWx0aXBsZS1pbWFnZQotdmlld2luZyBhcHBsaWNhdGlvbiB0aGF0IHdpc2hlcyB0byB0cmVhdCBhbGwgaW1hZ2VzIGluIHRoZSBzYW1lIHdheS4KLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICAgIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IocG5nX3B0cik7Ci0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmCi0gICAgICAgIGJpdF9kZXB0aCA8IDgpIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfcHRyKTsKLQotICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICBQTkdfSU5GT190Uk5TKSkgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOwotCi1UaGVzZSB0aHJlZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGFsaWFzZXMgZm9yIHBuZ19zZXRfZXhwYW5kKCksIGFkZGVkCi1pbiBsaWJwbmcgdmVyc2lvbiAxLjAuNCwgd2l0aCB0aGUgZnVuY3Rpb24gbmFtZXMgZXhwYW5kZWQgdG8gaW1wcm92ZSBjb2RlCi1yZWFkYWJpbGl0eS4gIEluIHNvbWUgZnV0dXJlIHZlcnNpb24gdGhleSBtYXkgYWN0dWFsbHkgZG8gZGlmZmVyZW50Ci10aGluZ3MuCi0KLUFzIG9mIGxpYnBuZyB2ZXJzaW9uIDEuMi45LCBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKSB3YXMKLWFkZGVkLiAgSXQgZXhwYW5kcyB0aGUgc2FtcGxlIGRlcHRoIHdpdGhvdXQgY2hhbmdpbmcgdFJOUyB0byBhbHBoYS4KLQotUE5HIGNhbiBoYXZlIGZpbGVzIHdpdGggMTYgYml0cyBwZXIgY2hhbm5lbC4gIElmIHlvdSBvbmx5IGNhbiBoYW5kbGUKLTggYml0cyBwZXIgY2hhbm5lbCwgdGhpcyB3aWxsIHN0cmlwIHRoZSBwaXhlbHMgZG93biB0byA4IGJpdC4KLQotICAgIGlmIChiaXRfZGVwdGggPT0gMTYpCi0gICAgICAgIHBuZ19zZXRfc3RyaXBfMTYocG5nX3B0cik7Ci0KLUlmLCBmb3Igc29tZSByZWFzb24sIHlvdSBkb24ndCBuZWVkIHRoZSBhbHBoYSBjaGFubmVsIG9uIGFuIGltYWdlLAotYW5kIHlvdSB3YW50IHRvIHJlbW92ZSBpdCByYXRoZXIgdGhhbiBjb21iaW5pbmcgaXQgd2l0aCB0aGUgYmFja2dyb3VuZAotKGJ1dCB0aGUgaW1hZ2UgYXV0aG9yIGNlcnRhaW5seSBoYWQgaW4gbWluZCB0aGF0IHlvdSAqd291bGQqIGNvbWJpbmUKLWl0IHdpdGggdGhlIGJhY2tncm91bmQsIHNvIHRoYXQncyB3aGF0IHlvdSBzaG91bGQgcHJvYmFibHkgZG8pOgotCi0gICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkKLSAgICAgICAgcG5nX3NldF9zdHJpcF9hbHBoYShwbmdfcHRyKTsKLQotSW4gUE5HIGZpbGVzLCB0aGUgYWxwaGEgY2hhbm5lbCBpbiBhbiBpbWFnZQotaXMgdGhlIGxldmVsIG9mIG9wYWNpdHkuICBJZiB5b3UgbmVlZCB0aGUgYWxwaGEgY2hhbm5lbCBpbiBhbiBpbWFnZSB0bwotYmUgdGhlIGxldmVsIG9mIHRyYW5zcGFyZW5jeSBpbnN0ZWFkIG9mIG9wYWNpdHksIHlvdSBjYW4gaW52ZXJ0IHRoZQotYWxwaGEgY2hhbm5lbCAob3IgdGhlIHRSTlMgY2h1bmsgZGF0YSkgYWZ0ZXIgaXQncyByZWFkLCBzbyB0aGF0IDAgaXMKLWZ1bGx5IG9wYXF1ZSBhbmQgMjU1IChpbiA4LWJpdCBvciBwYWxldHRlZCBpbWFnZXMpIG9yIDY1NTM1IChpbiAxNi1iaXQKLWltYWdlcykgaXMgZnVsbHkgdHJhbnNwYXJlbnQsIHdpdGgKLQotICAgIHBuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19wdHIpOwotCi1QTkcgZmlsZXMgcGFjayBwaXhlbHMgb2YgYml0IGRlcHRocyAxLCAyLCBhbmQgNCBpbnRvIGJ5dGVzIGFzIHNtYWxsIGFzCi10aGV5IGNhbiwgcmVzdWx0aW5nIGluLCBmb3IgZXhhbXBsZSwgOCBwaXhlbHMgcGVyIGJ5dGUgZm9yIDEgYml0Ci1maWxlcy4gIFRoaXMgY29kZSBleHBhbmRzIHRvIDEgcGl4ZWwgcGVyIGJ5dGUgd2l0aG91dCBjaGFuZ2luZyB0aGUKLXZhbHVlcyBvZiB0aGUgcGl4ZWxzOgotCi0gICAgaWYgKGJpdF9kZXB0aCA8IDgpCi0gICAgICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKLQotUE5HIGZpbGVzIGhhdmUgcG9zc2libGUgYml0IGRlcHRocyBvZiAxLCAyLCA0LCA4LCBhbmQgMTYuICBBbGwgcGl4ZWxzCi1zdG9yZWQgaW4gYSBQTkcgaW1hZ2UgaGF2ZSBiZWVuICJzY2FsZWQiIG9yICJzaGlmdGVkIiB1cCB0byB0aGUgbmV4dAotaGlnaGVyIHBvc3NpYmxlIGJpdCBkZXB0aCAoZS5nLiBmcm9tIDUgYml0cy9zYW1wbGUgaW4gdGhlIHJhbmdlIFswLDMxXSB0bwotOCBiaXRzL3NhbXBsZSBpbiB0aGUgcmFuZ2UgWzAsIDI1NV0pLiAgSG93ZXZlciwgaXQgaXMgYWxzbyBwb3NzaWJsZSB0bwotY29udmVydCB0aGUgUE5HIHBpeGVsIGRhdGEgYmFjayB0byB0aGUgb3JpZ2luYWwgYml0IGRlcHRoIG9mIHRoZSBpbWFnZS4KLVRoaXMgY2FsbCByZWR1Y2VzIHRoZSBwaXhlbHMgYmFjayBkb3duIHRvIHRoZSBvcmlnaW5hbCBiaXQgZGVwdGg6Ci0KLSAgICBwbmdfY29sb3JfOHAgc2lnX2JpdDsKLQotICAgIGlmIChwbmdfZ2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsICZzaWdfYml0KSkKLSAgICAgICAgcG5nX3NldF9zaGlmdChwbmdfcHRyLCBzaWdfYml0KTsKLQotUE5HIGZpbGVzIHN0b3JlIDMtY29sb3IgcGl4ZWxzIGluIHJlZCwgZ3JlZW4sIGJsdWUgb3JkZXIuICBUaGlzIGNvZGUKLWNoYW5nZXMgdGhlIHN0b3JhZ2Ugb2YgdGhlIHBpeGVscyB0byBibHVlLCBncmVlbiwgcmVkOgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8Ci0gICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHN0b3JlIFJHQiBwaXhlbHMgcGFja2VkIGludG8gMyBvciA2IGJ5dGVzLiBUaGlzIGNvZGUgZXhwYW5kcyB0aGVtCi1pbnRvIDQgb3IgOCBieXRlcyBmb3Igd2luZG93aW5nIHN5c3RlbXMgdGhhdCBuZWVkIHRoZW0gaW4gdGhpcyBmb3JtYXQ6Ci0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIGZpbGxlciwgUE5HX0ZJTExFUl9CRUZPUkUpOwotCi13aGVyZSAiZmlsbGVyIiBpcyB0aGUgOCBvciAxNi1iaXQgbnVtYmVyIHRvIGZpbGwgd2l0aCwgYW5kIHRoZSBsb2NhdGlvbiBpcwotZWl0aGVyIFBOR19GSUxMRVJfQkVGT1JFIG9yIFBOR19GSUxMRVJfQUZURVIsIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIKLXlvdSB3YW50IHRoZSBmaWxsZXIgYmVmb3JlIHRoZSBSR0Igb3IgYWZ0ZXIuICBUaGlzIHRyYW5zZm9ybWF0aW9uCi1kb2VzIG5vdCBhZmZlY3QgaW1hZ2VzIHRoYXQgYWxyZWFkeSBoYXZlIGZ1bGwgYWxwaGEgY2hhbm5lbHMuICBUbyBhZGQgYW4KLW9wYXF1ZSBhbHBoYSBjaGFubmVsLCB1c2UgZmlsbGVyPTB4ZmYgb3IgMHhmZmZmIGFuZCBQTkdfRklMTEVSX0FGVEVSIHdoaWNoCi13aWxsIGdlbmVyYXRlIFJHQkEgcGl4ZWxzLgotCi1Ob3RlIHRoYXQgcG5nX3NldF9maWxsZXIoKSBkb2VzIG5vdCBjaGFuZ2UgdGhlIGNvbG9yIHR5cGUuICBJZiB5b3Ugd2FudAotdG8gZG8gdGhhdCwgeW91IGNhbiBhZGQgYSB0cnVlIGFscGhhIGNoYW5uZWwgd2l0aAotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8Ci0gICAgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgICBwbmdfc2V0X2FkZF9hbHBoYShwbmdfcHRyLCBmaWxsZXIsIFBOR19GSUxMRVJfQUZURVIpOwotCi13aGVyZSAiZmlsbGVyIiBjb250YWlucyB0aGUgYWxwaGEgdmFsdWUgdG8gYXNzaWduIHRvIGVhY2ggcGl4ZWwuCi1UaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCBpbiBsaWJwbmctMS4yLjcuCi0KLUlmIHlvdSBhcmUgcmVhZGluZyBhbiBpbWFnZSB3aXRoIGFuIGFscGhhIGNoYW5uZWwsIGFuZCB5b3UgbmVlZCB0aGUKLWRhdGEgYXMgQVJHQiBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgUE5HIGZvcm1hdCBSR0JBOgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7Ci0KLUZvciBzb21lIHVzZXMsIHlvdSBtYXkgd2FudCBhIGdyYXlzY2FsZSBpbWFnZSB0byBiZSByZXByZXNlbnRlZCBhcwotUkdCLiAgVGhpcyBjb2RlIHdpbGwgZG8gdGhhdCBjb252ZXJzaW9uOgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fAotICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsKLQotQ29udmVyc2VseSwgeW91IGNhbiBjb252ZXJ0IGFuIFJHQiBvciBSR0JBIGltYWdlIHRvIGdyYXlzY2FsZSBvciBncmF5c2NhbGUKLXdpdGggYWxwaGEuCi0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICAgICAgcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZChwbmdfcHRyLCBlcnJvcl9hY3Rpb24sCi0gICAgICAgICAgICAgaW50IHJlZF93ZWlnaHQsIGludCBncmVlbl93ZWlnaHQpOwotCi0gICAgZXJyb3JfYWN0aW9uID0gMTogc2lsZW50bHkgZG8gdGhlIGNvbnZlcnNpb24KLSAgICBlcnJvcl9hY3Rpb24gPSAyOiBpc3N1ZSBhIHdhcm5pbmcgaWYgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQotICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQotICAgIGVycm9yX2FjdGlvbiA9IDM6IGlzc3VlIGFuIGVycm9yIGFuZCBhYm9ydCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIGlmIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhhcyBhbnkgcGl4ZWwgd2hlcmUKLSAgICAgICAgICAgICAgICAgICAgICByZWQgIT0gZ3JlZW4gb3IgcmVkICE9IGJsdWUKLQotICAgIHJlZF93ZWlnaHQ6ICAgICAgIHdlaWdodCBvZiByZWQgY29tcG9uZW50IHRpbWVzIDEwMDAwMAotICAgIGdyZWVuX3dlaWdodDogICAgIHdlaWdodCBvZiBncmVlbiBjb21wb25lbnQgdGltZXMgMTAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgSWYgZWl0aGVyIHdlaWdodCBpcyBuZWdhdGl2ZSwgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgKDIxMjY4LCA3MTUxNCkgYXJlIHVzZWQuCi0KLUlmIHlvdSBoYXZlIHNldCBlcnJvcl9hY3Rpb24gPSAxIG9yIDIsIHlvdSBjYW4KLWxhdGVyIGNoZWNrIHdoZXRoZXIgdGhlIGltYWdlIHJlYWxseSB3YXMgZ3JheSwgYWZ0ZXIgcHJvY2Vzc2luZwotdGhlIGltYWdlIHJvd3MsIHdpdGggdGhlIHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzKHBuZ19wdHIpIGZ1bmN0aW9uLgotSXQgd2lsbCByZXR1cm4gYSBwbmdfYnl0ZSB0aGF0IGlzIHplcm8gaWYgdGhlIGltYWdlIHdhcyBncmF5IG9yCi0xIGlmIHRoZXJlIHdlcmUgYW55IG5vbi1ncmF5IHBpeGVscy4gIGJLR0QgYW5kIHNCSVQgZGF0YQotd2lsbCBiZSBzaWxlbnRseSBjb252ZXJ0ZWQgdG8gZ3JheXNjYWxlLCB1c2luZyB0aGUgZ3JlZW4gY2hhbm5lbAotZGF0YSwgcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3JfYWN0aW9uIHNldHRpbmcuCi0KLVdpdGggcmVkX3dlaWdodCtncmVlbl93ZWlnaHQ8PTEwMDAwMCwKLXRoZSBub3JtYWxpemVkIGdyYXlsZXZlbCBpcyBjb21wdXRlZDoKLQotICAgIGludCBydyA9IHJlZF93ZWlnaHQgKiA2NTUzNjsKLSAgICBpbnQgZ3cgPSBncmVlbl93ZWlnaHQgKiA2NTUzNjsKLSAgICBpbnQgYncgPSA2NTUzNiAtIChydyArIGd3KTsKLSAgICBncmF5ID0gKHJ3KnJlZCArIGd3KmdyZWVuICsgYncqYmx1ZSkvNjU1MzY7Ci0KLVRoZSBkZWZhdWx0IHZhbHVlcyBhcHByb3hpbWF0ZSB0aG9zZSByZWNvbW1lbmRlZCBpbiB0aGUgQ2hhcmxlcwotUG95bnRvbidzIENvbG9yIEZBUSwgPGh0dHA6Ly93d3cuaW5mb3JhbXAubmV0L35wb3ludG9uLz4KLUNvcHlyaWdodCAoYykgMTk5OC0wMS0wNCBDaGFybGVzIFBveW50b24gPHBveW50b24gYXQgaW5mb3JhbXAubmV0PgotCi0gICAgWSA9IDAuMjEyNjcxICogUiArIDAuNzE1MTYwICogRyArIDAuMDcyMTY5ICogQgotCi1MaWJwbmcgYXBwcm94aW1hdGVzIHRoaXMgd2l0aAotCi0gICAgWSA9IDAuMjEyNjggKiBSICAgICsgMC43MTUxICogRyAgICArIDAuMDcyMTcgKiBCCi0KLXdoaWNoIGNhbiBiZSBleHByZXNzZWQgd2l0aCBpbnRlZ2VycyBhcwotCi0gICAgWSA9ICg2OTY5ICogUiArIDIzNDM0ICogRyArIDIzNjUgKiBCKS8zMjc2OAotCi1UaGUgY2FsY3VsYXRpb24gaXMgZG9uZSBpbiBhIGxpbmVhciBjb2xvcnNwYWNlLCBpZiB0aGUgaW1hZ2UgZ2FtbWEKLWlzIGtub3duLgotCi1JZiB5b3UgaGF2ZSBhIGdyYXlzY2FsZSBhbmQgeW91IGFyZSB1c2luZyBwbmdfc2V0X2V4cGFuZF9kZXB0aCgpLAotcG5nX3NldF9leHBhbmQoKSwgb3IgcG5nX3NldF9ncmF5X3RvX3JnYiB0byBjaGFuZ2UgdG8gdHJ1ZWNvbG9yIG9yIHRvCi1hIGhpZ2hlciBiaXQtZGVwdGgsIHlvdSBtdXN0IGVpdGhlciBzdXBwbHkgdGhlIGJhY2tncm91bmQgY29sb3IgYXMgYSBncmF5Ci12YWx1ZSBhdCB0aGUgb3JpZ2luYWwgZmlsZSBiaXQtZGVwdGggKG5lZWRfZXhwYW5kID0gMSkgb3IgZWxzZSBzdXBwbHkgdGhlCi1iYWNrZ3JvdW5kIGNvbG9yIGFzIGFuIFJHQiB0cmlwbGV0IGF0IHRoZSBmaW5hbCwgZXhwYW5kZWQgYml0IGRlcHRoCi0obmVlZF9leHBhbmQgPSAwKS4gIFNpbWlsYXJseSwgaWYgeW91IGFyZSByZWFkaW5nIGEgcGFsZXR0ZWQgaW1hZ2UsIHlvdQotbXVzdCBlaXRoZXIgc3VwcGx5IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIGEgcGFsZXR0ZSBpbmRleCAobmVlZF9leHBhbmQgPSAxKQotb3IgYXMgYW4gUkdCIHRyaXBsZXQgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBpbiB0aGUgcGFsZXR0ZSAobmVlZF9leHBhbmQgPSAwKS4KLQotICAgIHBuZ19jb2xvcl8xNiBteV9iYWNrZ3JvdW5kOwotICAgIHBuZ19jb2xvcl8xNnAgaW1hZ2VfYmFja2dyb3VuZDsKLQotICAgIGlmIChwbmdfZ2V0X2JLR0QocG5nX3B0ciwgaW5mb19wdHIsICZpbWFnZV9iYWNrZ3JvdW5kKSkKLSAgICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsIGltYWdlX2JhY2tncm91bmQsCi0gICAgICAgICAgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRSwgMSwgMS4wKTsKLSAgICBlbHNlCi0gICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCAmbXlfYmFja2dyb3VuZCwKLSAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAsIDEuMCk7Ci0KLVRoZSBwbmdfc2V0X2JhY2tncm91bmQoKSBmdW5jdGlvbiB0ZWxscyBsaWJwbmcgdG8gY29tcG9zaXRlIGltYWdlcwotd2l0aCBhbHBoYSBvciBzaW1wbGUgdHJhbnNwYXJlbmN5IGFnYWluc3QgdGhlIHN1cHBsaWVkIGJhY2tncm91bmQKLWNvbG9yLiAgSWYgdGhlIFBORyBmaWxlIGNvbnRhaW5zIGEgYktHRCBjaHVuayAoUE5HX0lORk9fYktHRCB2YWxpZCksCi15b3UgbWF5IHVzZSB0aGlzIGNvbG9yLCBvciBzdXBwbHkgYW5vdGhlciBjb2xvciBtb3JlIHN1aXRhYmxlIGZvcgotdGhlIGN1cnJlbnQgZGlzcGxheSAoZS5nLiwgdGhlIGJhY2tncm91bmQgY29sb3IgZnJvbSBhIHdlYiBwYWdlKS4gIFlvdQotbmVlZCB0byB0ZWxsIGxpYnBuZyB3aGV0aGVyIHRoZSBjb2xvciBpcyBpbiB0aGUgZ2FtbWEgc3BhY2Ugb2YgdGhlCi1kaXNwbGF5IChQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4gZm9yIGNvbG9ycyB5b3Ugc3VwcGx5KSwgdGhlIGZpbGUKLShQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFIGZvciBjb2xvcnMgZnJvbSB0aGUgYktHRCBjaHVuayksIG9yIG9uZQotdGhhdCBpcyBuZWl0aGVyIG9mIHRoZXNlIGdhbW1hcyAoUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5JUVVFIC0gSSBkb24ndAota25vdyB3aHkgYW55b25lIHdvdWxkIHVzZSB0aGlzLCBidXQgaXQncyBoZXJlKS4KLQotVG8gcHJvcGVybHkgZGlzcGxheSBQTkcgaW1hZ2VzIG9uIGFueSBraW5kIG9mIHN5c3RlbSwgdGhlIGFwcGxpY2F0aW9uIG5lZWRzCi10byBrbm93IHdoYXQgdGhlIGRpc3BsYXkgZ2FtbWEgaXMuICBJZGVhbGx5LCB0aGUgdXNlciB3aWxsIGtub3cgdGhpcywgYW5kCi10aGUgYXBwbGljYXRpb24gd2lsbCBhbGxvdyB0aGVtIHRvIHNldCBpdC4gIE9uZSBtZXRob2Qgb2YgYWxsb3dpbmcgdGhlIHVzZXIKLXRvIHNldCB0aGUgZGlzcGxheSBnYW1tYSBzZXBhcmF0ZWx5IGZvciBlYWNoIHN5c3RlbSBpcyB0byBjaGVjayBmb3IgYQotU0NSRUVOX0dBTU1BIG9yIERJU1BMQVlfR0FNTUEgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdoaWNoIHdpbGwgaG9wZWZ1bGx5IGJlCi1jb3JyZWN0bHkgc2V0LgotCi1Ob3RlIHRoYXQgZGlzcGxheV9nYW1tYSBpcyB0aGUgb3ZlcmFsbCBnYW1tYSBjb3JyZWN0aW9uIHJlcXVpcmVkIHRvIHByb2R1Y2UKLXBsZWFzaW5nIHJlc3VsdHMsIHdoaWNoIGRlcGVuZHMgb24gdGhlIGxpZ2h0aW5nIGNvbmRpdGlvbnMgaW4gdGhlIHN1cnJvdW5kaW5nCi1lbnZpcm9ubWVudC4gIEluIGEgZGltIG9yIGJyaWdodGx5IGxpdCByb29tLCBubyBjb21wZW5zYXRpb24gb3RoZXIgdGhhbgotdGhlIHBoeXNpY2FsIGdhbW1hIGV4cG9uZW50IG9mIHRoZSBtb25pdG9yIGlzIG5lZWRlZCwgd2hpbGUgaW4gYSBkYXJrIHJvb20KLWEgc2xpZ2h0bHkgc21hbGxlciBleHBvbmVudCBpcyBiZXR0ZXIuCi0KLSAgIGRvdWJsZSBnYW1tYSwgc2NyZWVuX2dhbW1hOwotCi0gICBpZiAoLyogV2UgaGF2ZSBhIHVzZXItZGVmaW5lZCBzY3JlZW4KLSAgICAgICBnYW1tYSB2YWx1ZSAqLykKLSAgIHsKLSAgICAgIHNjcmVlbl9nYW1tYSA9IHVzZXJfZGVmaW5lZF9zY3JlZW5fZ2FtbWE7Ci0gICB9Ci0gICAvKiBPbmUgd2F5IHRoYXQgYXBwbGljYXRpb25zIGNhbiBzaGFyZSB0aGUgc2FtZQotICAgICAgc2NyZWVuIGdhbW1hIHZhbHVlICovCi0gICBlbHNlIGlmICgoZ2FtbWFfc3RyID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkKLSAgICAgICE9IE5VTEwpCi0gICB7Ci0gICAgICBzY3JlZW5fZ2FtbWEgPSAoZG91YmxlKWF0b2YoZ2FtbWFfc3RyKTsKLSAgIH0KLSAgIC8qIElmIHdlIGRvbid0IGhhdmUgYW5vdGhlciB2YWx1ZSAqLwotICAgZWxzZQotICAgewotICAgICAgc2NyZWVuX2dhbW1hID0gMi4yOyAvKiBBIGdvb2QgZ3Vlc3MgZm9yIGEKLSAgICAgICAgICAgUEMgbW9uaXRvciBpbiBhIGJyaWdodCBvZmZpY2Ugb3IgYSBkaW0gcm9vbSAqLwotICAgICAgc2NyZWVuX2dhbW1hID0gMi4wOyAvKiBBIGdvb2QgZ3Vlc3MgZm9yIGEKLSAgICAgICAgICAgUEMgbW9uaXRvciBpbiBhIGRhcmsgcm9vbSAqLwotICAgICAgc2NyZWVuX2dhbW1hID0gMS43IG9yIDEuMDsgIC8qIEEgZ29vZAotICAgICAgICAgICBndWVzcyBmb3IgTWFjIHN5c3RlbXMgKi8KLSAgIH0KLQotVGhlIHBuZ19zZXRfZ2FtbWEoKSBmdW5jdGlvbiBoYW5kbGVzIGdhbW1hIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgZGF0YS4KLVBhc3MgYm90aCB0aGUgZmlsZSBnYW1tYSBhbmQgdGhlIGN1cnJlbnQgc2NyZWVuX2dhbW1hLiAgSWYgdGhlIGZpbGUgZG9lcwotbm90IGhhdmUgYSBnYW1tYSB2YWx1ZSwgeW91IGNhbiBwYXNzIG9uZSBhbnl3YXkgaWYgeW91IGhhdmUgYW4gaWRlYSB3aGF0Ci1pdCBpcyAodXN1YWxseSAwLjQ1NDU1IGlzIGEgZ29vZCBndWVzcyBmb3IgR0lGIGltYWdlcyBvbiBQQ3MpLiAgTm90ZQotdGhhdCBmaWxlIGdhbW1hcyBhcmUgaW52ZXJ0ZWQgZnJvbSBzY3JlZW4gZ2FtbWFzLiAgU2VlIHRoZSBkaXNjdXNzaW9ucwotb24gZ2FtbWEgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBhbiBleGNlbGxlbnQgZGVzY3JpcHRpb24gb2Ygd2hhdAotZ2FtbWEgaXMsIGFuZCB3aHkgYWxsIGFwcGxpY2F0aW9ucyBzaG91bGQgc3VwcG9ydCBpdC4gIEl0IGlzIHN0cm9uZ2x5Ci1yZWNvbW1lbmRlZCB0aGF0IFBORyB2aWV3ZXJzIHN1cHBvcnQgZ2FtbWEgY29ycmVjdGlvbi4KLQotICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmdhbW1hKSkKLSAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCBnYW1tYSk7Ci0gICBlbHNlCi0gICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgMC40NTQ1NSk7Ci0KLUlmIHlvdSBuZWVkIHRvIHJlZHVjZSBhbiBSR0IgZmlsZSB0byBhIHBhbGV0dGVkIGZpbGUsIG9yIGlmIGEgcGFsZXR0ZWQKLWZpbGUgaGFzIG1vcmUgZW50cmllcyB0aGVuIHdpbGwgZml0IG9uIHlvdXIgc2NyZWVuLCBwbmdfc2V0X2RpdGhlcigpCi13aWxsIGRvIHRoYXQuICBOb3RlIHRoYXQgdGhpcyBpcyBhIHNpbXBsZSBtYXRjaCBkaXRoZXIgdGhhdCBtZXJlbHkKLWZpbmRzIHRoZSBjbG9zZXN0IGNvbG9yIGF2YWlsYWJsZS4gIFRoaXMgc2hvdWxkIHdvcmsgZmFpcmx5IHdlbGwgd2l0aAotb3B0aW1pemVkIHBhbGV0dGVzLCBhbmQgZmFpcmx5IGJhZGx5IHdpdGggbGluZWFyIGNvbG9yIGN1YmVzLiAgSWYgeW91Ci1wYXNzIGEgcGFsZXR0ZSB0aGF0IGlzIGxhcmdlciB0aGVuIG1heGltdW1fY29sb3JzLCB0aGUgZmlsZSB3aWxsCi1yZWR1Y2UgdGhlIG51bWJlciBvZiBjb2xvcnMgaW4gdGhlIHBhbGV0dGUgc28gaXQgd2lsbCBmaXQgaW50bwotbWF4aW11bV9jb2xvcnMuICBJZiB0aGVyZSBpcyBhIGhpc3RvZ3JhbSwgaXQgd2lsbCB1c2UgaXQgdG8gbWFrZQotbW9yZSBpbnRlbGxpZ2VudCBjaG9pY2VzIHdoZW4gcmVkdWNpbmcgdGhlIHBhbGV0dGUuICBJZiB0aGVyZSBpcyBubwotaGlzdG9ncmFtLCBpdCBtYXkgbm90IGRvIGFzIGdvb2QgYSBqb2IuCi0KLSAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICB7Ci0gICAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgIFBOR19JTkZPX1BMVEUpKQotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMTZwIGhpc3RvZ3JhbSA9IE5VTEw7Ci0KLSAgICAgICAgIHBuZ19nZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgICAgICZoaXN0b2dyYW0pOwotICAgICAgICAgcG5nX3NldF9kaXRoZXIocG5nX3B0ciwgcGFsZXR0ZSwgbnVtX3BhbGV0dGUsCi0gICAgICAgICAgICBtYXhfc2NyZWVuX2NvbG9ycywgaGlzdG9ncmFtLCAxKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIHBuZ19jb2xvciBzdGRfY29sb3JfY3ViZVtNQVhfU0NSRUVOX0NPTE9SU10gPQotICAgICAgICAgICAgeyAuLi4gY29sb3JzIC4uLiB9OwotCi0gICAgICAgICBwbmdfc2V0X2RpdGhlcihwbmdfcHRyLCBzdGRfY29sb3JfY3ViZSwKLSAgICAgICAgICAgIE1BWF9TQ1JFRU5fQ09MT1JTLCBNQVhfU0NSRUVOX0NPTE9SUywKLSAgICAgICAgICAgIE5VTEwsMCk7Ci0gICAgICB9Ci0gICB9Ci0KLVBORyBmaWxlcyBkZXNjcmliZSBtb25vY2hyb21lIGFzIGJsYWNrIGJlaW5nIHplcm8gYW5kIHdoaXRlIGJlaW5nIG9uZS4KLVRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHJldmVyc2UgdGhpcyAobWFrZSBibGFjayBiZSBvbmUgYW5kIHdoaXRlIGJlCi16ZXJvKToKLQotICAgaWYgKGJpdF9kZXB0aCA9PSAxICYmIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgICAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3B0cik7Ci0KLVRoaXMgZnVuY3Rpb24gY2FuIGFsc28gYmUgdXNlZCB0byBpbnZlcnQgZ3JheXNjYWxlIGFuZCBncmF5LWFscGhhIGltYWdlczoKLQotICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fAotICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19wdHIpOwotCi1QTkcgZmlsZXMgc3RvcmUgMTYgYml0IHBpeGVscyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZy1lbmRpYW4sCi1pZS4gbW9zdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0KS4gIFRoaXMgY29kZSBjaGFuZ2VzIHRoZSBzdG9yYWdlIHRvIHRoZQotb3RoZXIgd2F5IChsaXR0bGUtZW5kaWFuLCBpLmUuIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgZmlyc3QsIHRoZQotd2F5IFBDcyBzdG9yZSB0aGVtKToKLQotICAgIGlmIChiaXRfZGVwdGggPT0gMTYpCi0gICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKLQotSWYgeW91IGFyZSB1c2luZyBwYWNrZWQtcGl4ZWwgaW1hZ2VzICgxLCAyLCBvciA0IGJpdHMvcGl4ZWwpLCBhbmQgeW91Ci1uZWVkIHRvIGNoYW5nZSB0aGUgb3JkZXIgdGhlIHBpeGVscyBhcmUgcGFja2VkIGludG8gYnl0ZXMsIHlvdSBjYW4gdXNlOgotCi0gICAgaWYgKGJpdF9kZXB0aCA8IDgpCi0gICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKLQotRmluYWxseSwgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpZiBub25lIG9mCi10aGUgZXhpc3Rpbmcgb25lcyBtZWV0cyB5b3VyIG5lZWRzLiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgYSBjYWxsYmFjawotd2l0aAotCi0gICAgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19wdHIsCi0gICAgICAgcmVhZF90cmFuc2Zvcm1fZm4pOwotCi1Zb3UgbXVzdCBzdXBwbHkgdGhlIGZ1bmN0aW9uCi0KLSAgICB2b2lkIHJlYWRfdHJhbnNmb3JtX2ZuKHBuZ19wdHIgcHRyLCByb3dfaW5mb19wdHIKLSAgICAgICByb3dfaW5mbywgcG5nX2J5dGVwIGRhdGEpCi0KLVNlZSBwbmd0ZXN0LmMgZm9yIGEgd29ya2luZyBleGFtcGxlLiAgWW91ciBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAotYWZ0ZXIgYWxsIG9mIHRoZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KLQotWW91IGNhbiBhbHNvIHNldCB1cCBhIHBvaW50ZXIgdG8gYSB1c2VyIHN0cnVjdHVyZSBmb3IgdXNlIGJ5IHlvdXIKLWNhbGxiYWNrIGZ1bmN0aW9uLCBhbmQgeW91IGNhbiBpbmZvcm0gbGlicG5nIHRoYXQgeW91ciB0cmFuc2Zvcm0KLWZ1bmN0aW9uIHdpbGwgY2hhbmdlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb3IgYml0IGRlcHRoIHdpdGggdGhlCi1mdW5jdGlvbgotCi0gICAgcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvKHBuZ19wdHIsIHVzZXJfcHRyLAotICAgICAgIHVzZXJfZGVwdGgsIHVzZXJfY2hhbm5lbHMpOwotCi1UaGUgdXNlcidzIGFwcGxpY2F0aW9uLCBub3QgbGlicG5nLCBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyBhbmQKLWZyZWVpbmcgYW55IG1lbW9yeSByZXF1aXJlZCBmb3IgdGhlIHVzZXIgc3RydWN0dXJlLgotCi1Zb3UgY2FuIHJldHJpZXZlIHRoZSBwb2ludGVyIHZpYSB0aGUgZnVuY3Rpb24KLXBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKCkuICBGb3IgZXhhbXBsZToKLQotICAgIHZvaWRwIHJlYWRfdXNlcl90cmFuc2Zvcm1fcHRyID0KLSAgICAgICBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cihwbmdfcHRyKTsKLQotVGhlIGxhc3QgdGhpbmcgdG8gaGFuZGxlIGlzIGludGVybGFjaW5nOyB0aGlzIGlzIGNvdmVyZWQgaW4gZGV0YWlsIGJlbG93LAotYnV0IHlvdSBtdXN0IGNhbGwgdGhlIGZ1bmN0aW9uIGhlcmUgaWYgeW91IHdhbnQgbGlicG5nIHRvIGhhbmRsZSBleHBhbnNpb24KLW9mIHRoZSBpbnRlcmxhY2VkIGltYWdlLgotCi0gICAgbnVtYmVyX29mX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotCi1BZnRlciBzZXR0aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbnMsIGxpYnBuZyBjYW4gdXBkYXRlIHlvdXIgcG5nX2luZm8KLXN0cnVjdHVyZSB0byByZWZsZWN0IGFueSB0cmFuc2Zvcm1hdGlvbnMgeW91J3ZlIHJlcXVlc3RlZCB3aXRoIHRoaXMKLWNhbGwuICBUaGlzIGlzIG1vc3QgdXNlZnVsIHRvIHVwZGF0ZSB0aGUgaW5mbyBzdHJ1Y3R1cmUncyByb3dieXRlcwotZmllbGQgc28geW91IGNhbiB1c2UgaXQgdG8gYWxsb2NhdGUgeW91ciBpbWFnZSBtZW1vcnkuICBUaGlzIGZ1bmN0aW9uCi13aWxsIGFsc28gdXBkYXRlIHlvdXIgcGFsZXR0ZSB3aXRoIHRoZSBjb3JyZWN0IHNjcmVlbl9nYW1tYSBhbmQKLWJhY2tncm91bmQgaWYgdGhlc2UgaGF2ZSBiZWVuIGdpdmVuIHdpdGggdGhlIGNhbGxzIGFib3ZlLgotCi0gICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi1BZnRlciB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbygpLCB5b3UgY2FuIGFsbG9jYXRlIGFueQotbWVtb3J5IHlvdSBuZWVkIHRvIGhvbGQgdGhlIGltYWdlLiAgVGhlIHJvdyBkYXRhIGlzIHNpbXBseQotcmF3IGJ5dGUgZGF0YSBmb3IgYWxsIGZvcm1zIG9mIGltYWdlcy4gIEFzIHRoZSBhY3R1YWwgYWxsb2NhdGlvbgotdmFyaWVzIGFtb25nIGFwcGxpY2F0aW9ucywgbm8gZXhhbXBsZSB3aWxsIGJlIGdpdmVuLiAgSWYgeW91Ci1hcmUgYWxsb2NhdGluZyBvbmUgbGFyZ2UgY2h1bmssIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgYW4KLWFycmF5IG9mIHBvaW50ZXJzIHRvIGVhY2ggcm93LCBhcyBpdCB3aWxsIGJlIG5lZWRlZCBmb3Igc29tZQotb2YgdGhlIGZ1bmN0aW9ucyBiZWxvdy4KLQotLlNTIFJlYWRpbmcgaW1hZ2UgZGF0YQotCi1BZnRlciB5b3UndmUgYWxsb2NhdGVkIG1lbW9yeSwgeW91IGNhbiByZWFkIHRoZSBpbWFnZSBkYXRhLgotVGhlIHNpbXBsZXN0IHdheSB0byBkbyB0aGlzIGlzIGluIG9uZSBmdW5jdGlvbiBjYWxsLiAgSWYgeW91IGFyZQotYWxsb2NhdGluZyBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHdob2xlIGltYWdlLCB5b3UgY2FuIGp1c3QKLWNhbGwgcG5nX3JlYWRfaW1hZ2UoKSBhbmQgbGlicG5nIHdpbGwgcmVhZCBpbiBhbGwgdGhlIGltYWdlIGRhdGEKLWFuZCBwdXQgaXQgaW4gdGhlIG1lbW9yeSBhcmVhIHN1cHBsaWVkLiAgWW91IHdpbGwgbmVlZCB0byBwYXNzIGluCi1hbiBhcnJheSBvZiBwb2ludGVycyB0byBlYWNoIHJvdy4KLQotVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW50ZXJsYWNpbmcsIHNvIHlvdSBkb24ndCBuZWVkCi10byBjYWxsIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgb3IgY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlCi10aW1lcywgb3IgYW55IG9mIHRoYXQgb3RoZXIgc3R1ZmYgbmVjZXNzYXJ5IHdpdGggcG5nX3JlYWRfcm93cygpLgotCi0gICBwbmdfcmVhZF9pbWFnZShwbmdfcHRyLCByb3dfcG9pbnRlcnMpOwotCi13aGVyZSByb3dfcG9pbnRlcnMgaXM6Ci0KLSAgIHBuZ19ieXRlcCByb3dfcG9pbnRlcnNbaGVpZ2h0XTsKLQotWW91IGNhbiBwb2ludCB0byB2b2lkIG9yIGNoYXIgb3Igd2hhdGV2ZXIgeW91IHVzZSBmb3IgcGl4ZWxzLgotCi1JZiB5b3UgZG9uJ3Qgd2FudCB0byByZWFkIGluIHRoZSB3aG9sZSBpbWFnZSBhdCBvbmNlLCB5b3UgY2FuCi11c2UgcG5nX3JlYWRfcm93cygpIGluc3RlYWQuICBJZiB0aGVyZSBpcyBubyBpbnRlcmxhY2luZyAoY2hlY2sKLWludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfTk9ORSksIHRoaXMgaXMgc2ltcGxlOgotCi0gICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCByb3dfcG9pbnRlcnMsIE5VTEwsCi0gICAgICAgbnVtYmVyX29mX3Jvd3MpOwotCi13aGVyZSByb3dfcG9pbnRlcnMgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHBuZ19yZWFkX2ltYWdlKCkgY2FsbC4KLQotSWYgeW91IGFyZSBkb2luZyB0aGlzIGp1c3Qgb25lIHJvdyBhdCBhIHRpbWUsIHlvdSBjYW4gZG8gdGhpcyB3aXRoCi1hIHNpbmdsZSByb3dfcG9pbnRlciBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIHJvd19wb2ludGVyczoKLQotICAgIHBuZ19ieXRlcCByb3dfcG9pbnRlciA9IHJvdzsKLSAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcm93X3BvaW50ZXIsIE5VTEwpOwotCi1JZiB0aGUgZmlsZSBpcyBpbnRlcmxhY2VkIChpbnRlcmxhY2VfdHlwZSAhPSAwIGluIHRoZSBJSERSIGNodW5rKSwgdGhpbmdzCi1nZXQgc29tZXdoYXQgaGFyZGVyLiAgVGhlIG9ubHkgY3VycmVudCAoUE5HIFNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIpCi1pbnRlcmxhY2luZyB0eXBlIGZvciBQTkcgaXMgKGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCi1pcyBhIHNvbWV3aGF0IGNvbXBsaWNhdGVkIDJEIGludGVybGFjZSBzY2hlbWUsIGtub3duIGFzIEFkYW03LCB0aGF0Ci1icmVha3MgZG93biBhbiBpbWFnZSBpbnRvIHNldmVuIHNtYWxsZXIgaW1hZ2VzIG9mIHZhcnlpbmcgc2l6ZSwgYmFzZWQKLW9uIGFuIDh4OCBncmlkLgotCi1saWJwbmcgY2FuIGZpbGwgb3V0IHRob3NlIGltYWdlcyBvciBpdCBjYW4gZ2l2ZSB0aGVtIHRvIHlvdSAiYXMgaXMiLgotSWYgeW91IHdhbnQgdGhlbSBmaWxsZWQgb3V0LCB0aGVyZSBhcmUgdHdvIHdheXMgdG8gZG8gdGhhdC4gIFRoZSBvbmUKLW1lbnRpb25lZCBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24gaXMgdG8gZXhwYW5kIGVhY2ggcGl4ZWwgdG8gY292ZXIKLXRob3NlIHBpeGVscyB0aGF0IGhhdmUgbm90IGJlZW4gcmVhZCB5ZXQgKHRoZSAicmVjdGFuZ2xlIiBtZXRob2QpLgotVGhpcyByZXN1bHRzIGluIGEgYmxvY2t5IGltYWdlIGZvciB0aGUgZmlyc3QgcGFzcywgd2hpY2ggZ3JhZHVhbGx5Ci1zbW9vdGhzIG91dCBhcyBtb3JlIHBpeGVscyBhcmUgcmVhZC4gIFRoZSBvdGhlciBtZXRob2QgaXMgdGhlICJzcGFya2xlIgotbWV0aG9kLCB3aGVyZSBwaXhlbHMgYXJlIGRyYXduIG9ubHkgaW4gdGhlaXIgZmluYWwgbG9jYXRpb25zLCB3aXRoIHRoZQotcmVzdCBvZiB0aGUgaW1hZ2UgcmVtYWluaW5nIHdoYXRldmVyIGNvbG9ycyB0aGV5IHdlcmUgaW5pdGlhbGl6ZWQgdG8KLWJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHJlYWQuICBUaGUgZmlyc3QgbWV0aG9kIHVzdWFsbHkgbG9va3MgYmV0dGVyLAotYnV0IHRlbmRzIHRvIGJlIHNsb3dlciwgYXMgdGhlcmUgYXJlIG1vcmUgcGl4ZWxzIHRvIHB1dCBpbiB0aGUgcm93cy4KLQotSWYgeW91IGRvbid0IHdhbnQgbGlicG5nIHRvIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcgZGV0YWlscywganVzdCBjYWxsCi1wbmdfcmVhZF9yb3dzKCkgc2V2ZW4gdGltZXMgdG8gcmVhZCBpbiBhbGwgc2V2ZW4gaW1hZ2VzLiAgRWFjaCBvZiB0aGUKLWltYWdlcyBpcyBhIHZhbGlkIGltYWdlIGJ5IGl0c2VsZiwgb3IgdGhleSBjYW4gYWxsIGJlIGNvbWJpbmVkIG9uIGFuCi04eDggZ3JpZCB0byBmb3JtIGEgc2luZ2xlIGltYWdlIChhbHRob3VnaCBpZiB5b3UgaW50ZW5kIHRvIGNvbWJpbmUgdGhlbQoteW91IHdvdWxkIGJlIGZhciBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBsaWJwbmcgaW50ZXJsYWNlIGhhbmRsaW5nKS4KLQotVGhlIGZpcnN0IHBhc3Mgd2lsbCByZXR1cm4gYW4gaW1hZ2UgMS84IGFzIHdpZGUgYXMgdGhlIGVudGlyZSBpbWFnZQotKGV2ZXJ5IDh0aCBjb2x1bW4gc3RhcnRpbmcgaW4gY29sdW1uIDApIGFuZCAxLzggYXMgaGlnaCBhcyB0aGUgb3JpZ2luYWwKLShldmVyeSA4dGggcm93IHN0YXJ0aW5nIGluIHJvdyAwKSwgdGhlIHNlY29uZCB3aWxsIGJlIDEvOCBhcyB3aWRlCi0oc3RhcnRpbmcgaW4gY29sdW1uIDQpIGFuZCAxLzggYXMgaGlnaCAoYWxzbyBzdGFydGluZyBpbiByb3cgMCkuICBUaGUKLXRoaXJkIHBhc3Mgd2lsbCBiZSAxLzQgYXMgd2lkZSAoZXZlcnkgNHRoIHBpeGVsIHN0YXJ0aW5nIGluIGNvbHVtbiAwKSBhbmQKLTEvOCBhcyBoaWdoIChldmVyeSA4dGggcm93IHN0YXJ0aW5nIGluIHJvdyA0KSwgYW5kIHRoZSBmb3VydGggcGFzcyB3aWxsCi1iZSAxLzQgYXMgd2lkZSBhbmQgMS80IGFzIGhpZ2ggKGV2ZXJ5IDR0aCBjb2x1bW4gc3RhcnRpbmcgaW4gY29sdW1uIDIsCi1hbmQgZXZlcnkgNHRoIHJvdyBzdGFydGluZyBpbiByb3cgMCkuICBUaGUgZmlmdGggcGFzcyB3aWxsIHJldHVybiBhbgotaW1hZ2UgMS8yIGFzIHdpZGUsIGFuZCAxLzQgYXMgaGlnaCAoc3RhcnRpbmcgYXQgY29sdW1uIDAgYW5kIHJvdyAyKSwKLXdoaWxlIHRoZSBzaXh0aCBwYXNzIHdpbGwgYmUgMS8yIGFzIHdpZGUgYW5kIDEvMiBhcyBoaWdoIGFzIHRoZSBvcmlnaW5hbAotKHN0YXJ0aW5nIGluIGNvbHVtbiAxIGFuZCByb3cgMCkuICBUaGUgc2V2ZW50aCBhbmQgZmluYWwgcGFzcyB3aWxsIGJlIGFzCi13aWRlIGFzIHRoZSBvcmlnaW5hbCwgYW5kIDEvMiBhcyBoaWdoLCBjb250YWluaW5nIGFsbCBvZiB0aGUgb2RkCi1udW1iZXJlZCBzY2FubGluZXMuICBQaGV3IQotCi1JZiB5b3Ugd2FudCBsaWJwbmcgdG8gZXhwYW5kIHRoZSBpbWFnZXMsIGNhbGwgdGhpcyBiZWZvcmUgY2FsbGluZwotcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKSBvciBwbmdfcmVhZF91cGRhdGVfaW5mbygpOgotCi0gICAgaWYgKGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCi0gICAgICAgIG51bWJlcl9vZl9wYXNzZXMKLSAgICAgICAgICAgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLQotVGhpcyB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhc3NlcyBuZWVkZWQuICBDdXJyZW50bHksIHRoaXMKLWlzIHNldmVuLCBidXQgbWF5IGNoYW5nZSBpZiBhbm90aGVyIGludGVybGFjZSB0eXBlIGlzIGFkZGVkLgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGV2ZW4gaWYgdGhlIGZpbGUgaXMgbm90IGludGVybGFjZWQsCi13aGVyZSBpdCB3aWxsIHJldHVybiBvbmUgcGFzcy4KLQotSWYgeW91IGFyZSBub3QgZ29pbmcgdG8gZGlzcGxheSB0aGUgaW1hZ2UgYWZ0ZXIgZWFjaCBwYXNzLCBidXQgYXJlCi1nb2luZyB0byB3YWl0IHVudGlsIHRoZSBlbnRpcmUgaW1hZ2UgaXMgcmVhZCBpbiwgdXNlIHRoZSBzcGFya2xlCi1lZmZlY3QuICBUaGlzIGVmZmVjdCBpcyBmYXN0ZXIgYW5kIHRoZSBlbmQgcmVzdWx0IG9mIGVpdGhlciBtZXRob2QKLWlzIGV4YWN0bHkgdGhlIHNhbWUuICBJZiB5b3UgYXJlIHBsYW5uaW5nIG9uIGRpc3BsYXlpbmcgdGhlIGltYWdlCi1hZnRlciBlYWNoIHBhc3MsIHRoZSAicmVjdGFuZ2xlIiBlZmZlY3QgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgdGhlCi1iZXR0ZXIgbG9va2luZyBvbmUuCi0KLUlmIHlvdSBvbmx5IHdhbnQgdGhlICJzcGFya2xlIiBlZmZlY3QsIGp1c3QgY2FsbCBwbmdfcmVhZF9yb3dzKCkgYXMKLW5vcm1hbCwgd2l0aCB0aGUgdGhpcmQgcGFyYW1ldGVyIE5VTEwuICBNYWtlIHN1cmUgeW91IG1ha2UgcGFzcyBvdmVyCi10aGUgaW1hZ2UgbnVtYmVyX29mX3Bhc3NlcyB0aW1lcywgYW5kIHlvdSBkb24ndCBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlCi1yb3dzIGJldHdlZW4gY2FsbHMuICBZb3UgY2FuIGNoYW5nZSB0aGUgbG9jYXRpb25zIG9mIHRoZSBkYXRhLCBqdXN0Ci1ub3QgdGhlIGRhdGEuICBFYWNoIHBhc3Mgb25seSB3cml0ZXMgdGhlIHBpeGVscyBhcHByb3ByaWF0ZSBmb3IgdGhhdAotcGFzcywgYW5kIGFzc3VtZXMgdGhlIGRhdGEgZnJvbSBwcmV2aW91cyBwYXNzZXMgaXMgc3RpbGwgdmFsaWQuCi0KLSAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywgTlVMTCwKLSAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0KLUlmIHlvdSBvbmx5IHdhbnQgdGhlIGZpcnN0IGVmZmVjdCAodGhlIHJlY3RhbmdsZXMpLCBkbyB0aGUgc2FtZSBhcwotYmVmb3JlIGV4Y2VwdCBwYXNzIHRoZSByb3cgYnVmZmVyIGluIHRoZSB0aGlyZCBwYXJhbWV0ZXIsIGFuZCBsZWF2ZQotdGhlIHNlY29uZCBwYXJhbWV0ZXIgTlVMTC4KLQotICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgTlVMTCwgcm93X3BvaW50ZXJzLAotICAgICAgIG51bWJlcl9vZl9yb3dzKTsKLQotLlNTIEZpbmlzaGluZyBhIHNlcXVlbnRpYWwgcmVhZAotCi1BZnRlciB5b3UgYXJlIGZpbmlzaGVkIHJlYWRpbmcgdGhlIGltYWdlIHRocm91Z2ggdGhlCi1sb3ctbGV2ZWwgaW50ZXJmYWNlLCB5b3UgY2FuIGZpbmlzaCByZWFkaW5nIHRoZSBmaWxlLiAgSWYgeW91IGFyZQotaW50ZXJlc3RlZCBpbiBjb21tZW50cyBvciB0aW1lLCB3aGljaCBtYXkgYmUgc3RvcmVkIGVpdGhlciBiZWZvcmUgb3IKLWFmdGVyIHRoZSBpbWFnZSBkYXRhLCB5b3Ugc2hvdWxkIHBhc3MgdGhlIHNlcGFyYXRlIHBuZ19pbmZvIHN0cnVjdCBpZgoteW91IHdhbnQgdG8ga2VlcCB0aGUgY29tbWVudHMgZnJvbSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbWFnZQotc2VwYXJhdGUuICBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkLCB5b3UgY2FuIHBhc3MgTlVMTC4KLQotICAgcG5nX3JlYWRfZW5kKHBuZ19wdHIsIGVuZF9pbmZvKTsKLQotV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSBjYW4gZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSBsaWJwbmcgbGlrZSB0aGlzOgotCi0gICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICZlbmRfaW5mbyk7Ci0KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gaW5kaXZpZHVhbGx5IGZyZWUgdGhlIGluZm9fcHRyIG1lbWJlcnMgdGhhdAotcG9pbnQgdG8gbGlicG5nLWFsbG9jYXRlZCBzdG9yYWdlIHdpdGggdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKLQotICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIG1hc2ssIHNlcSkKLSAgICBtYXNrIC0gaWRlbnRpZmllcyBkYXRhIHRvIGJlIGZyZWVkLCBhIG1hc2sKLSAgICAgICAgICAgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IKLSAgICAgICAgICAgbW9yZSBvZgotICAgICAgICAgICAgIFBOR19GUkVFX1BMVEUsIFBOR19GUkVFX1RSTlMsCi0gICAgICAgICAgICAgUE5HX0ZSRUVfSElTVCwgUE5HX0ZSRUVfSUNDUCwKLSAgICAgICAgICAgICBQTkdfRlJFRV9QQ0FMLCBQTkdfRlJFRV9ST1dTLAotICAgICAgICAgICAgIFBOR19GUkVFX1NDQUwsIFBOR19GUkVFX1NQTFQsCi0gICAgICAgICAgICAgUE5HX0ZSRUVfVEVYVCwgUE5HX0ZSRUVfVU5LTiwKLSAgICAgICAgICAgb3Igc2ltcGx5IFBOR19GUkVFX0FMTAotICAgIHNlcSAgLSBzZXF1ZW5jZSBudW1iZXIgb2YgaXRlbSB0byBiZSBmcmVlZAotICAgICAgICAgICAoLTEgZm9yIGFsbCBpdGVtcykKLQotVGhpcyBmdW5jdGlvbiBtYXkgYmUgc2FmZWx5IGNhbGxlZCB3aGVuIHRoZSByZWxldmFudCBzdG9yYWdlIGhhcwotYWxyZWFkeSBiZWVuIGZyZWVkLCBvciBoYXMgbm90IHlldCBiZWVuIGFsbG9jYXRlZCwgb3Igd2FzIGFsbG9jYXRlZAotYnkgdGhlIHVzZXIgYW5kIG5vdCBieSBsaWJwbmcsICBhbmQgd2lsbCBpbiB0aG9zZQotY2FzZXMgZG8gbm90aGluZy4gIFRoZSAic2VxIiBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpZiBvbmx5IG9uZSBpdGVtCi1vZiB0aGUgc2VsZWN0ZWQgZGF0YSB0eXBlLCBzdWNoIGFzIFBMVEUsIGlzIGFsbG93ZWQuICBJZiAic2VxIiBpcyBub3QKLS0xLCBhbmQgbXVsdGlwbGUgaXRlbXMgYXJlIGFsbG93ZWQgZm9yIHRoZSBkYXRhIHR5cGUgaWRlbnRpZmllZCBpbgotdGhlIG1hc2ssIHN1Y2ggYXMgdGV4dCBvciBzUExULCBvbmx5IHRoZSBuJ3RoIGl0ZW0gaW4gdGhlIHN0cnVjdHVyZQotaXMgZnJlZWQsIHdoZXJlIG4gaXMgInNlcSIuCi0KLVRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIG9ubHkgdG8gZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBpbnRlcm5hbGx5Ci1ieSBsaWJwbmcuICBUaGlzIGNhbiBiZSBjaGFuZ2VkLCBzbyB0aGF0IGxpYnBuZyB3aWxsIG5vdCBmcmVlIHRoZSBkYXRhLAotb3Igc28gdGhhdCBpdCB3aWxsIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIgd2l0aCBwbmdfbWFsbG9jKCkKLW9yIHBuZ196YWxsb2MoKSBhbmQgcGFzc2VkIGluIHZpYSBhIHBuZ19zZXRfKigpIGZ1bmN0aW9uLCB3aXRoCi0KLSAgICBwbmdfZGF0YV9mcmVlcihwbmdfcHRyLCBpbmZvX3B0ciwgZnJlZXIsIG1hc2spCi0gICAgbWFzayAgIC0gd2hpY2ggZGF0YSBlbGVtZW50cyBhcmUgYWZmZWN0ZWQKLSAgICAgICAgICAgICBzYW1lIGNob2ljZXMgYXMgaW4gcG5nX2ZyZWVfZGF0YSgpCi0gICAgZnJlZXIgIC0gb25lIG9mCi0gICAgICAgICAgICAgICBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQQotICAgICAgICAgICAgICAgUE5HX1NFVF9XSUxMX0ZSRUVfREFUQQotICAgICAgICAgICAgICAgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEKLQotVGhpcyBmdW5jdGlvbiBvbmx5IGFmZmVjdHMgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLgotWW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgcmVhZGluZyB0aGUgUE5HIGRhdGEgYnV0IGJlZm9yZSBjYWxsaW5nCi1hbnkgcG5nX3NldF8qKCkgZnVuY3Rpb25zLCB0byBjb250cm9sIHdoZXRoZXIgdGhlIHVzZXIgb3IgdGhlIHBuZ19zZXRfKigpCi1mdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBhbnkgZXhpc3RpbmcgZGF0YSB0aGF0IG1pZ2h0IGJlIHByZXNlbnQsCi1hbmQgYWdhaW4gYWZ0ZXIgdGhlIHBuZ19zZXRfKigpIGZ1bmN0aW9ucyB0byBjb250cm9sIHdoZXRoZXIgdGhlIHVzZXIKLW9yIHBuZ19kZXN0cm95XyooKSBpcyBzdXBwb3NlZCB0byBmcmVlIHRoZSBkYXRhLiAgV2hlbiB0aGUgdXNlciBhc3N1bWVzCi1yZXNwb25zaWJpbGl0eSBmb3IgbGlicG5nLWFsbG9jYXRlZCBkYXRhLCB0aGUgYXBwbGljYXRpb24gbXVzdCB1c2UKLXBuZ19mcmVlKCkgdG8gZnJlZSBpdCwgYW5kIHdoZW4gdGhlIHVzZXIgdHJhbnNmZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGxpYnBuZwotZm9yIGRhdGEgdGhhdCB0aGUgdXNlciBoYXMgYWxsb2NhdGVkLCB0aGUgdXNlciBtdXN0IGhhdmUgdXNlZCBwbmdfbWFsbG9jKCkKLW9yIHBuZ196YWxsb2MoKSB0byBhbGxvY2F0ZSBpdC4KLQotSWYgeW91IGFsbG9jYXRlZCB5b3VyIHJvd19wb2ludGVycyBpbiBhIHNpbmdsZSBibG9jaywgYXMgc3VnZ2VzdGVkIGFib3ZlIGluCi10aGUgZGVzY3JpcHRpb24gb2YgdGhlIGhpZ2ggbGV2ZWwgcmVhZCBpbnRlcmZhY2UsIHlvdSBtdXN0IG5vdCB0cmFuc2ZlcgotcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgaXQgdG8gdGhlIHBuZ19zZXRfcm93cyBvciBwbmdfcmVhZF9kZXN0cm95IGZ1bmN0aW9uLAotYmVjYXVzZSB0aGV5IHdvdWxkIGFsc28gdHJ5IHRvIGZyZWUgdGhlIGluZGl2aWR1YWwgcm93X3BvaW50ZXJzW2ldLgotCi1JZiB5b3UgYWxsb2NhdGVkIHRleHRfcHRyLnRleHQsIHRleHRfcHRyLmxhbmcsIGFuZCB0ZXh0X3B0ci50cmFuc2xhdGVkX2tleXdvcmQKLXNlcGFyYXRlbHksIGRvIG5vdCB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0ZXh0X3B0ciB0byBsaWJwbmcsCi1iZWNhdXNlIHdoZW4gbGlicG5nIGZpbGxzIGEgcG5nX3RleHQgc3RydWN0dXJlIGl0IGNvbWJpbmVzIHRoZXNlIG1lbWJlcnMgd2l0aAotdGhlIGtleSBtZW1iZXIsIGFuZCBwbmdfZnJlZV9kYXRhKCkgd2lsbCBmcmVlIG9ubHkgdGV4dF9wdHIua2V5LiAgU2ltaWxhcmx5LAotaWYgeW91IHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlJ2luZyB0ZXh0X3B0ciBmcm9tIGxpYnBuZyB0byB5b3VyCi1hcHBsaWNhdGlvbiwgeW91ciBhcHBsaWNhdGlvbiBtdXN0IG5vdCBzZXBhcmF0ZWx5IGZyZWUgdGhvc2UgbWVtYmVycy4KLQotVGhlIHBuZ19mcmVlX2RhdGEoKSBmdW5jdGlvbiB3aWxsIHR1cm4gb2ZmIHRoZSAidmFsaWQiIGZsYWcgZm9yIGFueXRoaW5nCi1pdCBmcmVlcy4gIElmIHlvdSBuZWVkIHRvIHR1cm4gdGhlIGZsYWcgb2ZmIGZvciBhIGNodW5rIHRoYXQgd2FzIGZyZWVkIGJ5IHlvdXIKLWFwcGxpY2F0aW9uIGluc3RlYWQgb2YgYnkgbGlicG5nLCB5b3UgY2FuIHVzZQotCi0gICAgcG5nX3NldF9pbnZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBtYXNrKTsKLSAgICBtYXNrIC0gaWRlbnRpZmllcyB0aGUgY2h1bmtzIHRvIGJlIG1hZGUgaW52YWxpZCwKLSAgICAgICAgICAgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IKLSAgICAgICAgICAgbW9yZSBvZgotICAgICAgICAgICAgIFBOR19JTkZPX2dBTUEsIFBOR19JTkZPX3NCSVQsCi0gICAgICAgICAgICAgUE5HX0lORk9fY0hSTSwgUE5HX0lORk9fUExURSwKLSAgICAgICAgICAgICBQTkdfSU5GT190Uk5TLCBQTkdfSU5GT19iS0dELAotICAgICAgICAgICAgIFBOR19JTkZPX2hJU1QsIFBOR19JTkZPX3BIWXMsCi0gICAgICAgICAgICAgUE5HX0lORk9fb0ZGcywgUE5HX0lORk9fdElNRSwKLSAgICAgICAgICAgICBQTkdfSU5GT19wQ0FMLCBQTkdfSU5GT19zUkdCLAotICAgICAgICAgICAgIFBOR19JTkZPX2lDQ1AsIFBOR19JTkZPX3NQTFQsCi0gICAgICAgICAgICAgUE5HX0lORk9fc0NBTCwgUE5HX0lORk9fSURBVAotCi1Gb3IgYSBtb3JlIGNvbXBhY3QgZXhhbXBsZSBvZiByZWFkaW5nIGEgUE5HIGltYWdlLCBzZWUgdGhlIGZpbGUgZXhhbXBsZS5jLgotCi0uU1MgUmVhZGluZyBQTkcgZmlsZXMgcHJvZ3Jlc3NpdmVseQotCi1UaGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0aGVuIHRoZSBub24tcHJvZ3Jlc3NpdmUKLXJlYWRlci4gIEluc3RlYWQgb2YgY2FsbGluZyBwbmdfcmVhZF9pbmZvKCksIHBuZ19yZWFkX3Jvd3MoKSwgYW5kCi1wbmdfcmVhZF9lbmQoKSwgeW91IG1ha2Ugb25lIGNhbGwgdG8gcG5nX3Byb2Nlc3NfZGF0YSgpLCB3aGljaCBjYWxscwotY2FsbGJhY2tzIHdoZW4gaXQgaGFzIHRoZSBpbmZvLCBhIHJvdywgb3IgdGhlIGVuZCBvZiB0aGUgaW1hZ2UuICBZb3UKLXNldCB1cCB0aGVzZSBjYWxsYmFja3Mgd2l0aCBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKS4gIFlvdSBkb24ndAotaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgaW5wdXQvb3V0cHV0IGZ1bmN0aW9ucyBvZiBsaWJwbmcsIGFzIHlvdSBhcmUKLWdpdmluZyB0aGUgbGlicmFyeSB0aGUgZGF0YSBkaXJlY3RseSBpbiBwbmdfcHJvY2Vzc19kYXRhKCkuICBJIHdpbGwKLWFzc3VtZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIHNlY3Rpb24gb24gcmVhZGluZyBQTkcgZmlsZXMgYWJvdmUsCi1zbyBJIHdpbGwgb25seSBoaWdobGlnaHQgdGhlIGRpZmZlcmVuY2VzIChhbHRob3VnaCBJIHdpbGwgc2hvdwotYWxsIG9mIHRoZSBjb2RlKS4KLQotcG5nX3N0cnVjdHAgcG5nX3B0cjsKLXBuZ19pbmZvcCBpbmZvX3B0cjsKLQotIC8qICBBbiBleGFtcGxlIGNvZGUgZnJhZ21lbnQgb2YgaG93IHlvdSB3b3VsZAotICAgICBpbml0aWFsaXplIHRoZSBwcm9ncmVzc2l2ZSByZWFkZXIgaW4geW91cgotICAgICBhcHBsaWNhdGlvbi4gKi8KLSBpbnQKLSBpbml0aWFsaXplX3BuZ19yZWFkZXIoKQotIHsKLSAgICBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdAotICAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAotICAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKLSAgICBpZiAoIXBuZ19wdHIpCi0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgICBpZiAoIWluZm9fcHRyKQotICAgIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsIChwbmdfaW5mb3BwKU5VTEwsCi0gICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQotICAgIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKLSAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7Ci0gICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotICAgIC8qIFRoaXMgb25lJ3MgbmV3LiAgWW91IGNhbiBwcm92aWRlIGZ1bmN0aW9ucwotICAgICAgIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBoZWFkZXIgaW5mbyBpcyB2YWxpZCwKLSAgICAgICB3aGVuIGVhY2ggcm93IGlzIGNvbXBsZXRlZCwgYW5kIHdoZW4gdGhlIGltYWdlCi0gICAgICAgaXMgZmluaXNoZWQuICBJZiB5b3UgYXJlbid0IHVzaW5nIGFsbCBmdW5jdGlvbnMsCi0gICAgICAgeW91IGNhbiBzcGVjaWZ5IE5VTEwgcGFyYW1ldGVycy4gIEV2ZW4gd2hlbiBhbGwKLSAgICAgICB0aHJlZSBmdW5jdGlvbnMgYXJlIE5VTEwsIHlvdSBuZWVkIHRvIGNhbGwKLSAgICAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKS4gIFlvdSBjYW4gdXNlCi0gICAgICAgYW55IHN0cnVjdCBhcyB0aGUgdXNlcl9wdHIgKGNhc3QgdG8gYSB2b2lkIHBvaW50ZXIKLSAgICAgICBmb3IgdGhlIGZ1bmN0aW9uIGNhbGwpLCBhbmQgcmV0cmlldmUgdGhlIHBvaW50ZXIKLSAgICAgICBmcm9tIGluc2lkZSB0aGUgY2FsbGJhY2tzIHVzaW5nIHRoZSBmdW5jdGlvbgotCi0gICAgICAgICAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7Ci0KLSAgICAgICB3aGljaCB3aWxsIHJldHVybiBhIHZvaWQgcG9pbnRlciwgd2hpY2ggeW91IGhhdmUKLSAgICAgICB0byBjYXN0IGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHBuZ19wdHIsICh2b2lkICopdXNlcl9wdHIsCi0gICAgICAgIGluZm9fY2FsbGJhY2ssIHJvd19jYWxsYmFjaywgZW5kX2NhbGxiYWNrKTsKLQotICAgIHJldHVybiAwOwotIH0KLQotIC8qIEEgY29kZSBmcmFnbWVudCB0aGF0IHlvdSBjYWxsIGFzIHlvdSByZWNlaXZlIGJsb2NrcwotICAgb2YgZGF0YSAqLwotIGludAotIHByb2Nlc3NfZGF0YShwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfdWludF8zMiBsZW5ndGgpCi0gewotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotCi0gICAgLyogVGhpcyBvbmUncyBuZXcgYWxzby4gIFNpbXBseSBnaXZlIGl0IGEgY2h1bmsKLSAgICAgICBvZiBkYXRhIGZyb20gdGhlIGZpbGUgc3RyZWFtIChpbiBvcmRlciwgb2YKLSAgICAgICBjb3Vyc2UpLiAgT24gbWFjaGluZXMgd2l0aCBzZWdtZW50ZWQgbWVtb3J5Ci0gICAgICAgbW9kZWxzIG1hY2hpbmVzLCBkb24ndCBnaXZlIGl0IGFueSBtb3JlIHRoYW4KLSAgICAgICA2NEsuICBUaGUgbGlicmFyeSBzZWVtcyB0byBydW4gZmluZSB3aXRoIHNpemVzCi0gICAgICAgb2YgNEsuIEFsdGhvdWdoIHlvdSBjYW4gZ2l2ZSBpdCBtdWNoIGxlc3MgaWYKLSAgICAgICBuZWNlc3NhcnkgKEkgYXNzdW1lIHlvdSBjYW4gZ2l2ZSBpdCBjaHVua3Mgb2YKLSAgICAgICAxIGJ5dGUsIEkgaGF2ZW4ndCB0cmllZCBsZXNzIHRoZW4gMjU2IGJ5dGVzCi0gICAgICAgeWV0KS4gIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zLCB5b3UgbWF5Ci0gICAgICAgd2FudCB0byBkaXNwbGF5IGFueSByb3dzIHRoYXQgd2VyZSBnZW5lcmF0ZWQKLSAgICAgICBpbiB0aGUgcm93IGNhbGxiYWNrIGlmIHlvdSBkb24ndCBhbHJlYWR5IGRvCi0gICAgICAgc28gdGhlcmUuCi0gICAgICovCi0gICAgcG5nX3Byb2Nlc3NfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgYnVmZmVyLCBsZW5ndGgpOwotICAgIHJldHVybiAwOwotIH0KLQotIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIChhcyBzZXQgYnkKLSAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKSBhYm92ZSkgd2hlbiBlbm91Z2ggZGF0YQotICAgIGhhcyBiZWVuIHN1cHBsaWVkIHNvIGFsbCBvZiB0aGUgaGVhZGVyIGhhcyBiZWVuCi0gICAgcmVhZC4KLSAqLwotIHZvaWQKLSBpbmZvX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvKQotIHsKLSAgICAvKiBEbyBhbnkgc2V0dXAgaGVyZSwgaW5jbHVkaW5nIHNldHRpbmcgYW55IG9mCi0gICAgICAgdGhlIHRyYW5zZm9ybWF0aW9ucyBtZW50aW9uZWQgaW4gdGhlIFJlYWRpbmcKLSAgICAgICBQTkcgZmlsZXMgc2VjdGlvbi4gIEZvciBub3csIHlvdSBfbXVzdF8gY2FsbAotICAgICAgIGVpdGhlciBwbmdfc3RhcnRfcmVhZF9pbWFnZSgpIG9yCi0gICAgICAgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBhZnRlciBhbGwgdGhlCi0gICAgICAgdHJhbnNmb3JtYXRpb25zIGFyZSBzZXQgKGV2ZW4gaWYgeW91IGRvbid0IHNldAotICAgICAgIGFueSkuICBZb3UgbWF5IHN0YXJ0IGdldHRpbmcgcm93cyBiZWZvcmUKLSAgICAgICBwbmdfcHJvY2Vzc19kYXRhKCkgcmV0dXJucywgc28gdGhpcyBpcyB5b3VyCi0gICAgICAgbGFzdCBjaGFuY2UgdG8gcHJlcGFyZSBmb3IgdGhhdC4KLSAgICAgKi8KLSB9Ci0KLSAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGVhY2ggcm93IG9mIGltYWdlCi0gICAgZGF0YSBpcyBjb21wbGV0ZSAqLwotIHZvaWQKLSByb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIG5ld19yb3csCi0gICAgcG5nX3VpbnRfMzIgcm93X251bSwgaW50IHBhc3MpCi0gewotICAgIC8qIElmIHRoZSBpbWFnZSBpcyBpbnRlcmxhY2VkLCBhbmQgeW91IHR1cm5lZAotICAgICAgIG9uIHRoZSBpbnRlcmxhY2UgaGFuZGxlciwgdGhpcyBmdW5jdGlvbiB3aWxsCi0gICAgICAgYmUgY2FsbGVkIGZvciBldmVyeSByb3cgaW4gZXZlcnkgcGFzcy4gIFNvbWUKLSAgICAgICBvZiB0aGVzZSByb3dzIHdpbGwgbm90IGJlIGNoYW5nZWQgZnJvbSB0aGUKLSAgICAgICBwcmV2aW91cyBwYXNzLiAgV2hlbiB0aGUgcm93IGlzIG5vdCBjaGFuZ2VkLAotICAgICAgIHRoZSBuZXdfcm93IHZhcmlhYmxlIHdpbGwgYmUgTlVMTC4gIFRoZSByb3dzCi0gICAgICAgYW5kIHBhc3NlcyBhcmUgY2FsbGVkIGluIG9yZGVyLCBzbyB5b3UgZG9uJ3QKLSAgICAgICByZWFsbHkgbmVlZCB0aGUgcm93X251bSBhbmQgcGFzcywgYnV0IEknbQotICAgICAgIHN1cHBseWluZyB0aGVtIGJlY2F1c2UgaXQgbWF5IG1ha2UgeW91ciBsaWZlCi0gICAgICAgZWFzaWVyLgotCi0gICAgICAgRm9yIHRoZSBub24tTlVMTCByb3dzIG9mIGludGVybGFjZWQgaW1hZ2VzLAotICAgICAgIHlvdSBtdXN0IGNhbGwgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KCkKLSAgICAgICBwYXNzaW5nIGluIHRoZSByb3cgYW5kIHRoZSBvbGQgcm93LiAgWW91IGNhbgotICAgICAgIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgTlVMTCByb3dzIChpdCB3aWxsIGp1c3QKLSAgICAgICByZXR1cm4pIGFuZCBmb3Igbm9uLWludGVybGFjZWQgaW1hZ2VzIChpdCBqdXN0Ci0gICAgICAgZG9lcyB0aGUgbWVtY3B5IGZvciB5b3UpIGlmIGl0IHdpbGwgbWFrZSB0aGUKLSAgICAgICBjb2RlIGVhc2llci4gIFRodXMsIHlvdSBjYW4ganVzdCBkbyB0aGlzIGZvcgotICAgICAgIGFsbCBjYXNlczoKLSAgICAgKi8KLQotICAgICAgICBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cocG5nX3B0ciwgb2xkX3JvdywKLSAgICAgICAgICBuZXdfcm93KTsKLQotICAgIC8qIHdoZXJlIG9sZF9yb3cgaXMgd2hhdCB3YXMgZGlzcGxheWVkIGZvcgotICAgICAgIHByZXZpb3VzbHkgZm9yIHRoZSByb3cuICBOb3RlIHRoYXQgdGhlIGZpcnN0Ci0gICAgICAgcGFzcyAocGFzcyA9PSAwLCByZWFsbHkpIHdpbGwgY29tcGxldGVseSBjb3ZlcgotICAgICAgIHRoZSBvbGQgcm93LCBzbyB0aGUgcm93cyBkbyBub3QgaGF2ZSB0byBiZQotICAgICAgIGluaXRpYWxpemVkLiAgQWZ0ZXIgdGhlIGZpcnN0IHBhc3MgKGFuZCBvbmx5Ci0gICAgICAgZm9yIGludGVybGFjZWQgaW1hZ2VzKSwgeW91IHdpbGwgaGF2ZSB0byBwYXNzCi0gICAgICAgdGhlIGN1cnJlbnQgcm93LCBhbmQgdGhlIGZ1bmN0aW9uIHdpbGwgY29tYmluZQotICAgICAgIHRoZSBvbGQgcm93IGFuZCB0aGUgbmV3IHJvdy4KLSAgICAqLwotIH0KLQotIHZvaWQKLSBlbmRfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCi0gewotICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSB3aG9sZSBpbWFnZQotICAgICAgIGhhcyBiZWVuIHJlYWQsIGluY2x1ZGluZyBhbnkgY2h1bmtzIGFmdGVyIHRoZQotICAgICAgIGltYWdlICh1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBJRU5EKS4gIFlvdQotICAgICAgIHdpbGwgdXN1YWxseSBoYXZlIHRoZSBzYW1lIGluZm8gY2h1bmsgYXMgeW91Ci0gICAgICAgaGFkIGluIHRoZSBoZWFkZXIsIGFsdGhvdWdoIHNvbWUgZGF0YSBtYXkgaGF2ZQotICAgICAgIGJlZW4gYWRkZWQgdG8gdGhlIGNvbW1lbnRzIGFuZCB0aW1lIGZpZWxkcy4KLQotICAgICAgIE1vc3QgcGVvcGxlIHdvbid0IGRvIG11Y2ggaGVyZSwgcGVyaGFwcyBzZXR0aW5nCi0gICAgICAgYSBmbGFnIHRoYXQgbWFya3MgdGhlIGltYWdlIGFzIGZpbmlzaGVkLgotICAgICAqLwotIH0KLQotCi0KLS5TSCBJVi4gV3JpdGluZwotCi1NdWNoIG9mIHRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHJlYWRpbmcuICBIb3dldmVyLCBldmVyeXRoaW5nIG9mCi1pbXBvcnRhbmNlIGlzIHJlcGVhdGVkIGhlcmUsIHNvIHlvdSB3b24ndCBoYXZlIHRvIGNvbnN0YW50bHkgbG9vawotYmFjayB1cCBpbiB0aGUgcmVhZGluZyBzZWN0aW9uIHRvIHVuZGVyc3RhbmQgd3JpdGluZy4KLQotLlNTIFNldHVwCi0KLVlvdSB3aWxsIHdhbnQgdG8gZG8gdGhlIEkvTyBpbml0aWFsaXphdGlvbiBiZWZvcmUgeW91IGdldCBpbnRvIGxpYnBuZywKLXNvIGlmIGl0IGRvZXNuJ3Qgd29yaywgeW91IGRvbid0IGhhdmUgYW55dGhpbmcgdG8gdW5kby4gSWYgeW91IGFyZSBub3QKLXVzaW5nIHRoZSBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkIHRvIHJlcGxhY2UgdGhlbSB3aXRoCi1jdXN0b20gd3JpdGluZyBmdW5jdGlvbnMuICBTZWUgdGhlIGRpc2N1c3Npb24gdW5kZXIgQ3VzdG9taXppbmcgbGlicG5nLgotCi0gICAgRklMRSAqZnAgPSBmb3BlbihmaWxlX25hbWUsICJ3YiIpOwotICAgIGlmICghZnApCi0gICAgewotICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotTmV4dCwgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLgotQXMgdGhlc2UgY2FuIGJlIGJvdGggcmVsYXRpdmVseSBsYXJnZSwgeW91IG1heSBub3Qgd2FudCB0byBzdG9yZSB0aGVzZQotb24gdGhlIHN0YWNrLCB1bmxlc3MgeW91IGhhdmUgc3RhY2sgc3BhY2UgdG8gc3BhcmUuICBPZiBjb3Vyc2UsIHlvdQotd2lsbCB3YW50IHRvIGNoZWNrIGlmIHRoZXkgcmV0dXJuIE5VTEwuICBJZiB5b3UgYXJlIGFsc28gcmVhZGluZywKLXlvdSB3b24ndCB3YW50IHRvIG5hbWUgeW91ciByZWFkIHN0cnVjdHVyZSBhbmQgeW91ciB3cml0ZSBzdHJ1Y3R1cmUKLWJvdGggInBuZ19wdHIiOyB5b3UgY2FuIGNhbGwgdGhlbSBhbnl0aGluZyB5b3UgbGlrZSwgc3VjaCBhcwotInJlYWRfcHRyIiBhbmQgIndyaXRlX3B0ciIuICBMb29rIGF0IHBuZ3Rlc3QuYywgZm9yIGV4YW1wbGUuCi0KLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QKLSAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAotICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOwotICAgIGlmICghcG5nX3B0cikKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLQotICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICAgaWYgKCFpbmZvX3B0cikKLSAgICB7Ci0gICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLAotICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7Ci0gICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotCi1JZiB5b3Ugd2FudCB0byB1c2UgeW91ciBvd24gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMsCi1kZWZpbmUgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCBhbmQgdXNlCi1wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKCkgaW5zdGVhZCBvZiBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpOgotCi0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIKLSAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAotICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4sIChwbmdfdm9pZHApCi0gICAgICAgIHVzZXJfbWVtX3B0ciwgdXNlcl9tYWxsb2NfZm4sIHVzZXJfZnJlZV9mbik7Ci0KLUFmdGVyIHlvdSBoYXZlIHRoZXNlIHN0cnVjdHVyZXMsIHlvdSB3aWxsIG5lZWQgdG8gc2V0IHVwIHRoZQotZXJyb3IgaGFuZGxpbmcuICBXaGVuIGxpYnBuZyBlbmNvdW50ZXJzIGFuIGVycm9yLCBpdCBleHBlY3RzIHRvCi1sb25nam1wKCkgYmFjayB0byB5b3VyIHJvdXRpbmUuICBUaGVyZWZvcmUsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbAotc2V0am1wKCkgYW5kIHBhc3MgdGhlIHBuZ19qbXBidWYocG5nX3B0cikuICBJZiB5b3UKLXdyaXRlIHRoZSBmaWxlIGZyb20gZGlmZmVyZW50IHJvdXRpbmVzLCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZQotdGhlIHBuZ19qbXBidWYocG5nX3B0cikgZXZlcnkgdGltZSB5b3UgZW50ZXIgYSBuZXcgcm91dGluZSB0aGF0IHdpbGwKLWNhbGwgYSBwbmdfKigpIGZ1bmN0aW9uLiAgU2VlIHlvdXIgZG9jdW1lbnRhdGlvbiBvZiBzZXRqbXAvbG9uZ2ptcAotZm9yIHlvdXIgY29tcGlsZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2V0am1wL2xvbmdqbXAuICBTZWUKLXRoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBlcnJvciBoYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nCi1zZWN0aW9uIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBsaWJwbmcgZXJyb3IgaGFuZGxpbmcuCi0KLSAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQotICAgIHsKLSAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7Ci0gICAgICAgZmNsb3NlKGZwKTsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0gICAgLi4uCi0gICAgcmV0dXJuOwotCi1JZiB5b3Ugd291bGQgcmF0aGVyIGF2b2lkIHRoZSBjb21wbGV4aXR5IG9mIHNldGptcC9sb25nam1wIGlzc3VlcywKLXlvdSBjYW4gY29tcGlsZSBsaWJwbmcgd2l0aCBQTkdfU0VUSk1QX05PVF9TVVBQT1JURUQsIGluIHdoaWNoIGNhc2UKLWVycm9ycyB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gUE5HX0FCT1JUKCkgd2hpY2ggZGVmYXVsdHMgdG8gYWJvcnQoKS4KLQotTm93IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgb3V0cHV0IGNvZGUuICBUaGUgZGVmYXVsdCBmb3IgbGlicG5nIGlzIHRvCi11c2UgdGhlIEMgZnVuY3Rpb24gZndyaXRlKCkuICBJZiB5b3UgdXNlIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gcGFzcyBhCi12YWxpZCBGSUxFICogaW4gdGhlIGZ1bmN0aW9uIHBuZ19pbml0X2lvKCkuICBCZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMKLW9wZW5lZCBpbiBiaW5hcnkgbW9kZS4gIEFnYWluLCBpZiB5b3Ugd2lzaCB0byBoYW5kbGUgd3JpdGluZyBkYXRhIGluCi1hbm90aGVyIHdheSwgc2VlIHRoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBJL08gaGFuZGxpbmcgaW4gdGhlIEN1c3RvbWl6aW5nCi1MaWJwbmcgc2VjdGlvbiBiZWxvdy4KLQotICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKLQotSWYgeW91IGFyZSBlbWJlZGRpbmcgeW91ciBQTkcgaW50byBhIGRhdGFzdHJlYW0gc3VjaCBhcyBNTkcsIGFuZCBkb24ndAotd2FudCBsaWJwbmcgdG8gd3JpdGUgdGhlIDgtYnl0ZSBzaWduYXR1cmUsIG9yIGlmIHlvdSBoYXZlIGFscmVhZHkKLXdyaXR0ZW4gdGhlIHNpZ25hdHVyZSBpbiB5b3VyIGFwcGxpY2F0aW9uLCB1c2UKLQotICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIDgpOwotCi10byBpbmZvcm0gbGlicG5nIHRoYXQgaXQgc2hvdWxkIG5vdCB3cml0ZSBhIHNpZ25hdHVyZS4KLQotLlNTIFdyaXRlIGNhbGxiYWNrcwotCi1BdCB0aGlzIHBvaW50LCB5b3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZQotY2FsbGVkIGFmdGVyIGVhY2ggcm93IGhhcyBiZWVuIHdyaXR0ZW4sIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGNvbnRyb2wKLWEgcHJvZ3Jlc3MgbWV0ZXIgb3IgdGhlIGxpa2UuICBJdCdzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuCi1Zb3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvbgotCi0gICAgdm9pZCB3cml0ZV9yb3dfY2FsbGJhY2socG5nX3B0ciwgcG5nX3VpbnRfMzIgcm93LAotICAgICAgIGludCBwYXNzKTsKLSAgICB7Ci0gICAgICAvKiBwdXQgeW91ciBjb2RlIGhlcmUgKi8KLSAgICB9Ci0KLShZb3UgY2FuIGdpdmUgaXQgYW5vdGhlciBuYW1lIHRoYXQgeW91IGxpa2UgaW5zdGVhZCBvZiAid3JpdGVfcm93X2NhbGxiYWNrIikKLQotVG8gaW5mb3JtIGxpYnBuZyBhYm91dCB5b3VyIGZ1bmN0aW9uLCB1c2UKLQotICAgIHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuKHBuZ19wdHIsIHdyaXRlX3Jvd19jYWxsYmFjayk7Ci0KLVlvdSBub3cgaGF2ZSB0aGUgb3B0aW9uIG9mIG1vZGlmeWluZyBob3cgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgd2lsbAotcnVuLiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG1haW5seSBmb3IgdGVzdGluZywgYnV0IG1heSBiZSB1c2VmdWwKLWluIHNvbWUgY2FzZXMsIGxpa2UgaWYgeW91IG5lZWQgdG8gd3JpdGUgUE5HIGZpbGVzIGV4dHJlbWVseSBmYXN0IGFuZAotYXJlIHdpbGxpbmcgdG8gZ2l2ZSB1cCBzb21lIGNvbXByZXNzaW9uLCBvciBpZiB5b3Ugd2FudCB0byBnZXQgdGhlCi1tYXhpbXVtIHBvc3NpYmxlIGNvbXByZXNzaW9uIGF0IHRoZSBleHBlbnNlIG9mIHNsb3dlciB3cml0aW5nLiAgSWYgeW91Ci1oYXZlIG5vIHNwZWNpYWwgbmVlZHMgaW4gdGhpcyBhcmVhLCBsZXQgdGhlIGxpYnJhcnkgZG8gd2hhdCBpdCB3YW50cyBieQotbm90IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhdCBhbGwsIGFzIGl0IGhhcyBiZWVuIHR1bmVkIHRvIGRlbGl2ZXIgYSBnb29kCi1zcGVlZC9jb21wcmVzc2lvbiByYXRpby4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gcG5nX3NldF9maWx0ZXIoKSBpcwotdGhlIGZpbHRlciBtZXRob2QsIGZvciB3aGljaCB0aGUgb25seSB2YWxpZCB2YWx1ZXMgYXJlIDAgKGFzIG9mIHRoZQotSnVseSAxOTk5IFBORyBzcGVjaWZpY2F0aW9uLCB2ZXJzaW9uIDEuMikgb3IgNjQgKGlmIHlvdSBhcmUgd3JpdGluZwotYSBQTkcgZGF0YXN0cmVhbSB0aGF0IGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgTU5HIGRhdGFzdHJlYW0pLiAgVGhlIHRoaXJkCi1wYXJhbWV0ZXIgaXMgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGZpbHRlciB0eXBlKHMpIGFyZSB0byBiZSB0ZXN0ZWQKLWZvciBlYWNoIHNjYW5saW5lLiAgU2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgc3BlY2lmaWMgZmlsdGVyCi10eXBlcy4KLQotCi0gICAgLyogdHVybiBvbiBvciBvZmYgZmlsdGVyaW5nLCBhbmQvb3IgY2hvb3NlCi0gICAgICAgc3BlY2lmaWMgZmlsdGVycy4gIFlvdSBjYW4gdXNlIGVpdGhlciBhIHNpbmdsZQotICAgICAgIFBOR19GSUxURVJfVkFMVUVfTkFNRSBvciB0aGUgYml0d2lzZSBPUiBvZiBvbmUKLSAgICAgICBvciBtb3JlIFBOR19GSUxURVJfTkFNRSBtYXNrcy4gKi8KLSAgICBwbmdfc2V0X2ZpbHRlcihwbmdfcHRyLCAwLAotICAgICAgIFBOR19GSUxURVJfTk9ORSAgfCBQTkdfRklMVEVSX1ZBTFVFX05PTkUgfAotICAgICAgIFBOR19GSUxURVJfU1VCICAgfCBQTkdfRklMVEVSX1ZBTFVFX1NVQiAgfAotICAgICAgIFBOR19GSUxURVJfVVAgICAgfCBQTkdfRklMVEVSX1ZBTFVFX1VQICAgfAotICAgICAgIFBOR19GSUxURVJfQVZHICAgfCBQTkdfRklMVEVSX1ZBTFVFX0FWRyAgfAotICAgICAgIFBOR19GSUxURVJfUEFFVEggfCBQTkdfRklMVEVSX1ZBTFVFX1BBRVRIfAotICAgICAgIFBOR19BTExfRklMVEVSUyk7Ci0KLUlmIGFuIGFwcGxpY2F0aW9uCi13YW50cyB0byBzdGFydCBhbmQgc3RvcCB1c2luZyBwYXJ0aWN1bGFyIGZpbHRlcnMgZHVyaW5nIGNvbXByZXNzaW9uLAotaXQgc2hvdWxkIHN0YXJ0IG91dCB3aXRoIGFsbCBvZiB0aGUgZmlsdGVycyAodG8gZW5zdXJlIHRoYXQgdGhlIHByZXZpb3VzCi1yb3cgb2YgcGl4ZWxzIHdpbGwgYmUgc3RvcmVkIGluIGNhc2UgaXQncyBuZWVkZWQgbGF0ZXIpLCBhbmQgdGhlbiBhZGQKLWFuZCByZW1vdmUgdGhlbSBhZnRlciB0aGUgc3RhcnQgb2YgY29tcHJlc3Npb24uCi0KLUlmIHlvdSBhcmUgd3JpdGluZyBhIFBORyBkYXRhc3RyZWFtIHRoYXQgaXMgdG8gYmUgZW1iZWRkZWQgaW4gYSBNTkcKLWRhdGFzdHJlYW0sIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGNhbiBiZSBlaXRoZXIgMCBvciA2NC4KLQotVGhlIHBuZ19zZXRfY29tcHJlc3Npb25fKigpIGZ1bmN0aW9ucyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgY29tcHJlc3Npb24KLWxpYnJhcnksIGFuZCBzaG91bGQgbW9zdGx5IGJlIGlnbm9yZWQgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUKLWRvaW5nLiAgVGhlIG9ubHkgZ2VuZXJhbGx5IHVzZWZ1bCBjYWxsIGlzIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwoKQotd2hpY2ggY2hhbmdlcyBob3cgbXVjaCB0aW1lIHpsaWIgc3BlbmRzIG9uIHRyeWluZyB0byBjb21wcmVzcyB0aGUgaW1hZ2UKLWRhdGEuICBTZWUgdGhlIENvbXByZXNzaW9uIExpYnJhcnkgKHpsaWIuaCBhbmQgYWxnb3JpdGhtLnR4dCwgZGlzdHJpYnV0ZWQKLXdpdGggemxpYikgZm9yIGRldGFpbHMgb24gdGhlIGNvbXByZXNzaW9uIGxldmVscy4KLQotICAgIC8qIHNldCB0aGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCAqLwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwKLSAgICAgICAgWl9CRVNUX0NPTVBSRVNTSU9OKTsKLQotICAgIC8qIHNldCBvdGhlciB6bGliIHBhcmFtZXRlcnMgKi8KLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbChwbmdfcHRyLCA4KTsKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCi0gICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLCAxNSk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3B0ciwgOCk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZShwbmdfcHRyLCA4MTkyKQotCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfemJ1Zl9zaXplKQotCi0uU1MgU2V0dGluZyB0aGUgY29udGVudHMgb2YgaW5mbyBmb3Igb3V0cHV0Ci0KLVlvdSBub3cgbmVlZCB0byBmaWxsIGluIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgd2l0aCBhbGwgdGhlIGRhdGEgeW91Ci13aXNoIHRvIHdyaXRlIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlLiAgTm90ZSB0aGF0IHRoZSBvbmx5IHRoaW5nIHlvdQotYXJlIGFsbG93ZWQgdG8gd3JpdGUgYWZ0ZXIgdGhlIGltYWdlIGlzIHRoZSB0ZXh0IGNodW5rcyBhbmQgdGhlIHRpbWUKLWNodW5rIChhcyBvZiBQTkcgU3BlY2lmaWNhdGlvbiAxLjIsIGFueXdheSkuICBTZWUgcG5nX3dyaXRlX2VuZCgpIGFuZAotdGhlIGxhdGVzdCBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGF0LiAgSWYgeW91Ci13aXNoIHRvIHdyaXRlIHRoZW0gYmVmb3JlIHRoZSBpbWFnZSwgZmlsbCB0aGVtIGluIG5vdywgYW5kIGZsYWcgdGhhdAotZGF0YSBhcyBiZWluZyB2YWxpZC4gIElmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRhdGEsIGRvbid0Ci1maWxsIHRoZW0gdW50aWwgcG5nX3dyaXRlX2VuZCgpLiAgRm9yIGFsbCB0aGUgZmllbGRzIGluIHBuZ19pbmZvIGFuZAotdGhlaXIgZGF0YSB0eXBlcywgc2VlIHBuZy5oLiAgRm9yIGV4cGxhbmF0aW9ucyBvZiB3aGF0IHRoZSBmaWVsZHMKLWNvbnRhaW4sIHNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24uCi0KLVNvbWUgb2YgdGhlIG1vcmUgaW1wb3J0YW50IHBhcnRzIG9mIHRoZSBwbmdfaW5mbyBhcmU6Ci0KLSAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwKLSAgICAgICBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfbWV0aG9kKQotICAgIHdpZHRoICAgICAgICAgIC0gaG9sZHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KLSAgICBoZWlnaHQgICAgICAgICAtIGhvbGRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCi0gICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgotICAgIGJpdF9kZXB0aCAgICAgIC0gaG9sZHMgdGhlIGJpdCBkZXB0aCBvZiBvbmUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICBpbWFnZSBjaGFubmVscy4KLSAgICAgICAgICAgICAgICAgICAgICh2YWxpZCB2YWx1ZXMgYXJlIDEsIDIsIDQsIDgsIDE2Ci0gICAgICAgICAgICAgICAgICAgICBhbmQgZGVwZW5kIGFsc28gb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICBjb2xvcl90eXBlLiAgU2VlIGFsc28gc2lnbmlmaWNhbnQKLSAgICAgICAgICAgICAgICAgICAgIGJpdHMgKHNCSVQpIGJlbG93KS4KLSAgICBjb2xvcl90eXBlICAgICAtIGRlc2NyaWJlcyB3aGljaCBjb2xvci9hbHBoYQotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCkKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQgotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQotCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUgotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQUxQSEEKLQotICAgIGludGVybGFjZV90eXBlIC0gUE5HX0lOVEVSTEFDRV9OT05FIG9yCi0gICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03Ci0gICAgY29tcHJlc3Npb25fdHlwZSAtIChtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxUKQotICAgIGZpbHRlcl9tZXRob2QgIC0gKG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQKLSAgICAgICAgICAgICAgICAgICAgIG9yLCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgdG8KLSAgICAgICAgICAgICAgICAgICAgIGJlIGVtYmVkZGVkIGluIGEgTU5HIGRhdGFzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBiZQotICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKQotCi1JZiB5b3UgY2FsbCBwbmdfc2V0X0lIRFIoKSwgdGhlIGNhbGwgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBvZiB0aGUKLW90aGVyIHBuZ19zZXRfKigpIGZ1bmN0aW9ucywgd2hpY2ggbWlnaHQgcmVxdWlyZSBhY2Nlc3MgdG8gc29tZSBvZgotdGhlIElIRFIgc2V0dGluZ3MuICBUaGUgcmVtYWluaW5nIHBuZ19zZXRfKigpIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkCi1pbiBhbnkgb3JkZXIuCi0KLSAgICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsCi0gICAgICAgbnVtX3BhbGV0dGUpOwotICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQotICAgIG51bV9wYWxldHRlICAgIC0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBhbGV0dGUKLQotICAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgZ2FtbWEpOwotICAgIGdhbW1hICAgICAgICAgIC0gdGhlIGdhbW1hIHRoZSBpbWFnZSB3YXMgY3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAgYXQgKFBOR19JTkZPX2dBTUEpCi0KLSAgICBwbmdfc2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIHNyZ2JfaW50ZW50KTsKLSAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc1JHQikgVGhlIHByZXNlbmNlIG9mCi0gICAgICAgICAgICAgICAgICAgICB0aGUgc1JHQiBjaHVuayBtZWFucyB0aGF0IHRoZSBwaXhlbAotICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBpbiB0aGUgc1JHQiBjb2xvciBzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2h1bmsgYWxzbyBpbXBsaWVzIHNwZWNpZmljCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb2YgZ0FNQSBhbmQgY0hSTS4gIFJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICAgaW50ZW50IGlzIHRoZSBDU1MtMSBwcm9wZXJ0eSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICBDb2xvciBDb25zb3J0aXVtCi0gICAgICAgICAgICAgICAgICAgICAoaHR0cDovL3d3dy5jb2xvci5vcmcpLgotICAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlIG9uZSBvZgotICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfSU5URU5UX1NBVFVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfUEVSQ0VQVFVBTCwKLSAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9BQlNPTFVURSwgb3IKLSAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9SRUxBVElWRS4KLQotCi0gICAgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgc3JnYl9pbnRlbnQpOwotICAgIHNyZ2JfaW50ZW50ICAgIC0gdGhlIHJlbmRlcmluZyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zUkdCKSBUaGUgcHJlc2VuY2Ugb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICBzUkdCIGNodW5rIG1lYW5zIHRoYXQgdGhlIHBpeGVsCi0gICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGluIHRoZSBzUkdCIGNvbG9yIHNwYWNlLgotICAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIGNhdXNlcyBnQU1BIGFuZAotICAgICAgICAgICAgICAgICAgICAgY0hSTSBjaHVua3Mgd2l0aCB0aGUgc3BlY2lmaWMgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICB0aGF0IGFyZSBjb25zaXN0ZW50IHdpdGggc1JHQiB0byBiZQotICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbi4KLQotICAgIHBuZ19zZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgbmFtZSwgY29tcHJlc3Npb25fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBwcm9mbGVuKTsKLSAgICBuYW1lICAgICAgICAgICAgLSBUaGUgcHJvZmlsZSBuYW1lLgotICAgIGNvbXByZXNzaW9uICAgICAtIFRoZSBjb21wcmVzc2lvbiB0eXBlOyBhbHdheXMKLSAgICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIGZvciBQTkcgMS4wLgotICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgZ2l2ZSBOVUxMIHRvIHRoaXMgYXJndW1lbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgaXQuCi0gICAgcHJvZmlsZSAgICAgICAgIC0gSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtIGNvbG9yCi0gICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSBkYXRhLiBNYXkgY29udGFpbiBOVUxzLgotICAgIHByb2ZsZW4gICAgICAgICAtIGxlbmd0aCBvZiBwcm9maWxlIGRhdGEgaW4gYnl0ZXMuCi0KLSAgICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsIHNpZ19iaXQpOwotICAgIHNpZ19iaXQgICAgICAgIC0gdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGZvcgotICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3NCSVQpIGVhY2ggb2YgdGhlIGdyYXksIHJlZCwKLSAgICAgICAgICAgICAgICAgICAgIGdyZWVuLCBhbmQgYmx1ZSBjaGFubmVscywgd2hpY2hldmVyIGFyZQotICAgICAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBjb2xvciB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAocG5nX2NvbG9yXzE2KQotCi0gICAgcG5nX3NldF90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCB0cmFucywgbnVtX3RyYW5zLAotICAgICAgIHRyYW5zX3ZhbHVlcyk7Ci0gICAgdHJhbnMgICAgICAgICAgLSBhcnJheSBvZiB0cmFuc3BhcmVudCBlbnRyaWVzIGZvcgotICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSAoUE5HX0lORk9fdFJOUykKLSAgICB0cmFuc192YWx1ZXMgICAtIGdyYXlsZXZlbCBvciBjb2xvciBzYW1wbGUgdmFsdWVzIG9mCi0gICAgICAgICAgICAgICAgICAgICB0aGUgc2luZ2xlIHRyYW5zcGFyZW50IGNvbG9yIGZvcgotICAgICAgICAgICAgICAgICAgICAgbm9uLXBhbGV0dGVkIGltYWdlcyAoUE5HX0lORk9fdFJOUykKLSAgICBudW1fdHJhbnMgICAgICAtIG51bWJlciBvZiB0cmFuc3BhcmVudCBlbnRyaWVzCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fdFJOUykKLQotICAgIHBuZ19zZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgaGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19oSVNUKQotICAgIGhpc3QgICAgICAgICAgIC0gaGlzdG9ncmFtIG9mIHBhbGV0dGUgKGFycmF5IG9mCi0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNikKLQotICAgIHBuZ19zZXRfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgbW9kX3RpbWUpOwotICAgIG1vZF90aW1lICAgICAgIC0gdGltZSBpbWFnZSB3YXMgbGFzdCBtb2RpZmllZAotICAgICAgICAgICAgICAgICAgICAgKFBOR19WQUxJRF90SU1FKQotCi0gICAgcG5nX3NldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCBiYWNrZ3JvdW5kKTsKLSAgICBiYWNrZ3JvdW5kICAgICAtIGJhY2tncm91bmQgY29sb3IgKFBOR19WQUxJRF9iS0dEKQotCi0gICAgcG5nX3NldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgbnVtX3RleHQpOwotICAgIHRleHRfcHRyICAgICAgIC0gYXJyYXkgb2YgcG5nX3RleHQgaG9sZGluZyBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMKLSAgICB0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiAtIHR5cGUgb2YgY29tcHJlc3Npb24gdXNlZAotICAgICAgICAgICAgICAgICBvbiAidGV4dCIgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05felRYdAotICAgIHRleHRfcHRyW2ldLmtleSAgIC0ga2V5d29yZCBmb3IgY29tbWVudC4gIE11c3QgY29udGFpbgotICAgICAgICAgICAgICAgICAxLTc5IGNoYXJhY3RlcnMuCi0gICAgdGV4dF9wdHJbaV0udGV4dCAgLSB0ZXh0IGNvbW1lbnRzIGZvciBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZC4gIENhbiBiZSBOVUxMIG9yIGVtcHR5LgotICAgIHRleHRfcHRyW2ldLnRleHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIHRleHQgc3RyaW5nLAotICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciBpVFh0Ci0gICAgdGV4dF9wdHJbaV0uaXR4dF9sZW5ndGggLSBsZW5ndGggb2YgaXR4dCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgIGFmdGVyIGRlY29tcHJlc3Npb24sIDAgZm9yIHRFWHQvelRYdAotICAgIHRleHRfcHRyW2ldLmxhbmcgIC0gbGFuZ3VhZ2Ugb2YgY29tbWVudCAoTlVMTCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5IGZvciB1bmtub3duKS4KLSAgICB0ZXh0X3B0cltpXS50cmFuc2xhdGVkX2tleXdvcmQgIC0ga2V5d29yZCBpbiBVVEYtOCAoTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGVtcHR5IGZvciB1bmtub3duKS4KLSAgICBudW1fdGV4dCAgICAgICAtIG51bWJlciBvZiBjb21tZW50cwotCi0gICAgcG5nX3NldF9zUExUKHBuZ19wdHIsIGluZm9fcHRyLCAmcGFsZXR0ZV9wdHIsCi0gICAgICAgbnVtX3NwYWxldHRlcyk7Ci0gICAgcGFsZXR0ZV9wdHIgICAgLSBhcnJheSBvZiBwbmdfc1BMVF9zdHJ1Y3Qgc3RydWN0dXJlcwotICAgICAgICAgICAgICAgICAgICAgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcGFsZXR0ZXMKLSAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBpbmZvIHN0cnVjdHVyZS4KLSAgICBudW1fc3BhbGV0dGVzICAtIG51bWJlciBvZiBwYWxldHRlIHN0cnVjdHVyZXMgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgIGFkZGVkLgotCi0gICAgcG5nX3NldF9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLCBvZmZzZXRfeCwgb2Zmc2V0X3ksCi0gICAgICAgIHVuaXRfdHlwZSk7Ci0gICAgb2Zmc2V0X3ggIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIGxlZnQKLSAgICAgICAgICAgICAgICAgICAgIGVkZ2Ugb2YgdGhlIHNjcmVlbgotICAgIG9mZnNldF95ICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSB0b3AKLSAgICAgICAgICAgICAgICAgICAgIGVkZ2Ugb2YgdGhlIHNjcmVlbgotICAgIHVuaXRfdHlwZSAtIFBOR19PRkZTRVRfUElYRUwsIFBOR19PRkZTRVRfTUlDUk9NRVRFUgotCi0gICAgcG5nX3NldF9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCByZXNfeCwgcmVzX3ksCi0gICAgICAgIHVuaXRfdHlwZSk7Ci0gICAgcmVzX3ggICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uCi0gICAgICAgICAgICAgICAgICBpbiB4IGRpcmVjdGlvbgotICAgIHJlc195ICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgaW4geSBkaXJlY3Rpb24KLSAgICB1bml0X3R5cGUgICAtIFBOR19SRVNPTFVUSU9OX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICBQTkdfUkVTT0xVVElPTl9NRVRFUgotCi0gICAgcG5nX3NldF9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCB1bml0LCB3aWR0aCwgaGVpZ2h0KQotICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCi0gICAgd2lkdGggICAgICAgLSB3aWR0aCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgaGVpZ2h0ICAgICAgLSBoZWlnaHQgb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIGRvdWJsZXMpCi0KLSAgICBwbmdfc2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgdW5pdCwgd2lkdGgsIGhlaWdodCkKLSAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQotICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIHN0cmluZ3MgbGlrZSAiMi41NCIpCi0KLSAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCAmdW5rbm93bnMsCi0gICAgICAgbnVtX3Vua25vd25zKQotICAgIHVua25vd25zICAgICAgICAgIC0gYXJyYXkgb2YgcG5nX3Vua25vd25fY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgaG9sZGluZyB1bmtub3duIGNodW5rcwotICAgIHVua25vd25zW2ldLm5hbWUgIC0gbmFtZSBvZiB1bmtub3duIGNodW5rCi0gICAgdW5rbm93bnNbaV0uZGF0YSAgLSBkYXRhIG9mIHVua25vd24gY2h1bmsKLSAgICB1bmtub3duc1tpXS5zaXplICAtIHNpemUgb2YgdW5rbm93biBjaHVuaydzIGRhdGEKLSAgICB1bmtub3duc1tpXS5sb2NhdGlvbiAtIHBvc2l0aW9uIHRvIHdyaXRlIGNodW5rIGluIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IGRvIG5vdCB3cml0ZSBjaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0hBVkVfSUhEUjogYmVmb3JlIFBMVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19IQVZFX1BMVEU6IGJlZm9yZSBJREFUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfQUZURVJfSURBVDogYWZ0ZXIgSURBVAotCi1UaGUgImxvY2F0aW9uIiBtZW1iZXIgaXMgc2V0IGF1dG9tYXRpY2FsbHkgYWNjb3JkaW5nIHRvCi13aGF0IHBhcnQgb2YgdGhlIG91dHB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbi4KLVlvdSBjYW4gY2hhbmdlIGl0cyB2YWx1ZSBhZnRlciBjYWxsaW5nIHBuZ19zZXRfdW5rbm93bl9jaHVua3MoKQotYXMgZGVtb25zdHJhdGVkIGluIHBuZ3Rlc3QuYy4gIFdpdGhpbiBlYWNoIG9mIHRoZSAibG9jYXRpb25zIiwKLXRoZSBjaHVua3MgYXJlIHNlcXVlbmNlZCBhY2NvcmRpbmcgdG8gdGhlaXIgcG9zaXRpb24gaW4gdGhlCi1zdHJ1Y3R1cmUgKHRoYXQgaXMsIHRoZSB2YWx1ZSBvZiAiaSIsIHdoaWNoIGlzIHRoZSBvcmRlciBpbiB3aGljaAotdGhlIGNodW5rIHdhcyBlaXRoZXIgcmVhZCBmcm9tIHRoZSBpbnB1dCBmaWxlIG9yIGRlZmluZWQgd2l0aAotcG5nX3NldF91bmtub3duX2NodW5rcykuCi0KLUEgcXVpY2sgd29yZCBhYm91dCB0ZXh0IGFuZCBudW1fdGV4dC4gIHRleHQgaXMgYW4gYXJyYXkgb2YgcG5nX3RleHQKLXN0cnVjdHVyZXMuICBudW1fdGV4dCBpcyB0aGUgbnVtYmVyIG9mIHZhbGlkIHN0cnVjdHVyZXMgaW4gdGhlIGFycmF5LgotRWFjaCBwbmdfdGV4dCBzdHJ1Y3R1cmUgaG9sZHMgYSBsYW5ndWFnZSBjb2RlLCBhIGtleXdvcmQsIGEgdGV4dCB2YWx1ZSwKLWFuZCBhIGNvbXByZXNzaW9uIHR5cGUuCi0KLVRoZSBjb21wcmVzc2lvbiB0eXBlcyBoYXZlIHRoZSBzYW1lIHZhbGlkIG51bWJlcnMgYXMgdGhlIGNvbXByZXNzaW9uCi10eXBlcyBvZiB0aGUgaW1hZ2UgZGF0YS4gIEN1cnJlbnRseSwgdGhlIG9ubHkgdmFsaWQgbnVtYmVyIGlzIHplcm8uCi1Ib3dldmVyLCB5b3UgY2FuIHN0b3JlIHRleHQgZWl0aGVyIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkLCB1bmxpa2UKLWltYWdlcywgd2hpY2ggYWx3YXlzIGhhdmUgdG8gYmUgY29tcHJlc3NlZC4gIFNvIGlmIHlvdSBkb24ndCB3YW50IHRoZQotdGV4dCBjb21wcmVzc2VkLCBzZXQgdGhlIGNvbXByZXNzaW9uIHR5cGUgdG8gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORS4KLUJlY2F1c2UgdEVYdCBhbmQgelRYdCBjaHVua3MgZG9uJ3QgaGF2ZSBhIGxhbmd1YWdlIGZpZWxkLCBpZiB5b3UKLXNwZWNpZnkgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSBvciBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0Ci1hbnkgbGFuZ3VhZ2UgY29kZSBvciB0cmFuc2xhdGVkIGtleXdvcmQgd2lsbCBub3QgYmUgd3JpdHRlbiBvdXQuCi0KLVVudGlsIHRleHQgZ2V0cyBhcm91bmQgMTAwMCBieXRlcywgaXQgaXMgbm90IHdvcnRoIGNvbXByZXNzaW5nIGl0LgotQWZ0ZXIgdGhlIHRleHQgaGFzIGJlZW4gd3JpdHRlbiBvdXQgdG8gdGhlIGZpbGUsIHRoZSBjb21wcmVzc2lvbiB0eXBlCi1pcyBzZXQgdG8gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORV9XUiBvciBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0X1dSLAotc28gdGhhdCBpdCBpc24ndCB3cml0dGVuIG91dCBhZ2FpbiBhdCB0aGUgZW5kIChpbiBjYXNlIHlvdSBhcmUgY2FsbGluZwotcG5nX3dyaXRlX2VuZCgpIHdpdGggdGhlIHNhbWUgc3RydWN0LgotCi1UaGUga2V5d29yZHMgdGhhdCBhcmUgZ2l2ZW4gaW4gdGhlIFBORyBTcGVjaWZpY2F0aW9uIGFyZToKLQotICAgIFRpdGxlICAgICAgICAgICAgU2hvcnQgKG9uZSBsaW5lKSB0aXRsZSBvcgotICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiBmb3IgaW1hZ2UKLSAgICBBdXRob3IgICAgICAgICAgIE5hbWUgb2YgaW1hZ2UncyBjcmVhdG9yCi0gICAgRGVzY3JpcHRpb24gICAgICBEZXNjcmlwdGlvbiBvZiBpbWFnZSAocG9zc2libHkgbG9uZykKLSAgICBDb3B5cmlnaHQgICAgICAgIENvcHlyaWdodCBub3RpY2UKLSAgICBDcmVhdGlvbiBUaW1lICAgIFRpbWUgb2Ygb3JpZ2luYWwgaW1hZ2UgY3JlYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICh1c3VhbGx5IFJGQyAxMTIzIGZvcm1hdCwgc2VlIGJlbG93KQotICAgIFNvZnR3YXJlICAgICAgICAgU29mdHdhcmUgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlCi0gICAgRGlzY2xhaW1lciAgICAgICBMZWdhbCBkaXNjbGFpbWVyCi0gICAgV2FybmluZyAgICAgICAgICBXYXJuaW5nIG9mIG5hdHVyZSBvZiBjb250ZW50Ci0gICAgU291cmNlICAgICAgICAgICBEZXZpY2UgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlCi0gICAgQ29tbWVudCAgICAgICAgICBNaXNjZWxsYW5lb3VzIGNvbW1lbnQ7IGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgIGZyb20gb3RoZXIgaW1hZ2UgZm9ybWF0Ci0KLVRoZSBrZXl3b3JkLXRleHQgcGFpcnMgd29yayBsaWtlIHRoaXMuICBLZXl3b3JkcyBzaG91bGQgYmUgc2hvcnQKLXNpbXBsZSBkZXNjcmlwdGlvbnMgb2Ygd2hhdCB0aGUgY29tbWVudCBpcyBhYm91dC4gIFNvbWUgdHlwaWNhbAota2V5d29yZHMgYXJlIGZvdW5kIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgYXMgaXMgc29tZSByZWNvbW1lbmRhdGlvbnMKLW9uIGtleXdvcmRzLiAgWW91IGNhbiByZXBlYXQga2V5d29yZHMgaW4gYSBmaWxlLiAgWW91IGNhbiBldmVuIHdyaXRlCi1zb21lIHRleHQgYmVmb3JlIHRoZSBpbWFnZSBhbmQgc29tZSBhZnRlci4gIEZvciBleGFtcGxlLCB5b3UgbWF5IHdhbnQKLXRvIHB1dCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpbWFnZSBiZWZvcmUgdGhlIGltYWdlLCBidXQgbGVhdmUgdGhlCi1kaXNjbGFpbWVyIHVudGlsIGFmdGVyLCBzbyB2aWV3ZXJzIHdvcmtpbmcgb3ZlciBtb2RlbSBjb25uZWN0aW9ucwotZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciB0aGUgZGlzY2xhaW1lciB0byBnbyBvdmVyIHRoZSBtb2RlbSBiZWZvcmUKLXRoZXkgc3RhcnQgc2VlaW5nIHRoZSBpbWFnZS4gIEZpbmFsbHksIGtleXdvcmRzIHNob3VsZCBiZSBmdWxsCi13b3Jkcywgbm90IGFiYnJldmlhdGlvbnMuICBLZXl3b3JkcyBhbmQgdGV4dCBhcmUgaW4gdGhlIElTTyA4ODU5LTEKLShMYXRpbi0xKSBjaGFyYWN0ZXIgc2V0IChhIHN1cGVyc2V0IG9mIHJlZ3VsYXIgQVNDSUkpIGFuZCBjYW4gbm90Ci1jb250YWluIE5VTCBjaGFyYWN0ZXJzLCBhbmQgc2hvdWxkIG5vdCBjb250YWluIGNvbnRyb2wgb3Igb3RoZXIKLXVucHJpbnRhYmxlIGNoYXJhY3RlcnMuICBUbyBtYWtlIHRoZSBjb21tZW50cyB3aWRlbHkgcmVhZGFibGUsIHN0aWNrCi13aXRoIGJhc2ljIEFTQ0lJLCBhbmQgYXZvaWQgbWFjaGluZSBzcGVjaWZpYyBjaGFyYWN0ZXIgc2V0IGV4dGVuc2lvbnMKLWxpa2UgdGhlIElCTS1QQyBjaGFyYWN0ZXIgc2V0LiAgVGhlIGtleXdvcmQgbXVzdCBiZSBwcmVzZW50LCBidXQKLXlvdSBjYW4gbGVhdmUgb2ZmIHRoZSB0ZXh0IHN0cmluZyBvbiBub24tY29tcHJlc3NlZCBwYWlycy4KLUNvbXByZXNzZWQgcGFpcnMgbXVzdCBoYXZlIGEgdGV4dCBzdHJpbmcsIGFzIG9ubHkgdGhlIHRleHQgc3RyaW5nCi1pcyBjb21wcmVzc2VkIGFueXdheSwgc28gdGhlIGNvbXByZXNzaW9uIHdvdWxkIGJlIG1lYW5pbmdsZXNzLgotCi1QTkcgc3VwcG9ydHMgbW9kaWZpY2F0aW9uIHRpbWUgdmlhIHRoZSBwbmdfdGltZSBzdHJ1Y3R1cmUuICBUd28KLWNvbnZlcnNpb24gcm91dGluZXMgYXJlIHByb3ZpZGVkLCBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGZvcgotdGltZV90IGFuZCBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZvciBzdHJ1Y3QgdG0uICBUaGUKLXRpbWVfdCByb3V0aW5lIHVzZXMgZ210aW1lKCkuICBZb3UgZG9uJ3QgaGF2ZSB0byB1c2UgZWl0aGVyIG9mCi10aGVzZSwgYnV0IGlmIHlvdSB3aXNoIHRvIGZpbGwgaW4gdGhlIHBuZ190aW1lIHN0cnVjdHVyZSBkaXJlY3RseSwKLXlvdSBzaG91bGQgcHJvdmlkZSB0aGUgdGltZSBpbiB1bml2ZXJzYWwgdGltZSAoR01UKSBpZiBwb3NzaWJsZQotaW5zdGVhZCBvZiB5b3VyIGxvY2FsIHRpbWUuICBOb3RlIHRoYXQgdGhlIHllYXIgbnVtYmVyIGlzIHRoZSBmdWxsCi15ZWFyIChlLmcuIDE5OTgsIHJhdGhlciB0aGFuIDk4IC0gUE5HIGlzIHllYXIgMjAwMCBjb21wbGlhbnQhKSwgYW5kCi10aGF0IG1vbnRocyBzdGFydCB3aXRoIDEuCi0KLUlmIHlvdSB3YW50IHRvIHN0b3JlIHRoZSB0aW1lIG9mIHRoZSBvcmlnaW5hbCBpbWFnZSBjcmVhdGlvbiwgeW91IHNob3VsZAotdXNlIGEgcGxhaW4gdEVYdCBjaHVuayB3aXRoIHRoZSAiQ3JlYXRpb24gVGltZSIga2V5d29yZC4gIFRoaXMgaXMKLW5lY2Vzc2FyeSBiZWNhdXNlIHRoZSAiY3JlYXRpb24gdGltZSIgb2YgYSBQTkcgaW1hZ2UgaXMgc29tZXdoYXQgdmFndWUsCi1kZXBlbmRpbmcgb24gd2hldGhlciB5b3UgbWVhbiB0aGUgUE5HIGZpbGUsIHRoZSB0aW1lIHRoZSBpbWFnZSB3YXMKLWNyZWF0ZWQgaW4gYSBub24tUE5HIGZvcm1hdCwgYSBzdGlsbCBwaG90byBmcm9tIHdoaWNoIHRoZSBpbWFnZSB3YXMKLXNjYW5uZWQsIG9yIHBvc3NpYmx5IHRoZSBzdWJqZWN0IG1hdHRlciBpdHNlbGYuICBJbiBvcmRlciB0byBmYWNpbGl0YXRlCi1tYWNoaW5lLXJlYWRhYmxlIGRhdGVzLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSAiQ3JlYXRpb24gVGltZSIKLXRFWHQgY2h1bmsgdXNlIFJGQyAxMTIzIGZvcm1hdCBkYXRlcyAoZS5nLiAiMjIgTWF5IDE5OTcgMTg6MDc6MTAgR01UIiksCi1hbHRob3VnaCB0aGlzIGlzbid0IGEgcmVxdWlyZW1lbnQuICBVbmxpa2UgdGhlIHRJTUUgY2h1bmssIHRoZQotIkNyZWF0aW9uIFRpbWUiIHRFWHQgY2h1bmsgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGF1dG9tYXRpY2FsbHkgY2hhbmdlZAotYnkgdGhlIHNvZnR3YXJlLiAgVG8gZmFjaWxpdGF0ZSB0aGUgdXNlIG9mIFJGQyAxMTIzIGRhdGVzLCBhIGZ1bmN0aW9uCi1wbmdfY29udmVydF90b19yZmMxMTIzKHBuZ190aW1lcCkgaXMgcHJvdmlkZWQgdG8gY29udmVydCBmcm9tIFBORwotdGltZSB0byBhbiBSRkMgMTEyMyBmb3JtYXQgc3RyaW5nLgotCi0uU1MgV3JpdGluZyB1bmtub3duIGNodW5rcwotCi1Zb3UgY2FuIHVzZSB0aGUgcG5nX3NldF91bmtub3duX2NodW5rcyBmdW5jdGlvbiB0byBxdWV1ZSB1cCBjaHVua3MKLWZvciB3cml0aW5nLiAgWW91IGdpdmUgaXQgYSBjaHVuayBuYW1lLCByYXcgZGF0YSwgYW5kIGEgc2l6ZTsgdGhhdCdzCi1hbGwgdGhlcmUgaXMgdG8gaXQuICBUaGUgY2h1bmtzIHdpbGwgYmUgd3JpdHRlbiBieSB0aGUgbmV4dCBmb2xsb3dpbmcKLXBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFLCBwbmdfd3JpdGVfaW5mbywgb3IgcG5nX3dyaXRlX2VuZCBmdW5jdGlvbi4KLUFueSBjaHVua3MgcHJldmlvdXNseSByZWFkIGludG8gdGhlIGluZm8gc3RydWN0dXJlJ3MgdW5rbm93bi1jaHVuawotbGlzdCB3aWxsIGFsc28gYmUgd3JpdHRlbiBvdXQgaW4gYSBzZXF1ZW5jZSB0aGF0IHNhdGlzZmllcyB0aGUgUE5HCi1zcGVjaWZpY2F0aW9uJ3Mgb3JkZXJpbmcgcnVsZXMuCi0KLS5TUyBUaGUgaGlnaC1sZXZlbCB3cml0ZSBpbnRlcmZhY2UKLQotQXQgdGhpcyBwb2ludCB0aGVyZSBhcmUgdHdvIHdheXMgdG8gcHJvY2VlZDsgdGhyb3VnaCB0aGUgaGlnaC1sZXZlbAotd3JpdGUgaW50ZXJmYWNlLCBvciB0aHJvdWdoIGEgc2VxdWVuY2Ugb2YgbG93LWxldmVsIHdyaXRlIG9wZXJhdGlvbnMuCi1Zb3UgY2FuIHVzZSB0aGUgaGlnaC1sZXZlbCBpbnRlcmZhY2UgaWYgeW91ciBpbWFnZSBkYXRhIGlzIHByZXNlbnQKLWluIHRoZSBpbmZvIHN0cnVjdHVyZS4gIEFsbCBkZWZpbmVkIG91dHB1dAotdHJhbnNmb3JtYXRpb25zIGFyZSBwZXJtaXR0ZWQsIGVuYWJsZWQgYnkgdGhlIGZvbGxvd2luZyBtYXNrcy4KLQotICAgIFBOR19UUkFOU0ZPUk1fSURFTlRJVFkgICAgICBObyB0cmFuc2Zvcm1hdGlvbgotICAgIFBOR19UUkFOU0ZPUk1fUEFDS0lORyAgICAgICBQYWNrIDEsIDIgYW5kIDQtYml0IHNhbXBsZXMKLSAgICBQTkdfVFJBTlNGT1JNX1BBQ0tTV0FQICAgICAgQ2hhbmdlIG9yZGVyIG9mIHBhY2tlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMgdG8gTFNCIGZpcnN0Ci0gICAgUE5HX1RSQU5TRk9STV9JTlZFUlRfTU9OTyAgIEludmVydCBtb25vY2hyb21lIGltYWdlcwotICAgIFBOR19UUkFOU0ZPUk1fU0hJRlQgICAgICAgICBOb3JtYWxpemUgcGl4ZWxzIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQklUIGRlcHRoCi0gICAgUE5HX1RSQU5TRk9STV9CR1IgICAgICAgICAgIEZsaXAgUkdCIHRvIEJHUiwgUkdCQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBCR1JBCi0gICAgUE5HX1RSQU5TRk9STV9TV0FQX0FMUEhBICAgIEZsaXAgUkdCQSB0byBBUkdCIG9yIEdBCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEFHCi0gICAgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEgIENoYW5nZSBhbHBoYSBmcm9tIG9wYWNpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdHJhbnNwYXJlbmN5Ci0gICAgUE5HX1RSQU5TRk9STV9TV0FQX0VORElBTiAgIEJ5dGUtc3dhcCAxNi1iaXQgc2FtcGxlcwotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSICAgICAgICBTdHJpcCBvdXQgZmlsbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIChkZXByZWNhdGVkKS4KLSAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9CRUZPUkUgU3RyaXAgb3V0IGxlYWRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbGVyIGJ5dGVzCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQUZURVIgIFN0cmlwIG91dCB0cmFpbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZXIgYnl0ZXMKLQotSWYgeW91IGhhdmUgdmFsaWQgaW1hZ2UgZGF0YSBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUgKHlvdSBjYW4gdXNlCi1wbmdfc2V0X3Jvd3MoKSB0byBwdXQgaW1hZ2UgZGF0YSBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUpLCBzaW1wbHkgZG8gdGhpczoKLQotICAgIHBuZ193cml0ZV9wbmcocG5nX3B0ciwgaW5mb19wdHIsIHBuZ190cmFuc2Zvcm1zLCBOVUxMKQotCi13aGVyZSBwbmdfdHJhbnNmb3JtcyBpcyBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygc29tZSBzZXQgb2YKLXRyYW5zZm9ybWF0aW9uIGZsYWdzLiAgVGhpcyBjYWxsIGlzIGVxdWl2YWxlbnQgdG8gcG5nX3dyaXRlX2luZm8oKSwKLWZvbGxvd2VkIHRoZSBzZXQgb2YgdHJhbnNmb3JtYXRpb25zIGluZGljYXRlZCBieSB0aGUgdHJhbnNmb3JtIG1hc2ssCi10aGVuIHBuZ193cml0ZV9pbWFnZSgpLCBhbmQgZmluYWxseSBwbmdfd3JpdGVfZW5kKCkuCi0KLShUaGUgZmluYWwgcGFyYW1ldGVyIG9mIHRoaXMgY2FsbCBpcyBub3QgeWV0IHVzZWQuICBTb21lZGF5IGl0IG1pZ2h0IHBvaW50Ci10byB0cmFuc2Zvcm1hdGlvbiBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IHNvbWUgZnV0dXJlIG91dHB1dCB0cmFuc2Zvcm0uKQotCi1Zb3UgbXVzdCB1c2UgcG5nX3RyYW5zZm9ybXMgYW5kIG5vdCBjYWxsIGFueSBwbmdfc2V0X3RyYW5zZm9ybSgpIGZ1bmN0aW9ucwotd2hlbiB5b3UgdXNlIHBuZ193cml0ZV9wbmcoKS4KLQotLlNTIFRoZSBsb3ctbGV2ZWwgd3JpdGUgaW50ZXJmYWNlCi0KLUlmIHlvdSBhcmUgZ29pbmcgdGhlIGxvdy1sZXZlbCByb3V0ZSBpbnN0ZWFkLCB5b3UgYXJlIG5vdyByZWFkeSB0bwotd3JpdGUgYWxsIHRoZSBmaWxlIGluZm9ybWF0aW9uIHVwIHRvIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFlvdSBkbwotdGhpcyB3aXRoIGEgY2FsbCB0byBwbmdfd3JpdGVfaW5mbygpLgotCi0gICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi1Ob3RlIHRoYXQgdGhlcmUgaXMgb25lIHRyYW5zZm9ybWF0aW9uIHlvdSBtYXkgbmVlZCB0byBkbyBiZWZvcmUKLXBuZ193cml0ZV9pbmZvKCkuICBJbiBQTkcgZmlsZXMsIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlIGlzIHRoZQotbGV2ZWwgb2Ygb3BhY2l0eS4gIElmIHlvdXIgZGF0YSBpcyBzdXBwbGllZCBhcyBhIGxldmVsIG9mCi10cmFuc3BhcmVuY3ksIHlvdSBjYW4gaW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsIGJlZm9yZSB5b3Ugd3JpdGUgaXQsIHNvCi10aGF0IDAgaXMgZnVsbHkgdHJhbnNwYXJlbnQgYW5kIDI1NSAoaW4gOC1iaXQgb3IgcGFsZXR0ZWQgaW1hZ2VzKSBvcgotNjU1MzUgKGluIDE2LWJpdCBpbWFnZXMpIGlzIGZ1bGx5IG9wYXF1ZSwgd2l0aAotCi0gICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7Ci0KLVRoaXMgbXVzdCBhcHBlYXIgYmVmb3JlIHBuZ193cml0ZV9pbmZvKCkgaW5zdGVhZCBvZiBsYXRlciB3aXRoIHRoZQotb3RoZXIgdHJhbnNmb3JtYXRpb25zIGJlY2F1c2UgaW4gdGhlIGNhc2Ugb2YgcGFsZXR0ZWQgaW1hZ2VzIHRoZSB0Uk5TCi1jaHVuayBkYXRhIGhhcyB0byBiZSBpbnZlcnRlZCBiZWZvcmUgdGhlIHRSTlMgY2h1bmsgaXMgd3JpdHRlbi4gIElmCi15b3VyIGltYWdlIGlzIG5vdCBhIHBhbGV0dGVkIGltYWdlLCB0aGUgdFJOUyBkYXRhICh3aGljaCBpbiBzdWNoIGNhc2VzCi1yZXByZXNlbnRzIGEgc2luZ2xlIGNvbG9yIHRvIGJlIHJlbmRlcmVkIGFzIHRyYW5zcGFyZW50KSB3b24ndCBuZWVkIHRvCi1iZSBjaGFuZ2VkLCBhbmQgeW91IGNhbiBzYWZlbHkgZG8gdGhpcyB0cmFuc2Zvcm1hdGlvbiBhZnRlciB5b3VyCi1wbmdfd3JpdGVfaW5mbygpIGNhbGwuCi0KLUlmIHlvdSBuZWVkIHRvIHdyaXRlIGEgcHJpdmF0ZSBjaHVuayB0aGF0IHlvdSB3YW50IHRvIGFwcGVhciBiZWZvcmUKLXRoZSBQTFRFIGNodW5rIHdoZW4gUExURSBpcyBwcmVzZW50LCB5b3UgY2FuIHdyaXRlIHRoZSBQTkcgaW5mbyBpbgotdHdvIHN0ZXBzLCBhbmQgaW5zZXJ0IGNvZGUgdG8gd3JpdGUgeW91ciBvd24gY2h1bmsgYmV0d2VlbiB0aGVtOgotCi0gICAgcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUocG5nX3B0ciwgaW5mb19wdHIpOwotICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsIC4uLik7Ci0gICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi1BZnRlciB5b3UndmUgd3JpdHRlbiB0aGUgZmlsZSBpbmZvcm1hdGlvbiwgeW91IGNhbiBzZXQgdXAgdGhlIGxpYnJhcnkKLXRvIGhhbmRsZSBhbnkgc3BlY2lhbCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGltYWdlIGRhdGEuICBUaGUgdmFyaW91cwotd2F5cyB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleQotc2hvdWxkIG9jY3VyLiAgVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHNvbWUgb2YgdGhlc2UgY2hhbmdlIHRoZSBjb2xvcgotdHlwZSBhbmQvb3IgYml0IGRlcHRoIG9mIHRoZSBkYXRhLCBhbmQgc29tZSBvdGhlcnMgb25seSB3b3JrIG9uCi1jZXJ0YWluIGNvbG9yIHR5cGVzIGFuZCBiaXQgZGVwdGhzLiAgRXZlbiB0aG91Z2ggZWFjaCB0cmFuc2Zvcm1hdGlvbgotY2hlY2tzIHRvIHNlZSBpZiBpdCBoYXMgZGF0YSB0aGF0IGl0IGNhbiBkbyBzb21ldGhpbmcgd2l0aCwgeW91IHNob3VsZAotbWFrZSBzdXJlIHRvIG9ubHkgZW5hYmxlIGEgdHJhbnNmb3JtYXRpb24gaWYgaXQgd2lsbCBiZSB2YWxpZCBmb3IgdGhlCi1kYXRhLiAgRm9yIGV4YW1wbGUsIGRvbid0IHN3YXAgcmVkIGFuZCBibHVlIG9uIGdyYXlzY2FsZSBkYXRhLgotCi1QTkcgZmlsZXMgc3RvcmUgUkdCIHBpeGVscyBwYWNrZWQgaW50byAzIG9yIDYgYnl0ZXMuICBUaGlzIGNvZGUgdGVsbHMKLXRoZSBsaWJyYXJ5IHRvIHN0cmlwIGlucHV0IGRhdGEgdGhhdCBoYXMgNCBvciA4IGJ5dGVzIHBlciBwaXhlbCBkb3duCi10byAzIG9yIDYgYnl0ZXMgKG9yIHN0cmlwIDIgb3IgNC1ieXRlIGdyYXlzY2FsZStmaWxsZXIgZGF0YSB0byAxIG9yIDIKLWJ5dGVzIHBlciBwaXhlbCkuCi0KLSAgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAwLCBQTkdfRklMTEVSX0JFRk9SRSk7Ci0KLXdoZXJlIHRoZSAwIGlzIHVudXNlZCwgYW5kIHRoZSBsb2NhdGlvbiBpcyBlaXRoZXIgUE5HX0ZJTExFUl9CRUZPUkUgb3IKLVBOR19GSUxMRVJfQUZURVIsIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgdGhlIGZpbGxlciBieXRlIGluIHRoZSBwaXhlbAotaXMgc3RvcmVkIFhSR0Igb3IgUkdCWC4KLQotUE5HIGZpbGVzIHBhY2sgcGl4ZWxzIG9mIGJpdCBkZXB0aHMgMSwgMiwgYW5kIDQgaW50byBieXRlcyBhcyBzbWFsbCBhcwotdGhleSBjYW4sIHJlc3VsdGluZyBpbiwgZm9yIGV4YW1wbGUsIDggcGl4ZWxzIHBlciBieXRlIGZvciAxIGJpdCBmaWxlcy4KLUlmIHRoZSBkYXRhIGlzIHN1cHBsaWVkIGF0IDEgcGl4ZWwgcGVyIGJ5dGUsIHVzZSB0aGlzIGNvZGUsIHdoaWNoIHdpbGwKLWNvcnJlY3RseSBwYWNrIHRoZSBwaXhlbHMgaW50byBhIHNpbmdsZSBieXRlOgotCi0gICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOwotCi1QTkcgZmlsZXMgcmVkdWNlIHBvc3NpYmxlIGJpdCBkZXB0aHMgdG8gMSwgMiwgNCwgOCwgYW5kIDE2LiAgSWYgeW91cgotZGF0YSBpcyBvZiBhbm90aGVyIGJpdCBkZXB0aCwgeW91IGNhbiB3cml0ZSBhbiBzQklUIGNodW5rIGludG8gdGhlCi1maWxlIHNvIHRoYXQgZGVjb2RlcnMgY2FuIHJlY292ZXIgdGhlIG9yaWdpbmFsIGRhdGEgaWYgZGVzaXJlZC4KLQotICAgIC8qIFNldCB0aGUgdHJ1ZSBiaXQgZGVwdGggb2YgdGhlIGltYWdlIGRhdGEgKi8KLSAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgIHsKLSAgICAgICAgc2lnX2JpdC5yZWQgPSB0cnVlX2JpdF9kZXB0aDsKLSAgICAgICAgc2lnX2JpdC5ncmVlbiA9IHRydWVfYml0X2RlcHRoOwotICAgICAgICBzaWdfYml0LmJsdWUgPSB0cnVlX2JpdF9kZXB0aDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc2lnX2JpdC5ncmF5ID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgfQotICAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0gICAgewotICAgICAgICBzaWdfYml0LmFscGhhID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgfQotCi0gICAgcG5nX3NldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCk7Ci0KLUlmIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgcm93IGJ1ZmZlciBpbiBhIGJpdCBkZXB0aCBvdGhlciB0aGFuCi1vbmUgc3VwcG9ydGVkIGJ5IFBORyAoZS5nLiAzIGJpdCBkYXRhIGluIHRoZSByYW5nZSAwLTcgZm9yIGEgNC1iaXQgUE5HKSwKLXRoaXMgd2lsbCBzY2FsZSB0aGUgdmFsdWVzIHRvIGFwcGVhciB0byBiZSB0aGUgY29ycmVjdCBiaXQgZGVwdGggYXMKLWlzIHJlcXVpcmVkIGJ5IFBORy4KLQotICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgJnNpZ19iaXQpOwotCi1QTkcgZmlsZXMgc3RvcmUgMTYgYml0IHBpeGVscyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZy1lbmRpYW4sCi1pZS4gbW9zdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0KS4gIFRoaXMgY29kZSB3b3VsZCBiZSB1c2VkIGlmIHRoZXkgYXJlCi1zdXBwbGllZCB0aGUgb3RoZXIgd2F5IChsaXR0bGUtZW5kaWFuLCBpLmUuIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKLWZpcnN0LCB0aGUgd2F5IFBDcyBzdG9yZSB0aGVtKToKLQotICAgIGlmIChiaXRfZGVwdGggPiA4KQotICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKLQotSWYgeW91IGFyZSB1c2luZyBwYWNrZWQtcGl4ZWwgaW1hZ2VzICgxLCAyLCBvciA0IGJpdHMvcGl4ZWwpLCBhbmQgeW91Ci1uZWVkIHRvIGNoYW5nZSB0aGUgb3JkZXIgdGhlIHBpeGVscyBhcmUgcGFja2VkIGludG8gYnl0ZXMsIHlvdSBjYW4gdXNlOgotCi0gICAgaWYgKGJpdF9kZXB0aCA8IDgpCi0gICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHN0b3JlIDMgY29sb3IgcGl4ZWxzIGluIHJlZCwgZ3JlZW4sIGJsdWUgb3JkZXIuICBUaGlzIGNvZGUKLXdvdWxkIGJlIHVzZWQgaWYgdGhleSBhcmUgc3VwcGxpZWQgYXMgYmx1ZSwgZ3JlZW4sIHJlZDoKLQotICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOwotCi1QTkcgZmlsZXMgZGVzY3JpYmUgbW9ub2Nocm9tZSBhcyBibGFjayBiZWluZyB6ZXJvIGFuZCB3aGl0ZSBiZWluZwotb25lLiBUaGlzIGNvZGUgd291bGQgYmUgdXNlZCBpZiB0aGUgcGl4ZWxzIGFyZSBzdXBwbGllZCB3aXRoIHRoaXMgcmV2ZXJzZWQKLShibGFjayBiZWluZyBvbmUgYW5kIHdoaXRlIGJlaW5nIHplcm8pOgotCi0gICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKLQotRmluYWxseSwgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpZiBub25lIG9mCi10aGUgZXhpc3Rpbmcgb25lcyBtZWV0cyB5b3VyIG5lZWRzLiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgYSBjYWxsYmFjawotd2l0aAotCi0gICAgcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbihwbmdfcHRyLAotICAgICAgIHdyaXRlX3RyYW5zZm9ybV9mbik7Ci0KLVlvdSBtdXN0IHN1cHBseSB0aGUgZnVuY3Rpb24KLQotICAgIHZvaWQgd3JpdGVfdHJhbnNmb3JtX2ZuKHBuZ19wdHIgcHRyLCByb3dfaW5mb19wdHIKLSAgICAgICByb3dfaW5mbywgcG5nX2J5dGVwIGRhdGEpCi0KLVNlZSBwbmd0ZXN0LmMgZm9yIGEgd29ya2luZyBleGFtcGxlLiAgWW91ciBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAotYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIGFyZSBwcm9jZXNzZWQuCi0KLVlvdSBjYW4gYWxzbyBzZXQgdXAgYSBwb2ludGVyIHRvIGEgdXNlciBzdHJ1Y3R1cmUgZm9yIHVzZSBieSB5b3VyCi1jYWxsYmFjayBmdW5jdGlvbi4KLQotICAgIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCB1c2VyX3B0ciwgMCwgMCk7Ci0KLVRoZSB1c2VyX2NoYW5uZWxzIGFuZCB1c2VyX2RlcHRoIHBhcmFtZXRlcnMgb2YgdGhpcyBmdW5jdGlvbiBhcmUgaWdub3JlZAotd2hlbiB3cml0aW5nOyB5b3UgY2FuIHNldCB0aGVtIHRvIHplcm8gYXMgc2hvd24uCi0KLVlvdSBjYW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgdmlhIHRoZSBmdW5jdGlvbiBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cigpLgotRm9yIGV4YW1wbGU6Ci0KLSAgICB2b2lkcCB3cml0ZV91c2VyX3RyYW5zZm9ybV9wdHIgPQotICAgICAgIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKHBuZ19wdHIpOwotCi1JdCBpcyBwb3NzaWJsZSB0byBoYXZlIGxpYnBuZyBmbHVzaCBhbnkgcGVuZGluZyBvdXRwdXQsIGVpdGhlciBtYW51YWxseSwKLW9yIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgYSBjZXJ0YWluIG51bWJlciBvZiBsaW5lcyBoYXZlIGJlZW4gd3JpdHRlbi4gIFRvCi1mbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBhIHNpbmdsZSB0aW1lIGNhbGw6Ci0KLSAgICBwbmdfd3JpdGVfZmx1c2gocG5nX3B0cik7Ci0KLWFuZCB0byBoYXZlIGxpYnBuZyBmbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBwZXJpb2RpY2FsbHkgYWZ0ZXIgYSBjZXJ0YWluCi1udW1iZXIgb2Ygc2NhbmxpbmVzIGhhdmUgYmVlbiB3cml0dGVuLCBjYWxsOgotCi0gICAgcG5nX3NldF9mbHVzaChwbmdfcHRyLCBucm93cyk7Ci0KLU5vdGUgdGhhdCB0aGUgZGlzdGFuY2UgYmV0d2VlbiByb3dzIGlzIGZyb20gdGhlIGxhc3QgdGltZSBwbmdfd3JpdGVfZmx1c2goKQotd2FzIGNhbGxlZCwgb3IgdGhlIGZpcnN0IHJvdyBvZiB0aGUgaW1hZ2UgaWYgaXQgaGFzIG5ldmVyIGJlZW4gY2FsbGVkLgotU28gaWYgeW91IHdyaXRlIDUwIGxpbmVzLCBhbmQgdGhlbiBwbmdfc2V0X2ZsdXNoIDI1LCBpdCB3aWxsIGZsdXNoIHRoZQotb3V0cHV0IG9uIHRoZSBuZXh0IHNjYW5saW5lLCBhbmQgZXZlcnkgMjUgbGluZXMgdGhlcmVhZnRlciwgdW5sZXNzCi1wbmdfd3JpdGVfZmx1c2goKSBpcyBjYWxsZWQgYmVmb3JlIDI1IG1vcmUgbGluZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uCi1JZiBucm93cyBpcyB0b28gc21hbGwgKGxlc3MgdGhhbiBhYm91dCAxMCBsaW5lcyBmb3IgYSA2NDAgcGl4ZWwgd2lkZQotUkdCIGltYWdlKSB0aGUgaW1hZ2UgY29tcHJlc3Npb24gbWF5IGRlY3JlYXNlIG5vdGljZWFibHkgKGFsdGhvdWdoIHRoaXMKLW1heSBiZSBhY2NlcHRhYmxlIGZvciByZWFsLXRpbWUgYXBwbGljYXRpb25zKS4gIEluZnJlcXVlbnQgZmx1c2hpbmcgd2lsbAotb25seSBkZWdyYWRlIHRoZSBjb21wcmVzc2lvbiBwZXJmb3JtYW5jZSBieSBhIGZldyBwZXJjZW50IG92ZXIgaW1hZ2VzCi10aGF0IGRvIG5vdCB1c2UgZmx1c2hpbmcuCi0KLS5TUyBXcml0aW5nIHRoZSBpbWFnZSBkYXRhCi0KLVRoYXQncyBpdCBmb3IgdGhlIHRyYW5zZm9ybWF0aW9ucy4gIE5vdyB5b3UgY2FuIHdyaXRlIHRoZSBpbWFnZSBkYXRhLgotVGhlIHNpbXBsZXN0IHdheSB0byBkbyB0aGlzIGlzIGluIG9uZSBmdW5jdGlvbiBjYWxsLiAgSWYgeW91IGhhdmUgdGhlCi13aG9sZSBpbWFnZSBpbiBtZW1vcnksIHlvdSBjYW4ganVzdCBjYWxsIHBuZ193cml0ZV9pbWFnZSgpIGFuZCBsaWJwbmcKLXdpbGwgd3JpdGUgdGhlIGltYWdlLiAgWW91IHdpbGwgbmVlZCB0byBwYXNzIGluIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvCi1lYWNoIHJvdy4gIFRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIGludGVybGFjaW5nLCBzbyB5b3UgZG9uJ3QKLW5lZWQgdG8gY2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIG9yIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZQotdGltZXMsIG9yIGFueSBvZiB0aGF0IG90aGVyIHN0dWZmIG5lY2Vzc2FyeSB3aXRoIHBuZ193cml0ZV9yb3dzKCkuCi0KLSAgICBwbmdfd3JpdGVfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKLQotd2hlcmUgcm93X3BvaW50ZXJzIGlzOgotCi0gICAgcG5nX2J5dGUgKnJvd19wb2ludGVyc1toZWlnaHRdOwotCi1Zb3UgY2FuIHBvaW50IHRvIHZvaWQgb3IgY2hhciBvciB3aGF0ZXZlciB5b3UgdXNlIGZvciBwaXhlbHMuCi0KLUlmIHlvdSBkb24ndCB3YW50IHRvIHdyaXRlIHRoZSB3aG9sZSBpbWFnZSBhdCBvbmNlLCB5b3UgY2FuCi11c2UgcG5nX3dyaXRlX3Jvd3MoKSBpbnN0ZWFkLiAgSWYgdGhlIGZpbGUgaXMgbm90IGludGVybGFjZWQsCi10aGlzIGlzIHNpbXBsZToKLQotICAgIHBuZ193cml0ZV9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywKLSAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0KLXJvd19wb2ludGVycyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgcG5nX3dyaXRlX2ltYWdlKCkgY2FsbC4KLQotSWYgeW91IGFyZSBqdXN0IHdyaXRpbmcgb25lIHJvdyBhdCBhIHRpbWUsIHlvdSBjYW4gZG8gdGhpcyB3aXRoCi1hIHNpbmdsZSByb3dfcG9pbnRlciBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIHJvd19wb2ludGVyczoKLQotICAgIHBuZ19ieXRlcCByb3dfcG9pbnRlciA9IHJvdzsKLQotICAgIHBuZ193cml0ZV9yb3cocG5nX3B0ciwgcm93X3BvaW50ZXIpOwotCi1XaGVuIHRoZSBmaWxlIGlzIGludGVybGFjZWQsIHRoaW5ncyBjYW4gZ2V0IGEgZ29vZCBkZWFsIG1vcmUKLWNvbXBsaWNhdGVkLiAgVGhlIG9ubHkgY3VycmVudGx5IChhcyBvZiB0aGUgUE5HIFNwZWNpZmljYXRpb24KLXZlcnNpb24gMS4yLCBkYXRlZCBKdWx5IDE5OTkpIGRlZmluZWQgaW50ZXJsYWNpbmcgc2NoZW1lIGZvciBQTkcgZmlsZXMKLWlzIHRoZSAiQWRhbTciIGludGVybGFjZSBzY2hlbWUsIHRoYXQgYnJlYWtzIGRvd24gYW4KLWltYWdlIGludG8gc2V2ZW4gc21hbGxlciBpbWFnZXMgb2YgdmFyeWluZyBzaXplLiAgbGlicG5nIHdpbGwgYnVpbGQKLXRoZXNlIGltYWdlcyBmb3IgeW91LCBvciB5b3UgY2FuIGRvIHRoZW0geW91cnNlbGYuICBJZiB5b3Ugd2FudCB0bwotYnVpbGQgdGhlbSB5b3Vyc2VsZiwgc2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvZiB3aGljaAotcGl4ZWxzIHRvIHdyaXRlIHdoZW4uCi0KLUlmIHlvdSBkb24ndCB3YW50IGxpYnBuZyB0byBoYW5kbGUgdGhlIGludGVybGFjaW5nIGRldGFpbHMsIGp1c3QKLXVzZSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIGFuZCBjYWxsIHBuZ193cml0ZV9yb3dzKCkgdGhlCi1jb3JyZWN0IG51bWJlciBvZiB0aW1lcyB0byB3cml0ZSBhbGwgc2V2ZW4gc3ViLWltYWdlcy4KLQotSWYgeW91IHdhbnQgbGlicG5nIHRvIGJ1aWxkIHRoZSBzdWItaW1hZ2VzLCBjYWxsIHRoaXMgYmVmb3JlIHlvdSBzdGFydAotd3JpdGluZyBhbnkgcm93czoKLQotICAgIG51bWJlcl9vZl9wYXNzZXMgPQotICAgICAgIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotCi1UaGlzIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFzc2VzIG5lZWRlZC4gIEN1cnJlbnRseSwgdGhpcwotaXMgc2V2ZW4sIGJ1dCBtYXkgY2hhbmdlIGlmIGFub3RoZXIgaW50ZXJsYWNlIHR5cGUgaXMgYWRkZWQuCi0KLVRoZW4gd3JpdGUgdGhlIGNvbXBsZXRlIGltYWdlIG51bWJlcl9vZl9wYXNzZXMgdGltZXMuCi0KLSAgICBwbmdfd3JpdGVfcm93cyhwbmdfcHRyLCByb3dfcG9pbnRlcnMsCi0gICAgICAgbnVtYmVyX29mX3Jvd3MpOwotCi1BcyBzb21lIG9mIHRoZXNlIHJvd3MgYXJlIG5vdCB1c2VkLCBhbmQgdGh1cyByZXR1cm4gaW1tZWRpYXRlbHksCi15b3UgbWF5IHdhbnQgdG8gcmVhZCBhYm91dCBpbnRlcmxhY2luZyBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24sCi1hbmQgb25seSB1cGRhdGUgdGhlIHJvd3MgdGhhdCBhcmUgYWN0dWFsbHkgdXNlZC4KLQotLlNTIEZpbmlzaGluZyBhIHNlcXVlbnRpYWwgd3JpdGUKLQotQWZ0ZXIgeW91IGFyZSBmaW5pc2hlZCB3cml0aW5nIHRoZSBpbWFnZSwgeW91IHNob3VsZCBmaW5pc2ggd3JpdGluZwotdGhlIGZpbGUuICBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gd3JpdGluZyBjb21tZW50cyBvciB0aW1lLCB5b3Ugc2hvdWxkCi1wYXNzIGFuIGFwcHJvcHJpYXRlbHkgZmlsbGVkIHBuZ19pbmZvIHBvaW50ZXIuICBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkLAoteW91IGNhbiBwYXNzIE5VTEwuCi0KLSAgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSBjYW4gZnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgbGlicG5nIGxpa2UgdGhpczoKLQotICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmRpdmlkdWFsbHkgZnJlZSB0aGUgaW5mb19wdHIgbWVtYmVycyB0aGF0Ci1wb2ludCB0byBsaWJwbmctYWxsb2NhdGVkIHN0b3JhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgotCi0gICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgbWFzaywgc2VxKQotICAgIG1hc2sgIC0gaWRlbnRpZmllcyBkYXRhIHRvIGJlIGZyZWVkLCBhIG1hc2sKLSAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygb25lIG9yCi0gICAgICAgICAgICBtb3JlIG9mCi0gICAgICAgICAgICAgIFBOR19GUkVFX1BMVEUsIFBOR19GUkVFX1RSTlMsCi0gICAgICAgICAgICAgIFBOR19GUkVFX0hJU1QsIFBOR19GUkVFX0lDQ1AsCi0gICAgICAgICAgICAgIFBOR19GUkVFX1BDQUwsIFBOR19GUkVFX1JPV1MsCi0gICAgICAgICAgICAgIFBOR19GUkVFX1NDQUwsIFBOR19GUkVFX1NQTFQsCi0gICAgICAgICAgICAgIFBOR19GUkVFX1RFWFQsIFBOR19GUkVFX1VOS04sCi0gICAgICAgICAgICBvciBzaW1wbHkgUE5HX0ZSRUVfQUxMCi0gICAgc2VxICAgLSBzZXF1ZW5jZSBudW1iZXIgb2YgaXRlbSB0byBiZSBmcmVlZAotICAgICAgICAgICAgKC0xIGZvciBhbGwgaXRlbXMpCi0KLVRoaXMgZnVuY3Rpb24gbWF5IGJlIHNhZmVseSBjYWxsZWQgd2hlbiB0aGUgcmVsZXZhbnQgc3RvcmFnZSBoYXMKLWFscmVhZHkgYmVlbiBmcmVlZCwgb3IgaGFzIG5vdCB5ZXQgYmVlbiBhbGxvY2F0ZWQsIG9yIHdhcyBhbGxvY2F0ZWQKLWJ5IHRoZSB1c2VyICBhbmQgbm90IGJ5IGxpYnBuZywgIGFuZCB3aWxsIGluIHRob3NlCi1jYXNlcyBkbyBub3RoaW5nLiAgVGhlICJzZXEiIHBhcmFtZXRlciBpcyBpZ25vcmVkIGlmIG9ubHkgb25lIGl0ZW0KLW9mIHRoZSBzZWxlY3RlZCBkYXRhIHR5cGUsIHN1Y2ggYXMgUExURSwgaXMgYWxsb3dlZC4gIElmICJzZXEiIGlzIG5vdAotLTEsIGFuZCBtdWx0aXBsZSBpdGVtcyBhcmUgYWxsb3dlZCBmb3IgdGhlIGRhdGEgdHlwZSBpZGVudGlmaWVkIGluCi10aGUgbWFzaywgc3VjaCBhcyB0ZXh0IG9yIHNQTFQsIG9ubHkgdGhlIG4ndGggaXRlbSBpbiB0aGUgc3RydWN0dXJlCi1pcyBmcmVlZCwgd2hlcmUgbiBpcyAic2VxIi4KLQotSWYgeW91IGFsbG9jYXRlZCBkYXRhIHN1Y2ggYXMgYSBwYWxldHRlIHRoYXQgeW91IHBhc3NlZAotaW4gdG8gbGlicG5nIHdpdGggcG5nX3NldF8qLCB5b3UgbXVzdCBub3QgZnJlZSBpdCB1bnRpbCBqdXN0IGJlZm9yZSB0aGUgY2FsbCB0bwotcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkuCi0KLVRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIG9ubHkgdG8gZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBpbnRlcm5hbGx5Ci1ieSBsaWJwbmcuICBUaGlzIGNhbiBiZSBjaGFuZ2VkLCBzbyB0aGF0IGxpYnBuZyB3aWxsIG5vdCBmcmVlIHRoZSBkYXRhLAotb3Igc28gdGhhdCBpdCB3aWxsIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIgd2l0aCBwbmdfbWFsbG9jKCkKLW9yIHBuZ196YWxsb2MoKSBhbmQgcGFzc2VkIGluIHZpYSBhIHBuZ19zZXRfKigpIGZ1bmN0aW9uLCB3aXRoCi0KLSAgICBwbmdfZGF0YV9mcmVlcihwbmdfcHRyLCBpbmZvX3B0ciwgZnJlZXIsIG1hc2spCi0gICAgbWFzayAgIC0gd2hpY2ggZGF0YSBlbGVtZW50cyBhcmUgYWZmZWN0ZWQKLSAgICAgICAgICAgICBzYW1lIGNob2ljZXMgYXMgaW4gcG5nX2ZyZWVfZGF0YSgpCi0gICAgZnJlZXIgIC0gb25lIG9mCi0gICAgICAgICAgICAgICBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQQotICAgICAgICAgICAgICAgUE5HX1NFVF9XSUxMX0ZSRUVfREFUQQotICAgICAgICAgICAgICAgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEKLQotRm9yIGV4YW1wbGUsIHRvIHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBzb21lIGRhdGEgZnJvbSBhIHJlYWQgc3RydWN0dXJlCi10byBhIHdyaXRlIHN0cnVjdHVyZSwgeW91IGNvdWxkIHVzZQotCi0gICAgcG5nX2RhdGFfZnJlZXIocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsCi0gICAgICAgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEsCi0gICAgICAgUE5HX0ZSRUVfUExURXxQTkdfRlJFRV90Uk5TfFBOR19GUkVFX2hJU1QpCi0gICAgcG5nX2RhdGFfZnJlZXIod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwKLSAgICAgICBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQSwKLSAgICAgICBQTkdfRlJFRV9QTFRFfFBOR19GUkVFX3RSTlN8UE5HX0ZSRUVfaElTVCkKLQotdGhlcmVieSBicmllZmx5IHJlYXNzaWduaW5nIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIHRvIHRoZSB1c2VyIGJ1dAotaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcyByZWFzc2lnbmluZyBpdCBvbmNlIG1vcmUgdG8gdGhlIHdyaXRlX2Rlc3Ryb3kKLWZ1bmN0aW9uLiAgSGF2aW5nIGRvbmUgdGhpcywgaXQgd291bGQgdGhlbiBiZSBzYWZlIHRvIGRlc3Ryb3kgdGhlIHJlYWQKLXN0cnVjdHVyZSBhbmQgY29udGludWUgdG8gdXNlIHRoZSBQTFRFLCB0Uk5TLCBhbmQgaElTVCBkYXRhIGluIHRoZSB3cml0ZQotc3RydWN0dXJlLgotCi1UaGlzIGZ1bmN0aW9uIG9ubHkgYWZmZWN0cyBkYXRhIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuCi1Zb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgY2FsbGluZyBhZnRlciB0aGUgcG5nX3NldF8qKCkgZnVuY3Rpb25zCi10byBjb250cm9sIHdoZXRoZXIgdGhlIHVzZXIgb3IgcG5nX2Rlc3Ryb3lfKigpIGlzIHN1cHBvc2VkIHRvIGZyZWUgdGhlIGRhdGEuCi1XaGVuIHRoZSB1c2VyIGFzc3VtZXMgcmVzcG9uc2liaWxpdHkgZm9yIGxpYnBuZy1hbGxvY2F0ZWQgZGF0YSwgdGhlCi1hcHBsaWNhdGlvbiBtdXN0IHVzZQotcG5nX2ZyZWUoKSB0byBmcmVlIGl0LCBhbmQgd2hlbiB0aGUgdXNlciB0cmFuc2ZlcnMgcmVzcG9uc2liaWxpdHkgdG8gbGlicG5nCi1mb3IgZGF0YSB0aGF0IHRoZSB1c2VyIGhhcyBhbGxvY2F0ZWQsIHRoZSB1c2VyIG11c3QgaGF2ZSB1c2VkIHBuZ19tYWxsb2MoKQotb3IgcG5nX3phbGxvYygpIHRvIGFsbG9jYXRlIGl0LgotCi1JZiB5b3UgYWxsb2NhdGVkIHRleHRfcHRyLnRleHQsIHRleHRfcHRyLmxhbmcsIGFuZCB0ZXh0X3B0ci50cmFuc2xhdGVkX2tleXdvcmQKLXNlcGFyYXRlbHksIGRvIG5vdCB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0ZXh0X3B0ciB0byBsaWJwbmcsCi1iZWNhdXNlIHdoZW4gbGlicG5nIGZpbGxzIGEgcG5nX3RleHQgc3RydWN0dXJlIGl0IGNvbWJpbmVzIHRoZXNlIG1lbWJlcnMgd2l0aAotdGhlIGtleSBtZW1iZXIsIGFuZCBwbmdfZnJlZV9kYXRhKCkgd2lsbCBmcmVlIG9ubHkgdGV4dF9wdHIua2V5LiAgU2ltaWxhcmx5LAotaWYgeW91IHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlJ2luZyB0ZXh0X3B0ciBmcm9tIGxpYnBuZyB0byB5b3VyCi1hcHBsaWNhdGlvbiwgeW91ciBhcHBsaWNhdGlvbiBtdXN0IG5vdCBzZXBhcmF0ZWx5IGZyZWUgdGhvc2UgbWVtYmVycy4KLUZvciBhIG1vcmUgY29tcGFjdCBleGFtcGxlIG9mIHdyaXRpbmcgYSBQTkcgaW1hZ2UsIHNlZSB0aGUgZmlsZSBleGFtcGxlLmMuCi0KLS5TSCBWLiBNb2RpZnlpbmcvQ3VzdG9taXppbmcgbGlicG5nOgotCi1UaGVyZSBhcmUgdHdvIGlzc3VlcyBoZXJlLiAgVGhlIGZpcnN0IGlzIGNoYW5naW5nIGhvdyBsaWJwbmcgZG9lcwotc3RhbmRhcmQgdGhpbmdzIGxpa2UgbWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nLgotVGhlIHNlY29uZCBkZWFscyB3aXRoIG1vcmUgY29tcGxpY2F0ZWQgdGhpbmdzIGxpa2UgYWRkaW5nIG5ldyBjaHVua3MsCi1hZGRpbmcgbmV3IHRyYW5zZm9ybWF0aW9ucywgYW5kIGdlbmVyYWxseSBjaGFuZ2luZyBob3cgbGlicG5nIHdvcmtzLgotQm90aCBvZiB0aG9zZSBhcmUgY29tcGlsZS10aW1lIGlzc3VlczsgdGhhdCBpcywgdGhleSBhcmUgZ2VuZXJhbGx5Ci1kZXRlcm1pbmVkIGF0IHRoZSB0aW1lIHRoZSBjb2RlIGlzIHdyaXR0ZW4sIGFuZCB0aGVyZSBpcyByYXJlbHkgYSBuZWVkCi10byBwcm92aWRlIHRoZSB1c2VyIHdpdGggYSBtZWFucyBvZiBjaGFuZ2luZyB0aGVtLgotCi1NZW1vcnkgYWxsb2NhdGlvbiwgaW5wdXQvb3V0cHV0LCBhbmQgZXJyb3IgaGFuZGxpbmcKLQotQWxsIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiwgaW5wdXQvb3V0cHV0LCBhbmQgZXJyb3IgaGFuZGxpbmcgaW4gbGlicG5nCi1nb2VzIHRocm91Z2ggY2FsbGJhY2tzIHRoYXQgYXJlIHVzZXItc2V0dGFibGUuICBUaGUgZGVmYXVsdCByb3V0aW5lcyBhcmUKLWluIHBuZ21lbS5jLCBwbmdyaW8uYywgcG5nd2lvLmMsIGFuZCBwbmdlcnJvci5jLCByZXNwZWN0aXZlbHkuICBUbyBjaGFuZ2UKLXRoZXNlIGZ1bmN0aW9ucywgY2FsbCB0aGUgYXBwcm9wcmlhdGUgcG5nX3NldF8qX2ZuKCkgZnVuY3Rpb24uCi0KLU1lbW9yeSBhbGxvY2F0aW9uIGlzIGRvbmUgdGhyb3VnaCB0aGUgZnVuY3Rpb25zIHBuZ19tYWxsb2MoKQotYW5kIHBuZ19mcmVlKCkuICBUaGVzZSBjdXJyZW50bHkganVzdCBjYWxsIHRoZSBzdGFuZGFyZCBDIGZ1bmN0aW9ucy4gIElmCi15b3VyIHBvaW50ZXJzIGNhbid0IGFjY2VzcyBtb3JlIHRoZW4gNjRLIGF0IGEgdGltZSwgeW91IHdpbGwgd2FudCB0byBzZXQKLU1BWFNFR182NEsgaW4gemxpYi5oLiAgU2luY2UgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgbWV0aG9kIG9mIGhhbmRsaW5nCi1tZW1vcnkgYWxsb2NhdGlvbiBvbiBhIHBsYXRmb3JtIHdpbGwgY2hhbmdlIGJldHdlZW4gYXBwbGljYXRpb25zLCB0aGVzZQotZnVuY3Rpb25zIG11c3QgYmUgbW9kaWZpZWQgaW4gdGhlIGxpYnJhcnkgYXQgY29tcGlsZSB0aW1lLiAgSWYgeW91IHByZWZlcgotdG8gdXNlIGEgZGlmZmVyZW50IG1ldGhvZCBvZiBhbGxvY2F0aW5nIGFuZCBmcmVlaW5nIGRhdGEsIHlvdSBjYW4gdXNlCi1wbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoKSBvciBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKCkgdG8gcmVnaXN0ZXIKLXlvdXIgb3duIGZ1bmN0aW9ucyBhcyBkZXNjcmliZWQgYWJvdmUuCi1UaGVzZSBmdW5jdGlvbnMgYWxzbyBwcm92aWRlIGEgdm9pZCBwb2ludGVyIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB2aWEKLQotICAgIG1lbV9wdHI9cG5nX2dldF9tZW1fcHRyKHBuZ19wdHIpOwotCi1Zb3VyIHJlcGxhY2VtZW50IG1lbW9yeSBmdW5jdGlvbnMgbXVzdCBoYXZlIHByb3RvdHlwZXMgYXMgZm9sbG93czoKLQotICAgIHBuZ192b2lkcCBtYWxsb2NfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICBwbmdfc2l6ZV90IHNpemUpOwotICAgIHZvaWQgZnJlZV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyKTsKLQotWW91ciBtYWxsb2NfZm4oKSBtdXN0IHJldHVybiBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4gIFRoZSBwbmdfbWFsbG9jKCkKLWZ1bmN0aW9uIHdpbGwgbm9ybWFsbHkgY2FsbCBwbmdfZXJyb3IoKSBpZiBpdCByZWNlaXZlcyBhIE5VTEwgZnJvbSB0aGUKLXN5c3RlbSBtZW1vcnkgYWxsb2NhdG9yIG9yIGZyb20geW91ciByZXBsYWNlbWVudCBtYWxsb2NfZm4oKS4KLQotWW91ciBmcmVlX2ZuKCkgd2lsbCBuZXZlciBiZSBjYWxsZWQgd2l0aCBhIE5VTEwgcHRyLCBzaW5jZSBsaWJwbmcncwotcG5nX2ZyZWUoKSBjaGVja3MgZm9yIE5VTEwgYmVmb3JlIGNhbGxpbmcgZnJlZV9mbigpLgotCi1JbnB1dC9PdXRwdXQgaW4gbGlicG5nIGlzIGRvbmUgdGhyb3VnaCBwbmdfcmVhZCgpIGFuZCBwbmdfd3JpdGUoKSwKLXdoaWNoIGN1cnJlbnRseSBqdXN0IGNhbGwgZnJlYWQoKSBhbmQgZndyaXRlKCkuICBUaGUgRklMRSAqIGlzIHN0b3JlZCBpbgotcG5nX3N0cnVjdCBhbmQgaXMgaW5pdGlhbGl6ZWQgdmlhIHBuZ19pbml0X2lvKCkuICBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UKLXRoZSBtZXRob2Qgb2YgSS9PLCB0aGUgbGlicmFyeSBzdXBwbGllcyBjYWxsYmFja3MgdGhhdCB5b3UgY2FuIHNldAotdGhyb3VnaCB0aGUgZnVuY3Rpb24gcG5nX3NldF9yZWFkX2ZuKCkgYW5kIHBuZ19zZXRfd3JpdGVfZm4oKSBhdCBydW4KLXRpbWUsIGluc3RlYWQgb2YgY2FsbGluZyB0aGUgcG5nX2luaXRfaW8oKSBmdW5jdGlvbi4gIFRoZXNlIGZ1bmN0aW9ucwotYWxzbyBwcm92aWRlIGEgdm9pZCBwb2ludGVyIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB2aWEgdGhlIGZ1bmN0aW9uCi1wbmdfZ2V0X2lvX3B0cigpLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICBwbmdfc2V0X3JlYWRfZm4ocG5nX3N0cnVjdHAgcmVhZF9wdHIsCi0gICAgICAgIHZvaWRwIHJlYWRfaW9fcHRyLCBwbmdfcndfcHRyIHJlYWRfZGF0YV9mbikKLQotICAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nX3N0cnVjdHAgd3JpdGVfcHRyLAotICAgICAgICB2b2lkcCB3cml0ZV9pb19wdHIsIHBuZ19yd19wdHIgd3JpdGVfZGF0YV9mbiwKLSAgICAgICAgcG5nX2ZsdXNoX3B0ciBvdXRwdXRfZmx1c2hfZm4pOwotCi0gICAgdm9pZHAgcmVhZF9pb19wdHIgPSBwbmdfZ2V0X2lvX3B0cihyZWFkX3B0cik7Ci0gICAgdm9pZHAgd3JpdGVfaW9fcHRyID0gcG5nX2dldF9pb19wdHIod3JpdGVfcHRyKTsKLQotVGhlIHJlcGxhY2VtZW50IEkvTyBmdW5jdGlvbnMgbXVzdCBoYXZlIHByb3RvdHlwZXMgYXMgZm9sbG93czoKLQotICAgIHZvaWQgdXNlcl9yZWFkX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKTsKLSAgICB2b2lkIHVzZXJfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOwotICAgIHZvaWQgdXNlcl9mbHVzaF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOwotCi1UaGUgdXNlcl9yZWFkX2RhdGEoKSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZWN0aW5nIGFuZAotaGFuZGxpbmcgZW5kLW9mLWRhdGEgZXJyb3JzLgotCi1TdXBwbHlpbmcgTlVMTCBmb3IgdGhlIHJlYWQsIHdyaXRlLCBvciBmbHVzaCBmdW5jdGlvbnMgc2V0cyB0aGVtIGJhY2sKLXRvIHVzaW5nIHRoZSBkZWZhdWx0IEMgc3RyZWFtIGZ1bmN0aW9ucywgd2hpY2ggZXhwZWN0IHRoZSBpb19wdHIgdG8KLXBvaW50IHRvIGEgc3RhbmRhcmQgKkZJTEUgc3RydWN0dXJlLiAgSXQgaXMgcHJvYmFibHkgYSBtaXN0YWtlCi10byB1c2UgTlVMTCBmb3Igb25lIG9mIHdyaXRlX2RhdGFfZm4gYW5kIG91dHB1dF9mbHVzaF9mbiBidXQgbm90IGJvdGgKLW9mIHRoZW0sIHVubGVzcyB5b3UgaGF2ZSBidWlsdCBsaWJwbmcgd2l0aCBQTkdfTk9fV1JJVEVfRkxVU0ggZGVmaW5lZC4KLUl0IGlzIGFuIGVycm9yIHRvIHJlYWQgZnJvbSBhIHdyaXRlIHN0cmVhbSwgYW5kIHZpY2UgdmVyc2EuCi0KLUVycm9yIGhhbmRsaW5nIGluIGxpYnBuZyBpcyBkb25lIHRocm91Z2ggcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkuCi1FcnJvcnMgaGFuZGxlZCB0aHJvdWdoIHBuZ19lcnJvcigpIGFyZSBmYXRhbCwgbWVhbmluZyB0aGF0IHBuZ19lcnJvcigpCi1zaG91bGQgbmV2ZXIgcmV0dXJuIHRvIGl0cyBjYWxsZXIuICBDdXJyZW50bHksIHRoaXMgaXMgaGFuZGxlZCB2aWEKLXNldGptcCgpIGFuZCBsb25nam1wKCkgKHVubGVzcyB5b3UgaGF2ZSBjb21waWxlZCBsaWJwbmcgd2l0aAotUE5HX1NFVEpNUF9OT1RfU1VQUE9SVEVELCBpbiB3aGljaCBjYXNlIGl0IGlzIGhhbmRsZWQgdmlhIFBOR19BQk9SVCgpKSwKLWJ1dCB5b3UgY291bGQgY2hhbmdlIHRoaXMgdG8gZG8gdGhpbmdzIGxpa2UgZXhpdCgpIGlmIHlvdSBzaG91bGQgd2lzaC4KLQotT24gbm9uLWZhdGFsIGVycm9ycywgcG5nX3dhcm5pbmcoKSBpcyBjYWxsZWQKLXRvIHByaW50IGEgd2FybmluZyBtZXNzYWdlLCBhbmQgdGhlbiBjb250cm9sIHJldHVybnMgdG8gdGhlIGNhbGxpbmcgY29kZS4KLUJ5IGRlZmF1bHQgcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkgcHJpbnQgYSBtZXNzYWdlIG9uIHN0ZGVyciB2aWEKLWZwcmludGYoKSB1bmxlc3MgdGhlIGxpYnJhcnkgaXMgY29tcGlsZWQgd2l0aCBQTkdfTk9fQ09OU09MRV9JTyBkZWZpbmVkCi0oYmVjYXVzZSB5b3UgZG9uJ3Qgd2FudCB0aGUgbWVzc2FnZXMpIG9yIFBOR19OT19TVERJTyBkZWZpbmVkIChiZWNhdXNlCi1mcHJpbnRmKCkgaXNuJ3QgYXZhaWxhYmxlKS4gIElmIHlvdSB3aXNoIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGVycm9yCi1mdW5jdGlvbnMsIHlvdSB3aWxsIG5lZWQgdG8gc2V0IHVwIHlvdXIgb3duIG1lc3NhZ2UgY2FsbGJhY2tzLiAgVGhlc2UKLWZ1bmN0aW9ucyBhcmUgbm9ybWFsbHkgc3VwcGxpZWQgYXQgdGhlIHRpbWUgdGhhdCB0aGUgcG5nX3N0cnVjdCBpcyBjcmVhdGVkLgotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byByZWRpcmVjdCBlcnJvcnMgYW5kIHdhcm5pbmdzIHRvIHlvdXIgb3duIHJlcGxhY2VtZW50Ci1mdW5jdGlvbnMgYWZ0ZXIgcG5nX2NyZWF0ZV8qX3N0cnVjdCgpIGhhcyBiZWVuIGNhbGxlZCBieSBjYWxsaW5nOgotCi0gICAgcG5nX3NldF9lcnJvcl9mbihwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICBwbmdfdm9pZHAgZXJyb3JfcHRyLCBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLAotICAgICAgICBwbmdfZXJyb3JfcHRyIHdhcm5pbmdfZm4pOwotCi0gICAgcG5nX3ZvaWRwIGVycm9yX3B0ciA9IHBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpOwotCi1JZiBOVUxMIGlzIHN1cHBsaWVkIGZvciBlaXRoZXIgZXJyb3JfZm4gb3Igd2FybmluZ19mbiwgdGhlbiB0aGUgbGlicG5nCi1kZWZhdWx0IGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCwgY2FsbGluZyBmcHJpbnRmKCkgYW5kL29yIGxvbmdqbXAoKSBpZiBhCi1wcm9ibGVtIGlzIGVuY291bnRlcmVkLiAgVGhlIHJlcGxhY2VtZW50IGVycm9yIGZ1bmN0aW9ucyBzaG91bGQgaGF2ZQotcGFyYW1ldGVycyBhcyBmb2xsb3dzOgotCi0gICAgdm9pZCB1c2VyX2Vycm9yX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tc2cpOwotICAgIHZvaWQgdXNlcl93YXJuaW5nX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21zZyk7Ci0KLVRoZSBtb3RpdmF0aW9uIGJlaGluZCB1c2luZyBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpIGlzIHRoZSBDKysgdGhyb3cgYW5kCi1jYXRjaCBleGNlcHRpb24gaGFuZGxpbmcgbWV0aG9kcy4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgbXVjaCBlYXNpZXIgdG8gd3JpdGUsCi1hcyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGV2ZXJ5IHJldHVybiBjb2RlIG9mIGV2ZXJ5IGZ1bmN0aW9uIGNhbGwuCi1Ib3dldmVyLCB0aGVyZSBhcmUgc29tZSB1bmNlcnRhaW50aWVzIGFib3V0IHRoZSBzdGF0dXMgb2YgbG9jYWwgdmFyaWFibGVzCi1hZnRlciBhIGxvbmdqbXAsIHNvIHRoZSB1c2VyIG1heSB3YW50IHRvIGJlIGNhcmVmdWwgYWJvdXQgZG9pbmcgYW55dGhpbmcgYWZ0ZXIKLXNldGptcCByZXR1cm5zIG5vbi16ZXJvIGJlc2lkZXMgcmV0dXJuaW5nIGl0c2VsZi4gIENvbnN1bHQgeW91ciBjb21waWxlcgotZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAgRm9yIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoLCB5b3UgbWF5IHdpc2gKLXRvIHVzZSB0aGUgImNleGNlcHQiIGZhY2lsaXR5IChzZWUgaHR0cDovL2NleGNlcHQuc291cmNlZm9yZ2UubmV0KS4KLQotLlNTIEN1c3RvbSBjaHVua3MKLQotSWYgeW91IG5lZWQgdG8gcmVhZCBvciB3cml0ZSBjdXN0b20gY2h1bmtzLCB5b3UgbWF5IG5lZWQgdG8gZ2V0IGRlZXBlcgotaW50byB0aGUgbGlicG5nIGNvZGUuICBUaGUgbGlicmFyeSBub3cgaGFzIG1lY2hhbmlzbXMgZm9yIHN0b3JpbmcKLWFuZCB3cml0aW5nIGNodW5rcyBvZiB1bmtub3duIHR5cGU7IHlvdSBjYW4gZXZlbiBkZWNsYXJlIGNhbGxiYWNrcwotZm9yIGN1c3RvbSBjaHVua3MuICBIb3dldmVyLCB0aGlzIG1heSBub3QgYmUgZ29vZCBlbm91Z2ggaWYgdGhlCi1saWJyYXJ5IGNvZGUgaXRzZWxmIG5lZWRzIHRvIGtub3cgYWJvdXQgaW50ZXJhY3Rpb25zIGJldHdlZW4geW91cgotY2h1bmsgYW5kIGV4aXN0aW5nIGBpbnRyaW5zaWMnIGNodW5rcy4KLQotSWYgeW91IG5lZWQgdG8gd3JpdGUgYSBuZXcgaW50cmluc2ljIGNodW5rLCBmaXJzdCByZWFkIHRoZSBQTkcKLXNwZWNpZmljYXRpb24uIEFjcXVpcmUgYSBmaXJzdCBsZXZlbCBvZgotdW5kZXJzdGFuZGluZyBvZiBob3cgaXQgd29ya3MuICBQYXkgcGFydGljdWxhciBhdHRlbnRpb24gdG8gdGhlCi1zZWN0aW9ucyB0aGF0IGRlc2NyaWJlIGNodW5rIG5hbWVzLCBhbmQgbG9vayBhdCBob3cgb3RoZXIgY2h1bmtzIHdlcmUKLWRlc2lnbmVkLCBzbyB5b3UgY2FuIGRvIHRoaW5ncyBzaW1pbGFybHkuICBTZWNvbmQsIGNoZWNrIG91dCB0aGUKLXNlY3Rpb25zIG9mIGxpYnBuZyB0aGF0IHJlYWQgYW5kIHdyaXRlIGNodW5rcy4gIFRyeSB0byBmaW5kIGEgY2h1bmsKLXRoYXQgaXMgc2ltaWxhciB0byB5b3VycyBhbmQgdXNlIGl0IGFzIGEgdGVtcGxhdGUuICBNb3JlIGRldGFpbHMgY2FuCi1iZSBmb3VuZCBpbiB0aGUgY29tbWVudHMgaW5zaWRlIHRoZSBjb2RlLiAgSXQgaXMgYmVzdCB0byBoYW5kbGUgdW5rbm93bgotY2h1bmtzIGluIGEgZ2VuZXJpYyBtZXRob2QsIHZpYSBjYWxsYmFjayBmdW5jdGlvbnMsIGluc3RlYWQgb2YgYnkKLW1vZGlmeWluZyBsaWJwbmcgZnVuY3Rpb25zLgotCi1JZiB5b3Ugd2lzaCB0byB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmb3IgdGhlIGRhdGEsIGxvb2sgdGhyb3VnaAotdGhlIHBhcnQgb2YgdGhlIGNvZGUgdGhhdCBkb2VzIHRoZSB0cmFuc2Zvcm1hdGlvbnMsIGFuZCBjaGVjayBvdXQgc29tZSBvZgotdGhlIHNpbXBsZXIgb25lcyB0byBnZXQgYW4gaWRlYSBvZiBob3cgdGhleSB3b3JrLiAgVHJ5IHRvIGZpbmQgYSBzaW1pbGFyCi10cmFuc2Zvcm1hdGlvbiB0byB0aGUgb25lIHlvdSB3YW50IHRvIGFkZCBhbmQgY29weSBvZmYgb2YgaXQuICBNb3JlIGRldGFpbHMKLWNhbiBiZSBmb3VuZCBpbiB0aGUgY29tbWVudHMgaW5zaWRlIHRoZSBjb2RlIGl0c2VsZi4KLQotLlNTIENvbmZpZ3VyaW5nIGZvciAxNiBiaXQgcGxhdGZvcm1zCi0KLVlvdSB3aWxsIHdhbnQgdG8gbG9vayBpbnRvIHpjb25mLmggdG8gdGVsbCB6bGliIChhbmQgdGh1cyBsaWJwbmcpIHRoYXQKLWl0IGNhbm5vdCBhbGxvY2F0ZSBtb3JlIHRoZW4gNjRLIGF0IGEgdGltZS4gIEV2ZW4gaWYgeW91IGNhbiwgdGhlIG1lbW9yeQotd29uJ3QgYmUgYWNjZXNzaWJsZS4gIFNvIGxpbWl0IHpsaWIgYW5kIGxpYnBuZyB0byA2NEsgYnkgZGVmaW5pbmcgTUFYU0VHXzY0Sy4KLQotLlNTIENvbmZpZ3VyaW5nIGZvciBET1MKLQotRm9yIERPUyB1c2VycyB3aG8gb25seSBoYXZlIGFjY2VzcyB0byB0aGUgbG93ZXIgNjQwSywgeW91IHdpbGwKLWhhdmUgdG8gbGltaXQgemxpYidzIG1lbW9yeSB1c2FnZSB2aWEgYSBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbCgpCi1jYWxsLiAgU2VlIHpsaWIuaCBvciB6Y29uZi5oIGluIHRoZSB6bGliIGxpYnJhcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLS5TUyBDb25maWd1cmluZyBmb3IgTWVkaXVtIE1vZGVsCi0KLUxpYnBuZydzIHN1cHBvcnQgZm9yIG1lZGl1bSBtb2RlbCBoYXMgYmVlbiB0ZXN0ZWQgb24gbW9zdCBvZiB0aGUgcG9wdWxhcgotY29tcGlsZXJzLiAgTWFrZSBzdXJlIE1BWFNFR182NEsgZ2V0cyBkZWZpbmVkLCBVU0VfRkFSX0tFWVdPUkQgZ2V0cwotZGVmaW5lZCwgYW5kIEZBUiBnZXRzIGRlZmluZWQgdG8gZmFyIGluIHBuZ2NvbmYuaCwgYW5kIHlvdSBzaG91bGQgYmUKLWFsbCBzZXQuICBFdmVyeXRoaW5nIGluIHRoZSBsaWJyYXJ5IChleGNlcHQgZm9yIHpsaWIncyBzdHJ1Y3R1cmUpIGlzCi1leHBlY3RpbmcgZmFyIGRhdGEuICBZb3UgbXVzdCB1c2UgdGhlIHR5cGVkZWZzIHdpdGggdGhlIHAgb3IgcHAgb24KLXRoZSBlbmQgZm9yIHBvaW50ZXJzIChvciBhdCBsZWFzdCBsb29rIGF0IHRoZW0gYW5kIGJlIGNhcmVmdWwpLiAgTWFrZQotbm90ZSB0aGF0IHRoZSByb3dzIG9mIGRhdGEgYXJlIGRlZmluZWQgYXMgcG5nX2J5dGVwcCwgd2hpY2ggaXMgYW4KLXVuc2lnbmVkIGNoYXIgZmFyICogZmFyICouCi0KLS5TUyBDb25maWd1cmluZyBmb3IgZ3VpL3dpbmRvd2luZyBwbGF0Zm9ybXM6Ci0KLVlvdSB3aWxsIG5lZWQgdG8gd3JpdGUgbmV3IGVycm9yIGFuZCB3YXJuaW5nIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGUgR1VJCi1pbnRlcmZhY2UsIGFzIGRlc2NyaWJlZCBwcmV2aW91c2x5LCBhbmQgc2V0IHRoZW0gdG8gYmUgdGhlIGVycm9yIGFuZAotd2FybmluZyBmdW5jdGlvbnMgYXQgdGhlIHRpbWUgdGhhdCBwbmdfY3JlYXRlXypfc3RydWN0KCkgaXMgY2FsbGVkLAotaW4gb3JkZXIgdG8gaGF2ZSB0aGVtIGF2YWlsYWJsZSBkdXJpbmcgdGhlIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbi4KLVRoZXkgY2FuIGJlIGNoYW5nZWQgbGF0ZXIgdmlhIHBuZ19zZXRfZXJyb3JfZm4oKS4gIE9uIHNvbWUgY29tcGlsZXJzLAoteW91IG1heSBhbHNvIGhhdmUgdG8gY2hhbmdlIHRoZSBtZW1vcnkgYWxsb2NhdG9ycyAocG5nX21hbGxvYywgZXRjLikuCi0KLS5TUyBDb25maWd1cmluZyBmb3IgY29tcGlsZXIgeHh4OgotCi1BbGwgaW5jbHVkZXMgZm9yIGxpYnBuZyBhcmUgaW4gcG5nY29uZi5oLiAgSWYgeW91IG5lZWQgdG8gYWRkLCBjaGFuZ2UKLW9yIGRlbGV0ZSBhbiBpbmNsdWRlLCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KLVRoZSBpbmNsdWRlcyB0aGF0IGFyZSBub3QgbmVlZGVkIG91dHNpZGUgbGlicG5nIGFyZSBwcm90ZWN0ZWQgYnkgdGhlCi1QTkdfSU5URVJOQUwgZGVmaW5pdGlvbiwgd2hpY2ggaXMgb25seSBkZWZpbmVkIGZvciB0aG9zZSByb3V0aW5lcyBpbnNpZGUKLWxpYnBuZyBpdHNlbGYuICBUaGUgZmlsZXMgaW4gbGlicG5nIHByb3BlciBvbmx5IGluY2x1ZGUgcG5nLmgsIHdoaWNoCi1pbmNsdWRlcyBwbmdjb25mLmguCi0KLS5TUyBDb25maWd1cmluZyB6bGliOgotCi1UaGVyZSBhcmUgc3BlY2lhbCBmdW5jdGlvbnMgdG8gY29uZmlndXJlIHRoZSBjb21wcmVzc2lvbi4gIFBlcmhhcHMgdGhlCi1tb3N0IHVzZWZ1bCBvbmUgY2hhbmdlcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwsIHdoaWNoIGN1cnJlbnRseSB1c2VzCi1pbnB1dCBjb21wcmVzc2lvbiB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAgLSA5LiAgVGhlIGxpYnJhcnkgbm9ybWFsbHkKLXVzZXMgdGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwgKFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IDYpLiAgVGVzdHMKLWhhdmUgc2hvd24gdGhhdCBmb3IgYSBsYXJnZSBtYWpvcml0eSBvZiBpbWFnZXMsIGNvbXByZXNzaW9uIHZhbHVlcyBpbgotdGhlIHJhbmdlIDMtNiBjb21wcmVzcyBuZWFybHkgYXMgd2VsbCBhcyBoaWdoZXIgbGV2ZWxzLCBhbmQgZG8gc28gbXVjaAotZmFzdGVyLiAgRm9yIG9ubGluZSBhcHBsaWNhdGlvbnMgaXQgbWF5IGJlIGRlc2lyYWJsZSB0byBoYXZlIG1heGltdW0gc3BlZWQKLShaX0JFU1RfU1BFRUQgPSAxKS4gIFdpdGggdmVyc2lvbnMgb2YgemxpYiBhZnRlciB2MC45OSwgeW91IGNhbiBhbHNvCi1zcGVjaWZ5IG5vIGNvbXByZXNzaW9uIChaX05PX0NPTVBSRVNTSU9OID0gMCksIGJ1dCB0aGlzIHdvdWxkIGNyZWF0ZQotZmlsZXMgbGFyZ2VyIHRoYW4ganVzdCBzdG9yaW5nIHRoZSByYXcgYml0bWFwLiAgWW91IGNhbiBzcGVjaWZ5IHRoZQotY29tcHJlc3Npb24gbGV2ZWwgYnkgY2FsbGluZzoKLQotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwgbGV2ZWwpOwotCi1Bbm90aGVyIHVzZWZ1bCBvbmUgaXMgdG8gcmVkdWNlIHRoZSBtZW1vcnkgbGV2ZWwgdXNlZCBieSB0aGUgbGlicmFyeS4KLVRoZSBtZW1vcnkgbGV2ZWwgZGVmYXVsdHMgdG8gOCwgYnV0IGl0IGNhbiBiZSBsb3dlcmVkIGlmIHlvdSBhcmUKLXNob3J0IG9uIG1lbW9yeSAocnVubmluZyBET1MsIGZvciBleGFtcGxlLCB3aGVyZSB5b3Ugb25seSBoYXZlIDY0MEspLgotTm90ZSB0aGF0IHRoZSBtZW1vcnkgbGV2ZWwgZG9lcyBoYXZlIGFuIGVmZmVjdCBvbiBjb21wcmVzc2lvbjsgYW1vbmcKLW90aGVyIHRoaW5ncywgbG93ZXIgbGV2ZWxzIHdpbGwgcmVzdWx0IGluIHNlY3Rpb25zIG9mIGluY29tcHJlc3NpYmxlCi1kYXRhIGJlaW5nIGVtaXR0ZWQgaW4gc21hbGxlciBzdG9yZWQgYmxvY2tzLCB3aXRoIGEgY29ycmVzcG9uZGluZ2x5Ci1sYXJnZXIgcmVsYXRpdmUgb3ZlcmhlYWQgb2YgdXAgdG8gMTUlIGluIHRoZSB3b3JzdCBjYXNlLgotCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgbGV2ZWwpOwotCi1UaGUgb3RoZXIgZnVuY3Rpb25zIGFyZSBmb3IgY29uZmlndXJpbmcgemxpYi4gIFRoZXkgYXJlIG5vdCByZWNvbW1lbmRlZAotZm9yIG5vcm1hbCB1c2UgYW5kIG1heSByZXN1bHQgaW4gd3JpdGluZyBhbiBpbnZhbGlkIFBORyBmaWxlLiAgU2VlCi16bGliLmggZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gd2hhdCB0aGVzZSBtZWFuLgotCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLAotICAgICAgICBzdHJhdGVneSk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLAotICAgICAgICB3aW5kb3dfYml0cyk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3B0ciwgbWV0aG9kKTsKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKHBuZ19wdHIsIHNpemUpOwotCi0uU1MgQ29udHJvbGxpbmcgcm93IGZpbHRlcmluZwotCi1JZiB5b3Ugd2FudCB0byBjb250cm9sIHdoZXRoZXIgbGlicG5nIHVzZXMgZmlsdGVyaW5nIG9yIG5vdCwgd2hpY2gKLWZpbHRlcnMgYXJlIHVzZWQsIGFuZCBob3cgaXQgZ29lcyBhYm91dCBwaWNraW5nIHJvdyBmaWx0ZXJzLCB5b3UKLWNhbiBjYWxsIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMuICBUaGUgc2VsZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uCi1vZiByb3cgZmlsdGVycyBjYW4gaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgc2l6ZSBhbmQKLWVuY29kaW5nIHNwZWVkIGFuZCBhIHNvbWV3aGF0IGxlc3NlciBpbXBhY3Qgb24gdGhlIGRlY29kaW5nIHNwZWVkCi1vZiBhbiBpbWFnZS4gIEZpbHRlcmluZyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIFJHQiBhbmQgZ3JheXNjYWxlCi1pbWFnZXMgKHdpdGggYW5kIHdpdGhvdXQgYWxwaGEpLCBidXQgbm90IGZvciBwYWxldHRlZCBpbWFnZXMgbm9yCi1mb3IgYW55IGltYWdlcyB3aXRoIGJpdCBkZXB0aHMgbGVzcyB0aGFuIDggYml0cy9waXhlbC4KLQotVGhlICdtZXRob2QnIHBhcmFtZXRlciBzZXRzIHRoZSBtYWluIGZpbHRlcmluZyBtZXRob2QsIHdoaWNoIGlzCi1jdXJyZW50bHkgb25seSAnMCcgaW4gdGhlIFBORyAxLjIgc3BlY2lmaWNhdGlvbi4gIFRoZSAnZmlsdGVycycKLXBhcmFtZXRlciBzZXRzIHdoaWNoIGZpbHRlcihzKSwgaWYgYW55LCBzaG91bGQgYmUgdXNlZCBmb3IgZWFjaAotc2NhbmxpbmUuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIFBOR19BTExfRklMVEVSUyBhbmQgUE5HX05PX0ZJTFRFUlMKLXRvIHR1cm4gZmlsdGVyaW5nIG9uIGFuZCBvZmYsIHJlc3BlY3RpdmVseS4KLQotSW5kaXZpZHVhbCBmaWx0ZXIgdHlwZXMgYXJlIFBOR19GSUxURVJfTk9ORSwgUE5HX0ZJTFRFUl9TVUIsCi1QTkdfRklMVEVSX1VQLCBQTkdfRklMVEVSX0FWRywgUE5HX0ZJTFRFUl9QQUVUSCwgd2hpY2ggY2FuIGJlIGJpdHdpc2UKLU9SZWQgdG9nZXRoZXIgd2l0aCAnfCcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWx0ZXJzIHRvIHVzZS4KLVRoZXNlIGZpbHRlcnMgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24uCi1JZiB5b3UgaW50ZW5kIHRvIGNoYW5nZSB0aGUgZmlsdGVyIHR5cGUgZHVyaW5nIHRoZSBjb3Vyc2Ugb2Ygd3JpdGluZwotdGhlIGltYWdlLCB5b3Ugc2hvdWxkIHN0YXJ0IHdpdGggZmxhZ3Mgc2V0IGZvciBhbGwgb2YgdGhlIGZpbHRlcnMKLXlvdSBpbnRlbmQgdG8gdXNlIHNvIHRoYXQgbGlicG5nIGNhbiBpbml0aWFsaXplIGl0cyBpbnRlcm5hbAotc3RydWN0dXJlcyBhcHByb3ByaWF0ZWx5IGZvciBhbGwgb2YgdGhlIGZpbHRlciB0eXBlcy4gIChOb3RlIHRoYXQgdGhpcwotbWVhbnMgdGhlIGZpcnN0IHJvdyBtdXN0IGFsd2F5cyBiZSBhZGFwdGl2ZWx5IGZpbHRlcmVkLCBiZWNhdXNlIGxpYnBuZwotY3VycmVudGx5IGRvZXMgbm90IGFsbG9jYXRlIHRoZSBmaWx0ZXIgYnVmZmVycyB1bnRpbCBwbmdfd3JpdGVfcm93KCkKLWlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUuKQotCi0gICAgZmlsdGVycyA9IFBOR19GSUxURVJfTk9ORSB8IFBOR19GSUxURVJfU1VCCi0gICAgICAgICAgICAgIFBOR19GSUxURVJfVVAgfCBQTkdfRklMVEVSX0FWRyB8Ci0gICAgICAgICAgICAgIFBOR19GSUxURVJfUEFFVEggfCBQTkdfQUxMX0ZJTFRFUlM7Ci0KLSAgICBwbmdfc2V0X2ZpbHRlcihwbmdfcHRyLCBQTkdfRklMVEVSX1RZUEVfQkFTRSwKLSAgICAgICBmaWx0ZXJzKTsKLSAgICAgICAgICAgICAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgY2FuIGFsc28gYmUKLSAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HIGlmIHlvdSBhcmUKLSAgICAgICAgICAgICAgd3JpdGluZyBhIFBORyB0byBiZSBlbWJlZGRlZCBpbiBhIE1ORwotICAgICAgICAgICAgICBkYXRhc3RyZWFtLiAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSB0aGUKLSAgICAgICAgICAgICAgc2FtZSBhcyB0aGUgdmFsdWUgb2YgZmlsdGVyX21ldGhvZCB1c2VkCi0gICAgICAgICAgICAgIGluIHBuZ19zZXRfSUhEUigpLgotCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGluZmx1ZW5jZSBob3cgbGlicG5nIGNob29zZXMgZnJvbSBhbW9uZyB0aGUKLWF2YWlsYWJsZSBmaWx0ZXJzLiAgVGhpcyBpcyBkb25lIGluIG9uZSBvciBib3RoIG9mIHR3byB3YXlzIC0gYnkKLXRlbGxpbmcgaXQgaG93IGltcG9ydGFudCBpdCBpcyB0byBrZWVwIHRoZSBzYW1lIGZpbHRlciBmb3Igc3VjY2Vzc2l2ZQotcm93cywgYW5kIGJ5IHRlbGxpbmcgaXQgdGhlIHJlbGF0aXZlIGNvbXB1dGF0aW9uYWwgY29zdHMgb2YgdGhlIGZpbHRlcnMuCi0KLSAgICBkb3VibGUgd2VpZ2h0c1szXSA9IHsxLjUsIDEuMywgMS4xfSwKLSAgICAgICBjb3N0c1tQTkdfRklMVEVSX1ZBTFVFX0xBU1RdID0KLSAgICAgICB7MS4wLCAxLjMsIDEuMywgMS41LCAxLjd9OwotCi0gICAgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljcyhwbmdfcHRyLAotICAgICAgIFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVELCAzLAotICAgICAgIHdlaWdodHMsIGNvc3RzKTsKLQotVGhlIHdlaWdodHMgYXJlIG11bHRpcGx5aW5nIGZhY3RvcnMgdGhhdCBpbmRpY2F0ZSB0byBsaWJwbmcgdGhhdCB0aGUKLXJvdyBmaWx0ZXIgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBzdWNjZXNzaXZlIHJvd3MgdW5sZXNzIGFub3RoZXIgcm93IGZpbHRlcgotaXMgdGhhdCBtYW55IHRpbWVzIGJldHRlciB0aGFuIHRoZSBwcmV2aW91cyBmaWx0ZXIuICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwKLWlmIHRoZSBwcmV2aW91cyAzIGZpbHRlcnMgd2VyZSBTVUIsIFNVQiwgTk9ORSwgdGhlIFNVQiBmaWx0ZXIgY291bGQgaGF2ZSBhCi0ic3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIiAxLjUgeCAxLjMgdGltZXMgaGlnaGVyIHRoYW4gb3RoZXIgZmlsdGVycwotYW5kIHN0aWxsIGJlIGNob3Nlbiwgd2hpbGUgdGhlIE5PTkUgZmlsdGVyIGNvdWxkIGhhdmUgYSBzdW0gMS4xIHRpbWVzCi1oaWdoZXIgdGhhbiBvdGhlciBmaWx0ZXJzIGFuZCBzdGlsbCBiZSBjaG9zZW4uICBVbnNwZWNpZmllZCB3ZWlnaHRzIGFyZQotdGFrZW4gdG8gYmUgMS4wLCBhbmQgdGhlIHNwZWNpZmllZCB3ZWlnaHRzIHNob3VsZCBwcm9iYWJseSBiZSBkZWNsaW5pbmcKLWxpa2UgdGhvc2UgYWJvdmUgaW4gb3JkZXIgdG8gZW1waGFzaXplIHJlY2VudCBmaWx0ZXJzIG92ZXIgb2xkZXIgZmlsdGVycy4KLQotVGhlIGZpbHRlciBjb3N0cyBzcGVjaWZ5IGZvciBlYWNoIGZpbHRlciB0eXBlIGEgcmVsYXRpdmUgZGVjb2RpbmcgY29zdAotdG8gYmUgY29uc2lkZXJlZCB3aGVuIHNlbGVjdGluZyByb3cgZmlsdGVycy4gIFRoaXMgbWVhbnMgdGhhdCBmaWx0ZXJzCi13aXRoIGhpZ2hlciBjb3N0cyBhcmUgbGVzcyBsaWtlbHkgdG8gYmUgY2hvc2VuIG92ZXIgZmlsdGVycyB3aXRoIGxvd2VyCi1jb3N0cywgdW5sZXNzIHRoZWlyICJzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMiIGlzIHRoYXQgbXVjaCBzbWFsbGVyLgotVGhlIGNvc3RzIGRvIG5vdCBuZWNlc3NhcmlseSByZWZsZWN0IHRoZSBleGFjdCBjb21wdXRhdGlvbmFsIHNwZWVkcyBvZgotdGhlIHZhcmlvdXMgZmlsdGVycywgc2luY2UgdGhpcyB3b3VsZCB1bmR1bHkgaW5mbHVlbmNlIHRoZSBmaW5hbCBpbWFnZQotc2l6ZS4KLQotTm90ZSB0aGF0IHRoZSBudW1iZXJzIGFib3ZlIHdlcmUgaW52ZW50ZWQgcHVyZWx5IGZvciB0aGlzIGV4YW1wbGUgYW5kCi1hcmUgZ2l2ZW4gb25seSB0byBoZWxwIGV4cGxhaW4gdGhlIGZ1bmN0aW9uIHVzYWdlLiAgTGl0dGxlIHRlc3RpbmcgaGFzCi1iZWVuIGRvbmUgdG8gZmluZCBvcHRpbXVtIHZhbHVlcyBmb3IgZWl0aGVyIHRoZSBjb3N0cyBvciB0aGUgd2VpZ2h0cy4KLQotLlNTIFJlbW92aW5nIHVud2FudGVkIG9iamVjdCBjb2RlCi0KLVRoZXJlIGFyZSBhIGJ1bmNoIG9mICNkZWZpbmUncyBpbiBwbmdjb25mLmggdGhhdCBjb250cm9sIHdoYXQgcGFydHMgb2YKLWxpYnBuZyBhcmUgY29tcGlsZWQuICBBbGwgdGhlIGRlZmluZXMgZW5kIGluIF9TVVBQT1JURUQuICBJZiB5b3UgYXJlCi1uZXZlciBnb2luZyB0byB1c2UgYSBjYXBhYmlsaXR5LCB5b3UgY2FuIGNoYW5nZSB0aGUgI2RlZmluZSB0byAjdW5kZWYKLWJlZm9yZSByZWNvbXBpbGluZyBsaWJwbmcgYW5kIHNhdmUgeW91cnNlbGYgY29kZSBhbmQgZGF0YSBzcGFjZSwgb3IKLXlvdSBjYW4gdHVybiBvZmYgaW5kaXZpZHVhbCBjYXBhYmlsaXRpZXMgd2l0aCBkZWZpbmVzIHRoYXQgYmVnaW4gd2l0aAotUE5HX05PXy4KLQotWW91IGNhbiBhbHNvIHR1cm4gYWxsIG9mIHRoZSB0cmFuc2Zvcm1zIGFuZCBhbmNpbGxhcnkgY2h1bmsgY2FwYWJpbGl0aWVzCi1vZmYgZW4gbWFzc2Ugd2l0aCBjb21waWxlciBkaXJlY3RpdmVzIHRoYXQgZGVmaW5lCi1QTkdfTk9fUkVBRFtvciBXUklURV1fVFJBTlNGT1JNUywgb3IgUE5HX05PX1JFQURbb3IgV1JJVEVdX0FOQ0lMTEFSWV9DSFVOS1MsCi1vciBhbGwgZm91ciwKLWFsb25nIHdpdGggZGlyZWN0aXZlcyB0byB0dXJuIG9uIGFueSBvZiB0aGUgY2FwYWJpbGl0aWVzIHRoYXQgeW91IGRvCi13YW50LiAgVGhlIFBOR19OT19SRUFEW29yIFdSSVRFXV9UUkFOU0ZPUk1TIGRpcmVjdGl2ZXMgZGlzYWJsZQotdGhlIGV4dHJhIHRyYW5zZm9ybWF0aW9ucyBidXQgc3RpbGwgbGVhdmUgdGhlIGxpYnJhcnkgZnVsbHkgY2FwYWJsZSBvZiByZWFkaW5nCi1hbmQgd3JpdGluZyBQTkcgZmlsZXMgd2l0aCBhbGwga25vd24gcHVibGljIGNodW5rcwotVXNlIG9mIHRoZSBQTkdfTk9fUkVBRFtvciBXUklURV1fQU5DSUxMQVJZX0NIVU5LUyBkaXJlY3RpdmUKLXByb2R1Y2VzIGEgbGlicmFyeSB0aGF0IGlzIGluY2FwYWJsZSBvZiByZWFkaW5nIG9yIHdyaXRpbmcgYW5jaWxsYXJ5IGNodW5rcy4KLUlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBwcm9ncmVzc2l2ZSByZWFkaW5nIGNhcGFiaWxpdHksIHlvdSBjYW4KLXR1cm4gdGhhdCBvZmYgd2l0aCBQTkdfTk9fUFJPR1JFU1NJVkVfUkVBRCAoZG9uJ3QgY29uZnVzZQotdGhpcyB3aXRoIHRoZSBJTlRFUkxBQ0lORyBjYXBhYmlsaXR5LCB3aGljaCB5b3UnbGwgc3RpbGwgaGF2ZSkuCi0KLUFsbCB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBzcGVjaWZpYyBjb2RlIGFyZSBpbiBzZXBhcmF0ZSBmaWxlcywgc28gdGhlCi1saW5rZXIgc2hvdWxkIG9ubHkgZ3JhYiB0aGUgZmlsZXMgaXQgbmVlZHMuICBIb3dldmVyLCBpZiB5b3Ugd2FudCB0bwotbWFrZSBzdXJlLCBvciBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgc3RhbmQgYWxvbmUgbGlicmFyeSwgYWxsIHRoZQotcmVhZGluZyBmaWxlcyBzdGFydCB3aXRoIHBuZ3IgYW5kIGFsbCB0aGUgd3JpdGluZyBmaWxlcyBzdGFydCB3aXRoCi1wbmd3LiAgVGhlIGZpbGVzIHRoYXQgZG9uJ3QgbWF0Y2ggZWl0aGVyIChsaWtlIHBuZy5jLCBwbmd0cmFucy5jLCBldGMuKQotYXJlIHVzZWQgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZywgYW5kIGFsd2F5cyBuZWVkIHRvIGJlIGluY2x1ZGVkLgotVGhlIHByb2dyZXNzaXZlIHJlYWRlciBpcyBpbiBwbmdwcmVhZC5jCi0KLUlmIHlvdSBhcmUgY3JlYXRpbmcgb3IgZGlzdHJpYnV0aW5nIGEgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcnkgKGEgLnNvCi1vciBETEwgZmlsZSksIHlvdSBzaG91bGQgbm90IHJlbW92ZSBvciBkaXNhYmxlIGFueSBwYXJ0cyBvZiB0aGUgbGlicmFyeSwKLWFzIHRoaXMgd2lsbCBjYXVzZSBhcHBsaWNhdGlvbnMgbGlua2VkIHdpdGggZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZQotbGlicmFyeSB0byBmYWlsIGlmIHRoZXkgY2FsbCBmdW5jdGlvbnMgbm90IGF2YWlsYWJsZSBpbiB5b3VyIGxpYnJhcnkuCi1UaGUgc2l6ZSBvZiB0aGUgbGlicmFyeSBpdHNlbGYgc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZSwgYmVjYXVzZSBvbmx5Ci10aG9zZSBzZWN0aW9ucyB0aGF0IGFyZSBhY3R1YWxseSB1c2VkIHdpbGwgYmUgbG9hZGVkIGludG8gbWVtb3J5LgotCi0uU1MgUmVxdWVzdGluZyBkZWJ1ZyBwcmludG91dAotCi1UaGUgbWFjcm8gZGVmaW5pdGlvbiBQTkdfREVCVUcgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBkZWJ1Z2dpbmcKLXByaW50b3V0LiAgU2V0IGl0IHRvIGFuIGludGVnZXIgdmFsdWUgaW4gdGhlIHJhbmdlIDAgdG8gMy4gIEhpZ2hlcgotbnVtYmVycyByZXN1bHQgaW4gaW5jcmVhc2luZyBhbW91bnRzIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZQotaW5mb3JtYXRpb24gaXMgcHJpbnRlZCB0byB0aGUgInN0ZGVyciIgZmlsZSwgdW5sZXNzIGFub3RoZXIgZmlsZQotbmFtZSBpcyBzcGVjaWZpZWQgaW4gdGhlIFBOR19ERUJVR19GSUxFIG1hY3JvIGRlZmluaXRpb24uCi0KLVdoZW4gUE5HX0RFQlVHID4gMCwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgKG1hY3JvcykgYmVjb21lIGF2YWlsYWJsZToKLQotICAgcG5nX2RlYnVnKGxldmVsLCBtZXNzYWdlKQotICAgcG5nX2RlYnVnMShsZXZlbCwgbWVzc2FnZSwgcDEpCi0gICBwbmdfZGVidWcyKGxldmVsLCBtZXNzYWdlLCBwMSwgcDIpCi0KLWluIHdoaWNoICJsZXZlbCIgaXMgY29tcGFyZWQgdG8gUE5HX0RFQlVHIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHByaW50Ci10aGUgbWVzc2FnZSwgIm1lc3NhZ2UiIGlzIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHRvIGJlIHByaW50ZWQsCi1hbmQgcDEgYW5kIHAyIGFyZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHRvIGJlIGVtYmVkZGVkIGluIHRoZSBzdHJpbmcKLWFjY29yZGluZyB0byBwcmludGYtc3R5bGUgZm9ybWF0dGluZyBkaXJlY3RpdmVzLiAgRm9yIGV4YW1wbGUsCi0KLSAgIHBuZ19kZWJ1ZzEoMiwgImZvbz0lZFxuIiwgZm9vKTsKLQotaXMgZXhwYW5kZWQgdG8KLQotICAgaWYoUE5HX0RFQlVHID4gMikKLSAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSwgImZvbz0lZFxuIiwgZm9vKTsKLQotV2hlbiBQTkdfREVCVUcgaXMgZGVmaW5lZCBidXQgaXMgemVybywgdGhlIG1hY3JvcyBhcmVuJ3QgZGVmaW5lZCwgYnV0IHlvdQotY2FuIHN0aWxsIHVzZSBQTkdfREVCVUcgdG8gY29udHJvbCB5b3VyIG93biBkZWJ1Z2dpbmc6Ci0KLSAgICNpZmRlZiBQTkdfREVCVUcKLSAgICAgICBmcHJpbnRmKHN0ZGVyciwgLi4uCi0gICAjZW5kaWYKLQotV2hlbiBQTkdfREVCVUcgPSAxLCB0aGUgbWFjcm9zIGFyZSBkZWZpbmVkLCBidXQgb25seSBwbmdfZGVidWcgc3RhdGVtZW50cwotaGF2aW5nIGxldmVsID0gMCB3aWxsIGJlIHByaW50ZWQuICBUaGVyZSBhcmVuJ3QgYW55IHN1Y2ggc3RhdGVtZW50cyBpbgotdGhpcyB2ZXJzaW9uIG9mIGxpYnBuZywgYnV0IGlmIHlvdSBpbnNlcnQgc29tZSB0aGV5IHdpbGwgYmUgcHJpbnRlZC4KLQotLlNIIFZJLiAgTU5HIHN1cHBvcnQKLQotVGhlIE1ORyBzcGVjaWZpY2F0aW9uIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9tbmcpIGFsbG93cwotY2VydGFpbiBleHRlbnNpb25zIHRvIFBORyBmb3IgUE5HIGltYWdlcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMuCi1MaWJwbmcgY2FuIHN1cHBvcnQgc29tZSBvZiB0aGVzZSBleHRlbnNpb25zLiAgVG8gZW5hYmxlIHRoZW0sIHVzZSB0aGUKLXBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKCkgZnVuY3Rpb246Ci0KLSAgIGZlYXR1cmVfc2V0ID0gcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMocG5nX3B0ciwgbWFzaykKLSAgIG1hc2sgaXMgYSBwbmdfdWludF8zMiBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIHRoZQotICAgICAgICBmZWF0dXJlcyB5b3Ugd2FudCB0byBlbmFibGUuICBUaGVzZSBpbmNsdWRlCi0gICAgICAgIFBOR19GTEFHX01OR19FTVBUWV9QTFRFCi0gICAgICAgIFBOR19GTEFHX01OR19GSUxURVJfNjQKLSAgICAgICAgUE5HX0FMTF9NTkdfRkVBVFVSRVMKLSAgIGZlYXR1cmVfc2V0IGlzIGEgcG5nX3VpbnRfMzIgdGhhdCBpcyB0aGUgYml0d2lzZSBBTkQgb2YKLSAgICAgIHlvdXIgbWFzayB3aXRoIHRoZSBzZXQgb2YgTU5HIGZlYXR1cmVzIHRoYXQgaXMKLSAgICAgIHN1cHBvcnRlZCBieSB0aGUgdmVyc2lvbiBvZiBsaWJwbmcgdGhhdCB5b3UgYXJlIHVzaW5nLgotCi1JdCBpcyBhbiBlcnJvciB0byB1c2UgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWRpbmcgb3Igd3JpdGluZyBhIHN0YW5kYWxvbmUKLVBORyBmaWxlIHdpdGggdGhlIFBORyA4LWJ5dGUgc2lnbmF0dXJlLiAgVGhlIFBORyBkYXRhc3RyZWFtIG11c3QgYmUgd3JhcHBlZAotaW4gYSBNTkcgZGF0YXN0cmVhbS4gIEFzIGEgbWluaW11bSwgaXQgbXVzdCBoYXZlIHRoZSBNTkcgOC1ieXRlIHNpZ25hdHVyZQotYW5kIHRoZSBNSERSIGFuZCBNRU5EIGNodW5rcy4gIExpYnBuZyBkb2VzIG5vdCBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZXNlCi1vciBhbnkgb3RoZXIgTU5HIGNodW5rczsgeW91ciBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgaXRzIG93biBzdXBwb3J0IGZvcgotdGhlbS4gIFlvdSBtYXkgd2lzaCB0byBjb25zaWRlciB1c2luZyBsaWJtbmcgKGF2YWlsYWJsZSBhdAotaHR0cDovL3d3dy5saWJtbmcuY29tKSBpbnN0ZWFkLgotCi0uU0ggVklJLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDAuODgKLQotSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdmVyc2lvbnMgb2YgbGlicG5nIGxhdGVyIHRoYW4gMC45NiBhcmUgbm90Ci1kaXN0cmlidXRlZCBieSB0aGUgb3JpZ2luYWwgbGlicG5nIGF1dGhvciwgR3V5IFNjaGFsbmF0LCBub3IgYnkKLUFuZHJlYXMgRGlsZ2VyLCB3aG8gaGFkIHRha2VuIG92ZXIgZnJvbSBHdXkgZHVyaW5nIDE5OTYgYW5kIDE5OTcsIGFuZAotZGlzdHJpYnV0ZWQgdmVyc2lvbnMgMC44OSB0aHJvdWdoIDAuOTYsIGJ1dCByYXRoZXIgYnkgYW5vdGhlciBtZW1iZXIKLW9mIHRoZSBvcmlnaW5hbCBQTkcgR3JvdXAsIEdsZW5uIFJhbmRlcnMtUGVocnNvbi4gIEd1eSBhbmQgQW5kcmVhcyBhcmUKLXN0aWxsIGFsaXZlIGFuZCB3ZWxsLCBidXQgdGhleSBoYXZlIG1vdmVkIG9uIHRvIG90aGVyIHRoaW5ncy4KLQotVGhlIG9sZCBsaWJwbmcgZnVuY3Rpb25zIHBuZ19yZWFkX2luaXQoKSwgcG5nX3dyaXRlX2luaXQoKSwKLXBuZ19pbmZvX2luaXQoKSwgcG5nX3JlYWRfZGVzdHJveSgpLCBhbmQgcG5nX3dyaXRlX2Rlc3Ryb3koKSBoYXZlIGJlZW4KLW1vdmVkIHRvIFBOR19JTlRFUk5BTCBpbiB2ZXJzaW9uIDAuOTUgdG8gZGlzY291cmFnZSB0aGVpciB1c2UuICBUaGVzZQotZnVuY3Rpb25zIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZyB2ZXJzaW9uIDIuMC4wLgotCi1UaGUgcHJlZmVycmVkIG1ldGhvZCBvZiBjcmVhdGluZyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBsaWJwbmcgc3RydWN0dXJlcyBpcwotdmlhIHRoZSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCksIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCksIGFuZAotcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCgpIGJlY2F1c2UgdGhleSBpc29sYXRlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmVzCi1mcm9tIHRoZSBhcHBsaWNhdGlvbiwgYWxsb3cgdmVyc2lvbiBlcnJvciBjaGVja2luZywgYW5kIGFsc28gYWxsb3cgdGhlCi11c2Ugb2YgY3VzdG9tIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24sIHdoaWNoCi10aGUgb2xkIGZ1bmN0aW9ucyBkbyBub3QuICBUaGUgZnVuY3Rpb25zIHBuZ19yZWFkX2Rlc3Ryb3koKSBhbmQKLXBuZ193cml0ZV9kZXN0cm95KCkgZG8gbm90IGFjdHVhbGx5IGZyZWUgdGhlIG1lbW9yeSB0aGF0IGxpYnBuZwotYWxsb2NhdGVkIGZvciB0aGVzZSBzdHJ1Y3RzLCBidXQganVzdCByZXNldCB0aGUgZGF0YSBzdHJ1Y3R1cmVzLCBzbyB0aGV5Ci1jYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCkgYW5kCi1wbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSBpZiB5b3UgZmVlbCB0aGVyZSBpcyB0b28gbXVjaCBzeXN0ZW0gb3ZlcmhlYWQKLWFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgdGhlIHBuZ19zdHJ1Y3QgZm9yIGVhY2ggaW1hZ2UgcmVhZC4KLQotU2V0dGluZyB0aGUgZXJyb3IgY2FsbGJhY2tzIHZpYSBwbmdfc2V0X21lc3NhZ2VfZm4oKSBiZWZvcmUKLXBuZ19yZWFkX2luaXQoKSBhcyB3YXMgc3VnZ2VzdGVkIGluIGxpYnBuZy0wLjg4IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQKLWJlY2F1c2UgdGhpcyBjYXVzZWQgYXBwbGljYXRpb25zIHRoYXQgZG8gbm90IHVzZSBjdXN0b20gZXJyb3IgZnVuY3Rpb25zCi10byBmYWlsIGlmIHRoZSBwbmdfcHRyIHdhcyBub3QgaW5pdGlhbGl6ZWQgdG8gemVyby4gIEl0IGlzIHN0aWxsIHBvc3NpYmxlCi10byBzZXQgdGhlIGVycm9yIGNhbGxiYWNrcyBBRlRFUiBwbmdfcmVhZF9pbml0KCksIG9yIHRvIGNoYW5nZSB0aGVtIHdpdGgKLXBuZ19zZXRfZXJyb3JfZm4oKSwgd2hpY2ggaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgZnVuY3Rpb24sIGJ1dCB3aXRoIGEgbmV3Ci1uYW1lIHRvIGZvcmNlIGNvbXBpbGF0aW9uIGVycm9ycyB3aXRoIGFwcGxpY2F0aW9ucyB0aGF0IHRyeSB0byB1c2UgdGhlIG9sZAotbWV0aG9kLgotCi1TdGFydGluZyB3aXRoIHZlcnNpb24gMS4wLjcsIHlvdSBjYW4gZmluZCBvdXQgd2hpY2ggdmVyc2lvbiBvZiB0aGUgbGlicmFyeQoteW91IGFyZSB1c2luZyBhdCBydW4tdGltZToKLQotICAgcG5nX3VpbnRfMzIgbGlicG5nX3ZuID0gcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcigpOwotCi1UaGUgbnVtYmVyIGxpYnBuZ192biBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBtYWpvciB2ZXJzaW9uLCBtaW5vcgotdmVyc2lvbiB3aXRoIGxlYWRpbmcgemVybywgYW5kIHJlbGVhc2UgbnVtYmVyIHdpdGggbGVhZGluZyB6ZXJvLAotKGUuZy4sIGxpYnBuZ192biBmb3IgdmVyc2lvbiAxLjAuNyBpcyAxMDAwNykuCi0KLVlvdSBjYW4gYWxzbyBjaGVjayB3aGljaCB2ZXJzaW9uIG9mIHBuZy5oIHlvdSB1c2VkIHdoZW4gY29tcGlsaW5nIHlvdXIKLWFwcGxpY2F0aW9uOgotCi0gICBwbmdfdWludF8zMiBhcHBsaWNhdGlvbl92biA9IFBOR19MSUJQTkdfVkVSOwotCi0uU0ggVklJSS4gIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjAueCB0byAxLjIueAotCi1TdXBwb3J0IGZvciB1c2VyIG1lbW9yeSBtYW5hZ2VtZW50IHdhcyBlbmFibGVkIGJ5IGRlZmF1bHQuICBUbwotYWNjb21wbGlzaCB0aGlzLCB0aGUgZnVuY3Rpb25zIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMigpLAotcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMigpLCBwbmdfc2V0X21lbV9mbigpLCBwbmdfZ2V0X21lbV9wdHIoKSwKLXBuZ19tYWxsb2NfZGVmYXVsdCgpLCBhbmQgcG5nX2ZyZWVfZGVmYXVsdCgpIHdlcmUgYWRkZWQuCi0KLVN1cHBvcnQgZm9yIGNlcnRhaW4gTU5HIGZlYXR1cmVzIHdhcyBlbmFibGVkLgotCi1TdXBwb3J0IGZvciBudW1iZXJlZCBlcnJvciBtZXNzYWdlcyB3YXMgYWRkZWQuICBIb3dldmVyLCB3ZSBuZXZlciBnb3QKLWFyb3VuZCB0byBhY3R1YWxseSBudW1iZXJpbmcgdGhlIGVycm9yIG1lc3NhZ2VzLiAgVGhlIGZ1bmN0aW9uCi1wbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMoKSB3YXMgYWRkZWQgKE5vdGU6IHRoZSBwcm90b3R5cGUgZm9yIHRoaXMKLWZ1bmN0aW9uIHdhcyBpbmFkdmVydGVudGx5IHJlbW92ZWQgZnJvbSBwbmcuaCBpbiBQTkdfTk9fQVNTRU1CTEVSX0NPREUKLWJ1aWxkcyBvZiBsaWJwbmctMS4yLjE1LiAgSXQgd2FzIHJlc3RvcmVkIGluIGxpYnBuZy0xLjIuMzYpLgotCi1UaGUgcG5nX21hbGxvY193YXJuKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjIuMy4gIFRoaXMgaXNzdWVzCi1hIHBuZ193YXJuaW5nIGFuZCByZXR1cm5zIE5VTEwgaW5zdGVhZCBvZiBhYm9ydGluZyB3aGVuIGl0IGZhaWxzIHRvCi1hY3F1aXJlIHRoZSByZXF1ZXN0ZWQgbWVtb3J5IGFsbG9jYXRpb24uCi0KLVN1cHBvcnQgZm9yIHNldHRpbmcgdXNlciBsaW1pdHMgb24gaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCB3YXMgZW5hYmxlZAotYnkgZGVmYXVsdC4gIFRoZSBmdW5jdGlvbnMgcG5nX3NldF91c2VyX2xpbWl0cygpLCBwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4KCksCi1hbmQgcG5nX2dldF91c2VyX2hlaWdodF9tYXgoKSB3ZXJlIGFkZGVkIGF0IGxpYnBuZy0xLjIuNi4KLQotVGhlIHBuZ19zZXRfYWRkX2FscGhhKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjIuNy4KLQotVGhlIGZ1bmN0aW9uIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpIHdhcyBhZGRlZCBhdCBsaWJwbmctMS4yLjkuCi1Vbmxpa2UgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSwgdGhlIG5ldyBmdW5jdGlvbiBkb2VzIG5vdCBleHBhbmQgdGhlCi10Uk5TIGNodW5rIHRvIGFscGhhLiBUaGUgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSBmdW5jdGlvbiBpcwotZGVwcmVjYXRlZC4KLQotQSBudW1iZXIgb2YgbWFjcm8gZGVmaW5pdGlvbnMgaW4gc3VwcG9ydCBvZiBydW50aW1lIHNlbGVjdGlvbiBvZgotYXNzZW1ibGVyIGNvZGUgZmVhdHVyZXMgKGVzcGVjaWFsbHkgSW50ZWwgTU1YIGNvZGUgc3VwcG9ydCkgd2VyZQotYWRkZWQgYXQgbGlicG5nLTEuMi4wOgotCi0gICAgUE5HX0FTTV9GTEFHX01NWF9TVVBQT1JUX0NPTVBJTEVECi0gICAgUE5HX0FTTV9GTEFHX01NWF9TVVBQT1JUX0lOX0NQVQotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9DT01CSU5FX1JPVwotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9JTlRFUkxBQ0UKLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1NVQgotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfVVAKLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX0FWRwotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfUEFFVEgKLSAgICBQTkdfQVNNX0ZMQUdTX0lOSVRJQUxJWkVECi0gICAgUE5HX01NWF9SRUFEX0ZMQUdTCi0gICAgUE5HX01NWF9GTEFHUwotICAgIFBOR19NTVhfV1JJVEVfRkxBR1MKLSAgICBQTkdfTU1YX0ZMQUdTCi0KLVdlIGFkZGVkIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGluIHN1cHBvcnQgb2YgcnVudGltZQotc2VsZWN0aW9uIG9mIGFzc2VtYmxlciBjb2RlIGZlYXR1cmVzOgotCi0gICAgcG5nX2dldF9tbXhfZmxhZ21hc2soKQotICAgIHBuZ19zZXRfbW14X3RocmVzaG9sZHMoKQotICAgIHBuZ19nZXRfYXNtX2ZsYWdzKCkKLSAgICBwbmdfZ2V0X21teF9iaXRkZXB0aF90aHJlc2hvbGQoKQotICAgIHBuZ19nZXRfbW14X3Jvd2J5dGVzX3RocmVzaG9sZCgpCi0gICAgcG5nX3NldF9hc21fZmxhZ3MoKQotCi1XZSByZXBsYWNlZCBhbGwgb2YgdGhlc2UgZnVuY3Rpb25zIHdpdGggc2ltcGxlIHN0dWJzIGluIGxpYnBuZy0xLjIuMjAsCi13aGVuIHRoZSBJbnRlbCBhc3NlbWJsZXIgY29kZSB3YXMgcmVtb3ZlZCBkdWUgdG8gYSBsaWNlbnNpbmcgaXNzdWUuCi0KLS5TSCBJWC4gIChPbWl0dGVkKQotCi0uU0ggWC4gRGV0ZWN0aW5nIGxpYnBuZwotCi1UaGUgcG5nX2dldF9pb19wdHIoKSBmdW5jdGlvbiBoYXMgYmVlbiBwcmVzZW50IHNpbmNlIGxpYnBuZy0wLjg4LCBoYXMgbmV2ZXIKLWNoYW5nZWQsIGFuZCBpcyB1bmFmZmVjdGVkIGJ5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIG1hY3Jvcy4gIEl0IGlzIHRoZQotYmVzdCBjaG9pY2UgZm9yIHVzZSBpbiBjb25maWd1cmUgc2NyaXB0cyBmb3IgZGV0ZWN0aW5nIHRoZSBwcmVzZW5jZSBvZiBhbnkKLWxpYnBuZyB2ZXJzaW9uIHNpbmNlIDAuODguCi0KLS5TSCBYSS4gU291cmNlIGNvZGUgcmVwb3NpdG9yeQotCi1TaW5jZSBhYm91dCBGZWJydWFyeSAyMDA5LCB2ZXJzaW9uIDEuMi4zNCwgbGlicG5nIGhhcyBiZWVuIHVuZGVyICJnaXQiIHNvdXJjZQotY29udHJvbC4gIFRoZSBnaXQgcmVwb3NpdG9yeSB3YXMgYnVpbHQgZnJvbSBvbGQgbGlicG5nLXgueS56LnRhci5neiBmaWxlcwotZ29pbmcgYmFjayB0byB2ZXJzaW9uIDAuNzAuICBZb3UgY2FuIGFjY2VzcyB0aGUgZ2l0IHJlcG9zaXRvcnkgKHJlYWQgb25seSkKLWF0Ci0KLSAgICBnaXQ6Ly9saWJwbmcuZ2l0LnNvdXJjZWZvcmdlLm5ldC9naXRyb290L2xpYnBuZwotCi1vciB5b3UgY2FuIGJyb3dzZSBpdCB2aWEgImdpdHdlYiIgYXQKLQotICAgIGh0dHA6Ly9saWJwbmcuZ2l0LnNvdXJjZWZvcmdlLm5ldC9naXQvZ2l0d2ViLmNnaT9wPWxpYnBuZwotCi1QYXRjaGVzIGNhbiBiZSBzZW50IHRvIGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0IG9yIHRvCi1wbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgb3IgeW91IGNhbiB1cGxvYWQgdGhlbSB0bwotdGhlIGxpYnBuZyBidWcgdHJhY2tlciBhdAotCi0gICAgaHR0cDovL2xpYnBuZy5zb3VyY2Vmb3JnZS5uZXQKLQotLlNIIFhJSS4gQ29kaW5nIHN0eWxlCi0KLU91ciBjb2Rpbmcgc3R5bGUgaXMgc2ltaWxhciB0byB0aGUgIkFsbG1hbiIgc3R5bGUsIHdpdGggY3VybHkKLWJyYWNlcyBvbiBzZXBhcmF0ZSBsaW5lczoKLQotICAgIGlmIChjb25kaXRpb24pCi0gICAgewotICAgICAgIGFjdGlvbjsKLSAgICB9Ci0KLSAgICBlbHNlIGlmIChhbm90aGVyIGNvbmRpdGlvbikKLSAgICB7Ci0gICAgICAgYW5vdGhlciBhY3Rpb247Ci0gICAgfQotCi1UaGUgYnJhY2VzIGNhbiBiZSBvbWl0dGVkIGZyb20gc2ltcGxlIG9uZS1saW5lIGFjdGlvbnM6Ci0KLSAgICBpZiAoY29uZGl0aW9uKQotICAgICAgIHJldHVybiAoMCk7Ci0KLVdlIHVzZSAzLXNwYWNlIGluZGVudGF0aW9uLCBleGNlcHQgZm9yIGNvbnRpbnVlZCBzdGF0ZW1lbnRzIHdoaWNoCi1hcmUgdXN1YWxseSBpbmRlbnRlZCB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc3RhdGVtZW50Ci1wbHVzIGZvdXIgbW9yZSBzcGFjZXMuCi0KLUNvbW1lbnRzIGFwcGVhciB3aXRoIHRoZSBsZWFkaW5nICIvKiIgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gYXMKLXRoZSBzdGF0ZW1lbnQgdGhhdCBmb2xsb3dzIHRoZSBjb21tZW50OgotCi0gICAgLyogU2luZ2xlLWxpbmUgY29tbWVudCAqLwotICAgIHN0YXRlbWVudDsKLQotICAgIC8qIE11bHRpcGxlLWxpbmUKLSAgICAgKiBjb21tZW50Ci0gICAgICovCi0gICAgc3RhdGVtZW50OwotCi1WZXJ5IHNob3J0IGNvbW1lbnRzIGNhbiBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgc3RhdGVtZW50Ci10byB3aGljaCB0aGV5IHBlcnRhaW46Ci0KLSAgICBzdGF0ZW1lbnQ7ICAgIC8qIGNvbW1lbnQgKi8KLQotV2UgZG9uJ3QgdXNlIEMrKyBzdHlsZSAoIi8vIikgY29tbWVudHMuIFdlIGhhdmUsIGhvd2V2ZXIsCi11c2VkIHRoZW0gaW4gdGhlIHBhc3QgaW4gc29tZSBub3ctYWJhbmRvbmVkIE1NWCBhc3NlbWJsZXIKLWNvZGUuCi0KLUZ1bmN0aW9ucyBhbmQgdGhlaXIgY3VybHkgYnJhY2tldHMgYXJlIG5vdCBpbmRlbnRlZCwgYW5kCi1leHBvcnRlZCBmdW5jdGlvbnMgYXJlIG1hcmtlZCB3aXRoIFBOR0FQSToKLQotIC8qIFRoaXMgaXMgYSBwdWJsaWMgZnVuY3Rpb24gdGhhdCBpcyB2aXNpYmxlIHRvCi0gICogYXBwbGljYXRpb24gcHJvZ3JhbWVycy4gSXQgZG9lcyB0aHVzLWFuZC1zby4KLSAgKi8KLSB2b2lkIFBOR0FQSQotIHBuZ19leHBvcnRlZF9mdW5jdGlvbihwbmdfcHRyLCBwbmdfaW5mbywgZm9vKQotIHsKLSAgICBib2R5OwotIH0KLQotVGhlIHByb3RvdHlwZXMgZm9yIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgYXBwZWFyIGluIHBuZy5oLgotCi1XZSBtYXJrIGFsbCBub24tZXhwb3J0ZWQgZnVuY3Rpb25zIHdpdGggIi8qIFBSSVZBVEUgKi8iIjoKLQotIHZvaWQgLyogUFJJVkFURSAqLwotIHBuZ19ub25fZXhwb3J0ZWRfZnVuY3Rpb24ocG5nX3B0ciwgcG5nX2luZm8sIGZvbykKLSB7Ci0gICAgYm9keTsKLSB9Ci0KLVRoZSBwcm90b3R5cGVzIGZvciBub24tZXhwb3J0ZWQgZnVuY3Rpb25zIGNhbiBhcHBlYXIgaW4KLXBuZ3ByaXYuaCBvciBpbiB0aGUgZmlsZSB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgbG9jYXRlZC4KLQotVGhlIG5hbWVzIG9mIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBiZWdpbgotd2l0aCAgInBuZ18iLCBhbmQgYWxsIHB1YmxpY2x5IHZpc2libGUgQyBwcmVwcm9jZXNzb3IKLW1hY3JvcyBiZWdpbiB3aXRoICJQTkdfIi4KLQotV2UgcHV0IGEgc3BhY2UgYWZ0ZXIgZWFjaCBjb21tYSBhbmQgYWZ0ZXIgZWFjaCBzZW1pY29sb24KLWluICJmb3IiIHN0YXRtZW50cywgYW5kIHdlIHB1dCBzcGFjZXMgYmVmb3JlIGFuZCBhZnRlciBlYWNoCi1DIGJpbmFyeSBvcGVyYXRvciBhbmQgYWZ0ZXIgImZvciIgb3IgIndoaWxlIi4gIFdlIGRvbid0Ci1wdXQgYSBzcGFjZSBiZXR3ZWVuIGEgdHlwZWNhc3QgYW5kIHRoZSBleHByZXNzaW9uIGJlaW5nCi1jYXN0LCBub3IgZG8gd2UgcHV0IG9uZSBiZXR3ZWVuIGEgZnVuY3Rpb24gbmFtZSBhbmQgdGhlCi1sZWZ0IHBhcmVudGhlc2lzIHRoYXQgZm9sbG93cyBpdDoKLQotICAgIGZvciAoaSA9IDI7IGkgPiAwOyAtLWkpCi0gICAgICAgeFtpXSA9IGEoeCkgKyAoaW50KWI7Ci0KLU90aGVyIHJ1bGVzIGNhbiBiZSBpbmZlcnJlZCBieSBpbnNwZWN0aW5nIHRoZSBsaWJwbmcKLXNvdXJjZS4KLQotLlNIIFhJSUkuIFkySyBDb21wbGlhbmNlIGluIGxpYnBuZwotCi1KdW5lIDQsIDIwMDkKLQotU2luY2UgdGhlIFBORyBEZXZlbG9wbWVudCBncm91cCBpcyBhbiBhZC1ob2MgYm9keSwgd2UgY2FuJ3QgbWFrZQotYW4gb2ZmaWNpYWwgZGVjbGFyYXRpb24uCi0KLVRoaXMgaXMgeW91ciB1bm9mZmljaWFsIGFzc3VyYW5jZSB0aGF0IGxpYnBuZyBmcm9tIHZlcnNpb24gMC43MSBhbmQKLXVwd2FyZCB0aHJvdWdoIDEuMi4zNyBhcmUgWTJLIGNvbXBsaWFudC4gIEl0IGlzIG15IGJlbGllZiB0aGF0IGVhcmxpZXIKLXZlcnNpb25zIHdlcmUgYWxzbyBZMksgY29tcGxpYW50LgotCi1MaWJwbmcgb25seSBoYXMgdGhyZWUgeWVhciBmaWVsZHMuICBPbmUgaXMgYSAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlciB0aGF0Ci13aWxsIGhvbGQgeWVhcnMgdXAgdG8gNjU1MzUuICBUaGUgb3RoZXIgdHdvIGhvbGQgdGhlIGRhdGUgaW4gdGV4dAotZm9ybWF0LCBhbmQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDk5OTkuCi0KLVRoZSBpbnRlZ2VyIGlzCi0gICAgInBuZ191aW50XzE2IHllYXIiIGluIHBuZ190aW1lX3N0cnVjdC4KLQotVGhlIHN0cmluZ3MgYXJlCi0gICAgInBuZ19jaGFycCB0aW1lX2J1ZmZlciIgaW4gcG5nX3N0cnVjdCBhbmQKLSAgICAibmVhcl90aW1lX2J1ZmZlciIsIHdoaWNoIGlzIGEgbG9jYWwgY2hhcmFjdGVyIHN0cmluZyBpbiBwbmcuYy4KLQotVGhlcmUgYXJlIHNldmVuIHRpbWUtcmVsYXRlZCBmdW5jdGlvbnM6Ci0KLSAgICBwbmdfY29udmVydF90b19yZmNfMTEyMygpIGluIHBuZy5jCi0gICAgICAoZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExNTIoKSBpbiBlcnJvcikKLSAgICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGluIHBuZ3dyaXRlLmMsIGNhbGxlZAotICAgICAgaW4gcG5nd3JpdGUuYwotICAgIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCkgaW4gcG5nd3JpdGUuYwotICAgIHBuZ19nZXRfdElNRSgpIGluIHBuZ2dldC5jCi0gICAgcG5nX2hhbmRsZV90SU1FKCkgaW4gcG5ncnV0aWwuYywgY2FsbGVkIGluIHBuZ3JlYWQuYwotICAgIHBuZ19zZXRfdElNRSgpIGluIHBuZ3NldC5jCi0gICAgcG5nX3dyaXRlX3RJTUUoKSBpbiBwbmd3dXRpbC5jLCBjYWxsZWQgaW4gcG5nd3JpdGUuYwotCi1BbGwgYXBwZWFyIHRvIGhhbmRsZSBkYXRlcyBwcm9wZXJseSBpbiBhIFkySyBlbnZpcm9ubWVudC4gIFRoZQotcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmdW5jdGlvbiBjYWxscyBnbXRpbWUoKSB0byBjb252ZXJ0IGZyb20gc3lzdGVtCi1jbG9jayB0aW1lLCB3aGljaCByZXR1cm5zICh5ZWFyIC0gMTkwMCksIHdoaWNoIHdlIHByb3Blcmx5IGNvbnZlcnQgdG8KLXRoZSBmdWxsIDQtZGlnaXQgeWVhci4gIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhcHBsaWNhdGlvbnMgdXNpbmcKLWxpYnBuZyBhcmUgbm90IHBhc3NpbmcgNC1kaWdpdCB5ZWFycyBpbnRvIHRoZSBwbmdfY29udmVydF90b19yZmNfMTEyMygpCi1mdW5jdGlvbiwgb3IgdGhhdCB0aGV5IGFyZSBpbmNvcnJlY3RseSBwYXNzaW5nIG9ubHkgYSAyLWRpZ2l0IHllYXIKLWluc3RlYWQgb2YgInllYXIgLSAxOTAwIiBpbnRvIHRoZSBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZ1bmN0aW9uLAotYnV0IHRoaXMgaXMgbm90IHVuZGVyIG91ciBjb250cm9sLiAgVGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uIGhhcyBhbHdheXMKLXN0YXRlZCB0aGF0IGl0IHdvcmtzIHdpdGggNC1kaWdpdCB5ZWFycywgYW5kIHRoZSBBUElzIGhhdmUgYmVlbgotZG9jdW1lbnRlZCBhcyBzdWNoLgotCi1UaGUgdElNRSBjaHVuayBpdHNlbGYgaXMgYWxzbyBZMksgY29tcGxpYW50LiAgSXQgdXNlcyBhIDItYnl0ZSB1bnNpZ25lZAotaW50ZWdlciB0byBob2xkIHRoZSB5ZWFyLCBhbmQgY2FuIGhvbGQgeWVhcnMgYXMgbGFyZ2UgYXMgNjU1MzUuCi0KLXpsaWIsIHVwb24gd2hpY2ggbGlicG5nIGRlcGVuZHMsIGlzIGFsc28gWTJLIGNvbXBsaWFudC4gIEl0IGNvbnRhaW5zCi1ubyBkYXRlLXJlbGF0ZWQgY29kZS4KLQotCi0gICBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAgIGxpYnBuZyBtYWludGFpbmVyCi0gICBQTkcgRGV2ZWxvcG1lbnQgR3JvdXAKLQotLlNIIE5PVEUKLQotTm90ZSBhYm91dCBsaWJwbmcgdmVyc2lvbiBudW1iZXJzOgotCi1EdWUgdG8gdmFyaW91cyBtaXNjb21tdW5pY2F0aW9ucywgdW5mb3Jlc2VlbiBjb2RlIGluY29tcGF0aWJpbGl0aWVzCi1hbmQgb2NjYXNpb25hbCBmYWN0b3JzIG91dHNpZGUgdGhlIGF1dGhvcnMnIGNvbnRyb2wsIHZlcnNpb24gbnVtYmVyaW5nCi1vbiB0aGUgbGlicmFyeSBoYXMgbm90IGFsd2F5cyBiZWVuIGNvbnNpc3RlbnQgYW5kIHN0cmFpZ2h0Zm9yd2FyZC4KLVRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyBtYXR0ZXJzIHNpbmNlIHZlcnNpb24gMC44OWMsIHdoaWNoIHdhcwotdGhlIGZpcnN0IHdpZGVseSB1c2VkIHJlbGVhc2U6Ci0KLSBzb3VyY2UgICAgICAgICAgICAgcG5nLmggIHBuZy5oICBzaGFyZWQtbGliCi0gdmVyc2lvbiAgICAgICAgICAgIHN0cmluZyAgIGludCAgdmVyc2lvbgotIC0tLS0tLS0gICAgICAgICAgICAtLS0tLS0gIC0tLS0tIC0tLS0tLS0tLS0KLSAwLjg5YyAoImJldGEgMyIpICAwLjg5ICAgICAgIDg5ICAxLjAuODkKLSAwLjkwICAoImJldGEgNCIpICAwLjkwICAgICAgIDkwICAwLjkwCi0gMC45NSAgKCJiZXRhIDUiKSAgMC45NSAgICAgICA5NSAgMC45NQotIDAuOTYgICgiYmV0YSA2IikgIDAuOTYgICAgICAgOTYgIDAuOTYKLSAwLjk3YiAoImJldGEgNyIpICAxLjAwLjk3ICAgIDk3ICAxLjAuMQotIDAuOTdjICAgICAgICAgICAgIDAuOTcgICAgICAgOTcgIDIuMC45NwotIDAuOTggICAgICAgICAgICAgIDAuOTggICAgICAgOTggIDIuMC45OAotIDAuOTkgICAgICAgICAgICAgIDAuOTkgICAgICAgOTggIDIuMC45OQotIDAuOTlhLW0gICAgICAgICAgIDAuOTkgICAgICAgOTkgIDIuMC45OQotIDEuMDAgICAgICAgICAgICAgIDEuMDAgICAgICAxMDAgIDIuMS4wCi0gMS4wLjAgICAgICAgICAgICAgMS4wLjAgICAgIDEwMCAgMi4xLjAKLSAxLjAuMCAgIChmcm9tIGhlcmUgb24sIHRoZSAgMTAwICAyLjEuMAotIDEuMC4xICAgIHBuZy5oIHN0cmluZyBpcyAgMTAwMDEgIDIuMS4wCi0gMS4wLjFhLWUgaWRlbnRpY2FsIHRvIHRoZSAxMDAwMiAgZnJvbSBoZXJlIG9uLCB0aGUKLSAxLjAuMiAgICBzb3VyY2UgdmVyc2lvbikgIDEwMDAyICBzaGFyZWQgbGlicmFyeSBpcyAyLlYKLSAxLjAuMmEtYiAgICAgICAgICAgICAgICAgIDEwMDAzICB3aGVyZSBWIGlzIHRoZSBzb3VyY2UKLSAxLjAuMSAgICAgICAgICAgICAgICAgICAgIDEwMDAxICBjb2RlIHZlcnNpb24gZXhjZXB0IGFzCi0gMS4wLjFhLWUgICAgICAgICAgICAgICAgICAxMDAwMiAgMi4xLjAuMWEtZSAgIG5vdGVkLgotIDEuMC4yICAgICAgICAgICAgICAgICAgICAgMTAwMDIgIDIuMS4wLjIKLSAxLjAuMmEtYiAgICAgICAgICAgICAgICAgIDEwMDAzICAyLjEuMC4yYS1iCi0gMS4wLjMgICAgICAgICAgICAgICAgICAgICAxMDAwMyAgMi4xLjAuMwotIDEuMC4zYS1kICAgICAgICAgICAgICAgICAgMTAwMDQgIDIuMS4wLjNhLWQKLSAxLjAuNCAgICAgICAgICAgICAgICAgICAgIDEwMDA0ICAyLjEuMC40Ci0gMS4wLjRhLWYgICAgICAgICAgICAgICAgICAxMDAwNSAgMi4xLjAuNGEtZgotIDEuMC41ICgrIDIgcGF0Y2hlcykgICAgICAgMTAwMDUgIDIuMS4wLjUKLSAxLjAuNWEtZCAgICAgICAgICAgICAgICAgIDEwMDA2ICAyLjEuMC41YS1kCi0gMS4wLjVlLXIgICAgICAgICAgICAgICAgICAxMDEwMCAgMi4xLjAuNWUtcgotIDEuMC41cy12ICAgICAgICAgICAgICAgICAgMTAwMDYgIDIuMS4wLjVzLXYKLSAxLjAuNiAoKyAzIHBhdGNoZXMpICAgICAgIDEwMDA2ICAyLjEuMC42Ci0gMS4wLjZkLWcgICAgICAgICAgICAgICAgICAxMDAwNyAgMi4xLjAuNmQtZwotIDEuMC42aCAgICAgICAgICAgICAgICAgICAgMTAwMDcgIDEwLjZoCi0gMS4wLjZpICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMTAuNmkKLSAxLjAuNmogICAgICAgICAgICAgICAgICAgIDEwMDA3ICAyLjEuMC42agotIDEuMC43YmV0YTExLTE0ICAgIERMTE5VTSAgMTAwMDcgIDIuMS4wLjdiZXRhMTEtMTQKLSAxLjAuN2JldGExNS0xOCAgICAgICAxICAgIDEwMDA3ICAyLjEuMC43YmV0YTE1LTE4Ci0gMS4wLjdyYzEtMiAgICAgICAgICAgMSAgICAxMDAwNyAgMi4xLjAuN3JjMS0yCi0gMS4wLjcgICAgICAgICAgICAgICAgMSAgICAxMDAwNyAgMi4xLjAuNwotIDEuMC44YmV0YTEtNCAgICAgICAgIDEgICAgMTAwMDggIDIuMS4wLjhiZXRhMS00Ci0gMS4wLjhyYzEgICAgICAgICAgICAgMSAgICAxMDAwOCAgMi4xLjAuOHJjMQotIDEuMC44ICAgICAgICAgICAgICAgIDEgICAgMTAwMDggIDIuMS4wLjgKLSAxLjAuOWJldGExLTYgICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45YmV0YTEtNgotIDEuMC45cmMxICAgICAgICAgICAgIDEgICAgMTAwMDkgIDIuMS4wLjlyYzEKLSAxLjAuOWJldGE3LTEwICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45YmV0YTctMTAKLSAxLjAuOXJjMiAgICAgICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45cmMyCi0gMS4wLjkgICAgICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOQotIDEuMC4xMGJldGExICAgICAgICAgIDEgICAgMTAwMTAgIDIuMS4wLjEwYmV0YTEKLSAxLjAuMTByYzEgICAgICAgICAgICAxICAgIDEwMDEwICAyLjEuMC4xMHJjMQotIDEuMC4xMCAgICAgICAgICAgICAgIDEgICAgMTAwMTAgIDIuMS4wLjEwCi0gMS4wLjExYmV0YTEtMyAgICAgICAgMSAgICAxMDAxMSAgMi4xLjAuMTFiZXRhMS0zCi0gMS4wLjExcmMxICAgICAgICAgICAgMSAgICAxMDAxMSAgMi4xLjAuMTFyYzEKLSAxLjAuMTEgICAgICAgICAgICAgICAxICAgIDEwMDExICAyLjEuMC4xMQotIDEuMC4xMmJldGExLTIgICAgICAgIDIgICAgMTAwMTIgIDIuMS4wLjEyYmV0YTEtMgotIDEuMC4xMnJjMSAgICAgICAgICAgIDIgICAgMTAwMTIgIDIuMS4wLjEycmMxCi0gMS4wLjEyICAgICAgICAgICAgICAgMiAgICAxMDAxMiAgMi4xLjAuMTIKLSAxLjEuMGEtZiAgICAgICAgICAgICAtICAgIDEwMTAwICAyLjEuMS4wYS1mIGFiYW5kb25lZAotIDEuMi4wYmV0YTEtMiAgICAgICAgIDIgICAgMTAyMDAgIDIuMS4yLjBiZXRhMS0yCi0gMS4yLjBiZXRhMy01ICAgICAgICAgMyAgICAxMDIwMCAgMy4xLjIuMGJldGEzLTUKLSAxLjIuMHJjMSAgICAgICAgICAgICAzICAgIDEwMjAwICAzLjEuMi4wcmMxCi0gMS4yLjAgICAgICAgICAgICAgICAgMyAgICAxMDIwMCAgMy4xLjIuMAotIDEuMi4xYmV0YS00ICAgICAgICAgIDMgICAgMTAyMDEgIDMuMS4yLjFiZXRhMS00Ci0gMS4yLjFyYzEtMiAgICAgICAgICAgMyAgICAxMDIwMSAgMy4xLjIuMXJjMS0yCi0gMS4yLjEgICAgICAgICAgICAgICAgMyAgICAxMDIwMSAgMy4xLjIuMQotIDEuMi4yYmV0YTEtNiAgICAgICAgMTIgICAgMTAyMDIgIDEyLnNvLjAuMS4yLjJiZXRhMS02Ci0gMS4wLjEzYmV0YTEgICAgICAgICAxMCAgICAxMDAxMyAgMTAuc28uMC4xLjAuMTNiZXRhMQotIDEuMC4xM3JjMSAgICAgICAgICAgMTAgICAgMTAwMTMgIDEwLnNvLjAuMS4wLjEzcmMxCi0gMS4yLjJyYzEgICAgICAgICAgICAxMiAgICAxMDIwMiAgMTIuc28uMC4xLjIuMnJjMQotIDEuMC4xMyAgICAgICAgICAgICAgMTAgICAgMTAwMTMgIDEwLnNvLjAuMS4wLjEzCi0gMS4yLjIgICAgICAgICAgICAgICAxMiAgICAxMDIwMiAgMTIuc28uMC4xLjIuMgotIDEuMi4zcmMxLTYgICAgICAgICAgMTIgICAgMTAyMDMgIDEyLnNvLjAuMS4yLjNyYzEtNgotIDEuMi4zICAgICAgICAgICAgICAgMTIgICAgMTAyMDMgIDEyLnNvLjAuMS4yLjMKLSAxLjIuNGJldGExLTMgICAgICAgIDEzICAgIDEwMjA0ICAxMi5zby4wLjEuMi40YmV0YTEtMwotIDEuMi40cmMxICAgICAgICAgICAgMTMgICAgMTAyMDQgIDEyLnNvLjAuMS4yLjRyYzEKLSAxLjAuMTQgICAgICAgICAgICAgIDEwICAgIDEwMDE0ICAxMC5zby4wLjEuMC4xNAotIDEuMi40ICAgICAgICAgICAgICAgMTMgICAgMTAyMDQgIDEyLnNvLjAuMS4yLjQKLSAxLjIuNWJldGExLTIgICAgICAgIDEzICAgIDEwMjA1ICAxMi5zby4wLjEuMi41YmV0YTEtMgotIDEuMC4xNXJjMSAgICAgICAgICAgMTAgICAgMTAwMTUgIDEwLnNvLjAuMS4wLjE1cmMxCi0gMS4wLjE1ICAgICAgICAgICAgICAxMCAgICAxMDAxNSAgMTAuc28uMC4xLjAuMTUKLSAxLjIuNSAgICAgICAgICAgICAgIDEzICAgIDEwMjA1ICAxMi5zby4wLjEuMi41Ci0gMS4yLjZiZXRhMS00ICAgICAgICAxMyAgICAxMDIwNiAgMTIuc28uMC4xLjIuNmJldGExLTQKLSAxLjIuNnJjMS01ICAgICAgICAgIDEzICAgIDEwMjA2ICAxMi5zby4wLjEuMi42cmMxLTUKLSAxLjAuMTYgICAgICAgICAgICAgIDEwICAgIDEwMDE2ICAxMC5zby4wLjEuMC4xNgotIDEuMi42ICAgICAgICAgICAgICAgMTMgICAgMTAyMDYgIDEyLnNvLjAuMS4yLjYKLSAxLjIuN2JldGExLTIgICAgICAgIDEzICAgIDEwMjA3ICAxMi5zby4wLjEuMi43YmV0YTEtMgotIDEuMC4xN3JjMSAgICAgICAgICAgMTAgICAgMTAwMTcgIDEwLnNvLjAuMS4wLjE3cmMxCi0gMS4yLjdyYzEgICAgICAgICAgICAxMyAgICAxMDIwNyAgMTIuc28uMC4xLjIuN3JjMQotIDEuMC4xNyAgICAgICAgICAgICAgMTAgICAgMTAwMTcgIDEwLnNvLjAuMS4wLjE3Ci0gMS4yLjcgICAgICAgICAgICAgICAxMyAgICAxMDIwNyAgMTIuc28uMC4xLjIuNwotIDEuMi44YmV0YTEtNSAgICAgICAgMTMgICAgMTAyMDggIDEyLnNvLjAuMS4yLjhiZXRhMS01Ci0gMS4wLjE4cmMxLTUgICAgICAgICAxMCAgICAxMDAxOCAgMTAuc28uMC4xLjAuMThyYzEtNQotIDEuMi44cmMxLTUgICAgICAgICAgMTMgICAgMTAyMDggIDEyLnNvLjAuMS4yLjhyYzEtNQotIDEuMC4xOCAgICAgICAgICAgICAgMTAgICAgMTAwMTggIDEwLnNvLjAuMS4wLjE4Ci0gMS4yLjggICAgICAgICAgICAgICAxMyAgICAxMDIwOCAgMTIuc28uMC4xLjIuOAotIDEuMi45YmV0YTEtMyAgICAgICAgMTMgICAgMTAyMDkgIDEyLnNvLjAuMS4yLjliZXRhMS0zCi0gMS4yLjliZXRhNC0xMSAgICAgICAxMyAgICAxMDIwOSAgMTIuc28uMC45Wy4wXQotIDEuMi45cmMxICAgICAgICAgICAgMTMgICAgMTAyMDkgIDEyLnNvLjAuOVsuMF0KLSAxLjIuOSAgICAgICAgICAgICAgIDEzICAgIDEwMjA5ICAxMi5zby4wLjlbLjBdCi0gMS4yLjEwYmV0YTEtOCAgICAgICAxMyAgICAxMDIxMCAgMTIuc28uMC4xMFsuMF0KLSAxLjIuMTByYzEtMyAgICAgICAgIDEzICAgIDEwMjEwICAxMi5zby4wLjEwWy4wXQotIDEuMi4xMCAgICAgICAgICAgICAgMTMgICAgMTAyMTAgIDEyLnNvLjAuMTBbLjBdCi0gMS4yLjExYmV0YTEtNCAgICAgICAxMyAgICAxMDIxMSAgMTIuc28uMC4xMVsuMF0KLSAxLjAuMTlyYzEtNSAgICAgICAgIDEwICAgIDEwMDE5ICAxMC5zby4wLjE5Wy4wXQotIDEuMi4xMXJjMS01ICAgICAgICAgMTMgICAgMTAyMTEgIDEyLnNvLjAuMTFbLjBdCi0gMS4wLjE5ICAgICAgICAgICAgICAxMCAgICAxMDAxOSAgMTAuc28uMC4xOVsuMF0KLSAxLjIuMTEgICAgICAgICAgICAgIDEzICAgIDEwMjExICAxMi5zby4wLjExWy4wXQotIDEuMC4yMCAgICAgICAgICAgICAgMTAgICAgMTAwMjAgIDEwLnNvLjAuMjBbLjBdCi0gMS4yLjEyICAgICAgICAgICAgICAxMyAgICAxMDIxMiAgMTIuc28uMC4xMlsuMF0KLSAxLjIuMTNiZXRhMSAgICAgICAgIDEzICAgIDEwMjEzICAxMi5zby4wLjEzWy4wXQotIDEuMC4yMSAgICAgICAgICAgICAgMTAgICAgMTAwMjEgIDEwLnNvLjAuMjFbLjBdCi0gMS4yLjEzICAgICAgICAgICAgICAxMyAgICAxMDIxMyAgMTIuc28uMC4xM1suMF0KLSAxLjIuMTRiZXRhMS0yICAgICAgIDEzICAgIDEwMjE0ICAxMi5zby4wLjE0Wy4wXQotIDEuMC4yMnJjMSAgICAgICAgICAgMTAgICAgMTAwMjIgIDEwLnNvLjAuMjJbLjBdCi0gMS4yLjE0cmMxICAgICAgICAgICAxMyAgICAxMDIxNCAgMTIuc28uMC4xNFsuMF0KLSAxLjIuMTViZXRhMS02ICAgICAgIDEzICAgIDEwMjE1ICAxMi5zby4wLjE1Wy4wXQotIDEuMC4yM3JjMS01ICAgICAgICAgMTAgICAgMTAwMjMgIDEwLnNvLjAuMjNbLjBdCi0gMS4yLjE1cmMxLTUgICAgICAgICAxMyAgICAxMDIxNSAgMTIuc28uMC4xNVsuMF0KLSAxLjAuMjMgICAgICAgICAgICAgIDEwICAgIDEwMDIzICAxMC5zby4wLjIzWy4wXQotIDEuMi4xNSAgICAgICAgICAgICAgMTMgICAgMTAyMTUgIDEyLnNvLjAuMTVbLjBdCi0gMS4yLjE2YmV0YTEtMiAgICAgICAxMyAgICAxMDIxNiAgMTIuc28uMC4xNlsuMF0KLSAxLjIuMTZyYzEgICAgICAgICAgIDEzICAgIDEwMjE2ICAxMi5zby4wLjE2Wy4wXQotIDEuMC4yNCAgICAgICAgICAgICAgMTAgICAgMTAwMjQgIDEwLnNvLjAuMjRbLjBdCi0gMS4yLjE2ICAgICAgICAgICAgICAxMyAgICAxMDIxNiAgMTIuc28uMC4xNlsuMF0KLSAxLjIuMTdiZXRhMS0yICAgICAgIDEzICAgIDEwMjE3ICAxMi5zby4wLjE3Wy4wXQotIDEuMC4yNXJjMSAgICAgICAgICAgMTAgICAgMTAwMjUgIDEwLnNvLjAuMjVbLjBdCi0gMS4yLjE3cmMxLTMgICAgICAgICAxMyAgICAxMDIxNyAgMTIuc28uMC4xN1suMF0KLSAxLjAuMjUgICAgICAgICAgICAgIDEwICAgIDEwMDI1ICAxMC5zby4wLjI1Wy4wXQotIDEuMi4xNyAgICAgICAgICAgICAgMTMgICAgMTAyMTcgIDEyLnNvLjAuMTdbLjBdCi0gMS4wLjI2ICAgICAgICAgICAgICAxMCAgICAxMDAyNiAgMTAuc28uMC4yNlsuMF0KLSAxLjIuMTggICAgICAgICAgICAgIDEzICAgIDEwMjE4ICAxMi5zby4wLjE4Wy4wXQotIDEuMi4xOWJldGExLTMxICAgICAgMTMgICAgMTAyMTkgIDEyLnNvLjAuMTlbLjBdCi0gMS4wLjI3cmMxLTYgICAgICAgICAxMCAgICAxMDAyNyAgMTAuc28uMC4yN1suMF0KLSAxLjIuMTlyYzEtNiAgICAgICAgIDEzICAgIDEwMjE5ICAxMi5zby4wLjE5Wy4wXQotIDEuMC4yNyAgICAgICAgICAgICAgMTAgICAgMTAwMjcgIDEwLnNvLjAuMjdbLjBdCi0gMS4yLjE5ICAgICAgICAgICAgICAxMyAgICAxMDIxOSAgMTIuc28uMC4xOVsuMF0KLSAxLjIuMjBiZXRhMDEtMDQgICAgIDEzICAgIDEwMjIwICAxMi5zby4wLjIwWy4wXQotIDEuMC4yOHJjMS02ICAgICAgICAgMTAgICAgMTAwMjggIDEwLnNvLjAuMjhbLjBdCi0gMS4yLjIwcmMxLTYgICAgICAgICAxMyAgICAxMDIyMCAgMTIuc28uMC4yMFsuMF0KLSAxLjAuMjggICAgICAgICAgICAgIDEwICAgIDEwMDI4ICAxMC5zby4wLjI4Wy4wXQotIDEuMi4yMCAgICAgICAgICAgICAgMTMgICAgMTAyMjAgIDEyLnNvLjAuMjBbLjBdCi0gMS4yLjIxYmV0YTEtMiAgICAgICAxMyAgICAxMDIyMSAgMTIuc28uMC4yMVsuMF0KLSAxLjIuMjFyYzEtMyAgICAgICAgIDEzICAgIDEwMjIxICAxMi5zby4wLjIxWy4wXQotIDEuMC4yOSAgICAgICAgICAgICAgMTAgICAgMTAwMjkgIDEwLnNvLjAuMjlbLjBdCi0gMS4yLjIxICAgICAgICAgICAgICAxMyAgICAxMDIyMSAgMTIuc28uMC4yMVsuMF0KLSAxLjIuMjJiZXRhMS00ICAgICAgIDEzICAgIDEwMjIyICAxMi5zby4wLjIyWy4wXQotIDEuMC4zMHJjMSAgICAgICAgICAgMTMgICAgMTAwMzAgIDEwLnNvLjAuMzBbLjBdCi0gMS4yLjIycmMxICAgICAgICAgICAxMyAgICAxMDIyMiAgMTIuc28uMC4yMlsuMF0KLSAxLjAuMzAgICAgICAgICAgICAgIDEwICAgIDEwMDMwICAxMC5zby4wLjMwWy4wXQotIDEuMi4yMiAgICAgICAgICAgICAgMTMgICAgMTAyMjIgIDEyLnNvLjAuMjJbLjBdCi0gMS4yLjIzYmV0YTAxLTA1ICAgICAxMyAgICAxMDIyMyAgMTIuc28uMC4yM1suMF0KLSAxLjIuMjNyYzAxICAgICAgICAgIDEzICAgIDEwMjIzICAxMi5zby4wLjIzWy4wXQotIDEuMi4yMyAgICAgICAgICAgICAgMTMgICAgMTAyMjMgIDEyLnNvLjAuMjNbLjBdCi0gMS4yLjI0YmV0YTAxLTAyICAgICAxMyAgICAxMDIyNCAgMTIuc28uMC4yNFsuMF0KLSAxLjIuMjRyYzAxICAgICAgICAgIDEzICAgIDEwMjI0ICAxMi5zby4wLjI0Wy4wXQotIDEuMi4yNCAgICAgICAgICAgICAgMTMgICAgMTAyMjQgIDEyLnNvLjAuMjRbLjBdCi0gMS4yLjI1YmV0YTAxLTA2ICAgICAxMyAgICAxMDIyNSAgMTIuc28uMC4yNVsuMF0KLSAxLjIuMjVyYzAxLTAyICAgICAgIDEzICAgIDEwMjI1ICAxMi5zby4wLjI1Wy4wXQotIDEuMC4zMSAgICAgICAgICAgICAgMTAgICAgMTAwMzEgIDEwLnNvLjAuMzFbLjBdCi0gMS4yLjI1ICAgICAgICAgICAgICAxMyAgICAxMDIyNSAgMTIuc28uMC4yNVsuMF0KLSAxLjIuMjZiZXRhMDEtMDYgICAgIDEzICAgIDEwMjI2ICAxMi5zby4wLjI2Wy4wXQotIDEuMi4yNnJjMDEgICAgICAgICAgMTMgICAgMTAyMjYgIDEyLnNvLjAuMjZbLjBdCi0gMS4yLjI2ICAgICAgICAgICAgICAxMyAgICAxMDIyNiAgMTIuc28uMC4yNlsuMF0KLSAxLjAuMzIgICAgICAgICAgICAgIDEwICAgIDEwMDMyICAxMC5zby4wLjMyWy4wXQotIDEuMi4yN2JldGEwMS0wNiAgICAgMTMgICAgMTAyMjcgIDEyLnNvLjAuMjdbLjBdCi0gMS4yLjI3cmMwMSAgICAgICAgICAxMyAgICAxMDIyNyAgMTIuc28uMC4yN1suMF0KLSAxLjAuMzMgICAgICAgICAgICAgIDEwICAgIDEwMDMzICAxMC5zby4wLjMzWy4wXQotIDEuMi4yNyAgICAgICAgICAgICAgMTMgICAgMTAyMjcgIDEyLnNvLjAuMjdbLjBdCi0gMS4wLjM0ICAgICAgICAgICAgICAxMCAgICAxMDAzNCAgMTAuc28uMC4zNFsuMF0KLSAxLjIuMjggICAgICAgICAgICAgIDEzICAgIDEwMjI4ICAxMi5zby4wLjI4Wy4wXQotIDEuMi4yOWJldGEwMS0wMyAgICAgMTMgICAgMTAyMjkgIDEyLnNvLjAuMjlbLjBdCi0gMS4yLjI5cmMwMSAgICAgICAgICAxMyAgICAxMDIyOSAgMTIuc28uMC4yOVsuMF0KLSAxLjAuMzUgICAgICAgICAgICAgIDEwICAgIDEwMDM1ICAxMC5zby4wLjM1Wy4wXQotIDEuMi4yOSAgICAgICAgICAgICAgMTMgICAgMTAyMjkgIDEyLnNvLjAuMjlbLjBdCi0gMS4wLjM3ICAgICAgICAgICAgICAxMCAgICAxMDAzNyAgMTAuc28uMC4zN1suMF0KLSAxLjIuMzBiZXRhMDEtMDQgICAgIDEzICAgIDEwMjMwICAxMi5zby4wLjMwWy4wXQotIDEuMC4zOHJjMDEtMDggICAgICAgMTAgICAgMTAwMzggIDEwLnNvLjAuMzhbLjBdCi0gMS4yLjMwcmMwMS0wOCAgICAgICAxMyAgICAxMDIzMCAgMTIuc28uMC4zMFsuMF0KLSAxLjAuMzggICAgICAgICAgICAgIDEwICAgIDEwMDM4ICAxMC5zby4wLjM4Wy4wXQotIDEuMi4zMCAgICAgICAgICAgICAgMTMgICAgMTAyMzAgIDEyLnNvLjAuMzBbLjBdCi0gMS4wLjM5cmMwMS0wMyAgICAgICAxMCAgICAxMDAzOSAgMTAuc28uMC4zOVsuMF0KLSAxLjIuMzFyYzAxLTAzICAgICAgIDEzICAgIDEwMjMxICAxMi5zby4wLjMxWy4wXQotIDEuMC4zOSAgICAgICAgICAgICAgMTAgICAgMTAwMzkgIDEwLnNvLjAuMzlbLjBdCi0gMS4yLjMxICAgICAgICAgICAgICAxMyAgICAxMDIzMSAgMTIuc28uMC4zMVsuMF0KLSAxLjIuMzJiZXRhMDEtMDIgICAgIDEzICAgIDEwMjMyICAxMi5zby4wLjMyWy4wXQotIDEuMC40MHJjMDEgICAgICAgICAgMTAgICAgMTAwNDAgIDEwLnNvLjAuNDBbLjBdCi0gMS4yLjMycmMwMSAgICAgICAgICAxMyAgICAxMDIzMiAgMTIuc28uMC4zMlsuMF0KLSAxLjAuNDAgICAgICAgICAgICAgIDEwICAgIDEwMDQwICAxMC5zby4wLjQwWy4wXQotIDEuMi4zMiAgICAgICAgICAgICAgMTMgICAgMTAyMzIgIDEyLnNvLjAuMzJbLjBdCi0gMS4yLjMzYmV0YTAxLTAyICAgICAxMyAgICAxMDIzMyAgMTIuc28uMC4zM1suMF0KLSAxLjIuMzNyYzAxLTAyICAgICAgIDEzICAgIDEwMjMzICAxMi5zby4wLjMzWy4wXQotIDEuMC40MXJjMDEgICAgICAgICAgMTAgICAgMTAwNDEgIDEwLnNvLjAuNDFbLjBdCi0gMS4yLjMzICAgICAgICAgICAgICAxMyAgICAxMDIzMyAgMTIuc28uMC4zM1suMF0KLSAxLjAuNDEgICAgICAgICAgICAgIDEwICAgIDEwMDQxICAxMC5zby4wLjQxWy4wXQotIDEuMi4zNGJldGEwMS0wNyAgICAgMTMgICAgMTAyMzQgIDEyLnNvLjAuMzRbLjBdCi0gMS4wLjQycmMwMSAgICAgICAgICAxMCAgICAxMDA0MiAgMTAuc28uMC40MlsuMF0KLSAxLjIuMzRyYzAxICAgICAgICAgIDEzICAgIDEwMjM0ICAxMi5zby4wLjM0Wy4wXQotIDEuMC40MiAgICAgICAgICAgICAgMTAgICAgMTAwNDIgIDEwLnNvLjAuNDJbLjBdCi0gMS4yLjM0ICAgICAgICAgICAgICAxMyAgICAxMDIzNCAgMTIuc28uMC4zNFsuMF0KLSAxLjIuMzViZXRhMDEtMDMgICAgIDEzICAgIDEwMjM1ICAxMi5zby4wLjM1Wy4wXQotIDEuMC40M3JjMDEtMDIgICAgICAgMTAgICAgMTAwNDMgIDEwLnNvLjAuNDNbLjBdCi0gMS4yLjM1cmMwMS0wMiAgICAgICAxMyAgICAxMDIzNSAgMTIuc28uMC4zNVsuMF0KLSAxLjAuNDMgICAgICAgICAgICAgIDEwICAgIDEwMDQzICAxMC5zby4wLjQzWy4wXQotIDEuMi4zNSAgICAgICAgICAgICAgMTMgICAgMTAyMzUgIDEyLnNvLjAuMzVbLjBdCi0gMS4yLjM2YmV0YTAxLTA1ICAgICAxMyAgICAxMDIzNiAgMTIuc28uMC4zNlsuMF0KLSAxLjIuMzZyYzAxICAgICAgICAgIDEzICAgIDEwMjM2ICAxMi5zby4wLjM2Wy4wXQotIDEuMC40NCAgICAgICAgICAgICAgMTAgICAgMTAwNDQgIDEwLnNvLjAuNDRbLjBdCi0gMS4yLjM2ICAgICAgICAgICAgICAxMyAgICAxMDIzNiAgMTIuc28uMC4zNlsuMF0KLSAxLjIuMzdiZXRhMDEtMDMgICAgIDEzICAgIDEwMjM3ICAxMi5zby4wLjM3Wy4wXQotIDEuMi4zN3JjMDEgICAgICAgICAgMTMgICAgMTAyMzcgIDEyLnNvLjAuMzdbLjBdCi0gMS4yLjM3ICAgICAgICAgICAgICAxMyAgICAxMDIzNyAgMTIuc28uMC4zN1suMF0KLQotSGVuY2Vmb3J0aCB0aGUgc291cmNlIHZlcnNpb24gd2lsbCBtYXRjaCB0aGUgc2hhcmVkLWxpYnJhcnkgbWlub3IKLWFuZCBwYXRjaCBudW1iZXJzOyB0aGUgc2hhcmVkLWxpYnJhcnkgbWFqb3IgdmVyc2lvbiBudW1iZXIgd2lsbCBiZQotdXNlZCBmb3IgY2hhbmdlcyBpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBhcyBpdCBpcyBpbnRlbmRlZC4gIFRoZQotUE5HX1BOR0xJQl9WRVIgbWFjcm8sIHdoaWNoIGlzIG5vdCB1c2VkIHdpdGhpbiBsaWJwbmcgYnV0IGlzIGF2YWlsYWJsZQotZm9yIGFwcGxpY2F0aW9ucywgaXMgYW4gdW5zaWduZWQgaW50ZWdlciBvZiB0aGUgZm9ybSB4eXl6eiBjb3JyZXNwb25kaW5nCi10byB0aGUgc291cmNlIHZlcnNpb24geC55LnogKGxlYWRpbmcgemVyb3MgaW4geSBhbmQgeikuICBCZXRhIHZlcnNpb25zCi13ZXJlIGdpdmVuIHRoZSBwcmV2aW91cyBwdWJsaWMgcmVsZWFzZSBudW1iZXIgcGx1cyBhIGxldHRlciwgdW50aWwKLXZlcnNpb24gMS4wLjZqOyBmcm9tIHRoZW4gb24gdGhleSB3ZXJlIGdpdmVuIHRoZSB1cGNvbWluZyBwdWJsaWMKLXJlbGVhc2UgbnVtYmVyIHBsdXMgImJldGFOTiIgb3IgInJjTiIuCi0KLS5TSCAiU0VFIEFMU08iCi0uSVIgbGlicG5ncGYoMykgIiwgIiBwbmcoNSkKLS5MUAotLklSIGxpYnBuZyA6Ci0uSVAKLWh0dHA6Ly9saWJwbmcuc291cmNlZm9yZ2UubmV0IChmb2xsb3cgdGhlIFtET1dOTE9BRF0gbGluaykKLWh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nCi0KLS5MUAotLklSIHpsaWIgOgotLklQCi0oZ2VuZXJhbGx5KSBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhcwotLkkgbGlicG5nCi1vciBhdAotLmJyCi1mdHA6Ly9mdHAuaW5mby16aXAub3JnL3B1Yi9pbmZvemlwL3psaWIKLQotLkxQCi0uSVIgUE5HIHNwZWNpZmljYXRpb246IFJGQyAyMDgzCi0uSVAKLShnZW5lcmFsbHkpIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFzCi0uSSBsaWJwbmcKLW9yIGF0Ci0uYnIKLWZ0cDovL2Z0cC5yZmMtZWRpdG9yLm9yZzovaW4tbm90ZXMvcmZjMjA4My50eHQKLS5icgotb3IgKGFzIGEgVzNDIFJlY29tbWVuZGF0aW9uKSBhdAotLmJyCi1odHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtcG5nLmh0bWwKLQotLkxQCi1JbiB0aGUgY2FzZSBvZiBhbnkgaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSBQTkcgc3BlY2lmaWNhdGlvbgotYW5kIHRoaXMgbGlicmFyeSwgdGhlIHNwZWNpZmljYXRpb24gdGFrZXMgcHJlY2VkZW5jZS4KLQotLlNIIEFVVEhPUlMKLVRoaXMgbWFuIHBhZ2U6IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotPGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0PgotCi1UaGUgY29udHJpYnV0aW5nIGF1dGhvcnMgd291bGQgbGlrZSB0byB0aGFuayBhbGwgdGhvc2Ugd2hvIGhlbHBlZAotd2l0aCB0ZXN0aW5nLCBidWcgZml4ZXMsIGFuZCBwYXRpZW5jZS4gIFRoaXMgd291bGRuJ3QgaGF2ZSBiZWVuCi1wb3NzaWJsZSB3aXRob3V0IGFsbCBvZiB5b3UuCi0KLVRoYW5rcyB0byBGcmFuayBKLiBULiBXb2pjaWsgZm9yIGhlbHBpbmcgd2l0aCB0aGUgZG9jdW1lbnRhdGlvbi4KLQotTGlicG5nIHZlcnNpb24gMS4yLjM3IC0gSnVuZSA0LCAyMDA5OgotSW5pdGlhbGx5IGNyZWF0ZWQgaW4gMTk5NSBieSBHdXkgRXJpYyBTY2hhbG5hdCwgdGhlbiBvZiBHcm91cCA0MiwgSW5jLgotQ3VycmVudGx5IG1haW50YWluZWQgYnkgR2xlbm4gUmFuZGVycy1QZWhyc29uIChnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkuCi0KLVN1cHBvcnRlZCBieSB0aGUgUE5HIGRldmVsb3BtZW50IGdyb3VwCi0uYnIKLXBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNmLm5ldAotKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQKLXBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAoc3Vic2NyaXB0aW9uIHJlcXVpcmVkOyB2aXNpdAotaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vcG5nLW1uZy1pbXBsZW1lbnQKLXRvIHN1YnNjcmliZSkuCi0KLS5TSCBDT1BZUklHSFQgTk9USUNFLCBESVNDTEFJTUVSLCBhbmQgTElDRU5TRToKLQotKFRoaXMgY29weSBvZiB0aGUgbGlicG5nIG5vdGljZXMgaXMgcHJvdmlkZWQgZm9yIHlvdXIgY29udmVuaWVuY2UuICBJbiBjYXNlIG9mCi1hbnkgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIGNvcHkgYW5kIHRoZSBub3RpY2VzIGluIHRoZSBmaWxlIHBuZy5oIHRoYXQgaXMKLWluY2x1ZGVkIGluIHRoZSBsaWJwbmcgZGlzdHJpYnV0aW9uLCB0aGUgbGF0dGVyIHNoYWxsIHByZXZhaWwuKQotCi1JZiB5b3UgbW9kaWZ5IGxpYnBuZyB5b3UgbWF5IGluc2VydCBhZGRpdGlvbmFsIG5vdGljZXMgaW1tZWRpYXRlbHkgZm9sbG93aW5nCi10aGlzIHNlbnRlbmNlLgotCi1saWJwbmcgdmVyc2lvbnMgMS4yLjYsIEF1Z3VzdCAxNSwgMjAwNCwgdGhyb3VnaCAxLjIuMzcsIEp1bmUgNCwgMjAwOSwgYXJlCi1Db3B5cmlnaHQgKGMpIDIwMDQsMjAwNi0yMDA4IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYW5kIGFyZQotZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMi41Ci13aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbCBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9ycwotCi0gICBDb3NtaW4gVHJ1dGEKLQotbGlicG5nIHZlcnNpb25zIDEuMC43LCBKdWx5IDEsIDIwMDAsIHRocm91Z2ggMS4yLjUgLSBPY3RvYmVyIDMsIDIwMDIsIGFyZQotQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhbmQgYXJlCi1kaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMS4wLjYKLXdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9ycwotCi0gICBTaW1vbi1QaWVycmUgQ2FkaWV1eAotICAgRXJpYyBTLiBSYXltb25kCi0gICBHaWxsZXMgVm9sbGFudAotCi1hbmQgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyB0byB0aGUgZGlzY2xhaW1lcjoKLQotICAgVGhlcmUgaXMgbm8gd2FycmFudHkgYWdhaW5zdCBpbnRlcmZlcmVuY2Ugd2l0aCB5b3VyCi0gICBlbmpveW1lbnQgb2YgdGhlIGxpYnJhcnkgb3IgYWdhaW5zdCBpbmZyaW5nZW1lbnQuCi0gICBUaGVyZSBpcyBubyB3YXJyYW50eSB0aGF0IG91ciBlZmZvcnRzIG9yIHRoZSBsaWJyYXJ5Ci0gICB3aWxsIGZ1bGZpbGwgYW55IG9mIHlvdXIgcGFydGljdWxhciBwdXJwb3NlcyBvciBuZWVkcy4KLSAgIFRoaXMgbGlicmFyeSBpcyBwcm92aWRlZCB3aXRoIGFsbCBmYXVsdHMsIGFuZCB0aGUgZW50aXJlCi0gICByaXNrIG9mIHNhdGlzZmFjdG9yeSBxdWFsaXR5LCBwZXJmb3JtYW5jZSwgYWNjdXJhY3ksIGFuZAotICAgZWZmb3J0IGlzIHdpdGggdGhlIHVzZXIuCi0KLWxpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS4wLjYsIE1hcmNoIDIwLCAyMDAwLCBhcmUKLUNvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLURpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0wLjk2LAotd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgotCi0gICBUb20gTGFuZQotICAgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gICBXaWxsZW0gdmFuIFNjaGFpawotCi1saWJwbmcgdmVyc2lvbnMgMC44OSwgSnVuZSAxOTk2LCB0aHJvdWdoIDAuOTYsIE1heSAxOTk3LCBhcmUKLUNvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotRGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTAuODgsCi13aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6Ci0KLSAgIEpvaG4gQm93bGVyCi0gICBLZXZpbiBCcmFjZXkKLSAgIFNhbSBCdXNoZWxsCi0gICBNYWdudXMgSG9sbWdyZW4KLSAgIEdyZWcgUm9lbG9mcwotICAgVG9tIFRhbm5lcgotCi1saWJwbmcgdmVyc2lvbnMgMC41LCBNYXkgMTk5NSwgdGhyb3VnaCAwLjg4LCBKYW51YXJ5IDE5OTYsIGFyZQotQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotCi1Gb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgY29weXJpZ2h0IGFuZCBsaWNlbnNlLCAiQ29udHJpYnV0aW5nIEF1dGhvcnMiCi1pcyBkZWZpbmVkIGFzIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGluZGl2aWR1YWxzOgotCi0gICBBbmRyZWFzIERpbGdlcgotICAgRGF2ZSBNYXJ0aW5kYWxlCi0gICBHdXkgRXJpYyBTY2hhbG5hdAotICAgUGF1bCBTY2htaWR0Ci0gICBUaW0gV2VnbmVyCi0KLVRoZSBQTkcgUmVmZXJlbmNlIExpYnJhcnkgaXMgc3VwcGxpZWQgIkFTIElTIi4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycwotYW5kIEdyb3VwIDQyLCBJbmMuIGRpc2NsYWltIGFsbCB3YXJyYW50aWVzLCBleHByZXNzZWQgb3IgaW1wbGllZCwKLWluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGUgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIG9mCi1maXRuZXNzIGZvciBhbnkgcHVycG9zZS4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4KLWFzc3VtZSBubyBsaWFiaWxpdHkgZm9yIGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKLW9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgd2hpY2ggbWF5IHJlc3VsdCBmcm9tIHRoZSB1c2Ugb2YgdGhlIFBORwotUmVmZXJlbmNlIExpYnJhcnksIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKLXNvdXJjZSBjb2RlLCBvciBwb3J0aW9ucyBoZXJlb2YsIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QKLXRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0xLiBUaGUgb3JpZ2luIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQuCi0KLTIuIEFsdGVyZWQgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoIGFuZAotICAgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvdXJjZS4KLQotMy4gVGhpcyBDb3B5cmlnaHQgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20KLSAgIGFueSBzb3VyY2Ugb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi1UaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYW5kIEdyb3VwIDQyLCBJbmMuIHNwZWNpZmljYWxseSBwZXJtaXQsIHdpdGhvdXQKLWZlZSwgYW5kIGVuY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgc291cmNlIGNvZGUgYXMgYSBjb21wb25lbnQgdG8KLXN1cHBvcnRpbmcgdGhlIFBORyBmaWxlIGZvcm1hdCBpbiBjb21tZXJjaWFsIHByb2R1Y3RzLiAgSWYgeW91IHVzZSB0aGlzCi1zb3VyY2UgY29kZSBpbiBhIHByb2R1Y3QsIGFja25vd2xlZGdtZW50IGlzIG5vdCByZXF1aXJlZCBidXQgd291bGQgYmUKLWFwcHJlY2lhdGVkLgotCi0KLUEgInBuZ19nZXRfY29weXJpZ2h0IiBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIGZvciBjb252ZW5pZW50IHVzZSBpbiAiYWJvdXQiCi1ib3hlcyBhbmQgdGhlIGxpa2U6Ci0KLSAgIHByaW50ZigiJXMiLHBuZ19nZXRfY29weXJpZ2h0KE5VTEwpKTsKLQotQWxzbywgdGhlIFBORyBsb2dvIChpbiBQTkcgZm9ybWF0LCBvZiBjb3Vyc2UpIGlzIHN1cHBsaWVkIGluIHRoZQotZmlsZXMgInBuZ2Jhci5wbmciIGFuZCAicG5nYmFyLmpwZyAoODh4MzEpIGFuZCAicG5nbm93LnBuZyIgKDk4eDMxKS4KLQotTGlicG5nIGlzIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgU29mdHdhcmUuICBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIGlzIGEKLWNlcnRpZmljYXRpb24gbWFyayBvZiB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KLQotR2xlbm4gUmFuZGVycy1QZWhyc29uCi1nbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldAotSnVuZSA0LCAyMDA5Ci0KLS5cIiBlbmQgb2YgbWFuIHBhZ2UKLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvbGlicG5ncGYuMyBiL2xpYnMvbGlicG5nL2xpYnBuZ3BmLjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGUxNDAuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvbGlicG5ncGYuMworKysgL2Rldi9udWxsCkBAIC0xLDc5MCArMCwwIEBACi0uVEggTElCUE5HUEYgMyAiSnVuZSA0LCAyMDA5IgotLlNIIE5BTUUKLWxpYnBuZyBcLSBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFJlZmVyZW5jZSBMaWJyYXJ5IDEuMi4zNwotKHByaXZhdGUgZnVuY3Rpb25zKQotLlNIIFNZTk9QU0lTCi1cZkIjaW5jbHVkZSA8cG5nLmg+XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfYnVpbGRfZ2FtbWFfdGFibGUgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlIChpbnQgXGZQXGZJYml0X2RlcHRoXGZQXGZCLCBwbmdfY29sb3JwIFxmSXBhbGV0dGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2NhbGN1bGF0ZV9jcmMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklwdHJcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19jaGVja19jaHVua19uYW1lIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZJY2h1bmtfbmFtZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCcG5nX3NpemVfdCBwbmdfY2hlY2tfa2V5d29yZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSWtleVxmUFxmQiwgcG5nX2NoYXJwcCBcZkluZXdfa2V5XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19jb21iaW5lX3JvdyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXJvd1xmUFxmQiwgaW50IFxmSW1hc2tcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2NvcnJlY3RfcGFsZXR0ZSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbG9ycCBcZlBcZklwYWxldHRlXGZQXGZCLCBpbnQgXGZJbnVtX3BhbGV0dGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQmludCBwbmdfY3JjX2Vycm9yIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJpbnQgcG5nX2NyY19maW5pc2ggKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSXNraXBcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2NyY19yZWFkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJYnVmXGZQXGZCLCBwbmdfc2l6ZV90IFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19jcmVhdGVfc3RydWN0IChpbnQgXGZJdHlwZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCcG5nX3ZvaWRwIHBuZ19jcmVhdGVfc3RydWN0XzIgKGludCBcZlBcZkl0eXBlXGZQXGZCLCBwbmdfbWFsbG9jX3B0ciBcZlBcZkltYWxsb2NfZm5cZlBcZkIsIHBuZ192b2lkcCBcZkltZW1fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kZWNvbXByZXNzX2NodW5rIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJY29tcF90eXBlXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJY2h1bmtkYXRhXGZQXGZCLCBwbmdfc2l6ZV90IFxmUFxmSWNodW5rbGVuZ3RoXGZQXGZCLCBwbmdfc2l6ZV90IFxmUFxmSXByZWZpeF9sZW5ndGhcZlBcZkIsIHBuZ19zaXplX3QgXGZJKmRhdGFfbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kZXN0cm95X3N0cnVjdCAocG5nX3ZvaWRwIFxmSXN0cnVjdF9wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2Rlc3Ryb3lfc3RydWN0XzIgKHBuZ192b2lkcCBcZlBcZklzdHJ1Y3RfcHRyXGZQXGZCLCBwbmdfZnJlZV9wdHIgXGZQXGZJZnJlZV9mblxmUFxmQiwgcG5nX3ZvaWRwIFxmSW1lbV9wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX2JhY2tncm91bmQgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZQXGZJdHJhbnNfdmFsdWVzXGZQXGZCLCBwbmdfY29sb3JfMTZwIFxmUFxmSWJhY2tncm91bmRcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZQXGZJYmFja2dyb3VuZF8xXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJZ2FtbWFfdGFibGVcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklnYW1tYV9mcm9tXzFcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklnYW1tYV90b18xXGZQXGZCLCBwbmdfdWludF8xNnBwIFxmUFxmSWdhbW1hXzE2XGZQXGZCLCBwbmdfdWludF8xNnBwIFxmUFxmSWdhbW1hXzE2X2Zyb21fMVxmUFxmQiwgcG5nX3VpbnRfMTZwcCBcZlBcZklnYW1tYV8xNl90b18xXGZQXGZCLCBpbnQgXGZJZ2FtbWFfc2hpZnRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX2JnciAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fY2hvcCAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fZGl0aGVyIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcGFsZXR0ZV9sb29rdXBcZlBcZkIsIHBuZ19ieXRlcCBcZklkaXRoZXJfbG9va3VwXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19leHBhbmQgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZJdHJhbnNfdmFsdWVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX2V4cGFuZF9wYWxldHRlIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfY29sb3JwIFxmUFxmSXBhbGV0dGVcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkl0cmFuc1xmUFxmQiwgaW50IFxmSW51bV90cmFuc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fZ2FtbWEgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklnYW1tYV90YWJsZVxmUFxmQiwgcG5nX3VpbnRfMTZwcCBcZlBcZklnYW1tYV8xNl90YWJsZVxmUFxmQiwgaW50IFxmSWdhbW1hX3NoaWZ0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19ncmF5X3RvX3JnYiAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9faW52ZXJ0IChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19wYWNrIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfdWludF8zMiBcZkliaXRfZGVwdGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX3BhY2tzd2FwIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19yZWFkX2ZpbGxlciAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXJvd1xmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZmlsbGVyXGZQXGZCLCBwbmdfdWludF8zMiBcZklmbGFnc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fcmVhZF9pbnRlcmxhY2UgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklyb3dcZlBcZkIsIGludCBcZlBcZklwYXNzXGZQXGZCLCBwbmdfdWludF8zMiBcZkl0cmFuc2Zvcm1hdGlvbnNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX3JlYWRfaW52ZXJ0X2FscGhhIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19yZWFkX3N3YXBfYWxwaGEgKHBuZ19yb3dfaW5mb3AgXGZQXGZJcm93X2luZm9cZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJpbnQgcG5nX2RvX3JnYl90b19ncmF5IChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb19zaGlmdCAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXJvd1xmUFxmQiwgcG5nX2NvbG9yXzhwIFxmSWJpdF9kZXB0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fc3RyaXBfZmlsbGVyIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfdWludF8zMiBcZklmbGFnc1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fc3dhcCAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fdW5wYWNrIChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZJcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19kb191bnNoaWZ0IChwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfY29sb3JfOHAgXGZJc2lnX2JpdHNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX3dyaXRlX2ludGVybGFjZSAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSXJvd1xmUFxmQiwgaW50IFxmSXBhc3NcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2RvX3dyaXRlX2ludmVydF9hbHBoYSAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fd3JpdGVfc3dhcF9hbHBoYSAocG5nX3Jvd19pbmZvcCBcZlBcZklyb3dfaW5mb1xmUFxmQiwgcG5nX2J5dGVwIFxmSXJvd1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfZG9fd3JpdGVfdHJhbnNmb3JtYXRpb25zIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkICpwbmdfZmFyX3RvX25lYXIgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIscG5nX3ZvaWRwIFxmUFxmSXB0clxmUFxmQiwgaW50IFxmSWNoZWNrXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19mbHVzaCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX2JLR0QgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfY0hSTSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV9nQU1BIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX2hJU1QgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfSUVORCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV9JSERSIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX2lDQ1AgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfaVRYdCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV9vRkZzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX3BDQUwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfcEhZcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV9QTFRFIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX3NCSVQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfc0NBTCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV9zUExUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX3NSR0IgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfdEVYdCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV90SU1FIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaGFuZGxlX3RSTlMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19oYW5kbGVfdW5rbm93biAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2hhbmRsZV96VFh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfaW5mb19kZXN0cm95IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX2luaXRfbW14X2ZsYWdzIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19pbml0X3JlYWRfdHJhbnNmb3JtYXRpb25zIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19wcm9jZXNzX0lEQVRfZGF0YSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWJ1ZmZlclxmUFxmQiwgcG5nX3NpemVfdCBcZklidWZmZXJfbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19wcm9jZXNzX3NvbWVfZGF0YSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19wdXNoX2NoZWNrX2NyYyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9jcmNfZmluaXNoIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19wdXNoX2NyY19za2lwIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfZmlsbF9idWZmZXIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklidWZmZXJcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19wdXNoX2hhbmRsZV90RVh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9oYW5kbGVfdW5rbm93biAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfaGFuZGxlX3pUWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19wdXNoX2hhdmVfZW5kIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfaGF2ZV9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfaGF2ZV9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfcHJvY2Vzc19yb3cgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfcmVhZF9jaHVuayAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19wdXNoX3JlYWRfZW5kIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfcmVhZF9JREFUIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19wdXNoX3JlYWRfc2lnIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfcmVhZF90RVh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfcmVhZF96VFh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3B1c2hfcmVzdG9yZV9idWZmZXIgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklidWZmZXJcZlBcZkIsIHBuZ19zaXplX3QgXGZJYnVmZmVyX2xlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcHVzaF9zYXZlX2J1ZmZlciAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCcG5nX3VpbnRfMzIgcG5nX3JlYWRfY2h1bmtfaGVhZGVyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX2RhdGEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklkYXRhXGZQXGZCLCBwbmdfc2l6ZV90IFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcmVhZF9maWx0ZXJfcm93IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfcm93X2luZm9wIFxmUFxmSXJvd19pbmZvXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcHJldl9yb3dcZlBcZkIsIGludCBcZklmaWx0ZXJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3JlYWRfZmluaXNoX3JvdyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3JlYWRfc3RhcnRfcm93IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ19yZWFkX3RyYW5zZm9ybV9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3Jlc2V0X2NyYyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCaW50IHBuZ19zZXRfdGV4dF8yIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ190ZXh0cCBcZlBcZkl0ZXh0X3B0clxmUFxmQiwgaW50IFxmSW51bV90ZXh0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9jSFJNIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBkb3VibGUgXGZQXGZJd2hpdGVfeFxmUFxmQiwgZG91YmxlIFxmUFxmSXdoaXRlX3lcZlBcZkIsIGRvdWJsZSBcZlBcZklyZWRfeFxmUFxmQiwgZG91YmxlIFxmUFxmSXJlZF95XGZQXGZCLCBkb3VibGUgXGZQXGZJZ3JlZW5feFxmUFxmQiwgZG91YmxlIFxmUFxmSWdyZWVuX3lcZlBcZkIsIGRvdWJsZSBcZlBcZklibHVlX3hcZlBcZkIsIGRvdWJsZSBcZklibHVlX3lcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2NIUk1fZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdoaXRlX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXdoaXRlX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXJlZF94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklyZWRfeVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZ3JlZW5feFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZ3JlZW5feVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJYmx1ZV94XGZQXGZCLCBwbmdfdWludF8zMiBcZklibHVlX3lcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2RhdGEgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklkYXRhXGZQXGZCLCBwbmdfc2l6ZV90IFxmSWxlbmd0aFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfZmlsdGVyZWRfcm93IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZJZmlsdGVyZWRfcm93XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9maW5kX2ZpbHRlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3Jvd19pbmZvcCBcZklyb3dfaW5mb1xmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfZmluaXNoX3JvdyAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfZ0FNQSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgZG91YmxlIFxmSWZpbGVfZ2FtbWFcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2dBTUFfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWludF9maWxlX2dhbW1hXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9oSVNUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8xNnAgXGZQXGZJaGlzdFxmUFxmQiwgaW50IFxmSW51bV9oaXN0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9pQ0NQIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJbmFtZVxmUFxmQiwgaW50IFxmUFxmSWNvbXByZXNzaW9uX3R5cGVcZlBcZkIsIHBuZ19jaGFycCBcZlBcZklwcm9maWxlXGZQXGZCLCBpbnQgXGZJcHJvZmxlblxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfSURBVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWRhdGFcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9JRU5EIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9JSERSIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl3aWR0aFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJaGVpZ2h0XGZQXGZCLCBpbnQgXGZQXGZJYml0X2RlcHRoXGZQXGZCLCBpbnQgXGZQXGZJY29sb3JfdHlwZVxmUFxmQiwgaW50IFxmUFxmSWNvbXByZXNzaW9uX3R5cGVcZlBcZkIsIGludCBcZlBcZklmaWx0ZXJfdHlwZVxmUFxmQiwgaW50IFxmSWludGVybGFjZV90eXBlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9pVFh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJY29tcHJlc3Npb25cZlBcZkIsIHBuZ19jaGFycCBcZlBcZklrZXlcZlBcZkIsIHBuZ19jaGFycCBcZlBcZklsYW5nXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJdHJhbnNsYXRlZF9rZXlcZlBcZkIsIHBuZ19jaGFycCBcZkl0ZXh0XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9vRkZzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl4X29mZnNldFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJeV9vZmZzZXRcZlBcZkIsIGludCBcZkl1bml0X3R5cGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3BDQUwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZklwdXJwb3NlXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSVgwXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSVgxXGZQXGZCLCBpbnQgXGZQXGZJdHlwZVxmUFxmQiwgaW50IFxmUFxmSW5wYXJhbXNcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl1bml0c1xmUFxmQiwgcG5nX2NoYXJwcCBcZklwYXJhbXNcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3BIWXMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXhfcGl4ZWxzX3Blcl91bml0XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl5X3BpeGVsc19wZXJfdW5pdFxmUFxmQiwgaW50IFxmSXVuaXRfdHlwZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfUExURSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbG9ycCBcZlBcZklwYWxldHRlXGZQXGZCLCBwbmdfdWludF8zMiBcZkludW1fcGFsXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9zQklUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29sb3JfOHAgXGZQXGZJc2JpdFxmUFxmQiwgaW50IFxmSWNvbG9yX3R5cGVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3NDQUwgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl1bml0XGZQXGZCLCBkb3VibGUgXGZQXGZJd2lkdGhcZlBcZkIsIGRvdWJsZSBcZkloZWlnaHRcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3NDQUxfcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXVuaXRcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl3aWR0aFxmUFxmQiwgcG5nX2NoYXJwIFxmSWhlaWdodFxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfd3JpdGVfc2lnIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9zUkdCIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJaW50ZW50XGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9zUExUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfc3BhbGV0dGVfcCBcZklwYWxldHRlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV9zdGFydF9yb3cgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3RFWHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZklrZXlcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkl0ZXh0XGZQXGZCLCBwbmdfc2l6ZV90IFxmSXRleHRfbGVuXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV90SU1FIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdGltZXAgXGZJbW9kX3RpbWVcZlBcZkIpO1xmUAotCi1cZklcZkIKLQotXGZJXGZCCi0KLVxmQnZvaWQgcG5nX3dyaXRlX3RSTlMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkl0cmFuc1xmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZlBcZkl2YWx1ZXNcZlBcZkIsIGludCBcZlBcZkludW1iZXJcZlBcZkIsIGludCBcZkljb2xvcl90eXBlXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkIHBuZ193cml0ZV96VFh0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJa2V5XGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJdGV4dFxmUFxmQiwgcG5nX3NpemVfdCBcZlBcZkl0ZXh0X2xlblxmUFxmQiwgaW50IFxmSWNvbXByZXNzaW9uXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi1cZkJ2b2lkcGYgcG5nX3phbGxvYyAodm9pZHBmIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHVJbnQgXGZQXGZJaXRlbXNcZlBcZkIsIHVJbnQgXGZJc2l6ZVxmUFxmQik7XGZQCi0KLVxmSVxmQgotCi1cZklcZkIKLQotXGZCdm9pZCBwbmdfemZyZWUgKHZvaWRwZiBcZlBcZklwbmdfcHRyXGZQXGZCLCB2b2lkcGYgXGZJcHRyXGZQXGZCKTtcZlAKLQotXGZJXGZCCi0KLVxmSVxmQgotCi0uU0ggREVTQ1JJUFRJT04KLVRoZSBmdW5jdGlvbnMgbGlzdGVkIGFib3ZlIGFyZSB1c2VkIHByaXZhdGVseSBieSBsaWJwbmcKLWFuZCBhcmUgbm90IHJlY29tbWVuZGVkIGZvciB1c2UgYnkgYXBwbGljYXRpb25zLiAgVGhleSBhcmUKLW5vdCAiZXhwb3J0ZWQiIHRvIGFwcGxpY2F0aW9ucyB1c2luZyBzaGFyZWQgbGlicmFyaWVzLiAgVGhleQotYXJlIGxpc3RlZCBhbHBoYWJldGljYWxseSBoZXJlIGFzIGFuIGFpZCB0byBsaWJwbmcgbWFpbnRhaW5lcnMuCi1TZWUgcG5nLmggZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgZnVuY3Rpb25zLgotCi0uU0ggU0VFIEFMU08KLS5JUiBsaWJwbmcoMykgIiwgIiBwbmcoNSkKLS5TSCBBVVRIT1IKLUdsZW5uIFJhbmRlcnMtUGVocnNvbgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvbHRtYWluLnNoIGIvbGlicy9saWJwbmcvbHRtYWluLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWU0MzQzLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL2x0bWFpbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDc4NzYgKzAsMCBAQAotIyBHZW5lcmF0ZWQgZnJvbSBsdG1haW4ubTRzaC4KLQotIyBsdG1haW4uc2ggKEdOVSBsaWJ0b29sIDEuMjk3MSAyMDA4LTA0LTI5KSAyLjIuM2EKLSMgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLSMgd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSMgR05VIExpYnRvb2wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAotIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKLSMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0jCi0jIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQotIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwKLSMgb3Igb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLQotIyBVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KLSMKLSMgUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jCi0jICAgICAtLWNvbmZpZyAgICAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcwotIyAgICAgLS1kZWJ1ZyAgICAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZwotIyAtbiwgLS1kcnktcnVuICAgICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKLSMgICAgIC0tZmVhdHVyZXMgICAgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotIyAgICAgLS1tb2RlPU1PREUgICAgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUKLSMgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMgIGRvbid0IHJlbW92ZSBkdXBsaWNhdGUgZGVwZW5kZW5jeSBsaWJyYXJpZXMKLSMgICAgIC0tcXVpZXQsIC0tc2lsZW50ICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSMgICAgIC0tdGFnPVRBRyAgICAgICAgICAgIHVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIHRhZyBUQUcKLSMgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgKGRlZmF1bHQpCi0jICAgICAtLXZlcnNpb24gICAgICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCi0jIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBwcmludCBzaG9ydCBvciBsb25nIGhlbHAgbWVzc2FnZQotIwotIyBNT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0jCi0jICAgICAgIGNsZWFuICAgICAgICAgICAgICByZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5Ci0jICAgICAgIGNvbXBpbGUgICAgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0Ci0jICAgICAgIGV4ZWN1dGUgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQotIyAgICAgICBmaW5pc2ggICAgICAgICAgICAgY29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcwotIyAgICAgICBpbnN0YWxsICAgICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKLSMgICAgICAgbGluayAgICAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQotIyAgICAgICB1bmluc3RhbGwgICAgICAgICAgcmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxlZCBkaXJlY3RvcnkKLSMKLSMgTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLgotIyBUcnkgYCRwcm9nbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4KLSMKLSMgV2hlbiByZXBvcnRpbmcgYSBidWcsIHBsZWFzZSBkZXNjcmliZSBhIHRlc3QgY2FzZSB0byByZXByb2R1Y2UgaXQgYW5kCi0jIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLSMKLSMgICAgICAgaG9zdC10cmlwbGV0OgkkaG9zdAotIyAgICAgICBzaGVsbDoJCSRTSEVMTAotIyAgICAgICBjb21waWxlcjoJCSRMVENDCi0jICAgICAgIGNvbXBpbGVyIGZsYWdzOgkJJExUQ0ZMQUdTCi0jICAgICAgIGxpbmtlcjoJCSRMRCAoZ251PyAkd2l0aF9nbnVfbGQpCi0jICAgICAgICRwcm9nbmFtZToJCShHTlUgbGlidG9vbCAxLjI5NzEgMjAwOC0wNC0yOSkgMi4yLjNhCi0jICAgICAgIGF1dG9tYWtlOgkJJGF1dG9tYWtlX3ZlcnNpb24KLSMgICAgICAgYXV0b2NvbmY6CQkkYXV0b2NvbmZfdmVyc2lvbgotIwotIyBSZXBvcnQgYnVncyB0byA8YnVnLWxpYnRvb2xAZ251Lm9yZz4uCi0KLVBST0dSQU09bHRtYWluLnNoCi1QQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049Mi4yLjNhCi1USU1FU1RBTVA9IiAxLjI5NzEgMjAwOC0wNC0yOSIKLXBhY2thZ2VfcmV2aXNpb249MS4yOTcxCi0KLSMgQmUgQm91cm5lIGNvbXBhdGlibGUKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gKnBvc2l4Kikgc2V0IC1vIHBvc2l4OzsgZXNhYwotZmkKLUJJTl9TSD14cGc0OyBleHBvcnQgQklOX1NIICMgZm9yIFRydTY0Ci1EVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCi0KLSMgTkxTIG51aXNhbmNlczogV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCi0jIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgotIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKLSMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLWx0X3VzZXJfbG9jYWxlPQotbHRfc2FmZV9sb2NhbGU9Ci1mb3IgbHRfdmFyIGluIExBTkcgTEFOR1VBR0UgTENfQUxMIExDX0NUWVBFIExDX0NPTExBVEUgTENfTUVTU0FHRVMKLWRvCi0gIGV2YWwgImlmIHRlc3QgXCJcJHskbHRfdmFyK3NldH1cIiA9IHNldDsgdGhlbgotICAgICAgICAgIHNhdmVfJGx0X3Zhcj1cJCRsdF92YXIKLSAgICAgICAgICAkbHRfdmFyPUMKLQkgIGV4cG9ydCAkbHRfdmFyCi0JICBsdF91c2VyX2xvY2FsZT1cIiRsdF92YXI9XFxcJHNhdmVfXCRsdF92YXI7IFwkbHRfdXNlcl9sb2NhbGVcIgotCSAgbHRfc2FmZV9sb2NhbGU9XCIkbHRfdmFyPUM7IFwkbHRfc2FmZV9sb2NhbGVcIgotCWZpIgotZG9uZQotCi0kbHRfdW5zZXQgQ0RQQVRICi0KLQotCi0KLQotOiAke0NQPSJjcCAtZiJ9Ci06ICR7RUNITz0iZWNobyJ9Ci06ICR7RUdSRVA9Ii91c3Ivc2Z3L2Jpbi9nZ3JlcCAtRSJ9Ci06ICR7RkdSRVA9Ii91c3Ivc2Z3L2Jpbi9nZ3JlcCAtRiJ9Ci06ICR7R1JFUD0iL3Vzci9zZncvYmluL2dncmVwIn0KLTogJHtMTl9TPSJsbiAtcyJ9Ci06ICR7TUFLRT0ibWFrZSJ9Ci06ICR7TUtESVI9Im1rZGlyIn0KLTogJHtNVj0ibXYgLWYifQotOiAke1JNPSJybSAtZiJ9Ci06ICR7U0VEPSIvdXNyL2xvY2FsL2Jpbi9zZWQifQotOiAke1NIRUxMPSIke0NPTkZJR19TSEVMTC0vYmluL3NofSJ9Ci06ICR7WHNlZD0iJFNFRCAtZSAxcy9eWC8vIn0KLQotIyBHbG9iYWwgdmFyaWFibGVzOgotRVhJVF9TVUNDRVNTPTAKLUVYSVRfRkFJTFVSRT0xCi1FWElUX01JU01BVENIPTYzICAjICQ/ID0gNjMgaXMgdXNlZCB0byBpbmRpY2F0ZSB2ZXJzaW9uIG1pc21hdGNoIHRvIG1pc3NpbmcuCi1FWElUX1NLSVA9NzcJICAjICQ/ID0gNzcgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIHNraXBwZWQgdGVzdCB0byBhdXRvbWFrZS4KLQotZXhpdF9zdGF0dXM9JEVYSVRfU1VDQ0VTUwotCi0jIE1ha2Ugc3VyZSBJRlMgaGFzIGEgc2Vuc2libGUgZGVmYXVsdAotbHRfbmw9JwotJwotSUZTPSIgCSRsdF9ubCIKLQotZGlybmFtZT0icywvW14vXSokLCwiCi1iYXNlbmFtZT0icyxeLiovLCwiCi0KLSMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKLSMgcGVyZm9ybSBmdW5jX2Jhc2VuYW1lIGFuZCBmdW5jX2Rpcm5hbWUgaW4gYSBzaW5nbGUgZnVuY3Rpb24KLSMgY2FsbDoKLSMgICBkaXJuYW1lOiAgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksCi0jICAgICAgICAgICAgIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwgb3RoZXJ3aXNlIHNldCByZXN1bHQKLSMgICAgICAgICAgICAgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgotIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfZGlybmFtZV9yZXN1bHQiCi0jICAgYmFzZW5hbWU6IENvbXB1dGUgZmlsZW5hbWUgb2YgRklMRS4KLSMgICAgICAgICAgICAgdmFsdWUgcmV0dW5lZCBpbiAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotIyBJbXBsZW1lbnRhdGlvbiBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggZnVuY19kaXJuYW1lCi0jIGFuZCBmdW5jX2Jhc2VuYW1lLiBGb3IgZWZmaWNpZW5jeSwgd2UgZG8gbm90IGRlbGVnYXRlIHRvCi0jIHRob3NlIGZ1bmN0aW9ucyBidXQgaW5zdGVhZCBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgaGVyZS4KLWZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgKCkKLXsKLSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KLSAgZnVuY19kaXJuYW1lX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkZGlybmFtZSJgCi0gIGlmIHRlc3QgIlgkZnVuY19kaXJuYW1lX3Jlc3VsdCIgPSAiWCR7MX0iOyB0aGVuCi0gICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIKLSAgZWxzZQotICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JHsyfSIKLSAgZmkKLSAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKLX0KLQotIyBHZW5lcmF0ZWQgc2hlbGwgZnVuY3Rpb25zIGluc2VydGVkIGhlcmUuCi0KLSMgV29yayBhcm91bmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZSBvbiBJUklYIDYuNS4gT24gSVJJWCA2LjQrLCBzaAotIyBpcyBrc2ggYnV0IHdoZW4gdGhlIHNoZWxsIGlzIGludm9rZWQgYXMgInNoIiBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YKLSMgdGhlIF9YUEcgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGVxdWFsIHRvIDEgKG9uZSksIHRoZSBzcGVjaWFsCi0jIHBvc2l0aW9uYWwgcGFyYW1ldGVyICQwLCB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsLCBpcyB0aGUgbmFtZSBvZiB0aGUKLSMgZnVuY3Rpb24uCi1wcm9ncGF0aD0iJDAiCi0KLSMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtOgotIyBJbiB0aGUgdW5saWtlbHkgZXZlbnQgJHByb2duYW1lIGJlZ2FuIHdpdGggYSAnLScsIGl0IHdvdWxkIHBsYXkgaGF2b2Mgd2l0aAotIyBmdW5jX2VjaG8gKGltYWdpbmUgcHJvZ25hbWU9LW4pLCBzbyB3ZSBwcmVwZW5kIC4vIGluIHRoYXQgY2FzZToKLWZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRwcm9ncGF0aCIKLXByb2duYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAotY2FzZSAkcHJvZ25hbWUgaW4KLSAgLSopIHByb2duYW1lPS4vJHByb2duYW1lIDs7Ci1lc2FjCi0KLSMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gYWJzb2x1dGUgcGF0aCBmb3IgcmVleGVjdXRpb246Ci1jYXNlICRwcm9ncGF0aCBpbgotICBbXFwvXSp8W0EtWmEtel06XFwqKSA7OwotICAqW1xcL10qKQotICAgICBwcm9nZGlyPSRmdW5jX2Rpcm5hbWVfcmVzdWx0Ci0gICAgIHByb2dkaXI9YGNkICIkcHJvZ2RpciIgJiYgcHdkYAotICAgICBwcm9ncGF0aD0iJHByb2dkaXIvJHByb2duYW1lIgotICAgICA7OwotICAqKQotICAgICBzYXZlX0lGUz0iJElGUyIKLSAgICAgSUZTPToKLSAgICAgZm9yIHByb2dkaXIgaW4gJFBBVEg7IGRvCi0gICAgICAgSUZTPSIkc2F2ZV9JRlMiCi0gICAgICAgdGVzdCAteCAiJHByb2dkaXIvJHByb2duYW1lIiAmJiBicmVhawotICAgICBkb25lCi0gICAgIElGUz0iJHNhdmVfSUZTIgotICAgICB0ZXN0IC1uICIkcHJvZ2RpciIgfHwgcHJvZ2Rpcj1gcHdkYAotICAgICBwcm9ncGF0aD0iJHByb2dkaXIvJHByb2duYW1lIgotICAgICA7OwotZXNhYwotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0iJHtTRUR9IicgLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtgIiRcXF1cKS9cXFwxL2cnCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgotZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woWyJgXFxdXCkvXFxcMS9nJwotCi0jIFJlLWBcJyBwYXJhbWV0ZXIgZXhwYW5zaW9ucyBpbiBvdXRwdXQgb2YgZG91YmxlX3F1b3RlX3N1YnN0IHRoYXQgd2VyZQotIyBgXCctZWQgaW4gaW5wdXQgdG8gdGhlIHNhbWUuICBJZiBhbiBvZGQgbnVtYmVyIG9mIGBcJyBwcmVjZWRlZCBhICckJwotIyBpbiBpbnB1dCB0byBkb3VibGVfcXVvdGVfc3Vic3QsIHRoYXQgJyQnIHdhcyBwcm90ZWN0ZWQgZnJvbSBleHBhbnNpb24uCi0jIFNpbmNlIGVhY2ggaW5wdXQgYFwnIGlzIG5vdyB0d28gYFwncywgbG9vayBmb3IgYW55IG51bWJlciBvZiBydW5zIG9mCi0jIGZvdXIgYFwncyBmb2xsb3dlZCBieSB0d28gYFwncyBhbmQgdGhlbiBhICckJy4gIGBcJyB0aGF0ICckJy4KLWJzPSdcXCcKLWJzMj0nXFxcXCcKLWJzND0nXFxcXFxcXFwnCi1kb2xsYXI9J1wkJwotc2VkX2RvdWJsZV9iYWNrc2xhc2g9IlwKLSAgcy8kYnM0LyZcXAotL2cKLSAgcy9eJGJzMiRkb2xsYXIvJGJzJi8KLSAgcy9cXChbXiRic11cXCkkYnMyJGRvbGxhci9cXDEkYnMyJGJzJGRvbGxhci9nCi0gIHMvXG4vL2ciCi0KLSMgU3RhbmRhcmQgb3B0aW9uczoKLW9wdF9kcnlfcnVuPWZhbHNlCi1vcHRfaGVscD1mYWxzZQotb3B0X3F1aWV0PWZhbHNlCi1vcHRfdmVyYm9zZT1mYWxzZQotb3B0X3dhcm5pbmc9OgotCi0jIGZ1bmNfZWNobyBhcmcuLi4KLSMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSwgYWxvbmcgd2l0aCB0aGUgY3VycmVudCBtb2RlCi0jIG5hbWUgaWYgaXQgaGFzIGJlZW4gc2V0IHlldC4KLWZ1bmNfZWNobyAoKQotewotICAgICRFQ0hPICIkcHJvZ25hbWUke21vZGUrOiB9JG1vZGU6ICQqIgotfQotCi0jIGZ1bmNfdmVyYm9zZSBhcmcuLi4KLSMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSBpbiB2ZXJib3NlIG1vZGUgb25seS4KLWZ1bmNfdmVyYm9zZSAoKQotewotICAgICRvcHRfdmVyYm9zZSAmJiBmdW5jX2VjaG8gJHsxKyIkQCJ9Ci0KLSAgICAjIEEgYnVnIGluIGJhc2ggaGFsdHMgdGhlIHNjcmlwdCBpZiB0aGUgbGFzdCBsaW5lIG9mIGEgZnVuY3Rpb24KLSAgICAjIGZhaWxzIHdoZW4gc2V0IC1lIGlzIGluIGZvcmNlLCBzbyB3ZSBuZWVkIGFub3RoZXIgY29tbWFuZCB0bwotICAgICMgd29yayBhcm91bmQgdGhhdDoKLSAgICA6Ci19Ci0KLSMgZnVuY19lcnJvciBhcmcuLi4KLSMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KLWZ1bmNfZXJyb3IgKCkKLXsKLSAgICAkRUNITyAiJHByb2duYW1lJHttb2RlKzogfSRtb2RlOiAiJHsxKyIkQCJ9IDE+JjIKLX0KLQotIyBmdW5jX3dhcm5pbmcgYXJnLi4uCi0jIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIHdhcm5pbmcgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KLWZ1bmNfd2FybmluZyAoKQotewotICAgICRvcHRfd2FybmluZyAmJiAkRUNITyAiJHByb2duYW1lJHttb2RlKzogfSRtb2RlOiB3YXJuaW5nOiAiJHsxKyIkQCJ9IDE+JjIKLQotICAgICMgYmFzaCBidWcgYWdhaW46Ci0gICAgOgotfQotCi0jIGZ1bmNfZmF0YWxfZXJyb3IgYXJnLi4uCi0jIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGFuZCBleGl0LgotZnVuY19mYXRhbF9lcnJvciAoKQotewotICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9Ci0gICAgZXhpdCAkRVhJVF9GQUlMVVJFCi19Ci0KLSMgZnVuY19mYXRhbF9oZWxwIGFyZy4uLgotIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBmb2xsb3dlZCBieQotIyBhIGhlbHAgaGludCwgYW5kIGV4aXQuCi1mdW5jX2ZhdGFsX2hlbHAgKCkKLXsKLSAgICBmdW5jX2Vycm9yICR7MSsiJEAifQotICAgIGZ1bmNfZmF0YWxfZXJyb3IgIiRoZWxwIgotfQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAgIyMgZGVmYXVsdAotCi0KLSMgZnVuY19ncmVwIGV4cHJlc3Npb24gZmlsZW5hbWUKLSMgQ2hlY2sgd2hldGhlciBFWFBSRVNTSU9OIG1hdGNoZXMgYW55IGxpbmUgb2YgRklMRU5BTUUsIHdpdGhvdXQgb3V0cHV0LgotZnVuY19ncmVwICgpCi17Ci0gICAgJEdSRVAgIiQxIiAiJDIiID4vZGV2L251bGwgMj4mMQotfQotCi0KLSMgZnVuY19ta2Rpcl9wIGRpcmVjdG9yeS1wYXRoCi0jIE1ha2Ugc3VyZSB0aGUgZW50aXJlIHBhdGggdG8gRElSRUNUT1JZLVBBVEggaXMgYXZhaWxhYmxlLgotZnVuY19ta2Rpcl9wICgpCi17Ci0gICAgbXlfZGlyZWN0b3J5X3BhdGg9IiQxIgotICAgIG15X2Rpcl9saXN0PQotCi0gICAgaWYgdGVzdCAtbiAiJG15X2RpcmVjdG9yeV9wYXRoIiAmJiB0ZXN0ICIkb3B0X2RyeV9ydW4iICE9ICI6IjsgdGhlbgotCi0gICAgICAjIFByb3RlY3QgZGlyZWN0b3J5IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nCi0gICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbgotICAgICAgICAtKikgbXlfZGlyZWN0b3J5X3BhdGg9Ii4vJG15X2RpcmVjdG9yeV9wYXRoIiA7OwotICAgICAgZXNhYwotCi0gICAgICAjIFdoaWxlIHNvbWUgcG9ydGlvbiBvZiBESVIgZG9lcyBub3QgeWV0IGV4aXN0Li4uCi0gICAgICB3aGlsZSB0ZXN0ICEgLWQgIiRteV9kaXJlY3RvcnlfcGF0aCI7IGRvCi0gICAgICAgICMgLi4ubWFrZSBhIGxpc3QgaW4gdG9wbW9zdCBmaXJzdCBvcmRlci4gIFVzZSBhIGNvbG9uIGRlbGltaXRlZAotCSMgbGlzdCBpbmNhc2Ugc29tZSBwb3J0aW9uIG9mIHBhdGggY29udGFpbnMgd2hpdGVzcGFjZS4KLSAgICAgICAgbXlfZGlyX2xpc3Q9IiRteV9kaXJlY3RvcnlfcGF0aDokbXlfZGlyX2xpc3QiCi0KLSAgICAgICAgIyBJZiB0aGUgbGFzdCBwb3J0aW9uIGFkZGVkIGhhcyBubyBzbGFzaCBpbiBpdCwgdGhlIGxpc3QgaXMgZG9uZQotICAgICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbiAqLyopIDs7ICopIGJyZWFrIDs7IGVzYWMKLQotICAgICAgICAjIC4uLm90aGVyd2lzZSB0aHJvdyBhd2F5IHRoZSBjaGlsZCBkaXJlY3RvcnkgYW5kIGxvb3AKLSAgICAgICAgbXlfZGlyZWN0b3J5X3BhdGg9YCRFQ0hPICJYJG15X2RpcmVjdG9yeV9wYXRoIiB8ICRYc2VkIC1lICIkZGlybmFtZSJgCi0gICAgICBkb25lCi0gICAgICBteV9kaXJfbGlzdD1gJEVDSE8gIlgkbXlfZGlyX2xpc3QiIHwgJFhzZWQgLWUgJ3MsOiokLCwnYAotCi0gICAgICBzYXZlX21rZGlyX3BfSUZTPSIkSUZTIjsgSUZTPSc6JwotICAgICAgZm9yIG15X2RpciBpbiAkbXlfZGlyX2xpc3Q7IGRvCi0JSUZTPSIkc2F2ZV9ta2Rpcl9wX0lGUyIKLSAgICAgICAgIyBta2RpciBjYW4gZmFpbCB3aXRoIGEgYEZpbGUgZXhpc3QnIGVycm9yIGlmIHR3byBwcm9jZXNzZXMKLSAgICAgICAgIyB0cnkgdG8gY3JlYXRlIG9uZSBvZiB0aGUgZGlyZWN0b3JpZXMgY29uY3VycmVudGx5LiAgRG9uJ3QKLSAgICAgICAgIyBzdG9wIGluIHRoYXQgY2FzZSEKLSAgICAgICAgJE1LRElSICIkbXlfZGlyIiAyPi9kZXYvbnVsbCB8fCA6Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX21rZGlyX3BfSUZTIgotCi0gICAgICAjIEJhaWwgb3V0IGlmIHdlIChvciBzb21lIG90aGVyIHByb2Nlc3MpIGZhaWxlZCB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0gICAgICB0ZXN0IC1kICIkbXlfZGlyZWN0b3J5X3BhdGgiIHx8IFwKLSAgICAgICAgZnVuY19mYXRhbF9lcnJvciAiRmFpbGVkIHRvIGNyZWF0ZSBcYCQxJyIKLSAgICBmaQotfQotCi0KLSMgZnVuY19ta3RlbXBkaXIgW3N0cmluZ10KLSMgTWFrZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3b24ndCBjbGFzaCB3aXRoIG90aGVyIHJ1bm5pbmcKLSMgbGlidG9vbCBwcm9jZXNzZXMsIGFuZCBhdm9pZHMgcmFjZSBjb25kaXRpb25zIGlmIHBvc3NpYmxlLiAgSWYKLSMgZ2l2ZW4sIFNUUklORyBpcyB0aGUgYmFzZW5hbWUgZm9yIHRoYXQgZGlyZWN0b3J5LgotZnVuY19ta3RlbXBkaXIgKCkKLXsKLSAgICBteV90ZW1wbGF0ZT0iJHtUTVBESVItL3RtcH0vJHsxLSRwcm9nbmFtZX0iCi0KLSAgICBpZiB0ZXN0ICIkb3B0X2RyeV9ydW4iID0gIjoiOyB0aGVuCi0gICAgICAjIFJldHVybiBhIGRpcmVjdG9yeSBuYW1lLCBidXQgZG9uJ3QgY3JlYXRlIGl0IGluIGRyeS1ydW4gbW9kZQotICAgICAgbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0kJCIKLSAgICBlbHNlCi0KLSAgICAgICMgSWYgbWt0ZW1wIHdvcmtzLCB1c2UgdGhhdCBmaXJzdCBhbmQgZm9yZW1vc3QKLSAgICAgIG15X3RtcGRpcj1gbWt0ZW1wIC1kICIke215X3RlbXBsYXRlfS1YWFhYWFhYWCIgMj4vZGV2L251bGxgCi0KLSAgICAgIGlmIHRlc3QgISAtZCAiJG15X3RtcGRpciI7IHRoZW4KLSAgICAgICAgIyBGYWlsaW5nIHRoYXQsIGF0IGxlYXN0IHRyeSBhbmQgdXNlICRSQU5ET00gdG8gYXZvaWQgYSByYWNlCi0gICAgICAgIG15X3RtcGRpcj0iJHtteV90ZW1wbGF0ZX0tJHtSQU5ET00tMH0kJCIKLQotICAgICAgICBzYXZlX21rdGVtcGRpcl91bWFzaz1gdW1hc2tgCi0gICAgICAgIHVtYXNrIDAwNzcKLSAgICAgICAgJE1LRElSICIkbXlfdG1wZGlyIgotICAgICAgICB1bWFzayAkc2F2ZV9ta3RlbXBkaXJfdW1hc2sKLSAgICAgIGZpCi0KLSAgICAgICMgSWYgd2UncmUgbm90IGluIGRyeS1ydW4gbW9kZSwgYm9tYiBvdXQgb24gZmFpbHVyZQotICAgICAgdGVzdCAtZCAiJG15X3RtcGRpciIgfHwgXAotICAgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgXGAkbXlfdG1wZGlyJyIKLSAgICBmaQotCi0gICAgJEVDSE8gIlgkbXlfdG1wZGlyIiB8ICRYc2VkCi19Ci0KLQotIyBmdW5jX3F1b3RlX2Zvcl9ldmFsIGFyZwotIyBBZXN0aGV0aWNhbGx5IHF1b3RlIEFSRyB0byBiZSBldmFsZWQgbGF0ZXIuCi0jIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gdmFsdWVzOiBGVU5DX1FVT1RFX0ZPUl9FVkFMX1JFU1VMVAotIyBpcyBkb3VibGUtcXVvdGVkLCBzdWl0YWJsZSBmb3IgYSBzdWJzZXF1ZW50IGV2YWwsIHdoZXJlYXMKLSMgRlVOQ19RVU9URV9GT1JfRVZBTF9VTlFVT1RFRF9SRVNVTFQgaGFzIG1lcmVseSBhbGwgY2hhcmFjdGVycwotIyB3aGljaCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUgcXVvdGVzIGJhY2tzbGFzaGlmaWVkLgotZnVuY19xdW90ZV9mb3JfZXZhbCAoKQotewotICAgIGNhc2UgJDEgaW4KLSAgICAgICpbXFxcYFwiXCRdKikKLQlmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdD1gJEVDSE8gIlgkMSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgIDs7Ci0gICAgICAqKQotICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdD0iJDEiIDs7Ci0gICAgZXNhYwotCi0gICAgY2FzZSAkZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQgaW4KLSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycyB0byBkZWxheQotICAgICAgIyB3b3JkIHNwbGl0dGluZywgY29tbWFuZCBzdWJzdGl0dXRpb24gYW5kIGFuZCB2YXJpYWJsZQotICAgICAgIyBleHBhbnNpb24gZm9yIGEgc3Vic2VxdWVudCBldmFsLgotICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKLSAgICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKLSAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ9IlwiJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0XCIiCi0gICAgICAgIDs7Ci0gICAgICAqKQotICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdD0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0IgotICAgIGVzYWMKLX0KLQotCi0jIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCBhcmcKLSMgQWVzdGhldGljYWxseSBxdW90ZSBBUkcgdG8gYmUgZXZhbGVkIGxhdGVyOyBzYW1lIGFzIGFib3ZlLAotIyBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCi1mdW5jX3F1b3RlX2Zvcl9leHBhbmQgKCkKLXsKLSAgICBjYXNlICQxIGluCi0gICAgICAqW1xcXGBcIl0qKQotCW15X2FyZz1gJEVDSE8gIlgkMSIgfCAkWHNlZCBcCi0JICAgIC1lICIkZG91YmxlX3F1b3RlX3N1YnN0IiAtZSAiJHNlZF9kb3VibGVfYmFja3NsYXNoImAgOzsKLSAgICAgICopCi0gICAgICAgIG15X2FyZz0iJDEiIDs7Ci0gICAgZXNhYwotCi0gICAgY2FzZSAkbXlfYXJnIGluCi0gICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMgdG8gZGVsYXkKLSAgICAgICMgd29yZCBzcGxpdHRpbmcgYW5kIGNvbW1hbmQgc3Vic3RpdHV0aW9uIGZvciBhIHN1YnNlcXVlbnQgZXZhbC4KLSAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5Ci0gICAgICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCi0gICAgICAgIG15X2FyZz0iXCIkbXlfYXJnXCIiCi0gICAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdD0iJG15X2FyZyIKLX0KLQotCi0jIGZ1bmNfc2hvd19ldmFsIGNtZCBbZmFpbF9leHBdCi0jIFVubGVzcyBvcHRfc2lsZW50IGlzIHRydWUsIHRoZW4gb3V0cHV0IENNRC4gIFRoZW4sIGlmIG9wdF9kcnlydW4gaXMKLSMgbm90IHRydWUsIGV2YWx1YXRlIENNRC4gIElmIHRoZSBldmFsdWF0aW9uIG9mIENNRCBmYWlscywgYW5kIEZBSUxfRVhQCi0jIGlzIGdpdmVuLCB0aGVuIGV2YWx1YXRlIGl0LgotZnVuY19zaG93X2V2YWwgKCkKLXsKLSAgICBteV9jbWQ9IiQxIgotICAgIG15X2ZhaWxfZXhwPSIkezItOn0iCi0KLSAgICAke29wdF9zaWxlbnQtZmFsc2V9IHx8IHsKLSAgICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJG15X2NtZCIKLSAgICAgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKLSAgICB9Ci0KLSAgICBpZiAke29wdF9kcnlfcnVuLWZhbHNlfTsgdGhlbiA6OyBlbHNlCi0gICAgICBldmFsICIkbXlfY21kIgotICAgICAgbXlfc3RhdHVzPSQ/Ci0gICAgICBpZiB0ZXN0ICIkbXlfc3RhdHVzIiAtZXEgMDsgdGhlbiA6OyBlbHNlCi0JZXZhbCAiKGV4aXQgJG15X3N0YXR1cyk7ICRteV9mYWlsX2V4cCIKLSAgICAgIGZpCi0gICAgZmkKLX0KLQotCi0jIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSBjbWQgW2ZhaWxfZXhwXQotIyBVbmxlc3Mgb3B0X3NpbGVudCBpcyB0cnVlLCB0aGVuIG91dHB1dCBDTUQuICBUaGVuLCBpZiBvcHRfZHJ5cnVuIGlzCi0jIG5vdCB0cnVlLCBldmFsdWF0ZSBDTUQuICBJZiB0aGUgZXZhbHVhdGlvbiBvZiBDTUQgZmFpbHMsIGFuZCBGQUlMX0VYUAotIyBpcyBnaXZlbiwgdGhlbiBldmFsdWF0ZSBpdC4gIFVzZSB0aGUgc2F2ZWQgbG9jYWxlIGZvciBldmFsdWF0aW9uLgotZnVuY19zaG93X2V2YWxfbG9jYWxlICgpCi17Ci0gICAgbXlfY21kPSIkMSIKLSAgICBteV9mYWlsX2V4cD0iJHsyLTp9IgotCi0gICAgJHtvcHRfc2lsZW50LWZhbHNlfSB8fCB7Ci0gICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRteV9jbWQiCi0gICAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCi0gICAgfQotCi0gICAgaWYgJHtvcHRfZHJ5X3J1bi1mYWxzZX07IHRoZW4gOjsgZWxzZQotICAgICAgZXZhbCAiJGx0X3VzZXJfbG9jYWxlCi0JICAgICRteV9jbWQiCi0gICAgICBteV9zdGF0dXM9JD8KLSAgICAgIGV2YWwgIiRsdF9zYWZlX2xvY2FsZSIKLSAgICAgIGlmIHRlc3QgIiRteV9zdGF0dXMiIC1lcSAwOyB0aGVuIDo7IGVsc2UKLQlldmFsICIoZXhpdCAkbXlfc3RhdHVzKTsgJG15X2ZhaWxfZXhwIgotICAgICAgZmkKLSAgICBmaQotfQotCi0KLQotCi0KLSMgZnVuY192ZXJzaW9uCi0jIEVjaG8gdmVyc2lvbiBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLWZ1bmNfdmVyc2lvbiAoKQotewotICAgICRTRUQgLW4gJy9eIyAnJFBST0dSQU0nIChHTlUgLywvIyB3YXJyYW50eTsgLyB7Ci0gICAgICAgIHMvXiMgLy8KLQlzL14jICokLy8KLSAgICAgICAgcy9cKChDKVwpWyAwLTksLV0qXCggWzEtOV1bMC05XSpcKS9cMVwyLwotICAgICAgICBwCi0gICAgIH0nIDwgIiRwcm9ncGF0aCIKLSAgICAgZXhpdCAkPwotfQotCi0jIGZ1bmNfdXNhZ2UKLSMgRWNobyBzaG9ydCBoZWxwIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotZnVuY191c2FnZSAoKQotewotICAgICRTRUQgLW4gJy9eIyBVc2FnZTovLC8jIC1oLyB7Ci0gICAgICAgIHMvXiMgLy8KLQlzL14jICokLy8KLQlzL1wkcHJvZ25hbWUvJyRwcm9nbmFtZScvCi0JcAotICAgIH0nIDwgIiRwcm9ncGF0aCIKLSAgICAkRUNITwotICAgICRFQ0hPICJydW4gXGAkcHJvZ25hbWUgLS1oZWxwIHwgbW9yZScgZm9yIGZ1bGwgdXNhZ2UiCi0gICAgZXhpdCAkPwotfQotCi0jIGZ1bmNfaGVscAotIyBFY2hvIGxvbmcgaGVscCBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLWZ1bmNfaGVscCAoKQotewotICAgICRTRUQgLW4gJy9eIyBVc2FnZTovLC8jIFJlcG9ydCBidWdzIHRvLyB7Ci0gICAgICAgIHMvXiMgLy8KLQlzL14jICokLy8KLQlzKlwkcHJvZ25hbWUqJyRwcm9nbmFtZScqCi0JcypcJGhvc3QqJyIkaG9zdCInKgotCXMqXCRTSEVMTConIiRTSEVMTCInKgotCXMqXCRMVENDKiciJExUQ0MiJyoKLQlzKlwkTFRDRkxBR1MqJyIkTFRDRkxBR1MiJyoKLQlzKlwkTEQqJyIkTEQiJyoKLQlzL1wkd2l0aF9nbnVfbGQvJyIkd2l0aF9nbnVfbGQiJy8KLQlzL1wkYXV0b21ha2VfdmVyc2lvbi8nImAoYXV0b21ha2UgLS12ZXJzaW9uKSAyPi9kZXYvbnVsbCB8JFNFRCAxcWAiJy8KLQlzL1wkYXV0b2NvbmZfdmVyc2lvbi8nImAoYXV0b2NvbmYgLS12ZXJzaW9uKSAyPi9kZXYvbnVsbCB8JFNFRCAxcWAiJy8KLQlwCi0gICAgIH0nIDwgIiRwcm9ncGF0aCIKLSAgICBleGl0ICQ/Ci19Ci0KLSMgZnVuY19taXNzaW5nX2FyZyBhcmduYW1lCi0jIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IgYW5kIHNldCBnbG9iYWwKLSMgZXhpdF9jbWQuCi1mdW5jX21pc3NpbmdfYXJnICgpCi17Ci0gICAgZnVuY19lcnJvciAibWlzc2luZyBhcmd1bWVudCBmb3IgJDEiCi0gICAgZXhpdF9jbWQ9ZXhpdAotfQotCi1leGl0X2NtZD06Ci0KLQotCi0KLQotIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRFQ0hPLgotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgotICA6Ci1lbGlmIHRlc3QgIlhgeyAkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAjIFlpcHBlZSwgJEVDSE8gd29ya3MhCi0gIDoKLWVsc2UKLSAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSAkRUNITyB3aWxsIHdvcmsuCi0gIGV4ZWMgJFNIRUxMICIkcHJvZ3BhdGgiIC0tbm8tcmVleGVjICR7MSsiJEAifQotZmkKLQotaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi0kKgotRU9GCi0gIGV4aXQgJEVYSVRfU1VDQ0VTUwotZmkKLQotbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgotbWFnaWNfZXhlPSIlJSVNQUdJQyBFWEUgdmFyaWFibGUlJSUiCi0KLSMgR2xvYmFsIHZhcmlhYmxlcy4KLSMgJG1vZGUgaXMgdW5zZXQKLW5vbm9wdD0KLWV4ZWN1dGVfZGxmaWxlcz0KLXByZXNlcnZlX2FyZ3M9Ci1sbzJvPSJzL1xcLmxvXCQvLiR7b2JqZXh0fS8iCi1vMmxvPSJzL1xcLiR7b2JqZXh0fVwkLy5sby8iCi1leHRyYWN0ZWRfYXJjaGl2ZXM9Ci1leHRyYWN0ZWRfc2VyaWFsPTAKLQotb3B0X2RyeV9ydW49ZmFsc2UKLW9wdF9kdXBsaWNhdGVfZGVwcz1mYWxzZQotb3B0X3NpbGVudD1mYWxzZQotb3B0X2RlYnVnPToKLQotIyBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCBpbiBhbnkgb2YgdGhlIGFjdGlvbnMsIHRoZSBjb21tYW5kIGluIGl0Ci0jIHdpbGwgYmUgZXhlY2VkIGF0IHRoZSBlbmQuICBUaGlzIHByZXZlbnRzIGhlcmUtZG9jdW1lbnRzIGZyb20gYmVpbmcKLSMgbGVmdCBvdmVyIGJ5IHNoZWxscy4KLWV4ZWNfY21kPQotCi0jIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiBhcmcuLi4KLSMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciwgZm9sbG93ZWQgYnkKLSMgYSBjb25maWd1cmF0aW9uIGZhaWx1cmUgaGludCwgYW5kIGV4aXQuCi1mdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gKCkKLXsKLSAgICBmdW5jX2Vycm9yICR7MSsiJEAifQotICAgIGZ1bmNfZXJyb3IgIlNlZSB0aGUgJFBBQ0tBR0UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0gICAgZnVuY19mYXRhbF9lcnJvciAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4iCi19Ci0KLQotIyBmdW5jX2NvbmZpZwotIyBEaXNwbGF5IHRoZSBjb25maWd1cmF0aW9uIGZvciBhbGwgdGhlIHRhZ3MgaW4gdGhpcyBzY3JpcHQuCi1mdW5jX2NvbmZpZyAoKQotewotICAgIHJlX2JlZ2luY2Y9J14jICMjIyBCRUdJTiBMSUJUT09MJwotICAgIHJlX2VuZGNmPSdeIyAjIyMgRU5EIExJQlRPT0wnCi0KLSAgICAjIERlZmF1bHQgY29uZmlndXJhdGlvbi4KLSAgICAkU0VEICIxLC8kcmVfYmVnaW5jZiBDT05GSUcvZDsvJHJlX2VuZGNmIENPTkZJRy8sXCRkIiA8ICIkcHJvZ3BhdGgiCi0KLSAgICAjIE5vdyBwcmludCB0aGUgY29uZmlndXJhdGlvbnMgZm9yIHRoZSB0YWdzLgotICAgIGZvciB0YWduYW1lIGluICR0YWdsaXN0OyBkbwotICAgICAgJFNFRCAtbiAiLyRyZV9iZWdpbmNmIFRBRyBDT05GSUc6ICR0YWduYW1lXCQvLC8kcmVfZW5kY2YgVEFHIENPTkZJRzogJHRhZ25hbWVcJC9wIiA8ICIkcHJvZ3BhdGgiCi0gICAgZG9uZQotCi0gICAgZXhpdCAkPwotfQotCi0jIGZ1bmNfZmVhdHVyZXMKLSMgRGlzcGxheSB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgotZnVuY19mZWF0dXJlcyAoKQotewotICAgICRFQ0hPICJob3N0OiAkaG9zdCIKLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgJEVDSE8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgICRFQ0hPICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAkRUNITyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgJEVDSE8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBmaQotCi0gICAgZXhpdCAkPwotfQotCi0jIGZ1bmNfZW5hYmxlX3RhZyB0YWduYW1lCi0jIFZlcmlmeSB0aGF0IFRBR05BTUUgaXMgdmFsaWQsIGFuZCBlaXRoZXIgZmxhZyBhbiBlcnJvciBhbmQgZXhpdCwgb3IKLSMgZW5hYmxlIHRoZSBUQUdOQU1FIHRhZy4gIFdlIGFsc28gYWRkIFRBR05BTUUgdG8gdGhlIGdsb2JhbCAkdGFnbGlzdAotIyB2YXJpYWJsZSBoZXJlLgotZnVuY19lbmFibGVfdGFnICgpCi17Ci0gICMgR2xvYmFsIHZhcmlhYmxlOgotICB0YWduYW1lPSIkMSIKLQotICByZV9iZWdpbmNmPSJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZVwkIgotICByZV9lbmRjZj0iXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXCQiCi0gIHNlZF9leHRyYWN0Y2Y9Ii8kcmVfYmVnaW5jZi8sLyRyZV9lbmRjZi9wIgotCi0gICMgVmFsaWRhdGUgdGFnbmFtZS4KLSAgY2FzZSAkdGFnbmFtZSBpbgotICAgICpbIS1fQS1aYS16MC05LC9dKikKLSAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIgotICAgICAgOzsKLSAgZXNhYwotCi0gICMgRG9uJ3QgdGVzdCBmb3IgdGhlICJkZWZhdWx0IiBDIHRhZywgYXMgd2Uga25vdyBpdCdzCi0gICMgdGhlcmUgYnV0IG5vdCBzcGVjaWFsbHkgbWFya2VkLgotICBjYXNlICR0YWduYW1lIGluCi0gICAgQ0MpIDs7Ci0gICAgKikKLSAgICAgIGlmICRHUkVQICIkcmVfYmVnaW5jZiIgIiRwcm9ncGF0aCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JdGFnbGlzdD0iJHRhZ2xpc3QgJHRhZ25hbWUiCi0KLQkjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLiAgQmUgY2FyZWZ1bCB0byBxdW90ZSB0aGUgcGF0aAotCSMgYW5kIHRoZSBzZWQgc2NyaXB0LCB0byBhdm9pZCBzcGxpdHRpbmcgb24gd2hpdGVzcGFjZSwgYnV0Ci0JIyBhbHNvIGRvbid0IHVzZSBub24tcG9ydGFibGUgcXVvdGVzIHdpdGhpbiBiYWNrcXVvdGVzIHdpdGhpbgotCSMgcXVvdGVzIHdlIGhhdmUgdG8gZG8gaXQgaW4gMiBzdGVwczoKLQlleHRyYWN0ZWRjZj1gJFNFRCAtbiAtZSAiJHNlZF9leHRyYWN0Y2YiIDwgIiRwcm9ncGF0aCJgCi0JZXZhbCAiJGV4dHJhY3RlZGNmIgotICAgICAgZWxzZQotCWZ1bmNfZXJyb3IgImlnbm9yaW5nIHVua25vd24gdGFnICR0YWduYW1lIgotICAgICAgZmkKLSAgICAgIDs7Ci0gIGVzYWMKLX0KLQotIyBQYXJzZSBvcHRpb25zIG9uY2UsIHRob3JvdWdobHkuICBUaGlzIGNvbWVzIGFzIHNvb24gYXMgcG9zc2libGUgaW4KLSMgdGhlIHNjcmlwdCB0byBtYWtlIHRoaW5ncyBsaWtlIGBsaWJ0b29sIC0tdmVyc2lvbicgaGFwcGVuIHF1aWNrbHkuCi17Ci0KLSAgIyBTaG9ydGhhbmQgZm9yIC0tbW9kZT1mb28sIG9ubHkgdmFsaWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50Ci0gIGNhc2UgJDEgaW4KLSAgY2xlYW58Y2xlYXxjbGV8Y2wpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgY2xlYW4gJHsxKyIkQCJ9OyBzaGlmdAotICAgIDs7Ci0gIGNvbXBpbGV8Y29tcGlsfGNvbXBpfGNvbXB8Y29tfGNvfGMpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgY29tcGlsZSAkezErIiRAIn07IHNoaWZ0Ci0gICAgOzsKLSAgZXhlY3V0ZXxleGVjdXR8ZXhlY3V8ZXhlY3xleGV8ZXh8ZSkKLSAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBleGVjdXRlICR7MSsiJEAifTsgc2hpZnQKLSAgICA7OwotICBmaW5pc2h8ZmluaXN8ZmluaXxmaW58Zml8ZikKLSAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBmaW5pc2ggJHsxKyIkQCJ9OyBzaGlmdAotICAgIDs7Ci0gIGluc3RhbGx8aW5zdGFsfGluc3RhfGluc3R8aW5zfGlufGkpCi0gICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgaW5zdGFsbCAkezErIiRAIn07IHNoaWZ0Ci0gICAgOzsKLSAgbGlua3xsaW58bGl8bCkKLSAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBsaW5rICR7MSsiJEAifTsgc2hpZnQKLSAgICA7OwotICB1bmluc3RhbGx8dW5pbnN0YWx8dW5pbnN0YXx1bmluc3R8dW5pbnN8dW5pbnx1bml8dW58dSkKLSAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSB1bmluc3RhbGwgJHsxKyIkQCJ9OyBzaGlmdAotICAgIDs7Ci0gIGVzYWMKLQotICAjIFBhcnNlIG5vbi1tb2RlIHNwZWNpZmljIGFyZ3VtZW50czoKLSAgd2hpbGUgdGVzdCAiJCMiIC1ndCAwOyBkbwotICAgIG9wdD0iJDEiCi0gICAgc2hpZnQKLQotICAgIGNhc2UgJG9wdCBpbgotICAgICAgLS1jb25maWcpCQlmdW5jX2NvbmZpZwkJCQkJOzsKLQotICAgICAgLS1kZWJ1ZykJCXByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRvcHQiCi0JCQlmdW5jX2VjaG8gImVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCi0JCQlvcHRfZGVidWc9J3NldCAteCcKLQkJCSRvcHRfZGVidWcKLQkJCTs7Ci0KLSAgICAgIC1kbG9wZW4pCQl0ZXN0ICIkIyIgLWVxIDAgJiYgZnVuY19taXNzaW5nX2FyZyAiJG9wdCIgJiYgYnJlYWsKLQkJCWV4ZWN1dGVfZGxmaWxlcz0iJGV4ZWN1dGVfZGxmaWxlcyAkMSIKLQkJCXNoaWZ0Ci0JCQk7OwotCi0gICAgICAtLWRyeS1ydW4gfCAtbikJb3B0X2RyeV9ydW49OgkJCQkJOzsKLSAgICAgIC0tZmVhdHVyZXMpICAgICAgIGZ1bmNfZmVhdHVyZXMJCQkJCTs7Ci0gICAgICAtLWZpbmlzaCkJCW1vZGU9ImZpbmlzaCIJCQkJCTs7Ci0KLSAgICAgIC0tbW9kZSkJCXRlc3QgIiQjIiAtZXEgMCAmJiBmdW5jX21pc3NpbmdfYXJnICIkb3B0IiAmJiBicmVhawotCQkJY2FzZSAkMSBpbgotCQkJICAjIFZhbGlkIG1vZGUgYXJndW1lbnRzOgotCQkJICBjbGVhbikJOzsKLQkJCSAgY29tcGlsZSkJOzsKLQkJCSAgZXhlY3V0ZSkJOzsKLQkJCSAgZmluaXNoKQk7OwotCQkJICBpbnN0YWxsKQk7OwotCQkJICBsaW5rKQkJOzsKLQkJCSAgcmVsaW5rKQk7OwotCQkJICB1bmluc3RhbGwpCTs7Ci0KLQkJCSAgIyBDYXRjaCBhbnl0aGluZyBlbHNlIGFzIGFuIGVycm9yCi0JCQkgICopIGZ1bmNfZXJyb3IgImludmFsaWQgYXJndW1lbnQgZm9yICRvcHQiCi0JCQkgICAgIGV4aXRfY21kPWV4aXQKLQkJCSAgICAgYnJlYWsKLQkJCSAgICAgOzsKLQkJICAgICAgICBlc2FjCi0KLQkJCW1vZGU9IiQxIgotCQkJc2hpZnQKLQkJCTs7Ci0KLSAgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMpCi0JCQlvcHRfZHVwbGljYXRlX2RlcHM9OgkJCQk7OwotCi0gICAgICAtLXF1aWV0fC0tc2lsZW50KQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0IgotCQkJb3B0X3NpbGVudD06Ci0JCQk7OwotCi0gICAgICAtLXZlcmJvc2V8IC12KQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0IgotCQkJb3B0X3NpbGVudD1mYWxzZQotCQkJOzsKLQotICAgICAgLS10YWcpCQl0ZXN0ICIkIyIgLWVxIDAgJiYgZnVuY19taXNzaW5nX2FyZyAiJG9wdCIgJiYgYnJlYWsKLQkJCXByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRvcHQgJDEiCi0JCQlmdW5jX2VuYWJsZV90YWcgIiQxIgkjIHRhZ25hbWUgaXMgc2V0IGhlcmUKLQkJCXNoaWZ0Ci0JCQk7OwotCi0gICAgICAjIFNlcGFyYXRlIG9wdGFyZ3MgdG8gbG9uZyBvcHRpb25zOgotICAgICAgLWRsb3Blbj0qfC0tbW9kZT0qfC0tdGFnPSopCi0JCQlmdW5jX29wdF9zcGxpdCAiJG9wdCIKLQkJCXNldCBkdW1teSAiJGZ1bmNfb3B0X3NwbGl0X29wdCIgIiRmdW5jX29wdF9zcGxpdF9hcmciICR7MSsiJEAifQotCQkJc2hpZnQKLQkJCTs7Ci0KLSAgICAgIC1cP3wtaCkJCWZ1bmNfdXNhZ2UJCQkJCTs7Ci0gICAgICAtLWhlbHApCQlvcHRfaGVscD06CQkJCQk7OwotICAgICAgLS12ZXJzaW9uKQlmdW5jX3ZlcnNpb24JCQkJCTs7Ci0KLSAgICAgIC0qKQkJZnVuY19mYXRhbF9oZWxwICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdCciCTs7Ci0KLSAgICAgICopCQlub25vcHQ9IiRvcHQiCi0JCQlicmVhawotCQkJOzsKLSAgICBlc2FjCi0gIGRvbmUKLQotCi0gIGNhc2UgJGhvc3QgaW4KLSAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiopCi0gICAgICAjIGRvbid0IGVsaW1pbmF0ZSBkdXBsaWNhdGlvbnMgaW4gJHBvc3RkZXBzIGFuZCAkcHJlZGVwcwotICAgICAgb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz06Ci0gICAgICA7OwotICAgICopCi0gICAgICBvcHRfZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPSRvcHRfZHVwbGljYXRlX2RlcHMKLSAgICAgIDs7Ci0gIGVzYWMKLQotICAjIEhhdmluZyB3YXJuZWQgYWJvdXQgYWxsIG1pcy1zcGVjaWZpZWQgb3B0aW9ucywgYmFpbCBvdXQgaWYKLSAgIyBhbnl0aGluZyB3YXMgd3JvbmcuCi0gICRleGl0X2NtZCAkRVhJVF9GQUlMVVJFCi19Ci0KLSMgZnVuY19jaGVja192ZXJzaW9uX21hdGNoCi0jIEVuc3VyZSB0aGF0IHdlIGFyZSB1c2luZyBtNCBtYWNyb3MsIGFuZCBsaWJ0b29sIHNjcmlwdCBmcm9tIHRoZSBzYW1lCi0jIHJlbGVhc2Ugb2YgbGlidG9vbC4KLWZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaCAoKQotewotICBpZiB0ZXN0ICIkcGFja2FnZV9yZXZpc2lvbiIgIT0gIiRtYWNyb19yZXZpc2lvbiI7IHRoZW4KLSAgICBpZiB0ZXN0ICIkVkVSU0lPTiIgIT0gIiRtYWNyb192ZXJzaW9uIjsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiJG1hY3JvX3ZlcnNpb24iOyB0aGVuCi0gICAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCi0kcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCBidXQgdGhlCi0kcHJvZ25hbWU6IGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gYW4gb2xkZXIgcmVsZWFzZS4KLSRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gJFBBQ0tBR0UgJFZFUlNJT04KLSRwcm9nbmFtZTogYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KLV9MVF9FT0YKLSAgICAgIGVsc2UKLSAgICAgICAgY2F0ID4mMiA8PF9MVF9FT0YKLSRwcm9nbmFtZTogVmVyc2lvbiBtaXNtYXRjaCBlcnJvci4gIFRoaXMgaXMgJFBBQ0tBR0UgJFZFUlNJT04sIGJ1dCB0aGUKLSRwcm9nbmFtZTogZGVmaW5pdGlvbiBvZiB0aGlzIExUX0lOSVQgY29tZXMgZnJvbSAkUEFDS0FHRSAkbWFjcm9fdmVyc2lvbi4KLSRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gJFBBQ0tBR0UgJFZFUlNJT04KLSRwcm9nbmFtZTogYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KLV9MVF9FT0YKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgY2F0ID4mMiA8PF9MVF9FT0YKLSRwcm9nbmFtZTogVmVyc2lvbiBtaXNtYXRjaCBlcnJvci4gIFRoaXMgaXMgJFBBQ0tBR0UgJFZFUlNJT04sIHJldmlzaW9uICRwYWNrYWdlX3JldmlzaW9uLAotJHByb2duYW1lOiBidXQgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gcmV2aXNpb24gJG1hY3JvX3JldmlzaW9uLgotJHByb2duYW1lOiBZb3Ugc2hvdWxkIHJlY3JlYXRlIGFjbG9jYWwubTQgd2l0aCBtYWNyb3MgZnJvbSByZXZpc2lvbiAkcGFja2FnZV9yZXZpc2lvbgotJHByb2duYW1lOiBvZiAkUEFDS0FHRSAkVkVSU0lPTiBhbmQgcnVuIGF1dG9jb25mIGFnYWluLgotX0xUX0VPRgotICAgIGZpCi0KLSAgICBleGl0ICRFWElUX01JU01BVENICi0gIGZpCi19Ci0KLQotIyMgLS0tLS0tLS0tLS0gIyMKLSMjICAgIE1haW4uICAgICMjCi0jIyAtLS0tLS0tLS0tLSAjIwotCi0kb3B0X2hlbHAgfHwgewotICAjIFNhbml0eSBjaGVja3MgZmlyc3Q6Ci0gIGZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaAotCi0gIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiICE9IHllczsgdGhlbgotICAgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAibm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIKLSAgZmkKLQotICB0ZXN0IC16ICIkbW9kZSIgJiYgZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IHlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFLiIKLQotCi0gICMgRGFyd2luIHN1Y2tzCi0gIGV2YWwgc3RkX3NocmV4dD1cIiRzaHJleHRfY21kc1wiCi0KLQotICAjIE9ubHkgZXhlY3V0ZSBtb2RlIGlzIGFsbG93ZWQgdG8gaGF2ZSAtZGxvcGVuIGZsYWdzLgotICBpZiB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiB0ZXN0ICIkbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgotICAgIGZ1bmNfZXJyb3IgInVucmVjb2duaXplZCBvcHRpb24gXGAtZGxvcGVuJyIKLSAgICAkRUNITyAiJGhlbHAiIDE+JjIKLSAgICBleGl0ICRFWElUX0ZBSUxVUkUKLSAgZmkKLQotICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCi0gIGdlbmVyaWNfaGVscD0iJGhlbHAiCi0gIGhlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAgLS1tb2RlPSRtb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi19Ci0KLQotIyBmdW5jX2xhbGliX3AgZmlsZQotIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCBgLmxhJyBsaWJyYXJ5IG9yIGAubG8nIG9iamVjdCBmaWxlLgotIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYSBiYXNpYyBzYW5pdHkgY2hlY2s7IGl0IHdpbGwgaGFyZGx5IGZsdXNoIG91dAotIyBkZXRlcm1pbmVkIGltcG9zdGVycy4KLWZ1bmNfbGFsaWJfcCAoKQotewotICAgICRTRUQgLWUgNHEgIiQxIiAyPi9kZXYvbnVsbCBcCi0gICAgICB8ICRHUkVQICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIgPiAvZGV2L251bGwgMj4mMQotfQotCi0jIGZ1bmNfbGFsaWJfdW5zYWZlX3AgZmlsZQotIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCBgLmxhJyBsaWJyYXJ5IG9yIGAubG8nIG9iamVjdCBmaWxlLgotIyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHNhbWUgY2hlY2sgYXMgZnVuY19sYWxpYl9wIHdpdGhvdXQKLSMgcmVzb3J0aW5nIHRvIGV4dGVybmFsIHByb2dyYW1zLiAgVG8gdGhpcyBlbmQsIGl0IHJlZGlyZWN0cyBzdGRpbiBhbmQKLSMgY2xvc2VzIGl0IGFmdGVyd2FyZHMsIHdpdGhvdXQgc2F2aW5nIHRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IuCi0jIEFzIGEgc2FmZXR5IG1lYXN1cmUsIHVzZSBpdCBvbmx5IHdoZXJlIGEgbmVnYXRpdmUgcmVzdWx0IHdvdWxkIGJlCi0jIGZhdGFsIGFueXdheS4gIFdvcmtzIGlmIGBmaWxlJyBkb2VzIG5vdCBleGlzdC4KLWZ1bmNfbGFsaWJfdW5zYWZlX3AgKCkKLXsKLSAgICBsYWxpYl9wPW5vCi0gICAgaWYgdGVzdCAtciAiJDEiICYmIGV4ZWMgNTwmMCA8IiQxIjsgdGhlbgotCWZvciBsYWxpYl9wX2wgaW4gMSAyIDMgNAotCWRvCi0JICAgIHJlYWQgbGFsaWJfcF9saW5lCi0JICAgIGNhc2UgIiRsYWxpYl9wX2xpbmUiIGluCi0JCVwjXCBHZW5lcmF0ZWRcIGJ5XCAqJFBBQ0tBR0UqICkgbGFsaWJfcD15ZXM7IGJyZWFrOzsKLQkgICAgZXNhYwotCWRvbmUKLQlleGVjIDA8JjUgNTwmLQotICAgIGZpCi0gICAgdGVzdCAiJGxhbGliX3AiID0geWVzCi19Ci0KLSMgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgZmlsZQotIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdAotIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYSBiYXNpYyBzYW5pdHkgY2hlY2s7IGl0IHdpbGwgaGFyZGx5IGZsdXNoIG91dAotIyBkZXRlcm1pbmVkIGltcG9zdGVycy4KLWZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICgpCi17Ci0gICAgZnVuY19sYWxpYl9wICIkMSIKLX0KLQotIyBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgZmlsZQotIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIGV4ZWN1dGFibGUKLSMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKLSMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCi1mdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgKCkKLXsKLSAgICBmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeD0KLSAgICBjYXNlICQxIGluCi0gICAgKi5leGUpIDs7Ci0gICAgKikgZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXg9LmV4ZSA7OwotICAgIGVzYWMKLSAgICAkR1JFUCAiJG1hZ2ljX2V4ZSIgIiQxJGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4IiA+L2Rldi9udWxsIDI+JjEKLX0KLQotIyBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lIGZpbGUKLSMgQXNzdW1lcyBmaWxlIGlzIGFuIGx0d3JhcHBlcl9leGVjdXRhYmxlCi0jIHVzZXMgJGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmaWxlbmFtZSBmb3IgYQotIyB0ZW1wb3JhcnkgbHR3cmFwcGVyX3NjcmlwdC4KLWZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgKCkKLXsKLSAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdD0iIgotICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJDEiOyB0aGVuCi0JZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJDEiICIiICIuIgotCWZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCWZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdC8kb2JqZGlyLyR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0fV9sdHNod3JhcHBlciIKLSAgICBmaQotfQotCi0jIGZ1bmNfbHR3cmFwcGVyX3AgZmlsZQotIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvciB3cmFwcGVyIGV4ZWN1dGFibGUKLSMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKLSMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCi1mdW5jX2x0d3JhcHBlcl9wICgpCi17Ci0gICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiQxIiB8fCBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiQxIgotfQotCi0KLSMgZnVuY19leGVjdXRlX2NtZHMgY29tbWFuZHMgZmFpbF9jbWQKLSMgRXhlY3V0ZSB0aWxkZS1kZWxpbWl0ZWQgQ09NTUFORFMuCi0jIElmIEZBSUxfQ01EIGlzIGdpdmVuLCBldmFsIHRoYXQgdXBvbiBmYWlsdXJlLgotIyBGQUlMX0NNRCBtYXkgcmVhZC1hY2Nlc3MgdGhlIGN1cnJlbnQgY29tbWFuZCBpbiB2YXJpYWJsZSBDTUQhCi1mdW5jX2V4ZWN1dGVfY21kcyAoKQotewotICAgICRvcHRfZGVidWcKLSAgICBzYXZlX2lmcz0kSUZTOyBJRlM9J34nCi0gICAgZm9yIGNtZCBpbiAkMTsgZG8KLSAgICAgIElGUz0kc2F2ZV9pZnMKLSAgICAgIGV2YWwgY21kPVwiJGNtZFwiCi0gICAgICBmdW5jX3Nob3dfZXZhbCAiJGNtZCIgIiR7Mi06fSIKLSAgICBkb25lCi0gICAgSUZTPSRzYXZlX2lmcwotfQotCi0KLSMgZnVuY19zb3VyY2UgZmlsZQotIyBTb3VyY2UgRklMRSwgYWRkaW5nIGRpcmVjdG9yeSBjb21wb25lbnQgaWYgbmVjZXNzYXJ5LgotIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCi0jIEZJTEUgZXZlbiBpZiBib3RoIEZJTEUgYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKLSMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZwotIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgotZnVuY19zb3VyY2UgKCkKLXsKLSAgICAkb3B0X2RlYnVnCi0gICAgY2FzZSAkMSBpbgotICAgICovKiB8ICpcXCopCS4gIiQxIiA7OwotICAgICopCQkuICIuLyQxIiA7OwotICAgIGVzYWMKLX0KLQotCi0jIGZ1bmNfaW5mZXJfdGFnIGFyZwotIyBJbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiB0byB1c2UgaWYgYW55IGFyZSBhdmFpbGFibGUgYW5kCi0jIGlmIG9uZSB3YXNuJ3QgY2hvc2VuIHZpYSB0aGUgIi0tdGFnIiBjb21tYW5kIGxpbmUgb3B0aW9uLgotIyBPbmx5IGF0dGVtcHQgdGhpcyBpZiB0aGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZQotIyBjb21tYW5kIGRvZXNuJ3QgbWF0Y2ggdGhlIGRlZmF1bHQgY29tcGlsZXIuCi0jIGFyZyBpcyB1c3VhbGx5IG9mIHRoZSBmb3JtICdnY2MgLi4uJwotZnVuY19pbmZlcl90YWcgKCkKLXsKLSAgICAkb3B0X2RlYnVnCi0gICAgaWYgdGVzdCAtbiAiJGF2YWlsYWJsZV90YWdzIiAmJiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KLSAgICAgIENDX3F1b3RlZD0KLSAgICAgIGZvciBhcmcgaW4gJENDOyBkbwotICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotCUNDX3F1b3RlZD0iJENDX3F1b3RlZCAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0gICAgICBkb25lCi0gICAgICBjYXNlICRAIGluCi0gICAgICAjIEJsYW5rcyBpbiB0aGUgY29tbWFuZCBtYXkgaGF2ZSBiZWVuIHN0cmlwcGVkIGJ5IHRoZSBjYWxsaW5nIHNoZWxsLAotICAgICAgIyBidXQgbm90IGZyb20gdGhlIENDIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gY29uZmlndXJlIHdhcyBydW4uCi0gICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkRUNITyAkQ0NgICIqIHwgImAkRUNITyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRFQ0hPICRDQ19xdW90ZWRgICIqIHwgImAkRUNITyAkQ0NfcXVvdGVkYCAiKikgOzsKLSAgICAgICMgQmxhbmtzIGF0IHRoZSBzdGFydCBvZiAkYmFzZV9jb21waWxlIHdpbGwgY2F1c2UgdGhpcyB0byBmYWlsCi0gICAgICAjIGlmIHdlIGRvbid0IGNoZWNrIGZvciB0aGVtIGFzIHdlbGwuCi0gICAgICAqKQotCWZvciB6IGluICRhdmFpbGFibGVfdGFnczsgZG8KLQkgIGlmICRHUkVQICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkeiQiIDwgIiRwcm9ncGF0aCIgPiAvZGV2L251bGw7IHRoZW4KLQkgICAgIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4KLQkgICAgZXZhbCAiYCR7U0VEfSAtbiAtZSAnL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICckeickLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICckeickL3AnIDwgJHByb2dwYXRoYCIKLQkgICAgQ0NfcXVvdGVkPQotCSAgICBmb3IgYXJnIGluICRDQzsgZG8KLQkgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi0JICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKLQkgICAgICBDQ19xdW90ZWQ9IiRDQ19xdW90ZWQgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCSAgICBkb25lCi0JICAgIGNhc2UgIiRAICIgaW4KLQkgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkRUNITyAkQ0NgICIqIHwgImAkRUNITyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRFQ0hPICRDQ19xdW90ZWRgICIqIHwgImAkRUNITyAkQ0NfcXVvdGVkYCAiKikKLQkgICAgICAjIFRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlIGNvbW1hbmQgbWF0Y2hlcwotCSAgICAgICMgdGhlIG9uZSBpbiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24uCi0JICAgICAgIyBBc3N1bWUgdGhpcyBpcyB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gd2Ugd2FudC4KLQkgICAgICB0YWduYW1lPSR6Ci0JICAgICAgYnJlYWsKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBmaQotCWRvbmUKLQkjIElmICR0YWduYW1lIHN0aWxsIGlzbid0IHNldCwgdGhlbiBubyB0YWdnZWQgY29uZmlndXJhdGlvbgotCSMgd2FzIGZvdW5kIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSAiLS10YWciIGNvbW1hbmQKLQkjIGxpbmUgb3B0aW9uIG11c3QgYmUgdXNlZC4KLQlpZiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KLQkgIGZ1bmNfZWNobyAidW5hYmxlIHRvIGluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIgotCSAgZnVuY19mYXRhbF9lcnJvciAic3BlY2lmeSBhIHRhZyB3aXRoIFxgLS10YWcnIgotIwllbHNlCi0jCSAgZnVuY192ZXJib3NlICJ1c2luZyAkdGFnbmFtZSB0YWdnZWQgY29uZmlndXJhdGlvbiIKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLX0KLQotCi0KLSMgZnVuY193cml0ZV9saWJ0b29sX29iamVjdCBvdXRwdXRfbmFtZSBwaWNfbmFtZSBub25waWNfbmFtZQotIyBDcmVhdGUgYSBsaWJ0b29sIG9iamVjdCBmaWxlIChhbmFsb2dvdXMgdG8gYSAiLmxhIiBmaWxlKSwKLSMgYnV0IGRvbid0IGNyZWF0ZSBpdCBpZiB3ZSdyZSBkb2luZyBhIGRyeSBydW4uCi1mdW5jX3dyaXRlX2xpYnRvb2xfb2JqZWN0ICgpCi17Ci0gICAgd3JpdGVfbGlib2JqPSR7MX0KLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgd3JpdGVfbG9iaj1cJyR7Mn1cJwotICAgIGVsc2UKLSAgICAgIHdyaXRlX2xvYmo9bm9uZQotICAgIGZpCi0KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICB3cml0ZV9vbGRvYmo9XCckezN9XCcKLSAgICBlbHNlCi0gICAgICB3cml0ZV9vbGRvYmo9bm9uZQotICAgIGZpCi0KLSAgICAkb3B0X2RyeV9ydW4gfHwgewotICAgICAgY2F0ID4ke3dyaXRlX2xpYm9ian1UIDw8RU9GCi0jICR3cml0ZV9saWJvYmogLSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUKLSMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgotIwotIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCi0jIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KLQotIyBOYW1lIG9mIHRoZSBQSUMgb2JqZWN0LgotcGljX29iamVjdD0kd3JpdGVfbG9iagotCi0jIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Ci1ub25fcGljX29iamVjdD0kd3JpdGVfb2xkb2JqCi0KLUVPRgotICAgICAgJE1WICIke3dyaXRlX2xpYm9ian1UIiAiJHt3cml0ZV9saWJvYmp9IgotICAgIH0KLX0KLQotIyBmdW5jX21vZGVfY29tcGlsZSBhcmcuLi4KLWZ1bmNfbW9kZV9jb21waWxlICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCi0gICAgYmFzZV9jb21waWxlPQotICAgIHNyY2ZpbGU9IiRub25vcHQiICAjICBhbHdheXMga2VlcCBhIG5vbi1lbXB0eSB2YWx1ZSBpbiAic3JjZmlsZSIKLSAgICBzdXBwcmVzc19vcHQ9eWVzCi0gICAgc3VwcHJlc3Nfb3V0cHV0PQotICAgIGFyZ19tb2RlPW5vcm1hbAotICAgIGxpYm9iaj0KLSAgICBsYXRlcj0KLSAgICBwaWVfZmxhZz0KLQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAkYXJnX21vZGUgaW4KLSAgICAgIGFyZyAgKQotCSMgZG8gbm90ICJjb250aW51ZSIuICBJbnN0ZWFkLCBhZGQgdGhpcyB0byBiYXNlX2NvbXBpbGUKLQlsYXN0YXJnPSIkYXJnIgotCWFyZ19tb2RlPW5vcm1hbAotCTs7Ci0KLSAgICAgIHRhcmdldCApCi0JbGlib2JqPSIkYXJnIgotCWFyZ19tb2RlPW5vcm1hbAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgbm9ybWFsICkKLQkjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0JY2FzZSAkYXJnIGluCi0JLW8pCi0JICB0ZXN0IC1uICIkbGlib2JqIiAmJiBcCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBjYW5ub3Qgc3BlY2lmeSBcYC1vJyBtb3JlIHRoYW4gb25jZSIKLQkgIGFyZ19tb2RlPXRhcmdldAotCSAgY29udGludWUKLQkgIDs7Ci0KLQktcGllIHwgLWZwaWUgfCAtZlBJRSkKLSAgICAgICAgICBwaWVfZmxhZz0iJHBpZV9mbGFnICRhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQotCS1zaGFyZWQgfCAtc3RhdGljIHwgLXByZWZlci1waWMgfCAtcHJlZmVyLW5vbi1waWMpCi0JICBsYXRlcj0iJGxhdGVyICRhcmciCi0JICBjb250aW51ZQotCSAgOzsKLQotCS1uby1zdXBwcmVzcykKLQkgIHN1cHByZXNzX29wdD1ubwotCSAgY29udGludWUKLQkgIDs7Ci0KLQktWGNvbXBpbGVyKQotCSAgYXJnX21vZGU9YXJnICAjICB0aGUgbmV4dCBvbmUgZ29lcyBpbnRvIHRoZSAiYmFzZV9jb21waWxlIiBhcmcgbGlzdAotCSAgY29udGludWUgICAgICAjICBUaGUgY3VycmVudCAic3JjZmlsZSIgd2lsbCBlaXRoZXIgYmUgcmV0YWluZWQgb3IKLQkgIDs7ICAgICAgICAgICAgIyAgcmVwbGFjZWQgbGF0ZXIuICBJIHdvdWxkIGd1ZXNzIHRoYXQgd291bGQgYmUgYSBidWcuCi0KLQktV2MsKikKLQkgIGZ1bmNfc3RyaXBuYW1lICctV2MsJyAnJyAiJGFyZyIKLQkgIGFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgbGFzdGFyZz0KLQkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwotCSAgZm9yIGFyZyBpbiAkYXJnczsgZG8KLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCi0JICAgIGxhc3Rhcmc9IiRsYXN0YXJnICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgZnVuY19zdHJpcG5hbWUgJyAnICcnICIkbGFzdGFyZyIKLQkgIGxhc3Rhcmc9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCi0JICAjIEFkZCB0aGUgYXJndW1lbnRzIHRvIGJhc2VfY29tcGlsZS4KLQkgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCi0JKikKLQkgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KLQkgICMgVGhlIHByZXZpb3VzICJzcmNmaWxlIiBiZWNvbWVzIHRoZSBjdXJyZW50IGFyZ3VtZW50LgotCSAgIwotCSAgbGFzdGFyZz0iJHNyY2ZpbGUiCi0JICBzcmNmaWxlPSIkYXJnIgotCSAgOzsKLQllc2FjICAjICBjYXNlICRhcmcKLQk7OwotICAgICAgZXNhYyAgICAjICBjYXNlICRhcmdfbW9kZQotCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgotICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGxhc3RhcmciCi0gICAgICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotICAgIGRvbmUgIyBmb3IgYXJnCi0KLSAgICBjYXNlICRhcmdfbW9kZSBpbgotICAgIGFyZykKLSAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBtdXN0IHNwZWNpZnkgYW4gYXJndW1lbnQgZm9yIC1YY29tcGlsZSIKLSAgICAgIDs7Ci0gICAgdGFyZ2V0KQotICAgICAgZnVuY19mYXRhbF9lcnJvciAieW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aXRoIFxgLW8nIgotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgotICAgICAgdGVzdCAteiAiJGxpYm9iaiIgJiYgewotCWZ1bmNfYmFzZW5hbWUgIiRzcmNmaWxlIgotCWxpYm9iaj0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotICAgICAgfQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgotICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCi0gICAgY2FzZSAkbGlib2JqIGluCi0gICAgKi5bY0NGU2lmbXNvXSB8IFwKLSAgICAqLmFkYSB8ICouYWRiIHwgKi5hZHMgfCAqLmFzbSB8IFwKLSAgICAqLmMrKyB8ICouY2MgfCAqLmlpIHwgKi5jbGFzcyB8ICouY3BwIHwgKi5jeHggfCBcCi0gICAgKi5bZkZdWzA5XT8gfCAqLmZvciB8ICouamF2YSB8ICoub2JqIHwgKi5zeCkKLSAgICAgIGZ1bmNfeGZvcm0gIiRsaWJvYmoiCi0gICAgICBsaWJvYmo9JGZ1bmNfeGZvcm1fcmVzdWx0Ci0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGNhc2UgJGxpYm9iaiBpbgotICAgICoubG8pIGZ1bmNfbG8ybyAiJGxpYm9iaiI7IG9iaj0kZnVuY19sbzJvX3Jlc3VsdCA7OwotICAgICopCi0gICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCi0KLSAgICBmb3IgYXJnIGluICRsYXRlcjsgZG8KLSAgICAgIGNhc2UgJGFyZyBpbgotICAgICAgLXNoYXJlZCkKLQl0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgXAotCSAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJjYW4gbm90IGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkiCi0JYnVpbGRfb2xkX2xpYnM9bm8KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1zdGF0aWMpCi0JYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JYnVpbGRfb2xkX2xpYnM9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcHJlZmVyLXBpYykKLQlwaWNfbW9kZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1wcmVmZXItbm9uLXBpYykKLQlwaWNfbW9kZT1ubwotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkbGlib2JqIgotICAgIHRlc3QgIlgkbGlib2JqIiAhPSAiWCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIgXAotICAgICAgJiYgJEVDSE8gIlgkbGlib2JqIiB8ICRHUkVQICdbXX4jXip7fTs8Pj8iJyInIicJICYoKXxgJFtdJyBcCi0gICAgICAmJiBmdW5jX3dhcm5pbmcgImxpYm9iaiBuYW1lIFxgJGxpYm9iaicgbWF5IG5vdCBjb250YWluIHNoZWxsIHNwZWNpYWwgY2hhcmFjdGVycy4iCi0gICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG9iaiIgIi8iICIiCi0gICAgb2JqbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotICAgIGxvYmo9JHt4ZGlyfSRvYmpkaXIvJG9iam5hbWUKLQotICAgIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiICYmIFwKLSAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiCi0KLSAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgotICAgIGVsc2UKLSAgICAgIHJlbW92ZWxpc3Q9IiRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKLSAgICBmaQotCi0gICAgIyBPbiBDeWd3aW4gdGhlcmUncyBubyAicmVhbCIgUElDIGZsYWcgc28gd2UgbXVzdCBidWlsZCBib3RoIG9iamVjdCB0eXBlcwotICAgIGNhc2UgJGhvc3Rfb3MgaW4KLSAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqKQotICAgICAgcGljX21vZGU9ZGVmYXVsdAotICAgICAgOzsKLSAgICBlc2FjCi0gICAgaWYgdGVzdCAiJHBpY19tb2RlIiA9IG5vICYmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KLSAgICAgICMgbm9uLVBJQyBjb2RlIGluIHNoYXJlZCBsaWJyYXJpZXMgaXMgbm90IHN1cHBvcnRlZAotICAgICAgcGljX21vZGU9ZGVmYXVsdAotICAgIGZpCi0KLSAgICAjIENhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBvYmplY3QgaWYgY29tcGlsZXIgZG9lcwotICAgICMgbm90IHN1cHBvcnQgLW8gd2l0aCAtYwotICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm87IHRoZW4KLSAgICAgIG91dHB1dF9vYmo9YCRFQ0hPICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncyVcLlteLl0qJCUlJ2AuJHtvYmpleHR9Ci0gICAgICBsb2NrZmlsZT0iJG91dHB1dF9vYmoubG9jayIKLSAgICBlbHNlCi0gICAgICBvdXRwdXRfb2JqPQotICAgICAgbmVlZF9sb2Nrcz1ubwotICAgICAgbG9ja2ZpbGU9Ci0gICAgZmkKLQotICAgICMgTG9jayB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgaXMgbmVlZGVkCi0gICAgIyBXZSB1c2UgdGhpcyBzY3JpcHQgZmlsZSB0byBtYWtlIHRoZSBsaW5rLCBpdCBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgZmlsZQotICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHllczsgdGhlbgotICAgICAgdW50aWwgJG9wdF9kcnlfcnVuIHx8IGxuICIkcHJvZ3BhdGgiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbwotCWZ1bmNfZWNobyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCi0Jc2xlZXAgMgotICAgICAgZG9uZQotICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgotICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgotCSRFQ0hPICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBleGlzdHMgYW5kIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotICAgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJG91dHB1dF9vYmoiCi0gICAgICAkRUNITyAiJHNyY2ZpbGUiID4gIiRsb2NrZmlsZSIKLSAgICBmaQotCi0gICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAotICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRsb2NrZmlsZSIKLSAgICB0cmFwICckb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnIDEgMiAxNQotCi0gICAgaWYgdGVzdCAtbiAiJGZpeF9zcmNmaWxlX3BhdGgiOyB0aGVuCi0gICAgICBldmFsIHNyY2ZpbGU9XCIkZml4X3NyY2ZpbGVfcGF0aFwiCi0gICAgZmkKLSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkc3JjZmlsZSIKLSAgICBxc3JjZmlsZT0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQKLQotICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgotICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCi0KLSAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0gbm87IHRoZW4KLQljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCi0gICAgICBlbHNlCi0JIyBEb24ndCBidWlsZCBQSUMgY29kZQotCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlIgotICAgICAgZmkKLQotICAgICAgZnVuY19ta2Rpcl9wICIkeGRpciRvYmpkaXIiCi0KLSAgICAgIGlmIHRlc3QgLXogIiRvdXRwdXRfb2JqIjsgdGhlbgotCSMgUGxhY2UgUElDIG9iamVjdHMgaW4gJG9iamRpcgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRsb2JqIgotICAgICAgZmkKLQotICAgICAgZnVuY19zaG93X2V2YWxfbG9jYWxlICIkY29tbWFuZCIJXAotICAgICAgICAgICd0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnCi0KLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKLQkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KLQkkRUNITyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotYnV0IGl0IHNob3VsZCBjb250YWluOgotJHNyY2ZpbGUKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKLQlleGl0ICRFWElUX0ZBSUxVUkUKLSAgICAgIGZpCi0KLSAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCi0gICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRsb2JqIjsgdGhlbgotCWZ1bmNfc2hvd19ldmFsICckTVYgIiRvdXRwdXRfb2JqIiAiJGxvYmoiJyBcCi0JICAnZXJyb3I9JD87ICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJGVycm9yJwotICAgICAgZmkKLQotICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgotICAgICAgaWYgdGVzdCAiJHN1cHByZXNzX29wdCIgPSB5ZXM7IHRoZW4KLQlzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSB5ZXM7IHRoZW4KLQkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUkcGllX2ZsYWciCi0gICAgICBlbHNlCi0JY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCi0JY29tbWFuZD0iJGNvbW1hbmQgLW8gJG9iaiIKLSAgICAgIGZpCi0KLSAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgotICAgICAgY29tbWFuZD0iJGNvbW1hbmQkc3VwcHJlc3Nfb3V0cHV0IgotICAgICAgZnVuY19zaG93X2V2YWxfbG9jYWxlICIkY29tbWFuZCIgXAotICAgICAgICAnJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFJwotCi0gICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCi0JIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCi0JJEVDSE8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0Ci0JZXhpdCAkRVhJVF9GQUlMVVJFCi0gICAgICBmaQotCi0gICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZAotICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkb2JqIjsgdGhlbgotCWZ1bmNfc2hvd19ldmFsICckTVYgIiRvdXRwdXRfb2JqIiAiJG9iaiInIFwKLQkgICdlcnJvcj0kPzsgJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkZXJyb3InCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAkb3B0X2RyeV9ydW4gfHwgewotICAgICAgZnVuY193cml0ZV9saWJ0b29sX29iamVjdCAiJGxpYm9iaiIgIiRvYmpkaXIvJG9iam5hbWUiICIkb2JqbmFtZSIKLQotICAgICAgIyBVbmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgd2FzIGxvY2tlZAotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0JcmVtb3ZlbGlzdD0kbG9ja2ZpbGUKLSAgICAgICAgJFJNICIkbG9ja2ZpbGUiCi0gICAgICBmaQotICAgIH0KLQotICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotfQotCi0kb3B0X2hlbHAgfHwgewotdGVzdCAiJG1vZGUiID0gY29tcGlsZSAmJiBmdW5jX21vZGVfY29tcGlsZSAkezErIiRAIn0KLX0KLQotZnVuY19tb2RlX2hlbHAgKCkKLXsKLSAgICAjIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KLSAgICBjYXNlICRtb2RlIGluCi0gICAgICAiIikKLSAgICAgICAgIyBHZW5lcmljIGhlbHAgaXMgZXh0cmFjdGVkIGZyb20gdGhlIHVzYWdlIGNvbW1lbnRzCi0gICAgICAgICMgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZmlsZS4KLSAgICAgICAgZnVuY19oZWxwCi0gICAgICAgIDs7Ci0KLSAgICAgIGNsZWFuKQotICAgICAgICAkRUNITyBcCi0iVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y2xlYW4gUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgotCi1SZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5LgotCi1STSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKLSh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKLXRvIFJNLgotCi1JZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBvYmplY3Qgb3IgcHJvZ3JhbSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkCi13aXRoIGl0IGFyZSBkZWxldGVkLiBPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCi0gICAgICAgIDs7Ci0KLSAgICAgIGNvbXBpbGUpCi0gICAgICAkRUNITyBcCi0iVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQotCi1Db21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQotICAtbm8tc3VwcHJlc3MgICAgICBkbyBub3Qgc3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGZvciBtdWx0aXBsZSBwYXNzZXMKLSAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkaW5nIFBJQyBvYmplY3RzIG9ubHkKLSAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkaW5nIG5vbi1QSUMgb2JqZWN0cyBvbmx5Ci0gIC1zaGFyZWQgICAgICAgICAgIGRvIG5vdCBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCi0gIC1zdGF0aWMgICAgICAgICAgIG9ubHkgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZwotCi1DT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQotZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KLQotVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCi1TT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKLWxpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKLSAgICAgICAgOzsKLQotICAgICAgZXhlY3V0ZSkKLSAgICAgICAgJEVDSE8gXAotIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KLQotQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCi0KLVRoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKLWZsYWdzLgotCi1JZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCi1pbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKLWRpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgotCi1UaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKLSAgICAgICAgOzsKLQotICAgICAgZmluaXNoKQotICAgICAgICAkRUNITyBcCi0iVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCi0KLUNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCi0KLUVhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCi0KLVRoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQotdGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCi0gICAgICAgIDs7Ci0KLSAgICAgIGluc3RhbGwpCi0gICAgICAgICRFQ0hPIFwKLSJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgotCi1JbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KLQotSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCi1laXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KLQotVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIElOU1RBTEwtQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6Ci0KLSAgLWluc3QtcHJlZml4IFBSRUZJWC1ESVIgIFVzZSBQUkVGSVgtRElSIGFzIGEgc3RhZ2luZyBhcmVhIGZvciBpbnN0YWxsYXRpb24KLQotVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKLUJTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgotICAgICAgICA7OwotCi0gICAgICBsaW5rKQotICAgICAgICAkRUNITyBcCi0iVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KLQotTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bwotY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQotTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCi1hIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KLQotVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6Ci0KLSAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCi0gIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQotICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKLSAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gbHRfcHJlbG9hZGVkX3N5bWJvbHMKLSAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKLSAgLWV4cG9ydC1zeW1ib2xzIFNZTUZJTEUKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBTWU1GSUxFCi0gIC1leHBvcnQtc3ltYm9scy1yZWdleCBSRUdFWAotICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbWF0Y2hpbmcgUkVHRVgKLSAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcwotICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQotICAtbW9kdWxlICAgICAgICAgICBidWlsZCBhIGxpYnJhcnkgdGhhdCBjYW4gZGxvcGVuZWQKLSAgLW5vLWZhc3QtaW5zdGFsbCAgZGlzYWJsZSB0aGUgZmFzdC1pbnN0YWxsIG1vZGUKLSAgLW5vLWluc3RhbGwgICAgICAgbGluayBhIG5vdC1pbnN0YWxsYWJsZSBleGVjdXRhYmxlCi0gIC1uby11bmRlZmluZWQgICAgIGRlY2xhcmUgdGhhdCBhIGxpYnJhcnkgZG9lcyBub3QgcmVmZXIgdG8gZXh0ZXJuYWwgc3ltYm9scwotICAtbyBPVVRQVVQtRklMRSAgICBjcmVhdGUgT1VUUFVULUZJTEUgZnJvbSB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLSAgLW9iamVjdGxpc3QgRklMRSAgVXNlIGEgbGlzdCBvZiBvYmplY3QgZmlsZXMgZm91bmQgaW4gRklMRSB0byBzcGVjaWZ5IG9iamVjdHMKLSAgLXByZWNpb3VzLWZpbGVzLXJlZ2V4IFJFR0VYCi0gICAgICAgICAgICAgICAgICAgIGRvbid0IHJlbW92ZSBvdXRwdXQgZmlsZXMgbWF0Y2hpbmcgUkVHRVgKLSAgLXJlbGVhc2UgUkVMRUFTRSAgc3BlY2lmeSBwYWNrYWdlIHJlbGVhc2UgaW5mb3JtYXRpb24KLSAgLXJwYXRoIExJQkRJUiAgICAgdGhlIGNyZWF0ZWQgbGlicmFyeSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5zdGFsbGVkIGluIExJQkRJUgotICAtUlsgXUxJQkRJUiAgICAgICBhZGQgTElCRElSIHRvIHRoZSBydW50aW1lIHBhdGggb2YgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcwotICAtc2hhcmVkICAgICAgICAgICBvbmx5IGRvIGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAtc2hyZXh0IFNVRkZJWCAgICBvdmVycmlkZSB0aGUgc3RhbmRhcmQgc2hhcmVkIGxpYnJhcnkgZmlsZSBleHRlbnNpb24KLSAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKLSAgLXN0YXRpYy1saWJ0b29sLWxpYnMKLSAgICAgICAgICAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKLSAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KLSAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBsaWJyYXJ5IHZlcnNpb24gaW5mbyBbZWFjaCB2YXJpYWJsZSBkZWZhdWx0cyB0byAwXQotICAtd2VhayBMSUJOQU1FICAgICBkZWNsYXJlIHRoYXQgdGhlIHRhcmdldCBwcm92aWRlcyB0aGUgTElCTkFNRSBpbnRlcmZhY2UKLQotQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KLQotRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKLXRyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5Ci1vYmplY3QgZmlsZXMuCi0KLUlmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAotb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcwotcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCi11c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKLWlzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCi0gICAgICAgIDs7Ci0KLSAgICAgIHVuaW5zdGFsbCkKLSAgICAgICAgJEVDSE8gXAotIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCi0KLVJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCi1STSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKLSh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKLXRvIFJNLgotCi1JZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KLU90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKLSAgICAgICAgOzsKLQotICAgICAgKikKLSAgICAgICAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIgotICAgICAgICA7OwotICAgIGVzYWMKLQotICAgICRFQ0hPCi0gICAgJEVDSE8gIlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKLQotICAgIGV4aXQgJD8KLX0KLQotICAjIE5vdyB0aGF0IHdlJ3ZlIGNvbGxlY3RlZCBhIHBvc3NpYmxlIC0tbW9kZSBhcmcsIHNob3cgaGVscCBpZiBuZWNlc3NhcnkKLSAgJG9wdF9oZWxwICYmIGZ1bmNfbW9kZV9oZWxwCi0KLQotIyBmdW5jX21vZGVfZXhlY3V0ZSBhcmcuLi4KLWZ1bmNfbW9kZV9leGVjdXRlICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCi0gICAgY21kPSIkbm9ub3B0IgotICAgIHRlc3QgLXogIiRjbWQiICYmIFwKLSAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiCi0KLSAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgotICAgIGZvciBmaWxlIGluICRleGVjdXRlX2RsZmlsZXM7IGRvCi0gICAgICB0ZXN0IC1mICIkZmlsZSIgXAotCXx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkZmlsZScgaXMgbm90IGEgZmlsZSIKLQotICAgICAgZGlyPQotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5sYSkKLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRmaWxlIiBcCi0JICB8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgotCi0JIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCi0JZGxuYW1lPQotCWxpYnJhcnlfbmFtZXM9Ci0JZnVuY19zb3VyY2UgIiRmaWxlIgotCi0JIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCi0JaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KLQkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KLQkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiBcCi0JICAgIGZ1bmNfd2FybmluZyAiXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCi0JICBjb250aW51ZQotCWZpCi0KLQlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKLQlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCi0JaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCi0JICBkaXI9IiRkaXIvJG9iamRpciIKLQllbHNlCi0JICBpZiB0ZXN0ICEgLWYgIiRkaXIvJGRsbmFtZSI7IHRoZW4KLQkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgXGAkZGxuYW1lJyBpbiBcYCRkaXInIG9yIFxgJGRpci8kb2JqZGlyJyIKLQkgIGZpCi0JZmkKLQk7OwotCi0gICAgICAqLmxvKQotCSMgSnVzdCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAubG8gZmlsZS4KLQlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKLQlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCTs7Ci0KLSAgICAgICopCi0JZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG5vbi1saWJ0b29sIGxpYnJhcmllcyBhbmQgb2JqZWN0cyIKLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KLSAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLSAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKLQotICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KLSAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCi0JZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgotICAgICAgZWxzZQotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKLSAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCi0KLSAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCi0gICAgYXJncz0KLSAgICBmb3IgZmlsZQotICAgIGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAtKikgOzsKLSAgICAgICopCi0JIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotCWlmIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkZmlsZSI7IHRoZW4KLQkgIGZ1bmNfc291cmNlICIkZmlsZSIKLQkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCi0JICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKLQllbGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCi0JICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKLQkgIGZ1bmNfc291cmNlICIkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQiCi0JICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgotCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KLSAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmaWxlIgotICAgICAgYXJncz0iJGFyZ3MgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgIlgkb3B0X2RyeV9ydW4iID0gWGZhbHNlOyB0aGVuCi0gICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQkjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KLQlldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0gICAgICBmaQotCi0gICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0gICAgICBmb3IgbHRfdmFyIGluIExBTkcgTEFOR1VBR0UgTENfQUxMIExDX0NUWVBFIExDX0NPTExBVEUgTENfTUVTU0FHRVMKLSAgICAgIGRvCi0JZXZhbCAiaWYgdGVzdCBcIlwke3NhdmVfJGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KLSAgICAgICAgICAgICAgICAkbHRfdmFyPVwkc2F2ZV8kbHRfdmFyOyBleHBvcnQgJGx0X3ZhcgotCSAgICAgIGVsc2UKLQkJJGx0X3Vuc2V0ICRsdF92YXIKLQkgICAgICBmaSIKLSAgICAgIGRvbmUKLQotICAgICAgIyBOb3cgcHJlcGFyZSB0byBhY3R1YWxseSBleGVjIHRoZSBjb21tYW5kLgotICAgICAgZXhlY19jbWQ9IlwkY21kJGFyZ3MiCi0gICAgZWxzZQotICAgICAgIyBEaXNwbGF5IHdoYXQgd291bGQgYmUgZG9uZS4KLSAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCWV2YWwgIlwkRUNITyBcIlwkc2hsaWJwYXRoX3Zhcj1cJCRzaGxpYnBhdGhfdmFyXCIiCi0JJEVDSE8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLSAgICAgIGZpCi0gICAgICAkRUNITyAiJGNtZCRhcmdzIgotICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgZmkKLX0KLQotdGVzdCAiJG1vZGUiID0gZXhlY3V0ZSAmJiBmdW5jX21vZGVfZXhlY3V0ZSAkezErIiRAIn0KLQotCi0jIGZ1bmNfbW9kZV9maW5pc2ggYXJnLi4uCi1mdW5jX21vZGVfZmluaXNoICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgIGxpYmRpcnM9IiRub25vcHQiCi0gICAgYWRtaW5jbWRzPQotCi0gICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KLSAgICAgIGZvciBkaXIKLSAgICAgIGRvCi0JbGliZGlycz0iJGxpYmRpcnMgJGRpciIKLSAgICAgIGRvbmUKLQotICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KLQlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCi0JICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgotCSAgZnVuY19leGVjdXRlX2NtZHMgIiRmaW5pc2hfY21kcyIgJ2FkbWluY21kcz0iJGFkbWluY21kcwotJyIkY21kIiciJwotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgotCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgotCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKLQkgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkY21kcyIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCi0gICAgICAgJGNtZHMiCi0JZmkKLSAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCi0gICAgJG9wdF9zaWxlbnQgJiYgZXhpdCAkRVhJVF9TVUNDRVNTCi0KLSAgICAkRUNITyAiWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIHwgJFhzZWQKLSAgICAkRUNITyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgotICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0gICAgICAkRUNITyAiICAgJGxpYmRpciIKLSAgICBkb25lCi0gICAgJEVDSE8KLSAgICAkRUNITyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCi0gICAgJEVDSE8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgotICAgICRFQ0hPICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgdGhlIFxgLUxMSUJESVInIgotICAgICRFQ0hPICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAkRUNITyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgICRFQ0hPICIgICAgIGR1cmluZyBleGVjdXRpb24iCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0gICAgICAkRUNITyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICAkRUNITyAiICAgICBkdXJpbmcgbGlua2luZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgbGliZGlyPUxJQkRJUgotICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0gICAgICAkRUNITyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGFkbWluY21kcyI7IHRoZW4KLSAgICAgICRFQ0hPICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKLSAgICBmaQotICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgICAkRUNITyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCi0gICAgZmkKLSAgICAkRUNITwotCi0gICAgJEVDSE8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgotICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgIHNvbGFyaXMyLls2Nzg5XXxzb2xhcmlzMi4xWzAtOV0pCi0gICAgICAgICRFQ0hPICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSwgY3JsZSgxKSBhbmQgbGQuc28oOCkgbWFudWFsIgotCSRFQ0hPICJwYWdlcy4iCi0JOzsKLSAgICAgICopCi0gICAgICAgICRFQ0hPICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKLSAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgJEVDSE8gIlgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiB8ICRYc2VkCi0gICAgZXhpdCAkRVhJVF9TVUNDRVNTCi19Ci0KLXRlc3QgIiRtb2RlIiA9IGZpbmlzaCAmJiBmdW5jX21vZGVfZmluaXNoICR7MSsiJEAifQotCi0KLSMgZnVuY19tb2RlX2luc3RhbGwgYXJnLi4uCi1mdW5jX21vZGVfaW5zdGFsbCAoKQotewotICAgICRvcHRfZGVidWcKLSAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCBzaCgxKSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCi0gICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2ggfHwKLSAgICAgICAjIEFsbG93IHRoZSB1c2Ugb2YgR05VIHNodG9vbCdzIGluc3RhbGwgY29tbWFuZC4KLSAgICAgICAkRUNITyAiWCRub25vcHQiIHwgJEdSRVAgc2h0b29sID4vZGV2L251bGw7IHRoZW4KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRub25vcHQiCi0gICAgICBpbnN0YWxsX3Byb2c9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCAiCi0gICAgICBhcmc9JDEKLSAgICAgIHNoaWZ0Ci0gICAgZWxzZQotICAgICAgaW5zdGFsbF9wcm9nPQotICAgICAgYXJnPSRub25vcHQKLSAgICBmaQotCi0gICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgotICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQotICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KLSAgICBkZXN0PQotICAgIGZpbGVzPQotICAgIG9wdHM9Ci0gICAgcHJldj0KLSAgICBpbnN0YWxsX3R5cGU9Ci0gICAgaXNkaXI9bm8KLSAgICBzdHJpcG1lPQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCi0JZmlsZXM9IiRmaWxlcyAkZGVzdCIKLQlkZXN0PSRhcmcKLQljb250aW51ZQotICAgICAgZmkKLQotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtZCkgaXNkaXI9eWVzIDs7Ci0gICAgICAtZikKLQljYXNlICIgJGluc3RhbGxfcHJvZyAiIGluCi0JKltcXFwgL11jcFwgKikgOzsKLQkqKSBwcmV2PSRhcmcgOzsKLQllc2FjCi0JOzsKLSAgICAgIC1nIHwgLW0gfCAtbykKLQlwcmV2PSRhcmcKLQk7OwotICAgICAgLXMpCi0Jc3RyaXBtZT0iIC1zIgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIC0qKQotCTs7Ci0gICAgICAqKQotCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KLQlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQkgIHByZXY9Ci0JZWxzZQotCSAgZGVzdD0kYXJnCi0JICBjb250aW51ZQotCWZpCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KLSAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCi0gICAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2cgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotICAgIGRvbmUKLQotICAgIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciICYmIFwKLSAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsIHByb2dyYW0iCi0KLSAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAotICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgotCi0gICAgaWYgdGVzdCAteiAiJGZpbGVzIjsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiJGRlc3QiOyB0aGVuCi0JZnVuY19mYXRhbF9oZWxwICJubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKLSAgICAgIGVsc2UKLQlmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgotICAgIGZ1bmNfc3RyaXBuYW1lICcnICcvJyAiJGRlc3QiCi0gICAgZGVzdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0KLSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KLSAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCi0gICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgotICAgICAgZGVzdGRpcj0iJGRlc3QiCi0gICAgICBkZXN0bmFtZT0KLSAgICBlbHNlCi0gICAgICBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkZGVzdCIgIiIgIi4iCi0gICAgICBkZXN0ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLSAgICAgIGRlc3RuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0KLSAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KLSAgICAgIHNldCBkdW1teSAkZmlsZXM7IHNoaWZ0Ci0gICAgICB0ZXN0ICIkIyIgLWd0IDEgJiYgXAotCWZ1bmNfZmF0YWxfaGVscCAiXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IgotICAgIGZpCi0gICAgY2FzZSAkZGVzdGRpciBpbgotICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKLSAgICAqKQotICAgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCWNhc2UgJGZpbGUgaW4KLQkqLmxvKSA7OwotCSopCi0JICBmdW5jX2ZhdGFsX2hlbHAgIlxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiCi0JICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCi0gICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCi0KLSAgICBzdGF0aWNsaWJzPQotICAgIGZ1dHVyZV9saWJkaXJzPQotICAgIGN1cnJlbnRfbGliZGlycz0KLSAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0KLSAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLiRsaWJleHQpCi0JIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KLQlzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZmlsZSIKLQk7OwotCi0gICAgICAqLmxhKQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JZnVuY19sYWxpYl91bnNhZmVfcCAiJGZpbGUiIFwKLQkgIHx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgotCi0JbGlicmFyeV9uYW1lcz0KLQlvbGRfbGlicmFyeT0KLQlyZWxpbmtfY29tbWFuZD0KLQlmdW5jX3NvdXJjZSAiJGZpbGUiCi0KLQkjIEFkZCB0aGUgbGliZGlyIHRvIGN1cnJlbnRfbGliZGlycyBpZiBpdCBpcyB0aGUgZGVzdGluYXRpb24uCi0JaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KLQkgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGN1cnJlbnRfbGliZGlycz0iJGN1cnJlbnRfbGliZGlycyAkbGliZGlyIiA7OwotCSAgZXNhYwotCWVsc2UKLQkgICMgTm90ZSB0aGUgbGliZGlyIGFzIGEgZnV0dXJlIGxpYmRpci4KLQkgIGNhc2UgIiRmdXR1cmVfbGliZGlycyAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZnV0dXJlX2xpYmRpcnM9IiRmdXR1cmVfbGliZGlycyAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0KLQlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiLyIgIiIKLQlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCWRpcj0iJGRpciRvYmpkaXIiCi0KLQlpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAjIERldGVybWluZSB0aGUgcHJlZml4IHRoZSB1c2VyIGhhcyBhcHBsaWVkIHRvIG91ciBmdXR1cmUgZGlyLgotCSAgaW5zdF9wcmVmaXhfZGlyPWAkRUNITyAiWCRkZXN0ZGlyIiB8ICRYc2VkIC1lICJzJSRsaWJkaXJcJCUlImAKLQotCSAgIyBEb24ndCBhbGxvdyB0aGUgdXNlciB0byBwbGFjZSB1cyBvdXRzaWRlIG9mIG91ciBleHBlY3RlZAotCSAgIyBsb2NhdGlvbiBiL2MgdGhpcyBwcmV2ZW50cyBmaW5kaW5nIGRlcGVuZGVudCBsaWJyYXJpZXMgdGhhdAotCSAgIyBhcmUgaW5zdGFsbGVkIHRvIHRoZSBzYW1lIHByZWZpeC4KLQkgICMgQXQgcHJlc2VudCwgdGhpcyBjaGVjayBkb2Vzbid0IGFmZmVjdCB3aW5kb3dzIC5kbGwncyB0aGF0Ci0JICAjIGFyZSBpbnN0YWxsZWQgaW50byAkbGliZGlyLy4uL2JpbiAoY3VycmVudGx5LCB0aGF0IHdvcmtzIGZpbmUpCi0JICAjIGJ1dCBpdCdzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi4KLQkgIHRlc3QgIiRpbnN0X3ByZWZpeF9kaXIiID0gIiRkZXN0ZGlyIiAmJiBcCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgImVycm9yOiBjYW5ub3QgaW5zdGFsbCBcYCRmaWxlJyB0byBhIGRpcmVjdG9yeSBub3QgZW5kaW5nIGluICRsaWJkaXIiCi0KLQkgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCi0JICAgICMgU3RpY2sgdGhlIGluc3RfcHJlZml4X2RpciBkYXRhIGludG8gdGhlIGxpbmsgY29tbWFuZC4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBpbnN0X3ByZWZpeF9kaXJAJS1pbnN0LXByZWZpeC1kaXIgJGluc3RfcHJlZml4X2RpciUiYAotCSAgZWxzZQotCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQGluc3RfcHJlZml4X2RpckAlJSJgCi0JICBmaQotCi0JICBmdW5jX3dhcm5pbmcgInJlbGlua2luZyBcYCRmaWxlJyIKLQkgIGZ1bmNfc2hvd19ldmFsICIkcmVsaW5rX2NvbW1hbmQiIFwKLQkgICAgJ2Z1bmNfZmF0YWxfZXJyb3IgImVycm9yOiByZWxpbmsgXGAkZmlsZSdcJycgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCInCi0JZmkKLQotCSMgU2VlIHRoZSBuYW1lcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCi0Jc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzOyBzaGlmdAotCWlmIHRlc3QgLW4gIiQxIjsgdGhlbgotCSAgcmVhbG5hbWU9IiQxIgotCSAgc2hpZnQKLQotCSAgc3JjbmFtZT0iJHJlYWxuYW1lIgotCSAgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIiAmJiBzcmNuYW1lPSIkcmVhbG5hbWUiVAotCi0JICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCi0JICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgXAotCSAgICAgICdleGl0ICQ/JwotCSAgdHN0cmlwbWU9IiRzdHJpcG1lIgotCSAgY2FzZSAkaG9zdF9vcyBpbgotCSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQotCSAgICBjYXNlICRyZWFsbmFtZSBpbgotCSAgICAqLmRsbC5hKQotCSAgICAgIHRzdHJpcG1lPSIiCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICA7OwotCSAgZXNhYwotCSAgaWYgdGVzdCAtbiAiJHRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkc3RyaXBsaWIiOyB0aGVuCi0JICAgIGZ1bmNfc2hvd19ldmFsICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIiAnZXhpdCAkPycKLQkgIGZpCi0KLQkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgotCSAgICAjIERlbGV0ZSB0aGUgb2xkIHN5bWxpbmtzLCBhbmQgY3JlYXRlIG5ldyBvbmVzLgotCSAgICAjIFRyeSBgbG4gLXNmJyBmaXJzdCwgYmVjYXVzZSB0aGUgYGxuJyBiaW5hcnkgbWlnaHQgZGVwZW5kIG9uCi0JICAgICMgdGhlIHN5bWxpbmsgd2UgcmVwbGFjZSEgIFNvbGFyaXMgL2Jpbi9sbiBkb2VzIG5vdCB1bmRlcnN0YW5kIC1mLAotCSAgICAjIHNvIHdlIGFsc28gbmVlZCB0byB0cnkgcm0gJiYgbG4gLXMuCi0JICAgIGZvciBsaW5rbmFtZQotCSAgICBkbwotCSAgICAgIHRlc3QgIiRsaW5rbmFtZSIgIT0gIiRyZWFsbmFtZSIgXAotCQkmJiBmdW5jX3Nob3dfZXZhbCAiKGNkICRkZXN0ZGlyICYmIHsgJExOX1MgLWYgJHJlYWxuYW1lICRsaW5rbmFtZSB8fCB7ICRSTSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZTsgfTsgfSkiCi0JICAgIGRvbmUKLQkgIGZpCi0KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLQkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0aW5zdGFsbF9jbWRzIiAnZXhpdCAkPycKLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCi0JZnVuY19iYXNlbmFtZSAiJGZpbGUiCi0JbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKLQlmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiICdleGl0ICQ/JwotCi0JIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgotCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGRpci8kb2xkX2xpYnJhcnkiCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KLQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgotCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JY2FzZSAkZGVzdGZpbGUgaW4KLQkqLmxvKQotCSAgZnVuY19sbzJvICIkZGVzdGZpbGUiCi0JICBzdGF0aWNkZXN0PSRmdW5jX2xvMm9fcmVzdWx0Ci0JICA7OwotCSouJG9iamV4dCkKLQkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKLQkgIGRlc3RmaWxlPQotCSAgOzsKLQkqKQotCSAgZnVuY19mYXRhbF9oZWxwICJjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIKLQkgIDs7Ci0JZXNhYwotCi0JIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCi0JdGVzdCAtbiAiJGRlc3RmaWxlIiAmJiBcCi0JICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiICdleGl0ICQ/JwotCi0JIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCi0JaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLQkgIGZ1bmNfbG8ybyAiJGZpbGUiCi0JICBzdGF0aWNvYmo9JGZ1bmNfbG8yb19yZXN1bHQKLQkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgJ2V4aXQgJD8nCi0JZmkKLQlleGl0ICRFWElUX1NVQ0NFU1MKLQk7OwotCi0gICAgICAqKQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgotCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgSWYgdGhlIGZpbGUgaXMgbWlzc2luZywgYW5kIHRoZXJlIGlzIGEgLmV4ZSBvbiB0aGUgZW5kLCBzdHJpcCBpdAotCSMgYmVjYXVzZSBpdCBpcyBtb3N0IGxpa2VseSBhIGxpYnRvb2wgc2NyaXB0IHdlIGFjdHVhbGx5IHdhbnQgdG8KLQkjIGluc3RhbGwKLQlzdHJpcHBlZF9leHQ9IiIKLQljYXNlICRmaWxlIGluCi0JICAqLmV4ZSkKLQkgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KLQkgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgotCSAgICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgICAgIHN0cmlwcGVkX2V4dD0iLmV4ZSIKLQkgICAgZmkKLQkgICAgOzsKLQllc2FjCi0KLQkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0JY2FzZSAkaG9zdCBpbgotCSpjeWd3aW4qfCptaW5ndyopCi0JICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCi0JICAgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCi0JICAgICAgd3JhcHBlcj0kZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKLQkgICAgZWxzZQotCSAgICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCi0JICAgICAgd3JhcHBlcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JICAgIGZpCi0JICAgIDs7Ci0JKikKLQkgICAgd3JhcHBlcj0kZmlsZQotCSAgICA7OwotCWVzYWMKLQlpZiBmdW5jX2x0d3JhcHBlcl9zY3JpcHRfcCAiJHdyYXBwZXIiOyB0aGVuCi0JICBub3RpbnN0X2RlcGxpYnM9Ci0JICByZWxpbmtfY29tbWFuZD0KLQotCSAgZnVuY19zb3VyY2UgIiR3cmFwcGVyIgotCi0JICAjIENoZWNrIHRoZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHNldC4KLQkgIHRlc3QgLXogIiRnZW5lcmF0ZWRfYnlfbGlidG9vbF92ZXJzaW9uIiAmJiBcCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCR3cmFwcGVyJyIKLQotCSAgZmluYWxpemU9eWVzCi0JICBmb3IgbGliIGluICRub3RpbnN0X2RlcGxpYnM7IGRvCi0JICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KLQkgICAgbGliZGlyPQotCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgotCSAgICAgIGZ1bmNfc291cmNlICIkbGliIgotCSAgICBmaQotCSAgICBsaWJmaWxlPSIkbGliZGlyLyJgJEVDSE8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKLQkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KLQkgICAgICBmdW5jX3dhcm5pbmcgIlxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIgotCSAgICAgIGZpbmFsaXplPW5vCi0JICAgIGZpCi0JICBkb25lCi0KLQkgIHJlbGlua19jb21tYW5kPQotCSAgZnVuY19zb3VyY2UgIiR3cmFwcGVyIgotCi0JICBvdXRwdXRuYW1lPQotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JICAgICRvcHRfZHJ5X3J1biB8fCB7Ci0JICAgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllczsgdGhlbgotCSAgICAgICAgdG1wZGlyPWBmdW5jX21rdGVtcGRpcmAKLQkJZnVuY19iYXNlbmFtZSAiJGZpbGUkc3RyaXBwZWRfZXh0IgotCQlmaWxlPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0JICAgICAgICBvdXRwdXRuYW1lPSIkdG1wZGlyLyRmaWxlIgotCSAgICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCSAgICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dG5hbWUiJyVnJ2AKLQotCSAgICAgICAgJG9wdF9zaWxlbnQgfHwgewotCSAgICAgICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRyZWxpbmtfY29tbWFuZCIKLQkJICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCi0JICAgICAgICB9Ci0JICAgICAgICBpZiBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKLQkgICAgICAgICAgZWxzZQotCQkgIGZ1bmNfZXJyb3IgImVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIKLQkJICAkb3B0X2RyeV9ydW4gfHwgJHtSTX1yICIkdG1wZGlyIgotCQkgIGNvbnRpbnVlCi0JICAgICAgICBmaQotCSAgICAgICAgZmlsZT0iJG91dHB1dG5hbWUiCi0JICAgICAgZWxzZQotCSAgICAgICAgZnVuY193YXJuaW5nICJjYW5ub3QgcmVsaW5rIFxgJGZpbGUnIgotCSAgICAgIGZpCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgotCSAgICBmaWxlPWAkRUNITyAiWCRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKLQkgIGZpCi0JZmkKLQotCSMgcmVtb3ZlIC5leGUgc2luY2UgY3lnd2luIC91c3IvYmluL2luc3RhbGwgd2lsbCBhcHBlbmQgYW5vdGhlcgotCSMgb25lIGFueXdheQotCWNhc2UgJGluc3RhbGxfcHJvZywkaG9zdCBpbgotCSovdXNyL2Jpbi9pbnN0YWxsKiwqY3lnd2luKikKLQkgIGNhc2UgJGZpbGU6JGRlc3RmaWxlIGluCi0JICAqLmV4ZToqLmV4ZSkKLQkgICAgIyB0aGlzIGlzIG9rCi0JICAgIDs7Ci0JICAqLmV4ZToqKQotCSAgICBkZXN0ZmlsZT0kZGVzdGZpbGUuZXhlCi0JICAgIDs7Ci0JICAqOiouZXhlKQotCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRkZXN0ZmlsZSIKLQkgICAgZGVzdGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2dcJHN0cmlwbWUgXCRmaWxlIFwkZGVzdGZpbGUiICdleGl0ICQ/JwotCSRvcHRfZHJ5X3J1biB8fCBpZiB0ZXN0IC1uICIkb3V0cHV0bmFtZSI7IHRoZW4KLQkgICR7Uk19ciAiJHRtcGRpciIKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCi0gICAgICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKLSAgICAgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQotICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgotICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKLQotICAgICAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgXCRmaWxlIFwkb2xkbGliIiAnZXhpdCAkPycKLQotICAgICAgaWYgdGVzdCAtbiAiJHN0cmlwbWUiICYmIHRlc3QgLW4gIiRvbGRfc3RyaXBsaWIiOyB0aGVuCi0JZnVuY19zaG93X2V2YWwgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIgJ2V4aXQgJD8nCi0gICAgICBmaQotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0gICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9wb3N0aW5zdGFsbF9jbWRzIiAnZXhpdCAkPycKLSAgICBkb25lCi0KLSAgICB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiICYmIFwKLSAgICAgIGZ1bmNfd2FybmluZyAicmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIKLQotICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCi0gICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgotICAgICAgJG9wdF9kcnlfcnVuICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKLSAgICAgIGV4ZWNfY21kPSckU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycycKLSAgICBlbHNlCi0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICBmaQotfQotCi10ZXN0ICIkbW9kZSIgPSBpbnN0YWxsICYmIGZ1bmNfbW9kZV9pbnN0YWxsICR7MSsiJEAifQotCi0KLSMgZnVuY19nZW5lcmF0ZV9kbHN5bXMgb3V0cHV0bmFtZSBvcmlnaW5hdG9yIHBpY19wCi0jIEV4dHJhY3Qgc3ltYm9scyBmcm9tIGRscHJlZmlsZXMgYW5kIGNyZWF0ZSAke291dHB1dG5hbWV9Uy5vIHdpdGgKLSMgYSBkbHByZW9wZW4gc3ltYm9sIHRhYmxlLgotZnVuY19nZW5lcmF0ZV9kbHN5bXMgKCkKLXsKLSAgICAkb3B0X2RlYnVnCi0gICAgbXlfb3V0cHV0bmFtZT0iJDEiCi0gICAgbXlfb3JpZ2luYXRvcj0iJDIiCi0gICAgbXlfcGljX3A9IiR7My1ub30iCi0gICAgbXlfcHJlZml4PWAkRUNITyAiJG15X29yaWdpbmF0b3IiIHwgc2VkICdzJVteYS16QS1aMC05XSVfJWcnYAotICAgIG15X2Rsc3ltcz0KLQotICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCi0gICAgICBpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JbXlfZGxzeW1zPSIke215X291dHB1dG5hbWV9Uy5jIgotICAgICAgZWxzZQotCWZ1bmNfZXJyb3IgIm5vdCBjb25maWd1cmVkIHRvIGV4dHJhY3QgZ2xvYmFsIHN5bWJvbHMgZnJvbSBkbHByZW9wZW5lZCBmaWxlcyIKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRteV9kbHN5bXMiOyB0aGVuCi0gICAgICBjYXNlICRteV9kbHN5bXMgaW4KLSAgICAgICIiKSA7OwotICAgICAgKi5jKQotCSMgRGlzY292ZXIgdGhlIG5saXN0IG9mIGVhY2ggb2YgdGhlIGRsZmlsZXMuCi0Jbmxpc3Q9IiRvdXRwdXRfb2JqZGlyLyR7bXlfb3V0cHV0bmFtZX0ubm0iCi0KLQlmdW5jX3Nob3dfZXZhbCAiJFJNICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgotCi0JIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KLQlmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCi0KLQkkb3B0X2RyeV9ydW4gfHwgJEVDSE8gPiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKLS8qICRteV9kbHN5bXMgLSBzeW1ib2wgcmVzb2x1dGlvbiB0YWJsZSBmb3IgXGAkbXlfb3V0cHV0bmFtZScgZGxzeW0gZW11bGF0aW9uLiAqLwotLyogR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiBcIkNcIiB7Ci0jZW5kaWYKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKLSIKLQotCWlmIHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCi0JICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJG91dHB1dCciCi0KLQkgICRvcHRfZHJ5X3J1biB8fCBlY2hvICc6IEBQUk9HUkFNQCAnID4gIiRubGlzdCIKLQotCSAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgotCSAgcHJvZ2ZpbGVzPWAkRUNITyAiWCRvYmpzJG9sZF9kZXBsaWJzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JICBmb3IgcHJvZ2ZpbGUgaW4gJHByb2dmaWxlczsgZG8KLQkgICAgZnVuY192ZXJib3NlICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRwcm9nZmlsZSciCi0JICAgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkTk0gJHByb2dmaWxlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgIGRvbmUKLQotCSAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgICBldmFsICckRUdSRVAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICB9Ci0JICBmaQotCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCi0JICAgICRvcHRfZHJ5X3J1biB8fCB7Ci0JICAgICAgZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgIGV2YWwgJyRNViAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgIH0KLQkgIGZpCi0KLQkgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCi0JICBpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiCi0JICAgICRvcHRfZHJ5X3J1biB8fCB7Ci0JICAgICAgJFJNICRleHBvcnRfc3ltYm9scwotCSAgICAgIGV2YWwgIiR7U0VEfSAtbiAtZSAnL146IEBQUk9HUkFNQCAkL2QnIC1lICdzL14uKiBcKC4qXCkkL1wxL3AnICInPCAiJG5saXN0IiA+ICIkZXhwb3J0X3N5bWJvbHMiJwotCSAgICAgIGNhc2UgJGhvc3QgaW4KLQkgICAgICAqY3lnd2luKiB8ICptaW5ndyogKQotICAgICAgICAgICAgICAgIGV2YWwgImVjaG8gRVhQT1JUUyAiJz4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCi0gICAgICAgICAgICAgICAgZXZhbCAnY2F0ICIkZXhwb3J0X3N5bWJvbHMiID4+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJwotCSAgICAgICAgOzsKLQkgICAgICBlc2FjCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgICBldmFsICIke1NFRH0gLWUgJ3MvXChbXS5bKl4kXVwpL1xcXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIicKLQkgICAgICBldmFsICckR1JFUCAtZiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIiA8ICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgIGV2YWwgJyRNViAiJG5saXN0IlQgIiRubGlzdCInCi0JICAgICAgY2FzZSAkaG9zdCBpbgotCSAgICAgICAgKmN5Z3dpbiB8ICptaW5ndyogKQotCSAgICAgICAgICBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJwotCSAgICAgICAgICBldmFsICdjYXQgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCi0JICAgICAgICAgIDs7Ci0JICAgICAgZXNhYwotCSAgICB9Ci0JICBmaQotCWZpCi0KLQlmb3IgZGxwcmVmaWxlIGluICRkbHByZWZpbGVzOyBkbwotCSAgZnVuY192ZXJib3NlICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRkbHByZWZpbGUnIgotCSAgZnVuY19iYXNlbmFtZSAiJGRscHJlZmlsZSIKLQkgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkgICRvcHRfZHJ5X3J1biB8fCB7Ci0JICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCi0JICAgIGV2YWwgIiROTSAkZGxwcmVmaWxlIDI+L2Rldi9udWxsIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgIH0KLQlkb25lCi0KLQkkb3B0X2RyeV9ydW4gfHwgewotCSAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgotCSAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKLQotCSAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICAgJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKLQkgICAgJE1WICIkbmxpc3QiVCAiJG5saXN0IgotCSAgZmkKLQotCSAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLQkgIGlmICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgfAotCSAgICAgIGlmIHNvcnQgLWsgMyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlzb3J0IC1rIDMKLQkgICAgICBlbHNlCi0JCXNvcnQgKzIKLQkgICAgICBmaSB8Ci0JICAgICAgdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgotCSAgICA6Ci0JICBlbHNlCi0JICAgICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKLQkgIGZpCi0KLQkgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCi0JICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiJwotCSAgZWxzZQotCSAgICAkRUNITyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCi0JICBmaQotCi0JICAkRUNITyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICB2b2lkICphZGRyZXNzOwotfSBsdF9kbHN5bWxpc3Q7Ci0iCi0JICBjYXNlICRob3N0IGluCi0JICAqY3lnd2luKiB8ICptaW5ndyogKQotCSAgICAkRUNITyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKLS8qIERBVEEgaW1wb3J0cyBmcm9tIERMTHMgb24gV0lOMzIgY29uJ3QgYmUgY29uc3QsIGJlY2F1c2UKLSAgIHJ1bnRpbWUgcmVsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCAtLSBzZWUgbGQncyBkb2N1bWVudGF0aW9uCi0gICBvbiBwc2V1ZG8tcmVsb2NzLiAgKi8iCi0JICAgIGx0X2Rsc3ltX2NvbnN0PSA7OwotCSAgKm9zZjUqKQotCSAgICBlY2hvID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAotLyogVGhpcyBzeXN0ZW0gZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggcmVsb2NhdGlvbnMgaW4gY29uc3QgZGF0YSAqLyIKLQkgICAgbHRfZGxzeW1fY29uc3Q9IDs7Ci0JICAqKQotCSAgICBsdF9kbHN5bV9jb25zdD1jb25zdCA7OwotCSAgZXNhYwotCi0JICAkRUNITyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKLWV4dGVybiAkbHRfZGxzeW1fY29uc3QgbHRfZGxzeW1saXN0Ci1sdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW107Ci0kbHRfZGxzeW1fY29uc3QgbHRfZGxzeW1saXN0Ci1sdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW10gPQote1wKLSAgeyBcIiRteV9vcmlnaW5hdG9yXCIsICh2b2lkICopIDAgfSwiCi0KLQkgIGNhc2UgJG5lZWRfbGliX3ByZWZpeCBpbgotCSAgbm8pCi0JICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgotCSAgICA7OwotCSAgKikKLQkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeCIgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKLQkgICAgOzsKLQkgIGVzYWMKLQkgICRFQ0hPID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAotICB7MCwgKHZvaWQgKikgMH0KLX07Ci0KLS8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLwotI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAotc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKLSAgcmV0dXJuIGx0XyR7bXlfcHJlZml4fV9MVFhfcHJlbG9hZGVkX3N5bWJvbHM7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWZcCi0iCi0JfSAjICEkb3B0X2RyeV9ydW4KLQotCXBpY19mbGFnX2Zvcl9zeW10YWJsZT0KLQljYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkqIiAtc3RhdGljICIqKSA7OwotCSopCi0JICBjYXNlICRob3N0IGluCi0JICAjIGNvbXBpbGluZyB0aGUgc3ltYm9sIHRhYmxlIGZpbGUgd2l0aCBwaWNfZmxhZyB3b3JrcyBhcm91bmQKLQkgICMgYSBGcmVlQlNEIGJ1ZyB0aGF0IGNhdXNlcyBwcm9ncmFtcyB0byBjcmFzaCB3aGVuIC1sbSBpcwotCSAgIyBsaW5rZWQgYmVmb3JlIGFueSBvdGhlciBQSUMgb2JqZWN0LiAgQnV0IHdlIG11c3Qgbm90IHVzZQotCSAgIyBwaWNfZmxhZyB3aGVuIGxpbmtpbmcgd2l0aCAtc3RhdGljLiAgVGhlIHByb2JsZW0gZXhpc3RzIGluCi0JICAjIEZyZWVCU0QgMi4yLjYgYW5kIGlzIGZpeGVkIGluIEZyZWVCU0QgMy4xLgotCSAgKi0qLWZyZWVic2QyKnwqLSotZnJlZWJzZDMuMCp8Ki0qLWZyZWVic2RlbGYzLjAqKQotCSAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURGUkVFQlNEX1dPUktBUk9VTkQiIDs7Ci0JICAqLSotaHB1eCopCi0JICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyIgIDs7Ci0JICAqKQotCSAgICBpZiB0ZXN0ICJYJG15X3BpY19wIiAhPSBYbm87IHRoZW4KLQkgICAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWciCi0JICAgIGZpCi0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLQlzeW10YWJfY2ZsYWdzPQotCWZvciBhcmcgaW4gJExUQ0ZMQUdTOyBkbwotCSAgY2FzZSAkYXJnIGluCi0JICAtcGllIHwgLWZwaWUgfCAtZlBJRSkgOzsKLQkgICopIHN5bXRhYl9jZmxhZ3M9IiRzeW10YWJfY2ZsYWdzICRhcmciIDs7Ci0JICBlc2FjCi0JZG9uZQotCi0JIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KLQlmdW5jX3Nob3dfZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDJHN5bXRhYl9jZmxhZ3MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJG15X2Rsc3ltcyIpJyAnZXhpdCAkPycKLQotCSMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBmaWxlcy4KLQlmdW5jX3Nob3dfZXZhbCAnJFJNICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIicKLQotCSMgVHJhbnNmb3JtIHRoZSBzeW1ib2wgZmlsZSBpbnRvIHRoZSBjb3JyZWN0IG5hbWUuCi0Jc3ltZmlsZW9iaj0iJG91dHB1dF9vYmpkaXIvJHtteV9vdXRwdXRuYW1lfVMuJG9iamV4dCIKLQljYXNlICRob3N0IGluCi0JKmN5Z3dpbiogfCAqbWluZ3cqICkKLQkgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiI7IHRoZW4KLQkgICAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiAkc3ltZmlsZW9iaiUiYAotCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8kbXlfb3V0cHV0bmFtZS5kZWYgJHN5bWZpbGVvYmolImAKLQkgIGVsc2UKLQkgICAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCi0JICBmaQotCSAgOzsKLQkqKQotCSAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCi0JICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAotCSAgOzsKLQllc2FjCi0JOzsKLSAgICAgICopCi0JZnVuY19mYXRhbF9lcnJvciAidW5rbm93biBzdWZmaXggZm9yIFxgJG15X2Rsc3ltcyciCi0JOzsKLSAgICAgIGVzYWMKLSAgICBlbHNlCi0gICAgICAjIFdlIGtlZXAgZ29pbmcganVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCByZWZlciB0bwotICAgICAgIyBsdF9wcmVsb2FkZWRfc3ltYm9scy4gIFRoZSBsaW5rZXIgd2lsbCBmYWlsIGlmIGdsb2JhbF9zeW1ib2xfcGlwZQotICAgICAgIyByZWFsbHkgd2FzIHJlcXVpcmVkLgotCi0gICAgICAjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgotICAgICAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICBmaQotfQotCi0jIGZ1bmNfd2luMzJfbGliaWQgYXJnCi0jIHJldHVybiB0aGUgbGlicmFyeSB0eXBlIG9mIGZpbGUgJ2FyZycKLSMKLSMgTmVlZCBhIGxvdCBvZiBnb28gdG8gaGFuZGxlICpib3RoKiBETExzIGFuZCBpbXBvcnQgbGlicwotIyBIYXMgdG8gYmUgYSBzaGVsbCBmdW5jdGlvbiBpbiBvcmRlciB0byAnZWF0JyB0aGUgYXJndW1lbnQKLSMgdGhhdCBpcyBzdXBwbGllZCB3aGVuICRmaWxlX21hZ2ljX2NvbW1hbmQgaXMgY2FsbGVkLgotZnVuY193aW4zMl9saWJpZCAoKQotewotICAkb3B0X2RlYnVnCi0gIHdpbjMyX2xpYmlkX3R5cGU9InVua25vd24iCi0gIHdpbjMyX2ZpbGVyZXM9YGZpbGUgLUwgJDEgMj4vZGV2L251bGxgCi0gIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KLSAgKmFyXCBhcmNoaXZlXCBpbXBvcnRcIGxpYnJhcnkqKSAjIGRlZmluaXRlbHkgaW1wb3J0Ci0gICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0IgotICAgIDs7Ci0gICphclwgYXJjaGl2ZSopICMgY291bGQgYmUgYW4gaW1wb3J0LCBvciBzdGF0aWMKLSAgICBpZiBldmFsICRPQkpEVU1QIC1mICQxIHwgJFNFRCAtZSAnMTBxJyAyPi9kZXYvbnVsbCB8Ci0gICAgICAgJEVHUkVQICdmaWxlIGZvcm1hdCBwZS1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nID4vZGV2L251bGwgOyB0aGVuCi0gICAgICB3aW4zMl9ubXJlcz1gZXZhbCAkTk0gLWYgcG9zaXggLUEgJDEgfAotCSRTRUQgLW4gLWUgJwotCSAgICAxLDEwMHsKLQkJLyBJIC97Ci0JCSAgICBzLC4qLGltcG9ydCwKLQkJICAgIHAKLQkJICAgIHEKLQkJfQotCSAgICB9J2AKLSAgICAgIGNhc2UgJHdpbjMyX25tcmVzIGluCi0gICAgICBpbXBvcnQqKSAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0Ijs7Ci0gICAgICAqKSAgICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgc3RhdGljIjs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgICA7OwotICAqRExMKikKLSAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgRExMIgotICAgIDs7Ci0gICpleGVjdXRhYmxlKikgIyBidXQgc2hlbGwgc2NyaXB0cyBhcmUgImV4ZWN1dGFibGUiIHRvby4uLgotICAgIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KLSAgICAqTVNcIFdpbmRvd3NcIFBFXCBJbnRlbCopCi0gICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgRExMIgotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLSAgZXNhYwotICAkRUNITyAiJHdpbjMyX2xpYmlkX3R5cGUiCi19Ci0KLQotCi0jIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlIGRpciBvbGRsaWIKLWZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICgpCi17Ci0gICAgJG9wdF9kZWJ1ZwotICAgIGZfZXhfYW5fYXJfZGlyPSIkMSI7IHNoaWZ0Ci0gICAgZl9leF9hbl9hcl9vbGRsaWI9IiQxIgotICAgIGZ1bmNfc2hvd19ldmFsICIoY2QgXCRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCBcIlwkZl9leF9hbl9hcl9vbGRsaWJcIikiICdleGl0ICQ/JwotICAgIGlmICgkQVIgdCAiJGZfZXhfYW5fYXJfb2xkbGliIiB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCi0gICAgIDoKLSAgICBlbHNlCi0gICAgICBmdW5jX2ZhdGFsX2Vycm9yICJvYmplY3QgbmFtZSBjb25mbGljdHMgaW4gYXJjaGl2ZTogJGZfZXhfYW5fYXJfZGlyLyRmX2V4X2FuX2FyX29sZGxpYiIKLSAgICBmaQotfQotCi0KLSMgZnVuY19leHRyYWN0X2FyY2hpdmVzIGdlbnRvcCBvbGRsaWIgLi4uCi1mdW5jX2V4dHJhY3RfYXJjaGl2ZXMgKCkKLXsKLSAgICAkb3B0X2RlYnVnCi0gICAgbXlfZ2VudG9wPSIkMSI7IHNoaWZ0Ci0gICAgbXlfb2xkbGlicz0kezErIiRAIn0KLSAgICBteV9vbGRvYmpzPSIiCi0gICAgbXlfeGxpYj0iIgotICAgIG15X3hhYnM9IiIKLSAgICBteV94ZGlyPSIiCi0KLSAgICBmb3IgbXlfeGxpYiBpbiAkbXlfb2xkbGliczsgZG8KLSAgICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KLSAgICAgIGNhc2UgJG15X3hsaWIgaW4KLQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIG15X3hhYnM9IiRteV94bGliIiA7OwotCSopIG15X3hhYnM9YHB3ZGAiLyRteV94bGliIiA7OwotICAgICAgZXNhYwotICAgICAgZnVuY19iYXNlbmFtZSAiJG15X3hsaWIiCi0gICAgICBteV94bGliPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0gICAgICBteV94bGliX3U9JG15X3hsaWIKLSAgICAgIHdoaWxlIDo7IGRvCi0gICAgICAgIGNhc2UgIiAkZXh0cmFjdGVkX2FyY2hpdmVzICIgaW4KLQkqIiAkbXlfeGxpYl91ICIqKQotCSAgZnVuY19hcml0aCAkZXh0cmFjdGVkX3NlcmlhbCArIDEKLQkgIGV4dHJhY3RlZF9zZXJpYWw9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JICBteV94bGliX3U9bHQkZXh0cmFjdGVkX3NlcmlhbC0kbXlfeGxpYiA7OwotCSopIGJyZWFrIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgZXh0cmFjdGVkX2FyY2hpdmVzPSIkZXh0cmFjdGVkX2FyY2hpdmVzICRteV94bGliX3UiCi0gICAgICBteV94ZGlyPSIkbXlfZ2VudG9wLyRteV94bGliX3UiCi0KLSAgICAgIGZ1bmNfbWtkaXJfcCAiJG15X3hkaXIiCi0KLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICotZGFyd2luKikKLQlmdW5jX3ZlcmJvc2UgIkV4dHJhY3RpbmcgJG15X3hhYnMiCi0JIyBEbyBub3QgYm90aGVyIGRvaW5nIGFueXRoaW5nIGlmIGp1c3QgYSBkcnkgcnVuCi0JJG9wdF9kcnlfcnVuIHx8IHsKLQkgIGRhcndpbl9vcmlnX2Rpcj1gcHdkYAotCSAgY2QgJG15X3hkaXIgfHwgZXhpdCAkPwotCSAgZGFyd2luX2FyY2hpdmU9JG15X3hhYnMKLQkgIGRhcndpbl9jdXJkaXI9YHB3ZGAKLQkgIGRhcndpbl9iYXNlX2FyY2hpdmU9YGJhc2VuYW1lICIkZGFyd2luX2FyY2hpdmUiYAotCSAgZGFyd2luX2FyY2hlcz1gJExJUE8gLWluZm8gIiRkYXJ3aW5fYXJjaGl2ZSIgMj4vZGV2L251bGwgfCAkR1JFUCBBcmNoaXRlY3R1cmVzIDI+L2Rldi9udWxsIHx8IHRydWVgCi0JICBpZiB0ZXN0IC1uICIkZGFyd2luX2FyY2hlcyI7IHRoZW4KLQkgICAgZGFyd2luX2FyY2hlcz1gJEVDSE8gIiRkYXJ3aW5fYXJjaGVzIiB8ICRTRUQgLWUgJ3MvLiphcmU6Ly8nYAotCSAgICBkYXJ3aW5fYXJjaD0KLQkgICAgZnVuY192ZXJib3NlICIkZGFyd2luX2Jhc2VfYXJjaGl2ZSBoYXMgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAkZGFyd2luX2FyY2hlcyIKLQkgICAgZm9yIGRhcndpbl9hcmNoIGluICAkZGFyd2luX2FyY2hlcyA7IGRvCi0JICAgICAgZnVuY19ta2Rpcl9wICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgotCSAgICAgICRMSVBPIC10aGluICRkYXJ3aW5fYXJjaCAtb3V0cHV0ICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iICIke2Rhcndpbl9hcmNoaXZlfSIKLQkgICAgICBjZCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKLQkgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiYHB3ZGAiICIke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgotCSAgICAgIGNkICIkZGFyd2luX2N1cmRpciIKLQkgICAgICAkUk0gInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKLQkgICAgZG9uZSAjICRkYXJ3aW5fYXJjaGVzCi0gICAgICAgICAgICAjIyBPa2F5IG5vdyB3ZSd2ZSBhIGJ1bmNoIG9mIHRoaW4gb2JqZWN0cywgZ290dGEgZmF0dGVuIHRoZW0gdXAgOikKLQkgICAgZGFyd2luX2ZpbGVsaXN0PWBmaW5kIHVuZmF0LSQkIC10eXBlIGYgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJFNFRCAtZSAiJGJhc2VuYW1lIiB8IHNvcnQgLXVgCi0JICAgIGRhcndpbl9maWxlPQotCSAgICBkYXJ3aW5fZmlsZXM9Ci0JICAgIGZvciBkYXJ3aW5fZmlsZSBpbiAkZGFyd2luX2ZpbGVsaXN0OyBkbwotCSAgICAgIGRhcndpbl9maWxlcz1gZmluZCB1bmZhdC0kJCAtbmFtZSAkZGFyd2luX2ZpbGUgLXByaW50IHwgJE5MMlNQYAotCSAgICAgICRMSVBPIC1jcmVhdGUgLW91dHB1dCAiJGRhcndpbl9maWxlIiAkZGFyd2luX2ZpbGVzCi0JICAgIGRvbmUgIyAkZGFyd2luX2ZpbGVsaXN0Ci0JICAgICRSTSAtcmYgdW5mYXQtJCQKLQkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCi0JICBlbHNlCi0JICAgIGNkICRkYXJ3aW5fb3JpZ19kaXIKLQkgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCi0JICBmaSAjICRkYXJ3aW5fYXJjaGVzCi0JfSAjICEkb3B0X2RyeV9ydW4KLQk7OwotICAgICAgKikKLSAgICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIG15X29sZG9ianM9IiRteV9vbGRvYmpzICJgZmluZCAkbXlfeGRpciAtbmFtZSBcKi4kb2JqZXh0IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCi0gICAgZG9uZQotCi0gICAgZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdD0iJG15X29sZG9ianMiCi19Ci0KLQotCi0jIGZ1bmNfZW1pdF93cmFwcGVyIGFyZwotIwotIyBlbWl0IGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvbiBzdGRvdXQKLSMgZG9uJ3QgZGlyZWN0bHkgb3BlbiBhIGZpbGUgYmVjYXVzZSB3ZSBtYXkgd2FudCB0bwotIyBpbmNvcnBvcmF0ZSB0aGUgc2NyaXB0IGNvbnRlbnRzIHdpdGhpbiBhIGN5Z3dpbi9taW5ndwotIyB3cmFwcGVyIGV4ZWN1dGFibGUuICBNdXN0IE9OTFkgYmUgY2FsbGVkIGZyb20gd2l0aGluCi0jIGZ1bmNfbW9kZV9saW5rIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIG51bWJlciBvZiB2YXJpYWJsZQotIyBzZXQgdGhlcmVpbi4KLSMKLSMgYXJnIGlzIHRoZSB2YWx1ZSB0aGF0IHRoZSBXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUgotIyB2YXJpYWJsZSB3aWxsIHRha2UuICBJZiAneWVzJywgdGhlbiB0aGUgZW1pdHRlZCBzY3JpcHQKLSMgd2lsbCBhc3N1bWUgdGhhdCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGl0IGlzIHN0b3JlZCBpcwotIyB0aGUgJy5saWInIGRpcmVjdG9yeS4gIFRoaXMgaXMgYSBjeWd3aW4vbWluZ3ctc3BlY2lmaWMKLSMgYmVoYXZpb3IuCi1mdW5jX2VtaXRfd3JhcHBlciAoKQotewotCWZ1bmNfZW1pdF93cmFwcGVyX2FyZzE9bm8KLQlpZiB0ZXN0IC1uICIkMSIgOyB0aGVuCi0JICBmdW5jX2VtaXRfd3JhcHBlcl9hcmcxPSQxCi0JZmkKLQotCSRFQ0hPICJcCi0jISAkU0hFTEwKLQotIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KLSMKLSMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCi0jIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KLSMKLSMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0jIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9JyR7U0VEfSAtZSAxcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwotCi0jIEJlIEJvdXJuZSBjb21wYXRpYmxlCi1pZiB0ZXN0IC1uIFwiXCR7WlNIX1ZFUlNJT04rc2V0fVwiICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKLSAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAqcG9zaXgqKSBzZXQgLW8gcG9zaXg7OyBlc2FjCi1maQotQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLSh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKLQotcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIgotCi0jIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCi1pZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6Ci0gIGdlbmVyYXRlZF9ieV9saWJ0b29sX3ZlcnNpb249JyRtYWNyb192ZXJzaW9uJwotICBub3RpbnN0X2RlcGxpYnM9JyRub3RpbnN0X2RlcGxpYnMnCi1lbHNlCi0gICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRFQ0hPIGFyZSBhbHJlYWR5IHNldC4KLSAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgIEVDSE89XCIkcWVjaG9cIgotICAgIGZpbGU9XCJcJDBcIgotICAgICMgTWFrZSBzdXJlIGVjaG8gd29ya3MuCi0gICAgaWYgdGVzdCBcIlhcJDFcIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAgICAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gICAgICBzaGlmdAotICAgIGVsaWYgdGVzdCBcIlhcYHsgXCRFQ0hPICdcdCc7IH0gMj4vZGV2L251bGxcYFwiID0gJ1hcdCc7IHRoZW4KLSAgICAgICMgWWlwcGVlLCBcJEVDSE8gd29ya3MhCi0gICAgICA6Ci0gICAgZWxzZQotICAgICAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSBcJEVDSE8gd2lsbCB3b3JrLgotICAgICAgZXhlYyAkU0hFTEwgXCJcJDBcIiAtLW5vLXJlZXhlYyBcJHsxK1wiXCRAXCJ9Ci0gICAgZmkKLSAgZmlcCi0iCi0JJEVDSE8gIlwKLQotICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgotICB0aGlzZGlyPVxgXCRFQ0hPIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAotICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCi0KLSAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCi0gIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAotICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCi0gICAgZGVzdGRpcj1cYFwkRUNITyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCi0KLSAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCi0gICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgotICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCi0gICAgICBbXFxcXC9dKiB8IFtBLVphLXpdOltcXFxcL10qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKLSAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotCi0gICAgZmlsZT1cYFwkRUNITyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKLSAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgJHtTRUR9IC1uICdzLy4qLT4gLy9wJ1xgCi0gIGRvbmUKLQotICAjIFVzdWFsbHkgJ25vJywgZXhjZXB0IG9uIGN5Z3dpbi9taW5ndyB3aGVuIGVtYmVkZGVkIGludG8KLSAgIyB0aGUgY3dyYXBwZXIuCi0gIFdSQVBQRVJfU0NSSVBUX0JFTE9OR1NfSU5fT0JKRElSPSRmdW5jX2VtaXRfd3JhcHBlcl9hcmcxCi0gIGlmIHRlc3QgXCJcJFdSQVBQRVJfU0NSSVBUX0JFTE9OR1NfSU5fT0JKRElSXCIgPSBcInllc1wiOyB0aGVuCi0gICAgIyBzcGVjaWFsIGNhc2UgZm9yICcuJwotICAgIGlmIHRlc3QgXCJcJHRoaXNkaXJcIiA9IFwiLlwiOyB0aGVuCi0gICAgICB0aGlzZGlyPVxgcHdkXGAKLSAgICBmaQotICAgICMgcmVtb3ZlIC5saWJzIGZyb20gdGhpc2RpcgotICAgIGNhc2UgXCJcJHRoaXNkaXJcIiBpbgotICAgICpbXFxcXC9dJG9iamRpciApIHRoaXNkaXI9XGBcJEVDSE8gXCJYXCR0aGlzZGlyXCIgfCBcJFhzZWQgLWUgJ3MlW1xcXFwvXVteXFxcXC9dKiQlJSdcYCA7OwotICAgICRvYmpkaXIgKSAgIHRoaXNkaXI9LiA7OwotICAgIGVzYWMKLSAgZmkKLQotICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgotICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCi0gIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCi0iCi0KLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgotCSAgJEVDSE8gIlwKLSAgcHJvZ3JhbT1sdC0nJG91dHB1dG5hbWUnJGV4ZWV4dAotICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgotCi0gIGlmIHRlc3QgISAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiB8fAotICAgICB7IGZpbGU9XGBscyAtMWR0IFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwiXCRwcm9nZGlyLy4uL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHwgJHtTRUR9IDFxXGA7IFxcCi0gICAgICAgdGVzdCBcIlhcJGZpbGVcIiAhPSBcIlhcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH07IHRoZW4KLQotICAgIGZpbGU9XCJcJFwkLVwkcHJvZ3JhbVwiCi0KLSAgICBpZiB0ZXN0ICEgLWQgXCJcJHByb2dkaXJcIjsgdGhlbgotICAgICAgJE1LRElSIFwiXCRwcm9nZGlyXCIKLSAgICBlbHNlCi0gICAgICAkUk0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgICBmaSIKLQotCSAgJEVDSE8gIlwKLQotICAgICMgcmVsaW5rIGV4ZWN1dGFibGUgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgdGVzdCAtbiBcIlwkcmVsaW5rX2NvbW1hbmRcIjsgdGhlbgotICAgICAgaWYgcmVsaW5rX2NvbW1hbmRfb3V0cHV0PVxgZXZhbCBcJHJlbGlua19jb21tYW5kIDI+JjFcYDsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJEVDSE8gXCJcJHJlbGlua19jb21tYW5kX291dHB1dFwiID4mMgotCSRSTSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotCWV4aXQgMQotICAgICAgZmkKLSAgICBmaQotCi0gICAgJE1WIFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8Ci0gICAgeyAkUk0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7Ci0gICAgICAkTVYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KLSAgICAkUk0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgZmkiCi0JZWxzZQotCSAgJEVDSE8gIlwKLSAgcHJvZ3JhbT0nJG91dHB1dG5hbWUnCi0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0iCi0JZmkKLQotCSRFQ0hPICJcCi0KLSAgaWYgdGVzdCAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgdGhlbiIKLQotCSMgRXhwb3J0IG91ciBzaGxpYnBhdGhfdmFyIGlmIHdlIGhhdmUgb25lLgotCWlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KLQkgICRFQ0hPICJcCi0gICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKLSAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCi0KLSAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKLSAgICAjIFRoZSBzZWNvbmQgY29sb24gaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBCZU9TIFI0IHNlZAotICAgICRzaGxpYnBhdGhfdmFyPVxgXCRFQ0hPIFwiWFwkJHNobGlicGF0aF92YXJcIiB8IFwkWHNlZCAtZSAncy86OipcJC8vJ1xgCi0KLSAgICBleHBvcnQgJHNobGlicGF0aF92YXIKLSIKLQlmaQotCi0JIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KLQlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KLQkgICRFQ0hPICJcCi0gICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKLSAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAotIgotCWZpCi0KLQkkRUNITyAiXAotICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCi0iCi0JY2FzZSAkaG9zdCBpbgotCSMgQmFja3NsYXNoZXMgc2VwYXJhdGUgZGlyZWN0b3JpZXMgb24gcGxhaW4gd2luZG93cwotCSotKi1taW5ndyB8ICotKi1vczIqKQotCSAgJEVDSE8gIlwKLSAgICAgIGV4ZWMgXCJcJHByb2dkaXJcXFxcXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQotIgotCSAgOzsKLQotCSopCi0JICAkRUNITyAiXAotICAgICAgZXhlYyBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9Ci0iCi0JICA7OwotCWVzYWMKLQkkRUNITyAiXAotICAgICAgXCRFQ0hPIFwiXCQwOiBjYW5ub3QgZXhlYyBcJHByb2dyYW0gXCQqXCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZWxzZQotICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KLSAgICBcJEVDSE8gXCJcJDA6IGVycm9yOiBcXFxgXCRwcm9nZGlyL1wkcHJvZ3JhbScgZG9lcyBub3QgZXhpc3RcIiAxPiYyCi0gICAgXCRFQ0hPIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCi0gICAgJEVDSE8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotZmlcCi0iCi19Ci0jIGVuZDogZnVuY19lbWl0X3dyYXBwZXIKLQotIyBmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjCi0jIGVtaXQgdGhlIHNvdXJjZSBjb2RlIGZvciBhIHdyYXBwZXIgZXhlY3V0YWJsZSBvbiBzdGRvdXQKLSMgTXVzdCBPTkxZIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBmdW5jX21vZGVfbGluayBiZWNhdXNlCi0jIGl0IGRlcGVuZHMgb24gYSBudW1iZXIgb2YgdmFyaWFibGUgc2V0IHRoZXJlaW4uCi1mdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjICgpCi17Ci0JY2F0IDw8RU9GCi0KLS8qICRjd3JhcHBlcnNvdXJjZSAtIHRlbXBvcmFyeSB3cmFwcGVyIGV4ZWN1dGFibGUgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKLSAgIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KLQotICAgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCi0gICBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCi0KLSAgIFRoaXMgd3JhcHBlciBleGVjdXRhYmxlIHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLSAgIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KLQotICAgQ3VycmVudGx5LCBpdCBzaW1wbHkgZXhlY3MgdGhlIHdyYXBwZXIgKnNjcmlwdCogIiRTSEVMTCAkb3V0cHV0IiwKLSAgIGJ1dCBjb3VsZCBldmVudHVhbGx5IGFic29yYiBhbGwgb2YgdGhlIHNjcmlwdHMgZnVuY3Rpb25hbGl0eSBhbmQKLSAgIGV4ZWMgJG9iamRpci8kb3V0cHV0bmFtZSBkaXJlY3RseS4KLSovCi1FT0YKLQkgICAgY2F0IDw8IkVPRiIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2lmZGVmIF9NU0NfVkVSCi0jIGluY2x1ZGUgPGRpcmVjdC5oPgotIyBpbmNsdWRlIDxwcm9jZXNzLmg+Ci0jIGluY2x1ZGUgPGlvLmg+Ci0jIGRlZmluZSBzZXRtb2RlIF9zZXRtb2RlCi0jZWxzZQotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jIGlmZGVmIF9fQ1lHV0lOX18KLSMgIGluY2x1ZGUgPGlvLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWYgZGVmaW5lZChQQVRIX01BWCkKLSMgZGVmaW5lIExUX1BBVEhNQVggUEFUSF9NQVgKLSNlbGlmIGRlZmluZWQoTUFYUEFUSExFTikKLSMgZGVmaW5lIExUX1BBVEhNQVggTUFYUEFUSExFTgotI2Vsc2UKLSMgZGVmaW5lIExUX1BBVEhNQVggMTAyNAotI2VuZGlmCi0KLSNpZm5kZWYgU19JWE9USAotIyBkZWZpbmUgU19JWE9USCAwCi0jZW5kaWYKLSNpZm5kZWYgU19JWEdSUAotIyBkZWZpbmUgU19JWEdSUCAwCi0jZW5kaWYKLQotI2lmZGVmIF9NU0NfVkVSCi0jIGRlZmluZSBTX0lYVVNSIF9TX0lFWEVDCi0jIGRlZmluZSBzdGF0IF9zdGF0Ci0jIGlmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAotIyAgZGVmaW5lIGludHB0cl90IGludAotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRElSX1NFUEFSQVRPUgotIyBkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKLSMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX19ESkdQUF9fKSB8fCBcCi0gIGRlZmluZWQgKF9fT1MyX18pCi0jIGRlZmluZSBIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTQotIyBkZWZpbmUgRk9QRU5fV0IgIndiIgotIyBpZm5kZWYgRElSX1NFUEFSQVRPUl8yCi0jICBkZWZpbmUgRElSX1NFUEFSQVRPUl8yICdcXCcKLSMgZW5kaWYKLSMgaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKLSMgIGRlZmluZSBQQVRIX1NFUEFSQVRPUl8yICc7JwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRElSX1NFUEFSQVRPUl8yCi0jIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBESVJfU0VQQVJBVE9SKQotI2Vsc2UgLyogRElSX1NFUEFSQVRPUl8yICovCi0jIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSBcCi0JKCgoY2gpID09IERJUl9TRVBBUkFUT1IpIHx8ICgoY2gpID09IERJUl9TRVBBUkFUT1JfMikpCi0jZW5kaWYgLyogRElSX1NFUEFSQVRPUl8yICovCi0KLSNpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgotIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SKQotI2Vsc2UgLyogUEFUSF9TRVBBUkFUT1JfMiAqLwotIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SXzIpCi0jZW5kaWYgLyogUEFUSF9TRVBBUkFUT1JfMiAqLwotCi0jaWZkZWYgX19DWUdXSU5fXwotIyBkZWZpbmUgRk9QRU5fV0IgIndiIgotI2VuZGlmCi0KLSNpZm5kZWYgRk9QRU5fV0IKLSMgZGVmaW5lIEZPUEVOX1dCICJ3IgotI2VuZGlmCi0jaWZuZGVmIF9PX0JJTkFSWQotIyBkZWZpbmUgX09fQklOQVJZIDAKLSNlbmRpZgotCi0jZGVmaW5lIFhNQUxMT0ModHlwZSwgbnVtKSAgICAgICgodHlwZSAqKSB4bWFsbG9jICgobnVtKSAqIHNpemVvZih0eXBlKSkpCi0jZGVmaW5lIFhGUkVFKHN0YWxlKSBkbyB7IFwKLSAgaWYgKHN0YWxlKSB7IGZyZWUgKCh2b2lkICopIHN0YWxlKTsgc3RhbGUgPSAwOyB9IFwKLX0gd2hpbGUgKDApCi0KLSN1bmRlZiBMVFdSQVBQRVJfREVCVUdQUklOVEYKLSNpZiBkZWZpbmVkIERFQlVHV1JBUFBFUgotIyBkZWZpbmUgTFRXUkFQUEVSX0RFQlVHUFJJTlRGKGFyZ3MpIGx0d3JhcHBlcl9kZWJ1Z3ByaW50ZiBhcmdzCi1zdGF0aWMgdm9pZAotbHR3cmFwcGVyX2RlYnVncHJpbnRmIChjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3M7Ci0gICAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7Ci0gICAgKHZvaWQpIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXJncyk7Ci0gICAgdmFfZW5kIChhcmdzKTsKLX0KLSNlbHNlCi0jIGRlZmluZSBMVFdSQVBQRVJfREVCVUdQUklOVEYoYXJncykKLSNlbmRpZgotCi1jb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSBOVUxMOwotCi12b2lkICp4bWFsbG9jIChzaXplX3QgbnVtKTsKLWNoYXIgKnhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci1jb25zdCBjaGFyICpiYXNlX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpOwotY2hhciAqZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyICp3cmFwcGVyKTsKLWNoYXIgKmNoYXNlX3N5bWxpbmtzIChjb25zdCBjaGFyICpwYXRoc3BlYyk7Ci1pbnQgbWFrZV9leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKTsKLWludCBjaGVja19leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKTsKLWNoYXIgKnN0cmVuZHphcCAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpOwotdm9pZCBsdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnNjcmlwdF90ZXh0ID0KLUVPRgotCi0JICAgIGZ1bmNfZW1pdF93cmFwcGVyIHllcyB8Ci0JICAgICAgICAkU0VEIC1lICdzL1woW1xcIl1cKS9cXFwxL2cnIFwKLQkgICAgICAgICAgICAgLWUgJ3MvXi8gICIvJyAtZSAncy8kL1xcbiIvJwotCSAgICBlY2hvICI7IgotCi0JICAgIGNhdCA8PEVPRgotY29uc3QgY2hhciAqIE1BR0lDX0VYRSA9ICIkbWFnaWNfZXhlIjsKLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBjaGFyICoqbmV3YXJnejsKLSAgY2hhciAqdG1wX3BhdGhzcGVjOwotICBjaGFyICphY3R1YWxfY3dyYXBwZXJfcGF0aDsKLSAgY2hhciAqc2h3cmFwcGVyX25hbWU7Ci0gIGludHB0cl90IHJ2YWwgPSAxMjc7Ci0gIEZJTEUgKnNod3JhcHBlcjsKLQotICBjb25zdCBjaGFyICpkdW1wc2NyaXB0X29wdCA9ICItLWx0LWR1bXAtc2NyaXB0IjsKLSAgaW50IGk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoYmFzZV9uYW1lIChhcmd2WzBdKSk7Ci0gIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgYXJndlswXSAgICAgIDogJXNcbiIsIGFyZ3ZbMF0pKTsKLSAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBwcm9ncmFtX25hbWUgOiAlc1xuIiwgcHJvZ3JhbV9uYW1lKSk7Ci0KLSAgLyogdmVyeSBzaW1wbGUgYXJnIHBhcnNpbmc7IGRvbid0IHdhbnQgdG8gcmVseSBvbiBnZXRvcHQgKi8KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBkdW1wc2NyaXB0X29wdCkgPT0gMCkKLQl7Ci1FT0YKLQkgICAgY2FzZSAiJGhvc3QiIGluCi0JICAgICAgKm1pbmd3KiB8ICpjeWd3aW4qICkKLQkJIyBtYWtlIHN0ZG91dCB1c2UgInVuaXgiIGxpbmUgZW5kaW5ncwotCQllY2hvICIgICAgICAgICAgc2V0bW9kZSgxLF9PX0JJTkFSWSk7IgotCQk7OwotCSAgICAgIGVzYWMKLQotCSAgICBjYXQgPDxFT0YKLQkgIHByaW50ZiAoIiVzIiwgc2NyaXB0X3RleHQpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLQotICBuZXdhcmd6ID0gWE1BTExPQyAoY2hhciAqLCBhcmdjICsgMik7Ci1FT0YKLQotCSAgICBpZiB0ZXN0IC1uICIkVEFSR0VUU0hFTEwiIDsgdGhlbgotCSAgICAgICMgbm8gcGF0aCB0cmFuc2xhdGlvbiBhdCBhbGwKLQkgICAgICBsdF9uZXdhcmd2MD0kVEFSR0VUU0hFTEwKLQkgICAgZWxzZQotCSAgICAgIGNhc2UgIiRob3N0IiBpbgotCQkqbWluZ3cqICkKLQkJICAjIGF3a3dhcmQ6IGNtZCBhcHBlbmRzIHNwYWNlcyB0byByZXN1bHQKLQkJICBsdF9zZWRfc3RyaXBfdHJhaWxpbmdfc3BhY2VzPSJzL1sgXSpcJC8vIgotCQkgIGx0X25ld2FyZ3YwPWAoIGNtZCAvL2MgZWNobyAkU0hFTEwgfCAkU0VEIC1lICIkbHRfc2VkX3N0cmlwX3RyYWlsaW5nX3NwYWNlcyIgKSAyPi9kZXYvbnVsbCB8fCBlY2hvICRTSEVMTGAKLQkJICBjYXNlICRsdF9uZXdhcmd2MCBpbgotCQkgICAgKi5leGUgfCAqLkVYRSkgOzsKLQkJICAgICopIGx0X25ld2FyZ3YwPSRsdF9uZXdhcmd2MC5leGUgOzsKLQkJICBlc2FjCi0JCSAgOzsKLQkJKiApIGx0X25ld2FyZ3YwPSRTSEVMTCA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQotCQljYXQgPDxFT0YKLSAgbmV3YXJnelswXSA9IChjaGFyICopIHhzdHJkdXAgKCIkbHRfbmV3YXJndjAiKTsKLUVPRgotCi0JICAgIGNhdCA8PCJFT0YiCi0gIHRtcF9wYXRoc3BlYyA9IGZpbmRfZXhlY3V0YWJsZSAoYXJndlswXSk7Ci0gIGlmICh0bXBfcGF0aHNwZWMgPT0gTlVMTCkKLSAgICBsdF9mYXRhbCAoIkNvdWxkbid0IGZpbmQgJXMiLCBhcmd2WzBdKTsKLSAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBmb3VuZCBleGUgKGJlZm9yZSBzeW1saW5rIGNoYXNlKSBhdCA6ICVzXG4iLAotCQkJICB0bXBfcGF0aHNwZWMpKTsKLQotICBhY3R1YWxfY3dyYXBwZXJfcGF0aCA9IGNoYXNlX3N5bWxpbmtzICh0bXBfcGF0aHNwZWMpOwotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKG1haW4pIGZvdW5kIGV4ZSAoYWZ0ZXIgc3ltbGluayBjaGFzZSkgYXQgOiAlc1xuIiwKLQkJCSAgYWN0dWFsX2N3cmFwcGVyX3BhdGgpKTsKLSAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7Ci0KLSAgc2h3cmFwcGVyX25hbWUgPSAoY2hhciAqKSB4c3RyZHVwIChiYXNlX25hbWUgKGFjdHVhbF9jd3JhcHBlcl9wYXRoKSk7Ci0gIHN0cmVuZHphcCAoYWN0dWFsX2N3cmFwcGVyX3BhdGgsIHNod3JhcHBlcl9uYW1lKTsKLQotICAvKiBzaHdyYXBwZXJfbmFtZSB0cmFuc2Zvcm1zICovCi0gIHN0cmVuZHphcCAoc2h3cmFwcGVyX25hbWUsICIuZXhlIik7Ci0gIHRtcF9wYXRoc3BlYyA9IFhNQUxMT0MgKGNoYXIsIChzdHJsZW4gKHNod3JhcHBlcl9uYW1lKSArCi0JCQkJIHN0cmxlbiAoIl9sdHNod3JhcHBlclRNUCIpICsgMSkpOwotICBzdHJjcHkgKHRtcF9wYXRoc3BlYywgc2h3cmFwcGVyX25hbWUpOwotICBzdHJjYXQgKHRtcF9wYXRoc3BlYywgIl9sdHNod3JhcHBlclRNUCIpOwotICBYRlJFRSAoc2h3cmFwcGVyX25hbWUpOwotICBzaHdyYXBwZXJfbmFtZSA9IHRtcF9wYXRoc3BlYzsKLSAgdG1wX3BhdGhzcGVjID0gMDsKLSAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBsaWJ0b29sIHNoZWxsIHdyYXBwZXIgbmFtZTogJXNcbiIsCi0JCQkgIHNod3JhcHBlcl9uYW1lKSk7Ci1FT0YKLQotCSAgICBjYXQgPDxFT0YKLSAgbmV3YXJnelsxXSA9Ci0gICAgWE1BTExPQyAoY2hhciwgKHN0cmxlbiAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpICsKLQkJICAgIHN0cmxlbiAoIiRvYmpkaXIiKSArIDEgKyBzdHJsZW4gKHNod3JhcHBlcl9uYW1lKSArIDEpKTsKLSAgc3RyY3B5IChuZXdhcmd6WzFdLCBhY3R1YWxfY3dyYXBwZXJfcGF0aCk7Ci0gIHN0cmNhdCAobmV3YXJnelsxXSwgIiRvYmpkaXIiKTsKLSAgc3RyY2F0IChuZXdhcmd6WzFdLCAiLyIpOwotICBzdHJjYXQgKG5ld2FyZ3pbMV0sIHNod3JhcHBlcl9uYW1lKTsKLUVPRgotCi0KLQkgICAgY2FzZSAkaG9zdF9vcyBpbgotCSAgICAgIG1pbmd3KikKLQkgICAgY2F0IDw8IkVPRiIKLSAgewotICAgIGNoYXIqIHA7Ci0gICAgd2hpbGUgKChwID0gc3RyY2hyIChuZXdhcmd6WzFdLCAnXFwnKSkgIT0gTlVMTCkKLSAgICAgIHsKLQkqcCA9ICcvJzsKLSAgICAgIH0KLSAgfQotRU9GCi0JICAgIDs7Ci0JICAgIGVzYWMKLQotCSAgICBjYXQgPDwiRU9GIgotICBYRlJFRSAoc2h3cmFwcGVyX25hbWUpOwotICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpOwotCi0gIC8qIGFsd2F5cyB3cml0ZSBpbiBiaW5hcnkgbW9kZSAqLwotICBpZiAoKHNod3JhcHBlciA9IGZvcGVuIChuZXdhcmd6WzFdLCBGT1BFTl9XQikpID09IDApCi0gICAgewotICAgICAgbHRfZmF0YWwgKCJDb3VsZCBub3Qgb3BlbiAlcyBmb3Igd3JpdGluZyIsIG5ld2FyZ3pbMV0pOwotICAgIH0KLSAgZnByaW50ZiAoc2h3cmFwcGVyLCAiJXMiLCBzY3JpcHRfdGV4dCk7Ci0gIGZjbG9zZSAoc2h3cmFwcGVyKTsKLQotICBtYWtlX2V4ZWN1dGFibGUgKG5ld2FyZ3pbMV0pOwotCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCi0gICAgbmV3YXJneltpICsgMV0gPSB4c3RyZHVwIChhcmd2W2ldKTsKLSAgbmV3YXJnelthcmdjICsgMV0gPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBhcmdjICsgMTsgaSsrKQotICAgIHsKLSAgICAgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgbmV3YXJnelslZF0gICA6ICVzXG4iLCBpLCBuZXdhcmd6W2ldKSk7Ci0gICAgfQotCi1FT0YKLQotCSAgICBjYXNlICRob3N0X29zIGluCi0JICAgICAgbWluZ3cqKQotCQljYXQgPDxFT0YKLSAgLyogZXhlY3YgZG9lc24ndCBhY3R1YWxseSB3b3JrIG9uIG1pbmd3IGFzIGV4cGVjdGVkIG9uIHVuaXggKi8KLSAgcnZhbCA9IF9zcGF3bnYgKF9QX1dBSVQsICIkbHRfbmV3YXJndjAiLCAoY29uc3QgY2hhciAqIGNvbnN0ICopIG5ld2FyZ3opOwotICBpZiAocnZhbCA9PSAtMSkKLSAgICB7Ci0gICAgICAvKiBmYWlsZWQgdG8gc3RhcnQgcHJvY2VzcyAqLwotICAgICAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBmYWlsZWQgdG8gbGF1bmNoIHRhcmdldCBcIiRsdF9uZXdhcmd2MFwiOiBlcnJubyA9ICVkXG4iLCBlcnJubykpOwotICAgICAgcmV0dXJuIDEyNzsKLSAgICB9Ci0gIHJldHVybiBydmFsOwotfQotRU9GCi0JCTs7Ci0JICAgICAgKikKLQkJY2F0IDw8RU9GCi0gIGV4ZWN2ICgiJGx0X25ld2FyZ3YwIiwgbmV3YXJneik7Ci0gIHJldHVybiBydmFsOyAvKiA9MTI3LCBidXQgYXZvaWRzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nICovCi19Ci1FT0YKLQkJOzsKLQkgICAgZXNhYwotCi0JICAgIGNhdCA8PCJFT0YiCi0KLXZvaWQgKgoteG1hbGxvYyAoc2l6ZV90IG51bSkKLXsKLSAgdm9pZCAqcCA9ICh2b2lkICopIG1hbGxvYyAobnVtKTsKLSAgaWYgKCFwKQotICAgIGx0X2ZhdGFsICgiTWVtb3J5IGV4aGF1c3RlZCIpOwotCi0gIHJldHVybiBwOwotfQotCi1jaGFyICoKLXhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgcmV0dXJuIHN0cmluZyA/IHN0cmNweSAoKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzdHJpbmcpICsgMSksCi0JCQkgIHN0cmluZykgOiBOVUxMOwotfQotCi1jb25zdCBjaGFyICoKLWJhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqYmFzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICAvKiBTa2lwIG92ZXIgdGhlIGRpc2sgbmFtZSBpbiBNU0RPUyBwYXRobmFtZXMuICovCi0gIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgbmFtZVswXSkgJiYgbmFtZVsxXSA9PSAnOicpCi0gICAgbmFtZSArPSAyOwotI2VuZGlmCi0KLSAgZm9yIChiYXNlID0gbmFtZTsgKm5hbWU7IG5hbWUrKykKLSAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAoKm5hbWUpKQotICAgICAgYmFzZSA9IG5hbWUgKyAxOwotICByZXR1cm4gYmFzZTsKLX0KLQotaW50Ci1jaGVja19leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKQotewotICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKGNoZWNrX2V4ZWN1dGFibGUpICA6ICVzXG4iLAotCQkJICBwYXRoID8gKCpwYXRoID8gcGF0aCA6ICJFTVBUWSEiKSA6ICJOVUxMISIpKTsKLSAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKChzdGF0IChwYXRoLCAmc3QpID49IDApCi0gICAgICAmJiAoc3Quc3RfbW9kZSAmIChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpKSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLW1ha2VfZXhlY3V0YWJsZSAoY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgaW50IHJ2YWwgPSAwOwotICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKG1ha2VfZXhlY3V0YWJsZSkgICA6ICVzXG4iLAotCQkJICBwYXRoID8gKCpwYXRoID8gcGF0aCA6ICJFTVBUWSEiKSA6ICJOVUxMISIpKTsKLSAgaWYgKCghcGF0aCkgfHwgKCEqcGF0aCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkKLSAgICB7Ci0gICAgICBydmFsID0gY2htb2QgKHBhdGgsIHN0LnN0X21vZGUgfCBTX0lYT1RIIHwgU19JWEdSUCB8IFNfSVhVU1IpOwotICAgIH0KLSAgcmV0dXJuIHJ2YWw7Ci19Ci0KLS8qIFNlYXJjaGVzIGZvciB0aGUgZnVsbCBwYXRoIG9mIHRoZSB3cmFwcGVyLiAgUmV0dXJucwotICAgbmV3bHkgYWxsb2NhdGVkIGZ1bGwgcGF0aCBuYW1lIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZQotICAgRG9lcyBub3QgY2hhc2Ugc3ltbGlua3MsIGV2ZW4gb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGVtLgotKi8KLWNoYXIgKgotZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyICp3cmFwcGVyKQotewotICBpbnQgaGFzX3NsYXNoID0gMDsKLSAgY29uc3QgY2hhciAqcDsKLSAgY29uc3QgY2hhciAqcF9uZXh0OwotICAvKiBzdGF0aWMgYnVmZmVyIGZvciBnZXRjd2QgKi8KLSAgY2hhciB0bXBbTFRfUEFUSE1BWCArIDFdOwotICBpbnQgdG1wX2xlbjsKLSAgY2hhciAqY29uY2F0X25hbWU7Ci0KLSAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihmaW5kX2V4ZWN1dGFibGUpICAgOiAlc1xuIiwKLQkJCSAgd3JhcHBlciA/ICgqd3JhcHBlciA/IHdyYXBwZXIgOiAiRU1QVFkhIikgOiAiTlVMTCEiKSk7Ci0KLSAgaWYgKCh3cmFwcGVyID09IE5VTEwpIHx8ICgqd3JhcHBlciA9PSAnXDAnKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBBYnNvbHV0ZSBwYXRoPyAqLwotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICBpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIHdyYXBwZXJbMF0pICYmIHdyYXBwZXJbMV0gPT0gJzonKQotICAgIHsKLSAgICAgIGNvbmNhdF9uYW1lID0geHN0cmR1cCAod3JhcHBlcik7Ci0gICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQotCXJldHVybiBjb25jYXRfbmFtZTsKLSAgICAgIFhGUkVFIChjb25jYXRfbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2VuZGlmCi0gICAgICBpZiAoSVNfRElSX1NFUEFSQVRPUiAod3JhcHBlclswXSkpCi0JewotCSAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKLQkgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCi0JICAgIHJldHVybiBjb25jYXRfbmFtZTsKLQkgIFhGUkVFIChjb25jYXRfbmFtZSk7Ci0JfQotI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQotICAgIH0KLSNlbmRpZgotCi0gIGZvciAocCA9IHdyYXBwZXI7ICpwOyBwKyspCi0gICAgaWYgKCpwID09ICcvJykKLSAgICAgIHsKLQloYXNfc2xhc2ggPSAxOwotCWJyZWFrOwotICAgICAgfQotICBpZiAoIWhhc19zbGFzaCkKLSAgICB7Ci0gICAgICAvKiBubyBzbGFzaGVzOyBzZWFyY2ggUEFUSCAqLwotICAgICAgY29uc3QgY2hhciAqcGF0aCA9IGdldGVudiAoIlBBVEgiKTsKLSAgICAgIGlmIChwYXRoICE9IE5VTEwpCi0JewotCSAgZm9yIChwID0gcGF0aDsgKnA7IHAgPSBwX25leHQpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpxOwotCSAgICAgIHNpemVfdCBwX2xlbjsKLQkgICAgICBmb3IgKHEgPSBwOyAqcTsgcSsrKQotCQlpZiAoSVNfUEFUSF9TRVBBUkFUT1IgKCpxKSkKLQkJICBicmVhazsKLQkgICAgICBwX2xlbiA9IHEgLSBwOwotCSAgICAgIHBfbmV4dCA9ICgqcSA9PSAnXDAnID8gcSA6IHEgKyAxKTsKLQkgICAgICBpZiAocF9sZW4gPT0gMCkKLQkJewotCQkgIC8qIGVtcHR5IHBhdGg6IGN1cnJlbnQgZGlyZWN0b3J5ICovCi0JCSAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQotCQkgICAgbHRfZmF0YWwgKCJnZXRjd2QgZmFpbGVkIik7Ci0JCSAgdG1wX2xlbiA9IHN0cmxlbiAodG1wKTsKLQkJICBjb25jYXRfbmFtZSA9Ci0JCSAgICBYTUFMTE9DIChjaGFyLCB0bXBfbGVuICsgMSArIHN0cmxlbiAod3JhcHBlcikgKyAxKTsKLQkJICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOwotCQkgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOwotCQkgIHN0cmNweSAoY29uY2F0X25hbWUgKyB0bXBfbGVuICsgMSwgd3JhcHBlcik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb25jYXRfbmFtZSA9Ci0JCSAgICBYTUFMTE9DIChjaGFyLCBwX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7Ci0JCSAgbWVtY3B5IChjb25jYXRfbmFtZSwgcCwgcF9sZW4pOwotCQkgIGNvbmNhdF9uYW1lW3BfbGVuXSA9ICcvJzsKLQkJICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgcF9sZW4gKyAxLCB3cmFwcGVyKTsKLQkJfQotCSAgICAgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCi0JCXJldHVybiBjb25jYXRfbmFtZTsKLQkgICAgICBYRlJFRSAoY29uY2F0X25hbWUpOwotCSAgICB9Ci0JfQotICAgICAgLyogbm90IGZvdW5kIGluIFBBVEg7IGFzc3VtZSBjdXJkaXIgKi8KLSAgICB9Ci0gIC8qIFJlbGF0aXZlIHBhdGggfCBub3QgZm91bmQgaW4gcGF0aDogcHJlcGVuZCBjd2QgKi8KLSAgaWYgKGdldGN3ZCAodG1wLCBMVF9QQVRITUFYKSA9PSBOVUxMKQotICAgIGx0X2ZhdGFsICgiZ2V0Y3dkIGZhaWxlZCIpOwotICB0bXBfbGVuID0gc3RybGVuICh0bXApOwotICBjb25jYXRfbmFtZSA9IFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOwotICBtZW1jcHkgKGNvbmNhdF9uYW1lLCB0bXAsIHRtcF9sZW4pOwotICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKLSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKLQotICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY29uY2F0X25hbWUpKQotICAgIHJldHVybiBjb25jYXRfbmFtZTsKLSAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNoYXIgKgotY2hhc2Vfc3ltbGlua3MgKGNvbnN0IGNoYXIgKnBhdGhzcGVjKQotewotI2lmbmRlZiBTX0lTTE5LCi0gIHJldHVybiB4c3RyZHVwIChwYXRoc3BlYyk7Ci0jZWxzZQotICBjaGFyIGJ1ZltMVF9QQVRITUFYXTsKLSAgc3RydWN0IHN0YXQgczsKLSAgY2hhciAqdG1wX3BhdGhzcGVjID0geHN0cmR1cCAocGF0aHNwZWMpOwotICBjaGFyICpwOwotICBpbnQgaGFzX3N5bWxpbmtzID0gMDsKLSAgd2hpbGUgKHN0cmxlbiAodG1wX3BhdGhzcGVjKSAmJiAhaGFzX3N5bWxpbmtzKQotICAgIHsKLSAgICAgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCJjaGVja2luZyBwYXRoIGNvbXBvbmVudCBmb3Igc3ltbGlua3M6ICVzXG4iLAotCQkJICAgICAgdG1wX3BhdGhzcGVjKSk7Ci0gICAgICBpZiAobHN0YXQgKHRtcF9wYXRoc3BlYywgJnMpID09IDApCi0JewotCSAgaWYgKFNfSVNMTksgKHMuc3RfbW9kZSkgIT0gMCkKLQkgICAgewotCSAgICAgIGhhc19zeW1saW5rcyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogc2VhcmNoIGJhY2t3YXJkcyBmb3IgbGFzdCBESVJfU0VQQVJBVE9SICovCi0JICBwID0gdG1wX3BhdGhzcGVjICsgc3RybGVuICh0bXBfcGF0aHNwZWMpIC0gMTsKLQkgIHdoaWxlICgocCA+IHRtcF9wYXRoc3BlYykgJiYgKCFJU19ESVJfU0VQQVJBVE9SICgqcCkpKQotCSAgICBwLS07Ci0JICBpZiAoKHAgPT0gdG1wX3BhdGhzcGVjKSAmJiAoIUlTX0RJUl9TRVBBUkFUT1IgKCpwKSkpCi0JICAgIHsKLQkgICAgICAvKiBubyBtb3JlIERJUl9TRVBBUkFUT1JTIGxlZnQgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKnAgPSAnXDAnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICplcnJzdHIgPSBzdHJlcnJvciAoZXJybm8pOwotCSAgbHRfZmF0YWwgKCJFcnJvciBhY2Nlc3NpbmcgZmlsZSAlcyAoJXMpIiwgdG1wX3BhdGhzcGVjLCBlcnJzdHIpOwotCX0KLSAgICB9Ci0gIFhGUkVFICh0bXBfcGF0aHNwZWMpOwotCi0gIGlmICghaGFzX3N5bWxpbmtzKQotICAgIHsKLSAgICAgIHJldHVybiB4c3RyZHVwIChwYXRoc3BlYyk7Ci0gICAgfQotCi0gIHRtcF9wYXRoc3BlYyA9IHJlYWxwYXRoIChwYXRoc3BlYywgYnVmKTsKLSAgaWYgKHRtcF9wYXRoc3BlYyA9PSAwKQotICAgIHsKLSAgICAgIGx0X2ZhdGFsICgiQ291bGQgbm90IGZvbGxvdyBzeW1saW5rcyBmb3IgJXMiLCBwYXRoc3BlYyk7Ci0gICAgfQotICByZXR1cm4geHN0cmR1cCAodG1wX3BhdGhzcGVjKTsKLSNlbmRpZgotfQotCi1jaGFyICoKLXN0cmVuZHphcCAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpCi17Ci0gIHNpemVfdCBsZW4sIHBhdGxlbjsKLQotICBhc3NlcnQgKHN0ciAhPSBOVUxMKTsKLSAgYXNzZXJ0IChwYXQgIT0gTlVMTCk7Ci0KLSAgbGVuID0gc3RybGVuIChzdHIpOwotICBwYXRsZW4gPSBzdHJsZW4gKHBhdCk7Ci0KLSAgaWYgKHBhdGxlbiA8PSBsZW4pCi0gICAgewotICAgICAgc3RyICs9IGxlbiAtIHBhdGxlbjsKLSAgICAgIGlmIChzdHJjbXAgKHN0ciwgcGF0KSA9PSAwKQotCSpzdHIgPSAnXDAnOwotICAgIH0KLSAgcmV0dXJuIHN0cjsKLX0KLQotc3RhdGljIHZvaWQKLWx0X2Vycm9yX2NvcmUgKGludCBleGl0X3N0YXR1cywgY29uc3QgY2hhciAqbW9kZSwKLQkgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwgdmFfbGlzdCBhcCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAiLCBwcm9ncmFtX25hbWUsIG1vZGUpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIi5cbiIpOwotCi0gIGlmIChleGl0X3N0YXR1cyA+PSAwKQotICAgIGV4aXQgKGV4aXRfc3RhdHVzKTsKLX0KLQotdm9pZAotbHRfZmF0YWwgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKLXsKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQgKGFwLCBtZXNzYWdlKTsKLSAgbHRfZXJyb3JfY29yZSAoRVhJVF9GQUlMVVJFLCAiRkFUQUwiLCBtZXNzYWdlLCBhcCk7Ci0gIHZhX2VuZCAoYXApOwotfQotRU9GCi19Ci0jIGVuZDogZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYwotCi0jIGZ1bmNfbW9kZV9saW5rIGFyZy4uLgotZnVuY19tb2RlX2xpbmsgKCkKLXsKLSAgICAkb3B0X2RlYnVnCi0gICAgY2FzZSAkaG9zdCBpbgotICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAotICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAotICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQotICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9jYXRpb24uCi0gICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubwotCi0gICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKLSAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90Ci0gICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQotICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCi0gICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICAqKQotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgbGlidG9vbF9hcmdzPSRub25vcHQKLSAgICBiYXNlX2NvbXBpbGU9IiRub25vcHQgJEAiCi0gICAgY29tcGlsZV9jb21tYW5kPSRub25vcHQKLSAgICBmaW5hbGl6ZV9jb21tYW5kPSRub25vcHQKLQotICAgIGNvbXBpbGVfcnBhdGg9Ci0gICAgZmluYWxpemVfcnBhdGg9Ci0gICAgY29tcGlsZV9zaGxpYnBhdGg9Ci0gICAgZmluYWxpemVfc2hsaWJwYXRoPQotICAgIGNvbnZlbmllbmNlPQotICAgIG9sZF9jb252ZW5pZW5jZT0KLSAgICBkZXBsaWJzPQotICAgIG9sZF9kZXBsaWJzPQotICAgIGNvbXBpbGVyX2ZsYWdzPQotICAgIGxpbmtlcl9mbGFncz0KLSAgICBkbGxzZWFyY2hwYXRoPQotICAgIGxpYl9zZWFyY2hfcGF0aD1gcHdkYAotICAgIGluc3RfcHJlZml4X2Rpcj0KLSAgICBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0KLQotICAgIGF2b2lkX3ZlcnNpb249bm8KLSAgICBkbGZpbGVzPQotICAgIGRscHJlZmlsZXM9Ci0gICAgZGxzZWxmPW5vCi0gICAgZXhwb3J0X2R5bmFtaWM9bm8KLSAgICBleHBvcnRfc3ltYm9scz0KLSAgICBleHBvcnRfc3ltYm9sc19yZWdleD0KLSAgICBnZW5lcmF0ZWQ9Ci0gICAgbGlib2Jqcz0KLSAgICBsdGxpYnM9Ci0gICAgbW9kdWxlPW5vCi0gICAgbm9faW5zdGFsbD1ubwotICAgIG9ianM9Ci0gICAgbm9uX3BpY19vYmplY3RzPQotICAgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PQotICAgIHByZWZlcl9zdGF0aWNfbGlicz1ubwotICAgIHByZWxvYWQ9bm8KLSAgICBwcmV2PQotICAgIHByZXZhcmc9Ci0gICAgcmVsZWFzZT0KLSAgICBycGF0aD0KLSAgICB4cnBhdGg9Ci0gICAgcGVybV9ycGF0aD0KLSAgICB0ZW1wX3JwYXRoPQotICAgIHRocmVhZF9zYWZlPW5vCi0gICAgdmluZm89Ci0gICAgdmluZm9fbnVtYmVyPW5vCi0gICAgd2Vha19saWJzPQotICAgIHNpbmdsZV9tb2R1bGU9IiR7d2x9LXNpbmdsZV9tb2R1bGUiCi0gICAgZnVuY19pbmZlcl90YWcgJGJhc2VfY29tcGlsZQotCi0gICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAkYXJnIGluCi0gICAgICAtc2hhcmVkKQotCXRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiBcCi0JICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gImNhbiBub3QgYnVpbGQgYSBzaGFyZWQgbGlicmFyeSIKLQlidWlsZF9vbGRfbGlicz1ubwotCWJyZWFrCi0JOzsKLSAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQotCWNhc2UgJGFyZyBpbgotCS1hbGwtc3RhdGljKQotCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgIGZ1bmNfd2FybmluZyAiY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iCi0JICBmaQotCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQkgIGZpCi0JICBwcmVmZXJfc3RhdGljX2xpYnM9eWVzCi0JICA7OwotCS1zdGF0aWMpCi0JICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCi0JICBmaQotCSAgcHJlZmVyX3N0YXRpY19saWJzPWJ1aWx0Ci0JICA7OwotCS1zdGF0aWMtbGlidG9vbC1saWJzKQotCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYwotCSAgZmkKLQkgIHByZWZlcl9zdGF0aWNfbGlicz15ZXMKLQkgIDs7Ci0JZXNhYwotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotCWJyZWFrCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFNlZSBpZiBvdXIgc2hhcmVkIGFyY2hpdmVzIGRlcGVuZCBvbiBzdGF0aWMgYXJjaGl2ZXMuCi0gICAgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIGJ1aWxkX29sZF9saWJzPXllcwotCi0gICAgIyBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudHMsIHRyYW5zZm9ybWluZyB0aGVtIG9uIHRoZSB3YXkuCi0gICAgd2hpbGUgdGVzdCAiJCMiIC1ndCAwOyBkbwotICAgICAgYXJnPSIkMSIKLSAgICAgIHNoaWZ0Ci0gICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotICAgICAgcWFyZz0kZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQKLSAgICAgIGZ1bmNfYXBwZW5kIGxpYnRvb2xfYXJncyAiICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQotICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQljYXNlICRwcmV2IGluCi0Jb3V0cHV0KQotCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgQE9VVFBVVEAiCi0JICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgQE9VVFBVVEAiCi0JICA7OwotCWVzYWMKLQotCWNhc2UgJHByZXYgaW4KLQlkbGZpbGVzfGRscHJlZmlsZXMpCi0JICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSBubzsgdGhlbgotCSAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgotCSAgICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiBAU1lNRklMRUAiCi0JICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiBAU1lNRklMRUAiCi0JICAgIHByZWxvYWQ9eWVzCi0JICBmaQotCSAgY2FzZSAkYXJnIGluCi0JICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgotCSAgZm9yY2UpCi0JICAgIGlmIHRlc3QgIiRkbHNlbGYiID0gbm87IHRoZW4KLQkgICAgICBkbHNlbGY9bmVlZGxlc3MKLQkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKLQkgICAgZmkKLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIHNlbGYpCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICAgICBkbHNlbGY9eWVzCi0JICAgIGVsaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiICE9IHllczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxzZQotCSAgICAgIGRsc2VsZj1uZWVkbGVzcwotCSAgICAgIGV4cG9ydF9keW5hbWljPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICAgIGVsc2UKLQkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQlleHBzeW1zKQotCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCi0JICB0ZXN0IC1mICIkYXJnIiBcCi0JICAgIHx8IGZ1bmNfZmF0YWxfZXJyb3IgInN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JZXhwc3ltc19yZWdleCkKLQkgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWZyYW1ld29yaykKLQkgIGNhc2UgJGhvc3QgaW4KLQkgICAgKi0qLWRhcndpbiopCi0JICAgICAgY2FzZSAiJGRlcGxpYnMgIiBpbgotCQkqIiAkcWFyZy5sdGZyYW1ld29yayAiKikgOzsKLQkJKikgZGVwbGlicz0iJGRlcGxpYnMgJHFhcmcubHRmcmFtZXdvcmsiICMgdGhpcyBpcyBmaXhlZCBsYXRlcgotCQkgICA7OwotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgZXNhYwotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWluc3RfcHJlZml4KQotCSAgaW5zdF9wcmVmaXhfZGlyPSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCW9iamVjdGxpc3QpCi0JICBpZiB0ZXN0IC1mICIkYXJnIjsgdGhlbgotCSAgICBzYXZlX2FyZz0kYXJnCi0JICAgIG1vcmVhcmdzPQotCSAgICBmb3IgZmlsIGluIGBjYXQgIiRzYXZlX2FyZyJgCi0JICAgIGRvCi0jCSAgICAgIG1vcmVhcmdzPSIkbW9yZWFyZ3MgJGZpbCIKLQkgICAgICBhcmc9JGZpbAotCSAgICAgICMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgotCi0JICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgotCSAgICAgIGlmIGZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRhcmciOyB0aGVuCi0JCXBpY19vYmplY3Q9Ci0JCW5vbl9waWNfb2JqZWN0PQotCi0JCSMgUmVhZCB0aGUgLmxvIGZpbGUKLQkJZnVuY19zb3VyY2UgIiRhcmciCi0KLQkJaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8Ci0JCSAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKLQkJICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJgotCQkgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiID0gbm9uZTsgdGhlbgotCQkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2Ygb2JqZWN0IGZvciBcYCRhcmcnIgotCQlmaQotCi0JCSMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JCWZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCi0JCXhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCi0JCWlmIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkJICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgotCi0JCSAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCQkgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgotCQkgICAgICBkbGZpbGVzPSIkZGxmaWxlcyAkcGljX29iamVjdCIKLQkJICAgICAgcHJldj0KLQkJICAgICAgY29udGludWUKLQkJICAgIGVsc2UKLQkJICAgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkJICAgICAgcHJldj1kbHByZWZpbGVzCi0JCSAgICBmaQotCQkgIGZpCi0KLQkJICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQotCQkgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkJICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLQkJICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgotCQkgICAgcHJldj0KLQkJICBmaQotCi0JCSAgIyBBIFBJQyBvYmplY3QuCi0JCSAgZnVuY19hcHBlbmQgbGlib2JqcyAiICRwaWNfb2JqZWN0IgotCQkgIGFyZz0iJHBpY19vYmplY3QiCi0JCWZpCi0KLQkJIyBOb24tUElDIG9iamVjdC4KLQkJaWYgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JCSAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkJICBub25fcGljX29iamVjdD0iJHhkaXIkbm9uX3BpY19vYmplY3QiCi0KLQkJICAjIEEgc3RhbmRhcmQgbm9uLVBJQyBvYmplY3QKLQkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCi0JCSAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgOyB0aGVuCi0JCSAgICBhcmc9IiRub25fcGljX29iamVjdCIKLQkJICBmaQotCQllbHNlCi0JCSAgIyBJZiB0aGUgUElDIG9iamVjdCBleGlzdHMsIHVzZSBpdCBpbnN0ZWFkLgotCQkgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KLQkJICBub25fcGljX29iamVjdD0iJHBpY19vYmplY3QiCi0JCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgotCQlmaQotCSAgICAgIGVsc2UKLQkJIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCi0JCWlmICRvcHRfZHJ5X3J1bjsgdGhlbgotCQkgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKLQkJICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQotCQkgIGZ1bmNfbG8ybyAiJGFyZyIKLQkJICBwaWNfb2JqZWN0PSR4ZGlyJG9iamRpci8kZnVuY19sbzJvX3Jlc3VsdAotCQkgIG5vbl9waWNfb2JqZWN0PSR4ZGlyJGZ1bmNfbG8yb19yZXN1bHQKLQkJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCi0JCSAgZnVuY19hcHBlbmQgbm9uX3BpY19vYmplY3RzICIgJG5vbl9waWNfb2JqZWN0IgotCSAgICAgICAgZWxzZQotCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGFyZycgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBvYmplY3QiCi0JCWZpCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZWxzZQotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJsaW5rIGlucHV0IGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKLQkgIGZpCi0JICBhcmc9JHNhdmVfYXJnCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcHJlY2lvdXNfcmVnZXgpCi0JICBwcmVjaW91c19maWxlc19yZWdleD0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlyZWxlYXNlKQotCSAgcmVsZWFzZT0iLSRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcnBhdGggfCB4cnBhdGgpCi0JICAjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQkgIGNhc2UgJGFyZyBpbgotCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSAgKikKLQkgICAgZnVuY19mYXRhbF9lcnJvciAib25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBpZiB0ZXN0ICIkcHJldiIgPSBycGF0aDsgdGhlbgotCSAgICBjYXNlICIkcnBhdGggIiBpbgotCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqKSBycGF0aD0iJHJwYXRoICRhcmciIDs7Ci0JICAgIGVzYWMKLQkgIGVsc2UKLQkgICAgY2FzZSAiJHhycGF0aCAiIGluCi0JICAgICoiICRhcmcgIiopIDs7Ci0JICAgICopIHhycGF0aD0iJHhycGF0aCAkYXJnIiA7OwotCSAgICBlc2FjCi0JICBmaQotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXNocmV4dCkKLQkgIHNocmV4dF9jbWRzPSIkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXdlYWspCi0JICB3ZWFrX2xpYnM9IiR3ZWFrX2xpYnMgJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQl4Y2NsaW5rZXIpCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJHFhcmciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgotCSAgcHJldj0KLQkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRxYXJnIgotCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRxYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0JeGNvbXBpbGVyKQotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkcWFyZyIKLQkgIHByZXY9Ci0JICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkcWFyZyIKLQkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkcWFyZyIKLQkgIGNvbnRpbnVlCi0JICA7OwotCXhsaW5rZXIpCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJHFhcmciCi0JICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRxYXJnIgotCSAgcHJldj0KLQkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICR3bCRxYXJnIgotCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICR3bCRxYXJnIgotCSAgY29udGludWUKLQkgIDs7Ci0JKikKLQkgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQllc2FjCi0gICAgICBmaSAjIHRlc3QgLW4gIiRwcmV2IgotCi0gICAgICBwcmV2YXJnPSIkYXJnIgotCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1hbGwtc3RhdGljKQotCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgIyBTZWUgY29tbWVudCBmb3IgLXN0YXRpYyBmbGFnIGJlbG93LCBmb3IgbW9yZSBkZXRhaWxzLgotCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGxpbmtfc3RhdGljX2ZsYWciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hbGxvdy11bmRlZmluZWQpCi0JIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgotCWZ1bmNfZmF0YWxfZXJyb3IgIlxgLWFsbG93LXVuZGVmaW5lZCcgbXVzdCBub3QgYmUgdXNlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IgotCTs7Ci0KLSAgICAgIC1hdm9pZC12ZXJzaW9uKQotCWF2b2lkX3ZlcnNpb249eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZGxvcGVuKQotCXByZXY9ZGxmaWxlcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRscHJlb3BlbikKLQlwcmV2PWRscHJlZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1leHBvcnQtZHluYW1pYykKLQlleHBvcnRfZHluYW1pYz15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1leHBvcnQtc3ltYm9scyB8IC1leHBvcnQtc3ltYm9scy1yZWdleCkKLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgIGZ1bmNfZmF0YWxfZXJyb3IgIm1vcmUgdGhhbiBvbmUgLWV4cG9ydGVkLXN5bWJvbHMgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQiCi0JZmkKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1leHBvcnQtc3ltYm9scyI7IHRoZW4KLQkgIHByZXY9ZXhwc3ltcwotCWVsc2UKLQkgIHByZXY9ZXhwc3ltc19yZWdleAotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZnJhbWV3b3JrKQotCXByZXY9ZnJhbWV3b3JrCi0JY29udGludWUKLQk7OwotCi0gICAgICAtaW5zdC1wcmVmaXgtZGlyKQotCXByZXY9aW5zdF9wcmVmaXgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgVGhlIG5hdGl2ZSBJUklYIGxpbmtlciB1bmRlcnN0YW5kcyAtTEFORzoqLCAtTElTVDoqIGFuZCAtTE5POioKLSAgICAgICMgc28sIGlmIHdlIHNlZSB0aGVzZSBmbGFncyBiZSBjYXJlZnVsIG5vdCB0byB0cmVhdCB0aGVtIGxpa2UgLUwKLSAgICAgIC1MW0EtWl1bQS1aXSo6KikKLQljYXNlICR3aXRoX2djYy8kaG9zdCBpbgotCW5vLyotKi1pcml4KiB8IC8qLSotaXJpeCopCi0JICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgotCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCi0JICA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1MKikKLQlmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkYXJnIgotCWRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAkZGlyIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSopCi0JICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0JICB0ZXN0IC16ICIkYWJzZGlyIiAmJiBcCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIKLQkgIGRpcj0iJGFic2RpciIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgIiRkZXBsaWJzICIgaW4KLQkqIiAtTCRkaXIgIiopIDs7Ci0JKikKLQkgIGRlcGxpYnM9IiRkZXBsaWJzIC1MJGRpciIKLQkgIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIgotCSAgOzsKLQllc2FjCi0JY2FzZSAkaG9zdCBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotCSAgdGVzdGJpbmRpcj1gJEVDSE8gIlgkZGlyIiB8ICRYc2VkIC1lICdzKi9saWIkKi9iaW4qJ2AKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JGRpcjoiKikgOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkaXIiOzsKLQkgIGVzYWMKLQkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgotCSAgKiI6JHRlc3RiaW5kaXI6IiopIDs7Ci0JICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokdGVzdGJpbmRpciI7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbCopCi0JaWYgdGVzdCAiWCRhcmciID0gIlgtbGMiIHx8IHRlc3QgIlgkYXJnIiA9ICJYLWxtIjsgdGhlbgotCSAgY2FzZSAkaG9zdCBpbgotCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLWJlb3MqKQotCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgb3IgbWF0aCBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLW9zMiopCi0JICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBsaWJyYXJ5IChhcyBzdWNoKQotCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKLQkgICAgOzsKLQkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQotCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KLQkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCi0JICAgICMgUmhhcHNvZHkgQyBhbmQgbWF0aCBsaWJyYXJpZXMgYXJlIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JICAgIGRlcGxpYnM9IiRkZXBsaWJzIFN5c3RlbS5sdGZyYW1ld29yayIKLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKLQkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCi0JICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQotCSAgICA7OwotCSAgKi0qLXN5c3Y0LjJ1dzIqIHwgKi0qLXN5c3Y1KiB8ICotKi11bml4d2FyZSogfCAqLSotT3BlblVOSVgqKQotCSAgICAjIENvbXBpbGVyIGluc2VydHMgbGliYyBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgdGhyZWFkcyB0byB3b3JrCi0JICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQotCSAgICA7OwotCSAgZXNhYwotCWVsaWYgdGVzdCAiWCRhcmciID0gIlgtbGNfciI7IHRoZW4KLQkgY2FzZSAkaG9zdCBpbgotCSAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKLQkgICAjIERvIG5vdCBpbmNsdWRlIGxpYmNfciBkaXJlY3RseSwgdXNlIC1wdGhyZWFkIGZsYWcuCi0JICAgY29udGludWUKLQkgICA7OwotCSBlc2FjCi0JZmkKLQlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW1vZHVsZSkKLQltb2R1bGU9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFRydTY0IFVOSVggdXNlcyAtbW9kZWwgW2FyZ10gdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgQysrCi0gICAgICAjIGNsYXNzZXMsIG5hbWUgbWFuZ2xpbmcsIGFuZCBleGNlcHRpb24gaGFuZGxpbmcuCi0gICAgICAjIERhcndpbiB1c2VzIHRoZSAtYXJjaCBmbGFnIHRvIGRldGVybWluZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLgotICAgICAgLW1vZGVsfC1hcmNofC1pc3lzcm9vdCkKLQljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0JZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKLQlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKLQlwcmV2PXhjb21waWxlcgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZXwtdGhyZWFkcykKLQljb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0JZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJGFyZyIKLQlmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKLQljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgotCSAgICAqIiAkYXJnICIqKSA7OwotCSAgICAqICkgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkYXJnIiA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1tdWx0aV9tb2R1bGUpCi0Jc2luZ2xlX21vZHVsZT0iJHt3bH0tbXVsdGlfbW9kdWxlIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLW5vLWZhc3QtaW5zdGFsbCkKLQlmYXN0X2luc3RhbGw9bm8KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby1pbnN0YWxsKQotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1kYXJ3aW4qKQotCSAgIyBUaGUgUEFUSCBoYWNrZXJ5IGluIHdyYXBwZXIgc2NyaXB0cyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzCi0JICAjIGFuZCBEYXJ3aW4gaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KLQkgIGZ1bmNfd2FybmluZyAiXGAtbm8taW5zdGFsbCcgaXMgaWdub3JlZCBmb3IgJGhvc3QiCi0JICBmdW5jX3dhcm5pbmcgImFzc3VtaW5nIFxgLW5vLWZhc3QtaW5zdGFsbCcgaW5zdGVhZCIKLQkgIGZhc3RfaW5zdGFsbD1ubwotCSAgOzsKLQkqKSBub19pbnN0YWxsPXllcyA7OwotCWVzYWMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1uby11bmRlZmluZWQpCi0JYWxsb3dfdW5kZWZpbmVkPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtb2JqZWN0bGlzdCkKLQlwcmV2PW9iamVjdGxpc3QKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1vKSBwcmV2PW91dHB1dCA7OwotCi0gICAgICAtcHJlY2lvdXMtZmlsZXMtcmVnZXgpCi0JcHJldj1wcmVjaW91c19yZWdleAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXJlbGVhc2UpCi0JcHJldj1yZWxlYXNlCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcnBhdGgpCi0JcHJldj1ycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIpCi0JcHJldj14cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKikKLQlmdW5jX3N0cmlwbmFtZSAnLVInICcnICIkYXJnIgotCWRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JY2FzZSAkZGlyIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OwotCSopCi0JICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgIiR4cnBhdGggIiBpbgotCSoiICRkaXIgIiopIDs7Ci0JKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7Ci0JZXNhYwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXNoYXJlZCkKLQkjIFRoZSBlZmZlY3RzIG9mIC1zaGFyZWQgYXJlIGRlZmluZWQgaW4gYSBwcmV2aW91cyBsb29wLgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXNocmV4dCkKLQlwcmV2PXNocmV4dAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQotCSMgVGhlIGVmZmVjdHMgb2YgLXN0YXRpYyBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCi0JIyBXZSB1c2VkIHRvIGRvIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljIG9uIHBsYXRmb3JtcyB0aGF0Ci0JIyBkaWRuJ3QgaGF2ZSBhIFBJQyBmbGFnLCBidXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZWZmZWN0cwotCSMgd291bGQgYmUgZXF1aXZhbGVudCB3YXMgd3JvbmcuICBJdCB3b3VsZCBicmVhayBvbiBhdCBsZWFzdAotCSMgRGlnaXRhbCBVbml4IGFuZCBBSVguCi0JY29udGludWUKLQk7OwotCi0gICAgICAtdGhyZWFkLXNhZmUpCi0JdGhyZWFkX3NhZmU9eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtdmVyc2lvbi1pbmZvKQotCXByZXY9dmluZm8KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC12ZXJzaW9uLW51bWJlcikKLQlwcmV2PXZpbmZvCi0JdmluZm9fbnVtYmVyPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXdlYWspCi0gICAgICAgIHByZXY9d2VhawotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVdjLCopCi0JZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgotCWFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCWFyZz0KLQlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKLQlmb3IgZmxhZyBpbiAkYXJnczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgotCSAgYXJnPSIkYXJnICR3bCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCi0JYXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQk7OwotCi0gICAgICAtV2wsKikKLQlmdW5jX3N0cmlwbmFtZSAnLVdsLCcgJycgIiRhcmciCi0JYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JYXJnPQotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJwotCWZvciBmbGFnIGluICRhcmdzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGZsYWciCi0JICBhcmc9IiRhcmcgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0JICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCi0JYXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQk7OwotCi0gICAgICAtWGNvbXBpbGVyKQotCXByZXY9eGNvbXBpbGVyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtWGxpbmtlcikKLQlwcmV2PXhsaW5rZXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1YQ0NsaW5rZXIpCi0JcHJldj14Y2NsaW5rZXIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgLW1zZ18qIGZvciBvc2YgY2MKLSAgICAgIC1tc2dfKikKLQlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCTs7Ci0KLSAgICAgICMgLTY0LCAtbWlwc1swLTldIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgU0dJIGNvbXBpbGVyCi0gICAgICAjIC1yWzAtOV1bMC05XSogc3BlY2lmaWVzIHRoZSBwcm9jZXNzb3Igb24gdGhlIFNHSSBjb21waWxlcgotICAgICAgIyAteGFyY2g9KiwgLXh0YXJnZXQ9KiBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIFN1biBjb21waWxlcgotICAgICAgIyArREEqLCArREQqIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgSFAgY29tcGlsZXIKLSAgICAgICMgLXEqIHBhc3MgdGhyb3VnaCBjb21waWxlciBhcmdzIGZvciB0aGUgSUJNIGNvbXBpbGVyCi0gICAgICAjIC1tKiwgLXRbNDVdKiwgLXR4c2NhbGUqIHBhc3MgdGhyb3VnaCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMKLSAgICAgICMgY29tcGlsZXIgYXJncyBmb3IgR0NDCi0gICAgICAjIC1GL3BhdGggZ2l2ZXMgcGF0aCB0byB1bmluc3RhbGxlZCBmcmFtZXdvcmtzLCBnY2Mgb24gZGFyd2luCi0gICAgICAjIC1wLCAtcGcsIC0tY292ZXJhZ2UsIC1mcHJvZmlsZS0qIHBhc3MgdGhyb3VnaCBwcm9maWxpbmcgZmxhZyBmb3IgR0NDCi0gICAgICAjIEBmaWxlIEdDQyByZXNwb25zZSBmaWxlcwotICAgICAgLTY0fC1taXBzWzAtOV18LXJbMC05XVswLTldKnwteGFyY2g9KnwteHRhcmdldD0qfCtEQSp8K0REKnwtcSp8LW0qfCBcCi0gICAgICAtdFs0NV0qfC10eHNjYWxlKnwtcHwtcGd8LS1jb3ZlcmFnZXwtZnByb2ZpbGUtKnwtRip8QCopCi0gICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCi0JYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCi0gICAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCi0gICAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgotICAgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICAgIDs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgotICAgICAgLSogfCArKikKLSAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKLQlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKLQk7OwotCi0gICAgICAqLiRvYmpleHQpCi0JIyBBIHN0YW5kYXJkIG9iamVjdC4KLQlvYmpzPSIkb2JqcyAkYXJnIgotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCi0KLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCi0JaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KLQkgIHBpY19vYmplY3Q9Ci0JICBub25fcGljX29iamVjdD0KLQotCSAgIyBSZWFkIHRoZSAubG8gZmlsZQotCSAgZnVuY19zb3VyY2UgIiRhcmciCi0KLQkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fAotCSAgICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAotCSAgICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJgotCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KLQkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCi0JICBmaQotCi0JICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgotCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKLQkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCi0JICBpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgotCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgotCSAgICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgotCi0JICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCi0JCWRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgotCQlwcmV2PQotCQljb250aW51ZQotCSAgICAgIGVsc2UKLQkJIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkJcHJldj1kbHByZWZpbGVzCi0JICAgICAgZmkKLQkgICAgZmkKLQotCSAgICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgotCSAgICAgIHByZXY9Ci0JICAgIGZpCi0KLQkgICAgIyBBIFBJQyBvYmplY3QuCi0JICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKLQkgICAgYXJnPSIkcGljX29iamVjdCIKLQkgIGZpCi0KLQkgICMgTm9uLVBJQyBvYmplY3QuCi0JICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KLQkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgotCi0JICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAotCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCi0JICAgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgotCSAgICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgotCSAgICBmaQotCSAgZWxzZQotCSAgICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCi0JICAgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KLQkgICAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgotCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCi0JICBmaQotCWVsc2UKLQkgICMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgotCSAgaWYgJG9wdF9kcnlfcnVuOyB0aGVuCi0JICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCi0JICAgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCi0JICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCi0JICAgIGZ1bmNfbG8ybyAiJGFyZyIKLQkgICAgcGljX29iamVjdD0keGRpciRvYmpkaXIvJGZ1bmNfbG8yb19yZXN1bHQKLQkgICAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAotCSAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCi0JICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKLQkgIGVsc2UKLQkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKLQkgIGZpCi0JZmkKLQk7OwotCi0gICAgICAqLiRsaWJleHQpCi0JIyBBbiBhcmNoaXZlLgotCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0Jb2xkX2RlcGxpYnM9IiRvbGRfZGVwbGlicyAkYXJnIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgKi5sYSkKLQkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCi0KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLQkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICBwcmV2PQotCWVsaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KLQkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCi0JICBwcmV2PQotCWVsc2UKLQkgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KLSAgICAgICopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgotCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgotCTs7Ci0gICAgICBlc2FjICMgYXJnCi0KLSAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KLQlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgotCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgotICAgICAgZmkKLSAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCi0KLSAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAotICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgotCi0gICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgotICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLSAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCi0gICAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKLSAgICBmaQotCi0gICAgb2xkbGlicz0KLSAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5Ci0gICAgZnVuY19iYXNlbmFtZSAiJG91dHB1dCIKLSAgICBvdXRwdXRuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0gICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKLQotICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgotICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkRUNITyBcIlhcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAotICAgIGVsc2UKLSAgICAgIHNobGliX3NlYXJjaF9wYXRoPQotICAgIGZpCi0gICAgZXZhbCBzeXNfbGliX3NlYXJjaF9wYXRoPVwiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlY1wiCi0gICAgZXZhbCBzeXNfbGliX2Rsc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWNcIgotCi0gICAgZnVuY19kaXJuYW1lICIkb3V0cHV0IiAiLyIgIiIKLSAgICBvdXRwdXRfb2JqZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCRvYmpkaXIiCi0gICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCi0gICAgZnVuY19ta2Rpcl9wICIkb3V0cHV0X29iamRpciIKLQotICAgICMgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG91dHB1dAotICAgIGNhc2UgJG91dHB1dCBpbgotICAgICIiKQotICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIgotICAgICAgOzsKLSAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OwotICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OwotICAgICoubGEpIGxpbmttb2RlPWxpYiA7OwotICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCi0gICAgZXNhYwotCi0gICAgc3BlY2lhbGRlcGxpYnM9Ci0KLSAgICBsaWJzPQotICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcwotICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQotICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0gICAgICBpZiAkb3B0X2R1cGxpY2F0ZV9kZXBzIDsgdGhlbgotCWNhc2UgIiRsaWJzICIgaW4KLQkqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JZXNhYwotICAgICAgZmkKLSAgICAgIGxpYnM9IiRsaWJzICRkZXBsaWIiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgotICAgICAgbGlicz0iJHByZWRlcHMgJGxpYnMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAkcG9zdGRlcHMiCi0KLSAgICAgICMgQ29tcHV0ZSBsaWJyYXJpZXMgdGhhdCBhcmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluICRwcmVkZXBzCi0gICAgICAjICRwb3N0ZGVwcyBhbmQgbWFyayB0aGVtIGFzIHNwZWNpYWwgKGkuZS4sIHdob3NlIGR1cGxpY2F0ZXMgYXJlCi0gICAgICAjIG5vdCB0byBiZSBlbGltaW5hdGVkKS4KLSAgICAgIHByZV9wb3N0X2RlcHM9Ci0gICAgICBpZiAkb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwczsgdGhlbgotCWZvciBwcmVfcG9zdF9kZXAgaW4gJHByZWRlcHMgJHBvc3RkZXBzOyBkbwotCSAgY2FzZSAiJHByZV9wb3N0X2RlcHMgIiBpbgotCSAgKiIgJHByZV9wb3N0X2RlcCAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkcHJlX3Bvc3RfZGVwcyIgOzsKLQkgIGVzYWMKLQkgIHByZV9wb3N0X2RlcHM9IiRwcmVfcG9zdF9kZXBzICRwcmVfcG9zdF9kZXAiCi0JZG9uZQotICAgICAgZmkKLSAgICAgIHByZV9wb3N0X2RlcHM9Ci0gICAgZmkKLQotICAgIGRlcGxpYnM9Ci0gICAgbmV3ZGVwZW5kZW5jeV9saWJzPQotICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0KLSAgICBuZWVkX3JlbGluaz1ubyAjIHdoZXRoZXIgd2UncmUgbGlua2luZyBhbnkgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKLSAgICBub3RpbnN0X2RlcGxpYnM9ICMgbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcwotICAgIG5vdGluc3RfcGF0aD0gIyBwYXRocyB0aGF0IGNvbnRhaW4gbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcwotCi0gICAgY2FzZSAkbGlua21vZGUgaW4KLSAgICBsaWIpCi0JcGFzc2VzPSJjb252IGRscHJlb3BlbiBsaW5rIgotCWZvciBmaWxlIGluICRkbGZpbGVzICRkbHByZWZpbGVzOyBkbwotCSAgY2FzZSAkZmlsZSBpbgotCSAgKi5sYSkgOzsKLQkgICopCi0JICAgIGZ1bmNfZmF0YWxfaGVscCAibGlicmFyaWVzIGNhbiBcYC1kbG9wZW4nIG9ubHkgbGlidG9vbCBsaWJyYXJpZXM6ICRmaWxlIgotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQk7OwotICAgIHByb2cpCi0JY29tcGlsZV9kZXBsaWJzPQotCWZpbmFsaXplX2RlcGxpYnM9Ci0JYWxsZGVwbGlicz1ubwotCW5ld2RsZmlsZXM9Ci0JbmV3ZGxwcmVmaWxlcz0KLQlwYXNzZXM9ImNvbnYgc2NhbiBkbG9wZW4gZGxwcmVvcGVuIGxpbmsiCi0JOzsKLSAgICAqKSAgcGFzc2VzPSJjb252IgotCTs7Ci0gICAgZXNhYwotCi0gICAgZm9yIHBhc3MgaW4gJHBhc3NlczsgZG8KLSAgICAgICMgVGhlIHByZW9wZW4gcGFzcyBpbiBsaWIgbW9kZSByZXZlcnNlcyAkZGVwbGliczsgcHV0IGl0IGJhY2sgaGVyZQotICAgICAgIyBzbyB0aGF0IC1MIGNvbWVzIGJlZm9yZSBsaWJzIHRoYXQgbmVlZCBpdCBmb3IgaW5zdGFuY2UuLi4KLSAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiOyB0aGVuCi0JIyMgRklYTUU6IEZpbmQgdGhlIHBsYWNlIHdoZXJlIHRoZSBsaXN0IGlzIHJlYnVpbHQgaW4gdGhlIHdyb25nCi0JIyMgICAgICAgIG9yZGVyLCBhbmQgZml4IGl0IHRoZXJlIHByb3Blcmx5Ci0gICAgICAgIHRtcF9kZXBsaWJzPQotCWZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JICB0bXBfZGVwbGlicz0iJGRlcGxpYiAkdG1wX2RlcGxpYnMiCi0JZG9uZQotCWRlcGxpYnM9IiR0bXBfZGVwbGlicyIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8Ci0JIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIjsgdGhlbgotCWxpYnM9IiRkZXBsaWJzIgotCWRlcGxpYnM9Ci0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQljYXNlICRwYXNzIGluCi0JZGxvcGVuKSBsaWJzPSIkZGxmaWxlcyIgOzsKLQlkbHByZW9wZW4pIGxpYnM9IiRkbHByZWZpbGVzIiA7OwotCWxpbmspIGxpYnM9IiRkZXBsaWJzICVERVBMSUJTJSAkZGVwZW5kZW5jeV9saWJzIiA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixkbHByZW9wZW4iOyB0aGVuCi0JIyBDb2xsZWN0IGFuZCBmb3J3YXJkIGRlcGxpYnMgb2YgcHJlb3BlbmVkIGxpYnRvb2wgbGlicwotCWZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAjIElnbm9yZSBub24tbGlidG9vbC1saWJzCi0JICBkZXBlbmRlbmN5X2xpYnM9Ci0JICBjYXNlICRsaWIgaW4KLQkgICoubGEpCWZ1bmNfc291cmNlICIkbGliIiA7OwotCSAgZXNhYwotCi0JICAjIENvbGxlY3QgcHJlb3BlbmVkIGxpYnRvb2wgZGVwbGlicywgZXhjZXB0IGFueSB0aGlzIGxpYnJhcnkKLQkgICMgaGFzIGRlY2xhcmVkIGFzIHdlYWsgbGlicwotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotICAgICAgICAgICAgZGVwbGliX2Jhc2U9YCRFQ0hPICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKLQkgICAgY2FzZSAiICR3ZWFrX2xpYnMgIiBpbgotCSAgICAqIiAkZGVwbGliX2Jhc2UgIiopIDs7Ci0JICAgICopIGRlcGxpYnM9IiRkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlkb25lCi0JbGlicz0iJGRscHJlZmlsZXMiCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCi0JIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcwotCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCi0JZGVwbGlicz0KLSAgICAgIGZpCi0KLSAgICAgIGZvciBkZXBsaWIgaW4gJGxpYnM7IGRvCi0JbGliPQotCWZvdW5kPW5vCi0JY2FzZSAkZGVwbGliIGluCi0JLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZXwtdGhyZWFkcykKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgIGVsc2UKLQkgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkZGVwbGliIgotCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliIDsgdGhlbgotCQljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgotCQkgICAgKiIgJGRlcGxpYiAiKikgOzsKLQkJICAgICogKSBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRkZXBsaWIiIDs7Ci0JCWVzYWMKLQkgICAgZmkKLQkgIGZpCi0JICBjb250aW51ZQotCSAgOzsKLQktbCopCi0JICBpZiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYiAmJiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2c7IHRoZW4KLQkgICAgZnVuY193YXJuaW5nICJcYC1sJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIgotCSAgICBjb250aW51ZQotCSAgZmkKLQkgIGZ1bmNfc3RyaXBuYW1lICctbCcgJycgIiRkZXBsaWIiCi0JICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KLQkgICAgc2VhcmNoZGlycz0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGliX3NlYXJjaF9wYXRoICRjb21waWxlcl9saWJfc2VhcmNoX2RpcnMgJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgotCSAgZWxzZQotCSAgICBzZWFyY2hkaXJzPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgotCSAgZmkKLQkgIGZvciBzZWFyY2hkaXIgaW4gJHNlYXJjaGRpcnM7IGRvCi0JICAgIGZvciBzZWFyY2hfZXh0IGluIC5sYSAkc3RkX3NocmV4dCAuc28gLmE7IGRvCi0JICAgICAgIyBTZWFyY2ggdGhlIGxpYnRvb2wgbGlicmFyeQotCSAgICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9JHtzZWFyY2hfZXh0fSIKLQkgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgotCQlpZiB0ZXN0ICIkc2VhcmNoX2V4dCIgPSAiLmxhIjsgdGhlbgotCQkgIGZvdW5kPXllcwotCQllbHNlCi0JCSAgZm91bmQ9bm8KLQkJZmkKLQkJYnJlYWsgMgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGRvbmUKLQkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCi0JICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQotCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBmaQotCSAgICBjb250aW51ZQotCSAgZWxzZSAjIGRlcGxpYiBpcyBhIGxpYnRvb2wgbGlicmFyeQotCSAgICAjIElmICRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMgJiYgJGRlcGxpYiBpcyBhIHN0ZGxpYiwKLQkgICAgIyBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCB0aGluZ3MgaGVyZSwgYW5kIG5vdCBsYXRlci4KLQkgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCSAgICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopCi0JCWlmIGZ1bmNfbGFsaWJfcCAiJGxpYiI7IHRoZW4KLQkJICBsaWJyYXJ5X25hbWVzPQotCQkgIG9sZF9saWJyYXJ5PQotCQkgIGZ1bmNfc291cmNlICIkbGliIgotCQkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLQkJICAgIGxsPSIkbCIKLQkJICBkb25lCi0JCSAgaWYgdGVzdCAiWCRsbCIgPSAiWCRvbGRfbGlicmFyeSIgOyB0aGVuICMgb25seSBzdGF0aWMgdmVyc2lvbiBhdmFpbGFibGUKLQkJICAgIGZvdW5kPW5vCi0JCSAgICBmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgotCQkgICAgbGFkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCQkgICAgbGliPSRsYWRpci8kb2xkX2xpYnJhcnkKLQkJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgotCQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkJICAgIGVsc2UKLQkJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQkJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkJICAgIGZpCi0JCSAgICBjb250aW51ZQotCQkgIGZpCi0JCWZpCi0JCTs7Ci0JICAgICAgKikgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBmaQotCSAgOzsgIyAtbAotCSoubHRmcmFtZXdvcmspCi0JICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICBlbHNlCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgOyB0aGVuCi0JCWNhc2UgIiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCi0JCSAgICAqIiAkZGVwbGliICIqKSA7OwotCQkgICAgKiApIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGRlcGxpYiIgOzsKLQkJZXNhYwotCSAgICBmaQotCSAgZmkKLQkgIGNvbnRpbnVlCi0JICA7OwotCS1MKikKLQkgIGNhc2UgJGxpbmttb2RlIGluCi0JICBsaWIpCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKLQkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCi0JICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgotCSAgICA7OwotCSAgcHJvZykKLQkgICAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgICAgY29udGludWUKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiJHBhc3MiID0gc2NhbjsgdGhlbgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGVsc2UKLQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgotCSAgICBmaQotCSAgICBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgotCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKLQkgICAgOzsKLQkgICopCi0JICAgIGZ1bmNfd2FybmluZyAiXGAtTCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIKLQkgICAgOzsKLQkgIGVzYWMgIyBsaW5rbW9kZQotCSAgY29udGludWUKLQkgIDs7ICMgLUwKLQktUiopCi0JICBpZiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCi0JICAgIGZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRkZXBsaWIiCi0JICAgIGRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0JICAgIGNhc2UgIiR4cnBhdGggIiBpbgotCSAgICAqIiAkZGlyICIqKSA7OwotCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKLQkgICAgZXNhYwotCSAgZmkKLQkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICBjb250aW51ZQotCSAgOzsKLQkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7Ci0JKi4kbGliZXh0KQotCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgotCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBjb250aW51ZQotCSAgZmkKLQkgIGNhc2UgJGxpbmttb2RlIGluCi0JICBsaWIpCi0JICAgICMgTGlua2luZyBjb252ZW5pZW5jZSBtb2R1bGVzIGludG8gc2hhcmVkIGxpYnJhcmllcyBpcyBhbGxvd2VkLAotCSAgICAjIGJ1dCBsaW5raW5nIG90aGVyIHN0YXRpYyBsaWJyYXJpZXMgaXMgbm9uLXBvcnRhYmxlLgotCSAgICBjYXNlICIgJGRscHJlY29udmVuaWVuY2VsaWJzICIgaW4KLQkgICAgKiIgJGRlcGxpYiAiKikgOzsKLQkgICAgKikKLQkgICAgICB2YWxpZF9hX2xpYj1ubwotCSAgICAgIGNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCi0JCW1hdGNoX3BhdHRlcm4qKQotCQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0Ci0JCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAotCQkgIGlmIGV2YWwgIlwkRUNITyBcIlgkZGVwbGliXCIiIDI+L2Rldi9udWxsIHwgJFhzZWQgLWUgMTBxIFwKLQkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLQkJICAgIHZhbGlkX2FfbGliPXllcwotCQkgIGZpCi0JCTs7Ci0JCXBhc3NfYWxsKQotCQkgIHZhbGlkX2FfbGliPXllcwotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgICBpZiB0ZXN0ICIkdmFsaWRfYV9saWIiICE9IHllczsgdGhlbgotCQkkRUNITwotCQkkRUNITyAiKioqIFdhcm5pbmc6IFRyeWluZyB0byBsaW5rIHdpdGggc3RhdGljIGxpYiBhcmNoaXZlICRkZXBsaWIuIgotCQkkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJJEVDSE8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCSRFQ0hPICIqKiogYmVjYXVzZSB0aGUgZmlsZSBleHRlbnNpb25zIC4kbGliZXh0IG9mIHRoaXMgYXJndW1lbnQgbWFrZXMgbWUgYmVsaWV2ZSIKLQkJJEVDSE8gIioqKiB0aGF0IGl0IGlzIGp1c3QgYSBzdGF0aWMgYXJjaGl2ZSB0aGF0IEkgc2hvdWxkIG5vdCB1c2UgaGVyZS4iCi0JICAgICAgZWxzZQotCQkkRUNITwotCQkkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUiCi0JCSRFQ0hPICIqKiogc3RhdGljIGxpYnJhcnkgJGRlcGxpYiBpcyBub3QgcG9ydGFibGUhIgotCQlkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICAgIGZpCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgcHJvZykKLQkgICAgaWYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZmkKLQkgICAgY29udGludWUKLQkgICAgOzsKLQkgIGVzYWMgIyBsaW5rbW9kZQotCSAgOzsgIyAqLiRsaWJleHQKLQkqLmxvIHwgKi4kb2JqZXh0KQotCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgotCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW4gfHwgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAotCSAgICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgotCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkZXBsaWIiCi0JICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCi0JICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRkZXBsaWIiCi0JICAgIGZpCi0JICBmaQotCSAgY29udGludWUKLQkgIDs7Ci0JJURFUExJQlMlKQotCSAgYWxsZGVwbGlicz15ZXMKLQkgIGNvbnRpbnVlCi0JICA7OwotCWVzYWMgIyBjYXNlICRkZXBsaWIKLQotCWlmIHRlc3QgIiRmb3VuZCIgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgotCWVsc2UKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYicgb3IgdW5oYW5kbGVkIGFyZ3VtZW50IFxgJGRlcGxpYiciCi0JZmkKLQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JZnVuY19sYWxpYl91bnNhZmVfcCAiJGxpYiIgXAotCSAgfHwgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCi0KLQlmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgotCWxhZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKLQotCWRsbmFtZT0KLQlkbG9wZW49Ci0JZGxwcmVvcGVuPQotCWxpYmRpcj0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCWluaGVyaXRlZF9saW5rZXJfZmxhZ3M9Ci0JIyBJZiB0aGUgbGlicmFyeSB3YXMgaW5zdGFsbGVkIHdpdGggYW4gb2xkIHJlbGVhc2Ugb2YgbGlidG9vbCwKLQkjIGl0IHdpbGwgbm90IHJlZGVmaW5lIHZhcmlhYmxlcyBpbnN0YWxsZWQsIG9yIHNob3VsZG5vdGxpbmsKLQlpbnN0YWxsZWQ9eWVzCi0Jc2hvdWxkbm90bGluaz1ubwotCWF2b2lkdGVtcHJwYXRoPQotCi0KLQkjIFJlYWQgdGhlIC5sYSBmaWxlCi0JZnVuY19zb3VyY2UgIiRsaWIiCi0KLQkjIENvbnZlcnQgIi1mcmFtZXdvcmsgZm9vIiB0byAiZm9vLmx0ZnJhbWV3b3JrIgotCWlmIHRlc3QgLW4gIiRpbmhlcml0ZWRfbGlua2VyX2ZsYWdzIjsgdGhlbgotCSAgdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9YCRFQ0hPICJYJGluaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFhzZWQgLWUgJ3MvLWZyYW1ld29yayBcKFteICRdKlwpL1wxLmx0ZnJhbWV3b3JrL2cnYAotCSAgZm9yIHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWcgaW4gJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWdzOyBkbwotCSAgICBjYXNlICIgJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KLQkgICAgICAqIiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyAiKikgOzsKLQkgICAgICAqKSBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnIjs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIlggJGRlcGVuZGVuY3lfbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKLQlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAotCSAgIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIiB8fAotCSAgIHsgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliOyB9OyB0aGVuCi0JICB0ZXN0IC1uICIkZGxvcGVuIiAmJiBkbGZpbGVzPSIkZGxmaWxlcyAkZGxvcGVuIgotCSAgdGVzdCAtbiAiJGRscHJlb3BlbiIgJiYgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRscHJlb3BlbiIKLQlmaQotCi0JaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgotCSAgIyBPbmx5IGNoZWNrIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMKLQkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCi0JICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciCi0JICAgIGZpCi0JICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KLQkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCi0JICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCi0JICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgdGhlbgotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIGNvbnZlbmllbmNlIGxpYnJhcnkiCi0JICBmaQotCSAgdG1wX2xpYnM9Ci0JICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCi0JICAgIGlmICRvcHRfZHVwbGljYXRlX2RlcHMgOyB0aGVuCi0JICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICBkb25lCi0JICBjb250aW51ZQotCWZpICMgJHBhc3MgPSBjb252Ci0KLQotCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KLQlsaW5rbGliPQotCWZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLQkgIGxpbmtsaWI9IiRsIgotCWRvbmUKLQlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KLQkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIgotCWZpCi0KLQkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLQlpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KLQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIKLQkgIGZpCi0JICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fAotCSAgICAgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwKLQkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KLQkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKLQkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuICBXZSBhbHNvIG5lZWQgdG8gcHJlbG9hZCBhbnkKLQkgICAgIyBkZXBlbmRlbnQgbGlicmFyaWVzIHNvIGxpYmx0ZGwncyBkZXBsaWIgcHJlbG9hZGVyIGRvZXNuJ3QKLQkgICAgIyBib21iIG91dCBpbiB0aGUgbG9hZCBkZXBsaWJzIHBoYXNlLgotCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliICRkZXBlbmRlbmN5X2xpYnMiCi0JICBlbHNlCi0JICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiCi0JICBmaQotCSAgY29udGludWUKLQlmaSAjICRwYXNzID0gZGxvcGVuCi0KLQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQljYXNlICRsYWRpciBpbgotCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzX2xhZGlyPSIkbGFkaXIiIDs7Ci0JKikKLQkgIGFic19sYWRpcj1gY2QgIiRsYWRpciIgJiYgcHdkYAotCSAgaWYgdGVzdCAteiAiJGFic19sYWRpciI7IHRoZW4KLQkgICAgZnVuY193YXJuaW5nICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGxhZGlyJyIKLQkgICAgZnVuY193YXJuaW5nICJwYXNzaW5nIGl0IGxpdGVyYWxseSB0byB0aGUgbGlua2VyLCBhbHRob3VnaCBpdCBtaWdodCBmYWlsIgotCSAgICBhYnNfbGFkaXI9IiRsYWRpciIKLQkgIGZpCi0JICA7OwotCWVzYWMKLQlmdW5jX2Jhc2VuYW1lICIkbGliIgotCWxhbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCi0JIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCi0JaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgotCSAgaWYgdGVzdCAhIC1mICIkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgotCSAgICBmdW5jX3dhcm5pbmcgImxpYnJhcnkgXGAkbGliJyB3YXMgbW92ZWQuIgotCSAgICBkaXI9IiRsYWRpciIKLQkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgotCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCi0JICBlbHNlCi0JICAgIGRpcj0iJGxpYmRpciIKLQkgICAgYWJzZGlyPSIkbGliZGlyIgotCSAgZmkKLQkgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljIiA9IFh5ZXMgJiYgYXZvaWR0ZW1wcnBhdGg9eWVzCi0JZWxzZQotCSAgaWYgdGVzdCAhIC1mICIkbGFkaXIvJG9iamRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KLQkgICAgZGlyPSIkbGFkaXIiCi0JICAgIGFic2Rpcj0iJGFic19sYWRpciIKLQkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgotCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGFic19sYWRpciIKLQkgIGVsc2UKLQkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKLQkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCi0JICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKLQkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCi0JICBmaQotCWZpICMgJGluc3RhbGxlZCA9IHllcwotCWZ1bmNfc3RyaXBuYW1lICdsaWInICcubGEnICIkbGFuYW1lIgotCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCi0JIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCi0JaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCi0JICBpZiB0ZXN0IC16ICIkbGliZGlyIiAmJiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGxpYnJhcmllcyBtYXkgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciCi0JICBmaQotCSAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCi0JICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KLQkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCi0JICAgICMgS2VlcCBhIGxpc3Qgb2YgcHJlb3BlbmVkIGNvbnZlbmllbmNlIGxpYnJhcmllcyB0byBjaGVjawotCSAgICAjIHRoYXQgdGhleSBhcmUgYmVpbmcgdXNlZCBjb3JyZWN0bHkgaW4gdGhlIGxpbmsgcGFzcy4KLQkgICAgdGVzdCAteiAiJGxpYmRpciIgJiYgXAotCQlkbHByZWNvbnZlbmllbmNlbGlicz0iJGRscHJlY29udmVuaWVuY2VsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgIyBPdGhlcndpc2UsIHVzZSB0aGUgZGxuYW1lLCBzbyB0aGF0IGx0X2Rsb3BlbiBmaW5kcyBpdC4KLQkgIGVsaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KLQkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kZGxuYW1lIgotCSAgZWxzZQotCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgotCSAgZmkKLQlmaSAjICRwYXNzID0gZGxwcmVvcGVuCi0KLQlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgotCSAgIyBMaW5rIHRoZSBjb252ZW5pZW5jZSBsaWJyYXJ5Ci0JICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCi0JICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgotCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KLQkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZmluYWxpemVfZGVwbGlicyIKLQkgIGVsc2UKLQkgICAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIgIyB1c2VkIGZvciBwcm9nLHNjYW4gcGFzcwotCSAgZmkKLQkgIGNvbnRpbnVlCi0JZmkKLQotCi0JaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgJiYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGFkaXIiCi0JICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgotCi0JICBsaW5rYWxsZGVwbGlicz1ubwotCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vIHx8IHRlc3QgLXogIiRsaWJyYXJ5X25hbWVzIiB8fAotCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICBsaW5rYWxsZGVwbGlicz15ZXMKLQkgIGZpCi0KLQkgIHRtcF9saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICBjYXNlICRkZXBsaWIgaW4KLQkgICAgLUwqKSBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgotCSAgICAgICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgotCQkgOzsKLQkgICAgZXNhYwotCSAgICAjIE5lZWQgdG8gbGluayBhZ2FpbnN0IGFsbCBkZXBlbmRlbmN5X2xpYnM/Ci0JICAgIGlmIHRlc3QgIiRsaW5rYWxsZGVwbGlicyIgPSB5ZXM7IHRoZW4KLQkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgIyBOZWVkIHRvIGhhcmRjb2RlIHNoYXJlZCBsaWJyYXJ5IHBhdGhzCi0JICAgICAgIyBvci9hbmQgbGluayBhZ2FpbnN0IHN0YXRpYyBsaWJyYXJpZXMKLQkgICAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICAgZmkKLQkgICAgaWYgJG9wdF9kdXBsaWNhdGVfZGVwcyA7IHRoZW4KLQkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKLQkgIGRvbmUgIyBmb3IgZGVwbGliCi0JICBjb250aW51ZQotCWZpICMgJGxpbmttb2RlID0gcHJvZy4uLgotCi0JaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKLQkgICAgIHsgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IG5vIHx8Ci0JICAgICAgICAgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicywkaW5zdGFsbGVkIiA9ICJidWlsdCx5ZXMiOyB9IHx8Ci0JICAgICAgIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KLQkgICAgIyBXZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGgKLQkgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLXogIiRhdm9pZHRlbXBycGF0aCIgOyB0aGVuCi0JICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgotCSAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoOiIgaW4KLQkgICAgICAqIiRhYnNkaXI6IiopIDs7Ci0JICAgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGgkYWJzZGlyOiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0KLQkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgotCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCi0JICAgICMgc2VhcmNoIHBhdGguCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBmaSAjICRsaW5rbW9kZSwkcGFzcyA9IHByb2csbGluay4uLgotCi0JICBpZiB0ZXN0ICIkYWxsZGVwbGlicyIgPSB5ZXMgJiYKLQkgICAgIHsgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9IHBhc3NfYWxsIHx8Ci0JICAgICAgIHsgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYKLQkJIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgfTsgfTsgdGhlbgotCSAgICAjIFdlIG9ubHkgbmVlZCB0byBzZWFyY2ggZm9yIHN0YXRpYyBsaWJyYXJpZXMKLQkgICAgY29udGludWUKLQkgIGZpCi0JZmkKLQotCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKLQl1c2Vfc3RhdGljX2xpYnM9JHByZWZlcl9zdGF0aWNfbGlicwotCWlmIHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gYnVpbHQgJiYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KLQkgIHVzZV9zdGF0aWNfbGlicz1ubwotCWZpCi0JaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCi0JICAgeyB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KLQkgIGNhc2UgJGhvc3QgaW4KLQkgICpjeWd3aW4qIHwgKm1pbmd3KikKLQkgICAgICAjIE5vIHBvaW50IGluIHJlbGlua2luZyBETExzIGJlY2F1c2UgcGF0aHMgYXJlIG5vdCBlbmNvZGVkCi0JICAgICAgbm90aW5zdF9kZXBsaWJzPSIkbm90aW5zdF9kZXBsaWJzICRsaWIiCi0JICAgICAgbmVlZF9yZWxpbms9bm8KLQkgICAgOzsKLQkgICopCi0JICAgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0gbm87IHRoZW4KLQkgICAgICBub3RpbnN0X2RlcGxpYnM9IiRub3RpbnN0X2RlcGxpYnMgJGxpYiIKLQkgICAgICBuZWVkX3JlbGluaz15ZXMKLQkgICAgZmkKLQkgICAgOzsKLQkgIGVzYWMKLQkgICMgVGhpcyBpcyBhIHNoYXJlZCBsaWJyYXJ5Ci0KLQkgICMgV2FybiBhYm91dCBwb3J0YWJpbGl0eSwgY2FuJ3QgbGluayBhZ2FpbnN0IC1tb2R1bGUncyBvbiBzb21lCi0JICAjIHN5c3RlbXMgKGRhcndpbikuICBEb24ndCBibGVhdCBhYm91dCBkbG9wZW5lZCBtb2R1bGVzIHRob3VnaCEKLQkgIGRsb3Blbm1vZHVsZT0iIgotCSAgZm9yIGRscHJlbW9kdWxldGVzdCBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICAgaWYgdGVzdCAiWCRkbHByZW1vZHVsZXRlc3QiID0gIlgkbGliIjsgdGhlbgotCSAgICAgIGRsb3Blbm1vZHVsZT0iJGRscHJlbW9kdWxldGVzdCIKLQkgICAgICBicmVhawotCSAgICBmaQotCSAgZG9uZQotCSAgaWYgdGVzdCAteiAiJGRsb3Blbm1vZHVsZSIgJiYgdGVzdCAiJHNob3VsZG5vdGxpbmsiID0geWVzICYmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KLQkgICAgJEVDSE8KLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIGV4ZWN1dGFibGUgJG91dHB1dCBhZ2FpbnN0IHRoZSBsb2FkYWJsZSBtb2R1bGUiCi0JICAgIGVsc2UKLQkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgotCSAgICBmaQotCSAgICAkRUNITyAiKioqICRsaW5rbGliIGlzIG5vdCBwb3J0YWJsZSEiCi0JICBmaQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJgotCSAgICAgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgPSB5ZXM7IHRoZW4KLQkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgotCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCi0JICAgICMgc2VhcmNoIHBhdGguCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCi0JICAgICAgKiIgJGFic2RpciAiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLQkgICAgKiIgJGxpYmRpciAiKikgOzsKLQkgICAgKikKLQkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgotCSAgICAgIGVzYWMKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBmaQotCi0JICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiOyB0aGVuCi0JICAgICMgZmlndXJlIG91dCB0aGUgc29uYW1lCi0JICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCSAgICBzaGlmdAotCSAgICByZWFsbmFtZT0iJDEiCi0JICAgIHNoaWZ0Ci0JICAgIGxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAotCSAgICAjIHVzZSBkbG5hbWUgaWYgd2UgZ290IGl0LiBpdCdzIHBlcmZlY3RseSBnb29kLCBubz8KLQkgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KLQkgICAgICBzb25hbWU9IiRkbG5hbWUiCi0JICAgIGVsaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgotCSAgICAgICMgYmxlaCB3aW5kb3dzCi0JICAgICAgY2FzZSAkaG9zdCBpbgotCSAgICAgICpjeWd3aW4qIHwgbWluZ3cqKQotCSAgICAgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKLQkJbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JCXZlcnN1ZmZpeD0iLSRtYWpvciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotCSAgICBlbHNlCi0JICAgICAgc29uYW1lPSIkcmVhbG5hbWUiCi0JICAgIGZpCi0KLQkgICAgIyBNYWtlIGEgbmV3IG5hbWUgZm9yIHRoZSBleHRyYWN0X2V4cHN5bXNfY21kcyB0byB1c2UKLQkgICAgc29yb290PSIkc29uYW1lIgotCSAgICBmdW5jX2Jhc2VuYW1lICIkc29yb290IgotCSAgICBzb25hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkgICAgZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5kbGwnICIkc29uYW1lIgotCSAgICBuZXdsaWI9bGliaW1wLSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuYQotCi0JICAgICMgSWYgdGhlIGxpYnJhcnkgaGFzIG5vIGV4cG9ydCBsaXN0LCB0aGVuIGNyZWF0ZSBvbmUgbm93Ci0JICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIjsgdGhlbiA6Ci0JICAgIGVsc2UKLQkgICAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBcYCRzb25hbWUnIgotCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkZXh0cmFjdF9leHBzeW1zX2NtZHMiICdleGl0ICQ/JwotCSAgICBmaQotCi0JICAgICMgQ3JlYXRlICRuZXdsaWIKLQkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG5ld2xpYiI7IHRoZW4gOjsgZWxzZQotCSAgICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBpbXBvcnQgbGlicmFyeSBmb3IgXGAkc29uYW1lJyIKLQkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIiAnZXhpdCAkPycKLQkgICAgZmkKLQkgICAgIyBtYWtlIHN1cmUgdGhlIGxpYnJhcnkgdmFyaWFibGVzIGFyZSBwb2ludGluZyB0byB0aGUgbmV3IGxpYnJhcnkKLQkgICAgZGlyPSRvdXRwdXRfb2JqZGlyCi0JICAgIGxpbmtsaWI9JG5ld2xpYgotCSAgZmkgIyB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiCi0KLQkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiAhPSByZWxpbms7IHRoZW4KLQkgICAgYWRkX3NobGlicGF0aD0KLQkgICAgYWRkX2Rpcj0KLQkgICAgYWRkPQotCSAgICBsaWJfbGlua2VkPXllcwotCSAgICBjYXNlICRoYXJkY29kZV9hY3Rpb24gaW4KLQkgICAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSBubzsgdGhlbgotCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCi0JCWNhc2UgJGhvc3QgaW4KLQkJICAqLSotc2NvMy4ydjUuMC5bMDI0XSopIGFkZF9kaXI9Ii1MJGRpciIgOzsKLQkJICAqLSotc3lzdjQqdXcyKikgYWRkX2Rpcj0iLUwkZGlyIiA7OwotCQkgICotKi1zeXN2NU9wZW5VTklYKiB8ICotKi1zeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgXAotCQkgICAgKi0qLXVuaXh3YXJlNyopIGFkZF9kaXI9Ii1MJGRpciIgOzsKLQkJICAqLSotZGFyd2luKiApCi0JCSAgICAjIGlmIHRoZSBsaWIgaXMgYSAobm9uLWRsb3BlbmVkKSBtb2R1bGUgdGhlbiB3ZSBjYW4gbm90Ci0JCSAgICAjIGxpbmsgYWdhaW5zdCBpdCwgc29tZW9uZSBpcyBpZ25vcmluZyB0aGUgZWFybGllciB3YXJuaW5ncwotCQkgICAgaWYgL3Vzci9iaW4vZmlsZSAtTCAkYWRkIDI+IC9kZXYvbnVsbCB8Ci0JCQkgJEdSRVAgIjogW146XSogYnVuZGxlIiA+L2Rldi9udWxsIDsgdGhlbgotCQkgICAgICBpZiB0ZXN0ICJYJGRsb3Blbm1vZHVsZSIgIT0gIlgkbGliIjsgdGhlbgotCQkJJEVDSE8gIioqKiBXYXJuaW5nOiBsaWIgJGxpbmtsaWIgaXMgYSBtb2R1bGUsIG5vdCBhIHNoYXJlZCBsaWJyYXJ5IgotCQkJaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IiA7IHRoZW4KLQkJCSAgJEVDSE8KLQkJCSAgJEVDSE8gIioqKiBBbmQgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgc3RhdGljIGFyY2hpdmUgYXZhaWxhYmxlIgotCQkJICAkRUNITyAiKioqIFRoZSBsaW5rIHdpbGwgcHJvYmFibHkgZmFpbCwgc29ycnkiCi0JCQllbHNlCi0JCQkgIGFkZD0iJGRpci8kb2xkX2xpYnJhcnkiCi0JCQlmaQotCQkgICAgICBlbGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkJCWFkZD0iJGRpci8kb2xkX2xpYnJhcnkiCi0JCSAgICAgIGZpCi0JCSAgICBmaQotCQllc2FjCi0JICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgotCQljYXNlICRob3N0IGluCi0JCSotKi1zdW5vcyopIGFkZF9zaGxpYnBhdGg9IiRkaXIiIDs7Ci0JCWVzYWMKLQkJYWRkX2Rpcj0iLUwkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSBubzsgdGhlbgotCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxzZQotCQlsaWJfbGlua2VkPW5vCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICByZWxpbmspCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXMgJiYKLQkgICAgICAgICB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiA9IG5vOyB0aGVuCi0JCWFkZD0iJGRpci8kbGlua2xpYiIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCQlhZGRfZGlyPSItTCRkaXIiCi0JCSMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KLQkJaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KLQkJICBjYXNlICRsaWJkaXIgaW4KLQkJICAgIFtcXC9dKikKLQkJICAgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKLQkJICAgICAgOzsKLQkJICBlc2FjCi0JCWZpCi0JCWFkZD0iLWwkbmFtZSIKLQkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgotCQlhZGQ9Ii1sJG5hbWUiCi0JICAgICAgZWxzZQotCQlsaWJfbGlua2VkPW5vCi0JICAgICAgZmkKLQkgICAgICA7OwotCSAgICAqKSBsaWJfbGlua2VkPW5vIDs7Ci0JICAgIGVzYWMKLQotCSAgICBpZiB0ZXN0ICIkbGliX2xpbmtlZCIgIT0geWVzOyB0aGVuCi0JICAgICAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJ1bnN1cHBvcnRlZCBoYXJkY29kZSBwcm9wZXJ0aWVzIgotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLW4gIiRhZGRfc2hsaWJwYXRoIjsgdGhlbgotCSAgICAgIGNhc2UgOiRjb21waWxlX3NobGlicGF0aDogaW4KLQkgICAgICAqIjokYWRkX3NobGlicGF0aDoiKikgOzsKLQkgICAgICAqKSBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGFkZF9zaGxpYnBhdGg6IiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkX2RpciAkY29tcGlsZV9kZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZCAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBlbHNlCi0JICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgotCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCi0JICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0geWVzICYmCi0JCSB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0geWVzICYmCi0JCSB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkJY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KLQkJKiI6JGxpYmRpcjoiKikgOzsKLQkJKikgZmluYWxpemVfc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoJGxpYmRpcjoiIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICBmaQotCSAgZmkKLQotCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JICAgIGFkZF9zaGxpYnBhdGg9Ci0JICAgIGFkZF9kaXI9Ci0JICAgIGFkZD0KLQkgICAgIyBGaW5hbGl6ZSBjb21tYW5kIGZvciBib3RoIGlzIHNpbXBsZToganVzdCBoYXJkY29kZSBpdC4KLQkgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXMgJiYKLQkgICAgICAgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSIgPSBubzsgdGhlbgotCSAgICAgIGFkZD0iJGxpYmRpci8kbGlua2xpYiIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLQkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCi0JICAgICAgYWRkPSItbCRuYW1lIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCSAgICAgIGNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCi0JICAgICAgKiI6JGxpYmRpcjoiKikgOzsKLQkgICAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKLQkgICAgICBlc2FjCi0JICAgICAgYWRkPSItbCRuYW1lIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzOyB0aGVuCi0JICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciIgJiYKLQkJIHRlc3QgLWYgIiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIiA7IHRoZW4KLQkJYWRkPSIkaW5zdF9wcmVmaXhfZGlyJGxpYmRpci8kbGlua2xpYiIKLQkgICAgICBlbHNlCi0JCWFkZD0iJGxpYmRpci8kbGlua2xpYiIKLQkgICAgICBmaQotCSAgICBlbHNlCi0JICAgICAgIyBXZSBjYW5ub3Qgc2VlbSB0byBoYXJkY29kZSBpdCwgZ3Vlc3Mgd2UnbGwgZmFrZSBpdC4KLQkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCi0JICAgICAgIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgotCSAgICAgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCi0JCWNhc2UgJGxpYmRpciBpbgotCQkgIFtcXC9dKikKLQkJICAgIGFkZF9kaXI9IiRhZGRfZGlyIC1MJGluc3RfcHJlZml4X2RpciRsaWJkaXIiCi0JCSAgICA7OwotCQllc2FjCi0JICAgICAgZmkKLQkgICAgICBhZGQ9Ii1sJG5hbWUiCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KLQkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZF9kaXIgJGZpbmFsaXplX2RlcGxpYnMiCi0JICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZCAkZmluYWxpemVfZGVwbGlicyIKLQkgICAgZWxzZQotCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBkZXBsaWJzPSIkYWRkX2RpciAkZGVwbGlicyIKLQkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBkZXBsaWJzPSIkYWRkICRkZXBsaWJzIgotCSAgICBmaQotCSAgZmkKLQllbGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCi0JICAjIEhlcmUgd2UgYXNzdW1lIHRoYXQgb25lIG9mIGhhcmRjb2RlX2RpcmVjdCBvciBoYXJkY29kZV9taW51c19MCi0JICAjIGlzIG5vdCB1bnN1cHBvcnRlZC4gIFRoaXMgaXMgdmFsaWQgb24gYWxsIGtub3duIHN0YXRpYyBhbmQKLQkgICMgc2hhcmVkIHBsYXRmb3Jtcy4KLQkgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgbGlua2xpYj0iJG9sZF9saWJyYXJ5IgotCSAgICBjb21waWxlX2RlcGxpYnM9IiRkaXIvJGxpbmtsaWIgJGNvbXBpbGVfZGVwbGlicyIKLQkgICAgZmluYWxpemVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkZmluYWxpemVfZGVwbGlicyIKLQkgIGVsc2UKLQkgICAgY29tcGlsZV9kZXBsaWJzPSItbCRuYW1lIC1MJGRpciAkY29tcGlsZV9kZXBsaWJzIgotCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSItbCRuYW1lIC1MJGRpciAkZmluYWxpemVfZGVwbGlicyIKLQkgIGZpCi0JZWxpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBOb3QgYSBzaGFyZWQgbGlicmFyeQotCSAgaWYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgotCSAgICAjIFdlJ3JlIHRyeWluZyBsaW5rIGEgc2hhcmVkIGxpYnJhcnkgYWdhaW5zdCBhIHN0YXRpYyBvbmUKLQkgICAgIyBidXQgdGhlIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgaXQuCi0KLQkgICAgIyBKdXN0IHByaW50IGEgd2FybmluZyBhbmQgYWRkIHRoZSBsaWJyYXJ5IHRvIGRlcGVuZGVuY3lfbGlicyBzbwotCSAgICAjIHRoYXQgdGhlIHByb2dyYW0gY2FuIGJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBzdGF0aWMgbGlicmFyeS4KLQkgICAgJEVDSE8KLQkgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBUaGlzIHN5c3RlbSBjYW4gbm90IGxpbmsgdG8gc3RhdGljIGxpYiBhcmNoaXZlICRsaWIuIgotCSAgICAkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkgICAgJEVDSE8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JICAgICRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCSAgICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgotCSAgICAgICRFQ0hPICIqKiogQnV0IGFzIHlvdSB0cnkgdG8gYnVpbGQgYSBtb2R1bGUgbGlicmFyeSwgbGlidG9vbCB3aWxsIHN0aWxsIGNyZWF0ZSAiCi0JICAgICAgJEVDSE8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIGFwcGxpY2F0aW9uIgotCSAgICAgICRFQ0hPICIqKiogaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZyB0byByZXNvbHZlIHN5bWJvbHMgYXQgcnVudGltZS4iCi0JICAgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkJJEVDSE8KLQkJJEVDSE8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgotCQkkRUNITyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkJJEVDSE8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKLQkJJEVDSE8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKLQkJYnVpbGRfb2xkX2xpYnM9eWVzCi0JICAgICAgZWxzZQotCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgICAgICBmaQotCSAgICBmaQotCSAgZWxzZQotCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKLQkgICAgbGlua19zdGF0aWM9eWVzCi0JICBmaQotCWZpICMgbGluayBzaGFyZWQvc3RhdGljIGxpYnJhcnk/Ci0KLQlpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkZGVwZW5kZW5jeV9saWJzIiAmJgotCSAgICAgeyB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiAhPSB5ZXMgfHwKLQkgICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyB8fAotCSAgICAgICB0ZXN0ICIkbGlua19zdGF0aWMiID0geWVzOyB9OyB0aGVuCi0JICAgICMgRXh0cmFjdCAtUiBmcm9tIGRlcGVuZGVuY3lfbGlicwotCSAgICB0ZW1wX2RlcGxpYnM9Ci0JICAgIGZvciBsaWJkaXIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgICBjYXNlICRsaWJkaXIgaW4KLQkgICAgICAtUiopIGZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRsaWJkaXIiCi0JICAgICAgICAgICB0ZW1wX3hycGF0aD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JCSAgIGNhc2UgIiAkeHJwYXRoICIgaW4KLQkJICAgKiIgJHRlbXBfeHJwYXRoICIqKSA7OwotCQkgICAqKSB4cnBhdGg9IiR4cnBhdGggJHRlbXBfeHJwYXRoIjs7Ci0JCSAgIGVzYWM7OwotCSAgICAgICopIHRlbXBfZGVwbGlicz0iJHRlbXBfZGVwbGlicyAkbGliZGlyIjs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICAgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKLQkgIGZpCi0KLQkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkYWJzZGlyIgotCSAgIyBMaW5rIGFnYWluc3QgdGhpcyBsaWJyYXJ5Ci0JICB0ZXN0ICIkbGlua19zdGF0aWMiID0gbm8gJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkYWJzX2xhZGlyLyRsYW5hbWUgJG5ld2RlcGVuZGVuY3lfbGlicyIKLQkgICMgLi4uIGFuZCBpdHMgZGVwZW5kZW5jeV9saWJzCi0JICB0bXBfbGlicz0KLQkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KLQkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGlmICRvcHRfZHVwbGljYXRlX2RlcHMgOyB0aGVuCi0JICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KLQkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubzsgdGhlbgotCSAgICAjIEFkZCB0aGUgc2VhcmNoIHBhdGhzIG9mIGFsbCBkZXBlbmRlbmN5IGxpYnJhcmllcwotCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgICAgY2FzZSAkZGVwbGliIGluCi0JICAgICAgLUwqKSBwYXRoPSIkZGVwbGliIiA7OwotCSAgICAgICoubGEpCi0JICAgICAgICBmdW5jX2Rpcm5hbWUgIiRkZXBsaWIiICIiICIuIgotCQlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgotCQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KLQkJY2FzZSAkZGlyIGluCi0JCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzZGlyPSIkZGlyIiA7OwotCQkqKQotCQkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLQkJICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgotCQkgICAgZnVuY193YXJuaW5nICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciCi0JCSAgICBhYnNkaXI9IiRkaXIiCi0JCSAgZmkKLQkJICA7OwotCQllc2FjCi0JCWlmICRHUkVQICJeaW5zdGFsbGVkPW5vIiAkZGVwbGliID4gL2Rldi9udWxsOyB0aGVuCi0JCWNhc2UgJGhvc3QgaW4KLQkJKi0qLWRhcndpbiopCi0JCSAgZGVwZGVwbD0KLQkJICBldmFsIGRlcGxpYnJhcnlfbmFtZXM9YCR7U0VEfSAtbiAtZSAncy9ebGlicmFyeV9uYW1lcz1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCi0JCSAgaWYgdGVzdCAtbiAiJGRlcGxpYnJhcnlfbmFtZXMiIDsgdGhlbgotCQkgICAgZm9yIHRtcCBpbiAkZGVwbGlicmFyeV9uYW1lcyA7IGRvCi0JCSAgICAgIGRlcGRlcGw9JHRtcAotCQkgICAgZG9uZQotCQkgICAgaWYgdGVzdCAtZiAiJGFic2Rpci8kb2JqZGlyLyRkZXBkZXBsIiA7IHRoZW4KLQkJICAgICAgZGVwZGVwbD0iJGFic2Rpci8kb2JqZGlyLyRkZXBkZXBsIgotCQkgICAgICBkYXJ3aW5faW5zdGFsbF9uYW1lPWBvdG9vbCAtTCAkZGVwZGVwbCB8ICRTRUQgLW4gLWUgJzNxOzIsMnAnIHwgJFNFRCAtZSAncy8oLiovLydgCi0JCSAgICAgIGRhcndpbl9pbnN0YWxsX25hbWU9YCRFQ0hPICRkYXJ3aW5faW5zdGFsbF9uYW1lYAotICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRkYXJ3aW5faW5zdGFsbF9uYW1lIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICBkYXJ3aW5faW5zdGFsbF9uYW1lPWBvdG9vbDY0IC1MICRkZXBkZXBsIHwgJFNFRCAtbiAtZSAnM3E7MiwycCcgfCAkU0VEIC1lICdzLyguKi8vJ2AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGFyd2luX2luc3RhbGxfbmFtZT1gJEVDSE8gJGRhcndpbl9pbnN0YWxsX25hbWVgCi0gICAgICAgICAgICAgICAgICAgICAgZmkKLQkJICAgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAke3dsfS1keWxpYl9maWxlICR7d2x9JHtkYXJ3aW5faW5zdGFsbF9uYW1lfToke2RlcGRlcGx9IgotCQkgICAgICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgLWR5bGliX2ZpbGUgJHtkYXJ3aW5faW5zdGFsbF9uYW1lfToke2RlcGRlcGx9IgotCQkgICAgICBwYXRoPQotCQkgICAgZmkKLQkJICBmaQotCQkgIDs7Ci0JCSopCi0JCSAgcGF0aD0iLUwkYWJzZGlyLyRvYmpkaXIiCi0JCSAgOzsKLQkJZXNhYwotCQllbHNlCi0JCSAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKLQkJICB0ZXN0IC16ICIkbGliZGlyIiAmJiBcCi0JCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKLQkJICB0ZXN0ICIkYWJzZGlyIiAhPSAiJGxpYmRpciIgJiYgXAotCQkgICAgZnVuY193YXJuaW5nICJcYCRkZXBsaWInIHNlZW1zIHRvIGJlIG1vdmVkIgotCi0JCSAgcGF0aD0iLUwkYWJzZGlyIgotCQlmaQotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgotCSAgICAgICoiICRwYXRoICIqKSA7OwotCSAgICAgICopIGRlcGxpYnM9IiRwYXRoICRkZXBsaWJzIiA7OwotCSAgICAgIGVzYWMKLQkgICAgZG9uZQotCSAgZmkgIyBsaW5rX2FsbF9kZXBsaWJzICE9IG5vCi0JZmkgIyBsaW5rbW9kZSA9IGxpYgotICAgICAgZG9uZSAjIGZvciBkZXBsaWIgaW4gJGxpYnMKLSAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KLQlpZiB0ZXN0ICIkbGlua21vZGUiID0gInByb2ciOyB0aGVuCi0JICBjb21waWxlX2RlcGxpYnM9IiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAkY29tcGlsZV9kZXBsaWJzIgotCSAgZmluYWxpemVfZGVwbGlicz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRmaW5hbGl6ZV9kZXBsaWJzIgotCWVsc2UKLQkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgImAkRUNITyAiWCAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFhzZWQgLWUgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCi0JZmkKLSAgICAgIGZpCi0gICAgICBkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMiCi0gICAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW47IHRoZW4KLQkjIExpbmsgdGhlIGRscHJlb3BlbmVkIGxpYnJhcmllcyBiZWZvcmUgb3RoZXIgbGlicmFyaWVzCi0JZm9yIGRlcGxpYiBpbiAkc2F2ZV9kZXBsaWJzOyBkbwotCSAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKLQlkb25lCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHBhc3MiICE9IGRsb3BlbjsgdGhlbgotCWlmIHRlc3QgIiRwYXNzIiAhPSBjb252OyB0aGVuCi0JICAjIE1ha2Ugc3VyZSBsaWJfc2VhcmNoX3BhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0JICBsaWJfc2VhcmNoX3BhdGg9Ci0JICBmb3IgZGlyIGluICRuZXdsaWJfc2VhcmNoX3BhdGg7IGRvCi0JICAgIGNhc2UgIiRsaWJfc2VhcmNoX3BhdGggIiBpbgotCSAgICAqIiAkZGlyICIqKSA7OwotCSAgICAqKSBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCSAgbmV3bGliX3NlYXJjaF9wYXRoPQotCWZpCi0KLQlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiICE9ICJwcm9nLGxpbmsiOyB0aGVuCi0JICB2YXJzPSJkZXBsaWJzIgotCWVsc2UKLQkgIHZhcnM9ImNvbXBpbGVfZGVwbGlicyBmaW5hbGl6ZV9kZXBsaWJzIgotCWZpCi0JZm9yIHZhciBpbiAkdmFycyBkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAjIEFkZCBsaWJyYXJpZXMgdG8gJHZhciBpbiByZXZlcnNlIG9yZGVyCi0JICBldmFsIHRtcF9saWJzPVwiXCQkdmFyXCIKLQkgIG5ld19saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkdG1wX2xpYnM7IGRvCi0JICAgICMgRklYTUU6IFBlZGFudGljYWxseSwgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sIHNvCi0JICAgICMgICAgICAgIHRoYXQgc29tZSBuYXN0eSBkZXBlbmRlbmN5IGxvb3AgaXNuJ3QgYWNjaWRlbnRhbGx5Ci0JICAgICMgICAgICAgIGJyb2tlbjoKLQkgICAgI25ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIKLQkgICAgIyBQcmFnbWF0aWNhbGx5LCB0aGlzIHNlZW1zIHRvIGNhdXNlIHZlcnkgZmV3IHByb2JsZW1zIGluCi0JICAgICMgcHJhY3RpY2U6Ci0JICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAtTCopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKLQkgICAgLVIqKSA7OwotCSAgICAqKQotCSAgICAgICMgQW5kIGhlcmUgaXMgdGhlIHJlYXNvbjogd2hlbiBhIGxpYnJhcnkgYXBwZWFycyBtb3JlCi0JICAgICAgIyB0aGFuIG9uY2UgYXMgYW4gZXhwbGljaXQgZGVwZW5kZW5jZSBvZiBhIGxpYnJhcnksIG9yCi0JICAgICAgIyBpcyBpbXBsaWNpdGx5IGxpbmtlZCBpbiBtb3JlIHRoYW4gb25jZSBieSB0aGUKLQkgICAgICAjIGNvbXBpbGVyLCBpdCBpcyBjb25zaWRlcmVkIHNwZWNpYWwsIGFuZCBtdWx0aXBsZQotCSAgICAgICMgb2NjdXJyZW5jZXMgdGhlcmVvZiBhcmUgbm90IHJlbW92ZWQuICBDb21wYXJlIHRoaXMKLQkgICAgICAjIHdpdGggaGF2aW5nIHRoZSBzYW1lIGxpYnJhcnkgYmVpbmcgbGlzdGVkIGFzIGEKLQkgICAgICAjIGRlcGVuZGVuY3kgb2YgbXVsdGlwbGUgb3RoZXIgbGlicmFyaWVzOiBpbiB0aGlzIGNhc2UsCi0JICAgICAgIyB3ZSBrbm93IChwZWRhbnRpY2FsbHksIHdlIGFzc3VtZSkgdGhlIGxpYnJhcnkgZG9lcyBub3QKLQkgICAgICAjIG5lZWQgdG8gYmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlLCBzbyB3ZSBrZWVwIG9ubHkgdGhlCi0JICAgICAgIyBsYXN0IGNvcHkuICBUaGlzIGlzIG5vdCBhbHdheXMgcmlnaHQsIGJ1dCBpdCBpcyByYXJlCi0JICAgICAgIyBlbm91Z2ggdGhhdCB3ZSByZXF1aXJlIHVzZXJzIHRoYXQgcmVhbGx5IG1lYW4gdG8gcGxheQotCSAgICAgICMgc3VjaCB1bnBvcnRhYmxlIGxpbmtpbmcgdHJpY2tzIHRvIGxpbmsgdGhlIGxpYnJhcnkKLQkgICAgICAjIHVzaW5nIC1XbCwtbG5hbWUsIHNvIHRoYXQgbGlidG9vbCBkb2VzIG5vdCBjb25zaWRlciBpdAotCSAgICAgICMgZm9yIGR1cGxpY2F0ZSByZW1vdmFsLgotCSAgICAgIGNhc2UgIiAkc3BlY2lhbGRlcGxpYnMgIiBpbgotCSAgICAgICoiICRkZXBsaWIgIiopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKLQkgICAgICAqKQotCQljYXNlICIgJG5ld19saWJzICIgaW4KLQkJKiIgJGRlcGxpYiAiKikgOzsKLQkJKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OwotCQllc2FjCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQkgIHRtcF9saWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkbmV3X2xpYnM7IGRvCi0JICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAtTCopCi0JICAgICAgY2FzZSAiICR0bXBfbGlicyAiIGluCi0JICAgICAgKiIgJGRlcGxpYiAiKikgOzsKLQkgICAgICAqKSB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICAgIDs7Ci0JICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCSAgZXZhbCAkdmFyPVwiJHRtcF9saWJzXCIKLQlkb25lICMgZm9yIHZhcgotICAgICAgZmkKLSAgICAgICMgTGFzdCBzdGVwOiByZW1vdmUgcnVudGltZSBsaWJzIGZyb20gZGVwZW5kZW5jeV9saWJzCi0gICAgICAjICh0aGV5IHN0YXkgaW4gZGVwbGlicykKLSAgICAgIHRtcF9saWJzPQotICAgICAgZm9yIGkgaW4gJGRlcGVuZGVuY3lfbGlicyA7IGRvCi0JY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAkY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoICIgaW4KLQkqIiAkaSAiKikKLQkgIGk9IiIKLQkgIDs7Ci0JZXNhYwotCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KLQkgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGkiCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIGRlcGVuZGVuY3lfbGlicz0kdG1wX2xpYnMKLSAgICBkb25lICMgZm9yIHBhc3MKLSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgotICAgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCi0gICAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKLSAgICBmaQotCi0gICAgY2FzZSAkbGlua21vZGUgaW4KLSAgICBvbGRsaWIpCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgotCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiAkZGVwbGlicyIgaW4KLSAgICAgICpcIC1sKiB8ICpcIC1MKikKLQlmdW5jX3dhcm5pbmcgIlxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgIHRlc3QgLW4gIiRycGF0aCIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgotCi0gICAgICB0ZXN0IC1uICIkeHJwYXRoIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC1SJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKLQotICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8vLXZlcnNpb24tbnVtYmVyJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKLQotICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKLQlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgotCi0gICAgICB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICYmIFwKLQlmdW5jX3dhcm5pbmcgIlxgLWV4cG9ydC1zeW1ib2xzJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIG9sZGxpYnM9IiRvdXRwdXQiCi0gICAgICBvYmpzPSIkb2JqcyRvbGRfZGVwbGlicyIKLSAgICAgIDs7Ci0KLSAgICBsaWIpCi0gICAgICAjIE1ha2Ugc3VyZSB3ZSBvbmx5IGdlbmVyYXRlIGxpYnJhcmllcyBvZiB0aGUgZm9ybSBgbGliTkFNRS5sYScuCi0gICAgICBjYXNlICRvdXRwdXRuYW1lIGluCi0gICAgICBsaWIqKQotCWZ1bmNfc3RyaXBuYW1lICdsaWInICcubGEnICIkb3V0cHV0bmFtZSIKLQluYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgotCWV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgotCTs7Ci0gICAgICAqKQotCXRlc3QgIiRtb2R1bGUiID0gbm8gJiYgXAotCSAgZnVuY19mYXRhbF9oZWxwICJsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBtdXN0IGJlZ2luIHdpdGggXGBsaWInIgotCi0JaWYgdGVzdCAiJG5lZWRfbGliX3ByZWZpeCIgIT0gbm87IHRoZW4KLQkgICMgQWRkIHRoZSAibGliIiBwcmVmaXggZm9yIG1vZHVsZXMgaWYgcmVxdWlyZWQKLQkgIGZ1bmNfc3RyaXBuYW1lICcnICcubGEnICIkb3V0cHV0bmFtZSIKLQkgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKLQkgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgotCWVsc2UKLQkgIGZ1bmNfc3RyaXBuYW1lICcnICcubGEnICIkb3V0cHV0bmFtZSIKLQkgIGxpYm5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCWZpCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgaWYgdGVzdCAtbiAiJG9ianMiOyB0aGVuCi0JaWYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgotCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGJ1aWxkIGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyBvbiB0aGlzIGhvc3Q6JG9ianMiCi0JZWxzZQotCSAgJEVDSE8KLQkgICRFQ0hPICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBub24tbGlidG9vbCIKLQkgICRFQ0hPICIqKiogb2JqZWN0cyAkb2JqcyBpcyBub3QgcG9ydGFibGUhIgotCSAgbGlib2Jqcz0iJGxpYm9ianMgJG9ianMiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIHRlc3QgIiRkbHNlbGYiICE9IG5vICYmIFwKLQlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbiBzZWxmJyBpcyBpZ25vcmVkIGZvciBsaWJ0b29sIGxpYnJhcmllcyIKLQotICAgICAgc2V0IGR1bW15ICRycGF0aAotICAgICAgc2hpZnQKLSAgICAgIHRlc3QgIiQjIiAtZ3QgMSAmJiBcCi0JZnVuY193YXJuaW5nICJpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIKLQotICAgICAgaW5zdGFsbF9saWJkaXI9IiQxIgotCi0gICAgICBvbGRsaWJzPQotICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIEJ1aWxkaW5nIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LgotCSAgIyBTb21lIGNvbXBpbGVycyBoYXZlIHByb2JsZW1zIHdpdGggYSBgLmFsJyBleHRlbnNpb24gc28KLQkgICMgY29udmVuaWVuY2UgbGlicmFyaWVzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGV4dGVuc2lvbiBhbgotCSAgIyBhcmNoaXZlIG5vcm1hbGx5IHdvdWxkLgotCSAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCAkb2xkbGlicyIKLQkgIGJ1aWxkX2xpYnRvb2xfbGlicz1jb252ZW5pZW5jZQotCSAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JZmkKLQotCXRlc3QgLW4gIiR2aW5mbyIgJiYgXAotCSAgZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8vLXZlcnNpb24tbnVtYmVyJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiCi0KLQl0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAotCSAgZnVuY193YXJuaW5nICJcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiCi0gICAgICBlbHNlCi0KLQkjIFBhcnNlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFyZ3VtZW50LgotCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JwotCXNldCBkdW1teSAkdmluZm8gMCAwIDAKLQlzaGlmdAotCUlGUz0iJHNhdmVfaWZzIgotCi0JdGVzdCAtbiAiJDciICYmIFwKLQkgIGZ1bmNfZmF0YWxfaGVscCAidG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIgotCi0JIyBjb252ZXJ0IGFic29sdXRlIHZlcnNpb24gbnVtYmVycyB0byBsaWJ0b29sIGFnZXMKLQkjIHRoaXMgcmV0YWlucyBjb21wYXRpYmlsaXR5IHdpdGggLmxhIGZpbGVzIGFuZCBhdHRlbXB0cwotCSMgdG8gbWFrZSB0aGUgY29kZSBiZWxvdyBhIGJpdCBtb3JlIGNvbXByZWhlbnNpYmxlCi0KLQljYXNlICR2aW5mb19udW1iZXIgaW4KLQl5ZXMpCi0JICBudW1iZXJfbWFqb3I9IiQxIgotCSAgbnVtYmVyX21pbm9yPSIkMiIKLQkgIG51bWJlcl9yZXZpc2lvbj0iJDMiCi0JICAjCi0JICAjIFRoZXJlIGFyZSByZWFsbHkgb25seSB0d28ga2luZHMgLS0gdGhvc2UgdGhhdAotCSAgIyB1c2UgdGhlIGN1cnJlbnQgcmV2aXNpb24gYXMgdGhlIG1ham9yIHZlcnNpb24KLQkgICMgYW5kIHRob3NlIHRoYXQgc3VidHJhY3QgYWdlIGFuZCB1c2UgYWdlIGFzCi0JICAjIGEgbWlub3IgdmVyc2lvbi4gIEJ1dCwgdGhlbiB0aGVyZSBpcyBpcml4Ci0JICAjIHdoaWNoIGhhcyBhbiBleHRyYSAxIGFkZGVkIGp1c3QgZm9yIGZ1bgotCSAgIwotCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCi0JICBkYXJ3aW58bGludXh8b3NmfHdpbmRvd3N8bm9uZSkKLQkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgotCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCi0JICAgIHJldmlzaW9uPSIkbnVtYmVyX3JldmlzaW9uIgotCSAgICA7OwotCSAgZnJlZWJzZC1hb3V0fGZyZWVic2QtZWxmfHN1bm9zKQotCSAgICBjdXJyZW50PSIkbnVtYmVyX21ham9yIgotCSAgICByZXZpc2lvbj0iJG51bWJlcl9taW5vciIKLQkgICAgYWdlPSIwIgotCSAgICA7OwotCSAgaXJpeHxub25zdG9wdXgpCi0JICAgIGZ1bmNfYXJpdGggJG51bWJlcl9tYWpvciArICRudW1iZXJfbWlub3IKLQkgICAgY3VycmVudD0kZnVuY19hcml0aF9yZXN1bHQKLQkgICAgYWdlPSIkbnVtYmVyX21pbm9yIgotCSAgICByZXZpc2lvbj0iJG51bWJlcl9taW5vciIKLQkgICAgbHRfaXJpeF9pbmNyZW1lbnQ9bm8KLQkgICAgOzsKLQkgIGVzYWMKLQkgIDs7Ci0Jbm8pCi0JICBjdXJyZW50PSIkMSIKLQkgIHJldmlzaW9uPSIkMiIKLQkgIGFnZT0iJDMiCi0JICA7OwotCWVzYWMKLQotCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCi0JY2FzZSAkY3VycmVudCBpbgotCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKLQkqKQotCSAgZnVuY19lcnJvciAiQ1VSUkVOVCBcYCRjdXJyZW50JyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAkcmV2aXNpb24gaW4KLQkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7Ci0JKikKLQkgIGZ1bmNfZXJyb3IgIlJFVklTSU9OIFxgJHJldmlzaW9uJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAkYWdlIGluCi0JMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OwotCSopCi0JICBmdW5jX2Vycm9yICJBR0UgXGAkYWdlJyBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIKLQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKLQkgIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJGFnZSIgLWd0ICIkY3VycmVudCI7IHRoZW4KLQkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIgotCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgotCWZpCi0KLQkjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCi0JbWFqb3I9Ci0JdmVyc3VmZml4PQotCXZlcnN0cmluZz0KLQljYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQlub25lKSA7OwotCi0JZGFyd2luKQotCSAgIyBMaWtlIExpbnV4LCBidXQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIGF2YWlsYWJsZSBpbgotCSAgIyB2ZXJzdHJpbmcgZm9yIGNvZGluZyBpdCBpbnRvIHRoZSBsaWJyYXJ5IGhlYWRlcgotCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKLQkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotCSAgIyBEYXJ3aW4gbGQgZG9lc24ndCBsaWtlIDAgZm9yIHRoZXNlIG9wdGlvbnMuLi4KLQkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgKyAxCi0JICBtaW5vcl9jdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgeGxjdmVyc3RyaW5nPSIke3dsfS1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudCAke3dsfS1jdXJyZW50X3ZlcnNpb24gJHt3bH0kbWlub3JfY3VycmVudC4kcmV2aXNpb24iCi0JICB2ZXJzdHJpbmc9Ii1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJG1pbm9yX2N1cnJlbnQgLWN1cnJlbnRfdmVyc2lvbiAkbWlub3JfY3VycmVudC4kcmV2aXNpb24iCi0JICA7OwotCi0JZnJlZWJzZC1hb3V0KQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiI7Ci0JICA7OwotCi0JZnJlZWJzZC1lbGYpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiCi0JICA7OwotCi0JaXJpeCB8IG5vbnN0b3B1eCkKLQkgIGlmIHRlc3QgIlgkbHRfaXJpeF9pbmNyZW1lbnQiID0gIlhubyI7IHRoZW4KLQkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKLQkgIGVsc2UKLQkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UgKyAxCi0JICBmaQotCSAgbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0KLQkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgotCSAgICBub25zdG9wdXgpIHZlcnN0cmluZ19wcmVmaXg9bm9uc3RvcHV4IDs7Ci0JICAgICopICAgICAgICAgdmVyc3RyaW5nX3ByZWZpeD1zZ2kgOzsKLQkgIGVzYWMKLQkgIHZlcnN0cmluZz0iJHZlcnN0cmluZ19wcmVmaXgkbWFqb3IuJHJldmlzaW9uIgotCi0JICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotCSAgbG9vcD0kcmV2aXNpb24KLQkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KLQkgICAgZnVuY19hcml0aCAkcmV2aXNpb24gLSAkbG9vcAotCSAgICBpZmFjZT0kZnVuY19hcml0aF9yZXN1bHQKLQkgICAgZnVuY19hcml0aCAkbG9vcCAtIDEKLQkgICAgbG9vcD0kZnVuY19hcml0aF9yZXN1bHQKLQkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKLQkgIGRvbmUKLQotCSAgIyBCZWZvcmUgdGhpcyBwb2ludCwgJG1ham9yIG11c3Qgbm90IGNvbnRhaW4gYC4nLgotCSAgbWFqb3I9LiRtYWpvcgotCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgotCSAgOzsKLQotCWxpbnV4KQotCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKLQkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotCSAgOzsKLQotCW9zZikKLQkgIGZ1bmNfYXJpdGggJGN1cnJlbnQgLSAkYWdlCi0JICBtYWpvcj0uJGZ1bmNfYXJpdGhfcmVzdWx0Ci0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRhZ2UKLQkgIHdoaWxlIHRlc3QgIiRsb29wIiAtbmUgMDsgZG8KLQkgICAgZnVuY19hcml0aCAkY3VycmVudCAtICRsb29wCi0JICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQotCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKLQkgIGRvbmUKLQotCSAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgotCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7Y3VycmVudH0uMCIKLQkgIDs7Ci0KLQlxbngpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiCi0JICA7OwotCi0Jc3Vub3MpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIgotCSAgOzsKLQotCXdpbmRvd3MpCi0JICAjIFVzZSAnLScgcmF0aGVyIHRoYW4gJy4nLCBzaW5jZSB3ZSBvbmx5IHdhbnQgb25lCi0JICAjIGV4dGVuc2lvbiBvbiBET1MgOC4zIGZpbGVzeXN0ZW1zLgotCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKLQkgIG1ham9yPSRmdW5jX2FyaXRoX3Jlc3VsdAotCSAgdmVyc3VmZml4PSItJG1ham9yIgotCSAgOzsKLQotCSopCi0JICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gInVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIKLQkgIDs7Ci0JZXNhYwotCi0JIyBDbGVhciB0aGUgdmVyc2lvbiBpbmZvIGlmIHdlIGRlZmF1bHRlZCwgYW5kIHRoZXkgc3BlY2lmaWVkIGEgcmVsZWFzZS4KLQlpZiB0ZXN0IC16ICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSAgbWFqb3I9Ci0JICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KLQkgIGRhcndpbikKLQkgICAgIyB3ZSBjYW4ndCBjaGVjayBmb3IgIjAuMCIgaW4gYXJjaGl2ZV9jbWRzIGR1ZSB0byBxdW90aW5nCi0JICAgICMgcHJvYmxlbXMsIHNvIHdlIHJlc2V0IGl0IGNvbXBsZXRlbHkKLQkgICAgdmVyc3RyaW5nPQotCSAgICA7OwotCSAgKikKLQkgICAgdmVyc3RyaW5nPSIwLjAiCi0JICAgIDs7Ci0JICBlc2FjCi0JICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCi0JICAgIHZlcnN1ZmZpeD0KLQkgIGVsc2UKLQkgICAgdmVyc3VmZml4PSIuMC4wIgotCSAgZmkKLQlmaQotCi0JIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCi0JaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3VmZml4PQotCSAgdmVyc3RyaW5nPSIiCi0JZmkKLQotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KLQlpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgIGZ1bmNfd2FybmluZyAidW5kZWZpbmVkIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gJGhvc3Qgc2hhcmVkIGxpYnJhcmllcyIKLQkgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgZmkKLQllbHNlCi0JICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKLQlmaQotCi0gICAgICBmaQotCi0gICAgICBmdW5jX2dlbmVyYXRlX2Rsc3ltcyAiJGxpYm5hbWUiICIkbGlibmFtZSIgInllcyIKLSAgICAgIGxpYm9ianM9IiRsaWJvYmpzICRzeW1maWxlb2JqIgotICAgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KLQotICAgICAgaWYgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgotCSMgUmVtb3ZlIG91ciBvdXRwdXRzLCBidXQgZG9uJ3QgcmVtb3ZlIG9iamVjdCBmaWxlcyBzaW5jZSB0aGV5Ci0JIyBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2hlbiBjb21waWxpbmcgUElDIG9iamVjdHMuCi0JcmVtb3ZlbGlzdD0KLQl0ZW1wcmVtb3ZlbGlzdD1gJEVDSE8gIiRvdXRwdXRfb2JqZGlyLyoiYAotCWZvciBwIGluICR0ZW1wcmVtb3ZlbGlzdDsgZG8KLQkgIGNhc2UgJHAgaW4KLQkgICAgKi4kb2JqZXh0KQotCSAgICAgICA7OwotCSAgICAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSB8ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogfCAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qKQotCSAgICAgICBpZiB0ZXN0ICJYJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiAhPSAiWCI7IHRoZW4KLQkJIGlmICRFQ0hPICIkcCIgfCAkRUdSRVAgLWUgIiRwcmVjaW91c19maWxlc19yZWdleCIgPi9kZXYvbnVsbCAyPiYxCi0JCSB0aGVuCi0JCSAgIGNvbnRpbnVlCi0JCSBmaQotCSAgICAgICBmaQotCSAgICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkcCIKLQkgICAgICAgOzsKLQkgICAgKikgOzsKLQkgIGVzYWMKLQlkb25lCi0JdGVzdCAtbiAiJHJlbW92ZWxpc3QiICYmIFwKLQkgIGZ1bmNfc2hvd19ldmFsICIke1JNfXIgXCRyZW1vdmVsaXN0IgotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IGNvbnZlbmllbmNlIDsgdGhlbgotCW9sZGxpYnM9IiRvbGRsaWJzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0KLQkjIFRyYW5zZm9ybSAubG8gZmlsZXMgdG8gLm8gZmlsZXMuCi0Jb2xkb2Jqcz0iJG9ianMgImAkRUNITyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JyQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAKLSAgICAgIGZpCi0KLSAgICAgICMgRWxpbWluYXRlIGFsbCB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMuCi0gICAgICAjZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KLSAgICAgICMJbGliX3NlYXJjaF9wYXRoPWAkRUNITyAiWCRsaWJfc2VhcmNoX3BhdGggIiB8ICRYc2VkIC1lICJzJSAkcGF0aCAlICVnImAKLSAgICAgICMJZGVwbGlicz1gJEVDSE8gIlgkZGVwbGlicyAiIHwgJFhzZWQgLWUgInMlIC1MJHBhdGggJSAlZyJgCi0gICAgICAjCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIlgkZGVwZW5kZW5jeV9saWJzICIgfCAkWHNlZCAtZSAicyUgLUwkcGF0aCAlICVnImAKLSAgICAgICNkb25lCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgotCXRlbXBfeHJwYXRoPQotCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KLQkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgotCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZG9uZQotCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSBkbGZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzIHRoYXQgd29uJ3QgYmUgZGxwcmVvcGVuZWQKLSAgICAgIG9sZF9kbGZpbGVzPSIkZGxmaWxlcyIKLSAgICAgIGRsZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxmaWxlczsgZG8KLQljYXNlICIgJGRscHJlZmlsZXMgJGRsZmlsZXMgIiBpbgotCSoiICRsaWIgIiopIDs7Ci0JKikgZGxmaWxlcz0iJGRsZmlsZXMgJGxpYiIgOzsKLQllc2FjCi0gICAgICBkb25lCi0KLSAgICAgICMgTWFrZSBzdXJlIGRscHJlZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMKLSAgICAgIG9sZF9kbHByZWZpbGVzPSIkZGxwcmVmaWxlcyIKLSAgICAgIGRscHJlZmlsZXM9Ci0gICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KLQljYXNlICIkZGxwcmVmaWxlcyAiIGluCi0JKiIgJGxpYiAiKikgOzsKLQkqKSBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliIiA7OwotCWVzYWMKLSAgICAgIGRvbmUKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JICBjYXNlICRob3N0IGluCi0JICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKikKLQkgICAgIyB0aGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBjIGxpYnJhcnkgKGFzIHN1Y2gpIQotCSAgICA7OwotCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSAgICAjIFJoYXBzb2R5IEMgbGlicmFyeSBpcyBpbiB0aGUgU3lzdGVtIGZyYW1ld29yawotCSAgICBkZXBsaWJzPSIkZGVwbGlicyBTeXN0ZW0ubHRmcmFtZXdvcmsiCi0JICAgIDs7Ci0JICAqLSotbmV0YnNkKikKLQkgICAgIyBEb24ndCBsaW5rIHdpdGggbGliYyB1bnRpbCB0aGUgYS5vdXQgbGQuc28gaXMgZml4ZWQuCi0JICAgIDs7Ci0JICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKLQkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCi0JICAgIDs7Ci0JICAqLSotc2NvMy4ydjUqIHwgKi0qLXNjbzV2NiopCi0JICAgICMgQ2F1c2VzIHByb2JsZW1zIHdpdGggX19jdHlwZQotCSAgICA7OwotCSAgKi0qLXN5c3Y0LjJ1dzIqIHwgKi0qLXN5c3Y1KiB8ICotKi11bml4d2FyZSogfCAqLSotT3BlblVOSVgqKQotCSAgICAjIENvbXBpbGVyIGluc2VydHMgbGliYyBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgdGhyZWFkcyB0byB3b3JrCi0JICAgIDs7Ci0JICAqKQotCSAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMgaWYgbmVjZXNzYXJ5LgotCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9uZWVkX2xjIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWxjIgotCSAgICBmaQotCSAgICA7OwotCSAgZXNhYwotCWZpCi0KLQkjIFRyYW5zZm9ybSBkZXBsaWJzIGludG8gb25seSBkZXBsaWJzIHRoYXQgY2FuIGJlIGxpbmtlZCBpbiBzaGFyZWQuCi0JbmFtZV9zYXZlPSRuYW1lCi0JbGlibmFtZV9zYXZlPSRsaWJuYW1lCi0JcmVsZWFzZV9zYXZlPSRyZWxlYXNlCi0JdmVyc3VmZml4X3NhdmU9JHZlcnN1ZmZpeAotCW1ham9yX3NhdmU9JG1ham9yCi0JIyBJJ20gbm90IHN1cmUgaWYgSSdtIHRyZWF0aW5nIHRoZSByZWxlYXNlIGNvcnJlY3RseS4gIEkgdGhpbmsKLQkjIHJlbGVhc2Ugc2hvdWxkIHNob3cgdXAgaW4gdGhlIC1sIChpZSAtbGdtcDUpIHNvIHdlIGRvbid0IHdhbnQgdG8KLQkjIGFkZCBpdCBpbiB0d2ljZS4gIElzIHRoYXQgY29ycmVjdD8KLQlyZWxlYXNlPSIiCi0JdmVyc3VmZml4PSIiCi0JbWFqb3I9IiIKLQluZXdkZXBsaWJzPQotCWRyb3BwZWRkZXBzPW5vCi0JY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KLQlwYXNzX2FsbCkKLQkgICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgotCSAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjawotCSAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgotCSAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0Ci0JICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvci4KLQkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKLQkgIDs7Ci0JdGVzdF9jb21waWxlKQotCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKLQkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0Ci0JICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjawotCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCi0JICAkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0LmMKLQkgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLQkgIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQotRU9GCi0JICAkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0Ci0JICBpZiAkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGliczsgdGhlbgotCSAgICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIGNhc2UgJGkgaW4KLQkgICAgICAtbCopCi0JCWZ1bmNfc3RyaXBuYW1lIC1sICcnICIkaSIKLQkJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JCWlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkJICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJICAqIiAkaSAiKikKLQkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQkgICAgaT0iIgotCQkgICAgOzsKLQkJICBlc2FjCi0JCWZpCi0JCWlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KLQkJICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKLQkJICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCAiXFwkRUNITyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcIiJgCi0JCSAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlczsgc2hpZnQKLQkJICBkZXBsaWJfbWF0Y2g9JDEKLQkJICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICBlbHNlCi0JCSAgICBkcm9wcGVkZGVwcz15ZXMKLQkJICAgICRFQ0hPCi0JCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCi0JCSAgICAkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJICAgICRFQ0hPICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkgICAgJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggSSBiZWxpZXZlIHlvdSBkbyBub3QgaGF2ZSIKLQkJICAgICRFQ0hPICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSBpdCBmb3IiCi0JCSAgICAkRUNITyAiKioqIGl0cyBkeW5hbWljIGRlcGVuZGVuY3kgbGlzdCB0aGF0IHByb2dyYW1zIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgotCQkgIGZpCi0JCWZpCi0JCTs7Ci0JICAgICAgKikKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICBlbHNlCi0JICAgICMgRXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpcnN0IGNvbXBpbGUuICBMZXQncyB0cnkgdG8gc2FsdmFnZQotCSAgICAjIHRoZSBzaXR1YXRpb246IENvbXBpbGUgYSBzZXBhcmF0ZSBwcm9ncmFtIGZvciBlYWNoIGxpYnJhcnkuCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIGNhc2UgJGkgaW4KLQkgICAgICAtbCopCi0JCWZ1bmNfc3RyaXBuYW1lIC1sICcnICIkaSIKLQkJbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JCSRvcHRfZHJ5X3J1biB8fCAkUk0gY29uZnRlc3QKLQkJaWYgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGk7IHRoZW4KLQkJICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCi0JCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQkgICAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCi0JCSAgICAqIiAkaSAiKikKLQkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgICAgIGk9IiIKLQkJICAgICAgOzsKLQkJICAgIGVzYWMKLQkJICBmaQotCQkgIGlmIHRlc3QgLW4gIiRpIiA7IHRoZW4KLQkJICAgIGxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAotCQkgICAgZGVwbGliX21hdGNoZXM9YGV2YWwgIlxcJEVDSE8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCIiYAotCQkgICAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlczsgc2hpZnQKLQkJICAgIGRlcGxpYl9tYXRjaD0kMQotCQkgICAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICAgIGVsc2UKLQkJICAgICAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgICAgICRFQ0hPCi0JCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKLQkJICAgICAgJEVDSE8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgICAgICRFQ0hPICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkgICAgICAkRUNITyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCQkgICAgICAkRUNITyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgdGhpcyBvbmUiCi0JCSAgICAgICRFQ0hPICIqKiogYXMgYSBkeW5hbWljIGRlcGVuZGVuY3kgdGhhdCBwcm9ncmFtcyBjYW4gZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCi0JCSAgICBmaQotCQkgIGZpCi0JCWVsc2UKLQkJICBkcm9wcGVkZGVwcz15ZXMKLQkJICAkRUNITwotCQkgICRFQ0hPICIqKiogV2FybmluZyEgIExpYnJhcnkgJGkgaXMgbmVlZGVkIGJ5IHRoaXMgbGlicmFyeSBidXQgSSB3YXMgbm90IGFibGUgdG8iCi0JCSAgJEVDSE8gIioqKiBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKLQkJICAkRUNITyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKLQkJICAkRUNITyAiKioqIGZ1bmN0aW9uYWwuICBJbnN0YWxsaW5nIGl0IGJlZm9yZSBjb250aW51aW5nIHdvdWxkIGJlIGV2ZW4gYmV0dGVyLiIKLQkJZmkKLQkJOzsKLQkgICAgICAqKQotCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgIGZpCi0JICA7OwotCWZpbGVfbWFnaWMqKQotCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKLQkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDEgXCguKlwpImAKLQkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkgICAgY2FzZSAkYV9kZXBsaWIgaW4KLQkgICAgLWwqKQotCSAgICAgIGZ1bmNfc3RyaXBuYW1lIC1sICcnICIkYV9kZXBsaWIiCi0JICAgICAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0Ci0JICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgotCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KLQkJKiIgJGFfZGVwbGliICIqKQotCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkJICBhX2RlcGxpYj0iIgotCQkgIDs7Ci0JCWVzYWMKLQkgICAgICBmaQotCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCi0JCWxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAotCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KLQkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKLQkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCi0JCSAgICAgICMgRm9sbG93IHNvZnQgbGlua3MuCi0JCSAgICAgIGlmIGxzIC1sTGQgIiRwb3RlbnRfbGliIiAyPi9kZXYvbnVsbCB8Ci0JCQkgJEdSRVAgIiAtPiAiID4vZGV2L251bGw7IHRoZW4KLQkJCWNvbnRpbnVlCi0JCSAgICAgIGZpCi0JCSAgICAgICMgVGhlIHN0YXRlbWVudCBhYm92ZSB0cmllcyB0byBhdm9pZCBlbnRlcmluZyBhbgotCQkgICAgICAjIGVuZGxlc3MgbG9vcCBiZWxvdywgaW4gY2FzZSBvZiBjeWNsaWMgbGlua3MuCi0JCSAgICAgICMgV2UgbWlnaHQgc3RpbGwgZW50ZXIgYW4gZW5kbGVzcyBsb29wLCBzaW5jZSBhIGxpbmsKLQkJICAgICAgIyBsb29wIGNhbiBiZSBjbG9zZWQgd2hpbGUgd2UgZm9sbG93IGxpbmtzLAotCQkgICAgICAjIGJ1dCBzbyB3aGF0PwotCQkgICAgICBwb3RsaWI9IiRwb3RlbnRfbGliIgotCQkgICAgICB3aGlsZSB0ZXN0IC1oICIkcG90bGliIiAyPi9kZXYvbnVsbDsgZG8KLQkJCXBvdGxpYmxpbms9YGxzIC1sZCAkcG90bGliIHwgJHtTRUR9ICdzLy4qIC0+IC8vJ2AKLQkJCWNhc2UgJHBvdGxpYmxpbmsgaW4KLQkJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcG90bGliPSIkcG90bGlibGluayI7OwotCQkJKikgcG90bGliPWAkRUNITyAiWCRwb3RsaWIiIHwgJFhzZWQgLWUgJ3MsW14vXSokLCwnYCIkcG90bGlibGluayI7OwotCQkJZXNhYwotCQkgICAgICBkb25lCi0JCSAgICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCRwb3RsaWJcIiAyPi9kZXYvbnVsbCB8Ci0JCQkgJFNFRCAtZSAxMHEgfAotCQkJICRFR1JFUCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCQlhX2RlcGxpYj0iIgotCQkJYnJlYWsgMgotCQkgICAgICBmaQotCQkgIGRvbmUKLQkJZG9uZQotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJZHJvcHBlZGRlcHM9eWVzCi0JCSRFQ0hPCi0JCSRFQ0hPICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKLQkJJEVDSE8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSRFQ0hPICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkkRUNITyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgotCQkkRUNITyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKLQkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCi0JCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgZmlsZSBtYWdpYyB0ZXN0KSIKLQkJZWxzZQotCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgotCQkgICRFQ0hPICIqKiogdXNpbmcgYSBmaWxlIG1hZ2ljLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKLQkJZmkKLQkgICAgICBmaQotCSAgICAgIDs7Ci0JICAgICopCi0JICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KLQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JICAgICAgOzsKLQkgICAgZXNhYwotCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KLQkgIDs7Ci0JbWF0Y2hfcGF0dGVybiopCi0JICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kOyBzaGlmdAotCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAotCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbwotCSAgICBjYXNlICRhX2RlcGxpYiBpbgotCSAgICAtbCopCi0JICAgICAgZnVuY19zdHJpcG5hbWUgLWwgJycgIiRhX2RlcGxpYiIKLQkgICAgICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKLQkgICAgICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCi0JCWNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgotCQkqIiAkYV9kZXBsaWIgIiopCi0JCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkgIGFfZGVwbGliPSIiCi0JCSAgOzsKLQkJZXNhYwotCSAgICAgIGZpCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCi0JCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbwotCQkgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAotCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KLQkJICAgIHBvdGxpYj0iJHBvdGVudF9saWIiICMgc2VlIHN5bWxpbmstY2hlY2sgYWJvdmUgaW4gZmlsZV9tYWdpYyB0ZXN0Ci0JCSAgICBpZiBldmFsICJcJEVDSE8gXCJYJHBvdGVudF9saWJcIiIgMj4vZGV2L251bGwgfCAkWHNlZCAtZSAxMHEgfCBcCi0JCSAgICAgICAkRUdSRVAgIiRtYXRjaF9wYXR0ZXJuX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCSAgICAgIGFfZGVwbGliPSIiCi0JCSAgICAgIGJyZWFrIDIKLQkJICAgIGZpCi0JCSAgZG9uZQotCQlkb25lCi0JICAgICAgZmkKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlkcm9wcGVkZGVwcz15ZXMKLQkJJEVDSE8KLQkJJEVDSE8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgotCQkkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJJEVDSE8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCi0JCSRFQ0hPICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgotCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KLQkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciByZWdleCBwYXR0ZXJuIHRlc3QpIgotCQllbHNlCi0JCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCi0JCSAgJEVDSE8gIioqKiB1c2luZyBhIHJlZ2V4IHBhdHRlcm4uIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgotCQlmaQotCSAgICAgIGZpCi0JICAgICAgOzsKLQkgICAgKikKLQkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgotCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkgICAgICA7OwotCSAgICBlc2FjCi0JICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgotCSAgOzsKLQlub25lIHwgdW5rbm93biB8ICopCi0JICBuZXdkZXBsaWJzPSIiCi0JICB0bXBfZGVwbGlicz1gJEVDSE8gIlggJGRlcGxpYnMiIHwgJFhzZWQgXAotCSAgICAgIC1lICdzLyAtbGMkLy8nIC1lICdzLyAtW0xSXVteIF0qLy9nJ2AKLQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KLQkgICAgZm9yIGkgaW4gJHByZWRlcHMgJHBvc3RkZXBzIDsgZG8KLQkgICAgICAjIGNhbid0IHVzZSBYc2VkIGJlbG93LCBiZWNhdXNlICRpIG1pZ2h0IGNvbnRhaW4gJy8nCi0JICAgICAgdG1wX2RlcGxpYnM9YCRFQ0hPICJYICR0bXBfZGVwbGlicyIgfCAkWHNlZCAtZSAicywkaSwsImAKLQkgICAgZG9uZQotCSAgZmkKLQkgIGlmICRFQ0hPICJYICR0bXBfZGVwbGlicyIgfCAkWHNlZCAtZSAncy9bCSBdLy9nJyB8Ci0JICAgICAkR1JFUCAuID4vZGV2L251bGw7IHRoZW4KLQkgICAgJEVDSE8KLQkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCi0JICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBsYXRmb3JtLiIKLQkgICAgZWxzZQotCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgotCSAgICBmaQotCSAgICAkRUNITyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCi0JICAgIGRyb3BwZWRkZXBzPXllcwotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCXZlcnN1ZmZpeD0kdmVyc3VmZml4X3NhdmUKLQltYWpvcj0kbWFqb3Jfc2F2ZQotCXJlbGVhc2U9JHJlbGVhc2Vfc2F2ZQotCWxpYm5hbWU9JGxpYm5hbWVfc2F2ZQotCW5hbWU9JG5hbWVfc2F2ZQotCi0JY2FzZSAkaG9zdCBpbgotCSotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKLQkgICMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IHdpdGggdGhlIFN5c3RlbSBmcmFtZXdvcmsKLQkgIG5ld2RlcGxpYnM9YCRFQ0hPICJYICRuZXdkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCi0JICA7OwotCWVzYWMKLQotCWlmIHRlc3QgIiRkcm9wcGVkZGVwcyIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCi0JICAgICRFQ0hPCi0JICAgICRFQ0hPICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKLQkgICAgJEVDSE8gIioqKiBkZXBlbmRlbmNpZXMgb2YgbW9kdWxlICRsaWJuYW1lLiAgVGhlcmVmb3JlLCBsaWJ0b29sIHdpbGwgY3JlYXRlIgotCSAgICAkRUNITyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCi0JICAgICRFQ0hPICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCi0JICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JICAgICAgJEVDSE8KLQkgICAgICAkRUNITyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JICAgICAgJEVDSE8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCi0JICAgICAgJEVDSE8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKLQkgICAgICAkRUNITyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgICBlbHNlCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGZpCi0JICBlbHNlCi0JICAgICRFQ0hPICIqKiogVGhlIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZSBiZWVuIGRyb3BwZWQgaGVyZSB3aWxsIGJlIgotCSAgICAkRUNITyAiKioqIGF1dG9tYXRpY2FsbHkgYWRkZWQgd2hlbmV2ZXIgYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHRoaXMgbGlicmFyeSIKLQkgICAgJEVDSE8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKLQotCSAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IG5vOyB0aGVuCi0JICAgICAgJEVDSE8KLQkgICAgICAkRUNITyAiKioqIFNpbmNlIHRoaXMgbGlicmFyeSBtdXN0IG5vdCBjb250YWluIHVuZGVmaW5lZCBzeW1ib2xzLCIKLQkgICAgICAkRUNITyAiKioqIGJlY2F1c2UgZWl0aGVyIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoZW0gb3IiCi0JICAgICAgJEVDSE8gIioqKiBpdCB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgd2l0aCAtbm8tdW5kZWZpbmVkLCIKLQkgICAgICAkRUNITyAiKioqIGxpYnRvb2wgd2lsbCBvbmx5IGNyZWF0ZSBhIHN0YXRpYyB2ZXJzaW9uIG9mIGl0LiIKLQkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkJb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKLQkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCQlidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgICBlbHNlCi0JCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICAgIGZpCi0JICAgIGZpCi0JICBmaQotCWZpCi0JIyBEb25lIGNoZWNraW5nIGRlcGxpYnMhCi0JZGVwbGlicz0kbmV3ZGVwbGlicwotICAgICAgZmkKLSAgICAgICMgVGltZSB0byBjaGFuZ2UgYWxsIG91ciAiZm9vLmx0ZnJhbWV3b3JrIiBzdHVmZiBiYWNrIHRvICItZnJhbWV3b3JrIGZvbyIKLSAgICAgIGNhc2UgJGhvc3QgaW4KLQkqLSotZGFyd2luKikKLQkgIG5ld2RlcGxpYnM9YCRFQ0hPICJYICRuZXdkZXBsaWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAotCSAgbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9YCRFQ0hPICJYICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKLQkgIGRlcGxpYnM9YCRFQ0hPICJYICRkZXBsaWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAotCSAgOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0Ci0gICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAotICAgICAgbmV3X2xpYnM9Ci0gICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbwotCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgotCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKLQkqKQotCSAgY2FzZSAiICRkZXBsaWJzICIgaW4KLQkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKLQkgICAgbmV3X2xpYnM9IiRuZXdfbGlicyAtTCRwYXRoLyRvYmpkaXIiIDs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JY2FzZSAkZGVwbGliIGluCi0JLUwqKQotCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCi0JICAqIiAkZGVwbGliICIqKSA7OwotCSAgKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OwotCSAgZXNhYwotCSAgOzsKLQkqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgZGVwbGlicz0iJG5ld19saWJzIgotCi0gICAgICAjIEFsbCB0aGUgbGlicmFyeS1zcGVjaWZpYyB2YXJpYWJsZXMgKGluc3RhbGxfbGliZGlyIGlzIHNldCBhYm92ZSkuCi0gICAgICBsaWJyYXJ5X25hbWVzPQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICBkbG5hbWU9Ci0KLSAgICAgICMgVGVzdCBhZ2Fpbiwgd2UgbWF5IGhhdmUgZGVjaWRlZCBub3QgdG8gYnVpbGQgaXQgYW55IG1vcmUKLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgPSB5ZXM7IHRoZW4KLQkgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKLQkgIGhhcmRjb2RlX2xpYmRpcnM9Ci0JICBkZXBfcnBhdGg9Ci0JICBycGF0aD0iJGZpbmFsaXplX3JwYXRoIgotCSAgdGVzdCAiJG1vZGUiICE9IHJlbGluayAmJiBycGF0aD0iJGNvbXBpbGVfcnBhdGgkcnBhdGgiCi0JICBmb3IgbGliZGlyIGluICRycGF0aDsgZG8KLQkgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JCWlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCQkgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JCWVsc2UKLQkJICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JCSAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KLQkJICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCSAgICA7OwotCQkgICopCi0JCSAgICBoYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJICAgIDs7Ci0JCSAgZXNhYwotCQlmaQotCSAgICAgIGVsc2UKLQkJZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCQlkZXBfcnBhdGg9IiRkZXBfcnBhdGggJGZsYWciCi0JICAgICAgZmkKLQkgICAgZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICAgICAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgotCSAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBkb25lCi0JICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCi0JICAgICB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkgICAgbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQkgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQiOyB0aGVuCi0JICAgICAgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZFwiCi0JICAgIGVsc2UKLQkgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQkgICAgZmkKLQkgIGZpCi0JICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiICYmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgotCSAgICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgICBycGF0aD0KLQkgICAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KLQkgICAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICAgIGRvbmUKLQkgICAgZXZhbCAiJHJ1bnBhdGhfdmFyPSckcnBhdGhcJCRydW5wYXRoX3Zhcic7IGV4cG9ydCAkcnVucGF0aF92YXIiCi0JICBmaQotCSAgdGVzdCAtbiAiJGRlcF9ycGF0aCIgJiYgZGVwbGlicz0iJGRlcF9ycGF0aCAkZGVwbGlicyIKLQlmaQotCi0Jc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoIgotCXRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkc2hsaWJwYXRoIgotCWlmIHRlc3QgLW4gIiRzaGxpYnBhdGgiOyB0aGVuCi0JICBldmFsICIkc2hsaWJwYXRoX3Zhcj0nJHNobGlicGF0aFwkJHNobGlicGF0aF92YXInOyBleHBvcnQgJHNobGlicGF0aF92YXIiCi0JZmkKLQotCSMgR2V0IHRoZSByZWFsIGFuZCBsaW5rIG5hbWVzIG9mIHRoZSBsaWJyYXJ5LgotCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCi0JZXZhbCBsaWJyYXJ5X25hbWVzPVwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiCi0Jc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0Jc2hpZnQKLQlyZWFsbmFtZT0iJDEiCi0Jc2hpZnQKLQotCWlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KLQkgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKLQllbHNlCi0JICBzb25hbWU9IiRyZWFsbmFtZSIKLQlmaQotCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCi0JICBkbG5hbWU9JHNvbmFtZQotCWZpCi0KLQlsaWI9IiRvdXRwdXRfb2JqZGlyLyRyZWFsbmFtZSIKLQlsaW5rbmFtZXM9Ci0JZm9yIGxpbmsKLQlkbwotCSAgbGlua25hbWVzPSIkbGlua25hbWVzICRsaW5rIgotCWRvbmUKLQotCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCi0JdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkRUNITyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KLQotCWRlbGZpbGVzPQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICRvcHRfZHJ5X3J1biB8fCBjcCAiJGV4cG9ydF9zeW1ib2xzIiAiJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudWV4cCIKLQkgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS51ZXhwIgotCSAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkZXhwb3J0X3N5bWJvbHMiCi0JZmkKLQotCW9yaWdfZXhwb3J0X3N5bWJvbHM9Ci0JY2FzZSAkaG9zdF9vcyBpbgotCWN5Z3dpbiogfCBtaW5ndyopCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgIyBleHBvcnRpbmcgdXNpbmcgdXNlciBzdXBwbGllZCBzeW1maWxlCi0JICAgIGlmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiAhPSB4RVhQT1JUUzsgdGhlbgotCSAgICAgICMgYW5kIGl0J3MgTk9UIGFscmVhZHkgYSAuZGVmIGZpbGUuIE11c3QgZmlndXJlIG91dAotCSAgICAgICMgd2hpY2ggb2YgdGhlIGdpdmVuIHN5bWJvbHMgYXJlIGRhdGEgc3ltYm9scyBhbmQgdGFnCi0JICAgICAgIyB0aGVtIGFzIHN1Y2guIFNvLCB0cmlnZ2VyIHVzZSBvZiBleHBvcnRfc3ltYm9sc19jbWRzLgotCSAgICAgICMgZXhwb3J0X3N5bWJvbHMgZ2V0cyByZWFzc2lnbmVkIGluc2lkZSB0aGUgInByZXBhcmUKLQkgICAgICAjIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMiIGlmIHN0YXRlbWVudCwgc28gdGhlCi0JICAgICAgIyBpbmNsdWRlX2V4cHN5bXMgbG9naWMgc3RpbGwgd29ya3MuCi0JICAgICAgb3JpZ19leHBvcnRfc3ltYm9scz0iJGV4cG9ydF9zeW1ib2xzIgotCSAgICAgIGV4cG9ydF9zeW1ib2xzPQotCSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLQkgICAgZmkKLQkgIGZpCi0JICA7OwotCWVzYWMKLQotCSMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCi0JaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSAgaWYgdGVzdCAiJGFsd2F5c19leHBvcnRfc3ltYm9scyIgPSB5ZXMgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICBmdW5jX3ZlcmJvc2UgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgotCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgotCSAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRleHBvcnRfc3ltYm9scwotCSAgICBjbWRzPSRleHBvcnRfc3ltYm9sc19jbWRzCi0JICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAgIGV2YWwgY21kPVwiJGNtZFwiCi0JICAgICAgZnVuY19sZW4gIiAkY21kIgotCSAgICAgIGxlbj0kZnVuY19sZW5fcmVzdWx0Ci0JICAgICAgaWYgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iIHx8IHRlc3QgIiRtYXhfY21kX2xlbiIgLWxlIC0xOyB0aGVuCi0JCWZ1bmNfc2hvd19ldmFsICIkY21kIiAnZXhpdCAkPycKLQkJc2tpcHBlZF9leHBvcnQ9ZmFsc2UKLQkgICAgICBlbHNlCi0JCSMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBleGVjdXRlIGluIG9uZSBzdGVwLgotCQlmdW5jX3ZlcmJvc2UgInVzaW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUgZm9yIGV4cG9ydCBsaXN0Li4uIgotCQlza2lwcGVkX2V4cG9ydD06Ci0JCSMgQnJlYWsgb3V0IGVhcmx5LCBvdGhlcndpc2Ugc2tpcHBlZF9leHBvcnQgbWF5IGJlCi0JCSMgc2V0IHRvIGZhbHNlIGJ5IGEgbGF0ZXIgYnV0IHNob3J0ZXIgY21kLgotCQlicmVhawotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IjsgdGhlbgotCSAgICAgIGZ1bmNfc2hvd19ldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKLQkgICAgICBmdW5jX3Nob3dfZXZhbCAnJE1WICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJwotCSAgICBmaQotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkaW5jbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgdG1wX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCi0JICB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyIgJiYgdG1wX2V4cG9ydF9zeW1ib2xzPSIkb3JpZ19leHBvcnRfc3ltYm9scyIKLQkgICRvcHRfZHJ5X3J1biB8fCBldmFsICckRUNITyAiWCRpbmNsdWRlX2V4cHN5bXMiIHwgJFhzZWQgfCAkU1AyTkwgPj4gIiR0bXBfZXhwb3J0X3N5bWJvbHMiJwotCWZpCi0KLQlpZiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgLW4gIiRvcmlnX2V4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSAgIyBUaGUgZ2l2ZW4gZXhwb3J0c19zeW1ib2xzIGZpbGUgaGFzIHRvIGJlIGZpbHRlcmVkLCBzbyBmaWx0ZXIgaXQuCi0JICBmdW5jX3ZlcmJvc2UgImZpbHRlciBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYScgdG8gdGFnIERBVEEgZXhwb3J0cyIKLQkgICMgRklYTUU6ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciBwb3RlbnRpYWxseSBjb250YWlucyBsb3RzIG9mCi0JICAjICdzJyBjb21tYW5kcyB3aGljaCBub3QgYWxsIHNlZHMgY2FuIGhhbmRsZS4gR05VIHNlZCBzaG91bGQgYmUgZmluZQotCSAgIyB0aG91Z2guIEFsc28sIHRoZSBmaWx0ZXIgc2NhbGVzIHN1cGVybGluZWFybHkgd2l0aCB0aGUgbnVtYmVyIG9mCi0JICAjIGdsb2JhbCB2YXJpYWJsZXMuIGpvaW4oMSkgd291bGQgYmUgbmljZSBoZXJlLCBidXQgdW5mb3J0dW5hdGVseQotCSAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KLQkgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1lICcvWyAsXURBVEEvIWQ7cyxcKC4qXClcKFsgXCxdLipcKSxzfF5cMSR8XDFcMnwsJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlcgotCSAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIgotCSAgZXhwb3J0X3N5bWJvbHM9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmCi0JICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgPCAkb3JpZ19leHBvcnRfc3ltYm9scyA+ICRleHBvcnRfc3ltYm9scwotCWZpCi0KLQl0bXBfZGVwbGlicz0KLQlmb3IgdGVzdF9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JICBjYXNlICIgJGNvbnZlbmllbmNlICIgaW4KLQkgICoiICR0ZXN0X2RlcGxpYiAiKikgOzsKLQkgICopCi0JICAgIHRtcF9kZXBsaWJzPSIkdG1wX2RlcGxpYnMgJHRlc3RfZGVwbGliIgotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQlkZXBsaWJzPSIkdG1wX2RlcGxpYnMiCi0KLQlpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiICYmCi0JICAgIHRlc3QgIiRjb21waWxlcl9uZWVkc19vYmplY3QiID0geWVzICYmCi0JICAgIHRlc3QgLXogIiRsaWJvYmpzIjsgdGhlbgotCSAgICAjIGV4dHJhY3QgdGhlIGFyY2hpdmVzLCBzbyB3ZSBoYXZlIG9iamVjdHMgdG8gbGlzdC4KLQkgICAgIyBUT0RPOiBjb3VsZCBvcHRpbWl6ZSB0aGlzIHRvIGp1c3QgZXh0cmFjdCBvbmUgYXJjaGl2ZS4KLQkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci0JICBmaQotCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKLQkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCi0JICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9Ci0JICBlbHNlCi0JICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JICAgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRjb252ZW5pZW5jZQotCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLQkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgotCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmbGFnIgotCWZpCi0KLQkjIE1ha2UgYSBiYWNrdXAgb2YgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgd2hlbiByZWxpbmtpbmcKLQlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkgICRvcHRfZHJ5X3J1biB8fCBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJFJNICR7cmVhbG5hbWV9VSAmJiAkTVYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VSknIHx8IGV4aXQgJD8KLQlmaQotCi0JIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9leHBzeW1fY21kc1wiCi0JICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcwotCSAgZWxzZQotCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfY21kc1wiCi0JICAgIGNtZHM9JG1vZHVsZV9jbWRzCi0JICBmaQotCWVsc2UKLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgotCSAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCi0JICBlbHNlCi0JICAgIGV2YWwgdGVzdF9jbWRzPVwiJGFyY2hpdmVfY21kc1wiCi0JICAgIGNtZHM9JGFyY2hpdmVfY21kcwotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJgotCSAgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIgJiYKLQkgICBsZW49JGZ1bmNfbGVuX3Jlc3VsdCAmJgotCSAgIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgotCSAgOgotCWVsc2UKLQkgICMgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZyB0byBsaW5rIGluIG9uZSBzdGVwLCBsaW5rIHBpZWNld2lzZQotCSAgIyBvciwgaWYgdXNpbmcgR05VIGxkIGFuZCBza2lwcGVkX2V4cG9ydCBpcyBub3QgOiwgdXNlIGEgbGlua2VyCi0JICAjIHNjcmlwdC4KLQotCSAgIyBTYXZlIHRoZSB2YWx1ZSBvZiAkb3V0cHV0IGFuZCAkbGlib2JqcyBiZWNhdXNlIHdlIHdhbnQgdG8KLQkgICMgdXNlIHRoZW0gbGF0ZXIuICBJZiB3ZSBoYXZlIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCB3ZQotCSAgIyB3YW50IHRvIHVzZSBzYXZlX2xpYm9ianMgYXMgaXQgd2FzIGJlZm9yZQotCSAgIyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyB3YXMgZXhwYW5kZWQsIGJlY2F1c2Ugd2UgY2FuJ3QKLQkgICMgYXNzdW1lIHRoZSBsaW5rZXIgdW5kZXJzdGFuZHMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMuCi0JICAjIFRoaXMgbWF5IGhhdmUgdG8gYmUgcmV2aXNpdGVkLCBpbiBjYXNlIHRvbyBtYW55Ci0JICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBnZXQgbGlua2VkIGluIGFuZCBlbmQgdXAgZXhjZWVkaW5nCi0JICAjIHRoZSBzcGVjLgotCSAgaWYgdGVzdCAteiAiJGNvbnZlbmllbmNlIiB8fCB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICAgIHNhdmVfbGlib2Jqcz0kbGlib2JqcwotCSAgZmkKLQkgIHNhdmVfb3V0cHV0PSRvdXRwdXQKLQkgIG91dHB1dF9sYT1gJEVDSE8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICIkYmFzZW5hbWUiYAotCi0JICAjIENsZWFyIHRoZSByZWxvYWRhYmxlIG9iamVjdCBjcmVhdGlvbiBjb21tYW5kIHF1ZXVlIGFuZAotCSAgIyBpbml0aWFsaXplIGsgdG8gb25lLgotCSAgdGVzdF9jbWRzPQotCSAgY29uY2F0X2NtZHM9Ci0JICBvYmpsaXN0PQotCSAgbGFzdF9yb2JqPQotCSAgaz0xCi0KLQkgIGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotCSAgICBvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubG5rc2NyaXB0Ci0JICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgR05VIGxkIHNjcmlwdDogJG91dHB1dCIKLQkgICAgJEVDSE8gJ0lOUFVUICgnID4gJG91dHB1dAotCSAgICBmb3Igb2JqIGluICRzYXZlX2xpYm9ianMKLQkgICAgZG8KLQkgICAgICAkRUNITyAiJG9iaiIgPj4gJG91dHB1dAotCSAgICBkb25lCi0JICAgICRFQ0hPICcpJyA+PiAkb3V0cHV0Ci0JICAgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJG91dHB1dCIKLQkgIGVsaWYgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyIgJiYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0ICJYJGZpbGVfbGlzdF9zcGVjIiAhPSBYOyB0aGVuCi0JICAgIG91dHB1dD0ke291dHB1dF9vYmpkaXJ9LyR7b3V0cHV0X2xhfS5sbmsKLQkgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyBsaW5rZXIgaW5wdXQgZmlsZSBsaXN0OiAkb3V0cHV0IgotCSAgICA6ID4gJG91dHB1dAotCSAgICBzZXQgeCAkc2F2ZV9saWJvYmpzCi0JICAgIHNoaWZ0Ci0JICAgIGZpcnN0b2JqPQotCSAgICBpZiB0ZXN0ICIkY29tcGlsZXJfbmVlZHNfb2JqZWN0IiA9IHllczsgdGhlbgotCSAgICAgIGZpcnN0b2JqPSIkMSAiCi0JICAgICAgc2hpZnQKLQkgICAgZmkKLQkgICAgZm9yIG9iagotCSAgICBkbwotCSAgICAgICRFQ0hPICIkb2JqIiA+PiAkb3V0cHV0Ci0JICAgIGRvbmUKLQkgICAgZGVsZmlsZXM9IiRkZWxmaWxlcyAkb3V0cHV0IgotCSAgICBvdXRwdXQ9JGZpcnN0b2JqXCIkZmlsZV9saXN0X3NwZWMkb3V0cHV0XCIKLQkgIGVsc2UKLQkgICAgaWYgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyI7IHRoZW4KLQkgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLi4uIgotCSAgICAgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAotCSAgICAgIGV2YWwgdGVzdF9jbWRzPVwiJHJlbG9hZF9jbWRzXCIKLQkgICAgICBmdW5jX2xlbiAiICR0ZXN0X2NtZHMiCi0JICAgICAgbGVuMD0kZnVuY19sZW5fcmVzdWx0Ci0JICAgICAgbGVuPSRsZW4wCi0KLQkgICAgICAjIExvb3Agb3ZlciB0aGUgbGlzdCBvZiBvYmplY3RzIHRvIGJlIGxpbmtlZC4KLQkgICAgICBmb3Igb2JqIGluICRzYXZlX2xpYm9ianMKLQkgICAgICBkbwotCQlmdW5jX2xlbiAiICRvYmoiCi0JCWZ1bmNfYXJpdGggJGxlbiArICRmdW5jX2xlbl9yZXN1bHQKLQkJbGVuPSRmdW5jX2FyaXRoX3Jlc3VsdAotCQlpZiB0ZXN0ICJYJG9iamxpc3QiID0gWCB8fAotCQkgICB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiI7IHRoZW4KLQkJICBmdW5jX2FwcGVuZCBvYmpsaXN0ICIgJG9iaiIKLQkJZWxzZQotCQkgICMgVGhlIGNvbW1hbmQgJHRlc3RfY21kcyBpcyBhbG1vc3QgdG9vIGxvbmcsIGFkZCBhCi0JCSAgIyBjb21tYW5kIHRvIHRoZSBxdWV1ZS4KLQkJICBpZiB0ZXN0ICIkayIgLWVxIDEgOyB0aGVuCi0JCSAgICAjIFRoZSBmaXJzdCBmaWxlIGRvZXNuJ3QgaGF2ZSBhIHByZXZpb3VzIGNvbW1hbmQgdG8gYWRkLgotCQkgICAgZXZhbCBjb25jYXRfY21kcz1cIiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKLQkJICBlbHNlCi0JCSAgICAjIEFsbCBzdWJzZXF1ZW50IHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzIHdpbGwgbGluayBpbgotCQkgICAgIyB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KLQkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqflwkUk0gJGxhc3Rfcm9ialwiCi0JCSAgZmkKLQkJICBsYXN0X3JvYmo9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKLQkJICBmdW5jX2FyaXRoICRrICsgMQotCQkgIGs9JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JCSAgb3V0cHV0PSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0Ci0JCSAgb2JqbGlzdD0kb2JqCi0JCSAgZnVuY19sZW4gIiAkbGFzdF9yb2JqIgotCQkgIGZ1bmNfYXJpdGggJGxlbjAgKyAkZnVuY19sZW5fcmVzdWx0Ci0JCSAgbGVuPSRmdW5jX2FyaXRoX3Jlc3VsdAotCQlmaQotCSAgICAgIGRvbmUKLQkgICAgICAjIEhhbmRsZSB0aGUgcmVtYWluaW5nIG9iamVjdHMgYnkgY3JlYXRpbmcgb25lIGxhc3QKLQkgICAgICAjIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUuICBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdAotCSAgICAgICMgZmlsZXMgd2lsbCBsaW5rIGluIHRoZSBsYXN0IG9uZSBjcmVhdGVkLgotCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgotCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCi0JICAgICAgaWYgdGVzdCAtbiAiJGxhc3Rfcm9iaiI7IHRoZW4KLQkgICAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc31+XCRSTSAkbGFzdF9yb2JqXCIKLQkgICAgICBmaQotCSAgICAgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJG91dHB1dCIKLQotCSAgICBlbHNlCi0JICAgICAgb3V0cHV0PQotCSAgICBmaQotCi0JICAgIGlmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCi0JICAgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKLQkgICAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgotCSAgICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJGV4cG9ydF9zeW1ib2xzCi0JICAgICAgbGlib2Jqcz0kb3V0cHV0Ci0JICAgICAgIyBBcHBlbmQgdGhlIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBleHBvcnQgZmlsZS4KLQkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KLQkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kcyRleHBvcnRfc3ltYm9sc19jbWRzXCIKLQkgICAgICBpZiB0ZXN0IC1uICIkbGFzdF9yb2JqIjsgdGhlbgotCQlldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc35cJFJNICRsYXN0X3JvYmpcIgotCSAgICAgIGZpCi0JICAgIGZpCi0KLQkgICAgdGVzdCAtbiAiJHNhdmVfbGlib2JqcyIgJiYKLQkgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIGEgdGVtcG9yYXJ5IHJlbG9hZGFibGUgb2JqZWN0IGZpbGU6ICRvdXRwdXQiCi0KLQkgICAgIyBMb29wIHRocm91Z2ggdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBhYm92ZSBhbmQgZXhlY3V0ZSB0aGVtLgotCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgZm9yIGNtZCBpbiAkY29uY2F0X2NtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgJG9wdF9zaWxlbnQgfHwgewotCQkgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJGNtZCIKLQkJICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCi0JICAgICAgfQotCSAgICAgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkY21kIiB8fCB7Ci0JCWx0X2V4aXQ9JD8KLQotCQkjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQkJaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCi0JCSAgKCBjZCAiJG91dHB1dF9vYmpkaXIiICYmIFwKLQkJICAgICRSTSAiJHtyZWFsbmFtZX1UIiAmJiBcCi0JCSAgICAkTVYgIiR7cmVhbG5hbWV9VSIgIiRyZWFsbmFtZSIgKQotCQlmaQotCi0JCWV4aXQgJGx0X2V4aXQKLQkgICAgICB9Ci0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0KLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAmJiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgotCSAgICAgIGZ1bmNfc2hvd19ldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKLQkgICAgICBmdW5jX3Nob3dfZXZhbCAnJE1WICIke2V4cG9ydF9zeW1ib2xzfVQiICIkZXhwb3J0X3N5bWJvbHMiJwotCSAgICBmaQotCSAgZmkKLQotICAgICAgICAgIGlmICR7c2tpcHBlZF9leHBvcnQtZmFsc2V9OyB0aGVuCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICAgICB0bXBfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKLQkgICAgICB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyIgJiYgdG1wX2V4cG9ydF9zeW1ib2xzPSIkb3JpZ19leHBvcnRfc3ltYm9scyIKLQkgICAgICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnJEVDSE8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRYc2VkIHwgJFNQMk5MID4+ICIkdG1wX2V4cG9ydF9zeW1ib2xzIicKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyI7IHRoZW4KLQkgICAgICAjIFRoZSBnaXZlbiBleHBvcnRzX3N5bWJvbHMgZmlsZSBoYXMgdG8gYmUgZmlsdGVyZWQsIHNvIGZpbHRlciBpdC4KLQkgICAgICBmdW5jX3ZlcmJvc2UgImZpbHRlciBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYScgdG8gdGFnIERBVEEgZXhwb3J0cyIKLQkgICAgICAjIEZJWE1FOiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgcG90ZW50aWFsbHkgY29udGFpbnMgbG90cyBvZgotCSAgICAgICMgJ3MnIGNvbW1hbmRzIHdoaWNoIG5vdCBhbGwgc2VkcyBjYW4gaGFuZGxlLiBHTlUgc2VkIHNob3VsZCBiZSBmaW5lCi0JICAgICAgIyB0aG91Z2guIEFsc28sIHRoZSBmaWx0ZXIgc2NhbGVzIHN1cGVybGluZWFybHkgd2l0aCB0aGUgbnVtYmVyIG9mCi0JICAgICAgIyBnbG9iYWwgdmFyaWFibGVzLiBqb2luKDEpIHdvdWxkIGJlIG5pY2UgaGVyZSwgYnV0IHVuZm9ydHVuYXRlbHkKLQkgICAgICAjIGlzbid0IGEgYmxlc3NlZCB0b29sLgotCSAgICAgICRvcHRfZHJ5X3J1biB8fCAkU0VEIC1lICcvWyAsXURBVEEvIWQ7cyxcKC4qXClcKFsgXCxdLipcKSxzfF5cMSR8XDFcMnwsJyA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlcgotCSAgICAgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciIKLQkgICAgICBleHBvcnRfc3ltYm9scz0kb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYKLQkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgPCAkb3JpZ19leHBvcnRfc3ltYm9scyA+ICRleHBvcnRfc3ltYm9scwotCSAgICBmaQotCSAgZmkKLQotCSAgbGlib2Jqcz0kb3V0cHV0Ci0JICAjIFJlc3RvcmUgdGhlIHZhbHVlIG9mIG91dHB1dC4KLQkgIG91dHB1dD0kc2F2ZV9vdXRwdXQKLQotCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIiAmJiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQotCSAgZmkKLQkgICMgRXhwYW5kIHRoZSBsaWJyYXJ5IGxpbmtpbmcgY29tbWFuZHMgYWdhaW4gdG8gcmVzZXQgdGhlCi0JICAjIHZhbHVlIG9mICRsaWJvYmpzIGZvciBwaWVjZXdpc2UgbGlua2luZy4KLQotCSAgIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJG1vZHVsZV9jbWRzIiA7IHRoZW4KLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcwotCSAgICBlbHNlCi0JICAgICAgY21kcz0kbW9kdWxlX2NtZHMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KLQkgICAgICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCi0JICAgIGVsc2UKLQkgICAgICBjbWRzPSRhcmNoaXZlX2NtZHMKLQkgICAgZmkKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRkZWxmaWxlcyI7IHRoZW4KLQkgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMgdG8gJGNtZHMuCi0JICBldmFsIGNtZHM9XCJcJGNtZHN+XCRSTSAkZGVsZmlsZXNcIgotCWZpCi0KLQkjIEFkZCBhbnkgb2JqZWN0cyBmcm9tIHByZWxvYWRlZCBjb252ZW5pZW5jZSBsaWJyYXJpZXMKLQlpZiB0ZXN0IC1uICIkZGxwcmVmaWxlcyI7IHRoZW4KLQkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCi0JICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKLQotCSAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGRscHJlZmlsZXMKLQkgIGxpYm9ianM9IiRsaWJvYmpzICRmdW5jX2V4dHJhY3RfYXJjaGl2ZXNfcmVzdWx0IgotCSAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KLQlmaQotCi0Jc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgZXZhbCBjbWQ9XCIkY21kXCIKLQkgICRvcHRfc2lsZW50IHx8IHsKLQkgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkY21kIgotCSAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCi0JICB9Ci0JICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZCIgfHwgewotCSAgICBsdF9leGl0PSQ/Ci0KLQkgICAgIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0Ci0JICAgIGlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgotCSAgICAgICggY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiBcCi0JICAgICAgICAkUk0gIiR7cmVhbG5hbWV9VCIgJiYgXAotCQkkTVYgIiR7cmVhbG5hbWV9VSIgIiRyZWFsbmFtZSIgKQotCSAgICBmaQotCi0JICAgIGV4aXQgJGx0X2V4aXQKLQkgIH0KLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0KLQkjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKLQlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KLQkgICRvcHRfZHJ5X3J1biB8fCBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJFJNICR7cmVhbG5hbWV9VCAmJiAkTVYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VCAmJiAkTVYgJHtyZWFsbmFtZX1VICRyZWFsbmFtZSknIHx8IGV4aXQgJD8KLQotCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICAgICAgZnVuY19zaG93X2V2YWwgJyR7Uk19ciAiJGdlbnRvcCInCi0JICAgIGZpCi0JICBmaQotCi0JICBleGl0ICRFWElUX1NVQ0NFU1MKLQlmaQotCi0JIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KLQlmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KLQkgIGlmIHRlc3QgIiRyZWFsbmFtZSIgIT0gIiRsaW5rbmFtZSI7IHRoZW4KLQkgICAgZnVuY19zaG93X2V2YWwgJyhjZCAiJG91dHB1dF9vYmpkaXIiICYmICRSTSAiJGxpbmtuYW1lIiAmJiAkTE5fUyAiJHJlYWxuYW1lIiAiJGxpbmtuYW1lIiknICdleGl0ICQ/JwotCSAgZmkKLQlkb25lCi0KLQkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgotCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KLQkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgotCSAgZGxuYW1lPSIkc29uYW1lIgotCWZpCi0gICAgICBmaQotICAgICAgOzsKLQotICAgIG9iaikKLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCi0JZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCi0gICAgICBmaQotCi0gICAgICBjYXNlICIgJGRlcGxpYnMiIGluCi0gICAgICAqXCAtbCogfCAqXCAtTCopCi0JZnVuY193YXJuaW5nICJcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIG9iamVjdHMiIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgIHRlc3QgLW4gIiRycGF0aCIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCi0KLSAgICAgIHRlc3QgLW4gIiR4cnBhdGgiICYmIFwKLQlmdW5jX3dhcm5pbmcgIlxgLVInIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCi0KLSAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgotCi0gICAgICB0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKLQotICAgICAgY2FzZSAkb3V0cHV0IGluCi0gICAgICAqLmxvKQotCXRlc3QgLW4gIiRvYmpzJG9sZF9kZXBsaWJzIiAmJiBcCi0JICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgYnVpbGQgbGlicmFyeSBvYmplY3QgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMiCi0KLQlsaWJvYmo9JG91dHB1dAotCWZ1bmNfbG8ybyAiJGxpYm9iaiIKLQlvYmo9JGZ1bmNfbG8yb19yZXN1bHQKLQk7OwotICAgICAgKikKLQlsaWJvYmo9Ci0Jb2JqPSIkb3V0cHV0IgotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KLSAgICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJG9iaiAkbGlib2JqCi0KLSAgICAgICMgT2JqZWN0cyBmcm9tIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFRoaXMgYXNzdW1lcwotICAgICAgIyBzaW5nbGUtdmVyc2lvbiBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBXaGVuZXZlciB3ZSBjcmVhdGUKLSAgICAgICMgZGlmZmVyZW50IG9uZXMgZm9yIFBJQy9ub24tUElDLCB0aGlzIHdlJ2xsIGhhdmUgdG8gZHVwbGljYXRlCi0gICAgICAjIHRoZSBleHRyYWN0aW9uLgotICAgICAgcmVsb2FkX2NvbnZfb2Jqcz0KLSAgICAgIGdlbnRvcD0KLSAgICAgICMgcmVsb2FkX2NtZHMgcnVucyAkTEQgZGlyZWN0bHksIHNvIGxldCB1cyBnZXQgcmlkIG9mCi0gICAgICAjIC1XbCBmcm9tIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIGFuZCBob3BlIHdlIGNhbiBnZXQgYnkgd2l0aAotICAgICAgIyB0dXJuaW5nIGNvbW1hIGludG8gc3BhY2UuLgotICAgICAgd2w9Ci0KLSAgICAgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICBldmFsIHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzPVwiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQkgIHJlbG9hZF9jb252X29ianM9JHJlbG9hZF9vYmpzXCBgJEVDSE8gIlgkdG1wX3dob2xlX2FyY2hpdmVfZmxhZ3MiIHwgJFhzZWQgLWUgJ3N8LHwgfGcnYAotCWVsc2UKLQkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKLQkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKLQkgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBDcmVhdGUgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0gICAgICByZWxvYWRfb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMgImAkRUNITyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JCcvZCcgLWUgJy9cLmxpYiQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAiICRyZWxvYWRfY29udl9vYmpzIiAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKLQotICAgICAgb3V0cHV0PSIkb2JqIgotICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRyZWxvYWRfY21kcyIgJ2V4aXQgJD8nCi0KLSAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgotICAgICAgaWYgdGVzdCAteiAiJGxpYm9iaiI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCSAgZnVuY19zaG93X2V2YWwgJyR7Uk19ciAiJGdlbnRvcCInCi0JZmkKLQotCWV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KLQkgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJwotCWZpCi0KLQkjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkb24ndAotCSMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0JIyAkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgotCSMgJG9wdF9kcnlfcnVuIHx8IGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPwotCWV4aXQgJEVYSVRfU1VDQ0VTUwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIiB8fCB0ZXN0ICIkcGljX21vZGUiICE9IGRlZmF1bHQ7IHRoZW4KLQkjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgotCXJlbG9hZF9vYmpzPSIkbGlib2JqcyAkcmVsb2FkX2NvbnZfb2JqcyIKLQlvdXRwdXQ9IiRsaWJvYmoiCi0JZnVuY19leGVjdXRlX2NtZHMgIiRyZWxvYWRfY21kcyIgJ2V4aXQgJD8nCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgotCWZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJwotICAgICAgZmkKLQotICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICA7OwotCi0gICAgcHJvZykKLSAgICAgIGNhc2UgJGhvc3QgaW4KLQkqY3lnd2luKikgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0IgotCSAgICAgICAgICBvdXRwdXQ9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdC5leGU7OwotICAgICAgZXNhYwotICAgICAgdGVzdCAtbiAiJHZpbmZvIiAmJiBcCi0JZnVuY193YXJuaW5nICJcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIgotCi0gICAgICB0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAotCWZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiCi0KLSAgICAgIHRlc3QgIiRwcmVsb2FkIiA9IHllcyBcCi0gICAgICAgICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB1bmtub3duIFwKLQkmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiID0gdW5rbm93biBcCi0JJiYgdGVzdCAiJGRsb3Blbl9zZWxmX3N0YXRpYyIgPSB1bmtub3duICYmIFwKLQkgIGZ1bmNfd2FybmluZyAiXGBMVF9JTklUKFtkbG9wZW5dKScgbm90IHVzZWQuIEFzc3VtaW5nIG5vIGRsb3BlbiBzdXBwb3J0LiIKLQotICAgICAgY2FzZSAkaG9zdCBpbgotICAgICAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQotCSMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCi0JY29tcGlsZV9kZXBsaWJzPWAkRUNITyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCi0JZmluYWxpemVfZGVwbGlicz1gJEVDSE8gIlggJGZpbmFsaXplX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIFN5c3RlbS5sdGZyYW1ld29yayAvJ2AKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBjYXNlICRob3N0IGluCi0gICAgICAqLSotZGFyd2luKikKLQkjIERvbid0IGFsbG93IGxhenkgbGlua2luZywgaXQgYnJlYWtzIEMrKyBnbG9iYWwgY29uc3RydWN0b3JzCi0JIyBCdXQgaXMgc3VwcG9zZWRseSBmaXhlZCBvbiAxMC40IG9yIGxhdGVyICh5YXkhKS4KLQlpZiB0ZXN0ICIkdGFnbmFtZSIgPSBDWFggOyB0aGVuCi0JICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9IGluCi0JICAgIDEwLlswMTIzXSkKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHt3bH0tYmluZF9hdF9sb2FkIgotCSAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICR7d2x9LWJpbmRfYXRfbG9hZCIKLQkgICAgOzsKLQkgIGVzYWMKLQlmaQotCSMgVGltZSB0byBjaGFuZ2UgYWxsIG91ciAiZm9vLmx0ZnJhbWV3b3JrIiBzdHVmZiBiYWNrIHRvICItZnJhbWV3b3JrIGZvbyIKLQljb21waWxlX2RlcGxpYnM9YCRFQ0hPICJYICRjb21waWxlX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCi0JZmluYWxpemVfZGVwbGlicz1gJEVDSE8gIlggJGZpbmFsaXplX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCi0JOzsKLSAgICAgIGVzYWMKLQotCi0gICAgICAjIG1vdmUgbGlicmFyeSBzZWFyY2ggcGF0aHMgdGhhdCBjb2luY2lkZSB3aXRoIHBhdGhzIHRvIG5vdCB5ZXQKLSAgICAgICMgaW5zdGFsbGVkIGxpYnJhcmllcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWJyYXJ5IHNlYXJjaCBsaXN0Ci0gICAgICBuZXdfbGlicz0KLSAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCi0JY2FzZSAiICRuZXdfbGlicyAiIGluCi0JKiIgLUwkcGF0aC8kb2JqZGlyICIqKSA7OwotCSopCi0JICBjYXNlICIgJGNvbXBpbGVfZGVwbGlicyAiIGluCi0JICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCi0JICAgIG5ld19saWJzPSIkbmV3X2xpYnMgLUwkcGF0aC8kb2JqZGlyIiA7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICBmb3IgZGVwbGliIGluICRjb21waWxlX2RlcGxpYnM7IGRvCi0JY2FzZSAkZGVwbGliIGluCi0JLUwqKQotCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCi0JICAqIiAkZGVwbGliICIqKSA7OwotCSAgKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OwotCSAgZXNhYwotCSAgOzsKLQkqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgY29tcGlsZV9kZXBsaWJzPSIkbmV3X2xpYnMiCi0KLQotICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRjb21waWxlX2RlcGxpYnMiCi0gICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZmluYWxpemVfZGVwbGlicyIKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoJHhycGF0aCI7IHRoZW4KLQkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCi0JZm9yIGxpYmRpciBpbiAkcnBhdGggJHhycGF0aDsgZG8KLQkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KLQkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWRvbmUKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCi0gICAgICBycGF0aD0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9Ci0gICAgICBmb3IgbGliZGlyIGluICRjb21waWxlX3JwYXRoICRmaW5hbGl6ZV9ycGF0aDsgZG8KLQlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgotCSAgICBlbHNlCi0JICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgotCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCi0JICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQk7OwotCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgotCSAgZmkKLQllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0JY2FzZSAkaG9zdCBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQotCSAgdGVzdGJpbmRpcj1gJHtFQ0hPfSAiJGxpYmRpciIgfCAke1NFRH0gLWUgJ3MqL2xpYiQqL2JpbionYAotCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCi0JICAqIjokbGliZGlyOiIqKSA7OwotCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGxpYmRpciI7OwotCSAgZXNhYwotCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCi0JICAqIjokdGVzdGJpbmRpcjoiKikgOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiR0ZXN0YmluZGlyIjs7Ci0JICBlc2FjCi0JICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0gICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLSAgICAgIGZpCi0gICAgICBjb21waWxlX3JwYXRoPSIkcnBhdGgiCi0KLSAgICAgIHJwYXRoPQotICAgICAgaGFyZGNvZGVfbGliZGlycz0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGZpbmFsaXplX3JwYXRoOyBkbwotCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JICAgICAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KLQkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCTs7Ci0JICAgICAgKikKLQkJaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZWxzZQotCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0JICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCi0JICBmaQotCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgY2FzZSAiJGZpbmFsaXplX3Blcm1fcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3Blcm1fcnBhdGg9IiRmaW5hbGl6ZV9wZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0gICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLSAgICAgIGZpCi0gICAgICBmaW5hbGl6ZV9ycGF0aD0iJHJwYXRoIgotCi0gICAgICBpZiB0ZXN0IC1uICIkbGlib2JqcyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSMgVHJhbnNmb3JtIGFsbCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gc3RhbmRhcmQgb2JqZWN0cy4KLQljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCWZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLSAgICAgIGZpCi0KLSAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkb3V0cHV0bmFtZSIgIkBQUk9HUkFNQCIgIm5vIgotCi0gICAgICAjIHRlbXBsYXRlIHByZWxpbmtpbmcgc3RlcAotICAgICAgaWYgdGVzdCAtbiAiJHByZWxpbmtfY21kcyI7IHRoZW4KLQlmdW5jX2V4ZWN1dGVfY21kcyAiJHByZWxpbmtfY21kcyIgJ2V4aXQgJD8nCi0gICAgICBmaQotCi0gICAgICB3cmFwcGVyc19yZXF1aXJlZD15ZXMKLSAgICAgIGNhc2UgJGhvc3QgaW4KLSAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiApCi0gICAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotICAgICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICAqKQotICAgICAgICBpZiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0gbm8gfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0gICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KLSAgICAgICAgZmkKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIGlmIHRlc3QgIiR3cmFwcGVyc19yZXF1aXJlZCIgPSBubzsgdGhlbgotCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLQljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQotCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgotCWV4aXRfc3RhdHVzPTAKLQlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXRfc3RhdHVzPSQ/JwotCi0JIyBEZWxldGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KLQlpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iOyB0aGVuCi0JICBmdW5jX3Nob3dfZXZhbCAnJFJNICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iJwotCWZpCi0KLQlleGl0ICRleGl0X3N0YXR1cwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KLQljb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCi0JZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgotICAgICAgZmkKLQotICAgICAgY29tcGlsZV92YXI9Ci0gICAgICBmaW5hbGl6ZV92YXI9Ci0gICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCi0JICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgcnBhdGg9Ci0JICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbwotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICBkb25lCi0JICBjb21waWxlX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCi0JZmkKLQlpZiB0ZXN0IC1uICIkZmluYWxpemVfcGVybV9ycGF0aCI7IHRoZW4KLQkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICBycGF0aD0KLQkgIGZvciBkaXIgaW4gJGZpbmFsaXplX3Blcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgIGRvbmUKLQkgIGZpbmFsaXplX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRub19pbnN0YWxsIiA9IHllczsgdGhlbgotCSMgV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNjcmlwdC4KLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JbGlua19jb21tYW5kPWAkRUNITyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCi0JIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KLQkkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQKLQkjIExpbmsgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXQKLQlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXQgJD8nCi0JZXhpdCAkRVhJVF9TVUNDRVNTCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0KLQlmdW5jX3dhcm5pbmcgInRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIgotCWZ1bmNfd2FybmluZyAiXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KLQkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0JICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgotCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKLQkgIGVsc2UKLQkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCi0JICAgIHJlbGlua19jb21tYW5kPQotCSAgZmkKLQllbHNlCi0JICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KLSAgICAgIGxpbmtfY29tbWFuZD1gJEVDSE8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJ2AKLQotICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZXMuCi0gICAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKLQotICAgICAgZnVuY19zaG93X2V2YWwgIiRsaW5rX2NvbW1hbmQiICdleGl0ICQ/JwotCi0gICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgotICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgotCWZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbwotCSAgaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8ICRsdF91bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCi0JICBlbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCSAgZWxzZQotCSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgotCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCi0JICBmaQotCWRvbmUKLQlyZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkcmVsaW5rX2NvbW1hbmQpIgotCXJlbGlua19jb21tYW5kPWAkRUNITyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIFF1b3RlICRFQ0hPIGZvciBzaGlwcGluZy4KLSAgICAgIGlmIHRlc3QgIlgkRUNITyIgPSAiWCRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotCWNhc2UgJHByb2dwYXRoIGluCi0JW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBxZWNobz0iJFNIRUxMICRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKLQkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKLQllc2FjCi0JcWVjaG89YCRFQ0hPICJYJHFlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGVsc2UKLQlxZWNobz1gJEVDSE8gIlgkRUNITyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBmaQotCi0gICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG5vdCBpbiBkcnkgcnVuIG1vZGUuCi0gICAgICAkb3B0X2RyeV9ydW4gfHwgewotCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcwotCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCi0JY2FzZSAkb3V0cHV0IGluCi0JICAqLmV4ZSkgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0IgotCSAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7Ci0JZXNhYwotCSMgdGVzdCBmb3IgY3lnd2luIGJlY2F1c2UgbXYgZmFpbHMgdy9vIC5leGUgZXh0ZW5zaW9ucwotCWNhc2UgJGhvc3QgaW4KLQkgICpjeWd3aW4qKQotCSAgICBleGVleHQ9LmV4ZQotCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXRuYW1lIgotCSAgICBvdXRwdXRuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKLQkgICopIGV4ZWV4dD0gOzsKLQllc2FjCi0JY2FzZSAkaG9zdCBpbgotCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKLQkgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG91dHB1dCIgIiIgIi4iCi0JICAgIG91dHB1dF9uYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAotCSAgICBvdXRwdXRfcGF0aD0kZnVuY19kaXJuYW1lX3Jlc3VsdAotCSAgICBjd3JhcHBlcnNvdXJjZT0iJG91dHB1dF9wYXRoLyRvYmpkaXIvbHQtJG91dHB1dF9uYW1lLmMiCi0JICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKLQkgICAgJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKLQkgICAgdHJhcCAiJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXI7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1Ci0KLQkgICAgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyA+ICRjd3JhcHBlcnNvdXJjZQotCi0JICAgICMgd2Ugc2hvdWxkIHJlYWxseSB1c2UgYSBidWlsZC1wbGF0Zm9ybSBzcGVjaWZpYyBjb21waWxlcgotCSAgICAjIGhlcmUsIGJ1dCBPVE9ILCB0aGUgd3JhcHBlcnMgKHNoZWxsIHNjcmlwdCBhbmQgdGhpcyBDIG9uZSkKLQkgICAgIyBhcmUgb25seSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZXhlY3V0ZSB0aGUgInJlYWwiIGJpbmFyeS4KLQkgICAgIyBTaW5jZSB0aGUgInJlYWwiIGJpbmFyeSBpcyBidWlsdCBmb3IgJGhvc3QsIHRoZW4gdGhpcwotCSAgICAjIHdyYXBwZXIgbWlnaHQgYXMgd2VsbCBiZSBidWlsdCBmb3IgJGhvc3QsIHRvby4KLQkgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgICAkTFRDQyAkTFRDRkxBR1MgLW8gJGN3cmFwcGVyICRjd3JhcHBlcnNvdXJjZQotCSAgICAgICRTVFJJUCAkY3dyYXBwZXIKLQkgICAgfQotCi0JICAgICMgTm93LCBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0IGZvciBmdW5jX3NvdXJjZSB1c2U6Ci0JICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgJGN3cmFwcGVyCi0JICAgICRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKLQkgICAgdHJhcCAiJFJNICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLQkgICAgJG9wdF9kcnlfcnVuIHx8IHsKLQkgICAgICAjIG5vdGU6IHRoaXMgc2NyaXB0IHdpbGwgbm90IGJlIGV4ZWN1dGVkLCBzbyBkbyBub3QgY2htb2QuCi0JICAgICAgaWYgdGVzdCAieCRidWlsZCIgPSAieCRob3N0IiA7IHRoZW4KLQkJJGN3cmFwcGVyIC0tbHQtZHVtcC1zY3JpcHQgPiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKLQkgICAgICBlbHNlCi0JCWZ1bmNfZW1pdF93cmFwcGVyIG5vID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0Ci0JICAgICAgZmkKLQkgICAgfQotCSAgOzsKLQkgICogKQotCSAgICAkUk0gJG91dHB1dAotCSAgICB0cmFwICIkUk0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKLQotCSAgICBmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRvdXRwdXQKLQkgICAgY2htb2QgK3ggJG91dHB1dAotCSAgOzsKLQllc2FjCi0gICAgICB9Ci0gICAgICBleGl0ICRFWElUX1NVQ0NFU1MKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCi0gICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgotCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUgJHN5bWZpbGVvYmoiCi0JYWRkbGlicz0iJGNvbnZlbmllbmNlIgotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotICAgICAgZWxzZQotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCi0JICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgotCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JZWxzZQotCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCi0JICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgJiYgdGVzdCAtZiAiJHN5bWZpbGVvYmoiOyB0aGVuCi0JICAgIG9sZG9ianM9IiRvbGRvYmpzICRzeW1maWxlb2JqIgotCSAgZmkKLQlmaQotCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkYWRkbGlicyI7IHRoZW4KLQlnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCWdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgotCi0JZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKLQlvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcwotICAgICAgZWxzZQotCi0JIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCi0JaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCi0JICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0KLQkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCi0JICBvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKLQlmaQotCi0JIyBQT1NJWCBkZW1hbmRzIG5vIHBhdGhzIHRvIGJlIGVuY29kZWQgaW4gYXJjaGl2ZXMuICBXZSBoYXZlCi0JIyB0byBhdm9pZCBjcmVhdGluZyBhcmNoaXZlcyB3aXRoIGR1cGxpY2F0ZSBiYXNlbmFtZXMgaWYgd2UKLQkjIG1pZ2h0IGhhdmUgdG8gZXh0cmFjdCB0aGVtIGFmdGVyd2FyZHMsIGUuZy4sIHdoZW4gY3JlYXRpbmcgYQotCSMgc3RhdGljIGFyY2hpdmUgb3V0IG9mIGEgY29udmVuaWVuY2UgbGlicmFyeSwgb3Igd2hlbiBsaW5raW5nCi0JIyB0aGUgZW50aXJldHkgb2YgYSBsaWJ0b29sIGFyY2hpdmUgaW50byBhbm90aGVyIChjdXJyZW50bHkKLQkjIG5vdCBzdXBwb3J0ZWQgYnkgbGlidG9vbCkuCi0JaWYgKGZvciBvYmogaW4gJG9sZG9ianMKLQkgICAgZG8KLQkgICAgICBmdW5jX2Jhc2VuYW1lICIkb2JqIgotCSAgICAgICRFQ0hPICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCi0JICAgIGRvbmUgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgotCSAgOgotCWVsc2UKLQkgICRFQ0hPICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCi0JICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgotCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCi0JICBmdW5jX21rZGlyX3AgIiRnZW50b3AiCi0JICBzYXZlX29sZG9ianM9JG9sZG9ianMKLQkgIG9sZG9ianM9Ci0JICBjb3VudGVyPTEKLQkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcwotCSAgZG8KLQkgICAgZnVuY19iYXNlbmFtZSAiJG9iaiIKLQkgICAgb2JqYmFzZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCSAgICBjYXNlICIgJG9sZG9ianMgIiBpbgotCSAgICAiICIpIG9sZG9ianM9JG9iaiA7OwotCSAgICAqW1wgL10iJG9iamJhc2UgIiopCi0JICAgICAgd2hpbGUgOjsgZG8KLQkJIyBNYWtlIHN1cmUgd2UgZG9uJ3QgcGljayBhbiBhbHRlcm5hdGUgbmFtZSB0aGF0IGFsc28KLQkJIyBvdmVybGFwcy4KLQkJbmV3b2JqPWx0JGNvdW50ZXItJG9iamJhc2UKLQkJZnVuY19hcml0aCAkY291bnRlciArIDEKLQkJY291bnRlcj0kZnVuY19hcml0aF9yZXN1bHQKLQkJY2FzZSAiICRvbGRvYmpzICIgaW4KLQkJKltcIC9dIiRuZXdvYmogIiopIDs7Ci0JCSopIGlmIHRlc3QgISAtZiAiJGdlbnRvcC8kbmV3b2JqIjsgdGhlbiBicmVhazsgZmkgOzsKLQkJZXNhYwotCSAgICAgIGRvbmUKLQkgICAgICBmdW5jX3Nob3dfZXZhbCAibG4gJG9iaiAkZ2VudG9wLyRuZXdvYmogfHwgY3AgJG9iaiAkZ2VudG9wLyRuZXdvYmoiCi0JICAgICAgb2xkb2Jqcz0iJG9sZG9ianMgJGdlbnRvcC8kbmV3b2JqIgotCSAgICAgIDs7Ci0JICAgICopIG9sZG9ianM9IiRvbGRvYmpzICRvYmoiIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKLQotCWZ1bmNfbGVuICIgJGNtZHMiCi0JbGVuPSRmdW5jX2xlbl9yZXN1bHQKLQlpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KLQkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKLQllbHNlCi0JICAjIHRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBpbiBwYXJ0cwotCSAgZnVuY192ZXJib3NlICJ1c2luZyBwaWVjZXdpc2UgYXJjaGl2ZSBsaW5raW5nLi4uIgotCSAgc2F2ZV9SQU5MSUI9JFJBTkxJQgotCSAgUkFOTElCPToKLQkgIG9iamxpc3Q9Ci0JICBjb25jYXRfY21kcz0KLQkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcwotCSAgb2xkb2Jqcz0KLQkgICMgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IG9mIGZpbmRpbmcgdGhlIGxhc3Qgb2JqZWN0IGluIHRoZSBsaXN0PwotCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCi0JICBkbwotCSAgICBsYXN0X29sZG9iaj0kb2JqCi0JICBkb25lCi0JICBldmFsIHRlc3RfY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKLQkgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKLQkgIGxlbjA9JGZ1bmNfbGVuX3Jlc3VsdAotCSAgbGVuPSRsZW4wCi0JICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKLQkgIGRvCi0JICAgIGZ1bmNfbGVuICIgJG9iaiIKLQkgICAgZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAotCSAgICBsZW49JGZ1bmNfYXJpdGhfcmVzdWx0Ci0JICAgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgotCSAgICBpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiI7IHRoZW4KLQkgICAgICA6Ci0JICAgIGVsc2UKLQkgICAgICAjIHRoZSBhYm92ZSBjb21tYW5kIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBpdCBnZXRzIHRvbyBsb25nCi0JICAgICAgb2xkb2Jqcz0kb2JqbGlzdAotCSAgICAgIGlmIHRlc3QgIiRvYmoiID0gIiRsYXN0X29sZG9iaiIgOyB0aGVuCi0JCVJBTkxJQj0kc2F2ZV9SQU5MSUIKLQkgICAgICBmaQotCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgotCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kb2xkX2FyY2hpdmVfY21kc1wiCi0JICAgICAgb2JqbGlzdD0KLQkgICAgICBsZW49JGxlbjAKLQkgICAgZmkKLQkgIGRvbmUKLQkgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKLQkgIG9sZG9ianM9JG9iamxpc3QKLQkgIGlmIHRlc3QgIlgkb2xkb2JqcyIgPSAiWCIgOyB0aGVuCi0JICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHNcIgotCSAgZWxzZQotCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzflwkb2xkX2FyY2hpdmVfY21kc1wiCi0JICBmaQotCWZpCi0gICAgICBmaQotICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRjbWRzIiAnZXhpdCAkPycKLSAgICBkb25lCi0KLSAgICB0ZXN0IC1uICIkZ2VuZXJhdGVkIiAmJiBcCi0gICAgICBmdW5jX3Nob3dfZXZhbCAiJHtSTX1yJGdlbmVyYXRlZCIKLQotICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgotICAgIGNhc2UgJG91dHB1dCBpbgotICAgICoubGEpCi0gICAgICBvbGRfbGlicmFyeT0KLSAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCi0gICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgICMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKLSAgICAgIGZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbwotCWlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCi0JICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgJGx0X3Vuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKLQllbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KLQkgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKLQllbHNlCi0JICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgotCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgotCWZpCi0gICAgICBkb25lCi0gICAgICAjIFF1b3RlIHRoZSBsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgotICAgICAgcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLW1vZGU9cmVsaW5rICRsaWJ0b29sX2FyZ3MgQGluc3RfcHJlZml4X2RpckApIgotICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzIDsgdGhlbgotCXJlbGlua19jb21tYW5kPQotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCi0gICAgICAkb3B0X2RyeV9ydW4gfHwgewotCWZvciBpbnN0YWxsZWQgaW4gbm8geWVzOyBkbwotCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfbGliZGlyIjsgdGhlbgotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICAgIG91dHB1dD0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQotCSAgICAjIFJlcGxhY2UgYWxsIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzIHdpdGggdGhlIGluc3RhbGxlZCBvbmVzCi0JICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KLQkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICAgIGNhc2UgJGRlcGxpYiBpbgotCSAgICAgICoubGEpCi0JCWZ1bmNfYmFzZW5hbWUgIiRkZXBsaWIiCi0JCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKLQkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAotCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgotCQluZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGxpYmRpci8kbmFtZSIKLQkJOzsKLQkgICAgICAqKSBuZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGRlcGxpYiIgOzsKLQkgICAgICBlc2FjCi0JICAgIGRvbmUKLQkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgotCSAgICBuZXdkbGZpbGVzPQotCi0JICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCi0JICAgICAgY2FzZSAkbGliIGluCi0JICAgICAgKi5sYSkKLQkgICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRsaWIiCi0JCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKLQkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKLQkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAotCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgotCQluZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliZGlyLyRuYW1lIgotCQk7OwotCSAgICAgICopIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiIDs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgotCSAgICBuZXdkbHByZWZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbwotCSAgICAgIGNhc2UgJGxpYiBpbgotCSAgICAgICoubGEpCi0JCSMgT25seSBwYXNzIHByZW9wZW5lZCBmaWxlcyB0byB0aGUgcHNldWRvLWFyY2hpdmUgKGZvcgotCQkjIGV2ZW50dWFsIGxpbmtpbmcgd2l0aCB0aGUgYXBwLiB0aGF0IGxpbmtzIGl0KSBpZiB3ZQotCQkjIGRpZG4ndCBhbHJlYWR5IGxpbmsgdGhlIHByZW9wZW5lZCBvYmplY3RzIGRpcmVjdGx5IGludG8KLQkJIyB0aGUgbGlicmFyeToKLQkJZnVuY19iYXNlbmFtZSAiJGxpYiIKLQkJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotCQlldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAotCQl0ZXN0IC16ICIkbGliZGlyIiAmJiBcCi0JCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCi0JCW5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRsaWJkaXIvJG5hbWUiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBkb25lCi0JICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotCSAgZWxzZQotCSAgICBuZXdkbGZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbwotCSAgICAgIGNhc2UgJGxpYiBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKLQkJKikgYWJzPWBwd2RgIi8kbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkYWJzIgotCSAgICBkb25lCi0JICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgotCSAgICBuZXdkbHByZWZpbGVzPQotCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbwotCSAgICAgIGNhc2UgJGxpYiBpbgotCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKLQkJKikgYWJzPWBwd2RgIi8kbGliIiA7OwotCSAgICAgIGVzYWMKLQkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkYWJzIgotCSAgICBkb25lCi0JICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgotCSAgZmkKLQkgICRSTSAkb3V0cHV0Ci0JICAjIHBsYWNlIGRsbmFtZSBpbiBjb3JyZWN0IHBvc2l0aW9uIGZvciBjeWd3aW4KLQkgIHRkbG5hbWU9JGRsbmFtZQotCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCi0JICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCkgdGRsbmFtZT0uLi9iaW4vJGRsbmFtZSA7OwotCSAgZXNhYwotCSAgJEVDSE8gPiAkb3V0cHV0ICJcCi0jICRvdXRwdXRuYW1lIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCi0jCi0jIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKLSMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgotCi0jIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KLWRsbmFtZT0nJHRkbG5hbWUnCi0KLSMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgotbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCi0KLSMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgotb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKLQotIyBMaW5rZXIgZmxhZ3MgdGhhdCBjYW4gbm90IGdvIGluIGRlcGVuZGVuY3lfbGlicy4KLWluaGVyaXRlZF9saW5rZXJfZmxhZ3M9JyRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncycKLQotIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCi1kZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCi0KLSMgTmFtZXMgb2YgYWRkaXRpb25hbCB3ZWFrIGxpYnJhcmllcyBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkKLXdlYWtfbGlicmFyeV9uYW1lcz0nJHdlYWtfbGlicycKLQotIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciAkbGlibmFtZS4KLWN1cnJlbnQ9JGN1cnJlbnQKLWFnZT0kYWdlCi1yZXZpc2lvbj0kcmV2aXNpb24KLQotIyBJcyB0aGlzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGxpYnJhcnk/Ci1pbnN0YWxsZWQ9JGluc3RhbGxlZAotCi0jIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPwotc2hvdWxkbm90bGluaz0kbW9kdWxlCi0KLSMgRmlsZXMgdG8gZGxvcGVuL2RscHJlb3BlbgotZGxvcGVuPSckZGxmaWxlcycKLWRscHJlb3Blbj0nJGRscHJlZmlsZXMnCi0KLSMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKLWxpYmRpcj0nJGluc3RhbGxfbGliZGlyJyIKLQkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0gbm8gJiYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IHllczsgdGhlbgotCSAgICAkRUNITyA+PiAkb3V0cHV0ICJcCi1yZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiIgotCSAgZmkKLQlkb25lCi0gICAgICB9Ci0KLSAgICAgICMgRG8gYSBzeW1ib2xpYyBsaW5rIHNvIHRoYXQgdGhlIGxpYnRvb2wgYXJjaGl2ZSBjYW4gYmUgZm91bmQgaW4KLSAgICAgICMgTERfTElCUkFSWV9QQVRIIGJlZm9yZSB0aGUgcHJvZ3JhbSBpcyBpbnN0YWxsZWQuCi0gICAgICBmdW5jX3Nob3dfZXZhbCAnKCBjZCAiJG91dHB1dF9vYmpkaXIiICYmICRSTSAiJG91dHB1dG5hbWUiICYmICRMTl9TICIuLi8kb3V0cHV0bmFtZSIgIiRvdXRwdXRuYW1lIiApJyAnZXhpdCAkPycKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGV4aXQgJEVYSVRfU1VDQ0VTUwotfQotCi17IHRlc3QgIiRtb2RlIiA9IGxpbmsgfHwgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB9ICYmCi0gICAgZnVuY19tb2RlX2xpbmsgJHsxKyIkQCJ9Ci0KLQotIyBmdW5jX21vZGVfdW5pbnN0YWxsIGFyZy4uLgotZnVuY19tb2RlX3VuaW5zdGFsbCAoKQotewotICAgICRvcHRfZGVidWcKLSAgICBSTT0iJG5vbm9wdCIKLSAgICBmaWxlcz0KLSAgICBybWZvcmNlPQotICAgIGV4aXRfc3RhdHVzPTAKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICRhcmcgaW4KLSAgICAgIC1mKSBSTT0iJFJNICRhcmciOyBybWZvcmNlPXllcyA7OwotICAgICAgLSopIFJNPSIkUk0gJGFyZyIgOzsKLSAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICB0ZXN0IC16ICIkUk0iICYmIFwKLSAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBSTSBwcm9ncmFtIgotCi0gICAgcm1kaXJzPQotCi0gICAgb3JpZ29iamRpcj0iJG9iamRpciIKLSAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0gICAgICBmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKLSAgICAgIGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCi0gICAgICBpZiB0ZXN0ICJYJGRpciIgPSBYLjsgdGhlbgotCW9iamRpcj0iJG9yaWdvYmpkaXIiCi0gICAgICBlbHNlCi0Jb2JqZGlyPSIkZGlyLyRvcmlnb2JqZGlyIgotICAgICAgZmkKLSAgICAgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgotICAgICAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgotICAgICAgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsICYmIG9iamRpcj0iJGRpciIKLQotICAgICAgIyBSZW1lbWJlciBvYmpkaXIgZm9yIHJlbW92YWwgbGF0ZXIsIGJlaW5nIGNhcmVmdWwgdG8gYXZvaWQgZHVwbGljYXRlcwotICAgICAgaWYgdGVzdCAiJG1vZGUiID0gY2xlYW47IHRoZW4KLQljYXNlICIgJHJtZGlycyAiIGluCi0JICAqIiAkb2JqZGlyICIqKSA7OwotCSAgKikgcm1kaXJzPSIkcm1kaXJzICRvYmpkaXIiIDs7Ci0JZXNhYwotICAgICAgZmkKLQotICAgICAgIyBEb24ndCBlcnJvciBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBybSAtZiB3YXMgdXNlZC4KLSAgICAgIGlmIHsgdGVzdCAtTCAiJGZpbGUiOyB9ID4vZGV2L251bGwgMj4mMSB8fAotCSB7IHRlc3QgLWggIiRmaWxlIjsgfSA+L2Rldi9udWxsIDI+JjEgfHwKLQkgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCi0JOgotICAgICAgZWxpZiB0ZXN0IC1kICIkZmlsZSI7IHRoZW4KLQlleGl0X3N0YXR1cz0xCi0JY29udGludWUKLSAgICAgIGVsaWYgdGVzdCAiJHJtZm9yY2UiID0geWVzOyB0aGVuCi0JY29udGludWUKLSAgICAgIGZpCi0KLSAgICAgIHJtZmlsZXM9IiRmaWxlIgotCi0gICAgICBjYXNlICRuYW1lIGluCi0gICAgICAqLmxhKQotCSMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KLQlpZiBmdW5jX2xhbGliX3AgIiRmaWxlIjsgdGhlbgotCSAgZnVuY19zb3VyY2UgJGRpci8kbmFtZQotCi0JICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgotCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG4iCi0JICBkb25lCi0JICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG9sZF9saWJyYXJ5IgotCi0JICBjYXNlICIkbW9kZSIgaW4KLQkgIGNsZWFuKQotCSAgICBjYXNlICIgICRsaWJyYXJ5X25hbWVzICIgaW4KLQkgICAgIyAiICAiIGluIHRoZSBiZWdpbm5pbmcgY2F0Y2hlcyBlbXB0eSAkZGxuYW1lCi0JICAgICoiICRkbG5hbWUgIiopIDs7Ci0JICAgICopIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJGRsbmFtZSIgOzsKLQkgICAgZXNhYwotCSAgICB0ZXN0IC1uICIkbGliZGlyIiAmJiBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuYW1lICRvYmpkaXIvJHtuYW1lfWkiCi0JICAgIDs7Ci0JICB1bmluc3RhbGwpCi0JICAgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgotCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcG9zdHVuaW5zdGFsbF9jbWRzIiAndGVzdCAiJHJtZm9yY2UiID0geWVzIHx8IGV4aXRfc3RhdHVzPTEnCi0JICAgIGZpCi0KLQkgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KLQkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMiICd0ZXN0ICIkcm1mb3JjZSIgPSB5ZXMgfHwgZXhpdF9zdGF0dXM9MScKLQkgICAgZmkKLQkgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCi0JICAgIDs7Ci0JICBlc2FjCi0JZmkKLQk7OwotCi0gICAgICAqLmxvKQotCSMgUG9zc2libHkgYSBsaWJ0b29sIG9iamVjdCwgc28gdmVyaWZ5IGl0LgotCWlmIGZ1bmNfbGFsaWJfcCAiJGZpbGUiOyB0aGVuCi0KLQkgICMgUmVhZCB0aGUgLmxvIGZpbGUKLQkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKLQotCSAgIyBBZGQgUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCi0JICBpZiB0ZXN0IC1uICIkcGljX29iamVjdCIgJiYKLQkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJHBpY19vYmplY3QiCi0JICBmaQotCi0JICAjIEFkZCBub24tUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCi0JICBpZiB0ZXN0IC1uICIkbm9uX3BpY19vYmplY3QiICYmCi0JICAgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kbm9uX3BpY19vYmplY3QiCi0JICBmaQotCWZpCi0JOzsKLQotICAgICAgKikKLQlpZiB0ZXN0ICIkbW9kZSIgPSBjbGVhbiA7IHRoZW4KLQkgIG5vZXhlbmFtZT0kbmFtZQotCSAgY2FzZSAkZmlsZSBpbgotCSAgKi5leGUpCi0JICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCi0JICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRuYW1lIgotCSAgICBub2V4ZW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAotCSAgICAjICRmaWxlIHdpdGggLmV4ZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHJtZmlsZXMsCi0JICAgICMgYWRkICRmaWxlIHdpdGhvdXQgLmV4ZQotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZmlsZSIKLQkgICAgOzsKLQkgIGVzYWMKLQkgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIGEgbGlidG9vbCBwcm9ncmFtLgotCSAgaWYgZnVuY19sdHdyYXBwZXJfcCAiJGZpbGUiOyB0aGVuCi0JICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCi0JICAgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZSAiJGZpbGUiCi0JICAgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICAgICAgZnVuY19zb3VyY2UgJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0Ci0JICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0IgotCSAgICBlbHNlCi0JICAgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICAgICAgZnVuY19zb3VyY2UgJGRpci8kbm9leGVuYW1lCi0JICAgIGZpCi0KLQkgICAgIyBub3RlICRuYW1lIHN0aWxsIGNvbnRhaW5zIC5leGUgaWYgaXQgd2FzIGluICRmaWxlIG9yaWdpbmFsbHkKLQkgICAgIyBhcyBkb2VzIHRoZSB2ZXJzaW9uIG9mICRmaWxlIHRoYXQgd2FzIGFkZGVkIGludG8gJHJtZmlsZXMKLQkgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1TLiR7b2JqZXh0fSIKLQkgICAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvbHQtJG5hbWUiCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIlgkbm9leGVuYW1lIiAhPSAiWCRuYW1lIiA7IHRoZW4KLQkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSR7bm9leGVuYW1lfS5jIgotCSAgICBmaQotCSAgZmkKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICBmdW5jX3Nob3dfZXZhbCAiJFJNICRybWZpbGVzIiAnZXhpdF9zdGF0dXM9MScKLSAgICBkb25lCi0gICAgb2JqZGlyPSIkb3JpZ29iamRpciIKLQotICAgICMgVHJ5IHRvIHJlbW92ZSB0aGUgJHtvYmpkaXJ9cyBpbiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgd2UgZGVsZXRlZCBmaWxlcwotICAgIGZvciBkaXIgaW4gJHJtZGlyczsgZG8KLSAgICAgIGlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCi0JZnVuY19zaG93X2V2YWwgInJtZGlyICRkaXIgPi9kZXYvbnVsbCAyPiYxIgotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICBleGl0ICRleGl0X3N0YXR1cwotfQotCi17IHRlc3QgIiRtb2RlIiA9IHVuaW5zdGFsbCB8fCB0ZXN0ICIkbW9kZSIgPSBjbGVhbjsgfSAmJgotICAgIGZ1bmNfbW9kZV91bmluc3RhbGwgJHsxKyIkQCJ9Ci0KLXRlc3QgLXogIiRtb2RlIiAmJiB7Ci0gIGhlbHA9IiRnZW5lcmljX2hlbHAiCi0gIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIE1PREUiCi19Ci0KLXRlc3QgLXogIiRleGVjX2NtZCIgJiYgXAotICBmdW5jX2ZhdGFsX2hlbHAgImludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciCi0KLWlmIHRlc3QgLW4gIiRleGVjX2NtZCI7IHRoZW4KLSAgZXZhbCBleGVjICIkZXhlY19jbWQiCi0gIGV4aXQgJEVYSVRfRkFJTFVSRQotZmkKLQotZXhpdCAkZXhpdF9zdGF0dXMKLQotCi0jIFRoZSBUQUdzIGJlbG93IGFyZSBkZWZpbmVkIHN1Y2ggdGhhdCB3ZSBuZXZlciBnZXQgaW50byBhIHNpdHVhdGlvbgotIyBpbiB3aGljaCB3ZSBkaXNhYmxlIGJvdGgga2luZHMgb2YgbGlicmFyaWVzLiAgR2l2ZW4gY29uZmxpY3RpbmcKLSMgY2hvaWNlcywgd2UgZ28gZm9yIGEgc3RhdGljIGxpYnJhcnksIHRoYXQgaXMgdGhlIG1vc3QgcG9ydGFibGUsCi0jIHNpbmNlIHdlIGNhbid0IHRlbGwgd2hldGhlciBzaGFyZWQgbGlicmFyaWVzIHdlcmUgZGlzYWJsZWQgYmVjYXVzZQotIyB0aGUgdXNlciBhc2tlZCBmb3IgdGhhdCBvciBiZWNhdXNlIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQKLSMgdGhlbS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBvbiBBSVgsIGJlY2F1c2Ugd2UgZG9uJ3QKLSMgc3VwcG9ydCBoYXZpbmcgYm90aCBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJpZXMgZW5hYmxlZCBhdCB0aGUgc2FtZQotIyB0aW1lIG9uIHRoYXQgcGxhdGZvcm0sIHNvIHdlIGRlZmF1bHQgdG8gYSBzaGFyZWQtb25seSBjb25maWd1cmF0aW9uLgotIyBJZiBhIGRpc2FibGUtc2hhcmVkIHRhZyBpcyBnaXZlbiwgd2UnbGwgZmFsbGJhY2sgdG8gYSBzdGF0aWMtb25seQotIyBjb25maWd1cmF0aW9uLiAgQnV0IHdlJ2xsIG5ldmVyIGdvIGZyb20gc3RhdGljLW9ubHkgdG8gc2hhcmVkLW9ubHkuCi0KLSMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKLWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotYnVpbGRfb2xkX2xpYnM9eWVzCi0jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAotCi0jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc3RhdGljCi1idWlsZF9vbGRfbGlicz1gY2FzZSAkYnVpbGRfbGlidG9vbF9saWJzIGluIHllcykgZWNobyBubzs7ICopIGVjaG8geWVzOzsgZXNhY2AKLSMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc3RhdGljCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOnNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjoyCi0jIEVuZDoKLSMgdmk6c3c9MgotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9taXNzaW5nIGIvbGlicy9saWJwbmcvbWlzc2luZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4ZmY3MC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9taXNzaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCi0KLXNjcmlwdHZlcnNpb249MjAwNi0wNS0xMC4yMwotCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBPcmlnaW5hbGx5IGJ5IEZyYW4sY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotIyAwMjExMC0xMzAxLCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgZXhpdCAxCi1maQotCi1ydW49Ogotc2VkX291dHB1dD0ncy8uKiAtLW91dHB1dFsgPV1cKFteIF0qXCkuKi9cMS9wJwotc2VkX21pbnVzbz0ncy8uKiAtbyBcKFteIF0qXCkuKi9cMS9wJwotCi0jIEluIHRoZSBjYXNlcyB3aGVyZSB0aGlzIG1hdHRlcnMsIGBtaXNzaW5nJyBpcyBiZWluZyBydW4gaW4gdGhlCi0jIHNyY2RpciBhbHJlYWR5LgotaWYgdGVzdCAtZiBjb25maWd1cmUuYWM7IHRoZW4KLSAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5hYwotZWxzZQotICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmluCi1maQotCi1tc2c9Im1pc3Npbmcgb24geW91ciBzeXN0ZW0iCi0KLWNhc2UgJDEgaW4KLS0tcnVuKQotICAjIFRyeSB0byBydW4gcmVxdWVzdGVkIHByb2dyYW0sIGFuZCBqdXN0IGV4aXQgaWYgaXQgc3VjY2VlZHMuCi0gIHJ1bj0KLSAgc2hpZnQKLSAgIiRAIiAmJiBleGl0IDAKLSAgIyBFeGl0IGNvZGUgNjMgbWVhbnMgdmVyc2lvbiBtaXNtYXRjaC4gIFRoaXMgb2Z0ZW4gaGFwcGVucwotICAjIHdoZW4gdGhlIHVzZXIgdHJ5IHRvIHVzZSBhbiBhbmNpZW50IHZlcnNpb24gb2YgYSB0b29sIG9uCi0gICMgYSBmaWxlIHRoYXQgcmVxdWlyZXMgYSBtaW5pbXVtIHZlcnNpb24uICBJbiB0aGlzIGNhc2Ugd2UKLSAgIyB3ZSBzaG91bGQgcHJvY2VlZCBoYXMgaWYgdGhlIHByb2dyYW0gaGFkIGJlZW4gYWJzZW50LCBvcgotICAjIGlmIC0tcnVuIGhhZG4ndCBiZWVuIHBhc3NlZC4KLSAgaWYgdGVzdCAkPyA9IDYzOyB0aGVuCi0gICAgcnVuPToKLSAgICBtc2c9InByb2JhYmx5IHRvbyBvbGQiCi0gIGZpCi0gIDs7Ci0KLSAgLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQotICAgIGVjaG8gIlwKLSQwIFtPUFRJT05dLi4uIFBST0dSQU0gW0FSR1VNRU5UXS4uLgotCi1IYW5kbGUgXGBQUk9HUkFNIFtBUkdVTUVOVF0uLi4nIGZvciB3aGVuIFBST0dSQU0gaXMgbWlzc2luZywgb3IgcmV0dXJuIGFuCi1lcnJvciBzdGF0dXMgaWYgdGhlcmUgaXMgbm8ga25vd24gaGFuZGxpbmcgZm9yIFBST0dSQU0uCi0KLU9wdGlvbnM6Ci0gIC1oLCAtLWhlbHAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAtdiwgLS12ZXJzaW9uICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgLS1ydW4gICAgICAgICAgIHRyeSB0byBydW4gdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCBlbXVsYXRlIGl0IGlmIGl0IGZhaWxzCi0KLVN1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKLSAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JwotICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKLSAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKLSAgYXV0b200dGUgICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZSwgb3IgY3JlYXRlIGEgc3R1YiBvbmUKLSAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcwotICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0gIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCi0gIGhlbHAybWFuICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKLSAgbGV4ICAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKLSAgbWFrZWluZm8gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQotICB0YXIgICAgICAgICAgdHJ5IHRhciwgZ251dGFyLCBndGFyLCB0aGVuIHRhciB3aXRob3V0IG5vbi1wb3J0YWJsZSBmbGFncwotICB5YWNjICAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0KLVNlbmQgYnVnIHJlcG9ydHMgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4iCi0gICAgZXhpdCAkPwotICAgIDs7Ci0KLSAgLXZ8LS12fC0tdmV8LS12ZXJ8LS12ZXJzfC0tdmVyc2l8LS12ZXJzaW98LS12ZXJzaW9uKQotICAgIGVjaG8gIm1pc3NpbmcgJHNjcmlwdHZlcnNpb24gKEdOVSBBdXRvbWFrZSkiCi0gICAgZXhpdCAkPwotICAgIDs7Ci0KLSAgLSopCi0gICAgZWNobyAxPiYyICIkMDogVW5rbm93biBcYCQxJyBvcHRpb24iCi0gICAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICAgIGV4aXQgMQotICAgIDs7Ci0KLWVzYWMKLQotIyBOb3cgZXhpdCBpZiB3ZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLiAgQWxzbyBleGl0IG5vdyBpZiB3ZQotIyBkb24ndCBoYXZlIGl0IGFuZCAtLXZlcnNpb24gd2FzIHBhc3NlZCAobW9zdCBsaWtlbHkgdG8gZGV0ZWN0Ci0jIHRoZSBwcm9ncmFtKS4KLWNhc2UgJDEgaW4KLSAgbGV4fHlhY2MpCi0gICAgIyBOb3QgR05VIHByb2dyYW1zLCB0aGV5IGRvbid0IGhhdmUgLS12ZXJzaW9uLgotICAgIDs7Ci0KLSAgdGFyKQotICAgIGlmIHRlc3QgLW4gIiRydW4iOyB0aGVuCi0gICAgICAgZWNobyAxPiYyICJFUlJPUjogXGB0YXInIHJlcXVpcmVzIC0tcnVuIgotICAgICAgIGV4aXQgMQotICAgIGVsaWYgdGVzdCAieCQyIiA9ICJ4LS12ZXJzaW9uIiB8fCB0ZXN0ICJ4JDIiID0gIngtLWhlbHAiOyB0aGVuCi0gICAgICAgZXhpdCAxCi0gICAgZmkKLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KLSAgICAgICBleGl0IDEKLSAgICBlbGlmIHRlc3QgIngkMiIgPSAieC0tdmVyc2lvbiIgfHwgdGVzdCAieCQyIiA9ICJ4LS1oZWxwIjsgdGhlbgotICAgICAgICMgQ291bGQgbm90IHJ1biAtLXZlcnNpb24gb3IgLS1oZWxwLiAgVGhpcyBpcyBwcm9iYWJseSBzb21lb25lCi0gICAgICAgIyBydW5uaW5nIGAkVE9PTCAtLXZlcnNpb24nIG9yIGAkVE9PTCAtLWhlbHAnIHRvIGNoZWNrIHdoZXRoZXIKLSAgICAgICAjICRUT09MIGV4aXN0cyBhbmQgbm90IGtub3dpbmcgJFRPT0wgdXNlcyBtaXNzaW5nLgotICAgICAgIGV4aXQgMQotICAgIGZpCi0gICAgOzsKLWVzYWMKLQotIyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgb3IgZmFpbHMgdG8gcnVuIChwb3NzaWJseSBhbiBvdXRkYXRlZCB2ZXJzaW9uKSwKLSMgdHJ5IHRvIGVtdWxhdGUgaXQuCi1jYXNlICQxIGluCi0gIGFjbG9jYWwqKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tCi0gICAgICAgICBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggYWNsb2NhbC5tNAotICAgIDs7Ci0KLSAgYXV0b2NvbmYpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQotICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKLSAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCi0gICAgdG91Y2ggY29uZmlndXJlCi0gICAgOzsKLQotICBhdXRvaGVhZGVyKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgXGBhY2NvbmZpZy5oJyBvciBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudAotICAgICAgICAgdG8gaW5zdGFsbCB0aGUgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbQotICAgICAgICAgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgZmlsZXM9YHNlZCAtbiAncy9eWyBdKkFbQ01dX0NPTkZJR19IRUFERVIoXChbXildKlwpKS4qL1wxL3AnICR7Y29uZmlndXJlX2FjfWAKLSAgICB0ZXN0IC16ICIkZmlsZXMiICYmIGZpbGVzPSJjb25maWcuaCIKLSAgICB0b3VjaF9maWxlcz0KLSAgICBmb3IgZiBpbiAkZmlsZXM7IGRvCi0gICAgICBjYXNlICRmIGluCi0gICAgICAqOiopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgImBlY2hvICIkZiIgfAotCQkJCSAgICAgICBzZWQgLWUgJ3MvXlteOl0qOi8vJyAtZSAncy86LiovLydgOzsKLSAgICAgICopIHRvdWNoX2ZpbGVzPSIkdG91Y2hfZmlsZXMgJGYuaW4iOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gICAgdG91Y2ggJHRvdWNoX2ZpbGVzCi0gICAgOzsKLQotICBhdXRvbWFrZSopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4KLSAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgotICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8Ci0JICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKLQkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKLSAgICA7OwotCi0gIGF1dG9tNHRlKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbmVlZGVkLCBidXQgaXMgJG1zZy4KLSAgICAgICAgIFlvdSBtaWdodCBoYXZlIG1vZGlmaWVkIHNvbWUgZmlsZXMgd2l0aG91dCBoYXZpbmcgdGhlCi0gICAgICAgICBwcm9wZXIgdG9vbHMgZm9yIGZ1cnRoZXIgaGFuZGxpbmcgdGhlbS4KLSAgICAgICAgIFlvdSBjYW4gZ2V0IFxgJDEnIGFzIHBhcnQgb2YgXGBBdXRvY29uZicgZnJvbSBhbnkgR05VCi0gICAgICAgICBhcmNoaXZlIHNpdGUuIgotCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX291dHB1dCJgCi0gICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9taW51c28iYAotICAgIGlmIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgotCXRvdWNoICRmaWxlCi0gICAgZWxzZQotCXRlc3QgLXogIiRmaWxlIiB8fCBleGVjID4kZmlsZQotCWVjaG8gIiMhIC9iaW4vc2giCi0JZWNobyAiIyBDcmVhdGVkIGJ5IEdOVSBBdXRvbWFrZSBtaXNzaW5nIGFzIGEgcmVwbGFjZW1lbnQgb2YiCi0JZWNobyAiIyAgJCAkQCIKLQllY2hvICJleGl0IDAiCi0JY2htb2QgK3ggJGZpbGUKLQlleGl0IDEKLSAgICBmaQotICAgIDs7Ci0KLSAgYmlzb258eWFjYykKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAueScgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBCaXNvbicgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBCaXNvbicgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgcm0gLWYgeS50YWIuYyB5LnRhYi5oCi0gICAgaWYgdGVzdCAkIyAtbmUgMTsgdGhlbgotICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKLQljYXNlICRMQVNUQVJHIGluCi0JKi55KQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAotCSAgICBpZiB0ZXN0IC1mICIkU1JDRklMRSI7IHRoZW4KLQkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIHkudGFiLmMKLQkgICAgZmkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2gvJ2AKLQkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5oCi0JICAgIGZpCi0JICA7OwotCWVzYWMKLSAgICBmaQotICAgIGlmIHRlc3QgISAtZiB5LnRhYi5oOyB0aGVuCi0JZWNobyA+eS50YWIuaAotICAgIGZpCi0gICAgaWYgdGVzdCAhIC1mIHkudGFiLmM7IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPnkudGFiLmMKLSAgICBmaQotICAgIDs7Ci0KLSAgbGV4fGZsZXgpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQotICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAotICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBybSAtZiBsZXgueXkuYwotICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAkTEFTVEFSRyBpbgotCSoubCkKLQkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKLQkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYwotCSAgICBmaQotCSAgOzsKLQllc2FjCi0gICAgZmkKLSAgICBpZiB0ZXN0ICEgLWYgbGV4Lnl5LmM7IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPmxleC55eS5jCi0gICAgZmkKLSAgICA7OwotCi0gIGhlbHAybWFuKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0JIHlvdSBtb2RpZmllZCBhIGRlcGVuZGVuY3kgb2YgYSBtYW51YWwgcGFnZS4gIFlvdSBtYXkgbmVlZCB0aGUKLQkgXGBIZWxwMm1hbicgcGFja2FnZSBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlCi0JIGVmZmVjdC4gIFlvdSBjYW4gZ2V0IFxgSGVscDJtYW4nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotCi0gICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX291dHB1dCJgCi0gICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9taW51c28iYAotICAgIGlmIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgotCXRvdWNoICRmaWxlCi0gICAgZWxzZQotCXRlc3QgLXogIiRmaWxlIiB8fCBleGVjID4kZmlsZQotCWVjaG8gIi5hYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UiCi0JZXhpdCAxCi0gICAgZmkKLSAgICA7OwotCi0gIG1ha2VpbmZvKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC50ZXhpJyBvciBcYC50ZXhpbmZvJyBmaWxlLCBvciBhbnkgb3RoZXIgZmlsZQotICAgICAgICAgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiAgVGhlIHNwdXJpb3VzCi0gICAgICAgICBjYWxsIG1pZ2h0IGFsc28gYmUgdGhlIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgYnVnZ3kgXGBtYWtlJyAoQUlYLAotICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCi0gICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgICMgVGhlIGZpbGUgdG8gdG91Y2ggaXMgdGhhdCBzcGVjaWZpZWQgd2l0aCAtbyAuLi4KLSAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKLSAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCi0gICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCi0gICAgICAjIC4uLiBvciBpdCBpcyB0aGUgb25lIHNwZWNpZmllZCB3aXRoIEBzZXRmaWxlbmFtZSAuLi4KLSAgICAgIGluZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAotICAgICAgZmlsZT1gc2VkIC1uICcKLQkvXkBzZXRmaWxlbmFtZS97Ci0JICBzLy4qIFwoW14gXSpcKSAqJC9cMS8KLQkgIHAKLQkgIHEKLQl9JyAkaW5maWxlYAotICAgICAgIyAuLi4gb3IgaXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBzb3VyY2UgbmFtZSAoZGlyL2YudGV4aSBiZWNvbWVzIGYuaW5mbykKLSAgICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkaW5maWxlIiB8IHNlZCAncywuKi8sLDtzLC5bXi5dKiQsLCdgLmluZm8KLSAgICBmaQotICAgICMgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSB1c2VyIHJlYWxseSBuZWVkcyBtYWtlaW5mbzsKLSAgICAjIGxldCdzIGZhaWwgd2l0aG91dCB0b3VjaGluZyBhbnl0aGluZy4KLSAgICB0ZXN0IC1mICRmaWxlIHx8IGV4aXQgMQotICAgIHRvdWNoICRmaWxlCi0gICAgOzsKLQotICB0YXIpCi0gICAgc2hpZnQKLQotICAgICMgV2UgaGF2ZSBhbHJlYWR5IHRyaWVkIHRhciBpbiB0aGUgZ2VuZXJpYyBwYXJ0LgotICAgICMgTG9vayBmb3IgZ251dGFyL2d0YXIgYmVmb3JlIGludm9jYXRpb24gdG8gYXZvaWQgdWdseSBlcnJvcgotICAgICMgbWVzc2FnZXMuCi0gICAgaWYgKGdudXRhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KLSAgICAgICBnbnV0YXIgIiRAIiAmJiBleGl0IDAKLSAgICBmaQotICAgIGlmIChndGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgotICAgICAgIGd0YXIgIiRAIiAmJiBleGl0IDAKLSAgICBmaQotICAgIGZpcnN0YXJnPSIkMSIKLSAgICBpZiBzaGlmdDsgdGhlbgotCWNhc2UgJGZpcnN0YXJnIGluCi0JKm8qKQotCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL28vL2AKLQkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCi0JICAgIDs7Ci0JZXNhYwotCWNhc2UgJGZpcnN0YXJnIGluCi0JKmgqKQotCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL2gvL2AKLQkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCi0JICAgIDs7Ci0JZXNhYwotICAgIGZpCi0KLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IEkgY2FuJ3Qgc2VlbSB0byBiZSBhYmxlIHRvIHJ1biBcYHRhcicgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgotICAgICAgICAgWW91IG1heSB3YW50IHRvIGluc3RhbGwgR05VIHRhciBvciBGcmVlIHBheHV0aWxzLCBvciBjaGVjayB0aGUKLSAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgKikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIGlzICRtc2cuCi0gICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQotICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCi0gICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXNpdGVzIGZvciBpbnN0YWxsaW5nCi0gICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQotICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgotICAgIGV4aXQgMQotICAgIDs7Ci1lc2FjCi0KLWV4aXQgMAotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL21raW5zdGFsbGRpcnMgYi9saWJzL2xpYnBuZy9ta2luc3RhbGxkaXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdlMTZmLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL21raW5zdGFsbGRpcnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKLQotc2NyaXB0dmVyc2lvbj0yMDA2LTA1LTExLjE5Ci0KLSMgT3JpZ2luYWwgYXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+Ci0jIENyZWF0ZWQ6IDE5OTMtMDUtMTYKLSMgUHVibGljIGRvbWFpbi4KLSMKLSMgVGhpcyBmaWxlIGlzIG1haW50YWluZWQgaW4gQXV0b21ha2UsIHBsZWFzZSByZXBvcnQKLSMgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+IG9yIHNlbmQgcGF0Y2hlcyB0bwotIyA8YXV0b21ha2UtcGF0Y2hlc0BnbnUub3JnPi4KLQotbmw9JwotJwotSUZTPSIgIiIJJG5sIgotZXJyc3RhdHVzPTAKLWRpcm1vZGU9Ci0KLXVzYWdlPSJcCi1Vc2FnZTogbWtpbnN0YWxsZGlycyBbLWhdIFstLWhlbHBdIFstLXZlcnNpb25dIFstbSBNT0RFXSBESVIgLi4uCi0KLUNyZWF0ZSBlYWNoIGRpcmVjdG9yeSBESVIgKHdpdGggbW9kZSBNT0RFLCBpZiBzcGVjaWZpZWQpLCBpbmNsdWRpbmcgYWxsCi1sZWFkaW5nIGZpbGUgbmFtZSBjb21wb25lbnRzLgotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LiIKLQotIyBwcm9jZXNzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICQxIGluCi0gICAgLWggfCAtLWhlbHAgfCAtLWgqKSAgICAgICAgICMgLWggZm9yIGhlbHAKLSAgICAgIGVjaG8gIiR1c2FnZSIKLSAgICAgIGV4aXQgJD8KLSAgICAgIDs7Ci0gICAgLW0pICAgICAgICAgICAgICAgICAgICAgICAgICMgLW0gUEVSTSBhcmcKLSAgICAgIHNoaWZ0Ci0gICAgICB0ZXN0ICQjIC1lcSAwICYmIHsgZWNobyAiJHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgIGRpcm1vZGU9JDEKLSAgICAgIHNoaWZ0Ci0gICAgICA7OwotICAgIC0tdmVyc2lvbikKLSAgICAgIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIgotICAgICAgZXhpdCAkPwotICAgICAgOzsKLSAgICAtLSkgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdG9wIG9wdGlvbiBwcm9jZXNzaW5nCi0gICAgICBzaGlmdAotICAgICAgYnJlYWsKLSAgICAgIDs7Ci0gICAgLSopICAgICAgICAgICAgICAgICAgICAgICAgICMgdW5rbm93biBvcHRpb24KLSAgICAgIGVjaG8gIiR1c2FnZSIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgICopICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpcnN0IG5vbi1vcHQgYXJnCi0gICAgICBicmVhawotICAgICAgOzsKLSAgZXNhYwotZG9uZQotCi1mb3IgZmlsZQotZG8KLSAgaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCi0gICAgc2hpZnQKLSAgZWxzZQotICAgIGJyZWFrCi0gIGZpCi1kb25lCi0KLWNhc2UgJCMgaW4KLSAgMCkgZXhpdCAwIDs7Ci1lc2FjCi0KLSMgU29sYXJpcyA4J3MgbWtkaXIgLXAgaXNuJ3QgdGhyZWFkLXNhZmUuICBJZiB5b3UgbWtkaXIgLXAgYS9iIGFuZAotIyBta2RpciAtcCBhL2MgYXQgdGhlIHNhbWUgdGltZSwgYm90aCB3aWxsIGRldGVjdCB0aGF0IGEgaXMgbWlzc2luZywKLSMgb25lIHdpbGwgY3JlYXRlIGEsIHRoZW4gdGhlIG90aGVyIHdpbGwgdHJ5IHRvIGNyZWF0ZSBhIGFuZCBkaWUgd2l0aAotIyBhICJGaWxlIGV4aXN0cyIgZXJyb3IuICBUaGlzIGlzIGEgcHJvYmxlbSB3aGVuIGNhbGxpbmcgbWtpbnN0YWxsZGlycwotIyBmcm9tIGEgcGFyYWxsZWwgbWFrZS4gIFdlIHVzZSAtLXZlcnNpb24gaW4gdGhlIHByb2JlIHRvIHJlc3RyaWN0Ci0jIG91cnNlbHZlcyB0byBHTlUgbWtkaXIsIHdoaWNoIGlzIHRocmVhZC1zYWZlLgotY2FzZSAkZGlybW9kZSBpbgotICAnJykKLSAgICBpZiBta2RpciAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCi0gICAgICBlY2hvICJta2RpciAtcCAtLSAkKiIKLSAgICAgIGV4ZWMgbWtkaXIgLXAgLS0gIiRAIgotICAgIGVsc2UKLSAgICAgICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90Ci0gICAgICAjIHJlY29nbml6ZSBhbnkgb3B0aW9uLiAgSXQgd2lsbCBpbnRlcnByZXQgYWxsIG9wdGlvbnMgYXMKLSAgICAgICMgZGlyZWN0b3JpZXMgdG8gY3JlYXRlLCBhbmQgdGhlbiBhYm9ydCBiZWNhdXNlIGAuJyBhbHJlYWR5Ci0gICAgICAjIGV4aXN0cy4KLSAgICAgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCi0gICAgICB0ZXN0IC1kIC4vLS12ZXJzaW9uICYmIHJtZGlyIC4vLS12ZXJzaW9uCi0gICAgZmkKLSAgICA7OwotICAqKQotICAgIGlmIG1rZGlyIC1tICIkZGlybW9kZSIgLXAgLS12ZXJzaW9uIC4gPi9kZXYvbnVsbCAyPiYxICYmCi0gICAgICAgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCi0gICAgICBlY2hvICJta2RpciAtbSAkZGlybW9kZSAtcCAtLSAkKiIKLSAgICAgIGV4ZWMgbWtkaXIgLW0gIiRkaXJtb2RlIiAtcCAtLSAiJEAiCi0gICAgZWxzZQotICAgICAgIyBDbGVhbiB1cCBhZnRlciBOZXh0U3RlcCBhbmQgT3BlblN0ZXAgbWtkaXIuCi0gICAgICBmb3IgZCBpbiAuLy1tIC4vLXAgLi8tLXZlcnNpb24gIi4vJGRpcm1vZGUiOwotICAgICAgZG8KLSAgICAgICAgdGVzdCAtZCAkZCAmJiBybWRpciAkZAotICAgICAgZG9uZQotICAgIGZpCi0gICAgOzsKLWVzYWMKLQotZm9yIGZpbGUKLWRvCi0gIGNhc2UgJGZpbGUgaW4KLSAgICAvKikgcGF0aGNvbXA9LyA7OwotICAgICopICBwYXRoY29tcD0gOzsKLSAgZXNhYwotICBvSUZTPSRJRlMKLSAgSUZTPS8KLSAgc2V0IGZub3JkICRmaWxlCi0gIHNoaWZ0Ci0gIElGUz0kb0lGUwotCi0gIGZvciBkCi0gIGRvCi0gICAgdGVzdCAieCRkIiA9IHggJiYgY29udGludWUKLQotICAgIHBhdGhjb21wPSRwYXRoY29tcCRkCi0gICAgY2FzZSAkcGF0aGNvbXAgaW4KLSAgICAgIC0qKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgotICAgICAgZWNobyAibWtkaXIgJHBhdGhjb21wIgotCi0gICAgICBta2RpciAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/Ci0KLSAgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgotCWVycnN0YXR1cz0kbGFzdGVycgotICAgICAgZWxzZQotCWlmIHRlc3QgISAteiAiJGRpcm1vZGUiOyB0aGVuCi0JICBlY2hvICJjaG1vZCAkZGlybW9kZSAkcGF0aGNvbXAiCi0JICBsYXN0ZXJyPQotCSAgY2htb2QgIiRkaXJtb2RlIiAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/Ci0KLQkgIGlmIHRlc3QgISAteiAiJGxhc3RlcnIiOyB0aGVuCi0JICAgIGVycnN0YXR1cz0kbGFzdGVycgotCSAgZmkKLQlmaQotICAgICAgZmkKLSAgICBmaQotCi0gICAgcGF0aGNvbXA9JHBhdGhjb21wLwotICBkb25lCi1kb25lCi0KLWV4aXQgJGVycnN0YXR1cwotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTogc2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOiAyCi0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKLSMgdGltZS1zdGFtcC1lbmQ6ICIkIgotIyBFbmQ6CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wbmcuNSBiL2xpYnMvbGlicG5nL3BuZy41CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjczZGFmLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3BuZy41CisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLlRIIFBORyA1ICJKdW5lIDQsIDIwMDkiCi0uU0ggTkFNRQotcG5nIFwtIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORykgZm9ybWF0Ci0uU0ggREVTQ1JJUFRJT04KLVBORyAoUG9ydGFibGUgTmV0d29yayBHcmFwaGljcykgaXMgYW4gZXh0ZW5zaWJsZSBmaWxlIGZvcm1hdCBmb3IgdGhlCi1sb3NzbGVzcywgcG9ydGFibGUsIHdlbGwtY29tcHJlc3NlZCBzdG9yYWdlIG9mIHJhc3RlciBpbWFnZXMuIFBORyBwcm92aWRlcwotYSBwYXRlbnQtZnJlZSByZXBsYWNlbWVudCBmb3IgR0lGIGFuZCBjYW4gYWxzbyByZXBsYWNlIG1hbnkKLWNvbW1vbiB1c2VzIG9mIFRJRkYuIEluZGV4ZWQtY29sb3IsIGdyYXlzY2FsZSwgYW5kIHRydWVjb2xvciBpbWFnZXMgYXJlCi1zdXBwb3J0ZWQsIHBsdXMgYW4gb3B0aW9uYWwgYWxwaGEgY2hhbm5lbC4gU2FtcGxlIGRlcHRocyByYW5nZSBmcm9tCi0xIHRvIDE2IGJpdHMuCi0uYnIKLQotUE5HIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2VsbCBpbiBvbmxpbmUgdmlld2luZyBhcHBsaWNhdGlvbnMsIHN1Y2ggYXMgdGhlCi1Xb3JsZCBXaWRlIFdlYiwgc28gaXQgaXMgZnVsbHkgc3RyZWFtYWJsZSB3aXRoIGEgcHJvZ3Jlc3NpdmUgZGlzcGxheQotb3B0aW9uLiBQTkcgaXMgcm9idXN0LCBwcm92aWRpbmcgYm90aCBmdWxsIGZpbGUgaW50ZWdyaXR5IGNoZWNraW5nIGFuZAotZmFzdCwgc2ltcGxlIGRldGVjdGlvbiBvZiBjb21tb24gdHJhbnNtaXNzaW9uIGVycm9ycy4gQWxzbywgUE5HIGNhbiBzdG9yZQotZ2FtbWEgYW5kIGNocm9tYXRpY2l0eSBkYXRhIGZvciBpbXByb3ZlZCBjb2xvciBtYXRjaGluZyBvbiBoZXRlcm9nZW5lb3VzCi1wbGF0Zm9ybXMuCi0KLS5TSCAiU0VFIEFMU08iCi0uSVIgbGlicG5nKDMpICIsICIgemxpYigzKSAiLCAiIGRlZmxhdGUoNSkgIiwgYW5kICIgemxpYig1KQotLkxQCi1QTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pLCBOb3ZlbWJlciAyMDAzOgotLklQCi0uYnIKLSAgPGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvUkVDLVBORy0yMDAzMTExMC8KLVBORyAxLjIgc3BlY2lmaWNhdGlvbiwgSnVseSAxOTk5OgotLklQCi0uYnIKLWh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nCi0uTFAKLVBORyAxLjAgc3BlY2lmaWNhdGlvbiwgT2N0b2JlciAxOTk2OgotLklQCi0uYnIKLVJGQyAyMDgzCi0uSVAKLS5icgotZnRwOi8vZnRwLnJmYy1lZGl0b3Iub3JnOi9pbi1ub3Rlcy9yZmMyMDgzLnR4dAotLmJyCi1vciAoYXMgYSBXM0MgUmVjb21tZW5kYXRpb24pIGF0Ci0uYnIKLWh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1wbmcuaHRtbAotLlNIIEFVVEhPUlMKLVRoaXMgbWFuIHBhZ2U6IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotLkxQCi1Qb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gKFNlY29uZCBFZGl0aW9uKQotSW5mb3JtYXRpb24gdGVjaG5vbG9neSAtIENvbXB1dGVyIGdyYXBoaWNzIGFuZCBpbWFnZSBwcm9jZXNzaW5nIC0KLVBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORyk6IEZ1bmN0aW9uYWwgc3BlY2lmaWNhdGlvbi4KLUlTTy9JRUMgMTU5NDg6MjAwMyAoRSkgKE5vdmVtYmVyIDEwLCAyMDAzKTogRGF2aWQgRHVjZSBhbmQgb3RoZXJzLgotLkxQCi1Qb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gVmVyc2lvbiAxLjIgKEp1bHkgOCwgMTk5OSk6Ci1HbGVubiBSYW5kZXJzLVBlaHJzb24gYW5kIG90aGVycyAocG5nLWxpc3QpLgotLkxQCi1Qb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gVmVyc2lvbiAxLjAgKE9jdG9iZXIgMSwgMTk5Nik6Ci1UaG9tYXMgQm91dGVsbCBhbmQgb3RoZXJzIChwbmctbGlzdCkuCi0uTFAKLQotCi0uU0ggQ09QWVJJR0hUIE5PVElDRQotLkxQCi1UaGlzIG1hbiBwYWdlIGlzIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IEdsZW5uIFJhbmRlcnMtUGVocnNvbi4gIFNlZSBwbmcuaAotZm9yIGNvbmRpdGlvbnMgb2YgdXNlIGFuZCBkaXN0cmlidXRpb24uCi0uTFAKLVRoZSBQTkcgU3BlY2lmaWNhdGlvbiAoU2Vjb25kIEVkaXRpb24pIGlzCi1Db3B5cmlnaHQgKGMpIDIwMDMgVzNDLiAoTUlULCBFUkNJTSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0uTFAKLVRoZSBQTkctMS4yIHNwZWNpZmljYXRpb24gaXMgY29weXJpZ2h0IChjKSAxOTk5IEdsZW5uIFJhbmRlcnMtUGVocnNvbi4KLVNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY29uZGl0aW9ucyBvZiB1c2UgYW5kIGRpc3RyaWJ1dGlvbi4KLS5MUAotVGhlIFBORy0xLjAgc3BlY2lmaWNhdGlvbiBpcyBjb3B5cmlnaHQgKGMpIDE5OTYgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKLVRlY2hub2xvZ3kuICBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGNvbmRpdGlvbnMgb2YgdXNlIGFuZCBkaXN0cmlidXRpb24uCi0uTFAKLS5cIiBlbmQgb2YgbWFuIHBhZ2UKLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcG5nLmMgYi9saWJzL2xpYnBuZy9wbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiODZlMS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDkyMiArMCwwIEBACi0KLS8qIHBuZy5jIC0gbG9jYXRpb24gZm9yIGdlbmVyYWwgcHVycG9zZSBsaWJwbmcgZnVuY3Rpb25zCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuMzcgW0p1bmUgNCwgMjAwOV0KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqLwotCi0jZGVmaW5lIFBOR19JTlRFUk5BTAotI2RlZmluZSBQTkdfTk9fRVhURVJOCi0jaW5jbHVkZSAicG5nLmgiCi0KLS8qIEdlbmVyYXRlIGEgY29tcGlsZXIgZXJyb3IgaWYgdGhlcmUgaXMgYW4gb2xkIHBuZy5oIGluIHRoZSBzZWFyY2ggcGF0aC4gKi8KLXR5cGVkZWYgdmVyc2lvbl8xXzJfMzcgWW91cl9wbmdfaF9pc19ub3RfdmVyc2lvbl8xXzJfMzc7Ci0KLS8qIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIEMgZmlsZXMuICBUaGlzIGhhZCBiZXR0ZXIgbWF0Y2ggdGhlIHZlcnNpb24KLSAqIHN0cmluZyBkZWZpbmVkIGluIHBuZy5oLiAgKi8KLQotI2lmZGVmIFBOR19VU0VfR0xPQkFMX0FSUkFZUwotLyogcG5nX2xpYnBuZ192ZXIgd2FzIGNoYW5nZWQgdG8gYSBmdW5jdGlvbiBpbiB2ZXJzaW9uIDEuMC41YyAqLwotUE5HX0NPTlNUIGNoYXIgcG5nX2xpYnBuZ192ZXJbMThdID0gUE5HX0xJQlBOR19WRVJfU1RSSU5HOwotCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi0KLS8qIHBuZ19zaWcgd2FzIGNoYW5nZWQgdG8gYSBmdW5jdGlvbiBpbiB2ZXJzaW9uIDEuMC41YyAqLwotLyogUGxhY2UgdG8gaG9sZCB0aGUgc2lnbmF0dXJlIHN0cmluZyBmb3IgYSBQTkcgZmlsZS4gKi8KLVBOR19DT05TVCBwbmdfYnl0ZSBGQVJEQVRBIHBuZ19zaWdbOF0gPSB7MTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMH07Ci0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCi0KLS8qIEludm9rZSBnbG9iYWwgZGVjbGFyYXRpb25zIGZvciBjb25zdGFudCBzdHJpbmdzIGZvciBrbm93biBjaHVuayB0eXBlcyAqLwotUE5HX0lIRFI7Ci1QTkdfSURBVDsKLVBOR19JRU5EOwotUE5HX1BMVEU7Ci1QTkdfYktHRDsKLVBOR19jSFJNOwotUE5HX2dBTUE7Ci1QTkdfaElTVDsKLVBOR19pQ0NQOwotUE5HX2lUWHQ7Ci1QTkdfb0ZGczsKLVBOR19wQ0FMOwotUE5HX3NDQUw7Ci1QTkdfcEhZczsKLVBOR19zQklUOwotUE5HX3NQTFQ7Ci1QTkdfc1JHQjsKLVBOR190RVh0OwotUE5HX3RJTUU7Ci1QTkdfdFJOUzsKLVBOR196VFh0OwotCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi0vKiBBcnJheXMgdG8gZmFjaWxpdGF0ZSBlYXN5IGludGVybGFjaW5nIC0gdXNlIHBhc3MgKDAgLSA2KSBhcyBpbmRleCAqLwotCi0vKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgKi8KLVBOR19DT05TVCBpbnQgRkFSREFUQSBwbmdfcGFzc19zdGFydFtdID0gezAsIDQsIDAsIDIsIDAsIDEsIDB9OwotCi0vKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgKi8KLVBOR19DT05TVCBpbnQgRkFSREFUQSBwbmdfcGFzc19pbmNbXSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKLQotLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLwotUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX3lzdGFydFtdID0gezAsIDAsIDQsIDAsIDIsIDAsIDF9OwotCi0vKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCi1QTkdfQ09OU1QgaW50IEZBUkRBVEEgcG5nX3Bhc3NfeWluY1tdID0gezgsIDgsIDgsIDQsIDQsIDIsIDJ9OwotCi0vKiBIZWlnaHQgb2YgaW50ZXJsYWNlIGJsb2NrLiAgVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQgLSBpZiB5b3UgbmVlZAotICogaXQsIHVuY29tbWVudCBpdCBoZXJlIGFuZCBpbiBwbmcuaAotUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX2hlaWdodFtdID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OwotKi8KLQotLyogTWFzayB0byBkZXRlcm1pbmUgd2hpY2ggcGl4ZWxzIGFyZSB2YWxpZCBpbiBhIHBhc3MgKi8KLVBOR19DT05TVCBpbnQgRkFSREFUQSBwbmdfcGFzc19tYXNrW10gPSB7MHg4MCwgMHgwOCwgMHg4OCwgMHgyMiwgMHhhYSwgMHg1NSwgMHhmZn07Ci0KLS8qIE1hc2sgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpeGVscyB0byBvdmVyd3JpdGUgd2hpbGUgZGlzcGxheWluZyAqLwotUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX2RzcF9tYXNrW10KLSAgID0gezB4ZmYsIDB4MGYsIDB4ZmYsIDB4MzMsIDB4ZmYsIDB4NTUsIDB4ZmZ9OwotCi0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogUE5HX1VTRV9HTE9CQUxfQVJSQVlTICovCi0KLS8qIFRlbGxzIGxpYnBuZyB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBmaXJzdCAibnVtX2J5dGVzIiBieXRlcwotICogb2YgdGhlIFBORyBmaWxlIHNpZ25hdHVyZS4gIElmIHRoZSBQTkcgZGF0YSBpcyBlbWJlZGRlZCBpbnRvIGFub3RoZXIKLSAqIHN0cmVhbSB3ZSBjYW4gc2V0IG51bV9ieXRlcyA9IDggc28gdGhhdCBsaWJwbmcgd2lsbCBub3QgYXR0ZW1wdCB0byByZWFkCi0gKiBvciB3cml0ZSBhbnkgb2YgdGhlIG1hZ2ljIGJ5dGVzIGJlZm9yZSBpdCBzdGFydHMgb24gdGhlIElIRFIuCi0gKi8KLQotI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc2lnX2J5dGVzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBudW1fYnl0ZXMpCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3NpZ19ieXRlcyIpOwotICAgaWYgKG51bV9ieXRlcyA+IDgpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlRvbyBtYW55IGJ5dGVzIGZvciBQTkcgc2lnbmF0dXJlLiIpOwotCi0gICBwbmdfcHRyLT5zaWdfYnl0ZXMgPSAocG5nX2J5dGUpKG51bV9ieXRlcyA8IDAgPyAwIDogbnVtX2J5dGVzKTsKLX0KLQotLyogQ2hlY2tzIHdoZXRoZXIgdGhlIHN1cHBsaWVkIGJ5dGVzIG1hdGNoIHRoZSBQTkcgc2lnbmF0dXJlLiAgV2UgYWxsb3cKLSAqIGNoZWNraW5nIGxlc3MgdGhhbiB0aGUgZnVsbCA4LWJ5dGUgc2lnbmF0dXJlIHNvIHRoYXQgdGhvc2UgYXBwcyB0aGF0Ci0gKiBhbHJlYWR5IHJlYWQgdGhlIGZpcnN0IGZldyBieXRlcyBvZiBhIGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlIHR5cGUKLSAqIGNhbiBzaW1wbHkgY2hlY2sgdGhlIHJlbWFpbmluZyBieXRlcyBmb3IgZXh0cmEgYXNzdXJhbmNlLiAgUmV0dXJucwotICogYW4gaW50ZWdlciBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gemVybyBpZiBzaWcgaXMgZm91bmQsCi0gKiByZXNwZWN0aXZlbHksIHRvIGJlIGxlc3MgdGhhbiwgdG8gbWF0Y2gsIG9yIGJlIGdyZWF0ZXIgdGhhbiB0aGUgY29ycmVjdAotICogUE5HIHNpZ25hdHVyZSAodGhpcyBpcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgc3RyY21wLCBtZW1jbXAsIGV0YykuCi0gKi8KLWludCBQTkdBUEkKLXBuZ19zaWdfY21wKHBuZ19ieXRlcCBzaWcsIHBuZ19zaXplX3Qgc3RhcnQsIHBuZ19zaXplX3QgbnVtX3RvX2NoZWNrKQotewotICAgcG5nX2J5dGUgcG5nX3NpZ25hdHVyZVs4XSA9IHsxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwfTsKLSAgIGlmIChudW1fdG9fY2hlY2sgPiA4KQotICAgICAgbnVtX3RvX2NoZWNrID0gODsKLSAgIGVsc2UgaWYgKG51bV90b19jaGVjayA8IDEpCi0gICAgICByZXR1cm4gKC0xKTsKLQotICAgaWYgKHN0YXJ0ID4gNykKLSAgICAgIHJldHVybiAoLTEpOwotCi0gICBpZiAoc3RhcnQgKyBudW1fdG9fY2hlY2sgPiA4KQotICAgICAgbnVtX3RvX2NoZWNrID0gOCAtIHN0YXJ0OwotCi0gICByZXR1cm4gKChpbnQpKHBuZ19tZW1jbXAoJnNpZ1tzdGFydF0sICZwbmdfc2lnbmF0dXJlW3N0YXJ0XSwgbnVtX3RvX2NoZWNrKSkpOwotfQotCi0jaWYgZGVmaW5lZChQTkdfMV8wX1gpIHx8IGRlZmluZWQoUE5HXzFfMl9YKQotLyogKE9ic29sZXRlKSBmdW5jdGlvbiB0byBjaGVjayBzaWduYXR1cmUgYnl0ZXMuICBJdCBkb2VzIG5vdCBhbGxvdyBvbmUKLSAqIHRvIGNoZWNrIGEgcGFydGlhbCBzaWduYXR1cmUuICBUaGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIHJlbW92ZWQgaW4gdGhlCi0gKiBmdXR1cmUgLSB1c2UgcG5nX3NpZ19jbXAoKS4gIFJldHVybnMgdHJ1ZSAobm9uemVybykgaWYgdGhlIGZpbGUgaXMgUE5HLgotICovCi1pbnQgUE5HQVBJCi1wbmdfY2hlY2tfc2lnKHBuZ19ieXRlcCBzaWcsIGludCBudW0pCi17Ci0gIHJldHVybiAoKGludCkhcG5nX3NpZ19jbXAoc2lnLCAocG5nX3NpemVfdCkwLCAocG5nX3NpemVfdCludW0pKTsKLX0KLSNlbmRpZgotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKLS8qIEZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgemxpYiBhbmQgY2xlYXIgaXQgdG8gMC4gKi8KLSNpZmRlZiBQTkdfMV8wX1gKLXZvaWRwZiBQTkdBUEkKLSNlbHNlCi12b2lkcGYgLyogcHJpdmF0ZSAqLwotI2VuZGlmCi1wbmdfemFsbG9jKHZvaWRwZiBwbmdfcHRyLCB1SW50IGl0ZW1zLCB1SW50IHNpemUpCi17Ci0gICBwbmdfdm9pZHAgcHRyOwotICAgcG5nX3N0cnVjdHAgcD0ocG5nX3N0cnVjdHApcG5nX3B0cjsKLSAgIHBuZ191aW50XzMyIHNhdmVfZmxhZ3M9cC0+ZmxhZ3M7Ci0gICBwbmdfdWludF8zMiBudW1fYnl0ZXM7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gKE5VTEwpOwotICAgaWYgKGl0ZW1zID4gUE5HX1VJTlRfMzJfTUFYL3NpemUpCi0gICB7Ci0gICAgIHBuZ193YXJuaW5nIChwLCAiUG90ZW50aWFsIG92ZXJmbG93IGluIHBuZ196YWxsb2MoKSIpOwotICAgICByZXR1cm4gKE5VTEwpOwotICAgfQotICAgbnVtX2J5dGVzID0gKHBuZ191aW50XzMyKWl0ZW1zICogc2l6ZTsKLQotICAgcC0+ZmxhZ3N8PVBOR19GTEFHX01BTExPQ19OVUxMX01FTV9PSzsKLSAgIHB0ciA9IChwbmdfdm9pZHApcG5nX21hbGxvYygocG5nX3N0cnVjdHApcG5nX3B0ciwgbnVtX2J5dGVzKTsKLSAgIHAtPmZsYWdzPXNhdmVfZmxhZ3M7Ci0KLSNpZiBkZWZpbmVkKFBOR18xXzBfWCkgJiYgIWRlZmluZWQoUE5HX05PX1pBTExPQ19aRVJPKQotICAgaWYgKHB0ciA9PSBOVUxMKQotICAgICAgIHJldHVybiAoKHZvaWRwZilwdHIpOwotCi0gICBpZiAobnVtX2J5dGVzID4gKHBuZ191aW50XzMyKTB4ODAwMEwpCi0gICB7Ci0gICAgICBwbmdfbWVtc2V0KHB0ciwgMCwgKHBuZ19zaXplX3QpMHg4MDAwTCk7Ci0gICAgICBwbmdfbWVtc2V0KChwbmdfYnl0ZXApcHRyICsgKHBuZ19zaXplX3QpMHg4MDAwTCwgMCwKLSAgICAgICAgIChwbmdfc2l6ZV90KShudW1fYnl0ZXMgLSAocG5nX3VpbnRfMzIpMHg4MDAwTCkpOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgcG5nX21lbXNldChwdHIsIDAsIChwbmdfc2l6ZV90KW51bV9ieXRlcyk7Ci0gICB9Ci0jZW5kaWYKLSAgIHJldHVybiAoKHZvaWRwZilwdHIpOwotfQotCi0vKiBGdW5jdGlvbiB0byBmcmVlIG1lbW9yeSBmb3IgemxpYiAqLwotI2lmZGVmIFBOR18xXzBfWAotdm9pZCBQTkdBUEkKLSNlbHNlCi12b2lkIC8qIHByaXZhdGUgKi8KLSNlbmRpZgotcG5nX3pmcmVlKHZvaWRwZiBwbmdfcHRyLCB2b2lkcGYgcHRyKQotewotICAgcG5nX2ZyZWUoKHBuZ19zdHJ1Y3RwKXBuZ19wdHIsIChwbmdfdm9pZHApcHRyKTsKLX0KLQotLyogUmVzZXQgdGhlIENSQyB2YXJpYWJsZSB0byAzMiBiaXRzIG9mIDEncy4gIENhcmUgbXVzdCBiZSB0YWtlbgotICogaW4gY2FzZSBDUkMgaXMgPiAzMiBiaXRzIHRvIGxlYXZlIHRoZSB0b3AgYml0cyAwLgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19yZXNldF9jcmMocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19wdHItPmNyYyA9IGNyYzMyKDAsIFpfTlVMTCwgMCk7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgQ1JDIG92ZXIgYSBzZWN0aW9uIG9mIGRhdGEuICBXZSBjYW4gb25seSBwYXNzIGFzCi0gKiBtdWNoIGRhdGEgdG8gdGhpcyByb3V0aW5lIGFzIHRoZSBsYXJnZXN0IHNpbmdsZSBidWZmZXIgc2l6ZS4gIFdlCi0gKiBhbHNvIGNoZWNrIHRoYXQgdGhpcyBkYXRhIHdpbGwgYWN0dWFsbHkgYmUgdXNlZCBiZWZvcmUgZ29pbmcgdG8gdGhlCi0gKiB0cm91YmxlIG9mIGNhbGN1bGF0aW5nIGl0LgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19jYWxjdWxhdGVfY3JjKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBwdHIsIHBuZ19zaXplX3QgbGVuZ3RoKQotewotICAgaW50IG5lZWRfY3JjID0gMTsKLQotICAgaWYgKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSAgICAgICAgICAgICAgICAgICAgIC8qIGFuY2lsbGFyeSAqLwotICAgewotICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSykgPT0KLSAgICAgICAgICAoUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UgfCBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTikpCi0gICAgICAgICBuZWVkX2NyYyA9IDA7Ci0gICB9Ci0gICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyaXRpY2FsICovCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQ1JJVElDQUxfSUdOT1JFKQotICAgICAgICAgbmVlZF9jcmMgPSAwOwotICAgfQotCi0gICBpZiAobmVlZF9jcmMpCi0gICAgICBwbmdfcHRyLT5jcmMgPSBjcmMzMihwbmdfcHRyLT5jcmMsIHB0ciwgKHVJbnQpbGVuZ3RoKTsKLX0KLQotLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgYW4gaW5mb19zdHJ1Y3QgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFdlIGRvbid0Ci0gKiByZWFsbHkgbmVlZCB0aGUgcG5nX3B0ciwgYnV0IGl0IGNvdWxkIHBvdGVudGlhbGx5IGJlIHVzZWZ1bCBpbiB0aGUKLSAqIGZ1dHVyZS4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gZmF2b3VyIG9mIG1hbGxvYyhwbmdfc2l6ZW9mKHBuZ19pbmZvKSkKLSAqIGFuZCBwbmdfaW5mb19pbml0KCkgc28gdGhhdCBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIHVzZSBhIHNoYXJlZAotICogbGlicG5nIGRvbid0IGhhdmUgdG8gYmUgcmVjb21waWxlZCBpZiBwbmdfaW5mbyBjaGFuZ2VzIHNpemUuCi0gKi8KLXBuZ19pbmZvcCBQTkdBUEkKLXBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cjsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY3JlYXRlX2luZm9fc3RydWN0Iik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuIChOVUxMKTsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBpbmZvX3B0ciA9IChwbmdfaW5mb3ApcG5nX2NyZWF0ZV9zdHJ1Y3RfMihQTkdfU1RSVUNUX0lORk8sCi0gICAgICBwbmdfcHRyLT5tYWxsb2NfZm4sIHBuZ19wdHItPm1lbV9wdHIpOwotI2Vsc2UKLSAgIGluZm9fcHRyID0gKHBuZ19pbmZvcClwbmdfY3JlYXRlX3N0cnVjdChQTkdfU1RSVUNUX0lORk8pOwotI2VuZGlmCi0gICBpZiAoaW5mb19wdHIgIT0gTlVMTCkKLSAgICAgIHBuZ19pbmZvX2luaXRfMygmaW5mb19wdHIsIHBuZ19zaXplb2YocG5nX2luZm8pKTsKLQotICAgcmV0dXJuIChpbmZvX3B0cik7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgaW5mbyBzdHJ1Y3QuCi0gKiBOb3JtYWxseSwgb25lIHdvdWxkIHVzZSBlaXRoZXIgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSBvcgotICogcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkgdG8gZnJlZSBhbiBpbmZvIHN0cnVjdCwgYnV0IHRoaXMgbWF5IGJlCi0gKiB1c2VmdWwgZm9yIHNvbWUgYXBwbGljYXRpb25zLgotICovCi12b2lkIFBOR0FQSQotcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wcCBpbmZvX3B0cl9wdHIpCi17Ci0gICBwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdCIpOwotICAgaWYgKGluZm9fcHRyX3B0ciAhPSBOVUxMKQotICAgICAgaW5mb19wdHIgPSAqaW5mb19wdHJfcHRyOwotCi0gICBpZiAoaW5mb19wdHIgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19pbmZvX2Rlc3Ryb3kocG5nX3B0ciwgaW5mb19wdHIpOwotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0XzIoKHBuZ192b2lkcClpbmZvX3B0ciwgcG5nX3B0ci0+ZnJlZV9mbiwKLSAgICAgICAgICBwbmdfcHRyLT5tZW1fcHRyKTsKLSNlbHNlCi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QoKHBuZ192b2lkcClpbmZvX3B0cik7Ci0jZW5kaWYKLSAgICAgICppbmZvX3B0cl9wdHIgPSBOVUxMOwotICAgfQotfQotCi0vKiBJbml0aWFsaXplIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMgbm93IGFuIGludGVybmFsIGZ1bmN0aW9uICgwLjg5KQotICogYW5kIGFwcGxpY2F0aW9ucyB1c2luZyBpdCBhcmUgdXJnZWQgdG8gdXNlIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKQotICogaW5zdGVhZC4KLSAqLwotI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkKFBOR18xXzJfWCkKLSN1bmRlZiBwbmdfaW5mb19pbml0Ci12b2lkIFBOR0FQSQotcG5nX2luZm9faW5pdChwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICAvKiBXZSBvbmx5IGNvbWUgaGVyZSB2aWEgcHJlLTEuMC4xMi1jb21waWxlZCBhcHBsaWNhdGlvbnMgKi8KLSAgIHBuZ19pbmZvX2luaXRfMygmaW5mb19wdHIsIDApOwotfQotI2VuZGlmCi0KLXZvaWQgUE5HQVBJCi1wbmdfaW5mb19pbml0XzMocG5nX2luZm9wcCBwdHJfcHRyLCBwbmdfc2l6ZV90IHBuZ19pbmZvX3N0cnVjdF9zaXplKQotewotICAgcG5nX2luZm9wIGluZm9fcHRyID0gKnB0cl9wdHI7Ci0KLSAgIGlmIChpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19pbmZvX2luaXRfMyIpOwotCi0gICBpZiAocG5nX3NpemVvZihwbmdfaW5mbykgPiBwbmdfaW5mb19zdHJ1Y3Rfc2l6ZSkKLSAgIHsKLSAgICAgIHBuZ19kZXN0cm95X3N0cnVjdChpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciA9IChwbmdfaW5mb3ApcG5nX2NyZWF0ZV9zdHJ1Y3QoUE5HX1NUUlVDVF9JTkZPKTsKLSAgICAgICpwdHJfcHRyID0gaW5mb19wdHI7Ci0gICB9Ci0KLSAgIC8qIFNldCBldmVyeXRoaW5nIHRvIDAgKi8KLSAgIHBuZ19tZW1zZXQoaW5mb19wdHIsIDAsIHBuZ19zaXplb2YocG5nX2luZm8pKTsKLX0KLQotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19kYXRhX2ZyZWVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIGludCBmcmVlciwgcG5nX3VpbnRfMzIgbWFzaykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RhdGFfZnJlZXIiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmIChmcmVlciA9PSBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQSkKLSAgICAgIGluZm9fcHRyLT5mcmVlX21lIHw9IG1hc2s7Ci0gICBlbHNlIGlmIChmcmVlciA9PSBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQSkKLSAgICAgIGluZm9fcHRyLT5mcmVlX21lICY9IH5tYXNrOwotICAgZWxzZQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICJVbmtub3duIGZyZWVyIHBhcmFtZXRlciBpbiBwbmdfZGF0YV9mcmVlci4iKTsKLX0KLSNlbmRpZgotCi12b2lkIFBOR0FQSQotcG5nX2ZyZWVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIG1hc2ssCi0gICBpbnQgbnVtKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZnJlZV9kYXRhIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSNpZiBkZWZpbmVkKFBOR19URVhUX1NVUFBPUlRFRCkKLSAgIC8qIEZyZWUgdGV4dCBpdGVtIG51bSBvciAoaWYgbnVtID09IC0xKSBhbGwgdGV4dCBpdGVtcyAqLwotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfVEVYVCkgJiBpbmZvX3B0ci0+ZnJlZV9tZSkKLSNlbHNlCi0gICBpZiAobWFzayAmIFBOR19GUkVFX1RFWFQpCi0jZW5kaWYKLSAgIHsKLSAgICAgIGlmIChudW0gIT0gLTEpCi0gICAgICB7Ci0gICAgICAgICBpZiAoaW5mb19wdHItPnRleHQgJiYgaW5mb19wdHItPnRleHRbbnVtXS5rZXkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+dGV4dFtudW1dLmtleSk7Ci0gICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtudW1dLmtleSA9IE5VTEw7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpbnQgaTsKLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvX3B0ci0+bnVtX3RleHQ7IGkrKykKLSAgICAgICAgICAgICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9URVhULCBpKTsKLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0KTsKLSAgICAgICAgIGluZm9fcHRyLT50ZXh0ID0gTlVMTDsKLSAgICAgICAgIGluZm9fcHRyLT5udW1fdGV4dD0wOwotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR190Uk5TX1NVUFBPUlRFRCkKLSAgIC8qIEZyZWUgYW55IHRSTlMgZW50cnkgKi8KLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgIGlmICgobWFzayAmIFBOR19GUkVFX1RSTlMpICYgaW5mb19wdHItPmZyZWVfbWUpCi0jZWxzZQotICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfVFJOUykgJiYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfRlJFRV9UUk5TKSkKLSNlbmRpZgotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnRyYW5zKTsKLSAgICAgIGluZm9fcHRyLT50cmFucyA9IE5VTEw7Ci0gICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3RSTlM7Ci0jaWZuZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0ZSRUVfVFJOUzsKLSNlbmRpZgotICAgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkKLSAgIC8qIEZyZWUgYW55IHNDQUwgZW50cnkgKi8KLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgIGlmICgobWFzayAmIFBOR19GUkVFX1NDQUwpICYgaW5mb19wdHItPmZyZWVfbWUpCi0jZWxzZQotICAgaWYgKG1hc2sgJiBQTkdfRlJFRV9TQ0FMKQotI2VuZGlmCi0gICB7Ci0jaWYgZGVmaW5lZChQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnNjYWxfc193aWR0aCk7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+c2NhbF9zX2hlaWdodCk7Ci0gICAgICBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID0gTlVMTDsKLSAgICAgIGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0ID0gTlVMTDsKLSNlbmRpZgotICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19zQ0FMOwotICAgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19wQ0FMX1NVUFBPUlRFRCkKLSAgIC8qIEZyZWUgYW55IHBDQUwgZW50cnkgKi8KLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgIGlmICgobWFzayAmIFBOR19GUkVFX1BDQUwpICYgaW5mb19wdHItPmZyZWVfbWUpCi0jZWxzZQotICAgaWYgKG1hc2sgJiBQTkdfRlJFRV9QQ0FMKQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cGNhbF9wdXJwb3NlKTsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5wY2FsX3VuaXRzKTsKLSAgICAgIGluZm9fcHRyLT5wY2FsX3B1cnBvc2UgPSBOVUxMOwotICAgICAgaW5mb19wdHItPnBjYWxfdW5pdHMgPSBOVUxMOwotICAgICAgaWYgKGluZm9fcHRyLT5wY2FsX3BhcmFtcyAhPSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludClpbmZvX3B0ci0+cGNhbF9ucGFyYW1zOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cGNhbF9wYXJhbXNbaV0pOwotICAgICAgICAgICAgICAgaW5mb19wdHItPnBjYWxfcGFyYW1zW2ldPU5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cGNhbF9wYXJhbXMpOwotICAgICAgICAgICAgaW5mb19wdHItPnBjYWxfcGFyYW1zID0gTlVMTDsKLSAgICAgICAgIH0KLSAgICAgIGluZm9fcHRyLT52YWxpZCAmPSB+UE5HX0lORk9fcENBTDsKLSAgIH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfaUNDUF9TVVBQT1JURUQpCi0gICAvKiBGcmVlIGFueSBpQ0NQIGVudHJ5ICovCi0jaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECi0gICBpZiAoKG1hc2sgJiBQTkdfRlJFRV9JQ0NQKSAmIGluZm9fcHRyLT5mcmVlX21lKQotI2Vsc2UKLSAgIGlmIChtYXNrICYgUE5HX0ZSRUVfSUNDUCkKLSNlbmRpZgotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPmljY3BfbmFtZSk7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+aWNjcF9wcm9maWxlKTsKLSAgICAgIGluZm9fcHRyLT5pY2NwX25hbWUgPSBOVUxMOwotICAgICAgaW5mb19wdHItPmljY3BfcHJvZmlsZSA9IE5VTEw7Ci0gICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX2lDQ1A7Ci0gICB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3NQTFRfU1VQUE9SVEVEKQotICAgLyogRnJlZSBhIGdpdmVuIHNQTFQgZW50cnksIG9yIChpZiBudW0gPT0gLTEpIGFsbCBzUExUIGVudHJpZXMgKi8KLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgIGlmICgobWFzayAmIFBOR19GUkVFX1NQTFQpICYgaW5mb19wdHItPmZyZWVfbWUpCi0jZWxzZQotICAgaWYgKG1hc2sgJiBQTkdfRlJFRV9TUExUKQotI2VuZGlmCi0gICB7Ci0gICAgICBpZiAobnVtICE9IC0xKQotICAgICAgewotICAgICAgICAgaWYgKGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNbbnVtXS5uYW1lKTsKLSAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzW251bV0uZW50cmllcyk7Ci0gICAgICAgICAgICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc1tudW1dLm5hbWUgPSBOVUxMOwotICAgICAgICAgICAgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNbbnVtXS5lbnRyaWVzID0gTlVMTDsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGlmIChpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW0pCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWluZm9fcHRyLT5zcGx0X3BhbGV0dGVzX251bTsgaSsrKQotICAgICAgICAgICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfU1BMVCwgaSk7Ci0KLSAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzKTsKLSAgICAgICAgICAgIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzID0gTlVMTDsKLSAgICAgICAgICAgIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzX251bSA9IDA7Ci0gICAgICAgICB9Ci0gICAgICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX3NQTFQ7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEpCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEpOwotICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhID0gTlVMTDsKLSAgIH0KLQotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfVU5LTikgJiBpbmZvX3B0ci0+ZnJlZV9tZSkKLSNlbHNlCi0gICBpZiAobWFzayAmIFBOR19GUkVFX1VOS04pCi0jZW5kaWYKLSAgIHsKLSAgICAgIGlmIChudW0gIT0gLTEpCi0gICAgICB7Ci0gICAgICAgICAgaWYgKGluZm9fcHRyLT51bmtub3duX2NodW5rcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnVua25vd25fY2h1bmtzW251bV0uZGF0YSk7Ci0gICAgICAgICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzW251bV0uZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgIGlmIChpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtKQotICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bTsgaSsrKQotICAgICAgICAgICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfVU5LTiwgaSk7Ci0KLSAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGluZm9fcHRyLT51bmtub3duX2NodW5rcyk7Ci0gICAgICAgICAgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MgPSBOVUxMOwotICAgICAgICAgICAgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSA9IDA7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2hJU1RfU1VQUE9SVEVEKQotICAgLyogRnJlZSBhbnkgaElTVCBlbnRyeSAqLwotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfSElTVCkgICYgaW5mb19wdHItPmZyZWVfbWUpCi0jZWxzZQotICAgaWYgKChtYXNrICYgUE5HX0ZSRUVfSElTVCkgJiYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfRlJFRV9ISVNUKSkKLSNlbmRpZgotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPmhpc3QpOwotICAgICAgaW5mb19wdHItPmhpc3QgPSBOVUxMOwotICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5QTkdfSU5GT19oSVNUOwotI2lmbmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19GUkVFX0hJU1Q7Ci0jZW5kaWYKLSAgIH0KLSNlbmRpZgotCi0gICAvKiBGcmVlIGFueSBQTFRFIGVudHJ5IHRoYXQgd2FzIGludGVybmFsbHkgYWxsb2NhdGVkICovCi0jaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECi0gICBpZiAoKG1hc2sgJiBQTkdfRlJFRV9QTFRFKSAmIGluZm9fcHRyLT5mcmVlX21lKQotI2Vsc2UKLSAgIGlmICgobWFzayAmIFBOR19GUkVFX1BMVEUpICYmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0ZSRUVfUExURSkpCi0jZW5kaWYKLSAgIHsKLSAgICAgIHBuZ196ZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cGFsZXR0ZSk7Ci0gICAgICBpbmZvX3B0ci0+cGFsZXR0ZSA9IE5VTEw7Ci0gICAgICBpbmZvX3B0ci0+dmFsaWQgJj0gflBOR19JTkZPX1BMVEU7Ci0jaWZuZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0ZSRUVfUExURTsKLSNlbmRpZgotICAgICAgaW5mb19wdHItPm51bV9wYWxldHRlID0gMDsKLSAgIH0KLQotI2lmIGRlZmluZWQoUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVEKQotICAgLyogRnJlZSBhbnkgaW1hZ2UgYml0cyBhdHRhY2hlZCB0byB0aGUgaW5mbyBzdHJ1Y3R1cmUgKi8KLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgIGlmICgobWFzayAmIFBOR19GUkVFX1JPV1MpICYgaW5mb19wdHItPmZyZWVfbWUpCi0jZWxzZQotICAgaWYgKG1hc2sgJiBQTkdfRlJFRV9ST1dTKQotI2VuZGlmCi0gICB7Ci0gICAgICBpZiAoaW5mb19wdHItPnJvd19wb2ludGVycykKLSAgICAgIHsKLSAgICAgICAgIGludCByb3c7Ci0gICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IChpbnQpaW5mb19wdHItPmhlaWdodDsgcm93KyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cm93X3BvaW50ZXJzW3Jvd10pOwotICAgICAgICAgICAgaW5mb19wdHItPnJvd19wb2ludGVyc1tyb3ddPU5VTEw7Ci0gICAgICAgICB9Ci0gICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+cm93X3BvaW50ZXJzKTsKLSAgICAgICAgIGluZm9fcHRyLT5yb3dfcG9pbnRlcnM9TlVMTDsKLSAgICAgIH0KLSAgICAgIGluZm9fcHRyLT52YWxpZCAmPSB+UE5HX0lORk9fSURBVDsKLSAgIH0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECi0gICBpZiAobnVtID09IC0xKQotICAgICAgaW5mb19wdHItPmZyZWVfbWUgJj0gfm1hc2s7Ci0gICBlbHNlCi0gICAgICBpbmZvX3B0ci0+ZnJlZV9tZSAmPSB+KG1hc2sgJiB+UE5HX0ZSRUVfTVVMKTsKLSNlbmRpZgotfQotCi0vKiBUaGlzIGlzIGFuIGludGVybmFsIHJvdXRpbmUgdG8gZnJlZSBhbnkgbWVtb3J5IHRoYXQgdGhlIGluZm8gc3RydWN0IGlzCi0gKiBwb2ludGluZyB0byBiZWZvcmUgcmUtdXNpbmcgaXQgb3IgZnJlZWluZyB0aGUgc3RydWN0IGl0c2VsZi4gIFJlY2FsbAotICogdGhhdCBwbmdfZnJlZSgpIGNoZWNrcyBmb3IgTlVMTCBwb2ludGVycyBmb3IgdXMuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2luZm9fZGVzdHJveShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19pbmZvX2Rlc3Ryb3kiKTsKLQotICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfQUxMLCAtMSk7Ci0KLSNpZiBkZWZpbmVkKFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+bnVtX2NodW5rX2xpc3QpCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19saXN0KTsKLSAgICAgIHBuZ19wdHItPmNodW5rX2xpc3Q9TlVMTDsKLSAgICAgIHBuZ19wdHItPm51bV9jaHVua19saXN0ID0gMDsKLSAgIH0KLSNlbmRpZgotCi0gICBwbmdfaW5mb19pbml0XzMoJmluZm9fcHRyLCBwbmdfc2l6ZW9mKHBuZ19pbmZvKSk7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkgKi8KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW9fcHRyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlcgotICogZnVuY3Rpb25zLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBmcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAqIHBvaW50ZXIgYmVmb3JlIHBuZ193cml0ZV9kZXN0cm95KCkgb3IgcG5nX3JlYWRfZGVzdHJveSgpIGFyZSBjYWxsZWQuCi0gKi8KLXBuZ192b2lkcCBQTkdBUEkKLXBuZ19nZXRfaW9fcHRyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuIChOVUxMKTsKLSAgIHJldHVybiAocG5nX3B0ci0+aW9fcHRyKTsKLX0KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCi0jaWYgIWRlZmluZWQoUE5HX05PX1NURElPKQotLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnB1dC9vdXRwdXQgZnVuY3Rpb25zIGZvciB0aGUgUE5HIGZpbGUuICBJZiB5b3UKLSAqIHVzZSB5b3VyIG93biByZWFkIG9yIHdyaXRlIHJvdXRpbmVzLCB5b3UgY2FuIGNhbGwgZWl0aGVyIHBuZ19zZXRfcmVhZF9mbigpCi0gKiBvciBwbmdfc2V0X3dyaXRlX2ZuKCkgaW5zdGVhZCBvZiBwbmdfaW5pdF9pbygpLiAgSWYgeW91IGhhdmUgZGVmaW5lZAotICogUE5HX05PX1NURElPLCB5b3UgbXVzdCB1c2UgYSBmdW5jdGlvbiBvZiB5b3VyIG93biBiZWNhdXNlICJGSUxFICoiIGlzbid0Ci0gKiBuZWNlc3NhcmlseSBhdmFpbGFibGUuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfaW5pdF9pbyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfRklMRV9wIGZwKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaW5pdF9pbyIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19wdHItPmlvX3B0ciA9IChwbmdfdm9pZHApZnA7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQpCi0vKiBDb252ZXJ0IHRoZSBzdXBwbGllZCB0aW1lIGludG8gYW4gUkZDIDExMjMgc3RyaW5nIHN1aXRhYmxlIGZvciB1c2UgaW4KLSAqIGEgIkNyZWF0aW9uIFRpbWUiIG9yIG90aGVyIHRleHQtYmFzZWQgdGltZSBzdHJpbmcuCi0gKi8KLXBuZ19jaGFycCBQTkdBUEkKLXBuZ19jb252ZXJ0X3RvX3JmYzExMjMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3RpbWVwIHB0aW1lKQotewotICAgc3RhdGljIFBOR19DT05TVCBjaGFyIHNob3J0X21vbnRoc1sxMl1bNF0gPQotICAgICAgICB7IkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKLSAgICAgICAgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJ9OwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuIChOVUxMKTsKLSAgIGlmIChwbmdfcHRyLT50aW1lX2J1ZmZlciA9PSBOVUxMKQotICAgewotICAgICAgcG5nX3B0ci0+dGltZV9idWZmZXIgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2MocG5nX3B0ciwgKHBuZ191aW50XzMyKSgyOSoKLSAgICAgICAgIHBuZ19zaXplb2YoY2hhcikpKTsKLSAgIH0KLQotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKLSAgIHsKLSAgICAgIHdjaGFyX3QgdGltZV9idWZbMjldOwotICAgICAgd3NwcmludGYodGltZV9idWYsIFRFWFQoIiVkICVTICVkICUwMmQ6JTAyZDolMDJkICswMDAwIiksCi0gICAgICAgICAgcHRpbWUtPmRheSAlIDMyLCBzaG9ydF9tb250aHNbKHB0aW1lLT5tb250aCAtIDEpICUgMTJdLAotICAgICAgICBwdGltZS0+eWVhciwgcHRpbWUtPmhvdXIgJSAyNCwgcHRpbWUtPm1pbnV0ZSAlIDYwLAotICAgICAgICAgIHB0aW1lLT5zZWNvbmQgJSA2MSk7Ci0gICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdGltZV9idWYsIC0xLCBwbmdfcHRyLT50aW1lX2J1ZmZlciwgMjksCi0gICAgICAgICAgTlVMTCwgTlVMTCk7Ci0gICB9Ci0jZWxzZQotI2lmZGVmIFVTRV9GQVJfS0VZV09SRAotICAgewotICAgICAgY2hhciBuZWFyX3RpbWVfYnVmWzI5XTsKLSAgICAgIHBuZ19zbnByaW50ZjYobmVhcl90aW1lX2J1ZiwgMjksICIlZCAlcyAlZCAlMDJkOiUwMmQ6JTAyZCArMDAwMCIsCi0gICAgICAgICAgcHRpbWUtPmRheSAlIDMyLCBzaG9ydF9tb250aHNbKHB0aW1lLT5tb250aCAtIDEpICUgMTJdLAotICAgICAgICAgIHB0aW1lLT55ZWFyLCBwdGltZS0+aG91ciAlIDI0LCBwdGltZS0+bWludXRlICUgNjAsCi0gICAgICAgICAgcHRpbWUtPnNlY29uZCAlIDYxKTsKLSAgICAgIHBuZ19tZW1jcHkocG5nX3B0ci0+dGltZV9idWZmZXIsIG5lYXJfdGltZV9idWYsCi0gICAgICAgICAgMjkqcG5nX3NpemVvZihjaGFyKSk7Ci0gICB9Ci0jZWxzZQotICAgcG5nX3NucHJpbnRmNihwbmdfcHRyLT50aW1lX2J1ZmZlciwgMjksICIlZCAlcyAlZCAlMDJkOiUwMmQ6JTAyZCArMDAwMCIsCi0gICAgICAgcHRpbWUtPmRheSAlIDMyLCBzaG9ydF9tb250aHNbKHB0aW1lLT5tb250aCAtIDEpICUgMTJdLAotICAgICAgIHB0aW1lLT55ZWFyLCBwdGltZS0+aG91ciAlIDI0LCBwdGltZS0+bWludXRlICUgNjAsCi0gICAgICAgcHRpbWUtPnNlY29uZCAlIDYxKTsKLSNlbmRpZgotI2VuZGlmIC8qIF9XSU4zMl9XQ0UgKi8KLSAgIHJldHVybiAoKHBuZ19jaGFycClwbmdfcHRyLT50aW1lX2J1ZmZlcik7Ci19Ci0jZW5kaWYgLyogUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQgKi8KLQotI2VuZGlmIC8qIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpICovCi0KLXBuZ19jaGFycCBQTkdBUEkKLXBuZ19nZXRfY29weXJpZ2h0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfcHRyID0gcG5nX3B0cjsgIC8qIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZyBhYm91dCB1bnVzZWQgcG5nX3B0ciAqLwotICAgcmV0dXJuICgocG5nX2NoYXJwKSAiXG4gbGlicG5nIHZlcnNpb24gMS4yLjM3IC0gSnVuZSA0LCAyMDA5XG5cCi0gICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb25cblwKLSAgIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3IEFuZHJlYXMgRGlsZ2VyXG5cCi0gICBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy5cbiIpOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIHJldHVybiB0aGUgbGlicmFyeSB2ZXJzaW9uIGFzIGEgc2hvcnQgc3RyaW5nIGluIHRoZQotICogZm9ybWF0IDEuMC4wIHRocm91Z2ggOTkuOTkuOTl6ei4gIFRvIGdldCB0aGUgdmVyc2lvbiBvZiAqLmggZmlsZXMKLSAqIHVzZWQgd2l0aCB5b3VyIGFwcGxpY2F0aW9uLCBwcmludCBvdXQgUE5HX0xJQlBOR19WRVJfU1RSSU5HLCB3aGljaAotICogaXMgZGVmaW5lZCBpbiBwbmcuaC4KLSAqIE5vdGU6IG5vdyB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gcG5nX2dldF9saWJwbmdfdmVyKCkgYW5kCi0gKiBwbmdfZ2V0X2hlYWRlcl92ZXIoKS4gIER1ZSB0byB0aGUgdmVyc2lvbl9ubl9ubl9ubiB0eXBlZGVmIGd1YXJkLAotICogaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHBuZy5jIHVzZXMgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiBwbmcuaC4KLSAqLwotcG5nX2NoYXJwIFBOR0FQSQotcG5nX2dldF9saWJwbmdfdmVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICAvKiBWZXJzaW9uIG9mICouYyBmaWxlcyB1c2VkIHdoZW4gYnVpbGRpbmcgbGlicG5nICovCi0gICBwbmdfcHRyID0gcG5nX3B0cjsgIC8qIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZyBhYm91dCB1bnVzZWQgcG5nX3B0ciAqLwotICAgcmV0dXJuICgocG5nX2NoYXJwKSBQTkdfTElCUE5HX1ZFUl9TVFJJTkcpOwotfQotCi1wbmdfY2hhcnAgUE5HQVBJCi1wbmdfZ2V0X2hlYWRlcl92ZXIocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIC8qIFZlcnNpb24gb2YgKi5oIGZpbGVzIHVzZWQgd2hlbiBidWlsZGluZyBsaWJwbmcgKi8KLSAgIHBuZ19wdHIgPSBwbmdfcHRyOyAgLyogU2lsZW5jZSBjb21waWxlciB3YXJuaW5nIGFib3V0IHVudXNlZCBwbmdfcHRyICovCi0gICByZXR1cm4gKChwbmdfY2hhcnApIFBOR19MSUJQTkdfVkVSX1NUUklORyk7Ci19Ci0KLXBuZ19jaGFycCBQTkdBUEkKLXBuZ19nZXRfaGVhZGVyX3ZlcnNpb24ocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIC8qIFJldHVybnMgbG9uZ2VyIHN0cmluZyBjb250YWluaW5nIGJvdGggdmVyc2lvbiBhbmQgZGF0ZSAqLwotICAgcG5nX3B0ciA9IHBuZ19wdHI7ICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBuZ19wdHIgKi8KLSAgIHJldHVybiAoKHBuZ19jaGFycCkgUE5HX0hFQURFUl9WRVJTSU9OX1NUUklORwotI2lmbmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLSAgICIgICAgIChOTyBSRUFEIFNVUFBPUlQpIgotI2VuZGlmCi0gICAiXG4iKTsKLX0KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCi0jaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAotaW50IFBOR0FQSQotcG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBjaHVua19uYW1lKQotewotICAgLyogQ2hlY2sgY2h1bmtfbmFtZSBhbmQgcmV0dXJuICJrZWVwIiB2YWx1ZSBpZiBpdCdzIG9uIHRoZSBsaXN0LCBlbHNlIDAgKi8KLSAgIGludCBpOwotICAgcG5nX2J5dGVwIHA7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGNodW5rX25hbWUgPT0gTlVMTCB8fCBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdDw9MCkKLSAgICAgIHJldHVybiAwOwotICAgcCA9IHBuZ19wdHItPmNodW5rX2xpc3QgKyBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdCo1IC0gNTsKLSAgIGZvciAoaSA9IHBuZ19wdHItPm51bV9jaHVua19saXN0OyBpOyBpLS0sIHAgLT0gNSkKLSAgICAgIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwLCA0KSkKLSAgICAgICAgcmV0dXJuICgoaW50KSoocCArIDQpKTsKLSAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24sIGFkZGVkIHRvIGxpYnBuZy0xLjAuNmcsIGlzIHVudGVzdGVkLiAqLwotaW50IFBOR0FQSQotcG5nX3Jlc2V0X3pzdHJlYW0ocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICByZXR1cm4gKGluZmxhdGVSZXNldCgmcG5nX3B0ci0+enN0cmVhbSkpOwotfQotI2VuZGlmIC8qIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGxpYnBuZy0xLjAuNyAqLwotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfYWNjZXNzX3ZlcnNpb25fbnVtYmVyKHZvaWQpCi17Ci0gICAvKiBWZXJzaW9uIG9mICouYyBmaWxlcyB1c2VkIHdoZW4gYnVpbGRpbmcgbGlicG5nICovCi0gICByZXR1cm4oKHBuZ191aW50XzMyKSBQTkdfTElCUE5HX1ZFUik7Ci19Ci0KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQpCi0jaWYgIWRlZmluZWQoUE5HXzFfMF9YKQotLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuMi4wICovCi1pbnQgUE5HQVBJCi1wbmdfbW14X3N1cHBvcnQodm9pZCkKLXsKLSAgIC8qIE9ic29sZXRlLCB0byBiZSByZW1vdmVkIGZyb20gbGlicG5nLTEuNC4wICovCi0gICAgcmV0dXJuIC0xOwotfQotI2VuZGlmIC8qIFBOR18xXzBfWCAqLwotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAmJiBQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVEICovCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQotI2lmZGVmIFBOR19TSVpFX1QKLS8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuMi42ICovCi0gICBQTkdfRVhURVJOIHBuZ19zaXplX3QgUE5HQVBJIHBuZ19jb252ZXJ0X3NpemUgUE5HQVJHKChzaXplX3Qgc2l6ZSkpOwotcG5nX3NpemVfdCBQTkdBUEkKLXBuZ19jb252ZXJ0X3NpemUoc2l6ZV90IHNpemUpCi17Ci0gICBpZiAoc2l6ZSA+IChwbmdfc2l6ZV90KS0xKQotICAgICAgUE5HX0FCT1JUKCk7ICAvKiBXZSBoYXZlbid0IGdvdCBhY2Nlc3MgdG8gcG5nX3B0ciwgc28gbm8gcG5nX2Vycm9yKCkgKi8KLSAgIHJldHVybiAoKHBuZ19zaXplX3Qpc2l6ZSk7Ci19Ci0jZW5kaWYgLyogUE5HX1NJWkVfVCAqLwotCi0vKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjIuMzQgYW5kIDEuNC4wIChtb3ZlZCBmcm9tIHBuZ3NldC5jKSAqLwotI2lmIGRlZmluZWQoUE5HX2NIUk1fU1VQUE9SVEVEKQotI2lmICFkZWZpbmVkKFBOR19OT19DSEVDS19jSFJNKQotCi0vKgotICogICAgTXVsdGlwbHkgdHdvIDMyLWJpdCBudW1iZXJzLCBWMSBhbmQgVjIsIHVzaW5nIDMyLWJpdAotICogICAgYXJpdGhtZXRpYywgdG8gcHJvZHVjZSBhIDY0IGJpdCByZXN1bHQgaW4gdGhlIEhJL0xPIHdvcmRzLgotICoKLSAqICAgICAgICAgICAgICAgICAgQSBCCi0gKiAgICAgICAgICAgICAgICB4IEMgRAotICogICAgICAgICAgICAgICAtLS0tLS0KLSAqICAgICAgICAgICAgICBBRCB8fCBCRAotICogICAgICAgIEFDIHx8IENCIHx8IDAKLSAqCi0gKiAgICB3aGVyZSBBIGFuZCBCIGFyZSB0aGUgaGlnaCBhbmQgbG93IDE2LWJpdCB3b3JkcyBvZiBWMSwKLSAqICAgIEMgYW5kIEQgYXJlIHRoZSAxNi1iaXQgd29yZHMgb2YgVjIsIEFEIGlzIHRoZSBwcm9kdWN0IG9mCi0gKiAgICBBIGFuZCBELCBhbmQgWCB8fCBZIGlzIChYIDw8IDE2KSArIFkuCi0qLwotCi12b2lkIHBuZ182NGJpdF9wcm9kdWN0IChsb25nIHYxLCBsb25nIHYyLCB1bnNpZ25lZCBsb25nICpoaV9wcm9kdWN0LAotICAgdW5zaWduZWQgbG9uZyAqbG9fcHJvZHVjdCkKLXsKLSAgIGludCBhLCBiLCBjLCBkOwotICAgbG9uZyBsbywgaGksIHgsIHk7Ci0KLSAgIGEgPSAodjEgPj4gMTYpICYgMHhmZmZmOwotICAgYiA9IHYxICYgMHhmZmZmOwotICAgYyA9ICh2MiA+PiAxNikgJiAweGZmZmY7Ci0gICBkID0gdjIgJiAweGZmZmY7Ci0KLSAgIGxvID0gYiAqIGQ7ICAgICAgICAgICAgICAgICAgIC8qIEJEICovCi0gICB4ID0gYSAqIGQgKyBjICogYjsgICAgICAgICAgICAvKiBBRCArIENCICovCi0gICB5ID0gKChsbyA+PiAxNikgJiAweGZmZmYpICsgeDsKLQotICAgbG8gPSAobG8gJiAweGZmZmYpIHwgKCh5ICYgMHhmZmZmKSA8PCAxNik7Ci0gICBoaSA9ICh5ID4+IDE2KSAmIDB4ZmZmZjsKLQotICAgaGkgKz0gYSAqIGM7ICAgICAgICAgICAgICAgICAgLyogQUMgKi8KLQotICAgKmhpX3Byb2R1Y3QgPSAodW5zaWduZWQgbG9uZyloaTsKLSAgICpsb19wcm9kdWN0ID0gKHVuc2lnbmVkIGxvbmcpbG87Ci19Ci0KLWludCAvKiBwcml2YXRlICovCi1wbmdfY2hlY2tfY0hSTV9maXhlZChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2ZpeGVkX3BvaW50IHdoaXRlX3gsIHBuZ19maXhlZF9wb2ludCB3aGl0ZV95LCBwbmdfZml4ZWRfcG9pbnQgcmVkX3gsCi0gICBwbmdfZml4ZWRfcG9pbnQgcmVkX3ksIHBuZ19maXhlZF9wb2ludCBncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW5feSwKLSAgIHBuZ19maXhlZF9wb2ludCBibHVlX3gsIHBuZ19maXhlZF9wb2ludCBibHVlX3kpCi17Ci0gICBpbnQgcmV0ID0gMTsKLSAgIHVuc2lnbmVkIGxvbmcgeHlfaGkseHlfbG8seXhfaGkseXhfbG87Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gZnVuY3Rpb24gcG5nX2NoZWNrX2NIUk1fZml4ZWQiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gMDsKLQotICAgaWYgKHdoaXRlX3ggPCAwIHx8IHdoaXRlX3kgPD0gMCB8fAotICAgICAgICAgcmVkX3ggPCAwIHx8ICAgcmVkX3kgPCAgMCB8fAotICAgICAgIGdyZWVuX3ggPCAwIHx8IGdyZWVuX3kgPCAgMCB8fAotICAgICAgICBibHVlX3ggPCAwIHx8ICBibHVlX3kgPCAgMCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICJJZ25vcmluZyBhdHRlbXB0IHRvIHNldCBuZWdhdGl2ZSBjaHJvbWF0aWNpdHkgdmFsdWUiKTsKLSAgICAgIHJldCA9IDA7Ci0gICB9Ci0gICBpZiAod2hpdGVfeCA+IChwbmdfZml4ZWRfcG9pbnQpIFBOR19VSU5UXzMxX01BWCB8fAotICAgICAgIHdoaXRlX3kgPiAocG5nX2ZpeGVkX3BvaW50KSBQTkdfVUlOVF8zMV9NQVggfHwKLSAgICAgICAgIHJlZF94ID4gKHBuZ19maXhlZF9wb2ludCkgUE5HX1VJTlRfMzFfTUFYIHx8Ci0gICAgICAgICByZWRfeSA+IChwbmdfZml4ZWRfcG9pbnQpIFBOR19VSU5UXzMxX01BWCB8fAotICAgICAgIGdyZWVuX3ggPiAocG5nX2ZpeGVkX3BvaW50KSBQTkdfVUlOVF8zMV9NQVggfHwKLSAgICAgICBncmVlbl95ID4gKHBuZ19maXhlZF9wb2ludCkgUE5HX1VJTlRfMzFfTUFYIHx8Ci0gICAgICAgIGJsdWVfeCA+IChwbmdfZml4ZWRfcG9pbnQpIFBOR19VSU5UXzMxX01BWCB8fAotICAgICAgICBibHVlX3kgPiAocG5nX2ZpeGVkX3BvaW50KSBQTkdfVUlOVF8zMV9NQVggKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgIklnbm9yaW5nIGF0dGVtcHQgdG8gc2V0IGNocm9tYXRpY2l0eSB2YWx1ZSBleGNlZWRpbmcgMjE0NzQuODMiKTsKLSAgICAgIHJldCA9IDA7Ci0gICB9Ci0gICBpZiAod2hpdGVfeCA+IDEwMDAwMEwgLSB3aGl0ZV95KQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgY0hSTSB3aGl0ZSBwb2ludCIpOwotICAgICAgcmV0ID0gMDsKLSAgIH0KLSAgIGlmIChyZWRfeCA+IDEwMDAwMEwgLSByZWRfeSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNIUk0gcmVkIHBvaW50Iik7Ci0gICAgICByZXQgPSAwOwotICAgfQotICAgaWYgKGdyZWVuX3ggPiAxMDAwMDBMIC0gZ3JlZW5feSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNIUk0gZ3JlZW4gcG9pbnQiKTsKLSAgICAgIHJldCA9IDA7Ci0gICB9Ci0gICBpZiAoYmx1ZV94ID4gMTAwMDAwTCAtIGJsdWVfeSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNIUk0gYmx1ZSBwb2ludCIpOwotICAgICAgcmV0ID0gMDsKLSAgIH0KLQotICAgcG5nXzY0Yml0X3Byb2R1Y3QoZ3JlZW5feCAtIHJlZF94LCBibHVlX3kgLSByZWRfeSwgJnh5X2hpLCAmeHlfbG8pOwotICAgcG5nXzY0Yml0X3Byb2R1Y3QoZ3JlZW5feSAtIHJlZF95LCBibHVlX3ggLSByZWRfeCwgJnl4X2hpLCAmeXhfbG8pOwotCi0gICBpZiAoeHlfaGkgPT0geXhfaGkgJiYgeHlfbG8gPT0geXhfbG8pCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgIklnbm9yaW5nIGF0dGVtcHQgdG8gc2V0IGNIUk0gUkdCIHRyaWFuZ2xlIHdpdGggemVybyBhcmVhIik7Ci0gICAgICByZXQgPSAwOwotICAgfQotCi0gICByZXR1cm4gcmV0OwotfQotI2VuZGlmIC8qIE5PX1BOR19DSEVDS19jSFJNICovCi0jZW5kaWYgLyogUE5HX2NIUk1fU1VQUE9SVEVEICovCi0jZW5kaWYgLyogZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkgKi8KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3BuZy5oIGIvbGlicy9saWJwbmcvcG5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYzhjZWYuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjg3ICswLDAgQEAKLS8qIHBuZy5oIC0gaGVhZGVyIGZpbGUgZm9yIFBORyByZWZlcmVuY2UgbGlicmFyeQotICoKLSAqIGxpYnBuZyB2ZXJzaW9uIDEuMi4zNyAtIEp1bmUgNCwgMjAwOQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBBdXRob3JzIGFuZCBtYWludGFpbmVyczoKLSAqICBsaWJwbmcgdmVyc2lvbnMgMC43MSwgTWF5IDE5OTUsIHRocm91Z2ggMC44OCwgSmFudWFyeSAxOTk2OiBHdXkgU2NoYWxuYXQKLSAqICBsaWJwbmcgdmVyc2lvbnMgMC44OWMsIEp1bmUgMTk5NiwgdGhyb3VnaCAwLjk2LCBNYXkgMTk5NzogQW5kcmVhcyBEaWxnZXIKLSAqICBsaWJwbmcgdmVyc2lvbnMgMC45NywgSmFudWFyeSAxOTk4LCB0aHJvdWdoIDEuMi4zNyAtIEp1bmUgNCwgMjAwOTogR2xlbm4KLSAqICBTZWUgYWxzbyAiQ29udHJpYnV0aW5nIEF1dGhvcnMiLCBiZWxvdy4KLSAqCi0gKiBOb3RlIGFib3V0IGxpYnBuZyB2ZXJzaW9uIG51bWJlcnM6Ci0gKgotICogICAgRHVlIHRvIHZhcmlvdXMgbWlzY29tbXVuaWNhdGlvbnMsIHVuZm9yZXNlZW4gY29kZSBpbmNvbXBhdGliaWxpdGllcwotICogICAgYW5kIG9jY2FzaW9uYWwgZmFjdG9ycyBvdXRzaWRlIHRoZSBhdXRob3JzJyBjb250cm9sLCB2ZXJzaW9uIG51bWJlcmluZwotICogICAgb24gdGhlIGxpYnJhcnkgaGFzIG5vdCBhbHdheXMgYmVlbiBjb25zaXN0ZW50IGFuZCBzdHJhaWdodGZvcndhcmQuCi0gKiAgICBUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgbWF0dGVycyBzaW5jZSB2ZXJzaW9uIDAuODljLCB3aGljaCB3YXMKLSAqICAgIHRoZSBmaXJzdCB3aWRlbHkgdXNlZCByZWxlYXNlOgotICoKLSAqICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgcG5nLmggIHBuZy5oICBzaGFyZWQtbGliCi0gKiAgICB2ZXJzaW9uICAgICAgICAgICAgICAgIHN0cmluZyAgIGludCAgdmVyc2lvbgotICogICAgLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0gLS0tLS0gIC0tLS0tLS0tLS0KLSAqICAgIDAuODljICIxLjAgYmV0YSAzIiAgICAgMC44OSAgICAgIDg5ICAxLjAuODkKLSAqICAgIDAuOTAgICIxLjAgYmV0YSA0IiAgICAgMC45MCAgICAgIDkwICAwLjkwICBbc2hvdWxkIGhhdmUgYmVlbiAyLjAuOTBdCi0gKiAgICAwLjk1ICAiMS4wIGJldGEgNSIgICAgIDAuOTUgICAgICA5NSAgMC45NSAgW3Nob3VsZCBoYXZlIGJlZW4gMi4wLjk1XQotICogICAgMC45NiAgIjEuMCBiZXRhIDYiICAgICAwLjk2ICAgICAgOTYgIDAuOTYgIFtzaG91bGQgaGF2ZSBiZWVuIDIuMC45Nl0KLSAqICAgIDAuOTdiICIxLjAwLjk3IGJldGEgNyIgMS4wMC45NyAgIDk3ICAxLjAuMSBbc2hvdWxkIGhhdmUgYmVlbiAyLjAuOTddCi0gKiAgICAwLjk3YyAgICAgICAgICAgICAgICAgIDAuOTcgICAgICA5NyAgMi4wLjk3Ci0gKiAgICAwLjk4ICAgICAgICAgICAgICAgICAgIDAuOTggICAgICA5OCAgMi4wLjk4Ci0gKiAgICAwLjk5ICAgICAgICAgICAgICAgICAgIDAuOTkgICAgICA5OCAgMi4wLjk5Ci0gKiAgICAwLjk5YS1tICAgICAgICAgICAgICAgIDAuOTkgICAgICA5OSAgMi4wLjk5Ci0gKiAgICAxLjAwICAgICAgICAgICAgICAgICAgIDEuMDAgICAgIDEwMCAgMi4xLjAgWzEwMCBzaG91bGQgYmUgMTAwMDBdCi0gKiAgICAxLjAuMCAgICAgIChmcm9tIGhlcmUgb24sIHRoZSAgIDEwMCAgMi4xLjAgWzEwMCBzaG91bGQgYmUgMTAwMDBdCi0gKiAgICAxLjAuMSAgICAgICBwbmcuaCBzdHJpbmcgaXMgICAxMDAwMSAgMi4xLjAKLSAqICAgIDEuMC4xYS1lICAgIGlkZW50aWNhbCB0byB0aGUgIDEwMDAyICBmcm9tIGhlcmUgb24sIHRoZSBzaGFyZWQgbGlicmFyeQotICogICAgMS4wLjIgICAgICAgc291cmNlIHZlcnNpb24pICAgMTAwMDIgIGlzIDIuViB3aGVyZSBWIGlzIHRoZSBzb3VyY2UgY29kZQotICogICAgMS4wLjJhLWIgICAgICAgICAgICAgICAgICAgICAgMTAwMDMgIHZlcnNpb24sIGV4Y2VwdCBhcyBub3RlZC4KLSAqICAgIDEuMC4zICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAzCi0gKiAgICAxLjAuM2EtZCAgICAgICAgICAgICAgICAgICAgICAxMDAwNAotICogICAgMS4wLjQgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDQKLSAqICAgIDEuMC40YS1mICAgICAgICAgICAgICAgICAgICAgIDEwMDA1Ci0gKiAgICAxLjAuNSAoKyAyIHBhdGNoZXMpICAgICAgICAgICAxMDAwNQotICogICAgMS4wLjVhLWQgICAgICAgICAgICAgICAgICAgICAgMTAwMDYKLSAqICAgIDEuMC41ZS1yICAgICAgICAgICAgICAgICAgICAgIDEwMTAwIChub3Qgc291cmNlIGNvbXBhdGlibGUpCi0gKiAgICAxLjAuNXMtdiAgICAgICAgICAgICAgICAgICAgICAxMDAwNiAobm90IGJpbmFyeSBjb21wYXRpYmxlKQotICogICAgMS4wLjYgKCsgMyBwYXRjaGVzKSAgICAgICAgICAgMTAwMDYgKHN0aWxsIGJpbmFyeSBpbmNvbXBhdGlibGUpCi0gKiAgICAxLjAuNmQtZiAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAoc3RpbGwgYmluYXJ5IGluY29tcGF0aWJsZSkKLSAqICAgIDEuMC42ZyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDA3Ci0gKiAgICAxLjAuNmggICAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMTAuNmggKHRlc3RpbmcgeHkueiBzby1udW1iZXJpbmcpCi0gKiAgICAxLjAuNmkgICAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMTAuNmkKLSAqICAgIDEuMC42aiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDA3ICAyLjEuMC42aiAoaW5jb21wYXRpYmxlIHdpdGggMS4wLjApCi0gKiAgICAxLjAuN2JldGExMS0xNCAgICAgICAgRExMTlVNICAxMDAwNyAgMi4xLjAuN2JldGExMS0xNCAoYmluYXJ5IGNvbXBhdGlibGUpCi0gKiAgICAxLjAuN2JldGExNS0xOCAgICAgICAgICAgMSAgICAxMDAwNyAgMi4xLjAuN2JldGExNS0xOCAoYmluYXJ5IGNvbXBhdGlibGUpCi0gKiAgICAxLjAuN3JjMS0yICAgICAgICAgICAgICAgMSAgICAxMDAwNyAgMi4xLjAuN3JjMS0yIChiaW5hcnkgY29tcGF0aWJsZSkKLSAqICAgIDEuMC43ICAgICAgICAgICAgICAgICAgICAxICAgIDEwMDA3ICAoc3RpbGwgY29tcGF0aWJsZSkKLSAqICAgIDEuMC44YmV0YTEtNCAgICAgICAgICAgICAxICAgIDEwMDA4ICAyLjEuMC44YmV0YTEtNAotICogICAgMS4wLjhyYzEgICAgICAgICAgICAgICAgIDEgICAgMTAwMDggIDIuMS4wLjhyYzEKLSAqICAgIDEuMC44ICAgICAgICAgICAgICAgICAgICAxICAgIDEwMDA4ICAyLjEuMC44Ci0gKiAgICAxLjAuOWJldGExLTYgICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOWJldGExLTYKLSAqICAgIDEuMC45cmMxICAgICAgICAgICAgICAgICAxICAgIDEwMDA5ICAyLjEuMC45cmMxCi0gKiAgICAxLjAuOWJldGE3LTEwICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOWJldGE3LTEwCi0gKiAgICAxLjAuOXJjMiAgICAgICAgICAgICAgICAgMSAgICAxMDAwOSAgMi4xLjAuOXJjMgotICogICAgMS4wLjkgICAgICAgICAgICAgICAgICAgIDEgICAgMTAwMDkgIDIuMS4wLjkKLSAqICAgIDEuMC4xMGJldGExICAgICAgICAgICAgICAxICAgIDEwMDEwICAyLjEuMC4xMGJldGExCi0gKiAgICAxLjAuMTByYzEgICAgICAgICAgICAgICAgMSAgICAxMDAxMCAgMi4xLjAuMTByYzEKLSAqICAgIDEuMC4xMCAgICAgICAgICAgICAgICAgICAxICAgIDEwMDEwICAyLjEuMC4xMAotICogICAgMS4wLjExYmV0YTEtMyAgICAgICAgICAgIDEgICAgMTAwMTEgIDIuMS4wLjExYmV0YTEtMwotICogICAgMS4wLjExcmMxICAgICAgICAgICAgICAgIDEgICAgMTAwMTEgIDIuMS4wLjExcmMxCi0gKiAgICAxLjAuMTEgICAgICAgICAgICAgICAgICAgMSAgICAxMDAxMSAgMi4xLjAuMTEKLSAqICAgIDEuMC4xMmJldGExLTIgICAgICAgICAgICAyICAgIDEwMDEyICAyLjEuMC4xMmJldGExLTIKLSAqICAgIDEuMC4xMnJjMSAgICAgICAgICAgICAgICAyICAgIDEwMDEyICAyLjEuMC4xMnJjMQotICogICAgMS4wLjEyICAgICAgICAgICAgICAgICAgIDIgICAgMTAwMTIgIDIuMS4wLjEyCi0gKiAgICAxLjEuMGEtZiAgICAgICAgICAgICAgICAgLSAgICAxMDEwMCAgMi4xLjEuMGEtZiAoYnJhbmNoIGFiYW5kb25lZCkKLSAqICAgIDEuMi4wYmV0YTEtMiAgICAgICAgICAgICAyICAgIDEwMjAwICAyLjEuMi4wYmV0YTEtMgotICogICAgMS4yLjBiZXRhMy01ICAgICAgICAgICAgIDMgICAgMTAyMDAgIDMuMS4yLjBiZXRhMy01Ci0gKiAgICAxLjIuMHJjMSAgICAgICAgICAgICAgICAgMyAgICAxMDIwMCAgMy4xLjIuMHJjMQotICogICAgMS4yLjAgICAgICAgICAgICAgICAgICAgIDMgICAgMTAyMDAgIDMuMS4yLjAKLSAqICAgIDEuMi4xYmV0YTEtNCAgICAgICAgICAgICAzICAgIDEwMjAxICAzLjEuMi4xYmV0YTEtNAotICogICAgMS4yLjFyYzEtMiAgICAgICAgICAgICAgIDMgICAgMTAyMDEgIDMuMS4yLjFyYzEtMgotICogICAgMS4yLjEgICAgICAgICAgICAgICAgICAgIDMgICAgMTAyMDEgIDMuMS4yLjEKLSAqICAgIDEuMi4yYmV0YTEtNiAgICAgICAgICAgIDEyICAgIDEwMjAyICAxMi5zby4wLjEuMi4yYmV0YTEtNgotICogICAgMS4wLjEzYmV0YTEgICAgICAgICAgICAgMTAgICAgMTAwMTMgIDEwLnNvLjAuMS4wLjEzYmV0YTEKLSAqICAgIDEuMC4xM3JjMSAgICAgICAgICAgICAgIDEwICAgIDEwMDEzICAxMC5zby4wLjEuMC4xM3JjMQotICogICAgMS4yLjJyYzEgICAgICAgICAgICAgICAgMTIgICAgMTAyMDIgIDEyLnNvLjAuMS4yLjJyYzEKLSAqICAgIDEuMC4xMyAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDEzICAxMC5zby4wLjEuMC4xMwotICogICAgMS4yLjIgICAgICAgICAgICAgICAgICAgMTIgICAgMTAyMDIgIDEyLnNvLjAuMS4yLjIKLSAqICAgIDEuMi4zcmMxLTYgICAgICAgICAgICAgIDEyICAgIDEwMjAzICAxMi5zby4wLjEuMi4zcmMxLTYKLSAqICAgIDEuMi4zICAgICAgICAgICAgICAgICAgIDEyICAgIDEwMjAzICAxMi5zby4wLjEuMi4zCi0gKiAgICAxLjIuNGJldGExLTMgICAgICAgICAgICAxMyAgICAxMDIwNCAgMTIuc28uMC4xLjIuNGJldGExLTMKLSAqICAgIDEuMC4xNHJjMSAgICAgICAgICAgICAgIDEzICAgIDEwMDE0ICAxMC5zby4wLjEuMC4xNHJjMQotICogICAgMS4yLjRyYzEgICAgICAgICAgICAgICAgMTMgICAgMTAyMDQgIDEyLnNvLjAuMS4yLjRyYzEKLSAqICAgIDEuMC4xNCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE0ICAxMC5zby4wLjEuMC4xNAotICogICAgMS4yLjQgICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMDQgIDEyLnNvLjAuMS4yLjQKLSAqICAgIDEuMi41YmV0YTEtMiAgICAgICAgICAgIDEzICAgIDEwMjA1ICAxMi5zby4wLjEuMi41YmV0YTEtMgotICogICAgMS4wLjE1cmMxLTMgICAgICAgICAgICAgMTAgICAgMTAwMTUgIDEwLnNvLjAuMS4wLjE1cmMxLTMKLSAqICAgIDEuMi41cmMxLTMgICAgICAgICAgICAgIDEzICAgIDEwMjA1ICAxMi5zby4wLjEuMi41cmMxLTMKLSAqICAgIDEuMC4xNSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE1ICAxMC5zby4wLjEuMC4xNQotICogICAgMS4yLjUgICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMDUgIDEyLnNvLjAuMS4yLjUKLSAqICAgIDEuMi42YmV0YTEtNCAgICAgICAgICAgIDEzICAgIDEwMjA2ICAxMi5zby4wLjEuMi42YmV0YTEtNAotICogICAgMS4wLjE2ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMTYgIDEwLnNvLjAuMS4wLjE2Ci0gKiAgICAxLjIuNiAgICAgICAgICAgICAgICAgICAxMyAgICAxMDIwNiAgMTIuc28uMC4xLjIuNgotICogICAgMS4yLjdiZXRhMS0yICAgICAgICAgICAgMTMgICAgMTAyMDcgIDEyLnNvLjAuMS4yLjdiZXRhMS0yCi0gKiAgICAxLjAuMTdyYzEgICAgICAgICAgICAgICAxMCAgICAxMDAxNyAgMTAuc28uMC4xLjAuMTdyYzEKLSAqICAgIDEuMi43cmMxICAgICAgICAgICAgICAgIDEzICAgIDEwMjA3ICAxMi5zby4wLjEuMi43cmMxCi0gKiAgICAxLjAuMTcgICAgICAgICAgICAgICAgICAxMCAgICAxMDAxNyAgMTAuc28uMC4xLjAuMTcKLSAqICAgIDEuMi43ICAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjA3ICAxMi5zby4wLjEuMi43Ci0gKiAgICAxLjIuOGJldGExLTUgICAgICAgICAgICAxMyAgICAxMDIwOCAgMTIuc28uMC4xLjIuOGJldGExLTUKLSAqICAgIDEuMC4xOHJjMS01ICAgICAgICAgICAgIDEwICAgIDEwMDE4ICAxMC5zby4wLjEuMC4xOHJjMS01Ci0gKiAgICAxLjIuOHJjMS01ICAgICAgICAgICAgICAxMyAgICAxMDIwOCAgMTIuc28uMC4xLjIuOHJjMS01Ci0gKiAgICAxLjAuMTggICAgICAgICAgICAgICAgICAxMCAgICAxMDAxOCAgMTAuc28uMC4xLjAuMTgKLSAqICAgIDEuMi44ICAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjA4ICAxMi5zby4wLjEuMi44Ci0gKiAgICAxLjIuOWJldGExLTMgICAgICAgICAgICAxMyAgICAxMDIwOSAgMTIuc28uMC4xLjIuOWJldGExLTMKLSAqICAgIDEuMi45YmV0YTQtMTEgICAgICAgICAgIDEzICAgIDEwMjA5ICAxMi5zby4wLjlbLjBdCi0gKiAgICAxLjIuOXJjMSAgICAgICAgICAgICAgICAxMyAgICAxMDIwOSAgMTIuc28uMC45Wy4wXQotICogICAgMS4yLjkgICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMDkgIDEyLnNvLjAuOVsuMF0KLSAqICAgIDEuMi4xMGJldGExLTggICAgICAgICAgIDEzICAgIDEwMjEwICAxMi5zby4wLjEwWy4wXQotICogICAgMS4yLjEwcmMxLTMgICAgICAgICAgICAgMTMgICAgMTAyMTAgIDEyLnNvLjAuMTBbLjBdCi0gKiAgICAxLjIuMTAgICAgICAgICAgICAgICAgICAxMyAgICAxMDIxMCAgMTIuc28uMC4xMFsuMF0KLSAqICAgIDEuMi4xMWJldGExLTQgICAgICAgICAgIDEzICAgIDEwMjExICAxMi5zby4wLjExWy4wXQotICogICAgMS4wLjE5cmMxLTUgICAgICAgICAgICAgMTAgICAgMTAwMTkgIDEwLnNvLjAuMTlbLjBdCi0gKiAgICAxLjIuMTFyYzEtNSAgICAgICAgICAgICAxMyAgICAxMDIxMSAgMTIuc28uMC4xMVsuMF0KLSAqICAgIDEuMC4xOSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE5ICAxMC5zby4wLjE5Wy4wXQotICogICAgMS4yLjExICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMTEgIDEyLnNvLjAuMTFbLjBdCi0gKiAgICAxLjAuMjAgICAgICAgICAgICAgICAgICAxMCAgICAxMDAyMCAgMTAuc28uMC4yMFsuMF0KLSAqICAgIDEuMi4xMiAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjEyICAxMi5zby4wLjEyWy4wXQotICogICAgMS4yLjEzYmV0YTEgICAgICAgICAgICAgMTMgICAgMTAyMTMgIDEyLnNvLjAuMTNbLjBdCi0gKiAgICAxLjAuMjEgICAgICAgICAgICAgICAgICAxMCAgICAxMDAyMSAgMTAuc28uMC4yMVsuMF0KLSAqICAgIDEuMi4xMyAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjEzICAxMi5zby4wLjEzWy4wXQotICogICAgMS4yLjE0YmV0YTEtMiAgICAgICAgICAgMTMgICAgMTAyMTQgIDEyLnNvLjAuMTRbLjBdCi0gKiAgICAxLjAuMjJyYzEgICAgICAgICAgICAgICAxMCAgICAxMDAyMiAgMTAuc28uMC4yMlsuMF0KLSAqICAgIDEuMi4xNHJjMSAgICAgICAgICAgICAgIDEzICAgIDEwMjE0ICAxMi5zby4wLjE0Wy4wXQotICogICAgMS4wLjIyICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMjIgIDEwLnNvLjAuMjJbLjBdCi0gKiAgICAxLjIuMTQgICAgICAgICAgICAgICAgICAxMyAgICAxMDIxNCAgMTIuc28uMC4xNFsuMF0KLSAqICAgIDEuMi4xNWJldGExLTYgICAgICAgICAgIDEzICAgIDEwMjE1ICAxMi5zby4wLjE1Wy4wXQotICogICAgMS4wLjIzcmMxLTUgICAgICAgICAgICAgMTAgICAgMTAwMjMgIDEwLnNvLjAuMjNbLjBdCi0gKiAgICAxLjIuMTVyYzEtNSAgICAgICAgICAgICAxMyAgICAxMDIxNSAgMTIuc28uMC4xNVsuMF0KLSAqICAgIDEuMC4yMyAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDIzICAxMC5zby4wLjIzWy4wXQotICogICAgMS4yLjE1ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMTUgIDEyLnNvLjAuMTVbLjBdCi0gKiAgICAxLjIuMTZiZXRhMS0yICAgICAgICAgICAxMyAgICAxMDIxNiAgMTIuc28uMC4xNlsuMF0KLSAqICAgIDEuMi4xNnJjMSAgICAgICAgICAgICAgIDEzICAgIDEwMjE2ICAxMi5zby4wLjE2Wy4wXQotICogICAgMS4wLjI0ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMjQgIDEwLnNvLjAuMjRbLjBdCi0gKiAgICAxLjIuMTYgICAgICAgICAgICAgICAgICAxMyAgICAxMDIxNiAgMTIuc28uMC4xNlsuMF0KLSAqICAgIDEuMi4xN2JldGExLTIgICAgICAgICAgIDEzICAgIDEwMjE3ICAxMi5zby4wLjE3Wy4wXQotICogICAgMS4wLjI1cmMxICAgICAgICAgICAgICAgMTAgICAgMTAwMjUgIDEwLnNvLjAuMjVbLjBdCi0gKiAgICAxLjIuMTdyYzEtMyAgICAgICAgICAgICAxMyAgICAxMDIxNyAgMTIuc28uMC4xN1suMF0KLSAqICAgIDEuMC4yNSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDI1ICAxMC5zby4wLjI1Wy4wXQotICogICAgMS4yLjE3ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMTcgIDEyLnNvLjAuMTdbLjBdCi0gKiAgICAxLjAuMjYgICAgICAgICAgICAgICAgICAxMCAgICAxMDAyNiAgMTAuc28uMC4yNlsuMF0KLSAqICAgIDEuMi4xOCAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjE4ICAxMi5zby4wLjE4Wy4wXQotICogICAgMS4yLjE5YmV0YTEtMzEgICAgICAgICAgMTMgICAgMTAyMTkgIDEyLnNvLjAuMTlbLjBdCi0gKiAgICAxLjAuMjdyYzEtNiAgICAgICAgICAgICAxMCAgICAxMDAyNyAgMTAuc28uMC4yN1suMF0KLSAqICAgIDEuMi4xOXJjMS02ICAgICAgICAgICAgIDEzICAgIDEwMjE5ICAxMi5zby4wLjE5Wy4wXQotICogICAgMS4wLjI3ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMjcgIDEwLnNvLjAuMjdbLjBdCi0gKiAgICAxLjIuMTkgICAgICAgICAgICAgICAgICAxMyAgICAxMDIxOSAgMTIuc28uMC4xOVsuMF0KLSAqICAgIDEuMi4yMGJldGEwMS0wNCAgICAgICAgIDEzICAgIDEwMjIwICAxMi5zby4wLjIwWy4wXQotICogICAgMS4wLjI4cmMxLTYgICAgICAgICAgICAgMTAgICAgMTAwMjggIDEwLnNvLjAuMjhbLjBdCi0gKiAgICAxLjIuMjByYzEtNiAgICAgICAgICAgICAxMyAgICAxMDIyMCAgMTIuc28uMC4yMFsuMF0KLSAqICAgIDEuMC4yOCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDI4ICAxMC5zby4wLjI4Wy4wXQotICogICAgMS4yLjIwICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjAgIDEyLnNvLjAuMjBbLjBdCi0gKiAgICAxLjIuMjFiZXRhMS0yICAgICAgICAgICAxMyAgICAxMDIyMSAgMTIuc28uMC4yMVsuMF0KLSAqICAgIDEuMi4yMXJjMS0zICAgICAgICAgICAgIDEzICAgIDEwMjIxICAxMi5zby4wLjIxWy4wXQotICogICAgMS4wLjI5ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMjkgIDEwLnNvLjAuMjlbLjBdCi0gKiAgICAxLjIuMjEgICAgICAgICAgICAgICAgICAxMyAgICAxMDIyMSAgMTIuc28uMC4yMVsuMF0KLSAqICAgIDEuMi4yMmJldGExLTQgICAgICAgICAgIDEzICAgIDEwMjIyICAxMi5zby4wLjIyWy4wXQotICogICAgMS4wLjMwcmMxICAgICAgICAgICAgICAgMTAgICAgMTAwMzAgIDEwLnNvLjAuMzBbLjBdCi0gKiAgICAxLjIuMjJyYzEgICAgICAgICAgICAgICAxMyAgICAxMDIyMiAgMTIuc28uMC4yMlsuMF0KLSAqICAgIDEuMC4zMCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDMwICAxMC5zby4wLjMwWy4wXQotICogICAgMS4yLjIyICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjIgIDEyLnNvLjAuMjJbLjBdCi0gKiAgICAxLjIuMjNiZXRhMDEtMDUgICAgICAgICAxMyAgICAxMDIyMyAgMTIuc28uMC4yM1suMF0KLSAqICAgIDEuMi4yM3JjMDEgICAgICAgICAgICAgIDEzICAgIDEwMjIzICAxMi5zby4wLjIzWy4wXQotICogICAgMS4yLjIzICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjMgIDEyLnNvLjAuMjNbLjBdCi0gKiAgICAxLjIuMjRiZXRhMDEtMDIgICAgICAgICAxMyAgICAxMDIyNCAgMTIuc28uMC4yNFsuMF0KLSAqICAgIDEuMi4yNHJjMDEgICAgICAgICAgICAgIDEzICAgIDEwMjI0ICAxMi5zby4wLjI0Wy4wXQotICogICAgMS4yLjI0ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjQgIDEyLnNvLjAuMjRbLjBdCi0gKiAgICAxLjIuMjViZXRhMDEtMDYgICAgICAgICAxMyAgICAxMDIyNSAgMTIuc28uMC4yNVsuMF0KLSAqICAgIDEuMi4yNXJjMDEtMDIgICAgICAgICAgIDEzICAgIDEwMjI1ICAxMi5zby4wLjI1Wy4wXQotICogICAgMS4wLjMxICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMzEgIDEwLnNvLjAuMzFbLjBdCi0gKiAgICAxLjIuMjUgICAgICAgICAgICAgICAgICAxMyAgICAxMDIyNSAgMTIuc28uMC4yNVsuMF0KLSAqICAgIDEuMi4yNmJldGEwMS0wNiAgICAgICAgIDEzICAgIDEwMjI2ICAxMi5zby4wLjI2Wy4wXQotICogICAgMS4yLjI2cmMwMSAgICAgICAgICAgICAgMTMgICAgMTAyMjYgIDEyLnNvLjAuMjZbLjBdCi0gKiAgICAxLjIuMjYgICAgICAgICAgICAgICAgICAxMyAgICAxMDIyNiAgMTIuc28uMC4yNlsuMF0KLSAqICAgIDEuMC4zMiAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDMyICAxMC5zby4wLjMyWy4wXQotICogICAgMS4yLjI3YmV0YTAxLTA2ICAgICAgICAgMTMgICAgMTAyMjcgIDEyLnNvLjAuMjdbLjBdCi0gKiAgICAxLjIuMjdyYzAxICAgICAgICAgICAgICAxMyAgICAxMDIyNyAgMTIuc28uMC4yN1suMF0KLSAqICAgIDEuMC4zMyAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDMzICAxMC5zby4wLjMzWy4wXQotICogICAgMS4yLjI3ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjcgIDEyLnNvLjAuMjdbLjBdCi0gKiAgICAxLjAuMzQgICAgICAgICAgICAgICAgICAxMCAgICAxMDAzNCAgMTAuc28uMC4zNFsuMF0KLSAqICAgIDEuMi4yOCAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjI4ICAxMi5zby4wLjI4Wy4wXQotICogICAgMS4yLjI5YmV0YTAxLTAzICAgICAgICAgMTMgICAgMTAyMjkgIDEyLnNvLjAuMjlbLjBdCi0gKiAgICAxLjIuMjlyYzAxICAgICAgICAgICAgICAxMyAgICAxMDIyOSAgMTIuc28uMC4yOVsuMF0KLSAqICAgIDEuMC4zNSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDM1ICAxMC5zby4wLjM1Wy4wXQotICogICAgMS4yLjI5ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMjkgIDEyLnNvLjAuMjlbLjBdCi0gKiAgICAxLjAuMzcgICAgICAgICAgICAgICAgICAxMCAgICAxMDAzNyAgMTAuc28uMC4zN1suMF0KLSAqICAgIDEuMi4zMGJldGEwMS0wNCAgICAgICAgIDEzICAgIDEwMjMwICAxMi5zby4wLjMwWy4wXQotICogICAgMS4wLjM4cmMwMS0wOCAgICAgICAgICAgMTAgICAgMTAwMzggIDEwLnNvLjAuMzhbLjBdCi0gKiAgICAxLjIuMzByYzAxLTA4ICAgICAgICAgICAxMyAgICAxMDIzMCAgMTIuc28uMC4zMFsuMF0KLSAqICAgIDEuMC4zOCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDM4ICAxMC5zby4wLjM4Wy4wXQotICogICAgMS4yLjMwICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMzAgIDEyLnNvLjAuMzBbLjBdCi0gKiAgICAxLjAuMzlyYzAxLTAzICAgICAgICAgICAxMCAgICAxMDAzOSAgMTAuc28uMC4zOVsuMF0KLSAqICAgIDEuMi4zMXJjMDEtMDMgICAgICAgICAgIDEzICAgIDEwMjMxICAxMi5zby4wLjMxWy4wXQotICogICAgMS4wLjM5ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwMzkgIDEwLnNvLjAuMzlbLjBdCi0gKiAgICAxLjIuMzEgICAgICAgICAgICAgICAgICAxMyAgICAxMDIzMSAgMTIuc28uMC4zMVsuMF0KLSAqICAgIDEuMi4zMmJldGEwMS0wMiAgICAgICAgIDEzICAgIDEwMjMyICAxMi5zby4wLjMyWy4wXQotICogICAgMS4wLjQwcmMwMSAgICAgICAgICAgICAgMTAgICAgMTAwNDAgIDEwLnNvLjAuNDBbLjBdCi0gKiAgICAxLjIuMzJyYzAxICAgICAgICAgICAgICAxMyAgICAxMDIzMiAgMTIuc28uMC4zMlsuMF0KLSAqICAgIDEuMC40MCAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDQwICAxMC5zby4wLjQwWy4wXQotICogICAgMS4yLjMyICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMzIgIDEyLnNvLjAuMzJbLjBdCi0gKiAgICAxLjIuMzNiZXRhMDEtMDIgICAgICAgICAxMyAgICAxMDIzMyAgMTIuc28uMC4zM1suMF0KLSAqICAgIDEuMi4zM3JjMDEtMDIgICAgICAgICAgIDEzICAgIDEwMjMzICAxMi5zby4wLjMzWy4wXQotICogICAgMS4wLjQxcmMwMSAgICAgICAgICAgICAgMTAgICAgMTAwNDEgIDEwLnNvLjAuNDFbLjBdCi0gKiAgICAxLjIuMzMgICAgICAgICAgICAgICAgICAxMyAgICAxMDIzMyAgMTIuc28uMC4zM1suMF0KLSAqICAgIDEuMC40MSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDQxICAxMC5zby4wLjQxWy4wXQotICogICAgMS4yLjM0YmV0YTAxLTA3ICAgICAgICAgMTMgICAgMTAyMzQgIDEyLnNvLjAuMzRbLjBdCi0gKiAgICAxLjAuNDJyYzAxICAgICAgICAgICAgICAxMCAgICAxMDA0MiAgMTAuc28uMC40MlsuMF0KLSAqICAgIDEuMi4zNHJjMDEgICAgICAgICAgICAgIDEzICAgIDEwMjM0ICAxMi5zby4wLjM0Wy4wXQotICogICAgMS4wLjQyICAgICAgICAgICAgICAgICAgMTAgICAgMTAwNDIgIDEwLnNvLjAuNDJbLjBdCi0gKiAgICAxLjIuMzQgICAgICAgICAgICAgICAgICAxMyAgICAxMDIzNCAgMTIuc28uMC4zNFsuMF0KLSAqICAgIDEuMi4zNWJldGEwMS0wMyAgICAgICAgIDEzICAgIDEwMjM1ICAxMi5zby4wLjM1Wy4wXQotICogICAgMS4wLjQzcmMwMS0wMiAgICAgICAgICAgMTAgICAgMTAwNDMgIDEwLnNvLjAuNDNbLjBdCi0gKiAgICAxLjIuMzVyYzAxLTAyICAgICAgICAgICAxMyAgICAxMDIzNSAgMTIuc28uMC4zNVsuMF0KLSAqICAgIDEuMC40MyAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDQzICAxMC5zby4wLjQzWy4wXQotICogICAgMS4yLjM1ICAgICAgICAgICAgICAgICAgMTMgICAgMTAyMzUgIDEyLnNvLjAuMzVbLjBdCi0gKiAgICAxLjIuMzZiZXRhMDEtMDUgICAgICAgICAxMyAgICAxMDIzNiAgMTIuc28uMC4zNlsuMF0KLSAqICAgIDEuMi4zNnJjMDEgICAgICAgICAgICAgIDEzICAgIDEwMjM2ICAxMi5zby4wLjM2Wy4wXQotICogICAgMS4wLjQ0ICAgICAgICAgICAgICAgICAgMTAgICAgMTAwNDQgIDEwLnNvLjAuNDRbLjBdCi0gKiAgICAxLjIuMzYgICAgICAgICAgICAgICAgICAxMyAgICAxMDIzNiAgMTIuc28uMC4zNlsuMF0KLSAqICAgIDEuMi4zN2JldGEwMS0wMyAgICAgICAgIDEzICAgIDEwMjM3ICAxMi5zby4wLjM3Wy4wXQotICogICAgMS4yLjM3cmMwMSAgICAgICAgICAgICAgMTMgICAgMTAyMzcgIDEyLnNvLjAuMzdbLjBdCi0gKiAgICAxLjIuMzcgICAgICAgICAgICAgICAgICAxMyAgICAxMDIzNyAgMTIuc28uMC4zN1suMF0KLSAqCi0gKiAgICBIZW5jZWZvcnRoIHRoZSBzb3VyY2UgdmVyc2lvbiB3aWxsIG1hdGNoIHRoZSBzaGFyZWQtbGlicmFyeSBtYWpvcgotICogICAgYW5kIG1pbm9yIG51bWJlcnM7IHRoZSBzaGFyZWQtbGlicmFyeSBtYWpvciB2ZXJzaW9uIG51bWJlciB3aWxsIGJlCi0gKiAgICB1c2VkIGZvciBjaGFuZ2VzIGluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGFzIGl0IGlzIGludGVuZGVkLiAgVGhlCi0gKiAgICBQTkdfTElCUE5HX1ZFUiBtYWNybywgd2hpY2ggaXMgbm90IHVzZWQgd2l0aGluIGxpYnBuZyBidXQgaXMgYXZhaWxhYmxlCi0gKiAgICBmb3IgYXBwbGljYXRpb25zLCBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIG9mIHRoZSBmb3JtIHh5eXp6IGNvcnJlc3BvbmRpbmcKLSAqICAgIHRvIHRoZSBzb3VyY2UgdmVyc2lvbiB4LnkueiAobGVhZGluZyB6ZXJvcyBpbiB5IGFuZCB6KS4gIEJldGEgdmVyc2lvbnMKLSAqICAgIHdlcmUgZ2l2ZW4gdGhlIHByZXZpb3VzIHB1YmxpYyByZWxlYXNlIG51bWJlciBwbHVzIGEgbGV0dGVyLCB1bnRpbAotICogICAgdmVyc2lvbiAxLjAuNmo7IGZyb20gdGhlbiBvbiB0aGV5IHdlcmUgZ2l2ZW4gdGhlIHVwY29taW5nIHB1YmxpYwotICogICAgcmVsZWFzZSBudW1iZXIgcGx1cyAiYmV0YU5OIiBvciAicmNOTiIuCi0gKgotICogICAgQmluYXJ5IGluY29tcGF0aWJpbGl0eSBleGlzdHMgb25seSB3aGVuIGFwcGxpY2F0aW9ucyBtYWtlIGRpcmVjdCBhY2Nlc3MKLSAqICAgIHRvIHRoZSBpbmZvX3B0ciBvciBwbmdfcHRyIG1lbWJlcnMgdGhyb3VnaCBwbmcuaCwgYW5kIHRoZSBjb21waWxlZAotICogICAgYXBwbGljYXRpb24gaXMgbG9hZGVkIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KLSAqCi0gKiAgICBETExOVU0gd2lsbCBjaGFuZ2UgZWFjaCB0aW1lIHRoZXJlIGFyZSBmb3J3YXJkIG9yIGJhY2t3YXJkIGNoYW5nZXMKLSAqICAgIGluIGJpbmFyeSBjb21wYXRpYmlsaXR5IChlLmcuLCB3aGVuIGEgbmV3IGZlYXR1cmUgaXMgYWRkZWQpLgotICoKLSAqIFNlZSBsaWJwbmcudHh0IG9yIGxpYnBuZy4zIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgVGhlIFBORyBzcGVjaWZpY2F0aW9uCi0gKiBpcyBhdmFpbGFibGUgYXMgYSBXM0MgUmVjb21tZW5kYXRpb24gYW5kIGFzIGFuIElTTyBTcGVjaWZpY2F0aW9uLAotICogPGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvUkVDLVBORy0yMDAzMTExMC8KLSAqLwotCi0vKgotICogQ09QWVJJR0hUIE5PVElDRSwgRElTQ0xBSU1FUiwgYW5kIExJQ0VOU0U6Ci0gKgotICogSWYgeW91IG1vZGlmeSBsaWJwbmcgeW91IG1heSBpbnNlcnQgYWRkaXRpb25hbCBub3RpY2VzIGltbWVkaWF0ZWx5IGZvbGxvd2luZwotICogdGhpcyBzZW50ZW5jZS4KLSAqCi0gKiBsaWJwbmcgdmVyc2lvbnMgMS4yLjYsIEF1Z3VzdCAxNSwgMjAwNCwgdGhyb3VnaCAxLjIuMzcsIEp1bmUgNCwgMjAwOSwgYXJlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKLSAqIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjIuNQotICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWwgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6Ci0gKgotICogICAgQ29zbWluIFRydXRhCi0gKgotICogbGlicG5nIHZlcnNpb25zIDEuMC43LCBKdWx5IDEsIDIwMDAsIHRocm91Z2ggMS4yLjUsIE9jdG9iZXIgMywgMjAwMiwgYXJlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKLSAqIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjAuNgotICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgotICoKLSAqICAgIFNpbW9uLVBpZXJyZSBDYWRpZXV4Ci0gKiAgICBFcmljIFMuIFJheW1vbmQKLSAqICAgIEdpbGxlcyBWb2xsYW50Ci0gKgotICogYW5kIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdG8gdGhlIGRpc2NsYWltZXI6Ci0gKgotICogICAgVGhlcmUgaXMgbm8gd2FycmFudHkgYWdhaW5zdCBpbnRlcmZlcmVuY2Ugd2l0aCB5b3VyIGVuam95bWVudCBvZiB0aGUKLSAqICAgIGxpYnJhcnkgb3IgYWdhaW5zdCBpbmZyaW5nZW1lbnQuICBUaGVyZSBpcyBubyB3YXJyYW50eSB0aGF0IG91cgotICogICAgZWZmb3J0cyBvciB0aGUgbGlicmFyeSB3aWxsIGZ1bGZpbGwgYW55IG9mIHlvdXIgcGFydGljdWxhciBwdXJwb3NlcwotICogICAgb3IgbmVlZHMuICBUaGlzIGxpYnJhcnkgaXMgcHJvdmlkZWQgd2l0aCBhbGwgZmF1bHRzLCBhbmQgdGhlIGVudGlyZQotICogICAgcmlzayBvZiBzYXRpc2ZhY3RvcnkgcXVhbGl0eSwgcGVyZm9ybWFuY2UsIGFjY3VyYWN5LCBhbmQgZWZmb3J0IGlzIHdpdGgKLSAqICAgIHRoZSB1c2VyLgotICoKLSAqIGxpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS4wLjYsIE1hcmNoIDIwLCAyMDAwLCBhcmUKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKLSAqIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0wLjk2LAotICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgotICoKLSAqICAgIFRvbSBMYW5lCi0gKiAgICBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqICAgIFdpbGxlbSB2YW4gU2NoYWlrCi0gKgotICogbGlicG5nIHZlcnNpb25zIDAuODksIEp1bmUgMTk5NiwgdGhyb3VnaCAwLjk2LCBNYXkgMTk5NywgYXJlCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSAqIERpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0wLjg4LAotICogd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgotICoKLSAqICAgIEpvaG4gQm93bGVyCi0gKiAgICBLZXZpbiBCcmFjZXkKLSAqICAgIFNhbSBCdXNoZWxsCi0gKiAgICBNYWdudXMgSG9sbWdyZW4KLSAqICAgIEdyZWcgUm9lbG9mcwotICogICAgVG9tIFRhbm5lcgotICoKLSAqIGxpYnBuZyB2ZXJzaW9ucyAwLjUsIE1heSAxOTk1LCB0aHJvdWdoIDAuODgsIEphbnVhcnkgMTk5NiwgYXJlCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCi0gKgotICogRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGNvcHlyaWdodCBhbmQgbGljZW5zZSwgIkNvbnRyaWJ1dGluZyBBdXRob3JzIgotICogaXMgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nIHNldCBvZiBpbmRpdmlkdWFsczoKLSAqCi0gKiAgICBBbmRyZWFzIERpbGdlcgotICogICAgRGF2ZSBNYXJ0aW5kYWxlCi0gKiAgICBHdXkgRXJpYyBTY2hhbG5hdAotICogICAgUGF1bCBTY2htaWR0Ci0gKiAgICBUaW0gV2VnbmVyCi0gKgotICogVGhlIFBORyBSZWZlcmVuY2UgTGlicmFyeSBpcyBzdXBwbGllZCAiQVMgSVMiLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzCi0gKiBhbmQgR3JvdXAgNDIsIEluYy4gZGlzY2xhaW0gYWxsIHdhcnJhbnRpZXMsIGV4cHJlc3NlZCBvciBpbXBsaWVkLAotICogaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZSB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgb2YKLSAqIGZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLgotICogYXNzdW1lIG5vIGxpYWJpbGl0eSBmb3IgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAotICogb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCB3aGljaCBtYXkgcmVzdWx0IGZyb20gdGhlIHVzZSBvZiB0aGUgUE5HCi0gKiBSZWZlcmVuY2UgTGlicmFyeSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCi0gKiBzb3VyY2UgY29kZSwgb3IgcG9ydGlvbnMgaGVyZW9mLCBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLSAqCi0gKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQuCi0gKgotICogMi4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2ggYW5kCi0gKiBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc291cmNlLgotICoKLSAqIDMuIFRoaXMgQ29weXJpZ2h0IG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tCi0gKiAgICBhbnkgc291cmNlIG9yIGFsdGVyZWQgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUaGUgQ29udHJpYnV0aW5nIEF1dGhvcnMgYW5kIEdyb3VwIDQyLCBJbmMuIHNwZWNpZmljYWxseSBwZXJtaXQsIHdpdGhvdXQKLSAqIGZlZSwgYW5kIGVuY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgc291cmNlIGNvZGUgYXMgYSBjb21wb25lbnQgdG8KLSAqIHN1cHBvcnRpbmcgdGhlIFBORyBmaWxlIGZvcm1hdCBpbiBjb21tZXJjaWFsIHByb2R1Y3RzLiAgSWYgeW91IHVzZSB0aGlzCi0gKiBzb3VyY2UgY29kZSBpbiBhIHByb2R1Y3QsIGFja25vd2xlZGdtZW50IGlzIG5vdCByZXF1aXJlZCBidXQgd291bGQgYmUKLSAqIGFwcHJlY2lhdGVkLgotICovCi0KLS8qCi0gKiBBICJwbmdfZ2V0X2NvcHlyaWdodCIgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBmb3IgY29udmVuaWVudCB1c2UgaW4gImFib3V0IgotICogYm94ZXMgYW5kIHRoZSBsaWtlOgotICoKLSAqIHByaW50ZigiJXMiLHBuZ19nZXRfY29weXJpZ2h0KE5VTEwpKTsKLSAqCi0gKiBBbHNvLCB0aGUgUE5HIGxvZ28gKGluIFBORyBmb3JtYXQsIG9mIGNvdXJzZSkgaXMgc3VwcGxpZWQgaW4gdGhlCi0gKiBmaWxlcyAicG5nYmFyLnBuZyIgYW5kICJwbmdiYXIuanBnICg4OHgzMSkgYW5kICJwbmdub3cucG5nIiAoOTh4MzEpLgotICovCi0KLS8qCi0gKiBMaWJwbmcgaXMgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBTb2Z0d2FyZS4gIE9TSSBDZXJ0aWZpZWQgaXMgYQotICogY2VydGlmaWNhdGlvbiBtYXJrIG9mIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgotICovCi0KLS8qCi0gKiBUaGUgY29udHJpYnV0aW5nIGF1dGhvcnMgd291bGQgbGlrZSB0byB0aGFuayBhbGwgdGhvc2Ugd2hvIGhlbHBlZAotICogd2l0aCB0ZXN0aW5nLCBidWcgZml4ZXMsIGFuZCBwYXRpZW5jZS4gIFRoaXMgd291bGRuJ3QgaGF2ZSBiZWVuCi0gKiBwb3NzaWJsZSB3aXRob3V0IGFsbCBvZiB5b3UuCi0gKgotICogVGhhbmtzIHRvIEZyYW5rIEouIFQuIFdvamNpayBmb3IgaGVscGluZyB3aXRoIHRoZSBkb2N1bWVudGF0aW9uLgotICovCi0KLS8qCi0gKiBZMksgY29tcGxpYW5jZSBpbiBsaWJwbmc6Ci0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogICAgSnVuZSA0LCAyMDA5Ci0gKgotICogICAgU2luY2UgdGhlIFBORyBEZXZlbG9wbWVudCBncm91cCBpcyBhbiBhZC1ob2MgYm9keSwgd2UgY2FuJ3QgbWFrZQotICogICAgYW4gb2ZmaWNpYWwgZGVjbGFyYXRpb24uCi0gKgotICogICAgVGhpcyBpcyB5b3VyIHVub2ZmaWNpYWwgYXNzdXJhbmNlIHRoYXQgbGlicG5nIGZyb20gdmVyc2lvbiAwLjcxIGFuZAotICogICAgdXB3YXJkIHRocm91Z2ggMS4yLjM3IGFyZSBZMksgY29tcGxpYW50LiAgSXQgaXMgbXkgYmVsaWVmIHRoYXQgZWFybGllcgotICogICAgdmVyc2lvbnMgd2VyZSBhbHNvIFkySyBjb21wbGlhbnQuCi0gKgotICogICAgTGlicG5nIG9ubHkgaGFzIHRocmVlIHllYXIgZmllbGRzLiAgT25lIGlzIGEgMi1ieXRlIHVuc2lnbmVkIGludGVnZXIKLSAqICAgIHRoYXQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDY1NTM1LiAgVGhlIG90aGVyIHR3byBob2xkIHRoZSBkYXRlIGluIHRleHQKLSAqICAgIGZvcm1hdCwgYW5kIHdpbGwgaG9sZCB5ZWFycyB1cCB0byA5OTk5LgotICoKLSAqICAgIFRoZSBpbnRlZ2VyIGlzCi0gKiAgICAgICAgInBuZ191aW50XzE2IHllYXIiIGluIHBuZ190aW1lX3N0cnVjdC4KLSAqCi0gKiAgICBUaGUgc3RyaW5ncyBhcmUKLSAqICAgICAgICAicG5nX2NoYXJwIHRpbWVfYnVmZmVyIiBpbiBwbmdfc3RydWN0IGFuZAotICogICAgICAgICJuZWFyX3RpbWVfYnVmZmVyIiwgd2hpY2ggaXMgYSBsb2NhbCBjaGFyYWN0ZXIgc3RyaW5nIGluIHBuZy5jLgotICoKLSAqICAgIFRoZXJlIGFyZSBzZXZlbiB0aW1lLXJlbGF0ZWQgZnVuY3Rpb25zOgotICogICAgICAgIHBuZy5jOiBwbmdfY29udmVydF90b19yZmNfMTEyMygpIGluIHBuZy5jCi0gKiAgICAgICAgICAoZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExNTIoKSBpbiBlcnJvcikKLSAqICAgICAgICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGluIHBuZ3dyaXRlLmMsIGNhbGxlZCBpbiBwbmd3cml0ZS5jCi0gKiAgICAgICAgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBpbiBwbmd3cml0ZS5jCi0gKiAgICAgICAgcG5nX2dldF90SU1FKCkgaW4gcG5nZ2V0LmMKLSAqICAgICAgICBwbmdfaGFuZGxlX3RJTUUoKSBpbiBwbmdydXRpbC5jLCBjYWxsZWQgaW4gcG5ncmVhZC5jCi0gKiAgICAgICAgcG5nX3NldF90SU1FKCkgaW4gcG5nc2V0LmMKLSAqICAgICAgICBwbmdfd3JpdGVfdElNRSgpIGluIHBuZ3d1dGlsLmMsIGNhbGxlZCBpbiBwbmd3cml0ZS5jCi0gKgotICogICAgQWxsIGhhbmRsZSBkYXRlcyBwcm9wZXJseSBpbiBhIFkySyBlbnZpcm9ubWVudC4gIFRoZQotICogICAgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmdW5jdGlvbiBjYWxscyBnbXRpbWUoKSB0byBjb252ZXJ0IGZyb20gc3lzdGVtCi0gKiAgICBjbG9jayB0aW1lLCB3aGljaCByZXR1cm5zICh5ZWFyIC0gMTkwMCksIHdoaWNoIHdlIHByb3Blcmx5IGNvbnZlcnQgdG8KLSAqICAgIHRoZSBmdWxsIDQtZGlnaXQgeWVhci4gIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhcHBsaWNhdGlvbnMgdXNpbmcKLSAqICAgIGxpYnBuZyBhcmUgbm90IHBhc3NpbmcgNC1kaWdpdCB5ZWFycyBpbnRvIHRoZSBwbmdfY29udmVydF90b19yZmNfMTEyMygpCi0gKiAgICBmdW5jdGlvbiwgb3IgdGhhdCB0aGV5IGFyZSBpbmNvcnJlY3RseSBwYXNzaW5nIG9ubHkgYSAyLWRpZ2l0IHllYXIKLSAqICAgIGluc3RlYWQgb2YgInllYXIgLSAxOTAwIiBpbnRvIHRoZSBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZ1bmN0aW9uLAotICogICAgYnV0IHRoaXMgaXMgbm90IHVuZGVyIG91ciBjb250cm9sLiAgVGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uIGhhcyBhbHdheXMKLSAqICAgIHN0YXRlZCB0aGF0IGl0IHdvcmtzIHdpdGggNC1kaWdpdCB5ZWFycywgYW5kIHRoZSBBUElzIGhhdmUgYmVlbgotICogICAgZG9jdW1lbnRlZCBhcyBzdWNoLgotICoKLSAqICAgIFRoZSB0SU1FIGNodW5rIGl0c2VsZiBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCB1c2VzIGEgMi1ieXRlIHVuc2lnbmVkCi0gKiAgICBpbnRlZ2VyIHRvIGhvbGQgdGhlIHllYXIsIGFuZCBjYW4gaG9sZCB5ZWFycyBhcyBsYXJnZSBhcyA2NTUzNS4KLSAqCi0gKiAgICB6bGliLCB1cG9uIHdoaWNoIGxpYnBuZyBkZXBlbmRzLCBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCBjb250YWlucwotICogICAgbm8gZGF0ZS1yZWxhdGVkIGNvZGUuCi0gKgotICogICAgICAgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAgICAgICBsaWJwbmcgbWFpbnRhaW5lcgotICogICAgICAgUE5HIERldmVsb3BtZW50IEdyb3VwCi0gKi8KLQotI2lmbmRlZiBQTkdfSAotI2RlZmluZSBQTkdfSAotCi0vKiBUaGlzIGlzIG5vdCB0aGUgcGxhY2UgdG8gbGVhcm4gaG93IHRvIHVzZSBsaWJwbmcuICBUaGUgZmlsZSBsaWJwbmcudHh0Ci0gKiBkZXNjcmliZXMgaG93IHRvIHVzZSBsaWJwbmcsIGFuZCB0aGUgZmlsZSBleGFtcGxlLmMgc3VtbWFyaXplcyBpdAotICogd2l0aCBzb21lIGNvZGUgb24gd2hpY2ggdG8gYnVpbGQuICBUaGlzIGZpbGUgaXMgdXNlZnVsIGZvciBsb29raW5nCi0gKiBhdCB0aGUgYWN0dWFsIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmUgY29tcG9uZW50cy4KLSAqLwotCi0vKiBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBwbmcuaCAtIHRoaXMgc2hvdWxkIG1hdGNoIHRoZSB2ZXJzaW9uIGluIHBuZy5jICovCi0jZGVmaW5lIFBOR19MSUJQTkdfVkVSX1NUUklORyAiMS4yLjM3IgotI2RlZmluZSBQTkdfSEVBREVSX1ZFUlNJT05fU1RSSU5HIFwKLSAgICIgbGlicG5nIHZlcnNpb24gMS4yLjM3IC0gSnVuZSA0LCAyMDA5XG4iCi0KLSNkZWZpbmUgUE5HX0xJQlBOR19WRVJfU09OVU0gICAwCi0jZGVmaW5lIFBOR19MSUJQTkdfVkVSX0RMTE5VTSAgMTMKLQotLyogVGhlc2Ugc2hvdWxkIG1hdGNoIHRoZSBmaXJzdCAzIGNvbXBvbmVudHMgb2YgUE5HX0xJQlBOR19WRVJfU1RSSU5HOiAqLwotI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9NQUpPUiAgIDEKLSNkZWZpbmUgUE5HX0xJQlBOR19WRVJfTUlOT1IgICAyCi0jZGVmaW5lIFBOR19MSUJQTkdfVkVSX1JFTEVBU0UgMzcKLS8qIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBudW1lcmljIHBhcnQgb2YgdGhlIGZpbmFsIGNvbXBvbmVudCBvZgotICogUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBvbWl0dGluZyBhbnkgbGVhZGluZyB6ZXJvOiAqLwotCi0jZGVmaW5lIFBOR19MSUJQTkdfVkVSX0JVSUxEICAwCi0KLS8qIFJlbGVhc2UgU3RhdHVzICovCi0jZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfQUxQSEEgICAgMQotI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX0JFVEEgICAgIDIKLSNkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9SQyAgICAgICAzCi0jZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfU1RBQkxFICAgNAotI2RlZmluZSBQTkdfTElCUE5HX0JVSUxEX1JFTEVBU0VfU1RBVFVTX01BU0sgNwotICAKLS8qIFJlbGVhc2UtU3BlY2lmaWMgRmxhZ3MgKi8KLSNkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9QQVRDSCAgICA4IC8qIENhbiBiZSBPUidlZCB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfTElCUE5HX0JVSUxEX1NUQUJMRSBvbmx5ICovCi0jZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURSAxNiAvKiBDYW5ub3QgYmUgT1InZWQgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0xJQlBOR19CVUlMRF9TUEVDSUFMICovCi0jZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTCAzMiAvKiBDYW5ub3QgYmUgT1InZWQgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0xJQlBOR19CVUlMRF9QUklWQVRFICovCi0KLSNkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgUE5HX0xJQlBOR19CVUlMRF9TVEFCTEUKLQotLyogQ2FyZWZ1bCBoZXJlLiAgQXQgb25lIHRpbWUsIEd1eSB3YW50ZWQgdG8gdXNlIDA4MiwgYnV0IHRoYXQgd291bGQgYmUgb2N0YWwuCi0gKiBXZSBtdXN0IG5vdCBpbmNsdWRlIGxlYWRpbmcgemVyb3MuCi0gKiBWZXJzaW9ucyAwLjcgdGhyb3VnaCAxLjAuMCB3ZXJlIGluIHRoZSByYW5nZSAwIHRvIDEwMCBoZXJlIChvbmx5Ci0gKiB2ZXJzaW9uIDEuMC4wIHdhcyBtaXMtbnVtYmVyZWQgMTAwIGluc3RlYWQgb2YgMTAwMDApLiAgRnJvbQotICogdmVyc2lvbiAxLjAuMSBpdCdzICAgIHh4eXl6eiwgd2hlcmUgeD1tYWpvciwgeT1taW5vciwgej1yZWxlYXNlICovCi0jZGVmaW5lIFBOR19MSUJQTkdfVkVSIDEwMjM3IC8qIDEuMi4zNyAqLwotCi0jaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQotLyogaW5jbHVkZSB0aGUgY29tcHJlc3Npb24gbGlicmFyeSdzIGhlYWRlciAqLwotI2luY2x1ZGUgInpsaWIuaCIKLSNlbmRpZgotCi0vKiBpbmNsdWRlIGFsbCB1c2VyIGNvbmZpZ3VyYWJsZSBpbmZvLCBpbmNsdWRpbmcgb3B0aW9uYWwgYXNzZW1ibGVyIHJvdXRpbmVzICovCi0jaW5jbHVkZSAicG5nY29uZi5oIgotCi0vKgotICogQWRkZWQgYXQgbGlicG5nLTEuMi44ICovCi0vKiBSZWYgTVNETjogUHJpdmF0ZSBhcyBwcmlvcml0eSBvdmVyIFNwZWNpYWwKLSAqIFZTX0ZGX1BSSVZBVEVCVUlMRCBGaWxlICp3YXMgbm90KiBidWlsdCB1c2luZyBzdGFuZGFyZCByZWxlYXNlCi0gKiBwcm9jZWR1cmVzLiBJZiB0aGlzIHZhbHVlIGlzIGdpdmVuLCB0aGUgU3RyaW5nRmlsZUluZm8gYmxvY2sgbXVzdAotICogY29udGFpbiBhIFByaXZhdGVCdWlsZCBzdHJpbmcuIAotICoKLSAqIFZTX0ZGX1NQRUNJQUxCVUlMRCBGaWxlICp3YXMqIGJ1aWx0IGJ5IHRoZSBvcmlnaW5hbCBjb21wYW55IHVzaW5nCi0gKiBzdGFuZGFyZCByZWxlYXNlIHByb2NlZHVyZXMgYnV0IGlzIGEgdmFyaWF0aW9uIG9mIHRoZSBzdGFuZGFyZAotICogZmlsZSBvZiB0aGUgc2FtZSB2ZXJzaW9uIG51bWJlci4gSWYgdGhpcyB2YWx1ZSBpcyBnaXZlbiwgdGhlCi0gKiBTdHJpbmdGaWxlSW5mbyBibG9jayBtdXN0IGNvbnRhaW4gYSBTcGVjaWFsQnVpbGQgc3RyaW5nLiAKLSAqLwotCi0jaWYgZGVmaW5lZChQTkdfVVNFUl9QUklWQVRFQlVJTEQpCi0jICBkZWZpbmUgUE5HX0xJQlBOR19CVUlMRF9UWVBFIFwKLSAgICAgICAgICAoUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgfCBQTkdfTElCUE5HX0JVSUxEX1BSSVZBVEUpCi0jZWxzZQotIyAgaWYgZGVmaW5lZChQTkdfTElCUE5HX1NQRUNJQUxCVUlMRCkKLSMgICAgZGVmaW5lIFBOR19MSUJQTkdfQlVJTERfVFlQRSBcCi0gICAgICAgICAgICAoUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgfCBQTkdfTElCUE5HX0JVSUxEX1NQRUNJQUwpCi0jICBlbHNlCi0jICAgIGRlZmluZSBQTkdfTElCUE5HX0JVSUxEX1RZUEUgKFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFKQotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQotCi0vKiBJbmhpYml0IEMrKyBuYW1lLW1hbmdsaW5nIGZvciBsaWJwbmcgZnVuY3Rpb25zIGJ1dCBub3QgZm9yIHN5c3RlbSBjYWxscy4gKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotLyogVGhpcyBmaWxlIGlzIGFycmFuZ2VkIGluIHNldmVyYWwgc2VjdGlvbnMuICBUaGUgZmlyc3Qgc2VjdGlvbiBjb250YWlucwotICogc3RydWN0dXJlIGFuZCB0eXBlIGRlZmluaXRpb25zLiAgVGhlIHNlY29uZCBzZWN0aW9uIGNvbnRhaW5zIHRoZSBleHRlcm5hbAotICogbGlicmFyeSBmdW5jdGlvbnMsIHdoaWxlIHRoZSB0aGlyZCBoYXMgdGhlIGludGVybmFsIGxpYnJhcnkgZnVuY3Rpb25zLAotICogd2hpY2ggYXBwbGljYXRpb25zIGFyZW4ndCBleHBlY3RlZCB0byB1c2UgZGlyZWN0bHkuCi0gKi8KLQotI2lmbmRlZiBQTkdfTk9fVFlQRUNBU1RfTlVMTAotI2RlZmluZSBpbnRfcF9OVUxMICAgICAgICAgICAgICAgIChpbnQgKilOVUxMCi0jZGVmaW5lIHBuZ19ieXRlcF9OVUxMICAgICAgICAgICAgKHBuZ19ieXRlcClOVUxMCi0jZGVmaW5lIHBuZ19ieXRlcHBfTlVMTCAgICAgICAgICAgKHBuZ19ieXRlcHApTlVMTAotI2RlZmluZSBwbmdfZG91YmxlcF9OVUxMICAgICAgICAgIChwbmdfZG91YmxlcClOVUxMCi0jZGVmaW5lIHBuZ19lcnJvcl9wdHJfTlVMTCAgICAgICAgKHBuZ19lcnJvcl9wdHIpTlVMTAotI2RlZmluZSBwbmdfZmx1c2hfcHRyX05VTEwgICAgICAgIChwbmdfZmx1c2hfcHRyKU5VTEwKLSNkZWZpbmUgcG5nX2ZyZWVfcHRyX05VTEwgICAgICAgICAocG5nX2ZyZWVfcHRyKU5VTEwKLSNkZWZpbmUgcG5nX2luZm9wcF9OVUxMICAgICAgICAgICAocG5nX2luZm9wcClOVUxMCi0jZGVmaW5lIHBuZ19tYWxsb2NfcHRyX05VTEwgICAgICAgKHBuZ19tYWxsb2NfcHRyKU5VTEwKLSNkZWZpbmUgcG5nX3JlYWRfc3RhdHVzX3B0cl9OVUxMICAocG5nX3JlYWRfc3RhdHVzX3B0cilOVUxMCi0jZGVmaW5lIHBuZ19yd19wdHJfTlVMTCAgICAgICAgICAgKHBuZ19yd19wdHIpTlVMTAotI2RlZmluZSBwbmdfc3RydWN0cF9OVUxMICAgICAgICAgIChwbmdfc3RydWN0cClOVUxMCi0jZGVmaW5lIHBuZ191aW50XzE2cF9OVUxMICAgICAgICAgKHBuZ191aW50XzE2cClOVUxMCi0jZGVmaW5lIHBuZ192b2lkcF9OVUxMICAgICAgICAgICAgKHBuZ192b2lkcClOVUxMCi0jZGVmaW5lIHBuZ193cml0ZV9zdGF0dXNfcHRyX05VTEwgKHBuZ193cml0ZV9zdGF0dXNfcHRyKU5VTEwKLSNlbHNlCi0jZGVmaW5lIGludF9wX05VTEwgICAgICAgICAgICAgICAgTlVMTAotI2RlZmluZSBwbmdfYnl0ZXBfTlVMTCAgICAgICAgICAgIE5VTEwKLSNkZWZpbmUgcG5nX2J5dGVwcF9OVUxMICAgICAgICAgICBOVUxMCi0jZGVmaW5lIHBuZ19kb3VibGVwX05VTEwgICAgICAgICAgTlVMTAotI2RlZmluZSBwbmdfZXJyb3JfcHRyX05VTEwgICAgICAgIE5VTEwKLSNkZWZpbmUgcG5nX2ZsdXNoX3B0cl9OVUxMICAgICAgICBOVUxMCi0jZGVmaW5lIHBuZ19mcmVlX3B0cl9OVUxMICAgICAgICAgTlVMTAotI2RlZmluZSBwbmdfaW5mb3BwX05VTEwgICAgICAgICAgIE5VTEwKLSNkZWZpbmUgcG5nX21hbGxvY19wdHJfTlVMTCAgICAgICBOVUxMCi0jZGVmaW5lIHBuZ19yZWFkX3N0YXR1c19wdHJfTlVMTCAgTlVMTAotI2RlZmluZSBwbmdfcndfcHRyX05VTEwgICAgICAgICAgIE5VTEwKLSNkZWZpbmUgcG5nX3N0cnVjdHBfTlVMTCAgICAgICAgICBOVUxMCi0jZGVmaW5lIHBuZ191aW50XzE2cF9OVUxMICAgICAgICAgTlVMTAotI2RlZmluZSBwbmdfdm9pZHBfTlVMTCAgICAgICAgICAgIE5VTEwKLSNkZWZpbmUgcG5nX3dyaXRlX3N0YXR1c19wdHJfTlVMTCBOVUxMCi0jZW5kaWYKLQotLyogdmFyaWFibGVzIGRlY2xhcmVkIGluIHBuZy5jIC0gb25seSBpdCBuZWVkcyB0byBkZWZpbmUgUE5HX05PX0VYVEVSTiAqLwotI2lmICFkZWZpbmVkKFBOR19OT19FWFRFUk4pIHx8IGRlZmluZWQoUE5HX0FMV0FZU19FWFRFUk4pCi0vKiBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBDIGZpbGVzLCBzdG9yZWQgaW4gcG5nLmMuICBUaGlzIGhhZCBiZXR0ZXIgbWF0Y2gKLSAqIHRoZSB2ZXJzaW9uIGFib3ZlLgotICovCi0jaWZkZWYgUE5HX1VTRV9HTE9CQUxfQVJSQVlTCi1QTkdfRVhQT1JUX1ZBUiAoUE5HX0NPTlNUIGNoYXIpIHBuZ19saWJwbmdfdmVyWzE4XTsKLSAgLyogbmVlZCByb29tIGZvciA5OS45OS45OWJldGE5OXogKi8KLSNlbHNlCi0jZGVmaW5lIHBuZ19saWJwbmdfdmVyIHBuZ19nZXRfaGVhZGVyX3ZlcihOVUxMKQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfVVNFX0dMT0JBTF9BUlJBWVMKLS8qIFRoaXMgd2FzIHJlbW92ZWQgaW4gdmVyc2lvbiAxLjAuNWMgKi8KLS8qIFN0cnVjdHVyZXMgdG8gZmFjaWxpdGF0ZSBlYXN5IGludGVybGFjaW5nLiAgU2VlIHBuZy5jIGZvciBtb3JlIGRldGFpbHMgKi8KLVBOR19FWFBPUlRfVkFSIChQTkdfQ09OU1QgaW50IEZBUkRBVEEpIHBuZ19wYXNzX3N0YXJ0WzddOwotUE5HX0VYUE9SVF9WQVIgKFBOR19DT05TVCBpbnQgRkFSREFUQSkgcG5nX3Bhc3NfaW5jWzddOwotUE5HX0VYUE9SVF9WQVIgKFBOR19DT05TVCBpbnQgRkFSREFUQSkgcG5nX3Bhc3NfeXN0YXJ0WzddOwotUE5HX0VYUE9SVF9WQVIgKFBOR19DT05TVCBpbnQgRkFSREFUQSkgcG5nX3Bhc3NfeWluY1s3XTsKLVBOR19FWFBPUlRfVkFSIChQTkdfQ09OU1QgaW50IEZBUkRBVEEpIHBuZ19wYXNzX21hc2tbN107Ci1QTkdfRVhQT1JUX1ZBUiAoUE5HX0NPTlNUIGludCBGQVJEQVRBKSBwbmdfcGFzc19kc3BfbWFza1s3XTsKLS8qIFRoaXMgaXNuJ3QgY3VycmVudGx5IHVzZWQuICBJZiB5b3UgbmVlZCBpdCwgc2VlIHBuZy5jIGZvciBtb3JlIGRldGFpbHMuCi1QTkdfRVhQT1JUX1ZBUiAoUE5HX0NPTlNUIGludCBGQVJEQVRBKSBwbmdfcGFzc19oZWlnaHRbN107Ci0qLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBQTkdfTk9fRVhURVJOICovCi0KLS8qIFRocmVlIGNvbG9yIGRlZmluaXRpb25zLiAgVGhlIG9yZGVyIG9mIHRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZSwgKGFuZCB0aGUKLSAqIGV4YWN0IHNpemUpIGlzIG5vdCBpbXBvcnRhbnQsIGFsdGhvdWdoIHRoZSBzaXplIG9mIHRoZSBmaWVsZHMgbmVlZCB0bwotICogYmUgcG5nX2J5dGUgb3IgcG5nX3VpbnRfMTYgKGFzIGRlZmluZWQgYmVsb3cpLgotICovCi10eXBlZGVmIHN0cnVjdCBwbmdfY29sb3Jfc3RydWN0Ci17Ci0gICBwbmdfYnl0ZSByZWQ7Ci0gICBwbmdfYnl0ZSBncmVlbjsKLSAgIHBuZ19ieXRlIGJsdWU7Ci19IHBuZ19jb2xvcjsKLXR5cGVkZWYgcG5nX2NvbG9yIEZBUiAqIHBuZ19jb2xvcnA7Ci10eXBlZGVmIHBuZ19jb2xvciBGQVIgKiBGQVIgKiBwbmdfY29sb3JwcDsKLQotdHlwZWRlZiBzdHJ1Y3QgcG5nX2NvbG9yXzE2X3N0cnVjdAotewotICAgcG5nX2J5dGUgaW5kZXg7ICAgIC8qIHVzZWQgZm9yIHBhbGV0dGUgZmlsZXMgKi8KLSAgIHBuZ191aW50XzE2IHJlZDsgICAvKiBmb3IgdXNlIGluIHJlZCBncmVlbiBibHVlIGZpbGVzICovCi0gICBwbmdfdWludF8xNiBncmVlbjsKLSAgIHBuZ191aW50XzE2IGJsdWU7Ci0gICBwbmdfdWludF8xNiBncmF5OyAgLyogZm9yIHVzZSBpbiBncmF5c2NhbGUgZmlsZXMgKi8KLX0gcG5nX2NvbG9yXzE2OwotdHlwZWRlZiBwbmdfY29sb3JfMTYgRkFSICogcG5nX2NvbG9yXzE2cDsKLXR5cGVkZWYgcG5nX2NvbG9yXzE2IEZBUiAqIEZBUiAqIHBuZ19jb2xvcl8xNnBwOwotCi10eXBlZGVmIHN0cnVjdCBwbmdfY29sb3JfOF9zdHJ1Y3QKLXsKLSAgIHBuZ19ieXRlIHJlZDsgICAvKiBmb3IgdXNlIGluIHJlZCBncmVlbiBibHVlIGZpbGVzICovCi0gICBwbmdfYnl0ZSBncmVlbjsKLSAgIHBuZ19ieXRlIGJsdWU7Ci0gICBwbmdfYnl0ZSBncmF5OyAgLyogZm9yIHVzZSBpbiBncmF5c2NhbGUgZmlsZXMgKi8KLSAgIHBuZ19ieXRlIGFscGhhOyAvKiBmb3IgYWxwaGEgY2hhbm5lbCBmaWxlcyAqLwotfSBwbmdfY29sb3JfODsKLXR5cGVkZWYgcG5nX2NvbG9yXzggRkFSICogcG5nX2NvbG9yXzhwOwotdHlwZWRlZiBwbmdfY29sb3JfOCBGQVIgKiBGQVIgKiBwbmdfY29sb3JfOHBwOwotCi0vKgotICogVGhlIGZvbGxvd2luZyB0d28gc3RydWN0dXJlcyBhcmUgdXNlZCBmb3IgdGhlIGluLWNvcmUgcmVwcmVzZW50YXRpb24KLSAqIG9mIHNQTFQgY2h1bmtzLgotICovCi10eXBlZGVmIHN0cnVjdCBwbmdfc1BMVF9lbnRyeV9zdHJ1Y3QKLXsKLSAgIHBuZ191aW50XzE2IHJlZDsKLSAgIHBuZ191aW50XzE2IGdyZWVuOwotICAgcG5nX3VpbnRfMTYgYmx1ZTsKLSAgIHBuZ191aW50XzE2IGFscGhhOwotICAgcG5nX3VpbnRfMTYgZnJlcXVlbmN5OwotfSBwbmdfc1BMVF9lbnRyeTsKLXR5cGVkZWYgcG5nX3NQTFRfZW50cnkgRkFSICogcG5nX3NQTFRfZW50cnlwOwotdHlwZWRlZiBwbmdfc1BMVF9lbnRyeSBGQVIgKiBGQVIgKiBwbmdfc1BMVF9lbnRyeXBwOwotCi0vKiAgV2hlbiB0aGUgZGVwdGggb2YgdGhlIHNQTFQgcGFsZXR0ZSBpcyA4IGJpdHMsIHRoZSBjb2xvciBhbmQgYWxwaGEgc2FtcGxlcwotICogIG9jY3VweSB0aGUgTFNCIG9mIHRoZWlyIHJlc3BlY3RpdmUgbWVtYmVycywgYW5kIHRoZSBNU0Igb2YgZWFjaCBtZW1iZXIKLSAqICBpcyB6ZXJvLWZpbGxlZC4gIFRoZSBmcmVxdWVuY3kgbWVtYmVyIGFsd2F5cyBvY2N1cGllcyB0aGUgZnVsbCAxNiBiaXRzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHBuZ19zUExUX3N0cnVjdAotewotICAgcG5nX2NoYXJwIG5hbWU7ICAgICAgICAgICAvKiBwYWxldHRlIG5hbWUgKi8KLSAgIHBuZ19ieXRlIGRlcHRoOyAgICAgICAgICAgLyogZGVwdGggb2YgcGFsZXR0ZSBzYW1wbGVzICovCi0gICBwbmdfc1BMVF9lbnRyeXAgZW50cmllczsgIC8qIHBhbGV0dGUgZW50cmllcyAqLwotICAgcG5nX2ludF8zMiBuZW50cmllczsgICAgICAvKiBudW1iZXIgb2YgcGFsZXR0ZSBlbnRyaWVzICovCi19IHBuZ19zUExUX3Q7Ci10eXBlZGVmIHBuZ19zUExUX3QgRkFSICogcG5nX3NQTFRfdHA7Ci10eXBlZGVmIHBuZ19zUExUX3QgRkFSICogRkFSICogcG5nX3NQTFRfdHBwOwotCi0jaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECi0vKiBwbmdfdGV4dCBob2xkcyB0aGUgY29udGVudHMgb2YgYSB0ZXh0L3p0eHQvaXR4dCBjaHVuayBpbiBhIFBORyBmaWxlLAotICogYW5kIHdoZXRoZXIgdGhhdCBjb250ZW50cyBpcyBjb21wcmVzc2VkIG9yIG5vdC4gIFRoZSAia2V5IiBmaWVsZAotICogcG9pbnRzIHRvIGEgcmVndWxhciB6ZXJvLXRlcm1pbmF0ZWQgQyBzdHJpbmcuICBUaGUgInRleHQiLCAibGFuZyIsIGFuZAotICogImxhbmdfa2V5IiBmaWVsZHMgY2FuIGJlIHJlZ3VsYXIgQyBzdHJpbmdzLCBlbXB0eSBzdHJpbmdzLCBvciBOVUxMIHBvaW50ZXJzLgotICogSG93ZXZlciwgdGhlICogc3RydWN0dXJlIHJldHVybmVkIGJ5IHBuZ19nZXRfdGV4dCgpIHdpbGwgYWx3YXlzIGNvbnRhaW4KLSAqIHJlZ3VsYXIgemVyby10ZXJtaW5hdGVkIEMgc3RyaW5ncyAocG9zc2libHkgZW1wdHkpLCBuZXZlciBOVUxMIHBvaW50ZXJzLAotICogc28gdGhleSBjYW4gYmUgc2FmZWx5IHVzZWQgaW4gcHJpbnRmKCkgYW5kIG90aGVyIHN0cmluZy1oYW5kbGluZyBmdW5jdGlvbnMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHBuZ190ZXh0X3N0cnVjdAotewotICAgaW50ICBjb21wcmVzc2lvbjsgICAgICAgLyogY29tcHJlc3Npb24gdmFsdWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiB0RVh0LCBub25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiB6VFh0LCBkZWZsYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBpVFh0LCBub25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBpVFh0LCBkZWZsYXRlICAqLwotICAgcG5nX2NoYXJwIGtleTsgICAgICAgICAgLyoga2V5d29yZCwgMS03OSBjaGFyYWN0ZXIgZGVzY3JpcHRpb24gb2YgInRleHQiICovCi0gICBwbmdfY2hhcnAgdGV4dDsgICAgICAgICAvKiBjb21tZW50LCBtYXkgYmUgYW4gZW1wdHkgc3RyaW5nIChpZSAiIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgTlVMTCBwb2ludGVyICovCi0gICBwbmdfc2l6ZV90IHRleHRfbGVuZ3RoOyAvKiBsZW5ndGggb2YgdGhlIHRleHQgc3RyaW5nICovCi0jaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICBwbmdfc2l6ZV90IGl0eHRfbGVuZ3RoOyAvKiBsZW5ndGggb2YgdGhlIGl0eHQgc3RyaW5nICovCi0gICBwbmdfY2hhcnAgbGFuZzsgICAgICAgICAvKiBsYW5ndWFnZSBjb2RlLCAwLTc5IGNoYXJhY3RlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgTlVMTCBwb2ludGVyICovCi0gICBwbmdfY2hhcnAgbGFuZ19rZXk7ICAgICAvKiBrZXl3b3JkIHRyYW5zbGF0ZWQgVVRGLTggc3RyaW5nLCAwIG9yIG1vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzIG9yIGEgTlVMTCBwb2ludGVyICovCi0jZW5kaWYKLX0gcG5nX3RleHQ7Ci10eXBlZGVmIHBuZ190ZXh0IEZBUiAqIHBuZ190ZXh0cDsKLXR5cGVkZWYgcG5nX3RleHQgRkFSICogRkFSICogcG5nX3RleHRwcDsKLSNlbmRpZgotCi0vKiBTdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZXMgZm9yIHRleHQgaW4gUE5HIGZpbGVzICh0RVh0LCBhbmQgelRYdCkuCi0gKiBUaGUgdmFsdWVzIG9mIHRoZSBQTkdfVEVYVF9DT01QUkVTU0lPTl8gZGVmaW5lcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCi0jZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1IgLTMKLSNkZWZpbmUgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUiAtMgotI2RlZmluZSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FICAgIC0xCi0jZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQgICAgIDAKLSNkZWZpbmUgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORSAgICAgMQotI2RlZmluZSBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0ICAgICAyCi0jZGVmaW5lIFBOR19URVhUX0NPTVBSRVNTSU9OX0xBU1QgICAgIDMgIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCi0KLS8qIHBuZ190aW1lIGlzIGEgd2F5IHRvIGhvbGQgdGhlIHRpbWUgaW4gYW4gbWFjaGluZSBpbmRlcGVuZGVudCB3YXkuCi0gKiBUd28gY29udmVyc2lvbnMgYXJlIHByb3ZpZGVkLCBib3RoIGZyb20gdGltZV90IGFuZCBzdHJ1Y3QgdG0uICBUaGVyZQotICogaXMgbm8gcG9ydGFibGUgd2F5IHRvIGNvbnZlcnQgdG8gZWl0aGVyIG9mIHRoZXNlIHN0cnVjdHVyZXMsIGFzIGZhcgotICogYXMgSSBrbm93LiAgSWYgeW91IGtub3cgb2YgYSBwb3J0YWJsZSB3YXksIHNlbmQgaXQgdG8gbWUuICBBcyBhIHNpZGUKLSAqIG5vdGUgLSBQTkcgaGFzIGFsd2F5cyBiZWVuIFllYXIgMjAwMCBjb21wbGlhbnQhCi0gKi8KLXR5cGVkZWYgc3RydWN0IHBuZ190aW1lX3N0cnVjdAotewotICAgcG5nX3VpbnRfMTYgeWVhcjsgLyogZnVsbCB5ZWFyLCBhcyBpbiwgMTk5NSAqLwotICAgcG5nX2J5dGUgbW9udGg7ICAgLyogbW9udGggb2YgeWVhciwgMSAtIDEyICovCi0gICBwbmdfYnl0ZSBkYXk7ICAgICAvKiBkYXkgb2YgbW9udGgsIDEgLSAzMSAqLwotICAgcG5nX2J5dGUgaG91cjsgICAgLyogaG91ciBvZiBkYXksIDAgLSAyMyAqLwotICAgcG5nX2J5dGUgbWludXRlOyAgLyogbWludXRlIG9mIGhvdXIsIDAgLSA1OSAqLwotICAgcG5nX2J5dGUgc2Vjb25kOyAgLyogc2Vjb25kIG9mIG1pbnV0ZSwgMCAtIDYwIChmb3IgbGVhcCBzZWNvbmRzKSAqLwotfSBwbmdfdGltZTsKLXR5cGVkZWYgcG5nX3RpbWUgRkFSICogcG5nX3RpbWVwOwotdHlwZWRlZiBwbmdfdGltZSBGQVIgKiBGQVIgKiBwbmdfdGltZXBwOwotCi0jaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotLyogcG5nX3Vua25vd25fY2h1bmsgaXMgYSBzdHJ1Y3R1cmUgdG8gaG9sZCBxdWV1ZWQgY2h1bmtzIGZvciB3aGljaCB0aGVyZSBpcwotICogbm8gc3BlY2lmaWMgc3VwcG9ydC4gIFRoZSBpZGVhIGlzIHRoYXQgd2UgY2FuIHVzZSB0aGlzIHRvIHF1ZXVlCi0gKiB1cCBwcml2YXRlIGNodW5rcyBmb3Igb3V0cHV0IGV2ZW4gdGhvdWdoIHRoZSBsaWJyYXJ5IGRvZXNuJ3QgYWN0dWFsbHkKLSAqIGtub3cgYWJvdXQgdGhlaXIgc2VtYW50aWNzLgotICovCi0jZGVmaW5lIFBOR19DSFVOS19OQU1FX0xFTkdUSCA1Ci10eXBlZGVmIHN0cnVjdCBwbmdfdW5rbm93bl9jaHVua190Ci17Ci0gICAgcG5nX2J5dGUgbmFtZVtQTkdfQ0hVTktfTkFNRV9MRU5HVEhdOwotICAgIHBuZ19ieXRlICpkYXRhOwotICAgIHBuZ19zaXplX3Qgc2l6ZTsKLQotICAgIC8qIGxpYnBuZy11c2luZyBhcHBsaWNhdGlvbnMgc2hvdWxkIE5PVCBkaXJlY3RseSBtb2RpZnkgdGhpcyBieXRlLiAqLwotICAgIHBuZ19ieXRlIGxvY2F0aW9uOyAvKiBtb2RlIG9mIG9wZXJhdGlvbiBhdCByZWFkIHRpbWUgKi8KLX0KLXBuZ191bmtub3duX2NodW5rOwotdHlwZWRlZiBwbmdfdW5rbm93bl9jaHVuayBGQVIgKiBwbmdfdW5rbm93bl9jaHVua3A7Ci10eXBlZGVmIHBuZ191bmtub3duX2NodW5rIEZBUiAqIEZBUiAqIHBuZ191bmtub3duX2NodW5rcHA7Ci0jZW5kaWYKLQotLyogcG5nX2luZm8gaXMgYSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgaW5mb3JtYXRpb24gaW4gYSBQTkcgZmlsZSBzbwotICogdGhhdCB0aGUgYXBwbGljYXRpb24gY2FuIGZpbmQgb3V0IHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGltYWdlLgotICogSWYgeW91IGFyZSByZWFkaW5nIHRoZSBmaWxlLCB0aGlzIHN0cnVjdHVyZSB3aWxsIHRlbGwgeW91IHdoYXQgaXMKLSAqIGluIHRoZSBQTkcgZmlsZS4gIElmIHlvdSBhcmUgd3JpdGluZyB0aGUgZmlsZSwgZmlsbCBpbiB0aGUgaW5mb3JtYXRpb24KLSAqIHlvdSB3YW50IHRvIHB1dCBpbnRvIHRoZSBQTkcgZmlsZSwgdGhlbiBjYWxsIHBuZ193cml0ZV9pbmZvKCkuCi0gKiBUaGUgbmFtZXMgY2hvc2VuIHNob3VsZCBiZSB2ZXJ5IGNsb3NlIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgc28KLSAqIGNvbnN1bHQgdGhhdCBkb2N1bWVudCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lYW5pbmcgb2YgZWFjaCBmaWVsZC4KLSAqCi0gKiBXaXRoIGxpYnBuZyA8IDAuOTUsIGl0IHdhcyBvbmx5IHBvc3NpYmxlIHRvIGRpcmVjdGx5IHNldCBhbmQgcmVhZCB0aGUKLSAqIHRoZSB2YWx1ZXMgaW4gdGhlIHBuZ19pbmZvX3N0cnVjdCwgd2hpY2ggbWVhbnQgdGhhdCB0aGUgY29udGVudHMgYW5kCi0gKiBvcmRlciBvZiB0aGUgdmFsdWVzIGhhZCB0byByZW1haW4gZml4ZWQuICBXaXRoIGxpYnBuZyAwLjk1IGFuZCBsYXRlciwKLSAqIGhvd2V2ZXIsIHRoZXJlIGFyZSBub3cgZnVuY3Rpb25zIHRoYXQgYWJzdHJhY3QgdGhlIGNvbnRlbnRzIG9mCi0gKiBwbmdfaW5mb19zdHJ1Y3QgZnJvbSB0aGUgYXBwbGljYXRpb24sIHNvIHRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHVzZQotICogbGlicG5nIHdpdGggZHluYW1pYyBsaWJyYXJpZXMsIGFuZCBldmVuIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZQotICogbGlicmFyaWVzIHRoYXQgZG9uJ3QgaGF2ZSBhbGwgb2YgdGhlIGxpYnBuZyBhbmNpbGxhcnkgY2h1bmstaGFuZGluZwotICogZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBJbiBhbnkgY2FzZSwgdGhlIG9yZGVyIG9mIHRoZSBwYXJhbWV0ZXJzIGluIHBuZ19pbmZvX3N0cnVjdCBzaG91bGQgTk9UCi0gKiBiZSBjaGFuZ2VkIGZvciBhcyBsb25nIGFzIHBvc3NpYmxlIHRvIGtlZXAgY29tcGF0aWJpbGl0eSB3aXRoIGFwcGxpY2F0aW9ucwotICogdGhhdCB1c2UgdGhlIG9sZCBkaXJlY3QtYWNjZXNzIG1ldGhvZCB3aXRoIHBuZ19pbmZvX3N0cnVjdC4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIG1lbWJlcnMgbWF5IGhhdmUgYWxsb2NhdGVkIHN0b3JhZ2UgYXR0YWNoZWQgdGhhdCBzaG91bGQgYmUKLSAqIGNsZWFuZWQgdXAgYmVmb3JlIHRoZSBzdHJ1Y3R1cmUgaXMgZGlzY2FyZGVkOiBwYWxldHRlLCB0cmFucywgdGV4dCwKLSAqIHBjYWxfcHVycG9zZSwgcGNhbF91bml0cywgcGNhbF9wYXJhbXMsIGhpc3QsIGljY3BfbmFtZSwgaWNjcF9wcm9maWxlLAotICogc3BsdF9wYWxldHRlcywgc2NhbF91bml0LCByb3dfcG9pbnRlcnMsIGFuZCB1bmtub3ducy4gICBCeSBkZWZhdWx0LCB0aGVzZQotICogYXJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlbiB0aGUgaW5mbyBzdHJ1Y3R1cmUgaXMgZGVhbGxvY2F0ZWQsIGlmIHRoZXkgd2VyZQotICogYWxsb2NhdGVkIGludGVybmFsbHkgYnkgbGlicG5nLiAgVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCBieSBtZWFucwotICogb2YgdGhlIHBuZ19kYXRhX2ZyZWVyKCkgZnVuY3Rpb24uCi0gKgotICogTW9yZSBhbGxvY2F0aW9uIGRldGFpbHM6IGFsbCB0aGUgY2h1bmstcmVhZGluZyBmdW5jdGlvbnMgdGhhdAotICogY2hhbmdlIHRoZXNlIG1lbWJlcnMgZ28gdGhyb3VnaCB0aGUgY29ycmVzcG9uZGluZyBwbmdfc2V0XyoKLSAqIGZ1bmN0aW9ucy4gIEEgZnVuY3Rpb24gdG8gY2xlYXIgdGhlc2UgbWVtYmVycyBpcyBhdmFpbGFibGU6IHNlZQotICogcG5nX2ZyZWVfZGF0YSgpLiAgVGhlIHBuZ19zZXRfKiBmdW5jdGlvbnMgZG8gbm90IGRlcGVuZCBvbiBiZWluZwotICogYWJsZSB0byBwb2ludCBpbmZvIHN0cnVjdHVyZSBtZW1iZXJzIHRvIGFueSBvZiB0aGUgc3RvcmFnZSB0aGV5IGFyZQotICogcGFzc2VkICh0aGV5IG1ha2UgdGhlaXIgb3duIGNvcGllcyksIEVYQ0VQVCB0aGF0IHRoZSBwbmdfc2V0X3RleHQKLSAqIGZ1bmN0aW9ucyB1c2UgdGhlIHNhbWUgc3RvcmFnZSBwYXNzZWQgdG8gdGhlbSBpbiB0aGUgdGV4dF9wdHIgb3IKLSAqIGl0eHRfcHRyIHN0cnVjdHVyZSBhcmd1bWVudCwgYW5kIHRoZSBwbmdfc2V0X3Jvd3MgYW5kIHBuZ19zZXRfdW5rbm93bnMKLSAqIGZ1bmN0aW9ucyBkbyBub3QgbWFrZSB0aGVpciBvd24gY29waWVzLgotICovCi10eXBlZGVmIHN0cnVjdCBwbmdfaW5mb19zdHJ1Y3QKLXsKLSAgIC8qIHRoZSBmb2xsb3dpbmcgYXJlIG5lY2Vzc2FyeSBmb3IgZXZlcnkgUE5HIGZpbGUgKi8KLSAgIHBuZ191aW50XzMyIHdpZHRoOyAgICAgICAvKiB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMgKGZyb20gSUhEUikgKi8KLSAgIHBuZ191aW50XzMyIGhlaWdodDsgICAgICAvKiBoZWlnaHQgb2YgaW1hZ2UgaW4gcGl4ZWxzIChmcm9tIElIRFIpICovCi0gICBwbmdfdWludF8zMiB2YWxpZDsgICAgICAgLyogdmFsaWQgY2h1bmsgZGF0YSAoc2VlIFBOR19JTkZPXyBiZWxvdykgKi8KLSAgIHBuZ191aW50XzMyIHJvd2J5dGVzOyAgICAvKiBieXRlcyBuZWVkZWQgdG8gaG9sZCBhbiB1bnRyYW5zZm9ybWVkIHJvdyAqLwotICAgcG5nX2NvbG9ycCBwYWxldHRlOyAgICAgIC8qIGFycmF5IG9mIGNvbG9yIHZhbHVlcyAodmFsaWQgJiBQTkdfSU5GT19QTFRFKSAqLwotICAgcG5nX3VpbnRfMTYgbnVtX3BhbGV0dGU7IC8qIG51bWJlciBvZiBjb2xvciBlbnRyaWVzIGluICJwYWxldHRlIiAoUExURSkgKi8KLSAgIHBuZ191aW50XzE2IG51bV90cmFuczsgICAvKiBudW1iZXIgb2YgdHJhbnNwYXJlbnQgcGFsZXR0ZSBjb2xvciAodFJOUykgKi8KLSAgIHBuZ19ieXRlIGJpdF9kZXB0aDsgICAgICAvKiAxLCAyLCA0LCA4LCBvciAxNiBiaXRzL2NoYW5uZWwgKGZyb20gSUhEUikgKi8KLSAgIHBuZ19ieXRlIGNvbG9yX3R5cGU7ICAgICAvKiBzZWUgUE5HX0NPTE9SX1RZUEVfIGJlbG93IChmcm9tIElIRFIpICovCi0gICAvKiBUaGUgZm9sbG93aW5nIHRocmVlIHNob3VsZCBoYXZlIGJlZW4gbmFtZWQgKl9tZXRob2Qgbm90ICpfdHlwZSAqLwotICAgcG5nX2J5dGUgY29tcHJlc3Npb25fdHlwZTsgLyogbXVzdCBiZSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIChJSERSKSAqLwotICAgcG5nX2J5dGUgZmlsdGVyX3R5cGU7ICAgIC8qIG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0JBU0UgKGZyb20gSUhEUikgKi8KLSAgIHBuZ19ieXRlIGludGVybGFjZV90eXBlOyAvKiBPbmUgb2YgUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfSU5URVJMQUNFX0FEQU03ICovCi0KLSAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgaW5mb3JtYXRpb25hbCBvbmx5IG9uIHJlYWQsIGFuZCBub3QgdXNlZCBvbiB3cml0ZXMuICovCi0gICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgLyogbnVtYmVyIG9mIGRhdGEgY2hhbm5lbHMgcGVyIHBpeGVsICgxLCAyLCAzLCA0KSAqLwotICAgcG5nX2J5dGUgcGl4ZWxfZGVwdGg7ICAgIC8qIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCAqLwotICAgcG5nX2J5dGUgc3BhcmVfYnl0ZTsgICAgIC8qIHRvIGFsaWduIHRoZSBkYXRhLCBhbmQgZm9yIGZ1dHVyZSB1c2UgKi8KLSAgIHBuZ19ieXRlIHNpZ25hdHVyZVs4XTsgICAvKiBtYWdpYyBieXRlcyByZWFkIGJ5IGxpYnBuZyBmcm9tIHN0YXJ0IG9mIGZpbGUgKi8KLQotICAgLyogVGhlIHJlc3Qgb2YgdGhlIGRhdGEgaXMgb3B0aW9uYWwuICBJZiB5b3UgYXJlIHJlYWRpbmcsIGNoZWNrIHRoZQotICAgICogdmFsaWQgZmllbGQgdG8gc2VlIGlmIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGVzZSBhcmUgdmFsaWQuICBJZiB5b3UKLSAgICAqIGFyZSB3cml0aW5nLCBzZXQgdGhlIHZhbGlkIGZpZWxkIHRvIHRob3NlIGNodW5rcyB5b3Ugd2FudCB3cml0dGVuLAotICAgICogYW5kIGluaXRpYWxpemUgdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBiZWxvdy4KLSAgICAqLwotCi0jaWYgZGVmaW5lZChQTkdfZ0FNQV9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKLSAgIC8qIFRoZSBnQU1BIGNodW5rIGRlc2NyaWJlcyB0aGUgZ2FtbWEgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBzeXN0ZW0KLSAgICAqIG9uIHdoaWNoIHRoZSBpbWFnZSB3YXMgY3JlYXRlZCwgbm9ybWFsbHkgaW4gdGhlIHJhbmdlIFsxLjAsIDIuNV0uCi0gICAgKiBEYXRhIGlzIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX2dBTUEpIGlzIG5vbi16ZXJvLgotICAgICovCi0gICBmbG9hdCBnYW1tYTsgLyogZ2FtbWEgdmFsdWUgb2YgaW1hZ2UsIGlmICh2YWxpZCAmIFBOR19JTkZPX2dBTUEpICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3NSR0JfU1VQUE9SVEVEKQotICAgIC8qIEdSLVAsIDAuOTZhICovCi0gICAgLyogRGF0YSB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19zUkdCKSBub24temVyby4gKi8KLSAgIHBuZ19ieXRlIHNyZ2JfaW50ZW50OyAvKiBzUkdCIHJlbmRlcmluZyBpbnRlbnQgWzAsIDEsIDIsIG9yIDNdICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1RFWFRfU1VQUE9SVEVEKQotICAgLyogVGhlIHRFWHQsIGFuZCB6VFh0IGNodW5rcyBjb250YWluIGh1bWFuLXJlYWRhYmxlIHRleHR1YWwgZGF0YSBpbgotICAgICogdW5jb21wcmVzc2VkLCBjb21wcmVzc2VkLCBhbmQgb3B0aW9uYWxseSBjb21wcmVzc2VkIGZvcm1zLCByZXNwZWN0aXZlbHkuCi0gICAgKiBUaGUgZGF0YSBpbiAidGV4dCIgaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdW5jb21wcmVzc2VkLAotICAgICogbnVsbC10ZXJtaW5hdGVkIEMgc3RyaW5ncy4gRWFjaCBjaHVuayBoYXMgYSBrZXl3b3JkIHRoYXQgZGVzY3JpYmVzIHRoZQotICAgICogdGV4dHVhbCBkYXRhIGNvbnRhaW5lZCBpbiB0aGF0IGNodW5rLiAgS2V5d29yZHMgYXJlIG5vdCByZXF1aXJlZCB0byBiZQotICAgICogdW5pcXVlLCBhbmQgdGhlIHRleHQgc3RyaW5nIG1heSBiZSBlbXB0eS4gIEFueSBudW1iZXIgb2YgdGV4dCBjaHVua3MgbWF5Ci0gICAgKiBiZSBpbiBhbiBpbWFnZS4KLSAgICAqLwotICAgaW50IG51bV90ZXh0OyAvKiBudW1iZXIgb2YgY29tbWVudHMgcmVhZC90byB3cml0ZSAqLwotICAgaW50IG1heF90ZXh0OyAvKiBjdXJyZW50IHNpemUgb2YgdGV4dCBhcnJheSAqLwotICAgcG5nX3RleHRwIHRleHQ7IC8qIGFycmF5IG9mIGNvbW1lbnRzIHJlYWQvdG8gd3JpdGUgKi8KLSNlbmRpZiAvKiBQTkdfVEVYVF9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoUE5HX3RJTUVfU1VQUE9SVEVEKQotICAgLyogVGhlIHRJTUUgY2h1bmsgaG9sZHMgdGhlIGxhc3QgdGltZSB0aGUgZGlzcGxheWVkIGltYWdlIGRhdGEgd2FzCi0gICAgKiBtb2RpZmllZC4gIFNlZSB0aGUgcG5nX3RpbWUgc3RydWN0IGZvciB0aGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3QuCi0gICAgKi8KLSAgIHBuZ190aW1lIG1vZF90aW1lOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19zQklUX1NVUFBPUlRFRCkKLSAgIC8qIFRoZSBzQklUIGNodW5rIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGhpZ2gtb3JkZXIgYml0cwotICAgICogaW4gdGhlIHBpeGVsIGRhdGEuICBWYWx1ZXMgYXJlIGluIHRoZSByYW5nZSBbMSwgYml0X2RlcHRoXSwgYW5kIGFyZQotICAgICogb25seSBzcGVjaWZpZWQgZm9yIHRoZSBjaGFubmVscyBpbiB0aGUgcGl4ZWwgZGF0YS4gIFRoZSBjb250ZW50cyBvZgotICAgICogdGhlIGxvdy1vcmRlciBiaXRzIGlzIG5vdCBzcGVjaWZpZWQuICBEYXRhIGlzIHZhbGlkIGlmCi0gICAgKiAodmFsaWQgJiBQTkdfSU5GT19zQklUKSBpcyBub24temVyby4KLSAgICAqLwotICAgcG5nX2NvbG9yXzggc2lnX2JpdDsgLyogc2lnbmlmaWNhbnQgYml0cyBpbiBjb2xvciBjaGFubmVscyAqLwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR190Uk5TX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKSB8fCBcCi1kZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgLyogVGhlIHRSTlMgY2h1bmsgc3VwcGxpZXMgdHJhbnNwYXJlbmN5IGRhdGEgZm9yIHBhbGV0dGVkIGltYWdlcyBhbmQKLSAgICAqIG90aGVyIGltYWdlIHR5cGVzIHRoYXQgZG9uJ3QgbmVlZCBhIGZ1bGwgYWxwaGEgY2hhbm5lbC4gIFRoZXJlIGFyZQotICAgICogIm51bV90cmFucyIgdHJhbnNwYXJlbmN5IHZhbHVlcyBmb3IgYSBwYWxldHRlZCBpbWFnZSwgc3RvcmVkIGluIHRoZQotICAgICogc2FtZSBvcmRlciBhcyB0aGUgcGFsZXR0ZSBjb2xvcnMsIHN0YXJ0aW5nIGZyb20gaW5kZXggMC4gIFZhbHVlcwotICAgICogZm9yIHRoZSBkYXRhIGFyZSBpbiB0aGUgcmFuZ2UgWzAsIDI1NV0sIHJhbmdpbmcgZnJvbSBmdWxseSB0cmFuc3BhcmVudAotICAgICogdG8gZnVsbHkgb3BhcXVlLCByZXNwZWN0aXZlbHkuICBGb3Igbm9uLXBhbGV0dGVkIGltYWdlcywgdGhlcmUgaXMgYQotICAgICogc2luZ2xlIGNvbG9yIHNwZWNpZmllZCB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGZ1bGx5IHRyYW5zcGFyZW50LgotICAgICogRGF0YSBpcyB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT190Uk5TKSBpcyBub24temVyby4KLSAgICAqLwotICAgcG5nX2J5dGVwIHRyYW5zOyAvKiB0cmFuc3BhcmVudCB2YWx1ZXMgZm9yIHBhbGV0dGVkIGltYWdlICovCi0gICBwbmdfY29sb3JfMTYgdHJhbnNfdmFsdWVzOyAvKiB0cmFuc3BhcmVudCBjb2xvciBmb3Igbm9uLXBhbGV0dGUgaW1hZ2UgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfYktHRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0gICAvKiBUaGUgYktHRCBjaHVuayBnaXZlcyB0aGUgc3VnZ2VzdGVkIGltYWdlIGJhY2tncm91bmQgY29sb3IgaWYgdGhlCi0gICAgKiBkaXNwbGF5IHByb2dyYW0gZG9lcyBub3QgaGF2ZSBpdHMgb3duIGJhY2tncm91bmQgY29sb3IgYW5kIHRoZSBpbWFnZQotICAgICogaXMgbmVlZHMgdG8gY29tcG9zaXRlZCBvbnRvIGEgYmFja2dyb3VuZCBiZWZvcmUgZGlzcGxheS4gIFRoZSBjb2xvcnMKLSAgICAqIGluICJiYWNrZ3JvdW5kIiBhcmUgbm9ybWFsbHkgaW4gdGhlIHNhbWUgY29sb3Igc3BhY2UvZGVwdGggYXMgdGhlCi0gICAgKiBwaXhlbCBkYXRhLiAgRGF0YSBpcyB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19iS0dEKSBpcyBub24temVyby4KLSAgICAqLwotICAgcG5nX2NvbG9yXzE2IGJhY2tncm91bmQ7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX29GRnNfU1VQUE9SVEVEKQotICAgLyogVGhlIG9GRnMgY2h1bmsgZ2l2ZXMgdGhlIG9mZnNldCBpbiAib2Zmc2V0X3VuaXRfdHlwZSIgdW5pdHMgcmlnaHR3YXJkcwotICAgICogYW5kIGRvd253YXJkcyBmcm9tIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGRpc3BsYXksIHBhZ2UsIG9yIG90aGVyCi0gICAgKiBhcHBsaWNhdGlvbi1zcGVjaWZpYyBjby1vcmRpbmF0ZSBzcGFjZS4gIFNlZSB0aGUgUE5HX09GRlNFVF8gZGVmaW5lcwotICAgICogYmVsb3cgZm9yIHRoZSB1bml0IHR5cGVzLiAgVmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fb0ZGcykgbm9uLXplcm8uCi0gICAgKi8KLSAgIHBuZ19pbnRfMzIgeF9vZmZzZXQ7IC8qIHggb2Zmc2V0IG9uIHBhZ2UgKi8KLSAgIHBuZ19pbnRfMzIgeV9vZmZzZXQ7IC8qIHkgb2Zmc2V0IG9uIHBhZ2UgKi8KLSAgIHBuZ19ieXRlIG9mZnNldF91bml0X3R5cGU7IC8qIG9mZnNldCB1bml0cyB0eXBlICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3BIWXNfU1VQUE9SVEVEKQotICAgLyogVGhlIHBIWXMgY2h1bmsgZ2l2ZXMgdGhlIHBoeXNpY2FsIHBpeGVsIGRlbnNpdHkgb2YgdGhlIGltYWdlIGZvcgotICAgICogZGlzcGxheSBvciBwcmludGluZyBpbiAicGh5c191bml0X3R5cGUiIHVuaXRzIChzZWUgUE5HX1JFU09MVVRJT05fCi0gICAgKiBkZWZpbmVzIGJlbG93KS4gIERhdGEgaXMgdmFsaWQgaWYgKHZhbGlkICYgUE5HX0lORk9fcEhZcykgaXMgbm9uLXplcm8uCi0gICAgKi8KLSAgIHBuZ191aW50XzMyIHhfcGl4ZWxzX3Blcl91bml0OyAvKiBob3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KLSAgIHBuZ191aW50XzMyIHlfcGl4ZWxzX3Blcl91bml0OyAvKiB2ZXJ0aWNhbCBwaXhlbCBkZW5zaXR5ICovCi0gICBwbmdfYnl0ZSBwaHlzX3VuaXRfdHlwZTsgLyogcmVzb2x1dGlvbiB0eXBlIChzZWUgUE5HX1JFU09MVVRJT05fIGJlbG93KSAqLwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19oSVNUX1NVUFBPUlRFRCkKLSAgIC8qIFRoZSBoSVNUIGNodW5rIGNvbnRhaW5zIHRoZSByZWxhdGl2ZSBmcmVxdWVuY3kgb3IgaW1wb3J0YW5jZSBvZiB0aGUKLSAgICAqIHZhcmlvdXMgcGFsZXR0ZSBlbnRyaWVzLCBzbyB0aGF0IGEgdmlld2VyIGNhbiBpbnRlbGxpZ2VudGx5IHNlbGVjdCBhCi0gICAgKiByZWR1Y2VkLWNvbG9yIHBhbGV0dGUsIGlmIHJlcXVpcmVkLiAgRGF0YSBpcyBhbiBhcnJheSBvZiAibnVtX3BhbGV0dGUiCi0gICAgKiB2YWx1ZXMgaW4gdGhlIHJhbmdlIFswLDY1NTM1XS4gRGF0YSB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19oSVNUKQotICAgICogaXMgbm9uLXplcm8uCi0gICAgKi8KLSAgIHBuZ191aW50XzE2cCBoaXN0OwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfY0hSTV9TVVBQT1JURUQKLSAgIC8qIFRoZSBjSFJNIGNodW5rIGRlc2NyaWJlcyB0aGUgQ0lFIGNvbG9yIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgbW9uaXRvcgotICAgICogb24gd2hpY2ggdGhlIFBORyB3YXMgY3JlYXRlZC4gIFRoaXMgZGF0YSBhbGxvd3MgdGhlIHZpZXdlciB0byBkbyBnYW11dAotICAgICogbWFwcGluZyBvZiB0aGUgaW5wdXQgaW1hZ2UgdG8gZW5zdXJlIHRoYXQgdGhlIHZpZXdlciBzZWVzIHRoZSBzYW1lCi0gICAgKiBjb2xvcnMgaW4gdGhlIGltYWdlIGFzIHRoZSBjcmVhdG9yLiAgVmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UKLSAgICAqIFswLjAsIDAuOF0uICBEYXRhIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX2NIUk0pIG5vbi16ZXJvLgotICAgICovCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgZmxvYXQgeF93aGl0ZTsKLSAgIGZsb2F0IHlfd2hpdGU7Ci0gICBmbG9hdCB4X3JlZDsKLSAgIGZsb2F0IHlfcmVkOwotICAgZmxvYXQgeF9ncmVlbjsKLSAgIGZsb2F0IHlfZ3JlZW47Ci0gICBmbG9hdCB4X2JsdWU7Ci0gICBmbG9hdCB5X2JsdWU7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfcENBTF9TVVBQT1JURUQpCi0gICAvKiBUaGUgcENBTCBjaHVuayBkZXNjcmliZXMgYSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIHRoZSBzdG9yZWQgcGl4ZWwKLSAgICAqIHZhbHVlcyBhbmQgb3JpZ2luYWwgcGh5c2ljYWwgZGF0YSB2YWx1ZXMgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlLgotICAgICogVGhlIGludGVnZXIgcmFuZ2UgWzAsIDJeYml0X2RlcHRoIC0gMV0gbWFwcyB0byB0aGUgZmxvYXRpbmctcG9pbnQKLSAgICAqIHJhbmdlIGdpdmVuIGJ5IFtwY2FsX1gwLCBwY2FsX1gxXSwgYW5kIGFyZSBmdXJ0aGVyIHRyYW5zZm9ybWVkIGJ5IGEKLSAgICAqIChwb3NzaWJseSBub24tbGluZWFyKSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBnaXZlbiBieSAicGNhbF90eXBlIgotICAgICogYW5kICJwY2FsX3BhcmFtcyIgaW50byAicGNhbF91bml0cyIuICBQbGVhc2Ugc2VlIHRoZSBQTkdfRVFVQVRJT05fCi0gICAgKiBkZWZpbmVzIGJlbG93LCBhbmQgdGhlIFBORy1Hcm91cCdzIFBORyBleHRlbnNpb25zIGRvY3VtZW50IGZvciBhCi0gICAgKiBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb25zIGFuZCBob3cgdGhleSBzaG91bGQgYmUKLSAgICAqIGltcGxlbWVudGVkLCBhbmQgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIEFTQ0lJIHBhcmFtZXRlciBzdHJpbmdzLgotICAgICogRGF0YSB2YWx1ZXMgYXJlIHZhbGlkIGlmICh2YWxpZCAmIFBOR19JTkZPX3BDQUwpIG5vbi16ZXJvLgotICAgICovCi0gICBwbmdfY2hhcnAgcGNhbF9wdXJwb3NlOyAgLyogcENBTCBjaHVuayBkZXNjcmlwdGlvbiBzdHJpbmcgKi8KLSAgIHBuZ19pbnRfMzIgcGNhbF9YMDsgICAgICAvKiBtaW5pbXVtIHZhbHVlICovCi0gICBwbmdfaW50XzMyIHBjYWxfWDE7ICAgICAgLyogbWF4aW11bSB2YWx1ZSAqLwotICAgcG5nX2NoYXJwIHBjYWxfdW5pdHM7ICAgIC8qIExhdGluLTEgc3RyaW5nIGdpdmluZyBwaHlzaWNhbCB1bml0cyAqLwotICAgcG5nX2NoYXJwcCBwY2FsX3BhcmFtczsgIC8qIEFTQ0lJIHN0cmluZ3MgY29udGFpbmluZyBwYXJhbWV0ZXIgdmFsdWVzICovCi0gICBwbmdfYnl0ZSBwY2FsX3R5cGU7ICAgICAgLyogZXF1YXRpb24gdHlwZSAoc2VlIFBOR19FUVVBVElPTl8gYmVsb3cpICovCi0gICBwbmdfYnl0ZSBwY2FsX25wYXJhbXM7ICAgLyogbnVtYmVyIG9mIHBhcmFtZXRlcnMgZ2l2ZW4gaW4gcGNhbF9wYXJhbXMgKi8KLSNlbmRpZgotCi0vKiBOZXcgbWVtYmVycyBhZGRlZCBpbiBsaWJwbmctMS4wLjYgKi8KLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgIHBuZ191aW50XzMyIGZyZWVfbWU7ICAgICAvKiBmbGFncyBpdGVtcyBsaWJwbmcgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotICAgLyogc3RvcmFnZSBmb3IgdW5rbm93biBjaHVua3MgdGhhdCB0aGUgbGlicmFyeSBkb2Vzbid0IHJlY29nbml6ZS4gKi8KLSAgIHBuZ191bmtub3duX2NodW5rcCB1bmtub3duX2NodW5rczsKLSAgIHBuZ19zaXplX3QgdW5rbm93bl9jaHVua3NfbnVtOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19pQ0NQX1NVUFBPUlRFRCkKLSAgIC8qIGlDQ1AgY2h1bmsgZGF0YS4gKi8KLSAgIHBuZ19jaGFycCBpY2NwX25hbWU7ICAgICAvKiBwcm9maWxlIG5hbWUgKi8KLSAgIHBuZ19jaGFycCBpY2NwX3Byb2ZpbGU7ICAvKiBJbnRlcm5hdGlvbmFsIENvbG9yIENvbnNvcnRpdW0gcHJvZmlsZSBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90ZSB0byBtYWludGFpbmVyOiBzaG91bGQgYmUgcG5nX2J5dGVwICovCi0gICBwbmdfdWludF8zMiBpY2NwX3Byb2ZsZW47ICAvKiBJQ0MgcHJvZmlsZSBkYXRhIGxlbmd0aCAqLwotICAgcG5nX2J5dGUgaWNjcF9jb21wcmVzc2lvbjsgLyogQWx3YXlzIHplcm8gKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfc1BMVF9TVVBQT1JURUQpCi0gICAvKiBkYXRhIG9uIHNQTFQgY2h1bmtzICh0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSkuICovCi0gICBwbmdfc1BMVF90cCBzcGx0X3BhbGV0dGVzOwotICAgcG5nX3VpbnRfMzIgc3BsdF9wYWxldHRlc19udW07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3NDQUxfU1VQUE9SVEVEKQotICAgLyogVGhlIHNDQUwgY2h1bmsgZGVzY3JpYmVzIHRoZSBhY3R1YWwgcGh5c2ljYWwgZGltZW5zaW9ucyBvZiB0aGUKLSAgICAqIHN1YmplY3QgbWF0dGVyIG9mIHRoZSBncmFwaGljLiAgVGhlIGNodW5rIGNvbnRhaW5zIGEgdW5pdCBzcGVjaWZpY2F0aW9uCi0gICAgKiBhIGJ5dGUgdmFsdWUsIGFuZCB0d28gQVNDSUkgc3RyaW5ncyByZXByZXNlbnRpbmcgZmxvYXRpbmctcG9pbnQKLSAgICAqIHZhbHVlcy4gIFRoZSB2YWx1ZXMgYXJlIHdpZHRoIGFuZCBoZWlnaHQgY29ycmVzcG9uc2luZyB0byBvbmUgcGl4ZWwKLSAgICAqIGluIHRoZSBpbWFnZS4gIFRoaXMgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gaXMgY29udmVydGVkIHRvIGRvdWJsZQotICAgICogaGVyZS4gIERhdGEgdmFsdWVzIGFyZSB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19zQ0FMKSBpcyBub24temVyby4KLSAgICAqLwotICAgcG5nX2J5dGUgc2NhbF91bml0OyAgICAgICAgIC8qIHVuaXQgb2YgcGh5c2ljYWwgc2NhbGUgKi8KLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICBkb3VibGUgc2NhbF9waXhlbF93aWR0aDsgICAgLyogd2lkdGggb2Ygb25lIHBpeGVsICovCi0gICBkb3VibGUgc2NhbF9waXhlbF9oZWlnaHQ7ICAgLyogaGVpZ2h0IG9mIG9uZSBwaXhlbCAqLwotI2VuZGlmCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgcG5nX2NoYXJwIHNjYWxfc193aWR0aDsgICAgIC8qIHN0cmluZyBjb250YWluaW5nIGhlaWdodCAqLwotICAgcG5nX2NoYXJwIHNjYWxfc19oZWlnaHQ7ICAgIC8qIHN0cmluZyBjb250YWluaW5nIHdpZHRoICovCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQpCi0gICAvKiBNZW1vcnkgaGFzIGJlZW4gYWxsb2NhdGVkIGlmICh2YWxpZCAmIFBOR19BTExPQ0FURURfSU5GT19ST1dTKSBub24temVybyAqLwotICAgLyogRGF0YSB2YWxpZCBpZiAodmFsaWQgJiBQTkdfSU5GT19JREFUKSBub24temVybyAqLwotICAgcG5nX2J5dGVwcCByb3dfcG9pbnRlcnM7ICAgICAgICAvKiB0aGUgaW1hZ2UgYml0cyAqLwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX2dBTUFfU1VQUE9SVEVEKQotICAgcG5nX2ZpeGVkX3BvaW50IGludF9nYW1tYTsgLyogZ2FtbWEgb2YgaW1hZ2UsIGlmICh2YWxpZCAmIFBOR19JTkZPX2dBTUEpICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2NIUk1fU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQpCi0gICBwbmdfZml4ZWRfcG9pbnQgaW50X3hfd2hpdGU7Ci0gICBwbmdfZml4ZWRfcG9pbnQgaW50X3lfd2hpdGU7Ci0gICBwbmdfZml4ZWRfcG9pbnQgaW50X3hfcmVkOwotICAgcG5nX2ZpeGVkX3BvaW50IGludF95X3JlZDsKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfeF9ncmVlbjsKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfeV9ncmVlbjsKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfeF9ibHVlOwotICAgcG5nX2ZpeGVkX3BvaW50IGludF95X2JsdWU7Ci0jZW5kaWYKLQotfSBwbmdfaW5mbzsKLQotdHlwZWRlZiBwbmdfaW5mbyBGQVIgKiBwbmdfaW5mb3A7Ci10eXBlZGVmIHBuZ19pbmZvIEZBUiAqIEZBUiAqIHBuZ19pbmZvcHA7Ci0KLS8qIE1heGltdW0gcG9zaXRpdmUgaW50ZWdlciB1c2VkIGluIFBORyBpcyAoMl4zMSktMSAqLwotI2RlZmluZSBQTkdfVUlOVF8zMV9NQVggKChwbmdfdWludF8zMikweDdmZmZmZmZmTCkKLSNkZWZpbmUgUE5HX1VJTlRfMzJfTUFYICgocG5nX3VpbnRfMzIpKC0xKSkKLSNkZWZpbmUgUE5HX1NJWkVfTUFYICgocG5nX3NpemVfdCkoLTEpKQotI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkIChQTkdfMV8yX1gpCi0vKiBQTkdfTUFYX1VJTlQgaXMgZGVwcmVjYXRlZDsgdXNlIFBOR19VSU5UXzMxX01BWCBpbnN0ZWFkLiAqLwotI2RlZmluZSBQTkdfTUFYX1VJTlQgUE5HX1VJTlRfMzFfTUFYCi0jZW5kaWYKLQotLyogVGhlc2UgZGVzY3JpYmUgdGhlIGNvbG9yX3R5cGUgZmllbGQgaW4gcG5nX2luZm8uICovCi0vKiBjb2xvciB0eXBlIG1hc2tzICovCi0jZGVmaW5lIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUgICAgMQotI2RlZmluZSBQTkdfQ09MT1JfTUFTS19DT0xPUiAgICAgIDIKLSNkZWZpbmUgUE5HX0NPTE9SX01BU0tfQUxQSEEgICAgICA0Ci0KLS8qIGNvbG9yIHR5cGVzLiAgTm90ZSB0aGF0IG5vdCBhbGwgY29tYmluYXRpb25zIGFyZSBsZWdhbCAqLwotI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9HUkFZIDAKLSNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAgKFBOR19DT0xPUl9NQVNLX0NPTE9SIHwgUE5HX0NPTE9SX01BU0tfUEFMRVRURSkKLSNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfUkdCICAgICAgICAoUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0jZGVmaW5lIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSAgKFBOR19DT0xPUl9NQVNLX0NPTE9SIHwgUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0jZGVmaW5lIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEgKFBOR19DT0xPUl9NQVNLX0FMUEhBKQotLyogYWxpYXNlcyAqLwotI2RlZmluZSBQTkdfQ09MT1JfVFlQRV9SR0JBICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKLSNkZWZpbmUgUE5HX0NPTE9SX1RZUEVfR0EgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKLQotLyogVGhpcyBpcyBmb3IgY29tcHJlc3Npb24gdHlwZS4gUE5HIDEuMC0xLjIgb25seSBkZWZpbmUgdGhlIHNpbmdsZSB0eXBlLiAqLwotI2RlZmluZSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIDAgLyogRGVmbGF0ZSBtZXRob2QgOCwgMzJLIHdpbmRvdyAqLwotI2RlZmluZSBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxUIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UKLQotLyogVGhpcyBpcyBmb3IgZmlsdGVyIHR5cGUuIFBORyAxLjAtMS4yIG9ubHkgZGVmaW5lIHRoZSBzaW5nbGUgdHlwZS4gKi8KLSNkZWZpbmUgUE5HX0ZJTFRFUl9UWVBFX0JBU0UgICAgICAwIC8qIFNpbmdsZSByb3cgcGVyLWJ5dGUgZmlsdGVyaW5nICovCi0jZGVmaW5lIFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORyA2NCAvKiBVc2VkIG9ubHkgaW4gTU5HIGRhdGFzdHJlYW1zICovCi0jZGVmaW5lIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUICAgUE5HX0ZJTFRFUl9UWVBFX0JBU0UKLQotLyogVGhlc2UgYXJlIGZvciB0aGUgaW50ZXJsYWNpbmcgdHlwZS4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCi0jZGVmaW5lIFBOR19JTlRFUkxBQ0VfTk9ORSAgICAgICAgMCAvKiBOb24taW50ZXJsYWNlZCBpbWFnZSAqLwotI2RlZmluZSBQTkdfSU5URVJMQUNFX0FEQU03ICAgICAgIDEgLyogQWRhbTcgaW50ZXJsYWNpbmcgKi8KLSNkZWZpbmUgUE5HX0lOVEVSTEFDRV9MQVNUICAgICAgICAyIC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCi0KLS8qIFRoZXNlIGFyZSBmb3IgdGhlIG9GRnMgY2h1bmsuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLiAqLwotI2RlZmluZSBQTkdfT0ZGU0VUX1BJWEVMICAgICAgICAgIDAgLyogT2Zmc2V0IGluIHBpeGVscyAqLwotI2RlZmluZSBQTkdfT0ZGU0VUX01JQ1JPTUVURVIgICAgIDEgLyogT2Zmc2V0IGluIG1pY3JvbWV0ZXJzICgxLzEwXjYgbWV0ZXIpICovCi0jZGVmaW5lIFBOR19PRkZTRVRfTEFTVCAgICAgICAgICAgMiAvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLwotCi0vKiBUaGVzZSBhcmUgZm9yIHRoZSBwQ0FMIGNodW5rLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4gKi8KLSNkZWZpbmUgUE5HX0VRVUFUSU9OX0xJTkVBUiAgICAgICAwIC8qIExpbmVhciB0cmFuc2Zvcm1hdGlvbiAqLwotI2RlZmluZSBQTkdfRVFVQVRJT05fQkFTRV9FICAgICAgIDEgLyogRXhwb25lbnRpYWwgYmFzZSBlIHRyYW5zZm9ybSAqLwotI2RlZmluZSBQTkdfRVFVQVRJT05fQVJCSVRSQVJZICAgIDIgLyogQXJiaXRyYXJ5IGJhc2UgZXhwb25lbnRpYWwgdHJhbnNmb3JtICovCi0jZGVmaW5lIFBOR19FUVVBVElPTl9IWVBFUkJPTElDICAgMyAvKiBIeXBlcmJvbGljIHNpbmUgdHJhbnNmb3JtYXRpb24gKi8KLSNkZWZpbmUgUE5HX0VRVUFUSU9OX0xBU1QgICAgICAgICA0IC8qIE5vdCBhIHZhbGlkIHZhbHVlICovCi0KLS8qIFRoZXNlIGFyZSBmb3IgdGhlIHNDQUwgY2h1bmsuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIE5PVCBiZSBjaGFuZ2VkLiAqLwotI2RlZmluZSBQTkdfU0NBTEVfVU5LTk9XTiAgICAgICAgIDAgLyogdW5rbm93biB1bml0IChpbWFnZSBzY2FsZSkgKi8KLSNkZWZpbmUgUE5HX1NDQUxFX01FVEVSICAgICAgICAgICAxIC8qIG1ldGVycyBwZXIgcGl4ZWwgKi8KLSNkZWZpbmUgUE5HX1NDQUxFX1JBRElBTiAgICAgICAgICAyIC8qIHJhZGlhbnMgcGVyIHBpeGVsICovCi0jZGVmaW5lIFBOR19TQ0FMRV9MQVNUICAgICAgICAgICAgMyAvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLwotCi0vKiBUaGVzZSBhcmUgZm9yIHRoZSBwSFlzIGNodW5rLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4gKi8KLSNkZWZpbmUgUE5HX1JFU09MVVRJT05fVU5LTk9XTiAgICAwIC8qIHBpeGVscy91bmtub3duIHVuaXQgKGFzcGVjdCByYXRpbykgKi8KLSNkZWZpbmUgUE5HX1JFU09MVVRJT05fTUVURVIgICAgICAxIC8qIHBpeGVscy9tZXRlciAqLwotI2RlZmluZSBQTkdfUkVTT0xVVElPTl9MQVNUICAgICAgIDIgLyogTm90IGEgdmFsaWQgdmFsdWUgKi8KLQotLyogVGhlc2UgYXJlIGZvciB0aGUgc1JHQiBjaHVuay4gIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuICovCi0jZGVmaW5lIFBOR19zUkdCX0lOVEVOVF9QRVJDRVBUVUFMIDAKLSNkZWZpbmUgUE5HX3NSR0JfSU5URU5UX1JFTEFUSVZFICAgMQotI2RlZmluZSBQTkdfc1JHQl9JTlRFTlRfU0FUVVJBVElPTiAyCi0jZGVmaW5lIFBOR19zUkdCX0lOVEVOVF9BQlNPTFVURSAgIDMKLSNkZWZpbmUgUE5HX3NSR0JfSU5URU5UX0xBU1QgICAgICAgNCAvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLwotCi0vKiBUaGlzIGlzIGZvciB0ZXh0IGNodW5rcyAqLwotI2RlZmluZSBQTkdfS0VZV09SRF9NQVhfTEVOR1RIICAgICA3OQotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGluIFBMVEUvc1BMVC90Uk5TIGFycmF5cyAqLwotI2RlZmluZSBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIICAgIDI1NgotCi0vKiBUaGVzZSBkZXRlcm1pbmUgaWYgYW4gYW5jaWxsYXJ5IGNodW5rJ3MgZGF0YSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVhZAotICogZnJvbSB0aGUgUE5HIGhlYWRlciwgb3IgaWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBmaWxsZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcKLSAqIGRhdGEgaW4gdGhlIGluZm9fc3RydWN0IHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0IGZpbGUuICBUaGUgdmFsdWVzCi0gKiBvZiB0aGUgUE5HX0lORk9fPGNodW5rPiBkZWZpbmVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4KLSAqLwotI2RlZmluZSBQTkdfSU5GT19nQU1BIDB4MDAwMQotI2RlZmluZSBQTkdfSU5GT19zQklUIDB4MDAwMgotI2RlZmluZSBQTkdfSU5GT19jSFJNIDB4MDAwNAotI2RlZmluZSBQTkdfSU5GT19QTFRFIDB4MDAwOAotI2RlZmluZSBQTkdfSU5GT190Uk5TIDB4MDAxMAotI2RlZmluZSBQTkdfSU5GT19iS0dEIDB4MDAyMAotI2RlZmluZSBQTkdfSU5GT19oSVNUIDB4MDA0MAotI2RlZmluZSBQTkdfSU5GT19wSFlzIDB4MDA4MAotI2RlZmluZSBQTkdfSU5GT19vRkZzIDB4MDEwMAotI2RlZmluZSBQTkdfSU5GT190SU1FIDB4MDIwMAotI2RlZmluZSBQTkdfSU5GT19wQ0FMIDB4MDQwMAotI2RlZmluZSBQTkdfSU5GT19zUkdCIDB4MDgwMCAgIC8qIEdSLVAsIDAuOTZhICovCi0jZGVmaW5lIFBOR19JTkZPX2lDQ1AgMHgxMDAwICAgLyogRVNSLCAxLjAuNiAqLwotI2RlZmluZSBQTkdfSU5GT19zUExUIDB4MjAwMCAgIC8qIEVTUiwgMS4wLjYgKi8KLSNkZWZpbmUgUE5HX0lORk9fc0NBTCAweDQwMDAgICAvKiBFU1IsIDEuMC42ICovCi0jZGVmaW5lIFBOR19JTkZPX0lEQVQgMHg4MDAwTCAgLyogRVNSLCAxLjAuNiAqLwotCi0vKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcywgYXMgc29tZSBvZiB0aGVtCi0gKiBjaGFuZ2UgdGhlc2UgdmFsdWVzIGZvciB0aGUgcm93LiAgSXQgYWxzbyBzaG91bGQgZW5hYmxlIHVzaW5nCi0gKiB0aGUgcm91dGluZXMgZm9yIG90aGVyIHB1cnBvc2VzLgotICovCi10eXBlZGVmIHN0cnVjdCBwbmdfcm93X2luZm9fc3RydWN0Ci17Ci0gICBwbmdfdWludF8zMiB3aWR0aDsgLyogd2lkdGggb2Ygcm93ICovCi0gICBwbmdfdWludF8zMiByb3dieXRlczsgLyogbnVtYmVyIG9mIGJ5dGVzIGluIHJvdyAqLwotICAgcG5nX2J5dGUgY29sb3JfdHlwZTsgLyogY29sb3IgdHlwZSBvZiByb3cgKi8KLSAgIHBuZ19ieXRlIGJpdF9kZXB0aDsgLyogYml0IGRlcHRoIG9mIHJvdyAqLwotICAgcG5nX2J5dGUgY2hhbm5lbHM7IC8qIG51bWJlciBvZiBjaGFubmVscyAoMSwgMiwgMywgb3IgNCkgKi8KLSAgIHBuZ19ieXRlIHBpeGVsX2RlcHRoOyAvKiBiaXRzIHBlciBwaXhlbCAoZGVwdGggKiBjaGFubmVscykgKi8KLX0gcG5nX3Jvd19pbmZvOwotCi10eXBlZGVmIHBuZ19yb3dfaW5mbyBGQVIgKiBwbmdfcm93X2luZm9wOwotdHlwZWRlZiBwbmdfcm93X2luZm8gRkFSICogRkFSICogcG5nX3Jvd19pbmZvcHA7Ci0KLS8qIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb24gdHlwZXMgZm9yIHRoZSBJL08gZnVuY3Rpb25zIGFuZCBmb3IgdGhlIGZ1bmN0aW9ucwotICogdGhhdCBhbGxvdyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBJL08gZnVuY3Rpb25zIHdpdGggaGlzIG9yIGhlcgotICogb3duLiAgVGhlIHBuZ19lcnJvcl9wdHIgdHlwZSBzaG91bGQgbWF0Y2ggdGhhdCBvZiB1c2VyLXN1cHBsaWVkIHdhcm5pbmcKLSAqIGFuZCBlcnJvciBmdW5jdGlvbnMsIHdoaWxlIHRoZSBwbmdfcndfcHRyIHR5cGUgc2hvdWxkIG1hdGNoIHRoYXQgb2YgdGhlCi0gKiB1c2VyIHJlYWQvd3JpdGUgZGF0YSBmdW5jdGlvbnMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHBuZ19zdHJ1Y3RfZGVmIHBuZ19zdHJ1Y3Q7Ci10eXBlZGVmIHBuZ19zdHJ1Y3QgRkFSICogcG5nX3N0cnVjdHA7Ci0KLXR5cGVkZWYgdm9pZCAoUE5HQVBJICpwbmdfZXJyb3JfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLCBwbmdfY29uc3RfY2hhcnApKTsKLXR5cGVkZWYgdm9pZCAoUE5HQVBJICpwbmdfcndfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLCBwbmdfYnl0ZXAsIHBuZ19zaXplX3QpKTsKLXR5cGVkZWYgdm9pZCAoUE5HQVBJICpwbmdfZmx1c2hfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwKSk7Ci10eXBlZGVmIHZvaWQgKFBOR0FQSSAqcG5nX3JlYWRfc3RhdHVzX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCwgcG5nX3VpbnRfMzIsCi0gICBpbnQpKTsKLXR5cGVkZWYgdm9pZCAoUE5HQVBJICpwbmdfd3JpdGVfc3RhdHVzX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCwgcG5nX3VpbnRfMzIsCi0gICBpbnQpKTsKLQotI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAotdHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ19wcm9ncmVzc2l2ZV9pbmZvX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCwgcG5nX2luZm9wKSk7Ci10eXBlZGVmIHZvaWQgKFBOR0FQSSAqcG5nX3Byb2dyZXNzaXZlX2VuZF9wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAsIHBuZ19pbmZvcCkpOwotdHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ19wcm9ncmVzc2l2ZV9yb3dfcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLCBwbmdfYnl0ZXAsCi0gICBwbmdfdWludF8zMiwgaW50KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfTEVHQUNZX1NVUFBPUlRFRCkKLXR5cGVkZWYgdm9pZCAoUE5HQVBJICpwbmdfdXNlcl90cmFuc2Zvcm1fcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwLAotICAgIHBuZ19yb3dfaW5mb3AsIHBuZ19ieXRlcCkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQpCi10eXBlZGVmIGludCAoUE5HQVBJICpwbmdfdXNlcl9jaHVua19wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAsIHBuZ191bmtub3duX2NodW5rcCkpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotdHlwZWRlZiB2b2lkIChQTkdBUEkgKnBuZ191bmtub3duX2NodW5rX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCkpOwotI2VuZGlmCi0KLS8qIFRyYW5zZm9ybSBtYXNrcyBmb3IgdGhlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fSURFTlRJVFkgICAgICAgMHgwMDAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgICAgICAgMHgwMDAxICAgIC8qIHJlYWQgb25seSAqLwotI2RlZmluZSBQTkdfVFJBTlNGT1JNX1NUUklQX0FMUEhBICAgIDB4MDAwMiAgICAvKiByZWFkIG9ubHkgKi8KLSNkZWZpbmUgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgICAweDAwMDQgICAgLyogcmVhZCBhbmQgd3JpdGUgKi8KLSNkZWZpbmUgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgICAweDAwMDggICAgLyogcmVhZCBhbmQgd3JpdGUgKi8KLSNkZWZpbmUgUE5HX1RSQU5TRk9STV9FWFBBTkQgICAgICAgICAweDAwMTAgICAgLyogcmVhZCBvbmx5ICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICAgMHgwMDIwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fU0hJRlQgICAgICAgICAgMHgwMDQwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICAgMHgwMDgwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICAgMHgwMTAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICAgMHgwMjAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICAgMHgwNDAwICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCi0jZGVmaW5lIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSICAgMHgwODAwICAgIC8qIFdSSVRFIG9ubHksIGRlcHJlY2F0ZWQgKi8KLS8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuMzQgKi8KLSNkZWZpbmUgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFIDB4MDgwMCAgLyogV1JJVEUgb25seSAqLwotI2RlZmluZSBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9BRlRFUiAgMHgxMDAwICAvKiBXUklURSBvbmx5ICovCi0KLS8qIEZsYWdzIGZvciBNTkcgc3VwcG9ydGVkIGZlYXR1cmVzICovCi0jZGVmaW5lIFBOR19GTEFHX01OR19FTVBUWV9QTFRFICAgICAweDAxCi0jZGVmaW5lIFBOR19GTEFHX01OR19GSUxURVJfNjQgICAgICAweDA0Ci0jZGVmaW5lIFBOR19BTExfTU5HX0ZFQVRVUkVTICAgICAgICAweDA1Ci0KLXR5cGVkZWYgcG5nX3ZvaWRwICgqcG5nX21hbGxvY19wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAsIHBuZ19zaXplX3QpKTsKLXR5cGVkZWYgdm9pZCAoKnBuZ19mcmVlX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCwgcG5nX3ZvaWRwKSk7Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgaW5mb3JtYXRpb24gdG8gcmVhZCBhbmQgd3JpdGUgUE5HIGZpbGVzLgotICogVGhlIG9ubHkgcGVvcGxlIHdobyBuZWVkIHRvIGNhcmUgYWJvdXQgd2hhdCBpcyBpbnNpZGUgb2YgdGhpcyBhcmUgdGhlCi0gKiBwZW9wbGUgd2hvIHdpbGwgYmUgbW9kaWZ5aW5nIHRoZSBsaWJyYXJ5IGZvciB0aGVpciBvd24gc3BlY2lhbCBuZWVkcy4KLSAqIEl0IHNob3VsZCBOT1QgYmUgYWNjZXNzZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24sIGV4Y2VwdCB0byBzdG9yZQotICogdGhlIGptcF9idWYuCi0gKi8KLQotc3RydWN0IHBuZ19zdHJ1Y3RfZGVmCi17Ci0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSAgIGptcF9idWYgam1wYnVmOyAgICAgICAgICAgIC8qIHVzZWQgaW4gcG5nX2Vycm9yICovCi0jZW5kaWYKLSAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm47ICAgIC8qIGZ1bmN0aW9uIGZvciBwcmludGluZyBlcnJvcnMgYW5kIGFib3J0aW5nICovCi0gICBwbmdfZXJyb3JfcHRyIHdhcm5pbmdfZm47ICAvKiBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgd2FybmluZ3MgKi8KLSAgIHBuZ192b2lkcCBlcnJvcl9wdHI7ICAgICAgIC8qIHVzZXIgc3VwcGxpZWQgc3RydWN0IGZvciBlcnJvciBmdW5jdGlvbnMgKi8KLSAgIHBuZ19yd19wdHIgd3JpdGVfZGF0YV9mbjsgIC8qIGZ1bmN0aW9uIGZvciB3cml0aW5nIG91dHB1dCBkYXRhICovCi0gICBwbmdfcndfcHRyIHJlYWRfZGF0YV9mbjsgICAvKiBmdW5jdGlvbiBmb3IgcmVhZGluZyBpbnB1dCBkYXRhICovCi0gICBwbmdfdm9pZHAgaW9fcHRyOyAgICAgICAgICAvKiBwdHIgdG8gYXBwbGljYXRpb24gc3RydWN0IGZvciBJL08gZnVuY3Rpb25zICovCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKLSAgIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIgcmVhZF91c2VyX3RyYW5zZm9ybV9mbjsgLyogdXNlciByZWFkIHRyYW5zZm9ybSAqLwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCi0gICBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyIHdyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuOyAvKiB1c2VyIHdyaXRlIHRyYW5zZm9ybSAqLwotI2VuZGlmCi0KLS8qIFRoZXNlIHdlcmUgYWRkZWQgaW4gbGlicG5nLTEuMC4yICovCi0jaWYgZGVmaW5lZChQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRCkKLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKLSAgIHBuZ192b2lkcCB1c2VyX3RyYW5zZm9ybV9wdHI7IC8qIHVzZXIgc3VwcGxpZWQgc3RydWN0IGZvciB1c2VyIHRyYW5zZm9ybSAqLwotICAgcG5nX2J5dGUgdXNlcl90cmFuc2Zvcm1fZGVwdGg7ICAgIC8qIGJpdCBkZXB0aCBvZiB1c2VyIHRyYW5zZm9ybWVkIHBpeGVscyAqLwotICAgcG5nX2J5dGUgdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7IC8qIGNoYW5uZWxzIGluIHVzZXIgdHJhbnNmb3JtZWQgcGl4ZWxzICovCi0jZW5kaWYKLSNlbmRpZgotCi0gICBwbmdfdWludF8zMiBtb2RlOyAgICAgICAgICAvKiB0ZWxscyB1cyB3aGVyZSB3ZSBhcmUgaW4gdGhlIFBORyBmaWxlICovCi0gICBwbmdfdWludF8zMiBmbGFnczsgICAgICAgICAvKiBmbGFncyBpbmRpY2F0aW5nIHZhcmlvdXMgdGhpbmdzIHRvIGxpYnBuZyAqLwotICAgcG5nX3VpbnRfMzIgdHJhbnNmb3JtYXRpb25zOyAvKiB3aGljaCB0cmFuc2Zvcm1hdGlvbnMgdG8gcGVyZm9ybSAqLwotCi0gICB6X3N0cmVhbSB6c3RyZWFtOyAgICAgICAgICAvKiBwb2ludGVyIHRvIGRlY29tcHJlc3Npb24gc3RydWN0dXJlIChiZWxvdykgKi8KLSAgIHBuZ19ieXRlcCB6YnVmOyAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgemxpYiAqLwotICAgcG5nX3NpemVfdCB6YnVmX3NpemU7ICAgICAgLyogc2l6ZSBvZiB6YnVmICovCi0gICBpbnQgemxpYl9sZXZlbDsgICAgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIGxldmVsICovCi0gICBpbnQgemxpYl9tZXRob2Q7ICAgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIG1ldGhvZCAqLwotICAgaW50IHpsaWJfd2luZG93X2JpdHM7ICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiB3aW5kb3cgYml0cyAqLwotICAgaW50IHpsaWJfbWVtX2xldmVsOyAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBtZW1vcnkgbGV2ZWwgKi8KLSAgIGludCB6bGliX3N0cmF0ZWd5OyAgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gc3RyYXRlZ3kgKi8KLQotICAgcG5nX3VpbnRfMzIgd2lkdGg7ICAgICAgICAgLyogd2lkdGggb2YgaW1hZ2UgaW4gcGl4ZWxzICovCi0gICBwbmdfdWludF8zMiBoZWlnaHQ7ICAgICAgICAvKiBoZWlnaHQgb2YgaW1hZ2UgaW4gcGl4ZWxzICovCi0gICBwbmdfdWludF8zMiBudW1fcm93czsgICAgICAvKiBudW1iZXIgb2Ygcm93cyBpbiBjdXJyZW50IHBhc3MgKi8KLSAgIHBuZ191aW50XzMyIHVzcl93aWR0aDsgICAgIC8qIHdpZHRoIG9mIHJvdyBhdCBzdGFydCBvZiB3cml0ZSAqLwotICAgcG5nX3VpbnRfMzIgcm93Ynl0ZXM7ICAgICAgLyogc2l6ZSBvZiByb3cgaW4gYnl0ZXMgKi8KLSAgIHBuZ191aW50XzMyIGlyb3dieXRlczsgICAgIC8qIHNpemUgb2YgY3VycmVudCBpbnRlcmxhY2VkIHJvdyBpbiBieXRlcyAqLwotICAgcG5nX3VpbnRfMzIgaXdpZHRoOyAgICAgICAgLyogd2lkdGggb2YgY3VycmVudCBpbnRlcmxhY2VkIHJvdyBpbiBwaXhlbHMgKi8KLSAgIHBuZ191aW50XzMyIHJvd19udW1iZXI7ICAgIC8qIGN1cnJlbnQgcm93IGluIGludGVybGFjZSBwYXNzICovCi0gICBwbmdfYnl0ZXAgcHJldl9yb3c7ICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSBwcmV2aW91cyAodW5maWx0ZXJlZCkgcm93ICovCi0gICBwbmdfYnl0ZXAgcm93X2J1ZjsgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSBjdXJyZW50ICh1bmZpbHRlcmVkKSByb3cgKi8KLSNpZm5kZWYgUE5HX05PX1dSSVRFX0ZJTFRFUgotICAgcG5nX2J5dGVwIHN1Yl9yb3c7ICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgInN1YiIgcm93IHdoZW4gZmlsdGVyaW5nICovCi0gICBwbmdfYnl0ZXAgdXBfcm93OyAgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSAidXAiIHJvdyB3aGVuIGZpbHRlcmluZyAqLwotICAgcG5nX2J5dGVwIGF2Z19yb3c7ICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgImF2ZyIgcm93IHdoZW4gZmlsdGVyaW5nICovCi0gICBwbmdfYnl0ZXAgcGFldGhfcm93OyAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSAiUGFldGgiIHJvdyB3aGVuIGZpbHRlcmluZyAqLwotI2VuZGlmCi0gICBwbmdfcm93X2luZm8gcm93X2luZm87ICAgICAvKiB1c2VkIGZvciB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcyAqLwotCi0gICBwbmdfdWludF8zMiBpZGF0X3NpemU7ICAgICAvKiBjdXJyZW50IElEQVQgc2l6ZSBmb3IgcmVhZCAqLwotICAgcG5nX3VpbnRfMzIgY3JjOyAgICAgICAgICAgLyogY3VycmVudCBjaHVuayBDUkMgdmFsdWUgKi8KLSAgIHBuZ19jb2xvcnAgcGFsZXR0ZTsgICAgICAgIC8qIHBhbGV0dGUgZnJvbSB0aGUgaW5wdXQgZmlsZSAqLwotICAgcG5nX3VpbnRfMTYgbnVtX3BhbGV0dGU7ICAgLyogbnVtYmVyIG9mIGNvbG9yIGVudHJpZXMgaW4gcGFsZXR0ZSAqLwotICAgcG5nX3VpbnRfMTYgbnVtX3RyYW5zOyAgICAgLyogbnVtYmVyIG9mIHRyYW5zcGFyZW5jeSB2YWx1ZXMgKi8KLSAgIHBuZ19ieXRlIGNodW5rX25hbWVbNV07ICAgIC8qIG51bGwtdGVybWluYXRlZCBuYW1lIG9mIGN1cnJlbnQgY2h1bmsgKi8KLSAgIHBuZ19ieXRlIGNvbXByZXNzaW9uOyAgICAgIC8qIGZpbGUgY29tcHJlc3Npb24gdHlwZSAoYWx3YXlzIDApICovCi0gICBwbmdfYnl0ZSBmaWx0ZXI7ICAgICAgICAgICAvKiBmaWxlIGZpbHRlciB0eXBlIChhbHdheXMgMCkgKi8KLSAgIHBuZ19ieXRlIGludGVybGFjZWQ7ICAgICAgIC8qIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0lOVEVSTEFDRV9BREFNNyAqLwotICAgcG5nX2J5dGUgcGFzczsgICAgICAgICAgICAgLyogY3VycmVudCBpbnRlcmxhY2UgcGFzcyAoMCAtIDYpICovCi0gICBwbmdfYnl0ZSBkb19maWx0ZXI7ICAgICAgICAvKiByb3cgZmlsdGVyIGZsYWdzIChzZWUgUE5HX0ZJTFRFUl8gYmVsb3cgKSAqLwotICAgcG5nX2J5dGUgY29sb3JfdHlwZTsgICAgICAgLyogY29sb3IgdHlwZSBvZiBmaWxlICovCi0gICBwbmdfYnl0ZSBiaXRfZGVwdGg7ICAgICAgICAvKiBiaXQgZGVwdGggb2YgZmlsZSAqLwotICAgcG5nX2J5dGUgdXNyX2JpdF9kZXB0aDsgICAgLyogYml0IGRlcHRoIG9mIHVzZXJzIHJvdyAqLwotICAgcG5nX2J5dGUgcGl4ZWxfZGVwdGg7ICAgICAgLyogbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsICovCi0gICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gZmlsZSAqLwotICAgcG5nX2J5dGUgdXNyX2NoYW5uZWxzOyAgICAgLyogY2hhbm5lbHMgYXQgc3RhcnQgb2Ygd3JpdGUgKi8KLSAgIHBuZ19ieXRlIHNpZ19ieXRlczsgICAgICAgIC8qIG1hZ2ljIGJ5dGVzIHJlYWQvd3JpdHRlbiBmcm9tIHN0YXJ0IG9mIGZpbGUgKi8KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCkKLSNpZmRlZiBQTkdfTEVHQUNZX1NVUFBPUlRFRAotICAgcG5nX2J5dGUgZmlsbGVyOyAgICAgICAgICAgLyogZmlsbGVyIGJ5dGUgZm9yIHBpeGVsIGV4cGFuc2lvbiAqLwotI2Vsc2UKLSAgIHBuZ191aW50XzE2IGZpbGxlcjsgICAgICAgICAgIC8qIGZpbGxlciBieXRlcyBmb3IgcGl4ZWwgZXhwYW5zaW9uICovCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfYktHRF9TVVBQT1JURUQpCi0gICBwbmdfYnl0ZSBiYWNrZ3JvdW5kX2dhbW1hX3R5cGU7Ci0jICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICBmbG9hdCBiYWNrZ3JvdW5kX2dhbW1hOwotIyAgZW5kaWYKLSAgIHBuZ19jb2xvcl8xNiBiYWNrZ3JvdW5kOyAgIC8qIGJhY2tncm91bmQgY29sb3IgaW4gc2NyZWVuIGdhbW1hIHNwYWNlICovCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0gICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZF8xOyAvKiBiYWNrZ3JvdW5kIG5vcm1hbGl6ZWQgdG8gZ2FtbWEgMS4wICovCi0jZW5kaWYKLSNlbmRpZiAvKiBQTkdfYktHRF9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCkKLSAgIHBuZ19mbHVzaF9wdHIgb3V0cHV0X2ZsdXNoX2ZuOy8qIEZ1bmN0aW9uIGZvciBmbHVzaGluZyBvdXRwdXQgKi8KLSAgIHBuZ191aW50XzMyIGZsdXNoX2Rpc3Q7ICAgIC8qIGhvdyBtYW55IHJvd3MgYXBhcnQgdG8gZmx1c2gsIDAgLSBubyBmbHVzaCAqLwotICAgcG5nX3VpbnRfMzIgZmx1c2hfcm93czsgICAgLyogbnVtYmVyIG9mIHJvd3Mgd3JpdHRlbiBzaW5jZSBsYXN0IGZsdXNoICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgaW50IGdhbW1hX3NoaWZ0OyAgICAgIC8qIG51bWJlciBvZiAiaW5zaWduaWZpY2FudCIgYml0cyAxNi1iaXQgZ2FtbWEgKi8KLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICBmbG9hdCBnYW1tYTsgICAgICAgICAgLyogZmlsZSBnYW1tYSB2YWx1ZSAqLwotICAgZmxvYXQgc2NyZWVuX2dhbW1hOyAgIC8qIHNjcmVlbiBnYW1tYSB2YWx1ZSAoZGlzcGxheV9leHBvbmVudCkgKi8KLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKLSAgIHBuZ19ieXRlcCBnYW1tYV90YWJsZTsgICAgIC8qIGdhbW1hIHRhYmxlIGZvciA4LWJpdCBkZXB0aCBmaWxlcyAqLwotICAgcG5nX2J5dGVwIGdhbW1hX2Zyb21fMTsgICAgLyogY29udmVydHMgZnJvbSAxLjAgdG8gc2NyZWVuICovCi0gICBwbmdfYnl0ZXAgZ2FtbWFfdG9fMTsgICAgICAvKiBjb252ZXJ0cyBmcm9tIGZpbGUgdG8gMS4wICovCi0gICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X3RhYmxlOyAvKiBnYW1tYSB0YWJsZSBmb3IgMTYtYml0IGRlcHRoIGZpbGVzICovCi0gICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X2Zyb21fMTsgLyogY29udmVydHMgZnJvbSAxLjAgdG8gc2NyZWVuICovCi0gICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X3RvXzE7IC8qIGNvbnZlcnRzIGZyb20gZmlsZSB0byAxLjAgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX3NCSVRfU1VQUE9SVEVEKQotICAgcG5nX2NvbG9yXzggc2lnX2JpdDsgICAgICAgLyogc2lnbmlmaWNhbnQgYml0cyBpbiBlYWNoIGF2YWlsYWJsZSBjaGFubmVsICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpCi0gICBwbmdfY29sb3JfOCBzaGlmdDsgICAgICAgICAvKiBzaGlmdCBmb3Igc2lnbmlmaWNhbnQgYml0IHRyYW5mb3JtYXRpb24gKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfdFJOU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIFwKLSB8fCBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0gICBwbmdfYnl0ZXAgdHJhbnM7ICAgICAgICAgICAvKiB0cmFuc3BhcmVuY3kgdmFsdWVzIGZvciBwYWxldHRlZCBmaWxlcyAqLwotICAgcG5nX2NvbG9yXzE2IHRyYW5zX3ZhbHVlczsgLyogdHJhbnNwYXJlbmN5IHZhbHVlcyBmb3Igbm9uLXBhbGV0dGVkIGZpbGVzICovCi0jZW5kaWYKLQotICAgcG5nX3JlYWRfc3RhdHVzX3B0ciByZWFkX3Jvd19mbjsgICAvKiBjYWxsZWQgYWZ0ZXIgZWFjaCByb3cgaXMgZGVjb2RlZCAqLwotICAgcG5nX3dyaXRlX3N0YXR1c19wdHIgd3JpdGVfcm93X2ZuOyAvKiBjYWxsZWQgYWZ0ZXIgZWFjaCByb3cgaXMgZW5jb2RlZCAqLwotI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAotICAgcG5nX3Byb2dyZXNzaXZlX2luZm9fcHRyIGluZm9fZm47IC8qIGNhbGxlZCBhZnRlciBoZWFkZXIgZGF0YSBmdWxseSByZWFkICovCi0gICBwbmdfcHJvZ3Jlc3NpdmVfcm93X3B0ciByb3dfZm47ICAgLyogY2FsbGVkIGFmdGVyIGVhY2ggcHJvZy4gcm93IGlzIGRlY29kZWQgKi8KLSAgIHBuZ19wcm9ncmVzc2l2ZV9lbmRfcHRyIGVuZF9mbjsgICAvKiBjYWxsZWQgYWZ0ZXIgaW1hZ2UgaXMgY29tcGxldGUgKi8KLSAgIHBuZ19ieXRlcCBzYXZlX2J1ZmZlcl9wdHI7ICAgICAgICAvKiBjdXJyZW50IGxvY2F0aW9uIGluIHNhdmVfYnVmZmVyICovCi0gICBwbmdfYnl0ZXAgc2F2ZV9idWZmZXI7ICAgICAgICAgICAgLyogYnVmZmVyIGZvciBwcmV2aW91c2x5IHJlYWQgZGF0YSAqLwotICAgcG5nX2J5dGVwIGN1cnJlbnRfYnVmZmVyX3B0cjsgICAgIC8qIGN1cnJlbnQgbG9jYXRpb24gaW4gY3VycmVudF9idWZmZXIgKi8KLSAgIHBuZ19ieXRlcCBjdXJyZW50X2J1ZmZlcjsgICAgICAgICAvKiBidWZmZXIgZm9yIHJlY2VudGx5IHVzZWQgZGF0YSAqLwotICAgcG5nX3VpbnRfMzIgcHVzaF9sZW5ndGg7ICAgICAgICAgIC8qIHNpemUgb2YgY3VycmVudCBpbnB1dCBjaHVuayAqLwotICAgcG5nX3VpbnRfMzIgc2tpcF9sZW5ndGg7ICAgICAgICAgIC8qIGJ5dGVzIHRvIHNraXAgaW4gaW5wdXQgZGF0YSAqLwotICAgcG5nX3NpemVfdCBzYXZlX2J1ZmZlcl9zaXplOyAgICAgIC8qIGFtb3VudCBvZiBkYXRhIG5vdyBpbiBzYXZlX2J1ZmZlciAqLwotICAgcG5nX3NpemVfdCBzYXZlX2J1ZmZlcl9tYXg7ICAgICAgIC8qIHRvdGFsIHNpemUgb2Ygc2F2ZV9idWZmZXIgKi8KLSAgIHBuZ19zaXplX3QgYnVmZmVyX3NpemU7ICAgICAgICAgICAvKiB0b3RhbCBhbW91bnQgb2YgYXZhaWxhYmxlIGlucHV0IGRhdGEgKi8KLSAgIHBuZ19zaXplX3QgY3VycmVudF9idWZmZXJfc2l6ZTsgICAvKiBhbW91bnQgb2YgZGF0YSBub3cgaW4gY3VycmVudF9idWZmZXIgKi8KLSAgIGludCBwcm9jZXNzX21vZGU7ICAgICAgICAgICAgICAgICAvKiB3aGF0IHB1c2ggbGlicmFyeSBpcyBjdXJyZW50bHkgZG9pbmcgKi8KLSAgIGludCBjdXJfcGFsZXR0ZTsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHB1c2ggbGlicmFyeSBwYWxldHRlIGluZGV4ICovCi0KLSMgIGlmIGRlZmluZWQoUE5HX1RFWFRfU1VQUE9SVEVEKQotICAgICBwbmdfc2l6ZV90IGN1cnJlbnRfdGV4dF9zaXplOyAgIC8qIGN1cnJlbnQgc2l6ZSBvZiB0ZXh0IGlucHV0IGRhdGEgKi8KLSAgICAgcG5nX3NpemVfdCBjdXJyZW50X3RleHRfbGVmdDsgICAvKiBob3cgbXVjaCB0ZXh0IGxlZnQgdG8gcmVhZCBpbiBpbnB1dCAqLwotICAgICBwbmdfY2hhcnAgY3VycmVudF90ZXh0OyAgICAgICAgIC8qIGN1cnJlbnQgdGV4dCBjaHVuayBidWZmZXIgKi8KLSAgICAgcG5nX2NoYXJwIGN1cnJlbnRfdGV4dF9wdHI7ICAgICAvKiBjdXJyZW50IGxvY2F0aW9uIGluIGN1cnJlbnRfdGV4dCAqLwotIyAgZW5kaWYgLyogUE5HX1RFWFRfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVEICovCi0KLSNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmICFkZWZpbmVkKF9XaW5kb3dzKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykKLS8qIGZvciB0aGUgQm9ybGFuZCBzcGVjaWFsIDY0SyBzZWdtZW50IGhhbmRsZXIgKi8KLSAgIHBuZ19ieXRlcHAgb2Zmc2V0X3RhYmxlX3B0cjsKLSAgIHBuZ19ieXRlcCBvZmZzZXRfdGFibGU7Ci0gICBwbmdfdWludF8xNiBvZmZzZXRfdGFibGVfbnVtYmVyOwotICAgcG5nX3VpbnRfMTYgb2Zmc2V0X3RhYmxlX2NvdW50OwotICAgcG5nX3VpbnRfMTYgb2Zmc2V0X3RhYmxlX2NvdW50X2ZyZWU7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRCkKLSAgIHBuZ19ieXRlcCBwYWxldHRlX2xvb2t1cDsgICAgICAgICAvKiBsb29rdXAgdGFibGUgZm9yIGRpdGhlcmluZyAqLwotICAgcG5nX2J5dGVwIGRpdGhlcl9pbmRleDsgICAgICAgICAgIC8qIGluZGV4IHRyYW5zbGF0aW9uIGZvciBwYWxldHRlIGZpbGVzICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfaElTVF9TVVBQT1JURUQpCi0gICBwbmdfdWludF8xNnAgaGlzdDsgICAgICAgICAgICAgICAgLyogaGlzdG9ncmFtICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQpCi0gICBwbmdfYnl0ZSBoZXVyaXN0aWNfbWV0aG9kOyAgICAgICAgLyogaGV1cmlzdGljIGZvciByb3cgZmlsdGVyIHNlbGVjdGlvbiAqLwotICAgcG5nX2J5dGUgbnVtX3ByZXZfZmlsdGVyczsgICAgICAgIC8qIG51bWJlciBvZiB3ZWlnaHRzIGZvciBwcmV2aW91cyByb3dzICovCi0gICBwbmdfYnl0ZXAgcHJldl9maWx0ZXJzOyAgICAgICAgICAgLyogZmlsdGVyIHR5cGUocykgb2YgcHJldmlvdXMgcm93KHMpICovCi0gICBwbmdfdWludF8xNnAgZmlsdGVyX3dlaWdodHM7ICAgICAgLyogd2VpZ2h0KHMpIGZvciBwcmV2aW91cyBsaW5lKHMpICovCi0gICBwbmdfdWludF8xNnAgaW52X2ZpbHRlcl93ZWlnaHRzOyAgLyogMS93ZWlnaHQocykgZm9yIHByZXZpb3VzIGxpbmUocykgKi8KLSAgIHBuZ191aW50XzE2cCBmaWx0ZXJfY29zdHM7ICAgICAgICAvKiByZWxhdGl2ZSBmaWx0ZXIgY2FsY3VsYXRpb24gY29zdCAqLwotICAgcG5nX3VpbnRfMTZwIGludl9maWx0ZXJfY29zdHM7ICAgIC8qIDEvcmVsYXRpdmUgZmlsdGVyIGNhbGN1bGF0aW9uIGNvc3QgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCkKLSAgIHBuZ19jaGFycCB0aW1lX2J1ZmZlcjsgICAgICAgICAgICAvKiBTdHJpbmcgdG8gaG9sZCBSRkMgMTEyMyB0aW1lIHRleHQgKi8KLSNlbmRpZgotCi0vKiBOZXcgbWVtYmVycyBhZGRlZCBpbiBsaWJwbmctMS4wLjYgKi8KLQotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgcG5nX3VpbnRfMzIgZnJlZV9tZTsgICAgICAgLyogZmxhZ3MgaXRlbXMgbGlicG5nIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1VTRVJfQ0hVTktTX1NVUFBPUlRFRCkKLSAgIHBuZ192b2lkcCB1c2VyX2NodW5rX3B0cjsKLSAgIHBuZ191c2VyX2NodW5rX3B0ciByZWFkX3VzZXJfY2h1bmtfZm47IC8qIHVzZXIgcmVhZCBjaHVuayBoYW5kbGVyICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgIGludCBudW1fY2h1bmtfbGlzdDsKLSAgIHBuZ19ieXRlcCBjaHVua19saXN0OwotI2VuZGlmCi0KLS8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMyAqLwotI2lmIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKQotICAgcG5nX2J5dGUgcmdiX3RvX2dyYXlfc3RhdHVzOwotICAgLyogVGhlc2Ugd2VyZSBjaGFuZ2VkIGZyb20gcG5nX2J5dGUgaW4gbGlicG5nLTEuMC42ICovCi0gICBwbmdfdWludF8xNiByZ2JfdG9fZ3JheV9yZWRfY29lZmY7Ci0gICBwbmdfdWludF8xNiByZ2JfdG9fZ3JheV9ncmVlbl9jb2VmZjsKLSAgIHBuZ191aW50XzE2IHJnYl90b19ncmF5X2JsdWVfY29lZmY7Ci0jZW5kaWYKLQotLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjQgKHJlbmFtZWQgaW4gMS4wLjkpICovCi0jaWYgZGVmaW5lZChQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1JFQURfRU1QVFlfUExURV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9FTVBUWV9QTFRFX1NVUFBPUlRFRCkKLS8qIGNoYW5nZWQgZnJvbSBwbmdfYnl0ZSB0byBwbmdfdWludF8zMiBhdCB2ZXJzaW9uIDEuMi4wICovCi0jaWZkZWYgUE5HXzFfMF9YCi0gICBwbmdfYnl0ZSBtbmdfZmVhdHVyZXNfcGVybWl0dGVkOwotI2Vsc2UKLSAgIHBuZ191aW50XzMyIG1uZ19mZWF0dXJlc19wZXJtaXR0ZWQ7Ci0jZW5kaWYgLyogUE5HXzFfMF9YICovCi0jZW5kaWYKLQotLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjcgKi8KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfZ2FtbWE7Ci0jZW5kaWYKLQotLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjksIGlmZGVmJ2VkIG91dCBpbiAxLjAuMTIsIGVuYWJsZWQgaW4gMS4yLjAgKi8KLSNpZiBkZWZpbmVkKFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEKQotICAgcG5nX2J5dGUgZmlsdGVyX3R5cGU7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HXzFfMF9YKQotLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjEwLCBpZmRlZidlZCBvdXQgaW4gMS4yLjAgKi8KLSAgIHBuZ191aW50XzMyIHJvd19idWZfc2l6ZTsKLSNlbmRpZgotCi0vKiBOZXcgbWVtYmVycyBhZGRlZCBpbiBsaWJwbmctMS4yLjAgKi8KLSNpZiBkZWZpbmVkKFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQpCi0jICBpZiAhZGVmaW5lZChQTkdfMV8wX1gpCi0jICAgIGlmIGRlZmluZWQoUE5HX01NWF9DT0RFX1NVUFBPUlRFRCkKLSAgIHBuZ19ieXRlICAgICBtbXhfYml0ZGVwdGhfdGhyZXNob2xkOwotICAgcG5nX3VpbnRfMzIgIG1teF9yb3dieXRlc190aHJlc2hvbGQ7Ci0jICAgIGVuZGlmCi0gICBwbmdfdWludF8zMiAgYXNtX2ZsYWdzOwotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBOZXcgbWVtYmVycyBhZGRlZCBpbiBsaWJwbmctMS4wLjIgYnV0IGZpcnN0IGVuYWJsZWQgYnkgZGVmYXVsdCBpbiAxLjIuMCAqLwotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIHBuZ192b2lkcCBtZW1fcHRyOyAgICAgICAgICAgICAgICAvKiB1c2VyIHN1cHBsaWVkIHN0cnVjdCBmb3IgbWVtIGZ1bmN0aW9ucyAqLwotICAgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuOyAgICAgICAgIC8qIGZ1bmN0aW9uIGZvciBhbGxvY2F0aW5nIG1lbW9yeSAqLwotICAgcG5nX2ZyZWVfcHRyIGZyZWVfZm47ICAgICAgICAgICAgIC8qIGZ1bmN0aW9uIGZvciBmcmVlaW5nIG1lbW9yeSAqLwotI2VuZGlmCi0KLS8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMC4xMyBhbmQgMS4yLjAgKi8KLSAgIHBuZ19ieXRlcCBiaWdfcm93X2J1ZjsgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSBjdXJyZW50ICh1bmZpbHRlcmVkKSByb3cgKi8KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRCkKLS8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgbWVtYmVycyB3ZXJlIGFkZGVkIGF0IHZlcnNpb24gMS4wLjE0IGFuZCAxLjIuNCAqLwotICAgcG5nX2J5dGVwIGRpdGhlcl9zb3J0OyAgICAgICAgICAgIC8qIHdvcmtpbmcgc29ydCBhcnJheSAqLwotICAgcG5nX2J5dGVwIGluZGV4X3RvX3BhbGV0dGU7ICAgICAgIC8qIHdoZXJlIHRoZSBvcmlnaW5hbCBpbmRleCBjdXJyZW50bHkgaXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiB0aGUgcGFsZXR0ZSAqLwotICAgcG5nX2J5dGVwIHBhbGV0dGVfdG9faW5kZXg7ICAgICAgIC8qIHdoaWNoIG9yaWdpbmFsIGluZGV4IHBvaW50cyB0byB0aGlzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFsZXR0ZSBjb2xvciAqLwotI2VuZGlmCi0KLS8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMTYgYW5kIDEuMi42ICovCi0gICBwbmdfYnl0ZSBjb21wcmVzc2lvbl90eXBlOwotCi0jaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLSAgIHBuZ191aW50XzMyIHVzZXJfd2lkdGhfbWF4OwotICAgcG5nX3VpbnRfMzIgdXNlcl9oZWlnaHRfbWF4OwotI2VuZGlmCi0KLS8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMC4yNSBhbmQgMS4yLjE3ICovCi0jaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotICAgLyogc3RvcmFnZSBmb3IgdW5rbm93biBjaHVuayB0aGF0IHRoZSBsaWJyYXJ5IGRvZXNuJ3QgcmVjb2duaXplLiAqLwotICAgcG5nX3Vua25vd25fY2h1bmsgdW5rbm93bl9jaHVuazsKLSNlbmRpZgotCi0vKiBOZXcgbWVtYmVycyBhZGRlZCBpbiBsaWJwbmctMS4yLjI2ICovCi0gIHBuZ191aW50XzMyIG9sZF9iaWdfcm93X2J1Zl9zaXplLCBvbGRfcHJldl9yb3dfc2l6ZTsKLQotLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4yLjMwICovCi0gIHBuZ19jaGFycCBjaHVua2RhdGE7ICAvKiBidWZmZXIgZm9yIHJlYWRpbmcgY2h1bmsgZGF0YSAqLwotCi19OwotCi0KLS8qIFRoaXMgdHJpZ2dlcnMgYSBjb21waWxlciBlcnJvciBpbiBwbmcuYywgaWYgcG5nLmMgYW5kIHBuZy5oCi0gKiBkbyBub3QgYWdyZWUgdXBvbiB0aGUgdmVyc2lvbiBudW1iZXIuCi0gKi8KLXR5cGVkZWYgcG5nX3N0cnVjdHAgdmVyc2lvbl8xXzJfMzc7Ci0KLXR5cGVkZWYgcG5nX3N0cnVjdCBGQVIgKiBGQVIgKiBwbmdfc3RydWN0cHA7Ci0KLS8qIEhlcmUgYXJlIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBtb3N0IGNvbW1vbmx5IHVzZWQuICBUaGlzIGlzIG5vdAotICogdGhlIHBsYWNlIHRvIGZpbmQgb3V0IGhvdyB0byB1c2UgbGlicG5nLiAgU2VlIGxpYnBuZy50eHQgZm9yIHRoZQotICogZnVsbCBleHBsYW5hdGlvbiwgc2VlIGV4YW1wbGUuYyBmb3IgdGhlIHN1bW1hcnkuICBUaGlzIGp1c3QgcHJvdmlkZXMKLSAqIGEgc2ltcGxlIG9uZSBsaW5lIGRlc2NyaXB0aW9uIG9mIHRoZSB1c2Ugb2YgZWFjaCBmdW5jdGlvbi4KLSAqLwotCi0vKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGlicmFyeSAqLwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcikgUE5HQVJHKCh2b2lkKSk7Ci0KLS8qIFRlbGwgbGliIHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBmaXJzdCA8bnVtX2J5dGVzPiBtYWdpYyBieXRlcy4KLSAqIEhhbmRsaW5nIG1vcmUgdGhhbiA4IGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBpcyBhbiBlcnJvci4KLSAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3NpZ19ieXRlcykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgaW50IG51bV9ieXRlcykpOwotCi0vKiBDaGVjayBzaWdbc3RhcnRdIHRocm91Z2ggc2lnW3N0YXJ0ICsgbnVtX3RvX2NoZWNrIC0gMV0gdG8gc2VlIGlmIGl0J3MgYQotICogUE5HIGZpbGUuICBSZXR1cm5zIHplcm8gaWYgdGhlIHN1cHBsaWVkIGJ5dGVzIG1hdGNoIHRoZSA4LWJ5dGUgUE5HCi0gKiBzaWduYXR1cmUsIGFuZCBub24temVybyBvdGhlcndpc2UuICBIYXZpbmcgbnVtX3RvX2NoZWNrID09IDAgb3IKLSAqIHN0YXJ0ID4gNyB3aWxsIGFsd2F5cyBmYWlsIChpZSByZXR1cm4gbm9uLXplcm8pLgotICovCi1leHRlcm4gUE5HX0VYUE9SVChpbnQscG5nX3NpZ19jbXApIFBOR0FSRygocG5nX2J5dGVwIHNpZywgcG5nX3NpemVfdCBzdGFydCwKLSAgIHBuZ19zaXplX3QgbnVtX3RvX2NoZWNrKSk7Ci0KLS8qIFNpbXBsZSBzaWduYXR1cmUgY2hlY2tpbmcgZnVuY3Rpb24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKLSAqIHBuZ19jaGVja19zaWcoc2lnLCBuKSA6PSAhcG5nX3NpZ19jbXAoc2lnLCAwLCBuKS4KLSAqLwotZXh0ZXJuIFBOR19FWFBPUlQoaW50LHBuZ19jaGVja19zaWcpIFBOR0FSRygocG5nX2J5dGVwIHNpZywgaW50IG51bSkpOwotCi0vKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwbmdfcHRyIHN0cnVjdCBmb3IgcmVhZGluZywgYW5kIGFueSBvdGhlciBtZW1vcnkuICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfc3RydWN0cCxwbmdfY3JlYXRlX3JlYWRfc3RydWN0KQotICAgUE5HQVJHKChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAotICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuKSk7Ci0KLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBuZ19wdHIgc3RydWN0IGZvciB3cml0aW5nLCBhbmQgYW55IG90aGVyIG1lbW9yeSAqLwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3N0cnVjdHAscG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QpCi0gICBQTkdBUkcoKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCi0gICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4pKTsKLQotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLWV4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUpCi0gICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKQotICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBzaXplKSk7Ci0jZW5kaWYKLQotLyogUmVzZXQgdGhlIGNvbXByZXNzaW9uIHN0cmVhbSAqLwotZXh0ZXJuIFBOR19FWFBPUlQoaW50LHBuZ19yZXNldF96c3RyZWFtKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotLyogTmV3IGZ1bmN0aW9ucyBhZGRlZCBpbiBsaWJwbmctMS4wLjIgKG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgdW50aWwgMS4yLjApICovCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3N0cnVjdHAscG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKQotICAgUE5HQVJHKChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAotICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuLCBwbmdfdm9pZHAgbWVtX3B0ciwKLSAgIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pKTsKLWV4dGVybiBQTkdfRVhQT1JUKHBuZ19zdHJ1Y3RwLHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIpCi0gICBQTkdBUkcoKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCi0gICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4sIHBuZ192b2lkcCBtZW1fcHRyLAotICAgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbikpOwotI2VuZGlmCi0KLS8qIFdyaXRlIGEgUE5HIGNodW5rIC0gc2l6ZSwgdHlwZSwgKG9wdGlvbmFsKSBkYXRhLCBDUkMuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9jaHVuaykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGVwIGNodW5rX25hbWUsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkpOwotCi0vKiBXcml0ZSB0aGUgc3RhcnQgb2YgYSBQTkcgY2h1bmsgLSBsZW5ndGggYW5kIGNodW5rIG5hbWUuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9jaHVua19zdGFydCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGVwIGNodW5rX25hbWUsIHBuZ191aW50XzMyIGxlbmd0aCkpOwotCi0vKiBXcml0ZSB0aGUgZGF0YSBvZiBhIFBORyBjaHVuayBzdGFydGVkIHdpdGggcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCkuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9jaHVua19kYXRhKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpKTsKLQotLyogRmluaXNoIGEgY2h1bmsgc3RhcnRlZCB3aXRoIHBuZ193cml0ZV9jaHVua19zdGFydCgpIChpbmNsdWRlcyBDUkMpLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfd3JpdGVfY2h1bmtfZW5kKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGluZm8gc3RydWN0dXJlICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfaW5mb3AscG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCkKLSAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi0jaWYgZGVmaW5lZChQTkdfMV8wX1gpIHx8IGRlZmluZWQgKFBOR18xXzJfWCkKLS8qIEluaXRpYWxpemUgdGhlIGluZm8gc3RydWN0dXJlIChvbGQgaW50ZXJmYWNlIC0gREVQUkVDQVRFRCkgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX2luZm9faW5pdCkgUE5HQVJHKChwbmdfaW5mb3AgaW5mb19wdHIpKTsKLSN1bmRlZiBwbmdfaW5mb19pbml0Ci0jZGVmaW5lIHBuZ19pbmZvX2luaXQoaW5mb19wdHIpIHBuZ19pbmZvX2luaXRfMygmaW5mb19wdHIsXAotICAgIHBuZ19zaXplb2YocG5nX2luZm8pKTsKLSNlbmRpZgotCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19pbmZvX2luaXRfMykgUE5HQVJHKChwbmdfaW5mb3BwIGluZm9fcHRyLAotICAgIHBuZ19zaXplX3QgcG5nX2luZm9fc3RydWN0X3NpemUpKTsKLQotLyogV3JpdGVzIGFsbCB0aGUgUE5HIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgaW1hZ2UuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX2luZm8pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotCi0jaWZuZGVmIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0vKiByZWFkIHRoZSBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIGFjdHVhbCBpbWFnZSBkYXRhLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfcmVhZF9pbmZvKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCkKLWV4dGVybiBQTkdfRVhQT1JUKHBuZ19jaGFycCxwbmdfY29udmVydF90b19yZmMxMTIzKQotICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdGltZXAgcHRpbWUpKTsKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX1dJTjMyX1dDRSkKLS8qICJ0aW1lLmgiIGZ1bmN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzQ0UgKi8KLSNpZiBkZWZpbmVkKFBOR19XUklURV90SU1FX1NVUFBPUlRFRCkKLS8qIGNvbnZlcnQgZnJvbSBhIHN0cnVjdCB0bSB0byBwbmdfdGltZSAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSkgUE5HQVJHKChwbmdfdGltZXAgcHRpbWUsCi0gICBzdHJ1Y3QgdG0gRkFSICogdHRpbWUpKTsKLQotLyogY29udmVydCBmcm9tIHRpbWVfdCB0byBwbmdfdGltZS4gIFVzZXMgZ210aW1lKCkgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX2NvbnZlcnRfZnJvbV90aW1lX3QpIFBOR0FSRygocG5nX3RpbWVwIHB0aW1lLAotICAgdGltZV90IHR0aW1lKSk7Ci0jZW5kaWYgLyogUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogX1dJTjMyX1dDRSAqLwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKQotLyogRXhwYW5kIGRhdGEgdG8gMjQtYml0IFJHQiwgb3IgOC1iaXQgZ3JheXNjYWxlLCB3aXRoIGFscGhhIGlmIGF2YWlsYWJsZS4gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9leHBhbmQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotI2lmICFkZWZpbmVkKFBOR18xXzBfWCkKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gIHBuZ19wdHIpKTsKLSNlbmRpZgotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF90Uk5TX3RvX2FscGhhKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZCAoUE5HXzFfMl9YKQotLyogRGVwcmVjYXRlZCAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9CR1JfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9CR1JfU1VQUE9SVEVEKQotLyogVXNlIGJsdWUsIGdyZWVuLCByZWQgb3JkZXIgZm9yIHBpeGVscy4gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9iZ3IpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRCkKLS8qIEV4cGFuZCB0aGUgZ3JheXNjYWxlIHRvIDI0LWJpdCBSR0IgaWYgbmVjZXNzYXJ5LiAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2dyYXlfdG9fcmdiKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQpCi0vKiBSZWR1Y2UgUkdCIHRvIGdyYXlzY2FsZS4gKi8KLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcmdiX3RvX2dyYXkpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCBlcnJvcl9hY3Rpb24sIGRvdWJsZSByZWQsIGRvdWJsZSBncmVlbiApKTsKLSNlbmRpZgotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBpbnQgZXJyb3JfYWN0aW9uLCBwbmdfZml4ZWRfcG9pbnQgcmVkLCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW4gKSk7Ci1leHRlcm4gUE5HX0VYUE9SVChwbmdfYnl0ZSxwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cykgUE5HQVJHKChwbmdfc3RydWN0cAotICAgcG5nX3B0cikpOwotI2VuZGlmCi0KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlKSBQTkdBUkcoKGludCBiaXRfZGVwdGgsCi0gICBwbmdfY29sb3JwIHBhbGV0dGUpKTsKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3N0cmlwX2FscGhhKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfQUxQSEFfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3N3YXBfYWxwaGEpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2ludmVydF9hbHBoYSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCkKLS8qIEFkZCBhIGZpbGxlciBieXRlIHRvIDgtYml0IEdyYXkgb3IgMjQtYml0IFJHQiBpbWFnZXMuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZmlsbGVyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfdWludF8zMiBmaWxsZXIsIGludCBmbGFncykpOwotLyogVGhlIHZhbHVlcyBvZiB0aGUgUE5HX0ZJTExFUl8gZGVmaW5lcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQgKi8KLSNkZWZpbmUgUE5HX0ZJTExFUl9CRUZPUkUgMAotI2RlZmluZSBQTkdfRklMTEVSX0FGVEVSIDEKLS8qIEFkZCBhbiBhbHBoYSBieXRlIHRvIDgtYml0IEdyYXkgb3IgMjQtYml0IFJHQiBpbWFnZXMuICovCi0jaWYgIWRlZmluZWQoUE5HXzFfMF9YKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2FkZF9hbHBoYSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3VpbnRfMzIgZmlsbGVyLCBpbnQgZmxhZ3MpKTsKLSNlbmRpZgotI2VuZGlmIC8qIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEKQotLyogU3dhcCBieXRlcyBpbiAxNi1iaXQgZGVwdGggZmlsZXMuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc3dhcCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEKQotLyogVXNlIDEgYnl0ZSBwZXIgcGl4ZWwgaW4gMSwgMiwgb3IgNC1iaXQgZGVwdGggZmlsZXMuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfcGFja2luZykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpCi0vKiBTd2FwIHBhY2tpbmcgb3JkZXIgb2YgcGl4ZWxzIGluIGJ5dGVzLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3BhY2tzd2FwKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCkKLS8qIENvbnZlcnRzIGZpbGVzIHRvIGxlZ2FsIGJpdCBkZXB0aHMuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc2hpZnQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb2xvcl84cCB0cnVlX2JpdHMpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCi0vKiBIYXZlIHRoZSBjb2RlIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFzc2VzLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQoaW50LHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKQotLyogSW52ZXJ0IG1vbm9jaHJvbWUgZmlsZXMgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9pbnZlcnRfbW9ubykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0vKiBIYW5kbGUgYWxwaGEgYW5kIHRSTlMgYnkgcmVwbGFjaW5nIHdpdGggYSBiYWNrZ3JvdW5kIGNvbG9yLiAqLwotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9iYWNrZ3JvdW5kKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29sb3JfMTZwIGJhY2tncm91bmRfY29sb3IsIGludCBiYWNrZ3JvdW5kX2dhbW1hX2NvZGUsCi0gICBpbnQgbmVlZF9leHBhbmQsIGRvdWJsZSBiYWNrZ3JvdW5kX2dhbW1hKSk7Ci0jZW5kaWYKLSNkZWZpbmUgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5LTk9XTiAwCi0jZGVmaW5lIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiAgMQotI2RlZmluZSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFICAgIDIKLSNkZWZpbmUgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5JUVVFICAzCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfMTZfVE9fOF9TVVBQT1JURUQpCi0vKiBzdHJpcCB0aGUgc2Vjb25kIGJ5dGUgb2YgaW5mb3JtYXRpb24gZnJvbSBhIDE2LWJpdCBkZXB0aCBmaWxlLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3N0cmlwXzE2KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9ESVRIRVJfU1VQUE9SVEVEKQotLyogVHVybiBvbiBkaXRoZXJpbmcsIGFuZCByZWR1Y2UgdGhlIHBhbGV0dGUgdG8gdGhlIG51bWJlciBvZiBjb2xvcnMgYXZhaWxhYmxlLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2RpdGhlcikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NvbG9ycCBwYWxldHRlLCBpbnQgbnVtX3BhbGV0dGUsIGludCBtYXhpbXVtX2NvbG9ycywKLSAgIHBuZ191aW50XzE2cCBoaXN0b2dyYW0sIGludCBmdWxsX2RpdGhlcikpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKLS8qIEhhbmRsZSBnYW1tYSBjb3JyZWN0aW9uLiBTY3JlZW5fZ2FtbWE9KGRpc3BsYXlfZXhwb25lbnQpICovCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2dhbW1hKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBkb3VibGUgc2NyZWVuX2dhbW1hLCBkb3VibGUgZGVmYXVsdF9maWxlX2dhbW1hKSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfMV8wX1gpIHx8IGRlZmluZWQgKFBOR18xXzJfWCkKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0VNUFRZX1BMVEVfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfRU1QVFlfUExURV9TVVBQT1JURUQpCi0vKiBQZXJtaXQgb3IgZGlzYWxsb3cgZW1wdHkgUExURSAoMDogbm90IHBlcm1pdHRlZCwgMTogcGVybWl0dGVkKSAqLwotLyogRGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkLiAgVXNlIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKCkgaW5zdGVhZC4gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3Blcm1pdF9lbXB0eV9wbHRlKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBpbnQgZW1wdHlfcGx0ZV9wZXJtaXR0ZWQpKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQpCi0vKiBTZXQgaG93IG1hbnkgbGluZXMgYmV0d2VlbiBvdXRwdXQgZmx1c2hlcyAtIDAgZm9yIG5vIGZsdXNoaW5nICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZmx1c2gpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IG5yb3dzKSk7Ci0vKiBGbHVzaCB0aGUgY3VycmVudCBQTkcgb3V0cHV0IGJ1ZmZlciAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfd3JpdGVfZmx1c2gpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotI2VuZGlmCi0KLS8qIG9wdGlvbmFsIHVwZGF0ZSBwYWxldHRlIHdpdGggcmVxdWVzdGVkIHRyYW5zZm9ybWF0aW9ucyAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc3RhcnRfcmVhZF9pbWFnZSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLS8qIG9wdGlvbmFsIGNhbGwgdG8gdXBkYXRlIHRoZSB1c2VycyBpbmZvIHN0cnVjdHVyZSAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfcmVhZF91cGRhdGVfaW5mbykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLSNpZm5kZWYgUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKLS8qIHJlYWQgb25lIG9yIG1vcmUgcm93cyBvZiBpbWFnZSBkYXRhLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfcmVhZF9yb3dzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXBwIHJvdywgcG5nX2J5dGVwcCBkaXNwbGF5X3JvdywgcG5nX3VpbnRfMzIgbnVtX3Jvd3MpKTsKLSNlbmRpZgotCi0jaWZuZGVmIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0vKiByZWFkIGEgcm93IG9mIGRhdGEuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19yZWFkX3JvdykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ19ieXRlcCBkaXNwbGF5X3JvdykpOwotI2VuZGlmCi0KLSNpZm5kZWYgUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKLS8qIHJlYWQgdGhlIHdob2xlIGltYWdlIGludG8gbWVtb3J5IGF0IG9uY2UuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19yZWFkX2ltYWdlKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXBwIGltYWdlKSk7Ci0jZW5kaWYKLQotLyogd3JpdGUgYSByb3cgb2YgaW1hZ2UgZGF0YSAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfd3JpdGVfcm93KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgcm93KSk7Ci0KLS8qIHdyaXRlIGEgZmV3IHJvd3Mgb2YgaW1hZ2UgZGF0YSAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfd3JpdGVfcm93cykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGVwcCByb3csIHBuZ191aW50XzMyIG51bV9yb3dzKSk7Ci0KLS8qIHdyaXRlIHRoZSBpbWFnZSBkYXRhICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9pbWFnZSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGVwcCBpbWFnZSkpOwotCi0vKiB3cml0ZXMgdGhlIGVuZCBvZiB0aGUgUE5HIGZpbGUuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9lbmQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotCi0jaWZuZGVmIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0vKiByZWFkIHRoZSBlbmQgb2YgdGhlIFBORyBmaWxlLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfcmVhZF9lbmQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotI2VuZGlmCi0KLS8qIGZyZWUgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHBuZ19pbmZvX3N0cnVjdCAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfZGVzdHJveV9pbmZvX3N0cnVjdCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wcCBpbmZvX3B0cl9wdHIpKTsKLQotLyogZnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG5nX3N0cnVjdCBhbmQgdGhlIHBuZ19pbmZvX3N0cnVjdHMgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QpIFBOR0FSRygocG5nX3N0cnVjdHBwCi0gICBwbmdfcHRyX3B0ciwgcG5nX2luZm9wcCBpbmZvX3B0cl9wdHIsIHBuZ19pbmZvcHAgZW5kX2luZm9fcHRyX3B0cikpOwotCi0vKiBmcmVlIGFsbCBtZW1vcnkgdXNlZCBieSB0aGUgcmVhZCAob2xkIG1ldGhvZCAtIE5PVCBETEwgRVhQT1JURUQpICovCi0vKiBEZWJpYW4gbm90ZTogZXhwb3J0aW5nIGFzIGl0IGlzIHJlcXVpcmVkIGJ5IGxlZ2FjeSBhcHBsaWNhdGlvbnMgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3JlYWRfZGVzdHJveSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfaW5mb3AgZW5kX2luZm9fcHRyKSk7Ci0KLS8qIGZyZWUgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHBuZ19zdHJ1Y3QgYW5kIHRoZSBwbmdfaW5mb19zdHJ1Y3RzICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCkKLSAgIFBOR0FSRygocG5nX3N0cnVjdHBwIHBuZ19wdHJfcHRyLCBwbmdfaW5mb3BwIGluZm9fcHRyX3B0cikpOwotCi0vKiBmcmVlIGFueSBtZW1vcnkgdXNlZCBpbiBwbmdfcHRyIHN0cnVjdCAob2xkIG1ldGhvZCAtIE5PVCBETEwgRVhQT1JURUQpICovCi0vKiBEZWJpYW4gbm90ZTogZXhwb3J0aW5nIGFzIGl0IGlzIHJlcXVpcmVkIGJ5IGxlZ2FjeSBhcHBsaWNhdGlvbnMgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3dyaXRlX2Rlc3Ryb3kpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi0vKiBzZXQgdGhlIGxpYnBuZyBtZXRob2Qgb2YgaGFuZGxpbmcgY2h1bmsgQ1JDIGVycm9ycyAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2NyY19hY3Rpb24pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCBjcml0X2FjdGlvbiwgaW50IGFuY2lsX2FjdGlvbikpOwotCi0vKiBWYWx1ZXMgZm9yIHBuZ19zZXRfY3JjX2FjdGlvbigpIHRvIHNheSBob3cgdG8gaGFuZGxlIENSQyBlcnJvcnMgaW4KLSAqIGFuY2lsbGFyeSBhbmQgY3JpdGljYWwgY2h1bmtzLCBhbmQgd2hldGhlciB0byB1c2UgdGhlIGRhdGEgY29udGFpbmVkCi0gKiB0aGVyZWluLiAgTm90ZSB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8gImRpc2NhcmQiIGRhdGEgaW4gYSBjcml0aWNhbAotICogY2h1bmsuICBGb3IgdmVyc2lvbnMgcHJpb3IgdG8gMC45MCwgdGhlIGFjdGlvbiB3YXMgYWx3YXlzIGVycm9yL3F1aXQsCi0gKiB3aGVyZWFzIGluIHZlcnNpb24gMC45MCBhbmQgbGF0ZXIsIHRoZSBhY3Rpb24gZm9yIENSQyBlcnJvcnMgaW4gYW5jaWxsYXJ5Ci0gKiBjaHVua3MgaXMgd2Fybi9kaXNjYXJkLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4KLSAqCi0gKiAgICAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246Y3JpdGljYWwgICAgIGFjdGlvbjphbmNpbGxhcnkKLSAqLwotI2RlZmluZSBQTkdfQ1JDX0RFRkFVTFQgICAgICAgMCAgLyogZXJyb3IvcXVpdCAgICAgICAgICB3YXJuL2Rpc2NhcmQgZGF0YSAqLwotI2RlZmluZSBQTkdfQ1JDX0VSUk9SX1FVSVQgICAgMSAgLyogZXJyb3IvcXVpdCAgICAgICAgICBlcnJvci9xdWl0ICAgICAgICAqLwotI2RlZmluZSBQTkdfQ1JDX1dBUk5fRElTQ0FSRCAgMiAgLyogKElOVkFMSUQpICAgICAgICAgICB3YXJuL2Rpc2NhcmQgZGF0YSAqLwotI2RlZmluZSBQTkdfQ1JDX1dBUk5fVVNFICAgICAgMyAgLyogd2Fybi91c2UgZGF0YSAgICAgICB3YXJuL3VzZSBkYXRhICAgICAqLwotI2RlZmluZSBQTkdfQ1JDX1FVSUVUX1VTRSAgICAgNCAgLyogcXVpZXQvdXNlIGRhdGEgICAgICBxdWlldC91c2UgZGF0YSAgICAqLwotI2RlZmluZSBQTkdfQ1JDX05PX0NIQU5HRSAgICAgNSAgLyogdXNlIGN1cnJlbnQgdmFsdWUgICB1c2UgY3VycmVudCB2YWx1ZSAqLwotCi0vKiBUaGVzZSBmdW5jdGlvbnMgZ2l2ZSB0aGUgdXNlciBjb250cm9sIG92ZXIgdGhlIHNjYW4tbGluZSBmaWx0ZXJpbmcgaW4KLSAqIGxpYnBuZyBhbmQgdGhlIGNvbXByZXNzaW9uIG1ldGhvZHMgdXNlZCBieSB6bGliLiAgVGhlc2UgZnVuY3Rpb25zIGFyZQotICogbWFpbmx5IHVzZWZ1bCBmb3IgdGVzdGluZywgYXMgdGhlIGRlZmF1bHRzIHNob3VsZCB3b3JrIHdpdGggbW9zdCB1c2Vycy4KLSAqIFRob3NlIHVzZXJzIHdobyBhcmUgdGlnaHQgb24gbWVtb3J5IG9yIHdhbnQgZmFzdGVyIHBlcmZvcm1hbmNlIGF0IHRoZQotICogZXhwZW5zZSBvZiBjb21wcmVzc2lvbiBjYW4gbW9kaWZ5IHRoZW0uICBTZWUgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIGhlYWRlciBmaWxlICh6bGliLmgpIGZvciBhbiBleHBsaW5hdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb25zLgotICovCi0KLS8qIHNldCB0aGUgZmlsdGVyaW5nIG1ldGhvZChzKSB1c2VkIGJ5IGxpYnBuZy4gIEN1cnJlbnRseSwgdGhlIG9ubHkgdmFsaWQKLSAqIHZhbHVlIGZvciAibWV0aG9kIiBpcyAwLgotICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZmlsdGVyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBtZXRob2QsCi0gICBpbnQgZmlsdGVycykpOwotCi0vKiBGbGFncyBmb3IgcG5nX3NldF9maWx0ZXIoKSB0byBzYXkgd2hpY2ggZmlsdGVycyB0byB1c2UuICBUaGUgZmxhZ3MKLSAqIGFyZSBjaG9zZW4gc28gdGhhdCB0aGV5IGRvbid0IGNvbmZsaWN0IHdpdGggcmVhbCBmaWx0ZXIgdHlwZXMKLSAqIGJlbG93LCBpbiBjYXNlIHRoZXkgYXJlIHN1cHBsaWVkIGluc3RlYWQgb2YgdGhlICNkZWZpbmVkIGNvbnN0YW50cy4KLSAqIFRoZXNlIHZhbHVlcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuCi0gKi8KLSNkZWZpbmUgUE5HX05PX0ZJTFRFUlMgICAgIDB4MDAKLSNkZWZpbmUgUE5HX0ZJTFRFUl9OT05FICAgIDB4MDgKLSNkZWZpbmUgUE5HX0ZJTFRFUl9TVUIgICAgIDB4MTAKLSNkZWZpbmUgUE5HX0ZJTFRFUl9VUCAgICAgIDB4MjAKLSNkZWZpbmUgUE5HX0ZJTFRFUl9BVkcgICAgIDB4NDAKLSNkZWZpbmUgUE5HX0ZJTFRFUl9QQUVUSCAgIDB4ODAKLSNkZWZpbmUgUE5HX0FMTF9GSUxURVJTIChQTkdfRklMVEVSX05PTkUgfCBQTkdfRklMVEVSX1NVQiB8IFBOR19GSUxURVJfVVAgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9BVkcgfCBQTkdfRklMVEVSX1BBRVRIKQotCi0vKiBGaWx0ZXIgdmFsdWVzIChub3QgZmxhZ3MpIC0gdXNlZCBpbiBwbmd3cml0ZS5jLCBwbmd3dXRpbC5jIGZvciBub3cuCi0gKiBUaGVzZSBkZWZpbmVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4KLSAqLwotI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX05PTkUgIDAKLSNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9TVUIgICAxCi0jZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfVVAgICAgMgotI2RlZmluZSBQTkdfRklMVEVSX1ZBTFVFX0FWRyAgIDMKLSNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSCA0Ci0jZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfTEFTVCAgNQotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCkgLyogRVhQRVJJTUVOVEFMICovCi0vKiBUaGUgImhldXJpc3RpY19tZXRob2QiIGlzIGdpdmVuIGJ5IG9uZSBvZiB0aGUgUE5HX0ZJTFRFUl9IRVVSSVNUSUNfCi0gKiBkZWZpbmVzLCBlaXRoZXIgdGhlIGRlZmF1bHQgKG1pbmltdW0tc3VtLW9mLWFic29sdXRlLWRpZmZlcmVuY2VzKSwgb3IKLSAqIHRoZSBleHBlcmltZW50YWwgbWV0aG9kICh3ZWlnaHRlZC1taW5pbXVtLXN1bS1vZi1hYnNvbHV0ZS1kaWZmZXJlbmNlcykuCi0gKgotICogV2VpZ2h0cyBhcmUgZmFjdG9ycyA+PSAxLjAsIGluZGljYXRpbmcgaG93IGltcG9ydGFudCBpdCBpcyB0byBrZWVwIHRoZQotICogZmlsdGVyIHR5cGUgY29uc2lzdGVudCBiZXR3ZWVuIHJvd3MuICBMYXJnZXIgbnVtYmVycyBtZWFuIHRoZSBjdXJyZW50Ci0gKiBmaWx0ZXIgaXMgdGhhdCBtYW55IHRpbWVzIGFzIGxpa2VseSB0byBiZSB0aGUgc2FtZSBhcyB0aGUgIm51bV93ZWlnaHRzIgotICogcHJldmlvdXMgZmlsdGVycy4gIFRoaXMgaXMgY3VtdWxhdGl2ZSBmb3IgZWFjaCBwcmV2aW91cyByb3cgd2l0aCBhIHdlaWdodC4KLSAqIFRoZXJlIG5lZWRzIHRvIGJlICJudW1fd2VpZ2h0cyIgdmFsdWVzIGluICJmaWx0ZXJfd2VpZ2h0cyIsIG9yIGl0IGNhbiBiZQotICogTlVMTCBpZiB0aGUgd2VpZ2h0cyBhcmVuJ3QgYmVpbmcgc3BlY2lmaWVkLiAgV2VpZ2h0cyBoYXZlIG5vIGluZmx1ZW5jZSBvbgotICogdGhlIHNlbGVjdGlvbiBvZiB0aGUgZmlyc3Qgcm93IGZpbHRlci4gIFdlbGwgY2hvc2VuIHdlaWdodHMgY2FuIChpbiB0aGVvcnkpCi0gKiBpbXByb3ZlIHRoZSBjb21wcmVzc2lvbiBmb3IgYSBnaXZlbiBpbWFnZS4KLSAqCi0gKiBDb3N0cyBhcmUgZmFjdG9ycyA+PSAxLjAgaW5kaWNhdGluZyB0aGUgcmVsYXRpdmUgZGVjb2RpbmcgY29zdHMgb2YgYQotICogZmlsdGVyIHR5cGUuICBIaWdoZXIgY29zdHMgaW5kaWNhdGUgbW9yZSBkZWNvZGluZyBleHBlbnNlLCBhbmQgYXJlCi0gKiB0aGVyZWZvcmUgbGVzcyBsaWtlbHkgdG8gYmUgc2VsZWN0ZWQgb3ZlciBhIGZpbHRlciB3aXRoIGxvd2VyIGNvbXB1dGF0aW9uYWwKLSAqIGNvc3RzLiAgVGhlcmUgbmVlZHMgdG8gYmUgYSB2YWx1ZSBpbiAiZmlsdGVyX2Nvc3RzIiBmb3IgZWFjaCB2YWxpZCBmaWx0ZXIKLSAqIHR5cGUgKGdpdmVuIGJ5IFBOR19GSUxURVJfVkFMVUVfTEFTVCksIG9yIGl0IGNhbiBiZSBOVUxMIGlmIHlvdSBhcmVuJ3QKLSAqIHNldHRpbmcgdGhlIGNvc3RzLiAgQ29zdHMgdHJ5IHRvIGltcHJvdmUgdGhlIHNwZWVkIG9mIGRlY29tcHJlc3Npb24gd2l0aG91dAotICogdW5kdWx5IGluY3JlYXNpbmcgdGhlIGNvbXByZXNzZWQgaW1hZ2Ugc2l6ZS4KLSAqCi0gKiBBIG5lZ2F0aXZlIHdlaWdodCBvciBjb3N0IGluZGljYXRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB0byBiZSB1c2VkLCBhbmQKLSAqIHZhbHVlcyBpbiB0aGUgcmFuZ2UgWzAuMCwgMS4wKSBpbmRpY2F0ZSB0aGUgdmFsdWUgaXMgdG8gcmVtYWluIHVuY2hhbmdlZC4KLSAqIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgYm90aCB3ZWlnaHRzIGFuZCBjb3N0cyBhcmUgY3VycmVudGx5IDEuMCwgYnV0IG1heQotICogY2hhbmdlIGlmIGdvb2QgZ2VuZXJhbCB3ZWlnaHRpbmcvY29zdCBoZXVyaXN0aWNzIGNhbiBiZSBmb3VuZC4gIElmIGJvdGgKLSAqIHRoZSB3ZWlnaHRzIGFuZCBjb3N0cyBhcmUgc2V0IHRvIDEuMCwgdGhpcyBkZWdlbmVyYXRlcyB0aGUgV0VJR0hURUQgbWV0aG9kCi0gKiB0byB0aGUgVU5XRUlHSFRFRCBtZXRob2QsIGJ1dCB3aXRoIGFkZGVkIGVuY29kaW5nIHRpbWUvY29tcHV0YXRpb24uCi0gKi8KLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCBoZXVyaXN0aWNfbWV0aG9kLCBpbnQgbnVtX3dlaWdodHMsIHBuZ19kb3VibGVwIGZpbHRlcl93ZWlnaHRzLAotICAgcG5nX2RvdWJsZXAgZmlsdGVyX2Nvc3RzKSk7Ci0jZW5kaWYKLSNlbmRpZiAvKiAgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQgKi8KLQotLyogSGV1cmlzdGljIHVzZWQgZm9yIHJvdyBmaWx0ZXIgc2VsZWN0aW9uLiAgVGhlc2UgZGVmaW5lcyBzaG91bGQgTk9UIGJlCi0gKiBjaGFuZ2VkLgotICovCi0jZGVmaW5lIFBOR19GSUxURVJfSEVVUklTVElDX0RFRkFVTFQgICAgMCAgLyogQ3VycmVudGx5ICJVTldFSUdIVEVEIiAqLwotI2RlZmluZSBQTkdfRklMVEVSX0hFVVJJU1RJQ19VTldFSUdIVEVEIDEgIC8qIFVzZWQgYnkgbGlicG5nIDwgMC45NSAqLwotI2RlZmluZSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCAgIDIgIC8qIEV4cGVyaW1lbnRhbCBmZWF0dXJlICovCi0jZGVmaW5lIFBOR19GSUxURVJfSEVVUklTVElDX0xBU1QgICAgICAgMyAgLyogTm90IGEgdmFsaWQgdmFsdWUgKi8KLQotLyogU2V0IHRoZSBsaWJyYXJ5IGNvbXByZXNzaW9uIGxldmVsLiAgQ3VycmVudGx5LCB2YWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbQotICogMCAtIDksIGNvcnJlc3BvbmRpbmcgZGlyZWN0bHkgdG8gdGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWxzIDAgLSA5Ci0gKiAoMCAtIG5vIGNvbXByZXNzaW9uLCA5IC0gIm1heGltYWwiIGNvbXByZXNzaW9uKS4gIE5vdGUgdGhhdCB0ZXN0cyBoYXZlCi0gKiBzaG93biB0aGF0IHpsaWIgY29tcHJlc3Npb24gbGV2ZWxzIDMtNiB1c3VhbGx5IHBlcmZvcm0gYXMgd2VsbCBhcyBsZXZlbCA5Ci0gKiBmb3IgUE5HIGltYWdlcywgYW5kIGRvIGNvbnNpZGVyYWJseSBmZXdlciBjYWNsdWxhdGlvbnMuICBJbiB0aGUgZnV0dXJlLAotICogdGhlc2UgdmFsdWVzIG1heSBub3QgY29ycmVzcG9uZCBkaXJlY3RseSB0byB0aGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbHMuCi0gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgaW50IGxldmVsKSk7Ci0KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwpCi0gICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBtZW1fbGV2ZWwpKTsKLQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KQotICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgc3RyYXRlZ3kpKTsKLQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzKQotICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgd2luZG93X2JpdHMpKTsKLQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgaW50IG1ldGhvZCkpOwotCi0vKiBUaGVzZSBuZXh0IGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZvciBpbnB1dC9vdXRwdXQsIG1lbW9yeSwgYW5kIGVycm9yCi0gKiBoYW5kbGluZy4gIFRoZXkgYXJlIGluIHRoZSBmaWxlIHBuZ3Jpby5jLCBwbmd3aW8uYywgYW5kIHBuZ2Vycm9yLmMsCi0gKiBhbmQgY2FsbCBzdGFuZGFyZCBDIEkvTyByb3V0aW5lcyBzdWNoIGFzIGZyZWFkKCksIGZ3cml0ZSgpLCBhbmQKLSAqIGZwcmludGYoKS4gIFRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgbWFkZSB0byB1c2Ugb3RoZXIgSS9PIHJvdXRpbmVzCi0gKiBhdCBydW4gdGltZSBmb3IgdGhvc2UgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byBoYW5kbGUgSS9PIGluIGEKLSAqIGRpZmZlcmVudCBtYW5uZXIgYnkgY2FsbGluZyBwbmdfc2V0Xz8/P19mbigpLiAgU2VlIGxpYnBuZy50eHQgZm9yCi0gKiBtb3JlIGluZm9ybWF0aW9uLgotICovCi0KLSNpZiAhZGVmaW5lZChQTkdfTk9fU1RESU8pCi0vKiBJbml0aWFsaXplIHRoZSBpbnB1dC9vdXRwdXQgZm9yIHRoZSBQTkcgZmlsZSB0byB0aGUgZGVmYXVsdCBmdW5jdGlvbnMuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19pbml0X2lvKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19GSUxFX3AgZnApKTsKLSNlbmRpZgotCi0vKiBSZXBsYWNlIHRoZSAoZXJyb3IgYW5kIGFib3J0KSwgYW5kIHdhcm5pbmcgZnVuY3Rpb25zIHdpdGggdXNlcgotICogc3VwcGxpZWQgZnVuY3Rpb25zLiAgSWYgbm8gbWVzc2FnZXMgYXJlIHRvIGJlIHByaW50ZWQgeW91IG11c3Qgc3RpbGwKLSAqIHdyaXRlIGFuZCB1c2UgcmVwbGFjZW1lbnQgZnVuY3Rpb25zLiBUaGUgcmVwbGFjZW1lbnQgZXJyb3JfZm4gc2hvdWxkCi0gKiBzdGlsbCBkbyBhIGxvbmdqbXAgdG8gdGhlIGxhc3Qgc2V0am1wIGxvY2F0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhpcwotICogbWV0aG9kIG9mIGVycm9yIGhhbmRsaW5nLiAgSWYgZXJyb3JfZm4gb3Igd2FybmluZ19mbiBpcyBOVUxMLCB0aGUKLSAqIGRlZmF1bHQgZnVuY3Rpb24gd2lsbCBiZSB1c2VkLgotICovCi0KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9lcnJvcl9mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3ZvaWRwIGVycm9yX3B0ciwgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuKSk7Ci0KLS8qIFJldHVybiB0aGUgdXNlciBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IgZnVuY3Rpb25zICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX2dldF9lcnJvcl9wdHIpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi0vKiBSZXBsYWNlIHRoZSBkZWZhdWx0IGRhdGEgb3V0cHV0IGZ1bmN0aW9ucyB3aXRoIGEgdXNlciBzdXBwbGllZCBvbmUocykuCi0gKiBJZiBidWZmZXJlZCBvdXRwdXQgaXMgbm90IHVzZWQsIHRoZW4gb3V0cHV0X2ZsdXNoX2ZuIGNhbiBiZSBzZXQgdG8gTlVMTC4KLSAqIElmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQgYXQgbGlicG5nIGNvbXBpbGUgdGltZQotICogb3V0cHV0X2ZsdXNoX2ZuIHdpbGwgYmUgaWdub3JlZCAoYW5kIHRodXMgY2FuIGJlIE5VTEwpLgotICogSXQgaXMgcHJvYmFibHkgYSBtaXN0YWtlIHRvIHVzZSBOVUxMIGZvciBvdXRwdXRfZmx1c2hfZm4gaWYKLSAqIHdyaXRlX2RhdGFfZm4gaXMgbm90IGFsc28gTlVMTCB1bmxlc3MgeW91IGhhdmUgYnVpbHQgbGlicG5nIHdpdGgKLSAqIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgdW5kZWZpbmVkLCBiZWNhdXNlIGluIHRoaXMgY2FzZSBsaWJwbmcncwotICogZGVmYXVsdCBmbHVzaCBmdW5jdGlvbiwgd2hpY2ggdXNlcyB0aGUgc3RhbmRhcmQgKkZJTEUgc3RydWN0dXJlLCB3aWxsCi0gKiBiZSB1c2VkLgotICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfd3JpdGVfZm4pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ192b2lkcCBpb19wdHIsIHBuZ19yd19wdHIgd3JpdGVfZGF0YV9mbiwgcG5nX2ZsdXNoX3B0ciBvdXRwdXRfZmx1c2hfZm4pKTsKLQotLyogUmVwbGFjZSB0aGUgZGVmYXVsdCBkYXRhIGlucHV0IGZ1bmN0aW9uIHdpdGggYSB1c2VyIHN1cHBsaWVkIG9uZS4gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9yZWFkX2ZuKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfdm9pZHAgaW9fcHRyLCBwbmdfcndfcHRyIHJlYWRfZGF0YV9mbikpOwotCi0vKiBSZXR1cm4gdGhlIHVzZXIgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIEkvTyBmdW5jdGlvbnMgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHBuZ192b2lkcCxwbmdfZ2V0X2lvX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9yZWFkX3N0YXR1c19mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3JlYWRfc3RhdHVzX3B0ciByZWFkX3Jvd19mbikpOwotCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfd3JpdGVfc3RhdHVzX3B0ciB3cml0ZV9yb3dfZm4pKTsKLQotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLS8qIFJlcGxhY2UgdGhlIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIHdpdGggdXNlciBzdXBwbGllZCBvbmUocykuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfbWVtX2ZuKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfdm9pZHAgbWVtX3B0ciwgcG5nX21hbGxvY19wdHIgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbikpOwotLyogUmV0dXJuIHRoZSB1c2VyIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW1vcnkgZnVuY3Rpb25zICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX2dldF9tZW1fcHRyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19MRUdBQ1lfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4pIFBOR0FSRygocG5nX3N0cnVjdHAKLSAgIHBuZ19wdHIsIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIgcmVhZF91c2VyX3RyYW5zZm9ybV9mbikpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19MRUdBQ1lfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyIHdyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfTEVHQUNZX1NVUFBPUlRFRCkKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfdm9pZHAgdXNlcl90cmFuc2Zvcm1fcHRyLCBpbnQgdXNlcl90cmFuc2Zvcm1fZGVwdGgsCi0gICBpbnQgdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHMpKTsKLS8qIFJldHVybiB0aGUgdXNlciBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0cmFuc2Zvcm0gZnVuY3Rpb25zICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIpCi0gICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3ZvaWRwIHVzZXJfY2h1bmtfcHRyLCBwbmdfdXNlcl9jaHVua19wdHIgcmVhZF91c2VyX2NodW5rX2ZuKSk7Ci1leHRlcm4gUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX2dldF91c2VyX2NodW5rX3B0cikgUE5HQVJHKChwbmdfc3RydWN0cAotICAgcG5nX3B0cikpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKLS8qIFNldHMgdGhlIGZ1bmN0aW9uIGNhbGxiYWNrcyBmb3IgdGhlIHB1c2ggcmVhZGVyLCBhbmQgYSBwb2ludGVyIHRvIGEKLSAqIHVzZXItZGVmaW5lZCBzdHJ1Y3R1cmUgYXZhaWxhYmxlIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMuCi0gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfdm9pZHAgcHJvZ3Jlc3NpdmVfcHRyLAotICAgcG5nX3Byb2dyZXNzaXZlX2luZm9fcHRyIGluZm9fZm4sIHBuZ19wcm9ncmVzc2l2ZV9yb3dfcHRyIHJvd19mbiwKLSAgIHBuZ19wcm9ncmVzc2l2ZV9lbmRfcHRyIGVuZF9mbikpOwotCi0vKiByZXR1cm5zIHRoZSB1c2VyIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwdXNoIHJlYWQgZnVuY3Rpb25zICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIpCi0gICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotLyogZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfcHJvY2Vzc19kYXRhKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19ieXRlcCBidWZmZXIsIHBuZ19zaXplX3QgYnVmZmVyX3NpemUpKTsKLQotLyogZnVuY3Rpb24gdGhhdCBjb21iaW5lcyByb3dzLiAgTm90IHZlcnkgbXVjaCBkaWZmZXJlbnQgdGhhbiB0aGUKLSAqIHBuZ19jb21iaW5lX3JvdygpIGNhbGwuICBJcyB0aGlzIGV2ZW4gdXNlZD8/Pz8/Ci0gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgb2xkX3JvdywgcG5nX2J5dGVwIG5ld19yb3cpKTsKLSNlbmRpZiAvKiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQgKi8KLQotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19tYWxsb2MpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ191aW50XzMyIHNpemUpKTsKLQotI2lmIGRlZmluZWQoUE5HXzFfMF9YKQotIyAgZGVmaW5lIHBuZ19tYWxsb2Nfd2FybiBwbmdfbWFsbG9jCi0jZWxzZQotLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS4yLjQgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHBuZ192b2lkcCxwbmdfbWFsbG9jX3dhcm4pIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ191aW50XzMyIHNpemUpKTsKLSNlbmRpZgotCi0vKiBmcmVlcyBhIHBvaW50ZXIgYWxsb2NhdGVkIGJ5IHBuZ19tYWxsb2MoKSAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfZnJlZSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyKSk7Ci0KLSNpZiBkZWZpbmVkKFBOR18xXzBfWCkKLS8qIEZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgemxpYi4gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWRwZixwbmdfemFsbG9jKSBQTkdBUkcoKHZvaWRwZiBwbmdfcHRyLCB1SW50IGl0ZW1zLAotICAgdUludCBzaXplKSk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGZyZWUgbWVtb3J5IGZvciB6bGliICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ196ZnJlZSkgUE5HQVJHKCh2b2lkcGYgcG5nX3B0ciwgdm9pZHBmIHB0cikpOwotI2VuZGlmCi0KLS8qIEZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW50ZXJuYWxseSAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfZnJlZV9kYXRhKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGZyZWVfbWUsIGludCBudW0pKTsKLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLS8qIFJlYXNzaWduIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIGV4aXN0aW5nIGRhdGEsIHdoZXRoZXIgYWxsb2NhdGVkCi0gKiBieSBsaWJwbmcgb3IgYnkgdGhlIGFwcGxpY2F0aW9uICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19kYXRhX2ZyZWVyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBmcmVlciwgcG5nX3VpbnRfMzIgbWFzaykpOwotI2VuZGlmCi0vKiBhc3NpZ25tZW50cyBmb3IgcG5nX2RhdGFfZnJlZXIgKi8KLSNkZWZpbmUgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEgMQotI2RlZmluZSBQTkdfU0VUX1dJTExfRlJFRV9EQVRBIDEKLSNkZWZpbmUgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEgMgotLyogRmxhZ3MgZm9yIHBuZ19wdHItPmZyZWVfbWUgYW5kIGluZm9fcHRyLT5mcmVlX21lICovCi0jZGVmaW5lIFBOR19GUkVFX0hJU1QgMHgwMDA4Ci0jZGVmaW5lIFBOR19GUkVFX0lDQ1AgMHgwMDEwCi0jZGVmaW5lIFBOR19GUkVFX1NQTFQgMHgwMDIwCi0jZGVmaW5lIFBOR19GUkVFX1JPV1MgMHgwMDQwCi0jZGVmaW5lIFBOR19GUkVFX1BDQUwgMHgwMDgwCi0jZGVmaW5lIFBOR19GUkVFX1NDQUwgMHgwMTAwCi0jZGVmaW5lIFBOR19GUkVFX1VOS04gMHgwMjAwCi0jZGVmaW5lIFBOR19GUkVFX0xJU1QgMHgwNDAwCi0jZGVmaW5lIFBOR19GUkVFX1BMVEUgMHgxMDAwCi0jZGVmaW5lIFBOR19GUkVFX1RSTlMgMHgyMDAwCi0jZGVmaW5lIFBOR19GUkVFX1RFWFQgMHg0MDAwCi0jZGVmaW5lIFBOR19GUkVFX0FMTCAgMHg3ZmZmCi0jZGVmaW5lIFBOR19GUkVFX01VTCAgMHg0MjIwIC8qIFBOR19GUkVFX1NQTFR8UE5HX0ZSRUVfVEVYVHxQTkdfRlJFRV9VTktOICovCi0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX21hbGxvY19kZWZhdWx0KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfdWludF8zMiBzaXplKSk7Ci1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19mcmVlX2RlZmF1bHQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ192b2lkcCBwdHIpKTsKLSNlbmRpZgotCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdm9pZHAscG5nX21lbWNweV9jaGVjaykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3ZvaWRwIHMxLCBwbmdfdm9pZHAgczIsIHBuZ191aW50XzMyIHNpemUpKTsKLQotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3ZvaWRwLHBuZ19tZW1zZXRfY2hlY2spIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ192b2lkcCBzMSwgaW50IHZhbHVlLCBwbmdfdWludF8zMiBzaXplKSk7Ci0KLSNpZiBkZWZpbmVkKFVTRV9GQVJfS0VZV09SRCkgIC8qIG1lbW9yeSBtb2RlbCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCi1leHRlcm4gdm9pZCAqcG5nX2Zhcl90b19uZWFyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cixwbmdfdm9pZHAgcHRyLAotICAgaW50IGNoZWNrKSk7Ci0jZW5kaWYgLyogVVNFX0ZBUl9LRVlXT1JEICovCi0KLSNpZm5kZWYgUE5HX05PX0VSUk9SX1RFWFQKLS8qIEZhdGFsIGVycm9yIGluIFBORyBpbWFnZSBvZiBsaWJwbmcgLSBjYW4ndCBjb250aW51ZSAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfZXJyb3IpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSk7Ci0KLS8qIFRoZSBzYW1lLCBidXQgdGhlIGNodW5rIG5hbWUgaXMgcHJlcGVuZGVkIHRvIHRoZSBlcnJvciBzdHJpbmcuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19jaHVua19lcnJvcikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpKTsKLSNlbHNlCi0vKiBGYXRhbCBlcnJvciBpbiBQTkcgaW1hZ2Ugb2YgbGlicG5nIC0gY2FuJ3QgY29udGludWUgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX2VycikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBQTkdfTk9fV0FSTklOR1MKLS8qIE5vbi1mYXRhbCBlcnJvciBpbiBsaWJwbmcuICBDYW4gY29udGludWUsIGJ1dCBtYXkgaGF2ZSBhIHByb2JsZW0uICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193YXJuaW5nKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSk7Ci0KLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLS8qIE5vbi1mYXRhbCBlcnJvciBpbiBsaWJwbmcsIGNodW5rIG5hbWUgaXMgcHJlcGVuZGVkIHRvIG1lc3NhZ2UuICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19jaHVua193YXJuaW5nKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSk7Ci0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogUE5HX05PX1dBUk5JTkdTICovCi0KLS8qIFRoZSBwbmdfc2V0XzxjaHVuaz4gZnVuY3Rpb25zIGFyZSBmb3Igc3RvcmluZyB2YWx1ZXMgaW4gdGhlIHBuZ19pbmZvX3N0cnVjdC4KLSAqIFNpbWlsYXJseSwgdGhlIHBuZ19nZXRfPGNodW5rPiBjYWxscyBhcmUgdXNlZCB0byByZWFkIHZhbHVlcyBmcm9tIHRoZQotICogcG5nX2luZm9fc3RydWN0LCBlaXRoZXIgc3RvcmluZyB0aGUgcGFyYW1ldGVycyBpbiB0aGUgcGFzc2VkIHZhcmlhYmxlcywgb3IKLSAqIHNldHRpbmcgcG9pbnRlcnMgaW50byB0aGUgcG5nX2luZm9fc3RydWN0IHdoZXJlIHRoZSBkYXRhIGlzIHN0b3JlZC4gIFRoZQotICogcG5nX2dldF88Y2h1bms+IGZ1bmN0aW9ucyByZXR1cm4gYSBub24temVybyB2YWx1ZSBpZiB0aGUgZGF0YSB3YXMgYXZhaWxhYmxlCi0gKiBpbiBpbmZvX3B0ciwgb3IgcmV0dXJuIHplcm8gYW5kIGRvIG5vdCBjaGFuZ2UgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGlmIHRoZQotICogZGF0YSB3YXMgbm90IGF2YWlsYWJsZS4KLSAqCi0gKiBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBkaXJlY3RseSBhY2Nlc3NpbmcgcG5nX2luZm8KLSAqIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggZnV0dXJlIGNoYW5nZXMgaW4gdGhlIHNpemUgYW5kIGludGVybmFsIGxheW91dCBvZgotICogcG5nX2luZm9fc3RydWN0LgotICovCi0vKiBSZXR1cm5zICJmbGFnIiBpZiBjaHVuayBkYXRhIGlzIHZhbGlkIGluIGluZm9fcHRyLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF92YWxpZCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBmbGFnKSk7Ci0KLS8qIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBob2xkIGEgdHJhbnNmb3JtZWQgcm93LiAqLwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9yb3dieXRlcykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLSNpZiBkZWZpbmVkKFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRCkKLS8qIFJldHVybnMgcm93X3BvaW50ZXJzLCB3aGljaCBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB0byBzY2FubGluZXMgdGhhdCB3YXMKLXJldHVybmVkIGZyb20gcG5nX3JlYWRfcG5nKCkuICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfYnl0ZXBwLHBuZ19nZXRfcm93cykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0vKiBTZXQgcm93X3BvaW50ZXJzLCB3aGljaCBpcyBhbiBhcnJheSBvZiBwb2ludGVycyB0byBzY2FubGluZXMgZm9yIHVzZQotYnkgcG5nX3dyaXRlX3BuZygpLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3Jvd3MpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2J5dGVwcCByb3dfcG9pbnRlcnMpKTsKLSNlbmRpZgotCi0vKiBSZXR1cm5zIG51bWJlciBvZiBjb2xvciBjaGFubmVscyBpbiBpbWFnZS4gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHBuZ19ieXRlLHBuZ19nZXRfY2hhbm5lbHMpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLXBuZ19pbmZvcCBpbmZvX3B0cikpOwotCi0jaWZkZWYgUE5HX0VBU1lfQUNDRVNTX1NVUFBPUlRFRAotLyogUmV0dXJucyBpbWFnZSB3aWR0aCBpbiBwaXhlbHMuICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMiwgcG5nX2dldF9pbWFnZV93aWR0aCkgUE5HQVJHKChwbmdfc3RydWN0cAotcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLS8qIFJldHVybnMgaW1hZ2UgaGVpZ2h0IGluIHBpeGVscy4gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLCBwbmdfZ2V0X2ltYWdlX2hlaWdodCkgUE5HQVJHKChwbmdfc3RydWN0cAotcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLS8qIFJldHVybnMgaW1hZ2UgYml0X2RlcHRoLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX2J5dGUsIHBuZ19nZXRfYml0X2RlcHRoKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi1wbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLQotLyogUmV0dXJucyBpbWFnZSBjb2xvcl90eXBlLiAqLwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX2J5dGUsIHBuZ19nZXRfY29sb3JfdHlwZSkgUE5HQVJHKChwbmdfc3RydWN0cAotcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLS8qIFJldHVybnMgaW1hZ2UgZmlsdGVyX3R5cGUuICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfYnl0ZSwgcG5nX2dldF9maWx0ZXJfdHlwZSkgUE5HQVJHKChwbmdfc3RydWN0cAotcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLS8qIFJldHVybnMgaW1hZ2UgaW50ZXJsYWNlX3R5cGUuICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfYnl0ZSwgcG5nX2dldF9pbnRlcmxhY2VfdHlwZSkgUE5HQVJHKChwbmdfc3RydWN0cAotcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLS8qIFJldHVybnMgaW1hZ2UgY29tcHJlc3Npb25fdHlwZS4gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHBuZ19ieXRlLCBwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUpIFBOR0FSRygocG5nX3N0cnVjdHAKLXBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotCi0vKiBSZXR1cm5zIGltYWdlIHJlc29sdXRpb24gaW4gcGl4ZWxzIHBlciBtZXRlciwgZnJvbSBwSFlzIGNodW5rIGRhdGEuICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMiwgcG5nX2dldF9waXhlbHNfcGVyX21ldGVyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi1wbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLWV4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLCBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlcikgUE5HQVJHKChwbmdfc3RydWN0cAotcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMiwgcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIpIFBOR0FSRygocG5nX3N0cnVjdHAKLXBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotCi0vKiBSZXR1cm5zIHBpeGVsIGFzcGVjdCByYXRpbywgY29tcHV0ZWQgZnJvbSBwSFlzIGNodW5rIGRhdGEuICAqLwotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLWV4dGVybiBQTkdfRVhQT1JUKGZsb2F0LCBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpbykgUE5HQVJHKChwbmdfc3RydWN0cAotcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0jZW5kaWYKLQotLyogUmV0dXJucyBpbWFnZSB4LCB5IG9mZnNldCBpbiBwaXhlbHMgb3IgbWljcm9ucywgZnJvbSBvRkZzIGNodW5rIGRhdGEuICovCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfaW50XzMyLCBwbmdfZ2V0X3hfb2Zmc2V0X3BpeGVscykgUE5HQVJHKChwbmdfc3RydWN0cAotcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci1leHRlcm4gUE5HX0VYUE9SVChwbmdfaW50XzMyLCBwbmdfZ2V0X3lfb2Zmc2V0X3BpeGVscykgUE5HQVJHKChwbmdfc3RydWN0cAotcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci1leHRlcm4gUE5HX0VYUE9SVChwbmdfaW50XzMyLCBwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMpIFBOR0FSRygocG5nX3N0cnVjdHAKLXBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX2ludF8zMiwgcG5nX2dldF95X29mZnNldF9taWNyb25zKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi1wbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLQotI2VuZGlmIC8qIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQgKi8KLQotLyogUmV0dXJucyBwb2ludGVyIHRvIHNpZ25hdHVyZSBzdHJpbmcgcmVhZCBmcm9tIFBORyBoZWFkZXIgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHBuZ19ieXRlcCxwbmdfZ2V0X3NpZ25hdHVyZSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLSNpZiBkZWZpbmVkKFBOR19iS0dEX1NVUFBPUlRFRCkKLWV4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfYktHRCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfY29sb3JfMTZwICpiYWNrZ3JvdW5kKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2JLR0RfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2JLR0QpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NvbG9yXzE2cCBiYWNrZ3JvdW5kKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2NIUk1fU1VQUE9SVEVEKQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLWV4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfY0hSTSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBkb3VibGUgKndoaXRlX3gsIGRvdWJsZSAqd2hpdGVfeSwgZG91YmxlICpyZWRfeCwKLSAgIGRvdWJsZSAqcmVkX3ksIGRvdWJsZSAqZ3JlZW5feCwgZG91YmxlICpncmVlbl95LCBkb3VibGUgKmJsdWVfeCwKLSAgIGRvdWJsZSAqYmx1ZV95KSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X2NIUk1fZml4ZWQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2ZpeGVkX3BvaW50ICppbnRfd2hpdGVfeCwgcG5nX2ZpeGVkX3BvaW50Ci0gICAqaW50X3doaXRlX3ksIHBuZ19maXhlZF9wb2ludCAqaW50X3JlZF94LCBwbmdfZml4ZWRfcG9pbnQgKmludF9yZWRfeSwKLSAgIHBuZ19maXhlZF9wb2ludCAqaW50X2dyZWVuX3gsIHBuZ19maXhlZF9wb2ludCAqaW50X2dyZWVuX3ksIHBuZ19maXhlZF9wb2ludAotICAgKmludF9ibHVlX3gsIHBuZ19maXhlZF9wb2ludCAqaW50X2JsdWVfeSkpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2NIUk1fU1VQUE9SVEVEKQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jSFJNKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIGRvdWJsZSB3aGl0ZV94LCBkb3VibGUgd2hpdGVfeSwgZG91YmxlIHJlZF94LAotICAgZG91YmxlIHJlZF95LCBkb3VibGUgZ3JlZW5feCwgZG91YmxlIGdyZWVuX3ksIGRvdWJsZSBibHVlX3gsIGRvdWJsZSBibHVlX3kpKTsKLSNlbmRpZgotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9jSFJNX2ZpeGVkKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeCwgcG5nX2ZpeGVkX3BvaW50IGludF93aGl0ZV95LAotICAgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfeCwgcG5nX2ZpeGVkX3BvaW50IGludF9yZWRfeSwgcG5nX2ZpeGVkX3BvaW50Ci0gICBpbnRfZ3JlZW5feCwgcG5nX2ZpeGVkX3BvaW50IGludF9ncmVlbl95LCBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfeCwKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfYmx1ZV95KSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfZ0FNQV9TVVBQT1JURUQpCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9nQU1BKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIGRvdWJsZSAqZmlsZV9nYW1tYSkpOwotI2VuZGlmCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X2dBTUFfZml4ZWQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2ZpeGVkX3BvaW50ICppbnRfZmlsZV9nYW1tYSkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19nQU1BX1NVUFBPUlRFRCkKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZ0FNQSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBkb3VibGUgZmlsZV9nYW1tYSkpOwotI2VuZGlmCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfZ0FNQV9maXhlZCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfZml4ZWRfcG9pbnQgaW50X2ZpbGVfZ2FtbWEpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfaElTVF9TVVBQT1JURUQpCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X2hJU1QpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMTZwICpoaXN0KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2hJU1RfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2hJU1QpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMTZwIGhpc3QpKTsKLSNlbmRpZgotCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X0lIRFIpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgKndpZHRoLCBwbmdfdWludF8zMiAqaGVpZ2h0LAotICAgaW50ICpiaXRfZGVwdGgsIGludCAqY29sb3JfdHlwZSwgaW50ICppbnRlcmxhY2VfbWV0aG9kLAotICAgaW50ICpjb21wcmVzc2lvbl9tZXRob2QsIGludCAqZmlsdGVyX21ldGhvZCkpOwotCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfSUhEUikgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgYml0X2RlcHRoLAotICAgaW50IGNvbG9yX3R5cGUsIGludCBpbnRlcmxhY2VfbWV0aG9kLCBpbnQgY29tcHJlc3Npb25fbWV0aG9kLAotICAgaW50IGZpbHRlcl9tZXRob2QpKTsKLQotI2lmIGRlZmluZWQoUE5HX29GRnNfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9vRkZzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19pbnRfMzIgKm9mZnNldF94LCBwbmdfaW50XzMyICpvZmZzZXRfeSwKLSAgIGludCAqdW5pdF90eXBlKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX29GRnNfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X29GRnMpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2ludF8zMiBvZmZzZXRfeCwgcG5nX2ludF8zMiBvZmZzZXRfeSwKLSAgIGludCB1bml0X3R5cGUpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfcENBTF9TVVBQT1JURUQpCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3BDQUwpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NoYXJwICpwdXJwb3NlLCBwbmdfaW50XzMyICpYMCwgcG5nX2ludF8zMiAqWDEsCi0gICBpbnQgKnR5cGUsIGludCAqbnBhcmFtcywgcG5nX2NoYXJwICp1bml0cywgcG5nX2NoYXJwcCAqcGFyYW1zKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3BDQUxfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3BDQUwpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NoYXJwIHB1cnBvc2UsIHBuZ19pbnRfMzIgWDAsIHBuZ19pbnRfMzIgWDEsCi0gICBpbnQgdHlwZSwgaW50IG5wYXJhbXMsIHBuZ19jaGFycCB1bml0cywgcG5nX2NoYXJwcCBwYXJhbXMpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfcEhZc19TVVBQT1JURUQpCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3BIWXMpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgKnJlc194LCBwbmdfdWludF8zMiAqcmVzX3ksIGludCAqdW5pdF90eXBlKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3BIWXNfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3BIWXMpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgcmVzX3gsIHBuZ191aW50XzMyIHJlc195LCBpbnQgdW5pdF90eXBlKSk7Ci0jZW5kaWYKLQotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9QTFRFKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jb2xvcnAgKnBhbGV0dGUsIGludCAqbnVtX3BhbGV0dGUpKTsKLQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X1BMVEUpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NvbG9ycCBwYWxldHRlLCBpbnQgbnVtX3BhbGV0dGUpKTsKLQotI2lmIGRlZmluZWQoUE5HX3NCSVRfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9zQklUKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jb2xvcl84cCAqc2lnX2JpdCkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19zQklUX1NVUFBPUlRFRCkKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zQklUKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jb2xvcl84cCBzaWdfYml0KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3NSR0JfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9zUkdCKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIGludCAqaW50ZW50KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3NSR0JfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3NSR0IpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IGludGVudCkpOwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTSkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgaW50ZW50KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2lDQ1BfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9pQ0NQKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jaGFycHAgbmFtZSwgaW50ICpjb21wcmVzc2lvbl90eXBlLAotICAgcG5nX2NoYXJwcCBwcm9maWxlLCBwbmdfdWludF8zMiAqcHJvZmxlbikpOwotICAgLyogTm90ZSB0byBtYWludGFpbmVyOiBwcm9maWxlIHNob3VsZCBiZSBwbmdfYnl0ZXBwICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2lDQ1BfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X2lDQ1ApIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NoYXJwIG5hbWUsIGludCBjb21wcmVzc2lvbl90eXBlLAotICAgcG5nX2NoYXJwIHByb2ZpbGUsIHBuZ191aW50XzMyIHByb2ZsZW4pKTsKLSAgIC8qIE5vdGUgdG8gbWFpbnRhaW5lcjogcHJvZmlsZSBzaG91bGQgYmUgcG5nX2J5dGVwICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3NQTFRfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9zUExUKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19zUExUX3RwcCBlbnRyaWVzKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3NQTFRfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3NQTFQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3NQTFRfdHAgZW50cmllcywgaW50IG5lbnRyaWVzKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1RFWFRfU1VQUE9SVEVEKQotLyogcG5nX2dldF90ZXh0IGFsc28gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRleHQgY2h1bmtzIGluICpudW1fdGV4dCAqLwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF90ZXh0KSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ190ZXh0cCAqdGV4dF9wdHIsIGludCAqbnVtX3RleHQpKTsKLSNlbmRpZgotCi0vKgotICogIE5vdGUgd2hpbGUgcG5nX3NldF90ZXh0KCkgd2lsbCBhY2NlcHQgYSBzdHJ1Y3R1cmUgd2hvc2UgdGV4dCwKLSAqICBsYW5ndWFnZSwgYW5kICB0cmFuc2xhdGVkIGtleXdvcmRzIGFyZSBOVUxMIHBvaW50ZXJzLCB0aGUgc3RydWN0dXJlCi0gKiAgcmV0dXJuZWQgYnkgcG5nX2dldF90ZXh0IHdpbGwgYWx3YXlzIGNvbnRhaW4gcmVndWxhcgotICogIHplcm8tdGVybWluYXRlZCBDIHN0cmluZ3MuICBUaGV5IG1pZ2h0IGJlIGVtcHR5IHN0cmluZ3MgYnV0Ci0gKiAgdGhleSB3aWxsIG5ldmVyIGJlIE5VTEwgcG9pbnRlcnMuCi0gKi8KLQotI2lmIGRlZmluZWQoUE5HX1RFWFRfU1VQUE9SVEVEKQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfc2V0X3RleHQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3RleHRwIHRleHRfcHRyLCBpbnQgbnVtX3RleHQpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfdElNRV9TVVBQT1JURUQpCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3RJTUUpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3RpbWVwICptb2RfdGltZSkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR190SU1FX1NVUFBPUlRFRCkKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF90SU1FKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ190aW1lcCBtb2RfdGltZSkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR190Uk5TX1NVUFBPUlRFRCkKLWV4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfdFJOUykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfYnl0ZXAgKnRyYW5zLCBpbnQgKm51bV90cmFucywKLSAgIHBuZ19jb2xvcl8xNnAgKnRyYW5zX3ZhbHVlcykpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR190Uk5TX1NVUFBPUlRFRCkKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF90Uk5TKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19ieXRlcCB0cmFucywgaW50IG51bV90cmFucywKLSAgIHBuZ19jb2xvcl8xNnAgdHJhbnNfdmFsdWVzKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3RSTlNfU1VQUE9SVEVEKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3NDQUwpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50ICp1bml0LCBkb3VibGUgKndpZHRoLCBkb3VibGUgKmhlaWdodCkpOwotI2Vsc2UKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3NDQUxfcykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgKnVuaXQsIHBuZ19jaGFycHAgc3dpZHRoLCBwbmdfY2hhcnBwIHNoZWlnaHQpKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYgLyogUE5HX3NDQUxfU1VQUE9SVEVEICovCi0KLSNpZiBkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfc0NBTCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgdW5pdCwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KSk7Ci0jZWxzZQotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zQ0FMX3MpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IHVuaXQsIHBuZ19jaGFycCBzd2lkdGgsIHBuZ19jaGFycCBzaGVpZ2h0KSk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmIC8qIFBOR19zQ0FMX1NVUFBPUlRFRCB8fCBQTkdfV1JJVEVfc0NBTF9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLS8qIHByb3ZpZGUgYSBsaXN0IG9mIGNodW5rcyBhbmQgaG93IHRoZXkgYXJlIHRvIGJlIGhhbmRsZWQsIGlmIHRoZSBidWlsdC1pbgotICAgaGFuZGxpbmcgb3IgZGVmYXVsdCB1bmtub3duIGNodW5rIGhhbmRsaW5nIGlzIG5vdCBkZXNpcmVkLiAgQW55IGNodW5rcyBub3QKLSAgIGxpc3RlZCB3aWxsIGJlIGhhbmRsZWQgaW4gdGhlIGRlZmF1bHQgbWFubmVyLiAgVGhlIElIRFIgYW5kIElFTkQgY2h1bmtzCi0gICBtdXN0IG5vdCBiZSBsaXN0ZWQuCi0gICAgICBrZWVwID0gMDogZm9sbG93IGRlZmF1bHQgYmVoYXZpb3VyCi0gICAgICAgICAgID0gMTogZG8gbm90IGtlZXAKLSAgICAgICAgICAgPSAyOiBrZWVwIG9ubHkgaWYgc2FmZS10by1jb3B5Ci0gICAgICAgICAgID0gMzoga2VlcCBldmVuIGlmIHVuc2FmZS10by1jb3B5Ci0qLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCwgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBpbnQga2VlcCwgcG5nX2J5dGVwIGNodW5rX2xpc3QsIGludCBudW1fY2h1bmtzKSk7Ci1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLCBwbmdfc2V0X3Vua25vd25fY2h1bmtzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191bmtub3duX2NodW5rcCB1bmtub3ducywgaW50IG51bV91bmtub3ducykpOwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCwgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uKQotICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBjaHVuaywgaW50IGxvY2F0aW9uKSk7Ci1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3Vua25vd25fY2h1bmtzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191bmtub3duX2NodW5rcHAgZW50cmllcykpOwotI2VuZGlmCi0jaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAotUE5HX0VYUE9SVChpbnQscG5nX2hhbmRsZV9hc191bmtub3duKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcAotICAgY2h1bmtfbmFtZSkpOwotI2VuZGlmCi0KLS8qIFBuZ19mcmVlX2RhdGEoKSB3aWxsIHR1cm4gb2ZmIHRoZSAidmFsaWQiIGZsYWcgZm9yIGFueXRoaW5nIGl0IGZyZWVzLgotICAgSWYgeW91IG5lZWQgdG8gdHVybiBpdCBvZmYgZm9yIGEgY2h1bmsgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGhhcyBmcmVlZCwKLSAgIHlvdSBjYW4gdXNlIHBuZ19zZXRfaW52YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fQ0hOSyk7ICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLCBwbmdfc2V0X2ludmFsaWQpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IG1hc2spKTsKLQotI2lmIGRlZmluZWQoUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVEKQotLyogVGhlICJwYXJhbXMiIHBvaW50ZXIgaXMgY3VycmVudGx5IG5vdCB1c2VkIGFuZCBpcyBmb3IgZnV0dXJlIGV4cGFuc2lvbi4gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQsIHBuZ19yZWFkX3BuZykgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2luZm9wIGluZm9fcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zZm9ybXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfdm9pZHAgcGFyYW1zKSk7Ci1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLCBwbmdfd3JpdGVfcG5nKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNmb3JtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ192b2lkcCBwYXJhbXMpKTsKLSNlbmRpZgotCi0vKiBEZWZpbmUgUE5HX0RFQlVHIGF0IGNvbXBpbGUgdGltZSBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSGlnaGVyCi0gKiBudW1iZXJzIGZvciBQTkdfREVCVUcgbWVhbiBtb3JlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgaGFzCi0gKiBvbmx5IGJlZW4gYWRkZWQgc2luY2UgdmVyc2lvbiAwLjk1IHNvIGl0IGlzIG5vdCBpbXBsZW1lbnRlZCB0aHJvdWdob3V0Ci0gKiBsaWJwbmcgeWV0LCBidXQgbW9yZSBzdXBwb3J0IHdpbGwgYmUgYWRkZWQgYXMgbmVlZGVkLgotICovCi0jaWZkZWYgUE5HX0RFQlVHCi0jaWYgKFBOR19ERUJVRyA+IDApCi0jaWYgIWRlZmluZWQoUE5HX0RFQlVHX0ZJTEUpICYmIGRlZmluZWQoX01TQ19WRVIpCi0jaW5jbHVkZSA8Y3J0ZGJnLmg+Ci0jaWYgKFBOR19ERUJVRyA+IDEpCi0jaWZuZGVmIF9ERUJVRwotIyAgZGVmaW5lIF9ERUJVRwotI2VuZGlmCi0jaWZuZGVmIHBuZ19kZWJ1ZwotI2RlZmluZSBwbmdfZGVidWcobCxtKSAgX1JQVDAoX0NSVF9XQVJOLG0gUE5HX1NUUklOR19ORVdMSU5FKQotI2VuZGlmCi0jaWZuZGVmIHBuZ19kZWJ1ZzEKLSNkZWZpbmUgcG5nX2RlYnVnMShsLG0scDEpICBfUlBUMShfQ1JUX1dBUk4sbSBQTkdfU1RSSU5HX05FV0xJTkUscDEpCi0jZW5kaWYKLSNpZm5kZWYgcG5nX2RlYnVnMgotI2RlZmluZSBwbmdfZGVidWcyKGwsbSxwMSxwMikgX1JQVDIoX0NSVF9XQVJOLG0gUE5HX1NUUklOR19ORVdMSU5FLHAxLHAyKQotI2VuZGlmCi0jZW5kaWYKLSNlbHNlIC8qIFBOR19ERUJVR19GSUxFIHx8ICFfTVNDX1ZFUiAqLwotI2lmbmRlZiBQTkdfREVCVUdfRklMRQotI2RlZmluZSBQTkdfREVCVUdfRklMRSBzdGRlcnIKLSNlbmRpZiAvKiBQTkdfREVCVUdfRklMRSAqLwotCi0jaWYgKFBOR19ERUJVRyA+IDEpCi0vKiBOb3RlOiBbIiVzIm0gUE5HX1NUUklOR19ORVdMSU5FXSBwcm9iYWJseSBkb2VzIG5vdCB3b3JrIG9uCi0gKiBub24tSVNPIGNvbXBpbGVycyAqLwotIyAgaWZkZWYgX19TVERDX18KLSMgICAgaWZuZGVmIHBuZ19kZWJ1ZwotIyAgICAgIGRlZmluZSBwbmdfZGVidWcobCxtKSBcCi0gICAgICAgeyBcCi0gICAgICAgaW50IG51bV90YWJzPWw7IFwKLSAgICAgICBmcHJpbnRmKFBOR19ERUJVR19GSUxFLCIlcyJtIFBOR19TVFJJTkdfTkVXTElORSwobnVtX3RhYnM9PTEgPyAiXHQiIDogXAotICAgICAgICAgKG51bV90YWJzPT0yID8gIlx0XHQiOihudW1fdGFicz4yID8gIlx0XHRcdCI6IiIpKSkpOyBcCi0gICAgICAgfQotIyAgICBlbmRpZgotIyAgICBpZm5kZWYgcG5nX2RlYnVnMQotIyAgICAgIGRlZmluZSBwbmdfZGVidWcxKGwsbSxwMSkgXAotICAgICAgIHsgXAotICAgICAgIGludCBudW1fdGFicz1sOyBcCi0gICAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSwiJXMibSBQTkdfU1RSSU5HX05FV0xJTkUsKG51bV90YWJzPT0xID8gIlx0IiA6IFwKLSAgICAgICAgIChudW1fdGFicz09MiA/ICJcdFx0IjoobnVtX3RhYnM+MiA/ICJcdFx0XHQiOiIiKSkpLHAxKTsgXAotICAgICAgIH0KLSMgICAgZW5kaWYKLSMgICAgaWZuZGVmIHBuZ19kZWJ1ZzIKLSMgICAgICBkZWZpbmUgcG5nX2RlYnVnMihsLG0scDEscDIpIFwKLSAgICAgICB7IFwKLSAgICAgICBpbnQgbnVtX3RhYnM9bDsgXAotICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsIiVzIm0gUE5HX1NUUklOR19ORVdMSU5FLChudW1fdGFicz09MSA/ICJcdCIgOiBcCi0gICAgICAgICAobnVtX3RhYnM9PTIgPyAiXHRcdCI6KG51bV90YWJzPjIgPyAiXHRcdFx0IjoiIikpKSxwMSxwMik7IFwKLSAgICAgICB9Ci0jICAgIGVuZGlmCi0jICBlbHNlIC8qIF9fU1REQyBfXyAqLwotIyAgICBpZm5kZWYgcG5nX2RlYnVnCi0jICAgICAgZGVmaW5lIHBuZ19kZWJ1ZyhsLG0pIFwKLSAgICAgICB7IFwKLSAgICAgICBpbnQgbnVtX3RhYnM9bDsgXAotICAgICAgIGNoYXIgZm9ybWF0WzI1Nl07IFwKLSAgICAgICBzbnByaW50Zihmb3JtYXQsMjU2LCIlcyVzJXMiLChudW1fdGFicz09MSA/ICJcdCIgOiBcCi0gICAgICAgICAobnVtX3RhYnM9PTIgPyAiXHRcdCI6KG51bV90YWJzPjIgPyAiXHRcdFx0IjoiIikpKSwgXAotICAgICAgICAgbSxQTkdfU1RSSU5HX05FV0xJTkUpOyBcCi0gICAgICAgZnByaW50ZihQTkdfREVCVUdfRklMRSxmb3JtYXQpOyBcCi0gICAgICAgfQotIyAgICBlbmRpZgotIyAgICBpZm5kZWYgcG5nX2RlYnVnMQotIyAgICAgIGRlZmluZSBwbmdfZGVidWcxKGwsbSxwMSkgXAotICAgICAgIHsgXAotICAgICAgIGludCBudW1fdGFicz1sOyBcCi0gICAgICAgY2hhciBmb3JtYXRbMjU2XTsgXAotICAgICAgIHNucHJpbnRmKGZvcm1hdCwyNTYsIiVzJXMlcyIsKG51bV90YWJzPT0xID8gIlx0IiA6IFwKLSAgICAgICAgIChudW1fdGFicz09MiA/ICJcdFx0IjoobnVtX3RhYnM+MiA/ICJcdFx0XHQiOiIiKSkpLCBcCi0gICAgICAgICBtLFBOR19TVFJJTkdfTkVXTElORSk7IFwKLSAgICAgICBmcHJpbnRmKFBOR19ERUJVR19GSUxFLGZvcm1hdCxwMSk7IFwKLSAgICAgICB9Ci0jICAgIGVuZGlmCi0jICAgIGlmbmRlZiBwbmdfZGVidWcyCi0jICAgICAgZGVmaW5lIHBuZ19kZWJ1ZzIobCxtLHAxLHAyKSBcCi0gICAgICAgeyBcCi0gICAgICAgaW50IG51bV90YWJzPWw7IFwKLSAgICAgICBjaGFyIGZvcm1hdFsyNTZdOyBcCi0gICAgICAgc25wcmludGYoZm9ybWF0LDI1NiwiJXMlcyVzIiwobnVtX3RhYnM9PTEgPyAiXHQiIDogXAotICAgICAgICAgKG51bV90YWJzPT0yID8gIlx0XHQiOihudW1fdGFicz4yID8gIlx0XHRcdCI6IiIpKSksIFwKLSAgICAgICAgIG0sUE5HX1NUUklOR19ORVdMSU5FKTsgXAotICAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsZm9ybWF0LHAxLHAyKTsgXAotICAgICAgIH0KLSMgICAgZW5kaWYKLSMgIGVuZGlmIC8qIF9fU1REQyBfXyAqLwotI2VuZGlmIC8qIChQTkdfREVCVUcgPiAxKSAqLwotCi0jZW5kaWYgLyogX01TQ19WRVIgKi8KLSNlbmRpZiAvKiAoUE5HX0RFQlVHID4gMCkgKi8KLSNlbmRpZiAvKiBQTkdfREVCVUcgKi8KLSNpZm5kZWYgcG5nX2RlYnVnCi0jZGVmaW5lIHBuZ19kZWJ1ZyhsLCBtKQotI2VuZGlmCi0jaWZuZGVmIHBuZ19kZWJ1ZzEKLSNkZWZpbmUgcG5nX2RlYnVnMShsLCBtLCBwMSkKLSNlbmRpZgotI2lmbmRlZiBwbmdfZGVidWcyCi0jZGVmaW5lIHBuZ19kZWJ1ZzIobCwgbSwgcDEsIHAyKQotI2VuZGlmCi0KLWV4dGVybiBQTkdfRVhQT1JUKHBuZ19jaGFycCxwbmdfZ2V0X2NvcHlyaWdodCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci1leHRlcm4gUE5HX0VYUE9SVChwbmdfY2hhcnAscG5nX2dldF9oZWFkZXJfdmVyKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLWV4dGVybiBQTkdfRVhQT1JUKHBuZ19jaGFycCxwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLWV4dGVybiBQTkdfRVhQT1JUKHBuZ19jaGFycCxwbmdfZ2V0X2xpYnBuZ192ZXIpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi0jaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKLWV4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfdWludF8zMiBtbmdfZmVhdHVyZXNfcGVybWl0dGVkKSk7Ci0jZW5kaWYKLQotLyogRm9yIHVzZSBpbiBwbmdfc2V0X2tlZXBfdW5rbm93biwgYWRkZWQgdG8gdmVyc2lvbiAxLjIuNiAqLwotI2RlZmluZSBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQgICAwCi0jZGVmaW5lIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgICAgICAgIDEKLSNkZWZpbmUgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICAgICAgMgotI2RlZmluZSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyAgICAgICAzCi0KLS8qIEFkZGVkIHRvIHZlcnNpb24gMS4yLjAgKi8KLSNpZiBkZWZpbmVkKFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQpCi0jaWYgZGVmaW5lZChQTkdfTU1YX0NPREVfU1VQUE9SVEVEKQotI2RlZmluZSBQTkdfQVNNX0ZMQUdfTU1YX1NVUFBPUlRfQ09NUElMRUQgIDB4MDEgIC8qIG5vdCB1c2VyLXNldHRhYmxlICovCi0jZGVmaW5lIFBOR19BU01fRkxBR19NTVhfU1VQUE9SVF9JTl9DUFUgICAgMHgwMiAgLyogbm90IHVzZXItc2V0dGFibGUgKi8KLSNkZWZpbmUgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0NPTUJJTkVfUk9XICAweDA0Ci0jZGVmaW5lIFBOR19BU01fRkxBR19NTVhfUkVBRF9JTlRFUkxBQ0UgICAgMHgwOAotI2RlZmluZSBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1NVQiAgIDB4MTAKLSNkZWZpbmUgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9VUCAgICAweDIwCi0jZGVmaW5lIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfQVZHICAgMHg0MAotI2RlZmluZSBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1BBRVRIIDB4ODAKLSNkZWZpbmUgUE5HX0FTTV9GTEFHU19JTklUSUFMSVpFRCAgICAgICAgICAweDgwMDAwMDAwICAvKiBub3QgdXNlci1zZXR0YWJsZSAqLwotCi0jZGVmaW5lIFBOR19NTVhfUkVBRF9GTEFHUyAoIFBOR19BU01fRkxBR19NTVhfUkVBRF9DT01CSU5FX1JPVyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfSU5URVJMQUNFICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9TVUIgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfVVAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX0FWRyAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9QQUVUSCApCi0jZGVmaW5lIFBOR19NTVhfV1JJVEVfRkxBR1MgKCAwICkKLQotI2RlZmluZSBQTkdfTU1YX0ZMQUdTICggUE5HX0FTTV9GTEFHX01NWF9TVVBQT1JUX0NPTVBJTEVEIFwKLSAgICAgICAgICAgICAgICAgICAgICB8IFBOR19BU01fRkxBR19NTVhfU1VQUE9SVF9JTl9DUFUgICBcCi0gICAgICAgICAgICAgICAgICAgICAgfCBQTkdfTU1YX1JFQURfRkxBR1MgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIHwgUE5HX01NWF9XUklURV9GTEFHUyApCi0KLSNkZWZpbmUgUE5HX1NFTEVDVF9SRUFEICAgMQotI2RlZmluZSBQTkdfU0VMRUNUX1dSSVRFICAyCi0jZW5kaWYgLyogUE5HX01NWF9DT0RFX1NVUFBPUlRFRCAqLwotCi0jaWYgIWRlZmluZWQoUE5HXzFfMF9YKQotLyogcG5nZ2V0LmMgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHBuZ191aW50XzMyLHBuZ19nZXRfbW14X2ZsYWdtYXNrKQotICAgUE5HQVJHKChpbnQgZmxhZ19zZWxlY3QsIGludCAqY29tcGlsZXJJRCkpOwotCi0vKiBwbmdnZXQuYyAqLwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9hc21fZmxhZ21hc2spCi0gICBQTkdBUkcoKGludCBmbGFnX3NlbGVjdCkpOwotCi0vKiBwbmdnZXQuYyAqLwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9hc21fZmxhZ3MpCi0gICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotLyogcG5nZ2V0LmMgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHBuZ19ieXRlLHBuZ19nZXRfbW14X2JpdGRlcHRoX3RocmVzaG9sZCkKLSAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi0vKiBwbmdnZXQuYyAqLwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF9tbXhfcm93Ynl0ZXNfdGhyZXNob2xkKQotICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLS8qIHBuZ3NldC5jICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zZXRfYXNtX2ZsYWdzKQotICAgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBhc21fZmxhZ3MpKTsKLQotLyogcG5nc2V0LmMgKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9tbXhfdGhyZXNob2xkcykKLSAgIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGUgbW14X2JpdGRlcHRoX3RocmVzaG9sZCwKLSAgIHBuZ191aW50XzMyIG1teF9yb3dieXRlc190aHJlc2hvbGQpKTsKLQotI2VuZGlmIC8qIFBOR18xXzBfWCAqLwotCi0jaWYgIWRlZmluZWQoUE5HXzFfMF9YKQotLyogcG5nLmMsIHBuZ2djY3JkLmMsIG9yIHBuZ3ZjcmQuYyAqLwotZXh0ZXJuIFBOR19FWFBPUlQoaW50LHBuZ19tbXhfc3VwcG9ydCkgUE5HQVJHKCh2b2lkKSk7Ci0jZW5kaWYgLyogUE5HXzFfMF9YICovCi0jZW5kaWYgLyogUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRCAqLwotCi0vKiBTdHJpcCB0aGUgcHJlcGVuZGVkIGVycm9yIG51bWJlcnMgKCIjbm5uICIpIGZyb20gZXJyb3IgYW5kIHdhcm5pbmcKLSAqIG1lc3NhZ2VzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGVycm9yIG9yIHdhcm5pbmcgaGFuZGxlci4gKi8KLSNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF9zdHJpcF9lcnJvcl9udW1iZXJzKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwCi0gICBwbmdfcHRyLCBwbmdfdWludF8zMiBzdHJpcF9tb2RlKSk7Ci0jZW5kaWYKLQotLyogQWRkZWQgYXQgbGlicG5nLTEuMi42ICovCi0jaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NldF91c2VyX2xpbWl0cykgUE5HQVJHKChwbmdfc3RydWN0cAotICAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgdXNlcl93aWR0aF9tYXgsIHBuZ191aW50XzMyIHVzZXJfaGVpZ2h0X21heCkpOwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF91c2VyX3dpZHRoX21heCkgUE5HQVJHKChwbmdfc3RydWN0cAotICAgcG5nX3B0cikpOwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF91c2VyX2hlaWdodF9tYXgpIFBOR0FSRygocG5nX3N0cnVjdHAKLSAgIHBuZ19wdHIpKTsKLSNlbmRpZgotCi0KLS8qIE1haW50YWluZXI6IFB1dCBuZXcgcHVibGljIHByb3RvdHlwZXMgaGVyZSBeLCBpbiBsaWJwbmcuMywgYW5kIHByb2plY3QgZGVmcyAqLwotCi0jaWZkZWYgUE5HX1JFQURfQ09NUE9TSVRFX05PRElWX1NVUFBPUlRFRAotLyogV2l0aCB0aGVzZSByb3V0aW5lcyB3ZSBhdm9pZCBhbiBpbnRlZ2VyIGRpdmlkZSwgd2hpY2ggd2lsbCBiZSBzbG93ZXIgb24KLSAqIG1vc3QgbWFjaGluZXMuICBIb3dldmVyLCBpdCBkb2VzIHRha2UgbW9yZSBvcGVyYXRpb25zIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcKLSAqIGRpdmlkZSBtZXRob2QsIHNvIGl0IG1heSBiZSBzbG93ZXIgb24gYSBmZXcgUklTQyBzeXN0ZW1zLiAgVGhlcmUgYXJlIHR3bwotICogc2hpZnRzIChieSA4IG9yIDE2IGJpdHMpIGFuZCBhbiBhZGRpdGlvbiwgdmVyc3VzIGEgc2luZ2xlIGludGVnZXIgZGl2aWRlLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgcm91bmRpbmcgZmFjdG9ycyBhcmUgTk9UIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lISAgMTI4IGFuZAotICogMzI3NjggYXJlIGNvcnJlY3QgZm9yIHRoZSBOT0RJViBjb2RlOyAxMjcgYW5kIDMyNzY3IGFyZSBjb3JyZWN0IGZvciB0aGUKLSAqIHN0YW5kYXJkIG1ldGhvZC4KLSAqCi0gKiBbT3B0aW1pemVkIGNvZGUgYnkgR3JlZyBSb2Vsb2ZzIGFuZCBNYXJrIEFkbGVyLi4uYmxhbWUgdXMgZm9yIGJ1Z3MuIDotKSBdCi0gKi8KLQotIC8qIGZnIGFuZCBiZyBzaG91bGQgYmUgaW4gYGdhbW1hIDEuMCcgc3BhY2U7IGFscGhhIGlzIHRoZSBvcGFjaXR5ICAgICAgICAgICovCi0KLSMgIGRlZmluZSBwbmdfY29tcG9zaXRlKGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7IHBuZ191aW50XzE2IHRlbXAgPSAocG5nX3VpbnRfMTYpKChwbmdfdWludF8xNikoZmcpICogKHBuZ191aW50XzE2KShhbHBoYSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgKyAgICAgICAgKHBuZ191aW50XzE2KShiZykqKHBuZ191aW50XzE2KSgyNTUgLSAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMTYpKGFscGhhKSkgKyAocG5nX3VpbnRfMTYpMTI4KTsgICAgICAgICAgIFwKLSAgICAgICAoY29tcG9zaXRlKSA9IChwbmdfYnl0ZSkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7IH0KLQotIyAgZGVmaW5lIHBuZ19jb21wb3NpdGVfMTYoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIHsgcG5nX3VpbnRfMzIgdGVtcCA9IChwbmdfdWludF8zMikoKHBuZ191aW50XzMyKShmZykgKiAocG5nX3VpbnRfMzIpKGFscGhhKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICArIChwbmdfdWludF8zMikoYmcpKihwbmdfdWludF8zMikoNjU1MzVMIC0gICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfdWludF8zMikoYWxwaGEpKSArIChwbmdfdWludF8zMikzMjc2OEwpOyAgICAgICAgXAotICAgICAgIChjb21wb3NpdGUpID0gKHBuZ191aW50XzE2KSgodGVtcCArICh0ZW1wID4+IDE2KSkgPj4gMTYpOyB9Ci0KLSNlbHNlICAvKiBzdGFuZGFyZCBtZXRob2QgdXNpbmcgaW50ZWdlciBkaXZpc2lvbiAqLwotCi0jICBkZWZpbmUgcG5nX2NvbXBvc2l0ZShjb21wb3NpdGUsIGZnLCBhbHBoYSwgYmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgKGNvbXBvc2l0ZSkgPSAocG5nX2J5dGUpKCgocG5nX3VpbnRfMTYpKGZnKSAqIChwbmdfdWludF8xNikoYWxwaGEpICsgICAgXAotICAgICAgIChwbmdfdWludF8xNikoYmcpICogKHBuZ191aW50XzE2KSgyNTUgLSAocG5nX3VpbnRfMTYpKGFscGhhKSkgKyAgICAgICBcCi0gICAgICAgKHBuZ191aW50XzE2KTEyNykgLyAyNTUpCi0KLSMgIGRlZmluZSBwbmdfY29tcG9zaXRlXzE2KGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAoY29tcG9zaXRlKSA9IChwbmdfdWludF8xNikoKChwbmdfdWludF8zMikoZmcpICogKHBuZ191aW50XzMyKShhbHBoYSkgKyBcCi0gICAgICAgKHBuZ191aW50XzMyKShiZykqKHBuZ191aW50XzMyKSg2NTUzNUwgLSAocG5nX3VpbnRfMzIpKGFscGhhKSkgKyAgICAgIFwKLSAgICAgICAocG5nX3VpbnRfMzIpMzI3NjcpIC8gKHBuZ191aW50XzMyKTY1NTM1TCkKLQotI2VuZGlmIC8qIFBOR19SRUFEX0NPTVBPU0lURV9OT0RJVl9TVVBQT1JURUQgKi8KLQotLyogSW5saW5lIG1hY3JvcyB0byBkbyBkaXJlY3QgcmVhZHMgb2YgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLiAgVGhlc2UKLSAqIHJlcXVpcmUgdGhhdCB5b3UgYXJlIHVzaW5nIGFuIGFyY2hpdGVjdHVyZSB0aGF0IHVzZXMgUE5HIGJ5dGUgb3JkZXJpbmcKLSAqIChNU0IgZmlyc3QpIGFuZCBzdXBwb3J0cyB1bmFsaWduZWQgZGF0YSBzdG9yYWdlLiAgSSB0aGluayB0aGF0IFBvd2VyUEMKLSAqIGluIGJpZy1lbmRpYW4gbW9kZSBhbmQgNjgweDAgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCB3aWxsIHN1cHBvcnQgdGhpcy4KLSAqIFRoZSB4ODYgbGluZSBvZiBwcm9jZXNzb3JzIGRlZmluaXRlbHkgZG8gbm90LiAgVGhlIHBuZ19nZXRfaW50XzMyKCkKLSAqIHJvdXRpbmUgYWxzbyBhc3N1bWVzIHdlIGFyZSB1c2luZyB0d28ncyBjb21wbGVtZW50IGZvcm1hdCBmb3IgbmVnYXRpdmUKLSAqIHZhbHVlcywgd2hpY2ggaXMgYWxtb3N0IGNlcnRhaW5seSB0cnVlLgotICovCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9CSUdfRU5ESUFOX1NVUFBPUlRFRCkKLSMgIGRlZmluZSBwbmdfZ2V0X3VpbnRfMzIoYnVmKSAoICooKHBuZ191aW50XzMycCkgKGJ1ZikpKQotIyAgZGVmaW5lIHBuZ19nZXRfdWludF8xNihidWYpICggKigocG5nX3VpbnRfMTZwKSAoYnVmKSkpCi0jICBkZWZpbmUgcG5nX2dldF9pbnRfMzIoYnVmKSAgKCAqKChwbmdfaW50XzMycCkgIChidWYpKSkKLSNlbHNlCi1leHRlcm4gUE5HX0VYUE9SVChwbmdfdWludF8zMixwbmdfZ2V0X3VpbnRfMzIpIFBOR0FSRygocG5nX2J5dGVwIGJ1ZikpOwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMTYscG5nX2dldF91aW50XzE2KSBQTkdBUkcoKHBuZ19ieXRlcCBidWYpKTsKLWV4dGVybiBQTkdfRVhQT1JUKHBuZ19pbnRfMzIscG5nX2dldF9pbnRfMzIpIFBOR0FSRygocG5nX2J5dGVwIGJ1ZikpOwotI2VuZGlmIC8qICFQTkdfUkVBRF9CSUdfRU5ESUFOX1NVUFBPUlRFRCAqLwotZXh0ZXJuIFBOR19FWFBPUlQocG5nX3VpbnRfMzIscG5nX2dldF91aW50XzMxKQotICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBidWYpKTsKLS8qIE5vIHBuZ19nZXRfaW50XzE2IC0tIG1heSBiZSBhZGRlZCBpZiB0aGVyZSdzIGEgcmVhbCBuZWVkIGZvciBpdC4gKi8KLQotLyogUGxhY2UgYSAzMi1iaXQgbnVtYmVyIGludG8gYSBidWZmZXIgaW4gUE5HIGJ5dGUgb3JkZXIgKGJpZy1lbmRpYW4pLgotICovCi1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ19zYXZlX3VpbnRfMzIpCi0gICBQTkdBUkcoKHBuZ19ieXRlcCBidWYsIHBuZ191aW50XzMyIGkpKTsKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NhdmVfaW50XzMyKQotICAgUE5HQVJHKChwbmdfYnl0ZXAgYnVmLCBwbmdfaW50XzMyIGkpKTsKLQotLyogUGxhY2UgYSAxNi1iaXQgbnVtYmVyIGludG8gYSBidWZmZXIgaW4gUE5HIGJ5dGUgb3JkZXIuCi0gKiBUaGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIHVuc2lnbmVkIGludCwgbm90IHBuZ191aW50XzE2LAotICoganVzdCB0byBhdm9pZCBwb3RlbnRpYWwgcHJvYmxlbXMgb24gcHJlLUFOU0kgQyBjb21waWxlcnMuCi0gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3NhdmVfdWludF8xNikKLSAgIFBOR0FSRygocG5nX2J5dGVwIGJ1ZiwgdW5zaWduZWQgaW50IGkpKTsKLS8qIE5vIHBuZ19zYXZlX2ludF8xNiAtLSBtYXkgYmUgYWRkZWQgaWYgdGhlcmUncyBhIHJlYWwgbmVlZCBmb3IgaXQuICovCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogVGhlc2UgbmV4dCBmdW5jdGlvbnMgYXJlIHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgY29kZS4gIFRoZXkgZ2VuZXJhbGx5Ci0gKiBzaG91bGRuJ3QgYmUgdXNlZCB1bmxlc3MgeW91IGFyZSB3cml0aW5nIGNvZGUgdG8gYWRkIG9yIHJlcGxhY2Ugc29tZQotICogZnVuY3Rpb25hbGl0eSBpbiBsaWJwbmcuICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IG1vc3QgZnVuY3Rpb25zIGNhbgotICogYmUgZm91bmQgaW4gdGhlIGZpbGVzIHdoZXJlIHRoZSBmdW5jdGlvbnMgYXJlIGxvY2F0ZWQuCi0gKi8KLQotCi0vKiBWYXJpb3VzIG1vZGVzIG9mIG9wZXJhdGlvbiwgdGhhdCBhcmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgYmVjYXVzZQotICogdGhleSBhcmUgdXNlZCBmb3IgdW5rbm93biBjaHVuayBsb2NhdGlvbi4KLSAqLwotI2RlZmluZSBQTkdfSEFWRV9JSERSICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBQTkdfSEFWRV9QTFRFICAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBQTkdfSEFWRV9JREFUICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBQTkdfQUZURVJfSURBVCAgICAgICAgICAgICAgMHgwOCAvKiBIYXZlIGNvbXBsZXRlIHpsaWIgZGF0YXN0cmVhbSAqLwotI2RlZmluZSBQTkdfSEFWRV9JRU5EICAgICAgICAgICAgICAgMHgxMAotCi0jaWYgZGVmaW5lZChQTkdfSU5URVJOQUwpCi0KLS8qIE1vcmUgbW9kZXMgb2Ygb3BlcmF0aW9uLiAgTm90ZSB0aGF0IGFmdGVyIGFuIGluaXQsIG1vZGUgaXMgc2V0IHRvCi0gKiB6ZXJvIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgc3RydWN0dXJlIGlzIGNyZWF0ZWQuCi0gKi8KLSNkZWZpbmUgUE5HX0hBVkVfZ0FNQSAgICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgUE5HX0hBVkVfY0hSTSAgICAgICAgICAgICAgIDB4NDAKLSNkZWZpbmUgUE5HX0hBVkVfc1JHQiAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgUE5HX0hBVkVfQ0hVTktfSEVBREVSICAgICAgMHgxMDAKLSNkZWZpbmUgUE5HX1dST1RFX3RJTUUgICAgICAgICAgICAgMHgyMDAKLSNkZWZpbmUgUE5HX1dST1RFX0lORk9fQkVGT1JFX1BMVEUgMHg0MDAKLSNkZWZpbmUgUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWSAgICAgMHg4MDAKLSNkZWZpbmUgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSAgICAweDEwMDAKLSNkZWZpbmUgUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVCAweDIwMDAgLyogSGF2ZSBhbm90aGVyIGNodW5rIGFmdGVyIElEQVQgKi8KLQotLyogZmxhZ3MgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbnMgdGhlIFBORyBsaWJyYXJ5IGRvZXMgb24gdGhlIGltYWdlIGRhdGEgKi8KLSNkZWZpbmUgUE5HX0JHUiAgICAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgUE5HX0lOVEVSTEFDRSAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgUE5HX1BBQ0sgICAgICAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgUE5HX1NISUZUICAgICAgICAgICAgICAweDAwMDgKLSNkZWZpbmUgUE5HX1NXQVBfQllURVMgICAgICAgICAweDAwMTAKLSNkZWZpbmUgUE5HX0lOVkVSVF9NT05PICAgICAgICAweDAwMjAKLSNkZWZpbmUgUE5HX0RJVEhFUiAgICAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgUE5HX0JBQ0tHUk9VTkQgICAgICAgICAweDAwODAKLSNkZWZpbmUgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EICAweDAxMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAweDAyMDAgdW51c2VkICovCi0jZGVmaW5lIFBOR18xNl9UT184ICAgICAgICAgICAgMHgwNDAwCi0jZGVmaW5lIFBOR19SR0JBICAgICAgICAgICAgICAgMHgwODAwCi0jZGVmaW5lIFBOR19FWFBBTkQgICAgICAgICAgICAgMHgxMDAwCi0jZGVmaW5lIFBOR19HQU1NQSAgICAgICAgICAgICAgMHgyMDAwCi0jZGVmaW5lIFBOR19HUkFZX1RPX1JHQiAgICAgICAgMHg0MDAwCi0jZGVmaW5lIFBOR19GSUxMRVIgICAgICAgICAgICAgMHg4MDAwTAotI2RlZmluZSBQTkdfUEFDS1NXQVAgICAgICAgICAgMHgxMDAwMEwKLSNkZWZpbmUgUE5HX1NXQVBfQUxQSEEgICAgICAgIDB4MjAwMDBMCi0jZGVmaW5lIFBOR19TVFJJUF9BTFBIQSAgICAgICAweDQwMDAwTAotI2RlZmluZSBQTkdfSU5WRVJUX0FMUEhBICAgICAgMHg4MDAwMEwKLSNkZWZpbmUgUE5HX1VTRVJfVFJBTlNGT1JNICAgMHgxMDAwMDBMCi0jZGVmaW5lIFBOR19SR0JfVE9fR1JBWV9FUlIgIDB4MjAwMDAwTAotI2RlZmluZSBQTkdfUkdCX1RPX0dSQVlfV0FSTiAweDQwMDAwMEwKLSNkZWZpbmUgUE5HX1JHQl9UT19HUkFZICAgICAgMHg2MDAwMDBMICAvKiB0d28gYml0cywgUkdCX1RPX0dSQVlfRVJSfFdBUk4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMHg4MDAwMDBMICAgICBVbnVzZWQgKi8KLSNkZWZpbmUgUE5HX0FERF9BTFBIQSAgICAgICAweDEwMDAwMDBMICAvKiBBZGRlZCB0byBsaWJwbmctMS4yLjcgKi8KLSNkZWZpbmUgUE5HX0VYUEFORF90Uk5TICAgICAweDIwMDAwMDBMICAvKiBBZGRlZCB0byBsaWJwbmctMS4yLjkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgLyogICAweDQwMDAwMDBMICB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgLyogICAweDgwMDAwMDBMICB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4MTAwMDAwMDBMICB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4MjAwMDAwMDBMICB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4NDAwMDAwMDBMICB1bnVzZWQgKi8KLQotLyogZmxhZ3MgZm9yIHBuZ19jcmVhdGVfc3RydWN0ICovCi0jZGVmaW5lIFBOR19TVFJVQ1RfUE5HICAgMHgwMDAxCi0jZGVmaW5lIFBOR19TVFJVQ1RfSU5GTyAgMHgwMDAyCi0KLS8qIFNjYWxpbmcgZmFjdG9yIGZvciBmaWx0ZXIgaGV1cmlzdGljIHdlaWdodGluZyBjYWxjdWxhdGlvbnMgKi8KLSNkZWZpbmUgUE5HX1dFSUdIVF9TSElGVCA4Ci0jZGVmaW5lIFBOR19XRUlHSFRfRkFDVE9SICgxPDwoUE5HX1dFSUdIVF9TSElGVCkpCi0jZGVmaW5lIFBOR19DT1NUX1NISUZUIDMKLSNkZWZpbmUgUE5HX0NPU1RfRkFDVE9SICgxPDwoUE5HX0NPU1RfU0hJRlQpKQotCi0vKiBmbGFncyBmb3IgdGhlIHBuZ19wdHItPmZsYWdzIHJhdGhlciB0aGFuIGRlY2xhcmluZyBhIGJ5dGUgZm9yIGVhY2ggb25lICovCi0jZGVmaW5lIFBOR19GTEFHX1pMSUJfQ1VTVE9NX1NUUkFURUdZICAgICAweDAwMDEKLSNkZWZpbmUgUE5HX0ZMQUdfWkxJQl9DVVNUT01fTEVWRUwgICAgICAgIDB4MDAwMgotI2RlZmluZSBQTkdfRkxBR19aTElCX0NVU1RPTV9NRU1fTEVWRUwgICAgMHgwMDA0Ci0jZGVmaW5lIFBOR19GTEFHX1pMSUJfQ1VTVE9NX1dJTkRPV19CSVRTICAweDAwMDgKLSNkZWZpbmUgUE5HX0ZMQUdfWkxJQl9DVVNUT01fTUVUSE9EICAgICAgIDB4MDAxMAotI2RlZmluZSBQTkdfRkxBR19aTElCX0ZJTklTSEVEICAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIFBOR19GTEFHX1JPV19JTklUICAgICAgICAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgUE5HX0ZMQUdfRklMTEVSX0FGVEVSICAgICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSAgICAgICAgMHgwMTAwCi0jZGVmaW5lIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOICAgICAweDAyMDAKLSNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX1VTRSAgICAgICAgIDB4MDQwMAotI2RlZmluZSBQTkdfRkxBR19DUkNfQ1JJVElDQUxfSUdOT1JFICAgICAgMHgwODAwCi0jZGVmaW5lIFBOR19GTEFHX0ZSRUVfUExURSAgICAgICAgICAgICAgICAweDEwMDAKLSNkZWZpbmUgUE5HX0ZMQUdfRlJFRV9UUk5TICAgICAgICAgICAgICAgIDB4MjAwMAotI2RlZmluZSBQTkdfRkxBR19GUkVFX0hJU1QgICAgICAgICAgICAgICAgMHg0MDAwCi0jZGVmaW5lIFBOR19GTEFHX0tFRVBfVU5LTk9XTl9DSFVOS1MgICAgICAweDgwMDBMCi0jZGVmaW5lIFBOR19GTEFHX0tFRVBfVU5TQUZFX0NIVU5LUyAgICAgICAweDEwMDAwTAotI2RlZmluZSBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIICAgICAgICAgMHgyMDAwMEwKLSNkZWZpbmUgUE5HX0ZMQUdfU1RSSVBfRVJST1JfTlVNQkVSUyAgICAgIDB4NDAwMDBMCi0jZGVmaW5lIFBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQgICAgICAgICAweDgwMDAwTAotI2RlZmluZSBQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0sgICAgICAgMHgxMDAwMDBMCi0jZGVmaW5lIFBOR19GTEFHX0FERF9BTFBIQSAgICAgICAgICAgICAgICAweDIwMDAwMEwgIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuOCAqLwotI2RlZmluZSBQTkdfRkxBR19TVFJJUF9BTFBIQSAgICAgICAgICAgICAgMHg0MDAwMDBMICAvKiBBZGRlZCB0byBsaWJwbmctMS4yLjggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIDB4ODAwMDAwTCAgdW51c2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgIDB4MTAwMDAwMEwgIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAweDIwMDAwMDBMICB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgMHg0MDAwMDAwTCAgdW51c2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgIDB4ODAwMDAwMEwgIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDB4MTAwMDAwMDBMICB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAweDIwMDAwMDAwTCAgdW51c2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMHg0MDAwMDAwMEwgIHVudXNlZCAqLwotCi0jZGVmaW5lIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSyAoUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk4pCi0KLSNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX01BU0sgIChQTkdfRkxBR19DUkNfQ1JJVElDQUxfVVNFIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0NSQ19DUklUSUNBTF9JR05PUkUpCi0KLSNkZWZpbmUgUE5HX0ZMQUdfQ1JDX01BU0sgICAgICAgICAgIChQTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0sgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX01BU0spCi0KLS8qIHNhdmUgdHlwaW5nIGFuZCBtYWtlIGNvZGUgZWFzaWVyIHRvIHVuZGVyc3RhbmQgKi8KLQotI2RlZmluZSBQTkdfQ09MT1JfRElTVChjMSwgYzIpIChhYnMoKGludCkoKGMxKS5yZWQpIC0gKGludCkoKGMyKS5yZWQpKSArIFwKLSAgIGFicygoaW50KSgoYzEpLmdyZWVuKSAtIChpbnQpKChjMikuZ3JlZW4pKSArIFwKLSAgIGFicygoaW50KSgoYzEpLmJsdWUpIC0gKGludCkoKGMyKS5ibHVlKSkpCi0KLS8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuNiBKQiAqLwotI2RlZmluZSBQTkdfUk9XQllURVMocGl4ZWxfYml0cywgd2lkdGgpIFwKLSAgICAoKHBpeGVsX2JpdHMpID49IDggPyBcCi0gICAgKCh3aWR0aCkgKiAoKChwbmdfdWludF8zMikocGl4ZWxfYml0cykpID4+IDMpKSA6IFwKLSAgICAoKCAoKHdpZHRoKSAqICgocG5nX3VpbnRfMzIpKHBpeGVsX2JpdHMpKSkgKyA3KSA+PiAzKSApCi0KLS8qIFBOR19PVVRfT0ZfUkFOR0UgcmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIG91dHNpZGUgdGhlIHJhbmdlCi0gICBpZGVhbC1kZWx0YS4uaWRlYWwrZGVsdGEuICBFYWNoIGFyZ3VtZW50IGlzIGV2YWx1YXRlZCB0d2ljZS4KLSAgICJpZGVhbCIgYW5kICJkZWx0YSIgc2hvdWxkIGJlIGNvbnN0YW50cywgbm9ybWFsbHkgc2ltcGxlCi0gICBpbnRlZ2VycywgInZhbHVlIiBhIHZhcmlhYmxlLiBBZGRlZCB0byBsaWJwbmctMS4yLjYgSkIgKi8KLSNkZWZpbmUgUE5HX09VVF9PRl9SQU5HRSh2YWx1ZSwgaWRlYWwsIGRlbHRhKSBcCi0gICAgICAgICggKHZhbHVlKSA8IChpZGVhbCktKGRlbHRhKSB8fCAodmFsdWUpID4gKGlkZWFsKSsoZGVsdGEpICkKLQotLyogdmFyaWFibGVzIGRlY2xhcmVkIGluIHBuZy5jIC0gb25seSBpdCBuZWVkcyB0byBkZWZpbmUgUE5HX05PX0VYVEVSTiAqLwotI2lmICFkZWZpbmVkKFBOR19OT19FWFRFUk4pIHx8IGRlZmluZWQoUE5HX0FMV0FZU19FWFRFUk4pCi0vKiBwbGFjZSB0byBob2xkIHRoZSBzaWduYXR1cmUgc3RyaW5nIGZvciBhIFBORyBmaWxlLiAqLwotI2lmZGVmIFBOR19VU0VfR0xPQkFMX0FSUkFZUwotICAgUE5HX0VYUE9SVF9WQVIgKFBOR19DT05TVCBwbmdfYnl0ZSBGQVJEQVRBKSBwbmdfc2lnWzhdOwotI2Vsc2UKLSNlbmRpZgotI2VuZGlmIC8qIFBOR19OT19FWFRFUk4gKi8KLQotLyogQ29uc3RhbnQgc3RyaW5ncyBmb3Iga25vd24gY2h1bmsgdHlwZXMuICBJZiB5b3UgbmVlZCB0byBhZGQgYSBjaHVuaywKLSAqIGRlZmluZSB0aGUgbmFtZSBoZXJlLCBhbmQgYWRkIGFuIGludm9jYXRpb24gb2YgdGhlIG1hY3JvIGluIHBuZy5jIGFuZAotICogd2hlcmV2ZXIgaXQncyBuZWVkZWQuCi0gKi8KLSNkZWZpbmUgUE5HX0lIRFIgcG5nX2J5dGUgcG5nX0lIRFJbNV0gPSB7IDczLCAgNzIsICA2OCwgIDgyLCAnXDAnfQotI2RlZmluZSBQTkdfSURBVCBwbmdfYnl0ZSBwbmdfSURBVFs1XSA9IHsgNzMsICA2OCwgIDY1LCAgODQsICdcMCd9Ci0jZGVmaW5lIFBOR19JRU5EIHBuZ19ieXRlIHBuZ19JRU5EWzVdID0geyA3MywgIDY5LCAgNzgsICA2OCwgJ1wwJ30KLSNkZWZpbmUgUE5HX1BMVEUgcG5nX2J5dGUgcG5nX1BMVEVbNV0gPSB7IDgwLCAgNzYsICA4NCwgIDY5LCAnXDAnfQotI2RlZmluZSBQTkdfYktHRCBwbmdfYnl0ZSBwbmdfYktHRFs1XSA9IHsgOTgsICA3NSwgIDcxLCAgNjgsICdcMCd9Ci0jZGVmaW5lIFBOR19jSFJNIHBuZ19ieXRlIHBuZ19jSFJNWzVdID0geyA5OSwgIDcyLCAgODIsICA3NywgJ1wwJ30KLSNkZWZpbmUgUE5HX2dBTUEgcG5nX2J5dGUgcG5nX2dBTUFbNV0gPSB7MTAzLCAgNjUsICA3NywgIDY1LCAnXDAnfQotI2RlZmluZSBQTkdfaElTVCBwbmdfYnl0ZSBwbmdfaElTVFs1XSA9IHsxMDQsICA3MywgIDgzLCAgODQsICdcMCd9Ci0jZGVmaW5lIFBOR19pQ0NQIHBuZ19ieXRlIHBuZ19pQ0NQWzVdID0gezEwNSwgIDY3LCAgNjcsICA4MCwgJ1wwJ30KLSNkZWZpbmUgUE5HX2lUWHQgcG5nX2J5dGUgcG5nX2lUWHRbNV0gPSB7MTA1LCAgODQsICA4OCwgMTE2LCAnXDAnfQotI2RlZmluZSBQTkdfb0ZGcyBwbmdfYnl0ZSBwbmdfb0ZGc1s1XSA9IHsxMTEsICA3MCwgIDcwLCAxMTUsICdcMCd9Ci0jZGVmaW5lIFBOR19wQ0FMIHBuZ19ieXRlIHBuZ19wQ0FMWzVdID0gezExMiwgIDY3LCAgNjUsICA3NiwgJ1wwJ30KLSNkZWZpbmUgUE5HX3NDQUwgcG5nX2J5dGUgcG5nX3NDQUxbNV0gPSB7MTE1LCAgNjcsICA2NSwgIDc2LCAnXDAnfQotI2RlZmluZSBQTkdfcEhZcyBwbmdfYnl0ZSBwbmdfcEhZc1s1XSA9IHsxMTIsICA3MiwgIDg5LCAxMTUsICdcMCd9Ci0jZGVmaW5lIFBOR19zQklUIHBuZ19ieXRlIHBuZ19zQklUWzVdID0gezExNSwgIDY2LCAgNzMsICA4NCwgJ1wwJ30KLSNkZWZpbmUgUE5HX3NQTFQgcG5nX2J5dGUgcG5nX3NQTFRbNV0gPSB7MTE1LCAgODAsICA3NiwgIDg0LCAnXDAnfQotI2RlZmluZSBQTkdfc1JHQiBwbmdfYnl0ZSBwbmdfc1JHQls1XSA9IHsxMTUsICA4MiwgIDcxLCAgNjYsICdcMCd9Ci0jZGVmaW5lIFBOR190RVh0IHBuZ19ieXRlIHBuZ190RVh0WzVdID0gezExNiwgIDY5LCAgODgsIDExNiwgJ1wwJ30KLSNkZWZpbmUgUE5HX3RJTUUgcG5nX2J5dGUgcG5nX3RJTUVbNV0gPSB7MTE2LCAgNzMsICA3NywgIDY5LCAnXDAnfQotI2RlZmluZSBQTkdfdFJOUyBwbmdfYnl0ZSBwbmdfdFJOU1s1XSA9IHsxMTYsICA4MiwgIDc4LCAgODMsICdcMCd9Ci0jZGVmaW5lIFBOR196VFh0IHBuZ19ieXRlIHBuZ196VFh0WzVdID0gezEyMiwgIDg0LCAgODgsIDExNiwgJ1wwJ30KLQotI2lmZGVmIFBOR19VU0VfR0xPQkFMX0FSUkFZUwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19JSERSWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19JREFUWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19JRU5EWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19QTFRFWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19iS0dEWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19jSFJNWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19nQU1BWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19oSVNUWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19pQ0NQWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19pVFh0WzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19vRkZzWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19wQ0FMWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19zQ0FMWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19wSFlzWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19zQklUWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19zUExUWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ19zUkdCWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ190RVh0WzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ190SU1FWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ190Uk5TWzVdOwotUE5HX0VYUE9SVF9WQVIgKHBuZ19ieXRlIEZBUkRBVEEpIHBuZ196VFh0WzVdOwotI2VuZGlmIC8qIFBOR19VU0VfR0xPQkFMX0FSUkFZUyAqLwotCi0jaWYgZGVmaW5lZChQTkdfMV8wX1gpIHx8IGRlZmluZWQgKFBOR18xXzJfWCkKLS8qIEluaXRpYWxpemUgcG5nX3B0ciBzdHJ1Y3QgZm9yIHJlYWRpbmcsIGFuZCBhbGxvY2F0ZSBhbnkgb3RoZXIgbWVtb3J5LgotICogKG9sZCBpbnRlcmZhY2UgLSBERVBSRUNBVEVEIC0gdXNlIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QgaW5zdGVhZCkuCi0gKi8KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3JlYWRfaW5pdCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jdW5kZWYgcG5nX3JlYWRfaW5pdAotI2RlZmluZSBwbmdfcmVhZF9pbml0KHBuZ19wdHIpIHBuZ19yZWFkX2luaXRfMygmcG5nX3B0ciwgXAotICAgIFBOR19MSUJQTkdfVkVSX1NUUklORywgIHBuZ19zaXplb2YocG5nX3N0cnVjdCkpOwotI2VuZGlmCi0KLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3JlYWRfaW5pdF8zKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwcCBwdHJfcHRyLAotICAgIHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ19zaXplX3QgcG5nX3N0cnVjdF9zaXplKSk7Ci0jaWYgZGVmaW5lZChQTkdfMV8wX1gpIHx8IGRlZmluZWQgKFBOR18xXzJfWCkKLWV4dGVybiBQTkdfRVhQT1JUKHZvaWQscG5nX3JlYWRfaW5pdF8yKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgcG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3NpemVfdCBwbmdfc3RydWN0X3NpemUsIHBuZ19zaXplX3QKLSAgICBwbmdfaW5mb19zaXplKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkIChQTkdfMV8yX1gpCi0vKiBJbml0aWFsaXplIHBuZ19wdHIgc3RydWN0IGZvciB3cml0aW5nLCBhbmQgYWxsb2NhdGUgYW55IG90aGVyIG1lbW9yeS4KLSAqIChvbGQgaW50ZXJmYWNlIC0gREVQUkVDQVRFRCAtIHVzZSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCBpbnN0ZWFkKS4KLSAqLwotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfd3JpdGVfaW5pdCkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jdW5kZWYgcG5nX3dyaXRlX2luaXQKLSNkZWZpbmUgcG5nX3dyaXRlX2luaXQocG5nX3B0cikgcG5nX3dyaXRlX2luaXRfMygmcG5nX3B0ciwgXAotICAgIFBOR19MSUJQTkdfVkVSX1NUUklORywgcG5nX3NpemVvZihwbmdfc3RydWN0KSk7Ci0jZW5kaWYKLQotZXh0ZXJuIFBOR19FWFBPUlQodm9pZCxwbmdfd3JpdGVfaW5pdF8zKSBQTkdBUkcoKHBuZ19zdHJ1Y3RwcCBwdHJfcHRyLAotICAgIHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ19zaXplX3QgcG5nX3N0cnVjdF9zaXplKSk7Ci1leHRlcm4gUE5HX0VYUE9SVCh2b2lkLHBuZ193cml0ZV9pbml0XzIpIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICBwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfc2l6ZV90IHBuZ19zdHJ1Y3Rfc2l6ZSwgcG5nX3NpemVfdAotICAgIHBuZ19pbmZvX3NpemUpKTsKLQotLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbiBpbnRlcm5hbCBsaWJwbmcgc3RydWN0ICovCi1QTkdfRVhURVJOIHBuZ192b2lkcCBwbmdfY3JlYXRlX3N0cnVjdCBQTkdBUkcoKGludCB0eXBlKSk7Ci0KLS8qIEZyZWUgbWVtb3J5IGZyb20gaW50ZXJuYWwgbGlicG5nIHN0cnVjdCAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19kZXN0cm95X3N0cnVjdCBQTkdBUkcoKHBuZ192b2lkcCBzdHJ1Y3RfcHRyKSk7Ci0KLVBOR19FWFRFUk4gcG5nX3ZvaWRwIHBuZ19jcmVhdGVfc3RydWN0XzIgUE5HQVJHKChpbnQgdHlwZSwgcG5nX21hbGxvY19wdHIKLSAgbWFsbG9jX2ZuLCBwbmdfdm9pZHAgbWVtX3B0cikpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19kZXN0cm95X3N0cnVjdF8yIFBOR0FSRygocG5nX3ZvaWRwIHN0cnVjdF9wdHIsCi0gICBwbmdfZnJlZV9wdHIgZnJlZV9mbiwgcG5nX3ZvaWRwIG1lbV9wdHIpKTsKLQotLyogRnJlZSBhbnkgbWVtb3J5IHRoYXQgaW5mb19wdHIgcG9pbnRzIHRvIGFuZCByZXNldCBzdHJ1Y3QuICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX2luZm9fZGVzdHJveSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLQotI2lmbmRlZiBQTkdfMV8wX1gKLS8qIEZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgemxpYi4gKi8KLVBOR19FWFRFUk4gdm9pZHBmIHBuZ196YWxsb2MgUE5HQVJHKCh2b2lkcGYgcG5nX3B0ciwgdUludCBpdGVtcywgdUludCBzaXplKSk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGZyZWUgbWVtb3J5IGZvciB6bGliICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3pmcmVlIFBOR0FSRygodm9pZHBmIHBuZ19wdHIsIHZvaWRwZiBwdHIpKTsKLQotI2lmZGVmIFBOR19TSVpFX1QKLS8qIEZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBzaXplb2YgYW4gaXRlbSB0byBwbmdfc2l6ZW9mIGl0ZW0gKi8KLSAgIFBOR19FWFRFUk4gcG5nX3NpemVfdCBQTkdBUEkgcG5nX2NvbnZlcnRfc2l6ZSBQTkdBUkcoKHNpemVfdCBzaXplKSk7Ci0jZW5kaWYKLQotLyogTmV4dCBmb3VyIGZ1bmN0aW9ucyBhcmUgdXNlZCBpbnRlcm5hbGx5IGFzIGNhbGxiYWNrcy4gIFBOR0FQSSBpcyByZXF1aXJlZAotICogYnV0IG5vdCBQTkdfRVhQT1JULiAgUE5HQVBJIGFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuMi4zLiAqLwotCi1QTkdfRVhURVJOIHZvaWQgUE5HQVBJIHBuZ19kZWZhdWx0X3JlYWRfZGF0YSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpKTsKLQotI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIFBOR0FQSSBwbmdfcHVzaF9maWxsX2J1ZmZlciBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGxlbmd0aCkpOwotI2VuZGlmCi0KLVBOR19FWFRFUk4gdm9pZCBQTkdBUEkgcG5nX2RlZmF1bHRfd3JpdGVfZGF0YSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpKTsKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCkKLSNpZiAhZGVmaW5lZChQTkdfTk9fU1RESU8pCi1QTkdfRVhURVJOIHZvaWQgUE5HQVBJIHBuZ19kZWZhdWx0X2ZsdXNoIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotI2VuZGlmCi0jZW5kaWYKLSNlbHNlIC8qIFBOR18xXzBfWCAqLwotI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX2ZpbGxfYnVmZmVyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19ieXRlcCBidWZmZXIsIHBuZ19zaXplX3QgbGVuZ3RoKSk7Ci0jZW5kaWYKLSNlbmRpZiAvKiBQTkdfMV8wX1ggKi8KLQotLyogUmVzZXQgdGhlIENSQyB2YXJpYWJsZSAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19yZXNldF9jcmMgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLS8qIFdyaXRlIHRoZSAiZGF0YSIgYnVmZmVyIHRvIHdoYXRldmVyIG91dHB1dCB5b3UgYXJlIHVzaW5nLiAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9kYXRhIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsCi0gICBwbmdfc2l6ZV90IGxlbmd0aCkpOwotCi0vKiBSZWFkIGRhdGEgZnJvbSB3aGF0ZXZlciBpbnB1dCB5b3UgYXJlIHVzaW5nIGludG8gdGhlICJkYXRhIiBidWZmZXIgKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfcmVhZF9kYXRhIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsCi0gICBwbmdfc2l6ZV90IGxlbmd0aCkpOwotCi0vKiBSZWFkIGJ5dGVzIGludG8gYnVmLCBhbmQgdXBkYXRlIHBuZ19wdHItPmNyYyAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19jcmNfcmVhZCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBidWYsCi0gICBwbmdfc2l6ZV90IGxlbmd0aCkpOwotCi0vKiBEZWNvbXByZXNzIGRhdGEgaW4gYSBjaHVuayB0aGF0IHVzZXMgY29tcHJlc3Npb24gKi8KLSNpZiBkZWZpbmVkKFBOR196VFh0X1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfaVRYdF9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19pQ0NQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfc1BMVF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2RlY29tcHJlc3NfY2h1bmsgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgaW50IGNvbXBfdHlwZSwgcG5nX3NpemVfdCBjaHVua2xlbmd0aCwKLSAgIHBuZ19zaXplX3QgcHJlZml4X2xlbmd0aCwgcG5nX3NpemVfdCAqZGF0YV9sZW5ndGgpKTsKLSNlbmRpZgotCi0vKiBSZWFkICJza2lwIiBieXRlcywgcmVhZCB0aGUgZmlsZSBjcmMsIGFuZCAob3B0aW9uYWxseSkgdmVyaWZ5IHBuZ19wdHItPmNyYyAqLwotUE5HX0VYVEVSTiBpbnQgcG5nX2NyY19maW5pc2ggUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBza2lwKSk7Ci0KLS8qIFJlYWQgdGhlIENSQyBmcm9tIHRoZSBmaWxlIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBsaWJwbmcgY2FsY3VsYXRlZCBDUkMgKi8KLVBOR19FWFRFUk4gaW50IHBuZ19jcmNfZXJyb3IgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLS8qIENhbGN1bGF0ZSB0aGUgQ1JDIG92ZXIgYSBzZWN0aW9uIG9mIGRhdGEuICBOb3RlIHRoYXQgd2UgYXJlIG9ubHkKLSAqIHBhc3NpbmcgYSBtYXhpbXVtIG9mIDY0SyBvbiBzeXN0ZW1zIHRoYXQgaGF2ZSB0aGlzIGFzIGEgbWVtb3J5IGxpbWl0LAotICogc2luY2UgdGhpcyBpcyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSB3ZSBjYW4gc3BlY2lmeS4KLSAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19jYWxjdWxhdGVfY3JjIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHB0ciwKLSAgIHBuZ19zaXplX3QgbGVuZ3RoKSk7Ci0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2ZsdXNoIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotI2VuZGlmCi0KLS8qIHNpbXBsZSBmdW5jdGlvbiB0byB3cml0ZSB0aGUgc2lnbmF0dXJlICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX3NpZyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLQotLyogd3JpdGUgdmFyaW91cyBjaHVua3MgKi8KLQotLyogV3JpdGUgdGhlIElIRFIgY2h1bmssIGFuZCB1cGRhdGUgdGhlIHBuZ19zdHJ1Y3Qgd2l0aCB0aGUgbmVjZXNzYXJ5Ci0gKiBpbmZvcm1hdGlvbi4KLSAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9JSERSIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgd2lkdGgsCi0gICBwbmdfdWludF8zMiBoZWlnaHQsCi0gICBpbnQgYml0X2RlcHRoLCBpbnQgY29sb3JfdHlwZSwgaW50IGNvbXByZXNzaW9uX21ldGhvZCwgaW50IGZpbHRlcl9tZXRob2QsCi0gICBpbnQgaW50ZXJsYWNlX21ldGhvZCkpOwotCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX1BMVEUgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29sb3JwIHBhbGV0dGUsCi0gICBwbmdfdWludF8zMiBudW1fcGFsKSk7Ci0KLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfSURBVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLAotICAgcG5nX3NpemVfdCBsZW5ndGgpKTsKLQotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9JRU5EIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfZ0FNQV9TVVBQT1JURUQpCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9nQU1BIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgZG91YmxlIGZpbGVfZ2FtbWEpKTsKLSNlbmRpZgotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfZ0FNQV9maXhlZCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19maXhlZF9wb2ludAotICAgIGZpbGVfZ2FtbWEpKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9zQklUX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfc0JJVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb2xvcl84cCBzYml0LAotICAgaW50IGNvbG9yX3R5cGUpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfY0hSTV9TVVBQT1JURUQpCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9jSFJNIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGRvdWJsZSB3aGl0ZV94LCBkb3VibGUgd2hpdGVfeSwKLSAgIGRvdWJsZSByZWRfeCwgZG91YmxlIHJlZF95LCBkb3VibGUgZ3JlZW5feCwgZG91YmxlIGdyZWVuX3ksCi0gICBkb3VibGUgYmx1ZV94LCBkb3VibGUgYmx1ZV95KSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2NIUk1fZml4ZWQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2ZpeGVkX3BvaW50IGludF93aGl0ZV94LCBwbmdfZml4ZWRfcG9pbnQgaW50X3doaXRlX3ksCi0gICBwbmdfZml4ZWRfcG9pbnQgaW50X3JlZF94LCBwbmdfZml4ZWRfcG9pbnQgaW50X3JlZF95LCBwbmdfZml4ZWRfcG9pbnQKLSAgIGludF9ncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgaW50X2dyZWVuX3ksIHBuZ19maXhlZF9wb2ludCBpbnRfYmx1ZV94LAotICAgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX3kpKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9zUkdCX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfc1JHQiBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBpbnQgaW50ZW50KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV9pQ0NQIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jaGFycCBuYW1lLCBpbnQgY29tcHJlc3Npb25fdHlwZSwKLSAgIHBuZ19jaGFycCBwcm9maWxlLCBpbnQgcHJvZmxlbikpOwotICAgLyogTm90ZSB0byBtYWludGFpbmVyOiBwcm9maWxlIHNob3VsZCBiZSBwbmdfYnl0ZXAgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX3NQTFQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3NQTFRfdHAgcGFsZXR0ZSkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV90Uk5TX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfdFJOUyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCB0cmFucywKLSAgIHBuZ19jb2xvcl8xNnAgdmFsdWVzLCBpbnQgbnVtYmVyLCBpbnQgY29sb3JfdHlwZSkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9iS0dEX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfYktHRCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfY29sb3JfMTZwIHZhbHVlcywgaW50IGNvbG9yX3R5cGUpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfaElTVF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2hJU1QgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8xNnAgaGlzdCwKLSAgIGludCBudW1faGlzdCkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9URVhUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfcENBTF9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9pQ0NQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHBuZ19zaXplX3QgcG5nX2NoZWNrX2tleXdvcmQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2NoYXJwIGtleSwgcG5nX2NoYXJwcCBuZXdfa2V5KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV90RVh0IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NoYXJwIGtleSwKLSAgIHBuZ19jaGFycCB0ZXh0LCBwbmdfc2l6ZV90IHRleHRfbGVuKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV96VFh0IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NoYXJwIGtleSwKLSAgIHBuZ19jaGFycCB0ZXh0LCBwbmdfc2l6ZV90IHRleHRfbGVuLCBpbnQgY29tcHJlc3Npb24pKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2lUWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgaW50IGNvbXByZXNzaW9uLCBwbmdfY2hhcnAga2V5LCBwbmdfY2hhcnAgbGFuZywgcG5nX2NoYXJwIGxhbmdfa2V5LAotICAgcG5nX2NoYXJwIHRleHQpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfVEVYVF9TVVBQT1JURUQpICAvKiBBZGRlZCBhdCB2ZXJzaW9uIDEuMC4xNCBhbmQgMS4yLjQgKi8KLVBOR19FWFRFUk4gaW50IHBuZ19zZXRfdGV4dF8yIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3RleHRwIHRleHRfcHRyLCBpbnQgbnVtX3RleHQpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX29GRnMgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2ludF8zMiB4X29mZnNldCwgcG5nX2ludF8zMiB5X29mZnNldCwgaW50IHVuaXRfdHlwZSkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfcENBTCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jaGFycCBwdXJwb3NlLAotICAgcG5nX2ludF8zMiBYMCwgcG5nX2ludF8zMiBYMSwgaW50IHR5cGUsIGludCBucGFyYW1zLAotICAgcG5nX2NoYXJwIHVuaXRzLCBwbmdfY2hhcnBwIHBhcmFtcykpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9wSFlzX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfcEhZcyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfdWludF8zMiB4X3BpeGVsc19wZXJfdW5pdCwgcG5nX3VpbnRfMzIgeV9waXhlbHNfcGVyX3VuaXQsCi0gICBpbnQgdW5pdF90eXBlKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ193cml0ZV90SU1FIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ190aW1lcCBtb2RfdGltZSkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRCkKLSNpZiBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19OT19TVERJTykKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfc0NBTCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBpbnQgdW5pdCwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KSk7Ci0jZWxzZQotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfc0NBTF9zIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIGludCB1bml0LCBwbmdfY2hhcnAgd2lkdGgsIHBuZ19jaGFycCBoZWlnaHQpKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotLyogQ2FsbGVkIHdoZW4gZmluaXNoZWQgcHJvY2Vzc2luZyBhIHJvdyBvZiBkYXRhICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2ZpbmlzaF9yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLS8qIEludGVybmFsIHVzZSBvbmx5LiAgIENhbGxlZCBiZWZvcmUgZmlyc3Qgcm93IG9mIGRhdGEgKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfd3JpdGVfc3RhcnRfcm93IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2J1aWxkX2dhbW1hX3RhYmxlIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotI2VuZGlmCi0KLS8qIGNvbWJpbmUgYSByb3cgb2YgZGF0YSwgZGVhbGluZyB3aXRoIGFscGhhLCBldGMuIGlmIHJlcXVlc3RlZCAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19jb21iaW5lX3JvdyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCByb3csCi0gICBpbnQgbWFzaykpOwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCi0vKiBleHBhbmQgYW4gaW50ZXJsYWNlZCByb3cgKi8KLS8qIE9MRCBwcmUtMS4wLjkgaW50ZXJmYWNlOgotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19yZWFkX2ludGVybGFjZSBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93LCBpbnQgcGFzcywgcG5nX3VpbnRfMzIgdHJhbnNmb3JtYXRpb25zKSk7Ci0gKi8KLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fcmVhZF9pbnRlcmxhY2UgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0jZW5kaWYKLQotLyogR1JSIFRPIERPICgyLjAgb3Igd2hlbmV2ZXIpOiAgc2ltcGxpZnkgb3RoZXIgaW50ZXJuYWwgY2FsbGluZyBpbnRlcmZhY2VzICovCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCi0vKiBncmFiIHBpeGVscyBvdXQgb2YgYSByb3cgZm9yIGFuIGludGVybGFjZWQgcGFzcyAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb193cml0ZV9pbnRlcmxhY2UgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAotICAgcG5nX2J5dGVwIHJvdywgaW50IHBhc3MpKTsKLSNlbmRpZgotCi0vKiB1bmZpbHRlciBhIHJvdyAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19yZWFkX2ZpbHRlcl9yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2J5dGVwIHByZXZfcm93LCBpbnQgZmlsdGVyKSk7Ci0KLS8qIENob29zZSB0aGUgYmVzdCBmaWx0ZXIgdG8gdXNlIGFuZCBmaWx0ZXIgdGhlIHJvdyBkYXRhICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2ZpbmRfZmlsdGVyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pKTsKLQotLyogV3JpdGUgb3V0IHRoZSBmaWx0ZXJlZCByb3cuICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3dyaXRlX2ZpbHRlcmVkX3JvdyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgZmlsdGVyZWRfcm93KSk7Ci0vKiBmaW5pc2ggYSByb3cgd2hpbGUgcmVhZGluZywgZGVhbGluZyB3aXRoIGludGVybGFjaW5nIHBhc3NlcywgZXRjLiAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19yZWFkX2ZpbmlzaF9yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLS8qIGluaXRpYWxpemUgdGhlIHJvdyBidWZmZXJzLCBldGMuICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3JlYWRfc3RhcnRfcm93IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotLyogb3B0aW9uYWwgY2FsbCB0byB1cGRhdGUgdGhlIHVzZXJzIGluZm8gc3RydWN0dXJlICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX3JlYWRfdHJhbnNmb3JtX2luZm8gUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLS8qIHRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgZG8gdGhlIHRyYW5zZm9ybWF0aW9ucyAqLwotI2lmIGRlZmluZWQoUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fcmVhZF9maWxsZXIgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAotICAgcG5nX2J5dGVwIHJvdywgcG5nX3VpbnRfMzIgZmlsbGVyLCBwbmdfdWludF8zMiBmbGFncykpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19yZWFkX3N3YXBfYWxwaGEgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAotICAgcG5nX2J5dGVwIHJvdykpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fd3JpdGVfc3dhcF9hbHBoYSBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fcmVhZF9pbnZlcnRfYWxwaGEgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAotICAgcG5nX2J5dGVwIHJvdykpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb193cml0ZV9pbnZlcnRfYWxwaGEgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAotICAgcG5nX2J5dGVwIHJvdykpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX3N0cmlwX2ZpbGxlciBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93LCBwbmdfdWludF8zMiBmbGFncykpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TV0FQX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fc3dhcCBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fcGFja3N3YXAgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiBpbnQgcG5nX2RvX3JnYl90b19ncmF5IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcAotICAgcm93X2luZm8sIHBuZ19ieXRlcCByb3cpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX2dyYXlfdG9fcmdiIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKLSAgIHBuZ19ieXRlcCByb3cpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fdW5wYWNrIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fdW5zaGlmdCBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCi0gICBwbmdfY29sb3JfOHAgc2lnX2JpdHMpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19pbnZlcnQgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfMTZfVE9fOF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX2Nob3AgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fZGl0aGVyIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKLSAgIHBuZ19ieXRlcCByb3csIHBuZ19ieXRlcCBwYWxldHRlX2xvb2t1cCwgcG5nX2J5dGVwIGRpdGhlcl9sb29rdXApKTsKLQotIyAgaWYgZGVmaW5lZChQTkdfQ09SUkVDVF9QQUxFVFRFX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfY29ycmVjdF9wYWxldHRlIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb2xvcnAgcGFsZXR0ZSwgaW50IG51bV9wYWxldHRlKSk7Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX2JnciBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2RvX3BhY2sgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAotICAgcG5nX2J5dGVwIHJvdywgcG5nX3VpbnRfMzIgYml0X2RlcHRoKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fc2hpZnQgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAotICAgcG5nX2NvbG9yXzhwIGJpdF9kZXB0aCkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19iYWNrZ3JvdW5kIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ19jb2xvcl8xNnAgdHJhbnNfdmFsdWVzLCBwbmdfY29sb3JfMTZwIGJhY2tncm91bmQsCi0gICBwbmdfY29sb3JfMTZwIGJhY2tncm91bmRfMSwKLSAgIHBuZ19ieXRlcCBnYW1tYV90YWJsZSwgcG5nX2J5dGVwIGdhbW1hX2Zyb21fMSwgcG5nX2J5dGVwIGdhbW1hX3RvXzEsCi0gICBwbmdfdWludF8xNnBwIGdhbW1hXzE2LCBwbmdfdWludF8xNnBwIGdhbW1hXzE2X2Zyb21fMSwKLSAgIHBuZ191aW50XzE2cHAgZ2FtbWFfMTZfdG9fMSwgaW50IGdhbW1hX3NoaWZ0KSk7Ci0jZWxzZQotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19iYWNrZ3JvdW5kIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ19jb2xvcl8xNnAgdHJhbnNfdmFsdWVzLCBwbmdfY29sb3JfMTZwIGJhY2tncm91bmQpKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fZ2FtbWEgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAotICAgcG5nX2J5dGVwIGdhbW1hX3RhYmxlLCBwbmdfdWludF8xNnBwIGdhbW1hXzE2X3RhYmxlLAotICAgaW50IGdhbW1hX3NoaWZ0KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fZXhwYW5kX3BhbGV0dGUgUE5HQVJHKChwbmdfcm93X2luZm9wIHJvd19pbmZvLAotICAgcG5nX2J5dGVwIHJvdywgcG5nX2NvbG9ycCBwYWxldHRlLCBwbmdfYnl0ZXAgdHJhbnMsIGludCBudW1fdHJhbnMpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fZXhwYW5kIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKLSAgIHBuZ19ieXRlcCByb3csIHBuZ19jb2xvcl8xNnAgdHJhbnNfdmFsdWUpKTsKLSNlbmRpZgotCi0vKiBUaGUgZm9sbG93aW5nIGRlY29kZXMgdGhlIGFwcHJvcHJpYXRlIGNodW5rcywgYW5kIGRvZXMgZXJyb3IgY29ycmVjdGlvbiwKLSAqIHRoZW4gY2FsbHMgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrIGZvciB0aGUgY2h1bmsgaWYgaXQgaXMgdmFsaWQuCi0gKi8KLQotLyogZGVjb2RlIHRoZSBJSERSIGNodW5rICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9JSERSIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9QTFRFIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9JRU5EIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX2JLR0RfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19oYW5kbGVfYktHRCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyIGxlbmd0aCkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX2NIUk1fU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19oYW5kbGVfY0hSTSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyIGxlbmd0aCkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX2dBTUFfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19oYW5kbGVfZ0FNQSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyIGxlbmd0aCkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX2hJU1RfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19oYW5kbGVfaElTVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyIGxlbmd0aCkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVEKQotZXh0ZXJuIHZvaWQgcG5nX2hhbmRsZV9pQ0NQIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci0jZW5kaWYgLyogUE5HX1JFQURfaUNDUF9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfaVRYdF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9pVFh0IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfb0ZGc19TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9vRkZzIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfcENBTF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9wQ0FMIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfcEhZc19TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9wSFlzIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfc0JJVF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9zQklUIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfc0NBTF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV9zQ0FMIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfc1BMVF9TVVBQT1JURUQpCi1leHRlcm4gdm9pZCBwbmdfaGFuZGxlX3NQTFQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZiAvKiBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRCAqLwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3NSR0IgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF90RVh0X1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3RFWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF90SU1FX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3RJTUUgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3RSTlMgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF96VFh0X1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfaGFuZGxlX3pUWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLSNlbmRpZgotCi1QTkdfRVhURVJOIHZvaWQgcG5nX2hhbmRsZV91bmtub3duIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci0KLVBOR19FWFRFUk4gdm9pZCBwbmdfY2hlY2tfY2h1bmtfbmFtZSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgY2h1bmtfbmFtZSkpOwotCi0vKiBoYW5kbGUgdGhlIHRyYW5zZm9ybWF0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAqLwotUE5HX0VYVEVSTiB2b2lkIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fd3JpdGVfdHJhbnNmb3JtYXRpb25zIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi1QTkdfRVhURVJOIHZvaWQgcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci0KLSNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9yZWFkX2NodW5rIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3JlYWRfc2lnIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX2NoZWNrX2NyYyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9jcmNfc2tpcCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9jcmNfZmluaXNoIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3NhdmVfYnVmZmVyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3Jlc3RvcmVfYnVmZmVyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19ieXRlcCBidWZmZXIsIHBuZ19zaXplX3QgYnVmZmVyX2xlbmd0aCkpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3JlYWRfSURBVCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHJvY2Vzc19JREFUX2RhdGEgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBidWZmZXJfbGVuZ3RoKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfcHJvY2Vzc19yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGFuZGxlX3Vua25vd24gUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9oYXZlX2luZm8gUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGF2ZV9lbmQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGF2ZV9yb3cgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgcm93KSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfcmVhZF9lbmQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3Byb2Nlc3Nfc29tZV9kYXRhIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpKTsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3RFWHRfU1VQUE9SVEVEKQotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX2hhbmRsZV90RVh0IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSk7Ci1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfcmVhZF90RVh0IFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19pbmZvcCBpbmZvX3B0cikpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF96VFh0X1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9oYW5kbGVfelRYdCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkpOwotUE5HX0VYVEVSTiB2b2lkIHBuZ19wdXNoX3JlYWRfelRYdCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIpKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfaVRYdF9TVVBQT1JURUQpCi1QTkdfRVhURVJOIHZvaWQgcG5nX3B1c2hfaGFuZGxlX2lUWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfcHVzaF9yZWFkX2lUWHQgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fcmVhZF9pbnRyYXBpeGVsIFBOR0FSRygocG5nX3Jvd19pbmZvcCByb3dfaW5mbywKLSAgIHBuZ19ieXRlcCByb3cpKTsKLVBOR19FWFRFUk4gdm9pZCBwbmdfZG9fd3JpdGVfaW50cmFwaXhlbCBQTkdBUkcoKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sCi0gICBwbmdfYnl0ZXAgcm93KSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRCkKLSNpZiBkZWZpbmVkKFBOR19NTVhfQ09ERV9TVVBQT1JURUQpCi0vKiBwbmcuYyAqLyAvKiBQUklWQVRFICovCi1QTkdfRVhURVJOIHZvaWQgcG5nX2luaXRfbW14X2ZsYWdzIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX0lOQ0hfQ09OVkVSU0lPTlMpICYmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gcG5nX3VpbnRfMzIgcG5nX2dldF9waXhlbHNfcGVyX2luY2ggUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotcG5nX2luZm9wIGluZm9fcHRyKSk7Ci0KLVBOR19FWFRFUk4gcG5nX3VpbnRfMzIgcG5nX2dldF94X3BpeGVsc19wZXJfaW5jaCBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi1wbmdfaW5mb3AgaW5mb19wdHIpKTsKLQotUE5HX0VYVEVSTiBwbmdfdWludF8zMiBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9pbmNoIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLXBuZ19pbmZvcCBpbmZvX3B0cikpOwotCi1QTkdfRVhURVJOIGZsb2F0IHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLXBuZ19pbmZvcCBpbmZvX3B0cikpOwotCi1QTkdfRVhURVJOIGZsb2F0IHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwKLXBuZ19pbmZvcCBpbmZvX3B0cikpOwotCi0jaWYgZGVmaW5lZChQTkdfcEhZc19TVVBQT1JURUQpCi1QTkdfRVhURVJOIHBuZ191aW50XzMyIHBuZ19nZXRfcEhZc19kcGkgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiAqcmVzX3gsIHBuZ191aW50XzMyICpyZXNfeSwgaW50ICp1bml0X3R5cGUpKTsKLSNlbmRpZiAvKiBQTkdfcEhZc19TVVBQT1JURUQgKi8KLSNlbmRpZiAgLyogUE5HX0lOQ0hfQ09OVkVSU0lPTlMgJiYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCAqLwotCi0vKiBSZWFkIHRoZSBjaHVuayBoZWFkZXIgKGxlbmd0aCArIHR5cGUgbmFtZSkgKi8KLVBOR19FWFRFUk4gcG5nX3VpbnRfMzIgcG5nX3JlYWRfY2h1bmtfaGVhZGVyIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0cikpOwotCi0vKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjIuMzQgKi8KLSNpZiBkZWZpbmVkKFBOR19jSFJNX1NVUFBPUlRFRCkKLVBOR19FWFRFUk4gaW50IHBuZ19jaGVja19jSFJNX2ZpeGVkICBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfZml4ZWRfcG9pbnQgaW50X3doaXRlX3gsIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeSwKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfcmVkX3gsIHBuZ19maXhlZF9wb2ludCBpbnRfcmVkX3ksIHBuZ19maXhlZF9wb2ludAotICAgaW50X2dyZWVuX3gsIHBuZ19maXhlZF9wb2ludCBpbnRfZ3JlZW5feSwgcG5nX2ZpeGVkX3BvaW50IGludF9ibHVlX3gsCi0gICBwbmdfZml4ZWRfcG9pbnQgaW50X2JsdWVfeSkpOwotI2VuZGlmCi0KLS8qIE1haW50YWluZXI6IFB1dCBuZXcgcHJpdmF0ZSBwcm90b3R5cGVzIGhlcmUgXiBhbmQgaW4gbGlicG5ncGYuMyAqLwotCi0jZW5kaWYgLyogUE5HX0lOVEVSTkFMICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBQTkdfVkVSU0lPTl9JTkZPX09OTFkgKi8KLS8qIGRvIG5vdCBwdXQgYW55dGhpbmcgcGFzdCB0aGlzIGxpbmUgKi8KLSNlbmRpZiAvKiBQTkdfSCAqLwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcG5nYmFyLmpwZyBiL2xpYnMvbGlicG5nL3BuZ2Jhci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYmE4ZDguLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5nYmFyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3BuZ2Jhci5wbmcgYi9saWJzL2xpYnBuZy9wbmdiYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTc5OGM4Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3BuZ2Jhci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wbmdjb25mLmggYi9saWJzL2xpYnBuZy9wbmdjb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNTM2OGQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5nY29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5NiArMCwwIEBACi0KLS8qIHBuZ2NvbmYuaCAtIG1hY2hpbmUgY29uZmlndXJhYmxlIGZpbGUgZm9yIGxpYnBuZwotICoKLSAqIGxpYnBuZyB2ZXJzaW9uIDEuMi4zNyAtIEp1bmUgNCwgMjAwOQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQotICovCi0KLS8qIEFueSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgaXMgbmVhciB0aGUgZnJvbnQgb2YgdGhpcyBmaWxlLCBzbyBpZiB5b3UKLSAqIGFyZSBjb25maWd1cmluZyBsaWJwbmcgZm9yIGEgbWFjaGluZSwgeW91IG1heSB3YW50IHRvIHJlYWQgdGhlIHNlY3Rpb24KLSAqIHN0YXJ0aW5nIGhlcmUgZG93biB0byB3aGVyZSBpdCBzdGFydHMgdG8gdHlwZWRlZiBwbmdfY29sb3IsIHBuZ190ZXh0LAotICogYW5kIHBuZ19pbmZvLgotICovCi0KLSNpZm5kZWYgUE5HQ09ORl9ICi0jZGVmaW5lIFBOR0NPTkZfSAotCi0jZGVmaW5lIFBOR18xXzJfWAotCi0vKiAKLSAqIFBOR19VU0VSX0NPTkZJRyBoYXMgdG8gYmUgZGVmaW5lZCBvbiB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lLiBUaGlzCi0gKiBpbmNsdWRlcyB0aGUgcmVzb3VyY2UgY29tcGlsZXIgZm9yIFdpbmRvd3MgRExMIGNvbmZpZ3VyYXRpb25zLgotICovCi0jaWZkZWYgUE5HX1VTRVJfQ09ORklHCi0jICBpZm5kZWYgUE5HX1VTRVJfUFJJVkFURUJVSUxECi0jICAgIGRlZmluZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQKLSMgIGVuZGlmCi0jaW5jbHVkZSAicG5ndXNyLmgiCi0jZW5kaWYKLQotLyogUE5HX0NPTkZJR1VSRV9MSUJQTkcgaXMgc2V0IGJ5IHRoZSAiY29uZmlndXJlIiBzY3JpcHQuICovCi0jaWZkZWYgUE5HX0NPTkZJR1VSRV9MSUJQTkcKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLSNlbmRpZgotCi0vKgotICogQWRkZWQgYXQgbGlicG5nLTEuMi44Ci0gKiAgCi0gKiBJZiB5b3UgY3JlYXRlIGEgcHJpdmF0ZSBETEwgeW91IG5lZWQgdG8gZGVmaW5lIGluICJwbmd1c3IuaCIgdGhlIGZvbGxvd2luZ3M6Ci0gKiAjZGVmaW5lIFBOR19VU0VSX1BSSVZBVEVCVUlMRCA8RGVzY3JpYmVzIGJ5IHdob20gYW5kIHdoeSB0aGlzIHZlcnNpb24gb2YKLSAqICAgICAgICB0aGUgRExMIHdhcyBidWlsdD4KLSAqICBlLmcuICNkZWZpbmUgUE5HX1VTRVJfUFJJVkFURUJVSUxEICJCdWlsZCBieSBNeUNvbXBhbnkgZm9yIHh5eiByZWFzb25zLiIKLSAqICNkZWZpbmUgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWCA8dHdvLWxldHRlciBwb3N0Zml4IHRoYXQgc2VydmUgdG8KLSAqICAgICAgICBkaXN0aW5ndWlzaCB5b3VyIERMTCBmcm9tIHRob3NlIG9mIHRoZSBvZmZpY2lhbCByZWxlYXNlLiBUaGVzZQotICogICAgICAgIGNvcnJlc3BvbmQgdG8gdGhlIHRyYWlsaW5nIGxldHRlcnMgdGhhdCBjb21lIGFmdGVyIHRoZSB2ZXJzaW9uCi0gKiAgICAgICAgbnVtYmVyIGFuZCBtdXN0IG1hdGNoIHlvdXIgcHJpdmF0ZSBETEwgbmFtZT4KLSAqICBlLmcuIC8vIHByaXZhdGUgRExMICJsaWJwbmcxM2d4LmRsbCIKLSAqICAgICAgICNkZWZpbmUgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWCAiZ3giCi0gKiAKLSAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBhbHNvIGF0IHlvdXIgZGlzcG9zYWwgaWYgeW91IHdhbnQgdG8gY29tcGxldGUgdGhlIAotICogRExMIFZFUlNJT05JTkZPIHN0cnVjdHVyZS4KLSAqIC0gUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NTUVOVFMKLSAqIC0gUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NUEFOWU5BTUUKLSAqIC0gUE5HX1VTRVJfVkVSU0lPTklORk9fTEVHQUxUUkFERU1BUktTCi0gKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jaWZkZWYgU1BFQ0lBTEJVSUxECi0jICBwcmFnbWEgbWVzc2FnZSgiUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQgKGFuZCBkZXByZWNhdGVkIFNQRUNJQUxCVUlMRClcCi0gYXJlIG5vdyBMSUJQTkcgcmVzZXJ2ZWQgbWFjcm9zLiBVc2UgUE5HX1VTRVJfUFJJVkFURUJVSUxEIGluc3RlYWQuIikKLSNlbmRpZgotCi0jaWZkZWYgUFJJVkFURUJVSUxECi0jIHByYWdtYSBtZXNzYWdlKCJQUklWQVRFQlVJTEQgaXMgZGVwcmVjYXRlZC5cCi0gVXNlIFBOR19VU0VSX1BSSVZBVEVCVUlMRCBpbnN0ZWFkLiIpCi0jIGRlZmluZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQgUFJJVkFURUJVSUxECi0jZW5kaWYKLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0jaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQotCi0vKiBFbmQgb2YgbWF0ZXJpYWwgYWRkZWQgdG8gbGlicG5nLTEuMi44ICovCi0KLS8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuMTksIHJlbW92ZWQgYXQgbGlicG5nLTEuMi4yMCBiZWNhdXNlIGl0IGNhdXNlZCB0cm91YmxlCi0gICBSZXN0b3JlZCBhdCBsaWJwbmctMS4yLjIxICovCi0jaWYgIWRlZmluZWQoUE5HX05PX1dBUk5fVU5JTklUSUFMSVpFRF9ST1cpICYmIFwKLSAgICAhZGVmaW5lZChQTkdfV0FSTl9VTklOSVRJQUxJWkVEX1JPVykKLSMgIGRlZmluZSBQTkdfV0FSTl9VTklOSVRJQUxJWkVEX1JPVyAxCi0jZW5kaWYKLS8qIEVuZCBvZiBtYXRlcmlhbCBhZGRlZCBhdCBsaWJwbmctMS4yLjE5LzEuMi4yMSAqLwotCi0vKiBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2lvbiBidWZmZXIsIGFuZCB0aHVzIHRoZSBzaXplIG9mCi0gKiBhbiBJREFUIGNodW5rLiAgTWFrZSB0aGlzIHdoYXRldmVyIHNpemUgeW91IGZlZWwgaXMgYmVzdCBmb3IgeW91cgotICogbWFjaGluZS4gIE9uZSBvZiB0aGVzZSB3aWxsIGJlIGFsbG9jYXRlZCBwZXIgcG5nX3N0cnVjdC4gIFdoZW4gdGhpcwotICogaXMgZnVsbCwgaXQgd3JpdGVzIHRoZSBkYXRhIHRvIHRoZSBkaXNrLCBhbmQgZG9lcyBzb21lIG90aGVyCi0gKiBjYWxjdWxhdGlvbnMuICBNYWtpbmcgdGhpcyBhbiBleHRyZW1lbHkgc21hbGwgc2l6ZSB3aWxsIHNsb3cKLSAqIHRoZSBsaWJyYXJ5IGRvd24sIGJ1dCB5b3UgbWF5IHdhbnQgdG8gZXhwZXJpbWVudCB0byBkZXRlcm1pbmUKLSAqIHdoZXJlIGl0IGJlY29tZXMgc2lnbmlmaWNhbnQsIGlmIHlvdSBhcmUgY29uY2VybmVkIHdpdGggbWVtb3J5Ci0gKiB1c2FnZS4gIE5vdGUgdGhhdCB6bGliIGFsbG9jYXRlcyBhdCBsZWFzdCAzMktiIGFsc28uICBGb3IgcmVhZGVycywKLSAqIHRoaXMgZGVzY3JpYmVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgYXZhaWxhYmxlIHRvIHJlYWQgdGhlIGRhdGEgaW4uCi0gKiBVbmxlc3MgdGhpcyBnZXRzIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBvZiBhIHJvdyAoY29tcHJlc3NlZCksCi0gKiBpdCBzaG91bGQgbm90IG1ha2UgbXVjaCBkaWZmZXJlbmNlIGhvdyBiaWcgdGhpcyBpcy4KLSAqLwotCi0jaWZuZGVmIFBOR19aQlVGX1NJWkUKLSMgIGRlZmluZSBQTkdfWkJVRl9TSVpFIDgxOTIKLSNlbmRpZgotCi0vKiBFbmFibGUgaWYgeW91IHdhbnQgYSB3cml0ZS1vbmx5IGxpYnBuZyAqLwotCi0jaWZuZGVmIFBOR19OT19SRUFEX1NVUFBPUlRFRAotIyAgZGVmaW5lIFBOR19SRUFEX1NVUFBPUlRFRAotI2VuZGlmCi0KLS8qIEVuYWJsZSBpZiB5b3Ugd2FudCBhIHJlYWQtb25seSBsaWJwbmcgKi8KLQotI2lmbmRlZiBQTkdfTk9fV1JJVEVfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX1dSSVRFX1NVUFBPUlRFRAotI2VuZGlmCi0KLS8qIEVuYWJsZWQgYnkgZGVmYXVsdCBpbiAxLjIuMC4gIFlvdSBjYW4gZGlzYWJsZSB0aGlzIGlmIHlvdSBkb24ndCBuZWVkIHRvCi0gICBzdXBwb3J0IFBOR3MgdGhhdCBhcmUgZW1iZWRkZWQgaW4gTU5HIGRhdGFzdHJlYW1zICovCi0jaWYgIWRlZmluZWQoUE5HXzFfMF9YKSAmJiAhZGVmaW5lZChQTkdfTk9fTU5HX0ZFQVRVUkVTKQotIyAgaWZuZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFBOR19OT19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIElmIHlvdSBhcmUgcnVubmluZyBvbiBhIG1hY2hpbmUgd2hlcmUgeW91IGNhbm5vdCBhbGxvY2F0ZSBtb3JlCi0gKiB0aGFuIDY0SyBvZiBtZW1vcnkgYXQgb25jZSwgdW5jb21tZW50IHRoaXMuICBXaGlsZSBsaWJwbmcgd2lsbCBub3QKLSAqIG5vcm1hbGx5IG5lZWQgdGhhdCBtdWNoIG1lbW9yeSBpbiBhIGNodW5rICh1bmxlc3MgeW91IGxvYWQgdXAgYSB2ZXJ5Ci0gKiBsYXJnZSBmaWxlKSwgemxpYiBuZWVkcyB0byBrbm93IGhvdyBiaWcgb2YgYSBjaHVuayBpdCBjYW4gdXNlLCBhbmQKLSAqIGxpYnBuZyB0aHVzIG1ha2VzIHN1cmUgdG8gY2hlY2sgYW55IG1lbW9yeSBhbGxvY2F0aW9uIHRvIHZlcmlmeSBpdAotICogd2lsbCBmaXQgaW50byBtZW1vcnkuCi0jZGVmaW5lIFBOR19NQVhfTUFMTE9DXzY0SwotICovCi0jaWYgZGVmaW5lZChNQVhTRUdfNjRLKSAmJiAhZGVmaW5lZChQTkdfTUFYX01BTExPQ182NEspCi0jICBkZWZpbmUgUE5HX01BWF9NQUxMT0NfNjRLCi0jZW5kaWYKLQotLyogU3BlY2lhbCBtdW5naW5nIHRvIHN1cHBvcnQgZG9pbmcgdGhpbmdzIHRoZSAnY3lnd2luJyB3YXk6Ci0gKiAnTm9ybWFsJyBwbmctb24td2luMzIgZGVmaW5lcy9kZWZhdWx0czoKLSAqICAgUE5HX0JVSUxEX0RMTCAtLSBidWlsZGluZyBkbGwKLSAqICAgUE5HX1VTRV9ETEwgICAtLSBidWlsZGluZyBhbiBhcHBsaWNhdGlvbiwgbGlua2luZyB0byBkbGwKLSAqICAgKG5vIGRlZmluZSkgICAtLSBidWlsZGluZyBzdGF0aWMgbGlicmFyeSwgb3IgYnVpbGRpbmcgYW4KLSAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBhbmQgbGlua2luZyB0byB0aGUgc3RhdGljIGxpYgotICogJ0N5Z3dpbicgZGVmaW5lcy9kZWZhdWx0czoKLSAqICAgUE5HX0JVSUxEX0RMTCAtLSAoaWdub3JlZCkgYnVpbGRpbmcgdGhlIGRsbAotICogICAobm8gZGVmaW5lKSAgIC0tIChpZ25vcmVkKSBidWlsZGluZyBhbiBhcHBsaWNhdGlvbiwgbGlua2luZyB0byB0aGUgZGxsCi0gKiAgIFBOR19TVEFUSUMgICAgLS0gKGlnbm9yZWQpIGJ1aWxkaW5nIHRoZSBzdGF0aWMgbGliLCBvciBidWlsZGluZyBhbiAKLSAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiB0aGF0IGxpbmtzIHRvIHRoZSBzdGF0aWMgbGliLgotICogICBBTExfU1RBVElDICAgIC0tIChpZ25vcmVkKSBidWlsZGluZyB2YXJpb3VzIHN0YXRpYyBsaWJzLCBvciBidWlsZGluZyBhbiAKLSAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiB0aGF0IGxpbmtzIHRvIHRoZSBzdGF0aWMgbGlicy4KLSAqIFRodXMsCi0gKiBhIGN5Z3dpbiB1c2VyIHNob3VsZCBkZWZpbmUgZWl0aGVyIFBOR19CVUlMRF9ETEwgb3IgUE5HX1NUQVRJQywgYW5kCi0gKiB0aGlzIGJpdCBvZiAjaWZkZWZzIHdpbGwgZGVmaW5lIHRoZSAnY29ycmVjdCcgY29uZmlnIHZhcmlhYmxlcyBiYXNlZCBvbgotICogdGhhdC4gSWYgYSBjeWd3aW4gdXNlciAqd2FudHMqIHRvIGRlZmluZSAnUE5HX1VTRV9ETEwnIHRoYXQncyBva2F5LCBidXQKLSAqIHVubmVjZXNzYXJ5LgotICoKLSAqIEFsc28sIHRoZSBwcmVjZWRlbmNlIG9yZGVyIGlzOgotICogICBBTExfU1RBVElDIChzaW5jZSB3ZSBjYW4ndCAjdW5kZWYgc29tZXRoaW5nIG91dHNpZGUgb3VyIG5hbWVzcGFjZSkKLSAqICAgUE5HX0JVSUxEX0RMTAotICogICBQTkdfU1RBVElDCi0gKiAgIChub3RoaW5nKSA9PSBQTkdfVVNFX0RMTAotICogCi0gKiBDWUdXSU4gKDIwMDItMDEtMjApOiBUaGUgcHJlY2VkaW5nIGlzIG5vdyBvYnNvbGV0ZS4gV2l0aCB0aGUgYWR2ZW50Ci0gKiAgIG9mIGF1dG8taW1wb3J0IGluIGJpbnV0aWxzLCB3ZSBubyBsb25nZXIgbmVlZCB0byB3b3JyeSBhYm91dCAKLSAqICAgX19kZWNsc3BlYyhkbGxleHBvcnQpIC8gX19kZWNsc3BlYyhkbGxpbXBvcnQpIGFuZCBmcmllbmRzLiAgVGhlcmVmb3JlLAotICogICB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IFBOR19TVEFUSUMgb3IgQUxMX1NUQVRJQyB3aGVuIGl0IGNvbWVzCi0gKiAgIHRvIF9fZGVjbHNwZWMoKSBzdHVmZi4gIEhvd2V2ZXIsIHdlIERPIG5lZWQgdG8gd29ycnkgYWJvdXQgCi0gKiAgIFBOR19CVUlMRF9ETEwgYW5kIFBOR19TVEFUSUMgYmVjYXVzZSB0aG9zZSBjaGFuZ2Ugc29tZSBkZWZhdWx0cwotICogICBzdWNoIGFzIENPTlNPTEVfSU8gYW5kIHdoZXRoZXIgR0xPQkFMX0FSUkFZUyBhcmUgYWxsb3dlZC4KLSAqLwotI2lmIGRlZmluZWQoX19DWUdXSU5fXykKLSMgIGlmIGRlZmluZWQoQUxMX1NUQVRJQykKLSMgICAgaWYgZGVmaW5lZChQTkdfQlVJTERfRExMKQotIyAgICAgIHVuZGVmIFBOR19CVUlMRF9ETEwKLSMgICAgZW5kaWYKLSMgICAgaWYgZGVmaW5lZChQTkdfVVNFX0RMTCkKLSMgICAgICB1bmRlZiBQTkdfVVNFX0RMTAotIyAgICBlbmRpZgotIyAgICBpZiBkZWZpbmVkKFBOR19ETEwpCi0jICAgICAgdW5kZWYgUE5HX0RMTAotIyAgICBlbmRpZgotIyAgICBpZiAhZGVmaW5lZChQTkdfU1RBVElDKQotIyAgICAgIGRlZmluZSBQTkdfU1RBVElDCi0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGlmIGRlZmluZWQgKFBOR19CVUlMRF9ETEwpCi0jICAgICAgaWYgZGVmaW5lZChQTkdfU1RBVElDKQotIyAgICAgICAgdW5kZWYgUE5HX1NUQVRJQwotIyAgICAgIGVuZGlmCi0jICAgICAgaWYgZGVmaW5lZChQTkdfVVNFX0RMTCkKLSMgICAgICAgIHVuZGVmIFBOR19VU0VfRExMCi0jICAgICAgZW5kaWYKLSMgICAgICBpZiAhZGVmaW5lZChQTkdfRExMKQotIyAgICAgICAgZGVmaW5lIFBOR19ETEwKLSMgICAgICBlbmRpZgotIyAgICBlbHNlCi0jICAgICAgaWYgZGVmaW5lZChQTkdfU1RBVElDKQotIyAgICAgICAgaWYgZGVmaW5lZChQTkdfVVNFX0RMTCkKLSMgICAgICAgICAgdW5kZWYgUE5HX1VTRV9ETEwKLSMgICAgICAgIGVuZGlmCi0jICAgICAgICBpZiBkZWZpbmVkKFBOR19ETEwpCi0jICAgICAgICAgIHVuZGVmIFBOR19ETEwKLSMgICAgICAgIGVuZGlmCi0jICAgICAgZWxzZQotIyAgICAgICAgaWYgIWRlZmluZWQoUE5HX1VTRV9ETEwpCi0jICAgICAgICAgIGRlZmluZSBQTkdfVVNFX0RMTAotIyAgICAgICAgZW5kaWYKLSMgICAgICAgIGlmICFkZWZpbmVkKFBOR19ETEwpCi0jICAgICAgICAgIGRlZmluZSBQTkdfRExMCi0jICAgICAgICBlbmRpZgotIyAgICAgIGVuZGlmICAKLSMgICAgZW5kaWYgIAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBUaGlzIHByb3RlY3RzIHVzIGFnYWluc3QgY29tcGlsZXJzIHRoYXQgcnVuIG9uIGEgd2luZG93aW5nIHN5c3RlbQotICogYW5kIHRodXMgZG9uJ3QgaGF2ZSBvciB3b3VsZCByYXRoZXIgdXMgbm90IHVzZSB0aGUgc3RkaW8gdHlwZXM6Ci0gKiBzdGRpbiwgc3Rkb3V0LCBhbmQgc3RkZXJyLiAgVGhlIG9ubHkgb25lIGN1cnJlbnRseSB1c2VkIGlzIHN0ZGVycgotICogaW4gcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkuICAjZGVmaW5pbmcgUE5HX05PX0NPTlNPTEVfSU8gd2lsbAotICogcHJldmVudCB0aGVzZSBmcm9tIGJlaW5nIGNvbXBpbGVkIGFuZCB1c2VkLiAjZGVmaW5pbmcgUE5HX05PX1NURElPCi0gKiB3aWxsIGFsc28gcHJldmVudCB0aGVzZSwgcGx1cyB3aWxsIHByZXZlbnQgdGhlIGVudGlyZSBzZXQgb2Ygc3RkaW8KLSAqIG1hY3JvcyBhbmQgZnVuY3Rpb25zIChGSUxFICosIHByaW50ZiwgZXRjLikgZnJvbSBiZWluZyBjb21waWxlZCBhbmQgdXNlZCwKLSAqIHVubGVzcyAoUE5HX0RFQlVHID4gMCkgaGFzIGJlZW4gI2RlZmluZWQuCi0gKgotICogI2RlZmluZSBQTkdfTk9fQ09OU09MRV9JTwotICogI2RlZmluZSBQTkdfTk9fU1RESU8KLSAqLwotCi0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotIyAgaW5jbHVkZSA8d2luZG93cy5oPgotICAgLyogQ29uc29sZSBJL08gZnVuY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NDRSAqLwotIyAgZGVmaW5lIFBOR19OT19DT05TT0xFX0lPCi0gICAvKiBhYm9ydCgpIG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIHNvbWUvYWxsIFdpbmRvd3MgQ0UgcGxhdGZvcm1zICovCi0jICBkZWZpbmUgUE5HX0FCT1JUKCkgZXhpdCgtMSkKLSMgIGlmZGVmIFBOR19ERUJVRwotIyAgICB1bmRlZiBQTkdfREVCVUcKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFBOR19CVUlMRF9ETEwKLSMgIGlmbmRlZiBQTkdfQ09OU09MRV9JT19TVVBQT1JURUQKLSMgICAgaWZuZGVmIFBOR19OT19DT05TT0xFX0lPCi0jICAgICAgZGVmaW5lIFBOR19OT19DT05TT0xFX0lPCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSMgIGlmZGVmIFBOR19OT19TVERJTwotIyAgICBpZm5kZWYgUE5HX05PX0NPTlNPTEVfSU8KLSMgICAgICBkZWZpbmUgUE5HX05PX0NPTlNPTEVfSU8KLSMgICAgZW5kaWYKLSMgICAgaWZkZWYgUE5HX0RFQlVHCi0jICAgICAgaWYgKFBOR19ERUJVRyA+IDApCi0jICAgICAgICBpbmNsdWRlIDxzdGRpby5oPgotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGlmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCi0vKiAic3RkaW8uaCIgZnVuY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NDRSAqLwotIyAgICAgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotCi0vKiBUaGlzIG1hY3JvIHByb3RlY3RzIHVzIGFnYWluc3QgbWFjaGluZXMgdGhhdCBkb24ndCBoYXZlIGZ1bmN0aW9uCi0gKiBwcm90b3R5cGVzIChpZSBLJlIgc3R5bGUgaGVhZGVycykuICBJZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IGhhbmRsZQotICogZnVuY3Rpb24gcHJvdG90eXBlcywgZGVmaW5lIHRoaXMgbWFjcm8gYW5kIHVzZSB0aGUgaW5jbHVkZWQgYW5zaTJrbnIuCi0gKiBJJ3ZlIGFsd2F5cyBiZWVuIGFibGUgdG8gdXNlIF9OT19QUk9UTyBhcyB0aGUgaW5kaWNhdG9yLCBidXQgeW91IG1heQotICogbmVlZCB0byBkcmFnIHRoZSBlbXB0eSBkZWNsYXJhdGlvbiBvdXQgaW4gZnJvbnQgb2YgaGVyZSwgb3IgY2hhbmdlIHRoZQotICogaWZkZWYgdG8gc3VpdCB5b3VyIG93biBuZWVkcy4KLSAqLwotI2lmbmRlZiBQTkdBUkcKLQotI2lmZGVmIE9GIC8qIHpsaWIgcHJvdG90eXBlIG11bmdlciAqLwotIyAgZGVmaW5lIFBOR0FSRyhhcmdsaXN0KSBPRihhcmdsaXN0KQotI2Vsc2UKLQotI2lmZGVmIF9OT19QUk9UTwotIyAgZGVmaW5lIFBOR0FSRyhhcmdsaXN0KSAoKQotIyAgaWZuZGVmIFBOR19UWVBFQ0FTVF9OVUxMCi0jICAgICBkZWZpbmUgUE5HX1RZUEVDQVNUX05VTEwKLSMgIGVuZGlmCi0jZWxzZQotIyAgZGVmaW5lIFBOR0FSRyhhcmdsaXN0KSBhcmdsaXN0Ci0jZW5kaWYgLyogX05PX1BST1RPICovCi0KLQotI2VuZGlmIC8qIE9GICovCi0KLSNlbmRpZiAvKiBQTkdBUkcgKi8KLQotLyogVHJ5IHRvIGRldGVybWluZSBpZiB3ZSBhcmUgY29tcGlsaW5nIG9uIGEgTWFjLiAgTm90ZSB0aGF0IHRlc3RpbmcgZm9yCi0gKiBqdXN0IF9fTVdFUktTX18gaXMgbm90IGdvb2QgZW5vdWdoLCBiZWNhdXNlIHRoZSBDb2Rld2FycmlvciBpcyBub3cgdXNlZAotICogb24gbm9uLU1hYyBwbGF0Zm9ybXMuCi0gKi8KLSNpZm5kZWYgTUFDT1MKLSMgIGlmIChkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQobWFjaW50b3NoKSkgfHwgZGVmaW5lZChhcHBsZWMpIHx8IFwKLSAgICAgIGRlZmluZWQoVEhJTktfQykgfHwgZGVmaW5lZChfX1NDX18pIHx8IGRlZmluZWQoVEFSR0VUX09TX01BQykKLSMgICAgZGVmaW5lIE1BQ09TCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIGVub3VnaCBwZW9wbGUgbmVlZCB0aGlzIGZvciB2YXJpb3VzIHJlYXNvbnMgdG8gaW5jbHVkZSBpdCBoZXJlICovCi0jaWYgIWRlZmluZWQoTUFDT1MpICYmICFkZWZpbmVkKFJJU0NPUykgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKLSMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChQTkdfU0VUSk1QX05PVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19OT19TRVRKTVBfU1VQUE9SVEVEKQotIyAgZGVmaW5lIFBOR19TRVRKTVBfU1VQUE9SVEVECi0jZW5kaWYKLQotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0vKiBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gZm9yY2UgYSBzaW5nbGUgc2V0am1wIGJlaGF2aW91ciBvbiBMaW51eC4gIElmCi0gKiB0aGUgWCBjb25maWcgc3R1ZmYgZGlkbid0IGRlZmluZSBfQlNEX1NPVVJDRSB3ZSB3b3VsZG4ndCBuZWVkIHRoaXMuCi0gKgotICogWW91IGNhbiBieXBhc3MgdGhpcyB0ZXN0IGlmIHlvdSBrbm93IHRoYXQgeW91ciBhcHBsaWNhdGlvbiB1c2VzIGV4YWN0bHkKLSAqIHRoZSBzYW1lIHNldGptcC5oIHRoYXQgd2FzIGluY2x1ZGVkIHdoZW4gbGlicG5nIHdhcyBidWlsdC4gIE9ubHkgZGVmaW5lCi0gKiBQTkdfU0tJUF9TRVRKTVBfQ0hFQ0sgd2hpbGUgYnVpbGRpbmcgeW91ciBhcHBsaWNhdGlvbiwgcHJpb3IgdG8gdGhlCi0gKiBhcHBsaWNhdGlvbidzICcjaW5jbHVkZSAicG5nLmgiJy4gRG9uJ3QgZGVmaW5lIFBOR19TS0lQX1NFVEpNUF9DSEVDSwotICogd2hpbGUgYnVpbGRpbmcgYSBzZXBhcmF0ZSBsaWJwbmcgbGlicmFyeSBmb3IgZ2VuZXJhbCB1c2UuCi0gKi8KLQotIyAgaWZuZGVmIFBOR19TS0lQX1NFVEpNUF9DSEVDSwotIyAgICBpZmRlZiBfX2xpbnV4X18KLSMgICAgICBpZmRlZiBfQlNEX1NPVVJDRQotIyAgICAgICAgZGVmaW5lIFBOR19TQVZFX0JTRF9TT1VSQ0UKLSMgICAgICAgIHVuZGVmIF9CU0RfU09VUkNFCi0jICAgICAgZW5kaWYKLSMgICAgICBpZmRlZiBfU0VUSk1QX0gKLSAgICAgICAvKiBJZiB5b3UgZW5jb3VudGVyIGEgY29tcGlsZXIgZXJyb3IgaGVyZSwgc2VlIHRoZSBleHBsYW5hdGlvbgotICAgICAgICAqIG5lYXIgdGhlIGVuZCBvZiBJTlNUQUxMLgotICAgICAgICAqLwotICAgICAgICAgICBfX3BuZ2NvbmYuaF9fIGluIGxpYnBuZyBhbHJlYWR5IGluY2x1ZGVzIHNldGptcC5oOwotICAgICAgICAgICBfX2RvbnRfXyBpbmNsdWRlIGl0IGFnYWluLjsKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZiAvKiBfX2xpbnV4X18gKi8KLSMgIGVuZGlmIC8qIFBOR19TS0lQX1NFVEpNUF9DSEVDSyAqLwotCi0gICAvKiBpbmNsdWRlIHNldGptcC5oIGZvciBlcnJvciBoYW5kbGluZyAqLwotIyAgaW5jbHVkZSA8c2V0am1wLmg+Ci0KLSMgIGlmZGVmIF9fbGludXhfXwotIyAgICBpZmRlZiBQTkdfU0FWRV9CU0RfU09VUkNFCi0jICAgICAgaWZuZGVmIF9CU0RfU09VUkNFCi0jICAgICAgICBkZWZpbmUgX0JTRF9TT1VSQ0UKLSMgICAgICBlbmRpZgotIyAgICAgIHVuZGVmIFBOR19TQVZFX0JTRF9TT1VSQ0UKLSMgICAgZW5kaWYKLSMgIGVuZGlmIC8qIF9fbGludXhfXyAqLwotI2VuZGlmIC8qIFBOR19TRVRKTVBfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBCU0QKLSMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbHNlCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0vKiBPdGhlciBkZWZpbmVzIGZvciB0aGluZ3MgbGlrZSBtZW1vcnkgYW5kIHRoZSBsaWtlIGNhbiBnbyBoZXJlLiAgKi8KLSNpZmRlZiBQTkdfSU5URVJOQUwKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0vKiBUaGUgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFBOR19FWFRFUk4gYXJlIFBOR19JTlRFUk5BTCBmdW5jdGlvbnMsIHdoaWNoCi0gKiBhcmVuJ3QgdXN1YWxseSB1c2VkIG91dHNpZGUgdGhlIGxpYnJhcnkgKGFzIGZhciBhcyBJIGtub3cpLCBzbyBpdCBpcwotICogZGViYXRhYmxlIGlmIHRoZXkgc2hvdWxkIGJlIGV4cG9ydGVkIGF0IGFsbC4gIEluIHRoZSBmdXR1cmUsIHdoZW4gaXQgaXMKLSAqIHBvc3NpYmxlIHRvIGhhdmUgcnVuLXRpbWUgcmVnaXN0cnkgb2YgY2h1bmstaGFuZGxpbmcgZnVuY3Rpb25zLCBzb21lIG9mCi0gKiB0aGVzZSB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGFnYWluLgotI2RlZmluZSBQTkdfRVhURVJOIGV4dGVybgotICovCi0jZGVmaW5lIFBOR19FWFRFUk4KLQotLyogT3RoZXIgZGVmaW5lcyBzcGVjaWZpYyB0byBjb21waWxlcnMgY2FuIGdvIGhlcmUuICBUcnkgdG8ga2VlcAotICogdGhlbSBpbnNpZGUgYW4gYXBwcm9wcmlhdGUgaWZkZWYvZW5kaWYgcGFpciBmb3IgcG9ydGFiaWxpdHkuCi0gKi8KLQotI2lmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKLSMgIGlmIGRlZmluZWQoTUFDT1MpCi0gICAgIC8qIFdlIG5lZWQgdG8gY2hlY2sgdGhhdCA8bWF0aC5oPiBoYXNuJ3QgYWxyZWFkeSBiZWVuIGluY2x1ZGVkIGVhcmxpZXIKLSAgICAgICogYXMgaXQgc2VlbXMgaXQgZG9lc24ndCBhZ3JlZSB3aXRoIDxmcC5oPiwgeWV0IHdlIHNob3VsZCByZWFsbHkgdXNlCi0gICAgICAqIDxmcC5oPiBpZiBwb3NzaWJsZS4KLSAgICAgICovCi0jICAgIGlmICFkZWZpbmVkKF9fTUFUSF9IX18pICYmICFkZWZpbmVkKF9fTUFUSF9IKSAmJiAhZGVmaW5lZChfX2NtYXRoX18pCi0jICAgICAgaW5jbHVkZSA8ZnAuaD4KLSMgICAgZW5kaWYKLSMgIGVsc2UKLSMgICAgaW5jbHVkZSA8bWF0aC5oPgotIyAgZW5kaWYKLSMgIGlmIGRlZmluZWQoX0FNSUdBKSAmJiBkZWZpbmVkKF9fU0FTQykgJiYgZGVmaW5lZChfTTY4ODgxKQotICAgICAvKiBBbWlnYSBTQVMvQzogV2UgbXVzdCBpbmNsdWRlIGJ1aWx0aW4gRlBVIGZ1bmN0aW9ucyB3aGVuIGNvbXBpbGluZyB1c2luZwotICAgICAgKiBNQVRIPTY4ODgxCi0gICAgICAqLwotIyAgICBpbmNsdWRlIDxtNjg4ODEuaD4KLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogQ29kZXdhcnJpb3Igb24gTlQgaGFzIGxpbmtpbmcgcHJvYmxlbXMgd2l0aG91dCB0aGlzLiAqLwotI2lmIChkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQoV0lOMzIpKSB8fCBkZWZpbmVkKF9fU1REQ19fKQotIyAgZGVmaW5lIFBOR19BTFdBWVNfRVhURVJOCi0jZW5kaWYKLQotLyogVGhpcyBwcm92aWRlcyB0aGUgbm9uLUFOU0kgKGZhcikgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuICovCi0jaWYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiBkZWZpbmVkKF9fTVNET1NfXykKLSMgIGluY2x1ZGUgPG1lbS5oPgotIyAgaW5jbHVkZSA8YWxsb2MuaD4KLSNlbmRpZgotCi0vKiBJIGhhdmUgbm8gaWRlYSB3aHkgaXMgdGhpcyBuZWNlc3NhcnkuLi4gKi8KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV2luZG93cykgfHwgXAotICAgIGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykpCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSNlbmRpZgotCi0vKiBUaGlzIGNvbnRyb2xzIGhvdyBmaW5lIHRoZSBkaXRoZXJpbmcgZ2V0cy4gIEFzIHRoaXMgYWxsb2NhdGVzCi0gKiBhIGxhcmdpc2ggY2h1bmsgb2YgbWVtb3J5ICgzMkspLCB0aG9zZSB3aG8gYXJlIG5vdCBhcyBjb25jZXJuZWQKLSAqIHdpdGggZGl0aGVyaW5nIHF1YWxpdHkgY2FuIGRlY3JlYXNlIHNvbWUgb3IgYWxsIG9mIHRoZXNlLgotICovCi0jaWZuZGVmIFBOR19ESVRIRVJfUkVEX0JJVFMKLSMgIGRlZmluZSBQTkdfRElUSEVSX1JFRF9CSVRTIDUKLSNlbmRpZgotI2lmbmRlZiBQTkdfRElUSEVSX0dSRUVOX0JJVFMKLSMgIGRlZmluZSBQTkdfRElUSEVSX0dSRUVOX0JJVFMgNQotI2VuZGlmCi0jaWZuZGVmIFBOR19ESVRIRVJfQkxVRV9CSVRTCi0jICBkZWZpbmUgUE5HX0RJVEhFUl9CTFVFX0JJVFMgNQotI2VuZGlmCi0KLS8qIFRoaXMgY29udHJvbHMgaG93IGZpbmUgdGhlIGdhbW1hIGNvcnJlY3Rpb24gYmVjb21lcyB3aGVuIHlvdQotICogYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiA4IGJpdHMgYW55d2F5LiAgSW5jcmVhc2luZyB0aGlzIHZhbHVlCi0gKiByZXN1bHRzIGluIG1vcmUgbWVtb3J5IGJlaW5nIHVzZWQsIGFuZCBtb3JlIHBvdygpIGZ1bmN0aW9ucwotICogYmVpbmcgY2FsbGVkIHRvIGZpbGwgaW4gdGhlIGdhbW1hIHRhYmxlcy4gIERvbid0IHNldCB0aGlzIHZhbHVlCi0gKiBsZXNzIHRoZW4gOCwgYW5kIGV2ZW4gdGhhdCBtYXkgbm90IHdvcmsgKEkgaGF2ZW4ndCB0ZXN0ZWQgaXQpLgotICovCi0KLSNpZm5kZWYgUE5HX01BWF9HQU1NQV84Ci0jICBkZWZpbmUgUE5HX01BWF9HQU1NQV84IDExCi0jZW5kaWYKLQotLyogVGhpcyBjb250cm9scyBob3cgbXVjaCBhIGRpZmZlcmVuY2UgaW4gZ2FtbWEgd2UgY2FuIHRvbGVyYXRlIGJlZm9yZQotICogd2UgYWN0dWFsbHkgc3RhcnQgZG9pbmcgZ2FtbWEgY29udmVyc2lvbi4KLSAqLwotI2lmbmRlZiBQTkdfR0FNTUFfVEhSRVNIT0xECi0jICBkZWZpbmUgUE5HX0dBTU1BX1RIUkVTSE9MRCAwLjA1Ci0jZW5kaWYKLQotI2VuZGlmIC8qIFBOR19JTlRFUk5BTCAqLwotCi0vKiBUaGUgZm9sbG93aW5nIHVzZXMgY29uc3QgY2hhciAqIGluc3RlYWQgb2YgY2hhciAqIGZvciBlcnJvcgotICogYW5kIHdhcm5pbmcgbWVzc2FnZSBmdW5jdGlvbnMsIHNvIHNvbWUgY29tcGlsZXJzIHdvbid0IGNvbXBsYWluLgotICogSWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSBjb25zdCwgZGVmaW5lIFBOR19OT19DT05TVCBoZXJlLgotICovCi0KLSNpZm5kZWYgUE5HX05PX0NPTlNUCi0jICBkZWZpbmUgUE5HX0NPTlNUIGNvbnN0Ci0jZWxzZQotIyAgZGVmaW5lIFBOR19DT05TVAotI2VuZGlmCi0KLS8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBnaXZlIHlvdSB0aGUgYWJpbGl0eSB0byByZW1vdmUgY29kZSBmcm9tIHRoZQotICogbGlicmFyeSB0aGF0IHlvdSB3aWxsIG5vdCBiZSB1c2luZy4gIEkgd2lzaCBJIGNvdWxkIGZpZ3VyZSBvdXQgaG93IHRvCi0gKiBhdXRvbWF0ZSB0aGlzLCBidXQgSSBjYW4ndCBkbyB0aGF0IHdpdGhvdXQgbWFraW5nIGl0IHNlcmlvdXNseSBoYXJkCi0gKiBvbiB0aGUgdXNlcnMuICBTbyBpZiB5b3UgYXJlIG5vdCB1c2luZyBhbiBhYmlsaXR5LCBjaGFuZ2UgdGhlICNkZWZpbmUKLSAqIHRvIGFuZCAjdW5kZWYsIGFuZCB0aGF0IHBhcnQgb2YgdGhlIGxpYnJhcnkgd2lsbCBub3QgYmUgY29tcGlsZWQuICBJZgotICogeW91ciBsaW5rZXIgY2FuJ3QgZmluZCBhIGZ1bmN0aW9uLCB5b3UgbWF5IHdhbnQgdG8gbWFrZSBzdXJlIHRoZQotICogYWJpbGl0eSBpcyBkZWZpbmVkIGhlcmUuICBTb21lIG9mIHRoZXNlIGRlcGVuZCB1cG9uIHNvbWUgb3RoZXJzIGJlaW5nCi0gKiBkZWZpbmVkLiAgSSBoYXZlbid0IGZpZ3VyZWQgb3V0IGFsbCB0aGUgaW50ZXJhY3Rpb25zIGhlcmUsIHNvIHlvdSBtYXkKLSAqIGhhdmUgdG8gZXhwZXJpbWVudCBhd2hpbGUgdG8gZ2V0IGV2ZXJ5dGhpbmcgdG8gY29tcGlsZS4gIElmIHlvdSBhcmUKLSAqIGNyZWF0aW5nIG9yIHVzaW5nIGEgc2hhcmVkIGxpYnJhcnksIHlvdSBwcm9iYWJseSBzaG91bGRuJ3QgdG91Y2ggdGhpcywKLSAqIGFzIGl0IHdpbGwgYWZmZWN0IHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmVzLCBhbmQgdGhpcyB3aWxsIGNhdXNlIGJhZAotICogdGhpbmdzIHRvIGhhcHBlbiBpZiB0aGUgbGlicmFyeSBhbmQvb3IgYXBwbGljYXRpb24gZXZlciBjaGFuZ2UuCi0gKi8KLQotLyogQW55IGZlYXR1cmVzIHlvdSB3aWxsIG5vdCBiZSB1c2luZyBjYW4gYmUgdW5kZWYnZWQgaGVyZSAqLwotCi0vKiBHUi1QLCAwLjk2YTogU2V0ICIqVFJBTlNGT1JNU19TVVBQT1JURUQgYXMgZGVmYXVsdCBidXQgYWxsb3cgdXNlcgotICogdG8gdHVybiBpdCBvZmYgd2l0aCAiKlRSQU5TRk9STVNfTk9UX1NVUFBPUlRFRCIgb3IgKlBOR19OT18qX1RSQU5TRk9STVMKLSAqIG9uIHRoZSBjb21waWxlIGxpbmUsIHRoZW4gcGljayBhbmQgY2hvb3NlIHdoaWNoIG9uZXMgdG8gZGVmaW5lIHdpdGhvdXQKLSAqIGhhdmluZyB0byBlZGl0IHRoaXMgZmlsZS4gSXQgaXMgc2FmZSB0byB1c2UgdGhlICpUUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQKLSAqIGlmIHlvdSBvbmx5IHdhbnQgdG8gaGF2ZSBhIHBuZy1jb21wbGlhbnQgcmVhZGVyL3dyaXRlciBidXQgZG9uJ3QgbmVlZAotICogYW55IG9mIHRoZSBleHRyYSB0cmFuc2Zvcm1hdGlvbnMuICBUaGlzIHNhdmVzIGFib3V0IDgwIGtieXRlcyBpbiBhCi0gKiB0eXBpY2FsIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4gKFBOR19OT18qIGZvcm0gYWRkZWQgaW4gdmVyc2lvbgotICogMS4wLjFjLCBmb3IgY29uc2lzdGVuY3kpCi0gKi8KLQotLyogVGhlIHNpemUgb2YgdGhlIHBuZ190ZXh0IHN0cnVjdHVyZSBjaGFuZ2VkIGluIGxpYnBuZy0xLjAuNiB3aGVuCi0gKiBpVFh0IHN1cHBvcnQgd2FzIGFkZGVkLiAgaVRYdCBzdXBwb3J0IHdhcyB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQgdGhyb3VnaAotICogbGlicG5nLTEuMi54LCB0byBzdXBwb3J0IG9sZCBhcHBzIHRoYXQgbWFsbG9jIHRoZSBwbmdfdGV4dCBzdHJ1Y3R1cmUKLSAqIGluc3RlYWQgb2YgY2FsbGluZyBwbmdfc2V0X3RleHQoKSBhbmQgbGV0dGluZyBsaWJwbmcgbWFsbG9jIGl0LiAgSXQKLSAqIHdhcyB0dXJuZWQgb24gYnkgZGVmYXVsdCBpbiBsaWJwbmctMS4zLjAuCi0gKi8KLQotI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkIChQTkdfMV8yX1gpCi0jICBpZm5kZWYgUE5HX05PX2lUWHRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfTk9faVRYdF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfaVRYdAotIyAgICBkZWZpbmUgUE5HX05PX1JFQURfaVRYdAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfaVRYdAotIyAgICBkZWZpbmUgUE5HX05PX1dSSVRFX2lUWHQKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFBOR19OT19pVFh0X1NVUFBPUlRFRCkKLSMgIGlmICFkZWZpbmVkKFBOR19SRUFEX2lUWHRfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfTk9fUkVBRF9pVFh0KQotIyAgICBkZWZpbmUgUE5HX1JFQURfaVRYdAotIyAgZW5kaWYKLSMgIGlmICFkZWZpbmVkKFBOR19XUklURV9pVFh0X1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX05PX1dSSVRFX2lUWHQpCi0jICAgIGRlZmluZSBQTkdfV1JJVEVfaVRYdAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBUaGUgZm9sbG93aW5nIHN1cHBvcnQsIGFkZGVkIGFmdGVyIHZlcnNpb24gMS4wLjAsIGNhbiBiZSB0dXJuZWQgb2ZmIGhlcmUgZW4KLSAqIG1hc3NlIGJ5IGRlZmluaW5nIFBOR19MRUdBQ1lfU1VQUE9SVEVEIGluIGNhc2UgeW91IG5lZWQgYmluYXJ5IGNvbXBhdGliaWxpdHkKLSAqIHdpdGggb2xkIGFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgdGhlIGxlbmd0aCBvZiBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbwotICogdG8gcmVtYWluIHVuY2hhbmdlZC4KLSAqLwotCi0jaWZkZWYgUE5HX0xFR0FDWV9TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfTk9fRlJFRV9NRQotIyAgZGVmaW5lIFBOR19OT19SRUFEX1VOS05PV05fQ0hVTktTCi0jICBkZWZpbmUgUE5HX05PX1dSSVRFX1VOS05PV05fQ0hVTktTCi0jICBkZWZpbmUgUE5HX05PX1JFQURfVVNFUl9DSFVOS1MKLSMgIGRlZmluZSBQTkdfTk9fUkVBRF9pQ0NQCi0jICBkZWZpbmUgUE5HX05PX1dSSVRFX2lDQ1AKLSMgIGRlZmluZSBQTkdfTk9fUkVBRF9pVFh0Ci0jICBkZWZpbmUgUE5HX05PX1dSSVRFX2lUWHQKLSMgIGRlZmluZSBQTkdfTk9fUkVBRF9zQ0FMCi0jICBkZWZpbmUgUE5HX05PX1dSSVRFX3NDQUwKLSMgIGRlZmluZSBQTkdfTk9fUkVBRF9zUExUCi0jICBkZWZpbmUgUE5HX05PX1dSSVRFX3NQTFQKLSMgIGRlZmluZSBQTkdfTk9fSU5GT19JTUFHRQotIyAgZGVmaW5lIFBOR19OT19SRUFEX1JHQl9UT19HUkFZCi0jICBkZWZpbmUgUE5HX05PX1JFQURfVVNFUl9UUkFOU0ZPUk0KLSMgIGRlZmluZSBQTkdfTk9fV1JJVEVfVVNFUl9UUkFOU0ZPUk0KLSMgIGRlZmluZSBQTkdfTk9fVVNFUl9NRU0KLSMgIGRlZmluZSBQTkdfTk9fUkVBRF9FTVBUWV9QTFRFCi0jICBkZWZpbmUgUE5HX05PX01OR19GRUFUVVJFUwotIyAgZGVmaW5lIFBOR19OT19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSNlbmRpZgotCi0vKiBJZ25vcmUgYXR0ZW1wdCB0byB0dXJuIG9mZiBib3RoIGZsb2F0aW5nIGFuZCBmaXhlZCBwb2ludCBzdXBwb3J0ICovCi0jaWYgIWRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkgfHwgXAotICAgICFkZWZpbmVkKFBOR19OT19GSVhFRF9QT0lOVF9TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotI2VuZGlmCi0KLSNpZm5kZWYgUE5HX05PX0ZSRUVfTUUKLSMgIGRlZmluZSBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpCi0KLSNpZiAhZGVmaW5lZChQTkdfUkVBRF9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQpICYmIFwKLSAgICAgICFkZWZpbmVkKFBOR19OT19SRUFEX1RSQU5TRk9STVMpCi0jICBkZWZpbmUgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfTk9fUkVBRF9FWFBBTkQKLSMgICAgZGVmaW5lIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfU0hJRlQKLSMgICAgZGVmaW5lIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fUkVBRF9QQUNLCi0jICAgIGRlZmluZSBQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fUkVBRF9CR1IKLSMgICAgZGVmaW5lIFBOR19SRUFEX0JHUl9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfU1dBUAotIyAgICBkZWZpbmUgUE5HX1JFQURfU1dBUF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfUEFDS1NXQVAKLSMgICAgZGVmaW5lIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fUkVBRF9JTlZFUlQKLSMgICAgZGVmaW5lIFBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfRElUSEVSCi0jICAgIGRlZmluZSBQTkdfUkVBRF9ESVRIRVJfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX0JBQ0tHUk9VTkQKLSMgICAgZGVmaW5lIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEXzE2X1RPXzgKLSMgICAgZGVmaW5lIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX0ZJTExFUgotIyAgICBkZWZpbmUgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fUkVBRF9HQU1NQQotIyAgICBkZWZpbmUgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX0dSQVlfVE9fUkdCCi0jICAgIGRlZmluZSBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfU1dBUF9BTFBIQQotIyAgICBkZWZpbmUgUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfSU5WRVJUX0FMUEhBCi0jICAgIGRlZmluZSBQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19SRUFEX1NUUklQX0FMUEhBCi0jICAgIGRlZmluZSBQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1JFQURfVVNFUl9UUkFOU0ZPUk0KLSMgICAgZGVmaW5lIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fUkVBRF9SR0JfVE9fR1JBWQotIyAgICBkZWZpbmUgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmIC8qIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEICovCi0KLSNpZiAhZGVmaW5lZChQTkdfTk9fUFJPR1JFU1NJVkVfUkVBRCkgJiYgXAotICFkZWZpbmVkKFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRCkgLyogaWYgeW91IGRvbid0IGRvIHByb2dyZXNzaXZlICAgKi8KLSMgIGRlZmluZSBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQgIC8qIHJlYWRpbmcuICBUaGlzIGlzIG5vdCB0YWxraW5nICovCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWJvdXQgaW50ZXJsYWNpbmcgY2FwYWJpbGl0eSEgIFlvdSdsbCAqLwotICAgICAgICAgICAvKiBzdGlsbCBoYXZlIGludGVybGFjaW5nIHVubGVzcyB5b3UgY2hhbmdlIHRoZSBmb2xsb3dpbmcgbGluZTogKi8KLQotI2RlZmluZSBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgLyogcmVxdWlyZWQgaW4gUE5HLWNvbXBsaWFudCBkZWNvZGVycyAqLwotCi0jaWZuZGVmIFBOR19OT19SRUFEX0NPTVBPU0lURV9OT0RJVgotIyAgaWZuZGVmIFBOR19OT19SRUFEX0NPTVBPU0lURURfTk9ESVYgIC8qIGxpYnBuZy0xLjAueCBtaXNzcGVsbGluZyAqLwotIyAgICBkZWZpbmUgUE5HX1JFQURfQ09NUE9TSVRFX05PRElWX1NVUFBPUlRFRCAgLyogd2VsbCB0ZXN0ZWQgb24gSW50ZWwsIFNHSSAqLwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfMV8wX1gpIHx8IGRlZmluZWQgKFBOR18xXzJfWCkKLS8qIERlcHJlY2F0ZWQsIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHZlcnNpb24gMi4wLjAuCi0gICBVc2UgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQgaW5zdGVhZC4gKi8KLSNpZm5kZWYgUE5HX05PX1JFQURfRU1QVFlfUExURQotIyAgZGVmaW5lIFBOR19SRUFEX0VNUFRZX1BMVEVfU1VQUE9SVEVECi0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCi0KLSMgaWYgIWRlZmluZWQoUE5HX1dSSVRFX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRCkgJiYgXAotICAgICFkZWZpbmVkKFBOR19OT19XUklURV9UUkFOU0ZPUk1TKQotIyAgZGVmaW5lIFBOR19XUklURV9UUkFOU0ZPUk1TX1NVUFBPUlRFRAotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfVFJBTlNGT1JNU19TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfU0hJRlQKLSMgICAgZGVmaW5lIFBOR19XUklURV9TSElGVF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1dSSVRFX1BBQ0sKLSMgICAgZGVmaW5lIFBOR19XUklURV9QQUNLX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfQkdSCi0jICAgIGRlZmluZSBQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfU1dBUAotIyAgICBkZWZpbmUgUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19XUklURV9QQUNLU1dBUAotIyAgICBkZWZpbmUgUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfSU5WRVJUCi0jICAgIGRlZmluZSBQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfRklMTEVSCi0jICAgIGRlZmluZSBQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCAgIC8qIHNhbWUgYXMgV1JJVEVfU1RSSVBfQUxQSEEgKi8KLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX1dSSVRFX1NXQVBfQUxQSEEKLSMgICAgZGVmaW5lIFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfSU5WRVJUX0FMUEhBCi0jICAgIGRlZmluZSBQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfTk9fV1JJVEVfVVNFUl9UUkFOU0ZPUk0KLSMgICAgZGVmaW5lIFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYgLyogUE5HX1dSSVRFX1RSQU5TRk9STVNfU1VQUE9SVEVEICovCi0KLSNpZiAhZGVmaW5lZChQTkdfTk9fV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEKSAmJiBcCi0gICAgIWRlZmluZWQoUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkKLSNkZWZpbmUgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCAgLyogbm90IHJlcXVpcmVkIGZvciBQTkctY29tcGxpYW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXJzLCBidXQgY2FuIGNhdXNlIHRyb3VibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVmdCB1bmRlZmluZWQgKi8KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUE5HX05PX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUikgJiYgXAotICAgICFkZWZpbmVkKFBOR19XUklURV9XRUlHSFRFRF9GSUxURVIpICYmIFwKLSAgICAgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotIyAgZGVmaW5lIFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVECi0jZW5kaWYKLQotI2lmbmRlZiBQTkdfTk9fV1JJVEVfRkxVU0gKLSMgIGRlZmluZSBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkIChQTkdfMV8yX1gpCi0vKiBEZXByZWNhdGVkLCBzZWUgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQsIGFib3ZlICovCi0jaWZuZGVmIFBOR19OT19XUklURV9FTVBUWV9QTFRFCi0jICBkZWZpbmUgUE5HX1dSSVRFX0VNUFRZX1BMVEVfU1VQUE9SVEVECi0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYgLyogUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwotCi0jaWZuZGVmIFBOR18xXzBfWAotIyAgaWZuZGVmIFBOR19OT19FUlJPUl9OVU1CRVJTCi0jICAgIGRlZmluZSBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYgLyogUE5HXzFfMF9YICovCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKLSMgIGlmbmRlZiBQTkdfTk9fVVNFUl9UUkFOU0ZPUk1fUFRSCi0jICAgIGRlZmluZSBQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFBOR19OT19TVERJTwotIyAgZGVmaW5lIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECi0jZW5kaWYKLQotLyogVGhpcyBhZGRzIGV4dHJhIGZ1bmN0aW9ucyBpbiBwbmdnZXQuYyBmb3IgYWNjZXNzaW5nIGRhdGEgZnJvbSB0aGUKLSAqIGluZm8gcG9pbnRlciAoYWRkZWQgaW4gdmVyc2lvbiAwLjk5KQotICogcG5nX2dldF9pbWFnZV93aWR0aCgpCi0gKiBwbmdfZ2V0X2ltYWdlX2hlaWdodCgpCi0gKiBwbmdfZ2V0X2JpdF9kZXB0aCgpCi0gKiBwbmdfZ2V0X2NvbG9yX3R5cGUoKQotICogcG5nX2dldF9jb21wcmVzc2lvbl90eXBlKCkKLSAqIHBuZ19nZXRfZmlsdGVyX3R5cGUoKQotICogcG5nX2dldF9pbnRlcmxhY2VfdHlwZSgpCi0gKiBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpbygpCi0gKiBwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIoKQotICogcG5nX2dldF94X29mZnNldF9waXhlbHMoKQotICogcG5nX2dldF95X29mZnNldF9waXhlbHMoKQotICogcG5nX2dldF94X29mZnNldF9taWNyb25zKCkKLSAqIHBuZ19nZXRfeV9vZmZzZXRfbWljcm9ucygpCi0gKi8KLSNpZiAhZGVmaW5lZChQTkdfTk9fRUFTWV9BQ0NFU1MpICYmICFkZWZpbmVkKFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX0VBU1lfQUNDRVNTX1NVUFBPUlRFRAotI2VuZGlmCi0KLS8qIFBOR19BU1NFTUJMRVJfQ09ERSB3YXMgZW5hYmxlZCBieSBkZWZhdWx0IGluIHZlcnNpb24gMS4yLjAgCi0gKiBhbmQgcmVtb3ZlZCBmcm9tIHZlcnNpb24gMS4yLjIwLiAgVGhlIGZvbGxvd2luZyB3aWxsIGJlIHJlbW92ZWQKLSAqIGZyb20gbGlicG5nLTEuNC4wCi0qLwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19OT19PUFRJTUlaRURfQ09ERSkKLSMgIGlmbmRlZiBQTkdfT1BUSU1JWkVEX0NPREVfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfT1BUSU1JWkVEX0NPREVfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX05PX0FTU0VNQkxFUl9DT0RFKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQotIyAgaWZuZGVmIFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQKLSMgIGVuZGlmCi0KLSMgIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX194ODZfNjRfXykgJiYgKF9fR05VQ19fIDwgNCkKLSAgICAgLyogd29yayBhcm91bmQgNjQtYml0IGdjYyBjb21waWxlciBidWdzIGluIGdjYy0zLnggKi8KLSMgICAgaWYgIWRlZmluZWQoUE5HX01NWF9DT0RFX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX05PX01NWF9DT0RFKQotIyAgICAgIGRlZmluZSBQTkdfTk9fTU1YX0NPREUKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0KLSMgIGlmIGRlZmluZWQoX19BUFBMRV9fKQotIyAgICBpZiAhZGVmaW5lZChQTkdfTU1YX0NPREVfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfTk9fTU1YX0NPREUpCi0jICAgICAgZGVmaW5lIFBOR19OT19NTVhfQ09ERQotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotIyAgaWYgKGRlZmluZWQoX19NV0VSS1NfXykgJiYgKChfX01XRVJLU19fIDwgMHgwOTAwKSB8fCBtYWNpbnRvc2gpKQotIyAgICBpZiAhZGVmaW5lZChQTkdfTU1YX0NPREVfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfTk9fTU1YX0NPREUpCi0jICAgICAgZGVmaW5lIFBOR19OT19NTVhfQ09ERQotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotIyAgaWYgIWRlZmluZWQoUE5HX01NWF9DT0RFX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX05PX01NWF9DT0RFKQotIyAgICBkZWZpbmUgUE5HX01NWF9DT0RFX1NVUFBPUlRFRAotIyAgZW5kaWYKLQotI2VuZGlmCi0vKiBlbmQgb2Ygb2Jzb2xldGUgY29kZSB0byBiZSByZW1vdmVkIGZyb20gbGlicG5nLTEuNC4wICovCi0KLSNpZiAhZGVmaW5lZChQTkdfMV8wX1gpCi0jaWYgIWRlZmluZWQoUE5HX05PX1VTRVJfTUVNKSAmJiAhZGVmaW5lZChQTkdfVVNFUl9NRU1fU1VQUE9SVEVEKQotIyAgZGVmaW5lIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSNlbmRpZgotI2VuZGlmIC8qIFBOR18xXzBfWCAqLwotCi0vKiBBZGRlZCBhdCBsaWJwbmctMS4yLjYgKi8KLSNpZiAhZGVmaW5lZChQTkdfMV8wX1gpCi0jaWZuZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0jaWYgIWRlZmluZWQoUE5HX05PX1NFVF9VU0VSX0xJTUlUUykgJiYgIWRlZmluZWQoUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYgLyogUE5HXzFfMF9YICovCi0KLS8qIEFkZGVkIGF0IGxpYnBuZy0xLjAuMTYgYW5kIDEuMi42LiAgVG8gYWNjZXB0IGFsbCB2YWxpZCBQTkdTIG5vIG1hdHRlcgotICogaG93IGxhcmdlLCBzZXQgdGhlc2UgbGltaXRzIHRvIDB4N2ZmZmZmZmZMCi0gKi8KLSNpZm5kZWYgUE5HX1VTRVJfV0lEVEhfTUFYCi0jICBkZWZpbmUgUE5HX1VTRVJfV0lEVEhfTUFYIDEwMDAwMDBMCi0jZW5kaWYKLSNpZm5kZWYgUE5HX1VTRVJfSEVJR0hUX01BWAotIyAgZGVmaW5lIFBOR19VU0VSX0hFSUdIVF9NQVggMTAwMDAwMEwKLSNlbmRpZgotCi0vKiBBZGRlZCBhdCBsaWJwbmctMS4yLjM0IGFuZCAxLjQuMCAqLwotI2lmbmRlZiBQTkdfU1RSSU5HX05FV0xJTkUKLSNkZWZpbmUgUE5HX1NUUklOR19ORVdMSU5FICJcbiIKLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgY3VycmVudGx5IGV4cGVyaW1lbnRhbCBmZWF0dXJlcywgZGVmaW5lIHRoZW0gaWYgeW91IHdhbnQgKi8KLQotLyogdmVyeSBsaXR0bGUgdGVzdGluZyAqLwotLyoKLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfUkVBRF8xNl9UT184X0FDQ1VSQVRFX1NDQUxFX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX1JFQURfMTZfVE9fOF9BQ0NVUkFURV9TQ0FMRV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSovCi0KLS8qIFRoaXMgaXMgb25seSBmb3IgUG93ZXJQQyBiaWctZW5kaWFuIGFuZCA2ODB4MCBzeXN0ZW1zICovCi0vKiBzb21lIHRlc3RpbmcgKi8KLS8qCi0jaWZuZGVmIFBOR19SRUFEX0JJR19FTkRJQU5fU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX1JFQURfQklHX0VORElBTl9TVVBQT1JURUQKLSNlbmRpZgotKi8KLQotLyogQnVnZ3kgY29tcGlsZXJzIChlLmcuLCBnY2MgMi43LjIuMikgbmVlZCB0aGlzICovCi0vKgotI2RlZmluZSBQTkdfTk9fUE9JTlRFUl9JTkRFWElORwotKi8KLQotLyogVGhlc2UgZnVuY3Rpb25zIGFyZSB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQsIGFzIHRoZXkgd2lsbCBiZSBwaGFzZWQgb3V0LiAqLwotLyoKLSNkZWZpbmUgIFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRAotI2RlZmluZSAgUE5HX0NPUlJFQ1RfUEFMRVRURV9TVVBQT1JURUQKLSovCi0KLS8qIEFueSBjaHVua3MgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiwgeW91IGNhbiB1bmRlZiBoZXJlLiAgVGhlCi0gKiBvbmVzIHRoYXQgYWxsb2NhdGUgbWVtb3J5IG1heSBiZSBleHBlY2lhbGx5IGltcG9ydGFudCAoaElTVCwKLSAqIHRFWHQsIHpUWHQsIHRSTlMsIHBDQUwpLiAgT3RoZXJzIHdpbGwganVzdCBzYXZlIHRpbWUgYW5kIG1ha2UgcG5nX2luZm8KLSAqIGEgYml0IHNtYWxsZXIuCi0gKi8KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSAmJiBcCi0gICAgIWRlZmluZWQoUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVEKSAmJiBcCi0gICAgIWRlZmluZWQoUE5HX05PX1JFQURfQU5DSUxMQVJZX0NIVU5LUykKLSMgIGRlZmluZSBQTkdfUkVBRF9BTkNJTExBUllfQ0hVTktTX1NVUFBPUlRFRAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpICYmIFwKLSAgICAhZGVmaW5lZChQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVEKSAmJiBcCi0gICAgIWRlZmluZWQoUE5HX05PX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1MpCi0jICBkZWZpbmUgUE5HX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1NfU1VQUE9SVEVECi0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX0FOQ0lMTEFSWV9DSFVOS1NfU1VQUE9SVEVECi0KLSNpZmRlZiBQTkdfTk9fUkVBRF9URVhUCi0jICBkZWZpbmUgUE5HX05PX1JFQURfaVRYdAotIyAgZGVmaW5lIFBOR19OT19SRUFEX3RFWHQKLSMgIGRlZmluZSBQTkdfTk9fUkVBRF96VFh0Ci0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfYktHRAotIyAgZGVmaW5lIFBOR19SRUFEX2JLR0RfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX2JLR0RfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfY0hSTQotIyAgZGVmaW5lIFBOR19SRUFEX2NIUk1fU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX2NIUk1fU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfZ0FNQQotIyAgZGVmaW5lIFBOR19SRUFEX2dBTUFfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX2dBTUFfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfaElTVAotIyAgZGVmaW5lIFBOR19SRUFEX2hJU1RfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX2hJU1RfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfaUNDUAotIyAgZGVmaW5lIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX2lDQ1BfU1VQUE9SVEVECi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1JFQURfaVRYdAotIyAgaWZuZGVmIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAotIyAgZW5kaWYKLSMgIGlmbmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19pVFh0X1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF9vRkZzCi0jICBkZWZpbmUgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfb0ZGc19TVVBQT1JURUQKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF9wQ0FMCi0jICBkZWZpbmUgUE5HX1JFQURfcENBTF9TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfcENBTF9TVVBQT1JURUQKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF9zQ0FMCi0jICBkZWZpbmUgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfc0NBTF9TVVBQT1JURUQKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF9wSFlzCi0jICBkZWZpbmUgUE5HX1JFQURfcEhZc19TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfcEhZc19TVVBQT1JURUQKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF9zQklUCi0jICBkZWZpbmUgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfc0JJVF9TVVBQT1JURUQKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF9zUExUCi0jICBkZWZpbmUgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfc1BMVF9TVVBQT1JURUQKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF9zUkdCCi0jICBkZWZpbmUgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfc1JHQl9TVVBQT1JURUQKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF90RVh0Ci0jICBkZWZpbmUgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfdEVYdF9TVVBQT1JURUQKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF90SU1FCi0jICBkZWZpbmUgUE5HX1JFQURfdElNRV9TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfdElNRV9TVVBQT1JURUQKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF90Uk5TCi0jICBkZWZpbmUgUE5HX1JFQURfdFJOU19TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfdFJOU19TVVBQT1JURUQKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF96VFh0Ci0jICBkZWZpbmUgUE5HX1JFQURfelRYdF9TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfelRYdF9TVVBQT1JURUQKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fUkVBRF9VTktOT1dOX0NIVU5LUwotIyAgZGVmaW5lIFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX05PX0hBTkRMRV9BU19VTktOT1dOCi0jICAgIGRlZmluZSBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWYgIWRlZmluZWQoUE5HX05PX1JFQURfVVNFUl9DSFVOS1MpICYmIFwKLSAgICAgZGVmaW5lZChQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAotIyAgaWZkZWYgUE5HX05PX1JFQURfVU5LTk9XTl9DSFVOS1MKLSMgICAgdW5kZWYgUE5HX05PX1JFQURfVU5LTk9XTl9DSFVOS1MKLSMgIGVuZGlmCi0jICBpZmRlZiBQTkdfTk9fSEFORExFX0FTX1VOS05PV04KLSMgICAgdW5kZWYgUE5HX05PX0hBTkRMRV9BU19VTktOT1dOCi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19SRUFEX09QVF9QTFRFCi0jICBkZWZpbmUgUE5HX1JFQURfT1BUX1BMVEVfU1VQUE9SVEVEIC8qIG9ubHkgYWZmZWN0cyBzdXBwb3J0IG9mIHRoZSAqLwotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgIC8qIG9wdGlvbmFsIFBMVEUgY2h1bmsgaW4gUkdCIGFuZCBSR0JBIGltYWdlcyAqLwotI2lmIGRlZmluZWQoUE5HX1JFQURfaVRYdF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfdEVYdF9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19SRUFEX3pUWHRfU1VQUE9SVEVEKQotIyAgZGVmaW5lIFBOR19SRUFEX1RFWFRfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HX1RFWFRfU1VQUE9SVEVECi0jZW5kaWYKLQotI2VuZGlmIC8qIFBOR19SRUFEX0FOQ0lMTEFSWV9DSFVOS1NfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQKLQotI2lmZGVmIFBOR19OT19XUklURV9URVhUCi0jICBkZWZpbmUgUE5HX05PX1dSSVRFX2lUWHQKLSMgIGRlZmluZSBQTkdfTk9fV1JJVEVfdEVYdAotIyAgZGVmaW5lIFBOR19OT19XUklURV96VFh0Ci0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX2JLR0QKLSMgIGRlZmluZSBQTkdfV1JJVEVfYktHRF9TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfYktHRF9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19iS0dEX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfY0hSTQotIyAgZGVmaW5lIFBOR19XUklURV9jSFJNX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19jSFJNX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX2NIUk1fU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19XUklURV9nQU1BCi0jICBkZWZpbmUgUE5HX1dSSVRFX2dBTUFfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX2dBTUFfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfZ0FNQV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX2hJU1QKLSMgIGRlZmluZSBQTkdfV1JJVEVfaElTVF9TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfaElTVF9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19oSVNUX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfaUNDUAotIyAgZGVmaW5lIFBOR19XUklURV9pQ0NQX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19pQ0NQX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX2lDQ1BfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19XUklURV9pVFh0Ci0jICBpZm5kZWYgUE5HX1dSSVRFX2lUWHRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jICBpZm5kZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfaVRYdF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX29GRnMKLSMgIGRlZmluZSBQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfb0ZGc19TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19vRkZzX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfcENBTAotIyAgZGVmaW5lIFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19wQ0FMX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX3BDQUxfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19XUklURV9zQ0FMCi0jICBkZWZpbmUgUE5HX1dSSVRFX3NDQUxfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX3NDQUxfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfc0NBTF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX3BIWXMKLSMgIGRlZmluZSBQTkdfV1JJVEVfcEhZc19TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfcEhZc19TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19wSFlzX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfc0JJVAotIyAgZGVmaW5lIFBOR19XUklURV9zQklUX1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR19zQklUX1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX3NCSVRfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19XUklURV9zUExUCi0jICBkZWZpbmUgUE5HX1dSSVRFX3NQTFRfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX3NQTFRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfc1BMVF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX3NSR0IKLSMgIGRlZmluZSBQTkdfV1JJVEVfc1JHQl9TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfc1JHQl9TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR19zUkdCX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfdEVYdAotIyAgZGVmaW5lIFBOR19XUklURV90RVh0X1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR190RVh0X1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX3RFWHRfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19XUklURV90SU1FCi0jICBkZWZpbmUgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX3RJTUVfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfdElNRV9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUE5HX05PX1dSSVRFX3RSTlMKLSMgIGRlZmluZSBQTkdfV1JJVEVfdFJOU19TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfdFJOU19TVVBQT1JURUQKLSMgICAgZGVmaW5lIFBOR190Uk5TX1NVUFBPUlRFRAotIyAgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBQTkdfTk9fV1JJVEVfelRYdAotIyAgZGVmaW5lIFBOR19XUklURV96VFh0X1NVUFBPUlRFRAotIyAgaWZuZGVmIFBOR196VFh0X1NVUFBPUlRFRAotIyAgICBkZWZpbmUgUE5HX3pUWHRfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFBOR19OT19XUklURV9VTktOT1dOX0NIVU5LUwotIyAgZGVmaW5lIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSMgIGlmbmRlZiBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0jICBlbmRpZgotIyAgaWZuZGVmIFBOR19OT19IQU5ETEVfQVNfVU5LTk9XTgotIyAgICAgaWZuZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSMgICAgICAgZGVmaW5lIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSMgICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfelRYdF9TVVBQT1JURUQpCi0jICBkZWZpbmUgUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVECi0jICBpZm5kZWYgUE5HX1RFWFRfU1VQUE9SVEVECi0jICAgIGRlZmluZSBQTkdfVEVYVF9TVVBQT1JURUQKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2VuZGlmIC8qIFBOR19XUklURV9BTkNJTExBUllfQ0hVTktTX1NVUFBPUlRFRCAqLwotCi0vKiBUdXJuIHRoaXMgb2ZmIHRvIGRpc2FibGUgcG5nX3JlYWRfcG5nKCkgYW5kCi0gKiBwbmdfd3JpdGVfcG5nKCkgYW5kIGxlYXZlIHRoZSByb3dfcG9pbnRlcnMgbWVtYmVyCi0gKiBvdXQgb2YgdGhlIGluZm8gc3RydWN0dXJlLgotICovCi0jaWZuZGVmIFBOR19OT19JTkZPX0lNQUdFCi0jICBkZWZpbmUgUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVECi0jZW5kaWYKLQotLyogbmVlZCB0aGUgdGltZSBpbmZvcm1hdGlvbiBmb3IgcmVhZGluZyB0SU1FIGNodW5rcyAqLwotI2lmIGRlZmluZWQoUE5HX3RJTUVfU1VQUE9SVEVEKQotIyAgaWYgIWRlZmluZWQoX1dJTjMyX1dDRSkKLSAgICAgLyogInRpbWUuaCIgZnVuY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NDRSAqLwotIyAgICBpbmNsdWRlIDx0aW1lLmg+Ci0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFNvbWUgdHlwZWRlZnMgdG8gZ2V0IHVzIHN0YXJ0ZWQuICBUaGVzZSBzaG91bGQgYmUgc2FmZSBvbiBtb3N0IG9mIHRoZQotICogY29tbW9uIHBsYXRmb3Jtcy4gIFRoZSB0eXBlZGVmcyBzaG91bGQgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlCi0gKiBudW1iZXJzIHN1Z2dlc3QgKGEgcG5nX3VpbnRfMzIgbXVzdCBiZSBhdCBsZWFzdCAzMiBiaXRzIGxvbmcpLCBidXQgdGhleQotICogZG9uJ3QgaGF2ZSB0byBiZSBleGFjdGx5IHRoYXQgc2l6ZS4gIFNvbWUgY29tcGlsZXJzIGRpc2xpa2UgcGFzc2luZwotICogdW5zaWduZWQgc2hvcnRzIGFzIGZ1bmN0aW9uIHBhcmFtZXRlcnMsIHNvIHlvdSBtYXkgYmUgYmV0dGVyIG9mZiB1c2luZwotICogdW5zaWduZWQgaW50IGZvciBwbmdfdWludF8xNi4gIExpa2V3aXNlLCBmb3IgNjQtYml0IHN5c3RlbXMsIHlvdSBtYXkKLSAqIHdhbnQgdG8gaGF2ZSB1bnNpZ25lZCBpbnQgZm9yIHBuZ191aW50XzMyIGluc3RlYWQgb2YgdW5zaWduZWQgbG9uZy4KLSAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgcG5nX3VpbnRfMzI7Ci10eXBlZGVmIGxvbmcgcG5nX2ludF8zMjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgcG5nX3VpbnRfMTY7Ci10eXBlZGVmIHNob3J0IHBuZ19pbnRfMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgcG5nX2J5dGU7Ci0KLS8qIFRoaXMgaXMgdXN1YWxseSBzaXplX3QuICBJdCBpcyB0eXBlZGVmJ2VkIGp1c3QgaW4gY2FzZSB5b3UgbmVlZCBpdCB0bwotICAgY2hhbmdlIChJJ20gbm90IHN1cmUgaWYgeW91IHdpbGwgb3Igbm90LCBzbyBJIHRob3VnaHQgSSdkIGJlIHNhZmUpICovCi0jaWZkZWYgUE5HX1NJWkVfVAotICAgdHlwZWRlZiBQTkdfU0laRV9UIHBuZ19zaXplX3Q7Ci0jICBkZWZpbmUgcG5nX3NpemVvZih4KSBwbmdfY29udmVydF9zaXplKHNpemVvZih4KSkKLSNlbHNlCi0gICB0eXBlZGVmIHNpemVfdCBwbmdfc2l6ZV90OwotIyAgZGVmaW5lIHBuZ19zaXplb2YoeCkgc2l6ZW9mKHgpCi0jZW5kaWYKLQotLyogVGhlIGZvbGxvd2luZyBpcyBuZWVkZWQgZm9yIG1lZGl1bSBtb2RlbCBzdXBwb3J0LiAgSXQgY2Fubm90IGJlIGluIHRoZQotICogUE5HX0lOVEVSTkFMIHNlY3Rpb24uICBOZWVkcyBtb2RpZmljYXRpb24gZm9yIG90aGVyIGNvbXBpbGVycyBiZXNpZGVzCi0gKiBNU0MuICBNb2RlbCBpbmRlcGVuZGVudCBzdXBwb3J0IGRlY2xhcmVzIGFsbCBhcnJheXMgYW5kIHBvaW50ZXJzIHRvIGJlCi0gKiBsYXJnZSB1c2luZyB0aGUgZmFyIGtleXdvcmQuICBUaGUgemxpYiB2ZXJzaW9uIHVzZWQgbXVzdCBhbHNvIHN1cHBvcnQKLSAqIG1vZGVsIGluZGVwZW5kZW50IGRhdGEuICBBcyBvZiB2ZXJzaW9uIHpsaWIgMS4wLjQsIHRoZSBuZWNlc3NhcnkgY2hhbmdlcwotICogaGF2ZSBiZWVuIG1hZGUgaW4gemxpYi4gIFRoZSBVU0VfRkFSX0tFWVdPUkQgZGVmaW5lIHRyaWdnZXJzIG90aGVyCi0gKiBjaGFuZ2VzIHRoYXQgYXJlIG5lZWRlZC4gKFRpbSBXZWduZXIpCi0gKi8KLQotLyogU2VwYXJhdGUgY29tcGlsZXIgZGVwZW5kZW5jaWVzIChwcm9ibGVtIGhlcmUgaXMgdGhhdCB6bGliLmggYWx3YXlzCi0gICBkZWZpbmVzIEZBUi4gKFNKVCkgKi8KLSNpZmRlZiBfX0JPUkxBTkRDX18KLSMgIGlmIGRlZmluZWQoX19MQVJHRV9fKSB8fCBkZWZpbmVkKF9fSFVHRV9fKSB8fCBkZWZpbmVkKF9fQ09NUEFDVF9fKQotIyAgICBkZWZpbmUgTERBVEEgMQotIyAgZWxzZQotIyAgICBkZWZpbmUgTERBVEEgMAotIyAgZW5kaWYKLSAgIC8qIEdSUjogIHdoeSBpcyBDeWd3aW4gaW4gaGVyZT8gIEN5Z3dpbiBpcyBub3QgQm9ybGFuZCBDLi4uICovCi0jICBpZiAhZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotIyAgICBkZWZpbmUgUE5HX01BWF9NQUxMT0NfNjRLCi0jICAgIGlmIChMREFUQSAhPSAxKQotIyAgICAgIGlmbmRlZiBGQVIKLSMgICAgICAgIGRlZmluZSBGQVIgX19mYXIKLSMgICAgICBlbmRpZgotIyAgICAgIGRlZmluZSBVU0VfRkFSX0tFWVdPUkQKLSMgICAgZW5kaWYgICAvKiBMREFUQSAhPSAxICovCi0gICAgIC8qIFBvc3NpYmx5IHVzZWZ1bCBmb3IgbW92aW5nIGRhdGEgb3V0IG9mIGRlZmF1bHQgc2VnbWVudC4KLSAgICAgICogVW5jb21tZW50IGl0IGlmIHlvdSB3YW50LiBDb3VsZCBhbHNvIGRlZmluZSBGQVJEQVRBIGFzCi0gICAgICAqIGNvbnN0IGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgaXQuIChTSlQpCi0jICAgIGRlZmluZSBGQVJEQVRBIEZBUgotICAgICAgKi8KLSMgIGVuZGlmICAvKiBfX1dJTjMyX18sIF9fRkxBVF9fLCBfX0NZR1dJTl9fICovCi0jZW5kaWYgICAvKiBfX0JPUkxBTkRDX18gKi8KLQotCi0vKiBTdWdnZXN0IHRlc3RpbmcgZm9yIHNwZWNpZmljIGNvbXBpbGVyIGZpcnN0IGJlZm9yZSB0ZXN0aW5nIGZvcgotICogRkFSLiAgVGhlIFdhdGNvbSBjb21waWxlciBkZWZpbmVzIGJvdGggX19NRURJVU1fXyBhbmQgTV9JODZNTSwKLSAqIG1ha2luZyByZWxpYW5jZSBvbmNlcnRhaW4ga2V5d29yZHMgc3VzcGVjdC4gKFNKVCkKLSAqLwotCi0vKiBNU0MgTWVkaXVtIG1vZGVsICovCi0jaWYgZGVmaW5lZChGQVIpCi0jICBpZiBkZWZpbmVkKE1fSTg2TU0pCi0jICAgIGRlZmluZSBVU0VfRkFSX0tFWVdPUkQKLSMgICAgZGVmaW5lIEZBUkRBVEEgRkFSCi0jICAgIGluY2x1ZGUgPGRvcy5oPgotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBTSlQ6IGRlZmF1bHQgY2FzZSAqLwotI2lmbmRlZiBGQVIKLSMgIGRlZmluZSBGQVIKLSNlbmRpZgotCi0vKiBBdCB0aGlzIHBvaW50IEZBUiBpcyBhbHdheXMgZGVmaW5lZCAqLwotI2lmbmRlZiBGQVJEQVRBCi0jICBkZWZpbmUgRkFSREFUQQotI2VuZGlmCi0KLS8qIFR5cGVkZWYgZm9yIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgdGhhdCBhcmUgY29udmVydGVkCi0gICB0byBmaXhlZC1wb2ludCB3aXRoIGEgbXVsdGlwbGUgb2YgMTAwLDAwMCwgZS5nLiwgaW50X2dhbW1hICovCi10eXBlZGVmIHBuZ19pbnRfMzIgcG5nX2ZpeGVkX3BvaW50OwotCi0vKiBBZGQgdHlwZWRlZnMgZm9yIHBvaW50ZXJzICovCi10eXBlZGVmIHZvaWQgICAgICAgICAgICBGQVIgKiBwbmdfdm9pZHA7Ci10eXBlZGVmIHBuZ19ieXRlICAgICAgICBGQVIgKiBwbmdfYnl0ZXA7Ci10eXBlZGVmIHBuZ191aW50XzMyICAgICBGQVIgKiBwbmdfdWludF8zMnA7Ci10eXBlZGVmIHBuZ19pbnRfMzIgICAgICBGQVIgKiBwbmdfaW50XzMycDsKLXR5cGVkZWYgcG5nX3VpbnRfMTYgICAgIEZBUiAqIHBuZ191aW50XzE2cDsKLXR5cGVkZWYgcG5nX2ludF8xNiAgICAgIEZBUiAqIHBuZ19pbnRfMTZwOwotdHlwZWRlZiBQTkdfQ09OU1QgY2hhciAgRkFSICogcG5nX2NvbnN0X2NoYXJwOwotdHlwZWRlZiBjaGFyICAgICAgICAgICAgRkFSICogcG5nX2NoYXJwOwotdHlwZWRlZiBwbmdfZml4ZWRfcG9pbnQgRkFSICogcG5nX2ZpeGVkX3BvaW50X3A7Ci0KLSNpZm5kZWYgUE5HX05PX1NURElPCi0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotdHlwZWRlZiBIQU5ETEUgICAgICAgICAgICAgICAgcG5nX0ZJTEVfcDsKLSNlbHNlCi10eXBlZGVmIEZJTEUgICAgICAgICAgICAgICAgKiBwbmdfRklMRV9wOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLXR5cGVkZWYgZG91YmxlICAgICAgICAgIEZBUiAqIHBuZ19kb3VibGVwOwotI2VuZGlmCi0KLS8qIFBvaW50ZXJzIHRvIHBvaW50ZXJzOyBpLmUuIGFycmF5cyAqLwotdHlwZWRlZiBwbmdfYnl0ZSAgICAgICAgRkFSICogRkFSICogcG5nX2J5dGVwcDsKLXR5cGVkZWYgcG5nX3VpbnRfMzIgICAgIEZBUiAqIEZBUiAqIHBuZ191aW50XzMycHA7Ci10eXBlZGVmIHBuZ19pbnRfMzIgICAgICBGQVIgKiBGQVIgKiBwbmdfaW50XzMycHA7Ci10eXBlZGVmIHBuZ191aW50XzE2ICAgICBGQVIgKiBGQVIgKiBwbmdfdWludF8xNnBwOwotdHlwZWRlZiBwbmdfaW50XzE2ICAgICAgRkFSICogRkFSICogcG5nX2ludF8xNnBwOwotdHlwZWRlZiBQTkdfQ09OU1QgY2hhciAgRkFSICogRkFSICogcG5nX2NvbnN0X2NoYXJwcDsKLXR5cGVkZWYgY2hhciAgICAgICAgICAgIEZBUiAqIEZBUiAqIHBuZ19jaGFycHA7Ci10eXBlZGVmIHBuZ19maXhlZF9wb2ludCBGQVIgKiBGQVIgKiBwbmdfZml4ZWRfcG9pbnRfcHA7Ci0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotdHlwZWRlZiBkb3VibGUgICAgICAgICAgRkFSICogRkFSICogcG5nX2RvdWJsZXBwOwotI2VuZGlmCi0KLS8qIFBvaW50ZXJzIHRvIHBvaW50ZXJzIHRvIHBvaW50ZXJzOyBpLmUuLCBwb2ludGVyIHRvIGFycmF5ICovCi10eXBlZGVmIGNoYXIgICAgICAgICAgICBGQVIgKiBGQVIgKiBGQVIgKiBwbmdfY2hhcnBwcDsKLQotI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkKFBOR18xXzJfWCkKLS8qIFNQQyAtICBJcyB0aGlzIHN0dWZmIGRlcHJlY2F0ZWQ/ICovCi0vKiBJdCdsbCBiZSByZW1vdmVkIGFzIG9mIGxpYnBuZy0xLjMuMCAtIEdSLVAgKi8KLS8qIGxpYnBuZyB0eXBlZGVmcyBmb3IgdHlwZXMgaW4gemxpYi4gSWYgemxpYiBjaGFuZ2VzCi0gKiBvciBhbm90aGVyIGNvbXByZXNzaW9uIGxpYnJhcnkgaXMgdXNlZCwgdGhlbiBjaGFuZ2UgdGhlc2UuCi0gKiBFbGltaW5hdGVzIG5lZWQgdG8gY2hhbmdlIGFsbCB0aGUgc291cmNlIGZpbGVzLgotICovCi10eXBlZGVmIGNoYXJmICogICAgICAgICBwbmdfemNoYXJwOwotdHlwZWRlZiBjaGFyZiAqIEZBUiAqICAgcG5nX3pjaGFycHA7Ci10eXBlZGVmIHpfc3RyZWFtIEZBUiAqICBwbmdfenN0cmVhbXA7Ci0jZW5kaWYgLyogKFBOR18xXzBfWCkgfHwgZGVmaW5lZChQTkdfMV8yX1gpICovCi0KLS8qCi0gKiBEZWZpbmUgUE5HX0JVSUxEX0RMTCBpZiB0aGUgbW9kdWxlIGJlaW5nIGJ1aWx0IGlzIGEgV2luZG93cwotICogTElCUE5HIERMTC4KLSAqCi0gKiBEZWZpbmUgUE5HX1VTRV9ETEwgaWYgeW91IHdhbnQgdG8gKmxpbmsqIHRvIHRoZSBXaW5kb3dzIExJQlBORyBETEwuCi0gKiBJdCBpcyBlcXVpdmFsZW50IHRvIE1pY3Jvc29mdCBwcmVkZWZpbmVkIG1hY3JvIF9ETEwgdGhhdCBpcwotICogYXV0b21hdGljYWxseSBkZWZpbmVkIHdoZW4geW91IGNvbXBpbGUgdXNpbmcgdGhlIHNoYXJlCi0gKiB2ZXJzaW9uIG9mIHRoZSBDUlQgKEMgUnVuLVRpbWUgbGlicmFyeSkKLSAqCi0gKiBUaGUgY3lnd2luIG1vZHMgbWFrZSB0aGlzIGJlaGF2aW9yIGEgbGl0dGxlIGRpZmZlcmVudDoKLSAqIERlZmluZSBQTkdfQlVJTERfRExMIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBkbGwgZm9yIHVzZSB3aXRoIGN5Z3dpbgotICogRGVmaW5lIFBOR19TVEFUSUMgaWYgeW91IGFyZSBidWlsZGluZyBhIHN0YXRpYyBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBjeWd3aW4sCi0gKiAgIC1vci0gaWYgeW91IGFyZSBidWlsZGluZyBhbiBhcHBsaWNhdGlvbiB0aGF0IHlvdSB3YW50IHRvIGxpbmsgdG8gdGhlCi0gKiAgIHN0YXRpYyBsaWJyYXJ5LgotICogUE5HX1VTRV9ETEwgaXMgZGVmaW5lZCBieSBkZWZhdWx0IChubyB1c2VyIGFjdGlvbiBuZWVkZWQpIHVubGVzcyBvbmUgb2YKLSAqICAgdGhlIG90aGVyIGZsYWdzIGlzIGRlZmluZWQuCi0gKi8KLQotI2lmICFkZWZpbmVkKFBOR19ETEwpICYmIChkZWZpbmVkKFBOR19CVUlMRF9ETEwpIHx8IGRlZmluZWQoUE5HX1VTRV9ETEwpKQotIyAgZGVmaW5lIFBOR19ETEwKLSNlbmRpZgotLyogSWYgQ1lHV0lOLCB0aGVuIGRpc2FsbG93IEdMT0JBTCBBUlJBWVMgdW5sZXNzIGJ1aWxkaW5nIGEgc3RhdGljIGxpYi4KLSAqIFdoZW4gYnVpbGRpbmcgYSBzdGF0aWMgbGliLCBkZWZhdWx0IHRvIG5vIEdMT0JBTCBBUlJBWVMsIGJ1dCBhbGxvdwotICogY29tbWFuZC1saW5lIG92ZXJyaWRlCi0gKi8KLSNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jICBpZiAhZGVmaW5lZChQTkdfU1RBVElDKQotIyAgICBpZiBkZWZpbmVkKFBOR19VU0VfR0xPQkFMX0FSUkFZUykKLSMgICAgICB1bmRlZiBQTkdfVVNFX0dMT0JBTF9BUlJBWVMKLSMgICAgZW5kaWYKLSMgICAgaWYgIWRlZmluZWQoUE5HX1VTRV9MT0NBTF9BUlJBWVMpCi0jICAgICAgZGVmaW5lIFBOR19VU0VfTE9DQUxfQVJSQVlTCi0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGlmIGRlZmluZWQoUE5HX1VTRV9MT0NBTF9BUlJBWVMpIHx8IGRlZmluZWQoUE5HX05PX0dMT0JBTF9BUlJBWVMpCi0jICAgICAgaWYgZGVmaW5lZChQTkdfVVNFX0dMT0JBTF9BUlJBWVMpCi0jICAgICAgICB1bmRlZiBQTkdfVVNFX0dMT0JBTF9BUlJBWVMKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSMgIGlmICFkZWZpbmVkKFBOR19VU0VfTE9DQUxfQVJSQVlTKSAmJiAhZGVmaW5lZChQTkdfVVNFX0dMT0JBTF9BUlJBWVMpCi0jICAgIGRlZmluZSBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBEbyBub3QgdXNlIGdsb2JhbCBhcnJheXMgKGhlbHBzIHdpdGggYnVpbGRpbmcgRExMJ3MpCi0gKiBUaGV5IGFyZSBubyBsb25nZXIgdXNlZCBpbiBsaWJwbmcgaXRzZWxmLCBzaW5jZSB2ZXJzaW9uIDEuMC41YywKLSAqIGJ1dCBtaWdodCBiZSByZXF1aXJlZCBmb3Igc29tZSBwcmUtMS4wLjVjIGFwcGxpY2F0aW9ucy4KLSAqLwotI2lmICFkZWZpbmVkKFBOR19VU0VfTE9DQUxfQVJSQVlTKSAmJiAhZGVmaW5lZChQTkdfVVNFX0dMT0JBTF9BUlJBWVMpCi0jICBpZiBkZWZpbmVkKFBOR19OT19HTE9CQUxfQVJSQVlTKSB8fCBcCi0gICAgICAoZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChQTkdfRExMKSkgfHwgZGVmaW5lZChfTVNDX1ZFUikKLSMgICAgZGVmaW5lIFBOR19VU0VfTE9DQUxfQVJSQVlTCi0jICBlbHNlCi0jICAgIGRlZmluZSBQTkdfVVNFX0dMT0JBTF9BUlJBWVMKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19DWUdXSU5fXykKLSMgIHVuZGVmIFBOR0FQSQotIyAgZGVmaW5lIFBOR0FQSSBfX2NkZWNsCi0jICB1bmRlZiBQTkdfSU1QRVhQCi0jICBkZWZpbmUgUE5HX0lNUEVYUAotI2VuZGlmICAKLQotLyogSWYgeW91IGRlZmluZSBQTkdBUEksIGUuZy4sIHdpdGggY29tcGlsZXIgb3B0aW9uICItRFBOR0FQST1fX3N0ZGNhbGwiLAotICogeW91IG1heSBnZXQgd2FybmluZ3MgcmVnYXJkaW5nIHRoZSBsaW5rYWdlIG9mIHBuZ196YWxsb2MgYW5kIHBuZ196ZnJlZS4KLSAqIERvbid0IGlnbm9yZSB0aG9zZSB3YXJuaW5nczsgeW91IG11c3QgYWxzbyByZXNldCB0aGUgZGVmYXVsdCBjYWxsaW5nCi0gKiBjb252ZW50aW9uIGluIHlvdXIgY29tcGlsZXIgdG8gbWF0Y2ggeW91ciBQTkdBUEksIGFuZCB5b3UgbXVzdCBidWlsZAotICogemxpYiBhbmQgeW91ciBhcHBsaWNhdGlvbnMgdGhlIHNhbWUgd2F5IHlvdSBidWlsZCBsaWJwbmcuCi0gKi8KLQotI2lmIGRlZmluZWQoX19NSU5HVzMyX18pICYmICFkZWZpbmVkKFBOR19NT0RVTEVERUYpCi0jICBpZm5kZWYgUE5HX05PX01PRFVMRURFRgotIyAgICBkZWZpbmUgUE5HX05PX01PRFVMRURFRgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUE5HX0lNUEVYUCkgJiYgZGVmaW5lZChQTkdfQlVJTERfRExMKSAmJiAhZGVmaW5lZChQTkdfTk9fTU9EVUxFREVGKQotIyAgZGVmaW5lIFBOR19JTVBFWFAKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfRExMKSB8fCBkZWZpbmVkKF9ETEwpIHx8IGRlZmluZWQoX19ETExfXyApIHx8IFwKLSAgICAoKCBkZWZpbmVkKF9XaW5kb3dzKSB8fCBkZWZpbmVkKF9XSU5ET1dTKSB8fCBcCi0gICAgICAgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSApKQotCi0jICBpZm5kZWYgUE5HQVBJCi0jICAgICBpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCAoZGVmaW5lZCAoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSA4MDApKQotIyAgICAgICAgZGVmaW5lIFBOR0FQSSBfX2NkZWNsCi0jICAgICBlbHNlCi0jICAgICAgICBkZWZpbmUgUE5HQVBJIF9jZGVjbAotIyAgICAgZW5kaWYKLSMgIGVuZGlmCi0KLSMgIGlmICFkZWZpbmVkKFBOR19JTVBFWFApICYmICghZGVmaW5lZChQTkdfRExMKSB8fCBcCi0gICAgICAgMCAvKiBXSU5DT01QSUxFUl9XSVRIX05PX1NVUFBPUlRfRk9SX0RFQ0xJTVBFWFAgKi8pCi0jICAgICBkZWZpbmUgUE5HX0lNUEVYUAotIyAgZW5kaWYKLQotIyAgaWYgIWRlZmluZWQoUE5HX0lNUEVYUCkKLQotIyAgICAgZGVmaW5lIFBOR19FWFBPUlRfVFlQRTEodHlwZSxzeW1ib2wpICBQTkdfSU1QRVhQIHR5cGUgUE5HQVBJIHN5bWJvbAotIyAgICAgZGVmaW5lIFBOR19FWFBPUlRfVFlQRTIodHlwZSxzeW1ib2wpICB0eXBlIFBOR19JTVBFWFAgUE5HQVBJIHN5bWJvbAotCi0gICAgICAvKiBCb3JsYW5kL01pY3Jvc29mdCAqLwotIyAgICAgaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jICAgICAgICBpZiAoX01TQ19WRVIgPj0gODAwKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKQotIyAgICAgICAgICAgZGVmaW5lIFBOR19FWFBPUlQgUE5HX0VYUE9SVF9UWVBFMQotIyAgICAgICAgZWxzZQotIyAgICAgICAgICAgZGVmaW5lIFBOR19FWFBPUlQgUE5HX0VYUE9SVF9UWVBFMgotIyAgICAgICAgICAgaWYgZGVmaW5lZChQTkdfQlVJTERfRExMKQotIyAgICAgICAgICAgICAgZGVmaW5lIFBOR19JTVBFWFAgX19leHBvcnQKLSMgICAgICAgICAgIGVsc2UKLSMgICAgICAgICAgICAgIGRlZmluZSBQTkdfSU1QRVhQIC8qX19pbXBvcnQgKi8gLyogZG9lc24ndCBleGlzdCBBRkFJSyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDKysgKi8KLSMgICAgICAgICAgIGVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeGlzdHMgaW4gQm9ybGFuZCBDKysgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQysrIGNsYXNzZXMgKD09IGh1Z2UpICovCi0jICAgICAgICBlbmRpZgotIyAgICAgZW5kaWYKLQotIyAgICAgaWYgIWRlZmluZWQoUE5HX0lNUEVYUCkKLSMgICAgICAgIGlmIGRlZmluZWQoUE5HX0JVSUxEX0RMTCkKLSMgICAgICAgICAgIGRlZmluZSBQTkdfSU1QRVhQIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICAgICAgZWxzZQotIyAgICAgICAgICAgZGVmaW5lIFBOR19JTVBFWFAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgICAgICBlbmRpZgotIyAgICAgZW5kaWYKLSMgIGVuZGlmICAvKiBQTkdfSU1QRVhQICovCi0jZWxzZSAvKiAhKERMTCB8fCBub24tY3lnd2luIFdJTkRPV1MpICovCi0jICAgaWYgKGRlZmluZWQoX19JQk1DX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykpICYmIGRlZmluZWQoX19PUzJfXykKLSMgICAgICBpZm5kZWYgUE5HQVBJCi0jICAgICAgICAgZGVmaW5lIFBOR0FQSSBfU3lzdGVtCi0jICAgICAgZW5kaWYKLSMgICBlbHNlCi0jICAgICAgaWYgMCAvKiAuLi4gb3RoZXIgcGxhdGZvcm1zLCB3aXRoIG90aGVyIG1lYW5pbmdzICovCi0jICAgICAgZW5kaWYKLSMgICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgUE5HQVBJCi0jICBkZWZpbmUgUE5HQVBJCi0jZW5kaWYKLSNpZm5kZWYgUE5HX0lNUEVYUAotIyAgZGVmaW5lIFBOR19JTVBFWFAKLSNlbmRpZgotCi0jaWZkZWYgUE5HX0JVSUxEU1lNUwotIyAgaWZuZGVmIFBOR19FWFBPUlQKLSMgICAgZGVmaW5lIFBOR19FWFBPUlQodHlwZSxzeW1ib2wpIFBOR19GVU5DVElPTl9FWFBPUlQgc3ltYm9sIEVORAotIyAgZW5kaWYKLSMgIGlmZGVmIFBOR19VU0VfR0xPQkFMX0FSUkFZUwotIyAgICBpZm5kZWYgUE5HX0VYUE9SVF9WQVIKLSMgICAgICBkZWZpbmUgUE5HX0VYUE9SVF9WQVIodHlwZSkgUE5HX0RBVEFfRVhQT1JUCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgUE5HX0VYUE9SVAotIyAgZGVmaW5lIFBOR19FWFBPUlQodHlwZSxzeW1ib2wpIFBOR19JTVBFWFAgdHlwZSBQTkdBUEkgc3ltYm9sCi0jZW5kaWYKLQotI2lmZGVmIFBOR19VU0VfR0xPQkFMX0FSUkFZUwotIyAgaWZuZGVmIFBOR19FWFBPUlRfVkFSCi0jICAgIGRlZmluZSBQTkdfRVhQT1JUX1ZBUih0eXBlKSBleHRlcm4gUE5HX0lNUEVYUCB0eXBlCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFVzZXIgbWF5IHdhbnQgdG8gdXNlIHRoZXNlIHNvIHRoZXkgYXJlIG5vdCBpbiBQTkdfSU5URVJOQUwuIEFueSBsaWJyYXJ5Ci0gKiBmdW5jdGlvbnMgdGhhdCBhcmUgcGFzc2VkIGZhciBkYXRhIG11c3QgYmUgbW9kZWwgaW5kZXBlbmRlbnQuCi0gKi8KLQotI2lmbmRlZiBQTkdfQUJPUlQKLSMgIGRlZmluZSBQTkdfQUJPUlQoKSBhYm9ydCgpCi0jZW5kaWYKLQotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0jICBkZWZpbmUgcG5nX2ptcGJ1ZihwbmdfcHRyKSAoKHBuZ19wdHIpLT5qbXBidWYpCi0jZWxzZQotIyAgZGVmaW5lIHBuZ19qbXBidWYocG5nX3B0cikgXAotICAgKExJQlBOR19XQVNfQ09NUElMRURfV0lUSF9fUE5HX1NFVEpNUF9OT1RfU1VQUE9SVEVEKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFVTRV9GQVJfS0VZV09SRCkgIC8qIG1lbW9yeSBtb2RlbCBpbmRlcGVuZGVudCBmbnMgKi8KLS8qIHVzZSB0aGlzIHRvIG1ha2UgZmFyLXRvLW5lYXIgYXNzaWdubWVudHMgKi8KLSMgIGRlZmluZSBDSEVDSyAgIDEKLSMgIGRlZmluZSBOT0NIRUNLIDAKLSMgIGRlZmluZSBDVlRfUFRSKHB0cikgKHBuZ19mYXJfdG9fbmVhcihwbmdfcHRyLHB0cixDSEVDSykpCi0jICBkZWZpbmUgQ1ZUX1BUUl9OT0NIRUNLKHB0cikgKHBuZ19mYXJfdG9fbmVhcihwbmdfcHRyLHB0cixOT0NIRUNLKSkKLSMgIGRlZmluZSBwbmdfc25wcmludGYgX2ZzbnByaW50ZiAgIC8qIEFkZGVkIHRvIHYgMS4yLjE5ICovCi0jICBkZWZpbmUgcG5nX3N0cmxlbiAgX2ZzdHJsZW4KLSMgIGRlZmluZSBwbmdfbWVtY21wICBfZm1lbWNtcCAgICAvKiBTSlQ6IGFkZGVkICovCi0jICBkZWZpbmUgcG5nX21lbWNweSAgX2ZtZW1jcHkKLSMgIGRlZmluZSBwbmdfbWVtc2V0ICBfZm1lbXNldAotI2Vsc2UgLyogdXNlIHRoZSB1c3VhbCBmdW5jdGlvbnMgKi8KLSMgIGRlZmluZSBDVlRfUFRSKHB0cikgICAgICAgICAocHRyKQotIyAgZGVmaW5lIENWVF9QVFJfTk9DSEVDSyhwdHIpIChwdHIpCi0jICBpZm5kZWYgUE5HX05PX1NOUFJJTlRGCi0jICAgIGlmZGVmIF9NU0NfVkVSCi0jICAgICAgZGVmaW5lIHBuZ19zbnByaW50ZiBfc25wcmludGYgICAvKiBBZGRlZCB0byB2IDEuMi4xOSAqLwotIyAgICAgIGRlZmluZSBwbmdfc25wcmludGYyIF9zbnByaW50ZgotIyAgICAgIGRlZmluZSBwbmdfc25wcmludGY2IF9zbnByaW50ZgotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIHBuZ19zbnByaW50ZiBzbnByaW50ZiAgIC8qIEFkZGVkIHRvIHYgMS4yLjE5ICovCi0jICAgICAgZGVmaW5lIHBuZ19zbnByaW50ZjIgc25wcmludGYKLSMgICAgICBkZWZpbmUgcG5nX3NucHJpbnRmNiBzbnByaW50ZgotIyAgICBlbmRpZgotIyAgZWxzZQotICAgICAvKiBZb3UgZG9uJ3QgaGF2ZSBvciBkb24ndCB3YW50IHRvIHVzZSBzbnByaW50ZigpLiAgQ2F1dGlvbjogVXNpbmcKLSAgICAgICogc3ByaW50ZiBpbnN0ZWFkIG9mIHNucHJpbnRmIGV4cG9zZXMgeW91ciBhcHBsaWNhdGlvbiB0byBhY2NpZGVudGFsCi0gICAgICAqIG9yIG1hbGV2b2xlbnQgYnVmZmVyIG92ZXJmbG93cy4gIElmIHlvdSBkb24ndCBoYXZlIHNucHJpbnRmKCkKLSAgICAgICogYXMgYSBnZW5lcmFsIHJ1bGUgeW91IHNob3VsZCBwcm92aWRlIG9uZSAoeW91IGNhbiBnZXQgb25lIGZyb20KLSAgICAgICogUG9ydGFibGUgT3BlblNTSCkuICovCi0jICAgIGRlZmluZSBwbmdfc25wcmludGYoczEsbixmbXQseDEpIHNwcmludGYoczEsZm10LHgxKQotIyAgICBkZWZpbmUgcG5nX3NucHJpbnRmMihzMSxuLGZtdCx4MSx4Mikgc3ByaW50ZihzMSxmbXQseDEseDIpCi0jICAgIGRlZmluZSBwbmdfc25wcmludGY2KHMxLG4sZm10LHgxLHgyLHgzLHg0LHg1LHg2KSBcCi0gICAgICAgIHNwcmludGYoczEsZm10LHgxLHgyLHgzLHg0LHg1LHg2KQotIyAgZW5kaWYKLSMgIGRlZmluZSBwbmdfc3RybGVuICBzdHJsZW4KLSMgIGRlZmluZSBwbmdfbWVtY21wICBtZW1jbXAgICAgICAvKiBTSlQ6IGFkZGVkICovCi0jICBkZWZpbmUgcG5nX21lbWNweSAgbWVtY3B5Ci0jICBkZWZpbmUgcG5nX21lbXNldCAgbWVtc2V0Ci0jZW5kaWYKLS8qIEVuZCBvZiBtZW1vcnkgbW9kZWwgaW5kZXBlbmRlbnQgc3VwcG9ydCAqLwotCi0vKiBKdXN0IGEgbGl0dGxlIGNoZWNrIHRoYXQgc29tZW9uZSBoYXNuJ3QgdHJpZWQgdG8gZGVmaW5lIHNvbWV0aGluZwotICogY29udHJhZGljdG9yeS4KLSAqLwotI2lmIChQTkdfWkJVRl9TSVpFID4gNjU1MzZMKSAmJiBkZWZpbmVkKFBOR19NQVhfTUFMTE9DXzY0SykKLSMgIHVuZGVmIFBOR19aQlVGX1NJWkUKLSMgIGRlZmluZSBQTkdfWkJVRl9TSVpFIDY1NTM2TAotI2VuZGlmCi0KLS8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuOCAqLwotI2VuZGlmIC8qIFBOR19WRVJTSU9OX0lORk9fT05MWSAqLwotCi0jZW5kaWYgLyogUE5HQ09ORl9IICovCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wbmdlcnJvci5jIGIvbGlicy9saWJwbmcvcG5nZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhMmU1My4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wbmdlcnJvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLQotLyogcG5nZXJyb3IuYyAtIHN0dWIgZnVuY3Rpb25zIGZvciBpL28gYW5kIG1lbW9yeSBhbGxvY2F0aW9uCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuMzcgW0p1bmUgNCwgMjAwOV0KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBsb2NhdGlvbiBmb3IgYWxsIGVycm9yIGhhbmRsaW5nLiAgVXNlcnMgd2hvCi0gKiBuZWVkIHNwZWNpYWwgZXJyb3IgaGFuZGxpbmcgYXJlIGV4cGVjdGVkIHRvIHdyaXRlIHJlcGxhY2VtZW50IGZ1bmN0aW9ucwotICogYW5kIHVzZSBwbmdfc2V0X2Vycm9yX2ZuKCkgdG8gdXNlIHRob3NlIGZ1bmN0aW9ucy4gIFNlZSB0aGUgaW5zdHJ1Y3Rpb25zCi0gKiBhdCBlYWNoIGZ1bmN0aW9uLgotICovCi0KLSNkZWZpbmUgUE5HX0lOVEVSTkFMCi0jaW5jbHVkZSAicG5nLmgiCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKLQotc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RlZmF1bHRfZXJyb3IgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSkpOwotI2lmbmRlZiBQTkdfTk9fV0FSTklOR1MKLXN0YXRpYyB2b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kZWZhdWx0X3dhcm5pbmcgUE5HQVJHKChwbmdfc3RydWN0cCBwbmdfcHRyLAotICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSk7Ci0jZW5kaWYgLyogUE5HX05PX1dBUk5JTkdTICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGlzIGEgZmF0YWwgZXJyb3IuICBUaGlzIGZ1bmN0aW9uCi0gKiBzaG91bGQgbm90IGJlIGNoYW5nZWQuICBJZiB0aGVyZSBpcyBhIG5lZWQgdG8gaGFuZGxlIGVycm9ycyBkaWZmZXJlbnRseSwKLSAqIHlvdSBzaG91bGQgc3VwcGx5IGEgcmVwbGFjZW1lbnQgZXJyb3IgZnVuY3Rpb24gYW5kIHVzZSBwbmdfc2V0X2Vycm9yX2ZuKCkKLSAqIHRvIHJlcGxhY2UgdGhlIGVycm9yIGZ1bmN0aW9uIGF0IHJ1bi10aW1lLgotICovCi0jaWZuZGVmIFBOR19OT19FUlJPUl9URVhUCi12b2lkIFBOR0FQSQotcG5nX2Vycm9yKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKQotewotI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAotICAgY2hhciBtc2dbMTZdOwotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKLSAgIHsKLSAgICAgaWYgKHBuZ19wdHItPmZsYWdzJgotICAgICAgIChQTkdfRkxBR19TVFJJUF9FUlJPUl9OVU1CRVJTfFBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQpKQotICAgICB7Ci0gICAgICAgaWYgKCplcnJvcl9tZXNzYWdlID09ICcjJykKLSAgICAgICB7Ci0gICAgICAgICAgIC8qIFN0cmlwICIjbm5ubiAiIGZyb20gYmVnaW5uaW5nIG9mIGVycm9yIG1lc3NhZ2UuICovCi0gICAgICAgICAgIGludCBvZmZzZXQ7Ci0gICAgICAgICAgIGZvciAob2Zmc2V0ID0gMTsgb2Zmc2V0PDE1OyBvZmZzZXQrKykKLSAgICAgICAgICAgICAgaWYgKGVycm9yX21lc3NhZ2Vbb2Zmc2V0XSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgaWYgKHBuZ19wdHItPmZsYWdzJlBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvZmZzZXQgLSAxOyBpKyspCi0gICAgICAgICAgICAgICAgIG1zZ1tpXSA9IGVycm9yX21lc3NhZ2VbaSArIDFdOwotICAgICAgICAgICAgICBtc2dbaSAtIDFdID0gJ1wwJzsKLSAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9IG1zZzsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgKz0gb2Zmc2V0OwotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgICBpZiAocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfU1RSSVBfRVJST1JfVEVYVCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICBtc2dbMF0gPSAnMCc7Ci0gICAgICAgICAgICAgIG1zZ1sxXSA9ICdcMCc7Ci0gICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSBtc2c7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLSNlbmRpZgotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBwbmdfcHRyLT5lcnJvcl9mbiAhPSBOVUxMKQotICAgICAgKCoocG5nX3B0ci0+ZXJyb3JfZm4pKShwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsKLQotICAgLyogSWYgdGhlIGN1c3RvbSBoYW5kbGVyIGRvZXNuJ3QgZXhpc3QsIG9yIGlmIGl0IHJldHVybnMsCi0gICAgICB1c2UgdGhlIGRlZmF1bHQgaGFuZGxlciwgd2hpY2ggd2lsbCBub3QgcmV0dXJuLiAqLwotICAgcG5nX2RlZmF1bHRfZXJyb3IocG5nX3B0ciwgZXJyb3JfbWVzc2FnZSk7Ci19Ci0jZWxzZQotdm9pZCBQTkdBUEkKLXBuZ19lcnIocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgcG5nX3B0ci0+ZXJyb3JfZm4gIT0gTlVMTCkKLSAgICAgICgqKHBuZ19wdHItPmVycm9yX2ZuKSkocG5nX3B0ciwgJ1wwJyk7Ci0KLSAgIC8qIElmIHRoZSBjdXN0b20gaGFuZGxlciBkb2Vzbid0IGV4aXN0LCBvciBpZiBpdCByZXR1cm5zLAotICAgICAgdXNlIHRoZSBkZWZhdWx0IGhhbmRsZXIsIHdoaWNoIHdpbGwgbm90IHJldHVybi4gKi8KLSAgIHBuZ19kZWZhdWx0X2Vycm9yKHBuZ19wdHIsICdcMCcpOwotfQotI2VuZGlmIC8qIFBOR19OT19FUlJPUl9URVhUICovCi0KLSNpZm5kZWYgUE5HX05PX1dBUk5JTkdTCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBpcyBhIG5vbi1mYXRhbCBlcnJvci4gIFRoaXMgZnVuY3Rpb24KLSAqIHNob3VsZCBub3QgYmUgY2hhbmdlZC4gIElmIHRoZXJlIGlzIGEgbmVlZCB0byBoYW5kbGUgd2FybmluZ3MgZGlmZmVyZW50bHksCi0gKiB5b3Ugc2hvdWxkIHN1cHBseSBhIHJlcGxhY2VtZW50IHdhcm5pbmcgZnVuY3Rpb24gYW5kIHVzZQotICogcG5nX3NldF9lcnJvcl9mbigpIHRvIHJlcGxhY2UgdGhlIHdhcm5pbmcgZnVuY3Rpb24gYXQgcnVuLXRpbWUuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfd2FybmluZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKQotewotICAgaW50IG9mZnNldCA9IDA7Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMKQotICAgewotI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPmZsYWdzJgotICAgICAoUE5HX0ZMQUdfU1RSSVBfRVJST1JfTlVNQkVSU3xQTkdfRkxBR19TVFJJUF9FUlJPUl9URVhUKSkKLSNlbmRpZgotICAgICB7Ci0gICAgICAgaWYgKCp3YXJuaW5nX21lc3NhZ2UgPT0gJyMnKQotICAgICAgIHsKLSAgICAgICAgICAgZm9yIChvZmZzZXQgPSAxOyBvZmZzZXQgPCAxNTsgb2Zmc2V0KyspCi0gICAgICAgICAgICAgIGlmICh3YXJuaW5nX21lc3NhZ2Vbb2Zmc2V0XSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgcG5nX3B0ci0+d2FybmluZ19mbiAhPSBOVUxMKQotICAgICAgKCoocG5nX3B0ci0+d2FybmluZ19mbikpKHBuZ19wdHIsIHdhcm5pbmdfbWVzc2FnZSArIG9mZnNldCk7Ci0gICBlbHNlCi0gICAgICBwbmdfZGVmYXVsdF93YXJuaW5nKHBuZ19wdHIsIHdhcm5pbmdfbWVzc2FnZSArIG9mZnNldCk7Ci19Ci0jZW5kaWYgLyogUE5HX05PX1dBUk5JTkdTICovCi0KLQotLyogVGhlc2UgdXRpbGl0aWVzIGFyZSB1c2VkIGludGVybmFsbHkgdG8gYnVpbGQgYW4gZXJyb3IgbWVzc2FnZSB0aGF0IHJlbGF0ZXMKLSAqIHRvIHRoZSBjdXJyZW50IGNodW5rLiAgVGhlIGNodW5rIG5hbWUgY29tZXMgZnJvbSBwbmdfcHRyLT5jaHVua19uYW1lLAotICogdGhpcyBpcyB1c2VkIHRvIHByZWZpeCB0aGUgbWVzc2FnZS4gIFRoZSBtZXNzYWdlIGlzIGxpbWl0ZWQgaW4gbGVuZ3RoCi0gKiB0byA2MyBieXRlcywgdGhlIG5hbWUgY2hhcmFjdGVycyBhcmUgb3V0cHV0IGFzIGhleCBkaWdpdHMgd3JhcHBlZCBpbiBbXQotICogaWYgdGhlIGNoYXJhY3RlciBpcyBpbnZhbGlkLgotICovCi0jZGVmaW5lIGlzbm9uYWxwaGEoYykgKChjKSA8IDY1IHx8IChjKSA+IDEyMiB8fCAoKGMpID4gOTAgJiYgKGMpIDwgOTcpKQotc3RhdGljIFBOR19DT05TVCBjaGFyIHBuZ19kaWdpdFsxNl0gPSB7Ci0gICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCi0gICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnCi19OwotCi0jZGVmaW5lIFBOR19NQVhfRVJST1JfVEVYVCA2NAotCi0jaWYgIWRlZmluZWQoUE5HX05PX1dBUk5JTkdTKSB8fCAhZGVmaW5lZChQTkdfTk9fRVJST1JfVEVYVCkKLXN0YXRpYyB2b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19mb3JtYXRfYnVmZmVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jaGFycCBidWZmZXIsIHBuZ19jb25zdF9jaGFycAotICAgZXJyb3JfbWVzc2FnZSkKLXsKLSAgIGludCBpb3V0ID0gMCwgaWluID0gMDsKLQotICAgd2hpbGUgKGlpbiA8IDQpCi0gICB7Ci0gICAgICBpbnQgYyA9IHBuZ19wdHItPmNodW5rX25hbWVbaWluKytdOwotICAgICAgaWYgKGlzbm9uYWxwaGEoYykpCi0gICAgICB7Ci0gICAgICAgICBidWZmZXJbaW91dCsrXSA9ICdbJzsKLSAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gcG5nX2RpZ2l0WyhjICYgMHhmMCkgPj4gNF07Ci0gICAgICAgICBidWZmZXJbaW91dCsrXSA9IHBuZ19kaWdpdFtjICYgMHgwZl07Ci0gICAgICAgICBidWZmZXJbaW91dCsrXSA9ICddJzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGJ1ZmZlcltpb3V0KytdID0gKHBuZ19ieXRlKWM7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGlmIChlcnJvcl9tZXNzYWdlID09IE5VTEwpCi0gICAgICBidWZmZXJbaW91dF0gPSAnXDAnOwotICAgZWxzZQotICAgewotICAgICAgYnVmZmVyW2lvdXQrK10gPSAnOic7Ci0gICAgICBidWZmZXJbaW91dCsrXSA9ICcgJzsKLSAgICAgIHBuZ19tZW1jcHkoYnVmZmVyICsgaW91dCwgZXJyb3JfbWVzc2FnZSwgUE5HX01BWF9FUlJPUl9URVhUKTsKLSAgICAgIGJ1ZmZlcltpb3V0ICsgUE5HX01BWF9FUlJPUl9URVhUIC0gMV0gPSAnXDAnOwotICAgfQotfQotCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX2NodW5rX2Vycm9yKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKQotewotICAgY2hhciBtc2dbMTgrUE5HX01BWF9FUlJPUl9URVhUXTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgIHBuZ19lcnJvcihwbmdfcHRyLCBlcnJvcl9tZXNzYWdlKTsKLSAgIGVsc2UKLSAgIHsKLSAgICAgcG5nX2Zvcm1hdF9idWZmZXIocG5nX3B0ciwgbXNnLCBlcnJvcl9tZXNzYWdlKTsKLSAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIG1zZyk7Ci0gICB9Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogIWRlZmluZWQoUE5HX05PX1dBUk5JTkdTKSB8fCAhZGVmaW5lZChQTkdfTk9fRVJST1JfVEVYVCkgKi8KLQotI2lmbmRlZiBQTkdfTk9fV0FSTklOR1MKLXZvaWQgUE5HQVBJCi1wbmdfY2h1bmtfd2FybmluZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKQotewotICAgY2hhciBtc2dbMTgrUE5HX01BWF9FUlJPUl9URVhUXTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIHdhcm5pbmdfbWVzc2FnZSk7Ci0gICBlbHNlCi0gICB7Ci0gICAgIHBuZ19mb3JtYXRfYnVmZmVyKHBuZ19wdHIsIG1zZywgd2FybmluZ19tZXNzYWdlKTsKLSAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsKLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfTk9fV0FSTklOR1MgKi8KLQotCi0vKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IHJlcGxhY2VtZW50cyBmb3IKLSAqIHRoaXMgZnVuY3Rpb24gTVVTVCBOT1QgUkVUVVJOLCBvciB0aGUgcHJvZ3JhbSB3aWxsIGxpa2VseSBjcmFzaC4gIFRoaXMKLSAqIGZ1bmN0aW9uIGlzIHVzZWQgYnkgZGVmYXVsdCwgb3IgaWYgdGhlIHByb2dyYW0gc3VwcGxpZXMgTlVMTCBmb3IgdGhlCi0gKiBlcnJvciBmdW5jdGlvbiBwb2ludGVyIGluIHBuZ19zZXRfZXJyb3JfZm4oKS4KLSAqLwotc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RlZmF1bHRfZXJyb3IocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpCi17Ci0jaWZuZGVmIFBOR19OT19DT05TT0xFX0lPCi0jaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECi0gICBpZiAoKmVycm9yX21lc3NhZ2UgPT0gJyMnKQotICAgewotICAgICAvKiBTdHJpcCAiI25ubm4gIiBmcm9tIGJlZ2lubmluZyBvZiBlcnJvciBtZXNzYWdlLiAqLwotICAgICBpbnQgb2Zmc2V0OwotICAgICBjaGFyIGVycm9yX251bWJlclsxNl07Ci0gICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0PDE1OyBvZmZzZXQrKykKLSAgICAgewotICAgICAgICAgZXJyb3JfbnVtYmVyW29mZnNldF0gPSBlcnJvcl9tZXNzYWdlW29mZnNldCArIDFdOwotICAgICAgICAgaWYgKGVycm9yX21lc3NhZ2Vbb2Zmc2V0XSA9PSAnICcpCi0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgIH0KLSAgICAgaWYgKChvZmZzZXQgPiAxKSAmJiAob2Zmc2V0IDwgMTUpKQotICAgICB7Ci0gICAgICAgZXJyb3JfbnVtYmVyW29mZnNldCAtIDFdID0gJ1wwJzsKLSAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnBuZyBlcnJvciBuby4gJXM6ICVzIiwKLSAgICAgICAgICBlcnJvcl9udW1iZXIsIGVycm9yX21lc3NhZ2UgKyBvZmZzZXQgKyAxKTsKLSAgICAgICBmcHJpbnRmKHN0ZGVyciwgUE5HX1NUUklOR19ORVdMSU5FKTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnBuZyBlcnJvcjogJXMsIG9mZnNldD0lZCIsCi0gICAgICAgICAgZXJyb3JfbWVzc2FnZSwgb2Zmc2V0KTsKLSAgICAgICBmcHJpbnRmKHN0ZGVyciwgUE5HX1NUUklOR19ORVdMSU5FKTsKLSAgICAgfQotICAgfQotICAgZWxzZQotI2VuZGlmCi0gICB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgImxpYnBuZyBlcnJvcjogJXMiLCBlcnJvcl9tZXNzYWdlKTsKLSAgICAgIGZwcmludGYoc3RkZXJyLCBQTkdfU1RSSU5HX05FV0xJTkUpOwotICAgfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHIpCi0gICB7Ci0jICBpZmRlZiBVU0VfRkFSX0tFWVdPUkQKLSAgIHsKLSAgICAgIGptcF9idWYgam1wYnVmOwotICAgICAgcG5nX21lbWNweShqbXBidWYsIHBuZ19wdHItPmptcGJ1ZiwgcG5nX3NpemVvZihqbXBfYnVmKSk7Ci0gICAgICBsb25nam1wKGptcGJ1ZiwgMSk7Ci0gICB9Ci0jICBlbHNlCi0gICBsb25nam1wKHBuZ19wdHItPmptcGJ1ZiwgMSk7Ci0jICBlbmRpZgotICAgfQotI2Vsc2UKLSAgIFBOR19BQk9SVCgpOwotI2VuZGlmCi0jaWZkZWYgUE5HX05PX0NPTlNPTEVfSU8KLSAgIGVycm9yX21lc3NhZ2UgPSBlcnJvcl9tZXNzYWdlOyAvKiBNYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0jZW5kaWYKLX0KLQotI2lmbmRlZiBQTkdfTk9fV0FSTklOR1MKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSB3YXJuaW5nLCBidXQgdGhlIGxpYnJhcnkgdGhpbmtzCi0gKiBpdCBjYW4gY29udGludWUgYW55d2F5LiAgUmVwbGFjZW1lbnQgZnVuY3Rpb25zIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKLSAqIGhlcmUgaWYgeW91IGRvbid0IHdhbnQgdGhlbSB0by4gIEluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIHBuZ19wdHIgaXMKLSAqIG5vdCB1c2VkLCBidXQgaXQgaXMgcGFzc2VkIGluIGNhc2UgaXQgbWF5IGJlIHVzZWZ1bC4KLSAqLwotc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RlZmF1bHRfd2FybmluZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKQotewotI2lmbmRlZiBQTkdfTk9fQ09OU09MRV9JTwotIyAgaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECi0gICBpZiAoKndhcm5pbmdfbWVzc2FnZSA9PSAnIycpCi0gICB7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGNoYXIgd2FybmluZ19udW1iZXJbMTZdOwotICAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDE1OyBvZmZzZXQrKykKLSAgICAgewotICAgICAgICB3YXJuaW5nX251bWJlcltvZmZzZXRdID0gd2FybmluZ19tZXNzYWdlW29mZnNldCArIDFdOwotICAgICAgICBpZiAod2FybmluZ19tZXNzYWdlW29mZnNldF0gPT0gJyAnKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgIH0KLSAgICAgaWYgKChvZmZzZXQgPiAxKSAmJiAob2Zmc2V0IDwgMTUpKQotICAgICB7Ci0gICAgICAgd2FybmluZ19udW1iZXJbb2Zmc2V0ICsgMV0gPSAnXDAnOwotICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIHdhcm5pbmcgbm8uICVzOiAlcyIsCi0gICAgICAgICAgd2FybmluZ19udW1iZXIsIHdhcm5pbmdfbWVzc2FnZSArIG9mZnNldCk7Ci0gICAgICAgZnByaW50ZihzdGRlcnIsIFBOR19TVFJJTkdfTkVXTElORSk7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgd2FybmluZzogJXMiLAotICAgICAgICAgIHdhcm5pbmdfbWVzc2FnZSk7Ci0gICAgICAgZnByaW50ZihzdGRlcnIsIFBOR19TVFJJTkdfTkVXTElORSk7Ci0gICAgIH0KLSAgIH0KLSAgIGVsc2UKLSMgIGVuZGlmCi0gICB7Ci0gICAgIGZwcmludGYoc3RkZXJyLCAibGlicG5nIHdhcm5pbmc6ICVzIiwgd2FybmluZ19tZXNzYWdlKTsKLSAgICAgZnByaW50ZihzdGRlcnIsIFBOR19TVFJJTkdfTkVXTElORSk7Ci0gICB9Ci0jZWxzZQotICAgd2FybmluZ19tZXNzYWdlID0gd2FybmluZ19tZXNzYWdlOyAvKiBNYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0jZW5kaWYKLSAgIHBuZ19wdHIgPSBwbmdfcHRyOyAvKiBNYWtlIGNvbXBpbGVyIGhhcHB5ICovCi19Ci0jZW5kaWYgLyogUE5HX05PX1dBUk5JTkdTICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHVzZSBhbm90aGVyIG1ldGhvZAotICogb2YgaGFuZGxpbmcgZXJyb3JzIGFuZCB3YXJuaW5ncy4gIE5vdGUgdGhhdCB0aGUgZXJyb3IgZnVuY3Rpb24gTVVTVCBOT1QKLSAqIHJldHVybiB0byB0aGUgY2FsbGluZyByb3V0aW5lIG9yIHNlcmlvdXMgcHJvYmxlbXMgd2lsbCBvY2N1ci4gIFRoZSByZXR1cm4KLSAqIG1ldGhvZCB1c2VkIGluIHRoZSBkZWZhdWx0IHJvdXRpbmUgY2FsbHMgbG9uZ2ptcChwbmdfcHRyLT5qbXBidWYsIDEpCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2Vycm9yX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCi0gICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5pbmdfZm4pCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+ZXJyb3JfcHRyID0gZXJyb3JfcHRyOwotICAgcG5nX3B0ci0+ZXJyb3JfZm4gPSBlcnJvcl9mbjsKLSAgIHBuZ19wdHItPndhcm5pbmdfZm4gPSB3YXJuaW5nX2ZuOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVycm9yX3B0ciBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIKLSAqIGZ1bmN0aW9ucy4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZnJlZSBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gKiBwb2ludGVyIGJlZm9yZSBwbmdfd3JpdGVfZGVzdHJveSBhbmQgcG5nX3JlYWRfZGVzdHJveSBhcmUgY2FsbGVkLgotICovCi1wbmdfdm9pZHAgUE5HQVBJCi1wbmdfZ2V0X2Vycm9yX3B0cihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybiBOVUxMOwotICAgcmV0dXJuICgocG5nX3ZvaWRwKXBuZ19wdHItPmVycm9yX3B0cik7Ci19Ci0KLQotI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBzdHJpcF9tb2RlKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKLSAgIHsKLSAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0KLSAgICAgICAoKH4oUE5HX0ZMQUdfU1RSSVBfRVJST1JfTlVNQkVSU3xQTkdfRkxBR19TVFJJUF9FUlJPUl9URVhUKSkmc3RyaXBfbW9kZSk7Ci0gICB9Ci19Ci0jZW5kaWYKLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcG5nZ2NjcmQuYyBiL2xpYnMvbGlicG5nL3BuZ2djY3JkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MTUyM2UuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5nZ2NjcmQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKiBwbmdnY2NyZC5jIHdhcyByZW1vdmVkIGZyb20gbGlicG5nLTEuMi4yMC4gKi8KLQotLyogVGhpcyBjb2RlIHNuaXBwZXQgaXMgZm9yIHVzZSBieSBjb25maWd1cmUncyBjb21waWxhdGlvbiB0ZXN0LiAqLwotCi0jaWYgKCFkZWZpbmVkIF9NU0NfVkVSKSAmJiBcCi0gICAgZGVmaW5lZChQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVEKSAmJiBcCi0gICAgZGVmaW5lZChQTkdfTU1YX0NPREVfU1VQUE9SVEVEKQotCi1pbnQgUE5HQVBJIHBuZ19kdW1teV9tbXhfc3VwcG9ydCh2b2lkKTsKLQotc3RhdGljIGludCBfbW14X3N1cHBvcnRlZCA9IDI7IC8vIDA6IG5vIE1NWDsgMTogTU1YIHN1cHBvcnRlZDsgMjogbm90IHRlc3RlZAotCi1pbnQgUE5HQVBJCi1wbmdfZHVtbXlfbW14X3N1cHBvcnQodm9pZCkgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKTsKLQotaW50IFBOR0FQSQotcG5nX2R1bW15X21teF9zdXBwb3J0KHZvaWQpCi17Ci0gICBpbnQgcmVzdWx0OwotI2lmIGRlZmluZWQoUE5HX01NWF9DT0RFX1NVUFBPUlRFRCkgIC8vIHN1cGVyZmx1b3VzLCBidXQgd2hhdCB0aGUgaGVjawotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSNpZiBkZWZpbmVkKF9feDg2XzY0X18pCi0gICAgICAgICJwdXNocSAlJXJieCAgICAgICAgICBcblx0IiAgLy8gcmJ4IGdldHMgY2xvYmJlcmVkIGJ5IENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgICJwdXNocSAlJXJjeCAgICAgICAgICBcblx0IiAgLy8gc28gZG9lcyByY3guLi4KLSAgICAgICAgInB1c2hxICUlcmR4ICAgICAgICAgIFxuXHQiICAvLyAuLi5hbmQgcmR4IChidXQgcmN4ICYgcmR4IHNhZmUgb24gTGludXgpCi0gICAgICAgICJwdXNoZnEgICAgICAgICAgICAgICBcblx0IiAgLy8gc2F2ZSBFZmxhZyB0byBzdGFjawotICAgICAgICAicG9wcSAlJXJheCAgICAgICAgICAgXG5cdCIgIC8vIGdldCBFZmxhZyBmcm9tIHN0YWNrIGludG8gcmF4Ci0gICAgICAgICJtb3ZxICUlcmF4LCAlJXJjeCAgICBcblx0IiAgLy8gbWFrZSBhbm90aGVyIGNvcHkgb2YgRWZsYWcgaW4gcmN4Ci0gICAgICAgICJ4b3JsICQweDIwMDAwMCwgJSVlYXggXG5cdCIgLy8gdG9nZ2xlIElEIGJpdCBpbiBFZmxhZyAoaS5lLiwgYml0IDIxKQotICAgICAgICAicHVzaHEgJSVyYXggICAgICAgICAgXG5cdCIgIC8vIHNhdmUgbW9kaWZpZWQgRWZsYWcgYmFjayB0byBzdGFjawotICAgICAgICAicG9wZnEgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHJlc3RvcmUgbW9kaWZpZWQgdmFsdWUgdG8gRWZsYWcgcmVnCi0gICAgICAgICJwdXNoZnEgICAgICAgICAgICAgICBcblx0IiAgLy8gc2F2ZSBFZmxhZyB0byBzdGFjawotICAgICAgICAicG9wcSAlJXJheCAgICAgICAgICAgXG5cdCIgIC8vIGdldCBFZmxhZyBmcm9tIHN0YWNrCi0gICAgICAgICJwdXNocSAlJXJjeCAgICAgICAgICBcblx0IiAgLy8gc2F2ZSBvcmlnaW5hbCBFZmxhZyB0byBzdGFjawotICAgICAgICAicG9wZnEgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHJlc3RvcmUgb3JpZ2luYWwgRWZsYWcKLSNlbHNlCi0gICAgICAgICJwdXNobCAlJWVieCAgICAgICAgICBcblx0IiAgLy8gZWJ4IGdldHMgY2xvYmJlcmVkIGJ5IENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgICJwdXNobCAlJWVjeCAgICAgICAgICBcblx0IiAgLy8gc28gZG9lcyBlY3guLi4KLSAgICAgICAgInB1c2hsICUlZWR4ICAgICAgICAgIFxuXHQiICAvLyAuLi5hbmQgZWR4IChidXQgZWN4ICYgZWR4IHNhZmUgb24gTGludXgpCi0gICAgICAgICJwdXNoZmwgICAgICAgICAgICAgICBcblx0IiAgLy8gc2F2ZSBFZmxhZyB0byBzdGFjawotICAgICAgICAicG9wbCAlJWVheCAgICAgICAgICAgXG5cdCIgIC8vIGdldCBFZmxhZyBmcm9tIHN0YWNrIGludG8gZWF4Ci0gICAgICAgICJtb3ZsICUlZWF4LCAlJWVjeCAgICBcblx0IiAgLy8gbWFrZSBhbm90aGVyIGNvcHkgb2YgRWZsYWcgaW4gZWN4Ci0gICAgICAgICJ4b3JsICQweDIwMDAwMCwgJSVlYXggXG5cdCIgLy8gdG9nZ2xlIElEIGJpdCBpbiBFZmxhZyAoaS5lLiwgYml0IDIxKQotICAgICAgICAicHVzaGwgJSVlYXggICAgICAgICAgXG5cdCIgIC8vIHNhdmUgbW9kaWZpZWQgRWZsYWcgYmFjayB0byBzdGFjawotICAgICAgICAicG9wZmwgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHJlc3RvcmUgbW9kaWZpZWQgdmFsdWUgdG8gRWZsYWcgcmVnCi0gICAgICAgICJwdXNoZmwgICAgICAgICAgICAgICBcblx0IiAgLy8gc2F2ZSBFZmxhZyB0byBzdGFjawotICAgICAgICAicG9wbCAlJWVheCAgICAgICAgICAgXG5cdCIgIC8vIGdldCBFZmxhZyBmcm9tIHN0YWNrCi0gICAgICAgICJwdXNobCAlJWVjeCAgICAgICAgICBcblx0IiAgLy8gc2F2ZSBvcmlnaW5hbCBFZmxhZyB0byBzdGFjawotICAgICAgICAicG9wZmwgICAgICAgICAgICAgICAgXG5cdCIgIC8vIHJlc3RvcmUgb3JpZ2luYWwgRWZsYWcKLSNlbmRpZgotICAgICAgICAieG9ybCAlJWVjeCwgJSVlYXggICAgXG5cdCIgIC8vIGNvbXBhcmUgbmV3IEVmbGFnIHdpdGggb3JpZ2luYWwgRWZsYWcKLSAgICAgICAgImp6IDBmICAgICAgICAgICAgICAgIFxuXHQiICAvLyBpZiBzYW1lLCBDUFVJRCBpbnN0ci4gaXMgbm90IHN1cHBvcnRlZAotCi0gICAgICAgICJ4b3JsICUlZWF4LCAlJWVheCAgICBcblx0IiAgLy8gc2V0IGVheCB0byB6ZXJvCi0vLyAgICAgICIuYnl0ZSAgMHgwZiwgMHhhMiAgICBcblx0IiAgLy8gQ1BVSUQgaW5zdHJ1Y3Rpb24gKHR3by1ieXRlIG9wY29kZSkKLSAgICAgICAgImNwdWlkICAgICAgICAgICAgICAgIFxuXHQiICAvLyBnZXQgdGhlIENQVSBpZGVudGlmaWNhdGlvbiBpbmZvCi0gICAgICAgICJjbXBsICQxLCAlJWVheCAgICAgICBcblx0IiAgLy8gbWFrZSBzdXJlIGVheCByZXR1cm4gbm9uLXplcm8gdmFsdWUKLSAgICAgICAgImpsIDBmICAgICAgICAgICAgICAgIFxuXHQiICAvLyBpZiBlYXggaXMgemVybywgTU1YIGlzIG5vdCBzdXBwb3J0ZWQKLQotICAgICAgICAieG9ybCAlJWVheCwgJSVlYXggICAgXG5cdCIgIC8vIHNldCBlYXggdG8gemVybyBhbmQuLi4KLSAgICAgICAgImluY2wgJSVlYXggICAgICAgICAgIFxuXHQiICAvLyAuLi5pbmNyZW1lbnQgZWF4IHRvIDEuICBUaGlzIHBhaXIgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYXN0ZXIgdGhhbiB0aGUgaW5zdHJ1Y3Rpb24gIm1vdiBlYXgsIDEiCi0gICAgICAgICJjcHVpZCAgICAgICAgICAgICAgICBcblx0IiAgLy8gZ2V0IHRoZSBDUFUgaWRlbnRpZmljYXRpb24gaW5mbyBhZ2FpbgotICAgICAgICAiYW5kbCAkMHg4MDAwMDAsICUlZWR4IFxuXHQiIC8vIG1hc2sgb3V0IGFsbCBiaXRzIGJ1dCBNTVggYml0ICgyMykKLSAgICAgICAgImNtcGwgJDAsICUlZWR4ICAgICAgIFxuXHQiICAvLyAwID0gTU1YIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgImp6IDBmICAgICAgICAgICAgICAgIFxuXHQiICAvLyBub24temVybyA9IHllcywgTU1YIElTIHN1cHBvcnRlZAotCi0gICAgICAgICJtb3ZsICQxLCAlJWVheCAgICAgICBcblx0IiAgLy8gc2V0IHJldHVybiB2YWx1ZSB0byAxCi0gICAgICAgICJqbXAgIDFmICAgICAgICAgICAgICBcblx0IiAgLy8gRE9ORTogIGhhdmUgTU1YIHN1cHBvcnQKLQotICAgICIwOiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIC5OT1RfU1VQUE9SVEVEOiB0YXJnZXQgbGFiZWwgZm9yIGp1bXAgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICJtb3ZsICQwLCAlJWVheCAgICAgICBcblx0IiAgLy8gc2V0IHJldHVybiB2YWx1ZSB0byAwCi0gICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgLy8gLlJFVFVSTjogdGFyZ2V0IGxhYmVsIGZvciBqdW1wIGluc3RydWN0aW9ucwotI2lmIGRlZmluZWQoX194ODZfNjRfXykKLSAgICAgICAgInBvcHEgJSVyZHggICAgICAgICAgIFxuXHQiICAvLyByZXN0b3JlIHJkeAotICAgICAgICAicG9wcSAlJXJjeCAgICAgICAgICAgXG5cdCIgIC8vIHJlc3RvcmUgcmN4Ci0gICAgICAgICJwb3BxICUlcmJ4ICAgICAgICAgICBcblx0IiAgLy8gcmVzdG9yZSByYngKLSNlbHNlCi0gICAgICAgICJwb3BsICUlZWR4ICAgICAgICAgICBcblx0IiAgLy8gcmVzdG9yZSBlZHgKLSAgICAgICAgInBvcGwgJSVlY3ggICAgICAgICAgIFxuXHQiICAvLyByZXN0b3JlIGVjeAotICAgICAgICAicG9wbCAlJWVieCAgICAgICAgICAgXG5cdCIgIC8vIHJlc3RvcmUgZWJ4Ci0jZW5kaWYKLQotLy8gICAgICAicmV0ICAgICAgICAgICAgICAgICAgXG5cdCIgIC8vIERPTkU6ICBubyBNTVggc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmYWxsIHRocm91Z2ggdG8gc3RhbmRhcmQgQyAicmV0IikKLQotICAgICAgICA6ICI9YSIgKHJlc3VsdCkgICAgICAgICAgICAgIC8vIG91dHB1dCBsaXN0Ci0KLSAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgdmFyaWFibGVzIHVzZWQgb24gaW5wdXQgKG5vbmUpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBjbG9iYmVyIGxpc3QKLS8vICAgICAgLCAiJWVieCIsICIlZWN4IiwgIiVlZHgiICAgICAvLyBHUlI6ICB3ZSBoYW5kbGUgdGhlc2UgbWFudWFsbHkKLS8vICAgICAgLCAibWVtb3J5IiAgIC8vIGlmIHdyaXRlIHRvIGEgdmFyaWFibGUgZ2NjIHRob3VnaHQgd2FzIGluIGEgcmVnCi0vLyAgICAgICwgImNjIiAgICAgICAvLyAiY29uZGl0aW9uIGNvZGVzIiAoZmxhZyBiaXRzKQotICAgICk7Ci0gICAgX21teF9zdXBwb3J0ZWQgPSByZXN1bHQ7Ci0jZWxzZQotICAgIF9tbXhfc3VwcG9ydGVkID0gMDsKLSNlbmRpZiAvKiBQTkdfTU1YX0NPREVfU1VQUE9SVEVEICovCi0KLSAgICByZXR1cm4gX21teF9zdXBwb3J0ZWQ7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3BuZ2dldC5jIGIvbGlicy9saWJwbmcvcG5nZ2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjJkOTUuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5nZ2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MzkgKzAsMCBAQAotCi0vKiBwbmdnZXQuYyAtIHJldHJpZXZhbCBvZiB2YWx1ZXMgZnJvbSBpbmZvIHN0cnVjdAotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS4yLjM3IFtKdW5lIDQsIDIwMDldCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCi0gKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCi0gKi8KLQotI2RlZmluZSBQTkdfSU5URVJOQUwKLSNpbmNsdWRlICJwbmcuaCIKLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1VQUE9SVEVEKQotCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfdmFsaWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBmbGFnKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcmV0dXJuKGluZm9fcHRyLT52YWxpZCAmIGZsYWcpOwotCi0gICBlbHNlCi0gICAgICByZXR1cm4oMCk7Ci19Ci0KLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9yb3dieXRlcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCi0gICAgICByZXR1cm4oaW5mb19wdHItPnJvd2J5dGVzKTsKLQotICAgZWxzZQotICAgICAgcmV0dXJuKDApOwotfQotCi0jaWYgZGVmaW5lZChQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQpCi1wbmdfYnl0ZXBwIFBOR0FQSQotcG5nX2dldF9yb3dzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLSAgICAgIHJldHVybihpbmZvX3B0ci0+cm93X3BvaW50ZXJzKTsKLQotICAgZWxzZQotICAgICAgcmV0dXJuKDApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfRUFTWV9BQ0NFU1NfU1VQUE9SVEVECi0vKiBFYXN5IGFjY2VzcyB0byBpbmZvLCBhZGRlZCBpbiBsaWJwbmctMC45OSAqLwotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X2ltYWdlX3dpZHRoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLSAgICAgIHJldHVybiBpbmZvX3B0ci0+d2lkdGg7Ci0KLSAgIHJldHVybiAoMCk7Ci19Ci0KLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9pbWFnZV9oZWlnaHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcmV0dXJuIGluZm9fcHRyLT5oZWlnaHQ7Ci0KLSAgIHJldHVybiAoMCk7Ci19Ci0KLXBuZ19ieXRlIFBOR0FQSQotcG5nX2dldF9iaXRfZGVwdGgocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcmV0dXJuIGluZm9fcHRyLT5iaXRfZGVwdGg7Ci0KLSAgIHJldHVybiAoMCk7Ci19Ci0KLXBuZ19ieXRlIFBOR0FQSQotcG5nX2dldF9jb2xvcl90eXBlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLSAgICAgIHJldHVybiBpbmZvX3B0ci0+Y29sb3JfdHlwZTsKLQotICAgcmV0dXJuICgwKTsKLX0KLQotcG5nX2J5dGUgUE5HQVBJCi1wbmdfZ2V0X2ZpbHRlcl90eXBlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLSAgICAgIHJldHVybiBpbmZvX3B0ci0+ZmlsdGVyX3R5cGU7Ci0KLSAgIHJldHVybiAoMCk7Ci19Ci0KLXBuZ19ieXRlIFBOR0FQSQotcG5nX2dldF9pbnRlcmxhY2VfdHlwZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCi0gICAgICByZXR1cm4gaW5mb19wdHItPmludGVybGFjZV90eXBlOwotCi0gICByZXR1cm4gKDApOwotfQotCi1wbmdfYnl0ZSBQTkdBUEkKLXBuZ19nZXRfY29tcHJlc3Npb25fdHlwZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwpCi0gICAgICByZXR1cm4gaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGU7Ci0KLSAgIHJldHVybiAoMCk7Ci19Ci0KLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotI2lmIGRlZmluZWQoUE5HX3BIWXNfU1VQUE9SVEVEKQotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIiKTsKLQotICAgICAgaWYgKGluZm9fcHRyLT5waHlzX3VuaXRfdHlwZSAhPSBQTkdfUkVTT0xVVElPTl9NRVRFUikKLSAgICAgICAgICByZXR1cm4gKDApOwotCi0gICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIChpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQpOwotICAgfQotI2Vsc2UKLSAgIHJldHVybiAoMCk7Ci0jZW5kaWYKLSAgIHJldHVybiAoMCk7Ci19Ci0KLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotI2lmIGRlZmluZWQoUE5HX3BIWXNfU1VQUE9SVEVEKQotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIiKTsKLQotICAgICAgaWYgKGluZm9fcHRyLT5waHlzX3VuaXRfdHlwZSAhPSBQTkdfUkVTT0xVVElPTl9NRVRFUikKLSAgICAgICAgICByZXR1cm4gKDApOwotCi0gICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIChpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQpOwotICAgfQotI2Vsc2UKLSAgIHJldHVybiAoMCk7Ci0jZW5kaWYKLSAgIHJldHVybiAoMCk7Ci19Ci0KLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9waXhlbHNfcGVyX21ldGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLSNpZiBkZWZpbmVkKFBOR19wSFlzX1NVUFBPUlRFRCkKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wSFlzKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlciIpOwotCi0gICAgICBpZiAoaW5mb19wdHItPnBoeXNfdW5pdF90eXBlICE9IFBOR19SRVNPTFVUSU9OX01FVEVSIHx8Ci0gICAgICAgICBpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQgIT0gaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0KQotICAgICAgICAgIHJldHVybiAoMCk7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gKGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCk7Ci0gICB9Ci0jZWxzZQotICAgcmV0dXJuICgwKTsKLSNlbmRpZgotICAgcmV0dXJuICgwKTsKLX0KLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLWZsb2F0IFBOR0FQSQotcG5nX2dldF9waXhlbF9hc3BlY3RfcmF0aW8ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotICAgewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotI2lmIGRlZmluZWQoUE5HX3BIWXNfU1VQUE9SVEVEKQotCi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X2FzcGVjdF9yYXRpbyIpOwotICAgICAgaWYgKGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCA9PSAwKQotICAgICAgICAgcmV0dXJuICgoZmxvYXQpMC4wKTsKLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiAoKGZsb2F0KSgoZmxvYXQpaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0Ci0gICAgICAgICAgICAvKGZsb2F0KWluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCkpOwotICAgfQotI2Vsc2UKLSAgICAgIHJldHVybiAoMC4wKTsKLSNlbmRpZgotICAgcmV0dXJuICgoZmxvYXQpMC4wKTsKLX0KLSNlbmRpZgotCi1wbmdfaW50XzMyIFBOR0FQSQotcG5nX2dldF94X29mZnNldF9taWNyb25zKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLSNpZiBkZWZpbmVkKFBOR19vRkZzX1NVUFBPUlRFRCkKLQotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF94X29mZnNldF9taWNyb25zIik7Ci0KLSAgICAgIGlmIChpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZSAhPSBQTkdfT0ZGU0VUX01JQ1JPTUVURVIpCi0gICAgICAgICAgcmV0dXJuICgwKTsKLQotICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnhfb2Zmc2V0KTsKLSAgIH0KLSNlbHNlCi0gICAgICByZXR1cm4gKDApOwotI2VuZGlmCi0gICByZXR1cm4gKDApOwotfQotCi1wbmdfaW50XzMyIFBOR0FQSQotcG5nX2dldF95X29mZnNldF9taWNyb25zKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLQotI2lmIGRlZmluZWQoUE5HX29GRnNfU1VQUE9SVEVEKQotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX29GRnMpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicG5nX2dldF95X29mZnNldF9taWNyb25zIik7Ci0KLSAgICAgIGlmIChpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZSAhPSBQTkdfT0ZGU0VUX01JQ1JPTUVURVIpCi0gICAgICAgICAgcmV0dXJuICgwKTsKLQotICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnlfb2Zmc2V0KTsKLSAgIH0KLSNlbHNlCi0gICByZXR1cm4gKDApOwotI2VuZGlmCi0gICByZXR1cm4gKDApOwotfQotCi1wbmdfaW50XzMyIFBOR0FQSQotcG5nX2dldF94X29mZnNldF9waXhlbHMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotCi0jaWYgZGVmaW5lZChQTkdfb0ZGc19TVVBQT1JURUQpCi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMiKTsKLQotICAgICAgaWYgKGluZm9fcHRyLT5vZmZzZXRfdW5pdF90eXBlICE9IFBOR19PRkZTRVRfUElYRUwpCi0gICAgICAgICAgcmV0dXJuICgwKTsKLQotICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnhfb2Zmc2V0KTsKLSAgIH0KLSNlbHNlCi0gICByZXR1cm4gKDApOwotI2VuZGlmCi0gICByZXR1cm4gKDApOwotfQotCi1wbmdfaW50XzMyIFBOR0FQSQotcG5nX2dldF95X29mZnNldF9waXhlbHMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotCi0jaWYgZGVmaW5lZChQTkdfb0ZGc19TVVBQT1JURUQpCi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMiKTsKLQotICAgICAgaWYgKGluZm9fcHRyLT5vZmZzZXRfdW5pdF90eXBlICE9IFBOR19PRkZTRVRfUElYRUwpCi0gICAgICAgICAgcmV0dXJuICgwKTsKLQotICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiAoaW5mb19wdHItPnlfb2Zmc2V0KTsKLSAgIH0KLSNlbHNlCi0gICByZXR1cm4gKDApOwotI2VuZGlmCi0gICByZXR1cm4gKDApOwotfQotCi0jaWYgZGVmaW5lZChQTkdfSU5DSF9DT05WRVJTSU9OUykgJiYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3BpeGVsc19wZXJfaW5jaChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICByZXR1cm4gKChwbmdfdWludF8zMikoKGZsb2F0KXBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLCBpbmZvX3B0cikKLSAgICAgKi4wMjU0ICsuNSkpOwotfQotCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfeF9waXhlbHNfcGVyX2luY2gocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgcmV0dXJuICgocG5nX3VpbnRfMzIpKChmbG9hdClwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLCBpbmZvX3B0cikKLSAgICAgKi4wMjU0ICsuNSkpOwotfQotCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfeV9waXhlbHNfcGVyX2luY2gocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgcmV0dXJuICgocG5nX3VpbnRfMzIpKChmbG9hdClwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLCBpbmZvX3B0cikKLSAgICAgKi4wMjU0ICsuNSkpOwotfQotCi1mbG9hdCBQTkdBUEkKLXBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIHJldHVybiAoKGZsb2F0KXBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyhwbmdfcHRyLCBpbmZvX3B0cikKLSAgICAgKi4wMDAwMzkzNyk7Ci19Ci0KLWZsb2F0IFBOR0FQSQotcG5nX2dldF95X29mZnNldF9pbmNoZXMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgcmV0dXJuICgoZmxvYXQpcG5nX2dldF95X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKQotICAgICAqLjAwMDAzOTM3KTsKLX0KLQotI2lmIGRlZmluZWQoUE5HX3BIWXNfU1VQUE9SVEVEKQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3BIWXNfZHBpKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyICpyZXNfeCwgcG5nX3VpbnRfMzIgKnJlc195LCBpbnQgKnVuaXRfdHlwZSkKLXsKLSAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7Ci0KLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAicEhZcyIpOwotICAgICAgaWYgKHJlc194ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAqcmVzX3ggPSBpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQ7Ci0gICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKLSAgICAgIH0KLSAgICAgIGlmIChyZXNfeSAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgKnJlc195ID0gaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0OwotICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3BIWXM7Ci0gICAgICB9Ci0gICAgICBpZiAodW5pdF90eXBlICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAqdW5pdF90eXBlID0gKGludClpbmZvX3B0ci0+cGh5c191bml0X3R5cGU7Ci0gICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKLSAgICAgICAgIGlmICgqdW5pdF90eXBlID09IDEpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVzX3ggIT0gTlVMTCkgKnJlc194ID0gKHBuZ191aW50XzMyKSgqcmVzX3ggKiAuMDI1NCArIC41MCk7Ci0gICAgICAgICAgICBpZiAocmVzX3kgIT0gTlVMTCkgKnJlc195ID0gKHBuZ191aW50XzMyKSgqcmVzX3kgKiAuMDI1NCArIC41MCk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0gICByZXR1cm4gKHJldHZhbCk7Ci19Ci0jZW5kaWYgLyogUE5HX3BIWXNfU1VQUE9SVEVEICovCi0jZW5kaWYgIC8qIFBOR19JTkNIX0NPTlZFUlNJT05TICYmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQgKi8KLQotLyogcG5nX2dldF9jaGFubmVscyByZWFsbHkgYmVsb25ncyBpbiBoZXJlLCB0b28sIGJ1dCBpdCdzIGJlZW4gYXJvdW5kIGxvbmdlciAqLwotCi0jZW5kaWYgIC8qIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQgKi8KLQotcG5nX2J5dGUgUE5HQVBJCi1wbmdfZ2V0X2NoYW5uZWxzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCkKLSAgICAgIHJldHVybihpbmZvX3B0ci0+Y2hhbm5lbHMpOwotICAgZWxzZQotICAgICAgcmV0dXJuICgwKTsKLX0KLQotcG5nX2J5dGVwIFBOR0FQSQotcG5nX2dldF9zaWduYXR1cmUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcmV0dXJuKGluZm9fcHRyLT5zaWduYXR1cmUpOwotICAgZWxzZQotICAgICAgcmV0dXJuIChOVUxMKTsKLX0KLQotI2lmIGRlZmluZWQoUE5HX2JLR0RfU1VQUE9SVEVEKQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X2JLR0QocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX2NvbG9yXzE2cCAqYmFja2dyb3VuZCkKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fYktHRCkKLSAgICAgICYmIGJhY2tncm91bmQgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJiS0dEIik7Ci0gICAgICAqYmFja2dyb3VuZCA9ICYoaW5mb19wdHItPmJhY2tncm91bmQpOwotICAgICAgcmV0dXJuIChQTkdfSU5GT19iS0dEKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2NIUk1fU1VQUE9SVEVEKQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9jSFJNKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIGRvdWJsZSAqd2hpdGVfeCwgZG91YmxlICp3aGl0ZV95LCBkb3VibGUgKnJlZF94LCBkb3VibGUgKnJlZF95LAotICAgZG91YmxlICpncmVlbl94LCBkb3VibGUgKmdyZWVuX3ksIGRvdWJsZSAqYmx1ZV94LCBkb3VibGUgKmJsdWVfeSkKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fY0hSTSkpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiY0hSTSIpOwotICAgICAgaWYgKHdoaXRlX3ggIT0gTlVMTCkKLSAgICAgICAgICp3aGl0ZV94ID0gKGRvdWJsZSlpbmZvX3B0ci0+eF93aGl0ZTsKLSAgICAgIGlmICh3aGl0ZV95ICE9IE5VTEwpCi0gICAgICAgICAqd2hpdGVfeSA9IChkb3VibGUpaW5mb19wdHItPnlfd2hpdGU7Ci0gICAgICBpZiAocmVkX3ggIT0gTlVMTCkKLSAgICAgICAgICpyZWRfeCA9IChkb3VibGUpaW5mb19wdHItPnhfcmVkOwotICAgICAgaWYgKHJlZF95ICE9IE5VTEwpCi0gICAgICAgICAqcmVkX3kgPSAoZG91YmxlKWluZm9fcHRyLT55X3JlZDsKLSAgICAgIGlmIChncmVlbl94ICE9IE5VTEwpCi0gICAgICAgICAqZ3JlZW5feCA9IChkb3VibGUpaW5mb19wdHItPnhfZ3JlZW47Ci0gICAgICBpZiAoZ3JlZW5feSAhPSBOVUxMKQotICAgICAgICAgKmdyZWVuX3kgPSAoZG91YmxlKWluZm9fcHRyLT55X2dyZWVuOwotICAgICAgaWYgKGJsdWVfeCAhPSBOVUxMKQotICAgICAgICAgKmJsdWVfeCA9IChkb3VibGUpaW5mb19wdHItPnhfYmx1ZTsKLSAgICAgIGlmIChibHVlX3kgIT0gTlVMTCkKLSAgICAgICAgICpibHVlX3kgPSAoZG91YmxlKWluZm9fcHRyLT55X2JsdWU7Ci0gICAgICByZXR1cm4gKFBOR19JTkZPX2NIUk0pOwotICAgfQotICAgcmV0dXJuICgwKTsKLX0KLSNlbmRpZgotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9jSFJNX2ZpeGVkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ19maXhlZF9wb2ludCAqd2hpdGVfeCwgcG5nX2ZpeGVkX3BvaW50ICp3aGl0ZV95LCBwbmdfZml4ZWRfcG9pbnQgKnJlZF94LAotICAgcG5nX2ZpeGVkX3BvaW50ICpyZWRfeSwgcG5nX2ZpeGVkX3BvaW50ICpncmVlbl94LCBwbmdfZml4ZWRfcG9pbnQgKmdyZWVuX3ksCi0gICBwbmdfZml4ZWRfcG9pbnQgKmJsdWVfeCwgcG5nX2ZpeGVkX3BvaW50ICpibHVlX3kpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2NIUk0pKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImNIUk0iKTsKLSAgICAgIGlmICh3aGl0ZV94ICE9IE5VTEwpCi0gICAgICAgICAqd2hpdGVfeCA9IGluZm9fcHRyLT5pbnRfeF93aGl0ZTsKLSAgICAgIGlmICh3aGl0ZV95ICE9IE5VTEwpCi0gICAgICAgICAqd2hpdGVfeSA9IGluZm9fcHRyLT5pbnRfeV93aGl0ZTsKLSAgICAgIGlmIChyZWRfeCAhPSBOVUxMKQotICAgICAgICAgKnJlZF94ID0gaW5mb19wdHItPmludF94X3JlZDsKLSAgICAgIGlmIChyZWRfeSAhPSBOVUxMKQotICAgICAgICAgKnJlZF95ID0gaW5mb19wdHItPmludF95X3JlZDsKLSAgICAgIGlmIChncmVlbl94ICE9IE5VTEwpCi0gICAgICAgICAqZ3JlZW5feCA9IGluZm9fcHRyLT5pbnRfeF9ncmVlbjsKLSAgICAgIGlmIChncmVlbl95ICE9IE5VTEwpCi0gICAgICAgICAqZ3JlZW5feSA9IGluZm9fcHRyLT5pbnRfeV9ncmVlbjsKLSAgICAgIGlmIChibHVlX3ggIT0gTlVMTCkKLSAgICAgICAgICpibHVlX3ggPSBpbmZvX3B0ci0+aW50X3hfYmx1ZTsKLSAgICAgIGlmIChibHVlX3kgIT0gTlVMTCkKLSAgICAgICAgICpibHVlX3kgPSBpbmZvX3B0ci0+aW50X3lfYmx1ZTsKLSAgICAgIHJldHVybiAoUE5HX0lORk9fY0hSTSk7Ci0gICB9Ci0gICByZXR1cm4gKDApOwotfQotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2dBTUFfU1VQUE9SVEVEKQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9nQU1BKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgZG91YmxlICpmaWxlX2dhbW1hKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19nQU1BKQotICAgICAgJiYgZmlsZV9nYW1tYSAhPSBOVUxMKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImdBTUEiKTsKLSAgICAgICpmaWxlX2dhbW1hID0gKGRvdWJsZSlpbmZvX3B0ci0+Z2FtbWE7Ci0gICAgICByZXR1cm4gKFBOR19JTkZPX2dBTUEpOwotICAgfQotICAgcmV0dXJuICgwKTsKLX0KLSNlbmRpZgotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9nQU1BX2ZpeGVkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgICBwbmdfZml4ZWRfcG9pbnQgKmludF9maWxlX2dhbW1hKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19nQU1BKQotICAgICAgJiYgaW50X2ZpbGVfZ2FtbWEgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJnQU1BIik7Ci0gICAgICAqaW50X2ZpbGVfZ2FtbWEgPSBpbmZvX3B0ci0+aW50X2dhbW1hOwotICAgICAgcmV0dXJuIChQTkdfSU5GT19nQU1BKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfc1JHQl9TVVBQT1JURUQpCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfc1JHQihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCAqZmlsZV9zcmdiX2ludGVudCkKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikKLSAgICAgICYmIGZpbGVfc3JnYl9pbnRlbnQgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJzUkdCIik7Ci0gICAgICAqZmlsZV9zcmdiX2ludGVudCA9IChpbnQpaW5mb19wdHItPnNyZ2JfaW50ZW50OwotICAgICAgcmV0dXJuIChQTkdfSU5GT19zUkdCKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2lDQ1BfU1VQUE9SVEVEKQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X2lDQ1AocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgICAgICAgICAgIHBuZ19jaGFycHAgbmFtZSwgaW50ICpjb21wcmVzc2lvbl90eXBlLAotICAgICAgICAgICAgIHBuZ19jaGFycHAgcHJvZmlsZSwgcG5nX3VpbnRfMzIgKnByb2ZsZW4pCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2lDQ1ApCi0gICAgICAmJiBuYW1lICE9IE5VTEwgJiYgcHJvZmlsZSAhPSBOVUxMICYmIHByb2ZsZW4gIT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJpQ0NQIik7Ci0gICAgICAqbmFtZSA9IGluZm9fcHRyLT5pY2NwX25hbWU7Ci0gICAgICAqcHJvZmlsZSA9IGluZm9fcHRyLT5pY2NwX3Byb2ZpbGU7Ci0gICAgICAvKiBDb21wcmVzc2lvbl90eXBlIGlzIGEgZHVtbXkgc28gdGhlIEFQSSB3b24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICogaWYgd2UgaW50cm9kdWNlIG11bHRpcGxlIGNvbXByZXNzaW9uIHR5cGVzIGxhdGVyLgotICAgICAgICovCi0gICAgICAqcHJvZmxlbiA9IChpbnQpaW5mb19wdHItPmljY3BfcHJvZmxlbjsKLSAgICAgICpjb21wcmVzc2lvbl90eXBlID0gKGludClpbmZvX3B0ci0+aWNjcF9jb21wcmVzc2lvbjsKLSAgICAgIHJldHVybiAoUE5HX0lORk9faUNDUCk7Ci0gICB9Ci0gICByZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19zUExUX1NVUFBPUlRFRCkKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9zUExUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgICAgICAgICAgICBwbmdfc1BMVF90cHAgc3BhbGV0dGVzKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIHNwYWxldHRlcyAhPSBOVUxMKQotICAgewotICAgICAqc3BhbGV0dGVzID0gaW5mb19wdHItPnNwbHRfcGFsZXR0ZXM7Ci0gICAgIHJldHVybiAoKHBuZ191aW50XzMyKWluZm9fcHRyLT5zcGx0X3BhbGV0dGVzX251bSk7Ci0gICB9Ci0gICByZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19oSVNUX1NVUFBPUlRFRCkKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9oSVNUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMTZwICpoaXN0KQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19oSVNUKQotICAgICAgJiYgaGlzdCAhPSBOVUxMKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgImhJU1QiKTsKLSAgICAgICpoaXN0ID0gaW5mb19wdHItPmhpc3Q7Ci0gICAgICByZXR1cm4gKFBOR19JTkZPX2hJU1QpOwotICAgfQotICAgcmV0dXJuICgwKTsKLX0KLSNlbmRpZgotCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfSUhEUihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfdWludF8zMiAqd2lkdGgsIHBuZ191aW50XzMyICpoZWlnaHQsIGludCAqYml0X2RlcHRoLAotICAgaW50ICpjb2xvcl90eXBlLCBpbnQgKmludGVybGFjZV90eXBlLCBpbnQgKmNvbXByZXNzaW9uX3R5cGUsCi0gICBpbnQgKmZpbHRlcl90eXBlKQotCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgd2lkdGggIT0gTlVMTCAmJiBoZWlnaHQgIT0gTlVMTCAmJgotICAgICAgYml0X2RlcHRoICE9IE5VTEwgJiYgY29sb3JfdHlwZSAhPSBOVUxMKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgIklIRFIiKTsKLSAgICAgICp3aWR0aCA9IGluZm9fcHRyLT53aWR0aDsKLSAgICAgICpoZWlnaHQgPSBpbmZvX3B0ci0+aGVpZ2h0OwotICAgICAgKmJpdF9kZXB0aCA9IGluZm9fcHRyLT5iaXRfZGVwdGg7Ci0gICAgICBpZiAoaW5mb19wdHItPmJpdF9kZXB0aCA8IDEgfHwgaW5mb19wdHItPmJpdF9kZXB0aCA+IDE2KQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGJpdCBkZXB0aCIpOwotCi0gICAgICAqY29sb3JfdHlwZSA9IGluZm9fcHRyLT5jb2xvcl90eXBlOwotCi0gICAgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPiA2KQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGNvbG9yIHR5cGUiKTsKLQotICAgICAgaWYgKGNvbXByZXNzaW9uX3R5cGUgIT0gTlVMTCkKLSAgICAgICAgICpjb21wcmVzc2lvbl90eXBlID0gaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGU7Ci0KLSAgICAgIGlmIChmaWx0ZXJfdHlwZSAhPSBOVUxMKQotICAgICAgICAgKmZpbHRlcl90eXBlID0gaW5mb19wdHItPmZpbHRlcl90eXBlOwotCi0gICAgICBpZiAoaW50ZXJsYWNlX3R5cGUgIT0gTlVMTCkKLSAgICAgICAgICppbnRlcmxhY2VfdHlwZSA9IGluZm9fcHRyLT5pbnRlcmxhY2VfdHlwZTsKLQotICAgICAgLyogQ2hlY2sgZm9yIHBvdGVudGlhbCBvdmVyZmxvdyBvZiByb3dieXRlcyAqLwotICAgICAgaWYgKCp3aWR0aCA9PSAwIHx8ICp3aWR0aCA+IFBOR19VSU5UXzMxX01BWCkKLSAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGltYWdlIHdpZHRoIik7Ci0KLSAgICAgIGlmICgqaGVpZ2h0ID09IDAgfHwgKmhlaWdodCA+IFBOR19VSU5UXzMxX01BWCkKLSAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGltYWdlIGhlaWdodCIpOwotCi0gICAgICBpZiAoaW5mb19wdHItPndpZHRoID4gKFBOR19VSU5UXzMyX01BWAotICAgICAgICAgICAgICAgICA+PiAzKSAgICAgIC8qIDgtYnl0ZSBSR0JBIHBpeGVscyAqLwotICAgICAgICAgICAgICAgICAtIDY0ICAgICAgIC8qIGJpZ3Jvd2J1ZiBoYWNrICovCi0gICAgICAgICAgICAgICAgIC0gMSAgICAgICAgLyogZmlsdGVyIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICAgLSA3KjggICAgICAvKiByb3VuZGluZyBvZiB3aWR0aCB0byBtdWx0aXBsZSBvZiA4IHBpeGVscyAqLwotICAgICAgICAgICAgICAgICAtIDgpICAgICAgIC8qIGV4dHJhIG1heF9waXhlbF9kZXB0aCBwYWQgKi8KLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgICAiV2lkdGggdG9vIGxhcmdlIGZvciBsaWJwbmcgdG8gcHJvY2VzcyBpbWFnZSBkYXRhLiIpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gKDEpOwotICAgfQotICAgcmV0dXJuICgwKTsKLX0KLQotI2lmIGRlZmluZWQoUE5HX29GRnNfU1VQUE9SVEVEKQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X29GRnMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX2ludF8zMiAqb2Zmc2V0X3gsIHBuZ19pbnRfMzIgKm9mZnNldF95LCBpbnQgKnVuaXRfdHlwZSkKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykKLSAgICAgICYmIG9mZnNldF94ICE9IE5VTEwgJiYgb2Zmc2V0X3kgIT0gTlVMTCAmJiB1bml0X3R5cGUgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHJldHJpZXZhbCBmdW5jdGlvbiIsICJvRkZzIik7Ci0gICAgICAqb2Zmc2V0X3ggPSBpbmZvX3B0ci0+eF9vZmZzZXQ7Ci0gICAgICAqb2Zmc2V0X3kgPSBpbmZvX3B0ci0+eV9vZmZzZXQ7Ci0gICAgICAqdW5pdF90eXBlID0gKGludClpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZTsKLSAgICAgIHJldHVybiAoUE5HX0lORk9fb0ZGcyk7Ci0gICB9Ci0gICByZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19wQ0FMX1NVUFBPUlRFRCkKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9wQ0FMKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ19jaGFycCAqcHVycG9zZSwgcG5nX2ludF8zMiAqWDAsIHBuZ19pbnRfMzIgKlgxLCBpbnQgKnR5cGUsIGludCAqbnBhcmFtcywKLSAgIHBuZ19jaGFycCAqdW5pdHMsIHBuZ19jaGFycHAgKnBhcmFtcykKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcENBTCkKLSAgICAgICAmJiBwdXJwb3NlICE9IE5VTEwgJiYgWDAgIT0gTlVMTCAmJiBYMSAhPSBOVUxMICYmIHR5cGUgIT0gTlVMTCAmJgotICAgICAgIG5wYXJhbXMgIT0gTlVMTCAmJiB1bml0cyAhPSBOVUxMICYmIHBhcmFtcyAhPSBOVUxMKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBDQUwiKTsKLSAgICAgICpwdXJwb3NlID0gaW5mb19wdHItPnBjYWxfcHVycG9zZTsKLSAgICAgICpYMCA9IGluZm9fcHRyLT5wY2FsX1gwOwotICAgICAgKlgxID0gaW5mb19wdHItPnBjYWxfWDE7Ci0gICAgICAqdHlwZSA9IChpbnQpaW5mb19wdHItPnBjYWxfdHlwZTsKLSAgICAgICpucGFyYW1zID0gKGludClpbmZvX3B0ci0+cGNhbF9ucGFyYW1zOwotICAgICAgKnVuaXRzID0gaW5mb19wdHItPnBjYWxfdW5pdHM7Ci0gICAgICAqcGFyYW1zID0gaW5mb19wdHItPnBjYWxfcGFyYW1zOwotICAgICAgcmV0dXJuIChQTkdfSU5GT19wQ0FMKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3NDQUxfU1VQUE9SVEVEKQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9zQ0FMKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgICAgICAgICAgICBpbnQgKnVuaXQsIGRvdWJsZSAqd2lkdGgsIGRvdWJsZSAqaGVpZ2h0KQotewotICAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgotICAgICAgICAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0NBTCkpCi0gICAgewotICAgICAgICAqdW5pdCA9IGluZm9fcHRyLT5zY2FsX3VuaXQ7Ci0gICAgICAgICp3aWR0aCA9IGluZm9fcHRyLT5zY2FsX3BpeGVsX3dpZHRoOwotICAgICAgICAqaGVpZ2h0ID0gaW5mb19wdHItPnNjYWxfcGl4ZWxfaGVpZ2h0OwotICAgICAgICByZXR1cm4gKFBOR19JTkZPX3NDQUwpOwotICAgIH0KLSAgICByZXR1cm4oMCk7Ci19Ci0jZWxzZQotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9zQ0FMX3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgICAgICAgICAgIGludCAqdW5pdCwgcG5nX2NoYXJwcCB3aWR0aCwgcG5nX2NoYXJwcCBoZWlnaHQpCi17Ci0gICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmCi0gICAgICAgIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQ0FMKSkKLSAgICB7Ci0gICAgICAgICp1bml0ID0gaW5mb19wdHItPnNjYWxfdW5pdDsKLSAgICAgICAgKndpZHRoID0gaW5mb19wdHItPnNjYWxfc193aWR0aDsKLSAgICAgICAgKmhlaWdodCA9IGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0OwotICAgICAgICByZXR1cm4gKFBOR19JTkZPX3NDQUwpOwotICAgIH0KLSAgICByZXR1cm4oMCk7Ci19Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19wSFlzX1NVUFBPUlRFRCkKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9wSFlzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyICpyZXNfeCwgcG5nX3VpbnRfMzIgKnJlc195LCBpbnQgKnVuaXRfdHlwZSkKLXsKLSAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7Ci0KLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJgotICAgICAgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInBIWXMiKTsKLQotICAgICAgaWYgKHJlc194ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAqcmVzX3ggPSBpbmZvX3B0ci0+eF9waXhlbHNfcGVyX3VuaXQ7Ci0gICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKLSAgICAgIH0KLQotICAgICAgaWYgKHJlc195ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAqcmVzX3kgPSBpbmZvX3B0ci0+eV9waXhlbHNfcGVyX3VuaXQ7Ci0gICAgICAgICByZXR2YWwgfD0gUE5HX0lORk9fcEhZczsKLSAgICAgIH0KLQotICAgICAgaWYgKHVuaXRfdHlwZSAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgKnVuaXRfdHlwZSA9IChpbnQpaW5mb19wdHItPnBoeXNfdW5pdF90eXBlOwotICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3BIWXM7Ci0gICAgICB9Ci0gICB9Ci0gICByZXR1cm4gKHJldHZhbCk7Ci19Ci0jZW5kaWYKLQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X1BMVEUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfY29sb3JwICpwYWxldHRlLAotICAgaW50ICpudW1fcGFsZXR0ZSkKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fUExURSkKLSAgICAgICAmJiBwYWxldHRlICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAiUExURSIpOwotICAgICAgKnBhbGV0dGUgPSBpbmZvX3B0ci0+cGFsZXR0ZTsKLSAgICAgICpudW1fcGFsZXR0ZSA9IGluZm9fcHRyLT5udW1fcGFsZXR0ZTsKLSAgICAgIHBuZ19kZWJ1ZzEoMywgIm51bV9wYWxldHRlID0gJWQiLCAqbnVtX3BhbGV0dGUpOwotICAgICAgcmV0dXJuIChQTkdfSU5GT19QTFRFKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0KLSNpZiBkZWZpbmVkKFBOR19zQklUX1NVUFBPUlRFRCkKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9zQklUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2NvbG9yXzhwICpzaWdfYml0KQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQklUKQotICAgICAgJiYgc2lnX2JpdCAhPSBOVUxMKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInNCSVQiKTsKLSAgICAgICpzaWdfYml0ID0gJihpbmZvX3B0ci0+c2lnX2JpdCk7Ci0gICAgICByZXR1cm4gKFBOR19JTkZPX3NCSVQpOwotICAgfQotICAgcmV0dXJuICgwKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfVEVYVF9TVVBQT1JURUQpCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfdGV4dChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ190ZXh0cCAqdGV4dF9wdHIsCi0gICBpbnQgKm51bV90ZXh0KQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyLT5udW1fdGV4dCA+IDApCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLAotICAgICAgICAgKHBuZ19wdHItPmNodW5rX25hbWVbMF0gPT0gJ1wwJyA/ICJ0ZXh0IgotICAgICAgICAgICAgIDogKHBuZ19jb25zdF9jaGFycClwbmdfcHRyLT5jaHVua19uYW1lKSk7Ci0KLSAgICAgIGlmICh0ZXh0X3B0ciAhPSBOVUxMKQotICAgICAgICAgKnRleHRfcHRyID0gaW5mb19wdHItPnRleHQ7Ci0KLSAgICAgIGlmIChudW1fdGV4dCAhPSBOVUxMKQotICAgICAgICAgKm51bV90ZXh0ID0gaW5mb19wdHItPm51bV90ZXh0OwotCi0gICAgICByZXR1cm4gKChwbmdfdWludF8zMilpbmZvX3B0ci0+bnVtX3RleHQpOwotICAgfQotICAgaWYgKG51bV90ZXh0ICE9IE5VTEwpCi0gICAgICpudW1fdGV4dCA9IDA7Ci0gICByZXR1cm4oMCk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3RJTUVfU1VQUE9SVEVEKQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3RJTUUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdGltZXAgKm1vZF90aW1lKQotewotICAgaWYgKHBuZ19wdHIgIT0gTlVMTCAmJiBpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190SU1FKQotICAgICAgICYmIG1vZF90aW1lICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDEsICJpbiAlcyByZXRyaWV2YWwgZnVuY3Rpb24iLCAidElNRSIpOwotICAgICAgKm1vZF90aW1lID0gJihpbmZvX3B0ci0+bW9kX3RpbWUpOwotICAgICAgcmV0dXJuIChQTkdfSU5GT190SU1FKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3RSTlNfU1VQUE9SVEVEKQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3RSTlMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX2J5dGVwICp0cmFucywgaW50ICpudW1fdHJhbnMsIHBuZ19jb2xvcl8xNnAgKnRyYW5zX3ZhbHVlcykKLXsKLSAgIHBuZ191aW50XzMyIHJldHZhbCA9IDA7Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RSTlMpKQotICAgewotICAgICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgcmV0cmlldmFsIGZ1bmN0aW9uIiwgInRSTlMiKTsKLSAgICAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgewotICAgICAgICAgIGlmICh0cmFucyAhPSBOVUxMKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAqdHJhbnMgPSBpbmZvX3B0ci0+dHJhbnM7Ci0gICAgICAgICAgICAgcmV0dmFsIHw9IFBOR19JTkZPX3RSTlM7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHRyYW5zX3ZhbHVlcyAhPSBOVUxMKQotICAgICAgICAgICAgICp0cmFuc192YWx1ZXMgPSAmKGluZm9fcHRyLT50cmFuc192YWx1ZXMpOwotICAgICAgfQotICAgICAgZWxzZSAvKiBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgKi8KLSAgICAgIHsKLSAgICAgICAgICBpZiAodHJhbnNfdmFsdWVzICE9IE5VTEwpCi0gICAgICAgICAgewotICAgICAgICAgICAgICp0cmFuc192YWx1ZXMgPSAmKGluZm9fcHRyLT50cmFuc192YWx1ZXMpOwotICAgICAgICAgICAgIHJldHZhbCB8PSBQTkdfSU5GT190Uk5TOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICh0cmFucyAhPSBOVUxMKQotICAgICAgICAgICAgICp0cmFucyA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBpZiAobnVtX3RyYW5zICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAqbnVtX3RyYW5zID0gaW5mb19wdHItPm51bV90cmFuczsKLSAgICAgICAgIHJldHZhbCB8PSBQTkdfSU5GT190Uk5TOwotICAgICAgfQotICAgfQotICAgcmV0dXJuIChyZXR2YWwpOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfdW5rbm93bl9jaHVua3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgICAgICAgICAgIHBuZ191bmtub3duX2NodW5rcHAgdW5rbm93bnMpCi17Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIGluZm9fcHRyICE9IE5VTEwgJiYgdW5rbm93bnMgIT0gTlVMTCkKLSAgIHsKLSAgICAgKnVua25vd25zID0gaW5mb19wdHItPnVua25vd25fY2h1bmtzOwotICAgICByZXR1cm4gKChwbmdfdWludF8zMilpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtKTsKLSAgIH0KLSAgIHJldHVybiAoMCk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKQotcG5nX2J5dGUgUE5HQVBJCi1wbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cyAocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHJldHVybiAocG5nX2J5dGUpKHBuZ19wdHI/IHBuZ19wdHItPnJnYl90b19ncmF5X3N0YXR1cyA6IDApOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQpCi1wbmdfdm9pZHAgUE5HQVBJCi1wbmdfZ2V0X3VzZXJfY2h1bmtfcHRyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICByZXR1cm4gKHBuZ19wdHI/IHBuZ19wdHItPnVzZXJfY2h1bmtfcHRyIDogTlVMTCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLXBuZ191aW50XzMyIFBOR0FQSQotcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZShwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcmV0dXJuIChwbmdfdWludF8zMikocG5nX3B0cj8gcG5nX3B0ci0+emJ1Zl9zaXplIDogMEwpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVECi0jaWZuZGVmIFBOR18xXzBfWAotLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuMi4wIGFuZCBzaG91bGQgZXhpc3QgYnkgZGVmYXVsdCAqLwotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X2FzbV9mbGFncyAocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgICAvKiBPYnNvbGV0ZSwgdG8gYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjQuMCAqLwotICAgIHJldHVybiAocG5nX3B0cj8gMEw6IDBMKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuMi4wIGFuZCBzaG91bGQgZXhpc3QgYnkgZGVmYXVsdCAqLwotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X2FzbV9mbGFnbWFzayAoaW50IGZsYWdfc2VsZWN0KQotewotICAgIC8qIE9ic29sZXRlLCB0byBiZSByZW1vdmVkIGZyb20gbGlicG5nLTEuNC4wICovCi0gICAgZmxhZ19zZWxlY3Q9ZmxhZ19zZWxlY3Q7Ci0gICAgcmV0dXJuIDBMOwotfQotCi0gICAgLyogR1JSOiAgY291bGQgYWRkIHRoaXM6ICAgJiYgZGVmaW5lZChQTkdfTU1YX0NPREVfU1VQUE9SVEVEKSAqLwotLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuMi4wICovCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfbW14X2ZsYWdtYXNrIChpbnQgZmxhZ19zZWxlY3QsIGludCAqY29tcGlsZXJJRCkKLXsKLSAgICAvKiBPYnNvbGV0ZSwgdG8gYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjQuMCAqLwotICAgIGZsYWdfc2VsZWN0PWZsYWdfc2VsZWN0OwotICAgICpjb21waWxlcklEID0gLTE7ICAgLyogdW5rbm93biAoaS5lLiwgbm8gYXNtL01NWCBjb2RlIGNvbXBpbGVkKSAqLwotICAgIHJldHVybiAwTDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gbGlicG5nIDEuMi4wICovCi1wbmdfYnl0ZSBQTkdBUEkKLXBuZ19nZXRfbW14X2JpdGRlcHRoX3RocmVzaG9sZCAocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgICAvKiBPYnNvbGV0ZSwgdG8gYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjQuMCAqLwotICAgIHJldHVybiAocG5nX3B0cj8gMDogMCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGxpYnBuZyAxLjIuMCAqLwotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X21teF9yb3dieXRlc190aHJlc2hvbGQgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICAgLyogT2Jzb2xldGUsIHRvIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS40LjAgKi8KLSAgICByZXR1cm4gKHBuZ19wdHI/IDBMOiAwTCk7Ci19Ci0jZW5kaWYgLyogP1BOR18xXzBfWCAqLwotI2VuZGlmIC8qID9QTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAotLyogVGhlc2UgZnVuY3Rpb25zIHdlcmUgYWRkZWQgdG8gbGlicG5nIDEuMi42ICovCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfdXNlcl93aWR0aF9tYXggKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICAgcmV0dXJuIChwbmdfcHRyPyBwbmdfcHRyLT51c2VyX3dpZHRoX21heCA6IDApOwotfQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3VzZXJfaGVpZ2h0X21heCAocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgICByZXR1cm4gKHBuZ19wdHI/IHBuZ19wdHItPnVzZXJfaGVpZ2h0X21heCA6IDApOwotfQotI2VuZGlmIC8qID9QTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRCAqLwotIAotCi0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEIHx8IFBOR19XUklURV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3BuZ21lbS5jIGIvbGlicy9saWJwbmcvcG5nbWVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOTk5YjYuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5nbWVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTcgKzAsMCBAQAotCi0vKiBwbmdtZW0uYyAtIHN0dWIgZnVuY3Rpb25zIGZvciBtZW1vcnkgYWxsb2NhdGlvbgotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS4yLjM3IFtKdW5lIDQsIDIwMDldCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCi0gKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCi0gKgotICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgbG9jYXRpb24gZm9yIGFsbCBtZW1vcnkgYWxsb2NhdGlvbi4gIFVzZXJzIHdobwotICogbmVlZCBzcGVjaWFsIG1lbW9yeSBoYW5kbGluZyBhcmUgZXhwZWN0ZWQgdG8gc3VwcGx5IHJlcGxhY2VtZW50Ci0gKiBmdW5jdGlvbnMgZm9yIHBuZ19tYWxsb2MoKSBhbmQgcG5nX2ZyZWUoKSwgYW5kIHRvIHVzZQotICogcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgYW5kIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSB0bwotICogaWRlbnRpZnkgdGhlIHJlcGxhY2VtZW50IGZ1bmN0aW9ucy4KLSAqLwotCi0jZGVmaW5lIFBOR19JTlRFUk5BTAotI2luY2x1ZGUgInBuZy5oIgotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCi0KLS8qIEJvcmxhbmQgRE9TIHNwZWNpYWwgbWVtb3J5IGhhbmRsZXIgKi8KLSNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmICFkZWZpbmVkKF9XaW5kb3dzKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykKLS8qIElmIHlvdSBjaGFuZ2UgdGhpcywgYmUgc3VyZSB0byBjaGFuZ2UgdGhlIG9uZSBpbiBwbmcuaCBhbHNvICovCi0KLS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBwbmdfc3RydWN0LiAgVGhlIG1hbGxvYyBhbmQgbWVtc2V0IGNhbiBiZSByZXBsYWNlZAotICAgYnkgYSBzaW5nbGUgY2FsbCB0byBjYWxsb2MoKSBpZiB0aGlzIGlzIHRob3VnaHQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gKi8KLXBuZ192b2lkcCAvKiBQUklWQVRFICovCi1wbmdfY3JlYXRlX3N0cnVjdChpbnQgdHlwZSkKLXsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICByZXR1cm4gKHBuZ19jcmVhdGVfc3RydWN0XzIodHlwZSwgcG5nX21hbGxvY19wdHJfTlVMTCwgcG5nX3ZvaWRwX05VTEwpKTsKLX0KLQotLyogQWx0ZXJuYXRlIHZlcnNpb24gb2YgcG5nX2NyZWF0ZV9zdHJ1Y3QsIGZvciB1c2Ugd2l0aCB1c2VyLWRlZmluZWQgbWFsbG9jLiAqLwotcG5nX3ZvaWRwIC8qIFBSSVZBVEUgKi8KLXBuZ19jcmVhdGVfc3RydWN0XzIoaW50IHR5cGUsIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX3ZvaWRwIG1lbV9wdHIpCi17Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLwotICAgcG5nX3NpemVfdCBzaXplOwotICAgcG5nX3ZvaWRwIHN0cnVjdF9wdHI7Ci0KLSAgIGlmICh0eXBlID09IFBOR19TVFJVQ1RfSU5GTykKLSAgICAgIHNpemUgPSBwbmdfc2l6ZW9mKHBuZ19pbmZvKTsKLSAgIGVsc2UgaWYgKHR5cGUgPT0gUE5HX1NUUlVDVF9QTkcpCi0gICAgICBzaXplID0gcG5nX3NpemVvZihwbmdfc3RydWN0KTsKLSAgIGVsc2UKLSAgICAgIHJldHVybiAocG5nX2dldF9jb3B5cmlnaHQoTlVMTCkpOwotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgaWYgKG1hbGxvY19mbiAhPSBOVUxMKQotICAgewotICAgICAgcG5nX3N0cnVjdCBkdW1teV9zdHJ1Y3Q7Ci0gICAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gJmR1bW15X3N0cnVjdDsKLSAgICAgIHBuZ19wdHItPm1lbV9wdHI9bWVtX3B0cjsKLSAgICAgIHN0cnVjdF9wdHIgPSAoKihtYWxsb2NfZm4pKShwbmdfcHRyLCAocG5nX3VpbnRfMzIpc2l6ZSk7Ci0gICB9Ci0gICBlbHNlCi0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLwotICAgc3RydWN0X3B0ciA9IChwbmdfdm9pZHApZmFybWFsbG9jKHNpemUpOwotICAgaWYgKHN0cnVjdF9wdHIgIT0gTlVMTCkKLSAgICAgIHBuZ19tZW1zZXQoc3RydWN0X3B0ciwgMCwgc2l6ZSk7Ci0gICByZXR1cm4gKHN0cnVjdF9wdHIpOwotfQotCi0vKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYSBwbmdfY3JlYXRlX3N0cnVjdCgpIGNhbGwgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2Rlc3Ryb3lfc3RydWN0KHBuZ192b2lkcCBzdHJ1Y3RfcHRyKQotewotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIHBuZ19kZXN0cm95X3N0cnVjdF8yKHN0cnVjdF9wdHIsIHBuZ19mcmVlX3B0cl9OVUxMLCBwbmdfdm9pZHBfTlVMTCk7Ci19Ci0KLS8qIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBhIHBuZ19jcmVhdGVfc3RydWN0KCkgY2FsbCAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZGVzdHJveV9zdHJ1Y3RfMihwbmdfdm9pZHAgc3RydWN0X3B0ciwgcG5nX2ZyZWVfcHRyIGZyZWVfZm4sCi0gICAgcG5nX3ZvaWRwIG1lbV9wdHIpCi17Ci0jZW5kaWYKLSAgIGlmIChzdHJ1Y3RfcHRyICE9IE5VTEwpCi0gICB7Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgaWYgKGZyZWVfZm4gIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zdHJ1Y3QgZHVtbXlfc3RydWN0OwotICAgICAgICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9ICZkdW1teV9zdHJ1Y3Q7Ci0gICAgICAgICBwbmdfcHRyLT5tZW1fcHRyPW1lbV9wdHI7Ci0gICAgICAgICAoKihmcmVlX2ZuKSkocG5nX3B0ciwgc3RydWN0X3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLwotICAgICAgZmFyZnJlZSAoc3RydWN0X3B0cik7Ci0gICB9Ci19Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeS4gIEZvciByZWFzb25hYmxlIGZpbGVzLCBzaXplIHNob3VsZCBuZXZlciBleGNlZWQKLSAqIDY0Sy4gIEhvd2V2ZXIsIHpsaWIgbWF5IGFsbG9jYXRlIG1vcmUgdGhlbiA2NEsgaWYgeW91IGRvbid0IHRlbGwKLSAqIGl0IG5vdCB0by4gIFNlZSB6Y29uZi5oIGFuZCBwbmcuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gemxpYiBkb2VzCi0gKiBuZWVkIHRvIGFsbG9jYXRlIGV4YWN0bHkgNjRLLCBzbyB3aGF0ZXZlciB5b3UgY2FsbCBoZXJlIG11c3QKLSAqIGhhdmUgdGhlIGFiaWxpdHkgdG8gZG8gdGhhdC4KLSAqCi0gKiBCb3JsYW5kIHNlZW1zIHRvIGhhdmUgYSBwcm9ibGVtIGluIERPUyBtb2RlIGZvciBleGFjdGx5IDY0Sy4KLSAqIEl0IGdpdmVzIHlvdSBhIHNlZ21lbnQgd2l0aCBhbiBvZmZzZXQgb2YgOCAocGVyaGFwcyB0byBzdG9yZSBpdHMKLSAqIG1lbW9yeSBzdHVmZikuICB6bGliIGRvZXNuJ3QgbGlrZSB0aGlzIGF0IGFsbCwgc28gd2UgaGF2ZSB0bwotICogZGV0ZWN0IGFuZCBkZWFsIHdpdGggaXQuICBUaGlzIGNvZGUgc2hvdWxkIG5vdCBiZSBuZWVkZWQgaW4KLSAqIFdpbmRvd3Mgb3IgT1MvMiBtb2RlcywgYW5kIG9ubHkgaW4gMTYgYml0IG1vZGUuICBUaGlzIGNvZGUgaGFzCi0gKiBiZWVuIHVwZGF0ZWQgYnkgQWxleGFuZGVyIExlaG1hbm4gZm9yIHZlcnNpb24gMC44OSB0byB3YXN0ZSBsZXNzCi0gKiBtZW1vcnkuCi0gKgotICogTm90ZSB0aGF0IHdlIGNhbid0IHVzZSBwbmdfc2l6ZV90IGZvciB0aGUgInNpemUiIGRlY2xhcmF0aW9uLAotICogc2luY2Ugb24gc29tZSBzeXN0ZW1zIGEgcG5nX3NpemVfdCBpcyBhIDE2LWJpdCBxdWFudGl0eSwgYW5kIGFzIGEKLSAqIHJlc3VsdCwgd2Ugd291bGQgYmUgdHJ1bmNhdGluZyBwb3RlbnRpYWxseSBsYXJnZXIgbWVtb3J5IHJlcXVlc3RzCi0gKiAod2hpY2ggc2hvdWxkIGNhdXNlIGEgZmF0YWwgZXJyb3IpIGFuZCBpbnRyb2R1Y2luZyBtYWpvciBwcm9ibGVtcy4KLSAqLwotCi1wbmdfdm9pZHAgUE5HQVBJCi1wbmdfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCi17Ci0gICBwbmdfdm9pZHAgcmV0OwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHNpemUgPT0gMCkKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+bWFsbG9jX2ZuICE9IE5VTEwpCi0gICAgICByZXQgPSAoKHBuZ192b2lkcCkoKihwbmdfcHRyLT5tYWxsb2NfZm4pKShwbmdfcHRyLCAocG5nX3NpemVfdClzaXplKSk7Ci0gICBlbHNlCi0gICAgICByZXQgPSAocG5nX21hbGxvY19kZWZhdWx0KHBuZ19wdHIsIHNpemUpKTsKLSAgIGlmIChyZXQgPT0gTlVMTCAmJiAocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQotICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IG9mIG1lbW9yeSEiKTsKLSAgIHJldHVybiAocmV0KTsKLX0KLQotcG5nX3ZvaWRwIFBOR0FQSQotcG5nX21hbGxvY19kZWZhdWx0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCi17Ci0gICBwbmdfdm9pZHAgcmV0OwotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBzaXplID09IDApCi0gICAgICByZXR1cm4gKE5VTEwpOwotCi0jaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCi0gICBpZiAoc2l6ZSA+IChwbmdfdWludF8zMik2NTUzNkwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiQ2Fubm90IEFsbG9jYXRlID4gNjRLIik7Ci0gICAgICByZXQgPSBOVUxMOwotICAgfQotICAgZWxzZQotI2VuZGlmCi0KLSAgIGlmIChzaXplICE9IChzaXplX3Qpc2l6ZSkKLSAgICAgIHJldCA9IE5VTEw7Ci0gICBlbHNlIGlmIChzaXplID09IChwbmdfdWludF8zMik2NTUzNkwpCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+b2Zmc2V0X3RhYmxlID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAvKiBUcnkgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZG8gYW55IG9mIHRoaXMgZmFuY3kgc3R1ZmYgKi8KLSAgICAgICAgIHJldCA9IGZhcm1hbGxvYyhzaXplKTsKLSAgICAgICAgIGlmIChyZXQgPT0gTlVMTCB8fCAoKHBuZ19zaXplX3QpcmV0ICYgMHhmZmZmKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBudW1fYmxvY2tzOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgdG90YWxfc2l6ZTsKLSAgICAgICAgICAgIHBuZ19ieXRlcCB0YWJsZTsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgcG5nX2J5dGUgaHVnZSAqIGhwdHI7Ci0KLSAgICAgICAgICAgIGlmIChyZXQgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZhcmZyZWUocmV0KTsKLSAgICAgICAgICAgICAgIHJldCA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT56bGliX3dpbmRvd19iaXRzID4gMTQpCi0gICAgICAgICAgICAgICBudW1fYmxvY2tzID0gKGludCkoMSA8PCAocG5nX3B0ci0+emxpYl93aW5kb3dfYml0cyAtIDE0KSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBudW1fYmxvY2tzID0gMTsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT56bGliX21lbV9sZXZlbCA+PSA3KQotICAgICAgICAgICAgICAgbnVtX2Jsb2NrcyArPSAoaW50KSgxIDw8IChwbmdfcHRyLT56bGliX21lbV9sZXZlbCAtIDcpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIG51bV9ibG9ja3MrKzsKLQotICAgICAgICAgICAgdG90YWxfc2l6ZSA9ICgocG5nX3VpbnRfMzIpNjU1MzZMKSAqIChwbmdfdWludF8zMiludW1fYmxvY2tzKzE2OwotCi0gICAgICAgICAgICB0YWJsZSA9IGZhcm1hbGxvYyh0b3RhbF9zaXplKTsKLQotICAgICAgICAgICAgaWYgKHRhYmxlID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0jaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgICAgICAgICAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgT2YgTWVtb3J5LiIpOyAvKiBOb3RlICJPIiBhbmQgIk0iICovCi0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IE9mIE1lbW9yeS4iKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChwbmdfc2l6ZV90KXRhYmxlICYgMHhmZmYwKQotICAgICAgICAgICAgewotI2lmbmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICAgICAgICAgICAgICBpZiAoKHBuZ19wdHItPmZsYWdzJlBOR19GTEFHX01BTExPQ19OVUxMX01FTV9PSykgPT0gMCkKLSAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAiRmFybWFsbG9jIGRpZG4ndCByZXR1cm4gbm9ybWFsaXplZCBwb2ludGVyIik7Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAiRmFybWFsbG9jIGRpZG4ndCByZXR1cm4gbm9ybWFsaXplZCBwb2ludGVyIik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZSA9IHRhYmxlOwotICAgICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0ciA9IGZhcm1hbGxvYyhudW1fYmxvY2tzICoKLSAgICAgICAgICAgICAgIHBuZ19zaXplb2YocG5nX2J5dGVwKSk7Ci0KLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5vZmZzZXRfdGFibGVfcHRyID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0jaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgICAgICAgICAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgT2YgbWVtb3J5LiIpOyAvKiBOb3RlICJPIiBhbmQgIk0iICovCi0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IE9mIG1lbW9yeS4iKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaHB0ciA9IChwbmdfYnl0ZSBodWdlICopdGFibGU7Ci0gICAgICAgICAgICBpZiAoKHBuZ19zaXplX3QpaHB0ciAmIDB4ZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGhwdHIgPSAocG5nX2J5dGUgaHVnZSAqKSgobG9uZykoaHB0cikgJiAweGZmZmZmZmYwTCk7Ci0gICAgICAgICAgICAgICBocHRyID0gaHB0ciArIDE2TDsgIC8qICJocHRyICs9IDE2TCIgZmFpbHMgb24gVHVyYm8gQysrIDMuMCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZV9wdHJbaV0gPSAocG5nX2J5dGVwKWhwdHI7Ci0gICAgICAgICAgICAgICBocHRyID0gaHB0ciArIChwbmdfdWludF8zMik2NTUzNkw7ICAvKiAiKz0iIGZhaWxzIG9uIFRDKyszLjAgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX251bWJlciA9IG51bV9ibG9ja3M7Ci0gICAgICAgICAgICBwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnQgPSAwOwotICAgICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX2NvdW50X2ZyZWUgPSAwOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAocG5nX3B0ci0+b2Zmc2V0X3RhYmxlX2NvdW50ID49IHBuZ19wdHItPm9mZnNldF90YWJsZV9udW1iZXIpCi0gICAgICB7Ci0jaWZuZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgICAgICAgIGlmICgocG5nX3B0ci0+ZmxhZ3MmUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LKSA9PSAwKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgb2YgTWVtb3J5LiIpOyAvKiBOb3RlICJvIiBhbmQgIk0iICovCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIE1lbW9yeS4iKTsKLSNlbmRpZgotICAgICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICAgIH0KLQotICAgICAgcmV0ID0gcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0cltwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnQrK107Ci0gICB9Ci0gICBlbHNlCi0gICAgICByZXQgPSBmYXJtYWxsb2Moc2l6ZSk7Ci0KLSNpZm5kZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgaWYgKHJldCA9PSBOVUxMKQotICAgewotICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spID09IDApCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk91dCBvZiBtZW1vcnkuIik7IC8qIE5vdGUgIm8iIGFuZCAibSIgKi8KLSAgICAgIGVsc2UKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgb2YgbWVtb3J5LiIpOyAvKiBOb3RlICJvIiBhbmQgIm0iICovCi0gICB9Ci0jZW5kaWYKLQotICAgcmV0dXJuIChyZXQpOwotfQotCi0vKiBGcmVlIGEgcG9pbnRlciBhbGxvY2F0ZWQgYnkgcG5nX21hbGxvYygpLiAgSW4gdGhlIGRlZmF1bHQKLSAqIGNvbmZpZ3VyYXRpb24sIHBuZ19wdHIgaXMgbm90IHVzZWQsIGJ1dCBpcyBwYXNzZWQgaW4gY2FzZSBpdAotICogaXMgbmVlZGVkLiAgSWYgcHRyIGlzIE5VTEwsIHJldHVybiB3aXRob3V0IHRha2luZyBhbnkgYWN0aW9uLgotICovCi12b2lkIFBOR0FQSQotcG5nX2ZyZWUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+ZnJlZV9mbiAhPSBOVUxMKQotICAgewotICAgICAgKCoocG5nX3B0ci0+ZnJlZV9mbikpKHBuZ19wdHIsIHB0cik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlCi0gICAgICBwbmdfZnJlZV9kZWZhdWx0KHBuZ19wdHIsIHB0cik7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfZnJlZV9kZWZhdWx0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpCi17Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHB0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAocG5nX3B0ci0+b2Zmc2V0X3RhYmxlICE9IE5VTEwpCi0gICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IHBuZ19wdHItPm9mZnNldF90YWJsZV9jb3VudDsgaSsrKQotICAgICAgewotICAgICAgICAgaWYgKHB0ciA9PSBwbmdfcHRyLT5vZmZzZXRfdGFibGVfcHRyW2ldKQotICAgICAgICAgewotICAgICAgICAgICAgcHRyID0gTlVMTDsKLSAgICAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZV9jb3VudF9mcmVlKys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnRfZnJlZSA9PSBwbmdfcHRyLT5vZmZzZXRfdGFibGVfY291bnQpCi0gICAgICB7Ci0gICAgICAgICBmYXJmcmVlKHBuZ19wdHItPm9mZnNldF90YWJsZSk7Ci0gICAgICAgICBmYXJmcmVlKHBuZ19wdHItPm9mZnNldF90YWJsZV9wdHIpOwotICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlID0gTlVMTDsKLSAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZV9wdHIgPSBOVUxMOwotICAgICAgfQotICAgfQotCi0gICBpZiAocHRyICE9IE5VTEwpCi0gICB7Ci0gICAgICBmYXJmcmVlKHB0cik7Ci0gICB9Ci19Ci0KLSNlbHNlIC8qIE5vdCB0aGUgQm9ybGFuZCBET1Mgc3BlY2lhbCBtZW1vcnkgaGFuZGxlciAqLwotCi0vKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgcG5nX3N0cnVjdCBvciBhIHBuZ19pbmZvLiAgVGhlIG1hbGxvYyBhbmQKLSAgIG1lbXNldCBjYW4gYmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgY2FsbCB0byBjYWxsb2MoKSBpZiB0aGlzIGlzIHRob3VnaHQKLSAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugbm90aWNhYmx5LiAqLwotcG5nX3ZvaWRwIC8qIFBSSVZBVEUgKi8KLXBuZ19jcmVhdGVfc3RydWN0KGludCB0eXBlKQotewotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIHJldHVybiAocG5nX2NyZWF0ZV9zdHJ1Y3RfMih0eXBlLCBwbmdfbWFsbG9jX3B0cl9OVUxMLCBwbmdfdm9pZHBfTlVMTCkpOwotfQotCi0vKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgcG5nX3N0cnVjdCBvciBhIHBuZ19pbmZvLiAgVGhlIG1hbGxvYyBhbmQKLSAgIG1lbXNldCBjYW4gYmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgY2FsbCB0byBjYWxsb2MoKSBpZiB0aGlzIGlzIHRob3VnaHQKLSAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugbm90aWNhYmx5LiAqLwotcG5nX3ZvaWRwIC8qIFBSSVZBVEUgKi8KLXBuZ19jcmVhdGVfc3RydWN0XzIoaW50IHR5cGUsIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwgcG5nX3ZvaWRwIG1lbV9wdHIpCi17Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLwotICAgcG5nX3NpemVfdCBzaXplOwotICAgcG5nX3ZvaWRwIHN0cnVjdF9wdHI7Ci0KLSAgIGlmICh0eXBlID09IFBOR19TVFJVQ1RfSU5GTykKLSAgICAgIHNpemUgPSBwbmdfc2l6ZW9mKHBuZ19pbmZvKTsKLSAgIGVsc2UgaWYgKHR5cGUgPT0gUE5HX1NUUlVDVF9QTkcpCi0gICAgICBzaXplID0gcG5nX3NpemVvZihwbmdfc3RydWN0KTsKLSAgIGVsc2UKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBpZiAobWFsbG9jX2ZuICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfc3RydWN0IGR1bW15X3N0cnVjdDsKLSAgICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAmZHVtbXlfc3RydWN0OwotICAgICAgcG5nX3B0ci0+bWVtX3B0cj1tZW1fcHRyOwotICAgICAgc3RydWN0X3B0ciA9ICgqKG1hbGxvY19mbikpKHBuZ19wdHIsIHNpemUpOwotICAgICAgaWYgKHN0cnVjdF9wdHIgIT0gTlVMTCkKLSAgICAgICAgIHBuZ19tZW1zZXQoc3RydWN0X3B0ciwgMCwgc2l6ZSk7Ci0gICAgICByZXR1cm4gKHN0cnVjdF9wdHIpOwotICAgfQotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoX19UVVJCT0NfXykgJiYgIWRlZmluZWQoX19GTEFUX18pCi0gICBzdHJ1Y3RfcHRyID0gKHBuZ192b2lkcClmYXJtYWxsb2Moc2l6ZSk7Ci0jZWxzZQotIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKE1BWFNFR182NEspCi0gICBzdHJ1Y3RfcHRyID0gKHBuZ192b2lkcCloYWxsb2Moc2l6ZSwgMSk7Ci0jIGVsc2UKLSAgIHN0cnVjdF9wdHIgPSAocG5nX3ZvaWRwKW1hbGxvYyhzaXplKTsKLSMgZW5kaWYKLSNlbmRpZgotICAgaWYgKHN0cnVjdF9wdHIgIT0gTlVMTCkKLSAgICAgIHBuZ19tZW1zZXQoc3RydWN0X3B0ciwgMCwgc2l6ZSk7Ci0KLSAgIHJldHVybiAoc3RydWN0X3B0cik7Ci19Ci0KLQotLyogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGEgcG5nX2NyZWF0ZV9zdHJ1Y3QoKSBjYWxsICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kZXN0cm95X3N0cnVjdChwbmdfdm9pZHAgc3RydWN0X3B0cikKLXsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfZGVzdHJveV9zdHJ1Y3RfMihzdHJ1Y3RfcHRyLCBwbmdfZnJlZV9wdHJfTlVMTCwgcG5nX3ZvaWRwX05VTEwpOwotfQotCi0vKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYSBwbmdfY3JlYXRlX3N0cnVjdCgpIGNhbGwgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2Rlc3Ryb3lfc3RydWN0XzIocG5nX3ZvaWRwIHN0cnVjdF9wdHIsIHBuZ19mcmVlX3B0ciBmcmVlX2ZuLAotICAgIHBuZ192b2lkcCBtZW1fcHRyKQotewotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLSAgIGlmIChzdHJ1Y3RfcHRyICE9IE5VTEwpCi0gICB7Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgaWYgKGZyZWVfZm4gIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zdHJ1Y3QgZHVtbXlfc3RydWN0OwotICAgICAgICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9ICZkdW1teV9zdHJ1Y3Q7Ci0gICAgICAgICBwbmdfcHRyLT5tZW1fcHRyPW1lbV9wdHI7Ci0gICAgICAgICAoKihmcmVlX2ZuKSkocG5nX3B0ciwgc3RydWN0X3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLwotI2lmIGRlZmluZWQoX19UVVJCT0NfXykgJiYgIWRlZmluZWQoX19GTEFUX18pCi0gICAgICBmYXJmcmVlKHN0cnVjdF9wdHIpOwotI2Vsc2UKLSMgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChNQVhTRUdfNjRLKQotICAgICAgaGZyZWUoc3RydWN0X3B0cik7Ci0jIGVsc2UKLSAgICAgIGZyZWUoc3RydWN0X3B0cik7Ci0jIGVuZGlmCi0jZW5kaWYKLSAgIH0KLX0KLQotLyogQWxsb2NhdGUgbWVtb3J5LiAgRm9yIHJlYXNvbmFibGUgZmlsZXMsIHNpemUgc2hvdWxkIG5ldmVyIGV4Y2VlZAotICogNjRLLiAgSG93ZXZlciwgemxpYiBtYXkgYWxsb2NhdGUgbW9yZSB0aGVuIDY0SyBpZiB5b3UgZG9uJ3QgdGVsbAotICogaXQgbm90IHRvLiAgU2VlIHpjb25mLmggYW5kIHBuZy5oIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgemxpYiBkb2VzCi0gKiBuZWVkIHRvIGFsbG9jYXRlIGV4YWN0bHkgNjRLLCBzbyB3aGF0ZXZlciB5b3UgY2FsbCBoZXJlIG11c3QKLSAqIGhhdmUgdGhlIGFiaWxpdHkgdG8gZG8gdGhhdC4KLSAqLwotCi0KLXBuZ192b2lkcCBQTkdBUEkKLXBuZ19tYWxsb2MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2l6ZSkKLXsKLSAgIHBuZ192b2lkcCByZXQ7Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHNpemUgPT0gMCkKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0KLSAgIGlmIChwbmdfcHRyLT5tYWxsb2NfZm4gIT0gTlVMTCkKLSAgICAgIHJldCA9ICgocG5nX3ZvaWRwKSgqKHBuZ19wdHItPm1hbGxvY19mbikpKHBuZ19wdHIsIChwbmdfc2l6ZV90KXNpemUpKTsKLSAgIGVsc2UKLSAgICAgIHJldCA9IChwbmdfbWFsbG9jX2RlZmF1bHQocG5nX3B0ciwgc2l6ZSkpOwotICAgaWYgKHJldCA9PSBOVUxMICYmIChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spID09IDApCi0gICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgb2YgTWVtb3J5ISIpOwotICAgcmV0dXJuIChyZXQpOwotfQotCi1wbmdfdm9pZHAgUE5HQVBJCi1wbmdfbWFsbG9jX2RlZmF1bHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2l6ZSkKLXsKLSAgIHBuZ192b2lkcCByZXQ7Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IHNpemUgPT0gMCkKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0KLSNpZmRlZiBQTkdfTUFYX01BTExPQ182NEsKLSAgIGlmIChzaXplID4gKHBuZ191aW50XzMyKTY1NTM2TCkKLSAgIHsKLSNpZm5kZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgaWYgKChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spID09IDApCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkNhbm5vdCBBbGxvY2F0ZSA+IDY0SyIpOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLSNlbmRpZgotCi0gICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKQotICAgaWYgKHNpemUgIT0gKHVuc2lnbmVkIGxvbmcpc2l6ZSkKLSAgICAgIHJldCA9IE5VTEw7Ci0gICBlbHNlCi0gICAgICByZXQgPSBmYXJtYWxsb2Moc2l6ZSk7Ci0jZWxzZQotIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKE1BWFNFR182NEspCi0gICBpZiAoc2l6ZSAhPSAodW5zaWduZWQgbG9uZylzaXplKQotICAgICAgcmV0ID0gTlVMTDsKLSAgIGVsc2UKLSAgICAgIHJldCA9IGhhbGxvYyhzaXplLCAxKTsKLSMgZWxzZQotICAgaWYgKHNpemUgIT0gKHNpemVfdClzaXplKQotICAgICAgcmV0ID0gTlVMTDsKLSAgIGVsc2UKLSAgICAgIHJldCA9IG1hbGxvYygoc2l6ZV90KXNpemUpOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgaWYgKHJldCA9PSBOVUxMICYmIChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0spID09IDApCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk91dCBvZiBNZW1vcnkiKTsKLSNlbmRpZgotCi0gICByZXR1cm4gKHJldCk7Ci19Ci0KLS8qIEZyZWUgYSBwb2ludGVyIGFsbG9jYXRlZCBieSBwbmdfbWFsbG9jKCkuICBJZiBwdHIgaXMgTlVMTCwgcmV0dXJuCi0gKiB3aXRob3V0IHRha2luZyBhbnkgYWN0aW9uLgotICovCi12b2lkIFBOR0FQSQotcG5nX2ZyZWUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+ZnJlZV9mbiAhPSBOVUxMKQotICAgewotICAgICAgKCoocG5nX3B0ci0+ZnJlZV9mbikpKHBuZ19wdHIsIHB0cik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlCi0gICAgICBwbmdfZnJlZV9kZWZhdWx0KHBuZ19wdHIsIHB0cik7Ci19Ci12b2lkIFBOR0FQSQotcG5nX2ZyZWVfZGVmYXVsdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBwdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoX19UVVJCT0NfXykgJiYgIWRlZmluZWQoX19GTEFUX18pCi0gICBmYXJmcmVlKHB0cik7Ci0jZWxzZQotIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKE1BWFNFR182NEspCi0gICBoZnJlZShwdHIpOwotIyBlbHNlCi0gICBmcmVlKHB0cik7Ci0jIGVuZGlmCi0jZW5kaWYKLX0KLQotI2VuZGlmIC8qIE5vdCBCb3JsYW5kIERPUyBzcGVjaWFsIG1lbW9yeSBoYW5kbGVyICovCi0KLSNpZiBkZWZpbmVkKFBOR18xXzBfWCkKLSMgIGRlZmluZSBwbmdfbWFsbG9jX3dhcm4gcG5nX21hbGxvYwotI2Vsc2UKLS8qIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuMi4zLiAgVGhlIHBuZ19tYWxsb2Nfd2FybigpCi0gKiBmdW5jdGlvbiB3aWxsIHNldCB1cCBwbmdfbWFsbG9jKCkgdG8gaXNzdWUgYSBwbmdfd2FybmluZyBhbmQgcmV0dXJuIE5VTEwKLSAqIGluc3RlYWQgb2YgaXNzdWluZyBhIHBuZ19lcnJvciwgaWYgaXQgZmFpbHMgdG8gYWxsb2NhdGUgdGhlIHJlcXVlc3RlZAotICogbWVtb3J5LgotICovCi1wbmdfdm9pZHAgUE5HQVBJCi1wbmdfbWFsbG9jX3dhcm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2l6ZSkKLXsKLSAgIHBuZ192b2lkcCBwdHI7Ci0gICBwbmdfdWludF8zMiBzYXZlX2ZsYWdzOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0KLSAgIHNhdmVfZmxhZ3MgPSBwbmdfcHRyLT5mbGFnczsKLSAgIHBuZ19wdHItPmZsYWdzfD1QTkdfRkxBR19NQUxMT0NfTlVMTF9NRU1fT0s7Ci0gICBwdHIgPSAocG5nX3ZvaWRwKXBuZ19tYWxsb2MoKHBuZ19zdHJ1Y3RwKXBuZ19wdHIsIHNpemUpOwotICAgcG5nX3B0ci0+ZmxhZ3M9c2F2ZV9mbGFnczsKLSAgIHJldHVybihwdHIpOwotfQotI2VuZGlmCi0KLXBuZ192b2lkcCBQTkdBUEkKLXBuZ19tZW1jcHlfY2hlY2sgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBzMSwgcG5nX3ZvaWRwIHMyLAotICAgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX3NpemVfdCBzaXplOwotCi0gICBzaXplID0gKHBuZ19zaXplX3QpbGVuZ3RoOwotICAgaWYgKChwbmdfdWludF8zMilzaXplICE9IGxlbmd0aCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3ZlcmZsb3cgaW4gcG5nX21lbWNweV9jaGVjay4iKTsKLQotICAgcmV0dXJuKHBuZ19tZW1jcHkgKHMxLCBzMiwgc2l6ZSkpOwotfQotCi1wbmdfdm9pZHAgUE5HQVBJCi1wbmdfbWVtc2V0X2NoZWNrIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgczEsIGludCB2YWx1ZSwKLSAgIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19zaXplX3Qgc2l6ZTsKLQotICAgc2l6ZSA9IChwbmdfc2l6ZV90KWxlbmd0aDsKLSAgIGlmICgocG5nX3VpbnRfMzIpc2l6ZSAhPSBsZW5ndGgpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk92ZXJmbG93IGluIHBuZ19tZW1zZXRfY2hlY2suIik7Ci0KLSAgIHJldHVybiAocG5nX21lbXNldCAoczEsIHZhbHVlLCBzaXplKSk7Ci0KLX0KLQotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHVzZSBhbm90aGVyIG1ldGhvZAotICogb2YgYWxsb2NhdGluZyBhbmQgZnJlZWluZyBtZW1vcnkuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X21lbV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgbWVtX3B0ciwgcG5nX21hbGxvY19wdHIKLSAgbWFsbG9jX2ZuLCBwbmdfZnJlZV9wdHIgZnJlZV9mbikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfcHRyLT5tZW1fcHRyID0gbWVtX3B0cjsKLSAgICAgIHBuZ19wdHItPm1hbGxvY19mbiA9IG1hbGxvY19mbjsKLSAgICAgIHBuZ19wdHItPmZyZWVfZm4gPSBmcmVlX2ZuOwotICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtZW1fcHRyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlcgotICogZnVuY3Rpb25zLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBmcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAqIHBvaW50ZXIgYmVmb3JlIHBuZ193cml0ZV9kZXN0cm95IGFuZCBwbmdfcmVhZF9kZXN0cm95IGFyZSBjYWxsZWQuCi0gKi8KLXBuZ192b2lkcCBQTkdBUEkKLXBuZ19nZXRfbWVtX3B0cihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0gICByZXR1cm4gKChwbmdfdm9pZHApcG5nX3B0ci0+bWVtX3B0cik7Ci19Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAqLwotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCB8fCBQTkdfV1JJVEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wbmdub3cucG5nIGIvbGlicy9saWJwbmcvcG5nbm93LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI3OTNlYi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wbmdub3cucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcG5ncHJlYWQuYyBiL2xpYnMvbGlicG5nL3BuZ3ByZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NDZjN2EuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5ncHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MjQgKzAsMCBAQAotCi0vKiBwbmdwcmVhZC5jIC0gcmVhZCBhIHBuZyBmaWxlIGluIHB1c2ggbW9kZQotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS4yLjM3IFtKdW5lIDQsIDIwMDldCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCi0gKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCi0gKi8KLQotI2RlZmluZSBQTkdfSU5URVJOQUwKLSNpbmNsdWRlICJwbmcuaCIKLSNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKLQotLyogUHVzaCBtb2RlbCBtb2RlcyAqLwotI2RlZmluZSBQTkdfUkVBRF9TSUdfTU9ERSAgIDAKLSNkZWZpbmUgUE5HX1JFQURfQ0hVTktfTU9ERSAxCi0jZGVmaW5lIFBOR19SRUFEX0lEQVRfTU9ERSAgMgotI2RlZmluZSBQTkdfU0tJUF9NT0RFICAgICAgIDMKLSNkZWZpbmUgUE5HX1JFQURfdEVYdF9NT0RFICA0Ci0jZGVmaW5lIFBOR19SRUFEX3pUWHRfTU9ERSAgNQotI2RlZmluZSBQTkdfUkVBRF9ET05FX01PREUgIDYKLSNkZWZpbmUgUE5HX1JFQURfaVRYdF9NT0RFICA3Ci0jZGVmaW5lIFBOR19FUlJPUl9NT0RFICAgICAgOAotCi12b2lkIFBOR0FQSQotcG5nX3Byb2Nlc3NfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGJ1ZmZlcl9zaXplKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBwbmdfcHVzaF9yZXN0b3JlX2J1ZmZlcihwbmdfcHRyLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKLQotICAgd2hpbGUgKHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgewotICAgICAgcG5nX3Byb2Nlc3Nfc29tZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgIH0KLX0KLQotLyogV2hhdCB3ZSBkbyB3aXRoIHRoZSBpbmNvbWluZyBkYXRhIGRlcGVuZHMgb24gd2hhdCB3ZSB3ZXJlIHByZXZpb3VzbHkKLSAqIGRvaW5nIGJlZm9yZSB3ZSByYW4gb3V0IG9mIGRhdGEuLi4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHJvY2Vzc19zb21lX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgc3dpdGNoIChwbmdfcHRyLT5wcm9jZXNzX21vZGUpCi0gICB7Ci0gICAgICBjYXNlIFBOR19SRUFEX1NJR19NT0RFOgotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfcmVhZF9zaWcocG5nX3B0ciwgaW5mb19wdHIpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgUE5HX1JFQURfQ0hVTktfTU9ERToKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3JlYWRfY2h1bmsocG5nX3B0ciwgaW5mb19wdHIpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgUE5HX1JFQURfSURBVF9NT0RFOgotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfcmVhZF9JREFUKHBuZ19wdHIpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX3RFWHRfU1VQUE9SVEVEKQotICAgICAgY2FzZSBQTkdfUkVBRF90RVh0X01PREU6Ci0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9yZWFkX3RFWHQocG5nX3B0ciwgaW5mb19wdHIpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfelRYdF9TVVBQT1JURUQpCi0gICAgICBjYXNlIFBOR19SRUFEX3pUWHRfTU9ERToKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3JlYWRfelRYdChwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRCkKLSAgICAgIGNhc2UgUE5HX1JFQURfaVRYdF9NT0RFOgotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfcmVhZF9pVFh0KHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0jZW5kaWYKLSAgICAgIGNhc2UgUE5HX1NLSVBfTU9ERToKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX2NyY19maW5pc2gocG5nX3B0cik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDoKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplID0gMDsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgfQotfQotCi0vKiBSZWFkIGFueSByZW1haW5pbmcgc2lnbmF0dXJlIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSBhbmQgY29tcGFyZSB0aGVtIHdpdGgKLSAqIHRoZSBjb3JyZWN0IFBORyBzaWduYXR1cmUuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoaXMgcm91dGluZSBpcyBjYWxsZWQKLSAqIHdpdGggYnl0ZXMgYWxyZWFkeSByZWFkIGZyb20gdGhlIHNpZ25hdHVyZSwgZWl0aGVyIGJlY2F1c2UgdGhleSBoYXZlIGJlZW4KLSAqIGNoZWNrZWQgYnkgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24sIG9yIGJlY2F1c2Ugb2YgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcwotICogcm91dGluZS4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9yZWFkX3NpZyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBwbmdfc2l6ZV90IG51bV9jaGVja2VkID0gcG5nX3B0ci0+c2lnX2J5dGVzLAotICAgICAgICAgICAgIG51bV90b19jaGVjayA9IDggLSBudW1fY2hlY2tlZDsKLQotICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgbnVtX3RvX2NoZWNrKQotICAgewotICAgICAgbnVtX3RvX2NoZWNrID0gcG5nX3B0ci0+YnVmZmVyX3NpemU7Ci0gICB9Ci0KLSAgIHBuZ19wdXNoX2ZpbGxfYnVmZmVyKHBuZ19wdHIsICYoaW5mb19wdHItPnNpZ25hdHVyZVtudW1fY2hlY2tlZF0pLAotICAgICAgbnVtX3RvX2NoZWNrKTsKLSAgIHBuZ19wdHItPnNpZ19ieXRlcyA9IChwbmdfYnl0ZSkocG5nX3B0ci0+c2lnX2J5dGVzICsgbnVtX3RvX2NoZWNrKTsKLQotICAgaWYgKHBuZ19zaWdfY21wKGluZm9fcHRyLT5zaWduYXR1cmUsIG51bV9jaGVja2VkLCBudW1fdG9fY2hlY2spKQotICAgewotICAgICAgaWYgKG51bV9jaGVja2VkIDwgNCAmJgotICAgICAgICAgIHBuZ19zaWdfY21wKGluZm9fcHRyLT5zaWduYXR1cmUsIG51bV9jaGVja2VkLCBudW1fdG9fY2hlY2sgLSA0KSkKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTm90IGEgUE5HIGZpbGUiKTsKLSAgICAgIGVsc2UKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUE5HIGZpbGUgY29ycnVwdGVkIGJ5IEFTQ0lJIGNvbnZlcnNpb24iKTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5zaWdfYnl0ZXMgPj0gOCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX0NIVU5LX01PREU7Ci0gICAgICB9Ci0gICB9Ci19Ci0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3B1c2hfcmVhZF9jaHVuayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgICAgIFBOR19DT05TVCBQTkdfSUhEUjsKLSAgICAgIFBOR19DT05TVCBQTkdfSURBVDsKLSAgICAgIFBOR19DT05TVCBQTkdfSUVORDsKLSAgICAgIFBOR19DT05TVCBQTkdfUExURTsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX2JLR0RfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19iS0dEOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfY0hSTTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX2dBTUE7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX2hJU1RfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19oSVNUOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfaUNDUDsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfaVRYdF9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX2lUWHQ7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX29GRnNfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19vRkZzOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfcENBTDsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfcEhZc19TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX3BIWXM7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NCSVRfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19zQklUOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfc0NBTDsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfc1JHQl9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX3NSR0I7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NQTFRfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19zUExUOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF90RVh0X1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfdEVYdDsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfdElNRV9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX3RJTUU7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3RSTlNfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR190Uk5TOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF96VFh0X1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfelRYdDsKLSNlbmRpZgotI2VuZGlmIC8qIFBOR19VU0VfTE9DQUxfQVJSQVlTICovCi0gICAvKiBGaXJzdCB3ZSBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggZGF0YSBmb3IgdGhlIDQgYnl0ZSBjaHVuayBuYW1lCi0gICAgKiBhbmQgdGhlIDQgYnl0ZSBjaHVuayBsZW5ndGggYmVmb3JlIHByb2NlZWRpbmcgd2l0aCBkZWNvZGluZyB0aGUKLSAgICAqIGNodW5rIGRhdGEuICBUbyBmdWxseSBkZWNvZGUgZWFjaCBvZiB0aGVzZSBjaHVua3MsIHdlIGFsc28gbWFrZQotICAgICogc3VyZSB3ZSBoYXZlIGVub3VnaCBkYXRhIGluIHRoZSBidWZmZXIgZm9yIHRoZSA0IGJ5dGUgQ1JDIGF0IHRoZQotICAgICogZW5kIG9mIGV2ZXJ5IGNodW5rIChleGNlcHQgSURBVCwgd2hpY2ggaXMgaGFuZGxlZCBzZXBhcmF0ZWx5KS4KLSAgICAqLwotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0NIVU5LX0hFQURFUikpCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBjaHVua19sZW5ndGhbNF07Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSA8IDgpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcG5nX3B1c2hfZmlsbF9idWZmZXIocG5nX3B0ciwgY2h1bmtfbGVuZ3RoLCA0KTsKLSAgICAgIHBuZ19wdHItPnB1c2hfbGVuZ3RoID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGNodW5rX2xlbmd0aCk7Ci0gICAgICBwbmdfcmVzZXRfY3JjKHBuZ19wdHIpOwotICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUsIDQpOwotICAgICAgcG5nX2NoZWNrX2NodW5rX25hbWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSk7Ci0gICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0NIVU5LX0hFQURFUjsKLSAgIH0KLQotICAgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19JREFULCA0KSkKLSAgICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfQUZURVJfSURBVCkKLSAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9DSFVOS19BRlRFUl9JREFUOwotCi0gICBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lIRFIsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICE9IDEzKQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIElIRFIgbGVuZ3RoIik7Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lFTkQsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19oYW5kbGVfSUVORChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotCi0gICAgICBwbmdfcHRyLT5wcm9jZXNzX21vZGUgPSBQTkdfUkVBRF9ET05FX01PREU7Ci0gICAgICBwbmdfcHVzaF9oYXZlX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICB9Ci0KLSNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECi0gICBlbHNlIGlmIChwbmdfaGFuZGxlX2FzX3Vua25vd24ocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSkpCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19JREFULCA0KSkKLSAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSURBVDsKLQotICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7Ci0KLSAgICAgIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfUExURSwgNCkpCi0gICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX1BMVEU7Ci0KLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19JREFULCA0KSkKLSAgICAgIHsKLSAgICAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBJREFUIik7Ci0KLSAgICAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJgotICAgICAgICAgICAgICAgICAgIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgUExURSBiZWZvcmUgSURBVCIpOwotICAgICAgfQotICAgfQotCi0jZW5kaWYKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19QTFRFLCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcG5nX2hhbmRsZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7Ci0gICB9Ci0KLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19JREFULCA0KSkKLSAgIHsKLSAgICAgIC8qIElmIHdlIHJlYWNoIGFuIElEQVQgY2h1bmssIHRoaXMgbWVhbnMgd2UgaGF2ZSByZWFkIGFsbCBvZiB0aGUKLSAgICAgICAqIGhlYWRlciBjaHVua3MsIGFuZCB3ZSBjYW4gc3RhcnQgcmVhZGluZyB0aGUgaW1hZ2UgKG9yIGlmIHRoaXMKLSAgICAgICAqIGlzIGNhbGxlZCBhZnRlciB0aGUgaW1hZ2UgaGFzIGJlZW4gcmVhZCAtIHdlIGhhdmUgYW4gZXJyb3IpLgotICAgICAgICovCi0KLSAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBJREFUIik7Ci0KLSAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJgotICAgICAgICAgICEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpKQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIElEQVQiKTsKLQotICAgICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgICAgewotICAgICAgICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQpKQotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0FGVEVSX0lEQVQpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlRvbyBtYW55IElEQVQncyBmb3VuZCIpOwotICAgICAgfQotCi0gICAgICBwbmdfcHRyLT5pZGF0X3NpemUgPSBwbmdfcHRyLT5wdXNoX2xlbmd0aDsKLSAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSURBVDsKLSAgICAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX0lEQVRfTU9ERTsKLSAgICAgIHBuZ19wdXNoX2hhdmVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPmlyb3dieXRlczsKLSAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT5yb3dfYnVmOwotICAgICAgcmV0dXJuOwotICAgfQotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19nQU1BLCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zQklUX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19zQklULCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX3NCSVQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19jSFJNLCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19zUkdCLCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19pQ0NQLCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zUExUX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19zUExULCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX3NQTFQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ190Uk5TLCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19iS0dELCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX2JLR0QocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19oSVNULCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX2hJU1QocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19wSFlzLCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX3BIWXMocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19vRkZzLCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX29GRnMocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19wQ0FMLCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX3BDQUwocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19zQ0FMLCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX3NDQUwocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF90SU1FX1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ190SU1FLCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfaGFuZGxlX3RJTUUocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF90RVh0X1NVUFBPUlRFRCkKLSAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ190RVh0LCA0KSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCArIDQgPiBwbmdfcHRyLT5idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfcHVzaF9oYW5kbGVfdEVYdChwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+cHVzaF9sZW5ndGgpOwotICAgfQotCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3pUWHRfU1VQUE9SVEVEKQotICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX3pUWHQsIDQpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoICsgNCA+IHBuZ19wdHItPmJ1ZmZlcl9zaXplKQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19wdXNoX2hhbmRsZV96VFh0KHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7Ci0gICB9Ci0KLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfaVRYdF9TVVBQT1JURUQpCi0gICBlbHNlIGlmICghcG5nX21lbWNtcChwbmdfcHRyLT5jaHVua19uYW1lLCBwbmdfaVRYdCwgNCkpCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcG5nX3B1c2hfaGFuZGxlX2lUWHQocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPnB1c2hfbGVuZ3RoKTsKLSAgIH0KLQotI2VuZGlmCi0gICBlbHNlCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+cHVzaF9sZW5ndGggKyA0ID4gcG5nX3B0ci0+YnVmZmVyX3NpemUpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHBuZ19wdXNoX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5wdXNoX2xlbmd0aCk7Ci0gICB9Ci0KLSAgIHBuZ19wdHItPm1vZGUgJj0gflBOR19IQVZFX0NIVU5LX0hFQURFUjsKLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9jcmNfc2tpcChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBza2lwKQotewotICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1NLSVBfTU9ERTsKLSAgIHBuZ19wdHItPnNraXBfbGVuZ3RoID0gc2tpcDsKLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9jcmNfZmluaXNoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBpZiAocG5nX3B0ci0+c2tpcF9sZW5ndGggJiYgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkKLSAgIHsKLSAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplOwotCi0gICAgICBpZiAocG5nX3B0ci0+c2tpcF9sZW5ndGggPCAocG5nX3VpbnRfMzIpcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkKLSAgICAgICAgIHNhdmVfc2l6ZSA9IChwbmdfc2l6ZV90KXBuZ19wdHItPnNraXBfbGVuZ3RoOwotICAgICAgZWxzZQotICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZTsKLQotICAgICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgcG5nX3B0ci0+c2F2ZV9idWZmZXJfcHRyLCBzYXZlX3NpemUpOwotCi0gICAgICBwbmdfcHRyLT5za2lwX2xlbmd0aCAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsKLSAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciArPSBzYXZlX3NpemU7Ci0gICB9Ci0gICBpZiAocG5nX3B0ci0+c2tpcF9sZW5ndGggJiYgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSkKLSAgIHsKLSAgICAgIHBuZ19zaXplX3Qgc2F2ZV9zaXplOwotCi0gICAgICBpZiAocG5nX3B0ci0+c2tpcF9sZW5ndGggPCAocG5nX3VpbnRfMzIpcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSkKLSAgICAgICAgIHNhdmVfc2l6ZSA9IChwbmdfc2l6ZV90KXBuZ19wdHItPnNraXBfbGVuZ3RoOwotICAgICAgZWxzZQotICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZTsKLQotICAgICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfcHRyLCBzYXZlX3NpemUpOwotCi0gICAgICBwbmdfcHRyLT5za2lwX2xlbmd0aCAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplIC09IHNhdmVfc2l6ZTsKLSAgICAgIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3B0ciArPSBzYXZlX3NpemU7Ci0gICB9Ci0gICBpZiAoIXBuZ19wdHItPnNraXBfbGVuZ3RoKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgNCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKTsKLSAgICAgIHBuZ19wdHItPnByb2Nlc3NfbW9kZSA9IFBOR19SRUFEX0NIVU5LX01PREU7Ci0gICB9Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfcHVzaF9maWxsX2J1ZmZlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIHBuZ19ieXRlcCBwdHI7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHB0ciA9IGJ1ZmZlcjsKLSAgIGlmIChwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplKQotICAgewotICAgICAgcG5nX3NpemVfdCBzYXZlX3NpemU7Ci0KLSAgICAgIGlmIChsZW5ndGggPCBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplKQotICAgICAgICAgc2F2ZV9zaXplID0gbGVuZ3RoOwotICAgICAgZWxzZQotICAgICAgICAgc2F2ZV9zaXplID0gcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZTsKLQotICAgICAgcG5nX21lbWNweShwdHIsIHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciwgc2F2ZV9zaXplKTsKLSAgICAgIGxlbmd0aCAtPSBzYXZlX3NpemU7Ci0gICAgICBwdHIgKz0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOwotICAgfQotICAgaWYgKGxlbmd0aCAmJiBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplKQotICAgewotICAgICAgcG5nX3NpemVfdCBzYXZlX3NpemU7Ci0KLSAgICAgIGlmIChsZW5ndGggPCBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplKQotICAgICAgICAgc2F2ZV9zaXplID0gbGVuZ3RoOwotCi0gICAgICBlbHNlCi0gICAgICAgICBzYXZlX3NpemUgPSBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplOwotCi0gICAgICBwbmdfbWVtY3B5KHB0ciwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfcHRyLCBzYXZlX3NpemUpOwotICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOwotICAgfQotfQotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBpZiAocG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgIT0gcG5nX3B0ci0+c2F2ZV9idWZmZXIpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2l6ZV90IGksIGlzdG9wOwotICAgICAgICAgcG5nX2J5dGVwIHNwOwotICAgICAgICAgcG5nX2J5dGVwIGRwOwotCi0gICAgICAgICBpc3RvcCA9IHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemU7Ci0gICAgICAgICBmb3IgKGkgPSAwLCBzcCA9IHBuZ19wdHItPnNhdmVfYnVmZmVyX3B0ciwgZHAgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcjsKLSAgICAgICAgICAgIGkgPCBpc3RvcDsgaSsrLCBzcCsrLCBkcCsrKQotICAgICAgICAgewotICAgICAgICAgICAgKmRwID0gKnNwOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotICAgaWYgKHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUgKyBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplID4KLSAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyX21heCkKLSAgIHsKLSAgICAgIHBuZ19zaXplX3QgbmV3X21heDsKLSAgICAgIHBuZ19ieXRlcCBvbGRfYnVmZmVyOwotCi0gICAgICBpZiAocG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSA+IFBOR19TSVpFX01BWCAtCi0gICAgICAgICAocG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSArIDI1NikpCi0gICAgICB7Ci0gICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiUG90ZW50aWFsIG92ZXJmbG93IG9mIHNhdmVfYnVmZmVyIik7Ci0gICAgICB9Ci0KLSAgICAgIG5ld19tYXggPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplICsgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSArIDI1NjsKLSAgICAgIG9sZF9idWZmZXIgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcjsKLSAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAocG5nX3VpbnRfMzIpbmV3X21heCk7Ci0gICAgICBwbmdfbWVtY3B5KHBuZ19wdHItPnNhdmVfYnVmZmVyLCBvbGRfYnVmZmVyLCBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplKTsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG9sZF9idWZmZXIpOwotICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfbWF4ID0gbmV3X21heDsKLSAgIH0KLSAgIGlmIChwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplKQotICAgewotICAgICAgcG5nX21lbWNweShwbmdfcHRyLT5zYXZlX2J1ZmZlciArIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUsCi0gICAgICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIsIHBuZ19wdHItPmN1cnJlbnRfYnVmZmVyX3NpemUpOwotICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSArPSBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplOwotICAgICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSA9IDA7Ci0gICB9Ci0gICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcjsKLSAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplID0gMDsKLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9yZXN0b3JlX2J1ZmZlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLAotICAgcG5nX3NpemVfdCBidWZmZXJfbGVuZ3RoKQotewotICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXIgPSBidWZmZXI7Ci0gICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplID0gYnVmZmVyX2xlbmd0aDsKLSAgIHBuZ19wdHItPmJ1ZmZlcl9zaXplID0gYnVmZmVyX2xlbmd0aCArIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemU7Ci0gICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIgPSBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcjsKLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9yZWFkX0lEQVQocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgUE5HX0NPTlNUIFBOR19JREFUOwotI2VuZGlmCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfSEVBREVSKSkKLSAgIHsKLSAgICAgIHBuZ19ieXRlIGNodW5rX2xlbmd0aFs0XTsKLQotICAgICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgOCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdXNoX3NhdmVfYnVmZmVyKHBuZ19wdHIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfcHVzaF9maWxsX2J1ZmZlcihwbmdfcHRyLCBjaHVua19sZW5ndGgsIDQpOwotICAgICAgcG5nX3B0ci0+cHVzaF9sZW5ndGggPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgY2h1bmtfbGVuZ3RoKTsKLSAgICAgIHBuZ19yZXNldF9jcmMocG5nX3B0cik7Ci0gICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSwgNCk7Ci0gICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0NIVU5LX0hFQURFUjsKLQotICAgICAgaWYgKHBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfQ0hVTktfTU9ERTsKLSAgICAgICAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRCkpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vdCBlbm91Z2ggY29tcHJlc3NlZCBkYXRhIik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSA9IHBuZ19wdHItPnB1c2hfbGVuZ3RoOwotICAgfQotICAgaWYgKHBuZ19wdHItPmlkYXRfc2l6ZSAmJiBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplKQotICAgewotICAgICAgcG5nX3NpemVfdCBzYXZlX3NpemU7Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5pZGF0X3NpemUgPCAocG5nX3VpbnRfMzIpcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHNhdmVfc2l6ZSA9IChwbmdfc2l6ZV90KXBuZ19wdHItPmlkYXRfc2l6ZTsKLQotICAgICAgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gICAgICAgICBpZiAoKHBuZ191aW50XzMyKXNhdmVfc2l6ZSAhPSBwbmdfcHRyLT5pZGF0X3NpemUpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInNhdmVfc2l6ZSBvdmVyZmxvd2VkIGluIHBuZ3ByZWFkIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICBzYXZlX3NpemUgPSBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9zaXplOwotCi0gICAgICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7Ci0KLSAgICAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRCkpCi0gICAgICAgICBwbmdfcHJvY2Vzc19JREFUX2RhdGEocG5nX3B0ciwgcG5nX3B0ci0+c2F2ZV9idWZmZXJfcHRyLCBzYXZlX3NpemUpOwotCi0gICAgICBwbmdfcHRyLT5pZGF0X3NpemUgLT0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5zYXZlX2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOwotICAgfQotICAgaWYgKHBuZ19wdHItPmlkYXRfc2l6ZSAmJiBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplKQotICAgewotICAgICAgcG5nX3NpemVfdCBzYXZlX3NpemU7Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5pZGF0X3NpemUgPCAocG5nX3VpbnRfMzIpcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHNhdmVfc2l6ZSA9IChwbmdfc2l6ZV90KXBuZ19wdHItPmlkYXRfc2l6ZTsKLQotICAgICAgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gICAgICAgICBpZiAoKHBuZ191aW50XzMyKXNhdmVfc2l6ZSAhPSBwbmdfcHRyLT5pZGF0X3NpemUpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInNhdmVfc2l6ZSBvdmVyZmxvd2VkIGluIHBuZ3ByZWFkIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICBzYXZlX3NpemUgPSBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9zaXplOwotCi0gICAgICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIsIHNhdmVfc2l6ZSk7Ci0gICAgICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pMSUJfRklOSVNIRUQpKQotICAgICAgICBwbmdfcHJvY2Vzc19JREFUX2RhdGEocG5nX3B0ciwgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfcHRyLCBzYXZlX3NpemUpOwotCi0gICAgICBwbmdfcHRyLT5pZGF0X3NpemUgLT0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+YnVmZmVyX3NpemUgLT0gc2F2ZV9zaXplOwotICAgICAgcG5nX3B0ci0+Y3VycmVudF9idWZmZXJfc2l6ZSAtPSBzYXZlX3NpemU7Ci0gICAgICBwbmdfcHRyLT5jdXJyZW50X2J1ZmZlcl9wdHIgKz0gc2F2ZV9zaXplOwotICAgfQotICAgaWYgKCFwbmdfcHRyLT5pZGF0X3NpemUpCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgPCA0KQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApOwotICAgICAgcG5nX3B0ci0+bW9kZSAmPSB+UE5HX0hBVkVfQ0hVTktfSEVBREVSOwotICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKLSAgIH0KLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHJvY2Vzc19JREFUX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGJ1ZmZlciwKLSAgIHBuZ19zaXplX3QgYnVmZmVyX2xlbmd0aCkKLXsKLSAgIGludCByZXQ7Ci0KLSAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aTElCX0ZJTklTSEVEKSAmJiBidWZmZXJfbGVuZ3RoKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2lvbiBkYXRhIik7Ci0KLSAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IGJ1ZmZlcjsKLSAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAodUludClidWZmZXJfbGVuZ3RoOwotICAgZm9yICg7OykKLSAgIHsKLSAgICAgIHJldCA9IGluZmxhdGUoJnBuZ19wdHItPnpzdHJlYW0sIFpfUEFSVElBTF9GTFVTSCk7Ci0gICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICB7Ci0gICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luKQotICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2VkIGRhdGEiKTsKLQotICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B1c2hfcHJvY2Vzc19yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7Ci0gICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0ZJTklTSEVEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIGlmIChyZXQgPT0gWl9CVUZfRVJST1IpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJEZWNvbXByZXNzaW9uIEVycm9yIik7Ci0gICAgICB9Ci0gICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCkpCi0gICAgICB7Ci0gICAgICAgICBpZiAoKAotI2lmIGRlZmluZWQoUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEKQotICAgICAgICAgICAgIHBuZ19wdHItPmludGVybGFjZWQgJiYgcG5nX3B0ci0+cGFzcyA+IDYpIHx8Ci0gICAgICAgICAgICAgKCFwbmdfcHRyLT5pbnRlcmxhY2VkICYmCi0jZW5kaWYKLSAgICAgICAgICAgICBwbmdfcHRyLT5yb3dfbnVtYmVyID09IHBuZ19wdHItPm51bV9yb3dzKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4pCi0gICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRvbyBtdWNoIGRhdGEgaW4gSURBVCBjaHVua3MiKTsKLSAgICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRDsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBwbmdfcHVzaF9wcm9jZXNzX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+aXJvd2J5dGVzOwotICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnJvd19idWY7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIGJyZWFrOwotICAgfQotfQotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19wdXNoX3Byb2Nlc3Nfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfcHRyLT5yb3dfaW5mby5jb2xvcl90eXBlID0gcG5nX3B0ci0+Y29sb3JfdHlwZTsKLSAgIHBuZ19wdHItPnJvd19pbmZvLndpZHRoID0gcG5nX3B0ci0+aXdpZHRoOwotICAgcG5nX3B0ci0+cm93X2luZm8uY2hhbm5lbHMgPSBwbmdfcHRyLT5jaGFubmVsczsKLSAgIHBuZ19wdHItPnJvd19pbmZvLmJpdF9kZXB0aCA9IHBuZ19wdHItPmJpdF9kZXB0aDsKLSAgIHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoID0gcG5nX3B0ci0+cGl4ZWxfZGVwdGg7Ci0KLSAgIHBuZ19wdHItPnJvd19pbmZvLnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoLAotICAgICAgIHBuZ19wdHItPnJvd19pbmZvLndpZHRoKTsKLQotICAgcG5nX3JlYWRfZmlsdGVyX3JvdyhwbmdfcHRyLCAmKHBuZ19wdHItPnJvd19pbmZvKSwKLSAgICAgIHBuZ19wdHItPnJvd19idWYgKyAxLCBwbmdfcHRyLT5wcmV2X3JvdyArIDEsCi0gICAgICAoaW50KShwbmdfcHRyLT5yb3dfYnVmWzBdKSk7Ci0KLSAgIHBuZ19tZW1jcHlfY2hlY2socG5nX3B0ciwgcG5nX3B0ci0+cHJldl9yb3csIHBuZ19wdHItPnJvd19idWYsCi0gICAgICBwbmdfcHRyLT5yb3dieXRlcyArIDEpOwotCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHx8IChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19TVFJJUF9BTFBIQSkpCi0gICAgICBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3B0cik7Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkKLSAgIC8qIEJsb3cgdXAgaW50ZXJsYWNlZCByb3dzIHRvIGZ1bGwgc2l6ZSAqLwotICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgJiYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPCA2KQotLyogICAgICAgb2xkIGludGVyZmFjZSAocHJlLTEuMC45KToKLSAgICAgICAgIHBuZ19kb19yZWFkX2ludGVybGFjZSgmKHBuZ19wdHItPnJvd19pbmZvKSwKLSAgICAgICAgICAgIHBuZ19wdHItPnJvd19idWYgKyAxLCBwbmdfcHRyLT5wYXNzLCBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMpOwotICovCi0gICAgICAgICBwbmdfZG9fcmVhZF9pbnRlcmxhY2UocG5nX3B0cik7Ci0KLSAgICBzd2l0Y2ggKHBuZ19wdHItPnBhc3MpCi0gICAgewotICAgICAgICAgY2FzZSAwOgotICAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOCAmJiBwbmdfcHRyLT5wYXNzID09IDA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsgLyogVXBkYXRlcyBwbmdfcHRyLT5wYXNzICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID09IDIpIC8qIFBhc3MgMSBtaWdodCBiZSBlbXB0eSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgcG5nX3B0ci0+cGFzcyA9PSAyOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfYnl0ZXBfTlVMTCk7Ci0gICAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID09IDQgJiYgcG5nX3B0ci0+aGVpZ2h0IDw9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMiAmJiBwbmdfcHRyLT5wYXNzID09IDQ7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19ieXRlcF9OVUxMKTsKLSAgICAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNiAmJiBwbmdfcHRyLT5oZWlnaHQgPD0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfYnl0ZXBfTlVMTCk7Ci0gICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSAxOgotICAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOCAmJiBwbmdfcHRyLT5wYXNzID09IDE7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gMikgLyogU2tpcCB0b3AgNCBnZW5lcmF0ZWQgcm93cyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgcG5nX3B0ci0+cGFzcyA9PSAyOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfYnl0ZXBfTlVMTCk7Ci0gICAgICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBjYXNlIDI6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQgJiYgcG5nX3B0ci0+cGFzcyA9PSAyOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHBuZ19wdHItPnBhc3MgPT0gMjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX2J5dGVwX05VTEwpOwotICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSA0KSAvKiBQYXNzIDMgbWlnaHQgYmUgZW1wdHkgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICYmIHBuZ19wdHItPnBhc3MgPT0gNDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX2J5dGVwX05VTEwpOwotICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSAzOgotICAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHBuZ19wdHItPnBhc3MgPT0gMzsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA9PSA0KSAvKiBTa2lwIHRvcCB0d28gZ2VuZXJhdGVkIHJvd3MgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICYmIHBuZ19wdHItPnBhc3MgPT0gNDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX2J5dGVwX05VTEwpOwotICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSA0OgotICAgICAgICAgewotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICYmIHBuZ19wdHItPnBhc3MgPT0gNDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotICAgICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMiAmJiBwbmdfcHRyLT5wYXNzID09IDQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19ieXRlcF9OVUxMKTsKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPT0gNikgLyogUGFzcyA1IG1pZ2h0IGJlIGVtcHR5ICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfYnl0ZXBfTlVMTCk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBjYXNlIDU6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgJiYgcG5nX3B0ci0+cGFzcyA9PSA1OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID09IDYpIC8qIFNraXAgdG9wIGdlbmVyYXRlZCByb3cgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19wdXNoX2hhdmVfcm93KHBuZ19wdHIsIHBuZ19ieXRlcF9OVUxMKTsKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX3B1c2hfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIDY6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0gICAgICAgICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0KLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzICE9IDYpCi0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3B0ciwgcG5nX2J5dGVwX05VTEwpOwotICAgICAgICAgICAgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotICAgZWxzZQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfcHVzaF9oYXZlX3JvdyhwbmdfcHRyLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0gICAgICBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICB9Ci19Ci0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCi0KLSAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayAqLwotICAgUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX3N0YXJ0W10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07Ci0KLSAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLwotICAgUE5HX0NPTlNUIGludCBGQVJEQVRBIHBuZ19wYXNzX2luY1tdID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OwotCi0gICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCi0gICBQTkdfQ09OU1QgaW50IEZBUkRBVEEgcG5nX3Bhc3NfeXN0YXJ0W10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07Ci0KLSAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KLSAgIFBOR19DT05TVCBpbnQgRkFSREFUQSBwbmdfcGFzc195aW5jW10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07Ci0KLSAgIC8qIEhlaWdodCBvZiBpbnRlcmxhY2UgYmxvY2suICBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZCAtIGlmIHlvdSBuZWVkCi0gICAgKiBpdCwgdW5jb21tZW50IGl0IGhlcmUgYW5kIGluIHBuZy5oCi0gICBQTkdfQ09OU1QgaW50IEZBUkRBVEEgcG5nX3Bhc3NfaGVpZ2h0W10gPSB7OCwgOCwgNCwgNCwgMiwgMiwgMX07Ci0gICAqLwotI2VuZGlmCi0KLSAgIHBuZ19wdHItPnJvd19udW1iZXIrKzsKLSAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyIDwgcG5nX3B0ci0+bnVtX3Jvd3MpCi0gICAgICByZXR1cm47Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQotICAgewotICAgICAgcG5nX3B0ci0+cm93X251bWJlciA9IDA7Ci0gICAgICBwbmdfbWVtc2V0X2NoZWNrKHBuZ19wdHIsIHBuZ19wdHItPnByZXZfcm93LCAwLAotICAgICAgICAgcG5nX3B0ci0+cm93Ynl0ZXMgKyAxKTsKLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5wYXNzKys7Ci0gICAgICAgICBpZiAoKHBuZ19wdHItPnBhc3MgPT0gMSAmJiBwbmdfcHRyLT53aWR0aCA8IDUpIHx8Ci0gICAgICAgICAgICAgKHBuZ19wdHItPnBhc3MgPT0gMyAmJiBwbmdfcHRyLT53aWR0aCA8IDMpIHx8Ci0gICAgICAgICAgICAgKHBuZ19wdHItPnBhc3MgPT0gNSAmJiBwbmdfcHRyLT53aWR0aCA8IDIpKQotICAgICAgICAgICBwbmdfcHRyLT5wYXNzKys7Ci0KLSAgICAgICAgIGlmIChwbmdfcHRyLT5wYXNzID4gNykKLSAgICAgICAgICAgIHBuZ19wdHItPnBhc3MtLTsKLQotICAgICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPj0gNykKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBwbmdfcHRyLT5pd2lkdGggPSAocG5nX3B0ci0+d2lkdGggKwotICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtCi0gICAgICAgICAgICBwbmdfcGFzc19zdGFydFtwbmdfcHRyLT5wYXNzXSkgLwotICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdOwotCi0gICAgICAgICBwbmdfcHRyLT5pcm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocG5nX3B0ci0+cGl4ZWxfZGVwdGgsCi0gICAgICAgICAgICBwbmdfcHRyLT5pd2lkdGgpICsgMTsKLQotICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlRFUkxBQ0UpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSAocG5nX3B0ci0+aGVpZ2h0ICsKLSAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0KLSAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFtwbmdfcHRyLT5wYXNzXSkgLwotICAgICAgICAgICAgcG5nX3Bhc3NfeWluY1twbmdfcHRyLT5wYXNzXTsKLQotICAgICAgfSB3aGlsZSAocG5nX3B0ci0+aXdpZHRoID09IDAgfHwgcG5nX3B0ci0+bnVtX3Jvd3MgPT0gMCk7Ci0gICB9Ci0jZW5kaWYgLyogUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEICovCi19Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX3RFWHRfU1VQUE9SVEVEKQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9oYW5kbGVfdEVYdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyCi0gICBsZW5ndGgpCi17Ci0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikgfHwgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JRU5EKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IG9mIHBsYWNlIHRFWHQiKTsKLSAgICAgICAgIGluZm9fcHRyID0gaW5mb19wdHI7IC8qIFRvIHF1aWV0IHNvbWUgY29tcGlsZXIgd2FybmluZ3MgKi8KLSAgICAgIH0KLQotI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SwotICAgcG5nX3B0ci0+c2tpcF9sZW5ndGggPSAwOyAgLyogVGhpcyBtYXkgbm90IGJlIG5lY2Vzc2FyeSAqLwotCi0gICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkgLyogQ2FuJ3QgaG9sZCBlbnRpcmUgc3RyaW5nIGluIG1lbW9yeSAqLwotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInRFWHQgY2h1bmsgdG9vIGxhcmdlIHRvIGZpdCBpbiBtZW1vcnkiKTsKLSAgICAgIHBuZ19wdHItPnNraXBfbGVuZ3RoID0gbGVuZ3RoIC0gKHBuZ191aW50XzMyKTY1NTM1TDsKLSAgICAgIGxlbmd0aCA9IChwbmdfdWludF8zMik2NTUzNUw7Ci0gICB9Ci0jZW5kaWYKLQotICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0ID0gKHBuZ19jaGFycClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAocG5nX3VpbnRfMzIpKGxlbmd0aCArIDEpKTsKLSAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dFtsZW5ndGhdID0gJ1wwJzsKLSAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9wdHIgPSBwbmdfcHRyLT5jdXJyZW50X3RleHQ7Ci0gICBwbmdfcHRyLT5jdXJyZW50X3RleHRfc2l6ZSA9IChwbmdfc2l6ZV90KWxlbmd0aDsKLSAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9sZWZ0ID0gKHBuZ19zaXplX3QpbGVuZ3RoOwotICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfdEVYdF9NT0RFOwotfQotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19wdXNoX3JlYWRfdEVYdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgJiYgcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQpCi0gICB7Ci0gICAgICBwbmdfc2l6ZV90IHRleHRfc2l6ZTsKLQotICAgICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplIDwgcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQpCi0gICAgICAgICB0ZXh0X3NpemUgPSBwbmdfcHRyLT5idWZmZXJfc2l6ZTsKLQotICAgICAgZWxzZQotICAgICAgICAgdGV4dF9zaXplID0gcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQ7Ci0KLSAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19wdHItPmN1cnJlbnRfdGV4dF9wdHIsIHRleHRfc2l6ZSk7Ci0gICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdCAtPSB0ZXh0X3NpemU7Ci0gICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHRfcHRyICs9IHRleHRfc2l6ZTsKLSAgIH0KLSAgIGlmICghKHBuZ19wdHItPmN1cnJlbnRfdGV4dF9sZWZ0KSkKLSAgIHsKLSAgICAgIHBuZ190ZXh0cCB0ZXh0X3B0cjsKLSAgICAgIHBuZ19jaGFycCB0ZXh0OwotICAgICAgcG5nX2NoYXJwIGtleTsKLSAgICAgIGludCByZXQ7Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSA8IDQpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcG5nX3B1c2hfY3JjX2ZpbmlzaChwbmdfcHRyKTsKLQotI2lmIGRlZmluZWQoUE5HX01BWF9NQUxMT0NfNjRLKQotICAgICAgaWYgKHBuZ19wdHItPnNraXBfbGVuZ3RoKQotICAgICAgICAgcmV0dXJuOwotI2VuZGlmCi0KLSAgICAgIGtleSA9IHBuZ19wdHItPmN1cnJlbnRfdGV4dDsKLQotICAgICAgZm9yICh0ZXh0ID0ga2V5OyAqdGV4dDsgdGV4dCsrKQotICAgICAgICAgLyogRW1wdHkgbG9vcCAqLyA7Ci0KLSAgICAgIGlmICh0ZXh0IDwga2V5ICsgcG5nX3B0ci0+Y3VycmVudF90ZXh0X3NpemUpCi0gICAgICAgICB0ZXh0Kys7Ci0KLSAgICAgIHRleHRfcHRyID0gKHBuZ190ZXh0cClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAocG5nX3VpbnRfMzIpcG5nX3NpemVvZihwbmdfdGV4dCkpOwotICAgICAgdGV4dF9wdHItPmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgIHRleHRfcHRyLT5rZXkgPSBrZXk7Ci0jaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICAgICB0ZXh0X3B0ci0+bGFuZyA9IE5VTEw7Ci0gICAgICB0ZXh0X3B0ci0+bGFuZ19rZXkgPSBOVUxMOwotI2VuZGlmCi0gICAgICB0ZXh0X3B0ci0+dGV4dCA9IHRleHQ7Ci0KLSAgICAgIHJldCA9IHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgMSk7Ci0KLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGtleSk7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCB0ZXh0X3B0cik7Ci0gICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHQgPSBOVUxMOwotCi0gICAgICBpZiAocmV0KQotICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBzdG9yZSB0ZXh0IGNodW5rLiIpOwotICAgfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX3pUWHRfU1VQUE9SVEVEKQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9oYW5kbGVfelRYdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyCi0gICBsZW5ndGgpCi17Ci0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikgfHwgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JRU5EKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IG9mIHBsYWNlIHpUWHQiKTsKLSAgICAgICAgIGluZm9fcHRyID0gaW5mb19wdHI7IC8qIFRvIHF1aWV0IHNvbWUgY29tcGlsZXIgd2FybmluZ3MgKi8KLSAgICAgIH0KLQotI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SwotICAgLyogV2UgY2FuJ3QgaGFuZGxlIHpUWHQgY2h1bmtzID4gNjRLLCBzaW5jZSB3ZSBkb24ndCBoYXZlIGVub3VnaCBzcGFjZQotICAgICogdG8gYmUgYWJsZSB0byBzdG9yZSB0aGUgdW5jb21wcmVzc2VkIGRhdGEuICBBY3R1YWxseSwgdGhlIHRocmVzaG9sZAotICAgICogaXMgcHJvYmFibHkgYXJvdW5kIDMySywgYnV0IGl0IGlzbid0IGFzIGRlZmluaXRlIGFzIDY0SyBpcy4KLSAgICAqLwotICAgaWYgKGxlbmd0aCA+IChwbmdfdWludF8zMik2NTUzNUwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAielRYdCBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOwotICAgICAgcG5nX3B1c2hfY3JjX3NraXAocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSNlbmRpZgotCi0gICBwbmdfcHRyLT5jdXJyZW50X3RleHQgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgIChwbmdfdWludF8zMikobGVuZ3RoICsgMSkpOwotICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0W2xlbmd0aF0gPSAnXDAnOwotICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0X3B0ciA9IHBuZ19wdHItPmN1cnJlbnRfdGV4dDsKLSAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9zaXplID0gKHBuZ19zaXplX3QpbGVuZ3RoOwotICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQgPSAocG5nX3NpemVfdClsZW5ndGg7Ci0gICBwbmdfcHRyLT5wcm9jZXNzX21vZGUgPSBQTkdfUkVBRF96VFh0X01PREU7Ci19Ci0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3B1c2hfcmVhZF96VFh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSAmJiBwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdCkKLSAgIHsKLSAgICAgIHBuZ19zaXplX3QgdGV4dF9zaXplOwotCi0gICAgICBpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgPCAocG5nX3VpbnRfMzIpcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQpCi0gICAgICAgICB0ZXh0X3NpemUgPSBwbmdfcHRyLT5idWZmZXJfc2l6ZTsKLQotICAgICAgZWxzZQotICAgICAgICAgdGV4dF9zaXplID0gcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQ7Ci0KLSAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19wdHItPmN1cnJlbnRfdGV4dF9wdHIsIHRleHRfc2l6ZSk7Ci0gICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdCAtPSB0ZXh0X3NpemU7Ci0gICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHRfcHRyICs9IHRleHRfc2l6ZTsKLSAgIH0KLSAgIGlmICghKHBuZ19wdHItPmN1cnJlbnRfdGV4dF9sZWZ0KSkKLSAgIHsKLSAgICAgIHBuZ190ZXh0cCB0ZXh0X3B0cjsKLSAgICAgIHBuZ19jaGFycCB0ZXh0OwotICAgICAgcG5nX2NoYXJwIGtleTsKLSAgICAgIGludCByZXQ7Ci0gICAgICBwbmdfc2l6ZV90IHRleHRfc2l6ZSwga2V5X3NpemU7Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSA8IDQpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHVzaF9zYXZlX2J1ZmZlcihwbmdfcHRyKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcG5nX3B1c2hfY3JjX2ZpbmlzaChwbmdfcHRyKTsKLQotICAgICAga2V5ID0gcG5nX3B0ci0+Y3VycmVudF90ZXh0OwotCi0gICAgICBmb3IgKHRleHQgPSBrZXk7ICp0ZXh0OyB0ZXh0KyspCi0gICAgICAgICAvKiBFbXB0eSBsb29wICovIDsKLQotICAgICAgLyogelRYdCBjYW4ndCBoYXZlIHplcm8gdGV4dCAqLwotICAgICAgaWYgKHRleHQgPj0ga2V5ICsgcG5nX3B0ci0+Y3VycmVudF90ZXh0X3NpemUpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHQgPSBOVUxMOwotICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwga2V5KTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgdGV4dCsrOwotCi0gICAgICBpZiAoKnRleHQgIT0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdCkgLyogQ2hlY2sgY29tcHJlc3Npb24gYnl0ZSAqLwotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0ID0gTlVMTDsKLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGtleSk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHRleHQrKzsKLQotICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X2luID0gKHBuZ19ieXRlcCApdGV4dDsKLSAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAodUludCkocG5nX3B0ci0+Y3VycmVudF90ZXh0X3NpemUgLQotICAgICAgICAgKHRleHQgLSBrZXkpKTsKLSAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOwotICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7Ci0KLSAgICAgIGtleV9zaXplID0gdGV4dCAtIGtleTsKLSAgICAgIHRleHRfc2l6ZSA9IDA7Ci0gICAgICB0ZXh0ID0gTlVMTDsKLSAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKLQotICAgICAgd2hpbGUgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4pCi0gICAgICB7Ci0gICAgICAgICByZXQgPSBpbmZsYXRlKCZwbmdfcHRyLT56c3RyZWFtLCBaX1BBUlRJQUxfRkxVU0gpOwotICAgICAgICAgaWYgKHJldCAhPSBaX09LICYmIHJldCAhPSBaX1NUUkVBTV9FTkQpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbmZsYXRlUmVzZXQoJnBuZ19wdHItPnpzdHJlYW0pOwotICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IDA7Ci0gICAgICAgICAgICBwbmdfcHRyLT5jdXJyZW50X3RleHQgPSBOVUxMOwotICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwga2V5KTsKLSAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHRleHQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgfQotICAgICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpIHx8IHJldCA9PSBaX1NUUkVBTV9FTkQpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGV4dCA9PSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgdGV4dCA9IChwbmdfY2hhcnApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgKHBuZ191aW50XzMyKShwbmdfcHRyLT56YnVmX3NpemUKLSAgICAgICAgICAgICAgICAgICAgIC0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgKyBrZXlfc2l6ZSArIDEpKTsKLQotICAgICAgICAgICAgICAgcG5nX21lbWNweSh0ZXh0ICsga2V5X3NpemUsIHBuZ19wdHItPnpidWYsCi0gICAgICAgICAgICAgICAgICBwbmdfcHRyLT56YnVmX3NpemUgLSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCk7Ci0KLSAgICAgICAgICAgICAgIHBuZ19tZW1jcHkodGV4dCwga2V5LCBrZXlfc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgIHRleHRfc2l6ZSA9IGtleV9zaXplICsgcG5nX3B0ci0+emJ1Zl9zaXplIC0KLSAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0OwotCi0gICAgICAgICAgICAgICAqKHRleHQgKyB0ZXh0X3NpemUpID0gJ1wwJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19jaGFycCB0bXA7Ci0KLSAgICAgICAgICAgICAgIHRtcCA9IHRleHQ7Ci0gICAgICAgICAgICAgICB0ZXh0ID0gKHBuZ19jaGFycClwbmdfbWFsbG9jKHBuZ19wdHIsIHRleHRfc2l6ZSArCi0gICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKHBuZ19wdHItPnpidWZfc2l6ZSAKLSAgICAgICAgICAgICAgICAgIC0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgKyAxKSk7Ci0KLSAgICAgICAgICAgICAgIHBuZ19tZW1jcHkodGV4dCwgdG1wLCB0ZXh0X3NpemUpOwotICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgdG1wKTsKLQotICAgICAgICAgICAgICAgcG5nX21lbWNweSh0ZXh0ICsgdGV4dF9zaXplLCBwbmdfcHRyLT56YnVmLAotICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+emJ1Zl9zaXplIC0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpOwotCi0gICAgICAgICAgICAgICB0ZXh0X3NpemUgKz0gcG5nX3B0ci0+emJ1Zl9zaXplIC0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQ7Ci0gICAgICAgICAgICAgICAqKHRleHQgKyB0ZXh0X3NpemUpID0gJ1wwJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXQgIT0gWl9TVFJFQU1fRU5EKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnpidWY7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpbmZsYXRlUmVzZXQoJnBuZ19wdHItPnpzdHJlYW0pOwotICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9IDA7Ci0KLSAgICAgIGlmIChyZXQgIT0gWl9TVFJFQU1fRU5EKQotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0ID0gTlVMTDsKLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGtleSk7Ci0gICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCB0ZXh0KTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0ID0gTlVMTDsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGtleSk7Ci0gICAgICBrZXkgPSB0ZXh0OwotICAgICAgdGV4dCArPSBrZXlfc2l6ZTsKLQotICAgICAgdGV4dF9wdHIgPSAocG5nX3RleHRwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAocG5nX3VpbnRfMzIpcG5nX3NpemVvZihwbmdfdGV4dCkpOwotICAgICAgdGV4dF9wdHItPmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdDsKLSAgICAgIHRleHRfcHRyLT5rZXkgPSBrZXk7Ci0jaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICAgICB0ZXh0X3B0ci0+bGFuZyA9IE5VTEw7Ci0gICAgICB0ZXh0X3B0ci0+bGFuZ19rZXkgPSBOVUxMOwotI2VuZGlmCi0gICAgICB0ZXh0X3B0ci0+dGV4dCA9IHRleHQ7Ci0KLSAgICAgIHJldCA9IHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgMSk7Ci0KLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGtleSk7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCB0ZXh0X3B0cik7Ci0KLSAgICAgIGlmIChyZXQpCi0gICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHN0b3JlIHRleHQgY2h1bmsuIik7Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfaVRYdF9TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19wdXNoX2hhbmRsZV9pVFh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIKLSAgIGxlbmd0aCkKLXsKLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSB8fCAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lFTkQpKQotICAgICAgewotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPdXQgb2YgcGxhY2UgaVRYdCIpOwotICAgICAgICAgaW5mb19wdHIgPSBpbmZvX3B0cjsgLyogVG8gcXVpZXQgc29tZSBjb21waWxlciB3YXJuaW5ncyAqLwotICAgICAgfQotCi0jaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCi0gICBwbmdfcHRyLT5za2lwX2xlbmd0aCA9IDA7ICAvKiBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5ICovCi0KLSAgIGlmIChsZW5ndGggPiAocG5nX3VpbnRfMzIpNjU1MzVMKSAvKiBDYW4ndCBob2xkIGVudGlyZSBzdHJpbmcgaW4gbWVtb3J5ICovCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiaVRYdCBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOwotICAgICAgcG5nX3B0ci0+c2tpcF9sZW5ndGggPSBsZW5ndGggLSAocG5nX3VpbnRfMzIpNjU1MzVMOwotICAgICAgbGVuZ3RoID0gKHBuZ191aW50XzMyKTY1NTM1TDsKLSAgIH0KLSNlbmRpZgotCi0gICBwbmdfcHRyLT5jdXJyZW50X3RleHQgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgIChwbmdfdWludF8zMikobGVuZ3RoICsgMSkpOwotICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0W2xlbmd0aF0gPSAnXDAnOwotICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0X3B0ciA9IHBuZ19wdHItPmN1cnJlbnRfdGV4dDsKLSAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9zaXplID0gKHBuZ19zaXplX3QpbGVuZ3RoOwotICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQgPSAocG5nX3NpemVfdClsZW5ndGg7Ci0gICBwbmdfcHRyLT5wcm9jZXNzX21vZGUgPSBQTkdfUkVBRF9pVFh0X01PREU7Ci19Ci0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3B1c2hfcmVhZF9pVFh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLQotICAgaWYgKHBuZ19wdHItPmJ1ZmZlcl9zaXplICYmIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9sZWZ0KQotICAgewotICAgICAgcG5nX3NpemVfdCB0ZXh0X3NpemU7Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5idWZmZXJfc2l6ZSA8IHBuZ19wdHItPmN1cnJlbnRfdGV4dF9sZWZ0KQotICAgICAgICAgdGV4dF9zaXplID0gcG5nX3B0ci0+YnVmZmVyX3NpemU7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIHRleHRfc2l6ZSA9IHBuZ19wdHItPmN1cnJlbnRfdGV4dF9sZWZ0OwotCi0gICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcHRyLT5jdXJyZW50X3RleHRfcHRyLCB0ZXh0X3NpemUpOwotICAgICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0X2xlZnQgLT0gdGV4dF9zaXplOwotICAgICAgcG5nX3B0ci0+Y3VycmVudF90ZXh0X3B0ciArPSB0ZXh0X3NpemU7Ci0gICB9Ci0gICBpZiAoIShwbmdfcHRyLT5jdXJyZW50X3RleHRfbGVmdCkpCi0gICB7Ci0gICAgICBwbmdfdGV4dHAgdGV4dF9wdHI7Ci0gICAgICBwbmdfY2hhcnAga2V5OwotICAgICAgaW50IGNvbXBfZmxhZzsKLSAgICAgIHBuZ19jaGFycCBsYW5nOwotICAgICAgcG5nX2NoYXJwIGxhbmdfa2V5OwotICAgICAgcG5nX2NoYXJwIHRleHQ7Ci0gICAgICBpbnQgcmV0OwotCi0gICAgICBpZiAocG5nX3B0ci0+YnVmZmVyX3NpemUgPCA0KQotICAgICAgewotICAgICAgICAgcG5nX3B1c2hfc2F2ZV9idWZmZXIocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19wdXNoX2NyY19maW5pc2gocG5nX3B0cik7Ci0KLSNpZiBkZWZpbmVkKFBOR19NQVhfTUFMTE9DXzY0SykKLSAgICAgIGlmIChwbmdfcHRyLT5za2lwX2xlbmd0aCkKLSAgICAgICAgIHJldHVybjsKLSNlbmRpZgotCi0gICAgICBrZXkgPSBwbmdfcHRyLT5jdXJyZW50X3RleHQ7Ci0KLSAgICAgIGZvciAobGFuZyA9IGtleTsgKmxhbmc7IGxhbmcrKykKLSAgICAgICAgIC8qIEVtcHR5IGxvb3AgKi8gOwotCi0gICAgICBpZiAobGFuZyA8IGtleSArIHBuZ19wdHItPmN1cnJlbnRfdGV4dF9zaXplIC0gMykKLSAgICAgICAgIGxhbmcrKzsKLQotICAgICAgY29tcF9mbGFnID0gKmxhbmcrKzsKLSAgICAgIGxhbmcrKzsgICAgIC8qIFNraXAgY29tcF90eXBlLCBhbHdheXMgemVybyAqLwotCi0gICAgICBmb3IgKGxhbmdfa2V5ID0gbGFuZzsgKmxhbmdfa2V5OyBsYW5nX2tleSsrKQotICAgICAgICAgLyogRW1wdHkgbG9vcCAqLyA7Ci0KLSAgICAgIGxhbmdfa2V5Kys7ICAgICAgICAvKiBTa2lwIE5VTCBzZXBhcmF0b3IgKi8KLQotICAgICAgdGV4dD1sYW5nX2tleTsKLQotICAgICAgaWYgKGxhbmdfa2V5IDwga2V5ICsgcG5nX3B0ci0+Y3VycmVudF90ZXh0X3NpemUgLSAxKQotICAgICAgewotICAgICAgICBmb3IgKDsgKnRleHQ7IHRleHQrKykKLSAgICAgICAgICAgLyogRW1wdHkgbG9vcCAqLyA7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0ZXh0IDwga2V5ICsgcG5nX3B0ci0+Y3VycmVudF90ZXh0X3NpemUpCi0gICAgICAgICB0ZXh0Kys7Ci0KLSAgICAgIHRleHRfcHRyID0gKHBuZ190ZXh0cClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAocG5nX3VpbnRfMzIpcG5nX3NpemVvZihwbmdfdGV4dCkpOwotCi0gICAgICB0ZXh0X3B0ci0+Y29tcHJlc3Npb24gPSBjb21wX2ZsYWcgKyAyOwotICAgICAgdGV4dF9wdHItPmtleSA9IGtleTsKLSAgICAgIHRleHRfcHRyLT5sYW5nID0gbGFuZzsKLSAgICAgIHRleHRfcHRyLT5sYW5nX2tleSA9IGxhbmdfa2V5OwotICAgICAgdGV4dF9wdHItPnRleHQgPSB0ZXh0OwotICAgICAgdGV4dF9wdHItPnRleHRfbGVuZ3RoID0gMDsKLSAgICAgIHRleHRfcHRyLT5pdHh0X2xlbmd0aCA9IHBuZ19zdHJsZW4odGV4dCk7Ci0KLSAgICAgIHJldCA9IHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgMSk7Ci0KLSAgICAgIHBuZ19wdHItPmN1cnJlbnRfdGV4dCA9IE5VTEw7Ci0KLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHRleHRfcHRyKTsKLSAgICAgIGlmIChyZXQpCi0gICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHN0b3JlIGlUWHQgY2h1bmsuIik7Ci0gICB9Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlbid0IGZvdW5kIGEgaGFuZGxlciBmb3IgdGhpcwotICogY2h1bmsuICBJZiB0aGVyZSBpc24ndCBhIHByb2JsZW0gd2l0aCB0aGUgY2h1bmsgaXRzZWxmIChpZSBhIGJhZCBjaHVuawotICogbmFtZSBvciBhIGNyaXRpY2FsIGNodW5rKSwgdGhlIGNodW5rIGlzIChjdXJyZW50bHkpIHNpbGVudGx5IGlnbm9yZWQuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3B1c2hfaGFuZGxlX3Vua25vd24ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMgotICAgbGVuZ3RoKQotewotICAgcG5nX3VpbnRfMzIgc2tpcCA9IDA7Ci0KLSAgIGlmICghKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSkKLSAgIHsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgICAgIGlmIChwbmdfaGFuZGxlX2FzX3Vua25vd24ocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSkgIT0KLSAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQpCi0gICAgICAgICAmJiBwbmdfcHRyLT5yZWFkX3VzZXJfY2h1bmtfZm4gPT0gTlVMTAotI2VuZGlmCi0gICAgICAgICApCi0jZW5kaWYKLSAgICAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAidW5rbm93biBjcml0aWNhbCBjaHVuayIpOwotCi0gICAgICBpbmZvX3B0ciA9IGluZm9fcHRyOyAvKiBUbyBxdWlldCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzICovCi0gICB9Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0tFRVBfVU5LTk9XTl9DSFVOS1MpCi0gICB7Ci0jaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCi0gICAgICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkKLSAgICAgIHsKLSAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAidW5rbm93biBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOwotICAgICAgICAgIHNraXAgPSBsZW5ndGggLSAocG5nX3VpbnRfMzIpNjU1MzVMOwotICAgICAgICAgIGxlbmd0aCA9IChwbmdfdWludF8zMik2NTUzNUw7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIHBuZ19tZW1jcHkoKHBuZ19jaGFycClwbmdfcHRyLT51bmtub3duX2NodW5rLm5hbWUsCi0gICAgICAgICAgICAgICAgIChwbmdfY2hhcnApcG5nX3B0ci0+Y2h1bmtfbmFtZSwgCi0gICAgICAgICAgICAgICAgIHBuZ19zaXplb2YocG5nX3B0ci0+dW5rbm93bl9jaHVuay5uYW1lKSk7Ci0gICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLm5hbWVbcG5nX3NpemVvZihwbmdfcHRyLT51bmtub3duX2NodW5rLm5hbWUpIC0gMV0KLSAgICAgICAgPSAnXDAnOwotCi0gICAgICBwbmdfcHRyLT51bmtub3duX2NodW5rLnNpemUgPSAocG5nX3NpemVfdClsZW5ndGg7Ci0KLSAgICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IE5VTEw7Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgIChwbmdfdWludF8zMilsZW5ndGgpOwotICAgICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhLCBsZW5ndGgpOwotICAgICAgfQotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQpCi0gICAgICBpZiAocG5nX3B0ci0+cmVhZF91c2VyX2NodW5rX2ZuICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAvKiBDYWxsYmFjayB0byB1c2VyIHVua25vd24gY2h1bmsgaGFuZGxlciAqLwotICAgICAgICAgaW50IHJldDsKLSAgICAgICAgIHJldCA9ICgqKHBuZ19wdHItPnJlYWRfdXNlcl9jaHVua19mbikpCi0gICAgICAgICAgIChwbmdfcHRyLCAmcG5nX3B0ci0+dW5rbm93bl9jaHVuayk7Ci0KLSAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJlcnJvciBpbiB1c2VyIGNodW5rIik7Ci0KLSAgICAgICAgIGlmIChyZXQgPT0gMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSkKLSAgICAgICAgICAgICAgIGlmIChwbmdfaGFuZGxlX2FzX3Vua25vd24ocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSkgIT0KLSAgICAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMpCi0gICAgICAgICAgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgInVua25vd24gY3JpdGljYWwgY2h1bmsiKTsKLSAgICAgICAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgICAgICAgICAmcG5nX3B0ci0+dW5rbm93bl9jaHVuaywgMSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCAmcG5nX3B0ci0+dW5rbm93bl9jaHVuaywgMSk7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT51bmtub3duX2NodW5rLmRhdGEpOwotICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhID0gTlVMTDsKLSAgIH0KLQotICAgZWxzZQotI2VuZGlmCi0gICAgICBza2lwPWxlbmd0aDsKLSAgIHBuZ19wdXNoX2NyY19za2lwKHBuZ19wdHIsIHNraXApOwotfQotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19wdXNoX2hhdmVfaW5mbyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ci0+aW5mb19mbiAhPSBOVUxMKQotICAgICAgKCoocG5nX3B0ci0+aW5mb19mbikpKHBuZ19wdHIsIGluZm9fcHRyKTsKLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcHVzaF9oYXZlX2VuZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBpZiAocG5nX3B0ci0+ZW5kX2ZuICE9IE5VTEwpCi0gICAgICAoKihwbmdfcHRyLT5lbmRfZm4pKShwbmdfcHRyLCBpbmZvX3B0cik7Ci19Ci0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3B1c2hfaGF2ZV9yb3cocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHJvdykKLXsKLSAgIGlmIChwbmdfcHRyLT5yb3dfZm4gIT0gTlVMTCkKLSAgICAgICgqKHBuZ19wdHItPnJvd19mbikpKHBuZ19wdHIsIHJvdywgcG5nX3B0ci0+cm93X251bWJlciwKLSAgICAgICAgIChpbnQpcG5nX3B0ci0+cGFzcyk7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfYnl0ZXAgb2xkX3JvdywgcG5nX2J5dGVwIG5ld19yb3cpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIFBOR19DT05TVCBpbnQgRkFSREFUQSBwbmdfcGFzc19kc3BfbWFza1s3XSA9Ci0gICAgICB7MHhmZiwgMHgwZiwgMHhmZiwgMHgzMywgMHhmZiwgMHg1NSwgMHhmZn07Ci0jZW5kaWYKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIGlmIChuZXdfcm93ICE9IE5VTEwpICAgIC8qIG5ld19yb3cgbXVzdCA9PSBwbmdfcHRyLT5yb3dfYnVmIGhlcmUuICovCi0gICAgICBwbmdfY29tYmluZV9yb3cocG5nX3B0ciwgb2xkX3JvdywgcG5nX3Bhc3NfZHNwX21hc2tbcG5nX3B0ci0+cGFzc10pOwotfQotCi12b2lkIFBOR0FQSQotcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwcm9ncmVzc2l2ZV9wdHIsCi0gICBwbmdfcHJvZ3Jlc3NpdmVfaW5mb19wdHIgaW5mb19mbiwgcG5nX3Byb2dyZXNzaXZlX3Jvd19wdHIgcm93X2ZuLAotICAgcG5nX3Byb2dyZXNzaXZlX2VuZF9wdHIgZW5kX2ZuKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX3B0ci0+aW5mb19mbiA9IGluZm9fZm47Ci0gICBwbmdfcHRyLT5yb3dfZm4gPSByb3dfZm47Ci0gICBwbmdfcHRyLT5lbmRfZm4gPSBlbmRfZm47Ci0KLSAgIHBuZ19zZXRfcmVhZF9mbihwbmdfcHRyLCBwcm9ncmVzc2l2ZV9wdHIsIHBuZ19wdXNoX2ZpbGxfYnVmZmVyKTsKLX0KLQotcG5nX3ZvaWRwIFBOR0FQSQotcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gKE5VTEwpOwotCi0gICByZXR1cm4gcG5nX3B0ci0+aW9fcHRyOwotfQotI2VuZGlmIC8qIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcG5ncmVhZC5jIGIvbGlicy9saWJwbmcvcG5ncmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzBlY2JhLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3BuZ3JlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NzAgKzAsMCBAQAotCi0vKiBwbmdyZWFkLmMgLSByZWFkIGEgUE5HIGZpbGUKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuMi4zNyBbSnVuZSA0LCAyMDA5XQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbGxzIGRpcmVjdGx5IHRvCi0gKiByZWFkIGEgUE5HIGZpbGUgb3Igc3RyZWFtLgotICovCi0KLSNkZWZpbmUgUE5HX0lOVEVSTkFMCi0jaW5jbHVkZSAicG5nLmgiCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpCi0KLS8qIENyZWF0ZSBhIFBORyBzdHJ1Y3R1cmUgZm9yIHJlYWRpbmcsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5IG5lZWRlZC4gKi8KLXBuZ19zdHJ1Y3RwIFBOR0FQSQotcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLAotICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwgcG5nX2Vycm9yX3B0ciB3YXJuX2ZuKQotewotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgcmV0dXJuIChwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIodXNlcl9wbmdfdmVyLCBlcnJvcl9wdHIsIGVycm9yX2ZuLAotICAgICAgd2Fybl9mbiwgcG5nX3ZvaWRwX05VTEwsIHBuZ19tYWxsb2NfcHRyX05VTEwsIHBuZ19mcmVlX3B0cl9OVUxMKSk7Ci19Ci0KLS8qIEFsdGVybmF0ZSBjcmVhdGUgUE5HIHN0cnVjdHVyZSBmb3IgcmVhZGluZywgYW5kIGFsbG9jYXRlIGFueSBtZW1vcnkgbmVlZGVkLiAqLwotcG5nX3N0cnVjdHAgUE5HQVBJCi1wbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIocG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwKLSAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiwgcG5nX3ZvaWRwIG1lbV9wdHIsCi0gICBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm4sIHBuZ19mcmVlX3B0ciBmcmVlX2ZuKQotewotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICB2b2xhdGlsZQotI2VuZGlmCi0gICBwbmdfc3RydWN0cCBwbmdfcHRyOwotCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKLSAgIGptcF9idWYgam1wYnVmOwotI2VuZGlmCi0jZW5kaWYKLQotICAgaW50IGk7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCIpOwotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApcG5nX2NyZWF0ZV9zdHJ1Y3RfMihQTkdfU1RSVUNUX1BORywKLSAgICAgIChwbmdfbWFsbG9jX3B0ciltYWxsb2NfZm4sIChwbmdfdm9pZHApbWVtX3B0cik7Ci0jZWxzZQotICAgcG5nX3B0ciA9IChwbmdfc3RydWN0cClwbmdfY3JlYXRlX3N0cnVjdChQTkdfU1RSVUNUX1BORyk7Ci0jZW5kaWYKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gKE5VTEwpOwotCi0gICAvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjYgKi8KLSNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAotICAgcG5nX3B0ci0+dXNlcl93aWR0aF9tYXg9UE5HX1VTRVJfV0lEVEhfTUFYOwotICAgcG5nX3B0ci0+dXNlcl9oZWlnaHRfbWF4PVBOR19VU0VSX0hFSUdIVF9NQVg7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0jaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICBpZiAoc2V0am1wKGptcGJ1ZikpCi0jZWxzZQotICAgaWYgKHNldGptcChwbmdfcHRyLT5qbXBidWYpKQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT56YnVmKTsKLSAgICAgIHBuZ19wdHItPnpidWYgPSBOVUxMOwotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgICAgIHBuZ19kZXN0cm95X3N0cnVjdF8yKChwbmdfdm9pZHApcG5nX3B0ciwKLSAgICAgICAgIChwbmdfZnJlZV9wdHIpZnJlZV9mbiwgKHBuZ192b2lkcCltZW1fcHRyKTsKLSNlbHNlCi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QoKHBuZ192b2lkcClwbmdfcHRyKTsKLSNlbmRpZgotICAgICAgcmV0dXJuIChOVUxMKTsKLSAgIH0KLSNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKLSAgIHBuZ19tZW1jcHkocG5nX3B0ci0+am1wYnVmLCBqbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIHBuZ19zZXRfbWVtX2ZuKHBuZ19wdHIsIG1lbV9wdHIsIG1hbGxvY19mbiwgZnJlZV9mbik7Ci0jZW5kaWYKLQotICAgcG5nX3NldF9lcnJvcl9mbihwbmdfcHRyLCBlcnJvcl9wdHIsIGVycm9yX2ZuLCB3YXJuX2ZuKTsKLQotICAgaWYgKHVzZXJfcG5nX3ZlcikKLSAgIHsKLSAgICAgaSA9IDA7Ci0gICAgIGRvCi0gICAgIHsKLSAgICAgICBpZiAodXNlcl9wbmdfdmVyW2ldICE9IHBuZ19saWJwbmdfdmVyW2ldKQotICAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0xJQlJBUllfTUlTTUFUQ0g7Ci0gICAgIH0gd2hpbGUgKHBuZ19saWJwbmdfdmVyW2krK10pOwotICAgfQotICAgZWxzZQotICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIOwotICAgCi0KLSAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0xJQlJBUllfTUlTTUFUQ0gpCi0gICB7Ci0gICAgIC8qIExpYnBuZyAwLjkwIGFuZCBsYXRlciBhcmUgYmluYXJ5IGluY29tcGF0aWJsZSB3aXRoIGxpYnBuZyAwLjg5LCBzbwotICAgICAgKiB3ZSBtdXN0IHJlY29tcGlsZSBhbnkgYXBwbGljYXRpb25zIHRoYXQgdXNlIGFueSBvbGRlciBsaWJyYXJ5IHZlcnNpb24uCi0gICAgICAqIEZvciB2ZXJzaW9ucyBhZnRlciBsaWJwbmcgMS4wLCB3ZSB3aWxsIGJlIGNvbXBhdGlibGUsIHNvIHdlIG5lZWQKLSAgICAgICogb25seSBjaGVjayB0aGUgZmlyc3QgZGlnaXQuCi0gICAgICAqLwotICAgICBpZiAodXNlcl9wbmdfdmVyID09IE5VTEwgfHwgdXNlcl9wbmdfdmVyWzBdICE9IHBuZ19saWJwbmdfdmVyWzBdIHx8Ci0gICAgICAgICAodXNlcl9wbmdfdmVyWzBdID09ICcxJyAmJiB1c2VyX3BuZ192ZXJbMl0gIT0gcG5nX2xpYnBuZ192ZXJbMl0pIHx8Ci0gICAgICAgICAodXNlcl9wbmdfdmVyWzBdID09ICcwJyAmJiB1c2VyX3BuZ192ZXJbMl0gPCAnOScpKQotICAgICB7Ci0jaWYgIWRlZmluZWQoUE5HX05PX1NURElPKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotICAgICAgICBjaGFyIG1zZ1s4MF07Ci0gICAgICAgIGlmICh1c2VyX3BuZ192ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBwbmdfc25wcmludGYobXNnLCA4MCwKLSAgICAgICAgICAgICAiQXBwbGljYXRpb24gd2FzIGNvbXBpbGVkIHdpdGggcG5nLmggZnJvbSBsaWJwbmctJS4yMHMiLAotICAgICAgICAgICAgIHVzZXJfcG5nX3Zlcik7Ci0gICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsKLSAgICAgICAgfQotICAgICAgICBwbmdfc25wcmludGYobXNnLCA4MCwKLSAgICAgICAgICAgICAiQXBwbGljYXRpb24gIGlzICBydW5uaW5nIHdpdGggcG5nLmMgZnJvbSBsaWJwbmctJS4yMHMiLAotICAgICAgICAgICBwbmdfbGlicG5nX3Zlcik7Ci0gICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKLSAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgPSAwOwotI2VuZGlmCi0gICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAotICAgICAgICAgICAiSW5jb21wYXRpYmxlIGxpYnBuZyB2ZXJzaW9uIGluIGFwcGxpY2F0aW9uIGFuZCBsaWJyYXJ5Iik7Ci0gICAgIH0KLSAgIH0KLQotICAgLyogSW5pdGlhbGl6ZSB6YnVmIC0gY29tcHJlc3Npb24gYnVmZmVyICovCi0gICBwbmdfcHRyLT56YnVmX3NpemUgPSBQTkdfWkJVRl9TSVpFOwotICAgcG5nX3B0ci0+emJ1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAocG5nX3VpbnRfMzIpcG5nX3B0ci0+emJ1Zl9zaXplKTsKLSAgIHBuZ19wdHItPnpzdHJlYW0uemFsbG9jID0gcG5nX3phbGxvYzsKLSAgIHBuZ19wdHItPnpzdHJlYW0uemZyZWUgPSBwbmdfemZyZWU7Ci0gICBwbmdfcHRyLT56c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpcG5nX3B0cjsKLQotICAgc3dpdGNoIChpbmZsYXRlSW5pdCgmcG5nX3B0ci0+enN0cmVhbSkpCi0gICB7Ci0gICAgIGNhc2UgWl9PSzogLyogRG8gbm90aGluZyAqLyBicmVhazsKLSAgICAgY2FzZSBaX01FTV9FUlJPUjoKLSAgICAgY2FzZSBaX1NUUkVBTV9FUlJPUjogcG5nX2Vycm9yKHBuZ19wdHIsICJ6bGliIG1lbW9yeSBlcnJvciIpOyBicmVhazsKLSAgICAgY2FzZSBaX1ZFUlNJT05fRVJST1I6IHBuZ19lcnJvcihwbmdfcHRyLCAiemxpYiB2ZXJzaW9uIGVycm9yIik7IGJyZWFrOwotICAgICBkZWZhdWx0OiBwbmdfZXJyb3IocG5nX3B0ciwgIlVua25vd24gemxpYiBlcnJvciIpOwotICAgfQotCi0gICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLSAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOwotCi0gICBwbmdfc2V0X3JlYWRfZm4ocG5nX3B0ciwgcG5nX3ZvaWRwX05VTEwsIHBuZ19yd19wdHJfTlVMTCk7Ci0KLSNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAotLyogQXBwbGljYXRpb25zIHRoYXQgbmVnbGVjdCB0byBzZXQgdXAgdGhlaXIgb3duIHNldGptcCgpIGFuZCB0aGVuIGVuY291bnRlcgotICAgYSBwbmdfZXJyb3IoKSB3aWxsIGxvbmdqbXAgaGVyZS4gIFNpbmNlIHRoZSBqbXBidWYgaXMgdGhlbiBtZWFuaW5nbGVzcyB3ZQotICAgYWJvcnQgaW5zdGVhZCBvZiByZXR1cm5pbmcuICovCi0jaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICBpZiAoc2V0am1wKGptcGJ1ZikpCi0gICAgICBQTkdfQUJPUlQoKTsKLSAgIHBuZ19tZW1jcHkocG5nX3B0ci0+am1wYnVmLCBqbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOwotI2Vsc2UKLSAgIGlmIChzZXRqbXAocG5nX3B0ci0+am1wYnVmKSkKLSAgICAgIFBOR19BQk9SVCgpOwotI2VuZGlmCi0jZW5kaWYKLSAgIHJldHVybiAocG5nX3B0cik7Ci19Ci0KLSNpZiBkZWZpbmVkKFBOR18xXzBfWCkgfHwgZGVmaW5lZChQTkdfMV8yX1gpCi0vKiBJbml0aWFsaXplIFBORyBzdHJ1Y3R1cmUgZm9yIHJlYWRpbmcsIGFuZCBhbGxvY2F0ZSBhbnkgbWVtb3J5IG5lZWRlZC4KLSAgIFRoaXMgaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCksCi0gICBhbmQgaXQgd2lsbCBkaXNhcHBlYXIgYXMgb2YgbGlicG5nLTEuMy4wLiAqLwotI3VuZGVmIHBuZ19yZWFkX2luaXQKLXZvaWQgUE5HQVBJCi1wbmdfcmVhZF9pbml0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICAvKiBXZSBvbmx5IGNvbWUgaGVyZSB2aWEgcHJlLTEuMC43LWNvbXBpbGVkIGFwcGxpY2F0aW9ucyAqLwotICAgcG5nX3JlYWRfaW5pdF8yKHBuZ19wdHIsICIxLjAuNiBvciBlYXJsaWVyIiwgMCwgMCk7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfcmVhZF9pbml0XzIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwKLSAgIHBuZ19zaXplX3QgcG5nX3N0cnVjdF9zaXplLCBwbmdfc2l6ZV90IHBuZ19pbmZvX3NpemUpCi17Ci0gICAvKiBXZSBvbmx5IGNvbWUgaGVyZSB2aWEgcHJlLTEuMC4xMi1jb21waWxlZCBhcHBsaWNhdGlvbnMgKi8KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0jaWYgIWRlZmluZWQoUE5HX05PX1NURElPKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotICAgaWYgKHBuZ19zaXplb2YocG5nX3N0cnVjdCkgPiBwbmdfc3RydWN0X3NpemUgfHwKLSAgICAgIHBuZ19zaXplb2YocG5nX2luZm8pID4gcG5nX2luZm9fc2l6ZSkKLSAgIHsKLSAgICAgIGNoYXIgbXNnWzgwXTsKLSAgICAgIHBuZ19wdHItPndhcm5pbmdfZm4gPSBOVUxMOwotICAgICAgaWYgKHVzZXJfcG5nX3ZlcikKLSAgICAgIHsKLSAgICAgICAgcG5nX3NucHJpbnRmKG1zZywgODAsCi0gICAgICAgICAgICJBcHBsaWNhdGlvbiB3YXMgY29tcGlsZWQgd2l0aCBwbmcuaCBmcm9tIGxpYnBuZy0lLjIwcyIsCi0gICAgICAgICAgIHVzZXJfcG5nX3Zlcik7Ci0gICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7Ci0gICAgICB9Ci0gICAgICBwbmdfc25wcmludGYobXNnLCA4MCwKLSAgICAgICAgICJBcHBsaWNhdGlvbiAgaXMgIHJ1bm5pbmcgd2l0aCBwbmcuYyBmcm9tIGxpYnBuZy0lLjIwcyIsCi0gICAgICAgICBwbmdfbGlicG5nX3Zlcik7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOwotICAgfQotI2VuZGlmCi0gICBpZiAocG5nX3NpemVvZihwbmdfc3RydWN0KSA+IHBuZ19zdHJ1Y3Rfc2l6ZSkKLSAgICAgewotICAgICAgIHBuZ19wdHItPmVycm9yX2ZuID0gTlVMTDsKLSNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKLSAgICAgICBwbmdfcHRyLT5mbGFncyA9IDA7Ci0jZW5kaWYKLSAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKLSAgICAgICAiVGhlIHBuZyBzdHJ1Y3QgYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBmb3IgcmVhZGluZyBpcyB0b28gc21hbGwuIik7Ci0gICAgIH0KLSAgIGlmIChwbmdfc2l6ZW9mKHBuZ19pbmZvKSA+IHBuZ19pbmZvX3NpemUpCi0gICAgIHsKLSAgICAgICBwbmdfcHRyLT5lcnJvcl9mbiA9IE5VTEw7Ci0jaWZkZWYgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECi0gICAgICAgcG5nX3B0ci0+ZmxhZ3MgPSAwOwotI2VuZGlmCi0gICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCi0gICAgICAgICAiVGhlIGluZm8gc3RydWN0IGFsbG9jYXRlZCBieSBhcHBsaWNhdGlvbiBmb3IgcmVhZGluZyBpcyB0b28gc21hbGwuIik7Ci0gICAgIH0KLSAgIHBuZ19yZWFkX2luaXRfMygmcG5nX3B0ciwgdXNlcl9wbmdfdmVyLCBwbmdfc3RydWN0X3NpemUpOwotfQotI2VuZGlmIC8qIFBOR18xXzBfWCB8fCBQTkdfMV8yX1ggKi8KLQotdm9pZCBQTkdBUEkKLXBuZ19yZWFkX2luaXRfMyhwbmdfc3RydWN0cHAgcHRyX3B0ciwgcG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwKLSAgIHBuZ19zaXplX3QgcG5nX3N0cnVjdF9zaXplKQotewotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICBqbXBfYnVmIHRtcF9qbXA7ICAvKiB0byBzYXZlIGN1cnJlbnQganVtcCBidWZmZXIgKi8KLSNlbmRpZgotCi0gICBpbnQgaSA9IDA7Ci0KLSAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI9KnB0cl9wdHI7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIGRvCi0gICB7Ci0gICAgIGlmICh1c2VyX3BuZ192ZXJbaV0gIT0gcG5nX2xpYnBuZ192ZXJbaV0pCi0gICAgIHsKLSNpZmRlZiBQTkdfTEVHQUNZX1NVUFBPUlRFRAotICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0xJQlJBUllfTUlTTUFUQ0g7Ci0jZWxzZQotICAgICAgIHBuZ19wdHItPndhcm5pbmdfZm4gPSBOVUxMOwotICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICJBcHBsaWNhdGlvbiB1c2VzIGRlcHJlY2F0ZWQgcG5nX3JlYWRfaW5pdCgpIGFuZCBzaG91bGQgYmUgcmVjb21waWxlZC4iKTsKLSAgICAgICBicmVhazsKLSNlbmRpZgotICAgICB9Ci0gICB9IHdoaWxlIChwbmdfbGlicG5nX3ZlcltpKytdKTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF9pbml0XzMiKTsKLQotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICAvKiBTYXZlIGp1bXAgYnVmZmVyIGFuZCBlcnJvciBmdW5jdGlvbnMgKi8KLSAgIHBuZ19tZW1jcHkodG1wX2ptcCwgcG5nX3B0ci0+am1wYnVmLCBwbmdfc2l6ZW9mKGptcF9idWYpKTsKLSNlbmRpZgotCi0gICBpZiAocG5nX3NpemVvZihwbmdfc3RydWN0KSA+IHBuZ19zdHJ1Y3Rfc2l6ZSkKLSAgIHsKLSAgICAgIHBuZ19kZXN0cm95X3N0cnVjdChwbmdfcHRyKTsKLSAgICAgICpwdHJfcHRyID0gKHBuZ19zdHJ1Y3RwKXBuZ19jcmVhdGVfc3RydWN0KFBOR19TVFJVQ1RfUE5HKTsKLSAgICAgIHBuZ19wdHIgPSAqcHRyX3B0cjsKLSAgIH0KLQotICAgLyogUmVzZXQgYWxsIHZhcmlhYmxlcyB0byAwICovCi0gICBwbmdfbWVtc2V0KHBuZ19wdHIsIDAsIHBuZ19zaXplb2YocG5nX3N0cnVjdCkpOwotCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSAgIC8qIFJlc3RvcmUganVtcCBidWZmZXIgKi8KLSAgIHBuZ19tZW1jcHkocG5nX3B0ci0+am1wYnVmLCB0bXBfam1wLCBwbmdfc2l6ZW9mKGptcF9idWYpKTsKLSNlbmRpZgotCi0gICAvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjYgKi8KLSNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAotICAgcG5nX3B0ci0+dXNlcl93aWR0aF9tYXg9UE5HX1VTRVJfV0lEVEhfTUFYOwotICAgcG5nX3B0ci0+dXNlcl9oZWlnaHRfbWF4PVBOR19VU0VSX0hFSUdIVF9NQVg7Ci0jZW5kaWYKLQotICAgLyogSW5pdGlhbGl6ZSB6YnVmIC0gY29tcHJlc3Npb24gYnVmZmVyICovCi0gICBwbmdfcHRyLT56YnVmX3NpemUgPSBQTkdfWkJVRl9TSVpFOwotICAgcG5nX3B0ci0+emJ1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAocG5nX3VpbnRfMzIpcG5nX3B0ci0+emJ1Zl9zaXplKTsKLSAgIHBuZ19wdHItPnpzdHJlYW0uemFsbG9jID0gcG5nX3phbGxvYzsKLSAgIHBuZ19wdHItPnpzdHJlYW0uemZyZWUgPSBwbmdfemZyZWU7Ci0gICBwbmdfcHRyLT56c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpcG5nX3B0cjsKLQotICAgc3dpdGNoIChpbmZsYXRlSW5pdCgmcG5nX3B0ci0+enN0cmVhbSkpCi0gICB7Ci0gICAgIGNhc2UgWl9PSzogLyogRG8gbm90aGluZyAqLyBicmVhazsKLSAgICAgY2FzZSBaX01FTV9FUlJPUjoKLSAgICAgY2FzZSBaX1NUUkVBTV9FUlJPUjogcG5nX2Vycm9yKHBuZ19wdHIsICJ6bGliIG1lbW9yeSIpOyBicmVhazsKLSAgICAgY2FzZSBaX1ZFUlNJT05fRVJST1I6IHBuZ19lcnJvcihwbmdfcHRyLCAiemxpYiB2ZXJzaW9uIik7IGJyZWFrOwotICAgICBkZWZhdWx0OiBwbmdfZXJyb3IocG5nX3B0ciwgIlVua25vd24gemxpYiBlcnJvciIpOwotICAgfQotCi0gICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLSAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOwotCi0gICBwbmdfc2V0X3JlYWRfZm4ocG5nX3B0ciwgcG5nX3ZvaWRwX05VTEwsIHBuZ19yd19wdHJfTlVMTCk7Ci19Ci0KLSNpZm5kZWYgUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKLS8qIFJlYWQgdGhlIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlIGRhdGEuICBUaGlzIGhhcyBiZWVuCi0gKiBjaGFuZ2VkIGluIHYwLjkwIHRvIGFsbG93IHJlYWRpbmcgYSBmaWxlIHRoYXQgYWxyZWFkeSBoYXMgdGhlIG1hZ2ljCi0gKiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbS4gIFlvdSBjYW4gdGVsbCBsaWJwbmcgaG93IG1hbnkgYnl0ZXMgaGF2ZQotICogYmVlbiByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtICh1cCB0byB0aGUgbWF4aW11bSBvZiA4KQotICogdmlhIHBuZ19zZXRfc2lnX2J5dGVzKCksIGFuZCB3ZSB3aWxsIG9ubHkgY2hlY2sgdGhlIHJlbWFpbmluZyBieXRlcwotICogaGVyZS4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gdGhlbiBoYXZlIGFjY2VzcyB0byB0aGUgc2lnbmF0dXJlIGJ5dGVzIHdlCi0gKiByZWFkIGlmIGl0IGlzIGRldGVybWluZWQgdGhhdCB0aGlzIGlzbid0IGEgdmFsaWQgUE5HIGZpbGUuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfcmVhZF9pbmZvKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfaW5mbyIpOwotICAgLyogSWYgd2UgaGF2ZW4ndCBjaGVja2VkIGFsbCBvZiB0aGUgUE5HIHNpZ25hdHVyZSBieXRlcywgZG8gc28gbm93LiAqLwotICAgaWYgKHBuZ19wdHItPnNpZ19ieXRlcyA8IDgpCi0gICB7Ci0gICAgICBwbmdfc2l6ZV90IG51bV9jaGVja2VkID0gcG5nX3B0ci0+c2lnX2J5dGVzLAotICAgICAgICAgICAgICAgICBudW1fdG9fY2hlY2sgPSA4IC0gbnVtX2NoZWNrZWQ7Ci0KLSAgICAgIHBuZ19yZWFkX2RhdGEocG5nX3B0ciwgJihpbmZvX3B0ci0+c2lnbmF0dXJlW251bV9jaGVja2VkXSksIG51bV90b19jaGVjayk7Ci0gICAgICBwbmdfcHRyLT5zaWdfYnl0ZXMgPSA4OwotCi0gICAgICBpZiAocG5nX3NpZ19jbXAoaW5mb19wdHItPnNpZ25hdHVyZSwgbnVtX2NoZWNrZWQsIG51bV90b19jaGVjaykpCi0gICAgICB7Ci0gICAgICAgICBpZiAobnVtX2NoZWNrZWQgPCA0ICYmCi0gICAgICAgICAgICAgcG5nX3NpZ19jbXAoaW5mb19wdHItPnNpZ25hdHVyZSwgbnVtX2NoZWNrZWQsIG51bV90b19jaGVjayAtIDQpKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgYSBQTkcgZmlsZSIpOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJQTkcgZmlsZSBjb3JydXB0ZWQgYnkgQVNDSUkgY29udmVyc2lvbiIpOwotICAgICAgfQotICAgICAgaWYgKG51bV9jaGVja2VkIDwgMykKLSAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUE5HX1NJR05BVFVSRTsKLSAgIH0KLQotICAgZm9yICg7OykKLSAgIHsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgICAgUE5HX0NPTlNUIFBOR19JSERSOwotICAgICAgUE5HX0NPTlNUIFBOR19JREFUOwotICAgICAgUE5HX0NPTlNUIFBOR19JRU5EOwotICAgICAgUE5HX0NPTlNUIFBOR19QTFRFOwotI2lmIGRlZmluZWQoUE5HX1JFQURfYktHRF9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX2JLR0Q7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX2NIUk1fU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19jSFJNOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfZ0FNQTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfaElTVF9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX2hJU1Q7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19pQ0NQOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfaVRYdDsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfb0ZGc19TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX29GRnM7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3BDQUxfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19wQ0FMOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfcEhZczsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfc0JJVF9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX3NCSVQ7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NDQUxfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19zQ0FMOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zUExUX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfc1BMVDsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfc1JHQl9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX3NSR0I7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3RFWHRfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR190RVh0OwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF90SU1FX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfdElNRTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfdFJOU19TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX3RSTlM7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3pUWHRfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR196VFh0OwotI2VuZGlmCi0jZW5kaWYgLyogUE5HX1VTRV9MT0NBTF9BUlJBWVMgKi8KLSAgICAgIHBuZ191aW50XzMyIGxlbmd0aCA9IHBuZ19yZWFkX2NodW5rX2hlYWRlcihwbmdfcHRyKTsKLSAgICAgIFBOR19DT05TVCBwbmdfYnl0ZXAgY2h1bmtfbmFtZSA9IHBuZ19wdHItPmNodW5rX25hbWU7Ci0KLSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIGEgYmluYXJ5IHN1YmRpdmlzaW9uIHNlYXJjaCBvciBhIGhhc2ggZm9yCi0gICAgICAgKiBtYXRjaGluZyB0aGUgY2h1bmsgbmFtZSByYXRoZXIgdGhhbiBhIGxpbmVhciBzZWFyY2guCi0gICAgICAgKi8KLSAgICAgIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCi0gICAgICAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0FGVEVSX0lEQVQpCi0gICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9DSFVOS19BRlRFUl9JREFUOwotCi0gICAgICBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lIRFIsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lFTkQsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9JRU5EKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKHBuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfcHRyLCBjaHVua19uYW1lKSkKLSAgICAgIHsKLSAgICAgICAgIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCi0gICAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lEQVQ7Ci0gICAgICAgICBwbmdfaGFuZGxlX3Vua25vd24ocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0gICAgICAgICBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX1BMVEUsIDQpKQotICAgICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9QTFRFOwotICAgICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIElEQVQiKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJgotICAgICAgICAgICAgICAgICAgICAgIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkpCi0gICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgUExURSBiZWZvcmUgSURBVCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19QTFRFLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19JREFULCA0KSkKLSAgICAgIHsKLSAgICAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBJREFUIik7Ci0gICAgICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKLSAgICAgICAgICAgICAgICAgICEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIElEQVQiKTsKLQotICAgICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gbGVuZ3RoOwotICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9JREFUOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19iS0dELCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfY0hSTV9TVVBQT1JURUQpCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfY0hSTSwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX2dBTUFfU1VQUE9SVEVEKQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2dBTUEsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19oSVNULCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfb0ZGc19TVVBQT1JURUQpCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfb0ZGcywgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX29GRnMocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3BDQUxfU1VQUE9SVEVEKQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3BDQUwsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9wQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19zQ0FMLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfc0NBTChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfcEhZc19TVVBQT1JURUQpCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfcEhZcywgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3BIWXMocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NCSVRfU1VQUE9SVEVEKQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3NCSVQsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19zUkdCLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfaUNDUF9TVVBQT1JURUQpCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfaUNDUCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NQTFRfU1VQUE9SVEVEKQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3NQTFQsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9zUExUKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF90RVh0X1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ190RVh0LCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfdEVYdChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfdElNRV9TVVBQT1JURUQpCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfdElNRSwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3RJTUUocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3RSTlNfU1VQUE9SVEVEKQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3RSTlMsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV90Uk5TKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF96VFh0X1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ196VFh0LCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfelRYdChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfaVRYdF9TVVBQT1JURUQpCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfaVRYdCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX2lUWHQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSAgICAgIGVsc2UKLSAgICAgICAgIHBuZ19oYW5kbGVfdW5rbm93bihwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLwotCi0vKiBPcHRpb25hbCBjYWxsIHRvIHVwZGF0ZSB0aGUgdXNlcnMgaW5mb19wdHIgc3RydWN0dXJlICovCi12b2lkIFBOR0FQSQotcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcmVhZF91cGRhdGVfaW5mbyIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfUk9XX0lOSVQpKQotICAgICAgcG5nX3JlYWRfc3RhcnRfcm93KHBuZ19wdHIpOwotICAgZWxzZQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICJJZ25vcmluZyBleHRyYSBwbmdfcmVhZF91cGRhdGVfaW5mbygpIGNhbGw7IHJvdyBidWZmZXIgbm90IHJlYWxsb2NhdGVkIik7Ci0gICBwbmdfcmVhZF90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci19Ci0KLSNpZm5kZWYgUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKLS8qIEluaXRpYWxpemUgcGFsZXR0ZSwgYmFja2dyb3VuZCwgZXRjLCBhZnRlciB0cmFuc2Zvcm1hdGlvbnMKLSAqIGFyZSBzZXQsIGJ1dCBiZWZvcmUgYW55IHJlYWRpbmcgdGFrZXMgcGxhY2UuICBUaGlzIGFsbG93cwotICogdGhlIHVzZXIgdG8gb2J0YWluIGEgZ2FtbWEtY29ycmVjdGVkIHBhbGV0dGUsIGZvciBleGFtcGxlLgotICogSWYgdGhlIHVzZXIgZG9lc24ndCBjYWxsIHRoaXMsIHdlIHdpbGwgZG8gaXQgb3Vyc2VsdmVzLgotICovCi12b2lkIFBOR0FQSQotcG5nX3N0YXJ0X3JlYWRfaW1hZ2UocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3N0YXJ0X3JlYWRfaW1hZ2UiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1JPV19JTklUKSkKLSAgICAgIHBuZ19yZWFkX3N0YXJ0X3JvdyhwbmdfcHRyKTsKLX0KLSNlbmRpZiAvKiBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLwotCi0jaWZuZGVmIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3JlYWRfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCByb3csIHBuZ19ieXRlcCBkc3Bfcm93KQotewotI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCi0gICBQTkdfQ09OU1QgUE5HX0lEQVQ7Ci0gICBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX2RzcF9tYXNrWzddID0gezB4ZmYsIDB4MGYsIDB4ZmYsIDB4MzMsIDB4ZmYsIDB4NTUsCi0gICAgICAweGZmfTsKLSAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3NfbWFza1s3XSA9IHsweDgwLCAweDA4LCAweDg4LCAweDIyLCAweGFhLCAweDU1LCAweGZmfTsKLSNlbmRpZgotICAgaW50IHJldDsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfZGVidWcyKDEsICJpbiBwbmdfcmVhZF9yb3cgKHJvdyAlbHUsIHBhc3MgJWQpIiwKLSAgICAgIHBuZ19wdHItPnJvd19udW1iZXIsIHBuZ19wdHItPnBhc3MpOwotICAgaWYgKCEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19ST1dfSU5JVCkpCi0gICAgICBwbmdfcmVhZF9zdGFydF9yb3cocG5nX3B0cik7Ci0gICBpZiAocG5nX3B0ci0+cm93X251bWJlciA9PSAwICYmIHBuZ19wdHItPnBhc3MgPT0gMCkKLSAgIHsKLSAgIC8qIENoZWNrIGZvciB0cmFuc2Zvcm1zIHRoYXQgaGF2ZSBiZWVuIHNldCBidXQgd2VyZSBkZWZpbmVkIG91dCAqLwotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9NT05PKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQuIik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZC4iKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQuIik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9QQUNLX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0spCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfUEFDS19TVVBQT1JURUQgaXMgbm90IGRlZmluZWQuIik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU0hJRlQpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkLiIpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfQkdSX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkdSKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19SRUFEX0JHUl9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQuIik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9TV0FQX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NXQVBfQllURVMpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUE5HX1JFQURfU1dBUF9TVVBQT1JURUQgaXMgbm90IGRlZmluZWQuIik7Ci0jZW5kaWYKLSAgIH0KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEKQotICAgLyogSWYgaW50ZXJsYWNlZCBhbmQgd2UgZG8gbm90IG5lZWQgYSBuZXcgcm93LCBjb21iaW5lIHJvdyBhbmQgcmV0dXJuICovCi0gICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCAmJiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpCi0gICB7Ci0gICAgICBzd2l0Y2ggKHBuZ19wdHItPnBhc3MpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csCi0gICAgICAgICAgICAgICAgICAgICBwbmdfcGFzc19kc3BfbWFza1twbmdfcHRyLT5wYXNzXSk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDA3KSB8fCBwbmdfcHRyLT53aWR0aCA8IDUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csCi0gICAgICAgICAgICAgICAgICAgICBwbmdfcGFzc19kc3BfbWFza1twbmdfcHRyLT5wYXNzXSk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDA3KSAhPSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCAmJiAocG5nX3B0ci0+cm93X251bWJlciAmIDQpKQotICAgICAgICAgICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csCi0gICAgICAgICAgICAgICAgICAgICBwbmdfcGFzc19kc3BfbWFza1twbmdfcHRyLT5wYXNzXSk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAzKSB8fCBwbmdfcHRyLT53aWR0aCA8IDMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csCi0gICAgICAgICAgICAgICAgICAgICBwbmdfcGFzc19kc3BfbWFza1twbmdfcHRyLT5wYXNzXSk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAzKSAhPSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCAmJiAocG5nX3B0ci0+cm93X251bWJlciAmIDIpKQotICAgICAgICAgICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csCi0gICAgICAgICAgICAgICAgICAgICBwbmdfcGFzc19kc3BfbWFza1twbmdfcHRyLT5wYXNzXSk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAxKSB8fCBwbmdfcHRyLT53aWR0aCA8IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csCi0gICAgICAgICAgICAgICAgICAgICBwbmdfcGFzc19kc3BfbWFza1twbmdfcHRyLT5wYXNzXSk7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBpZiAoIShwbmdfcHRyLT5yb3dfbnVtYmVyICYgMSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfcmVhZF9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGF0dGVtcHQgdG8gcmVhZCByb3cgZGF0YSIpOwotCi0gICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+cm93X2J1ZjsKLSAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+aXJvd2J5dGVzOwotICAgZG8KLSAgIHsKLSAgICAgIGlmICghKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4pKQotICAgICAgewotICAgICAgICAgd2hpbGUgKCFwbmdfcHRyLT5pZGF0X3NpemUpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKTsKLQotICAgICAgICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gcG5nX3JlYWRfY2h1bmtfaGVhZGVyKHBuZ19wdHIpOwotICAgICAgICAgICAgaWYgKHBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgZW5vdWdoIGltYWdlIGRhdGEiKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7Ci0gICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBwbmdfcHRyLT56YnVmOwotICAgICAgICAgaWYgKHBuZ19wdHItPnpidWZfc2l6ZSA+IHBuZ19wdHItPmlkYXRfc2l6ZSkKLSAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAodUludClwbmdfcHRyLT5pZGF0X3NpemU7Ci0gICAgICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwKLSAgICAgICAgICAgIChwbmdfc2l6ZV90KXBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4pOwotICAgICAgICAgcG5nX3B0ci0+aWRhdF9zaXplIC09IHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW47Ci0gICAgICB9Ci0gICAgICByZXQgPSBpbmZsYXRlKCZwbmdfcHRyLT56c3RyZWFtLCBaX1BBUlRJQUxfRkxVU0gpOwotICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCi0gICAgICB7Ci0gICAgICAgICBpZiAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgfHwgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiB8fAotICAgICAgICAgICAgcG5nX3B0ci0+aWRhdF9zaXplKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2VkIGRhdGEiKTsKLSAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7Ci0gICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0ZJTklTSEVEOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgcG5nX3B0ci0+enN0cmVhbS5tc2cgPyBwbmdfcHRyLT56c3RyZWFtLm1zZyA6Ci0gICAgICAgICAgICAgICAgICAgIkRlY29tcHJlc3Npb24gZXJyb3IiKTsKLQotICAgfSB3aGlsZSAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpOwotCi0gICBwbmdfcHRyLT5yb3dfaW5mby5jb2xvcl90eXBlID0gcG5nX3B0ci0+Y29sb3JfdHlwZTsKLSAgIHBuZ19wdHItPnJvd19pbmZvLndpZHRoID0gcG5nX3B0ci0+aXdpZHRoOwotICAgcG5nX3B0ci0+cm93X2luZm8uY2hhbm5lbHMgPSBwbmdfcHRyLT5jaGFubmVsczsKLSAgIHBuZ19wdHItPnJvd19pbmZvLmJpdF9kZXB0aCA9IHBuZ19wdHItPmJpdF9kZXB0aDsKLSAgIHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoID0gcG5nX3B0ci0+cGl4ZWxfZGVwdGg7Ci0gICBwbmdfcHRyLT5yb3dfaW5mby5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCwKLSAgICAgICBwbmdfcHRyLT5yb3dfaW5mby53aWR0aCk7Ci0KLSAgIGlmIChwbmdfcHRyLT5yb3dfYnVmWzBdKQotICAgcG5nX3JlYWRfZmlsdGVyX3JvdyhwbmdfcHRyLCAmKHBuZ19wdHItPnJvd19pbmZvKSwKLSAgICAgIHBuZ19wdHItPnJvd19idWYgKyAxLCBwbmdfcHRyLT5wcmV2X3JvdyArIDEsCi0gICAgICAoaW50KShwbmdfcHRyLT5yb3dfYnVmWzBdKSk7Ci0KLSAgIHBuZ19tZW1jcHlfY2hlY2socG5nX3B0ciwgcG5nX3B0ci0+cHJldl9yb3csIHBuZ19wdHItPnJvd19idWYsCi0gICAgICBwbmdfcHRyLT5yb3dieXRlcyArIDEpOwotCi0jaWYgZGVmaW5lZChQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCkKLSAgIGlmICgocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19GSUxURVJfNjQpICYmCi0gICAgICAocG5nX3B0ci0+ZmlsdGVyX3R5cGUgPT0gUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKSkKLSAgIHsKLSAgICAgIC8qIEludHJhcGl4ZWwgZGlmZmVyZW5jaW5nICovCi0gICAgICBwbmdfZG9fcmVhZF9pbnRyYXBpeGVsKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0gICB9Ci0jZW5kaWYKLQotCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHx8IChwbmdfcHRyLT5mbGFncyZQTkdfRkxBR19TVFJJUF9BTFBIQSkpCi0gICAgICBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3B0cik7Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkKLSAgIC8qIEJsb3cgdXAgaW50ZXJsYWNlZCByb3dzIHRvIGZ1bGwgc2l6ZSAqLwotICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgJiYKLSAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5wYXNzIDwgNikKLSAgICAgICAgIC8qIE9sZCBpbnRlcmZhY2UgKHByZS0xLjAuOSk6Ci0gICAgICAgICAgKiBwbmdfZG9fcmVhZF9pbnRlcmxhY2UoJihwbmdfcHRyLT5yb3dfaW5mbyksCi0gICAgICAgICAgKiAgICBwbmdfcHRyLT5yb3dfYnVmICsgMSwgcG5nX3B0ci0+cGFzcywgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zKTsKLSAgICAgICAgICAqLwotICAgICAgICAgcG5nX2RvX3JlYWRfaW50ZXJsYWNlKHBuZ19wdHIpOwotCi0gICAgICBpZiAoZHNwX3JvdyAhPSBOVUxMKQotICAgICAgICAgcG5nX2NvbWJpbmVfcm93KHBuZ19wdHIsIGRzcF9yb3csCi0gICAgICAgICAgICBwbmdfcGFzc19kc3BfbWFza1twbmdfcHRyLT5wYXNzXSk7Ci0gICAgICBpZiAocm93ICE9IE5VTEwpCi0gICAgICAgICBwbmdfY29tYmluZV9yb3cocG5nX3B0ciwgcm93LAotICAgICAgICAgICAgcG5nX3Bhc3NfbWFza1twbmdfcHRyLT5wYXNzXSk7Ci0gICB9Ci0gICBlbHNlCi0jZW5kaWYKLSAgIHsKLSAgICAgIGlmIChyb3cgIT0gTlVMTCkKLSAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCByb3csIDB4ZmYpOwotICAgICAgaWYgKGRzcF9yb3cgIT0gTlVMTCkKLSAgICAgICAgIHBuZ19jb21iaW5lX3JvdyhwbmdfcHRyLCBkc3Bfcm93LCAweGZmKTsKLSAgIH0KLSAgIHBuZ19yZWFkX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0KLSAgIGlmIChwbmdfcHRyLT5yZWFkX3Jvd19mbiAhPSBOVUxMKQotICAgICAgKCoocG5nX3B0ci0+cmVhZF9yb3dfZm4pKShwbmdfcHRyLCBwbmdfcHRyLT5yb3dfbnVtYmVyLCBwbmdfcHRyLT5wYXNzKTsKLX0KLSNlbmRpZiAvKiBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLwotCi0jaWZuZGVmIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0vKiBSZWFkIG9uZSBvciBtb3JlIHJvd3Mgb2YgaW1hZ2UgZGF0YS4gIElmIHRoZSBpbWFnZSBpcyBpbnRlcmxhY2VkLAotICogYW5kIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgaGFzIGJlZW4gY2FsbGVkLCB0aGUgcm93cyBuZWVkIHRvCi0gKiBjb250YWluIHRoZSBjb250ZW50cyBvZiB0aGUgcm93cyBmcm9tIHRoZSBwcmV2aW91cyBwYXNzLiAgSWYgdGhlCi0gKiBpbWFnZSBoYXMgYWxwaGEgb3IgdHJhbnNwYXJlbmN5LCBhbmQgcG5nX2hhbmRsZV9hbHBoYSgpWypdIGhhcyBiZWVuCi0gKiBjYWxsZWQsIHRoZSByb3dzIGNvbnRlbnRzIG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZQotICogc2NyZWVuLgotICoKLSAqICJyb3ciIGhvbGRzIHRoZSBhY3R1YWwgaW1hZ2UsIGFuZCBwaXhlbHMgYXJlIHBsYWNlZCBpbiBpdAotICogYXMgdGhleSBhcnJpdmUuICBJZiB0aGUgaW1hZ2UgaXMgZGlzcGxheWVkIGFmdGVyIGVhY2ggcGFzcywgaXQgd2lsbAotICogYXBwZWFyIHRvICJzcGFya2xlIiBpbi4gICJkaXNwbGF5X3JvdyIgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhCi0gKiAiY2h1bmt5IiBwcm9ncmVzc2l2ZSBpbWFnZSwgd2l0aCBmaW5lciBkZXRhaWwgYWRkZWQgYXMgaXQgYmVjb21lcwotICogYXZhaWxhYmxlLiAgSWYgeW91IGRvIG5vdCB3YW50IHRoaXMgImNodW5reSIgZGlzcGxheSwgeW91IG1heSBwYXNzCi0gKiBOVUxMIGZvciBkaXNwbGF5X3Jvdy4gIElmIHlvdSBkbyBub3Qgd2FudCB0aGUgc3BhcmtsZSBkaXNwbGF5LCBhbmQKLSAqIHlvdSBoYXZlIG5vdCBjYWxsZWQgcG5nX2hhbmRsZV9hbHBoYSgpLCB5b3UgbWF5IHBhc3MgTlVMTCBmb3Igcm93cy4KLSAqIElmIHlvdSBoYXZlIGNhbGxlZCBwbmdfaGFuZGxlX2FscGhhKCksIGFuZCB0aGUgaW1hZ2UgaGFzIGVpdGhlciBhbgotICogYWxwaGEgY2hhbm5lbCBvciBhIHRyYW5zcGFyZW5jeSBjaHVuaywgeW91IG11c3QgcHJvdmlkZSBhIGJ1ZmZlciBmb3IKLSAqIHJvd3MuICBJbiB0aGlzIGNhc2UsIHlvdSBkbyBub3QgaGF2ZSB0byBwcm92aWRlIGEgZGlzcGxheV9yb3cgYnVmZmVyCi0gKiBhbHNvLCBidXQgeW91IG1heS4gIElmIHRoZSBpbWFnZSBpcyBub3QgaW50ZXJsYWNlZCwgb3IgaWYgeW91IGhhdmUKLSAqIG5vdCBjYWxsZWQgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSwgdGhlIGRpc3BsYXlfcm93IGJ1ZmZlciB3aWxsCi0gKiBiZSBpZ25vcmVkLCBzbyBwYXNzIE5VTEwgdG8gaXQuCi0gKgotICogWypdIHBuZ19oYW5kbGVfYWxwaGEoKSBkb2VzIG5vdCBleGlzdCB5ZXQsIGFzIG9mIHRoaXMgdmVyc2lvbiBvZiBsaWJwbmcKLSAqLwotCi12b2lkIFBOR0FQSQotcG5nX3JlYWRfcm93cyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXBwIHJvdywKLSAgIHBuZ19ieXRlcHAgZGlzcGxheV9yb3csIHBuZ191aW50XzMyIG51bV9yb3dzKQotewotICAgcG5nX3VpbnRfMzIgaTsKLSAgIHBuZ19ieXRlcHAgcnA7Ci0gICBwbmdfYnl0ZXBwIGRwOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX3Jvd3MiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBycCA9IHJvdzsKLSAgIGRwID0gZGlzcGxheV9yb3c7Ci0gICBpZiAocnAgIT0gTlVMTCAmJiBkcCAhPSBOVUxMKQotICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9yb3dzOyBpKyspCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgcnB0ciA9ICpycCsrOwotICAgICAgICAgcG5nX2J5dGVwIGRwdHIgPSAqZHArKzsKLQotICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHJwdHIsIGRwdHIpOwotICAgICAgfQotICAgZWxzZSBpZiAocnAgIT0gTlVMTCkKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcm93czsgaSsrKQotICAgICAgewotICAgICAgICAgcG5nX2J5dGVwIHJwdHIgPSAqcnA7Ci0gICAgICAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcnB0ciwgcG5nX2J5dGVwX05VTEwpOwotICAgICAgICAgcnArKzsKLSAgICAgIH0KLSAgIGVsc2UgaWYgKGRwICE9IE5VTEwpCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Jvd3M7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHBuZ19ieXRlcCBkcHRyID0gKmRwOwotICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHBuZ19ieXRlcF9OVUxMLCBkcHRyKTsKLSAgICAgICAgIGRwKys7Ci0gICAgICB9Ci19Ci0jZW5kaWYgLyogUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQgKi8KLQotI2lmbmRlZiBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAotLyogUmVhZCB0aGUgZW50aXJlIGltYWdlLiAgSWYgdGhlIGltYWdlIGhhcyBhbiBhbHBoYSBjaGFubmVsIG9yIGEgdFJOUwotICogY2h1bmssIGFuZCB5b3UgaGF2ZSBjYWxsZWQgcG5nX2hhbmRsZV9hbHBoYSgpWypdLCB5b3Ugd2lsbCBuZWVkIHRvCi0gKiBpbml0aWFsaXplIHRoZSBpbWFnZSB0byB0aGUgY3VycmVudCBpbWFnZSB0aGF0IFBORyB3aWxsIGJlIG92ZXJsYXlpbmcuCi0gKiBXZSBzZXQgdGhlIG51bV9yb3dzIGFnYWluIGhlcmUsIGluIGNhc2UgaXQgd2FzIGluY29ycmVjdGx5IHNldCBpbgotICogcG5nX3JlYWRfc3RhcnRfcm93KCkgYnkgYSBjYWxsIHRvIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgb3IKLSAqIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkgaWYgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSB3YXNuJ3QgY2FsbGVkCi0gKiBwcmlvciB0byBlaXRoZXIgb2YgdGhlc2UgZnVuY3Rpb25zIGxpa2UgaXQgc2hvdWxkIGhhdmUgYmVlbi4gIFlvdSBjYW4KLSAqIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UuICBJZiB5b3UgZGVzaXJlIHRvIGhhdmUgYW4gaW1hZ2UgZm9yCi0gKiBlYWNoIHBhc3Mgb2YgYSBpbnRlcmxhY2VkIGltYWdlLCB1c2UgcG5nX3JlYWRfcm93cygpIGluc3RlYWQuCi0gKgotICogWypdIHBuZ19oYW5kbGVfYWxwaGEoKSBkb2VzIG5vdCBleGlzdCB5ZXQsIGFzIG9mIHRoaXMgdmVyc2lvbiBvZiBsaWJwbmcKLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19yZWFkX2ltYWdlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcHAgaW1hZ2UpCi17Ci0gICBwbmdfdWludF8zMiBpLCBpbWFnZV9oZWlnaHQ7Ci0gICBpbnQgcGFzcywgajsKLSAgIHBuZ19ieXRlcHAgcnA7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfaW1hZ2UiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgIHBhc3MgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLSNlbHNlCi0gICBpZiAocG5nX3B0ci0+aW50ZXJsYWNlZCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAotICAgICAgICAiQ2Fubm90IHJlYWQgaW50ZXJsYWNlZCBpbWFnZSAtLSBpbnRlcmxhY2UgaGFuZGxlciBkaXNhYmxlZC4iKTsKLSAgIHBhc3MgPSAxOwotI2VuZGlmCi0KLQotICAgaW1hZ2VfaGVpZ2h0PXBuZ19wdHItPmhlaWdodDsKLSAgIHBuZ19wdHItPm51bV9yb3dzID0gaW1hZ2VfaGVpZ2h0OyAvKiBNYWtlIHN1cmUgdGhpcyBpcyBzZXQgY29ycmVjdGx5ICovCi0KLSAgIGZvciAoaiA9IDA7IGogPCBwYXNzOyBqKyspCi0gICB7Ci0gICAgICBycCA9IGltYWdlOwotICAgICAgZm9yIChpID0gMDsgaSA8IGltYWdlX2hlaWdodDsgaSsrKQotICAgICAgewotICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsICpycCwgcG5nX2J5dGVwX05VTEwpOwotICAgICAgICAgcnArKzsKLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLwotCi0jaWZuZGVmIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0vKiBSZWFkIHRoZSBlbmQgb2YgdGhlIFBORyBmaWxlLiAgV2lsbCBub3QgcmVhZCBwYXN0IHRoZSBlbmQgb2YgdGhlCi0gKiBmaWxlLCB3aWxsIHZlcmlmeSB0aGUgZW5kIGlzIGFjY3VyYXRlLCBhbmQgd2lsbCByZWFkIGFueSBjb21tZW50cwotICogb3IgdGltZSBpbmZvcm1hdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBpZiBpbmZvIGlzIG5vdCBOVUxMLgotICovCi12b2lkIFBOR0FQSQotcG5nX3JlYWRfZW5kKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfZW5kIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7IC8qIEZpbmlzaCBvZmYgQ1JDIGZyb20gbGFzdCBJREFUIGNodW5rICovCi0KLSAgIGRvCi0gICB7Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgICAgIFBOR19DT05TVCBQTkdfSUhEUjsKLSAgICAgIFBOR19DT05TVCBQTkdfSURBVDsKLSAgICAgIFBOR19DT05TVCBQTkdfSUVORDsKLSAgICAgIFBOR19DT05TVCBQTkdfUExURTsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX2JLR0RfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19iS0dEOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfY0hSTTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX2dBTUE7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX2hJU1RfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19oSVNUOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfaUNDUDsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfaVRYdF9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX2lUWHQ7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX29GRnNfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19vRkZzOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfcENBTDsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfcEhZc19TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX3BIWXM7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NCSVRfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19zQklUOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfc0NBTDsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfc1BMVF9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX3NQTFQ7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NSR0JfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR19zUkdCOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF90RVh0X1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfdEVYdDsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfdElNRV9TVVBQT1JURUQpCi0gICAgICBQTkdfQ09OU1QgUE5HX3RJTUU7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3RSTlNfU1VQUE9SVEVEKQotICAgICAgUE5HX0NPTlNUIFBOR190Uk5TOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF96VFh0X1NVUFBPUlRFRCkKLSAgICAgIFBOR19DT05TVCBQTkdfelRYdDsKLSNlbmRpZgotI2VuZGlmIC8qIFBOR19VU0VfTE9DQUxfQVJSQVlTICovCi0gICAgICBwbmdfdWludF8zMiBsZW5ndGggPSBwbmdfcmVhZF9jaHVua19oZWFkZXIocG5nX3B0cik7Ci0gICAgICBQTkdfQ09OU1QgcG5nX2J5dGVwIGNodW5rX25hbWUgPSBwbmdfcHRyLT5jaHVua19uYW1lOwotCi0gICAgICBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lIRFIsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lFTkQsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9JRU5EKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKHBuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfcHRyLCBjaHVua19uYW1lKSkKLSAgICAgIHsKLSAgICAgICAgIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfSURBVCwgNCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGxlbmd0aCA+IDApIHx8IChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVCkpCi0gICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlRvbyBtYW55IElEQVQncyBmb3VuZCIpOwotICAgICAgICAgfQotICAgICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotICAgICAgICAgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19QTFRFLCA0KSkKLSAgICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUExURTsKLSAgICAgIH0KLSNlbmRpZgotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICAgewotICAgICAgICAgLyogWmVybyBsZW5ndGggSURBVHMgYXJlIGxlZ2FsIGFmdGVyIHRoZSBsYXN0IElEQVQgaGFzIGJlZW4KLSAgICAgICAgICAqIHJlYWQsIGJ1dCBub3QgYWZ0ZXIgb3RoZXIgY2h1bmtzIGhhdmUgYmVlbiByZWFkLgotICAgICAgICAgICovCi0gICAgICAgICBpZiAoKGxlbmd0aCA+IDApIHx8IChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVCkpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlRvbyBtYW55IElEQVQncyBmb3VuZCIpOwotICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19QTFRFLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX2JLR0RfU1VQUE9SVEVEKQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2JLR0QsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19jSFJNLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQpCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfZ0FNQSwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX2hJU1RfU1VQUE9SVEVEKQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX2hJU1QsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19vRkZzLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfcENBTF9TVVBQT1JURUQpCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfcENBTCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3BDQUwocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NDQUxfU1VQUE9SVEVEKQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3NDQUwsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19wSFlzLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfc0JJVF9TVVBQT1JURUQpCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfc0JJVCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3NCSVQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NSR0JfU1VQUE9SVEVEKQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3NSR0IsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19pQ0NQLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfc1BMVF9TVVBQT1JURUQpCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfc1BMVCwgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3NQTFQocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3RFWHRfU1VQUE9SVEVEKQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3RFWHQsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV90RVh0KHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF90SU1FX1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ190SU1FLCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfdFJOU19TVVBQT1JURUQpCi0gICAgICBlbHNlIGlmICghcG5nX21lbWNtcChjaHVua19uYW1lLCBwbmdfdFJOUywgNCkpCi0gICAgICAgICBwbmdfaGFuZGxlX3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIGxlbmd0aCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3pUWHRfU1VQUE9SVEVEKQotICAgICAgZWxzZSBpZiAoIXBuZ19tZW1jbXAoY2h1bmtfbmFtZSwgcG5nX3pUWHQsIDQpKQotICAgICAgICAgcG5nX2hhbmRsZV96VFh0KHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRCkKLSAgICAgIGVsc2UgaWYgKCFwbmdfbWVtY21wKGNodW5rX25hbWUsIHBuZ19pVFh0LCA0KSkKLSAgICAgICAgIHBuZ19oYW5kbGVfaVRYdChwbmdfcHRyLCBpbmZvX3B0ciwgbGVuZ3RoKTsKLSNlbmRpZgotICAgICAgZWxzZQotICAgICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwotICAgfSB3aGlsZSAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUVORCkpOwotfQotI2VuZGlmIC8qIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEICovCi0KLS8qIEZyZWUgYWxsIG1lbW9yeSB1c2VkIGJ5IHRoZSByZWFkICovCi12b2lkIFBOR0FQSQotcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QocG5nX3N0cnVjdHBwIHBuZ19wdHJfcHRyLCBwbmdfaW5mb3BwIGluZm9fcHRyX3B0ciwKLSAgIHBuZ19pbmZvcHAgZW5kX2luZm9fcHRyX3B0cikKLXsKLSAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBOVUxMOwotICAgcG5nX2luZm9wIGluZm9fcHRyID0gTlVMTCwgZW5kX2luZm9fcHRyID0gTlVMTDsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfZnJlZV9wdHIgZnJlZV9mbiA9IE5VTEw7Ci0gICBwbmdfdm9pZHAgbWVtX3B0ciA9IE5VTEw7Ci0jZW5kaWYKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCIpOwotICAgaWYgKHBuZ19wdHJfcHRyICE9IE5VTEwpCi0gICAgICBwbmdfcHRyID0gKnBuZ19wdHJfcHRyOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIGZyZWVfZm4gPSBwbmdfcHRyLT5mcmVlX2ZuOwotICAgbWVtX3B0ciA9IHBuZ19wdHItPm1lbV9wdHI7Ci0jZW5kaWYKLQotICAgaWYgKGluZm9fcHRyX3B0ciAhPSBOVUxMKQotICAgICAgaW5mb19wdHIgPSAqaW5mb19wdHJfcHRyOwotCi0gICBpZiAoZW5kX2luZm9fcHRyX3B0ciAhPSBOVUxMKQotICAgICAgZW5kX2luZm9fcHRyID0gKmVuZF9pbmZvX3B0cl9wdHI7Ci0KLSAgIHBuZ19yZWFkX2Rlc3Ryb3kocG5nX3B0ciwgaW5mb19wdHIsIGVuZF9pbmZvX3B0cik7Ci0KLSAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQotICAgewotI2lmIGRlZmluZWQoUE5HX1RFWFRfU1VQUE9SVEVEKQotICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfVEVYVCwgLTEpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3RfMigocG5nX3ZvaWRwKWluZm9fcHRyLCAocG5nX2ZyZWVfcHRyKWZyZWVfZm4sCi0gICAgICAgICAgKHBuZ192b2lkcCltZW1fcHRyKTsKLSNlbHNlCi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QoKHBuZ192b2lkcClpbmZvX3B0cik7Ci0jZW5kaWYKLSAgICAgICppbmZvX3B0cl9wdHIgPSBOVUxMOwotICAgfQotCi0gICBpZiAoZW5kX2luZm9fcHRyICE9IE5VTEwpCi0gICB7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9URVhUX1NVUFBPUlRFRCkKLSAgICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgZW5kX2luZm9fcHRyLCBQTkdfRlJFRV9URVhULCAtMSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3RfMigocG5nX3ZvaWRwKWVuZF9pbmZvX3B0ciwgKHBuZ19mcmVlX3B0cilmcmVlX2ZuLAotICAgICAgICAgKHBuZ192b2lkcCltZW1fcHRyKTsKLSNlbHNlCi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QoKHBuZ192b2lkcCllbmRfaW5mb19wdHIpOwotI2VuZGlmCi0gICAgICAqZW5kX2luZm9fcHRyX3B0ciA9IE5VTEw7Ci0gICB9Ci0KLSAgIGlmIChwbmdfcHRyICE9IE5VTEwpCi0gICB7Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0XzIoKHBuZ192b2lkcClwbmdfcHRyLCAocG5nX2ZyZWVfcHRyKWZyZWVfZm4sCi0gICAgICAgICAgKHBuZ192b2lkcCltZW1fcHRyKTsKLSNlbHNlCi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QoKHBuZ192b2lkcClwbmdfcHRyKTsKLSNlbmRpZgotICAgICAgKnBuZ19wdHJfcHRyID0gTlVMTDsKLSAgIH0KLX0KLQotLyogRnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgdGhlIHJlYWQgKG9sZCBtZXRob2QpICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19yZWFkX2Rlc3Ryb3kocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfaW5mb3AgZW5kX2luZm9fcHRyKQotewotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICBqbXBfYnVmIHRtcF9qbXA7Ci0jZW5kaWYKLSAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm47Ci0gICBwbmdfZXJyb3JfcHRyIHdhcm5pbmdfZm47Ci0gICBwbmdfdm9pZHAgZXJyb3JfcHRyOwotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIHBuZ19mcmVlX3B0ciBmcmVlX2ZuOwotI2VuZGlmCi0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfZGVzdHJveSIpOwotICAgaWYgKGluZm9fcHRyICE9IE5VTEwpCi0gICAgICBwbmdfaW5mb19kZXN0cm95KHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgaWYgKGVuZF9pbmZvX3B0ciAhPSBOVUxMKQotICAgICAgcG5nX2luZm9fZGVzdHJveShwbmdfcHRyLCBlbmRfaW5mb19wdHIpOwotCi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT56YnVmKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmJpZ19yb3dfYnVmKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnByZXZfcm93KTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9ESVRIRVJfU1VQUE9SVEVEKQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cGFsZXR0ZV9sb29rdXApOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+ZGl0aGVyX2luZGV4KTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Z2FtbWFfdGFibGUpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hX2Zyb21fMSk7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV90b18xKTsKLSNlbmRpZgotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPmZyZWVfbWUgJiBQTkdfRlJFRV9QTFRFKQotICAgICAgcG5nX3pmcmVlKHBuZ19wdHIsIHBuZ19wdHItPnBhbGV0dGUpOwotICAgcG5nX3B0ci0+ZnJlZV9tZSAmPSB+UE5HX0ZSRUVfUExURTsKLSNlbHNlCi0gICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19GUkVFX1BMVEUpCi0gICAgICBwbmdfemZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cGFsZXR0ZSk7Ci0gICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfRlJFRV9QTFRFOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfdFJOU19TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0jaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+ZnJlZV9tZSAmIFBOR19GUkVFX1RSTlMpCi0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT50cmFucyk7Ci0gICBwbmdfcHRyLT5mcmVlX21lICY9IH5QTkdfRlJFRV9UUk5TOwotI2Vsc2UKLSAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0ZSRUVfVFJOUykKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnRyYW5zKTsKLSAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19GUkVFX1RSTlM7Ci0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfaElTVF9TVVBQT1JURUQpCi0jaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ci0+ZnJlZV9tZSAmIFBOR19GUkVFX0hJU1QpCi0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5oaXN0KTsKLSAgIHBuZ19wdHItPmZyZWVfbWUgJj0gflBOR19GUkVFX0hJU1Q7Ci0jZWxzZQotICAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfRlJFRV9ISVNUKQotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+aGlzdCk7Ci0gICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfRlJFRV9ISVNUOwotI2VuZGlmCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT5nYW1tYV8xNl90YWJsZSAhPSBOVUxMKQotICAgewotICAgICAgaW50IGk7Ci0gICAgICBpbnQgaXN0b3AgPSAoMSA8PCAoOCAtIHBuZ19wdHItPmdhbW1hX3NoaWZ0KSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlW2ldKTsKLSAgICAgIH0KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlKTsKLSAgIH0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSAhPSBOVUxMKQotICAgewotICAgICAgaW50IGk7Ci0gICAgICBpbnQgaXN0b3AgPSAoMSA8PCAoOCAtIHBuZ19wdHItPmdhbW1hX3NoaWZ0KSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMVtpXSk7Ci0gICAgICB9Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzEpOwotICAgfQotICAgaWYgKHBuZ19wdHItPmdhbW1hXzE2X3RvXzEgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGludCBpOwotICAgICAgaW50IGlzdG9wID0gKDEgPDwgKDggLSBwbmdfcHRyLT5nYW1tYV9zaGlmdCkpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyspCi0gICAgICB7Ci0gICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5nYW1tYV8xNl90b18xW2ldKTsKLSAgICAgIH0KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmdhbW1hXzE2X3RvXzEpOwotICAgfQotI2VuZGlmCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEKQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+dGltZV9idWZmZXIpOwotI2VuZGlmCi0KLSAgIGluZmxhdGVFbmQoJnBuZ19wdHItPnpzdHJlYW0pOwotI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRAotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+c2F2ZV9idWZmZXIpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKLSNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmN1cnJlbnRfdGV4dCk7Ci0jZW5kaWYgLyogUE5HX1RFWFRfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVEICovCi0KLSAgIC8qIFNhdmUgdGhlIGltcG9ydGFudCBpbmZvIG91dCBvZiB0aGUgcG5nX3N0cnVjdCwgaW4gY2FzZSBpdCBpcwotICAgICogYmVpbmcgdXNlZCBhZ2Fpbi4KLSAgICAqLwotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICBwbmdfbWVtY3B5KHRtcF9qbXAsIHBuZ19wdHItPmptcGJ1ZiwgcG5nX3NpemVvZihqbXBfYnVmKSk7Ci0jZW5kaWYKLQotICAgZXJyb3JfZm4gPSBwbmdfcHRyLT5lcnJvcl9mbjsKLSAgIHdhcm5pbmdfZm4gPSBwbmdfcHRyLT53YXJuaW5nX2ZuOwotICAgZXJyb3JfcHRyID0gcG5nX3B0ci0+ZXJyb3JfcHRyOwotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIGZyZWVfZm4gPSBwbmdfcHRyLT5mcmVlX2ZuOwotI2VuZGlmCi0KLSAgIHBuZ19tZW1zZXQocG5nX3B0ciwgMCwgcG5nX3NpemVvZihwbmdfc3RydWN0KSk7Ci0KLSAgIHBuZ19wdHItPmVycm9yX2ZuID0gZXJyb3JfZm47Ci0gICBwbmdfcHRyLT53YXJuaW5nX2ZuID0gd2FybmluZ19mbjsKLSAgIHBuZ19wdHItPmVycm9yX3B0ciA9IGVycm9yX3B0cjsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfcHRyLT5mcmVlX2ZuID0gZnJlZV9mbjsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSAgIHBuZ19tZW1jcHkocG5nX3B0ci0+am1wYnVmLCB0bXBfam1wLCBwbmdfc2l6ZW9mKGptcF9idWYpKTsKLSNlbmRpZgotCi19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3JlYWRfc3RhdHVzX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19yZWFkX3N0YXR1c19wdHIgcmVhZF9yb3dfZm4pCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+cmVhZF9yb3dfZm4gPSByZWFkX3Jvd19mbjsKLX0KLQotCi0jaWZuZGVmIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0jaWYgZGVmaW5lZChQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3JlYWRfcG5nKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc2Zvcm1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHAgcGFyYW1zKQotewotICAgaW50IHJvdzsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpCi0gICAvKiBJbnZlcnQgdGhlIGFscGhhIGNoYW5uZWwgZnJvbSBvcGFjaXR5IHRvIHRyYW5zcGFyZW5jeQotICAgICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBKQotICAgICAgIHBuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19wdHIpOwotI2VuZGlmCi0KLSAgIC8qIHBuZ19yZWFkX2luZm8oKSBnaXZlcyB1cyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlCi0gICAgKiBQTkcgZmlsZSBiZWZvcmUgdGhlIGZpcnN0IElEQVQgKGltYWdlIGRhdGEgY2h1bmspLgotICAgICovCi0gICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgIGlmIChpbmZvX3B0ci0+aGVpZ2h0ID4gUE5HX1VJTlRfMzJfTUFYL3BuZ19zaXplb2YocG5nX2J5dGVwKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW1hZ2UgaXMgdG9vIGhpZ2ggdG8gcHJvY2VzcyB3aXRoIHBuZ19yZWFkX3BuZygpIik7Ci0KLSAgIC8qIC0tLS0tLS0tLS0tLS0tIGltYWdlIHRyYW5zZm9ybWF0aW9ucyBzdGFydCBoZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfMTZfVE9fOF9TVVBQT1JURUQpCi0gICAvKiBUZWxsIGxpYnBuZyB0byBzdHJpcCAxNiBiaXQvY29sb3IgZmlsZXMgZG93biB0byA4IGJpdHMgcGVyIGNvbG9yLgotICAgICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYpCi0gICAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRCkKLSAgIC8qIFN0cmlwIGFscGhhIGJ5dGVzIGZyb20gdGhlIGlucHV0IGRhdGEgd2l0aG91dCBjb21iaW5pbmcgd2l0aAotICAgICogdGhlIGJhY2tncm91bmQgKG5vdCByZWNvbW1lbmRlZCkuCi0gICAgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TVFJJUF9BTFBIQSkKLSAgICAgIHBuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3B0cik7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpCi0gICAvKiBFeHRyYWN0IG11bHRpcGxlIHBpeGVscyB3aXRoIGJpdCBkZXB0aHMgb2YgMSwgMiwgb3IgNCBmcm9tIGEgc2luZ2xlCi0gICAgKiBieXRlIGludG8gc2VwYXJhdGUgYnl0ZXMgKHVzZWZ1bCBmb3IgcGFsZXR0ZWQgYW5kIGdyYXlzY2FsZSBpbWFnZXMpLgotICAgICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fUEFDS0lORykKLSAgICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpCi0gICAvKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIHBhY2tlZCBwaXhlbHMgdG8gbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0Ci0gICAgKiAobm90IHVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIHBuZ19zZXRfcGFja2luZykuCi0gICAgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCkKLSAgICAgIHBuZ19zZXRfcGFja3N3YXAocG5nX3B0cik7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCkKLSAgIC8qIEV4cGFuZCBwYWxldHRlZCBjb2xvcnMgaW50byB0cnVlIFJHQiB0cmlwbGV0cwotICAgICogRXhwYW5kIGdyYXlzY2FsZSBpbWFnZXMgdG8gZnVsbCA4IGJpdHMgZnJvbSAxLCAyLCBvciA0IGJpdHMvcGl4ZWwKLSAgICAqIEV4cGFuZCBwYWxldHRlZCBvciBSR0IgaW1hZ2VzIHdpdGggdHJhbnNwYXJlbmN5IHRvIGZ1bGwgYWxwaGEKLSAgICAqIGNoYW5uZWxzIHNvIHRoZSBkYXRhIHdpbGwgYmUgYXZhaWxhYmxlIGFzIFJHQkEgcXVhcnRldHMuCi0gICAgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9FWFBBTkQpCi0gICAgICBpZiAoKHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpIHx8Ci0gICAgICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgfHwKLSAgICAgICAgICAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fdFJOUykpKQotICAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0jZW5kaWYKLQotICAgLyogV2UgZG9uJ3QgaGFuZGxlIGJhY2tncm91bmQgY29sb3Igb3IgZ2FtbWEgdHJhbnNmb3JtYXRpb24gb3IgZGl0aGVyaW5nLgotICAgICovCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9TVVBQT1JURUQpCi0gICAvKiBJbnZlcnQgbW9ub2Nocm9tZSBmaWxlcyB0byBoYXZlIDAgYXMgd2hpdGUgYW5kIDEgYXMgYmxhY2sKLSAgICAqLwotICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PKQotICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQpCi0gICAvKiBJZiB5b3Ugd2FudCB0byBzaGlmdCB0aGUgcGl4ZWwgdmFsdWVzIGZyb20gdGhlIHJhbmdlIFswLDI1NV0gb3IKLSAgICAqIFswLDY1NTM1XSB0byB0aGUgb3JpZ2luYWwgWzAsN10gb3IgWzAsMzFdLCBvciB3aGF0ZXZlciByYW5nZSB0aGUKLSAgICAqIGNvbG9ycyB3ZXJlIG9yaWdpbmFsbHkgaW46Ci0gICAgKi8KLSAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU0hJRlQpCi0gICAgICAgJiYgcG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fc0JJVCkpCi0gICB7Ci0gICAgICBwbmdfY29sb3JfOHAgc2lnX2JpdDsKLQotICAgICAgcG5nX2dldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCk7Ci0gICAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsIHNpZ19iaXQpOwotICAgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpCi0gICAvKiBGbGlwIHRoZSBSR0IgcGl4ZWxzIHRvIEJHUiAob3IgUkdCQSB0byBCR1JBKQotICAgICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fQkdSKQotICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQpCi0gICAvKiBTd2FwIHRoZSBSR0JBIG9yIEdBIGRhdGEgdG8gQVJHQiBvciBBRyAob3IgQkdSQSB0byBBQkdSKQotICAgICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSkKLSAgICAgICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3B0cik7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpCi0gICAvKiBTd2FwIGJ5dGVzIG9mIDE2IGJpdCBmaWxlcyB0byBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0Ci0gICAgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TV0FQX0VORElBTikKLSAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKLSNlbmRpZgotCi0gICAvKiBXZSBkb24ndCBoYW5kbGUgYWRkaW5nIGZpbGxlciBieXRlcyAqLwotCi0gICAvKiBPcHRpb25hbCBjYWxsIHRvIGdhbW1hIGNvcnJlY3QgYW5kIGFkZCB0aGUgYmFja2dyb3VuZCB0byB0aGUgcGFsZXR0ZQotICAgICogYW5kIHVwZGF0ZSBpbmZvIHN0cnVjdHVyZS4gIFJFUVVJUkVEIGlmIHlvdSBhcmUgZXhwZWN0aW5nIGxpYnBuZyB0bwotICAgICogdXBkYXRlIHRoZSBwYWxldHRlIGZvciB5b3UgKGkuZS4sIHlvdSBzZWxlY3RlZCBzdWNoIGEgdHJhbnNmb3JtIGFib3ZlKS4KLSAgICAqLwotICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAvKiAtLS0tLS0tLS0tLS0tLSBpbWFnZSB0cmFuc2Zvcm1hdGlvbnMgZW5kIGhlcmUgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECi0gICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9ST1dTLCAwKTsKLSNlbmRpZgotICAgaWYgKGluZm9fcHRyLT5yb3dfcG9pbnRlcnMgPT0gTlVMTCkKLSAgIHsKLSAgICAgIGluZm9fcHRyLT5yb3dfcG9pbnRlcnMgPSAocG5nX2J5dGVwcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICBpbmZvX3B0ci0+aGVpZ2h0ICogcG5nX3NpemVvZihwbmdfYnl0ZXApKTsKLSAgICAgIHBuZ19tZW1zZXQoaW5mb19wdHItPnJvd19wb2ludGVycywgMCwgaW5mb19wdHItPmhlaWdodAotICAgICAgICAgKiBwbmdfc2l6ZW9mKHBuZ19ieXRlcCkpOwotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfUk9XUzsKLSNlbmRpZgotICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCAoaW50KWluZm9fcHRyLT5oZWlnaHQ7IHJvdysrKQotICAgICAgICAgaW5mb19wdHItPnJvd19wb2ludGVyc1tyb3ddID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgICBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKSk7Ci0gICB9Ci0KLSAgIHBuZ19yZWFkX2ltYWdlKHBuZ19wdHIsIGluZm9fcHRyLT5yb3dfcG9pbnRlcnMpOwotICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX0lEQVQ7Ci0KLSAgIC8qIFJlYWQgcmVzdCBvZiBmaWxlLCBhbmQgZ2V0IGFkZGl0aW9uYWwgY2h1bmtzIGluIGluZm9fcHRyIC0gUkVRVUlSRUQgKi8KLSAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgIHRyYW5zZm9ybXMgPSB0cmFuc2Zvcm1zOyAvKiBRdWlldCBjb21waWxlciB3YXJuaW5ncyAqLwotICAgcGFyYW1zID0gcGFyYW1zOwotCi19Ci0jZW5kaWYgLyogUE5HX0lORk9fSU1BR0VfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQgKi8KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3BuZ3Jpby5jIGIvbGlicy9saWJwbmcvcG5ncmlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOGU2YTcuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5ncmlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotCi0vKiBwbmdyaW8uYyAtIGZ1bmN0aW9ucyBmb3IgZGF0YSBpbnB1dAotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS4yLjM3IFtKdW5lIDQsIDIwMDldCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCi0gKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCi0gKgotICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgbG9jYXRpb24gZm9yIGFsbCBpbnB1dC4gIFVzZXJzIHdobyBuZWVkCi0gKiBzcGVjaWFsIGhhbmRsaW5nIGFyZSBleHBlY3RlZCB0byB3cml0ZSBhIGZ1bmN0aW9uIHRoYXQgaGFzIHRoZSBzYW1lCi0gKiBhcmd1bWVudHMgYXMgdGhpcyBhbmQgcGVyZm9ybXMgYSBzaW1pbGFyIGZ1bmN0aW9uLCBidXQgdGhhdCBwb3NzaWJseQotICogaGFzIGEgZGlmZmVyZW50IGlucHV0IG1ldGhvZC4gIE5vdGUgdGhhdCB5b3Ugc2hvdWxkbid0IGNoYW5nZSB0aGlzCi0gKiBmdW5jdGlvbiwgYnV0IHJhdGhlciB3cml0ZSBhIHJlcGxhY2VtZW50IGZ1bmN0aW9uIGFuZCB0aGVuIG1ha2UKLSAqIGxpYnBuZyB1c2UgaXQgYXQgcnVuIHRpbWUgd2l0aCBwbmdfc2V0X3JlYWRfZm4oLi4uKS4KLSAqLwotCi0jZGVmaW5lIFBOR19JTlRFUk5BTAotI2luY2x1ZGUgInBuZy5oIgotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKQotCi0vKiBSZWFkIHRoZSBkYXRhIGZyb20gd2hhdGV2ZXIgaW5wdXQgeW91IGFyZSB1c2luZy4gIFRoZSBkZWZhdWx0IHJvdXRpbmUKLSAqIHJlYWRzIGZyb20gYSBmaWxlIHBvaW50ZXIuICBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIHNvbWV0aW1lcyBnZXRzIGNhbGxlZAotICogd2l0aCB2ZXJ5IHNtYWxsIGxlbmd0aHMsIHNvIHlvdSBzaG91bGQgaW1wbGVtZW50IHNvbWUga2luZCBvZiBzaW1wbGUKLSAqIGJ1ZmZlcmluZyBpZiB5b3UgYXJlIHVzaW5nIHVuYnVmZmVyZWQgcmVhZHMuICBUaGlzIHNob3VsZCBuZXZlciBiZSBhc2tlZAotICogdG8gcmVhZCBtb3JlIHRoZW4gNjRLIG9uIGEgMTYgYml0IG1hY2hpbmUuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0gICBwbmdfZGVidWcxKDQsICJyZWFkaW5nICVkIGJ5dGVzIiwgKGludClsZW5ndGgpOwotICAgaWYgKHBuZ19wdHItPnJlYWRfZGF0YV9mbiAhPSBOVUxMKQotICAgICAgKCoocG5nX3B0ci0+cmVhZF9kYXRhX2ZuKSkocG5nX3B0ciwgZGF0YSwgbGVuZ3RoKTsKLSAgIGVsc2UKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiQ2FsbCB0byBOVUxMIHJlYWQgZnVuY3Rpb24iKTsKLX0KLQotI2lmICFkZWZpbmVkKFBOR19OT19TVERJTykKLS8qIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHJlYWRpbmcgb2YgZGF0YS4gIElmIHlvdSBhcmUKLSAqIG5vdCByZWFkaW5nIGZyb20gYSBzdGFuZGFyZCBDIHN0cmVhbSwgeW91IHNob3VsZCBjcmVhdGUgYSByZXBsYWNlbWVudAotICogcmVhZF9kYXRhIGZ1bmN0aW9uIGFuZCB1c2UgaXQgYXQgcnVuIHRpbWUgd2l0aCBwbmdfc2V0X3JlYWRfZm4oKSwgcmF0aGVyCi0gKiB0aGFuIGNoYW5naW5nIHRoZSBsaWJyYXJ5LgotICovCi0jaWZuZGVmIFVTRV9GQVJfS0VZV09SRAotdm9pZCBQTkdBUEkKLXBuZ19kZWZhdWx0X3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0gICBwbmdfc2l6ZV90IGNoZWNrOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgLyogZnJlYWQoKSByZXR1cm5zIDAgb24gZXJyb3IsIHNvIGl0IGlzIE9LIHRvIHN0b3JlIHRoaXMgaW4gYSBwbmdfc2l6ZV90Ci0gICAgKiBpbnN0ZWFkIG9mIGFuIGludCwgd2hpY2ggaXMgd2hhdCBmcmVhZCgpIGFjdHVhbGx5IHJldHVybnMuCi0gICAgKi8KLSNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICBpZiAoICFSZWFkRmlsZSgoSEFORExFKShwbmdfcHRyLT5pb19wdHIpLCBkYXRhLCBsZW5ndGgsICZjaGVjaywgTlVMTCkgKQotICAgICAgY2hlY2sgPSAwOwotI2Vsc2UKLSAgIGNoZWNrID0gKHBuZ19zaXplX3QpZnJlYWQoZGF0YSwgKHBuZ19zaXplX3QpMSwgbGVuZ3RoLAotICAgICAgKHBuZ19GSUxFX3ApcG5nX3B0ci0+aW9fcHRyKTsKLSNlbmRpZgotCi0gICBpZiAoY2hlY2sgIT0gbGVuZ3RoKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJSZWFkIEVycm9yIik7Ci19Ci0jZWxzZQotLyogVGhpcyBpcyB0aGUgbW9kZWwtaW5kZXBlbmRlbnQgdmVyc2lvbi4gU2luY2UgdGhlIHN0YW5kYXJkIEkvTyBsaWJyYXJ5Ci0gICBjYW4ndCBoYW5kbGUgZmFyIGJ1ZmZlcnMgaW4gdGhlIG1lZGl1bSBhbmQgc21hbGwgbW9kZWxzLCB3ZSBoYXZlIHRvIGNvcHkKLSAgIHRoZSBkYXRhLgotKi8KLQotI2RlZmluZSBORUFSX0JVRl9TSVpFIDEwMjQKLSNkZWZpbmUgTUlOKGEsYikgKGEgPD0gYiA/IGEgOiBiKQotCi1zdGF0aWMgdm9pZCBQTkdBUEkKLXBuZ19kZWZhdWx0X3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0gICBpbnQgY2hlY2s7Ci0gICBwbmdfYnl0ZSAqbl9kYXRhOwotICAgcG5nX0ZJTEVfcCBpb19wdHI7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICAvKiBDaGVjayBpZiBkYXRhIHJlYWxseSBpcyBuZWFyLiBJZiBzbywgdXNlIHVzdWFsIGNvZGUuICovCi0gICBuX2RhdGEgPSAocG5nX2J5dGUgKilDVlRfUFRSX05PQ0hFQ0soZGF0YSk7Ci0gICBpb19wdHIgPSAocG5nX0ZJTEVfcClDVlRfUFRSKHBuZ19wdHItPmlvX3B0cik7Ci0gICBpZiAoKHBuZ19ieXRlcCluX2RhdGEgPT0gZGF0YSkKLSAgIHsKLSNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICAgICBpZiAoICFSZWFkRmlsZSgoSEFORExFKShwbmdfcHRyLT5pb19wdHIpLCBkYXRhLCBsZW5ndGgsICZjaGVjaywgTlVMTCkgKQotICAgICAgICAgY2hlY2sgPSAwOwotI2Vsc2UKLSAgICAgIGNoZWNrID0gZnJlYWQobl9kYXRhLCAxLCBsZW5ndGgsIGlvX3B0cik7Ci0jZW5kaWYKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHBuZ19ieXRlIGJ1ZltORUFSX0JVRl9TSVpFXTsKLSAgICAgIHBuZ19zaXplX3QgcmVhZCwgcmVtYWluaW5nLCBlcnI7Ci0gICAgICBjaGVjayA9IDA7Ci0gICAgICByZW1haW5pbmcgPSBsZW5ndGg7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICAgcmVhZCA9IE1JTihORUFSX0JVRl9TSVpFLCByZW1haW5pbmcpOwotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKLSAgICAgICAgIGlmICggIVJlYWRGaWxlKChIQU5ETEUpKGlvX3B0ciksIGJ1ZiwgcmVhZCwgJmVyciwgTlVMTCkgKQotICAgICAgICAgICAgZXJyID0gMDsKLSNlbHNlCi0gICAgICAgICBlcnIgPSBmcmVhZChidWYsIChwbmdfc2l6ZV90KTEsIHJlYWQsIGlvX3B0cik7Ci0jZW5kaWYKLSAgICAgICAgIHBuZ19tZW1jcHkoZGF0YSwgYnVmLCByZWFkKTsgLyogY29weSBmYXIgYnVmZmVyIHRvIG5lYXIgYnVmZmVyICovCi0gICAgICAgICBpZiAoZXJyICE9IHJlYWQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNoZWNrICs9IGVycjsKLSAgICAgICAgIGRhdGEgKz0gcmVhZDsKLSAgICAgICAgIHJlbWFpbmluZyAtPSByZWFkOwotICAgICAgfQotICAgICAgd2hpbGUgKHJlbWFpbmluZyAhPSAwKTsKLSAgIH0KLSAgIGlmICgocG5nX3VpbnRfMzIpY2hlY2sgIT0gKHBuZ191aW50XzMyKWxlbmd0aCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicmVhZCBFcnJvciIpOwotfQotI2VuZGlmCi0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHN1cHBseSBhIG5ldyBpbnB1dCBmdW5jdGlvbgotICogZm9yIGxpYnBuZyBpZiBzdGFuZGFyZCBDIHN0cmVhbXMgYXJlbid0IGJlaW5nIHVzZWQuCi0gKgotICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBpdHMgYXJndW1lbnRzOgotICogcG5nX3B0ciAgICAgIC0gcG9pbnRlciB0byBhIHBuZyBpbnB1dCBkYXRhIHN0cnVjdHVyZQotICogaW9fcHRyICAgICAgIC0gcG9pbnRlciB0byB1c2VyIHN1cHBsaWVkIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm8gYWJvdXQKLSAqICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBmdW5jdGlvbnMuICBNYXkgYmUgTlVMTC4KLSAqIHJlYWRfZGF0YV9mbiAtIHBvaW50ZXIgdG8gYSBuZXcgaW5wdXQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhcyBpdHMKLSAqICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBhIHBvaW50ZXIgdG8gYSBwbmdfc3RydWN0LCBhIHBvaW50ZXIgdG8KLSAqICAgICAgICAgICAgICAgIGEgbG9jYXRpb24gd2hlcmUgaW5wdXQgZGF0YSBjYW4gYmUgc3RvcmVkLCBhbmQgYSAzMi1iaXQKLSAqICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0aGF0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KLSAqICAgICAgICAgICAgICAgIFRvIGV4aXQgYW5kIG91dHB1dCBhbnkgZmF0YWwgZXJyb3IgbWVzc2FnZXMgdGhlIG5ldyB3cml0ZQotICogICAgICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGNhbGwgcG5nX2Vycm9yKHBuZ19wdHIsICJFcnJvciBtc2ciKS4KLSAqICAgICAgICAgICAgICAgIE1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGxpYnBuZydzIGRlZmF1bHQgZnVuY3Rpb24gd2lsbAotICogICAgICAgICAgICAgICAgYmUgdXNlZC4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfcmVhZF9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgaW9fcHRyLAotICAgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4pCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+aW9fcHRyID0gaW9fcHRyOwotCi0jaWYgIWRlZmluZWQoUE5HX05PX1NURElPKQotICAgaWYgKHJlYWRfZGF0YV9mbiAhPSBOVUxMKQotICAgICAgcG5nX3B0ci0+cmVhZF9kYXRhX2ZuID0gcmVhZF9kYXRhX2ZuOwotICAgZWxzZQotICAgICAgcG5nX3B0ci0+cmVhZF9kYXRhX2ZuID0gcG5nX2RlZmF1bHRfcmVhZF9kYXRhOwotI2Vsc2UKLSAgIHBuZ19wdHItPnJlYWRfZGF0YV9mbiA9IHJlYWRfZGF0YV9mbjsKLSNlbmRpZgotCi0gICAvKiBJdCBpcyBhbiBlcnJvciB0byB3cml0ZSB0byBhIHJlYWQgZGV2aWNlICovCi0gICBpZiAocG5nX3B0ci0+d3JpdGVfZGF0YV9mbiAhPSBOVUxMKQotICAgewotICAgICAgcG5nX3B0ci0+d3JpdGVfZGF0YV9mbiA9IE5VTEw7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgIkl0J3MgYW4gZXJyb3IgdG8gc2V0IGJvdGggcmVhZF9kYXRhX2ZuIGFuZCB3cml0ZV9kYXRhX2ZuIGluIHRoZSAiKTsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAic2FtZSBzdHJ1Y3R1cmUuICBSZXNldHRpbmcgd3JpdGVfZGF0YV9mbiB0byBOVUxMLiIpOwotICAgfQotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEKQotICAgcG5nX3B0ci0+b3V0cHV0X2ZsdXNoX2ZuID0gTlVMTDsKLSNlbmRpZgotfQotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcG5ncnRyYW4uYyBiL2xpYnMvbGlicG5nL3BuZ3J0cmFuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzk2ZGYuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5ncnRyYW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQzODIgKzAsMCBAQAotCi0vKiBwbmdydHJhbi5jIC0gdHJhbnNmb3JtcyB0aGUgZGF0YSBpbiBhIHJvdyBmb3IgUE5HIHJlYWRlcnMKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuMi4zNyBbSnVuZSA0LCAyMDA5XQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgb3B0aW9uYWxseSBjYWxsZWQgYnkgYW4gYXBwbGljYXRpb24KLSAqIGluIG9yZGVyIHRvIHRlbGwgbGlicG5nIGhvdyB0byBoYW5kbGUgZGF0YSB3aGVuIHJlYWRpbmcgYSBQTkcuCi0gKiBUcmFuc2Zvcm1hdGlvbnMgdGhhdCBhcmUgdXNlZCBpbiBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcgYXJlCi0gKiBpbiBwbmd0cmFucy5jLgotICovCi0KLSNkZWZpbmUgUE5HX0lOVEVSTkFMCi0jaW5jbHVkZSAicG5nLmgiCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpCi0KLS8qIFNldCB0aGUgYWN0aW9uIG9uIGdldHRpbmcgYSBDUkMgZXJyb3IgZm9yIGFuIGFuY2lsbGFyeSBvciBjcml0aWNhbCBjaHVuay4gKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2NyY19hY3Rpb24ocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IGNyaXRfYWN0aW9uLCBpbnQgYW5jaWxfYWN0aW9uKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2NyY19hY3Rpb24iKTsKLSAgIC8qIFRlbGwgbGlicG5nIGhvdyB3ZSByZWFjdCB0byBDUkMgZXJyb3JzIGluIGNyaXRpY2FsIGNodW5rcyAqLwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHN3aXRjaCAoY3JpdF9hY3Rpb24pCi0gICB7Ci0gICAgICBjYXNlIFBOR19DUkNfTk9fQ0hBTkdFOiAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlYXZlIHNldHRpbmcgYXMgaXMgKi8KLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19DUkNfV0FSTl9VU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhcm4vdXNlIGRhdGEgKi8KLSAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19DUkNfQ1JJVElDQUxfTUFTSzsKLSAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0NSQ19DUklUSUNBTF9VU0U7Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQTkdfQ1JDX1FVSUVUX1VTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFF1aWV0L3VzZSBkYXRhICovCi0gICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX01BU0s7Ci0gICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19DUkNfQ1JJVElDQUxfVVNFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0NSQ19DUklUSUNBTF9JR05PUkU7Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQTkdfQ1JDX1dBUk5fRElTQ0FSRDogICAgLyogTm90IGEgdmFsaWQgYWN0aW9uIGZvciBjcml0aWNhbCBkYXRhICovCi0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAgIkNhbid0IGRpc2NhcmQgY3JpdGljYWwgZGF0YSBvbiBDUkMgZXJyb3IuIik7Ci0gICAgICBjYXNlIFBOR19DUkNfRVJST1JfUVVJVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yL3F1aXQgKi8KLQotICAgICAgY2FzZSBQTkdfQ1JDX0RFRkFVTFQ6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLOwotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIHN3aXRjaCAoYW5jaWxfYWN0aW9uKQotICAgewotICAgICAgY2FzZSBQTkdfQ1JDX05PX0NIQU5HRTogICAgICAgICAgICAgICAgICAgICAgIC8qIExlYXZlIHNldHRpbmcgYXMgaXMgKi8KLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19DUkNfV0FSTl9VU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2Fybi91c2UgZGF0YSAqLwotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSzsKLSAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUE5HX0NSQ19RVUlFVF9VU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFF1aWV0L3VzZSBkYXRhICovCi0gICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLOwotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk47Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQTkdfQ1JDX0VSUk9SX1FVSVQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yL3F1aXQgKi8KLSAgICAgICAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0s7Ci0gICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTjsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19DUkNfV0FSTl9ESVNDQVJEOiAgICAgICAgICAgICAgICAgICAgICAvKiBXYXJuL2Rpc2NhcmQgZGF0YSAqLwotCi0gICAgICBjYXNlIFBOR19DUkNfREVGQVVMVDoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLOwotICAgICAgICAgYnJlYWs7Ci0gICB9Ci19Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSAmJiBcCi0gICAgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotLyogSGFuZGxlIGFscGhhIGFuZCB0Uk5TIHZpYSBhIGJhY2tncm91bmQgY29sb3IgKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2JhY2tncm91bmQocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZF9jb2xvciwgaW50IGJhY2tncm91bmRfZ2FtbWFfY29kZSwKLSAgIGludCBuZWVkX2V4cGFuZCwgZG91YmxlIGJhY2tncm91bmRfZ2FtbWEpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfYmFja2dyb3VuZCIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmIChiYWNrZ3JvdW5kX2dhbW1hX2NvZGUgPT0gUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5LTk9XTikKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJBcHBsaWNhdGlvbiBtdXN0IHN1cHBseSBhIGtub3duIGJhY2tncm91bmQgZ2FtbWEiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19CQUNLR1JPVU5EOwotICAgcG5nX21lbWNweSgmKHBuZ19wdHItPmJhY2tncm91bmQpLCBiYWNrZ3JvdW5kX2NvbG9yLAotICAgICAgcG5nX3NpemVvZihwbmdfY29sb3JfMTYpKTsKLSAgIHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWEgPSAoZmxvYXQpYmFja2dyb3VuZF9nYW1tYTsKLSAgIHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZF9nYW1tYV9jb2RlKTsKLSAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSAobmVlZF9leHBhbmQgPyBQTkdfQkFDS0dST1VORF9FWFBBTkQgOiAwKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRCkKLS8qIFN0cmlwIDE2IGJpdCBkZXB0aCBmaWxlcyB0byA4IGJpdCBkZXB0aCAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc3RyaXBfMTYocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9zdHJpcF8xNiIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfMTZfVE9fODsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF9zdHJpcF9hbHBoYShwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3N0cmlwX2FscGhhIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfU1RSSVBfQUxQSEE7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRCkKLS8qIERpdGhlciBmaWxlIHRvIDggYml0LiAgU3VwcGx5IGEgcGFsZXR0ZSwgdGhlIGN1cnJlbnQgbnVtYmVyCi0gKiBvZiBlbGVtZW50cyBpbiB0aGUgcGFsZXR0ZSwgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiBhbGxvd2VkLCBhbmQgYSBoaXN0b2dyYW0gaWYgcG9zc2libGUuICBJZiB0aGUgY3VycmVudCBudW1iZXIKLSAqIG9mIGNvbG9ycyBpcyBncmVhdGVyIHRoZW4gdGhlIG1heGltdW0gbnVtYmVyLCB0aGUgcGFsZXR0ZSB3aWxsIGJlCi0gKiBtb2RpZmllZCB0byBmaXQgaW4gdGhlIG1heGltdW0gbnVtYmVyLiAgImZ1bGxfZGl0aGVyIiBpbmRpY2F0ZXMKLSAqIHdoZXRoZXIgd2UgbmVlZCBhIGRpdGhlcmluZyBjdWJlIHNldCB1cCBmb3IgUkdCIGltYWdlcywgb3IgaWYgd2UKLSAqIHNpbXBseSBhcmUgcmVkdWNpbmcgdGhlIG51bWJlciBvZiBjb2xvcnMgaW4gYSBwYWxldHRlZCBpbWFnZS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBwbmdfZHNvcnRfc3RydWN0Ci17Ci0gICBzdHJ1Y3QgcG5nX2Rzb3J0X3N0cnVjdCBGQVIgKiBuZXh0OwotICAgcG5nX2J5dGUgbGVmdDsKLSAgIHBuZ19ieXRlIHJpZ2h0OwotfSBwbmdfZHNvcnQ7Ci10eXBlZGVmIHBuZ19kc29ydCBGQVIgKiAgICAgICBwbmdfZHNvcnRwOwotdHlwZWRlZiBwbmdfZHNvcnQgRkFSICogRkFSICogcG5nX2Rzb3J0cHA7Ci0KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2RpdGhlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29sb3JwIHBhbGV0dGUsCi0gICBpbnQgbnVtX3BhbGV0dGUsIGludCBtYXhpbXVtX2NvbG9ycywgcG5nX3VpbnRfMTZwIGhpc3RvZ3JhbSwKLSAgIGludCBmdWxsX2RpdGhlcikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9kaXRoZXIiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0RJVEhFUjsKLQotICAgaWYgKCFmdWxsX2RpdGhlcikKLSAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBwbmdfcHRyLT5kaXRoZXJfaW5kZXggPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgIChwbmdfdWludF8zMikobnVtX3BhbGV0dGUgKiBwbmdfc2l6ZW9mKHBuZ19ieXRlKSkpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCi0gICAgICAgICBwbmdfcHRyLT5kaXRoZXJfaW5kZXhbaV0gPSAocG5nX2J5dGUpaTsKLSAgIH0KLQotICAgaWYgKG51bV9wYWxldHRlID4gbWF4aW11bV9jb2xvcnMpCi0gICB7Ci0gICAgICBpZiAoaGlzdG9ncmFtICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGlzIGVhc3kgZW5vdWdoLCBqdXN0IHRocm93IG91dCB0aGUgbGVhc3QgdXNlZCBjb2xvcnMuCi0gICAgICAgICAgKiBQZXJoYXBzIG5vdCB0aGUgYmVzdCBzb2x1dGlvbiwgYnV0IGdvb2QgZW5vdWdoLgotICAgICAgICAgICovCi0KLSAgICAgICAgIGludCBpOwotCi0gICAgICAgICAvKiBJbml0aWFsaXplIGFuIGFycmF5IHRvIHNvcnQgY29sb3JzICovCi0gICAgICAgICBwbmdfcHRyLT5kaXRoZXJfc29ydCA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgKHBuZ191aW50XzMyKShudW1fcGFsZXR0ZSAqIHBuZ19zaXplb2YocG5nX2J5dGUpKSk7Ci0KLSAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGRpdGhlcl9zb3J0IGFycmF5ICovCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykKLSAgICAgICAgICAgIHBuZ19wdHItPmRpdGhlcl9zb3J0W2ldID0gKHBuZ19ieXRlKWk7Ci0KLSAgICAgICAgIC8qIEZpbmQgdGhlIGxlYXN0IHVzZWQgcGFsZXR0ZSBlbnRyaWVzIGJ5IHN0YXJ0aW5nIGEKLSAgICAgICAgICAqIGJ1YmJsZSBzb3J0LCBhbmQgcnVubmluZyBpdCB1bnRpbCB3ZSBoYXZlIHNvcnRlZAotICAgICAgICAgICogb3V0IGVub3VnaCBjb2xvcnMuICBOb3RlIHRoYXQgd2UgZG9uJ3QgY2FyZSBhYm91dAotICAgICAgICAgICogc29ydGluZyBhbGwgdGhlIGNvbG9ycywganVzdCBmaW5kaW5nIHdoaWNoIGFyZQotICAgICAgICAgICogbGVhc3QgdXNlZC4KLSAgICAgICAgICAqLwotCi0gICAgICAgICBmb3IgKGkgPSBudW1fcGFsZXR0ZSAtIDE7IGkgPj0gbWF4aW11bV9jb2xvcnM7IGktLSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBkb25lOyAvKiBUbyBzdG9wIGVhcmx5IGlmIHRoZSBsaXN0IGlzIHByZS1zb3J0ZWQgKi8KLSAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICBkb25lID0gMTsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoaGlzdG9ncmFtW3BuZ19wdHItPmRpdGhlcl9zb3J0W2pdXQotICAgICAgICAgICAgICAgICAgIDwgaGlzdG9ncmFtW3BuZ19wdHItPmRpdGhlcl9zb3J0W2ogKyAxXV0pCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfYnl0ZSB0OwotCi0gICAgICAgICAgICAgICAgICB0ID0gcG5nX3B0ci0+ZGl0aGVyX3NvcnRbal07Ci0gICAgICAgICAgICAgICAgICBwbmdfcHRyLT5kaXRoZXJfc29ydFtqXSA9IHBuZ19wdHItPmRpdGhlcl9zb3J0W2ogKyAxXTsKLSAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmRpdGhlcl9zb3J0W2ogKyAxXSA9IHQ7Ci0gICAgICAgICAgICAgICAgICBkb25lID0gMDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkb25lKQotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIC8qIFN3YXAgdGhlIHBhbGV0dGUgYXJvdW5kLCBhbmQgc2V0IHVwIGEgdGFibGUsIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICAgaWYgKGZ1bGxfZGl0aGVyKQotICAgICAgICAgewotICAgICAgICAgICAgaW50IGogPSBudW1fcGFsZXR0ZTsKLQotICAgICAgICAgICAgLyogUHV0IGFsbCB0aGUgdXNlZnVsIGNvbG9ycyB3aXRoaW4gdGhlIG1heCwgYnV0IGRvbid0Ci0gICAgICAgICAgICAgKiBtb3ZlIHRoZSBvdGhlcnMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhpbXVtX2NvbG9yczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+ZGl0aGVyX3NvcnRbaV0gPj0gbWF4aW11bV9jb2xvcnMpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgai0tOwotICAgICAgICAgICAgICAgICAgd2hpbGUgKChpbnQpcG5nX3B0ci0+ZGl0aGVyX3NvcnRbal0gPj0gbWF4aW11bV9jb2xvcnMpOwotICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IHBhbGV0dGVbal07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaiA9IG51bV9wYWxldHRlOwotCi0gICAgICAgICAgICAvKiBNb3ZlIGFsbCB0aGUgdXNlZCBjb2xvcnMgaW5zaWRlIHRoZSBtYXggbGltaXQsIGFuZAotICAgICAgICAgICAgICogZGV2ZWxvcCBhIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4aW11bV9jb2xvcnM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIE9ubHkgbW92ZSB0aGUgY29sb3JzIHdlIG5lZWQgdG8gKi8KLSAgICAgICAgICAgICAgIGlmICgoaW50KXBuZ19wdHItPmRpdGhlcl9zb3J0W2ldID49IG1heGltdW1fY29sb3JzKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX2NvbG9yIHRtcF9jb2xvcjsKLQotICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgIGotLTsKLSAgICAgICAgICAgICAgICAgIHdoaWxlICgoaW50KXBuZ19wdHItPmRpdGhlcl9zb3J0W2pdID49IG1heGltdW1fY29sb3JzKTsKLQotICAgICAgICAgICAgICAgICAgdG1wX2NvbG9yID0gcGFsZXR0ZVtqXTsKLSAgICAgICAgICAgICAgICAgIHBhbGV0dGVbal0gPSBwYWxldHRlW2ldOwotICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IHRtcF9jb2xvcjsKLSAgICAgICAgICAgICAgICAgIC8qIEluZGljYXRlIHdoZXJlIHRoZSBjb2xvciB3ZW50ICovCi0gICAgICAgICAgICAgICAgICBwbmdfcHRyLT5kaXRoZXJfaW5kZXhbal0gPSAocG5nX2J5dGUpaTsKLSAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmRpdGhlcl9pbmRleFtpXSA9IChwbmdfYnl0ZSlqOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBGaW5kIGNsb3Nlc3QgY29sb3IgZm9yIHRob3NlIGNvbG9ycyB3ZSBhcmUgbm90IHVzaW5nICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmICgoaW50KXBuZ19wdHItPmRpdGhlcl9pbmRleFtpXSA+PSBtYXhpbXVtX2NvbG9ycykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGludCBtaW5fZCwgaywgbWluX2ssIGRfaW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgIC8qIEZpbmQgdGhlIGNsb3Nlc3QgY29sb3IgdG8gb25lIHdlIHRocmV3IG91dCAqLwotICAgICAgICAgICAgICAgICAgZF9pbmRleCA9IHBuZ19wdHItPmRpdGhlcl9pbmRleFtpXTsKLSAgICAgICAgICAgICAgICAgIG1pbl9kID0gUE5HX0NPTE9SX0RJU1QocGFsZXR0ZVtkX2luZGV4XSwgcGFsZXR0ZVswXSk7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGsgPSAxLCBtaW5fayA9IDA7IGsgPCBtYXhpbXVtX2NvbG9yczsgaysrKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaW50IGQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGQgPSBQTkdfQ09MT1JfRElTVChwYWxldHRlW2RfaW5kZXhdLCBwYWxldHRlW2tdKTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCBtaW5fZCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9kID0gZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9rID0gazsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIC8qIFBvaW50IHRvIGNsb3Nlc3QgY29sb3IgKi8KLSAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmRpdGhlcl9pbmRleFtpXSA9IChwbmdfYnl0ZSltaW5fazsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmRpdGhlcl9zb3J0KTsKLSAgICAgICAgIHBuZ19wdHItPmRpdGhlcl9zb3J0ID0gTlVMTDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoaXMgaXMgbXVjaCBoYXJkZXIgdG8gZG8gc2ltcGx5IChhbmQgcXVpY2tseSkuICBQZXJoYXBzCi0gICAgICAgICAgKiB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggYSBtZWRpYW4gY3V0IHJvdXRpbmUsIGJ1dCB0aG9zZQotICAgICAgICAgICogZG9uJ3QgYWx3YXlzIGJlaGF2ZSB0aGVtc2VsdmVzIHdpdGggb25seSBhIGZldyBjb2xvcnMKLSAgICAgICAgICAqIGFzIGlucHV0LiAgU28gd2Ugd2lsbCBqdXN0IGZpbmQgdGhlIGNsb3Nlc3QgdHdvIGNvbG9ycywKLSAgICAgICAgICAqIGFuZCB0aHJvdyBvdXQgb25lIG9mIHRoZW0gKGNob3NlbiBzb21ld2hhdCByYW5kb21seSkuCi0gICAgICAgICAgKiBbV2UgZG9uJ3QgdW5kZXJzdGFuZCB0aGlzIGF0IGFsbCwgc28gaWYgc29tZW9uZSB3YW50cyB0bwotICAgICAgICAgICogIHdvcmsgb24gaW1wcm92aW5nIGl0LCBiZSBvdXIgZ3Vlc3QgLSBBRUQsIEdSUF0KLSAgICAgICAgICAqLwotICAgICAgICAgaW50IGk7Ci0gICAgICAgICBpbnQgbWF4X2Q7Ci0gICAgICAgICBpbnQgbnVtX25ld19wYWxldHRlOwotICAgICAgICAgcG5nX2Rzb3J0cCB0OwotICAgICAgICAgcG5nX2Rzb3J0cHAgaGFzaDsKLQotICAgICAgICAgdCA9IE5VTEw7Ci0KLSAgICAgICAgIC8qIEluaXRpYWxpemUgcGFsZXR0ZSBpbmRleCBhcnJheXMgKi8KLSAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGUgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgIChwbmdfdWludF8zMikobnVtX3BhbGV0dGUgKiBwbmdfc2l6ZW9mKHBuZ19ieXRlKSkpOwotICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleCA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgKHBuZ191aW50XzMyKShudW1fcGFsZXR0ZSAqIHBuZ19zaXplb2YocG5nX2J5dGUpKSk7Ci0KLSAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHNvcnQgYXJyYXkgKi8KLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtpXSA9IChwbmdfYnl0ZSlpOwotICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleFtpXSA9IChwbmdfYnl0ZSlpOwotICAgICAgICAgfQotCi0gICAgICAgICBoYXNoID0gKHBuZ19kc29ydHBwKXBuZ19tYWxsb2MocG5nX3B0ciwgKHBuZ191aW50XzMyKSg3NjkgKgotICAgICAgICAgICAgcG5nX3NpemVvZihwbmdfZHNvcnRwKSkpOwotICAgICAgICAgcG5nX21lbXNldChoYXNoLCAwLCA3NjkgKiBwbmdfc2l6ZW9mKHBuZ19kc29ydHApKTsKLQotICAgICAgICAgbnVtX25ld19wYWxldHRlID0gbnVtX3BhbGV0dGU7Ci0KLSAgICAgICAgIC8qIEluaXRpYWwgd2lsZCBndWVzcyBhdCBob3cgZmFyIGFwYXJ0IHRoZSBmYXJ0aGVzdCBwaXhlbAotICAgICAgICAgICogcGFpciB3ZSB3aWxsIGJlIGVsaW1pbmF0aW5nIHdpbGwgYmUuICBMYXJnZXIKLSAgICAgICAgICAqIG51bWJlcnMgbWVhbiBtb3JlIGFyZWFzIHdpbGwgYmUgYWxsb2NhdGVkLCBTbWFsbGVyCi0gICAgICAgICAgKiBudW1iZXJzIHJ1biB0aGUgcmlzayBvZiBub3Qgc2F2aW5nIGVub3VnaCBkYXRhLCBhbmQKLSAgICAgICAgICAqIGhhdmluZyB0byBkbyB0aGlzIGFsbCBvdmVyIGFnYWluLgotICAgICAgICAgICoKLSAgICAgICAgICAqIEkgaGF2ZSBub3QgZG9uZSBleHRlbnNpdmUgY2hlY2tpbmcgb24gdGhpcyBudW1iZXIuCi0gICAgICAgICAgKi8KLSAgICAgICAgIG1heF9kID0gOTY7Ci0KLSAgICAgICAgIHdoaWxlIChudW1fbmV3X3BhbGV0dGUgPiBtYXhpbXVtX2NvbG9ycykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbmV3X3BhbGV0dGUgLSAxOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnQgajsKLQotICAgICAgICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBudW1fbmV3X3BhbGV0dGU7IGorKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGludCBkOwotCi0gICAgICAgICAgICAgICAgICBkID0gUE5HX0NPTE9SX0RJU1QocGFsZXR0ZVtpXSwgcGFsZXR0ZVtqXSk7Ci0KLSAgICAgICAgICAgICAgICAgIGlmIChkIDw9IG1heF9kKQotICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICB0ID0gKHBuZ19kc29ydHApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHBuZ191aW50XzMyKShwbmdfc2l6ZW9mKHBuZ19kc29ydCkpKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmICh0ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICB0LT5uZXh0ID0gaGFzaFtkXTsKLSAgICAgICAgICAgICAgICAgICAgIHQtPmxlZnQgPSAocG5nX2J5dGUpaTsKLSAgICAgICAgICAgICAgICAgICAgIHQtPnJpZ2h0ID0gKHBuZ19ieXRlKWo7Ci0gICAgICAgICAgICAgICAgICAgICBoYXNoW2RdID0gdDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGlmICh0ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHQgIT0gTlVMTCkKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbWF4X2Q7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChoYXNoW2ldICE9IE5VTEwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfZHNvcnRwIHA7Ci0KLSAgICAgICAgICAgICAgICAgIGZvciAocCA9IGhhc2hbaV07IHA7IHAgPSBwLT5uZXh0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtwLT5sZWZ0XQotICAgICAgICAgICAgICAgICAgICAgICAgPCBudW1fbmV3X3BhbGV0dGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtwLT5yaWdodF0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwgbnVtX25ld19wYWxldHRlKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGosIG5leHRfajsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bV9uZXdfcGFsZXR0ZSAmIDB4MDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gcC0+bGVmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfaiA9IHAtPnJpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IHAtPnJpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9qID0gcC0+bGVmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgbnVtX25ld19wYWxldHRlLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlW3BuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbal1dCi0gICAgICAgICAgICAgICAgICAgICAgICAgID0gcGFsZXR0ZVtudW1fbmV3X3BhbGV0dGVdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmdWxsX2RpdGhlcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX3BhbGV0dGU7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbmdfcHRyLT5kaXRoZXJfaW5kZXhba10gPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbal0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5kaXRoZXJfaW5kZXhba10gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtuZXh0X2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+ZGl0aGVyX2luZGV4W2tdID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fbmV3X3BhbGV0dGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5kaXRoZXJfaW5kZXhba10gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+aW5kZXhfdG9fcGFsZXR0ZVtwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBbbnVtX25ld19wYWxldHRlXV0gPSBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleFtwbmdfcHRyLT5pbmRleF90b19wYWxldHRlW2pdXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4W251bV9uZXdfcGFsZXR0ZV07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGVbal0gPSAocG5nX2J5dGUpbnVtX25ld19wYWxldHRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleFtudW1fbmV3X3BhbGV0dGVdID0gKHBuZ19ieXRlKWo7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBpZiAobnVtX25ld19wYWxldHRlIDw9IG1heGltdW1fY29sb3JzKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAobnVtX25ld19wYWxldHRlIDw9IG1heGltdW1fY29sb3JzKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3Njk7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChoYXNoW2ldICE9IE5VTEwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfZHNvcnRwIHAgPSBoYXNoW2ldOwotICAgICAgICAgICAgICAgICAgd2hpbGUgKHApCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICB0ID0gcC0+bmV4dDsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHApOwotICAgICAgICAgICAgICAgICAgICAgcCA9IHQ7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBoYXNoW2ldID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1heF9kICs9IDk2OwotICAgICAgICAgfQotICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgaGFzaCk7Ci0gICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5wYWxldHRlX3RvX2luZGV4KTsKLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmluZGV4X3RvX3BhbGV0dGUpOwotICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV90b19pbmRleCA9IE5VTEw7Ci0gICAgICAgICBwbmdfcHRyLT5pbmRleF90b19wYWxldHRlID0gTlVMTDsKLSAgICAgIH0KLSAgICAgIG51bV9wYWxldHRlID0gbWF4aW11bV9jb2xvcnM7Ci0gICB9Ci0gICBpZiAocG5nX3B0ci0+cGFsZXR0ZSA9PSBOVUxMKQotICAgewotICAgICAgcG5nX3B0ci0+cGFsZXR0ZSA9IHBhbGV0dGU7Ci0gICB9Ci0gICBwbmdfcHRyLT5udW1fcGFsZXR0ZSA9IChwbmdfdWludF8xNiludW1fcGFsZXR0ZTsKLQotICAgaWYgKGZ1bGxfZGl0aGVyKQotICAgewotICAgICAgaW50IGk7Ci0gICAgICBwbmdfYnl0ZXAgZGlzdGFuY2U7Ci0gICAgICBpbnQgdG90YWxfYml0cyA9IFBOR19ESVRIRVJfUkVEX0JJVFMgKyBQTkdfRElUSEVSX0dSRUVOX0JJVFMgKwotICAgICAgICAgUE5HX0RJVEhFUl9CTFVFX0JJVFM7Ci0gICAgICBpbnQgbnVtX3JlZCA9ICgxIDw8IFBOR19ESVRIRVJfUkVEX0JJVFMpOwotICAgICAgaW50IG51bV9ncmVlbiA9ICgxIDw8IFBOR19ESVRIRVJfR1JFRU5fQklUUyk7Ci0gICAgICBpbnQgbnVtX2JsdWUgPSAoMSA8PCBQTkdfRElUSEVSX0JMVUVfQklUUyk7Ci0gICAgICBwbmdfc2l6ZV90IG51bV9lbnRyaWVzID0gKChwbmdfc2l6ZV90KTEgPDwgdG90YWxfYml0cyk7Ci0gICAgICBwbmdfcHRyLT5wYWxldHRlX2xvb2t1cCA9IChwbmdfYnl0ZXAgKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgIChwbmdfdWludF8zMikobnVtX2VudHJpZXMgKiBwbmdfc2l6ZW9mKHBuZ19ieXRlKSkpOwotICAgICAgcG5nX21lbXNldChwbmdfcHRyLT5wYWxldHRlX2xvb2t1cCwgMCwgbnVtX2VudHJpZXMgKgotICAgICAgICAgcG5nX3NpemVvZihwbmdfYnl0ZSkpOwotCi0gICAgICBkaXN0YW5jZSA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLCAocG5nX3VpbnRfMzIpKG51bV9lbnRyaWVzICoKLSAgICAgICAgIHBuZ19zaXplb2YocG5nX2J5dGUpKSk7Ci0KLSAgICAgIHBuZ19tZW1zZXQoZGlzdGFuY2UsIDB4ZmYsIG51bV9lbnRyaWVzICogcG5nX3NpemVvZihwbmdfYnl0ZSkpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIGludCBpciwgaWcsIGliOwotICAgICAgICAgaW50IHIgPSAocGFsZXR0ZVtpXS5yZWQgPj4gKDggLSBQTkdfRElUSEVSX1JFRF9CSVRTKSk7Ci0gICAgICAgICBpbnQgZyA9IChwYWxldHRlW2ldLmdyZWVuID4+ICg4IC0gUE5HX0RJVEhFUl9HUkVFTl9CSVRTKSk7Ci0gICAgICAgICBpbnQgYiA9IChwYWxldHRlW2ldLmJsdWUgPj4gKDggLSBQTkdfRElUSEVSX0JMVUVfQklUUykpOwotCi0gICAgICAgICBmb3IgKGlyID0gMDsgaXIgPCBudW1fcmVkOyBpcisrKQotICAgICAgICAgewotICAgICAgICAgICAgLyogaW50IGRyID0gYWJzKGlyIC0gcik7ICovCi0gICAgICAgICAgICBpbnQgZHIgPSAoKGlyID4gcikgPyBpciAtIHIgOiByIC0gaXIpOwotICAgICAgICAgICAgaW50IGluZGV4X3IgPSAoaXIgPDwgKFBOR19ESVRIRVJfQkxVRV9CSVRTICsgUE5HX0RJVEhFUl9HUkVFTl9CSVRTKSk7Ci0KLSAgICAgICAgICAgIGZvciAoaWcgPSAwOyBpZyA8IG51bV9ncmVlbjsgaWcrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIGludCBkZyA9IGFicyhpZyAtIGcpOyAqLwotICAgICAgICAgICAgICAgaW50IGRnID0gKChpZyA+IGcpID8gaWcgLSBnIDogZyAtIGlnKTsKLSAgICAgICAgICAgICAgIGludCBkdCA9IGRyICsgZGc7Ci0gICAgICAgICAgICAgICBpbnQgZG0gPSAoKGRyID4gZGcpID8gZHIgOiBkZyk7Ci0gICAgICAgICAgICAgICBpbnQgaW5kZXhfZyA9IGluZGV4X3IgfCAoaWcgPDwgUE5HX0RJVEhFUl9CTFVFX0JJVFMpOwotCi0gICAgICAgICAgICAgICBmb3IgKGliID0gMDsgaWIgPCBudW1fYmx1ZTsgaWIrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGludCBkX2luZGV4ID0gaW5kZXhfZyB8IGliOwotICAgICAgICAgICAgICAgICAgLyogaW50IGRiID0gYWJzKGliIC0gYik7ICovCi0gICAgICAgICAgICAgICAgICBpbnQgZGIgPSAoKGliID4gYikgPyBpYiAtIGIgOiBiIC0gaWIpOwotICAgICAgICAgICAgICAgICAgaW50IGRtYXggPSAoKGRtID4gZGIpID8gZG0gOiBkYik7Ci0gICAgICAgICAgICAgICAgICBpbnQgZCA9IGRtYXggKyBkdCArIGRiOwotCi0gICAgICAgICAgICAgICAgICBpZiAoZCA8IChpbnQpZGlzdGFuY2VbZF9pbmRleF0pCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZVtkX2luZGV4XSA9IChwbmdfYnl0ZSlkOwotICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZV9sb29rdXBbZF9pbmRleF0gPSAocG5nX2J5dGUpaTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgZGlzdGFuY2UpOwotICAgfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotLyogVHJhbnNmb3JtIHRoZSBpbWFnZSBmcm9tIHRoZSBmaWxlX2dhbW1hIHRvIHRoZSBzY3JlZW5fZ2FtbWEuICBXZQotICogb25seSBkbyB0cmFuc2Zvcm1hdGlvbnMgb24gaW1hZ2VzIHdoZXJlIHRoZSBmaWxlX2dhbW1hIGFuZCBzY3JlZW5fZ2FtbWEKLSAqIGFyZSBub3QgY2xvc2UgcmVjaXByb2NhbHMsIG90aGVyd2lzZSBpdCBzbG93cyB0aGluZ3MgZG93biBzbGlnaHRseSwgYW5kCi0gKiBhbHNvIG5lZWRsZXNzbHkgaW50cm9kdWNlcyBzbWFsbCBlcnJvcnMuCi0gKgotICogV2Ugd2lsbCB0dXJuIG9mZiBnYW1tYSB0cmFuc2Zvcm1hdGlvbiBsYXRlciBpZiBubyBzZW1pdHJhbnNwYXJlbnQgZW50cmllcwotICogYXJlIHByZXNlbnQgaW4gdGhlIHRSTlMgYXJyYXkgZm9yIHBhbGV0dGUgaW1hZ2VzLiAgV2UgY2FuJ3QgZG8gaXQgaGVyZQotICogYmVjYXVzZSB3ZSBkb24ndCBuZWNlc3NhcmlseSBoYXZlIHRoZSB0Uk5TIGNodW5rIHlldC4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfZ2FtbWEocG5nX3N0cnVjdHAgcG5nX3B0ciwgZG91YmxlIHNjcm5fZ2FtbWEsIGRvdWJsZSBmaWxlX2dhbW1hKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2dhbW1hIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKChmYWJzKHNjcm5fZ2FtbWEgKiBmaWxlX2dhbW1hIC0gMS4wKSA+IFBOR19HQU1NQV9USFJFU0hPTEQpIHx8Ci0gICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgfHwKLSAgICAgICAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSkKLSAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19HQU1NQTsKLSAgIHBuZ19wdHItPmdhbW1hID0gKGZsb2F0KWZpbGVfZ2FtbWE7Ci0gICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPSAoZmxvYXQpc2Nybl9nYW1tYTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKQotLyogRXhwYW5kIHBhbGV0dGVkIGltYWdlcyB0byBSR0IsIGV4cGFuZCBncmF5c2NhbGUgaW1hZ2VzIG9mCi0gKiBsZXNzIHRoYW4gOC1iaXQgZGVwdGggdG8gOC1iaXQgZGVwdGgsIGFuZCBleHBhbmQgdFJOUyBjaHVua3MKLSAqIHRvIGFscGhhIGNoYW5uZWxzLgotICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9leHBhbmQocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9leHBhbmQiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gKFBOR19FWFBBTkQgfCBQTkdfRVhQQU5EX3RSTlMpOwotICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX1JPV19JTklUOwotfQotCi0vKiBHUlIgMTk5OTA2Mjc6ICB0aGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBjdXJyZW50bHkgYXJlIGlkZW50aWNhbAotICogIHRvIHBuZ19zZXRfZXhwYW5kKCkuICBIb3dldmVyLCBpdCBpcyBlbnRpcmVseSByZWFzb25hYmxlIHRoYXQgc29tZW9uZQotICogIG1pZ2h0IHdpc2ggdG8gZXhwYW5kIGFuIGluZGV4ZWQgaW1hZ2UgdG8gUkdCIGJ1dCAqbm90KiBleHBhbmQgYSBzaW5nbGUsCi0gKiAgZnVsbHkgdHJhbnNwYXJlbnQgcGFsZXR0ZSBlbnRyeSB0byBhIGZ1bGwgYWxwaGEgY2hhbm5lbC0tcGVyaGFwcyBpbnN0ZWFkCi0gKiAgY29udmVydCB0Uk5TIHRvIHRoZSBncmF5c2NhbGUvUkdCIGZvcm1hdCAoMTYtYml0IFJHQiB2YWx1ZSksIG9yIHJlcGxhY2UKLSAqICB0aGUgdHJhbnNwYXJlbnQgY29sb3Igd2l0aCBhIHBhcnRpY3VsYXIgUkdCIHZhbHVlLCBvciBkcm9wIHRSTlMgZW50aXJlbHkuCi0gKiAgSU9XLCBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG1heSBtYWtlIHRoZSB0cmFuc2Zvcm1hdGlvbnMgZmxhZwotICogIGEgYml0IG1vcmUgZmluZS1ncmFpbmVkLCB3aXRoIHNlcGFyYXRlIGJpdHMgZm9yIGVhY2ggb2YgdGhlc2UgdGhyZWUKLSAqICBmdW5jdGlvbnMuCi0gKgotICogIE1vcmUgdG8gdGhlIHBvaW50LCB0aGVzZSBmdW5jdGlvbnMgbWFrZSBpdCBvYnZpb3VzIHdoYXQgbGlicG5nIHdpbGwgYmUKLSAqICBkb2luZywgd2hlcmVhcyAiZXhwYW5kIiBjYW4gKGFuZCBkb2VzKSBtZWFuIGFueSBudW1iZXIgb2YgdGhpbmdzLgotICoKLSAqICBHUlAgMjAwNjAzMDc6IEluIGxpYnBuZy0xLjQuMCwgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSB3YXMgbW9kaWZpZWQKLSAqICB0byBleHBhbmQgb25seSB0aGUgc2FtcGxlIGRlcHRoIGJ1dCBub3QgdG8gZXhwYW5kIHRoZSB0Uk5TIHRvIGFscGhhLgotICovCi0KLS8qIEV4cGFuZCBwYWxldHRlZCBpbWFnZXMgdG8gUkdCLiAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfcGFsZXR0ZV90b19yZ2IocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9wYWxldHRlX3RvX3JnYiIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSAoUE5HX0VYUEFORCB8IFBOR19FWFBBTkRfdFJOUyk7Ci0gICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfUk9XX0lOSVQ7Ci19Ci0KLSNpZiAhZGVmaW5lZChQTkdfMV8wX1gpCi0vKiBFeHBhbmQgZ3JheXNjYWxlIGltYWdlcyBvZiBsZXNzIHRoYW4gOC1iaXQgZGVwdGggdG8gOCBiaXRzLiAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0VYUEFORDsKLSAgIHBuZ19wdHItPmZsYWdzICY9IH5QTkdfRkxBR19ST1dfSU5JVDsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfMV8wX1gpIHx8IGRlZmluZWQoUE5HXzFfMl9YKQotLyogRXhwYW5kIGdyYXlzY2FsZSBpbWFnZXMgb2YgbGVzcyB0aGFuIDgtYml0IGRlcHRoIHRvIDggYml0cy4gKi8KLS8qIERlcHJlY2F0ZWQgYXMgb2YgbGlicG5nLTEuMi45ICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9ncmF5XzFfMl80X3RvXzgocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9ncmF5XzFfMl80X3RvXzgiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gKFBOR19FWFBBTkQgfCBQTkdfRVhQQU5EX3RSTlMpOwotfQotI2VuZGlmCi0KLQotLyogRXhwYW5kIHRSTlMgY2h1bmtzIHRvIGFscGhhIGNoYW5uZWxzLiAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfdFJOU190b19hbHBoYShwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3RSTlNfdG9fYWxwaGEiKTsKLSAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSAoUE5HX0VYUEFORCB8IFBOR19FWFBBTkRfdFJOUyk7Ci0gICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfUk9XX0lOSVQ7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKSAqLwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2dyYXlfdG9fcmdiIik7Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0dSQVlfVE9fUkdCOwotICAgcG5nX3B0ci0+ZmxhZ3MgJj0gflBOR19GTEFHX1JPV19JTklUOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRCkKLSNpZiBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCi0vKiBDb252ZXJ0IGEgUkdCIGltYWdlIHRvIGEgZ3JheXNjYWxlIG9mIHRoZSBzYW1lIHdpZHRoLiAgVGhpcyBhbGxvd3MgdXMsCi0gKiBmb3IgZXhhbXBsZSwgdG8gY29udmVydCBhIDI0IGJwcCBSR0IgaW1hZ2UgaW50byBhbiA4IGJwcCBncmF5c2NhbGUgaW1hZ2UuCi0gKi8KLQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfcmdiX3RvX2dyYXkocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IGVycm9yX2FjdGlvbiwgZG91YmxlIHJlZCwKLSAgIGRvdWJsZSBncmVlbikKLXsKLSAgIGludCByZWRfZml4ZWQgPSAoaW50KSgoZmxvYXQpcmVkKjEwMDAwMC4wICsgMC41KTsKLSAgIGludCBncmVlbl9maXhlZCA9IChpbnQpKChmbG9hdClncmVlbioxMDAwMDAuMCArIDAuNSk7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZChwbmdfcHRyLCBlcnJvcl9hY3Rpb24sIHJlZF9maXhlZCwgZ3JlZW5fZml4ZWQpOwotfQotI2VuZGlmCi0KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBlcnJvcl9hY3Rpb24sCi0gICBwbmdfZml4ZWRfcG9pbnQgcmVkLCBwbmdfZml4ZWRfcG9pbnQgZ3JlZW4pCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfcmdiX3RvX2dyYXkiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBzd2l0Y2goZXJyb3JfYWN0aW9uKQotICAgewotICAgICAgY2FzZSAxOiBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1JHQl9UT19HUkFZOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAyOiBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1JHQl9UT19HUkFZX1dBUk47Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDM6IHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfUkdCX1RPX0dSQVlfRVJSOwotICAgfQotICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpCi0gICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0VYUEFORDsKLSNlbHNlCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAiQ2Fubm90IGRvIFJHQl9UT19HUkFZIHdpdGhvdXQgRVhQQU5EX1NVUFBPUlRFRC4iKTsKLSAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX1JHQl9UT19HUkFZOwotICAgfQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfdWludF8xNiByZWRfaW50LCBncmVlbl9pbnQ7Ci0gICAgICBpZiAocmVkIDwgMCB8fCBncmVlbiA8IDApCi0gICAgICB7Ci0gICAgICAgICByZWRfaW50ICAgPSAgNjk2ODsgLyogLjIxMjY3MSAqIDMyNzY4ICsgLjUgKi8KLSAgICAgICAgIGdyZWVuX2ludCA9IDIzNDM0OyAvKiAuNzE1MTYwICogMzI3NjggKyAuNSAqLwotICAgICAgfQotICAgICAgZWxzZSBpZiAocmVkICsgZ3JlZW4gPCAxMDAwMDBMKQotICAgICAgewotICAgICAgICAgcmVkX2ludCA9IChwbmdfdWludF8xNikoKChwbmdfdWludF8zMilyZWQqMzI3NjhMKS8xMDAwMDBMKTsKLSAgICAgICAgIGdyZWVuX2ludCA9IChwbmdfdWludF8xNikoKChwbmdfdWludF8zMilncmVlbiozMjc2OEwpLzEwMDAwMEwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgImlnbm9yaW5nIG91dCBvZiByYW5nZSByZ2JfdG9fZ3JheSBjb2VmZmljaWVudHMiKTsKLSAgICAgICAgIHJlZF9pbnQgICA9ICA2OTY4OwotICAgICAgICAgZ3JlZW5faW50ID0gMjM0MzQ7Ci0gICAgICB9Ci0gICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9yZWRfY29lZmYgICA9IHJlZF9pbnQ7Ci0gICAgICBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ncmVlbl9jb2VmZiA9IGdyZWVuX2ludDsKLSAgICAgIHBuZ19wdHItPnJnYl90b19ncmF5X2JsdWVfY29lZmYgID0KLSAgICAgICAgIChwbmdfdWludF8xNikoMzI3NjggLSByZWRfaW50IC0gZ3JlZW5faW50KTsKLSAgIH0KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19MRUdBQ1lfU1VQUE9SVEVEKQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyCi0gICByZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4iKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCi0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1VTRVJfVFJBTlNGT1JNOwotICAgcG5nX3B0ci0+cmVhZF91c2VyX3RyYW5zZm9ybV9mbiA9IHJlYWRfdXNlcl90cmFuc2Zvcm1fZm47Ci0jZW5kaWYKLSNpZmRlZiBQTkdfTEVHQUNZX1NVUFBPUlRFRAotICAgaWYgKHJlYWRfdXNlcl90cmFuc2Zvcm1fZm4pCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAiVGhpcyB2ZXJzaW9uIG9mIGxpYnBuZyBkb2VzIG5vdCBzdXBwb3J0IHVzZXIgdHJhbnNmb3JtcyIpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLyogSW5pdGlhbGl6ZSBldmVyeXRoaW5nIG5lZWRlZCBmb3IgdGhlIHJlYWQuICBUaGlzIGluY2x1ZGVzIG1vZGlmeWluZwotICogdGhlIHBhbGV0dGUuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMiKTsKLSNpZiBkZWZpbmVkKFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwpCi0jZW5kaWYKLSAgewotI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKSBcCi0gfHwgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0gICBpbnQgY29sb3JfdHlwZSA9IHBuZ19wdHItPmNvbG9yX3R5cGU7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVEKQotICAgLyogRGV0ZWN0IGdyYXkgYmFja2dyb3VuZCBhbmQgYXR0ZW1wdCB0byBlbmFibGUgb3B0aW1pemF0aW9uCi0gICAgKiBmb3IgZ3JheSAtLT4gUkdCIGNhc2UKLSAgICAqCi0gICAgKiBOb3RlOiAgaWYgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EIGlzIHNldCBhbmQgY29sb3JfdHlwZSBpcyBlaXRoZXIgUkdCIG9yCi0gICAgKiBSR0JfQUxQSEEgKGluIHdoaWNoIGNhc2UgbmVlZF9leHBhbmQgaXMgc3VwZXJmbHVvdXMgYW55d2F5KSwgdGhlCi0gICAgKiBiYWNrZ3JvdW5kIGNvbG9yIG1pZ2h0IGFjdHVhbGx5IGJlIGdyYXkgeWV0IG5vdCBiZSBmbGFnZ2VkIGFzIHN1Y2guCi0gICAgKiBUaGlzIGlzIG5vdCBhIHByb2JsZW0gZm9yIHRoZSBjdXJyZW50IGNvZGUsIHdoaWNoIHVzZXMKLSAgICAqIFBOR19CQUNLR1JPVU5EX0lTX0dSQVkgb25seSB0byBkZWNpZGUgd2hlbiB0byBkbyB0aGUKLSAgICAqIHBuZ19kb19ncmF5X3RvX3JnYigpIHRyYW5zZm9ybWF0aW9uLgotICAgICovCi0gICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EX0VYUEFORCkgJiYKLSAgICAgICAhKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpCi0gICB7Ci0gICAgICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQkFDS0dST1VORF9JU19HUkFZOwotICAgfSBlbHNlIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkQpICYmCi0gICAgICAgICAgICAgICEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EKSAmJgotICAgICAgICAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dSQVlfVE9fUkdCKSAmJgotICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9PSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuICYmCi0gICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID09IHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSkKLSAgIHsKLSAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19CQUNLR1JPVU5EX0lTX0dSQVk7Ci0gICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ID0gcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQ7Ci0gICB9Ci0jZW5kaWYKLQotICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORF9FWFBBTkQpICYmCi0gICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkQpKQotICAgewotICAgICAgaWYgKCEoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSkgIC8qIGkuZS4sIEdSQVkgb3IgR1JBWV9BTFBIQSAqLwotICAgICAgewotICAgICAgICAgLyogRXhwYW5kIGJhY2tncm91bmQgYW5kIHRSTlMgY2h1bmtzICovCi0gICAgICAgICBzd2l0Y2ggKHBuZ19wdHItPmJpdF9kZXB0aCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSAqPSAocG5nX3VpbnRfMTYpMHhmZjsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbgotICAgICAgICAgICAgICAgICA9ICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXk7Ci0gICAgICAgICAgICAgICBpZiAoIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EX3RSTlMpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc192YWx1ZXMuZ3JheSAqPSAocG5nX3VpbnRfMTYpMHhmZjsKLSAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfdmFsdWVzLnJlZCA9IHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmVlbgotICAgICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+dHJhbnNfdmFsdWVzLmJsdWUgPSBwbmdfcHRyLT50cmFuc192YWx1ZXMuZ3JheTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgKj0gKHBuZ191aW50XzE2KTB4NTU7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4KLSAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXk7Ci0gICAgICAgICAgICAgICBpZiAoIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EX3RSTlMpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc192YWx1ZXMuZ3JheSAqPSAocG5nX3VpbnRfMTYpMHg1NTsKLSAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfdmFsdWVzLnJlZCA9IHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmVlbgotICAgICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+dHJhbnNfdmFsdWVzLmJsdWUgPSBwbmdfcHRyLT50cmFuc192YWx1ZXMuZ3JheTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgKj0gKHBuZ191aW50XzE2KTB4MTE7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4KLSAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXk7Ci0gICAgICAgICAgICAgICBpZiAoIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EX3RSTlMpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc192YWx1ZXMuZ3JheSAqPSAocG5nX3VpbnRfMTYpMHgxMTsKLSAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNfdmFsdWVzLnJlZCA9IHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmVlbgotICAgICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+dHJhbnNfdmFsdWVzLmJsdWUgPSBwbmdfcHRyLT50cmFuc192YWx1ZXMuZ3JheTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDg6Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4KLSAgICAgICAgICAgICAgICAgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkICAgPQotICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmluZGV4XS5yZWQ7Ci0gICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuID0KLSAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVbcG5nX3B0ci0+YmFja2dyb3VuZC5pbmRleF0uZ3JlZW47Ci0gICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgID0KLSAgICAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVbcG5nX3B0ci0+YmFja2dyb3VuZC5pbmRleF0uYmx1ZTsKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRCkKLSAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfQUxQSEEpCi0gICAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpCi0gICAgICAgICAgIGlmICghKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkRfdFJOUykpCi0jZW5kaWYKLSAgICAgICAgICAgewotICAgICAgICAgICAvKiBJbnZlcnQgdGhlIGFscGhhIGNoYW5uZWwgKGluIHRSTlMpIHVubGVzcyB0aGUgcGl4ZWxzIGFyZQotICAgICAgICAgICAgKiBnb2luZyB0byBiZSBleHBhbmRlZCwgaW4gd2hpY2ggY2FzZSBsZWF2ZSBpdCBmb3IgbGF0ZXIKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIGludCBpLCBpc3RvcDsKLSAgICAgICAgICAgICAgaXN0b3A9KGludClwbmdfcHRyLT5udW1fdHJhbnM7Ci0gICAgICAgICAgICAgIGZvciAoaT0wOyBpPGlzdG9wOyBpKyspCi0gICAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zW2ldID0gKHBuZ19ieXRlKSgyNTUgLSBwbmdfcHRyLT50cmFuc1tpXSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0gICBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkKLQotICAgaWYgKChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYgcG5nX3B0ci0+bnVtX3RyYW5zICE9IDApCi0gICAgICAgJiYgKGZhYnMocG5nX3B0ci0+c2NyZWVuX2dhbW1hICogcG5nX3B0ci0+Z2FtbWEgLSAxLjApCi0gICAgICAgICA8IFBOR19HQU1NQV9USFJFU0hPTEQpKQotICAgewotICAgIGludCBpLCBrOwotICAgIGs9MDsKLSAgICBmb3IgKGk9MDsgaTxwbmdfcHRyLT5udW1fdHJhbnM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocG5nX3B0ci0+dHJhbnNbaV0gIT0gMCAmJiBwbmdfcHRyLT50cmFuc1tpXSAhPSAweGZmKQotICAgICAgICBrPTE7IC8qIFBhcnRpYWwgdHJhbnNwYXJlbmN5IGlzIHByZXNlbnQgKi8KLSAgICB9Ci0gICAgaWYgKGsgPT0gMCkKLSAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX0dBTU1BOwotICAgfQotCi0gICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIChQTkdfR0FNTUEgfCBQTkdfUkdCX1RPX0dSQVkpKSAmJgotICAgICAgICBwbmdfcHRyLT5nYW1tYSAhPSAwLjApCi0gICB7Ci0gICAgICBwbmdfYnVpbGRfZ2FtbWFfdGFibGUocG5nX3B0cik7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKLSAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICAgICB7Ci0gICAgICAgICAgIC8qIENvdWxkIHNraXAgaWYgbm8gdHJhbnNwYXJlbmN5ICovCi0gICAgICAgICAgICBwbmdfY29sb3IgYmFjaywgYmFja18xOwotICAgICAgICAgICAgcG5nX2NvbG9ycCBwYWxldHRlID0gcG5nX3B0ci0+cGFsZXR0ZTsKLSAgICAgICAgICAgIGludCBudW1fcGFsZXR0ZSA9IHBuZ19wdHItPm51bV9wYWxldHRlOwotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYV90eXBlID09IFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBiYWNrLnJlZCA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BuZ19wdHItPmJhY2tncm91bmQucmVkXTsKLSAgICAgICAgICAgICAgIGJhY2suZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuXTsKLSAgICAgICAgICAgICAgIGJhY2suYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BuZ19wdHItPmJhY2tncm91bmQuYmx1ZV07Ci0KLSAgICAgICAgICAgICAgIGJhY2tfMS5yZWQgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BuZ19wdHItPmJhY2tncm91bmQucmVkXTsKLSAgICAgICAgICAgICAgIGJhY2tfMS5ncmVlbiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbl07Ci0gICAgICAgICAgICAgICBiYWNrXzEuYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGRvdWJsZSBnLCBnczsKLQotICAgICAgICAgICAgICAgc3dpdGNoIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hX3R5cGUpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTjoKLSAgICAgICAgICAgICAgICAgICAgIGcgPSAocG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKLSAgICAgICAgICAgICAgICAgICAgIGdzID0gMS4wOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRToKLSAgICAgICAgICAgICAgICAgICAgIGcgPSAxLjAgLyAocG5nX3B0ci0+Z2FtbWEpOwotICAgICAgICAgICAgICAgICAgICAgZ3MgPSAxLjAgLyAocG5nX3B0ci0+Z2FtbWEgKiBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5JUVVFOgotICAgICAgICAgICAgICAgICAgICAgZyA9IDEuMCAvIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hKTsKLSAgICAgICAgICAgICAgICAgICAgIGdzID0gMS4wIC8gKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWEgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgIGcgPSAxLjA7ICAgIC8qIGJhY2tfMSAqLwotICAgICAgICAgICAgICAgICAgICAgZ3MgPSAxLjA7ICAgLyogYmFjayAqLwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBpZiAoIGZhYnMoZ3MgLSAxLjApIDwgUE5HX0dBTU1BX1RIUkVTSE9MRCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJhY2sucmVkICAgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQ7Ci0gICAgICAgICAgICAgICAgICBiYWNrLmdyZWVuID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW47Ci0gICAgICAgICAgICAgICAgICBiYWNrLmJsdWUgID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuYmx1ZTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJhY2sucmVkID0gKHBuZ19ieXRlKShwb3coCi0gICAgICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQucmVkLzI1NSwgZ3MpICogMjU1LjAgKyAuNSk7Ci0gICAgICAgICAgICAgICAgICBiYWNrLmdyZWVuID0gKHBuZ19ieXRlKShwb3coCi0gICAgICAgICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4vMjU1LCBncykgKiAyNTUuMCArIC41KTsKLSAgICAgICAgICAgICAgICAgIGJhY2suYmx1ZSA9IChwbmdfYnl0ZSkocG93KAotICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUvMjU1LCBncykgKiAyNTUuMCArIC41KTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgYmFja18xLnJlZCA9IChwbmdfYnl0ZSkocG93KAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZC8yNTUsIGcpICogMjU1LjAgKyAuNSk7Ci0gICAgICAgICAgICAgICBiYWNrXzEuZ3JlZW4gPSAocG5nX2J5dGUpKHBvdygKLSAgICAgICAgICAgICAgICAgIChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbi8yNTUsIGcpICogMjU1LjAgKyAuNSk7Ci0gICAgICAgICAgICAgICBiYWNrXzEuYmx1ZSA9IChwbmdfYnl0ZSkocG93KAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUvMjU1LCBnKSAqIDI1NS4wICsgLjUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoaSA8IChpbnQpcG5nX3B0ci0+bnVtX3RyYW5zICYmIHBuZ19wdHItPnRyYW5zW2ldICE9IDB4ZmYpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNbaV0gPT0gMCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0gPSBiYWNrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSAvKiBpZiAocG5nX3B0ci0+dHJhbnNbaV0gIT0gMHhmZikgKi8KLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHYsIHc7Ci0KLSAgICAgICAgICAgICAgICAgICAgIHYgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BhbGV0dGVbaV0ucmVkXTsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUodywgdiwgcG5nX3B0ci0+dHJhbnNbaV0sIGJhY2tfMS5yZWQpOwotICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbd107Ci0KLSAgICAgICAgICAgICAgICAgICAgIHYgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BhbGV0dGVbaV0uZ3JlZW5dOwotICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBwbmdfcHRyLT50cmFuc1tpXSwgYmFja18xLmdyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbd107Ci0KLSAgICAgICAgICAgICAgICAgICAgIHYgPSBwbmdfcHRyLT5nYW1tYV90b18xW3BhbGV0dGVbaV0uYmx1ZV07Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIHBuZ19wdHItPnRyYW5zW2ldLCBiYWNrXzEuYmx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV9mcm9tXzFbd107Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwYWxldHRlW2ldLnJlZCA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0ucmVkXTsKLSAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmdyZWVuXTsKLSAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0uYmx1ZV07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JICAgIC8qIFByZXZlbnQgdGhlIHRyYW5zZm9ybWF0aW9ucyBiZWluZyBkb25lIGFnYWluLCBhbmQgbWFrZSBzdXJlCi0JICAgICAqIHRoYXQgdGhlIG5vdyBzcHVyaW91cyBhbHBoYSBjaGFubmVsIGlzIHN0cmlwcGVkIC0gdGhlIGNvZGUKLQkgICAgICogaGFzIGp1c3QgcmVkdWNlZCBiYWNrZ3JvdW5kIGNvbXBvc2l0aW9uIGFuZCBnYW1tYSBjb3JyZWN0aW9uCi0JICAgICAqIHRvIGEgc2ltcGxlIGFscGhhIGNoYW5uZWwgc3RyaXAuCi0JICAgICAqLwotCSAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19CQUNLR1JPVU5EOwotCSAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19HQU1NQTsKLQkgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19TVFJJUF9BTFBIQTsKLSAgICAgICAgIH0KLSAgICAgICAgIC8qIGlmIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hX3R5cGUhPVBOR19CQUNLR1JPVU5EX0dBTU1BX1VOS05PV04pICovCi0gICAgICAgICBlbHNlCi0gICAgICAgICAvKiBjb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSBtID0gKGRvdWJsZSkoKChwbmdfdWludF8zMikxIDw8IHBuZ19wdHItPmJpdF9kZXB0aCkgLSAxKTsKLSAgICAgICAgICAgIGRvdWJsZSBnID0gMS4wOwotICAgICAgICAgICAgZG91YmxlIGdzID0gMS4wOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWFfdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOOgotICAgICAgICAgICAgICAgICAgZyA9IChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpOwotICAgICAgICAgICAgICAgICAgZ3MgPSAxLjA7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFOgotICAgICAgICAgICAgICAgICAgZyA9IDEuMCAvIChwbmdfcHRyLT5nYW1tYSk7Ci0gICAgICAgICAgICAgICAgICBncyA9IDEuMCAvIChwbmdfcHRyLT5nYW1tYSAqIHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUU6Ci0gICAgICAgICAgICAgICAgICBnID0gMS4wIC8gKHBuZ19wdHItPmJhY2tncm91bmRfZ2FtbWEpOwotICAgICAgICAgICAgICAgICAgZ3MgPSAxLjAgLyAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSAqCi0gICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmRfMS5ncmF5ID0gKHBuZ191aW50XzE2KShwb3coCi0gICAgICAgICAgICAgICAoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JheSAvIG0sIGcpICogbSArIC41KTsKLSAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuZ3JheSA9IChwbmdfdWludF8xNikocG93KAotICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyYXkgLyBtLCBncykgKiBtICsgLjUpOwotCi0gICAgICAgICAgICBpZiAoKHBuZ19wdHItPmJhY2tncm91bmQucmVkICE9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW4pIHx8Ci0gICAgICAgICAgICAgICAgKHBuZ19wdHItPmJhY2tncm91bmQucmVkICE9IHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSkgfHwKLSAgICAgICAgICAgICAgICAocG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgIT0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIFJHQiBvciBSR0JBIHdpdGggY29sb3IgYmFja2dyb3VuZCAqLwotICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xLnJlZCA9IChwbmdfdWludF8xNikocG93KAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCAvIG0sIGcpICogbSArIC41KTsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmRfMS5ncmVlbiA9IChwbmdfdWludF8xNikocG93KAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuIC8gbSwgZykgKiBtICsgLjUpOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZF8xLmJsdWUgPSAocG5nX3VpbnRfMTYpKHBvdygKLSAgICAgICAgICAgICAgICAgIChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlIC8gbSwgZykgKiBtICsgLjUpOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPSAocG5nX3VpbnRfMTYpKHBvdygKLSAgICAgICAgICAgICAgICAgIChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgLyBtLCBncykgKiBtICsgLjUpOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbiA9IChwbmdfdWludF8xNikocG93KAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuIC8gbSwgZ3MpICogbSArIC41KTsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9IChwbmdfdWludF8xNikocG93KAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgLyBtLCBncykgKiBtICsgLjUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogR1JBWSwgR1JBWSBBTFBIQSwgUkdCLCBvciBSR0JBIHdpdGggZ3JheSBiYWNrZ3JvdW5kICovCi0gICAgICAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEucmVkID0gcG5nX3B0ci0+YmFja2dyb3VuZF8xLmdyZWVuCi0gICAgICAgICAgICAgICAgID0gcG5nX3B0ci0+YmFja2dyb3VuZF8xLmJsdWUgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kXzEuZ3JheTsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPmJhY2tncm91bmQucmVkID0gcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbgotICAgICAgICAgICAgICAgICA9IHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIC8qIFRyYW5zZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgUE5HX0JBQ0tHUk9VTkQgKi8KLSNlbmRpZiAvKiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCAqLwotICAgICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19jb2xvcnAgcGFsZXR0ZSA9IHBuZ19wdHItPnBhbGV0dGU7Ci0gICAgICAgICBpbnQgbnVtX3BhbGV0dGUgPSBwbmdfcHRyLT5udW1fcGFsZXR0ZTsKLSAgICAgICAgIGludCBpOwotCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5yZWRdOwotICAgICAgICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BhbGV0dGVbaV0uZ3JlZW5dOwotICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5ibHVlXTsKLSAgICAgICAgIH0KLQotCSAvKiBEb25lIHRoZSBnYW1tYSBjb3JyZWN0aW9uLiAqLwotCSBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJj0gflBOR19HQU1NQTsKLSAgICAgIH0KLSAgIH0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgZWxzZQotI2VuZGlmCi0jZW5kaWYgLyogUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEICYmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQgKi8KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgLyogTm8gR0FNTUEgdHJhbnNmb3JtYXRpb24gKi8KLSAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkQpICYmCi0gICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkpCi0gICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBpc3RvcCA9IChpbnQpcG5nX3B0ci0+bnVtX3RyYW5zOwotICAgICAgcG5nX2NvbG9yIGJhY2s7Ci0gICAgICBwbmdfY29sb3JwIHBhbGV0dGUgPSBwbmdfcHRyLT5wYWxldHRlOwotCi0gICAgICBiYWNrLnJlZCAgID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQucmVkOwotICAgICAgYmFjay5ncmVlbiA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuOwotICAgICAgYmFjay5ibHVlICA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWU7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQotICAgICAgewotICAgICAgICAgaWYgKHBuZ19wdHItPnRyYW5zW2ldID09IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwYWxldHRlW2ldID0gYmFjazsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgaWYgKHBuZ19wdHItPnRyYW5zW2ldICE9IDB4ZmYpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUaGUgcG5nX2NvbXBvc2l0ZSgpIG1hY3JvIGlzIGRlZmluZWQgaW4gcG5nLmggKi8KLSAgICAgICAgICAgIHBuZ19jb21wb3NpdGUocGFsZXR0ZVtpXS5yZWQsIHBhbGV0dGVbaV0ucmVkLAotICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNbaV0sIGJhY2sucmVkKTsKLSAgICAgICAgICAgIHBuZ19jb21wb3NpdGUocGFsZXR0ZVtpXS5ncmVlbiwgcGFsZXR0ZVtpXS5ncmVlbiwKLSAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zW2ldLCBiYWNrLmdyZWVuKTsKLSAgICAgICAgICAgIHBuZ19jb21wb3NpdGUocGFsZXR0ZVtpXS5ibHVlLCBwYWxldHRlW2ldLmJsdWUsCi0gICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc1tpXSwgYmFjay5ibHVlKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogSGFuZGxlZCBhbHBoYSwgc3RpbGwgbmVlZCB0byBzdHJpcCB0aGUgY2hhbm5lbC4gKi8KLSAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmPSB+UE5HX0JBQ0tHUk9VTkQ7Ci0gICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1NUUklQX0FMUEhBOwotICAgfQotI2VuZGlmIC8qIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEICovCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkKLSAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NISUZUKSAmJgotICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkpCi0gICB7Ci0gICAgICBwbmdfdWludF8xNiBpOwotICAgICAgcG5nX3VpbnRfMTYgaXN0b3AgPSBwbmdfcHRyLT5udW1fcGFsZXR0ZTsKLSAgICAgIGludCBzciA9IDggLSBwbmdfcHRyLT5zaWdfYml0LnJlZDsKLSAgICAgIGludCBzZyA9IDggLSBwbmdfcHRyLT5zaWdfYml0LmdyZWVuOwotICAgICAgaW50IHNiID0gOCAtIHBuZ19wdHItPnNpZ19iaXQuYmx1ZTsKLQotICAgICAgaWYgKHNyIDwgMCB8fCBzciA+IDgpCi0gICAgICAgICBzciA9IDA7Ci0gICAgICBpZiAoc2cgPCAwIHx8IHNnID4gOCkKLSAgICAgICAgIHNnID0gMDsKLSAgICAgIGlmIChzYiA8IDAgfHwgc2IgPiA4KQotICAgICAgICAgc2IgPSAwOwotICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyspCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5wYWxldHRlW2ldLnJlZCA+Pj0gc3I7Ci0gICAgICAgICBwbmdfcHRyLT5wYWxldHRlW2ldLmdyZWVuID4+PSBzZzsKLSAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVbaV0uYmx1ZSA+Pj0gc2I7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYgIC8qIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCAqLwotIH0KLSNpZiAhZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkgXAotICYmICFkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHIpCi0gICAgICByZXR1cm47Ci0jZW5kaWYKLX0KLQotLyogTW9kaWZ5IHRoZSBpbmZvIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSB0cmFuc2Zvcm1hdGlvbnMuICBUaGUKLSAqIGluZm8gc2hvdWxkIGJlIHVwZGF0ZWQgc28gYSBQTkcgZmlsZSBjb3VsZCBiZSB3cml0dGVuIHdpdGggaXQsCi0gKiBhc3N1bWluZyB0aGUgdHJhbnNmb3JtYXRpb25zIHJlc3VsdCBpbiB2YWxpZCBQTkcgZGF0YS4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcmVhZF90cmFuc2Zvcm1faW5mbyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX3RyYW5zZm9ybV9pbmZvIik7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkQpCi0gICB7Ci0gICAgICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT5udW1fdHJhbnMgJiYKLSAgICAgICAgICAgICAgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19FWFBBTkRfdFJOUykpCi0gICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOwotICAgICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IDg7Ci0gICAgICAgICBpbmZvX3B0ci0+bnVtX3RyYW5zID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT5udW1fdHJhbnMpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORF90Uk5TKQotICAgICAgICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSB8PSBQTkdfQ09MT1JfTUFTS19BTFBIQTsKLSNpZiAwIC8qIFJlbW92ZWQgZnJvbSBsaWJwbmctMS4yLjI3ICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlIHw9IFBOR19DT0xPUl9NQVNLX0NPTE9SOwotI2VuZGlmCi0gICAgICAgICB9Ci0gICAgICAgICBpZiAoaW5mb19wdHItPmJpdF9kZXB0aCA8IDgpCi0gICAgICAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gODsKLSAgICAgICAgIGluZm9fcHRyLT5udW1fdHJhbnMgPSAwOwotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CQUNLR1JPVU5EKQotICAgewotICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgJj0gflBOR19DT0xPUl9NQVNLX0FMUEhBOwotICAgICAgaW5mb19wdHItPm51bV90cmFucyA9IDA7Ci0gICAgICBpbmZvX3B0ci0+YmFja2dyb3VuZCA9IHBuZ19wdHItPmJhY2tncm91bmQ7Ci0gICB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19HQU1NQSkKLSAgIHsKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgICBpbmZvX3B0ci0+Z2FtbWEgPSBwbmdfcHRyLT5nYW1tYTsKLSNlbmRpZgotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgICAgIGluZm9fcHRyLT5pbnRfZ2FtbWEgPSBwbmdfcHRyLT5pbnRfZ2FtbWE7Ci0jZW5kaWYKLSAgIH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRCkKLSAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HXzE2X1RPXzgpICYmIChpbmZvX3B0ci0+Yml0X2RlcHRoID09IDE2KSkKLSAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGggPSA4OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfR1JBWV9UT19SR0IpCi0gICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSB8PSBQTkdfQ09MT1JfTUFTS19DT0xPUjsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1JHQl9UT19HUkFZKQotICAgICAgaW5mb19wdHItPmNvbG9yX3R5cGUgJj0gflBOR19DT0xPUl9NQVNLX0NPTE9SOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0RJVEhFUikKLSAgIHsKLSAgICAgIGlmICgoKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikgfHwKLSAgICAgICAgICAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKSkgJiYKLSAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlX2xvb2t1cCAmJiBpbmZvX3B0ci0+Yml0X2RlcHRoID09IDgpCi0gICAgICB7Ci0gICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEU7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpCi0gICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKSAmJiAoaW5mb19wdHItPmJpdF9kZXB0aCA8IDgpKQotICAgICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IDg7Ci0jZW5kaWYKLQotICAgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSAxOwotICAgZWxzZSBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKLSAgICAgIGluZm9fcHRyLT5jaGFubmVscyA9IDM7Ci0gICBlbHNlCi0gICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSAxOwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19TVFJJUF9BTFBIQSkKLSAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlICY9IH5QTkdfQ09MT1JfTUFTS19BTFBIQTsKLSNlbmRpZgotCi0gICBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkKLSAgICAgIGluZm9fcHRyLT5jaGFubmVscysrOwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKQotICAgLyogU1RSSVBfQUxQSEEgYW5kIEZJTExFUiBhbGxvd2VkOiAgTUFTS19BTFBIQSBiaXQgc3RyaXBwZWQgYWJvdmUgKi8KLSAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0ZJTExFUikgJiYKLSAgICAgICAoKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikgfHwKLSAgICAgICAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkpKQotICAgewotICAgICAgaW5mb19wdHItPmNoYW5uZWxzKys7Ci0gICAgICAvKiBJZiBhZGRpbmcgYSB0cnVlIGFscGhhIGNoYW5uZWwgbm90IGp1c3QgZmlsbGVyICovCi0jaWYgIWRlZmluZWQoUE5HXzFfMF9YKQotICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19BRERfQUxQSEEpCi0gICAgICAgIGluZm9fcHRyLT5jb2xvcl90eXBlIHw9IFBOR19DT0xPUl9NQVNLX0FMUEhBOwotI2VuZGlmCi0gICB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQpICYmIFwKLWRlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19VU0VSX1RSQU5TRk9STSkKLSAgICAgewotICAgICAgIGlmIChpbmZvX3B0ci0+Yml0X2RlcHRoIDwgcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fZGVwdGgpCi0gICAgICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoID0gcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fZGVwdGg7Ci0gICAgICAgaWYgKGluZm9fcHRyLT5jaGFubmVscyA8IHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzKQotICAgICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7Ci0gICAgIH0KLSNlbmRpZgotCi0gICBpbmZvX3B0ci0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKGluZm9fcHRyLT5jaGFubmVscyAqCi0gICAgICBpbmZvX3B0ci0+Yml0X2RlcHRoKTsKLQotICAgaW5mb19wdHItPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKGluZm9fcHRyLT5waXhlbF9kZXB0aCwgaW5mb19wdHItPndpZHRoKTsKLQotI2lmICFkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0cikKLSAgICAgIHJldHVybjsKLSNlbmRpZgotfQotCi0vKiBUcmFuc2Zvcm0gdGhlIHJvdy4gIFRoZSBvcmRlciBvZiB0cmFuc2Zvcm1hdGlvbnMgaXMgc2lnbmlmaWNhbnQsCi0gKiBhbmQgaXMgdmVyeSB0b3VjaHkuICBJZiB5b3UgYWRkIGEgdHJhbnNmb3JtYXRpb24sIHRha2UgY2FyZSB0bwotICogZGVjaWRlIGhvdyBpdCBmaXRzIGluIHdpdGggdGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBoZXJlLgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMiKTsKLSAgIGlmIChwbmdfcHRyLT5yb3dfYnVmID09IE5VTEwpCi0gICB7Ci0jaWYgIWRlZmluZWQoUE5HX05PX1NURElPKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotICAgICAgY2hhciBtc2dbNTBdOwotCi0gICAgICBwbmdfc25wcmludGYyKG1zZywgNTAsCi0gICAgICAgICAiTlVMTCByb3cgYnVmZmVyIGZvciByb3cgJWxkLCBwYXNzICVkIiwgKGxvbmcpcG5nX3B0ci0+cm93X251bWJlciwKLSAgICAgICAgIHBuZ19wdHItPnBhc3MpOwotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIG1zZyk7Ci0jZWxzZQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOVUxMIHJvdyBidWZmZXIiKTsKLSNlbmRpZgotICAgfQotI2lmZGVmIFBOR19XQVJOX1VOSU5JVElBTElaRURfUk9XCi0gICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1JPV19JTklUKSkKLSAgICAgIC8qIEFwcGxpY2F0aW9uIGhhcyBmYWlsZWQgdG8gY2FsbCBlaXRoZXIgcG5nX3JlYWRfc3RhcnRfaW1hZ2UoKQotICAgICAgICogb3IgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBhZnRlciBzZXR0aW5nIHRyYW5zZm9ybXMgdGhhdCBleHBhbmQKLSAgICAgICAqIHBpeGVscy4gIFRoaXMgY2hlY2sgYWRkZWQgdG8gbGlicG5nLTEuMi4xOQotICAgICAgICovCi0jaWYgKFBOR19XQVJOX1VOSU5JVElBTElaRURfUk9XPT0xKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJVbmluaXRpYWxpemVkIHJvdyIpOwotI2Vsc2UKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmluaXRpYWxpemVkIHJvdyIpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfRVhQQU5EKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPnJvd19pbmZvLmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19kb19leHBhbmRfcGFsZXR0ZSgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEsCi0gICAgICAgICAgICBwbmdfcHRyLT5wYWxldHRlLCBwbmdfcHRyLT50cmFucywgcG5nX3B0ci0+bnVtX3RyYW5zKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT5udW1fdHJhbnMgJiYKLSAgICAgICAgICAgICAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORF90Uk5TKSkKLSAgICAgICAgICAgIHBuZ19kb19leHBhbmQoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgICAgICAgJihwbmdfcHRyLT50cmFuc192YWx1ZXMpKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBuZ19kb19leHBhbmQoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfU1RSSVBfQUxQSEEpCi0gICAgICBwbmdfZG9fc3RyaXBfZmlsbGVyKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKLSAgICAgICAgIFBOR19GTEFHX0ZJTExFUl9BRlRFUiB8IChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1NUUklQX0FMUEhBKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19SR0JfVE9fR1JBWSkKLSAgIHsKLSAgICAgIGludCByZ2JfZXJyb3IgPQotICAgICAgICAgcG5nX2RvX3JnYl90b19ncmF5KHBuZ19wdHIsICYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0gICAgICBpZiAocmdiX2Vycm9yKQotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+cmdiX3RvX2dyYXlfc3RhdHVzPTE7Ci0gICAgICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19SR0JfVE9fR1JBWSkgPT0KLSAgICAgICAgICAgICBQTkdfUkdCX1RPX0dSQVlfV0FSTikKLSAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJwbmdfZG9fcmdiX3RvX2dyYXkgZm91bmQgbm9uZ3JheSBwaXhlbCIpOwotICAgICAgICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUkdCX1RPX0dSQVkpID09Ci0gICAgICAgICAgICAgUE5HX1JHQl9UT19HUkFZX0VSUikKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX2RvX3JnYl90b19ncmF5IGZvdW5kIG5vbmdyYXkgcGl4ZWwiKTsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotCi0vKiBGcm9tIEFuZHJlYXMgRGlsZ2VyIGUtbWFpbCB0byBwbmctaW1wbGVtZW50LCAyNiBNYXJjaCAxOTk4OgotICogCi0gKiAgIEluIG1vc3QgY2FzZXMsIHRoZSAic2ltcGxlIHRyYW5zcGFyZW5jeSIgc2hvdWxkIGJlIGRvbmUgcHJpb3IgdG8gZG9pbmcKLSAqICAgZ3JheS10by1SR0IsIG9yIHlvdSB3aWxsIGhhdmUgdG8gdGVzdCAzeCBhcyBtYW55IGJ5dGVzIHRvIGNoZWNrIGlmIGEKLSAqICAgcGl4ZWwgaXMgdHJhbnNwYXJlbnQuICBZb3Ugd291bGQgYWxzbyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotICogICB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24gaXMgdXBncmFkZWQgdG8gUkdCLgotICogCi0gKiAgIFRvIHN1bW1hcml6ZSwgdGhlIGN1cnJlbnQgZmxvdyBpczoKLSAqICAgLSBHcmF5ICsgc2ltcGxlIHRyYW5zcGFyZW5jeSAtPiBjb21wYXJlIDEgb3IgMiBncmF5IGJ5dGVzIGFuZCBjb21wb3NpdGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGJhY2tncm91bmQgImluIHBsYWNlIiBpZiB0cmFuc3BhcmVudCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0IHRvIFJHQiBpZiBuZWNlc3NhcnkKLSAqICAgLSBHcmF5ICsgYWxwaGEgLT4gY29tcG9zaXRlIHdpdGggZ3JheSBiYWNrZ3JvdW5kIGFuZCByZW1vdmUgYWxwaGEgYnl0ZXMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCB0byBSR0IgaWYgbmVjZXNzYXJ5Ci0gKgotICogICBUbyBzdXBwb3J0IFJHQiBiYWNrZ3JvdW5kcyBmb3IgZ3JheSBpbWFnZXMgd2UgbmVlZDoKLSAqICAgLSBHcmF5ICsgc2ltcGxlIHRyYW5zcGFyZW5jeSAtPiBjb252ZXJ0IHRvIFJHQiArIHNpbXBsZSB0cmFuc3BhcmVuY3ksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZSAzIG9yIDYgYnl0ZXMgYW5kIGNvbXBvc2l0ZSB3aXRoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCAiaW4gcGxhY2UiIGlmIHRyYW5zcGFyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDN4IGNvbXBhcmUvcGl4ZWwgY29tcGFyZWQgdG8gZG9pbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUgd2l0aCBncmF5IGJrZ3JuZCkKLSAqICAgLSBHcmF5ICsgYWxwaGEgLT4gY29udmVydCB0byBSR0IgKyBhbHBoYSwgY29tcG9zaXRlIHdpdGggYmFja2dyb3VuZCBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgYWxwaGEgYnl0ZXMgKDN4IGZsb2F0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy9waXhlbCBjb21wYXJlZCB3aXRoIGNvbXBvc2l0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGdyYXkgYmFja2dyb3VuZCkKLSAqCi0gKiAgR3JlZydzIGNoYW5nZSB3aWxsIGRvIHRoaXMuICBUaGUgcmVhc29uIGl0IHdhc24ndCBkb25lIGJlZm9yZSBpcyBmb3IKLSAqICBwZXJmb3JtYW5jZSwgYXMgdGhpcyBpbmNyZWFzZXMgdGhlIHBlci1waXhlbCBvcGVyYXRpb25zLiAgSWYgd2Ugd291bGQgY2hlY2sKLSAqICBpbiBhZHZhbmNlIGlmIHRoZSBiYWNrZ3JvdW5kIHdhcyBncmF5IG9yIFJHQiwgYW5kIHBvc2l0aW9uIHRoZSBncmF5LXRvLVJHQgotICogIHRyYW5zZm9ybSBhcHByb3ByaWF0ZWx5LCB0aGVuIGl0IHdvdWxkIHNhdmUgYSBsb3Qgb2Ygd29yay90aW1lLgotICovCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRCkKLSAgIC8qIElmIGdyYXkgLT4gUkdCLCBkbyBzbyBub3cgb25seSBpZiBiYWNrZ3JvdW5kIGlzIG5vbi1ncmF5OyBlbHNlIGRvIGxhdGVyCi0gICAgKiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucwotICAgICovCi0gICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19HUkFZX1RPX1JHQikgJiYKLSAgICAgICAhKHBuZ19wdHItPm1vZGUgJiBQTkdfQkFDS0dST1VORF9JU19HUkFZKSkKLSAgICAgIHBuZ19kb19ncmF5X3RvX3JnYigmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORCkgJiYKLSAgICAgICgocG5nX3B0ci0+bnVtX3RyYW5zICE9IDAgKSB8fAotICAgICAgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkpKQotICAgICAgcG5nX2RvX2JhY2tncm91bmQoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgJihwbmdfcHRyLT50cmFuc192YWx1ZXMpLCAmKHBuZ19wdHItPmJhY2tncm91bmQpCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0gICAgICAgICAsICYocG5nX3B0ci0+YmFja2dyb3VuZF8xKSwKLSAgICAgICAgIHBuZ19wdHItPmdhbW1hX3RhYmxlLCBwbmdfcHRyLT5nYW1tYV9mcm9tXzEsCi0gICAgICAgICBwbmdfcHRyLT5nYW1tYV90b18xLCBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZSwKLSAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSwgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSwKLSAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0Ci0jZW5kaWYKLSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKQotICAgaWYgKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfR0FNTUEpICYmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkKLSAgICAgICAhKChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkFDS0dST1VORCkgJiYKLSAgICAgICAoKHBuZ19wdHItPm51bV90cmFucyAhPSAwKSB8fAotICAgICAgIChwbmdfcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpKSkgJiYKLSNlbmRpZgotICAgICAgIChwbmdfcHRyLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpKQotICAgICAgcG5nX2RvX2dhbW1hKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKLSAgICAgICAgICBwbmdfcHRyLT5nYW1tYV90YWJsZSwgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGUsCi0gICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfc2hpZnQpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR18xNl9UT184KQotICAgICAgcG5nX2RvX2Nob3AoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9ESVRIRVJfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19ESVRIRVIpCi0gICB7Ci0gICAgICBwbmdfZG9fZGl0aGVyKChwbmdfcm93X2luZm9wKSYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSwKLSAgICAgICAgIHBuZ19wdHItPnBhbGV0dGVfbG9va3VwLCBwbmdfcHRyLT5kaXRoZXJfaW5kZXgpOwotICAgICAgaWYgKHBuZ19wdHItPnJvd19pbmZvLnJvd2J5dGVzID09IChwbmdfdWludF8zMikwKQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJwbmdfZG9fZGl0aGVyIHJldHVybmVkIHJvd2J5dGVzPTAiKTsKLSAgIH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfTU9OTykKLSAgICAgIHBuZ19kb19pbnZlcnQoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NISUZUKQotICAgICAgcG5nX2RvX3Vuc2hpZnQoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgJihwbmdfcHRyLT5zaGlmdCkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKQotICAgICAgcG5nX2RvX3VucGFjaygmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JHUikKLSAgICAgIHBuZ19kb19iZ3IoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQotICAgICAgcG5nX2RvX3BhY2tzd2FwKCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVEKQotICAgLyogSWYgZ3JheSAtPiBSR0IsIGRvIHNvIG5vdyBvbmx5IGlmIHdlIGRpZCBub3QgZG8gc28gYWJvdmUgKi8KLSAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dSQVlfVE9fUkdCKSAmJgotICAgICAgIChwbmdfcHRyLT5tb2RlICYgUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWSkpCi0gICAgICBwbmdfZG9fZ3JheV90b19yZ2IoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19GSUxMRVIpCi0gICAgICBwbmdfZG9fcmVhZF9maWxsZXIoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgKHBuZ191aW50XzMyKXBuZ19wdHItPmZpbGxlciwgcG5nX3B0ci0+ZmxhZ3MpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVkVSVF9BTFBIQSkKLSAgICAgIHBuZ19kb19yZWFkX2ludmVydF9hbHBoYSgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0FMUEhBKQotICAgICAgcG5nX2RvX3JlYWRfc3dhcF9hbHBoYSgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0JZVEVTKQotICAgICAgcG5nX2RvX3N3YXAoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1VTRVJfVFJBTlNGT1JNKQotICAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuICE9IE5VTEwpCi0gICAgICAgICAoKihwbmdfcHRyLT5yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKSkgLyogVXNlciByZWFkIHRyYW5zZm9ybSBmdW5jdGlvbiAqLwotICAgICAgICAgICAgKHBuZ19wdHIsICAgICAgICAgICAgICAgICAgICAvKiBwbmdfcHRyICovCi0gICAgICAgICAgICAgICAmKHBuZ19wdHItPnJvd19pbmZvKSwgICAgIC8qIHJvd19pbmZvOiAqLwotICAgICAgICAgICAgICAgLyogIHBuZ191aW50XzMyIHdpZHRoOyAgICAgICB3aWR0aCBvZiByb3cgKi8KLSAgICAgICAgICAgICAgIC8qICBwbmdfdWludF8zMiByb3dieXRlczsgICAgbnVtYmVyIG9mIGJ5dGVzIGluIHJvdyAqLwotICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIGNvbG9yX3R5cGU7ICAgICBjb2xvciB0eXBlIG9mIHBpeGVscyAqLwotICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIGJpdF9kZXB0aDsgICAgICBiaXQgZGVwdGggb2Ygc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgLyogIHBuZ19ieXRlIGNoYW5uZWxzOyAgICAgICBudW1iZXIgb2YgY2hhbm5lbHMgKDEtNCkgKi8KLSAgICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBwaXhlbF9kZXB0aDsgICAgYml0cyBwZXIgcGl4ZWwgKGRlcHRoKmNoYW5uZWxzKSAqLwotICAgICAgICAgICAgICAgcG5nX3B0ci0+cm93X2J1ZiArIDEpOyAgICAvKiBzdGFydCBvZiBwaXhlbCBkYXRhIGZvciByb3cgKi8KLSNpZiBkZWZpbmVkKFBOR19VU0VSX1RSQU5TRk9STV9QVFJfU1VQUE9SVEVEKQotICAgICAgaWYgKHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2RlcHRoKQotICAgICAgICAgcG5nX3B0ci0+cm93X2luZm8uYml0X2RlcHRoID0gcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fZGVwdGg7Ci0gICAgICBpZiAocG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHMpCi0gICAgICAgICBwbmdfcHRyLT5yb3dfaW5mby5jaGFubmVscyA9IHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzOwotI2VuZGlmCi0gICAgICBwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocG5nX3B0ci0+cm93X2luZm8uYml0X2RlcHRoICoKLSAgICAgICAgIHBuZ19wdHItPnJvd19pbmZvLmNoYW5uZWxzKTsKLSAgICAgIHBuZ19wdHItPnJvd19pbmZvLnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoLAotICAgICAgICAgcG5nX3B0ci0+cm93X2luZm8ud2lkdGgpOwotICAgfQotI2VuZGlmCi0KLX0KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpCi0vKiBVbnBhY2sgcGl4ZWxzIG9mIDEsIDIsIG9yIDQgYml0cyBwZXIgcGl4ZWwgaW50byAxIGJ5dGUgcGVyIHBpeGVsLAotICogd2l0aG91dCBjaGFuZ2luZyB0aGUgYWN0dWFsIHZhbHVlcy4gIFRodXMsIGlmIHlvdSBoYWQgYSByb3cgd2l0aAotICogYSBiaXQgZGVwdGggb2YgMSwgeW91IHdvdWxkIGVuZCB1cCB3aXRoIGJ5dGVzIHRoYXQgb25seSBjb250YWluZWQKLSAqIHRoZSBudW1iZXJzIDAgb3IgMS4gIElmIHlvdSB3b3VsZCByYXRoZXIgdGhleSBjb250YWluIDAgYW5kIDI1NSwgdXNlCi0gKiBwbmdfZG9fc2hpZnQoKSBhZnRlciB0aGlzLgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb191bnBhY2socG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3VucGFjayIpOwotI2lmIGRlZmluZWQoUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVEKQotICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYgcm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCi0jZWxzZQotICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPCA4KQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsKLQotICAgICAgc3dpdGNoIChyb3dfaW5mby0+Yml0X2RlcHRoKQotICAgICAgewotICAgICAgICAgY2FzZSAxOgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKChyb3dfd2lkdGggLSAxKSA+PiAzKTsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBzaGlmdCA9IDcgLSAoaW50KSgocm93X3dpZHRoICsgNykgJiAweDA3KTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKCpzcCA+PiBzaGlmdCkgJiAweDAxKTsKLSAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA3KQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNoaWZ0Kys7Ci0KLSAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSAyOgotICAgICAgICAgewotCi0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDIpOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHNoaWZ0ID0gKGludCkoKDMgLSAoKHJvd193aWR0aCArIDMpICYgMHgwMykpIDw8IDEpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoKnNwID4+IHNoaWZ0KSAmIDB4MDMpOwotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDYpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICBzcC0tOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMjsKLQotICAgICAgICAgICAgICAgZHAtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDEpOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHNoaWZ0ID0gKGludCkoKDEgLSAoKHJvd193aWR0aCArIDEpICYgMHgwMSkpIDw8IDIpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoKnNwID4+IHNoaWZ0KSAmIDB4MGYpOwotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDQpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICBzcC0tOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OwotCi0gICAgICAgICAgICAgICBkcC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gODsKLSAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoOCAqIHJvd19pbmZvLT5jaGFubmVscyk7Ci0gICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiByb3dfaW5mby0+Y2hhbm5lbHM7Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKQotLyogUmV2ZXJzZSB0aGUgZWZmZWN0cyBvZiBwbmdfZG9fc2hpZnQuICBUaGlzIHJvdXRpbmUgbWVyZWx5IHNoaWZ0cyB0aGUKLSAqIHBpeGVscyBiYWNrIHRvIHRoZWlyIHNpZ25pZmljYW50IGJpdHMgdmFsdWVzLiAgVGh1cywgaWYgeW91IGhhdmUKLSAqIGEgcm93IG9mIGJpdCBkZXB0aCA4LCBidXQgb25seSA1IGFyZSBzaWduaWZpY2FudCwgdGhpcyB3aWxsIHNoaWZ0Ci0gKiB0aGUgdmFsdWVzIGJhY2sgdG8gMCB0aHJvdWdoIDMxLgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb191bnNoaWZ0KHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb2xvcl84cCBzaWdfYml0cykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3Vuc2hpZnQiKTsKLSAgIGlmICgKLSNpZiBkZWZpbmVkKFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRCkKLSAgICAgICByb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMICYmIHNpZ19iaXRzICE9IE5VTEwgJiYKLSNlbmRpZgotICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICB7Ci0gICAgICBpbnQgc2hpZnRbNF07Ci0gICAgICBpbnQgY2hhbm5lbHMgPSAwOwotICAgICAgaW50IGM7Ci0gICAgICBwbmdfdWludF8xNiB2YWx1ZSA9IDA7Ci0gICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgICAgewotICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gc2lnX2JpdHMtPnJlZDsKLSAgICAgICAgIHNoaWZ0W2NoYW5uZWxzKytdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIHNpZ19iaXRzLT5ncmVlbjsKLSAgICAgICAgIHNoaWZ0W2NoYW5uZWxzKytdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIHNpZ19iaXRzLT5ibHVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgc2hpZnRbY2hhbm5lbHMrK10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gc2lnX2JpdHMtPmdyYXk7Ci0gICAgICB9Ci0gICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkKLSAgICAgIHsKLSAgICAgICAgIHNoaWZ0W2NoYW5uZWxzKytdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIHNpZ19iaXRzLT5hbHBoYTsKLSAgICAgIH0KLQotICAgICAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyspCi0gICAgICB7Ci0gICAgICAgICBpZiAoc2hpZnRbY10gPD0gMCkKLSAgICAgICAgICAgIHNoaWZ0W2NdID0gMDsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZhbHVlID0gMTsKLSAgICAgIH0KLQotICAgICAgaWYgKCF2YWx1ZSkKLSAgICAgICAgIHJldHVybjsKLQotICAgICAgc3dpdGNoIChyb3dfaW5mby0+Yml0X2RlcHRoKQotICAgICAgewotICAgICAgICAgY2FzZSAyOgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIGJwOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOwotCi0gICAgICAgICAgICBmb3IgKGJwID0gcm93LCBpID0gMDsgaSA8IGlzdG9wOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAqYnAgPj49IDE7Ci0gICAgICAgICAgICAgICAqYnArKyAmPSAweDU1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBicCA9IHJvdzsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpc3RvcCA9IHJvd19pbmZvLT5yb3dieXRlczsKLSAgICAgICAgICAgIHBuZ19ieXRlIG1hc2sgPSAocG5nX2J5dGUpKCgoKGludCkweGYwID4+IHNoaWZ0WzBdKSAmIChpbnQpMHhmMCkgfAotICAgICAgICAgICAgICAgKHBuZ19ieXRlKSgoaW50KTB4ZiA+PiBzaGlmdFswXSkpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICpicCA+Pj0gc2hpZnRbMF07Ci0gICAgICAgICAgICAgICAqYnArKyAmPSBtYXNrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNhc2UgODoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBicCA9IHJvdzsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpc3RvcCA9IHJvd193aWR0aCAqIGNoYW5uZWxzOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICpicCsrID4+PSBzaGlmdFtpJWNoYW5uZWxzXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBjYXNlIDE2OgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIGJwID0gcm93OwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gY2hhbm5lbHMgKiByb3dfd2lkdGg7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgdmFsdWUgPSAocG5nX3VpbnRfMTYpKCgqYnAgPDwgOCkgKyAqKGJwICsgMSkpOwotICAgICAgICAgICAgICAgdmFsdWUgPj49IHNoaWZ0W2klY2hhbm5lbHNdOwotICAgICAgICAgICAgICAgKmJwKysgPSAocG5nX2J5dGUpKHZhbHVlID4+IDgpOwotICAgICAgICAgICAgICAgKmJwKysgPSAocG5nX2J5dGUpKHZhbHVlICYgMHhmZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRCkKLS8qIENob3Agcm93cyBvZiBiaXQgZGVwdGggMTYgZG93biB0byA4ICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19jaG9wKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19jaG9wIik7Ci0jaWYgZGVmaW5lZChQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQpCi0gICBpZiAocm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCAmJiByb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotI2Vsc2UKLSAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgc3AgPSByb3c7Ci0gICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSByb3dfaW5mby0+d2lkdGggKiByb3dfaW5mby0+Y2hhbm5lbHM7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGk8aXN0b3A7IGkrKywgc3AgKz0gMiwgZHArKykKLSAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19SRUFEXzE2X1RPXzhfQUNDVVJBVEVfU0NBTEVfU1VQUE9SVEVEKQotICAgICAgLyogVGhpcyBkb2VzIGEgbW9yZSBhY2N1cmF0ZSBzY2FsaW5nIG9mIHRoZSAxNi1iaXQgY29sb3IKLSAgICAgICAqIHZhbHVlLCByYXRoZXIgdGhhbiBhIHNpbXBsZSBsb3ctYnl0ZSB0cnVuY2F0aW9uLgotICAgICAgICoKLSAgICAgICAqIFdoYXQgdGhlIGlkZWFsIGNhbGN1bGF0aW9uIHNob3VsZCBiZToKLSAgICAgICAqICAgKmRwID0gKCgoKChwbmdfdWludF8zMikoKnNwKSA8PCA4KSB8Ci0gICAgICAgKiAgICAgICAgICAocG5nX3VpbnRfMzIpKCooc3AgKyAxKSkpICogMjU1ICsgMTI3KQotICAgICAgICogICAgICAgICAgLyAocG5nX3VpbnRfMzIpNjU1MzVMOwotICAgICAgICoKLSAgICAgICAqIEdSUjogbm8sIEkgdGhpbmsgdGhpcyBpcyB3aGF0IGl0IHJlYWxseSBzaG91bGQgYmU6Ci0gICAgICAgKiAgICpkcCA9ICgoKCgocG5nX3VpbnRfMzIpKCpzcCkgPDwgOCkgfAotICAgICAgICogICAgICAgICAgIChwbmdfdWludF8zMikoKihzcCArIDEpKSkgKyAxMjhMKQotICAgICAgICogICAgICAgICAgIC8gKHBuZ191aW50XzMyKTI1N0w7Ci0gICAgICAgKgotICAgICAgICogR1JSOiBoZXJlJ3MgdGhlIGV4YWN0IGNhbGN1bGF0aW9uIHdpdGggc2hpZnRzOgotICAgICAgICogICB0ZW1wID0gKCgocG5nX3VpbnRfMzIpKCpzcCkgPDwgOCkgfAotICAgICAgICogICAgICAgICAgIChwbmdfdWludF8zMikoKihzcCArIDEpKSkgKyAxMjhMOwotICAgICAgICogICAqZHAgPSAodGVtcCAtICh0ZW1wID4+IDgpKSA+PiA4OwotICAgICAgICoKLSAgICAgICAqIEFwcHJveGltYXRlIGNhbGN1bGF0aW9uIHdpdGggc2hpZnQvYWRkIGluc3RlYWQgb2YgbXVsdGlwbHkvZGl2aWRlOgotICAgICAgICogICAqZHAgPSAoKCgocG5nX3VpbnRfMzIpKCpzcCkgPDwgOCkgfAotICAgICAgICogICAgICAgICAgKHBuZ191aW50XzMyKSgoaW50KSgqKHNwICsgMSkpIC0gKnNwKSkgKyAxMjgpID4+IDg7Ci0gICAgICAgKgotICAgICAgICogV2hhdCB3ZSBhY3R1YWxseSBkbyB0byBhdm9pZCBleHRyYSBzaGlmdGluZyBhbmQgY29udmVyc2lvbjoKLSAgICAgICAqLwotCi0gICAgICAgICAqZHAgPSAqc3AgKyAoKCgoaW50KSgqKHNwICsgMSkpIC0gKnNwKSA+IDEyOCkgPyAxIDogMCk7Ci0jZWxzZQotICAgICAgIC8qIFNpbXBseSBkaXNjYXJkIHRoZSBsb3cgb3JkZXIgYnl0ZSAqLwotICAgICAgICAgKmRwID0gKnNwOwotI2VuZGlmCi0gICAgICB9Ci0gICAgICByb3dfaW5mby0+Yml0X2RlcHRoID0gODsKLSAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoOCAqIHJvd19pbmZvLT5jaGFubmVscyk7Ci0gICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfaW5mby0+d2lkdGggKiByb3dfaW5mby0+Y2hhbm5lbHM7Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19yZWFkX3N3YXBfYWxwaGEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3JlYWRfc3dhcF9hbHBoYSIpOwotI2lmIGRlZmluZWQoUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVEKQotICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwpCi0jZW5kaWYKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLSAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gUkdCQSB0byBBUkdCICovCi0gICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7Ci0gICAgICAgICAgICBwbmdfYnl0ZSBzYXZlOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc2F2ZSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gc2F2ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBSUkdHQkJBQSB0byBBQVJSR0dCQiAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7Ci0gICAgICAgICAgICBwbmdfYnl0ZSBzYXZlWzJdOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc2F2ZVswXSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICBzYXZlWzFdID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSBzYXZlWzBdOwotICAgICAgICAgICAgICAgKigtLWRwKSA9IHNhdmVbMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgewotICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEdBIHRvIEFHICovCi0gICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7Ci0gICAgICAgICAgICBwbmdfYnl0ZSBzYXZlOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc2F2ZSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSBzYXZlOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEdHQUEgdG8gQUFHRyAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7Ci0gICAgICAgICAgICBwbmdfYnl0ZSBzYXZlWzJdOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc2F2ZVswXSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICBzYXZlWzFdID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gc2F2ZVswXTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSBzYXZlWzFdOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19yZWFkX2ludmVydF9hbHBoYShwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmVhZF9pbnZlcnRfYWxwaGEiKTsKLSNpZiBkZWZpbmVkKFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRCkKLSAgIGlmIChyb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMKQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0gICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgewotICAgICAgICAgLyogVGhpcyBpbnZlcnRzIHRoZSBhbHBoYSBjaGFubmVsIGluIFJHQkEgKi8KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAocG5nX2J5dGUpKDI1NSAtICooLS1zcCkpOwotCi0vKiAgICAgICAgICAgICBUaGlzIGRvZXMgbm90aGluZzoKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgIFdlIGNhbiByZXBsYWNlIGl0IHdpdGg6Ci0qLwotICAgICAgICAgICAgICAgc3AtPTM7Ci0gICAgICAgICAgICAgICBkcD1zcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBSUkdHQkJBQSAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgcm93X2luZm8tPnJvd2J5dGVzOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3A7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKHBuZ19ieXRlKSgyNTUgLSAqKC0tc3ApKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAocG5nX2J5dGUpKDI1NSAtICooLS1zcCkpOwotCi0vKiAgICAgICAgICAgICBUaGlzIGRvZXMgbm90aGluZzoKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgIFdlIGNhbiByZXBsYWNlIGl0IHdpdGg6Ci0qLwotICAgICAgICAgICAgICAgc3AtPTY7Ci0gICAgICAgICAgICAgICBkcD1zcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gR0EgKi8KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyByb3dfaW5mby0+cm93Ynl0ZXM7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAocG5nX2J5dGUpKDI1NSAtICooLS1zcCkpOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gR0dBQSAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwICA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKigtLWRwKSA9IChwbmdfYnl0ZSkoMjU1IC0gKigtLXNwKSk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKHBuZ19ieXRlKSgyNTUgLSAqKC0tc3ApKTsKLS8qCi0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotKi8KLSAgICAgICAgICAgICAgIHNwLT0yOwotICAgICAgICAgICAgICAgZHA9c3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkKLS8qIEFkZCBmaWxsZXIgY2hhbm5lbCBpZiB3ZSBoYXZlIFJHQiBjb2xvciAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fcmVhZF9maWxsZXIocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ191aW50XzMyIGZpbGxlciwgcG5nX3VpbnRfMzIgZmxhZ3MpCi17Ci0gICBwbmdfdWludF8zMiBpOwotICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotCi0gICBwbmdfYnl0ZSBoaV9maWxsZXIgPSAocG5nX2J5dGUpKChmaWxsZXI+PjgpICYgMHhmZik7Ci0gICBwbmdfYnl0ZSBsb19maWxsZXIgPSAocG5nX2J5dGUpKGZpbGxlciAmIDB4ZmYpOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19yZWFkX2ZpbGxlciIpOwotICAgaWYgKAotI2lmIGRlZmluZWQoUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVEKQotICAgICAgIHJvdyAhPSBOVUxMICAmJiByb3dfaW5mbyAhPSBOVUxMICYmCi0jZW5kaWYKLSAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgewotICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIEcgdG8gR1ggKi8KLSAgICAgICAgIGlmIChmbGFncyAmIFBOR19GTEFHX0ZJTExFUl9BRlRFUikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aDsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9ICBzcCArIChwbmdfc2l6ZV90KXJvd193aWR0aDsKLSAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7Ci0gICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSAyOwotICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gMTY7Ci0gICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiAyOwotICAgICAgICAgfQotICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gRyB0byBYRyAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDE2OwotICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogMjsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGNoYW5nZXMgdGhlIGRhdGEgZnJvbSBHRyB0byBHR1hYICovCi0gICAgICAgICBpZiAoZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsKLSAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSBoaV9maWxsZXI7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooLS1kcCkgPSBoaV9maWxsZXI7Ci0gICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOwotICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDMyOwotICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogNDsKLSAgICAgICAgIH0KLSAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgZGF0YSBmcm9tIEdHIHRvIFhYR0cgKi8KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDI7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSBoaV9maWxsZXI7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDMyOwotICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogNDsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0gLyogQ09MT1JfVFlQRSA9PSBHUkFZICovCi0gICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICB7Ci0gICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgewotICAgICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gUkdCIHRvIFJHQlggKi8KLSAgICAgICAgIGlmIChmbGFncyAmIFBOR19GTEFHX0ZJTExFUl9BRlRFUikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDM7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGg7Ci0gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7Ci0gICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7Ci0gICAgICAgICB9Ci0gICAgICAvKiBUaGlzIGNoYW5nZXMgdGhlIGRhdGEgZnJvbSBSR0IgdG8gWFJHQiAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMzsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9IGxvX2ZpbGxlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7Ci0gICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAzMjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDQ7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotICAgICAgewotICAgICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gUlJHR0JCIHRvIFJSR0dCQlhYICovCi0gICAgICAgICBpZiAoZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiA2OwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsKLSAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSBoaV9maWxsZXI7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKigtLWRwKSA9IGhpX2ZpbGxlcjsKLSAgICAgICAgICAgICooLS1kcCkgPSBsb19maWxsZXI7Ci0gICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gNjQ7Ci0gICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiA4OwotICAgICAgICAgfQotICAgICAgICAgLyogVGhpcyBjaGFuZ2VzIHRoZSBkYXRhIGZyb20gUlJHR0JCIHRvIFhYUlJHR0JCICovCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiA2OwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSAqKC0tc3ApOwotICAgICAgICAgICAgICAgKigtLWRwKSA9ICooLS1zcCk7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gKigtLXNwKTsKLSAgICAgICAgICAgICAgICooLS1kcCkgPSBoaV9maWxsZXI7Ci0gICAgICAgICAgICAgICAqKC0tZHApID0gbG9fZmlsbGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gNDsKLSAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDY0OwotICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogODsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0gLyogQ09MT1JfVFlQRSA9PSBSR0IgKi8KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQpCi0vKiBFeHBhbmQgZ3JheXNjYWxlIGZpbGVzIHRvIFJHQiwgd2l0aCBvciB3aXRob3V0IGFscGhhICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19ncmF5X3RvX3JnYihwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQotewotICAgcG5nX3VpbnRfMzIgaTsKLSAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fZ3JheV90b19yZ2IiKTsKLSAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID49IDggJiYKLSNpZiBkZWZpbmVkKFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRCkKLSAgICAgICByb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMICYmCi0jZW5kaWYKLSAgICAgICEocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpCi0gICB7Ci0gICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gc3AgICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMjsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOwotICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyIC0gMTsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHNwICArIChwbmdfc2l6ZV90KXJvd193aWR0aCAqIDQ7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOwotICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AgLSAxKTsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcCAtIDEpOwotICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogMiAtIDE7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiAyOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKnNwOwotICAgICAgICAgICAgICAgKihkcC0tKSA9ICpzcDsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwLS0pOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoICogNCAtIDE7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSBzcCAgKyAocG5nX3NpemVfdClyb3dfd2lkdGggKiA0OwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKihkcC0tKSA9ICooc3AtLSk7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqc3A7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcCAtIDEpOwotICAgICAgICAgICAgICAgKihkcC0tKSA9ICpzcDsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwIC0gMSk7Ci0gICAgICAgICAgICAgICAqKGRwLS0pID0gKihzcC0tKTsKLSAgICAgICAgICAgICAgICooZHAtLSkgPSAqKHNwLS0pOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgcm93X2luZm8tPmNoYW5uZWxzICs9IChwbmdfYnl0ZSkyOwotICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgfD0gUE5HX0NPTE9SX01BU0tfQ09MT1I7Ci0gICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5jaGFubmVscyAqCi0gICAgICAgICByb3dfaW5mby0+Yml0X2RlcHRoKTsKLSAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsIHJvd193aWR0aCk7Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKQotLyogUmVkdWNlIFJHQiBmaWxlcyB0byBncmF5c2NhbGUsIHdpdGggb3Igd2l0aG91dCBhbHBoYQotICogdXNpbmcgdGhlIGVxdWF0aW9uIGdpdmVuIGluIFBveW50b24ncyBDb2xvckZBUSBhdAotICogPGh0dHA6Ly93d3cuaW5mb3JhbXAubmV0L35wb3ludG9uLz4gIChUSElTIExJTksgSVMgREVBRCBKdW5lIDIwMDgpCi0gKiBOZXcgbGluazoKLSAqIDxodHRwOi8vd3d3LnBveW50b24uY29tL25vdGVzL2NvbG91cl9hbmRfZ2FtbWEvPgotICogQ2hhcmxlcyBQb3ludG9uIHBveW50b24gYXQgcG95bnRvbi5jb20KLSAqCi0gKiAgICAgWSA9IDAuMjEyNjcxICogUiArIDAuNzE1MTYwICogRyArIDAuMDcyMTY5ICogQgotICoKLSAqICBXZSBhcHByb3hpbWF0ZSB0aGlzIHdpdGgKLSAqCi0gKiAgICAgWSA9IDAuMjEyNjggKiBSICAgICsgMC43MTUxICogRyAgICArIDAuMDcyMTcgKiBCCi0gKgotICogIHdoaWNoIGNhbiBiZSBleHByZXNzZWQgd2l0aCBpbnRlZ2VycyBhcwotICoKLSAqICAgICBZID0gKDY5NjkgKiBSICsgMjM0MzQgKiBHICsgMjM2NSAqIEIpLzMyNzY4Ci0gKgotICogIFRoZSBjYWxjdWxhdGlvbiBpcyB0byBiZSBkb25lIGluIGEgbGluZWFyIGNvbG9yc3BhY2UuCi0gKgotICogIE90aGVyIGludGVnZXIgY29lZmZpY2VudHMgY2FuIGJlIHVzZWQgdmlhIHBuZ19zZXRfcmdiX3RvX2dyYXkoKS4KLSAqLwotaW50IC8qIFBSSVZBVEUgKi8KLXBuZ19kb19yZ2JfdG9fZ3JheShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQotCi17Ci0gICBwbmdfdWludF8zMiBpOwotCi0gICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0gICBpbnQgcmdiX2Vycm9yID0gMDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmdiX3RvX2dyYXkiKTsKLSAgIGlmICgKLSNpZiBkZWZpbmVkKFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRCkKLSAgICAgICByb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMICYmCi0jZW5kaWYKLSAgICAgIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSkKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIHJjID0gcG5nX3B0ci0+cmdiX3RvX2dyYXlfcmVkX2NvZWZmOwotICAgICAgcG5nX3VpbnRfMzIgZ2MgPSBwbmdfcHRyLT5yZ2JfdG9fZ3JheV9ncmVlbl9jb2VmZjsKLSAgICAgIHBuZ191aW50XzMyIGJjID0gcG5nX3B0ci0+cmdiX3RvX2dyYXlfYmx1ZV9jb2VmZjsKLQotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKLSAgICAgIHsKLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+Z2FtbWFfZnJvbV8xICE9IE5VTEwgJiYgcG5nX3B0ci0+Z2FtbWFfdG9fMSAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93OwotICAgICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OwotCi0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfYnl0ZSByZWQgICA9IHBuZ19wdHItPmdhbW1hX3RvXzFbKihzcCsrKV07Ci0gICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBncmVlbiA9IHBuZ19wdHItPmdhbW1hX3RvXzFbKihzcCsrKV07Ci0gICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBibHVlICA9IHBuZ19wdHItPmdhbW1hX3RvXzFbKihzcCsrKV07Ci0gICAgICAgICAgICAgICAgICBpZiAocmVkICE9IGdyZWVuIHx8IHJlZCAhPSBibHVlKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcmdiX2Vycm9yIHw9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAqKGRwKyspID0gcG5nX3B0ci0+Z2FtbWFfZnJvbV8xWwotICAgICAgICAgICAgICAgICAgICAgICAocmMqcmVkICsgZ2MqZ3JlZW4gKyBiYypibHVlKT4+MTVdOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3AgLSAxKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93OwotICAgICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgcmVkICAgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgZ3JlZW4gPSAqKHNwKyspOwotICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgYmx1ZSAgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgICAgaWYgKHJlZCAhPSBncmVlbiB8fCByZWQgIT0gYmx1ZSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHJnYl9lcnJvciB8PSAxOwotICAgICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSk+PjE1KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwIC0gMSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UgLyogUkdCIGJpdF9kZXB0aCA9PSAxNiAqLwotICAgICAgICAgewotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgICAgICAgICAgaWYgKHBuZ19wdHItPmdhbW1hXzE2X3RvXzEgIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93OwotICAgICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgcmVkLCBncmVlbiwgYmx1ZSwgdzsKLQotICAgICAgICAgICAgICAgICAgcmVkICAgPSAocG5nX3VpbnRfMTYpKCgoKihzcCkpPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKLSAgICAgICAgICAgICAgICAgIGdyZWVuID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7Ci0gICAgICAgICAgICAgICAgICBibHVlICA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOwotCi0gICAgICAgICAgICAgICAgICBpZiAocmVkID09IGdyZWVuICYmIHJlZCA9PSBibHVlKQotICAgICAgICAgICAgICAgICAgICAgdyA9IHJlZDsKLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHJlZF8xICAgPSBwbmdfcHRyLT5nYW1tYV8xNl90b18xWyhyZWQmMHhmZikgPj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdF1bcmVkPj44XTsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGdyZWVuXzEgPSBwbmdfcHRyLT5nYW1tYV8xNl90b18xWyhncmVlbiYweGZmKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtncmVlbj4+OF07Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBibHVlXzEgID0gcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVsoYmx1ZSYweGZmKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtibHVlPj44XTsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGdyYXkxNiAgPSAocG5nX3VpbnRfMTYpKChyYypyZWRfMSArIGdjKmdyZWVuXzEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJjKmJsdWVfMSk+PjE1KTsKLSAgICAgICAgICAgICAgICAgICAgIHcgPSBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzFbKGdyYXkxNiYweGZmKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtncmF5MTYgPj4gOF07Ci0gICAgICAgICAgICAgICAgICAgICByZ2JfZXJyb3IgfD0gMTsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoKHc+PjgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSh3ICYgMHhmZik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHJlZCwgZ3JlZW4sIGJsdWUsIGdyYXkxNjsKLQotICAgICAgICAgICAgICAgICAgcmVkICAgPSAocG5nX3VpbnRfMTYpKCgoKihzcCkpPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKLSAgICAgICAgICAgICAgICAgIGdyZWVuID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7Ci0gICAgICAgICAgICAgICAgICBibHVlICA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOwotCi0gICAgICAgICAgICAgICAgICBpZiAocmVkICE9IGdyZWVuIHx8IHJlZCAhPSBibHVlKQotICAgICAgICAgICAgICAgICAgICAgcmdiX2Vycm9yIHw9IDE7Ci0gICAgICAgICAgICAgICAgICBncmF5MTYgID0gKHBuZ191aW50XzE2KSgocmMqcmVkICsgZ2MqZ3JlZW4gKyBiYypibHVlKT4+MTUpOwotICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoKGdyYXkxNj4+OCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKGdyYXkxNiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+Z2FtbWFfZnJvbV8xICE9IE5VTEwgJiYgcG5nX3B0ci0+Z2FtbWFfdG9fMSAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93OwotICAgICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgcmVkICAgPSBwbmdfcHRyLT5nYW1tYV90b18xWyooc3ArKyldOwotICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgZ3JlZW4gPSBwbmdfcHRyLT5nYW1tYV90b18xWyooc3ArKyldOwotICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgYmx1ZSAgPSBwbmdfcHRyLT5nYW1tYV90b18xWyooc3ArKyldOwotICAgICAgICAgICAgICAgICAgaWYgKHJlZCAhPSBncmVlbiB8fCByZWQgIT0gYmx1ZSkKLSAgICAgICAgICAgICAgICAgICAgIHJnYl9lcnJvciB8PSAxOwotICAgICAgICAgICAgICAgICAgKihkcCsrKSA9ICBwbmdfcHRyLT5nYW1tYV9mcm9tXzEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhyYypyZWQgKyBnYypncmVlbiArIGJjKmJsdWUpPj4xNV07Ci0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsgIC8qIGFscGhhICovCi0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHJlZCAgID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGJsdWUgID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICAgIGlmIChyZWQgIT0gZ3JlZW4gfHwgcmVkICE9IGJsdWUpCi0gICAgICAgICAgICAgICAgICAgICByZ2JfZXJyb3IgfD0gMTsKLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAgKHBuZ19ieXRlKSgocmMqcmVkICsgZ2MqZ3JlZW4gKyBiYypibHVlKT4+MTUpOwotICAgICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7ICAvKiBhbHBoYSAqLwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgZWxzZSAvKiBSR0JBIGJpdF9kZXB0aCA9PSAxNiAqLwotICAgICAgICAgewotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotICAgICAgICAgICAgaWYgKHBuZ19wdHItPmdhbW1hXzE2X3RvXzEgIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93OwotICAgICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgcmVkLCBncmVlbiwgYmx1ZSwgdzsKLQotICAgICAgICAgICAgICAgICAgcmVkICAgPSAocG5nX3VpbnRfMTYpKCgoKihzcCkpPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKLSAgICAgICAgICAgICAgICAgIGdyZWVuID0gKHBuZ191aW50XzE2KSgoKCooc3ApKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7Ci0gICAgICAgICAgICAgICAgICBibHVlICA9IChwbmdfdWludF8xNikoKCgqKHNwKSk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOwotCi0gICAgICAgICAgICAgICAgICBpZiAocmVkID09IGdyZWVuICYmIHJlZCA9PSBibHVlKQotICAgICAgICAgICAgICAgICAgICAgdyA9IHJlZDsKLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHJlZF8xICAgPSBwbmdfcHRyLT5nYW1tYV8xNl90b18xWyhyZWQmMHhmZikgPj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdF1bcmVkPj44XTsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGdyZWVuXzEgPSBwbmdfcHRyLT5nYW1tYV8xNl90b18xWyhncmVlbiYweGZmKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtncmVlbj4+OF07Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBibHVlXzEgID0gcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMVsoYmx1ZSYweGZmKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtibHVlPj44XTsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGdyYXkxNiAgPSAocG5nX3VpbnRfMTYpKChyYyAqIHJlZF8xCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnYyAqIGdyZWVuXzEgKyBiYyAqIGJsdWVfMSk+PjE1KTsKLSAgICAgICAgICAgICAgICAgICAgIHcgPSBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzFbKGdyYXkxNiYweGZmKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hX3NoaWZ0XVtncmF5MTYgPj4gOF07Ci0gICAgICAgICAgICAgICAgICAgICByZ2JfZXJyb3IgfD0gMTsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoKHc+PjgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSh3ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsgIC8qIGFscGhhICovCi0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93OwotICAgICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgcmVkLCBncmVlbiwgYmx1ZSwgZ3JheTE2OwotICAgICAgICAgICAgICAgICAgcmVkICAgPSAocG5nX3VpbnRfMTYpKCgqKHNwKTw8OCkgfCAqKHNwKzEpKTsgc3ArPTI7Ci0gICAgICAgICAgICAgICAgICBncmVlbiA9IChwbmdfdWludF8xNikoKCooc3ApPDw4KSB8ICooc3ArMSkpOyBzcCs9MjsKLSAgICAgICAgICAgICAgICAgIGJsdWUgID0gKHBuZ191aW50XzE2KSgoKihzcCk8PDgpIHwgKihzcCsxKSk7IHNwKz0yOwotICAgICAgICAgICAgICAgICAgaWYgKHJlZCAhPSBncmVlbiB8fCByZWQgIT0gYmx1ZSkKLSAgICAgICAgICAgICAgICAgICAgIHJnYl9lcnJvciB8PSAxOwotICAgICAgICAgICAgICAgICAgZ3JheTE2ICA9IChwbmdfdWludF8xNikoKHJjKnJlZCArIGdjKmdyZWVuICsgYmMqYmx1ZSk+PjE1KTsKLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAocG5nX2J5dGUpKChncmF5MTY+PjgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKShncmF5MTYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOyAgLyogYWxwaGEgKi8KLSAgICAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgcm93X2luZm8tPmNoYW5uZWxzIC09IChwbmdfYnl0ZSkyOwotICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgJj0gflBOR19DT0xPUl9NQVNLX0NPTE9SOwotICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShyb3dfaW5mby0+Y2hhbm5lbHMgKgotICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCk7Ci0gICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCByb3dfd2lkdGgpOwotICAgfQotICAgcmV0dXJuIHJnYl9lcnJvcjsKLX0KLSNlbmRpZgotCi0vKiBCdWlsZCBhIGdyYXlzY2FsZSBwYWxldHRlLiAgUGFsZXR0ZSBpcyBhc3N1bWVkIHRvIGJlIDEgPDwgYml0X2RlcHRoCi0gKiBsYXJnZSBvZiBwbmdfY29sb3IuICBUaGlzIGxldHMgZ3JheXNjYWxlIGltYWdlcyBiZSB0cmVhdGVkIGFzCi0gKiBwYWxldHRlZC4gIE1vc3QgdXNlZnVsIGZvciBnYW1tYSBjb3JyZWN0aW9uIGFuZCBzaW1wbGlmaWNhdGlvbgotICogb2YgY29kZS4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19idWlsZF9ncmF5c2NhbGVfcGFsZXR0ZShpbnQgYml0X2RlcHRoLCBwbmdfY29sb3JwIHBhbGV0dGUpCi17Ci0gICBpbnQgbnVtX3BhbGV0dGU7Ci0gICBpbnQgY29sb3JfaW5jOwotICAgaW50IGk7Ci0gICBpbnQgdjsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUiKTsKLSAgIGlmIChwYWxldHRlID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHN3aXRjaCAoYml0X2RlcHRoKQotICAgewotICAgICAgY2FzZSAxOgotICAgICAgICAgbnVtX3BhbGV0dGUgPSAyOwotICAgICAgICAgY29sb3JfaW5jID0gMHhmZjsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDI6Ci0gICAgICAgICBudW1fcGFsZXR0ZSA9IDQ7Ci0gICAgICAgICBjb2xvcl9pbmMgPSAweDU1OwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgNDoKLSAgICAgICAgIG51bV9wYWxldHRlID0gMTY7Ci0gICAgICAgICBjb2xvcl9pbmMgPSAweDExOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgODoKLSAgICAgICAgIG51bV9wYWxldHRlID0gMjU2OwotICAgICAgICAgY29sb3JfaW5jID0gMTsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICAgbnVtX3BhbGV0dGUgPSAwOwotICAgICAgICAgY29sb3JfaW5jID0gMDsKLSAgICAgICAgIGJyZWFrOwotICAgfQotCi0gICBmb3IgKGkgPSAwLCB2ID0gMDsgaSA8IG51bV9wYWxldHRlOyBpKyssIHYgKz0gY29sb3JfaW5jKQotICAgewotICAgICAgcGFsZXR0ZVtpXS5yZWQgPSAocG5nX2J5dGUpdjsKLSAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSAocG5nX2J5dGUpdjsKLSAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IChwbmdfYnl0ZSl2OwotICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSB1bnVzZWQuICBEbyB3ZSByZWFsbHkgbmVlZCBpdD8gKi8KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0NPUlJFQ1RfUEFMRVRURV9TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19jb3JyZWN0X3BhbGV0dGUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbG9ycCBwYWxldHRlLAotICAgaW50IG51bV9wYWxldHRlKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY29ycmVjdF9wYWxldHRlIik7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgJiYgXAotICAgIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgKFBOR19HQU1NQSB8IFBOR19CQUNLR1JPVU5EKSkKLSAgIHsKLSAgICAgIHBuZ19jb2xvciBiYWNrLCBiYWNrXzE7Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hX3R5cGUgPT0gUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRSkKLSAgICAgIHsKLSAgICAgICAgIGJhY2sucmVkID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcG5nX3B0ci0+YmFja2dyb3VuZC5yZWRdOwotICAgICAgICAgYmFjay5ncmVlbiA9IHBuZ19wdHItPmdhbW1hX3RhYmxlW3BuZ19wdHItPmJhY2tncm91bmQuZ3JlZW5dOwotICAgICAgICAgYmFjay5ibHVlID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcG5nX3B0ci0+YmFja2dyb3VuZC5ibHVlXTsKLQotICAgICAgICAgYmFja18xLnJlZCA9IHBuZ19wdHItPmdhbW1hX3RvXzFbcG5nX3B0ci0+YmFja2dyb3VuZC5yZWRdOwotICAgICAgICAgYmFja18xLmdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuXTsKLSAgICAgICAgIGJhY2tfMS5ibHVlID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVtwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWVdOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgZG91YmxlIGc7Ci0KLSAgICAgICAgIGcgPSAxLjAgLyAocG5nX3B0ci0+YmFja2dyb3VuZF9nYW1tYSAqIHBuZ19wdHItPnNjcmVlbl9nYW1tYSk7Ci0KLSAgICAgICAgIGlmIChwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hX3R5cGUgPT0gUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOIHx8Ci0gICAgICAgICAgICAgZmFicyhnIC0gMS4wKSA8IFBOR19HQU1NQV9USFJFU0hPTEQpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBiYWNrLnJlZCA9IHBuZ19wdHItPmJhY2tncm91bmQucmVkOwotICAgICAgICAgICAgYmFjay5ncmVlbiA9IHBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW47Ci0gICAgICAgICAgICBiYWNrLmJsdWUgPSBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWU7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBiYWNrLnJlZCA9Ci0gICAgICAgICAgICAgICAocG5nX2J5dGUpKHBvdygoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQucmVkLzI1NSwgZykgKgotICAgICAgICAgICAgICAgIDI1NS4wICsgMC41KTsKLSAgICAgICAgICAgIGJhY2suZ3JlZW4gPQotICAgICAgICAgICAgICAgKHBuZ19ieXRlKShwb3coKGRvdWJsZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuLzI1NSwgZykgKgotICAgICAgICAgICAgICAgIDI1NS4wICsgMC41KTsKLSAgICAgICAgICAgIGJhY2suYmx1ZSA9Ci0gICAgICAgICAgICAgICAocG5nX2J5dGUpKHBvdygoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuYmx1ZS8yNTUsIGcpICoKLSAgICAgICAgICAgICAgICAyNTUuMCArIDAuNSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGcgPSAxLjAgLyBwbmdfcHRyLT5iYWNrZ3JvdW5kX2dhbW1hOwotCi0gICAgICAgICBiYWNrXzEucmVkID0KLSAgICAgICAgICAgIChwbmdfYnl0ZSkocG93KChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQvMjU1LCBnKSAqCi0gICAgICAgICAgICAgMjU1LjAgKyAwLjUpOwotICAgICAgICAgYmFja18xLmdyZWVuID0KLSAgICAgICAgICAgIChwbmdfYnl0ZSkocG93KChkb3VibGUpcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbi8yNTUsIGcpICoKLSAgICAgICAgICAgICAyNTUuMCArIDAuNSk7Ci0gICAgICAgICBiYWNrXzEuYmx1ZSA9Ci0gICAgICAgICAgICAocG5nX2J5dGUpKHBvdygoZG91YmxlKXBuZ19wdHItPmJhY2tncm91bmQuYmx1ZS8yNTUsIGcpICoKLSAgICAgICAgICAgICAyNTUuMCArIDAuNSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHBuZ191aW50XzMyKW51bV9wYWxldHRlOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA8IHBuZ19wdHItPm51bV90cmFucyAmJiBwbmdfcHRyLT50cmFuc1tpXSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IGJhY2s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpIDwgcG5nX3B0ci0+bnVtX3RyYW5zICYmIHBuZ19wdHItPnRyYW5zW2ldICE9IDB4ZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZSB2LCB3OwotCi0gICAgICAgICAgICAgICB2ID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVtwbmdfcHRyLT5wYWxldHRlW2ldLnJlZF07Ci0gICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIHBuZ19wdHItPnRyYW5zW2ldLCBiYWNrXzEucmVkKTsKLSAgICAgICAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gcG5nX3B0ci0+Z2FtbWFfZnJvbV8xW3ddOwotCi0gICAgICAgICAgICAgICB2ID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVtwbmdfcHRyLT5wYWxldHRlW2ldLmdyZWVuXTsKLSAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUodywgdiwgcG5nX3B0ci0+dHJhbnNbaV0sIGJhY2tfMS5ncmVlbik7Ci0gICAgICAgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfZnJvbV8xW3ddOwotCi0gICAgICAgICAgICAgICB2ID0gcG5nX3B0ci0+Z2FtbWFfdG9fMVtwbmdfcHRyLT5wYWxldHRlW2ldLmJsdWVdOwotICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSh3LCB2LCBwbmdfcHRyLT50cmFuc1tpXSwgYmFja18xLmJsdWUpOwotICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gcG5nX3B0ci0+Z2FtbWFfZnJvbV8xW3ddOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLnJlZF07Ci0gICAgICAgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5ncmVlbl07Ci0gICAgICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmJsdWVdOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhbGV0dGVbaV0ucmVkID09IChwbmdfYnl0ZSlwbmdfcHRyLT50cmFuc192YWx1ZXMuZ3JheSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBhbGV0dGVbaV0gPSBiYWNrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLnJlZF07Ci0gICAgICAgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5ncmVlbl07Ci0gICAgICAgICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmJsdWVdOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgfQotICAgZWxzZQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dBTU1BKQotICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFsZXR0ZTsgaSsrKQotICAgICAgewotICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLnJlZF07Ci0gICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcG5nX3B0ci0+Z2FtbWFfdGFibGVbcGFsZXR0ZVtpXS5ncmVlbl07Ci0gICAgICAgICBwYWxldHRlW2ldLmJsdWUgPSBwbmdfcHRyLT5nYW1tYV90YWJsZVtwYWxldHRlW2ldLmJsdWVdOwotICAgICAgfQotICAgfQotI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0gICBlbHNlCi0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JBQ0tHUk9VTkQpCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgewotICAgICAgICAgcG5nX2NvbG9yIGJhY2s7Ci0KLSAgICAgICAgIGJhY2sucmVkICAgPSAocG5nX2J5dGUpcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQ7Ci0gICAgICAgICBiYWNrLmdyZWVuID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuZ3JlZW47Ci0gICAgICAgICBiYWNrLmJsdWUgID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuYmx1ZTsKLQotICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpcG5nX3B0ci0+bnVtX3RyYW5zOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNbaV0gPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gYmFjay5yZWQ7Ci0gICAgICAgICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gYmFjay5ncmVlbjsKLSAgICAgICAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IGJhY2suYmx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBuZ19wdHItPnRyYW5zW2ldICE9IDB4ZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHBhbGV0dGVbaV0ucmVkLCBwbmdfcHRyLT5wYWxldHRlW2ldLnJlZCwKLSAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnRyYW5zW2ldLCBiYWNrLnJlZCk7Ci0gICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHBhbGV0dGVbaV0uZ3JlZW4sIHBuZ19wdHItPnBhbGV0dGVbaV0uZ3JlZW4sCi0gICAgICAgICAgICAgICAgICBwbmdfcHRyLT50cmFuc1tpXSwgYmFjay5ncmVlbik7Ci0gICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHBhbGV0dGVbaV0uYmx1ZSwgcG5nX3B0ci0+cGFsZXR0ZVtpXS5ibHVlLAotICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+dHJhbnNbaV0sIGJhY2suYmx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8qIEFzc3VtZSBncmF5c2NhbGUgcGFsZXR0ZSAod2hhdCBlbHNlIGNvdWxkIGl0IGJlPykgKi8KLSAgICAgIHsKLSAgICAgICAgIGludCBpOwotCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbGV0dGU7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpID09IChwbmdfYnl0ZSlwbmdfcHRyLT50cmFuc192YWx1ZXMuZ3JheSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQucmVkOwotICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IChwbmdfYnl0ZSlwbmdfcHRyLT5iYWNrZ3JvdW5kLmdyZWVuOwotICAgICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlID0gKHBuZ19ieXRlKXBuZ19wdHItPmJhY2tncm91bmQuYmx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKQotLyogUmVwbGFjZSBhbnkgYWxwaGEgb3IgdHJhbnNwYXJlbmN5IHdpdGggdGhlIHN1cHBsaWVkIGJhY2tncm91bmQgY29sb3IuCi0gKiAiYmFja2dyb3VuZCIgaXMgYWxyZWFkeSBpbiB0aGUgc2NyZWVuIGdhbW1hLCB3aGlsZSAiYmFja2dyb3VuZF8xIiBpcwotICogYXQgYSBnYW1tYSBvZiAxLjAuICBQYWxldHRlZCBmaWxlcyBoYXZlIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlIG9mLgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19iYWNrZ3JvdW5kKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCi0gICBwbmdfY29sb3JfMTZwIHRyYW5zX3ZhbHVlcywgcG5nX2NvbG9yXzE2cCBiYWNrZ3JvdW5kCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0gICAsIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZF8xLAotICAgcG5nX2J5dGVwIGdhbW1hX3RhYmxlLCBwbmdfYnl0ZXAgZ2FtbWFfZnJvbV8xLCBwbmdfYnl0ZXAgZ2FtbWFfdG9fMSwKLSAgIHBuZ191aW50XzE2cHAgZ2FtbWFfMTYsIHBuZ191aW50XzE2cHAgZ2FtbWFfMTZfZnJvbV8xLAotICAgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90b18xLCBpbnQgZ2FtbWFfc2hpZnQKLSNlbmRpZgotICAgKQotewotICAgcG5nX2J5dGVwIHNwLCBkcDsKLSAgIHBuZ191aW50XzMyIGk7Ci0gICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOwotICAgaW50IHNoaWZ0OwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19iYWNrZ3JvdW5kIik7Ci0gICBpZiAoYmFja2dyb3VuZCAhPSBOVUxMICYmCi0jaWYgZGVmaW5lZChQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQpCi0gICAgICAgcm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCAmJgotI2VuZGlmCi0gICAgICAoIShyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSB8fAotICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYgdHJhbnNfdmFsdWVzKSkpCi0gICB7Ci0gICAgICBzd2l0Y2ggKHJvd19pbmZvLT5jb2xvcl90eXBlKQotICAgICAgewotICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOgotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChyb3dfaW5mby0+Yml0X2RlcHRoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IDc7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoKHBuZ191aW50XzE2KSgoKnNwID4+IHNoaWZ0KSAmIDB4MDEpCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSB0cmFuc192YWx1ZXMtPmdyYXkpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqc3AgJj0gKHBuZ19ieXRlKSgoMHg3ZjdmID4+ICg3IC0gc2hpZnQpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKnNwIHw9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Z3JheSA8PCBzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA3OwotICAgICAgICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0LS07Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgewotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKQotICAgICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RhYmxlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNjsKLSAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocG5nX3VpbnRfMTYpKCgqc3AgPj4gc2hpZnQpICYgMHgwMykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSB0cmFuc192YWx1ZXMtPmdyYXkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgJj0gKHBuZ19ieXRlKSgoMHgzZjNmID4+ICg2IC0gc2hpZnQpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwIHw9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Z3JheSA8PCBzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBwID0gKHBuZ19ieXRlKSgoKnNwID4+IHNoaWZ0KSAmIDB4MDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgZyA9IChwbmdfYnl0ZSkoKGdhbW1hX3RhYmxlIFtwIHwgKHAgPDwgMikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwIDw8IDQpIHwgKHAgPDwgNildID4+IDYpICYgMHgwMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgJj0gKHBuZ19ieXRlKSgoMHgzZjNmID4+ICg2IC0gc2hpZnQpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwIHw9IChwbmdfYnl0ZSkoZyA8PCBzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA2OwotICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwbmdfdWludF8xNikoKCpzcCA+PiBzaGlmdCkgJiAweDAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHRyYW5zX3ZhbHVlcy0+Z3JheSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCAmPSAocG5nX2J5dGUpKCgweDNmM2YgPj4gKDYgLSBzaGlmdCkpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgfD0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmF5IDw8IHNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgLT0gMjsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICB7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0gICAgICAgICAgICAgICAgICBpZiAoZ2FtbWFfdGFibGUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OwotICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwbmdfdWludF8xNikoKCpzcCA+PiBzaGlmdCkgJiAweDBmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHRyYW5zX3ZhbHVlcy0+Z3JheSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCAmPSAocG5nX2J5dGUpKCgweGYwZiA+PiAoNCAtIHNoaWZ0KSkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCB8PSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyYXkgPDwgc2hpZnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgcCA9IChwbmdfYnl0ZSkoKCpzcCA+PiBzaGlmdCkgJiAweDBmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGcgPSAocG5nX2J5dGUpKChnYW1tYV90YWJsZVtwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHAgPDwgNCldID4+IDQpICYgMHgwZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgJj0gKHBuZ19ieXRlKSgoMHhmMGYgPj4gKDQgLSBzaGlmdCkpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgfD0gKHBuZ19ieXRlKShnIDw8IHNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgLT0gNDsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBuZ191aW50XzE2KSgoKnNwID4+IHNoaWZ0KSAmIDB4MGYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gdHJhbnNfdmFsdWVzLT5ncmF5KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwICY9IChwbmdfYnl0ZSkoKDB4ZjBmID4+ICg0IC0gc2hpZnQpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwIHw9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Z3JheSA8PCBzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDQ7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgewotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKQotICAgICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RhYmxlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3ArKykKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqc3AgPT0gdHJhbnNfdmFsdWVzLT5ncmF5KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPmdyYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3ArKykKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqc3AgPT0gdHJhbnNfdmFsdWVzLT5ncmF5KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPmdyYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKLSAgICAgICAgICAgICAgICAgIGlmIChnYW1tYV8xNiAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDIpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2OwotCi0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gKHBuZ191aW50XzE2KSgoKCpzcCkgPDwgOCkgKyAqKHNwICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gdHJhbnNfdmFsdWVzLT5ncmF5KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmFja2dyb3VuZCBpcyBhbHJlYWR5IGluIHNjcmVlbiBnYW1tYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Z3JheSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmF5ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSAyKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IHRyYW5zX3ZhbHVlcy0+Z3JheSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKGJhY2tncm91bmQtPmdyYXkgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Z3JheSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0I6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgICAgewotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKQotICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RhYmxlICE9IE5VTEwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gMykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmICgqc3AgPT0gdHJhbnNfdmFsdWVzLT5yZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9PSB0cmFuc192YWx1ZXMtPmdyZWVuICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPT0gdHJhbnNfdmFsdWVzLT5ibHVlKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPnJlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ncmVlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ibHVlOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IGdhbW1hX3RhYmxlWyooc3AgKyAxKV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSBnYW1tYV90YWJsZVsqKHNwICsgMildOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gMykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmICgqc3AgPT0gdHJhbnNfdmFsdWVzLT5yZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9PSB0cmFuc192YWx1ZXMtPmdyZWVuICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPT0gdHJhbnNfdmFsdWVzLT5ibHVlKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPnJlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ncmVlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ibHVlOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKiBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikgKi8KLSAgICAgICAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKLSAgICAgICAgICAgICAgIGlmIChnYW1tYV8xNiAhPSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDYpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiByID0gKHBuZ191aW50XzE2KSgoKCpzcCkgPDwgOCkgKyAqKHNwICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgZyA9IChwbmdfdWludF8xNikoKCgqKHNwKzIpKSA8PCA4KSArICooc3ArMykpOwotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYiA9IChwbmdfdWludF8xNikoKCgqKHNwKzQpKSA8PCA4KSArICooc3ArNSkpOwotICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gdHJhbnNfdmFsdWVzLT5yZWQgJiYgZyA9PSB0cmFuc192YWx1ZXMtPmdyZWVuICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBiID09IHRyYW5zX3ZhbHVlcy0+Ymx1ZSkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2tncm91bmQgaXMgYWxyZWFkeSBpbiBzY3JlZW4gZ2FtbWEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKGJhY2tncm91bmQtPnJlZCA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5yZWQgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSkoKGJhY2tncm91bmQtPmdyZWVuID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMykgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyZWVuICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNCkgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ibHVlID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNSkgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmJsdWUgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHYgPSBnYW1tYV8xNlsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgMykgPj4gZ2FtbWFfc2hpZnRdWyooc3AgKyAyKV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMikgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMykgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgNSkgPj4gZ2FtbWFfc2hpZnRdWyooc3AgKyA0KV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNCkgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDYpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiByID0gKHBuZ191aW50XzE2KSgoKCpzcCkgPDwgOCkgKyAqKHNwKzEpKTsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcgPSAocG5nX3VpbnRfMTYpKCgoKihzcCsyKSkgPDwgOCkgKyAqKHNwKzMpKTsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGIgPSAocG5nX3VpbnRfMTYpKCgoKihzcCs0KSkgPDwgOCkgKyAqKHNwKzUpKTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gdHJhbnNfdmFsdWVzLT5yZWQgJiYgZyA9PSB0cmFuc192YWx1ZXMtPmdyZWVuICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBiID09IHRyYW5zX3ZhbHVlcy0+Ymx1ZSkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKGJhY2tncm91bmQtPnJlZCA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5yZWQgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooc3AgKyAyKSA9IChwbmdfYnl0ZSkoKGJhY2tncm91bmQtPmdyZWVuID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgMykgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyZWVuICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNCkgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ibHVlID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHNwICsgNSkgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmJsdWUgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgICAgewotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKQotICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RvXzEgIT0gTlVMTCAmJiBnYW1tYV9mcm9tXzEgIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgIGdhbW1hX3RhYmxlICE9IE5VTEwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGRwID0gcm93OwotICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSAyLCBkcCsrKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYSA9ICooc3AgKyAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMHhmZikKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IGdhbW1hX3RhYmxlWypzcF07Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrZ3JvdW5kIGlzIGFscmVhZHkgaW4gc2NyZWVuIGdhbW1hICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Z3JheTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHYsIHc7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV90b18xWypzcF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIGEsIGJhY2tncm91bmRfMS0+Z3JheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSBnYW1tYV9mcm9tXzFbd107Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDIsIGRwKyspCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSBhID0gKihzcCArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAweGZmKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKnNwOwotICAgICAgICAgICAgICAgICAgICAgfQotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKQotICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPmdyYXk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKCpkcCwgKnNwLCBhLCBiYWNrZ3JvdW5kXzEtPmdyYXkpOwotICAgICAgICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5ncmF5OwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gMTYpICovCi0gICAgICAgICAgICB7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0gICAgICAgICAgICAgICBpZiAoZ2FtbWFfMTYgIT0gTlVMTCAmJiBnYW1tYV8xNl9mcm9tXzEgIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgIGdhbW1hXzE2X3RvXzEgIT0gTlVMTCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDQsIGRwICs9IDIpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBhID0gKHBuZ191aW50XzE2KSgoKCooc3ArMikpIDw8IDgpICsgKihzcCszKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IChwbmdfdWludF8xNikweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2OwotCi0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0gICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBCYWNrZ3JvdW5kIGlzIGFscmVhZHkgaW4gc2NyZWVuIGdhbW1hICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ncmF5ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyYXkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGcsIHYsIHc7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBnYW1tYV8xNl90b18xWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGVfMTYodiwgZywgYSwgYmFja2dyb3VuZF8xLT5ncmF5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBnYW1tYV8xNl9mcm9tXzFbKHYmMHhmZikgPj4gZ2FtbWFfc2hpZnRdW3YgPj4gOF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKCh3ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAocG5nX2J5dGUpKHcgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGRwID0gcm93OwotICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA0LCBkcCArPSAyKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYSA9IChwbmdfdWludF8xNikoKCgqKHNwKzIpKSA8PCA4KSArICooc3ArMykpOwotICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gKHBuZ191aW50XzE2KTB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19tZW1jcHkoZHAsIHNwLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKLSAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEgPT0gMCkKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKGJhY2tncm91bmQtPmdyYXkgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+Z3JheSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgfQotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKQotICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgZywgdjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZyA9IChwbmdfdWludF8xNikoKCgqc3ApIDw8IDgpICsgKihzcCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGVfMTYodiwgZywgYSwgYmFja2dyb3VuZF8xLT5ncmF5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgICAgewotI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKQotICAgICAgICAgICAgICAgaWYgKGdhbW1hX3RvXzEgIT0gTlVMTCAmJiBnYW1tYV9mcm9tXzEgIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgIGdhbW1hX3RhYmxlICE9IE5VTEwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGRwID0gcm93OwotICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrLCBzcCArPSA0LCBkcCArPSAzKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgYSA9ICooc3AgKyAzKTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMHhmZikKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IGdhbW1hX3RhYmxlWypzcF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSBnYW1tYV90YWJsZVsqKHNwICsgMSldOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gZ2FtbWFfdGFibGVbKihzcCArIDIpXTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2tncm91bmQgaXMgYWxyZWFkeSBpbiBzY3JlZW4gZ2FtbWEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSliYWNrZ3JvdW5kLT5yZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Z3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMikgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+Ymx1ZTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIHYsIHc7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV90b18xWypzcF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIGEsIGJhY2tncm91bmRfMS0+cmVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IGdhbW1hX2Zyb21fMVt3XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV90b18xWyooc3AgKyAxKV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKHcsIHYsIGEsIGJhY2tncm91bmRfMS0+Z3JlZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gZ2FtbWFfZnJvbV8xW3ddOwotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hX3RvXzFbKihzcCArIDIpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUodywgdiwgYSwgYmFja2dyb3VuZF8xLT5ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAyKSA9IGdhbW1hX2Zyb21fMVt3XTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBkcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gNCwgZHAgKz0gMykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGEgPSAqKHNwICsgMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IDB4ZmYpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAqc3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAqKHNwICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMikgPSAqKHNwICsgMik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpYmFja2dyb3VuZC0+cmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPmdyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gKHBuZ19ieXRlKWJhY2tncm91bmQtPmJsdWU7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlKCpkcCwgKnNwLCBhLCBiYWNrZ3JvdW5kLT5yZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbXBvc2l0ZSgqKGRwICsgMSksICooc3AgKyAxKSwgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtPmdyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGUoKihkcCArIDIpLCAqKHNwICsgMiksIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLT5ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyogaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpICovCi0gICAgICAgICAgICB7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0gICAgICAgICAgICAgICBpZiAoZ2FtbWFfMTYgIT0gTlVMTCAmJiBnYW1tYV8xNl9mcm9tXzEgIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgIGdhbW1hXzE2X3RvXzEgIT0gTlVMTCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwICs9IDgsIGRwICs9IDYpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiBhID0gKHBuZ191aW50XzE2KSgoKHBuZ191aW50XzE2KSgqKHNwICsgNikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgOCkgKyAocG5nX3VpbnRfMTYpKCooc3AgKyA3KSkpOwotICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gKHBuZ191aW50XzE2KTB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgMykgPj4gZ2FtbWFfc2hpZnRdWyooc3AgKyAyKV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMikgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMykgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNlsqKHNwICsgNSkgPj4gZ2FtbWFfc2hpZnRdWyooc3AgKyA0KV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgNCkgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgNSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2tncm91bmQgaXMgYWxyZWFkeSBpbiBzY3JlZW4gZ2FtbWEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKGJhY2tncm91bmQtPnJlZCA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5yZWQgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAyKSA9IChwbmdfYnl0ZSkoKGJhY2tncm91bmQtPmdyZWVuID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMykgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmdyZWVuICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgNCkgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ibHVlID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgNSkgPSAocG5nX2J5dGUpKGJhY2tncm91bmQtPmJsdWUgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHYsIHcsIHg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90b18xWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGVfMTYodywgdiwgYSwgYmFja2dyb3VuZF8xLT5yZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGdhbW1hXzE2X2Zyb21fMVsoKHcmMHhmZikgPj4gZ2FtbWFfc2hpZnQpXVt3ID4+IDhdOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoeCA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDEpID0gKHBuZ19ieXRlKSh4ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdG9fMVsqKHNwICsgMykgPj4gZ2FtbWFfc2hpZnRdWyooc3AgKyAyKV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHcsIHYsIGEsIGJhY2tncm91bmRfMS0+Z3JlZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGdhbW1hXzE2X2Zyb21fMVsoKHcmMHhmZikgPj4gZ2FtbWFfc2hpZnQpXVt3ID4+IDhdOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gKHBuZ19ieXRlKSgoeCA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDMpID0gKHBuZ19ieXRlKSh4ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdG9fMVsqKHNwICsgNSkgPj4gZ2FtbWFfc2hpZnRdWyooc3AgKyA0KV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHcsIHYsIGEsIGJhY2tncm91bmRfMS0+Ymx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ID0gZ2FtbWFfMTZfZnJvbV8xWyh3ICYgMHhmZikgPj4gZ2FtbWFfc2hpZnRdW3cgPj4gOF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgNCkgPSAocG5nX2J5dGUpKCh4ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgNSkgPSAocG5nX2J5dGUpKHggJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICAgICBkcCA9IHJvdzsKLSAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKywgc3AgKz0gOCwgZHAgKz0gNikKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IGEgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMTYpKCooc3AgKyA2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IDgpICsgKHBuZ191aW50XzE2KSgqKHNwICsgNykpKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IChwbmdfdWludF8xNikweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfbWVtY3B5KGRwLCBzcCwgNik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhID09IDApCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5yZWQgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICooZHAgKyAxKSA9IChwbmdfYnl0ZSkoYmFja2dyb3VuZC0+cmVkICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMikgPSAocG5nX2J5dGUpKChiYWNrZ3JvdW5kLT5ncmVlbiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDMpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ncmVlbiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDQpID0gKHBuZ19ieXRlKSgoYmFja2dyb3VuZC0+Ymx1ZSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDUpID0gKHBuZ19ieXRlKShiYWNrZ3JvdW5kLT5ibHVlICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiByID0gKHBuZ191aW50XzE2KSgoKCpzcCkgPDwgOCkgKyAqKHNwICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgZyA9IChwbmdfdWludF8xNikoKCgqKHNwICsgMikpIDw8IDgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAqKHNwICsgMykpOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYgYiA9IChwbmdfdWludF8xNikoKCgqKHNwICsgNCkpIDw8IDgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAqKHNwICsgNSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIHIsIGEsIGJhY2tncm91bmQtPnJlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKGRwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19jb21wb3NpdGVfMTYodiwgZywgYSwgYmFja2dyb3VuZC0+Z3JlZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDIpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDMpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfY29tcG9zaXRlXzE2KHYsIGIsIGEsIGJhY2tncm91bmQtPmJsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDQpID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihkcCArIDUpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSAmPSB+UE5HX0NPTE9SX01BU0tfQUxQSEE7Ci0gICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMtLTsKLSAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocm93X2luZm8tPmNoYW5uZWxzICoKLSAgICAgICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGgpOwotICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X3dpZHRoKTsKLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpCi0vKiBHYW1tYSBjb3JyZWN0IHRoZSBpbWFnZSwgYXZvaWRpbmcgdGhlIGFscGhhIGNoYW5uZWwuICBNYWtlIHN1cmUKLSAqIHlvdSBkbyB0aGlzIGFmdGVyIHlvdSBkZWFsIHdpdGggdGhlIHRyYW5zcGFyZW5jeSBpc3N1ZSBvbiBncmF5c2NhbGUKLSAqIG9yIFJHQiBpbWFnZXMuIElmIHlvdXIgYml0IGRlcHRoIGlzIDgsIHVzZSBnYW1tYV90YWJsZSwgaWYgaXQKLSAqIGlzIDE2LCB1c2UgZ2FtbWFfMTZfdGFibGUgYW5kIGdhbW1hX3NoaWZ0LiAgQnVpbGQgdGhlc2Ugd2l0aAotICogYnVpbGRfZ2FtbWFfdGFibGUoKS4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fZ2FtbWEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ19ieXRlcCBnYW1tYV90YWJsZSwgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90YWJsZSwKLSAgIGludCBnYW1tYV9zaGlmdCkKLXsKLSAgIHBuZ19ieXRlcCBzcDsKLSAgIHBuZ191aW50XzMyIGk7Ci0gICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19nYW1tYSIpOwotICAgaWYgKAotI2lmIGRlZmluZWQoUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVEKQotICAgICAgIHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYKLSNlbmRpZgotICAgICAgICgocm93X2luZm8tPmJpdF9kZXB0aCA8PSA4ICYmIGdhbW1hX3RhYmxlICE9IE5VTEwpIHx8Ci0gICAgICAgIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2ICYmIGdhbW1hXzE2X3RhYmxlICE9IE5VTEwpKSkKLSAgIHsKLSAgICAgIHN3aXRjaCAocm93X2luZm8tPmNvbG9yX3R5cGUpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07Ci0gICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOwotICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyogaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ191aW50XzE2IHY7Ci0KLSAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90YWJsZVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07Ci0gICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDI7Ci0gICAgICAgICAgICAgICAgICB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOwotICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICBzcCArPSAyOwotICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKLSAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07Ci0gICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICAgICAqc3AgPSBnYW1tYV90YWJsZVsqc3BdOwotICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOwotICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICBzcCArPSAyOwotICAgICAgICAgICAgICAgICAgdiA9IGdhbW1hXzE2X3RhYmxlWyooc3AgKyAxKSA+PiBnYW1tYV9zaGlmdF1bKnNwXTsKLSAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICooc3AgKyAxKSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKLSAgICAgICAgICAgICAgICAgIHYgPSBnYW1tYV8xNl90YWJsZVsqKHNwICsgMSkgPj4gZ2FtbWFfc2hpZnRdWypzcF07Ci0gICAgICAgICAgICAgICAgICAqc3AgPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqKHNwICsgMSkgPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDQ7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOgotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKnNwID0gZ2FtbWFfdGFibGVbKnNwXTsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDI7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOwotICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICBzcCArPSA0OwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkgKz0gNCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGludCBhID0gKnNwICYgMHhjMDsKLSAgICAgICAgICAgICAgICAgIGludCBiID0gKnNwICYgMHgzMDsKLSAgICAgICAgICAgICAgICAgIGludCBjID0gKnNwICYgMHgwYzsKLSAgICAgICAgICAgICAgICAgIGludCBkID0gKnNwICYgMHgwMzsKLQotICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKChpbnQpZ2FtbWFfdGFibGVbYXwoYT4+Mil8KGE+PjQpfChhPj42KV0pICAgKSAmIDB4YzApfAotICAgICAgICAgICAgICAgICAgICAgICAgKCgoKGludClnYW1tYV90YWJsZVsoYjw8Mil8YnwoYj4+Mil8KGI+PjQpXSk+PjIpICYgMHgzMCl8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKCgoaW50KWdhbW1hX3RhYmxlWyhjPDw0KXwoYzw8Mil8Y3woYz4+MildKT4+NCkgJiAweDBjKXwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKChpbnQpZ2FtbWFfdGFibGVbKGQ8PDYpfChkPDw0KXwoZDw8Mil8ZF0pPj42KSApKTsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkgKz0gMikKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGludCBtc2IgPSAqc3AgJiAweGYwOwotICAgICAgICAgICAgICAgICAgaW50IGxzYiA9ICpzcCAmIDB4MGY7Ci0KLSAgICAgICAgICAgICAgICAgICpzcCA9IChwbmdfYnl0ZSkoKCgoaW50KWdhbW1hX3RhYmxlW21zYiB8IChtc2IgPj4gNCldKSAmIDB4ZjApCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCgoaW50KWdhbW1hX3RhYmxlWyhsc2IgPDwgNCkgfCBsc2JdKSA+PiA0KSk7Ci0gICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICpzcCA9IGdhbW1hX3RhYmxlWypzcF07Ci0gICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfdWludF8xNiB2ID0gZ2FtbWFfMTZfdGFibGVbKihzcCArIDEpID4+IGdhbW1hX3NoaWZ0XVsqc3BdOwotICAgICAgICAgICAgICAgICAgKnNwID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgKihzcCArIDEpID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICBzcCArPSAyOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCkKLS8qIEV4cGFuZHMgYSBwYWxldHRlIHJvdyB0byBhbiBSR0Igb3IgUkdCQSByb3cgZGVwZW5kaW5nCi0gKiB1cG9uIHdoZXRoZXIgeW91IHN1cHBseSB0cmFucyBhbmQgbnVtX3RyYW5zLgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19leHBhbmRfcGFsZXR0ZShwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LAotICAgcG5nX2NvbG9ycCBwYWxldHRlLCBwbmdfYnl0ZXAgdHJhbnMsIGludCBudW1fdHJhbnMpCi17Ci0gICBpbnQgc2hpZnQsIHZhbHVlOwotICAgcG5nX2J5dGVwIHNwLCBkcDsKLSAgIHBuZ191aW50XzMyIGk7Ci0gICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19leHBhbmRfcGFsZXR0ZSIpOwotICAgaWYgKAotI2lmIGRlZmluZWQoUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVEKQotICAgICAgIHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYKLSNlbmRpZgotICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICB7Ci0gICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCi0gICAgICB7Ci0gICAgICAgICBzd2l0Y2ggKHJvd19pbmZvLT5iaXRfZGVwdGgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMyk7Ci0gICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7Ci0gICAgICAgICAgICAgICBzaGlmdCA9IDcgLSAoaW50KSgocm93X3dpZHRoICsgNykgJiAweDA3KTsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICgoKnNwID4+IHNoaWZ0KSAmIDB4MDEpCi0gICAgICAgICAgICAgICAgICAgICAqZHAgPSAxOwotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgKmRwID0gMDsKLSAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA3KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHNoaWZ0Kys7Ci0KLSAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDIpOwotICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgc2hpZnQgPSAoaW50KSgoMyAtICgocm93X3dpZHRoICsgMykgJiAweDAzKSkgPDwgMSk7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwMzsKLSAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA2KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDI7Ci0KLSAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDEpOwotICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgc2hpZnQgPSAoaW50KSgocm93X3dpZHRoICYgMHgwMSkgPDwgMik7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDQ7Ci0KLSAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSA4OwotICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gODsKLSAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aDsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAocm93X2luZm8tPmJpdF9kZXB0aCkKLSAgICAgIHsKLSAgICAgICAgIGNhc2UgODoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0cmFucyAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkocm93X3dpZHRoIDw8IDIpIC0gMTsKLQotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKChpbnQpKCpzcCkgPj0gbnVtX3RyYW5zKQotICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOwotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSB0cmFuc1sqc3BdOwotICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0uYmx1ZTsKLSAgICAgICAgICAgICAgICAgICpkcC0tID0gcGFsZXR0ZVsqc3BdLmdyZWVuOwotICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0ucmVkOwotICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPSA4OwotICAgICAgICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gMzI7Ci0gICAgICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGggKiA0OwotICAgICAgICAgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPSA2OwotICAgICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X3dpZHRoIC0gMTsKLSAgICAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd193aWR0aCAqIDMpIC0gMTsKLQotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0uYmx1ZTsKLSAgICAgICAgICAgICAgICAgICpkcC0tID0gcGFsZXR0ZVsqc3BdLmdyZWVuOwotICAgICAgICAgICAgICAgICAgKmRwLS0gPSBwYWxldHRlWypzcF0ucmVkOwotICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7Ci0gICAgICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAyNDsKLSAgICAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDM7Ci0gICAgICAgICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IDI7Ci0gICAgICAgICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSAzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0KLS8qIElmIHRoZSBiaXQgZGVwdGggPCA4LCBpdCBpcyBleHBhbmRlZCB0byA4LiAgQWxzbywgaWYgdGhlIGFscmVhZHkKLSAqIGV4cGFuZGVkIHRyYW5zcGFyZW5jeSB2YWx1ZSBpcyBzdXBwbGllZCwgYW4gYWxwaGEgY2hhbm5lbCBpcyBidWlsdC4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fZXhwYW5kKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csCi0gICBwbmdfY29sb3JfMTZwIHRyYW5zX3ZhbHVlKQotewotICAgaW50IHNoaWZ0LCB2YWx1ZTsKLSAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICBwbmdfdWludF8zMiBpOwotICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoPXJvd19pbmZvLT53aWR0aDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fZXhwYW5kIik7Ci0jaWYgZGVmaW5lZChQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQpCi0gICBpZiAocm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCkKLSNlbmRpZgotICAgewotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8xNiBncmF5ID0gKHBuZ191aW50XzE2KSh0cmFuc192YWx1ZSA/IHRyYW5zX3ZhbHVlLT5ncmF5IDogMCk7Ci0KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoIDwgOCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAocm93X2luZm8tPmJpdF9kZXB0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGdyYXkgPSAocG5nX3VpbnRfMTYpKChncmF5JjB4MDEpKjB4ZmYpOwotICAgICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDMpOwotICAgICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgICAgc2hpZnQgPSA3IC0gKGludCkoKHJvd193aWR0aCArIDcpICYgMHgwNyk7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoKCpzcCA+PiBzaGlmdCkgJiAweDAxKQotICAgICAgICAgICAgICAgICAgICAgICAgKmRwID0gMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICpkcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNykKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwLS07Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCsrOwotCi0gICAgICAgICAgICAgICAgICAgICBkcC0tOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGdyYXkgPSAocG5nX3VpbnRfMTYpKChncmF5JjB4MDMpKjB4NTUpOwotICAgICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoKHJvd193aWR0aCAtIDEpID4+IDIpOwotICAgICAgICAgICAgICAgICAgZHAgPSByb3cgKyAocG5nX3NpemVfdClyb3dfd2lkdGggLSAxOwotICAgICAgICAgICAgICAgICAgc2hpZnQgPSAoaW50KSgoMyAtICgocm93X3dpZHRoICsgMykgJiAweDAzKSkgPDwgMSk7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwMzsKLSAgICAgICAgICAgICAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkodmFsdWUgfCAodmFsdWUgPDwgMikgfCAodmFsdWUgPDwgNCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIDw8IDYpKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSA2KQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDI7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZ3JheSA9IChwbmdfdWludF8xNikoKGdyYXkmMHgwZikqMHgxMSk7Ci0gICAgICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X3dpZHRoIC0gMSkgPj4gMSk7Ci0gICAgICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IChpbnQpKCgxIC0gKChyb3dfd2lkdGggKyAxKSAmIDB4MDEpKSA8PCAyKTsKLSAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiBzaGlmdCkgJiAweDBmOwotICAgICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSh2YWx1ZSB8ICh2YWx1ZSA8PCA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gNCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwLS07Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IDg7Ci0gICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSA4OwotICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoOwotICAgICAgICAgfQotCi0gICAgICAgICBpZiAodHJhbnNfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBncmF5ID0gZ3JheSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KXJvd193aWR0aCAtIDE7Ci0gICAgICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KShyb3dfd2lkdGggPDwgMSkgLSAxOwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCpzcCA9PSBncmF5KQotICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSAwOwotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgKmRwLS0gPSAweGZmOwotICAgICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIGdyYXlfaGlnaCA9IChncmF5ID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIGdyYXlfbG93ID0gZ3JheSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlcyAtIDE7Ci0gICAgICAgICAgICAgICBkcCA9IHJvdyArIChyb3dfaW5mby0+cm93Ynl0ZXMgPDwgMSkgLSAxOwotICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCooc3AgLSAxKSA9PSBncmF5X2hpZ2ggJiYgKihzcCkgPT0gZ3JheV9sb3cpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDA7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAqZHAtLSA9IDB4ZmY7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOwotICAgICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOwotICAgICAgICAgICAgcm93X2luZm8tPmNoYW5uZWxzID0gMjsKLSAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocm93X2luZm8tPmJpdF9kZXB0aCA8PCAxKTsKLSAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsCi0gICAgICAgICAgICAgICByb3dfd2lkdGgpOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCICYmIHRyYW5zX3ZhbHVlKQotICAgICAgewotICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlIHJlZCA9IHRyYW5zX3ZhbHVlLT5yZWQgJiAweGZmOwotICAgICAgICAgICAgcG5nX2J5dGUgZ3JlZW4gPSB0cmFuc192YWx1ZS0+Z3JlZW4gJiAweGZmOwotICAgICAgICAgICAgcG5nX2J5dGUgYmx1ZSA9IHRyYW5zX3ZhbHVlLT5ibHVlICYgMHhmZjsKLSAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3Qpcm93X2luZm8tPnJvd2J5dGVzIC0gMTsKLSAgICAgICAgICAgIGRwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd193aWR0aCA8PCAyKSAtIDE7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoKihzcCAtIDIpID09IHJlZCAmJiAqKHNwIC0gMSkgPT0gZ3JlZW4gJiYgKihzcCkgPT0gYmx1ZSkKLSAgICAgICAgICAgICAgICAgICpkcC0tID0gMDsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICpkcC0tID0gMHhmZjsKLSAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07Ci0gICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOwotICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZSByZWRfaGlnaCA9ICh0cmFuc192YWx1ZS0+cmVkID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgIHBuZ19ieXRlIGdyZWVuX2hpZ2ggPSAodHJhbnNfdmFsdWUtPmdyZWVuID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgIHBuZ19ieXRlIGJsdWVfaGlnaCA9ICh0cmFuc192YWx1ZS0+Ymx1ZSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICBwbmdfYnl0ZSByZWRfbG93ID0gdHJhbnNfdmFsdWUtPnJlZCAmIDB4ZmY7Ci0gICAgICAgICAgICBwbmdfYnl0ZSBncmVlbl9sb3cgPSB0cmFuc192YWx1ZS0+Z3JlZW4gJiAweGZmOwotICAgICAgICAgICAgcG5nX2J5dGUgYmx1ZV9sb3cgPSB0cmFuc192YWx1ZS0+Ymx1ZSAmIDB4ZmY7Ci0gICAgICAgICAgICBzcCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlcyAtIDE7Ci0gICAgICAgICAgICBkcCA9IHJvdyArIChwbmdfc2l6ZV90KShyb3dfd2lkdGggPDwgMykgLSAxOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKCooc3AgLSA1KSA9PSByZWRfaGlnaCAmJgotICAgICAgICAgICAgICAgICAgKihzcCAtIDQpID09IHJlZF9sb3cgJiYKLSAgICAgICAgICAgICAgICAgICooc3AgLSAzKSA9PSBncmVlbl9oaWdoICYmCi0gICAgICAgICAgICAgICAgICAqKHNwIC0gMikgPT0gZ3JlZW5fbG93ICYmCi0gICAgICAgICAgICAgICAgICAqKHNwIC0gMSkgPT0gYmx1ZV9oaWdoICYmCi0gICAgICAgICAgICAgICAgICAqKHNwICAgICkgPT0gYmx1ZV9sb3cpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAqZHAtLSA9IDA7Ci0gICAgICAgICAgICAgICAgICAqZHAtLSA9IDA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAqZHAtLSA9IDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAqZHAtLSA9IDB4ZmY7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOwotICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKLSAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07Ci0gICAgICAgICAgICAgICAqZHAtLSA9ICpzcC0tOwotICAgICAgICAgICAgICAgKmRwLS0gPSAqc3AtLTsKLSAgICAgICAgICAgICAgICpkcC0tID0gKnNwLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsKLSAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDQ7Ci0gICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKHJvd19pbmZvLT5iaXRfZGVwdGggPDwgMik7Ci0gICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCByb3dfd2lkdGgpOwotICAgICAgfQotICAgfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19kaXRoZXIocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgICBwbmdfYnl0ZXAgcGFsZXR0ZV9sb29rdXAsIHBuZ19ieXRlcCBkaXRoZXJfbG9va3VwKQotewotICAgcG5nX2J5dGVwIHNwLCBkcDsKLSAgIHBuZ191aW50XzMyIGk7Ci0gICBwbmdfdWludF8zMiByb3dfd2lkdGg9cm93X2luZm8tPndpZHRoOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19kaXRoZXIiKTsKLSNpZiBkZWZpbmVkKFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRCkKLSAgIGlmIChyb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMKQotI2VuZGlmCi0gICB7Ci0gICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCICYmCi0gICAgICAgICBwYWxldHRlX2xvb2t1cCAmJiByb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICB7Ci0gICAgICAgICBpbnQgciwgZywgYiwgcDsKLSAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICByID0gKnNwKys7Ci0gICAgICAgICAgICBnID0gKnNwKys7Ci0gICAgICAgICAgICBiID0gKnNwKys7Ci0KLSAgICAgICAgICAgIC8qIFRoaXMgbG9va3MgcmVhbCBtZXNzeSwgYnV0IHRoZSBjb21waWxlciB3aWxsIHJlZHVjZQotICAgICAgICAgICAgICogaXQgZG93biB0byBhIHJlYXNvbmFibGUgZm9ybXVsYS4gIEZvciBleGFtcGxlLCB3aXRoCi0gICAgICAgICAgICAgKiA1IGJpdHMgcGVyIGNvbG9yLCB3ZSBnZXQ6Ci0gICAgICAgICAgICAgKiBwID0gKCgociA+PiAzKSAmIDB4MWYpIDw8IDEwKSB8Ci0gICAgICAgICAgICAgKiAgICAoKChnID4+IDMpICYgMHgxZikgPDwgNSkgfAotICAgICAgICAgICAgICogICAgKChiID4+IDMpICYgMHgxZik7Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHAgPSAoKChyID4+ICg4IC0gUE5HX0RJVEhFUl9SRURfQklUUykpICYKLSAgICAgICAgICAgICAgICgoMSA8PCBQTkdfRElUSEVSX1JFRF9CSVRTKSAtIDEpKSA8PAotICAgICAgICAgICAgICAgKFBOR19ESVRIRVJfR1JFRU5fQklUUyArIFBOR19ESVRIRVJfQkxVRV9CSVRTKSkgfAotICAgICAgICAgICAgICAgKCgoZyA+PiAoOCAtIFBOR19ESVRIRVJfR1JFRU5fQklUUykpICYKLSAgICAgICAgICAgICAgICgoMSA8PCBQTkdfRElUSEVSX0dSRUVOX0JJVFMpIC0gMSkpIDw8Ci0gICAgICAgICAgICAgICAoUE5HX0RJVEhFUl9CTFVFX0JJVFMpKSB8Ci0gICAgICAgICAgICAgICAoKGIgPj4gKDggLSBQTkdfRElUSEVSX0JMVUVfQklUUykpICYKLSAgICAgICAgICAgICAgICgoMSA8PCBQTkdfRElUSEVSX0JMVUVfQklUUykgLSAxKSk7Ci0KLSAgICAgICAgICAgICpkcCsrID0gcGFsZXR0ZV9sb29rdXBbcF07Ci0gICAgICAgICB9Ci0gICAgICAgICByb3dfaW5mby0+Y29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEU7Ci0gICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSAxOwotICAgICAgICAgcm93X2luZm8tPnBpeGVsX2RlcHRoID0gcm93X2luZm8tPmJpdF9kZXB0aDsKLSAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhyb3dfaW5mby0+cGl4ZWxfZGVwdGgsIHJvd193aWR0aCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEgJiYKLSAgICAgICAgIHBhbGV0dGVfbG9va3VwICE9IE5VTEwgJiYgcm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgewotICAgICAgICAgaW50IHIsIGcsIGIsIHA7Ci0gICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgIGRwID0gcm93OwotICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICAgciA9ICpzcCsrOwotICAgICAgICAgICAgZyA9ICpzcCsrOwotICAgICAgICAgICAgYiA9ICpzcCsrOwotICAgICAgICAgICAgc3ArKzsKLQotICAgICAgICAgICAgcCA9ICgoKHIgPj4gKDggLSBQTkdfRElUSEVSX1JFRF9CSVRTKSkgJgotICAgICAgICAgICAgICAgKCgxIDw8IFBOR19ESVRIRVJfUkVEX0JJVFMpIC0gMSkpIDw8Ci0gICAgICAgICAgICAgICAoUE5HX0RJVEhFUl9HUkVFTl9CSVRTICsgUE5HX0RJVEhFUl9CTFVFX0JJVFMpKSB8Ci0gICAgICAgICAgICAgICAoKChnID4+ICg4IC0gUE5HX0RJVEhFUl9HUkVFTl9CSVRTKSkgJgotICAgICAgICAgICAgICAgKCgxIDw8IFBOR19ESVRIRVJfR1JFRU5fQklUUykgLSAxKSkgPDwKLSAgICAgICAgICAgICAgIChQTkdfRElUSEVSX0JMVUVfQklUUykpIHwKLSAgICAgICAgICAgICAgICgoYiA+PiAoOCAtIFBOR19ESVRIRVJfQkxVRV9CSVRTKSkgJgotICAgICAgICAgICAgICAgKCgxIDw8IFBOR19ESVRIRVJfQkxVRV9CSVRTKSAtIDEpKTsKLQotICAgICAgICAgICAgKmRwKysgPSBwYWxldHRlX2xvb2t1cFtwXTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURTsKLSAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDE7Ci0gICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSByb3dfaW5mby0+Yml0X2RlcHRoOwotICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwgcm93X3dpZHRoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKLSAgICAgICAgIGRpdGhlcl9sb29rdXAgJiYgcm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgICAgewotICAgICAgICAgc3AgPSByb3c7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyssIHNwKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICAqc3AgPSBkaXRoZXJfbG9va3VwWypzcF07Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKLXN0YXRpYyBQTkdfQ09OU1QgaW50IHBuZ19nYW1tYV9zaGlmdFtdID0KLSAgIHsweDEwLCAweDIxLCAweDQyLCAweDg0LCAweDExMCwgMHgyNDgsIDB4NTUwLCAweGZmMCwgMHgwMH07Ci0KLS8qIFdlIGJ1aWxkIHRoZSA4LSBvciAxNi1iaXQgZ2FtbWEgdGFibGVzIGhlcmUuICBOb3RlIHRoYXQgZm9yIDE2LWJpdAotICogdGFibGVzLCB3ZSBkb24ndCBtYWtlIGEgZnVsbCB0YWJsZSBpZiB3ZSBhcmUgcmVkdWNpbmcgdG8gOC1iaXQgaW4KLSAqIHRoZSBmdXR1cmUuICBOb3RlIGFsc28gaG93IHRoZSBnYW1tYV8xNiB0YWJsZXMgYXJlIHNlZ21lbnRlZCBzbyB0aGF0Ci0gKiB3ZSBkb24ndCBuZWVkIHRvIGFsbG9jYXRlID4gNjRLIGNodW5rcyBmb3IgYSBmdWxsIDE2LWJpdCB0YWJsZS4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfYnVpbGRfZ2FtbWFfdGFibGUocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgcG5nX2RlYnVnKDEsICJpbiBwbmdfYnVpbGRfZ2FtbWFfdGFibGUiKTsKLQotICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoIDw9IDgpCi0gIHsKLSAgICAgaW50IGk7Ci0gICAgIGRvdWJsZSBnOwotCi0gICAgIGlmIChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPiAuMDAwMDAxKQotICAgICAgICBnID0gMS4wIC8gKHBuZ19wdHItPmdhbW1hICogcG5nX3B0ci0+c2NyZWVuX2dhbW1hKTsKLQotICAgICBlbHNlCi0gICAgICAgIGcgPSAxLjA7Ci0KLSAgICAgcG5nX3B0ci0+Z2FtbWFfdGFibGUgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgKHBuZ191aW50XzMyKTI1Nik7Ci0KLSAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgICB7Ci0gICAgICAgIHBuZ19wdHItPmdhbW1hX3RhYmxlW2ldID0gKHBuZ19ieXRlKShwb3coKGRvdWJsZSlpIC8gMjU1LjAsCi0gICAgICAgICAgIGcpICogMjU1LjAgKyAuNSk7Ci0gICAgIH0KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8IFwKLSAgIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKQotICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgKChQTkdfQkFDS0dST1VORCkgfCBQTkdfUkdCX1RPX0dSQVkpKQotICAgICB7Ci0KLSAgICAgICAgZyA9IDEuMCAvIChwbmdfcHRyLT5nYW1tYSk7Ci0KLSAgICAgICAgcG5nX3B0ci0+Z2FtbWFfdG9fMSA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAocG5nX3VpbnRfMzIpMjU2KTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfdG9fMVtpXSA9IChwbmdfYnl0ZSkocG93KChkb3VibGUpaSAvIDI1NS4wLAotICAgICAgICAgICAgICBnKSAqIDI1NS4wICsgLjUpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwbmdfcHRyLT5nYW1tYV9mcm9tXzEgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgKHBuZ191aW50XzMyKTI1Nik7Ci0KLSAgICAgICAgaWYgKHBuZ19wdHItPnNjcmVlbl9nYW1tYSA+IDAuMDAwMDAxKQotICAgICAgICAgICBnID0gMS4wIC8gcG5nX3B0ci0+c2NyZWVuX2dhbW1hOwotCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgZyA9IHBuZ19wdHItPmdhbW1hOyAgIC8qIFByb2JhYmx5IGRvaW5nIHJnYl90b19ncmF5ICovCi0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgIHBuZ19wdHItPmdhbW1hX2Zyb21fMVtpXSA9IChwbmdfYnl0ZSkocG93KChkb3VibGUpaSAvIDI1NS4wLAotICAgICAgICAgICAgICBnKSAqIDI1NS4wICsgLjUpOwotCi0gICAgICAgIH0KLSAgICAgfQotI2VuZGlmIC8qIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEIHx8IFBOR19SR0JfVE9fR1JBWV9TVVBQT1JURUQgKi8KLSAgfQotICBlbHNlCi0gIHsKLSAgICAgZG91YmxlIGc7Ci0gICAgIGludCBpLCBqLCBzaGlmdCwgbnVtOwotICAgICBpbnQgc2lnX2JpdDsKLSAgICAgcG5nX3VpbnRfMzIgaWc7Ci0KLSAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKLSAgICAgewotICAgICAgICBzaWdfYml0ID0gKGludClwbmdfcHRyLT5zaWdfYml0LnJlZDsKLQotICAgICAgICBpZiAoKGludClwbmdfcHRyLT5zaWdfYml0LmdyZWVuID4gc2lnX2JpdCkKLSAgICAgICAgICAgc2lnX2JpdCA9IHBuZ19wdHItPnNpZ19iaXQuZ3JlZW47Ci0KLSAgICAgICAgaWYgKChpbnQpcG5nX3B0ci0+c2lnX2JpdC5ibHVlID4gc2lnX2JpdCkKLSAgICAgICAgICAgc2lnX2JpdCA9IHBuZ19wdHItPnNpZ19iaXQuYmx1ZTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgc2lnX2JpdCA9IChpbnQpcG5nX3B0ci0+c2lnX2JpdC5ncmF5OwotICAgICB9Ci0KLSAgICAgaWYgKHNpZ19iaXQgPiAwKQotICAgICAgICBzaGlmdCA9IDE2IC0gc2lnX2JpdDsKLQotICAgICBlbHNlCi0gICAgICAgIHNoaWZ0ID0gMDsKLQotICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HXzE2X1RPXzgpCi0gICAgIHsKLSAgICAgICAgaWYgKHNoaWZ0IDwgKDE2IC0gUE5HX01BWF9HQU1NQV84KSkKLSAgICAgICAgICAgc2hpZnQgPSAoMTYgLSBQTkdfTUFYX0dBTU1BXzgpOwotICAgICB9Ci0KLSAgICAgaWYgKHNoaWZ0ID4gOCkKLSAgICAgICAgc2hpZnQgPSA4OwotCi0gICAgIGlmIChzaGlmdCA8IDApCi0gICAgICAgIHNoaWZ0ID0gMDsKLQotICAgICBwbmdfcHRyLT5nYW1tYV9zaGlmdCA9IChwbmdfYnl0ZSlzaGlmdDsKLQotICAgICBudW0gPSAoMSA8PCAoOCAtIHNoaWZ0KSk7Ci0KLSAgICAgaWYgKHBuZ19wdHItPnNjcmVlbl9nYW1tYSA+IC4wMDAwMDEpCi0gICAgICAgIGcgPSAxLjAgLyAocG5nX3B0ci0+Z2FtbWEgKiBwbmdfcHRyLT5zY3JlZW5fZ2FtbWEpOwotICAgICBlbHNlCi0gICAgICAgIGcgPSAxLjA7Ci0KLSAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGUgPSAocG5nX3VpbnRfMTZwcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgIChwbmdfdWludF8zMikobnVtICogcG5nX3NpemVvZihwbmdfdWludF8xNnApKSk7Ci0gICAgIHBuZ19tZW1zZXQocG5nX3B0ci0+Z2FtbWFfMTZfdGFibGUsIDAsIG51bSAqIHBuZ19zaXplb2YocG5nX3VpbnRfMTZwKSk7IAotCi0gICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HXzE2X1RPXzggfCBQTkdfQkFDS0dST1VORCkpCi0gICAgIHsKLSAgICAgICAgZG91YmxlIGZpbiwgZm91dDsKLSAgICAgICAgcG5nX3VpbnRfMzIgbGFzdCwgbWF4OwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKLSAgICAgICAgewotICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV8xNl90YWJsZVtpXSA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpKDI1NiAqIHBuZ19zaXplb2YocG5nX3VpbnRfMTYpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnID0gMS4wIC8gZzsKLSAgICAgICAgbGFzdCA9IDA7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICBmb3V0ID0gKChkb3VibGUpaSArIDAuNSkgLyAyNTYuMDsKLSAgICAgICAgICAgZmluID0gcG93KGZvdXQsIGcpOwotICAgICAgICAgICBtYXggPSAocG5nX3VpbnRfMzIpKGZpbiAqIChkb3VibGUpKChwbmdfdWludF8zMiludW0gPDwgOCkpOwotICAgICAgICAgICB3aGlsZSAobGFzdCA8PSBtYXgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGVbKGludCkobGFzdCAmICgweGZmID4+IHNoaWZ0KSldCi0gICAgICAgICAgICAgICAgIFsoaW50KShsYXN0ID4+ICg4IC0gc2hpZnQpKV0gPSAocG5nX3VpbnRfMTYpKAotICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMTYpaSB8ICgocG5nX3VpbnRfMTYpaSA8PCA4KSk7Ci0gICAgICAgICAgICAgIGxhc3QrKzsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChsYXN0IDwgKChwbmdfdWludF8zMiludW0gPDwgOCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdGFibGVbKGludCkobGFzdCAmICgweGZmID4+IHNoaWZ0KSldCi0gICAgICAgICAgICAgIFsoaW50KShsYXN0ID4+ICg4IC0gc2hpZnQpKV0gPSAocG5nX3VpbnRfMTYpNjU1MzVMOwotICAgICAgICAgICBsYXN0Kys7Ci0gICAgICAgIH0KLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlW2ldID0gKHBuZ191aW50XzE2cClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgICAgIChwbmdfdWludF8zMikoMjU2ICogcG5nX3NpemVvZihwbmdfdWludF8xNikpKTsKLQotICAgICAgICAgICBpZyA9ICgoKHBuZ191aW50XzMyKWkgKiAocG5nX3VpbnRfMzIpcG5nX2dhbW1hX3NoaWZ0W3NoaWZ0XSkgPj4gNCk7Ci0KLSAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RhYmxlW2ldW2pdID0KLSAgICAgICAgICAgICAgICAgKHBuZ191aW50XzE2KShwb3coKGRvdWJsZSkoaWcgKyAoKHBuZ191aW50XzMyKWogPDwgOCkpIC8KLSAgICAgICAgICAgICAgICAgICAgNjU1MzUuMCwgZykgKiA2NTUzNS4wICsgLjUpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgfQotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgfHwgXAotICAgZGVmaW5lZChQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQpCi0gICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0JBQ0tHUk9VTkQgfCBQTkdfUkdCX1RPX0dSQVkpKQotICAgICB7Ci0KLSAgICAgICAgZyA9IDEuMCAvIChwbmdfcHRyLT5nYW1tYSk7Ci0KLSAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSA9IChwbmdfdWludF8xNnBwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgKHBuZ191aW50XzMyKShudW0gKiBwbmdfc2l6ZW9mKHBuZ191aW50XzE2cCApKSk7Ci0gICAgICAgIHBuZ19tZW1zZXQocG5nX3B0ci0+Z2FtbWFfMTZfdG9fMSwgMCwgbnVtICogcG5nX3NpemVvZihwbmdfdWludF8xNnApKTsgCi0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbaV0gPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgICAgKHBuZ191aW50XzMyKSgyNTYgKiBwbmdfc2l6ZW9mKHBuZ191aW50XzE2KSkpOwotCi0gICAgICAgICAgIGlnID0gKCgocG5nX3VpbnRfMzIpaSAqCi0gICAgICAgICAgICAgIChwbmdfdWludF8zMilwbmdfZ2FtbWFfc2hpZnRbc2hpZnRdKSA+PiA0KTsKLSAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X3RvXzFbaV1bal0gPQotICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMTYpKHBvdygoZG91YmxlKShpZyArICgocG5nX3VpbnRfMzIpaiA8PCA4KSkgLwotICAgICAgICAgICAgICAgICAgICA2NTUzNS4wLCBnKSAqIDY1NTM1LjAgKyAuNSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwbmdfcHRyLT5zY3JlZW5fZ2FtbWEgPiAwLjAwMDAwMSkKLSAgICAgICAgICAgZyA9IDEuMCAvIHBuZ19wdHItPnNjcmVlbl9nYW1tYTsKLQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGcgPSBwbmdfcHRyLT5nYW1tYTsgICAvKiBQcm9iYWJseSBkb2luZyByZ2JfdG9fZ3JheSAqLwotCi0gICAgICAgIHBuZ19wdHItPmdhbW1hXzE2X2Zyb21fMSA9IChwbmdfdWludF8xNnBwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgKHBuZ191aW50XzMyKShudW0gKiBwbmdfc2l6ZW9mKHBuZ191aW50XzE2cCkpKTsKLSAgICAgICAgcG5nX21lbXNldChwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzEsIDAsCi0gICAgICAgICAgIG51bSAqIHBuZ19zaXplb2YocG5nX3VpbnRfMTZwKSk7IAotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKLSAgICAgICAgewotICAgICAgICAgICBwbmdfcHRyLT5nYW1tYV8xNl9mcm9tXzFbaV0gPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgICAgKHBuZ191aW50XzMyKSgyNTYgKiBwbmdfc2l6ZW9mKHBuZ191aW50XzE2KSkpOwotCi0gICAgICAgICAgIGlnID0gKCgocG5nX3VpbnRfMzIpaSAqCi0gICAgICAgICAgICAgIChwbmdfdWludF8zMilwbmdfZ2FtbWFfc2hpZnRbc2hpZnRdKSA+PiA0KTsKLQotICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcG5nX3B0ci0+Z2FtbWFfMTZfZnJvbV8xW2ldW2pdID0KLSAgICAgICAgICAgICAgICAgKHBuZ191aW50XzE2KShwb3coKGRvdWJsZSkoaWcgKyAoKHBuZ191aW50XzMyKWogPDwgOCkpIC8KLSAgICAgICAgICAgICAgICAgICAgNjU1MzUuMCwgZykgKiA2NTUzNS4wICsgLjUpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgfQotI2VuZGlmIC8qIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEIHx8IFBOR19SR0JfVE9fR1JBWV9TVVBQT1JURUQgKi8KLSAgfQotfQotI2VuZGlmCi0vKiBUbyBkbzogaW5zdGFsbCBpbnRlZ2VyIHZlcnNpb24gb2YgcG5nX2J1aWxkX2dhbW1hX3RhYmxlIGhlcmUgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCkKLS8qIFVuZG9lcyBpbnRyYXBpeGVsIGRpZmZlcmVuY2luZyAgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3JlYWRfaW50cmFwaXhlbChwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmVhZF9pbnRyYXBpeGVsIik7Ci0gICBpZiAoCi0jaWYgZGVmaW5lZChQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQpCi0gICAgICAgcm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCAmJgotI2VuZGlmCi0gICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQotICAgewotICAgICAgaW50IGJ5dGVzX3Blcl9waXhlbDsKLSAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLSAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgcnA7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gMzsKLQotICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNDsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSBieXRlc19wZXJfcGl4ZWwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAqKHJwKSA9IChwbmdfYnl0ZSkoKDI1NiArICpycCArICoocnArMSkpJjB4ZmYpOwotICAgICAgICAgICAgKihycCsyKSA9IChwbmdfYnl0ZSkoKDI1NiArICoocnArMikgKyAqKHJwKzEpKSYweGZmKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgcnA7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNjsKLQotICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gODsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSBieXRlc19wZXJfcGl4ZWwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBzMCAgID0gKCoocnAgICAgKSA8PCA4KSB8ICoocnAgKyAxKTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHMxICAgPSAoKihycCArIDIpIDw8IDgpIHwgKihycCArIDMpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgczIgICA9ICgqKHJwICsgNCkgPDwgOCkgfCAqKHJwICsgNSk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByZWQgID0gKHBuZ191aW50XzMyKSgoczAgKyBzMSArIDY1NTM2TCkgJiAweGZmZmZMKTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGJsdWUgPSAocG5nX3VpbnRfMzIpKChzMiArIHMxICsgNjU1MzZMKSAmIDB4ZmZmZkwpOwotICAgICAgICAgICAgKihycCAgKSA9IChwbmdfYnl0ZSkoKHJlZCA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgKihycCsxKSA9IChwbmdfYnl0ZSkocmVkICYgMHhmZik7Ci0gICAgICAgICAgICAqKHJwKzQpID0gKHBuZ19ieXRlKSgoYmx1ZSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgKihycCs1KSA9IChwbmdfYnl0ZSkoYmx1ZSAmIDB4ZmYpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotI2VuZGlmIC8qIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wbmdydXRpbC5jIGIvbGlicy9saWJwbmcvcG5ncnV0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxZTNmNy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wbmdydXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI0NCArMCwwIEBACi0KLS8qIHBuZ3J1dGlsLmMgLSB1dGlsaXRpZXMgdG8gcmVhZCBhIFBORyBmaWxlCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuMzcgW0p1bmUgNCwgMjAwOV0KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdGhhdCBhcmUgb25seSBjYWxsZWQgZnJvbSB3aXRoaW4KLSAqIGxpYnBuZyBpdHNlbGYgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgcmVhZGluZyBhbiBpbWFnZS4KLSAqLwotCi0jZGVmaW5lIFBOR19JTlRFUk5BTAotI2luY2x1ZGUgInBuZy5oIgotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKQotCi0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAoX1dJTjMyX1dDRTwweDUwMCkKLSMgIGRlZmluZSBXSU4zMl9XQ0VfT0xECi0jZW5kaWYKLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSMgIGlmIGRlZmluZWQoV0lOMzJfV0NFX09MRCkKLS8qIFRoZSBzdHJ0b2QoKSBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NDRSAqLwotX19pbmxpbmUgZG91YmxlIHBuZ19zdHJ0b2QocG5nX3N0cnVjdHAgcG5nX3B0ciwgUE5HX0NPTlNUIGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIpCi17Ci0gICBkb3VibGUgcmVzdWx0ID0gMDsKLSAgIGludCBsZW47Ci0gICB3Y2hhcl90ICpzdHIsICplbmQ7Ci0KLSAgIGxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBucHRyLCAtMSwgTlVMTCwgMCk7Ci0gICBzdHIgPSAod2NoYXJfdCAqKXBuZ19tYWxsb2MocG5nX3B0ciwgbGVuICogcG5nX3NpemVvZih3Y2hhcl90KSk7Ci0gICBpZiAoIE5VTEwgIT0gc3RyICkKLSAgIHsKLSAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBucHRyLCAtMSwgc3RyLCBsZW4pOwotICAgICAgcmVzdWx0ID0gd2NzdG9kKHN0ciwgJmVuZCk7Ci0gICAgICBsZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgZW5kLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci0gICAgICAqZW5kcHRyID0gKGNoYXIgKilucHRyICsgKHBuZ19zdHJsZW4obnB0cikgLSBsZW4gKyAxKTsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHN0cik7Ci0gICB9Ci0gICByZXR1cm4gcmVzdWx0OwotfQotIyAgZWxzZQotIyAgICBkZWZpbmUgcG5nX3N0cnRvZChwLGEsYikgc3RydG9kKGEsYikKLSMgIGVuZGlmCi0jZW5kaWYKLQotcG5nX3VpbnRfMzIgUE5HQVBJCi1wbmdfZ2V0X3VpbnRfMzEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGJ1ZikKLXsKLSNpZmRlZiBQTkdfUkVBRF9CSUdfRU5ESUFOX1NVUFBPUlRFRAotICAgcG5nX3VpbnRfMzIgaSA9IHBuZ19nZXRfdWludF8zMihidWYpOwotI2Vsc2UKLSAgIC8qIEF2b2lkIGFuIGV4dHJhIGZ1bmN0aW9uIGNhbGwgYnkgaW5saW5pbmcgdGhlIHJlc3VsdC4gKi8KLSAgIHBuZ191aW50XzMyIGkgPSAoKHBuZ191aW50XzMyKSgqYnVmKSA8PCAyNCkgKwotICAgICAgKChwbmdfdWludF8zMikoKihidWYgKyAxKSkgPDwgMTYpICsKLSAgICAgICgocG5nX3VpbnRfMzIpKCooYnVmICsgMikpIDw8IDgpICsKLSAgICAgIChwbmdfdWludF8zMikoKihidWYgKyAzKSk7Ci0jZW5kaWYKLSAgIGlmIChpID4gUE5HX1VJTlRfMzFfTUFYKQotICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlBORyB1bnNpZ25lZCBpbnRlZ2VyIG91dCBvZiByYW5nZS4iKTsKLSAgIHJldHVybiAoaSk7Ci19Ci0jaWZuZGVmIFBOR19SRUFEX0JJR19FTkRJQU5fU1VQUE9SVEVECi0vKiBHcmFiIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGZyb20gYSBidWZmZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXQuICovCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19nZXRfdWludF8zMihwbmdfYnl0ZXAgYnVmKQotewotICAgcG5nX3VpbnRfMzIgaSA9ICgocG5nX3VpbnRfMzIpKCpidWYpIDw8IDI0KSArCi0gICAgICAoKHBuZ191aW50XzMyKSgqKGJ1ZiArIDEpKSA8PCAxNikgKwotICAgICAgKChwbmdfdWludF8zMikoKihidWYgKyAyKSkgPDwgOCkgKwotICAgICAgKHBuZ191aW50XzMyKSgqKGJ1ZiArIDMpKTsKLQotICAgcmV0dXJuIChpKTsKLX0KLQotLyogR3JhYiBhIHNpZ25lZCAzMi1iaXQgaW50ZWdlciBmcm9tIGEgYnVmZmVyIGluIGJpZy1lbmRpYW4gZm9ybWF0LiAgVGhlCi0gKiBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgUE5HIGZpbGUgaW4gdHdvJ3MgY29tcGxlbWVudCBmb3JtYXQsIGFuZCBpdCBpcwotICogYXNzdW1lZCB0aGF0IHRoZSBtYWNoaW5lIGZvcm1hdCBmb3Igc2lnbmVkIGludGVnZXJzIGlzIHRoZSBzYW1lLgotICovCi1wbmdfaW50XzMyIFBOR0FQSQotcG5nX2dldF9pbnRfMzIocG5nX2J5dGVwIGJ1ZikKLXsKLSAgIHBuZ19pbnRfMzIgaSA9ICgocG5nX2ludF8zMikoKmJ1ZikgPDwgMjQpICsKLSAgICAgICgocG5nX2ludF8zMikoKihidWYgKyAxKSkgPDwgMTYpICsKLSAgICAgICgocG5nX2ludF8zMikoKihidWYgKyAyKSkgPDwgOCkgKwotICAgICAgKHBuZ19pbnRfMzIpKCooYnVmICsgMykpOwotCi0gICByZXR1cm4gKGkpOwotfQotCi0vKiBHcmFiIGFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIGZyb20gYSBidWZmZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXQuICovCi1wbmdfdWludF8xNiBQTkdBUEkKLXBuZ19nZXRfdWludF8xNihwbmdfYnl0ZXAgYnVmKQotewotICAgcG5nX3VpbnRfMTYgaSA9IChwbmdfdWludF8xNikoKChwbmdfdWludF8xNikoKmJ1ZikgPDwgOCkgKwotICAgICAgKHBuZ191aW50XzE2KSgqKGJ1ZiArIDEpKSk7Ci0KLSAgIHJldHVybiAoaSk7Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfQklHX0VORElBTl9TVVBQT1JURUQgKi8KLQotLyogUmVhZCB0aGUgY2h1bmsgaGVhZGVyIChsZW5ndGggKyB0eXBlIG5hbWUpLgotICogUHV0IHRoZSB0eXBlIG5hbWUgaW50byBwbmdfcHRyLT5jaHVua19uYW1lLCBhbmQgcmV0dXJuIHRoZSBsZW5ndGguCi0gKi8KLXBuZ191aW50XzMyIC8qIFBSSVZBVEUgKi8KLXBuZ19yZWFkX2NodW5rX2hlYWRlcihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2J5dGUgYnVmWzhdOwotICAgcG5nX3VpbnRfMzIgbGVuZ3RoOwotCi0gICAvKiBSZWFkIHRoZSBsZW5ndGggYW5kIHRoZSBjaHVuayBuYW1lICovCi0gICBwbmdfcmVhZF9kYXRhKHBuZ19wdHIsIGJ1ZiwgOCk7Ci0gICBsZW5ndGggPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgYnVmKTsKLQotICAgLyogUHV0IHRoZSBjaHVuayBuYW1lIGludG8gcG5nX3B0ci0+Y2h1bmtfbmFtZSAqLwotICAgcG5nX21lbWNweShwbmdfcHRyLT5jaHVua19uYW1lLCBidWYgKyA0LCA0KTsKLQotICAgcG5nX2RlYnVnMigwLCAiUmVhZGluZyAlcyBjaHVuaywgbGVuZ3RoID0gJWx1IiwKLSAgICAgIHBuZ19wdHItPmNodW5rX25hbWUsIGxlbmd0aCk7Ci0KLSAgIC8qIFJlc2V0IHRoZSBjcmMgYW5kIHJ1biBpdCBvdmVyIHRoZSBjaHVuayBuYW1lICovCi0gICBwbmdfcmVzZXRfY3JjKHBuZ19wdHIpOwotICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtfbmFtZSwgNCk7Ci0KLSAgIC8qIENoZWNrIHRvIHNlZSBpZiBjaHVuayBuYW1lIGlzIHZhbGlkICovCi0gICBwbmdfY2hlY2tfY2h1bmtfbmFtZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19uYW1lKTsKLQotICAgcmV0dXJuIGxlbmd0aDsKLX0KLQotLyogUmVhZCBkYXRhLCBhbmQgKG9wdGlvbmFsbHkpIHJ1biBpdCB0aHJvdWdoIHRoZSBDUkMuICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19jcmNfcmVhZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcmVhZF9kYXRhKHBuZ19wdHIsIGJ1ZiwgbGVuZ3RoKTsKLSAgIHBuZ19jYWxjdWxhdGVfY3JjKHBuZ19wdHIsIGJ1ZiwgbGVuZ3RoKTsKLX0KLQotLyogT3B0aW9uYWxseSBza2lwIGRhdGEgYW5kIHRoZW4gY2hlY2sgdGhlIENSQy4gIERlcGVuZGluZyBvbiB3aGV0aGVyIHdlCi0gKiBhcmUgcmVhZGluZyBhIGFuY2lsbGFyeSBvciBjcml0aWNhbCBjaHVuaywgYW5kIGhvdyB0aGUgcHJvZ3JhbSBoYXMgc2V0Ci0gKiB0aGluZ3MgdXAsIHdlIG1heSBjYWxjdWxhdGUgdGhlIENSQyBvbiB0aGUgZGF0YSBhbmQgcHJpbnQgYSBtZXNzYWdlLgotICogUmV0dXJucyAnMScgaWYgdGhlcmUgd2FzIGEgQ1JDIGVycm9yLCAnMCcgb3RoZXJ3aXNlLgotICovCi1pbnQgLyogUFJJVkFURSAqLwotcG5nX2NyY19maW5pc2gocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2tpcCkKLXsKLSAgIHBuZ19zaXplX3QgaTsKLSAgIHBuZ19zaXplX3QgaXN0b3AgPSBwbmdfcHRyLT56YnVmX3NpemU7Ci0KLSAgIGZvciAoaSA9IChwbmdfc2l6ZV90KXNraXA7IGkgPiBpc3RvcDsgaSAtPSBpc3RvcCkKLSAgIHsKLSAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBwbmdfcHRyLT56YnVmLCBwbmdfcHRyLT56YnVmX3NpemUpOwotICAgfQotICAgaWYgKGkpCi0gICB7Ci0gICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwgaSk7Ci0gICB9Ci0KLSAgIGlmIChwbmdfY3JjX2Vycm9yKHBuZ19wdHIpKQotICAgewotICAgICAgaWYgKCgocG5nX3B0ci0+Y2h1bmtfbmFtZVswXSAmIDB4MjApICYmICAgICAgICAgICAgICAgIC8qIEFuY2lsbGFyeSAqLwotICAgICAgICAgICEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTikpIHx8Ci0gICAgICAgICAgKCEocG5nX3B0ci0+Y2h1bmtfbmFtZVswXSAmIDB4MjApICYmICAgICAgICAgICAgIC8qIENyaXRpY2FsICAqLwotICAgICAgICAgIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19DUklUSUNBTF9VU0UpKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsICJDUkMgZXJyb3IiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIHBuZ19jaHVua19lcnJvcihwbmdfcHRyLCAiQ1JDIGVycm9yIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKDEpOwotICAgfQotCi0gICByZXR1cm4gKDApOwotfQotCi0vKiBDb21wYXJlIHRoZSBDUkMgc3RvcmVkIGluIHRoZSBQTkcgZmlsZSB3aXRoIHRoYXQgY2FsY3VsYXRlZCBieSBsaWJwbmcgZnJvbQotICogdGhlIGRhdGEgaXQgaGFzIHJlYWQgdGh1cyBmYXIuCi0gKi8KLWludCAvKiBQUklWQVRFICovCi1wbmdfY3JjX2Vycm9yKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfYnl0ZSBjcmNfYnl0ZXNbNF07Ci0gICBwbmdfdWludF8zMiBjcmM7Ci0gICBpbnQgbmVlZF9jcmMgPSAxOwotCi0gICBpZiAocG5nX3B0ci0+Y2h1bmtfbmFtZVswXSAmIDB4MjApICAgICAgICAgICAgICAgICAgICAgLyogYW5jaWxsYXJ5ICovCi0gICB7Ci0gICAgICBpZiAoKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLKSA9PQotICAgICAgICAgIChQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSB8IFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKSkKLSAgICAgICAgIG5lZWRfY3JjID0gMDsKLSAgIH0KLSAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JpdGljYWwgKi8KLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19DUklUSUNBTF9JR05PUkUpCi0gICAgICAgICBuZWVkX2NyYyA9IDA7Ci0gICB9Ci0KLSAgIHBuZ19yZWFkX2RhdGEocG5nX3B0ciwgY3JjX2J5dGVzLCA0KTsKLQotICAgaWYgKG5lZWRfY3JjKQotICAgewotICAgICAgY3JjID0gcG5nX2dldF91aW50XzMyKGNyY19ieXRlcyk7Ci0gICAgICByZXR1cm4gKChpbnQpKGNyYyAhPSBwbmdfcHRyLT5jcmMpKTsKLSAgIH0KLSAgIGVsc2UKLSAgICAgIHJldHVybiAoMCk7Ci19Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX3pUWHRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX2lUWHRfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRCkKLS8qCi0gKiBEZWNvbXByZXNzIHRyYWlsaW5nIGRhdGEgaW4gYSBjaHVuay4gIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgY2h1bmtkYXRhCi0gKiBwb2ludHMgYXQgYW4gYWxsb2NhdGVkIGFyZWEgaG9sZGluZyB0aGUgY29udGVudHMgb2YgYSBjaHVuayB3aXRoIGEKLSAqIHRyYWlsaW5nIGNvbXByZXNzZWQgcGFydC4gIFdoYXQgd2UgZ2V0IGJhY2sgaXMgYW4gYWxsb2NhdGVkIGFyZWEKLSAqIGhvbGRpbmcgdGhlIG9yaWdpbmFsIHByZWZpeCBwYXJ0IGFuZCBhbiB1bmNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUKLSAqIHRyYWlsaW5nIHBhcnQgKHRoZSBtYWxsb2MgYXJlYSBwYXNzZWQgaW4gaXMgZnJlZWQpLgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kZWNvbXByZXNzX2NodW5rKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBjb21wX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfc2l6ZV90IGNodW5rbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3NpemVfdCBwcmVmaXhfc2l6ZSwgcG5nX3NpemVfdCAqbmV3bGVuZ3RoKQotewotICAgc3RhdGljIFBOR19DT05TVCBjaGFyIG1zZ1tdID0gIkVycm9yIGRlY29kaW5nIGNvbXByZXNzZWQgdGV4dCI7Ci0gICBwbmdfY2hhcnAgdGV4dDsKLSAgIHBuZ19zaXplX3QgdGV4dF9zaXplOwotCi0gICBpZiAoY29tcF90eXBlID09IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpCi0gICB7Ci0gICAgICBpbnQgcmV0ID0gWl9PSzsKLSAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IChwbmdfYnl0ZXApKHBuZ19wdHItPmNodW5rZGF0YSArIHByZWZpeF9zaXplKTsKLSAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAodUludCkoY2h1bmtsZW5ndGggLSBwcmVmaXhfc2l6ZSk7Ci0gICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLSAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOwotCi0gICAgICB0ZXh0X3NpemUgPSAwOwotICAgICAgdGV4dCA9IE5VTEw7Ci0KLSAgICAgIHdoaWxlIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luKQotICAgICAgewotICAgICAgICAgcmV0ID0gaW5mbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9QQVJUSUFMX0ZMVVNIKTsKLSAgICAgICAgIGlmIChyZXQgIT0gWl9PSyAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0ubXNnICE9IE5VTEwpCi0gICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOwotICAgICAgICAgICAgaW5mbGF0ZVJlc2V0KCZwbmdfcHRyLT56c3RyZWFtKTsKLSAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAwOwotCi0gICAgICAgICAgICBpZiAodGV4dCA9PSAgTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHRleHRfc2l6ZSA9IHByZWZpeF9zaXplICsgcG5nX3NpemVvZihtc2cpICsgMTsKLSAgICAgICAgICAgICAgIHRleHQgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCB0ZXh0X3NpemUpOwotICAgICAgICAgICAgICAgaWYgKHRleHQgPT0gIE5VTEwpCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvbXByZXNzIGNodW5rIik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHBuZ19tZW1jcHkodGV4dCwgcG5nX3B0ci0+Y2h1bmtkYXRhLCBwcmVmaXhfc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRleHRbdGV4dF9zaXplIC0gMV0gPSAweDAwOwotCi0gICAgICAgICAgICAvKiBDb3B5IHdoYXQgd2UgY2FuIG9mIHRoZSBlcnJvciBtZXNzYWdlIGludG8gdGhlIHRleHQgY2h1bmsgKi8KLSAgICAgICAgICAgIHRleHRfc2l6ZSA9IChwbmdfc2l6ZV90KShjaHVua2xlbmd0aCAtCi0gICAgICAgICAgICAgICh0ZXh0IC0gcG5nX3B0ci0+Y2h1bmtkYXRhKSAtIDEpOwotICAgICAgICAgICAgaWYgKHRleHRfc2l6ZSA+IHBuZ19zaXplb2YobXNnKSkKLSAgICAgICAgICAgICAgIHRleHRfc2l6ZSA9IHBuZ19zaXplb2YobXNnKTsKLSAgICAgICAgICAgIHBuZ19tZW1jcHkodGV4dCArIHByZWZpeF9zaXplLCBtc2csIHRleHRfc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICghcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgfHwgcmV0ID09IFpfU1RSRUFNX0VORCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0ZXh0ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB0ZXh0X3NpemUgPSBwcmVmaXhfc2l6ZSArCi0gICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+emJ1Zl9zaXplIC0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQ7Ci0gICAgICAgICAgICAgICB0ZXh0ID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgdGV4dF9zaXplICsgMSk7Ci0gICAgICAgICAgICAgICBpZiAodGV4dCA9PSAgTlVMTCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICAgICAgICAgICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvbXByZXNzIGNodW5rLiIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcG5nX21lbWNweSh0ZXh0ICsgcHJlZml4X3NpemUsIHBuZ19wdHItPnpidWYsCi0gICAgICAgICAgICAgICAgICAgIHRleHRfc2l6ZSAtIHByZWZpeF9zaXplKTsKLSAgICAgICAgICAgICAgIHBuZ19tZW1jcHkodGV4dCwgcG5nX3B0ci0+Y2h1bmtkYXRhLCBwcmVmaXhfc2l6ZSk7Ci0gICAgICAgICAgICAgICAqKHRleHQgKyB0ZXh0X3NpemUpID0gMHgwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19jaGFycCB0bXA7Ci0KLSAgICAgICAgICAgICAgIHRtcCA9IHRleHQ7Ci0gICAgICAgICAgICAgICB0ZXh0ID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgIChwbmdfdWludF8zMikodGV4dF9zaXplICsKLSAgICAgICAgICAgICAgICAgIHBuZ19wdHItPnpidWZfc2l6ZSAtIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ICsgMSkpOwotICAgICAgICAgICAgICAgaWYgKHRleHQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHRtcCk7Ci0gICAgICAgICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgICAgICAgICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb21wcmVzcyBjaHVuay4uIik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBwbmdfbWVtY3B5KHRleHQsIHRtcCwgdGV4dF9zaXplKTsKLSAgICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHRtcCk7Ci0gICAgICAgICAgICAgICBwbmdfbWVtY3B5KHRleHQgKyB0ZXh0X3NpemUsIHBuZ19wdHItPnpidWYsCi0gICAgICAgICAgICAgICAgICAocG5nX3B0ci0+emJ1Zl9zaXplIC0gcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpKTsKLSAgICAgICAgICAgICAgIHRleHRfc2l6ZSArPSBwbmdfcHRyLT56YnVmX3NpemUgLSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dDsKLSAgICAgICAgICAgICAgICoodGV4dCArIHRleHRfc2l6ZSkgPSAweDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCi0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAocmV0ICE9IFpfU1RSRUFNX0VORCkKLSAgICAgIHsKLSNpZiAhZGVmaW5lZChQTkdfTk9fU1RESU8pICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICAgICAgICBjaGFyIHVtc2dbNTJdOwotCi0gICAgICAgICBpZiAocmV0ID09IFpfQlVGX0VSUk9SKQotICAgICAgICAgICAgcG5nX3NucHJpbnRmKHVtc2csIDUyLAotICAgICAgICAgICAgICAgICJCdWZmZXIgZXJyb3IgaW4gY29tcHJlc3NlZCBkYXRhc3RyZWFtIGluICVzIGNodW5rIiwKLSAgICAgICAgICAgICAgICBwbmdfcHRyLT5jaHVua19uYW1lKTsKLQotICAgICAgICAgZWxzZSBpZiAocmV0ID09IFpfREFUQV9FUlJPUikKLSAgICAgICAgICAgIHBuZ19zbnByaW50Zih1bXNnLCA1MiwKLSAgICAgICAgICAgICAgICAiRGF0YSBlcnJvciBpbiBjb21wcmVzc2VkIGRhdGFzdHJlYW0gaW4gJXMgY2h1bmsiLAotICAgICAgICAgICAgICAgIHBuZ19wdHItPmNodW5rX25hbWUpOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBwbmdfc25wcmludGYodW1zZywgNTIsCi0gICAgICAgICAgICAgICAgIkluY29tcGxldGUgY29tcHJlc3NlZCBkYXRhc3RyZWFtIGluICVzIGNodW5rIiwKLSAgICAgICAgICAgICAgICBwbmdfcHRyLT5jaHVua19uYW1lKTsKLQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgdW1zZyk7Ci0jZWxzZQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICAgICJJbmNvbXBsZXRlIGNvbXByZXNzZWQgZGF0YXN0cmVhbSBpbiBjaHVuayBvdGhlciB0aGFuIElEQVQiKTsKLSNlbmRpZgotICAgICAgICAgdGV4dF9zaXplID0gcHJlZml4X3NpemU7Ci0gICAgICAgICBpZiAodGV4dCA9PSAgTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHRleHQgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCB0ZXh0X3NpemUrMSk7Ci0gICAgICAgICAgICBpZiAodGV4dCA9PSBOVUxMKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgICAgICAgICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIHRleHQuIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBuZ19tZW1jcHkodGV4dCwgcG5nX3B0ci0+Y2h1bmtkYXRhLCBwcmVmaXhfc2l6ZSk7Ci0gICAgICAgICB9Ci0gICAgICAgICAqKHRleHQgKyB0ZXh0X3NpemUpID0gMHgwMDsKLSAgICAgIH0KLQotICAgICAgaW5mbGF0ZVJlc2V0KCZwbmdfcHRyLT56c3RyZWFtKTsKLSAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gPSAwOwotCi0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gdGV4dDsKLSAgICAgICpuZXdsZW5ndGg9dGV4dF9zaXplOwotICAgfQotICAgZWxzZSAvKiBpZiAoY29tcF90eXBlICE9IFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UpICovCi0gICB7Ci0jaWYgIWRlZmluZWQoUE5HX05PX1NURElPKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotICAgICAgY2hhciB1bXNnWzUwXTsKLQotICAgICAgcG5nX3NucHJpbnRmKHVtc2csIDUwLCAiVW5rbm93biB6VFh0IGNvbXByZXNzaW9uIHR5cGUgJWQiLCBjb21wX3R5cGUpOwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgdW1zZyk7Ci0jZWxzZQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gelRYdCBjb21wcmVzc2lvbiB0eXBlIik7Ci0jZW5kaWYKLQotICAgICAgKihwbmdfcHRyLT5jaHVua2RhdGEgKyBwcmVmaXhfc2l6ZSkgPSAweDAwOwotICAgICAgKm5ld2xlbmd0aCA9IHByZWZpeF9zaXplOwotICAgfQotfQotI2VuZGlmCi0KLS8qIFJlYWQgYW5kIGNoZWNrIHRoZSBJREhSIGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfSUhEUihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19ieXRlIGJ1ZlsxM107Ci0gICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OwotICAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgZmlsdGVyX3R5cGU7Ci0gICBpbnQgaW50ZXJsYWNlX3R5cGU7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9JSERSIik7Ci0KLSAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT3V0IG9mIHBsYWNlIElIRFIiKTsKLQotICAgLyogQ2hlY2sgdGhlIGxlbmd0aCAqLwotICAgaWYgKGxlbmd0aCAhPSAxMykKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBJSERSIGNodW5rIik7Ci0KLSAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfSUhEUjsKLQotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMTMpOwotICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCk7Ci0KLSAgIHdpZHRoID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGJ1Zik7Ci0gICBoZWlnaHQgPSBwbmdfZ2V0X3VpbnRfMzEocG5nX3B0ciwgYnVmICsgNCk7Ci0gICBiaXRfZGVwdGggPSBidWZbOF07Ci0gICBjb2xvcl90eXBlID0gYnVmWzldOwotICAgY29tcHJlc3Npb25fdHlwZSA9IGJ1ZlsxMF07Ci0gICBmaWx0ZXJfdHlwZSA9IGJ1ZlsxMV07Ci0gICBpbnRlcmxhY2VfdHlwZSA9IGJ1ZlsxMl07Ci0KLSAgIC8qIFNldCBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KLSAgIHBuZ19wdHItPndpZHRoID0gd2lkdGg7Ci0gICBwbmdfcHRyLT5oZWlnaHQgPSBoZWlnaHQ7Ci0gICBwbmdfcHRyLT5iaXRfZGVwdGggPSAocG5nX2J5dGUpYml0X2RlcHRoOwotICAgcG5nX3B0ci0+aW50ZXJsYWNlZCA9IChwbmdfYnl0ZSlpbnRlcmxhY2VfdHlwZTsKLSAgIHBuZ19wdHItPmNvbG9yX3R5cGUgPSAocG5nX2J5dGUpY29sb3JfdHlwZTsKLSNpZiBkZWZpbmVkKFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEKQotICAgcG5nX3B0ci0+ZmlsdGVyX3R5cGUgPSAocG5nX2J5dGUpZmlsdGVyX3R5cGU7Ci0jZW5kaWYKLSAgIHBuZ19wdHItPmNvbXByZXNzaW9uX3R5cGUgPSAocG5nX2J5dGUpY29tcHJlc3Npb25fdHlwZTsKLQotICAgLyogRmluZCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgIHN3aXRjaCAocG5nX3B0ci0+Y29sb3JfdHlwZSkKLSAgIHsKLSAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKLSAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRURToKLSAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gMTsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKLSAgICAgICAgIHBuZ19wdHItPmNoYW5uZWxzID0gMzsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE6Ci0gICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDI7Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6Ci0gICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDQ7Ci0gICAgICAgICBicmVhazsKLSAgIH0KLQotICAgLyogU2V0IHVwIG90aGVyIHVzZWZ1bCBpbmZvICovCi0gICBwbmdfcHRyLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkocG5nX3B0ci0+Yml0X2RlcHRoICoKLSAgIHBuZ19wdHItPmNoYW5uZWxzKTsKLSAgIHBuZ19wdHItPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHBuZ19wdHItPnBpeGVsX2RlcHRoLCBwbmdfcHRyLT53aWR0aCk7Ci0gICBwbmdfZGVidWcxKDMsICJiaXRfZGVwdGggPSAlZCIsIHBuZ19wdHItPmJpdF9kZXB0aCk7Ci0gICBwbmdfZGVidWcxKDMsICJjaGFubmVscyA9ICVkIiwgcG5nX3B0ci0+Y2hhbm5lbHMpOwotICAgcG5nX2RlYnVnMSgzLCAicm93Ynl0ZXMgPSAlbHUiLCBwbmdfcHRyLT5yb3dieXRlcyk7Ci0gICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwKLSAgICAgIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZSk7Ci19Ci0KLS8qIFJlYWQgYW5kIGNoZWNrIHRoZSBwYWxldHRlICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfUExURShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19jb2xvciBwYWxldHRlW1BOR19NQVhfUEFMRVRURV9MRU5HVEhdOwotICAgaW50IG51bSwgaTsKLSNpZm5kZWYgUE5HX05PX1BPSU5URVJfSU5ERVhJTkcKLSAgIHBuZ19jb2xvcnAgcGFsX3B0cjsKLSNlbmRpZgotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfUExURSIpOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgUExURSIpOwotCi0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIFBMVEUgYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkR1cGxpY2F0ZSBQTFRFIGNodW5rIik7Ci0KLSAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUExURTsKLQotICAgaWYgKCEocG5nX3B0ci0+Y29sb3JfdHlwZSZQTkdfQ09MT1JfTUFTS19DT0xPUikpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAiSWdub3JpbmcgUExURSBjaHVuayBpbiBncmF5c2NhbGUgUE5HIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotI2lmICFkZWZpbmVkKFBOR19SRUFEX09QVF9QTFRFX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICB7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotI2VuZGlmCi0KLSAgIGlmIChsZW5ndGggPiAzKlBOR19NQVhfUEFMRVRURV9MRU5HVEggfHwgbGVuZ3RoICUgMykKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBwYWxldHRlIGNodW5rIik7Ci0gICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgcGFsZXR0ZSBjaHVuayIpOwotICAgICAgfQotICAgfQotCi0gICBudW0gPSAoaW50KWxlbmd0aCAvIDM7Ci0KLSNpZm5kZWYgUE5HX05PX1BPSU5URVJfSU5ERVhJTkcKLSAgIGZvciAoaSA9IDAsIHBhbF9wdHIgPSBwYWxldHRlOyBpIDwgbnVtOyBpKyssIHBhbF9wdHIrKykKLSAgIHsKLSAgICAgIHBuZ19ieXRlIGJ1ZlszXTsKLQotICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgMyk7Ci0gICAgICBwYWxfcHRyLT5yZWQgPSBidWZbMF07Ci0gICAgICBwYWxfcHRyLT5ncmVlbiA9IGJ1ZlsxXTsKLSAgICAgIHBhbF9wdHItPmJsdWUgPSBidWZbMl07Ci0gICB9Ci0jZWxzZQotICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQotICAgewotICAgICAgcG5nX2J5dGUgYnVmWzNdOwotCi0gICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAzKTsKLSAgICAgIC8qIERvbid0IGRlcGVuZCB1cG9uIHBuZ19jb2xvciBiZWluZyBhbnkgb3JkZXIgKi8KLSAgICAgIHBhbGV0dGVbaV0ucmVkID0gYnVmWzBdOwotICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IGJ1ZlsxXTsKLSAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IGJ1ZlsyXTsKLSAgIH0KLSNlbmRpZgotCi0gICAvKiBJZiB3ZSBhY3R1YWxseSBORUVEIHRoZSBQTFRFIGNodW5rIChpZSBmb3IgYSBwYWxldHRlZCBpbWFnZSksIHdlIGRvCi0gICAgKiB3aGF0ZXZlciB0aGUgbm9ybWFsIENSQyBjb25maWd1cmF0aW9uIHRlbGxzIHVzLiAgSG93ZXZlciwgaWYgd2UKLSAgICAqIGhhdmUgYW4gUkdCIGltYWdlLCB0aGUgUExURSBjYW4gYmUgY29uc2lkZXJlZCBhbmNpbGxhcnksIHNvCi0gICAgKiB3ZSB3aWxsIGFjdCBhcyB0aG91Z2ggaXQgaXMuCi0gICAgKi8KLSNpZiAhZGVmaW5lZChQTkdfUkVBRF9PUFRfUExURV9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKTsKLSAgIH0KLSNpZiAhZGVmaW5lZChQTkdfUkVBRF9PUFRfUExURV9TVVBQT1JURUQpCi0gICBlbHNlIGlmIChwbmdfY3JjX2Vycm9yKHBuZ19wdHIpKSAgLyogT25seSBpZiB3ZSBoYXZlIGEgQ1JDIGVycm9yICovCi0gICB7Ci0gICAgICAvKiBJZiB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgZGF0YSBmcm9tIGFuIGFuY2lsbGFyeSBjaHVuaywKLSAgICAgICAgIHdlIGhhdmUgdHdvIG9wdGlvbnM6IGFuIGVycm9yIGFib3J0LCBvciBhIHdhcm5pbmcgYW5kIHdlCi0gICAgICAgICBpZ25vcmUgdGhlIGRhdGEgaW4gdGhpcyBjaHVuayAod2hpY2ggc2hvdWxkIGJlIE9LLCBzaW5jZQotICAgICAgICAgaXQncyBjb25zaWRlcmVkIGFuY2lsbGFyeSBmb3IgYSBSR0Igb3IgUkdCQSBpbWFnZSkuICovCi0gICAgICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFKSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJDUkMgZXJyb3IiKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsICJDUkMgZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8qIE90aGVyd2lzZSwgd2UgKG9wdGlvbmFsbHkpIGVtaXQgYSB3YXJuaW5nIGFuZCB1c2UgdGhlIGNodW5rLiAqLwotICAgICAgZWxzZSBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19jaHVua193YXJuaW5nKHBuZ19wdHIsICJDUkMgZXJyb3IiKTsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotCi0gICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsIG51bSk7Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX3RSTlNfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgIHsKLSAgICAgIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190Uk5TKSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT5udW1fdHJhbnMgPiAocG5nX3VpbnRfMTYpbnVtKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRydW5jYXRpbmcgaW5jb3JyZWN0IHRSTlMgY2h1bmsgbGVuZ3RoIik7Ci0gICAgICAgICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPSAocG5nX3VpbnRfMTYpbnVtOwotICAgICAgICAgfQotICAgICAgICAgaWYgKGluZm9fcHRyLT5udW1fdHJhbnMgPiAocG5nX3VpbnRfMTYpbnVtKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRydW5jYXRpbmcgaW5jb3JyZWN0IGluZm8gdFJOUyBjaHVuayBsZW5ndGgiKTsKLSAgICAgICAgICAgIGluZm9fcHRyLT5udW1fdHJhbnMgPSAocG5nX3VpbnRfMTYpbnVtOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotI2VuZGlmCi0KLX0KLQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfaGFuZGxlX0lFTkQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfSUVORCIpOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikgfHwgIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkpCi0gICB7Ci0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk5vIGltYWdlIGluIGZpbGUiKTsKLSAgIH0KLQotICAgcG5nX3B0ci0+bW9kZSB8PSAoUE5HX0FGVEVSX0lEQVQgfCBQTkdfSEFWRV9JRU5EKTsKLQotICAgaWYgKGxlbmd0aCAhPSAwKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCBJRU5EIGNodW5rIGxlbmd0aCIpOwotICAgfQotICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLQotICAgaW5mb19wdHIgPSBpbmZvX3B0cjsgLyogUXVpZXQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgdW51c2VkIGluZm9fcHRyICovCi19Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX2dBTUFfU1VQUE9SVEVEKQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfaGFuZGxlX2dBTUEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICBwbmdfZml4ZWRfcG9pbnQgaWdhbW1hOwotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIGZsb2F0IGZpbGVfZ2FtbWE7Ci0jZW5kaWYKLSAgIHBuZ19ieXRlIGJ1Zls0XTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX2dBTUEiKTsKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIGdBTUEiKTsKLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgZ0FNQSBhZnRlciBJREFUIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpCi0gICAgICAvKiBTaG91bGQgYmUgYW4gZXJyb3IsIGJ1dCB3ZSBjYW4gY29wZSB3aXRoIGl0ICovCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIHBsYWNlIGdBTUEgY2h1bmsiKTsKLQotICAgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2dBTUEpCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCkKLSAgICAgICYmICEoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikKLSNlbmRpZgotICAgICAgKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBnQU1BIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAobGVuZ3RoICE9IDQpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IGdBTUEgY2h1bmsgbGVuZ3RoIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCA0KTsKLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgICAgIHJldHVybjsKLQotICAgaWdhbW1hID0gKHBuZ19maXhlZF9wb2ludClwbmdfZ2V0X3VpbnRfMzIoYnVmKTsKLSAgIC8qIENoZWNrIGZvciB6ZXJvIGdhbW1hICovCi0gICBpZiAoaWdhbW1hID09IDApCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAiSWdub3JpbmcgZ0FNQSBjaHVuayB3aXRoIGdhbW1hPTAiKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfc1JHQl9TVVBQT1JURUQpCi0gICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikpCi0gICAgICBpZiAoUE5HX09VVF9PRl9SQU5HRShpZ2FtbWEsIDQ1NTAwTCwgNTAwKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgICJJZ25vcmluZyBpbmNvcnJlY3QgZ0FNQSB2YWx1ZSB3aGVuIHNSR0IgaXMgYWxzbyBwcmVzZW50Iik7Ci0jaWZuZGVmIFBOR19OT19DT05TT0xFX0lPCi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdhbW1hID0gKCVkLzEwMDAwMCkiLCAoaW50KWlnYW1tYSk7Ci0jZW5kaWYKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSNlbmRpZiAvKiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgZmlsZV9nYW1tYSA9IChmbG9hdClpZ2FtbWEgLyAoZmxvYXQpMTAwMDAwLjA7Ci0jICBpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLSAgICAgcG5nX3B0ci0+Z2FtbWEgPSBmaWxlX2dhbW1hOwotIyAgZW5kaWYKLSAgICAgcG5nX3NldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBmaWxlX2dhbW1hKTsKLSNlbmRpZgotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgIHBuZ19zZXRfZ0FNQV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgaWdhbW1hKTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NCSVRfU1VQUE9SVEVEKQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfaGFuZGxlX3NCSVQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICBwbmdfc2l6ZV90IHRydWVsZW47Ci0gICBwbmdfYnl0ZSBidWZbNF07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9zQklUIik7Ci0KLSAgIGJ1ZlswXSA9IGJ1ZlsxXSA9IGJ1ZlsyXSA9IGJ1ZlszXSA9IDA7Ci0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBzQklUIik7Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHNCSVQgYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKQotICAgewotICAgICAgLyogU2hvdWxkIGJlIGFuIGVycm9yLCBidXQgd2UgY2FuIGNvcGUgd2l0aCBpdCAqLwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBwbGFjZSBzQklUIGNodW5rIik7Ci0gICB9Ci0gICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0JJVCkpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRHVwbGljYXRlIHNCSVQgY2h1bmsiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICB0cnVlbGVuID0gMzsKLSAgIGVsc2UKLSAgICAgIHRydWVsZW4gPSAocG5nX3NpemVfdClwbmdfcHRyLT5jaGFubmVsczsKLQotICAgaWYgKGxlbmd0aCAhPSB0cnVlbGVuIHx8IGxlbmd0aCA+IDQpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IHNCSVQgY2h1bmsgbGVuZ3RoIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCB0cnVlbGVuKTsKLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKLSAgIHsKLSAgICAgIHBuZ19wdHItPnNpZ19iaXQucmVkID0gYnVmWzBdOwotICAgICAgcG5nX3B0ci0+c2lnX2JpdC5ncmVlbiA9IGJ1ZlsxXTsKLSAgICAgIHBuZ19wdHItPnNpZ19iaXQuYmx1ZSA9IGJ1ZlsyXTsKLSAgICAgIHBuZ19wdHItPnNpZ19iaXQuYWxwaGEgPSBidWZbM107Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBwbmdfcHRyLT5zaWdfYml0LmdyYXkgPSBidWZbMF07Ci0gICAgICBwbmdfcHRyLT5zaWdfYml0LnJlZCA9IGJ1ZlswXTsKLSAgICAgIHBuZ19wdHItPnNpZ19iaXQuZ3JlZW4gPSBidWZbMF07Ci0gICAgICBwbmdfcHRyLT5zaWdfYml0LmJsdWUgPSBidWZbMF07Ci0gICAgICBwbmdfcHRyLT5zaWdfYml0LmFscGhhID0gYnVmWzFdOwotICAgfQotICAgcG5nX3NldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmKHBuZ19wdHItPnNpZ19iaXQpKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRCkKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV9jSFJNKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX2J5dGUgYnVmWzMyXTsKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICBmbG9hdCB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwgcmVkX3ksIGdyZWVuX3gsIGdyZWVuX3ksIGJsdWVfeCwgYmx1ZV95OwotI2VuZGlmCi0gICBwbmdfZml4ZWRfcG9pbnQgaW50X3hfd2hpdGUsIGludF95X3doaXRlLCBpbnRfeF9yZWQsIGludF95X3JlZCwgaW50X3hfZ3JlZW4sCi0gICAgICBpbnRfeV9ncmVlbiwgaW50X3hfYmx1ZSwgaW50X3lfYmx1ZTsKLQotICAgcG5nX3VpbnRfMzIgdWludF94LCB1aW50X3k7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9jSFJNIik7Ci0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBjSFJNIik7Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNIUk0gYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKQotICAgICAgLyogU2hvdWxkIGJlIGFuIGVycm9yLCBidXQgd2UgY2FuIGNvcGUgd2l0aCBpdCAqLwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk1pc3NpbmcgUExURSBiZWZvcmUgY0hSTSIpOwotCi0gICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fY0hSTSkKLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NSR0JfU1VQUE9SVEVEKQotICAgICAgJiYgIShpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zUkdCKQotI2VuZGlmCi0gICAgICApCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRHVwbGljYXRlIGNIUk0gY2h1bmsiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChsZW5ndGggIT0gMzIpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IGNIUk0gY2h1bmsgbGVuZ3RoIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAzMik7Ci0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCi0gICAgICByZXR1cm47Ci0KLSAgIHVpbnRfeCA9IHBuZ19nZXRfdWludF8zMihidWYpOwotICAgdWludF95ID0gcG5nX2dldF91aW50XzMyKGJ1ZiArIDQpOwotICAgaW50X3hfd2hpdGUgPSAocG5nX2ZpeGVkX3BvaW50KXVpbnRfeDsKLSAgIGludF95X3doaXRlID0gKHBuZ19maXhlZF9wb2ludCl1aW50X3k7Ci0KLSAgIHVpbnRfeCA9IHBuZ19nZXRfdWludF8zMihidWYgKyA4KTsKLSAgIHVpbnRfeSA9IHBuZ19nZXRfdWludF8zMihidWYgKyAxMik7Ci0gICBpbnRfeF9yZWQgPSAocG5nX2ZpeGVkX3BvaW50KXVpbnRfeDsKLSAgIGludF95X3JlZCA9IChwbmdfZml4ZWRfcG9pbnQpdWludF95OwotCi0gICB1aW50X3ggPSBwbmdfZ2V0X3VpbnRfMzIoYnVmICsgMTYpOwotICAgdWludF95ID0gcG5nX2dldF91aW50XzMyKGJ1ZiArIDIwKTsKLSAgIGludF94X2dyZWVuID0gKHBuZ19maXhlZF9wb2ludCl1aW50X3g7Ci0gICBpbnRfeV9ncmVlbiA9IChwbmdfZml4ZWRfcG9pbnQpdWludF95OwotCi0gICB1aW50X3ggPSBwbmdfZ2V0X3VpbnRfMzIoYnVmICsgMjQpOwotICAgdWludF95ID0gcG5nX2dldF91aW50XzMyKGJ1ZiArIDI4KTsKLSAgIGludF94X2JsdWUgPSAocG5nX2ZpeGVkX3BvaW50KXVpbnRfeDsKLSAgIGludF95X2JsdWUgPSAocG5nX2ZpeGVkX3BvaW50KXVpbnRfeTsKLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIHdoaXRlX3ggPSAoZmxvYXQpaW50X3hfd2hpdGUgLyAoZmxvYXQpMTAwMDAwLjA7Ci0gICB3aGl0ZV95ID0gKGZsb2F0KWludF95X3doaXRlIC8gKGZsb2F0KTEwMDAwMC4wOwotICAgcmVkX3ggICA9IChmbG9hdClpbnRfeF9yZWQgICAvIChmbG9hdCkxMDAwMDAuMDsKLSAgIHJlZF95ICAgPSAoZmxvYXQpaW50X3lfcmVkICAgLyAoZmxvYXQpMTAwMDAwLjA7Ci0gICBncmVlbl94ID0gKGZsb2F0KWludF94X2dyZWVuIC8gKGZsb2F0KTEwMDAwMC4wOwotICAgZ3JlZW5feSA9IChmbG9hdClpbnRfeV9ncmVlbiAvIChmbG9hdCkxMDAwMDAuMDsKLSAgIGJsdWVfeCAgPSAoZmxvYXQpaW50X3hfYmx1ZSAgLyAoZmxvYXQpMTAwMDAwLjA7Ci0gICBibHVlX3kgID0gKGZsb2F0KWludF95X2JsdWUgIC8gKGZsb2F0KTEwMDAwMC4wOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NSR0JfU1VQUE9SVEVEKQotICAgaWYgKChpbmZvX3B0ciAhPSBOVUxMKSAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikpCi0gICAgICB7Ci0gICAgICBpZiAoUE5HX09VVF9PRl9SQU5HRShpbnRfeF93aGl0ZSwgMzEyNzAsICAxMDAwKSB8fAotICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW50X3lfd2hpdGUsIDMyOTAwLCAgMTAwMCkgfHwKLSAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGludF94X3JlZCwgICA2NDAwMEwsIDEwMDApIHx8Ci0gICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbnRfeV9yZWQsICAgMzMwMDAsICAxMDAwKSB8fAotICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW50X3hfZ3JlZW4sIDMwMDAwLCAgMTAwMCkgfHwKLSAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGludF95X2dyZWVuLCA2MDAwMEwsIDEwMDApIHx8Ci0gICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbnRfeF9ibHVlLCAgMTUwMDAsICAxMDAwKSB8fAotICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW50X3lfYmx1ZSwgICA2MDAwLCAgMTAwMCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAgICAiSWdub3JpbmcgaW5jb3JyZWN0IGNIUk0gdmFsdWUgd2hlbiBzUkdCIGlzIGFsc28gcHJlc2VudCIpOwotI2lmbmRlZiBQTkdfTk9fQ09OU09MRV9JTwotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAid3g9JWYsIHd5PSVmLCByeD0lZiwgcnk9JWZcbiIsCi0gICAgICAgICAgICAgICB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwgcmVkX3kpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJneD0lZiwgZ3k9JWYsIGJ4PSVmLCBieT0lZlxuIiwKLSAgICAgICAgICAgICAgIGdyZWVuX3gsIGdyZWVuX3ksIGJsdWVfeCwgYmx1ZV95KTsKLSNlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInd4PSVsZCwgd3k9JWxkLCByeD0lbGQsIHJ5PSVsZFxuIiwKLSAgICAgICAgICAgICAgIGludF94X3doaXRlLCBpbnRfeV93aGl0ZSwgaW50X3hfcmVkLCBpbnRfeV9yZWQpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJneD0lbGQsIGd5PSVsZCwgYng9JWxkLCBieT0lbGRcbiIsCi0gICAgICAgICAgICAgICBpbnRfeF9ncmVlbiwgaW50X3lfZ3JlZW4sIGludF94X2JsdWUsIGludF95X2JsdWUpOwotI2VuZGlmCi0jZW5kaWYgLyogUE5HX05PX0NPTlNPTEVfSU8gKi8KLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSNlbmRpZiAvKiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgcG5nX3NldF9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICBwbmdfc2V0X2NIUk1fZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICBpbnRfeF93aGl0ZSwgaW50X3lfd2hpdGUsIGludF94X3JlZCwgaW50X3lfcmVkLCBpbnRfeF9ncmVlbiwKLSAgICAgIGludF95X2dyZWVuLCBpbnRfeF9ibHVlLCBpbnRfeV9ibHVlKTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX3NSR0JfU1VQUE9SVEVEKQotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfaGFuZGxlX3NSR0IocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICBpbnQgaW50ZW50OwotICAgcG5nX2J5dGUgYnVmWzFdOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfc1JHQiIpOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgc1JHQiIpOwotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzUkdCIGFmdGVyIElEQVQiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfUExURSkKLSAgICAgIC8qIFNob3VsZCBiZSBhbiBlcnJvciwgYnV0IHdlIGNhbiBjb3BlIHdpdGggaXQgKi8KLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgb2YgcGxhY2Ugc1JHQiBjaHVuayIpOwotCi0gICBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1JHQikpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRHVwbGljYXRlIHNSR0IgY2h1bmsiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChsZW5ndGggIT0gMSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbmNvcnJlY3Qgc1JHQiBjaHVuayBsZW5ndGgiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDEpOwotICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQotICAgICAgcmV0dXJuOwotCi0gICBpbnRlbnQgPSBidWZbMF07Ci0gICAvKiBDaGVjayBmb3IgYmFkIGludGVudCAqLwotICAgaWYgKGludGVudCA+PSBQTkdfc1JHQl9JTlRFTlRfTEFTVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIHNSR0IgaW50ZW50Iik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX2dBTUFfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkKLSAgIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19nQU1BKSkKLSAgIHsKLSAgIHBuZ19maXhlZF9wb2ludCBpZ2FtbWE7Ci0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgICAgaWdhbW1hPWluZm9fcHRyLT5pbnRfZ2FtbWE7Ci0jZWxzZQotIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgICAgaWdhbW1hPShwbmdfZml4ZWRfcG9pbnQpKGluZm9fcHRyLT5nYW1tYSAqIDEwMDAwMC4pOwotIyAgZW5kaWYKLSNlbmRpZgotICAgICAgaWYgKFBOR19PVVRfT0ZfUkFOR0UoaWdhbW1hLCA0NTUwMEwsIDUwMCkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAiSWdub3JpbmcgaW5jb3JyZWN0IGdBTUEgdmFsdWUgd2hlbiBzUkdCIGlzIGFsc28gcHJlc2VudCIpOwotI2lmbmRlZiBQTkdfTk9fQ09OU09MRV9JTwotIyAgaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvcnJlY3QgZ2FtbWE9KCVkLzEwMDAwMClcbiIsCi0gICAgICAgICAgICAoaW50KXBuZ19wdHItPmludF9nYW1tYSk7Ci0jICBlbHNlCi0jICAgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5jb3JyZWN0IGdhbW1hPSVmXG4iLCBwbmdfcHRyLT5nYW1tYSk7Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0gICAgICB9Ci0gICB9Ci0jZW5kaWYgLyogUE5HX1JFQURfZ0FNQV9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19SRUFEX2NIUk1fU1VQUE9SVEVECi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2NIUk0pKQotICAgICAgaWYgKFBOR19PVVRfT0ZfUkFOR0UoaW5mb19wdHItPmludF94X3doaXRlLCAzMTI3MCwgIDEwMDApIHx8Ci0gICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbmZvX3B0ci0+aW50X3lfd2hpdGUsIDMyOTAwLCAgMTAwMCkgfHwKLSAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGluZm9fcHRyLT5pbnRfeF9yZWQsICAgNjQwMDBMLCAxMDAwKSB8fAotICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW5mb19wdHItPmludF95X3JlZCwgICAzMzAwMCwgIDEwMDApIHx8Ci0gICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbmZvX3B0ci0+aW50X3hfZ3JlZW4sIDMwMDAwLCAgMTAwMCkgfHwKLSAgICAgICAgICBQTkdfT1VUX09GX1JBTkdFKGluZm9fcHRyLT5pbnRfeV9ncmVlbiwgNjAwMDBMLCAxMDAwKSB8fAotICAgICAgICAgIFBOR19PVVRfT0ZfUkFOR0UoaW5mb19wdHItPmludF94X2JsdWUsICAxNTAwMCwgIDEwMDApIHx8Ci0gICAgICAgICAgUE5HX09VVF9PRl9SQU5HRShpbmZvX3B0ci0+aW50X3lfYmx1ZSwgICA2MDAwLCAgMTAwMCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAgICAiSWdub3JpbmcgaW5jb3JyZWN0IGNIUk0gdmFsdWUgd2hlbiBzUkdCIGlzIGFsc28gcHJlc2VudCIpOwotICAgICAgICAgfQotI2VuZGlmIC8qIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQgKi8KLSNlbmRpZiAvKiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRCAqLwotCi0gICBwbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwgaW50ZW50KTsKLX0KLSNlbmRpZiAvKiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRCAqLwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRCkKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV9pQ0NQKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotLyogTm90ZTogdGhpcyBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgY2h1bmtzIHRoYXQgYXJlID4gNjRLIHVuZGVyIERPUyAqLwotewotICAgcG5nX2J5dGUgY29tcHJlc3Npb25fdHlwZTsKLSAgIHBuZ19ieXRlcCBwQzsKLSAgIHBuZ19jaGFycCBwcm9maWxlOwotICAgcG5nX3VpbnRfMzIgc2tpcCA9IDA7Ci0gICBwbmdfdWludF8zMiBwcm9maWxlX3NpemUsIHByb2ZpbGVfbGVuZ3RoOwotICAgcG5nX3NpemVfdCBzbGVuZ3RoLCBwcmVmaXhfbGVuZ3RoLCBkYXRhX2xlbmd0aDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX2lDQ1AiKTsKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIGlDQ1AiKTsKLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgaUNDUCBhZnRlciBJREFUIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZSBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpCi0gICAgICAvKiBTaG91bGQgYmUgYW4gZXJyb3IsIGJ1dCB3ZSBjYW4gY29wZSB3aXRoIGl0ICovCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT3V0IG9mIHBsYWNlIGlDQ1AgY2h1bmsiKTsKLQotICAgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2lDQ1ApKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBpQ0NQIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0jaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCi0gICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJpQ0NQIGNodW5rIHRvbyBsYXJnZSB0byBmaXQgaW4gbWVtb3J5Iik7Ci0gICAgICBza2lwID0gbGVuZ3RoIC0gKHBuZ191aW50XzMyKTY1NTM1TDsKLSAgICAgIGxlbmd0aCA9IChwbmdfdWludF8zMik2NTUzNUw7Ci0gICB9Ci0jZW5kaWYKLQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvYyhwbmdfcHRyLCBsZW5ndGggKyAxKTsKLSAgIHNsZW5ndGggPSAocG5nX3NpemVfdClsZW5ndGg7Ci0gICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcHRyLT5jaHVua2RhdGEsIHNsZW5ndGgpOwotCi0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgc2tpcCkpCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX3B0ci0+Y2h1bmtkYXRhW3NsZW5ndGhdID0gMHgwMDsKLQotICAgZm9yIChwcm9maWxlID0gcG5nX3B0ci0+Y2h1bmtkYXRhOyAqcHJvZmlsZTsgcHJvZmlsZSsrKQotICAgICAgLyogRW1wdHkgbG9vcCB0byBmaW5kIGVuZCBvZiBuYW1lICovIDsKLQotICAgKytwcm9maWxlOwotCi0gICAvKiBUaGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIHplcm8gKHRoZSBjb21wcmVzc2lvbiB0eXBlIGJ5dGUpCi0gICAgKiBmb2xsb3dpbmcgdGhlIHNlcGFyYXRvciwgYW5kIHdlIHNob3VsZCBiZSBvbiBpdAotICAgICovCi0gICBpZiAoIHByb2ZpbGUgPj0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgc2xlbmd0aCAtIDEpCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJNYWxmb3JtZWQgaUNDUCBjaHVuayIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICAvKiBDb21wcmVzc2lvbl90eXBlIHNob3VsZCBhbHdheXMgYmUgemVybyAqLwotICAgY29tcHJlc3Npb25fdHlwZSA9ICpwcm9maWxlKys7Ci0gICBpZiAoY29tcHJlc3Npb25fdHlwZSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJZ25vcmluZyBub256ZXJvIGNvbXByZXNzaW9uIHR5cGUgaW4gaUNDUCBjaHVuayIpOwotICAgICAgY29tcHJlc3Npb25fdHlwZSA9IDB4MDA7ICAvKiBSZXNldCBpdCB0byB6ZXJvIChsaWJwbmctMS4wLjYgdGhyb3VnaCAxLjAuOAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JvdGUgbm9uemVybykgKi8KLSAgIH0KLQotICAgcHJlZml4X2xlbmd0aCA9IHByb2ZpbGUgLSBwbmdfcHRyLT5jaHVua2RhdGE7Ci0gICBwbmdfZGVjb21wcmVzc19jaHVuayhwbmdfcHRyLCBjb21wcmVzc2lvbl90eXBlLAotICAgICBzbGVuZ3RoLCBwcmVmaXhfbGVuZ3RoLCAmZGF0YV9sZW5ndGgpOwotCi0gICBwcm9maWxlX2xlbmd0aCA9IGRhdGFfbGVuZ3RoIC0gcHJlZml4X2xlbmd0aDsKLQotICAgaWYgKCBwcmVmaXhfbGVuZ3RoID4gZGF0YV9sZW5ndGggfHwgcHJvZmlsZV9sZW5ndGggPCA0KQotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiUHJvZmlsZSBzaXplIGZpZWxkIG1pc3NpbmcgZnJvbSBpQ0NQIGNodW5rIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIC8qIENoZWNrIHRoZSBwcm9maWxlX3NpemUgcmVjb3JkZWQgaW4gdGhlIGZpcnN0IDMyIGJpdHMgb2YgdGhlIElDQyBwcm9maWxlICovCi0gICBwQyA9IChwbmdfYnl0ZXApKHBuZ19wdHItPmNodW5rZGF0YSArIHByZWZpeF9sZW5ndGgpOwotICAgcHJvZmlsZV9zaXplID0gKCgqKHBDICAgICkpPDwyNCkgfAotICAgICAgICAgICAgICAgICAgKCgqKHBDICsgMSkpPDwxNikgfAotICAgICAgICAgICAgICAgICAgKCgqKHBDICsgMikpPDwgOCkgfAotICAgICAgICAgICAgICAgICAgKCgqKHBDICsgMykpICAgICk7Ci0KLSAgIGlmIChwcm9maWxlX3NpemUgPCBwcm9maWxlX2xlbmd0aCkKLSAgICAgIHByb2ZpbGVfbGVuZ3RoID0gcHJvZmlsZV9zaXplOwotCi0gICBpZiAocHJvZmlsZV9zaXplID4gcHJvZmlsZV9sZW5ndGgpCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJZ25vcmluZyB0cnVuY2F0ZWQgaUNDUCBwcm9maWxlLiIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfc2V0X2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSwKLSAgICAgY29tcHJlc3Npb25fdHlwZSwgcG5nX3B0ci0+Y2h1bmtkYXRhICsgcHJlZml4X2xlbmd0aCwgcHJvZmlsZV9sZW5ndGgpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfaUNDUF9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfc1BMVF9TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfc1BMVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLS8qIE5vdGU6IHRoaXMgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIGNodW5rcyB0aGF0IGFyZSA+IDY0SyB1bmRlciBET1MgKi8KLXsKLSAgIHBuZ19ieXRlcCBlbnRyeV9zdGFydDsKLSAgIHBuZ19zUExUX3QgbmV3X3BhbGV0dGU7Ci0jaWZkZWYgUE5HX05PX1BPSU5URVJfSU5ERVhJTkcKLSAgIHBuZ19zUExUX2VudHJ5cCBwcDsKLSNlbmRpZgotICAgaW50IGRhdGFfbGVuZ3RoLCBlbnRyeV9zaXplLCBpOwotICAgcG5nX3VpbnRfMzIgc2tpcCA9IDA7Ci0gICBwbmdfc2l6ZV90IHNsZW5ndGg7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9zUExUIik7Ci0KLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIHNQTFQiKTsKLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc1BMVCBhZnRlciBJREFUIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0jaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCi0gICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJzUExUIGNodW5rIHRvbyBsYXJnZSB0byBmaXQgaW4gbWVtb3J5Iik7Ci0gICAgICBza2lwID0gbGVuZ3RoIC0gKHBuZ191aW50XzMyKTY1NTM1TDsKLSAgICAgIGxlbmd0aCA9IChwbmdfdWludF8zMik2NTUzNUw7Ci0gICB9Ci0jZW5kaWYKLQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvYyhwbmdfcHRyLCBsZW5ndGggKyAxKTsKLSAgIHNsZW5ndGggPSAocG5nX3NpemVfdClsZW5ndGg7Ci0gICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcHRyLT5jaHVua2RhdGEsIHNsZW5ndGgpOwotCi0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgc2tpcCkpCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX3B0ci0+Y2h1bmtkYXRhW3NsZW5ndGhdID0gMHgwMDsKLQotICAgZm9yIChlbnRyeV9zdGFydCA9IChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhOyAqZW50cnlfc3RhcnQ7IGVudHJ5X3N0YXJ0KyspCi0gICAgICAvKiBFbXB0eSBsb29wIHRvIGZpbmQgZW5kIG9mIG5hbWUgKi8gOwotICAgKytlbnRyeV9zdGFydDsKLQotICAgLyogQSBzYW1wbGUgZGVwdGggc2hvdWxkIGZvbGxvdyB0aGUgc2VwYXJhdG9yLCBhbmQgd2Ugc2hvdWxkIGJlIG9uIGl0ICAqLwotICAgaWYgKGVudHJ5X3N0YXJ0ID4gKHBuZ19ieXRlcClwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoIC0gMikKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIm1hbGZvcm1lZCBzUExUIGNodW5rIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIG5ld19wYWxldHRlLmRlcHRoID0gKmVudHJ5X3N0YXJ0Kys7Ci0gICBlbnRyeV9zaXplID0gKG5ld19wYWxldHRlLmRlcHRoID09IDggPyA2IDogMTApOwotICAgZGF0YV9sZW5ndGggPSAoc2xlbmd0aCAtIChlbnRyeV9zdGFydCAtIChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhKSk7Ci0KLSAgIC8qIEludGVncml0eS1jaGVjayB0aGUgZGF0YSBsZW5ndGggKi8KLSAgIGlmIChkYXRhX2xlbmd0aCAlIGVudHJ5X3NpemUpCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJzUExUIGNodW5rIGhhcyBiYWQgbGVuZ3RoIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIG5ld19wYWxldHRlLm5lbnRyaWVzID0gKHBuZ19pbnRfMzIpICggZGF0YV9sZW5ndGggLyBlbnRyeV9zaXplKTsKLSAgIGlmICgocG5nX3VpbnRfMzIpIG5ld19wYWxldHRlLm5lbnRyaWVzID4KLSAgICAgICAocG5nX3VpbnRfMzIpIChQTkdfU0laRV9NQVggLyBwbmdfc2l6ZW9mKHBuZ19zUExUX2VudHJ5KSkpCi0gICB7Ci0gICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInNQTFQgY2h1bmsgdG9vIGxvbmciKTsKLSAgICAgICByZXR1cm47Ci0gICB9Ci0gICBuZXdfcGFsZXR0ZS5lbnRyaWVzID0gKHBuZ19zUExUX2VudHJ5cClwbmdfbWFsbG9jX3dhcm4oCi0gICAgICAgcG5nX3B0ciwgbmV3X3BhbGV0dGUubmVudHJpZXMgKiBwbmdfc2l6ZW9mKHBuZ19zUExUX2VudHJ5KSk7Ci0gICBpZiAobmV3X3BhbGV0dGUuZW50cmllcyA9PSBOVUxMKQotICAgewotICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJzUExUIGNodW5rIHJlcXVpcmVzIHRvbyBtdWNoIG1lbW9yeSIpOwotICAgICAgIHJldHVybjsKLSAgIH0KLQotI2lmbmRlZiBQTkdfTk9fUE9JTlRFUl9JTkRFWElORwotICAgZm9yIChpID0gMDsgaSA8IG5ld19wYWxldHRlLm5lbnRyaWVzOyBpKyspCi0gICB7Ci0gICAgICBwbmdfc1BMVF9lbnRyeXAgcHAgPSBuZXdfcGFsZXR0ZS5lbnRyaWVzICsgaTsKLQotICAgICAgaWYgKG5ld19wYWxldHRlLmRlcHRoID09IDgpCi0gICAgICB7Ci0gICAgICAgICAgcHAtPnJlZCA9ICplbnRyeV9zdGFydCsrOwotICAgICAgICAgIHBwLT5ncmVlbiA9ICplbnRyeV9zdGFydCsrOwotICAgICAgICAgIHBwLT5ibHVlID0gKmVudHJ5X3N0YXJ0Kys7Ci0gICAgICAgICAgcHAtPmFscGhhID0gKmVudHJ5X3N0YXJ0Kys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAgcHAtPnJlZCAgID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKLSAgICAgICAgICBwcC0+Z3JlZW4gPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOwotICAgICAgICAgIHBwLT5ibHVlICA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7Ci0gICAgICAgICAgcHAtPmFscGhhID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKLSAgICAgIH0KLSAgICAgIHBwLT5mcmVxdWVuY3kgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOwotICAgfQotI2Vsc2UKLSAgIHBwID0gbmV3X3BhbGV0dGUuZW50cmllczsKLSAgIGZvciAoaSA9IDA7IGkgPCBuZXdfcGFsZXR0ZS5uZW50cmllczsgaSsrKQotICAgewotCi0gICAgICBpZiAobmV3X3BhbGV0dGUuZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgICBwcFtpXS5yZWQgICA9ICplbnRyeV9zdGFydCsrOwotICAgICAgICAgIHBwW2ldLmdyZWVuID0gKmVudHJ5X3N0YXJ0Kys7Ci0gICAgICAgICAgcHBbaV0uYmx1ZSAgPSAqZW50cnlfc3RhcnQrKzsKLSAgICAgICAgICBwcFtpXS5hbHBoYSA9ICplbnRyeV9zdGFydCsrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgIHBwW2ldLnJlZCAgID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKLSAgICAgICAgICBwcFtpXS5ncmVlbiA9IHBuZ19nZXRfdWludF8xNihlbnRyeV9zdGFydCk7IGVudHJ5X3N0YXJ0ICs9IDI7Ci0gICAgICAgICAgcHBbaV0uYmx1ZSAgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOwotICAgICAgICAgIHBwW2ldLmFscGhhID0gcG5nX2dldF91aW50XzE2KGVudHJ5X3N0YXJ0KTsgZW50cnlfc3RhcnQgKz0gMjsKLSAgICAgIH0KLSAgICAgIHBwLT5mcmVxdWVuY3kgPSBwbmdfZ2V0X3VpbnRfMTYoZW50cnlfc3RhcnQpOyBlbnRyeV9zdGFydCArPSAyOwotICAgfQotI2VuZGlmCi0KLSAgIC8qIERpc2NhcmQgYWxsIGNodW5rIGRhdGEgZXhjZXB0IHRoZSBuYW1lIGFuZCBzdGFzaCB0aGF0ICovCi0gICBuZXdfcGFsZXR0ZS5uYW1lID0gcG5nX3B0ci0+Y2h1bmtkYXRhOwotCi0gICBwbmdfc2V0X3NQTFQocG5nX3B0ciwgaW5mb19wdHIsICZuZXdfcGFsZXR0ZSwgMSk7Ci0KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X3BhbGV0dGUuZW50cmllcyk7Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfc1BMVF9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfdFJOU19TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfdFJOUyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19ieXRlIHJlYWRidWZbUE5HX01BWF9QQUxFVFRFX0xFTkdUSF07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV90Uk5TIik7Ci0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSB0Uk5TIik7Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHRSTlMgYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3RSTlMpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSB0Uk5TIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgewotICAgICAgcG5nX2J5dGUgYnVmWzJdOwotCi0gICAgICBpZiAobGVuZ3RoICE9IDIpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IHRSTlMgY2h1bmsgbGVuZ3RoIik7Ci0gICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAyKTsKLSAgICAgIHBuZ19wdHItPm51bV90cmFucyA9IDE7Ci0gICAgICBwbmdfcHRyLT50cmFuc192YWx1ZXMuZ3JheSA9IHBuZ19nZXRfdWludF8xNihidWYpOwotICAgfQotICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBidWZbNl07Ci0KLSAgICAgIGlmIChsZW5ndGggIT0gNikKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbmNvcnJlY3QgdFJOUyBjaHVuayBsZW5ndGgiKTsKLSAgICAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdClsZW5ndGgpOwotICAgICAgcG5nX3B0ci0+bnVtX3RyYW5zID0gMTsKLSAgICAgIHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5yZWQgPSBwbmdfZ2V0X3VpbnRfMTYoYnVmKTsKLSAgICAgIHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ncmVlbiA9IHBuZ19nZXRfdWludF8xNihidWYgKyAyKTsKLSAgICAgIHBuZ19wdHItPnRyYW5zX3ZhbHVlcy5ibHVlID0gcG5nX2dldF91aW50XzE2KGJ1ZiArIDQpOwotICAgfQotICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgewotICAgICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpKQotICAgICAgewotICAgICAgICAgLyogU2hvdWxkIGJlIGFuIGVycm9yLCBidXQgd2UgY2FuIGNvcGUgd2l0aCBpdC4gKi8KLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIHRSTlMiKTsKLSAgICAgIH0KLSAgICAgIGlmIChsZW5ndGggPiAocG5nX3VpbnRfMzIpcG5nX3B0ci0+bnVtX3BhbGV0dGUgfHwKLSAgICAgICAgICBsZW5ndGggPiBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCB0Uk5TIGNodW5rIGxlbmd0aCIpOwotICAgICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJaZXJvIGxlbmd0aCB0Uk5TIGNodW5rIik7Ci0gICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHJlYWRidWYsIChwbmdfc2l6ZV90KWxlbmd0aCk7Ci0gICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPSAocG5nX3VpbnRfMTYpbGVuZ3RoOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInRSTlMgY2h1bmsgbm90IGFsbG93ZWQgd2l0aCBhbHBoYSBjaGFubmVsIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCi0gICB7Ci0gICAgICBwbmdfcHRyLT5udW1fdHJhbnMgPSAwOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfc2V0X3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIHJlYWRidWYsIHBuZ19wdHItPm51bV90cmFucywKLSAgICAgICYocG5nX3B0ci0+dHJhbnNfdmFsdWVzKSk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfYktHRF9TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfYktHRChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19zaXplX3QgdHJ1ZWxlbjsKLSAgIHBuZ19ieXRlIGJ1Zls2XTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX2JLR0QiKTsKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIGJLR0QiKTsKLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgYktHRCBhZnRlciBJREFUIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFICYmCi0gICAgICAgICAgICAhKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIGJLR0QiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19iS0dEKSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgYktHRCBjaHVuayIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgIHRydWVsZW4gPSAxOwotICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgICAgdHJ1ZWxlbiA9IDY7Ci0gICBlbHNlCi0gICAgICB0cnVlbGVuID0gMjsKLQotICAgaWYgKGxlbmd0aCAhPSB0cnVlbGVuKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCBiS0dEIGNodW5rIGxlbmd0aCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgdHJ1ZWxlbik7Ci0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCi0gICAgICByZXR1cm47Ci0KLSAgIC8qIFdlIGNvbnZlcnQgdGhlIGluZGV4IHZhbHVlIGludG8gUkdCIGNvbXBvbmVudHMgc28gdGhhdCB3ZSBjYW4gYWxsb3cKLSAgICAqIGFyYml0cmFyeSBSR0IgdmFsdWVzIGZvciBiYWNrZ3JvdW5kIHdoZW4gd2UgaGF2ZSB0cmFuc3BhcmVuY3ksIGFuZAotICAgICogc28gaXQgaXMgZWFzeSB0byBkZXRlcm1pbmUgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlIGJhY2tncm91bmQgY29sb3IKLSAgICAqIGZyb20gdGhlIGluZm9fcHRyIHN0cnVjdC4gKi8KLSAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICB7Ci0gICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmluZGV4ID0gYnVmWzBdOwotICAgICAgaWYgKGluZm9fcHRyICYmIGluZm9fcHRyLT5udW1fcGFsZXR0ZSkKLSAgICAgIHsKLSAgICAgICAgICBpZiAoYnVmWzBdID49IGluZm9fcHRyLT5udW1fcGFsZXR0ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCBiS0dEIGNodW5rIGluZGV4IHZhbHVlIik7Ci0gICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9Ci0gICAgICAgICAgICAgKHBuZ191aW50XzE2KXBuZ19wdHItPnBhbGV0dGVbYnVmWzBdXS5yZWQ7Ci0gICAgICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbiA9Ci0gICAgICAgICAgICAgKHBuZ191aW50XzE2KXBuZ19wdHItPnBhbGV0dGVbYnVmWzBdXS5ncmVlbjsKLSAgICAgICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPQotICAgICAgICAgICAgIChwbmdfdWludF8xNilwbmdfcHRyLT5wYWxldHRlW2J1ZlswXV0uYmx1ZTsKLSAgICAgIH0KLSAgIH0KLSAgIGVsc2UgaWYgKCEocG5nX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSkgLyogR1JBWSAqLwotICAgewotICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5yZWQgPQotICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbiA9Ci0gICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLmJsdWUgPQotICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmF5ID0gcG5nX2dldF91aW50XzE2KGJ1Zik7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBwbmdfcHRyLT5iYWNrZ3JvdW5kLnJlZCA9IHBuZ19nZXRfdWludF8xNihidWYpOwotICAgICAgcG5nX3B0ci0+YmFja2dyb3VuZC5ncmVlbiA9IHBuZ19nZXRfdWludF8xNihidWYgKyAyKTsKLSAgICAgIHBuZ19wdHItPmJhY2tncm91bmQuYmx1ZSA9IHBuZ19nZXRfdWludF8xNihidWYgKyA0KTsKLSAgIH0KLQotICAgcG5nX3NldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmKHBuZ19wdHItPmJhY2tncm91bmQpKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRCkKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV9oSVNUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgdW5zaWduZWQgaW50IG51bSwgaTsKLSAgIHBuZ191aW50XzE2IHJlYWRidWZbUE5HX01BWF9QQUxFVFRFX0xFTkdUSF07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9oSVNUIik7Ci0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBoSVNUIik7Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGhJU1QgYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIGVsc2UgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX1BMVEUpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk1pc3NpbmcgUExURSBiZWZvcmUgaElTVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2hJU1QpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBoSVNUIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBudW0gPSBsZW5ndGggLyAyIDsKLSAgIGlmIChudW0gIT0gKHVuc2lnbmVkIGludCkgcG5nX3B0ci0+bnVtX3BhbGV0dGUgfHwgbnVtID4KLSAgICAgICh1bnNpZ25lZCBpbnQpIFBOR19NQVhfUEFMRVRURV9MRU5HVEgpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IGhJU1QgY2h1bmsgbGVuZ3RoIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBidWZbMl07Ci0KLSAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDIpOwotICAgICAgcmVhZGJ1ZltpXSA9IHBuZ19nZXRfdWludF8xNihidWYpOwotICAgfQotCi0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCi0gICAgICByZXR1cm47Ci0KLSAgIHBuZ19zZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgcmVhZGJ1Zik7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfcEhZc19TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfcEhZcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19ieXRlIGJ1Zls5XTsKLSAgIHBuZ191aW50XzMyIHJlc194LCByZXNfeTsKLSAgIGludCB1bml0X3R5cGU7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9wSFlzIik7Ci0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBwSFlzIik7Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHBIWXMgYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3BIWXMpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBwSFlzIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBpZiAobGVuZ3RoICE9IDkpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5jb3JyZWN0IHBIWXMgY2h1bmsgbGVuZ3RoIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfY3JjX3JlYWQocG5nX3B0ciwgYnVmLCA5KTsKLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgICAgIHJldHVybjsKLQotICAgcmVzX3ggPSBwbmdfZ2V0X3VpbnRfMzIoYnVmKTsKLSAgIHJlc195ID0gcG5nX2dldF91aW50XzMyKGJ1ZiArIDQpOwotICAgdW5pdF90eXBlID0gYnVmWzhdOwotICAgcG5nX3NldF9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCByZXNfeCwgcmVzX3ksIHVuaXRfdHlwZSk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfb0ZGc19TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfb0ZGcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19ieXRlIGJ1Zls5XTsKLSAgIHBuZ19pbnRfMzIgb2Zmc2V0X3gsIG9mZnNldF95OwotICAgaW50IHVuaXRfdHlwZTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX29GRnMiKTsKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIG9GRnMiKTsKLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgb0ZGcyBhZnRlciBJREFUIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZSBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fb0ZGcykpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRHVwbGljYXRlIG9GRnMgY2h1bmsiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChsZW5ndGggIT0gOSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbmNvcnJlY3Qgb0ZGcyBjaHVuayBsZW5ndGgiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBidWYsIDkpOwotICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQotICAgICAgcmV0dXJuOwotCi0gICBvZmZzZXRfeCA9IHBuZ19nZXRfaW50XzMyKGJ1Zik7Ci0gICBvZmZzZXRfeSA9IHBuZ19nZXRfaW50XzMyKGJ1ZiArIDQpOwotICAgdW5pdF90eXBlID0gYnVmWzhdOwotICAgcG5nX3NldF9vRkZzKHBuZ19wdHIsIGluZm9fcHRyLCBvZmZzZXRfeCwgb2Zmc2V0X3ksIHVuaXRfdHlwZSk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfcENBTF9TVVBQT1JURUQpCi0vKiBSZWFkIHRoZSBwQ0FMIGNodW5rIChkZXNjcmliZWQgaW4gdGhlIFBORyBFeHRlbnNpb25zIGRvY3VtZW50KSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfaGFuZGxlX3BDQUwocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICBwbmdfaW50XzMyIFgwLCBYMTsKLSAgIHBuZ19ieXRlIHR5cGUsIG5wYXJhbXM7Ci0gICBwbmdfY2hhcnAgYnVmLCB1bml0cywgZW5kcHRyOwotICAgcG5nX2NoYXJwcCBwYXJhbXM7Ci0gICBwbmdfc2l6ZV90IHNsZW5ndGg7Ci0gICBpbnQgaTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX3BDQUwiKTsKLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIHBDQUwiKTsKLSAgIGVsc2UgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgcENBTCBhZnRlciBJREFUIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgZWxzZSBpZiAoaW5mb19wdHIgIT0gTlVMTCAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcENBTCkpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiRHVwbGljYXRlIHBDQUwgY2h1bmsiKTsKLSAgICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ19kZWJ1ZzEoMiwgIkFsbG9jYXRpbmcgYW5kIHJlYWRpbmcgcENBTCBjaHVuayBkYXRhICglbHUgYnl0ZXMpIiwKLSAgICAgIGxlbmd0aCArIDEpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCArIDEpOwotICAgaWYgKHBuZ19wdHItPmNodW5rZGF0YSA9PSBOVUxMKQotICAgICB7Ci0gICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk5vIG1lbW9yeSBmb3IgcENBTCBwdXJwb3NlLiIpOwotICAgICAgIHJldHVybjsKLSAgICAgfQotICAgc2xlbmd0aCA9IChwbmdfc2l6ZV90KWxlbmd0aDsKLSAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19wdHItPmNodW5rZGF0YSwgc2xlbmd0aCk7Ci0KLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfcHRyLT5jaHVua2RhdGFbc2xlbmd0aF0gPSAweDAwOyAvKiBOdWxsIHRlcm1pbmF0ZSB0aGUgbGFzdCBzdHJpbmcgKi8KLQotICAgcG5nX2RlYnVnKDMsICJGaW5kaW5nIGVuZCBvZiBwQ0FMIHB1cnBvc2Ugc3RyaW5nIik7Ci0gICBmb3IgKGJ1ZiA9IHBuZ19wdHItPmNodW5rZGF0YTsgKmJ1ZjsgYnVmKyspCi0gICAgICAvKiBFbXB0eSBsb29wICovIDsKLQotICAgZW5kcHRyID0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgc2xlbmd0aDsKLQotICAgLyogV2UgbmVlZCB0byBoYXZlIGF0IGxlYXN0IDEyIGJ5dGVzIGFmdGVyIHRoZSBwdXJwb3NlIHN0cmluZwotICAgICAgaW4gb3JkZXIgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgaW5mb3JtYXRpb24uICovCi0gICBpZiAoZW5kcHRyIDw9IGJ1ZiArIDEyKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgcENBTCBkYXRhIik7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX2RlYnVnKDMsICJSZWFkaW5nIHBDQUwgWDAsIFgxLCB0eXBlLCBucGFyYW1zLCBhbmQgdW5pdHMiKTsKLSAgIFgwID0gcG5nX2dldF9pbnRfMzIoKHBuZ19ieXRlcClidWYrMSk7Ci0gICBYMSA9IHBuZ19nZXRfaW50XzMyKChwbmdfYnl0ZXApYnVmKzUpOwotICAgdHlwZSA9IGJ1Zls5XTsKLSAgIG5wYXJhbXMgPSBidWZbMTBdOwotICAgdW5pdHMgPSBidWYgKyAxMTsKLQotICAgcG5nX2RlYnVnKDMsICJDaGVja2luZyBwQ0FMIGVxdWF0aW9uIHR5cGUgYW5kIG51bWJlciBvZiBwYXJhbWV0ZXJzIik7Ci0gICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgdGhlIHJpZ2h0IG51bWJlciBvZiBwYXJhbWV0ZXJzIGZvciBrbm93bgotICAgICAgZXF1YXRpb24gdHlwZXMuICovCi0gICBpZiAoKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0xJTkVBUiAmJiBucGFyYW1zICE9IDIpIHx8Ci0gICAgICAgKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0JBU0VfRSAmJiBucGFyYW1zICE9IDMpIHx8Ci0gICAgICAgKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0FSQklUUkFSWSAmJiBucGFyYW1zICE9IDMpIHx8Ci0gICAgICAgKHR5cGUgPT0gUE5HX0VRVUFUSU9OX0hZUEVSQk9MSUMgJiYgbnBhcmFtcyAhPSA0KSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHBDQUwgcGFyYW1ldGVycyBmb3IgZXF1YXRpb24gdHlwZSIpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlIGlmICh0eXBlID49IFBOR19FUVVBVElPTl9MQVNUKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVucmVjb2duaXplZCBlcXVhdGlvbiB0eXBlIGZvciBwQ0FMIGNodW5rIik7Ci0gICB9Ci0KLSAgIGZvciAoYnVmID0gdW5pdHM7ICpidWY7IGJ1ZisrKQotICAgICAgLyogRW1wdHkgbG9vcCB0byBtb3ZlIHBhc3QgdGhlIHVuaXRzIHN0cmluZy4gKi8gOwotCi0gICBwbmdfZGVidWcoMywgIkFsbG9jYXRpbmcgcENBTCBwYXJhbWV0ZXJzIGFycmF5Iik7Ci0gICBwYXJhbXMgPSAocG5nX2NoYXJwcClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgIChwbmdfdWludF8zMikobnBhcmFtcyAqIHBuZ19zaXplb2YocG5nX2NoYXJwKSkpIDsKLSAgIGlmIChwYXJhbXMgPT0gTlVMTCkKLSAgICAgewotICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gbWVtb3J5IGZvciBwQ0FMIHBhcmFtcy4iKTsKLSAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgLyogR2V0IHBvaW50ZXJzIHRvIHRoZSBzdGFydCBvZiBlYWNoIHBhcmFtZXRlciBzdHJpbmcuICovCi0gICBmb3IgKGkgPSAwOyBpIDwgKGludClucGFyYW1zOyBpKyspCi0gICB7Ci0gICAgICBidWYrKzsgLyogU2tpcCB0aGUgbnVsbCBzdHJpbmcgdGVybWluYXRvciBmcm9tIHByZXZpb3VzIHBhcmFtZXRlci4gKi8KLQotICAgICAgcG5nX2RlYnVnMSgzLCAiUmVhZGluZyBwQ0FMIHBhcmFtZXRlciAlZCIsIGkpOwotICAgICAgZm9yIChwYXJhbXNbaV0gPSBidWY7IGJ1ZiA8PSBlbmRwdHIgJiYgKmJ1ZiAhPSAweDAwOyBidWYrKykKLSAgICAgICAgIC8qIEVtcHR5IGxvb3AgdG8gbW92ZSBwYXN0IGVhY2ggcGFyYW1ldGVyIHN0cmluZyAqLyA7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlbid0IHJ1biBvdXQgb2YgZGF0YSB5ZXQgKi8KLSAgICAgIGlmIChidWYgPiBlbmRwdHIpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBwQ0FMIGRhdGEiKTsKLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcGFyYW1zKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgIH0KLQotICAgcG5nX3NldF9wQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEsIFgwLCBYMSwgdHlwZSwgbnBhcmFtcywKLSAgICAgIHVuaXRzLCBwYXJhbXMpOwotCi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBhcmFtcyk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfc0NBTF9TVVBQT1JURUQpCi0vKiBSZWFkIHRoZSBzQ0FMIGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfc0NBTChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19jaGFycCBlcDsKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICBkb3VibGUgd2lkdGgsIGhlaWdodDsKLSAgIHBuZ19jaGFycCB2cDsKLSNlbHNlCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgcG5nX2NoYXJwIHN3aWR0aCwgc2hlaWdodDsKLSNlbmRpZgotI2VuZGlmCi0gICBwbmdfc2l6ZV90IHNsZW5ndGg7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV9zQ0FMIik7Ci0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSBzQ0FMIik7Ci0gICBlbHNlIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHNDQUwgYWZ0ZXIgSURBVCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIGVsc2UgaWYgKGluZm9fcHRyICE9IE5VTEwgJiYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NDQUwpKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkR1cGxpY2F0ZSBzQ0FMIGNodW5rIik7Ci0gICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfZGVidWcxKDIsICJBbGxvY2F0aW5nIGFuZCByZWFkaW5nIHNDQUwgY2h1bmsgZGF0YSAoJWx1IGJ5dGVzKSIsCi0gICAgICBsZW5ndGggKyAxKTsKLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCArIDEpOwotICAgaWYgKHBuZ19wdHItPmNodW5rZGF0YSA9PSBOVUxMKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBtZW1vcnkgd2hpbGUgcHJvY2Vzc2luZyBzQ0FMIGNodW5rIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBzbGVuZ3RoID0gKHBuZ19zaXplX3QpbGVuZ3RoOwotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhLCBzbGVuZ3RoKTsKLQotICAgaWYgKHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIDApKQotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ19wdHItPmNodW5rZGF0YVtzbGVuZ3RoXSA9IDB4MDA7IC8qIE51bGwgdGVybWluYXRlIHRoZSBsYXN0IHN0cmluZyAqLwotCi0gICBlcCA9IHBuZ19wdHItPmNodW5rZGF0YSArIDE7ICAgICAgICAvKiBTa2lwIHVuaXQgYnl0ZSAqLwotCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgd2lkdGggPSBwbmdfc3RydG9kKHBuZ19wdHIsIGVwLCAmdnApOwotICAgaWYgKCp2cCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJtYWxmb3JtZWQgd2lkdGggc3RyaW5nIGluIHNDQUwgY2h1bmsiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSNlbHNlCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgc3dpZHRoID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgcG5nX3N0cmxlbihlcCkgKyAxKTsKLSAgIGlmIChzd2lkdGggPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgb2YgbWVtb3J5IHdoaWxlIHByb2Nlc3Npbmcgc0NBTCBjaHVuayB3aWR0aCIpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgcG5nX21lbWNweShzd2lkdGgsIGVwLCAocG5nX3NpemVfdClwbmdfc3RybGVuKGVwKSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0gICBmb3IgKGVwID0gcG5nX3B0ci0+Y2h1bmtkYXRhOyAqZXA7IGVwKyspCi0gICAgICAvKiBFbXB0eSBsb29wICovIDsKLSAgIGVwKys7Ci0KLSAgIGlmIChwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoIDwgZXApCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVHJ1bmNhdGVkIHNDQUwgY2h1bmsiKTsKLSNpZiBkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQpICYmIFwKLSAgICAhZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgc3dpZHRoKTsKLSNlbmRpZgotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICBoZWlnaHQgPSBwbmdfc3RydG9kKHBuZ19wdHIsIGVwLCAmdnApOwotICAgaWYgKCp2cCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJtYWxmb3JtZWQgaGVpZ2h0IHN0cmluZyBpbiBzQ0FMIGNodW5rIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0jZWxzZQotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgIHNoZWlnaHQgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBwbmdfc3RybGVuKGVwKSArIDEpOwotICAgaWYgKHNoZWlnaHQgPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJPdXQgb2YgbWVtb3J5IHdoaWxlIHByb2Nlc3Npbmcgc0NBTCBjaHVuayBoZWlnaHQiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIHBuZ19tZW1jcHkoc2hlaWdodCwgZXAsIChwbmdfc2l6ZV90KXBuZ19zdHJsZW4oZXApKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgIGlmIChwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoIDwgZXAKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgICB8fCB3aWR0aCA8PSAwLiB8fCBoZWlnaHQgPD0gMC4KLSNlbmRpZgotICAgICAgKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc0NBTCBkYXRhIik7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSNpZiBkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQpICYmICFkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCi0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBzd2lkdGgpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgc2hlaWdodCk7Ci0jZW5kaWYKLSAgICAgIHJldHVybjsKLSAgIH0KLQotCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgcG5nX3NldF9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCBwbmdfcHRyLT5jaHVua2RhdGFbMF0sIHdpZHRoLCBoZWlnaHQpOwotI2Vsc2UKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICBwbmdfc2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhWzBdLCBzd2lkdGgsIHNoZWlnaHQpOwotI2VuZGlmCi0jZW5kaWYKLQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0jaWYgZGVmaW5lZChQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKQotICAgcG5nX2ZyZWUocG5nX3B0ciwgc3dpZHRoKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHNoZWlnaHQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfdElNRV9TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfdElNRShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ19ieXRlIGJ1Zls3XTsKLSAgIHBuZ190aW1lIG1vZF90aW1lOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfdElNRSIpOwotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk91dCBvZiBwbGFjZSB0SU1FIGNodW5rIik7Ci0gICBlbHNlIGlmIChpbmZvX3B0ciAhPSBOVUxMICYmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190SU1FKSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJEdXBsaWNhdGUgdElNRSBjaHVuayIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKLQotICAgaWYgKGxlbmd0aCAhPSA3KQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluY29ycmVjdCB0SU1FIGNodW5rIGxlbmd0aCIpOwotICAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIGJ1ZiwgNyk7Ci0gICBpZiAocG5nX2NyY19maW5pc2gocG5nX3B0ciwgMCkpCi0gICAgICByZXR1cm47Ci0KLSAgIG1vZF90aW1lLnNlY29uZCA9IGJ1Zls2XTsKLSAgIG1vZF90aW1lLm1pbnV0ZSA9IGJ1Zls1XTsKLSAgIG1vZF90aW1lLmhvdXIgPSBidWZbNF07Ci0gICBtb2RfdGltZS5kYXkgPSBidWZbM107Ci0gICBtb2RfdGltZS5tb250aCA9IGJ1ZlsyXTsKLSAgIG1vZF90aW1lLnllYXIgPSBwbmdfZ2V0X3VpbnRfMTYoYnVmKTsKLQotICAgcG5nX3NldF90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCAmbW9kX3RpbWUpOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX3RFWHRfU1VQUE9SVEVEKQotLyogTm90ZTogdGhpcyBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgY2h1bmtzIHRoYXQgYXJlID4gNjRLIHVuZGVyIERPUyAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfaGFuZGxlX3RFWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICBwbmdfdGV4dHAgdGV4dF9wdHI7Ci0gICBwbmdfY2hhcnAga2V5OwotICAgcG5nX2NoYXJwIHRleHQ7Ci0gICBwbmdfdWludF8zMiBza2lwID0gMDsKLSAgIHBuZ19zaXplX3Qgc2xlbmd0aDsKLSAgIGludCByZXQ7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV90RVh0Iik7Ci0KLQotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lIRFIpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIElIRFIgYmVmb3JlIHRFWHQiKTsKLQotICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKLQotI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SwotICAgaWYgKGxlbmd0aCA+IChwbmdfdWludF8zMik2NTUzNUwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAidEVYdCBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOwotICAgICAgc2tpcCA9IGxlbmd0aCAtIChwbmdfdWludF8zMik2NTUzNUw7Ci0gICAgICBsZW5ndGggPSAocG5nX3VpbnRfMzIpNjU1MzVMOwotICAgfQotI2VuZGlmCi0KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0KLSAgIHBuZ19wdHItPmNodW5rZGF0YSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIGxlbmd0aCArIDEpOwotICAgaWYgKHBuZ19wdHItPmNodW5rZGF0YSA9PSBOVUxMKQotICAgewotICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm8gbWVtb3J5IHRvIHByb2Nlc3MgdGV4dCBjaHVuay4iKTsKLSAgICAgcmV0dXJuOwotICAgfQotICAgc2xlbmd0aCA9IChwbmdfc2l6ZV90KWxlbmd0aDsKLSAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19wdHItPmNodW5rZGF0YSwgc2xlbmd0aCk7Ci0KLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBza2lwKSkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBrZXkgPSBwbmdfcHRyLT5jaHVua2RhdGE7Ci0KLSAgIGtleVtzbGVuZ3RoXSA9IDB4MDA7Ci0KLSAgIGZvciAodGV4dCA9IGtleTsgKnRleHQ7IHRleHQrKykKLSAgICAgIC8qIEVtcHR5IGxvb3AgdG8gZmluZCBlbmQgb2Yga2V5ICovIDsKLQotICAgaWYgKHRleHQgIT0ga2V5ICsgc2xlbmd0aCkKLSAgICAgIHRleHQrKzsKLQotICAgdGV4dF9wdHIgPSAocG5nX3RleHRwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAotICAgICAgKHBuZ191aW50XzMyKXBuZ19zaXplb2YocG5nX3RleHQpKTsKLSAgIGlmICh0ZXh0X3B0ciA9PSBOVUxMKQotICAgewotICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcHJvY2VzcyB0ZXh0IGNodW5rLiIpOwotICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICByZXR1cm47Ci0gICB9Ci0gICB0ZXh0X3B0ci0+Y29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOwotICAgdGV4dF9wdHItPmtleSA9IGtleTsKLSNpZmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKLSAgIHRleHRfcHRyLT5sYW5nID0gTlVMTDsKLSAgIHRleHRfcHRyLT5sYW5nX2tleSA9IE5VTEw7Ci0gICB0ZXh0X3B0ci0+aXR4dF9sZW5ndGggPSAwOwotI2VuZGlmCi0gICB0ZXh0X3B0ci0+dGV4dCA9IHRleHQ7Ci0gICB0ZXh0X3B0ci0+dGV4dF9sZW5ndGggPSBwbmdfc3RybGVuKHRleHQpOwotCi0gICByZXQgPSBwbmdfc2V0X3RleHRfMihwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dF9wdHIsIDEpOwotCi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHRleHRfcHRyKTsKLSAgIGlmIChyZXQpCi0gICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHByb2Nlc3MgdGV4dCBjaHVuay4iKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF96VFh0X1NVUFBPUlRFRCkKLS8qIE5vdGU6IHRoaXMgZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSBjaHVua3MgdGhhdCBhcmUgPiA2NEsgdW5kZXIgRE9TICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19oYW5kbGVfelRYdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCkKLXsKLSAgIHBuZ190ZXh0cCB0ZXh0X3B0cjsKLSAgIHBuZ19jaGFycCB0ZXh0OwotICAgaW50IGNvbXBfdHlwZTsKLSAgIGludCByZXQ7Ci0gICBwbmdfc2l6ZV90IHNsZW5ndGgsIHByZWZpeF9sZW4sIGRhdGFfbGVuOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19oYW5kbGVfelRYdCIpOwotCi0KLSAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JSERSKSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiTWlzc2luZyBJSERSIGJlZm9yZSB6VFh0Iik7Ci0KLSAgIGlmIChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSURBVCkKLSAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7Ci0KLSNpZmRlZiBQTkdfTUFYX01BTExPQ182NEsKLSAgIC8qIFdlIHdpbGwgbm8gZG91YnQgaGF2ZSBwcm9ibGVtcyB3aXRoIGNodW5rcyBldmVuIGhhbGYgdGhpcyBzaXplLCBidXQKLSAgICAgIHRoZXJlIGlzIG5vIGhhcmQgYW5kIGZhc3QgcnVsZSB0byB0ZWxsIHVzIHdoZXJlIHRvIHN0b3AuICovCi0gICBpZiAobGVuZ3RoID4gKHBuZ191aW50XzMyKTY1NTM1TCkKLSAgIHsKLSAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgInpUWHQgY2h1bmsgdG9vIGxhcmdlIHRvIGZpdCBpbiBtZW1vcnkiKTsKLSAgICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgbGVuZ3RoKTsKLSAgICAgcmV0dXJuOwotICAgfQotI2VuZGlmCi0KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICBwbmdfcHRyLT5jaHVua2RhdGEgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGggKyAxKTsKLSAgIGlmIChwbmdfcHRyLT5jaHVua2RhdGEgPT0gTlVMTCkKLSAgIHsKLSAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBtZW1vcnkgcHJvY2Vzc2luZyB6VFh0IGNodW5rLiIpOwotICAgICByZXR1cm47Ci0gICB9Ci0gICBzbGVuZ3RoID0gKHBuZ19zaXplX3QpbGVuZ3RoOwotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhLCBzbGVuZ3RoKTsKLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfcHRyLT5jaHVua2RhdGFbc2xlbmd0aF0gPSAweDAwOwotCi0gICBmb3IgKHRleHQgPSBwbmdfcHRyLT5jaHVua2RhdGE7ICp0ZXh0OyB0ZXh0KyspCi0gICAgICAvKiBFbXB0eSBsb29wICovIDsKLQotICAgLyogelRYdCBtdXN0IGhhdmUgc29tZSB0ZXh0IGFmdGVyIHRoZSBjaHVua2RhdGF3b3JkICovCi0gICBpZiAodGV4dCA+PSBwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoIC0gMikKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJUcnVuY2F0ZWQgelRYdCBjaHVuayIpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICAgY29tcF90eXBlID0gKigrK3RleHQpOwotICAgICAgIGlmIChjb21wX3R5cGUgIT0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdCkKLSAgICAgICB7Ci0gICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVua25vd24gY29tcHJlc3Npb24gdHlwZSBpbiB6VFh0IGNodW5rIik7Ci0gICAgICAgICAgY29tcF90eXBlID0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdDsKLSAgICAgICB9Ci0gICAgICAgdGV4dCsrOyAgICAgICAgLyogU2tpcCB0aGUgY29tcHJlc3Npb25fbWV0aG9kIGJ5dGUgKi8KLSAgIH0KLSAgIHByZWZpeF9sZW4gPSB0ZXh0IC0gcG5nX3B0ci0+Y2h1bmtkYXRhOwotCi0gICBwbmdfZGVjb21wcmVzc19jaHVuayhwbmdfcHRyLCBjb21wX3R5cGUsCi0gICAgIChwbmdfc2l6ZV90KWxlbmd0aCwgcHJlZml4X2xlbiwgJmRhdGFfbGVuKTsKLQotICAgdGV4dF9wdHIgPSAocG5nX3RleHRwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAotICAgICAgKHBuZ191aW50XzMyKXBuZ19zaXplb2YocG5nX3RleHQpKTsKLSAgIGlmICh0ZXh0X3B0ciA9PSBOVUxMKQotICAgewotICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcHJvY2VzcyB6VFh0IGNodW5rLiIpOwotICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICByZXR1cm47Ci0gICB9Ci0gICB0ZXh0X3B0ci0+Y29tcHJlc3Npb24gPSBjb21wX3R5cGU7Ci0gICB0ZXh0X3B0ci0+a2V5ID0gcG5nX3B0ci0+Y2h1bmtkYXRhOwotI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAotICAgdGV4dF9wdHItPmxhbmcgPSBOVUxMOwotICAgdGV4dF9wdHItPmxhbmdfa2V5ID0gTlVMTDsKLSAgIHRleHRfcHRyLT5pdHh0X2xlbmd0aCA9IDA7Ci0jZW5kaWYKLSAgIHRleHRfcHRyLT50ZXh0ID0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgcHJlZml4X2xlbjsKLSAgIHRleHRfcHRyLT50ZXh0X2xlbmd0aCA9IGRhdGFfbGVuOwotCi0gICByZXQgPSBwbmdfc2V0X3RleHRfMihwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dF9wdHIsIDEpOwotCi0gICBwbmdfZnJlZShwbmdfcHRyLCB0ZXh0X3B0cik7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgIGlmIChyZXQpCi0gICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBzdG9yZSB6VFh0IGNodW5rLiIpOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX2lUWHRfU1VQUE9SVEVEKQotLyogTm90ZTogdGhpcyBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIGNodW5rcyB0aGF0IGFyZSA+IDY0SyB1bmRlciBET1MgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV9pVFh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX3RleHRwIHRleHRfcHRyOwotICAgcG5nX2NoYXJwIGtleSwgbGFuZywgdGV4dCwgbGFuZ19rZXk7Ci0gICBpbnQgY29tcF9mbGFnOwotICAgaW50IGNvbXBfdHlwZSA9IDA7Ci0gICBpbnQgcmV0OwotICAgcG5nX3NpemVfdCBzbGVuZ3RoLCBwcmVmaXhfbGVuLCBkYXRhX2xlbjsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfaGFuZGxlX2lUWHQiKTsKLQotCi0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfSUhEUikpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk1pc3NpbmcgSUhEUiBiZWZvcmUgaVRYdCIpOwotCi0gICBpZiAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpCi0gICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOwotCi0jaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCi0gICAvKiBXZSB3aWxsIG5vIGRvdWJ0IGhhdmUgcHJvYmxlbXMgd2l0aCBjaHVua3MgZXZlbiBoYWxmIHRoaXMgc2l6ZSwgYnV0Ci0gICAgICB0aGVyZSBpcyBubyBoYXJkIGFuZCBmYXN0IHJ1bGUgdG8gdGVsbCB1cyB3aGVyZSB0byBzdG9wLiAqLwotICAgaWYgKGxlbmd0aCA+IChwbmdfdWludF8zMik2NTUzNUwpCi0gICB7Ci0gICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJpVFh0IGNodW5rIHRvbyBsYXJnZSB0byBmaXQgaW4gbWVtb3J5Iik7Ci0gICAgIHBuZ19jcmNfZmluaXNoKHBuZ19wdHIsIGxlbmd0aCk7Ci0gICAgIHJldHVybjsKLSAgIH0KLSNlbmRpZgotCi0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoICsgMSk7Ci0gICBpZiAocG5nX3B0ci0+Y2h1bmtkYXRhID09IE5VTEwpCi0gICB7Ci0gICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJObyBtZW1vcnkgdG8gcHJvY2VzcyBpVFh0IGNodW5rLiIpOwotICAgICByZXR1cm47Ci0gICB9Ci0gICBzbGVuZ3RoID0gKHBuZ19zaXplX3QpbGVuZ3RoOwotICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+Y2h1bmtkYXRhLCBzbGVuZ3RoKTsKLSAgIGlmIChwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKSkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfcHRyLT5jaHVua2RhdGFbc2xlbmd0aF0gPSAweDAwOwotCi0gICBmb3IgKGxhbmcgPSBwbmdfcHRyLT5jaHVua2RhdGE7ICpsYW5nOyBsYW5nKyspCi0gICAgICAvKiBFbXB0eSBsb29wICovIDsKLSAgIGxhbmcrKzsgICAgICAgIC8qIFNraXAgTlVMIHNlcGFyYXRvciAqLwotCi0gICAvKiBpVFh0IG11c3QgaGF2ZSBhIGxhbmd1YWdlIHRhZyAocG9zc2libHkgZW1wdHkpLCB0d28gY29tcHJlc3Npb24gYnl0ZXMsCi0gICAgKiB0cmFuc2xhdGVkIGtleXdvcmQgKHBvc3NpYmx5IGVtcHR5KSwgYW5kIHBvc3NpYmx5IHNvbWUgdGV4dCBhZnRlciB0aGUKLSAgICAqIGtleXdvcmQKLSAgICAqLwotCi0gICBpZiAobGFuZyA+PSBwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoIC0gMykKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJUcnVuY2F0ZWQgaVRYdCBjaHVuayIpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICAgY29tcF9mbGFnID0gKmxhbmcrKzsKLSAgICAgICBjb21wX3R5cGUgPSAqbGFuZysrOwotICAgfQotCi0gICBmb3IgKGxhbmdfa2V5ID0gbGFuZzsgKmxhbmdfa2V5OyBsYW5nX2tleSsrKQotICAgICAgLyogRW1wdHkgbG9vcCAqLyA7Ci0gICBsYW5nX2tleSsrOyAgICAgICAgLyogU2tpcCBOVUwgc2VwYXJhdG9yICovCi0KLSAgIGlmIChsYW5nX2tleSA+PSBwbmdfcHRyLT5jaHVua2RhdGEgKyBzbGVuZ3RoKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlRydW5jYXRlZCBpVFh0IGNodW5rIik7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua2RhdGEpOwotICAgICAgcG5nX3B0ci0+Y2h1bmtkYXRhID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgZm9yICh0ZXh0ID0gbGFuZ19rZXk7ICp0ZXh0OyB0ZXh0KyspCi0gICAgICAvKiBFbXB0eSBsb29wICovIDsKLSAgIHRleHQrKzsgICAgICAgIC8qIFNraXAgTlVMIHNlcGFyYXRvciAqLwotICAgaWYgKHRleHQgPj0gcG5nX3B0ci0+Y2h1bmtkYXRhICsgc2xlbmd0aCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJNYWxmb3JtZWQgaVRYdCBjaHVuayIpOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+Y2h1bmtkYXRhKTsKLSAgICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHByZWZpeF9sZW4gPSB0ZXh0IC0gcG5nX3B0ci0+Y2h1bmtkYXRhOwotCi0gICBrZXk9cG5nX3B0ci0+Y2h1bmtkYXRhOwotICAgaWYgKGNvbXBfZmxhZykKLSAgICAgICBwbmdfZGVjb21wcmVzc19jaHVuayhwbmdfcHRyLCBjb21wX3R5cGUsCi0gICAgICAgICAoc2l6ZV90KWxlbmd0aCwgcHJlZml4X2xlbiwgJmRhdGFfbGVuKTsKLSAgIGVsc2UKLSAgICAgICBkYXRhX2xlbiA9IHBuZ19zdHJsZW4ocG5nX3B0ci0+Y2h1bmtkYXRhICsgcHJlZml4X2xlbik7Ci0gICB0ZXh0X3B0ciA9IChwbmdfdGV4dHApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCi0gICAgICAocG5nX3VpbnRfMzIpcG5nX3NpemVvZihwbmdfdGV4dCkpOwotICAgaWYgKHRleHRfcHRyID09IE5VTEwpCi0gICB7Ci0gICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBwcm9jZXNzIGlUWHQgY2h1bmsuIik7Ci0gICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICAgIHBuZ19wdHItPmNodW5rZGF0YSA9IE5VTEw7Ci0gICAgIHJldHVybjsKLSAgIH0KLSAgIHRleHRfcHRyLT5jb21wcmVzc2lvbiA9IChpbnQpY29tcF9mbGFnICsgMTsKLSAgIHRleHRfcHRyLT5sYW5nX2tleSA9IHBuZ19wdHItPmNodW5rZGF0YSArIChsYW5nX2tleSAtIGtleSk7Ci0gICB0ZXh0X3B0ci0+bGFuZyA9IHBuZ19wdHItPmNodW5rZGF0YSArIChsYW5nIC0ga2V5KTsKLSAgIHRleHRfcHRyLT5pdHh0X2xlbmd0aCA9IGRhdGFfbGVuOwotICAgdGV4dF9wdHItPnRleHRfbGVuZ3RoID0gMDsKLSAgIHRleHRfcHRyLT5rZXkgPSBwbmdfcHRyLT5jaHVua2RhdGE7Ci0gICB0ZXh0X3B0ci0+dGV4dCA9IHBuZ19wdHItPmNodW5rZGF0YSArIHByZWZpeF9sZW47Ci0KLSAgIHJldCA9IHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgMSk7Ci0KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHRleHRfcHRyKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rZGF0YSk7Ci0gICBwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMOwotICAgaWYgKHJldCkKLSAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHN0b3JlIGlUWHQgY2h1bmsuIik7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlbid0IGZvdW5kIGEgaGFuZGxlciBmb3IgYQotICAgY2h1bmsuICBJZiB0aGVyZSBpc24ndCBhIHByb2JsZW0gd2l0aCB0aGUgY2h1bmsgaXRzZWxmIChpZSBiYWQKLSAgIGNodW5rIG5hbWUsIENSQywgb3IgYSBjcml0aWNhbCBjaHVuayksIHRoZSBjaHVuayBpcyBzaWxlbnRseSBpZ25vcmVkCi0gICAtLSB1bmxlc3MgdGhlIFBOR19GTEFHX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCBmbGFnIGlzIG9uIGluIHdoaWNoCi0gICBjYXNlIGl0IHdpbGwgYmUgc2F2ZWQgYXdheSB0byBiZSB3cml0dGVuIG91dCBsYXRlci4gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2hhbmRsZV91bmtub3duKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotewotICAgcG5nX3VpbnRfMzIgc2tpcCA9IDA7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2hhbmRsZV91bmtub3duIik7Ci0KLQotICAgaWYgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKQotICAgewotI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCi0gICAgICBQTkdfQ09OU1QgUE5HX0lEQVQ7Ci0jZW5kaWYKLSAgICAgIGlmIChwbmdfbWVtY21wKHBuZ19wdHItPmNodW5rX25hbWUsIHBuZ19JREFULCA0KSkgIC8qIE5vdCBhbiBJREFUICovCi0gICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOwotICAgfQotCi0gICBpZiAoIShwbmdfcHRyLT5jaHVua19uYW1lWzBdICYgMHgyMCkpCi0gICB7Ci0jaWYgZGVmaW5lZChQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICAgICBpZiAocG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUpICE9Ci0gICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQpCi0gICAgICAgICAgICYmIHBuZ19wdHItPnJlYWRfdXNlcl9jaHVua19mbiA9PSBOVUxMCi0jZW5kaWYKLSAgICAgICAgKQotI2VuZGlmCi0gICAgICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJ1bmtub3duIGNyaXRpY2FsIGNodW5rIik7Ci0gICB9Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgIGlmICgocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19LRUVQX1VOS05PV05fQ0hVTktTKSB8fAotICAgICAgIChwbmdfcHRyLT5yZWFkX3VzZXJfY2h1bmtfZm4gIT0gTlVMTCkpCi0gICB7Ci0jaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCi0gICAgICAgaWYgKGxlbmd0aCA+IChwbmdfdWludF8zMik2NTUzNUwpCi0gICAgICAgewotICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAidW5rbm93biBjaHVuayB0b28gbGFyZ2UgdG8gZml0IGluIG1lbW9yeSIpOwotICAgICAgICAgICBza2lwID0gbGVuZ3RoIC0gKHBuZ191aW50XzMyKTY1NTM1TDsKLSAgICAgICAgICAgbGVuZ3RoID0gKHBuZ191aW50XzMyKTY1NTM1TDsKLSAgICAgICB9Ci0jZW5kaWYKLSAgICAgICBwbmdfbWVtY3B5KChwbmdfY2hhcnApcG5nX3B0ci0+dW5rbm93bl9jaHVuay5uYW1lLAotICAgICAgICAgICAgICAgICAgKHBuZ19jaGFycClwbmdfcHRyLT5jaHVua19uYW1lLCAKLSAgICAgICAgICAgICAgICAgIHBuZ19zaXplb2YocG5nX3B0ci0+dW5rbm93bl9jaHVuay5uYW1lKSk7Ci0gICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5uYW1lW3BuZ19zaXplb2YocG5nX3B0ci0+dW5rbm93bl9jaHVuay5uYW1lKS0xXSA9ICdcMCc7Ci0gICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5zaXplID0gKHBuZ19zaXplX3QpbGVuZ3RoOwotICAgICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IE5VTEw7Ci0gICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhLCBsZW5ndGgpOwotICAgICAgIH0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRCkKLSAgICAgICBpZiAocG5nX3B0ci0+cmVhZF91c2VyX2NodW5rX2ZuICE9IE5VTEwpCi0gICAgICAgewotICAgICAgICAgIC8qIENhbGxiYWNrIHRvIHVzZXIgdW5rbm93biBjaHVuayBoYW5kbGVyICovCi0gICAgICAgICAgaW50IHJldDsKLSAgICAgICAgICByZXQgPSAoKihwbmdfcHRyLT5yZWFkX3VzZXJfY2h1bmtfZm4pKQotICAgICAgICAgICAgKHBuZ19wdHIsICZwbmdfcHRyLT51bmtub3duX2NodW5rKTsKLSAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgImVycm9yIGluIHVzZXIgY2h1bmsiKTsKLSAgICAgICAgICBpZiAocmV0ID09IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgIGlmICghKHBuZ19wdHItPmNodW5rX25hbWVbMF0gJiAweDIwKSkKLSAgICAgICAgICAgICAgICBpZiAocG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUpICE9Ci0gICAgICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FMV0FZUykKLSAgICAgICAgICAgICAgICAgICBwbmdfY2h1bmtfZXJyb3IocG5nX3B0ciwgInVua25vd24gY3JpdGljYWwgY2h1bmsiKTsKLSAgICAgICAgICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICAgICAgICAgJnBuZ19wdHItPnVua25vd25fY2h1bmssIDEpOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnBuZ19wdHItPnVua25vd25fY2h1bmssIDEpOwotICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnVua25vd25fY2h1bmsuZGF0YSk7Ci0gICAgICAgcG5nX3B0ci0+dW5rbm93bl9jaHVuay5kYXRhID0gTlVMTDsKLSAgIH0KLSAgIGVsc2UKLSNlbmRpZgotICAgICAgc2tpcCA9IGxlbmd0aDsKLQotICAgcG5nX2NyY19maW5pc2gocG5nX3B0ciwgc2tpcCk7Ci0KLSNpZiAhZGVmaW5lZChQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQpCi0gICBpbmZvX3B0ciA9IGluZm9fcHRyOyAvKiBRdWlldCBjb21waWxlciB3YXJuaW5ncyBhYm91dCB1bnVzZWQgaW5mb19wdHIgKi8KLSNlbmRpZgotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB2ZXJpZnkgdGhhdCBhIGNodW5rIG5hbWUgaXMgdmFsaWQuCi0gICBUaGlzIGZ1bmN0aW9uIGNhbid0IGhhdmUgdGhlICJjcml0aWNhbCBjaHVuayBjaGVjayIgaW5jb3Jwb3JhdGVkCi0gICBpbnRvIGl0LCBzaW5jZSBpbiB0aGUgZnV0dXJlIHdlIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIGNhbGwgdXNlcgotICAgZnVuY3Rpb25zIHRvIGhhbmRsZSB1bmtub3duIGNyaXRpY2FsIGNodW5rcyBhZnRlciB3ZSBjaGVjayB0aGF0Ci0gICB0aGUgY2h1bmsgbmFtZSBpdHNlbGYgaXMgdmFsaWQuICovCi0KLSNkZWZpbmUgaXNub25hbHBoYShjKSAoKGMpIDwgNjUgfHwgKGMpID4gMTIyIHx8ICgoYykgPiA5MCAmJiAoYykgPCA5NykpCi0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2NoZWNrX2NodW5rX25hbWUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGNodW5rX25hbWUpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19jaGVja19jaHVua19uYW1lIik7Ci0gICBpZiAoaXNub25hbHBoYShjaHVua19uYW1lWzBdKSB8fCBpc25vbmFscGhhKGNodW5rX25hbWVbMV0pIHx8Ci0gICAgICAgaXNub25hbHBoYShjaHVua19uYW1lWzJdKSB8fCBpc25vbmFscGhhKGNodW5rX25hbWVbM10pKQotICAgewotICAgICAgcG5nX2NodW5rX2Vycm9yKHBuZ19wdHIsICJpbnZhbGlkIGNodW5rIHR5cGUiKTsKLSAgIH0KLX0KLQotLyogQ29tYmluZXMgdGhlIHJvdyByZWNlbnRseSByZWFkIGluIHdpdGggdGhlIGV4aXN0aW5nIHBpeGVscyBpbiB0aGUKLSAgIHJvdy4gIFRoaXMgcm91dGluZSB0YWtlcyBjYXJlIG9mIGFscGhhIGFuZCB0cmFuc3BhcmVuY3kgaWYgcmVxdWVzdGVkLgotICAgVGhpcyByb3V0aW5lIGFsc28gaGFuZGxlcyB0aGUgdHdvIG1ldGhvZHMgb2YgcHJvZ3Jlc3NpdmUgZGlzcGxheQotICAgb2YgaW50ZXJsYWNlZCBpbWFnZXMsIGRlcGVuZGluZyBvbiB0aGUgbWFzayB2YWx1ZS4KLSAgIFRoZSBtYXNrIHZhbHVlIGRlc2NyaWJlcyB3aGljaCBwaXhlbHMgYXJlIHRvIGJlIGNvbWJpbmVkIHdpdGgKLSAgIHRoZSByb3cuICBUaGUgcGF0dGVybiBhbHdheXMgcmVwZWF0cyBldmVyeSA4IHBpeGVscywgc28ganVzdCA4Ci0gICBiaXRzIGFyZSBuZWVkZWQuICBBIG9uZSBpbmRpY2F0ZXMgdGhlIHBpeGVsIGlzIHRvIGJlIGNvbWJpbmVkLAotICAgYSB6ZXJvIGluZGljYXRlcyB0aGUgcGl4ZWwgaXMgdG8gYmUgc2tpcHBlZC4gIFRoaXMgaXMgaW4gYWRkaXRpb24KLSAgIHRvIGFueSBhbHBoYSBvciB0cmFuc3BhcmVuY3kgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwaXhlbC4gIElmCi0gICB5b3Ugd2FudCBhbGwgcGl4ZWxzIHRvIGJlIGNvbWJpbmVkLCBwYXNzIDB4ZmYgKDI1NSkgaW4gbWFzay4gICovCi0KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2NvbWJpbmVfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCByb3csIGludCBtYXNrKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY29tYmluZV9yb3ciKTsKLSAgIGlmIChtYXNrID09IDB4ZmYpCi0gICB7Ci0gICAgICBwbmdfbWVtY3B5KHJvdywgcG5nX3B0ci0+cm93X2J1ZiArIDEsCi0gICAgICAgICBQTkdfUk9XQllURVMocG5nX3B0ci0+cm93X2luZm8ucGl4ZWxfZGVwdGgsIHBuZ19wdHItPndpZHRoKSk7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBzd2l0Y2ggKHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoKQotICAgICAgewotICAgICAgICAgY2FzZSAxOgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcG5nX3B0ci0+cm93X2J1ZiArIDE7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7Ci0gICAgICAgICAgICBpbnQgc19pbmMsIHNfc3RhcnQsIHNfZW5kOwotICAgICAgICAgICAgaW50IG0gPSAweDgwOwotICAgICAgICAgICAgaW50IHNoaWZ0OwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHBuZ19wdHItPndpZHRoOwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNfc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIHNfZW5kID0gNzsKLSAgICAgICAgICAgICAgICBzX2luYyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzX3N0YXJ0ID0gNzsKLSAgICAgICAgICAgICAgICBzX2VuZCA9IDA7Ci0gICAgICAgICAgICAgICAgc19pbmMgPSAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2hpZnQgPSBzX3N0YXJ0OwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAobSAmIG1hc2spCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpbnQgdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCpzcCA+PiBzaGlmdCkgJiAweDAxOwotICAgICAgICAgICAgICAgICAgKmRwICY9IChwbmdfYnl0ZSkoKDB4N2Y3ZiA+PiAoNyAtIHNoaWZ0KSkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICpkcCB8PSAocG5nX2J5dGUpKHZhbHVlIDw8IHNoaWZ0KTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IHNfZW5kKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2hpZnQgPSBzX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgICAgIGRwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzaGlmdCArPSBzX2luYzsKLQotICAgICAgICAgICAgICAgaWYgKG0gPT0gMSkKLSAgICAgICAgICAgICAgICAgIG0gPSAweDgwOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgbSA+Pj0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSAyOgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcG5nX3B0ci0+cm93X2J1ZiArIDE7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3c7Ci0gICAgICAgICAgICBpbnQgc19zdGFydCwgc19lbmQsIHNfaW5jOwotICAgICAgICAgICAgaW50IG0gPSAweDgwOwotICAgICAgICAgICAgaW50IHNoaWZ0OwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHBuZ19wdHItPndpZHRoOwotICAgICAgICAgICAgaW50IHZhbHVlOwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpCi0gICAgICAgICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0tTV0FQKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc19zdGFydCA9IDA7Ci0gICAgICAgICAgICAgICBzX2VuZCA9IDY7Ci0gICAgICAgICAgICAgICBzX2luYyA9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNfc3RhcnQgPSA2OwotICAgICAgICAgICAgICAgc19lbmQgPSAwOwotICAgICAgICAgICAgICAgc19pbmMgPSAtMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2hpZnQgPSBzX3N0YXJ0OwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAobSAmIG1hc2spCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHgwMzsKLSAgICAgICAgICAgICAgICAgICpkcCAmPSAocG5nX2J5dGUpKCgweDNmM2YgPj4gKDYgLSBzaGlmdCkpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqZHAgfD0gKHBuZ19ieXRlKSh2YWx1ZSA8PCBzaGlmdCk7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSBzX2VuZCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gc19zdGFydDsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICAgICBkcCsrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gc19pbmM7Ci0gICAgICAgICAgICAgICBpZiAobSA9PSAxKQotICAgICAgICAgICAgICAgICAgbSA9IDB4ODA7Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBtID4+PSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AgPSBwbmdfcHRyLT5yb3dfYnVmICsgMTsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcCA9IHJvdzsKLSAgICAgICAgICAgIGludCBzX3N0YXJ0LCBzX2VuZCwgc19pbmM7Ci0gICAgICAgICAgICBpbnQgbSA9IDB4ODA7Ci0gICAgICAgICAgICBpbnQgc2hpZnQ7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcG5nX3B0ci0+d2lkdGg7Ci0gICAgICAgICAgICBpbnQgdmFsdWU7Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCkKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzX3N0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgIHNfZW5kID0gNDsKLSAgICAgICAgICAgICAgIHNfaW5jID0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc19zdGFydCA9IDQ7Ci0gICAgICAgICAgICAgICBzX2VuZCA9IDA7Ci0gICAgICAgICAgICAgICBzX2luYyA9IC00OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hpZnQgPSBzX3N0YXJ0OwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAobSAmIG1hc2spCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgqc3AgPj4gc2hpZnQpICYgMHhmOwotICAgICAgICAgICAgICAgICAgKmRwICY9IChwbmdfYnl0ZSkoKDB4ZjBmID4+ICg0IC0gc2hpZnQpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgKmRwIHw9IChwbmdfYnl0ZSkodmFsdWUgPDwgc2hpZnQpOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gc19lbmQpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IHNfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgICAgZHArKzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IHNfaW5jOwotICAgICAgICAgICAgICAgaWYgKG0gPT0gMSkKLSAgICAgICAgICAgICAgICAgIG0gPSAweDgwOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgbSA+Pj0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHBuZ19wdHItPnJvd19idWYgKyAxOwotICAgICAgICAgICAgcG5nX2J5dGVwIGRwID0gcm93OwotICAgICAgICAgICAgcG5nX3NpemVfdCBwaXhlbF9ieXRlcyA9IChwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCA+PiAzKTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSBwbmdfcHRyLT53aWR0aDsKLSAgICAgICAgICAgIHBuZ19ieXRlIG0gPSAweDgwOwotCi0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChtICYgbWFzaykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ19tZW1jcHkoZHAsIHNwLCBwaXhlbF9ieXRlcyk7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIHNwICs9IHBpeGVsX2J5dGVzOwotICAgICAgICAgICAgICAgZHAgKz0gcGl4ZWxfYnl0ZXM7Ci0KLSAgICAgICAgICAgICAgIGlmIChtID09IDEpCi0gICAgICAgICAgICAgICAgICBtID0gMHg4MDsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIG0gPj49IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLX0KLQotI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotLyogT0xEIHByZS0xLjAuOSBpbnRlcmZhY2U6Ci12b2lkIHBuZ19kb19yZWFkX2ludGVybGFjZShwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBpbnQgcGFzcywKLSAgIHBuZ191aW50XzMyIHRyYW5zZm9ybWF0aW9ucykKLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fcmVhZF9pbnRlcmxhY2UocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19yb3dfaW5mb3Agcm93X2luZm8gPSAmKHBuZ19wdHItPnJvd19pbmZvKTsKLSAgIHBuZ19ieXRlcCByb3cgPSBwbmdfcHRyLT5yb3dfYnVmICsgMTsKLSAgIGludCBwYXNzID0gcG5nX3B0ci0+cGFzczsKLSAgIHBuZ191aW50XzMyIHRyYW5zZm9ybWF0aW9ucyA9IHBuZ19wdHItPnRyYW5zZm9ybWF0aW9uczsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8KLSAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLwotICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc19pbmNbN10gPSB7OCwgOCwgNCwgNCwgMiwgMiwgMX07Ci0jZW5kaWYKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fcmVhZF9pbnRlcmxhY2UiKTsKLSAgIGlmIChyb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMKQotICAgewotICAgICAgcG5nX3VpbnRfMzIgZmluYWxfd2lkdGg7Ci0KLSAgICAgIGZpbmFsX3dpZHRoID0gcm93X2luZm8tPndpZHRoICogcG5nX3Bhc3NfaW5jW3Bhc3NdOwotCi0gICAgICBzd2l0Y2ggKHJvd19pbmZvLT5waXhlbF9kZXB0aCkKLSAgICAgIHsKLSAgICAgICAgIGNhc2UgMToKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X2luZm8tPndpZHRoIC0gMSkgPj4gMyk7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkoKGZpbmFsX3dpZHRoIC0gMSkgPj4gMyk7Ci0gICAgICAgICAgICBpbnQgc3NoaWZ0LCBkc2hpZnQ7Ci0gICAgICAgICAgICBpbnQgc19zdGFydCwgc19lbmQsIHNfaW5jOwotICAgICAgICAgICAgaW50IGpzdG9wID0gcG5nX3Bhc3NfaW5jW3Bhc3NdOwotICAgICAgICAgICAgcG5nX2J5dGUgdjsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBpbnQgajsKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKQotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc2hpZnQgPSAoaW50KSgocm93X2luZm8tPndpZHRoICsgNykgJiAweDA3KTsKLSAgICAgICAgICAgICAgICBkc2hpZnQgPSAoaW50KSgoZmluYWxfd2lkdGggKyA3KSAmIDB4MDcpOwotICAgICAgICAgICAgICAgIHNfc3RhcnQgPSA3OwotICAgICAgICAgICAgICAgIHNfZW5kID0gMDsKLSAgICAgICAgICAgICAgICBzX2luYyA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3NoaWZ0ID0gNyAtIChpbnQpKChyb3dfaW5mby0+d2lkdGggKyA3KSAmIDB4MDcpOwotICAgICAgICAgICAgICAgIGRzaGlmdCA9IDcgLSAoaW50KSgoZmluYWxfd2lkdGggKyA3KSAmIDB4MDcpOwotICAgICAgICAgICAgICAgIHNfc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIHNfZW5kID0gNzsKLSAgICAgICAgICAgICAgICBzX2luYyA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfaW5mby0+d2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHYgPSAocG5nX2J5dGUpKCgqc3AgPj4gc3NoaWZ0KSAmIDB4MDEpOwotICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGpzdG9wOyBqKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAqZHAgJj0gKHBuZ19ieXRlKSgoMHg3ZjdmID4+ICg3IC0gZHNoaWZ0KSkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICpkcCB8PSAocG5nX2J5dGUpKHYgPDwgZHNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgIGlmIChkc2hpZnQgPT0gc19lbmQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBkc2hpZnQgPSBzX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgZHAtLTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCArPSBzX2luYzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGlmIChzc2hpZnQgPT0gc19lbmQpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzc2hpZnQgPSBzX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNzaGlmdCArPSBzX2luYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSAyOgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ191aW50XzMyKSgocm93X2luZm8tPndpZHRoIC0gMSkgPj4gMik7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3VpbnRfMzIpKChmaW5hbF93aWR0aCAtIDEpID4+IDIpOwotICAgICAgICAgICAgaW50IHNzaGlmdCwgZHNoaWZ0OwotICAgICAgICAgICAgaW50IHNfc3RhcnQsIHNfZW5kLCBzX2luYzsKLSAgICAgICAgICAgIGludCBqc3RvcCA9IHBuZ19wYXNzX2luY1twYXNzXTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCkKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbnMgJiBQTkdfUEFDS1NXQVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzc2hpZnQgPSAoaW50KSgoKHJvd19pbmZvLT53aWR0aCArIDMpICYgMHgwMykgPDwgMSk7Ci0gICAgICAgICAgICAgICBkc2hpZnQgPSAoaW50KSgoKGZpbmFsX3dpZHRoICsgMykgJiAweDAzKSA8PCAxKTsKLSAgICAgICAgICAgICAgIHNfc3RhcnQgPSA2OwotICAgICAgICAgICAgICAgc19lbmQgPSAwOwotICAgICAgICAgICAgICAgc19pbmMgPSAtMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3NoaWZ0ID0gKGludCkoKDMgLSAoKHJvd19pbmZvLT53aWR0aCArIDMpICYgMHgwMykpIDw8IDEpOwotICAgICAgICAgICAgICAgZHNoaWZ0ID0gKGludCkoKDMgLSAoKGZpbmFsX3dpZHRoICsgMykgJiAweDAzKSkgPDwgMSk7Ci0gICAgICAgICAgICAgICBzX3N0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgIHNfZW5kID0gNjsKLSAgICAgICAgICAgICAgIHNfaW5jID0gMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd19pbmZvLT53aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgdjsKLSAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICB2ID0gKHBuZ19ieXRlKSgoKnNwID4+IHNzaGlmdCkgJiAweDAzKTsKLSAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqc3RvcDsgaisrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKmRwICY9IChwbmdfYnl0ZSkoKDB4M2YzZiA+PiAoNiAtIGRzaGlmdCkpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAqZHAgfD0gKHBuZ19ieXRlKSh2IDw8IGRzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICBpZiAoZHNoaWZ0ID09IHNfZW5kKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgZHNoaWZ0ID0gc19zdGFydDsKLSAgICAgICAgICAgICAgICAgICAgIGRwLS07Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICBkc2hpZnQgKz0gc19pbmM7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBpZiAoc3NoaWZ0ID09IHNfZW5kKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3NoaWZ0ID0gc19zdGFydDsKLSAgICAgICAgICAgICAgICAgIHNwLS07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzc2hpZnQgKz0gc19pbmM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCA9IHJvdyArIChwbmdfc2l6ZV90KSgocm93X2luZm8tPndpZHRoIC0gMSkgPj4gMSk7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkoKGZpbmFsX3dpZHRoIC0gMSkgPj4gMSk7Ci0gICAgICAgICAgICBpbnQgc3NoaWZ0LCBkc2hpZnQ7Ci0gICAgICAgICAgICBpbnQgc19zdGFydCwgc19lbmQsIHNfaW5jOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIGludCBqc3RvcCA9IHBuZ19wYXNzX2luY1twYXNzXTsKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKQotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNzaGlmdCA9IChpbnQpKCgocm93X2luZm8tPndpZHRoICsgMSkgJiAweDAxKSA8PCAyKTsKLSAgICAgICAgICAgICAgIGRzaGlmdCA9IChpbnQpKCgoZmluYWxfd2lkdGggKyAxKSAmIDB4MDEpIDw8IDIpOwotICAgICAgICAgICAgICAgc19zdGFydCA9IDQ7Ci0gICAgICAgICAgICAgICBzX2VuZCA9IDA7Ci0gICAgICAgICAgICAgICBzX2luYyA9IC00OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzc2hpZnQgPSAoaW50KSgoMSAtICgocm93X2luZm8tPndpZHRoICsgMSkgJiAweDAxKSkgPDwgMik7Ci0gICAgICAgICAgICAgICBkc2hpZnQgPSAoaW50KSgoMSAtICgoZmluYWxfd2lkdGggKyAxKSAmIDB4MDEpKSA8PCAyKTsKLSAgICAgICAgICAgICAgIHNfc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgc19lbmQgPSA0OwotICAgICAgICAgICAgICAgc19pbmMgPSA0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X2luZm8tPndpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZSB2ID0gKHBuZ19ieXRlKSgoKnNwID4+IHNzaGlmdCkgJiAweGYpOwotICAgICAgICAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqc3RvcDsgaisrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKmRwICY9IChwbmdfYnl0ZSkoKDB4ZjBmID4+ICg0IC0gZHNoaWZ0KSkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICpkcCB8PSAocG5nX2J5dGUpKHYgPDwgZHNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgIGlmIChkc2hpZnQgPT0gc19lbmQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBkc2hpZnQgPSBzX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgZHAtLTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIGRzaGlmdCArPSBzX2luYzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGlmIChzc2hpZnQgPT0gc19lbmQpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzc2hpZnQgPSBzX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgc3AtLTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNzaGlmdCArPSBzX2luYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19zaXplX3QgcGl4ZWxfYnl0ZXMgPSAocm93X2luZm8tPnBpeGVsX2RlcHRoID4+IDMpOwotICAgICAgICAgICAgcG5nX2J5dGVwIHNwID0gcm93ICsgKHBuZ19zaXplX3QpKHJvd19pbmZvLT53aWR0aCAtIDEpICogcGl4ZWxfYnl0ZXM7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHAgPSByb3cgKyAocG5nX3NpemVfdCkoZmluYWxfd2lkdGggLSAxKSAqIHBpeGVsX2J5dGVzOwotCi0gICAgICAgICAgICBpbnQganN0b3AgPSBwbmdfcGFzc19pbmNbcGFzc107Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X2luZm8tPndpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZSB2WzhdOwotICAgICAgICAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgICAgICAgIHBuZ19tZW1jcHkodiwgc3AsIHBpeGVsX2J5dGVzKTsKLSAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBqc3RvcDsgaisrKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX21lbWNweShkcCwgdiwgcGl4ZWxfYnl0ZXMpOwotICAgICAgICAgICAgICAgICAgZHAgLT0gcGl4ZWxfYnl0ZXM7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBzcCAtPSBwaXhlbF9ieXRlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgcm93X2luZm8tPndpZHRoID0gZmluYWxfd2lkdGg7Ci0gICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLCBmaW5hbF93aWR0aCk7Ci0gICB9Ci0jaWYgIWRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKQotICAgdHJhbnNmb3JtYXRpb25zID0gdHJhbnNmb3JtYXRpb25zOyAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgKi8KLSNlbmRpZgotfQotI2VuZGlmIC8qIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCAqLwotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19yZWFkX2ZpbHRlcl9yb3cocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywKLSAgIHBuZ19ieXRlcCBwcmV2X3JvdywgaW50IGZpbHRlcikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfZmlsdGVyX3JvdyIpOwotICAgcG5nX2RlYnVnMigyLCAicm93ID0gJWx1LCBmaWx0ZXIgPSAlZCIsIHBuZ19wdHItPnJvd19udW1iZXIsIGZpbHRlcik7Ci0gICBzd2l0Y2ggKGZpbHRlcikKLSAgIHsKLSAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9OT05FOgotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfU1VCOgotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOwotICAgICAgICAgcG5nX3VpbnRfMzIgYnBwID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCArIDcpID4+IDM7Ci0gICAgICAgICBwbmdfYnl0ZXAgcnAgPSByb3cgKyBicHA7Ci0gICAgICAgICBwbmdfYnl0ZXAgbHAgPSByb3c7Ci0KLSAgICAgICAgIGZvciAoaSA9IGJwcDsgaSA8IGlzdG9wOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICAqcnAgPSAocG5nX2J5dGUpKCgoaW50KSgqcnApICsgKGludCkoKmxwKyspKSAmIDB4ZmYpOwotICAgICAgICAgICAgcnArKzsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX1VQOgotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOwotICAgICAgICAgcG5nX2J5dGVwIHJwID0gcm93OwotICAgICAgICAgcG5nX2J5dGVwIHBwID0gcHJldl9yb3c7Ci0KLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSgoKGludCkoKnJwKSArIChpbnQpKCpwcCsrKSkgJiAweGZmKTsKLSAgICAgICAgICAgIHJwKys7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9BVkc6Ci0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgcG5nX2J5dGVwIHJwID0gcm93OwotICAgICAgICAgcG5nX2J5dGVwIHBwID0gcHJldl9yb3c7Ci0gICAgICAgICBwbmdfYnl0ZXAgbHAgPSByb3c7Ci0gICAgICAgICBwbmdfdWludF8zMiBicHAgPSAocm93X2luZm8tPnBpeGVsX2RlcHRoICsgNykgPj4gMzsKLSAgICAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzIC0gYnBwOwotCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnBwOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICAqcnAgPSAocG5nX2J5dGUpKCgoaW50KSgqcnApICsKLSAgICAgICAgICAgICAgICgoaW50KSgqcHArKykgLyAyICkpICYgMHhmZik7Ci0gICAgICAgICAgICBycCsrOwotICAgICAgICAgfQotCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgICpycCA9IChwbmdfYnl0ZSkoKChpbnQpKCpycCkgKwotICAgICAgICAgICAgICAgKGludCkoKnBwKysgKyAqbHArKykgLyAyICkgJiAweGZmKTsKLSAgICAgICAgICAgIHJwKys7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSDoKLSAgICAgIHsKLSAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICBwbmdfYnl0ZXAgcnAgPSByb3c7Ci0gICAgICAgICBwbmdfYnl0ZXAgcHAgPSBwcmV2X3JvdzsKLSAgICAgICAgIHBuZ19ieXRlcCBscCA9IHJvdzsKLSAgICAgICAgIHBuZ19ieXRlcCBjcCA9IHByZXZfcm93OwotICAgICAgICAgcG5nX3VpbnRfMzIgYnBwID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCArIDcpID4+IDM7Ci0gICAgICAgICBwbmdfdWludF8zMiBpc3RvcD1yb3dfaW5mby0+cm93Ynl0ZXMgLSBicHA7Ci0KLSAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBicHA7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgICpycCA9IChwbmdfYnl0ZSkoKChpbnQpKCpycCkgKyAoaW50KSgqcHArKykpICYgMHhmZik7Ci0gICAgICAgICAgICBycCsrOwotICAgICAgICAgfQotCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKykgICAvKiBVc2UgbGVmdG92ZXIgcnAscHAgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBhLCBiLCBjLCBwYSwgcGIsIHBjLCBwOwotCi0gICAgICAgICAgICBhID0gKmxwKys7Ci0gICAgICAgICAgICBiID0gKnBwKys7Ci0gICAgICAgICAgICBjID0gKmNwKys7Ci0KLSAgICAgICAgICAgIHAgPSBiIC0gYzsKLSAgICAgICAgICAgIHBjID0gYSAtIGM7Ci0KLSNpZmRlZiBQTkdfVVNFX0FCUwotICAgICAgICAgICAgcGEgPSBhYnMocCk7Ci0gICAgICAgICAgICBwYiA9IGFicyhwYyk7Ci0gICAgICAgICAgICBwYyA9IGFicyhwICsgcGMpOwotI2Vsc2UKLSAgICAgICAgICAgIHBhID0gcCA8IDAgPyAtcCA6IHA7Ci0gICAgICAgICAgICBwYiA9IHBjIDwgMCA/IC1wYyA6IHBjOwotICAgICAgICAgICAgcGMgPSAocCArIHBjKSA8IDAgPyAtKHAgKyBwYykgOiBwICsgcGM7Ci0jZW5kaWYKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgIGlmIChwYSA8PSBwYiAmJiBwYSA8PSBwYykKLSAgICAgICAgICAgICAgICAgIHAgPSBhOwotICAgICAgICAgICAgICAgZWxzZSBpZiAocGIgPD0gcGMpCi0gICAgICAgICAgICAgICAgICBwID0gYjsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHAgPSBjOwotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIHAgPSAocGEgPD0gcGIgJiYgcGEgPD0gcGMpID8gYSA6IChwYiA8PSBwYykgPyBiIDogYzsKLQotICAgICAgICAgICAgKnJwID0gKHBuZ19ieXRlKSgoKGludCkoKnJwKSArIHApICYgMHhmZik7Ci0gICAgICAgICAgICBycCsrOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIklnbm9yaW5nIGJhZCBhZGFwdGl2ZSBmaWx0ZXIgdHlwZSIpOwotICAgICAgICAgKnJvdyA9IDA7Ci0gICAgICAgICBicmVhazsKLSAgIH0KLX0KLQotI2lmbmRlZiBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfcmVhZF9maW5pc2hfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgIC8qIEFycmF5cyB0byBmYWNpbGl0YXRlIGVhc3kgaW50ZXJsYWNpbmcgLSB1c2UgcGFzcyAoMCAtIDYpIGFzIGluZGV4ICovCi0KLSAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayAqLwotICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsKLQotICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovCi0gICBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKLQotICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLwotICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc195c3RhcnRbN10gPSB7MCwgMCwgNCwgMCwgMiwgMCwgMX07Ci0KLSAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KLSAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3NfeWluY1s3XSA9IHs4LCA4LCA4LCA0LCA0LCAyLCAyfTsKLSNlbmRpZiAvKiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgKi8KLSNlbmRpZgotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19yZWFkX2ZpbmlzaF9yb3ciKTsKLSAgIHBuZ19wdHItPnJvd19udW1iZXIrKzsKLSAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyIDwgcG5nX3B0ci0+bnVtX3Jvd3MpCi0gICAgICByZXR1cm47Ci0KLSNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkKQotICAgewotICAgICAgcG5nX3B0ci0+cm93X251bWJlciA9IDA7Ci0gICAgICBwbmdfbWVtc2V0X2NoZWNrKHBuZ19wdHIsIHBuZ19wdHItPnByZXZfcm93LCAwLAotICAgICAgICAgcG5nX3B0ci0+cm93Ynl0ZXMgKyAxKTsKLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5wYXNzKys7Ci0gICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA+PSA3KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBwbmdfcHRyLT5pd2lkdGggPSAocG5nX3B0ci0+d2lkdGggKwotICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtCi0gICAgICAgICAgICBwbmdfcGFzc19zdGFydFtwbmdfcHRyLT5wYXNzXSkgLwotICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdOwotCi0gICAgICAgICBwbmdfcHRyLT5pcm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocG5nX3B0ci0+cGl4ZWxfZGVwdGgsCi0gICAgICAgICAgICBwbmdfcHRyLT5pd2lkdGgpICsgMTsKLQotICAgICAgICAgaWYgKCEocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IChwbmdfcHRyLT5oZWlnaHQgKwotICAgICAgICAgICAgICAgcG5nX3Bhc3NfeWluY1twbmdfcHRyLT5wYXNzXSAtIDEgLQotICAgICAgICAgICAgICAgcG5nX3Bhc3NfeXN0YXJ0W3BuZ19wdHItPnBhc3NdKSAvCi0gICAgICAgICAgICAgICBwbmdfcGFzc195aW5jW3BuZ19wdHItPnBhc3NdOwotICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+bnVtX3Jvd3MpKQotICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlICAvKiBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0lOVEVSTEFDRSkgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgfSB3aGlsZSAocG5nX3B0ci0+aXdpZHRoID09IDApOwotCi0gICAgICBpZiAocG5nX3B0ci0+cGFzcyA8IDcpCi0gICAgICAgICByZXR1cm47Ci0gICB9Ci0jZW5kaWYgLyogUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEICovCi0KLSAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWkxJQl9GSU5JU0hFRCkpCi0gICB7Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgICAgIFBOR19DT05TVCBQTkdfSURBVDsKLSNlbmRpZgotICAgICAgY2hhciBleHRyYTsKLSAgICAgIGludCByZXQ7Ci0KLSAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSAqKSZleHRyYTsKLSAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpMTsKLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlICghcG5nX3B0ci0+aWRhdF9zaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgY2h1bmtfbGVuZ3RoWzRdOwotCi0gICAgICAgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCAwKTsKLQotICAgICAgICAgICAgICAgcG5nX3JlYWRfZGF0YShwbmdfcHRyLCBjaHVua19sZW5ndGgsIDQpOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+aWRhdF9zaXplID0gcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGNodW5rX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICBwbmdfcmVzZXRfY3JjKHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcG5nX2NyY19yZWFkKHBuZ19wdHIsIHBuZ19wdHItPmNodW5rX25hbWUsIDQpOwotICAgICAgICAgICAgICAgaWYgKHBuZ19tZW1jbXAocG5nX3B0ci0+Y2h1bmtfbmFtZSwgcG5nX0lEQVQsIDQpKQotICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJOb3QgZW5vdWdoIGltYWdlIGRhdGEiKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKLSAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9pbiA9IHBuZ19wdHItPnpidWY7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+emJ1Zl9zaXplID4gcG5nX3B0ci0+aWRhdF9zaXplKQotICAgICAgICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXBuZ19wdHItPmlkYXRfc2l6ZTsKLSAgICAgICAgICAgIHBuZ19jcmNfcmVhZChwbmdfcHRyLCBwbmdfcHRyLT56YnVmLCBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luKTsKLSAgICAgICAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSAtPSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luOwotICAgICAgICAgfQotICAgICAgICAgcmV0ID0gaW5mbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9QQVJUSUFMX0ZMVVNIKTsKLSAgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpIHx8IHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4gfHwKLSAgICAgICAgICAgICAgIHBuZ19wdHItPmlkYXRfc2l6ZSkKLSAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJFeHRyYSBjb21wcmVzc2VkIGRhdGEiKTsKLSAgICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7Ci0gICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0ZJTklTSEVEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgcG5nX3B0ci0+enN0cmVhbS5tc2cgPyBwbmdfcHRyLT56c3RyZWFtLm1zZyA6Ci0gICAgICAgICAgICAgICAgICAgICAgIkRlY29tcHJlc3Npb24gRXJyb3IiKTsKLQotICAgICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkV4dHJhIGNvbXByZXNzZWQgZGF0YS4iKTsKLSAgICAgICAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0FGVEVSX0lEQVQ7Ci0gICAgICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0ZJTklTSEVEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gMDsKLSAgIH0KLQotICAgaWYgKHBuZ19wdHItPmlkYXRfc2l6ZSB8fCBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkV4dHJhIGNvbXByZXNzaW9uIGRhdGEiKTsKLQotICAgaW5mbGF0ZVJlc2V0KCZwbmdfcHRyLT56c3RyZWFtKTsKLQotICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKLX0KLSNlbmRpZiAvKiBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCAqLwotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19yZWFkX3N0YXJ0X3Jvdyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCi0jaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECi0gICAvKiBBcnJheXMgdG8gZmFjaWxpdGF0ZSBlYXN5IGludGVybGFjaW5nIC0gdXNlIHBhc3MgKDAgLSA2KSBhcyBpbmRleCAqLwotCi0gICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgKi8KLSAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3Nfc3RhcnRbN10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07Ci0KLSAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLwotICAgUE5HX0NPTlNUIGludCBwbmdfcGFzc19pbmNbN10gPSB7OCwgOCwgNCwgNCwgMiwgMiwgMX07Ci0KLSAgIC8qIFN0YXJ0IG9mIGludGVybGFjZSBibG9jayBpbiB0aGUgeSBkaXJlY3Rpb24gKi8KLSAgIFBOR19DT05TVCBpbnQgcG5nX3Bhc3NfeXN0YXJ0WzddID0gezAsIDAsIDQsIDAsIDIsIDAsIDF9OwotCi0gICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCi0gICBQTkdfQ09OU1QgaW50IHBuZ19wYXNzX3lpbmNbN10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07Ci0jZW5kaWYKLSNlbmRpZgotCi0gICBpbnQgbWF4X3BpeGVsX2RlcHRoOwotICAgcG5nX3NpemVfdCByb3dfYnl0ZXM7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3JlYWRfc3RhcnRfcm93Iik7Ci0gICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gMDsKLSAgIHBuZ19pbml0X3JlYWRfdHJhbnNmb3JtYXRpb25zKHBuZ19wdHIpOwotI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQpCi0gICB7Ci0gICAgICBpZiAoIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSkKLSAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gKHBuZ19wdHItPmhlaWdodCArIHBuZ19wYXNzX3lpbmNbMF0gLSAxIC0KLSAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFswXSkgLyBwbmdfcGFzc195aW5jWzBdOwotICAgICAgZWxzZQotICAgICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSBwbmdfcHRyLT5oZWlnaHQ7Ci0KLSAgICAgIHBuZ19wdHItPml3aWR0aCA9IChwbmdfcHRyLT53aWR0aCArCi0gICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0KLSAgICAgICAgIHBuZ19wYXNzX3N0YXJ0W3BuZ19wdHItPnBhc3NdKSAvCi0gICAgICAgICBwbmdfcGFzc19pbmNbcG5nX3B0ci0+cGFzc107Ci0KLSAgICAgICAgIHBuZ19wdHItPmlyb3dieXRlcyA9Ci0gICAgICAgICAgICBQTkdfUk9XQllURVMocG5nX3B0ci0+cGl4ZWxfZGVwdGgsIHBuZ19wdHItPml3aWR0aCkgKyAxOwotICAgfQotICAgZWxzZQotI2VuZGlmIC8qIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCAqLwotICAgewotICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSBwbmdfcHRyLT5oZWlnaHQ7Ci0gICAgICBwbmdfcHRyLT5pd2lkdGggPSBwbmdfcHRyLT53aWR0aDsKLSAgICAgIHBuZ19wdHItPmlyb3dieXRlcyA9IHBuZ19wdHItPnJvd2J5dGVzICsgMTsKLSAgIH0KLSAgIG1heF9waXhlbF9kZXB0aCA9IHBuZ19wdHItPnBpeGVsX2RlcHRoOwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRCkKLSAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0spICYmIHBuZ19wdHItPmJpdF9kZXB0aCA8IDgpCi0gICAgICBtYXhfcGl4ZWxfZGVwdGggPSA4OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkKLSAgIHsKLSAgICAgIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICB7Ci0gICAgICAgICBpZiAocG5nX3B0ci0+bnVtX3RyYW5zKQotICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMzI7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAyNDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChtYXhfcGl4ZWxfZGVwdGggPCA4KQotICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gODsKLSAgICAgICAgIGlmIChwbmdfcHRyLT5udW1fdHJhbnMpCi0gICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggKj0gMjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgewotICAgICAgICAgaWYgKHBuZ19wdHItPm51bV90cmFucykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCAqPSA0OwotICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoIC89IDM7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0ZJTExFUikpCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMzI7Ci0gICAgICBlbHNlIGlmIChwbmdfcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCi0gICAgICB7Ci0gICAgICAgICBpZiAobWF4X3BpeGVsX2RlcHRoIDw9IDgpCi0gICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAxNjsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgICB7Ci0gICAgICAgICBpZiAobWF4X3BpeGVsX2RlcHRoIDw9IDMyKQotICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gMzI7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA2NDsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0dSQVlfVE9fUkdCKQotICAgewotICAgICAgaWYgKAotI2lmIGRlZmluZWQoUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCkKLSAgICAgICAgKHBuZ19wdHItPm51bV90cmFucyAmJiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0VYUEFORCkpIHx8Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQpCi0gICAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiAoUE5HX0ZJTExFUikpIHx8Ci0jZW5kaWYKLSAgICAgICAgcG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgewotICAgICAgICAgaWYgKG1heF9waXhlbF9kZXB0aCA8PSAxNikKLSAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDMyOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgbWF4X3BpeGVsX2RlcHRoID0gNjQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpZiAobWF4X3BpeGVsX2RlcHRoIDw9IDgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAzMjsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSAyNDsKLSAgICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICAgICAgICBtYXhfcGl4ZWxfZGVwdGggPSA2NDsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1heF9waXhlbF9kZXB0aCA9IDQ4OwotICAgICAgfQotICAgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkgJiYgXAotZGVmaW5lZChQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfVVNFUl9UUkFOU0ZPUk0pCi0gICAgIHsKLSAgICAgICBpbnQgdXNlcl9waXhlbF9kZXB0aCA9IHBuZ19wdHItPnVzZXJfdHJhbnNmb3JtX2RlcHRoKgotICAgICAgICAgcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7Ci0gICAgICAgaWYgKHVzZXJfcGl4ZWxfZGVwdGggPiBtYXhfcGl4ZWxfZGVwdGgpCi0gICAgICAgICBtYXhfcGl4ZWxfZGVwdGg9dXNlcl9waXhlbF9kZXB0aDsKLSAgICAgfQotI2VuZGlmCi0KLSAgIC8qIEFsaWduIHRoZSB3aWR0aCBvbiB0aGUgbmV4dCBsYXJnZXIgOCBwaXhlbHMuICBNYWlubHkgdXNlZAotICAgICogZm9yIGludGVybGFjaW5nCi0gICAgKi8KLSAgIHJvd19ieXRlcyA9ICgocG5nX3B0ci0+d2lkdGggKyA3KSAmIH4oKHBuZ191aW50XzMyKTcpKTsKLSAgIC8qIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBieXRlcyBuZWVkZWQsIGFkZGluZyBhIGJ5dGUgYW5kIGEgcGl4ZWwKLSAgICAqIGZvciBzYWZldHkncyBzYWtlCi0gICAgKi8KLSAgIHJvd19ieXRlcyA9IFBOR19ST1dCWVRFUyhtYXhfcGl4ZWxfZGVwdGgsIHJvd19ieXRlcykgKwotICAgICAgMSArICgobWF4X3BpeGVsX2RlcHRoICsgNykgPj4gMyk7Ci0jaWZkZWYgUE5HX01BWF9NQUxMT0NfNjRLCi0gICBpZiAocm93X2J5dGVzID4gKHBuZ191aW50XzMyKTY1NTM2TCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVGhpcyBpbWFnZSByZXF1aXJlcyBhIHJvdyBncmVhdGVyIHRoYW4gNjRLQiIpOwotI2VuZGlmCi0KLSAgIGlmIChyb3dfYnl0ZXMgKyA2NCA+IHBuZ19wdHItPm9sZF9iaWdfcm93X2J1Zl9zaXplKQotICAgewotICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5iaWdfcm93X2J1Zik7Ci0gICAgIHBuZ19wdHItPmJpZ19yb3dfYnVmID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsIHJvd19ieXRlcyArIDY0KTsKLSAgICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQpCi0gICAgICAgcG5nX21lbXNldChwbmdfcHRyLT5iaWdfcm93X2J1ZiwgMCwgcm93X2J5dGVzICsgNjQpOwotICAgICBwbmdfcHRyLT5yb3dfYnVmID0gcG5nX3B0ci0+YmlnX3Jvd19idWYgKyAzMjsKLSAgICAgcG5nX3B0ci0+b2xkX2JpZ19yb3dfYnVmX3NpemUgPSByb3dfYnl0ZXMgKyA2NDsKLSAgIH0KLQotI2lmZGVmIFBOR19NQVhfTUFMTE9DXzY0SwotICAgaWYgKChwbmdfdWludF8zMilyb3dfYnl0ZXMgKyAxID4gKHBuZ191aW50XzMyKTY1NTM2TCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVGhpcyBpbWFnZSByZXF1aXJlcyBhIHJvdyBncmVhdGVyIHRoYW4gNjRLQiIpOwotI2VuZGlmCi0gICBpZiAoKHBuZ191aW50XzMyKXJvd19ieXRlcyA+IChwbmdfdWludF8zMikoUE5HX1NJWkVfTUFYIC0gMSkpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlJvdyBoYXMgdG9vIG1hbnkgYnl0ZXMgdG8gYWxsb2NhdGUgaW4gbWVtb3J5LiIpOwotCi0gICBpZiAocm93X2J5dGVzICsgMSA+IHBuZ19wdHItPm9sZF9wcmV2X3Jvd19zaXplKQotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cHJldl9yb3cpOwotICAgICAgcG5nX3B0ci0+cHJldl9yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwgKHBuZ191aW50XzMyKSgKLSAgICAgICAgcm93X2J5dGVzICsgMSkpOwotICAgICAgcG5nX21lbXNldF9jaGVjayhwbmdfcHRyLCBwbmdfcHRyLT5wcmV2X3JvdywgMCwgcm93X2J5dGVzICsgMSk7Ci0gICAgICBwbmdfcHRyLT5vbGRfcHJldl9yb3dfc2l6ZSA9IHJvd19ieXRlcyArIDE7Ci0gICB9Ci0KLSAgIHBuZ19wdHItPnJvd2J5dGVzID0gcm93X2J5dGVzOwotCi0gICBwbmdfZGVidWcxKDMsICJ3aWR0aCA9ICVsdSwiLCBwbmdfcHRyLT53aWR0aCk7Ci0gICBwbmdfZGVidWcxKDMsICJoZWlnaHQgPSAlbHUsIiwgcG5nX3B0ci0+aGVpZ2h0KTsKLSAgIHBuZ19kZWJ1ZzEoMywgIml3aWR0aCA9ICVsdSwiLCBwbmdfcHRyLT5pd2lkdGgpOwotICAgcG5nX2RlYnVnMSgzLCAibnVtX3Jvd3MgPSAlbHUsIiwgcG5nX3B0ci0+bnVtX3Jvd3MpOwotICAgcG5nX2RlYnVnMSgzLCAicm93Ynl0ZXMgPSAlbHUsIiwgcG5nX3B0ci0+cm93Ynl0ZXMpOwotICAgcG5nX2RlYnVnMSgzLCAiaXJvd2J5dGVzID0gJWx1IiwgcG5nX3B0ci0+aXJvd2J5dGVzKTsKLQotICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfUk9XX0lOSVQ7Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wbmdzZXQuYyBiL2xpYnMvbGlicG5nL3BuZ3NldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTY4YTJkLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3BuZ3NldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1NSArMCwwIEBACi0KLS8qIHBuZ3NldC5jIC0gc3RvcmFnZSBvZiBpbWFnZSBpbmZvcm1hdGlvbiBpbnRvIGluZm8gc3RydWN0Ci0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuMzcgW0p1bmUgNCwgMjAwOV0KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGUgZnVuY3Rpb25zIGhlcmUgYXJlIHVzZWQgZHVyaW5nIHJlYWRzIHRvIHN0b3JlIGRhdGEgZnJvbSB0aGUgZmlsZQotICogaW50byB0aGUgaW5mbyBzdHJ1Y3QsIGFuZCBkdXJpbmcgd3JpdGVzIHRvIHN0b3JlIGFwcGxpY2F0aW9uIGRhdGEKLSAqIGludG8gdGhlIGluZm8gc3RydWN0IGZvciB3cml0aW5nIGludG8gdGhlIGZpbGUuICBUaGlzIGFic3RyYWN0cyB0aGUKLSAqIGluZm8gc3RydWN0IGFuZCBhbGxvd3MgdXMgdG8gY2hhbmdlIHRoZSBzdHJ1Y3R1cmUgaW4gdGhlIGZ1dHVyZS4KLSAqLwotCi0jZGVmaW5lIFBOR19JTlRFUk5BTAotI2luY2x1ZGUgInBuZy5oIgotI2lmIGRlZmluZWQoUE5HX1JFQURfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TVVBQT1JURUQpCi0KLSNpZiBkZWZpbmVkKFBOR19iS0dEX1NVUFBPUlRFRCkKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2JLR0QocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfY29sb3JfMTZwIGJhY2tncm91bmQpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgImJLR0QiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX21lbWNweSgmKGluZm9fcHRyLT5iYWNrZ3JvdW5kKSwgYmFja2dyb3VuZCwgcG5nX3NpemVvZihwbmdfY29sb3JfMTYpKTsKLSAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19iS0dEOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19jSFJNX1NVUFBPUlRFRCkKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9jSFJNKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIGRvdWJsZSB3aGl0ZV94LCBkb3VibGUgd2hpdGVfeSwgZG91YmxlIHJlZF94LCBkb3VibGUgcmVkX3ksCi0gICBkb3VibGUgZ3JlZW5feCwgZG91YmxlIGdyZWVuX3ksIGRvdWJsZSBibHVlX3gsIGRvdWJsZSBibHVlX3kpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgImNIUk0iKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgaW5mb19wdHItPnhfd2hpdGUgPSAoZmxvYXQpd2hpdGVfeDsKLSAgIGluZm9fcHRyLT55X3doaXRlID0gKGZsb2F0KXdoaXRlX3k7Ci0gICBpbmZvX3B0ci0+eF9yZWQgICA9IChmbG9hdClyZWRfeDsKLSAgIGluZm9fcHRyLT55X3JlZCAgID0gKGZsb2F0KXJlZF95OwotICAgaW5mb19wdHItPnhfZ3JlZW4gPSAoZmxvYXQpZ3JlZW5feDsKLSAgIGluZm9fcHRyLT55X2dyZWVuID0gKGZsb2F0KWdyZWVuX3k7Ci0gICBpbmZvX3B0ci0+eF9ibHVlICA9IChmbG9hdClibHVlX3g7Ci0gICBpbmZvX3B0ci0+eV9ibHVlICA9IChmbG9hdClibHVlX3k7Ci0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgaW5mb19wdHItPmludF94X3doaXRlID0gKHBuZ19maXhlZF9wb2ludCkod2hpdGVfeCoxMDAwMDAuKzAuNSk7Ci0gICBpbmZvX3B0ci0+aW50X3lfd2hpdGUgPSAocG5nX2ZpeGVkX3BvaW50KSh3aGl0ZV95KjEwMDAwMC4rMC41KTsKLSAgIGluZm9fcHRyLT5pbnRfeF9yZWQgICA9IChwbmdfZml4ZWRfcG9pbnQpKCAgcmVkX3gqMTAwMDAwLiswLjUpOwotICAgaW5mb19wdHItPmludF95X3JlZCAgID0gKHBuZ19maXhlZF9wb2ludCkoICByZWRfeSoxMDAwMDAuKzAuNSk7Ci0gICBpbmZvX3B0ci0+aW50X3hfZ3JlZW4gPSAocG5nX2ZpeGVkX3BvaW50KShncmVlbl94KjEwMDAwMC4rMC41KTsKLSAgIGluZm9fcHRyLT5pbnRfeV9ncmVlbiA9IChwbmdfZml4ZWRfcG9pbnQpKGdyZWVuX3kqMTAwMDAwLiswLjUpOwotICAgaW5mb19wdHItPmludF94X2JsdWUgID0gKHBuZ19maXhlZF9wb2ludCkoIGJsdWVfeCoxMDAwMDAuKzAuNSk7Ci0gICBpbmZvX3B0ci0+aW50X3lfYmx1ZSAgPSAocG5nX2ZpeGVkX3BvaW50KSggYmx1ZV95KjEwMDAwMC4rMC41KTsKLSNlbmRpZgotICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2NIUk07Ci19Ci0jZW5kaWYgLyogUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfY0hSTV9maXhlZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfZml4ZWRfcG9pbnQgd2hpdGVfeCwgcG5nX2ZpeGVkX3BvaW50IHdoaXRlX3ksIHBuZ19maXhlZF9wb2ludCByZWRfeCwKLSAgIHBuZ19maXhlZF9wb2ludCByZWRfeSwgcG5nX2ZpeGVkX3BvaW50IGdyZWVuX3gsIHBuZ19maXhlZF9wb2ludCBncmVlbl95LAotICAgcG5nX2ZpeGVkX3BvaW50IGJsdWVfeCwgcG5nX2ZpeGVkX3BvaW50IGJsdWVfeSkKLXsKLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiY0hSTSBmaXhlZCIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0jaWYgIWRlZmluZWQoUE5HX05PX0NIRUNLX2NIUk0pCi0gICBpZiAocG5nX2NoZWNrX2NIUk1fZml4ZWQocG5nX3B0ciwKLSAgICAgIHdoaXRlX3gsIHdoaXRlX3ksIHJlZF94LCByZWRfeSwgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3kpKQotI2VuZGlmCi0gICB7Ci0gICAgICBpbmZvX3B0ci0+aW50X3hfd2hpdGUgPSB3aGl0ZV94OwotICAgICAgaW5mb19wdHItPmludF95X3doaXRlID0gd2hpdGVfeTsKLSAgICAgIGluZm9fcHRyLT5pbnRfeF9yZWQgICA9IHJlZF94OwotICAgICAgaW5mb19wdHItPmludF95X3JlZCAgID0gcmVkX3k7Ci0gICAgICBpbmZvX3B0ci0+aW50X3hfZ3JlZW4gPSBncmVlbl94OwotICAgICAgaW5mb19wdHItPmludF95X2dyZWVuID0gZ3JlZW5feTsKLSAgICAgIGluZm9fcHRyLT5pbnRfeF9ibHVlICA9IGJsdWVfeDsKLSAgICAgIGluZm9fcHRyLT5pbnRfeV9ibHVlICA9IGJsdWVfeTsKLSNpZmRlZiAgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgICAgaW5mb19wdHItPnhfd2hpdGUgPSAoZmxvYXQpKHdoaXRlX3gvMTAwMDAwLik7Ci0gICAgICBpbmZvX3B0ci0+eV93aGl0ZSA9IChmbG9hdCkod2hpdGVfeS8xMDAwMDAuKTsKLSAgICAgIGluZm9fcHRyLT54X3JlZCAgID0gKGZsb2F0KSggIHJlZF94LzEwMDAwMC4pOwotICAgICAgaW5mb19wdHItPnlfcmVkICAgPSAoZmxvYXQpKCAgcmVkX3kvMTAwMDAwLik7Ci0gICAgICBpbmZvX3B0ci0+eF9ncmVlbiA9IChmbG9hdCkoZ3JlZW5feC8xMDAwMDAuKTsKLSAgICAgIGluZm9fcHRyLT55X2dyZWVuID0gKGZsb2F0KShncmVlbl95LzEwMDAwMC4pOwotICAgICAgaW5mb19wdHItPnhfYmx1ZSAgPSAoZmxvYXQpKCBibHVlX3gvMTAwMDAwLik7Ci0gICAgICBpbmZvX3B0ci0+eV9ibHVlICA9IChmbG9hdCkoIGJsdWVfeS8xMDAwMDAuKTsKLSNlbmRpZgotICAgICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX2NIUk07Ci0gICB9Ci19Ci0jZW5kaWYgLyogUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRCAqLwotI2VuZGlmIC8qIFBOR19jSFJNX1NVUFBPUlRFRCAqLwotCi0jaWYgZGVmaW5lZChQTkdfZ0FNQV9TVVBQT1JURUQpCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfZ0FNQShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGRvdWJsZSBmaWxlX2dhbW1hKQotewotICAgZG91YmxlIHBuZ19nYW1tYTsKLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiZ0FNQSIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgIGlmIChmaWxlX2dhbW1hID4gMjE0NzQuODMpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTGltaXRpbmcgZ2FtbWEgdG8gMjE0NzQuODMiKTsKLSAgICAgIHBuZ19nYW1tYT0yMTQ3NC44MzsKLSAgIH0KLSAgIGVsc2UKLSAgICAgIHBuZ19nYW1tYSA9IGZpbGVfZ2FtbWE7Ci0gICBpbmZvX3B0ci0+Z2FtbWEgPSAoZmxvYXQpcG5nX2dhbW1hOwotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgIGluZm9fcHRyLT5pbnRfZ2FtbWEgPSAoaW50KShwbmdfZ2FtbWEqMTAwMDAwLisuNSk7Ci0jZW5kaWYKLSAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19nQU1BOwotICAgaWYgKHBuZ19nYW1tYSA9PSAwLjApCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiU2V0dGluZyBnYW1tYT0wIik7Ci19Ci0jZW5kaWYKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2dBTUFfZml4ZWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfZml4ZWRfcG9pbnQKLSAgIGludF9nYW1tYSkKLXsKLSAgIHBuZ19maXhlZF9wb2ludCBwbmdfZ2FtbWE7Ci0KLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiZ0FNQSIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAoaW50X2dhbW1hID4gKHBuZ19maXhlZF9wb2ludClQTkdfVUlOVF8zMV9NQVgpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTGltaXRpbmcgZ2FtbWEgdG8gMjE0NzQuODMiKTsKLSAgICAgIHBuZ19nYW1tYT1QTkdfVUlOVF8zMV9NQVg7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBpZiAoaW50X2dhbW1hIDwgMCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJTZXR0aW5nIG5lZ2F0aXZlIGdhbW1hIHRvIHplcm8iKTsKLSAgICAgICAgIHBuZ19nYW1tYSA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICBwbmdfZ2FtbWEgPSBpbnRfZ2FtbWE7Ci0gICB9Ci0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgaW5mb19wdHItPmdhbW1hID0gKGZsb2F0KShwbmdfZ2FtbWEvMTAwMDAwLik7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICBpbmZvX3B0ci0+aW50X2dhbW1hID0gcG5nX2dhbW1hOwotI2VuZGlmCi0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fZ0FNQTsKLSAgIGlmIChwbmdfZ2FtbWEgPT0gMCkKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJTZXR0aW5nIGdhbW1hPTAiKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfaElTVF9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF9oSVNUKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3VpbnRfMTZwIGhpc3QpCi17Ci0gICBpbnQgaTsKLQotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJoSVNUIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBpZiAoaW5mb19wdHItPm51bV9wYWxldHRlID09IDAgfHwgaW5mb19wdHItPm51bV9wYWxldHRlCi0gICAgICAgPiBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICJJbnZhbGlkIHBhbGV0dGUgc2l6ZSwgaElTVCBhbGxvY2F0aW9uIHNraXBwZWQuIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX0hJU1QsIDApOwotI2VuZGlmCi0gICAvKiBDaGFuZ2VkIGZyb20gaW5mby0+bnVtX3BhbGV0dGUgdG8gUE5HX01BWF9QQUxFVFRFX0xFTkdUSCBpbgotICAgICogdmVyc2lvbiAxLjIuMQotICAgICovCi0gICBwbmdfcHRyLT5oaXN0ID0gKHBuZ191aW50XzE2cClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgIChwbmdfdWludF8zMikoUE5HX01BWF9QQUxFVFRFX0xFTkdUSCAqIHBuZ19zaXplb2YocG5nX3VpbnRfMTYpKSk7Ci0gICBpZiAocG5nX3B0ci0+aGlzdCA9PSBOVUxMKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIGhJU1QgY2h1bmsgZGF0YS4iKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgZm9yIChpID0gMDsgaSA8IGluZm9fcHRyLT5udW1fcGFsZXR0ZTsgaSsrKQotICAgICAgcG5nX3B0ci0+aGlzdFtpXSA9IGhpc3RbaV07Ci0gICBpbmZvX3B0ci0+aGlzdCA9IHBuZ19wdHItPmhpc3Q7Ci0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9faElTVDsKLQotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfSElTVDsKLSNlbHNlCi0gICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19GUkVFX0hJU1Q7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi12b2lkIFBOR0FQSQotcG5nX3NldF9JSERSKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ191aW50XzMyIHdpZHRoLCBwbmdfdWludF8zMiBoZWlnaHQsIGludCBiaXRfZGVwdGgsCi0gICBpbnQgY29sb3JfdHlwZSwgaW50IGludGVybGFjZV90eXBlLCBpbnQgY29tcHJlc3Npb25fdHlwZSwKLSAgIGludCBmaWx0ZXJfdHlwZSkKLXsKLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiSUhEUiIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICAvKiBDaGVjayBmb3Igd2lkdGggYW5kIGhlaWdodCB2YWxpZCB2YWx1ZXMgKi8KLSAgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbWFnZSB3aWR0aCBvciBoZWlnaHQgaXMgemVybyBpbiBJSERSIik7Ci0jaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLSAgIGlmICh3aWR0aCA+IHBuZ19wdHItPnVzZXJfd2lkdGhfbWF4IHx8IGhlaWdodCA+IHBuZ19wdHItPnVzZXJfaGVpZ2h0X21heCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW1hZ2Ugc2l6ZSBleGNlZWRzIHVzZXIgbGltaXRzIGluIElIRFIiKTsKLSNlbHNlCi0gICBpZiAod2lkdGggPiBQTkdfVVNFUl9XSURUSF9NQVggfHwgaGVpZ2h0ID4gUE5HX1VTRVJfSEVJR0hUX01BWCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiaW1hZ2Ugc2l6ZSBleGNlZWRzIHVzZXIgbGltaXRzIGluIElIRFIiKTsKLSNlbmRpZgotICAgaWYgKHdpZHRoID4gUE5HX1VJTlRfMzFfTUFYIHx8IGhlaWdodCA+IFBOR19VSU5UXzMxX01BWCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBpbWFnZSBzaXplIGluIElIRFIiKTsKLSAgIGlmICggd2lkdGggPiAoUE5HX1VJTlRfMzJfTUFYCi0gICAgICAgICAgICAgICAgID4+IDMpICAgICAgLyogOC1ieXRlIFJHQkEgcGl4ZWxzICovCi0gICAgICAgICAgICAgICAgIC0gNjQgICAgICAgLyogYmlncm93YnVmIGhhY2sgKi8KLSAgICAgICAgICAgICAgICAgLSAxICAgICAgICAvKiBmaWx0ZXIgYnl0ZSAqLwotICAgICAgICAgICAgICAgICAtIDcqOCAgICAgIC8qIHJvdW5kaW5nIG9mIHdpZHRoIHRvIG11bHRpcGxlIG9mIDggcGl4ZWxzICovCi0gICAgICAgICAgICAgICAgIC0gOCkgICAgICAgLyogZXh0cmEgbWF4X3BpeGVsX2RlcHRoIHBhZCAqLwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIldpZHRoIGlzIHRvbyBsYXJnZSBmb3IgbGlicG5nIHRvIHByb2Nlc3MgcGl4ZWxzIik7Ci0KLSAgIC8qIENoZWNrIG90aGVyIHZhbHVlcyAqLwotICAgaWYgKGJpdF9kZXB0aCAhPSAxICYmIGJpdF9kZXB0aCAhPSAyICYmIGJpdF9kZXB0aCAhPSA0ICYmCi0gICAgICBiaXRfZGVwdGggIT0gOCAmJiBiaXRfZGVwdGggIT0gMTYpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGluIElIRFIiKTsKLQotICAgaWYgKGNvbG9yX3R5cGUgPCAwIHx8IGNvbG9yX3R5cGUgPT0gMSB8fAotICAgICAgIGNvbG9yX3R5cGUgPT0gNSB8fCBjb2xvcl90eXBlID4gNikKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBjb2xvciB0eXBlIGluIElIRFIiKTsKLQotICAgaWYgKCgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSAmJiBiaXRfZGVwdGggPiA4KSB8fAotICAgICAgICgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSB8fAotICAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpICYmIGJpdF9kZXB0aCA8IDgpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGNvbG9yIHR5cGUvYml0IGRlcHRoIGNvbWJpbmF0aW9uIGluIElIRFIiKTsKLQotICAgaWYgKGludGVybGFjZV90eXBlID49IFBOR19JTlRFUkxBQ0VfTEFTVCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVW5rbm93biBpbnRlcmxhY2UgbWV0aG9kIGluIElIRFIiKTsKLQotICAgaWYgKGNvbXByZXNzaW9uX3R5cGUgIT0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gSUhEUiIpOwotCi0jaWYgZGVmaW5lZChQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCkKLSAgIC8qIEFjY2VwdCBmaWx0ZXJfbWV0aG9kIDY0IChpbnRyYXBpeGVsIGRpZmZlcmVuY2luZykgb25seSBpZgotICAgICogMS4gTGlicG5nIHdhcyBjb21waWxlZCB3aXRoIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEIGFuZAotICAgICogMi4gTGlicG5nIGRpZCBub3QgcmVhZCBhIFBORyBzaWduYXR1cmUgKHRoaXMgZmlsdGVyX21ldGhvZCBpcyBvbmx5Ci0gICAgKiAgICB1c2VkIGluIFBORyBkYXRhc3RyZWFtcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMpIGFuZAotICAgICogMy4gVGhlIGFwcGxpY2F0aW9uIGNhbGxlZCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcyB3aXRoIGEgbWFzayB0aGF0Ci0gICAgKiAgICBpbmNsdWRlZCBQTkdfRkxBR19NTkdfRklMVEVSXzY0IGFuZAotICAgICogNC4gVGhlIGZpbHRlcl9tZXRob2QgaXMgNjQgYW5kCi0gICAgKiA1LiBUaGUgY29sb3JfdHlwZSBpcyBSR0Igb3IgUkdCQQotICAgICovCi0gICBpZiAoKHBuZ19wdHItPm1vZGUmUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkmJnBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiTU5HIGZlYXR1cmVzIGFyZSBub3QgYWxsb3dlZCBpbiBhIFBORyBkYXRhc3RyZWFtIik7Ci0gICBpZiAoZmlsdGVyX3R5cGUgIT0gUE5HX0ZJTFRFUl9UWVBFX0JBU0UpCi0gICB7Ci0gICAgIGlmICghKChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NCkgJiYKLSAgICAgICAgIChmaWx0ZXJfdHlwZSA9PSBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcpICYmCi0gICAgICAgICAoKHBuZ19wdHItPm1vZGUmUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkgPT0gMCkgJiYKLSAgICAgICAgIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAotICAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpKSkKLSAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJVbmtub3duIGZpbHRlciBtZXRob2QgaW4gSUhEUiIpOwotICAgICBpZiAocG5nX3B0ci0+bW9kZSZQTkdfSEFWRV9QTkdfU0lHTkFUVVJFKQotICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBmaWx0ZXIgbWV0aG9kIGluIElIRFIiKTsKLSAgIH0KLSNlbHNlCi0gICBpZiAoZmlsdGVyX3R5cGUgIT0gUE5HX0ZJTFRFUl9UWVBFX0JBU0UpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlVua25vd24gZmlsdGVyIG1ldGhvZCBpbiBJSERSIik7Ci0jZW5kaWYKLQotICAgaW5mb19wdHItPndpZHRoID0gd2lkdGg7Ci0gICBpbmZvX3B0ci0+aGVpZ2h0ID0gaGVpZ2h0OwotICAgaW5mb19wdHItPmJpdF9kZXB0aCA9IChwbmdfYnl0ZSliaXRfZGVwdGg7Ci0gICBpbmZvX3B0ci0+Y29sb3JfdHlwZSA9KHBuZ19ieXRlKSBjb2xvcl90eXBlOwotICAgaW5mb19wdHItPmNvbXByZXNzaW9uX3R5cGUgPSAocG5nX2J5dGUpY29tcHJlc3Npb25fdHlwZTsKLSAgIGluZm9fcHRyLT5maWx0ZXJfdHlwZSA9IChwbmdfYnl0ZSlmaWx0ZXJfdHlwZTsKLSAgIGluZm9fcHRyLT5pbnRlcmxhY2VfdHlwZSA9IChwbmdfYnl0ZSlpbnRlcmxhY2VfdHlwZTsKLSAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gMTsKLSAgIGVsc2UgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICAgICBpbmZvX3B0ci0+Y2hhbm5lbHMgPSAzOwotICAgZWxzZQotICAgICAgaW5mb19wdHItPmNoYW5uZWxzID0gMTsKLSAgIGlmIChpbmZvX3B0ci0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQotICAgICAgaW5mb19wdHItPmNoYW5uZWxzKys7Ci0gICBpbmZvX3B0ci0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKGluZm9fcHRyLT5jaGFubmVscyAqIGluZm9fcHRyLT5iaXRfZGVwdGgpOwotCi0gICAvKiBDaGVjayBmb3IgcG90ZW50aWFsIG92ZXJmbG93ICovCi0gICBpZiAod2lkdGggPiAoUE5HX1VJTlRfMzJfTUFYCi0gICAgICAgICAgICAgICAgID4+IDMpICAgICAgLyogOC1ieXRlIFJHQkEgcGl4ZWxzICovCi0gICAgICAgICAgICAgICAgIC0gNjQgICAgICAgLyogYmlncm93YnVmIGhhY2sgKi8KLSAgICAgICAgICAgICAgICAgLSAxICAgICAgICAvKiBmaWx0ZXIgYnl0ZSAqLwotICAgICAgICAgICAgICAgICAtIDcqOCAgICAgIC8qIHJvdW5kaW5nIG9mIHdpZHRoIHRvIG11bHRpcGxlIG9mIDggcGl4ZWxzICovCi0gICAgICAgICAgICAgICAgIC0gOCkgICAgICAgLyogZXh0cmEgbWF4X3BpeGVsX2RlcHRoIHBhZCAqLwotICAgICAgaW5mb19wdHItPnJvd2J5dGVzID0gKHBuZ19zaXplX3QpMDsKLSAgIGVsc2UKLSAgICAgIGluZm9fcHRyLT5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhpbmZvX3B0ci0+cGl4ZWxfZGVwdGgsIHdpZHRoKTsKLX0KLQotI2lmIGRlZmluZWQoUE5HX29GRnNfU1VQUE9SVEVEKQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfb0ZGcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfaW50XzMyIG9mZnNldF94LCBwbmdfaW50XzMyIG9mZnNldF95LCBpbnQgdW5pdF90eXBlKQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJvRkZzIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIGluZm9fcHRyLT54X29mZnNldCA9IG9mZnNldF94OwotICAgaW5mb19wdHItPnlfb2Zmc2V0ID0gb2Zmc2V0X3k7Ci0gICBpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZSA9IChwbmdfYnl0ZSl1bml0X3R5cGU7Ci0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fb0ZGczsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfcENBTF9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF9wQ0FMKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgIHBuZ19jaGFycCBwdXJwb3NlLCBwbmdfaW50XzMyIFgwLCBwbmdfaW50XzMyIFgxLCBpbnQgdHlwZSwgaW50IG5wYXJhbXMsCi0gICBwbmdfY2hhcnAgdW5pdHMsIHBuZ19jaGFycHAgcGFyYW1zKQotewotICAgcG5nX3VpbnRfMzIgbGVuZ3RoOwotICAgaW50IGk7Ci0KLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAicENBTCIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBsZW5ndGggPSBwbmdfc3RybGVuKHB1cnBvc2UpICsgMTsKLSAgIHBuZ19kZWJ1ZzEoMywgImFsbG9jYXRpbmcgcHVycG9zZSBmb3IgaW5mbyAoJWx1IGJ5dGVzKSIsCi0gICAgICh1bnNpZ25lZCBsb25nKWxlbmd0aCk7Ci0gICBpbmZvX3B0ci0+cGNhbF9wdXJwb3NlID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKTsKLSAgIGlmIChpbmZvX3B0ci0+cGNhbF9wdXJwb3NlID09IE5VTEwpCi0gICB7Ci0gICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHBDQUwgcHVycG9zZS4iKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIHBuZ19tZW1jcHkoaW5mb19wdHItPnBjYWxfcHVycG9zZSwgcHVycG9zZSwgKHBuZ19zaXplX3QpbGVuZ3RoKTsKLQotICAgcG5nX2RlYnVnKDMsICJzdG9yaW5nIFgwLCBYMSwgdHlwZSwgYW5kIG5wYXJhbXMgaW4gaW5mbyIpOwotICAgaW5mb19wdHItPnBjYWxfWDAgPSBYMDsKLSAgIGluZm9fcHRyLT5wY2FsX1gxID0gWDE7Ci0gICBpbmZvX3B0ci0+cGNhbF90eXBlID0gKHBuZ19ieXRlKXR5cGU7Ci0gICBpbmZvX3B0ci0+cGNhbF9ucGFyYW1zID0gKHBuZ19ieXRlKW5wYXJhbXM7Ci0KLSAgIGxlbmd0aCA9IHBuZ19zdHJsZW4odW5pdHMpICsgMTsKLSAgIHBuZ19kZWJ1ZzEoMywgImFsbG9jYXRpbmcgdW5pdHMgZm9yIGluZm8gKCVsdSBieXRlcykiLAotICAgICAodW5zaWduZWQgbG9uZylsZW5ndGgpOwotICAgaW5mb19wdHItPnBjYWxfdW5pdHMgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGgpOwotICAgaWYgKGluZm9fcHRyLT5wY2FsX3VuaXRzID09IE5VTEwpCi0gICB7Ci0gICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkluc3VmZmljaWVudCBtZW1vcnkgZm9yIHBDQUwgdW5pdHMuIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBwbmdfbWVtY3B5KGluZm9fcHRyLT5wY2FsX3VuaXRzLCB1bml0cywgKHBuZ19zaXplX3QpbGVuZ3RoKTsKLQotICAgaW5mb19wdHItPnBjYWxfcGFyYW1zID0gKHBuZ19jaGFycHApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCi0gICAgICAocG5nX3VpbnRfMzIpKChucGFyYW1zICsgMSkgKiBwbmdfc2l6ZW9mKHBuZ19jaGFycCkpKTsKLSAgIGlmIChpbmZvX3B0ci0+cGNhbF9wYXJhbXMgPT0gTlVMTCkKLSAgIHsKLSAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgcENBTCBwYXJhbXMuIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ19tZW1zZXQoaW5mb19wdHItPnBjYWxfcGFyYW1zLCAwLCAobnBhcmFtcyArIDEpICogcG5nX3NpemVvZihwbmdfY2hhcnApKTsKLQotICAgZm9yIChpID0gMDsgaSA8IG5wYXJhbXM7IGkrKykKLSAgIHsKLSAgICAgIGxlbmd0aCA9IHBuZ19zdHJsZW4ocGFyYW1zW2ldKSArIDE7Ci0gICAgICBwbmdfZGVidWcyKDMsICJhbGxvY2F0aW5nIHBhcmFtZXRlciAlZCBmb3IgaW5mbyAoJWx1IGJ5dGVzKSIsIGksCi0gICAgICAgICh1bnNpZ25lZCBsb25nKWxlbmd0aCk7Ci0gICAgICBpbmZvX3B0ci0+cGNhbF9wYXJhbXNbaV0gPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgaWYgKGluZm9fcHRyLT5wY2FsX3BhcmFtc1tpXSA9PSBOVUxMKQotICAgICAgewotICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBwQ0FMIHBhcmFtZXRlci4iKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwbmdfbWVtY3B5KGluZm9fcHRyLT5wY2FsX3BhcmFtc1tpXSwgcGFyYW1zW2ldLCAocG5nX3NpemVfdClsZW5ndGgpOwotICAgfQotCi0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fcENBTDsKLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1BDQUw7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfc0NBTF9TVVBQT1JURUQpCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc0NBTChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICAgICAgICAgICAgaW50IHVuaXQsIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCkKLXsKLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic0NBTCIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpbmZvX3B0ci0+c2NhbF91bml0ID0gKHBuZ19ieXRlKXVuaXQ7Ci0gICBpbmZvX3B0ci0+c2NhbF9waXhlbF93aWR0aCA9IHdpZHRoOwotICAgaW5mb19wdHItPnNjYWxfcGl4ZWxfaGVpZ2h0ID0gaGVpZ2h0OwotCi0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fc0NBTDsKLX0KLSNlbHNlCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc0NBTF9zKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgICAgICAgICAgICBpbnQgdW5pdCwgcG5nX2NoYXJwIHN3aWR0aCwgcG5nX2NoYXJwIHNoZWlnaHQpCi17Ci0gICBwbmdfdWludF8zMiBsZW5ndGg7Ci0KLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic0NBTCIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpbmZvX3B0ci0+c2NhbF91bml0ID0gKHBuZ19ieXRlKXVuaXQ7Ci0KLSAgIGxlbmd0aCA9IHBuZ19zdHJsZW4oc3dpZHRoKSArIDE7Ci0gICBwbmdfZGVidWcxKDMsICJhbGxvY2F0aW5nIHVuaXQgZm9yIGluZm8gKCV1IGJ5dGVzKSIsCi0gICAgICAodW5zaWduZWQgaW50KWxlbmd0aCk7Ci0gICBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwgbGVuZ3RoKTsKLSAgIGlmIChpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgd2hpbGUgcHJvY2Vzc2luZyBzQ0FMLiIpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgcG5nX21lbWNweShpbmZvX3B0ci0+c2NhbF9zX3dpZHRoLCBzd2lkdGgsIChwbmdfc2l6ZV90KWxlbmd0aCk7Ci0KLSAgIGxlbmd0aCA9IHBuZ19zdHJsZW4oc2hlaWdodCkgKyAxOwotICAgcG5nX2RlYnVnMSgzLCAiYWxsb2NhdGluZyB1bml0IGZvciBpbmZvICgldSBieXRlcykiLAotICAgICAgKHVuc2lnbmVkIGludClsZW5ndGgpOwotICAgaW5mb19wdHItPnNjYWxfc19oZWlnaHQgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGgpOwotICAgaWYgKGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0ID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfZnJlZSAocG5nX3B0ciwgaW5mb19wdHItPnNjYWxfc193aWR0aCk7Ci0gICAgICBpbmZvX3B0ci0+c2NhbF9zX3dpZHRoID0gTlVMTDsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCB3aGlsZSBwcm9jZXNzaW5nIHNDQUwuIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBwbmdfbWVtY3B5KGluZm9fcHRyLT5zY2FsX3NfaGVpZ2h0LCBzaGVpZ2h0LCAocG5nX3NpemVfdClsZW5ndGgpOwotICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3NDQUw7Ci0jaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECi0gICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9TQ0FMOwotI2VuZGlmCi19Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19wSFlzX1NVUFBPUlRFRCkKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3BIWXMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX3VpbnRfMzIgcmVzX3gsIHBuZ191aW50XzMyIHJlc195LCBpbnQgdW5pdF90eXBlKQotewotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJwSFlzIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCA9IHJlc194OwotICAgaW5mb19wdHItPnlfcGl4ZWxzX3Blcl91bml0ID0gcmVzX3k7Ci0gICBpbmZvX3B0ci0+cGh5c191bml0X3R5cGUgPSAocG5nX2J5dGUpdW5pdF90eXBlOwotICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3BIWXM7Ci19Ci0jZW5kaWYKLQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfUExURShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfY29sb3JwIHBhbGV0dGUsIGludCBudW1fcGFsZXR0ZSkKLXsKLQotICAgcG5nX2RlYnVnMSgxLCAiaW4gJXMgc3RvcmFnZSBmdW5jdGlvbiIsICJQTFRFIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIGlmIChudW1fcGFsZXR0ZSA8IDAgfHwgbnVtX3BhbGV0dGUgPiBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKQotICAgewotICAgICAgaWYgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgcGFsZXR0ZSBsZW5ndGgiKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHBhbGV0dGUgbGVuZ3RoIik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qCi0gICAgKiBJdCBtYXkgbm90IGFjdHVhbGx5IGJlIG5lY2Vzc2FyeSB0byBzZXQgcG5nX3B0ci0+cGFsZXR0ZSBoZXJlOwotICAgICogd2UgZG8gaXQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgd2F5IHRoZSBwbmdfaGFuZGxlX3RSTlMKLSAgICAqIGZ1bmN0aW9uIHVzZWQgdG8gZG8gdGhlIGFsbG9jYXRpb24uCi0gICAgKi8KLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX1BMVEUsIDApOwotI2VuZGlmCi0KLSAgIC8qIENoYW5nZWQgaW4gbGlicG5nLTEuMi4xIHRvIGFsbG9jYXRlIFBOR19NQVhfUEFMRVRURV9MRU5HVEggaW5zdGVhZAotICAgICogb2YgbnVtX3BhbGV0dGUgZW50cmllcywgaW4gY2FzZSBvZiBhbiBpbnZhbGlkIFBORyBmaWxlIHRoYXQgaGFzCi0gICAgKiB0b28tbGFyZ2Ugc2FtcGxlIHZhbHVlcy4KLSAgICAqLwotICAgcG5nX3B0ci0+cGFsZXR0ZSA9IChwbmdfY29sb3JwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgIFBOR19NQVhfUEFMRVRURV9MRU5HVEggKiBwbmdfc2l6ZW9mKHBuZ19jb2xvcikpOwotICAgcG5nX21lbXNldChwbmdfcHRyLT5wYWxldHRlLCAwLCBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIICoKLSAgICAgIHBuZ19zaXplb2YocG5nX2NvbG9yKSk7Ci0gICBwbmdfbWVtY3B5KHBuZ19wdHItPnBhbGV0dGUsIHBhbGV0dGUsIG51bV9wYWxldHRlICogcG5nX3NpemVvZihwbmdfY29sb3IpKTsKLSAgIGluZm9fcHRyLT5wYWxldHRlID0gcG5nX3B0ci0+cGFsZXR0ZTsKLSAgIGluZm9fcHRyLT5udW1fcGFsZXR0ZSA9IHBuZ19wdHItPm51bV9wYWxldHRlID0gKHBuZ191aW50XzE2KW51bV9wYWxldHRlOwotCi0jaWZkZWYgUE5HX0ZSRUVfTUVfU1VQUE9SVEVECi0gICBpbmZvX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9QTFRFOwotI2Vsc2UKLSAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0ZSRUVfUExURTsKLSNlbmRpZgotCi0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fUExURTsKLX0KLQotI2lmIGRlZmluZWQoUE5HX3NCSVRfU1VQUE9SVEVEKQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc0JJVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBwbmdfY29sb3JfOHAgc2lnX2JpdCkKLXsKLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic0JJVCIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBwbmdfbWVtY3B5KCYoaW5mb19wdHItPnNpZ19iaXQpLCBzaWdfYml0LCBwbmdfc2l6ZW9mKHBuZ19jb2xvcl84KSk7Ci0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fc0JJVDsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfc1JHQl9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF9zUkdCKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IGludGVudCkKLXsKLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAic1JHQiIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpbmZvX3B0ci0+c3JnYl9pbnRlbnQgPSAocG5nX2J5dGUpaW50ZW50OwotICAgaW5mb19wdHItPnZhbGlkIHw9IFBOR19JTkZPX3NSR0I7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBpbnQgaW50ZW50KQotewotI2lmIGRlZmluZWQoUE5HX2dBTUFfU1VQUE9SVEVEKQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIGZsb2F0IGZpbGVfZ2FtbWE7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICBwbmdfZml4ZWRfcG9pbnQgaW50X2ZpbGVfZ2FtbWE7Ci0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX2NIUk1fU1VQUE9SVEVEKQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIGZsb2F0IHdoaXRlX3gsIHdoaXRlX3ksIHJlZF94LCByZWRfeSwgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3k7Ci0jZW5kaWYKLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeCwgaW50X3doaXRlX3ksIGludF9yZWRfeCwgaW50X3JlZF95LCBpbnRfZ3JlZW5feCwKLSAgICAgIGludF9ncmVlbl95LCBpbnRfYmx1ZV94LCBpbnRfYmx1ZV95OwotI2VuZGlmCi0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInNSR0JfZ0FNQV9hbmRfY0hSTSIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBwbmdfc2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIGludGVudCk7Ci0KLSNpZiBkZWZpbmVkKFBOR19nQU1BX1NVUFBPUlRFRCkKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICBmaWxlX2dhbW1hID0gKGZsb2F0KS40NTQ1NTsKLSAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgZmlsZV9nYW1tYSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICBpbnRfZmlsZV9nYW1tYSA9IDQ1NDU1TDsKLSAgIHBuZ19zZXRfZ0FNQV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgaW50X2ZpbGVfZ2FtbWEpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX2NIUk1fU1VQUE9SVEVEKQotICAgaW50X3doaXRlX3ggPSAzMTI3MEw7Ci0gICBpbnRfd2hpdGVfeSA9IDMyOTAwTDsKLSAgIGludF9yZWRfeCAgID0gNjQwMDBMOwotICAgaW50X3JlZF95ICAgPSAzMzAwMEw7Ci0gICBpbnRfZ3JlZW5feCA9IDMwMDAwTDsKLSAgIGludF9ncmVlbl95ID0gNjAwMDBMOwotICAgaW50X2JsdWVfeCAgPSAxNTAwMEw7Ci0gICBpbnRfYmx1ZV95ICA9ICA2MDAwTDsKLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIHdoaXRlX3ggPSAoZmxvYXQpLjMxMjc7Ci0gICB3aGl0ZV95ID0gKGZsb2F0KS4zMjkwOwotICAgcmVkX3ggICA9IChmbG9hdCkuNjQ7Ci0gICByZWRfeSAgID0gKGZsb2F0KS4zMzsKLSAgIGdyZWVuX3ggPSAoZmxvYXQpLjMwOwotICAgZ3JlZW5feSA9IChmbG9hdCkuNjA7Ci0gICBibHVlX3ggID0gKGZsb2F0KS4xNTsKLSAgIGJsdWVfeSAgPSAoZmxvYXQpLjA2OwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChQTkdfTk9fQ0hFQ0tfY0hSTSkKLSAgIGlmIChwbmdfY2hlY2tfY0hSTV9maXhlZChwbmdfcHRyLAotICAgICAgIGludF93aGl0ZV94LCBpbnRfd2hpdGVfeSwgaW50X3JlZF94LCBpbnRfcmVkX3ksIGludF9ncmVlbl94LAotICAgICAgIGludF9ncmVlbl95LCBpbnRfYmx1ZV94LCBpbnRfYmx1ZV95KSkKLSNlbmRpZgotICAgewotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgICAgIHBuZ19zZXRfY0hSTV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgICBpbnRfd2hpdGVfeCwgaW50X3doaXRlX3ksIGludF9yZWRfeCwgaW50X3JlZF95LCBpbnRfZ3JlZW5feCwKLSAgICAgICAgICBpbnRfZ3JlZW5feSwgaW50X2JsdWVfeCwgaW50X2JsdWVfeSk7Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgICBwbmdfc2V0X2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgICAgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSk7Ci0jZW5kaWYKLSAgIH0KLSNlbmRpZiAvKiBjSFJNICovCi19Ci0jZW5kaWYgLyogc1JHQiAqLwotCi0KLSNpZiBkZWZpbmVkKFBOR19pQ0NQX1NVUFBPUlRFRCkKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2lDQ1AocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgICAgICAgICAgIHBuZ19jaGFycCBuYW1lLCBpbnQgY29tcHJlc3Npb25fdHlwZSwKLSAgICAgICAgICAgICBwbmdfY2hhcnAgcHJvZmlsZSwgcG5nX3VpbnRfMzIgcHJvZmxlbikKLXsKLSAgIHBuZ19jaGFycCBuZXdfaWNjcF9uYW1lOwotICAgcG5nX2NoYXJwIG5ld19pY2NwX3Byb2ZpbGU7Ci0gICBwbmdfdWludF8zMiBsZW5ndGg7Ci0KLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAiaUNDUCIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCB8fCBwcm9maWxlID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIGxlbmd0aCA9IHBuZ19zdHJsZW4obmFtZSkrMTsKLSAgIG5ld19pY2NwX25hbWUgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGgpOwotICAgaWYgKG5ld19pY2NwX25hbWUgPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHByb2Nlc3MgaUNDUCBjaHVuay4iKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIHBuZ19tZW1jcHkobmV3X2ljY3BfbmFtZSwgbmFtZSwgbGVuZ3RoKTsKLSAgIG5ld19pY2NwX3Byb2ZpbGUgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBwcm9mbGVuKTsKLSAgIGlmIChuZXdfaWNjcF9wcm9maWxlID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfZnJlZSAocG5nX3B0ciwgbmV3X2ljY3BfbmFtZSk7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgIkluc3VmZmljaWVudCBtZW1vcnkgdG8gcHJvY2VzcyBpQ0NQIHByb2ZpbGUuIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0gICBwbmdfbWVtY3B5KG5ld19pY2NwX3Byb2ZpbGUsIHByb2ZpbGUsIChwbmdfc2l6ZV90KXByb2ZsZW4pOwotCi0gICBwbmdfZnJlZV9kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfRlJFRV9JQ0NQLCAwKTsKLQotICAgaW5mb19wdHItPmljY3BfcHJvZmxlbiA9IHByb2ZsZW47Ci0gICBpbmZvX3B0ci0+aWNjcF9uYW1lID0gbmV3X2ljY3BfbmFtZTsKLSAgIGluZm9fcHRyLT5pY2NwX3Byb2ZpbGUgPSBuZXdfaWNjcF9wcm9maWxlOwotICAgLyogQ29tcHJlc3Npb24gaXMgYWx3YXlzIHplcm8gYnV0IGlzIGhlcmUgc28gdGhlIEFQSSBhbmQgaW5mbyBzdHJ1Y3R1cmUKLSAgICAqIGRvZXMgbm90IGhhdmUgdG8gY2hhbmdlIGlmIHdlIGludHJvZHVjZSBtdWx0aXBsZSBjb21wcmVzc2lvbiB0eXBlcyAqLwotICAgaW5mb19wdHItPmljY3BfY29tcHJlc3Npb24gPSAocG5nX2J5dGUpY29tcHJlc3Npb25fdHlwZTsKLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX0lDQ1A7Ci0jZW5kaWYKLSAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19pQ0NQOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19URVhUX1NVUFBPUlRFRCkKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3RleHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdGV4dHAgdGV4dF9wdHIsCi0gICAgICAgICAgICAgaW50IG51bV90ZXh0KQotewotICAgaW50IHJldDsKLSAgIHJldCA9IHBuZ19zZXRfdGV4dF8yKHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgbnVtX3RleHQpOwotICAgaWYgKHJldCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBzdG9yZSB0ZXh0Iik7Ci19Ci0KLWludCAvKiBQUklWQVRFICovCi1wbmdfc2V0X3RleHRfMihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ190ZXh0cCB0ZXh0X3B0ciwKLSAgICAgICAgICAgICAgIGludCBudW1fdGV4dCkKLXsKLSAgIGludCBpOwotCi0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgKHBuZ19wdHItPmNodW5rX25hbWVbMF0gPT0gJ1wwJyA/Ci0gICAgICAidGV4dCIgOiAocG5nX2NvbnN0X2NoYXJwKXBuZ19wdHItPmNodW5rX25hbWUpKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMIHx8IG51bV90ZXh0ID09IDApCi0gICAgICByZXR1cm4oMCk7Ci0KLSAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSBpbiB0aGUgInRleHQiIGFycmF5IGluIGluZm9fc3RydWN0Ci0gICAgKiB0byBob2xkIGFsbCBvZiB0aGUgaW5jb21pbmcgdGV4dF9wdHIgb2JqZWN0cy4KLSAgICAqLwotICAgaWYgKGluZm9fcHRyLT5udW1fdGV4dCArIG51bV90ZXh0ID4gaW5mb19wdHItPm1heF90ZXh0KQotICAgewotICAgICAgaWYgKGluZm9fcHRyLT50ZXh0ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwbmdfdGV4dHAgb2xkX3RleHQ7Ci0gICAgICAgICBpbnQgb2xkX21heDsKLQotICAgICAgICAgb2xkX21heCA9IGluZm9fcHRyLT5tYXhfdGV4dDsKLSAgICAgICAgIGluZm9fcHRyLT5tYXhfdGV4dCA9IGluZm9fcHRyLT5udW1fdGV4dCArIG51bV90ZXh0ICsgODsKLSAgICAgICAgIG9sZF90ZXh0ID0gaW5mb19wdHItPnRleHQ7Ci0gICAgICAgICBpbmZvX3B0ci0+dGV4dCA9IChwbmdfdGV4dHApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCi0gICAgICAgICAgICAocG5nX3VpbnRfMzIpKGluZm9fcHRyLT5tYXhfdGV4dCAqIHBuZ19zaXplb2YocG5nX3RleHQpKSk7Ci0gICAgICAgICBpZiAoaW5mb19wdHItPnRleHQgPT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG9sZF90ZXh0KTsKLSAgICAgICAgICAgIHJldHVybigxKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHBuZ19tZW1jcHkoaW5mb19wdHItPnRleHQsIG9sZF90ZXh0LCAocG5nX3NpemVfdCkob2xkX21heCAqCi0gICAgICAgICAgICBwbmdfc2l6ZW9mKHBuZ190ZXh0KSkpOwotICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgb2xkX3RleHQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaW5mb19wdHItPm1heF90ZXh0ID0gbnVtX3RleHQgKyA4OwotICAgICAgICAgaW5mb19wdHItPm51bV90ZXh0ID0gMDsKLSAgICAgICAgIGluZm9fcHRyLT50ZXh0ID0gKHBuZ190ZXh0cClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgICAgICAgIChwbmdfdWludF8zMikoaW5mb19wdHItPm1heF90ZXh0ICogcG5nX3NpemVvZihwbmdfdGV4dCkpKTsKLSAgICAgICAgIGlmIChpbmZvX3B0ci0+dGV4dCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuKDEpOwotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgICAgICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfVEVYVDsKLSNlbmRpZgotICAgICAgfQotICAgICAgcG5nX2RlYnVnMSgzLCAiYWxsb2NhdGVkICVkIGVudHJpZXMgZm9yIGluZm9fcHRyLT50ZXh0IiwKLSAgICAgICAgIGluZm9fcHRyLT5tYXhfdGV4dCk7Ci0gICB9Ci0gICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RleHQ7IGkrKykKLSAgIHsKLSAgICAgIHBuZ19zaXplX3QgdGV4dF9sZW5ndGgsIGtleV9sZW47Ci0gICAgICBwbmdfc2l6ZV90IGxhbmdfbGVuLCBsYW5nX2tleV9sZW47Ci0gICAgICBwbmdfdGV4dHAgdGV4dHAgPSAmKGluZm9fcHRyLT50ZXh0W2luZm9fcHRyLT5udW1fdGV4dF0pOwotCi0gICAgICBpZiAodGV4dF9wdHJbaV0ua2V5ID09IE5VTEwpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGtleV9sZW4gPSBwbmdfc3RybGVuKHRleHRfcHRyW2ldLmtleSk7Ci0KLSAgICAgIGlmICh0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiA8PSAwKQotICAgICAgewotICAgICAgICAgbGFuZ19sZW4gPSAwOwotICAgICAgICAgbGFuZ19rZXlfbGVuID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNpZmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKLSAgICAgIHsKLSAgICAgICAgIC8qIFNldCBpVFh0IGRhdGEgKi8KLSAgICAgICAgIGlmICh0ZXh0X3B0cltpXS5sYW5nICE9IE5VTEwpCi0gICAgICAgICAgICBsYW5nX2xlbiA9IHBuZ19zdHJsZW4odGV4dF9wdHJbaV0ubGFuZyk7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBsYW5nX2xlbiA9IDA7Ci0gICAgICAgICBpZiAodGV4dF9wdHJbaV0ubGFuZ19rZXkgIT0gTlVMTCkKLSAgICAgICAgICAgIGxhbmdfa2V5X2xlbiA9IHBuZ19zdHJsZW4odGV4dF9wdHJbaV0ubGFuZ19rZXkpOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgbGFuZ19rZXlfbGVuID0gMDsKLSAgICAgIH0KLSNlbHNlCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiaVRYdCBjaHVuayBub3Qgc3VwcG9ydGVkLiIpOwotICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgaWYgKHRleHRfcHRyW2ldLnRleHQgPT0gTlVMTCB8fCB0ZXh0X3B0cltpXS50ZXh0WzBdID09ICdcMCcpCi0gICAgICB7Ci0gICAgICAgICB0ZXh0X2xlbmd0aCA9IDA7Ci0jaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICAgICAgICBpZiAodGV4dF9wdHJbaV0uY29tcHJlc3Npb24gPiAwKQotICAgICAgICAgICAgdGV4dHAtPmNvbXByZXNzaW9uID0gUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgdGV4dHAtPmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIHRleHRfbGVuZ3RoID0gcG5nX3N0cmxlbih0ZXh0X3B0cltpXS50ZXh0KTsKLSAgICAgICAgIHRleHRwLT5jb21wcmVzc2lvbiA9IHRleHRfcHRyW2ldLmNvbXByZXNzaW9uOwotICAgICAgfQotCi0gICAgICB0ZXh0cC0+a2V5ID0gKHBuZ19jaGFycClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgICAgIChwbmdfdWludF8zMikKLSAgICAgICAgIChrZXlfbGVuICsgdGV4dF9sZW5ndGggKyBsYW5nX2xlbiArIGxhbmdfa2V5X2xlbiArIDQpKTsKLSAgICAgIGlmICh0ZXh0cC0+a2V5ID09IE5VTEwpCi0gICAgICAgICByZXR1cm4oMSk7Ci0gICAgICBwbmdfZGVidWcyKDIsICJBbGxvY2F0ZWQgJWx1IGJ5dGVzIGF0ICV4IGluIHBuZ19zZXRfdGV4dCIsCi0gICAgICAgICAgICAgICAgIChwbmdfdWludF8zMikKLSAgICAgICAgICAgICAgICAgKGtleV9sZW4gKyBsYW5nX2xlbiArIGxhbmdfa2V5X2xlbiArIHRleHRfbGVuZ3RoICsgNCksCi0gICAgICAgICAgICAgICAgIChpbnQpdGV4dHAtPmtleSk7Ci0KLSAgICAgIHBuZ19tZW1jcHkodGV4dHAtPmtleSwgdGV4dF9wdHJbaV0ua2V5LChwbmdfc2l6ZV90KShrZXlfbGVuKSk7Ci0gICAgICAqKHRleHRwLT5rZXkgKyBrZXlfbGVuKSA9ICdcMCc7Ci0jaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICAgICBpZiAodGV4dF9wdHJbaV0uY29tcHJlc3Npb24gPiAwKQotICAgICAgewotICAgICAgICAgdGV4dHAtPmxhbmcgPSB0ZXh0cC0+a2V5ICsga2V5X2xlbiArIDE7Ci0gICAgICAgICBwbmdfbWVtY3B5KHRleHRwLT5sYW5nLCB0ZXh0X3B0cltpXS5sYW5nLCBsYW5nX2xlbik7Ci0gICAgICAgICAqKHRleHRwLT5sYW5nICsgbGFuZ19sZW4pID0gJ1wwJzsKLSAgICAgICAgIHRleHRwLT5sYW5nX2tleSA9IHRleHRwLT5sYW5nICsgbGFuZ19sZW4gKyAxOwotICAgICAgICAgcG5nX21lbWNweSh0ZXh0cC0+bGFuZ19rZXksIHRleHRfcHRyW2ldLmxhbmdfa2V5LCBsYW5nX2tleV9sZW4pOwotICAgICAgICAgKih0ZXh0cC0+bGFuZ19rZXkgKyBsYW5nX2tleV9sZW4pID0gJ1wwJzsKLSAgICAgICAgIHRleHRwLT50ZXh0ID0gdGV4dHAtPmxhbmdfa2V5ICsgbGFuZ19rZXlfbGVuICsgMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgewotI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAotICAgICAgICAgdGV4dHAtPmxhbmc9TlVMTDsKLSAgICAgICAgIHRleHRwLT5sYW5nX2tleT1OVUxMOwotI2VuZGlmCi0gICAgICAgICB0ZXh0cC0+dGV4dCA9IHRleHRwLT5rZXkgKyBrZXlfbGVuICsgMTsKLSAgICAgIH0KLSAgICAgIGlmICh0ZXh0X2xlbmd0aCkKLSAgICAgICAgIHBuZ19tZW1jcHkodGV4dHAtPnRleHQsIHRleHRfcHRyW2ldLnRleHQsCi0gICAgICAgICAgICAocG5nX3NpemVfdCkodGV4dF9sZW5ndGgpKTsKLSAgICAgICoodGV4dHAtPnRleHQgKyB0ZXh0X2xlbmd0aCkgPSAnXDAnOwotCi0jaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICAgICBpZiAodGV4dHAtPmNvbXByZXNzaW9uID4gMCkKLSAgICAgIHsKLSAgICAgICAgIHRleHRwLT50ZXh0X2xlbmd0aCA9IDA7Ci0gICAgICAgICB0ZXh0cC0+aXR4dF9sZW5ndGggPSB0ZXh0X2xlbmd0aDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgewotICAgICAgICAgdGV4dHAtPnRleHRfbGVuZ3RoID0gdGV4dF9sZW5ndGg7Ci0jaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICAgICAgICB0ZXh0cC0+aXR4dF9sZW5ndGggPSAwOwotI2VuZGlmCi0gICAgICB9Ci0gICAgICBpbmZvX3B0ci0+bnVtX3RleHQrKzsKLSAgICAgIHBuZ19kZWJ1ZzEoMywgInRyYW5zZmVycmVkIHRleHQgY2h1bmsgJWQiLCBpbmZvX3B0ci0+bnVtX3RleHQpOwotICAgfQotICAgcmV0dXJuKDApOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR190SU1FX1NVUFBPUlRFRCkKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3RJTUUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBwbmdfdGltZXAgbW9kX3RpbWUpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInRJTUUiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCB8fAotICAgICAgIChwbmdfcHRyLT5tb2RlICYgUE5HX1dST1RFX3RJTUUpKQotICAgICAgcmV0dXJuOwotCi0gICBwbmdfbWVtY3B5KCYoaW5mb19wdHItPm1vZF90aW1lKSwgbW9kX3RpbWUsIHBuZ19zaXplb2YocG5nX3RpbWUpKTsKLSAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT190SU1FOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR190Uk5TX1NVUFBPUlRFRCkKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3RSTlMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLAotICAgcG5nX2J5dGVwIHRyYW5zLCBpbnQgbnVtX3RyYW5zLCBwbmdfY29sb3JfMTZwIHRyYW5zX3ZhbHVlcykKLXsKLSAgIHBuZ19kZWJ1ZzEoMSwgImluICVzIHN0b3JhZ2UgZnVuY3Rpb24iLCAidFJOUyIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAodHJhbnMgIT0gTlVMTCkKLSAgIHsKLSAgICAgICAvKgotICAgICAgICAqIEl0IG1heSBub3QgYWN0dWFsbHkgYmUgbmVjZXNzYXJ5IHRvIHNldCBwbmdfcHRyLT50cmFucyBoZXJlOwotICAgICAgICAqIHdlIGRvIGl0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHdheSB0aGUgcG5nX2hhbmRsZV90Uk5TCi0gICAgICAgICogZnVuY3Rpb24gdXNlZCB0byBkbyB0aGUgYWxsb2NhdGlvbi4KLSAgICAgICAgKi8KLQotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIFBOR19GUkVFX1RSTlMsIDApOwotI2VuZGlmCi0KLSAgICAgICAvKiBDaGFuZ2VkIGZyb20gbnVtX3RyYW5zIHRvIFBOR19NQVhfUEFMRVRURV9MRU5HVEggaW4gdmVyc2lvbiAxLjIuMSAqLwotICAgICAgIHBuZ19wdHItPnRyYW5zID0gaW5mb19wdHItPnRyYW5zID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgIChwbmdfdWludF8zMilQTkdfTUFYX1BBTEVUVEVfTEVOR1RIKTsKLSAgICAgICBpZiAobnVtX3RyYW5zID4gMCAmJiBudW1fdHJhbnMgPD0gUE5HX01BWF9QQUxFVFRFX0xFTkdUSCkKLSAgICAgICAgICBwbmdfbWVtY3B5KGluZm9fcHRyLT50cmFucywgdHJhbnMsIChwbmdfc2l6ZV90KW51bV90cmFucyk7Ci0gICB9Ci0KLSAgIGlmICh0cmFuc192YWx1ZXMgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGludCBzYW1wbGVfbWF4ID0gKDEgPDwgaW5mb19wdHItPmJpdF9kZXB0aCk7Ci0gICAgICBpZiAoKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYKLSAgICAgICAgICAoaW50KXRyYW5zX3ZhbHVlcy0+Z3JheSA+IHNhbXBsZV9tYXgpIHx8Ci0gICAgICAgICAgKGluZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiAmJgotICAgICAgICAgICgoaW50KXRyYW5zX3ZhbHVlcy0+cmVkID4gc2FtcGxlX21heCB8fAotICAgICAgICAgIChpbnQpdHJhbnNfdmFsdWVzLT5ncmVlbiA+IHNhbXBsZV9tYXggfHwKLSAgICAgICAgICAoaW50KXRyYW5zX3ZhbHVlcy0+Ymx1ZSA+IHNhbXBsZV9tYXgpKSkKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgICAidFJOUyBjaHVuayBoYXMgb3V0LW9mLXJhbmdlIHNhbXBsZXMgZm9yIGJpdF9kZXB0aCIpOwotICAgICAgcG5nX21lbWNweSgmKGluZm9fcHRyLT50cmFuc192YWx1ZXMpLCB0cmFuc192YWx1ZXMsCi0gICAgICAgICBwbmdfc2l6ZW9mKHBuZ19jb2xvcl8xNikpOwotICAgICAgaWYgKG51bV90cmFucyA9PSAwKQotICAgICAgICAgbnVtX3RyYW5zID0gMTsKLSAgIH0KLQotICAgaW5mb19wdHItPm51bV90cmFucyA9IChwbmdfdWludF8xNiludW1fdHJhbnM7Ci0gICBpZiAobnVtX3RyYW5zICE9IDApCi0gICB7Ci0gICAgICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fdFJOUzsKLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgICAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1RSTlM7Ci0jZWxzZQotICAgICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfRlJFRV9UUk5TOwotI2VuZGlmCi0gICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX3NQTFRfU1VQUE9SVEVEKQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfc1BMVChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICAgICAgIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX3NQTFRfdHAgZW50cmllcywgaW50IG5lbnRyaWVzKQotLyoKLSAqICBlbnRyaWVzICAgICAgICAtIGFycmF5IG9mIHBuZ19zUExUX3Qgc3RydWN0dXJlcwotICogICAgICAgICAgICAgICAgICAgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcGFsZXR0ZXMKLSAqICAgICAgICAgICAgICAgICAgIGluIHRoZSBpbmZvIHN0cnVjdHVyZS4KLSAqICBuZW50cmllcyAgICAgICAtIG51bWJlciBvZiBwYWxldHRlIHN0cnVjdHVyZXMgdG8gYmUKLSAqICAgICAgICAgICAgICAgICAgIGFkZGVkLgotICovCi17Ci0gICBwbmdfc1BMVF90cCBucDsKLSAgIGludCBpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIG5wID0gKHBuZ19zUExUX3RwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLAotICAgICAgIChpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW0gKyBuZW50cmllcykgKgotICAgICAgICAocG5nX3VpbnRfMzIpcG5nX3NpemVvZihwbmdfc1BMVF90KSk7Ci0gICBpZiAobnAgPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJObyBtZW1vcnkgZm9yIHNQTFQgcGFsZXR0ZXMuIik7Ci0gICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX21lbWNweShucCwgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXMsCi0gICAgICAgICAgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtICogcG5nX3NpemVvZihwbmdfc1BMVF90KSk7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcyk7Ci0gICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlcz1OVUxMOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgbmVudHJpZXM7IGkrKykKLSAgIHsKLSAgICAgIHBuZ19zUExUX3RwIHRvID0gbnAgKyBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW0gKyBpOwotICAgICAgcG5nX3NQTFRfdHAgZnJvbSA9IGVudHJpZXMgKyBpOwotICAgICAgcG5nX3VpbnRfMzIgbGVuZ3RoOwotCi0gICAgICBsZW5ndGggPSBwbmdfc3RybGVuKGZyb20tPm5hbWUpICsgMTsKLSAgICAgICAgdG8tPm5hbWUgPSAocG5nX2NoYXJwKXBuZ19tYWxsb2Nfd2FybihwbmdfcHRyLCBsZW5ndGgpOwotICAgICAgaWYgKHRvLT5uYW1lID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAiT3V0IG9mIG1lbW9yeSB3aGlsZSBwcm9jZXNzaW5nIHNQTFQgY2h1bmsiKTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgcG5nX21lbWNweSh0by0+bmFtZSwgZnJvbS0+bmFtZSwgbGVuZ3RoKTsKLSAgICAgIHRvLT5lbnRyaWVzID0gKHBuZ19zUExUX2VudHJ5cClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgICAgICAgIChwbmdfdWludF8zMikoZnJvbS0+bmVudHJpZXMgKiBwbmdfc2l6ZW9mKHBuZ19zUExUX2VudHJ5KSkpOwotICAgICAgaWYgKHRvLT5lbnRyaWVzID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAiT3V0IG9mIG1lbW9yeSB3aGlsZSBwcm9jZXNzaW5nIHNQTFQgY2h1bmsiKTsKLSAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHRvLT5uYW1lKTsKLSAgICAgICAgIHRvLT5uYW1lID0gTlVMTDsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgcG5nX21lbWNweSh0by0+ZW50cmllcywgZnJvbS0+ZW50cmllcywKLSAgICAgICAgICBmcm9tLT5uZW50cmllcyAqIHBuZ19zaXplb2YocG5nX3NQTFRfZW50cnkpKTsKLSAgICAgIHRvLT5uZW50cmllcyA9IGZyb20tPm5lbnRyaWVzOwotICAgICAgdG8tPmRlcHRoID0gZnJvbS0+ZGVwdGg7Ci0gICB9Ci0KLSAgIGluZm9fcHRyLT5zcGx0X3BhbGV0dGVzID0gbnA7Ci0gICBpbmZvX3B0ci0+c3BsdF9wYWxldHRlc19udW0gKz0gbmVudHJpZXM7Ci0gICBpbmZvX3B0ci0+dmFsaWQgfD0gUE5HX0lORk9fc1BMVDsKLSNpZmRlZiBQTkdfRlJFRV9NRV9TVVBQT1JURUQKLSAgIGluZm9fcHRyLT5mcmVlX21lIHw9IFBOR19GUkVFX1NQTFQ7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBQTkdfc1BMVF9TVVBQT1JURUQgKi8KLQotI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ191bmtub3duX2NodW5rcCB1bmtub3ducywgaW50IG51bV91bmtub3ducykKLXsKLSAgIHBuZ191bmtub3duX2NodW5rcCBucDsKLSAgIGludCBpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwgfHwgbnVtX3Vua25vd25zID09IDApCi0gICAgICAgcmV0dXJuOwotCi0gICBucCA9IChwbmdfdW5rbm93bl9jaHVua3ApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsCi0gICAgICAgKHBuZ191aW50XzMyKSgoaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSArIG51bV91bmtub3ducykgKgotICAgICAgIHBuZ19zaXplb2YocG5nX3Vua25vd25fY2h1bmspKSk7Ci0gICBpZiAobnAgPT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAiT3V0IG9mIG1lbW9yeSB3aGlsZSBwcm9jZXNzaW5nIHVua25vd24gY2h1bmsuIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ19tZW1jcHkobnAsIGluZm9fcHRyLT51bmtub3duX2NodW5rcywKLSAgICAgICAgICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtICogcG5nX3NpemVvZihwbmdfdW5rbm93bl9jaHVuaykpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgaW5mb19wdHItPnVua25vd25fY2h1bmtzKTsKLSAgIGluZm9fcHRyLT51bmtub3duX2NodW5rcz1OVUxMOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Vua25vd25zOyBpKyspCi0gICB7Ci0gICAgICBwbmdfdW5rbm93bl9jaHVua3AgdG8gPSBucCArIGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0gKyBpOwotICAgICAgcG5nX3Vua25vd25fY2h1bmtwIGZyb20gPSB1bmtub3ducyArIGk7Ci0KLSAgICAgIHBuZ19tZW1jcHkoKHBuZ19jaGFycCl0by0+bmFtZSwgCi0gICAgICAgICAgICAgICAgIChwbmdfY2hhcnApZnJvbS0+bmFtZSwgCi0gICAgICAgICAgICAgICAgIHBuZ19zaXplb2YoZnJvbS0+bmFtZSkpOwotICAgICAgdG8tPm5hbWVbcG5nX3NpemVvZih0by0+bmFtZSktMV0gPSAnXDAnOwotICAgICAgdG8tPnNpemUgPSBmcm9tLT5zaXplOwotICAgICAgLyogTm90ZSBvdXIgbG9jYXRpb24gaW4gdGhlIHJlYWQgb3Igd3JpdGUgc2VxdWVuY2UgKi8KLSAgICAgIHRvLT5sb2NhdGlvbiA9IChwbmdfYnl0ZSkocG5nX3B0ci0+bW9kZSAmIDB4ZmYpOwotCi0gICAgICBpZiAoZnJvbS0+c2l6ZSA9PSAwKQotICAgICAgICAgdG8tPmRhdGE9TlVMTDsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIHRvLT5kYXRhID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jX3dhcm4ocG5nX3B0ciwKLSAgICAgICAgICAgKHBuZ191aW50XzMyKWZyb20tPnNpemUpOwotICAgICAgICAgaWYgKHRvLT5kYXRhID09IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAgICJPdXQgb2YgbWVtb3J5IHdoaWxlIHByb2Nlc3NpbmcgdW5rbm93biBjaHVuay4iKTsKLSAgICAgICAgICAgIHRvLT5zaXplID0gMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBuZ19tZW1jcHkodG8tPmRhdGEsIGZyb20tPmRhdGEsIGZyb20tPnNpemUpOwotICAgICAgfQotICAgfQotCi0gICBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MgPSBucDsKLSAgIGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0gKz0gbnVtX3Vua25vd25zOwotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgaW5mb19wdHItPmZyZWVfbWUgfD0gUE5HX0ZSRUVfVU5LTjsKLSNlbmRpZgotfQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICBpbnQgY2h1bmssIGludCBsb2NhdGlvbikKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgaW5mb19wdHIgIT0gTlVMTCAmJiBjaHVuayA+PSAwICYmIGNodW5rIDwKLSAgICAgICAgIChpbnQpaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSkKLSAgICAgIGluZm9fcHRyLT51bmtub3duX2NodW5rc1tjaHVua10ubG9jYXRpb24gPSAocG5nX2J5dGUpbG9jYXRpb247Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HXzFfMF9YKSB8fCBkZWZpbmVkKFBOR18xXzJfWCkKLSNpZiBkZWZpbmVkKFBOR19SRUFEX0VNUFRZX1BMVEVfU1VQUE9SVEVEKSB8fCBcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfRU1QVFlfUExURV9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3Blcm1pdF9lbXB0eV9wbHRlIChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgZW1wdHlfcGx0ZV9wZXJtaXR0ZWQpCi17Ci0gICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMoKQotICAgICAgYW5kIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjMuMCAqLwotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfcGVybWl0X2VtcHR5X3BsdGUsIERFUFJFQ0FURUQuIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCA9IChwbmdfYnl0ZSkKLSAgICAgKChwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgKH5QTkdfRkxBR19NTkdfRU1QVFlfUExURSkpIHwKLSAgICAgKChlbXB0eV9wbHRlX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19FTVBUWV9QTFRFKSkpOwotfQotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQpCi1wbmdfdWludF8zMiBQTkdBUEkKLXBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBtbmdfZmVhdHVyZXMpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuIChwbmdfdWludF8zMikwOwotICAgcG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCA9Ci0gICAgIChwbmdfYnl0ZSkobW5nX2ZlYXR1cmVzICYgUE5HX0FMTF9NTkdfRkVBVFVSRVMpOwotICAgcmV0dXJuIChwbmdfdWludF8zMilwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBrZWVwLCBwbmdfYnl0ZXAKLSAgIGNodW5rX2xpc3QsIGludCBudW1fY2h1bmtzKQotewotICAgcG5nX2J5dGVwIG5ld19saXN0LCBwOwotICAgaW50IGksIG9sZF9udW1fY2h1bmtzOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmIChudW1fY2h1bmtzID09IDApCi0gICB7Ci0gICAgICBpZiAoa2VlcCA9PSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyB8fCBrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSkKLSAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0tFRVBfVU5LTk9XTl9DSFVOS1M7Ci0gICAgICBlbHNlCi0gICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfS0VFUF9VTktOT1dOX0NIVU5LUzsKLQotICAgICAgaWYgKGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMpCi0gICAgICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19LRUVQX1VOU0FGRV9DSFVOS1M7Ci0gICAgICBlbHNlCi0gICAgICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfS0VFUF9VTlNBRkVfQ0hVTktTOwotICAgICAgcmV0dXJuOwotICAgfQotICAgaWYgKGNodW5rX2xpc3QgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIG9sZF9udW1fY2h1bmtzID0gcG5nX3B0ci0+bnVtX2NodW5rX2xpc3Q7Ci0gICBuZXdfbGlzdD0ocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgIChwbmdfdWludF8zMikKLSAgICAgICg1KihudW1fY2h1bmtzICsgb2xkX251bV9jaHVua3MpKSk7Ci0gICBpZiAocG5nX3B0ci0+Y2h1bmtfbGlzdCAhPSBOVUxMKQotICAgewotICAgICAgcG5nX21lbWNweShuZXdfbGlzdCwgcG5nX3B0ci0+Y2h1bmtfbGlzdCwKLSAgICAgICAgIChwbmdfc2l6ZV90KSg1Km9sZF9udW1fY2h1bmtzKSk7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19saXN0KTsKLSAgICAgIHBuZ19wdHItPmNodW5rX2xpc3Q9TlVMTDsKLSAgIH0KLSAgIHBuZ19tZW1jcHkobmV3X2xpc3QgKyA1Km9sZF9udW1fY2h1bmtzLCBjaHVua19saXN0LAotICAgICAgKHBuZ19zaXplX3QpKDUqbnVtX2NodW5rcykpOwotICAgZm9yIChwID0gbmV3X2xpc3QgKyA1Km9sZF9udW1fY2h1bmtzICsgNCwgaSA9IDA7IGk8bnVtX2NodW5rczsgaSsrLCBwICs9IDUpCi0gICAgICAqcD0ocG5nX2J5dGUpa2VlcDsKLSAgIHBuZ19wdHItPm51bV9jaHVua19saXN0ID0gb2xkX251bV9jaHVua3MgKyBudW1fY2h1bmtzOwotICAgcG5nX3B0ci0+Y2h1bmtfbGlzdCA9IG5ld19saXN0OwotI2lmZGVmIFBOR19GUkVFX01FX1NVUFBPUlRFRAotICAgcG5nX3B0ci0+ZnJlZV9tZSB8PSBQTkdfRlJFRV9MSVNUOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVEKQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCB1c2VyX2NodW5rX3B0ciwKLSAgIHBuZ191c2VyX2NodW5rX3B0ciByZWFkX3VzZXJfY2h1bmtfZm4pCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+cmVhZF91c2VyX2NodW5rX2ZuID0gcmVhZF91c2VyX2NodW5rX2ZuOwotICAgcG5nX3B0ci0+dXNlcl9jaHVua19wdHIgPSB1c2VyX2NodW5rX3B0cjsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfSU5GT19JTUFHRV9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF9yb3dzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgcG5nX2J5dGVwcCByb3dfcG9pbnRlcnMpCi17Ci0gICBwbmdfZGVidWcxKDEsICJpbiAlcyBzdG9yYWdlIGZ1bmN0aW9uIiwgInJvd3MiKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCBpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAoaW5mb19wdHItPnJvd19wb2ludGVycyAmJiAoaW5mb19wdHItPnJvd19wb2ludGVycyAhPSByb3dfcG9pbnRlcnMpKQotICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfUk9XUywgMCk7Ci0gICBpbmZvX3B0ci0+cm93X3BvaW50ZXJzID0gcm93X3BvaW50ZXJzOwotICAgaWYgKHJvd19wb2ludGVycykKLSAgICAgIGluZm9fcHRyLT52YWxpZCB8PSBQTkdfSU5GT19JREFUOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi12b2lkIFBOR0FQSQotcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZShwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgIHBuZ191aW50XzMyIHNpemUpCi17Ci0gICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgICByZXR1cm47Ci0gICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+emJ1Zik7Ci0gICAgcG5nX3B0ci0+emJ1Zl9zaXplID0gKHBuZ19zaXplX3Qpc2l6ZTsKLSAgICBwbmdfcHRyLT56YnVmID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsIHNpemUpOwotICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOwotICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOwotfQotI2VuZGlmCi0KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2ludmFsaWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgbWFzaykKLXsKLSAgIGlmIChwbmdfcHRyICYmIGluZm9fcHRyKQotICAgICAgaW5mb19wdHItPnZhbGlkICY9IH5tYXNrOwotfQotCi0KLSNpZm5kZWYgUE5HXzFfMF9YCi0jaWZkZWYgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRAotLyogRnVuY3Rpb24gd2FzIGFkZGVkIHRvIGxpYnBuZyAxLjIuMCBhbmQgc2hvdWxkIGFsd2F5cyBleGlzdCBieSBkZWZhdWx0ICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9hc21fZmxhZ3MgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIGFzbV9mbGFncykKLXsKLS8qIE9ic29sZXRlIGFzIG9mIGxpYnBuZy0xLjIuMjAgYW5kIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjQuMCAqLwotICAgIGlmIChwbmdfcHRyICE9IE5VTEwpCi0gICAgcG5nX3B0ci0+YXNtX2ZsYWdzID0gMDsKLSAgICBhc21fZmxhZ3MgPSBhc21fZmxhZ3M7IC8qIFF1aWV0IHRoZSBjb21waWxlciAqLwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCB0byBsaWJwbmcgMS4yLjAgKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X21teF90aHJlc2hvbGRzIChwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgbW14X2JpdGRlcHRoX3RocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIG1teF9yb3dieXRlc190aHJlc2hvbGQpCi17Ci0vKiBPYnNvbGV0ZSBhcyBvZiBsaWJwbmctMS4yLjIwIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS40LjAgKi8KLSAgICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgIHJldHVybjsKLSAgICAvKiBRdWlldCB0aGUgY29tcGlsZXIgKi8KLSAgICBtbXhfYml0ZGVwdGhfdGhyZXNob2xkID0gbW14X2JpdGRlcHRoX3RocmVzaG9sZDsKLSAgICBtbXhfcm93Ynl0ZXNfdGhyZXNob2xkID0gbW14X3Jvd2J5dGVzX3RocmVzaG9sZDsKLX0KLSNlbmRpZiAvKiA/UE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLS8qIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGxpYnBuZyAxLjIuNiAqLwotdm9pZCBQTkdBUEkKLXBuZ19zZXRfdXNlcl9saW1pdHMgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHVzZXJfd2lkdGhfbWF4LAotICAgIHBuZ191aW50XzMyIHVzZXJfaGVpZ2h0X21heCkKLXsKLSAgIC8qIEltYWdlcyB3aXRoIGRpbWVuc2lvbnMgbGFyZ2VyIHRoYW4gdGhlc2UgbGltaXRzIHdpbGwgYmUKLSAgICAqIHJlamVjdGVkIGJ5IHBuZ19zZXRfSUhEUigpLiAgVG8gYWNjZXB0IGFueSBQTkcgZGF0YXN0cmVhbQotICAgICogcmVnYXJkbGVzcyBvZiBkaW1lbnNpb25zLCBzZXQgYm90aCBsaW1pdHMgdG8gMHg3ZmZmZmZmTC4KLSAgICAqLwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19wdHItPnVzZXJfd2lkdGhfbWF4ID0gdXNlcl93aWR0aF9tYXg7Ci0gICBwbmdfcHRyLT51c2VyX2hlaWdodF9tYXggPSB1c2VyX2hlaWdodF9tYXg7Ci19Ci0jZW5kaWYgLyogP1BOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVEICovCi0KLSNlbmRpZiAvKiA/UE5HXzFfMF9YICovCi0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEIHx8IFBOR19XUklURV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3BuZ3Rlc3QuYyBiL2xpYnMvbGlicG5nL3BuZ3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MDNlYi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wbmd0ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjg5ICswLDAgQEAKLQotLyogcG5ndGVzdC5jIC0gYSBzaW1wbGUgdGVzdCBwcm9ncmFtIHRvIHRlc3QgbGlicG5nCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuMzcgW0p1bmUgNCwgMjAwOV0KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIHByb2dyYW0gcmVhZHMgaW4gYSBQTkcgaW1hZ2UsIHdyaXRlcyBpdCBvdXQgYWdhaW4sIGFuZCB0aGVuCi0gKiBjb21wYXJlcyB0aGUgdHdvIGZpbGVzLiAgSWYgdGhlIGZpbGVzIGFyZSBpZGVudGljYWwsIHRoaXMgc2hvd3MgdGhhdAotICogdGhlIGJhc2ljIGNodW5rIGhhbmRsaW5nLCBmaWx0ZXJpbmcsIGFuZCAoZGUpY29tcHJlc3Npb24gY29kZSBpcyB3b3JraW5nCi0gKiBwcm9wZXJseS4gIEl0IGRvZXMgbm90IGN1cnJlbnRseSB0ZXN0IGFsbCBvZiB0aGUgdHJhbnNmb3JtcywgYWx0aG91Z2gKLSAqIGl0IHByb2JhYmx5IHNob3VsZC4KLSAqCi0gKiBUaGUgcHJvZ3JhbSB3aWxsIHJlcG9ydCAiRkFJTCIgaW4gY2VydGFpbiBsZWdpdGltYXRlIGNhc2VzOgotICogMSkgd2hlbiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3IgZmlsdGVyIHNlbGVjdGlvbiBtZXRob2QgaXMgY2hhbmdlZC4KLSAqIDIpIHdoZW4gdGhlIG1heGltdW0gSURBVCBzaXplIChQTkdfWkJVRl9TSVpFIGluIHBuZ2NvbmYuaCkgaXMgbm90IDgxOTIuCi0gKiAzKSB1bmtub3duIHVuc2FmZS10by1jb3B5IGFuY2lsbGFyeSBjaHVua3Mgb3IgdW5rbm93biBjcml0aWNhbCBjaHVua3MKLSAqICAgIGV4aXN0IGluIHRoZSBpbnB1dCBmaWxlLgotICogNCkgb3RoZXJzIG5vdCBsaXN0ZWQgaGVyZS4uLgotICogSW4gdGhlc2UgY2FzZXMsIGl0IGlzIGJlc3QgdG8gY2hlY2sgd2l0aCBhbm90aGVyIHRvb2wgc3VjaCBhcyAicG5nY2hlY2siCi0gKiB0byBzZWUgd2hhdCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIGZpbGVzIGFyZS4KLSAqCi0gKiBJZiBhIGZpbGVuYW1lIGlzIGdpdmVuIG9uIHRoZSBjb21tYW5kLWxpbmUsIHRoZW4gdGhpcyBmaWxlIGlzIHVzZWQKLSAqIGZvciB0aGUgaW5wdXQsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0ICJwbmd0ZXN0LnBuZyIuICBUaGlzIGFsbG93cwotICogdGVzdGluZyBhIHdpZGUgdmFyaWV0eSBvZiBmaWxlcyBlYXNpbHkuICBZb3UgY2FuIGFsc28gdGVzdCBhIG51bWJlcgotICogb2YgZmlsZXMgYXQgb25jZSBieSB0eXBpbmcgInBuZ3Rlc3QgLW0gZmlsZTEucG5nIGZpbGUyLnBuZyAuLi4iCi0gKi8KLQotI2luY2x1ZGUgInBuZy5oIgotCi0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotIyAgaWYgX1dJTjMyX1dDRSA8IDIxMQotICAgICBfX2Vycm9yX18gKGZ8dylwcmludGYgZnVuY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIG9sZCBXaW5kb3dzQ0UuOwotIyAgZW5kaWYKLSMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyAgZGVmaW5lIFJFQURGSUxFKGZpbGUsIGRhdGEsIGxlbmd0aCwgY2hlY2spIFwKLSAgICAgaWYgKFJlYWRGaWxlKGZpbGUsIGRhdGEsIGxlbmd0aCwgJmNoZWNrLCBOVUxMKSkgY2hlY2sgPSAwCi0jICBkZWZpbmUgV1JJVEVGSUxFKGZpbGUsIGRhdGEsIGxlbmd0aCwgY2hlY2spKSBcCi0gICAgIGlmIChXcml0ZUZpbGUoZmlsZSwgZGF0YSwgbGVuZ3RoLCAmY2hlY2ssIE5VTEwpKSBjaGVjayA9IDAKLSMgIGRlZmluZSBGQ0xPU0UoZmlsZSkgQ2xvc2VIYW5kbGUoZmlsZSkKLSNlbHNlCi0jICBpbmNsdWRlIDxzdGRpby5oPgotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jICBkZWZpbmUgUkVBREZJTEUoZmlsZSwgZGF0YSwgbGVuZ3RoLCBjaGVjaykgXAotICAgICBjaGVjaz0ocG5nX3NpemVfdClmcmVhZChkYXRhLCAocG5nX3NpemVfdCkxLCBsZW5ndGgsIGZpbGUpCi0jICBkZWZpbmUgV1JJVEVGSUxFKGZpbGUsIGRhdGEsIGxlbmd0aCwgY2hlY2spIFwKLSAgICAgY2hlY2s9KHBuZ19zaXplX3QpZndyaXRlKGRhdGEsIChwbmdfc2l6ZV90KTEsIGxlbmd0aCwgZmlsZSkKLSMgIGRlZmluZSBGQ0xPU0UoZmlsZSkgZmNsb3NlKGZpbGUpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX05PX1NURElPKQotIyAgaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotICAgICB0eXBlZGVmIEhBTkRMRSAgICAgICAgICAgICAgICBwbmdfRklMRV9wOwotIyAgZWxzZQotICAgICB0eXBlZGVmIEZJTEUgICAgICAgICAgICAgICAgKiBwbmdfRklMRV9wOwotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBNYWtlcyBwbmd0ZXN0IHZlcmJvc2Ugc28gd2UgY2FuIGZpbmQgcHJvYmxlbXMgKG5lZWRzIHRvIGJlIGJlZm9yZSBwbmcuaCkgKi8KLSNpZm5kZWYgUE5HX0RFQlVHCi0jICBkZWZpbmUgUE5HX0RFQlVHIDAKLSNlbmRpZgotCi0jaWYgIVBOR19ERUJVRwotIyAgZGVmaW5lIFNJTkdMRV9ST1dCVUZfQUxMT0MgIC8qIE1ha2VzIGJ1ZmZlciBvdmVycnVucyBlYXNpZXIgdG8gbmFpbCAqLwotI2VuZGlmCi0KLS8qIFR1cm4gb24gQ1BVIHRpbWluZwotI2RlZmluZSBQTkdURVNUX1RJTUlORwotKi8KLQotI2lmZGVmIFBOR19OT19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSN1bmRlZiBQTkdURVNUX1RJTUlORwotI2VuZGlmCi0KLSNpZmRlZiBQTkdURVNUX1RJTUlORwotc3RhdGljIGZsb2F0IHRfc3RhcnQsIHRfc3RvcCwgdF9kZWNvZGUsIHRfZW5jb2RlLCB0X21pc2M7Ci0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEKQotI2RlZmluZSBQTkdfdElNRV9TVFJJTkdfTEVOR1RIIDI5Ci1zdGF0aWMgaW50IHRJTUVfY2h1bmtfcHJlc2VudCA9IDA7Ci1zdGF0aWMgY2hhciB0SU1FX3N0cmluZ1tQTkdfdElNRV9TVFJJTkdfTEVOR1RIXSA9ICJ0SU1FIGNodW5rIGlzIG5vdCBwcmVzZW50IjsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHZlcmJvc2UgPSAwOwotCi1pbnQgdGVzdF9vbmVfZmlsZSBQTkdBUkcoKFBOR19DT05TVCBjaGFyICppbm5hbWUsIFBOR19DT05TVCBjaGFyICpvdXRuYW1lKSk7Ci0KLSNpZmRlZiBfX1RVUkJPQ19fCi0jaW5jbHVkZSA8bWVtLmg+Ci0jZW5kaWYKLQotLyogRGVmaW5lZCBzbyBJIGNhbiB3cml0ZSB0byBhIGZpbGUgb24gZ3VpL3dpbmRvd2luZyBwbGF0Zm9ybXMgKi8KLS8qICAjZGVmaW5lIFNUREVSUiBzdGRlcnIgICovCi0jZGVmaW5lIFNUREVSUiBzdGRvdXQgICAvKiBGb3IgRE9TICovCi0KLS8qIEluIGNhc2UgYSBzeXN0ZW0gaGVhZGVyIChlLmcuLCBvbiBBSVgpIGRlZmluZWQgam1wYnVmICovCi0jaWZkZWYgam1wYnVmCi0jICB1bmRlZiBqbXBidWYKLSNlbmRpZgotCi0vKiBEZWZpbmUgcG5nX2ptcGJ1ZigpIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGEgcHJlLTEuMC42IHZlcnNpb24gb2YgbGlicG5nICovCi0jaWZuZGVmIHBuZ19qbXBidWYKLSMgIGRlZmluZSBwbmdfam1wYnVmKHBuZ19wdHIpIHBuZ19wdHItPmptcGJ1ZgotI2VuZGlmCi0KLS8qIEV4YW1wbGUgb2YgdXNpbmcgcm93IGNhbGxiYWNrcyB0byBtYWtlIGEgc2ltcGxlIHByb2dyZXNzIG1ldGVyICovCi1zdGF0aWMgaW50IHN0YXR1c19wYXNzID0gMTsKLXN0YXRpYyBpbnQgc3RhdHVzX2RvdHNfcmVxdWVzdGVkID0gMDsKLXN0YXRpYyBpbnQgc3RhdHVzX2RvdHMgPSAxOwotCi12b2lkCi0jaWZkZWYgUE5HXzFfMF9YCi1QTkdBUEkKLSNlbmRpZgotcmVhZF9yb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgcm93X251bWJlciwgaW50IHBhc3MpOwotdm9pZAotI2lmZGVmIFBOR18xXzBfWAotUE5HQVBJCi0jZW5kaWYKLXJlYWRfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHJvd19udW1iZXIsIGludCBwYXNzKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCB8fCByb3dfbnVtYmVyID4gUE5HX1VJTlRfMzFfTUFYKQotICAgICAgcmV0dXJuOwotICAgaWYgKHN0YXR1c19wYXNzICE9IHBhc3MpCi0gICB7Ci0gICAgICBmcHJpbnRmKHN0ZG91dCwgIlxuIFBhc3MgJWQ6ICIsIHBhc3MpOwotICAgICAgc3RhdHVzX3Bhc3MgPSBwYXNzOwotICAgICAgc3RhdHVzX2RvdHMgPSAzMTsKLSAgIH0KLSAgIHN0YXR1c19kb3RzLS07Ci0gICBpZiAoc3RhdHVzX2RvdHMgPT0gMCkKLSAgIHsKLSAgICAgIGZwcmludGYoc3Rkb3V0LCAiXG4gICAgICAgICAiKTsKLSAgICAgIHN0YXR1c19kb3RzPTMwOwotICAgfQotICAgZnByaW50ZihzdGRvdXQsICJyIik7Ci19Ci0KLXZvaWQKLSNpZmRlZiBQTkdfMV8wX1gKLVBOR0FQSQotI2VuZGlmCi13cml0ZV9yb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgcm93X251bWJlciwgaW50IHBhc3MpOwotdm9pZAotI2lmZGVmIFBOR18xXzBfWAotUE5HQVBJCi0jZW5kaWYKLXdyaXRlX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiByb3dfbnVtYmVyLCBpbnQgcGFzcykKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgcm93X251bWJlciA+IFBOR19VSU5UXzMxX01BWCB8fCBwYXNzID4gNykKLSAgICAgIHJldHVybjsKLSAgIGZwcmludGYoc3Rkb3V0LCAidyIpOwotfQotCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKLS8qIEV4YW1wbGUgb2YgdXNpbmcgdXNlciB0cmFuc2Zvcm0gY2FsbGJhY2sgKHdlIGRvbid0IHRyYW5zZm9ybSBhbnl0aGluZywKLSAqIGJ1dCBtZXJlbHkgZXhhbWluZSB0aGUgcm93IGZpbHRlcnMuICBXZSBzZXQgdGhpcyB0byAyNTYgcmF0aGVyIHRoYW4KLSAqIDUgaW4gY2FzZSBpbGxlZ2FsIGZpbHRlciB2YWx1ZXMgYXJlIHByZXNlbnQuKQotICovCi1zdGF0aWMgcG5nX3VpbnRfMzIgZmlsdGVyc191c2VkWzI1Nl07Ci12b2lkCi0jaWZkZWYgUE5HXzFfMF9YCi1QTkdBUEkKLSNlbmRpZgotY291bnRfZmlsdGVycyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSk7Ci12b2lkCi0jaWZkZWYgUE5HXzFfMF9YCi1QTkdBUEkKLSNlbmRpZgotY291bnRfZmlsdGVycyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKLXsKLSAgIGlmIChwbmdfcHRyICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCkKLSAgICAgICsrZmlsdGVyc191c2VkWyooZGF0YSAtIDEpXTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKQotLyogRXhhbXBsZSBvZiB1c2luZyB1c2VyIHRyYW5zZm9ybSBjYWxsYmFjayAod2UgZG9uJ3QgdHJhbnNmb3JtIGFueXRoaW5nLAotICogYnV0IG1lcmVseSBjb3VudCB0aGUgemVybyBzYW1wbGVzKQotICovCi0KLXN0YXRpYyBwbmdfdWludF8zMiB6ZXJvX3NhbXBsZXM7Ci0KLXZvaWQKLSNpZmRlZiBQTkdfMV8wX1gKLVBOR0FQSQotI2VuZGlmCi1jb3VudF96ZXJvX3NhbXBsZXMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIGRhdGEpOwotdm9pZAotI2lmZGVmIFBOR18xXzBfWAotUE5HQVBJCi0jZW5kaWYKLWNvdW50X3plcm9fc2FtcGxlcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKLXsKLSAgIHBuZ19ieXRlcCBkcCA9IGRhdGE7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKXJldHVybjsKLQotICAgLyogQ29udGVudHMgb2Ygcm93X2luZm86Ci0gICAgKiAgcG5nX3VpbnRfMzIgd2lkdGggICAgICB3aWR0aCBvZiByb3cKLSAgICAqICBwbmdfdWludF8zMiByb3dieXRlcyAgIG51bWJlciBvZiBieXRlcyBpbiByb3cKLSAgICAqICBwbmdfYnl0ZSBjb2xvcl90eXBlICAgIGNvbG9yIHR5cGUgb2YgcGl4ZWxzCi0gICAgKiAgcG5nX2J5dGUgYml0X2RlcHRoICAgICBiaXQgZGVwdGggb2Ygc2FtcGxlcwotICAgICogIHBuZ19ieXRlIGNoYW5uZWxzICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzICgxLTQpCi0gICAgKiAgcG5nX2J5dGUgcGl4ZWxfZGVwdGggICBiaXRzIHBlciBwaXhlbCAoZGVwdGgqY2hhbm5lbHMpCi0gICAgKi8KLQotICAgIC8qIENvdW50cyB0aGUgbnVtYmVyIG9mIHplcm8gc2FtcGxlcyAob3IgemVybyBwaXhlbHMgaWYgY29sb3JfdHlwZSBpcyAzICovCi0KLSAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gMCB8fCByb3dfaW5mby0+Y29sb3JfdHlwZSA9PSAzKQotICAgIHsKLSAgICAgICBpbnQgcG9zID0gMDsKLSAgICAgICBwbmdfdWludF8zMiBuLCBuc3RvcDsKLSAgICAgICBmb3IgKG4gPSAwLCBuc3RvcD1yb3dfaW5mby0+d2lkdGg7IG48bnN0b3A7IG4rKykKLSAgICAgICB7Ci0gICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKCgoKmRwIDw8IHBvcysrICkgJiAweDgwKSA9PSAwKQotICAgICAgICAgICAgICAgIHplcm9fc2FtcGxlcysrOwotICAgICAgICAgICAgIGlmIChwb3MgPT0gOCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zID0gMDsKLSAgICAgICAgICAgICAgICBkcCsrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKCgoKmRwIDw8IChwb3MrPTIpKSAmIDB4YzApID09IDApCi0gICAgICAgICAgICAgICAgemVyb19zYW1wbGVzKys7Ci0gICAgICAgICAgICAgaWYgKHBvcyA9PSA4KQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3MgPSAwOwotICAgICAgICAgICAgICAgIGRwKys7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBpZiAoKCgqZHAgPDwgKHBvcys9NCkpICYgMHhmMCkgPT0gMCkKLSAgICAgICAgICAgICAgICB6ZXJvX3NhbXBsZXMrKzsKLSAgICAgICAgICAgICBpZiAocG9zID09IDgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgZHArKzsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICAgICAgaWYgKCpkcCsrID09IDApCi0gICAgICAgICAgICAgICAgemVyb19zYW1wbGVzKys7Ci0gICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCi0gICAgICAgICAgewotICAgICAgICAgICAgIGlmICgoKmRwIHwgKihkcCsxKSkgPT0gMCkKLSAgICAgICAgICAgICAgICB6ZXJvX3NhbXBsZXMrKzsKLSAgICAgICAgICAgICBkcCs9MjsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qIE90aGVyIGNvbG9yIHR5cGVzICovCi0gICAgewotICAgICAgIHBuZ191aW50XzMyIG4sIG5zdG9wOwotICAgICAgIGludCBjaGFubmVsOwotICAgICAgIGludCBjb2xvcl9jaGFubmVscyA9IHJvd19pbmZvLT5jaGFubmVsczsKLSAgICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPiAzKWNvbG9yX2NoYW5uZWxzLS07Ci0KLSAgICAgICBmb3IgKG4gPSAwLCBuc3RvcD1yb3dfaW5mby0+d2lkdGg7IG48bnN0b3A7IG4rKykKLSAgICAgICB7Ci0gICAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNvbG9yX2NoYW5uZWxzOyBjaGFubmVsKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICAgICAgICAgaWYgKCpkcCsrID09IDApCi0gICAgICAgICAgICAgICAgICAgemVyb19zYW1wbGVzKys7Ci0gICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoKmRwIHwgKihkcCsxKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICB6ZXJvX3NhbXBsZXMrKzsKLSAgICAgICAgICAgICAgICBkcCs9MjsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA+IDMpCi0gICAgICAgICAgewotICAgICAgICAgICAgIGRwKys7Ci0gICAgICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCi0gICAgICAgICAgICAgICAgZHArKzsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEICovCi0KLXN0YXRpYyBpbnQgd3JvdGVfcXVlc3Rpb24gPSAwOwotCi0jaWYgZGVmaW5lZChQTkdfTk9fU1RESU8pCi0vKiBTVEFSVCBvZiBjb2RlIHRvIHZhbGlkYXRlIHN0ZGlvLWZyZWUgY29tcGlsYXRpb24gKi8KLS8qIFRoZXNlIGNvcGllcyBvZiB0aGUgZGVmYXVsdCByZWFkL3dyaXRlIGZ1bmN0aW9ucyBjb21lIGZyb20gcG5ncmlvLmMgYW5kCi0gKiBwbmd3aW8uYy4gIFRoZXkgYWxsb3cgImRvbid0IGluY2x1ZGUgc3RkaW8iIHRlc3Rpbmcgb2YgdGhlIGxpYnJhcnkuCi0gKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGFjdHVhbCByZWFkaW5nIG9mIGRhdGEuICBJZiB5b3UgYXJlCi0gKiBub3QgcmVhZGluZyBmcm9tIGEgc3RhbmRhcmQgQyBzdHJlYW0sIHlvdSBzaG91bGQgY3JlYXRlIGEgcmVwbGFjZW1lbnQKLSAqIHJlYWRfZGF0YSBmdW5jdGlvbiBhbmQgdXNlIGl0IGF0IHJ1biB0aW1lIHdpdGggcG5nX3NldF9yZWFkX2ZuKCksIHJhdGhlcgotICogdGhhbiBjaGFuZ2luZyB0aGUgbGlicmFyeS4KLSAqLwotCi0jaWZuZGVmIFVTRV9GQVJfS0VZV09SRAotc3RhdGljIHZvaWQKLXBuZ3Rlc3RfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIHBuZ19zaXplX3QgY2hlY2s7Ci0KLSAgIC8qIGZyZWFkKCkgcmV0dXJucyAwIG9uIGVycm9yLCBzbyBpdCBpcyBPSyB0byBzdG9yZSB0aGlzIGluIGEgcG5nX3NpemVfdAotICAgICogaW5zdGVhZCBvZiBhbiBpbnQsIHdoaWNoIGlzIHdoYXQgZnJlYWQoKSBhY3R1YWxseSByZXR1cm5zLgotICAgICovCi0gICBSRUFERklMRSgocG5nX0ZJTEVfcClwbmdfcHRyLT5pb19wdHIsIGRhdGEsIGxlbmd0aCwgY2hlY2spOwotCi0gICBpZiAoY2hlY2sgIT0gbGVuZ3RoKQotICAgewotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJSZWFkIEVycm9yISIpOwotICAgfQotfQotI2Vsc2UKLS8qIFRoaXMgaXMgdGhlIG1vZGVsLWluZGVwZW5kZW50IHZlcnNpb24uIFNpbmNlIHRoZSBzdGFuZGFyZCBJL08gbGlicmFyeQotICAgY2FuJ3QgaGFuZGxlIGZhciBidWZmZXJzIGluIHRoZSBtZWRpdW0gYW5kIHNtYWxsIG1vZGVscywgd2UgaGF2ZSB0byBjb3B5Ci0gICB0aGUgZGF0YS4KLSovCi0KLSNkZWZpbmUgTkVBUl9CVUZfU0laRSAxMDI0Ci0jZGVmaW5lIE1JTihhLGIpIChhIDw9IGIgPyBhIDogYikKLQotc3RhdGljIHZvaWQKLXBuZ3Rlc3RfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIGludCBjaGVjazsKLSAgIHBuZ19ieXRlICpuX2RhdGE7Ci0gICBwbmdfRklMRV9wIGlvX3B0cjsKLQotICAgLyogQ2hlY2sgaWYgZGF0YSByZWFsbHkgaXMgbmVhci4gSWYgc28sIHVzZSB1c3VhbCBjb2RlLiAqLwotICAgbl9kYXRhID0gKHBuZ19ieXRlICopQ1ZUX1BUUl9OT0NIRUNLKGRhdGEpOwotICAgaW9fcHRyID0gKHBuZ19GSUxFX3ApQ1ZUX1BUUihwbmdfcHRyLT5pb19wdHIpOwotICAgaWYgKChwbmdfYnl0ZXApbl9kYXRhID09IGRhdGEpCi0gICB7Ci0gICAgICBSRUFERklMRShpb19wdHIsIG5fZGF0YSwgbGVuZ3RoLCBjaGVjayk7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBidWZbTkVBUl9CVUZfU0laRV07Ci0gICAgICBwbmdfc2l6ZV90IHJlYWQsIHJlbWFpbmluZywgZXJyOwotICAgICAgY2hlY2sgPSAwOwotICAgICAgcmVtYWluaW5nID0gbGVuZ3RoOwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgIHJlYWQgPSBNSU4oTkVBUl9CVUZfU0laRSwgcmVtYWluaW5nKTsKLSAgICAgICAgIFJFQURGSUxFKGlvX3B0ciwgYnVmLCAxLCBlcnIpOwotICAgICAgICAgcG5nX21lbWNweShkYXRhLCBidWYsIHJlYWQpOyAvKiBDb3B5IGZhciBidWZmZXIgdG8gbmVhciBidWZmZXIgKi8KLSAgICAgICAgIGlmIChlcnIgIT0gcmVhZCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgY2hlY2sgKz0gZXJyOwotICAgICAgICAgZGF0YSArPSByZWFkOwotICAgICAgICAgcmVtYWluaW5nIC09IHJlYWQ7Ci0gICAgICB9Ci0gICAgICB3aGlsZSAocmVtYWluaW5nICE9IDApOwotICAgfQotICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicmVhZCBFcnJvciIpOwotfQotI2VuZGlmIC8qIFVTRV9GQVJfS0VZV09SRCAqLwotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEKQotc3RhdGljIHZvaWQKLXBuZ3Rlc3RfZmx1c2gocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIC8qIERvIG5vdGhpbmc7IGZmbHVzaCgpIGlzIHNhaWQgdG8gYmUganVzdCBhIHdhc3RlIG9mIGVuZXJneS4gKi8KLSAgIHBuZ19wdHIgPSBwbmdfcHRyOyAgLyogU3RpZmxlIGNvbXBpbGVyIHdhcm5pbmcgKi8KLX0KLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGFjdHVhbCB3cml0aW5nIG9mIGRhdGEuICBJZiB5b3UgYXJlCi0gKiBub3Qgd3JpdGluZyB0byBhIHN0YW5kYXJkIEMgc3RyZWFtLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIHJlcGxhY2VtZW50Ci0gKiB3cml0ZV9kYXRhIGZ1bmN0aW9uIGFuZCB1c2UgaXQgYXQgcnVuIHRpbWUgd2l0aCBwbmdfc2V0X3dyaXRlX2ZuKCksIHJhdGhlcgotICogdGhhbiBjaGFuZ2luZyB0aGUgbGlicmFyeS4KLSAqLwotI2lmbmRlZiBVU0VfRkFSX0tFWVdPUkQKLXN0YXRpYyB2b2lkCi1wbmd0ZXN0X3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKQotewotICAgcG5nX3VpbnRfMzIgY2hlY2s7Ci0KLSAgIFdSSVRFRklMRSgocG5nX0ZJTEVfcClwbmdfcHRyLT5pb19wdHIsICBkYXRhLCBsZW5ndGgsIGNoZWNrKTsKLSAgIGlmIChjaGVjayAhPSBsZW5ndGgpCi0gICB7Ci0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIldyaXRlIEVycm9yIik7Ci0gICB9Ci19Ci0jZWxzZQotLyogVGhpcyBpcyB0aGUgbW9kZWwtaW5kZXBlbmRlbnQgdmVyc2lvbi4gU2luY2UgdGhlIHN0YW5kYXJkIEkvTyBsaWJyYXJ5Ci0gICBjYW4ndCBoYW5kbGUgZmFyIGJ1ZmZlcnMgaW4gdGhlIG1lZGl1bSBhbmQgc21hbGwgbW9kZWxzLCB3ZSBoYXZlIHRvIGNvcHkKLSAgIHRoZSBkYXRhLgotKi8KLQotI2RlZmluZSBORUFSX0JVRl9TSVpFIDEwMjQKLSNkZWZpbmUgTUlOKGEsYikgKGEgPD0gYiA/IGEgOiBiKQotCi1zdGF0aWMgdm9pZAotcG5ndGVzdF93cml0ZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIHBuZ191aW50XzMyIGNoZWNrOwotICAgcG5nX2J5dGUgKm5lYXJfZGF0YTsgIC8qIE5lZWRzIHRvIGJlICJwbmdfYnl0ZSAqIiBpbnN0ZWFkIG9mICJwbmdfYnl0ZXAiICovCi0gICBwbmdfRklMRV9wIGlvX3B0cjsKLQotICAgLyogQ2hlY2sgaWYgZGF0YSByZWFsbHkgaXMgbmVhci4gSWYgc28sIHVzZSB1c3VhbCBjb2RlLiAqLwotICAgbmVhcl9kYXRhID0gKHBuZ19ieXRlICopQ1ZUX1BUUl9OT0NIRUNLKGRhdGEpOwotICAgaW9fcHRyID0gKHBuZ19GSUxFX3ApQ1ZUX1BUUihwbmdfcHRyLT5pb19wdHIpOwotICAgaWYgKChwbmdfYnl0ZXApbmVhcl9kYXRhID09IGRhdGEpCi0gICB7Ci0gICAgICBXUklURUZJTEUoaW9fcHRyLCBuZWFyX2RhdGEsIGxlbmd0aCwgY2hlY2spOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgcG5nX2J5dGUgYnVmW05FQVJfQlVGX1NJWkVdOwotICAgICAgcG5nX3NpemVfdCB3cml0dGVuLCByZW1haW5pbmcsIGVycjsKLSAgICAgIGNoZWNrID0gMDsKLSAgICAgIHJlbWFpbmluZyA9IGxlbmd0aDsKLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgICB3cml0dGVuID0gTUlOKE5FQVJfQlVGX1NJWkUsIHJlbWFpbmluZyk7Ci0gICAgICAgICBwbmdfbWVtY3B5KGJ1ZiwgZGF0YSwgd3JpdHRlbik7IC8qIENvcHkgZmFyIGJ1ZmZlciB0byBuZWFyIGJ1ZmZlciAqLwotICAgICAgICAgV1JJVEVGSUxFKGlvX3B0ciwgYnVmLCB3cml0dGVuLCBlcnIpOwotICAgICAgICAgaWYgKGVyciAhPSB3cml0dGVuKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBjaGVjayArPSBlcnI7Ci0gICAgICAgICBkYXRhICs9IHdyaXR0ZW47Ci0gICAgICAgICByZW1haW5pbmcgLT0gd3JpdHRlbjsKLSAgICAgIH0KLSAgICAgIHdoaWxlIChyZW1haW5pbmcgIT0gMCk7Ci0gICB9Ci0gICBpZiAoY2hlY2sgIT0gbGVuZ3RoKQotICAgewotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJXcml0ZSBFcnJvciIpOwotICAgfQotfQotI2VuZGlmIC8qIFVTRV9GQVJfS0VZV09SRCAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgd2FybmluZywgYnV0IHRoZSBsaWJyYXJ5IHRoaW5rcwotICogaXQgY2FuIGNvbnRpbnVlIGFueXdheS4gIFJlcGxhY2VtZW50IGZ1bmN0aW9ucyBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nCi0gKiBoZXJlIGlmIHlvdSBkb24ndCB3YW50IHRvLiAgSW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgcG5nX3B0ciBpcwotICogbm90IHVzZWQsIGJ1dCBpdCBpcyBwYXNzZWQgaW4gY2FzZSBpdCBtYXkgYmUgdXNlZnVsLgotICovCi1zdGF0aWMgdm9pZAotcG5ndGVzdF93YXJuaW5nKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtZXNzYWdlKQotewotICAgUE5HX0NPTlNUIGNoYXIgKm5hbWUgPSAiVU5LTk9XTiAoRVJST1IhKSI7Ci0gICBpZiAocG5nX3B0ciAhPSBOVUxMICYmIHBuZ19wdHItPmVycm9yX3B0ciAhPSBOVUxMKQotICAgICAgbmFtZSA9IHBuZ19wdHItPmVycm9yX3B0cjsKLSAgIGZwcmludGYoU1RERVJSLCAiJXM6IGxpYnBuZyB3YXJuaW5nOiAlc1xuIiwgbmFtZSwgbWVzc2FnZSk7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb24uICBOb3RlIHRoYXQgcmVwbGFjZW1lbnRzIGZvcgotICogdGhpcyBmdW5jdGlvbiBNVVNUIE5PVCBSRVRVUk4sIG9yIHRoZSBwcm9ncmFtIHdpbGwgbGlrZWx5IGNyYXNoLiAgVGhpcwotICogZnVuY3Rpb24gaXMgdXNlZCBieSBkZWZhdWx0LCBvciBpZiB0aGUgcHJvZ3JhbSBzdXBwbGllcyBOVUxMIGZvciB0aGUKLSAqIGVycm9yIGZ1bmN0aW9uIHBvaW50ZXIgaW4gcG5nX3NldF9lcnJvcl9mbigpLgotICovCi1zdGF0aWMgdm9pZAotcG5ndGVzdF9lcnJvcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSkKLXsKLSAgIHBuZ3Rlc3Rfd2FybmluZyhwbmdfcHRyLCBtZXNzYWdlKTsKLSAgIC8qIFdlIGNhbiByZXR1cm4gYmVjYXVzZSBwbmdfZXJyb3IgY2FsbHMgdGhlIGRlZmF1bHQgaGFuZGxlciwgd2hpY2ggaXMKLSAgICAqIGFjdHVhbGx5IE9LIGluIHRoaXMgY2FzZS4KLSAgICAqLwotfQotI2VuZGlmIC8qIFBOR19OT19TVERJTyAqLwotLyogRU5EIG9mIGNvZGUgdG8gdmFsaWRhdGUgc3RkaW8tZnJlZSBjb21waWxhdGlvbiAqLwotCi0vKiBTVEFSVCBvZiBjb2RlIHRvIHZhbGlkYXRlIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gKi8KLSNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRwotCi0vKiBBbGxvY2F0ZSBtZW1vcnkuICBGb3IgcmVhc29uYWJsZSBmaWxlcywgc2l6ZSBzaG91bGQgbmV2ZXIgZXhjZWVkCi0gKiA2NEsuICBIb3dldmVyLCB6bGliIG1heSBhbGxvY2F0ZSBtb3JlIHRoZW4gNjRLIGlmIHlvdSBkb24ndCB0ZWxsCi0gKiBpdCBub3QgdG8uICBTZWUgemNvbmYuaCBhbmQgcG5nLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uICB6bGliIGRvZXMKLSAqIG5lZWQgdG8gYWxsb2NhdGUgZXhhY3RseSA2NEssIHNvIHdoYXRldmVyIHlvdSBjYWxsIGhlcmUgbXVzdAotICogaGF2ZSB0aGUgYWJpbGl0eSB0byBkbyB0aGF0LgotICoKLSAqIFRoaXMgcGllY2Ugb2YgY29kZSBjYW4gYmUgY29tcGlsZWQgdG8gdmFsaWRhdGUgbWF4IDY0SyBhbGxvY2F0aW9ucwotICogYnkgc2V0dGluZyBNQVhTRUdfNjRLIGluIHpsaWIgemNvbmYuaCAqb3IqIFBOR19NQVhfTUFMTE9DXzY0Sy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgbWVtb3J5X2luZm9ybWF0aW9uCi17Ci0gICBwbmdfdWludF8zMiAgICAgICAgICAgICAgIHNpemU7Ci0gICBwbmdfdm9pZHAgICAgICAgICAgICAgICAgIHBvaW50ZXI7Ci0gICBzdHJ1Y3QgbWVtb3J5X2luZm9ybWF0aW9uIEZBUiAqbmV4dDsKLX0gbWVtb3J5X2luZm9ybWF0aW9uOwotdHlwZWRlZiBtZW1vcnlfaW5mb3JtYXRpb24gRkFSICptZW1vcnlfaW5mb3A7Ci0KLXN0YXRpYyBtZW1vcnlfaW5mb3AgcGluZm9ybWF0aW9uID0gTlVMTDsKLXN0YXRpYyBpbnQgY3VycmVudF9hbGxvY2F0aW9uID0gMDsKLXN0YXRpYyBpbnQgbWF4aW11bV9hbGxvY2F0aW9uID0gMDsKLXN0YXRpYyBpbnQgdG90YWxfYWxsb2NhdGlvbiA9IDA7Ci1zdGF0aWMgaW50IG51bV9hbGxvY2F0aW9ucyA9IDA7Ci0KLXBuZ192b2lkcCBwbmdfZGVidWdfbWFsbG9jIFBOR0FSRygocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgc2l6ZSkpOwotdm9pZCBwbmdfZGVidWdfZnJlZSBQTkdBUkcoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpKTsKLQotcG5nX3ZvaWRwCi1wbmdfZGVidWdfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCi17Ci0KLSAgIC8qIHBuZ19tYWxsb2MgaGFzIGFscmVhZHkgdGVzdGVkIGZvciBOVUxMOyBwbmdfY3JlYXRlX3N0cnVjdCBjYWxscwotICAgICogcG5nX2RlYnVnX21hbGxvYyBkaXJlY3RseSwgd2l0aCBwbmdfcHRyID09IE5VTEwgd2hpY2ggaXMgT0sKLSAgICAqLwotCi0gICBpZiAoc2l6ZSA9PSAwKQotICAgICAgcmV0dXJuIChOVUxMKTsKLQotICAgLyogVGhpcyBjYWxscyB0aGUgbGlicmFyeSBhbGxvY2F0b3IgdHdpY2UsIG9uY2UgdG8gZ2V0IHRoZSByZXF1ZXN0ZWQKLSAgICAgIGJ1ZmZlciBhbmQgb25jZSB0byBnZXQgYSBuZXcgZnJlZSBsaXN0IGVudHJ5LiAqLwotICAgewotICAgICAgLyogRGlzYWJsZSBtYWxsb2NfZm4gYW5kIGZyZWVfZm4gKi8KLSAgICAgIG1lbW9yeV9pbmZvcCBwaW5mbzsKLSAgICAgIHBuZ19zZXRfbWVtX2ZuKHBuZ19wdHIsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgICAgcGluZm8gPSAobWVtb3J5X2luZm9wKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgIChwbmdfdWludF8zMilwbmdfc2l6ZW9mKCpwaW5mbykpOwotICAgICAgcGluZm8tPnNpemUgPSBzaXplOwotICAgICAgY3VycmVudF9hbGxvY2F0aW9uICs9IHNpemU7Ci0gICAgICB0b3RhbF9hbGxvY2F0aW9uICs9IHNpemU7Ci0gICAgICBudW1fYWxsb2NhdGlvbnMgKys7Ci0gICAgICBpZiAoY3VycmVudF9hbGxvY2F0aW9uID4gbWF4aW11bV9hbGxvY2F0aW9uKQotICAgICAgICAgbWF4aW11bV9hbGxvY2F0aW9uID0gY3VycmVudF9hbGxvY2F0aW9uOwotICAgICAgcGluZm8tPnBvaW50ZXIgPSAocG5nX3ZvaWRwKXBuZ19tYWxsb2MocG5nX3B0ciwgc2l6ZSk7Ci0gICAgICAvKiBSZXN0b3JlIG1hbGxvY19mbiBhbmQgZnJlZV9mbiAqLwotICAgICAgcG5nX3NldF9tZW1fZm4ocG5nX3B0ciwKLSAgICAgICAgICBwbmdfdm9pZHBfTlVMTCwgKHBuZ19tYWxsb2NfcHRyKXBuZ19kZWJ1Z19tYWxsb2MsCi0gICAgICAgICAgKHBuZ19mcmVlX3B0cilwbmdfZGVidWdfZnJlZSk7Ci0gICAgICBpZiAoc2l6ZSAhPSAwICYmIHBpbmZvLT5wb2ludGVyID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24gLT0gc2l6ZTsKLSAgICAgICAgIHRvdGFsX2FsbG9jYXRpb24gLT0gc2l6ZTsKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAotICAgICAgICAgICAib3V0IG9mIG1lbW9yeSBpbiBwbmd0ZXN0LT5wbmdfZGVidWdfbWFsbG9jLiIpOwotICAgICAgfQotICAgICAgcGluZm8tPm5leHQgPSBwaW5mb3JtYXRpb247Ci0gICAgICBwaW5mb3JtYXRpb24gPSBwaW5mbzsKLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgY2FsbGVyIGlzbid0IGFzc3VtaW5nIHplcm9lZCBtZW1vcnkuICovCi0gICAgICBwbmdfbWVtc2V0KHBpbmZvLT5wb2ludGVyLCAweGRkLCBwaW5mby0+c2l6ZSk7Ci0gICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgIHByaW50ZigicG5nX21hbGxvYyAlbHUgYnl0ZXMgYXQgJXhcbiIsICh1bnNpZ25lZCBsb25nKXNpemUsCi0gICAgICAgICAgICBwaW5mby0+cG9pbnRlcik7Ci0gICAgICByZXR1cm4gKHBuZ192b2lkcCkocGluZm8tPnBvaW50ZXIpOwotICAgfQotfQotCi0vKiBGcmVlIGEgcG9pbnRlci4gIEl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhdCB0aGUgc2FtZSB0aW1lLiAqLwotdm9pZAotcG5nX2RlYnVnX2ZyZWUocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICBmcHJpbnRmKFNUREVSUiwgIk5VTEwgcG9pbnRlciB0byBwbmdfZGVidWdfZnJlZS5cbiIpOwotICAgaWYgKHB0ciA9PSAwKQotICAgewotI2lmIDAgLyogVGhpcyBoYXBwZW5zIGFsbCB0aGUgdGltZS4gKi8KLSAgICAgIGZwcmludGYoU1RERVJSLCAiV0FSTklORzogZnJlZWluZyBOVUxMIHBvaW50ZXJcbiIpOwotI2VuZGlmCi0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIC8qIFVubGluayB0aGUgZWxlbWVudCBmcm9tIHRoZSBsaXN0LiAqLwotICAgewotICAgICAgbWVtb3J5X2luZm9wIEZBUiAqcHBpbmZvID0gJnBpbmZvcm1hdGlvbjsKLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgICBtZW1vcnlfaW5mb3AgcGluZm8gPSAqcHBpbmZvOwotICAgICAgICAgaWYgKHBpbmZvLT5wb2ludGVyID09IHB0cikKLSAgICAgICAgIHsKLSAgICAgICAgICAgICpwcGluZm8gPSBwaW5mby0+bmV4dDsKLSAgICAgICAgICAgIGN1cnJlbnRfYWxsb2NhdGlvbiAtPSBwaW5mby0+c2l6ZTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50X2FsbG9jYXRpb24gPCAwKQotICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJEdXBsaWNhdGUgZnJlZSBvZiBtZW1vcnlcbiIpOwotICAgICAgICAgICAgLyogV2UgbXVzdCBmcmVlIHRoZSBsaXN0IGVsZW1lbnQgdG9vLCBidXQgZmlyc3Qga2lsbAotICAgICAgICAgICAgICAgdGhlIG1lbW9yeSB0aGF0IGlzIHRvIGJlIGZyZWVkLiAqLwotICAgICAgICAgICAgcG5nX21lbXNldChwdHIsIDB4NTUsIHBpbmZvLT5zaXplKTsKLSAgICAgICAgICAgIHBuZ19mcmVlX2RlZmF1bHQocG5nX3B0ciwgcGluZm8pOwotICAgICAgICAgICAgcGluZm8gPSBOVUxMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAocGluZm8tPm5leHQgPT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiUG9pbnRlciAleCBub3QgZm91bmRcbiIsICh1bnNpZ25lZCBpbnQpcHRyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgcHBpbmZvID0gJnBpbmZvLT5uZXh0OwotICAgICAgfQotICAgfQotCi0gICAvKiBGaW5hbGx5IGZyZWUgdGhlIGRhdGEuICovCi0gICBpZiAodmVyYm9zZSkKLSAgICAgIHByaW50ZigiRnJlZWluZyAleFxuIiwgcHRyKTsKLSAgIHBuZ19mcmVlX2RlZmF1bHQocG5nX3B0ciwgcHRyKTsKLSAgIHB0ciA9IE5VTEw7Ci19Ci0jZW5kaWYgLyogUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCAmJiBQTkdfREVCVUcgKi8KLS8qIEVORCBvZiBjb2RlIHRvIHRlc3QgbWVtb3J5IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uICovCi0KLQotLyogRGVtb25zdHJhdGlvbiBvZiB1c2VyIGNodW5rIHN1cHBvcnQgb2YgdGhlIHNURVIgYW5kIHZwQWcgY2h1bmtzICovCi0jaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotCi0vKiAoc1RFUiBpcyBhIHB1YmxpYyBjaHVuayBub3QgeWV0IGtub3duIGJ5IGxpYnBuZy4gIHZwQWcgaXMgYSBwcml2YXRlCi1jaHVuayB1c2VkIGluIEltYWdlTWFnaWNrIHRvIHN0b3JlICJ2aXJ0dWFsIHBhZ2UiIHNpemUpLiAgKi8KLQotc3RhdGljIHBuZ191aW50XzMyIHVzZXJfY2h1bmtfZGF0YVs0XTsKLQotICAgIC8qIDA6IHNURVIgbW9kZSArIDEKLSAgICAgKiAxOiB2cEFnIHdpZHRoCi0gICAgICogMjogdnBBZyBoZWlnaHQKLSAgICAgKiAzOiB2cEFnIHVuaXRzCi0gICAgICovCi0KLXN0YXRpYyBpbnQgcmVhZF91c2VyX2NodW5rX2NhbGxiYWNrKHBuZ19zdHJ1Y3QgKnBuZ19wdHIsCi0gICBwbmdfdW5rbm93bl9jaHVua3AgY2h1bmspCi17Ci0gICBwbmdfdWludF8zMgotICAgICAqbXlfdXNlcl9jaHVua19kYXRhOwotCi0gICAvKiBSZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgKiAgICByZXR1cm4gKC1uKTsgIGNodW5rIGhhZCBhbiBlcnJvcgotICAgICogICAgcmV0dXJuICgwKTsgIGRpZCBub3QgcmVjb2duaXplCi0gICAgKiAgICByZXR1cm4gKG4pOyAgc3VjY2VzcwotICAgICoKLSAgICAqIFRoZSB1bmtub3duIGNodW5rIHN0cnVjdHVyZSBjb250YWlucyB0aGUgY2h1bmsgZGF0YToKLSAgICAqIHBuZ19ieXRlIG5hbWVbNV07Ci0gICAgKiBwbmdfYnl0ZSAqZGF0YTsKLSAgICAqIHBuZ19zaXplX3Qgc2l6ZTsKLSAgICAqCi0gICAgKiBOb3RlIHRoYXQgbGlicG5nIGhhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgdGhlIENSQyBoYW5kbGluZy4KLSAgICAqLwotCi0gICBpZiAoY2h1bmstPm5hbWVbMF0gPT0gMTE1ICYmIGNodW5rLT5uYW1lWzFdID09ICA4NCAmJiAgICAgLyogcyAgVCAqLwotICAgICAgIGNodW5rLT5uYW1lWzJdID09ICA2OSAmJiBjaHVuay0+bmFtZVszXSA9PSAgODIpICAgICAgIC8qIEUgIFIgKi8KLSAgICAgIHsKLSAgICAgICAgIC8qIEZvdW5kIHNURVIgY2h1bmsgKi8KLSAgICAgICAgIGlmIChjaHVuay0+c2l6ZSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuICgtMSk7IC8qIEVycm9yIHJldHVybiAqLwotICAgICAgICAgaWYgKGNodW5rLT5kYXRhWzBdICE9IDAgJiYgY2h1bmstPmRhdGFbMF0gIT0gMSkKLSAgICAgICAgICAgIHJldHVybiAoLTEpOyAgLyogSW52YWxpZCBtb2RlICovCi0gICAgICAgICBteV91c2VyX2NodW5rX2RhdGE9KHBuZ191aW50XzMyICopIHBuZ19nZXRfdXNlcl9jaHVua19wdHIocG5nX3B0cik7Ci0gICAgICAgICBteV91c2VyX2NodW5rX2RhdGFbMF09Y2h1bmstPmRhdGFbMF0rMTsKLSAgICAgICAgIHJldHVybiAoMSk7Ci0gICAgICB9Ci0KLSAgIGlmIChjaHVuay0+bmFtZVswXSAhPSAxMTggfHwgY2h1bmstPm5hbWVbMV0gIT0gMTEyIHx8ICAgIC8qIHYgIHAgKi8KLSAgICAgICBjaHVuay0+bmFtZVsyXSAhPSAgNjUgfHwgY2h1bmstPm5hbWVbM10gIT0gMTAzKSAgICAgIC8qIEEgIGcgKi8KLSAgICAgIHJldHVybiAoMCk7IC8qIERpZCBub3QgcmVjb2duaXplICovCi0KLSAgIC8qIEZvdW5kIEltYWdlTWFnaWNrIHZwQWcgY2h1bmsgKi8KLQotICAgaWYgKGNodW5rLT5zaXplICE9IDkpCi0gICAgICByZXR1cm4gKC0xKTsgLyogRXJyb3IgcmV0dXJuICovCi0KLSAgIG15X3VzZXJfY2h1bmtfZGF0YT0ocG5nX3VpbnRfMzIgKikgcG5nX2dldF91c2VyX2NodW5rX3B0cihwbmdfcHRyKTsKLQotICAgbXlfdXNlcl9jaHVua19kYXRhWzFdPXBuZ19nZXRfdWludF8zMShwbmdfcHRyLCBjaHVuay0+ZGF0YSk7Ci0gICBteV91c2VyX2NodW5rX2RhdGFbMl09cG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGNodW5rLT5kYXRhICsgNCk7Ci0gICBteV91c2VyX2NodW5rX2RhdGFbM109KHBuZ191aW50XzMyKWNodW5rLT5kYXRhWzhdOwotCi0gICByZXR1cm4gKDEpOwotCi19Ci0jZW5kaWYKLS8qIEVORCBvZiBjb2RlIHRvIGRlbW9uc3RyYXRlIHVzZXIgY2h1bmsgc3VwcG9ydCAqLwotCi0vKiBUZXN0IG9uZSBmaWxlICovCi1pbnQKLXRlc3Rfb25lX2ZpbGUoUE5HX0NPTlNUIGNoYXIgKmlubmFtZSwgUE5HX0NPTlNUIGNoYXIgKm91dG5hbWUpCi17Ci0gICBzdGF0aWMgcG5nX0ZJTEVfcCBmcGluOwotICAgc3RhdGljIHBuZ19GSUxFX3AgZnBvdXQ7ICAvKiAic3RhdGljIiBwcmV2ZW50cyBzZXRqbXAgY29ycnVwdGlvbiAqLwotICAgcG5nX3N0cnVjdHAgcmVhZF9wdHI7Ci0gICBwbmdfaW5mb3AgcmVhZF9pbmZvX3B0ciwgZW5kX2luZm9fcHRyOwotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLSAgIHBuZ19zdHJ1Y3RwIHdyaXRlX3B0cjsKLSAgIHBuZ19pbmZvcCB3cml0ZV9pbmZvX3B0cjsKLSAgIHBuZ19pbmZvcCB3cml0ZV9lbmRfaW5mb19wdHI7Ci0jZWxzZQotICAgcG5nX3N0cnVjdHAgd3JpdGVfcHRyID0gTlVMTDsKLSAgIHBuZ19pbmZvcCB3cml0ZV9pbmZvX3B0ciA9IE5VTEw7Ci0gICBwbmdfaW5mb3Agd3JpdGVfZW5kX2luZm9fcHRyID0gTlVMTDsKLSNlbmRpZgotICAgcG5nX2J5dGVwIHJvd19idWY7Ci0gICBwbmdfdWludF8zMiB5OwotICAgcG5nX3VpbnRfMzIgd2lkdGgsIGhlaWdodDsKLSAgIGludCBudW1fcGFzcywgcGFzczsKLSAgIGludCBiaXRfZGVwdGgsIGNvbG9yX3R5cGU7Ci0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKLSAgIGptcF9idWYgam1wYnVmOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKLSAgIFRDSEFSIHBhdGhbTUFYX1BBVEhdOwotI2VuZGlmCi0gICBjaGFyIGluYnVmWzI1Nl0sIG91dGJ1ZlsyNTZdOwotCi0gICByb3dfYnVmID0gTlVMTDsKLQotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKLSAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBpbm5hbWUsIC0xLCBwYXRoLCBNQVhfUEFUSCk7Ci0gICBpZiAoKGZwaW4gPSBDcmVhdGVGaWxlKHBhdGgsIEdFTkVSSUNfUkVBRCwgMCwgTlVMTCwgT1BFTl9FWElTVElORywgMCwgTlVMTCkpID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotI2Vsc2UKLSAgIGlmICgoZnBpbiA9IGZvcGVuKGlubmFtZSwgInJiIikpID09IE5VTEwpCi0jZW5kaWYKLSAgIHsKLSAgICAgIGZwcmludGYoU1RERVJSLCAiQ291bGQgbm90IGZpbmQgaW5wdXQgZmlsZSAlc1xuIiwgaW5uYW1lKTsKLSAgICAgIHJldHVybiAoMSk7Ci0gICB9Ci0KLSNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgb3V0bmFtZSwgLTEsIHBhdGgsIE1BWF9QQVRIKTsKLSAgIGlmICgoZnBvdXQgPSBDcmVhdGVGaWxlKHBhdGgsIEdFTkVSSUNfV1JJVEUsIDAsIE5VTEwsIENSRUFURV9BTFdBWVMsIDAsIE5VTEwpKSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSNlbHNlCi0gICBpZiAoKGZwb3V0ID0gZm9wZW4ob3V0bmFtZSwgIndiIikpID09IE5VTEwpCi0jZW5kaWYKLSAgIHsKLSAgICAgIGZwcmludGYoU1RERVJSLCAiQ291bGQgbm90IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIG91dG5hbWUpOwotICAgICAgRkNMT1NFKGZwaW4pOwotICAgICAgcmV0dXJuICgxKTsKLSAgIH0KLQotICAgcG5nX2RlYnVnKDAsICJBbGxvY2F0aW5nIHJlYWQgYW5kIHdyaXRlIHN0cnVjdHVyZXMiKTsKLSNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRwotICAgcmVhZF9wdHIgPQotICAgICAgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKFBOR19MSUJQTkdfVkVSX1NUUklORywgcG5nX3ZvaWRwX05VTEwsCi0gICAgICBwbmdfZXJyb3JfcHRyX05VTEwsIHBuZ19lcnJvcl9wdHJfTlVMTCwgcG5nX3ZvaWRwX05VTEwsCi0gICAgICAocG5nX21hbGxvY19wdHIpcG5nX2RlYnVnX21hbGxvYywgKHBuZ19mcmVlX3B0cilwbmdfZGVidWdfZnJlZSk7Ci0jZWxzZQotICAgcmVhZF9wdHIgPQotICAgICAgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHBuZ192b2lkcF9OVUxMLAotICAgICAgcG5nX2Vycm9yX3B0cl9OVUxMLCBwbmdfZXJyb3JfcHRyX05VTEwpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfTk9fU1RESU8pCi0gICBwbmdfc2V0X2Vycm9yX2ZuKHJlYWRfcHRyLCAocG5nX3ZvaWRwKWlubmFtZSwgcG5ndGVzdF9lcnJvciwKLSAgICAgICBwbmd0ZXN0X3dhcm5pbmcpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICB1c2VyX2NodW5rX2RhdGFbMF0gPSAwOwotICAgdXNlcl9jaHVua19kYXRhWzFdID0gMDsKLSAgIHVzZXJfY2h1bmtfZGF0YVsyXSA9IDA7Ci0gICB1c2VyX2NodW5rX2RhdGFbM10gPSAwOwotICAgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4ocmVhZF9wdHIsIHVzZXJfY2h1bmtfZGF0YSwKLSAgICAgcmVhZF91c2VyX2NodW5rX2NhbGxiYWNrKTsKLQotI2VuZGlmCi0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCi0gICB3cml0ZV9wdHIgPQotICAgICAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMihQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHBuZ192b2lkcF9OVUxMLAotICAgICAgcG5nX2Vycm9yX3B0cl9OVUxMLCBwbmdfZXJyb3JfcHRyX05VTEwsIHBuZ192b2lkcF9OVUxMLAotICAgICAgKHBuZ19tYWxsb2NfcHRyKXBuZ19kZWJ1Z19tYWxsb2MsIChwbmdfZnJlZV9wdHIpcG5nX2RlYnVnX2ZyZWUpOwotI2Vsc2UKLSAgIHdyaXRlX3B0ciA9Ci0gICAgICBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHBuZ192b2lkcF9OVUxMLAotICAgICAgcG5nX2Vycm9yX3B0cl9OVUxMLCBwbmdfZXJyb3JfcHRyX05VTEwpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfTk9fU1RESU8pCi0gICBwbmdfc2V0X2Vycm9yX2ZuKHdyaXRlX3B0ciwgKHBuZ192b2lkcClpbm5hbWUsIHBuZ3Rlc3RfZXJyb3IsCi0gICAgICAgcG5ndGVzdF93YXJuaW5nKTsKLSNlbmRpZgotI2VuZGlmCi0gICBwbmdfZGVidWcoMCwgIkFsbG9jYXRpbmcgcmVhZF9pbmZvLCB3cml0ZV9pbmZvIGFuZCBlbmRfaW5mbyBzdHJ1Y3R1cmVzIik7Ci0gICByZWFkX2luZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChyZWFkX3B0cik7Ci0gICBlbmRfaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHJlYWRfcHRyKTsKLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICB3cml0ZV9pbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3Qod3JpdGVfcHRyKTsKLSAgIHdyaXRlX2VuZF9pbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3Qod3JpdGVfcHRyKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSAgIHBuZ19kZWJ1ZygwLCAiU2V0dGluZyBqbXBidWYgZm9yIHJlYWQgc3RydWN0Iik7Ci0jaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICBpZiAoc2V0am1wKGptcGJ1ZikpCi0jZWxzZQotICAgaWYgKHNldGptcChwbmdfam1wYnVmKHJlYWRfcHRyKSkpCi0jZW5kaWYKLSAgIHsKLSAgICAgIGZwcmludGYoU1RERVJSLCAiJXMgLT4gJXM6IGxpYnBuZyByZWFkIGVycm9yXG4iLCBpbm5hbWUsIG91dG5hbWUpOwotICAgICAgcG5nX2ZyZWUocmVhZF9wdHIsIHJvd19idWYpOwotICAgICAgcm93X2J1ZiA9IE5VTEw7Ci0gICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcmVhZF9wdHIsICZyZWFkX2luZm9fcHRyLCAmZW5kX2luZm9fcHRyKTsKLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICAgICBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdCh3cml0ZV9wdHIsICZ3cml0ZV9lbmRfaW5mb19wdHIpOwotICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZ3cml0ZV9wdHIsICZ3cml0ZV9pbmZvX3B0cik7Ci0jZW5kaWYKLSAgICAgIEZDTE9TRShmcGluKTsKLSAgICAgIEZDTE9TRShmcG91dCk7Ci0gICAgICByZXR1cm4gKDEpOwotICAgfQotI2lmZGVmIFVTRV9GQVJfS0VZV09SRAotICAgcG5nX21lbWNweShwbmdfam1wYnVmKHJlYWRfcHRyKSwgam1wYnVmLCBwbmdfc2l6ZW9mKGptcF9idWYpKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotICAgcG5nX2RlYnVnKDAsICJTZXR0aW5nIGptcGJ1ZiBmb3Igd3JpdGUgc3RydWN0Iik7Ci0jaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICBpZiAoc2V0am1wKGptcGJ1ZikpCi0jZWxzZQotICAgaWYgKHNldGptcChwbmdfam1wYnVmKHdyaXRlX3B0cikpKQotI2VuZGlmCi0gICB7Ci0gICAgICBmcHJpbnRmKFNUREVSUiwgIiVzIC0+ICVzOiBsaWJwbmcgd3JpdGUgZXJyb3JcbiIsIGlubmFtZSwgb3V0bmFtZSk7Ci0gICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcmVhZF9wdHIsICZyZWFkX2luZm9fcHRyLCAmZW5kX2luZm9fcHRyKTsKLSAgICAgIHBuZ19kZXN0cm95X2luZm9fc3RydWN0KHdyaXRlX3B0ciwgJndyaXRlX2VuZF9pbmZvX3B0cik7Ci0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZ3cml0ZV9wdHIsICZ3cml0ZV9pbmZvX3B0cik7Ci0jZW5kaWYKLSAgICAgIEZDTE9TRShmcGluKTsKLSAgICAgIEZDTE9TRShmcG91dCk7Ci0gICAgICByZXR1cm4gKDEpOwotICAgfQotI2lmZGVmIFVTRV9GQVJfS0VZV09SRAotICAgcG5nX21lbWNweShwbmdfam1wYnVmKHdyaXRlX3B0ciksIGptcGJ1ZiwgcG5nX3NpemVvZihqbXBfYnVmKSk7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSAgIHBuZ19kZWJ1ZygwLCAiSW5pdGlhbGl6aW5nIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcyIpOwotI2lmICFkZWZpbmVkKFBOR19OT19TVERJTykKLSAgIHBuZ19pbml0X2lvKHJlYWRfcHRyLCBmcGluKTsKLSMgIGlmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLSAgIHBuZ19pbml0X2lvKHdyaXRlX3B0ciwgZnBvdXQpOwotIyAgZW5kaWYKLSNlbHNlCi0gICBwbmdfc2V0X3JlYWRfZm4ocmVhZF9wdHIsIChwbmdfdm9pZHApZnBpbiwgcG5ndGVzdF9yZWFkX2RhdGEpOwotIyAgaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotICAgcG5nX3NldF93cml0ZV9mbih3cml0ZV9wdHIsIChwbmdfdm9pZHApZnBvdXQsICBwbmd0ZXN0X3dyaXRlX2RhdGEsCi0jICAgIGlmIGRlZmluZWQoUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCkKLSAgICAgIHBuZ3Rlc3RfZmx1c2gpOwotIyAgICBlbHNlCi0gICAgICBOVUxMKTsKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLSAgIGlmIChzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPT0gMSkKLSAgIHsKLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICAgICBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbih3cml0ZV9wdHIsIHdyaXRlX3Jvd19jYWxsYmFjayk7Ci0jZW5kaWYKLSAgICAgIHBuZ19zZXRfcmVhZF9zdGF0dXNfZm4ocmVhZF9wdHIsIHJlYWRfcm93X2NhbGxiYWNrKTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICAgICBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbih3cml0ZV9wdHIsIHBuZ193cml0ZV9zdGF0dXNfcHRyX05VTEwpOwotI2VuZGlmCi0gICAgICBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuKHJlYWRfcHRyLCBwbmdfcmVhZF9zdGF0dXNfcHRyX05VTEwpOwotICAgfQotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCi0gICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGk8MjU2OyBpKyspCi0gICAgICAgICBmaWx0ZXJzX3VzZWRbaV0gPSAwOwotICAgICAgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKHJlYWRfcHRyLCBjb3VudF9maWx0ZXJzKTsKLSAgIH0KLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKLSAgIHplcm9fc2FtcGxlcyA9IDA7Ci0gICBwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuKHdyaXRlX3B0ciwgY291bnRfemVyb19zYW1wbGVzKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0jICBpZm5kZWYgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMKLSMgICAgZGVmaW5lIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTICAgICAgIDMKLSMgIGVuZGlmCi0gICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTLAotICAgICAgcG5nX2J5dGVwX05VTEwsIDApOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotIyAgaWZuZGVmIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRQotIyAgICBkZWZpbmUgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICAgICAgMgotIyAgZW5kaWYKLSAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyh3cml0ZV9wdHIsIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSwKLSAgICAgIHBuZ19ieXRlcF9OVUxMLCAwKTsKLSNlbmRpZgotCi0gICBwbmdfZGVidWcoMCwgIlJlYWRpbmcgaW5mbyBzdHJ1Y3QiKTsKLSAgIHBuZ19yZWFkX2luZm8ocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIpOwotCi0gICBwbmdfZGVidWcoMCwgIlRyYW5zZmVycmluZyBpbmZvIHN0cnVjdCIpOwotICAgewotICAgICAgaW50IGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfdHlwZTsKLQotICAgICAgaWYgKHBuZ19nZXRfSUhEUihyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LCAmYml0X2RlcHRoLAotICAgICAgICAgICZjb2xvcl90eXBlLCAmaW50ZXJsYWNlX3R5cGUsICZjb21wcmVzc2lvbl90eXBlLCAmZmlsdGVyX3R5cGUpKQotICAgICAgewotICAgICAgICAgcG5nX3NldF9JSERSKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwKLSNpZiBkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCi0gICAgICAgICAgICBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgZmlsdGVyX3R5cGUpOwotI2Vsc2UKLSAgICAgICAgICAgIGNvbG9yX3R5cGUsIFBOR19JTlRFUkxBQ0VfTk9ORSwgY29tcHJlc3Npb25fdHlwZSwgZmlsdGVyX3R5cGUpOwotI2VuZGlmCi0gICAgICB9Ci0gICB9Ci0jaWYgZGVmaW5lZChQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEKQotI2lmIGRlZmluZWQoUE5HX2NIUk1fU1VQUE9SVEVEKQotICAgewotICAgICAgcG5nX2ZpeGVkX3BvaW50IHdoaXRlX3gsIHdoaXRlX3ksIHJlZF94LCByZWRfeSwgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LAotICAgICAgICAgYmx1ZV95OwotICAgICAgaWYgKHBuZ19nZXRfY0hSTV9maXhlZChyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJndoaXRlX3gsICZ3aGl0ZV95LCAmcmVkX3gsCi0gICAgICAgICAmcmVkX3ksICZncmVlbl94LCAmZ3JlZW5feSwgJmJsdWVfeCwgJmJsdWVfeSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2V0X2NIUk1fZml4ZWQod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsCi0gICAgICAgICAgICByZWRfeSwgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3kpOwotICAgICAgfQotICAgfQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfZ0FNQV9TVVBQT1JURUQpCi0gICB7Ci0gICAgICBwbmdfZml4ZWRfcG9pbnQgZ2FtbWE7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X2dBTUFfZml4ZWQocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZnYW1tYSkpCi0gICAgICAgICBwbmdfc2V0X2dBTUFfZml4ZWQod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgZ2FtbWEpOwotICAgfQotI2VuZGlmCi0jZWxzZSAvKiBVc2UgZmxvYXRpbmcgcG9pbnQgdmVyc2lvbnMgKi8KLSNpZiBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCi0jaWYgZGVmaW5lZChQTkdfY0hSTV9TVVBQT1JURUQpCi0gICB7Ci0gICAgICBkb3VibGUgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsCi0gICAgICAgICBibHVlX3k7Ci0gICAgICBpZiAocG5nX2dldF9jSFJNKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmd2hpdGVfeCwgJndoaXRlX3ksICZyZWRfeCwKLSAgICAgICAgICZyZWRfeSwgJmdyZWVuX3gsICZncmVlbl95LCAmYmx1ZV94LCAmYmx1ZV95KSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zZXRfY0hSTSh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB3aGl0ZV94LCB3aGl0ZV95LCByZWRfeCwKLSAgICAgICAgICAgIHJlZF95LCBncmVlbl94LCBncmVlbl95LCBibHVlX3gsIGJsdWVfeSk7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19nQU1BX1NVUFBPUlRFRCkKLSAgIHsKLSAgICAgIGRvdWJsZSBnYW1tYTsKLQotICAgICAgaWYgKHBuZ19nZXRfZ0FNQShyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJmdhbW1hKSkKLSAgICAgICAgIHBuZ19zZXRfZ0FNQSh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBnYW1tYSk7Ci0gICB9Ci0jZW5kaWYKLSNlbmRpZiAvKiBGbG9hdGluZyBwb2ludCAqLwotI2VuZGlmIC8qIEZpeGVkIHBvaW50ICovCi0jaWYgZGVmaW5lZChQTkdfaUNDUF9TVVBQT1JURUQpCi0gICB7Ci0gICAgICBwbmdfY2hhcnAgbmFtZTsKLSAgICAgIHBuZ19jaGFycCBwcm9maWxlOwotICAgICAgcG5nX3VpbnRfMzIgcHJvZmxlbjsKLSAgICAgIGludCBjb21wcmVzc2lvbl90eXBlOwotCi0gICAgICBpZiAocG5nX2dldF9pQ0NQKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmbmFtZSwgJmNvbXByZXNzaW9uX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgJnByb2ZpbGUsICZwcm9mbGVuKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zZXRfaUNDUCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBuYW1lLCBjb21wcmVzc2lvbl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIHByb2ZsZW4pOwotICAgICAgfQotICAgfQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfc1JHQl9TVVBQT1JURUQpCi0gICB7Ci0gICAgICBpbnQgaW50ZW50OwotCi0gICAgICBpZiAocG5nX2dldF9zUkdCKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmaW50ZW50KSkKLSAgICAgICAgIHBuZ19zZXRfc1JHQih3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBpbnRlbnQpOwotICAgfQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfY29sb3JwIHBhbGV0dGU7Ci0gICAgICBpbnQgbnVtX3BhbGV0dGU7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X1BMVEUocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZwYWxldHRlLCAmbnVtX3BhbGV0dGUpKQotICAgICAgICAgcG5nX3NldF9QTFRFKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHBhbGV0dGUsIG51bV9wYWxldHRlKTsKLSAgIH0KLSNpZiBkZWZpbmVkKFBOR19iS0dEX1NVUFBPUlRFRCkKLSAgIHsKLSAgICAgIHBuZ19jb2xvcl8xNnAgYmFja2dyb3VuZDsKLQotICAgICAgaWYgKHBuZ19nZXRfYktHRChyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJmJhY2tncm91bmQpKQotICAgICAgewotICAgICAgICAgcG5nX3NldF9iS0dEKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIGJhY2tncm91bmQpOwotICAgICAgfQotICAgfQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfaElTVF9TVVBQT1JURUQpCi0gICB7Ci0gICAgICBwbmdfdWludF8xNnAgaGlzdDsKLQotICAgICAgaWYgKHBuZ19nZXRfaElTVChyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJmhpc3QpKQotICAgICAgICAgcG5nX3NldF9oSVNUKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIGhpc3QpOwotICAgfQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfb0ZGc19TVVBQT1JURUQpCi0gICB7Ci0gICAgICBwbmdfaW50XzMyIG9mZnNldF94LCBvZmZzZXRfeTsKLSAgICAgIGludCB1bml0X3R5cGU7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X29GRnMocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZvZmZzZXRfeCwgJm9mZnNldF95LAotICAgICAgICAgICZ1bml0X3R5cGUpKQotICAgICAgewotICAgICAgICAgcG5nX3NldF9vRkZzKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIG9mZnNldF94LCBvZmZzZXRfeSwgdW5pdF90eXBlKTsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX3BDQUxfU1VQUE9SVEVEKQotICAgewotICAgICAgcG5nX2NoYXJwIHB1cnBvc2UsIHVuaXRzOwotICAgICAgcG5nX2NoYXJwcCBwYXJhbXM7Ci0gICAgICBwbmdfaW50XzMyIFgwLCBYMTsKLSAgICAgIGludCB0eXBlLCBucGFyYW1zOwotCi0gICAgICBpZiAocG5nX2dldF9wQ0FMKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmcHVycG9zZSwgJlgwLCAmWDEsICZ0eXBlLAotICAgICAgICAgJm5wYXJhbXMsICZ1bml0cywgJnBhcmFtcykpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2V0X3BDQUwod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgcHVycG9zZSwgWDAsIFgxLCB0eXBlLAotICAgICAgICAgICAgbnBhcmFtcywgdW5pdHMsIHBhcmFtcyk7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19wSFlzX1NVUFBPUlRFRCkKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIHJlc194LCByZXNfeTsKLSAgICAgIGludCB1bml0X3R5cGU7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X3BIWXMocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZyZXNfeCwgJnJlc195LCAmdW5pdF90eXBlKSkKLSAgICAgICAgIHBuZ19zZXRfcEhZcyh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCByZXNfeCwgcmVzX3ksIHVuaXRfdHlwZSk7Ci0gICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19zQklUX1NVUFBPUlRFRCkKLSAgIHsKLSAgICAgIHBuZ19jb2xvcl84cCBzaWdfYml0OwotCi0gICAgICBpZiAocG5nX2dldF9zQklUKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmc2lnX2JpdCkpCi0gICAgICAgICBwbmdfc2V0X3NCSVQod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgc2lnX2JpdCk7Ci0gICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkKLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICB7Ci0gICAgICBpbnQgdW5pdDsKLSAgICAgIGRvdWJsZSBzY2FsX3dpZHRoLCBzY2FsX2hlaWdodDsKLQotICAgICAgaWYgKHBuZ19nZXRfc0NBTChyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJnVuaXQsICZzY2FsX3dpZHRoLAotICAgICAgICAgJnNjYWxfaGVpZ2h0KSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zZXRfc0NBTCh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCB1bml0LCBzY2FsX3dpZHRoLCBzY2FsX2hlaWdodCk7Ci0gICAgICB9Ci0gICB9Ci0jZWxzZQotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQKLSAgIHsKLSAgICAgIGludCB1bml0OwotICAgICAgcG5nX2NoYXJwIHNjYWxfd2lkdGgsIHNjYWxfaGVpZ2h0OwotCi0gICAgICBpZiAocG5nX2dldF9zQ0FMX3MocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZ1bml0LCAmc2NhbF93aWR0aCwKLSAgICAgICAgICAmc2NhbF9oZWlnaHQpKQotICAgICAgewotICAgICAgICAgcG5nX3NldF9zQ0FMX3Mod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgdW5pdCwgc2NhbF93aWR0aCwgc2NhbF9oZWlnaHQpOwotICAgICAgfQotICAgfQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1RFWFRfU1VQUE9SVEVEKQotICAgewotICAgICAgcG5nX3RleHRwIHRleHRfcHRyOwotICAgICAgaW50IG51bV90ZXh0OwotCi0gICAgICBpZiAocG5nX2dldF90ZXh0KHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCAmdGV4dF9wdHIsICZudW1fdGV4dCkgPiAwKQotICAgICAgewotICAgICAgICAgcG5nX2RlYnVnMSgwLCAiSGFuZGxpbmcgJWQgaVRYdC90RVh0L3pUWHQgY2h1bmtzIiwgbnVtX3RleHQpOwotICAgICAgICAgcG5nX3NldF90ZXh0KHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHRleHRfcHRyLCBudW1fdGV4dCk7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR190SU1FX1NVUFBPUlRFRCkKLSAgIHsKLSAgICAgIHBuZ190aW1lcCBtb2RfdGltZTsKLQotICAgICAgaWYgKHBuZ19nZXRfdElNRShyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwgJm1vZF90aW1lKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zZXRfdElNRSh3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLCBtb2RfdGltZSk7Ci0jaWYgZGVmaW5lZChQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCkKLSAgICAgICAgIC8qIFdlIGhhdmUgdG8gdXNlIHBuZ19tZW1jcHkgaW5zdGVhZCBvZiAiPSIgYmVjYXVzZSB0aGUgc3RyaW5nCi0gICAgICAgICAgKiBwb2ludGVkIHRvIGJ5IHBuZ19jb252ZXJ0X3RvX3JmYzExMjMoKSBnZXRzIGZyZWUnZWQgYmVmb3JlCi0gICAgICAgICAgKiB3ZSB1c2UgaXQuCi0gICAgICAgICAgKi8KLSAgICAgICAgIHBuZ19tZW1jcHkodElNRV9zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMocmVhZF9wdHIsIG1vZF90aW1lKSwKLSAgICAgICAgICAgICAgICAgICAgcG5nX3NpemVvZih0SU1FX3N0cmluZykpOwotICAgICAgICAgdElNRV9zdHJpbmdbcG5nX3NpemVvZih0SU1FX3N0cmluZykgLSAxXSA9ICdcMCc7Ci0gICAgICAgICB0SU1FX2NodW5rX3ByZXNlbnQrKzsKLSNlbmRpZiAvKiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCAqLwotICAgICAgfQotICAgfQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfdFJOU19TVVBQT1JURUQpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgdHJhbnM7Ci0gICAgICBpbnQgbnVtX3RyYW5zOwotICAgICAgcG5nX2NvbG9yXzE2cCB0cmFuc192YWx1ZXM7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X3RSTlMocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsICZ0cmFucywgJm51bV90cmFucywKLSAgICAgICAgICZ0cmFuc192YWx1ZXMpKQotICAgICAgewotICAgICAgICAgaW50IHNhbXBsZV9tYXggPSAoMSA8PCByZWFkX2luZm9fcHRyLT5iaXRfZGVwdGgpOwotICAgICAgICAgLyogbGlicG5nIGRvZXNuJ3QgcmVqZWN0IGEgdFJOUyBjaHVuayB3aXRoIG91dC1vZi1yYW5nZSBzYW1wbGVzICovCi0gICAgICAgICBpZiAoISgocmVhZF9pbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmCi0gICAgICAgICAgICAgKGludCl0cmFuc192YWx1ZXMtPmdyYXkgPiBzYW1wbGVfbWF4KSB8fAotICAgICAgICAgICAgIChyZWFkX2luZm9fcHRyLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiAmJgotICAgICAgICAgICAgICgoaW50KXRyYW5zX3ZhbHVlcy0+cmVkID4gc2FtcGxlX21heCB8fAotICAgICAgICAgICAgIChpbnQpdHJhbnNfdmFsdWVzLT5ncmVlbiA+IHNhbXBsZV9tYXggfHwKLSAgICAgICAgICAgICAoaW50KXRyYW5zX3ZhbHVlcy0+Ymx1ZSA+IHNhbXBsZV9tYXgpKSkpCi0gICAgICAgICAgICBwbmdfc2V0X3RSTlMod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgdHJhbnMsIG51bV90cmFucywKLSAgICAgICAgICAgICAgIHRyYW5zX3ZhbHVlcyk7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICB7Ci0gICAgICBwbmdfdW5rbm93bl9jaHVua3AgdW5rbm93bnM7Ci0gICAgICBpbnQgbnVtX3Vua25vd25zID0gKGludClwbmdfZ2V0X3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLAotICAgICAgICAgJnVua25vd25zKTsKLSAgICAgIGlmIChudW1fdW5rbm93bnMpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2l6ZV90IGk7Ci0gICAgICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIHVua25vd25zLAotICAgICAgICAgICBudW1fdW5rbm93bnMpOwotICAgICAgICAgLyogQ29weSB0aGUgbG9jYXRpb25zIGZyb20gdGhlIHJlYWRfaW5mb19wdHIuICBUaGUgYXV0b21hdGljYWxseQotICAgICAgICAgICogZ2VuZXJhdGVkIGxvY2F0aW9ucyBpbiB3cml0ZV9pbmZvX3B0ciBhcmUgd3JvbmcgYmVjYXVzZSB3ZQotICAgICAgICAgICogaGF2ZW4ndCB3cml0dGVuIGFueXRoaW5nIHlldC4KLSAgICAgICAgICAqLwotICAgICAgICAgZm9yIChpID0gMDsgaSA8IChwbmdfc2l6ZV90KW51bV91bmtub3duczsgaSsrKQotICAgICAgICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24od3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwgaSwKLSAgICAgICAgICAgICB1bmtub3duc1tpXS5sb2NhdGlvbik7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLSAgIHBuZ19kZWJ1ZygwLCAiV3JpdGluZyBpbmZvIHN0cnVjdCIpOwotCi0vKiBJZiB3ZSB3YW50ZWQsIHdlIGNvdWxkIHdyaXRlIGluZm8gaW4gdHdvIHN0ZXBzOgotICogcG5nX3dyaXRlX2luZm9fYmVmb3JlX1BMVEUod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0cik7Ci0gKi8KLSAgIHBuZ193cml0ZV9pbmZvKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIpOwotCi0jaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotICAgaWYgKHVzZXJfY2h1bmtfZGF0YVswXSAhPSAwKQotICAgewotICAgICAgcG5nX2J5dGUgcG5nX3NURVJbNV0gPSB7MTE1LCAgODQsICA2OSwgIDgyLCAnXDAnfTsKLQotICAgICAgdW5zaWduZWQgY2hhcgotICAgICAgICBzdGVyX2NodW5rX2RhdGFbMV07Ci0KLSAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbiBzdGVyZW8gbW9kZSA9ICVsdVxuIiwKLSAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKHVzZXJfY2h1bmtfZGF0YVswXSAtIDEpKTsKLSAgICAgIHN0ZXJfY2h1bmtfZGF0YVswXT0odW5zaWduZWQgY2hhcikodXNlcl9jaHVua19kYXRhWzBdIC0gMSk7Ci0gICAgICBwbmdfd3JpdGVfY2h1bmsod3JpdGVfcHRyLCBwbmdfc1RFUiwgc3Rlcl9jaHVua19kYXRhLCAxKTsKLSAgIH0KLSAgIGlmICh1c2VyX2NodW5rX2RhdGFbMV0gIT0gMCB8fCB1c2VyX2NodW5rX2RhdGFbMl0gIT0gMCkKLSAgIHsKLSAgICAgIHBuZ19ieXRlIHBuZ192cEFnWzVdID0gezExOCwgMTEyLCAgNjUsIDEwMywgJ1wwJ307Ci0KLSAgICAgIHVuc2lnbmVkIGNoYXIKLSAgICAgICAgdnBhZ19jaHVua19kYXRhWzldOwotCi0gICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIHZwQWcgPSAlbHUgeCAlbHUsIHVuaXRzID0gJWx1XG4iLAotICAgICAgICAgICAodW5zaWduZWQgbG9uZyl1c2VyX2NodW5rX2RhdGFbMV0sCi0gICAgICAgICAgICh1bnNpZ25lZCBsb25nKXVzZXJfY2h1bmtfZGF0YVsyXSwKLSAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdXNlcl9jaHVua19kYXRhWzNdKTsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIodnBhZ19jaHVua19kYXRhLCB1c2VyX2NodW5rX2RhdGFbMV0pOwotICAgICAgcG5nX3NhdmVfdWludF8zMih2cGFnX2NodW5rX2RhdGEgKyA0LCB1c2VyX2NodW5rX2RhdGFbMl0pOwotICAgICAgdnBhZ19jaHVua19kYXRhWzhdID0gKHVuc2lnbmVkIGNoYXIpKHVzZXJfY2h1bmtfZGF0YVszXSAmIDB4ZmYpOwotICAgICAgcG5nX3dyaXRlX2NodW5rKHdyaXRlX3B0ciwgcG5nX3ZwQWcsIHZwYWdfY2h1bmtfZGF0YSwgOSk7Ci0gICB9Ci0KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBTSU5HTEVfUk9XQlVGX0FMTE9DCi0gICBwbmdfZGVidWcoMCwgIkFsbG9jYXRpbmcgcm93IGJ1ZmZlci4uLiIpOwotICAgcm93X2J1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhyZWFkX3B0ciwKLSAgICAgIHBuZ19nZXRfcm93Ynl0ZXMocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIpKTsKLSAgIHBuZ19kZWJ1ZzEoMCwgIjB4JTA4bHgiLCAodW5zaWduZWQgbG9uZylyb3dfYnVmKTsKLSNlbmRpZiAvKiBTSU5HTEVfUk9XQlVGX0FMTE9DICovCi0gICBwbmdfZGVidWcoMCwgIldyaXRpbmcgcm93IGRhdGEiKTsKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEKSB8fCBcCi0gIGRlZmluZWQoUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkKLSAgIG51bV9wYXNzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocmVhZF9wdHIpOwotIyAgaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotICAgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcod3JpdGVfcHRyKTsKLSMgIGVuZGlmCi0jZWxzZQotICAgbnVtX3Bhc3MgPSAxOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdURVNUX1RJTUlORwotICAgdF9zdG9wID0gKGZsb2F0KWNsb2NrKCk7Ci0gICB0X21pc2MgKz0gKHRfc3RvcCAtIHRfc3RhcnQpOwotICAgdF9zdGFydCA9IHRfc3RvcDsKLSNlbmRpZgotICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IG51bV9wYXNzOyBwYXNzKyspCi0gICB7Ci0gICAgICBwbmdfZGVidWcxKDAsICJXcml0aW5nIHJvdyBkYXRhIGZvciBwYXNzICVkIiwgcGFzcyk7Ci0gICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCi0gICAgICB7Ci0jaWZuZGVmIFNJTkdMRV9ST1dCVUZfQUxMT0MKLSAgICAgICAgIHBuZ19kZWJ1ZzIoMCwgIkFsbG9jYXRpbmcgcm93IGJ1ZmZlciAocGFzcyAlZCwgeSA9ICVsZCkuLi4iLCBwYXNzLCB5KTsKLSAgICAgICAgIHJvd19idWYgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocmVhZF9wdHIsCi0gICAgICAgICAgICBwbmdfZ2V0X3Jvd2J5dGVzKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyKSk7Ci0gICAgICAgICBwbmdfZGVidWcyKDAsICIweCUwOGx4ICglbGQgYnl0ZXMpIiwgKHVuc2lnbmVkIGxvbmcpcm93X2J1ZiwKLSAgICAgICAgICAgIHBuZ19nZXRfcm93Ynl0ZXMocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIpKTsKLSNlbmRpZiAvKiAhU0lOR0xFX1JPV0JVRl9BTExPQyAqLwotICAgICAgICAgcG5nX3JlYWRfcm93cyhyZWFkX3B0ciwgKHBuZ19ieXRlcHApJnJvd19idWYsIHBuZ19ieXRlcHBfTlVMTCwgMSk7Ci0KLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0jaWZkZWYgUE5HVEVTVF9USU1JTkcKLSAgICAgICAgIHRfc3RvcCA9IChmbG9hdCljbG9jaygpOwotICAgICAgICAgdF9kZWNvZGUgKz0gKHRfc3RvcCAtIHRfc3RhcnQpOwotICAgICAgICAgdF9zdGFydCA9IHRfc3RvcDsKLSNlbmRpZgotICAgICAgICAgcG5nX3dyaXRlX3Jvd3Mod3JpdGVfcHRyLCAocG5nX2J5dGVwcCkmcm93X2J1ZiwgMSk7Ci0jaWZkZWYgUE5HVEVTVF9USU1JTkcKLSAgICAgICAgIHRfc3RvcCA9IChmbG9hdCljbG9jaygpOwotICAgICAgICAgdF9lbmNvZGUgKz0gKHRfc3RvcCAtIHRfc3RhcnQpOwotICAgICAgICAgdF9zdGFydCA9IHRfc3RvcDsKLSNlbmRpZgotI2VuZGlmIC8qIFBOR19XUklURV9TVVBQT1JURUQgKi8KLQotI2lmbmRlZiBTSU5HTEVfUk9XQlVGX0FMTE9DCi0gICAgICAgICBwbmdfZGVidWcyKDAsICJGcmVlaW5nIHJvdyBidWZmZXIgKHBhc3MgJWQsIHkgPSAlbGQpIiwgcGFzcywgeSk7Ci0gICAgICAgICBwbmdfZnJlZShyZWFkX3B0ciwgcm93X2J1Zik7Ci0gICAgICAgICByb3dfYnVmID0gTlVMTDsKLSNlbmRpZiAvKiAhU0lOR0xFX1JPV0JVRl9BTExPQyAqLwotICAgICAgfQotICAgfQotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICBwbmdfZnJlZV9kYXRhKHJlYWRfcHRyLCByZWFkX2luZm9fcHRyLCBQTkdfRlJFRV9VTktOLCAtMSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICBwbmdfZnJlZV9kYXRhKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsIFBOR19GUkVFX1VOS04sIC0xKTsKLSNlbmRpZgotCi0gICBwbmdfZGVidWcoMCwgIlJlYWRpbmcgYW5kIHdyaXRpbmcgZW5kX2luZm8gZGF0YSIpOwotCi0gICBwbmdfcmVhZF9lbmQocmVhZF9wdHIsIGVuZF9pbmZvX3B0cik7Ci0jaWYgZGVmaW5lZChQTkdfVEVYVF9TVVBQT1JURUQpCi0gICB7Ci0gICAgICBwbmdfdGV4dHAgdGV4dF9wdHI7Ci0gICAgICBpbnQgbnVtX3RleHQ7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X3RleHQocmVhZF9wdHIsIGVuZF9pbmZvX3B0ciwgJnRleHRfcHRyLCAmbnVtX3RleHQpID4gMCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19kZWJ1ZzEoMCwgIkhhbmRsaW5nICVkIGlUWHQvdEVYdC96VFh0IGNodW5rcyIsIG51bV90ZXh0KTsKLSAgICAgICAgIHBuZ19zZXRfdGV4dCh3cml0ZV9wdHIsIHdyaXRlX2VuZF9pbmZvX3B0ciwgdGV4dF9wdHIsIG51bV90ZXh0KTsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX3RJTUVfU1VQUE9SVEVEKQotICAgewotICAgICAgcG5nX3RpbWVwIG1vZF90aW1lOwotCi0gICAgICBpZiAocG5nX2dldF90SU1FKHJlYWRfcHRyLCBlbmRfaW5mb19wdHIsICZtb2RfdGltZSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2V0X3RJTUUod3JpdGVfcHRyLCB3cml0ZV9lbmRfaW5mb19wdHIsIG1vZF90aW1lKTsKLSNpZiBkZWZpbmVkKFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEKQotICAgICAgICAgLyogV2UgaGF2ZSB0byB1c2UgcG5nX21lbWNweSBpbnN0ZWFkIG9mICI9IiBiZWNhdXNlIHRoZSBzdHJpbmcKLSAgICAgICAgICAgIHBvaW50ZWQgdG8gYnkgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMygpIGdldHMgZnJlZSdlZCBiZWZvcmUKLSAgICAgICAgICAgIHdlIHVzZSBpdCAqLwotICAgICAgICAgcG5nX21lbWNweSh0SU1FX3N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMyhyZWFkX3B0ciwgbW9kX3RpbWUpLAotICAgICAgICAgICAgICAgICAgICBwbmdfc2l6ZW9mKHRJTUVfc3RyaW5nKSk7Ci0gICAgICAgICB0SU1FX3N0cmluZ1twbmdfc2l6ZW9mKHRJTUVfc3RyaW5nKSAtIDFdID0gJ1wwJzsKLSAgICAgICAgIHRJTUVfY2h1bmtfcHJlc2VudCsrOwotI2VuZGlmIC8qIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEICovCi0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICB7Ci0gICAgICBwbmdfdW5rbm93bl9jaHVua3AgdW5rbm93bnM7Ci0gICAgICBpbnQgbnVtX3Vua25vd25zOwotICAgICAgbnVtX3Vua25vd25zID0gKGludClwbmdfZ2V0X3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCBlbmRfaW5mb19wdHIsCi0gICAgICAgICAmdW5rbm93bnMpOwotICAgICAgaWYgKG51bV91bmtub3ducykKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zaXplX3QgaTsKLSAgICAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3Mod3JpdGVfcHRyLCB3cml0ZV9lbmRfaW5mb19wdHIsIHVua25vd25zLAotICAgICAgICAgICBudW1fdW5rbm93bnMpOwotICAgICAgICAgLyogQ29weSB0aGUgbG9jYXRpb25zIGZyb20gdGhlIHJlYWRfaW5mb19wdHIuICBUaGUgYXV0b21hdGljYWxseQotICAgICAgICAgICogZ2VuZXJhdGVkIGxvY2F0aW9ucyBpbiB3cml0ZV9lbmRfaW5mb19wdHIgYXJlIHdyb25nIGJlY2F1c2Ugd2UKLSAgICAgICAgICAqIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZW5kX2luZm8geWV0LgotICAgICAgICAgICovCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHBuZ19zaXplX3QpbnVtX3Vua25vd25zOyBpKyspCi0gICAgICAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbih3cml0ZV9wdHIsIHdyaXRlX2VuZF9pbmZvX3B0ciwgaSwKLSAgICAgICAgICAgICB1bmtub3duc1tpXS5sb2NhdGlvbik7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICBwbmdfd3JpdGVfZW5kKHdyaXRlX3B0ciwgd3JpdGVfZW5kX2luZm9fcHRyKTsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX0VBU1lfQUNDRVNTX1NVUFBPUlRFRAotICAgaWYgKHZlcmJvc2UpCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiBpd2lkdGgsIGloZWlnaHQ7Ci0gICAgICBpd2lkdGggPSBwbmdfZ2V0X2ltYWdlX3dpZHRoKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIpOwotICAgICAgaWhlaWdodCA9IHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIpOwotICAgICAgZnByaW50ZihTVERFUlIsICJcbiBJbWFnZSB3aWR0aCA9ICVsdSwgaGVpZ2h0ID0gJWx1XG4iLAotICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaXdpZHRoLCAodW5zaWduZWQgbG9uZylpaGVpZ2h0KTsKLSAgIH0KLSNlbmRpZgotCi0gICBwbmdfZGVidWcoMCwgIkRlc3Ryb3lpbmcgZGF0YSBzdHJ1Y3RzIik7Ci0jaWZkZWYgU0lOR0xFX1JPV0JVRl9BTExPQwotICAgcG5nX2RlYnVnKDEsICJkZXN0cm95aW5nIHJvd19idWYgZm9yIHJlYWRfcHRyIik7Ci0gICBwbmdfZnJlZShyZWFkX3B0ciwgcm93X2J1Zik7Ci0gICByb3dfYnVmID0gTlVMTDsKLSNlbmRpZiAvKiBTSU5HTEVfUk9XQlVGX0FMTE9DICovCi0gICBwbmdfZGVidWcoMSwgImRlc3Ryb3lpbmcgcmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsIGVuZF9pbmZvX3B0ciIpOwotICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnJlYWRfcHRyLCAmcmVhZF9pbmZvX3B0ciwgJmVuZF9pbmZvX3B0cik7Ci0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotICAgcG5nX2RlYnVnKDEsICJkZXN0cm95aW5nIHdyaXRlX2VuZF9pbmZvX3B0ciIpOwotICAgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3Qod3JpdGVfcHRyLCAmd3JpdGVfZW5kX2luZm9fcHRyKTsKLSAgIHBuZ19kZWJ1ZygxLCAiZGVzdHJveWluZyB3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyIik7Ci0gICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJndyaXRlX3B0ciwgJndyaXRlX2luZm9fcHRyKTsKLSNlbmRpZgotICAgcG5nX2RlYnVnKDAsICJEZXN0cnVjdGlvbiBjb21wbGV0ZS4iKTsKLQotICAgRkNMT1NFKGZwaW4pOwotICAgRkNMT1NFKGZwb3V0KTsKLQotICAgcG5nX2RlYnVnKDAsICJPcGVuaW5nIGZpbGVzIGZvciBjb21wYXJpc29uIik7Ci0jaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGlubmFtZSwgLTEsIHBhdGgsIE1BWF9QQVRIKTsKLSAgIGlmICgoZnBpbiA9IENyZWF0ZUZpbGUocGF0aCwgR0VORVJJQ19SRUFELCAwLCBOVUxMLCBPUEVOX0VYSVNUSU5HLCAwLCBOVUxMKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0jZWxzZQotICAgaWYgKChmcGluID0gZm9wZW4oaW5uYW1lLCAicmIiKSkgPT0gTlVMTCkKLSNlbmRpZgotICAgewotICAgICAgZnByaW50ZihTVERFUlIsICJDb3VsZCBub3QgZmluZCBmaWxlICVzXG4iLCBpbm5hbWUpOwotICAgICAgcmV0dXJuICgxKTsKLSAgIH0KLQotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKLSAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBvdXRuYW1lLCAtMSwgcGF0aCwgTUFYX1BBVEgpOwotICAgaWYgKChmcG91dCA9IENyZWF0ZUZpbGUocGF0aCwgR0VORVJJQ19SRUFELCAwLCBOVUxMLCBPUEVOX0VYSVNUSU5HLCAwLCBOVUxMKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0jZWxzZQotICAgaWYgKChmcG91dCA9IGZvcGVuKG91dG5hbWUsICJyYiIpKSA9PSBOVUxMKQotI2VuZGlmCi0gICB7Ci0gICAgICBmcHJpbnRmKFNUREVSUiwgIkNvdWxkIG5vdCBmaW5kIGZpbGUgJXNcbiIsIG91dG5hbWUpOwotICAgICAgRkNMT1NFKGZwaW4pOwotICAgICAgcmV0dXJuICgxKTsKLSAgIH0KLQotICAgZm9yICg7OykKLSAgIHsKLSAgICAgIHBuZ19zaXplX3QgbnVtX2luLCBudW1fb3V0OwotCi0gICAgICAgICBSRUFERklMRShmcGluLCBpbmJ1ZiwgMSwgbnVtX2luKTsKLSAgICAgICAgIFJFQURGSUxFKGZwb3V0LCBvdXRidWYsIDEsIG51bV9vdXQpOwotCi0gICAgICBpZiAobnVtX2luICE9IG51bV9vdXQpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKFNUREVSUiwgIlxuRmlsZXMgJXMgYW5kICVzIGFyZSBvZiBhIGRpZmZlcmVudCBzaXplXG4iLAotICAgICAgICAgICAgICAgICBpbm5hbWUsIG91dG5hbWUpOwotICAgICAgICAgaWYgKHdyb3RlX3F1ZXN0aW9uID09IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwKLSAgICAgICAgICIgICBXYXMgJXMgd3JpdHRlbiB3aXRoIHRoZSBzYW1lIG1heGltdW0gSURBVCBjaHVuayBzaXplICglZCBieXRlcyksIiwKLSAgICAgICAgICAgICAgaW5uYW1lLCBQTkdfWkJVRl9TSVpFKTsKLSAgICAgICAgICAgIGZwcmludGYoU1RERVJSLAotICAgICAgICAgICAgICAiXG4gICBmaWx0ZXJpbmcgaGV1cmlzdGljIChsaWJwbmcgZGVmYXVsdCksIGNvbXByZXNzaW9uIik7Ci0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwKLSAgICAgICAgICAgICAgIiBsZXZlbCAoemxpYiBkZWZhdWx0KSxcbiAgIGFuZCB6bGliIHZlcnNpb24gKCVzKT9cblxuIiwKLSAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OKTsKLSAgICAgICAgICAgIHdyb3RlX3F1ZXN0aW9uID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIEZDTE9TRShmcGluKTsKLSAgICAgICAgIEZDTE9TRShmcG91dCk7Ci0gICAgICAgICByZXR1cm4gKDApOwotICAgICAgfQotCi0gICAgICBpZiAoIW51bV9pbikKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAocG5nX21lbWNtcChpbmJ1Ziwgb3V0YnVmLCBudW1faW4pKQotICAgICAgewotICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbkZpbGVzICVzIGFuZCAlcyBhcmUgZGlmZmVyZW50XG4iLCBpbm5hbWUsIG91dG5hbWUpOwotICAgICAgICAgaWYgKHdyb3RlX3F1ZXN0aW9uID09IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwKLSAgICAgICAgICIgICBXYXMgJXMgd3JpdHRlbiB3aXRoIHRoZSBzYW1lIG1heGltdW0gSURBVCBjaHVuayBzaXplICglZCBieXRlcyksIiwKLSAgICAgICAgICAgICAgICAgaW5uYW1lLCBQTkdfWkJVRl9TSVpFKTsKLSAgICAgICAgICAgIGZwcmludGYoU1RERVJSLAotICAgICAgICAgICAgICAiXG4gICBmaWx0ZXJpbmcgaGV1cmlzdGljIChsaWJwbmcgZGVmYXVsdCksIGNvbXByZXNzaW9uIik7Ci0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwKLSAgICAgICAgICAgICAgIiBsZXZlbCAoemxpYiBkZWZhdWx0KSxcbiAgIGFuZCB6bGliIHZlcnNpb24gKCVzKT9cblxuIiwKLSAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OKTsKLSAgICAgICAgICAgIHdyb3RlX3F1ZXN0aW9uID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIEZDTE9TRShmcGluKTsKLSAgICAgICAgIEZDTE9TRShmcG91dCk7Ci0gICAgICAgICByZXR1cm4gKDApOwotICAgICAgfQotICAgfQotCi0gICBGQ0xPU0UoZnBpbik7Ci0gICBGQ0xPU0UoZnBvdXQpOwotCi0gICByZXR1cm4gKDApOwotfQotCi0vKiBJbnB1dCBhbmQgb3V0cHV0IGZpbGVuYW1lcyAqLwotI2lmZGVmIFJJU0NPUwotc3RhdGljIFBOR19DT05TVCBjaGFyICppbm5hbWUgPSAicG5ndGVzdC9wbmciOwotc3RhdGljIFBOR19DT05TVCBjaGFyICpvdXRuYW1lID0gInBuZ291dC9wbmciOwotI2Vsc2UKLXN0YXRpYyBQTkdfQ09OU1QgY2hhciAqaW5uYW1lID0gInBuZ3Rlc3QucG5nIjsKLXN0YXRpYyBQTkdfQ09OU1QgY2hhciAqb3V0bmFtZSA9ICJwbmdvdXQucG5nIjsKLSNlbmRpZgotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgIGludCBtdWx0aXBsZSA9IDA7Ci0gICBpbnQgaWVycm9yID0gMDsKLQotICAgZnByaW50ZihTVERFUlIsICJcbiBUZXN0aW5nIGxpYnBuZyB2ZXJzaW9uICVzXG4iLCBQTkdfTElCUE5HX1ZFUl9TVFJJTkcpOwotICAgZnByaW50ZihTVERFUlIsICIgICB3aXRoIHpsaWIgICB2ZXJzaW9uICVzXG4iLCBaTElCX1ZFUlNJT04pOwotICAgZnByaW50ZihTVERFUlIsICIlcyIsIHBuZ19nZXRfY29weXJpZ2h0KE5VTEwpKTsKLSAgIC8qIFNob3cgdGhlIHZlcnNpb24gb2YgbGlicG5nIHVzZWQgaW4gYnVpbGRpbmcgdGhlIGxpYnJhcnkgKi8KLSAgIGZwcmludGYoU1RERVJSLCAiIGxpYnJhcnkgKCVsdSk6JXMiLAotICAgICAgKHVuc2lnbmVkIGxvbmcpcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcigpLAotICAgICAgcG5nX2dldF9oZWFkZXJfdmVyc2lvbihOVUxMKSk7Ci0gICAvKiBTaG93IHRoZSB2ZXJzaW9uIG9mIGxpYnBuZyB1c2VkIGluIGJ1aWxkaW5nIHRoZSBhcHBsaWNhdGlvbiAqLwotICAgZnByaW50ZihTVERFUlIsICIgcG5ndGVzdCAoJWx1KTolcyIsICh1bnNpZ25lZCBsb25nKVBOR19MSUJQTkdfVkVSLAotICAgICAgUE5HX0hFQURFUl9WRVJTSU9OX1NUUklORyk7Ci0gICBmcHJpbnRmKFNUREVSUiwgIiBzaXplb2YocG5nX3N0cnVjdCk9JWxkLCBzaXplb2YocG5nX2luZm8pPSVsZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcpcG5nX3NpemVvZihwbmdfc3RydWN0KSwgKGxvbmcpcG5nX3NpemVvZihwbmdfaW5mbykpOwotCi0gICAvKiBEbyBzb21lIGNvbnNpc3RlbmN5IGNoZWNraW5nIG9uIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBzZXR0aW5ncywgSSdtCi0gICAgKiBub3Qgc3VyZSB0aGlzIG1hdHRlcnMsIGJ1dCBpdCBpcyBuaWNlIHRvIGtub3csIHRoZSBmaXJzdCBvZiB0aGVzZQotICAgICogdGVzdHMgc2hvdWxkIGJlIGltcG9zc2libGUgYmVjYXVzZSBvZiB0aGUgd2F5IHRoZSBtYWNyb3MgYXJlIHNldAotICAgICogaW4gcG5nY29uZi5oCi0gICAgKi8KLSNpZiBkZWZpbmVkKE1BWFNFR182NEspICYmICFkZWZpbmVkKFBOR19NQVhfTUFMTE9DXzY0SykKLSAgICAgIGZwcmludGYoU1RERVJSLCAiIE5PVEU6IFpsaWIgY29tcGlsZWQgZm9yIG1heCA2NGssIGxpYnBuZyBub3RcbiIpOwotI2VuZGlmCi0gICAvKiBJIHRoaW5rIHRoZSBmb2xsb3dpbmcgY2FuIGhhcHBlbi4gKi8KLSNpZiAhZGVmaW5lZChNQVhTRUdfNjRLKSAmJiBkZWZpbmVkKFBOR19NQVhfTUFMTE9DXzY0SykKLSAgICAgIGZwcmludGYoU1RERVJSLCAiIE5PVEU6IGxpYnBuZyBjb21waWxlZCBmb3IgbWF4IDY0aywgemxpYiBub3RcbiIpOwotI2VuZGlmCi0KLSAgIGlmIChzdHJjbXAocG5nX2xpYnBuZ192ZXIsIFBOR19MSUJQTkdfVkVSX1NUUklORykpCi0gICB7Ci0gICAgICBmcHJpbnRmKFNUREVSUiwKLSAgICAgICAgICJXYXJuaW5nOiB2ZXJzaW9ucyBhcmUgZGlmZmVyZW50IGJldHdlZW4gcG5nLmggYW5kIHBuZy5jXG4iKTsKLSAgICAgIGZwcmludGYoU1RERVJSLCAiICBwbmcuaCB2ZXJzaW9uOiAlc1xuIiwgUE5HX0xJQlBOR19WRVJfU1RSSU5HKTsKLSAgICAgIGZwcmludGYoU1RERVJSLCAiICBwbmcuYyB2ZXJzaW9uOiAlc1xuXG4iLCBwbmdfbGlicG5nX3Zlcik7Ci0gICAgICArK2llcnJvcjsKLSAgIH0KLQotICAgaWYgKGFyZ2MgPiAxKQotICAgewotICAgICAgaWYgKHN0cmNtcChhcmd2WzFdLCAiLW0iKSA9PSAwKQotICAgICAgewotICAgICAgICAgbXVsdGlwbGUgPSAxOwotICAgICAgICAgc3RhdHVzX2RvdHNfcmVxdWVzdGVkID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiLW12IikgPT0gMCB8fAotICAgICAgICAgICAgICAgc3RyY21wKGFyZ3ZbMV0sICItdm0iKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgIG11bHRpcGxlID0gMTsKLSAgICAgICAgIHZlcmJvc2UgPSAxOwotICAgICAgICAgc3RhdHVzX2RvdHNfcmVxdWVzdGVkID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiLXYiKSA9PSAwKQotICAgICAgewotICAgICAgICAgdmVyYm9zZSA9IDE7Ci0gICAgICAgICBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAxOwotICAgICAgICAgaW5uYW1lID0gYXJndlsyXTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGlubmFtZSA9IGFyZ3ZbMV07Ci0gICAgICAgICBzdGF0dXNfZG90c19yZXF1ZXN0ZWQgPSAwOwotICAgICAgfQotICAgfQotCi0gICBpZiAoIW11bHRpcGxlICYmIGFyZ2MgPT0gMyArIHZlcmJvc2UpCi0gICAgIG91dG5hbWUgPSBhcmd2WzIgKyB2ZXJib3NlXTsKLQotICAgaWYgKCghbXVsdGlwbGUgJiYgYXJnYyA+IDMgKyB2ZXJib3NlKSB8fCAobXVsdGlwbGUgJiYgYXJnYyA8IDIpKQotICAgewotICAgICBmcHJpbnRmKFNUREVSUiwKLSAgICAgICAidXNhZ2U6ICVzIFtpbmZpbGUucG5nXSBbb3V0ZmlsZS5wbmddXG5cdCVzIC1tIHtpbmZpbGUucG5nfVxuIiwKLSAgICAgICAgYXJndlswXSwgYXJndlswXSk7Ci0gICAgIGZwcmludGYoU1RERVJSLAotICAgICAgICIgIHJlYWRzL3dyaXRlcyBvbmUgUE5HIGZpbGUgKHdpdGhvdXQgLW0pIG9yIG11bHRpcGxlIGZpbGVzICgtbSlcbiIpOwotICAgICBmcHJpbnRmKFNUREVSUiwKLSAgICAgICAiICB3aXRoIC1tICVzIGlzIHVzZWQgYXMgYSB0ZW1wb3JhcnkgZmlsZVxuIiwgb3V0bmFtZSk7Ci0gICAgIGV4aXQoMSk7Ci0gICB9Ci0KLSAgIGlmIChtdWx0aXBsZSkKLSAgIHsKLSAgICAgIGludCBpOwotI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCi0gICAgICBpbnQgYWxsb2NhdGlvbl9ub3cgPSBjdXJyZW50X2FsbG9jYXRpb247Ci0jZW5kaWYKLSAgICAgIGZvciAoaT0yOyBpPGFyZ2M7ICsraSkKLSAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKLSAgICAgICAgIGludCBrOwotI2VuZGlmCi0gICAgICAgICBpbnQga2Vycm9yOwotICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbiBUZXN0aW5nICVzOiIsIGFyZ3ZbaV0pOwotICAgICAgICAga2Vycm9yID0gdGVzdF9vbmVfZmlsZShhcmd2W2ldLCBvdXRuYW1lKTsKLSAgICAgICAgIGlmIChrZXJyb3IgPT0gMCkKLSAgICAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCi0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIlxuIFBBU1MgKCVsdSB6ZXJvIHNhbXBsZXMpXG4iLAotICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpemVyb19zYW1wbGVzKTsKLSNlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBQQVNTXG4iKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKQotICAgICAgICAgICAgZm9yIChrID0gMDsgazwyNTY7IGsrKykKLSAgICAgICAgICAgICAgIGlmIChmaWx0ZXJzX3VzZWRba10pCi0gICAgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBGaWx0ZXIgJWQgd2FzIHVzZWQgJWx1IHRpbWVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgaywgKHVuc2lnbmVkIGxvbmcpZmlsdGVyc191c2VkW2tdKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQpCi0gICAgICAgICBpZiAodElNRV9jaHVua19wcmVzZW50ICE9IDApCi0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiB0SU1FID0gJXNcbiIsIHRJTUVfc3RyaW5nKTsKLSAgICAgICAgIHRJTUVfY2h1bmtfcHJlc2VudCA9IDA7Ci0jZW5kaWYgLyogUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQgKi8KLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIEZBSUxcbiIpOwotICAgICAgICAgICAgaWVycm9yICs9IGtlcnJvcjsKLSAgICAgICAgIH0KLSNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRwotICAgICAgICAgaWYgKGFsbG9jYXRpb25fbm93ICE9IGN1cnJlbnRfYWxsb2NhdGlvbikKLSAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiTUVNT1JZIEVSUk9SOiAlZCBieXRlcyBsb3N0XG4iLAotICAgICAgICAgICAgICAgY3VycmVudF9hbGxvY2F0aW9uIC0gYWxsb2NhdGlvbl9ub3cpOwotICAgICAgICAgaWYgKGN1cnJlbnRfYWxsb2NhdGlvbiAhPSAwKQotICAgICAgICAgewotICAgICAgICAgICAgbWVtb3J5X2luZm9wIHBpbmZvID0gcGluZm9ybWF0aW9uOwotCi0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIk1FTU9SWSBFUlJPUjogJWQgYnl0ZXMgc3RpbGwgYWxsb2NhdGVkXG4iLAotICAgICAgICAgICAgICAgY3VycmVudF9hbGxvY2F0aW9uKTsKLSAgICAgICAgICAgIHdoaWxlIChwaW5mbyAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgJWx1IGJ5dGVzIGF0ICV4XG4iLAotICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylwaW5mby0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkgcGluZm8tPnBvaW50ZXIpOwotICAgICAgICAgICAgICAgcGluZm8gPSBwaW5mby0+bmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSNlbmRpZgotICAgICAgfQotI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCi0gICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBDdXJyZW50IG1lbW9yeSBhbGxvY2F0aW9uOiAlMTBkIGJ5dGVzXG4iLAotICAgICAgICAgICAgY3VycmVudF9hbGxvY2F0aW9uKTsKLSAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIE1heGltdW0gbWVtb3J5IGFsbG9jYXRpb246ICUxMGQgYnl0ZXNcbiIsCi0gICAgICAgICAgICBtYXhpbXVtX2FsbG9jYXRpb24pOwotICAgICAgICAgZnByaW50ZihTVERFUlIsICIgVG90YWwgICBtZW1vcnkgYWxsb2NhdGlvbjogJTEwZCBieXRlc1xuIiwKLSAgICAgICAgICAgIHRvdGFsX2FsbG9jYXRpb24pOwotICAgICAgICAgZnByaW50ZihTVERFUlIsICIgICAgIE51bWJlciBvZiBhbGxvY2F0aW9uczogJTEwZFxuIiwKLSAgICAgICAgICAgIG51bV9hbGxvY2F0aW9ucyk7Ci0jZW5kaWYKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaTwzOyArK2kpCi0gICAgICB7Ci0gICAgICAgICBpbnQga2Vycm9yOwotI2lmIGRlZmluZWQoUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCkgJiYgUE5HX0RFQlVHCi0gICAgICAgICBpbnQgYWxsb2NhdGlvbl9ub3cgPSBjdXJyZW50X2FsbG9jYXRpb247Ci0jZW5kaWYKLSAgICAgICAgIGlmIChpID09IDEpIHN0YXR1c19kb3RzX3JlcXVlc3RlZCA9IDE7Ci0gICAgICAgICBlbHNlIGlmICh2ZXJib3NlID09IDApc3RhdHVzX2RvdHNfcmVxdWVzdGVkID0gMDsKLSAgICAgICAgIGlmIChpID09IDAgfHwgdmVyYm9zZSA9PSAxIHx8IGllcnJvciAhPSAwKQotICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbiBUZXN0aW5nICVzOiIsIGlubmFtZSk7Ci0gICAgICAgICBrZXJyb3IgPSB0ZXN0X29uZV9maWxlKGlubmFtZSwgb3V0bmFtZSk7Ci0gICAgICAgICBpZiAoa2Vycm9yID09IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSA9PSAxIHx8IGkgPT0gMikKLSAgICAgICAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKLSAgICAgICAgICAgICAgICBpbnQgazsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIlxuIFBBU1MgKCVsdSB6ZXJvIHNhbXBsZXMpXG4iLAotICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXplcm9fc2FtcGxlcyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIFBBU1NcbiIpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpCi0gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgazwyNTY7IGsrKykKLSAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyc191c2VkW2tdKQotICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoU1RERVJSLCAiIEZpbHRlciAlZCB3YXMgdXNlZCAlbHUgdGltZXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylmaWx0ZXJzX3VzZWRba10pOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCkKLSAgICAgICAgICAgICBpZiAodElNRV9jaHVua19wcmVzZW50ICE9IDApCi0gICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICIgdElNRSA9ICVzXG4iLCB0SU1FX3N0cmluZyk7Ci0jZW5kaWYgLyogUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2ZXJib3NlID09IDAgJiYgaSAhPSAyKQotICAgICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJcbiBUZXN0aW5nICVzOiIsIGlubmFtZSk7Ci0gICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBGQUlMXG4iKTsKLSAgICAgICAgICAgIGllcnJvciArPSBrZXJyb3I7Ci0gICAgICAgICB9Ci0jaWYgZGVmaW5lZChQTkdfVVNFUl9NRU1fU1VQUE9SVEVEKSAmJiBQTkdfREVCVUcKLSAgICAgICAgIGlmIChhbGxvY2F0aW9uX25vdyAhPSBjdXJyZW50X2FsbG9jYXRpb24pCi0gICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJNRU1PUlkgRVJST1I6ICVkIGJ5dGVzIGxvc3RcbiIsCi0gICAgICAgICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24gLSBhbGxvY2F0aW9uX25vdyk7Ci0gICAgICAgICBpZiAoY3VycmVudF9hbGxvY2F0aW9uICE9IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgbWVtb3J5X2luZm9wIHBpbmZvID0gcGluZm9ybWF0aW9uOwotCi0gICAgICAgICAgICAgZnByaW50ZihTVERFUlIsICJNRU1PUlkgRVJST1I6ICVkIGJ5dGVzIHN0aWxsIGFsbG9jYXRlZFxuIiwKLSAgICAgICAgICAgICAgICBjdXJyZW50X2FsbG9jYXRpb24pOwotICAgICAgICAgICAgIHdoaWxlIChwaW5mbyAhPSBOVUxMKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKFNUREVSUiwgIiAlbHUgYnl0ZXMgYXQgJXhcbiIsCi0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcGluZm8tPnNpemUsICh1bnNpZ25lZCBpbnQpcGluZm8tPnBvaW50ZXIpOwotICAgICAgICAgICAgICAgIHBpbmZvID0gcGluZm8tPm5leHQ7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgIH0KLSNpZiBkZWZpbmVkKFBOR19VU0VSX01FTV9TVVBQT1JURUQpICYmIFBOR19ERUJVRwotICAgICAgIGZwcmludGYoU1RERVJSLCAiIEN1cnJlbnQgbWVtb3J5IGFsbG9jYXRpb246ICUxMGQgYnl0ZXNcbiIsCi0gICAgICAgICAgY3VycmVudF9hbGxvY2F0aW9uKTsKLSAgICAgICBmcHJpbnRmKFNUREVSUiwgIiBNYXhpbXVtIG1lbW9yeSBhbGxvY2F0aW9uOiAlMTBkIGJ5dGVzXG4iLAotICAgICAgICAgIG1heGltdW1fYWxsb2NhdGlvbik7Ci0gICAgICAgZnByaW50ZihTVERFUlIsICIgVG90YWwgICBtZW1vcnkgYWxsb2NhdGlvbjogJTEwZCBieXRlc1xuIiwKLSAgICAgICAgICB0b3RhbF9hbGxvY2F0aW9uKTsKLSAgICAgICBmcHJpbnRmKFNUREVSUiwgIiAgICAgTnVtYmVyIG9mIGFsbG9jYXRpb25zOiAlMTBkXG4iLAotICAgICAgICAgICAgbnVtX2FsbG9jYXRpb25zKTsKLSNlbmRpZgotICAgfQotCi0jaWZkZWYgUE5HVEVTVF9USU1JTkcKLSAgIHRfc3RvcCA9IChmbG9hdCljbG9jaygpOwotICAgdF9taXNjICs9ICh0X3N0b3AgLSB0X3N0YXJ0KTsKLSAgIHRfc3RhcnQgPSB0X3N0b3A7Ci0gICBmcHJpbnRmKFNUREVSUiwgIiBDUFUgdGltZSB1c2VkID0gJS4zZiBzZWNvbmRzIiwKLSAgICAgICh0X21pc2MrdF9kZWNvZGUrdF9lbmNvZGUpLyhmbG9hdClDTE9DS1NfUEVSX1NFQyk7Ci0gICBmcHJpbnRmKFNUREVSUiwgIiAoZGVjb2RpbmcgJS4zZixcbiIsCi0gICAgICB0X2RlY29kZS8oZmxvYXQpQ0xPQ0tTX1BFUl9TRUMpOwotICAgZnByaW50ZihTVERFUlIsICIgICAgICAgIGVuY29kaW5nICUuM2YgLCIsCi0gICAgICB0X2VuY29kZS8oZmxvYXQpQ0xPQ0tTX1BFUl9TRUMpOwotICAgZnByaW50ZihTVERFUlIsICIgb3RoZXIgJS4zZiBzZWNvbmRzKVxuXG4iLAotICAgICAgdF9taXNjLyhmbG9hdClDTE9DS1NfUEVSX1NFQyk7Ci0jZW5kaWYKLQotICAgaWYgKGllcnJvciA9PSAwKQotICAgICAgZnByaW50ZihTVERFUlIsICIgbGlicG5nIHBhc3NlcyB0ZXN0XG4iKTsKLSAgIGVsc2UKLSAgICAgIGZwcmludGYoU1RERVJSLCAiIGxpYnBuZyBGQUlMUyB0ZXN0XG4iKTsKLSAgIHJldHVybiAoaW50KShpZXJyb3IgIT0gMCk7Ci19Ci0KLS8qIEdlbmVyYXRlIGEgY29tcGlsZXIgZXJyb3IgaWYgdGhlcmUgaXMgYW4gb2xkIHBuZy5oIGluIHRoZSBzZWFyY2ggcGF0aC4gKi8KLXR5cGVkZWYgdmVyc2lvbl8xXzJfMzcgeW91cl9wbmdfaF9pc19ub3RfdmVyc2lvbl8xXzJfMzc7CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wbmd0ZXN0LnBuZyBiL2xpYnMvbGlicG5nL3BuZ3Rlc3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2E2ZGY0Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3BuZ3Rlc3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcG5ndHJhbnMuYyBiL2xpYnMvbGlicG5nL3BuZ3RyYW5zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjFmNTQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5ndHJhbnMuYworKysgL2Rldi9udWxsCkBAIC0xLDY3NCArMCwwIEBACi0KLS8qIHBuZ3RyYW5zLmMgLSB0cmFuc2Zvcm1zIHRoZSBkYXRhIGluIGEgcm93ICh1c2VkIGJ5IGJvdGggcmVhZGVycyBhbmQgd3JpdGVycykKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuMi4zNiBbTWF5IDE0LCAyMDA5XQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQotICovCi0KLSNkZWZpbmUgUE5HX0lOVEVSTkFMCi0jaW5jbHVkZSAicG5nLmgiCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfQkdSX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCkKLS8qIFR1cm4gb24gQkdSLXRvLVJHQiBtYXBwaW5nICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9iZ3IocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9iZ3IiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0JHUjsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpCi0vKiBUdXJuIG9uIDE2IGJpdCBieXRlIHN3YXBwaW5nICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9zd2FwKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfc3dhcCIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gMTYpCi0gICAgICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1NXQVBfQllURVM7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEKQotLyogVHVybiBvbiBwaXhlbCBwYWNraW5nICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9wYWNraW5nKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfcGFja2luZyIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPCA4KQotICAgewotICAgICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19QQUNLOwotICAgICAgcG5nX3B0ci0+dXNyX2JpdF9kZXB0aCA9IDg7Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKXx8ZGVmaW5lZChQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEKQotLyogVHVybiBvbiBwYWNrZWQgcGl4ZWwgc3dhcHBpbmcgKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3BhY2tzd2FwKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfcGFja3N3YXAiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoIDwgOCkKLSAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfUEFDS1NXQVA7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpCi12b2lkIFBOR0FQSQotcG5nX3NldF9zaGlmdChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29sb3JfOHAgdHJ1ZV9iaXRzKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X3NoaWZ0Iik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19TSElGVDsKLSAgIHBuZ19wdHItPnNoaWZ0ID0gKnRydWVfYml0czsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCi1pbnQgUE5HQVBJCi1wbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ludGVybGFjZSBoYW5kbGluZyIpOwotICAgaWYgKHBuZ19wdHIgJiYgcG5nX3B0ci0+aW50ZXJsYWNlZCkKLSAgIHsKLSAgICAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfSU5URVJMQUNFOwotICAgICAgcmV0dXJuICg3KTsKLSAgIH0KLQotICAgcmV0dXJuICgxKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKQotLyogQWRkIGEgZmlsbGVyIGJ5dGUgb24gcmVhZCwgb3IgcmVtb3ZlIGEgZmlsbGVyIG9yIGFscGhhIGJ5dGUgb24gd3JpdGUuCi0gKiBUaGUgZmlsbGVyIHR5cGUgaGFzIGNoYW5nZWQgaW4gdjAuOTUgdG8gYWxsb3cgZnV0dXJlIDItYnl0ZSBmaWxsZXJzCi0gKiBmb3IgNDgtYml0IGlucHV0IGRhdGEsIGFzIHdlbGwgYXMgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBzb21lIGNvbXBpbGVycwotICogdGhhdCBkb24ndCBsaWtlIGJ5dGVzIGFzIHBhcmFtZXRlcnMuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2ZpbGxlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBmaWxsZXIsIGludCBmaWxsZXJfbG9jKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ZpbGxlciIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB8PSBQTkdfRklMTEVSOwotICAgcG5nX3B0ci0+ZmlsbGVyID0gKHBuZ19ieXRlKWZpbGxlcjsKLSAgIGlmIChmaWxsZXJfbG9jID09IFBOR19GSUxMRVJfQUZURVIpCi0gICAgICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19GSUxMRVJfQUZURVI7Ci0gICBlbHNlCi0gICAgICBwbmdfcHRyLT5mbGFncyAmPSB+UE5HX0ZMQUdfRklMTEVSX0FGVEVSOwotCi0gICAvKiBUaGlzIHNob3VsZCBwcm9iYWJseSBnbyBpbiB0aGUgImRvX3JlYWRfZmlsbGVyIiByb3V0aW5lLgotICAgICogSSBhdHRlbXB0ZWQgdG8gZG8gdGhhdCBpbiBsaWJwbmctMS4wLjFhIGJ1dCB0aGF0IGNhdXNlZCBwcm9ibGVtcwotICAgICogc28gSSByZXN0b3JlZCBpdCBpbiBsaWJwbmctMS4wLjJhCi0gICAqLwotCi0gICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICB7Ci0gICAgICBwbmdfcHRyLT51c3JfY2hhbm5lbHMgPSA0OwotICAgfQotCi0gICAvKiBBbHNvIEkgYWRkZWQgdGhpcyBpbiBsaWJwbmctMS4wLjJhICh3aGF0IGhhcHBlbnMgd2hlbiB3ZSBleHBhbmQKLSAgICAqIGEgbGVzcy10aGFuLTgtYml0IGdyYXlzY2FsZSB0byBHQT8gKi8KLQotICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBwbmdfcHRyLT5iaXRfZGVwdGggPj0gOCkKLSAgIHsKLSAgICAgIHBuZ19wdHItPnVzcl9jaGFubmVscyA9IDI7Ci0gICB9Ci19Ci0KLSNpZiAhZGVmaW5lZChQTkdfMV8wX1gpCi0vKiBBZGRlZCB0byBsaWJwbmctMS4yLjcgKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2FkZF9hbHBoYShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBmaWxsZXIsIGludCBmaWxsZXJfbG9jKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2FkZF9hbHBoYSIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIGZpbGxlciwgZmlsbGVyX2xvYyk7Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0FERF9BTFBIQTsKLX0KLSNlbmRpZgotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRCkKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3N3YXBfYWxwaGEocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9zd2FwX2FscGhhIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19TV0FQX0FMUEhBOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEKQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfaW52ZXJ0X2FscGhhIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zIHw9IFBOR19JTlZFUlRfQUxQSEE7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkKLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2ludmVydF9tb25vKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfaW52ZXJ0X21vbm8iKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX0lOVkVSVF9NT05POwotfQotCi0vKiBJbnZlcnQgbW9ub2Nocm9tZSBncmF5c2NhbGUgZGF0YSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9faW52ZXJ0KHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19pbnZlcnQiKTsKLSAgLyogVGhpcyB0ZXN0IHJlbW92ZWQgZnJvbSBsaWJwbmcgdmVyc2lvbiAxLjAuMTMgYW5kIDEuMi4wOgotICAgKiAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDEgJiYKLSAgICovCi0jaWYgZGVmaW5lZChQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQpCi0gICBpZiAocm93ID09IE5VTEwgfHwgcm93X2luZm8gPT0gTlVMTCkKLSAgICAgcmV0dXJuOwotI2VuZGlmCi0gICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgIHsKLSAgICAgIHBuZ19ieXRlcCBycCA9IHJvdzsKLSAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICBwbmdfdWludF8zMiBpc3RvcCA9IHJvd19pbmZvLT5yb3dieXRlczsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGlzdG9wOyBpKyspCi0gICAgICB7Ci0gICAgICAgICAqcnAgPSAocG5nX2J5dGUpKH4oKnJwKSk7Ci0gICAgICAgICBycCsrOwotICAgICAgfQotICAgfQotICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSAmJgotICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9PSA4KQotICAgewotICAgICAgcG5nX2J5dGVwIHJwID0gcm93OwotICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgIHBuZ191aW50XzMyIGlzdG9wID0gcm93X2luZm8tPnJvd2J5dGVzOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrPTIpCi0gICAgICB7Ci0gICAgICAgICAqcnAgPSAocG5nX2J5dGUpKH4oKnJwKSk7Ci0gICAgICAgICBycCs9MjsKLSAgICAgIH0KLSAgIH0KLSAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEgJiYKLSAgICAgIHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMTYpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgcnAgPSByb3c7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSByb3dfaW5mby0+cm93Ynl0ZXM7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3RvcDsgaSs9NCkKLSAgICAgIHsKLSAgICAgICAgICpycCA9IChwbmdfYnl0ZSkofigqcnApKTsKLSAgICAgICAgICoocnArMSkgPSAocG5nX2J5dGUpKH4oKihycCsxKSkpOwotICAgICAgICAgcnArPTQ7Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1JFQURfU1dBUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEKQotLyogU3dhcHMgYnl0ZSBvcmRlciBvbiAxNiBiaXQgZGVwdGggaW1hZ2VzICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19zd2FwKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3cpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19zd2FwIik7Ci0gICBpZiAoCi0jaWYgZGVmaW5lZChQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQpCi0gICAgICAgcm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCAmJgotI2VuZGlmCi0gICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9PSAxNikKLSAgIHsKLSAgICAgIHBuZ19ieXRlcCBycCA9IHJvdzsKLSAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICBwbmdfdWludF8zMiBpc3RvcD0gcm93X2luZm8tPndpZHRoICogcm93X2luZm8tPmNoYW5uZWxzOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKywgcnAgKz0gMikKLSAgICAgIHsKLSAgICAgICAgIHBuZ19ieXRlIHQgPSAqcnA7Ci0gICAgICAgICAqcnAgPSAqKHJwICsgMSk7Ci0gICAgICAgICAqKHJwICsgMSkgPSB0OwotICAgICAgfQotICAgfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRCl8fGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkKLXN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgb25lYnBwc3dhcHRhYmxlWzI1Nl0gPSB7Ci0gICAweDAwLCAweDgwLCAweDQwLCAweEMwLCAweDIwLCAweEEwLCAweDYwLCAweEUwLAotICAgMHgxMCwgMHg5MCwgMHg1MCwgMHhEMCwgMHgzMCwgMHhCMCwgMHg3MCwgMHhGMCwKLSAgIDB4MDgsIDB4ODgsIDB4NDgsIDB4QzgsIDB4MjgsIDB4QTgsIDB4NjgsIDB4RTgsCi0gICAweDE4LCAweDk4LCAweDU4LCAweEQ4LCAweDM4LCAweEI4LCAweDc4LCAweEY4LAotICAgMHgwNCwgMHg4NCwgMHg0NCwgMHhDNCwgMHgyNCwgMHhBNCwgMHg2NCwgMHhFNCwKLSAgIDB4MTQsIDB4OTQsIDB4NTQsIDB4RDQsIDB4MzQsIDB4QjQsIDB4NzQsIDB4RjQsCi0gICAweDBDLCAweDhDLCAweDRDLCAweENDLCAweDJDLCAweEFDLCAweDZDLCAweEVDLAotICAgMHgxQywgMHg5QywgMHg1QywgMHhEQywgMHgzQywgMHhCQywgMHg3QywgMHhGQywKLSAgIDB4MDIsIDB4ODIsIDB4NDIsIDB4QzIsIDB4MjIsIDB4QTIsIDB4NjIsIDB4RTIsCi0gICAweDEyLCAweDkyLCAweDUyLCAweEQyLCAweDMyLCAweEIyLCAweDcyLCAweEYyLAotICAgMHgwQSwgMHg4QSwgMHg0QSwgMHhDQSwgMHgyQSwgMHhBQSwgMHg2QSwgMHhFQSwKLSAgIDB4MUEsIDB4OUEsIDB4NUEsIDB4REEsIDB4M0EsIDB4QkEsIDB4N0EsIDB4RkEsCi0gICAweDA2LCAweDg2LCAweDQ2LCAweEM2LCAweDI2LCAweEE2LCAweDY2LCAweEU2LAotICAgMHgxNiwgMHg5NiwgMHg1NiwgMHhENiwgMHgzNiwgMHhCNiwgMHg3NiwgMHhGNiwKLSAgIDB4MEUsIDB4OEUsIDB4NEUsIDB4Q0UsIDB4MkUsIDB4QUUsIDB4NkUsIDB4RUUsCi0gICAweDFFLCAweDlFLCAweDVFLCAweERFLCAweDNFLCAweEJFLCAweDdFLCAweEZFLAotICAgMHgwMSwgMHg4MSwgMHg0MSwgMHhDMSwgMHgyMSwgMHhBMSwgMHg2MSwgMHhFMSwKLSAgIDB4MTEsIDB4OTEsIDB4NTEsIDB4RDEsIDB4MzEsIDB4QjEsIDB4NzEsIDB4RjEsCi0gICAweDA5LCAweDg5LCAweDQ5LCAweEM5LCAweDI5LCAweEE5LCAweDY5LCAweEU5LAotICAgMHgxOSwgMHg5OSwgMHg1OSwgMHhEOSwgMHgzOSwgMHhCOSwgMHg3OSwgMHhGOSwKLSAgIDB4MDUsIDB4ODUsIDB4NDUsIDB4QzUsIDB4MjUsIDB4QTUsIDB4NjUsIDB4RTUsCi0gICAweDE1LCAweDk1LCAweDU1LCAweEQ1LCAweDM1LCAweEI1LCAweDc1LCAweEY1LAotICAgMHgwRCwgMHg4RCwgMHg0RCwgMHhDRCwgMHgyRCwgMHhBRCwgMHg2RCwgMHhFRCwKLSAgIDB4MUQsIDB4OUQsIDB4NUQsIDB4REQsIDB4M0QsIDB4QkQsIDB4N0QsIDB4RkQsCi0gICAweDAzLCAweDgzLCAweDQzLCAweEMzLCAweDIzLCAweEEzLCAweDYzLCAweEUzLAotICAgMHgxMywgMHg5MywgMHg1MywgMHhEMywgMHgzMywgMHhCMywgMHg3MywgMHhGMywKLSAgIDB4MEIsIDB4OEIsIDB4NEIsIDB4Q0IsIDB4MkIsIDB4QUIsIDB4NkIsIDB4RUIsCi0gICAweDFCLCAweDlCLCAweDVCLCAweERCLCAweDNCLCAweEJCLCAweDdCLCAweEZCLAotICAgMHgwNywgMHg4NywgMHg0NywgMHhDNywgMHgyNywgMHhBNywgMHg2NywgMHhFNywKLSAgIDB4MTcsIDB4OTcsIDB4NTcsIDB4RDcsIDB4MzcsIDB4QjcsIDB4NzcsIDB4RjcsCi0gICAweDBGLCAweDhGLCAweDRGLCAweENGLCAweDJGLCAweEFGLCAweDZGLCAweEVGLAotICAgMHgxRiwgMHg5RiwgMHg1RiwgMHhERiwgMHgzRiwgMHhCRiwgMHg3RiwgMHhGRgotfTsKLQotc3RhdGljIFBOR19DT05TVCBwbmdfYnl0ZSB0d29icHBzd2FwdGFibGVbMjU2XSA9IHsKLSAgIDB4MDAsIDB4NDAsIDB4ODAsIDB4QzAsIDB4MTAsIDB4NTAsIDB4OTAsIDB4RDAsCi0gICAweDIwLCAweDYwLCAweEEwLCAweEUwLCAweDMwLCAweDcwLCAweEIwLCAweEYwLAotICAgMHgwNCwgMHg0NCwgMHg4NCwgMHhDNCwgMHgxNCwgMHg1NCwgMHg5NCwgMHhENCwKLSAgIDB4MjQsIDB4NjQsIDB4QTQsIDB4RTQsIDB4MzQsIDB4NzQsIDB4QjQsIDB4RjQsCi0gICAweDA4LCAweDQ4LCAweDg4LCAweEM4LCAweDE4LCAweDU4LCAweDk4LCAweEQ4LAotICAgMHgyOCwgMHg2OCwgMHhBOCwgMHhFOCwgMHgzOCwgMHg3OCwgMHhCOCwgMHhGOCwKLSAgIDB4MEMsIDB4NEMsIDB4OEMsIDB4Q0MsIDB4MUMsIDB4NUMsIDB4OUMsIDB4REMsCi0gICAweDJDLCAweDZDLCAweEFDLCAweEVDLCAweDNDLCAweDdDLCAweEJDLCAweEZDLAotICAgMHgwMSwgMHg0MSwgMHg4MSwgMHhDMSwgMHgxMSwgMHg1MSwgMHg5MSwgMHhEMSwKLSAgIDB4MjEsIDB4NjEsIDB4QTEsIDB4RTEsIDB4MzEsIDB4NzEsIDB4QjEsIDB4RjEsCi0gICAweDA1LCAweDQ1LCAweDg1LCAweEM1LCAweDE1LCAweDU1LCAweDk1LCAweEQ1LAotICAgMHgyNSwgMHg2NSwgMHhBNSwgMHhFNSwgMHgzNSwgMHg3NSwgMHhCNSwgMHhGNSwKLSAgIDB4MDksIDB4NDksIDB4ODksIDB4QzksIDB4MTksIDB4NTksIDB4OTksIDB4RDksCi0gICAweDI5LCAweDY5LCAweEE5LCAweEU5LCAweDM5LCAweDc5LCAweEI5LCAweEY5LAotICAgMHgwRCwgMHg0RCwgMHg4RCwgMHhDRCwgMHgxRCwgMHg1RCwgMHg5RCwgMHhERCwKLSAgIDB4MkQsIDB4NkQsIDB4QUQsIDB4RUQsIDB4M0QsIDB4N0QsIDB4QkQsIDB4RkQsCi0gICAweDAyLCAweDQyLCAweDgyLCAweEMyLCAweDEyLCAweDUyLCAweDkyLCAweEQyLAotICAgMHgyMiwgMHg2MiwgMHhBMiwgMHhFMiwgMHgzMiwgMHg3MiwgMHhCMiwgMHhGMiwKLSAgIDB4MDYsIDB4NDYsIDB4ODYsIDB4QzYsIDB4MTYsIDB4NTYsIDB4OTYsIDB4RDYsCi0gICAweDI2LCAweDY2LCAweEE2LCAweEU2LCAweDM2LCAweDc2LCAweEI2LCAweEY2LAotICAgMHgwQSwgMHg0QSwgMHg4QSwgMHhDQSwgMHgxQSwgMHg1QSwgMHg5QSwgMHhEQSwKLSAgIDB4MkEsIDB4NkEsIDB4QUEsIDB4RUEsIDB4M0EsIDB4N0EsIDB4QkEsIDB4RkEsCi0gICAweDBFLCAweDRFLCAweDhFLCAweENFLCAweDFFLCAweDVFLCAweDlFLCAweERFLAotICAgMHgyRSwgMHg2RSwgMHhBRSwgMHhFRSwgMHgzRSwgMHg3RSwgMHhCRSwgMHhGRSwKLSAgIDB4MDMsIDB4NDMsIDB4ODMsIDB4QzMsIDB4MTMsIDB4NTMsIDB4OTMsIDB4RDMsCi0gICAweDIzLCAweDYzLCAweEEzLCAweEUzLCAweDMzLCAweDczLCAweEIzLCAweEYzLAotICAgMHgwNywgMHg0NywgMHg4NywgMHhDNywgMHgxNywgMHg1NywgMHg5NywgMHhENywKLSAgIDB4MjcsIDB4NjcsIDB4QTcsIDB4RTcsIDB4MzcsIDB4NzcsIDB4QjcsIDB4RjcsCi0gICAweDBCLCAweDRCLCAweDhCLCAweENCLCAweDFCLCAweDVCLCAweDlCLCAweERCLAotICAgMHgyQiwgMHg2QiwgMHhBQiwgMHhFQiwgMHgzQiwgMHg3QiwgMHhCQiwgMHhGQiwKLSAgIDB4MEYsIDB4NEYsIDB4OEYsIDB4Q0YsIDB4MUYsIDB4NUYsIDB4OUYsIDB4REYsCi0gICAweDJGLCAweDZGLCAweEFGLCAweEVGLCAweDNGLCAweDdGLCAweEJGLCAweEZGCi19OwotCi1zdGF0aWMgUE5HX0NPTlNUIHBuZ19ieXRlIGZvdXJicHBzd2FwdGFibGVbMjU2XSA9IHsKLSAgIDB4MDAsIDB4MTAsIDB4MjAsIDB4MzAsIDB4NDAsIDB4NTAsIDB4NjAsIDB4NzAsCi0gICAweDgwLCAweDkwLCAweEEwLCAweEIwLCAweEMwLCAweEQwLCAweEUwLCAweEYwLAotICAgMHgwMSwgMHgxMSwgMHgyMSwgMHgzMSwgMHg0MSwgMHg1MSwgMHg2MSwgMHg3MSwKLSAgIDB4ODEsIDB4OTEsIDB4QTEsIDB4QjEsIDB4QzEsIDB4RDEsIDB4RTEsIDB4RjEsCi0gICAweDAyLCAweDEyLCAweDIyLCAweDMyLCAweDQyLCAweDUyLCAweDYyLCAweDcyLAotICAgMHg4MiwgMHg5MiwgMHhBMiwgMHhCMiwgMHhDMiwgMHhEMiwgMHhFMiwgMHhGMiwKLSAgIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4NDMsIDB4NTMsIDB4NjMsIDB4NzMsCi0gICAweDgzLCAweDkzLCAweEEzLCAweEIzLCAweEMzLCAweEQzLCAweEUzLCAweEYzLAotICAgMHgwNCwgMHgxNCwgMHgyNCwgMHgzNCwgMHg0NCwgMHg1NCwgMHg2NCwgMHg3NCwKLSAgIDB4ODQsIDB4OTQsIDB4QTQsIDB4QjQsIDB4QzQsIDB4RDQsIDB4RTQsIDB4RjQsCi0gICAweDA1LCAweDE1LCAweDI1LCAweDM1LCAweDQ1LCAweDU1LCAweDY1LCAweDc1LAotICAgMHg4NSwgMHg5NSwgMHhBNSwgMHhCNSwgMHhDNSwgMHhENSwgMHhFNSwgMHhGNSwKLSAgIDB4MDYsIDB4MTYsIDB4MjYsIDB4MzYsIDB4NDYsIDB4NTYsIDB4NjYsIDB4NzYsCi0gICAweDg2LCAweDk2LCAweEE2LCAweEI2LCAweEM2LCAweEQ2LCAweEU2LCAweEY2LAotICAgMHgwNywgMHgxNywgMHgyNywgMHgzNywgMHg0NywgMHg1NywgMHg2NywgMHg3NywKLSAgIDB4ODcsIDB4OTcsIDB4QTcsIDB4QjcsIDB4QzcsIDB4RDcsIDB4RTcsIDB4RjcsCi0gICAweDA4LCAweDE4LCAweDI4LCAweDM4LCAweDQ4LCAweDU4LCAweDY4LCAweDc4LAotICAgMHg4OCwgMHg5OCwgMHhBOCwgMHhCOCwgMHhDOCwgMHhEOCwgMHhFOCwgMHhGOCwKLSAgIDB4MDksIDB4MTksIDB4MjksIDB4MzksIDB4NDksIDB4NTksIDB4NjksIDB4NzksCi0gICAweDg5LCAweDk5LCAweEE5LCAweEI5LCAweEM5LCAweEQ5LCAweEU5LCAweEY5LAotICAgMHgwQSwgMHgxQSwgMHgyQSwgMHgzQSwgMHg0QSwgMHg1QSwgMHg2QSwgMHg3QSwKLSAgIDB4OEEsIDB4OUEsIDB4QUEsIDB4QkEsIDB4Q0EsIDB4REEsIDB4RUEsIDB4RkEsCi0gICAweDBCLCAweDFCLCAweDJCLCAweDNCLCAweDRCLCAweDVCLCAweDZCLCAweDdCLAotICAgMHg4QiwgMHg5QiwgMHhBQiwgMHhCQiwgMHhDQiwgMHhEQiwgMHhFQiwgMHhGQiwKLSAgIDB4MEMsIDB4MUMsIDB4MkMsIDB4M0MsIDB4NEMsIDB4NUMsIDB4NkMsIDB4N0MsCi0gICAweDhDLCAweDlDLCAweEFDLCAweEJDLCAweENDLCAweERDLCAweEVDLCAweEZDLAotICAgMHgwRCwgMHgxRCwgMHgyRCwgMHgzRCwgMHg0RCwgMHg1RCwgMHg2RCwgMHg3RCwKLSAgIDB4OEQsIDB4OUQsIDB4QUQsIDB4QkQsIDB4Q0QsIDB4REQsIDB4RUQsIDB4RkQsCi0gICAweDBFLCAweDFFLCAweDJFLCAweDNFLCAweDRFLCAweDVFLCAweDZFLCAweDdFLAotICAgMHg4RSwgMHg5RSwgMHhBRSwgMHhCRSwgMHhDRSwgMHhERSwgMHhFRSwgMHhGRSwKLSAgIDB4MEYsIDB4MUYsIDB4MkYsIDB4M0YsIDB4NEYsIDB4NUYsIDB4NkYsIDB4N0YsCi0gICAweDhGLCAweDlGLCAweEFGLCAweEJGLCAweENGLCAweERGLCAweEVGLCAweEZGCi19OwotCi0vKiBTd2FwcyBwaXhlbCBwYWNraW5nIG9yZGVyIHdpdGhpbiBieXRlcyAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fcGFja3N3YXAocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3BhY2tzd2FwIik7Ci0gICBpZiAoCi0jaWYgZGVmaW5lZChQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQpCi0gICAgICAgcm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCAmJgotI2VuZGlmCi0gICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgcnAsIGVuZCwgdGFibGU7Ci0KLSAgICAgIGVuZCA9IHJvdyArIHJvd19pbmZvLT5yb3dieXRlczsKLQotICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMSkKLSAgICAgICAgIHRhYmxlID0gKHBuZ19ieXRlcClvbmVicHBzd2FwdGFibGU7Ci0gICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDIpCi0gICAgICAgICB0YWJsZSA9IChwbmdfYnl0ZXApdHdvYnBwc3dhcHRhYmxlOwotICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA0KQotICAgICAgICAgdGFibGUgPSAocG5nX2J5dGVwKWZvdXJicHBzd2FwdGFibGU7Ci0gICAgICBlbHNlCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGZvciAocnAgPSByb3c7IHJwIDwgZW5kOyBycCsrKQotICAgICAgICAgKnJwID0gdGFibGVbKnJwXTsKLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQgb3IgUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCAqLwotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVEKQotLyogUmVtb3ZlIGZpbGxlciBvciBhbHBoYSBieXRlKHMpICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19zdHJpcF9maWxsZXIocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX3VpbnRfMzIgZmxhZ3MpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19zdHJpcF9maWxsZXIiKTsKLSNpZiBkZWZpbmVkKFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRCkKLSAgIGlmIChyb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMKQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgc3A9cm93OwotICAgICAgcG5nX2J5dGVwIGRwPXJvdzsKLSAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aD1yb3dfaW5mby0+d2lkdGg7Ci0gICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICBpZiAoKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAotICAgICAgICAgIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEgJiYKLSAgICAgICAgICAoZmxhZ3MgJiBQTkdfRkxBR19TVFJJUF9BTFBIQSkpKSAmJgotICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9PSA0KQotICAgICAgewotICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBSR0JYIG9yIFJHQkEgdG8gUkdCICovCi0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBkcCs9Mzsgc3ArPTQ7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIFhSR0Igb3IgQVJHQiB0byBSR0IgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNwKys7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAyNDsKLSAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDM7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLwotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIFJSR0dCQlhYIG9yIFJSR0dCQkFBIHRvIFJSR0dCQiAqLwotICAgICAgICAgICAgICAgc3AgKz0gODsgZHAgKz0gNjsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIFRoaXMgY291bGQgYmUgKGFsdGhvdWdoIHBuZ19tZW1jcHkgaXMgcHJvYmFibHkgc2xvd2VyKToKLSAgICAgICAgICAgICAgICAgIHBuZ19tZW1jcHkoZHAsIHNwLCA2KTsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDg7Ci0gICAgICAgICAgICAgICAgICBkcCArPSA2OwotICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBYWFJSR0dCQiBvciBBQVJSR0dCQiB0byBSUkdHQkIgKi8KLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIFRoaXMgY291bGQgYmUgKGFsdGhvdWdoIHBuZ19tZW1jcHkgaXMgcHJvYmFibHkgc2xvd2VyKToKLSAgICAgICAgICAgICAgICAgIHBuZ19tZW1jcHkoZHAsIHNwLCA2KTsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDg7Ci0gICAgICAgICAgICAgICAgICBkcCArPSA2OwotICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgc3ArPTI7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSA0ODsKLSAgICAgICAgICAgIHJvd19pbmZvLT5yb3dieXRlcyA9IHJvd193aWR0aCAqIDY7Ci0gICAgICAgICB9Ci0gICAgICAgICByb3dfaW5mby0+Y2hhbm5lbHMgPSAzOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKLSAgICAgICAgIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBICYmCi0gICAgICAgICAoZmxhZ3MgJiBQTkdfRkxBR19TVFJJUF9BTFBIQSkpKSAmJgotICAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9PSAyKQotICAgICAgewotICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBHWCBvciBHQSB0byBHICovCi0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBQTkdfRkxBR19GSUxMRVJfQUZURVIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgc3ArKzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBYRyBvciBBRyB0byBHICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDg7Ci0gICAgICAgICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSByb3dfd2lkdGg7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIC8qIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KSAqLwotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGZsYWdzICYgUE5HX0ZMQUdfRklMTEVSX0FGVEVSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEdHWFggb3IgR0dBQSB0byBHRyAqLwotICAgICAgICAgICAgICAgc3AgKz0gNDsgZHAgKz0gMjsKLSAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKnNwKys7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBYWEdHIG9yIEFBR0cgdG8gR0cgKi8KLSAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNwICs9IDI7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9ICpzcCsrOwotICAgICAgICAgICAgICAgICAgKmRwKysgPSAqc3ArKzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvd19pbmZvLT5waXhlbF9kZXB0aCA9IDE2OwotICAgICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gcm93X3dpZHRoICogMjsKLSAgICAgICAgIH0KLSAgICAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9IDE7Ci0gICAgICB9Ci0gICAgICBpZiAoZmxhZ3MgJiBQTkdfRkxBR19TVFJJUF9BTFBIQSkKLSAgICAgICAgcm93X2luZm8tPmNvbG9yX3R5cGUgJj0gflBOR19DT0xPUl9NQVNLX0FMUEhBOwotICAgfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpCi0vKiBTd2FwcyByZWQgYW5kIGJsdWUgYnl0ZXMgd2l0aGluIGEgcGl4ZWwgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX2Jncihwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZG9fYmdyIik7Ci0gICBpZiAoCi0jaWYgZGVmaW5lZChQTkdfVVNFTEVTU19URVNUU19TVVBQT1JURUQpCi0gICAgICAgcm93ICE9IE5VTEwgJiYgcm93X2luZm8gIT0gTlVMTCAmJgotI2VuZGlmCi0gICAgICAgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQotICAgewotICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgcnA7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSAzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZSA9ICpycDsKLSAgICAgICAgICAgICAgICpycCA9ICoocnAgKyAyKTsKLSAgICAgICAgICAgICAgICoocnAgKyAyKSA9IHNhdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgcnA7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZSA9ICpycDsKLSAgICAgICAgICAgICAgICpycCA9ICoocnAgKyAyKTsKLSAgICAgICAgICAgICAgICoocnAgKyAyKSA9IHNhdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotICAgICAgewotICAgICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBycDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93OyBpIDwgcm93X3dpZHRoOyBpKyssIHJwICs9IDYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZSBzYXZlID0gKnJwOwotICAgICAgICAgICAgICAgKnJwID0gKihycCArIDQpOwotICAgICAgICAgICAgICAgKihycCArIDQpID0gc2F2ZTsKLSAgICAgICAgICAgICAgIHNhdmUgPSAqKHJwICsgMSk7Ci0gICAgICAgICAgICAgICAqKHJwICsgMSkgPSAqKHJwICsgNSk7Ci0gICAgICAgICAgICAgICAqKHJwICsgNSkgPSBzYXZlOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHJwOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMCwgcnAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKywgcnAgKz0gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmUgPSAqcnA7Ci0gICAgICAgICAgICAgICAqcnAgPSAqKHJwICsgNCk7Ci0gICAgICAgICAgICAgICAqKHJwICsgNCkgPSBzYXZlOwotICAgICAgICAgICAgICAgc2F2ZSA9ICoocnAgKyAxKTsKLSAgICAgICAgICAgICAgICoocnAgKyAxKSA9ICoocnAgKyA1KTsKLSAgICAgICAgICAgICAgICoocnAgKyA1KSA9IHNhdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfQkdSX1NVUFBPUlRFRCBvciBQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCAqLwotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19MRUdBQ1lfU1VQUE9SVEVEKQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAKLSAgIHVzZXJfdHJhbnNmb3JtX3B0ciwgaW50IHVzZXJfdHJhbnNmb3JtX2RlcHRoLCBpbnQgdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHMpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSNpZiBkZWZpbmVkKFBOR19VU0VSX1RSQU5TRk9STV9QVFJfU1VQUE9SVEVEKQotICAgcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fcHRyID0gdXNlcl90cmFuc2Zvcm1fcHRyOwotICAgcG5nX3B0ci0+dXNlcl90cmFuc2Zvcm1fZGVwdGggPSAocG5nX2J5dGUpdXNlcl90cmFuc2Zvcm1fZGVwdGg7Ci0gICBwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9jaGFubmVscyA9IChwbmdfYnl0ZSl1c2VyX3RyYW5zZm9ybV9jaGFubmVsczsKLSNlbHNlCi0gICBpZiAodXNlcl90cmFuc2Zvcm1fcHRyIHx8IHVzZXJfdHJhbnNmb3JtX2RlcHRoIHx8IHVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgIlRoaXMgdmVyc2lvbiBvZiBsaWJwbmcgZG9lcyBub3Qgc3VwcG9ydCB1c2VyIHRyYW5zZm9ybSBpbmZvIik7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB1c2VyX3RyYW5zZm9ybV9wdHIgYXNzb2NpYXRlZCB3aXRoCi0gKiB0aGUgdXNlciB0cmFuc2Zvcm0gZnVuY3Rpb25zLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBmcmVlIGFueSBtZW1vcnkKLSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBvaW50ZXIgYmVmb3JlIHBuZ193cml0ZV9kZXN0cm95IGFuZCBwbmdfcmVhZF9kZXN0cm95Ci0gKiBhcmUgY2FsbGVkLgotICovCi1wbmdfdm9pZHAgUE5HQVBJCi1wbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0jaWYgZGVmaW5lZChQTkdfVVNFUl9UUkFOU0ZPUk1fUFRSX1NVUFBPUlRFRCkKLSAgIHJldHVybiAoKHBuZ192b2lkcClwbmdfcHRyLT51c2VyX3RyYW5zZm9ybV9wdHIpOwotI2Vsc2UKLSAgIHJldHVybiAoTlVMTCk7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgfHwgUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcG5ndmNyZC5jIGIvbGlicy9saWJwbmcvcG5ndmNyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTQyMzNlLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3BuZ3ZjcmQuYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS8qIHBuZ2d2cmQuYyB3YXMgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjIuMjAuICovCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wbmd3aW8uYyBiL2xpYnMvbGlicG5nL3BuZ3dpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDBiNzFkLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3BuZ3dpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLQotLyogcG5nd2lvLmMgLSBmdW5jdGlvbnMgZm9yIGRhdGEgb3V0cHV0Ci0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuMzcgW0p1bmUgNCwgMjAwOV0KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqCi0gKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBsb2NhdGlvbiBmb3IgYWxsIG91dHB1dC4gIFVzZXJzIHdobyBuZWVkCi0gKiBzcGVjaWFsIGhhbmRsaW5nIGFyZSBleHBlY3RlZCB0byB3cml0ZSBmdW5jdGlvbnMgdGhhdCBoYXZlIHRoZSBzYW1lCi0gKiBhcmd1bWVudHMgYXMgdGhlc2UgYW5kIHBlcmZvcm0gc2ltaWxhciBmdW5jdGlvbnMsIGJ1dCB0aGF0IHBvc3NpYmx5Ci0gKiB1c2UgZGlmZmVyZW50IG91dHB1dCBtZXRob2RzLiAgTm90ZSB0aGF0IHlvdSBzaG91bGRuJ3QgY2hhbmdlIHRoZXNlCi0gKiBmdW5jdGlvbnMsIGJ1dCByYXRoZXIgd3JpdGUgcmVwbGFjZW1lbnQgZnVuY3Rpb25zIGFuZCB0aGVuIGNoYW5nZQotICogdGhlbSBhdCBydW4gdGltZSB3aXRoIHBuZ19zZXRfd3JpdGVfZm4oLi4uKS4KLSAqLwotCi0jZGVmaW5lIFBOR19JTlRFUk5BTAotI2luY2x1ZGUgInBuZy5oIgotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLQotLyogV3JpdGUgdGhlIGRhdGEgdG8gd2hhdGV2ZXIgb3V0cHV0IHlvdSBhcmUgdXNpbmcuICBUaGUgZGVmYXVsdCByb3V0aW5lCi0gKiB3cml0ZXMgdG8gYSBmaWxlIHBvaW50ZXIuICBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIHNvbWV0aW1lcyBnZXRzIGNhbGxlZAotICogd2l0aCB2ZXJ5IHNtYWxsIGxlbmd0aHMsIHNvIHlvdSBzaG91bGQgaW1wbGVtZW50IHNvbWUga2luZCBvZiBzaW1wbGUKLSAqIGJ1ZmZlcmluZyBpZiB5b3UgYXJlIHVzaW5nIHVuYnVmZmVyZWQgd3JpdGVzLiAgVGhpcyBzaG91bGQgbmV2ZXIgYmUgYXNrZWQKLSAqIHRvIHdyaXRlIG1vcmUgdGhhbiA2NEsgb24gYSAxNiBiaXQgbWFjaGluZS4KLSAqLwotCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIGlmIChwbmdfcHRyLT53cml0ZV9kYXRhX2ZuICE9IE5VTEwgKQotICAgICAgKCoocG5nX3B0ci0+d3JpdGVfZGF0YV9mbikpKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7Ci0gICBlbHNlCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkNhbGwgdG8gTlVMTCB3cml0ZSBmdW5jdGlvbiIpOwotfQotCi0jaWYgIWRlZmluZWQoUE5HX05PX1NURElPKQotLyogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgd3JpdGluZyBvZiBkYXRhLiAgSWYgeW91IGFyZQotICogbm90IHdyaXRpbmcgdG8gYSBzdGFuZGFyZCBDIHN0cmVhbSwgeW91IHNob3VsZCBjcmVhdGUgYSByZXBsYWNlbWVudAotICogd3JpdGVfZGF0YSBmdW5jdGlvbiBhbmQgdXNlIGl0IGF0IHJ1biB0aW1lIHdpdGggcG5nX3NldF93cml0ZV9mbigpLCByYXRoZXIKLSAqIHRoYW4gY2hhbmdpbmcgdGhlIGxpYnJhcnkuCi0gKi8KLSNpZm5kZWYgVVNFX0ZBUl9LRVlXT1JECi12b2lkIFBOR0FQSQotcG5nX2RlZmF1bHRfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0gICBwbmdfdWludF8zMiBjaGVjazsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICBpZiAoICFXcml0ZUZpbGUoKEhBTkRMRSkocG5nX3B0ci0+aW9fcHRyKSwgZGF0YSwgbGVuZ3RoLCAmY2hlY2ssIE5VTEwpICkKLSAgICAgIGNoZWNrID0gMDsKLSNlbHNlCi0gICBjaGVjayA9IGZ3cml0ZShkYXRhLCAxLCBsZW5ndGgsIChwbmdfRklMRV9wKShwbmdfcHRyLT5pb19wdHIpKTsKLSNlbmRpZgotICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiV3JpdGUgRXJyb3IiKTsKLX0KLSNlbHNlCi0vKiBUaGlzIGlzIHRoZSBtb2RlbC1pbmRlcGVuZGVudCB2ZXJzaW9uLiBTaW5jZSB0aGUgc3RhbmRhcmQgSS9PIGxpYnJhcnkKLSAqIGNhbid0IGhhbmRsZSBmYXIgYnVmZmVycyBpbiB0aGUgbWVkaXVtIGFuZCBzbWFsbCBtb2RlbHMsIHdlIGhhdmUgdG8gY29weQotICogdGhlIGRhdGEuCi0gKi8KLQotI2RlZmluZSBORUFSX0JVRl9TSVpFIDEwMjQKLSNkZWZpbmUgTUlOKGEsYikgKGEgPD0gYiA/IGEgOiBiKQotCi12b2lkIFBOR0FQSQotcG5nX2RlZmF1bHRfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0gICBwbmdfdWludF8zMiBjaGVjazsKLSAgIHBuZ19ieXRlICpuZWFyX2RhdGE7ICAvKiBOZWVkcyB0byBiZSAicG5nX2J5dGUgKiIgaW5zdGVhZCBvZiAicG5nX2J5dGVwIiAqLwotICAgcG5nX0ZJTEVfcCBpb19wdHI7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICAvKiBDaGVjayBpZiBkYXRhIHJlYWxseSBpcyBuZWFyLiBJZiBzbywgdXNlIHVzdWFsIGNvZGUuICovCi0gICBuZWFyX2RhdGEgPSAocG5nX2J5dGUgKilDVlRfUFRSX05PQ0hFQ0soZGF0YSk7Ci0gICBpb19wdHIgPSAocG5nX0ZJTEVfcClDVlRfUFRSKHBuZ19wdHItPmlvX3B0cik7Ci0gICBpZiAoKHBuZ19ieXRlcCluZWFyX2RhdGEgPT0gZGF0YSkKLSAgIHsKLSNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICAgICBpZiAoICFXcml0ZUZpbGUoaW9fcHRyLCBuZWFyX2RhdGEsIGxlbmd0aCwgJmNoZWNrLCBOVUxMKSApCi0gICAgICAgICBjaGVjayA9IDA7Ci0jZWxzZQotICAgICAgY2hlY2sgPSBmd3JpdGUobmVhcl9kYXRhLCAxLCBsZW5ndGgsIGlvX3B0cik7Ci0jZW5kaWYKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHBuZ19ieXRlIGJ1ZltORUFSX0JVRl9TSVpFXTsKLSAgICAgIHBuZ19zaXplX3Qgd3JpdHRlbiwgcmVtYWluaW5nLCBlcnI7Ci0gICAgICBjaGVjayA9IDA7Ci0gICAgICByZW1haW5pbmcgPSBsZW5ndGg7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICAgd3JpdHRlbiA9IE1JTihORUFSX0JVRl9TSVpFLCByZW1haW5pbmcpOwotICAgICAgICAgcG5nX21lbWNweShidWYsIGRhdGEsIHdyaXR0ZW4pOyAvKiBDb3B5IGZhciBidWZmZXIgdG8gbmVhciBidWZmZXIgKi8KLSNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICAgICAgICBpZiAoICFXcml0ZUZpbGUoaW9fcHRyLCBidWYsIHdyaXR0ZW4sICZlcnIsIE5VTEwpICkKLSAgICAgICAgICAgIGVyciA9IDA7Ci0jZWxzZQotICAgICAgICAgZXJyID0gZndyaXRlKGJ1ZiwgMSwgd3JpdHRlbiwgaW9fcHRyKTsKLSNlbmRpZgotICAgICAgICAgaWYgKGVyciAhPSB3cml0dGVuKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNoZWNrICs9IGVycjsKLQotICAgICAgICAgZGF0YSArPSB3cml0dGVuOwotICAgICAgICAgcmVtYWluaW5nIC09IHdyaXR0ZW47Ci0gICAgICB9Ci0gICAgICB3aGlsZSAocmVtYWluaW5nICE9IDApOwotICAgfQotICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiV3JpdGUgRXJyb3IiKTsKLX0KLQotI2VuZGlmCi0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gb3V0cHV0IGFueSBkYXRhIHBlbmRpbmcgd3JpdGluZyAobm9ybWFsbHkKLSAqIHRvIGRpc2spLiAgQWZ0ZXIgcG5nX2ZsdXNoIGlzIGNhbGxlZCwgdGhlcmUgc2hvdWxkIGJlIG5vIGRhdGEgcGVuZGluZwotICogd3JpdGluZyBpbiBhbnkgYnVmZmVycy4KLSAqLwotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCkKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2ZsdXNoKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBpZiAocG5nX3B0ci0+b3V0cHV0X2ZsdXNoX2ZuICE9IE5VTEwpCi0gICAgICAoKihwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4pKShwbmdfcHRyKTsKLX0KLQotI2lmICFkZWZpbmVkKFBOR19OT19TVERJTykKLXZvaWQgUE5HQVBJCi1wbmdfZGVmYXVsdF9mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyKQotewotI2lmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCi0gICBwbmdfRklMRV9wIGlvX3B0cjsKLSNlbmRpZgotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSNpZiAhZGVmaW5lZChfV0lOMzJfV0NFKQotICAgaW9fcHRyID0gKHBuZ19GSUxFX3ApQ1ZUX1BUUigocG5nX3B0ci0+aW9fcHRyKSk7Ci0gICBmZmx1c2goaW9fcHRyKTsKLSNlbmRpZgotfQotI2VuZGlmCi0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHN1cHBseSBuZXcgb3V0cHV0IGZ1bmN0aW9ucyBmb3IKLSAqIGxpYnBuZyBpZiBzdGFuZGFyZCBDIHN0cmVhbXMgYXJlbid0IGJlaW5nIHVzZWQuCi0gKgotICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBpdHMgYXJndW1lbnRzOgotICogcG5nX3B0ciAgICAgICAtIHBvaW50ZXIgdG8gYSBwbmcgb3V0cHV0IGRhdGEgc3RydWN0dXJlCi0gKiBpb19wdHIgICAgICAgIC0gcG9pbnRlciB0byB1c2VyIHN1cHBsaWVkIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm8gYWJvdXQKLSAqICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IGZ1bmN0aW9ucy4gIE1heSBiZSBOVUxMLgotICogd3JpdGVfZGF0YV9mbiAtIHBvaW50ZXIgdG8gYSBuZXcgb3V0cHV0IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYXMgaXRzCi0gKiAgICAgICAgICAgICAgICAgYXJndW1lbnRzIGEgcG9pbnRlciB0byBhIHBuZ19zdHJ1Y3QsIGEgcG9pbnRlciB0bwotICogICAgICAgICAgICAgICAgIGRhdGEgdG8gYmUgd3JpdHRlbiwgYW5kIGEgMzItYml0IHVuc2lnbmVkIGludCB0aGF0IGlzCi0gKiAgICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuLiAgVGhlIG5ldyB3cml0ZQotICogICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBjYWxsIHBuZ19lcnJvcihwbmdfcHRyLCAiRXJyb3IgbXNnIikKLSAqICAgICAgICAgICAgICAgICB0byBleGl0IGFuZCBvdXRwdXQgYW55IGZhdGFsIGVycm9yIG1lc3NhZ2VzLiAgTWF5IGJlCi0gKiAgICAgICAgICAgICAgICAgTlVMTCwgaW4gd2hpY2ggY2FzZSBsaWJwbmcncyBkZWZhdWx0IGZ1bmN0aW9uIHdpbGwKLSAqICAgICAgICAgICAgICAgICBiZSB1c2VkLgotICogZmx1c2hfZGF0YV9mbiAtIHBvaW50ZXIgdG8gYSBuZXcgZmx1c2ggZnVuY3Rpb24gdGhhdCB0YWtlcyBhcyBpdHMKLSAqICAgICAgICAgICAgICAgICBhcmd1bWVudHMgYSBwb2ludGVyIHRvIGEgcG5nX3N0cnVjdC4gIEFmdGVyIGEgY2FsbCB0bwotICogICAgICAgICAgICAgICAgIHRoZSBmbHVzaCBmdW5jdGlvbiwgdGhlcmUgc2hvdWxkIGJlIG5vIGRhdGEgaW4gYW55IGJ1ZmZlcnMKLSAqICAgICAgICAgICAgICAgICBvciBwZW5kaW5nIHRyYW5zbWlzc2lvbi4gIElmIHRoZSBvdXRwdXQgbWV0aG9kIGRvZXNuJ3QgZG8KLSAqICAgICAgICAgICAgICAgICBhbnkgYnVmZmVyaW5nIG9mIG91cHV0LCBhIGZ1bmN0aW9uIHByb3RvdHlwZSBtdXN0IHN0aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgc3VwcGxpZWQgYWx0aG91Z2ggaXQgZG9lc24ndCBoYXZlIHRvIGRvIGFueXRoaW5nLiAgSWYKLSAqICAgICAgICAgICAgICAgICBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkIGF0IGxpYnBuZyBjb21waWxlCi0gKiAgICAgICAgICAgICAgICAgdGltZSwgb3V0cHV0X2ZsdXNoX2ZuIHdpbGwgYmUgaWdub3JlZCwgYWx0aG91Z2ggaXQgbXVzdCBiZQotICogICAgICAgICAgICAgICAgIHN1cHBsaWVkIGZvciBjb21wYXRpYmlsaXR5LiAgTWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2UKLSAqICAgICAgICAgICAgICAgICBsaWJwbmcncyBkZWZhdWx0IGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCwgaWYKLSAqICAgICAgICAgICAgICAgICBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEIGlzIGRlZmluZWQuICBUaGlzIGlzIG5vdAotICogICAgICAgICAgICAgICAgIGEgZ29vZCBpZGVhIGlmIGlvX3B0ciBkb2VzIG5vdCBwb2ludCB0byBhIHN0YW5kYXJkCi0gKiAgICAgICAgICAgICAgICAgKkZJTEUgc3RydWN0dXJlLgotICovCi12b2lkIFBOR0FQSQotcG5nX3NldF93cml0ZV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgaW9fcHRyLAotICAgcG5nX3J3X3B0ciB3cml0ZV9kYXRhX2ZuLCBwbmdfZmx1c2hfcHRyIG91dHB1dF9mbHVzaF9mbikKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHBuZ19wdHItPmlvX3B0ciA9IGlvX3B0cjsKLQotI2lmICFkZWZpbmVkKFBOR19OT19TVERJTykKLSAgIGlmICh3cml0ZV9kYXRhX2ZuICE9IE5VTEwpCi0gICAgICBwbmdfcHRyLT53cml0ZV9kYXRhX2ZuID0gd3JpdGVfZGF0YV9mbjsKLQotICAgZWxzZQotICAgICAgcG5nX3B0ci0+d3JpdGVfZGF0YV9mbiA9IHBuZ19kZWZhdWx0X3dyaXRlX2RhdGE7Ci0jZWxzZQotICAgcG5nX3B0ci0+d3JpdGVfZGF0YV9mbiA9IHdyaXRlX2RhdGFfZm47Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCkKLSNpZiAhZGVmaW5lZChQTkdfTk9fU1RESU8pCi0gICBpZiAob3V0cHV0X2ZsdXNoX2ZuICE9IE5VTEwpCi0gICAgICBwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gPSBvdXRwdXRfZmx1c2hfZm47Ci0KLSAgIGVsc2UKLSAgICAgIHBuZ19wdHItPm91dHB1dF9mbHVzaF9mbiA9IHBuZ19kZWZhdWx0X2ZsdXNoOwotI2Vsc2UKLSAgIHBuZ19wdHItPm91dHB1dF9mbHVzaF9mbiA9IG91dHB1dF9mbHVzaF9mbjsKLSNlbmRpZgotI2VuZGlmIC8qIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQgKi8KLQotICAgLyogSXQgaXMgYW4gZXJyb3IgdG8gcmVhZCB3aGlsZSB3cml0aW5nIGEgcG5nIGZpbGUgKi8KLSAgIGlmIChwbmdfcHRyLT5yZWFkX2RhdGFfZm4gIT0gTlVMTCkKLSAgIHsKLSAgICAgIHBuZ19wdHItPnJlYWRfZGF0YV9mbiA9IE5VTEw7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgIkF0dGVtcHRlZCB0byBzZXQgYm90aCByZWFkX2RhdGFfZm4gYW5kIHdyaXRlX2RhdGFfZm4gaW4iKTsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAidGhlIHNhbWUgc3RydWN0dXJlLiAgUmVzZXR0aW5nIHJlYWRfZGF0YV9mbiB0byBOVUxMLiIpOwotICAgfQotfQotCi0jaWYgZGVmaW5lZChVU0VfRkFSX0tFWVdPUkQpCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLXZvaWQgKnBuZ19mYXJfdG9fbmVhcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdm9pZHAgcHRyLCBpbnQgY2hlY2spCi17Ci0gICB2b2lkICpuZWFyX3B0cjsKLSAgIHZvaWQgRkFSICpmYXJfcHRyOwotICAgRlBfT0ZGKG5lYXJfcHRyKSA9IEZQX09GRihwdHIpOwotICAgZmFyX3B0ciA9ICh2b2lkIEZBUiAqKW5lYXJfcHRyOwotCi0gICBpZiAoY2hlY2sgIT0gMCkKLSAgICAgIGlmIChGUF9TRUcocHRyKSAhPSBGUF9TRUcoZmFyX3B0cikpCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInNlZ21lbnQgbG9zdCBpbiBjb252ZXJzaW9uIik7Ci0KLSAgIHJldHVybihuZWFyX3B0cik7Ci19Ci0jICBlbHNlCi12b2lkICpwbmdfZmFyX3RvX25lYXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0ciwgaW50IGNoZWNrKQotewotICAgdm9pZCAqbmVhcl9wdHI7Ci0gICB2b2lkIEZBUiAqZmFyX3B0cjsKLSAgIG5lYXJfcHRyID0gKHZvaWQgRkFSICopcHRyOwotICAgZmFyX3B0ciA9ICh2b2lkIEZBUiAqKW5lYXJfcHRyOwotCi0gICBpZiAoY2hlY2sgIT0gMCkKLSAgICAgIGlmIChmYXJfcHRyICE9IHB0cikKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAic2VnbWVudCBsb3N0IGluIGNvbnZlcnNpb24iKTsKLQotICAgcmV0dXJuKG5lYXJfcHRyKTsKLX0KLSMgICBlbmRpZgotIyAgIGVuZGlmCi0jZW5kaWYgLyogUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcG5nd3JpdGUuYyBiL2xpYnMvbGlicG5nL3BuZ3dyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNjI2M2MuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5nd3JpdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NTggKzAsMCBAQAotCi0vKiBwbmd3cml0ZS5jIC0gZ2VuZXJhbCByb3V0aW5lcyB0byB3cml0ZSBhIFBORyBmaWxlCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuMzcgW0p1bmUgNCwgMjAwOV0KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqLwotCi0vKiBHZXQgaW50ZXJuYWwgYWNjZXNzIHRvIHBuZy5oICovCi0jZGVmaW5lIFBOR19JTlRFUk5BTAotI2luY2x1ZGUgInBuZy5oIgotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLQotLyogV3JpdGVzIGFsbCB0aGUgUE5HIGluZm9ybWF0aW9uLiAgVGhpcyBpcyB0aGUgc3VnZ2VzdGVkIHdheSB0byB1c2UgdGhlCi0gKiBsaWJyYXJ5LiAgSWYgeW91IGhhdmUgYSBuZXcgY2h1bmsgdG8gYWRkLCBtYWtlIGEgZnVuY3Rpb24gdG8gd3JpdGUgaXQsCi0gKiBhbmQgcHV0IGl0IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uIGhlcmUuICBJZiB5b3Ugd2FudCB0aGUgY2h1bmsgd3JpdHRlbgotICogYWZ0ZXIgdGhlIGltYWdlIGRhdGEsIHB1dCBpdCBpbiBwbmdfd3JpdGVfZW5kKCkuICBJIHN0cm9uZ2x5IGVuY291cmFnZQotICogeW91IHRvIHN1cHBseSBhIFBOR19JTkZPXyBmbGFnLCBhbmQgY2hlY2sgaW5mb19wdHItPnZhbGlkIGJlZm9yZSB3cml0aW5nCi0gKiB0aGUgY2h1bmssIGFzIHRoYXQgd2lsbCBrZWVwIHRoZSBjb2RlIGZyb20gYnJlYWtpbmcgaWYgeW91IHdhbnQgdG8ganVzdAotICogd3JpdGUgYSBwbGFpbiBQTkcgZmlsZS4gIElmIHlvdSBoYXZlIGxvbmcgY29tbWVudHMsIEkgc3VnZ2VzdCB3cml0aW5nCi0gKiB0aGVtIGluIHBuZ193cml0ZV9lbmQoKSwgYW5kIGNvbXByZXNzaW5nIHRoZW0uCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBpZiAoIShwbmdfcHRyLT5tb2RlICYgUE5HX1dST1RFX0lORk9fQkVGT1JFX1BMVEUpKQotICAgewotICAgcG5nX3dyaXRlX3NpZyhwbmdfcHRyKTsgLyogV3JpdGUgUE5HIHNpZ25hdHVyZSAqLwotI2lmIGRlZmluZWQoUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQpCi0gICBpZiAoKHBuZ19wdHItPm1vZGUmUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkmJihwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkKSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJNTkcgZmVhdHVyZXMgYXJlIG5vdCBhbGxvd2VkIGluIGEgUE5HIGRhdGFzdHJlYW0iKTsKLSAgICAgIHBuZ19wdHItPm1uZ19mZWF0dXJlc19wZXJtaXR0ZWQ9MDsKLSAgIH0KLSNlbmRpZgotICAgLyogV3JpdGUgSUhEUiBpbmZvcm1hdGlvbi4gKi8KLSAgIHBuZ193cml0ZV9JSERSKHBuZ19wdHIsIGluZm9fcHRyLT53aWR0aCwgaW5mb19wdHItPmhlaWdodCwKLSAgICAgIGluZm9fcHRyLT5iaXRfZGVwdGgsIGluZm9fcHRyLT5jb2xvcl90eXBlLCBpbmZvX3B0ci0+Y29tcHJlc3Npb25fdHlwZSwKLSAgICAgIGluZm9fcHRyLT5maWx0ZXJfdHlwZSwKLSNpZiBkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCi0gICAgICBpbmZvX3B0ci0+aW50ZXJsYWNlX3R5cGUpOwotI2Vsc2UKLSAgICAgIDApOwotI2VuZGlmCi0gICAvKiBUaGUgcmVzdCBvZiB0aGVzZSBjaGVjayB0byBzZWUgaWYgdGhlIHZhbGlkIGZpZWxkIGhhcyB0aGUgYXBwcm9wcmlhdGUKLSAgICAqIGZsYWcgc2V0LCBhbmQgaWYgaXQgZG9lcywgd3JpdGVzIHRoZSBjaHVuay4KLSAgICAqLwotI2lmIGRlZmluZWQoUE5HX1dSSVRFX2dBTUFfU1VQUE9SVEVEKQotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2dBTUEpCi0gICB7Ci0jICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgICBwbmdfd3JpdGVfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ci0+Z2FtbWEpOwotI2Vsc2UKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi0gICAgICBwbmdfd3JpdGVfZ0FNQV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ci0+aW50X2dhbW1hKTsKLSMgIGVuZGlmCi0jZW5kaWYKLSAgIH0KLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1dSSVRFX3NSR0JfU1VQUE9SVEVEKQotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX3NSR0IpCi0gICAgICBwbmdfd3JpdGVfc1JHQihwbmdfcHRyLCAoaW50KWluZm9fcHRyLT5zcmdiX2ludGVudCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9pQ0NQX1NVUFBPUlRFRCkKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19pQ0NQKQotICAgICAgcG5nX3dyaXRlX2lDQ1AocG5nX3B0ciwgaW5mb19wdHItPmljY3BfbmFtZSwgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwKLSAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT5pY2NwX3Byb2ZpbGUsIChpbnQpaW5mb19wdHItPmljY3BfcHJvZmxlbik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9zQklUX1NVUFBPUlRFRCkKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQklUKQotICAgICAgcG5nX3dyaXRlX3NCSVQocG5nX3B0ciwgJihpbmZvX3B0ci0+c2lnX2JpdCksIGluZm9fcHRyLT5jb2xvcl90eXBlKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1dSSVRFX2NIUk1fU1VQUE9SVEVEKQotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX2NIUk0pCi0gICB7Ci0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgICAgcG5nX3dyaXRlX2NIUk0ocG5nX3B0ciwKLSAgICAgICAgIGluZm9fcHRyLT54X3doaXRlLCBpbmZvX3B0ci0+eV93aGl0ZSwKLSAgICAgICAgIGluZm9fcHRyLT54X3JlZCwgaW5mb19wdHItPnlfcmVkLAotICAgICAgICAgaW5mb19wdHItPnhfZ3JlZW4sIGluZm9fcHRyLT55X2dyZWVuLAotICAgICAgICAgaW5mb19wdHItPnhfYmx1ZSwgaW5mb19wdHItPnlfYmx1ZSk7Ci0jZWxzZQotIyAgaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgICAgcG5nX3dyaXRlX2NIUk1fZml4ZWQocG5nX3B0ciwKLSAgICAgICAgIGluZm9fcHRyLT5pbnRfeF93aGl0ZSwgaW5mb19wdHItPmludF95X3doaXRlLAotICAgICAgICAgaW5mb19wdHItPmludF94X3JlZCwgaW5mb19wdHItPmludF95X3JlZCwKLSAgICAgICAgIGluZm9fcHRyLT5pbnRfeF9ncmVlbiwgaW5mb19wdHItPmludF95X2dyZWVuLAotICAgICAgICAgaW5mb19wdHItPmludF94X2JsdWUsIGluZm9fcHRyLT5pbnRfeV9ibHVlKTsKLSMgIGVuZGlmCi0jZW5kaWYKLSAgIH0KLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgIGlmIChpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtKQotICAgewotICAgICAgcG5nX3Vua25vd25fY2h1bmsgKnVwOwotCi0gICAgICBwbmdfZGVidWcoNSwgIndyaXRpbmcgZXh0cmEgY2h1bmtzIik7Ci0KLSAgICAgIGZvciAodXAgPSBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3M7Ci0gICAgICAgICAgIHVwIDwgaW5mb19wdHItPnVua25vd25fY2h1bmtzICsgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bTsKLSAgICAgICAgICAgdXArKykKLSAgICAgIHsKLSAgICAgICAgIGludCBrZWVwPXBuZ19oYW5kbGVfYXNfdW5rbm93bihwbmdfcHRyLCB1cC0+bmFtZSk7Ci0gICAgICAgICBpZiAoa2VlcCAhPSBQTkdfSEFORExFX0NIVU5LX05FVkVSICYmCi0gICAgICAgICAgICB1cC0+bG9jYXRpb24gJiYgISh1cC0+bG9jYXRpb24gJiBQTkdfSEFWRV9QTFRFKSAmJgotICAgICAgICAgICAgISh1cC0+bG9jYXRpb24gJiBQTkdfSEFWRV9JREFUKSAmJgotICAgICAgICAgICAgKCh1cC0+bmFtZVszXSAmIDB4MjApIHx8IGtlZXAgPT0gUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgfHwKLSAgICAgICAgICAgIChwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX0tFRVBfVU5TQUZFX0NIVU5LUykpKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHVwLT5zaXplID09IDApCi0gICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiV3JpdGluZyB6ZXJvLWxlbmd0aCB1bmtub3duIGNodW5rIik7Ci0gICAgICAgICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgdXAtPm5hbWUsIHVwLT5kYXRhLCB1cC0+c2l6ZSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLSAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX1dST1RFX0lORk9fQkVGT1JFX1BMVEU7Ci0gICB9Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfd3JpdGVfaW5mbyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0jaWYgZGVmaW5lZChQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX3NQTFRfU1VQUE9SVEVEKQotICAgaW50IGk7Ci0jZW5kaWYKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaW5mbyIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMIHx8IGluZm9fcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgaWYgKGluZm9fcHRyLT52YWxpZCAmIFBOR19JTkZPX1BMVEUpCi0gICAgICBwbmdfd3JpdGVfUExURShwbmdfcHRyLCBpbmZvX3B0ci0+cGFsZXR0ZSwKLSAgICAgICAgIChwbmdfdWludF8zMilpbmZvX3B0ci0+bnVtX3BhbGV0dGUpOwotICAgZWxzZSBpZiAoaW5mb19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiVmFsaWQgcGFsZXR0ZSByZXF1aXJlZCBmb3IgcGFsZXR0ZWQgaW1hZ2VzIik7Ci0KLSNpZiBkZWZpbmVkKFBOR19XUklURV90Uk5TX1NVUFBPUlRFRCkKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190Uk5TKQotICAgewotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpCi0gICAgICAvKiBJbnZlcnQgdGhlIGFscGhhIGNoYW5uZWwgKGluIHRSTlMpICovCi0gICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfQUxQSEEpICYmCi0gICAgICAgICBpbmZvX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgewotICAgICAgICAgaW50IGo7Ci0gICAgICAgICBmb3IgKGo9MDsgajwoaW50KWluZm9fcHRyLT5udW1fdHJhbnM7IGorKykKLSAgICAgICAgICAgIGluZm9fcHRyLT50cmFuc1tqXSA9IChwbmdfYnl0ZSkoMjU1IC0gaW5mb19wdHItPnRyYW5zW2pdKTsKLSAgICAgIH0KLSNlbmRpZgotICAgICAgcG5nX3dyaXRlX3RSTlMocG5nX3B0ciwgaW5mb19wdHItPnRyYW5zLCAmKGluZm9fcHRyLT50cmFuc192YWx1ZXMpLAotICAgICAgICAgaW5mb19wdHItPm51bV90cmFucywgaW5mb19wdHItPmNvbG9yX3R5cGUpOwotICAgfQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfYktHRF9TVVBQT1JURUQpCi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fYktHRCkKLSAgICAgIHBuZ193cml0ZV9iS0dEKHBuZ19wdHIsICYoaW5mb19wdHItPmJhY2tncm91bmQpLCBpbmZvX3B0ci0+Y29sb3JfdHlwZSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9oSVNUX1NVUFBPUlRFRCkKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19oSVNUKQotICAgICAgcG5nX3dyaXRlX2hJU1QocG5nX3B0ciwgaW5mb19wdHItPmhpc3QsIGluZm9fcHRyLT5udW1fcGFsZXR0ZSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9vRkZzX1NVUFBPUlRFRCkKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19vRkZzKQotICAgICAgcG5nX3dyaXRlX29GRnMocG5nX3B0ciwgaW5mb19wdHItPnhfb2Zmc2V0LCBpbmZvX3B0ci0+eV9vZmZzZXQsCi0gICAgICAgICBpbmZvX3B0ci0+b2Zmc2V0X3VuaXRfdHlwZSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRCkKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19wQ0FMKQotICAgICAgcG5nX3dyaXRlX3BDQUwocG5nX3B0ciwgaW5mb19wdHItPnBjYWxfcHVycG9zZSwgaW5mb19wdHItPnBjYWxfWDAsCi0gICAgICAgICBpbmZvX3B0ci0+cGNhbF9YMSwgaW5mb19wdHItPnBjYWxfdHlwZSwgaW5mb19wdHItPnBjYWxfbnBhcmFtcywKLSAgICAgICAgIGluZm9fcHRyLT5wY2FsX3VuaXRzLCBpbmZvX3B0ci0+cGNhbF9wYXJhbXMpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19zQ0FMKQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX3NDQUxfU1VQUE9SVEVEKQotI2lmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkgJiYgIWRlZmluZWQoUE5HX05PX1NURElPKQotICAgICAgcG5nX3dyaXRlX3NDQUwocG5nX3B0ciwgKGludClpbmZvX3B0ci0+c2NhbF91bml0LAotICAgICAgICAgIGluZm9fcHRyLT5zY2FsX3BpeGVsX3dpZHRoLCBpbmZvX3B0ci0+c2NhbF9waXhlbF9oZWlnaHQpOwotI2Vsc2UgLyogIUZMT0FUSU5HX1BPSU5UICovCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotICAgICAgcG5nX3dyaXRlX3NDQUxfcyhwbmdfcHRyLCAoaW50KWluZm9fcHRyLT5zY2FsX3VuaXQsCi0gICAgICAgICAgaW5mb19wdHItPnNjYWxfc193aWR0aCwgaW5mb19wdHItPnNjYWxfc19oZWlnaHQpOwotI2VuZGlmIC8qIEZJWEVEX1BPSU5UICovCi0jZW5kaWYgLyogRkxPQVRJTkdfUE9JTlQgKi8KLSNlbHNlICAvKiAhV1JJVEVfc0NBTCAqLwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgICAicG5nX3dyaXRlX3NDQUwgbm90IHN1cHBvcnRlZDsgc0NBTCBjaHVuayBub3Qgd3JpdHRlbi4iKTsKLSNlbmRpZiAvKiBXUklURV9zQ0FMICovCi0jZW5kaWYgLyogc0NBTCAqLwotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfcEhZc19TVVBQT1JURUQpCi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fcEhZcykKLSAgICAgIHBuZ193cml0ZV9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLT54X3BpeGVsc19wZXJfdW5pdCwKLSAgICAgICAgIGluZm9fcHRyLT55X3BpeGVsc19wZXJfdW5pdCwgaW5mb19wdHItPnBoeXNfdW5pdF90eXBlKTsKLSNlbmRpZiAvKiBwSFlzICovCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV90SU1FX1NVUFBPUlRFRCkKLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT190SU1FKQotICAgewotICAgICAgcG5nX3dyaXRlX3RJTUUocG5nX3B0ciwgJihpbmZvX3B0ci0+bW9kX3RpbWUpKTsKLSAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX1dST1RFX3RJTUU7Ci0gICB9Ci0jZW5kaWYgLyogdElNRSAqLwotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQpCi0gICBpZiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc1BMVCkKLSAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpaW5mb19wdHItPnNwbHRfcGFsZXR0ZXNfbnVtOyBpKyspCi0gICAgICAgcG5nX3dyaXRlX3NQTFQocG5nX3B0ciwgaW5mb19wdHItPnNwbHRfcGFsZXR0ZXMgKyBpKTsKLSNlbmRpZiAvKiBzUExUICovCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9URVhUX1NVUFBPUlRFRCkKLSAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIHRleHQgY2h1bmtzICovCi0gICBmb3IgKGkgPSAwOyBpIDwgaW5mb19wdHItPm51bV90ZXh0OyBpKyspCi0gICB7Ci0gICAgICBwbmdfZGVidWcyKDIsICJXcml0aW5nIGhlYWRlciB0ZXh0IGNodW5rICVkLCB0eXBlICVkIiwgaSwKLSAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uKTsKLSAgICAgIC8qIEFuIGludGVybmF0aW9uYWxpemVkIGNodW5rPyAqLwotICAgICAgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID4gMCkKLSAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19XUklURV9pVFh0X1NVUFBPUlRFRCkKLSAgICAgICAgICAvKiBXcml0ZSBpbnRlcm5hdGlvbmFsIGNodW5rICovCi0gICAgICAgICAgcG5nX3dyaXRlX2lUWHQocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0ubGFuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5sYW5nX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS50ZXh0KTsKLSNlbHNlCi0gICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSBpbnRlcm5hdGlvbmFsIHRleHQiKTsKLSNlbmRpZgotICAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCi0gICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FX1dSOwotICAgICAgfQotICAgICAgLyogSWYgd2Ugd2FudCBhIGNvbXByZXNzZWQgdGV4dCBjaHVuayAqLwotICAgICAgZWxzZSBpZiAoaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPT0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdCkKLSAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19XUklURV96VFh0X1NVUFBPUlRFRCkKLSAgICAgICAgIC8qIFdyaXRlIGNvbXByZXNzZWQgY2h1bmsgKi8KLSAgICAgICAgIHBuZ193cml0ZV96VFh0KHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0W2ldLmtleSwKLSAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLnRleHQsIDAsCi0gICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbik7Ci0jZWxzZQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSBjb21wcmVzc2VkIHRleHQiKTsKLSNlbmRpZgotICAgICAgICAgLyogTWFyayB0aGlzIGNodW5rIGFzIHdyaXR0ZW4gKi8KLSAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdF9XUjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID09IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUpCi0gICAgICB7Ci0jaWYgZGVmaW5lZChQTkdfV1JJVEVfdEVYdF9TVVBQT1JURUQpCi0gICAgICAgICAvKiBXcml0ZSB1bmNvbXByZXNzZWQgY2h1bmsgKi8KLSAgICAgICAgIHBuZ193cml0ZV90RVh0KHBuZ19wdHIsIGluZm9fcHRyLT50ZXh0W2ldLmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS50ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgLyogTWFyayB0aGlzIGNodW5rIGFzIHdyaXR0ZW4gKi8KLSAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORV9XUjsKLSNlbHNlCi0gICAgICAgICAvKiBDYW4ndCBnZXQgaGVyZSAqLwotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSB1bmNvbXByZXNzZWQgdGV4dCIpOwotI2VuZGlmCi0gICAgICB9Ci0gICB9Ci0jZW5kaWYgLyogdEVYdCAqLwotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotICAgaWYgKGluZm9fcHRyLT51bmtub3duX2NodW5rc19udW0pCi0gICB7Ci0gICAgICAgcG5nX3Vua25vd25fY2h1bmsgKnVwOwotCi0gICAgICAgcG5nX2RlYnVnKDUsICJ3cml0aW5nIGV4dHJhIGNodW5rcyIpOwotCi0gICAgICAgZm9yICh1cCA9IGluZm9fcHRyLT51bmtub3duX2NodW5rczsKLSAgICAgICAgICAgIHVwIDwgaW5mb19wdHItPnVua25vd25fY2h1bmtzICsgaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bTsKLSAgICAgICAgICAgIHVwKyspCi0gICAgICAgewotICAgICAgICAgaW50IGtlZXA9cG5nX2hhbmRsZV9hc191bmtub3duKHBuZ19wdHIsIHVwLT5uYW1lKTsKLSAgICAgICAgIGlmIChrZWVwICE9IFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgJiYKLSAgICAgICAgICAgIHVwLT5sb2NhdGlvbiAmJiAodXAtPmxvY2F0aW9uICYgUE5HX0hBVkVfUExURSkgJiYKLSAgICAgICAgICAgICEodXAtPmxvY2F0aW9uICYgUE5HX0hBVkVfSURBVCkgJiYKLSAgICAgICAgICAgICgodXAtPm5hbWVbM10gJiAweDIwKSB8fCBrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTIHx8Ci0gICAgICAgICAgICAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19LRUVQX1VOU0FGRV9DSFVOS1MpKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCB1cC0+bmFtZSwgdXAtPmRhdGEsIHVwLT5zaXplKTsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICB9Ci0jZW5kaWYKLX0KLQotLyogV3JpdGVzIHRoZSBlbmQgb2YgdGhlIFBORyBmaWxlLiAgSWYgeW91IGRvbid0IHdhbnQgdG8gd3JpdGUgY29tbWVudHMgb3IKLSAqIHRpbWUgaW5mb3JtYXRpb24sIHlvdSBjYW4gcGFzcyBOVUxMIGZvciBpbmZvLiAgSWYgeW91IGFscmVhZHkgd3JvdGUgdGhlc2UKLSAqIGluIHBuZ193cml0ZV9pbmZvKCksIGRvIG5vdCB3cml0ZSB0aGVtIGFnYWluIGhlcmUuICBJZiB5b3UgaGF2ZSBsb25nCi0gKiBjb21tZW50cywgSSBzdWdnZXN0IHdyaXRpbmcgdGhlbSBoZXJlLCBhbmQgY29tcHJlc3NpbmcgdGhlbS4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ193cml0ZV9lbmQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKQotewotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZW5kIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJObyBJREFUcyB3cml0dGVuIGludG8gZmlsZSIpOwotCi0gICAvKiBTZWUgaWYgdXNlciB3YW50cyB1cyB0byB3cml0ZSBpbmZvcm1hdGlvbiBjaHVua3MgKi8KLSAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQotICAgewotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVEKQotICAgICAgaW50IGk7IC8qIExvY2FsIGluZGV4IHZhcmlhYmxlICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV90SU1FX1NVUFBPUlRFRCkKLSAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB1c2VyIGhhcyBzdXBwbGllZCBhIHRpbWUgY2h1bmsgKi8KLSAgICAgIGlmICgoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fdElNRSkgJiYKLSAgICAgICAgICEocG5nX3B0ci0+bW9kZSAmIFBOR19XUk9URV90SU1FKSkKLSAgICAgICAgIHBuZ193cml0ZV90SU1FKHBuZ19wdHIsICYoaW5mb19wdHItPm1vZF90aW1lKSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9URVhUX1NVUFBPUlRFRCkKLSAgICAgIC8qIExvb3AgdGhyb3VnaCBjb21tZW50IGNodW5rcyAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IGluZm9fcHRyLT5udW1fdGV4dDsgaSsrKQotICAgICAgewotICAgICAgICAgcG5nX2RlYnVnMigyLCAiV3JpdGluZyB0cmFpbGVyIHRleHQgY2h1bmsgJWQsIHR5cGUgJWQiLCBpLAotICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24pOwotICAgICAgICAgLyogQW4gaW50ZXJuYXRpb25hbGl6ZWQgY2h1bms/ICovCi0gICAgICAgICBpZiAoaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPiAwKQotICAgICAgICAgewotI2lmIGRlZmluZWQoUE5HX1dSSVRFX2lUWHRfU1VQUE9SVEVEKQotICAgICAgICAgICAgIC8qIFdyaXRlIGludGVybmF0aW9uYWwgY2h1bmsgKi8KLSAgICAgICAgICAgICBwbmdfd3JpdGVfaVRYdChwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5sYW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmxhbmdfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLnRleHQpOwotI2Vsc2UKLSAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5hYmxlIHRvIHdyaXRlIGludGVybmF0aW9uYWwgdGV4dCIpOwotI2VuZGlmCi0gICAgICAgICAgICAgLyogTWFyayB0aGlzIGNodW5rIGFzIHdyaXR0ZW4gKi8KLSAgICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIGlmIChpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA+PSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0KQotICAgICAgICAgewotI2lmIGRlZmluZWQoUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVEKQotICAgICAgICAgICAgLyogV3JpdGUgY29tcHJlc3NlZCBjaHVuayAqLwotICAgICAgICAgICAgcG5nX3dyaXRlX3pUWHQocG5nX3B0ciwgaW5mb19wdHItPnRleHRbaV0ua2V5LAotICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCwgMCwKLSAgICAgICAgICAgICAgIGluZm9fcHRyLT50ZXh0W2ldLmNvbXByZXNzaW9uKTsKLSNlbHNlCi0gICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5hYmxlIHRvIHdyaXRlIGNvbXByZXNzZWQgdGV4dCIpOwotI2VuZGlmCi0gICAgICAgICAgICAvKiBNYXJrIHRoaXMgY2h1bmsgYXMgd3JpdHRlbiAqLwotICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0X1dSOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAoaW5mb19wdHItPnRleHRbaV0uY29tcHJlc3Npb24gPT0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSkKLSAgICAgICAgIHsKLSNpZiBkZWZpbmVkKFBOR19XUklURV90RVh0X1NVUFBPUlRFRCkKLSAgICAgICAgICAgIC8qIFdyaXRlIHVuY29tcHJlc3NlZCBjaHVuayAqLwotICAgICAgICAgICAgcG5nX3dyaXRlX3RFWHQocG5nX3B0ciwgaW5mb19wdHItPnRleHRbaV0ua2V5LAotICAgICAgICAgICAgICAgaW5mb19wdHItPnRleHRbaV0udGV4dCwgMCk7Ci0jZWxzZQotICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVuYWJsZSB0byB3cml0ZSB1bmNvbXByZXNzZWQgdGV4dCIpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBjaHVuayBhcyB3cml0dGVuICovCi0gICAgICAgICAgICBpbmZvX3B0ci0+dGV4dFtpXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkVfV1I7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICBpZiAoaW5mb19wdHItPnVua25vd25fY2h1bmtzX251bSkKLSAgIHsKLSAgICAgICBwbmdfdW5rbm93bl9jaHVuayAqdXA7Ci0KLSAgICAgICBwbmdfZGVidWcoNSwgIndyaXRpbmcgZXh0cmEgY2h1bmtzIik7Ci0KLSAgICAgICBmb3IgKHVwID0gaW5mb19wdHItPnVua25vd25fY2h1bmtzOwotICAgICAgICAgICAgdXAgPCBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3MgKyBpbmZvX3B0ci0+dW5rbm93bl9jaHVua3NfbnVtOwotICAgICAgICAgICAgdXArKykKLSAgICAgICB7Ci0gICAgICAgICBpbnQga2VlcD1wbmdfaGFuZGxlX2FzX3Vua25vd24ocG5nX3B0ciwgdXAtPm5hbWUpOwotICAgICAgICAgaWYgKGtlZXAgIT0gUE5HX0hBTkRMRV9DSFVOS19ORVZFUiAmJgotICAgICAgICAgICAgdXAtPmxvY2F0aW9uICYmICh1cC0+bG9jYXRpb24gJiBQTkdfQUZURVJfSURBVCkgJiYKLSAgICAgICAgICAgICgodXAtPm5hbWVbM10gJiAweDIwKSB8fCBrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTIHx8Ci0gICAgICAgICAgICAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19LRUVQX1VOU0FGRV9DSFVOS1MpKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCB1cC0+bmFtZSwgdXAtPmRhdGEsIHVwLT5zaXplKTsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICB9Ci0jZW5kaWYKLSAgIH0KLQotICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfQUZURVJfSURBVDsKLQotICAgLyogV3JpdGUgZW5kIG9mIFBORyBmaWxlICovCi0gICBwbmdfd3JpdGVfSUVORChwbmdfcHRyKTsKLSAgIC8qIFRoaXMgZmx1c2gsIGFkZGVkIGluIGxpYnBuZy0xLjAuOCwgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjAuOWJldGEwMywKLSAgICAqIGFuZCByZXN0b3JlZCBhZ2FpbiBpbiBsaWJwbmctMS4yLjMwLCBtYXkgY2F1c2Ugc29tZSBhcHBsaWNhdGlvbnMgdGhhdAotICAgICogZG8gbm90IHNldCBwbmdfcHRyLT5vdXRwdXRfZmx1c2hfZm4gdG8gY3Jhc2guICBJZiB5b3VyIGFwcGxpY2F0aW9uCi0gICAgKiBleHBlcmllbmNlcyBhIHByb2JsZW0sIHBsZWFzZSB0cnkgYnVpbGRpbmcgbGlicG5nIHdpdGgKLSAgICAqIFBOR19XUklURV9GTFVTSF9BRlRFUl9JRU5EX1NVUFBPUlRFRCBkZWZpbmVkLCBhbmQgcmVwb3J0IHRoZSBldmVudCB0bwotICAgICogcG5nLW1uZy1pbXBsZW1lbnQgYXQgbGlzdHMuc2YubmV0IC4gIFRoaXMga2x1ZGdlIHdpbGwgYmUgcmVtb3ZlZAotICAgICogZnJvbSBsaWJwbmctMS40LjAuCi0gICAgKi8KLSNpZiBkZWZpbmVkKFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQpICYmIFwKLSAgICBkZWZpbmVkKFBOR19XUklURV9GTFVTSF9BRlRFUl9JRU5EX1NVUFBPUlRFRCkKLSAgIHBuZ19mbHVzaChwbmdfcHRyKTsKLSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfdElNRV9TVVBQT1JURUQpCi0jaWYgIWRlZmluZWQoX1dJTjMyX1dDRSkKLS8qICJ0aW1lLmgiIGZ1bmN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzQ0UgKi8KLXZvaWQgUE5HQVBJCi1wbmdfY29udmVydF9mcm9tX3N0cnVjdF90bShwbmdfdGltZXAgcHRpbWUsIHN0cnVjdCB0bSBGQVIgKiB0dGltZSkKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0iKTsKLSAgIHB0aW1lLT55ZWFyID0gKHBuZ191aW50XzE2KSgxOTAwICsgdHRpbWUtPnRtX3llYXIpOwotICAgcHRpbWUtPm1vbnRoID0gKHBuZ19ieXRlKSh0dGltZS0+dG1fbW9uICsgMSk7Ci0gICBwdGltZS0+ZGF5ID0gKHBuZ19ieXRlKXR0aW1lLT50bV9tZGF5OwotICAgcHRpbWUtPmhvdXIgPSAocG5nX2J5dGUpdHRpbWUtPnRtX2hvdXI7Ci0gICBwdGltZS0+bWludXRlID0gKHBuZ19ieXRlKXR0aW1lLT50bV9taW47Ci0gICBwdGltZS0+c2Vjb25kID0gKHBuZ19ieXRlKXR0aW1lLT50bV9zZWM7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfY29udmVydF9mcm9tX3RpbWVfdChwbmdfdGltZXAgcHRpbWUsIHRpbWVfdCB0dGltZSkKLXsKLSAgIHN0cnVjdCB0bSAqdGJ1ZjsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY29udmVydF9mcm9tX3RpbWVfdCIpOwotICAgdGJ1ZiA9IGdtdGltZSgmdHRpbWUpOwotICAgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0ocHRpbWUsIHRidWYpOwotfQotI2VuZGlmCi0jZW5kaWYKLQotLyogSW5pdGlhbGl6ZSBwbmdfcHRyIHN0cnVjdHVyZSwgYW5kIGFsbG9jYXRlIGFueSBtZW1vcnkgbmVlZGVkICovCi1wbmdfc3RydWN0cCBQTkdBUEkKLXBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsCi0gICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLCBwbmdfZXJyb3JfcHRyIHdhcm5fZm4pCi17Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgcmV0dXJuIChwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKHVzZXJfcG5nX3ZlciwgZXJyb3JfcHRyLCBlcnJvcl9mbiwKLSAgICAgIHdhcm5fZm4sIHBuZ192b2lkcF9OVUxMLCBwbmdfbWFsbG9jX3B0cl9OVUxMLCBwbmdfZnJlZV9wdHJfTlVMTCkpOwotfQotCi0vKiBBbHRlcm5hdGUgaW5pdGlhbGl6ZSBwbmdfcHRyIHN0cnVjdHVyZSwgYW5kIGFsbG9jYXRlIGFueSBtZW1vcnkgbmVlZGVkICovCi1wbmdfc3RydWN0cCBQTkdBUEkKLXBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIocG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwgcG5nX3ZvaWRwIGVycm9yX3B0ciwKLSAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiwgcG5nX3ZvaWRwIG1lbV9wdHIsCi0gICBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm4sIHBuZ19mcmVlX3B0ciBmcmVlX2ZuKQotewotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLSNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAotICAgIHZvbGF0aWxlCi0jZW5kaWYKLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyOwotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0jaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICBqbXBfYnVmIGptcGJ1ZjsKLSNlbmRpZgotI2VuZGlmCi0gICBpbnQgaTsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QiKTsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKXBuZ19jcmVhdGVfc3RydWN0XzIoUE5HX1NUUlVDVF9QTkcsCi0gICAgICAocG5nX21hbGxvY19wdHIpbWFsbG9jX2ZuLCAocG5nX3ZvaWRwKW1lbV9wdHIpOwotI2Vsc2UKLSAgIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApcG5nX2NyZWF0ZV9zdHJ1Y3QoUE5HX1NUUlVDVF9QTkcpOwotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gKE5VTEwpOwotCi0gICAvKiBBZGRlZCBhdCBsaWJwbmctMS4yLjYgKi8KLSNpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAotICAgcG5nX3B0ci0+dXNlcl93aWR0aF9tYXg9UE5HX1VTRVJfV0lEVEhfTUFYOwotICAgcG5nX3B0ci0+dXNlcl9oZWlnaHRfbWF4PVBOR19VU0VSX0hFSUdIVF9NQVg7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0jaWZkZWYgVVNFX0ZBUl9LRVlXT1JECi0gICBpZiAoc2V0am1wKGptcGJ1ZikpCi0jZWxzZQotICAgaWYgKHNldGptcChwbmdfcHRyLT5qbXBidWYpKQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT56YnVmKTsKLSAgICAgICBwbmdfcHRyLT56YnVmPU5VTEw7Ci0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QocG5nX3B0cik7Ci0gICAgICByZXR1cm4gKE5VTEwpOwotICAgfQotI2lmZGVmIFVTRV9GQVJfS0VZV09SRAotICAgcG5nX21lbWNweShwbmdfcHRyLT5qbXBidWYsIGptcGJ1ZiwgcG5nX3NpemVvZihqbXBfYnVmKSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgcG5nX3NldF9tZW1fZm4ocG5nX3B0ciwgbWVtX3B0ciwgbWFsbG9jX2ZuLCBmcmVlX2ZuKTsKLSNlbmRpZiAvKiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEICovCi0gICBwbmdfc2V0X2Vycm9yX2ZuKHBuZ19wdHIsIGVycm9yX3B0ciwgZXJyb3JfZm4sIHdhcm5fZm4pOwotCi0gICBpZiAodXNlcl9wbmdfdmVyKQotICAgewotICAgICBpPTA7Ci0gICAgIGRvCi0gICAgIHsKLSAgICAgICBpZiAodXNlcl9wbmdfdmVyW2ldICE9IHBuZ19saWJwbmdfdmVyW2ldKQotICAgICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0xJQlJBUllfTUlTTUFUQ0g7Ci0gICAgIH0gd2hpbGUgKHBuZ19saWJwbmdfdmVyW2krK10pOwotICAgfQotCi0gICBpZiAocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIKQotICAgewotICAgICAvKiBMaWJwbmcgMC45MCBhbmQgbGF0ZXIgYXJlIGJpbmFyeSBpbmNvbXBhdGlibGUgd2l0aCBsaWJwbmcgMC44OSwgc28KLSAgICAgICogd2UgbXVzdCByZWNvbXBpbGUgYW55IGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBhbnkgb2xkZXIgbGlicmFyeSB2ZXJzaW9uLgotICAgICAgKiBGb3IgdmVyc2lvbnMgYWZ0ZXIgbGlicG5nIDEuMCwgd2Ugd2lsbCBiZSBjb21wYXRpYmxlLCBzbyB3ZSBuZWVkCi0gICAgICAqIG9ubHkgY2hlY2sgdGhlIGZpcnN0IGRpZ2l0LgotICAgICAgKi8KLSAgICAgaWYgKHVzZXJfcG5nX3ZlciA9PSBOVUxMIHx8IHVzZXJfcG5nX3ZlclswXSAhPSBwbmdfbGlicG5nX3ZlclswXSB8fAotICAgICAgICAgKHVzZXJfcG5nX3ZlclswXSA9PSAnMScgJiYgdXNlcl9wbmdfdmVyWzJdICE9IHBuZ19saWJwbmdfdmVyWzJdKSB8fAotICAgICAgICAgKHVzZXJfcG5nX3ZlclswXSA9PSAnMCcgJiYgdXNlcl9wbmdfdmVyWzJdIDwgJzknKSkKLSAgICAgewotI2lmICFkZWZpbmVkKFBOR19OT19TVERJTykgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKLSAgICAgICAgY2hhciBtc2dbODBdOwotICAgICAgICBpZiAodXNlcl9wbmdfdmVyKQotICAgICAgICB7Ci0gICAgICAgICAgcG5nX3NucHJpbnRmKG1zZywgODAsCi0gICAgICAgICAgICAgIkFwcGxpY2F0aW9uIHdhcyBjb21waWxlZCB3aXRoIHBuZy5oIGZyb20gbGlicG5nLSUuMjBzIiwKLSAgICAgICAgICAgICB1c2VyX3BuZ192ZXIpOwotICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcG5nX3NucHJpbnRmKG1zZywgODAsCi0gICAgICAgICAgICJBcHBsaWNhdGlvbiAgaXMgIHJ1bm5pbmcgd2l0aCBwbmcuYyBmcm9tIGxpYnBuZy0lLjIwcyIsCi0gICAgICAgICAgIHBuZ19saWJwbmdfdmVyKTsKLSAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsKLSNlbmRpZgotI2lmZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRAotICAgICAgICBwbmdfcHRyLT5mbGFncz0wOwotI2VuZGlmCi0gICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLAotICAgICAgICAgICAiSW5jb21wYXRpYmxlIGxpYnBuZyB2ZXJzaW9uIGluIGFwcGxpY2F0aW9uIGFuZCBsaWJyYXJ5Iik7Ci0gICAgIH0KLSAgIH0KLQotICAgLyogSW5pdGlhbGl6ZSB6YnVmIC0gY29tcHJlc3Npb24gYnVmZmVyICovCi0gICBwbmdfcHRyLT56YnVmX3NpemUgPSBQTkdfWkJVRl9TSVpFOwotICAgcG5nX3B0ci0+emJ1ZiA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgKHBuZ191aW50XzMyKXBuZ19wdHItPnpidWZfc2l6ZSk7Ci0KLSAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nX3B0ciwgcG5nX3ZvaWRwX05VTEwsIHBuZ19yd19wdHJfTlVMTCwKLSAgICAgIHBuZ19mbHVzaF9wdHJfTlVMTCk7Ci0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEKQotICAgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljcyhwbmdfcHRyLCBQTkdfRklMVEVSX0hFVVJJU1RJQ19ERUZBVUxULAotICAgICAgMSwgcG5nX2RvdWJsZXBfTlVMTCwgcG5nX2RvdWJsZXBfTlVMTCk7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0vKiBBcHBsaWNhdGlvbnMgdGhhdCBuZWdsZWN0IHRvIHNldCB1cCB0aGVpciBvd24gc2V0am1wKCkgYW5kIHRoZW4gZW5jb3VudGVyCi0gICBhIHBuZ19lcnJvcigpIHdpbGwgbG9uZ2ptcCBoZXJlLiAgU2luY2UgdGhlIGptcGJ1ZiBpcyB0aGVuIG1lYW5pbmdsZXNzIHdlCi0gICBhYm9ydCBpbnN0ZWFkIG9mIHJldHVybmluZy4gKi8KLSNpZmRlZiBVU0VfRkFSX0tFWVdPUkQKLSAgIGlmIChzZXRqbXAoam1wYnVmKSkKLSAgICAgIFBOR19BQk9SVCgpOwotICAgcG5nX21lbWNweShwbmdfcHRyLT5qbXBidWYsIGptcGJ1ZiwgcG5nX3NpemVvZihqbXBfYnVmKSk7Ci0jZWxzZQotICAgaWYgKHNldGptcChwbmdfcHRyLT5qbXBidWYpKQotICAgICAgUE5HX0FCT1JUKCk7Ci0jZW5kaWYKLSNlbmRpZgotICAgcmV0dXJuIChwbmdfcHRyKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBwbmdfcHRyIHN0cnVjdHVyZSwgYW5kIGFsbG9jYXRlIGFueSBtZW1vcnkgbmVlZGVkICovCi0jaWYgZGVmaW5lZChQTkdfMV8wX1gpIHx8IGRlZmluZWQoUE5HXzFfMl9YKQotLyogRGVwcmVjYXRlZC4gKi8KLSN1bmRlZiBwbmdfd3JpdGVfaW5pdAotdm9pZCBQTkdBUEkKLXBuZ193cml0ZV9pbml0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICAvKiBXZSBvbmx5IGNvbWUgaGVyZSB2aWEgcHJlLTEuMC43LWNvbXBpbGVkIGFwcGxpY2F0aW9ucyAqLwotICAgcG5nX3dyaXRlX2luaXRfMihwbmdfcHRyLCAiMS4wLjYgb3IgZWFybGllciIsIDAsIDApOwotfQotCi12b2lkIFBOR0FQSQotcG5nX3dyaXRlX2luaXRfMihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLAotICAgcG5nX3NpemVfdCBwbmdfc3RydWN0X3NpemUsIHBuZ19zaXplX3QgcG5nX2luZm9fc2l6ZSkKLXsKLSAgIC8qIFdlIG9ubHkgY29tZSBoZXJlIHZpYSBwcmUtMS4wLjEyLWNvbXBpbGVkIGFwcGxpY2F0aW9ucyAqLwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkgcmV0dXJuOwotI2lmICFkZWZpbmVkKFBOR19OT19TVERJTykgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKLSAgIGlmIChwbmdfc2l6ZW9mKHBuZ19zdHJ1Y3QpID4gcG5nX3N0cnVjdF9zaXplIHx8Ci0gICAgICBwbmdfc2l6ZW9mKHBuZ19pbmZvKSA+IHBuZ19pbmZvX3NpemUpCi0gICB7Ci0gICAgICBjaGFyIG1zZ1s4MF07Ci0gICAgICBwbmdfcHRyLT53YXJuaW5nX2ZuPU5VTEw7Ci0gICAgICBpZiAodXNlcl9wbmdfdmVyKQotICAgICAgewotICAgICAgICBwbmdfc25wcmludGYobXNnLCA4MCwKLSAgICAgICAgICAgIkFwcGxpY2F0aW9uIHdhcyBjb21waWxlZCB3aXRoIHBuZy5oIGZyb20gbGlicG5nLSUuMjBzIiwKLSAgICAgICAgICAgdXNlcl9wbmdfdmVyKTsKLSAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsKLSAgICAgIH0KLSAgICAgIHBuZ19zbnByaW50Zihtc2csIDgwLAotICAgICAgICAgIkFwcGxpY2F0aW9uICBpcyAgcnVubmluZyB3aXRoIHBuZy5jIGZyb20gbGlicG5nLSUuMjBzIiwKLSAgICAgICAgIHBuZ19saWJwbmdfdmVyKTsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsIG1zZyk7Ci0gICB9Ci0jZW5kaWYKLSAgIGlmIChwbmdfc2l6ZW9mKHBuZ19zdHJ1Y3QpID4gcG5nX3N0cnVjdF9zaXplKQotICAgICB7Ci0gICAgICAgcG5nX3B0ci0+ZXJyb3JfZm49TlVMTDsKLSNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKLSAgICAgICBwbmdfcHRyLT5mbGFncz0wOwotI2VuZGlmCi0gICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCi0gICAgICAgIlRoZSBwbmcgc3RydWN0IGFsbG9jYXRlZCBieSB0aGUgYXBwbGljYXRpb24gZm9yIHdyaXRpbmcgaXMgdG9vIHNtYWxsLiIpOwotICAgICB9Ci0gICBpZiAocG5nX3NpemVvZihwbmdfaW5mbykgPiBwbmdfaW5mb19zaXplKQotICAgICB7Ci0gICAgICAgcG5nX3B0ci0+ZXJyb3JfZm49TlVMTDsKLSNpZmRlZiBQTkdfRVJST1JfTlVNQkVSU19TVVBQT1JURUQKLSAgICAgICBwbmdfcHRyLT5mbGFncz0wOwotI2VuZGlmCi0gICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsCi0gICAgICAgIlRoZSBpbmZvIHN0cnVjdCBhbGxvY2F0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGZvciB3cml0aW5nIGlzIHRvbyBzbWFsbC4iKTsKLSAgICAgfQotICAgcG5nX3dyaXRlX2luaXRfMygmcG5nX3B0ciwgdXNlcl9wbmdfdmVyLCBwbmdfc3RydWN0X3NpemUpOwotfQotI2VuZGlmIC8qIFBOR18xXzBfWCB8fCBQTkdfMV8yX1ggKi8KLQotCi12b2lkIFBOR0FQSQotcG5nX3dyaXRlX2luaXRfMyhwbmdfc3RydWN0cHAgcHRyX3B0ciwgcG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciwKLSAgIHBuZ19zaXplX3QgcG5nX3N0cnVjdF9zaXplKQotewotICAgcG5nX3N0cnVjdHAgcG5nX3B0cj0qcHRyX3B0cjsKLSNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAotICAgam1wX2J1ZiB0bXBfam1wOyAvKiBUbyBzYXZlIGN1cnJlbnQganVtcCBidWZmZXIgKi8KLSNlbmRpZgotCi0gICBpbnQgaSA9IDA7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIGRvCi0gICB7Ci0gICAgIGlmICh1c2VyX3BuZ192ZXJbaV0gIT0gcG5nX2xpYnBuZ192ZXJbaV0pCi0gICAgIHsKLSNpZmRlZiBQTkdfTEVHQUNZX1NVUFBPUlRFRAotICAgICAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX0xJQlJBUllfTUlTTUFUQ0g7Ci0jZWxzZQotICAgICAgIHBuZ19wdHItPndhcm5pbmdfZm49TlVMTDsKLSAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICJBcHBsaWNhdGlvbiB1c2VzIGRlcHJlY2F0ZWQgcG5nX3dyaXRlX2luaXQoKSBhbmQgc2hvdWxkIGJlIHJlY29tcGlsZWQuIik7Ci0gICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgfQotICAgfSB3aGlsZSAocG5nX2xpYnBuZ192ZXJbaSsrXSk7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2luaXRfMyIpOwotCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSAgIC8qIFNhdmUganVtcCBidWZmZXIgYW5kIGVycm9yIGZ1bmN0aW9ucyAqLwotICAgcG5nX21lbWNweSh0bXBfam1wLCBwbmdfcHRyLT5qbXBidWYsIHBuZ19zaXplb2Yoam1wX2J1ZikpOwotI2VuZGlmCi0KLSAgIGlmIChwbmdfc2l6ZW9mKHBuZ19zdHJ1Y3QpID4gcG5nX3N0cnVjdF9zaXplKQotICAgICB7Ci0gICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0KHBuZ19wdHIpOwotICAgICAgIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApcG5nX2NyZWF0ZV9zdHJ1Y3QoUE5HX1NUUlVDVF9QTkcpOwotICAgICAgICpwdHJfcHRyID0gcG5nX3B0cjsKLSAgICAgfQotCi0gICAvKiBSZXNldCBhbGwgdmFyaWFibGVzIHRvIDAgKi8KLSAgIHBuZ19tZW1zZXQocG5nX3B0ciwgMCwgcG5nX3NpemVvZihwbmdfc3RydWN0KSk7Ci0KLSAgIC8qIEFkZGVkIGF0IGxpYnBuZy0xLjIuNiAqLwotI2lmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0gICBwbmdfcHRyLT51c2VyX3dpZHRoX21heD1QTkdfVVNFUl9XSURUSF9NQVg7Ci0gICBwbmdfcHRyLT51c2VyX2hlaWdodF9tYXg9UE5HX1VTRVJfSEVJR0hUX01BWDsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSAgIC8qIFJlc3RvcmUganVtcCBidWZmZXIgKi8KLSAgIHBuZ19tZW1jcHkocG5nX3B0ci0+am1wYnVmLCB0bXBfam1wLCBwbmdfc2l6ZW9mKGptcF9idWYpKTsKLSNlbmRpZgotCi0gICBwbmdfc2V0X3dyaXRlX2ZuKHBuZ19wdHIsIHBuZ192b2lkcF9OVUxMLCBwbmdfcndfcHRyX05VTEwsCi0gICAgICBwbmdfZmx1c2hfcHRyX05VTEwpOwotCi0gICAvKiBJbml0aWFsaXplIHpidWYgLSBjb21wcmVzc2lvbiBidWZmZXIgKi8KLSAgIHBuZ19wdHItPnpidWZfc2l6ZSA9IFBOR19aQlVGX1NJWkU7Ci0gICBwbmdfcHRyLT56YnVmID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAocG5nX3VpbnRfMzIpcG5nX3B0ci0+emJ1Zl9zaXplKTsKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQpCi0gICBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzKHBuZ19wdHIsIFBOR19GSUxURVJfSEVVUklTVElDX0RFRkFVTFQsCi0gICAgICAxLCBwbmdfZG91YmxlcF9OVUxMLCBwbmdfZG91YmxlcF9OVUxMKTsKLSNlbmRpZgotfQotCi0vKiBXcml0ZSBhIGZldyByb3dzIG9mIGltYWdlIGRhdGEuICBJZiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCwKLSAqIGVpdGhlciB5b3Ugd2lsbCBoYXZlIHRvIHdyaXRlIHRoZSA3IHN1YiBpbWFnZXMsIG9yLCBpZiB5b3UKLSAqIGhhdmUgY2FsbGVkIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCksIHlvdSB3aWxsIGhhdmUgdG8KLSAqICJ3cml0ZSIgdGhlIGltYWdlIHNldmVuIHRpbWVzLgotICovCi12b2lkIFBOR0FQSQotcG5nX3dyaXRlX3Jvd3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwcCByb3csCi0gICBwbmdfdWludF8zMiBudW1fcm93cykKLXsKLSAgIHBuZ191aW50XzMyIGk7IC8qIFJvdyBjb3VudGVyICovCi0gICBwbmdfYnl0ZXBwIHJwOyAvKiBSb3cgcG9pbnRlciAqLwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9yb3dzIik7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0KLSAgIC8qIExvb3AgdGhyb3VnaCB0aGUgcm93cyAqLwotICAgZm9yIChpID0gMCwgcnAgPSByb3c7IGkgPCBudW1fcm93czsgaSsrLCBycCsrKQotICAgewotICAgICAgcG5nX3dyaXRlX3JvdyhwbmdfcHRyLCAqcnApOwotICAgfQotfQotCi0vKiBXcml0ZSB0aGUgaW1hZ2UuICBZb3Ugb25seSBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbmNlLCBldmVuCi0gKiBpZiB5b3UgYXJlIHdyaXRpbmcgYW4gaW50ZXJsYWNlZCBpbWFnZS4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ193cml0ZV9pbWFnZShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXBwIGltYWdlKQotewotICAgcG5nX3VpbnRfMzIgaTsgLyogUm93IGluZGV4ICovCi0gICBpbnQgcGFzcywgbnVtX3Bhc3M7IC8qIFBhc3MgdmFyaWFibGVzICovCi0gICBwbmdfYnl0ZXBwIHJwOyAvKiBQb2ludHMgdG8gY3VycmVudCByb3cgKi8KLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfaW1hZ2UiKTsKLSNpZiBkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCi0gICAvKiBJbml0aWFsaXplIGludGVybGFjZSBoYW5kbGluZy4gIElmIGltYWdlIGlzIG5vdCBpbnRlcmxhY2VkLAotICAgICogdGhpcyB3aWxsIHNldCBwYXNzIHRvIDEKLSAgICAqLwotICAgbnVtX3Bhc3MgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLSNlbHNlCi0gICBudW1fcGFzcyA9IDE7Ci0jZW5kaWYKLSAgIC8qIExvb3AgdGhyb3VnaCBwYXNzZXMgKi8KLSAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBudW1fcGFzczsgcGFzcysrKQotICAgewotICAgICAgLyogTG9vcCB0aHJvdWdoIGltYWdlICovCi0gICAgICBmb3IgKGkgPSAwLCBycCA9IGltYWdlOyBpIDwgcG5nX3B0ci0+aGVpZ2h0OyBpKyssIHJwKyspCi0gICAgICB7Ci0gICAgICAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsICpycCk7Ci0gICAgICB9Ci0gICB9Ci19Ci0KLS8qIENhbGxlZCBieSB1c2VyIHRvIHdyaXRlIGEgcm93IG9mIGltYWdlIGRhdGEgKi8KLXZvaWQgUE5HQVBJCi1wbmdfd3JpdGVfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCByb3cpCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX2RlYnVnMigxLCAiaW4gcG5nX3dyaXRlX3JvdyAocm93ICVsZCwgcGFzcyAlZCkiLAotICAgICAgcG5nX3B0ci0+cm93X251bWJlciwgcG5nX3B0ci0+cGFzcyk7Ci0KLSAgIC8qIEluaXRpYWxpemUgdHJhbnNmb3JtYXRpb25zIGFuZCBvdGhlciBzdHVmZiBpZiBmaXJzdCB0aW1lICovCi0gICBpZiAocG5nX3B0ci0+cm93X251bWJlciA9PSAwICYmIHBuZ19wdHItPnBhc3MgPT0gMCkKLSAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgaGVhZGVyIGluZm8gKi8KLSAgICAgIGlmICghKHBuZ19wdHItPm1vZGUgJiBQTkdfV1JPVEVfSU5GT19CRUZPUkVfUExURSkpCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKLSAgICAgICAgICAgICJwbmdfd3JpdGVfaW5mbyB3YXMgbmV2ZXIgY2FsbGVkIGJlZm9yZSBwbmdfd3JpdGVfcm93LiIpOwotCi0gICAgICAvKiBDaGVjayBmb3IgdHJhbnNmb3JtcyB0aGF0IGhhdmUgYmVlbiBzZXQgYnV0IHdlcmUgZGVmaW5lZCBvdXQgKi8KLSNpZiAhZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKQotICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19JTlZFUlRfTU9OTykKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZC4iKTsKLSNlbmRpZgotI2lmICFkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQpCi0gICAgICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0ZJTExFUikKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZC4iKTsKLSNlbmRpZgotI2lmICFkZWZpbmVkKFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKQotICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkLiIpOwotI2VuZGlmCi0jaWYgIWRlZmluZWQoUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEKQotICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLKQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19XUklURV9QQUNLX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZC4iKTsKLSNlbmRpZgotI2lmICFkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKQotICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TSElGVCkKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkLiIpOwotI2VuZGlmCi0jaWYgIWRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1JFQURfQkdSX1NVUFBPUlRFRCkKLSAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkdSKQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19XUklURV9CR1JfU1VQUE9SVEVEIGlzIG5vdCBkZWZpbmVkLiIpOwotI2VuZGlmCi0jaWYgIWRlZmluZWQoUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfU1VQUE9SVEVEKQotICAgICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0JZVEVTKQotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlBOR19XUklURV9TV0FQX1NVUFBPUlRFRCBpcyBub3QgZGVmaW5lZC4iKTsKLSNlbmRpZgotCi0gICAgICBwbmdfd3JpdGVfc3RhcnRfcm93KHBuZ19wdHIpOwotICAgfQotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEKQotICAgLyogSWYgaW50ZXJsYWNlZCBhbmQgbm90IGludGVyZXN0ZWQgaW4gcm93LCByZXR1cm4gKi8KLSAgIGlmIChwbmdfcHRyLT5pbnRlcmxhY2VkICYmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSkKLSAgIHsKLSAgICAgIHN3aXRjaCAocG5nX3B0ci0+cGFzcykKLSAgICAgIHsKLSAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDA3KSB8fCBwbmdfcHRyLT53aWR0aCA8IDUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwNykgIT0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDAzKSB8fCBwbmdfcHRyLT53aWR0aCA8IDMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgaWYgKChwbmdfcHRyLT5yb3dfbnVtYmVyICYgMHgwMykgIT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19wdHIpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBpZiAoKHBuZ19wdHItPnJvd19udW1iZXIgJiAweDAxKSB8fCBwbmdfcHRyLT53aWR0aCA8IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgaWYgKCEocG5nX3B0ci0+cm93X251bWJlciAmIDB4MDEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgIH0KLSNlbmRpZgotCi0gICAvKiBTZXQgdXAgcm93IGluZm8gZm9yIHRyYW5zZm9ybWF0aW9ucyAqLwotICAgcG5nX3B0ci0+cm93X2luZm8uY29sb3JfdHlwZSA9IHBuZ19wdHItPmNvbG9yX3R5cGU7Ci0gICBwbmdfcHRyLT5yb3dfaW5mby53aWR0aCA9IHBuZ19wdHItPnVzcl93aWR0aDsKLSAgIHBuZ19wdHItPnJvd19pbmZvLmNoYW5uZWxzID0gcG5nX3B0ci0+dXNyX2NoYW5uZWxzOwotICAgcG5nX3B0ci0+cm93X2luZm8uYml0X2RlcHRoID0gcG5nX3B0ci0+dXNyX2JpdF9kZXB0aDsKLSAgIHBuZ19wdHItPnJvd19pbmZvLnBpeGVsX2RlcHRoID0gKHBuZ19ieXRlKShwbmdfcHRyLT5yb3dfaW5mby5iaXRfZGVwdGggKgotICAgICAgcG5nX3B0ci0+cm93X2luZm8uY2hhbm5lbHMpOwotCi0gICBwbmdfcHRyLT5yb3dfaW5mby5yb3dieXRlcyA9IFBOR19ST1dCWVRFUyhwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCwKLSAgICAgIHBuZ19wdHItPnJvd19pbmZvLndpZHRoKTsKLQotICAgcG5nX2RlYnVnMSgzLCAicm93X2luZm8tPmNvbG9yX3R5cGUgPSAlZCIsIHBuZ19wdHItPnJvd19pbmZvLmNvbG9yX3R5cGUpOwotICAgcG5nX2RlYnVnMSgzLCAicm93X2luZm8tPndpZHRoID0gJWx1IiwgcG5nX3B0ci0+cm93X2luZm8ud2lkdGgpOwotICAgcG5nX2RlYnVnMSgzLCAicm93X2luZm8tPmNoYW5uZWxzID0gJWQiLCBwbmdfcHRyLT5yb3dfaW5mby5jaGFubmVscyk7Ci0gICBwbmdfZGVidWcxKDMsICJyb3dfaW5mby0+Yml0X2RlcHRoID0gJWQiLCBwbmdfcHRyLT5yb3dfaW5mby5iaXRfZGVwdGgpOwotICAgcG5nX2RlYnVnMSgzLCAicm93X2luZm8tPnBpeGVsX2RlcHRoID0gJWQiLCBwbmdfcHRyLT5yb3dfaW5mby5waXhlbF9kZXB0aCk7Ci0gICBwbmdfZGVidWcxKDMsICJyb3dfaW5mby0+cm93Ynl0ZXMgPSAlbHUiLCBwbmdfcHRyLT5yb3dfaW5mby5yb3dieXRlcyk7Ci0KLSAgIC8qIENvcHkgdXNlcidzIHJvdyBpbnRvIGJ1ZmZlciwgbGVhdmluZyByb29tIGZvciBmaWx0ZXIgYnl0ZS4gKi8KLSAgIHBuZ19tZW1jcHlfY2hlY2socG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1ZiArIDEsIHJvdywKLSAgICAgIHBuZ19wdHItPnJvd19pbmZvLnJvd2J5dGVzKTsKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRCkKLSAgIC8qIEhhbmRsZSBpbnRlcmxhY2luZyAqLwotICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQgJiYgcG5nX3B0ci0+cGFzcyA8IDYgJiYKLSAgICAgIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSkKLSAgIHsKLSAgICAgIHBuZ19kb193cml0ZV9pbnRlcmxhY2UoJihwbmdfcHRyLT5yb3dfaW5mbyksCi0gICAgICAgICBwbmdfcHRyLT5yb3dfYnVmICsgMSwgcG5nX3B0ci0+cGFzcyk7Ci0gICAgICAvKiBUaGlzIHNob3VsZCBhbHdheXMgZ2V0IGNhdWdodCBhYm92ZSwgYnV0IHN0aWxsIC4uLiAqLwotICAgICAgaWYgKCEocG5nX3B0ci0+cm93X2luZm8ud2lkdGgpKQotICAgICAgewotICAgICAgICAgcG5nX3dyaXRlX2ZpbmlzaF9yb3cocG5nX3B0cik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotICAgLyogSGFuZGxlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyAqLwotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucykKLSAgICAgIHBuZ19kb193cml0ZV90cmFuc2Zvcm1hdGlvbnMocG5nX3B0cik7Ci0KLSNpZiBkZWZpbmVkKFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEKQotICAgLyogV3JpdGUgZmlsdGVyX21ldGhvZCA2NCAoaW50cmFwaXhlbCBkaWZmZXJlbmNpbmcpIG9ubHkgaWYKLSAgICAqIDEuIExpYnBuZyB3YXMgY29tcGlsZWQgd2l0aCBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCBhbmQKLSAgICAqIDIuIExpYnBuZyBkaWQgbm90IHdyaXRlIGEgUE5HIHNpZ25hdHVyZSAodGhpcyBmaWx0ZXJfbWV0aG9kIGlzIG9ubHkKLSAgICAqICAgIHVzZWQgaW4gUE5HIGRhdGFzdHJlYW1zIHRoYXQgYXJlIGVtYmVkZGVkIGluIE1ORyBkYXRhc3RyZWFtcykgYW5kCi0gICAgKiAzLiBUaGUgYXBwbGljYXRpb24gY2FsbGVkIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzIHdpdGggYSBtYXNrIHRoYXQKLSAgICAqICAgIGluY2x1ZGVkIFBOR19GTEFHX01OR19GSUxURVJfNjQgYW5kCi0gICAgKiA0LiBUaGUgZmlsdGVyX21ldGhvZCBpcyA2NCBhbmQKLSAgICAqIDUuIFRoZSBjb2xvcl90eXBlIGlzIFJHQiBvciBSR0JBCi0gICAgKi8KLSAgIGlmICgocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19GSUxURVJfNjQpICYmCi0gICAgICAocG5nX3B0ci0+ZmlsdGVyX3R5cGUgPT0gUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKSkKLSAgIHsKLSAgICAgIC8qIEludHJhcGl4ZWwgZGlmZmVyZW5jaW5nICovCi0gICAgICBwbmdfZG9fd3JpdGVfaW50cmFwaXhlbCgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotICAgfQotI2VuZGlmCi0KLSAgIC8qIEZpbmQgYSBmaWx0ZXIgaWYgbmVjZXNzYXJ5LCBmaWx0ZXIgdGhlIHJvdyBhbmQgd3JpdGUgaXQgb3V0LiAqLwotICAgcG5nX3dyaXRlX2ZpbmRfZmlsdGVyKHBuZ19wdHIsICYocG5nX3B0ci0+cm93X2luZm8pKTsKLQotICAgaWYgKHBuZ19wdHItPndyaXRlX3Jvd19mbiAhPSBOVUxMKQotICAgICAgKCoocG5nX3B0ci0+d3JpdGVfcm93X2ZuKSkocG5nX3B0ciwgcG5nX3B0ci0+cm93X251bWJlciwgcG5nX3B0ci0+cGFzcyk7Ci19Ci0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQpCi0vKiBTZXQgdGhlIGF1dG9tYXRpYyBmbHVzaCBpbnRlcnZhbCBvciAwIHRvIHR1cm4gZmx1c2hpbmcgb2ZmICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgbnJvd3MpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfZmx1c2giKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT5mbHVzaF9kaXN0ID0gKG5yb3dzIDwgMCA/IDAgOiBucm93cyk7Ci19Ci0KLS8qIEZsdXNoIHRoZSBjdXJyZW50IG91dHB1dCBidWZmZXJzIG5vdyAqLwotdm9pZCBQTkdBUEkKLXBuZ193cml0ZV9mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgaW50IHdyb3RlX0lEQVQ7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2ZsdXNoIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgLyogV2UgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IGFsbCBvZiB0aGUgZGF0YSAqLwotICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgPj0gcG5nX3B0ci0+bnVtX3Jvd3MpCi0gICAgICByZXR1cm47Ci0KLSAgIGRvCi0gICB7Ci0gICAgICBpbnQgcmV0OwotCi0gICAgICAvKiBDb21wcmVzcyB0aGUgZGF0YSAqLwotICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9TWU5DX0ZMVVNIKTsKLSAgICAgIHdyb3RlX0lEQVQgPSAwOwotCi0gICAgICAvKiBDaGVjayBmb3IgY29tcHJlc3Npb24gZXJyb3JzICovCi0gICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICB7Ci0gICAgICAgICBpZiAocG5nX3B0ci0+enN0cmVhbS5tc2cgIT0gTlVMTCkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInpsaWIgZXJyb3IiKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCEocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQpKQotICAgICAgewotICAgICAgICAgLyogV3JpdGUgdGhlIElEQVQgYW5kIHJlc2V0IHRoZSB6bGliIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgIHBuZ193cml0ZV9JREFUKHBuZ19wdHIsIHBuZ19wdHItPnpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT56YnVmX3NpemUpOwotICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IHBuZ19wdHItPnpidWY7Ci0gICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKLSAgICAgICAgIHdyb3RlX0lEQVQgPSAxOwotICAgICAgfQotICAgfSB3aGlsZSh3cm90ZV9JREFUID09IDEpOwotCi0gICAvKiBJZiB0aGVyZSBpcyBhbnkgZGF0YSBsZWZ0IHRvIGJlIG91dHB1dCwgd3JpdGUgaXQgaW50byBhIG5ldyBJREFUICovCi0gICBpZiAocG5nX3B0ci0+emJ1Zl9zaXplICE9IHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KQotICAgewotICAgICAgLyogV3JpdGUgdGhlIElEQVQgYW5kIHJlc2V0IHRoZSB6bGliIG91dHB1dCBidWZmZXIgKi8KLSAgICAgIHBuZ193cml0ZV9JREFUKHBuZ19wdHIsIHBuZ19wdHItPnpidWYsCi0gICAgICAgICAgICAgICAgICAgICBwbmdfcHRyLT56YnVmX3NpemUgLSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCk7Ci0gICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLSAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOwotICAgfQotICAgcG5nX3B0ci0+Zmx1c2hfcm93cyA9IDA7Ci0gICBwbmdfZmx1c2gocG5nX3B0cik7Ci19Ci0jZW5kaWYgLyogUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCAqLwotCi0vKiBGcmVlIGFsbCBtZW1vcnkgdXNlZCBieSB0aGUgd3JpdGUgKi8KLXZvaWQgUE5HQVBJCi1wbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QocG5nX3N0cnVjdHBwIHBuZ19wdHJfcHRyLCBwbmdfaW5mb3BwIGluZm9fcHRyX3B0cikKLXsKLSAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBOVUxMOwotICAgcG5nX2luZm9wIGluZm9fcHRyID0gTlVMTDsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfZnJlZV9wdHIgZnJlZV9mbiA9IE5VTEw7Ci0gICBwbmdfdm9pZHAgbWVtX3B0ciA9IE5VTEw7Ci0jZW5kaWYKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QiKTsKLSAgIGlmIChwbmdfcHRyX3B0ciAhPSBOVUxMKQotICAgewotICAgICAgcG5nX3B0ciA9ICpwbmdfcHRyX3B0cjsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICAgICBmcmVlX2ZuID0gcG5nX3B0ci0+ZnJlZV9mbjsKLSAgICAgIG1lbV9wdHIgPSBwbmdfcHRyLT5tZW1fcHRyOwotI2VuZGlmCi0gICB9Ci0KLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBpZiAocG5nX3B0ciAhPSBOVUxMKQotICAgewotICAgICAgZnJlZV9mbiA9IHBuZ19wdHItPmZyZWVfZm47Ci0gICAgICBtZW1fcHRyID0gcG5nX3B0ci0+bWVtX3B0cjsKLSAgIH0KLSNlbmRpZgotCi0gICBpZiAoaW5mb19wdHJfcHRyICE9IE5VTEwpCi0gICAgICBpbmZvX3B0ciA9ICppbmZvX3B0cl9wdHI7Ci0KLSAgIGlmIChpbmZvX3B0ciAhPSBOVUxMKQotICAgewotICAgICAgaWYgKHBuZ19wdHIgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfQUxMLCAtMSk7Ci0KLSNpZiBkZWZpbmVkKFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICAgICAgIGlmIChwbmdfcHRyLT5udW1fY2h1bmtfbGlzdCkKLSAgICAgICAgewotICAgICAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5jaHVua19saXN0KTsKLSAgICAgICAgICAgcG5nX3B0ci0+Y2h1bmtfbGlzdD1OVUxMOwotICAgICAgICAgICBwbmdfcHRyLT5udW1fY2h1bmtfbGlzdCA9IDA7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgfQotCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0XzIoKHBuZ192b2lkcClpbmZvX3B0ciwgKHBuZ19mcmVlX3B0cilmcmVlX2ZuLAotICAgICAgICAgKHBuZ192b2lkcCltZW1fcHRyKTsKLSNlbHNlCi0gICAgICBwbmdfZGVzdHJveV9zdHJ1Y3QoKHBuZ192b2lkcClpbmZvX3B0cik7Ci0jZW5kaWYKLSAgICAgICppbmZvX3B0cl9wdHIgPSBOVUxMOwotICAgfQotCi0gICBpZiAocG5nX3B0ciAhPSBOVUxMKQotICAgewotICAgICAgcG5nX3dyaXRlX2Rlc3Ryb3kocG5nX3B0cik7Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgcG5nX2Rlc3Ryb3lfc3RydWN0XzIoKHBuZ192b2lkcClwbmdfcHRyLCAocG5nX2ZyZWVfcHRyKWZyZWVfZm4sCi0gICAgICAgICAocG5nX3ZvaWRwKW1lbV9wdHIpOwotI2Vsc2UKLSAgICAgIHBuZ19kZXN0cm95X3N0cnVjdCgocG5nX3ZvaWRwKXBuZ19wdHIpOwotI2VuZGlmCi0gICAgICAqcG5nX3B0cl9wdHIgPSBOVUxMOwotICAgfQotfQotCi0KLS8qIEZyZWUgYW55IG1lbW9yeSB1c2VkIGluIHBuZ19wdHIgc3RydWN0IChvbGQgbWV0aG9kKSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfZGVzdHJveShwbmdfc3RydWN0cCBwbmdfcHRyKQotewotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICBqbXBfYnVmIHRtcF9qbXA7IC8qIFNhdmUganVtcCBidWZmZXIgKi8KLSNlbmRpZgotICAgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbjsKLSAgIHBuZ19lcnJvcl9wdHIgd2FybmluZ19mbjsKLSAgIHBuZ192b2lkcCBlcnJvcl9wdHI7Ci0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgcG5nX2ZyZWVfcHRyIGZyZWVfZm47Ci0jZW5kaWYKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZGVzdHJveSIpOwotICAgLyogRnJlZSBhbnkgbWVtb3J5IHpsaWIgdXNlcyAqLwotICAgZGVmbGF0ZUVuZCgmcG5nX3B0ci0+enN0cmVhbSk7Ci0KLSAgIC8qIEZyZWUgb3VyIG1lbW9yeS4gIHBuZ19mcmVlIGNoZWNrcyBOVUxMIGZvciB1cy4gKi8KLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnpidWYpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cm93X2J1Zik7Ci0jaWZuZGVmIFBOR19OT19XUklURV9GSUxURVIKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnByZXZfcm93KTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnN1Yl9yb3cpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+dXBfcm93KTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmF2Z19yb3cpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+cGFldGhfcm93KTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCkKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnRpbWVfYnVmZmVyKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCkKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPnByZXZfZmlsdGVycyk7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0cyk7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHMpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHMpOwotI2VuZGlmCi0KLSNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAotICAgLyogUmVzZXQgc3RydWN0dXJlICovCi0gICBwbmdfbWVtY3B5KHRtcF9qbXAsIHBuZ19wdHItPmptcGJ1ZiwgcG5nX3NpemVvZihqbXBfYnVmKSk7Ci0jZW5kaWYKLQotICAgZXJyb3JfZm4gPSBwbmdfcHRyLT5lcnJvcl9mbjsKLSAgIHdhcm5pbmdfZm4gPSBwbmdfcHRyLT53YXJuaW5nX2ZuOwotICAgZXJyb3JfcHRyID0gcG5nX3B0ci0+ZXJyb3JfcHRyOwotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgIGZyZWVfZm4gPSBwbmdfcHRyLT5mcmVlX2ZuOwotI2VuZGlmCi0KLSAgIHBuZ19tZW1zZXQocG5nX3B0ciwgMCwgcG5nX3NpemVvZihwbmdfc3RydWN0KSk7Ci0KLSAgIHBuZ19wdHItPmVycm9yX2ZuID0gZXJyb3JfZm47Ci0gICBwbmdfcHRyLT53YXJuaW5nX2ZuID0gd2FybmluZ19mbjsKLSAgIHBuZ19wdHItPmVycm9yX3B0ciA9IGVycm9yX3B0cjsKLSNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICBwbmdfcHRyLT5mcmVlX2ZuID0gZnJlZV9mbjsKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSAgIHBuZ19tZW1jcHkocG5nX3B0ci0+am1wYnVmLCB0bXBfam1wLCBwbmdfc2l6ZW9mKGptcF9idWYpKTsKLSNlbmRpZgotfQotCi0vKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gc2VsZWN0IG9uZSBvciBtb3JlIHJvdyBmaWx0ZXJzIHRvIHVzZS4gKi8KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2ZpbHRlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgbWV0aG9kLCBpbnQgZmlsdGVycykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9maWx0ZXIiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0jaWYgZGVmaW5lZChQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCkKLSAgIGlmICgocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19GSUxURVJfNjQpICYmCi0gICAgICAobWV0aG9kID09IFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORykpCi0gICAgICAgICBtZXRob2QgPSBQTkdfRklMVEVSX1RZUEVfQkFTRTsKLSNlbmRpZgotICAgaWYgKG1ldGhvZCA9PSBQTkdfRklMVEVSX1RZUEVfQkFTRSkKLSAgIHsKLSAgICAgIHN3aXRjaCAoZmlsdGVycyAmIChQTkdfQUxMX0ZJTFRFUlMgfCAweDA3KSkKLSAgICAgIHsKLSNpZm5kZWYgUE5HX05PX1dSSVRFX0ZJTFRFUgotICAgICAgICAgY2FzZSA1OgotICAgICAgICAgY2FzZSA2OgotICAgICAgICAgY2FzZSA3OiBwbmdfd2FybmluZyhwbmdfcHRyLCAiVW5rbm93biByb3cgZmlsdGVyIGZvciBtZXRob2QgMCIpOwotI2VuZGlmIC8qIFBOR19OT19XUklURV9GSUxURVIgKi8KLSAgICAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9OT05FOgotICAgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXI9UE5HX0ZJTFRFUl9OT05FOyBicmVhazsKLSNpZm5kZWYgUE5HX05PX1dSSVRFX0ZJTFRFUgotICAgICAgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX1NVQjoKLSAgICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyPVBOR19GSUxURVJfU1VCOyBicmVhazsKLSAgICAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9VUDoKLSAgICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyPVBOR19GSUxURVJfVVA7IGJyZWFrOwotICAgICAgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX0FWRzoKLSAgICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyPVBOR19GSUxURVJfQVZHOyBicmVhazsKLSAgICAgICAgIGNhc2UgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSDoKLSAgICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyPVBOR19GSUxURVJfUEFFVEg7IGJyZWFrOwotICAgICAgICAgZGVmYXVsdDogcG5nX3B0ci0+ZG9fZmlsdGVyID0gKHBuZ19ieXRlKWZpbHRlcnM7IGJyZWFrOwotI2Vsc2UKLSAgICAgICAgIGRlZmF1bHQ6IHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIHJvdyBmaWx0ZXIgZm9yIG1ldGhvZCAwIik7Ci0jZW5kaWYgLyogUE5HX05PX1dSSVRFX0ZJTFRFUiAqLwotICAgICAgfQotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGFsbG9jYXRlZCB0aGUgcm93X2J1ZiwgdGhpcyBtZWFucyB3ZSBoYXZlIGFscmVhZHkgc3RhcnRlZAotICAgICAgICogd2l0aCB0aGUgaW1hZ2UgYW5kIHdlIHNob3VsZCBoYXZlIGFsbG9jYXRlZCBhbGwgb2YgdGhlIGZpbHRlciBidWZmZXJzCi0gICAgICAgKiB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZC4gIElmIHByZXZfcm93IGlzbid0IGFscmVhZHkgYWxsb2NhdGVkLCB0aGVuCi0gICAgICAgKiBpdCBpcyB0b28gbGF0ZSB0byBzdGFydCB1c2luZyB0aGUgZmlsdGVycyB0aGF0IG5lZWQgaXQsIHNpbmNlIHdlCi0gICAgICAgKiB3aWxsIGJlIG1pc3NpbmcgdGhlIGRhdGEgaW4gdGhlIHByZXZpb3VzIHJvdy4gIElmIGFuIGFwcGxpY2F0aW9uCi0gICAgICAgKiB3YW50cyB0byBzdGFydCBhbmQgc3RvcCB1c2luZyBwYXJ0aWN1bGFyIGZpbHRlcnMgZHVyaW5nIGNvbXByZXNzaW9uLAotICAgICAgICogaXQgc2hvdWxkIHN0YXJ0IG91dCB3aXRoIGFsbCBvZiB0aGUgZmlsdGVycywgYW5kIHRoZW4gYWRkIGFuZAotICAgICAgICogcmVtb3ZlIHRoZW0gYWZ0ZXIgdGhlIHN0YXJ0IG9mIGNvbXByZXNzaW9uLgotICAgICAgICovCi0gICAgICBpZiAocG5nX3B0ci0+cm93X2J1ZiAhPSBOVUxMKQotICAgICAgewotI2lmbmRlZiBQTkdfTk9fV1JJVEVfRklMVEVSCi0gICAgICAgICBpZiAoKHBuZ19wdHItPmRvX2ZpbHRlciAmIFBOR19GSUxURVJfU1VCKSAmJiBwbmdfcHRyLT5zdWJfcm93ID09IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfcHRyLT5zdWJfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgICAgIChwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsKLSAgICAgICAgICAgIHBuZ19wdHItPnN1Yl9yb3dbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX1NVQjsKLSAgICAgICAgIH0KLQotICAgICAgICAgaWYgKChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX1VQKSAmJiBwbmdfcHRyLT51cF9yb3cgPT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X3JvdyA9PSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkNhbid0IGFkZCBVcCBmaWx0ZXIgYWZ0ZXIgc3RhcnRpbmciKTsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciAmPSB+UE5HX0ZJTFRFUl9VUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPnVwX3JvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgKHBuZ19wdHItPnJvd2J5dGVzICsgMSkpOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+dXBfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9VUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgaWYgKChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX0FWRykgJiYgcG5nX3B0ci0+YXZnX3JvdyA9PSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfcm93ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiQ2FuJ3QgYWRkIEF2ZXJhZ2UgZmlsdGVyIGFmdGVyIHN0YXJ0aW5nIik7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgJj0gflBOR19GSUxURVJfQVZHOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3B0ci0+YXZnX3JvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgKHBuZ19wdHItPnJvd2J5dGVzICsgMSkpOwotICAgICAgICAgICAgICAgcG5nX3B0ci0+YXZnX3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfQVZHOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBpZiAoKHBuZ19wdHItPmRvX2ZpbHRlciAmIFBOR19GSUxURVJfUEFFVEgpICYmCi0gICAgICAgICAgICAgcG5nX3B0ci0+cGFldGhfcm93ID09IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9yb3cgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJDYW4ndCBhZGQgUGFldGggZmlsdGVyIGFmdGVyIHN0YXJ0aW5nIik7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5kb19maWx0ZXIgJj0gKHBuZ19ieXRlKSh+UE5HX0ZJTFRFUl9QQUVUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfcHRyLT5wYWV0aF9yb3cgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgIChwbmdfcHRyLT5yb3dieXRlcyArIDEpKTsKLSAgICAgICAgICAgICAgIHBuZ19wdHItPnBhZXRoX3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfUEFFVEg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmIChwbmdfcHRyLT5kb19maWx0ZXIgPT0gUE5HX05PX0ZJTFRFUlMpCi0jZW5kaWYgLyogUE5HX05PX1dSSVRFX0ZJTFRFUiAqLwotICAgICAgICAgICAgcG5nX3B0ci0+ZG9fZmlsdGVyID0gUE5HX0ZJTFRFUl9OT05FOwotICAgICAgfQotICAgfQotICAgZWxzZQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJVbmtub3duIGN1c3RvbSBmaWx0ZXIgbWV0aG9kIik7Ci19Ci0KLS8qIFRoaXMgYWxsb3dzIHVzIHRvIGluZmx1ZW5jZSB0aGUgd2F5IGluIHdoaWNoIGxpYnBuZyBjaG9vc2VzIHRoZSAiYmVzdCIKLSAqIGZpbHRlciBmb3IgdGhlIGN1cnJlbnQgc2NhbmxpbmUuICBXaGlsZSB0aGUgIm1pbmltdW0tc3VtLW9mLWFic29sdXRlLQotICogZGlmZmVyZW5jZXMgbWV0cmljIGlzIHJlbGF0aXZlbHkgZmFzdCBhbmQgZWZmZWN0aXZlLCB0aGVyZSBpcyBzb21lCi0gKiBxdWVzdGlvbiBhcyB0byB3aGV0aGVyIGl0IGNhbiBiZSBpbXByb3ZlZCB1cG9uIGJ5IHRyeWluZyB0byBrZWVwIHRoZQotICogZmlsdGVyZWQgZGF0YSBnb2luZyB0byB6bGliIG1vcmUgY29uc2lzdGVudCwgaG9wZWZ1bGx5IHJlc3VsdGluZyBpbgotICogYmV0dGVyIGNvbXByZXNzaW9uLgotICovCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCkgICAgICAvKiBHUlIgOTcwMTE2ICovCi12b2lkIFBOR0FQSQotcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgaGV1cmlzdGljX21ldGhvZCwKLSAgIGludCBudW1fd2VpZ2h0cywgcG5nX2RvdWJsZXAgZmlsdGVyX3dlaWdodHMsCi0gICBwbmdfZG91YmxlcCBmaWx0ZXJfY29zdHMpCi17Ci0gICBpbnQgaTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKGhldXJpc3RpY19tZXRob2QgPj0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfTEFTVCkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIGZpbHRlciBoZXVyaXN0aWMgbWV0aG9kIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChoZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX0RFRkFVTFQpCi0gICB7Ci0gICAgICBoZXVyaXN0aWNfbWV0aG9kID0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfVU5XRUlHSFRFRDsKLSAgIH0KLQotICAgaWYgKG51bV93ZWlnaHRzIDwgMCB8fCBmaWx0ZXJfd2VpZ2h0cyA9PSBOVUxMIHx8Ci0gICAgICBoZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1VOV0VJR0hURUQpCi0gICB7Ci0gICAgICBudW1fd2VpZ2h0cyA9IDA7Ci0gICB9Ci0KLSAgIHBuZ19wdHItPm51bV9wcmV2X2ZpbHRlcnMgPSAocG5nX2J5dGUpbnVtX3dlaWdodHM7Ci0gICBwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID0gKHBuZ19ieXRlKWhldXJpc3RpY19tZXRob2Q7Ci0KLSAgIGlmIChudW1fd2VpZ2h0cyA+IDApCi0gICB7Ci0gICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5wcmV2X2ZpbHRlcnMgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgIChwbmdfdWludF8zMikocG5nX3NpemVvZihwbmdfYnl0ZSkgKiBudW1fd2VpZ2h0cykpOwotCi0gICAgICAgICAvKiBUbyBtYWtlIHN1cmUgdGhhdCB0aGUgd2VpZ2h0aW5nIHN0YXJ0cyBvdXQgZmFpcmx5ICovCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3dlaWdodHM7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19wdHItPnByZXZfZmlsdGVyc1tpXSA9IDI1NTsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0cyA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgKHBuZ191aW50XzMyKShwbmdfc2l6ZW9mKHBuZ191aW50XzE2KSAqIG51bV93ZWlnaHRzKSk7Ci0KLSAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0cyA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgKHBuZ191aW50XzMyKShwbmdfc2l6ZW9mKHBuZ191aW50XzE2KSAqIG51bV93ZWlnaHRzKSk7Ci0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3dlaWdodHM7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tpXSA9Ci0gICAgICAgICAgICBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tpXSA9IFBOR19XRUlHSFRfRkFDVE9SOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3dlaWdodHM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIGlmIChmaWx0ZXJfd2VpZ2h0c1tpXSA8IDAuMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tpXSA9Ci0gICAgICAgICAgICBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tpXSA9IFBOR19XRUlHSFRfRkFDVE9SOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2ldID0KLSAgICAgICAgICAgICAgIChwbmdfdWludF8xNikoKGRvdWJsZSlQTkdfV0VJR0hUX0ZBQ1RPUipmaWx0ZXJfd2VpZ2h0c1tpXSswLjUpOwotICAgICAgICAgICAgcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbaV0gPQotICAgICAgICAgICAgICAgKHBuZ191aW50XzE2KSgoZG91YmxlKVBOR19XRUlHSFRfRkFDVE9SL2ZpbHRlcl93ZWlnaHRzW2ldKzAuNSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIElmLCBpbiB0aGUgZnV0dXJlLCB0aGVyZSBhcmUgb3RoZXIgZmlsdGVyIG1ldGhvZHMsIHRoaXMgd291bGQKLSAgICAqIG5lZWQgdG8gYmUgYmFzZWQgb24gcG5nX3B0ci0+ZmlsdGVyLgotICAgICovCi0gICBpZiAocG5nX3B0ci0+ZmlsdGVyX2Nvc3RzID09IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfcHRyLT5maWx0ZXJfY29zdHMgPSAocG5nX3VpbnRfMTZwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgIChwbmdfdWludF8zMikocG5nX3NpemVvZihwbmdfdWludF8xNikgKiBQTkdfRklMVEVSX1ZBTFVFX0xBU1QpKTsKLQotICAgICAgcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0cyA9IChwbmdfdWludF8xNnApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgKHBuZ191aW50XzMyKShwbmdfc2l6ZW9mKHBuZ191aW50XzE2KSAqIFBOR19GSUxURVJfVkFMVUVfTEFTVCkpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgUE5HX0ZJTFRFUl9WQUxVRV9MQVNUOyBpKyspCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW2ldID0KLSAgICAgICAgIHBuZ19wdHItPmZpbHRlcl9jb3N0c1tpXSA9IFBOR19DT1NUX0ZBQ1RPUjsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogSGVyZSBpcyB3aGVyZSB3ZSBzZXQgdGhlIHJlbGF0aXZlIGNvc3RzIG9mIHRoZSBkaWZmZXJlbnQgZmlsdGVycy4gIFdlCi0gICAgKiBzaG91bGQgdGFrZSB0aGUgZGVzaXJlZCBjb21wcmVzc2lvbiBsZXZlbCBpbnRvIGFjY291bnQgd2hlbiBzZXR0aW5nCi0gICAgKiB0aGUgY29zdHMsIHNvIHRoYXQgUGFldGgsIGZvciBpbnN0YW5jZSwgaGFzIGEgaGlnaCByZWxhdGl2ZSBjb3N0IGF0IGxvdwotICAgICogY29tcHJlc3Npb24gbGV2ZWxzLCB3aGlsZSBpdCBoYXMgYSBsb3dlciByZWxhdGl2ZSBjb3N0IGF0IGhpZ2hlcgotICAgICogY29tcHJlc3Npb24gc2V0dGluZ3MuICBUaGUgZmlsdGVyIHR5cGVzIGFyZSBpbiBvcmRlciBvZiBpbmNyZWFzaW5nCi0gICAgKiByZWxhdGl2ZSBjb3N0LCBzbyBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBkbyB0aGlzIHdpdGggYW4gYWxnb3JpdGhtLgotICAgICovCi0gICBmb3IgKGkgPSAwOyBpIDwgUE5HX0ZJTFRFUl9WQUxVRV9MQVNUOyBpKyspCi0gICB7Ci0gICAgICBpZiAoZmlsdGVyX2Nvc3RzID09IE5VTEwgfHwgZmlsdGVyX2Nvc3RzW2ldIDwgMC4wKQotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tpXSA9Ci0gICAgICAgICBwbmdfcHRyLT5maWx0ZXJfY29zdHNbaV0gPSBQTkdfQ09TVF9GQUNUT1I7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChmaWx0ZXJfY29zdHNbaV0gPj0gMS4wKQotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tpXSA9Ci0gICAgICAgICAgICAocG5nX3VpbnRfMTYpKChkb3VibGUpUE5HX0NPU1RfRkFDVE9SIC8gZmlsdGVyX2Nvc3RzW2ldICsgMC41KTsKLSAgICAgICAgIHBuZ19wdHItPmZpbHRlcl9jb3N0c1tpXSA9Ci0gICAgICAgICAgICAocG5nX3VpbnRfMTYpKChkb3VibGUpUE5HX0NPU1RfRkFDVE9SICogZmlsdGVyX2Nvc3RzW2ldICsgMC41KTsKLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCAqLwotCi12b2lkIFBOR0FQSQotcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbChwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgbGV2ZWwpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwiKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0NVU1RPTV9MRVZFTDsKLSAgIHBuZ19wdHItPnpsaWJfbGV2ZWwgPSBsZXZlbDsKLX0KLQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBtZW1fbGV2ZWwpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWkxJQl9DVVNUT01fTUVNX0xFVkVMOwotICAgcG5nX3B0ci0+emxpYl9tZW1fbGV2ZWwgPSBtZW1fbGV2ZWw7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBzdHJhdGVneSkKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneSIpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIHBuZ19wdHItPmZsYWdzIHw9IFBOR19GTEFHX1pMSUJfQ1VTVE9NX1NUUkFURUdZOwotICAgcG5nX3B0ci0+emxpYl9zdHJhdGVneSA9IHN0cmF0ZWd5OwotfQotCi12b2lkIFBOR0FQSQotcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgd2luZG93X2JpdHMpCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKHdpbmRvd19iaXRzID4gMTUpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT25seSBjb21wcmVzc2lvbiB3aW5kb3dzIDw9IDMyayBzdXBwb3J0ZWQgYnkgUE5HIik7Ci0gICBlbHNlIGlmICh3aW5kb3dfYml0cyA8IDgpCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT25seSBjb21wcmVzc2lvbiB3aW5kb3dzID49IDI1NiBzdXBwb3J0ZWQgYnkgUE5HIik7Ci0jaWZuZGVmIFdCSVRTXzhfT0sKLSAgIC8qIEF2b2lkIGxpYnBuZyBidWcgd2l0aCAyNTYtYnl0ZSB3aW5kb3dzICovCi0gICBpZiAod2luZG93X2JpdHMgPT0gOCkKLSAgICAgewotICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJDb21wcmVzc2lvbiB3aW5kb3cgaXMgYmVpbmcgcmVzZXQgdG8gNTEyIik7Ci0gICAgICAgd2luZG93X2JpdHM9OTsKLSAgICAgfQotI2VuZGlmCi0gICBwbmdfcHRyLT5mbGFncyB8PSBQTkdfRkxBR19aTElCX0NVU1RPTV9XSU5ET1dfQklUUzsKLSAgIHBuZ19wdHItPnpsaWJfd2luZG93X2JpdHMgPSB3aW5kb3dfYml0czsKLX0KLQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCBtZXRob2QpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kIik7Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgaWYgKG1ldGhvZCAhPSA4KQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk9ubHkgY29tcHJlc3Npb24gbWV0aG9kIDggaXMgc3VwcG9ydGVkIGJ5IFBORyIpOwotICAgcG5nX3B0ci0+ZmxhZ3MgfD0gUE5HX0ZMQUdfWkxJQl9DVVNUT01fTUVUSE9EOwotICAgcG5nX3B0ci0+emxpYl9tZXRob2QgPSBtZXRob2Q7Ci19Ci0KLXZvaWQgUE5HQVBJCi1wbmdfc2V0X3dyaXRlX3N0YXR1c19mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfd3JpdGVfc3RhdHVzX3B0ciB3cml0ZV9yb3dfZm4pCi17Ci0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotICAgcG5nX3B0ci0+d3JpdGVfcm93X2ZuID0gd3JpdGVfcm93X2ZuOwotfQotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKQotdm9pZCBQTkdBUEkKLXBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VzZXJfdHJhbnNmb3JtX3B0cgotICAgd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4pCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4iKTsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfD0gUE5HX1VTRVJfVFJBTlNGT1JNOwotICAgcG5nX3B0ci0+d3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4gPSB3cml0ZV91c2VyX3RyYW5zZm9ybV9mbjsKLX0KLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkKFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRCkKLXZvaWQgUE5HQVBJCi1wbmdfd3JpdGVfcG5nKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwKLSAgICAgICAgICAgICAgaW50IHRyYW5zZm9ybXMsIHZvaWRwIHBhcmFtcykKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwgfHwgaW5mb19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSNpZiBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEKQotICAgLyogSW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsIGZyb20gb3BhY2l0eSB0byB0cmFuc3BhcmVuY3kgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfQUxQSEEpCi0gICAgICBwbmdfc2V0X2ludmVydF9hbHBoYShwbmdfcHRyKTsKLSNlbmRpZgotCi0gICAvKiBXcml0ZSB0aGUgZmlsZSBoZWFkZXIgaW5mb3JtYXRpb24uICovCi0gICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgIC8qIC0tLS0tLSB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgZG9uJ3QgdG91Y2ggdGhlIGluZm8gc3RydWN0dXJlIC0tLS0tLS0gKi8KLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQpCi0gICAvKiBJbnZlcnQgbW9ub2Nocm9tZSBwaXhlbHMgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9JTlZFUlRfTU9OTykKLSAgICAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3B0cik7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCkKLSAgIC8qIFNoaWZ0IHRoZSBwaXhlbHMgdXAgdG8gYSBsZWdhbCBiaXQgZGVwdGggYW5kIGZpbGwgaW4KLSAgICAqIGFzIGFwcHJvcHJpYXRlIHRvIGNvcnJlY3RseSBzY2FsZSB0aGUgaW1hZ2UuCi0gICAgKi8KLSAgIGlmICgodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU0hJRlQpCi0gICAgICAgICAgICAgICAmJiAoaW5mb19wdHItPnZhbGlkICYgUE5HX0lORk9fc0JJVCkpCi0gICAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsICZpbmZvX3B0ci0+c2lnX2JpdCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEKQotICAgLyogUGFjayBwaXhlbHMgaW50byBieXRlcyAqLwotICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1BBQ0tJTkcpCi0gICAgICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRCkKLSAgIC8qIFN3YXAgbG9jYXRpb24gb2YgYWxwaGEgYnl0ZXMgZnJvbSBBUkdCIHRvIFJHQkEgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TV0FQX0FMUEhBKQotICAgICAgcG5nX3NldF9zd2FwX2FscGhhKHBuZ19wdHIpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKQotICAgLyogUGFjayBYUkdCL1JHQlgvQVJHQi9SR0JBIGludG8gKiBSR0IgKDQgY2hhbm5lbHMgLT4gMyBjaGFubmVscykgKi8KLSAgIGlmICh0cmFuc2Zvcm1zICYgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQUZURVIpCi0gICAgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAwLCBQTkdfRklMTEVSX0FGVEVSKTsKLSAgIGVsc2UgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9CRUZPUkUpCi0gICAgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAwLCBQTkdfRklMTEVSX0JFRk9SRSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpCi0gICAvKiBGbGlwIEJHUiBwaXhlbHMgdG8gUkdCICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fQkdSKQotICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEKQotICAgLyogU3dhcCBieXRlcyBvZiAxNi1iaXQgZmlsZXMgdG8gbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0ICovCi0gICBpZiAodHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4pCi0gICAgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkKLSAgIC8qIFN3YXAgYml0cyBvZiAxLCAyLCA0IGJpdCBwYWNrZWQgcGl4ZWwgZm9ybWF0cyAqLwotICAgaWYgKHRyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1BBQ0tTV0FQKQotICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKLSNlbmRpZgotCi0gICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgb2YgdHJhbnNmb3JtYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgLyogV3JpdGUgdGhlIGJpdHMgKi8KLSAgIGlmIChpbmZvX3B0ci0+dmFsaWQgJiBQTkdfSU5GT19JREFUKQotICAgICAgIHBuZ193cml0ZV9pbWFnZShwbmdfcHRyLCBpbmZvX3B0ci0+cm93X3BvaW50ZXJzKTsKLQotICAgLyogSXQgaXMgUkVRVUlSRUQgdG8gY2FsbCB0aGlzIHRvIGZpbmlzaCB3cml0aW5nIHRoZSByZXN0IG9mIHRoZSBmaWxlICovCi0gICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgdHJhbnNmb3JtcyA9IHRyYW5zZm9ybXM7IC8qIFF1aWV0IGNvbXBpbGVyIHdhcm5pbmdzICovCi0gICBwYXJhbXMgPSBwYXJhbXM7Ci19Ci0jZW5kaWYKLSNlbmRpZiAvKiBQTkdfV1JJVEVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wbmd3dHJhbi5jIGIvbGlicy9saWJwbmcvcG5nd3RyYW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1NjMzOS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wbmd3dHJhbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcyICswLDAgQEAKLQotLyogcG5nd3RyYW4uYyAtIHRyYW5zZm9ybXMgdGhlIGRhdGEgaW4gYSByb3cgZm9yIFBORyB3cml0ZXJzCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjIuMzcgW0p1bmUgNCwgMjAwOV0KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKLSAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKLSAqLwotCi0jZGVmaW5lIFBOR19JTlRFUk5BTAotI2luY2x1ZGUgInBuZy5oIgotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLQotLyogVHJhbnNmb3JtIHRoZSBkYXRhIGFjY29yZGluZyB0byB0aGUgdXNlcidzIHdpc2hlcy4gIFRoZSBvcmRlciBvZgotICogdHJhbnNmb3JtYXRpb25zIGlzIHNpZ25pZmljYW50LgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb193cml0ZV90cmFuc2Zvcm1hdGlvbnMocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX3RyYW5zZm9ybWF0aW9ucyIpOwotCi0gICBpZiAocG5nX3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19VU0VSX1RSQU5TRk9STSkKLSAgICAgIGlmIChwbmdfcHRyLT53cml0ZV91c2VyX3RyYW5zZm9ybV9mbiAhPSBOVUxMKQotICAgICAgICAoKihwbmdfcHRyLT53cml0ZV91c2VyX3RyYW5zZm9ybV9mbikpIC8qIFVzZXIgd3JpdGUgdHJhbnNmb3JtIGZ1bmN0aW9uICovCi0gICAgICAgICAgKHBuZ19wdHIsICAgICAgICAgICAgICAgICAgICAvKiBwbmdfcHRyICovCi0gICAgICAgICAgICYocG5nX3B0ci0+cm93X2luZm8pLCAgICAgICAvKiByb3dfaW5mbzogICAgICovCi0gICAgICAgICAgICAgLyogIHBuZ191aW50XzMyIHdpZHRoOyAgICAgICAgICB3aWR0aCBvZiByb3cgKi8KLSAgICAgICAgICAgICAvKiAgcG5nX3VpbnRfMzIgcm93Ynl0ZXM7ICAgICAgIG51bWJlciBvZiBieXRlcyBpbiByb3cgKi8KLSAgICAgICAgICAgICAvKiAgcG5nX2J5dGUgY29sb3JfdHlwZTsgICAgICAgIGNvbG9yIHR5cGUgb2YgcGl4ZWxzICovCi0gICAgICAgICAgICAgLyogIHBuZ19ieXRlIGJpdF9kZXB0aDsgICAgICAgICBiaXQgZGVwdGggb2Ygc2FtcGxlcyAqLwotICAgICAgICAgICAgIC8qICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzICgxLTQpICovCi0gICAgICAgICAgICAgLyogIHBuZ19ieXRlIHBpeGVsX2RlcHRoOyAgICAgICBiaXRzIHBlciBwaXhlbCAoZGVwdGgqY2hhbm5lbHMpICovCi0gICAgICAgICAgIHBuZ19wdHItPnJvd19idWYgKyAxKTsgICAgICAvKiBzdGFydCBvZiBwaXhlbCBkYXRhIGZvciByb3cgKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0ZJTExFUikKLSAgICAgIHBuZ19kb19zdHJpcF9maWxsZXIoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgcG5nX3B0ci0+ZmxhZ3MpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19QQUNLU1dBUCkKLSAgICAgIHBuZ19kb19wYWNrc3dhcCgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1BBQ0spCi0gICAgICBwbmdfZG9fcGFjaygmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEsCi0gICAgICAgICAocG5nX3VpbnRfMzIpcG5nX3B0ci0+Yml0X2RlcHRoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1NXQVBfU1VQUE9SVEVEKQotICAgaWYgKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19TV0FQX0JZVEVTKQotICAgICAgcG5nX2RvX3N3YXAoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1NISUZUX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfU0hJRlQpCi0gICAgICBwbmdfZG9fc2hpZnQoJihwbmdfcHRyLT5yb3dfaW5mbyksIHBuZ19wdHItPnJvd19idWYgKyAxLAotICAgICAgICAgJihwbmdfcHRyLT5zaGlmdCkpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQpCi0gICBpZiAocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX1NXQVBfQUxQSEEpCi0gICAgICBwbmdfZG9fd3JpdGVfc3dhcF9hbHBoYSgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX0FMUEhBKQotICAgICAgcG5nX2RvX3dyaXRlX2ludmVydF9hbHBoYSgmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfQkdSKQotICAgICAgcG5nX2RvX2JncigmKHBuZ19wdHItPnJvd19pbmZvKSwgcG5nX3B0ci0+cm93X2J1ZiArIDEpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkKLSAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5WRVJUX01PTk8pCi0gICAgICBwbmdfZG9faW52ZXJ0KCYocG5nX3B0ci0+cm93X2luZm8pLCBwbmdfcHRyLT5yb3dfYnVmICsgMSk7Ci0jZW5kaWYKLX0KLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEKQotLyogUGFjayBwaXhlbHMgaW50byBieXRlcy4gIFBhc3MgdGhlIHRydWUgYml0IGRlcHRoIGluIGJpdF9kZXB0aC4gIFRoZQotICogcm93X2luZm8gYml0IGRlcHRoIHNob3VsZCBiZSA4IChvbmUgcGl4ZWwgcGVyIGJ5dGUpLiAgVGhlIGNoYW5uZWxzCi0gKiBzaG91bGQgYmUgMSAodGhpcyBvbmx5IGhhcHBlbnMgb24gZ3JheXNjYWxlIGFuZCBwYWxldHRlZCBpbWFnZXMpLgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb19wYWNrKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ191aW50XzMyIGJpdF9kZXB0aCkKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3BhY2siKTsKLSAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDggJiYKLSNpZiBkZWZpbmVkKFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRCkKLSAgICAgICByb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMICYmCi0jZW5kaWYKLSAgICAgIHJvd19pbmZvLT5jaGFubmVscyA9PSAxKQotICAgewotICAgICAgc3dpdGNoICgoaW50KWJpdF9kZXB0aCkKLSAgICAgIHsKLSAgICAgICAgIGNhc2UgMToKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICAgICAgICAgICBpbnQgbWFzaywgdjsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICBtYXNrID0gMHg4MDsKLSAgICAgICAgICAgIHYgPSAwOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoKnNwICE9IDApCi0gICAgICAgICAgICAgICAgICB2IHw9IG1hc2s7Ci0gICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgICAgaWYgKG1hc2sgPiAxKQotICAgICAgICAgICAgICAgICAgbWFzayA+Pj0gMTsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG1hc2sgPSAweDgwOwotICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7Ci0gICAgICAgICAgICAgICAgICBkcCsrOwotICAgICAgICAgICAgICAgICAgdiA9IDA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWFzayAhPSAweDgwKQotICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICAgICAgICAgICBpbnQgc2hpZnQsIHY7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotCi0gICAgICAgICAgICBzcCA9IHJvdzsKLSAgICAgICAgICAgIGRwID0gcm93OwotICAgICAgICAgICAgc2hpZnQgPSA2OwotICAgICAgICAgICAgdiA9IDA7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93X3dpZHRoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZSB2YWx1ZTsKLQotICAgICAgICAgICAgICAgdmFsdWUgPSAocG5nX2J5dGUpKCpzcCAmIDB4MDMpOwotICAgICAgICAgICAgICAgdiB8PSAodmFsdWUgPDwgc2hpZnQpOwotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7Ci0gICAgICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpdjsKLSAgICAgICAgICAgICAgICAgIGRwKys7Ci0gICAgICAgICAgICAgICAgICB2ID0gMDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNoaWZ0IC09IDI7Ci0gICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNoaWZ0ICE9IDYpCi0gICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSA0OgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKLSAgICAgICAgICAgIGludCBzaGlmdCwgdjsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgICAgICAgICAgIHNwID0gcm93OwotICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICBzaGlmdCA9IDQ7Ci0gICAgICAgICAgICB2ID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIHZhbHVlOwotCi0gICAgICAgICAgICAgICB2YWx1ZSA9IChwbmdfYnl0ZSkoKnNwICYgMHgwZik7Ci0gICAgICAgICAgICAgICB2IHw9ICh2YWx1ZSA8PCBzaGlmdCk7Ci0KLSAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2hpZnQgPSA0OwotICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKXY7Ci0gICAgICAgICAgICAgICAgICBkcCsrOwotICAgICAgICAgICAgICAgICAgdiA9IDA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzaGlmdCAtPSA0OwotCi0gICAgICAgICAgICAgICBzcCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNoaWZ0ICE9IDQpCi0gICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgcm93X2luZm8tPmJpdF9kZXB0aCA9IChwbmdfYnl0ZSliaXRfZGVwdGg7Ci0gICAgICByb3dfaW5mby0+cGl4ZWxfZGVwdGggPSAocG5nX2J5dGUpKGJpdF9kZXB0aCAqIHJvd19pbmZvLT5jaGFubmVscyk7Ci0gICAgICByb3dfaW5mby0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocm93X2luZm8tPnBpeGVsX2RlcHRoLAotICAgICAgICAgcm93X2luZm8tPndpZHRoKTsKLSAgIH0KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEKQotLyogU2hpZnQgcGl4ZWwgdmFsdWVzIHRvIHRha2UgYWR2YW50YWdlIG9mIHdob2xlIHJhbmdlLiAgUGFzcyB0aGUKLSAqIHRydWUgbnVtYmVyIG9mIGJpdHMgaW4gYml0X2RlcHRoLiAgVGhlIHJvdyBzaG91bGQgYmUgcGFja2VkCi0gKiBhY2NvcmRpbmcgdG8gcm93X2luZm8tPmJpdF9kZXB0aC4gIFRodXMsIGlmIHlvdSBoYWQgYSByb3cgb2YKLSAqIGJpdCBkZXB0aCA0LCBidXQgdGhlIHBpeGVscyBvbmx5IGhhZCB2YWx1ZXMgZnJvbSAwIHRvIDcsIHlvdQotICogd291bGQgcGFzcyAzIGFzIGJpdF9kZXB0aCwgYW5kIHRoaXMgcm91dGluZSB3b3VsZCB0cmFuc2xhdGUgdGhlCi0gKiBkYXRhIHRvIDAgdG8gMTUuCi0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3NoaWZ0KHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb2xvcl84cCBiaXRfZGVwdGgpCi17Ci0gICBwbmdfZGVidWcoMSwgImluIHBuZ19kb19zaGlmdCIpOwotI2lmIGRlZmluZWQoUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVEKQotICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYKLSNlbHNlCi0gICBpZiAoCi0jZW5kaWYKLSAgICAgIHJvd19pbmZvLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICB7Ci0gICAgICBpbnQgc2hpZnRfc3RhcnRbNF0sIHNoaWZ0X2RlY1s0XTsKLSAgICAgIGludCBjaGFubmVscyA9IDA7Ci0KLSAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgICAgewotICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+cmVkOwotICAgICAgICAgc2hpZnRfZGVjW2NoYW5uZWxzXSA9IGJpdF9kZXB0aC0+cmVkOwotICAgICAgICAgY2hhbm5lbHMrKzsKLSAgICAgICAgIHNoaWZ0X3N0YXJ0W2NoYW5uZWxzXSA9IHJvd19pbmZvLT5iaXRfZGVwdGggLSBiaXRfZGVwdGgtPmdyZWVuOwotICAgICAgICAgc2hpZnRfZGVjW2NoYW5uZWxzXSA9IGJpdF9kZXB0aC0+Z3JlZW47Ci0gICAgICAgICBjaGFubmVscysrOwotICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+Ymx1ZTsKLSAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmJsdWU7Ci0gICAgICAgICBjaGFubmVscysrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgc2hpZnRfc3RhcnRbY2hhbm5lbHNdID0gcm93X2luZm8tPmJpdF9kZXB0aCAtIGJpdF9kZXB0aC0+Z3JheTsKLSAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmdyYXk7Ci0gICAgICAgICBjaGFubmVscysrOwotICAgICAgfQotICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICBzaGlmdF9zdGFydFtjaGFubmVsc10gPSByb3dfaW5mby0+Yml0X2RlcHRoIC0gYml0X2RlcHRoLT5hbHBoYTsKLSAgICAgICAgIHNoaWZ0X2RlY1tjaGFubmVsc10gPSBiaXRfZGVwdGgtPmFscGhhOwotICAgICAgICAgY2hhbm5lbHMrKzsKLSAgICAgIH0KLQotICAgICAgLyogV2l0aCBsb3cgcm93IGRlcHRocywgY291bGQgb25seSBiZSBncmF5c2NhbGUsIHNvIG9uZSBjaGFubmVsICovCi0gICAgICBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA8IDgpCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgYnAgPSByb3c7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgcG5nX2J5dGUgbWFzazsKLSAgICAgICAgIHBuZ191aW50XzMyIHJvd19ieXRlcyA9IHJvd19pbmZvLT5yb3dieXRlczsKLQotICAgICAgICAgaWYgKGJpdF9kZXB0aC0+Z3JheSA9PSAxICYmIHJvd19pbmZvLT5iaXRfZGVwdGggPT0gMikKLSAgICAgICAgICAgIG1hc2sgPSAweDU1OwotICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmJpdF9kZXB0aCA9PSA0ICYmIGJpdF9kZXB0aC0+Z3JheSA9PSAzKQotICAgICAgICAgICAgbWFzayA9IDB4MTE7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXNrID0gMHhmZjsKLQotICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd19ieXRlczsgaSsrLCBicCsrKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKLSAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICB2ID0gKmJwOwotICAgICAgICAgICAgKmJwID0gMDsKLSAgICAgICAgICAgIGZvciAoaiA9IHNoaWZ0X3N0YXJ0WzBdOyBqID4gLXNoaWZ0X2RlY1swXTsgaiAtPSBzaGlmdF9kZWNbMF0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoaiA+IDApCi0gICAgICAgICAgICAgICAgICAqYnAgfD0gKHBuZ19ieXRlKSgodiA8PCBqKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgKmJwIHw9IChwbmdfYnl0ZSkoKHYgPj4gKC1qKSkgJiBtYXNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19ieXRlcCBicCA9IHJvdzsKLSAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICBwbmdfdWludF8zMiBpc3RvcCA9IGNoYW5uZWxzICogcm93X2luZm8tPndpZHRoOwotCi0gICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0b3A7IGkrKywgYnArKykKLSAgICAgICAgIHsKLQotICAgICAgICAgICAgcG5nX3VpbnRfMTYgdjsKLSAgICAgICAgICAgIGludCBqOwotICAgICAgICAgICAgaW50IGMgPSAoaW50KShpJWNoYW5uZWxzKTsKLQotICAgICAgICAgICAgdiA9ICpicDsKLSAgICAgICAgICAgICpicCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGogPSBzaGlmdF9zdGFydFtjXTsgaiA+IC1zaGlmdF9kZWNbY107IGogLT0gc2hpZnRfZGVjW2NdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGogPiAwKQotICAgICAgICAgICAgICAgICAgKmJwIHw9IChwbmdfYnl0ZSkoKHYgPDwgaikgJiAweGZmKTsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICpicCB8PSAocG5nX2J5dGUpKCh2ID4+ICgtaikpICYgMHhmZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgYnA7Ci0gICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgcG5nX3VpbnRfMzIgaXN0b3AgPSBjaGFubmVscyAqIHJvd19pbmZvLT53aWR0aDsKLQotICAgICAgICAgZm9yIChicCA9IHJvdywgaSA9IDA7IGkgPCBpc3RvcDsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICAgaW50IGMgPSAoaW50KShpJWNoYW5uZWxzKTsKLSAgICAgICAgICAgIHBuZ191aW50XzE2IHZhbHVlLCB2OwotICAgICAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgICAgIHYgPSAocG5nX3VpbnRfMTYpKCgocG5nX3VpbnRfMTYpKCpicCkgPDwgOCkgKyAqKGJwICsgMSkpOwotICAgICAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICAgICAgZm9yIChqID0gc2hpZnRfc3RhcnRbY107IGogPiAtc2hpZnRfZGVjW2NdOyBqIC09IHNoaWZ0X2RlY1tjXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChqID4gMCkKLSAgICAgICAgICAgICAgICAgIHZhbHVlIHw9IChwbmdfdWludF8xNikoKHYgPDwgaikgJiAocG5nX3VpbnRfMTYpMHhmZmZmKTsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHZhbHVlIHw9IChwbmdfdWludF8xNikoKHYgPj4gKC1qKSkgJiAocG5nX3VpbnRfMTYpMHhmZmZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpicCsrID0gKHBuZ19ieXRlKSh2YWx1ZSA+PiA4KTsKLSAgICAgICAgICAgICpicCsrID0gKHBuZ19ieXRlKSh2YWx1ZSAmIDB4ZmYpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRCkKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3dyaXRlX3N3YXBfYWxwaGEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX3N3YXBfYWxwaGEiKTsKLSNpZiBkZWZpbmVkKFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRCkKLSAgIGlmIChyb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMKQotI2VuZGlmCi0gICB7Ci0gICAgICBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgewotICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEFSR0IgdG8gUkdCQSAqLwotICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gc2F2ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIC8qIFRoaXMgY29udmVydHMgZnJvbSBBQVJSR0dCQiB0byBSUkdHQkJBQSAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmVbMl07Ci0gICAgICAgICAgICAgICBzYXZlWzBdID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgIHNhdmVbMV0gPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9IHNhdmVbMF07Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gc2F2ZVsxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGNvbnZlcnRzIGZyb20gQUcgdG8gR0EgKi8KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLQotICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgc2F2ZSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgLyogVGhpcyBjb252ZXJ0cyBmcm9tIEFBR0cgdG8gR0dBQSAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIHNhdmVbMl07Ci0gICAgICAgICAgICAgICBzYXZlWzBdID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgIHNhdmVbMV0gPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSBzYXZlWzBdOwotICAgICAgICAgICAgICAgKihkcCsrKSA9IHNhdmVbMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQpCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ19kb193cml0ZV9pbnZlcnRfYWxwaGEocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX2ludmVydF9hbHBoYSIpOwotI2lmIGRlZmluZWQoUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVEKQotICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwpCi0jZW5kaWYKLSAgIHsKLSAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gUkdCQSAqLwotICAgICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcCwgZHA7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogRG9lcyBub3RoaW5nCi0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgc3ArPTM7IGRwID0gc3A7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBSUkdHQkJBQSAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHNwLCBkcDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDAsIHNwID0gZHAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIERvZXMgbm90aGluZwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIHNwKz02OyBkcCA9IHNwOwotICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoMjU1IC0gKihzcCsrKSk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGludmVydHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gR0EgKi8KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLQotICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgKihkcCsrKSA9ICooc3ArKyk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIC8qIFRoaXMgaW52ZXJ0cyB0aGUgYWxwaGEgY2hhbm5lbCBpbiBHR0FBICovCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3AsIGRwOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLQotICAgICAgICAgICAgZm9yIChpID0gMCwgc3AgPSBkcCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogRG9lcyBub3RoaW5nCi0gICAgICAgICAgICAgICAqKGRwKyspID0gKihzcCsrKTsKLSAgICAgICAgICAgICAgICooZHArKykgPSAqKHNwKyspOwotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIHNwKz0yOyBkcCA9IHNwOwotICAgICAgICAgICAgICAgKihkcCsrKSA9IChwbmdfYnl0ZSkoMjU1IC0gKihzcCsrKSk7Ci0gICAgICAgICAgICAgICAqKGRwKyspID0gKHBuZ19ieXRlKSgyNTUgLSAqKHNwKyspKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCkKLS8qIFVuZG9lcyBpbnRyYXBpeGVsIGRpZmZlcmVuY2luZyAgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX2RvX3dyaXRlX2ludHJhcGl4ZWwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX2ludHJhcGl4ZWwiKTsKLSAgIGlmICgKLSNpZiBkZWZpbmVkKFBOR19VU0VMRVNTX1RFU1RTX1NVUFBPUlRFRCkKLSAgICAgICByb3cgIT0gTlVMTCAmJiByb3dfaW5mbyAhPSBOVUxMICYmCi0jZW5kaWYKLSAgICAgICAocm93X2luZm8tPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikpCi0gICB7Ci0gICAgICBpbnQgYnl0ZXNfcGVyX3BpeGVsOwotICAgICAgcG5nX3VpbnRfMzIgcm93X3dpZHRoID0gcm93X2luZm8tPndpZHRoOwotICAgICAgaWYgKHJvd19pbmZvLT5iaXRfZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19ieXRlcCBycDsKLSAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0KLSAgICAgICAgIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgICAgICAgICBieXRlc19wZXJfcGl4ZWwgPSAzOwotICAgICAgICAgZWxzZSBpZiAocm93X2luZm8tPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgICAgYnl0ZXNfcGVyX3BpeGVsID0gNDsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgZm9yIChpID0gMCwgcnAgPSByb3c7IGkgPCByb3dfd2lkdGg7IGkrKywgcnAgKz0gYnl0ZXNfcGVyX3BpeGVsKQotICAgICAgICAgewotICAgICAgICAgICAgKihycCkgICA9IChwbmdfYnl0ZSkoKCpycCAgICAgLSAqKHJwKzEpKSYweGZmKTsKLSAgICAgICAgICAgICoocnArMikgPSAocG5nX2J5dGUpKCgqKHJwKzIpIC0gKihycCsxKSkmMHhmZik7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyb3dfaW5mby0+Yml0X2RlcHRoID09IDE2KQotICAgICAgewotICAgICAgICAgcG5nX2J5dGVwIHJwOwotICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLQotICAgICAgICAgaWYgKHJvd19pbmZvLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKLSAgICAgICAgICAgIGJ5dGVzX3Blcl9waXhlbCA9IDY7Ci0gICAgICAgICBlbHNlIGlmIChyb3dfaW5mby0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICAgICAgICBieXRlc19wZXJfcGl4ZWwgPSA4OwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICBmb3IgKGkgPSAwLCBycCA9IHJvdzsgaSA8IHJvd193aWR0aDsgaSsrLCBycCArPSBieXRlc19wZXJfcGl4ZWwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBzMCAgID0gKCoocnAgICkgPDwgOCkgfCAqKHJwKzEpOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgczEgICA9ICgqKHJwKzIpIDw8IDgpIHwgKihycCszKTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHMyICAgPSAoKihycCs0KSA8PCA4KSB8ICoocnArNSk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByZWQgID0gKHBuZ191aW50XzMyKSgoczAgLSBzMSkgJiAweGZmZmZMKTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGJsdWUgPSAocG5nX3VpbnRfMzIpKChzMiAtIHMxKSAmIDB4ZmZmZkwpOwotICAgICAgICAgICAgKihycCAgKSA9IChwbmdfYnl0ZSkoKHJlZCA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgKihycCsxKSA9IChwbmdfYnl0ZSkocmVkICYgMHhmZik7Ci0gICAgICAgICAgICAqKHJwKzQpID0gKHBuZ19ieXRlKSgoYmx1ZSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgKihycCs1KSA9IChwbmdfYnl0ZSkoYmx1ZSAmIDB4ZmYpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotI2VuZGlmIC8qIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcG5nd3V0aWwuYyBiL2xpYnMvbGlicG5nL3BuZ3d1dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYTgzY2MuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcG5nd3V0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ODggKzAsMCBAQAotCi0vKiBwbmd3dXRpbC5jIC0gdXRpbGl0aWVzIHRvIHdyaXRlIGEgUE5HIGZpbGUKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuMi4zNiBbSnVuZSA0LCAyMDA5XQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQotICovCi0KLSNkZWZpbmUgUE5HX0lOVEVSTkFMCi0jaW5jbHVkZSAicG5nLmgiCi0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRAotCi0vKiBQbGFjZSBhIDMyLWJpdCBudW1iZXIgaW50byBhIGJ1ZmZlciBpbiBQTkcgYnl0ZSBvcmRlci4gIFdlIHdvcmsKLSAqIHdpdGggdW5zaWduZWQgbnVtYmVycyBmb3IgY29udmVuaWVuY2UsIGFsdGhvdWdoIG9uZSBzdXBwb3J0ZWQKLSAqIGFuY2lsbGFyeSBjaHVuayB1c2VzIHNpZ25lZCAodHdvJ3MgY29tcGxlbWVudCkgbnVtYmVycy4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ19zYXZlX3VpbnRfMzIocG5nX2J5dGVwIGJ1ZiwgcG5nX3VpbnRfMzIgaSkKLXsKLSAgIGJ1ZlswXSA9IChwbmdfYnl0ZSkoKGkgPj4gMjQpICYgMHhmZik7Ci0gICBidWZbMV0gPSAocG5nX2J5dGUpKChpID4+IDE2KSAmIDB4ZmYpOwotICAgYnVmWzJdID0gKHBuZ19ieXRlKSgoaSA+PiA4KSAmIDB4ZmYpOwotICAgYnVmWzNdID0gKHBuZ19ieXRlKShpICYgMHhmZik7Ci19Ci0KLS8qIFRoZSBwbmdfc2F2ZV9pbnRfMzIgZnVuY3Rpb24gYXNzdW1lcyBpbnRlZ2VycyBhcmUgc3RvcmVkIGluIHR3bydzCi0gKiBjb21wbGVtZW50IGZvcm1hdC4gIElmIHRoaXMgaXNuJ3QgdGhlIGNhc2UsIHRoZW4gdGhpcyByb3V0aW5lIG5lZWRzIHRvCi0gKiBiZSBtb2RpZmllZCB0byB3cml0ZSBkYXRhIGluIHR3bydzIGNvbXBsZW1lbnQgZm9ybWF0LgotICovCi12b2lkIFBOR0FQSQotcG5nX3NhdmVfaW50XzMyKHBuZ19ieXRlcCBidWYsIHBuZ19pbnRfMzIgaSkKLXsKLSAgIGJ1ZlswXSA9IChwbmdfYnl0ZSkoKGkgPj4gMjQpICYgMHhmZik7Ci0gICBidWZbMV0gPSAocG5nX2J5dGUpKChpID4+IDE2KSAmIDB4ZmYpOwotICAgYnVmWzJdID0gKHBuZ19ieXRlKSgoaSA+PiA4KSAmIDB4ZmYpOwotICAgYnVmWzNdID0gKHBuZ19ieXRlKShpICYgMHhmZik7Ci19Ci0KLS8qIFBsYWNlIGEgMTYtYml0IG51bWJlciBpbnRvIGEgYnVmZmVyIGluIFBORyBieXRlIG9yZGVyLgotICogVGhlIHBhcmFtZXRlciBpcyBkZWNsYXJlZCB1bnNpZ25lZCBpbnQsIG5vdCBwbmdfdWludF8xNiwKLSAqIGp1c3QgdG8gYXZvaWQgcG90ZW50aWFsIHByb2JsZW1zIG9uIHByZS1BTlNJIEMgY29tcGlsZXJzLgotICovCi12b2lkIFBOR0FQSQotcG5nX3NhdmVfdWludF8xNihwbmdfYnl0ZXAgYnVmLCB1bnNpZ25lZCBpbnQgaSkKLXsKLSAgIGJ1ZlswXSA9IChwbmdfYnl0ZSkoKGkgPj4gOCkgJiAweGZmKTsKLSAgIGJ1ZlsxXSA9IChwbmdfYnl0ZSkoaSAmIDB4ZmYpOwotfQotCi0vKiBTaW1wbGUgZnVuY3Rpb24gdG8gd3JpdGUgdGhlIHNpZ25hdHVyZS4gIElmIHdlIGhhdmUgYWxyZWFkeSB3cml0dGVuCi0gKiB0aGUgbWFnaWMgYnl0ZXMgb2YgdGhlIHNpZ25hdHVyZSwgb3IgbW9yZSBsaWtlbHksIHRoZSBQTkcgc3RyZWFtIGlzCi0gKiBiZWluZyBlbWJlZGRlZCBpbnRvIGFub3RoZXIgc3RyZWFtIGFuZCBkb2Vzbid0IG5lZWQgaXRzIG93biBzaWduYXR1cmUsCi0gKiB3ZSBzaG91bGQgY2FsbCBwbmdfc2V0X3NpZ19ieXRlcygpIHRvIHRlbGwgbGlicG5nIGhvdyBtYW55IG9mIHRoZQotICogYnl0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfc2lnKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBwbmdfYnl0ZSBwbmdfc2lnbmF0dXJlWzhdID0gezEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTB9OwotCi0gICAvKiBXcml0ZSB0aGUgcmVzdCBvZiB0aGUgOCBieXRlIHNpZ25hdHVyZSAqLwotICAgcG5nX3dyaXRlX2RhdGEocG5nX3B0ciwgJnBuZ19zaWduYXR1cmVbcG5nX3B0ci0+c2lnX2J5dGVzXSwKLSAgICAgIChwbmdfc2l6ZV90KSg4IC0gcG5nX3B0ci0+c2lnX2J5dGVzKSk7Ci0gICBpZiAocG5nX3B0ci0+c2lnX2J5dGVzIDwgMykKLSAgICAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUE5HX1NJR05BVFVSRTsKLX0KLQotLyogV3JpdGUgYSBQTkcgY2h1bmsgYWxsIGF0IG9uY2UuICBUaGUgdHlwZSBpcyBhbiBhcnJheSBvZiBBU0NJSSBjaGFyYWN0ZXJzCi0gKiByZXByZXNlbnRpbmcgdGhlIGNodW5rIG5hbWUuICBUaGUgYXJyYXkgbXVzdCBiZSBhdCBsZWFzdCA0IGJ5dGVzIGluCi0gKiBsZW5ndGgsIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIG51bGwgdGVybWluYXRlZC4gIFRvIGJlIHNhZmUsIHBhc3MgdGhlCi0gKiBwcmUtZGVmaW5lZCBjaHVuayBuYW1lcyBoZXJlLCBhbmQgaWYgeW91IG5lZWQgYSBuZXcgb25lLCBkZWZpbmUgaXQKLSAqIHdoZXJlIHRoZSBvdGhlcnMgYXJlIGRlZmluZWQuICBUaGUgbGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEuCi0gKiBBbGwgdGhlIGRhdGEgbXVzdCBiZSBwcmVzZW50LiAgSWYgdGhhdCBpcyBub3QgcG9zc2libGUsIHVzZSB0aGUKLSAqIHBuZ193cml0ZV9jaHVua19zdGFydCgpLCBwbmdfd3JpdGVfY2h1bmtfZGF0YSgpLCBhbmQgcG5nX3dyaXRlX2NodW5rX2VuZCgpCi0gKiBmdW5jdGlvbnMgaW5zdGVhZC4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ193cml0ZV9jaHVuayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgY2h1bmtfbmFtZSwKLSAgIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm47Ci0gICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3B0ciwgY2h1bmtfbmFtZSwgKHBuZ191aW50XzMyKWxlbmd0aCk7Ci0gICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBkYXRhLCAocG5nX3NpemVfdClsZW5ndGgpOwotICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKLX0KLQotLyogV3JpdGUgdGhlIHN0YXJ0IG9mIGEgUE5HIGNodW5rLiAgVGhlIHR5cGUgaXMgdGhlIGNodW5rIHR5cGUuCi0gKiBUaGUgdG90YWxfbGVuZ3RoIGlzIHRoZSBzdW0gb2YgdGhlIGxlbmd0aHMgb2YgYWxsIHRoZSBkYXRhIHlvdSB3aWxsIGJlCi0gKiBwYXNzaW5nIGluIHBuZ193cml0ZV9jaHVua19kYXRhKCkuCi0gKi8KLXZvaWQgUE5HQVBJCi1wbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGNodW5rX25hbWUsCi0gICBwbmdfdWludF8zMiBsZW5ndGgpCi17Ci0gICBwbmdfYnl0ZSBidWZbOF07Ci0KLSAgIHBuZ19kZWJ1ZzIoMCwgIldyaXRpbmcgJXMgY2h1bmssIGxlbmd0aCA9ICVsdSIsIGNodW5rX25hbWUsCi0gICAgICAodW5zaWduZWQgbG9uZylsZW5ndGgpOwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLQotICAgLyogV3JpdGUgdGhlIGxlbmd0aCBhbmQgdGhlIGNodW5rIG5hbWUgKi8KLSAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmLCBsZW5ndGgpOwotICAgcG5nX21lbWNweShidWYgKyA0LCBjaHVua19uYW1lLCA0KTsKLSAgIHBuZ193cml0ZV9kYXRhKHBuZ19wdHIsIGJ1ZiwgKHBuZ19zaXplX3QpOCk7Ci0gICAvKiBQdXQgdGhlIGNodW5rIG5hbWUgaW50byBwbmdfcHRyLT5jaHVua19uYW1lICovCi0gICBwbmdfbWVtY3B5KHBuZ19wdHItPmNodW5rX25hbWUsIGNodW5rX25hbWUsIDQpOwotICAgLyogUmVzZXQgdGhlIGNyYyBhbmQgcnVuIGl0IG92ZXIgdGhlIGNodW5rIG5hbWUgKi8KLSAgIHBuZ19yZXNldF9jcmMocG5nX3B0cik7Ci0gICBwbmdfY2FsY3VsYXRlX2NyYyhwbmdfcHRyLCBjaHVua19uYW1lLCAocG5nX3NpemVfdCk0KTsKLX0KLQotLyogV3JpdGUgdGhlIGRhdGEgb2YgYSBQTkcgY2h1bmsgc3RhcnRlZCB3aXRoIHBuZ193cml0ZV9jaHVua19zdGFydCgpLgotICogTm90ZSB0aGF0IG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gYXJlIGFsbG93ZWQsIGFuZCB0aGF0IHRoZQotICogc3VtIG9mIHRoZSBsZW5ndGhzIGZyb20gdGhlc2UgY2FsbHMgKm11c3QqIGFkZCB1cCB0byB0aGUgdG90YWxfbGVuZ3RoCi0gKiBnaXZlbiB0byBwbmdfd3JpdGVfY2h1bmtfc3RhcnQoKS4KLSAqLwotdm9pZCBQTkdBUEkKLXBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIC8qIFdyaXRlIHRoZSBkYXRhLCBhbmQgcnVuIHRoZSBDUkMgb3ZlciBpdCAqLwotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgICAgIHJldHVybjsKLSAgIGlmIChkYXRhICE9IE5VTEwgJiYgbGVuZ3RoID4gMCkKLSAgIHsKLSAgICAgIHBuZ193cml0ZV9kYXRhKHBuZ19wdHIsIGRhdGEsIGxlbmd0aCk7Ci0gICAgICAvKiBVcGRhdGUgdGhlIENSQyBhZnRlciB3cml0aW5nIHRoZSBkYXRhLAotICAgICAgICogaW4gY2FzZSB0aGF0IHRoZSB1c2VyIEkvTyByb3V0aW5lIGFsdGVycyBpdC4KLSAgICAgICAqLwotICAgICAgcG5nX2NhbGN1bGF0ZV9jcmMocG5nX3B0ciwgZGF0YSwgbGVuZ3RoKTsKLSAgIH0KLX0KLQotLyogRmluaXNoIGEgY2h1bmsgc3RhcnRlZCB3aXRoIHBuZ193cml0ZV9jaHVua19zdGFydCgpLiAqLwotdm9pZCBQTkdBUEkKLXBuZ193cml0ZV9jaHVua19lbmQocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIHBuZ19ieXRlIGJ1Zls0XTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkgcmV0dXJuOwotCi0gICAvKiBXcml0ZSB0aGUgY3JjIGluIGEgc2luZ2xlIG9wZXJhdGlvbiAqLwotICAgcG5nX3NhdmVfdWludF8zMihidWYsIHBuZ19wdHItPmNyYyk7Ci0KLSAgIHBuZ193cml0ZV9kYXRhKHBuZ19wdHIsIGJ1ZiwgKHBuZ19zaXplX3QpNCk7Ci19Ci0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9URVhUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfaUNDUF9TVVBQT1JURUQpCi0vKiBUaGlzIHBhaXIgb2YgZnVuY3Rpb25zIGVuY2Fwc3VsYXRlcyB0aGUgb3BlcmF0aW9uIG9mIChhKSBjb21wcmVzc2luZyBhCi0gKiB0ZXh0IHN0cmluZywgYW5kIChiKSBpc3N1aW5nIGl0IGxhdGVyIGFzIGEgc2VyaWVzIG9mIGNodW5rIGRhdGEgd3JpdGVzLgotICogVGhlIGNvbXByZXNzaW9uX3N0YXRlIHN0cnVjdHVyZSBpcyBzaGFyZWQgY29udGV4dCBmb3IgdGhlc2UgZnVuY3Rpb25zCi0gKiBzZXQgdXAgYnkgdGhlIGNhbGxlciBpbiBvcmRlciB0byBtYWtlIHRoZSB3aG9sZSBtZXNzIHRocmVhZC1zYWZlLgotICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICBjaGFyICppbnB1dDsgICAvKiBUaGUgdW5jb21wcmVzc2VkIGlucHV0IGRhdGEgKi8KLSAgIGludCBpbnB1dF9sZW47ICAgLyogSXRzIGxlbmd0aCAqLwotICAgaW50IG51bV9vdXRwdXRfcHRyOyAvKiBOdW1iZXIgb2Ygb3V0cHV0IHBvaW50ZXJzIHVzZWQgKi8KLSAgIGludCBtYXhfb3V0cHV0X3B0cjsgLyogU2l6ZSBvZiBvdXRwdXRfcHRyICovCi0gICBwbmdfY2hhcnBwIG91dHB1dF9wdHI7IC8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIG91dHB1dCAqLwotfSBjb21wcmVzc2lvbl9zdGF0ZTsKLQotLyogQ29tcHJlc3MgZ2l2ZW4gdGV4dCBpbnRvIHN0b3JhZ2UgaW4gdGhlIHBuZ19wdHIgc3RydWN0dXJlICovCi1zdGF0aWMgaW50IC8qIFBSSVZBVEUgKi8KLXBuZ190ZXh0X2NvbXByZXNzKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgIHBuZ19jaGFycCB0ZXh0LCBwbmdfc2l6ZV90IHRleHRfbGVuLCBpbnQgY29tcHJlc3Npb24sCi0gICAgICAgIGNvbXByZXNzaW9uX3N0YXRlICpjb21wKQotewotICAgaW50IHJldDsKLQotICAgY29tcC0+bnVtX291dHB1dF9wdHIgPSAwOwotICAgY29tcC0+bWF4X291dHB1dF9wdHIgPSAwOwotICAgY29tcC0+b3V0cHV0X3B0ciA9IE5VTEw7Ci0gICBjb21wLT5pbnB1dCA9IE5VTEw7Ci0gICBjb21wLT5pbnB1dF9sZW4gPSAwOwotCi0gICAvKiBXZSBtYXkganVzdCB3YW50IHRvIHBhc3MgdGhlIHRleHQgcmlnaHQgdGhyb3VnaCAqLwotICAgaWYgKGNvbXByZXNzaW9uID09IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUpCi0gICB7Ci0gICAgICAgY29tcC0+aW5wdXQgPSB0ZXh0OwotICAgICAgIGNvbXAtPmlucHV0X2xlbiA9IHRleHRfbGVuOwotICAgICAgIHJldHVybigoaW50KXRleHRfbGVuKTsKLSAgIH0KLQotICAgaWYgKGNvbXByZXNzaW9uID49IFBOR19URVhUX0NPTVBSRVNTSU9OX0xBU1QpCi0gICB7Ci0jaWYgIWRlZmluZWQoUE5HX05PX1NURElPKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotICAgICAgY2hhciBtc2dbNTBdOwotICAgICAgcG5nX3NucHJpbnRmKG1zZywgNTAsICJVbmtub3duIGNvbXByZXNzaW9uIHR5cGUgJWQiLCBjb21wcmVzc2lvbik7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCBtc2cpOwotI2Vsc2UKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIGNvbXByZXNzaW9uIHR5cGUiKTsKLSNlbmRpZgotICAgfQotCi0gICAvKiBXZSBjYW4ndCB3cml0ZSB0aGUgY2h1bmsgdW50aWwgd2UgZmluZCBvdXQgaG93IG11Y2ggZGF0YSB3ZSBoYXZlLAotICAgICogd2hpY2ggbWVhbnMgd2UgbmVlZCB0byBydW4gdGhlIGNvbXByZXNzb3IgZmlyc3QgYW5kIHNhdmUgdGhlCi0gICAgKiBvdXRwdXQuICBUaGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0sIGFzIHRoZSB2YXN0IG1ham9yaXR5IG9mCi0gICAgKiBjb21tZW50cyBzaG91bGQgYmUgcmVhc29uYWJsZSwgYnV0IHdlIHdpbGwgc2V0IHVwIGFuIGFycmF5IG9mCi0gICAgKiBtYWxsb2MnZCBwb2ludGVycyB0byBiZSBzdXJlLgotICAgICoKLSAgICAqIElmIHdlIGtuZXcgdGhlIGFwcGxpY2F0aW9uIHdhcyB3ZWxsIGJlaGF2ZWQsIHdlIGNvdWxkIHNpbXBsaWZ5IHRoaXMKLSAgICAqIGdyZWF0bHkgYnkgYXNzdW1pbmcgd2UgY2FuIGFsd2F5cyBtYWxsb2MgYW4gb3V0cHV0IGJ1ZmZlciBsYXJnZQotICAgICogZW5vdWdoIHRvIGhvbGQgdGhlIGNvbXByZXNzZWQgdGV4dCAoKDEwMDEgKiB0ZXh0X2xlbiAvIDEwMDApICsgMTIpCi0gICAgKiBhbmQgbWFsbG9jIHRoaXMgZGlyZWN0bHkuICBUaGUgb25seSB0aW1lIHRoaXMgd291bGQgYmUgYSBiYWQgaWRlYSBpcwotICAgICogaWYgd2UgY2FuJ3QgbWFsbG9jIG1vcmUgdGhhbiA2NEsgYW5kIHdlIGhhdmUgNjRLIG9mIHJhbmRvbSBpbnB1dAotICAgICogZGF0YSwgb3IgaWYgdGhlIGlucHV0IHN0cmluZyBpcyBpbmNyZWRpYmx5IGxhcmdlIChhbHRob3VnaCB0aGlzCi0gICAgKiB3b3VsZG4ndCBjYXVzZSBhIGZhaWx1cmUsIGp1c3QgYSBzbG93ZG93biBkdWUgdG8gc3dhcHBpbmcpLgotICAgICovCi0KLSAgIC8qIFNldCB1cCB0aGUgY29tcHJlc3Npb24gYnVmZmVycyAqLwotICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXRleHRfbGVuOwotICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X2luID0gKEJ5dGVmICopdGV4dDsKLSAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOwotICAgcG5nX3B0ci0+enN0cmVhbS5uZXh0X291dCA9IChCeXRlZiAqKXBuZ19wdHItPnpidWY7Ci0KLSAgIC8qIFRoaXMgaXMgdGhlIHNhbWUgY29tcHJlc3Npb24gbG9vcCBhcyBpbiBwbmdfd3JpdGVfcm93KCkgKi8KLSAgIGRvCi0gICB7Ci0gICAgICAvKiBDb21wcmVzcyB0aGUgZGF0YSAqLwotICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICB7Ci0gICAgICAgICAvKiBFcnJvciAqLwotICAgICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0ubXNnICE9IE5VTEwpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgcG5nX3B0ci0+enN0cmVhbS5tc2cpOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ6bGliIGVycm9yIik7Ci0gICAgICB9Ci0gICAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCBtb3JlIHJvb20gKi8KLSAgICAgIGlmICghKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KSkKLSAgICAgIHsKLSAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgb3V0cHV0IGFycmF5IGhhcyByb29tICovCi0gICAgICAgICBpZiAoY29tcC0+bnVtX291dHB1dF9wdHIgPj0gY29tcC0+bWF4X291dHB1dF9wdHIpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgb2xkX21heDsKLQotICAgICAgICAgICAgb2xkX21heCA9IGNvbXAtPm1heF9vdXRwdXRfcHRyOwotICAgICAgICAgICAgY29tcC0+bWF4X291dHB1dF9wdHIgPSBjb21wLT5udW1fb3V0cHV0X3B0ciArIDQ7Ci0gICAgICAgICAgICBpZiAoY29tcC0+b3V0cHV0X3B0ciAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2NoYXJwcCBvbGRfcHRyOwotCi0gICAgICAgICAgICAgICBvbGRfcHRyID0gY29tcC0+b3V0cHV0X3B0cjsKLSAgICAgICAgICAgICAgIGNvbXAtPm91dHB1dF9wdHIgPSAocG5nX2NoYXJwcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAocG5nX3VpbnRfMzIpCi0gICAgICAgICAgICAgICAgICAoY29tcC0+bWF4X291dHB1dF9wdHIgKiBwbmdfc2l6ZW9mKHBuZ19jaGFycHApKSk7Ci0gICAgICAgICAgICAgICBwbmdfbWVtY3B5KGNvbXAtPm91dHB1dF9wdHIsIG9sZF9wdHIsIG9sZF9tYXgKLSAgICAgICAgICAgICAgICAgICogcG5nX3NpemVvZihwbmdfY2hhcnApKTsKLSAgICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG9sZF9wdHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgY29tcC0+b3V0cHV0X3B0ciA9IChwbmdfY2hhcnBwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgIChwbmdfdWludF8zMikKLSAgICAgICAgICAgICAgICAgIChjb21wLT5tYXhfb3V0cHV0X3B0ciAqIHBuZ19zaXplb2YocG5nX2NoYXJwKSkpOwotICAgICAgICAgfQotCi0gICAgICAgICAvKiBTYXZlIHRoZSBkYXRhICovCi0gICAgICAgICBjb21wLT5vdXRwdXRfcHRyW2NvbXAtPm51bV9vdXRwdXRfcHRyXSA9Ci0gICAgICAgICAgICAocG5nX2NoYXJwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgIChwbmdfdWludF8zMilwbmdfcHRyLT56YnVmX3NpemUpOwotICAgICAgICAgcG5nX21lbWNweShjb21wLT5vdXRwdXRfcHRyW2NvbXAtPm51bV9vdXRwdXRfcHRyXSwgcG5nX3B0ci0+emJ1ZiwKLSAgICAgICAgICAgIHBuZ19wdHItPnpidWZfc2l6ZSk7Ci0gICAgICAgICBjb21wLT5udW1fb3V0cHV0X3B0cisrOwotCi0gICAgICAgICAvKiBhbmQgcmVzZXQgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7Ci0gICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLSAgICAgIH0KLSAgIC8qIENvbnRpbnVlIHVudGlsIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgdG8gY29tcHJlc3MgKi8KLSAgIH0gd2hpbGUgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfaW4pOwotCi0gICAvKiBGaW5pc2ggdGhlIGNvbXByZXNzaW9uICovCi0gICBkbwotICAgewotICAgICAgLyogVGVsbCB6bGliIHdlIGFyZSBmaW5pc2hlZCAqLwotICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9GSU5JU0gpOwotCi0gICAgICBpZiAocmV0ID09IFpfT0spCi0gICAgICB7Ci0gICAgICAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCBtb3JlIHJvb20gKi8KLSAgICAgICAgIGlmICghKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSBvdXIgb3V0cHV0IGFycmF5IGhhcyByb29tICovCi0gICAgICAgICAgICBpZiAoY29tcC0+bnVtX291dHB1dF9wdHIgPj0gY29tcC0+bWF4X291dHB1dF9wdHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnQgb2xkX21heDsKLQotICAgICAgICAgICAgICAgb2xkX21heCA9IGNvbXAtPm1heF9vdXRwdXRfcHRyOwotICAgICAgICAgICAgICAgY29tcC0+bWF4X291dHB1dF9wdHIgPSBjb21wLT5udW1fb3V0cHV0X3B0ciArIDQ7Ci0gICAgICAgICAgICAgICBpZiAoY29tcC0+b3V0cHV0X3B0ciAhPSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcG5nX2NoYXJwcCBvbGRfcHRyOwotCi0gICAgICAgICAgICAgICAgICBvbGRfcHRyID0gY29tcC0+b3V0cHV0X3B0cjsKLSAgICAgICAgICAgICAgICAgIC8qIFRoaXMgY291bGQgYmUgb3B0aW1pemVkIHRvIHJlYWxsb2MoKSAqLwotICAgICAgICAgICAgICAgICAgY29tcC0+b3V0cHV0X3B0ciA9IChwbmdfY2hhcnBwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgIChwbmdfdWludF8zMikoY29tcC0+bWF4X291dHB1dF9wdHIgKgotICAgICAgICAgICAgICAgICAgICAgcG5nX3NpemVvZihwbmdfY2hhcnApKSk7Ci0gICAgICAgICAgICAgICAgICBwbmdfbWVtY3B5KGNvbXAtPm91dHB1dF9wdHIsIG9sZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICBvbGRfbWF4ICogcG5nX3NpemVvZihwbmdfY2hhcnApKTsKLSAgICAgICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIG9sZF9wdHIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgY29tcC0+b3V0cHV0X3B0ciA9IChwbmdfY2hhcnBwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgIChwbmdfdWludF8zMikoY29tcC0+bWF4X291dHB1dF9wdHIgKgotICAgICAgICAgICAgICAgICAgICAgcG5nX3NpemVvZihwbmdfY2hhcnApKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgdGhlIGRhdGEgKi8KLSAgICAgICAgICAgIGNvbXAtPm91dHB1dF9wdHJbY29tcC0+bnVtX291dHB1dF9wdHJdID0KLSAgICAgICAgICAgICAgIChwbmdfY2hhcnApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAgICAgICAgKHBuZ191aW50XzMyKXBuZ19wdHItPnpidWZfc2l6ZSk7Ci0gICAgICAgICAgICBwbmdfbWVtY3B5KGNvbXAtPm91dHB1dF9wdHJbY29tcC0+bnVtX291dHB1dF9wdHJdLCBwbmdfcHRyLT56YnVmLAotICAgICAgICAgICAgICAgcG5nX3B0ci0+emJ1Zl9zaXplKTsKLSAgICAgICAgICAgIGNvbXAtPm51bV9vdXRwdXRfcHRyKys7Ci0KLSAgICAgICAgICAgIC8qIGFuZCByZXNldCB0aGUgYnVmZmVyIHBvaW50ZXJzICovCi0gICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXBuZ19wdHItPnpidWZfc2l6ZTsKLSAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocmV0ICE9IFpfU1RSRUFNX0VORCkKLSAgICAgIHsKLSAgICAgICAgIC8qIFdlIGdvdCBhbiBlcnJvciAqLwotICAgICAgICAgaWYgKHBuZ19wdHItPnpzdHJlYW0ubXNnICE9IE5VTEwpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgcG5nX3B0ci0+enN0cmVhbS5tc2cpOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJ6bGliIGVycm9yIik7Ci0gICAgICB9Ci0gICB9IHdoaWxlIChyZXQgIT0gWl9TVFJFQU1fRU5EKTsKLQotICAgLyogVGV4dCBsZW5ndGggaXMgbnVtYmVyIG9mIGJ1ZmZlcnMgcGx1cyBsYXN0IGJ1ZmZlciAqLwotICAgdGV4dF9sZW4gPSBwbmdfcHRyLT56YnVmX3NpemUgKiBjb21wLT5udW1fb3V0cHV0X3B0cjsKLSAgIGlmIChwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCA8IHBuZ19wdHItPnpidWZfc2l6ZSkKLSAgICAgIHRleHRfbGVuICs9IHBuZ19wdHItPnpidWZfc2l6ZSAtIChwbmdfc2l6ZV90KXBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0OwotCi0gICByZXR1cm4oKGludCl0ZXh0X2xlbik7Ci19Ci0KLS8qIFNoaXAgdGhlIGNvbXByZXNzZWQgdGV4dCBvdXQgdmlhIGNodW5rIHdyaXRlcyAqLwotc3RhdGljIHZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX2NvbXByZXNzZWRfZGF0YV9vdXQocG5nX3N0cnVjdHAgcG5nX3B0ciwgY29tcHJlc3Npb25fc3RhdGUgKmNvbXApCi17Ci0gICBpbnQgaTsKLQotICAgLyogSGFuZGxlIHRoZSBuby1jb21wcmVzc2lvbiBjYXNlICovCi0gICBpZiAoY29tcC0+aW5wdXQpCi0gICB7Ci0gICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKWNvbXAtPmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfc2l6ZV90KWNvbXAtPmlucHV0X2xlbik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIC8qIFdyaXRlIHNhdmVkIG91dHB1dCBidWZmZXJzLCBpZiBhbnkgKi8KLSAgIGZvciAoaSA9IDA7IGkgPCBjb21wLT5udW1fb3V0cHV0X3B0cjsgaSsrKQotICAgewotICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19ieXRlcCljb21wLT5vdXRwdXRfcHRyW2ldLAotICAgICAgICAgKHBuZ19zaXplX3QpcG5nX3B0ci0+emJ1Zl9zaXplKTsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIGNvbXAtPm91dHB1dF9wdHJbaV0pOwotICAgICAgIGNvbXAtPm91dHB1dF9wdHJbaV09TlVMTDsKLSAgIH0KLSAgIGlmIChjb21wLT5tYXhfb3V0cHV0X3B0ciAhPSAwKQotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgY29tcC0+b3V0cHV0X3B0cik7Ci0gICAgICAgY29tcC0+b3V0cHV0X3B0cj1OVUxMOwotICAgLyogV3JpdGUgYW55dGhpbmcgbGVmdCBpbiB6YnVmICovCi0gICBpZiAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPCAocG5nX3VpbnRfMzIpcG5nX3B0ci0+emJ1Zl9zaXplKQotICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwKLSAgICAgICAgIChwbmdfc2l6ZV90KShwbmdfcHRyLT56YnVmX3NpemUgLSBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCkpOwotCi0gICAvKiBSZXNldCB6bGliIGZvciBhbm90aGVyIHpUWHQvaVRYdCBvciBpbWFnZSBkYXRhICovCi0gICBkZWZsYXRlUmVzZXQoJnBuZ19wdHItPnpzdHJlYW0pOwotICAgcG5nX3B0ci0+enN0cmVhbS5kYXRhX3R5cGUgPSBaX0JJTkFSWTsKLX0KLSNlbmRpZgotCi0vKiBXcml0ZSB0aGUgSUhEUiBjaHVuaywgYW5kIHVwZGF0ZSB0aGUgcG5nX3N0cnVjdCB3aXRoIHRoZSBuZWNlc3NhcnkKLSAqIGluZm9ybWF0aW9uLiAgTm90ZSB0aGF0IHRoZSByZXN0IG9mIHRoaXMgY29kZSBkZXBlbmRzIHVwb24gdGhpcwotICogaW5mb3JtYXRpb24gYmVpbmcgY29ycmVjdC4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfSUhEUihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LAotICAgaW50IGJpdF9kZXB0aCwgaW50IGNvbG9yX3R5cGUsIGludCBjb21wcmVzc2lvbl90eXBlLCBpbnQgZmlsdGVyX3R5cGUsCi0gICBpbnQgaW50ZXJsYWNlX3R5cGUpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIFBOR19JSERSOwotI2VuZGlmCi0gICBpbnQgcmV0OwotCi0gICBwbmdfYnl0ZSBidWZbMTNdOyAvKiBCdWZmZXIgdG8gc3RvcmUgdGhlIElIRFIgaW5mbyAqLwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9JSERSIik7Ci0gICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgdmFsaWQgaW5wdXQgZGF0YSBmcm9tIHRoZSBhcHBsaWNhdGlvbiBpbmZvICovCi0gICBzd2l0Y2ggKGNvbG9yX3R5cGUpCi0gICB7Ci0gICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6Ci0gICAgICAgICBzd2l0Y2ggKGJpdF9kZXB0aCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIGNhc2UgMTY6IHBuZ19wdHItPmNoYW5uZWxzID0gMTsgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGZvciBncmF5c2NhbGUgaW1hZ2UiKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0I6Ci0gICAgICAgICBpZiAoYml0X2RlcHRoICE9IDggJiYgYml0X2RlcHRoICE9IDE2KQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGJpdCBkZXB0aCBmb3IgUkdCIGltYWdlIik7Ci0gICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDM7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRURToKLSAgICAgICAgIHN3aXRjaCAoYml0X2RlcHRoKQotICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgY2FzZSA4OiBwbmdfcHRyLT5jaGFubmVscyA9IDE7IGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDogcG5nX2Vycm9yKHBuZ19wdHIsICJJbnZhbGlkIGJpdCBkZXB0aCBmb3IgcGFsZXR0ZWQgaW1hZ2UiKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOgotICAgICAgICAgaWYgKGJpdF9kZXB0aCAhPSA4ICYmIGJpdF9kZXB0aCAhPSAxNikKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBiaXQgZGVwdGggZm9yIGdyYXlzY2FsZSthbHBoYSBpbWFnZSIpOwotICAgICAgICAgcG5nX3B0ci0+Y2hhbm5lbHMgPSAyOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToKLSAgICAgICAgIGlmIChiaXRfZGVwdGggIT0gOCAmJiBiaXRfZGVwdGggIT0gMTYpCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgYml0IGRlcHRoIGZvciBSR0JBIGltYWdlIik7Ci0gICAgICAgICBwbmdfcHRyLT5jaGFubmVscyA9IDQ7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkludmFsaWQgaW1hZ2UgY29sb3IgdHlwZSBzcGVjaWZpZWQiKTsKLSAgIH0KLQotICAgaWYgKGNvbXByZXNzaW9uX3R5cGUgIT0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGNvbXByZXNzaW9uIHR5cGUgc3BlY2lmaWVkIik7Ci0gICAgICBjb21wcmVzc2lvbl90eXBlID0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRTsKLSAgIH0KLQotICAgLyogV3JpdGUgZmlsdGVyX21ldGhvZCA2NCAoaW50cmFwaXhlbCBkaWZmZXJlbmNpbmcpIG9ubHkgaWYKLSAgICAqIDEuIExpYnBuZyB3YXMgY29tcGlsZWQgd2l0aCBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCBhbmQKLSAgICAqIDIuIExpYnBuZyBkaWQgbm90IHdyaXRlIGEgUE5HIHNpZ25hdHVyZSAodGhpcyBmaWx0ZXJfbWV0aG9kIGlzIG9ubHkKLSAgICAqICAgIHVzZWQgaW4gUE5HIGRhdGFzdHJlYW1zIHRoYXQgYXJlIGVtYmVkZGVkIGluIE1ORyBkYXRhc3RyZWFtcykgYW5kCi0gICAgKiAzLiBUaGUgYXBwbGljYXRpb24gY2FsbGVkIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzIHdpdGggYSBtYXNrIHRoYXQKLSAgICAqICAgIGluY2x1ZGVkIFBOR19GTEFHX01OR19GSUxURVJfNjQgYW5kCi0gICAgKiA0LiBUaGUgZmlsdGVyX21ldGhvZCBpcyA2NCBhbmQKLSAgICAqIDUuIFRoZSBjb2xvcl90eXBlIGlzIFJHQiBvciBSR0JBCi0gICAgKi8KLSAgIGlmICgKLSNpZiBkZWZpbmVkKFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEKQotICAgICAgISgocG5nX3B0ci0+bW5nX2ZlYXR1cmVzX3Blcm1pdHRlZCAmIFBOR19GTEFHX01OR19GSUxURVJfNjQpICYmCi0gICAgICAoKHBuZ19wdHItPm1vZGUmUE5HX0hBVkVfUE5HX1NJR05BVFVSRSkgPT0gMCkgJiYKLSAgICAgIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAotICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKSAmJgotICAgICAgKGZpbHRlcl90eXBlID09IFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORykpICYmCi0jZW5kaWYKLSAgICAgIGZpbHRlcl90eXBlICE9IFBOR19GSUxURVJfVFlQRV9CQVNFKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgZmlsdGVyIHR5cGUgc3BlY2lmaWVkIik7Ci0gICAgICBmaWx0ZXJfdHlwZSA9IFBOR19GSUxURVJfVFlQRV9CQVNFOwotICAgfQotCi0jaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgaWYgKGludGVybGFjZV90eXBlICE9IFBOR19JTlRFUkxBQ0VfTk9ORSAmJgotICAgICAgaW50ZXJsYWNlX3R5cGUgIT0gUE5HX0lOVEVSTEFDRV9BREFNNykKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIGludGVybGFjZSB0eXBlIHNwZWNpZmllZCIpOwotICAgICAgaW50ZXJsYWNlX3R5cGUgPSBQTkdfSU5URVJMQUNFX0FEQU03OwotICAgfQotI2Vsc2UKLSAgIGludGVybGFjZV90eXBlPVBOR19JTlRFUkxBQ0VfTk9ORTsKLSNlbmRpZgotCi0gICAvKiBTYXZlIHRoZSByZWxldmVudCBpbmZvcm1hdGlvbiAqLwotICAgcG5nX3B0ci0+Yml0X2RlcHRoID0gKHBuZ19ieXRlKWJpdF9kZXB0aDsKLSAgIHBuZ19wdHItPmNvbG9yX3R5cGUgPSAocG5nX2J5dGUpY29sb3JfdHlwZTsKLSAgIHBuZ19wdHItPmludGVybGFjZWQgPSAocG5nX2J5dGUpaW50ZXJsYWNlX3R5cGU7Ci0jaWYgZGVmaW5lZChQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCkKLSAgIHBuZ19wdHItPmZpbHRlcl90eXBlID0gKHBuZ19ieXRlKWZpbHRlcl90eXBlOwotI2VuZGlmCi0gICBwbmdfcHRyLT5jb21wcmVzc2lvbl90eXBlID0gKHBuZ19ieXRlKWNvbXByZXNzaW9uX3R5cGU7Ci0gICBwbmdfcHRyLT53aWR0aCA9IHdpZHRoOwotICAgcG5nX3B0ci0+aGVpZ2h0ID0gaGVpZ2h0OwotCi0gICBwbmdfcHRyLT5waXhlbF9kZXB0aCA9IChwbmdfYnl0ZSkoYml0X2RlcHRoICogcG5nX3B0ci0+Y2hhbm5lbHMpOwotICAgcG5nX3B0ci0+cm93Ynl0ZXMgPSBQTkdfUk9XQllURVMocG5nX3B0ci0+cGl4ZWxfZGVwdGgsIHdpZHRoKTsKLSAgIC8qIFNldCB0aGUgdXNyIGluZm8sIHNvIGFueSB0cmFuc2Zvcm1hdGlvbnMgY2FuIG1vZGlmeSBpdCAqLwotICAgcG5nX3B0ci0+dXNyX3dpZHRoID0gcG5nX3B0ci0+d2lkdGg7Ci0gICBwbmdfcHRyLT51c3JfYml0X2RlcHRoID0gcG5nX3B0ci0+Yml0X2RlcHRoOwotICAgcG5nX3B0ci0+dXNyX2NoYW5uZWxzID0gcG5nX3B0ci0+Y2hhbm5lbHM7Ci0KLSAgIC8qIFBhY2sgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpbnRvIHRoZSBidWZmZXIgKi8KLSAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmLCB3aWR0aCk7Ci0gICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiArIDQsIGhlaWdodCk7Ci0gICBidWZbOF0gPSAocG5nX2J5dGUpYml0X2RlcHRoOwotICAgYnVmWzldID0gKHBuZ19ieXRlKWNvbG9yX3R5cGU7Ci0gICBidWZbMTBdID0gKHBuZ19ieXRlKWNvbXByZXNzaW9uX3R5cGU7Ci0gICBidWZbMTFdID0gKHBuZ19ieXRlKWZpbHRlcl90eXBlOwotICAgYnVmWzEyXSA9IChwbmdfYnl0ZSlpbnRlcmxhY2VfdHlwZTsKLQotICAgLyogV3JpdGUgdGhlIGNodW5rICovCi0gICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfSUhEUiwgYnVmLCAocG5nX3NpemVfdCkxMyk7Ci0KLSAgIC8qIEluaXRpYWxpemUgemxpYiB3aXRoIFBORyBpbmZvICovCi0gICBwbmdfcHRyLT56c3RyZWFtLnphbGxvYyA9IHBuZ196YWxsb2M7Ci0gICBwbmdfcHRyLT56c3RyZWFtLnpmcmVlID0gcG5nX3pmcmVlOwotICAgcG5nX3B0ci0+enN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKXBuZ19wdHI7Ci0gICBpZiAoIShwbmdfcHRyLT5kb19maWx0ZXIpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSB8fAotICAgICAgICAgcG5nX3B0ci0+Yml0X2RlcHRoIDwgOCkKLSAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IFBOR19GSUxURVJfTk9ORTsKLSAgICAgIGVsc2UKLSAgICAgICAgIHBuZ19wdHItPmRvX2ZpbHRlciA9IFBOR19BTExfRklMVEVSUzsKLSAgIH0KLSAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWkxJQl9DVVNUT01fU1RSQVRFR1kpKQotICAgewotICAgICAgaWYgKHBuZ19wdHItPmRvX2ZpbHRlciAhPSBQTkdfRklMVEVSX05PTkUpCi0gICAgICAgICBwbmdfcHRyLT56bGliX3N0cmF0ZWd5ID0gWl9GSUxURVJFRDsKLSAgICAgIGVsc2UKLSAgICAgICAgIHBuZ19wdHItPnpsaWJfc3RyYXRlZ3kgPSBaX0RFRkFVTFRfU1RSQVRFR1k7Ci0gICB9Ci0gICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pMSUJfQ1VTVE9NX0xFVkVMKSkKLSAgICAgIHBuZ19wdHItPnpsaWJfbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047Ci0gICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pMSUJfQ1VTVE9NX01FTV9MRVZFTCkpCi0gICAgICBwbmdfcHRyLT56bGliX21lbV9sZXZlbCA9IDg7Ci0gICBpZiAoIShwbmdfcHRyLT5mbGFncyAmIFBOR19GTEFHX1pMSUJfQ1VTVE9NX1dJTkRPV19CSVRTKSkKLSAgICAgIHBuZ19wdHItPnpsaWJfd2luZG93X2JpdHMgPSAxNTsKLSAgIGlmICghKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWkxJQl9DVVNUT01fTUVUSE9EKSkKLSAgICAgIHBuZ19wdHItPnpsaWJfbWV0aG9kID0gODsKLSAgIHJldCA9IGRlZmxhdGVJbml0MigmcG5nX3B0ci0+enN0cmVhbSwgcG5nX3B0ci0+emxpYl9sZXZlbCwKLSAgICAgICAgIHBuZ19wdHItPnpsaWJfbWV0aG9kLCBwbmdfcHRyLT56bGliX3dpbmRvd19iaXRzLAotICAgICAgICAgcG5nX3B0ci0+emxpYl9tZW1fbGV2ZWwsIHBuZ19wdHItPnpsaWJfc3RyYXRlZ3kpOwotICAgaWYgKHJldCAhPSBaX09LKQotICAgewotICAgICAgaWYgKHJldCA9PSBaX1ZFUlNJT05fRVJST1IpIHBuZ19lcnJvcihwbmdfcHRyLAotICAgICAgICAgICJ6bGliIGZhaWxlZCB0byBpbml0aWFsaXplIGNvbXByZXNzb3IgLS0gdmVyc2lvbiBlcnJvciIpOwotICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FUlJPUikgcG5nX2Vycm9yKHBuZ19wdHIsCi0gICAgICAgICAgICJ6bGliIGZhaWxlZCB0byBpbml0aWFsaXplIGNvbXByZXNzb3IgLS0gc3RyZWFtIGVycm9yIik7Ci0gICAgICBpZiAocmV0ID09IFpfTUVNX0VSUk9SKSBwbmdfZXJyb3IocG5nX3B0ciwKLSAgICAgICAgICAgInpsaWIgZmFpbGVkIHRvIGluaXRpYWxpemUgY29tcHJlc3NvciAtLSBtZW0gZXJyb3IiKTsKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiemxpYiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb21wcmVzc29yIik7Ci0gICB9Ci0gICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLSAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOwotICAgLyogbGlicG5nIGlzIG5vdCBpbnRlcmVzdGVkIGluIHpzdHJlYW0uZGF0YV90eXBlICovCi0gICAvKiBTZXQgaXQgdG8gYSBwcmVkZWZpbmVkIHZhbHVlLCB0byBhdm9pZCBpdHMgZXZhbHVhdGlvbiBpbnNpZGUgemxpYiAqLwotICAgcG5nX3B0ci0+enN0cmVhbS5kYXRhX3R5cGUgPSBaX0JJTkFSWTsKLQotICAgcG5nX3B0ci0+bW9kZSA9IFBOR19IQVZFX0lIRFI7Ci19Ci0KLS8qIFdyaXRlIHRoZSBwYWxldHRlLiAgV2UgYXJlIGNhcmVmdWwgbm90IHRvIHRydXN0IHBuZ19jb2xvciB0byBiZSBpbiB0aGUKLSAqIGNvcnJlY3Qgb3JkZXIgZm9yIFBORywgc28gcGVvcGxlIGNhbiByZWRlZmluZSBpdCB0byBhbnkgY29udmVuaWVudAotICogc3RydWN0dXJlLgotICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9QTFRFKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb2xvcnAgcGFsZXR0ZSwgcG5nX3VpbnRfMzIgbnVtX3BhbCkKLXsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgUE5HX1BMVEU7Ci0jZW5kaWYKLSAgIHBuZ191aW50XzMyIGk7Ci0gICBwbmdfY29sb3JwIHBhbF9wdHI7Ci0gICBwbmdfYnl0ZSBidWZbM107Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX1BMVEUiKTsKLSAgIGlmICgoCi0jaWYgZGVmaW5lZChQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCkKLSAgICAgICAgIShwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0VNUFRZX1BMVEUpICYmCi0jZW5kaWYKLSAgICAgICAgbnVtX3BhbCA9PSAwKSB8fCBudW1fcGFsID4gMjU2KQotICAgewotICAgICBpZiAocG5nX3B0ci0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICB7Ci0gICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW52YWxpZCBudW1iZXIgb2YgY29sb3JzIGluIHBhbGV0dGUiKTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgbnVtYmVyIG9mIGNvbG9ycyBpbiBwYWxldHRlIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgfQotICAgfQotCi0gICBpZiAoIShwbmdfcHRyLT5jb2xvcl90eXBlJlBOR19DT0xPUl9NQVNLX0NPTE9SKSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICJJZ25vcmluZyByZXF1ZXN0IHRvIHdyaXRlIGEgUExURSBjaHVuayBpbiBncmF5c2NhbGUgUE5HIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHBuZ19wdHItPm51bV9wYWxldHRlID0gKHBuZ191aW50XzE2KW51bV9wYWw7Ci0gICBwbmdfZGVidWcxKDMsICJudW1fcGFsZXR0ZSA9ICVkIiwgcG5nX3B0ci0+bnVtX3BhbGV0dGUpOwotCi0gICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfUExURSwKLSAgICAgKHBuZ191aW50XzMyKShudW1fcGFsICogMykpOwotI2lmbmRlZiBQTkdfTk9fUE9JTlRFUl9JTkRFWElORwotICAgZm9yIChpID0gMCwgcGFsX3B0ciA9IHBhbGV0dGU7IGkgPCBudW1fcGFsOyBpKyssIHBhbF9wdHIrKykKLSAgIHsKLSAgICAgIGJ1ZlswXSA9IHBhbF9wdHItPnJlZDsKLSAgICAgIGJ1ZlsxXSA9IHBhbF9wdHItPmdyZWVuOwotICAgICAgYnVmWzJdID0gcGFsX3B0ci0+Ymx1ZTsKLSAgICAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGJ1ZiwgKHBuZ19zaXplX3QpMyk7Ci0gICB9Ci0jZWxzZQotICAgLyogVGhpcyBpcyBhIGxpdHRsZSBzbG93ZXIgYnV0IHNvbWUgYnVnZ3kgY29tcGlsZXJzIG5lZWQgdG8gZG8gdGhpcyBpbnN0ZWFkICovCi0gICBwYWxfcHRyPXBhbGV0dGU7Ci0gICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhbDsgaSsrKQotICAgewotICAgICAgYnVmWzBdID0gcGFsX3B0cltpXS5yZWQ7Ci0gICAgICBidWZbMV0gPSBwYWxfcHRyW2ldLmdyZWVuOwotICAgICAgYnVmWzJdID0gcGFsX3B0cltpXS5ibHVlOwotICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCkzKTsKLSAgIH0KLSNlbmRpZgotICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKLSAgIHBuZ19wdHItPm1vZGUgfD0gUE5HX0hBVkVfUExURTsKLX0KLQotLyogV3JpdGUgYW4gSURBVCBjaHVuayAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfSURBVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIFBOR19JREFUOwotI2VuZGlmCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9JREFUIik7Ci0KLSAgIC8qIE9wdGltaXplIHRoZSBDTUYgZmllbGQgaW4gdGhlIHpsaWIgc3RyZWFtLiAqLwotICAgLyogVGhpcyBoYWNrIG9mIHRoZSB6bGliIHN0cmVhbSBpcyBjb21wbGlhbnQgdG8gdGhlIHN0cmVhbSBzcGVjaWZpY2F0aW9uLiAqLwotICAgaWYgKCEocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpICYmCi0gICAgICAgcG5nX3B0ci0+Y29tcHJlc3Npb25fdHlwZSA9PSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFKQotICAgewotICAgICAgdW5zaWduZWQgaW50IHpfY21mID0gZGF0YVswXTsgIC8qIHpsaWIgY29tcHJlc3Npb24gbWV0aG9kIGFuZCBmbGFncyAqLwotICAgICAgaWYgKCh6X2NtZiAmIDB4MGYpID09IDggJiYgKHpfY21mICYgMHhmMCkgPD0gMHg3MCkKLSAgICAgIHsKLSAgICAgICAgIC8qIEF2b2lkIG1lbW9yeSB1bmRlcmZsb3dzIGFuZCBtdWx0aXBsaWNhdGlvbiBvdmVyZmxvd3MuCi0gICAgICAgICAgKgotICAgICAgICAgICogVGhlIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHByYWN0aWNhbGx5IGFsd2F5cyBzYXRpc2ZpZWQ7Ci0gICAgICAgICAgKiBob3dldmVyLCB0aGV5IHN0aWxsIG11c3QgYmUgY2hlY2tlZC4KLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKGxlbmd0aCA+PSAyICYmCi0gICAgICAgICAgICAgcG5nX3B0ci0+aGVpZ2h0IDwgMTYzODQgJiYgcG5nX3B0ci0+d2lkdGggPCAxNjM4NCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHVuY29tcHJlc3NlZF9pZGF0X3NpemUgPSBwbmdfcHRyLT5oZWlnaHQgKgotICAgICAgICAgICAgICAgKChwbmdfcHRyLT53aWR0aCAqCi0gICAgICAgICAgICAgICBwbmdfcHRyLT5jaGFubmVscyAqIHBuZ19wdHItPmJpdF9kZXB0aCArIDE1KSA+PiAzKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCB6X2NpbmZvID0gel9jbWYgPj4gNDsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBoYWxmX3pfd2luZG93X3NpemUgPSAxIDw8ICh6X2NpbmZvICsgNyk7Ci0gICAgICAgICAgICB3aGlsZSAodW5jb21wcmVzc2VkX2lkYXRfc2l6ZSA8PSBoYWxmX3pfd2luZG93X3NpemUgJiYKLSAgICAgICAgICAgICAgICAgICBoYWxmX3pfd2luZG93X3NpemUgPj0gMjU2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgel9jaW5mby0tOwotICAgICAgICAgICAgICAgaGFsZl96X3dpbmRvd19zaXplID4+PSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgel9jbWYgPSAoel9jbWYgJiAweDBmKSB8ICh6X2NpbmZvIDw8IDQpOwotICAgICAgICAgICAgaWYgKGRhdGFbMF0gIT0gKHBuZ19ieXRlKXpfY21mKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZGF0YVswXSA9IChwbmdfYnl0ZSl6X2NtZjsKLSAgICAgICAgICAgICAgIGRhdGFbMV0gJj0gMHhlMDsKLSAgICAgICAgICAgICAgIGRhdGFbMV0gKz0gKHBuZ19ieXRlKSgweDFmIC0gKCh6X2NtZiA8PCA4KSArIGRhdGFbMV0pICUgMHgxZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwKLSAgICAgICAgICAgICJJbnZhbGlkIHpsaWIgY29tcHJlc3Npb24gbWV0aG9kIG9yIGZsYWdzIGluIElEQVQiKTsKLSAgIH0KLQotICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX0lEQVQsIGRhdGEsIGxlbmd0aCk7Ci0gICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lEQVQ7Ci19Ci0KLS8qIFdyaXRlIGFuIElFTkQgY2h1bmsgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX0lFTkQocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgUE5HX0lFTkQ7Ci0jZW5kaWYKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX0lFTkQiKTsKLSAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19JRU5ELCBwbmdfYnl0ZXBfTlVMTCwKLSAgICAgKHBuZ19zaXplX3QpMCk7Ci0gICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lFTkQ7Ci19Ci0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9nQU1BX1NVUFBPUlRFRCkKLS8qIFdyaXRlIGEgZ0FNQSBjaHVuayAqLwotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX2dBTUEocG5nX3N0cnVjdHAgcG5nX3B0ciwgZG91YmxlIGZpbGVfZ2FtbWEpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIFBOR19nQU1BOwotI2VuZGlmCi0gICBwbmdfdWludF8zMiBpZ2FtbWE7Ci0gICBwbmdfYnl0ZSBidWZbNF07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2dBTUEiKTsKLSAgIC8qIGZpbGVfZ2FtbWEgaXMgc2F2ZWQgaW4gMS8xMDAsMDAwdGhzICovCi0gICBpZ2FtbWEgPSAocG5nX3VpbnRfMzIpKGZpbGVfZ2FtbWEgKiAxMDAwMDAuMCArIDAuNSk7Ci0gICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiwgaWdhbW1hKTsKLSAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19nQU1BLCBidWYsIChwbmdfc2l6ZV90KTQpOwotfQotI2VuZGlmCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfZ0FNQV9maXhlZChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfZml4ZWRfcG9pbnQgZmlsZV9nYW1tYSkKLXsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgUE5HX2dBTUE7Ci0jZW5kaWYKLSAgIHBuZ19ieXRlIGJ1Zls0XTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZ0FNQSIpOwotICAgLyogZmlsZV9nYW1tYSBpcyBzYXZlZCBpbiAxLzEwMCwwMDB0aHMgKi8KLSAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmLCAocG5nX3VpbnRfMzIpZmlsZV9nYW1tYSk7Ci0gICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfZ0FNQSwgYnVmLCAocG5nX3NpemVfdCk0KTsKLX0KLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9zUkdCX1NVUFBPUlRFRCkKLS8qIFdyaXRlIGEgc1JHQiBjaHVuayAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfc1JHQihwbmdfc3RydWN0cCBwbmdfcHRyLCBpbnQgc3JnYl9pbnRlbnQpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIFBOR19zUkdCOwotI2VuZGlmCi0gICBwbmdfYnl0ZSBidWZbMV07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3NSR0IiKTsKLSAgIGlmIChzcmdiX2ludGVudCA+PSBQTkdfc1JHQl9JTlRFTlRfTEFTVCkKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgICAiSW52YWxpZCBzUkdCIHJlbmRlcmluZyBpbnRlbnQgc3BlY2lmaWVkIik7Ci0gICBidWZbMF09KHBuZ19ieXRlKXNyZ2JfaW50ZW50OwotICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3NSR0IsIGJ1ZiwgKHBuZ19zaXplX3QpMSk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVEKQotLyogV3JpdGUgYW4gaUNDUCBjaHVuayAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfaUNDUChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY2hhcnAgbmFtZSwgaW50IGNvbXByZXNzaW9uX3R5cGUsCi0gICBwbmdfY2hhcnAgcHJvZmlsZSwgaW50IHByb2ZpbGVfbGVuKQotewotI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCi0gICBQTkdfaUNDUDsKLSNlbmRpZgotICAgcG5nX3NpemVfdCBuYW1lX2xlbjsKLSAgIHBuZ19jaGFycCBuZXdfbmFtZTsKLSAgIGNvbXByZXNzaW9uX3N0YXRlIGNvbXA7Ci0gICBpbnQgZW1iZWRkZWRfcHJvZmlsZV9sZW4gPSAwOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9pQ0NQIik7Ci0KLSAgIGNvbXAubnVtX291dHB1dF9wdHIgPSAwOwotICAgY29tcC5tYXhfb3V0cHV0X3B0ciA9IDA7Ci0gICBjb21wLm91dHB1dF9wdHIgPSBOVUxMOwotICAgY29tcC5pbnB1dCA9IE5VTEw7Ci0gICBjb21wLmlucHV0X2xlbiA9IDA7Ci0KLSAgIGlmICgobmFtZV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBuYW1lLAotICAgICAgJm5ld19uYW1lKSkgPT0gMCkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKGNvbXByZXNzaW9uX3R5cGUgIT0gUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSkKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJVbmtub3duIGNvbXByZXNzaW9uIHR5cGUgaW4gaUNDUCBjaHVuayIpOwotCi0gICBpZiAocHJvZmlsZSA9PSBOVUxMKQotICAgICAgcHJvZmlsZV9sZW4gPSAwOwotCi0gICBpZiAocHJvZmlsZV9sZW4gPiAzKQotICAgICAgZW1iZWRkZWRfcHJvZmlsZV9sZW4gPQotICAgICAgICAgICgoKiggKHBuZ19ieXRlcClwcm9maWxlICAgICkpPDwyNCkgfAotICAgICAgICAgICgoKiggKHBuZ19ieXRlcClwcm9maWxlICsgMSkpPDwxNikgfAotICAgICAgICAgICgoKiggKHBuZ19ieXRlcClwcm9maWxlICsgMikpPDwgOCkgfAotICAgICAgICAgICgoKiggKHBuZ19ieXRlcClwcm9maWxlICsgMykpICAgICk7Ci0KLSAgIGlmIChwcm9maWxlX2xlbiA8IGVtYmVkZGVkX3Byb2ZpbGVfbGVuKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgIkVtYmVkZGVkIHByb2ZpbGUgbGVuZ3RoIHRvbyBsYXJnZSBpbiBpQ0NQIGNodW5rIik7Ci0gICAgICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmIChwcm9maWxlX2xlbiA+IGVtYmVkZGVkX3Byb2ZpbGVfbGVuKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwKLSAgICAgICAgIlRydW5jYXRpbmcgcHJvZmlsZSB0byBhY3R1YWwgbGVuZ3RoIGluIGlDQ1AgY2h1bmsiKTsKLSAgICAgIHByb2ZpbGVfbGVuID0gZW1iZWRkZWRfcHJvZmlsZV9sZW47Ci0gICB9Ci0KLSAgIGlmIChwcm9maWxlX2xlbikKLSAgICAgIHByb2ZpbGVfbGVuID0gcG5nX3RleHRfY29tcHJlc3MocG5nX3B0ciwgcHJvZmlsZSwKLSAgICAgICAgKHBuZ19zaXplX3QpcHJvZmlsZV9sZW4sIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsICZjb21wKTsKLQotICAgLyogTWFrZSBzdXJlIHdlIGluY2x1ZGUgdGhlIE5VTEwgYWZ0ZXIgdGhlIG5hbWUgYW5kIHRoZSBjb21wcmVzc2lvbiB0eXBlICovCi0gICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfaUNDUCwKLSAgICAgICAgICAocG5nX3VpbnRfMzIpKG5hbWVfbGVuICsgcHJvZmlsZV9sZW4gKyAyKSk7Ci0gICBuZXdfbmFtZVtuYW1lX2xlbiArIDFdID0gMHgwMDsKLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApbmV3X25hbWUsCi0gICAgIChwbmdfc2l6ZV90KShuYW1lX2xlbiArIDIpKTsKLQotICAgaWYgKHByb2ZpbGVfbGVuKQotICAgICAgcG5nX3dyaXRlX2NvbXByZXNzZWRfZGF0YV9vdXQocG5nX3B0ciwgJmNvbXApOwotCi0gICBwbmdfd3JpdGVfY2h1bmtfZW5kKHBuZ19wdHIpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X25hbWUpOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9zUExUX1NVUFBPUlRFRCkKLS8qIFdyaXRlIGEgc1BMVCBjaHVuayAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfc1BMVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfc1BMVF90cCBzcGFsZXR0ZSkKLXsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgUE5HX3NQTFQ7Ci0jZW5kaWYKLSAgIHBuZ19zaXplX3QgbmFtZV9sZW47Ci0gICBwbmdfY2hhcnAgbmV3X25hbWU7Ci0gICBwbmdfYnl0ZSBlbnRyeWJ1ZlsxMF07Ci0gICBpbnQgZW50cnlfc2l6ZSA9IChzcGFsZXR0ZS0+ZGVwdGggPT0gOCA/IDYgOiAxMCk7Ci0gICBpbnQgcGFsZXR0ZV9zaXplID0gZW50cnlfc2l6ZSAqIHNwYWxldHRlLT5uZW50cmllczsKLSAgIHBuZ19zUExUX2VudHJ5cCBlcDsKLSNpZmRlZiBQTkdfTk9fUE9JTlRFUl9JTkRFWElORwotICAgaW50IGk7Ci0jZW5kaWYKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfc1BMVCIpOwotICAgaWYgKChuYW1lX2xlbiA9IHBuZ19jaGVja19rZXl3b3JkKHBuZ19wdHIsc3BhbGV0dGUtPm5hbWUsICZuZXdfbmFtZSkpPT0wKQotICAgICAgcmV0dXJuOwotCi0gICAvKiBNYWtlIHN1cmUgd2UgaW5jbHVkZSB0aGUgTlVMTCBhZnRlciB0aGUgbmFtZSAqLwotICAgcG5nX3dyaXRlX2NodW5rX3N0YXJ0KHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3NQTFQsCi0gICAgIChwbmdfdWludF8zMikobmFtZV9sZW4gKyAyICsgcGFsZXR0ZV9zaXplKSk7Ci0gICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKW5ld19uYW1lLAotICAgICAocG5nX3NpemVfdCkobmFtZV9sZW4gKyAxKSk7Ci0gICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKSZzcGFsZXR0ZS0+ZGVwdGgsIChwbmdfc2l6ZV90KTEpOwotCi0gICAvKiBMb29wIHRocm91Z2ggZWFjaCBwYWxldHRlIGVudHJ5LCB3cml0aW5nIGFwcHJvcHJpYXRlbHkgKi8KLSNpZm5kZWYgUE5HX05PX1BPSU5URVJfSU5ERVhJTkcKLSAgIGZvciAoZXAgPSBzcGFsZXR0ZS0+ZW50cmllczsgZXA8c3BhbGV0dGUtPmVudHJpZXMgKyBzcGFsZXR0ZS0+bmVudHJpZXM7IGVwKyspCi0gICB7Ci0gICAgICBpZiAoc3BhbGV0dGUtPmRlcHRoID09IDgpCi0gICAgICB7Ci0gICAgICAgICAgZW50cnlidWZbMF0gPSAocG5nX2J5dGUpZXAtPnJlZDsKLSAgICAgICAgICBlbnRyeWJ1ZlsxXSA9IChwbmdfYnl0ZSllcC0+Z3JlZW47Ci0gICAgICAgICAgZW50cnlidWZbMl0gPSAocG5nX2J5dGUpZXAtPmJsdWU7Ci0gICAgICAgICAgZW50cnlidWZbM10gPSAocG5nX2J5dGUpZXAtPmFscGhhOwotICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA0LCBlcC0+ZnJlcXVlbmN5KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgMCwgZXAtPnJlZCk7Ci0gICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDIsIGVwLT5ncmVlbik7Ci0gICAgICAgICAgcG5nX3NhdmVfdWludF8xNihlbnRyeWJ1ZiArIDQsIGVwLT5ibHVlKTsKLSAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgNiwgZXAtPmFscGhhKTsKLSAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgOCwgZXAtPmZyZXF1ZW5jeSk7Ci0gICAgICB9Ci0gICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCBlbnRyeWJ1ZiwgKHBuZ19zaXplX3QpZW50cnlfc2l6ZSk7Ci0gICB9Ci0jZWxzZQotICAgZXA9c3BhbGV0dGUtPmVudHJpZXM7Ci0gICBmb3IgKGk9MDsgaT5zcGFsZXR0ZS0+bmVudHJpZXM7IGkrKykKLSAgIHsKLSAgICAgIGlmIChzcGFsZXR0ZS0+ZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgICBlbnRyeWJ1ZlswXSA9IChwbmdfYnl0ZSllcFtpXS5yZWQ7Ci0gICAgICAgICAgZW50cnlidWZbMV0gPSAocG5nX2J5dGUpZXBbaV0uZ3JlZW47Ci0gICAgICAgICAgZW50cnlidWZbMl0gPSAocG5nX2J5dGUpZXBbaV0uYmx1ZTsKLSAgICAgICAgICBlbnRyeWJ1ZlszXSA9IChwbmdfYnl0ZSllcFtpXS5hbHBoYTsKLSAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgNCwgZXBbaV0uZnJlcXVlbmN5KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgMCwgZXBbaV0ucmVkKTsKLSAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgMiwgZXBbaV0uZ3JlZW4pOwotICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA0LCBlcFtpXS5ibHVlKTsKLSAgICAgICAgICBwbmdfc2F2ZV91aW50XzE2KGVudHJ5YnVmICsgNiwgZXBbaV0uYWxwaGEpOwotICAgICAgICAgIHBuZ19zYXZlX3VpbnRfMTYoZW50cnlidWYgKyA4LCBlcFtpXS5mcmVxdWVuY3kpOwotICAgICAgfQotICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgZW50cnlidWYsIChwbmdfc2l6ZV90KWVudHJ5X3NpemUpOwotICAgfQotI2VuZGlmCi0KLSAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfbmFtZSk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX3NCSVRfU1VQUE9SVEVEKQotLyogV3JpdGUgdGhlIHNCSVQgY2h1bmsgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX3NCSVQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbG9yXzhwIHNiaXQsIGludCBjb2xvcl90eXBlKQotewotI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCi0gICBQTkdfc0JJVDsKLSNlbmRpZgotICAgcG5nX2J5dGUgYnVmWzRdOwotICAgcG5nX3NpemVfdCBzaXplOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9zQklUIik7Ci0gICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZGVwZW5kIHVwb24gdGhlIG9yZGVyIG9mIFBOR19DT0xPUl84ICovCi0gICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgewotICAgICAgcG5nX2J5dGUgbWF4Yml0czsKLQotICAgICAgbWF4Yml0cyA9IChwbmdfYnl0ZSkoY29sb3JfdHlwZT09UE5HX0NPTE9SX1RZUEVfUEFMRVRURSA/IDggOgotICAgICAgICAgICAgICAgIHBuZ19wdHItPnVzcl9iaXRfZGVwdGgpOwotICAgICAgaWYgKHNiaXQtPnJlZCA9PSAwIHx8IHNiaXQtPnJlZCA+IG1heGJpdHMgfHwKLSAgICAgICAgICBzYml0LT5ncmVlbiA9PSAwIHx8IHNiaXQtPmdyZWVuID4gbWF4Yml0cyB8fAotICAgICAgICAgIHNiaXQtPmJsdWUgPT0gMCB8fCBzYml0LT5ibHVlID4gbWF4Yml0cykKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJJbnZhbGlkIHNCSVQgZGVwdGggc3BlY2lmaWVkIik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBidWZbMF0gPSBzYml0LT5yZWQ7Ci0gICAgICBidWZbMV0gPSBzYml0LT5ncmVlbjsKLSAgICAgIGJ1ZlsyXSA9IHNiaXQtPmJsdWU7Ci0gICAgICBzaXplID0gMzsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGlmIChzYml0LT5ncmF5ID09IDAgfHwgc2JpdC0+Z3JheSA+IHBuZ19wdHItPnVzcl9iaXRfZGVwdGgpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBzQklUIGRlcHRoIHNwZWNpZmllZCIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgYnVmWzBdID0gc2JpdC0+Z3JheTsKLSAgICAgIHNpemUgPSAxOwotICAgfQotCi0gICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQotICAgewotICAgICAgaWYgKHNiaXQtPmFscGhhID09IDAgfHwgc2JpdC0+YWxwaGEgPiBwbmdfcHRyLT51c3JfYml0X2RlcHRoKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgc0JJVCBkZXB0aCBzcGVjaWZpZWQiKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJ1ZltzaXplKytdID0gc2JpdC0+YWxwaGE7Ci0gICB9Ci0KLSAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19zQklULCBidWYsIHNpemUpOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9jSFJNX1NVUFBPUlRFRCkKLS8qIFdyaXRlIHRoZSBjSFJNIGNodW5rICovCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfY0hSTShwbmdfc3RydWN0cCBwbmdfcHRyLCBkb3VibGUgd2hpdGVfeCwgZG91YmxlIHdoaXRlX3ksCi0gICBkb3VibGUgcmVkX3gsIGRvdWJsZSByZWRfeSwgZG91YmxlIGdyZWVuX3gsIGRvdWJsZSBncmVlbl95LAotICAgZG91YmxlIGJsdWVfeCwgZG91YmxlIGJsdWVfeSkKLXsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgUE5HX2NIUk07Ci0jZW5kaWYKLSAgIHBuZ19ieXRlIGJ1ZlszMl07Ci0KLSAgIHBuZ19maXhlZF9wb2ludCBpbnRfd2hpdGVfeCwgaW50X3doaXRlX3ksIGludF9yZWRfeCwgaW50X3JlZF95LAotICAgICAgaW50X2dyZWVuX3gsIGludF9ncmVlbl95LCBpbnRfYmx1ZV94LCBpbnRfYmx1ZV95OwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9jSFJNIik7Ci0KLSAgIGludF93aGl0ZV94ID0gKHBuZ191aW50XzMyKSh3aGl0ZV94ICogMTAwMDAwLjAgKyAwLjUpOwotICAgaW50X3doaXRlX3kgPSAocG5nX3VpbnRfMzIpKHdoaXRlX3kgKiAxMDAwMDAuMCArIDAuNSk7Ci0gICBpbnRfcmVkX3ggICA9IChwbmdfdWludF8zMikocmVkX3ggICAqIDEwMDAwMC4wICsgMC41KTsKLSAgIGludF9yZWRfeSAgID0gKHBuZ191aW50XzMyKShyZWRfeSAgICogMTAwMDAwLjAgKyAwLjUpOwotICAgaW50X2dyZWVuX3ggPSAocG5nX3VpbnRfMzIpKGdyZWVuX3ggKiAxMDAwMDAuMCArIDAuNSk7Ci0gICBpbnRfZ3JlZW5feSA9IChwbmdfdWludF8zMikoZ3JlZW5feSAqIDEwMDAwMC4wICsgMC41KTsKLSAgIGludF9ibHVlX3ggID0gKHBuZ191aW50XzMyKShibHVlX3ggICogMTAwMDAwLjAgKyAwLjUpOwotICAgaW50X2JsdWVfeSAgPSAocG5nX3VpbnRfMzIpKGJsdWVfeSAgKiAxMDAwMDAuMCArIDAuNSk7Ci0KLSNpZiAhZGVmaW5lZChQTkdfTk9fQ0hFQ0tfY0hSTSkKLSAgIGlmIChwbmdfY2hlY2tfY0hSTV9maXhlZChwbmdfcHRyLCBpbnRfd2hpdGVfeCwgaW50X3doaXRlX3ksCi0gICAgICBpbnRfcmVkX3gsIGludF9yZWRfeSwgaW50X2dyZWVuX3gsIGludF9ncmVlbl95LCBpbnRfYmx1ZV94LCBpbnRfYmx1ZV95KSkKLSNlbmRpZgotICAgewotICAgICAgLyogRWFjaCB2YWx1ZSBpcyBzYXZlZCBpbiAxLzEwMCwwMDB0aHMgKi8KLSAgICAKLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmLCBpbnRfd2hpdGVfeCk7Ci0gICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiArIDQsIGludF93aGl0ZV95KTsKLQotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyA4LCBpbnRfcmVkX3gpOwotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyAxMiwgaW50X3JlZF95KTsKLQotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyAxNiwgaW50X2dyZWVuX3gpOwotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyAyMCwgaW50X2dyZWVuX3kpOwotCi0gICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiArIDI0LCBpbnRfYmx1ZV94KTsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMjgsIGludF9ibHVlX3kpOwotCi0gICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfY0hSTSwgYnVmLCAocG5nX3NpemVfdCkzMik7Ci0gICB9Ci19Ci0jZW5kaWYKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9jSFJNX2ZpeGVkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19maXhlZF9wb2ludCB3aGl0ZV94LAotICAgcG5nX2ZpeGVkX3BvaW50IHdoaXRlX3ksIHBuZ19maXhlZF9wb2ludCByZWRfeCwgcG5nX2ZpeGVkX3BvaW50IHJlZF95LAotICAgcG5nX2ZpeGVkX3BvaW50IGdyZWVuX3gsIHBuZ19maXhlZF9wb2ludCBncmVlbl95LCBwbmdfZml4ZWRfcG9pbnQgYmx1ZV94LAotICAgcG5nX2ZpeGVkX3BvaW50IGJsdWVfeSkKLXsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgUE5HX2NIUk07Ci0jZW5kaWYKLSAgIHBuZ19ieXRlIGJ1ZlszMl07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2NIUk0iKTsKLSAgIC8qIEVhY2ggdmFsdWUgaXMgc2F2ZWQgaW4gMS8xMDAsMDAwdGhzICovCi0jaWYgIWRlZmluZWQoUE5HX05PX0NIRUNLX2NIUk0pCi0gICBpZiAocG5nX2NoZWNrX2NIUk1fZml4ZWQocG5nX3B0ciwgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LAotICAgICAgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3kpKQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiwgKHBuZ191aW50XzMyKXdoaXRlX3gpOwotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyA0LCAocG5nX3VpbnRfMzIpd2hpdGVfeSk7Ci0KLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgOCwgKHBuZ191aW50XzMyKXJlZF94KTsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMTIsIChwbmdfdWludF8zMilyZWRfeSk7Ci0KLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMTYsIChwbmdfdWludF8zMilncmVlbl94KTsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgMjAsIChwbmdfdWludF8zMilncmVlbl95KTsKLQotICAgICAgcG5nX3NhdmVfdWludF8zMihidWYgKyAyNCwgKHBuZ191aW50XzMyKWJsdWVfeCk7Ci0gICAgICBwbmdfc2F2ZV91aW50XzMyKGJ1ZiArIDI4LCAocG5nX3VpbnRfMzIpYmx1ZV95KTsKLQotICAgICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX2NIUk0sIGJ1ZiwgKHBuZ19zaXplX3QpMzIpOwotICAgfQotfQotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVEKQotLyogV3JpdGUgdGhlIHRSTlMgY2h1bmsgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX3RSTlMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIHRyYW5zLCBwbmdfY29sb3JfMTZwIHRyYW4sCi0gICBpbnQgbnVtX3RyYW5zLCBpbnQgY29sb3JfdHlwZSkKLXsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgUE5HX3RSTlM7Ci0jZW5kaWYKLSAgIHBuZ19ieXRlIGJ1Zls2XTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfdFJOUyIpOwotICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgIHsKLSAgICAgIGlmIChudW1fdHJhbnMgPD0gMCB8fCBudW1fdHJhbnMgPiAoaW50KXBuZ19wdHItPm51bV9wYWxldHRlKQotICAgICAgewotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgbnVtYmVyIG9mIHRyYW5zcGFyZW50IGNvbG9ycyBzcGVjaWZpZWQiKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIC8qIFdyaXRlIHRoZSBjaHVuayBvdXQgYXMgaXQgaXMgKi8KLSAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ190Uk5TLCB0cmFucywKLSAgICAgICAgKHBuZ19zaXplX3QpbnVtX3RyYW5zKTsKLSAgIH0KLSAgIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkKLSAgIHsKLSAgICAgIC8qIE9uZSAxNiBiaXQgdmFsdWUgKi8KLSAgICAgIGlmICh0cmFuLT5ncmF5ID49ICgxIDw8IHBuZ19wdHItPmJpdF9kZXB0aCkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAiSWdub3JpbmcgYXR0ZW1wdCB0byB3cml0ZSB0Uk5TIGNodW5rIG91dC1vZi1yYW5nZSBmb3IgYml0X2RlcHRoIik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiwgdHJhbi0+Z3JheSk7Ci0gICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfdFJOUywgYnVmLCAocG5nX3NpemVfdCkyKTsKLSAgIH0KLSAgIGVsc2UgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgewotICAgICAgLyogVGhyZWUgMTYgYml0IHZhbHVlcyAqLwotICAgICAgcG5nX3NhdmVfdWludF8xNihidWYsIHRyYW4tPnJlZCk7Ci0gICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiArIDIsIHRyYW4tPmdyZWVuKTsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmICsgNCwgdHJhbi0+Ymx1ZSk7Ci0gICAgICBpZiAocG5nX3B0ci0+Yml0X2RlcHRoID09IDggJiYgKGJ1ZlswXSB8IGJ1ZlsyXSB8IGJ1Zls0XSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLAotICAgICAgICAgICAiSWdub3JpbmcgYXR0ZW1wdCB0byB3cml0ZSAxNi1iaXQgdFJOUyBjaHVuayB3aGVuIGJpdF9kZXB0aCBpcyA4Iik7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfdFJOUywgYnVmLCAocG5nX3NpemVfdCk2KTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJDYW4ndCB3cml0ZSB0Uk5TIHdpdGggYW4gYWxwaGEgY2hhbm5lbCIpOwotICAgfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9iS0dEX1NVUFBPUlRFRCkKLS8qIFdyaXRlIHRoZSBiYWNrZ3JvdW5kIGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9iS0dEKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb2xvcl8xNnAgYmFjaywgaW50IGNvbG9yX3R5cGUpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIFBOR19iS0dEOwotI2VuZGlmCi0gICBwbmdfYnl0ZSBidWZbNl07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2JLR0QiKTsKLSAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICB7Ci0gICAgICBpZiAoCi0jaWYgZGVmaW5lZChQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRCkKLSAgICAgICAgICAocG5nX3B0ci0+bnVtX3BhbGV0dGUgfHwKLSAgICAgICAgICAoIShwbmdfcHRyLT5tbmdfZmVhdHVyZXNfcGVybWl0dGVkICYgUE5HX0ZMQUdfTU5HX0VNUFRZX1BMVEUpKSkgJiYKLSNlbmRpZgotICAgICAgICAgYmFjay0+aW5kZXggPj0gcG5nX3B0ci0+bnVtX3BhbGV0dGUpCi0gICAgICB7Ci0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiSW52YWxpZCBiYWNrZ3JvdW5kIHBhbGV0dGUgaW5kZXgiKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJ1ZlswXSA9IGJhY2stPmluZGV4OwotICAgICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX2JLR0QsIGJ1ZiwgKHBuZ19zaXplX3QpMSk7Ci0gICB9Ci0gICBlbHNlIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICB7Ci0gICAgICBwbmdfc2F2ZV91aW50XzE2KGJ1ZiwgYmFjay0+cmVkKTsKLSAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmICsgMiwgYmFjay0+Z3JlZW4pOwotICAgICAgcG5nX3NhdmVfdWludF8xNihidWYgKyA0LCBiYWNrLT5ibHVlKTsKLSAgICAgIGlmIChwbmdfcHRyLT5iaXRfZGVwdGggPT0gOCAmJiAoYnVmWzBdIHwgYnVmWzJdIHwgYnVmWzRdKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgICJJZ25vcmluZyBhdHRlbXB0IHRvIHdyaXRlIDE2LWJpdCBiS0dEIGNodW5rIHdoZW4gYml0X2RlcHRoIGlzIDgiKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19iS0dELCBidWYsIChwbmdfc2l6ZV90KTYpOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgaWYgKGJhY2stPmdyYXkgPj0gKDEgPDwgcG5nX3B0ci0+Yml0X2RlcHRoKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsCi0gICAgICAgICAgICJJZ25vcmluZyBhdHRlbXB0IHRvIHdyaXRlIGJLR0QgY2h1bmsgb3V0LW9mLXJhbmdlIGZvciBiaXRfZGVwdGgiKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHBuZ19zYXZlX3VpbnRfMTYoYnVmLCBiYWNrLT5ncmF5KTsKLSAgICAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19iS0dELCBidWYsIChwbmdfc2l6ZV90KTIpOwotICAgfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9oSVNUX1NVUFBPUlRFRCkKLS8qIFdyaXRlIHRoZSBoaXN0b2dyYW0gKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX2hJU1QocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMTZwIGhpc3QsIGludCBudW1faGlzdCkKLXsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgUE5HX2hJU1Q7Ci0jZW5kaWYKLSAgIGludCBpOwotICAgcG5nX2J5dGUgYnVmWzNdOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9oSVNUIik7Ci0gICBpZiAobnVtX2hpc3QgPiAoaW50KXBuZ19wdHItPm51bV9wYWxldHRlKQotICAgewotICAgICAgcG5nX2RlYnVnMigzLCAibnVtX2hpc3QgPSAlZCwgbnVtX3BhbGV0dGUgPSAlZCIsIG51bV9oaXN0LAotICAgICAgICAgcG5nX3B0ci0+bnVtX3BhbGV0dGUpOwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgbnVtYmVyIG9mIGhpc3RvZ3JhbSBlbnRyaWVzIHNwZWNpZmllZCIpOwotICAgICAgcmV0dXJuOwotICAgfQotCi0gICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfaElTVCwKLSAgICAgKHBuZ191aW50XzMyKShudW1faGlzdCAqIDIpKTsKLSAgIGZvciAoaSA9IDA7IGkgPCBudW1faGlzdDsgaSsrKQotICAgewotICAgICAgcG5nX3NhdmVfdWludF8xNihidWYsIGhpc3RbaV0pOwotICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgYnVmLCAocG5nX3NpemVfdCkyKTsKLSAgIH0KLSAgIHBuZ193cml0ZV9jaHVua19lbmQocG5nX3B0cik7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1RFWFRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRCkgfHwgXAotICAgIGRlZmluZWQoUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9zUExUX1NVUFBPUlRFRCkKLS8qIENoZWNrIHRoYXQgdGhlIHRFWHQgb3IgelRYdCBrZXl3b3JkIGlzIHZhbGlkIHBlciBQTkcgMS4wIHNwZWNpZmljYXRpb24sCi0gKiBhbmQgaWYgaW52YWxpZCwgY29ycmVjdCB0aGUga2V5d29yZCByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIHRoZSBlbnRpcmUKLSAqIGNodW5rLiAgVGhlIFBORyAxLjAgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBrZXl3b3JkcyAxLTc5IGNoYXJhY3RlcnMgaW4KLSAqIGxlbmd0aCwgZm9yYmlkcyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UsIG11bHRpcGxlIGludGVybmFsIHNwYWNlcywKLSAqIGFuZCB0aGUgbm9uLWJyZWFrIHNwYWNlICgweDgwKSBmcm9tIElTTyA4ODU5LTEuICBSZXR1cm5zIGtleXdvcmQgbGVuZ3RoLgotICoKLSAqIFRoZSBuZXdfa2V5IGlzIGFsbG9jYXRlZCB0byBob2xkIHRoZSBjb3JyZWN0ZWQga2V5d29yZCBhbmQgbXVzdCBiZSBmcmVlZAotICogYnkgdGhlIGNhbGxpbmcgcm91dGluZS4gIFRoaXMgYXZvaWRzIHByb2JsZW1zIHdpdGggdHJ5aW5nIHRvIHdyaXRlIHRvCi0gKiBzdGF0aWMga2V5d29yZHMgd2l0aG91dCBoYXZpbmcgdG8gaGF2ZSBkdXBsaWNhdGUgY29waWVzIG9mIHRoZSBzdHJpbmdzLgotICovCi1wbmdfc2l6ZV90IC8qIFBSSVZBVEUgKi8KLXBuZ19jaGVja19rZXl3b3JkKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jaGFycCBrZXksIHBuZ19jaGFycHAgbmV3X2tleSkKLXsKLSAgIHBuZ19zaXplX3Qga2V5X2xlbjsKLSAgIHBuZ19jaGFycCBrcCwgZHA7Ci0gICBpbnQga2ZsYWc7Ci0gICBpbnQga3dhcm49MDsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfY2hlY2tfa2V5d29yZCIpOwotICAgKm5ld19rZXkgPSBOVUxMOwotCi0gICBpZiAoa2V5ID09IE5VTEwgfHwgKGtleV9sZW4gPSBwbmdfc3RybGVuKGtleSkpID09IDApCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiemVybyBsZW5ndGgga2V5d29yZCIpOwotICAgICAgcmV0dXJuICgocG5nX3NpemVfdCkwKTsKLSAgIH0KLQotICAgcG5nX2RlYnVnMSgyLCAiS2V5d29yZCB0byBiZSBjaGVja2VkIGlzICclcyciLCBrZXkpOwotCi0gICAqbmV3X2tleSA9IChwbmdfY2hhcnApcG5nX21hbGxvY193YXJuKHBuZ19wdHIsIChwbmdfdWludF8zMikoa2V5X2xlbiArIDIpKTsKLSAgIGlmICgqbmV3X2tleSA9PSBOVUxMKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIk91dCBvZiBtZW1vcnkgd2hpbGUgcHJvY2VzaW5nIGtleXdvcmQiKTsKLSAgICAgIHJldHVybiAoKHBuZ19zaXplX3QpMCk7Ci0gICB9Ci0KLSAgIC8qIFJlcGxhY2Ugbm9uLXByaW50aW5nIGNoYXJhY3RlcnMgd2l0aCBhIGJsYW5rIGFuZCBwcmludCBhIHdhcm5pbmcgKi8KLSAgIGZvciAoa3AgPSBrZXksIGRwID0gKm5ld19rZXk7ICprcCAhPSAnXDAnOyBrcCsrLCBkcCsrKQotICAgewotICAgICAgaWYgKChwbmdfYnl0ZSkqa3AgPCAweDIwIHx8Ci0gICAgICAgICAoKHBuZ19ieXRlKSprcCA+IDB4N0UgJiYgKHBuZ19ieXRlKSprcCA8IDB4QTEpKQotICAgICAgewotI2lmICFkZWZpbmVkKFBOR19OT19TVERJTykgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKLSAgICAgICAgIGNoYXIgbXNnWzQwXTsKLQotICAgICAgICAgcG5nX3NucHJpbnRmKG1zZywgNDAsCi0gICAgICAgICAgICJpbnZhbGlkIGtleXdvcmQgY2hhcmFjdGVyIDB4JTAyWCIsIChwbmdfYnl0ZSkqa3ApOwotICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgbXNnKTsKLSNlbHNlCi0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiaW52YWxpZCBjaGFyYWN0ZXIgaW4ga2V5d29yZCIpOwotI2VuZGlmCi0gICAgICAgICAqZHAgPSAnICc7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAqZHAgPSAqa3A7Ci0gICAgICB9Ci0gICB9Ci0gICAqZHAgPSAnXDAnOwotCi0gICAvKiBSZW1vdmUgYW55IHRyYWlsaW5nIHdoaXRlIHNwYWNlLiAqLwotICAga3AgPSAqbmV3X2tleSArIGtleV9sZW4gLSAxOwotICAgaWYgKCprcCA9PSAnICcpCi0gICB7Ci0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAidHJhaWxpbmcgc3BhY2VzIHJlbW92ZWQgZnJvbSBrZXl3b3JkIik7Ci0KLSAgICAgIHdoaWxlICgqa3AgPT0gJyAnKQotICAgICAgewotICAgICAgICAgKihrcC0tKSA9ICdcMCc7Ci0gICAgICAgICBrZXlfbGVuLS07Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIFJlbW92ZSBhbnkgbGVhZGluZyB3aGl0ZSBzcGFjZS4gKi8KLSAgIGtwID0gKm5ld19rZXk7Ci0gICBpZiAoKmtwID09ICcgJykKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJsZWFkaW5nIHNwYWNlcyByZW1vdmVkIGZyb20ga2V5d29yZCIpOwotCi0gICAgICB3aGlsZSAoKmtwID09ICcgJykKLSAgICAgIHsKLSAgICAgICAgIGtwKys7Ci0gICAgICAgICBrZXlfbGVuLS07Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHBuZ19kZWJ1ZzEoMiwgIkNoZWNraW5nIGZvciBtdWx0aXBsZSBpbnRlcm5hbCBzcGFjZXMgaW4gJyVzJyIsIGtwKTsKLQotICAgLyogUmVtb3ZlIG11bHRpcGxlIGludGVybmFsIHNwYWNlcy4gKi8KLSAgIGZvciAoa2ZsYWcgPSAwLCBkcCA9ICpuZXdfa2V5OyAqa3AgIT0gJ1wwJzsga3ArKykKLSAgIHsKLSAgICAgIGlmICgqa3AgPT0gJyAnICYmIGtmbGFnID09IDApCi0gICAgICB7Ci0gICAgICAgICAqKGRwKyspID0gKmtwOwotICAgICAgICAga2ZsYWcgPSAxOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoKmtwID09ICcgJykKLSAgICAgIHsKLSAgICAgICAgIGtleV9sZW4tLTsKLSAgICAgICAgIGt3YXJuPTE7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAqKGRwKyspID0gKmtwOwotICAgICAgICAga2ZsYWcgPSAwOwotICAgICAgfQotICAgfQotICAgKmRwID0gJ1wwJzsKLSAgIGlmIChrd2FybikKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJleHRyYSBpbnRlcmlvciBzcGFjZXMgcmVtb3ZlZCBmcm9tIGtleXdvcmQiKTsKLQotICAgaWYgKGtleV9sZW4gPT0gMCkKLSAgIHsKLSAgICAgIHBuZ19mcmVlKHBuZ19wdHIsICpuZXdfa2V5KTsKLSAgICAgICAqbmV3X2tleT1OVUxMOwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlplcm8gbGVuZ3RoIGtleXdvcmQiKTsKLSAgIH0KLQotICAgaWYgKGtleV9sZW4gPiA3OSkKLSAgIHsKLSAgICAgIHBuZ193YXJuaW5nKHBuZ19wdHIsICJrZXl3b3JkIGxlbmd0aCBtdXN0IGJlIDEgLSA3OSBjaGFyYWN0ZXJzIik7Ci0gICAgICAoKm5ld19rZXkpWzc5XSA9ICdcMCc7Ci0gICAgICBrZXlfbGVuID0gNzk7Ci0gICB9Ci0KLSAgIHJldHVybiAoa2V5X2xlbik7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVEKQotLyogV3JpdGUgYSB0RVh0IGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV90RVh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jaGFycCBrZXksIHBuZ19jaGFycCB0ZXh0LAotICAgcG5nX3NpemVfdCB0ZXh0X2xlbikKLXsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgUE5HX3RFWHQ7Ci0jZW5kaWYKLSAgIHBuZ19zaXplX3Qga2V5X2xlbjsKLSAgIHBuZ19jaGFycCBuZXdfa2V5OwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV90RVh0Iik7Ci0gICBpZiAoKGtleV9sZW4gPSBwbmdfY2hlY2tfa2V5d29yZChwbmdfcHRyLCBrZXksICZuZXdfa2V5KSk9PTApCi0gICAgICByZXR1cm47Ci0KLSAgIGlmICh0ZXh0ID09IE5VTEwgfHwgKnRleHQgPT0gJ1wwJykKLSAgICAgIHRleHRfbGVuID0gMDsKLSAgIGVsc2UKLSAgICAgIHRleHRfbGVuID0gcG5nX3N0cmxlbih0ZXh0KTsKLQotICAgLyogTWFrZSBzdXJlIHdlIGluY2x1ZGUgdGhlIDAgYWZ0ZXIgdGhlIGtleSAqLwotICAgcG5nX3dyaXRlX2NodW5rX3N0YXJ0KHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3RFWHQsCi0gICAgICAocG5nX3VpbnRfMzIpKGtleV9sZW4gKyB0ZXh0X2xlbiArIDEpKTsKLSAgIC8qCi0gICAgKiBXZSBsZWF2ZSBpdCB0byB0aGUgYXBwbGljYXRpb24gdG8gbWVldCBQTkctMS4wIHJlcXVpcmVtZW50cyBvbiB0aGUKLSAgICAqIGNvbnRlbnRzIG9mIHRoZSB0ZXh0LiAgUE5HLTEuMCB0aHJvdWdoIFBORy0xLjIgZGlzY291cmFnZSB0aGUgdXNlIG9mCi0gICAgKiBhbnkgbm9uLUxhdGluLTEgY2hhcmFjdGVycyBleGNlcHQgZm9yIE5FV0xJTkUuICBJU08gUE5HIHdpbGwgZm9yYmlkIHRoZW0uCi0gICAgKiBUaGUgTlVMIGNoYXJhY3RlciBpcyBmb3JiaWRkZW4gYnkgUE5HLTEuMCB0aHJvdWdoIFBORy0xLjIgYW5kIElTTyBQTkcuCi0gICAgKi8KLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApbmV3X2tleSwKLSAgICAgKHBuZ19zaXplX3QpKGtleV9sZW4gKyAxKSk7Ci0gICBpZiAodGV4dF9sZW4pCi0gICAgICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKXRleHQsIChwbmdfc2l6ZV90KXRleHRfbGVuKTsKLQotICAgcG5nX3dyaXRlX2NodW5rX2VuZChwbmdfcHRyKTsKLSAgIHBuZ19mcmVlKHBuZ19wdHIsIG5ld19rZXkpOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV96VFh0X1NVUFBPUlRFRCkKLS8qIFdyaXRlIGEgY29tcHJlc3NlZCB0ZXh0IGNodW5rICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV96VFh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jaGFycCBrZXksIHBuZ19jaGFycCB0ZXh0LAotICAgcG5nX3NpemVfdCB0ZXh0X2xlbiwgaW50IGNvbXByZXNzaW9uKQotewotI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCi0gICBQTkdfelRYdDsKLSNlbmRpZgotICAgcG5nX3NpemVfdCBrZXlfbGVuOwotICAgY2hhciBidWZbMV07Ci0gICBwbmdfY2hhcnAgbmV3X2tleTsKLSAgIGNvbXByZXNzaW9uX3N0YXRlIGNvbXA7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3pUWHQiKTsKLQotICAgY29tcC5udW1fb3V0cHV0X3B0ciA9IDA7Ci0gICBjb21wLm1heF9vdXRwdXRfcHRyID0gMDsKLSAgIGNvbXAub3V0cHV0X3B0ciA9IE5VTEw7Ci0gICBjb21wLmlucHV0ID0gTlVMTDsKLSAgIGNvbXAuaW5wdXRfbGVuID0gMDsKLQotICAgaWYgKChrZXlfbGVuID0gcG5nX2NoZWNrX2tleXdvcmQocG5nX3B0ciwga2V5LCAmbmV3X2tleSkpPT0wKQotICAgewotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X2tleSk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGlmICh0ZXh0ID09IE5VTEwgfHwgKnRleHQgPT0gJ1wwJyB8fCBjb21wcmVzc2lvbj09UE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSkKLSAgIHsKLSAgICAgIHBuZ193cml0ZV90RVh0KHBuZ19wdHIsIG5ld19rZXksIHRleHQsIChwbmdfc2l6ZV90KTApOwotICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X2tleSk7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIHRleHRfbGVuID0gcG5nX3N0cmxlbih0ZXh0KTsKLQotICAgLyogQ29tcHV0ZSB0aGUgY29tcHJlc3NlZCBkYXRhOyBkbyBpdCBub3cgZm9yIHRoZSBsZW5ndGggKi8KLSAgIHRleHRfbGVuID0gcG5nX3RleHRfY29tcHJlc3MocG5nX3B0ciwgdGV4dCwgdGV4dF9sZW4sIGNvbXByZXNzaW9uLAotICAgICAgICZjb21wKTsKLQotICAgLyogV3JpdGUgc3RhcnQgb2YgY2h1bmsgKi8KLSAgIHBuZ193cml0ZV9jaHVua19zdGFydChwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ196VFh0LAotICAgICAocG5nX3VpbnRfMzIpKGtleV9sZW4rdGV4dF9sZW4gKyAyKSk7Ci0gICAvKiBXcml0ZSBrZXkgKi8KLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApbmV3X2tleSwKLSAgICAgKHBuZ19zaXplX3QpKGtleV9sZW4gKyAxKSk7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfa2V5KTsKLQotICAgYnVmWzBdID0gKHBuZ19ieXRlKWNvbXByZXNzaW9uOwotICAgLyogV3JpdGUgY29tcHJlc3Npb24gKi8KLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApYnVmLCAocG5nX3NpemVfdCkxKTsKLSAgIC8qIFdyaXRlIHRoZSBjb21wcmVzc2VkIGRhdGEgKi8KLSAgIHBuZ193cml0ZV9jb21wcmVzc2VkX2RhdGFfb3V0KHBuZ19wdHIsICZjb21wKTsKLQotICAgLyogQ2xvc2UgdGhlIGNodW5rICovCi0gICBwbmdfd3JpdGVfY2h1bmtfZW5kKHBuZ19wdHIpOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9pVFh0X1NVUFBPUlRFRCkKLS8qIFdyaXRlIGFuIGlUWHQgY2h1bmsgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX2lUWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IGNvbXByZXNzaW9uLCBwbmdfY2hhcnAga2V5LAotICAgIHBuZ19jaGFycCBsYW5nLCBwbmdfY2hhcnAgbGFuZ19rZXksIHBuZ19jaGFycCB0ZXh0KQotewotI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCi0gICBQTkdfaVRYdDsKLSNlbmRpZgotICAgcG5nX3NpemVfdCBsYW5nX2xlbiwga2V5X2xlbiwgbGFuZ19rZXlfbGVuLCB0ZXh0X2xlbjsKLSAgIHBuZ19jaGFycCBuZXdfbGFuZzsKLSAgIHBuZ19jaGFycCBuZXdfa2V5ID0gTlVMTDsKLSAgIHBuZ19ieXRlIGNidWZbMl07Ci0gICBjb21wcmVzc2lvbl9zdGF0ZSBjb21wOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9pVFh0Iik7Ci0KLSAgIGNvbXAubnVtX291dHB1dF9wdHIgPSAwOwotICAgY29tcC5tYXhfb3V0cHV0X3B0ciA9IDA7Ci0gICBjb21wLm91dHB1dF9wdHIgPSBOVUxMOwotICAgY29tcC5pbnB1dCA9IE5VTEw7Ci0KLSAgIGlmICgoa2V5X2xlbiA9IHBuZ19jaGVja19rZXl3b3JkKHBuZ19wdHIsIGtleSwgJm5ld19rZXkpKT09MCkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKChsYW5nX2xlbiA9IHBuZ19jaGVja19rZXl3b3JkKHBuZ19wdHIsIGxhbmcsICZuZXdfbGFuZykpPT0wKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkVtcHR5IGxhbmd1YWdlIGZpZWxkIGluIGlUWHQgY2h1bmsiKTsKLSAgICAgIG5ld19sYW5nID0gTlVMTDsKLSAgICAgIGxhbmdfbGVuID0gMDsKLSAgIH0KLQotICAgaWYgKGxhbmdfa2V5ID09IE5VTEwpCi0gICAgICBsYW5nX2tleV9sZW4gPSAwOwotICAgZWxzZQotICAgICAgbGFuZ19rZXlfbGVuID0gcG5nX3N0cmxlbihsYW5nX2tleSk7Ci0KLSAgIGlmICh0ZXh0ID09IE5VTEwpCi0gICAgICB0ZXh0X2xlbiA9IDA7Ci0gICBlbHNlCi0gICAgICB0ZXh0X2xlbiA9IHBuZ19zdHJsZW4odGV4dCk7Ci0KLSAgIC8qIENvbXB1dGUgdGhlIGNvbXByZXNzZWQgZGF0YTsgZG8gaXQgbm93IGZvciB0aGUgbGVuZ3RoICovCi0gICB0ZXh0X2xlbiA9IHBuZ190ZXh0X2NvbXByZXNzKHBuZ19wdHIsIHRleHQsIHRleHRfbGVuLCBjb21wcmVzc2lvbi0yLAotICAgICAgJmNvbXApOwotCi0KLSAgIC8qIE1ha2Ugc3VyZSB3ZSBpbmNsdWRlIHRoZSBjb21wcmVzc2lvbiBmbGFnLCB0aGUgY29tcHJlc3Npb24gYnl0ZSwKLSAgICAqIGFuZCB0aGUgTlVMcyBhZnRlciB0aGUga2V5LCBsYW5nLCBhbmQgbGFuZ19rZXkgcGFydHMgKi8KLQotICAgcG5nX3dyaXRlX2NodW5rX3N0YXJ0KHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX2lUWHQsCi0gICAgICAgICAgKHBuZ191aW50XzMyKSgKLSAgICAgICAgNSAvKiBjb21wIGJ5dGUsIGNvbXAgZmxhZywgdGVybWluYXRvcnMgZm9yIGtleSwgbGFuZyBhbmQgbGFuZ19rZXkgKi8KLSAgICAgICAgKyBrZXlfbGVuCi0gICAgICAgICsgbGFuZ19sZW4KLSAgICAgICAgKyBsYW5nX2tleV9sZW4KLSAgICAgICAgKyB0ZXh0X2xlbikpOwotCi0gICAvKiBXZSBsZWF2ZSBpdCB0byB0aGUgYXBwbGljYXRpb24gdG8gbWVldCBQTkctMS4wIHJlcXVpcmVtZW50cyBvbiB0aGUKLSAgICAqIGNvbnRlbnRzIG9mIHRoZSB0ZXh0LiAgUE5HLTEuMCB0aHJvdWdoIFBORy0xLjIgZGlzY291cmFnZSB0aGUgdXNlIG9mCi0gICAgKiBhbnkgbm9uLUxhdGluLTEgY2hhcmFjdGVycyBleGNlcHQgZm9yIE5FV0xJTkUuICBJU08gUE5HIHdpbGwgZm9yYmlkIHRoZW0uCi0gICAgKiBUaGUgTlVMIGNoYXJhY3RlciBpcyBmb3JiaWRkZW4gYnkgUE5HLTEuMCB0aHJvdWdoIFBORy0xLjIgYW5kIElTTyBQTkcuCi0gICAgKi8KLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChwbmdfYnl0ZXApbmV3X2tleSwKLSAgICAgKHBuZ19zaXplX3QpKGtleV9sZW4gKyAxKSk7Ci0KLSAgIC8qIFNldCB0aGUgY29tcHJlc3Npb24gZmxhZyAqLwotICAgaWYgKGNvbXByZXNzaW9uID09IFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUgfHwgXAotICAgICAgIGNvbXByZXNzaW9uID09IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUpCi0gICAgICAgY2J1ZlswXSA9IDA7Ci0gICBlbHNlIC8qIGNvbXByZXNzaW9uID09IFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQgKi8KLSAgICAgICBjYnVmWzBdID0gMTsKLSAgIC8qIFNldCB0aGUgY29tcHJlc3Npb24gbWV0aG9kICovCi0gICBjYnVmWzFdID0gMDsKLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGNidWYsIChwbmdfc2l6ZV90KTIpOwotCi0gICBjYnVmWzBdID0gMDsKLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIChuZXdfbGFuZyA/IChwbmdfYnl0ZXApbmV3X2xhbmcgOiBjYnVmKSwKLSAgICAgKHBuZ19zaXplX3QpKGxhbmdfbGVuICsgMSkpOwotICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKGxhbmdfa2V5ID8gKHBuZ19ieXRlcClsYW5nX2tleSA6IGNidWYpLAotICAgICAocG5nX3NpemVfdCkobGFuZ19rZXlfbGVuICsgMSkpOwotICAgcG5nX3dyaXRlX2NvbXByZXNzZWRfZGF0YV9vdXQocG5nX3B0ciwgJmNvbXApOwotCi0gICBwbmdfd3JpdGVfY2h1bmtfZW5kKHBuZ19wdHIpOwotICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X2tleSk7Ci0gICBwbmdfZnJlZShwbmdfcHRyLCBuZXdfbGFuZyk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX29GRnNfU1VQUE9SVEVEKQotLyogV3JpdGUgdGhlIG9GRnMgY2h1bmsgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX29GRnMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2ludF8zMiB4X29mZnNldCwgcG5nX2ludF8zMiB5X29mZnNldCwKLSAgIGludCB1bml0X3R5cGUpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIFBOR19vRkZzOwotI2VuZGlmCi0gICBwbmdfYnl0ZSBidWZbOV07Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX29GRnMiKTsKLSAgIGlmICh1bml0X3R5cGUgPj0gUE5HX09GRlNFVF9MQVNUKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVucmVjb2duaXplZCB1bml0IHR5cGUgZm9yIG9GRnMgY2h1bmsiKTsKLQotICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiwgeF9vZmZzZXQpOwotICAgcG5nX3NhdmVfaW50XzMyKGJ1ZiArIDQsIHlfb2Zmc2V0KTsKLSAgIGJ1Zls4XSA9IChwbmdfYnl0ZSl1bml0X3R5cGU7Ci0KLSAgIHBuZ193cml0ZV9jaHVuayhwbmdfcHRyLCAocG5nX2J5dGVwKXBuZ19vRkZzLCBidWYsIChwbmdfc2l6ZV90KTkpOwotfQotI2VuZGlmCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfcENBTF9TVVBQT1JURUQpCi0vKiBXcml0ZSB0aGUgcENBTCBjaHVuayAoZGVzY3JpYmVkIGluIHRoZSBQTkcgZXh0ZW5zaW9ucyBkb2N1bWVudCkgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX3BDQUwocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NoYXJwIHB1cnBvc2UsIHBuZ19pbnRfMzIgWDAsCi0gICBwbmdfaW50XzMyIFgxLCBpbnQgdHlwZSwgaW50IG5wYXJhbXMsIHBuZ19jaGFycCB1bml0cywgcG5nX2NoYXJwcCBwYXJhbXMpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIFBOR19wQ0FMOwotI2VuZGlmCi0gICBwbmdfc2l6ZV90IHB1cnBvc2VfbGVuLCB1bml0c19sZW4sIHRvdGFsX2xlbjsKLSAgIHBuZ191aW50XzMycCBwYXJhbXNfbGVuOwotICAgcG5nX2J5dGUgYnVmWzEwXTsKLSAgIHBuZ19jaGFycCBuZXdfcHVycG9zZTsKLSAgIGludCBpOwotCi0gICBwbmdfZGVidWcxKDEsICJpbiBwbmdfd3JpdGVfcENBTCAoJWQgcGFyYW1ldGVycykiLCBucGFyYW1zKTsKLSAgIGlmICh0eXBlID49IFBOR19FUVVBVElPTl9MQVNUKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVucmVjb2duaXplZCBlcXVhdGlvbiB0eXBlIGZvciBwQ0FMIGNodW5rIik7Ci0KLSAgIHB1cnBvc2VfbGVuID0gcG5nX2NoZWNrX2tleXdvcmQocG5nX3B0ciwgcHVycG9zZSwgJm5ld19wdXJwb3NlKSArIDE7Ci0gICBwbmdfZGVidWcxKDMsICJwQ0FMIHB1cnBvc2UgbGVuZ3RoID0gJWQiLCAoaW50KXB1cnBvc2VfbGVuKTsKLSAgIHVuaXRzX2xlbiA9IHBuZ19zdHJsZW4odW5pdHMpICsgKG5wYXJhbXMgPT0gMCA/IDAgOiAxKTsKLSAgIHBuZ19kZWJ1ZzEoMywgInBDQUwgdW5pdHMgbGVuZ3RoID0gJWQiLCAoaW50KXVuaXRzX2xlbik7Ci0gICB0b3RhbF9sZW4gPSBwdXJwb3NlX2xlbiArIHVuaXRzX2xlbiArIDEwOwotCi0gICBwYXJhbXNfbGVuID0gKHBuZ191aW50XzMycClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAocG5nX3VpbnRfMzIpKG5wYXJhbXMgKiBwbmdfc2l6ZW9mKHBuZ191aW50XzMyKSkpOwotCi0gICAvKiBGaW5kIHRoZSBsZW5ndGggb2YgZWFjaCBwYXJhbWV0ZXIsIG1ha2luZyBzdXJlIHdlIGRvbid0IGNvdW50IHRoZQotICAgICAgbnVsbCB0ZXJtaW5hdG9yIGZvciB0aGUgbGFzdCBwYXJhbWV0ZXIuICovCi0gICBmb3IgKGkgPSAwOyBpIDwgbnBhcmFtczsgaSsrKQotICAgewotICAgICAgcGFyYW1zX2xlbltpXSA9IHBuZ19zdHJsZW4ocGFyYW1zW2ldKSArIChpID09IG5wYXJhbXMgLSAxID8gMCA6IDEpOwotICAgICAgcG5nX2RlYnVnMigzLCAicENBTCBwYXJhbWV0ZXIgJWQgbGVuZ3RoID0gJWx1IiwgaSwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHBhcmFtc19sZW5baV0pOwotICAgICAgdG90YWxfbGVuICs9IChwbmdfc2l6ZV90KXBhcmFtc19sZW5baV07Ci0gICB9Ci0KLSAgIHBuZ19kZWJ1ZzEoMywgInBDQUwgdG90YWwgbGVuZ3RoID0gJWQiLCAoaW50KXRvdGFsX2xlbik7Ci0gICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfcENBTCwgKHBuZ191aW50XzMyKXRvdGFsX2xlbik7Ci0gICBwbmdfd3JpdGVfY2h1bmtfZGF0YShwbmdfcHRyLCAocG5nX2J5dGVwKW5ld19wdXJwb3NlLAotICAgICAocG5nX3NpemVfdClwdXJwb3NlX2xlbik7Ci0gICBwbmdfc2F2ZV9pbnRfMzIoYnVmLCBYMCk7Ci0gICBwbmdfc2F2ZV9pbnRfMzIoYnVmICsgNCwgWDEpOwotICAgYnVmWzhdID0gKHBuZ19ieXRlKXR5cGU7Ci0gICBidWZbOV0gPSAocG5nX2J5dGUpbnBhcmFtczsKLSAgIHBuZ193cml0ZV9jaHVua19kYXRhKHBuZ19wdHIsIGJ1ZiwgKHBuZ19zaXplX3QpMTApOwotICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19ieXRlcCl1bml0cywgKHBuZ19zaXplX3QpdW5pdHNfbGVuKTsKLQotICAgcG5nX2ZyZWUocG5nX3B0ciwgbmV3X3B1cnBvc2UpOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgbnBhcmFtczsgaSsrKQotICAgewotICAgICAgcG5nX3dyaXRlX2NodW5rX2RhdGEocG5nX3B0ciwgKHBuZ19ieXRlcClwYXJhbXNbaV0sCi0gICAgICAgICAocG5nX3NpemVfdClwYXJhbXNfbGVuW2ldKTsKLSAgIH0KLQotICAgcG5nX2ZyZWUocG5nX3B0ciwgcGFyYW1zX2xlbik7Ci0gICBwbmdfd3JpdGVfY2h1bmtfZW5kKHBuZ19wdHIpOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRCkKLS8qIFdyaXRlIHRoZSBzQ0FMIGNodW5rICovCi0jaWYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChQTkdfTk9fU1RESU8pCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9zQ0FMKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGludCB1bml0LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIFBOR19zQ0FMOwotI2VuZGlmCi0gICBjaGFyIGJ1Zls2NF07Ci0gICBwbmdfc2l6ZV90IHRvdGFsX2xlbjsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfc0NBTCIpOwotCi0gICBidWZbMF0gPSAoY2hhcil1bml0OwotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKLS8qIHNwcmludGYoKSBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NDRSAqLwotICAgewotICAgICAgd2NoYXJfdCB3Y19idWZbMzJdOwotICAgICAgc2l6ZV90IHdjX2xlbjsKLSAgICAgIHN3cHJpbnRmKHdjX2J1ZiwgVEVYVCgiJTEyLjEyZSIpLCB3aWR0aCk7Ci0gICAgICB3Y19sZW4gPSB3Y3NsZW4od2NfYnVmKTsKLSAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB3Y19idWYsIC0xLCBidWYgKyAxLCB3Y19sZW4sIE5VTEwsIE5VTEwpOwotICAgICAgdG90YWxfbGVuID0gd2NfbGVuICsgMjsKLSAgICAgIHN3cHJpbnRmKHdjX2J1ZiwgVEVYVCgiJTEyLjEyZSIpLCBoZWlnaHQpOwotICAgICAgd2NfbGVuID0gd2NzbGVuKHdjX2J1Zik7Ci0gICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgd2NfYnVmLCAtMSwgYnVmICsgdG90YWxfbGVuLCB3Y19sZW4sCi0gICAgICAgICBOVUxMLCBOVUxMKTsKLSAgICAgIHRvdGFsX2xlbiArPSB3Y19sZW47Ci0gICB9Ci0jZWxzZQotICAgcG5nX3NucHJpbnRmKGJ1ZiArIDEsIDYzLCAiJTEyLjEyZSIsIHdpZHRoKTsKLSAgIHRvdGFsX2xlbiA9IDEgKyBwbmdfc3RybGVuKGJ1ZiArIDEpICsgMTsKLSAgIHBuZ19zbnByaW50ZihidWYgKyB0b3RhbF9sZW4sIDY0LXRvdGFsX2xlbiwgIiUxMi4xMmUiLCBoZWlnaHQpOwotICAgdG90YWxfbGVuICs9IHBuZ19zdHJsZW4oYnVmICsgdG90YWxfbGVuKTsKLSNlbmRpZgotCi0gICBwbmdfZGVidWcxKDMsICJzQ0FMIHRvdGFsIGxlbmd0aCA9ICV1IiwgKHVuc2lnbmVkIGludCl0b3RhbF9sZW4pOwotICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3NDQUwsIChwbmdfYnl0ZXApYnVmLCB0b3RhbF9sZW4pOwotfQotI2Vsc2UKLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9zQ0FMX3MocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IHVuaXQsIHBuZ19jaGFycCB3aWR0aCwKLSAgIHBuZ19jaGFycCBoZWlnaHQpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIFBOR19zQ0FMOwotI2VuZGlmCi0gICBwbmdfYnl0ZSBidWZbNjRdOwotICAgcG5nX3NpemVfdCB3bGVuLCBobGVuLCB0b3RhbF9sZW47Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3NDQUxfcyIpOwotCi0gICB3bGVuID0gcG5nX3N0cmxlbih3aWR0aCk7Ci0gICBobGVuID0gcG5nX3N0cmxlbihoZWlnaHQpOwotICAgdG90YWxfbGVuID0gd2xlbiArIGhsZW4gKyAyOwotICAgaWYgKHRvdGFsX2xlbiA+IDY0KQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkNhbid0IHdyaXRlIHNDQUwgKGJ1ZmZlciB0b28gc21hbGwpIik7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIGJ1ZlswXSA9IChwbmdfYnl0ZSl1bml0OwotICAgcG5nX21lbWNweShidWYgKyAxLCB3aWR0aCwgd2xlbiArIDEpOyAgICAgIC8qIEFwcGVuZCB0aGUgJ1wwJyBoZXJlICovCi0gICBwbmdfbWVtY3B5KGJ1ZiArIHdsZW4gKyAyLCBoZWlnaHQsIGhsZW4pOyAgLyogRG8gTk9UIGFwcGVuZCB0aGUgJ1wwJyBoZXJlICovCi0KLSAgIHBuZ19kZWJ1ZzEoMywgInNDQUwgdG90YWwgbGVuZ3RoID0gJXUiLCAodW5zaWduZWQgaW50KXRvdGFsX2xlbik7Ci0gICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfc0NBTCwgYnVmLCB0b3RhbF9sZW4pOwotfQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfcEhZc19TVVBQT1JURUQpCi0vKiBXcml0ZSB0aGUgcEhZcyBjaHVuayAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfcEhZcyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiB4X3BpeGVsc19wZXJfdW5pdCwKLSAgIHBuZ191aW50XzMyIHlfcGl4ZWxzX3Blcl91bml0LAotICAgaW50IHVuaXRfdHlwZSkKLXsKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgUE5HX3BIWXM7Ci0jZW5kaWYKLSAgIHBuZ19ieXRlIGJ1Zls5XTsKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfcEhZcyIpOwotICAgaWYgKHVuaXRfdHlwZSA+PSBQTkdfUkVTT0xVVElPTl9MQVNUKQotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIlVucmVjb2duaXplZCB1bml0IHR5cGUgZm9yIHBIWXMgY2h1bmsiKTsKLQotICAgcG5nX3NhdmVfdWludF8zMihidWYsIHhfcGl4ZWxzX3Blcl91bml0KTsKLSAgIHBuZ19zYXZlX3VpbnRfMzIoYnVmICsgNCwgeV9waXhlbHNfcGVyX3VuaXQpOwotICAgYnVmWzhdID0gKHBuZ19ieXRlKXVuaXRfdHlwZTsKLQotICAgcG5nX3dyaXRlX2NodW5rKHBuZ19wdHIsIChwbmdfYnl0ZXApcG5nX3BIWXMsIGJ1ZiwgKHBuZ19zaXplX3QpOSk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVEKQotLyogV3JpdGUgdGhlIHRJTUUgY2h1bmsuICBVc2UgZWl0aGVyIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkKLSAqIG9yIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCksIG9yIGZpbGwgaW4gdGhlIHN0cnVjdHVyZSB5b3Vyc2VsZi4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfd3JpdGVfdElNRShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdGltZXAgbW9kX3RpbWUpCi17Ci0jaWZkZWYgUE5HX1VTRV9MT0NBTF9BUlJBWVMKLSAgIFBOR190SU1FOwotI2VuZGlmCi0gICBwbmdfYnl0ZSBidWZbN107Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX3RJTUUiKTsKLSAgIGlmIChtb2RfdGltZS0+bW9udGggID4gMTIgfHwgbW9kX3RpbWUtPm1vbnRoICA8IDEgfHwKLSAgICAgICBtb2RfdGltZS0+ZGF5ICAgID4gMzEgfHwgbW9kX3RpbWUtPmRheSAgICA8IDEgfHwKLSAgICAgICBtb2RfdGltZS0+aG91ciAgID4gMjMgfHwgbW9kX3RpbWUtPnNlY29uZCA+IDYwKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIkludmFsaWQgdGltZSBzcGVjaWZpZWQgZm9yIHRJTUUgY2h1bmsiKTsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgcG5nX3NhdmVfdWludF8xNihidWYsIG1vZF90aW1lLT55ZWFyKTsKLSAgIGJ1ZlsyXSA9IG1vZF90aW1lLT5tb250aDsKLSAgIGJ1ZlszXSA9IG1vZF90aW1lLT5kYXk7Ci0gICBidWZbNF0gPSBtb2RfdGltZS0+aG91cjsKLSAgIGJ1Zls1XSA9IG1vZF90aW1lLT5taW51dGU7Ci0gICBidWZbNl0gPSBtb2RfdGltZS0+c2Vjb25kOwotCi0gICBwbmdfd3JpdGVfY2h1bmsocG5nX3B0ciwgKHBuZ19ieXRlcClwbmdfdElNRSwgYnVmLCAocG5nX3NpemVfdCk3KTsKLX0KLSNlbmRpZgotCi0vKiBJbml0aWFsaXplcyB0aGUgcm93IHdyaXRpbmcgY2FwYWJpbGl0eSBvZiBsaWJwbmcgKi8KLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX3N0YXJ0X3Jvdyhwbmdfc3RydWN0cCBwbmdfcHRyKQotewotI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSNpZmRlZiBQTkdfVVNFX0xPQ0FMX0FSUkFZUwotICAgLyogQXJyYXlzIHRvIGZhY2lsaXRhdGUgZWFzeSBpbnRlcmxhY2luZyAtIHVzZSBwYXNzICgwIC0gNikgYXMgaW5kZXggKi8KLQotICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrICovCi0gICBpbnQgcG5nX3Bhc3Nfc3RhcnRbN10gPSB7MCwgNCwgMCwgMiwgMCwgMSwgMH07Ci0KLSAgIC8qIE9mZnNldCB0byBuZXh0IGludGVybGFjZSBibG9jayAqLwotICAgaW50IHBuZ19wYXNzX2luY1s3XSA9IHs4LCA4LCA0LCA0LCAyLCAyLCAxfTsKLQotICAgLyogU3RhcnQgb2YgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLwotICAgaW50IHBuZ19wYXNzX3lzdGFydFs3XSA9IHswLCAwLCA0LCAwLCAyLCAwLCAxfTsKLQotICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrIGluIHRoZSB5IGRpcmVjdGlvbiAqLwotICAgaW50IHBuZ19wYXNzX3lpbmNbN10gPSB7OCwgOCwgOCwgNCwgNCwgMiwgMn07Ci0jZW5kaWYKLSNlbmRpZgotCi0gICBwbmdfc2l6ZV90IGJ1Zl9zaXplOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ193cml0ZV9zdGFydF9yb3ciKTsKLSAgIGJ1Zl9zaXplID0gKHBuZ19zaXplX3QpKFBOR19ST1dCWVRFUygKLSAgICAgIHBuZ19wdHItPnVzcl9jaGFubmVscypwbmdfcHRyLT51c3JfYml0X2RlcHRoLCBwbmdfcHRyLT53aWR0aCkgKyAxKTsKLQotICAgLyogU2V0IHVwIHJvdyBidWZmZXIgKi8KLSAgIHBuZ19wdHItPnJvd19idWYgPSAocG5nX2J5dGVwKXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgKHBuZ191aW50XzMyKWJ1Zl9zaXplKTsKLSAgIHBuZ19wdHItPnJvd19idWZbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX05PTkU7Ci0KLSNpZm5kZWYgUE5HX05PX1dSSVRFX0ZJTFRFUgotICAgLyogU2V0IHVwIGZpbHRlcmluZyBidWZmZXIsIGlmIHVzaW5nIHRoaXMgZmlsdGVyICovCi0gICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9TVUIpCi0gICB7Ci0gICAgICBwbmdfcHRyLT5zdWJfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAocG5nX3VpbnRfMzIpKHBuZ19wdHItPnJvd2J5dGVzICsgMSkpOwotICAgICAgcG5nX3B0ci0+c3ViX3Jvd1swXSA9IFBOR19GSUxURVJfVkFMVUVfU1VCOwotICAgfQotCi0gICAvKiBXZSBvbmx5IG5lZWQgdG8ga2VlcCB0aGUgcHJldmlvdXMgcm93IGlmIHdlIGFyZSB1c2luZyBvbmUgb2YgdGhlc2UuICovCi0gICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICYgKFBOR19GSUxURVJfQVZHIHwgUE5HX0ZJTFRFUl9VUCB8IFBOR19GSUxURVJfUEFFVEgpKQotICAgewotICAgICAvKiBTZXQgdXAgcHJldmlvdXMgcm93IGJ1ZmZlciAqLwotICAgICBwbmdfcHRyLT5wcmV2X3JvdyA9IChwbmdfYnl0ZXApcG5nX21hbGxvYyhwbmdfcHRyLAotICAgICAgICAocG5nX3VpbnRfMzIpYnVmX3NpemUpOwotICAgICBwbmdfbWVtc2V0KHBuZ19wdHItPnByZXZfcm93LCAwLCBidWZfc2l6ZSk7Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX1VQKQotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+dXBfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgIChwbmdfdWludF8zMikocG5nX3B0ci0+cm93Ynl0ZXMgKyAxKSk7Ci0gICAgICAgICBwbmdfcHRyLT51cF9yb3dbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX1VQOwotICAgICAgfQotCi0gICAgICBpZiAocG5nX3B0ci0+ZG9fZmlsdGVyICYgUE5HX0ZJTFRFUl9BVkcpCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5hdmdfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgIChwbmdfdWludF8zMikocG5nX3B0ci0+cm93Ynl0ZXMgKyAxKSk7Ci0gICAgICAgICBwbmdfcHRyLT5hdmdfcm93WzBdID0gUE5HX0ZJTFRFUl9WQUxVRV9BVkc7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwbmdfcHRyLT5kb19maWx0ZXIgJiBQTkdfRklMVEVSX1BBRVRIKQotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+cGFldGhfcm93ID0gKHBuZ19ieXRlcClwbmdfbWFsbG9jKHBuZ19wdHIsCi0gICAgICAgICAgIChwbmdfdWludF8zMikocG5nX3B0ci0+cm93Ynl0ZXMgKyAxKSk7Ci0gICAgICAgICBwbmdfcHRyLT5wYWV0aF9yb3dbMF0gPSBQTkdfRklMVEVSX1ZBTFVFX1BBRVRIOwotICAgICAgfQotICAgfQotI2VuZGlmIC8qIFBOR19OT19XUklURV9GSUxURVIgKi8KLQotI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgIC8qIElmIGludGVybGFjZWQsIHdlIG5lZWQgdG8gc2V0IHVwIHdpZHRoIGFuZCBoZWlnaHQgb2YgcGFzcyAqLwotICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQpCi0gICB7Ci0gICAgICBpZiAoIShwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19wdHItPm51bV9yb3dzID0gKHBuZ19wdHItPmhlaWdodCArIHBuZ19wYXNzX3lpbmNbMF0gLSAxIC0KLSAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFswXSkgLyBwbmdfcGFzc195aW5jWzBdOwotICAgICAgICAgcG5nX3B0ci0+dXNyX3dpZHRoID0gKHBuZ19wdHItPndpZHRoICsgcG5nX3Bhc3NfaW5jWzBdIC0gMSAtCi0gICAgICAgICAgICBwbmdfcGFzc19zdGFydFswXSkgLyBwbmdfcGFzc19pbmNbMF07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5udW1fcm93cyA9IHBuZ19wdHItPmhlaWdodDsKLSAgICAgICAgIHBuZ19wdHItPnVzcl93aWR0aCA9IHBuZ19wdHItPndpZHRoOwotICAgICAgfQotICAgfQotICAgZWxzZQotI2VuZGlmCi0gICB7Ci0gICAgICBwbmdfcHRyLT5udW1fcm93cyA9IHBuZ19wdHItPmhlaWdodDsKLSAgICAgIHBuZ19wdHItPnVzcl93aWR0aCA9IHBuZ19wdHItPndpZHRoOwotICAgfQotICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7Ci0gICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLX0KLQotLyogSW50ZXJuYWwgdXNlIG9ubHkuICBDYWxsZWQgd2hlbiBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgcm93IG9mIGRhdGEuICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9maW5pc2hfcm93KHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0jaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCi0gICAvKiBBcnJheXMgdG8gZmFjaWxpdGF0ZSBlYXN5IGludGVybGFjaW5nIC0gdXNlIHBhc3MgKDAgLSA2KSBhcyBpbmRleCAqLwotCi0gICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgKi8KLSAgIGludCBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsKLQotICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovCi0gICBpbnQgcG5nX3Bhc3NfaW5jWzddID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OwotCi0gICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCi0gICBpbnQgcG5nX3Bhc3NfeXN0YXJ0WzddID0gezAsIDAsIDQsIDAsIDIsIDAsIDF9OwotCi0gICAvKiBPZmZzZXQgdG8gbmV4dCBpbnRlcmxhY2UgYmxvY2sgaW4gdGhlIHkgZGlyZWN0aW9uICovCi0gICBpbnQgcG5nX3Bhc3NfeWluY1s3XSA9IHs4LCA4LCA4LCA0LCA0LCAyLCAyfTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgIGludCByZXQ7Ci0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2ZpbmlzaF9yb3ciKTsKLSAgIC8qIE5leHQgcm93ICovCi0gICBwbmdfcHRyLT5yb3dfbnVtYmVyKys7Ci0KLSAgIC8qIFNlZSBpZiB3ZSBhcmUgZG9uZSAqLwotICAgaWYgKHBuZ19wdHItPnJvd19udW1iZXIgPCBwbmdfcHRyLT5udW1fcm93cykKLSAgICAgIHJldHVybjsKLQotI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgIC8qIElmIGludGVybGFjZWQsIGdvIHRvIG5leHQgcGFzcyAqLwotICAgaWYgKHBuZ19wdHItPmludGVybGFjZWQpCi0gICB7Ci0gICAgICBwbmdfcHRyLT5yb3dfbnVtYmVyID0gMDsKLSAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKQotICAgICAgewotICAgICAgICAgcG5nX3B0ci0+cGFzcysrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgLyogTG9vcCB1bnRpbCB3ZSBmaW5kIGEgbm9uLXplcm8gd2lkdGggb3IgaGVpZ2h0IHBhc3MgKi8KLSAgICAgICAgIGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfcHRyLT5wYXNzKys7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cGFzcyA+PSA3KQotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBwbmdfcHRyLT51c3Jfd2lkdGggPSAocG5nX3B0ci0+d2lkdGggKwotICAgICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdIC0gMSAtCi0gICAgICAgICAgICAgICBwbmdfcGFzc19zdGFydFtwbmdfcHRyLT5wYXNzXSkgLwotICAgICAgICAgICAgICAgcG5nX3Bhc3NfaW5jW3BuZ19wdHItPnBhc3NdOwotICAgICAgICAgICAgcG5nX3B0ci0+bnVtX3Jvd3MgPSAocG5nX3B0ci0+aGVpZ2h0ICsKLSAgICAgICAgICAgICAgIHBuZ19wYXNzX3lpbmNbcG5nX3B0ci0+cGFzc10gLSAxIC0KLSAgICAgICAgICAgICAgIHBuZ19wYXNzX3lzdGFydFtwbmdfcHRyLT5wYXNzXSkgLwotICAgICAgICAgICAgICAgcG5nX3Bhc3NfeWluY1twbmdfcHRyLT5wYXNzXTsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgJiBQTkdfSU5URVJMQUNFKQotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9IHdoaWxlIChwbmdfcHRyLT51c3Jfd2lkdGggPT0gMCB8fCBwbmdfcHRyLT5udW1fcm93cyA9PSAwKTsKLQotICAgICAgfQotCi0gICAgICAvKiBSZXNldCB0aGUgcm93IGFib3ZlIHRoZSBpbWFnZSBmb3IgdGhlIG5leHQgcGFzcyAqLwotICAgICAgaWYgKHBuZ19wdHItPnBhc3MgPCA3KQotICAgICAgewotICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfcm93ICE9IE5VTEwpCi0gICAgICAgICAgICBwbmdfbWVtc2V0KHBuZ19wdHItPnByZXZfcm93LCAwLAotICAgICAgICAgICAgICAgKHBuZ19zaXplX3QpKFBOR19ST1dCWVRFUyhwbmdfcHRyLT51c3JfY2hhbm5lbHMqCi0gICAgICAgICAgICAgICBwbmdfcHRyLT51c3JfYml0X2RlcHRoLCBwbmdfcHRyLT53aWR0aCkpICsgMSk7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYKLQotICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlJ3ZlIGp1c3Qgd3JpdHRlbiB0aGUgbGFzdCByb3csIHNvIHdlIG5lZWQKLSAgICAgIHRvIGZsdXNoIHRoZSBjb21wcmVzc29yICovCi0gICBkbwotICAgewotICAgICAgLyogVGVsbCB0aGUgY29tcHJlc3NvciB3ZSBhcmUgZG9uZSAqLwotICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9GSU5JU0gpOwotICAgICAgLyogQ2hlY2sgZm9yIGFuIGVycm9yICovCi0gICAgICBpZiAocmV0ID09IFpfT0spCi0gICAgICB7Ci0gICAgICAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCBtb3JlIHJvb20gKi8KLSAgICAgICAgIGlmICghKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ193cml0ZV9JREFUKHBuZ19wdHIsIHBuZ19wdHItPnpidWYsIHBuZ19wdHItPnpidWZfc2l6ZSk7Ci0gICAgICAgICAgICBwbmdfcHRyLT56c3RyZWFtLm5leHRfb3V0ID0gcG5nX3B0ci0+emJ1ZjsKLSAgICAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpcG5nX3B0ci0+emJ1Zl9zaXplOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocmV0ICE9IFpfU1RSRUFNX0VORCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChwbmdfcHRyLT56c3RyZWFtLm1zZyAhPSBOVUxMKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHBuZ19wdHItPnpzdHJlYW0ubXNnKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiemxpYiBlcnJvciIpOwotICAgICAgfQotICAgfSB3aGlsZSAocmV0ICE9IFpfU1RSRUFNX0VORCk7Ci0KLSAgIC8qIFdyaXRlIGFueSBleHRyYSBzcGFjZSAqLwotICAgaWYgKHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0IDwgcG5nX3B0ci0+emJ1Zl9zaXplKQotICAgewotICAgICAgcG5nX3dyaXRlX0lEQVQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwgcG5nX3B0ci0+emJ1Zl9zaXplIC0KLSAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0uYXZhaWxfb3V0KTsKLSAgIH0KLQotICAgZGVmbGF0ZVJlc2V0KCZwbmdfcHRyLT56c3RyZWFtKTsKLSAgIHBuZ19wdHItPnpzdHJlYW0uZGF0YV90eXBlID0gWl9CSU5BUlk7Ci19Ci0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQpCi0vKiBQaWNrIG91dCB0aGUgY29ycmVjdCBwaXhlbHMgZm9yIHRoZSBpbnRlcmxhY2UgcGFzcy4KLSAqIFRoZSBiYXNpYyBpZGVhIGhlcmUgaXMgdG8gZ28gdGhyb3VnaCB0aGUgcm93IHdpdGggYSBzb3VyY2UKLSAqIHBvaW50ZXIgYW5kIGEgZGVzdGluYXRpb24gcG9pbnRlciAoc3AgYW5kIGRwKSwgYW5kIGNvcHkgdGhlCi0gKiBjb3JyZWN0IHBpeGVscyBmb3IgdGhlIHBhc3MuICBBcyB0aGUgcm93IGdldHMgY29tcGFjdGVkLAotICogc3Agd2lsbCBhbHdheXMgYmUgPj0gZHAsIHNvIHdlIHNob3VsZCBuZXZlciBvdmVyd3JpdGUgYW55dGhpbmcuCi0gKiBTZWUgdGhlIGRlZmF1bHQ6IGNhc2UgZm9yIHRoZSBlYXNpZXN0IGNvZGUgdG8gdW5kZXJzdGFuZC4KLSAqLwotdm9pZCAvKiBQUklWQVRFICovCi1wbmdfZG9fd3JpdGVfaW50ZXJsYWNlKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sIHBuZ19ieXRlcCByb3csIGludCBwYXNzKQotewotI2lmZGVmIFBOR19VU0VfTE9DQUxfQVJSQVlTCi0gICAvKiBBcnJheXMgdG8gZmFjaWxpdGF0ZSBlYXN5IGludGVybGFjaW5nIC0gdXNlIHBhc3MgKDAgLSA2KSBhcyBpbmRleCAqLwotCi0gICAvKiBTdGFydCBvZiBpbnRlcmxhY2UgYmxvY2sgKi8KLSAgIGludCBwbmdfcGFzc19zdGFydFs3XSA9IHswLCA0LCAwLCAyLCAwLCAxLCAwfTsKLQotICAgLyogT2Zmc2V0IHRvIG5leHQgaW50ZXJsYWNlIGJsb2NrICovCi0gICBpbnQgcG5nX3Bhc3NfaW5jWzddID0gezgsIDgsIDQsIDQsIDIsIDIsIDF9OwotI2VuZGlmCi0KLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX2RvX3dyaXRlX2ludGVybGFjZSIpOwotICAgLyogV2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBvbiB0aGUgbGFzdCBwYXNzICg2KSAqLwotI2lmIGRlZmluZWQoUE5HX1VTRUxFU1NfVEVTVFNfU1VQUE9SVEVEKQotICAgaWYgKHJvdyAhPSBOVUxMICYmIHJvd19pbmZvICE9IE5VTEwgJiYgcGFzcyA8IDYpCi0jZWxzZQotICAgaWYgKHBhc3MgPCA2KQotI2VuZGlmCi0gICB7Ci0gICAgICAvKiBFYWNoIHBpeGVsIGRlcHRoIGlzIGhhbmRsZWQgc2VwYXJhdGVseSAqLwotICAgICAgc3dpdGNoIChyb3dfaW5mby0+cGl4ZWxfZGVwdGgpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIDE6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgc3A7Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgZHA7Ci0gICAgICAgICAgICBpbnQgc2hpZnQ7Ci0gICAgICAgICAgICBpbnQgZDsKLSAgICAgICAgICAgIGludCB2YWx1ZTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0KLSAgICAgICAgICAgIGRwID0gcm93OwotICAgICAgICAgICAgZCA9IDA7Ci0gICAgICAgICAgICBzaGlmdCA9IDc7Ci0gICAgICAgICAgICBmb3IgKGkgPSBwbmdfcGFzc19zdGFydFtwYXNzXTsgaSA8IHJvd193aWR0aDsKLSAgICAgICAgICAgICAgIGkgKz0gcG5nX3Bhc3NfaW5jW3Bhc3NdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3AgPSByb3cgKyAocG5nX3NpemVfdCkoaSA+PiAzKTsKLSAgICAgICAgICAgICAgIHZhbHVlID0gKGludCkoKnNwID4+ICg3IC0gKGludCkoaSAmIDB4MDcpKSkgJiAweDAxOwotICAgICAgICAgICAgICAgZCB8PSAodmFsdWUgPDwgc2hpZnQpOwotCi0gICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gNzsKLSAgICAgICAgICAgICAgICAgICpkcCsrID0gKHBuZ19ieXRlKWQ7Ci0gICAgICAgICAgICAgICAgICBkID0gMDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHNoaWZ0LS07Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaGlmdCAhPSA3KQotICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcDsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcDsKLSAgICAgICAgICAgIGludCBzaGlmdDsKLSAgICAgICAgICAgIGludCBkOwotICAgICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLQotICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICBzaGlmdCA9IDY7Ci0gICAgICAgICAgICBkID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IHBuZ19wYXNzX3N0YXJ0W3Bhc3NdOyBpIDwgcm93X3dpZHRoOwotICAgICAgICAgICAgICAgaSArPSBwbmdfcGFzc19pbmNbcGFzc10pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KShpID4+IDIpOwotICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+ICgoMyAtIChpbnQpKGkgJiAweDAzKSkgPDwgMSkpICYgMHgwMzsKLSAgICAgICAgICAgICAgIGQgfD0gKHZhbHVlIDw8IHNoaWZ0KTsKLQotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IDY7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSlkOwotICAgICAgICAgICAgICAgICAgZCA9IDA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzaGlmdCAtPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNoaWZ0ICE9IDYpCi0gICAgICAgICAgICAgICAgICAgKmRwID0gKHBuZ19ieXRlKWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcDsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcDsKLSAgICAgICAgICAgIGludCBzaGlmdDsKLSAgICAgICAgICAgIGludCBkOwotICAgICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd193aWR0aCA9IHJvd19pbmZvLT53aWR0aDsKLQotICAgICAgICAgICAgZHAgPSByb3c7Ci0gICAgICAgICAgICBzaGlmdCA9IDQ7Ci0gICAgICAgICAgICBkID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IHBuZ19wYXNzX3N0YXJ0W3Bhc3NdOyBpIDwgcm93X3dpZHRoOwotICAgICAgICAgICAgICAgaSArPSBwbmdfcGFzc19pbmNbcGFzc10pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzcCA9IHJvdyArIChwbmdfc2l6ZV90KShpID4+IDEpOwotICAgICAgICAgICAgICAgdmFsdWUgPSAoKnNwID4+ICgoMSAtIChpbnQpKGkgJiAweDAxKSkgPDwgMikpICYgMHgwZjsKLSAgICAgICAgICAgICAgIGQgfD0gKHZhbHVlIDw8IHNoaWZ0KTsKLQotICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzaGlmdCA9IDQ7Ci0gICAgICAgICAgICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSlkOwotICAgICAgICAgICAgICAgICAgZCA9IDA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzaGlmdCAtPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNoaWZ0ICE9IDQpCi0gICAgICAgICAgICAgICAqZHAgPSAocG5nX2J5dGUpZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBzcDsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkcDsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiByb3dfd2lkdGggPSByb3dfaW5mby0+d2lkdGg7Ci0gICAgICAgICAgICBwbmdfc2l6ZV90IHBpeGVsX2J5dGVzOwotCi0gICAgICAgICAgICAvKiBTdGFydCBhdCB0aGUgYmVnaW5uaW5nICovCi0gICAgICAgICAgICBkcCA9IHJvdzsKLSAgICAgICAgICAgIC8qIEZpbmQgb3V0IGhvdyBtYW55IGJ5dGVzIGVhY2ggcGl4ZWwgdGFrZXMgdXAgKi8KLSAgICAgICAgICAgIHBpeGVsX2J5dGVzID0gKHJvd19pbmZvLT5waXhlbF9kZXB0aCA+PiAzKTsKLSAgICAgICAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgcm93LCBvbmx5IGxvb2tpbmcgYXQgdGhlIHBpeGVscyB0aGF0Ci0gICAgICAgICAgICAgICBtYXR0ZXIgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IHBuZ19wYXNzX3N0YXJ0W3Bhc3NdOyBpIDwgcm93X3dpZHRoOwotICAgICAgICAgICAgICAgaSArPSBwbmdfcGFzc19pbmNbcGFzc10pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBGaW5kIG91dCB3aGVyZSB0aGUgb3JpZ2luYWwgcGl4ZWwgaXMgKi8KLSAgICAgICAgICAgICAgIHNwID0gcm93ICsgKHBuZ19zaXplX3QpaSAqIHBpeGVsX2J5dGVzOwotICAgICAgICAgICAgICAgLyogTW92ZSB0aGUgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgIGlmIChkcCAhPSBzcCkKLSAgICAgICAgICAgICAgICAgIHBuZ19tZW1jcHkoZHAsIHNwLCBwaXhlbF9ieXRlcyk7Ci0gICAgICAgICAgICAgICAvKiBOZXh0IHBpeGVsICovCi0gICAgICAgICAgICAgICBkcCArPSBwaXhlbF9ieXRlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgLyogU2V0IG5ldyByb3cgd2lkdGggKi8KLSAgICAgIHJvd19pbmZvLT53aWR0aCA9IChyb3dfaW5mby0+d2lkdGggKwotICAgICAgICAgcG5nX3Bhc3NfaW5jW3Bhc3NdIC0gMSAtCi0gICAgICAgICBwbmdfcGFzc19zdGFydFtwYXNzXSkgLwotICAgICAgICAgcG5nX3Bhc3NfaW5jW3Bhc3NdOwotICAgICAgICAgcm93X2luZm8tPnJvd2J5dGVzID0gUE5HX1JPV0JZVEVTKHJvd19pbmZvLT5waXhlbF9kZXB0aCwKLSAgICAgICAgICAgIHJvd19pbmZvLT53aWR0aCk7Ci0gICB9Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmaWx0ZXJzIHRoZSByb3csIGNob29zZXMgd2hpY2ggZmlsdGVyIHRvIHVzZSwgaWYgaXQgaGFzIG5vdCBhbHJlYWR5Ci0gKiBiZWVuIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24sIGFuZCB0aGVuIHdyaXRlcyB0aGUgcm93IG91dCB3aXRoIHRoZQotICogY2hvc2VuIGZpbHRlci4KLSAqLwotI2RlZmluZSBQTkdfTUFYU1VNICgoKHBuZ191aW50XzMyKSgtMSkpID4+IDEpCi0jZGVmaW5lIFBOR19ISVNISUZUIDEwCi0jZGVmaW5lIFBOR19MT01BU0sgKChwbmdfdWludF8zMikweGZmZmZMKQotI2RlZmluZSBQTkdfSElNQVNLICgocG5nX3VpbnRfMzIpKH5QTkdfTE9NQVNLID4+IFBOR19ISVNISUZUKSkKLXZvaWQgLyogUFJJVkFURSAqLwotcG5nX3dyaXRlX2ZpbmRfZmlsdGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pCi17Ci0gICBwbmdfYnl0ZXAgYmVzdF9yb3c7Ci0jaWZuZGVmIFBOR19OT19XUklURV9GSUxURVIKLSAgIHBuZ19ieXRlcCBwcmV2X3Jvdywgcm93X2J1ZjsKLSAgIHBuZ191aW50XzMyIG1pbnMsIGJwcDsKLSAgIHBuZ19ieXRlIGZpbHRlcl90b19kbyA9IHBuZ19wdHItPmRvX2ZpbHRlcjsKLSAgIHBuZ191aW50XzMyIHJvd19ieXRlcyA9IHJvd19pbmZvLT5yb3dieXRlczsKLSNpZiBkZWZpbmVkKFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEKQotICAgaW50IG51bV9wX2ZpbHRlcnMgPSAoaW50KXBuZ19wdHItPm51bV9wcmV2X2ZpbHRlcnM7Ci0jZW5kaWYKLQotICAgcG5nX2RlYnVnKDEsICJpbiBwbmdfd3JpdGVfZmluZF9maWx0ZXIiKTsKLSAgIC8qIEZpbmQgb3V0IGhvdyBtYW55IGJ5dGVzIG9mZnNldCBlYWNoIHBpeGVsIGlzICovCi0gICBicHAgPSAocm93X2luZm8tPnBpeGVsX2RlcHRoICsgNykgPj4gMzsKLQotICAgcHJldl9yb3cgPSBwbmdfcHRyLT5wcmV2X3JvdzsKLSNlbmRpZgotICAgYmVzdF9yb3cgPSBwbmdfcHRyLT5yb3dfYnVmOwotI2lmbmRlZiBQTkdfTk9fV1JJVEVfRklMVEVSCi0gICByb3dfYnVmID0gYmVzdF9yb3c7Ci0gICBtaW5zID0gUE5HX01BWFNVTTsKLQotICAgLyogVGhlIHByZWRpY3Rpb24gbWV0aG9kIHdlIHVzZSBpcyB0byBmaW5kIHdoaWNoIG1ldGhvZCBwcm92aWRlcyB0aGUKLSAgICAqIHNtYWxsZXN0IHZhbHVlIHdoZW4gc3VtbWluZyB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHRoZSBkaXN0YW5jZXMKLSAgICAqIGZyb20gemVybywgdXNpbmcgYW55dGhpbmcgPj0gMTI4IGFzIG5lZ2F0aXZlIG51bWJlcnMuICBUaGlzIGlzIGtub3duCi0gICAgKiBhcyB0aGUgIm1pbmltdW0gc3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIiBoZXVyaXN0aWMuICBPdGhlcgotICAgICogaGV1cmlzdGljcyBhcmUgdGhlICJ3ZWlnaHRlZCBtaW5pbXVtIHN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcyIKLSAgICAqIChleHBlcmltZW50YWwgYW5kIGNhbiBpbiB0aGVvcnkgaW1wcm92ZSBjb21wcmVzc2lvbiksIGFuZCB0aGUgInpsaWIKLSAgICAqIHByZWRpY3RpdmUiIG1ldGhvZCAobm90IGltcGxlbWVudGVkIHlldCksIHdoaWNoIGRvZXMgdGVzdCBjb21wcmVzc2lvbnMKLSAgICAqIG9mIGxpbmVzIHVzaW5nIGRpZmZlcmVudCBmaWx0ZXIgbWV0aG9kcywgYW5kIHRoZW4gY2hvb3NlcyB0aGUKLSAgICAqIChzZXJpZXMgb2YpIGZpbHRlcihzKSB0aGF0IGdpdmUgbWluaW11bSBjb21wcmVzc2VkIGRhdGEgc2l6ZSAoVkVSWQotICAgICogY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSkuCi0gICAgKgotICAgICogR1JSIDk4MDUyNTogIGNvbnNpZGVyIGFsc28KLSAgICAqICAgKDEpIG1pbmltdW0gc3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzIGZyb20gcnVubmluZyBhdmVyYWdlIChpLmUuLAotICAgICogICAgICAga2VlcCBydW5uaW5nIHN1bSBvZiBub24tYWJzb2x1dGUgZGlmZmVyZW5jZXMgJiBjb3VudCBvZiBieXRlcykKLSAgICAqICAgICAgIFt0cmFjayBkaXNwZXJzaW9uLCB0b28/ICByZXN0YXJ0IGF2ZXJhZ2UgaWYgZGlzcGVyc2lvbiB0b28gbGFyZ2U/XQotICAgICogICgxYikgbWluaW11bSBzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMgZnJvbSBzbGlkaW5nIGF2ZXJhZ2UsIHByb2JhYmx5Ci0gICAgKiAgICAgICB3aXRoIHdpbmRvdyBzaXplIDw9IGRlZmxhdGUgd2luZG93ICh1c3VhbGx5IDMySykKLSAgICAqICAgKDIpIG1pbmltdW0gc3VtIG9mIHNxdWFyZWQgZGlmZmVyZW5jZXMgZnJvbSB6ZXJvIG9yIHJ1bm5pbmcgYXZlcmFnZQotICAgICogICAgICAgKGkuZS4sIH4gcm9vdC1tZWFuLXNxdWFyZSBhcHByb2FjaCkKLSAgICAqLwotCi0KLSAgIC8qIFdlIGRvbid0IG5lZWQgdG8gdGVzdCB0aGUgJ25vIGZpbHRlcicgY2FzZSBpZiB0aGlzIGlzIHRoZSBvbmx5IGZpbHRlcgotICAgICogdGhhdCBoYXMgYmVlbiBjaG9zZW4sIGFzIGl0IGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgdG8gdGhlIGRhdGEuCi0gICAgKi8KLSAgIGlmICgoZmlsdGVyX3RvX2RvICYgUE5HX0ZJTFRFUl9OT05FKSAmJgotICAgICAgIGZpbHRlcl90b19kbyAhPSBQTkdfRklMVEVSX05PTkUpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgcnA7Ci0gICAgICBwbmdfdWludF8zMiBzdW0gPSAwOwotICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgIGludCB2OwotCi0gICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxOyBpIDwgcm93X2J5dGVzOyBpKyssIHJwKyspCi0gICAgICB7Ci0gICAgICAgICB2ID0gKnJwOwotICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2OwotICAgICAgfQotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCkKLSAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMzIgc3VtaGksIHN1bWxvOwotICAgICAgICAgaW50IGo7Ci0gICAgICAgICBzdW1sbyA9IHN1bSAmIFBOR19MT01BU0s7Ci0gICAgICAgICBzdW1oaSA9IChzdW0gPj4gUE5HX0hJU0hJRlQpICYgUE5HX0hJTUFTSzsgLyogR2l2ZXMgdXMgc29tZSBmb290cm9vbSAqLwotCi0gICAgICAgICAvKiBSZWR1Y2UgdGhlIHN1bSBpZiB3ZSBtYXRjaCBhbnkgb2YgdGhlIHByZXZpb3VzIHJvd3MgKi8KLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID09IFBOR19GSUxURVJfVkFMVUVfTk9ORSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbal0pID4+Ci0gICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOwotICAgICAgICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIC8qIEZhY3RvciBpbiB0aGUgY29zdCBvZiB0aGlzIGZpbHRlciAodGhpcyBpcyBoZXJlIGZvciBjb21wbGV0ZW5lc3MsCi0gICAgICAgICAgKiBidXQgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gaGF2ZSBhICJjb3N0IiBmb3IgdGhlIE5PTkUgZmlsdGVyLCBhcwotICAgICAgICAgICogaXQgaGFzIHRoZSBtaW5pbXVtIHBvc3NpYmxlIGNvbXB1dGF0aW9uYWwgY29zdCAtIG5vbmUpLgotICAgICAgICAgICovCi0gICAgICAgICBzdW1sbyA9IChzdW1sbyAqIHBuZ19wdHItPmZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX05PTkVdKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0gICAgICAgICBzdW1oaSA9IChzdW1oaSAqIHBuZ19wdHItPmZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX05PTkVdKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0KLSAgICAgICAgIGlmIChzdW1oaSA+IFBOR19ISU1BU0spCi0gICAgICAgICAgICBzdW0gPSBQTkdfTUFYU1VNOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VtID0gKHN1bWhpIDw8IFBOR19ISVNISUZUKSArIHN1bWxvOwotICAgICAgfQotI2VuZGlmCi0gICAgICBtaW5zID0gc3VtOwotICAgfQotCi0gICAvKiBTdWIgZmlsdGVyICovCi0gICBpZiAoZmlsdGVyX3RvX2RvID09IFBOR19GSUxURVJfU1VCKQotICAgLyogSXQncyB0aGUgb25seSBmaWx0ZXIgc28gbm8gdGVzdGluZyBpcyBuZWVkZWQgKi8KLSAgIHsKLSAgICAgIHBuZ19ieXRlcCBycCwgbHAsIGRwOwotICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDEsIGRwID0gcG5nX3B0ci0+c3ViX3JvdyArIDE7IGkgPCBicHA7Ci0gICAgICAgICAgIGkrKywgcnArKywgZHArKykKLSAgICAgIHsKLSAgICAgICAgICpkcCA9ICpycDsKLSAgICAgIH0KLSAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMTsgaSA8IHJvd19ieXRlczsKLSAgICAgICAgIGkrKywgcnArKywgbHArKywgZHArKykKLSAgICAgIHsKLSAgICAgICAgICpkcCA9IChwbmdfYnl0ZSkoKChpbnQpKnJwIC0gKGludCkqbHApICYgMHhmZik7Ci0gICAgICB9Ci0gICAgICBiZXN0X3JvdyA9IHBuZ19wdHItPnN1Yl9yb3c7Ci0gICB9Ci0KLSAgIGVsc2UgaWYgKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfU1VCKQotICAgewotICAgICAgcG5nX2J5dGVwIHJwLCBkcCwgbHA7Ci0gICAgICBwbmdfdWludF8zMiBzdW0gPSAwLCBsbWlucyA9IG1pbnM7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgaW50IHY7Ci0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEKQotICAgICAgLyogV2UgdGVtcG9yYXJpbHkgaW5jcmVhc2UgdGhlICJtaW5pbXVtIHN1bSIgYnkgdGhlIGZhY3RvciB3ZQotICAgICAgICogd291bGQgcmVkdWNlIHRoZSBzdW0gb2YgdGhpcyBmaWx0ZXIsIHNvIHRoYXQgd2UgY2FuIGRvIHRoZQotICAgICAgICogZWFybHkgZXhpdCBjb21wYXJpc29uIHdpdGhvdXQgc2NhbGluZyB0aGUgc3VtIGVhY2ggdGltZS4KLSAgICAgICAqLwotICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpCi0gICAgICB7Ci0gICAgICAgICBpbnQgajsKLSAgICAgICAgIHBuZ191aW50XzMyIGxtaGksIGxtbG87Ci0gICAgICAgICBsbWxvID0gbG1pbnMgJiBQTkdfTE9NQVNLOwotICAgICAgICAgbG1oaSA9IChsbWlucyA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOwotCi0gICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3BfZmlsdGVyczsgaisrKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX1NVQikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbal0pID4+Ci0gICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBsbWxvID0gKGxtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfU1VCXSkgPj4KLSAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOwotICAgICAgICAgbG1oaSA9IChsbWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1NVQl0pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLQotICAgICAgICAgaWYgKGxtaGkgPiBQTkdfSElNQVNLKQotICAgICAgICAgICAgbG1pbnMgPSBQTkdfTUFYU1VNOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgbG1pbnMgPSAobG1oaSA8PCBQTkdfSElTSElGVCkgKyBsbWxvOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDEsIGRwID0gcG5nX3B0ci0+c3ViX3JvdyArIDE7IGkgPCBicHA7Ci0gICAgICAgICAgIGkrKywgcnArKywgZHArKykKLSAgICAgIHsKLSAgICAgICAgIHYgPSAqZHAgPSAqcnA7Ci0KLSAgICAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsKLSAgICAgIH0KLSAgICAgIGZvciAobHAgPSByb3dfYnVmICsgMTsgaSA8IHJvd19ieXRlczsKLSAgICAgICAgIGkrKywgcnArKywgbHArKywgZHArKykKLSAgICAgIHsKLSAgICAgICAgIHYgPSAqZHAgPSAocG5nX2J5dGUpKCgoaW50KSpycCAtIChpbnQpKmxwKSAmIDB4ZmYpOwotCi0gICAgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7Ci0KLSAgICAgICAgIGlmIChzdW0gPiBsbWlucykgIC8qIFdlIGFyZSBhbHJlYWR5IHdvcnNlLCBkb24ndCBjb250aW51ZS4gKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCkKLSAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQotICAgICAgewotICAgICAgICAgaW50IGo7Ci0gICAgICAgICBwbmdfdWludF8zMiBzdW1oaSwgc3VtbG87Ci0gICAgICAgICBzdW1sbyA9IHN1bSAmIFBOR19MT01BU0s7Ci0gICAgICAgICBzdW1oaSA9IChzdW0gPj4gUE5HX0hJU0hJRlQpICYgUE5HX0hJTUFTSzsKLQotICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9TVUIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzdW1sbyA9IChzdW1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICAgICBzdW1oaSA9IChzdW1oaSAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1NVQl0pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLSAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1NVQl0pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLQotICAgICAgICAgaWYgKHN1bWhpID4gUE5HX0hJTUFTSykKLSAgICAgICAgICAgIHN1bSA9IFBOR19NQVhTVU07Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdW0gPSAoc3VtaGkgPDwgUE5HX0hJU0hJRlQpICsgc3VtbG87Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgaWYgKHN1bSA8IG1pbnMpCi0gICAgICB7Ci0gICAgICAgICBtaW5zID0gc3VtOwotICAgICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT5zdWJfcm93OwotICAgICAgfQotICAgfQotCi0gICAvKiBVcCBmaWx0ZXIgKi8KLSAgIGlmIChmaWx0ZXJfdG9fZG8gPT0gUE5HX0ZJTFRFUl9VUCkKLSAgIHsKLSAgICAgIHBuZ19ieXRlcCBycCwgZHAsIHBwOwotICAgICAgcG5nX3VpbnRfMzIgaTsKLQotICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT51cF9yb3cgKyAxLAotICAgICAgICAgICBwcCA9IHByZXZfcm93ICsgMTsgaSA8IHJvd19ieXRlczsKLSAgICAgICAgICAgaSsrLCBycCsrLCBwcCsrLCBkcCsrKQotICAgICAgewotICAgICAgICAgKmRwID0gKHBuZ19ieXRlKSgoKGludCkqcnAgLSAoaW50KSpwcCkgJiAweGZmKTsKLSAgICAgIH0KLSAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+dXBfcm93OwotICAgfQotCi0gICBlbHNlIGlmIChmaWx0ZXJfdG9fZG8gJiBQTkdfRklMVEVSX1VQKQotICAgewotICAgICAgcG5nX2J5dGVwIHJwLCBkcCwgcHA7Ci0gICAgICBwbmdfdWludF8zMiBzdW0gPSAwLCBsbWlucyA9IG1pbnM7Ci0gICAgICBwbmdfdWludF8zMiBpOwotICAgICAgaW50IHY7Ci0KLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQpCi0gICAgICBpZiAocG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCkKLSAgICAgIHsKLSAgICAgICAgIGludCBqOwotICAgICAgICAgcG5nX3VpbnRfMzIgbG1oaSwgbG1sbzsKLSAgICAgICAgIGxtbG8gPSBsbWlucyAmIFBOR19MT01BU0s7Ci0gICAgICAgICBsbWhpID0gKGxtaW5zID4+IFBOR19ISVNISUZUKSAmIFBOR19ISU1BU0s7Ci0KLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID09IFBOR19GSUxURVJfVkFMVUVfVVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBsbWxvID0gKGxtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbal0pID4+Ci0gICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOwotICAgICAgICAgICAgICAgbG1oaSA9IChsbWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgbG1sbyA9IChsbWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1VQXSkgPj4KLSAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOwotICAgICAgICAgbG1oaSA9IChsbWhpICogcG5nX3B0ci0+aW52X2ZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1VQXSkgPj4KLSAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOwotCi0gICAgICAgICBpZiAobG1oaSA+IFBOR19ISU1BU0spCi0gICAgICAgICAgICBsbWlucyA9IFBOR19NQVhTVU07Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBsbWlucyA9IChsbWhpIDw8IFBOR19ISVNISUZUKSArIGxtbG87Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT51cF9yb3cgKyAxLAotICAgICAgICAgICBwcCA9IHByZXZfcm93ICsgMTsgaSA8IHJvd19ieXRlczsgaSsrKQotICAgICAgewotICAgICAgICAgdiA9ICpkcCsrID0gKHBuZ19ieXRlKSgoKGludCkqcnArKyAtIChpbnQpKnBwKyspICYgMHhmZik7Ci0KLSAgICAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsKLQotICAgICAgICAgaWYgKHN1bSA+IGxtaW5zKSAgLyogV2UgYXJlIGFscmVhZHkgd29yc2UsIGRvbid0IGNvbnRpbnVlLiAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEKQotICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpCi0gICAgICB7Ci0gICAgICAgICBpbnQgajsKLSAgICAgICAgIHBuZ191aW50XzMyIHN1bWhpLCBzdW1sbzsKLSAgICAgICAgIHN1bWxvID0gc3VtICYgUE5HX0xPTUFTSzsKLSAgICAgICAgIHN1bWhpID0gKHN1bSA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOwotCi0gICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3BfZmlsdGVyczsgaisrKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX1VQKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICAgICBzdW1oaSA9IChzdW1oaSAqIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgc3VtbG8gPSAoc3VtbG8gKiBwbmdfcHRyLT5maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9VUF0pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLSAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfVVBdKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0KLSAgICAgICAgIGlmIChzdW1oaSA+IFBOR19ISU1BU0spCi0gICAgICAgICAgICBzdW0gPSBQTkdfTUFYU1VNOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VtID0gKHN1bWhpIDw8IFBOR19ISVNISUZUKSArIHN1bWxvOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGlmIChzdW0gPCBtaW5zKQotICAgICAgewotICAgICAgICAgbWlucyA9IHN1bTsKLSAgICAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+dXBfcm93OwotICAgICAgfQotICAgfQotCi0gICAvKiBBdmcgZmlsdGVyICovCi0gICBpZiAoZmlsdGVyX3RvX2RvID09IFBOR19GSUxURVJfQVZHKQotICAgewotICAgICAgcG5nX2J5dGVwIHJwLCBkcCwgcHAsIGxwOwotICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgIGZvciAoaSA9IDAsIHJwID0gcm93X2J1ZiArIDEsIGRwID0gcG5nX3B0ci0+YXZnX3JvdyArIDEsCi0gICAgICAgICAgIHBwID0gcHJldl9yb3cgKyAxOyBpIDwgYnBwOyBpKyspCi0gICAgICB7Ci0gICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSAoKGludCkqcHArKyAvIDIpKSAmIDB4ZmYpOwotICAgICAgfQotICAgICAgZm9yIChscCA9IHJvd19idWYgKyAxOyBpIDwgcm93X2J5dGVzOyBpKyspCi0gICAgICB7Ci0gICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSAoKChpbnQpKnBwKysgKyAoaW50KSpscCsrKSAvIDIpKQotICAgICAgICAgICAgICAgICAmIDB4ZmYpOwotICAgICAgfQotICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT5hdmdfcm93OwotICAgfQotCi0gICBlbHNlIGlmIChmaWx0ZXJfdG9fZG8gJiBQTkdfRklMVEVSX0FWRykKLSAgIHsKLSAgICAgIHBuZ19ieXRlcCBycCwgZHAsIHBwLCBscDsKLSAgICAgIHBuZ191aW50XzMyIHN1bSA9IDAsIGxtaW5zID0gbWluczsKLSAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICBpbnQgdjsKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQpCi0gICAgICBpZiAocG5nX3B0ci0+aGV1cmlzdGljX21ldGhvZCA9PSBQTkdfRklMVEVSX0hFVVJJU1RJQ19XRUlHSFRFRCkKLSAgICAgIHsKLSAgICAgICAgIGludCBqOwotICAgICAgICAgcG5nX3VpbnRfMzIgbG1oaSwgbG1sbzsKLSAgICAgICAgIGxtbG8gPSBsbWlucyAmIFBOR19MT01BU0s7Ci0gICAgICAgICBsbWhpID0gKGxtaW5zID4+IFBOR19ISVNISUZUKSAmIFBOR19ISU1BU0s7Ci0KLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID09IFBOR19GSUxURVJfVkFMVUVfQVZHKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgbG1sbyA9IChsbWxvICogcG5nX3B0ci0+aW52X2ZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgICAgIGxtaGkgPSAobG1oaSAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfY29zdHNbUE5HX0ZJTFRFUl9WQUxVRV9BVkddKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0gICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfQVZHXSkgPj4KLSAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOwotCi0gICAgICAgICBpZiAobG1oaSA+IFBOR19ISU1BU0spCi0gICAgICAgICAgICBsbWlucyA9IFBOR19NQVhTVU07Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBsbWlucyA9IChsbWhpIDw8IFBOR19ISVNISUZUKSArIGxtbG87Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgZm9yIChpID0gMCwgcnAgPSByb3dfYnVmICsgMSwgZHAgPSBwbmdfcHRyLT5hdmdfcm93ICsgMSwKLSAgICAgICAgICAgcHAgPSBwcmV2X3JvdyArIDE7IGkgPCBicHA7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHYgPSAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSAoKGludCkqcHArKyAvIDIpKSAmIDB4ZmYpOwotCi0gICAgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7Ci0gICAgICB9Ci0gICAgICBmb3IgKGxwID0gcm93X2J1ZiArIDE7IGkgPCByb3dfYnl0ZXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIHYgPSAqZHArKyA9Ci0gICAgICAgICAgKHBuZ19ieXRlKSgoKGludCkqcnArKyAtICgoKGludCkqcHArKyArIChpbnQpKmxwKyspIC8gMikpICYgMHhmZik7Ci0KLSAgICAgICAgIHN1bSArPSAodiA8IDEyOCkgPyB2IDogMjU2IC0gdjsKLQotICAgICAgICAgaWYgKHN1bSA+IGxtaW5zKSAgLyogV2UgYXJlIGFscmVhZHkgd29yc2UsIGRvbid0IGNvbnRpbnVlLiAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9XRUlHSFRFRF9GSUxURVJfU1VQUE9SVEVEKQotICAgICAgaWYgKHBuZ19wdHItPmhldXJpc3RpY19tZXRob2QgPT0gUE5HX0ZJTFRFUl9IRVVSSVNUSUNfV0VJR0hURUQpCi0gICAgICB7Ci0gICAgICAgICBpbnQgajsKLSAgICAgICAgIHBuZ191aW50XzMyIHN1bWhpLCBzdW1sbzsKLSAgICAgICAgIHN1bWxvID0gc3VtICYgUE5HX0xPTUFTSzsKLSAgICAgICAgIHN1bWhpID0gKHN1bSA+PiBQTkdfSElTSElGVCkgJiBQTkdfSElNQVNLOwotCi0gICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3BfZmlsdGVyczsgaisrKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHBuZ19wdHItPnByZXZfZmlsdGVyc1tqXSA9PSBQTkdfRklMVEVSX1ZBTFVFX05PTkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzdW1sbyA9IChzdW1sbyAqIHBuZ19wdHItPmZpbHRlcl93ZWlnaHRzW2pdKSA+PgotICAgICAgICAgICAgICAgICAgUE5HX1dFSUdIVF9TSElGVDsKLSAgICAgICAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbal0pID4+Ci0gICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBzdW1sbyA9IChzdW1sbyAqIHBuZ19wdHItPmZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX0FWR10pID4+Ci0gICAgICAgICAgICBQTkdfQ09TVF9TSElGVDsKLSAgICAgICAgIHN1bWhpID0gKHN1bWhpICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfQVZHXSkgPj4KLSAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOwotCi0gICAgICAgICBpZiAoc3VtaGkgPiBQTkdfSElNQVNLKQotICAgICAgICAgICAgc3VtID0gUE5HX01BWFNVTTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN1bSA9IChzdW1oaSA8PCBQTkdfSElTSElGVCkgKyBzdW1sbzsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBpZiAoc3VtIDwgbWlucykKLSAgICAgIHsKLSAgICAgICAgIG1pbnMgPSBzdW07Ci0gICAgICAgICBiZXN0X3JvdyA9IHBuZ19wdHItPmF2Z19yb3c7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIFBhZXRoIGZpbHRlciAqLwotICAgaWYgKGZpbHRlcl90b19kbyA9PSBQTkdfRklMVEVSX1BBRVRIKQotICAgewotICAgICAgcG5nX2J5dGVwIHJwLCBkcCwgcHAsIGNwLCBscDsKLSAgICAgIHBuZ191aW50XzMyIGk7Ci0gICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPnBhZXRoX3JvdyArIDEsCi0gICAgICAgICAgIHBwID0gcHJldl9yb3cgKyAxOyBpIDwgYnBwOyBpKyspCi0gICAgICB7Ci0gICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSAoaW50KSpwcCsrKSAmIDB4ZmYpOwotICAgICAgfQotCi0gICAgICBmb3IgKGxwID0gcm93X2J1ZiArIDEsIGNwID0gcHJldl9yb3cgKyAxOyBpIDwgcm93X2J5dGVzOyBpKyspCi0gICAgICB7Ci0gICAgICAgICBpbnQgYSwgYiwgYywgcGEsIHBiLCBwYywgcDsKLQotICAgICAgICAgYiA9ICpwcCsrOwotICAgICAgICAgYyA9ICpjcCsrOwotICAgICAgICAgYSA9ICpscCsrOwotCi0gICAgICAgICBwID0gYiAtIGM7Ci0gICAgICAgICBwYyA9IGEgLSBjOwotCi0jaWZkZWYgUE5HX1VTRV9BQlMKLSAgICAgICAgIHBhID0gYWJzKHApOwotICAgICAgICAgcGIgPSBhYnMocGMpOwotICAgICAgICAgcGMgPSBhYnMocCArIHBjKTsKLSNlbHNlCi0gICAgICAgICBwYSA9IHAgPCAwID8gLXAgOiBwOwotICAgICAgICAgcGIgPSBwYyA8IDAgPyAtcGMgOiBwYzsKLSAgICAgICAgIHBjID0gKHAgKyBwYykgPCAwID8gLShwICsgcGMpIDogcCArIHBjOwotI2VuZGlmCi0KLSAgICAgICAgIHAgPSAocGEgPD0gcGIgJiYgcGEgPD1wYykgPyBhIDogKHBiIDw9IHBjKSA/IGIgOiBjOwotCi0gICAgICAgICAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSBwKSAmIDB4ZmYpOwotICAgICAgfQotICAgICAgYmVzdF9yb3cgPSBwbmdfcHRyLT5wYWV0aF9yb3c7Ci0gICB9Ci0KLSAgIGVsc2UgaWYgKGZpbHRlcl90b19kbyAmIFBOR19GSUxURVJfUEFFVEgpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgcnAsIGRwLCBwcCwgY3AsIGxwOwotICAgICAgcG5nX3VpbnRfMzIgc3VtID0gMCwgbG1pbnMgPSBtaW5zOwotICAgICAgcG5nX3VpbnRfMzIgaTsKLSAgICAgIGludCB2OwotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCkKLSAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQotICAgICAgewotICAgICAgICAgaW50IGo7Ci0gICAgICAgICBwbmdfdWludF8zMiBsbWhpLCBsbWxvOwotICAgICAgICAgbG1sbyA9IGxtaW5zICYgUE5HX0xPTUFTSzsKLSAgICAgICAgIGxtaGkgPSAobG1pbnMgPj4gUE5HX0hJU0hJRlQpICYgUE5HX0hJTUFTSzsKLQotICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGxtbG8gPSAobG1sbyAqIHBuZ19wdHItPmludl9maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX3dlaWdodHNbal0pID4+Ci0gICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBsbWxvID0gKGxtbG8gKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfUEFFVEhdKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0gICAgICAgICBsbWhpID0gKGxtaGkgKiBwbmdfcHRyLT5pbnZfZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfUEFFVEhdKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0KLSAgICAgICAgIGlmIChsbWhpID4gUE5HX0hJTUFTSykKLSAgICAgICAgICAgIGxtaW5zID0gUE5HX01BWFNVTTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxtaW5zID0gKGxtaGkgPDwgUE5HX0hJU0hJRlQpICsgbG1sbzsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBmb3IgKGkgPSAwLCBycCA9IHJvd19idWYgKyAxLCBkcCA9IHBuZ19wdHItPnBhZXRoX3JvdyArIDEsCi0gICAgICAgICAgIHBwID0gcHJldl9yb3cgKyAxOyBpIDwgYnBwOyBpKyspCi0gICAgICB7Ci0gICAgICAgICB2ID0gKmRwKysgPSAocG5nX2J5dGUpKCgoaW50KSpycCsrIC0gKGludCkqcHArKykgJiAweGZmKTsKLQotICAgICAgICAgc3VtICs9ICh2IDwgMTI4KSA/IHYgOiAyNTYgLSB2OwotICAgICAgfQotCi0gICAgICBmb3IgKGxwID0gcm93X2J1ZiArIDEsIGNwID0gcHJldl9yb3cgKyAxOyBpIDwgcm93X2J5dGVzOyBpKyspCi0gICAgICB7Ci0gICAgICAgICBpbnQgYSwgYiwgYywgcGEsIHBiLCBwYywgcDsKLQotICAgICAgICAgYiA9ICpwcCsrOwotICAgICAgICAgYyA9ICpjcCsrOwotICAgICAgICAgYSA9ICpscCsrOwotCi0jaWZuZGVmIFBOR19TTE9XX1BBRVRICi0gICAgICAgICBwID0gYiAtIGM7Ci0gICAgICAgICBwYyA9IGEgLSBjOwotI2lmZGVmIFBOR19VU0VfQUJTCi0gICAgICAgICBwYSA9IGFicyhwKTsKLSAgICAgICAgIHBiID0gYWJzKHBjKTsKLSAgICAgICAgIHBjID0gYWJzKHAgKyBwYyk7Ci0jZWxzZQotICAgICAgICAgcGEgPSBwIDwgMCA/IC1wIDogcDsKLSAgICAgICAgIHBiID0gcGMgPCAwID8gLXBjIDogcGM7Ci0gICAgICAgICBwYyA9IChwICsgcGMpIDwgMCA/IC0ocCArIHBjKSA6IHAgKyBwYzsKLSNlbmRpZgotICAgICAgICAgcCA9IChwYSA8PSBwYiAmJiBwYSA8PXBjKSA/IGEgOiAocGIgPD0gcGMpID8gYiA6IGM7Ci0jZWxzZSAvKiBQTkdfU0xPV19QQUVUSCAqLwotICAgICAgICAgcCA9IGEgKyBiIC0gYzsKLSAgICAgICAgIHBhID0gYWJzKHAgLSBhKTsKLSAgICAgICAgIHBiID0gYWJzKHAgLSBiKTsKLSAgICAgICAgIHBjID0gYWJzKHAgLSBjKTsKLSAgICAgICAgIGlmIChwYSA8PSBwYiAmJiBwYSA8PSBwYykKLSAgICAgICAgICAgIHAgPSBhOwotICAgICAgICAgZWxzZSBpZiAocGIgPD0gcGMpCi0gICAgICAgICAgICBwID0gYjsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHAgPSBjOwotI2VuZGlmIC8qIFBOR19TTE9XX1BBRVRIICovCi0KLSAgICAgICAgIHYgPSAqZHArKyA9IChwbmdfYnl0ZSkoKChpbnQpKnJwKysgLSBwKSAmIDB4ZmYpOwotCi0gICAgICAgICBzdW0gKz0gKHYgPCAxMjgpID8gdiA6IDI1NiAtIHY7Ci0KLSAgICAgICAgIGlmIChzdW0gPiBsbWlucykgIC8qIFdlIGFyZSBhbHJlYWR5IHdvcnNlLCBkb24ndCBjb250aW51ZS4gKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRCkKLSAgICAgIGlmIChwbmdfcHRyLT5oZXVyaXN0aWNfbWV0aG9kID09IFBOR19GSUxURVJfSEVVUklTVElDX1dFSUdIVEVEKQotICAgICAgewotICAgICAgICAgaW50IGo7Ci0gICAgICAgICBwbmdfdWludF8zMiBzdW1oaSwgc3VtbG87Ci0gICAgICAgICBzdW1sbyA9IHN1bSAmIFBOR19MT01BU0s7Ci0gICAgICAgICBzdW1oaSA9IChzdW0gPj4gUE5HX0hJU0hJRlQpICYgUE5HX0hJTUFTSzsKLQotICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9wX2ZpbHRlcnM7IGorKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPT0gUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX3dlaWdodHNbal0pID4+Ci0gICAgICAgICAgICAgICAgICBQTkdfV0VJR0hUX1NISUZUOwotICAgICAgICAgICAgICAgc3VtaGkgPSAoc3VtaGkgKiBwbmdfcHRyLT5maWx0ZXJfd2VpZ2h0c1tqXSkgPj4KLSAgICAgICAgICAgICAgICAgIFBOR19XRUlHSFRfU0hJRlQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHN1bWxvID0gKHN1bWxvICogcG5nX3B0ci0+ZmlsdGVyX2Nvc3RzW1BOR19GSUxURVJfVkFMVUVfUEFFVEhdKSA+PgotICAgICAgICAgICAgUE5HX0NPU1RfU0hJRlQ7Ci0gICAgICAgICBzdW1oaSA9IChzdW1oaSAqIHBuZ19wdHItPmZpbHRlcl9jb3N0c1tQTkdfRklMVEVSX1ZBTFVFX1BBRVRIXSkgPj4KLSAgICAgICAgICAgIFBOR19DT1NUX1NISUZUOwotCi0gICAgICAgICBpZiAoc3VtaGkgPiBQTkdfSElNQVNLKQotICAgICAgICAgICAgc3VtID0gUE5HX01BWFNVTTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN1bSA9IChzdW1oaSA8PCBQTkdfSElTSElGVCkgKyBzdW1sbzsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBpZiAoc3VtIDwgbWlucykKLSAgICAgIHsKLSAgICAgICAgIGJlc3Rfcm93ID0gcG5nX3B0ci0+cGFldGhfcm93OwotICAgICAgfQotICAgfQotI2VuZGlmIC8qIFBOR19OT19XUklURV9GSUxURVIgKi8KLSAgIC8qIERvIHRoZSBhY3R1YWwgd3JpdGluZyBvZiB0aGUgZmlsdGVyZWQgcm93IGRhdGEgZnJvbSB0aGUgY2hvc2VuIGZpbHRlci4gKi8KLQotICAgcG5nX3dyaXRlX2ZpbHRlcmVkX3JvdyhwbmdfcHRyLCBiZXN0X3Jvdyk7Ci0KLSNpZm5kZWYgUE5HX05PX1dSSVRFX0ZJTFRFUgotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQpCi0gICAvKiBTYXZlIHRoZSB0eXBlIG9mIGZpbHRlciB3ZSBwaWNrZWQgdGhpcyB0aW1lIGZvciBmdXR1cmUgY2FsY3VsYXRpb25zICovCi0gICBpZiAocG5nX3B0ci0+bnVtX3ByZXZfZmlsdGVycyA+IDApCi0gICB7Ci0gICAgICBpbnQgajsKLSAgICAgIGZvciAoaiA9IDE7IGogPCBudW1fcF9maWx0ZXJzOyBqKyspCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbal0gPSBwbmdfcHRyLT5wcmV2X2ZpbHRlcnNbaiAtIDFdOwotICAgICAgfQotICAgICAgcG5nX3B0ci0+cHJldl9maWx0ZXJzW2pdID0gYmVzdF9yb3dbMF07Ci0gICB9Ci0jZW5kaWYKLSNlbmRpZiAvKiBQTkdfTk9fV1JJVEVfRklMVEVSICovCi19Ci0KLQotLyogRG8gdGhlIGFjdHVhbCB3cml0aW5nIG9mIGEgcHJldmlvdXNseSBmaWx0ZXJlZCByb3cuICovCi12b2lkIC8qIFBSSVZBVEUgKi8KLXBuZ193cml0ZV9maWx0ZXJlZF9yb3cocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGZpbHRlcmVkX3JvdykKLXsKLSAgIHBuZ19kZWJ1ZygxLCAiaW4gcG5nX3dyaXRlX2ZpbHRlcmVkX3JvdyIpOwotICAgcG5nX2RlYnVnMSgyLCAiZmlsdGVyID0gJWQiLCBmaWx0ZXJlZF9yb3dbMF0pOwotICAgLyogU2V0IHVwIHRoZSB6bGliIGlucHV0IGJ1ZmZlciAqLwotCi0gICBwbmdfcHRyLT56c3RyZWFtLm5leHRfaW4gPSBmaWx0ZXJlZF9yb3c7Ci0gICBwbmdfcHRyLT56c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpcG5nX3B0ci0+cm93X2luZm8ucm93Ynl0ZXMgKyAxOwotICAgLyogUmVwZWF0IHVudGlsIHdlIGhhdmUgY29tcHJlc3NlZCBhbGwgdGhlIGRhdGEgKi8KLSAgIGRvCi0gICB7Ci0gICAgICBpbnQgcmV0OyAvKiBSZXR1cm4gb2YgemxpYiAqLwotCi0gICAgICAvKiBDb21wcmVzcyB0aGUgZGF0YSAqLwotICAgICAgcmV0ID0gZGVmbGF0ZSgmcG5nX3B0ci0+enN0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgICAvKiBDaGVjayBmb3IgY29tcHJlc3Npb24gZXJyb3JzICovCi0gICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICB7Ci0gICAgICAgICBpZiAocG5nX3B0ci0+enN0cmVhbS5tc2cgIT0gTlVMTCkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCBwbmdfcHRyLT56c3RyZWFtLm1zZyk7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInpsaWIgZXJyb3IiKTsKLSAgICAgIH0KLQotICAgICAgLyogU2VlIGlmIGl0IGlzIHRpbWUgdG8gd3JpdGUgYW5vdGhlciBJREFUICovCi0gICAgICBpZiAoIShwbmdfcHRyLT56c3RyZWFtLmF2YWlsX291dCkpCi0gICAgICB7Ci0gICAgICAgICAvKiBXcml0ZSB0aGUgSURBVCBhbmQgcmVzZXQgdGhlIHpsaWIgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgcG5nX3dyaXRlX0lEQVQocG5nX3B0ciwgcG5nX3B0ci0+emJ1ZiwgcG5nX3B0ci0+emJ1Zl9zaXplKTsKLSAgICAgICAgIHBuZ19wdHItPnpzdHJlYW0ubmV4dF9vdXQgPSBwbmdfcHRyLT56YnVmOwotICAgICAgICAgcG5nX3B0ci0+enN0cmVhbS5hdmFpbF9vdXQgPSAodUludClwbmdfcHRyLT56YnVmX3NpemU7Ci0gICAgICB9Ci0gICAvKiBSZXBlYXQgdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gY29tcHJlc3NlZCAqLwotICAgfSB3aGlsZSAocG5nX3B0ci0+enN0cmVhbS5hdmFpbF9pbik7Ci0KLSAgIC8qIFN3YXAgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHJvd3MgKi8KLSAgIGlmIChwbmdfcHRyLT5wcmV2X3JvdyAhPSBOVUxMKQotICAgewotICAgICAgcG5nX2J5dGVwIHRwdHI7Ci0KLSAgICAgIHRwdHIgPSBwbmdfcHRyLT5wcmV2X3JvdzsKLSAgICAgIHBuZ19wdHItPnByZXZfcm93ID0gcG5nX3B0ci0+cm93X2J1ZjsKLSAgICAgIHBuZ19wdHItPnJvd19idWYgPSB0cHRyOwotICAgfQotCi0gICAvKiBGaW5pc2ggcm93IC0gdXBkYXRlcyBjb3VudGVycyBhbmQgZmx1c2hlcyB6bGliIGlmIGxhc3Qgcm93ICovCi0gICBwbmdfd3JpdGVfZmluaXNoX3JvdyhwbmdfcHRyKTsKLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCkKLSAgIHBuZ19wdHItPmZsdXNoX3Jvd3MrKzsKLQotICAgaWYgKHBuZ19wdHItPmZsdXNoX2Rpc3QgPiAwICYmCi0gICAgICAgcG5nX3B0ci0+Zmx1c2hfcm93cyA+PSBwbmdfcHRyLT5mbHVzaF9kaXN0KQotICAgewotICAgICAgcG5nX3dyaXRlX2ZsdXNoKHBuZ19wdHIpOwotICAgfQotI2VuZGlmCi19Ci0jZW5kaWYgLyogUE5HX1dSSVRFX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvYmVvcy94ODYtc2hhcmVkLnByb2ogYi9saWJzL2xpYnBuZy9wcm9qZWN0cy9iZW9zL3g4Ni1zaGFyZWQucHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyZTNjMy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy9iZW9zL3g4Ni1zaGFyZWQucHJvagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL2Jlb3MveDg2LXNoYXJlZC50eHQgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy9iZW9zL3g4Ni1zaGFyZWQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2Q0ZDlkLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL2Jlb3MveDg2LXNoYXJlZC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1UaGlzIHByb2plY3QgYnVpbGRzIGEgc2hhcmVkIGxpYnJhcnkgdmVyc2lvbiBvZiBsaWJwbmcgb24geDg2IEJlT1MuCi0KLUl0IGRlZmluZXMgUE5HX1VTRV9QTkdHQ0NSRCwgd2hpY2ggYWN0aXZhdGVzIHRoZSBhc3NlbWJseSBjb2RlIGluCi1wbmdnY2NyZC5jOyB0aGlzIGhhc24ndCBiZWVuIGV4dGVuc2l2ZWx5IHRlc3RlZCBvbiBCZU9TLgotCi1UbyBpbnN0YWxsOgotCi0xKSBidWlsZAotCi0gICBOb3RlOiBBcyBvZiB2ZXJzaW9uIDEuMC4xMCwgeW91J2xsIGdldCBhIGZhaXIgbnVtYmVyIG9mIHdhcm5pbmdzIHdoZW4KLSAgICAgICAgIHlvdSBjb21waWxlIHBuZ2djY3JkLmMuICBBcyBmYXIgYXMgSSBrbm93LCB0aGVzZSBhcmUgaGFybWxlc3MsCi0gICAgICAgICBidXQgaXQgd291bGQgYmUgYmV0dGVyIGlmIHNvbWVvbmUgZml4ZWQgdGhlbS4KLQotMikgY29weSBhbmQgcG5nLmgsIHBuZ2NvbmYuaCBzb21ld2hlcmU7IC9ib290L2hvbWUvY29uZmlnL2luY2x1ZGUgKHdoaWNoCi0gICB5b3UnbGwgaGF2ZSB0byBtYWtlKSBpcyBhIGdvb2QgY2hvaWNlCi0KLTMpIGNvcHkgbGlicG5nLnNvIHRvIC9ib290L2hvbWUvY29uZmlnL2xpYgotCi00KSBidWlsZCB5b3VyIGxpYnBuZy5zbyBhcHBsaWNhdGlvbnMgKHJlbWVtYmVyIHRvIGluY2x1ZGUgbGliei5hIGFzCi0gICB3ZWxsIHdoZW4geW91IGxpbmspCi0KLS0gQ2hyaXMgSGVyYm9ydGgsIE1hcmNoIDI3LCAyMDAxCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy9iZW9zL3g4Ni1zdGF0aWMucHJvaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL2Jlb3MveDg2LXN0YXRpYy5wcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2MwNzUzLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL2Jlb3MveDg2LXN0YXRpYy5wcm9qCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvYmVvcy94ODYtc3RhdGljLnR4dCBiL2xpYnMvbGlicG5nL3Byb2plY3RzL2Jlb3MveDg2LXN0YXRpYy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODBhYWEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvYmVvcy94ODYtc3RhdGljLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLVRoaXMgcHJvamVjdCBidWlsZHMgYSBzdGF0aWMgbGlicmFyeSB2ZXJzaW9uIG9mIGxpYnBuZyBvbiB4ODYgQmVPUy4KLQotSXQgZGVmaW5lcyBQTkdfVVNFX1BOR0dDQ1JELCB3aGljaCBhY3RpdmF0ZXMgdGhlIGFzc2VtYmx5IGNvZGUgaW4KLXBuZ2djY3JkLmM7IHRoaXMgaGFzbid0IGJlZW4gZXh0ZW5zaXZlbHkgdGVzdGVkIG9uIEJlT1MuCi0KLVRvIGluc3RhbGw6Ci0KLTEpIGJ1aWxkCi0KLSAgIE5vdGU6IEFzIG9mIHZlcnNpb24gMS4wLjEwLCB5b3UnbGwgZ2V0IGEgZmFpciBudW1iZXIgb2Ygd2FybmluZ3Mgd2hlbgotICAgICAgICAgeW91IGNvbXBpbGUgcG5nZ2NjcmQuYy4gIEFzIGZhciBhcyBJIGtub3csIHRoZXNlIGFyZSBoYXJtbGVzcywKLSAgICAgICAgIGJ1dCBpdCB3b3VsZCBiZSBiZXR0ZXIgaWYgc29tZW9uZSBmaXhlZCB0aGVtLgotCi0yKSBjb3B5IGFuZCBwbmcuaCwgcG5nY29uZi5oIHNvbWV3aGVyZTsgL2Jvb3QvaG9tZS9jb25maWcvaW5jbHVkZSAod2hpY2gKLSAgIHlvdSdsbCBoYXZlIHRvIG1ha2UpIGlzIGEgZ29vZCBjaG9pY2UKLQotMykgY29weSBsaWJwbmcuYSB0byAvYm9vdC9ob21lL2NvbmZpZy9saWIKLQotNCkgYnVpbGQgeW91ciBsaWJwbmcuYSBhcHBsaWNhdGlvbnMgKHJlbWVtYmVyIHRvIGluY2x1ZGUgbGliei5hIGFzCi0gICB3ZWxsIHdoZW4geW91IGxpbmspCi0KLS0gQ2hyaXMgSGVyYm9ydGgsIE1hcmNoIDI3LCAyMDAxCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy9jYnVpbGRlcjUvbGlicG5nLmJwZiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL2NidWlsZGVyNS9saWJwbmcuYnBmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWY4MWU3Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL2NidWlsZGVyNS9saWJwbmcuYnBmCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotVVNFVU5JVCgibGlicG5nLmNwcCIpOwotVVNFVU5JVCgiLi5cLi5ccG5nLmMiKTsKLVVTRVVOSVQoIi4uXC4uXHBuZ2Vycm9yLmMiKTsKLVVTRVVOSVQoIi4uXC4uXHBuZ2dldC5jIik7Ci1VU0VVTklUKCIuLlwuLlxwbmdtZW0uYyIpOwotVVNFVU5JVCgiLi5cLi5ccG5ncHJlYWQuYyIpOwotVVNFVU5JVCgiLi5cLi5ccG5ncmVhZC5jIik7Ci1VU0VVTklUKCIuLlwuLlxwbmdyaW8uYyIpOwotVVNFVU5JVCgiLi5cLi5ccG5ncnRyYW4uYyIpOwotVVNFVU5JVCgiLi5cLi5ccG5ncnV0aWwuYyIpOwotVVNFVU5JVCgiLi5cLi5ccG5nc2V0LmMiKTsKLVVTRVVOSVQoIi4uXC4uXHBuZ3RyYW5zLmMiKTsKLVVTRVVOSVQoIi4uXC4uXHBuZ3dpby5jIik7Ci1VU0VVTklUKCIuLlwuLlxwbmd3cml0ZS5jIik7Ci1VU0VVTklUKCIuLlwuLlxwbmd3dHJhbi5jIik7Ci1VU0VVTklUKCIuLlwuLlxwbmd3dXRpbC5jIik7Ci1VU0VMSUIoIi4uXC4uXC4uXHpsaWJcemxpYi5saWIiKTsKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGlzIGZpbGUgaXMgdXNlZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIG9ubHkgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGxpa2UgdGhlIHByb2plY3QgZmlsZQotCi0KLURsbEVudHJ5UG9pbnQKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL2NidWlsZGVyNS9saWJwbmcuYnBnIGIvbGlicy9saWJwbmcvcHJvamVjdHMvY2J1aWxkZXI1L2xpYnBuZy5icGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYzE5NzcuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvY2J1aWxkZXI1L2xpYnBuZy5icGcKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1WRVJTSU9OID0gQldTLjAxCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0haWZuZGVmIFJPT1QKLVJPT1QgPSAkKE1BS0VESVIpXC4uCi0hZW5kaWYKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1BS0UgPSAkKFJPT1QpXGJpblxtYWtlLmV4ZSAtJChNQUtFRkxBR1MpIC1mJCoqCi1EQ0MgPSAkKFJPT1QpXGJpblxkY2MzMi5leGUgJCoqCi1CUkNDID0gJChST09UKVxiaW5cYnJjYzMyLmV4ZSAkKioKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVBST0pFQ1RTID0gbGlicG5nc3RhdC5saWIgbGlicG5nLmRsbAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZGVmYXVsdDogJChQUk9KRUNUUykKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbGlicG5nc3RhdC5saWI6IGxpYnBuZ3N0YXQuYnByCi0gICQoUk9PVClcYmluXGJwcjJtYWsgLXQkKFJPT1QpXGJpblxkZWZsaWIuYm1rICQqKgotICAkKFJPT1QpXGJpblxtYWtlIC0kKE1BS0VGTEFHUykgLWYkKi5tYWsKLQotbGlicG5nLmRsbDogbGlicG5nLmJwcgotICAkKFJPT1QpXGJpblxicHIybWFrICQqKgotICAkKFJPT1QpXGJpblxtYWtlIC0kKE1BS0VGTEFHUykgLWYkKi5tYWsKLQotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy9jYnVpbGRlcjUvbGlicG5nLmJwciBiL2xpYnMvbGlicG5nL3Byb2plY3RzL2NidWlsZGVyNS9saWJwbmcuYnByCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWZkYmU0Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL2NidWlsZGVyNS9saWJwbmcuYnByCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyA/PgotPCEtLSBDKytCdWlsZGVyIFhNTCBQcm9qZWN0IC0tPgotPFBST0pFQ1Q+Ci0gIDxNQUNST1M+Ci0gICAgPFZFUlNJT04gdmFsdWU9IkJDQi4wNS4wMyIvPgotICAgIDxQUk9KRUNUIHZhbHVlPSJsaWJwbmcuZGxsIi8+Ci0gICAgPE9CSkZJTEVTIHZhbHVlPSJsaWJwbmcub2JqIC4uXC4uXHBuZ3d1dGlsLm9iaiAuLlwuLlxwbmdlcnJvci5vYmogLi5cLi5ccG5nZ2V0Lm9iaiAKLSAgICAgIC4uXC4uXHBuZ21lbS5vYmogLi5cLi5ccG5ncHJlYWQub2JqIC4uXC4uXHBuZ3JlYWQub2JqIC4uXC4uXHBuZ3Jpby5vYmogCi0gICAgICAuLlwuLlxwbmdydHJhbi5vYmogLi5cLi5ccG5ncnV0aWwub2JqIC4uXC4uXHBuZ3NldC5vYmogLi5cLi5ccG5ndHJhbnMub2JqIAotICAgICAgLi5cLi5ccG5nd2lvLm9iaiAuLlwuLlxwbmd3cml0ZS5vYmogLi5cLi5ccG5nd3RyYW4ub2JqIC4uXC4uXHBuZy5vYmoiLz4KLSAgICA8UkVTRklMRVMgdmFsdWU9IiIvPgotICAgIDxERUZGSUxFIHZhbHVlPSIiLz4KLSAgICA8UkVTREVQRU4gdmFsdWU9IiQoUkVTRklMRVMpIi8+Ci0gICAgPExJQkZJTEVTIHZhbHVlPSIuLlwuLlwuLlx6bGliXHpsaWIubGliIi8+Ci0gICAgPExJQlJBUklFUyB2YWx1ZT0iYmNic21wNTAubGliIGRjbG9jeDUwLmxpYiBOTUZhc3Q1MC5saWIgVGVlNTAubGliIFZjbHg1MC5saWIgVmNsNTAubGliIi8+Ci0gICAgPFNQQVJFTElCUyB2YWx1ZT0iVmNsNTAubGliIFZjbHg1MC5saWIgVGVlNTAubGliIE5NRmFzdDUwLmxpYiBkY2xvY3g1MC5saWIgYmNic21wNTAubGliIi8+Ci0gICAgPFBBQ0tBR0VTIHZhbHVlPSJWY2w1MC5icGkgVmNseDUwLmJwaSBiY2JzbXA1MC5icGkgUXJwdDUwLmJwaSBWY2xkYjUwLmJwaSBWY2xiZGU1MC5icGkgCi0gICAgICBpYnNtcDUwLmJwaSB2Y2xkYng1MC5icGkgVGVlVUk1MC5icGkgVGVlREI1MC5icGkgVGVlNTAuYnBpIFRlZVFSNTAuYnBpIAotICAgICAgVkNMSUI1MC5icGkgYmNiaWU1MC5icGkgdmNsaWU1MC5icGkgSW5ldGRiNTAuYnBpIEluZXQ1MC5icGkgTk1GYXN0NTAuYnBpIAotICAgICAgZGNsb2N4NTAuYnBpIGJjYjk3YXhzZXJ2ZXI1MC5icGkgU0lNVUxVU0NPTVBPTkVOVFMuYnBpIFNpbXVsdXMyLmJwaSIvPgotICAgIDxQQVRIQ1BQIHZhbHVlPSIuOy4uXC4uIi8+Ci0gICAgPFBBVEhQQVMgdmFsdWU9Ii47Ii8+Ci0gICAgPFBBVEhSQyB2YWx1ZT0iLjsiLz4KLSAgICA8UEFUSEFTTSB2YWx1ZT0iLjsiLz4KLSAgICA8REVCVUdMSUJQQVRIIHZhbHVlPSIkKEJDQilcbGliXGRlYnVnIi8+Ci0gICAgPFJFTEVBU0VMSUJQQVRIIHZhbHVlPSIkKEJDQilcbGliXHJlbGVhc2UiLz4KLSAgICA8TElOS0VSIHZhbHVlPSJ0bGluazMyIi8+Ci0gICAgPFVTRVJERUZJTkVTIHZhbHVlPSJQTkdfQlVJTERfRExMO1BOR19OT19NT0RVTEVERUYiLz4KLSAgICA8U1lTREVGSU5FUyB2YWx1ZT0iTk9fU1RSSUNUO19OT19WQ0w7X1JUTERMTCIvPgotICAgIDxNQUlOU09VUkNFIHZhbHVlPSJsaWJwbmcuYnBmIi8+Ci0gICAgPElOQ0xVREVQQVRIIHZhbHVlPSIuLlwuLjsuLlwuLlwuLlx6bGliOyQoQkNCKVxpbmNsdWRlIi8+Ci0gICAgPExJQlBBVEggdmFsdWU9Ii4uXC4uOyQoQkNCKVxsaWJcb2JqOyQoQkNCKVxsaWIiLz4KLSAgICA8V0FSTklOR1MgdmFsdWU9Ii13ODA5MiAtdzgwOTEgLXc4MDkwIC13ODA4OSAtdzgwODcgLXdwcmMgLXd1Y3AgLXdzdHYgLXdzdHUgLXdzaWcgLXdwaW4gCi0gICAgICAtd25vZCAtd25hayAtd2RlZiAtd2NsbiAtd2JiZiAtd2FzbSAtd2FtcCAtd2FtYiIvPgotICA8L01BQ1JPUz4KLSAgPE9QVElPTlM+Ci0gICAgPENGTEFHMSB2YWx1ZT0iLVdEIC1PMiAtdyAtVnggLVZlIC14LSAtUlQtIC1YLSAtYTggLTUgLWItIC1kIC1rLSAtdmkgLXRXRCAtdFdNIC1jIi8+Ci0gICAgPFBGTEFHUyB2YWx1ZT0iLSRZLSAtJEwtIC0kRC0gLSRDLSAtdiAtSlBITkUgLU0iLz4KLSAgICA8UkZMQUdTIHZhbHVlPSIiLz4KLSAgICA8QUZMQUdTIHZhbHVlPSIvbXggL3cyIC96biIvPgotICAgIDxMRkxBR1MgdmFsdWU9Ii1EJnF1b3Q7JnF1b3Q7IC1hYSAtVHBkIC14IC1HbiAtR2kgLXciLz4KLSAgPC9PUFRJT05TPgotICA8TElOS0VSPgotICAgIDxBTExPQkogdmFsdWU9ImMwZDMyLm9iaiAkKE9CSkZJTEVTKSIvPgotICAgIDxBTExSRVMgdmFsdWU9IiQoUkVTRklMRVMpIi8+Ci0gICAgPEFMTExJQiB2YWx1ZT0iJChMSUJGSUxFUykgJChMSUJSQVJJRVMpIGltcG9ydDMyLmxpYiBjdzMybXRpLmxpYiIvPgotICA8L0xJTktFUj4KLSAgPElERU9QVElPTlM+Ci1bVmVyc2lvbiBJbmZvXQotSW5jbHVkZVZlckluZm89MAotQXV0b0luY0J1aWxkPTAKLU1ham9yVmVyPTEKLU1pbm9yVmVyPTAKLVJlbGVhc2U9MAotQnVpbGQ9MAotRGVidWc9MAotUHJlUmVsZWFzZT0wCi1TcGVjaWFsPTAKLVByaXZhdGU9MAotRExMPTEKLUxvY2FsZT0yMDU3Ci1Db2RlUGFnZT0xMjUyCi0KLVtWZXJzaW9uIEluZm8gS2V5c10KLUNvbXBhbnlOYW1lPQotRmlsZURlc2NyaXB0aW9uPQotRmlsZVZlcnNpb249MS4wLjAuMAotSW50ZXJuYWxOYW1lPQotTGVnYWxDb3B5cmlnaHQ9Ci1MZWdhbFRyYWRlbWFya3M9Ci1PcmlnaW5hbEZpbGVuYW1lPQotUHJvZHVjdE5hbWU9Ci1Qcm9kdWN0VmVyc2lvbj0KLUNvbW1lbnRzPQotCi1bSGlzdG9yeUxpc3RzXGhsSW5jbHVkZVBhdGhdCi1Db3VudD0xOAotSXRlbTA9Li5cLi47Li5cLi5cLi5cemxpYjskKEJDQilcaW5jbHVkZQotSXRlbTE9Li5cLi47UDpcTXkgRG9jdW1lbnRzXFNvdXJjZVxQTkcrWkxpYlx6bGliOyQoQkNCKVxpbmNsdWRlCi1JdGVtMj0uLlwuLjsuLlxTb3VyY2VcVGhpcmRQYXJ0eVxQb3J0YWJsZU5ldHdvcmtHcmFwaGljc1xleHRlcm5hbDsuLlxTb3VyY2VcVGhpcmRQYXJ0eVxQb3J0YWJsZU5ldHdvcmtHcmFwaGljczsuLlxTb3VyY2VcVGhpcmRQYXJ0eVxaTGliQ29tcHJlc3Npb25cZXh0ZXJuYWw7JChCQ0IpXGluY2x1ZGUKLUl0ZW0zPS4uXFNvdXJjZVxUaGlyZFBhcnR5XFBvcnRhYmxlTmV0d29ya0dyYXBoaWNzXGV4dGVybmFsOy4uXFNvdXJjZVxUaGlyZFBhcnR5XFBvcnRhYmxlTmV0d29ya0dyYXBoaWNzOy4uXFNvdXJjZVxUaGlyZFBhcnR5XFpMaWJDb21wcmVzc2lvblxleHRlcm5hbDskKEJDQilcaW5jbHVkZQotSXRlbTQ9Li5cU291cmNlXFRoaXJkUGFydHlcUG9ydGFibGVOZXR3b3JrR3JhcGhpY3NcZXh0ZXJuYWw7Li5cU291cmNlXFRoaXJkUGFydHlcUG9ydGFibGVOZXR3b3JrR3JhcGhpY3M7Li5cU291cmNlXFRoaXJkUGFydHlcWkxpYkNvbXByZXNzaW9uOyQoQkNCKVxpbmNsdWRlCi1JdGVtNT0uLlxTb3VyY2VcVGhpcmRQYXJ0eVxQb3J0YWJsZU5ldHdvcmtHcmFwaGljczsuLlxTb3VyY2VcVGhpcmRQYXJ0eVxaTGliQ29tcHJlc3Npb247JChCQ0IpXGluY2x1ZGUKLUl0ZW02PS4uXFNvdXJjZVxUaGlyZFBhcnR5XFBvcnRhYmxlTmV0d29ya0dyYXBoaWNzO1A6XERldmVsb3BtZW50XFNvdXJjZVxUaGlyZFBhcnR5XFpMaWJDb21wcmVzc2lvbjskKEJDQilcaW5jbHVkZQotSXRlbTc9Li5cU291cmNlXFRoaXJkUGFydHlcUG9ydGFibGVOZXR3b3JrR3JhcGhpY3M7JChCQ0IpXGluY2x1ZGUKLUl0ZW04PSQoQkNCKVxpbmNsdWRlCi1JdGVtOT0uLlxTb3VyY2U7Li5cU291cmNlXEdlbmVyYWxcVGVtcGxhdGVzOy4uXFNvdXJjZVxTSU1VdGlsaXRpZXM7JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcdmNsCi1JdGVtMTA9UDpcRGV2ZWxvcG1lbnRcU291cmNlXDtQOlxEZXZlbG9wbWVudFxTb3VyY2VcR2VuZXJhbFxUZW1wbGF0ZXNcO1A6XERldmVsb3BtZW50XFNvdXJjZVxTSU1VdGlsaXRpZXNcOyQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXHZjbAotSXRlbTExPVA6XERldmVsb3BtZW50XFNvdXJjZTtQOlxEZXZlbG9wbWVudFxTb3VyY2VcR2VuZXJhbFxUZW1wbGF0ZXNcO1A6XERldmVsb3BtZW50XFNvdXJjZVxTSU1VdGlsaXRpZXNcOyQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXHZjbAotSXRlbTEyPVA6XERldmVsb3BtZW50XFNvdXJjZVxHZW5lcmFsXFRlbXBsYXRlc1w7UDpcRGV2ZWxvcG1lbnRcU291cmNlXFNJTVV0aWxpdGllc1w7JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcdmNsCi1JdGVtMTM9UDpcRGV2ZWxvcG1lbnRcU291cmNlXEdlbmVyYWxcVGVtcGxhdGVzXDtQOlxEZXZlbG9wbWVudFxTb3VyY2VcU0lNVXRpbGl0aWVzOyQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXHZjbAotSXRlbTE0PVA6XERldmVsb3BtZW50XFNvdXJjZVxHZW5lcmFsXFRlbXBsYXRlc1w7JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcdmNsCi1JdGVtMTU9UDpcRGV2ZWxvcG1lbnRcU291cmNlXEdlbmVyYWxcVGVtcGxhdGVzOyQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXHZjbAotSXRlbTE2PVA6XERldmVsb3BtZW50XFNvdXJjZTskKEJDQilcaW5jbHVkZTskKEJDQilcaW5jbHVkZVx2Y2wKLUl0ZW0xNz0kKEJDQilcaW5jbHVkZTskKEJDQilcaW5jbHVkZVx2Y2wKLQotW0hpc3RvcnlMaXN0c1xobExpYnJhcnlQYXRoXQotQ291bnQ9MTAKLUl0ZW0wPS4uXC4uOyQoQkNCKVxsaWJcb2JqOyQoQkNCKVxsaWIKLUl0ZW0xPS4uXC4uOy4uXFNvdXJjZVxUaGlyZFBhcnR5XFBvcnRhYmxlTmV0d29ya0dyYXBoaWNzXGV4dGVybmFsOy4uXFNvdXJjZVxUaGlyZFBhcnR5XFBvcnRhYmxlTmV0d29ya0dyYXBoaWNzOyQoQkNCKVxsaWJcb2JqOyQoQkNCKVxsaWIKLUl0ZW0yPS4uXFNvdXJjZVxUaGlyZFBhcnR5XFBvcnRhYmxlTmV0d29ya0dyYXBoaWNzXGV4dGVybmFsOy4uXFNvdXJjZVxUaGlyZFBhcnR5XFBvcnRhYmxlTmV0d29ya0dyYXBoaWNzOyQoQkNCKVxsaWJcb2JqOyQoQkNCKVxsaWIKLUl0ZW0zPS4uXFNvdXJjZVxUaGlyZFBhcnR5XFBvcnRhYmxlTmV0d29ya0dyYXBoaWNzOyQoQkNCKVxsaWJcb2JqOyQoQkNCKVxsaWIKLUl0ZW00PSQoQkNCKVxsaWJcb2JqOyQoQkNCKVxsaWIKLUl0ZW01PS4uXFNvdXJjZVxTSU1VdGlsaXRpZXM7Li5cU291cmNlOyQoQkNCKVxsaWJcb2JqOyQoQkNCKVxsaWIKLUl0ZW02PVA6XERldmVsb3BtZW50XFNvdXJjZVxTSU1VdGlsaXRpZXNcO1A6XERldmVsb3BtZW50XFNvdXJjZVw7JChCQ0IpXGxpYlxvYmo7JChCQ0IpXGxpYgotSXRlbTc9UDpcRGV2ZWxvcG1lbnRcU291cmNlXFNJTVV0aWxpdGllcztQOlxEZXZlbG9wbWVudFxTb3VyY2VcOyQoQkNCKVxsaWJcb2JqOyQoQkNCKVxsaWIKLUl0ZW04PVA6XERldmVsb3BtZW50XFNvdXJjZVw7JChCQ0IpXGxpYlxvYmo7JChCQ0IpXGxpYgotSXRlbTk9UDpcRGV2ZWxvcG1lbnRcU291cmNlOyQoQkNCKVxsaWJcb2JqOyQoQkNCKVxsaWIKLQotW0hpc3RvcnlMaXN0c1xobERlYnVnU291cmNlUGF0aF0KLUNvdW50PTEKLUl0ZW0wPSQoQkNCKVxzb3VyY2VcdmNsCi0KLVtIaXN0b3J5TGlzdHNcaGxDb25kaXRpb25hbHNdCi1Db3VudD0yMAotSXRlbTA9WkxJQl9ETEw7Wl9QUkVGSVg7UE5HX0JVSUxEX0RMTDtQTkdfTk9fTU9EVUxFREVGCi1JdGVtMT1fREVCVUc7WkxJQl9ETEw7Wl9QUkVGSVg7UE5HX0JVSUxEX0RMTDtQTkdfTk9fTU9EVUxFREVGCi1JdGVtMj1QTkdfQlVJTERfRExMO1pMSUJfRExMO19ERUJVRztQTkdfTk9fTU9EVUxFREVGCi1JdGVtMz1QTkdfQlVJTERfRExMO1pMSUJfRExMO19ERUJVRztQTkdfREVCVUc9NTtQTkdfTk9fTU9EVUxFREVGO1BOR19OT19HTE9CQUxfQVJSQVlTCi1JdGVtND1QTkdfQlVJTERfRExMO1pMSUJfRExMO19ERUJVRztQTkdfREVCVUc9NTtQTkdfTk9fTU9EVUxFREVGO1BOR19TRVRKTVBfTk9UX1NVUFBPUlRFRDtQTkdfREVCVUdfRklMRT1zdGRlcnIKLUl0ZW01PVBOR19CVUlMRF9ETEw7WkxJQl9ETEw7X0RFQlVHO1BOR19ERUJVRztQTkdfTk9fTU9EVUxFREVGO1BOR19TRVRKTVBfTk9UX1NVUFBPUlRFRAotSXRlbTY9UE5HX0JVSUxEX0RMTDtaTElCX0RMTDtfREVCVUc7UE5HX0RFQlVHPTU7UE5HX05PX01PRFVMRURFRjtQTkdfU0VUSk1QX05PVF9TVVBQT1JURUQKLUl0ZW03PVBOR19CVUlMRF9ETEw7WkxJQl9ETEw7X0RFQlVHO1BOR19ERUJVRz01O1BOR19OT19NT0RVTEVERUYKLUl0ZW04PVBOR19CVUlMRF9ETEw7WkxJQl9ETEw7X0RFQlVHO1BOR19ERUJVRz01Ci1JdGVtOT1QTkdfQlVJTERfRExMO1pMSUJfRExMO19ERUJVRwotSXRlbTEwPVBOR19CVUlMRF9ETEw7WkxJQl9ETEwKLUl0ZW0xMT1QTkdfQlVJTERfRExMCi1JdGVtMTI9UE5HX0RMTDtQTkdfQlVJTERfRExMO1pMSUJfRExMCi1JdGVtMTM9UE5HX0RMTDtQTkdfQlVJTERfRExMO1BOR19OT19HTE9CQUxfQVJSQVlTO1pMSUJfRExMCi1JdGVtMTQ9UE5HX0RMTDtQTkdfQlVJTERfRExMO1BOR19OT19HTE9CQUxfQVJSQVlTCi1JdGVtMTU9UE5HX0RMTDtQTkdfQlVJTERfRExMCi1JdGVtMTY9UE5HX0RMTDtQTkdfQlVJTERfRExMO1BOR19NT0RVTEVERUYKLUl0ZW0xNz1fSFRNTF9GT1JNCi1JdGVtMTg9X0RFQlVHO19IVE1MX0ZPUk0KLUl0ZW0xOT1fREVCVUcKLQotW0hpc3RvcnlMaXN0c1xobEludE91dHB1dERpcl0KLUNvdW50PTIKLUl0ZW0wPS4uXE9iagotSXRlbTE9UDpcRGV2ZWxvcG1lbnRcT2JqCi0KLVtEZWJ1Z2dpbmddCi1EZWJ1Z1NvdXJjZURpcnM9Ci0KLVtQYXJhbWV0ZXJzXQotUnVuUGFyYW1zPQotSG9zdEFwcGxpY2F0aW9uPVA6XERldmVsb3BtZW50XEV4ZWN1dGFibGVzXExpYlBOR1Rlc3RBcHAuZXhlCi1SZW1vdGVIb3N0PQotUmVtb3RlUGF0aD0KLVJlbW90ZURlYnVnPTAKLQotW0NvbXBpbGVyXQotU2hvd0luZm9Nc2dzPTAKLUxpbmtEZWJ1Z1ZjbD0wCi1MaW5rQ0dMSUI9MAotICA8L0lERU9QVElPTlM+Ci08L1BST0pFQ1Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvY2J1aWxkZXI1L2xpYnBuZy5jcHAgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy9jYnVpbGRlcjUvbGlicG5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyZjI3NC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy9jYnVpbGRlcjUvbGlicG5nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaW5jbHVkZSA8d2luZG93cy5oPgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICAgSW1wb3J0YW50IG5vdGUgYWJvdXQgRExMIG1lbW9yeSBtYW5hZ2VtZW50IHdoZW4geW91ciBETEwgdXNlcyB0aGUKLS8vICAgc3RhdGljIHZlcnNpb24gb2YgdGhlIFJ1blRpbWUgTGlicmFyeToKLS8vCi0vLyAgIElmIHlvdXIgRExMIGV4cG9ydHMgYW55IGZ1bmN0aW9ucyB0aGF0IHBhc3MgU3RyaW5nIG9iamVjdHMgKG9yIHN0cnVjdHMvCi0vLyAgIGNsYXNzZXMgY29udGFpbmluZyBuZXN0ZWQgU3RyaW5ncykgYXMgcGFyYW1ldGVyIG9yIGZ1bmN0aW9uIHJlc3VsdHMsCi0vLyAgIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHRoZSBsaWJyYXJ5IE1FTU1HUi5MSUIgdG8gYm90aCB0aGUgRExMIHByb2plY3QgYW5kCi0vLyAgIGFueSBvdGhlciBwcm9qZWN0cyB0aGF0IHVzZSB0aGUgRExMLiAgWW91IHdpbGwgYWxzbyBuZWVkIHRvIHVzZSBNRU1NR1IuTElCCi0vLyAgIGlmIGFueSBvdGhlciBwcm9qZWN0cyB3aGljaCB1c2UgdGhlIERMTCB3aWxsIGJlIHBlcmZvcm1pbmcgbmV3IG9yIGRlbGV0ZQotLy8gICBvcGVyYXRpb25zIG9uIGFueSBub24tVE9iamVjdC1kZXJpdmVkIGNsYXNzZXMgd2hpY2ggYXJlIGV4cG9ydGVkIGZyb20gdGhlCi0vLyAgIERMTC4gQWRkaW5nIE1FTU1HUi5MSUIgdG8geW91ciBwcm9qZWN0IHdpbGwgY2hhbmdlIHRoZSBETEwgYW5kIGl0cyBjYWxsaW5nCi0vLyAgIEVYRSdzIHRvIHVzZSB0aGUgQk9STE5ETU0uRExMIGFzIHRoZWlyIG1lbW9yeSBtYW5hZ2VyLiAgSW4gdGhlc2UgY2FzZXMsCi0vLyAgIHRoZSBmaWxlIEJPUkxORE1NLkRMTCBzaG91bGQgYmUgZGVwbG95ZWQgYWxvbmcgd2l0aCB5b3VyIERMTC4KLS8vCi0vLyAgIFRvIGF2b2lkIHVzaW5nIEJPUkxORE1NLkRMTCwgcGFzcyBzdHJpbmcgaW5mb3JtYXRpb24gdXNpbmcgImNoYXIgKiIgb3IKLS8vICAgU2hvcnRTdHJpbmcgcGFyYW1ldGVycy4KLS8vCi0vLyAgIElmIHlvdXIgRExMIHVzZXMgdGhlIGR5bmFtaWMgdmVyc2lvbiBvZiB0aGUgUlRMLCB5b3UgZG8gbm90IG5lZWQgdG8KLS8vICAgZXhwbGljaXRseSBhZGQgTUVNTUdSLkxJQiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBpbXBsaWNpdGx5IGZvciB5b3UKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBXSU5BUEkgRGxsRW50cnlQb2ludChISU5TVEFOQ0UsIHVuc2lnbmVkIGxvbmcsIHZvaWQqKQotewotICAgIHJldHVybiAxOwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy9jYnVpbGRlcjUvbGlicG5nLnJlYWRtZS50eHQgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy9jYnVpbGRlcjUvbGlicG5nLnJlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OWMxZTkuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvY2J1aWxkZXI1L2xpYnBuZy5yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotUHJvamVjdCBmaWxlcyB0byBidWlsZCBsaWJwbmcgdXNpbmcgQm9ybGFuZCBDKysgQnVpbGRlciB2NS4wCi0KLUluIG9yZGVyIHRvIGJ1aWxkIGFuZCB1c2UgbGlicG5nLCBwbGVhc2UgZm9sbG93IHRoZXNlIHN0ZXBzOgotCi0gMSkuIEluc3RhbGwgemxpYiBpbiBhIGRpcmVjdG9yeSBhdCB0aGUgc2FtZSBsZXZlbCB3aXRoIGxpYnBuZy4KLQotIDIpLiBJbiBhIGNvbnNvbGUgd2luZG93LCBnbyB0byB0aGUgemxpYiBkaXJlY3RvcnkgYW5kIHR5cGU6Ci0gICAgICAgbWFrZSAtZiB3aW4zMlxNYWtlZmlsZS5ib3IKLSAgICAgQWZ0ZXIgcGVyZm9ybWluZyB0aGlzIHN0ZXAsIHlvdSBzaG91bGQgaGF2ZSBhIGZpbGUgbmFtZWQKLSAgICAgemxpYi5saWIgaW4gdGhlIHpsaWIgZGlyZWN0b3J5LgotCi0gMykuIEFkZCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbmFsIGRlZmluZSB0byB5b3VyIHByb2plY3Q6Ci0gICAgICAgUE5HX1VTRV9ETEwKLQotIDQpLiBBZGQgbGlicG5nLmxpYiBvciBsaWJwbmdzdGF0LmxpYiB0byB0aGUgcHJvamVjdC4KLSAgICAgQnVpbGQgdGhlIHByb2plY3QuCi0KLSA1KS4gSWYgdGhlIGJ1aWxkIGZhaWxzLCBhZGQgdGhlIHBhdGhzIHRvIHBuZy5oIGFuZCB6bGliLmggdG8KLSAgICAgeW91ciBpbmNsdWRlIHBhdGgsIGFuZCByZXN0YXJ0IHRoZSBidWlsZC4KLQotQnkgZGVmYXVsdCwgdGhlIGxpYnBuZyBwcm9qZWN0IHVzZXMgemxpYiBhcyBhIHN0YXRpYyBsaWJyYXJ5LiAgSWYKLXlvdSB3aXNoIHRvIHVzZSB6bGliIGFzIGEgRExMLCBwbGVhc2UgcmVhZCB0aGUgaW1wb3J0YW50IG5vdGVzIGZyb20KLXRoZSB6bGliIERMTCBGQVEsIGZvdW5kIGluc2lkZSB0aGUgemxpYiBkaXN0cmlidXRpb24uCi0KLVNlZSB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8gdXNlIHRoZSBjb2RlLgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvY2J1aWxkZXI1L2xpYnBuZ3N0YXQuYnBmIGIvbGlicy9saWJwbmcvcHJvamVjdHMvY2J1aWxkZXI1L2xpYnBuZ3N0YXQuYnBmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmM1YzQwLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL2NidWlsZGVyNS9saWJwbmdzdGF0LmJwZgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLVVTRVVOSVQoIi4uXC4uXHBuZy5jIik7Ci1VU0VVTklUKCIuLlwuLlxwbmdlcnJvci5jIik7Ci1VU0VVTklUKCIuLlwuLlxwbmdnZXQuYyIpOwotVVNFVU5JVCgiLi5cLi5ccG5nbWVtLmMiKTsKLVVTRVVOSVQoIi4uXC4uXHBuZ3ByZWFkLmMiKTsKLVVTRVVOSVQoIi4uXC4uXHBuZ3JlYWQuYyIpOwotVVNFVU5JVCgiLi5cLi5ccG5ncmlvLmMiKTsKLVVTRVVOSVQoIi4uXC4uXHBuZ3J0cmFuLmMiKTsKLVVTRVVOSVQoIi4uXC4uXHBuZ3J1dGlsLmMiKTsKLVVTRVVOSVQoIi4uXC4uXHBuZ3NldC5jIik7Ci1VU0VVTklUKCIuLlwuLlxwbmd0cmFucy5jIik7Ci1VU0VVTklUKCIuLlwuLlxwbmd3aW8uYyIpOwotVVNFVU5JVCgiLi5cLi5ccG5nd3JpdGUuYyIpOwotVVNFVU5JVCgiLi5cLi5ccG5nd3RyYW4uYyIpOwotVVNFVU5JVCgiLi5cLi5ccG5nd3V0aWwuYyIpOwotVVNFTElCKCIuLlwuLlwuLlx6bGliXHpsaWIubGliIik7Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2RlZmluZSBMaWJyYXJ5Ci0KLS8vIFRvIGFkZCBhIGZpbGUgdG8gdGhlIGxpYnJhcnkgdXNlIHRoZSBQcm9qZWN0IG1lbnUgJ0FkZCB0byBQcm9qZWN0Jy4KLQotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL2NidWlsZGVyNS9saWJwbmdzdGF0LmJwciBiL2xpYnMvbGlicG5nL3Byb2plY3RzL2NidWlsZGVyNS9saWJwbmdzdGF0LmJwcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1MWVjYy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy9jYnVpbGRlcjUvbGlicG5nc3RhdC5icHIKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnID8+Ci08IS0tIEMrK0J1aWxkZXIgWE1MIFByb2plY3QgLS0+Ci08UFJPSkVDVD4KLSAgPE1BQ1JPUz4KLSAgICA8VkVSU0lPTiB2YWx1ZT0iQkNCLjA1LjAzIi8+Ci0gICAgPFBST0pFQ1QgdmFsdWU9ImxpYnBuZ3N0YXQubGliIi8+Ci0gICAgPE9CSkZJTEVTIHZhbHVlPSIuLlwuLlxwbmdlcnJvci5vYmogLi5cLi5ccG5nLm9iaiAuLlwuLlxwbmd3dXRpbC5vYmogLi5cLi5ccG5nbWVtLm9iaiAKLSAgICAgIC4uXC4uXHBuZ3ByZWFkLm9iaiAuLlwuLlxwbmdyZWFkLm9iaiAuLlwuLlxwbmdyaW8ub2JqIC4uXC4uXHBuZ3J0cmFuLm9iaiAKLSAgICAgIC4uXC4uXHBuZ3J1dGlsLm9iaiAuLlwuLlxwbmdzZXQub2JqIC4uXC4uXHBuZ3RyYW5zLm9iaiAuLlwuLlxwbmd3aW8ub2JqIAotICAgICAgLi5cLi5ccG5nd3JpdGUub2JqIC4uXC4uXHBuZ3d0cmFuLm9iaiAuLlwuLlxwbmdnZXQub2JqIi8+Ci0gICAgPFJFU0ZJTEVTIHZhbHVlPSIiLz4KLSAgICA8REVGRklMRSB2YWx1ZT0iIi8+Ci0gICAgPFJFU0RFUEVOIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgotICAgIDxMSUJGSUxFUyB2YWx1ZT0iLi5cLi5cLi5cemxpYlx6bGliLmxpYiIvPgotICAgIDxMSUJSQVJJRVMgdmFsdWU9IiIvPgotICAgIDxQQUNLQUdFUyB2YWx1ZT0iIi8+Ci0gICAgPFBBVEhDUFAgdmFsdWU9Ii47Li5cLi4iLz4KLSAgICA8UEFUSFBBUyB2YWx1ZT0iLjsiLz4KLSAgICA8UEFUSFJDIHZhbHVlPSIuOyIvPgotICAgIDxQQVRIQVNNIHZhbHVlPSIuOyIvPgotICAgIDxMSU5LRVIgdmFsdWU9IlRMaWIiLz4KLSAgICA8VVNFUkRFRklORVMgdmFsdWU9IiIvPgotICAgIDxTWVNERUZJTkVTIHZhbHVlPSJfUlRMRExMO05PX1NUUklDVCIvPgotICAgIDxNQUlOU09VUkNFIHZhbHVlPSJsaWJwbmdzdGF0LmJwZiIvPgotICAgIDxJTkNMVURFUEFUSCB2YWx1ZT0iLi5cLi47Li5cLi5cLi5cemxpYjskKEJDQilcaW5jbHVkZSIvPgotICAgIDxMSUJQQVRIIHZhbHVlPSIuLlwuLjskKEJDQilcbGliXG9iajskKEJDQilcbGliIi8+Ci0gICAgPFdBUk5JTkdTIHZhbHVlPSItdy1wYXIiLz4KLSAgICA8TElTVEZJTEUgdmFsdWU9IiIvPgotICA8L01BQ1JPUz4KLSAgPE9QVElPTlM+Ci0gICAgPENGTEFHMSB2YWx1ZT0iLU8yIC13IC1WeCAtVmUgLVgtIC1hOCAtNSAtYi0gLWQgLWstIC12aSAtYyAtdFcgLXRXTSIvPgotICAgIDxQRkxBR1MgdmFsdWU9Ii0kWS0gLSRMLSAtJEQtIC0kQy0gLXYgLUpQSE5FIC1NIi8+Ci0gICAgPEFGTEFHUyB2YWx1ZT0iL214IC93MiAvem4iLz4KLSAgICA8TEZMQUdTIHZhbHVlPSIiLz4KLSAgPC9PUFRJT05TPgotICA8TElOS0VSPgotICAgIDxBTExPQkogdmFsdWU9IiQoT0JKRklMRVMpIi8+Ci0gICAgPEFMTExJQiB2YWx1ZT0iIi8+Ci0gIDwvTElOS0VSPgotICA8SURFT1BUSU9OUz4KLVtWZXJzaW9uIEluZm9dCi1JbmNsdWRlVmVySW5mbz0wCi1BdXRvSW5jQnVpbGQ9MAotTWFqb3JWZXI9MQotTWlub3JWZXI9MAotUmVsZWFzZT0wCi1CdWlsZD0wCi1EZWJ1Zz0wCi1QcmVSZWxlYXNlPTAKLVNwZWNpYWw9MAotUHJpdmF0ZT0wCi1ETEw9MAotTG9jYWxlPTIwNTcKLUNvZGVQYWdlPTEyNTIKLQotW1ZlcnNpb24gSW5mbyBLZXlzXQotQ29tcGFueU5hbWU9Ci1GaWxlRGVzY3JpcHRpb249Ci1GaWxlVmVyc2lvbj0xLjAuMC4wCi1JbnRlcm5hbE5hbWU9Ci1MZWdhbENvcHlyaWdodD0KLUxlZ2FsVHJhZGVtYXJrcz0KLU9yaWdpbmFsRmlsZW5hbWU9Ci1Qcm9kdWN0TmFtZT0KLVByb2R1Y3RWZXJzaW9uPTEuMC4wLjAKLUNvbW1lbnRzPQotCi1bSGlzdG9yeUxpc3RzXGhsSW5jbHVkZVBhdGhdCi1Db3VudD0yCi1JdGVtMD0uLlwuLjtQOlxNeSBEb2N1bWVudHNcU291cmNlXFBORytaTGliXHpsaWI7JChCQ0IpXGluY2x1ZGUKLUl0ZW0xPS4uXC4uOyQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXHZjbAotCi1bSGlzdG9yeUxpc3RzXGhsTGlicmFyeVBhdGhdCi1Db3VudD0xCi1JdGVtMD0uLlwuLjskKEJDQilcbGliXG9iajskKEJDQilcbGliCi0KLVtIaXN0b3J5TGlzdHNcaGxEZWJ1Z1NvdXJjZVBhdGhdCi1Db3VudD0xCi1JdGVtMD0kKEJDQilcc291cmNlXHZjbAotCi1bSGlzdG9yeUxpc3RzXGhsQ29uZGl0aW9uYWxzXQotQ291bnQ9MQotSXRlbTA9X0RFQlVHCi0KLVtIaXN0b3J5TGlzdHNcaGxUbGliUGFnZVNpemVdCi1Db3VudD0xCi1JdGVtMD0weDAwMTAKLQotW0RlYnVnZ2luZ10KLURlYnVnU291cmNlRGlycz0kKEJDQilcc291cmNlXHZjbAotCi1bUGFyYW1ldGVyc10KLVJ1blBhcmFtcz0KLUhvc3RBcHBsaWNhdGlvbj0KLVJlbW90ZUhvc3Q9Ci1SZW1vdGVQYXRoPQotUmVtb3RlRGVidWc9MAotCi1bQ29tcGlsZXJdCi1TaG93SW5mb01zZ3M9MAotTGlua0RlYnVnVmNsPTAKLUxpbmtDR0xJQj0wCi0KLVtMYW5ndWFnZV0KLUFjdGl2ZUxhbmc9Ci1Qcm9qZWN0TGFuZz0KLVJvb3REaXI9Ci0gIDwvSURFT1BUSU9OUz4KLTwvUFJPSkVDVD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy9jYnVpbGRlcjUvemxpYi5yZWFkbWUudHh0IGIvbGlicy9saWJwbmcvcHJvamVjdHMvY2J1aWxkZXI1L3psaWIucmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2YTdhOC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy9jYnVpbGRlcjUvemxpYi5yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotVGhlIHByb2plY3QgdGhhdCBidWlsZHMgbGlicG5nIHVuZGVyIEJvcmxhbmQgQysrIEJ1aWxkZXIgZG9lcyBub3QKLWV4cGxpY2l0bHkgYnVpbGQgemxpYi4gIEJ5IHRha2luZyB0aGlzIGRlY2lzaW9uLCB0aGVyZSBpcyBubyBuZWVkCi10byB1cGRhdGUgdGhlIGxpYnBuZyBwcm9qZWN0IGVhY2ggdGltZSB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIGluCi10aGUgbGlzdCBvZiB6bGliIHNvdXJjZSBmaWxlcy4gIEFmdGVyIGFsbCwgdGhpcyBsaXN0IGlzIHByaXZhdGUgdG8KLXpsaWIsIGFuZCBhcHBsaWNhdGlvbnMgKHN1Y2ggYXMgbGlicG5nKSBzaG91bGQgbm90IGFzc3VtZSBhbnl0aGluZwotYWJvdXQgaXQuCi0KLUlmIHlvdSB3aXNoIHRvIGNvbnRyaWJ1dGUgYSBwcm9qZWN0IHRoYXQgYnVpbGRzIHpsaWIgdW5kZXIgQm9ybGFuZAotQysrIEJ1aWxkZXIsIHBsZWFzZSBzdWJtaXQgaXQgdG8gdGhlIHpsaWIgZGV2ZWxvcGVycywgbm90IHRvIHRoZQotbGlicG5nIGRldmVsb3BlcnMuCi0KLUJ5IGRlZmF1bHQsIHRoZSBsaWJwbmcgcHJvamVjdCB1c2VzIHpsaWIgYXMgYSBzdGF0aWMgbGlicmFyeS4gIElmCi15b3Ugd2lzaCB0byB1c2UgemxpYiBhcyBhIERMTCwgcGxlYXNlIHJlYWQgdGhlIGltcG9ydGFudCBub3RlcyBmcm9tCi10aGUgemxpYiBETEwgRkFRLCBmb3VuZCBpbnNpZGUgdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvbmV0d2FyZS50eHQgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy9uZXR3YXJlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4MzYxZC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy9uZXR3YXJlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQSBzZXQgb2YgcHJvamVjdCBmaWxlcyBpcyBhdmFpbGFibGUgZm9yIE5ldHdhcmUuICBHZXQKLWxpYnBuZy0xLjIuNS1wcm9qZWN0LW5ldHdhcmUuemlwIGZyb20gYSBsaWJwbmcgZGlzdHJpYnV0aW9uCi1zaXRlIHN1Y2ggYXMgaHR0cDovL2xpYnBuZy5zb3VyY2Vmb3JnZS5uZXQKLQotUHV0IHRoZSB6aXAgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSAocHJvamVjdHMpIGFuZCB0aGVuIHJ1bgotInVuemlwIC1hIGxpYnBuZy0xLjIuNS1wcm9qZWN0LW5ldHdhcmUuemlwIgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzYvUkVBRE1FLnR4dCBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM2L1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDk4MGQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzYvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLU1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMCBmb3IgbGlicG5nLgotCi1Db3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBTaW1vbi1QaWVycmUgQ2FkaWV1eC4KLUNvcHlyaWdodCAoQykgMjAwNCBDb3NtaW4gVHJ1dGEuCi1Gb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotCi1Bc3N1bXB0aW9uczoKLSogVGhlIGxpYnBuZyBzb3VyY2UgZmlsZXMgYXJlIGluIC4uXC4uCi0qIFRoZSB6bGliIHNvdXJjZSBmaWxlcyBhcmUgaW4gLi5cLi5cLi5cemxpYgotKiBUaGUgemxpYiBwcm9qZWN0IGZpbGVzIGFyZSBpbiAuLlwuLlwuLlx6bGliXHByb2plY3RzXHZpc3VhbGM2Ci0KLQotVG8gdXNlOgotCi0xKSBPbiB0aGUgbWFpbiBtZW51LCBzZWxlY3QgIkZpbGUgfCBPcGVuIFdvcmtzcGFjZSIuCi0gICBPcGVuICJsaWJwbmcuZHN3Ii4KLQotMikgU2VsZWN0ICJCdWlsZCB8IFNldCBBY3RpdmUgQ29uZmlndXJhdGlvbiIuCi0gICBDaG9vc2UgdGhlIGNvbmZpZ3VyYXRpb24geW91IHdpc2ggdG8gYnVpbGQuCi0gICAoQ2hvb3NlIGxpYnBuZyBvciBwbmd0ZXN0OyB6bGliIHdpbGwgYmUgYnVpbHQgYXV0b21hdGljYWxseS4pCi0KLTMpIFNlbGVjdCAiQnVpbGQgfCBDbGVhbiIuCi0KLTQpIFNlbGVjdCAiQnVpbGQgfCBCdWlsZCAuLi4gKEY3KSIuICBJZ25vcmUgd2FybmluZyBtZXNzYWdlcyBhYm91dAotICAgbm90IGJlaW5nIGFibGUgdG8gZmluZCBjZXJ0YWluIGluY2x1ZGUgZmlsZXMgKGUuZy4gYWxsb2MuaCkuCi0KLTUpIElmIHlvdSBidWlsdCB0aGUgc2FtcGxlIHByb2dyYW0gKHBuZ3Rlc3QpLAotICAgc2VsZWN0ICJCdWlsZCB8IEV4ZWN1dGUgLi4uIChDdHJsK0Y1KSIuCi0KLQotVGhpcyBwcm9qZWN0IGJ1aWxkcyB0aGUgbGlicG5nIGJpbmFyaWVzIGFzIGZvbGxvd3M6Ci0KLSogV2luMzJfRExMX1JlbGVhc2VcbGlicG5nMTMuZGxsICAgICAgRExMIGJ1aWxkCi0qIFdpbjMyX0RMTF9EZWJ1Z1xsaWJwbmcxM2QuZGxsICAgICAgIERMTCBidWlsZCAoZGVidWcgdmVyc2lvbikKLSogV2luMzJfRExMX0FTTV9SZWxlYXNlXGxpYnBuZzEzLmRsbCAgRExMIGJ1aWxkIHVzaW5nIEFTTSBjb2RlCi0qIFdpbjMyX0RMTF9BU01fRGVidWdcbGlicG5nMTNkLmRsbCAgIERMTCBidWlsZCB1c2luZyBBU00gKGRlYnVnIHZlcnNpb24pCi0qIFdpbjMyX0RMTF9WQlxsaWJwbmcxM3ZiLmRsbCAgICAgICAgIERMTCBidWlsZCBmb3IgVmlzdWFsIEJhc2ljLCB1c2luZyBzdGRjYWxsCi0qIFdpbjMyX0xJQl9SZWxlYXNlXGxpYnBuZy5saWIgICAgICAgIHN0YXRpYyBidWlsZAotKiBXaW4zMl9MSUJfRGVidWdcbGlicG5nZC5saWIgICAgICAgICBzdGF0aWMgYnVpbGQgKGRlYnVnIHZlcnNpb24pCi0qIFdpbjMyX0xJQl9BU01fUmVsZWFzZVxsaWJwbmcubGliICAgIHN0YXRpYyBidWlsZCB1c2luZyBBU00gY29kZQotKiBXaW4zMl9MSUJfQVNNX0RlYnVnXGxpYnBuZ2QubGliICAgICBzdGF0aWMgYnVpbGQgdXNpbmcgQVNNIChkZWJ1ZyB2ZXJzaW9uKQotCi0KLU5vdGVzOgotCi1JZiB5b3UgY2hhbmdlIGFueXRoaW5nIGluIHRoZSBzb3VyY2UgZmlsZXMsIG9yIHNlbGVjdCBkaWZmZXJlbnQgY29tcGlsZXIKLXNldHRpbmdzLCBwbGVhc2UgY2hhbmdlIHRoZSBETEwgbmFtZSB0byBzb21ldGhpbmcgZGlmZmVyZW50IHRoYW4gYW55IG9mCi10aGUgYWJvdmUgbmFtZXMuIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGluIHlvdXIgInBuZ3Vzci5oIiB5b3UgZGVmaW5lCi1QTkdfVVNFUl9QUklWQVRFQlVJTEQgYW5kIFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVggYWNjb3JkaW5nIHRvIHRoZQotaW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIGluICJwbmdjb25mLmgiLgotCi1BbGwgRExMcyBidWlsdCBieSB0aGlzIHByb2plY3QgdXNlIHRoZSBNaWNyb3NvZnQgZHluYW1pYyBDIHJ1bnRpbWUgbGlicmFyeQotTVNWQ1JULkRMTCAoTVNWQ1JURC5ETEwgZm9yIGRlYnVnIHZlcnNpb25zKS4gIElmIHlvdSBkaXN0cmlidXRlIGFueSBvZiB0aGUKLWFib3ZlIG1lbnRpb25lZCBsaWJyYXJpZXMgeW91IHNob3VsZCBhbHNvIGluY2x1ZGUgdGhpcyBETEwgaW4geW91ciBwYWNrYWdlLgotRm9yIGEgbGlzdCBvZiBmaWxlcyB0aGF0IGFyZSByZWRpc3RyaWJ1dGFibGUgaW4gVmlzdWFsIEMrKyA2LjAsIHNlZQotQ29tbW9uXFJlZGlzdFxSZWRpc3QudHh0IG9uIERpc2MgMSBvZiB0aGUgVmlzdWFsIEMrKyA2LjAgcHJvZHVjdCBDRHMuCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNi9saWJwbmcuZHNwIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzYvbGlicG5nLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3N2NjMy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNi9saWJwbmcuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibGlicG5nIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQKLQotQ0ZHPWxpYnBuZyAtIFdpbjMyIERMTCBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFCi0hTUVTU0FHRSBOTUFLRSAvZiAibGlicG5nLm1hayIuCi0hTUVTU0FHRQotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRQotIU1FU1NBR0UgTk1BS0UgL2YgImxpYnBuZy5tYWsiIENGRz0ibGlicG5nIC0gV2luMzIgRExMIFJlbGVhc2UiCi0hTUVTU0FHRQotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRQotIU1FU1NBR0UgImxpYnBuZyAtIFdpbjMyIERMTCBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJsaWJwbmcgLSBXaW4zMiBETEwgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgImxpYnBuZyAtIFdpbjMyIERMTCBBU00gUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAibGlicG5nIC0gV2luMzIgRExMIEFTTSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAibGlicG5nIC0gV2luMzIgRExMIFZCIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJsaWJwbmcgLSBXaW4zMiBMSUIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCi0hTUVTU0FHRSAibGlicG5nIC0gV2luMzIgTElCIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikKLSFNRVNTQUdFICJsaWJwbmcgLSBXaW4zMiBMSUIgQVNNIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQotIU1FU1NBR0UgImxpYnBuZyAtIFdpbjMyIExJQiBBU00gRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQotIU1FU1NBR0UKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLQotIUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgRExMIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJsaWJwbmdfX19XaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImxpYnBuZ19fX1dpbjMyX0RMTF9SZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0RMTF9SZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0RMTF9SZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi1DUFA9Y2wuZXhlCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWCAvWWMgL1l1Ci0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi5cLi4iIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJQTkdfQlVJTERfRExMIiAvRCAiUE5HX05PX01NWF9DT0RFIiAvRCAiWkxJQl9ETEwiIC9EICJfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIgL0ZEIC9jCi0jIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQotTVRMPW1pZGwuZXhlCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLVJTQz1yYy5leGUKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2kgIi4uXC4uIiAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIHpsaWIxLmxpYiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4NiAvb3V0OiJXaW4zMl9ETExfUmVsZWFzZVxsaWJwbmcxMy5kbGwiIC9saWJwYXRoOiIuLlwuLlwuLlx6bGliXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0RMTF9SZWxlYXNlIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgRExMIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibGlicG5nX19fV2luMzJfRExMX1JlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJsaWJwbmdfX19XaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9ETExfRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfRExMX0RlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi1DUFA9Y2wuZXhlCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVggL1ljIC9ZdQotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiREVCVUciIC9EICJQTkdfTk9fTU1YX0NPREUiIC9EIFBOR19ERUJVRz0xIC9EICJQTkdfQlVJTERfRExMIiAvRCAiWkxJQl9ETEwiIC9EICJfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUKLU1UTD1taWRsLmV4ZQotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi1SU0M9cmMuZXhlCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9pICIuLlwuLiIgL2QgIl9ERUJVRyIgL2QgUE5HX0RFQlVHPTEKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIgL25vbG9nbyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiB6bGliMWQubGliIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJXaW4zMl9ETExfRGVidWdcbGlicG5nMTNkLmRsbCIgL2xpYnBhdGg6Ii4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfRExMX0RlYnVnIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgRExMIEFTTSBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibGlicG5nX19fV2luMzJfRExMX0FTTV9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGlicG5nX19fV2luMzJfRExMX0FTTV9SZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0RMTF9BU01fUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9ETExfQVNNX1JlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLUNQUD1jbC5leGUKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYIC9ZYyAvWXUKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLlwuLiIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIlBOR19VU0VfUE5HVkNSRCIgL0QgIlBOR19CVUlMRF9ETEwiIC9EICJaTElCX0RMTCIgL0QgIlBOR19MSUJQTkdfU1BFQ0lBTEJVSUxEIiAvRCAiX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUKLU1UTD1taWRsLmV4ZQotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi1SU0M9cmMuZXhlCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9pICIuLlwuLiIgL2QgIk5ERUJVRyIgL2QgUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQ9IiIiIlVzZSBNTVggaW5zdHJ1Y3Rpb25zIiIiIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIHpsaWIxLmxpYiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4NiAvb3V0OiJXaW4zMl9ETExfQVNNX1JlbGVhc2VcbGlicG5nMTMuZGxsIiAvbGlicGF0aDoiLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9ETExfQVNNX1JlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBETEwgQVNNIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibGlicG5nX19fV2luMzJfRExMX0FTTV9EZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImxpYnBuZ19fX1dpbjMyX0RMTF9BU01fRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiV2luMzJfRExMX0FTTV9EZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9ETExfQVNNX0RlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi1DUFA9Y2wuZXhlCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVggL1ljIC9ZdQotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiREVCVUciIC9EIFBOR19ERUJVRz0xIC9EICJQTkdfVVNFX1BOR1ZDUkQiIC9EICJQTkdfQlVJTERfRExMIiAvRCAiWkxJQl9ETEwiIC9EICJQTkdfTElCUE5HX1NQRUNJQUxCVUlMRCIgL0QgIl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQotTVRMPW1pZGwuZXhlCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLVJTQz1yYy5leGUKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2kgIi4uXC4uIiAvZCAiX0RFQlVHIiAvZCBQTkdfREVCVUc9MSAvZCBQTkdfTElCUE5HX1NQRUNJQUxCVUlMRD0iIiIiVXNlIE1NWCBpbnN0cnVjdGlvbnMiIiIiCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIEFERCBMSU5LMzIgemxpYjFkLmxpYiAvbm9sb2dvIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiV2luMzJfRExMX0FTTV9EZWJ1Z1xsaWJwbmcxM2QuZGxsIiAvbGlicGF0aDoiLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9ETExfQVNNX0RlYnVnIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgRExMIFZCIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibGlicG5nX19fV2luMzJfRExMX1ZCIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGlicG5nX19fV2luMzJfRExMX1ZCIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0RMTF9WQiIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9ETExfVkIiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLUNQUD1jbC5leGUKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYIC9ZYyAvWXUKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLlwuLiIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIlBOR19CVUlMRF9ETEwiIC9EICJaTElCX0RMTCIgL0QgUE5HQVBJPV9fc3RkY2FsbCAvRCAiUE5HX05PX01PRFVMRURFRiIgL0QgIlBOR19MSUJQTkdfU1BFQ0lBTEJVSUxEIiAvRCAiX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUKLU1UTD1taWRsLmV4ZQotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi1SU0M9cmMuZXhlCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9pICIuLlwuLiIgL2QgIk5ERUJVRyIgL2RQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVg9IiIiIlZCIiIiIiAvZFBOR19MSUJQTkdfU1BFQ0lBTEJVSUxEPSIiIiJfX3N0ZGNhbGwgY2FsbGluZyBjb252ZW50aW9uIHVzZWQgZm9yIGV4cG9ydGVkIGZ1bmN0aW9ucyIiIiIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiB6bGliMS5saWIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYgL291dDoiV2luMzJfRExMX1ZCXGxpYnBuZzEzdmIuZGxsIiAvbGlicGF0aDoiLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9ETExfUmVsZWFzZSIKLSMgQmVnaW4gU3BlY2lhbCBCdWlsZCBUb29sCi1PdXREaXI9LlxXaW4zMl9ETExfVkIKLVRhcmdldE5hbWU9bGlicG5nMTN2YgotU09VUkNFPSIkKElucHV0UGF0aCkiCi1Qb3N0QnVpbGRfQ21kcz1lY2hvICAgIERlbGV0aW5nICQodGFyZ2V0bmFtZSkgaW1wb3J0IGxpYnJhcnkgYW5kIGV4cG9ydCBmaWxlIChOb3QgcmVxdWlyZWQgZm9yIFZCIHByb2plY3RzKQlkZWwgJChvdXRkaXIpXCQodGFyZ2V0bmFtZSkubGliCWRlbCAkKG91dGRpcilcJCh0YXJnZXRuYW1lKS5leHAKLSMgRW5kIFNwZWNpYWwgQnVpbGQgVG9vbAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgTElCIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJsaWJwbmdfX19XaW4zMl9MSUJfUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImxpYnBuZ19fX1dpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgIiIKLUNQUD1jbC5leGUKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYIC9ZYyAvWXUKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLlwuLiIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJQTkdfTk9fTU1YX0NPREUiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1Ci1SU0M9cmMuZXhlCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9pICIuLlwuLiIgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJQjMyPWxpbmsuZXhlIC1saWIKLSMgQUREIEJBU0UgTElCMzIgL25vbG9nbwotIyBBREQgTElCMzIgL25vbG9nbwotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgTElCIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibGlicG5nX19fV2luMzJfTElCX0RlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGlicG5nX19fV2luMzJfTElCX0RlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0xJQl9EZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9MSUJfRGVidWciCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotQ1BQPWNsLmV4ZQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MKLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYIC9ZYyAvWXUKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9JICIuLlwuLiIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIkRFQlVHIiAvRCAiUE5HX05PX01NWF9DT0RFIiAvRCBQTkdfREVCVUc9MSAvRCAiX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiIC9GRCAvR1ogL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1Ci1SU0M9cmMuZXhlCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSUIzMj1saW5rLmV4ZSAtbGliCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KLSMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiV2luMzJfTElCX0RlYnVnXGxpYnBuZ2QubGliIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgTElCIEFTTSBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibGlicG5nX19fV2luMzJfTElCX0FTTV9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGlicG5nX19fV2luMzJfTElCX0FTTV9SZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0xJQl9BU01fUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9MSUJfQVNNX1JlbGVhc2UiCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotQ1BQPWNsLmV4ZQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9GRCAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVggL1ljIC9ZdQotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiUE5HX1VTRV9QTkdWQ1JEIiAvRCAiUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQiIC9EICJfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIgL0ZEIC9jCi0jIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQotUlNDPXJjLmV4ZQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvaSAiLi5cLi4iIC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSUIzMj1saW5rLmV4ZSAtbGliCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KLSMgQUREIExJQjMyIC9ub2xvZ28KLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBuZyAtIFdpbjMyIExJQiBBU00gRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJsaWJwbmdfX19XaW4zMl9MSUJfQVNNX0RlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibGlicG5nX19fV2luMzJfTElCX0FTTV9EZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9MSUJfQVNNX0RlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0xJQl9BU01fRGVidWciCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotQ1BQPWNsLmV4ZQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MKLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYIC9ZYyAvWXUKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9JICIuLlwuLiIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIkRFQlVHIiAvRCBQTkdfREVCVUc9MSAvRCAiUE5HX1VTRV9QTkdWQ1JEIiAvRCAiUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQiIC9EICJfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUKLVJTQz1yYy5leGUKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJQjMyPWxpbmsuZXhlIC1saWIKLSMgQUREIEJBU0UgTElCMzIgL25vbG9nbwotIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiJXaW4zMl9MSUJfQVNNX0RlYnVnXGxpYnBuZ2QubGliIgotCi0hRU5ESUYKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJsaWJwbmcgLSBXaW4zMiBETEwgUmVsZWFzZSIKLSMgTmFtZSAibGlicG5nIC0gV2luMzIgRExMIERlYnVnIgotIyBOYW1lICJsaWJwbmcgLSBXaW4zMiBETEwgQVNNIFJlbGVhc2UiCi0jIE5hbWUgImxpYnBuZyAtIFdpbjMyIERMTCBBU00gRGVidWciCi0jIE5hbWUgImxpYnBuZyAtIFdpbjMyIERMTCBWQiIKLSMgTmFtZSAibGlicG5nIC0gV2luMzIgTElCIFJlbGVhc2UiCi0jIE5hbWUgImxpYnBuZyAtIFdpbjMyIExJQiBEZWJ1ZyIKLSMgTmFtZSAibGlicG5nIC0gV2luMzIgTElCIEFTTSBSZWxlYXNlIgotIyBOYW1lICJsaWJwbmcgLSBXaW4zMiBMSUIgQVNNIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxwbmcuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHBuZ2Vycm9yLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxwbmdnZXQuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHBuZ21lbS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5ccG5ncHJlYWQuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHBuZ3JlYWQuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHBuZ3Jpby5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5ccG5ncnRyYW4uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHBuZ3J1dGlsLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxwbmdzZXQuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHBuZ3RyYW5zLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxzY3JpcHRzXHBuZ3czMi5kZWYKLQotIUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgRExMIFJlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBETEwgRGVidWciCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBETEwgQVNNIFJlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBETEwgQVNNIERlYnVnIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgRExMIFZCIgotCi0jIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBuZyAtIFdpbjMyIExJQiBSZWxlYXNlIgotCi0jIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBuZyAtIFdpbjMyIExJQiBEZWJ1ZyIKLQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBMSUIgQVNNIFJlbGVhc2UiCi0KLSMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgTElCIEFTTSBEZWJ1ZyIKLQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCi0KLSFFTkRJRgotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5ccG5nd2lvLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxwbmd3cml0ZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5ccG5nd3RyYW4uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHBuZ3d1dGlsLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxwbmcuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHBuZ2NvbmYuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxzY3JpcHRzXHBuZ3czMi5yYwotCi0hSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBETEwgUmVsZWFzZSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBuZyAtIFdpbjMyIERMTCBEZWJ1ZyIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBuZyAtIFdpbjMyIERMTCBBU00gUmVsZWFzZSIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBuZyAtIFdpbjMyIERMTCBBU00gRGVidWciCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBETEwgVkIiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBMSUIgUmVsZWFzZSIKLQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJsaWJwbmcgLSBXaW4zMiBMSUIgRGVidWciCi0KLSMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicG5nIC0gV2luMzIgTElCIEFTTSBSZWxlYXNlIgotCi0jIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBuZyAtIFdpbjMyIExJQiBBU00gRGVidWciCi0KLSMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQotCi0hRU5ESUYKLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXFJFQURNRS50eHQKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM2L2xpYnBuZy5kc3cgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNi9saWJwbmcuZHN3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjM4NTZmLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM2L2xpYnBuZy5kc3cKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSEKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAibGlicG5nIj0iLlxsaWJwbmcuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTw0Pgote3t7Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSB6bGliCi0gICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQotfX19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUHJvamVjdDogInBuZ3Rlc3QiPSIuXHBuZ3Rlc3QuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTw0Pgote3t7Ci0gICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5Ci0gICAgUHJvamVjdF9EZXBfTmFtZSBsaWJwbmcKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAiemxpYiI9Ii4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcemxpYi5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUdsb2JhbDoKLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDM+Ci17e3sKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM2L3BuZ3Rlc3QuZHNwIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzYvcG5ndGVzdC5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYmU3M2MuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzYvcG5ndGVzdC5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJwbmd0ZXN0IiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMwotCi1DRkc9cG5ndGVzdCAtIFdpbjMyIERMTCBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgInBuZ3Rlc3QubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJwbmd0ZXN0Lm1hayIgQ0ZHPSJwbmd0ZXN0IC0gV2luMzIgRExMIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAicG5ndGVzdCAtIFdpbjMyIERMTCBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgInBuZ3Rlc3QgLSBXaW4zMiBETEwgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAicG5ndGVzdCAtIFdpbjMyIERMTCBBU00gUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJwbmd0ZXN0IC0gV2luMzIgRExMIEFTTSBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJwbmd0ZXN0IC0gV2luMzIgTElCIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAicG5ndGVzdCAtIFdpbjMyIExJQiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJwbmd0ZXN0IC0gV2luMzIgTElCIEFTTSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgInBuZ3Rlc3QgLSBXaW4zMiBMSUIgQVNNIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInBuZ3Rlc3QgLSBXaW4zMiBETEwgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgInBuZ3Rlc3RfX19XaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInBuZ3Rlc3RfX19XaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIlBOR19ETEwiIC9EICJQTkdfTk9fU1RESU8iIC9EICJQTkdfTk9fR0xPQkFMX0FSUkFZUyIgL0ZEIC9jCi0jIFNVQlRSQUNUIENQUCAvWVgKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIFdpbjMyX0RMTF9SZWxlYXNlXGxpYnBuZzEzLmxpYiAuLlwuLlwuLlx6bGliXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0RMTF9SZWxlYXNlXHpsaWIxLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEJlZ2luIFNwZWNpYWwgQnVpbGQgVG9vbAotT3V0RGlyPS5cV2luMzJfRExMX1JlbGVhc2UKLVNPVVJDRT0iJChJbnB1dFBhdGgpIgotUG9zdEJ1aWxkX0Rlc2M9W1J1biBUZXN0XQotUG9zdEJ1aWxkX0NtZHM9c2V0IHBhdGg9JChvdXRkaXIpOy4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfRExMX1JlbGVhc2U7CSQob3V0ZGlyKVxwbmd0ZXN0LmV4ZSAuLlwuLlxwbmd0ZXN0LnBuZwotIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJwbmd0ZXN0IC0gV2luMzIgRExMIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAicG5ndGVzdF9fX1dpbjMyX0RMTF9EZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInBuZ3Rlc3RfX19XaW4zMl9ETExfRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiV2luMzJfRExMX0RlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0RMTF9EZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIlBOR19ETEwiIC9EICJQTkdfTk9fU1RESU8iIC9EICJQTkdfTk9fR0xPQkFMX0FSUkFZUyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBXaW4zMl9ETExfRGVidWdcbGlicG5nMTNkLmxpYiAuLlwuLlwuLlx6bGliXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0RMTF9EZWJ1Z1x6bGliMWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQmVnaW4gU3BlY2lhbCBCdWlsZCBUb29sCi1PdXREaXI9LlxXaW4zMl9ETExfRGVidWcKLVNPVVJDRT0iJChJbnB1dFBhdGgpIgotUG9zdEJ1aWxkX0Rlc2M9W1J1biBUZXN0XQotUG9zdEJ1aWxkX0NtZHM9c2V0IHBhdGg9JChvdXRkaXIpOy4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfRExMX0RlYnVnOwkkKG91dGRpcilccG5ndGVzdC5leGUgLi5cLi5ccG5ndGVzdC5wbmcKLSMgRW5kIFNwZWNpYWwgQnVpbGQgVG9vbAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAicG5ndGVzdCAtIFdpbjMyIERMTCBBU00gUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgInBuZ3Rlc3RfX19XaW4zMl9ETExfQVNNX1JlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJwbmd0ZXN0X19fV2luMzJfRExMX0FTTV9SZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0RMTF9BU01fUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9ETExfQVNNX1JlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9GRCAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJQTkdfRExMIiAvRCAiUE5HX05PX1NURElPIiAvRCAiUE5HX05PX0dMT0JBTF9BUlJBWVMiIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBXaW4zMl9ETExfQVNNX1JlbGVhc2VcbGlicG5nMTMubGliIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfRExMX0FTTV9SZWxlYXNlXHpsaWIxLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEJlZ2luIFNwZWNpYWwgQnVpbGQgVG9vbAotT3V0RGlyPS5cV2luMzJfRExMX0FTTV9SZWxlYXNlCi1TT1VSQ0U9IiQoSW5wdXRQYXRoKSIKLVBvc3RCdWlsZF9EZXNjPVtSdW4gVGVzdF0KLVBvc3RCdWlsZF9DbWRzPXNldCBwYXRoPSQob3V0ZGlyKTsuLlwuLlwuLlx6bGliXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0RMTF9BU01fUmVsZWFzZTsJJChvdXRkaXIpXHBuZ3Rlc3QuZXhlIC4uXC4uXHBuZ3Rlc3QucG5nCi0jIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInBuZ3Rlc3QgLSBXaW4zMiBETEwgQVNNIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAicG5ndGVzdF9fX1dpbjMyX0RMTF9BU01fRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJwbmd0ZXN0X19fV2luMzJfRExMX0FTTV9EZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9ETExfQVNNX0RlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0RMTF9BU01fRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJQTkdfRExMIiAvRCAiUE5HX05PX1NURElPIiAvRCAiUE5HX05PX0dMT0JBTF9BUlJBWVMiIC9GRCAvR1ogL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWAotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIEFERCBMSU5LMzIgV2luMzJfRExMX0FTTV9EZWJ1Z1xsaWJwbmcxM2QubGliIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfRExMX0FTTV9EZWJ1Z1x6bGliMWQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQmVnaW4gU3BlY2lhbCBCdWlsZCBUb29sCi1PdXREaXI9LlxXaW4zMl9ETExfQVNNX0RlYnVnCi1TT1VSQ0U9IiQoSW5wdXRQYXRoKSIKLVBvc3RCdWlsZF9EZXNjPVtSdW4gVGVzdF0KLVBvc3RCdWlsZF9DbWRzPXNldCBwYXRoPSQob3V0ZGlyKTsuLlwuLlwuLlx6bGliXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0RMTF9BU01fRGVidWc7CSQob3V0ZGlyKVxwbmd0ZXN0LmV4ZSAuLlwuLlxwbmd0ZXN0LnBuZwotIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJwbmd0ZXN0IC0gV2luMzIgTElCIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJwbmd0ZXN0X19fV2luMzJfTElCX1JlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJwbmd0ZXN0X19fV2luMzJfTElCX1JlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiV2luMzJfTElCX1JlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfTElCX1JlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9GRCAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9GRCAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBXaW4zMl9MSUJfUmVsZWFzZVxsaWJwbmcubGliIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfTElCX1JlbGVhc2VcemxpYi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wKLU91dERpcj0uXFdpbjMyX0xJQl9SZWxlYXNlCi1TT1VSQ0U9IiQoSW5wdXRQYXRoKSIKLVBvc3RCdWlsZF9EZXNjPVtSdW4gVGVzdF0KLVBvc3RCdWlsZF9DbWRzPSQob3V0ZGlyKVxwbmd0ZXN0LmV4ZSAuLlwuLlxwbmd0ZXN0LnBuZwotIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJwbmd0ZXN0IC0gV2luMzIgTElCIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAicG5ndGVzdF9fX1dpbjMyX0xJQl9EZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInBuZ3Rlc3RfX19XaW4zMl9MSUJfRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiV2luMzJfTElCX0RlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0xJQl9EZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBXaW4zMl9MSUJfRGVidWdcbGlicG5nZC5saWIgLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9MSUJfRGVidWdcemxpYmQubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQmVnaW4gU3BlY2lhbCBCdWlsZCBUb29sCi1PdXREaXI9LlxXaW4zMl9MSUJfRGVidWcKLVNPVVJDRT0iJChJbnB1dFBhdGgpIgotUG9zdEJ1aWxkX0Rlc2M9W1J1biBUZXN0XQotUG9zdEJ1aWxkX0NtZHM9JChvdXRkaXIpXHBuZ3Rlc3QuZXhlIC4uXC4uXHBuZ3Rlc3QucG5nCi0jIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInBuZ3Rlc3QgLSBXaW4zMiBMSUIgQVNNIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJwbmd0ZXN0X19fV2luMzJfTElCX0FTTV9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAicG5ndGVzdF9fX1dpbjMyX0xJQl9BU01fUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9MSUJfQVNNX1JlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfTElCX0FTTV9SZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWAotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgV2luMzJfTElCX0FTTV9SZWxlYXNlXGxpYnBuZy5saWIgLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9MSUJfQVNNX1JlbGVhc2VcemxpYi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wKLU91dERpcj0uXFdpbjMyX0xJQl9BU01fUmVsZWFzZQotU09VUkNFPSIkKElucHV0UGF0aCkiCi1Qb3N0QnVpbGRfRGVzYz1bUnVuIFRlc3RdCi1Qb3N0QnVpbGRfQ21kcz0kKG91dGRpcilccG5ndGVzdC5leGUgLi5cLi5ccG5ndGVzdC5wbmcKLSMgRW5kIFNwZWNpYWwgQnVpbGQgVG9vbAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAicG5ndGVzdCAtIFdpbjMyIExJQiBBU00gRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJwbmd0ZXN0X19fV2luMzJfTElCX0FTTV9EZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInBuZ3Rlc3RfX19XaW4zMl9MSUJfQVNNX0RlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0xJQl9BU01fRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfTElCX0FTTV9EZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBXaW4zMl9MSUJfQVNNX0RlYnVnXGxpYnBuZ2QubGliIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfTElCX0FTTV9EZWJ1Z1x6bGliZC5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wKLU91dERpcj0uXFdpbjMyX0xJQl9BU01fRGVidWcKLVNPVVJDRT0iJChJbnB1dFBhdGgpIgotUG9zdEJ1aWxkX0Rlc2M9W1J1biBUZXN0XQotUG9zdEJ1aWxkX0NtZHM9JChvdXRkaXIpXHBuZ3Rlc3QuZXhlIC4uXC4uXHBuZ3Rlc3QucG5nCi0jIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgInBuZ3Rlc3QgLSBXaW4zMiBETEwgUmVsZWFzZSIKLSMgTmFtZSAicG5ndGVzdCAtIFdpbjMyIERMTCBEZWJ1ZyIKLSMgTmFtZSAicG5ndGVzdCAtIFdpbjMyIERMTCBBU00gUmVsZWFzZSIKLSMgTmFtZSAicG5ndGVzdCAtIFdpbjMyIERMTCBBU00gRGVidWciCi0jIE5hbWUgInBuZ3Rlc3QgLSBXaW4zMiBMSUIgUmVsZWFzZSIKLSMgTmFtZSAicG5ndGVzdCAtIFdpbjMyIExJQiBEZWJ1ZyIKLSMgTmFtZSAicG5ndGVzdCAtIFdpbjMyIExJQiBBU00gUmVsZWFzZSIKLSMgTmFtZSAicG5ndGVzdCAtIFdpbjMyIExJQiBBU00gRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHBuZ3Rlc3QuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9QUkowMDQxLm1hayBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9QUkowMDQxLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1OTdiMC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvUFJKMDA0MS5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIFByZXZlbnQgIkNhbm5vdCBmaW5kIG1pc3NpbmcgZGVwZW5kZW5jeS4uLiIgd2FybmluZ3Mgd2hpbGUgY29tcGlsaW5nCi0jIHBuZ3czMi5yYyAoUFJKMDA0MSkuCi0KLWFsbDogJChJbnREaXIpXGFsbG9jLmggXAotCSAkKEludERpcilcZnAuaCBcCi0JICQoSW50RGlyKVxtNjg4ODEuaCBcCi0JICQoSW50RGlyKVxtZW0uaCBcCi0JICQoSW50RGlyKVxwbmd1c3IuaCBcCi0JICQoSW50RGlyKVxzdHJpbmdzLmggXAotCSAkKEludERpcilcdW5pc3RkLmggXAotCSAkKEludERpcilcdW5peGlvLmgKLQkgCi0kKEludERpcilcYWxsb2MuaCBcCi0kKEludERpcilcZnAuaCBcCi0kKEludERpcilcbTY4ODgxLmggXAotJChJbnREaXIpXG1lbS5oIFwKLSQoSW50RGlyKVxwbmd1c3IuaCBcCi0kKEludERpcilcc3RyaW5ncy5oIFwKLSQoSW50RGlyKVx1bmlzdGQuaCBcCi0kKEludERpcilcdW5peGlvLmg6Ci0JQCFlY2hvLj4kQApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1JFQURNRS50eHQgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkNjMzMi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLU1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSwgRm9ybWF0IFZlcnNpb24gNy4xMCBmb3IgbGlicG5nLgotCi1Db3B5cmlnaHQgKEMpIDIwMDQgU2ltb24tUGllcnJlIENhZGlldXguCi1Gb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotQXNzdW1wdGlvbnM6Ci0qIFRoZSBsaWJwbmcgc291cmNlIGZpbGVzIGFyZSBpbiAuLlwuLgotKiBUaGUgemxpYiBzb3VyY2UgZmlsZXMgYXJlIGluIC4uXC4uXC4uXHpsaWIKLSogVGhlIHpsaWIgcHJvamVjdCBmaWxlIGlzIGluIC4gLyogV2FybmluZzogVGhpcyBpcyB1bnRpbCB0aGUgemxpYiBwcm9qZWN0Ci0gIGZpbGVzIGdldCBpbnRlcmdyYXRlZCBpbnRvIHRoZSBuZXh0IHpsaWIgcmVsZWFzZS4gVGhlIGZpbmFsIHpsaWIgcHJvamVjdAotICBkaXJlY3Rvcnkgd2lsbCB0aGVuIGJlIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzcxLiAqLwotCi1UbyB1c2U6Ci0KLTEpIE9uIHRoZSBtYWluIG1lbnUsIHNlbGVjdCAiRmlsZSB8IE9wZW4gU29sdXRpb24iLgotICAgT3BlbiAibGlicG5nLnNsbiIuCi0KLTIpIERpc3BsYXkgdGhlIFNvbHV0aW9uIEV4cGxvcmVyIHZpZXcgKEN0cmwrQWx0K0wpCi0KLTMpIFNldCBvbmUgb2YgdGhlIHByb2plY3QgYXMgdGhlIFN0YXJ0VXAgcHJvamVjdC4gSWYgeW91IGp1c3Qgd2FudCB0byBidWlsZCB0aGUKLSAgIGJpbmFyaWVzIHNldCAibGlicG5nIiBhcyB0aGUgc3RhcnR1cCBwcm9qZWN0IChTZWxlY3QgImxpYnBuZyIgdHJlZSB2aWV3Ci0gICBpdGVtICsgUHJvamVjdCB8IFNldCBhcyBTdGFydFVwIHByb2plY3QpLiBJZiB5b3Ugd2FudCB0byBidWlsZCBhbmQgdGVzdCB0aGUKLSAgIGJpbmFyaWVzIHNldCBpdCB0byAicG5ndGVzdCIgKFNlbGVjdCAicG5ndGVzdCIgdHJlZSB2aWV3IGl0ZW0gKwotICAgUHJvamVjdCB8IFNldCBhcyBTdGFydFVwIHByb2plY3QpCi0KLTQpIFNlbGVjdCAiQnVpbGQgfCBDb25maWd1cmF0aW9uIE1hbmFnZXIuLi4iLgotICAgQ2hvb3NlIHRoZSBjb25maWd1cmF0aW9uIHlvdSB3aXNoIHRvIGJ1aWxkLgotCi01KSBTZWxlY3QgIkJ1aWxkIHwgQ2xlYW4gU29sdXRpb24iLgotCi02KSBTZWxlY3QgIkJ1aWxkIHwgQnVpbGQgU29sdXRpb24gKEN0cmwtU2hpZnQtQikiCi0KLVRoaXMgcHJvamVjdCBidWlsZHMgdGhlIGxpYnBuZyBiaW5hcmllcyBhcyBmb2xsb3dzOgotCi0qIFdpbjMyX0RMTF9SZWxlYXNlXGxpYnBuZzEzLmRsbCAgICAgIERMTCBidWlsZAotKiBXaW4zMl9ETExfRGVidWdcbGlicG5nMTNkLmRsbCAgICAgICBETEwgYnVpbGQgKGRlYnVnIHZlcnNpb24pCi0qIFdpbjMyX0RMTF9BU01fUmVsZWFzZVxsaWJwbmcxMy5kbGwgIERMTCBidWlsZCB1c2luZyBBU00gY29kZQotKiBXaW4zMl9ETExfQVNNX0RlYnVnXGxpYnBuZzEzZC5kbGwgICBETEwgYnVpbGQgdXNpbmcgQVNNIChkZWJ1ZyB2ZXJzaW9uKQotKiBXaW4zMl9ETExfVkJcbGlicG5nMTN2Yi5kbGwgICAgICAgICBETEwgYnVpbGQgZm9yIFZpc3VhbCBCYXNpYywgdXNpbmcgc3RkY2FsbAotKiBXaW4zMl9MSUJfUmVsZWFzZVxsaWJwbmcubGliICAgICAgICBzdGF0aWMgYnVpbGQKLSogV2luMzJfTElCX0RlYnVnXGxpYnBuZ2QubGliICAgICAgICAgc3RhdGljIGJ1aWxkIChkZWJ1ZyB2ZXJzaW9uKQotKiBXaW4zMl9MSUJfQVNNX1JlbGVhc2VcbGlicG5nLmxpYiAgICBzdGF0aWMgYnVpbGQgdXNpbmcgQVNNIGNvZGUKLSogV2luMzJfTElCX0FTTV9EZWJ1Z1xsaWJwbmdkLmxpYiAgICAgc3RhdGljIGJ1aWxkIHVzaW5nIEFTTSAoZGVidWcgdmVyc2lvbikKLQotTm90ZXM6Ci0KLUlmIHlvdSBjaGFuZ2UgYW55dGhpbmcgaW4gdGhlIHNvdXJjZSBmaWxlcywgb3Igc2VsZWN0IGRpZmZlcmVudCBjb21waWxlcgotc2V0dGluZ3MsIHBsZWFzZSBjaGFuZ2UgdGhlIERMTCBuYW1lIHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiBhbnkgb2YKLXRoZSBhYm92ZSBuYW1lcy4gQWxzbywgbWFrZSBzdXJlIHRoYXQgaW4geW91ciAicG5ndXNyLmgiIHlvdSBkZWZpbmUKLVBOR19VU0VSX1BSSVZBVEVCVUlMRCBhbmQgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWCBhY2NvcmRpbmcgdG8gdGhlCi1pbnN0cnVjdGlvbnMgcHJvdmlkZWQgaW4gInBuZ2NvbmYuaCIuCi0KLUFsbCBETExzIGJ1aWx0IGJ5IHRoaXMgcHJvamVjdCB1c2UgdGhlIE1pY3Jvc29mdCBkeW5hbWljIEMgcnVudGltZSBsaWJyYXJ5Ci1NU1ZDUjcxLkRMTCAoTVNWQ1I3MUQuRExMIGZvciBkZWJ1ZyB2ZXJzaW9ucykuICBJZiB5b3UgZGlzdHJpYnV0ZSBhbnkgb2YgdGhlCi1hYm92ZSBtZW50aW9uZWQgbGlicmFyaWVzIHlvdSBtYXkgaGF2ZSB0byBpbmNsdWRlIHRoaXMgRExMIGluIHlvdXIgcGFja2FnZS4KLUZvciBhIGxpc3Qgb2YgZmlsZXMgdGhhdCBhcmUgcmVkaXN0cmlidXRhYmxlIGluIFZpc3VhbCBTdHVkaW8gc2VlCi0kKFZDSU5TVEFMTERJUilccmVkaXN0LnR4dC4KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9SRUFETUVfemxpYi50eHQgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FX3psaWIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZhNWM3Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9SRUFETUVfemxpYi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIHB1dCBpbiB0aGUgTGliUE5HIGRpc3RyaWJ1dGlvbiBmb3IgY29udmVuaWVuY2Ugb25seS4KLSAgICAgICAgICAgIEl0IGlzIGV4cGVjdGVkIHRvIGJlIHBhcnQgb2YgdGhlIG5leHQgemxpYiByZWxlYXNlIHVuZGVyCi0gICAgICAgICAgICAicHJvamVjdHNcdmlzdWFsYzcxXFJFQURNRS50eHQuIiAqLwotCi1NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUsIEZvcm1hdCBWZXJzaW9uIDcuMTAgZm9yIHpsaWIuCi0KLUNvcHlyaWdodCAoQykgMjAwNCBTaW1vbi1QaWVycmUgQ2FkaWV1eC4KLUNvcHlyaWdodCAoQykgMjAwNCBDb3NtaW4gVHJ1dGEuCi1Gb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oLgotCi0KLVRvIHVzZToKLQotMSkgT24gdGhlIG1haW4gbWVudSwgc2VsZWN0ICJGaWxlIHwgT3BlbiBTb2x1dGlvbiIuCi0gICBPcGVuICJ6bGliLnNsbiIuCi0KLTIpIERpc3BsYXkgdGhlIFNvbHV0aW9uIEV4cGxvcmVyIHZpZXcgKEN0cmwrQWx0K0wpCi0KLTMpIFNldCBvbmUgb2YgdGhlIHByb2plY3QgYXMgdGhlIFN0YXJ0VXAgcHJvamVjdC4gSWYgeW91IGp1c3Qgd2FudCB0byBidWlsZCB0aGUKLSAgIGJpbmFyaWVzIHNldCAiemxpYiIgYXMgdGhlIHN0YXJ0dXAgcHJvamVjdCAoU2VsZWN0ICJ6bGliIiB0cmVlIHZpZXcgaXRlbSArCi0gICBQcm9qZWN0IHwgU2V0IGFzIFN0YXJ0VXAgcHJvamVjdCkuIElmIHlvdSB3YW50IHRvIGJ1aWxkIGFuZCB0ZXN0IHRoZQotICAgYmluYXJpZXMgc2V0IGl0IHRvICJleGFtcGxlIiAoU2VsZWN0ICJleGFtcGxlIiB0cmVlIHZpZXcgaXRlbSArIFByb2plY3QgfAotICAgU2V0IGFzIFN0YXJ0VXAgcHJvamVjdCksIElmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZSBtaW5pZ3ppcCB1dGlsaXR5IHNldCBpdCB0bwotICAgIm1pbmlnemlwIiAoU2VsZWN0ICJtaW5pZ3ppcCIgdHJlZSB2aWV3IGl0ZW0gKyBQcm9qZWN0IHwgU2V0IGFzIFN0YXJ0VXAKLSAgIHByb2plY3QKLQotNCkgU2VsZWN0ICJCdWlsZCB8IENvbmZpZ3VyYXRpb24gTWFuYWdlci4uLiIuCi0gICBDaG9vc2UgdGhlIGNvbmZpZ3VyYXRpb24geW91IHdpc2ggdG8gYnVpbGQuCi0KLTUpIFNlbGVjdCAiQnVpbGQgfCBDbGVhbiBTb2x1dGlvbiIuCi0KLTYpIFNlbGVjdCAiQnVpbGQgfCBCdWlsZCBTb2x1dGlvbiAoQ3RybC1TaGlmdC1CKSIKLQotVGhpcyBwcm9qZWN0IGJ1aWxkcyB0aGUgemxpYiBiaW5hcmllcyBhcyBmb2xsb3dzOgotCi0qIFdpbjMyX0RMTF9SZWxlYXNlXHpsaWIxLmRsbCAgICAgICBETEwgYnVpbGQKLSogV2luMzJfRExMX0RlYnVnXHpsaWIxZC5kbGwgICAgICAgIERMTCBidWlsZCAoZGVidWcgdmVyc2lvbikKLSogV2luMzJfRExMX0FTTV9SZWxlYXNlXHpsaWIxLmRsbCAgIERMTCBidWlsZCB1c2luZyBBU00gY29kZQotKiBXaW4zMl9ETExfQVNNX0RlYnVnXHpsaWIxZC5kbGwgICAgRExMIGJ1aWxkIHVzaW5nIEFTTSBjb2RlIChkZWJ1ZyB2ZXJzaW9uKQotKiBXaW4zMl9MSUJfUmVsZWFzZVx6bGliLmxpYiAgICAgICAgc3RhdGljIGJ1aWxkCi0qIFdpbjMyX0xJQl9EZWJ1Z1x6bGliZC5saWIgICAgICAgICBzdGF0aWMgYnVpbGQgKGRlYnVnIHZlcnNpb24pCi0qIFdpbjMyX0xJQl9BU01fUmVsZWFzZVx6bGliLmxpYiAgICBzdGF0aWMgYnVpbGQgdXNpbmcgQVNNIGNvZGUKLSogV2luMzJfTElCX0FTTV9EZWJ1Z1x6bGliZC5saWIgICAgIHN0YXRpYyBidWlsZCB1c2luZyBBU00gY29kZSAoZGVidWcgdmVyc2lvbikKLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1VwZ3JhZGVMb2cuaHRtIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1VwZ3JhZGVMb2cuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTZlMzg0Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9VcGdyYWRlTG9nLmh0bQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmdvdXQucG5nIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ291dC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYTZkZjQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ291dC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC5leGUgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC5leGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYWFmZWIuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QuZXhlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QuaWxrIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QuaWxrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODYzZDQxLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LmlsaworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LmxvZyBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3NzU1ZS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC5sb2cKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi3vu79CdWlsZCBzdGFydGVkIDIvMTgvMjAxNSA5OjMyOjE5IFBNLgotICAgICAxPlByb2plY3QgIlA6XGdpdGh1Yi5jb21cS2hyb25vc0dyb3VwXEdMLU5leHRcZGVtb3NcbGlicG5nXHByb2plY3RzXHZpc3VhbGM3MVxwbmd0ZXN0LnZjeHByb2oiIG9uIG5vZGUgMiAoQnVpbGQgdGFyZ2V0KHMpKS4KLSAgICAgMT5DbENvbXBpbGU6Ci0gICAgICAgICBDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDEyLjBcVkNcYmluXENMLmV4ZSAvYyAvSS4uXC4uXC4uXHpsaWIgL1pJIC9ub2xvZ28gL1czIC9XWC0gL09kIC9PeS0gL0QgV0lOMzIgL0QgX0RFQlVHIC9EIFBOR19OT19HTE9CQUxfQVJSQVlTIC9HbS0gL0VIc2MgL1JUQzEgL01EZCAvR1MgL2ZwOnByZWNpc2UgL1pjOndjaGFyX3QgL1pjOmZvclNjb3BlIC9GbyIuXFdpbjMyX0xJQl9EZWJ1Z1xUZXN0XFwiIC9GZCIuXFdpbjMyX0xJQl9EZWJ1Z1xUZXN0XHZjMTIwLnBkYiIgL0dkIC9UQyAvYW5hbHl6ZS0gL2Vycm9yUmVwb3J0OnByb21wdCAuLlwuLlxwbmd0ZXN0LmMKLSAgICAgICAgIHBuZ3Rlc3QuYwotICAgICAxPnA6XGdpdGh1Yi5jb21ca2hyb25vc2dyb3VwXGdsLW5leHRcZGVtb3NcbGlicG5nXHBuZ3Rlc3QuYyg3MTIpOiB3YXJuaW5nIEM0OTk2OiAnZm9wZW4nOiBUaGlzIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIG1heSBiZSB1bnNhZmUuIENvbnNpZGVyIHVzaW5nIGZvcGVuX3MgaW5zdGVhZC4gVG8gZGlzYWJsZSBkZXByZWNhdGlvbiwgdXNlIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTLiBTZWUgb25saW5lIGhlbHAgZm9yIGRldGFpbHMuCi0gICAgICAgICAgICAgICAgIGM6XHByb2dyYW0gZmlsZXMgKHg4NilcbWljcm9zb2Z0IHZpc3VhbCBzdHVkaW8gMTIuMFx2Y1xpbmNsdWRlXHN0ZGlvLmgoMjExKSA6IHNlZSBkZWNsYXJhdGlvbiBvZiAnZm9wZW4nCi0gICAgIDE+cDpcZ2l0aHViLmNvbVxraHJvbm9zZ3JvdXBcZ2wtbmV4dFxkZW1vc1xsaWJwbmdccG5ndGVzdC5jKDcyMyk6IHdhcm5pbmcgQzQ5OTY6ICdmb3Blbic6IFRoaXMgZnVuY3Rpb24gb3IgdmFyaWFibGUgbWF5IGJlIHVuc2FmZS4gQ29uc2lkZXIgdXNpbmcgZm9wZW5fcyBpbnN0ZWFkLiBUbyBkaXNhYmxlIGRlcHJlY2F0aW9uLCB1c2UgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MuIFNlZSBvbmxpbmUgaGVscCBmb3IgZGV0YWlscy4KLSAgICAgICAgICAgICAgICAgYzpccHJvZ3JhbSBmaWxlcyAoeDg2KVxtaWNyb3NvZnQgdmlzdWFsIHN0dWRpbyAxMi4wXHZjXGluY2x1ZGVcc3RkaW8uaCgyMTEpIDogc2VlIGRlY2xhcmF0aW9uIG9mICdmb3BlbicKLSAgICAgMT5wOlxnaXRodWIuY29tXGtocm9ub3Nncm91cFxnbC1uZXh0XGRlbW9zXGxpYnBuZ1xwbmd0ZXN0LmMoMTM1MCk6IHdhcm5pbmcgQzQ5OTY6ICdmb3Blbic6IFRoaXMgZnVuY3Rpb24gb3IgdmFyaWFibGUgbWF5IGJlIHVuc2FmZS4gQ29uc2lkZXIgdXNpbmcgZm9wZW5fcyBpbnN0ZWFkLiBUbyBkaXNhYmxlIGRlcHJlY2F0aW9uLCB1c2UgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MuIFNlZSBvbmxpbmUgaGVscCBmb3IgZGV0YWlscy4KLSAgICAgICAgICAgICAgICAgYzpccHJvZ3JhbSBmaWxlcyAoeDg2KVxtaWNyb3NvZnQgdmlzdWFsIHN0dWRpbyAxMi4wXHZjXGluY2x1ZGVcc3RkaW8uaCgyMTEpIDogc2VlIGRlY2xhcmF0aW9uIG9mICdmb3BlbicKLSAgICAgMT5wOlxnaXRodWIuY29tXGtocm9ub3Nncm91cFxnbC1uZXh0XGRlbW9zXGxpYnBuZ1xwbmd0ZXN0LmMoMTM2MSk6IHdhcm5pbmcgQzQ5OTY6ICdmb3Blbic6IFRoaXMgZnVuY3Rpb24gb3IgdmFyaWFibGUgbWF5IGJlIHVuc2FmZS4gQ29uc2lkZXIgdXNpbmcgZm9wZW5fcyBpbnN0ZWFkLiBUbyBkaXNhYmxlIGRlcHJlY2F0aW9uLCB1c2UgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MuIFNlZSBvbmxpbmUgaGVscCBmb3IgZGV0YWlscy4KLSAgICAgICAgICAgICAgICAgYzpccHJvZ3JhbSBmaWxlcyAoeDg2KVxtaWNyb3NvZnQgdmlzdWFsIHN0dWRpbyAxMi4wXHZjXGluY2x1ZGVcc3RkaW8uaCgyMTEpIDogc2VlIGRlY2xhcmF0aW9uIG9mICdmb3BlbicKLSAgICAgICBMaW5rOgotICAgICAgICAgQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMi4wXFZDXGJpblxsaW5rLmV4ZSAvRVJST1JSRVBPUlQ6UFJPTVBUIC9PVVQ6Ii5cV2luMzJfTElCX0RlYnVnXFRlc3RccG5ndGVzdC5leGUiIC9OT0xPR08ga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL01BTklGRVNUIC9NQU5JRkVTVFVBQzoibGV2ZWw9J2FzSW52b2tlcicgdWlBY2Nlc3M9J2ZhbHNlJyIgL21hbmlmZXN0OmVtYmVkIC9ERUJVRyAvUERCOiIuXFdpbjMyX0xJQl9EZWJ1Z1xUZXN0XHBuZ3Rlc3QucGRiIiAvU1VCU1lTVEVNOkNPTlNPTEUgL1RMQklEOjEgL0RZTkFNSUNCQVNFIC9OWENPTVBBVCAvSU1QTElCOiIuXFdpbjMyX0xJQl9EZWJ1Z1xUZXN0XHBuZ3Rlc3QubGliIiAvTUFDSElORTpYODYgL1NBRkVTRUggLlxXaW4zMl9MSUJfRGVidWdcVGVzdFxwbmd0ZXN0Lm9iagotICAgICAgICAgIlA6XGdpdGh1Yi5jb21cS2hyb25vc0dyb3VwXEdMLU5leHRcZGVtb3NcbGlicG5nXHByb2plY3RzXHZpc3VhbGM3MVxXaW4zMl9MSUJfRGVidWdcWkxpYlx6bGliZC5saWIiCi0gICAgICAgICAiUDpcZ2l0aHViLmNvbVxLaHJvbm9zR3JvdXBcR0wtTmV4dFxkZW1vc1xsaWJwbmdccHJvamVjdHNcdmlzdWFsYzcxXFdpbjMyX0xJQl9EZWJ1Z1xsaWJwbmdkLmxpYiIKLSAgICAgMT5wbmd0ZXN0Lm9iaiA6IHdhcm5pbmcgTE5LNDA3NTogaWdub3JpbmcgJy9FRElUQU5EQ09OVElOVUUnIGR1ZSB0byAnL1NBRkVTRUgnIHNwZWNpZmljYXRpb24KLSAgICAgICAgIHBuZ3Rlc3QudmN4cHJvaiAtPiBQOlxnaXRodWIuY29tXEtocm9ub3NHcm91cFxHTC1OZXh0XGRlbW9zXGxpYnBuZ1xwcm9qZWN0c1x2aXN1YWxjNzFcLlxXaW4zMl9MSUJfRGVidWdcVGVzdFxwbmd0ZXN0LmV4ZQotICAgICAxPkRvbmUgQnVpbGRpbmcgUHJvamVjdCAiUDpcZ2l0aHViLmNvbVxLaHJvbm9zR3JvdXBcR0wtTmV4dFxkZW1vc1xsaWJwbmdccHJvamVjdHNcdmlzdWFsYzcxXHBuZ3Rlc3QudmN4cHJvaiIgKEJ1aWxkIHRhcmdldChzKSkuCi0KLUJ1aWxkIHN1Y2NlZWRlZC4KLQotVGltZSBFbGFwc2VkIDAwOjAwOjAwLjM5CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC5vYmogYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC5vYmoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YzIzOWMuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3Qub2JqCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QucGRiIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QucGRiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODc1NTlkLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LnBkYgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LnRsb2cvY2wuY29tbWFuZC4xLnRsb2cgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC50bG9nL2NsLmNvbW1hbmQuMS50bG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2E5YzNkLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LnRsb2cvY2wuY29tbWFuZC4xLnRsb2cKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC50bG9nL2NsLnJlYWQuMS50bG9nIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QudGxvZy9jbC5yZWFkLjEudGxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyNzg1Mi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC50bG9nL2NsLnJlYWQuMS50bG9nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QudGxvZy9jbC53cml0ZS4xLnRsb2cgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC50bG9nL2NsLndyaXRlLjEudGxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY4N2JjNC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC50bG9nL2NsLndyaXRlLjEudGxvZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LnRsb2cvbGluay5jb21tYW5kLjEudGxvZyBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LnRsb2cvbGluay5jb21tYW5kLjEudGxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyMmI5NC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC50bG9nL2xpbmsuY29tbWFuZC4xLnRsb2cKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC50bG9nL2xpbmsucmVhZC4xLnRsb2cgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC50bG9nL2xpbmsucmVhZC4xLnRsb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDhhNDcuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QudGxvZy9saW5rLnJlYWQuMS50bG9nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QudGxvZy9saW5rLndyaXRlLjEudGxvZyBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LnRsb2cvbGluay53cml0ZS4xLnRsb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxN2Q2ZTguLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QudGxvZy9saW5rLndyaXRlLjEudGxvZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LnRsb2cvcG5ndGVzdC5sYXN0YnVpbGRzdGF0ZSBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LnRsb2cvcG5ndGVzdC5sYXN0YnVpbGRzdGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyZGY5YS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvcG5ndGVzdC50bG9nL3BuZ3Rlc3QubGFzdGJ1aWxkc3RhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPXY0LjA6UGxhdGZvcm1Ub29sU2V0PXYxMjA6RW5hYmxlTWFuYWdlZEluY3JlbWVudGFsQnVpbGQ9ZmFsc2U6VkNUb29sQXJjaGl0ZWN0dXJlPU5hdGl2ZTMyQml0Ci1MSUIgRGVidWd8V2luMzJ8UDpcZ2l0aHViLmNvbVxLaHJvbm9zR3JvdXBcR0wtTmV4dFxkZW1vc1xsaWJwbmdccHJvamVjdHNcdmlzdWFsYzcxXHwKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC9wbmd0ZXN0LnRsb2cvcG5ndGVzdC53cml0ZS4xdS50bG9nIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QudGxvZy9wbmd0ZXN0LndyaXRlLjF1LnRsb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZmI5MjMuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3BuZ3Rlc3QudGxvZy9wbmd0ZXN0LndyaXRlLjF1LnRsb2cKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvdmMxMjAuaWRiIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3ZjMTIwLmlkYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhOTA3OS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1Rlc3QvdmMxMjAuaWRiCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3ZjMTIwLnBkYiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvVGVzdC92YzEyMC5wZGIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYWFhMWIuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9UZXN0L3ZjMTIwLnBkYgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi9hZGxlcjMyLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi9hZGxlcjMyLm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2NmEwYy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvYWRsZXIzMi5vYmoKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvY29tcHJlc3Mub2JqIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL2NvbXByZXNzLm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1YTdmYy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvY29tcHJlc3Mub2JqCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL2NyYzMyLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi9jcmMzMi5vYmoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODAxY2QuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL2NyYzMyLm9iagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi9kZWZsYXRlLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi9kZWZsYXRlLm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhODE3My4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvZGVmbGF0ZS5vYmoKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvZ3ppby5vYmogYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvZ3ppby5vYmoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZGU2ZTcuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL2d6aW8ub2JqCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL2luZmJhY2sub2JqIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL2luZmJhY2sub2JqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWIwMGViLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi9pbmZiYWNrLm9iagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi9pbmZmYXN0Lm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi9pbmZmYXN0Lm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkZjg0ZS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvaW5mZmFzdC5vYmoKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvaW5mbGF0ZS5vYmogYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvaW5mbGF0ZS5vYmoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTMxMWMuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL2luZmxhdGUub2JqCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL2luZnRyZWVzLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi9pbmZ0cmVlcy5vYmoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjVlZWQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL2luZnRyZWVzLm9iagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi90cmVlcy5vYmogYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvdHJlZXMub2JqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmUxMThmLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi90cmVlcy5vYmoKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvdW5jb21wci5vYmogYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvdW5jb21wci5vYmoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYmU0NjEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL3VuY29tcHIub2JqCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL3ZjMTIwLmlkYiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi92YzEyMC5pZGIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NGY3NTMuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL3ZjMTIwLmlkYgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi92YzEyMC5wZGIgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvdmMxMjAucGRiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjBiODNkLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi92YzEyMC5wZGIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvemxpYi5sb2cgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvemxpYi5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZGU4ZTIuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL3psaWIubG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAot77u/QnVpbGQgc3RhcnRlZCAyLzE4LzIwMTUgOTozMjoxNyBQTS4KLSAgICAgMT5Qcm9qZWN0ICJQOlxnaXRodWIuY29tXEtocm9ub3NHcm91cFxHTC1OZXh0XGRlbW9zXGxpYnBuZ1xwcm9qZWN0c1x2aXN1YWxjNzFcemxpYi52Y3hwcm9qIiBvbiBub2RlIDIgKEJ1aWxkIHRhcmdldChzKSkuCi0gICAgIDE+Q2xDb21waWxlOgotICAgICAgICAgQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMi4wXFZDXGJpblxDTC5leGUgL2MgL0kuLlwuLlwuLlx6bGliIC9aSSAvbm9sb2dvIC9XMyAvV1gtIC9PZCAvT3ktIC9EIFdJTjMyIC9EIF9ERUJVRyAvR20tIC9FSHNjIC9SVEMxIC9NRGQgL0dTIC9mcDpwcmVjaXNlIC9aYzp3Y2hhcl90IC9aYzpmb3JTY29wZSAvRm8iLlxXaW4zMl9MSUJfRGVidWdcWkxpYlxcIiAvRmQiLlxXaW4zMl9MSUJfRGVidWdcWkxpYlx2YzEyMC5wZGIiIC9HZCAvVEMgL2FuYWx5emUtIC9lcnJvclJlcG9ydDpwcm9tcHQgLi5cLi5cLi5cemxpYlxhZGxlcjMyLmMgLi5cLi5cLi5cemxpYlxjb21wcmVzcy5jIC4uXC4uXC4uXHpsaWJcY3JjMzIuYyAuLlwuLlwuLlx6bGliXGRlZmxhdGUuYyAuLlwuLlwuLlx6bGliXGd6aW8uYyAuLlwuLlwuLlx6bGliXGluZmJhY2suYyAuLlwuLlwuLlx6bGliXGluZmZhc3QuYyAuLlwuLlwuLlx6bGliXGluZmxhdGUuYyAuLlwuLlwuLlx6bGliXGluZnRyZWVzLmMgLi5cLi5cLi5cemxpYlx0cmVlcy5jIC4uXC4uXC4uXHpsaWJcdW5jb21wci5jIC4uXC4uXC4uXHpsaWJcenV0aWwuYwotICAgICAgICAgYWRsZXIzMi5jCi0gICAgICAgICBjb21wcmVzcy5jCi0gICAgICAgICBjcmMzMi5jCi0gICAgICAgICBkZWZsYXRlLmMKLSAgICAgICAgIGd6aW8uYwotICAgICAxPnA6XGdpdGh1Yi5jb21ca2hyb25vc2dyb3VwXGdsLW5leHRcZGVtb3NcemxpYlxnemlvLmMoMTMxKTogd2FybmluZyBDNDk5NjogJ3N0cmNweSc6IFRoaXMgZnVuY3Rpb24gb3IgdmFyaWFibGUgbWF5IGJlIHVuc2FmZS4gQ29uc2lkZXIgdXNpbmcgc3RyY3B5X3MgaW5zdGVhZC4gVG8gZGlzYWJsZSBkZXByZWNhdGlvbiwgdXNlIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTLiBTZWUgb25saW5lIGhlbHAgZm9yIGRldGFpbHMuCi0gICAgICAgICAgICAgICAgIGM6XHByb2dyYW0gZmlsZXMgKHg4NilcbWljcm9zb2Z0IHZpc3VhbCBzdHVkaW8gMTIuMFx2Y1xpbmNsdWRlXHN0cmluZy5oKDExMikgOiBzZWUgZGVjbGFyYXRpb24gb2YgJ3N0cmNweScKLSAgICAgMT5wOlxnaXRodWIuY29tXGtocm9ub3Nncm91cFxnbC1uZXh0XGRlbW9zXHpsaWJcZ3ppby5jKDE4MSk6IHdhcm5pbmcgQzQ5OTY6ICdmb3Blbic6IFRoaXMgZnVuY3Rpb24gb3IgdmFyaWFibGUgbWF5IGJlIHVuc2FmZS4gQ29uc2lkZXIgdXNpbmcgZm9wZW5fcyBpbnN0ZWFkLiBUbyBkaXNhYmxlIGRlcHJlY2F0aW9uLCB1c2UgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MuIFNlZSBvbmxpbmUgaGVscCBmb3IgZGV0YWlscy4KLSAgICAgICAgICAgICAgICAgYzpccHJvZ3JhbSBmaWxlcyAoeDg2KVxtaWNyb3NvZnQgdmlzdWFsIHN0dWRpbyAxMi4wXHZjXGluY2x1ZGVcc3RkaW8uaCgyMTEpIDogc2VlIGRlY2xhcmF0aW9uIG9mICdmb3BlbicKLSAgICAgMT5wOlxnaXRodWIuY29tXGtocm9ub3Nncm91cFxnbC1uZXh0XGRlbW9zXHpsaWJcZ3ppby5jKDIyNik6IHdhcm5pbmcgQzQ5OTY6ICdzcHJpbnRmJzogVGhpcyBmdW5jdGlvbiBvciB2YXJpYWJsZSBtYXkgYmUgdW5zYWZlLiBDb25zaWRlciB1c2luZyBzcHJpbnRmX3MgaW5zdGVhZC4gVG8gZGlzYWJsZSBkZXByZWNhdGlvbiwgdXNlIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTLiBTZWUgb25saW5lIGhlbHAgZm9yIGRldGFpbHMuCi0gICAgICAgICAgICAgICAgIGM6XHByb2dyYW0gZmlsZXMgKHg4NilcbWljcm9zb2Z0IHZpc3VhbCBzdHVkaW8gMTIuMFx2Y1xpbmNsdWRlXHN0ZGlvLmgoMzU2KSA6IHNlZSBkZWNsYXJhdGlvbiBvZiAnc3ByaW50ZicKLSAgICAgMT5wOlxnaXRodWIuY29tXGtocm9ub3Nncm91cFxnbC1uZXh0XGRlbW9zXHpsaWJcZ3ppby5jKDYyNyk6IHdhcm5pbmcgQzQ5OTY6ICdfdnNucHJpbnRmJzogVGhpcyBmdW5jdGlvbiBvciB2YXJpYWJsZSBtYXkgYmUgdW5zYWZlLiBDb25zaWRlciB1c2luZyBfdnNucHJpbnRmX3MgaW5zdGVhZC4gVG8gZGlzYWJsZSBkZXByZWNhdGlvbiwgdXNlIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTLiBTZWUgb25saW5lIGhlbHAgZm9yIGRldGFpbHMuCi0gICAgICAgICAgICAgICAgIGM6XHByb2dyYW0gZmlsZXMgKHg4NilcbWljcm9zb2Z0IHZpc3VhbCBzdHVkaW8gMTIuMFx2Y1xpbmNsdWRlXHN0ZGlvLmgoMzQ2KSA6IHNlZSBkZWNsYXJhdGlvbiBvZiAnX3ZzbnByaW50ZicKLSAgICAgMT5wOlxnaXRodWIuY29tXGtocm9ub3Nncm91cFxnbC1uZXh0XGRlbW9zXHpsaWJcZ3ppby5jKDEwMDEpOiB3YXJuaW5nIEM0OTk2OiAnc3RyZXJyb3InOiBUaGlzIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIG1heSBiZSB1bnNhZmUuIENvbnNpZGVyIHVzaW5nIHN0cmVycm9yX3MgaW5zdGVhZC4gVG8gZGlzYWJsZSBkZXByZWNhdGlvbiwgdXNlIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTLiBTZWUgb25saW5lIGhlbHAgZm9yIGRldGFpbHMuCi0gICAgICAgICAgICAgICAgIGM6XHByb2dyYW0gZmlsZXMgKHg4NilcbWljcm9zb2Z0IHZpc3VhbCBzdHVkaW8gMTIuMFx2Y1xpbmNsdWRlXHN0cmluZy5oKDE2OCkgOiBzZWUgZGVjbGFyYXRpb24gb2YgJ3N0cmVycm9yJwotICAgICAxPnA6XGdpdGh1Yi5jb21ca2hyb25vc2dyb3VwXGdsLW5leHRcZGVtb3NcemxpYlxnemlvLmMoMTAwOCk6IHdhcm5pbmcgQzQ5OTY6ICdzdHJjcHknOiBUaGlzIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIG1heSBiZSB1bnNhZmUuIENvbnNpZGVyIHVzaW5nIHN0cmNweV9zIGluc3RlYWQuIFRvIGRpc2FibGUgZGVwcmVjYXRpb24sIHVzZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUy4gU2VlIG9ubGluZSBoZWxwIGZvciBkZXRhaWxzLgotICAgICAgICAgICAgICAgICBjOlxwcm9ncmFtIGZpbGVzICh4ODYpXG1pY3Jvc29mdCB2aXN1YWwgc3R1ZGlvIDEyLjBcdmNcaW5jbHVkZVxzdHJpbmcuaCgxMTIpIDogc2VlIGRlY2xhcmF0aW9uIG9mICdzdHJjcHknCi0gICAgIDE+cDpcZ2l0aHViLmNvbVxraHJvbm9zZ3JvdXBcZ2wtbmV4dFxkZW1vc1x6bGliXGd6aW8uYygxMDA5KTogd2FybmluZyBDNDk5NjogJ3N0cmNhdCc6IFRoaXMgZnVuY3Rpb24gb3IgdmFyaWFibGUgbWF5IGJlIHVuc2FmZS4gQ29uc2lkZXIgdXNpbmcgc3RyY2F0X3MgaW5zdGVhZC4gVG8gZGlzYWJsZSBkZXByZWNhdGlvbiwgdXNlIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTLiBTZWUgb25saW5lIGhlbHAgZm9yIGRldGFpbHMuCi0gICAgICAgICAgICAgICAgIGM6XHByb2dyYW0gZmlsZXMgKHg4NilcbWljcm9zb2Z0IHZpc3VhbCBzdHVkaW8gMTIuMFx2Y1xpbmNsdWRlXHN0cmluZy5oKDExOCkgOiBzZWUgZGVjbGFyYXRpb24gb2YgJ3N0cmNhdCcKLSAgICAgMT5wOlxnaXRodWIuY29tXGtocm9ub3Nncm91cFxnbC1uZXh0XGRlbW9zXHpsaWJcZ3ppby5jKDEwMTApOiB3YXJuaW5nIEM0OTk2OiAnc3RyY2F0JzogVGhpcyBmdW5jdGlvbiBvciB2YXJpYWJsZSBtYXkgYmUgdW5zYWZlLiBDb25zaWRlciB1c2luZyBzdHJjYXRfcyBpbnN0ZWFkLiBUbyBkaXNhYmxlIGRlcHJlY2F0aW9uLCB1c2UgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MuIFNlZSBvbmxpbmUgaGVscCBmb3IgZGV0YWlscy4KLSAgICAgICAgICAgICAgICAgYzpccHJvZ3JhbSBmaWxlcyAoeDg2KVxtaWNyb3NvZnQgdmlzdWFsIHN0dWRpbyAxMi4wXHZjXGluY2x1ZGVcc3RyaW5nLmgoMTE4KSA6IHNlZSBkZWNsYXJhdGlvbiBvZiAnc3RyY2F0JwotICAgICAgICAgaW5mYmFjay5jCi0gICAgICAgICBpbmZmYXN0LmMKLSAgICAgICAgIGluZmxhdGUuYwotICAgICAgICAgaW5mdHJlZXMuYwotICAgICAgICAgdHJlZXMuYwotICAgICAgICAgdW5jb21wci5jCi0gICAgICAgICB6dXRpbC5jCi0gICAgICAgICBHZW5lcmF0aW5nIENvZGUuLi4KLSAgICAgMT5DOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1TQnVpbGRcTWljcm9zb2Z0LkNwcFx2NC4wXFYxMjBcTWljcm9zb2Z0LkNwcEJ1aWxkLnRhcmdldHMoMTM2MSw1KTogd2FybmluZyBNU0I4MDEyOiBUYXJnZXRQYXRoKFA6XGdpdGh1Yi5jb21cS2hyb25vc0dyb3VwXEdMLU5leHRcZGVtb3NcbGlicG5nXHByb2plY3RzXHZpc3VhbGM3MVwuXFdpbjMyX0xJQl9EZWJ1Z1xaTGliXHpsaWIubGliKSBkb2VzIG5vdCBtYXRjaCB0aGUgTGlicmFyeSdzIE91dHB1dEZpbGUgcHJvcGVydHkgdmFsdWUgKFA6XGdpdGh1Yi5jb21cS2hyb25vc0dyb3VwXEdMLU5leHRcZGVtb3NcbGlicG5nXHByb2plY3RzXHZpc3VhbGM3MVxXaW4zMl9MSUJfRGVidWdcWkxpYlx6bGliZC5saWIpLiBUaGlzIG1heSBjYXVzZSB5b3VyIHByb2plY3QgdG8gYnVpbGQgaW5jb3JyZWN0bHkuIFRvIGNvcnJlY3QgdGhpcywgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0ICQoT3V0RGlyKSwgJChUYXJnZXROYW1lKSBhbmQgJChUYXJnZXRFeHQpIHByb3BlcnR5IHZhbHVlcyBtYXRjaCB0aGUgdmFsdWUgc3BlY2lmaWVkIGluICUoTGliLk91dHB1dEZpbGUpLgotICAgICAxPkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTVNCdWlsZFxNaWNyb3NvZnQuQ3BwXHY0LjBcVjEyMFxNaWNyb3NvZnQuQ3BwQnVpbGQudGFyZ2V0cygxMzYzLDUpOiB3YXJuaW5nIE1TQjgwMTI6IFRhcmdldE5hbWUoemxpYikgZG9lcyBub3QgbWF0Y2ggdGhlIExpYnJhcnkncyBPdXRwdXRGaWxlIHByb3BlcnR5IHZhbHVlICh6bGliZCkuIFRoaXMgbWF5IGNhdXNlIHlvdXIgcHJvamVjdCB0byBidWlsZCBpbmNvcnJlY3RseS4gVG8gY29ycmVjdCB0aGlzLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgJChPdXREaXIpLCAkKFRhcmdldE5hbWUpIGFuZCAkKFRhcmdldEV4dCkgcHJvcGVydHkgdmFsdWVzIG1hdGNoIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gJShMaWIuT3V0cHV0RmlsZSkuCi0gICAgICAgTGliOgotICAgICAgICAgQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMi4wXFZDXGJpblxMaWIuZXhlIC9PVVQ6Ii5cV2luMzJfTElCX0RlYnVnXFpMaWJcemxpYmQubGliIiAvTk9MT0dPIC5cV2luMzJfTElCX0RlYnVnXFpMaWJcYWRsZXIzMi5vYmoKLSAgICAgICAgIC5cV2luMzJfTElCX0RlYnVnXFpMaWJcY29tcHJlc3Mub2JqCi0gICAgICAgICAuXFdpbjMyX0xJQl9EZWJ1Z1xaTGliXGNyYzMyLm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdcWkxpYlxkZWZsYXRlLm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdcWkxpYlxnemlvLm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdcWkxpYlxpbmZiYWNrLm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdcWkxpYlxpbmZmYXN0Lm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdcWkxpYlxpbmZsYXRlLm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdcWkxpYlxpbmZ0cmVlcy5vYmoKLSAgICAgICAgIC5cV2luMzJfTElCX0RlYnVnXFpMaWJcdHJlZXMub2JqCi0gICAgICAgICAuXFdpbjMyX0xJQl9EZWJ1Z1xaTGliXHVuY29tcHIub2JqCi0gICAgICAgICAuXFdpbjMyX0xJQl9EZWJ1Z1xaTGliXHp1dGlsLm9iagotICAgICAgICAgemxpYi52Y3hwcm9qIC0+IFA6XGdpdGh1Yi5jb21cS2hyb25vc0dyb3VwXEdMLU5leHRcZGVtb3NcbGlicG5nXHByb2plY3RzXHZpc3VhbGM3MVwuXFdpbjMyX0xJQl9EZWJ1Z1xaTGliXHpsaWIubGliCi0gICAgIDE+RG9uZSBCdWlsZGluZyBQcm9qZWN0ICJQOlxnaXRodWIuY29tXEtocm9ub3NHcm91cFxHTC1OZXh0XGRlbW9zXGxpYnBuZ1xwcm9qZWN0c1x2aXN1YWxjNzFcemxpYi52Y3hwcm9qIiAoQnVpbGQgdGFyZ2V0KHMpKS4KLQotQnVpbGQgc3VjY2VlZGVkLgotCi1UaW1lIEVsYXBzZWQgMDA6MDA6MDAuNjEKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliLnRsb2cvTGliLWxpbmsucmVhZC4xLnRsb2cgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvemxpYi50bG9nL0xpYi1saW5rLnJlYWQuMS50bG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGIzYjMyLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliLnRsb2cvTGliLWxpbmsucmVhZC4xLnRsb2cKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvemxpYi50bG9nL0xpYi1saW5rLndyaXRlLjEudGxvZyBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliLnRsb2cvTGliLWxpbmsud3JpdGUuMS50bG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2QxZmRkLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliLnRsb2cvTGliLWxpbmsud3JpdGUuMS50bG9nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL3psaWIudGxvZy9jbC5jb21tYW5kLjEudGxvZyBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliLnRsb2cvY2wuY29tbWFuZC4xLnRsb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjg2NTcuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL3psaWIudGxvZy9jbC5jb21tYW5kLjEudGxvZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliLnRsb2cvY2wucmVhZC4xLnRsb2cgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvemxpYi50bG9nL2NsLnJlYWQuMS50bG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDZlMzY2Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliLnRsb2cvY2wucmVhZC4xLnRsb2cKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvemxpYi50bG9nL2NsLndyaXRlLjEudGxvZyBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliLnRsb2cvY2wud3JpdGUuMS50bG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjAwMDVmLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliLnRsb2cvY2wud3JpdGUuMS50bG9nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL3psaWIudGxvZy9saWIuY29tbWFuZC4xLnRsb2cgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvemxpYi50bG9nL2xpYi5jb21tYW5kLjEudGxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzYjNmYy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvemxpYi50bG9nL2xpYi5jb21tYW5kLjEudGxvZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliLnRsb2cvemxpYi5sYXN0YnVpbGRzdGF0ZSBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliLnRsb2cvemxpYi5sYXN0YnVpbGRzdGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyZGY5YS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvemxpYi50bG9nL3psaWIubGFzdGJ1aWxkc3RhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPXY0LjA6UGxhdGZvcm1Ub29sU2V0PXYxMjA6RW5hYmxlTWFuYWdlZEluY3JlbWVudGFsQnVpbGQ9ZmFsc2U6VkNUb29sQXJjaGl0ZWN0dXJlPU5hdGl2ZTMyQml0Ci1MSUIgRGVidWd8V2luMzJ8UDpcZ2l0aHViLmNvbVxLaHJvbm9zR3JvdXBcR0wtTmV4dFxkZW1vc1xsaWJwbmdccHJvamVjdHNcdmlzdWFsYzcxXHwKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliZC5saWIgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvemxpYmQubGliCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDNjY2FkLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvWkxpYi96bGliZC5saWIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvenV0aWwub2JqIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9aTGliL3p1dGlsLm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYTcyYy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL1pMaWIvenV0aWwub2JqCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcubG9nIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcubG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTBmM2M3Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvbGlicG5nLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLe+7v0J1aWxkIHN0YXJ0ZWQgMi8xOC8yMDE1IDk6MzI6MTggUE0uCi0gICAgIDE+UHJvamVjdCAiUDpcZ2l0aHViLmNvbVxLaHJvbm9zR3JvdXBcR0wtTmV4dFxkZW1vc1xsaWJwbmdccHJvamVjdHNcdmlzdWFsYzcxXGxpYnBuZy52Y3hwcm9qIiBvbiBub2RlIDIgKEJ1aWxkIHRhcmdldChzKSkuCi0gICAgIDE+Q2xDb21waWxlOgotICAgICAgICAgQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMi4wXFZDXGJpblxDTC5leGUgL2MgL0kuLlwuLiAvSS4uXC4uXC4uXHpsaWIgL1pJIC9ub2xvZ28gL1czIC9XWC0gL09kIC9PeS0gL0QgV0lOMzIgL0QgX0RFQlVHIC9EIERFQlVHIC9EIFBOR19OT19NTVhfQ09ERSAvRCBQTkdfREVCVUc9MSAvRCBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAvR20tIC9FSHNjIC9SVEMxIC9NRGQgL0dTIC9mcDpwcmVjaXNlIC9aYzp3Y2hhcl90IC9aYzpmb3JTY29wZSAvWWMicG5nLmgiIC9GcCIuXFdpbjMyX0xJQl9EZWJ1Z1xsaWJwbmcucGNoIiAvRm8iLlxXaW4zMl9MSUJfRGVidWdcXCIgL0ZkIi5cV2luMzJfTElCX0RlYnVnXHZjMTIwLnBkYiIgL0dkIC9UQyAvYW5hbHl6ZS0gL2Vycm9yUmVwb3J0OnByb21wdCAuLlwuLlxwbmdlcnJvci5jCi0gICAgICAgICBwbmdlcnJvci5jCi0gICAgICAgICBDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDEyLjBcVkNcYmluXENMLmV4ZSAvYyAvSS4uXC4uIC9JLi5cLi5cLi5cemxpYiAvWkkgL25vbG9nbyAvVzMgL1dYLSAvT2QgL095LSAvRCBXSU4zMiAvRCBfREVCVUcgL0QgREVCVUcgL0QgUE5HX05PX01NWF9DT0RFIC9EIFBOR19ERUJVRz0xIC9EIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIC9HbS0gL0VIc2MgL1JUQzEgL01EZCAvR1MgL2ZwOnByZWNpc2UgL1pjOndjaGFyX3QgL1pjOmZvclNjb3BlIC9GbyIuXFdpbjMyX0xJQl9EZWJ1Z1xcIiAvRmQiLlxXaW4zMl9MSUJfRGVidWdcdmMxMjAucGRiIiAvR2QgL1RDIC9hbmFseXplLSAvZXJyb3JSZXBvcnQ6cHJvbXB0IC4uXC4uXHBuZy5jCi0gICAgICAgICBwbmcuYwotICAgICAgICAgQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMi4wXFZDXGJpblxDTC5leGUgL2MgL0kuLlwuLiAvSS4uXC4uXC4uXHpsaWIgL1pJIC9ub2xvZ28gL1czIC9XWC0gL09kIC9PeS0gL0QgV0lOMzIgL0QgX0RFQlVHIC9EIERFQlVHIC9EIFBOR19OT19NTVhfQ09ERSAvRCBQTkdfREVCVUc9MSAvRCBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAvR20tIC9FSHNjIC9SVEMxIC9NRGQgL0dTIC9mcDpwcmVjaXNlIC9aYzp3Y2hhcl90IC9aYzpmb3JTY29wZSAvWXUicG5nLmgiIC9GcCIuXFdpbjMyX0xJQl9EZWJ1Z1xsaWJwbmcucGNoIiAvRm8iLlxXaW4zMl9MSUJfRGVidWdcXCIgL0ZkIi5cV2luMzJfTElCX0RlYnVnXHZjMTIwLnBkYiIgL0dkIC9UQyAvYW5hbHl6ZS0gL2Vycm9yUmVwb3J0OnByb21wdCAuLlwuLlxwbmdnZXQuYyAuLlwuLlxwbmdtZW0uYyAuLlwuLlxwbmdwcmVhZC5jIC4uXC4uXHBuZ3JlYWQuYyAuLlwuLlxwbmdyaW8uYyAuLlwuLlxwbmdydHJhbi5jIC4uXC4uXHBuZ3J1dGlsLmMgLi5cLi5ccG5nc2V0LmMgLi5cLi5ccG5ndHJhbnMuYyAuLlwuLlxwbmd3aW8uYyAuLlwuLlxwbmd3cml0ZS5jIC4uXC4uXHBuZ3d0cmFuLmMgLi5cLi5ccG5nd3V0aWwuYwotICAgICAgICAgcG5nZ2V0LmMKLSAgICAgICAgIHBuZ21lbS5jCi0gICAgICAgICBwbmdwcmVhZC5jCi0gICAgICAgICBwbmdyZWFkLmMKLSAgICAgICAgIHBuZ3Jpby5jCi0gICAgICAgICBwbmdydHJhbi5jCi0gICAgICAgICBwbmdydXRpbC5jCi0gICAgICAgICBwbmdzZXQuYwotICAgICAgICAgcG5ndHJhbnMuYwotICAgICAgICAgcG5nd2lvLmMKLSAgICAgICAgIHBuZ3dyaXRlLmMKLSAgICAgICAgIHBuZ3d0cmFuLmMKLSAgICAgICAgIHBuZ3d1dGlsLmMKLSAgICAgICAgIEdlbmVyYXRpbmcgQ29kZS4uLgotICAgICAxPkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTVNCdWlsZFxNaWNyb3NvZnQuQ3BwXHY0LjBcVjEyMFxNaWNyb3NvZnQuQ3BwQnVpbGQudGFyZ2V0cygxMzYxLDUpOiB3YXJuaW5nIE1TQjgwMTI6IFRhcmdldFBhdGgoUDpcZ2l0aHViLmNvbVxLaHJvbm9zR3JvdXBcR0wtTmV4dFxkZW1vc1xsaWJwbmdccHJvamVjdHNcdmlzdWFsYzcxXC5cV2luMzJfTElCX0RlYnVnXGxpYnBuZy5saWIpIGRvZXMgbm90IG1hdGNoIHRoZSBMaWJyYXJ5J3MgT3V0cHV0RmlsZSBwcm9wZXJ0eSB2YWx1ZSAoUDpcZ2l0aHViLmNvbVxLaHJvbm9zR3JvdXBcR0wtTmV4dFxkZW1vc1xsaWJwbmdccHJvamVjdHNcdmlzdWFsYzcxXFdpbjMyX0xJQl9EZWJ1Z1xsaWJwbmdkLmxpYikuIFRoaXMgbWF5IGNhdXNlIHlvdXIgcHJvamVjdCB0byBidWlsZCBpbmNvcnJlY3RseS4gVG8gY29ycmVjdCB0aGlzLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgJChPdXREaXIpLCAkKFRhcmdldE5hbWUpIGFuZCAkKFRhcmdldEV4dCkgcHJvcGVydHkgdmFsdWVzIG1hdGNoIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gJShMaWIuT3V0cHV0RmlsZSkuCi0gICAgIDE+QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNU0J1aWxkXE1pY3Jvc29mdC5DcHBcdjQuMFxWMTIwXE1pY3Jvc29mdC5DcHBCdWlsZC50YXJnZXRzKDEzNjMsNSk6IHdhcm5pbmcgTVNCODAxMjogVGFyZ2V0TmFtZShsaWJwbmcpIGRvZXMgbm90IG1hdGNoIHRoZSBMaWJyYXJ5J3MgT3V0cHV0RmlsZSBwcm9wZXJ0eSB2YWx1ZSAobGlicG5nZCkuIFRoaXMgbWF5IGNhdXNlIHlvdXIgcHJvamVjdCB0byBidWlsZCBpbmNvcnJlY3RseS4gVG8gY29ycmVjdCB0aGlzLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgJChPdXREaXIpLCAkKFRhcmdldE5hbWUpIGFuZCAkKFRhcmdldEV4dCkgcHJvcGVydHkgdmFsdWVzIG1hdGNoIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gJShMaWIuT3V0cHV0RmlsZSkuCi0gICAgICAgTGliOgotICAgICAgICAgQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMi4wXFZDXGJpblxMaWIuZXhlIC9PVVQ6Ii5cV2luMzJfTElCX0RlYnVnXGxpYnBuZ2QubGliIiAvTk9MT0dPIC5cV2luMzJfTElCX0RlYnVnXHBuZy5vYmoKLSAgICAgICAgIC5cV2luMzJfTElCX0RlYnVnXHBuZ2Vycm9yLm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdccG5nZ2V0Lm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdccG5nbWVtLm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdccG5ncHJlYWQub2JqCi0gICAgICAgICAuXFdpbjMyX0xJQl9EZWJ1Z1xwbmdyZWFkLm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdccG5ncmlvLm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdccG5ncnRyYW4ub2JqCi0gICAgICAgICAuXFdpbjMyX0xJQl9EZWJ1Z1xwbmdydXRpbC5vYmoKLSAgICAgICAgIC5cV2luMzJfTElCX0RlYnVnXHBuZ3NldC5vYmoKLSAgICAgICAgIC5cV2luMzJfTElCX0RlYnVnXHBuZ3RyYW5zLm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdccG5nd2lvLm9iagotICAgICAgICAgLlxXaW4zMl9MSUJfRGVidWdccG5nd3JpdGUub2JqCi0gICAgICAgICAuXFdpbjMyX0xJQl9EZWJ1Z1xwbmd3dHJhbi5vYmoKLSAgICAgICAgIC5cV2luMzJfTElCX0RlYnVnXHBuZ3d1dGlsLm9iagotICAgICAgICAgbGlicG5nLnZjeHByb2ogLT4gUDpcZ2l0aHViLmNvbVxLaHJvbm9zR3JvdXBcR0wtTmV4dFxkZW1vc1xsaWJwbmdccHJvamVjdHNcdmlzdWFsYzcxXC5cV2luMzJfTElCX0RlYnVnXGxpYnBuZy5saWIKLSAgICAgMT5Eb25lIEJ1aWxkaW5nIFByb2plY3QgIlA6XGdpdGh1Yi5jb21cS2hyb25vc0dyb3VwXEdMLU5leHRcZGVtb3NcbGlicG5nXHByb2plY3RzXHZpc3VhbGM3MVxsaWJwbmcudmN4cHJvaiIgKEJ1aWxkIHRhcmdldChzKSkuCi0KLUJ1aWxkIHN1Y2NlZWRlZC4KLQotVGltZSBFbGFwc2VkIDAwOjAwOjAwLjc4CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL2xpYnBuZy5wY2ggYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL2xpYnBuZy5wY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTE2NTYuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcucGNoCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcudGxvZy9MaWItbGluay5yZWFkLjEudGxvZyBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvbGlicG5nLnRsb2cvTGliLWxpbmsucmVhZC4xLnRsb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjViYTYuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcudGxvZy9MaWItbGluay5yZWFkLjEudGxvZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvbGlicG5nLnRsb2cvTGliLWxpbmsud3JpdGUuMS50bG9nIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcudGxvZy9MaWItbGluay53cml0ZS4xLnRsb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzQ0YTcuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcudGxvZy9MaWItbGluay53cml0ZS4xLnRsb2cKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL2xpYnBuZy50bG9nL2NsLmNvbW1hbmQuMS50bG9nIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcudGxvZy9jbC5jb21tYW5kLjEudGxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiMmMzZC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL2xpYnBuZy50bG9nL2NsLmNvbW1hbmQuMS50bG9nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcudGxvZy9jbC5yZWFkLjEudGxvZyBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvbGlicG5nLnRsb2cvY2wucmVhZC4xLnRsb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZmNmNWIuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcudGxvZy9jbC5yZWFkLjEudGxvZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvbGlicG5nLnRsb2cvY2wud3JpdGUuMS50bG9nIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcudGxvZy9jbC53cml0ZS4xLnRsb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMmMyYjQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcudGxvZy9jbC53cml0ZS4xLnRsb2cKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL2xpYnBuZy50bG9nL2xpYi5jb21tYW5kLjEudGxvZyBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvbGlicG5nLnRsb2cvbGliLmNvbW1hbmQuMS50bG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzc3MWRmLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvbGlicG5nLnRsb2cvbGliLmNvbW1hbmQuMS50bG9nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmcudGxvZy9saWJwbmcubGFzdGJ1aWxkc3RhdGUgYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL2xpYnBuZy50bG9nL2xpYnBuZy5sYXN0YnVpbGRzdGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyZGY5YS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL2xpYnBuZy50bG9nL2xpYnBuZy5sYXN0YnVpbGRzdGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI1RhcmdldEZyYW1ld29ya1ZlcnNpb249djQuMDpQbGF0Zm9ybVRvb2xTZXQ9djEyMDpFbmFibGVNYW5hZ2VkSW5jcmVtZW50YWxCdWlsZD1mYWxzZTpWQ1Rvb2xBcmNoaXRlY3R1cmU9TmF0aXZlMzJCaXQKLUxJQiBEZWJ1Z3xXaW4zMnxQOlxnaXRodWIuY29tXEtocm9ub3NHcm91cFxHTC1OZXh0XGRlbW9zXGxpYnBuZ1xwcm9qZWN0c1x2aXN1YWxjNzFcfApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmdkLmxpYiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvbGlicG5nZC5saWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMTcyZTguLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9saWJwbmdkLmxpYgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nLm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM2NTliNi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZy5vYmoKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ2Vycm9yLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nZXJyb3Iub2JqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGVhYWZlLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nZXJyb3Iub2JqCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9wbmdnZXQub2JqIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9wbmdnZXQub2JqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTIxMjY1Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nZ2V0Lm9iagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nbWVtLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nbWVtLm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExZjBlMy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ21lbS5vYmoKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ3ByZWFkLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5ncHJlYWQub2JqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTc3OGM4Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5ncHJlYWQub2JqCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9wbmdyZWFkLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5ncmVhZC5vYmoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MjdlMTAuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9wbmdyZWFkLm9iagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5ncmlvLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5ncmlvLm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1Yjk0OS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ3Jpby5vYmoKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ3J0cmFuLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5ncnRyYW4ub2JqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzc0YzMzLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5ncnRyYW4ub2JqCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9wbmdydXRpbC5vYmogYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ3J1dGlsLm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlZTY1ZS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ3J1dGlsLm9iagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nc2V0Lm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nc2V0Lm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlOWM5My4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ3NldC5vYmoKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ3RyYW5zLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5ndHJhbnMub2JqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODY5NjA2Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5ndHJhbnMub2JqCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9wbmd3aW8ub2JqIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9wbmd3aW8ub2JqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc1NzIwLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nd2lvLm9iagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nd3JpdGUub2JqIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9wbmd3cml0ZS5vYmoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NTI3MDEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9wbmd3cml0ZS5vYmoKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ3d0cmFuLm9iaiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nd3RyYW4ub2JqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmU4N2JlLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvcG5nd3RyYW4ub2JqCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy9wbmd3dXRpbC5vYmogYi9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ3d1dGlsLm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0MGU1Zi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3BuZ3d1dGlsLm9iagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvdmMxMjAuaWRiIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy92YzEyMC5pZGIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzA0ZWMuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL1dpbjMyX0xJQl9EZWJ1Zy92YzEyMC5pZGIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9wcm9qZWN0cy92aXN1YWxjNzEvV2luMzJfTElCX0RlYnVnL3ZjMTIwLnBkYiBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvdmMxMjAucGRiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGVhMjM3Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9XaW4zMl9MSUJfRGVidWcvdmMxMjAucGRiCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL2lwY2gvbGlicG5nLWVjYjMxYzE1L2xpYnBuZy1lZWU4OGQ5YS5pcGNoIGIvbGlicy9saWJwbmcvcHJvamVjdHMvdmlzdWFsYzcxL2lwY2gvbGlicG5nLWVjYjMxYzE1L2xpYnBuZy1lZWU4OGQ5YS5pcGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTBmNzdlLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3Zpc3VhbGM3MS9pcGNoL2xpYnBuZy1lY2IzMWMxNS9saWJwbmctZWVlODhkOWEuaXBjaAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Byb2plY3RzL3dpbmNlLnR4dCBiL2xpYnMvbGlicG5nL3Byb2plY3RzL3dpbmNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhMjZjMC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9wcm9qZWN0cy93aW5jZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUEgc2V0IG9mIHByb2plY3QgZmlsZXMgaXMgYXZhaWxhYmxlIGZvciBXaW5DRS4gIEdldAotbGlicG5nLTEuMi41LXByb2plY3Qtd2luY2UuemlwIGZyb20gYSBsaWJwbmcgZGlzdHJpYnV0aW9uCi1zaXRlIHN1Y2ggYXMgaHR0cDovL2xpYnBuZy5zb3VyY2Vmb3JnZS5uZXQKLQotUHV0IHRoZSB6aXAgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSAocHJvamVjdHMpIGFuZCB0aGVuIHJ1bgotInVuemlwIC1hIGxpYnBuZy0xLjIuNS1wcm9qZWN0LXdpbmNlLnppcCIKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvQ01ha2VMaXN0cy50eHQgYi9saWJzL2xpYnBuZy9zY3JpcHRzL0NNYWtlTGlzdHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODNmZjU0Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotCi1wcm9qZWN0KFBORykKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDcgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi1zZXQoUE5HTElCX01BSk9SIDEpCi1zZXQoUE5HTElCX01JTk9SIDIpCi1zZXQoUE5HTElCX1JFTEVBU0UgMzcpCi1zZXQoUE5HTElCX05BTUUgbGlicG5nJHtQTkdMSUJfTUFKT1J9JHtQTkdMSUJfTUlOT1J9KQotc2V0KFBOR0xJQl9WRVJTSU9OICR7UE5HTElCX01BSk9SfS4ke1BOR0xJQl9NSU5PUn0uJHtQTkdMSUJfUkVMRUFTRX0pCi0KLSMgbmVlZGVkIHBhY2thZ2VzCi1maW5kX3BhY2thZ2UoWkxJQiBSRVFVSVJFRCkKLWlmKE5PVCBXSU4zMikKLSBmaW5kX2xpYnJhcnkoTV9MSUJSQVJZCi0gICAgIE5BTUVTIG0KLSAgICAgUEFUSFMgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIKLSApCi0gaWYoTk9UIE1fTElCUkFSWSkKLSAgIG1lc3NhZ2UoU1RBVFVTCi0gICAgICJtYXRoIGxpYnJhcnkgJ2xpYm0nIG5vdCBmb3VuZCAtIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgZGlzYWJsZWQiKQotIGVuZGlmKE5PVCBNX0xJQlJBUlkpCi1lbHNlKE5PVCBXSU4zMikKLSAjIG5vdCBuZWVkZWQgb24gd2luZG93cwotIHNldChNX0xJQlJBUlkgIiIpCi1lbmRpZihOT1QgV0lOMzIpCi0KLQotIyBDT01NQU5EIExJTkUgT1BUSU9OUwotb3B0aW9uKFBOR19TSEFSRUQgIkJ1aWxkIHNoYXJlZCBsaWIiIFlFUykKLW9wdGlvbihQTkdfU1RBVElDICJCdWlsZCBzdGF0aWMgbGliIiBZRVMpCi1pZihNSU5HVykKLSAgb3B0aW9uKFBOR19URVNUUyAgIkJ1aWxkIHBuZ3Rlc3QiIE5PKQotZWxzZShNSU5HVykKLSAgb3B0aW9uKFBOR19URVNUUyAgIkJ1aWxkIHBuZ3Rlc3QiIFlFUykKLWVuZGlmKE1JTkdXKQotb3B0aW9uKFBOR19OT19DT05TT0xFX0lPICJGSVhNRSIgWUVTKQotb3B0aW9uKFBOR19OT19TVERJTyAgICAgICJGSVhNRSIgWUVTKQotb3B0aW9uKFBOR19ERUJVRyAgICAgICAgICJCdWlsZCB3aXRoIGRlYnVnIG91dHB1dCIgWUVTKQotb3B0aW9uKFBOR0FSRyAgICAgICAgICAgICJGSVhNRSIgWUVTKQotI1RPRE86Ci0jIFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRAotCi0jIG1heWJlIG5lZWRzIGltcHJvdmluZywgYnV0IGN1cnJlbnRseSBJIGRvbid0IGtub3cgd2hlbiB3ZSBjYW4gZW5hYmxlIHdoYXQgOikKLXNldChwbmdfYXNtX3RtcCAiT0ZGIikKLWlmKE5PVCBXSU4zMikKLSBmaW5kX3Byb2dyYW0odW5hbWVfZXhlY3V0YWJsZSBOQU1FUyB1bmFtZSBQQVRIUyAvYmluIC91c3IvYmluIC91c3IvbG9jYWwvYmluKQotIGlmKHVuYW1lX2V4ZWN1dGFibGUpCi0gICBFWEVDX1BST0dSQU0oJHt1bmFtZV9leGVjdXRhYmxlfSBBUkdTIC0tbWFjaGluZSBPVVRQVVRfVkFSSUFCTEUgdW5hbWVfb3V0cHV0KQotICAgaWYoInVuYW1lX291dHB1dCIgTUFUQ0hFUyAiXi4qaVsxLTldODYuKiQiKQotICAgICAgc2V0KHBuZ19hc21fdG1wICJPTiIpCi0gICBlbHNlKCJ1bmFtZV9vdXRwdXQiIE1BVENIRVMgIl4uKmlbMS05XTg2LiokIikKLSAgICAgIHNldChwbmdfYXNtX3RtcCAiT0ZGIikKLSAgIGVuZGlmKCJ1bmFtZV9vdXRwdXQiIE1BVENIRVMgIl4uKmlbMS05XTg2LiokIikKLSBlbmRpZih1bmFtZV9leGVjdXRhYmxlKQotZWxzZShOT1QgV0lOMzIpCi0gIyB0aGlzIGVudiB2YXIgaXMgbm9ybWFsbHkgb25seSBzZXQgb24gd2luNjQKLSBTRVQoVEVYVCAiUHJvZ3JhbUZpbGVzKHg4NikiKQotIGlmKCIkRU5WeyR7VEVYVH19IiBTVFJFUVVBTCAiIikKLSAgc2V0KHBuZ19hc21fdG1wICJPTiIpCi0gZW5kaWYoIiRFTlZ7JHtURVhUfX0iIFNUUkVRVUFMICIiKQotZW5kaWYoTk9UIFdJTjMyKQotCi0jIFNFVCBMSUJOQU1FCi0jIG1zdmMgZG9lcyBub3QgYXBwZW5kICdsaWInIC0gZG8gaXQgaGVyZSB0byBoYXZlIGNvbnNpc3RlbnQgbmFtZQotaWYoTVNWQykKLSBzZXQoUE5HX0xJQl9OQU1FIGxpYikKLWVuZGlmKE1TVkMpCi1zZXQoUE5HX0xJQl9OQU1FICR7UE5HX0xJQl9OQU1FfXBuZyR7UE5HTElCX01BSk9SfSR7UE5HTElCX01JTk9SfSkKLQotIyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRlYnVnIGFuZCByZWxlYXNlIGxpYgotc2V0KENNQUtFX0RFQlVHX1BPU1RGSVggImQiKQotCi0KLSMgT1VSIFNPVVJDRVMKLXNldChsaWJwbmdfc291cmNlcwotIHBuZy5oCi0gcG5nY29uZi5oCi0gcG5nLmMKLSBwbmdlcnJvci5jCi0gcG5nZ2V0LmMKLSBwbmdtZW0uYwotIHBuZ3ByZWFkLmMKLSBwbmdyZWFkLmMKLSBwbmdyaW8uYwotIHBuZ3J0cmFuLmMKLSBwbmdydXRpbC5jCi0gcG5nc2V0LmMKLSBwbmd0cmFucy5jCi0gcG5nd2lvLmMKLSBwbmd3cml0ZS5jCi0gcG5nd3RyYW4uYwotIHBuZ3d1dGlsLmMKLSkKLXNldChwbmd0ZXN0X3NvdXJjZXMKLSAgICAgICBwbmd0ZXN0LmMKLSkKLSMgU09NRSBORUVERUQgREVGSU5JVElPTlMKLWlmKE1TVkMpCi0gIGFkZF9kZWZpbml0aW9ucygtRFBOR19OT19NT0RVTEVERUYgLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUpCi1lbmRpZihNU1ZDKQotCi1hZGRfZGVmaW5pdGlvbnMoLURaTElCX0RMTCkKLQotYWRkX2RlZmluaXRpb25zKC1ETElCUE5HX05PX01NWCkKLWFkZF9kZWZpbml0aW9ucygtRFBOR19OT19NTVhfQ09ERSkKLQotaWYoUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVEKQotIGFkZF9kZWZpbml0aW9ucygtRFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRCkKLWVuZGlmKFBOR19DT05TT0xFX0lPX1NVUFBPUlRFRCkKLQotaWYoUE5HX05PX0NPTlNPTEVfSU8pCi0gYWRkX2RlZmluaXRpb25zKC1EUE5HX05PX0NPTlNPTEVfSU8pCi1lbmRpZihQTkdfTk9fQ09OU09MRV9JTykKLQotaWYoUE5HX05PX1NURElPKQotIGFkZF9kZWZpbml0aW9ucygtRFBOR19OT19TVERJTykKLWVuZGlmKFBOR19OT19TVERJTykKLQotaWYoUE5HX0RFQlVHKQotIGFkZF9kZWZpbml0aW9ucygtRFBOR19ERUJVRykKLWVuZGlmKFBOR19ERUJVRykKLQotaWYoTk9UIE1fTElCUkFSWSBBTkQgTk9UIFdJTjMyKQotIGFkZF9kZWZpbml0aW9ucygtRFBOR19OT19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpCi1lbmRpZihOT1QgTV9MSUJSQVJZIEFORCBOT1QgV0lOMzIpCi0KLSMgTk9XIEJVSUxEIE9VUiBUQVJHRVQKLWluY2x1ZGVfZGlyZWN0b3JpZXMoJHtQTkdfU09VUkNFX0RJUn0gJHtaTElCX0lOQ0xVREVfRElSfSkKLQotaWYoUE5HX1NIQVJFRCkKLSBhZGRfbGlicmFyeSgke1BOR19MSUJfTkFNRX0gU0hBUkVEICR7bGlicG5nX3NvdXJjZXN9KQotIHRhcmdldF9saW5rX2xpYnJhcmllcygke1BOR19MSUJfTkFNRX0gJHtaTElCX0xJQlJBUll9ICR7TV9MSUJSQVJZfSkKLWVuZGlmKFBOR19TSEFSRUQpCi1pZihQTkdfU1RBVElDKQotIyBkb2VzIG5vdCB3b3JrIHdpdGhvdXQgY2hhbmdpbmcgbmFtZQotIHNldChQTkdfTElCX05BTUVfU1RBVElDICR7UE5HX0xJQl9OQU1FfV9zdGF0aWMpCi0gYWRkX2xpYnJhcnkoJHtQTkdfTElCX05BTUVfU1RBVElDfSBTVEFUSUMgJHtsaWJwbmdfc291cmNlc30pCi1lbmRpZihQTkdfU1RBVElDKQotCi1pZihQTkdfU0hBUkVEIEFORCBXSU4zMikKLSBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtQTkdfTElCX05BTUV9IFBST1BFUlRJRVMgREVGSU5FX1NZTUJPTCBQTkdfQlVJTERfRExMKQotZW5kaWYoUE5HX1NIQVJFRCBBTkQgV0lOMzIpCi0KLWlmKFBOR19URVNUUykKLSMgZG9lcyBub3Qgd29yayB3aXRoIG1zdmMgZHVlIHRvIHBuZ19saWJfdmVyIGlzc3VlCi0gYWRkX2V4ZWN1dGFibGUocG5ndGVzdCAke3BuZ3Rlc3Rfc291cmNlc30pCi0gdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBuZ3Rlc3QgJHtQTkdfTElCX05BTUV9KQotIyAgYWRkX3Rlc3QocG5ndGVzdCAke1BOR19TT1VSQ0VfRElSfS9wbmd0ZXN0LnBuZykKLWVuZGlmKFBOR19URVNUUykKLQotCi0jIENSRUFURSBQS0dDT05GSUcgRklMRVMKLSMgd2UgdXNlIHRoZSBzYW1lIGZpbGVzIGxpa2UgLi9jb25maWd1cmUsIHNvIHdlIGhhdmUgdG8gc2V0IGl0cyB2YXJzCi1zZXQocHJlZml4ICAgICAgJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0pCi1zZXQoZXhlY19wcmVmaXggJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0pCi1zZXQobGliZGlyICAgICAgJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliKQotc2V0KGluY2x1ZGVkaXIgICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2luY2x1ZGUpCi0KLWNvbmZpZ3VyZV9maWxlKCR7UE5HX1NPVVJDRV9ESVJ9L3NjcmlwdHMvbGlicG5nLnBjLmluCi0gICR7UE5HX0JJTkFSWV9ESVJ9L2xpYnBuZy5wYykKLWNvbmZpZ3VyZV9maWxlKCR7UE5HX1NPVVJDRV9ESVJ9L3NjcmlwdHMvbGlicG5nLWNvbmZpZy5pbgotICAke1BOR19CSU5BUllfRElSfS9saWJwbmctY29uZmlnKQotY29uZmlndXJlX2ZpbGUoJHtQTkdfU09VUkNFX0RJUn0vc2NyaXB0cy9saWJwbmcucGMuaW4KLSAgJHtQTkdfQklOQVJZX0RJUn0vJHtQTkdMSUJfTkFNRX0ucGMpCi1jb25maWd1cmVfZmlsZSgke1BOR19TT1VSQ0VfRElSfS9zY3JpcHRzL2xpYnBuZy1jb25maWcuaW4KLSAgJHtQTkdfQklOQVJZX0RJUn0vJHtQTkdMSUJfTkFNRX0tY29uZmlnKQotCi0jIFNFVCBVUCBMSU5LUwotc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7UE5HX0xJQl9OQU1FfSBQUk9QRVJUSUVTCi0jICAgIFZFUlNJT04gMC4ke1BOR0xJQl9SRUxFQVNFfS4xLjIuMzcKLSAgICAgVkVSU0lPTiAwLiR7UE5HTElCX1JFTEVBU0V9LjAKLSAgICAgU09WRVJTSU9OIDAKLSAgICAgQ0xFQU5fRElSRUNUX09VVFBVVCAxKQotaWYoTk9UIFdJTjMyKQotICAjIHRoYXQncyB1bmNvb2wgb24gd2luMzIgLSBpdCBvdmVyd3JpdGVzIG91ciBzdGF0aWMgaW1wb3J0IGxpYi4uLgotICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtQTkdfTElCX05BTUVfU1RBVElDfSBQUk9QRVJUSUVTCi0gICAgIE9VVFBVVF9OQU1FICR7UE5HX0xJQl9OQU1FfQotICAgICBDTEVBTl9ESVJFQ1RfT1VUUFVUIDEpCi1lbmRpZihOT1QgV0lOMzIpCi0jIElOU1RBTEwKLWluc3RhbGxfdGFyZ2V0cygvbGliICR7UE5HX0xJQl9OQU1FfSkKLWlmKFBOR19TVEFUSUMpCi0gIGluc3RhbGxfdGFyZ2V0cygvbGliICR7UE5HX0xJQl9OQU1FX1NUQVRJQ30pCi1lbmRpZihQTkdfU1RBVElDKQotaW5zdGFsbChGSUxFUyBwbmcuaCBwbmdjb25mLmggICAgICAgICBERVNUSU5BVElPTiBpbmNsdWRlKQotaW5zdGFsbChGSUxFUyBwbmcuaCBwbmdjb25mLmggICAgICAgICBERVNUSU5BVElPTiBpbmNsdWRlLyR7UE5HTElCX05BTUV9KQotaW5zdGFsbChGSUxFUyBsaWJwbmcuMyBsaWJwbmdwZi4zICAgICAgICAgICAgIERFU1RJTkFUSU9OIG1hbi9tYW4zKQotaW5zdGFsbChGSUxFUyBwbmcuNSAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1RJTkFUSU9OIG1hbi9tYW41KQotaW5zdGFsbChGSUxFUyAke1BOR19CSU5BUllfRElSfS9saWJwbmcucGMgICAgIERFU1RJTkFUSU9OIGxpYi9wa2djb25maWcpCi1pbnN0YWxsKEZJTEVTICR7UE5HX0JJTkFSWV9ESVJ9L2xpYnBuZy1jb25maWcgICAgICBERVNUSU5BVElPTiBiaW4pCi1pbnN0YWxsKEZJTEVTICR7UE5HX0JJTkFSWV9ESVJ9LyR7UE5HTElCX05BTUV9LnBjICBERVNUSU5BVElPTiBsaWIvcGtnY29uZmlnKQotaW5zdGFsbChGSUxFUyAke1BOR19CSU5BUllfRElSfS8ke1BOR0xJQl9OQU1FfS1jb25maWcgREVTVElOQVRJT04gYmluKQotCi0jIHdoYXQncyB3aXRoIGxpYnBuZy50eHQgYW5kIGFsbCB0aGUgZXh0cmEgZmlsZXM/Ci0KLQotIyBVTklOU1RBTEwKLSMgZG8gd2UgbmVlZCB0aGlzPwotCi0KLSMgRElTVAotIyBkbyB3ZSBuZWVkIHRoaXM/Ci0KLSMgdG8gY3JlYXRlIG1zdmMgaW1wb3J0IGxpYiBmb3IgbWluZ3cgY29tcGlsZWQgc2hhcmVkIGxpYgotIyBwZXhwb3J0cyBsaWJwbmcuZGxsID4gbGlicG5nLmRlZgotIyBsaWIgL2RlZjpsaWJwbmcuZGVmIC9tYWNoaW5lOng4NgotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL1NDT1BUSU9OUy5wcGMgYi9saWJzL2xpYnBuZy9zY3JpcHRzL1NDT1BUSU9OUy5wcGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMzUwM2UuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9TQ09QVElPTlMucHBjCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1PUFRJTUlaRQotT1BUUEVFUAotT1BUVElNRQotT1BUU0NIRUQKLUFVVE9SRUdJU1RFUgotUEFSTVM9UkVHSVNURVJTCi1JTkNMVURFRElSPWhscDpwcGMvaW5jbHVkZQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9kZXNjcmlwLm1tcyBiL2xpYnMvbGlicG5nL3NjcmlwdHMvZGVzY3JpcC5tbXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYThkN2IuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9kZXNjcmlwLm1tcworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLQotY2NfZGVmcyA9IC9pbmM9JChaTElCU1JDKQotY19kZWIgPQotCi0uaWZkZWYgX19ERUNDX18KLXByZWYgPSAvcHJlZml4PWFsbAotLmVuZGlmCi0KLQotCi1PQkpTID0gcG5nLm9iaiwgcG5nc2V0Lm9iaiwgcG5nZ2V0Lm9iaiwgcG5ncnV0aWwub2JqLCBwbmd0cmFucy5vYmosXAotCXBuZ3d1dGlsLm9iaiwgcG5ncmVhZC5vYmosIHBuZ21lbS5vYmosIHBuZ3dyaXRlLm9iaiwgcG5ncnRyYW4ub2JqLFwKLQlwbmd3dHJhbi5vYmosIHBuZ3Jpby5vYmosIHBuZ3dpby5vYmosIHBuZ2Vycm9yLm9iaiwgcG5ncHJlYWQub2JqCi0KLQotQ0ZMQUdTPSAkKENfREVCKSAkKENDX0RFRlMpICQoUFJFRikKLQotYWxsIDogcG5ndGVzdC5leGUgbGlicG5nLm9sYgotCQlAIHdyaXRlIHN5cyRvdXRwdXQgIiBwbmd0ZXN0IGF2YWlsYWJsZSIKLQotbGlicG5nLm9sYiA6IGxpYnBuZy5vbGIoJChPQkpTKSkKLQlAIHdyaXRlIHN5cyRvdXRwdXQgIiBMaWJwbmcgYXZhaWxhYmxlIgotCi0KLXBuZ3Rlc3QuZXhlIDogcG5ndGVzdC5vYmogbGlicG5nLm9sYgotICAgICAgICAgICAgICBsaW5rIHBuZ3Rlc3QsbGlicG5nLm9sYi9saWIsJChaTElCU1JDKWxpYnoub2xiL2xpYgotCi10ZXN0IDogcG5ndGVzdC5leGUKLSAgIHJ1biBwbmd0ZXN0Ci0KLWNsZWFuIDoKLQlkZWxldGUgKi5vYmo7KiwqLmV4ZTsKLQotCi0jIE90aGVyIGRlcGVuZGVuY2llcy4KLXBuZy5vYmogOiBwbmcuaCwgcG5nY29uZi5oCi1wbmdwcmVhZC5vYmogOiBwbmcuaCwgcG5nY29uZi5oCi1wbmdzZXQub2JqIDogcG5nLmgsIHBuZ2NvbmYuaAotcG5nZ2V0Lm9iaiA6IHBuZy5oLCBwbmdjb25mLmgKLXBuZ3JlYWQub2JqIDogcG5nLmgsIHBuZ2NvbmYuaAotcG5ncnRyYW4ub2JqIDogcG5nLmgsIHBuZ2NvbmYuaAotcG5ncnV0aWwub2JqIDogcG5nLmgsIHBuZ2NvbmYuaAotcG5nZXJyb3Iub2JqIDogcG5nLmgsIHBuZ2NvbmYuaAotcG5nbWVtLm9iaiA6IHBuZy5oLCBwbmdjb25mLmgKLXBuZ3Jpby5vYmogOiBwbmcuaCwgcG5nY29uZi5oCi1wbmd3aW8ub2JqIDogcG5nLmgsIHBuZ2NvbmYuaAotcG5ndHJhbnMub2JqIDogcG5nLmgsIHBuZ2NvbmYuaAotcG5nd3JpdGUub2JqIDogcG5nLmgsIHBuZ2NvbmYuaAotcG5nd3RyYW4ub2JqIDogcG5nLmgsIHBuZ2NvbmYuaAotcG5nd3V0aWwub2JqIDogcG5nLmgsIHBuZ2NvbmYuaAotCi1wbmd0ZXN0Lm9iaiA6IHBuZy5oLCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluIGIvbGlicy9saWJwbmcvc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NjM1NTcuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotCi11c2FnZSgpCi17Ci0gICAgY2F0IDw8RU9GCi1Vc2FnZTogbGlicG5nLWNvbmZpZyBbT1BUSU9OXSAuLi4KLQotS25vd24gdmFsdWVzIGZvciBPUFRJT04gYXJlOgotCi0gIC0tcHJlZml4ICAgICAgICBwcmludCBsaWJwbmcgcHJlZml4Ci0gIC0tbGliZGlyICAgICAgICBwcmludCBwYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIGxpYnJhcnkKLSAgLS1saWJzICAgICAgICAgIHByaW50IGxpYnJhcnkgbGlua2luZyBpbmZvcm1hdGlvbgotICAtLWNjb3B0cyAgICAgICAgcHJpbnQgY29tcGlsZXIgb3B0aW9ucwotICAtLWNwcGZsYWdzICAgICAgcHJpbnQgcHJlLXByb2Nlc3NvciBmbGFncwotICAtLWNmbGFncyAgICAgICAgcHJpbnQgcHJlcHJvY2Vzc29yIGZsYWdzLCBJX29wdHMsIGFuZCBjb21waWxlciBvcHRpb25zCi0gIC0tSV9vcHRzICAgICAgICBwcmludCAiLUkiIGluY2x1ZGUgb3B0aW9ucwotICAtLUxfb3B0cyAgICAgICAgcHJpbnQgbGlua2VyICItTCIgZmxhZ3MgZm9yIGR5bmFtaWMgbGlua2luZwotICAtLVJfb3B0cyAgICAgICAgcHJpbnQgZHluYW1pYyBsaW5rZXIgIi1SIiBvciAiLXJwYXRoIiBmbGFncwotICAtLWxkb3B0cyAgICAgICAgcHJpbnQgbGlua2VyIG9wdGlvbnMKLSAgLS1sZGZsYWdzICAgICAgIHByaW50IGxpbmtlciBmbGFncyAobGRvcHRzLCBMX29wdHMsIFJfb3B0cywgYW5kIGxpYnMpCi0gIC0tc3RhdGljICAgICAgICByZXZpc2Ugc3Vic2VxdWVudCBvdXRwdXRzIGZvciBzdGF0aWMgbGlua2luZwotICAtLWhlbHAgICAgICAgICAgcHJpbnQgdGhpcyBoZWxwIGFuZCBleGl0Ci0gIC0tdmVyc2lvbiAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCi1FT0YKLQotICAgIGV4aXQgJDEKLX0KLQotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICAgIHVzYWdlIDEKLWZpCi0KLXdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gICAgY2FzZSAiJDEiIGluCi0KLSAgICAtLXByZWZpeCkKLSAgICAgICAgZWNobyAke3ByZWZpeH0KLSAgICAgICAgOzsKLQotICAgIC0tdmVyc2lvbikKLSAgICAgICAgZWNobyAke3ZlcnNpb259Ci0gICAgICAgIGV4aXQgMAotICAgICAgICA7OwotCi0gICAgLS1oZWxwKQotICAgICAgICB1c2FnZSAwCi0gICAgICAgIDs7Ci0KLSAgICAtLWNjb3B0cykKLSAgICAgICAgZWNobyAke2Njb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tY3BwZmxhZ3MpCi0gICAgICAgIGVjaG8gJHtjcHBmbGFnc30KLSAgICAgICAgOzsKLQotICAgIC0tY2ZsYWdzKQotICAgICAgICBlY2hvICR7SV9vcHRzfSAke2NwcGZsYWdzfSAke2Njb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tbGliZGlyKQotICAgICAgICBlY2hvICR7bGliZGlyfQotICAgICAgICA7OwotCi0gICAgLS1saWJzKQotICAgICAgICBlY2hvICR7bGlic30KLSAgICAgICAgOzsKLQotICAgIC0tSV9vcHRzKQotICAgICAgICBlY2hvICR7SV9vcHRzfQotICAgICAgICA7OwotCi0gICAgLS1MX29wdHMpCi0gICAgICAgIGVjaG8gJHtMX29wdHN9Ci0gICAgICAgIDs7Ci0KLSAgICAtLVJfb3B0cykKLSAgICAgICAgZWNobyAke1Jfb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tbGRvcHRzKQotICAgICAgICBlY2hvICR7bGRvcHRzfQotICAgICAgICA7OwotKwotICAgIC0tbGRmbGFncykKLSAgICAgICAgZWNobyAke2xkb3B0c30gJHtMX29wdHN9ICR7Ul9vcHRzfSAke2xpYnN9Ci0gICAgICAgIDs7Ci0KLSAgICAtLXN0YXRpYykKLSAgICAgICAgUl9vcHRzPSIiCi0gICAgICAgIDs7Ci0KLSAgICAqKQotICAgICAgICB1c2FnZQotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgc2hpZnQKLWRvbmUKLQotZXhpdCAwCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbiBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2I4YzUxLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIGxpYnBuZy1jb25maWcKLSMgcHJvdmlkZXMgY29uZmlndXJhdGlvbiBpbmZvIGZvciBsaWJwbmcuCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAyIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyBNb2RlbGVkIGFmdGVyIGxpYnhtbC1jb25maWcuCi0KLXZlcnNpb249MS4yLjM3Ci1wcmVmaXg9IiIKLWxpYmRpcj0iIgotbGlicz0iIgotSV9vcHRzPSIiCi1MX29wdHM9IiIKLVJfb3B0cz0iIgotY3BwZmxhZ3M9IiIKLWNjb3B0cz0iIgotbGRvcHRzPSIiCi0KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbGlicG5nLWNvbmZpZy5pbiBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbGlicG5nLWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4NTQ0Zi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL2xpYnBuZy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIGxpYnBuZy1jb25maWcKLSMgcHJvdmlkZXMgY29uZmlndXJhdGlvbiBpbmZvIGZvciBsaWJwbmcuCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0LCAyMDA2LCAyMDA3IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyBNb2RlbGVkIGFmdGVyIGxpYnhtbC1jb25maWcuCi0KLXZlcnNpb249IkBQTkdMSUJfVkVSU0lPTkAiCi1wcmVmaXg9IkBwcmVmaXhAIgotZXhlY19wcmVmaXg9IkBleGVjX3ByZWZpeEAiCi1saWJkaXI9IkBsaWJkaXJAIgotaW5jbHVkZWRpcj0iQGluY2x1ZGVkaXJAL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAiCi1saWJzPSItbHBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAiCi1hbGxfbGlicz0iLWxwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAIC1segotSV9vcHRzPSItSSR7aW5jbHVkZWRpcn0iCi1MX29wdHM9Ii1MJHtsaWJkaXJ9IgotUl9vcHRzPSIiCi1jcHBmbGFncz0iIgotY2NvcHRzPSJATElCUE5HX05PX01NWEAiCi1sZG9wdHM9IiIKLQotdXNhZ2UoKQotewotICAgIGNhdCA8PEVPRgotVXNhZ2U6ICQwIFtPUFRJT05dIC4uLgotCi1Lbm93biB2YWx1ZXMgZm9yIE9QVElPTiBhcmU6Ci0KLSAgLS1wcmVmaXggICAgICAgIHByaW50IGxpYnBuZyBwcmVmaXgKLSAgLS1saWJkaXIgICAgICAgIHByaW50IHBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgbGlicmFyeQotICAtLWxpYnMgICAgICAgICAgcHJpbnQgbGlicmFyeSBsaW5raW5nIGluZm9ybWF0aW9uCi0gIC0tY2NvcHRzICAgICAgICBwcmludCBjb21waWxlciBvcHRpb25zCi0gIC0tY3BwZmxhZ3MgICAgICBwcmludCBwcmUtcHJvY2Vzc29yIGZsYWdzCi0gIC0tY2ZsYWdzICAgICAgICBwcmludCBwcmVwcm9jZXNzb3IgZmxhZ3MsIElfb3B0cywgYW5kIGNvbXBpbGVyIG9wdGlvbnMKLSAgLS1JX29wdHMgICAgICAgIHByaW50ICItSSIgaW5jbHVkZSBvcHRpb25zCi0gIC0tTF9vcHRzICAgICAgICBwcmludCBsaW5rZXIgIi1MIiBmbGFncyBmb3IgZHluYW1pYyBsaW5raW5nCi0gIC0tUl9vcHRzICAgICAgICBwcmludCBkeW5hbWljIGxpbmtlciAiLVIiIG9yICItcnBhdGgiIGZsYWdzCi0gIC0tbGRvcHRzICAgICAgICBwcmludCBsaW5rZXIgb3B0aW9ucwotICAtLWxkZmxhZ3MgICAgICAgcHJpbnQgbGlua2VyIGZsYWdzIChsZG9wdHMsIExfb3B0cywgUl9vcHRzLCBhbmQgbGlicykKLSAgLS1zdGF0aWMgICAgICAgIHJldmlzZSBzdWJzZXF1ZW50IG91dHB1dHMgZm9yIHN0YXRpYyBsaW5raW5nCi0gIC0taGVscCAgICAgICAgICBwcmludCB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgLS12ZXJzaW9uICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KLUVPRgotCi0gICAgZXhpdCAkMQotfQotCi1pZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCi0gICAgdXNhZ2UgMQotZmkKLQotd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KLSAgICBjYXNlICIkMSIgaW4KLQotICAgIC0tcHJlZml4KQotICAgICAgICBlY2hvICR7cHJlZml4fQotICAgICAgICA7OwotCi0gICAgLS12ZXJzaW9uKQotICAgICAgICBlY2hvICR7dmVyc2lvbn0KLSAgICAgICAgZXhpdCAwCi0gICAgICAgIDs7Ci0KLSAgICAtLWhlbHApCi0gICAgICAgIHVzYWdlIDAKLSAgICAgICAgOzsKLQotICAgIC0tY2NvcHRzKQotICAgICAgICBlY2hvICR7Y2NvcHRzfQotICAgICAgICA7OwotCi0gICAgLS1jcHBmbGFncykKLSAgICAgICAgZWNobyAke2NwcGZsYWdzfQotICAgICAgICA7OwotCi0gICAgLS1jZmxhZ3MpCi0gICAgICAgIGVjaG8gJHtJX29wdHN9ICR7Y3BwZmxhZ3N9ICR7Y2NvcHRzfQotICAgICAgICA7OwotCi0gICAgLS1saWJkaXIpCi0gICAgICAgIGVjaG8gJHtsaWJkaXJ9Ci0gICAgICAgIDs7Ci0KLSAgICAtLWxpYnMpCi0gICAgICAgIGVjaG8gJHtsaWJzfQotICAgICAgICA7OwotCi0gICAgLS1JX29wdHMpCi0gICAgICAgIGVjaG8gJHtJX29wdHN9Ci0gICAgICAgIDs7Ci0KLSAgICAtLUxfb3B0cykKLSAgICAgICAgZWNobyAke0xfb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tUl9vcHRzKQotICAgICAgICBlY2hvICR7Ul9vcHRzfQotICAgICAgICA7OwotCi0gICAgLS1sZG9wdHMpCi0gICAgCWVjaG8gJHtsZG9wdHN9Ci0JOzsKLQotICAgIC0tbGRmbGFncykKLSAgICAgICAgZWNobyAke2xkb3B0c30gJHtMX29wdHN9ICR7Ul9vcHRzfSAke2xpYnN9Ci0gICAgICAgIDs7Ci0KLSAgICAtLXN0YXRpYykKLSAgICAgICAgUl9vcHRzPSIiCi0JbGlicz0ke2FsbF9saWJzfQotICAgICAgICA7OwotCi0gICAgKikKLSAgICAgICAgdXNhZ2UKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICAgIHNoaWZ0Ci1kb25lCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9saWJwbmcuaWNjIGIvbGlicy9saWJwbmcvc2NyaXB0cy9saWJwbmcuaWNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWM1MWFmLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbGlicG5nLmljYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vIFByb2plY3QgZmlsZSBmb3IgbGlicG5nIChzdGF0aWMpCi0vLyBJQk0gVmlzdWFsQWdlL0MrKyB2ZXJzaW9uIDQuMCBvciBsYXRlcgotLy8gQ29weXJpZ2h0IChDKSAyMDAwIENvc21pbiBUcnV0YQotLy8gRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0vLyBOb3RlczoKLS8vICAgQWxsIG1vZHVsZXMgYXJlIGNvbXBpbGVkIGluIEMgbW9kZQotLy8gICBUZXN0ZWQgd2l0aCBJQk0gVkFDKysgNC4wIHVuZGVyIFdpbjMyCi0vLyAgIEV4cGVjdGVkIHRvIHdvcmsgd2l0aCBJQk0gVkFDKysgNC4wIG9yIGxhdGVyIHVuZGVyIE9TLzIgYW5kIFdpbjMyCi0vLyAgIENhbiBiZSBlYXNpbHkgYWRhcHRlZCBmb3IgSUJNIFZBQysrIDQuMCBvciBsYXRlciB1bmRlciBBSVgKLS8vIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi1vcHRpb24gaW5jbChzZWFyY2hwYXRoLCAiLi4vemxpYiIpLCBvcHQobGV2ZWwsICIyIiksCi0gbGluayhsaWJzZWFyY2hwYXRoLCAiLi4vemxpYiIpCi17Ci0gICB0YXJnZXQgdHlwZShsaWIpICJsaWJwbmcubGliIgotICAgewotICAgICAgc291cmNlIHR5cGUoYykgInBuZy5jIgotICAgICAgc291cmNlIHR5cGUoYykgInBuZ2Vycm9yLmMiCi0gICAgICBzb3VyY2UgdHlwZShjKSAicG5nZ2V0LmMiCi0gICAgICBzb3VyY2UgdHlwZShjKSAicG5nbWVtLmMiCi0gICAgICBzb3VyY2UgdHlwZShjKSAicG5ncHJlYWQuYyIKLSAgICAgIHNvdXJjZSB0eXBlKGMpICJwbmdyZWFkLmMiCi0gICAgICBzb3VyY2UgdHlwZShjKSAicG5ncmlvLmMiCi0gICAgICBzb3VyY2UgdHlwZShjKSAicG5ncnRyYW4uYyIKLSAgICAgIHNvdXJjZSB0eXBlKGMpICJwbmdydXRpbC5jIgotICAgICAgc291cmNlIHR5cGUoYykgInBuZ3NldC5jIgotICAgICAgc291cmNlIHR5cGUoYykgInBuZ3RyYW5zLmMiCi0gICAgICBzb3VyY2UgdHlwZShjKSAicG5nd2lvLmMiCi0gICAgICBzb3VyY2UgdHlwZShjKSAicG5nd3JpdGUuYyIKLSAgICAgIHNvdXJjZSB0eXBlKGMpICJwbmd3dHJhbi5jIgotICAgICAgc291cmNlIHR5cGUoYykgInBuZ3d1dGlsLmMiCi0gICB9Ci19Ci0KLW9wdGlvbiBpbmNsKHNlYXJjaHBhdGgsICIuLi96bGliIiksIG9wdChsZXZlbCwgIjIiKSwKLSBsaW5rKGxpYnNlYXJjaHBhdGgsICIuLi96bGliIikKLXsKLSAgIHRhcmdldCB0eXBlKGV4ZSkgInBuZ3Rlc3QuZXhlIgotICAgewotICAgICAgc291cmNlIHR5cGUoYykgInBuZ3Rlc3QuYyIKLSAgICAgIHNvdXJjZSB0eXBlKGxpYikgImxpYnBuZy5saWIiCi0gICAgICBzb3VyY2UgdHlwZShsaWIpICJ6bGliLmxpYiIKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbGlicG5nLnBjLWNvbmZpZ3VyZS5pbiBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbGlicG5nLnBjLWNvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkYjU1NS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL2xpYnBuZy5wYy1jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wcmVmaXg9QHByZWZpeEAKLWV4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKLWxpYmRpcj1AbGliZGlyQAotaW5jbHVkZWRpcj1AaW5jbHVkZWRpckAvbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQAotCi1OYW1lOiBsaWJwbmcKLURlc2NyaXB0aW9uOiBMb2FkcyBhbmQgc2F2ZXMgUE5HIGZpbGVzCi1WZXJzaW9uOiBAUE5HTElCX1ZFUlNJT05ACi1MaWJzOiAtTCR7bGliZGlyfSAtbHBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAKLUxpYnMucHJpdmF0ZTogQExJQlNACi1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSBATElCUE5HX05PX01NWEAKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbGlicG5nLnBjLmluIGIvbGlicy9saWJwbmcvc2NyaXB0cy9saWJwbmcucGMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZTExM2UuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9saWJwbmcucGMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wcmVmaXg9QHByZWZpeEAKLWV4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKLWxpYmRpcj1AbGliZGlyQAotaW5jbHVkZWRpcj1AaW5jbHVkZWRpckAvbGlicG5nMTIKLQotTmFtZTogbGlicG5nCi1EZXNjcmlwdGlvbjogTG9hZHMgYW5kIHNhdmVzIFBORyBmaWxlcwotVmVyc2lvbjogMS4yLjM3Ci1MaWJzOiAtTCR7bGliZGlyfSAtbHBuZzEyIC1segotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuMzJzdW51IGIvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS4zMnN1bnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNDNkNWEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS4zMnN1bnUKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIFNvbGFyaXMgMi54IHdpdGggY2MKLSMgQ29udHJpYnV0ZWQgYnkgV2lsbGlhbSBMLiBTZWJvaywgYmFzZWQgb24gbWFrZWZpbGUubGludXgKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTggR3JlZyBSb2Vsb2ZzCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FPWxpYnBuZzEyCi1QTkdNQUogPSAwCi1QTkdNSU4gPSAxLjIuMzcKLVBOR1ZFUiA9ICQoUE5HTUFKKS4kKFBOR01JTikKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1ZFUj0kKExJQk5BTUUpLnNvLiQoUE5HVkVSKQotT0xEU089bGlicG5nLnNvCi1PTERTT01BSj1saWJwbmcuc28uMwotT0xEU09WRVI9bGlicG5nLnNvLjMuJChQTkdNSU4pCi0KLSMgVXRpbGl0aWVzOgotQ0M9Y2MKLUFSX1JDPWFyIHJjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtZiAtcwotUkFOTElCPWVjaG8KLVJNX0Y9L2Jpbi9ybSAtZgotCi1TVU5fQ0NfRkxBR1M9LWZhc3QgLXh0YXJnZXQ9dWx0cmEKLVNVTl9MRF9GTEFHUz0tZmFzdCAteHRhcmdldD11bHRyYQotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxMi5zbyBhbmQgbGlicG5nMTIvcG5nLmgKLXByZWZpeD0vYQotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotIyBDaGFuZ2luZyB0aGVzZSB0byAuLi96bGliIHBvc2VzIGEgc2VjdXJpdHkgcmlzay4gIElmIHlvdSB3YW50Ci0jIHRvIGhhdmUgemxpYiBpbiBhbiBhZGphY2VudCBkaXJlY3RvcnksIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCBpbnN0ZWFkIG9mICIuLiIuCi0jWkxJQkxJQj0uLi96bGliCi0jWkxJQklOQz0uLi96bGliCi0KLVpMSUJMSUI9L3Vzci9saWIKLVpMSUJJTkM9L3Vzci9pbmNsdWRlCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotQ0ZMQUdTPS1JJChaTElCSU5DKSAkKFNVTl9DQ19GTEFHUykgXAotCSMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotTERGTEFHUz0kKFNVTl9MRF9GTEFHUykgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSBsaWJwbmcuYSAtbHogLWxtCi0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpIC1LUElDIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxMiEtbHBuZzEyXCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIGxpYmRpcj1cIiQoTElCUEFUSClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIFJfb3B0cz1cIi1SJChMSUJQQVRIKVwiOyBcCi0JZWNobyBjY29wdHM9XCIteHRhcmdldD11bHRyYVwiOyBcCi0JZWNobyBsZG9wdHM9XCIteHRhcmdldD11bHRyYVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxMiAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKExJQlNPVkVSKQotCSQoTE5fU0YpICQoTElCU09WRVIpICQoTElCU09NQUopCi0KLSQoTElCU09WRVIpOiAkKE9CSlNETEwpCi0JQGNhc2UgImB0eXBlIGxkYCIgaW4gKnVjYiopIFwKLQllY2hvOyBcCi0JZWNobyAnIyMgV0FSTklORzonOyBcCi0JZWNobyAnIyMgVGhlIGNvbW1hbmRzICJDQyIgYW5kICJMRCIgbXVzdCBOT1QgcmVmZXIgdG8gL3Vzci91Y2IvY2MnOyBcCi0JZWNobyAnIyMgYW5kIC91c3IvdWNiL2xkLiAgSWYgdGhleSBkbywgeW91IG5lZWQgdG8gYWRqdXN0IHlvdXIgUEFUSCc7IFwKLQllY2hvICcjIyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwdXQgL3Vzci9jY3MvYmluIGFoZWFkIG9mIC91c3IvdWNiLic7IFwKLQllY2hvICcjIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTERfTElCUkFSWV9QQVRIIHNob3VsZCBub3QgYmUgc2V0JzsgXAotCWVjaG8gJyMjIGF0IGFsbC4gIElmIGl0IGlzLCB0aGluZ3MgYXJlIGxpa2VseSB0byBicmVhayBiZWNhdXNlIG9mJzsgXAotCWVjaG8gJyMjIHRoZSBsaWJ1Y2IgZGVwZW5kZW5jeSB0aGF0IGlzIGNyZWF0ZWQuJzsgXAotCWVjaG87IFwKLQk7OyBcCi0JZXNhYwotCSQoTEQpIC1HIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLWggJChMSUJTT01BSikgXAotCSAtbyAkKExJQlNPVkVSKSAkKE9CSlNETEwpCi0KLSQoT0xEU09WRVIpOiAkKE9CSlNETEwpCi0JJChMRCkgLUcgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtaCAkKE9MRFNPTUFKKSBcCi0JIC1vICQoT0xEU09WRVIpICAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT1ZFUikgbGlicG5nLnBjIFwKLQkkKE9MRFNPVkVSKQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1ZFUikqICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09NQUopLiQoUE5HVkVSKSoKLQljcCAkKExJQlNPVkVSKSAkKERMKQotCWNwICQoT0xEU09WRVIpICQoREwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09WRVIpCi0JY2htb2QgNzU1ICQoREwpLyQoT0xEU09WRVIpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChPTERTT1ZFUikgJChPTERTT01BSik7IFwKLQkkKExOX1NGKSAkKE9MRFNPTUFKKSAkKE9MRFNPKTsgXAotCSQoTE5fU0YpICQoTElCU09WRVIpICQoTElCU09NQUopOyBcCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgJChTVU5fQ0NfRkxBR1MpIC1JJChESSkgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtbyBwbmd0ZXN0ZCAtTCQoREwpIC1SJChETCkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYCBcCi0JICAgJChTVU5fTERfRkxBR1MpIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCi0JJChDQykgJChTVU5fQ0NfRkxBR1MpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYCBcCi0JICAgJChTVU5fTERfRkxBR1MpIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBcCi0JbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogXAotCSQoT0xEU09WRVIpIFwKLQlsaWJwbmcucGMKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS42NHN1bnUgYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLjY0c3VudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3NzJiNC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLjY0c3VudQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gU29sYXJpcyAyLnggd2l0aCBjYwotIyBDb250cmlidXRlZCBieSBXaWxsaWFtIEwuIFNlYm9rLCBiYXNlZCBvbiBtYWtlZmlsZS5saW51eAotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5OCBHcmVnIFJvZWxvZnMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUU9bGlicG5nMTIKLVBOR01BSiA9IDAKLVBOR01JTiA9IDEuMi4zNwotUE5HVkVSID0gJChQTkdNQUopLiQoUE5HTUlOKQotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPVkVSPSQoTElCTkFNRSkuc28uJChQTkdWRVIpCi1PTERTTz1saWJwbmcuc28KLU9MRFNPTUFKPWxpYnBuZy5zby4zCi1PTERTT1ZFUj1saWJwbmcuc28uMy4kKFBOR01JTikKLQotIyBVdGlsaXRpZXM6Ci1DQz1jYwotQVJfUkM9YXIgcmMKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1mIC1zCi1SQU5MSUI9ZWNobwotUk1fRj0vYmluL3JtIC1mCi0KLVNVTl9DQ19GTEFHUz0tZmFzdCAteHRhcmdldD11bHRyYSAteGFyY2g9djkKLVNVTl9MRF9GTEFHUz0tZmFzdCAteHRhcmdldD11bHRyYSAteGFyY2g9djkKLQotIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSwgbGlicG5nMTIuc28gYW5kIGxpYnBuZzEyL3BuZy5oCi1wcmVmaXg9L2EKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSMgQ2hhbmdpbmcgdGhlc2UgdG8gLi4vemxpYiBwb3NlcyBhIHNlY3VyaXR5IHJpc2suICBJZiB5b3Ugd2FudAotIyB0byBoYXZlIHpsaWIgaW4gYW4gYWRqYWNlbnQgZGlyZWN0b3J5LCBzcGVjaWZ5IHRoZSBmdWxsIHBhdGggaW5zdGVhZCBvZiAiLi4iLgotI1pMSUJMSUI9Li4vemxpYgotI1pMSUJJTkM9Li4vemxpYgotCi1aTElCTElCPS91c3IvbGliCi1aTElCSU5DPS91c3IvaW5jbHVkZQotCi1XQVJOTU9SRT0tV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1Xc2hhZG93IFwKLQktV21pc3NpbmctZGVjbGFyYXRpb25zIC1XdHJhZGl0aW9uYWwgLVdjYXN0LWFsaWduIFwKLQktV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzICMtV2NvbnZlcnNpb24KLUNGTEFHUz0tSSQoWkxJQklOQykgJChTVU5fQ0NfRkxBR1MpIFwKLQkjICQoV0FSTk1PUkUpIC1nIC1EUE5HX0RFQlVHPTUKLUxERkxBR1M9LUwuIC1SLiAkKFNVTl9MRF9GTEFHUykgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtbHBuZzEyIC1seiAtbG0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1PQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vIC5waWMubwotCi0uYy5waWMubzoKLQkkKENDKSAtYyAkKENGTEFHUykgLUtQSUMgLW8gJEAgJCouYwotCi1hbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzEyIS1scG5nMTJcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gbGliZGlyPVwiJChMSUJQQVRIKVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gUl9vcHRzPVwiLVIkKExJQlBBVEgpXCI7IFwKLQllY2hvIGNjb3B0cz1cIi14dGFyZ2V0PXVsdHJhIC14YXJjaD12OVwiOyBcCi0JZWNobyBsZG9wdHM9XCIteHRhcmdldD11bHRyYSAteGFyY2g9djlcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTIgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChMSUJTT1ZFUikKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKQotCi0kKExJQlNPVkVSKTogJChPQkpTRExMKQotCUBjYXNlICJgdHlwZSBsZGAiIGluICp1Y2IqKSBcCi0JZWNobzsgXAotCWVjaG8gJyMjIFdBUk5JTkc6JzsgXAotCWVjaG8gJyMjIFRoZSBjb21tYW5kcyAiQ0MiIGFuZCAiTEQiIG11c3QgTk9UIHJlZmVyIHRvIC91c3IvdWNiL2NjJzsgXAotCWVjaG8gJyMjIGFuZCAvdXNyL3VjYi9sZC4gIElmIHRoZXkgZG8sIHlvdSBuZWVkIHRvIGFkanVzdCB5b3VyIFBBVEgnOyBcCi0JZWNobyAnIyMgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcHV0IC91c3IvY2NzL2JpbiBhaGVhZCBvZiAvdXNyL3VjYi4nOyBcCi0JZWNobyAnIyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExEX0xJQlJBUllfUEFUSCBzaG91bGQgbm90IGJlIHNldCc7IFwKLQllY2hvICcjIyBhdCBhbGwuICBJZiBpdCBpcywgdGhpbmdzIGFyZSBsaWtlbHkgdG8gYnJlYWsgYmVjYXVzZSBvZic7IFwKLQllY2hvICcjIyB0aGUgbGlidWNiIGRlcGVuZGVuY3kgdGhhdCBpcyBjcmVhdGVkLic7IFwKLQllY2hvOyBcCi0JOzsgXAotCWVzYWMKLQkkKExEKSAtRyAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpIC1oICQoTElCU09NQUopIFwKLQkgLW8gJChMSUJTT1ZFUikgJChPQkpTRExMKQotCi0kKE9MRFNPVkVSKTogJChPQkpTRExMKQotCSQoTEQpIC1HIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLWggJChPTERTT01BSikgXAotCSAtbyAkKE9MRFNPVkVSKSAgJChPQkpTRExMKQotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJTTykKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09WRVIpIGxpYnBuZy5wYyBcCi0JJChPTERTT1ZFUikKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09WRVIpKiAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPTUFKKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPTUFKKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPTUFKKS4kKFBOR1ZFUikqCi0JY3AgJChMSUJTT1ZFUikgJChETCkKLQljcCAkKE9MRFNPVkVSKSAkKERMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPVkVSKQotCWNobW9kIDc1NSAkKERMKS8kKE9MRFNPVkVSKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoT0xEU09WRVIpICQoT0xEU09NQUopOyBcCi0JJChMTl9TRikgJChPTERTT01BSikgJChPTERTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKTsgXAotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpICQoU1VOX0NDX0ZMQUdTKSAtSSQoREkpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLW8gcG5ndGVzdGQgLUwkKERMKSAtUiQoREwpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAotCSAgICQoU1VOX0xEX0ZMQUdTKSAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5LgotCSQoQ0MpICQoU1VOX0NDX0ZMQUdTKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAotCSAgICQoU1VOX0xEX0ZMQUdTKSAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgXAotCWxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIFwKLQkkKE9MRFNPVkVSKSBcCi0JbGlicG5nLnBjCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYWNvcm4gYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFjb3JuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGU1NzdiLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYWNvcm4KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jIFByb2plY3Q6ICAgbGlicG5nCi0KLQotIyBUb29sZmxhZ3M6Ci1DQ2ZsYWdzID0gLWMgLWRlcGVuZCAhRGVwZW5kIC1JQzosWmxpYjogLWcgLXRocm93YmFjayAgLURSSVNDT1MgIC1mbmFoCi1DKytmbGFncyA9IC1jIC1kZXBlbmQgIURlcGVuZCAtSUM6IC10aHJvd2JhY2sKLUxpbmtmbGFncyA9IC1haWYgLWMrKyAtbyAkQAotT2JqQXNtZmxhZ3MgPSAtdGhyb3diYWNrIC1Ob0NhY2hlIC1kZXBlbmQgIURlcGVuZAotQ01IR2ZsYWdzID0KLUxpYkZpbGVmbGFncyA9IC1jIC1sIC1vICRACi1TcXVlZXplZmxhZ3MgPSAtbyAkQAotCi0jIEZpbmFsIHRhcmdldHM6Ci1ALmxpYnBuZy1saWI6ICAgQC5vLnBuZyBALm8ucG5nZXJyb3IgQC5vLnBuZ3JpbyBALm8ucG5nd2lvIEAuby5wbmdtZW0gXAotCUAuby5wbmdwcmVhZCBALm8ucG5nc2V0IEAuby5wbmdnZXQgQC5vLnBuZ3JlYWQgQC5vLnBuZ3J0cmFuIFwKLQlALm8ucG5ncnV0aWwgQC5vLnBuZ3RyYW5zIEAuby5wbmd3cml0ZSBALm8ucG5nd3RyYW4gQC5vLnBuZ3d1dGlsCi0JTGliRmlsZSAkKExpYkZpbGVmbGFncykgQC5vLnBuZyBALm8ucG5nZXJyb3IgQC5vLnBuZ3JpbyBALm8ucG5ncnRyYW4gXAotCUAuby5wbmdtZW0gQC5vLnBuZ3ByZWFkIEAuby5wbmdzZXQgQC5vLnBuZ2dldCBALm8ucG5ncmVhZCBALm8ucG5nd2lvIFwKLQlALm8ucG5ncnV0aWwgQC5vLnBuZ3RyYW5zICBALm8ucG5nd3JpdGUgQC5vLnBuZ3d0cmFuIEAuby5wbmd3dXRpbAotQC5tbS1saWJwbmctbGliOiAgIEAubW0ucG5nIEAubW0ucG5nZXJyb3IgQC5tbS5wbmdyaW8gQC5tbS5wbmd3aW8gQC5tbS5wbmdtZW0gXAotCUAubW0ucG5ncHJlYWQgQC5tbS5wbmdzZXQgQC5tbS5wbmdnZXQgQC5tbS5wbmdyZWFkIEAubW0ucG5ncnRyYW4gXAotCUAubW0ucG5ncnV0aWwgQC5tbS5wbmd0cmFucyBALm1tLnBuZ3dyaXRlIEAubW0ucG5nd3RyYW4gQC5tbS5wbmd3dXRpbAotCUxpYkZpbGUgJChMaWJGaWxlZmxhZ3MpIEAubW0ucG5nIEAubW0ucG5nZXJyb3IgQC5tbS5wbmdyaW8gXAotCUAubW0ucG5nd2lvIEAubW0ucG5nbWVtIEAubW0ucG5ncHJlYWQgQC5tbS5wbmdzZXQgQC5tbS5wbmdnZXQgXAotCUAubW0ucG5ncmVhZCBALm1tLnBuZ3J0cmFuIEAubW0ucG5ncnV0aWwgQC5tbS5wbmd0cmFucyBALm1tLnBuZ3dyaXRlIFwKLQlALm1tLnBuZ3d0cmFuIEAubW0ucG5nd3V0aWwKLQotCi0jIFVzZXItZWRpdGFibGUgZGVwZW5kZW5jaWVzOgotIyAoQykgQ29weXJpZ2h0IDE5OTcgVG9tIFRhbm5lcgotVGVzdDogQC5wbmd0ZXN0Ci0JPFByZWZpeCREaXI+LnBuZ3Rlc3QKLQlAcmVtb3ZlIDxQcmVmaXgkRGlyPi5wbmd0ZXN0Ci0KLSNJdCB3b3VsZCBiZSBuaWNlIGlmIHlvdSBjb3VsZCBzdG9wICJtYWtlIiBsaXN0aW5nIGZyb20gaGVyZSBvbiEKLUAucG5ndGVzdDogICBALm8ucG5ndGVzdCBALmxpYnBuZy1saWIgQzpvLlN0dWJzIFpsaWI6emxpYl9saWIKLQlMaW5rICQoTGlua2ZsYWdzKSBALm8ucG5ndGVzdCBALmxpYnBuZy1saWIgQzpvLlN0dWJzIFpsaWI6emxpYl9saWIKLQotLlNVRkZJWEVTOiAubyAubW0gLmMKLQotLmMubW06Ci0JTWVtQ2hlY2suQ0MgY2MgJChjY2ZsYWdzKSAtbyAkQCBMaWJQbmc6JDwKLS5jLm86Ci0JY2MgJChjY2ZsYWdzKSAtbyAkQCAkPAotCi0KLSMgU3RhdGljIGRlcGVuZGVuY2llczoKLQotCi0jIER5bmFtaWMgZGVwZW5kZW5jaWVzOgpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5haXggYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFpeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjNGRhYS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFpeAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgdXNpbmcgZ2NjIChnZW5lcmljLCBzdGF0aWMgbGlicmFyeSkKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LTIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMjAwMCBDb3NtaW4gVHJ1dGEKLSMgQ29weXJpZ2h0IChDKSAyMDAwIE1hcmMgTy4gR2xvb3IgKEFJWCBzdXBwb3J0IGFkZGVkLCBmcm9tIG1ha2VmaWxlLmdjYykKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyBMb2NhdGlvbiBvZiB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzCi1aTElCSU5DID0gLi4vemxpYgotWkxJQkxJQiA9IC4uL3psaWIKLQotIyBDb21waWxlciwgbGlua2VyLCBsaWIgYW5kIG90aGVyIHRvb2xzCi1DQyA9IGdjYwotTEQgPSAkKENDKQotQVJfUkMgPSBhciByY3MKLU1LRElSX1AgPSBta2RpciAtcAotUkFOTElCID0gcmFubGliCi1STV9GID0gcm0gLWYKLUxOX1NGID0gbG4gLWYgLXMKLQotTElCTkFNRT1saWJwbmcxMgotUE5HTUFKID0gMAotUE5HTUlOID0gMS4yLjM3Ci1QTkdWRVIgPSAkKFBOR01BSikuJChQTkdNSU4pCi0KLXByZWZpeD0vdXNyL2xvY2FsCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQocHJlZml4KS9saWIKLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi0KLUNERUJVRyA9IC1nIC1EUE5HX0RFQlVHPTUKLUxEREVCVUcgPQotQ1JFTEVBU0UgPSAtTzIKLUxEUkVMRUFTRSA9IC1zCi1XQVJOTU9SRT0tVyAtV2FsbAotQ0ZMQUdTID0gLUkkKFpMSUJJTkMpICQoV0FSTk1PUkUpICQoQ1JFTEVBU0UpCi1MREZMQUdTID0gLUwuIC1MJChaTElCTElCKSAtbHBuZzEyIC1seiAtbG0gJChMRFJFTEVBU0UpCi0KLSMgRmlsZSBleHRlbnNpb25zCi1PPS5vCi1BPS5hCi1FPQotCi0jIFZhcmlhYmxlcwotT0JKUyA9ICBwbmckKE8pIHBuZ2Vycm9yJChPKSBwbmdnZXQkKE8pIHBuZ21lbSQoTykgcG5ncHJlYWQkKE8pIFwKLQlwbmdyZWFkJChPKSBwbmdyaW8kKE8pIHBuZ3J0cmFuJChPKSBwbmdydXRpbCQoTykgcG5nc2V0JChPKSBcCi0JcG5ndHJhbnMkKE8pIHBuZ3dpbyQoTykgcG5nd3JpdGUkKE8pIHBuZ3d0cmFuJChPKSBwbmd3dXRpbCQoTykKLQotIyBUYXJnZXRzCi1hbGw6ICQoTElCTkFNRSkkKEEpIHBuZ3Rlc3QkKEUpCi0KLSQoTElCTkFNRSkkKEEpOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi10ZXN0OiBwbmd0ZXN0JChFKQotCS4vcG5ndGVzdCQoRSkKLQotcG5ndGVzdCQoRSk6IHBuZ3Rlc3QkKE8pICQoTElCTkFNRSkkKEEpCi0JJChMRCkgLW8gJEAgcG5ndGVzdCQoTykgJChMREZMQUdTKQotCi1pbnN0YWxsOiAkKExJQk5BTUUpJChBKQotCS1AaWYgWyAhIC1kICQoREkpICBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSAgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERJKS8kKExJQk5BTUUpL3BuZy5oCi0JLUAkKFJNX0YpICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oCi0JLUAkKFJNX0YpICQoREkpL3BuZ2NvbmYuaAotCWNwIHBuZy5oIHBuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggXAotCSQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpIC1yICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCS1AJChSTV9GKSAkKERMKS8kKExJQk5BTUUpJChBKQotCS1AJChSTV9GKSAkKERMKS9saWJwbmckKEEpCi0JY3AgJChMSUJOQU1FKSQoQSkgJChETCkvJChMSUJOQU1FKSQoQSkKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKSQoQSkKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkkKEEpIGxpYnBuZyQoQSkpCi0JKGNkICQoREkpOyAkKExOX1NGKSBsaWJwbmcvKiAuOykKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gJChMSUJOQU1FKSQoQSkgcG5ndGVzdCBwbmdvdXQucG5nCi0KLXBuZyQoTyk6ICAgICAgcG5nLmggcG5nY29uZi5oCi1wbmdlcnJvciQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotcG5nZ2V0JChPKTogICBwbmcuaCBwbmdjb25mLmgKLXBuZ21lbSQoTyk6ICAgcG5nLmggcG5nY29uZi5oCi1wbmdwcmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmVhZCQoTyk6ICBwbmcuaCBwbmdjb25mLmgKLXBuZ3JpbyQoTyk6ICAgcG5nLmggcG5nY29uZi5oCi1wbmdydHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3NldCQoTyk6ICAgcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucyQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotcG5nd2lvJChPKTogICBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlJChPKTogcG5nLmggcG5nY29uZi5oCi1wbmd3dHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3V0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQotcG5ndGVzdCQoTyk6ICBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYW1pZ2EgYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmFtaWdhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWNiNDI0Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYW1pZ2EKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIENvbW1vZG9yZSBBbWlnYSBNYWtlZmlsZQotIyBtYWtlZmlsZSBmb3IgbGlicG5nIGFuZCBTQVMgQyBWNi41eCBjb21waWxlcgotIyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBXb2xmIEZhdXN0Ci0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotIwotIyBOb3RlOiBVc2UgI2RlZmluZSBQTkdfUkVBRF9CSUdfRU5ESUFOX1NVUFBPUlRFRCBpbiBwbmdjb25mLmgKLSMKLSMgTG9jYXRpb24vcGF0aCBvZiB6bGliIGluY2x1ZGUgZmlsZXMKLVpMSUI9L3psaWIKLSNjb21waWxlcgotQ0M9c2MKLSNjb21waWxlciBmbGFncwotIyBXQVJOSU5HOiBhIGJ1ZyBpbiBWNi41MSBjYXVzZXMgYmFkIGNvZGUgd2l0aCBPUFRHTwotIyAgICAgICAgICBTbyB1c2UgVjYuNTUgb3Igc2V0IE5PT1BUR08hISEhISEhISEKLUNGTEFHUz0gTk9TVEtDSEsgUEFSTVM9UkVHIE9QVElNSVpFIE9QVEdPIE9QVFBFRVAgT1BUSU5MT0NBTCBPUFRJTkxcCi0JT1BUTE9PUCBPUFRSREVQPTQgT1BUREVQPTQgT1BUQ09NUD00IElOQ0xVREVESVI9JChaTElCKSBcCi0JREVGSU5FPVBOR19JTlRFUk5BTAotI2xpbmtlciBmbGFncwotTERGTEFHUz0gU0QgTkQgQkFUQ0gKLSNsaW5rIGxpYnMKLUxETElCUz0gbGlicG5nLmxpYiBsaWJnei5saWIgTElCOnNjbS5saWIgTElCOnNjLmxpYiBMaWI6YW1pZ2EubGliCi0jIGxpbmtlcgotTE49IHNsaW5rCi0jIGZpbGUgZGVsZXRpb24gY29tbWFuZAotUk09IGRlbGV0ZSBxdWlldAotIyBsaWJyYXJ5ICgubGliKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKLUFSPSBvbWwKLSMgbWFrZSBkaXJlY3RvcnkgY29tbWFuZAotTUtESVI9IG1ha2VkaXIKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1hbGw6IGxpYnBuZy5saWIgcG5ndGVzdAotCi1saWJwbmcubGliOiAkKE9CSlMpCi0tJChSTSkgbGlicG5nLmxpYgotJChBUikgbGlicG5nLmxpYiByICQoT0JKUykKLQotcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5saWIKLSQoTE4pIDxXSVRIIDwKLSQoTERGTEFHUykKLVRPIHBuZ3Rlc3QKLUZST00gTElCOmMubyBwbmd0ZXN0Lm8KLUxJQiAkKExETElCUykKLTwKLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5hdGFyaSBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYXRhcmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NjZkNWQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5hdGFyaQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDIgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0jIG1vZGlmaWVkIGZvciBMQzU2L0FUQVJJIGFzc3VtZXMgbGliei5saWIgaXMgaW4gc2FtZSBkaXIgYW5kIHVzZXMgZGVmYXVsdAotIyBydWxlcyBmb3IgbGlicmFyeSBtYW5hZ2VtZW50Ci0jCi1DRkxBR1M9LUkuLlx6bGliIC1PCi1MQlIgPSBwbmcubGliCi1MREZMQUdTPS1scG5nIC1seiAtbG0KLQotIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSBhbmQgcG5nLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQocHJlZml4KS9saWIKLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotT0JKUyA9ICQoTEJSKShwbmcubykgJChMQlIpKHBuZ3NldC5vKSAkKExCUikocG5nZ2V0Lm8pICQoTEJSKShwbmdydXRpbC5vKVwKLQkkKExCUikocG5ndHJhbnMubykgJChMQlIpKHBuZ3d1dGlsLm8pXAotCSQoTEJSKShwbmdyZWFkLm8pICQoTEJSKShwbmdlcnJvci5vKSAkKExCUikocG5nd3JpdGUubylcCi0JJChMQlIpKHBuZ3J0cmFuLm8pICQoTEJSKShwbmd3dHJhbi5vKVwKLQkkKExCUikocG5nbWVtLm8pICQoTEJSKShwbmdyaW8ubykgJChMQlIpKHBuZ3dpby5vKSAkKExCUikocG5ncHJlYWQubykKLQotYWxsOiAkKExCUikgcG5ndGVzdC50dHAKLQotJChMQlIpOiAkKE9CSlMpCi0KLXBuZ3Rlc3QudHRwOiBwbmd0ZXN0Lm8gJChMQlIpCi0JJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLW8kQCBwbmd0ZXN0Lm8KLQotaW5zdGFsbDogbGlicG5nLmEKLQktQG1rZGlyICQoREVTVERJUikkKElOQ1BBVEgpCi0JLUBta2RpciAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQktQG1rZGlyICQoREVTVERJUikkKExJQlBBVEgpCi0JLUBybSAtZiAkKERFU1RESVIpJChJTkNQQVRIKS9wbmcuaAotCS1Acm0gLWYgJChERVNURElSKSQoSU5DUEFUSCkvcG5nY29uZi5oCi0JY3AgcG5nLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JY3AgcG5nY29uZi5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nLmgKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZ2NvbmYuaAotCShjZCAkKERFU1RESVIpJChJTkNQQVRIKTsgbG4gLWYgLXMgJChMSUJOQU1FKSBsaWJwbmc7IFwKLQlsbiAtZiAtcyAkKExJQk5BTUUpLyogLikKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYmMzMiBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYmMzMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5NjIzMS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmJjMzIKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgbGlicG5nCi0jIDMyLWJpdCBCb3JsYW5kIEMrKyAoTm90ZTogQWxsIG1vZHVsZXMgYXJlIGNvbXBpbGVkIGluIEMgbW9kZSkKLSMgVG8gYnVpbGQgdGhlIGxpYnJhcnksIGRvOgotIyAgICAgICAibWFrZSAtZm1ha2VmaWxlLmJjMzIiCi0jCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tIDMyLWJpdCBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIyMgQWJzb2x1dGVseSBuZWNlc3NhcnkgZm9yIHRoaXMgbWFrZWZpbGUgdG8gd29yawotLkFVVE9ERVBFTkQKLQotIyMgV2hlcmUgemxpYi5oLCB6Y29uZi5oIGFuZCB6bGliLmxpYiBhcmUKLVpMSUJfRElSPS4uXHpsaWIKLQotIyMgQ29tcGlsZXIsIGxpbmtlciBhbmQgbGliIHN0dWZmCi1DQz1iY2MzMgotTEQ9YmNjMzIKLUxJQj10bGliCi0KLSMgLTMgPSAzODYsIC00ID0gNDg2LCAtNSA9IFBlbnRpdW0gZXRjLgotIWlmbmRlZiBUQVJHRVRfQ1BVCi0jVEFSR0VUX0NQVT0tNgotIWVuZGlmCi0KLSMgVXNlIHRoaXMgaWYgeW91IGRvbid0IHdhbnQgQm9ybGFuZCdzIGZhbmN5IGV4Y2VwdGlvbiBoYW5kbGluZwotIyAoQ2F1dGlvbjogZG9lc24ndCB3b3JrIHdpdGggQ0J1aWxkZXJYKQotI05PRUhMSUI9bm9laDMyLmxpYgotCi0haWZkZWYgREVCVUcKLUNERUJVRz0tdgotTERFQlVHPS12Ci0hZWxzZQotQ0RFQlVHPQotTERFQlVHPQotIWVuZGlmCi0KLSMgU1RBQ0tPRkxPVz0xCi0haWZkZWYgU1RBQ0tPRkxPVwotQ0RFQlVHPSQoQ0RFQlVHKSAtTgotTERFQlVHPSQoTERFQlVHKSAtTgotIWVuZGlmCi0KLSMgLU8yIG9wdGltaXplIGZvciBzcGVlZAotIyAtZCAgbWVyZ2UgZHVwbGljYXRlIHN0cmluZ3MKLSMgLWstIHR1cm4gb2ZmIHN0YW5kYXJkIHN0YWNrIGZyYW1lCi0jIC13ICBkaXNwbGF5IGFsbCB3YXJuaW5ncwotQ0ZMQUdTPS1JJChaTElCX0RJUikgLU8yIC1kIC1rLSAtdyAkKFRBUkdFVF9DUFUpICQoQ0RFQlVHKQotCi0jIC1NICBnZW5lcmF0ZSBtYXAgZmlsZQotTERGTEFHUz0tTCQoWkxJQl9ESVIpIC1NICQoTERFQlVHKQotCi0jIyBWYXJpYWJsZXMKLU9CSlMgPSBcCi0JcG5nLm9iaiBcCi0JcG5nZXJyb3Iub2JqIFwKLQlwbmdnZXQub2JqIFwKLQlwbmdtZW0ub2JqIFwKLQlwbmdwcmVhZC5vYmogXAotCXBuZ3JlYWQub2JqIFwKLQlwbmdyaW8ub2JqIFwKLQlwbmdydHJhbi5vYmogXAotCXBuZ3J1dGlsLm9iaiBcCi0JcG5nc2V0Lm9iaiBcCi0JcG5ndHJhbnMub2JqIFwKLQlwbmd3aW8ub2JqIFwKLQlwbmd3cml0ZS5vYmogXAotCXBuZ3d0cmFuLm9iaiBcCi0JcG5nd3V0aWwub2JqCi0KLUxJQk9CSlMgPSBcCi0JK3BuZy5vYmogXAotCStwbmdlcnJvci5vYmogXAotCStwbmdnZXQub2JqIFwKLQkrcG5nbWVtLm9iaiBcCi0JK3BuZ3ByZWFkLm9iaiBcCi0JK3BuZ3JlYWQub2JqIFwKLQkrcG5ncmlvLm9iaiBcCi0JK3BuZ3J0cmFuLm9iaiBcCi0JK3BuZ3J1dGlsLm9iaiBcCi0JK3BuZ3NldC5vYmogXAotCStwbmd0cmFucy5vYmogXAotCStwbmd3aW8ub2JqIFwKLQkrcG5nd3JpdGUub2JqIFwKLQkrcG5nd3RyYW4ub2JqIFwKLQkrcG5nd3V0aWwub2JqCi0KLUxJQk5BTUU9bGlicG5nLmxpYgotCi0jIyBJbXBsaWNpdCBydWxlcwotIyBCcmFjZXMgbGV0IG1ha2UgImJhdGNoIiBjYWxscyB0byB0aGUgY29tcGlsZXIsCi0jIDIgY2FsbHMgaW5zdGVhZCBvZiAxMjsgc3BhY2UgaXMgaW1wb3J0YW50LgotLmMub2JqOgotCSQoQ0MpICQoQ0ZMQUdTKSAtYyB7JCouYyB9Ci0KLS5jLmV4ZToKLQkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSAkKi5jICQoTElCTkFNRSkgemxpYi5saWIgJChOT0VITElCKQotCi0ub2JqLmV4ZToKLQkkKExEKSAkKExERkxBR1MpICQqLm9iaiAkKExJQk5BTUUpIHpsaWIubGliICQoTk9FSExJQikKLQotIyMgTWFqb3IgdGFyZ2V0cwotYWxsOiBsaWJwbmcgcG5ndGVzdAotCi1saWJwbmc6ICQoTElCTkFNRSkKLQotcG5ndGVzdDogcG5ndGVzdC5leGUKLQotdGVzdDogcG5ndGVzdC5leGUKLQlwbmd0ZXN0Ci0KLSMjIE1pbm9yIFRhcmdldHMKLQotcG5nLm9iajogcG5nLmMgcG5nLmggcG5nY29uZi5oCi1wbmdlcnJvci5vYmo6IHBuZ2Vycm9yLmMgcG5nLmggcG5nY29uZi5oCi1wbmdnZXQub2JqOiBwbmdnZXQuYyBwbmcuaCBwbmdjb25mLmgKLXBuZ21lbS5vYmo6IHBuZ21lbS5jIHBuZy5oIHBuZ2NvbmYuaAotcG5ncHJlYWQub2JqOiBwbmdwcmVhZC5jIHBuZy5oIHBuZ2NvbmYuaAotcG5ncmVhZC5vYmo6IHBuZ3JlYWQuYyBwbmcuaCBwbmdjb25mLmgKLXBuZ3Jpby5vYmo6IHBuZ3Jpby5jIHBuZy5oIHBuZ2NvbmYuaAotcG5ncnRyYW4ub2JqOiBwbmdydHJhbi5jIHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwub2JqOiBwbmdydXRpbC5jIHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0Lm9iajogcG5nc2V0LmMgcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucy5vYmo6IHBuZ3RyYW5zLmMgcG5nLmggcG5nY29uZi5oCi1wbmd3aW8ub2JqOiBwbmd3aW8uYyBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlLm9iajogcG5nd3JpdGUuYyBwbmcuaCBwbmdjb25mLmgKLXBuZ3d0cmFuLm9iajogcG5nd3RyYW4uYyBwbmcuaCBwbmdjb25mLmgKLXBuZ3d1dGlsLm9iajogcG5nd3V0aWwuYyBwbmcuaCBwbmdjb25mLmgKLXBuZ3Rlc3Qub2JqOiBwbmd0ZXN0LmMgcG5nLmggcG5nY29uZi5oCi0KLSQoTElCTkFNRSk6ICQoT0JKUykKLQktZGVsICQoTElCTkFNRSkKLQkkKExJQikgJChMSUJOQU1FKSBAJiZ8Ci0kKExJQk9CSlMpLCBsaWJwbmcKLXwKLQotIyBDbGVhbnVwCi1jbGVhbjoKLQktZGVsICoub2JqCi0JLWRlbCAkKExJQk5BTUUpCi0JLWRlbCBwbmd0ZXN0LmV4ZQotCS1kZWwgKi5sc3QKLQktZGVsICoubWFwCi0JLWRlbCAqLnRkcwotCS1kZWwgcG5nb3V0LnBuZwotCi0jIEVuZCBvZiBtYWtlZmlsZSBmb3IgbGlicG5nCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmJlb3MgYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmJlb3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjg5ZGQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5iZW9zCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBCZU9TIHg4NiBFTEYgd2l0aCBnY2MKLSMgbW9kaWZpZWQgZnJvbSBtYWtlZmlsZS5saW51eCBieSBTYW5kZXIgU3Rva3MKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDA4IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTkgR3JlZyBSb2Vsb2ZzCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FPWxpYnBuZzEyCi1QTkdNQUogPSAwCi1QTkdNSU4gPSAxLjIuMzcKLVBOR1ZFUiA9ICQoUE5HTUFKKS4kKFBOR01JTikKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1ZFUj0kKExJQk5BTUUpLnNvLiQoUE5HVkVSKQotT0xEU089bGlicG5nLnNvCi1PTERTT01BSj1saWJwbmcuc28uMwotT0xEU09WRVI9bGlicG5nLnNvLjMuJChQTkdNSU4pCi0KLSMgVXRpbGl0aWVzOgotQ0M9Z2NjCi1BUl9SQz1hciByYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLXNmCi1SQU5MSUI9cmFubGliCi1STV9GPS9iaW4vcm0gLWYKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi1aTElCTElCPS91c3IvbG9jYWwvbGliCi1aTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotCi1BTElHTj0KLSMgRm9yIGkzODY6Ci0jIEFMSUdOPS1tYWxpZ24tbG9vcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotCi0jIE9uIEJlT1MsIC1PMSBpcyBhY3R1YWxseSBiZXR0ZXIgdGhhbiAtTzMuICBUaGlzIGlzIGEga25vd24gYnVnIGJ1dCBpdCdzCi0jIHN0aWxsIGhlcmUgaW4gUjQuNQotQ0ZMQUdTPS1JJChaTElCSU5DKSAtVyAtV2FsbCAtTzEgLWZ1bnJvbGwtbG9vcHMgXAotCSQoQUxJR04pICMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotIyBMREZMQUdTPS1MLiAtV2wsLXJwYXRoLC4gLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSAtbHBuZyAtbHoKLUxERkxBR1M9LUwuIC1XbCwtc29uYW1lPSQoTElCU09NQUopIC1MJChaTElCTElCKSAtbHoKLQotIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSwgbGlicG5nMTIuc28qLCBhbmQgcG5nLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUykKLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTIhLWxwbmcxMlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxMiAtbHogXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0JY3AgJChMSUJTTykqIC9ib290L2hvbWUvY29uZmlnL2xpYgotCi0kKExJQlNPTUFKKTogJChMSUJTT1ZFUikKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKQotCi0kKExJQlNPVkVSKTogJChPQkpTRExMKQotCSQoQ0MpIC1ub3N0YXJ0IC1XbCwtc29uYW1lLCQoTElCU09NQUopIC1vIFwKLQkkKExJQlNPVkVSKSAkKE9CSlNETEwpICQoTERGTEFHUykKLQotJChPTERTT1ZFUik6ICQoT0JKU0RMTCkKLQkkKENDKSAtbm9zdGFydCAtV2wsLXNvbmFtZSwkKE9MRFNPTUFKKSAtbyBcCi0JJChPTERTT1ZFUikgJChPQkpTRExMKSAkKExERkxBR1MpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1MJChaTElCTElCKSAtTC4gLWx6IC1scG5nMTIgLW8gcG5ndGVzdCBwbmd0ZXN0Lm8KLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPVkVSKSBsaWJwbmcucGMgXAotCSQoT0xEU09WRVIpCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPVkVSKSogJChETCkvJChMSUJTTykKLQktQCQoUk1fRikgJChETCkvJChMSUJTT01BSikKLQktQCQoUk1fRikgJChETCkvJChPTERTTykKLQktQCQoUk1fRikgJChETCkvJChPTERTT01BSikKLQktQCQoUk1fRikgJChETCkvJChPTERTT1ZFUikqCi0JY3AgJChMSUJTT1ZFUikgJChETCkKLQljcCAkKE9MRFNPVkVSKSAkKERMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPVkVSKQotCWNobW9kIDc1NSAkKERMKS8kKE9MRFNPVkVSKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoT0xEU09WRVIpICQoT0xEU09NQUopOyBcCi0JJChMTl9TRikgJChPTERTT01BSikgJChPTERTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKTsgXAotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSAtV2wsLXJwYXRoICQoWkxJQkxJQik6JChETCkgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCSQoQ0MpICQoQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nIGxpYnBuZy1jb25maWcgXAotCSQoTElCU08pICQoTElCU09NQUopKiBwbmd0ZXN0aSBcCi0JJChPTERTT1ZFUikgXAotCWxpYnBuZy5wYwotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3Jpby5vIHBuZ3Jpby5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3NldC5vIHBuZ3NldC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmJvciBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYm9yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYThlZjAwLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuYm9yCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGxpYnBuZwotIyAxNi1iaXQgQm9ybGFuZCBDKysgKE5vdGU6IEFsbCBtb2R1bGVzIGFyZSBjb21waWxlZCBpbiBDIG1vZGUpCi0jIFRvIGJ1aWxkIHRoZSBsaWJyYXJ5LCBkbzoKLSMgICAgICAgIm1ha2UgLWZtYWtlZmlsZS5ib3IgLURNT0RFTD1jIgotIyBvcjogICAibWFrZSAtZm1ha2VmaWxlLmJvciAtRE1PREVMPWwiCi0jCi0jIC0tLS0tLS0tLS0tLSBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KLQotIyMjIEFic29sdXRlbHkgbmVjZXNzYXJ5IGZvciB0aGlzIG1ha2VmaWxlIHRvIHdvcmsKLS5BVVRPREVQRU5ECi0KLSMjIFdoZXJlIHpsaWIuaCwgemNvbmYuaCBhbmQgemxpYl9NT0RFTC5saWIgYXJlCi1aTElCX0RJUj0uLlx6bGliCi0KLSMjIENvbXBpbGVyLCBsaW5rZXIgYW5kIGxpYiBzdHVmZgotQ0M9YmNjCi1MRD1iY2MKLUxJQj10bGliCi0KLSFpZm5kZWYgTU9ERUwKLU1PREVMPWwKLSFlbmRpZgotCi1NT0RFTF9BUkc9LW0kKE1PREVMKQotCi0jVEFSR0VUX0NQVT0zCi0jIDIgPSAyODYsIDMgPSAzODYsIGV0Yy4KLSFpZm5kZWYgVEFSR0VUX0NQVQotVEFSR0VUX0NQVT0yCi0hZW5kaWYKLQotIyBVc2UgdGhpcyBpZiB5b3UgZG9uJ3Qgd2FudCBCb3JsYW5kJ3MgZmFuY3kgZXhjZXB0aW9uIGhhbmRsaW5nCi0jIChmb3IgQm9ybGFuZCBDKysgNC4wIG9yIGxhdGVyKQotI05PRUhMSUI9bm9laCQoTU9ERUwpLmxpYgotCi0haWZkZWYgREVCVUcKLUNERUJVRz0tdgotTERFQlVHPS12Ci0hZWxzZQotQ0RFQlVHPQotTERFQlVHPQotIWVuZGlmCi0KLSMgU1RBQ0tPRkxPVz0xCi0haWZkZWYgU1RBQ0tPRkxPVwotQ0RFQlVHPSQoQ0RFQlVHKSAtTgotTERFQlVHPSQoTERFQlVHKSAtTgotIWVuZGlmCi0KLSMgLVgtIHR1cm4gb24gZGVwZW5kZW5jeSBnZW5lcmF0aW9uIGluIHRoZSBvYmplY3QgZmlsZQotIyAtdyAgc2V0IGFsbCB3YXJuaW5ncyBvbgotIyAtTzIgb3B0aW1pemUgZm9yIHNwZWVkCi0jIC1aICBnbG9iYWwgb3B0aW1pemF0aW9uCi1DRkxBR1M9LU8yIC1aIC1YLSAtdyAtSSQoWkxJQl9ESVIpIC0kKFRBUkdFVF9DUFUpICQoTU9ERUxfQVJHKSAkKENERUJVRykKLQotIyAtTSAgZ2VuZXJhdGUgbWFwIGZpbGUKLUxERkxBR1M9LU0gLUwkKFpMSUJfRElSKSAkKE1PREVMX0FSRykgJChMREVCVUcpCi0KLSMjIFZhcmlhYmxlcwotCi1PQkpTID0gXAotCXBuZy5vYmogXAotCXBuZ2Vycm9yLm9iaiBcCi0JcG5nZ2V0Lm9iaiBcCi0JcG5nbWVtLm9iaiBcCi0JcG5ncHJlYWQub2JqIFwKLQlwbmdyZWFkLm9iaiBcCi0JcG5ncmlvLm9iaiBcCi0JcG5ncnRyYW4ub2JqIFwKLQlwbmdydXRpbC5vYmogXAotCXBuZ3NldC5vYmogXAotCXBuZ3RyYW5zLm9iaiBcCi0JcG5nd2lvLm9iaiBcCi0JcG5nd3JpdGUub2JqIFwKLQlwbmd3dHJhbi5vYmogXAotCXBuZ3d1dGlsLm9iagotCi1MSUJPQkpTID0gXAotCStwbmcub2JqIFwKLQkrcG5nZXJyb3Iub2JqIFwKLQkrcG5nZ2V0Lm9iaiBcCi0JK3BuZ21lbS5vYmogXAotCStwbmdwcmVhZC5vYmogXAotCStwbmdyZWFkLm9iaiBcCi0JK3BuZ3Jpby5vYmogXAotCStwbmdydHJhbi5vYmogXAotCStwbmdydXRpbC5vYmogXAotCStwbmdzZXQub2JqIFwKLQkrcG5ndHJhbnMub2JqIFwKLQkrcG5nd2lvLm9iaiBcCi0JK3BuZ3dyaXRlLm9iaiBcCi0JK3BuZ3d0cmFuLm9iaiBcCi0JK3BuZ3d1dGlsLm9iagotCi1MSUJOQU1FPWxpYnBuZyQoTU9ERUwpLmxpYgotCi0jIyBJbXBsaWNpdCBydWxlcwotCi0jIEJyYWNlcyBsZXQgbWFrZSAiYmF0Y2giIGNhbGxzIHRvIHRoZSBjb21waWxlciwKLSMgMiBjYWxscyBpbnN0ZWFkIG9mIDEyOyBzcGFjZSBpcyBpbXBvcnRhbnQuCi0uYy5vYmo6Ci0JJChDQykgJChDRkxBR1MpIC1jIHskKi5jIH0KLQotLmMuZXhlOgotCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpICQqLmMgJChMSUJOQU1FKSB6bGliXyQoTU9ERUwpLmxpYiAkKE5PRUhMSUIpCi0KLSMjIE1ham9yIHRhcmdldHMKLQotYWxsOiBsaWJwbmcgcG5ndGVzdAotCi1saWJwbmc6ICQoTElCTkFNRSkKLQotcG5ndGVzdDogcG5ndGVzdCQoTU9ERUwpLmV4ZQotCi10ZXN0OiBwbmd0ZXN0JChNT0RFTCkuZXhlCi0JcG5ndGVzdCQoTU9ERUwpCi0KLSMjIE1pbm9yIFRhcmdldHMKLQotcG5nLm9iajogcG5nLmMgcG5nLmggcG5nY29uZi5oCi1wbmdlcnJvci5vYmo6IHBuZ2Vycm9yLmMgcG5nLmggcG5nY29uZi5oCi1wbmdnZXQub2JqOiBwbmdnZXQuYyBwbmcuaCBwbmdjb25mLmgKLXBuZ21lbS5vYmo6IHBuZ21lbS5jIHBuZy5oIHBuZ2NvbmYuaAotcG5ncHJlYWQub2JqOiBwbmdwcmVhZC5jIHBuZy5oIHBuZ2NvbmYuaAotcG5ncmVhZC5vYmo6IHBuZ3JlYWQuYyBwbmcuaCBwbmdjb25mLmgKLXBuZ3Jpby5vYmo6IHBuZ3Jpby5jIHBuZy5oIHBuZ2NvbmYuaAotcG5ncnRyYW4ub2JqOiBwbmdydHJhbi5jIHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwub2JqOiBwbmdydXRpbC5jIHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0Lm9iajogcG5nc2V0LmMgcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucy5vYmo6IHBuZ3RyYW5zLmMgcG5nLmggcG5nY29uZi5oCi1wbmd3aW8ub2JqOiBwbmd3aW8uYyBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlLm9iajogcG5nd3JpdGUuYyBwbmcuaCBwbmdjb25mLmgKLXBuZ3d0cmFuLm9iajogcG5nd3RyYW4uYyBwbmcuaCBwbmdjb25mLmgKLXBuZ3d1dGlsLm9iajogcG5nd3V0aWwuYyBwbmcuaCBwbmdjb25mLmgKLQotJChMSUJOQU1FKTogJChPQkpTKQotCS1kZWwgJChMSUJOQU1FKQotCSQoTElCKSAkKExJQk5BTUUpIEAmJnwKLSQoTElCT0JKUyksIGxpYnBuZyQoTU9ERUwpCi18Ci0KLXBuZ3Rlc3QkKE1PREVMKS5vYmo6IHBuZ3Rlc3QuYwotCSQoQ0MpICQoQ0ZMQUdTKSAtb3BuZ3Rlc3QkKE1PREVMKSAtYyBwbmd0ZXN0LmMKLQotcG5ndGVzdCQoTU9ERUwpLmV4ZTogcG5ndGVzdCQoTU9ERUwpLm9iagotCSQoTEQpICQoTERGTEFHUykgcG5ndGVzdCQoTU9ERUwpLm9iaiAkKExJQk5BTUUpIHpsaWJfJChNT0RFTCkubGliICQoTk9FSExJQikKLQotIyBDbGVhbiB1cCBhbnl0aGluZyBlbHNlIHlvdSB3YW50Ci1jbGVhbjoKLQktZGVsICoub2JqCi0JLWRlbCAqLmV4ZQotCS1kZWwgKi5saWIKLQktZGVsICoubHN0Ci0JLWRlbCAqLm1hcAotCi0jIEVuZCBvZiBtYWtlZmlsZSBmb3IgbGlicG5nCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmN5Z3dpbiBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuY3lnd2luCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmMwNmQwLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuY3lnd2luCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGN5Z3dpbiBvbiB4ODYKLSMgICBCdWlsZHMgYm90aCBkbGwgKHdpdGggaW1wb3J0IGxpYikgYW5kIHN0YXRpYyBsaWIgdmVyc2lvbnMKLSMgICBvZiB0aGUgbGlicmFyeSwgYW5kIGJ1aWxkcyB0d28gY29waWVzIG9mIHBuZ3Rlc3Q6IG9uZQotIyAgIHN0YXRpY2FsbHkgbGlua2VkIGFuZCBvbmUgZHluYW1pY2FsbHkgbGlua2VkLgotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYtMjAwOCBTb3JlbiBBbmRlcnNvbiwgQ2hhcmxlcyBXaWxzb24sCi0jICAgIGFuZCBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGJhc2VkIG9uIG1ha2VmaWxlIGZvciBsaW51eC1lbGYgdy9tbXggYnk6Ci0jIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIEdyZWcgUm9lbG9mcwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgVGhpcyBtYWtlZmlsZSBpbnRlbmRzIHRvIHN1cHBvcnQgYnVpbGRpbmcgb3V0c2lkZSB0aGUgc3JjIGRpcmVjdG9yeQotIyBpZiBkZXNpcmVkLiBXaGVuIGludm9raW5nIGl0LCBzcGVjaWZ5IGFuIGFyZ3VtZW50IHRvIFNSQ0RJUiBvbiB0aGUKLSMgY29tbWFuZCBsaW5lIHRoYXQgcG9pbnRzIHRvIHRoZSB0b3Agb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3VyIHNvdXJjZQotIyBpcyBsb2NhdGVkLgotCi1pZmRlZiBTUkNESVIKLVZQQVRIID0gJChTUkNESVIpCi1lbHNlCi1TUkNESVIgPSAuCi1lbmRpZgotCi0jIE92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi0KLURFU1RESVI9Ci0KLUNDPWdjYwotaWZkZWYgTUlOR1cKLU1JTkdXX0NDRkxBR1M9LW1uby1jeWd3aW4gLUkvdXNyL2luY2x1ZGUvbWluZ3cKLU1JTkdXX0xERkxBR1M9LW1uby1jeWd3aW4gLUwvdXNyL2xpYi9taW5ndwotZW5kaWYKLQotIyBXaGVyZSAibWFrZSBpbnN0YWxsIiBwdXRzIGxpYnBuZyouYSwgKnBuZyouZGxsLCBwbmcuaCwgYW5kIHBuZ2NvbmYuaAotaWZuZGVmIHByZWZpeAotcHJlZml4PS91c3IKLSQod2FybmluZyBZb3UgaGF2ZW4ndCBzcGVjaWZpZWQgYSAncHJlZml4PScgbG9jYXRpb24uIERlZmF1bHRpbmcgdG8gIi91c3IiKQotZW5kaWYKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLVpMSUJMSUI9IC91c3IvbGliCi1aTElCSU5DPQotI1pMSUJMSUI9Li4vemxpYgotI1pMSUJJTkM9Li4vemxpYgotCi1BTElHTj0KLSMgZm9yIGkzODY6Ci0jQUxJR049LW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIKLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi0KLSMjIyBpZiB5b3UgZG9uJ3QgbmVlZCB0aHJlYWQgc2FmZXR5LCBidXQgd2FudCB0aGUgYXNtIGFjY2VsCi0jQ0ZMQUdTPSAkKHN0cmlwICQoTUlOR1dfQ0NGTEFHUykgLURQTkdfVEhSRUFEX1VOU0FGRV9PSyBcCi0jCSQoYWRkcHJlZml4IC1JLCQoWkxJQklOQykpIC1XIC1XYWxsIC1PICQoQUxJR04pIC1mdW5yb2xsLWxvb3BzIFwKLSMJLWZvbWl0LWZyYW1lLXBvaW50ZXIpICAjICQoV0FSTk1PUkUpIC1nIC1EUE5HX0RFQlVHPTUKLSMjIyBpZiB5b3UgbmVlZCB0aHJlYWQgc2FmZXR5IGFuZCB3YW50IChtaW5pbWFsKSBhc20gYWNjZWwKLSNDRkxBR1M9ICQoc3RyaXAgJChNSU5HV19DQ0ZMQUdTKSAkKGFkZHByZWZpeCAtSSwkKFpMSUJJTkMpKSBcCi0jCS1XIC1XYWxsIC1PICQoQUxJR04pIC1mdW5yb2xsLWxvb3BzIFwKLSMJLWZvbWl0LWZyYW1lLXBvaW50ZXIpICAjICQoV0FSTk1PUkUpIC1nIC1EUE5HX0RFQlVHPTUKLSMjIyBOb3JtYWwgKG5vbi1hc20pIGNvbXBpbGF0aW9uCi1DRkxBR1M9ICQoc3RyaXAgJChNSU5HV19DQ0ZMQUdTKSAkKGFkZHByZWZpeCAtSSwkKFpMSUJJTkMpKSBcCi0gICAgICAgIC1XIC1XYWxsIC1PMyAkKEFMSUdOKSAtZnVucm9sbC1sb29wcyAtRFBOR19OT19NTVhfQ09ERSBcCi0JLWZvbWl0LWZyYW1lLXBvaW50ZXIpICMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotCi1MSUJOQU1FID0gbGlicG5nMTIKLVBOR01BSiA9IDAKLUNZR0RMTCA9IDEyCi1QTkdNSU4gPSAxLjIuMzcKLVBOR1ZFUiA9ICQoUE5HTUFKKS4kKFBOR01JTikKLQotU0hBUkVETElCPWN5Z3BuZyQoQ1lHRExMKS5kbGwKLVNUQVRMSUI9bGlicG5nLmEKLUlNUExJQj1saWJwbmcuZGxsLmEKLVNIQVJFRERFRj1saWJwbmcuZGVmCi1MSUJTPSQoU0hBUkVETElCKSAkKFNUQVRMSUIpCi1FWEU9LmV4ZQotCi1MREZMQUdTPSQoc3RyaXAgLUwuICQoTUlOR1dfTERGTEFHUykgLWxwbmcgJChhZGRwcmVmaXggLUwsJChaTElCTElCKSkgLWx6KQotTERTRkxBR1M9JChzdHJpcCAtc2hhcmVkIC1MLiAgJChNSU5HV19MREZMQUdTKSAtV2wsLS1leHBvcnQtYWxsKQotTERFWFRSQT0tV2wsLS1vdXQtaW1wbGliPSQoSU1QTElCKSAkKGFkZHByZWZpeCAtTCwkKFpMSUJMSUIpKSAtbHoKLQotTUtESVJfUD0vYmluL21rZGlyIC1wdgotUkFOTElCPXJhbmxpYgotI1JBTkxJQj1lY2hvCi0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi0KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLU1BTjNQQVRIPSQoTUFOUEFUSCkvbWFuMwotTUFONVBBVEg9JChNQU5QQVRIKS9tYW41Ci0KLSMgY29zbWV0aWM6IHNob3J0ZW5lZCBzdHJpbmdzOgotUyA9JChTUkNESVIpCi1EID0kKERFU1RESVIpCi1EQiA9JChEKSQoQklOUEFUSCkKLURJID0kKEQpJChJTkNQQVRIKQotREwgPSQoRCkkKExJQlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogLmMgLm8gLnBpYy5vCi0KLSUubyA6ICUuYwotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtbyAkQCAkPAotJS5waWMubyA6IENGTEFHUyArPSAtRFBOR19CVUlMRF9ETEwKLSUucGljLm8gOiAlLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotYWxsOiBhbGwtc3RhdGljIGFsbC1zaGFyZWQgbGlicG5nLnBjIGxpYnBuZy1jb25maWcgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotIyBNYWtlIHRoaXMgdG8gdmVyaWZ5IHRoYXQgIm1ha2UgWy4uLl0gaW5zdGFsbCIgd2lsbCBkbyB3aGF0IHlvdSB3YW50LgotYnVpbGRzZXR1cC10ZWxsOgotCUBlY2hvICBWUEFUSCBpcyBzZXQgdG86IFwiJChWUEFUSClcIgotCUBlY2hvICBwcmVmaXggaXMgc2V0IHRvOiBcIiQocHJlZml4KVwiCi0JQGVjaG8gLWUgSU5DUEFUSCxMSUJQQVRILCBldGMuIGFyZSBzZXQgdG86J1xuJyBcCi0gJChhZGRwcmVmaXggJChEKSwkKElOQ1BBVEgpJ1xuJyAkKExJQlBBVEgpJ1xuJyAkKEJJTlBBVEgpJ1xuJyBcCi0gICAkKE1BTlBBVEgpJ1xuJyAkKE1BTjNQQVRIKSdcbicgJChNQU41UEFUSCknXG4nKSdcbicKLQotbGlicG5nLnBjOiBzY3JpcHRzL2xpYnBuZy5wYy5pbgotCUBlY2hvIC1lIE1ha2luZyBwa2ctY29uZmlnIGZpbGUgZm9yIHRoaXMgbGlicG5nIGluc3RhbGxhdGlvbi4uJ1xuJyBcCi0gICAgICAgICAgIHVzaW5nIFBSRUZJWD1cIiQocHJlZml4KVwiJ1xuJwotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTIhLWxwbmcxMlwgLWx6ISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOiBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbiBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbgotCUBlY2hvIC1lIE1ha2luZyAkKExJQk5BTUUpIGxpYnBuZy1jb25maWcgZmlsZSBmb3IgdGhpcyBsaWJwbmcgXAotIGluc3RhbGxhdGlvbi4uJ1xuJyB1c2luZyBQUkVGSVg9XCIkKHByZWZpeClcIidcbicKLQkoIGNhdCAkKFMpL3NjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZyQoQ1lHRExMKSAtbHpcIjsgXAotCWNhdCAkKFMpL3NjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi1zdGF0aWM6IGFsbC1zdGF0aWMKLXNoYXJlZDogYWxsLXNoYXJlZAotYWxsLXN0YXRpYzogJChTVEFUTElCKSBwbmd0ZXN0LXN0YXQkKEVYRSkKLWFsbC1zaGFyZWQ6ICQoU0hBUkVETElCKSBwbmd0ZXN0JChFWEUpCi0KLSQoU1RBVExJQik6ICQoT0JKUykKLQlhciByYyAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLSQoU0hBUkVEREVGKTogc2NyaXB0cy9wbmd3MzIuZGVmCi0JY2F0ICQ8IHwgc2VkIC1lICcxe0c7cy9eXCguKlwpXChcblwpL0VYUE9SVFMvO307MiwvXkVYUE9SVFMvZCcgfCBcCi0Jc2VkIC1lICdzL1woW147XSpcKTsvOy8nID4gJEAKLQotJChTSEFSRURMSUIpOiAkKE9CSlNETEwpICQoU0hBUkVEREVGKQotCSQoQ0MpICQoTERTRkxBR1MpIC1vICRAICQoT0JKU0RMTCkgLUwuICQoTERFWFRSQSkKLQotcG5ndGVzdCQoRVhFKTogcG5ndGVzdC5waWMubyAkKFNIQVJFRExJQikKLQkkKENDKSAkKENGTEFHUykgJDwgJChMREZMQUdTKSAtbyAkQAotCi1wbmd0ZXN0LXN0YXQkKEVYRSk6IHBuZ3Rlc3QubyAkKFNUQVRMSUIpCi0JJChDQykgLXN0YXRpYyAkKENGTEFHUykgJDwgJChMREZMQUdTKSAtbyAkQAotCi1wbmd0ZXN0LnBpYy5vOiBwbmd0ZXN0LmMKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQotcG5ndGVzdC5vOiBwbmd0ZXN0LmMgcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0KLXRlc3Q6IHRlc3Qtc3RhdGljIHRlc3Qtc2hhcmVkCi0KLXRlc3Qtc3RhdGljOiBwbmd0ZXN0LXN0YXQkKEVYRSkKLQkuL3BuZ3Rlc3Qtc3RhdCAkKFMpL3BuZ3Rlc3QucG5nCi0KLXRlc3Qtc2hhcmVkOiBwbmd0ZXN0JChFWEUpCi0JLi9wbmd0ZXN0ICQoUykvcG5ndGVzdC5wbmcKLQotaW5zdGFsbC1zdGF0aWM6ICQoU1RBVExJQikgaW5zdGFsbC1oZWFkZXJzIGluc3RhbGwtbWFuCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWluc3RhbGwgLW0gNjQ0ICQoU1RBVExJQikgJChETCkvJChMSUJOQU1FKS5hCi0JLUBybSAtZiAkKERMKS8kKFNUQVRMSUIpCi0JKGNkICQoREwpOyBsbiAtc2YgJChMSUJOQU1FKS5hICQoU1RBVExJQikpCi0KLWluc3RhbGwtc2hhcmVkOiAkKFNIQVJFRExJQikgbGlicG5nLnBjIGxpYnBuZy1jb25maWcgaW5zdGFsbC1oZWFkZXJzIGluc3RhbGwtbWFuCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQC9iaW4vcm0gLWYgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQC9iaW4vcm0gLWYgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWluc3RhbGwgLW0gNjQ0ICQoSU1QTElCKSAkKERMKS8kKExJQk5BTUUpLmRsbC5hCi0JLUBybSAtZiAkKERMKS8kKElNUExJQikKLQkoY2QgJChETCk7IGxuIC1zZiAkKExJQk5BTUUpLmRsbC5hICQoSU1QTElCKSkKLQlpbnN0YWxsIC1zIC1tIDc1NSAkKFNIQVJFRExJQikgJChEQikKLQlpbnN0YWxsIC1tIDY0NCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyBsbiAtc2YgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtaGVhZGVyczoKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQktQHJtIC1mICQoREkpL3BuZy5oCi0JLUBybSAtZiAkKERJKS9wbmdjb25mLmgKLQlpbnN0YWxsIC1tIDY0NCAkKFMpL3BuZy5oICQoUykvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQktQHJtIC1mICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgbG4gLXNmICQoTElCTkFNRSkgbGlicG5nOyBsbiAtc2YgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtbWFuOgotCS1AaWYgWyAhIC1kICQoRCkkKE1BTjNQQVRIKSBdOyB0aGVuICQoTUtESVJfUCkgJChEKSQoTUFOM1BBVEgpOyBmaQotCS1AaWYgWyAhIC1kICQoRCkkKE1BTjVQQVRIKSBdOyB0aGVuICQoTUtESVJfUCkgJChEKSQoTUFONVBBVEgpOyBmaQotCWluc3RhbGwgLW0gNjQ0ICQoUykvbGlicG5ncGYuMyAkKFMpL2xpYnBuZy4zICQoRCkkKE1BTjNQQVRIKQotCWluc3RhbGwgLW0gNjQ0ICQoUykvcG5nLjUgJChEKSQoTUFONVBBVEgpCi0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AL2Jpbi9ybSAtZiAkKERCKS9saWJwbmctY29uZmlnCi0JLUAvYmluL3JtIC1mICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgbG4gLXNmICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLSMgUnVuIHRoaXMgdG8gdmVyaWZ5IHRoYXQgYSBmdXR1cmUgYGNvbmZpZ3VyZScgcnVuIHdpbGwgcGljayB1cCB0aGUgc2V0dGluZ3MKLSMgeW91IHdhbnQuCi10ZXN0LWNvbmZpZy1pbnN0YWxsOiBTSEVMTD0vYmluL2Jhc2gKLXRlc3QtY29uZmlnLWluc3RhbGw6ICQoREIpL2xpYnBuZy1jb25maWcKLQlAZWNobyAtZSBUZXN0aW5nIGxpYnBuZy1jb25maWcgZnVuY3Rpb25zLi4uJ1xuJwotCUAgZm9yIFRZUkEgaW4gTERGTEFHUyBDUFBGTEFHUyBDRkxBR1MgTElCUyBWRVJTSU9OOyBcCi0gICBkbyBcCi0gICAgcHJpbnRmICIoJWQpXHQgJTEwcyA9JXNcbiIgJCQoKCQkZ3l0aXUgKyAxKSkgJCRUWVJBIFwKLSAgICAiJCQoJChEQikvbGlicG5nLWNvbmZpZyBgZWNobyAtLSQkVFlSQSB8dHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XSdgKSI7IFwKLSAgICBneXRpdT0kJCgoICQkZ3l0aXUgKyAxICkpOyBcCi0gICBkb25lCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpICQoQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvbGlicG5nMTItY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS9saWJwbmcxMi1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JJChDQykgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS9saWJwbmcxMi1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0aSQoRVhFKSBgJChCSU5QQVRIKS9saWJwbmcxMi1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkkKEVYRSkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JL2Jpbi9ybSAtZiAqLnBpYy5vICoubyAkKFNUQVRMSUIpICQoSU1QTElCKSAkKFNIQVJFRExJQikgXAotCXBuZ3Rlc3Qtc3RhdCQoRVhFKSBwbmd0ZXN0JChFWEUpIHBuZ291dC5wbmcgJChTSEFSRURERUYpIFwKLQlsaWJwbmctY29uZmlnIGxpYnBuZy5wYyBwbmd0ZXN0aSQoRVhFKQotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0uUEhPTlk6IGJ1aWxkc2V0dXAtdGVsbCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZyB0ZXN0LWNvbmZpZy1pbnN0YWxsIGNsZWFuCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZy5jCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5nZXJyb3IuYwotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3Jpby5jCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5nd2lvLmMKLXBuZ21lbS5vIHBuZ21lbS5waWMubzoJCXBuZy5oIHBuZ2NvbmYuaCBwbmdtZW0uYwotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3NldC5jCi1wbmdnZXQubyBwbmdnZXQucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5nZ2V0LmMKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncmVhZC5jCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncnRyYW4uYwotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3J1dGlsLmMKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmd0cmFucy5jCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5nd3JpdGUuYwotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3d0cmFuLmMKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmd3dXRpbC5jCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncHJlYWQuYwotCi1wbmd0ZXN0Lm86CQkJcG5nLmggcG5nY29uZi5oIHBuZ3Rlc3QuYwotcG5ndGVzdC1zdGF0Lm86CQkJcG5nLmggcG5nY29uZi5oIHBuZ3Rlc3QuYwotCi0KLQpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5kYXJ3aW4gYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmRhcndpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhNDU2NC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmRhcndpbgorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gRGFyd2luIC8gTWFjIE9TIFgKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0LCAyMDA2LCAyMDA4IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDIwMDEgQ2hyaXN0b3BoIFBmaXN0ZXJlcgotIyBkZXJpdmVkIGZyb20gbWFrZWZpbGUubGludXg6Ci0jICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgR3JlZyBSb2Vsb2ZzCi0jICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgd2hlcmUgIm1ha2UgaW5zdGFsbCIgcHV0cyBsaWJwbmcuYSwgbGlicG5nMTIuZHlsaWIsIHBuZy5oIGFuZCBwbmdjb25mLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi0jWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgotI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi1aTElCTElCPS4uL3psaWIKLVpMSUJJTkM9Li4vemxpYgotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUUgPSBsaWJwbmcxMgotUE5HTUFKID0gMTIKLVBOR01JTiA9IDEuMi4zNwotUE5HVkVSID0gJChQTkdNQUopLiQoUE5HTUlOKQotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5keWxpYgotTElCU09NQUo9JChMSUJOQU1FKS4kKFBOR01BSikuZHlsaWIKLUxJQlNPVkVSPSQoTElCTkFNRSkuJChQTkdWRVIpLmR5bGliCi1PTERTTz1saWJwbmcuZHlsaWIKLU9MRFNPTUFKPWxpYnBuZy4zLmR5bGliCi1PTERTT1ZFUj1saWJwbmcuMy4kKFBOR01JTikuZHlsaWIKLQotIyBVdGlsaXRpZXM6Ci1DQz1jYwotQVJfUkM9YXIgcmMKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotUkFOTElCPXJhbmxpYgotUk1fRj0vYmluL3JtIC1mCi0KLSMgQ0ZMQUdTPS1JJChaTElCSU5DKSAtVyAtV2FsbCAtTzMgLWZ1bnJvbGwtbG9vcHMgLURQTkdfTk9fTU1YX0NPREUKLUNGTEFHUz0tSSQoWkxJQklOQykgLVcgLVdhbGwgLU8gLWZ1bnJvbGwtbG9vcHMKLUxERkxBR1M9LUwuIC1MJChaTElCTElCKSAtbHBuZzEyIC1segotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCi0KLS5jLnBpYy5vOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtZm5vLWNvbW1vbiAtbyAkQCAkKi5jCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTIhLWxwbmcxMlwgLWx6ISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzEyIC1selwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChMSUJTT1ZFUikKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKQotCi0kKExJQlNPVkVSKTogJChPQkpTRExMKQotCSQoQ0MpIC1keW5hbWljbGliIFwKLQkgLWluc3RhbGxfbmFtZSAkKExJQlBBVEgpLyQoTElCU09NQUopIFwKLQkgLWN1cnJlbnRfdmVyc2lvbiAwIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gMCBcCi0JIC1vICQoTElCU09WRVIpIFwKLQkgJChPQkpTRExMKSAtTCQoWkxJQkxJQikgLWx6Ci0KLSQoT0xEU09WRVIpOiAkKE9CSlNETEwpCi0JJChDQykgLWR5bmFtaWNsaWIgXAotCSAtaW5zdGFsbF9uYW1lICQoTElCUEFUSCkvJChPTERTT01BSikgXAotCSAtY3VycmVudF92ZXJzaW9uIDMgLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAzIFwKLQkgLW8gJChPTERTT1ZFUikgXAotCSAkKE9CSlNETEwpIC1MJChaTElCTElCKSAtbHoKLQotcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQkkKFJBTkxJQikgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTTykgbGlicG5nLnBjIFwKLQkkKE9MRFNPVkVSKQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJOQU1FKS4kKFBOR1ZFUikqLmR5bGliCi0JLUAkKFJNX0YpICQoREwpLyQoTElCTkFNRSkuJChQTkdNQUopKi5keWxpYgotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPTUFKKQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuMy4kKFBOR01JTikqLmR5bGliCi0JY3AgJChMSUJTT1ZFUikgJChETCkKLQljcCAkKE9MRFNPVkVSKSAkKERMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPVkVSKQotCWNobW9kIDc1NSAkKERMKS8kKE9MRFNPVkVSKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoT0xEU09WRVIpICQoT0xEU09NQUopOyBcCi0JJChMTl9TRikgJChPTERTT01BSikgJChPTERTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKTsgXAotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JJChDQykgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBsaWJwbmctY29uZmlnIFwKLQkkKE9MRFNPVkVSKSBcCi0JbGlicG5nLnBjICQoTElCTkFNRSkuKmR5bGliIHBuZ3Rlc3RpCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZGVjIGIvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5kZWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MTg3M2MuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5kZWMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIERFQyBBbHBoYSBVbml4Ci0jIENvcHlyaWdodCAoQykgMjAwMC0yMDAyLCAyMDA2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLVBOR01BSiA9IDAKLVBOR01JTiA9IDEuMi4zNwotUE5HVkVSID0gJChQTkdNQUopLiQoUE5HTUlOKQotTElCTkFNRSA9IGxpYnBuZzEyCi0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNvCi1MSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQotTElCU09WRVI9JChMSUJOQU1FKS5zby4kKFBOR1ZFUikKLU9MRFNPPWxpYnBuZy5zbwotT0xEU09NQUo9bGlicG5nLnNvLjMKLU9MRFNPVkVSPWxpYnBuZy5zby4zLiQoUE5HTUlOKQotCi0jIFV0aWxpdGllczoKLUFSX1JDPWFyIHJjCi1DQz1jYwotTUtESVJfUD1ta2RpcgotTE5fU0Y9bG4gLWYgLXMKLVJBTkxJQj1yYW5saWIKLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi0jWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgotI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi1aTElCTElCPS4uL3psaWIKLVpMSUJJTkM9Li4vemxpYgotCi1DRkxBR1M9LXN0ZCAtdzEgLUkkKFpMSUJJTkMpIC1PICMgLWcgLURQTkdfREVCVUc9MQotTERGTEFHUz0tTCQoWkxJQkxJQikgLXJwYXRoICQoWkxJQkxJQikgbGlicG5nLmEgLWx6IC1sbQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLWFsbDogJChMSUJTTykgbGlicG5nLmEgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzEyIS1scG5nMTJcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gY2NvcHRzPVwiLXN0ZFwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTIgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChMSUJTT1ZFUikKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKQotCi0kKExJQlNPVkVSKTogJChPQkpTKQotCSQoQ0MpIC1zaGFyZWQgLW8gJEAgJChPQkpTKSAtTCQoWkxJQkxJQikgXAotCS1zb25hbWUgJChMSUJTT01BSikKLQotJChPTERTT1ZFUik6ICQoT0JKUykKLQkkKENDKSAtc2hhcmVkIC1vICRAICQoT0JKUykgLUwkKFpMSUJMSUIpIFwKLQktc29uYW1lICQoT0xEU09NQUopCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAvYmluL3JtIC1mICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AL2Jpbi9ybSAtZiAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQC9iaW4vcm0gLWYgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT1ZFUikgbGlicG5nLnBjIFwKLQkkKE9MRFNPVkVSKQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQC9iaW4vcm0gLWYgJChETCkvJChMSUJTT1ZFUikqICQoREwpLyQoTElCU08pCi0JLUAvYmluL3JtIC1mICQoREwpLyQoTElCU09NQUopCi0JLUAvYmluL3JtIC1mICQoREwpLyQoT0xEU08pCi0JLUAvYmluL3JtIC1mICQoREwpLyQoT0xEU09NQUopCi0JLUAvYmluL3JtIC1mICQoREwpLyQoT0xEU09WRVIpKgotCWNwICQoTElCU09WRVIpICQoREwpCi0JY3AgJChPTERTT1ZFUikgJChETCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1ZFUikKLQljaG1vZCA3NTUgJChETCkvJChPTERTT1ZFUikKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKE9MRFNPVkVSKSAkKE9MRFNPTUFKKTsgXAotCSQoTE5fU0YpICQoT0xEU09NQUopICQoT0xEU08pOyBcCi0JJChMTl9TRikoTElCU09WRVIpICQoTElCU09NQUopOyBcCi0JJChMTl9TRikoTElCU09NQUopICQoTElCU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AL2Jpbi9ybSAtZiAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AL2Jpbi9ybSAtZiAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AL2Jpbi9ybSAtZiAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAvYmluL3JtIC1mICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AL2Jpbi9ybSAtZiAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQC9iaW4vcm0gLWYgJChEQikvbGlicG5nLWNvbmZpZwotCS1AL2Jpbi9ybSAtZiAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLXcxIC1JJChESSkgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSAgLVIkKFpMSUJMSUIpIC1SJChETCkgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCi0JJChDQykgLXcxIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JL2Jpbi9ybSAtZiAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKLQlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCi0JJChPTERTT1ZFUikgXAotCWxpYnBuZy5wYwotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5kajIgYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmRqMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2ZmZkOC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmRqMgorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMgREpHUFAgKERPUyBnY2MpIG1ha2VmaWxlIGZvciBsaWJwbmcKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCB3aWxsIHB1dCBsaWJwbmcuYSBhbmQgcG5nLmgKLSNwcmVmaXg9L3Vzci9sb2NhbAotcHJlZml4PS4KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChwcmVmaXgpL2xpYgotCi1DQz1nY2MKLUNGTEFHUz0tSS4uL3psaWIgLU8KLUxERkxBR1M9LUwuIC1MLi4vemxpYi8gLWxwbmcgLWx6IC1sbQotCi1SQU5MSUI9cmFubGliCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBwbmd3dHJhbi5vIFwKLQlwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotYWxsOiBsaWJwbmcuYSBwbmd0ZXN0Ci0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JYXIgcmMgJEAgICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQljb2ZmMmV4ZSBwbmd0ZXN0Ci0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLWNsZWFuOgotCXJtIC1mICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ291dC5wbmcKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubzogcG5nLmggcG5nY29uZi5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3Jpby5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3NldC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oCi1wbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZWxmIGIvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5lbGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzE3ODQuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5lbGYKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nLmEgYW5kIGxpYnBuZzEyLnNvIG9uIExpbnV4IEVMRiB3aXRoIGdjYwotIyBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDIsIDIwMDYsIDIwMDggR3JlZyBSb2Vsb2ZzCi0jIGFuZCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi0jIE1vZGlmaWVkIGZvciBEZWJpYW4gYnkgSnVuaWNoaSBVZWthd2EgYW5kIEpvc3NlbGluIE1vdWV0dGUKLSMgTWFqb3IgbW9kaWZpY2F0aW9ucyBhcmU6Ci0jICAgICogbGluayBsaWJwbmcgZXhwbGljaXRseSB3aXRoIGxpYnogYW5kIGxpYm0KLSMgICAgKiAkKE9MRFNPKS4zIGlzIGEgc3ltbGluayByYXRoZXIgdGhhbiBhIGRpZmZlcmVudCBsaWJyYXJ5Ci0jICAgICogdmVyc2lvbmVkIHN5bWJvbHMKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTIKLVBOR01BSiA9IDAKLVBOR01JTiA9IDEuMi4zNwotUE5HVkVSID0gJChQTkdNQUopLiQoUE5HTUlOKQotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPVkVSPSQoTElCTkFNRSkuc28uJChQTkdWRVIpCi1PTERTTz1saWJwbmcuc28KLU9MRFNPTUFKPWxpYnBuZy5zby4zCi1PTERTT1ZFUj1saWJwbmcuc28uMy4kKFBOR01JTikKLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Z2NjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtc2YKLVJBTkxJQj1yYW5saWIKLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIHdoZXJlICJtYWtlIGluc3RhbGwiIHB1dHMgbGlicG5nMTIuYSwgbGlicG5nMTIuc28qLAotIyBsaWJwbmcxMi9wbmcuaCBhbmQgbGlicG5nMTIvcG5nY29uZi5oCi0jIFByZWZpeCBtdXN0IGJlIGEgZnVsbCBwYXRobmFtZS4KLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkLgotWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgotWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLSMgWkxJQkxJQj0uLi96bGliCi0jIFpMSUJJTkM9Li4vemxpYgotCi1BTElHTj0KLSMgZm9yIGkzODY6Ci0jQUxJR049LW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIKLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi0KLSMgZm9yIHBnY2MgdmVyc2lvbiAyLjk1LjEsIC1PMyBpcyBidWdneTsgZG9uJ3QgdXNlIGl0LgotCi1DRkxBR1M9LVcgLVdhbGwgLURfUkVFTlRSQU5UIC1PMiBcCi0JJChBTElHTikgIyAkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci0KLUxERkxBR1M9LUwuIC1scG5nMTIKLUxERkxBR1NfQT1saWJwbmcuYSAtbHogLWxtCi1MSUJBRERGTEFHUz0tbHogLWxtCi0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1PQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vIC5waWMubwotCi0uYy5waWMubzoKLQkkKENDKSAtYyAkKENGTEFHUykgLWZQSUMgLW8gJEAgJCouYwotCi1hbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgcG5ndGVzdC1zdGF0aWMgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzEyIS1scG5nMTJcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmcuc3ltczogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpIC1FIC1EUE5HX0JVSUxEU1lNUyAtRFBOR19JTlRFUk5BTCBwbmcuaCB8XAotCWF3ayAtRiAnW1x0IFtcXF0oKTtdJyAtdiBQTkdNQUo9JChQTkdNQUopICdCRUdJTntwcmludGYoIlBORzEyXyVzIHtnbG9iYWw6XG4iLFBOR01BSil9XAotCXsgZm9yIChpPTE7aSsyPD1ORjsrK2kpXAotCQlpZiAoJCQoaSk9PSJQTkdfRlVOQ1RJT05fRVhQT1JUIiAmJiAkJChpKzIpPT0iRU5EIilcCi0JCQlwcmludCAkJChpKzEpICI7IjtcCi0JZm9yIChpPTE7aSsxPD1ORjsrK2kpXAotCQlpZiAoJCQoaSk9PSJQTkdfREFUQV9FWFBPUlQiKVwKLQkJCXByaW50ICQkKGkrMSkgIjsiO31cCi0JRU5Ee3ByaW50ICJsb2NhbDogKjsgfTsifScgPiRALm5ldwotCSQoUk1fRikgJEAKLQltdiAkQC5uZXcgJEAKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIExfb3B0cz1cIlwiOyBcCi0JZWNobyBSX29wdHM9XCJcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTJcIjsgXAotCWVjaG8gYWxsX2xpYnM9XCItbHBuZzEyICQoTElCQURERkxBR1MpXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKExJQlNPVkVSKQotCSQoTE5fU0YpICQoTElCU09WRVIpICQoTElCU09NQUopCi0KLSQoTElCU09WRVIpOiAkKE9CSlNETEwpIGxpYnBuZy5zeW1zCi0JJChDQykgLXNoYXJlZCAtV2wsLXNvbmFtZSwkKExJQlNPTUFKKSBcCi0JLVdsLC12ZXJzaW9uLXNjcmlwdCxsaWJwbmcuc3ltcyBcCi0JLW8gJChMSUJTT1ZFUikgXAotCSQoT0JKU0RMTCkKLQotJChPTERTT1ZFUik6ICQoT0JKU0RMTCkgbGlicG5nLnN5bXMKLQkkKENDKSAtc2hhcmVkIC1XbCwtc29uYW1lLCQoT0xEU09NQUopIFwKLQktV2wsLXZlcnNpb24tc2NyaXB0LGxpYnBuZy5zeW1zIFwKLQktbyAkKE9MRFNPVkVSKSBcCi0JJChPQkpTRExMKQotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJTTykKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi1wbmd0ZXN0LXN0YXRpYzogcG5ndGVzdC5vIGxpYnBuZy5hCi0JJChDQykgLW8gcG5ndGVzdC1zdGF0aWMgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1NfQSkKLQotdGVzdDogcG5ndGVzdCBwbmd0ZXN0LXN0YXRpYwotCUBlY2hvICIiCi0JQGVjaG8gIiAgIFJ1bm5pbmcgcG5ndGVzdCBkeW5hbWljYWxseSBsaW5rZWQgd2l0aCAkKExJQlNPKToiCi0JQGVjaG8gIiIKLQlMRF9MSUJSQVJZX1BBVEg9Ii46JHtMRF9MSUJSQVJZX1BBVEh9IiAuL3BuZ3Rlc3QKLQlAZWNobyAiIgotCUBlY2hvICIgICBSdW5uaW5nIHBuZ3Rlc3Qgc3RhdGljYWxseSBsaW5rZWQgd2l0aCBsaWJwbmcuYToiCi0JQGVjaG8gIiIKLQkuL3BuZ3Rlc3Qtc3RhdGljCi0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09WRVIpIGxpYnBuZy5wYyBcCi0JJChPTERTT1ZFUikKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09WRVIpKiAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPTUFKKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPTUFKKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPVkVSKSoKLQljcCAkKExJQlNPVkVSKSAkKERMKQotCWNwICQoT0xEU09WRVIpICQoREwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09WRVIpCi0JY2htb2QgNzU1ICQoREwpLyQoT0xEU09WRVIpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChPTERTT1ZFUikgJChPTERTT01BSik7IFwKLQkkKExOX1NGKSAkKE9MRFNPTUFKKSAkKE9MRFNPKTsgXAotCSQoTE5fU0YpICQoTElCU09WRVIpICQoTElCU09NQUopOyBcCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLUkkKERJKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIC1XbCwgLXJwYXRoLCQoREwpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JJChDQykgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBsaWJwbmcuc3ltcyBwbmd0ZXN0IHBuZ291dC5wbmcgbGlicG5nLWNvbmZpZyBcCi0JJChMSUJTTykgJChMSUJTT01BSikqIHBuZ3Rlc3Qtc3RhdGljIHBuZ3Rlc3RpIFwKLQkkKE9MRFNPVkVSKSBcCi0JbGlicG5nLnBjCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZnJlZWJzZCBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZnJlZWJzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwZjFlNi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmZyZWVic2QKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgdW5kZXIgRnJlZUJTRAotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcsIDIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uIGFuZCBBbmRyZXkgQS4gQ2hlcm5vdgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotUFJFRklYPz0gICAgICAgIC91c3IvbG9jYWwKLVNITElCX1ZFUj89ICAgICA1Ci0KLUxJQj0JCXBuZwotU0hMSUJfTUFKT1I9CSR7U0hMSUJfVkVSfQotU0hMSUJfTUlOT1I9CTAKLU5PUFJPRklMRT0JWUVTCi1OT09CSj0gICAgICAgICAgWUVTCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEgYW5kIHBuZy5oCi1ERVNURElSPQkke1BSRUZJWH0KLUxJQkRJUj0JCS9saWIKLUlOQ1M9CQlwbmcuaCBwbmdjb25mLmgKLUlOQ1NESVI9CS9pbmNsdWRlL2xpYnBuZwotSU5DRElSPQkJJHtJTkNTRElSfQkJIyBmb3IgNC54IGJzZC5saWIubWsKLU1BTj0JCWxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLU1BTkRJUj0JCS9tYW4vbWFuCi1TWU1MSU5LUz0gICAgICAgbGlicG5nL3BuZy5oICR7SU5DU0RJUn0vLi4vcG5nLmggXAotCQlsaWJwbmcvcG5nY29uZi5oICR7SU5DU0RJUn0vLi4vcG5nY29uZi5oCi1MREFERCs9ICAgICAgICAgLWxtIC1segotRFBBREQrPSAgICAgICAgICR7TElCTX0gJHtMSUJafQotCi1DRkxBR1MrPSAtSS4KLS5pZiAoJHtNQUNISU5FX0FSQ0h9ICE9ICJpMzg2IikKLUNGTEFHUys9IC1EUE5HX05PX01NWF9DT0RFCi0uZW5kaWYKLQotU1JDUz0JcG5nLmMgcG5nc2V0LmMgcG5nZ2V0LmMgcG5ncnV0aWwuYyBwbmd0cmFucy5jIHBuZ3d1dGlsLmMgXAotCXBuZ3JlYWQuYyBwbmdyaW8uYyBwbmd3aW8uYyBwbmd3cml0ZS5jIHBuZ3J0cmFuLmMgXAotCXBuZ3d0cmFuLmMgcG5nbWVtLmMgcG5nZXJyb3IuYyBwbmdwcmVhZC5jCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSR7Q0N9ICR7Q0ZMQUdTfSAtTC4gLXN0YXRpYyAtbyBwbmd0ZXN0IHBuZ3Rlc3QubyAtbHBuZyAtbHogLWxtCi0KLUNMRUFORklMRVM9IHBuZ3Rlc3QgcG5ndGVzdC5vIHBuZ291dC5wbmcKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0uaW5jbHVkZSA8YnNkLmxpYi5taz4KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZ2NjIGIvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5nY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYWVjOGIuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5nY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgdXNpbmcgZ2NjIChnZW5lcmljLCBzdGF0aWMgbGlicmFyeSkKLSMgQ29weXJpZ2h0IChDKSAyMDA4IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDIwMDAgQ29zbWluIFRydXRhCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgTG9jYXRpb24gb2YgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcwotWkxJQklOQyA9IC4uL3psaWIKLVpMSUJMSUIgPSAuLi96bGliCi0KLSMgQ29tcGlsZXIsIGxpbmtlciwgbGliIGFuZCBvdGhlciB0b29scwotQ0MgPSBnY2MKLUxEID0gJChDQykKLUFSX1JDID0gYXIgcmNzCi1SQU5MSUIgPSByYW5saWIKLVJNX0YgPSBybSAtZgotCi1DREVCVUcgPSAtZyAtRFBOR19ERUJVRz01Ci1MRERFQlVHID0KLUNSRUxFQVNFID0gLU8yCi1MRFJFTEVBU0UgPSAtcwotI0NGTEFHUyA9IC1XIC1XYWxsICQoQ0RFQlVHKQotQ0ZMQUdTID0gLVcgLVdhbGwgJChDUkVMRUFTRSkKLSNMREZMQUdTID0gJChMRERFQlVHKQotTERGTEFHUyA9ICQoTERSRUxFQVNFKQotTElCUyA9IC1seiAtbG0KLQotIyBGaWxlIGV4dGVuc2lvbnMKLU89Lm8KLUE9LmEKLUVYRT0KLQotIyBWYXJpYWJsZXMKLU9CSlMgPSAgcG5nJChPKSBwbmdlcnJvciQoTykgcG5nZ2V0JChPKSBwbmdtZW0kKE8pIHBuZ3ByZWFkJChPKSBcCi0JcG5ncmVhZCQoTykgcG5ncmlvJChPKSBwbmdydHJhbiQoTykgcG5ncnV0aWwkKE8pIHBuZ3NldCQoTykgXAotCXBuZ3RyYW5zJChPKSBwbmd3aW8kKE8pIHBuZ3dyaXRlJChPKSBwbmd3dHJhbiQoTykgcG5nd3V0aWwkKE8pCi0KLSMgVGFyZ2V0cwotYWxsOiBzdGF0aWMKLQotLmMkKE8pOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtSSQoWkxJQklOQykgJDwKLQotc3RhdGljOiBsaWJwbmckKEEpIHBuZ3Rlc3QkKEVYRSkKLQotc2hhcmVkOgotCUBlY2hvIFRoaXMgaXMgYSBnZW5lcmljIG1ha2VmaWxlIHRoYXQgY2Fubm90IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzLgotCUBlY2hvIFBsZWFzZSB1c2UgYSBjb25maWd1cmF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8geW91ciBwbGF0Zm9ybS4KLQlAZmFsc2UKLQotbGlicG5nJChBKTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotdGVzdDogcG5ndGVzdCQoRVhFKQotCS4vcG5ndGVzdCQoRVhFKQotCi1wbmd0ZXN0JChFWEUpOiBwbmd0ZXN0JChPKSBsaWJwbmckKEEpCi0JJChMRCkgJChMREZMQUdTKSAtTCQoWkxJQkxJQikgLW8gJEAgcG5ndGVzdCQoTykgbGlicG5nJChBKSAkKExJQlMpCi0KLWNsZWFuOgotCSQoUk1fRikgKiQoTykgbGlicG5nJChBKSBwbmd0ZXN0JChFWEUpIHBuZ291dC5wbmcKLQotcG5nJChPKTogICAgICBwbmcuaCBwbmdjb25mLmgKLXBuZ2Vycm9yJChPKTogcG5nLmggcG5nY29uZi5oCi1wbmdnZXQkKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaAotcG5nbWVtJChPKTogICBwbmcuaCBwbmdjb25mLmgKLXBuZ3ByZWFkJChPKTogcG5nLmggcG5nY29uZi5oCi1wbmdyZWFkJChPKTogIHBuZy5oIHBuZ2NvbmYuaAotcG5ncmlvJChPKTogICBwbmcuaCBwbmdjb25mLmgKLXBuZ3J0cmFuJChPKTogcG5nLmggcG5nY29uZi5oCi1wbmdydXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0JChPKTogICBwbmcuaCBwbmdjb25mLmgKLXBuZ3RyYW5zJChPKTogcG5nLmggcG5nY29uZi5oCi1wbmd3aW8kKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaAotcG5nd3JpdGUkKE8pOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d0cmFuJChPKTogcG5nLmggcG5nY29uZi5oCi1wbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCi1wbmd0ZXN0JChPKTogIHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5nY21teCBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuZ2NtbXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZTRhOGUuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5nY21teAorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcuYSBhbmQgbGlicG5nMTIuc28gb24gTGludXggRUxGIHdpdGggZ2NjIHVzaW5nIE1NWAotIyBhc3NlbWJsZXIgY29kZQotIyBDb3B5cmlnaHQgMjAwMiwgMjAwNiwgMjAwOCBHcmVnIFJvZWxvZnMgYW5kIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgMTk5OC0yMDAxIEdyZWcgUm9lbG9mcwotIyBDb3B5cmlnaHQgMTk5Ni0xOTk3IEFuZHJlYXMgRGlsZ2VyCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi0jIENBVVRJT046IERvIG5vdCB1c2UgdGhpcyBtYWtlZmlsZSB3aXRoIGdjYyB2ZXJzaW9ucyAyLjcuMi4yIGFuZCBlYXJsaWVyLgotCi0jIE5PVEU6ICBXaGVuIHRlc3RpbmcgTU1YIHBlcmZvcm1hbmNlIG9uIGEgbXVsdGl0YXNraW5nIHN5c3RlbSwgbWFrZSBzdXJlCi0jICAgICAgICB0aGVyZSBhcmUgbm8gZmxvYXRpbmctcG9pbnQgcHJvZ3JhbXMgKGUuZy4sIFNFVElASG9tZSkgcnVubmluZyBpbgotIyAgICAgICAgdGhlIGJhY2tncm91bmQhICBDb250ZXh0IHN3aXRjaGVzIGJldHdlZW4gTU1YIGFuZCBGUFUgYXJlIGV4cGVuc2l2ZS4KLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTIKLVBOR01BSiA9IDAKLVBOR01JTiA9IDEuMi4zNwotUE5HVkVSID0gJChQTkdNQUopLiQoUE5HTUlOKQotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPVkVSPSQoTElCTkFNRSkuc28uJChQTkdWRVIpCi1PTERTTz1saWJwbmcuc28KLU9MRFNPTUFKPWxpYnBuZy5zby4zCi1PTERTT1ZFUj1saWJwbmcuc28uMy4kKFBOR01JTikKLQotIyBVdGlsaXRpZXM6Ci1DQyA9IGdjYwotTEQgPSAkKENDKQotQVJfUkMgPSBhciByYwotTE5fU0YgPSBsbiAtc2YKLU1LRElSX1AgPSBta2RpciAtcAotUkFOTElCID0gcmFubGliCi1STV9GID0gL2Jpbi9ybSAtZgotCi0jIHdoZXJlICJtYWtlIGluc3RhbGwiIHB1dHMgbGlicG5nMTIuYSwgbGlicG5nMTIuc28qLAotIyBsaWJwbmcxMi9wbmcuaCBhbmQgbGlicG5nMTIvcG5nY29uZi5oCi0jIFByZWZpeCBtdXN0IGJlIGEgZnVsbCBwYXRobmFtZS4KLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkLgotI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKLSNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotWkxJQkxJQj0uLi96bGliCi1aTElCSU5DPS4uL3psaWIKLQotQUxJR049Ci0jIGZvciBpMzg2OgotI0FMSUdOPS1tYWxpZ24tbG9vcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotCi0jIGZvciBwZ2NjIHZlcnNpb24gMi45NS4xLCAtTzMgaXMgYnVnZ3k7IGRvbid0IHVzZSBpdC4KLQotIyBSZW1vdmUgLURQTkdfVEhSRUFEX1VOU0FGRV9PSyBpZiB5b3UgbmVlZCB0aHJlYWQgc2FmZXR5Ci0jIyMgZm9yIGdlbmVyaWMgZ2NjOgotQ0ZMQUdTPS1EUE5HX1RIUkVBRF9VTlNBRkVfT0sgLUkkKFpMSUJJTkMpIC1XIC1XYWxsIC1PIFwKLQkkKEFMSUdOKSAtZnVucm9sbC1sb29wcyBcCi0JLWZvbWl0LWZyYW1lLXBvaW50ZXIgICMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotIyMjIGZvciBnY2MgMi45NS4yIG9uIDY4NjoKLSNDRkxBR1M9LURQTkdfVEhSRUFEX1VOU0FGRV9PSyAtSSQoWkxJQklOQykgLVcgLVdhbGwgLU8gXAotIwktbWNwdT1pNjg2IC1tYWxpZ24tZG91YmxlIC1mZmFzdC1tYXRoIC1mc3RyaWN0LWFsaWFzaW5nIFwKLSMJJChBTElHTikgLWZ1bnJvbGwtbG9vcHMgLWZ1bnJvbGwtYWxsLWxvb3BzIC1mb21pdC1mcmFtZS1wb2ludGVyCi0jIyMgZm9yIGdjYyAyLjcuMi4zIG9uIDQ4NiBhbmQgdXA6Ci0jQ0ZMQUdTPS1EUE5HX1RIUkVBRF9VTlNBRkVfT0sgLUkkKFpMSUJJTkMpIC1XIC1XYWxsIC1PIFwKLSMJLW00ODYgLW1hbGlnbi1kb3VibGUgLWZmYXN0LW1hdGggXAotIwkkKEFMSUdOKSAtZnVucm9sbC1sb29wcyAtZnVucm9sbC1hbGwtbG9vcHMgLWZvbWl0LWZyYW1lLXBvaW50ZXIKLQotTERGTEFHUz0tTC4gLVdsLC1ycGF0aCwuIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgLWxwbmcxMiAtbHogLWxtCi1MREZMQUdTX0E9LUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSBsaWJwbmcuYSAtbHogLWxtCi0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1PQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vIC5waWMubwotCi0uYy5waWMubzoKLQkkKENDKSAtYyAkKENGTEFHUykgLWZQSUMgLW8gJEAgJCouYwotCi1hbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgcG5ndGVzdC1zdGF0aWMgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzEyIS1scG5nMTJcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gY3BwZmxhZ3M9XCItRFBOR19USFJFQURfVU5TQUZFX09LIFwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gUl9vcHRzPVwiLVdsLC1ycGF0aCwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzEyIC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoTElCU09WRVIpCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTT01BSikKLQotJChMSUJTT1ZFUik6ICQoT0JKU0RMTCkKLQkkKENDKSAtc2hhcmVkIC1XbCwtc29uYW1lLCQoTElCU09NQUopIFwKLQktbyAkKExJQlNPVkVSKSBcCi0JJChPQkpTRExMKQotCi0kKE9MRFNPVkVSKTogJChPQkpTRExMKQotCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsJChPTERTT01BSikgXAotCS1vICQoT0xEU09WRVIpIFwKLQkkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXBuZ3Rlc3Qtc3RhdGljOiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0LXN0YXRpYyAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHU19BKQotCi10ZXN0OiBwbmd0ZXN0IHBuZ3Rlc3Qtc3RhdGljCi0JQGVjaG8gIiIKLQlAZWNobyAiICAgUnVubmluZyBwbmd0ZXN0IGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoICQoTElCU08pOiIKLQlAZWNobyAiIgotCS4vcG5ndGVzdAotCUBlY2hvICIiCi0JQGVjaG8gIiAgIFJ1bm5pbmcgcG5ndGVzdCBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoIGxpYnBuZy5hOiIKLQlAZWNobyAiIgotCS4vcG5ndGVzdC1zdGF0aWMKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT1ZFUikgbGlicG5nLnBjIFwKLQkkKE9MRFNPVkVSKQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1ZFUikqICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09WRVIpKgotCWNwICQoTElCU09WRVIpICQoREwpCi0JY3AgJChPTERTT1ZFUikgJChETCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1ZFUikKLQljaG1vZCA3NTUgJChETCkvJChPTERTT1ZFUikKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKE9MRFNPVkVSKSAkKE9MRFNPTUFKKTsgXAotCSQoTE5fU0YpICQoT0xEU09NQUopICQoT0xEU08pOyBcCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTT01BSik7IFwKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgLVdsLCAtcnBhdGgsJChETCkgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQkkKENDKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBsaWJwbmctY29uZmlnIFwKLQkkKExJQlNPKSAkKExJQlNPTUFKKSogcG5ndGVzdC1zdGF0aWMgcG5ndGVzdGkgXAotCSQoT0xEU09WRVIpIFwKLQlsaWJwbmcucGMKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotcG5nLm8gcG5nLnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZy5jCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5nZXJyb3IuYwotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3Jpby5jCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5nd2lvLmMKLXBuZ21lbS5vIHBuZ21lbS5waWMubzoJCXBuZy5oIHBuZ2NvbmYuaCBwbmdtZW0uYwotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3NldC5jCi1wbmdnZXQubyBwbmdnZXQucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5nZ2V0LmMKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncmVhZC5jCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncnRyYW4uYwotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3J1dGlsLmMKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmd0cmFucy5jCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5nd3JpdGUuYwotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3d0cmFuLmMKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmd3dXRpbC5jCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncHJlYWQuYwotCi1wbmd0ZXN0Lm86CQkJcG5nLmggcG5nY29uZi5oIHBuZ3Rlc3QuYwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ocDY0IGIvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ocDY0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGU2NzU2Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaHA2NAorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcsIEhQVVggKDEwLjIwIGFuZCAxMS4wMCkgdXNpbmcgdGhlIEFOU0kvQyBwcm9kdWN0LgotIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMiwgMjAwNiwgMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MgotIyBjb250cmlidXRlZCBieSBKaW0gUmljZSBhbmQgdXBkYXRlZCBieSBDaHJpcyBTY2hsZWljaGVyLCBIZXdsZXR0IFBhY2thcmQKLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotWkxJQkxJQj0vb3B0L3psaWIvbGliCi1aTElCSU5DPS9vcHQvemxpYi9pbmNsdWRlCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSBwbGFuIHRvIGJ1aWxkIGEgbGlicG5nIHNoYXJlZCBsaWJyYXJ5LCB6bGliIG11c3QgYWxzbwotIyBiZSBhIHNoYXJlZCBsaWJyYXJ5LCB3aGljaCB6bGliJ3MgY29uZmlndXJlIGRvZXMgbm90IGRvLiAgQWZ0ZXIgcnVubmluZwotIyB6bGliJ3MgY29uZmlndXJlLCBlZGl0IHRoZSBhcHByb3ByaWF0ZSBsaW5lcyBvZiBtYWtlZmlsZSB0byByZWFkOgotIyAgIENGTEFHUz0tTzEgLURIQVZFX1VOSVNURCAtRFVTRV9NQVAgLWZQSUMgXAotIyAgIExEU0hBUkVEPWxkIC1iCi0jICAgU0hBUkVETElCPWxpYnouc2wKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTIKLVBOR01BSiA9IDAKLVBOR01JTiA9IDEuMi4zNwotUE5HVkVSID0gJChQTkdNQUopLiQoUE5HTUlOKQotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbAotTElCU09NQUo9JChMSUJOQU1FKS5zbC4kKFBOR01BSikKLUxJQlNPVkVSPSQoTElCTkFNRSkuc2wuJChQTkdWRVIpCi1PTERTTz1saWJwbmcuc2wKLU9MRFNPTUFKPWxpYnBuZy5zbC4zCi1PTERTT1ZFUj1saWJwbmcuc2wuMy4kKFBOR01JTikKLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Y2MKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotUkFOTElCPXJhbmxpYgotUk1fRj0vYmluL3JtIC1mCi0KLUNGTEFHUz0tSSQoWkxJQklOQykgLU8gLUFlIC1XbCwrdm5vY29tcGF0d2FybmluZ3MgK0RENjQgXAotLURfTEFSR0VGSUxFX1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0ICtaIC1ESEFWRV9VTklTVERfSCAtRFVTRV9NTUFQCi0jIENhdXRpb246IGJlIHN1cmUgeW91IGhhdmUgYnVpbHQgemxpYiB3aXRoIHRoZSBzYW1lIENGTEFHUy4KLUNDRkxBR1M9LUkkKFpMSUJJTkMpIC1PIC1BZSAtV2wsK3Zub2NvbXBhdHdhcm5pbmdzICtERDY0IFwKLS1EX0xBUkdFRklMRV9TT1VSQ0UgLURfRklMRV9PRkZTRVRfQklUUz02NCArWiAtREhBVkVfVU5JU1REX0ggLURVU0VfTU1BUAotCi1MREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcgLWx6IC1sbQotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxMi5zbCwgYW5kIHBuZy5oCi1wcmVmaXg9L29wdC9saWJwbmcKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1PQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKLQotLlNVRkZJWEVTOgkuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpICt6IC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxMiEtbHBuZzEyXCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGNjb3B0cz1cIi1BZSArREExLjEgK0RTMi4wXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxMiAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKExJQlNPVkVSKQotCSQoTE5fU0YpICQoTElCU09WRVIpICQoTElCU09NQUopCi0KLSQoTElCU09WRVIpOiAkKE9CSlNETEwpCi0JJChMRCkgLWIgK3MgXAotCStoICQoTElCU09NQUopIC1vICQoTElCU09WRVIpICQoT0JKU0RMTCkKLQotJChPTERTT1ZFUik6ICQoT0JKU0RMTCkKLQkkKExEKSAtYiArcyBcCi0JK2ggJChPTERTT01BSikgLW8gJChPTERTT1ZFUikgJChPQkpTRExMKQotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0NGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPVkVSKSBsaWJwbmcucGMgXAotCSQoT0xEU09WRVIpCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPVkVSKSogJChETCkvJChMSUJTTykKLQktQCQoUk1fRikgJChETCkvJChMSUJTT01BSikKLQktQCQoUk1fRikgJChETCkvJChPTERTTykKLQktQCQoUk1fRikgJChETCkvJChPTERTT01BSikKLQktQCQoUk1fRikgJChETCkvJChPTERTT1ZFUikqCi0JY3AgJChMSUJTT1ZFUikgJChETCkKLQljcCAkKE9MRFNPVkVSKSAkKERMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPVkVSKQotCWNobW9kIDc1NSAkKERMKS8kKE9MRFNPVkVSKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoT0xEU09WRVIpICQoT0xEU09NQUopOyBcCi0JJChMTl9TRikgJChPTERTT01BSikgJChPTERTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKTsgXAotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgLUkkKFpMSUJJTkMpICQoQ0NGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5LgotCSQoQ0MpICQoQ0NGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKLQlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCi0JJChPTERTT1ZFUikgXAotCWxpYnBuZy5wYwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ocGdjYyBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaHBnY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MmQ3MDMuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ocGdjYworKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gSFAtVVggdXNpbmcgR0NDIHdpdGggdGhlIEhQIEFOU0kvQyBsaW5rZXIuCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNi0yMDA4IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDIwMDEsIExhdXJlbnQgZmFpbGxpZQotIyBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgR3JlZyBSb2Vsb2ZzCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTIKLVBOR01BSiA9IDAKLVBOR01JTiA9IDEuMi4zNwotUE5HVkVSID0gJChQTkdNQUopLiQoUE5HTUlOKQotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbAotTElCU09NQUo9JChMSUJOQU1FKS5zbC4kKFBOR01BSikKLUxJQlNPVkVSPSQoTElCTkFNRSkuc2wuJChQTkdWRVIpCi1PTERTTz1saWJwbmcuc2wKLU9MRFNPTUFKPWxpYnBuZy5zbC4zCi1PTERTT1ZFUj1saWJwbmcuc2wuMy4kKFBOR01JTikKLQotIyBVdGlsaXRpZXM6Ci1DQz1nY2MKLUxEPWxkCi1BUl9SQz1hciByYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLXNmCi1SQU5MSUI9cmFubGliCi1STV9GPS9iaW4vcm0gLWYKLQotIyB3aGVyZSAibWFrZSBpbnN0YWxsIiBwdXRzIGxpYnBuZy5hLCAkKE9MRFNPKSosIHBuZy5oIGFuZCBwbmdjb25mLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi1aTElCTElCPS9vcHQvemxpYi9saWIKLVpMSUJJTkM9L29wdC96bGliL2luY2x1ZGUKLQotIyBOb3RlIHRoYXQgaWYgeW91IHBsYW4gdG8gYnVpbGQgYSBsaWJwbmcgc2hhcmVkIGxpYnJhcnksIHpsaWIgbXVzdCBhbHNvCi0jIGJlIGEgc2hhcmVkIGxpYnJhcnksIHdoaWNoIHpsaWIncyBjb25maWd1cmUgZG9lcyBub3QgZG8uICBBZnRlciBydW5uaW5nCi0jIHpsaWIncyBjb25maWd1cmUsIGVkaXQgdGhlIGFwcHJvcHJpYXRlIGxpbmVzIG9mIG1ha2VmaWxlIHRvIHJlYWQ6Ci0jICAgQ0ZMQUdTPS1PMSAtREhBVkVfVU5JU1REIC1EVVNFX01BUCAtZlBJQyBcCi0jICAgTERTSEFSRUQ9bGQgLWIKLSMgICBTSEFSRURMSUI9bGliei5zbAotCi1BTElHTj0KLSMgZm9yIGkzODY6Ci0jQUxJR049LW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIKLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi0KLSMgZm9yIHBnY2MgdmVyc2lvbiAyLjk1LjEsIC1PMyBpcyBidWdneTsgZG9uJ3QgdXNlIGl0LgotCi1DRkxBR1M9LUkkKFpMSUJJTkMpIC1XIC1XYWxsIC1PMyAtZnVucm9sbC1sb29wcyAtRFBOR19OT19NTVhfQ09ERSBcCi0JJChBTElHTikgIyAkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci0jTERGTEFHUz0tTC4gLVdsLC1ycGF0aCwuIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgLWxwbmcxMiAtbHogLWxtCi1MREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcxMiAtbHogLWxtCi0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpIC1mUElDIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxMiEtbHBuZzEyXCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzEyIC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoTElCU09WRVIpCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTT01BSikKLQotJChMSUJTT1ZFUik6ICQoT0JKU0RMTCkKLQkkKExEKSAtYiArcyBcCi0JK2ggJChMSUJTT01BSikgLW8gJChMSUJTT1ZFUikgJChPQkpTRExMKQotCi0kKE9MRFNPVkVSKTogJChPQkpTRExMKQotCSQoTEQpIC1iICtzIFwKLQkraCAkKE9MRFNPTUFKKSAtbyAkKE9MRFNPVkVSKSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPVkVSKSBsaWJwbmcucGMgXAotCSQoT0xEU09WRVIpCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPVkVSKSogJChETCkvJChMSUJTTykKLQktQCQoUk1fRikgJChETCkvJChMSUJTT01BSikKLQktQCQoUk1fRikgJChETCkvJChPTERTTykKLQktQCQoUk1fRikgJChETCkvJChPTERTT01BSikKLQktQCQoUk1fRikgJChETCkvJChPTERTT1ZFUikqCi0JY3AgJChMSUJTT1ZFUikgJChETCkKLQljcCAkKE9MRFNPVkVSKSAkKERMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPVkVSKQotCWNobW9kIDc1NSAkKERMKS8kKE9MRFNPVkVSKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoT0xEU09WRVIpICQoT0xEU09NQUopOyBcCi0JJChMTl9TRikgJChPTERTT01BSikgJChPTERTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKTsgXAotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoREwpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBcCi0JbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogXAotCSQoT0xEU09WRVIpIFwKLQlsaWJwbmcucGMKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ocHV4IGIvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ocHV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTM5OTVlLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaHB1eAorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcsIEhQVVggKDEwLjIwIGFuZCAxMS4wMCkgdXNpbmcgdGhlIEFOU0kvQyBwcm9kdWN0LgotIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMiwgMjAwNiBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MgotIyBjb250cmlidXRlZCBieSBKaW0gUmljZSBhbmQgdXBkYXRlZCBieSBDaHJpcyBTY2hsZWljaGVyLCBIZXdsZXR0IFBhY2thcmQKLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotWkxJQkxJQj0vb3B0L3psaWIvbGliCi1aTElCSU5DPS9vcHQvemxpYi9pbmNsdWRlCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSBwbGFuIHRvIGJ1aWxkIGEgbGlicG5nIHNoYXJlZCBsaWJyYXJ5LCB6bGliIG11c3QgYWxzbwotIyBiZSBhIHNoYXJlZCBsaWJyYXJ5LCB3aGljaCB6bGliJ3MgY29uZmlndXJlIGRvZXMgbm90IGRvLiAgQWZ0ZXIgcnVubmluZwotIyB6bGliJ3MgY29uZmlndXJlLCBlZGl0IHRoZSBhcHByb3ByaWF0ZSBsaW5lcyBvZiBtYWtlZmlsZSB0byByZWFkOgotIyAgIENGTEFHUz0tTzEgLURIQVZFX1VOSVNURCAtRFVTRV9NQVAgLWZQSUMgXAotIyAgIExEU0hBUkVEPWxkIC1iCi0jICAgU0hBUkVETElCPWxpYnouc2wKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTIKLVBOR01BSiA9IDAKLVBOR01JTiA9IDEuMi4zNwotUE5HVkVSID0gJChQTkdNQUopLiQoUE5HTUlOKQotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbAotTElCU09NQUo9JChMSUJOQU1FKS5zbC4kKFBOR01BSikKLUxJQlNPVkVSPSQoTElCTkFNRSkuc2wuJChQTkdWRVIpCi1PTERTTz1saWJwbmcuc2wKLU9MRFNPTUFKPWxpYnBuZy5zbC4zCi1PTERTT1ZFUj1saWJwbmcuc2wuMy4kKFBOR01JTikKLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Y2MKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotUkFOTElCPXJhbmxpYgotUk1fRj0vYmluL3JtIC1mCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzEyLnNsLCBhbmQgcG5nLmgKLXByZWZpeD0vb3B0L2xpYnBuZwotZXhlY19wcmVmaXg9JChwcmVmaXgpCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi1DRkxBR1M9LUkkKFpMSUJJTkMpIC1PIC1BZSArREExLjEgK0RTMi4wIC1EUE5HX05PX01NWF9DT0RFCi0jIENhdXRpb246IGJlIHN1cmUgeW91IGhhdmUgYnVpbHQgemxpYiB3aXRoIHRoZSBzYW1lIENGTEFHUy4KLUNDRkxBR1M9LUkkKFpMSUJJTkMpIC1PIC1BZSArREExLjEgK0RTMi4wCi1MREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcgLWx6IC1sbQotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6CS5jIC5vIC5waWMubwotCi0uYy5waWMubzoKLQkkKENDKSAtYyAkKENGTEFHUykgK3ogLW8gJEAgJCouYwotCi1hbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzEyIS1scG5nMTJcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gY2NvcHRzPVwiLUFlICtEQTEuMSArRFMyLjBcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzEyIC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoTElCU09WRVIpCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTT01BSikKLQotJChMSUJTT1ZFUik6ICQoT0JKU0RMTCkKLQkkKExEKSAtYiArcyBcCi0JK2ggJChMSUJTT01BSikgLW8gJChMSUJTT1ZFUikgJChPQkpTRExMKQotCi0kKE9MRFNPVkVSKTogJChPQkpTRExMKQotCSQoTEQpIC1iICtzIFwKLQkraCAkKE9MRFNPTUFKKSAtbyAkKE9MRFNPVkVSKSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09WRVIpIGxpYnBuZy5wYyBcCi0JJChPTERTT1ZFUikKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09WRVIpKiAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPTUFKKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPTUFKKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPVkVSKSoKLQljcCAkKExJQlNPVkVSKSAkKERMKQotCWNwICQoT0xEU09WRVIpICQoREwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09WRVIpCi0JY2htb2QgNzU1ICQoREwpLyQoT0xEU09WRVIpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChPTERTT1ZFUikgJChPTERTT01BSik7IFwKLQkkKExOX1NGKSAkKE9MRFNPTUFKKSAkKE9MRFNPKTsgXAotCSQoTE5fU0YpICQoTElCU09WRVIpICQoTElCU09NQUopOyBcCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLUkkKERJKSAtSSQoWkxJQklOQykgJChDQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCi0JJChDQykgJChDQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgXAotCWxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIFwKLQkkKE9MRFNPVkVSKSBcCi0JbGlicG5nLnBjCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oCi1wbmd3aW8ubzogcG5nLmggcG5nY29uZi5oCi1wbmdtZW0ubzogcG5nLmggcG5nY29uZi5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oCi1wbmdnZXQubzogcG5nLmggcG5nY29uZi5oCi1wbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oCi1wbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmlibWMgYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmlibWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOGFmNzkuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5pYm1jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgbGlicG5nIChzdGF0aWMpCi0jIElCTSBDIHZlcnNpb24gMy54IGZvciBXaW4zMiBhbmQgT1MvMgotIyBDb3B5cmlnaHQgKEMpIDIwMDYgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMjAwMCBDb3NtaW4gVHJ1dGEKLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0jIE5vdGVzOgotIyAgIERlcml2ZWQgZnJvbSBtYWtlZmlsZS5zdGQKLSMgICBBbGwgbW9kdWxlcyBhcmUgY29tcGlsZWQgaW4gQyBtb2RlCi0jICAgVGVzdGVkIHVuZGVyIFdpbjMyLCBleHBlY3RlZCB0byB3b3JrIHVuZGVyIE9TLzIKLSMgICBDYW4gYmUgZWFzaWx5IGFkYXB0ZWQgZm9yIElCTSBWaXN1YWxBZ2UvQysrIGZvciBBSVgKLQotIyBMb2NhdGlvbiBvZiB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzCi1aTElCSU5DID0gLi4vemxpYgotWkxJQkxJQiA9IC4uL3psaWIKLQotIyBDb21waWxlciwgbGlua2VyLCBsaWIgYW5kIG90aGVyIHRvb2xzCi1DQyA9IGljYwotTEQgPSBpbGluawotQVIgPSBpbGliCi1STSA9IGRlbAotCi1DRkxBR1MgPSAtSSQoWkxJQklOQykgLU1jIC1PMiAtVzMKLUxERkxBR1MgPQotCi0jIEZpbGUgZXh0ZW5zaW9ucwotTz0ub2JqCi1BPS5saWIKLUU9LmV4ZQotCi0jIFZhcmlhYmxlcwotT0JKUyA9IHBuZyQoTykgcG5nZXJyb3IkKE8pIHBuZ2dldCQoTykgcG5nbWVtJChPKSBwbmdwcmVhZCQoTykgXAotCXBuZ3JlYWQkKE8pIHBuZ3JpbyQoTykgcG5ncnRyYW4kKE8pIHBuZ3J1dGlsJChPKSBwbmdzZXQkKE8pIFwKLQlwbmd0cmFucyQoTykgcG5nd2lvJChPKSBwbmd3cml0ZSQoTykgcG5nd3RyYW4kKE8pIHBuZ3d1dGlsJChPKQotCi1MSUJTID0gbGlicG5nJChBKSAkKFpMSUJMSUIpL3psaWIkKEEpCi0KLSMgVGFyZ2V0cwotYWxsOiBsaWJwbmckKEEpIHBuZ3Rlc3QkKEUpCi0KLWxpYnBuZyQoQSk6ICQoT0JKUykKLQkkKEFSKSAtb3V0OiRAICQoT0JKUykKLQotdGVzdDogcG5ndGVzdCQoRSkKLQlwbmd0ZXN0JChFKQotCi1wbmd0ZXN0OiBwbmd0ZXN0JChFKQotCi1wbmd0ZXN0JChFKTogcG5ndGVzdCQoTykgbGlicG5nJChBKQotCSQoTEQpICQoTERGTEFHUykgcG5ndGVzdCQoTykgJChMSUJTKQotCi1jbGVhbjoKLQkkKFJNKSAqJChPKQotCSQoUk0pIGxpYnBuZyQoQSkKLQkkKFJNKSBwbmd0ZXN0JChFKQotCSQoUk0pIHBuZ291dC5wbmcKLQotcG5nJChPKTogICAgICBwbmcuaCBwbmdjb25mLmgKLXBuZ2Vycm9yJChPKTogcG5nLmggcG5nY29uZi5oCi1wbmdnZXQkKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaAotcG5nbWVtJChPKTogICBwbmcuaCBwbmdjb25mLmgKLXBuZ3ByZWFkJChPKTogcG5nLmggcG5nY29uZi5oCi1wbmdyZWFkJChPKTogIHBuZy5oIHBuZ2NvbmYuaAotcG5ncmlvJChPKTogICBwbmcuaCBwbmdjb25mLmgKLXBuZ3J0cmFuJChPKTogcG5nLmggcG5nY29uZi5oCi1wbmdydXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0JChPKTogICBwbmcuaCBwbmdjb25mLmgKLXBuZ3RyYW5zJChPKTogcG5nLmggcG5nY29uZi5oCi1wbmd3aW8kKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaAotcG5nd3JpdGUkKE8pOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d0cmFuJChPKTogcG5nLmggcG5nY29uZi5oCi1wbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCi1wbmd0ZXN0JChPKTogIHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5pbnRlbCBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuaW50ZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjllNTEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5pbnRlbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBsaWJwbmcKLSMgTWljcm9zb2Z0IFZpc3VhbCBDKysgd2l0aCBJbnRlbCBDL0MrKyBDb21waWxlciA0LjAgYW5kIGxhdGVyCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDIwMDAsIFBhd2VsIE1yb2NoZW4sIGJhc2VkIG9uIG1ha2VmaWxlLm1zYyB3aGljaCBpcwotIyBjb3B5cmlnaHQgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgVG8gdXNlLCBkbyAibm1ha2UgL2Ygc2NyaXB0c1xtYWtlZmlsZS5pbnRlbCIKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tIEludGVsIEMvQysrIENvbXBpbGVyIDQuMCBhbmQgbGF0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLVpMSUJMSUI9Li5cemxpYgotWkxJQklOQz0uLlx6bGliCi0KLSMgVGFyZ2V0IENQVQotQ1BVPTYJCSMgUGVudGl1bSBJSQotI0NQVT01CQkjIFBlbnRpdW0KLQotIyBDYWxsaW5nIGNvbnZlbnRpb24KLUNBTExJTkc9cgkjIF9fZmFzdGNhbGwKLSNDQUxMSU5HPXoJIyBfX3N0ZGNhbGwKLSNDQUxMSU5HPWQJIyBfX2NkZWNsCi0KLSMgVW5jb21tZW50IG5leHQgdG8gcHV0IGVycm9yIG1lc3NhZ2VzIGluIGEgZmlsZQotI0VSUkZJTEU9Pj5wbmdlcnJzCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ0M9aWNsIC1jCi1DRkxBR1M9LU8yIC1HJChDUFUpJChDQUxMSU5HKSAtUWlwIC1RdW5yb2xsNCAtSSQoWkxJQklOQykgLW5vbG9nbwotTEQ9bGluawotTERGTEFHUz0vU1VCU1lTVEVNOkNPTlNPTEUgL05PTE9HTwotCi1PPS5vYmoKLQotT0JKUz1wbmckKE8pIHBuZ3NldCQoTykgcG5nZ2V0JChPKSBwbmdydXRpbCQoTykgcG5ndHJhbnMkKE8pIHBuZ3d1dGlsJChPKSBcCi1wbmdtZW0kKE8pIHBuZ3ByZWFkJChPKSBwbmdyZWFkJChPKSBwbmdlcnJvciQoTykgcG5nd3JpdGUkKE8pIFwKLXBuZ3J0cmFuJChPKSBwbmd3dHJhbiQoTykgcG5ncmlvJChPKSBwbmd3aW8kKE8pCi0KLWFsbDogdGVzdAotCi1wbmckKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3NldCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nZ2V0JChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdyZWFkJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdwcmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncnRyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3J1dGlsJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdlcnJvciQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nbWVtJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdyaW8kKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3dpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ndHJhbnMkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3dyaXRlJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3dHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3V0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLWxpYnBuZy5saWI6ICQoT0JKUykKLQlpZiBleGlzdCBsaWJwbmcubGliIGRlbCBsaWJwbmcubGliCi0JbGliIC9OT0xPR08gL09VVDpsaWJwbmcubGliICQoT0JKUykKLQotcG5ndGVzdC5leGU6IHBuZ3Rlc3Qub2JqIGxpYnBuZy5saWIKLQkkKExEKSAkKExERkxBR1MpIC9PVVQ6cG5ndGVzdC5leGUgcG5ndGVzdC5vYmogbGlicG5nLmxpYiAkKFpMSUJMSUIpXHpsaWIubGliCi0KLXBuZ3Rlc3QkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXRlc3Q6IHBuZ3Rlc3QuZXhlCi0JcG5ndGVzdC5leGUKLQotCi0jIEVuZCBvZiBtYWtlZmlsZSBmb3IgbGlicG5nCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmtuciBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUua25yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDE3MzU5Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUua25yCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgVGhpcyBtYWtlZmlsZSByZXF1aXJlcyB0aGUgZmlsZSBhbnNpMmtuci5jLCB3aGljaCB5b3UgY2FuIGdldAotIyBmcm9tIHRoZSBHaG9zdHNjcmlwdCBmdHAgc2l0ZSBhdCBmdHA6Ly9mdHAuY3Mud2lzYy5lZHUvZ2hvc3QvCi0jIElmIHlvdSBoYXZlIGxpYmpwZWcsIHlvdSBwcm9iYWJseSBhbHJlYWR5IGhhdmUgYW5zaTJrbnIuYyBpbiB0aGUganBlZwotIyBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChwcmVmaXgpL2xpYgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1DQz1jYwotQ0ZMQUdTPS1JLi4vemxpYiAtTwotTERGTEFHUz0tTC4gLUwuLi96bGliLyAtbHBuZyAtbHogLWxtCi0jIGZsYWdzIGZvciBhbnNpMmtucgotQU5TSTJLTlJGTEFHUz0KLQotUkFOTElCPXJhbmxpYgotI1JBTkxJQj1lY2hvCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotYWxsOiBhbnNpMmtuciBsaWJwbmcuYSBwbmd0ZXN0Ci0KLSMgZ2VuZXJhbCBydWxlIHRvIGFsbG93IGFuc2kya25yIHRvIHdvcmsKLS5jLm86Ci0JLi9hbnNpMmtuciAkKi5jIFQkKi5jCi0JJChDQykgJChDRkxBR1MpIC1jIFQkKi5jCi0Jcm0gLWYgVCQqLmMgJCoubwotCW12IFQkKi5vICQqLm8KLQotYW5zaTJrbnI6IGFuc2kya25yLmMKLQkkKENDKSAkKENGTEFHUykgJChBTlNJMktOUkZMQUdTKSAtbyBhbnNpMmtuciBhbnNpMmtuci5jCi0KLWxpYnBuZy5hOiBhbnNpMmtuciAkKE9CSlMpCi0JYXIgcmMgJEAgICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1pbnN0YWxsOiBsaWJwbmcuYSBwbmcuaCBwbmdjb25mLmgKLQktQG1rZGlyICQoREVTVERJUikkKElOQ1BBVEgpCi0JLUBta2RpciAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQktQG1rZGlyICQoREVTVERJUikkKExJQlBBVEgpCi0JLUBybSAtZiAkKERFU1RESVIpJChJTkNQQVRIKS9wbmcuaAotCS1Acm0gLWYgJChERVNURElSKSQoSU5DUEFUSCkvcG5nY29uZi5oCi0JY3AgcG5nLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JY3AgcG5nY29uZi5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nLmgKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZ2NvbmYuaAotCShjZCAkKERFU1RESVIpJChJTkNQQVRIKTsgbG4gLWYgLXMgbGlicG5nLyogLikKLQljcCBsaWJwbmcuYSAkKERFU1RESVIpJChMSUJQQVRIKQotCWNobW9kIDY0NCAkKERFU1RESVIpJChMSUJQQVRIKS9saWJwbmcuYQotCi1jbGVhbjoKLQlybSAtZiAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nIGFuc2kya25yCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oCi1wbmd3aW8ubzogcG5nLmggcG5nY29uZi5oCi1wbmdtZW0ubzogcG5nLmggcG5nY29uZi5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oCi1wbmdnZXQubzogcG5nLmggcG5nY29uZi5oCi1wbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oCi1wbmdydHJhbi5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3cml0ZS5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmxpbnV4IGIvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5saW51eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5NWJjMC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLmxpbnV4CisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZy5hIGFuZCBsaWJwbmcxMi5zbyBvbiBMaW51eCBFTEYgd2l0aCBnY2MKLSMgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAyLCAyMDA2LCAyMDA4IEdyZWcgUm9lbG9mcyBhbmQKLSMgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTIKLVBOR01BSiA9IDAKLVBOR01JTiA9IDEuMi4zNwotUE5HVkVSID0gJChQTkdNQUopLiQoUE5HTUlOKQotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPVkVSPSQoTElCTkFNRSkuc28uJChQTkdWRVIpCi1PTERTTz1saWJwbmcuc28KLU9MRFNPTUFKPWxpYnBuZy5zby4zCi1PTERTT1ZFUj1saWJwbmcuc28uMy4kKFBOR01JTikKLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Z2NjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtc2YKLVJBTkxJQj1yYW5saWIKLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIHdoZXJlICJtYWtlIGluc3RhbGwiIHB1dHMgbGlicG5nMTIuYSwgbGlicG5nMTIuc28qLAotIyBsaWJwbmcxMi9wbmcuaCBhbmQgbGlicG5nMTIvcG5nY29uZi5oCi0jIFByZWZpeCBtdXN0IGJlIGEgZnVsbCBwYXRobmFtZS4KLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkLgotI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKLSNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotWkxJQkxJQj0uLi96bGliCi1aTElCSU5DPS4uL3psaWIKLQotQUxJR049Ci0jIGZvciBpMzg2OgotI0FMSUdOPS1tYWxpZ24tbG9vcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotCi0jIGZvciBwZ2NjIHZlcnNpb24gMi45NS4xLCAtTzMgaXMgYnVnZ3k7IGRvbid0IHVzZSBpdC4KLQotQ0ZMQUdTPS1JJChaTElCSU5DKSAtVyAtV2FsbCAtTzMgLWZ1bnJvbGwtbG9vcHMgLURQTkdfTk9fTU1YX0NPREUgXAotCSQoQUxJR04pICMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotCi1MREZMQUdTPS1MLiAtV2wsLXJwYXRoLC4gLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSAtbHBuZzEyIC1seiAtbG0KLUxERkxBR1NfQT0tTCQoWkxJQkxJQikgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIGxpYnBuZy5hIC1seiAtbG0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9ICBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpIC1mUElDIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IHBuZ3Rlc3Qtc3RhdGljIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxMiEtbHBuZzEyXCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBSX29wdHM9XCItV2wsLXJwYXRoLCQoTElCUEFUSClcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTIgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChMSUJTT1ZFUikKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKQotCi0kKExJQlNPVkVSKTogJChPQkpTRExMKQotCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsJChMSUJTT01BSikgLW8gJChMSUJTT1ZFUikgJChPQkpTRExMKQotCi0kKE9MRFNPVkVSKTogJChPQkpTRExMKQotCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsJChPTERTT01BSikgXAotCS1vICQoT0xEU09WRVIpIFwKLQkkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXBuZ3Rlc3Qtc3RhdGljOiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0LXN0YXRpYyAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHU19BKQotCi10ZXN0OiBwbmd0ZXN0IHBuZ3Rlc3Qtc3RhdGljCi0JQGVjaG8gIiIKLQlAZWNobyAiICAgUnVubmluZyBwbmd0ZXN0IGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoICQoTElCU08pOiIKLQlAZWNobyAiIgotCS4vcG5ndGVzdAotCUBlY2hvICIiCi0JQGVjaG8gIiAgIFJ1bm5pbmcgcG5ndGVzdCBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoIGxpYnBuZy5hOiIKLQlAZWNobyAiIgotCS4vcG5ndGVzdC1zdGF0aWMKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT1ZFUikgbGlicG5nLnBjIFwKLQkkKE9MRFNPVkVSKQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1ZFUikqICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09WRVIpKgotCWNwICQoTElCU09WRVIpICQoREwpCi0JY3AgJChPTERTT1ZFUikgJChETCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1ZFUikKLQljaG1vZCA3NTUgJChETCkvJChPTERTT1ZFUikKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKE9MRFNPVkVSKSAkKE9MRFNPTUFKKTsgXAotCSQoTE5fU0YpICQoT0xEU09NQUopICQoT0xEU08pOyBcCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTT01BSik7IFwKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgLVdsLCAtcnBhdGgsJChETCkgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQkkKENDKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBsaWJwbmctY29uZmlnIFwKLQkkKExJQlNPKSAkKExJQlNPTUFKKSogcG5ndGVzdC1zdGF0aWMgcG5ndGVzdGkgXAotCSQoT0xEU09WRVIpIFwKLQlsaWJwbmcucGMKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5taW5ndyBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubWluZ3cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OTQ5M2IuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5taW5ndworKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBtaW5ndyBvbiB4ODYKLSMgICBCdWlsZHMgYm90aCBkbGwgKHdpdGggaW1wb3J0IGxpYikgYW5kIHN0YXRpYyBsaWIgdmVyc2lvbnMKLSMgICBvZiB0aGUgbGlicmFyeSwgYW5kIGJ1aWxkcyB0d28gY29waWVzIG9mIHBuZ3Rlc3Q6IG9uZQotIyAgIHN0YXRpY2FsbHkgbGlua2VkIGFuZCBvbmUgZHluYW1pY2FsbHkgbGlua2VkLgotIwotIyBCdWlsdCBmcm9tIG1ha2VmaWxlLmN5Z3dpbgotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMDggU29yZW4gQW5kZXJzb24sIENoYXJsZXMgV2lsc29uLAotIyAgICBhbmQgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBiYXNlZCBvbiBtYWtlZmlsZSBmb3IgbGludXgtZWxmIHcvbW14IGJ5OgotIyBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCwgMjAwNyBHcmVnIFJvZWxvZnMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi0KLSMgVGhpcyBtYWtlZmlsZSBpbnRlbmRzIHRvIHN1cHBvcnQgYnVpbGRpbmcgb3V0c2lkZSB0aGUgc3JjIGRpcmVjdG9yeQotIyBpZiBkZXNpcmVkLiBXaGVuIGludm9raW5nIGl0LCBzcGVjaWZ5IGFuIGFyZ3VtZW50IHRvIFNSQ0RJUiBvbiB0aGUKLSMgY29tbWFuZCBsaW5lIHRoYXQgcG9pbnRzIHRvIHRoZSB0b3Agb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3VyIHNvdXJjZQotIyBpcyBsb2NhdGVkLgotaWZkZWYgU1JDRElSCi1WUEFUSCA9ICQoU1JDRElSKQotZWxzZQotU1JDRElSID0gLgotZW5kaWYKLQotIyBPdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotIyBJZiB5b3UncmUgdXNpbmcgYSBjcm9zcy1jb21waWxlciwgYWRkIHRoZSBhcHByb3ByaWF0ZSBwcmVmaXggKGUuZy4sCi0jICJpMzg2LW1pbmd3MzJtc3ZjLSIpIHRvIHRoZSBmb2xsb3dpbmcgdGhyZWUgY29tbWFuZHM6Ci1DQz1nY2MKLUFSPWFyCi1SQU5MSUI9cmFubGliCi0KLU1LRElSX1A9L2Jpbi9ta2RpciAtcHYKLQotIyBXaGVyZSAibWFrZSBpbnN0YWxsIiBwdXRzIGxpYnBuZyouYSwgKnBuZyouZGxsLCBwbmcuaCwgYW5kIHBuZ2NvbmYuaAotaWZuZGVmIHByZWZpeAotcHJlZml4PS91c3IKLSQod2FybmluZyAiWW91IGhhdmVuJ3Qgc3BlY2lmaWVkIGEgJ3ByZWZpeD0nIGxvY2F0aW9uLiBEZWZhdWx0aW5nIHRvICcvdXNyJyIpCi1lbmRpZgotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotWkxJQkxJQj0gL3Vzci9saWIKLVpMSUJJTkM9Ci0KLUFMSUdOPQotIyBmb3IgaTM4NjoKLSNBTElHTj0tbWFsaWduLWxvb3BzPTIgLW1hbGlnbi1mdW5jdGlvbnM9MgotCi1XQVJOTU9SRT0tV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1Xc2hhZG93IFwKLQktV21pc3NpbmctZGVjbGFyYXRpb25zIC1XdHJhZGl0aW9uYWwgLVdjYXN0LWFsaWduIFwKLQktV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzICMtV2NvbnZlcnNpb24KLQotIyMjIGlmIHlvdSBkb24ndCBuZWVkIHRocmVhZCBzYWZldHksIGJ1dCB3YW50IHRoZSBhc20gYWNjZWwKLSNDRkxBR1M9ICQoc3RyaXAgJChNSU5HV19DQ0ZMQUdTKSAtRFBOR19USFJFQURfVU5TQUZFX09LIFwKLSMJJChhZGRwcmVmaXggLUksJChaTElCSU5DKSkgLVcgLVdhbGwgLU8gJChBTElHTikgLWZ1bnJvbGwtbG9vcHMgXAotIwktZm9taXQtZnJhbWUtcG9pbnRlcikgICMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotIyMjIGlmIHlvdSBuZWVkIHRocmVhZCBzYWZldHkgYW5kIHdhbnQgKG1pbmltYWwpIGFzbSBhY2NlbAotI0NGTEFHUz0gJChzdHJpcCAkKE1JTkdXX0NDRkxBR1MpICQoYWRkcHJlZml4IC1JLCQoWkxJQklOQykpIFwKLSMJLVcgLVdhbGwgLU8gJChBTElHTikgLWZ1bnJvbGwtbG9vcHMgXAotIwktZm9taXQtZnJhbWUtcG9pbnRlcikgICMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotIyMjIE5vcm1hbCAobm9uLWFzbSkgY29tcGlsYXRpb24KLUNGTEFHUz0gJChzdHJpcCAkKE1JTkdXX0NDRkxBR1MpICQoYWRkcHJlZml4IC1JLCQoWkxJQklOQykpIFwKLSAgICAgICAgLVcgLVdhbGwgLU8zICQoQUxJR04pIC1mdW5yb2xsLWxvb3BzIC1EUE5HX05PX01NWF9DT0RFIFwKLQktZm9taXQtZnJhbWUtcG9pbnRlcikgIyAkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci0KLUxJQk5BTUUgPSBsaWJwbmcxMgotUE5HTUFKID0gMAotTUlOR0RMTCA9IDEyCi1QTkdNSU4gPSAxLjIuMzcKLVBOR1ZFUiA9ICQoUE5HTUFKKS4kKFBOR01JTikKLQotU0hBUkVETElCPWxpYnBuZyQoTUlOR0RMTCkuZGxsCi1TVEFUTElCPWxpYnBuZy5hCi1JTVBMSUI9bGlicG5nLmRsbC5hCi1TSEFSRURERUY9bGlicG5nLmRlZgotTElCUz0kKFNIQVJFRExJQikgJChTVEFUTElCKQotRVhFPS5leGUKLQotTERGTEFHUz0kKHN0cmlwIC1MLiAkKE1JTkdXX0xERkxBR1MpIC1scG5nICQoYWRkcHJlZml4IC1MLCQoWkxJQkxJQikpIC1seikKLUxEU0ZMQUdTPSQoc3RyaXAgLXNoYXJlZCAtTC4gICQoTUlOR1dfTERGTEFHUykpCi1MREVYVFJBPS1XbCwtLW91dC1pbXBsaWI9JChJTVBMSUIpICQoYWRkcHJlZml4IC1MLCQoWkxJQkxJQikpIC1segotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1NQU4zUEFUSD0kKE1BTlBBVEgpL21hbjMKLU1BTjVQQVRIPSQoTUFOUEFUSCkvbWFuNQotCi0jIGNvc21ldGljOiBzaG9ydGVuZWQgc3RyaW5nczoKLVMgPSQoU1JDRElSKQotRCA9JChERVNURElSKQotREIgPSQoRCkkKEJJTlBBVEgpCi1ESSA9JChEKSQoSU5DUEFUSCkKLURMID0kKEQpJChMSUJQQVRIKQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6IC5jIC5vIC5waWMubwotCi0lLm8gOiAlLmMKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLSUucGljLm8gOiBDRkxBR1MgKz0gLURQTkdfQlVJTERfRExMCi0lLnBpYy5vIDogJS5jCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWFsbDogYWxsLXN0YXRpYyBhbGwtc2hhcmVkIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLSMgTWFrZSB0aGlzIHRvIHZlcmlmeSB0aGF0ICJtYWtlIFsuLi5dIGluc3RhbGwiIHdpbGwgZG8gd2hhdCB5b3Ugd2FudC4KLWJ1aWxkc2V0dXAtdGVsbDoKLQlAZWNobyAgVlBBVEggaXMgc2V0IHRvOiBcIiQoVlBBVEgpXCIKLQlAZWNobyAgcHJlZml4IGlzIHNldCB0bzogXCIkKHByZWZpeClcIgotCUBlY2hvIC1lIElOQ1BBVEgsTElCUEFUSCwgZXRjLiBhcmUgc2V0IHRvOidcbicgXAotICQoYWRkcHJlZml4ICQoRCksJChJTkNQQVRIKSdcbicgJChMSUJQQVRIKSdcbicgJChCSU5QQVRIKSdcbicgXAotICAgJChNQU5QQVRIKSdcbicgJChNQU4zUEFUSCknXG4nICQoTUFONVBBVEgpJ1xuJyknXG4nCi0KLWxpYnBuZy5wYzogc2NyaXB0cy9saWJwbmcucGMuaW4KLQlAZWNobyAtZSBNYWtpbmcgcGtnLWNvbmZpZyBmaWxlIGZvciB0aGlzIGxpYnBuZyBpbnN0YWxsYXRpb24uLidcbicgXAotICAgICAgICAgICB1c2luZyBQUkVGSVg9XCIkKHByZWZpeClcIidcbicKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxMiEtbHBuZzEyXCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzogc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW4gc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4KLQlAZWNobyAtZSBNYWtpbmcgJChMSUJOQU1FKSBsaWJwbmctY29uZmlnIGZpbGUgZm9yIHRoaXMgbGlicG5nIFwKLSBpbnN0YWxsYXRpb24uLidcbicgdXNpbmcgUFJFRklYPVwiJChwcmVmaXgpXCInXG4nCi0JKCBjYXQgJChTKS9zY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmckKE1JTkdETEwpIC1selwiOyBcCi0JY2F0ICQoUykvc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLXN0YXRpYzogYWxsLXN0YXRpYwotc2hhcmVkOiBhbGwtc2hhcmVkCi1hbGwtc3RhdGljOiAkKFNUQVRMSUIpIHBuZ3Rlc3Qtc3RhdCQoRVhFKQotYWxsLXNoYXJlZDogJChTSEFSRURMSUIpIHBuZ3Rlc3QkKEVYRSkKLQotJChTVEFUTElCKTogJChPQkpTKQotCSQoQVIpIHJjICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotJChTSEFSRURERUYpOiBzY3JpcHRzL3BuZ3czMi5kZWYKLQljYXQgJDwgfCBzZWQgLWUgJzF7RztzL15cKC4qXClcKFxuXCkvRVhQT1JUUy87fTsyLC9eRVhQT1JUUy9kJyB8IFwKLQlzZWQgLWUgJ3MvXChbXjtdKlwpOy87LycgPiAkQAotCi0kKFNIQVJFRExJQik6ICQoT0JKU0RMTCkgJChTSEFSRURERUYpCi0JJChDQykgJChMRFNGTEFHUykgLW8gJEAgJChPQkpTRExMKSAtTC4gJChMREVYVFJBKQotCi1wbmd0ZXN0JChFWEUpOiBwbmd0ZXN0LnBpYy5vICQoU0hBUkVETElCKQotCSQoQ0MpICQoQ0ZMQUdTKSAkPCAkKExERkxBR1MpIC1vICRACi0KLXBuZ3Rlc3Qtc3RhdCQoRVhFKTogcG5ndGVzdC5vICQoU1RBVExJQikKLQkkKENDKSAtc3RhdGljICQoQ0ZMQUdTKSAkPCAkKExERkxBR1MpIC1vICRACi0KLXRlc3Q6IHRlc3Qtc3RhdGljIHRlc3Qtc2hhcmVkCi0KLXRlc3Qtc3RhdGljOiBwbmd0ZXN0LXN0YXQkKEVYRSkKLQkuL3BuZ3Rlc3Qtc3RhdCAkKFMpL3BuZ3Rlc3QucG5nCi0KLXRlc3Qtc2hhcmVkOiBwbmd0ZXN0JChFWEUpCi0JLi9wbmd0ZXN0ICQoUykvcG5ndGVzdC5wbmcKLQotaW5zdGFsbC1zdGF0aWM6ICQoU1RBVExJQikgaW5zdGFsbC1oZWFkZXJzIGluc3RhbGwtbWFuCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWluc3RhbGwgLW0gNjQ0ICQoU1RBVExJQikgJChETCkvJChMSUJOQU1FKS5hCi0JLUBybSAtZiAkKERMKS8kKFNUQVRMSUIpCi0JKGNkICQoREwpOyBsbiAtc2YgJChMSUJOQU1FKS5hICQoU1RBVExJQikpCi0KLWluc3RhbGwtc2hhcmVkOiAkKFNIQVJFRExJQikgbGlicG5nLnBjIGxpYnBuZy1jb25maWcgaW5zdGFsbC1oZWFkZXJzIGluc3RhbGwtbWFuCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQC9iaW4vcm0gLWYgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQC9iaW4vcm0gLWYgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWluc3RhbGwgLW0gNjQ0ICQoSU1QTElCKSAkKERMKS8kKExJQk5BTUUpLmRsbC5hCi0JLUBybSAtZiAkKERMKS8kKElNUExJQikKLQkoY2QgJChETCk7IGxuIC1zZiAkKExJQk5BTUUpLmRsbC5hICQoSU1QTElCKSkKLQlpbnN0YWxsIC1zIC1tIDc1NSAkKFNIQVJFRExJQikgJChEQikKLQlpbnN0YWxsIC1tIDY0NCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyBsbiAtc2YgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtaGVhZGVyczoKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQktQHJtIC1mICQoREkpL3BuZy5oCi0JLUBybSAtZiAkKERJKS9wbmdjb25mLmgKLQlpbnN0YWxsIC1tIDY0NCAkKFMpL3BuZy5oICQoUykvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQktQHJtIC1mICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgbG4gLXNmICQoTElCTkFNRSkgbGlicG5nOyBsbiAtc2YgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtbWFuOgotCS1AaWYgWyAhIC1kICQoRCkkKE1BTjNQQVRIKSBdOyB0aGVuICQoTUtESVJfUCkgJChEKSQoTUFOM1BBVEgpOyBmaQotCS1AaWYgWyAhIC1kICQoRCkkKE1BTjVQQVRIKSBdOyB0aGVuICQoTUtESVJfUCkgJChEKSQoTUFONVBBVEgpOyBmaQotCWluc3RhbGwgLW0gNjQ0ICQoUykvbGlicG5ncGYuMyAkKFMpL2xpYnBuZy4zICQoRCkkKE1BTjNQQVRIKQotCWluc3RhbGwgLW0gNjQ0ICQoUykvcG5nLjUgJChEKSQoTUFONVBBVEgpCi0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AL2Jpbi9ybSAtZiAkKERCKS9saWJwbmctY29uZmlnCi0JLUAvYmluL3JtIC1mICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgbG4gLXNmICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLSMgUnVuIHRoaXMgdG8gdmVyaWZ5IHRoYXQgYSBmdXR1cmUgYGNvbmZpZ3VyZScgcnVuIHdpbGwgcGljayB1cCB0aGUgc2V0dGluZ3MKLSMgeW91IHdhbnQuCi10ZXN0LWNvbmZpZy1pbnN0YWxsOiBTSEVMTD0vYmluL2Jhc2gKLXRlc3QtY29uZmlnLWluc3RhbGw6ICQoREIpL2xpYnBuZy1jb25maWcKLQlAZWNobyAtZSBUZXN0aW5nIGxpYnBuZy1jb25maWcgZnVuY3Rpb25zLi4uJ1xuJwotCUAgZm9yIFRZUkEgaW4gTERGTEFHUyBDUFBGTEFHUyBDRkxBR1MgTElCUyBWRVJTSU9OOyBcCi0gICBkbyBcCi0gICAgcHJpbnRmICIoJWQpXHQgJTEwcyA9JXNcbiIgJCQoKCQkZ3l0aXUgKyAxKSkgJCRUWVJBIFwKLSAgICAiJCQoJChEQikvbGlicG5nLWNvbmZpZyBgZWNobyAtLSQkVFlSQSB8dHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XSdgKSI7IFwKLSAgICBneXRpdT0kJCgoICQkZ3l0aXUgKyAxICkpOyBcCi0gICBkb25lCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpICQoQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvbGlicG5nMTItY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS9saWJwbmcxMi1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JJChDQykgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS9saWJwbmcxMi1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0aSQoRVhFKSBgJChCSU5QQVRIKS9saWJwbmcxMi1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkkKEVYRSkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JL2Jpbi9ybSAtZiAqLnBpYy5vICoubyAkKFNUQVRMSUIpICQoSU1QTElCKSAkKFNIQVJFRExJQikgXAotCSAgIHBuZ3Rlc3Qtc3RhdCQoRVhFKSBwbmd0ZXN0JChFWEUpIHBuZ291dC5wbmcgJChTSEFSRURERUYpIFwKLQkgICBsaWJwbmctY29uZmlnIGxpYnBuZy5wYyBwbmd0ZXN0aSQoRVhFKQotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0uUEhPTlk6IGJ1aWxkc2V0dXAtdGVsbCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZyB0ZXN0LWNvbmZpZy1pbnN0YWxsIGNsZWFuCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZy5jCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5nZXJyb3IuYwotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3Jpby5jCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5nd2lvLmMKLXBuZ21lbS5vIHBuZ21lbS5waWMubzoJCXBuZy5oIHBuZ2NvbmYuaCBwbmdtZW0uYwotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3NldC5jCi1wbmdnZXQubyBwbmdnZXQucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5nZ2V0LmMKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncmVhZC5jCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncnRyYW4uYwotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3J1dGlsLmMKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmd0cmFucy5jCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5nd3JpdGUuYwotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3d0cmFuLmMKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmd3dXRpbC5jCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ncHJlYWQuYwotCi1wbmd0ZXN0Lm8gcG5ndGVzdC5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3Rlc3QuYwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5taXBzIGIvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5taXBzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmY5Y2Y5Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubWlwcworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChwcmVmaXgpL2xpYgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1DQz1jYwotQ0ZMQUdTPS1JLi4vemxpYiAtTyAtc3lzdHlwZSBzeXN2IC1EU1lTViAtdyAtRG1pcHMKLSNDRkxBR1M9LU8KLUxERkxBR1M9LUwuIC1MLi4vemxpYi8gLWxwbmcgLWx6IC1sbQotCi0jUkFOTElCPXJhbmxpYgotUkFOTElCPWVjaG8KLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1hbGw6IGxpYnBuZy5hIHBuZ3Rlc3QKLQotbGlicG5nLmE6ICQoT0JKUykKLQlhciByYyAkQCAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGw6IGxpYnBuZy5hCi0JLUBta2RpciAkKERFU1RESVIpJChJTkNQQVRIKQotCS1AbWtkaXIgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JLUBta2RpciAkKERFU1RESVIpJChMSUJQQVRIKQotCS1Acm0gLWYgJChERVNURElSKSQoSU5DUEFUSCkvcG5nLmgKLQktQHJtIC1mICQoREVTVERJUikkKElOQ1BBVEgpL3BuZ2NvbmYuaAotCWNwIHBuZy5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNwIHBuZ2NvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZy5oCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdjb25mLmgKLQkoY2QgJChERVNURElSKSQoSU5DUEFUSCk7IGxuIC1mIC1zIGxpYnBuZy8qIC4pCi0JY3AgbGlicG5nLmEgJChERVNURElSKSQoTElCUEFUSCkKLQljaG1vZCA2NDQgJChERVNURElSKSQoTElCUEFUSCkvbGlicG5nLmEKLQotY2xlYW46Ci0Jcm0gLWYgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oCi1wbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5tc2MgYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm1zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhMmM0YS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm1zYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCi0jIENvcHlyaWdodCAoQykgMjAwNiwgMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0jIEFzc3VtZXMgdGhhdCB6bGliLmxpYiwgemNvbmYuaCwgYW5kIHpsaWIuaCBoYXZlIGJlZW4gY29waWVkIHRvIC4uXHpsaWIKLQotIyAtLS0tLS0tLSBNaWNyb3NvZnQgQyA1LjEgYW5kIGxhdGVyLCBkb2VzIG5vdCB1c2UgYXNzZW1ibGVyIGNvZGUgLS0tLS0tLS0KLU1PREVMPUwKLUNGTEFHUz0tT2FpdCAtR3MgLW5vbG9nbyAtVzMgLUEkKE1PREVMKSAtSS4uXHpsaWIKLSMtT3ggZ2VuZXJhdGVzIGJhZCBjb2RlIHdpdGggTVNDIDUuMQotQ0M9Y2wKLUxEPWxpbmsKLUxERkxBR1M9L2Uvc3Q6MHgxNTAwL25vZQotTz0ub2JqCi0KLSN1bmNvbW1lbnQgbmV4dCB0byBwdXQgZXJyb3IgbWVzc2FnZXMgaW4gYSBmaWxlCi1FUlJGSUxFPSA+PiBwbmdlcnJzCi0KLSMgdmFyaWFibGVzCi1PQkpTMSA9IHBuZyQoTykgcG5nc2V0JChPKSBwbmdnZXQkKE8pIHBuZ3J1dGlsJChPKSBwbmd0cmFucyQoTykgcG5nd3V0aWwkKE8pCi1PQkpTMiA9IHBuZ21lbSQoTykgcG5ncHJlYWQkKE8pIHBuZ3JlYWQkKE8pIHBuZ2Vycm9yJChPKSBwbmd3cml0ZSQoTykKLU9CSlMzID0gcG5ncnRyYW4kKE8pIHBuZ3d0cmFuJChPKSBwbmdyaW8kKE8pIHBuZ3dpbyQoTykKLQotYWxsOiBsaWJwbmcubGliCi0KLXBuZyQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCQkgICQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nc2V0JChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdnZXQkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3JlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3ByZWFkJChPKTogcG5nLmggcG5nY29uZi5oCi0JCSAgJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdydHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncnV0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ2Vycm9yJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdtZW0kKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3JpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd2lvJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd0cmFucyQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3JpdGUkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3d0cmFuJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotbGlicG5nLmxpYjogJChPQkpTMSkgJChPQkpTMikgJChPQkpTMykKLQlkZWwgbGlicG5nLmxpYgotCWxpYiBsaWJwbmcgJChPQkpTMSk7Ci0JbGliIGxpYnBuZyAkKE9CSlMyKTsKLQlsaWIgbGlicG5nICQoT0JKUzMpOwotCi1wbmd0ZXN0JChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd0ZXN0LmV4ZTogcG5ndGVzdC5vYmogbGlicG5nLmxpYgotCSQoTEQpICQoTERGTEFHUykgcG5ndGVzdC5vYmosLCxsaWJwbmcubGliIC4uXHpsaWJcemxpYi5saWIgOwotCi10ZXN0OiBwbmd0ZXN0LmV4ZQotCXBuZ3Rlc3QKLQotIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZwotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm5lMTJic2QgYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm5lMTJic2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODQ2YjUuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5uZTEyYnNkCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIGZvciBOZXRCU0QgZm9yIHRoZSBzdGFuZGFyZAotIyBtYWtlIG9iaiAmJiBtYWtlIGRlcGVuZCAmJiBtYWtlICYmIG1ha2UgdGVzdAotIyBtYWtlIGluY2x1ZGVzICYmIG1ha2UgaW5zdGFsbAotIyBDb3B5cmlnaHQgKEMpIDIwMDIgUGF0cmljayBSLkwuIFdlbGNoZQotIyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi0jIFlvdSBzaG91bGQgYWxzbyBydW4gbWFrZWZpbGUubmV0YnNkCi0KLUxPQ0FMQkFTRT89L3Vzci9sb2NhbAotTElCRElSPQkke0xPQ0FMQkFTRX0vbGliCi1NQU5ESVI9ICR7TE9DQUxCQVNFfS9tYW4KLUlOQ1NESVI9JHtMT0NBTEJBU0V9L2luY2x1ZGUvbGlicG5nMTIKLQotTElCPQlwbmcxMgotU0hMSUJfTUFKT1I9CTAKLVNITElCX01JTk9SPQkxLjIuMzcKLVNSQ1M9CXBuZy5jIHBuZ3NldC5jIHBuZ2dldC5jIHBuZ3J1dGlsLmMgcG5ndHJhbnMuYyBwbmd3dXRpbC5jIFwKLQlwbmdyZWFkLmMgcG5ncmlvLmMgcG5nd2lvLmMgcG5nd3JpdGUuYyBwbmdydHJhbi5jIFwKLQlwbmd3dHJhbi5jIHBuZ21lbS5jIHBuZ2Vycm9yLmMgcG5ncHJlYWQuYwotSU5DUz0JcG5nLmggcG5nY29uZi5oCi1NQU49CWxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQotQ1BQRkxBR1MrPS1JJHsuQ1VSRElSfQotCi0jIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoaXMgaW5zdGVhZCBvZiB0aGUgbWFudWFsCi0jIHVuY29tbWVudGluZywgYnV0IGl0IGNvcmUgZHVtcHMgZm9yIG1lIGF0IHRoZSBtb21lbnQ6Ci0jIC5pZiAke01BQ0hJTkVfQVJDSH0gPT0gImkzODYiCi0jICAgQ1BQRkxBR1MrPS1EUE5HX1RIUkVBRF9VTlNBRkVfT0sKLSMgICBNS0xJTlQ9IG5vCi0jIC5lbHNlCi0gICAgQ1BQRkxBR1MrPS1EUE5HX05PX01NWF9DT0RFCi0jIC5lbmRpZgotCi1DTEVBTkZJTEVTKz1wbmd0ZXN0Lm8gcG5ndGVzdAotCi1wbmd0ZXN0Lm86CXBuZ3Rlc3QuYwotCSR7Q0N9IC1jICR7Q1BQRkxBR1N9ICR7Q0ZMQUdTfSAkey5BTExTUkN9IC1vICR7LlRBUkdFVH0KLQotcG5ndGVzdDoJcG5ndGVzdC5vIGxpYnBuZy5hCi0JJHtDQ30gJHtMREZMQUdTfSAkey5BTExTUkN9IC1vJHsuVEFSR0VUfSAtbHogLWxtCi0KLXRlc3Q6CXBuZ3Rlc3QKLQljZCAkey5DVVJESVJ9ICYmICR7Lk9CSkRJUn0vcG5ndGVzdAotCi0uaW5jbHVkZSA8YnNkLmxpYi5taz4KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUubmV0YnNkIGIvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5uZXRic2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjkwYzEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5uZXRic2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgZm9yIE5ldEJTRCBmb3IgdGhlIHN0YW5kYXJkCi0jIG1ha2Ugb2JqICYmIG1ha2UgZGVwZW5kICYmIG1ha2UgJiYgbWFrZSB0ZXN0Ci0jIG1ha2UgaW5jbHVkZXMgJiYgbWFrZSBpbnN0YWxsCi0jIENvcHlyaWdodCAoQykgMjAwMiBQYXRyaWNrIFIuTC4gV2VsY2hlCi0jIENvcHlyaWdodCAoQykgMjAwNywgMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgWW91IHNob3VsZCBhbHNvIHJ1biBtYWtlZmlsZS5uZTBic2QKLQotTE9DQUxCQVNFPz0vdXNyL2xvY2FsCi1MSUJESVI9CSR7TE9DQUxCQVNFfS9saWIKLU1BTkRJUj0gJHtMT0NBTEJBU0V9L21hbgotSU5DU0RJUj0ke0xPQ0FMQkFTRX0vaW5jbHVkZS9saWJwbmcKLQotTElCPQlwbmcKLVNITElCX01BSk9SPQkzCi1TSExJQl9NSU5PUj0JMS4yLjM3Ci1TUkNTPQlwbmcuYyBwbmdzZXQuYyBwbmdnZXQuYyBwbmdydXRpbC5jIHBuZ3RyYW5zLmMgcG5nd3V0aWwuYyBcCi0JcG5ncmVhZC5jIHBuZ3Jpby5jIHBuZ3dpby5jIHBuZ3dyaXRlLmMgcG5ncnRyYW4uYyBcCi0JcG5nd3RyYW4uYyBwbmdtZW0uYyBwbmdlcnJvci5jIHBuZ3ByZWFkLmMKLUlOQ1M9CXBuZy5oIHBuZ2NvbmYuaAotTUFOPQlsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0KLUNQUEZMQUdTKz0tSSR7LkNVUkRJUn0KLQotIyBXZSBzaG91bGQgYmUgYWJsZSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzIGluc3RlYWQgb2YgdGhlIG1hbnVhbAotIyB1bmNvbW1lbnRpbmcsIGJ1dCBpdCBjb3JlIGR1bXBzIGZvciBtZSBhdCB0aGUgbW9tZW50OgotIyAuaWYgJHtNQUNISU5FX0FSQ0h9ID09ICJpMzg2IgotIyAgIENQUEZMQUdTKz0tRFBOR19USFJFQURfVU5TQUZFX09LCi0jICAgTUtMSU5UPSBubwotIyAuZWxzZQotICAgIENQUEZMQUdTKz0tRFBOR19OT19NTVhfQ09ERQotIyAuZW5kaWYKLQotQ0xFQU5GSUxFUys9cG5ndGVzdC5vIHBuZ3Rlc3QKLQotcG5ndGVzdC5vOglwbmd0ZXN0LmMKLQkke0NDfSAtYyAke0NQUEZMQUdTfSAke0NGTEFHU30gJHsuQUxMU1JDfSAtbyAkey5UQVJHRVR9Ci0KLXBuZ3Rlc3Q6CXBuZ3Rlc3QubyBsaWJwbmcuYQotCSR7Q0N9ICR7TERGTEFHU30gJHsuQUxMU1JDfSAtbyR7LlRBUkdFVH0gLWx6IC1sbQotCi10ZXN0Oglwbmd0ZXN0Ci0JY2QgJHsuQ1VSRElSfSAmJiAkey5PQkpESVJ9L3BuZ3Rlc3QKLQotLmluY2x1ZGUgPGJzZC5saWIubWs+CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm5vbW14IGIvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5ub21teApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdmNmNjYy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm5vbW14CisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZy5hIGFuZCBsaWJwbmcxMi5zbyBvbiBMaW51eCBFTEYgd2l0aCBnY2MKLSMgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAyLCAyMDA2LTIwMDggR3JlZyBSb2Vsb2ZzIGFuZAotIyBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUUgPSBsaWJwbmcxMgotUE5HTUFKID0gMAotUE5HTUlOID0gMS4yLjM3Ci1QTkdWRVIgPSAkKFBOR01BSikuJChQTkdNSU4pCi0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNvCi1MSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQotTElCU09WRVI9JChMSUJOQU1FKS5zby4kKFBOR1ZFUikKLU9MRFNPPWxpYnBuZy5zbwotT0xEU09NQUo9bGlicG5nLnNvLjMKLU9MRFNPVkVSPWxpYnBuZy5zby4zLiQoUE5HTUlOKQotCi0jIFV0aWxpdGllczoKLUFSX1JDPWFyIHJjCi1DQz1nY2MKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotUkFOTElCPXJhbmxpYgotUk1fRj0vYmluL3JtIC1mCi0KLSMgd2hlcmUgIm1ha2UgaW5zdGFsbCIgcHV0cyBsaWJwbmcxMi5hLCBsaWJwbmcxMi5zbyosCi0jIGxpYnBuZzEyL3BuZy5oIGFuZCBsaWJwbmcxMi9wbmdjb25mLmgKLSMgUHJlZml4IG11c3QgYmUgYSBmdWxsIHBhdGhuYW1lLgotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQuCi0jWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgotI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi1aTElCTElCPS4uL3psaWIKLVpMSUJJTkM9Li4vemxpYgotCi1BTElHTj0KLSMgZm9yIGkzODY6Ci0jQUxJR049LW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIKLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi0KLSMgZm9yIHBnY2MgdmVyc2lvbiAyLjk1LjEsIC1PMyBpcyBidWdneTsgZG9uJ3QgdXNlIGl0LgotCi1DRkxBR1M9LUkkKFpMSUJJTkMpIC1XIC1XYWxsIC1PMyAtZnVucm9sbC1sb29wcyAtRFBOR19OT19NTVhfQ09ERSBcCi0JJChBTElHTikgIyAkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci0KLUxERkxBR1M9LUwuIC1XbCwtcnBhdGgsLiAtTCQoWkxJQkxJQikgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIC1scG5nMTIgLWx6IC1sbQotTERGTEFHU19BPS1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgbGlicG5nLmEgLWx6IC1sbQotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCi0KLS5jLnBpYy5vOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtZlBJQyAtbyAkQCAkKi5jCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBwbmd0ZXN0LXN0YXRpYyBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzEyIS1scG5nMTJcIC1selwgLWxtISBcCi0JLWUgcyFDZmxhZ3M6ICFDZmxhZ3M6XCAtRFBOR19OT19NTVhfQ09ERSE+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSkgLURQTkdfTk9fTU1YX0NPREVcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIFJfb3B0cz1cIi1XbCwtcnBhdGgsJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxMiAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKExJQlNPVkVSKQotCSQoTE5fU0YpICQoTElCU09WRVIpICQoTElCU09NQUopCi0KLSQoTElCU09WRVIpOiAkKE9CSlNETEwpCi0JJChDQykgLXNoYXJlZCAtV2wsLXNvbmFtZSwkKExJQlNPTUFKKSAtbyAkKExJQlNPVkVSKSAkKE9CSlNETEwpCi0KLSQoT0xEU09WRVIpOiAkKE9CSlNETEwpCi0JJChDQykgLXNoYXJlZCAtV2wsLXNvbmFtZSwkKE9MRFNPTUFKKSBcCi0JLW8gJChPTERTT1ZFUikgXAotCSQoT0JKU0RMTCkKLQotcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotcG5ndGVzdC1zdGF0aWM6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3Qtc3RhdGljICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTX0EpCi0KLXRlc3Q6IHBuZ3Rlc3QgcG5ndGVzdC1zdGF0aWMKLQlAZWNobyAiIgotCUBlY2hvICIgICBSdW5uaW5nIHBuZ3Rlc3QgZHluYW1pY2FsbHkgbGlua2VkIHdpdGggJChMSUJTTyk6IgotCUBlY2hvICIiCi0JLi9wbmd0ZXN0Ci0JQGVjaG8gIiIKLQlAZWNobyAiICAgUnVubmluZyBwbmd0ZXN0IHN0YXRpY2FsbHkgbGlua2VkIHdpdGggbGlicG5nLmE6IgotCUBlY2hvICIiCi0JLi9wbmd0ZXN0LXN0YXRpYwotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPVkVSKSBsaWJwbmcucGMgXAotCSQoT0xEU09WRVIpCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPVkVSKSogJChETCkvJChMSUJTTykKLQktQCQoUk1fRikgJChETCkvJChMSUJTT01BSikKLQktQCQoUk1fRikgJChETCkvJChPTERTTykKLQktQCQoUk1fRikgJChETCkvJChPTERTT01BSikKLQktQCQoUk1fRikgJChETCkvJChPTERTT1ZFUikqCi0JY3AgJChMSUJTT1ZFUikgJChETCkKLQljcCAkKE9MRFNPVkVSKSAkKERMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPVkVSKQotCWNobW9kIDc1NSAkKERMKS8kKE9MRFNPVkVSKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoT0xEU09WRVIpICQoT0xEU09NQUopOyBcCi0JJChMTl9TRikgJChPTERTT01BSikgJChPTERTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKTsgXAotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSAtV2wsIC1ycGF0aCwkKERMKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCSQoQ0MpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nIGxpYnBuZy1jb25maWcgXAotCSQoTElCU08pICQoTElCU09NQUopKiBwbmd0ZXN0LXN0YXRpYyBwbmd0ZXN0aSBcCi0JJChPTERTT1ZFUikgXAotCWxpYnBuZy5wYwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzoJCXBuZy5oIHBuZ2NvbmYuaCBwbmcuYwotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ2Vycm9yLmMKLXBuZ3Jpby5vIHBuZ3Jpby5waWMubzoJCXBuZy5oIHBuZ2NvbmYuaCBwbmdyaW8uYwotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ3dpby5jCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86CQlwbmcuaCBwbmdjb25mLmggcG5nbWVtLmMKLXBuZ3NldC5vIHBuZ3NldC5waWMubzoJCXBuZy5oIHBuZ2NvbmYuaCBwbmdzZXQuYwotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOgkJcG5nLmggcG5nY29uZi5oIHBuZ2dldC5jCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3JlYWQuYwotcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3J0cmFuLmMKLXBuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmdydXRpbC5jCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5ndHJhbnMuYwotcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3dyaXRlLmMKLXBuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86CXBuZy5oIHBuZ2NvbmYuaCBwbmd3dHJhbi5jCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOglwbmcuaCBwbmdjb25mLmggcG5nd3V0aWwuYwotcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzoJcG5nLmggcG5nY29uZi5oIHBuZ3ByZWFkLmMKLQotcG5ndGVzdC5vOgkJCXBuZy5oIHBuZ2NvbmYuaCBwbmd0ZXN0LmMKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUub3BlbmJzZCBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUub3BlbmJzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2MDNjMy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLm9wZW5ic2QKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLVBSRUZJWD89IC91c3IvbG9jYWwKLUxJQkRJUj0JJHtQUkVGSVh9L2xpYgotTUFORElSPSAke1BSRUZJWH0vbWFuL2NhdAotCi1TSExJQl9NQUpPUj0JMAotU0hMSUJfTUlOT1I9CTEuMi4zNwotCi1MSUI9CXBuZwotU1JDUz0JcG5nLmMgcG5nZXJyb3IuYyBwbmdnZXQuYyBwbmdtZW0uYyBwbmdwcmVhZC5jIFwKLQlwbmdyZWFkLmMgcG5ncmlvLmMgcG5ncnRyYW4uYyBwbmdydXRpbC5jIHBuZ3NldC5jIHBuZ3RyYW5zLmMgXAotCXBuZ3dpby5jIHBuZ3dyaXRlLmMgcG5nd3RyYW4uYyBwbmd3dXRpbC5jCi0KLUhEUlM9CXBuZy5oIHBuZ2NvbmYuaAotCi1DRkxBR1MrPSAtVyAtV2FsbAotQ1BQRkxBR1MrPSAtSSR7LkNVUkRJUn0gLURQTkdfTk9fTU1YX0NPREUKLQotTk9QUk9GSUxFPSBZZXMKLQotQ0xFQU5GSUxFUys9IHBuZ3Rlc3QubyBwbmd0ZXN0Ci0KLU1BTj0JbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8gbGlicG5nLnR4dAotCi1wbmd0ZXN0Lm86CXBuZ3Rlc3QuYwotCSR7Q0N9ICR7Q1BQRkxBR1N9ICR7Q0ZMQUdTfSAtYyAkey5BTExTUkN9IC1vICR7LlRBUkdFVH0KLQotcG5ndGVzdDoJcG5ndGVzdC5vCi0JJHtDQ30gJHtMREZMQUdTfSAkey5BTExTUkN9IC1vICR7LlRBUkdFVH0gLUwkey5PQkpESVJ9IC1scG5nIC1seiAtbG0KLQotdGVzdDoJcG5ndGVzdAotCWNkICR7Lk9CSkRJUn0gJiYgZW52IFwKLQkJTERfTElCUkFSWV9QQVRIPSIkey5PQkpESVJ9IiAkey5PQkpESVJ9L3BuZ3Rlc3QKLQotYmVmb3JlaW5zdGFsbDoKLQlpZiBbICEgLWQgJHtERVNURElSfSR7UFJFRklYfS9pbmNsdWRlL2xpYnBuZyBdOyB0aGVuIFwKLQkgICR7SU5TVEFMTH0gLWQgLW8gcm9vdCAtZyB3aGVlbCAke0RFU1RESVJ9JHtQUkVGSVh9L2luY2x1ZGUvbGlicG5nOyBcCi0JZmkKLQlpZiBbICEgLWQgJHtERVNURElSfSR7TElCRElSfSBdOyB0aGVuIFwKLQkgICR7SU5TVEFMTH0gLWQgLW8gcm9vdCAtZyB3aGVlbCAke0RFU1RESVJ9JHtMSUJESVJ9OyBcCi0JZmkKLQlpZiBbICEgLWQgJHtERVNURElSfSR7TElCRElSfS9kZWJ1ZyBdOyB0aGVuIFwKLQkgICR7SU5TVEFMTH0gLWQgLW8gcm9vdCAtZyB3aGVlbCAke0RFU1RESVJ9JHtMSUJESVJ9L2RlYnVnOyBcCi0JZmkKLQlpZiBbICEgLWQgJHtERVNURElSfSR7TUFORElSfTMgXTsgdGhlbiBcCi0JICAke0lOU1RBTEx9IC1kIC1vIHJvb3QgLWcgd2hlZWwgJHtERVNURElSfSR7TUFORElSfTM7IFwKLQlmaQotCWlmIFsgISAtZCAke0RFU1RESVJ9JHtNQU5ESVJ9NSBdOyB0aGVuIFwKLQkgICR7SU5TVEFMTH0gLWQgLW8gcm9vdCAtZyB3aGVlbCAke0RFU1RESVJ9JHtNQU5ESVJ9NTsgXAotCWZpCi0JaWYgWyAhIC1kICR7REVTVERJUn0ke1BSRUZJWH0vc2hhcmUvZG9jL3BuZyBdOyB0aGVuIFwKLQkgICR7SU5TVEFMTH0gLWQgLW8gcm9vdCAtZyB3aGVlbCAke0RFU1RESVJ9JHtQUkVGSVh9L3NoYXJlL2RvYy9wbmc7IFwKLQlmaQotCi1hZnRlcmluc3RhbGw6Ci0JQHJtIC1mICR7REVTVERJUn0ke0xJQkRJUn0vbGlicG5nX3BpYy5hCi0JQHJtIC1mICR7REVTVERJUn0ke0xJQkRJUn0vZGVidWcvbGlicG5nLmEKLQlAcm0gLWYgJHtERVNURElSfSR7UFJFRklYfS9pbmNsdWRlL3BuZy5oCi0JQHJtIC1mICR7REVTVERJUn0ke1BSRUZJWH0vaW5jbHVkZS9wbmdjb25mLmgKLQlAcm1kaXIgJHtERVNURElSfSR7TElCRElSfS9kZWJ1ZyAyPi9kZXYvbnVsbCB8fCB0cnVlCi0JJHtJTlNUQUxMfSAke0lOU1RBTExfQ09QWX0gLW8gJHtTSEFSRU9XTn0gLWcgJHtTSEFSRUdSUH0gXAotCQktbSAke05PTkJJTk1PREV9ICR7SERSU30gJHtERVNURElSfSR7UFJFRklYfS9pbmNsdWRlL2xpYnBuZwotCSR7SU5TVEFMTH0gJHtJTlNUQUxMX0NPUFl9IC1vICR7U0hBUkVPV059IC1nICR7U0hBUkVHUlB9IFwKLQkJLW0gJHtOT05CSU5NT0RFfSAke0hEUlN9ICR7REVTVERJUn0ke1BSRUZJWH0vaW5jbHVkZQotCSR7SU5TVEFMTH0gJHtJTlNUQUxMX0NPUFl9IC1vICR7U0hBUkVPV059IC1nICR7U0hBUkVHUlB9IFwKLQkJLW0gJHtOT05CSU5NT0RFfSAke0RPQ1N9ICR7REVTVERJUn0ke1BSRUZJWH0vc2hhcmUvZG9jL3BuZwotCi0uaW5jbHVkZSA8YnNkLmxpYi5taz4KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUub3MyIGIvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5vczIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyY2ZjZWUuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5vczIKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gT1MvMiB3aXRoIGdjYwotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyBSZWxhdGVkIGZpbGVzOiBwbmdvczIuZGVmCi0KLUNDPWdjYyAtWm9tZiAtcwotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLVpMSUJMSUI9Li4vemxpYgotWkxJQklOQz0uLi96bGliCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotQ0ZMQUdTPS1JJChaTElCSU5DKSAtVyAtV2FsbCAtTzYgLWZ1bnJvbGwtbG9vcHMgLW1hbGlnbi1sb29wcz0yIFwKLQktbWFsaWduLWZ1bmN0aW9ucz0yICMkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci1MREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcgLWx6ZGxsIC1aY3J0ZGxsCi1BUj1lbXhvbWZhcgotCi1QTkdMSUI9cG5nLmxpYgotSU1QTElCPWVteGltcAotU0hBUkVETElCPXBuZy5kbGwKLVNIQVJFRExJQklNUD1wbmdkbGwubGliCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vCi0KLWFsbDogJChQTkdMSUIpICQoU0hBUkVETElCKSAkKFNIQVJFRExJQklNUCkKLQotJChQTkdMSUIpOiAkKE9CSlMpCi0JJChBUikgcmMgJEAgJChPQkpTKQotCi0kKFNIQVJFRExJQik6ICQoT0JKUykgcG5nb3MyLmRlZgotCSQoQ0MpICQoTERGTEFHUykgLVpkbGwgLW8gJEAgJF4KLQotJChTSEFSRURMSUJJTVApOiBwbmdvczIuZGVmCi0JJChJTVBMSUIpIC1vICRAICReCi0KLXBuZ3Rlc3QuZXhlOiBwbmd0ZXN0Lm8gcG5nLmRsbCBwbmdkbGwubGliCi0JJChDQykgLW8gJEAgJChDRkxBR1MpICQ8ICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdC5leGUKLQkuL3BuZ3Rlc3QuZXhlCi0KLWNsZWFuOgotCXJtIC1mICoubyAkKFBOR0xJQikgcG5nLmRsbCBwbmdkbGwubGliIHBuZ3Rlc3QuZXhlIHBuZ291dC5wbmcKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zY28gYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNjbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxNjZkYS4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNjbworKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBTQ08gT1NyNSAgRUxGIGFuZCBVbml4d2FyZSA3IHdpdGggTmF0aXZlIGNjCi0jIENvbnRyaWJ1dGVkIGJ5IE1pa2UgSG9wa2lyayAoaG9wc0BzY28uY29tKSBtb2RpZmllZCBmcm9tIE1ha2VmaWxlLmxueAotIyAgIGZvcmNlIEVMRiBidWlsZCBkeW5hbWljIGxpbmtpbmcsIFNPTkFNRSBzZXR0aW5nIGluIGxpYiBhbmQgUlBBVEggaW4gYXBwCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk4IEdyZWcgUm9lbG9mcwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRSA9IGxpYnBuZzEyCi1QTkdNQUogPSAwCi1QTkdNSU4gPSAxLjIuMzcKLVBOR1ZFUiA9ICQoUE5HTUFKKS4kKFBOR01JTikKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1ZFUj0kKExJQk5BTUUpLnNvLiQoUE5HVkVSKQotT0xEU089bGlicG5nLnNvCi1PTERTT01BSj1saWJwbmcuc28uMwotT0xEU09WRVI9bGlicG5nLnNvLjMuJChQTkdNSU4pCi0KLSMgVXRpbGl0aWVzOgotQ0M9Y2MKLUFSX1JDPWFyIHJjCi1NS0RJUl9QPW1rZGlyCi1MTl9TRj1sbiAtZiAtcwotUkFOTElCPWVjaG8KLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCAkKE9MRFNPKSosIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSNaTElCTElCPS91c3IvbG9jYWwvbGliCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLVpMSUJMSUI9Li4vemxpYgotWkxJQklOQz0uLi96bGliCi0KLUNGTEFHUz0gLWR5IC1iZWxmIC1JJChaTElCSU5DKSAtTzMgLURQTkdfTk9fTU1YX0NPREUKLUxERkxBR1M9LUwuIC1MJChaTElCTElCKSAtbHBuZzEyIC1seiAtbG0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZS9saWJwbmcKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpIC1LUElDIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxMiEtbHBuZzEyXCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGNjb3B0cz1cIi1iZWxmXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxMiAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKExJQlNPVkVSKQotCSQoTE5fU0YpICQoTElCU09WRVIpICQoTElCU09NQUopCi0KLSQoTElCU09WRVIpOiAkKE9CSlNETEwpCi0JJChDQykgLUcgIC1XbCwtaCwkKExJQlNPTUFKKSAtbyAkKExJQlNPVkVSKSBcCi0JICQoT0JKU0RMTCkKLQotJChPTERTT1ZFUik6ICQoT0JKU0RMTCkKLQkkKENDKSAtRyAgLVdsLC1oLCQoT0xEU09NQUopIC1vICQoT0xEU09WRVIpIFwKLQkkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCUxEX1JVTl9QQVRIPS46JChaTElCTElCKSAkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oCi0JLUAkKFJNX0YpICQoREkpL3BuZ2NvbmYuaAotCWNwIHBuZy5oIHBuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPVkVSKSBsaWJwbmcucGMgXAotCSQoT0xEU09WRVIpCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPVkVSKSogJChETCkvJChMSUJTTykKLQktQCQoUk1fRikgJChETCkvJChMSUJTT01BSikKLQktQCQoUk1fRikgJChETCkvJChPTERTTykKLQktQCQoUk1fRikgJChETCkvJChPTERTT01BSikKLQktQCQoUk1fRikgJChETCkvJChPTERTT1ZFUikqCi0JY3AgJChMSUJTT1ZFUikgJChETCkKLQljcCAkKE9MRFNPVkVSKSAkKERMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPVkVSKQotCWNobW9kIDc1NSAkKERMKS8kKE9MRFNPVkVSKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoT0xEU09WRVIpICQoT0xEU09NQUopOyBcCi0JJChMTl9TRikgJChPTERTT01BSikgJChPTERTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKTsgXAotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JJChDQykgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBsaWJwbmctY29uZmlnIFwKLQkkKExJQlNPKSAkKExJQlNPTUFKKSogcG5ndGVzdC1zdGF0aWMgcG5ndGVzdGkgXAotCSQoT0xEU09WRVIpIFwKLQlsaWJwbmcucGMKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zZ2djYyBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc2dnY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NDNjOWIuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zZ2djYworKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcuYSBhbmQgbGlicG5nMTIuc28sIFNHSSBJUklYIHdpdGggJ2NjJwotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiwgMjAwNiBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FPWxpYnBuZzEyCi1QTkdNQUogPSAwCi1QTkdNSU4gPSAxLjIuMzcKLVBOR1ZFUiA9ICQoUE5HTUFKKS4kKFBOR01JTikKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1ZFUj0kKExJQk5BTUUpLnNvLiQoUE5HVkVSKQotT0xEU089bGlicG5nLnNvCi1PTERTT01BSj1saWJwbmcuc28uMwotT0xEU09WRVI9bGlicG5nLnNvLjMuJChQTkdNSU4pCi0KLSMgVXRpbGl0aWVzOgotQVJfUkM9YXIgcmMKLUNDPWdjYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLXNmCi1SQU5MSUI9ZWNobwotUk1fRj0vYmluL3JtIC1mCi0KLSMgV2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzEyLnNvLCBhbmQgbGlicG5nMTIvcG5nLmgKLSMgUHJlZml4IG11c3QgYmUgYSBmdWxsIHBhdGhuYW1lLgotCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIzMgotI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi0jWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgotI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi1aTElCTElCPS4uL3psaWIKLVpMSUJJTkM9Li4vemxpYgotCi0jIEFCSSBjYW4gYmUgYmxhbmsgdG8gdXNlIGRlZmF1bHQgZm9yIHlvdXIgc3lzdGVtLCAtMzIsIC1vMzIsIC1uMzIsIG9yIC02NAotIyBTZWUgIm1hbiBhYmkiLiAgemxpYiBtdXN0IGJlIGJ1aWx0IHdpdGggdGhlIHNhbWUgQUJJLgotQUJJPQotCi1XQVJOTU9SRT0gIyAtZyAtRFBOR19ERUJVRz01Ci1DRkxBR1M9JChBQkkpIC1JJChaTElCSU5DKSAtTyAkKFdBUk5NT1JFKSAtZlBJQyAtbWFiaT1uMzIgLURQTkdfTk9fTU1YX0NPREUKLUxERkxBR1M9JChBQkkpIC1MLiAtTCQoWkxJQkxJQikgLWxwbmcgLWx6IC1sbQotTERTSEFSRUQ9Y2MgJChBQkkpIC1zaGFyZWQgLXNvbmFtZSAkKExJQlNPTUFKKSBcCi0gIC1zZXRfdmVyc2lvbiBzZ2kkKFBOR01BSikuMAotTERMRUdBQ1k9Y2MgJChBQkkpIC1zaGFyZWQgLXNvbmFtZSAkKE9MRFNPTUFKKSBcCi0gIC1zZXRfdmVyc2lvbiBzZ2kkMy4wCi0jIFNlZSAibWFuIGRzbyIgZm9yIGluZm8gYWJvdXQgc2hhcmVkIG9iamVjdHMKLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLSNMSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYjMyCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSAgcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLWFsbDogbGlicG5nLmEgcG5ndGVzdCBzaGFyZWQgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLXNoYXJlZDogJChMSUJTT1ZFUikKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTIhLWxwbmcxMlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBjY29wdHM9XCIkKEFCSSlcIjsgXAotCWVjaG8gY3BwZmxhZ3M9XCItRFBOR19OT19NTVhfQ09ERVwiOyBcCi0JZWNobyBsZG9wdHM9XCIkKEFCSSlcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYmRpcj1cIiQoTElCUEFUSClcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTIgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChMSUJTT1ZFUikKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKQotCi0kKExJQlNPVkVSKTogJChPQkpTKQotCSQoTERTSEFSRUQpIC1vICRAICQoT0JKUykKLQkkKFJNX0YpICQoTElCU08pICQoTElCU09NQUopCi0KLSQoT0xEU09WRVIpOiAkKE9CSlMpCi0JJChMRExFR0FDWSkgLW8gJEAgJChPQkpTKQotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JZWNobwotCWVjaG8gVGVzdGluZyBsb2NhbCBzdGF0aWMgbGlicmFyeS4KLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT1ZFUikgbGlicG5nLnBjIFwKLQkkKE9MRFNPVkVSKQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1ZFUikqICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09WRVIpKgotCWNwICQoTElCU09WRVIpICQoREwpCi0JY3AgJChPTERTT1ZFUikgJChETCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1ZFUikKLQljaG1vZCA3NTUgJChETCkvJChPTERTT1ZFUikKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKE9MRFNPVkVSKSAkKE9MRFNPTUFKKTsgXAotCSQoTE5fU0YpICQoT0xEU09NQUopICQoT0xEU08pOyBcCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTT01BSik7IFwKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgXAotICAgICAgICAgICAtcnBhdGggJChaTElCTElCKTokKERMKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChaTElCTElCKSBcCi0gICAgICAgICAgIC1ycGF0aCAkKFpMSUJMSUIpOmAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGliZGlyYCBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgbGlicG5nLnBjIFwKLSAgICAgICAgc29fbG9jYXRpb25zIGxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqICQoT0xEU09WRVIpCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oCi1wbmd3aW8ubzogcG5nLmggcG5nY29uZi5oCi1wbmdtZW0ubzogcG5nLmggcG5nY29uZi5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oCi1wbmdnZXQubzogcG5nLmggcG5nY29uZi5oCi1wbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oCi1wbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNnaSBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTNkMWExLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc2dpCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZy5hIGFuZCBsaWJwbmcxMi5zbywgU0dJIElSSVggd2l0aCAnY2MnCi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDAyLCAyMDA2LCAyMDA3IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUU9bGlicG5nMTIKLVBOR01BSiA9IDAKLVBOR01JTiA9IDEuMi4zNwotUE5HVkVSID0gJChQTkdNQUopLiQoUE5HTUlOKQotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPVkVSPSQoTElCTkFNRSkuc28uJChQTkdWRVIpCi1PTERTTz1saWJwbmcuc28KLU9MRFNPTUFKPWxpYnBuZy5zby4zCi1PTERTT1ZFUj1saWJwbmcuc28uMy4kKFBOR01JTikKLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Y2MKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotUkFOTElCPWVjaG8KLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIFdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxMi5zbywgYW5kIGxpYnBuZzEyL3BuZy5oCi0jIFByZWZpeCBtdXN0IGJlIGEgZnVsbCBwYXRobmFtZS4KLQotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSNaTElCTElCPS91c3IvbG9jYWwvbGliMzIKLSNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKLSNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotWkxJQkxJQj0uLi96bGliCi1aTElCSU5DPS4uL3psaWIKLQotIyBBQkkgY2FuIGJlIGJsYW5rIHRvIHVzZSBkZWZhdWx0IGZvciB5b3VyIHN5c3RlbSwgLTMyLCAtbzMyLCAtbjMyLCBvciAtNjQKLSMgU2VlICJtYW4gYWJpIi4gIHpsaWIgbXVzdCBiZSBidWlsdCB3aXRoIHRoZSBzYW1lIEFCSS4KLUFCST0KLQotV0FSTk1PUkU9LWZ1bGx3YXJuCi0jIE5vdGU6IC1LUElDIGlzIHRoZSBkZWZhdWx0IGFueWhvdwotI0NGTEFHUz0gJChBQkkpIC1JJChaTElCSU5DKSAtTyAkKFdBUk5NT1JFKSAtS1BJQyAtRFBOR19OT19NTVhfQ09ERSAjIC1nIC1EUE5HX0RFQlVHPTUKLUNGTEFHUz0kKEFCSSkgLUkkKFpMSUJJTkMpIC1PICQoV0FSTk1PUkUpIC1EUE5HX05PX01NWF9DT0RFCi1MREZMQUdTX0E9JChBQkkpIC1MLiAtTCQoWkxJQkxJQikgLWxwbmcxMiAtbHogLWxtCi1MREZMQUdTPSQoQUJJKSAtTC4gLUwkKFpMSUJMSUIpIC1scG5nIC1seiAtbG0KLUxEU0hBUkVEPWNjICQoQUJJKSAtc2hhcmVkIC1zb25hbWUgJChMSUJTT01BSikgXAotICAtc2V0X3ZlcnNpb24gc2dpJChQTkdNQUopLjAKLUxETEVHQUNZPWNjICQoQUJJKSAtc2hhcmVkIC1zb25hbWUgJChPTERTT01BSikgXAotICAtc2V0X3ZlcnNpb24gc2dpJDMuMAotIyBTZWUgIm1hbiBkc28iIGZvciBpbmZvIGFib3V0IHNoYXJlZCBvYmplY3RzCi0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi0jTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIzMgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi1PQkpTID0gIHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1hbGw6IGxpYnBuZy5hIHBuZ3Rlc3Qgc2hhcmVkIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1zaGFyZWQ6ICQoTElCU09WRVIpCi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzEyIS1scG5nMTJcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gY3BwZmxhZ3M9XCItRFBOR19OT19NTVhfQ09ERVwiOyBcCi0JZWNobyBjY29wdHM9XCIkKEFCSSlcIjsgXAotCWVjaG8gbGRvcHRzPVwiJChBQkkpXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJkaXI9XCIkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzEyIC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoTElCU09WRVIpCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTT01BSikKLQotJChMSUJTT1ZFUik6ICQoT0JKUykKLQkkKExEU0hBUkVEKSAtbyAkQCAkKE9CSlMpCi0JJChSTV9GKSAkKExJQlNPKSAkKExJQlNPTUFKKQotCi0kKE9MRFNPVkVSKTogJChPQkpTKQotCSQoTERMRUdBQ1kpIC1vICRAICQoT0JKUykKLQotcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCWVjaG8KLQllY2hvIFRlc3RpbmcgbG9jYWwgc3RhdGljIGxpYnJhcnkuCi0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09WRVIpIGxpYnBuZy5wYyBcCi0JJChPTERTT1ZFUikKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09WRVIpKiAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPTUFKKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPTUFKKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPVkVSKSoKLQljcCAkKExJQlNPVkVSKSAkKERMKQotCWNwICQoT0xEU09WRVIpICQoREwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09WRVIpCi0JY2htb2QgNzU1ICQoREwpLyQoT0xEU09WRVIpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChPTERTT1ZFUikgJChPTERTT01BSik7IFwKLQkkKExOX1NGKSAkKE9MRFNPTUFKKSAkKE9MRFNPKTsgXAotCSQoTE5fU0YpICQoTElCU09WRVIpICQoTElCU09NQUopOyBcCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLUkkKERJKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIFwKLSAgICAgICAgICAgLXJwYXRoICQoWkxJQkxJQik6JChETCkgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCi0JJChDQykgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgXAotICAgICAgICAgICAtcnBhdGggJChaTElCTElCKTpgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxpYmRpcmAgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBsaWJwbmcucGMgbGlicG5nLWNvbmZpZyBcCi0JJChMSUJTTykgJChMSUJTT01BSikqIFwKLQkkKE9MRFNPVkVSKSBcCi0Jc29fbG9jYXRpb25zCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oCi1wbmd3aW8ubzogcG5nLmggcG5nY29uZi5oCi1wbmdtZW0ubzogcG5nLmggcG5nY29uZi5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oCi1wbmdnZXQubzogcG5nLmggcG5nY29uZi5oCi1wbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oCi1wbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNvOSBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc285CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTMyNjc4Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc285CisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBTb2xhcmlzIDkgKGJldGEpIHdpdGggRm9ydGUgY2MKLSMgVXBkYXRlZCBieSBDaGFkIFNjaHJvY2sgZm9yIFNvbGFyaXMgOQotIyBDb250cmlidXRlZCBieSBXaWxsaWFtIEwuIFNlYm9rLCBiYXNlZCBvbiBtYWtlZmlsZS5saW51eAotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMDggR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5OC0yMDAxIEdyZWcgUm9lbG9mcwotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5NyBBbmRyZWFzIERpbGdlcgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1QTkdNQUogPSAwCi1QTkdNSU4gPSAxLjIuMzcKLVBOR1ZFUiA9ICQoUE5HTUFKKS4kKFBOR01JTikKLUxJQk5BTUUgPSBsaWJwbmcxMgotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPVkVSPSQoTElCTkFNRSkuc28uJChQTkdWRVIpCi1PTERTTz1saWJwbmcuc28KLU9MRFNPTUFKPWxpYnBuZy5zby4zCi1PTERTT1ZFUj1saWJwbmcuc28uMy4kKFBOR01JTikKLQotIyBVdGlsaXRpZXM6Ci0jIGdjYyAyLjk1IGRvZXNuJ3Qgd29yay4KLUNDPWNjCi1BUl9SQz1hciByYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLWYgLXMKLVJBTkxJQj1lY2hvCi1STV9GPS9iaW4vcm0gLWYKLQotIyBXaGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSwgJChPTERTTykqLCBhbmQgcG5nLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi0jIENoYW5naW5nIHRoZXNlIHRvIC4uL3psaWIgcG9zZXMgYSBzZWN1cml0eSByaXNrLiAgSWYgeW91IHdhbnQKLSMgdG8gaGF2ZSB6bGliIGluIGFuIGFkamFjZW50IGRpcmVjdG9yeSwgc3BlY2lmeSB0aGUgZnVsbCBwYXRoIGluc3RlYWQgb2YgIi4uIi4KLSNaTElCTElCPS4uL3psaWIKLSNaTElCSU5DPS4uL3psaWIKLSNaTElCTElCPS91c3IvbG9jYWwvbGliCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLSNVc2UgdGhlIHByZWluc3RhbGxlZCB6bGliIHRoYXQgY29tZXMgd2l0aCBTb2xhcmlzIDk6Ci1aTElCTElCPS91c3IvbGliCi1aTElCSU5DPS91c3IvaW5jbHVkZQotCi0jV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi0jQ0ZMQUdTPS1JJChaTElCSU5DKSAtVyAtV2FsbCAtTzMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NSAtRFBOR19OT19NTVhfQ09ERQotQ0ZMQUdTPS1JJChaTElCSU5DKSAtTzMgLURQTkdfTk9fTU1YX0NPREUKLUxERkxBR1M9LUwuIC1SLiAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpIC1scG5nMTIgLWx6IC1sbQotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCi0KLS5jLnBpYy5vOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtS1BJQyAtbyAkQCAkKi5jCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTIhLWxwbmcxMlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gUl9vcHRzPVwiLVIkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzEyIC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoTElCU09WRVIpCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTT01BSikKLQotJChMSUJTT1ZFUik6ICQoT0JKU0RMTCkKLQlAY2FzZSAiYHR5cGUgbGRgIiBpbiAqdWNiKikgXAotCWVjaG87IFwKLQllY2hvICcjIyBXQVJOSU5HOic7IFwKLQllY2hvICcjIyBUaGUgY29tbWFuZHMgIkNDIiBhbmQgIkxEIiBtdXN0IE5PVCByZWZlciB0byAvdXNyL3VjYi9jYyc7IFwKLQllY2hvICcjIyBhbmQgL3Vzci91Y2IvbGQuICBJZiB0aGV5IGRvLCB5b3UgbmVlZCB0byBhZGp1c3QgeW91ciBQQVRIJzsgXAotCWVjaG8gJyMjIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHB1dCAvdXNyL2Njcy9iaW4gYWhlYWQgb2YgL3Vzci91Y2IuJzsgXAotCWVjaG8gJyMjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9MSUJSQVJZX1BBVEggc2hvdWxkIG5vdCBiZSBzZXQnOyBcCi0JZWNobyAnIyMgYXQgYWxsLiAgSWYgaXQgaXMsIHRoaW5ncyBhcmUgbGlrZWx5IHRvIGJyZWFrIGJlY2F1c2Ugb2YnOyBcCi0JZWNobyAnIyMgdGhlIGxpYnVjYiBkZXBlbmRlbmN5IHRoYXQgaXMgY3JlYXRlZC4nOyBcCi0JZWNobzsgXAotCTs7IFwKLQllc2FjCi0JJChMRCkgLUcgLWggJChMSUJTT01BSikgXAotCSAtbyAkKExJQlNPVkVSKSAkKE9CSlNETEwpCi0KLSQoT0xEU09WRVIpOiAkKE9CSlMpCi0JJChMRCkgLUcgLWggJChPTERTT01BSikgXAotCSAtbyAkKE9MRFNPVkVSKSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT1ZFUikgbGlicG5nLnBjIFwKLQkkKE9MRFNPVkVSKQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1ZFUikqICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09WRVIpKgotCWNwICQoTElCU09WRVIpICQoREwpCi0JY3AgJChPTERTT1ZFUikgJChETCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1ZFUikKLQljaG1vZCA3NTUgJChETCkvJChPTERTT1ZFUikKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKE9MRFNPVkVSKSAkKE9MRFNPTUFKKTsgXAotCSQoTE5fU0YpICQoT0xEU09NQUopICQoT0xEU08pOyBcCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTT01BSik7IFwKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYCBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgIC1SJChaTElCTElCKSAtUiQoREwpCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5LgotCSQoQ0MpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYCBcCi0JICAgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKLQlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCi0JJChPTERTT1ZFUikgXAotCWxpYnBuZy5wYwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3Jpby5vIHBuZ3Jpby5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3NldC5vIHBuZ3NldC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNvbGFyaXMgYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNvbGFyaXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZDA0MjcuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zb2xhcmlzCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBTb2xhcmlzIDIueCB3aXRoIGdjYwotIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDYtMjAwOCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29udHJpYnV0ZWQgYnkgV2lsbGlhbSBMLiBTZWJvaywgYmFzZWQgb24gbWFrZWZpbGUubGludXgKLSMgQ29weXJpZ2h0IChDKSAxOTk4IEdyZWcgUm9lbG9mcwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRSA9IGxpYnBuZzEyCi1QTkdNQUogPSAwCi1QTkdNSU4gPSAxLjIuMzcKLVBOR1ZFUiA9ICQoUE5HTUFKKS4kKFBOR01JTikKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1ZFUj0kKExJQk5BTUUpLnNvLiQoUE5HVkVSKQotT0xEU089bGlicG5nLnNvCi1PTERTT01BSj1saWJwbmcuc28uMwotT0xEU09WRVI9bGlicG5nLnNvLjMuJChQTkdNSU4pCi0KLSMgVXRpbGl0aWVzOgotQVJfUkM9YXIgcmMKLUNDPWdjYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLWYgLXMKLVJBTkxJQj1lY2hvCi1STV9GPS9iaW4vcm0gLWYKLQotIyBXaGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSwgbGlicG5nMTIuc28qLCBhbmQgcG5nLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi0jIENoYW5naW5nIHRoZXNlIHRvIC4uL3psaWIgcG9zZXMgYSBzZWN1cml0eSByaXNrLiAgSWYgeW91IHdhbnQKLSMgdG8gaGF2ZSB6bGliIGluIGFuIGFkamFjZW50IGRpcmVjdG9yeSwgc3BlY2lmeSB0aGUgZnVsbCBwYXRoIGluc3RlYWQgb2YgIi4uIi4KLSNaTElCTElCPS4uL3psaWIKLSNaTElCSU5DPS4uL3psaWIKLQotWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgotWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi1DRkxBR1M9LUkkKFpMSUJJTkMpIC1XIC1XYWxsIC1PIC1EUE5HX05PX01NWF9DT0RFOyBcCi0JIyAkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci1MREZMQUdTPS1MLiAtUi4gLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtbHBuZzEyIC1seiAtbG0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1PQkpTRExMID0gJChPQkpTOi5vPS5waWMubykKLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vIC5waWMubwotCi0uYy5waWMubzoKLQkkKENDKSAtYyAkKENGTEFHUykgLWZQSUMgLW8gJEAgJCouYwotCi1hbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzEyIS1scG5nMTJcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gY3BwZmxhZ3M9XCItRFBOR19OT19NTVhfQ09ERVwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gUl9vcHRzPVwiLVIkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzEyIC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoTElCU09WRVIpCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTT01BSikKLQotJChMSUJTT1ZFUik6ICQoT0JKU0RMTCkKLQlAY2FzZSAiYHR5cGUgbGRgIiBpbiAqdWNiKikgXAotCWVjaG87IFwKLQllY2hvICcjIyBXQVJOSU5HOic7IFwKLQllY2hvICcjIyBUaGUgY29tbWFuZHMgIkNDIiBhbmQgIkxEIiBtdXN0IE5PVCByZWZlciB0byAvdXNyL3VjYi9jYyc7IFwKLQllY2hvICcjIyBhbmQgL3Vzci91Y2IvbGQuICBJZiB0aGV5IGRvLCB5b3UgbmVlZCB0byBhZGp1c3QgeW91ciBQQVRIJzsgXAotCWVjaG8gJyMjIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHB1dCAvdXNyL2Njcy9iaW4gYWhlYWQgb2YgL3Vzci91Y2IuJzsgXAotCWVjaG8gJyMjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9MSUJSQVJZX1BBVEggc2hvdWxkIG5vdCBiZSBzZXQnOyBcCi0JZWNobyAnIyMgYXQgYWxsLiAgSWYgaXQgaXMsIHRoaW5ncyBhcmUgbGlrZWx5IHRvIGJyZWFrIGJlY2F1c2Ugb2YnOyBcCi0JZWNobyAnIyMgdGhlIGxpYnVjYiBkZXBlbmRlbmN5IHRoYXQgaXMgY3JlYXRlZC4nOyBcCi0JZWNobzsgXAotCTs7IFwKLQllc2FjCi0JJChMRCkgLUcgLWggJChMSUJTT01BSikgXAotCSAtbyAkKExJQlNPVkVSKSAkKE9CSlNETEwpCi0KLSQoT0xEU09WRVIpOiAkKE9CSlMpCi0JJChMRCkgLUcgLWggJChPTERTT01BSikgXAotCSAtbyAkKE9MRFNPVkVSKSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT1ZFUikgbGlicG5nLnBjIFwKLQkkKE9MRFNPVkVSKQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1ZFUikqICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU09WRVIpKgotCWNwICQoTElCU09WRVIpICQoREwpCi0JY3AgJChPTERTT1ZFUikgJChETCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1ZFUikKLQljaG1vZCA3NTUgJChETCkvJChPTERTT1ZFUikKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKE9MRFNPVkVSKSAkKE9MRFNPTUFKKTsgXAotCSQoTE5fU0YpICQoT0xEU09NQUopICQoT0xEU08pOyBcCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPVkVSKSAkKExJQlNPTUFKKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYCBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpIC1SJChETCkKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCi0JJChDQykgLUkkKFpMSUJJTkMpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgXAotCWxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIFwKLQkkKE9MRFNPVkVSKSBcCi0JbGlicG5nLnBjCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc29sYXJpcy14ODYgYi9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnNvbGFyaXMteDg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjJjNGY0Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc29sYXJpcy14ODYKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIFNvbGFyaXMgMi54IHdpdGggZ2NjCi0jIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNi0yMDA4IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb250cmlidXRlZCBieSBXaWxsaWFtIEwuIFNlYm9rLCBiYXNlZCBvbiBtYWtlZmlsZS5saW51eAotIyBDb3B5cmlnaHQgKEMpIDE5OTggR3JlZyBSb2Vsb2ZzCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTIKLVBOR01BSiA9IDAKLVBOR01JTiA9IDEuMi4zNwotUE5HVkVSID0gJChQTkdNQUopLiQoUE5HTUlOKQotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPVkVSPSQoTElCTkFNRSkuc28uJChQTkdWRVIpCi1PTERTTz1saWJwbmcuc28KLU9MRFNPTUFKPWxpYnBuZy5zby4zCi1PTERTT1ZFUj1saWJwbmcuc28uMy4kKFBOR01JTikKLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Z2NjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtZiAtcwotUkFOTElCPWVjaG8KLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIFdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxMi5zbyosIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSMgQ2hhbmdpbmcgdGhlc2UgdG8gLi4vemxpYiBwb3NlcyBhIHNlY3VyaXR5IHJpc2suICBJZiB5b3Ugd2FudAotIyB0byBoYXZlIHpsaWIgaW4gYW4gYWRqYWNlbnQgZGlyZWN0b3J5LCBzcGVjaWZ5IHRoZSBmdWxsIHBhdGggaW5zdGVhZCBvZiAiLi4iLgotI1pMSUJMSUI9Li4vemxpYgotI1pMSUJJTkM9Li4vemxpYgotCi1aTElCTElCPS91c3IvbG9jYWwvbGliCi1aTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotCi1XQVJOTU9SRT0tV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1Xc2hhZG93IFwKLQktV21pc3NpbmctZGVjbGFyYXRpb25zIC1XdHJhZGl0aW9uYWwgLVdjYXN0LWFsaWduIFwKLQktV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzICMtV2NvbnZlcnNpb24KLUNGTEFHUz0tSSQoWkxJQklOQykgLVcgLVdhbGwgLU8gXAotCSMgJChXQVJOTU9SRSkgLWcgLURQTkdfREVCVUc9NQotTERGTEFHUz0tTC4gLVIuIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLWxwbmcxMiAtbHogLWxtCi0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDRkxBR1MpIC1mUElDIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxMiEtbHBuZzEyXCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGNwcGZsYWdzPVwiIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIFJfb3B0cz1cIi1SJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxMiAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKExJQlNPVkVSKQotCSQoTE5fU0YpICQoTElCU09WRVIpICQoTElCU09NQUopCi0KLSQoTElCU09WRVIpOiAkKE9CSlNETEwpCi0JQGNhc2UgImB0eXBlIGxkYCIgaW4gKnVjYiopIFwKLQllY2hvOyBcCi0JZWNobyAnIyMgV0FSTklORzonOyBcCi0JZWNobyAnIyMgVGhlIGNvbW1hbmRzICJDQyIgYW5kICJMRCIgbXVzdCBOT1QgcmVmZXIgdG8gL3Vzci91Y2IvY2MnOyBcCi0JZWNobyAnIyMgYW5kIC91c3IvdWNiL2xkLiAgSWYgdGhleSBkbywgeW91IG5lZWQgdG8gYWRqdXN0IHlvdXIgUEFUSCc7IFwKLQllY2hvICcjIyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwdXQgL3Vzci9jY3MvYmluIGFoZWFkIG9mIC91c3IvdWNiLic7IFwKLQllY2hvICcjIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTERfTElCUkFSWV9QQVRIIHNob3VsZCBub3QgYmUgc2V0JzsgXAotCWVjaG8gJyMjIGF0IGFsbC4gIElmIGl0IGlzLCB0aGluZ3MgYXJlIGxpa2VseSB0byBicmVhayBiZWNhdXNlIG9mJzsgXAotCWVjaG8gJyMjIHRoZSBsaWJ1Y2IgZGVwZW5kZW5jeSB0aGF0IGlzIGNyZWF0ZWQuJzsgXAotCWVjaG87IFwKLQk7OyBcCi0JZXNhYwotCSQoTEQpIC1HIC1oICQoTElCU09NQUopIFwKLQkgLW8gJChMSUJTT1ZFUikgJChPQkpTRExMKQotCi0kKE9MRFNPVkVSKTogJChPQkpTKQotCSQoTEQpIC1HIC1oICQoT0xEU09NQUopIFwKLQkgLW8gJChPTERTT1ZFUikgJChPQkpTRExMKQotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJTTykKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09WRVIpIGxpYnBuZy5wYyBcCi0JJChPTERTT1ZFUikKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09WRVIpKiAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPTUFKKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPTUFKKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPVkVSKSoKLQljcCAkKExJQlNPVkVSKSAkKERMKQotCWNwICQoT0xEU09WRVIpICQoREwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09WRVIpCi0JY2htb2QgNzU1ICQoREwpLyQoT0xEU09WRVIpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChPTERTT1ZFUikgJChPTERTT01BSik7IFwKLQkkKExOX1NGKSAkKE9MRFNPTUFKKSAkKE9MRFNPKTsgXAotCSQoTE5fU0YpICQoTElCU09WRVIpICQoTElCU08pOyBcCi0JJChMTl9TRikgJChMSUJTT1ZFUikgJChMSUJTT01BSikpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLUkkKERJKSAtSSQoWkxJQklOQykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtUiQoREwpCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5LgotCSQoQ0MpIC1JJChaTElCSU5DKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYCBcCi0JICAgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKLQlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCi0JJChPTERTT1ZFUikgXAotCWxpYnBuZy5wYwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3Jpby5vIHBuZ3Jpby5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3NldC5vIHBuZ3NldC5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnN0ZCBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc3RkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTY2NWU2Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc3RkCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSBhbmQgcG5nLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQocHJlZml4KS9saWIKLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi0jWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgotI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi1aTElCTElCPS4uL3psaWIKLVpMSUJJTkM9Li4vemxpYgotCi1DQz1jYwotQVJfUkM9YXIgcmMKLU1LRElSX1A9bWtkaXIKLUxOX1NGPWxuIC1zZgotUkFOTElCPXJhbmxpYgotUk1fRj1ybSAtZgotCi1DRkxBR1M9LUkkKFpMSUJJTkMpIC1PICMgLWcgLURQTkdfREVCVUc9NQotTERGTEFHUz0tTC4gLUwkKFpMSUJMSUIpIC1scG5nIC1seiAtbG0KLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1hbGw6IGxpYnBuZy5hIHBuZ3Rlc3QKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGw6IGxpYnBuZy5hCi0JLUAkKE1LRElSX1ApICQoREVTVERJUikkKElOQ1BBVEgpCi0JLUAkKE1LRElSX1ApICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCS1AJChNS0RJUl9QKSAkKERFU1RESVIpJChMSUJQQVRIKQotCS1AJChSTV9GKSAkKERFU1RESVIpJChJTkNQQVRIKS9wbmcuaAotCS1AJChSTV9GKSAkKERFU1RESVIpJChJTkNQQVRIKS9wbmdjb25mLmgKLQljcCBwbmcuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljcCBwbmdjb25mLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmcuaAotCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nY29uZi5oCi0JKGNkICQoREVTVERJUikkKElOQ1BBVEgpOyBsbiAtZiAtcyBsaWJwbmcvKiAuKQotCWNwIGxpYnBuZy5hICQoREVTVERJUikkKExJQlBBVEgpCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKExJQlBBVEgpL2xpYnBuZy5hCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZwotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zdW5vcyBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUuc3Vub3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMGEyMjYuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS5zdW5vcworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEgYW5kIHBuZy5oCi1wcmVmaXg9L3Vzci9sb2NhbAotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKHByZWZpeCkvbGliCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKLSNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotWkxJQkxJQj0uLi96bGliCi1aTElCSU5DPS4uL3psaWIKLQotCi1XQVJOTU9SRT0tV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1Xc2hhZG93IC1XY29udmVyc2lvbiBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcwotCi1DQz1nY2MKLUFSX1JDPWFyIHJjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtZiAtcwotUkFOTElCPXJhbmxpYgotUk1fRj0vYmluL3JtIC1mCi0KLUNGTEFHUz0tSSQoWkxJQklOQykgLU8gIyAkKFdBUk5NT1JFKSAtRFBOR19ERUJVRz01Ci1MREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcgLWx6IC1sbQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLWFsbDogbGlicG5nLmEgcG5ndGVzdAotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbDogbGlicG5nLmEKLQktQCQoTUtESVJfUCkgJChERVNURElSKSQoSU5DUEFUSCkKLQktQCQoTUtESVJfUCkgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JLUAkKE1LRElSX1ApICQoREVTVERJUikkKExJQlBBVEgpCi0JLUAkKFJNX0YpICQoREVTVERJUikkKElOQ1BBVEgpL3BuZy5oCi0JLUAkKFJNX0YpICQoREVTVERJUikkKElOQ1BBVEgpL3BuZ2NvbmYuaAotCWNwIHBuZy5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNwIHBuZ2NvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZy5oCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdjb25mLmgKLQkoY2QgJChERVNURElSKSQoSU5DUEFUSCk7ICQoTE5fU0YpIGxpYnBuZy8qIC4pCi0JY3AgbGlicG5nLmEgJChERVNURElSKSQoTElCUEFUSCkKLQljaG1vZCA2NDQgJChERVNURElSKSQoTElCUEFUSCkvbGlicG5nLmEKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oCi1wbmd3aW8ubzogcG5nLmggcG5nY29uZi5oCi1wbmdtZW0ubzogcG5nLmggcG5nY29uZi5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oCi1wbmdnZXQubzogcG5nLmggcG5nY29uZi5oCi1wbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oCi1wbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmgKLXBuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnRjMyBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUudGMzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTQzNWE2Li4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUudGMzCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgbGlicG5nCi0jIFR1cmJvQy9DKysgKE5vdGU6IEFsbCBtb2R1bGVzIGFyZSBjb21waWxlZCBpbiBDIG1vZGUpCi0KLSMgVG8gdXNlLCBkbyAibWFrZSAtZm1ha2VmaWxlLnRjMyIKLQotIyAtLS0tLSBUdXJibyBDIDMuMDAgKGNhbiBiZSBtb2RpZmllZCB0byB3b3JrIHdpdGggZWFybGllciB2ZXJzaW9ucykgLS0tLS0KLQotTU9ERUw9bAotQ0ZMQUdTPS1PMiAtWiAtbSQoTU9ERUwpIC1JLi5cemxpYgotI0NGTEFHUz0tRF9OT19QUk9UTyAtTzIgLVogLW0kKE1PREVMKSAtSS4uXHpsaWIgICMgVHVyYm8gQyBvbGRlciB0aGFuIDMuMDAKLUNDPXRjYwotTEQ9dGNjCi1MSUI9dGxpYgotTERGTEFHUz0tbSQoTU9ERUwpIC1MLi5cemxpYgotTz0ub2JqCi1FPS5leGUKLQotIyB2YXJpYWJsZXMKLU9CSlMxID0gcG5nJChPKSBwbmdzZXQkKE8pIHBuZ2dldCQoTykgcG5ncnV0aWwkKE8pIHBuZ3RyYW5zJChPKSBwbmd3dXRpbCQoTykKLU9CSlMyID0gcG5nbWVtJChPKSBwbmdwcmVhZCQoTykgcG5ncmVhZCQoTykgcG5nZXJyb3IkKE8pIHBuZ3dyaXRlJChPKQotT0JKUzMgPSBwbmdydHJhbiQoTykgcG5nd3RyYW4kKE8pIHBuZ3JpbyQoTykgcG5nd2lvJChPKQotT0JKU0wxID0gK3BuZyQoTykgK3BuZ3NldCQoTykgK3BuZ2dldCQoTykgK3BuZ3J1dGlsJChPKSArcG5ndHJhbnMkKE8pCi1PQkpTTDIgPSArcG5nd3V0aWwkKE8pICtwbmdtZW0kKE8pICtwbmdwcmVhZCQoTykgK3BuZ3JlYWQkKE8pICtwbmdlcnJvciQoTykKLU9CSlNMMyA9ICtwbmd3cml0ZSQoTykgK3BuZ3J0cmFuJChPKSArcG5nd3RyYW4kKE8pICtwbmdyaW8kKE8pICtwbmd3aW8kKE8pCi0KLWFsbDogbGlicG5nJChNT0RFTCkubGliIHBuZ3Rlc3QkKEUpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QkKEUpCi0KLXRlc3Q6IHBuZ3Rlc3QkKEUpCi0JcG5ndGVzdCQoRSkKLQotcG5nJChPKTogcG5nLmggcG5nY29uZi5oCi0JCSAgJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5nc2V0JChPKTogcG5nLmggcG5nY29uZi5oCi0JCSAgJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5nZ2V0JChPKTogcG5nLmggcG5nY29uZi5oCi0JCSAgJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5ncmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCQkgICQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3ByZWFkJChPKTogcG5nLmggcG5nY29uZi5oCi0JCSAgJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5ncnRyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkJICAkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1wbmdydXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCQkgICQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ2Vycm9yJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5nbWVtJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5ncmlvJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5nd2lvJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5ndGVzdCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3RyYW5zJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotcG5nd3JpdGUkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1wbmd3dHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3d1dGlsJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMKLQotbGlicG5nJChNT0RFTCkubGliOiAkKE9CSlMxKSAkKE9CSlMyKSAkKE9CSlMzKQotCSQoTElCKSBsaWJwbmckKE1PREVMKSArJChPQkpTTDEpCi0JJChMSUIpIGxpYnBuZyQoTU9ERUwpICskKE9CSlNMMikKLQkkKExJQikgbGlicG5nJChNT0RFTCkgKyQoT0JKU0wzKQotCi1wbmd0ZXN0JChFKTogcG5ndGVzdCQoTykgbGlicG5nJChNT0RFTCkubGliCi0JJChMRCkgJChMREZMQUdTKSBwbmd0ZXN0Lm9iaiBsaWJwbmckKE1PREVMKS5saWIgemxpYl8kKE1PREVMKS5saWIKLQotIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS52Y2F3aW4zMiBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUudmNhd2luMzIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjY3MTEuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtlZmlsZS52Y2F3aW4zMgorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcKLSMgQ29weXJpZ2h0IChDKSAyMDA2LDIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5OCBUaW0gV2VnbmVyCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwbmcuaAotIyBBc3N1bWVzIHRoYXQgemxpYi5saWIsIHpjb25mLmgsIGFuZCB6bGliLmggaGF2ZSBiZWVuIGNvcGllZCB0byAuLlx6bGliCi0jIFRvIHVzZSwgZG8gIm5tYWtlIC9mIHNjcmlwdHNcbWFrZWZpbGUudmNhd2luMzIiCi0KLSMgLS0tLS0tLS0gTWljcm9zb2Z0IFZpc3VhbCBDKysgMi4wIGFuZCBsYXRlciwgbm8gYXNzZW1ibGVyIGNvZGUgLS0tLS0tLS0KLSMgSWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIGFzc2VtYmxlciAoTU1YKSBjb2RlLCB1c2UgbWFrZWZpbGUudmN3aW4zMiBpbnN0ZWFkLgotCi0jIENvbXBpbGVyLCBsaW5rZXIsIGxpYnJhcmlhbiwgYW5kIG90aGVyIHRvb2xzCi1DQyA9IGNsCi1MRCA9IGxpbmsKLUFSID0gbGliCi1DRkxBR1MgID0gLW5vbG9nbyAtRFBOR19VU0VfUE5HVkNSRCAtTUQgLU8yIC1XMyAtSS4uXHpsaWIKLUxERkxBR1MgPSAtbm9sb2dvCi1BUkZMQUdTID0gLW5vbG9nbwotUk0gPSBkZWwKLQotIyBGaWxlIGV4dGVuc2lvbnMKLU89Lm9iagotCi0jdW5jb21tZW50IG5leHQgdG8gcHV0IGVycm9yIG1lc3NhZ2VzIGluIGEgZmlsZQotI0VSUkZJTEU9ID4+IHBuZ2VycnMubG9nCi0KLSMgVmFyaWFibGVzCi1PQkpTMSA9IHBuZyQoTykgcG5nZXJyb3IkKE8pIHBuZ2dldCQoTykgcG5nbWVtJChPKSBwbmdwcmVhZCQoTykKLU9CSlMyID0gcG5ncmVhZCQoTykgcG5ncmlvJChPKSBwbmdydHJhbiQoTykgcG5ncnV0aWwkKE8pIHBuZ3NldCQoTykKLU9CSlMzID0gcG5ndHJhbnMkKE8pIHBuZ3dpbyQoTykgcG5nd3JpdGUkKE8pIHBuZ3d0cmFuJChPKSBwbmd3dXRpbCQoTykKLU9CSlMgID0gJChPQkpTMSkgJChPQkpTMikgJChPQkpTMykKLQotIyBUYXJnZXRzCi1hbGw6IGxpYnBuZy5saWIKLQotcG5nJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdzZXQkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ2dldCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncHJlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3J0cmFuJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdydXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nZXJyb3IkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ21lbSQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncmlvJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3aW8kKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3RyYW5zJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3cml0ZSQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3RyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3d1dGlsJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1saWJwbmcubGliOiAkKE9CSlMpCi0JLSQoUk0pICRACi0JJChBUikgJChBUkZMQUdTKSAtb3V0OiRAICQoT0JKUykgJChFUlJGSUxFKQotCi1wbmd0ZXN0JChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd0ZXN0LmV4ZTogcG5ndGVzdCQoTykgbGlicG5nLmxpYgotCSQoTEQpICQoTERGTEFHUykgLW91dDokQCBwbmd0ZXN0JChPKSBsaWJwbmcubGliIC4uXHpsaWJcemxpYi5saWIgJChFUlJGSUxFKQotCi10ZXN0OiBwbmd0ZXN0LmV4ZQotCXBuZ3Rlc3QKLQotY2xlYW46Ci0JLSQoUk0pICokKE8pCi0JLSQoUk0pIGxpYnBuZy5saWIKLQktJChSTSkgcG5ndGVzdC5leGUKLQktJChSTSkgcG5nb3V0LnBuZwotCi0jIEVuZCBvZiBtYWtlZmlsZSBmb3IgbGlicG5nCi0KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUudmN3aW4zMiBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUudmN3aW4zMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4NDIzMi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLnZjd2luMzIKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nCi0jIENvcHlyaWdodCAoQykgMTk5OCBUaW0gV2VnbmVyCi0jIENvcHlyaWdodCAoQykgMjAwNiwyMDA5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLSMgQXNzdW1lcyB0aGF0IHpsaWIubGliLCB6Y29uZi5oLCBhbmQgemxpYi5oIGhhdmUgYmVlbiBjb3BpZWQgdG8gLi5cemxpYgotIyBUbyB1c2UsIGRvICJubWFrZSAvZiBzY3JpcHRzXG1ha2VmaWxlLnZjd2luMzIiCi0KLSMgLS0tLS0tLS0gTWljcm9zb2Z0IFZpc3VhbCBDKysgMi4wIGFuZCBsYXRlciwgbm8gYXNzZW1ibGVyIGNvZGUgLS0tLS0tLS0KLSMgSWYgeW91IHdhbnQgdG8gdXNlIGFzc2VtYmxlciAoTU1YKSBjb2RlLCB1c2UgbWFrZWZpbGUudmNhd2luMzIgaW5zdGVhZC4KLQotIyBDb21waWxlciwgbGlua2VyLCBsaWJyYXJpYW4sIGFuZCBvdGhlciB0b29scwotQ0MgPSBjbAotTEQgPSBsaW5rCi1BUiA9IGxpYgotQ0ZMQUdTICA9IC1ub2xvZ28gLURQTkdfTk9fTU1YX0NPREUgLU1EIC1PMiAtVzMgLUkuLlx6bGliCi1MREZMQUdTID0gLW5vbG9nbwotQVJGTEFHUyA9IC1ub2xvZ28KLVJNID0gZGVsCi0KLSMgRmlsZSBleHRlbnNpb25zCi1PPS5vYmoKLQotI3VuY29tbWVudCBuZXh0IHRvIHB1dCBlcnJvciBtZXNzYWdlcyBpbiBhIGZpbGUKLSNFUlJGSUxFPSA+PiBwbmdlcnJzLmxvZwotCi0jIFZhcmlhYmxlcwotT0JKUzEgPSBwbmckKE8pIHBuZ2Vycm9yJChPKSBwbmdnZXQkKE8pIHBuZ21lbSQoTykgcG5ncHJlYWQkKE8pCi1PQkpTMiA9IHBuZ3JlYWQkKE8pIHBuZ3JpbyQoTykgcG5ncnRyYW4kKE8pIHBuZ3J1dGlsJChPKSBwbmdzZXQkKE8pCi1PQkpTMyA9IHBuZ3RyYW5zJChPKSBwbmd3aW8kKE8pIHBuZ3dyaXRlJChPKSBwbmd3dHJhbiQoTykgcG5nd3V0aWwkKE8pCi1PQkpTICA9ICQoT0JKUzEpICQoT0JKUzIpICQoT0JKUzMpCi0KLSMgVGFyZ2V0cwotYWxsOiBsaWJwbmcubGliCi0KLXBuZyQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nc2V0JChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdnZXQkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3JlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3ByZWFkJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdydHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncnV0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ2Vycm9yJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdtZW0kKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3JpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd2lvJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd0cmFucyQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3JpdGUkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3d0cmFuJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgLWMgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotbGlicG5nLmxpYjogJChPQkpTKQotCS0kKFJNKSAkQAotCSQoQVIpICQoQVJGTEFHUykgLW91dDokQCAkKE9CSlMpICQoRVJSRklMRSkKLQotcG5ndGVzdCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ndGVzdC5leGU6IHBuZ3Rlc3QkKE8pIGxpYnBuZy5saWIKLQkkKExEKSAkKExERkxBR1MpIC1vdXQ6JEAgcG5ndGVzdCQoTykgbGlicG5nLmxpYiAuLlx6bGliXHpsaWIubGliICQoRVJSRklMRSkKLQotdGVzdDogcG5ndGVzdC5leGUKLQlwbmd0ZXN0Ci0KLWNsZWFuOgotCS0kKFJNKSAqJChPKQotCS0kKFJNKSBsaWJwbmcubGliCi0JLSQoUk0pIHBuZ3Rlc3QuZXhlCi0JLSQoUk0pIHBuZ291dC5wbmcKLQotIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZwotCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL21ha2VmaWxlLndhdGNvbSBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUud2F0Y29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTg2MGZjLi4wMDAwMDAwCi0tLSBhL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZWZpbGUud2F0Y29tCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGxpYnBuZwotIyBXYXRjb20gQy9DKysgMTAuMCBhbmQgbGF0ZXIsIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSwgZmxhdCBtZW1vcnkgbW9kZWwKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDAsIFBhd2VsIE1yb2NoZW4sIGJhc2VkIG9uIG1ha2VmaWxlLm1zYyB3aGljaCBpcwotIyBjb3B5cmlnaHQgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oCi0KLSMgVG8gdXNlLCBkbyAid21ha2UgL2Ygc2NyaXB0c1xtYWtlZmlsZS53YXRjb20iCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhdGNvbSBDL0MrKyAxMC4wIGFuZCBsYXRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLVpMSUJMSUI9Li5cemxpYgotWkxJQklOQz0uLlx6bGliCi0KLSMgVGFyZ2V0IE9TCi1PUz1ET1MKLSNPUz1OVAotCi0jIFRhcmdldCBDUFUKLUNQVT02CQkjIFBlbnRpdW0gUHJvCi0jQ1BVPTUJCSMgUGVudGl1bQotCi0jIENhbGxpbmcgY29udmVudGlvbgotQ0FMTElORz1yCSMgcmVnaXN0ZXJzCi0jQ0FMTElORz1zCSMgc3RhY2sKLQotIyBVbmNvbW1lbnQgbmV4dCB0byBwdXQgZXJyb3IgbWVzc2FnZXMgaW4gYSBmaWxlCi0jRVJSRklMRT0+PnBuZ2VycnMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLUNDPXdjYzM4NgotQ0ZMQUdTPS0kKENQVSkkKENBTExJTkcpIC1mcCQoQ1BVKSAtZnBpODcgLW9uZWF0eCAtbWYgLWJ0PSQoT1MpIC1pPSQoWkxJQklOQykgLXpxCi1MRD13Y2wzODYKLUxERkxBR1M9LXpxCi0KLU89Lm9iagotCi1PQkpTMT1wbmckKE8pIHBuZ3NldCQoTykgcG5nZ2V0JChPKSBwbmdydXRpbCQoTykgcG5ndHJhbnMkKE8pIHBuZ3d1dGlsJChPKQotT0JKUzI9cG5nbWVtJChPKSBwbmdwcmVhZCQoTykgcG5ncmVhZCQoTykgcG5nZXJyb3IkKE8pIHBuZ3dyaXRlJChPKQotT0JKUzM9cG5ncnRyYW4kKE8pIHBuZ3d0cmFuJChPKSBwbmdyaW8kKE8pIHBuZ3dpbyQoTykKLQotCi1hbGw6IHRlc3QKLQotcG5nJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdzZXQkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ2dldCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncHJlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3J0cmFuJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdydXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nZXJyb3IkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ21lbSQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncmlvJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3aW8kKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3Rlc3QkKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3RyYW5zJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3cml0ZSQoTyk6IHBuZy5oIHBuZ2NvbmYuaAotCSQoQ0MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3RyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmgKLQkkKENDKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3d1dGlsJChPKTogcG5nLmggcG5nY29uZi5oCi0JJChDQykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1saWJwbmcubGliOiAkKE9CSlMxKSAkKE9CSlMyKSAkKE9CSlMzKQotCXdsaWIgLWIgLWMgLW4gLXEgbGlicG5nLmxpYiAkKE9CSlMxKQotCXdsaWIgLWIgLWMgLXEgbGlicG5nLmxpYiAkKE9CSlMyKQotCXdsaWIgLWIgLWMgLXEgbGlicG5nLmxpYiAkKE9CSlMzKQotCi1wbmd0ZXN0LmV4ZTogcG5ndGVzdC5vYmogbGlicG5nLmxpYgotCSQoTEQpICQoTERGTEFHUykgcG5ndGVzdC5vYmogbGlicG5nLmxpYiAkKFpMSUJMSUIpXHpsaWIubGliCi0KLXRlc3Q6IHBuZ3Rlc3QuZXhlIC5zeW1ib2xpYwotCXBuZ3Rlc3QuZXhlCi0KLQotIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtldm1zLmNvbSBiL2xpYnMvbGlicG5nL3NjcmlwdHMvbWFrZXZtcy5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDExOTAuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9tYWtldm1zLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0kISBtYWtlIGxpYnBuZyB1bmRlciBWTVMKLSQhCi0kIQotJCEgQ2hlY2sgZm9yIE1NSy9NTVMKLSQhCi0kISBUaGlzIHByb2NlZHVyZSBhY2NlcHRzIG9uZSBwYXJhbWV0ZXIgKGNvbnRyaWIpLCB3aGljaCBjYXVzZXMgaXQgdG8gYnVpbGQKLSQhIHRoZSBwcm9ncmFtcyBmcm9tIHRoZSBjb250cmliIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIGxpYnBuZy4KLSQhCi0kIHAxID0gZiRlZGl0KHAxLCJVUENBU0UiKQotJCBpZiBwMSAuZXFzLiAiQ09OVFJJQiIKLSQgdGhlbgotJCAgIHNldCBkZWYgWy5jb250cmliLmdyZWdib29rXQotJCAgIEBtYWtldm1zCi0kICAgc2V0IGRlZiBbLS5wbmdtaW51c10KLSQgICBAbWFrZXZtcwotJCAgIHNldCBkZWYgWy0tXQotJCAgIGV4aXQKLSQgZW5kaWYKLSQgTWFrZSA9ICIiCi0kIElmIEYkU2VhcmNoICgiU3lzJFN5c3RlbTpNTVMuRVhFIikgLm5lcy4gIiIgVGhlbiBNYWtlID0gIk1NUyIKLSQgSWYgRiRUeXBlIChNTUspIC5lcXMuICJTVFJJTkciIFRoZW4gTWFrZSA9ICJNTUsiCi0kIQotJCEgTG9vayBmb3IgdGhlIGNvbXBpbGVyIHVzZWQKLSQhCi0kIHpsaWJzcmMgPSAiWy0uemxpYl0iCi0kIGNjb3B0PSIvaW5jbHVkZT0nJ3psaWJzcmMnIgotJCBpZiBmJGdldHN5aSgiSFdfTU9ERUwiKS5nZS4xMDI0Ci0kIHRoZW4KLSQgIGNjb3B0ID0gIi9wcmVmaXg9YWxsIitjY29wdAotJCAgY29tcCAgPSAiX19kZWNjX189MSIKLSQgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgotJCBlbHNlCi0kICBpZiBmJHNlYXJjaCgiU1lTJFNZU1RFTTpERUNDJENPTVBJTEVSLkVYRSIpLmVxcy4iIgotJCAgIHRoZW4KLSQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6Ci0kICAgIGlmIGYkc2VhcmNoKCJTWVMkU1lTVEVNOlZBWEMuRVhFIikuZXFzLiIiCi0kICAgICB0aGVuCi0kICAgICAgY29tcCAgPSAiX19nY2NfXz0xIgotJCAgICAgIENDIDo9PSBHQ0MKLSQgICAgIGVsc2UKLSQgICAgICBjb21wID0gIl9fdmF4Y19fPTEiCi0kICAgICBlbmRpZgotJCAgIGVsc2UKLSQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgZGVjYyRsaWJyYXJ5X2luY2x1ZGU6Ci0kICAgIGNjb3B0ID0gIi9kZWNjL3ByZWZpeD1hbGwiK2Njb3B0Ci0kICAgIGNvbXAgID0gIl9fZGVjY19fPTEiCi0kICBlbmRpZgotJCBlbmRpZgotJCEKLSQhIEJ1aWxkIHRoZSB0aGluZyBwbGFpbiBvciB3aXRoIG1tcy9tbWsKLSQhCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkNvbXBpbGluZyBMaWJwbmcgc291cmNlcyAuLi4iCi0kIGlmIG1ha2UuZXFzLiIiCi0kICB0aGVuCi0kICAgZGVsZSBwbmd0ZXN0Lm9iajsqCi0kICAgQ0FMTCBNQUtFIHBuZy5PQkogImNjICcnQ0NPUFQnIHBuZyIgLQotCXBuZy5jIHBuZy5oIHBuZ2NvbmYuaAotJCAgIENBTEwgTUFLRSBwbmdzZXQuT0JKICJjYyAnJ0NDT1BUJyBwbmdzZXQiIC0KLQlwbmdzZXQuYyBwbmcuaCBwbmdjb25mLmgKLSQgICBDQUxMIE1BS0UgcG5nZ2V0Lk9CSiAiY2MgJydDQ09QVCcgcG5nZ2V0IiAtCi0JcG5nZ2V0LmMgcG5nLmggcG5nY29uZi5oCi0kICAgQ0FMTCBNQUtFIHBuZ3JlYWQuT0JKICJjYyAnJ0NDT1BUJyBwbmdyZWFkIiAtCi0JcG5ncmVhZC5jIHBuZy5oIHBuZ2NvbmYuaAotJCAgIENBTEwgTUFLRSBwbmdwcmVhZC5PQkogImNjICcnQ0NPUFQnIHBuZ3ByZWFkIiAtCi0JcG5ncHJlYWQuYyBwbmcuaCBwbmdjb25mLmgKLSQgICBDQUxMIE1BS0UgcG5ncnRyYW4uT0JKICJjYyAnJ0NDT1BUJyBwbmdydHJhbiIgLQotCXBuZ3J0cmFuLmMgcG5nLmggcG5nY29uZi5oCi0kICAgQ0FMTCBNQUtFIHBuZ3J1dGlsLk9CSiAiY2MgJydDQ09QVCcgcG5ncnV0aWwiIC0KLQlwbmdydXRpbC5jIHBuZy5oIHBuZ2NvbmYuaAotJCAgIENBTEwgTUFLRSBwbmdlcnJvci5PQkogImNjICcnQ0NPUFQnIHBuZ2Vycm9yIiAtCi0JcG5nZXJyb3IuYyBwbmcuaCBwbmdjb25mLmgKLSQgICBDQUxMIE1BS0UgcG5nbWVtLk9CSiAiY2MgJydDQ09QVCcgcG5nbWVtIiAtCi0JcG5nbWVtLmMgcG5nLmggcG5nY29uZi5oCi0kICAgQ0FMTCBNQUtFIHBuZ3Jpby5PQkogImNjICcnQ0NPUFQnIHBuZ3JpbyIgLQotCXBuZ3Jpby5jIHBuZy5oIHBuZ2NvbmYuaAotJCAgIENBTEwgTUFLRSBwbmd3aW8uT0JKICJjYyAnJ0NDT1BUJyBwbmd3aW8iIC0KLQlwbmd3aW8uYyBwbmcuaCBwbmdjb25mLmgKLSQgICBDQUxMIE1BS0UgcG5ndHJhbnMuT0JKICJjYyAnJ0NDT1BUJyBwbmd0cmFucyIgLQotCXBuZ3RyYW5zLmMgcG5nLmggcG5nY29uZi5oCi0kICAgQ0FMTCBNQUtFIHBuZ3dyaXRlLk9CSiAiY2MgJydDQ09QVCcgcG5nd3JpdGUiIC0KLQlwbmd3cml0ZS5jIHBuZy5oIHBuZ2NvbmYuaAotJCAgIENBTEwgTUFLRSBwbmd3dHJhbi5PQkogImNjICcnQ0NPUFQnIHBuZ3d0cmFuIiAtCi0JcG5nd3RyYW4uYyBwbmcuaCBwbmdjb25mLmgKLSQgICBDQUxMIE1BS0UgcG5nd3V0aWwuT0JKICJjYyAnJ0NDT1BUJyBwbmd3dXRpbCIgLQotCXBuZ3d1dGlsLmMgcG5nLmggcG5nY29uZi5oCi0kICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgTGlicG5nIC4uLiIKLSQgICBDQUxMIE1BS0UgbGlicG5nLk9MQiAibGliL2NyZWEgbGlicG5nLm9sYiAqLm9iaiIgKi5PQkoKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBwbmd0ZXN0Li4uIgotJCAgIENBTEwgTUFLRSBwbmd0ZXN0Lk9CSiAiY2MgJydDQ09QVCcgcG5ndGVzdCIgLQotCXBuZ3Rlc3QuYyBwbmcuaCBwbmdjb25mLmgKLSQgICBjYWxsIG1ha2UgcG5ndGVzdC5leGUgLQotCSJMSU5LIHBuZ3Rlc3QsbGlicG5nLm9sYi9saWIsJyd6bGlic3JjJ2xpYnoub2xiL2xpYiIgLQotCXBuZ3Rlc3Qub2JqIGxpYnBuZy5vbGIKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJUZXN0aW5nIExpYnBuZy4uLiIKLSQgICBydW4gcG5ndGVzdAotJCAgZWxzZQotJCAgIGlmIGYkc2VhcmNoKCJERVNDUklQLk1NUyIpIC5lcXMuICIiIHRoZW4gY29weS9ub2xvZyBbLlNDUklQVFNdREVTQ1JJUC5NTVMgW10KLSQgICAnbWFrZScvbWFjcm89KCdjb21wJyx6bGlic3JjPSd6bGlic3JjJykKLSQgIGVuZGlmCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkxpYnBuZyBidWlsZCBjb21wbGV0ZWQiCi0kIGV4aXQKLSQhCi0kIQotJE1BS0U6IFNVQlJPVVRJTkUgICAhU1VCUk9VVElORSBUTyBDSEVDSyBERVBFTkRFTkNJRVMKLSQgViA9ICdGJFZlcmlmeSgwKQotJCEgUDEgPSBXaGF0IHdlIGFyZSB0cnlpbmcgdG8gbWFrZQotJCEgUDIgPSBDb21tYW5kIHRvIG1ha2UgaXQKLSQhIFAzIC0gUDggIFdoYXQgaXQgZGVwZW5kcyBvbgotJAotJCBJZiBGJFNlYXJjaChQMSkgLkVxcy4gIiIgVGhlbiBHb3RvIE1ha2VpdAotJCBUaW1lID0gRiRDdlRpbWUoRiRGaWxlKFAxLCJSRFQiKSkKLSRhcmc9MwotJExvb3A6Ci0kICAgICAgIEFyZ3VtZW50ID0gUCdhcmcKLSQgICAgICAgSWYgQXJndW1lbnQgLkVxcy4gIiIgVGhlbiBHb3RvIEV4aXQKLSQgICAgICAgRWw9MAotJExvb3AyOgotJCAgICAgICBGaWxlID0gRiRFbGVtZW50KEVsLCIgIixBcmd1bWVudCkKLSQgICAgICAgSWYgRmlsZSAuRXFzLiAiICIgVGhlbiBHb3RvIEVuZGwKLSQgICAgICAgQUZpbGUgPSAiIgotJExvb3AzOgotJCAgICAgICBPRmlsZSA9IEFGaWxlCi0kICAgICAgIEFGaWxlID0gRiRTZWFyY2goRmlsZSkKLSQgICAgICAgSWYgQUZpbGUgLkVxcy4gIiIgLk9yLiBBRmlsZSAuRXFzLiBPRmlsZSBUaGVuIEdvdG8gTmV4dEVsCi0kICAgICAgIElmIEYkQ3ZUaW1lKEYkRmlsZShBRmlsZSwiUkRUIikpIC5HZXMuIFRpbWUgVGhlbiBHb3RvIE1ha2VpdAotJCAgICAgICBHb3RvIExvb3AzCi0kTmV4dEVMOgotJCAgICAgICBFbCA9IEVsICsgMQotJCAgICAgICBHb3RvIExvb3AyCi0kRW5kTDoKLSQgYXJnPWFyZysxCi0kIElmIGFyZyAuTGUuIDggVGhlbiBHb3RvIExvb3AKLSQgR290byBFeGl0Ci0kCi0kTWFrZWl0OgotJCBWVj1GJFZFUklGWSgwKQotJCB3cml0ZSBzeXMkb3V0cHV0IFAyCi0kICdQMgotJCBWVj0nRiRWZXJpZnkoVlYpCi0kRXhpdDoKLSQgSWYgViBUaGVuIFNldCBWZXJpZnkKLSRFTkRTVUJST1VUSU5FCmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL3BuZ29zMi5kZWYgYi9saWJzL2xpYnBuZy9zY3JpcHRzL3BuZ29zMi5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGIyZWUuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9wbmdvczIuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBORy5MSUIgbW9kdWxlIGRlZmluaXRpb24gZmlsZSBmb3IgT1MvMgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOyBWZXJzaW9uIDEuMi4zNwotCi1MSUJSQVJZCQlQTkcKLURFU0NSSVBUSU9OCSJQTkcgaW1hZ2UgY29tcHJlc3Npb24gbGlicmFyeSBmb3IgT1MvMiIKLUNPREUJCVBSRUxPQUQgTU9WRUFCTEUgRElTQ0FSREFCTEUKLURBVEEJCVBSRUxPQUQgTU9WRUFCTEUgTVVMVElQTEUKLQotRVhQT1JUUwotCi0KLSAgcG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlCi0gIHBuZ19jaGVja19zaWcKLSAgcG5nX2NodW5rX2Vycm9yCi0gIHBuZ19jaHVua193YXJuaW5nCi0gIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtCi0gIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90Ci0gIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QKLSAgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdAotICBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdAotICBwbmdfZGF0YV9mcmVlcgotICBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdAotICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdAotICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QKLSAgcG5nX2Vycm9yCi0gIHBuZ19mcmVlCi0gIHBuZ19mcmVlX2RhdGEKLSAgcG5nX2dldF9JSERSCi0gIHBuZ19nZXRfUExURQotICBwbmdfZ2V0X2JLR0QKLSAgcG5nX2dldF9iaXRfZGVwdGgKLSAgcG5nX2dldF9jSFJNCi0gIHBuZ19nZXRfY0hSTV9maXhlZAotICBwbmdfZ2V0X2NoYW5uZWxzCi0gIHBuZ19nZXRfY29sb3JfdHlwZQotICBwbmdfZ2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplCi0gIHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZQotICBwbmdfZ2V0X2NvcHlyaWdodAotICBwbmdfZ2V0X2Vycm9yX3B0cgotICBwbmdfZ2V0X2ZpbHRlcl90eXBlCi0gIHBuZ19nZXRfZ0FNQQotICBwbmdfZ2V0X2dBTUFfZml4ZWQKLSAgcG5nX2dldF9oSVNUCi0gIHBuZ19nZXRfaGVhZGVyX3ZlcgotICBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uCi0gIHBuZ19nZXRfaUNDUAotICBwbmdfZ2V0X2ltYWdlX2hlaWdodAotICBwbmdfZ2V0X2ltYWdlX3dpZHRoCi0gIHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUKLSAgcG5nX2dldF9pb19wdHIKLSAgcG5nX2dldF9saWJwbmdfdmVyCi0gIHBuZ19nZXRfb0ZGcwotICBwbmdfZ2V0X3BDQUwKLSAgcG5nX2dldF9wSFlzCi0gIHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvCi0gIHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlcgotICBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cgotICBwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cwotICBwbmdfZ2V0X3Jvd2J5dGVzCi0gIHBuZ19nZXRfcm93cwotICBwbmdfZ2V0X3NCSVQKLSAgcG5nX2dldF9zQ0FMCi0gIHBuZ19nZXRfc1BMVAotICBwbmdfZ2V0X3NSR0IKLSAgcG5nX2dldF9zaWduYXR1cmUKLSAgcG5nX2dldF90SU1FCi0gIHBuZ19nZXRfdFJOUwotICBwbmdfZ2V0X3RleHQKLSAgcG5nX2dldF91bmtub3duX2NodW5rcwotICBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyCi0gIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyCi0gIHBuZ19nZXRfdmFsaWQKLSAgcG5nX2dldF94X29mZnNldF9taWNyb25zCi0gIHBuZ19nZXRfeF9vZmZzZXRfcGl4ZWxzCi0gIHBuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyCi0gIHBuZ19nZXRfeV9vZmZzZXRfbWljcm9ucwotICBwbmdfZ2V0X3lfb2Zmc2V0X3BpeGVscwotICBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcgotICBwbmdfbWFsbG9jCi0gIHBuZ19tZW1jcHlfY2hlY2sKLSAgcG5nX21lbXNldF9jaGVjawotICBwbmdfcGVybWl0X2VtcHR5X3BsdGUKLSAgcG5nX3Byb2Nlc3NfZGF0YQotICBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cKLSAgcG5nX3JlYWRfZW5kCi0gIHBuZ19yZWFkX2ltYWdlCi0gIHBuZ19yZWFkX2luZm8KLTsgcG5nX3JlYWRfaW5pdCA7IGRlcHJlY2F0ZWQKLSAgcG5nX3JlYWRfcG5nCi0gIHBuZ19yZWFkX3JvdwotICBwbmdfcmVhZF9yb3dzCi0gIHBuZ19yZWFkX3VwZGF0ZV9pbmZvCi0gIHBuZ19yZXNldF96c3RyZWFtCi0gIHBuZ19zZXRfSUhEUgotICBwbmdfc2V0X1BMVEUKLSAgcG5nX3NldF9iS0dECi0gIHBuZ19zZXRfYmFja2dyb3VuZAotICBwbmdfc2V0X2JncgotICBwbmdfc2V0X2NIUk0KLSAgcG5nX3NldF9jSFJNX2ZpeGVkCi0gIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUKLSAgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbAotICBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbAotICBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZAotICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5Ci0gIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMKLSAgcG5nX3NldF9jcmNfYWN0aW9uCi0gIHBuZ19zZXRfZGl0aGVyCi0gIHBuZ19zZXRfZXJyb3JfZm4KLSAgcG5nX3NldF9leHBhbmQKLSAgcG5nX3NldF9maWxsZXIKLSAgcG5nX3NldF9maWx0ZXIKLSAgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljcwotICBwbmdfc2V0X2ZsdXNoCi0gIHBuZ19zZXRfZ0FNQQotICBwbmdfc2V0X2dBTUFfZml4ZWQKLSAgcG5nX3NldF9nYW1tYQotOyBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCA7IGRlcHJlY2F0ZWQgYXMgb2YgbGlicG5nLTEuMi45Ci0gIHBuZ19zZXRfZ3JheV90b19yZ2IKLSAgcG5nX3NldF9oSVNUCi0gIHBuZ19zZXRfaUNDUAotICBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZwotICBwbmdfc2V0X2ludmVydF9hbHBoYQotICBwbmdfc2V0X2ludmVydF9tb25vCi0gIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcwotICBwbmdfc2V0X29GRnMKLSAgcG5nX3NldF9wQ0FMCi0gIHBuZ19zZXRfcEhZcwotICBwbmdfc2V0X3BhY2tpbmcKLSAgcG5nX3NldF9wYWNrc3dhcAotICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiCi0gIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbgotICBwbmdfc2V0X3JlYWRfZm4KLSAgcG5nX3NldF9yZWFkX3N0YXR1c19mbgotICBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbgotICBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4KLSAgcG5nX3NldF9yZ2JfdG9fZ3JheQotICBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkCi0gIHBuZ19zZXRfcm93cwotICBwbmdfc2V0X3NCSVQKLSAgcG5nX3NldF9zQ0FMCi0gIHBuZ19zZXRfc1BMVAotICBwbmdfc2V0X3NSR0IKLSAgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0KLSAgcG5nX3NldF9zaGlmdAotICBwbmdfc2V0X3NpZ19ieXRlcwotICBwbmdfc2V0X3N0cmlwXzE2Ci0gIHBuZ19zZXRfc3RyaXBfYWxwaGEKLSAgcG5nX3NldF9zd2FwCi0gIHBuZ19zZXRfc3dhcF9hbHBoYQotICBwbmdfc2V0X3RJTUUKLSAgcG5nX3NldF90Uk5TCi0gIHBuZ19zZXRfdFJOU190b19hbHBoYQotICBwbmdfc2V0X3RleHQKLSAgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uCi0gIHBuZ19zZXRfdW5rbm93bl9jaHVua3MKLSAgcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvCi0gIHBuZ19zZXRfd3JpdGVfZm4KLSAgcG5nX3NldF93cml0ZV9zdGF0dXNfZm4KLSAgcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbgotICBwbmdfc2lnX2NtcAotICBwbmdfc3RhcnRfcmVhZF9pbWFnZQotICBwbmdfd2FybmluZwotICBwbmdfd3JpdGVfY2h1bmsKLSAgcG5nX3dyaXRlX2NodW5rX2RhdGEKLSAgcG5nX3dyaXRlX2NodW5rX2VuZAotICBwbmdfd3JpdGVfY2h1bmtfc3RhcnQKLSAgcG5nX3dyaXRlX2VuZAotICBwbmdfd3JpdGVfZmx1c2gKLSAgcG5nX3dyaXRlX2ltYWdlCi0gIHBuZ193cml0ZV9pbmZvCi0gIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFCi07IHBuZ193cml0ZV9pbml0IDsgZGVwcmVjYXRlZAotICBwbmdfd3JpdGVfcG5nCi0gIHBuZ193cml0ZV9yb3cKLSAgcG5nX3dyaXRlX3Jvd3MKLSAgcG5nX3JlYWRfaW5pdF8yCi0gIHBuZ193cml0ZV9pbml0XzIKLSAgcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcgotICBwbmdfaW5pdF9pbwotICBwbmdfY29udmVydF90b19yZmMxMTIzCi0gIHBuZ19zZXRfaW52YWxpZAotCi07IEFkZGVkIGF0IHZlcnNpb24gMS4yLjA6Ci0gIHBuZ19tbXhfc3VwcG9ydAotICBwbmdfcGVybWl0X2VtcHR5X3BsdGUKLSAgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMKLSAgcG5nX2dldF9tbXhfZmxhZ21hc2sKLSAgcG5nX2dldF9hc21fZmxhZ21hc2sKLSAgcG5nX2dldF9hc21fZmxhZ3MKLSAgcG5nX2dldF9tbXhfYml0ZGVwdGhfdGhyZXNob2xkCi0gIHBuZ19nZXRfbW14X3Jvd2J5dGVzX3RocmVzaG9sZAotICBwbmdfc2V0X2FzbV9mbGFncwotICBwbmdfaW5pdF9tbXhfZmxhZ3MKLQotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi4yOgotICBwbmdfaGFuZGxlX2FzX3Vua25vd24KLQotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi4yIGFuZCBkZWxldGVkIGZyb20gMS4yLjM6Ci07IHBuZ196YWxsb2MKLTsgcG5nX3pmcmVlCi0KLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjIuNAotICBwbmdfbWFsbG9jX3dhcm4KLQotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi42Ci0gIHBuZ19zZXRfdXNlcl9saW1pdHMKLSAgcG5nX2dldF91c2VyX2hlaWdodF9tYXgKLSAgcG5nX2dldF91c2VyX3dpZHRoX21heAotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi43Ci0gIHBuZ19zZXRfYWRkX2FscGhhCi0KLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjIuOQotICBwbmdfZ2V0X3VpbnRfMzIKLSAgcG5nX3NhdmVfdWludF8zMgotICBwbmdfZ2V0X3VpbnRfMTYKLSAgcG5nX3NhdmVfdWludF8xNgotICBwbmdfZ2V0X2ludF8zMgotICBwbmdfc2F2ZV9pbnRfMzIKLSAgcG5nX2dldF91aW50XzMxCi0gIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOAotCi07IFRoZXNlIGFyZSBub3QgcHJlc2VudCB3aGVuIGxpYnBuZyBpcyBjb21waWxlZCB3aXRoIFBOR19OT19HTE9CQUxfQVJSQVlTCi0gIHBuZ19wYXNzX3N0YXJ0Ci0gIHBuZ19wYXNzX2luYwotICBwbmdfcGFzc195c3RhcnQKLSAgcG5nX3Bhc3NfeWluYwotICBwbmdfcGFzc19tYXNrCi0gIHBuZ19wYXNzX2RzcF9tYXNrCi07IHBuZ19wYXNzX3dpZHRoCi07IHBuZ19wYXNzX2hlaWdodAotCi07IFRoZXNlIGFyZSBub3QgcHJlc2VudCB3aGVuIGxpYnBuZyBpcyBjb21waWxlZCB3aXRoIFBOR19OT19HTE9CQUxfQVJSQVlTCi0gIHBuZ19JSERSCi0gIHBuZ19JREFUCi0gIHBuZ19JRU5ECi0gIHBuZ19QTFRFCi0gIHBuZ19iS0dECi0gIHBuZ19jSFJNCi0gIHBuZ19nQU1BCi0gIHBuZ19oSVNUCi0gIHBuZ19pQ0NQCi0gIHBuZ19pVFh0Ci0gIHBuZ19vRkZzCi0gIHBuZ19wQ0FMCi0gIHBuZ19wSFlzCi0gIHBuZ19zQklUCi0gIHBuZ19zQ0FMCi0gIHBuZ19zUExUCi0gIHBuZ19zUkdCCi0gIHBuZ190RVh0Ci0gIHBuZ190SU1FCi0gIHBuZ190Uk5TCi0gIHBuZ196VFh0CmRpZmYgLS1naXQgYS9saWJzL2xpYnBuZy9zY3JpcHRzL3BuZ3czMi5kZWYgYi9saWJzL2xpYnBuZy9zY3JpcHRzL3BuZ3czMi5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNmRmMzUuLjAwMDAwMDAKLS0tIGEvbGlicy9saWJwbmcvc2NyaXB0cy9wbmd3MzIuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTElCUE5HIG1vZHVsZSBkZWZpbml0aW9uIGZpbGUgZm9yIFdpbmRvd3MKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTElCUkFSWQotCi1FWFBPUlRTCi07VmVyc2lvbiAxLjIuMzcKLSAgcG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlICBAMQotICBwbmdfY2hlY2tfc2lnICAgICAgICBAMgotICBwbmdfY2h1bmtfZXJyb3IgICAgICBAMwotICBwbmdfY2h1bmtfd2FybmluZyAgICAgIEA0Ci0gIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtICAgQDUKLSAgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QgICAgQDYKLSAgcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCAgICAgQDcKLSAgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCAgICAgQDgKLSAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QgICAgQDkKLSAgcG5nX2RhdGFfZnJlZXIgICAgQDEwCi0gIHBuZ19kZXN0cm95X2luZm9fc3RydWN0ICBAMTEKLSAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QgIEAxMgotICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QgIEAxMwotICBwbmdfZXJyb3IgICAgQDE0Ci0gIHBuZ19mcmVlICAgICAgQDE1Ci0gIHBuZ19mcmVlX2RhdGEgICAgQDE2Ci0gIHBuZ19nZXRfSUhEUiAgICBAMTcKLSAgcG5nX2dldF9QTFRFICAgIEAxOAotICBwbmdfZ2V0X2JLR0QgICAgQDE5Ci0gIHBuZ19nZXRfYml0X2RlcHRoICAgIEAyMAotICBwbmdfZ2V0X2NIUk0gICAgQDIxCi0gIHBuZ19nZXRfY0hSTV9maXhlZCAgQDIyCi0gIHBuZ19nZXRfY2hhbm5lbHMgICAgQDIzCi0gIHBuZ19nZXRfY29sb3JfdHlwZSAgQDI0Ci0gIHBuZ19nZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUgIEAyNQotICBwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUgIEAyNgotICBwbmdfZ2V0X2NvcHlyaWdodCAgICBAMjcKLSAgcG5nX2dldF9lcnJvcl9wdHIgICAgQDI4Ci0gIHBuZ19nZXRfZmlsdGVyX3R5cGUgIEAyOQotICBwbmdfZ2V0X2dBTUEgICAgQDMwCi0gIHBuZ19nZXRfZ0FNQV9maXhlZCAgQDMxCi0gIHBuZ19nZXRfaElTVCAgICBAMzIKLSAgcG5nX2dldF9oZWFkZXJfdmVyICBAMzMKLSAgcG5nX2dldF9oZWFkZXJfdmVyc2lvbiAgQDM0Ci0gIHBuZ19nZXRfaUNDUCAgICBAMzUKLSAgcG5nX2dldF9pbWFnZV9oZWlnaHQgIEAzNgotICBwbmdfZ2V0X2ltYWdlX3dpZHRoICBAMzcKLSAgcG5nX2dldF9pbnRlcmxhY2VfdHlwZSAgQDM4Ci0gIHBuZ19nZXRfaW9fcHRyICAgIEAzOQotICA7IHBuZ19nZXRfbGlicG5nX3ZlciAgQDQwCi0gIHBuZ19nZXRfb0ZGcyAgICBANDEKLSAgcG5nX2dldF9wQ0FMICAgIEA0MgotICBwbmdfZ2V0X3BIWXMgICAgQDQzCi0gIHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvICBANDQKLSAgcG5nX2dldF9waXhlbHNfcGVyX21ldGVyICBANDUKLSAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIgIEA0NgotICBwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cyAgQDQ3Ci0gIHBuZ19nZXRfcm93Ynl0ZXMgICAgQDQ4Ci0gIHBuZ19nZXRfcm93cyAgICBANDkKLSAgcG5nX2dldF9zQklUICAgIEA1MAotICBwbmdfZ2V0X3NDQUwgICAgQDUxCi0gIHBuZ19nZXRfc1BMVCAgICBANTIKLSAgcG5nX2dldF9zUkdCICAgIEA1MwotICBwbmdfZ2V0X3NpZ25hdHVyZSAgICBANTQKLSAgcG5nX2dldF90SU1FICAgIEA1NQotICBwbmdfZ2V0X3RSTlMgICAgQDU2Ci0gIHBuZ19nZXRfdGV4dCAgICBANTcKLSAgcG5nX2dldF91bmtub3duX2NodW5rcyAgQDU4Ci0gIHBuZ19nZXRfdXNlcl9jaHVua19wdHIgIEA1OQotICBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0ciAgQDYwCi0gIHBuZ19nZXRfdmFsaWQgICAgQDYxCi0gIHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyAgQDYyCi0gIHBuZ19nZXRfeF9vZmZzZXRfcGl4ZWxzICBANjMKLSAgcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIgIEA2NAotICBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMgIEA2NQotICBwbmdfZ2V0X3lfb2Zmc2V0X3BpeGVscyAgQDY2Ci0gIHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyICBANjcKLSAgcG5nX21hbGxvYyAgICBANjgKLSAgcG5nX21lbWNweV9jaGVjayAgICBANjkKLSAgcG5nX21lbXNldF9jaGVjayAgICBANzAKLTsgcG5nX3Blcm1pdF9lbXB0eV9wbHRlIGlzIGRlcHJlY2F0ZWQKLSAgcG5nX3Blcm1pdF9lbXB0eV9wbHRlICBANzEKLSAgcG5nX3Byb2Nlc3NfZGF0YSAgICBANzIKLSAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93ICBANzMKLSAgcG5nX3JlYWRfZW5kICAgIEA3NAotICBwbmdfcmVhZF9pbWFnZSAgICBANzUKLSAgcG5nX3JlYWRfaW5mbyAgICBANzYKLTsgcG5nX3JlYWRfaW5pdCBpcyBkZXByZWNhdGVkCi0gIHBuZ19yZWFkX2luaXQgICAgQDc3Ci0gIHBuZ19yZWFkX3BuZyAgICBANzgKLSAgcG5nX3JlYWRfcm93ICAgIEA3OQotICBwbmdfcmVhZF9yb3dzICAgIEA4MAotICBwbmdfcmVhZF91cGRhdGVfaW5mbyAgQDgxCi0gIHBuZ19yZXNldF96c3RyZWFtICAgIEA4MgotICBwbmdfc2V0X0lIRFIgICAgQDgzCi0gIHBuZ19zZXRfUExURSAgICBAODQKLSAgcG5nX3NldF9iS0dEICAgIEA4NQotICBwbmdfc2V0X2JhY2tncm91bmQgIEA4NgotICBwbmdfc2V0X2JnciAgICBAODcKLSAgcG5nX3NldF9jSFJNICAgIEA4OAotICBwbmdfc2V0X2NIUk1fZml4ZWQgIEA4OQotICBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplICBAOTAKLSAgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbCAgQDkxCi0gIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsICBAOTIKLSAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QgIEA5MwotICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5ICBAOTQKLSAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyAgQDk1Ci0gIHBuZ19zZXRfY3JjX2FjdGlvbiAgQDk2Ci0gIHBuZ19zZXRfZGl0aGVyICAgIEA5NwotICBwbmdfc2V0X2Vycm9yX2ZuICAgIEA5OAotICBwbmdfc2V0X2V4cGFuZCAgICBAOTkKLSAgcG5nX3NldF9maWxsZXIgICAgQDEwMAotICBwbmdfc2V0X2ZpbHRlciAgICBAMTAxCi0gIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MgIEAxMDIKLSAgcG5nX3NldF9mbHVzaCAgICBAMTAzCi0gIHBuZ19zZXRfZ0FNQSAgICBAMTA0Ci0gIHBuZ19zZXRfZ0FNQV9maXhlZCAgQDEwNQotICBwbmdfc2V0X2dhbW1hICAgIEAxMDYKLTsgcG5nX3NldF9ncmF5XzFfMl80X3RvXzggaXMgZGVwcmVjYXRlZAotICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCAgQDEwNwotICBwbmdfc2V0X2dyYXlfdG9fcmdiICBAMTA4Ci0gIHBuZ19zZXRfaElTVCAgICBAMTA5Ci0gIHBuZ19zZXRfaUNDUCAgICBAMTEwCi0gIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nICBAMTExCi0gIHBuZ19zZXRfaW52ZXJ0X2FscGhhICBAMTEyCi0gIHBuZ19zZXRfaW52ZXJ0X21vbm8gIEAxMTMKLSAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzICBAMTE0Ci0gIHBuZ19zZXRfb0ZGcyAgICBAMTE1Ci0gIHBuZ19zZXRfcENBTCAgICBAMTE2Ci0gIHBuZ19zZXRfcEhZcyAgICBAMTE3Ci0gIHBuZ19zZXRfcGFja2luZyAgICBAMTE4Ci0gIHBuZ19zZXRfcGFja3N3YXAgICAgQDExOQotICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiICBAMTIwCi0gIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbiAgQDEyMQotICBwbmdfc2V0X3JlYWRfZm4gICAgQDEyMgotICBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuICBAMTIzCi0gIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuICBAMTI0Ci0gIHBuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbiAgQDEyNQotICBwbmdfc2V0X3JnYl90b19ncmF5ICBAMTI2Ci0gIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQgIEAxMjcKLSAgcG5nX3NldF9yb3dzICAgIEAxMjgKLSAgcG5nX3NldF9zQklUICAgIEAxMjkKLSAgcG5nX3NldF9zQ0FMICAgIEAxMzAKLSAgcG5nX3NldF9zUExUICAgIEAxMzEKLSAgcG5nX3NldF9zUkdCICAgIEAxMzIKLSAgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0gIEAxMzMKLSAgcG5nX3NldF9zaGlmdCAgICBAMTM0Ci0gIHBuZ19zZXRfc2lnX2J5dGVzICAgIEAxMzUKLSAgcG5nX3NldF9zdHJpcF8xNiAgICBAMTM2Ci0gIHBuZ19zZXRfc3RyaXBfYWxwaGEgIEAxMzcKLSAgcG5nX3NldF9zd2FwICAgIEAxMzgKLSAgcG5nX3NldF9zd2FwX2FscGhhICBAMTM5Ci0gIHBuZ19zZXRfdElNRSAgICBAMTQwCi0gIHBuZ19zZXRfdFJOUyAgICBAMTQxCi0gIHBuZ19zZXRfdFJOU190b19hbHBoYSAgQDE0MgotICBwbmdfc2V0X3RleHQgICAgQDE0MwotICBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24gIEAxNDQKLSAgcG5nX3NldF91bmtub3duX2NodW5rcyAgQDE0NQotICBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8gIEAxNDYKLSAgcG5nX3NldF93cml0ZV9mbiAgICBAMTQ3Ci0gIHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuICBAMTQ4Ci0gIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4gIEAxNDkKLSAgcG5nX3NpZ19jbXAgICAgQDE1MAotICBwbmdfc3RhcnRfcmVhZF9pbWFnZSAgQDE1MQotICBwbmdfd2FybmluZyAgICBAMTUyCi0gIHBuZ193cml0ZV9jaHVuayAgICBAMTUzCi0gIHBuZ193cml0ZV9jaHVua19kYXRhICBAMTU0Ci0gIHBuZ193cml0ZV9jaHVua19lbmQgIEAxNTUKLSAgcG5nX3dyaXRlX2NodW5rX3N0YXJ0ICBAMTU2Ci0gIHBuZ193cml0ZV9lbmQgICAgQDE1NwotICBwbmdfd3JpdGVfZmx1c2ggICAgQDE1OAotICBwbmdfd3JpdGVfaW1hZ2UgICAgQDE1OQotICBwbmdfd3JpdGVfaW5mbyAgICBAMTYwCi0gIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFICBAMTYxCi07IHBuZ193cml0ZV9pbml0IGlzIGRlcHJlY2F0ZWQKLSAgcG5nX3dyaXRlX2luaXQgICAgQDE2MgotICBwbmdfd3JpdGVfcG5nICAgIEAxNjMKLSAgcG5nX3dyaXRlX3JvdyAgICBAMTY0Ci0gIHBuZ193cml0ZV9yb3dzICAgIEAxNjUKLTsgcG5nX3JlYWRfaW5pdF8yIGFuZCBwbmdfd3JpdGVfaW5pdF8yIGFyZSBkZXByZWNhdGVkLgotICBwbmdfcmVhZF9pbml0XzIgICAgQDE2NgotICBwbmdfd3JpdGVfaW5pdF8yICAgIEAxNjcKLSAgcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlciAgQDE2OAotOyBwbmdfc2lnX2J5dGVzICAgIEAxNjkKLTsgUmVtb3ZlZCBmcm9tIHZlcnNpb24gMS4yLjIwCi07IHBuZ19saWJwbmdfdmVyICAgIEAxNzAKLTsKLSAgcG5nX2luaXRfaW8gICAgQDE3MQotICBwbmdfY29udmVydF90b19yZmMxMTIzICAgICBAMTcyCi0gIHBuZ19zZXRfaW52YWxpZCAgQDE3MwotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMC4xMgotOyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIDEuMC43LTEuMC4xMQotOyBwbmdfaW5mb19pbml0IEAxNzQKLTsgcG5nX3JlYWRfaW5pdF8zLCBwbmdfaW5mb19pbml0XzMsIGFuZCBwbmdfd3JpdGVfaW5pdF8zIGFyZSBkZXByZWNhdGVkLgotICBwbmdfcmVhZF9pbml0XzMgICAgQDE3NQotICBwbmdfd3JpdGVfaW5pdF8zICAgIEAxNzYKLSAgcG5nX2luZm9faW5pdF8zIEAxNzcKLSAgcG5nX2Rlc3Ryb3lfc3RydWN0ICBAMTc4Ci07IEFkZGVkIGF0IHZlcnNpb24gMS4yLjAKLTsgRm9yIHVzZSB3aXRoIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgcG5nX2Rlc3Ryb3lfc3RydWN0XzIgIEAxNzkKLSAgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yIEAxODAKLSAgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMiBAMTgxCi0gIHBuZ19tYWxsb2NfZGVmYXVsdCBAMTgyCi0gIHBuZ19mcmVlX2RlZmF1bHQgQDE4MwotOyBNTkcgZmVhdHVyZXMKLSAgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMgIEAxODQKLTsgTU1YIHN1cHBvcnQKLSAgcG5nX21teF9zdXBwb3J0ICBAMTg1Ci07IHBuZ19nZXRfbW14X2ZsYWdtYXNrICBAMTg2Ci0gIHBuZ19nZXRfYXNtX2ZsYWdtYXNrICBAMTg3Ci0gIHBuZ19nZXRfYXNtX2ZsYWdzICBAMTg4Ci07IHBuZ19nZXRfbW14X2JpdGRlcHRoX3RocmVzaG9sZCAgQDE4OQotOyBwbmdfZ2V0X21teF9yb3dieXRlc190aHJlc2hvbGQgIEAxOTAKLSAgcG5nX3NldF9hc21fZmxhZ3MgIEAxOTEKLTsgcG5nX2luaXRfbW14X2ZsYWdzICBAMTkyCi07IFN0cmlwIGVycm9yIG51bWJlcnMKLSAgcG5nX3NldF9zdHJpcF9lcnJvcl9udW1iZXJzIEAxOTMKLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjIuMgotICBwbmdfaGFuZGxlX2FzX3Vua25vd24gQDE5NAotOyBBZGRlZCBhdCB2ZXJzaW9uIDEuMi4yIGFuZCBkZWxldGVkIGZyb20gMS4yLjMKLTsgcG5nX3phbGxvYyBAMTk1Ci07IHBuZ196ZnJlZSBAMTk2Ci07IEFkZGVkIGF0IHZlcnNpb24gMS4yLjQKLSAgcG5nX21hbGxvY193YXJuIEAxOTUKLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjIuNgotICBwbmdfbWFsbG9jX3dhcm4gQDE5NQotICBwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heCBAMTk2Ci0gIHBuZ19nZXRfdXNlcl93aWR0aF9tYXggQDE5NwotICBwbmdfc2V0X3VzZXJfbGltaXRzIEAxOTgKLTsgQWRkZWQgYXQgdmVyc2lvbiAxLjIuNwotICBwbmdfc2V0X2FkZF9hbHBoYSBAMTk5Ci07IEFkZGVkIGF0IHZlcnNpb24gMS4yLjkKLSAgcG5nX2dldF91aW50XzMyIEAyMDAKLSAgcG5nX3NhdmVfdWludF8zMiBAMjAxCi0gIHBuZ19nZXRfdWludF8xNiBAMjAyCi0gIHBuZ19zYXZlX3VpbnRfMTYgQDIwMwotICBwbmdfZ2V0X2ludF8zMiBAMjA0Ci0gIHBuZ19zYXZlX2ludF8zMiBAMjA1Ci0gIHBuZ19nZXRfdWludF8zMSBAMjA2Ci0gIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCAgQDIwNwpkaWZmIC0tZ2l0IGEvbGlicy9saWJwbmcvc2NyaXB0cy9wbmd3MzIucmMgYi9saWJzL2xpYnBuZy9zY3JpcHRzL3BuZ3czMi5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlMzBlMi4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL3BuZ3czMi5yYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0jZGVmaW5lIFBOR19WRVJTSU9OX0lORk9fT05MWQotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgIi4uL3BuZy5oIgotCi0jZGVmaW5lIF9RVU9URSh4KSAjIHgKLSNkZWZpbmUgUVVPVEUoeCkgX1FVT1RFKHgpCi0KLSNkZWZpbmUgUE5HX0xJQlBOR19ETExGTkFNRSAiTElCUE5HIgotCi0vKiBTdXBwb3J0IGRlcHJlY2F0ZWQgUFJJVkFURUJVSUxEIG1hY3JvICovCi0jaWYgZGVmaW5lZChQUklWQVRFQlVJTEQpICYmICFkZWZpbmVkKFBOR19VU0VSX1BSSVZBVEVCVUlMRCkKLSMgIGRlZmluZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQgUFJJVkFURUJVSUxECi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWCkgJiYgIWRlZmluZWQoUE5HX1VTRVJfUFJJVkFURUJVSUxEKQotIyAgZXJyb3IgIlBOR19VU0VSX1BSSVZBVEVCVUlMRCBtdXN0IGJlIGRlZmluZWQgYXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGVcCi0gY3VzdG9tIGNoYW5nZXMgbWFkZSB0byB0aGUgbGlicmFyeS4iCi0jZW5kaWYKLQotLyogUHJpb3JpdGl6ZSBQTkdfVVNFUl94IG92ZXIgUE5HX0xJQlBOR194ICovCi0jaWZkZWYgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWAotIyAgdW5kZWYgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYCi0jICBkZWZpbmUgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYIFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVgKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NTUVOVFMKLSMgIHVuZGVmIFBOR19MSUJQTkdfVkVSU0lPTklORk9fQ09NTUVOVFMKLSMgIGRlZmluZSBQTkdfTElCUE5HX1ZFUlNJT05JTkZPX0NPTU1FTlRTIFBOR19VU0VSX1ZFUlNJT05JTkZPX0NPTU1FTlRTCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX0RFQlVHKSAmJiAoUE5HX0RFQlVHID4gMCkKLSMgIGRlZmluZSBWU19ERUJVRyBWU19GRl9ERUJVRwotIyAgaWZuZGVmIFBOR19MSUJQTkdfRExMRk5BTUVfUE9TVEZJWAotIyAgICBkZWZpbmUgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYICJEIgotIyAgZW5kaWYgLyogUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYICovCi0jICBpZm5kZWYgUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUwotIyAgICBkZWZpbmUgUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUyAiUE5HX0RFQlVHPSIgUVVPVEUoUE5HX0RFQlVHKQotIyAgZW5kaWYgLyogUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUyAqLwotI2Vsc2UKLSMgIGRlZmluZSBWU19ERUJVRyAwCi0jICBpZm5kZWYgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYCi0jICAgICBkZWZpbmUgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYCi0jICBlbmRpZiAvKiBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVggKi8KLSNlbmRpZiAvKiBkZWZpbmVkKERFQlVHKS4uLiAqLwotCi0jaWZkZWYgUE5HX1VTRVJfUFJJVkFURUJVSUxECi0jICBkZWZpbmUgVlNfUFJJVkFURUJVSUxEIFZTX0ZGX1BSSVZBVEVCVUlMRAotI2Vsc2UKLSMgIGRlZmluZSBWU19QUklWQVRFQlVJTEQgMAotI2VuZGlmIC8qIFBOR19VU0VSX1BSSVZBVEVCVUlMRCAqLwotCi0jaWZkZWYgUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQKLSMgIGRlZmluZSBWU19TUEVDSUFMQlVJTEQgVlNfRkZfU1BFQ0lBTEJVSUxECi0jZWxzZQotIyAgZGVmaW5lIFZTX1NQRUNJQUxCVUlMRCAwCi0jZW5kaWYgLyogUE5HX0xJQlBOR19CVUlMRF9TUEVDSUFMICovCi0KLSNpZiAoKFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFICYgUE5HX0xJQlBOR19SRUxFQVNFX1NUQVRVU19NQVNLKSAhPVwKLSAgICAgIFBOR19MSUJQTkdfQlVJTERfU1RBQkxFKQotIyAgZGVmaW5lIFZTX1BSRVJFTEVBU0UgVlNfRkZfUFJFUkVMRUFTRQotIyAgZGVmaW5lIFZTX1BBVENIRUQgMAotI2Vsc2UKLSMgIGRlZmluZSBWU19QUkVSRUxFQVNFIDAKLSMgIGlmIChQTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSAmIFBOR19MSUJQTkdfQlVJTERfUEFUQ0hFRCkKLSMgICAgZGVmaW5lIFZTX1BBVENIRUQgVlNfRkZfUEFUQ0hFRAotIyAgZWxzZQotIyAgICBkZWZpbmUgVlNfUEFUQ0hFRCAwCi0jICBlbmRpZgotI2VuZGlmCi0KLVZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTwotRklMRVZFUlNJT04gUE5HX0xJQlBOR19WRVJfTUFKT1IsIFBOR19MSUJQTkdfVkVSX01JTk9SLCBQTkdfTElCUE5HX1ZFUl9SRUxFQVNFLCBQTkdfTElCUE5HX1ZFUl9CVUlMRAotUFJPRFVDVFZFUlNJT04gUE5HX0xJQlBOR19WRVJfTUFKT1IsIFBOR19MSUJQTkdfVkVSX01JTk9SLCBQTkdfTElCUE5HX1ZFUl9SRUxFQVNFLCBQTkdfTElCUE5HX1ZFUl9CVUlMRAotRklMRUZMQUdTTUFTSyBWU19GRklfRklMRUZMQUdTTUFTSwotRklMRUZMQUdTIFZTX0RFQlVHIHwgVlNfUFJJVkFURUJVSUxEIHwgVlNfU1BFQ0lBTEJVSUxEIHwgVlNfUFJFUkVMRUFTRSB8IFZTX1BBVENIRUQKLUZJTEVPUyBWT1NfX1dJTkRPV1MzMgotRklMRVRZUEUgVkZUX0RMTAotRklMRVNVQlRZUEUgVkZUMl9VTktOT1dOCi1CRUdJTgotICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0gIEJFR0lOIEJMT0NLICIwNDA5MDRFNCIgLyogTGFuZ3VhZ2UgdHlwZSA9IFUuUyBFbmdsaXNoKDB4MDQwOSkgYW5kIENoYXJhY3RlciBTZXQgPSBXaW5kb3dzLCBNdWx0aWxpbmd1YWwoMHgwNEU0KSAqLwotICAgIEJFR0lOCi0jaWZkZWYgUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUwotICAgICAgVkFMVUUgIkNvbW1lbnRzIiwgUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUyAiXDAwMCIKLSNlbmRpZiAvKiBQTkdfTElCUE5HX1ZFUlNJT05JTkZPX0NPTU1FTlRTICovCi0jaWZkZWYgUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NUEFOWU5BTUUKLSAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsIFBOR19VU0VSX1ZFUlNJT05JTkZPX0NPTVBBTllOQU1FICJcMDAwIgotI2VuZGlmIC8qIFBOR19VU0VSX1ZFUlNJT05JTkZPX0NPTVBBTllOQU1FICovCi0gICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgIlBORyBpbWFnZSBjb21wcmVzc2lvbiBsaWJyYXJ5XDAwMCIKLSAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsIFBOR19MSUJQTkdfVkVSX1NUUklORyAiXDAwMCIKLSAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCBQTkdfTElCUE5HX0RMTEZOQU1FIFFVT1RFKFBOR19MSUJQTkdfVkVSX0RMTE5VTSkgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYICIgKFdpbmRvd3MgMzIgYml0KVwwMDAiCi0gICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiXDI1MSAxOTk4LTIwMDQgR2xlbm4gUmFuZGVycy1QZWhyc29uIGV0IGFsLlwwMDAiCi0jaWZkZWYgUE5HX1VTRVJfVkVSU0lPTklORk9fTEVHQUxUUkFERU1BUktTCi0gICAgICBWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgUE5HX1VTRVJfVkVSU0lPTklORk9fTEVHQUxUUkFERU1BUktTICJcMDAwIgotI2VuZGlmIC8qIFBOR19VU0VSX1ZFUlNJT05JTkZPX0xFR0FMVFJBREVNQVJLUyAqLwotICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCBQTkdfTElCUE5HX0RMTEZOQU1FIFFVT1RFKFBOR19MSUJQTkdfVkVSX0RMTE5VTSkgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYICIuRExMXDAwMCIKLSNpZmRlZiBQTkdfVVNFUl9QUklWQVRFQlVJTEQKLSAgICAgIFZBTFVFICJQcml2YXRlQnVpbGQiLCBQTkdfVVNFUl9QUklWQVRFQlVJTEQgIlwwMDAiCi0jZW5kaWYgLyogUE5HX1VTRVJfUFJJVkFURUJVSUxEICovCi0gICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiTGliUE5HXDAwMCIKLSAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIxXDAwMCIKLSNpZmRlZiBQTkdfTElCUE5HX1NQRUNJQUxCVUlMRAotICAgICAgVkFMVUUgIlNwZWNpYWxCdWlsZCIsIFBOR19MSUJQTkdfU1BFQ0lBTEJVSUxEICJcMDAwIgotI2VuZGlmIC8qIFBOR19MSUJQTkdfU1BFQ0lBTEJVSUxEICovCi0gICAgRU5ECi0gIEVORAotICBCTE9DSyAiVmFyRmlsZUluZm8iCi0gIEJFR0lOCi0gICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwNDA5LCAweDA0RTQKLSAgRU5ECi1FTkQKZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3NjcmlwdHMvc21ha2VmaWxlLnBwYyBiL2xpYnMvbGlicG5nL3NjcmlwdHMvc21ha2VmaWxlLnBwYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVjMDI3OC4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy9zY3JpcHRzL3NtYWtlZmlsZS5wcGMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIEFtaWdhIHBvd2VyVVAgKFRNKSBNYWtlZmlsZQotIyBtYWtlZmlsZSBmb3IgbGlicG5nIGFuZCBTQVMgQyBWNi41OC83LjAwIFBQQyBjb21waWxlcgotIyBDb3B5cmlnaHQgKEMpIDE5OTggYnkgQW5kcmVhcyBSLiBLbGVpbmVydAotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotQ0MgICAgICAgPSBzY3BwYwotQ0ZMQUdTICAgPSBOT1NUS0NISyBOT1NJTlQgT1BUSU1JWkUgT1BUR08gT1BUUEVFUCBPUFRJTkxPQ0FMIE9QVElOTCBJRElSIC96bGliIFwKLSAgICAgICAgICAgT1BUTE9PUCBPUFRSREVQPTggT1BUREVQPTggT1BUQ09NUD04Ci1MSUJOQU1FICA9IGxpYnBuZy5hCi1BUiAgICAgICA9IHBwYy1hbWlnYW9zLWFyCi1BUl9GTEFHUyA9IGNyCi1SQU5MSUIgICA9IHBwYy1hbWlnYW9zLXJhbmxpYgotTERGTEFHUyAgPSAtciAtbwotTERMSUJTICAgPSAgLi4vemxpYi9saWJ6aXAuYSBMSUI6c2NwcGMuYQotTE4gICAgICAgPSBwcGMtYW1pZ2Fvcy1sZAotUk0gICAgICAgPSBkZWxldGUgcXVpZXQKLU1LRElSICAgID0gbWFrZWRpcgotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gcG5ncmVhZC5vIFwKLXBuZ2Vycm9yLm8gcG5ncHJlYWQubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gcG5nd3RyYW4ubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmdtZW0ubwotCi1hbGw6ICQoTElCTkFNRSkgcG5ndGVzdAotCi0kKExJQk5BTUUpOiAkKE9CSlMpCi0gICAgICAgICAgICAkKEFSKSAkKEFSX0ZMQUdTKSAkQCAkKE9CSlMpCi0gICAgICAgICAgICAkKFJBTkxJQikgJEAKLQotcG5ndGVzdDogcG5ndGVzdC5vICQoTElCTkFNRSkKLSAgICAgICAgJChMTikgJChMREZMQUdTKSBwbmd0ZXN0IExJQjpjX3BwYy5vIHBuZ3Rlc3QubyAkKExJQk5BTUUpICQoTERMSUJTKSBcCi1MSUI6ZW5kLm8KZGlmZiAtLWdpdCBhL2xpYnMvbGlicG5nL3Rlc3QtcG5ndGVzdC5zaCBiL2xpYnMvbGlicG5nL3Rlc3QtcG5ndGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhNjMzMy4uMDAwMDAwMAotLS0gYS9saWJzL2xpYnBuZy90ZXN0LXBuZ3Rlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMhL2Jpbi9zaAotCi0uLy5saWJzL3BuZ3Rlc3QgJHtzcmNkaXJ9L3BuZ3Rlc3QucG5nCmRpZmYgLS1naXQgYS9saWJzL3psaWIvQ2hhbmdlTG9nIGIvbGlicy96bGliL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2ODY5ZC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsODU1ICswLDAgQEAKLQotICAgICAgICAgICAgICAgIENoYW5nZUxvZyBmaWxlIGZvciB6bGliCi0KLUNoYW5nZXMgaW4gMS4yLjMgKDE4IEp1bHkgMjAwNSkKLS0gQXBwbHkgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBmaXhlcyB0byBjb250cmliL2luZmJhY2s5IGFzIHdlbGwKLS0gQ2xlYW4gdXAgc29tZSB0ZXh0IGZpbGVzIChjYXJyaWFnZSByZXR1cm5zLCB0cmFpbGluZyBzcGFjZSkKLS0gVXBkYXRlIHRlc3R6bGliLCB2c3R1ZGlvLCBtYXNteDY0LCBhbmQgbWFzbXg4NiBpbiBjb250cmliIFtWb2xsYW50XQotCi1DaGFuZ2VzIGluIDEuMi4yLjQgKDExIEp1bHkgMjAwNSkKLS0gQWRkIGluZmxhdGVQcmltZSgpIGZ1bmN0aW9uIGZvciBzdGFydGluZyBpbmZsYXRpb24gYXQgYml0IGJvdW5kYXJ5Ci0tIEF2b2lkIHNvbWUgVmlzdWFsIEMgd2FybmluZ3MgaW4gZGVmbGF0ZS5jCi0tIEF2b2lkIG1vcmUgc2lsbHkgVmlzdWFsIEMgd2FybmluZ3MgaW4gaW5mbGF0ZS5jIGFuZCBpbmZ0cmVlcy5jIGZvciA2NC1iaXQKLSAgY29tcGlsZQotLSBGaXggc29tZSBzcGVsbGluZyBlcnJvcnMgaW4gY29tbWVudHMgW0JldHRzXQotLSBDb3JyZWN0IGluZmxhdGVJbml0MigpIGVycm9yIHJldHVybiBkb2N1bWVudGF0aW9uIGluIHpsaWIuaAotLSBBZGRlZCB6cmFuLmMgZXhhbXBsZSBvZiBjb21wcmVzc2VkIGRhdGEgcmFuZG9tIGFjY2VzcyB0byBleGFtcGxlcwotICBkaXJlY3RvcnksIHNob3dzIHVzZSBvZiBpbmZsYXRlUHJpbWUoKQotLSBGaXggY2FzdCBmb3IgYXNzaWdubWVudHMgdG8gc3RybS0+c3RhdGUgaW4gaW5mbGF0ZS5jIGFuZCBpbmZiYWNrLmMKLS0gRml4IHpsaWJDb21waWxlRmxhZ3MoKSBpbiB6dXRpbC5jIHRvIHVzZSAxTCBmb3IgbG9uZyBzaGlmdHMgW09iZXJodW1lcl0KLS0gTW92ZSBkZWNsYXJhdGlvbnMgb2YgZ2YyIGZ1bmN0aW9ucyB0byByaWdodCBwbGFjZSBpbiBjcmMzMi5jIFtPYmVyaHVtZXJdCi0tIEFkZCBjYXN0IGluIHRyZWVzLmMgdCBhdm9pZCBhIHdhcm5pbmcgW09iZXJodW1lcl0KLS0gQXZvaWQgc29tZSB3YXJuaW5ncyBpbiBmaXRibGsuYywgZ3VuLmMsIGd6am9pbi5jIGluIGV4YW1wbGVzIFtPYmVyaHVtZXJdCi0tIFVwZGF0ZSBtYWtlX3Ztcy5jb20gW1ppbnNlcl0KLS0gSW5pdGlhbGl6ZSBzdGF0ZS0+d3JpdGUgaW4gaW5mbGF0ZVJlc2V0KCkgc2luY2UgY29waWVkIGluIGluZmxhdGVfZmFzdCgpCi0tIEJlIG1vcmUgc3RyaWN0IG9uIGluY29tcGxldGUgY29kZSBzZXRzIGluIGluZmxhdGVfdGFibGUoKSBhbmQgaW5jcmVhc2UKLSAgRU5PVUdIIGFuZCBNQVhEIC0tIHRoaXMgcmVwYWlycyBhIHBvc3NpYmxlIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgZm9yCi0gIGludmFsaWQgaW5mbGF0ZSBpbnB1dC4gIFRoYW5rcyB0byBUYXZpcyBPcm1hbmR5IGFuZCBNYXJrdXMgT2Jlcmh1bWVyIGZvcgotICBkaXNjb3ZlcmluZyB0aGUgdnVsbmVyYWJpbGl0eSBhbmQgcHJvdmlkaW5nIHRlc3QgY2FzZXMuCi0tIEFkZCBpYTY0IHN1cHBvcnQgdG8gY29uZmlndXJlIGZvciBIUC1VWCBbU21pdGhdCi0tIEFkZCBlcnJvciByZXR1cm4gdG8gZ3pyZWFkKCkgZm9yIGZvcm1hdCBvciBpL28gZXJyb3IgW0xldmluXQotLSBVc2UgbWFsbG9jLmggZm9yIE9TLzIgW05lY2FzZWtdCi0KLUNoYW5nZXMgaW4gMS4yLjIuMyAoMjcgTWF5IDIwMDUpCi0tIFJlcGxhY2UgMVUgY29uc3RhbnRzIGluIGluZmxhdGUuYyBhbmQgaW5mdHJlZXMuYyBmb3IgNjQtYml0IGNvbXBpbGUKLS0gVHlwZWNhc3QgZnJlYWQoKSByZXR1cm4gdmFsdWVzIGluIGd6aW8uYyBbVm9sbGFudF0KLS0gUmVtb3ZlIHRyYWlsaW5nIHNwYWNlIGluIG1pbmlnemlwLmMgb3V0bW9kZSAoVkMrKyBjYW4ndCBkZWFsIHdpdGggaXQpCi0tIEZpeCBjcmMgY2hlY2sgYnVnIGluIGd6cmVhZCgpIGFmdGVyIGd6dW5nZXRjKCkgW0hlaW5lcl0KLS0gQWRkIHRoZSBkZWZsYXRlVHVuZSgpIGZ1bmN0aW9uIHRvIGFkanVzdCBpbnRlcm5hbCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCi0tIEFkZCBhIGZhc3QgZ3ppcCBkZWNvbXByZXNzb3IsIGd1bi5jLCB0byBleGFtcGxlcyAodXNlIG9mIGluZmxhdGVCYWNrKQotLSBSZW1vdmUgYW4gaW5jb3JyZWN0IGFzc2VydGlvbiBpbiBleGFtcGxlcy96cGlwZS5jCi0tIEFkZCBDKysgd3JhcHBlciBpbiBpbmZiYWNrOS5oIFtEb25haXNdCi0tIEZpeCBidWcgaW4gaW5mbGF0ZUNvcHkoKSB3aGVuIGRlY29kaW5nIGZpeGVkIGNvZGVzCi0tIE5vdGUgaW4gemxpYi5oIGhvdyBtdWNoIGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkgYWN0dWFsbHkgdXNlcwotLSBSZW1vdmUgVVNFX0RJQ1RfSEVBRCBpbiBkZWZsYXRlLmMgKHdvdWxkIG1lc3MgdXAgaW5mbGF0ZSBpZiB1c2VkKQotLSBBZGQgX1dJTjMyX1dDRSB0byBkZWZpbmUgV0lOMzIgaW4gemNvbmYuaW4uaCBbU3BlbmNlcl0KLS0gRG9uJ3QgaW5jbHVkZSBzdGRlcnIuaCBvciBlcnJuby5oIGZvciBfV0lOMzJfV0NFIGluIHp1dGlsLmggW1NwZW5jZXJdCi0tIEFkZCBnemRpcmVjdCgpIGZ1bmN0aW9uIHRvIGluZGljYXRlIHRyYW5zcGFyZW50IHJlYWRzCi0tIFVwZGF0ZSBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCi0tIEZpeCBjb21waWxhdGlvbiBvZiBkZWZsYXRlLmMgd2hlbiBib3RoIEFTTVYgYW5kIEZBU1RFU1QgW09iZXJodW1lcl0KLS0gQWRkIGNhc3RzIGluIGNyYzMyLmMgdG8gYXZvaWQgd2FybmluZ3MgW09iZXJodW1lcl0KLS0gQWRkIGNvbnRyaWIvbWFzbXg2NCBbVm9sbGFudF0KLS0gVXBkYXRlIGNvbnRyaWIvYXNtNTg2LCBhc202ODYsIG1hc214ODYsIHRlc3R6bGliLCB2c3R1ZGlvIFtWb2xsYW50XQotCi1DaGFuZ2VzIGluIDEuMi4yLjIgKDMwIERlY2VtYmVyIDIwMDQpCi0tIFJlcGxhY2Ugc3RydWN0dXJlIGFzc2lnbm1lbnRzIGluIGRlZmxhdGUuYyBhbmQgaW5mbGF0ZS5jIHdpdGggem1lbWNweSB0bwotICBhdm9pZCBpbXBsaWNpdCBtZW1jcHkgY2FsbHMgKHBvcnRhYmlsaXR5IGZvciBuby1saWJyYXJ5IGNvbXBpbGF0aW9uKQotLSBJbmNyZWFzZSBzcHJpbnRmKCkgYnVmZmVyIHNpemUgaW4gZ3pkb3BlbigpIHRvIGFsbG93IGZvciBsYXJnZSBudW1iZXJzCi0tIEFkZCBJTkZMQVRFX1NUUklDVCB0byBjaGVjayBkaXN0YW5jZXMgYWdhaW5zdCB6bGliIGhlYWRlcgotLSBJbXByb3ZlIFdpbkNFIGVycm5vIGhhbmRsaW5nIGFuZCBjb21tZW50cyBbQ2hhbmddCi0tIFJlbW92ZSBjb21tZW50IGFib3V0IG5vIGd6aXAgaGVhZGVyIHByb2Nlc3NpbmcgaW4gRkFRCi0tIEFkZCBaX0ZJWEVEIHN0cmF0ZWd5IG9wdGlvbiB0byBkZWZsYXRlSW5pdDIoKSB0byBmb3JjZSBmaXhlZCB0cmVlcwotLSBBZGQgdXBkYXRlZCBtYWtlX3Ztcy5jb20gW0NvZ2hsYW5dLCB1cGRhdGUgUkVBRE1FCi0tIENyZWF0ZSBhIG5ldyAiZXhhbXBsZXMiIGRpcmVjdG9yeSwgbW92ZSBnemFwcGVuZC5jIHRoZXJlLCBhZGQgenBpcGUuYywKLSAgZml0YmxrLmMsIGd6bG9nLltjaF0sIGd6am9pbi5jLCBhbmQgemxpYl9ob3cuaHRtbC4KLS0gQWRkIEZBUSBlbnRyeSBhbmQgY29tbWVudHMgaW4gZGVmbGF0ZS5jIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcwotLSBBZGQgU29sYXJpcyA5IG1ha2Ugb3B0aW9ucyBpbiBjb25maWd1cmUgW0dpbGJlcnRdCi0tIEFsbG93IHN0cmVycm9yKCkgdXNhZ2UgaW4gZ3ppby5jIGZvciBTVERDCi0tIEZpeCBEZWNvbXByZXNzQnVmIGluIGNvbnRyaWIvZGVscGhpL1pMaWIucGFzIFtNYW5DaGVzVGVyXQotLSBVcGRhdGUgY29udHJpYi9tYXNteDg2L2luZmZhczMyLmFzbSBhbmQgZ3ZtYXQzMi5hc20gW1ZvbGxhbnRdCi0tIFVzZSB6X29mZl90IGZvciBhZGxlcjMyX2NvbWJpbmUoKSBhbmQgY3JjMzJfY29tYmluZSgpIGxlbmd0aHMKLS0gTWFrZSBhZGxlcjMyKCkgbXVjaCBmYXN0ZXIgZm9yIHNtYWxsIGxlbgotLSBVc2UgT1NfQ09ERSBpbiBkZWZsYXRlKCkgZGVmYXVsdCBnemlwIGhlYWRlcgotCi1DaGFuZ2VzIGluIDEuMi4yLjEgKDMxIE9jdG9iZXIgMjAwNCkKLS0gQWxsb3cgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsIGZvciByYXcgaW5mbGF0ZQotLSBGaXggaW5mbGF0ZSBoZWFkZXIgY3JjIGNoZWNrIGJ1ZyBmb3IgZmlsZSBuYW1lcyBhbmQgY29tbWVudHMKLS0gQWRkIGRlZmxhdGVTZXRIZWFkZXIoKSBhbmQgZ3pfaGVhZGVyIHN0cnVjdHVyZSBmb3IgY3VzdG9tIGd6aXAgaGVhZGVycwotLSBBZGQgaW5mbGF0ZUdldGhlYWRlcigpIHRvIHJldHJpZXZlIGd6aXAgaGVhZGVycwotLSBBZGQgY3JjMzJfY29tYmluZSgpIGFuZCBhZGxlcjMyX2NvbWJpbmUoKSBmdW5jdGlvbnMKLS0gQWRkIGFsbG9jX2Z1bmMsIGZyZWVfZnVuYywgaW5fZnVuYywgb3V0X2Z1bmMgdG8gWl9QUkVGSVggbGlzdAotLSBVc2UgenN0cmVhbXAgY29uc2lzdGVudGx5IGluIHpsaWIuaCAoaW5mbGF0ZV9iYWNrIGZ1bmN0aW9ucykKLS0gUmVtb3ZlIEdVTlpJUCBjb25kaXRpb24gZnJvbSBkZWZpbml0aW9uIG9mIGluZmxhdGVfbW9kZSBpbiBpbmZsYXRlLmgKLSAgYW5kIGluIGNvbnRyaWIvaW5mbGF0ZTg2L2luZmZhc3QuUyBbVHJ1dGEsIEFuZGVyc29uXQotLSBBZGQgc3VwcG9ydCBmb3IgQU1ENjQgaW4gY29udHJpYi9pbmZsYXRlODYvaW5mZmFzODYuYyBbQW5kZXJzb25dCi0tIFVwZGF0ZSBwcm9qZWN0cy9SRUFETUUucHJvamVjdHMgYW5kIHByb2plY3RzL3Zpc3VhbGM2IFtUcnV0YV0KLS0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLS0gQXZvaWQgd2FybmluZyB1bmRlciBOT19HWkNPTVBSRVNTIGluIGd6aW8uYzsgZml4IHR5cG8gW1RydXRhXQotLSBEZXByZWNhdGUgWl9BU0NJSTsgdXNlIFpfVEVYVCBpbnN0ZWFkIFtUcnV0YV0KLS0gVXNlIGEgbmV3IGFsZ29yaXRobSBmb3Igc2V0dGluZyBzdHJtLT5kYXRhX3R5cGUgaW4gdHJlZXMuYyBbVHJ1dGFdCi0tIERvIG5vdCBkZWZpbmUgYW4gZXhpdCgpIHByb3RvdHlwZSBpbiB6dXRpbC5jIHVubGVzcyBERUJVRyBkZWZpbmVkCi0tIFJlbW92ZSBwcm90b3R5cGUgb2YgZXhpdCgpIGZyb20genV0aWwuYywgZXhhbXBsZS5jLCBtaW5pZ3ppcC5jIFtUcnV0YV0KLS0gQWRkIGNvbW1lbnQgaW4gemxpYi5oIGZvciBaX05PX0ZMVVNIIHBhcmFtZXRlciB0byBkZWZsYXRlKCkKLS0gRml4IERhcndpbiBidWlsZCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uIFtQZXRlcnNvbl0KLQotQ2hhbmdlcyBpbiAxLjIuMiAoMyBPY3RvYmVyIDIwMDQpCi0tIFVwZGF0ZSB6bGliLmggY29tbWVudHMgb24gZ3ppcCBpbi1tZW1vcnkgcHJvY2Vzc2luZwotLSBTZXQgYWRsZXIgdG8gMSBpbiBpbmZsYXRlUmVzZXQoKSB0byBzdXBwb3J0IEphdmEgdGVzdCBzdWl0ZSBbV2FsbGVzXQotLSBBZGQgY29udHJpYi9kb3R6bGliIFtSYXZuXQotLSBVcGRhdGUgd2luMzIvRExMX0ZBUS50eHQgW1RydXRhXQotLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotLSBNb3ZlIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCB0byBvbGQvIFtUcnV0YV0KLS0gRml4IGFzc2VtYmxlciBidWlsZHMgaW4gcHJvamVjdHMvdmlzdWFsYzYvIFtUcnV0YV0KLQotQ2hhbmdlcyBpbiAxLjIuMS4yICg5IFNlcHRlbWJlciAyMDA0KQotLSBVcGRhdGUgSU5ERVggZmlsZQotLSBGaXggdHJlZXMuYyB0byB1cGRhdGUgc3RybS0+ZGF0YV90eXBlIChubyBvbmUgZXZlciBub3RpY2VkISkKLS0gRml4IGJ1ZyBpbiBlcnJvciBjYXNlIGluIGluZmxhdGUuYywgaW5mYmFjay5jLCBhbmQgaW5mYmFjazkuYyBbQnJvd25dCi0tIEFkZCAidm9sYXRpbGUiIHRvIGNyYyB0YWJsZSBmbGFnIGRlY2xhcmF0aW9uIChmb3IgRFlOQU1JQ19DUkNfVEFCTEUpCi0tIEFkZCBsaW1pdGVkIG11bHRpdGFza2luZyBwcm90ZWN0aW9uIHRvIERZTkFNSUNfQ1JDX1RBQkxFCi0tIEFkZCBOT192c25wcmludGYgZm9yIFZNUyBpbiB6dXRpbC5oIFtNb3ppbGxhXQotLSBEb24ndCBkZWNsYXJlIHN0cmVycm9yKCkgdW5kZXIgVk1TIFtNb3ppbGxhXQotLSBBZGQgY29tbWVudCB0byBEWU5BTUlDX0NSQ19UQUJMRSB0byB1c2UgZ2V0X2NyY190YWJsZSgpIHRvIGluaXRpYWxpemUKLS0gVXBkYXRlIGNvbnRyaWIvYWRhIFtBbmlzaW1rb3ZdCi0tIFVwZGF0ZSBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCi0tIEZpeCBjb25maWd1cmUgdG8gbm90IGhhcmRjb2RlIGRpcmVjdG9yaWVzIGZvciBEYXJ3aW4gW1BldGVyc29uXQotLSBGaXggZ3ppby5jIHRvIG5vdCByZXR1cm4gZXJyb3Igb24gZW1wdHkgZmlsZXMgW0Jyb3duXQotLSBGaXggaW5kZW50YXRpb247IHVwZGF0ZSB2ZXJzaW9uIGluIGNvbnRyaWIvZGVscGhpL1pMaWIucGFzIGFuZAotICBjb250cmliL3Bhc2NhbC96bGlicGFzLnBhcyBbVHJ1dGFdCi0tIFVwZGF0ZSBta2FzbS5iYXQgaW4gY29udHJpYi9tYXNteDg2IFtUcnV0YV0KLS0gVXBkYXRlIGNvbnRyaWIvdW50Z3ogW1RydXRhXQotLSBBZGQgcHJvamVjdHMvUkVBRE1FLnByb2plY3RzIFtUcnV0YV0KLS0gQWRkIHByb2plY3QgZm9yIE1TIFZpc3VhbCBDKysgNi4wIGluIHByb2plY3RzL3Zpc3VhbGM2IFtDYWRpZXV4LCBUcnV0YV0KLS0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLS0gVXBkYXRlIGxpc3Qgb2YgWl9QUkVGSVggc3ltYm9scyBpbiB6Y29uZi5oIFtSYW5kZXJzLVBlaHJzb24sIFRydXRhXQotLSBSZW1vdmUgYW4gdW5uZWNlc3NhcnkgYXNzaWdubWVudCB0byBjdXJyIGluIGluZnRyZWVzLmMgW1RydXRhXQotLSBBZGQgT1MvMiB0byBleGUgYnVpbGRzIGluIGNvbmZpZ3VyZSBbUG9sdG9yYWtdCi0tIFJlbW92ZSBlcnIgZHVtbXkgcGFyYW1ldGVyIGluIHpsaWIuaCBbS2llbnR6bGVdCi0KLUNoYW5nZXMgaW4gMS4yLjEuMSAoOSBKYW51YXJ5IDIwMDQpCi0tIFVwZGF0ZSBlbWFpbCBhZGRyZXNzIGluIFJFQURNRQotLSBTZXZlcmFsIEZBUSB1cGRhdGVzCi0tIEZpeCBhIGJpZyBmYXQgYnVnIGluIGluZnRyZWVzLmMgdGhhdCBwcmV2ZW50ZWQgZGVjb2RpbmcgdmFsaWQKLSAgZHluYW1pYyBibG9ja3Mgd2l0aCBvbmx5IGxpdGVyYWxzIGFuZCBubyBkaXN0YW5jZSBjb2RlcyAtLQotICBUaGFua3MgdG8gIkhvdCBFbXUiIGZvciB0aGUgYnVnIHJlcG9ydCBhbmQgc2FtcGxlIGZpbGUKLS0gQWRkIGEgbm90ZSB0byBwdWZmLmMgb24gbm8gZGlzdGFuY2UgY29kZXMgY2FzZS4KLQotQ2hhbmdlcyBpbiAxLjIuMSAoMTcgTm92ZW1iZXIgMjAwMykKLS0gUmVtb3ZlIGEgdGFiIGluIGNvbnRyaWIvZ3phcHBlbmQvZ3phcHBlbmQuYwotLSBVcGRhdGUgc29tZSBpbnRlcmZhY2VzIGluIGNvbnRyaWIgZm9yIG5ldyB6bGliIGZ1bmN0aW9ucwotLSBVcGRhdGUgemxpYiB2ZXJzaW9uIG51bWJlciBpbiBzb21lIGNvbnRyaWIgZW50cmllcwotLSBBZGQgV2luZG93cyBDRSBkZWZpbml0aW9uIGZvciBwdHJkaWZmX3QgaW4genV0aWwuaCBbTWFpLCBUcnV0YV0KLS0gU3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIEh1cmQgYW5kIEtGcmVlQlNEIFtCcm93bl0KLS0gRml4IGVycm9yIGluIE5PX0RJVklERSBvcHRpb24gb2YgYWRsZXIzMi5jCi0KLUNoYW5nZXMgaW4gMS4yLjAuOCAoNCBOb3ZlbWJlciAyMDAzKQotLSBVcGRhdGUgdmVyc2lvbiBpbiBjb250cmliL2RlbHBoaS9aTGliLnBhcyBhbmQgY29udHJpYi9wYXNjYWwvemxpYnBhcy5wYXMKLS0gQWRkIGV4cGVyaW1lbnRhbCBOT19ESVZJREUgI2RlZmluZSBpbiBhZGxlcjMyLmMKLSAgICAtIFBvc3NpYmx5IGZhc3RlciBvbiBzb21lIHByb2Nlc3NvcnMgKGxldCBtZSBrbm93IGlmIGl0IGlzKQotLSBDb3JyZWN0IFpfQkxPQ0sgdG8gbm90IHJldHVybiBvbiBmaXJzdCBpbmZsYXRlIGNhbGwgaWYgbm8gd3JhcAotLSBGaXggc3RybS0+ZGF0YV90eXBlIG9uIGluZmxhdGUoKSByZXR1cm4gdG8gY29ycmVjdGx5IGluZGljYXRlIEVPQgotLSBBZGQgZGVmbGF0ZVByaW1lKCkgZnVuY3Rpb24gZm9yIGFwcGVuZGluZyBpbiB0aGUgbWlkZGxlIG9mIGEgYnl0ZQotLSBBZGQgY29udHJpYi9nemFwcGVuZCBmb3IgYW4gZXhhbXBsZSBvZiBhcHBlbmRpbmcgdG8gYSBzdHJlYW0KLS0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLS0gRGVsZXRlIFR1cmJvIEMgY29tbWVudCBpbiBSRUFETUUgW1RydXRhXQotLSBJbXByb3ZlIHNvbWUgaW5kZW50YXRpb24gaW4gemNvbmYuaCBbVHJ1dGFdCi0tIEZpeCBpbmZpbml0ZSBsb29wIG9uIGJhZCBpbnB1dCBpbiBjb25maWd1cmUgc2NyaXB0IFtDaHVyY2hdCi0tIEZpeCBnemVvZigpIGZvciBjb25jYXRlbmF0ZWQgZ3ppcCBmaWxlcyBbSm9obnNvbl0KLS0gQWRkIGV4YW1wbGUgdG8gY29udHJpYi92aXN1YWwtYmFzaWMudHh0IFtNaWNoYWVsIEIuXQotLSBBZGQgLXAgdG8gbWtkaXIncyBpbiBNYWtlZmlsZS5pbiBbdmRhXQotLSBGaXggY29uZmlndXJlIHRvIHByb3Blcmx5IGRldGVjdCBwcmVzZW5jZSBvciBsYWNrIG9mIHByaW50ZiBmdW5jdGlvbnMKLS0gQWRkIEFTNDAwIHN1cHBvcnQgW01vbm5lcmF0XQotLSBBZGQgYSBsaXR0bGUgQ3lnd2luIHN1cHBvcnQgW1dpbHNvbl0KLQotQ2hhbmdlcyBpbiAxLjIuMC43ICgyMSBTZXB0ZW1iZXIgMjAwMykKLS0gQ29ycmVjdCBzb21lIGRlYnVnIGZvcm1hdHMgaW4gY29udHJpYi9pbmZiYWNrOQotLSBDYXN0IGEgdHlwZSBpbiBhIGRlYnVnIHN0YXRlbWVudCBpbiB0cmVlcy5jCi0tIENoYW5nZSBzZWFyY2ggYW5kIHJlcGxhY2UgZGVsaW1pdGVyIGluIGNvbmZpZ3VyZSBmcm9tICUgdG8gIyBbQmVlYmVdCi0tIFVwZGF0ZSBjb250cmliL3VudGd6IHRvIDAuMiB3aXRoIHZhcmlvdXMgZml4ZXMgW1RydXRhXQotLSBBZGQgYnVpbGQgc3VwcG9ydCBmb3IgQW1pZ2EgW05pa2xdCi0tIFJlbW92ZSBzb21lIGRpcmVjdG9yaWVzIGluIG9sZCB0aGF0IGhhdmUgYmVlbiB1cGRhdGVkIHRvIDEuMgotLSBBZGQgZHlsaWIgYnVpbGRpbmcgZm9yIE1hYyBPUyBYIGluIGNvbmZpZ3VyZSBhbmQgTWFrZWZpbGUuaW4KLS0gUmVtb3ZlIG9sZCBkaXN0cmlidXRpb24gc3R1ZmYgZnJvbSBNYWtlZmlsZQotLSBVcGRhdGUgUkVBRE1FIHRvIHBvaW50IHRvIERMTF9GQVEudHh0LCBhbmQgYWRkIGNvbW1lbnQgb24gTWFjIE9TIFgKLS0gVXBkYXRlIGxpbmtzIGluIFJFQURNRQotCi1DaGFuZ2VzIGluIDEuMi4wLjYgKDEzIFNlcHRlbWJlciAyMDAzKQotLSBNaW5vciBGQVEgdXBkYXRlcwotLSBVcGRhdGUgY29udHJpYi9taW5pemlwIHRvIDEuMDAgW1ZvbGxhbnRdCi0tIFJlbW92ZSB0ZXN0IG9mIGd6IGZ1bmN0aW9ucyBpbiBleGFtcGxlLmMgd2hlbiBHWl9DT01QUkVTUyBkZWZpbmVkIFtUcnV0YV0KLS0gVXBkYXRlIFBPU1RJTkMgY29tbWVudCBmb3IgNjgwNjAgW05pa2xdCi0tIEFkZCBjb250cmliL2luZmJhY2s5IHdpdGggZGVmbGF0ZTY0IGRlY29kaW5nICh1bnN1cHBvcnRlZCkKLS0gRm9yIE1WUyBkZWZpbmUgTk9fdnNucHJpbnRmIGFuZCB1bmRlZmluZSBGQVIgW3ZhbiBCdXJpa10KLS0gQWRkIHByYWdtYSBmb3IgZmRvcGVuIG9uIE1WUyBbdmFuIEJ1cmlrXQotCi1DaGFuZ2VzIGluIDEuMi4wLjUgKDggU2VwdGVtYmVyIDIwMDMpCi0tIEFkZCBPRiB0byBpbmZsYXRlQmFja0VuZCgpIGRlY2xhcmF0aW9uIGluIHpsaWIuaAotLSBSZW1lbWJlciBzdGFydCB3aGVuIHVzaW5nIGd6ZG9wZW4gaW4gdGhlIG1pZGRsZSBvZiBhIGZpbGUKLS0gVXNlIGludGVybmFsIG9mZl90IGNvdW50ZXJzIGluIGd6KiBmdW5jdGlvbnMgdG8gcHJvcGVybHkgaGFuZGxlIHNlZWtzCi0tIFBlcmZvcm0gbW9yZSByaWdvcm91cyBjaGVjayBmb3IgZGlzdGFuY2UtdG9vLWZhciBpbiBpbmZmYXN0LmMKLS0gQWRkIFpfQkxPQ0sgZmx1c2ggb3B0aW9uIHRvIHJldHVybiBmcm9tIGluZmxhdGUgYXQgYmxvY2sgYm91bmRhcnkKLS0gU2V0IHN0cm0tPmRhdGFfdHlwZSBvbiByZXR1cm4gZnJvbSBpbmZsYXRlCi0gICAgLSBJbmRpY2F0ZSBiaXRzIHVudXNlZCwgaWYgYXQgYmxvY2sgYm91bmRhcnksIGFuZCBpZiBpbiBsYXN0IGJsb2NrCi0tIFJlcGxhY2Ugc2l6ZV90IHdpdGggcHRyZGlmZl90IGluIGNyYzMyLmMsIGFuZCBjaGVjayBmb3IgY29ycmVjdCBzaXplCi0tIEFkZCBjb25kaXRpb24gc28gb2xkIE5PX0RFRkxBVEUgZGVmaW5lIHN0aWxsIHdvcmtzIGZvciBjb21wYXRpYmlsaXR5Ci0tIEZBUSB1cGRhdGUgcmVnYXJkaW5nIHRoZSBXaW5kb3dzIERMTCBbVHJ1dGFdCi0tIElOREVYIHVwZGF0ZTogYWRkIHFueCBlbnRyeSwgcmVtb3ZlIGFpeCBlbnRyeSBbVHJ1dGFdCi0tIEluc3RhbGwgemxpYi4zIGludG8gbWFuZGlyIFtXaWxzb25dCi0tIE1vdmUgY29udHJpYi96bGliX2RsbF9GQVEudHh0IHRvIHdpbjMyL0RMTF9GQVEudHh0OyB1cGRhdGUgW1RydXRhXQotLSBBZGFwdCB0aGUgemxpYiBpbnRlcmZhY2UgdG8gdGhlIG5ldyBETEwgY29udmVudGlvbiBndWlkZWxpbmVzIFtUcnV0YV0KLS0gSW50cm9kdWNlIFpMSUJfV0lOQVBJIG1hY3JvIHRvIGFsbG93IHRoZSBleHBvcnQgb2YgZnVuY3Rpb25zIHVzaW5nCi0gIHRoZSBXSU5BUEkgY2FsbGluZyBjb252ZW50aW9uLCBmb3IgVmlzdWFsIEJhc2ljIFtWb2xsYW50LCBUcnV0YV0KLS0gVXBkYXRlIG1zZG9zIGFuZCB3aW4zMiBzY3JpcHRzIGFuZCBtYWtlZmlsZXMgW1RydXRhXQotLSBFeHBvcnQgc3ltYm9scyBieSBuYW1lLCBub3QgYnkgb3JkaW5hbCwgaW4gd2luMzIvemxpYi5kZWYgW1RydXRhXQotLSBBZGQgY29udHJpYi9hZGEgW0FuaXNpbWtvdl0KLS0gTW92ZSBhc20gZmlsZXMgZnJvbSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb250cmliL2FzbTM4NiBbVHJ1dGFdCi0tIFJlbmFtZSBjb250cmliL2FzbTM4NiB0byBjb250cmliL21hc214ODYgW1RydXRhLCBWb2xsYW50XQotLSBBZGQgY29udHJpYi9tYXNtNjg2IFtUcnV0YV0KLS0gRml4IG9mZnNldHMgaW4gY29udHJpYi9pbmZsYXRlODYgYW5kIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20KLSAgW1RydXRhLCBWb2xsYW50XQotLSBVcGRhdGUgY29udHJpYi9kZWxwaGk7IHJlbmFtZSB0byBjb250cmliL3Bhc2NhbDsgYWRkIGV4YW1wbGUgW1RydXRhXQotLSBSZW1vdmUgY29udHJpYi9kZWxwaGkyOyBhZGQgYSBuZXcgY29udHJpYi9kZWxwaGkgW1RydXRhXQotLSBBdm9pZCBpbmNsdXNpb24gb2YgdGhlIG5vbnN0YW5kYXJkIDxtZW1vcnkuaD4gaW4gY29udHJpYi9pb3N0cmVhbSwKLSAgYW5kIGZpeCBzb21lIG1ldGhvZCBwcm90b3R5cGVzIFtUcnV0YV0KLS0gRml4IHRoZSBaQ1JfU0VFRDIgY29uc3RhbnQgdG8gYXZvaWQgd2FybmluZ3MgaW4gY29udHJpYi9taW5pemlwCi0gIFtUcnV0YV0KLS0gQXZvaWQgdGhlIHVzZSBvZiBiYWNrc2xhc2ggKFwpIGluIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KLS0gRml4IGZpbGUgdGltZSBoYW5kbGluZyBpbiBjb250cmliL3VudGd6OyB1cGRhdGUgbWFrZWZpbGVzIFtUcnV0YV0KLS0gVXBkYXRlIGNvbnRyaWIvdnN0dWRpby92YzcwXzMyIHRvIGNvbXBseSB3aXRoIHRoZSBuZXcgRExMIGd1aWRlbGluZXMKLSAgW1ZvbGxhbnRdCi0tIFJlbW92ZSBjb250cmliL3ZzdHVkaW8vdmMxNV8xNiBbVm9sbGFudF0KLS0gUmVuYW1lIGNvbnRyaWIvdnN0dWRpby92YzcwXzMyIHRvIGNvbnRyaWIvdnN0dWRpby92YzcgW1RydXRhXQotLSBVcGRhdGUgUkVBRE1FLmNvbnRyaWIgW1RydXRhXQotLSBJbnZlcnQgdGhlIGFzc2lnbm1lbnQgb3JkZXIgb2YgbWF0Y2hfaGVhZCBhbmQgcy0+cHJldlsuLi5dIGluCi0gIElOU0VSVF9TVFJJTkcgW1RydXRhXQotLSBDb21wYXJlIFRPT19GQVIgd2l0aCAzMjc2NyBpbnN0ZWFkIG9mIDMyNzY4LCB0byBhdm9pZCAxNi1iaXQgd2FybmluZ3MKLSAgW1RydXRhXQotLSBDb21wYXJlIGZ1bmN0aW9uIHBvaW50ZXJzIHdpdGggMCwgbm90IHdpdGggTlVMTCBvciBaX05VTEwgW1RydXRhXQotLSBGaXggcHJvdG90eXBlIG9mIHN5bmNzZWFyY2ggaW4gaW5mbGF0ZS5jIFtUcnV0YV0KLS0gSW50cm9kdWNlIEFTTUlORiBtYWNybyB0byBiZSBlbmFibGVkIHdoZW4gdXNpbmcgYW4gQVNNIGltcGxlbWVudGF0aW9uCi0gIG9mIGluZmxhdGVfZmFzdCBbVHJ1dGFdCi0tIENoYW5nZSBOT19ERUZMQVRFIHRvIE5PX0daQ09NUFJFU1MgW1RydXRhXQotLSBNb2RpZnkgdGVzdF9nemlvIGluIGV4YW1wbGUuYyB0byB0YWtlIGEgc2luZ2xlIGZpbGUgbmFtZSBhcyBhCi0gIHBhcmFtZXRlciBbVHJ1dGFdCi0tIEV4aXQgdGhlIGV4YW1wbGUuYyBwcm9ncmFtIGlmIGd6b3BlbiBmYWlscyBbVHJ1dGFdCi0tIEFkZCB0eXBlIGNhc3RzIGFyb3VuZCBzdHJsZW4gaW4gZXhhbXBsZS5jIFtUcnV0YV0KLS0gUmVtb3ZlIGNhc3RpbmcgdG8gc2l6ZW9mIGluIG1pbmlnemlwLmM7IGdpdmUgYSBwcm9wZXIgdHlwZQotICB0byB0aGUgdmFyaWFibGUgY29tcGFyZWQgd2l0aCBTVUZGSVhfTEVOIFtUcnV0YV0KLS0gVXBkYXRlIGRlZmluaXRpb25zIG9mIFNUREMgYW5kIFNUREM5OSBpbiB6Y29uZi5oIFtUcnV0YV0KLS0gU3luY2hyb25pemUgemNvbmYuaCB3aXRoIHRoZSBuZXcgV2luZG93cyBETEwgaW50ZXJmYWNlIFtUcnV0YV0KLS0gVXNlIFNZUzE2QklUIGluc3RlYWQgb2YgX18zMkJJVF9fIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KLSAgMTYtIGFuZCAzMi1iaXQgcGxhdGZvcm1zIFtUcnV0YV0KLS0gVXNlIGZhciBtZW1vcnkgYWxsb2NhdG9ycyBpbiBzbWFsbCAxNi1iaXQgbWVtb3J5IG1vZGVscyBmb3IKLSAgVHVyYm8gQyBbVHJ1dGFdCi0tIEFkZCBpbmZvIGFib3V0IHRoZSB1c2Ugb2YgQVNNViwgQVNNSU5GIGFuZCBaTElCX1dJTkFQSSBpbgotICB6bGliQ29tcGlsZUZsYWdzIFtUcnV0YV0KLS0gQ3lnd2luIGhhcyB2c25wcmludGYgW1dpbHNvbl0KLS0gSW4gV2luZG93czE2LCBPU19DT0RFIGlzIDAsIGFzIGluIE1TRE9TIFtUcnV0YV0KLS0gSW4gQ3lnd2luLCBPU19DT0RFIGlzIDMgKFVuaXgpLCBub3QgMTEgKFdpbmRvd3MzMikgW1dpbHNvbl0KLQotQ2hhbmdlcyBpbiAxLjIuMC40ICgxMCBBdWd1c3QgMjAwMykKLS0gTWlub3IgRkFRIHVwZGF0ZXMKLS0gQmUgbW9yZSBzdHJpY3Qgd2hlbiBjaGVja2luZyBpbmZsYXRlSW5pdDIncyB3aW5kb3dCaXRzIHBhcmFtZXRlcgotLSBDaGFuZ2UgTk9fR1VOWklQIGNvbXBpbGUgb3B0aW9uIHRvIE5PX0daSVAgdG8gY292ZXIgZGVmbGF0ZSBhcyB3ZWxsCi0tIEFkZCBnemlwIHdyYXBwZXIgb3B0aW9uIHRvIGRlZmxhdGVJbml0MiB1c2luZyB3aW5kb3dCaXRzCi0tIEFkZCB1cGRhdGVkIFFOWCBydWxlIGluIGNvbmZpZ3VyZSBhbmQgcW54IGRpcmVjdG9yeSBbQm9ubmVmb3ldCi0tIE1ha2UgaW5mbGF0ZSBkaXN0YW5jZS10b28tZmFyIGNoZWNrcyBtb3JlIHJpZ29yb3VzCi0tIENsZWFuIHVwIEZBUiB1c2FnZSBpbiBpbmZsYXRlCi0tIEFkZCBjYXN0aW5nIHRvIHNpemVvZigpIGluIGd6aW8uYyBhbmQgbWluaWd6aXAuYwotCi1DaGFuZ2VzIGluIDEuMi4wLjMgKDE5IEp1bHkgMjAwMykKLS0gRml4IHNpbGx5IGVycm9yIGluIGd6dW5nZXRjKCkgaW1wbGVtZW50YXRpb24gW1ZvbGxhbnRdCi0tIFVwZGF0ZSBjb250cmliL21pbml6aXAgYW5kIGNvbnRyaWIvdnN0dWRpbyBbVm9sbGFudF0KLS0gRml4IHByaW50ZiBmb3JtYXQgaW4gZXhhbXBsZS5jCi0tIENvcnJlY3QgY2RlY2wgc3VwcG9ydCBpbiB6Y29uZi5pbi5oIFtBbmlzaW1rb3ZdCi0tIE1pbm9yIEZBUSB1cGRhdGVzCi0KLUNoYW5nZXMgaW4gMS4yLjAuMiAoMTMgSnVseSAyMDAzKQotLSBBZGQgWkxJQl9WRVJOVU0gaW4gemxpYi5oIGZvciBudW1lcmljYWwgcHJlcHJvY2Vzc29yIGNvbXBhcmlzb25zCi0tIEF0dGVtcHQgdG8gYXZvaWQgd2FybmluZ3MgaW4gY3JjMzIuYyBmb3IgcG9pbnRlci1pbnQgY29udmVyc2lvbgotLSBBZGQgQUlYIHRvIGNvbmZpZ3VyZSwgcmVtb3ZlIGFpeCBkaXJlY3RvcnkgW0Jha2tlcl0KLS0gQWRkIHNvbWUgY2FzdHMgdG8gbWluaWd6aXAuYwotLSBJbXByb3ZlIGNoZWNraW5nIGFmdGVyIGluc2VjdXJlIHNwcmludGYoKSBvciB2c3ByaW50ZigpIGNhbGxzCi0tIFJlbW92ZSAjZWxpZidzIGZyb20gY3JjMzIuYwotLSBDaGFuZ2UgbGVhdmUgbGFiZWwgdG8gaW5mX2xlYXZlIGluIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jIHRvIGF2b2lkCi0gIGxpYnJhcnkgY29uZmxpY3RzCi0tIFJlbW92ZSBpbmZsYXRlIGd6aXAgZGVjb2RpbmcgYnkgZGVmYXVsdC0tb25seSBlbmFibGUgZ3ppcCBkZWNvZGluZyBieQotICBzcGVjaWFsIHJlcXVlc3QgZm9yIHN0cmljdGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLS0gQWRkIHpsaWJDb21waWxlRmxhZ3MoKSBmdW5jdGlvbiB0byByZXR1cm4gY29tcGlsYXRpb24gaW5mb3JtYXRpb24KLS0gTW9yZSB0eXBlY2FzdGluZyBpbiBkZWZsYXRlLmMgdG8gYXZvaWQgd2FybmluZ3MKLS0gUmVtb3ZlIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tIF9DYXBpdGFsICNkZWZpbmVzIFtUcnV0YV0KLS0gRml4IGNvbmZpZ3VyZSB0byBsaW5rIHNoYXJlZCBsaWJyYXJ5IHdoZW4gdGVzdGluZwotLSBBZGQgc29tZSBXaW5kb3dzIENFIHRhcmdldCBhZGp1c3RtZW50cyBbTWFpXQotLSBSZW1vdmUgI2RlZmluZSBaTElCX0RMTCBpbiB6Y29uZi5oIFtWb2xsYW50XQotLSBBZGQgemxpYi4zIFtSb2RnZXJzXQotLSBVcGRhdGUgUkZDIFVSTCBpbiBkZWZsYXRlLmMgYW5kIGFsZ29yaXRobS50eHQgW01haV0KLS0gQWRkIHpsaWJfZGxsX0ZBUS50eHQgdG8gY29udHJpYiBbVHJ1dGFdCi0tIEFkZCBVTCB0byBzb21lIGNvbnN0YW50cyBbVHJ1dGFdCi0tIFVwZGF0ZSBtaW5pemlwIGFuZCB2c3R1ZGlvIFtWb2xsYW50XQotLSBSZW1vdmUgdmVzdGlnaWFsIE5FRURfRFVNTVlfUkVUVVJOIGZyb20gemNvbmYuaW4uaAotLSBFeHBhbmQgdXNlIG9mIE5PX0RVTU1ZX0RFQ0wgdG8gYXZvaWQgYWxsIGR1bW15IHN0cnVjdHVyZXMKLS0gQWRkZWQgaW9zdHJlYW0zIHRvIGNvbnRyaWIgW1NjaHdhcmR0XQotLSBSZXBsYWNlIHJld2luZCgpIHdpdGggZnNlZWsoKSBmb3IgV2luQ0UgW1RydXRhXQotLSBJbXByb3ZlIHNldHRpbmcgb2YgemxpYiBmb3JtYXQgY29tcHJlc3Npb24gbGV2ZWwgZmxhZ3MKLSAgICAtIFJlcG9ydCAwIGZvciBodWZmbWFuIGFuZCBybGUgc3RyYXRlZ2llcyBhbmQgZm9yIGxldmVsID09IDAgb3IgMQotICAgIC0gUmVwb3J0IDIgb25seSBmb3IgbGV2ZWwgPT0gNgotLSBPbmx5IGRlYWwgd2l0aCA2NEsgbGltaXQgd2hlbiBuZWNlc3NhcnkgYXQgY29tcGlsZSB0aW1lIFtUcnV0YV0KLS0gQWxsb3cgVE9PX0ZBUiBjaGVjayB0byBiZSB0dXJuZWQgb2ZmIGF0IGNvbXBpbGUgdGltZSBbVHJ1dGFdCi0tIEFkZCBnemNsZWFyZXJyKCkgZnVuY3Rpb24gW1NvdXphXQotLSBBZGQgZ3p1bmdldGMoKSBmdW5jdGlvbgotCi1DaGFuZ2VzIGluIDEuMi4wLjEgKDE3IE1hcmNoIDIwMDMpCi0tIEFkZCBaX1JMRSBzdHJhdGVneSBmb3IgcnVuLWxlbmd0aCBlbmNvZGluZyBbVHJ1dGFdCi0gICAgLSBXaGVuIFpfUkxFIHJlcXVlc3RlZCwgcmVzdHJpY3QgbWF0Y2hlcyB0byBkaXN0YW5jZSBvbmUKLSAgICAtIFVwZGF0ZSB6bGliLmgsIG1pbmlnemlwLmMsIGd6b3BlbigpLCBnemRvcGVuKCkgZm9yIFpfUkxFCi0tIENvcnJlY3QgRkFTVEVTVCBjb21waWxhdGlvbiB0byBhbGxvdyBsZXZlbCA9PSAwCi0tIENsZWFuIHVwIHdoYXQgZ2V0cyBjb21waWxlZCBmb3IgRkFTVEVTVAotLSBJbmNvcnBvcmF0ZSBjaGFuZ2VzIHRvIHpjb25mLmluLmggW1ZvbGxhbnRdCi0gICAgLSBSZWZpbmUgZGV0ZWN0aW9uIG9mIFR1cmJvIEMgbmVlZCBmb3IgZHVtbXkgcmV0dXJucwotICAgIC0gUmVmaW5lIFpMSUJfRExMIGNvbXBpbGF0aW9uCi0gICAgLSBJbmNsdWRlIGFkZGl0aW9uYWwgaGVhZGVyIGZpbGUgb24gVk1TIGZvciBvZmZfdCB0eXBlZGVmCi0tIFRyeSB0byB1c2UgX3ZzbnByaW50ZiB3aGVyZSBpdCBzdXBwbGFudHMgdnNwcmludGYgW1ZvbGxhbnRdCi0tIEFkZCBzb21lIGNhc3RzIGluIGluZmZhc3QuYwotLSBFbmNoYW5jZSBjb21tZW50cyBpbiB6bGliLmggb24gd2hhdCBoYXBwZW5zIGlmIGd6cHJpbnRmKCkgdHJpZXMgdG8KLSAgd3JpdGUgbW9yZSB0aGFuIDQwOTUgYnl0ZXMgYmVmb3JlIGNvbXByZXNzaW9uCi0tIFJlbW92ZSB1bnVzZWQgc3RhdGUgZnJvbSBpbmZsYXRlQmFja0VuZCgpCi0tIFJlbW92ZSBleGl0KDApIGZyb20gbWluaWd6aXAuYywgZXhhbXBsZS5jCi0tIEdldCByaWQgb2YgYWxsIHRob3NlIGRhcm4gdGFicwotLSBBZGQgImNoZWNrIiB0YXJnZXQgdG8gTWFrZWZpbGUuaW4gdGhhdCBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzICJ0ZXN0IgotLSBBZGQgIm1vc3RseWNsZWFuIiBhbmQgIm1haW50YWluZXItY2xlYW4iIHRhcmdldHMgdG8gTWFrZWZpbGUuaW4KLS0gVXBkYXRlIGNvbnRyaWIvaW5mbGF0ZTg2IFtBbmRlcnNvbl0KLS0gVXBkYXRlIGNvbnRyaWIvdGVzdHpsaWIsIGNvbnRyaWIvdnN0dWRpbywgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotLSBBZGQgbXNkb3MgYW5kIHdpbjMyIGRpcmVjdG9yaWVzIHdpdGggbWFrZWZpbGVzIFtUcnV0YV0KLS0gTW9yZSBhZGRpdGlvbnMgYW5kIGltcHJvdmVtZW50cyB0byB0aGUgRkFRCi0KLUNoYW5nZXMgaW4gMS4yLjAgKDkgTWFyY2ggMjAwMykKLS0gTmV3IGFuZCBpbXByb3ZlZCBpbmZsYXRlIGNvZGUKLSAgICAtIEFib3V0IDIwJSBmYXN0ZXIKLSAgICAtIERvZXMgbm90IGFsbG9jYXRlIDMySyB3aW5kb3cgdW5sZXNzIGFuZCB1bnRpbCBuZWVkZWQKLSAgICAtIEF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBhbmQgZGVjb21wcmVzc2VzIGd6aXAgc3RyZWFtcwotICAgIC0gUmF3IGluZmxhdGUgbm8gbG9uZ2VyIG5lZWRzIGFuIGV4dHJhIGR1bW15IGJ5dGUgYXQgZW5kCi0gICAgLSBBZGRlZCBpbmZsYXRlQmFjayBmdW5jdGlvbnMgdXNpbmcgYSBjYWxsYmFjayBpbnRlcmZhY2UtLWV2ZW4gZmFzdGVyCi0gICAgICB0aGFuIGluZmxhdGUsIHVzZWZ1bCBmb3IgZmlsZSB1dGlsaXRpZXMgKGd6aXAsIHppcCkKLSAgICAtIEFkZGVkIGluZmxhdGVDb3B5KCkgZnVuY3Rpb24gdG8gcmVjb3JkIHN0YXRlIGZvciByYW5kb20gYWNjZXNzIG9uCi0gICAgICBleHRlcm5hbGx5IGdlbmVyYXRlZCBkZWZsYXRlIHN0cmVhbXMgKGUuZy4gaW4gZ3ppcCBmaWxlcykKLSAgICAtIE1vcmUgcmVhZGFibGUgY29kZSAoSSBob3BlKQotLSBOZXcgYW5kIGltcHJvdmVkIGNyYzMyKCkKLSAgICAtIEFib3V0IDUwJSBmYXN0ZXIsIHRoYW5rcyB0byBzdWdnZXN0aW9ucyBmcm9tIFJvZG5leSBCcm93bgotLSBBZGQgZGVmbGF0ZUJvdW5kKCkgYW5kIGNvbXByZXNzQm91bmQoKSBmdW5jdGlvbnMKLS0gRml4IG1lbW9yeSBsZWFrIGluIGRlZmxhdGVJbml0MigpCi0tIFBlcm1pdCBzZXR0aW5nIGRpY3Rpb25hcnkgZm9yIHJhdyBkZWZsYXRlIChmb3IgcGFyYWxsZWwgZGVmbGF0ZSkKLS0gRml4IGNvbnN0IGRlY2xhcmF0aW9uIGZvciBnendyaXRlKCkKLS0gQ2hlY2sgZm9yIHNvbWUgbWFsbG9jKCkgZmFpbHVyZXMgaW4gZ3ppby5jCi0tIEZpeCBidWcgaW4gZ3pvcGVuKCkgb24gc2luZ2xlLWJ5dGUgZmlsZSAweDFmCi0tIEZpeCBidWcgaW4gZ3pyZWFkKCkgb24gY29uY2F0ZW5hdGVkIGZpbGUgd2l0aCAweDFmIGF0IGVuZCBvZiBidWZmZXIKLSAgYW5kIG5leHQgYnVmZmVyIGRvZXNuJ3Qgc3RhcnQgd2l0aCAweDhiCi0tIEZpeCB1bmNvbXByZXNzKCkgdG8gcmV0dXJuIFpfREFUQV9FUlJPUiBvbiB0cnVuY2F0ZWQgaW5wdXQKLS0gRnJlZSBtZW1vcnkgYXQgZW5kIG9mIGV4YW1wbGUuYwotLSBSZW1vdmUgTUFYICNkZWZpbmUgaW4gdHJlZXMuYyAoY29uZmxpY3RlZCB3aXRoIHNvbWUgbGlicmFyaWVzKQotLSBGaXggc3RhdGljIGNvbnN0J3MgaW4gZGVmbGF0ZS5jLCBnemlvLmMsIGFuZCB6dXRpbC5bY2hdCi0tIERlY2xhcmUgbWFsbG9jKCkgYW5kIGZyZWUoKSBpbiBnemlvLmMgaWYgU1REQyBub3QgZGVmaW5lZAotLSBVc2UgbWFsbG9jKCkgaW5zdGVhZCBvZiBjYWxsb2MoKSBpbiB6dXRpbC5jIGlmIGludCBiaWcgZW5vdWdoCi0tIERlZmluZSBTVERDIGZvciBBSVgKLS0gQWRkIGFpeC8gd2l0aCBhcHByb2FjaCBmb3IgY29tcGlsaW5nIHNoYXJlZCBsaWJyYXJ5IG9uIEFJWAotLSBBZGQgSFAtVVggc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBpbiBjb25maWd1cmUKLS0gQWRkIE9wZW5VTklYIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gY29uZmlndXJlCi0tIFVzZSAkY2MgaW5zdGVhZCBvZiBnY2MgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcnkKLS0gTWFrZSBwcmVmaXggZGlyZWN0b3J5IGlmIG5lZWRlZCB3aGVuIGluc3RhbGxpbmcKLS0gQ29ycmVjdCBNYWNpbnRvc2ggYXZvaWRhbmNlIG9mIHR5cGVkZWYgQnl0ZSBpbiB6Y29uZi5oCi0tIENvcnJlY3QgVHVyYm8gQyBtZW1vcnkgYWxsb2NhdGlvbiB3aGVuIHVuZGVyIExpbnV4Ci0tIFVzZSBsaWJ6LmEgaW5zdGVhZCBvZiAtbHogaW4gTWFrZWZpbGUgKGFzc3VyZSB1c2Ugb2YgY29tcGlsZWQgbGlicmFyeSkKLS0gVXBkYXRlIGNvbmZpZ3VyZSB0byBjaGVjayBmb3Igc25wcmludGYgb3IgdnNucHJpbnRmIGZ1bmN0aW9ucyBhbmQgdGhlaXIKLSAgcmV0dXJuIHZhbHVlLCB3YXJuIGR1cmluZyBtYWtlIGlmIHVzaW5nIGFuIGluc2VjdXJlIGZ1bmN0aW9uCi0tIEZpeCBjb25maWd1cmUgcHJvYmxlbSB3aXRoIGNvbXBpbGUtdGltZSBrbm93bGVkZ2Ugb2YgSEFWRV9VTklTVERfSCB0aGF0Ci0gIGlzIGxvc3Qgd2hlbiBsaWJyYXJ5IGlzIHVzZWQtLXJlc29sdXRpb24gaXMgdG8gYnVpbGQgbmV3IHpjb25mLmgKLS0gRG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMgKGluIHpsaWIuaCk6Ci0gICAgLSBEb2N1bWVudCByYXcgZGVmbGF0ZSBhbmQgaW5mbGF0ZQotICAgIC0gVXBkYXRlIFJGQ3MgVVJMCi0gICAgLSBQb2ludCBvdXQgdGhhdCB6bGliIGFuZCBnemlwIGZvcm1hdHMgYXJlIGRpZmZlcmVudAotICAgIC0gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbAotICAgIC0gRG9jdW1lbnQgc3RyaW5nIGxpbWl0IGZvciBnenByaW50ZigpIGFuZCBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cKLSAgICAtIE5vdGUgcmVxdWlyZW1lbnQgb24gYXZhaWxfb3V0IHdoZW4gZmx1c2hpbmcKLSAgICAtIE5vdGUgcGVybWl0dGVkIHZhbHVlcyBvZiBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpCi0tIEFkZCBzb21lIEZBUXMgKGFuZCBldmVuIGFuc3dlcnMpIHRvIHRoZSBGQVEKLS0gQWRkIGNvbnRyaWIvaW5mbGF0ZTg2LyBmb3IgeDg2IGZhc3RlciBpbmZsYXRlCi0tIEFkZCBjb250cmliL2JsYXN0LyBmb3IgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeSBkZWNvbXByZXNzaW9uCi0tIEFkZCBjb250cmliL3B1ZmYvIHNpbXBsZSBpbmZsYXRlIGZvciBkZWZsYXRlIGZvcm1hdCBkZXNjcmlwdGlvbgotCi1DaGFuZ2VzIGluIDEuMS40ICgxMSBNYXJjaCAyMDAyKQotLSBaRlJFRSB3YXMgcmVwZWF0ZWQgb24gc2FtZSBhbGxvY2F0aW9uIG9uIHNvbWUgZXJyb3IgY29uZGl0aW9ucy4KLSAgVGhpcyBjcmVhdGVzIGEgc2VjdXJpdHkgcHJvYmxlbSBkZXNjcmliZWQgaW4KLSAgaHR0cDovL3d3dy56bGliLm9yZy9hZHZpc29yeS0yMDAyLTAzLTExLnR4dAotLSBSZXR1cm5lZCBpbmNvcnJlY3QgZXJyb3IgKFpfTUVNX0VSUk9SKSBvbiBzb21lIGludmFsaWQgZGF0YQotLSBBdm9pZCBhY2Nlc3NlcyBiZWZvcmUgd2luZG93IGZvciBpbnZhbGlkIGRpc3RhbmNlcyB3aXRoIGluZmxhdGUgd2luZG93Ci0gIGxlc3MgdGhhbiAzMksuCi0tIGZvcmNlIHdpbmRvd0JpdHMgPiA4IHRvIGF2b2lkIGEgYnVnIGluIHRoZSBlbmNvZGVyIGZvciBhIHdpbmRvdyBzaXplCi0gIG9mIDI1NiBieXRlcy4gKEEgY29tcGxldGUgZml4IHdpbGwgYmUgYXZhaWxhYmxlIGluIDEuMS41KS4KLQotQ2hhbmdlcyBpbiAxLjEuMyAoOSBKdWx5IDE5OTgpCi0tIGZpeCAiYW4gaW5mbGF0ZSBpbnB1dCBidWZmZXIgYnVnIHRoYXQgc2hvd3MgdXAgb24gcmFyZSBidXQgcGVyc2lzdGVudAotICBvY2Nhc2lvbnMiIChNYXJrKQotLSBmaXggZ3pyZWFkIGFuZCBnenRlbGwgZm9yIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMgKERpZGllciBMZSBCb3RsYW4pCi0tIGZpeCBnenNlZWsoLi4uLCBTRUVLX1NFVCkgaW4gd3JpdGUgbW9kZQotLSBmaXggY3JjIGNoZWNrIGFmdGVyIGEgZ3plZWsgKEZyYW5rIEZhdWJlcnQpCi0tIGZpeCBtaW5pdW56aXAgd2hlbiB0aGUgbGFzdCBlbnRyeSBpbiBhIHppcCBmaWxlIGlzIGl0c2VsZiBhIHppcCBmaWxlCi0gIChKIExpbGxnZSkKLS0gYWRkIGNvbnRyaWIvYXNtNTg2IGFuZCBjb250cmliL2FzbTY4NiAoQnJpYW4gUmFpdGVyKQotICBTZWUgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAotLSBhZGQgc3VwcG9ydCBmb3IgRGVscGhpIDMgaW4gY29udHJpYi9kZWxwaGkgKEJvYiBEZWxsYWNhKQotLSBhZGQgc3VwcG9ydCBmb3IgQysrQnVpbGRlciAzIGFuZCBEZWxwaGkgMyBpbiBjb250cmliL2RlbHBoaTIgKERhdmlkZSBNb3JldHRpKQotLSBkbyBub3QgZXhpdCBwcmVtYXR1cmVseSBpbiB1bnRneiBpZiAwIGF0IHN0YXJ0IG9mIGJsb2NrIChNYWdudXMgSG9sbWdyZW4pCi0tIHVzZSBtYWNybyBFWFRFUk4gaW5zdGVhZCBvZiBleHRlcm4gdG8gc3VwcG9ydCBETEwgZm9yIEJlT1MgKFNhbmRlciBTdG9rcykKLS0gYWRkZWQgYSBGQVEgZmlsZQotCi0tIFN1cHBvcnQgZ3pkb3BlbiBvbiBNYWMgd2l0aCBNZXRyb3dlcmtzIChKYXNvbiBMaW5oYXJ0KQotLSBEbyBub3QgcmVkZWZpbmUgQnl0ZSBvbiBNYWMgKEJyYWQgUGV0dGl0ICYgSmFzb24gTGluaGFydCkKLS0gZGVmaW5lIFNFRUtfRU5EIHRvbyBpZiBTRUVLX1NFVCBpcyBub3QgZGVmaW5lZCAoQWxiZXJ0IENoaW4tQS1Zb3VuZykKLS0gYXZvaWQgc29tZSB3YXJuaW5ncyB3aXRoIEJvcmxhbmQgQyAoVG9tIFRhbm5lcikKLS0gZml4IGEgcHJvYmxlbSBpbiBjb250cmliL21pbml6aXAvemlwLmMgZm9yIDE2LWJpdCBNU0RPUyAoR2lsbGVzIFZvbGxhbnQpCi0tIGVtdWxhdGUgdXRpbWUoKSBmb3IgV0lOMzIgaW4gY29udHJpYi91bnRneiAgKEdpbGxlcyBWb2xsYW50KQotLSBhbGxvdyBzZXZlcmFsIGFyZ3VtZW50cyB0byBjb25maWd1cmUgKFRpbSBNb29uZXksIEZyb2RvIExvb2lqYWFyZCkKLS0gdXNlIGxpYmRpciBhbmQgaW5jbHVkZWRpciBpbiBNYWtlZmlsZS5pbiAoVGltIE1vb25leSkKLS0gc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIE9TRjEgVjQgKFRpbSBNb29uZXkpCi0tIHJlbW92ZSBzb19sb2NhdGlvbnMgaW4gIm1ha2UgY2xlYW4iICAoVGltIE1vb25leSkKLS0gZml4IG1ha2V0cmVlLmMgY29tcGlsYXRpb24gZXJyb3IgKEdsZW5uLCBNYXJrKQotLSBQeXRob24gaW50ZXJmYWNlIHRvIHpsaWIgbm93IGluIFB5dGhvbiAxLjUgKEplcmVteSBIeWx0b24pCi0tIG5ldyBNYWtlZmlsZS5yaXNjb3MgKFJpY2ggV2Fsa2VyKQotLSBpbml0aWFsaXplIHN0YXRpYyBkZXNjcmlwdG9ycyBpbiB0cmVlcy5jIGZvciBlbWJlZGRlZCB0YXJnZXRzIChOaWNrIFNtaXRoKQotLSB1c2UgImZvby1neiIgaW4gZXhhbXBsZS5jIGZvciBSSVNDT1MgYW5kIFZNUyAoTmljayBTbWl0aCkKLS0gYWRkIHRoZSBPUy8yIGZpbGVzIGluIE1ha2VmaWxlLmluIHRvbyAoQW5kcmV3IFphYm9sb3RueSkKLS0gZml4IGZkb3BlbiBhbmQgaGFsbG9jIG1hY3JvcyBmb3IgTWljcm9zb2Z0IEMgNi4wIChUb20gTGFuZSkKLS0gZml4IG1ha2V0cmVlLmMgdG8gYWxsb3cgY2xlYW4gY29tcGlsYXRpb24gb2YgaW5mZml4ZWQuaCAoTWFyaykKLS0gZml4IHBhcmFtZXRlciBjaGVjayBpbiBkZWZsYXRlQ29weSAoR3VudGhlciBOaWtsKQotLSBjbGVhbnVwIHRyZWVzLmMsIHVzZSBjb21wcmVzc2VkX2xlbiBvbmx5IGluIGRlYnVnIG1vZGUgKENocmlzdGlhbiBTcGllbGVyKQotLSBNYW55IHBvcnRhYmlsaXR5IHBhdGNoZXMgYnkgQ2hyaXN0aWFuIFNwaWVsZXI6Ci0gIC4genV0aWwuYywgenV0aWwuaDogYWRkZWQgImNvbnN0IiBmb3Igem1lbSoKLSAgLiBNYWtlX3Ztcy5jb206IGZpeGVkIHNvbWUgdHlwb3MKLSAgLiBNYWtlX3Ztcy5jb206IG1zZG9zL01ha2VmaWxlLio6IHJlbW92ZWQgenV0aWwuaCBmcm9tIHNvbWUgZGVwZW5kZW5jeSBsaXN0cwotICAuIG1zZG9zL01ha2VmaWxlLm1zYzogcmVtb3ZlICJkZWZhdWx0IHJ0bCBsaW5rIGxpYnJhcnkiIGluZm8gZnJvbSBvYmogZmlsZXMKLSAgLiBtc2Rvcy9NYWtlZmlsZS4qOiB1c2UgbW9kZWwtZGVwZW5kZW50IG5hbWUgZm9yIHRoZSBidWlsdCB6bGliIGxpYnJhcnkKLSAgLiBtc2Rvcy9NYWtlZmlsZS5lbXgsIG50L01ha2VmaWxlLmVteCwgbnQvTWFrZWZpbGUuZ2NjOgotICAgICBuZXcgbWFrZWZpbGVzLCBmb3IgZW14IChET1MvT1MyKSwgZW14JnJzeG50IGFuZCBtaW5ndzMyIChXaW5kb3dzIDl4IC8gTlQpCi0tIHVzZSBkZWZpbmUgaW5zdGVhZCBvZiB0eXBlZGVmIGZvciBCeXRlZiBhbHNvIGZvciBNU0Mgc21hbGwvbWVkaXVtIChUb20gTGFuZSkKLS0gcmVwbGFjZSBfX2ZhciB3aXRoIF9mYXIgZm9yIGJldHRlciBwb3J0YWJpbGl0eSAoQ2hyaXN0aWFuIFNwaWVsZXIsIFRvbSBMYW5lKQotLSBmaXggdGVzdCBmb3IgZXJybm8uaCBpbiBjb25maWd1cmUgKFRpbSBOZXdzaGFtKQotCi1DaGFuZ2VzIGluIDEuMS4yICgxOSBNYXJjaCA5OCkKLS0gYWRkZWQgY29udHJpYi9taW56aXAsIG1pbmkgemlwIGFuZCB1bnppcCBiYXNlZCBvbiB6bGliIChHaWxsZXMgVm9sbGFudCkKLSAgU2VlIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbAotLSBwcmVpbml0aWFsaXplIHRoZSBpbmZsYXRlIHRhYmxlcyBmb3IgZml4ZWQgY29kZXMsIHRvIG1ha2UgdGhlIGNvZGUKLSAgY29tcGxldGVseSB0aHJlYWQgc2FmZSAoTWFyaykKLS0gc29tZSBzaW1wbGlmaWNhdGlvbnMgYW5kIHNsaWdodCBzcGVlZC11cCB0byB0aGUgaW5mbGF0ZSBjb2RlIChNYXJrKQotLSBmaXggZ3plb2Ygb24gbm9uLWNvbXByZXNzZWQgZmlsZXMgKEFsbGFuIFNjaHJ1bSkKLS0gYWRkIC1zdGQxIG9wdGlvbiBpbiBjb25maWd1cmUgZm9yIE9TRjEgdG8gZml4IGd6cHJpbnRmIChNYXJ0aW4gTW9rcmVqcykKLS0gdXNlIGRlZmF1bHQgdmFsdWUgb2YgNEsgZm9yIFpfQlVGU0laRSBmb3IgMTYtYml0IE1TRE9TIChUaW0gV2VnbmVyICsgR2xlbm4pCi0tIGFkZGVkIG9zMi9NYWtlZmlsZS5kZWYgYW5kIG9zMi96bGliLmRlZiAoQW5kcmV3IFphYm9sb3RueSkKLS0gYWRkIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgVU5JWF9TVjQuMk1QIChNQVRTVVVSQSBUYWthbm9yaSkKLS0gZG8gbm90IHdyYXAgZXh0ZXJuICJDIiBhcm91bmQgc3lzdGVtIGluY2x1ZGVzIChUb20gTGFuZSkKLS0gbWVudGlvbiB6bGliIGJpbmRpbmcgZm9yIFRDTCBpbiBSRUFETUUgKEFuZHJlYXMgS3VwcmllcykKLS0gYWRkZWQgYW1pZ2EvTWFrZWZpbGUucHVwIGZvciBBbWlnYSBwb3dlclVQIFNBUy9DIFBQQyAoQW5kcmVhcyBLbGVpbmVydCkKLS0gYWxsb3cgIm1ha2UgaW5zdGFsbCBwcmVmaXg9Li4uIiBldmVuIGFmdGVyIGNvbmZpZ3VyZSAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotLSBhbGxvdyAiY29uZmlndXJlIC0tcHJlZml4ICRIT01FIiAoVGltIE1vb25leSkKLS0gcmVtb3ZlIHdhcm5pbmdzIGluIGV4YW1wbGUuYyBhbmQgZ3ppby5jIChHbGVubiBSYW5kZXJzLVBlaHJzb24pCi0tIG1vdmUgTWFrZWZpbGUuc2FzIHRvIGFtaWdhL01ha2VmaWxlLnNhcwotCi1DaGFuZ2VzIGluIDEuMS4xICgyNyBGZWIgOTgpCi0tIGZpeCBtYWNyb3MgX3RyX3RhbGx5XyogaW4gZGVmbGF0ZS5oIGZvciBkZWJ1ZyBtb2RlICAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotLSByZW1vdmUgYmxvY2sgdHJ1bmNhdGlvbiBoZXVyaXN0aWMgd2hpY2ggaGFkIHZlcnkgbWFyZ2luYWwgZWZmZWN0IGZvciB6bGliCi0gIChzbWFsbGVyIGxpdF9idWZzaXplIHRoYW4gaW4gZ3ppcCAxLjIuNCkgYW5kIGRlZ3JhZGVkIGEgbGl0dGxlIHRoZQotICBjb21wcmVzc2lvbiByYXRpbyBvbiBzb21lIGZpbGVzLiBUaGlzIGFsc28gYWxsb3dzIGlubGluaW5nIF90cl90YWxseSBmb3IKLSAgbWF0Y2hlcyBpbiBkZWZsYXRlX3Nsb3cuCi0tIGFkZGVkIG1zZG9zL01ha2VmaWxlLnczMiBmb3IgV0lOMzIgTWljcm9zb2Z0IFZpc3VhbCBDKysgKEJvYiBGcmF6aWVyKQotCi1DaGFuZ2VzIGluIDEuMS4wICgyNCBGZWIgOTgpCi0tIGRvIG5vdCByZXR1cm4gU1RSRUFNX0VORCBwcmVtYXR1cmVseSBpbiBpbmZsYXRlIChKb2huIEJvd2xlcikKLS0gcmV2ZXJ0IHRvIHRoZSB6bGliIDEuMC44IGluZmxhdGUgdG8gYXZvaWQgdGhlIGdjYyAyLjguMCBidWcgKEplcmVteSBCdWhsZXIpCi0tIGNvbXBpbGUgd2l0aCAtREZBU1RFU1QgdG8gZ2V0IGNvbXByZXNzaW9uIGNvZGUgb3B0aW1pemVkIGZvciBzcGVlZCBvbmx5Ci0tIGluIG1pbmlnemlwLCB0cnkgbW1hcCdpbmcgdGhlIGlucHV0IGZpbGUgZmlyc3QgKE1pZ3VlbCBBbGJyZWNodCkKLS0gaW5jcmVhc2Ugc2l6ZSBvZiBJL08gYnVmZmVycyBpbiBtaW5pZ3ppcC5jIGFuZCBnemlvLmMgKG5vdCBhIGJpZyBnYWluCi0gIG9uIFN1biBidXQgc2lnbmlmaWNhbnQgb24gSFApCi0KLS0gYWRkIGEgcG9pbnRlciB0byBleHBlcmltZW50YWwgdW56aXAgbGlicmFyeSBpbiBSRUFETUUgKEdpbGxlcyBWb2xsYW50KQotLSBpbml0aWFsaXplIHZhcmlhYmxlIGdjYyBpbiBjb25maWd1cmUgKENocmlzIEhlcmJvcnRoKQotCi1DaGFuZ2VzIGluIDEuMC45ICgxNyBGZWIgMTk5OCkKLS0gYWRkZWQgZ3pwdXRzIGFuZCBnemdldHMgZnVuY3Rpb25zCi0tIGRvIG5vdCBjbGVhciBlb2YgZmxhZyBpbiBnenNlZWsgKE1hcmsgRGlla2hhbnMpCi0tIGZpeCBnenNlZWsgZm9yIGZpbGVzIGluIHRyYW5zcGFyZW50IG1vZGUgKE1hcmsgRGlla2hhbnMpCi0tIGRvIG5vdCBhc3N1bWUgdGhhdCB2c3ByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAoSmVucyBLcmlua2UpCi0tIHJlcGxhY2UgRVhQT1JUIHdpdGggWkVYUE9SVCB0byBhdm9pZCBjb25mbGljdCB3aXRoIG90aGVyIHByb2dyYW1zCi0tIGFkZGVkIGNvbXByZXNzMiBpbiB6Y29uZi5oLCB6bGliLmRlZiwgemxpYi5kbnQKLS0gbmV3IGFzbSBjb2RlIGZyb20gR2lsbGVzIFZvbGxhbnQgaW4gY29udHJpYi9hc20zODYKLS0gc2ltcGxpZnkgdGhlIGluZmxhdGUgY29kZSAoTWFyayk6Ci0gLiBSZXBsYWNlIFpBTExPQydzIGluIGh1ZnRfYnVpbGQoKSB3aXRoIHNpbmdsZSBaQUxMT0MgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3KCkKLSAuIFpBTExPQyB0aGUgbGVuZ3RoIGxpc3QgaW4gaW5mbGF0ZV90cmVlc19maXhlZCgpIGluc3RlYWQgb2YgdXNpbmcgc3RhY2sKLSAuIFpBTExPQyB0aGUgdmFsdWUgYXJlYSBmb3IgaHVmdF9idWlsZCgpIGluc3RlYWQgb2YgdXNpbmcgc3RhY2sKLSAuIFNpbXBsaWZ5IFpfRklOSVNIIGNoZWNrIGluIGluZmxhdGUoKQotCi0tIEF2b2lkIGdjYyAyLjguMCBjb21wYXJpc29uIGJ1ZyBhIGxpdHRsZSBkaWZmZXJlbnRseSB0aGFuIHpsaWIgMS4wLjgKLS0gaW4gaW5mdHJlZXMuYywgYXZvaWQgY2MgLU8gYnVnIG9uIEhQIChGYXJzaGlkIEVsYWhpKQotLSBpbiB6Y29uZi5oIG1vdmUgdGhlIFpMSUJfRExMIHN0dWZmIGVhcmxpZXIgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aAotICB0aGUgZGVjbGFyYXRpb24gb2YgRkFSIChHaWxsZXMgVk9sbGFudCkKLS0gaW5zdGFsbCBsaWJ6LnNvKiB3aXRoIG1vZGUgNzU1IChleGVjdXRhYmxlKSBpbnN0ZWFkIG9mIDY0NCAoTWFyYyBMZWhtYW5uKQotLSByZWFkX2J1ZiBidWYgcGFyYW1ldGVyIG9mIHR5cGUgQnl0ZWYqIGluc3RlYWQgb2YgY2hhcmYqCi0tIHptZW1jcHkgcGFyYW1ldGVycyBhcmUgb2YgdHlwZSBCeXRlZiosIG5vdCBjaGFyZiogKEpvc2VwaCBTdHJvdXQpCi0tIGRvIG5vdCByZWRlY2xhcmUgdW5saW5rIGluIG1pbmlnemlwLmMgZm9yIFdJTjMyIChKb2huIEJvd2xlcikKLS0gZml4IGNoZWNrIGZvciBwcmVzZW5jZSBvZiBkaXJlY3RvcmllcyBpbiAibWFrZSBpbnN0YWxsIiAoSWFuIFdpbGxpcykKLQotQ2hhbmdlcyBpbiAxLjAuOCAoMjcgSmFuIDE5OTgpCi0tIGZpeGVkIG9mZnNldHMgaW4gY29udHJpYi9hc20zODYvZ3ZtYXQzMi5hc20gKEdpbGxlcyBWb2xsYW50KQotLSBmaXggZ3pnZXRjIGFuZCBnenB1dGMgZm9yIGJpZyBlbmRpYW4gc3lzdGVtcyAoTWFya3VzIE9iZXJodW1lcikKLS0gYWRkZWQgY29tcHJlc3MyKCkgdG8gYWxsb3cgc2V0dGluZyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKLS0gaW5jbHVkZSBzeXMvdHlwZXMuaCB0byBnZXQgb2ZmX3Qgb24gc29tZSBzeXN0ZW1zIChNYXJjIExlaG1hbm4gJiBRaW5nTG9uZykKLS0gdXNlIGNvbnN0YW50IGFycmF5cyBmb3IgdGhlIHN0YXRpYyB0cmVlcyBpbiB0cmVlcy5jIGluc3RlYWQgb2YgY29tcHV0aW5nCi0gIHRoZW0gYXQgcnVuIHRpbWUgKHRoYW5rcyB0byBLZW4gUmFlYnVybiBmb3IgdGhpcyBzdWdnZXN0aW9uKS4gVG8gY3JlYXRlCi0gIHRyZWVzLmgsIGNvbXBpbGUgd2l0aCBHRU5fVFJFRVNfSCBhbmQgcnVuICJtYWtlIHRlc3QiLgotLSBjaGVjayByZXR1cm4gY29kZSBvZiBleGFtcGxlIGluICJtYWtlIHRlc3QiIGFuZCBkaXNwbGF5IHJlc3VsdAotLSBwYXNzIG1pbmlnemlwIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGZpbGVfY29tcHJlc3MKLS0gc2ltcGxpZnlpbmcgY29kZSBvZiBpbmZsYXRlU3luYyB0byBhdm9pZCBnY2MgMi44IGJ1ZwotCi0tIHN1cHBvcnQgQ0M9ImdjYyAtV2FsbCIgaW4gY29uZmlndXJlIC1zIChRaW5nTG9uZykKLS0gYXZvaWQgYSBmbHVzaCBjYXVzZWQgYnkgZnRlbGwgaW4gZ3pvcGVuIGZvciB3cml0ZSBtb2RlIChLZW4gUmFlYnVybikKLS0gZml4IHRlc3QgZm9yIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKLS0gemxpYi5saWIgLT4gemxpYi5kbGwgaW4gbXNkb3MvemxpYi5yYyAoR2lsbGVzIFZvbGxhbnQpCi0tIGNoZWNrIGZvciBUQVJHRVRfT1NfTUFDIGluIGFkZGl0aW9uIHRvIE1BQ09TIChCcmFkIFBldHRpdCkKLS0gZG8gbm90IHVzZSBmZG9wZW4gZm9yIE1ldHJvd2Vya3Mgb24gTWFjIChCcmFkIFBldHRpdCkpCi0tIGFkZCBjaGVja3MgZm9yIGd6cHV0YyBhbmQgZ3pwdXRjIGluIGV4YW1wbGUuYwotLSBhdm9pZCB3YXJuaW5ncyBpbiBnemlvLmMgYW5kIGRlZmxhdGUuYyAoQW5kcmVhcyBLbGVpbmVydCkKLS0gdXNlIGNvbnN0IGZvciB0aGUgQ1JDIHRhYmxlIChLZW4gUmFlYnVybikKLS0gZml4ZWQgIm1ha2UgdW5pbnN0YWxsIiBmb3Igc2hhcmVkIGxpYnJhcmllcwotLSB1c2UgVHJhY2V2IGluc3RlYWQgb2YgVHJhY2UgaW4gaW5mYmxvY2suYwotLSBpbiBleGFtcGxlLmMgdXNlIGNvcnJlY3QgY29tcHJlc3NlZCBsZW5ndGggZm9yIHRlc3Rfc3luYwotLSBzdXBwcmVzcyArdm5vY29tcGF0d2FybmluZ3MgaW4gY29uZmlndXJlIGZvciBIUFVYIChub3QgYWx3YXlzIHN1cHBvcnRlZCkKLQotQ2hhbmdlcyBpbiAxLjAuNyAoMjAgSmFuIDE5OTgpCi0tIGZpeCBnenNlZWsgd2hpY2ggd2FzIGJyb2tlbiBpbiB3cml0ZSBtb2RlCi0tIHJldHVybiBlcnJvciBmb3IgZ3pzZWVrIHRvIG5lZ2F0aXZlIGFic29sdXRlIHBvc2l0aW9uCi0tIGZpeCBjb25maWd1cmUgZm9yIExpbnV4IChDaHVuLUNodW5nIENoZW4pCi0tIGluY3JlYXNlIHN0YWNrIHNwYWNlIGZvciBNU0MgKFRpbSBXZWduZXIpCi0tIGdldF9jcmNfdGFibGUgYW5kIGluZmxhdGVTeW5jUG9pbnQgYXJlIEVYUE9SVGVkIChHaWxsZXMgVm9sbGFudCkKLS0gZGVmaW5lIEVYUE9SVFZBIGZvciBnenByaW50ZiAoR2lsbGVzIFZvbGxhbnQpCi0tIGFkZGVkIG1hbiBwYWdlIHpsaWIuMyAoUmljayBSb2RnZXJzKQotLSBmb3IgY29udHJpYi91bnRneiwgZml4IG1ha2VkaXIoKSBhbmQgaW1wcm92ZSBNYWtlZmlsZQotCi0tIGNoZWNrIGd6c2VlayBpbiB3cml0ZSBtb2RlIGluIGV4YW1wbGUuYwotLSBhbGxvY2F0ZSBleHRyYSBidWZmZXIgZm9yIHNlZWtzIG9ubHkgaWYgZ3pzZWVrIGlzIGFjdHVhbGx5IGNhbGxlZAotLSBhdm9pZCBzaWduZWQvdW5zaWduZWQgY29tcGFyaXNvbnMgKFRpbSBXZWduZXIsIEdpbGxlcyBWb2xsYW50KQotLSBhZGQgaW5mbGF0ZVN5bmNQb2ludCBpbiB6Y29uZi5oCi0tIGZpeCBsaXN0IG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyBpbiBudC96bGliLmRudCBhbmQgbWRzb3MvemxpYi5kZWYKLQotQ2hhbmdlcyBpbiAxLjAuNiAoMTkgSmFuIDE5OTgpCi0tIGFkZCBmdW5jdGlvbnMgZ3pwcmludGYsIGd6cHV0YywgZ3pnZXRjLCBnenRlbGwsIGd6ZW9mLCBnenNlZWssIGd6cmV3aW5kIGFuZAotICBnenNldHBhcmFtcyAodGhhbmtzIHRvIFJvbGFuZCBHaWVyc2lnIGFuZCBLZXZpbiBSdWxhbmQgZm9yIHNvbWUgb2YgdGhpcyBjb2RlKQotLSBGaXggYSBkZWZsYXRlIGJ1ZyBvY2N1cnJpbmcgb25seSB3aXRoIGNvbXByZXNzaW9uIGxldmVsIDAgKHRoYW5rcyB0bwotICBBbmR5IEJ1Y2tsZXIgZm9yIGZpbmRpbmcgdGhpcyBvbmUpLgotLSBJbiBtaW5pZ3ppcCwgcGFzcyB0cmFuc3BhcmVudGx5IGFsc28gdGhlIGZpcnN0IGJ5dGUgZm9yIC5aIGZpbGVzLgotLSByZXR1cm4gWl9CVUZfRVJST1IgaW5zdGVhZCBvZiBaX09LIGlmIG91dHB1dCBidWZmZXIgZnVsbCBpbiB1bmNvbXByZXNzKCkKLS0gY2hlY2sgWl9GSU5JU0ggaW4gaW5mbGF0ZSAodGhhbmtzIHRvIE1hcmMgU2NobHVwZXIpCi0tIEltcGxlbWVudCBkZWZsYXRlQ29weSAodGhhbmtzIHRvIEFkYW0gQ29zdGVsbG8pCi0tIG1ha2Ugc3RhdGljIGxpYnJhcmllcyBieSBkZWZhdWx0IGluIGNvbmZpZ3VyZSwgYWRkIC0tc2hhcmVkIG9wdGlvbi4KLS0gbW92ZSBNU0RPUyBvciBXaW5kb3dzIHNwZWNpZmljIGZpbGVzIHRvIGRpcmVjdG9yeSBtc2RvcwotLSBzdXBwcmVzcyB0aGUgbm90aW9uIG9mIHBhcnRpYWwgZmx1c2ggdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQotICAoYnV0IHRoZSBzeW1ib2wgWl9QQVJUSUFMX0ZMVVNIIGlzIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjAuNCkKLS0gc3VwcHJlc3MgaGlzdG9yeSBidWZmZXIgcHJvdmlkZWQgYnkgYXBwbGljYXRpb24gdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQotICAodGhpcyBmZWF0dXJlIHdhcyBub3QgaW1wbGVtZW50ZWQgYW55d2F5IGluIDEuMC40KQotLSBuZXh0X2luIGFuZCBhdmFpbF9pbiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIGluZmxhdGVJbml0IG9yCi0gIGluZmxhdGVJbml0MgotLSBhZGQgRVhQT1JUIGluIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgKGZvciBXaW5kb3dzIERMTCkKLS0gYWRkZWQgTWFrZWZpbGUubnQgKHRoYW5rcyB0byBTdGVwaGVuIFdpbGxpYW1zKQotLSBhZGRlZCB0aGUgdW5zdXBwb3J0ZWQgImNvbnRyaWIiIGRpcmVjdG9yeToKLSAgIGNvbnRyaWIvYXNtMzg2LyBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+Ci0gICAgICAgIDM4NiBhc20gY29kZSByZXBsYWNpbmcgbG9uZ2VzdF9tYXRjaCgpLgotICAgY29udHJpYi9pb3N0cmVhbS8gYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+Ci0gICAgICAgIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCi0gICBjb250cmliL2lvc3RyZWFtMi8gIGJ5IFR5Z2UgTPh2c2V0IDxUeWdlLkxvdnNldEBjbXIubm8+Ci0gICAgICAgIEFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQotICAgY29udHJpYi91bnRnei8gIGJ5ICJQZWRybyBBLiBBcmFuZGEgR3V0aVxpcnJleiIgPHBhYWdAdGlkLmVzPgotICAgICAgICBBIHZlcnkgc2ltcGxlIHRhci5neiBmaWxlIGV4dHJhY3RvciB1c2luZyB6bGliCi0gICBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgYnkgQ2FybG9zIFJpb3MgPGNfcmlvc0Bzb25kYS5jbD4KLSAgICAgICAgSG93IHRvIHVzZSBjb21wcmVzcygpLCB1bmNvbXByZXNzKCkgYW5kIHRoZSBneiogZnVuY3Rpb25zIGZyb20gVkIuCi0tIHBhc3MgcGFyYW1zIC1mIChmaWx0ZXJlZCBkYXRhKSwgLWggKGh1ZmZtYW4gb25seSksIC0xIHRvIC05IChjb21wcmVzc2lvbgotICBsZXZlbCkgaW4gbWluaWd6aXAgKHRoYW5rcyB0byBUb20gTGFuZSkKLQotLSB1c2UgY29uc3QgZm9yIHJvbW1hYmxlIGNvbnN0YW50cyBpbiBkZWZsYXRlCi0tIGFkZGVkIHRlc3QgZm9yIGd6c2VlayBhbmQgZ3p0ZWxsIGluIGV4YW1wbGUuYwotLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIGluZmxhdGVTeW5jUG9pbnQoKSAoaGFjayBmb3IgUGF1bCBNYWNrZXJyYXMpCi0tIGFkZCB1bmRvY3VtZW50ZWQgZnVuY3Rpb24gekVycm9yIHRvIGNvbnZlcnQgZXJyb3IgY29kZSB0byBzdHJpbmcKLSAgKGZvciBUaW0gU21pdGhlcnMpCi0tIEFsbG93IGNvbXBpbGF0aW9uIG9mIGd6aW8gd2l0aCAtRE5PX0RFRkxBVEUgdG8gYXZvaWQgdGhlIGNvbXByZXNzaW9uIGNvZGUuCi0tIFVzZSBkZWZhdWx0IG1lbWNweSBmb3IgU3ltYW50ZWMgTVNET1MgY29tcGlsZXIuCi0tIEFkZCBFWFBPUlQga2V5d29yZCBmb3IgY2hlY2tfZnVuYyAobmVlZGVkIGZvciBXaW5kb3dzIERMTCkKLS0gYWRkIGN1cnJlbnQgZGlyZWN0b3J5IHRvIExEX0xJQlJBUllfUEFUSCBmb3IgIm1ha2UgdGVzdCIKLS0gY3JlYXRlIGFsc28gYSBsaW5rIGZvciBsaWJ6LnNvLjEKLS0gYWRkZWQgc3VwcG9ydCBmb3IgRlVKSVRTVSBVWFAvRFMgKHRoYW5rcyB0byBUb3NoaWFraSBOb211cmEpCi0tIHVzZSAkKFNIQVJFRExJQikgaW5zdGVhZCBvZiBsaWJ6LnNvIGluIE1ha2VmaWxlLmluIChmb3IgSFBVWCkKLS0gYWRkZWQgLXNvbmFtZSBmb3IgTGludXggaW4gY29uZmlndXJlIChDaHVuLUNodW5nIENoZW4sCi0tIGFzc2lnbiBudW1iZXJzIHRvIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgaW4gemxpYi5kZWYgKGZvciBXaW5kb3dzIERMTCkKLS0gYWRkIGFkdmljZSBpbiB6bGliLmggZm9yIGJlc3QgdXNhZ2Ugb2YgZGVmbGF0ZVNldERpY3Rpb25hcnkKLS0gd29yayBhcm91bmQgY29tcGlsZXIgYnVnIG9uIEF0YXJpIChjYXN0IFpfTlVMTCBpbiBjYWxsIG9mIHMtPmNoZWNrZm4pCi0tIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQU5TSSBrZXl3b3JkcyBvbmx5IGVuYWJsZWQgZm9yIFR1cmJvQyBpbiBsYXJnZSBtb2RlbAotLSBhdm9pZCAidmVyc2lvblN0cmluZyJbMF0gKEJvcmxhbmQgYnVnKQotLSBhZGQgTkVFRF9EVU1NWV9SRVRVUk4gZm9yIEJvcmxhbmQKLS0gdXNlIHZhcmlhYmxlIHpfdmVyYm9zZSBmb3IgdHJhY2luZyBpbiBkZWJ1ZyBtb2RlIChMLiBQZXRlciBEZXV0c2NoKS4KLS0gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBDQwotLSBkZWZpbmVkIFNUREMgZm9yIE9TLzIgKERhdmlkIENoYXJsYXApCi0tIGxpbWl0IGV4dGVybmFsIG5hbWVzIHRvIDggY2hhcnMgZm9yIE1WUyAoVGhvbWFzIEx1bmQpCi0tIGluIG1pbmlnemlwLmMsIHVzZSBzdGF0aWMgYnVmZmVycyBvbmx5IGZvciAxNi1iaXQgc3lzdGVtcwotLSBmaXggc3VmZml4IGNoZWNrIGZvciAibWluaWd6aXAgLWQgZm9vLmd6IgotLSBkbyBub3QgcmV0dXJuIGFuIGVycm9yIGZvciB0aGUgMm5kIG9mIHR3byBjb25zZWN1dGl2ZSBnemZsdXNoKCkgKEZlbGl4IExlZSkKLS0gdXNlIF9mZG9wZW4gaW5zdGVhZCBvZiBmZG9wZW4gZm9yIE1TQyA+PSA2LjAgKFRob21hcyBGYW5zbGF1KQotLSBhZGRlZCBtYWtlbGNjLmJhdCBmb3IgbGNjLXdpbjMyIChUb20gU3QgRGVuaXMpCi0tIGluIE1ha2VmaWxlLmRqMiwgdXNlIGNvcHkgYW5kIGRlbCBpbnN0ZWFkIG9mIGluc3RhbGwgYW5kIHJtIChGcmFuayBEb25haG9lKQotLSBBdm9pZCBleHBhbmRlZCAkSWQkLiBVc2UgInJjcyAta2IiIG9yICJjdnMgYWRtaW4gLWtiIiB0byBhdm9pZCBJZCBleHBhbnNpb24uCi0tIGNoZWNrIGZvciB1bmlzdGQuaCBpbiBjb25maWd1cmUgKGZvciBvZmZfdCkKLS0gcmVtb3ZlIHVzZWxlc3MgY2hlY2sgcGFyYW1ldGVyIGluIGluZmxhdGVfYmxvY2tzX2ZyZWUKLS0gYXZvaWQgdXNlbGVzcyBhc3NpZ25tZW50IG9mIHMtPmNoZWNrIHRvIGl0c2VsZiBpbiBpbmZsYXRlX2Jsb2Nrc19uZXcKLS0gZG8gbm90IGZsdXNoIHR3aWNlIGluIGd6Y2xvc2UgKHRoYW5rcyB0byBLZW4gUmFlYnVybikKLS0gcmVuYW1lIEZPUEVOIGFzIEZfT1BFTiB0byBhdm9pZCBjbGFzaCB3aXRoIC91c3IvaW5jbHVkZS9zeXMvZmlsZS5oCi0tIHVzZSBOT19FUlJOT19IIGluc3RlYWQgb2YgZW51bWVyYXRpb24gb2Ygb3BlcmF0aW5nIHN5c3RlbXMgd2l0aCBlcnJuby5oCi0tIHdvcmsgYXJvdW5kIGJ1Z2d5IGZjbG9zZSBvbiBwaXBlcyBmb3IgSFAvVVgKLS0gc3VwcG9ydCB6bGliIERMTCB3aXRoIEJPUkxBTkQgQysrIDUuMCAodGhhbmtzIHRvIEdsZW5uIFJhbmRlcnMtUGVocnNvbikKLS0gZml4IGNvbmZpZ3VyZSBpZiBDQyBpcyBhbHJlYWR5IGVxdWFsIHRvIGdjYwotCi1DaGFuZ2VzIGluIDEuMC41ICgzIEphbiA5OCkKLS0gRml4IGluZmxhdGUgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgd2hlbiBmZWQgY29ycnVwdGVkIG9yIGludmFsaWQgZGF0YQotLSBVc2UgY29uc3QgZm9yIHJvbW1hYmxlIGNvbnN0YW50cyBpbiBpbmZsYXRlCi0tIEVsaW1pbmF0ZSBtZW1vcnkgbGVha3Mgb24gZXJyb3IgY29uZGl0aW9ucyBpbiBpbmZsYXRlCi0tIFJlbW92ZWQgc29tZSB2ZXN0aWdpYWwgY29kZSBpbiBpbmZsYXRlCi0tIFVwZGF0ZSB3ZWIgYWRkcmVzcyBpbiBSRUFETUUKLQotQ2hhbmdlcyBpbiAxLjAuNCAoMjQgSnVsIDk2KQotLSBJbiB2ZXJ5IHJhcmUgY29uZGl0aW9ucywgZGVmbGF0ZShzLCBaX0ZJTklTSCkgY291bGQgZmFpbCB0byBwcm9kdWNlIGFuIEVPRgotICBiaXQsIHNvIHRoZSBkZWNvbXByZXNzb3IgY291bGQgZGVjb21wcmVzcyBhbGwgdGhlIGNvcnJlY3QgZGF0YSBidXQgd2VudAotICBvbiB0byBhdHRlbXB0IGRlY29tcHJlc3NpbmcgZXh0cmEgZ2FyYmFnZSBkYXRhLiBUaGlzIGFmZmVjdGVkIG1pbmlnemlwIHRvby4KLS0gemxpYlZlcnNpb24gYW5kIGd6ZXJyb3IgcmV0dXJuIGNvbnN0IGNoYXIqIChuZWVkZWQgZm9yIERMTCkKLS0gcG9ydCB0byBSSVNDT1MgKG5vIGZkb3Blbiwgbm8gbXVsdGlwbGUgZG90cywgbm8gdW5saW5rLCBubyBmaWxlbm8pCi0tIHVzZSB6X2Vycm9yIG9ubHkgZm9yIERFQlVHIChhdm9pZCBwcm9ibGVtIHdpdGggRExMcykKLQotQ2hhbmdlcyBpbiAxLjAuMyAoMiBKdWwgOTYpCi0tIHVzZSB6X3N0cmVhbXAgaW5zdGVhZCBvZiB6X3N0cmVhbSAqLCB3aGljaCBpcyBub3cgYSBmYXIgcG9pbnRlciBpbiBNU0RPUwotICBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsczsgdGhpcyBtYWtlcyB0aGUgbGlicmFyeSBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cwotICB2ZXJzaW9ucyBmb3IgdGhlc2UgbW9kZWxzLiAoTm8gZWZmZWN0IGluIGxhcmdlIG1vZGVsIG9yIG9uIG90aGVyIHN5c3RlbXMuKQotLSByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgaWYgcHJldmlvdXMgZGVmbGF0ZSBjYWxsIHJldHVybmVkIHdpdGgKLSAgYXZhaWxfb3V0IGFzIHplcm8gYnV0IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KLS0gYWRkZWQgbWVtY21wIGZvciBub24gU1REQyBjb21waWxlcnMKLS0gZGVmaW5lIE5PX0RVTU1ZX0RFQ0wgZm9yIG1vcmUgTWFjIGNvbXBpbGVycyAoLmggZmlsZXMgbWVyZ2VkIGluY29ycmVjdGx5KQotLSBkZWZpbmUgX18zMkJJVF9fIGlmIF9fMzg2X18gb3IgaTM4NiBpcyBkZWZpbmVkIChwYi4gd2l0aCBXYXRjb20gYW5kIFNDTykKLS0gYmV0dGVyIGNoZWNrIGZvciAxNi1iaXQgbW9kZSBNU0MgKGF2b2lkcyBwcm9ibGVtIHdpdGggU3ltYW50ZWMpCi0KLUNoYW5nZXMgaW4gMS4wLjIgKDIzIE1heSA5NikKLS0gYWRkZWQgV2luZG93cyBETEwgc3VwcG9ydAotLSBhZGRlZCBhIGZ1bmN0aW9uIHpsaWJWZXJzaW9uIChmb3IgdGhlIERMTCBzdXBwb3J0KQotLSBmaXhlZCBkZWNsYXJhdGlvbnMgdXNpbmcgQnl0ZWYgaW4gaW5mdXRpbC5jIChwYiB3aXRoIE1TRE9TIG1lZGl1bSBtb2RlbCkKLS0gQnl0ZWYgaXMgZGVmaW5lJ3MgaW5zdGVhZCBvZiB0eXBlZGVmJ2Qgb25seSBmb3IgQm9ybGFuZCBDCi0tIGF2b2lkIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gZXhhbXBsZS5jCi0tIG1lbnRpb24gaW4gUkVBRE1FIHRoYXQgdGhlIHpsaWIgZm9ybWF0IGlzIG5vdyBSRkMxOTUwCi0tIHVwZGF0ZWQgTWFrZWZpbGUuZGoyCi0tIGFkZGVkIGFsZ29yaXRobS5kb2MKLQotQ2hhbmdlcyBpbiAxLjAuMSAoMjAgTWF5IDk2KSBbMS4wIHNraXBwZWQgdG8gYXZvaWQgY29uZnVzaW9uXQotLSBmaXggYXJyYXkgb3ZlcmxheSBpbiBkZWZsYXRlLmMgd2hpY2ggc29tZXRpbWVzIGNhdXNlZCBiYWQgY29tcHJlc3NlZCBkYXRhCi0tIGZpeCBpbmZsYXRlIGJ1ZyB3aXRoIGVtcHR5IHN0b3JlZCBibG9jawotLSBmaXggTVNET1MgbWVkaXVtIG1vZGVsIHdoaWNoIHdhcyBicm9rZW4gaW4gMC45OQotLSBmaXggZGVmbGF0ZVBhcmFtcygpIHdoaWNoIGNvdWxkIGdlbmVyYXRlZCBiYWQgY29tcHJlc3NlZCBkYXRhLgotLSBCeXRlZiBpcyBkZWZpbmUnZCBpbnN0ZWFkIG9mIHR5cGVkZWYnZWQgKHdvcmsgYXJvdW5kIEJvcmxhbmQgYnVnKQotLSBhZGRlZCBhbiBJTkRFWCBmaWxlCi0tIG5ldyBtYWtlZmlsZXMgZm9yIERKR1BQIChNYWtlZmlsZS5kajIpLCAzMi1iaXQgQm9ybGFuZCAoTWFrZWZpbGUuYjMyKSwKLSAgV2F0Y29tIChNYWtlZmlsZS53YXQpLCBBbWlnYSBTQVMvQyAoTWFrZWZpbGUuc2FzKQotLSBzcGVlZCB1cCBhZGxlcjMyIGZvciBtb2Rlcm4gbWFjaGluZXMgd2l0aG91dCBhdXRvLWluY3JlbWVudAotLSBhZGRlZCAtYW5zaSBmb3IgSVJJWCBpbiBjb25maWd1cmUKLS0gc3RhdGljX2luaXRfZG9uZSBpbiB0cmVlcy5jIGlzIGFuIGludAotLSBkZWZpbmUgdW5saW5rIGFzIGRlbGV0ZSBmb3IgVk1TCi0tIGZpeCBjb25maWd1cmUgZm9yIFFOWAotLSBhZGQgY29uZmlndXJlIGJyYW5jaCBmb3IgU0NPIGFuZCBIUFVYCi0tIGF2b2lkIG1hbnkgd2FybmluZ3MgKHVudXNlZCB2YXJpYWJsZXMsIGRlYWQgYXNzaWdubWVudHMsIGV0Yy4uLikKLS0gbm8gZmRvcGVuIGZvciBCZU9TCi0tIGZpeCB0aGUgV2F0Y29tIGZpeCBmb3IgMzIgYml0IG1vZGUgKGRlZmluZSBGQVIgYXMgZW1wdHkpCi0tIHJlbW92ZWQgcmVkZWZpbml0aW9uIG9mIEJ5dGUgZm9yIE1LV0VSS1MKLS0gd29yayBhcm91bmQgYW4gTVdLRVJLUyBidWcgKGluY29ycmVjdCBtZXJnZSBvZiBhbGwgLmggZmlsZXMpCi0KLUNoYW5nZXMgaW4gMC45OSAoMjcgSmFuIDk2KQotLSBhbGxvdyBwcmVzZXQgZGljdGlvbmFyeSBzaGFyZWQgYmV0d2VlbiBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IKLS0gYWxsb3cgY29tcHJlc3Npb24gbGV2ZWwgMCAobm8gY29tcHJlc3Npb24pCi0tIGFkZCBkZWZsYXRlUGFyYW1zIGluIHpsaWIuaDogYWxsb3cgZHluYW1pYyBjaGFuZ2Ugb2YgY29tcHJlc3Npb24gbGV2ZWwKLSAgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LgotLSB0ZXN0IGxhcmdlIGJ1ZmZlcnMgYW5kIGRlZmxhdGVQYXJhbXMgaW4gZXhhbXBsZS5jCi0tIGFkZCBvcHRpb25hbCAiY29uZmlndXJlIiB0byBidWlsZCB6bGliIGFzIGEgc2hhcmVkIGxpYnJhcnkKLS0gc3VwcHJlc3MgTWFrZWZpbGUucW54LCB1c2UgY29uZmlndXJlIGluc3RlYWQKLS0gZml4ZWQgZGVmbGF0ZSBmb3IgNjQtYml0IHN5c3RlbXMgKGRldGVjdGVkIG9uIENyYXkpCi0tIGZpeGVkIGluZmxhdGVfYmxvY2tzIGZvciA2NC1iaXQgc3lzdGVtcyAoZGV0ZWN0ZWQgb24gQWxwaGEpCi0tIGRlY2xhcmUgWl9ERUZMQVRFRCBpbiB6bGliLmggKHBvc3NpYmxlIHBhcmFtZXRlciBmb3IgZGVmbGF0ZUluaXQyKQotLSBhbHdheXMgcmV0dXJuIFpfQlVGX0VSUk9SIHdoZW4gZGVmbGF0ZSgpIGhhcyBub3RoaW5nIHRvIGRvCi0tIGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBhcmUgbm93IG1hY3JvcyB0byBhbGxvdyB2ZXJzaW9uIGNoZWNraW5nCi0tIHByZWZpeCBhbGwgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQgdHlwZXMgd2l0aCB6XyB3aXRoIC1EWl9QUkVGSVgKLS0gbWFrZSBmYWxsb2MgY29tcGxldGVseSByZWVudHJhbnQgKGluZnRyZWVzLmMpCi0tIGZpeGVkIHZlcnkgdW5saWtlbHkgcmFjZSBjb25kaXRpb24gaW4gY3Rfc3RhdGljX2luaXQKLS0gZnJlZSBpbiByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb24gdG8gaGVscCBtZW1vcnkgbWFuYWdlcgotLSB1c2UgemxpYi0xLjAvKiBpbnN0ZWFkIG9mIHpsaWIvKiBpbnNpZGUgdGhlIHRhci5negotLSBtYWtlIHpsaWIgd2FybmluZy1mcmVlIHdpdGggImdjYyAtTzMgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aAotICAtV2NvbnZlcnNpb24gLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyIKLS0gYWxsb3cgZ3pyZWFkIG9uIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMKLS0gZGVmbGF0ZUVuZCBub3cgcmV0dXJucyBaX0RBVEFfRVJST1IgaWYgaXQgd2FzIHByZW1hdHVyZQotLSBkZWZsYXRlIGlzIGZpbmFsbHkgKD8pIGZ1bGx5IGRldGVybWluaXN0aWMgKG5vIG1hdGNoZXMgYmV5b25kIGVuZCBvZiBpbnB1dCkKLS0gRG9jdW1lbnQgWl9TWU5DX0ZMVVNICi0tIGFkZCB1bmluc3RhbGwgaW4gTWFrZWZpbGUKLS0gQ2hlY2sgZm9yIF9fY3BsdXBsdXMgaW4gemxpYi5oCi0tIEJldHRlciB0ZXN0IGluIGN0X2FsaWduIGZvciBwYXJ0aWFsIGZsdXNoCi0tIGF2b2lkIGhhcm1sZXNzIHdhcm5pbmdzIGZvciBCb3JsYW5kIEMrKwotLSBpbml0aWFsaXplIGhhc2hfaGVhZCBpbiBkZWZsYXRlLmMKLS0gYXZvaWQgd2FybmluZyBvbiBmZG9wZW4gKGd6aW8uYykgZm9yIEhQIGNjIC1BYQotLSBpbmNsdWRlIHN0ZGxpYi5oIGZvciBTVERDIGNvbXBpbGVycwotLSBpbmNsdWRlIGVycm5vLmggZm9yIENyYXkKLS0gaWdub3JlIGVycm9yIGlmIHJhbmxpYiBkb2Vzbid0IGV4aXN0Ci0tIGNhbGwgcmFubGliIHR3aWNlIGZvciBOZVhUU1RFUAotLSB1c2UgZXhlY19wcmVmaXggaW5zdGVhZCBvZiBwcmVmaXggZm9yIGxpYnouYQotLSByZW5hbWVkIGN0XyogYXMgX3RyXyogdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBhcHBsaWNhdGlvbnMKLS0gY2xlYXIgei0+bXNnIGluIGluZmxhdGVJbml0MiBiZWZvcmUgYW55IGVycm9yIHJldHVybgotLSBpbml0aWFsaXplIG9wYXF1ZSBpbiBleGFtcGxlLmMsIGd6aW8uYywgZGVmbGF0ZS5jIGFuZCBpbmZsYXRlLmMKLS0gZml4ZWQgdHlwbyBpbiB6Y29uZi5oIChfR05VQ19fID0+IF9fR05VQ19fKQotLSBjaGVjayBmb3IgV0lOMzIgaW4gemNvbmYuaCBhbmQgenV0aWwuYyAoYXZvaWQgZmFybWFsbG9jIGluIDMyLWJpdCBtb2RlKQotLSBmaXggdHlwbyBpbiBNYWtlX3Ztcy5jb20gKGYkdHJubG5tIC0+IGYkZ2V0c3lpKQotLSBpbiBmY2FsbG9jLCBub3JtYWxpemUgcG9pbnRlciBpZiBzaXplID4gNjU1MjAgYnl0ZXMKLS0gZG9uJ3QgdXNlIHNwZWNpYWwgZmNhbGxvYyBmb3IgMzIgYml0IEJvcmxhbmQgQysrCi0tIHVzZSBTVERDIGluc3RlYWQgb2YgX19HTzMyX18gdG8gYXZvaWQgcmVkZWNsYXJpbmcgZXhpdCwgY2FsbG9jLCBldGMuLi4KLS0gdXNlIFpfQklOQVJZIGluc3RlYWQgb2YgQklOQVJZCi0tIGRvY3VtZW50IHRoYXQgZ3pjbG9zZSBhZnRlciBnemRvcGVuIHdpbGwgY2xvc2UgdGhlIGZpbGUKLS0gYWxsb3cgImEiIGFzIG1vZGUgaW4gZ3pvcGVuLgotLSBmaXggZXJyb3IgY2hlY2tpbmcgaW4gZ3pyZWFkCi0tIGFsbG93IHNraXBwaW5nIC5neiBleHRyYS1maWVsZCBvbiBwaXBlcwotLSBhZGRlZCByZWZlcmVuY2UgdG8gUGVybCBpbnRlcmZhY2UgaW4gUkVBRE1FCi0tIHB1dCB0aGUgY3JjIHRhYmxlIGluIEZBUiBkYXRhIChJIGRpc2xpa2UgbW9yZSBhbmQgbW9yZSB0aGUgbWVkaXVtIG1vZGVsIDopCi0tIGFkZGVkIGdldF9jcmNfdGFibGUKLS0gYWRkZWQgYSBkaW1lbnNpb24gdG8gYWxsIGFycmF5cyAoQm9ybGFuZCBDIGNhbid0IGNvdW50KS4KLS0gd29ya2Fyb3VuZCBCb3JsYW5kIEMgYnVnIGluIGRlY2xhcmF0aW9uIG9mIGluZmxhdGVfY29kZXNfbmV3ICYgaW5mbGF0ZV9mYXN0Ci0tIGd1YXJkIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uIG9mICouaCAoZm9yIHByZWNvbXBpbGVkIGhlYWRlciBvbiBNYWMpCi0tIFdhdGNvbSBDIHByZXRlbmRzIHRvIGJlIE1pY3Jvc29mdCBDIHNtYWxsIG1vZGVsIGV2ZW4gaW4gMzIgYml0IG1vZGUuCi0tIGRvbid0IHVzZSB1bnNpemVkIGFycmF5cyB0byBhdm9pZCBzaWxseSB3YXJuaW5ncyBieSBWaXN1YWwgQysrOgotICAgICB3YXJuaW5nIEM0NzQ2OiAnaW5mbGF0ZV9tYXNrJyA6IHVuc2l6ZWQgYXJyYXkgdHJlYXRlZCBhcyAgJ19fZmFyJwotICAgICAod2hhdCdzIHdyb25nIHdpdGggZmFyIGRhdGEgaW4gZmFyIG1vZGVsPykuCi0tIGRlZmluZSBlbnVtIG91dCBvZiBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRoIEMrKwotCi1DaGFuZ2VzIGluIDAuOTUgKDE2IEF1ZyA5NSkKLS0gZml4IE1TRE9TIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgKG5vdyBlYXNpZXIgdG8gYWRhcHQgdG8gYW55IGNvbXBpbGVyKQotLSBpbmxpbmVkIHNlbmRfYml0cwotLSBmaXggdGhlIGZpbmFsICg6LSkgYnVnIGZvciBkZWZsYXRlIHdpdGggZmx1c2ggKG91dHB1dCB3YXMgY29ycmVjdCBidXQKLSAgbm90IGNvbXBsZXRlbHkgZmx1c2hlZCBpbiByYXJlIG9jY2FzaW9ucykuCi0tIGRlZmF1bHQgd2luZG93IHNpemUgaXMgc2FtZSBmb3IgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLSAgKGl0J3Mgbm93IHN1ZmZpY2llbnQgdG8gc2V0IE1BWF9XQklUUyBpbiB6Y29uZi5oKS4KLS0gdm9pZHAgLT4gdm9pZHBmIGFuZCB2b2lkbnAgLT4gdm9pZHAgKGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyCi0gIHR5cGVkZWZzIGFuZCBiZWNhdXNlIHZvaWRucCB3YXMgbm90IG5lYXIgaW4gbGFyZ2UgbW9kZWwpLgotCi1DaGFuZ2VzIGluIDAuOTQgKDEzIEF1ZyA5NSkKLS0gc3VwcG9ydCBNU0RPUyBtZWRpdW0gbW9kZWwKLS0gZml4IGRlZmxhdGUgd2l0aCBmbHVzaCAoY291bGQgc29tZXRpbWVzIGdlbmVyYXRlIGJhZCBvdXRwdXQpCi0tIGZpeCBkZWZsYXRlUmVzZXQgKHpsaWIgaGVhZGVyIHdhcyBpbmNvcnJlY3RseSBzdXBwcmVzc2VkKQotLSBhZGRlZCBzdXBwb3J0IGZvciBWTVMKLS0gYWxsb3cgYSBjb21wcmVzc2lvbiBsZXZlbCBpbiBnem9wZW4oKQotLSBnemZsdXNoIG5vdyBjYWxscyBmZmx1c2gKLS0gRm9yIGRlZmxhdGUgd2l0aCBmbHVzaCwgZmx1c2ggZXZlbiBpZiBubyBtb3JlIGlucHV0IGlzIHByb3ZpZGVkLgotLSByZW5hbWUgbGliZ3ouYSBhcyBsaWJ6LmEKLS0gYXZvaWQgY29tcGxleCBleHByZXNzaW9uIGluIGluZmNvZGVzLmMgdHJpZ2dlcmluZyBUdXJibyBDIGJ1ZwotLSB3b3JrIGFyb3VuZCBhIHByb2JsZW0gd2l0aCBnY2Mgb24gQWxwaGEgKGluIElOU0VSVF9TVFJJTkcpCi0tIGRvbid0IHVzZSBpbmxpbmUgZnVuY3Rpb25zIChwcm9ibGVtIHdpdGggc29tZSBnY2MgdmVyc2lvbnMpCi0tIGFsbG93IHJlbmFtaW5nIG9mIEJ5dGUsIHVJbnQsIGV0Yy4uLiB3aXRoICNkZWZpbmUuCi0tIGF2b2lkIHdhcm5pbmcgYWJvdXQgKHVudXNlZCkgcG9pbnRlciBiZWZvcmUgc3RhcnQgb2YgYXJyYXkgaW4gZGVmbGF0ZS5jCi0tIGF2b2lkIHZhcmlvdXMgd2FybmluZ3MgaW4gZ3ppby5jLCBleGFtcGxlLmMsIGluZmJsb2NrLmMsIGFkbGVyMzIuYywgenV0aWwuYwotLSBhdm9pZCByZXNlcnZlZCB3b3JkICduZXcnIGluIHRyZWVzLmMKLQotQ2hhbmdlcyBpbiAwLjkzICgyNSBKdW5lIDk1KQotLSB0ZW1wb3JhcmlseSBkaXNhYmxlIGlubGluZSBmdW5jdGlvbnMKLS0gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMKLS0gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBQQVJUSUFMX0ZMVVNICi0tIFNldCBiaW5hcnkgbW9kZSBmb3Igc3RkaW4vc3Rkb3V0IGluIG1pbmlnemlwLmMgZm9yIE9TLzIKLS0gZG9uJ3QgZXZlbiB1c2Ugc2lnbmVkIGNoYXIgaW4gaW5mbGF0ZSAobm90IHBvcnRhYmxlIGVub3VnaCkKLS0gZml4IGluZmxhdGUgbWVtb3J5IGxlYWsgZm9yIHNlZ21lbnRlZCBhcmNoaXRlY3R1cmVzCi0KLUNoYW5nZXMgaW4gMC45MiAoMyBNYXkgOTUpCi0tIGRvbid0IGFzc3VtZSB0aGF0IGNoYXIgaXMgc2lnbmVkIChwcm9ibGVtIG9uIFNHSSkKLS0gQ2xlYXIgYml0IGJ1ZmZlciB3aGVuIHN0YXJ0aW5nIGEgc3RvcmVkIGJsb2NrCi0tIG5vIG1lbWNweSBvbiBQeXJhbWlkCi0tIHN1cHByZXNzZWQgaW5mdGVzdC5jCi0tIG9wdGltaXplZCBmaWxsX3dpbmRvdywgcHV0IGxvbmdlc3RfbWF0Y2ggaW5saW5lIGZvciBnY2MKLS0gb3B0aW1pemVkIGluZmxhdGUgb24gc3RvcmVkIGJsb2Nrcy4KLS0gdW50YWJpZnkgYWxsIHNvdXJjZXMgdG8gc2ltcGxpZnkgcGF0Y2hlcwotCi1DaGFuZ2VzIGluIDAuOTEgKDIgTWF5IDk1KQotLSBEZWZhdWx0IE1FTV9MRVZFTCBpcyA4IChub3QgOSBmb3IgVW5peCkgYXMgZG9jdW1lbnRlZCBpbiB6bGliLmgKLS0gRG9jdW1lbnQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgaW4gemNvbmYuaAotLSBhZGRlZCAibWFrZSBpbnN0YWxsIgotLSBmaXggc3luYyBzZWFyY2ggbG9naWMgaW4gaW5mbGF0ZVN5bmMKLS0gZGVmbGF0ZShaX0ZVTExfRkxVU0gpIG5vdyB3b3JrcyBldmVuIGlmIG91dHB1dCBidWZmZXIgdG9vIHNob3J0Ci0tIGFmdGVyIGluZmxhdGVTeW5jLCBkb24ndCBzY2FyZSBwZW9wbGUgd2l0aCBqdXN0ICJsbyB3b3JsZCIKLS0gYWRkZWQgc3VwcG9ydCBmb3IgREpHUFAKLQotQ2hhbmdlcyBpbiAwLjkgKDEgTWF5IDk1KQotLSBkb24ndCBhc3N1bWUgdGhhdCB6YWxsb2MgY2xlYXJzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICh0aGUgVHVyYm9DIGJ1ZwotICB3YXMgTWFyaydzIGJ1ZyBhZnRlciBhbGwgOikKLS0gbGV0IGFnYWluIGd6cmVhZCBjb3B5IHVuY29tcHJlc3NlZCBkYXRhIHVuY2hhbmdlZCAod2FzIHdvcmtpbmcgaW4gMC43MSkKLS0gZGVmbGF0ZShaX0ZVTExfRkxVU0gpLCBpbmZsYXRlUmVzZXQgYW5kIGluZmxhdGVTeW5jIGFyZSBub3cgZnVsbHkgaW1wbGVtZW50ZWQKLS0gYWRkZWQgYSB0ZXN0IG9mIGluZmxhdGVTeW5jIGluIGV4YW1wbGUuYwotLSBtb3ZlZCBNQVhfV0JJVFMgdG8gemNvbmYuaCBiZWNhdXNlIHVzZXJzIG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoYXQuCi0tIGRvY3VtZW50IGV4cGxpY2l0bHkgdGhhdCB6YWxsb2MoNjRLKSBvbiBNU0RPUyBtdXN0IHJldHVybiBhIG5vcm1hbGl6ZWQKLSAgcG9pbnRlciAoemVybyBvZmZzZXQpCi0tIGFkZGVkIE1ha2VmaWxlcyBmb3IgTWljcm9zb2Z0IEMsIFR1cmJvIEMsIEJvcmxhbmQgQysrCi0tIGZhc3RlciBjcmMzMigpCi0KLUNoYW5nZXMgaW4gMC44ICgyOSBBcHJpbCA5NSkKLS0gYWRkZWQgZmFzdCBpbmZsYXRlIChpbmZmYXN0LmMpCi0tIGRlZmxhdGUoWl9GSU5JU0gpIG5vdyByZXR1cm5zIFpfU1RSRUFNX0VORCB3aGVuIGRvbmUuIFdhcm5pbmc6IHRoaXMKLSAgaXMgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgemxpYiB3aGljaCByZXR1cm5lZCBaX09LLgotLSB3b3JrIGFyb3VuZCBhIFR1cmJvQyBjb21waWxlciBidWcgKGJhZCBjb2RlIGZvciBiIDw8IDAsIHNlZSBpbmZ1dGlsLmgpCi0gIChhY3R1YWxseSB0aGF0IHdhcyBub3QgYSBjb21waWxlciBidWcsIHNlZSAwLjgxIGFib3ZlKQotLSBnenJlYWQgbm8gbG9uZ2VyIHJlYWRzIG9uZSBleHRyYSBieXRlIGluIGNlcnRhaW4gY2FzZXMKLS0gSW4gZ3ppbyBkZXN0cm95KCksIGRvbid0IHJlZmVyZW5jZSBhIGZyZWVkIHN0cnVjdHVyZQotLSBhdm9pZCBtYW55IHdhcm5pbmdzIGZvciBNU0RPUwotLSBhdm9pZCB0aGUgRVJST1Igc3ltYm9sIHdoaWNoIGlzIHVzZWQgYnkgTVMgV2luZG93cwotCi1DaGFuZ2VzIGluIDAuNzEgKDE0IEFwcmlsIDk1KQotLSBGaXhlZCBtb3JlIE1TRE9TIGNvbXBpbGF0aW9uIHByb2JsZW1zIDooIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHdpdGgKLSAgVHVyYm9DIGxhcmdlIG1vZGVsLgotCi1DaGFuZ2VzIGluIDAuNyAoMTQgQXByaWwgOTUpCi0tIEFkZGVkIGZ1bGwgaW5mbGF0ZSBzdXBwb3J0LgotLSBTaW1wbGlmaWVkIHRoZSBjcmMzMigpIGludGVyZmFjZS4gVGhlIHByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nCi0gIChvbmUncyBjb21wbGVtZW50KSBpcyBub3cgZG9uZSBpbnNpZGUgY3JjMzIoKS4gV0FSTklORzogdGhpcyBpcwotICBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9uczsgc2VlIHpsaWIuaCBmb3IgdGhlIG5ldyB1c2FnZS4KLQotQ2hhbmdlcyBpbiAwLjYxICgxMiBBcHJpbCA5NSkKLS0gd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gVHVyYm9DLiBleGFtcGxlIGFuZCBtaW5pZ3ppcCBub3cgd29yayBvbiBNU0RPUy4KLQotQ2hhbmdlcyBpbiAwLjYgKDExIEFwcmlsIDk1KQotLSBhZGRlZCBtaW5pZ3ppcC5jCi0tIGFkZGVkIGd6ZG9wZW4gdG8gcmVvcGVuIGEgZmlsZSBkZXNjcmlwdG9yIGFzIGd6RmlsZQotLSBhZGRlZCB0cmFuc3BhcmVudCByZWFkaW5nIG9mIG5vbi1nemlwZWQgZmlsZXMgaW4gZ3pyZWFkLgotLSBmaXhlZCBidWcgaW4gZ3pyZWFkIChkb24ndCByZWFkIGNyYyBhcyBkYXRhKQotLSBmaXhlZCBidWcgaW4gZGVzdHJveSAoZ3ppby5jKSAoZG9uJ3QgcmV0dXJuIFpfU1RSRUFNX0VORCBmb3IgZ3pjbG9zZSkuCi0tIGRvbid0IGFsbG9jYXRlIGJpZyBhcnJheXMgaW4gdGhlIHN0YWNrIChmb3IgTVNET1MpCi0tIGZpeCBzb21lIE1TRE9TIGNvbXBpbGF0aW9uIHByb2JsZW1zCi0KLUNoYW5nZXMgaW4gMC41OgotLSBkbyByZWFsIGNvbXByZXNzaW9uIGluIGRlZmxhdGUuYy4gWl9QQVJUSUFMX0ZMVVNIIGlzIHN1cHBvcnRlZCBidXQKLSAgbm90IHlldCBaX0ZVTExfRkxVU0guCi0tIHN1cHBvcnQgZGVjb21wcmVzc2lvbiBidXQgb25seSBpbiBhIHNpbmdsZSBzdGVwIChmb3JjZWQgWl9GSU5JU0gpCi0tIGFkZGVkIG9wYXF1ZSBvYmplY3QgZm9yIHphbGxvYyBhbmQgemZyZWUuCi0tIGFkZGVkIGRlZmxhdGVSZXNldCBhbmQgaW5mbGF0ZVJlc2V0Ci0tIGFkZGVkIGEgdmFyaWFibGUgemxpYl92ZXJzaW9uIGZvciBjb25zaXN0ZW5jeSBjaGVja2luZy4KLS0gcmVuYW1lZCB0aGUgJ2ZpbHRlcicgcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0MiBhcyAnc3RyYXRlZ3knLgotICBBZGRlZCBaX0ZJTFRFUkVEIGFuZCBaX0hVRkZNQU5fT05MWSBjb25zdGFudHMuCi0KLUNoYW5nZXMgaW4gMC40OgotLSBhdm9pZCAiemlwIiBldmVyeXdoZXJlLCB1c2UgemxpYiBpbnN0ZWFkIG9mIHppcGxpYi4KLS0gc3VwcHJlc3MgWl9CTE9DS19GTFVTSCwgaW50ZXJwcmV0IFpfUEFSVElBTF9GTFVTSCBhcyBibG9jayBmbHVzaAotICBpZiBjb21wcmVzc2lvbiBtZXRob2QgPT0gOC4KLS0gYWRkZWQgYWRsZXIzMiBhbmQgY3JjMzIKLS0gcmVuYW1lZCBkZWZsYXRlT3B0aW9ucyBhcyBkZWZsYXRlSW5pdDIsIGNhbGwgb25lIG9yIHRoZSBvdGhlciBidXQgbm90IGJvdGgKLS0gYWRkZWQgdGhlIG1ldGhvZCBwYXJhbWV0ZXIgZm9yIGRlZmxhdGVJbml0Mi4KLS0gYWRkZWQgaW5mbGF0ZUluaXQyCi0tIHNpbXBsaWVkIGNvbnNpZGVyYWJseSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYnkgbm90IHN1cHBvcnRpbmcKLSAgdXNlci1wcm92aWRlZCBoaXN0b3J5IGJ1ZmZlci4gVGhpcyBpcyBzdXBwb3J0ZWQgb25seSBpbiBkZWZsYXRlSW5pdDIKLSAgYW5kIGluZmxhdGVJbml0Mi4KLQotQ2hhbmdlcyBpbiAwLjM6Ci0tIHByZWZpeCBhbGwgbWFjcm8gbmFtZXMgd2l0aCBaXwotLSB1c2UgWl9GSU5JU0ggaW5zdGVhZCBvZiBkZWZsYXRlRW5kIHRvIGZpbmlzaCBjb21wcmVzc2lvbi4KLS0gYWRkZWQgWl9IVUZGTUFOX09OTFkKLS0gYWRkZWQgZ3plcnJvcigpCmRpZmYgLS1naXQgYS9saWJzL3psaWIvRkFRIGIvbGlicy96bGliL0ZBUQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxZDkxMC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvRkFRCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLQotICAgICAgICAgICAgICAgIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IHpsaWIKLQotCi1JZiB5b3VyIHF1ZXN0aW9uIGlzIG5vdCB0aGVyZSwgcGxlYXNlIGNoZWNrIHRoZSB6bGliIGhvbWUgcGFnZQotaHR0cDovL3d3dy56bGliLm9yZyB3aGljaCBtYXkgaGF2ZSBtb3JlIHJlY2VudCBpbmZvcm1hdGlvbi4KLVRoZSBsYXN0ZXN0IHpsaWIgRkFRIGlzIGF0IGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sCi0KLQotIDEuIElzIHpsaWIgWTJLLWNvbXBsaWFudD8KLQotICAgIFllcy4gemxpYiBkb2Vzbid0IGhhbmRsZSBkYXRlcy4KLQotIDIuIFdoZXJlIGNhbiBJIGdldCBhIFdpbmRvd3MgRExMIHZlcnNpb24/Ci0KLSAgICBUaGUgemxpYiBzb3VyY2VzIGNhbiBiZSBjb21waWxlZCB3aXRob3V0IGNoYW5nZSB0byBwcm9kdWNlIGEgRExMLgotICAgIFNlZSB0aGUgZmlsZSB3aW4zMi9ETExfRkFRLnR4dCBpbiB0aGUgemxpYiBkaXN0cmlidXRpb24uCi0gICAgUG9pbnRlcnMgdG8gdGhlIHByZWNvbXBpbGVkIERMTCBhcmUgZm91bmQgaW4gdGhlIHpsaWIgd2ViIHNpdGUgYXQKLSAgICBodHRwOi8vd3d3LnpsaWIub3JnLgotCi0gMy4gV2hlcmUgY2FuIEkgZ2V0IGEgVmlzdWFsIEJhc2ljIGludGVyZmFjZSB0byB6bGliPwotCi0gICAgU2VlCi0gICAgICAgICogaHR0cDovL3d3dy5kb2dtYS5uZXQvbWFya24vYXJ0aWNsZXMvemxpYnRvb2wvemxpYnRvb2wuaHRtCi0gICAgICAgICogY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGluIHRoZSB6bGliIGRpc3RyaWJ1dGlvbgotICAgICAgICAqIHdpbjMyL0RMTF9GQVEudHh0IGluIHRoZSB6bGliIGRpc3RyaWJ1dGlvbgotCi0gNC4gY29tcHJlc3MoKSByZXR1cm5zIFpfQlVGX0VSUk9SLgotCi0gICAgTWFrZSBzdXJlIHRoYXQgYmVmb3JlIHRoZSBjYWxsIG9mIGNvbXByZXNzLCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkCi0gICAgYnVmZmVyIGlzIGVxdWFsIHRvIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlciBhbmQgbm90Ci0gICAgemVyby4gRm9yIFZpc3VhbCBCYXNpYywgY2hlY2sgdGhhdCB0aGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlCi0gICAgKCJhcyBhbnkiKSwgbm90IGJ5IHZhbHVlICgiYXMgbG9uZyIpLgotCi0gNS4gZGVmbGF0ZSgpIG9yIGluZmxhdGUoKSByZXR1cm5zIFpfQlVGX0VSUk9SLgotCi0gICAgQmVmb3JlIG1ha2luZyB0aGUgY2FsbCwgbWFrZSBzdXJlIHRoYXQgYXZhaWxfaW4gYW5kIGF2YWlsX291dCBhcmUgbm90Ci0gICAgemVyby4gV2hlbiBzZXR0aW5nIHRoZSBwYXJhbWV0ZXIgZmx1c2ggZXF1YWwgdG8gWl9GSU5JU0gsIGFsc28gbWFrZSBzdXJlCi0gICAgdGhhdCBhdmFpbF9vdXQgaXMgYmlnIGVub3VnaCB0byBhbGxvdyBwcm9jZXNzaW5nIGFsbCBwZW5kaW5nIGlucHV0LgotICAgIE5vdGUgdGhhdCBhIFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbC0tYW5vdGhlciBjYWxsIHRvIGRlZmxhdGUoKSBvcgotICAgIGluZmxhdGUoKSBjYW4gYmUgbWFkZSB3aXRoIG1vcmUgaW5wdXQgb3Igb3V0cHV0IHNwYWNlLiBBIFpfQlVGX0VSUk9SCi0gICAgbWF5IGluIGZhY3QgYmUgdW5hdm9pZGFibGUgZGVwZW5kaW5nIG9uIGhvdyB0aGUgZnVuY3Rpb25zIGFyZSB1c2VkLCBzaW5jZQotICAgIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB0ZWxsIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIG1vcmUgb3V0cHV0IHBlbmRpbmcKLSAgICB3aGVuIHN0cm0uYXZhaWxfb3V0IHJldHVybnMgd2l0aCB6ZXJvLgotCi0gNi4gV2hlcmUncyB0aGUgemxpYiBkb2N1bWVudGF0aW9uIChtYW4gcGFnZXMsIGV0Yy4pPwotCi0gICAgSXQncyBpbiB6bGliLmggZm9yIHRoZSBtb21lbnQsIGFuZCBGcmFuY2lzIFMuIExpbiBoYXMgY29udmVydGVkIGl0IHRvIGEKLSAgICB3ZWIgcGFnZSB6bGliLmh0bWwuIFZvbHVudGVlcnMgdG8gdHJhbnNmb3JtIHRoaXMgdG8gVW5peC1zdHlsZSBtYW4gcGFnZXMsCi0gICAgcGxlYXNlIGNvbnRhY3QgdXMgKHpsaWJAZ3ppcC5vcmcpLiBFeGFtcGxlcyBvZiB6bGliIHVzYWdlIGFyZSBpbiB0aGUgZmlsZXMKLSAgICBleGFtcGxlLmMgYW5kIG1pbmlnemlwLmMuCi0KLSA3LiBXaHkgZG9uJ3QgeW91IHVzZSBHTlUgYXV0b2NvbmYgb3IgbGlidG9vbCBvciAuLi4/Ci0KLSAgICBCZWNhdXNlIHdlIHdvdWxkIGxpa2UgdG8ga2VlcCB6bGliIGFzIGEgdmVyeSBzbWFsbCBhbmQgc2ltcGxlCi0gICAgcGFja2FnZS4gemxpYiBpcyByYXRoZXIgcG9ydGFibGUgYW5kIGRvZXNuJ3QgbmVlZCBtdWNoIGNvbmZpZ3VyYXRpb24uCi0KLSA4LiBJIGZvdW5kIGEgYnVnIGluIHpsaWIuCi0KLSAgICBNb3N0IG9mIHRoZSB0aW1lLCBzdWNoIHByb2JsZW1zIGFyZSBkdWUgdG8gYW4gaW5jb3JyZWN0IHVzYWdlIG9mCi0gICAgemxpYi4gUGxlYXNlIHRyeSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gd2l0aCBhIHNtYWxsIHByb2dyYW0gYW5kIHNlbmQKLSAgICB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgdG8gdXMgYXQgemxpYkBnemlwLm9yZyAuIERvIG5vdCBzZW5kCi0gICAgbXVsdGktbWVnYWJ5dGUgZGF0YSBmaWxlcyB3aXRob3V0IHByaW9yIGFncmVlbWVudC4KLQotIDkuIFdoeSBkbyBJIGdldCAidW5kZWZpbmVkIHJlZmVyZW5jZSB0byBnenB1dGMiPwotCi0gICAgSWYgIm1ha2UgdGVzdCIgcHJvZHVjZXMgc29tZXRoaW5nIGxpa2UKLQotICAgICAgIGV4YW1wbGUubygudGV4dCsweDE1NCk6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYGd6cHV0YycKLQotICAgIGNoZWNrIHRoYXQgeW91IGRvbid0IGhhdmUgb2xkIGZpbGVzIGxpYnouKiBpbiAvdXNyL2xpYiwgL3Vzci9sb2NhbC9saWIgb3IKLSAgICAvdXNyL1gxMVI2L2xpYi4gUmVtb3ZlIGFueSBvbGQgdmVyc2lvbnMsIHRoZW4gZG8gIm1ha2UgaW5zdGFsbCIuCi0KLTEwLiBJIG5lZWQgYSBEZWxwaGkgaW50ZXJmYWNlIHRvIHpsaWIuCi0KLSAgICBTZWUgdGhlIGNvbnRyaWIvZGVscGhpIGRpcmVjdG9yeSBpbiB0aGUgemxpYiBkaXN0cmlidXRpb24uCi0KLTExLiBDYW4gemxpYiBoYW5kbGUgLnppcCBhcmNoaXZlcz8KLQotICAgIE5vdCBieSBpdHNlbGYsIG5vLiAgU2VlIHRoZSBkaXJlY3RvcnkgY29udHJpYi9taW5pemlwIGluIHRoZSB6bGliCi0gICAgZGlzdHJpYnV0aW9uLgotCi0xMi4gQ2FuIHpsaWIgaGFuZGxlIC5aIGZpbGVzPwotCi0gICAgTm8sIHNvcnJ5LiBZb3UgaGF2ZSB0byBzcGF3biBhbiB1bmNvbXByZXNzIG9yIGd1bnppcCBzdWJwcm9jZXNzLCBvciBhZGFwdAotICAgIHRoZSBjb2RlIG9mIHVuY29tcHJlc3Mgb24geW91ciBvd24uCi0KLTEzLiBIb3cgY2FuIEkgbWFrZSBhIFVuaXggc2hhcmVkIGxpYnJhcnk/Ci0KLSAgICBtYWtlIGNsZWFuCi0gICAgLi9jb25maWd1cmUgLXMKLSAgICBtYWtlCi0KLTE0LiBIb3cgZG8gSSBpbnN0YWxsIGEgc2hhcmVkIHpsaWIgbGlicmFyeSBvbiBVbml4PwotCi0gICAgQWZ0ZXIgdGhlIGFib3ZlLCB0aGVuOgotCi0gICAgbWFrZSBpbnN0YWxsCi0KLSAgICBIb3dldmVyLCBtYW55IGZsYXZvcnMgb2YgVW5peCBjb21lIHdpdGggYSBzaGFyZWQgemxpYiBhbHJlYWR5IGluc3RhbGxlZC4KLSAgICBCZWZvcmUgZ29pbmcgdG8gdGhlIHRyb3VibGUgb2YgY29tcGlsaW5nIGEgc2hhcmVkIHZlcnNpb24gb2YgemxpYiBhbmQKLSAgICB0cnlpbmcgdG8gaW5zdGFsbCBpdCwgeW91IG1heSB3YW50IHRvIGNoZWNrIGlmIGl0J3MgYWxyZWFkeSB0aGVyZSEgSWYgeW91Ci0gICAgY2FuICNpbmNsdWRlIDx6bGliLmg+LCBpdCdzIHRoZXJlLiBUaGUgLWx6IG9wdGlvbiB3aWxsIHByb2JhYmx5IGxpbmsgdG8gaXQuCi0KLTE1LiBJIGhhdmUgYSBxdWVzdGlvbiBhYm91dCBPdHRvUERGLgotCi0gICAgV2UgYXJlIG5vdCB0aGUgYXV0aG9ycyBvZiBPdHRvUERGLiBUaGUgcmVhbCBhdXRob3IgaXMgb24gdGhlIE90dG9QREYgd2ViCi0gICAgc2l0ZTogSm9lbCBIYWlubGV5LCBqaGFpbmxleUBteW5ka3J5bWUuY29tLgotCi0xNi4gQ2FuIHpsaWIgZGVjb2RlIEZsYXRlIGRhdGEgaW4gYW4gQWRvYmUgUERGIGZpbGU/Ci0KLSAgICBZZXMuIFNlZSBodHRwOi8vd3d3LmZhc3Rpby5jb20vIChDbGliUERGKSwgb3IgaHR0cDovL3d3dy5wZGZsaWIuY29tLyAuCi0gICAgVG8gbW9kaWZ5IFBERiBmb3Jtcywgc2VlIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYWNyb2Zvcm10b29sLyAuCi0KLTE3LiBXaHkgYW0gSSBnZXR0aW5nIHRoaXMgInJlZ2lzdGVyX2ZyYW1lX2luZm8gbm90IGZvdW5kIiBlcnJvciBvbiBTb2xhcmlzPwotCi0gICAgQWZ0ZXIgaW5zdGFsbGluZyB6bGliIDEuMS40IG9uIFNvbGFyaXMgMi42LCBydW5uaW5nIGFwcGxpY2F0aW9ucyB1c2luZyB6bGliCi0gICAgZ2VuZXJhdGVzIGFuIGVycm9yIHN1Y2ggYXM6Ci0KLSAgICAgICAgbGQuc28uMTogcnBtOiBmYXRhbDogcmVsb2NhdGlvbiBlcnJvcjogZmlsZSAvdXNyL2xvY2FsL2xpYi9saWJ6LnNvOgotICAgICAgICBzeW1ib2wgX19yZWdpc3Rlcl9mcmFtZV9pbmZvOiByZWZlcmVuY2VkIHN5bWJvbCBub3QgZm91bmQKLQotICAgIFRoZSBzeW1ib2wgX19yZWdpc3Rlcl9mcmFtZV9pbmZvIGlzIG5vdCBwYXJ0IG9mIHpsaWIsIGl0IGlzIGdlbmVyYXRlZCBieQotICAgIHRoZSBDIGNvbXBpbGVyIChjYyBvciBnY2MpLiBZb3UgbXVzdCByZWNvbXBpbGUgYXBwbGljYXRpb25zIHVzaW5nIHpsaWIKLSAgICB3aGljaCBoYXZlIHRoaXMgcHJvYmxlbS4gVGhpcyBwcm9ibGVtIGlzIHNwZWNpZmljIHRvIFNvbGFyaXMuIFNlZQotICAgIGh0dHA6Ly93d3cuc3VuZnJlZXdhcmUuY29tIGZvciBTb2xhcmlzIHZlcnNpb25zIG9mIHpsaWIgYW5kIGFwcGxpY2F0aW9ucwotICAgIHVzaW5nIHpsaWIuCi0KLTE4LiBXaHkgZG9lcyBnemlwIGdpdmUgYW4gZXJyb3Igb24gYSBmaWxlIEkgbWFrZSB3aXRoIGNvbXByZXNzL2RlZmxhdGU/Ci0KLSAgICBUaGUgY29tcHJlc3MgYW5kIGRlZmxhdGUgZnVuY3Rpb25zIHByb2R1Y2UgZGF0YSBpbiB0aGUgemxpYiBmb3JtYXQsIHdoaWNoCi0gICAgaXMgZGlmZmVyZW50IGFuZCBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZ3ppcCBmb3JtYXQuIFRoZSBneiogZnVuY3Rpb25zIGluCi0gICAgemxpYiBvbiB0aGUgb3RoZXIgaGFuZCB1c2UgdGhlIGd6aXAgZm9ybWF0LiBCb3RoIHRoZSB6bGliIGFuZCBnemlwCi0gICAgZm9ybWF0cyB1c2UgdGhlIHNhbWUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCBpbnRlcm5hbGx5LCBidXQgaGF2ZSBkaWZmZXJlbnQKLSAgICBoZWFkZXJzIGFuZCB0cmFpbGVycyBhcm91bmQgdGhlIGNvbXByZXNzZWQgZGF0YS4KLQotMTkuIE9rLCBzbyB3aHkgYXJlIHRoZXJlIHR3byBkaWZmZXJlbnQgZm9ybWF0cz8KLQotICAgIFRoZSBnemlwIGZvcm1hdCB3YXMgZGVzaWduZWQgdG8gcmV0YWluIHRoZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gYWJvdXQKLSAgICBhIHNpbmdsZSBmaWxlLCBzdWNoIGFzIHRoZSBuYW1lIGFuZCBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlLiBUaGUgemxpYgotICAgIGZvcm1hdCBvbiB0aGUgb3RoZXIgaGFuZCB3YXMgZGVzaWduZWQgZm9yIGluLW1lbW9yeSBhbmQgY29tbXVuaWNhdGlvbgotICAgIGNoYW5uZWwgYXBwbGljYXRpb25zLCBhbmQgaGFzIGEgbXVjaCBtb3JlIGNvbXBhY3QgaGVhZGVyIGFuZCB0cmFpbGVyIGFuZAotICAgIHVzZXMgYSBmYXN0ZXIgaW50ZWdyaXR5IGNoZWNrIHRoYW4gZ3ppcC4KLQotMjAuIFdlbGwgdGhhdCdzIG5pY2UsIGJ1dCBob3cgZG8gSSBtYWtlIGEgZ3ppcCBmaWxlIGluIG1lbW9yeT8KLQotICAgIFlvdSBjYW4gcmVxdWVzdCB0aGF0IGRlZmxhdGUgd3JpdGUgdGhlIGd6aXAgZm9ybWF0IGluc3RlYWQgb2YgdGhlIHpsaWIKLSAgICBmb3JtYXQgdXNpbmcgZGVmbGF0ZUluaXQyKCkuIFlvdSBjYW4gYWxzbyByZXF1ZXN0IHRoYXQgaW5mbGF0ZSBkZWNvZGUKLSAgICB0aGUgZ3ppcCBmb3JtYXQgdXNpbmcgaW5mbGF0ZUluaXQyKCkuIFJlYWQgemxpYi5oIGZvciBtb3JlIGRldGFpbHMuCi0KLTIxLiBJcyB6bGliIHRocmVhZC1zYWZlPwotCi0gICAgWWVzLiBIb3dldmVyIGFueSBsaWJyYXJ5IHJvdXRpbmVzIHRoYXQgemxpYiB1c2VzIGFuZCBhbnkgYXBwbGljYXRpb24tCi0gICAgcHJvdmlkZWQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgbXVzdCBhbHNvIGJlIHRocmVhZC1zYWZlLiB6bGliJ3MgZ3oqCi0gICAgZnVuY3Rpb25zIHVzZSBzdGRpbyBsaWJyYXJ5IHJvdXRpbmVzLCBhbmQgbW9zdCBvZiB6bGliJ3MgZnVuY3Rpb25zIHVzZSB0aGUKLSAgICBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGJ5IGRlZmF1bHQuIHpsaWIncyBJbml0IGZ1bmN0aW9ucyBhbGxvdwotICAgIGZvciB0aGUgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBjdXN0b20gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCi0KLSAgICBPZiBjb3Vyc2UsIHlvdSBzaG91bGQgb25seSBvcGVyYXRlIG9uIGFueSBnaXZlbiB6bGliIG9yIGd6aXAgc3RyZWFtIGZyb20gYQotICAgIHNpbmdsZSB0aHJlYWQgYXQgYSB0aW1lLgotCi0yMi4gQ2FuIEkgdXNlIHpsaWIgaW4gbXkgY29tbWVyY2lhbCBhcHBsaWNhdGlvbj8KLQotICAgIFllcy4gUGxlYXNlIHJlYWQgdGhlIGxpY2Vuc2UgaW4gemxpYi5oLgotCi0yMy4gSXMgemxpYiB1bmRlciB0aGUgR05VIGxpY2Vuc2U/Ci0KLSAgICBOby4gUGxlYXNlIHJlYWQgdGhlIGxpY2Vuc2UgaW4gemxpYi5oLgotCi0yNC4gVGhlIGxpY2Vuc2Ugc2F5cyB0aGF0IGFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgInBsYWlubHkgbWFya2VkIi4gU28KLSAgICB3aGF0IGV4YWN0bHkgZG8gSSBuZWVkIHRvIGRvIHRvIG1lZXQgdGhhdCByZXF1aXJlbWVudD8KLQotICAgIFlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgWkxJQl9WRVJTSU9OIGFuZCBaTElCX1ZFUk5VTSAjZGVmaW5lcyBpbiB6bGliLmguIEluCi0gICAgcGFydGljdWxhciwgdGhlIGZpbmFsIHZlcnNpb24gbnVtYmVyIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gImYiLCBhbmQgYW4KLSAgICBpZGVudGlmaWNhdGlvbiBzdHJpbmcgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIFpMSUJfVkVSU0lPTi4gVmVyc2lvbiBudW1iZXJzCi0gICAgeC54LnguZiBhcmUgcmVzZXJ2ZWQgZm9yIG1vZGlmaWNhdGlvbnMgdG8gemxpYiBieSBvdGhlcnMgdGhhbiB0aGUgemxpYgotICAgIG1haW50YWluZXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgemxpYiB5b3UgYXJlIGFsdGVyaW5nCi0gICAgaXMgIjEuMi4zLjQiLCB0aGVuIGluIHpsaWIuaCB5b3Ugc2hvdWxkIGNoYW5nZSBaTElCX1ZFUk5VTSB0byAweDEyM2YsIGFuZAotICAgIFpMSUJfVkVSU0lPTiB0byBzb21ldGhpbmcgbGlrZSAiMS4yLjMuZi16YWNoYXJ5LW1vZHMtdjMiLiBZb3UgY2FuIGFsc28KLSAgICB1cGRhdGUgdGhlIHZlcnNpb24gc3RyaW5ncyBpbiBkZWZsYXRlLmMgYW5kIGluZnRyZWVzLmMuCi0KLSAgICBGb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9ucywgeW91IHNob3VsZCBhbHNvIG5vdGUgdGhlIG9yaWdpbiBhbmQKLSAgICBuYXR1cmUgb2YgdGhlIGNoYW5nZXMgaW4gemxpYi5oLCBhcyB3ZWxsIGFzIGluIENoYW5nZUxvZyBhbmQgUkVBRE1FLCBhbG9uZwotICAgIHdpdGggdGhlIGRhdGVzIG9mIHRoZSBhbHRlcmF0aW9ucy4gVGhlIG9yaWdpbiBzaG91bGQgaW5jbHVkZSBhdCBsZWFzdCB5b3VyCi0gICAgbmFtZSAob3IgeW91ciBjb21wYW55J3MgbmFtZSksIGFuZCBhbiBlbWFpbCBhZGRyZXNzIHRvIGNvbnRhY3QgZm9yIGhlbHAgb3IKLSAgICBpc3N1ZXMgd2l0aCB0aGUgbGlicmFyeS4KLQotICAgIE5vdGUgdGhhdCBkaXN0cmlidXRpbmcgYSBjb21waWxlZCB6bGliIGxpYnJhcnkgYWxvbmcgd2l0aCB6bGliLmggYW5kCi0gICAgemNvbmYuaCBpcyBhbHNvIGEgc291cmNlIGRpc3RyaWJ1dGlvbiwgYW5kIHNvIHlvdSBzaG91bGQgY2hhbmdlCi0gICAgWkxJQl9WRVJTSU9OIGFuZCBaTElCX1ZFUk5VTSBhbmQgbm90ZSB0aGUgb3JpZ2luIGFuZCBuYXR1cmUgb2YgdGhlIGNoYW5nZXMKLSAgICBpbiB6bGliLmggYXMgeW91IHdvdWxkIGZvciBhIGZ1bGwgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotMjUuIFdpbGwgemxpYiB3b3JrIG9uIGEgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIGFyY2hpdGVjdHVyZSwgYW5kIGNhbiBJCi0gICAgZXhjaGFuZ2UgY29tcHJlc3NlZCBkYXRhIGJldHdlZW4gdGhlbT8KLQotICAgIFllcyBhbmQgeWVzLgotCi0yNi4gV2lsbCB6bGliIHdvcmsgb24gYSA2NC1iaXQgbWFjaGluZT8KLQotICAgIEl0IHNob3VsZC4gSXQgaGFzIGJlZW4gdGVzdGVkIG9uIDY0LWJpdCBtYWNoaW5lcywgYW5kIGhhcyBubyBkZXBlbmRlbmNlCi0gICAgb24gYW55IGRhdGEgdHlwZXMgYmVpbmcgbGltaXRlZCB0byAzMi1iaXRzIGluIGxlbmd0aC4gSWYgeW91IGhhdmUgYW55Ci0gICAgZGlmZmljdWx0aWVzLCBwbGVhc2UgcHJvdmlkZSBhIGNvbXBsZXRlIHByb2JsZW0gcmVwb3J0IHRvIHpsaWJAZ3ppcC5vcmcKLQotMjcuIFdpbGwgemxpYiBkZWNvbXByZXNzIGRhdGEgZnJvbSB0aGUgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeT8KLQotICAgIE5vLiBUaGUgUEtXYXJlIERDTCB1c2VzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgY29tcHJlc3NlZCBkYXRhIGZvcm1hdAotICAgIHRoYW4gZG9lcyBQS1pJUCBhbmQgemxpYi4gSG93ZXZlciwgeW91IGNhbiBsb29rIGluIHpsaWIncyBjb250cmliL2JsYXN0Ci0gICAgZGlyZWN0b3J5IGZvciBhIHBvc3NpYmxlIHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbS4KLQotMjguIENhbiBJIGFjY2VzcyBkYXRhIHJhbmRvbWx5IGluIGEgY29tcHJlc3NlZCBzdHJlYW0/Ci0KLSAgICBObywgbm90IHdpdGhvdXQgc29tZSBwcmVwYXJhdGlvbi4gSWYgd2hlbiBjb21wcmVzc2luZyB5b3UgcGVyaW9kaWNhbGx5Ci0gICAgdXNlIFpfRlVMTF9GTFVTSCwgY2FyZWZ1bGx5IHdyaXRlIGFsbCB0aGUgcGVuZGluZyBkYXRhIGF0IHRob3NlIHBvaW50cywKLSAgICBhbmQga2VlcCBhbiBpbmRleCBvZiB0aG9zZSBsb2NhdGlvbnMsIHRoZW4geW91IGNhbiBzdGFydCBkZWNvbXByZXNzaW9uCi0gICAgYXQgdGhvc2UgcG9pbnRzLiBZb3UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIG5vdCB1c2UgWl9GVUxMX0ZMVVNIIHRvbwotICAgIG9mdGVuLCBzaW5jZSBpdCBjYW4gc2lnbmlmaWNhbnRseSBkZWdyYWRlIGNvbXByZXNzaW9uLgotCi0yOS4gRG9lcyB6bGliIHdvcmsgb24gTVZTLCBPUy8zOTAsIENJQ1MsIGV0Yy4/Ci0KLSAgICBXZSBkb24ndCBrbm93IGZvciBzdXJlLiBXZSBoYXZlIGhlYXJkIG9jY2FzaW9uYWwgcmVwb3J0cyBvZiBzdWNjZXNzIG9uCi0gICAgdGhlc2Ugc3lzdGVtcy4gSWYgeW91IGRvIHVzZSBpdCBvbiBvbmUgb2YgdGhlc2UsIHBsZWFzZSBwcm92aWRlIHVzIHdpdGgKLSAgICBhIHJlcG9ydCwgaW5zdHJ1Y3Rpb25zLCBhbmQgcGF0Y2hlcyB0aGF0IHdlIGNhbiByZWZlcmVuY2Ugd2hlbiB3ZSBnZXQKLSAgICB0aGVzZSBxdWVzdGlvbnMuIFRoYW5rcy4KLQotMzAuIElzIHRoZXJlIHNvbWUgc2ltcGxlciwgZWFzaWVyIHRvIHJlYWQgdmVyc2lvbiBvZiBpbmZsYXRlIEkgY2FuIGxvb2sgYXQKLSAgICB0byB1bmRlcnN0YW5kIHRoZSBkZWZsYXRlIGZvcm1hdD8KLQotICAgIEZpcnN0IG9mZiwgeW91IHNob3VsZCByZWFkIFJGQyAxOTUxLiBTZWNvbmQsIHllcy4gTG9vayBpbiB6bGliJ3MKLSAgICBjb250cmliL3B1ZmYgZGlyZWN0b3J5LgotCi0zMS4gRG9lcyB6bGliIGluZnJpbmdlIG9uIGFueSBwYXRlbnRzPwotCi0gICAgQXMgZmFyIGFzIHdlIGtub3csIG5vLiBJbiBmYWN0LCB0aGF0IHdhcyBvcmlnaW5hbGx5IHRoZSB3aG9sZSBwb2ludCBiZWhpbmQKLSAgICB6bGliLiBMb29rIGhlcmUgZm9yIHNvbWUgbW9yZSBpbmZvcm1hdGlvbjoKLQotICAgIGh0dHA6Ly93d3cuZ3ppcC5vcmcvI2ZhcTExCi0KLTMyLiBDYW4gemxpYiB3b3JrIHdpdGggZ3JlYXRlciB0aGFuIDQgR0Igb2YgZGF0YT8KLQotICAgIFllcy4gaW5mbGF0ZSgpIGFuZCBkZWZsYXRlKCkgd2lsbCBwcm9jZXNzIGFueSBhbW91bnQgb2YgZGF0YSBjb3JyZWN0bHkuCi0gICAgRWFjaCBjYWxsIG9mIGluZmxhdGUoKSBvciBkZWZsYXRlKCkgaXMgbGltaXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IGNodW5rcwotICAgIG9mIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiB0aGUgY29tcGlsZXIncyAidW5zaWduZWQgaW50IgotICAgIHR5cGUsIGJ1dCB0aGVyZSBpcyBubyBsaW1pdCB0byB0aGUgbnVtYmVyIG9mIGNodW5rcy4gTm90ZSBob3dldmVyIHRoYXQgdGhlCi0gICAgc3RybS50b3RhbF9pbiBhbmQgc3RybV90b3RhbF9vdXQgY291bnRlcnMgbWF5IGJlIGxpbWl0ZWQgdG8gNCBHQi4gVGhlc2UKLSAgICBjb3VudGVycyBhcmUgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSBhbmQgYXJlIG5vdCB1c2VkIGludGVybmFsbHkgYnkKLSAgICBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpLiBUaGUgYXBwbGljYXRpb24gY2FuIGVhc2lseSBzZXQgdXAgaXRzIG93biBjb3VudGVycwotICAgIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBjYWxsIG9mIGluZmxhdGUoKSBvciBkZWZsYXRlKCkgdG8gY291bnQgYmV5b25kIDQgR0IuCi0gICAgY29tcHJlc3MoKSBhbmQgdW5jb21wcmVzcygpIG1heSBiZSBsaW1pdGVkIHRvIDQgR0IsIHNpbmNlIHRoZXkgb3BlcmF0ZSBpbiBhCi0gICAgc2luZ2xlIGNhbGwuIGd6c2VlaygpIGFuZCBnenRlbGwoKSBtYXkgYmUgbGltaXRlZCB0byA0IEdCIGRlcGVuZGluZyBvbiBob3cKLSAgICB6bGliIGlzIGNvbXBpbGVkLiBTZWUgdGhlIHpsaWJDb21waWxlRmxhZ3MoKSBmdW5jdGlvbiBpbiB6bGliLmguCi0KLSAgICBUaGUgd29yZCAibWF5IiBhcHBlYXJzIHNldmVyYWwgdGltZXMgYWJvdmUgc2luY2UgdGhlcmUgaXMgYSA0IEdCIGxpbWl0Ci0gICAgb25seSBpZiB0aGUgY29tcGlsZXIncyAibG9uZyIgdHlwZSBpcyAzMiBiaXRzLiBJZiB0aGUgY29tcGlsZXIncyAibG9uZyIKLSAgICB0eXBlIGlzIDY0IGJpdHMsIHRoZW4gdGhlIGxpbWl0IGlzIDE2IGV4YWJ5dGVzLgotCi0zMy4gRG9lcyB6bGliIGhhdmUgYW55IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcz8KLQotICAgIFRoZSBvbmx5IG9uZSB0aGF0IHdlIGFyZSBhd2FyZSBvZiBpcyBwb3RlbnRpYWxseSBpbiBnenByaW50ZigpLiBJZiB6bGliCi0gICAgaXMgY29tcGlsZWQgdG8gdXNlIHNwcmludGYoKSBvciB2c3ByaW50ZigpLCB0aGVuIHRoZXJlIGlzIG5vIHByb3RlY3Rpb24KLSAgICBhZ2FpbnN0IGEgYnVmZmVyIG92ZXJmbG93IG9mIGEgNEsgc3RyaW5nIHNwYWNlLCBvdGhlciB0aGFuIHRoZSBjYWxsZXIgb2YKLSAgICBnenByaW50ZigpIGFzc3VyaW5nIHRoYXQgdGhlIG91dHB1dCB3aWxsIG5vdCBleGNlZWQgNEsuIE9uIHRoZSBvdGhlcgotICAgIGhhbmQsIGlmIHpsaWIgaXMgY29tcGlsZWQgdG8gdXNlIHNucHJpbnRmKCkgb3IgdnNucHJpbnRmKCksIHdoaWNoIHNob3VsZAotICAgIG5vcm1hbGx5IGJlIHRoZSBjYXNlLCB0aGVuIHRoZXJlIGlzIG5vIHZ1bG5lcmFiaWxpdHkuIFRoZSAuL2NvbmZpZ3VyZQotICAgIHNjcmlwdCB3aWxsIGRpc3BsYXkgd2FybmluZ3MgaWYgYW4gaW5zZWN1cmUgdmFyaWF0aW9uIG9mIHNwcmludGYoKSB3aWxsCi0gICAgYmUgdXNlZCBieSBnenByaW50ZigpLiBBbHNvIHRoZSB6bGliQ29tcGlsZUZsYWdzKCkgZnVuY3Rpb24gd2lsbCByZXR1cm4KLSAgICBpbmZvcm1hdGlvbiBvbiB3aGF0IHZhcmlhbnQgb2Ygc3ByaW50ZigpIGlzIHVzZWQgYnkgZ3pwcmludGYoKS4KLQotICAgIElmIHlvdSBkb24ndCBoYXZlIHNucHJpbnRmKCkgb3IgdnNucHJpbnRmKCkgYW5kIHdvdWxkIGxpa2Ugb25lLCB5b3UgY2FuCi0gICAgZmluZCBhIHBvcnRhYmxlIGltcGxlbWVudGF0aW9uIGhlcmU6Ci0KLSAgICAgICAgaHR0cDovL3d3dy5panMuc2kvc29mdHdhcmUvc25wcmludGYvCi0KLSAgICBOb3RlIHRoYXQgeW91IHNob3VsZCBiZSB1c2luZyB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbiBvZiB6bGliLiBWZXJzaW9ucwotICAgIDEuMS4zIGFuZCBiZWZvcmUgd2VyZSBzdWJqZWN0IHRvIGEgZG91YmxlLWZyZWUgdnVsbmVyYWJpbGl0eS4KLQotMzQuIElzIHRoZXJlIGEgSmF2YSB2ZXJzaW9uIG9mIHpsaWI/Ci0KLSAgICBQcm9iYWJseSB3aGF0IHlvdSB3YW50IGlzIHRvIHVzZSB6bGliIGluIEphdmEuIHpsaWIgaXMgYWxyZWFkeSBpbmNsdWRlZAotICAgIGFzIHBhcnQgb2YgdGhlIEphdmEgU0RLIGluIHRoZSBqYXZhLnV0aWwuemlwIHBhY2thZ2UuIElmIHlvdSByZWFsbHkgd2FudAotICAgIGEgdmVyc2lvbiBvZiB6bGliIHdyaXR0ZW4gaW4gdGhlIEphdmEgbGFuZ3VhZ2UsIGxvb2sgb24gdGhlIHpsaWIgaG9tZQotICAgIHBhZ2UgZm9yIGxpbmtzOiBodHRwOi8vd3d3LnpsaWIub3JnLwotCi0zNS4gSSBnZXQgdGhpcyBvciB0aGF0IGNvbXBpbGVyIG9yIHNvdXJjZS1jb2RlIHNjYW5uZXIgd2FybmluZyB3aGVuIEkgY3JhbmsgaXQKLSAgICB1cCB0byBtYXhpbWFsbHktcGVkYW50aWMuIENhbid0IHlvdSBndXlzIHdyaXRlIHByb3BlciBjb2RlPwotCi0gICAgTWFueSB5ZWFycyBhZ28sIHdlIGdhdmUgdXAgYXR0ZW1wdGluZyB0byBhdm9pZCB3YXJuaW5ncyBvbiBldmVyeSBjb21waWxlcgotICAgIGluIHRoZSB1bml2ZXJzZS4gSXQganVzdCBnb3QgdG8gYmUgYSB3YXN0ZSBvZiB0aW1lLCBhbmQgc29tZSBjb21waWxlcnMKLSAgICB3ZXJlIGRvd25yaWdodCBzaWxseS4gU28gbm93LCB3ZSBzaW1wbHkgbWFrZSBzdXJlIHRoYXQgdGhlIGNvZGUgYWx3YXlzCi0gICAgd29ya3MuCi0KLTM2LiBWYWxncmluZCAob3Igc29tZSBzaW1pbGFyIG1lbW9yeSBhY2Nlc3MgY2hlY2tlcikgc2F5cyB0aGF0IGRlZmxhdGUgaXMKLSAgICBwZXJmb3JtaW5nIGEgY29uZGl0aW9uYWwganVtcCB0aGF0IGRlcGVuZHMgb24gYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4KLSAgICBJc24ndCB0aGF0IGEgYnVnPwotCi0gICAgTm8uICBUaGF0IGlzIGludGVudGlvbmFsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhbmQgdGhlIG91dHB1dCBvZgotICAgIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkLiAgVGhpcyBvbmx5IHN0YXJ0ZWQgc2hvd2luZyB1cCByZWNlbnRseSBzaW5jZQotICAgIHpsaWIgMS4yLnggdXNlcyBtYWxsb2MoKSBieSBkZWZhdWx0IGZvciBhbGxvY2F0aW9ucywgd2hlcmVhcyBlYXJsaWVyCi0gICAgdmVyc2lvbnMgdXNlZCBjYWxsb2MoKSwgd2hpY2ggemVyb3Mgb3V0IHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgotCi0zNy4gV2lsbCB6bGliIHJlYWQgdGhlIChpbnNlcnQgYW55IGFuY2llbnQgb3IgYXJjYW5lIGZvcm1hdCBoZXJlKSBjb21wcmVzc2VkCi0gICAgZGF0YSBmb3JtYXQ/Ci0KLSAgICBQcm9iYWJseSBub3QuIExvb2sgaW4gdGhlIGNvbXAuY29tcHJlc3Npb24gRkFRIGZvciBwb2ludGVycyB0byB2YXJpb3VzCi0gICAgZm9ybWF0cyBhbmQgYXNzb2NpYXRlZCBzb2Z0d2FyZS4KLQotMzguIEhvdyBjYW4gSSBlbmNyeXB0L2RlY3J5cHQgemlwIGZpbGVzIHdpdGggemxpYj8KLQotICAgIHpsaWIgZG9lc24ndCBzdXBwb3J0IGVuY3J5cHRpb24uIFRoZSBvcmlnaW5hbCBQS1pJUCBlbmNyeXB0aW9uIGlzIHZlcnkgd2VhawotICAgIGFuZCBjYW4gYmUgYnJva2VuIHdpdGggZnJlZWx5IGF2YWlsYWJsZSBwcm9ncmFtcy4gVG8gZ2V0IHN0cm9uZyBlbmNyeXB0aW9uLAotICAgIHVzZSBHbnVQRywgaHR0cDovL3d3dy5nbnVwZy5vcmcvICwgd2hpY2ggYWxyZWFkeSBpbmNsdWRlcyB6bGliIGNvbXByZXNzaW9uLgotICAgIEZvciBQS1pJUCBjb21wYXRpYmxlICJlbmNyeXB0aW9uIiwgbG9vayBhdCBodHRwOi8vd3d3LmluZm8temlwLm9yZy8KLQotMzkuIFdoYXQncyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAiZ3ppcCIgYW5kICJkZWZsYXRlIiBIVFRQIDEuMSBlbmNvZGluZ3M/Ci0KLSAgICAiZ3ppcCIgaXMgdGhlIGd6aXAgZm9ybWF0LCBhbmQgImRlZmxhdGUiIGlzIHRoZSB6bGliIGZvcm1hdC4gVGhleSBzaG91bGQKLSAgICBwcm9iYWJseSBoYXZlIGNhbGxlZCB0aGUgc2Vjb25kIG9uZSAiemxpYiIgaW5zdGVhZCB0byBhdm9pZCBjb25mdXNpb24KLSAgICB3aXRoIHRoZSByYXcgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0LiBXaGlsZSB0aGUgSFRUUCAxLjEgUkZDIDI2MTYKLSAgICBjb3JyZWN0bHkgcG9pbnRzIHRvIHRoZSB6bGliIHNwZWNpZmljYXRpb24gaW4gUkZDIDE5NTAgZm9yIHRoZSAiZGVmbGF0ZSIKLSAgICB0cmFuc2ZlciBlbmNvZGluZywgdGhlcmUgaGF2ZSBiZWVuIHJlcG9ydHMgb2Ygc2VydmVycyBhbmQgYnJvd3NlcnMgdGhhdAotICAgIGluY29ycmVjdGx5IHByb2R1Y2Ugb3IgZXhwZWN0IHJhdyBkZWZsYXRlIGRhdGEgcGVyIHRoZSBkZWZsYXRlCi0gICAgc3BlY2ZpY2lhdGlvbiBpbiBSRkMgMTk1MSwgbW9zdCBub3RhYmx5IE1pY3Jvc29mdC4gU28gZXZlbiB0aG91Z2ggdGhlCi0gICAgImRlZmxhdGUiIHRyYW5zZmVyIGVuY29kaW5nIHVzaW5nIHRoZSB6bGliIGZvcm1hdCB3b3VsZCBiZSB0aGUgbW9yZQotICAgIGVmZmljaWVudCBhcHByb2FjaCAoYW5kIGluIGZhY3QgZXhhY3RseSB3aGF0IHRoZSB6bGliIGZvcm1hdCB3YXMgZGVzaWduZWQKLSAgICBmb3IpLCB1c2luZyB0aGUgImd6aXAiIHRyYW5zZmVyIGVuY29kaW5nIGlzIHByb2JhYmx5IG1vcmUgcmVsaWFibGUgZHVlIHRvCi0gICAgYW4gdW5mb3J0dW5hdGUgY2hvaWNlIG9mIG5hbWUgb24gdGhlIHBhcnQgb2YgdGhlIEhUVFAgMS4xIGF1dGhvcnMuCi0KLSAgICBCb3R0b20gbGluZTogdXNlIHRoZSBnemlwIGZvcm1hdCBmb3IgSFRUUCAxLjEgZW5jb2RpbmcuCi0KLTQwLiBEb2VzIHpsaWIgc3VwcG9ydCB0aGUgbmV3ICJEZWZsYXRlNjQiIGZvcm1hdCBpbnRyb2R1Y2VkIGJ5IFBLV2FyZT8KLQotICAgIE5vLiBQS1dhcmUgaGFzIGFwcGFyZW50bHkgZGVjaWRlZCB0byBrZWVwIHRoYXQgZm9ybWF0IHByb3ByaWV0YXJ5LCBzaW5jZQotICAgIHRoZXkgaGF2ZSBub3QgZG9jdW1lbnRlZCBpdCBhcyB0aGV5IGhhdmUgcHJldmlvdXMgY29tcHJlc3Npb24gZm9ybWF0cy4KLSAgICBJbiBhbnkgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGltcHJvdmVtZW50cyBhcmUgc28gbW9kZXN0IGNvbXBhcmVkIHRvIG90aGVyCi0gICAgbW9yZSBtb2Rlcm4gYXBwcm9hY2hlcywgdGhhdCBpdCdzIG5vdCB3b3J0aCB0aGUgZWZmb3J0IHRvIGltcGxlbWVudC4KLQotNDEuIENhbiB5b3UgcGxlYXNlIHNpZ24gdGhlc2UgbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgYW5kIGZheCB0aGVtIGJhY2sgdG8gdXMKLSAgICBzbyB0aGF0IHdlIGNhbiB1c2UgeW91ciBzb2Z0d2FyZSBpbiBvdXIgcHJvZHVjdD8KLQotICAgIE5vLiBHbyBhd2F5LiBTaG9vLgpkaWZmIC0tZ2l0IGEvbGlicy96bGliL0lOREVYIGIvbGlicy96bGliL0lOREVYCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTg3ZTU5Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9JTkRFWAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLUNoYW5nZUxvZyAgICAgICBoaXN0b3J5IG9mIGNoYW5nZXMKLUZBUSAgICAgICAgICAgICBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBhYm91dCB6bGliCi1JTkRFWCAgICAgICAgICAgdGhpcyBmaWxlCi1NYWtlZmlsZSAgICAgICAgbWFrZWZpbGUgZm9yIFVuaXggKGdlbmVyYXRlZCBieSBjb25maWd1cmUpCi1NYWtlZmlsZS5pbiAgICAgbWFrZWZpbGUgZm9yIFVuaXggKHRlbXBsYXRlIGZvciBjb25maWd1cmUpCi1SRUFETUUgICAgICAgICAgZ3Vlc3Mgd2hhdAotYWxnb3JpdGhtLnR4dCAgIGRlc2NyaXB0aW9uIG9mIHRoZSAoZGUpY29tcHJlc3Npb24gYWxnb3JpdGhtCi1jb25maWd1cmUgICAgICAgY29uZmlndXJlIHNjcmlwdCBmb3IgVW5peAotemNvbmYuaW4uaCAgICAgIHRlbXBsYXRlIGZvciB6Y29uZi5oICh1c2VkIGJ5IGNvbmZpZ3VyZSkKLQotYW1pZ2EvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgQW1pZ2EgU0FTIEMKLWFzNDAwLyAgICAgICAgICBtYWtlZmlsZXMgZm9yIElCTSBBUy80MDAKLW1zZG9zLyAgICAgICAgICBtYWtlZmlsZXMgZm9yIE1TRE9TCi1vbGQvICAgICAgICAgICAgbWFrZWZpbGVzIGZvciB2YXJpb3VzIGFyY2hpdGVjdHVyZXMgYW5kIHpsaWIgZG9jdW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIGZpbGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdXBkYXRlZCBmb3IgemxpYiAxLjIueAotcHJvamVjdHMvICAgICAgIHByb2plY3RzIGZvciB2YXJpb3VzIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnRzCi1xbngvICAgICAgICAgICAgbWFrZWZpbGVzIGZvciBRTlgKLXdpbjMyLyAgICAgICAgICBtYWtlZmlsZXMgZm9yIFdpbmRvd3MKLQotICAgICAgICAgICAgICAgIHpsaWIgcHVibGljIGhlYWRlciBmaWxlcyAobXVzdCBiZSBrZXB0KToKLXpjb25mLmgKLXpsaWIuaAotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSBzb3VyY2UgZmlsZXMgdXNlZCB0byBidWlsZCB0aGUgemxpYiBsaWJyYXJ5OgotYWRsZXIzMi5jCi1jb21wcmVzcy5jCi1jcmMzMi5jCi1jcmMzMi5oCi1kZWZsYXRlLmMKLWRlZmxhdGUuaAotZ3ppby5jCi1pbmZiYWNrLmMKLWluZmZhc3QuYwotaW5mZmFzdC5oCi1pbmZmaXhlZC5oCi1pbmZsYXRlLmMKLWluZmxhdGUuaAotaW5mdHJlZXMuYwotaW5mdHJlZXMuaAotdHJlZXMuYwotdHJlZXMuaAotdW5jb21wci5jCi16dXRpbC5jCi16dXRpbC5oCi0KLSAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZXMgZm9yIHNhbXBsZSBwcm9ncmFtczoKLWV4YW1wbGUuYwotbWluaWd6aXAuYwotCi0gICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQgY29udHJpYnV0aW9uIGJ5IHRoaXJkIHBhcnRpZXMKLVNlZSBjb250cmliL1JFQURNRS5jb250cmliCmRpZmYgLS1naXQgYS9saWJzL3psaWIvTWFrZWZpbGUuaW4gYi9saWJzL3psaWIvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZDZlNDUuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHpsaWIKLSMgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotCi0jIFRvIGNvbXBpbGUgYW5kIHRlc3QsIHR5cGU6Ci0jICAgIC4vY29uZmlndXJlOyBtYWtlIHRlc3QKLSMgVGhlIGNhbGwgb2YgY29uZmlndXJlIGlzIG9wdGlvbmFsIGlmIHlvdSBkb24ndCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzCi0jIElmIHlvdSB3aXNoIHRvIGJ1aWxkIHpsaWIgYXMgYSBzaGFyZWQgbGlicmFyeSwgdXNlOiAuL2NvbmZpZ3VyZSAtcwotCi0jIFRvIHVzZSB0aGUgYXNtIGNvZGUsIHR5cGU6Ci0jICAgIGNwIGNvbnRyaWIvYXNtPzg2L21hdGNoLlMgLi9tYXRjaC5TCi0jICAgIG1ha2UgTE9DPS1EQVNNViBPQkpBPW1hdGNoLm8KLQotIyBUbyBpbnN0YWxsIC91c3IvbG9jYWwvbGliL2xpYnouKiBhbmQgL3Vzci9sb2NhbC9pbmNsdWRlL3psaWIuaCwgdHlwZToKLSMgICAgbWFrZSBpbnN0YWxsCi0jIFRvIGluc3RhbGwgaW4gJEhPTUUgaW5zdGVhZCBvZiAvdXNyL2xvY2FsLCB1c2U6Ci0jICAgIG1ha2UgaW5zdGFsbCBwcmVmaXg9JEhPTUUKLQotQ0M9Y2MKLQotQ0ZMQUdTPS1PCi0jQ0ZMQUdTPS1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03Ci0jQ0ZMQUdTPS1nIC1EREVCVUcKLSNDRkxBR1M9LU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKLSMgICAgICAgICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMKLQotTERGTEFHUz1saWJ6LmEKLUxEU0hBUkVEPSQoQ0MpCi1DUFA9JChDQykgLUUKLQotTElCUz1saWJ6LmEKLVNIQVJFRExJQj1saWJ6LnNvCi1TSEFSRURMSUJWPWxpYnouc28uMS4yLjMKLVNIQVJFRExJQk09bGliei5zby4xCi0KLUFSPWFyIHJjCi1SQU5MSUI9cmFubGliCi1UQVI9dGFyCi1TSEVMTD0vYmluL3NoCi1FWEU9Ci0KLXByZWZpeCA9IC91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJHtwcmVmaXh9Ci1saWJkaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKLWluY2x1ZGVkaXIgPSAke3ByZWZpeH0vaW5jbHVkZQotbWFuZGlyID0gJHtwcmVmaXh9L3NoYXJlL21hbgotbWFuM2RpciA9ICR7bWFuZGlyfS9tYW4zCi0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6aW8ubyB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8gXAotICAgICAgIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubwotCi1PQkpBID0KLSMgdG8gdXNlIHRoZSBhc20gY29kZTogbWFrZSBPQkpBPW1hdGNoLm8KLQotVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KLQotYWxsOiBleGFtcGxlJChFWEUpIG1pbmlnemlwJChFWEUpCi0KLWNoZWNrOiB0ZXN0Ci10ZXN0OiBhbGwKLQlATERfTElCUkFSWV9QQVRIPS46JChMRF9MSUJSQVJZX1BBVEgpIDsgZXhwb3J0IExEX0xJQlJBUllfUEFUSDsgXAotCWVjaG8gaGVsbG8gd29ybGQgfCAuL21pbmlnemlwIHwgLi9taW5pZ3ppcCAtZCB8fCBcCi0JICBlY2hvICcJCSoqKiBtaW5pZ3ppcCB0ZXN0IEZBSUxFRCAqKionIDsgXAotCWlmIC4vZXhhbXBsZTsgdGhlbiBcCi0JICBlY2hvICcJCSoqKiB6bGliIHRlc3QgT0sgKioqJzsgXAotCWVsc2UgXAotCSAgZWNobyAnCQkqKiogemxpYiB0ZXN0IEZBSUxFRCAqKionOyBcCi0JZmkKLQotbGliei5hOiAkKE9CSlMpICQoT0JKQSkKLQkkKEFSKSAkQCAkKE9CSlMpICQoT0JKQSkKLQktQCAoJChSQU5MSUIpICRAIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQotCi1tYXRjaC5vOiBtYXRjaC5TCi0JJChDUFApIG1hdGNoLlMgPiBfbWF0Y2gucwotCSQoQ0MpIC1jIF9tYXRjaC5zCi0JbXYgX21hdGNoLm8gbWF0Y2gubwotCXJtIC1mIF9tYXRjaC5zCi0KLSQoU0hBUkVETElCVik6ICQoT0JKUykKLQkkKExEU0hBUkVEKSAtbyAkQCAkKE9CSlMpCi0Jcm0gLWYgJChTSEFSRURMSUIpICQoU0hBUkVETElCTSkKLQlsbiAtcyAkQCAkKFNIQVJFRExJQikKLQlsbiAtcyAkQCAkKFNIQVJFRExJQk0pCi0KLWV4YW1wbGUkKEVYRSk6IGV4YW1wbGUubyAkKExJQlMpCi0JJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKExERkxBR1MpCi0KLW1pbmlnemlwJChFWEUpOiBtaW5pZ3ppcC5vICQoTElCUykKLQkkKENDKSAkKENGTEFHUykgLW8gJEAgbWluaWd6aXAubyAkKExERkxBR1MpCi0KLWluc3RhbGw6ICQoTElCUykKLQktQGlmIFsgISAtZCAkKGV4ZWNfcHJlZml4KSBdOyB0aGVuIG1rZGlyIC1wICQoZXhlY19wcmVmaXgpOyBmaQotCS1AaWYgWyAhIC1kICQoaW5jbHVkZWRpcikgIF07IHRoZW4gbWtkaXIgLXAgJChpbmNsdWRlZGlyKTsgZmkKLQktQGlmIFsgISAtZCAkKGxpYmRpcikgICAgICBdOyB0aGVuIG1rZGlyIC1wICQobGliZGlyKTsgZmkKLQktQGlmIFsgISAtZCAkKG1hbjNkaXIpICAgICBdOyB0aGVuIG1rZGlyIC1wICQobWFuM2Rpcik7IGZpCi0JY3AgemxpYi5oIHpjb25mLmggJChpbmNsdWRlZGlyKQotCWNobW9kIDY0NCAkKGluY2x1ZGVkaXIpL3psaWIuaCAkKGluY2x1ZGVkaXIpL3pjb25mLmgKLQljcCAkKExJQlMpICQobGliZGlyKQotCWNkICQobGliZGlyKTsgY2htb2QgNzU1ICQoTElCUykKLQktQChjZCAkKGxpYmRpcik7ICQoUkFOTElCKSBsaWJ6LmEgfHwgdHJ1ZSkgPi9kZXYvbnVsbCAyPiYxCi0JY2QgJChsaWJkaXIpOyBpZiB0ZXN0IC1mICQoU0hBUkVETElCVik7IHRoZW4gXAotCSAgcm0gLWYgJChTSEFSRURMSUIpICQoU0hBUkVETElCTSk7IFwKLQkgIGxuIC1zICQoU0hBUkVETElCVikgJChTSEFSRURMSUIpOyBcCi0JICBsbiAtcyAkKFNIQVJFRExJQlYpICQoU0hBUkVETElCTSk7IFwKLQkgIChsZGNvbmZpZyB8fCB0cnVlKSAgPi9kZXYvbnVsbCAyPiYxOyBcCi0JZmkKLQljcCB6bGliLjMgJChtYW4zZGlyKQotCWNobW9kIDY0NCAkKG1hbjNkaXIpL3psaWIuMwotIyBUaGUgcmFubGliIGluIGluc3RhbGwgaXMgbmVlZGVkIG9uIE5lWFRTVEVQIHdoaWNoIGNoZWNrcyBmaWxlIHRpbWVzCi0jIGxkY29uZmlnIGlzIGZvciBMaW51eAotCi11bmluc3RhbGw6Ci0JY2QgJChpbmNsdWRlZGlyKTsgXAotCWNkICQobGliZGlyKTsgcm0gLWYgbGliei5hOyBcCi0JaWYgdGVzdCAtZiAkKFNIQVJFRExJQlYpOyB0aGVuIFwKLQkgIHJtIC1mICQoU0hBUkVETElCVikgJChTSEFSRURMSUIpICQoU0hBUkVETElCTSk7IFwKLQlmaQotCWNkICQobWFuM2Rpcik7IHJtIC1mIHpsaWIuMwotCi1tb3N0bHljbGVhbjogY2xlYW4KLWNsZWFuOgotCXJtIC1mICoubyAqfiBleGFtcGxlJChFWEUpIG1pbmlnemlwJChFWEUpIFwKLQkgICBsaWJ6LiogZm9vLmd6IHNvX2xvY2F0aW9ucyBcCi0JICAgX21hdGNoLnMgbWFrZXRyZWUgY29udHJpYi9pbmZiYWNrOS8qLm8KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi1kaXN0Y2xlYW46IGNsZWFuCi0JY3AgLXAgTWFrZWZpbGUuaW4gTWFrZWZpbGUKLQljcCAtcCB6Y29uZi5pbi5oIHpjb25mLmgKLQlybSAtZiAuRFNfU3RvcmUKLQotdGFnczoKLQlldGFncyAqLltjaF0KLQotZGVwZW5kOgotCW1ha2VkZXBlbmQgLS0gJChDRkxBR1MpIC0tICouW2NoXQotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLWFkbGVyMzIubzogemxpYi5oIHpjb25mLmgKLWNvbXByZXNzLm86IHpsaWIuaCB6Y29uZi5oCi1jcmMzMi5vOiBjcmMzMi5oIHpsaWIuaCB6Y29uZi5oCi1kZWZsYXRlLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1leGFtcGxlLm86IHpsaWIuaCB6Y29uZi5oCi1nemlvLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWluZmZhc3QubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZmJhY2subzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZnRyZWVzLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotbWluaWd6aXAubzogemxpYi5oIHpjb25mLmgKLXRyZWVzLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHRyZWVzLmgKLXVuY29tcHIubzogemxpYi5oIHpjb25mLmgKLXp1dGlsLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9SRUFETUUgYi9saWJzL3psaWIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NThjYzUwLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotWkxJQiBEQVRBIENPTVBSRVNTSU9OIExJQlJBUlkKLQotemxpYiAxLjIuMyBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuICBBbGwgdGhlIGNvZGUgaXMKLXRocmVhZCBzYWZlLiAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDcwotKFJlcXVlc3QgZm9yIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzCi1odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dCAoemxpYiBmb3JtYXQpLCByZmMxOTUxLnR4dCAoZGVmbGF0ZSBmb3JtYXQpCi1hbmQgcmZjMTk1Mi50eHQgKGd6aXAgZm9ybWF0KS4gVGhlc2UgZG9jdW1lbnRzIGFyZSBhbHNvIGF2YWlsYWJsZSBpbiBvdGhlcgotZm9ybWF0cyBmcm9tIGZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvcG5nL2RvY3VtZW50cy96bGliL3pkb2MtaW5kZXguaHRtbAotCi1BbGwgZnVuY3Rpb25zIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIHpsaWIuaAotKHZvbHVudGVlciB0byB3cml0ZSBtYW4gcGFnZXMgd2VsY29tZSwgY29udGFjdCB6bGliQGd6aXAub3JnKS4gQSB1c2FnZSBleGFtcGxlCi1vZiB0aGUgbGlicmFyeSBpcyBnaXZlbiBpbiB0aGUgZmlsZSBleGFtcGxlLmMgd2hpY2ggYWxzbyB0ZXN0cyB0aGF0IHRoZSBsaWJyYXJ5Ci1pcyB3b3JraW5nIGNvcnJlY3RseS4gQW5vdGhlciBleGFtcGxlIGlzIGdpdmVuIGluIHRoZSBmaWxlIG1pbmlnemlwLmMuIFRoZQotY29tcHJlc3Npb24gbGlicmFyeSBpdHNlbGYgaXMgY29tcG9zZWQgb2YgYWxsIHNvdXJjZSBmaWxlcyBleGNlcHQgZXhhbXBsZS5jIGFuZAotbWluaWd6aXAuYy4KLQotVG8gY29tcGlsZSBhbGwgZmlsZXMgYW5kIHJ1biB0aGUgdGVzdCBwcm9ncmFtLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBnaXZlbiBhdAotdGhlIHRvcCBvZiBNYWtlZmlsZS4gSW4gc2hvcnQgIm1ha2UgdGVzdDsgbWFrZSBpbnN0YWxsIiBzaG91bGQgd29yayBmb3IgbW9zdAotbWFjaGluZXMuIEZvciBVbml4OiAiLi9jb25maWd1cmU7IG1ha2UgdGVzdDsgbWFrZSBpbnN0YWxsIi4gRm9yIE1TRE9TLCB1c2Ugb25lCi1vZiB0aGUgc3BlY2lhbCBtYWtlZmlsZXMgc3VjaCBhcyBNYWtlZmlsZS5tc2MuIEZvciBWTVMsIHVzZSBtYWtlX3Ztcy5jb20uCi0KLVF1ZXN0aW9ucyBhYm91dCB6bGliIHNob3VsZCBiZSBzZW50IHRvIDx6bGliQGd6aXAub3JnPiwgb3IgdG8gR2lsbGVzIFZvbGxhbnQKLTxpbmZvQHdpbmltYWdlLmNvbT4gZm9yIHRoZSBXaW5kb3dzIERMTCB2ZXJzaW9uLiBUaGUgemxpYiBob21lIHBhZ2UgaXMKLWh0dHA6Ly93d3cuemxpYi5vcmcgb3IgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLyBCZWZvcmUgcmVwb3J0aW5nIGEgcHJvYmxlbSwKLXBsZWFzZSBjaGVjayB0aGlzIHNpdGUgdG8gdmVyaWZ5IHRoYXQgeW91IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHpsaWI7Ci1vdGhlcndpc2UgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgY2hlY2sgd2hldGhlciB0aGUgcHJvYmxlbSBzdGlsbCBleGlzdHMgb3IKLW5vdC4KLQotUExFQVNFIHJlYWQgdGhlIHpsaWIgRkFRIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sIGJlZm9yZSBhc2tpbmcKLWZvciBoZWxwLgotCi1NYXJrIE5lbHNvbiA8bWFya25AaWVlZS5vcmc+IHdyb3RlIGFuIGFydGljbGUgYWJvdXQgemxpYiBmb3IgdGhlIEphbi4gMTk5NwotaXNzdWUgb2YgIERyLiBEb2JiJ3MgSm91cm5hbDsgYSBjb3B5IG9mIHRoZSBhcnRpY2xlIGlzIGF2YWlsYWJsZSBpbgotaHR0cDovL2RvZ21hLm5ldC9tYXJrbi9hcnRpY2xlcy96bGlidG9vbC96bGlidG9vbC5odG0KLQotVGhlIGNoYW5nZXMgbWFkZSBpbiB2ZXJzaW9uIDEuMi4zIGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIENoYW5nZUxvZy4KLQotVW5zdXBwb3J0ZWQgdGhpcmQgcGFydHkgY29udHJpYnV0aW9ucyBhcmUgcHJvdmlkZWQgaW4gZGlyZWN0b3J5ICJjb250cmliIi4KLQotQSBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHpsaWIgaXMgYXZhaWxhYmxlIGluIHRoZSBKYXZhIERldmVsb3BtZW50IEtpdAotaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC96aXAvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKLVNlZSB0aGUgemxpYiBob21lIHBhZ2UgaHR0cDovL3d3dy56bGliLm9yZyBmb3IgZGV0YWlscy4KLQotQSBQZXJsIGludGVyZmFjZSB0byB6bGliIHdyaXR0ZW4gYnkgUGF1bCBNYXJxdWVzcyA8cG1xc0BjcGFuLm9yZz4gaXMgaW4gdGhlCi1DUEFOIChDb21wcmVoZW5zaXZlIFBlcmwgQXJjaGl2ZSBOZXR3b3JrKSBzaXRlcwotaHR0cDovL3d3dy5jcGFuLm9yZy9tb2R1bGVzL2J5LW1vZHVsZS9Db21wcmVzcy8KLQotQSBQeXRob24gaW50ZXJmYWNlIHRvIHpsaWIgd3JpdHRlbiBieSBBLk0uIEt1Y2hsaW5nIDxhbWtAYW1rLmNhPiBpcwotYXZhaWxhYmxlIGluIFB5dGhvbiAxLjUgYW5kIGxhdGVyIHZlcnNpb25zLCBzZWUKLWh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvbGliL21vZHVsZS16bGliLmh0bWwKLQotQSB6bGliIGJpbmRpbmcgZm9yIFRDTCB3cml0dGVuIGJ5IEFuZHJlYXMgS3VwcmllcyA8YS5rdXByaWVzQHdlc3RlbmQuY29tPiBpcwotYXZhaWxsYWJsZSBhdCBodHRwOi8vd3d3Lm9jaGUuZGUvfmFrdXByaWVzL3NvZnQvdHJmL3RyZl96aXAuaHRtbAotCi1BbiBleHBlcmltZW50YWwgcGFja2FnZSB0byByZWFkIGFuZCB3cml0ZSBmaWxlcyBpbiAuemlwIGZvcm1hdCwgd3JpdHRlbiBvbiB0b3AKLW9mIHpsaWIgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPiwgaXMgYXZhaWxhYmxlIGluIHRoZQotY29udHJpYi9taW5pemlwIGRpcmVjdG9yeSBvZiB6bGliLgotCi0KLU5vdGVzIGZvciBzb21lIHRhcmdldHM6Ci0KLS0gRm9yIFdpbmRvd3MgRExMIHZlcnNpb25zLCBwbGVhc2Ugc2VlIHdpbjMyL0RMTF9GQVEudHh0Ci0KLS0gRm9yIDY0LWJpdCBJcml4LCBkZWZsYXRlLmMgbXVzdCBiZSBjb21waWxlZCB3aXRob3V0IGFueSBvcHRpbWl6YXRpb24uIFdpdGgKLSAgLU8sIG9uZSBsaWJwbmcgdGVzdCBmYWlscy4gVGhlIHRlc3Qgd29ya3MgaW4gMzIgYml0IG1vZGUgKHdpdGggdGhlIC1uMzIKLSAgY29tcGlsZXIgZmxhZykuIFRoZSBjb21waWxlciBidWcgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gU0dJLgotCi0tIHpsaWIgZG9lc24ndCB3b3JrIHdpdGggZ2NjIDIuNi4zIG9uIGEgREVDIDMwMDAvMzAwTFggdW5kZXIgT1NGLzEgMi4xIGl0IHdvcmtzCi0gIHdoZW4gY29tcGlsZWQgd2l0aCBjYy4KLQotLSBPbiBEaWdpdGFsIFVuaXggNC4wRCAoZm9ybWVseSBPU0YvMSkgb24gQWxwaGFTZXJ2ZXIsIHRoZSBjYyBvcHRpb24gLXN0ZDEgaXMKLSAgbmVjZXNzYXJ5IHRvIGdldCBnenByaW50ZiB3b3JraW5nIGNvcnJlY3RseS4gVGhpcyBpcyBkb25lIGJ5IGNvbmZpZ3VyZS4KLQotLSB6bGliIGRvZXNuJ3Qgd29yayBvbiBIUC1VWCA5LjA1IHdpdGggc29tZSB2ZXJzaW9ucyBvZiAvYmluL2NjLiBJdCB3b3JrcyB3aXRoCi0gIG90aGVyIGNvbXBpbGVycy4gVXNlICJtYWtlIHRlc3QiIHRvIGNoZWNrIHlvdXIgY29tcGlsZXIuCi0KLS0gZ3pkb3BlbiBpcyBub3Qgc3VwcG9ydGVkIG9uIFJJU0NPUywgQkVPUyBhbmQgYnkgc29tZSBNYWMgY29tcGlsZXJzLgotCi0tIEZvciBQYWxtT3MsIHNlZSBodHRwOi8vcGFsbXpsaWIuc291cmNlZm9yZ2UubmV0LwotCi0tIFdoZW4gYnVpbGRpbmcgYSBzaGFyZWQsIGkuZS4gZHluYW1pYyBsaWJyYXJ5IG9uIE1hYyBPUyBYLCB0aGUgbGlicmFyeSBtdXN0IGJlCi0gIGluc3RhbGxlZCBiZWZvcmUgdGVzdGluZyAoZG8gIm1ha2UgaW5zdGFsbCIgYmVmb3JlICJtYWtlIHRlc3QiKSwgc2luY2UgdGhlCi0gIGxpYnJhcnkgbG9jYXRpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBsaWJyYXJ5LgotCi0KLUFja25vd2xlZGdtZW50czoKLQotICBUaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieSB6bGliIHdhcyBkZWZpbmVkIGJ5IFBoaWwgS2F0ei4gVGhlIGRlZmxhdGUKLSAgYW5kIHpsaWIgc3BlY2lmaWNhdGlvbnMgd2VyZSB3cml0dGVuIGJ5IEwuIFBldGVyIERldXRzY2guIFRoYW5rcyB0byBhbGwgdGhlCi0gIHBlb3BsZSB3aG8gcmVwb3J0ZWQgcHJvYmxlbXMgYW5kIHN1Z2dlc3RlZCB2YXJpb3VzIGltcHJvdmVtZW50cyBpbiB6bGliOwotICB0aGV5IGFyZSB0b28gbnVtZXJvdXMgdG8gY2l0ZSBoZXJlLgotCi1Db3B5cmlnaHQgbm90aWNlOgotCi0gKEMpIDE5OTUtMjAwNCBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKLSAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQotCi1JZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCB3ZSB3b3VsZCBhcHByZWNpYXRlICpub3QqCi1yZWNlaXZpbmcgbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgdG8gc2lnbi4gVGhlIHNvdXJjZXMgYXJlIHByb3ZpZGVkCi1mb3IgZnJlZSBidXQgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZC4gIFRoZSBsaWJyYXJ5IGhhcyBiZWVuCi1lbnRpcmVseSB3cml0dGVuIGJ5IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXI7IGl0IGRvZXMgbm90Ci1pbmNsdWRlIHRoaXJkLXBhcnR5IGNvZGUuCi0KLUlmIHlvdSByZWRpc3RyaWJ1dGUgbW9kaWZpZWQgc291cmNlcywgd2Ugd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBpbmNsdWRlCi1pbiB0aGUgZmlsZSBDaGFuZ2VMb2cgaGlzdG9yeSBpbmZvcm1hdGlvbiBkb2N1bWVudGluZyB5b3VyIGNoYW5nZXMuIFBsZWFzZQotcmVhZCB0aGUgRkFRIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBkaXN0cmlidXRpb24gb2YgbW9kaWZpZWQgc291cmNlCi12ZXJzaW9ucy4KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9hZGxlcjMyLmMgYi9saWJzL3psaWIvYWRsZXIzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDdiYTI2Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9hZGxlcjMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyogYWRsZXIzMi5jIC0tIGNvbXB1dGUgdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mIGEgZGF0YSBzdHJlYW0KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2RlZmluZSBaTElCX0lOVEVSTkFMCi0jaW5jbHVkZSAiemxpYi5oIgotCi0jZGVmaW5lIEJBU0UgNjU1MjFVTCAgICAvKiBsYXJnZXN0IHByaW1lIHNtYWxsZXIgdGhhbiA2NTUzNiAqLwotI2RlZmluZSBOTUFYIDU1NTIKLS8qIE5NQVggaXMgdGhlIGxhcmdlc3QgbiBzdWNoIHRoYXQgMjU1bihuKzEpLzIgKyAobisxKShCQVNFLTEpIDw9IDJeMzItMSAqLwotCi0jZGVmaW5lIERPMShidWYsaSkgIHthZGxlciArPSAoYnVmKVtpXTsgc3VtMiArPSBhZGxlcjt9Ci0jZGVmaW5lIERPMihidWYsaSkgIERPMShidWYsaSk7IERPMShidWYsaSsxKTsKLSNkZWZpbmUgRE80KGJ1ZixpKSAgRE8yKGJ1ZixpKTsgRE8yKGJ1ZixpKzIpOwotI2RlZmluZSBETzgoYnVmLGkpICBETzQoYnVmLGkpOyBETzQoYnVmLGkrNCk7Ci0jZGVmaW5lIERPMTYoYnVmKSAgIERPOChidWYsMCk7IERPOChidWYsOCk7Ci0KLS8qIHVzZSBOT19ESVZJREUgaWYgeW91ciBwcm9jZXNzb3IgZG9lcyBub3QgZG8gZGl2aXNpb24gaW4gaGFyZHdhcmUgKi8KLSNpZmRlZiBOT19ESVZJREUKLSMgIGRlZmluZSBNT0QoYSkgXAotICAgIGRvIHsgXAotICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxNikpIGEgLT0gKEJBU0UgPDwgMTYpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDE1KSkgYSAtPSAoQkFTRSA8PCAxNSk7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTQpKSBhIC09IChCQVNFIDw8IDE0KTsgXAotICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxMykpIGEgLT0gKEJBU0UgPDwgMTMpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDEyKSkgYSAtPSAoQkFTRSA8PCAxMik7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTEpKSBhIC09IChCQVNFIDw8IDExKTsgXAotICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxMCkpIGEgLT0gKEJBU0UgPDwgMTApOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDkpKSBhIC09IChCQVNFIDw8IDkpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDgpKSBhIC09IChCQVNFIDw8IDgpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDcpKSBhIC09IChCQVNFIDw8IDcpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDYpKSBhIC09IChCQVNFIDw8IDYpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDUpKSBhIC09IChCQVNFIDw8IDUpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDQpKSBhIC09IChCQVNFIDw8IDQpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDMpKSBhIC09IChCQVNFIDw8IDMpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDIpKSBhIC09IChCQVNFIDw8IDIpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDEpKSBhIC09IChCQVNFIDw8IDEpOyBcCi0gICAgICAgIGlmIChhID49IEJBU0UpIGEgLT0gQkFTRTsgXAotICAgIH0gd2hpbGUgKDApCi0jICBkZWZpbmUgTU9ENChhKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDQpKSBhIC09IChCQVNFIDw8IDQpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDMpKSBhIC09IChCQVNFIDw8IDMpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDIpKSBhIC09IChCQVNFIDw8IDIpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDEpKSBhIC09IChCQVNFIDw8IDEpOyBcCi0gICAgICAgIGlmIChhID49IEJBU0UpIGEgLT0gQkFTRTsgXAotICAgIH0gd2hpbGUgKDApCi0jZWxzZQotIyAgZGVmaW5lIE1PRChhKSBhICU9IEJBU0UKLSMgIGRlZmluZSBNT0Q0KGEpIGEgJT0gQkFTRQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVMb25nIFpFWFBPUlQgYWRsZXIzMihhZGxlciwgYnVmLCBsZW4pCi0gICAgdUxvbmcgYWRsZXI7Ci0gICAgY29uc3QgQnl0ZWYgKmJ1ZjsKLSAgICB1SW50IGxlbjsKLXsKLSAgICB1bnNpZ25lZCBsb25nIHN1bTI7Ci0gICAgdW5zaWduZWQgbjsKLQotICAgIC8qIHNwbGl0IEFkbGVyLTMyIGludG8gY29tcG9uZW50IHN1bXMgKi8KLSAgICBzdW0yID0gKGFkbGVyID4+IDE2KSAmIDB4ZmZmZjsKLSAgICBhZGxlciAmPSAweGZmZmY7Ci0KLSAgICAvKiBpbiBjYXNlIHVzZXIgbGlrZXMgZG9pbmcgYSBieXRlIGF0IGEgdGltZSwga2VlcCBpdCBmYXN0ICovCi0gICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgIGFkbGVyICs9IGJ1ZlswXTsKLSAgICAgICAgaWYgKGFkbGVyID49IEJBU0UpCi0gICAgICAgICAgICBhZGxlciAtPSBCQVNFOwotICAgICAgICBzdW0yICs9IGFkbGVyOwotICAgICAgICBpZiAoc3VtMiA+PSBCQVNFKQotICAgICAgICAgICAgc3VtMiAtPSBCQVNFOwotICAgICAgICByZXR1cm4gYWRsZXIgfCAoc3VtMiA8PCAxNik7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbCBBZGxlci0zMiB2YWx1ZSAoZGVmZXJyZWQgY2hlY2sgZm9yIGxlbiA9PSAxIHNwZWVkKSAqLwotICAgIGlmIChidWYgPT0gWl9OVUxMKQotICAgICAgICByZXR1cm4gMUw7Ci0KLSAgICAvKiBpbiBjYXNlIHNob3J0IGxlbmd0aHMgYXJlIHByb3ZpZGVkLCBrZWVwIGl0IHNvbWV3aGF0IGZhc3QgKi8KLSAgICBpZiAobGVuIDwgMTYpIHsKLSAgICAgICAgd2hpbGUgKGxlbi0tKSB7Ci0gICAgICAgICAgICBhZGxlciArPSAqYnVmKys7Ci0gICAgICAgICAgICBzdW0yICs9IGFkbGVyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZGxlciA+PSBCQVNFKQotICAgICAgICAgICAgYWRsZXIgLT0gQkFTRTsKLSAgICAgICAgTU9ENChzdW0yKTsgICAgICAgICAgICAgLyogb25seSBhZGRlZCBzbyBtYW55IEJBU0UncyAqLwotICAgICAgICByZXR1cm4gYWRsZXIgfCAoc3VtMiA8PCAxNik7Ci0gICAgfQotCi0gICAgLyogZG8gbGVuZ3RoIE5NQVggYmxvY2tzIC0tIHJlcXVpcmVzIGp1c3Qgb25lIG1vZHVsbyBvcGVyYXRpb24gKi8KLSAgICB3aGlsZSAobGVuID49IE5NQVgpIHsKLSAgICAgICAgbGVuIC09IE5NQVg7Ci0gICAgICAgIG4gPSBOTUFYIC8gMTY7ICAgICAgICAgIC8qIE5NQVggaXMgZGl2aXNpYmxlIGJ5IDE2ICovCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIERPMTYoYnVmKTsgICAgICAgICAgLyogMTYgc3VtcyB1bnJvbGxlZCAqLwotICAgICAgICAgICAgYnVmICs9IDE2OwotICAgICAgICB9IHdoaWxlICgtLW4pOwotICAgICAgICBNT0QoYWRsZXIpOwotICAgICAgICBNT0Qoc3VtMik7Ci0gICAgfQotCi0gICAgLyogZG8gcmVtYWluaW5nIGJ5dGVzIChsZXNzIHRoYW4gTk1BWCwgc3RpbGwganVzdCBvbmUgbW9kdWxvKSAqLwotICAgIGlmIChsZW4pIHsgICAgICAgICAgICAgICAgICAvKiBhdm9pZCBtb2R1bG9zIGlmIG5vbmUgcmVtYWluaW5nICovCi0gICAgICAgIHdoaWxlIChsZW4gPj0gMTYpIHsKLSAgICAgICAgICAgIGxlbiAtPSAxNjsKLSAgICAgICAgICAgIERPMTYoYnVmKTsKLSAgICAgICAgICAgIGJ1ZiArPSAxNjsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAobGVuLS0pIHsKLSAgICAgICAgICAgIGFkbGVyICs9ICpidWYrKzsKLSAgICAgICAgICAgIHN1bTIgKz0gYWRsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgTU9EKGFkbGVyKTsKLSAgICAgICAgTU9EKHN1bTIpOwotICAgIH0KLQotICAgIC8qIHJldHVybiByZWNvbWJpbmVkIHN1bXMgKi8KLSAgICByZXR1cm4gYWRsZXIgfCAoc3VtMiA8PCAxNik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lKGFkbGVyMSwgYWRsZXIyLCBsZW4yKQotICAgIHVMb25nIGFkbGVyMTsKLSAgICB1TG9uZyBhZGxlcjI7Ci0gICAgel9vZmZfdCBsZW4yOwotewotICAgIHVuc2lnbmVkIGxvbmcgc3VtMTsKLSAgICB1bnNpZ25lZCBsb25nIHN1bTI7Ci0gICAgdW5zaWduZWQgcmVtOwotCi0gICAgLyogdGhlIGRlcml2YXRpb24gb2YgdGhpcyBmb3JtdWxhIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIgKi8KLSAgICByZW0gPSAodW5zaWduZWQpKGxlbjIgJSBCQVNFKTsKLSAgICBzdW0xID0gYWRsZXIxICYgMHhmZmZmOwotICAgIHN1bTIgPSByZW0gKiBzdW0xOwotICAgIE1PRChzdW0yKTsKLSAgICBzdW0xICs9IChhZGxlcjIgJiAweGZmZmYpICsgQkFTRSAtIDE7Ci0gICAgc3VtMiArPSAoKGFkbGVyMSA+PiAxNikgJiAweGZmZmYpICsgKChhZGxlcjIgPj4gMTYpICYgMHhmZmZmKSArIEJBU0UgLSByZW07Ci0gICAgaWYgKHN1bTEgPiBCQVNFKSBzdW0xIC09IEJBU0U7Ci0gICAgaWYgKHN1bTEgPiBCQVNFKSBzdW0xIC09IEJBU0U7Ci0gICAgaWYgKHN1bTIgPiAoQkFTRSA8PCAxKSkgc3VtMiAtPSAoQkFTRSA8PCAxKTsKLSAgICBpZiAoc3VtMiA+IEJBU0UpIHN1bTIgLT0gQkFTRTsKLSAgICByZXR1cm4gc3VtMSB8IChzdW0yIDw8IDE2KTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9hbGdvcml0aG0udHh0IGIvbGlicy96bGliL2FsZ29yaXRobS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMjJkZGUuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2FsZ29yaXRobS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotMS4gQ29tcHJlc3Npb24gYWxnb3JpdGhtIChkZWZsYXRlKQotCi1UaGUgZGVmbGF0aW9uIGFsZ29yaXRobSB1c2VkIGJ5IGd6aXAgKGFsc28gemlwIGFuZCB6bGliKSBpcyBhIHZhcmlhdGlvbiBvZgotTFo3NyAoTGVtcGVsLVppdiAxOTc3LCBzZWUgcmVmZXJlbmNlIGJlbG93KS4gSXQgZmluZHMgZHVwbGljYXRlZCBzdHJpbmdzIGluCi10aGUgaW5wdXQgZGF0YS4gIFRoZSBzZWNvbmQgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBpcyByZXBsYWNlZCBieSBhCi1wb2ludGVyIHRvIHRoZSBwcmV2aW91cyBzdHJpbmcsIGluIHRoZSBmb3JtIG9mIGEgcGFpciAoZGlzdGFuY2UsCi1sZW5ndGgpLiAgRGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIDMySyBieXRlcywgYW5kIGxlbmd0aHMgYXJlIGxpbWl0ZWQKLXRvIDI1OCBieXRlcy4gV2hlbiBhIHN0cmluZyBkb2VzIG5vdCBvY2N1ciBhbnl3aGVyZSBpbiB0aGUgcHJldmlvdXMKLTMySyBieXRlcywgaXQgaXMgZW1pdHRlZCBhcyBhIHNlcXVlbmNlIG9mIGxpdGVyYWwgYnl0ZXMuICAoSW4gdGhpcwotZGVzY3JpcHRpb24sIGBzdHJpbmcnIG11c3QgYmUgdGFrZW4gYXMgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGJ5dGVzLAotYW5kIGlzIG5vdCByZXN0cmljdGVkIHRvIHByaW50YWJsZSBjaGFyYWN0ZXJzLikKLQotTGl0ZXJhbHMgb3IgbWF0Y2ggbGVuZ3RocyBhcmUgY29tcHJlc3NlZCB3aXRoIG9uZSBIdWZmbWFuIHRyZWUsIGFuZAotbWF0Y2ggZGlzdGFuY2VzIGFyZSBjb21wcmVzc2VkIHdpdGggYW5vdGhlciB0cmVlLiBUaGUgdHJlZXMgYXJlIHN0b3JlZAotaW4gYSBjb21wYWN0IGZvcm0gYXQgdGhlIHN0YXJ0IG9mIGVhY2ggYmxvY2suIFRoZSBibG9ja3MgY2FuIGhhdmUgYW55Ci1zaXplIChleGNlcHQgdGhhdCB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciBvbmUgYmxvY2sgbXVzdCBmaXQgaW4KLWF2YWlsYWJsZSBtZW1vcnkpLiBBIGJsb2NrIGlzIHRlcm1pbmF0ZWQgd2hlbiBkZWZsYXRlKCkgZGV0ZXJtaW5lcyB0aGF0Ci1pdCB3b3VsZCBiZSB1c2VmdWwgdG8gc3RhcnQgYW5vdGhlciBibG9jayB3aXRoIGZyZXNoIHRyZWVzLiAoVGhpcyBpcwotc29tZXdoYXQgc2ltaWxhciB0byB0aGUgYmVoYXZpb3Igb2YgTFpXLWJhc2VkIF9jb21wcmVzc18uKQotCi1EdXBsaWNhdGVkIHN0cmluZ3MgYXJlIGZvdW5kIHVzaW5nIGEgaGFzaCB0YWJsZS4gQWxsIGlucHV0IHN0cmluZ3Mgb2YKLWxlbmd0aCAzIGFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZS4gQSBoYXNoIGluZGV4IGlzIGNvbXB1dGVkIGZvcgotdGhlIG5leHQgMyBieXRlcy4gSWYgdGhlIGhhc2ggY2hhaW4gZm9yIHRoaXMgaW5kZXggaXMgbm90IGVtcHR5LCBhbGwKLXN0cmluZ3MgaW4gdGhlIGNoYWluIGFyZSBjb21wYXJlZCB3aXRoIHRoZSBjdXJyZW50IGlucHV0IHN0cmluZywgYW5kCi10aGUgbG9uZ2VzdCBtYXRjaCBpcyBzZWxlY3RlZC4KLQotVGhlIGhhc2ggY2hhaW5zIGFyZSBzZWFyY2hlZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdHJpbmdzLCB0bwotZmF2b3Igc21hbGwgZGlzdGFuY2VzIGFuZCB0aHVzIHRha2UgYWR2YW50YWdlIG9mIHRoZSBIdWZmbWFuIGVuY29kaW5nLgotVGhlIGhhc2ggY2hhaW5zIGFyZSBzaW5nbHkgbGlua2VkLiBUaGVyZSBhcmUgbm8gZGVsZXRpb25zIGZyb20gdGhlCi1oYXNoIGNoYWlucywgdGhlIGFsZ29yaXRobSBzaW1wbHkgZGlzY2FyZHMgbWF0Y2hlcyB0aGF0IGFyZSB0b28gb2xkLgotCi1UbyBhdm9pZCBhIHdvcnN0LWNhc2Ugc2l0dWF0aW9uLCB2ZXJ5IGxvbmcgaGFzaCBjaGFpbnMgYXJlIGFyYml0cmFyaWx5Ci10cnVuY2F0ZWQgYXQgYSBjZXJ0YWluIGxlbmd0aCwgZGV0ZXJtaW5lZCBieSBhIHJ1bnRpbWUgb3B0aW9uIChsZXZlbAotcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0KS4gU28gZGVmbGF0ZSgpIGRvZXMgbm90IGFsd2F5cyBmaW5kIHRoZSBsb25nZXN0Ci1wb3NzaWJsZSBtYXRjaCBidXQgZ2VuZXJhbGx5IGZpbmRzIGEgbWF0Y2ggd2hpY2ggaXMgbG9uZyBlbm91Z2guCi0KLWRlZmxhdGUoKSBhbHNvIGRlZmVycyB0aGUgc2VsZWN0aW9uIG9mIG1hdGNoZXMgd2l0aCBhIGxhenkgZXZhbHVhdGlvbgotbWVjaGFuaXNtLiBBZnRlciBhIG1hdGNoIG9mIGxlbmd0aCBOIGhhcyBiZWVuIGZvdW5kLCBkZWZsYXRlKCkgc2VhcmNoZXMgZm9yCi1hIGxvbmdlciBtYXRjaCBhdCB0aGUgbmV4dCBpbnB1dCBieXRlLiBJZiBhIGxvbmdlciBtYXRjaCBpcyBmb3VuZCwgdGhlCi1wcmV2aW91cyBtYXRjaCBpcyB0cnVuY2F0ZWQgdG8gYSBsZW5ndGggb2Ygb25lICh0aHVzIHByb2R1Y2luZyBhIHNpbmdsZQotbGl0ZXJhbCBieXRlKSBhbmQgdGhlIHByb2Nlc3Mgb2YgbGF6eSBldmFsdWF0aW9uIGJlZ2lucyBhZ2Fpbi4gT3RoZXJ3aXNlLAotdGhlIG9yaWdpbmFsIG1hdGNoIGlzIGtlcHQsIGFuZCB0aGUgbmV4dCBtYXRjaCBzZWFyY2ggaXMgYXR0ZW1wdGVkIG9ubHkgTgotc3RlcHMgbGF0ZXIuCi0KLVRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24gaXMgYWxzbyBzdWJqZWN0IHRvIGEgcnVudGltZSBwYXJhbWV0ZXIuIElmCi10aGUgY3VycmVudCBtYXRjaCBpcyBsb25nIGVub3VnaCwgZGVmbGF0ZSgpIHJlZHVjZXMgdGhlIHNlYXJjaCBmb3IgYSBsb25nZXIKLW1hdGNoLCB0aHVzIHNwZWVkaW5nIHVwIHRoZSB3aG9sZSBwcm9jZXNzLiBJZiBjb21wcmVzc2lvbiByYXRpbyBpcyBtb3JlCi1pbXBvcnRhbnQgdGhhbiBzcGVlZCwgZGVmbGF0ZSgpIGF0dGVtcHRzIGEgY29tcGxldGUgc2Vjb25kIHNlYXJjaCBldmVuIGlmCi10aGUgZmlyc3QgbWF0Y2ggaXMgYWxyZWFkeSBsb25nIGVub3VnaC4KLQotVGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGZvciB0aGUgZmFzdGVzdCBjb21wcmVzc2lvbgotbW9kZXMgKGxldmVsIHBhcmFtZXRlciAxIHRvIDMpLiBGb3IgdGhlc2UgZmFzdCBtb2RlcywgbmV3IHN0cmluZ3MKLWFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IHdoZW4gbm8gbWF0Y2ggd2FzIGZvdW5kLCBvcgotd2hlbiB0aGUgbWF0Y2ggaXMgbm90IHRvbyBsb25nLiBUaGlzIGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbwotYnV0IHNhdmVzIHRpbWUgc2luY2UgdGhlcmUgYXJlIGJvdGggZmV3ZXIgaW5zZXJ0aW9ucyBhbmQgZmV3ZXIgc2VhcmNoZXMuCi0KLQotMi4gRGVjb21wcmVzc2lvbiBhbGdvcml0aG0gKGluZmxhdGUpCi0KLTIuMSBJbnRyb2R1Y3Rpb24KLQotVGhlIGtleSBxdWVzdGlvbiBpcyBob3cgdG8gcmVwcmVzZW50IGEgSHVmZm1hbiBjb2RlIChvciBhbnkgcHJlZml4IGNvZGUpIHNvCi10aGF0IHlvdSBjYW4gZGVjb2RlIGZhc3QuICBUaGUgbW9zdCBpbXBvcnRhbnQgY2hhcmFjdGVyaXN0aWMgaXMgdGhhdCBzaG9ydGVyCi1jb2RlcyBhcmUgbXVjaCBtb3JlIGNvbW1vbiB0aGFuIGxvbmdlciBjb2Rlcywgc28gcGF5IGF0dGVudGlvbiB0byBkZWNvZGluZyB0aGUKLXNob3J0IGNvZGVzIGZhc3QsIGFuZCBsZXQgdGhlIGxvbmcgY29kZXMgdGFrZSBsb25nZXIgdG8gZGVjb2RlLgotCi1pbmZsYXRlKCkgc2V0cyB1cCBhIGZpcnN0IGxldmVsIHRhYmxlIHRoYXQgY292ZXJzIHNvbWUgbnVtYmVyIG9mIGJpdHMgb2YKLWlucHV0IGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIGxvbmdlc3QgY29kZS4gIEl0IGdldHMgdGhhdCBtYW55IGJpdHMgZnJvbSB0aGUKLXN0cmVhbSwgYW5kIGxvb2tzIGl0IHVwIGluIHRoZSB0YWJsZS4gIFRoZSB0YWJsZSB3aWxsIHRlbGwgaWYgdGhlIG5leHQKLWNvZGUgaXMgdGhhdCBtYW55IGJpdHMgb3IgbGVzcyBhbmQgaG93IG1hbnksIGFuZCBpZiBpdCBpcywgaXQgd2lsbCB0ZWxsCi10aGUgdmFsdWUsIGVsc2UgaXQgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBsZXZlbCB0YWJsZSBmb3Igd2hpY2ggaW5mbGF0ZSgpCi1ncmFicyBtb3JlIGJpdHMgYW5kIHRyaWVzIHRvIGRlY29kZSBhIGxvbmdlciBjb2RlLgotCi1Ib3cgbWFueSBiaXRzIHRvIG1ha2UgdGhlIGZpcnN0IGxvb2t1cCBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gdGhlIHRpbWUgaXQKLXRha2VzIHRvIGRlY29kZSBhbmQgdGhlIHRpbWUgaXQgdGFrZXMgdG8gYnVpbGQgdGhlIHRhYmxlLiAgSWYgYnVpbGRpbmcgdGhlCi10YWJsZSB0b29rIG5vIHRpbWUgKGFuZCBpZiB5b3UgaGFkIGluZmluaXRlIG1lbW9yeSksIHRoZW4gdGhlcmUgd291bGQgb25seQotYmUgYSBmaXJzdCBsZXZlbCB0YWJsZSB0byBjb3ZlciBhbGwgdGhlIHdheSB0byB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwKLWJ1aWxkaW5nIHRoZSB0YWJsZSBlbmRzIHVwIHRha2luZyBhIGxvdCBsb25nZXIgZm9yIG1vcmUgYml0cyBzaW5jZSBzaG9ydAotY29kZXMgYXJlIHJlcGxpY2F0ZWQgbWFueSB0aW1lcyBpbiBzdWNoIGEgdGFibGUuICBXaGF0IGluZmxhdGUoKSBkb2VzIGlzCi1zaW1wbHkgdG8gbWFrZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGZpcnN0IHRhYmxlIGEgdmFyaWFibGUsIGFuZCAgdGhlbgotdG8gc2V0IHRoYXQgdmFyaWFibGUgZm9yIHRoZSBtYXhpbXVtIHNwZWVkLgotCi1Gb3IgaW5mbGF0ZSwgd2hpY2ggaGFzIDI4NiBwb3NzaWJsZSBjb2RlcyBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIHRyZWUsIHRoZSBzaXplCi1vZiB0aGUgZmlyc3QgdGFibGUgaXMgbmluZSBiaXRzLiAgQWxzbyB0aGUgZGlzdGFuY2UgdHJlZXMgaGF2ZSAzMCBwb3NzaWJsZQotdmFsdWVzLCBhbmQgdGhlIHNpemUgb2YgdGhlIGZpcnN0IHRhYmxlIGlzIHNpeCBiaXRzLiAgTm90ZSB0aGF0IGZvciBlYWNoIG9mCi10aG9zZSBjYXNlcywgdGhlIHRhYmxlIGVuZGVkIHVwIG9uZSBiaXQgbG9uZ2VyIHRoYW4gdGhlIGBgYXZlcmFnZScnIGNvZGUKLWxlbmd0aCwgaS5lLiB0aGUgY29kZSBsZW5ndGggb2YgYW4gYXBwcm94aW1hdGVseSBmbGF0IGNvZGUgd2hpY2ggd291bGQgYmUgYQotbGl0dGxlIG1vcmUgdGhhbiBlaWdodCBiaXRzIGZvciAyODYgc3ltYm9scyBhbmQgYSBsaXR0bGUgbGVzcyB0aGFuIGZpdmUgYml0cwotZm9yIDMwIHN5bWJvbHMuCi0KLQotMi4yIE1vcmUgZGV0YWlscyBvbiB0aGUgaW5mbGF0ZSB0YWJsZSBsb29rdXAKLQotT2ssIHlvdSB3YW50IHRvIGtub3cgd2hhdCB0aGlzIGNsZXZlcmx5IG9iZnVzY2F0ZWQgaW5mbGF0ZSB0cmVlIGFjdHVhbGx5Ci1sb29rcyBsaWtlLiAgWW91IGFyZSBjb3JyZWN0IHRoYXQgaXQncyBub3QgYSBIdWZmbWFuIHRyZWUuICBJdCBpcyBzaW1wbHkgYQotbG9va3VwIHRhYmxlIGZvciB0aGUgZmlyc3QsIGxldCdzIHNheSwgbmluZSBiaXRzIG9mIGEgSHVmZm1hbiBzeW1ib2wuICBUaGUKLXN5bWJvbCBjb3VsZCBiZSBhcyBzaG9ydCBhcyBvbmUgYml0IG9yIGFzIGxvbmcgYXMgMTUgYml0cy4gIElmIGEgcGFydGljdWxhcgotc3ltYm9sIGlzIHNob3J0ZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBzeW1ib2wncyB0cmFuc2xhdGlvbiBpcyBkdXBsaWNhdGVkCi1pbiBhbGwgdGhvc2UgZW50cmllcyB0aGF0IHN0YXJ0IHdpdGggdGhhdCBzeW1ib2wncyBiaXRzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZQotc3ltYm9sIGlzIGZvdXIgYml0cywgdGhlbiBpdCdzIGR1cGxpY2F0ZWQgMzIgdGltZXMgaW4gYSBuaW5lLWJpdCB0YWJsZS4gIElmIGEKLXN5bWJvbCBpcyBuaW5lIGJpdHMgbG9uZywgaXQgYXBwZWFycyBpbiB0aGUgdGFibGUgb25jZS4KLQotSWYgdGhlIHN5bWJvbCBpcyBsb25nZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBlbnRyeSBpbiB0aGUgdGFibGUgcG9pbnRzCi10byBhbm90aGVyIHNpbWlsYXIgdGFibGUgZm9yIHRoZSByZW1haW5pbmcgYml0cy4gIEFnYWluLCB0aGVyZSBhcmUgZHVwbGljYXRlZAotZW50cmllcyBhcyBuZWVkZWQuICBUaGUgaWRlYSBpcyB0aGF0IG1vc3Qgb2YgdGhlIHRpbWUgdGhlIHN5bWJvbCB3aWxsIGJlIHNob3J0Ci1hbmQgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSB0YWJsZSBsb29rIHVwLiAgKFRoYXQncyB3aG9sZSBpZGVhIGJlaGluZCBkYXRhCi1jb21wcmVzc2lvbiBpbiB0aGUgZmlyc3QgcGxhY2UuKSAgRm9yIHRoZSBsZXNzIGZyZXF1ZW50IGxvbmcgc3ltYm9scywgdGhlcmUKLXdpbGwgYmUgdHdvIGxvb2t1cHMuICBJZiB5b3UgaGFkIGEgY29tcHJlc3Npb24gbWV0aG9kIHdpdGggcmVhbGx5IGxvbmcKLXN5bWJvbHMsIHlvdSBjb3VsZCBoYXZlIGFzIG1hbnkgbGV2ZWxzIG9mIGxvb2t1cHMgYXMgaXMgZWZmaWNpZW50LiAgRm9yCi1pbmZsYXRlLCB0d28gaXMgZW5vdWdoLgotCi1TbyBhIHRhYmxlIGVudHJ5IGVpdGhlciBwb2ludHMgdG8gYW5vdGhlciB0YWJsZSAoaW4gd2hpY2ggY2FzZSBuaW5lIGJpdHMgaW4KLXRoZSBhYm92ZSBleGFtcGxlIGFyZSBnb2JibGVkKSwgb3IgaXQgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIGZvciB0aGUgc3ltYm9sCi1hbmQgdGhlIG51bWJlciBvZiBiaXRzIHRvIGdvYmJsZS4gIFRoZW4geW91IHN0YXJ0IGFnYWluIHdpdGggdGhlIG5leHQKLXVuZ29iYmxlZCBiaXQuCi0KLVlvdSBtYXkgd29uZGVyOiB3aHkgbm90IGp1c3QgaGF2ZSBvbmUgbG9va3VwIHRhYmxlIGZvciBob3cgZXZlciBtYW55IGJpdHMgdGhlCi1sb25nZXN0IHN5bWJvbCBpcz8gIFRoZSByZWFzb24gaXMgdGhhdCBpZiB5b3UgZG8gdGhhdCwgeW91IGVuZCB1cCBzcGVuZGluZwotbW9yZSB0aW1lIGZpbGxpbmcgaW4gZHVwbGljYXRlIHN5bWJvbCBlbnRyaWVzIHRoYW4geW91IGRvIGFjdHVhbGx5IGRlY29kaW5nLgotQXQgbGVhc3QgZm9yIGRlZmxhdGUncyBvdXRwdXQgdGhhdCBnZW5lcmF0ZXMgbmV3IHRyZWVzIGV2ZXJ5IHNldmVyYWwgMTAncyBvZgota2J5dGVzLiAgWW91IGNhbiBpbWFnaW5lIHRoYXQgZmlsbGluZyBpbiBhIDJeMTUgZW50cnkgdGFibGUgZm9yIGEgMTUtYml0IGNvZGUKLXdvdWxkIHRha2UgdG9vIGxvbmcgaWYgeW91J3JlIG9ubHkgZGVjb2Rpbmcgc2V2ZXJhbCB0aG91c2FuZCBzeW1ib2xzLiAgQXQgdGhlCi1vdGhlciBleHRyZW1lLCB5b3UgY291bGQgbWFrZSBhIG5ldyB0YWJsZSBmb3IgZXZlcnkgYml0IGluIHRoZSBjb2RlLiAgSW4gZmFjdCwKLXRoYXQncyBlc3NlbnRpYWxseSBhIEh1ZmZtYW4gdHJlZS4gIEJ1dCB0aGVuIHlvdSBzcGVuZCB0d28gbXVjaCB0aW1lCi10cmF2ZXJzaW5nIHRoZSB0cmVlIHdoaWxlIGRlY29kaW5nLCBldmVuIGZvciBzaG9ydCBzeW1ib2xzLgotCi1TbyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBmaXJzdCBsb29rdXAgdGFibGUgaXMgYSB0cmFkZSBvZiB0aGUgdGltZSB0bwotZmlsbCBvdXQgdGhlIHRhYmxlIHZzLiB0aGUgdGltZSBzcGVudCBsb29raW5nIGF0IHRoZSBzZWNvbmQgbGV2ZWwgYW5kIGFib3ZlIG9mCi10aGUgdGFibGUuCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSwgc2NhbGVkIGRvd246Ci0KLVRoZSBjb2RlIGJlaW5nIGRlY29kZWQsIHdpdGggMTAgc3ltYm9scywgZnJvbSAxIHRvIDYgYml0cyBsb25nOgotCi1BOiAwCi1COiAxMAotQzogMTEwMAotRDogMTEwMTAKLUU6IDExMDExCi1GOiAxMTEwMAotRzogMTExMDEKLUg6IDExMTEwCi1JOiAxMTExMTAKLUo6IDExMTExMQotCi1MZXQncyBtYWtlIHRoZSBmaXJzdCB0YWJsZSB0aHJlZSBiaXRzIGxvbmcgKGVpZ2h0IGVudHJpZXMpOgotCi0wMDA6IEEsMQotMDAxOiBBLDEKLTAxMDogQSwxCi0wMTE6IEEsMQotMTAwOiBCLDIKLTEwMTogQiwyCi0xMTA6IC0+IHRhYmxlIFggKGdvYmJsZSAzIGJpdHMpCi0xMTE6IC0+IHRhYmxlIFkgKGdvYmJsZSAzIGJpdHMpCi0KLUVhY2ggZW50cnkgaXMgd2hhdCB0aGUgYml0cyBkZWNvZGUgYXMgYW5kIGhvdyBtYW55IGJpdHMgdGhhdCBpcywgaS5lLiBob3cKLW1hbnkgYml0cyB0byBnb2JibGUuICBPciB0aGUgZW50cnkgcG9pbnRzIHRvIGFub3RoZXIgdGFibGUsIHdpdGggdGhlIG51bWJlciBvZgotYml0cyB0byBnb2JibGUgaW1wbGljaXQgaW4gdGhlIHNpemUgb2YgdGhlIHRhYmxlLgotCi1UYWJsZSBYIGlzIHR3byBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMCBpcyBmaXZlIGJpdHMKLWxvbmc6Ci0KLTAwOiBDLDEKLTAxOiBDLDEKLTEwOiBELDIKLTExOiBFLDIKLQotVGFibGUgWSBpcyB0aHJlZSBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMSBpcyBzaXgKLWJpdHMgbG9uZzoKLQotMDAwOiBGLDIKLTAwMTogRiwyCi0wMTA6IEcsMgotMDExOiBHLDIKLTEwMDogSCwyCi0xMDE6IEgsMgotMTEwOiBJLDMKLTExMTogSiwzCi0KLVNvIHdoYXQgd2UgaGF2ZSBoZXJlIGFyZSB0aHJlZSB0YWJsZXMgd2l0aCBhIHRvdGFsIG9mIDIwIGVudHJpZXMgdGhhdCBoYWQgdG8KLWJlIGNvbnN0cnVjdGVkLiAgVGhhdCdzIGNvbXBhcmVkIHRvIDY0IGVudHJpZXMgZm9yIGEgc2luZ2xlIHRhYmxlLiAgT3IKLWNvbXBhcmVkIHRvIDE2IGVudHJpZXMgZm9yIGEgSHVmZm1hbiB0cmVlIChzaXggdHdvIGVudHJ5IHRhYmxlcyBhbmQgb25lIGZvdXIKLWVudHJ5IHRhYmxlKS4gIEFzc3VtaW5nIHRoYXQgdGhlIGNvZGUgaWRlYWxseSByZXByZXNlbnRzIHRoZSBwcm9iYWJpbGl0eSBvZgotdGhlIHN5bWJvbHMsIGl0IHRha2VzIG9uIHRoZSBhdmVyYWdlIDEuMjUgbG9va3VwcyBwZXIgc3ltYm9sLiAgVGhhdCdzIGNvbXBhcmVkCi10byBvbmUgbG9va3VwIGZvciB0aGUgc2luZ2xlIHRhYmxlLCBvciAxLjY2IGxvb2t1cHMgcGVyIHN5bWJvbCBmb3IgdGhlCi1IdWZmbWFuIHRyZWUuCi0KLVRoZXJlLCBJIHRoaW5rIHRoYXQgZ2l2ZXMgeW91IGEgcGljdHVyZSBvZiB3aGF0J3MgZ29pbmcgb24uICBGb3IgaW5mbGF0ZSwgdGhlCi1tZWFuaW5nIG9mIGEgcGFydGljdWxhciBzeW1ib2wgaXMgb2Z0ZW4gbW9yZSB0aGFuIGp1c3QgYSBsZXR0ZXIuICBJdCBjYW4gYmUgYQotYnl0ZSAoYSAibGl0ZXJhbCIpLCBvciBpdCBjYW4gYmUgZWl0aGVyIGEgbGVuZ3RoIG9yIGEgZGlzdGFuY2Ugd2hpY2gKLWluZGljYXRlcyBhIGJhc2UgdmFsdWUgYW5kIGEgbnVtYmVyIG9mIGJpdHMgdG8gZmV0Y2ggYWZ0ZXIgdGhlIGNvZGUgdGhhdCBpcwotYWRkZWQgdG8gdGhlIGJhc2UgdmFsdWUuICBPciBpdCBtaWdodCBiZSB0aGUgc3BlY2lhbCBlbmQtb2YtYmxvY2sgY29kZS4gIFRoZQotZGF0YSBzdHJ1Y3R1cmVzIGNyZWF0ZWQgaW4gaW5mdHJlZXMuYyB0cnkgdG8gZW5jb2RlIGFsbCB0aGF0IGluZm9ybWF0aW9uCi1jb21wYWN0bHkgaW4gdGhlIHRhYmxlcy4KLQotCi1KZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCi1qbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0KLQotUmVmZXJlbmNlczoKLQotW0xaNzddIFppdiBKLiwgTGVtcGVsIEEuLCBgYEEgVW5pdmVyc2FsIEFsZ29yaXRobSBmb3IgU2VxdWVudGlhbCBEYXRhCi1Db21wcmVzc2lvbiwnJyBJRUVFIFRyYW5zYWN0aW9ucyBvbiBJbmZvcm1hdGlvbiBUaGVvcnksIFZvbC4gMjMsIE5vLiAzLAotcHAuIDMzNy0zNDMuCi0KLWBgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24nJyBhdmFpbGFibGUgaW4KLWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTEudHh0CmRpZmYgLS1naXQgYS9saWJzL3psaWIvYW1pZ2EvTWFrZWZpbGUucHVwIGIvbGlicy96bGliL2FtaWdhL01ha2VmaWxlLnB1cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3ZTE1NS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvYW1pZ2EvTWFrZWZpbGUucHVwCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyBBbWlnYSBwb3dlclVQIChUTSkgTWFrZWZpbGUKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBhbmQgU0FTIEMgVjYuNTgvNy4wMCBQUEMgY29tcGlsZXIKLSMgQ29weXJpZ2h0IChDKSAxOTk4IGJ5IEFuZHJlYXMgUi4gS2xlaW5lcnQKLQotTElCTkFNRQk9IGxpYnppcC5hCi0KLUNDCT0gc2NwcGMKLUNGTEFHUwk9IE5PU1RLQ0hLIE5PU0lOVCBPUFRJTUlaRSBPUFRHTyBPUFRQRUVQIE9QVElOTE9DQUwgT1BUSU5MIFwKLQkgIE9QVExPT1AgT1BUUkRFUD04IE9QVERFUD04IE9QVENPTVA9OCBOT1ZFUgotQVIJPSBwcGMtYW1pZ2Fvcy1hciBjcgotUkFOTElCCT0gcHBjLWFtaWdhb3MtcmFubGliCi1MRAk9IHBwYy1hbWlnYW9zLWxkIC1yCi1MREZMQUdTCT0gLW8KLUxETElCUwk9IExJQjpzY3BwYy5hIExJQjplbmQubwotUk0JPSBkZWxldGUgcXVpZXQKLQotT0JKUyA9IGFkbGVyMzIubyBjb21wcmVzcy5vIGNyYzMyLm8gZ3ppby5vIHVuY29tcHIubyBkZWZsYXRlLm8gdHJlZXMubyBcCi0gICAgICAgenV0aWwubyBpbmZsYXRlLm8gaW5mYmFjay5vIGluZnRyZWVzLm8gaW5mZmFzdC5vCi0KLVRFU1RfT0JKUyA9IGV4YW1wbGUubyBtaW5pZ3ppcC5vCi0KLWFsbDogZXhhbXBsZSBtaW5pZ3ppcAotCi1jaGVjazogdGVzdAotdGVzdDogYWxsCi0JZXhhbXBsZQotCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCi0KLSQoTElCTkFNRSk6ICQoT0JKUykKLQkkKEFSKSAkQCAkKE9CSlMpCi0JLSQoUkFOTElCKSAkQAotCi1leGFtcGxlOiBleGFtcGxlLm8gJChMSUJOQU1FKQotCSQoTEQpICQoTERGTEFHUykgJEAgTElCOmNfcHBjLm8gJEAubyAkKExJQk5BTUUpICQoTERMSUJTKQotCi1taW5pZ3ppcDogbWluaWd6aXAubyAkKExJQk5BTUUpCi0JJChMRCkgJChMREZMQUdTKSAkQCBMSUI6Y19wcGMubyAkQC5vICQoTElCTkFNRSkgJChMRExJQlMpCi0KLW1vc3RseWNsZWFuOiBjbGVhbgotY2xlYW46Ci0JJChSTSkgKi5vIGV4YW1wbGUgbWluaWd6aXAgJChMSUJOQU1FKSBmb28uZ3oKLQotemlwOgotCXppcCAtdWw5IHpsaWIgUkVBRE1FIENoYW5nZUxvZyBNYWtlZmlsZSBNYWtlPz8/Py4/Pz8gTWFrZWZpbGUuPz8gXAotCSAgZGVzY3JpcC5tbXMgKi5bY2hdCi0KLXRnejoKLQljZCAuLjsgdGFyIGNmeiB6bGliL3psaWIudGd6IHpsaWIvUkVBRE1FIHpsaWIvQ2hhbmdlTG9nIHpsaWIvTWFrZWZpbGUgXAotCSAgemxpYi9NYWtlPz8/Py4/Pz8gemxpYi9NYWtlZmlsZS4/PyB6bGliL2Rlc2NyaXAubW1zIHpsaWIvKi5bY2hdCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotYWRsZXIzMi5vOiB6bGliLmggemNvbmYuaAotY29tcHJlc3MubzogemxpYi5oIHpjb25mLmgKLWNyYzMyLm86IGNyYzMyLmggemxpYi5oIHpjb25mLmgKLWRlZmxhdGUubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWV4YW1wbGUubzogemxpYi5oIHpjb25mLmgKLWd6aW8ubzogenV0aWwuaCB6bGliLmggemNvbmYuaAotaW5mZmFzdC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAotaW5mbGF0ZS5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAotaW5mYmFjay5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAotaW5mdHJlZXMubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi1taW5pZ3ppcC5vOiB6bGliLmggemNvbmYuaAotdHJlZXMubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmggdHJlZXMuaAotdW5jb21wci5vOiB6bGliLmggemNvbmYuaAotenV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaApkaWZmIC0tZ2l0IGEvbGlicy96bGliL2FtaWdhL01ha2VmaWxlLnNhcyBiL2xpYnMvemxpYi9hbWlnYS9NYWtlZmlsZS5zYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NmVmNDguLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2FtaWdhL01ha2VmaWxlLnNhcworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSMgU01ha2VmaWxlIGZvciB6bGliCi0jIE1vZGlmaWVkIGZyb20gdGhlIHN0YW5kYXJkIFVOSVggTWFrZWZpbGUgQ29weXJpZ2h0IEplYW4tbG91cCBHYWlsbHkKLSMgT3NtYSBBaHZlbmxhbXBpIDxPc21hLkFodmVubGFtcGlAaHV0LmZpPgotIyBBbWlnYSwgU0FTL0MgNi41NiAmIFNtYWtlCi0KLUNDPXNjCi1DRkxBR1M9T1BUCi0jQ0ZMQUdTPU9QVCBDUFU9NjgwMzAKLSNDRkxBR1M9REVCVUc9TElORQotTERGTEFHUz1MSUIgei5saWIKLQotU0NPUFRJT05TPU9QVFNDSEVEIE9QVElOTElORSBPUFRBTElBUyBPUFRUSU1FIE9QVElOTE9DQUwgU1RSTUVSR0UgXAotICAgICAgIE5PSUNPTlMgUEFSTVM9Qk9USCBOT1NUQUNLQ0hFQ0sgVVRJTExJQiBOT1ZFUlNJT04gRVJST1JSRVhYIFwKLSAgICAgICBERUY9UE9TVElOQwotCi1PQkpTID0gYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBnemlvLm8gdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIFwKLSAgICAgICB6dXRpbC5vIGluZmxhdGUubyBpbmZiYWNrLm8gaW5mdHJlZXMubyBpbmZmYXN0Lm8KLQotVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KLQotYWxsOiBTQ09QVElPTlMgZXhhbXBsZSBtaW5pZ3ppcAotCi1jaGVjazogdGVzdAotdGVzdDogYWxsCi0JZXhhbXBsZQotCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCi0KLWluc3RhbGw6IHoubGliCi0JY29weSBjbG9uZSB6bGliLmggemNvbmYuaCBJTkNMVURFOgotCWNvcHkgY2xvbmUgei5saWIgTElCOgotCi16LmxpYjogJChPQkpTKQotCW9tbCB6LmxpYiByICQoT0JKUykKLQotZXhhbXBsZTogZXhhbXBsZS5vIHoubGliCi0JJChDQykgJChDRkxBR1MpIExJTksgVE8gJEAgZXhhbXBsZS5vICQoTERGTEFHUykKLQotbWluaWd6aXA6IG1pbmlnemlwLm8gei5saWIKLQkkKENDKSAkKENGTEFHUykgTElOSyBUTyAkQCBtaW5pZ3ppcC5vICQoTERGTEFHUykKLQotbW9zdGx5Y2xlYW46IGNsZWFuCi1jbGVhbjoKLQktZGVsZXRlIGZvcmNlIHF1aWV0IGV4YW1wbGUgbWluaWd6aXAgKi5vIHoubGliIGZvby5neiAqLmxuayBTQ09QVElPTlMKLQotU0NPUFRJT05TOiBNYWtlZmlsZS5zYXMKLQljb3B5IHRvICRAIDxmcm9tIDwKLSQoU0NPUFRJT05TKQotPAotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLWFkbGVyMzIubzogemxpYi5oIHpjb25mLmgKLWNvbXByZXNzLm86IHpsaWIuaCB6Y29uZi5oCi1jcmMzMi5vOiBjcmMzMi5oIHpsaWIuaCB6Y29uZi5oCi1kZWZsYXRlLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1leGFtcGxlLm86IHpsaWIuaCB6Y29uZi5oCi1nemlvLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWluZmZhc3QubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZmJhY2subzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKLWluZnRyZWVzLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotbWluaWd6aXAubzogemxpYi5oIHpjb25mLmgKLXRyZWVzLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHRyZWVzLmgKLXVuY29tcHIubzogemxpYi5oIHpjb25mLmgKLXp1dGlsLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9hczQwMC9ibmRzcmMgYi9saWJzL3psaWIvYXM0MDAvYm5kc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Y5NGJiLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9hczQwMC9ibmRzcmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotU1RSUEdNRVhQIFBHTUxWTCgqQ1VSUkVOVCkgU0lHTkFUVVJFKCdaTElCJykKLQotLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLwotLyogICBWZXJzaW9uIDEuMS4zIGVudHJ5IHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICpNT0RVTEUgICAgICBBRExFUjMyICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRVhQT1JUIFNZTUJPTCgiYWRsZXIzMiIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIENPTVBSRVNTICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJjb21wcmVzcyIpCi0gIEVYUE9SVCBTWU1CT0woImNvbXByZXNzMiIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIENSQzMyICAgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJjcmMzMiIpCi0gIEVYUE9SVCBTWU1CT0woImdldF9jcmNfdGFibGUiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICpNT0RVTEUgICAgICBERUZMQVRFICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZSIpCi0gIEVYUE9SVCBTWU1CT0woImRlZmxhdGVFbmQiKQotICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlU2V0RGljdGlvbmFyeSIpCi0gIEVYUE9SVCBTWU1CT0woImRlZmxhdGVDb3B5IikKLSAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZVJlc2V0IikKLSAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZVBhcmFtcyIpCi0gIEVYUE9SVCBTWU1CT0woImRlZmxhdGVQcmltZSIpCi0gIEVYUE9SVCBTWU1CT0woImRlZmxhdGVJbml0XyIpCi0gIEVYUE9SVCBTWU1CT0woImRlZmxhdGVJbml0Ml8iKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICpNT0RVTEUgICAgICBHWklPICAgICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRVhQT1JUIFNZTUJPTCgiZ3pvcGVuIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pkb3BlbiIpCi0gIEVYUE9SVCBTWU1CT0woImd6c2V0cGFyYW1zIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pyZWFkIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3p3cml0ZSIpCi0gIEVYUE9SVCBTWU1CT0woImd6cHJpbnRmIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pwdXRzIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pnZXRzIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pwdXRjIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pnZXRjIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3pmbHVzaCIpCi0gIEVYUE9SVCBTWU1CT0woImd6c2VlayIpCi0gIEVYUE9SVCBTWU1CT0woImd6cmV3aW5kIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3p0ZWxsIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3plb2YiKQotICBFWFBPUlQgU1lNQk9MKCJnemNsb3NlIikKLSAgRVhQT1JUIFNZTUJPTCgiZ3plcnJvciIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIElORkxBVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlIikKLSAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZUVuZCIpCi0gIEVYUE9SVCBTWU1CT0woImluZmxhdGVTZXREaWN0aW9uYXJ5IikKLSAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVN5bmMiKQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlUmVzZXQiKQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlSW5pdF8iKQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlSW5pdDJfIikKLSAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVN5bmNQb2ludCIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIFVOQ09NUFIgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJ1bmNvbXByZXNzIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgWlVUSUwgICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woInpsaWJWZXJzaW9uIikKLSAgRVhQT1JUIFNZTUJPTCgiekVycm9yIikKLQotLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLwotLyogICBWZXJzaW9uIDEuMi4xIGFkZGl0aW9uYWwgZW50cnkgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICpNT0RVTEUgICAgICBDT01QUkVTUyAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRVhQT1JUIFNZTUJPTCgiY29tcHJlc3NCb3VuZCIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgKk1PRFVMRSAgICAgIERFRkxBVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlQm91bmQiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICpNT0RVTEUgICAgICBHWklPICAgICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRVhQT1JUIFNZTUJPTCgiZ3p1bmdldGMiKQotICBFWFBPUlQgU1lNQk9MKCJnemNsZWFyZXJyIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgSU5GQkFDSyAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woImluZmxhdGVCYWNrIikKLSAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZUJhY2tFbmQiKQotICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlQmFja0luaXRfIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgSU5GTEFURSAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woImluZmxhdGVDb3B5IikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAqTU9EVUxFICAgICAgWlVUSUwgICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEVYUE9SVCBTWU1CT0woInpsaWJDb21waWxlRmxhZ3MiKQotCi1FTkRQR01FWFAKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9hczQwMC9jb21waWxlLmNscCBiL2xpYnMvemxpYi9hczQwMC9jb21waWxlLmNscApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1NDk1MS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvYXM0MDAvY29tcGlsZS5jbHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWkxJQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENvbXBpbGUgc291cmNlcyBpbnRvIG1vZHVsZXMgYW5kIGxpbmsgdGhlbSBpbnRvIGEgc2VydmljZSBwcm9ncmFtLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgIFBHTQotCi0vKiAgICAgIENvbmZpZ3VyYXRpb24gYWRqdXN0YWJsZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgRENMICAgICAgICBWQVIoJlNSQ0xJQikgVFlQRSgqQ0hBUikgTEVOKDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFKCdaTElCJykgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlIGxpYnJhcnkuICovCi0gICAgICAgICAgICAgRENMICAgICAgICBWQVIoJlNSQ0ZJTEUpIFRZUEUoKkNIQVIpIExFTigxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnU09VUkNFUycpICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSBtZW1iZXIgZmlsZS4gKi8KLSAgICAgICAgICAgICBEQ0wgICAgICAgIFZBUigmQ1RMRklMRSkgVFlQRSgqQ0hBUikgTEVOKDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFKCdUT09MUycpICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBtZW1iZXIgZmlsZS4gKi8KLQotICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZNT0RMSUIpIFRZUEUoKkNIQVIpIExFTigxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnWkxJQicpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vZHVsZSBsaWJyYXJ5LiAqLwotCi0gICAgICAgICAgICAgRENMICAgICAgICBWQVIoJlNSVkxJQikgVFlQRSgqQ0hBUikgTEVOKDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFKCdMR1BMJykgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VydmljZSBwcm9ncmFtIGxpYnJhcnkuICovCi0KLSAgICAgICAgICAgICBEQ0wgICAgICAgIFZBUigmQ0ZMQUdTKSBUWVBFKCpDSEFSKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFKCdPUFRJTUlaRSg0MCknKSAgICAgICAgICAgICAgICAgLyogQ29tcGlsZSBvcHRpb25zLiAqLwotCi0KLS8qICAgICAgV29ya2luZyBzdG9yYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICBEQ0wgICAgICAgIFZBUigmQ01ETEVOKSBUWVBFKCpERUMpIExFTigxNSA1KSBWQUxVRSgzMDApICAgIC8qIENvbW1hbmQgbGVuZ3RoLiAqLwotICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZDTUQpIFRZUEUoKkNIQVIpIExFTig1MTIpCi0KLQotLyogICAgICBDb21waWxlIHNvdXJjZXMgaW50byBtb2R1bGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCdDUlRDTU9EIE1PRFVMRSgnICpUQ0FUICZNT0RMSUIgKlRDQVQgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICcvQURMRVIzMikgICAgICAgICAgICAgICBTUkNGSUxFKCcgKlRDQVQgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAmU1JDTElCICpUQ0FUICcvJyAqVENBVCAmU1JDRklMRSAqVENBVCAgICAgICAgICAgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJykgU1lTSUZDT1BUKCpJRlNJTyknICpCQ0FUICZDRkxBR1MpCi0gICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCi0KLSAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgnQ1JUQ01PRCBNT0RVTEUoJyAqVENBVCAmTU9ETElCICpUQ0FUICArCi0gICAgICAgICAgICAgICAgICAgICAgICAnL0NPTVBSRVNTKSAgICAgICAgICAgICAgU1JDRklMRSgnICpUQ0FUICAgICAgICAgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJlNSQ0xJQiAqVENBVCAnLycgKlRDQVQgJlNSQ0ZJTEUgKlRDQVQgICAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICcpIFNZU0lGQ09QVCgqSUZTSU8pJyAqQkNBVCAmQ0ZMQUdTKQotICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJ0NSVENNT0QgTU9EVUxFKCcgKlRDQVQgJk1PRExJQiAqVENBVCAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJy9DUkMzMikgICAgICAgICAgICAgICAgIFNSQ0ZJTEUoJyAqVENBVCAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICZTUkNMSUIgKlRDQVQgJy8nICpUQ0FUICZTUkNGSUxFICpUQ0FUICAgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAnKSBTWVNJRkNPUFQoKklGU0lPKScgKkJDQVQgJkNGTEFHUykKLSAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKLQotICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCdDUlRDTU9EIE1PRFVMRSgnICpUQ0FUICZNT0RMSUIgKlRDQVQgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICcvREVGTEFURSkgICAgICAgICAgICAgICBTUkNGSUxFKCcgKlRDQVQgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAmU1JDTElCICpUQ0FUICcvJyAqVENBVCAmU1JDRklMRSAqVENBVCAgICAgICAgICAgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJykgU1lTSUZDT1BUKCpJRlNJTyknICpCQ0FUICZDRkxBR1MpCi0gICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCi0KLSAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgnQ1JUQ01PRCBNT0RVTEUoJyAqVENBVCAmTU9ETElCICpUQ0FUICArCi0gICAgICAgICAgICAgICAgICAgICAgICAnL0daSU8pICAgICAgICAgICAgICAgICAgU1JDRklMRSgnICpUQ0FUICAgICAgICAgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJlNSQ0xJQiAqVENBVCAnLycgKlRDQVQgJlNSQ0ZJTEUgKlRDQVQgICAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICcpIFNZU0lGQ09QVCgqSUZTSU8pJyAqQkNBVCAmQ0ZMQUdTKQotICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJ0NSVENNT0QgTU9EVUxFKCcgKlRDQVQgJk1PRExJQiAqVENBVCAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJy9JTkZCQUNLKSAgICAgICAgICAgICAgIFNSQ0ZJTEUoJyAqVENBVCAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICZTUkNMSUIgKlRDQVQgJy8nICpUQ0FUICZTUkNGSUxFICpUQ0FUICAgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAnKSBTWVNJRkNPUFQoKklGU0lPKScgKkJDQVQgJkNGTEFHUykKLSAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKLQotICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCdDUlRDTU9EIE1PRFVMRSgnICpUQ0FUICZNT0RMSUIgKlRDQVQgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICcvSU5GRkFTVCkgICAgICAgICAgICAgICBTUkNGSUxFKCcgKlRDQVQgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAmU1JDTElCICpUQ0FUICcvJyAqVENBVCAmU1JDRklMRSAqVENBVCAgICAgICAgICAgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJykgU1lTSUZDT1BUKCpJRlNJTyknICpCQ0FUICZDRkxBR1MpCi0gICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCi0KLSAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgnQ1JUQ01PRCBNT0RVTEUoJyAqVENBVCAmTU9ETElCICpUQ0FUICArCi0gICAgICAgICAgICAgICAgICAgICAgICAnL0lORkxBVEUpICAgICAgICAgICAgICAgU1JDRklMRSgnICpUQ0FUICAgICAgICAgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJlNSQ0xJQiAqVENBVCAnLycgKlRDQVQgJlNSQ0ZJTEUgKlRDQVQgICAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICcpIFNZU0lGQ09QVCgqSUZTSU8pJyAqQkNBVCAmQ0ZMQUdTKQotICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJ0NSVENNT0QgTU9EVUxFKCcgKlRDQVQgJk1PRExJQiAqVENBVCAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJy9JTkZUUkVFUykgICAgICAgICAgICAgIFNSQ0ZJTEUoJyAqVENBVCAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICZTUkNMSUIgKlRDQVQgJy8nICpUQ0FUICZTUkNGSUxFICpUQ0FUICAgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAnKSBTWVNJRkNPUFQoKklGU0lPKScgKkJDQVQgJkNGTEFHUykKLSAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKLQotICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCdDUlRDTU9EIE1PRFVMRSgnICpUQ0FUICZNT0RMSUIgKlRDQVQgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICcvVFJFRVMpICAgICAgICAgICAgICAgICBTUkNGSUxFKCcgKlRDQVQgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAmU1JDTElCICpUQ0FUICcvJyAqVENBVCAmU1JDRklMRSAqVENBVCAgICAgICAgICAgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJykgU1lTSUZDT1BUKCpJRlNJTyknICpCQ0FUICZDRkxBR1MpCi0gICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCi0KLSAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgnQ1JUQ01PRCBNT0RVTEUoJyAqVENBVCAmTU9ETElCICpUQ0FUICArCi0gICAgICAgICAgICAgICAgICAgICAgICAnL1VOQ09NUFIpICAgICAgICAgICAgICAgU1JDRklMRSgnICpUQ0FUICAgICAgICAgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJlNSQ0xJQiAqVENBVCAnLycgKlRDQVQgJlNSQ0ZJTEUgKlRDQVQgICAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICcpIFNZU0lGQ09QVCgqSUZTSU8pJyAqQkNBVCAmQ0ZMQUdTKQotICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQotCi0gICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJ0NSVENNT0QgTU9EVUxFKCcgKlRDQVQgJk1PRExJQiAqVENBVCAgKwotICAgICAgICAgICAgICAgICAgICAgICAgJy9aVVRJTCkgICAgICAgICAgICAgICAgIFNSQ0ZJTEUoJyAqVENBVCAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICZTUkNMSUIgKlRDQVQgJy8nICpUQ0FUICZTUkNGSUxFICpUQ0FUICAgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAnKSBTWVNJRkNPUFQoKklGU0lPKScgKkJDQVQgJkNGTEFHUykKLSAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKLQotCi0vKiAgICAgIExpbmsgbW9kdWxlcyBpbnRvIGEgc2VydmljZSBwcm9ncmFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgQ1JUU1JWUEdNICBTUlZQR00oJlNSVkxJQi9aTElCKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRSgmTU9ETElCL0FETEVSMzIgICAgICZNT0RMSUIvQ09NUFJFU1MgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1PRExJQi9DUkMzMiAgICAgICAmTU9ETElCL0RFRkxBVEUgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNT0RMSUIvR1pJTyAgICAgICAgJk1PRExJQi9JTkZCQUNLICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTU9ETElCL0lORkZBU1QgICAgICZNT0RMSUIvSU5GTEFURSAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1PRExJQi9JTkZUUkVFUyAgICAmTU9ETElCL1RSRUVTICAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNT0RMSUIvVU5DT01QUiAgICAgJk1PRExJQi9aVVRJTCkgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNSQ0ZJTEUoJlNSQ0xJQi8mQ1RMRklMRSkgU1JDTUJSKEJORFNSQykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUKCdaTElCIDEuMi4zJykgVEdUUkxTKFY0UjRNMCkKLQotICAgICAgICAgICAgIEVORFBHTQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2FzNDAwL3JlYWRtZS50eHQgYi9saWJzL3psaWIvYXM0MDAvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhZTEzZi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvYXM0MDAvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0gICAgICAgIFpMSUIgdmVyc2lvbiAxLjIuMyBmb3IgQVM0MDAgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucwotCi1JKSBGcm9tIGFuIEFTNDAwICpTQVZGIGZpbGU6Ci0KLTEpICAgICAgVW5wYWNraW5nIGFyY2hpdmUgdG8gYW4gQVM0MDAgc2F2ZSBmaWxlCi0KLU9uIHRoZSBBUzQwMDoKLQotXyAgICAgICBDcmVhdGUgdGhlIFpMSUIgQVM0MDAgbGlicmFyeToKLQotICAgICAgICBDUlRMSUIgTElCKFpMSUIpIFRZUEUoUFJPRCkgVEVYVCgnWkxJQiBjb21wcmVzc2lvbiBBUEkgbGlicmFyeScpCi0KLV8gICAgICAgQ3JlYXRlIGEgd29yayBzYXZlIGZpbGUsIGZvciBleGFtcGxlOgotCi0gICAgICAgICAgICAgICAgQ1JUU0FWRiBGSUxFKFpMSUIvWkxJQlNBVkYpCi0KLU9uIGEgUEMgY29ubmVjdGVkIHRvIHRoZSB0YXJnZXQgQVM0MDA6Ci0KLV8gICAgICAgVW5wYWNrIHRoZSBzYXZlIGZpbGUgaW1hZ2UgdG8gYSBQQyBmaWxlICJaTElCU0FWRiIKLV8gICAgICAgVXBsb2FkIHRoaXMgZmlsZSBpbnRvIHRoZSBzYXZlIGZpbGUgb24gdGhlIEFTNDAwLCBmb3IgZXhhbXBsZQotICAgICAgICAgICAgICAgIHVzaW5nIGZ0cCBpbiBCSU5BUlkgbW9kZS4KLQotCi0yKSAgICAgIFBvcHVsYXRpbmcgdGhlIFpMSUIgQVM0MDAgc291cmNlIGxpYnJhcnkKLQotT24gdGhlIEFTNDAwOgotCi1fICAgICAgIEV4dHJhY3QgdGhlIHNhdmVkIG9iamVjdHMgaW50byB0aGUgWkxJQiBBUzQwMCBsaWJyYXJ5IHVzaW5nOgotCi1SU1RPQkogT0JKKCpBTEwpIFNBVkxJQihaTElCKSBERVYoKlNBVkYpIFNBVkYoWkxJQi9aTElCU0FWRikgUlNUTElCKFpMSUIpCi0KLQotMykgICAgICBDdXN0b21pemUgaW5zdGFsbGF0aW9uOgotCi1fICAgICAgIEVkaXQgQ0wgbWVtYmVyIFpMSUIvVE9PTFMoQ09NUElMRSkgYW5kIGNoYW5nZSBwYXJhbWV0ZXJzIGlmIG5lZWRlZCwKLSAgICAgICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIGNvbW1lbnRzLgotCi1fICAgICAgIENvbXBpbGUgdGhpcyBtZW1iZXIgd2l0aDoKLQotICAgICAgICBDUlRDTFBHTSBQR00oWkxJQi9DT01QSUxFKSBTUkNGSUxFKFpMSUIvVE9PTFMpIFNSQ01CUihDT01QSUxFKQotCi0KLTQpICAgICAgQ29tcGlsZSBhbmQgZ2VuZXJhdGUgdGhlIHNlcnZpY2UgcHJvZ3JhbToKLQotXyAgICAgICBUaGlzIGNhbiBub3cgYmUgZG9uZSBieSBleGVjdXRpbmc6Ci0KLSAgICAgICAgQ0FMTCBQR00oWkxJQi9DT01QSUxFKQotCi0KLQotSUkpIEZyb20gdGhlIG9yaWdpbmFsIHNvdXJjZSBkaXN0cmlidXRpb246Ci0KLTEpICAgICAgT24gdGhlIEFTNDAwLCBjcmVhdGUgdGhlIHNvdXJjZSBsaWJyYXJ5OgotCi0gICAgICAgIENSVExJQiBMSUIoWkxJQikgVFlQRShQUk9EKSBURVhUKCdaTElCIGNvbXByZXNzaW9uIEFQSSBsaWJyYXJ5JykKLQotMikgICAgICBDcmVhdGUgdGhlIHNvdXJjZSBmaWxlczoKLQotICAgICAgICBDUlRTUkNQRiBGSUxFKFpMSUIvU09VUkNFUykgUkNETEVOKDExMikgVEVYVCgnWkxJQiBsaWJyYXJ5IG1vZHVsZXMnKQotICAgICAgICBDUlRTUkNQRiBGSUxFKFpMSUIvSCkgICAgICAgUkNETEVOKDExMikgVEVYVCgnWkxJQiBsaWJyYXJ5IGluY2x1ZGVzJykKLSAgICAgICAgQ1JUU1JDUEYgRklMRShaTElCL1RPT0xTKSAgIFJDRExFTigxMTIpIFRFWFQoJ1pMSUIgbGlicmFyeSBjb250cm9sIHV0aWxpdGllcycpCi0KLTMpICAgICAgRnJvbSB0aGUgbWFjaGluZSBob3N0aW5nIHRoZSBkaXN0cmlidXRpb24gZmlsZXMsIHVwbG9hZCB0aGVtICh3aXRoCi0gICAgICAgICAgICAgICAgRlRQIGluIHRleHQgbW9kZSwgZm9yIGV4YW1wbGUpIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRhYmxlOgotCi0gICAgT3JpZ2luYWwgICAgQVM0MDAgICBBUzQwMCAgICBBUzQwMCBBUzQwMAotICAgIGZpbGUgICAgICAgIGZpbGUgICAgbWVtYmVyICAgdHlwZSAgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICBTT1VSQ0VTICAgICAgICAgICAgICAgIE9yaWdpbmFsIFpMSUIgQyBzdWJwcm9ncmFtIHNvdXJjZXMKLSAgICBhZGxlcjMyLmMgICAgICAgICAgIEFETEVSMzIgIEMgICAgIFpMSUIgLSBDb21wdXRlIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhIGR0YSBzdHJtCi0gICAgY29tcHJlc3MuYyAgICAgICAgICBDT01QUkVTUyBDICAgICBaTElCIC0gQ29tcHJlc3MgYSBtZW1vcnkgYnVmZmVyCi0gICAgY3JjMzIuYyAgICAgICAgICAgICBDUkMzMiAgICBDICAgICBaTElCIC0gQ29tcHV0ZSB0aGUgQ1JDLTMyIG9mIGEgZGF0YSBzdHJlYW0KLSAgICBkZWZsYXRlLmMgICAgICAgICAgIERFRkxBVEUgIEMgICAgIFpMSUIgLSBDb21wcmVzcyBkYXRhIHVzaW5nIHRoZSBkZWZsYXRpb24gYWxnb3JpdGhtCi0gICAgZ3ppby5jICAgICAgICAgICAgICBHWklPICAgICBDICAgICBaTElCIC0gSU8gb24gLmd6IGZpbGVzCi0gICAgaW5mYmFjay5jICAgICAgICAgICBJTkZCQUNLICBDICAgICBaTElCIC0gSW5mbGF0ZSB1c2luZyBhIGNhbGxiYWNrIGludGVyZmFjZQotICAgIGluZmZhc3QuYyAgICAgICAgICAgSU5GRkFTVCAgQyAgICAgWkxJQiAtIEZhc3QgcHJvYy4gbGl0ZXJhbHMgJiBsZW5ndGgvZGlzdGFuY2UgcGFpcnMKLSAgICBpbmZsYXRlLmMgICAgICAgICAgIElORkxBVEUgIEMgICAgIFpMSUIgLSBJbnRlcmZhY2UgdG8gaW5mbGF0ZSBtb2R1bGVzCi0gICAgaW5mdHJlZXMuYyAgICAgICAgICBJTkZUUkVFUyBDICAgICBaTElCIC0gR2VuZXJhdGUgSHVmZm1hbiB0cmVlcyBmb3IgZWZmaWNpZW50IGRlY29kZQotICAgIHRyZWVzLmMgICAgICAgICAgICAgVFJFRVMgICAgQyAgICAgWkxJQiAtIE91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCi0gICAgdW5jb21wci5jICAgICAgICAgICBVTkNPTVBSICBDICAgICBaTElCIC0gRGVjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKLSAgICB6dXRpbC5jICAgICAgICAgICAgIFpVVElMICAgIEMgICAgIFpMSUIgLSBUYXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zCi0gICAgICAgICAgICAgICAgSCAgICAgICAgICAgICAgICAgICAgICBPcmlnaW5hbCBaTElCIEMgYW5kIElMRS9SUEcgaW5jbHVkZSBmaWxlcwotICAgIGNyYzMyLmggICAgICAgICAgICAgQ1JDMzIgICAgQyAgICAgWkxJQiAtIENSQzMyIHRhYmxlcwotICAgIGRlZmxhdGUuaCAgICAgICAgICAgREVGTEFURSAgQyAgICAgWkxJQiAtIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlCi0gICAgaW5mZmFzdC5oICAgICAgICAgICBJTkZGQVNUICBDICAgICBaTElCIC0gSGVhZGVyIHRvIHVzZSBpbmZmYXN0LmMKLSAgICBpbmZmaXhlZC5oICAgICAgICAgIElORkZJWEVEIEMgICAgIFpMSUIgLSBUYWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMKLSAgICBpbmZsYXRlLmggICAgICAgICAgIElORkxBVEUgIEMgICAgIFpMSUIgLSBJbnRlcm5hbCBpbmZsYXRlIHN0YXRlIGRlZmluaXRpb25zCi0gICAgaW5mdHJlZXMuaCAgICAgICAgICBJTkZUUkVFUyBDICAgICBaTElCIC0gSGVhZGVyIHRvIHVzZSBpbmZ0cmVlcy5jCi0gICAgdHJlZXMuaCAgICAgICAgICAgICBUUkVFUyAgICBDICAgICBaTElCIC0gQ3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGggLURHRU5fVFJFRVNfSAotICAgIHpjb25mLmggICAgICAgICAgICAgWkNPTkYgICAgQyAgICAgWkxJQiAtIENvbXByZXNzaW9uIGxpYnJhcnkgY29uZmlndXJhdGlvbgotICAgIHpsaWIuaCAgICAgICAgICAgICAgWkxJQiAgICAgQyAgICAgWkxJQiAtIENvbXByZXNzaW9uIGxpYnJhcnkgQyB1c2VyIGludGVyZmFjZQotICAgIGFzNDAwL3psaWIuaW5jICAgICAgWkxJQi5JTkMgUlBHTEUgWkxJQiAtIENvbXByZXNzaW9uIGxpYnJhcnkgSUxFIFJQRyB1c2VyIGludGVyZmFjZQotICAgIHp1dGlsLmggICAgICAgICAgICAgWlVUSUwgICAgQyAgICAgWkxJQiAtIEludGVybmFsIGludGVyZmFjZSBhbmQgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgIFRPT0xTICAgICAgICAgICAgICAgICAgQnVpbGRpbmcgc291cmNlIHNvZnR3YXJlICYgQVMvNDAwIFJFQURNRQotICAgIGFzNDAwL2JuZHNyYyAgICAgICAgQk5EU1JDICAgICAgICAgRW50cnkgcG9pbnQgZXhwb3J0YXRpb24gbGlzdAotICAgIGFzNDAwL2NvbXBpbGUuY2xwICAgQ09NUElMRSAgQ0xQICAgQ29tcGlsZSBzb3VyY2VzICYgZ2VuZXJhdGUgc2VydmljZSBwcm9ncmFtCi0gICAgYXM0MDAvcmVhZG1lLnR4dCAgICBSRUFETUUgICBUWFQgICBJbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zCi0KLTQpICAgICAgQ29udGludWUgYXMgaW4gSSkzKS4KLQotCi0KLQotTm90ZXM6ICBGb3IgQVM0MDAgSUxFIFJQRyBwcm9ncmFtbWVycywgYSAvY29weSBtZW1iZXIgZGVmaW5pbmcgdGhlIFpMSUIKLSAgICAgICAgICAgICAgICBBUEkgcHJvdG90eXBlcyBmb3IgSUxFIFJQRyBjYW4gYmUgZm91bmQgaW4gWkxJQi9IKFpMSUIuSU5DKS4KLSAgICAgICAgICAgICAgICBQbGVhc2UgcmVhZCBjb21tZW50cyBpbiB0aGlzIG1lbWJlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgICAgICBSZW1lbWJlciB0aGF0IG1vc3QgZm9yZWlnbiB0ZXh0dWFsIGRhdGEgYXJlIEFTQ0lJIGNvZGVkOiB0aGlzCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGFuZGxlIGNvbnZlcnNpb24gZnJvbS90byBBU0NJSSwgc28KLSAgICAgICAgICAgICAgICB0ZXh0IGRhdGEgY29kZSBjb252ZXJzaW9ucyBtdXN0IGJlIGRvbmUgZXhwbGljaXRlbHkuCi0KLSAgICAgICAgQWx3YXlzIG9wZW4gemlwcGVkIGZpbGVzIGluIGJpbmFyeSBtb2RlLgpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2FzNDAwL3psaWIuaW5jIGIvbGlicy96bGliL2FzNDAwL3psaWIuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmJmYjdlLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9hczQwMC96bGliLmluYworKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0gICAgICAqICBaTElCLklOQyAtIEludGVyZmFjZSB0byB0aGUgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAgICAgICoKLSAgICAgICogIElMRSBSUEc0MDAgdmVyc2lvbiBieSBQYXRyaWNrIE1vbm5lcmF0LCBEQVRBU1BIRVJFLgotICAgICAgKiAgVmVyc2lvbiAxLjIuMwotICAgICAgKgotICAgICAgKgotICAgICAgKiAgV0FSTklORzoKLSAgICAgICogICAgIFByb2NlZHVyZXMgaW5mbGF0ZUluaXQoKSwgaW5mbGF0ZUluaXQyKCksIGRlZmxhdGVJbml0KCksCi0gICAgICAqICAgICAgICAgZGVmbGF0ZUluaXQyKCkgYW5kIGluZmxhdGVCYWNrSW5pdCgpIG5lZWQgdG8gYmUgY2FsbGVkIHdpdGgKLSAgICAgICogICAgICAgICB0d28gYWRkaXRpb25hbCBhcmd1bWVudHM6Ci0gICAgICAqICAgICAgICAgdGhlIHBhY2thZ2UgdmVyc2lvbiBzdHJpbmcgYW5kIHRoZSBzdHJlYW0gY29udHJvbCBzdHJ1Y3R1cmUuCi0gICAgICAqICAgICAgICAgc2l6ZS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBSUEcgbGFja3Mgc29tZSBtYWNybyBmZWF0dXJlLgotICAgICAgKiAgICAgICAgIENhbGwgdGhlc2UgcHJvY2VkdXJlcyBhczoKLSAgICAgICogICAgICAgICAgICAgaW5mbGF0ZUluaXQoLi4uOiBaTElCX1ZFUlNJT046ICVzaXplKHpfc3RyZWFtKSkKLSAgICAgICoKLSAgICAgIC9pZiBub3QgZGVmaW5lZChaTElCX0hfKQotICAgICAgL2RlZmluZSBaTElCX0hfCi0gICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMKLSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAqCi0gICAgICAqICBWZXJzaW9uaW5nIGluZm9ybWF0aW9uLgotICAgICAgKgotICAgICBEIFpMSUJfVkVSU0lPTiAgICBDICAgICAgICAgICAgICAgICAgICcxLjIuMycKLSAgICAgRCBaTElCX1ZFUk5VTSAgICAgQyAgICAgICAgICAgICAgICAgICBYJzEyMzAnCi0gICAgICAqCi0gICAgICAqICBPdGhlciBlcXVhdGVzLgotICAgICAgKgotICAgICBEIFpfTk9fRkxVU0ggICAgICBDICAgICAgICAgICAgICAgICAgIDAKLSAgICAgRCBaX1NZTkNfRkxVU0ggICAgQyAgICAgICAgICAgICAgICAgICAyCi0gICAgIEQgWl9GVUxMX0ZMVVNIICAgIEMgICAgICAgICAgICAgICAgICAgMwotICAgICBEIFpfRklOSVNIICAgICAgICBDICAgICAgICAgICAgICAgICAgIDQKLSAgICAgRCBaX0JMT0NLICAgICAgICAgQyAgICAgICAgICAgICAgICAgICA1Ci0gICAgICAqCi0gICAgIEQgWl9PSyAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMAotICAgICBEIFpfU1RSRUFNX0VORCAgICBDICAgICAgICAgICAgICAgICAgIDEKLSAgICAgRCBaX05FRURfRElDVCAgICAgQyAgICAgICAgICAgICAgICAgICAyCi0gICAgIEQgWl9FUlJOTyAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgLTEKLSAgICAgRCBaX1NUUkVBTV9FUlJPUiAgQyAgICAgICAgICAgICAgICAgICAtMgotICAgICBEIFpfREFUQV9FUlJPUiAgICBDICAgICAgICAgICAgICAgICAgIC0zCi0gICAgIEQgWl9NRU1fRVJST1IgICAgIEMgICAgICAgICAgICAgICAgICAgLTQKLSAgICAgRCBaX0JVRl9FUlJPUiAgICAgQyAgICAgICAgICAgICAgICAgICAtNQotICAgICBEWl9WRVJTSU9OX0VSUk9SICBDICAgICAgICAgICAgICAgICAgIC02Ci0gICAgICAqCi0gICAgIEQgWl9OT19DT01QUkVTU0lPTi4uLgotICAgICBEICAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIDAKLSAgICAgRCBaX0JFU1RfU1BFRUQgICAgQyAgICAgICAgICAgICAgICAgICAxCi0gICAgIEQgWl9CRVNUX0NPTVBSRVNTSU9OLi4uCi0gICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgOQotICAgICBEIFpfREVGQVVMVF9DT01QUkVTU0lPTi4uLgotICAgICBEICAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIC0xCi0gICAgICAqCi0gICAgIEQgWl9GSUxURVJFRCAgICAgIEMgICAgICAgICAgICAgICAgICAgMQotICAgICBEIFpfSFVGRk1BTl9PTkxZICBDICAgICAgICAgICAgICAgICAgIDIKLSAgICAgRCBaX1JMRSAgICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAzCi0gICAgIEQgWl9ERUZBVUxUX1NUUkFURUdZLi4uCi0gICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMAotICAgICAgKgotICAgICBEIFpfQklOQVJZICAgICAgICBDICAgICAgICAgICAgICAgICAgIDAKLSAgICAgRCBaX0FTQ0lJICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAxCi0gICAgIEQgWl9VTktOT1dOICAgICAgIEMgICAgICAgICAgICAgICAgICAgMgotICAgICAgKgotICAgICBEIFpfREVGTEFURUQgICAgICBDICAgICAgICAgICAgICAgICAgIDgKLSAgICAgICoKLSAgICAgRCBaX05VTEwgICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAwCi0gICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKgotICAgICBEIHpfc3RyZWFtcCAgICAgICBTICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0IHB0cgotICAgICBEIGd6RmlsZSAgICAgICAgICBTICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgRCB6X29mZl90ICAgICAgICAgUyAgICAgICAgICAgICAxMGkgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIG9mZnNldHMKLSAgICAgICoKLSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZXMKLSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAqCi0gICAgICAqICBUaGUgR1pJUCBlbmNvZGUvZGVjb2RlIHN0cmVhbSBzdXBwb3J0IHN0cnVjdHVyZS4KLSAgICAgICoKLSAgICAgRCB6X3N0cmVhbSAgICAgICAgRFMgICAgICAgICAgICAgICAgICBhbGlnbiBiYXNlZCh6X3N0cmVhbXApCi0gICAgIEQgIHpzX25leHRfaW4gICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHQgaW5wdXQgYnl0ZQotICAgICBEICB6c19hdmFpbF9pbiAgICAgICAgICAgICAgICAgIDEwVSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlIGNudCBhdCBuZXh0X2luCi0gICAgIEQgIHpzX3RvdGFsX2luICAgICAgICAgICAgICAgICAgMTBVIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIGJ5dGVzIHJlYWQKLSAgICAgRCAgenNfbmV4dF9vdXQgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IGJ1ZmZlciBwdHIKLSAgICAgRCAgenNfYXZhaWxfb3V0ICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9vbSBsZWZ0IEAgbmV4dF9vdXQKLSAgICAgRCAgenNfdG90YWxfb3V0ICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWwgYnl0ZXMgd3JpdHRlbgotICAgICBEICB6c19tc2cgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0IGVycm1zZyBvciBudWxsCi0gICAgIEQgIHpzX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsIHN0YXRlCi0gICAgIEQgIHpzX3phbGxvYyAgICAgICAgICAgICAgICAgICAgICAqICAgcHJvY3B0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludC4gc3RhdGUgYWxsb2NhdG9yCi0gICAgIEQgIHpzX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAqICAgcHJvY3B0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludC4gc3RhdGUgZGVhbGxvYy4KLSAgICAgRCAgenNfb3BhcXVlICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZSBhbGxvYy4gZGF0YQotICAgICBEICB6c19kYXRhX3R5cGUgICAgICAgICAgICAgICAgIDEwaSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0MvQklOIGJlc3QgZ3Vlc3MKLSAgICAgRCAgenNfYWRsZXIgICAgICAgICAgICAgICAgICAgICAxMHUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5jb21wci4gYWRsZXIzMiB2YWwKLSAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQKLSAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyLiBhbGlnbm1lbnQKLSAgICAgICoKLSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAqICAgICAgICAgICAgICAgICAgICAgVXRpbGl0eSBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKgotICAgICBEIGNvbXByZXNzICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2NvbXByZXNzJykKLSAgICAgRCAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAzMjc2NyAgICBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24gYnVmZmVyCi0gICAgIEQgIGRlc3RMZW4gICAgICAgICAgICAgICAgICAgICAgMTBVIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIGxlbmd0aAotICAgICBEICBzb3VyY2UgICAgICAgICAgICAgICAgICAgIDMyNzY3ICAgIGNvbnN0IG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICBTb3VyY2UgYnVmZmVyCi0gICAgIEQgIHNvdXJjZUxlbiAgICAgICAgICAgICAgICAgICAgMTB1IDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBsZW5ndGgKLSAgICAgICoKLSAgICAgRCBjb21wcmVzczIgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdjb21wcmVzczInKQotICAgICBEICBkZXN0ICAgICAgICAgICAgICAgICAgICAgIDMyNzY3ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBidWZmZXIKLSAgICAgRCAgZGVzdExlbiAgICAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24gbGVuZ3RoCi0gICAgIEQgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgMzI3NjcgICAgY29uc3Qgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgIFNvdXJjZSBidWZmZXIKLSAgICAgRCAgc291cmNlTGVuICAgICAgICAgICAgICAgICAgICAxMFUgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIGxlbmd0aAotICAgICBEICBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBsZXZlbAotICAgICAgKgotICAgICBEIGNvbXByZXNzQm91bmQgICBQUiAgICAgICAgICAgIDEwVSAwIGV4dHByb2MoJ2NvbXByZXNzQm91bmQnKQotICAgICBEICBzb3VyY2VMZW4gICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlCi0gICAgICAqCi0gICAgIEQgdW5jb21wcmVzcyAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygndW5jb21wcmVzcycpCi0gICAgIEQgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgMzI3NjcgICAgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgotICAgICBEICBkZXN0TGVuICAgICAgICAgICAgICAgICAgICAgIDEwVSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBsZW5ndGgKLSAgICAgRCAgc291cmNlICAgICAgICAgICAgICAgICAgICAzMjc2NyAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgU291cmNlIGJ1ZmZlcgotICAgICBEICBzb3VyY2VMZW4gICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UgbGVuZ3RoCi0gICAgICAqCi0gICAgIEQgZ3pvcGVuICAgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3pvcGVuJykKLSAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKGd6RmlsZSkKLSAgICAgRCAgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgRmlsZSBwYXRobmFtZQotICAgICBEICBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBPcGVuIG1vZGUKLSAgICAgICoKLSAgICAgRCBnemRvcGVuICAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnemRvcGVuJykKLSAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKGd6RmlsZSkKLSAgICAgRCAgZmQgICAgICAgICAgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkZXNjcmlwdG9yCi0gICAgIEQgIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIE9wZW4gbW9kZQotICAgICAgKgotICAgICBEIGd6c2V0cGFyYW1zICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2d6c2V0cGFyYW1zJykKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgIEQgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUKLSAgICAgRCAgc3RyYXRlZ3kgICAgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZQotICAgICAgKgotICAgICBEIGd6cmVhZCAgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2d6cmVhZCcpCi0gICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgotICAgICBEICBidWYgICAgICAgICAgICAgICAgICAgICAgIDMyNzY3ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBCdWZmZXIKLSAgICAgRCAgbGVuICAgICAgICAgICAgICAgICAgICAgICAgICAxMHUgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyIGxlbmd0aAotICAgICAgKgotICAgICBEIGd6d3JpdGUgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2d6d3JpdGUnKQotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgRCAgYnVmICAgICAgICAgICAgICAgICAgICAgICAzMjc2NyAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgQnVmZmVyCi0gICAgIEQgIGxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgMTB1IDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBsZW5ndGgKLSAgICAgICoKLSAgICAgRCBnenB1dHMgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdnenB1dHMnKQotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgRCAgcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgU3RyaW5nIHRvIG91dHB1dAotICAgICAgKgotICAgICBEIGd6Z2V0cyAgICAgICAgICBQUiAgICAgICAgICAgICAgKiAgIGV4dHByb2MoJ2d6Z2V0cycpCi0gICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgotICAgICBEICBidWYgICAgICAgICAgICAgICAgICAgICAgIDMyNzY3ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBSZWFkIGJ1ZmZlcgotICAgICBEICBsZW4gICAgICAgICAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIgbGVuZ3RoCi0gICAgICAqCi0gICAgIEQgZ3pmbHVzaCAgICAgICAgIFBSICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygnZ3pmbHVzaCcpCi0gICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgotICAgICBEICBmbHVzaCAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIG9mIGZsdXNoCi0gICAgICAqCi0gICAgIEQgZ3pzZWVrICAgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3pzZWVrJykKLSAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfb2ZmX3QpCi0gICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgotICAgICBEICBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2Uoel9vZmZfdCkgICAgICAgICAgICAgICAgICBPZmZzZXQKLSAgICAgRCAgd2hlbmNlICAgICAgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JpZ2luCi0gICAgICAqCi0gICAgIEQgZ3pyZXdpbmQgICAgICAgIFBSICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygnZ3pyZXdpbmQnKQotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgICoKLSAgICAgRCBnenRlbGwgICAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnenRlbGwnKQotICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9vZmZfdCkKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgICAqCi0gICAgIEQgZ3plb2YgICAgICAgICAgIFBSICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygnZ3plb2YnKQotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgICoKLSAgICAgRCBnemNsb3NlICAgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnemNsb3NlJykKLSAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCi0gICAgICAqCi0gICAgIEQgZ3plcnJvciAgICAgICAgIFBSICAgICAgICAgICAgICAqICAgZXh0cHJvYygnZ3plcnJvcicpICAgICAgICAgICAgICAgICAgIEVycm9yIHN0cmluZwotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgRCAgZXJybnVtICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgY29kZQotICAgICAgKgotICAgICBEIGd6Y2xlYXJlcnIgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6Y2xlYXJlcnInKQotICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKLSAgICAgICoKLSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWMgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICoKLSAgICAgRCB6bGliVmVyc2lvbiAgICAgUFIgICAgICAgICAgICAgICogICBleHRwcm9jKCd6bGliVmVyc2lvbicpICAgICAgICAgICAgICAgVmVyc2lvbiBzdHJpbmcKLSAgICAgICoKLSAgICAgRCBkZWZsYXRlSW5pdCAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlSW5pdF8nKSAgICAgICAgICAgICAgSW5pdC4gY29tcHJlc3Npb24KLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCi0gICAgIEQgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIGxldmVsCi0gICAgIEQgIHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIFZlcnNpb24gc3RyaW5nCi0gICAgIEQgIHN0cmVhbV9zaXplICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbSBzdHJ1Y3QuIHNpemUKLSAgICAgICoKLSAgICAgRCBkZWZsYXRlICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlJykgICAgICAgICAgICAgICAgICAgQ29tcHJlc3MgZGF0YQotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KLSAgICAgRCAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmx1c2ggdHlwZSByZXF1aXJlZAotICAgICAgKgotICAgICBEIGRlZmxhdGVFbmQgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVFbmQnKSAgICAgICAgICAgICAgICBUZXJtaW4uIGNvbXByZXNzaW9uCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQotICAgICAgKgotICAgICBEIGluZmxhdGVJbml0ICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVJbml0XycpICAgICAgICAgICAgICBJbml0LiBleHBhbnNpb24KLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQotICAgICBEICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBWZXJzaW9uIHN0cmluZwotICAgICBEICBzdHJlYW1fc2l6ZSAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0LiBzaXplCi0gICAgICAqCi0gICAgIEQgaW5mbGF0ZSAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZScpICAgICAgICAgICAgICAgICAgIEV4cGFuZCBkYXRhCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgRCAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmx1c2ggdHlwZSByZXF1aXJlZAotICAgICAgKgotICAgICBEIGluZmxhdGVFbmQgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVFbmQnKSAgICAgICAgICAgICAgICBUZXJtaW4uIGV4cGFuc2lvbgotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCi0gICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIEFkdmFuY2VkIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAqCi0gICAgIEQgZGVmbGF0ZUluaXQyICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZUluaXQyXycpICAgICAgICAgICAgIEluaXQuIGNvbXByZXNzaW9uCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQotICAgICBEICBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBsZXZlbAotICAgICBEICBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBtZXRob2QKLSAgICAgRCAgd2luZG93Qml0cyAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMih3aW5kb3cgc2l6ZSkKLSAgICAgRCAgbWVtTGV2ZWwgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtL2NtcHJlc3MgdHJhZGVvZmYKLSAgICAgRCAgc3RyYXRlZ3kgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RhdGVneQotICAgICBEICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBWZXJzaW9uIHN0cmluZwotICAgICBEICBzdHJlYW1fc2l6ZSAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0LiBzaXplCi0gICAgICAqCi0gICAgIEQgZGVmbGF0ZVNldERpY3Rpb25hcnkuLi4KLSAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlU2V0RGljdGlvbmFyeScpICAgICAgSW5pdC4gZGljdGlvbmFyeQotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KLSAgICAgRCAgZGljdGlvbmFyeSAgICAgICAgICAgICAgICAzMjc2NyAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgRGljdGlvbmFyeSBieXRlcwotICAgICBEICBkaWN0TGVuZ3RoICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5IGxlbmd0aAotICAgICAgKgotICAgICBEIGRlZmxhdGVDb3B5ICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVDb3B5JykgICAgICAgICAgICAgICBDb21wcmVzcyBzdHJtIDIgc3RybQotICAgICBEICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBzdHJlYW0KLSAgICAgRCAgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIHN0cmVhbQotICAgICAgKgotICAgICBEIGRlZmxhdGVSZXNldCAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVSZXNldCcpICAgICAgICAgICAgICBFbmQgYW5kIGluaXQuIHN0cmVhbQotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KLSAgICAgICoKLSAgICAgRCBkZWZsYXRlUGFyYW1zICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlUGFyYW1zJykgICAgICAgICAgICAgQ2hhbmdlIGxldmVsICYgc3RyYXQKLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCi0gICAgIEQgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIGxldmVsCi0gICAgIEQgIHN0cmF0ZWd5ICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0YXRlZ3kKLSAgICAgICoKLSAgICAgRCBkZWZsYXRlQm91bmQgICAgUFIgICAgICAgICAgICAxMFUgMCBleHRwcm9jKCdkZWZsYXRlQm91bmQnKSAgICAgICAgICAgICAgQ2hhbmdlIGxldmVsICYgc3RyYXQKLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCi0gICAgIEQgIHNvdXJjZWxlbiAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIGxldmVsCi0gICAgICAqCi0gICAgIEQgZGVmbGF0ZVByaW1lICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZVByaW1lJykgICAgICAgICAgICAgIENoYW5nZSBsZXZlbCAmIHN0cmF0Ci0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQotICAgICBEICBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgYml0cyB0byBpbnNlcnQKLSAgICAgRCAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0cyB0byBpbnNlcnQKLSAgICAgICoKLSAgICAgRCBpbmZsYXRlSW5pdDIgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlSW5pdDJfJykgICAgICAgICAgICAgSW5pdC4gZXhwYW5zaW9uCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgRCAgd2luZG93Qml0cyAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMih3aW5kb3cgc2l6ZSkKLSAgICAgRCAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgVmVyc2lvbiBzdHJpbmcKLSAgICAgRCAgc3RyZWFtX3NpemUgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIHN0cnVjdC4gc2l6ZQotICAgICAgKgotICAgICBEIGluZmxhdGVTZXREaWN0aW9uYXJ5Li4uCi0gICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZVNldERpY3Rpb25hcnknKSAgICAgIEluaXQuIGRpY3Rpb25hcnkKLSAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQotICAgICBEICBkaWN0aW9uYXJ5ICAgICAgICAgICAgICAgIDMyNzY3ICAgIGNvbnN0IG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICBEaWN0aW9uYXJ5IGJ5dGVzCi0gICAgIEQgIGRpY3RMZW5ndGggICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpY3Rpb25hcnkgbGVuZ3RoCi0gICAgICAqCi0gICAgIEQgaW5mbGF0ZVN5bmMgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZVN5bmMnKSAgICAgICAgICAgICAgIFN5bmMuIGV4cGFuc2lvbgotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCi0gICAgICAqCi0gICAgIEQgaW5mbGF0ZUNvcHkgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZUNvcHknKQotICAgICBEICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBzdHJlYW0KLSAgICAgRCAgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIHN0cmVhbQotICAgICAgKgotICAgICBEIGluZmxhdGVSZXNldCAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVSZXNldCcpICAgICAgICAgICAgICBFbmQgYW5kIGluaXQuIHN0cmVhbQotICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCi0gICAgICAqCi0gICAgIEQgaW5mbGF0ZUJhY2tJbml0Li4uCi0gICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZUJhY2tJbml0XycpCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgRCAgd2luZG93Qml0cyAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nMihidWZmZXIgc2l6ZSkKLSAgICAgRCAgd2luZG93ICAgICAgICAgICAgICAgICAgICAzMjc2NyAgICBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgICAgICAgQnVmZmVyCi0gICAgIEQgIHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIFZlcnNpb24gc3RyaW5nCi0gICAgIEQgIHN0cmVhbV9zaXplICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbSBzdHJ1Y3QuIHNpemUKLSAgICAgICoKLSAgICAgRCBpbmZsYXRlQmFjayAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlQmFjaycpCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgRCAgaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBwcm9jcHRyICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgZnVuY3Rpb24KLSAgICAgRCAgaW5fZGVzYyAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgZGVzY3JpcHRvcgotICAgICBEICBvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIHByb2NwdHIgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgZnVuY3Rpb24KLSAgICAgRCAgb3V0X2Rlc2MgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IGRlc2NyaXB0b3IKLSAgICAgICoKLSAgICAgRCBpbmZsYXRlQmFja0VuZCAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlQmFja0VuZCcpCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgICoKLSAgICAgRCB6bGliQ29tcGlsZUZsYWdzLi4uCi0gICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBVIDAgZXh0cHJvYygnemxpYkNvbXBpbGVGbGFncycpCi0gICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrc3VtIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAqCi0gICAgIEQgYWRsZXIzMiAgICAgICAgIFBSICAgICAgICAgICAgMTBVIDAgZXh0cHJvYygnYWRsZXIzMicpICAgICAgICAgICAgICAgICAgIE5ldyBjaGVja3N1bQotICAgICBEICBhZGxlciAgICAgICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGQgY2hlY2tzdW0KLSAgICAgRCAgYnVmICAgICAgICAgICAgICAgICAgICAgICAzMjc2NyAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgQnl0ZXMgdG8gYWNjdW11bGF0ZQotICAgICBEICBsZW4gICAgICAgICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIgbGVuZ3RoCi0gICAgICAqCi0gICAgIEQgY3JjMzIgICAgICAgICAgIFBSICAgICAgICAgICAgMTBVIDAgZXh0cHJvYygnY3JjMzInKSAgICAgICAgICAgICAgICAgICAgIE5ldyBjaGVja3N1bQotICAgICBEICBjcmMgICAgICAgICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGQgY2hlY2tzdW0KLSAgICAgRCAgYnVmICAgICAgICAgICAgICAgICAgICAgICAzMjc2NyAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgQnl0ZXMgdG8gYWNjdW11bGF0ZQotICAgICBEICBsZW4gICAgICAgICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIgbGVuZ3RoCi0gICAgICAqCi0gICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgKiAgICAgICAgICAgICAgICAgICAgIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICoKLSAgICAgRCB6RXJyb3IgICAgICAgICAgUFIgICAgICAgICAgICAgICogICBleHRwcm9jKCd6RXJyb3InKSAgICAgICAgICAgICAgICAgICAgRXJyb3Igc3RyaW5nCi0gICAgIEQgIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGNvZGUKLSAgICAgICoKLSAgICAgRCBpbmZsYXRlU3luY1BvaW50Li4uCi0gICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZVN5bmNQb2ludCcpCi0gICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KLSAgICAgICoKLSAgICAgRCBnZXRfY3JjX3RhYmxlICAgUFIgICAgICAgICAgICAgICogICBleHRwcm9jKCdnZXRfY3JjX3RhYmxlJykgICAgICAgICAgICAgUHRyIHRvIHVsb25ncwotICAgICAgKgotICAgICAgL2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY2hlY2subG9nIGIvbGlicy96bGliL2NoZWNrLmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxYTA3My4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY2hlY2subG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotaGVsbG8gd29ybGQKLXpsaWIgdmVyc2lvbiAxLjIuMyA9IDB4MTIzMCwgY29tcGlsZSBmbGFncyA9IDB4OTUKLXVuY29tcHJlc3MoKTogaGVsbG8sIGhlbGxvIQotZ3pyZWFkKCk6IGhlbGxvLCBoZWxsbyEKLWd6Z2V0cygpIGFmdGVyIGd6c2VlazogIGhlbGxvIQotaW5mbGF0ZSgpOiBoZWxsbywgaGVsbG8hCi1sYXJnZV9pbmZsYXRlKCk6IE9LCi1hZnRlciBpbmZsYXRlU3luYygpOiBoZWxsbywgaGVsbG8hCi1pbmZsYXRlIHdpdGggZGljdGlvbmFyeTogaGVsbG8sIGhlbGxvIQotCQkqKiogemxpYiB0ZXN0IE9LICoqKgpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbXByZXNzLmMgYi9saWJzL3psaWIvY29tcHJlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwNGYwMS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29tcHJlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qIGNvbXByZXNzLmMgLS0gY29tcHJlc3MgYSBtZW1vcnkgYnVmZmVyCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jZGVmaW5lIFpMSUJfSU5URVJOQUwKLSNpbmNsdWRlICJ6bGliLmgiCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gVGhlIGxldmVsCi0gICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZGVmbGF0ZUluaXQuICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKLSAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKLSAgIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCAwLjElIGxhcmdlciB0aGFuIHNvdXJjZUxlbiBwbHVzCi0gICAxMiBieXRlcy4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuCi0KLSAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAotICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgotKi8KLWludCBaRVhQT1JUIGNvbXByZXNzMiAoZGVzdCwgZGVzdExlbiwgc291cmNlLCBzb3VyY2VMZW4sIGxldmVsKQotICAgIEJ5dGVmICpkZXN0OwotICAgIHVMb25nZiAqZGVzdExlbjsKLSAgICBjb25zdCBCeXRlZiAqc291cmNlOwotICAgIHVMb25nIHNvdXJjZUxlbjsKLSAgICBpbnQgbGV2ZWw7Ci17Ci0gICAgel9zdHJlYW0gc3RyZWFtOwotICAgIGludCBlcnI7Ci0KLSAgICBzdHJlYW0ubmV4dF9pbiA9IChCeXRlZiopc291cmNlOwotICAgIHN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXNvdXJjZUxlbjsKLSNpZmRlZiBNQVhTRUdfNjRLCi0gICAgLyogQ2hlY2sgZm9yIHNvdXJjZSA+IDY0SyBvbiAxNi1iaXQgbWFjaGluZTogKi8KLSAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9pbiAhPSBzb3VyY2VMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKLSNlbmRpZgotICAgIHN0cmVhbS5uZXh0X291dCA9IGRlc3Q7Ci0gICAgc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KSpkZXN0TGVuOwotICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX291dCAhPSAqZGVzdExlbikgcmV0dXJuIFpfQlVGX0VSUk9SOwotCi0gICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7Ci0gICAgc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOwotICAgIHN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7Ci0KLSAgICBlcnIgPSBkZWZsYXRlSW5pdCgmc3RyZWFtLCBsZXZlbCk7Ci0gICAgaWYgKGVyciAhPSBaX09LKSByZXR1cm4gZXJyOwotCi0gICAgZXJyID0gZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7Ci0gICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKLSAgICAgICAgZGVmbGF0ZUVuZCgmc3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIGVyciA9PSBaX09LID8gWl9CVUZfRVJST1IgOiBlcnI7Ci0gICAgfQotICAgICpkZXN0TGVuID0gc3RyZWFtLnRvdGFsX291dDsKLQotICAgIGVyciA9IGRlZmxhdGVFbmQoJnN0cmVhbSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLWludCBaRVhQT1JUIGNvbXByZXNzIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbikKLSAgICBCeXRlZiAqZGVzdDsKLSAgICB1TG9uZ2YgKmRlc3RMZW47Ci0gICAgY29uc3QgQnl0ZWYgKnNvdXJjZTsKLSAgICB1TG9uZyBzb3VyY2VMZW47Ci17Ci0gICAgcmV0dXJuIGNvbXByZXNzMihkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbiwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIElmIHRoZSBkZWZhdWx0IG1lbUxldmVsIG9yIHdpbmRvd0JpdHMgZm9yIGRlZmxhdGVJbml0KCkgaXMgY2hhbmdlZCwgdGhlbgotICAgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSB1cGRhdGVkLgotICovCi11TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgKHNvdXJjZUxlbikKLSAgICB1TG9uZyBzb3VyY2VMZW47Ci17Ci0gICAgcmV0dXJuIHNvdXJjZUxlbiArIChzb3VyY2VMZW4gPj4gMTIpICsgKHNvdXJjZUxlbiA+PiAxNCkgKyAxMTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb25maWd1cmUgYi9saWJzL3psaWIvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2ZmZGMzLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotIyEvYmluL3NoCi0jIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIHpsaWIuIFRoaXMgc2NyaXB0IGlzIG5lZWRlZCBvbmx5IGlmCi0jIHlvdSB3aXNoIHRvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkgYW5kIHlvdXIgc3lzdGVtIHN1cHBvcnRzIHRoZW0sCi0jIG9mIGlmIHlvdSBuZWVkIHNwZWNpYWwgY29tcGlsZXIsIGZsYWdzIG9yIGluc3RhbGwgZGlyZWN0b3J5LgotIyBPdGhlcndpc2UsIHlvdSBjYW4ganVzdCB1c2UgZGlyZWN0bHkgIm1ha2UgdGVzdDsgbWFrZSBpbnN0YWxsIgotIwotIyBUbyBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSwgdXNlICJjb25maWd1cmUgLS1zaGFyZWQiOyBieSBkZWZhdWx0IGEgc3RhdGljCi0jIGxpYnJhcnkgaXMgY3JlYXRlZC4gSWYgdGhlIHByaW1pdGl2ZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHByb3ZpZGVkIGhlcmUKLSMgZG9lcyBub3Qgd29yaywgdXNlIGZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L2xpYnRvb2wtKi50YXIuZ3oKLSMKLSMgVG8gaW1wb3NlIHNwZWNpZmljIGNvbXBpbGVyIG9yIGZsYWdzIG9yIGluc3RhbGwgZGlyZWN0b3J5LCB1c2UgZm9yIGV4YW1wbGU6Ci0jICAgIHByZWZpeD0kSE9NRSBDQz1jYyBDRkxBR1M9Ii1PNCIgLi9jb25maWd1cmUKLSMgb3IgZm9yIGNzaC90Y3NoIHVzZXJzOgotIyAgICAoc2V0ZW52IHByZWZpeCAkSE9NRTsgc2V0ZW52IENDIGNjOyBzZXRlbnYgQ0ZMQUdTICItTzQiOyAuL2NvbmZpZ3VyZSkKLSMgTERTSEFSRUQgaXMgdGhlIGNvbW1hbmQgdG8gYmUgdXNlZCB0byBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeQotCi0jIEluY29ycmVjdCBzZXR0aW5ncyBvZiBDQyBvciBDRkxBR1MgbWF5IHByZXZlbnQgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLSMgSWYgeW91IGhhdmUgcHJvYmxlbXMsIHRyeSB3aXRob3V0IGRlZmluaW5nIENDIGFuZCBDRkxBR1MgYmVmb3JlIHJlcG9ydGluZwotIyBhbiBlcnJvci4KLQotTElCUz1saWJ6LmEKLUxERkxBR1M9Ii1MLiAke0xJQlN9IgotVkVSPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgCi1WRVIyPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlxcLlswLTldKlwpXFwuLiovXDEvcCcgPCB6bGliLmhgCi1WRVIxPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlwpXFwuLiovXDEvcCcgPCB6bGliLmhgCi1BUj0ke0FSLSJhciByYyJ9Ci1SQU5MSUI9JHtSQU5MSUItInJhbmxpYiJ9Ci1wcmVmaXg9JHtwcmVmaXgtL3Vzci9sb2NhbH0KLWV4ZWNfcHJlZml4PSR7ZXhlY19wcmVmaXgtJyR7cHJlZml4fSd9Ci1saWJkaXI9JHtsaWJkaXItJyR7ZXhlY19wcmVmaXh9L2xpYid9Ci1pbmNsdWRlZGlyPSR7aW5jbHVkZWRpci0nJHtwcmVmaXh9L2luY2x1ZGUnfQotbWFuZGlyPSR7bWFuZGlyLScke3ByZWZpeH0vc2hhcmUvbWFuJ30KLXNoYXJlZF9leHQ9Jy5zbycKLXNoYXJlZD0wCi1nY2M9MAotb2xkX2NjPSIkQ0MiCi1vbGRfY2ZsYWdzPSIkQ0ZMQUdTIgotCi13aGlsZSB0ZXN0ICQjIC1nZSAxCi1kbwotY2FzZSAiJDEiIGluCi0gICAgLWgqIHwgLS1oKikKLSAgICAgIGVjaG8gJ3VzYWdlOicKLSAgICAgIGVjaG8gJyAgY29uZmlndXJlIFstLXNoYXJlZF0gWy0tcHJlZml4PVBSRUZJWF0gIFstLWV4ZWNfcHJlZml4PUVYUFJFRklYXScKLSAgICAgIGVjaG8gJyAgICAgWy0tbGliZGlyPUxJQkRJUl0gWy0taW5jbHVkZWRpcj1JTkNMVURFRElSXScKLSAgICAgICAgZXhpdCAwOzsKLSAgICAtcCo9KiB8IC0tcCo9KikgcHJlZml4PWBlY2hvICQxIHwgc2VkICdzL1stYS16X10qPS8vJ2A7IHNoaWZ0OzsKLSAgICAtZSo9KiB8IC0tZSo9KikgZXhlY19wcmVmaXg9YGVjaG8gJDEgfCBzZWQgJ3MvWy1hLXpfXSo9Ly8nYDsgc2hpZnQ7OwotICAgIC1sKj0qIHwgLS1saWJkaXI9KikgbGliZGlyPWBlY2hvICQxIHwgc2VkICdzL1stYS16X10qPS8vJ2A7IHNoaWZ0OzsKLSAgICAtaSo9KiB8IC0taW5jbHVkZWRpcj0qKSBpbmNsdWRlZGlyPWBlY2hvICQxIHwgc2VkICdzL1stYS16X10qPS8vJ2A7c2hpZnQ7OwotICAgIC1wKiB8IC0tcCopIHByZWZpeD0iJDIiOyBzaGlmdDsgc2hpZnQ7OwotICAgIC1lKiB8IC0tZSopIGV4ZWNfcHJlZml4PSIkMiI7IHNoaWZ0OyBzaGlmdDs7Ci0gICAgLWwqIHwgLS1sKikgbGliZGlyPSIkMiI7IHNoaWZ0OyBzaGlmdDs7Ci0gICAgLWkqIHwgLS1pKikgaW5jbHVkZWRpcj0iJDIiOyBzaGlmdDsgc2hpZnQ7OwotICAgIC1zKiB8IC0tcyopIHNoYXJlZD0xOyBzaGlmdDs7Ci0gICAgKikgZWNobyAidW5rbm93biBvcHRpb246ICQxIjsgZWNobyAiJDAgLS1oZWxwIGZvciBoZWxwIjsgZXhpdCAxOzsKLSAgICBlc2FjCi1kb25lCi0KLXRlc3Q9enRlc3QkJAotY2F0ID4gJHRlc3QuYyA8PEVPRgotZXh0ZXJuIGludCBnZXRjaGFyKCk7Ci1pbnQgaGVsbG8oKSB7cmV0dXJuIGdldGNoYXIoKTt9Ci1FT0YKLQotdGVzdCAteiAiJENDIiAmJiBlY2hvIENoZWNraW5nIGZvciBnY2MuLi4KLWNjPSR7Q0MtZ2NjfQotY2ZsYWdzPSR7Q0ZMQUdTLSItTzMifQotIyB0byBmb3JjZSB0aGUgYXNtIHZlcnNpb24gdXNlOiBDRkxBR1M9Ii1PMyAtREFTTVYiIC4vY29uZmlndXJlCi1jYXNlICIkY2MiIGluCi0gICpnY2MqKSBnY2M9MTs7Ci1lc2FjCi0KLWlmIHRlc3QgIiRnY2MiIC1lcSAxICYmICgkY2MgLWMgJGNmbGFncyAkdGVzdC5jKSAyPi9kZXYvbnVsbDsgdGhlbgotICBDQz0iJGNjIgotICBTRkxBR1M9JHtDRkxBR1MtIi1mUElDIC1PMyJ9Ci0gIENGTEFHUz0iJGNmbGFncyIKLSAgY2FzZSBgKHVuYW1lIC1zIHx8IGVjaG8gdW5rbm93bikgMj4vZGV2L251bGxgIGluCi0gIExpbnV4IHwgbGludXggfCBHTlUgfCBHTlUvKikgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1zaGFyZWQgLVdsLC1zb25hbWUsbGliei5zby4xIn07OwotICBDWUdXSU4qIHwgQ3lnd2luKiB8IGN5Z3dpbiogfCBPUy8yKiApCi0gICAgICAgICAgICAgRVhFPScuZXhlJzs7Ci0gIFFOWCopICAjIFRoaXMgaXMgZm9yIFFOWDYuIEkgc3VwcG9zZSB0aGF0IHRoZSBRTlggcnVsZSBiZWxvdyBpcyBmb3IgUU5YMixRTlg0Ci0gICAgICAgICAjIChhbGFpbi5ib25uZWZveUBpY2J0LmNvbSkKLSAgICAgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1zaGFyZWQgLVdsLC1obGliei5zby4xIn07OwotICBIUC1VWCopCi0gICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAkU0ZMQUdTIn0KLSAgICAgICAgIGNhc2UgYCh1bmFtZSAtbSB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYCBpbgotICAgICAgICAgaWE2NCkKLSAgICAgICAgICAgICAgICAgc2hhcmVkX2V4dD0nLnNvJwotICAgICAgICAgICAgICAgICBTSEFSRURMSUI9J2xpYnouc28nOzsKLSAgICAgICAgICopCi0gICAgICAgICAgICAgICAgIHNoYXJlZF9leHQ9Jy5zbCcKLSAgICAgICAgICAgICAgICAgU0hBUkVETElCPSdsaWJ6LnNsJzs7Ci0gICAgICAgICBlc2FjOzsKLSAgRGFyd2luKikgICBzaGFyZWRfZXh0PScuZHlsaWInCi0gICAgICAgICAgICAgU0hBUkVETElCPWxpYnokc2hhcmVkX2V4dAotICAgICAgICAgICAgIFNIQVJFRExJQlY9bGliei4kVkVSJHNoYXJlZF9leHQKLSAgICAgICAgICAgICBTSEFSRURMSUJNPWxpYnouJFZFUjEkc2hhcmVkX2V4dAotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtZHluYW1pY2xpYiAtaW5zdGFsbF9uYW1lICRsaWJkaXIvJFNIQVJFRExJQk0gLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkVkVSMSAtY3VycmVudF92ZXJzaW9uICRWRVIifTs7Ci0gICopICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIn07OwotICBlc2FjCi1lbHNlCi0gICMgZmluZCBzeXN0ZW0gbmFtZSBhbmQgY29ycmVzcG9uZGluZyBjYyBvcHRpb25zCi0gIENDPSR7Q0MtY2N9Ci0gIGNhc2UgYCh1bmFtZSAtc3IgfHwgZWNobyB1bmtub3duKSAyPi9kZXYvbnVsbGAgaW4KLSAgSFAtVVgqKSAgICBTRkxBR1M9JHtDRkxBR1MtIi1PICt6In0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KLSMgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJsZCAtYiArdm5vY29tcGF0d2FybmluZ3MifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImxkIC1iIn0KLSAgICAgICAgIGNhc2UgYCh1bmFtZSAtbSB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYCBpbgotICAgICAgICAgaWE2NCkKLSAgICAgICAgICAgICBzaGFyZWRfZXh0PScuc28nCi0gICAgICAgICAgICAgU0hBUkVETElCPSdsaWJ6LnNvJzs7Ci0gICAgICAgICAqKQotICAgICAgICAgICAgIHNoYXJlZF9leHQ9Jy5zbCcKLSAgICAgICAgICAgICBTSEFSRURMSUI9J2xpYnouc2wnOzsKLSAgICAgICAgIGVzYWM7OwotICBJUklYKikgICAgIFNGTEFHUz0ke0NGTEFHUy0iLWFuc2kgLU8yIC1ycGF0aCAuIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1hbnNpIC1PMiJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXNoYXJlZCJ9OzsKLSAgT1NGMVwgVjQqKSBTRkxBR1M9JHtDRkxBR1MtIi1PIC1zdGQxIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIC1zdGQxIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtc2hhcmVkICAtV2wsLXNvbmFtZSxsaWJ6LnNvIC1XbCwtbXN5bSAtV2wsLXJwYXRoLCQobGliZGlyKSAtV2wsLXNldF92ZXJzaW9uLCR7VkVSfToxLjAifTs7Ci0gIE9TRjEqKSAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9Ci0gICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXNoYXJlZCJ9OzsKLSAgUU5YKikgICAgICBTRkxBR1M9JHtDRkxBR1MtIi00IC1PIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi00IC1PIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyJ9Ci0gICAgICAgICAgICAgUkFOTElCPSR7UkFOTElCLSJ0cnVlIn0KLSAgICAgICAgICAgICBBUj0iY2MgLUEiOzsKLSAgU0NPX1NWXCAzLjIqKSBTRkxBR1M9JHtDRkxBR1MtIi1PMyAtZHkgLUtQSUMgIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PMyJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLWR5IC1LUElDIC1HIn07OwotICBTdW5PU1wgNSopIFNGTEFHUz0ke0NGTEFHUy0iLWZhc3QgLXhjZzg5IC1LUElDIC1SLiJ9Ci0gICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZmFzdCAteGNnODkifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn07OwotICBTdW5PU1wgNCopIFNGTEFHUz0ke0NGTEFHUy0iLU8yIC1QSUMifQotICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8yIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJsZCJ9OzsKLSAgU3VuU3R1ZGlvXCA5KikgU0ZMQUdTPSR7Q0ZMQUdTLSItRFVTRV9NTUFQIC1mYXN0IC14Y29kZT1waWMzMiAteHRhcmdldD11bHRyYTMgLXhhcmNoPXY5YiJ9Ci0gICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItRFVTRV9NTUFQIC1mYXN0IC14dGFyZ2V0PXVsdHJhMyAteGFyY2g9djliIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAteGFyY2g9djliIn07OwotICBVTklYX1N5c3RlbV9WXCA0LjIuMCkKLSAgICAgICAgICAgICBTRkxBR1M9JHtDRkxBR1MtIi1LUElDIC1PIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9OzsKLSAgVU5JWF9TVlwgNC4yTVApCi0gICAgICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItS2NvbmZvcm1fcGljIC1PIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9OzsKLSAgT3BlblVOSVhcIDUpCi0gICAgICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItS1BJQyAtTyJ9Ci0gICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLUcifTs7Ci0gIEFJWCopICAjIENvdXJ0ZXN5IG9mIGRiYWtrZXJAYXJyYXlhc29sdXRpb25zLmNvbQotICAgICAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLU8gLXFtYXhtZW09ODE5MiJ9Ci0gICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyAtcW1heG1lbT04MTkyIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJ4bGMgLUcifTs7Ci0gICMgc2VuZCB3b3JraW5nIG9wdGlvbnMgZm9yIG90aGVyIHN5c3RlbXMgdG8gc3VwcG9ydEBnemlwLm9yZwotICAqKSAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLU8ifQotICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQifTs7Ci0gIGVzYWMKLWZpCi0KLVNIQVJFRExJQj0ke1NIQVJFRExJQi0ibGlieiRzaGFyZWRfZXh0In0KLVNIQVJFRExJQlY9JHtTSEFSRURMSUJWLSJsaWJ6JHNoYXJlZF9leHQuJFZFUiJ9Ci1TSEFSRURMSUJNPSR7U0hBUkVETElCTS0ibGlieiRzaGFyZWRfZXh0LiRWRVIxIn0KLQotaWYgdGVzdCAkc2hhcmVkIC1lcSAxOyB0aGVuCi0gIGVjaG8gQ2hlY2tpbmcgZm9yIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuLi4KLSAgIyB3ZSBtdXN0IHRlc3QgaW4gdHdvIHN0ZXBzIChjYyB0aGVuIGxkKSwgcmVxdWlyZWQgYXQgbGVhc3Qgb24gU3VuT1MgNC54Ci0gIGlmIHRlc3QgImAoJENDIC1jICRTRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiIgJiYKLSAgICAgdGVzdCAiYCgkTERTSEFSRUQgLW8gJHRlc3Qkc2hhcmVkX2V4dCAkdGVzdC5vKSAyPiYxYCIgPSAiIjsgdGhlbgotICAgIENGTEFHUz0iJFNGTEFHUyIKLSAgICBMSUJTPSIkU0hBUkVETElCViIKLSAgICBlY2hvIEJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJ5ICRTSEFSRURMSUJWIHdpdGggJENDLgotICBlbGlmIHRlc3QgLXogIiRvbGRfY2MiIC1hIC16ICIkb2xkX2NmbGFncyI7IHRoZW4KLSAgICBlY2hvIE5vIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCi0gICAgc2hhcmVkPTA7Ci0gIGVsc2UKLSAgICBlY2hvICdObyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0OyB0cnkgd2l0aG91dCBkZWZpbmluZyBDQyBhbmQgQ0ZMQUdTJwotICAgIHNoYXJlZD0wOwotICBmaQotZmkKLWlmIHRlc3QgJHNoYXJlZCAtZXEgMDsgdGhlbgotICBMRFNIQVJFRD0iJENDIgotICBlY2hvIEJ1aWxkaW5nIHN0YXRpYyBsaWJyYXJ5ICRMSUJTIHZlcnNpb24gJFZFUiB3aXRoICRDQy4KLWVsc2UKLSAgTERGTEFHUz0iLUwuICR7U0hBUkVETElCVn0iCi1maQotCi1jYXQgPiAkdGVzdC5jIDw8RU9GCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci1pbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLUVPRgotaWYgdGVzdCAiYCgkQ0MgLWMgJENGTEFHUyAkdGVzdC5jKSAyPiYxYCIgPSAiIjsgdGhlbgotICBzZWQgPCB6Y29uZi5pbi5oICIvSEFWRV9VTklTVERfSC9zJTAlMSUiID4gemNvbmYuaAotICBlY2hvICJDaGVja2luZyBmb3IgdW5pc3RkLmguLi4gWWVzLiIKLWVsc2UKLSAgY3AgLXAgemNvbmYuaW4uaCB6Y29uZi5oCi0gIGVjaG8gIkNoZWNraW5nIGZvciB1bmlzdGQuaC4uLiBOby4iCi1maQotCi1jYXQgPiAkdGVzdC5jIDw8RU9GCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJ6Y29uZi5oIgotCi1pbnQgbWFpbigpCi17Ci0jaWZuZGVmIFNUREMKLSAgY2hva2UgbWUKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotRU9GCi0KLWlmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KLSAgZWNobyAiQ2hlY2tpbmcgd2hldGhlciB0byB1c2UgdnNbbl1wcmludGYoKSBvciBzW25dcHJpbnRmKCkuLi4gdXNpbmcgdnNbbl1wcmludGYoKSIKLQotICBjYXQgPiAkdGVzdC5jIDw8RU9GCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotaW50IG15dGVzdChjaGFyICpmbXQsIC4uLikKLXsKLSAgY2hhciBidWZbMjBdOwotICB2YV9saXN0IGFwOwotCi0gIHZhX3N0YXJ0KGFwLCBmbXQpOwotICB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgbWFpbigpCi17Ci0gIHJldHVybiAobXl0ZXN0KCJIZWxsbyVkXG4iLCAxKSk7Ci19Ci1FT0YKLQotICBpZiB0ZXN0ICJgKCRDQyAkQ0ZMQUdTIC1vICR0ZXN0ICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCi0gICAgZWNobyAiQ2hlY2tpbmcgZm9yIHZzbnByaW50ZigpIGluIHN0ZGlvLmguLi4gWWVzLiIKLQotICAgIGNhdCA+JHRlc3QuYyA8PEVPRgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLWludCBteXRlc3QoY2hhciAqZm10LCAuLi4pCi17Ci0gIGludCBuOwotICBjaGFyIGJ1ZlsyMF07Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gIG4gPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gIHJldHVybiBuOwotfQotCi1pbnQgbWFpbigpCi17Ci0gIHJldHVybiAobXl0ZXN0KCJIZWxsbyVkXG4iLCAxKSk7Ci19Ci1FT0YKLQotICAgIGlmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNucHJpbnRmKCkuLi4gWWVzLiIKLSAgICBlbHNlCi0gICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfdnNucHJpbnRmX3ZvaWQiCi0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzbnByaW50ZigpLi4uIE5vLiIKLSAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSB2c25wcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIKLSAgICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgc3RyaW5nLWZvcm1hdCBzZWN1cml0eSIKLSAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIKLSAgICBmaQotICBlbHNlCi0gICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ETk9fdnNucHJpbnRmIgotICAgIGVjaG8gIkNoZWNraW5nIGZvciB2c25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIKLSAgICBlY2hvICIgIFdBUk5JTkc6IHZzbnByaW50ZigpIG5vdCBmb3VuZCwgZmFsbGluZyBiYWNrIHRvIHZzcHJpbnRmKCkuIHpsaWIiCi0gICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBidWZmZXItb3ZlcmZsb3cgc2VjdXJpdHkiCi0gICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIgotCi0gICAgY2F0ID4kdGVzdC5jIDw8RU9GCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotaW50IG15dGVzdChjaGFyICpmbXQsIC4uLikKLXsKLSAgaW50IG47Ci0gIGNoYXIgYnVmWzIwXTsKLSAgdmFfbGlzdCBhcDsKLQotICB2YV9zdGFydChhcCwgZm10KTsKLSAgbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gIHJldHVybiBuOwotfQotCi1pbnQgbWFpbigpCi17Ci0gIHJldHVybiAobXl0ZXN0KCJIZWxsbyVkXG4iLCAxKSk7Ci19Ci1FT0YKLQotICAgIGlmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNwcmludGYoKS4uLiBZZXMuIgotICAgIGVsc2UKLSAgICAgIENGTEFHUz0iJENGTEFHUyAtREhBU192c3ByaW50Zl92b2lkIgotICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiB2c3ByaW50ZigpLi4uIE5vLiIKLSAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSB2c3ByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIgotICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IgotICAgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIGVjaG8gIkNoZWNraW5nIHdoZXRoZXIgdG8gdXNlIHZzW25dcHJpbnRmKCkgb3Igc1tuXXByaW50ZigpLi4uIHVzaW5nIHNbbl1wcmludGYoKSIKLQotICBjYXQgPiR0ZXN0LmMgPDxFT0YKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgbXl0ZXN0KCkKLXsKLSAgY2hhciBidWZbMjBdOwotCi0gIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyIsICJmb28iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBtYWluKCkKLXsKLSAgcmV0dXJuIChteXRlc3QoKSk7Ci19Ci1FT0YKLQotICBpZiB0ZXN0ICJgKCRDQyAkQ0ZMQUdTIC1vICR0ZXN0ICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCi0gICAgZWNobyAiQ2hlY2tpbmcgZm9yIHNucHJpbnRmKCkgaW4gc3RkaW8uaC4uLiBZZXMuIgotCi0gICAgY2F0ID4kdGVzdC5jIDw8RU9GCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50IG15dGVzdCgpCi17Ci0gIGNoYXIgYnVmWzIwXTsKLQotICByZXR1cm4gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgImZvbyIpOwotfQotCi1pbnQgbWFpbigpCi17Ci0gIHJldHVybiAobXl0ZXN0KCkpOwotfQotRU9GCi0KLSAgICBpZiB0ZXN0ICJgKCRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCi0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHNucHJpbnRmKCkuLi4gWWVzLiIKLSAgICBlbHNlCi0gICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfc25wcmludGZfdm9pZCIKLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBOby4iCi0gICAgICBlY2hvICIgIFdBUk5JTkc6IGFwcGFyZW50bHkgc25wcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIKLSAgICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgc3RyaW5nLWZvcm1hdCBzZWN1cml0eSIKLSAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIKLSAgICBmaQotICBlbHNlCi0gICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ETk9fc25wcmludGYiCi0gICAgZWNobyAiQ2hlY2tpbmcgZm9yIHNucHJpbnRmKCkgaW4gc3RkaW8uaC4uLiBOby4iCi0gICAgZWNobyAiICBXQVJOSU5HOiBzbnByaW50ZigpIG5vdCBmb3VuZCwgZmFsbGluZyBiYWNrIHRvIHNwcmludGYoKS4gemxpYiIKLSAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIGJ1ZmZlci1vdmVyZmxvdyBzZWN1cml0eSIKLSAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iCi0KLSAgICBjYXQgPiR0ZXN0LmMgPDxFT0YKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgbXl0ZXN0KCkKLXsKLSAgY2hhciBidWZbMjBdOwotCi0gIHJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzIiwgImZvbyIpOwotfQotCi1pbnQgbWFpbigpCi17Ci0gIHJldHVybiAobXl0ZXN0KCkpOwotfQotRU9GCi0KLSAgICBpZiB0ZXN0ICJgKCRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCi0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHNwcmludGYoKS4uLiBZZXMuIgotICAgIGVsc2UKLSAgICAgIENGTEFHUz0iJENGTEFHUyAtREhBU19zcHJpbnRmX3ZvaWQiCi0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHNwcmludGYoKS4uLiBOby4iCi0gICAgICBlY2hvICIgIFdBUk5JTkc6IGFwcGFyZW50bHkgc3ByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIgotICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IgotICAgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIgotICAgIGZpCi0gIGZpCi1maQotCi1jYXQgPiR0ZXN0LmMgPDxFT0YKLSNpbmNsdWRlIDxlcnJuby5oPgotaW50IG1haW4oKSB7IHJldHVybiAwOyB9Ci1FT0YKLWlmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KLSAgZWNobyAiQ2hlY2tpbmcgZm9yIGVycm5vLmguLi4gWWVzLiIKLWVsc2UKLSAgZWNobyAiQ2hlY2tpbmcgZm9yIGVycm5vLmguLi4gTm8uIgotICBDRkxBR1M9IiRDRkxBR1MgLUROT19FUlJOT19IIgotZmkKLQotY2F0ID4gJHRlc3QuYyA8PEVPRgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLWNhZGRyX3QgaGVsbG8oKSB7Ci0gIHJldHVybiBtbWFwKChjYWRkcl90KTAsIChvZmZfdCkwLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIDAsIChvZmZfdCkwKTsKLX0KLUVPRgotaWYgdGVzdCAiYCgkQ0MgLWMgJENGTEFHUyAkdGVzdC5jKSAyPiYxYCIgPSAiIjsgdGhlbgotICBDRkxBR1M9IiRDRkxBR1MgLURVU0VfTU1BUCIKLSAgZWNobyBDaGVja2luZyBmb3IgbW1hcCBzdXBwb3J0Li4uIFllcy4KLWVsc2UKLSAgZWNobyBDaGVja2luZyBmb3IgbW1hcCBzdXBwb3J0Li4uIE5vLgotZmkKLQotQ1BQPSR7Q1BQLSIkQ0MgLUUifQotY2FzZSAkQ0ZMQUdTIGluCi0gICpBU01WKikKLSAgICBpZiB0ZXN0ICJgbm0gJHRlc3QubyB8IGdyZXAgX2hlbGxvYCIgPSAiIjsgdGhlbgotICAgICAgQ1BQPSIkQ1BQIC1ETk9fVU5ERVJMSU5FIgotICAgICAgZWNobyBDaGVja2luZyBmb3IgdW5kZXJsaW5lIGluIGV4dGVybmFsIG5hbWVzLi4uIE5vLgotICAgIGVsc2UKLSAgICAgIGVjaG8gQ2hlY2tpbmcgZm9yIHVuZGVybGluZSBpbiBleHRlcm5hbCBuYW1lcy4uLiBZZXMuCi0gICAgZmk7OwotZXNhYwotCi1ybSAtZiAkdGVzdC5bY29dICR0ZXN0ICR0ZXN0JHNoYXJlZF9leHQKLQotIyB1ZHBhdGUgTWFrZWZpbGUKLXNlZCA8IE1ha2VmaWxlLmluICIKLS9eQ0MgKj0vcyM9LiojPSRDQyMKLS9eQ0ZMQUdTICo9L3MjPS4qIz0kQ0ZMQUdTIwotL15DUFAgKj0vcyM9LiojPSRDUFAjCi0vXkxEU0hBUkVEICo9L3MjPS4qIz0kTERTSEFSRUQjCi0vXkxJQlMgKj0vcyM9LiojPSRMSUJTIwotL15TSEFSRURMSUIgKj0vcyM9LiojPSRTSEFSRURMSUIjCi0vXlNIQVJFRExJQlYgKj0vcyM9LiojPSRTSEFSRURMSUJWIwotL15TSEFSRURMSUJNICo9L3MjPS4qIz0kU0hBUkVETElCTSMKLS9eQVIgKj0vcyM9LiojPSRBUiMKLS9eUkFOTElCICo9L3MjPS4qIz0kUkFOTElCIwotL15FWEUgKj0vcyM9LiojPSRFWEUjCi0vXnByZWZpeCAqPS9zIz0uKiM9JHByZWZpeCMKLS9eZXhlY19wcmVmaXggKj0vcyM9LiojPSRleGVjX3ByZWZpeCMKLS9ebGliZGlyICo9L3MjPS4qIz0kbGliZGlyIwotL15pbmNsdWRlZGlyICo9L3MjPS4qIz0kaW5jbHVkZWRpciMKLS9ebWFuZGlyICo9L3MjPS4qIz0kbWFuZGlyIwotL15MREZMQUdTICo9L3MjPS4qIz0kTERGTEFHUyMKLSIgPiBNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIgYi9saWJzL3psaWIvY29udHJpYi9SRUFETUUuY29udHJpYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhZmM2Mi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9SRUFETUUuY29udHJpYgorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLUFsbCBmaWxlcyB1bmRlciB0aGlzIGNvbnRyaWIgZGlyZWN0b3J5IGFyZSBVTlNVUFBPUlRFRC4gVGhlcmUgd2VyZQotcHJvdmlkZWQgYnkgdXNlcnMgb2YgemxpYiBhbmQgd2VyZSBub3QgdGVzdGVkIGJ5IHRoZSBhdXRob3JzIG9mIHpsaWIuCi1Vc2UgYXQgeW91ciBvd24gcmlzay4gUGxlYXNlIGNvbnRhY3QgdGhlIGF1dGhvcnMgb2YgdGhlIGNvbnRyaWJ1dGlvbnMKLWZvciBoZWxwIGFib3V0IHRoZXNlLCBub3QgdGhlIHpsaWIgYXV0aG9ycy4gVGhhbmtzLgotCi0KLWFkYS8gICAgICAgIGJ5IERtaXRyaXkgQW5pc2lta292IDxhbmlzaW1rb3ZAeWFob28uY29tPgotICAgICAgICBTdXBwb3J0IGZvciBBZGEKLSAgICAgICAgU2VlIGh0dHA6Ly96bGliLWFkYS5zb3VyY2Vmb3JnZS5uZXQvCi0KLWFzbTU4Ni8KLWFzbTY4Ni8gICAgIGJ5IEJyaWFuIFJhaXRlciA8YnJlYWRib3hAbXVwcGV0bGFicy5jb20+Ci0gICAgICAgIGFzbSBjb2RlIGZvciBQZW50aXVtIGFuZCBQUHJvL1BJSSwgdXNpbmcgdGhlIEFUJlQgKEdOVSBhcykgc3ludGF4Ci0gICAgICAgIFNlZSBodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sCi0KLWJsYXN0LyAgICAgIGJ5IE1hcmsgQWRsZXIgPG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHU+Ci0gICAgICAgIERlY29tcHJlc3NvciBmb3Igb3V0cHV0IG9mIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkgKERDTCkKLQotZGVscGhpLyAgICAgYnkgQ29zbWluIFRydXRhIDxjb3NtaW50QGNzLnViYmNsdWoucm8+Ci0gICAgICAgIFN1cHBvcnQgZm9yIERlbHBoaSBhbmQgQysrIEJ1aWxkZXIKLQotZG90emxpYi8gICAgYnkgSGVucmlrIFJhdm4gPGhlbnJpa0ByYXZuLmNvbT4KLSAgICAgICAgU3VwcG9ydCBmb3IgTWljcm9zb2Z0IC5OZXQgYW5kIFZpc3VhbCBDKysgLk5ldAotCi1pbmZiYWNrOS8gICBieSBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgotICAgICAgICBVbnN1cHBvcnRlZCBkaWZmcyB0byBpbmZiYWNrIHRvIGRlY29kZSB0aGUgZGVmbGF0ZTY0IGZvcm1hdAotCi1pbmZsYXRlODYvICBieSBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0PgotICAgICAgICBUdW5lZCB4ODYgZ2NjIGFzbSBjb2RlIHRvIHJlcGxhY2UgaW5mbGF0ZV9mYXN0KCkKLQotaW9zdHJlYW0vICAgYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+Ci0gICAgICAgIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCi0KLWlvc3RyZWFtMi8gIGJ5IFR5Z2UgTPh2c2V0IDxUeWdlLkxvdnNldEBjbXIubm8+Ci0gICAgICAgIEFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQotCi1pb3N0cmVhbTMvICBieSBMdWR3aWcgU2Nod2FyZHQgPHNjaHdhcmR0QHN1bi5hYy56YT4KLSAgICAgICAgICAgIGFuZCBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KLSAgICAgICAgWWV0IGFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQotCi1tYXNtNjg2LyAgICBieSBEYW4gSGlnZG9uIDxoZGFuQGtpbmVzb2Z0LmNvbT4KLSAgICAgICAgICAgIGFuZCBDaHVjayBXYWxib3VybiA8Y2h1Y2t3QGtpbmVzb2Z0LmNvbT4KLSAgICAgICAgYXNtIGNvZGUgZm9yIFBlbnRpdW0gUHJvL1BJSSwgdXNpbmcgdGhlIE1BU00gc3ludGF4Ci0KLW1hc214NjQvICAgIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KLQl4ODYgNjQtYml0IChBTUQ2NCBhbmQgSW50ZWwgRU02NHQpIGNvZGUgZm9yIHg2NCBhc3NlbWJsZXIgdG8KLQlyZXBsYWNlIGxvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCkKLQotbWFzbXg4Ni8gICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgotICAgICAgICB4ODYgYXNtIGNvZGUgdG8gcmVwbGFjZSBsb25nZXN0X21hdGNoKCkgYW5kIGluZmxhdGVfZmFzdCgpLAotICAgICAgICBmb3IgVmlzdWFsIEMrKyBhbmQgTUFTTQotCi1taW5pemlwLyAgICBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+Ci0gICAgICAgIE1pbmkgemlwIGFuZCB1bnppcCBiYXNlZCBvbiB6bGliCi0gICAgICAgIFNlZSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwKLQotcGFzY2FsLyAgICAgYnkgQm9iIERlbGxhY2EgPGJvYmRsQHh0cmEuY28ubno+IGV0IGFsLgotICAgICAgICBTdXBwb3J0IGZvciBQYXNjYWwKLQotcHVmZi8gICAgICAgYnkgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4KLSAgICAgICAgU21hbGwsIGxvdyBtZW1vcnkgdXNhZ2UgaW5mbGF0ZS4gIEFsc28gc2VydmVzIHRvIHByb3ZpZGUgYW4KLSAgICAgICAgdW5hbWJpZ3VvdXMgZGVzY3JpcHRpb24gb2YgdGhlIGRlZmxhdGUgZm9ybWF0LgotCi10ZXN0emxpYi8gICBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+Ci0gICAgICAgIEV4YW1wbGUgb2YgdGhlIHVzZSBvZiB6bGliCi0KLXVudGd6LyAgICAgIGJ5IFBlZHJvIEEuIEFyYW5kYSBHdXRpZXJyZXogPHBhYWdAdGlkLmVzPgotICAgICAgICBBIHZlcnkgc2ltcGxlIHRhci5neiBmaWxlIGV4dHJhY3RvciB1c2luZyB6bGliCi0KLXZzdHVkaW8vICAgIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KLSAgICAgICAgQnVpbGRpbmcgYSBtaW5pemlwLWVuaGFuY2VkIHpsaWIgd2l0aCBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvYWRhL2J1ZmZlcl9kZW1vLmFkYiBiL2xpYnMvemxpYi9jb250cmliL2FkYS9idWZmZXJfZGVtby5hZGIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Yjg2MzguLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvYWRhL2J1ZmZlcl9kZW1vLmFkYgorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLQotLS0gICRJZDogYnVmZmVyX2RlbW8uYWRiLHYgMS4zIDIwMDQvMDkvMDYgMDY6NTU6MzUgdmFndWwgRXhwICQKLQotLS0gIFRoaXMgZGVtbyBwcm9ncmFtIHByb3ZpZGVkIGJ5IERyIFN0ZXZlIFNhbmd3aW5lIDxzanNAZXNzZXguYWMudWs+Ci0tLQotLS0gIERlbW9uc3RyYXRpb24gb2YgYSBwcm9ibGVtIHdpdGggWmxpYi1BZGEgKGFscmVhZHkgZml4ZWQpIHdoZW4gYSBidWZmZXIKLS0tICBvZiBleGFjdGx5IHRoZSBjb3JyZWN0IHNpemUgaXMgdXNlZCBmb3IgZGVjb21wcmVzc2VkIGRhdGEsIGFuZCB0aGUgbGFzdAotLS0gIGZldyBieXRlcyBwYXNzZWQgaW4gdG8gWmxpYiBhcmUgY2hlY2tzdW0gYnl0ZXMuCi0KLS0tICBUaGlzIHByb2dyYW0gY29tcHJlc3NlcyBhIHN0cmluZyBvZiB0ZXh0LCBhbmQgdGhlbiBkZWNvbXByZXNzZXMgdGhlCi0tLSAgY29tcHJlc3NlZCB0ZXh0IGludG8gYSBidWZmZXIgb2YgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgb3JpZ2luYWwgdGV4dC4KLQotd2l0aCBBZGEuU3RyZWFtczsgdXNlIEFkYS5TdHJlYW1zOwotd2l0aCBBZGEuVGV4dF9JTzsKLQotd2l0aCBaTGliOyB1c2UgWkxpYjsKLQotcHJvY2VkdXJlIEJ1ZmZlcl9EZW1vIGlzCi0gICBFT0wgIDogQ2hhcmFjdGVyIHJlbmFtZXMgQVNDSUkuTEY7Ci0gICBUZXh0IDogY29uc3RhbnQgU3RyaW5nCi0gICAgIDo9ICJGb3VyIHNjb3JlIGFuZCBzZXZlbiB5ZWFycyBhZ28gb3VyIGZhdGhlcnMgYnJvdWdodCBmb3J0aCwiICYgRU9MICYKLSAgICAgICAgInVwb24gdGhpcyBjb250aW5lbnQsIGEgbmV3IG5hdGlvbiwgY29uY2VpdmVkIGluIGxpYmVydHksIiAmIEVPTCAmCi0gICAgICAgICJhbmQgZGVkaWNhdGVkIHRvIHRoZSBwcm9wb3NpdGlvbiB0aGF0IGBhbGwgbWVuIGFyZSBjcmVhdGVkIGVxdWFsJy4iOwotCi0gICBTb3VyY2UgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiBUZXh0J0xlbmd0aCk7Ci0gICBmb3IgU291cmNlJ0FkZHJlc3MgdXNlIFRleHQnQWRkcmVzczsKLQotYmVnaW4KLSAgIEFkYS5UZXh0X0lPLlB1dCAoVGV4dCk7Ci0gICBBZGEuVGV4dF9JTy5OZXdfTGluZTsKLSAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lCi0gICAgICgiVW5jb21wcmVzc2VkIHNpemUgOiAiICYgUG9zaXRpdmUnSW1hZ2UgKFRleHQnTGVuZ3RoKSAmICIgYnl0ZXMiKTsKLQotICAgZGVjbGFyZQotICAgICAgQ29tcHJlc3NlZF9EYXRhIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gVGV4dCdMZW5ndGgpOwotICAgICAgTCAgICAgICAgICAgICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgYmVnaW4KLSAgICAgIENvbXByZXNzIDogZGVjbGFyZQotICAgICAgICAgQ29tcHJlc3NvciA6IEZpbHRlcl9UeXBlOwotICAgICAgICAgSSA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIGJlZ2luCi0gICAgICAgICBEZWZsYXRlX0luaXQgKENvbXByZXNzb3IpOwotCi0gICAgICAgICAtLSAgQ29tcHJlc3MgdGhlIHdob2xlIG9mIFQgYXQgb25jZS4KLQotICAgICAgICAgVHJhbnNsYXRlIChDb21wcmVzc29yLCBTb3VyY2UsIEksIENvbXByZXNzZWRfRGF0YSwgTCwgRmluaXNoKTsKLSAgICAgICAgIHByYWdtYSBBc3NlcnQgKEkgPSBTb3VyY2UnTGFzdCk7Ci0KLSAgICAgICAgIENsb3NlIChDb21wcmVzc29yKTsKLQotICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUKLSAgICAgICAgICAgKCJDb21wcmVzc2VkIHNpemUgOiAgICIKLSAgICAgICAgICAgICYgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J0ltYWdlIChMKSAmICIgYnl0ZXMiKTsKLSAgICAgIGVuZCBDb21wcmVzczsKLQotICAgICAgLS0gIE5vdyB3ZSBkZWNvbXByZXNzIHRoZSBkYXRhLCBwYXNzaW5nIHNob3J0IGJsb2NrcyBvZiBkYXRhIHRvIFpsaWIKLSAgICAgIC0tICAoYmVjYXVzZSB0aGlzIGRlbW9uc3RyYXRlcyB0aGUgcHJvYmxlbSAtIHRoZSBsYXN0IGJsb2NrIHBhc3NlZCB3aWxsCi0gICAgICAtLSAgY29udGFpbiBjaGVja3N1bSBpbmZvcm1hdGlvbiBhbmQgdGhlcmUgd2lsbCBiZSBubyBvdXRwdXQsIG9ubHkgYQotICAgICAgLS0gIGNoZWNrIGluc2lkZSBabGliIHRoYXQgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QpLgotCi0gICAgICBEZWNvbXByZXNzIDogZGVjbGFyZQotICAgICAgICAgRGVjb21wcmVzc29yIDogRmlsdGVyX1R5cGU7Ci0KLSAgICAgICAgIFVuY29tcHJlc3NlZF9EYXRhIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gVGV4dCdMZW5ndGgpOwotCi0gICAgICAgICBCbG9ja19TaXplIDogY29uc3RhbnQgOj0gNDsKLSAgICAgICAgIC0tICBUaGlzIG1ha2VzIHN1cmUgdGhhdCB0aGUgbGFzdCBibG9jayBjb250YWlucwotICAgICAgICAgLS0gIG9ubHkgQWRsZXIgY2hlY2tzdW0gZGF0YS4KLQotICAgICAgICAgUCA6IFN0cmVhbV9FbGVtZW50X09mZnNldCA6PSBDb21wcmVzc2VkX0RhdGEnRmlyc3QgLSAxOwotICAgICAgICAgTyA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIGJlZ2luCi0gICAgICAgICBJbmZsYXRlX0luaXQgKERlY29tcHJlc3Nvcik7Ci0KLSAgICAgICAgIGxvb3AKLSAgICAgICAgICAgIFRyYW5zbGF0ZQotICAgICAgICAgICAgICAoRGVjb21wcmVzc29yLAotICAgICAgICAgICAgICAgQ29tcHJlc3NlZF9EYXRhCi0gICAgICAgICAgICAgICAgIChQICsgMSAuLiBTdHJlYW1fRWxlbWVudF9PZmZzZXQnTWluIChQICsgQmxvY2tfU2l6ZSwgTCkpLAotICAgICAgICAgICAgICAgUCwKLSAgICAgICAgICAgICAgIFVuY29tcHJlc3NlZF9EYXRhCi0gICAgICAgICAgICAgICAgIChUb3RhbF9PdXQgKERlY29tcHJlc3NvcikgKyAxIC4uIFVuY29tcHJlc3NlZF9EYXRhJ0xhc3QpLAotICAgICAgICAgICAgICAgTywKLSAgICAgICAgICAgICAgIE5vX0ZsdXNoKTsKLQotICAgICAgICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUKLSAgICAgICAgICAgICAgICAgKCJUb3RhbCBpbiA6ICIgJiBDb3VudCdJbWFnZSAoVG90YWxfSW4gKERlY29tcHJlc3NvcikpICYKLSAgICAgICAgICAgICAgICAgICIsIG91dCA6ICIgJiBDb3VudCdJbWFnZSAoVG90YWxfT3V0IChEZWNvbXByZXNzb3IpKSk7Ci0KLSAgICAgICAgICAgICAgIGV4aXQgd2hlbiBQID0gTDsKLSAgICAgICAgIGVuZCBsb29wOwotCi0gICAgICAgICBBZGEuVGV4dF9JTy5OZXdfTGluZTsKLSAgICAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lCi0gICAgICAgICAgICgiRGVjb21wcmVzc2VkIHRleHQgbWF0Y2hlcyBvcmlnaW5hbCB0ZXh0IDogIgotICAgICAgICAgICAgICYgQm9vbGVhbidJbWFnZSAoVW5jb21wcmVzc2VkX0RhdGEgPSBTb3VyY2UpKTsKLSAgICAgIGVuZCBEZWNvbXByZXNzOwotICAgZW5kOwotZW5kIEJ1ZmZlcl9EZW1vOwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvYWRhL210ZXN0LmFkYiBiL2xpYnMvemxpYi9jb250cmliL2FkYS9tdGVzdC5hZGIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZGZkMDguLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvYWRhL210ZXN0LmFkYgorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLSAgQ29udGludW91cyB0ZXN0IGZvciBaTGliIG11bHRpdGhyZWFkaW5nLiBJZiB0aGUgdGVzdCB3b3VsZCBmYWlsCi0tLSAgd2Ugc2hvdWxkIHByb3ZpZGUgdGhyZWFkIHNhZmUgYWxsb2NhdGlvbiByb3V0aW5lcyBmb3IgdGhlIFpfU3RyZWFtLgotLS0KLS0tICAkSWQ6IG10ZXN0LmFkYix2IDEuNCAyMDA0LzA3LzIzIDA3OjQ5OjU0IHZhZ3VsIEV4cCAkCi0KLXdpdGggWkxpYjsKLXdpdGggQWRhLlN0cmVhbXM7Ci13aXRoIEFkYS5OdW1lcmljcy5EaXNjcmV0ZV9SYW5kb207Ci13aXRoIEFkYS5UZXh0X0lPOwotd2l0aCBBZGEuRXhjZXB0aW9uczsKLXdpdGggQWRhLlRhc2tfSWRlbnRpZmljYXRpb247Ci0KLXByb2NlZHVyZSBNVGVzdCBpcwotICAgdXNlIEFkYS5TdHJlYW1zOwotICAgdXNlIFpMaWI7Ci0KLSAgIFN0b3AgOiBCb29sZWFuIDo9IEZhbHNlOwotCi0gICBwcmFnbWEgQXRvbWljIChTdG9wKTsKLQotICAgc3VidHlwZSBWaXNpYmxlX1N5bWJvbHMgaXMgU3RyZWFtX0VsZW1lbnQgcmFuZ2UgMTYjMjAjIC4uIDE2IzdFIzsKLQotICAgcGFja2FnZSBSYW5kb21fRWxlbWVudHMgaXMKLSAgICAgIG5ldyBBZGEuTnVtZXJpY3MuRGlzY3JldGVfUmFuZG9tIChWaXNpYmxlX1N5bWJvbHMpOwotCi0gICB0YXNrIHR5cGUgVGVzdF9UYXNrOwotCi0gICB0YXNrIGJvZHkgVGVzdF9UYXNrIGlzCi0gICAgICBCdWZmZXIgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiAxMDBfMDAwKTsKLSAgICAgIEdlbiA6IFJhbmRvbV9FbGVtZW50cy5HZW5lcmF0b3I7Ci0KLSAgICAgIEJ1ZmZlcl9GaXJzdCAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBDb21wYXJlX0ZpcnN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotCi0gICAgICBEZWZsYXRlIDogRmlsdGVyX1R5cGU7Ci0gICAgICBJbmZsYXRlIDogRmlsdGVyX1R5cGU7Ci0KLSAgICAgIHByb2NlZHVyZSBGdXJ0aGVyIChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpOwotCi0gICAgICBwcm9jZWR1cmUgUmVhZF9CdWZmZXIKLSAgICAgICAgKEl0ZW0gOiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICAgICBMYXN0IDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldCk7Ci0KLSAgICAgIC0tLS0tLS0tLS0tLS0KLSAgICAgIC0tIEZ1cnRoZXIgLS0KLSAgICAgIC0tLS0tLS0tLS0tLS0KLQotICAgICAgcHJvY2VkdXJlIEZ1cnRoZXIgKEl0ZW0gOiBpbiBTdHJlYW1fRWxlbWVudF9BcnJheSkgaXMKLQotICAgICAgICAgcHJvY2VkdXJlIENvbXBhcmUgKEl0ZW0gOiBpbiBTdHJlYW1fRWxlbWVudF9BcnJheSk7Ci0KLSAgICAgICAgIC0tLS0tLS0tLS0tLS0KLSAgICAgICAgIC0tIENvbXBhcmUgLS0KLSAgICAgICAgIC0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgcHJvY2VkdXJlIENvbXBhcmUgKEl0ZW0gOiBpbiBTdHJlYW1fRWxlbWVudF9BcnJheSkgaXMKLSAgICAgICAgICAgIE5leHRfRmlyc3QgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gQ29tcGFyZV9GaXJzdCArIEl0ZW0nTGVuZ3RoOwotICAgICAgICAgYmVnaW4KLSAgICAgICAgICAgIGlmIEJ1ZmZlciAoQ29tcGFyZV9GaXJzdCAuLiBOZXh0X0ZpcnN0IC0gMSkgLz0gSXRlbSB0aGVuCi0gICAgICAgICAgICAgICByYWlzZSBQcm9ncmFtX0Vycm9yOwotICAgICAgICAgICAgZW5kIGlmOwotCi0gICAgICAgICAgICBDb21wYXJlX0ZpcnN0IDo9IE5leHRfRmlyc3Q7Ci0gICAgICAgICBlbmQgQ29tcGFyZTsKLQotICAgICAgICAgcHJvY2VkdXJlIENvbXBhcmVfV3JpdGUgaXMgbmV3IFpMaWIuV3JpdGUgKFdyaXRlID0+IENvbXBhcmUpOwotICAgICAgYmVnaW4KLSAgICAgICAgIENvbXBhcmVfV3JpdGUgKEluZmxhdGUsIEl0ZW0sIE5vX0ZsdXNoKTsKLSAgICAgIGVuZCBGdXJ0aGVyOwotCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLS0gUmVhZF9CdWZmZXIgLS0KLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIHByb2NlZHVyZSBSZWFkX0J1ZmZlcgotICAgICAgICAoSXRlbSA6IG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgICAgIExhc3QgOiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KQotICAgICAgaXMKLSAgICAgICAgIEJ1ZmZfRGlmZiAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IEJ1ZmZlcidMYXN0IC0gQnVmZmVyX0ZpcnN0OwotICAgICAgICAgTmV4dF9GaXJzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIGJlZ2luCi0gICAgICAgICBpZiBJdGVtJ0xlbmd0aCA8PSBCdWZmX0RpZmYgdGhlbgotICAgICAgICAgICAgTGFzdCA6PSBJdGVtJ0xhc3Q7Ci0KLSAgICAgICAgICAgIE5leHRfRmlyc3QgOj0gQnVmZmVyX0ZpcnN0ICsgSXRlbSdMZW5ndGg7Ci0KLSAgICAgICAgICAgIEl0ZW0gOj0gQnVmZmVyIChCdWZmZXJfRmlyc3QgLi4gTmV4dF9GaXJzdCAtIDEpOwotCi0gICAgICAgICAgICBCdWZmZXJfRmlyc3QgOj0gTmV4dF9GaXJzdDsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIExhc3QgOj0gSXRlbSdGaXJzdCArIEJ1ZmZfRGlmZjsKLSAgICAgICAgICAgIEl0ZW0gKEl0ZW0nRmlyc3QgLi4gTGFzdCkgOj0gQnVmZmVyIChCdWZmZXJfRmlyc3QgLi4gQnVmZmVyJ0xhc3QpOwotICAgICAgICAgICAgQnVmZmVyX0ZpcnN0IDo9IEJ1ZmZlcidMYXN0ICsgMTsKLSAgICAgICAgIGVuZCBpZjsKLSAgICAgIGVuZCBSZWFkX0J1ZmZlcjsKLQotICAgICAgcHJvY2VkdXJlIFRyYW5zbGF0ZSBpcyBuZXcgR2VuZXJpY19UcmFuc2xhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERhdGFfSW4gID0+IFJlYWRfQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YV9PdXQgPT4gRnVydGhlcik7Ci0KLSAgIGJlZ2luCi0gICAgICBSYW5kb21fRWxlbWVudHMuUmVzZXQgKEdlbik7Ci0KLSAgICAgIEJ1ZmZlciA6PSAob3RoZXJzID0+IDIwKTsKLQotICAgICAgTWFpbiA6IGxvb3AKLSAgICAgICAgIGZvciBKIGluIEJ1ZmZlcidSYW5nZSBsb29wCi0gICAgICAgICAgICBCdWZmZXIgKEopIDo9IFJhbmRvbV9FbGVtZW50cy5SYW5kb20gKEdlbik7Ci0KLSAgICAgICAgICAgIERlZmxhdGVfSW5pdCAoRGVmbGF0ZSk7Ci0gICAgICAgICAgICBJbmZsYXRlX0luaXQgKEluZmxhdGUpOwotCi0gICAgICAgICAgICBCdWZmZXJfRmlyc3QgIDo9IEJ1ZmZlcidGaXJzdDsKLSAgICAgICAgICAgIENvbXBhcmVfRmlyc3QgOj0gQnVmZmVyJ0ZpcnN0OwotCi0gICAgICAgICAgICBUcmFuc2xhdGUgKERlZmxhdGUpOwotCi0gICAgICAgICAgICBpZiBDb21wYXJlX0ZpcnN0IC89IEJ1ZmZlcidMYXN0ICsgMSB0aGVuCi0gICAgICAgICAgICAgICByYWlzZSBQcm9ncmFtX0Vycm9yOwotICAgICAgICAgICAgZW5kIGlmOwotCi0gICAgICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZQotICAgICAgICAgICAgICAoQWRhLlRhc2tfSWRlbnRpZmljYXRpb24uSW1hZ2UKLSAgICAgICAgICAgICAgICAgKEFkYS5UYXNrX0lkZW50aWZpY2F0aW9uLkN1cnJlbnRfVGFzaykKLSAgICAgICAgICAgICAgICYgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J0ltYWdlIChKKQotICAgICAgICAgICAgICAgJiBaTGliLkNvdW50J0ltYWdlIChUb3RhbF9PdXQgKERlZmxhdGUpKSk7Ci0KLSAgICAgICAgICAgIENsb3NlIChEZWZsYXRlKTsKLSAgICAgICAgICAgIENsb3NlIChJbmZsYXRlKTsKLQotICAgICAgICAgICAgZXhpdCBNYWluIHdoZW4gU3RvcDsKLSAgICAgICAgIGVuZCBsb29wOwotICAgICAgZW5kIGxvb3AgTWFpbjsKLSAgIGV4Y2VwdGlvbgotICAgICAgd2hlbiBFIDogb3RoZXJzID0+Ci0gICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoQWRhLkV4Y2VwdGlvbnMuRXhjZXB0aW9uX0luZm9ybWF0aW9uIChFKSk7Ci0gICAgICAgICBTdG9wIDo9IFRydWU7Ci0gICBlbmQgVGVzdF9UYXNrOwotCi0gICBUZXN0IDogYXJyYXkgKDEgLi4gNCkgb2YgVGVzdF9UYXNrOwotCi0gICBwcmFnbWEgVW5yZWZlcmVuY2VkIChUZXN0KTsKLQotICAgRHVtbXkgOiBDaGFyYWN0ZXI7Ci0KLWJlZ2luCi0gICBBZGEuVGV4dF9JTy5HZXRfSW1tZWRpYXRlIChEdW1teSk7Ci0gICBTdG9wIDo9IFRydWU7Ci1lbmQgTVRlc3Q7CmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9hZGEvcmVhZC5hZGIgYi9saWJzL3psaWIvY29udHJpYi9hZGEvcmVhZC5hZGIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMmVmYmYuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvYWRhL3JlYWQuYWRiCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0gICRJZDogcmVhZC5hZGIsdiAxLjggMjAwNC8wNS8zMSAxMDo1Mzo0MCB2YWd1bCBFeHAgJAotCi0tLSAgVGVzdC9kZW1vIHByb2dyYW0gZm9yIHRoZSBnZW5lcmljIHJlYWQgaW50ZXJmYWNlLgotCi13aXRoIEFkYS5OdW1lcmljcy5EaXNjcmV0ZV9SYW5kb207Ci13aXRoIEFkYS5TdHJlYW1zOwotd2l0aCBBZGEuVGV4dF9JTzsKLQotd2l0aCBaTGliOwotCi1wcm9jZWR1cmUgUmVhZCBpcwotCi0gICB1c2UgQWRhLlN0cmVhbXM7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gIFRlc3QgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgRmlsZV9TaXplICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gMTAwXzAwMDsKLQotICAgQ29udGludW91cyAgOiBjb25zdGFudCBCb29sZWFuICAgICAgICAgIDo9IEZhbHNlOwotICAgLS0gIElmIHRoaXMgY29uc3RhbnQgaXMgVHJ1ZSwgdGhlIHRlc3Qgd291bGQgYmUgcmVwZWF0ZWQgYWdhaW4gYW5kIGFnYWluLAotICAgLS0gIHdpdGggaW5jcmVtZW50IEZpbGVfU2l6ZSBmb3IgZXZlcnkgaXRlcmF0aW9uLgotCi0gICBIZWFkZXIgICAgICA6IGNvbnN0YW50IFpMaWIuSGVhZGVyX1R5cGUgOj0gWkxpYi5EZWZhdWx0OwotICAgLS0gIERvIG5vdCB1c2UgSGVhZGVyIG90aGVyIHRoYW4gRGVmYXVsdCBpbiBaTGliIHZlcnNpb25zIDEuMS40IGFuZCBvbGRlci4KLQotICAgSW5pdF9SYW5kb20gOiBjb25zdGFudCA6PSA4OwotICAgLS0gIFdlIGFyZSB1c2luZyB0aGUgc2FtZSByYW5kb20gc2VxdWVuY2UsIGluIGNhc2Ugb2Ygd2UgY2F0Y2ggYnVnLAotICAgLS0gIHNvIHdlIHdvdWxkIGJlIGFibGUgdG8gcmVwcm9kdWNlIGl0LgotCi0gICAtLSBFbmQgLS0KLQotICAgUGFja19TaXplIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgT2Zmc2V0ICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotCi0gICBGaWx0ZXIgICAgIDogWkxpYi5GaWx0ZXJfVHlwZTsKLQotICAgc3VidHlwZSBWaXNpYmxlX1N5bWJvbHMKLSAgICAgIGlzIFN0cmVhbV9FbGVtZW50IHJhbmdlIDE2IzIwIyAuLiAxNiM3RSM7Ci0KLSAgIHBhY2thZ2UgUmFuZG9tX0VsZW1lbnRzIGlzIG5ldwotICAgICAgQWRhLk51bWVyaWNzLkRpc2NyZXRlX1JhbmRvbSAoVmlzaWJsZV9TeW1ib2xzKTsKLQotICAgR2VuIDogUmFuZG9tX0VsZW1lbnRzLkdlbmVyYXRvcjsKLSAgIFBlcmlvZCAgOiBjb25zdGFudCBTdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gMjAwOwotICAgLS0gIFBlcmlvZCBjb25zdGFudCB2YXJpYWJsZSBmb3IgcmFuZG9tIGdlbmVyYXRvciBub3QgdG8gYmUgdmVyeSByYW5kb20uCi0gICAtLSAgQmlnZ2VyIHBlcmlvZCwgaGFyZGVyIHJhbmRvbS4KLQotICAgUmVhZF9CdWZmZXIgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiAyMDQ4KTsKLSAgIFJlYWRfRmlyc3QgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgUmVhZF9MYXN0ICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0KLSAgIHByb2NlZHVyZSBSZXNldDsKLQotICAgcHJvY2VkdXJlIFJlYWQKLSAgICAgKEl0ZW0gOiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBMYXN0IDogb3V0IFN0cmVhbV9FbGVtZW50X09mZnNldCk7Ci0gICAtLSAgdGhpcyBwcm9jZWR1cmUgaXMgZm9yIGdlbmVyaWMgaW5zdGFudGlhdGlvbiBvZgotICAgLS0gIFpMaWIuUmVhZAotICAgLS0gIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBGaWxlX0luLgotCi0gICBwcm9jZWR1cmUgUmVhZCBpcyBuZXcgWkxpYi5SZWFkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkX0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN0X0ZpcnN0ID0+IFJlYWRfRmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdF9MYXN0ICA9PiBSZWFkX0xhc3QpOwotCi0gICAtLS0tLS0tLS0tCi0gICAtLSBSZWFkIC0tCi0gICAtLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBSZWFkCi0gICAgIChJdGVtIDogb3V0IFN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgTGFzdCA6IG91dCBTdHJlYW1fRWxlbWVudF9PZmZzZXQpIGlzCi0gICBiZWdpbgotICAgICAgTGFzdCA6PSBTdHJlYW1fRWxlbWVudF9PZmZzZXQnTWluCi0gICAgICAgICAgICAgICAoSXRlbSdMYXN0LAotICAgICAgICAgICAgICAgIEl0ZW0nRmlyc3QgKyBGaWxlX1NpemUgLSBPZmZzZXQpOwotCi0gICAgICBmb3IgSiBpbiBJdGVtJ0ZpcnN0IC4uIExhc3QgbG9vcAotICAgICAgICAgaWYgSiA8IEl0ZW0nRmlyc3QgKyBQZXJpb2QgdGhlbgotICAgICAgICAgICAgSXRlbSAoSikgOj0gUmFuZG9tX0VsZW1lbnRzLlJhbmRvbSAoR2VuKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIEl0ZW0gKEopIDo9IEl0ZW0gKEogLSBQZXJpb2QpOwotICAgICAgICAgZW5kIGlmOwotCi0gICAgICAgICBPZmZzZXQgICA6PSBPZmZzZXQgKyAxOwotICAgICAgZW5kIGxvb3A7Ci0gICBlbmQgUmVhZDsKLQotICAgLS0tLS0tLS0tLS0KLSAgIC0tIFJlc2V0IC0tCi0gICAtLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgUmVzZXQgaXMKLSAgIGJlZ2luCi0gICAgICBSYW5kb21fRWxlbWVudHMuUmVzZXQgKEdlbiwgSW5pdF9SYW5kb20pOwotICAgICAgUGFja19TaXplIDo9IDA7Ci0gICAgICBPZmZzZXQgOj0gMTsKLSAgICAgIFJlYWRfRmlyc3QgOj0gUmVhZF9CdWZmZXInTGFzdCArIDE7Ci0gICAgICBSZWFkX0xhc3QgIDo9IFJlYWRfQnVmZmVyJ0xhc3Q7Ci0gICBlbmQgUmVzZXQ7Ci0KLWJlZ2luCi0gICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoIlpMaWIgIiAmIFpMaWIuVmVyc2lvbik7Ci0KLSAgIGxvb3AKLSAgICAgIGZvciBMZXZlbCBpbiBaTGliLkNvbXByZXNzaW9uX0xldmVsJ1JhbmdlIGxvb3AKLQotICAgICAgICAgQWRhLlRleHRfSU8uUHV0ICgiTGV2ZWwgPSIKLSAgICAgICAgICAgICYgWkxpYi5Db21wcmVzc2lvbl9MZXZlbCdJbWFnZSAoTGV2ZWwpKTsKLQotICAgICAgICAgLS0gIERlZmxhdGUgdXNpbmcgZ2VuZXJpYyBpbnN0YW50aWF0aW9uLgotCi0gICAgICAgICBaTGliLkRlZmxhdGVfSW5pdAotICAgICAgICAgICAgICAgKEZpbHRlciwKLSAgICAgICAgICAgICAgICBMZXZlbCwKLSAgICAgICAgICAgICAgICBIZWFkZXIgPT4gSGVhZGVyKTsKLQotICAgICAgICAgUmVzZXQ7Ci0KLSAgICAgICAgIEFkYS5UZXh0X0lPLlB1dAotICAgICAgICAgICAoU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J0ltYWdlIChGaWxlX1NpemUpICYgIiAtPiIpOwotCi0gICAgICAgICBsb29wCi0gICAgICAgICAgICBkZWNsYXJlCi0gICAgICAgICAgICAgICBCdWZmZXIgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiAxMDI0KTsKLSAgICAgICAgICAgICAgIExhc3QgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICAgICBSZWFkIChGaWx0ZXIsIEJ1ZmZlciwgTGFzdCk7Ci0KLSAgICAgICAgICAgICAgIFBhY2tfU2l6ZSA6PSBQYWNrX1NpemUgKyBMYXN0IC0gQnVmZmVyJ0ZpcnN0ICsgMTsKLQotICAgICAgICAgICAgICAgZXhpdCB3aGVuIExhc3QgPCBCdWZmZXInTGFzdDsKLSAgICAgICAgICAgIGVuZDsKLSAgICAgICAgIGVuZCBsb29wOwotCi0gICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J0ltYWdlIChQYWNrX1NpemUpKTsKLQotICAgICAgICAgWkxpYi5DbG9zZSAoRmlsdGVyKTsKLSAgICAgIGVuZCBsb29wOwotCi0gICAgICBleGl0IHdoZW4gbm90IENvbnRpbnVvdXM7Ci0KLSAgICAgIEZpbGVfU2l6ZSA6PSBGaWxlX1NpemUgKyAxOwotICAgZW5kIGxvb3A7Ci1lbmQgUmVhZDsKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2FkYS9yZWFkbWUudHh0IGIvbGlicy96bGliL2NvbnRyaWIvYWRhL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNGQyY2EuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvYWRhL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZyAoWkxpYi5BZGEpCi0gICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlIDEuMwotCi1aTGliLkFkYSBpcyBhIHRoaWNrIGJpbmRpbmcgaW50ZXJmYWNlIHRvIHRoZSBwb3B1bGFyIFpMaWIgZGF0YQotY29tcHJlc3Npb24gbGlicmFyeSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8uCi1JdCBwcm92aWRlcyBBZGEtc3R5bGUgYWNjZXNzIHRvIHRoZSBaTGliIEMgbGlicmFyeS4KLQotCi0gICAgICAgIEhlcmUgYXJlIHRoZSBtYWluIGNoYW5nZXMgc2luY2UgWkxpYi5BZGEgMS4yOgotCi0tIEF0dGVuc2lvbjogWkxpYi5SZWFkIGdlbmVyaWMgcm91dGluZSBoYXZlIGEgaW5pdGlhbGl6YXRpb24gcmVxdWlyZW1lbnQKLSAgZm9yIFJlYWRfTGFzdCBwYXJhbWV0ZXIgbm93LiBJdCBpcyBhIGJpdCBpbmNvbXBhcnRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbiwKLSAgYnV0IGV4dGVuZHMgZnVuY3Rpb25hbGl0eSwgd2UgY291bGQgdXNlIG5ldyBwYXJhbWV0ZXJzIEFsbG93X1JlYWRfU29tZSBhbmQKLSAgRmx1c2ggbm93LgotCi0tIEFkZGVkIElzX09wZW4gcm91dGluZXMgdG8gWkxpYiBhbmQgWkxpYi5TdHJlYW1zIHBhY2thZ2VzLgotCi0tIEFkZCBwcmFnbWEgQXNzZXJ0IHRvIGNoZWNrIFN0cmVhbV9FbGVtZW50IGlzIDggYml0LgotCi0tIEZpeCBleHRyYWN0aW9uIHRvIGJ1ZmZlciB3aXRoIGV4YWN0IGtub3duIGRlY29tcHJlc3NlZCBzaXplLiBFcnJvciByZXBvcnRlZCBieQotICBTdGV2ZSBTYW5nd2luZS4KLQotLSBGaXggZGVmaW5pdGlvbiBvZiBVTG9uZyAoY2hhbmdlZCB0byB1bnNpZ25lZF9sb25nKSwgZml4IHJlZ3Jlc3Npb24gb24gNjQgYml0cwotICBjb21wdXRlcnMuIFBhdGNoIHByb3ZpZGVkIGJ5IFBhc2NhbCBPYnJ5LgotCi0tIEFkZCBTdGF0dXNfRXJyb3IgZXhjZXB0aW9uIGRlZmluaXRpb24uCi0KLS0gQWRkIHByYWdtYSBBc3NlcnRpb24gdGhhdCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudCBzaXplIGlzIDggYml0LgotCi0KLSAgICAgICAgSG93IHRvIGJ1aWxkIFpMaWIuQWRhIHVuZGVyIEdOQVQKLQotWW91IHNob3VsZCBoYXZlIHRoZSBaTGliIGxpYnJhcnkgYWxyZWFkeSBidWlsZCBvbiB5b3VyIGNvbXB1dGVyLCBiZWZvcmUKLWJ1aWxkaW5nIFpMaWIuQWRhLiBNYWtlIHRoZSBkaXJlY3Rvcnkgb2YgWkxpYi5BZGEgc291cmNlcyBjdXJyZW50IGFuZAotaXNzdWUgdGhlIGNvbW1hbmQ6Ci0KLSAgZ25hdG1ha2UgdGVzdCAtbGFyZ3MgLUw8ZGlyZWN0b3J5IHdoZXJlIGxpYnouYSBpcz4gLWx6Ci0KLU9yIHVzZSB0aGUgR05BVCBwcm9qZWN0IGZpbGUgYnVpbGQgZm9yIEdOQVQgMy4xNSBvciBsYXRlcjoKLQotICBnbmF0bWFrZSAtUHpsaWIuZ3ByIC1MPGRpcmVjdG9yeSB3aGVyZSBsaWJ6LmEgaXM+Ci0KLQotICAgICAgICBIb3cgdG8gYnVpbGQgWkxpYi5BZGEgdW5kZXIgQW9uaXggT2JqZWN0QWRhIGZvciBXaW4zMiA3LjIuMgotCi0xLiBNYWtlIGEgcHJvamVjdCB3aXRoIGFsbCAqLmFkcyBhbmQgKi5hZGIgZmlsZXMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLgotMi4gQnVpbGQgdGhlIGxpYnouYSBsaWJyYXJ5IGZyb20gdGhlIFpMaWIgQyBzb3VyY2VzLgotMy4gUmVuYW1lIGxpYnouYSB0byB6LmxpYi4KLTQuIEFkZCB0aGUgbGlicmFyeSB6LmxpYiB0byB0aGUgcHJvamVjdC4KLTUuIEFkZCB0aGUgbGliYy5saWIgbGlicmFyeSBmcm9tIHRoZSBPYmplY3RBZGEgZGlzdHJpYnV0aW9uIHRvIHRoZSBwcm9qZWN0LgotNi4gQnVpbGQgdGhlIGV4ZWN1dGFibGUgdXNpbmcgdGVzdC5hZGIgYXMgYSBtYWluIHByb2NlZHVyZS4KLQotCi0gICAgICAgIEhvdyB0byB1c2UgWkxpYi5BZGEKLQotVGhlIHNvdXJjZSBmaWxlcyB0ZXN0LmFkYiBhbmQgcmVhZC5hZGIgYXJlIHNtYWxsIGRlbW8gcHJvZ3JhbXMgdGhhdCBzaG93Ci10aGUgbWFpbiBmdW5jdGlvbmFsaXR5IG9mIFpMaWIuQWRhLgotCi1UaGUgcm91dGluZXMgZnJvbSB0aGUgcGFja2FnZSBzcGVjaWZpY2F0aW9ucyBhcmUgY29tbWVudGVkLgotCi0KLUhvbWVwYWdlOiBodHRwOi8vemxpYi1hZGEuc291cmNlZm9yZ2UubmV0LwotQXV0aG9yOiBEbWl0cml5IEFuaXNpbWtvdiA8YW5pc2lta292QHlhaG9vLmNvbT4KLQotQ29udHJpYnV0b3JzOiBQYXNjYWwgT2JyeSA8cGFzY2FsQG9icnkub3JnPiwgU3RldmUgU2FuZ3dpbmUgPHNqc0Blc3NleC5hYy51az4KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2FkYS90ZXN0LmFkYiBiL2xpYnMvemxpYi9jb250cmliL2FkYS90ZXN0LmFkYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3NzNhYy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9hZGEvdGVzdC5hZGIKKysrIC9kZXYvbnVsbApAQCAtMSw0NjMgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0gIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIERtaXRyaXkgQW5pc2lta292ICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIE9wZW4gc291cmNlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHpsaWIuYWRzIGZpbGUuICAtLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLSAgJElkOiB0ZXN0LmFkYix2IDEuMTcgMjAwMy8wOC8xMiAxMjoxMzozMCB2YWd1bCBFeHAgJAotCi0tLSAgVGhlIHByb2dyYW0gaGFzIGEgZmV3IGFpbXMuCi0tLSAgMS4gVGVzdCBaTGliLkFkYTk1IHRoaWNrIGJpbmRpbmcgZnVuY3Rpb25hbGl0eS4KLS0tICAyLiBTaG93IHRoZSBleGFtcGxlIG9mIHVzZSBtYWluIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIFpMaWIuQWRhOTUgYmluZGluZy4KLS0tICAzLiBCdWlsZCB0aGlzIHByb2dyYW0gYXV0b21hdGljYWxseSBjb21waWxlIGFsbCBaTGliLkFkYTk1IHBhY2thZ2VzIHVuZGVyCi0tLSAgICAgR05BVCBBZGE5NSBjb21waWxlci4KLQotd2l0aCBaTGliLlN0cmVhbXM7Ci13aXRoIEFkYS5TdHJlYW1zLlN0cmVhbV9JTzsKLXdpdGggQWRhLk51bWVyaWNzLkRpc2NyZXRlX1JhbmRvbTsKLQotd2l0aCBBZGEuVGV4dF9JTzsKLQotd2l0aCBBZGEuQ2FsZW5kYXI7Ci0KLXByb2NlZHVyZSBUZXN0IGlzCi0KLSAgIHVzZSBBZGEuU3RyZWFtczsKLSAgIHVzZSBTdHJlYW1fSU87Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gIFRlc3QgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgRmlsZV9TaXplICAgOiBDb3VudCAgIDo9IDEwMF8wMDA7Ci0gICBDb250aW51b3VzICA6IGNvbnN0YW50IEJvb2xlYW4gOj0gRmFsc2U7Ci0KLSAgIEhlYWRlciAgICAgIDogY29uc3RhbnQgWkxpYi5IZWFkZXJfVHlwZSA6PSBaTGliLkRlZmF1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIFpMaWIuTm9uZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgWkxpYi5BdXRvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBaTGliLkdaaXA7Ci0gICAtLSAgRG8gbm90IHVzZSBIZWFkZXIgb3RoZXIgdGhlbiBEZWZhdWx0IGluIFpMaWIgdmVyc2lvbnMgMS4xLjQKLSAgIC0tICBhbmQgb2xkZXIuCi0KLSAgIFN0cmF0ZWd5ICAgIDogY29uc3RhbnQgWkxpYi5TdHJhdGVneV9UeXBlIDo9IFpMaWIuRGVmYXVsdF9TdHJhdGVneTsKLSAgIEluaXRfUmFuZG9tIDogY29uc3RhbnQgOj0gMTA7Ci0KLSAgIC0tIEVuZCAtLQotCi0gICBJbl9GaWxlX05hbWUgIDogY29uc3RhbnQgU3RyaW5nIDo9ICJ0ZXN0emxpYi5pbiI7Ci0gICAtLSAgTmFtZSBvZiB0aGUgaW5wdXQgZmlsZQotCi0gICBaX0ZpbGVfTmFtZSAgIDogY29uc3RhbnQgU3RyaW5nIDo9ICJ0ZXN0emxpYi56bGIiOwotICAgLS0gIE5hbWUgb2YgdGhlIGNvbXByZXNzZWQgZmlsZS4KLQotICAgT3V0X0ZpbGVfTmFtZSA6IGNvbnN0YW50IFN0cmluZyA6PSAidGVzdHpsaWIub3V0IjsKLSAgIC0tICBOYW1lIG9mIHRoZSBkZWNvbXByZXNzZWQgZmlsZS4KLQotICAgRmlsZV9JbiAgIDogRmlsZV9UeXBlOwotICAgRmlsZV9PdXQgIDogRmlsZV9UeXBlOwotICAgRmlsZV9CYWNrIDogRmlsZV9UeXBlOwotICAgRmlsZV9aICAgIDogWkxpYi5TdHJlYW1zLlN0cmVhbV9UeXBlOwotCi0gICBGaWx0ZXIgOiBaTGliLkZpbHRlcl9UeXBlOwotCi0gICBUaW1lX1N0YW1wIDogQWRhLkNhbGVuZGFyLlRpbWU7Ci0KLSAgIHByb2NlZHVyZSBHZW5lcmF0ZV9GaWxlOwotICAgLS0gIEdlbmVyYXRlIGZpbGUgb2Ygc3BldHNpZmllZCBzaXplIHdpdGggc29tZSByYW5kb20gZGF0YS4KLSAgIC0tICBUaGUgcmFuZG9tIGRhdGEgaXMgcmVwZWF0YWJsZSwgZm9yIHRoZSBnb29kIGNvbXByZXNzaW9uLgotCi0gICBwcm9jZWR1cmUgQ29tcGFyZV9TdHJlYW1zCi0gICAgIChMZWZ0LCBSaWdodCA6IGluIG91dCBSb290X1N0cmVhbV9UeXBlJ0NsYXNzKTsKLSAgIC0tICBUaGUgcHJvY2VkdXJlIGNvbXBlYXJpbmcgZGF0YSBpbiAyIHN0cmVhbXMuCi0gICAtLSAgSXQgaXMgZm9yIGNvbXBhcmUgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uCi0KLSAgIHByb2NlZHVyZSBDb21wYXJlX0ZpbGVzIChMZWZ0LCBSaWdodCA6IFN0cmluZyk7Ci0gICAtLSAgQ29tcGFyZSBmaWxlcy4gQmFzZWQgb24gdGhlIENvbXBhcmVfU3RyZWFtcy4KLQotICAgcHJvY2VkdXJlIENvcHlfU3RyZWFtcwotICAgICAoU291cmNlLCBUYXJnZXQgOiBpbiBvdXQgUm9vdF9TdHJlYW1fVHlwZSdDbGFzczsKLSAgICAgIEJ1ZmZlcl9TaXplICAgIDogaW4gICAgIFN0cmVhbV9FbGVtZW50X09mZnNldCA6PSAxMDI0KTsKLSAgIC0tICBDb3B5aW5nIGRhdGEgZnJvbSBvbmUgc3RyZWFtIHRvIGFub3RoZXIuIEl0IGlzIGZvciB0ZXN0IHN0cmVhbQotICAgLS0gIGludGVyZmFjZSBvZiB0aGUgbGlicmFyeS4KLQotICAgcHJvY2VkdXJlIERhdGFfSW4KLSAgICAgKEl0ZW0gOiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBMYXN0IDogb3V0IFN0cmVhbV9FbGVtZW50X09mZnNldCk7Ci0gICAtLSAgdGhpcyBwcm9jZWR1cmUgaXMgZm9yIGdlbmVyaWMgaW5zdGFudGlhdGlvbiBvZgotICAgLS0gIFpMaWIuR2VuZXJpY19UcmFuc2xhdGUuCi0gICAtLSAgcmVhZGluZyBkYXRhIGZyb20gdGhlIEZpbGVfSW4uCi0KLSAgIHByb2NlZHVyZSBEYXRhX091dCAoSXRlbSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KTsKLSAgIC0tICB0aGlzIHByb2NlZHVyZSBpcyBmb3IgZ2VuZXJpYyBpbnN0YW50aWF0aW9uIG9mCi0gICAtLSAgWkxpYi5HZW5lcmljX1RyYW5zbGF0ZS4KLSAgIC0tICB3cml0aW5nIGRhdGEgdG8gdGhlIEZpbGVfT3V0LgotCi0gICBwcm9jZWR1cmUgU3RhbXA7Ci0gICAtLSAgU3RvcmUgdGhlIHRpbWVzdGFtcCB0byB0aGUgbG9jYWwgdmFyaWFibGUuCi0KLSAgIHByb2NlZHVyZSBQcmludF9TdGF0aXN0aWMgKE1zZyA6IFN0cmluZzsgRGF0YV9TaXplIDogWkxpYi5Db3VudCk7Ci0gICAtLSAgUHJpbnQgdGhlIHRpbWUgc3RhdGlzdGljIHdpdGggdGhlIG1lc3NhZ2UuCi0KLSAgIHByb2NlZHVyZSBUcmFuc2xhdGUgaXMgbmV3IFpMaWIuR2VuZXJpY19UcmFuc2xhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERhdGFfSW4gID0+IERhdGFfSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhX091dCA9PiBEYXRhX091dCk7Ci0gICAtLSAgVGhpcyBwcm9jZWR1cmUgaXMgbW92aW5nIGRhdGEgZnJvbSBGaWxlX0luIHRvIEZpbGVfT3V0Ci0gICAtLSAgd2l0aCBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uLCBkZXBlbmQgb24gaW5pdGlhbGl6YXRpb24gb2YKLSAgIC0tICBGaWx0ZXIgcGFyYW1ldGVyLgotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBDb21wYXJlX0ZpbGVzIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBDb21wYXJlX0ZpbGVzIChMZWZ0LCBSaWdodCA6IFN0cmluZykgaXMKLSAgICAgIExlZnRfRmlsZSwgUmlnaHRfRmlsZSA6IEZpbGVfVHlwZTsKLSAgIGJlZ2luCi0gICAgICBPcGVuIChMZWZ0X0ZpbGUsIEluX0ZpbGUsIExlZnQpOwotICAgICAgT3BlbiAoUmlnaHRfRmlsZSwgSW5fRmlsZSwgUmlnaHQpOwotICAgICAgQ29tcGFyZV9TdHJlYW1zIChTdHJlYW0gKExlZnRfRmlsZSkuYWxsLCBTdHJlYW0gKFJpZ2h0X0ZpbGUpLmFsbCk7Ci0gICAgICBDbG9zZSAoTGVmdF9GaWxlKTsKLSAgICAgIENsb3NlIChSaWdodF9GaWxlKTsKLSAgIGVuZCBDb21wYXJlX0ZpbGVzOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIENvbXBhcmVfU3RyZWFtcyAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBDb21wYXJlX1N0cmVhbXMKLSAgICAgKExlZnQsIFJpZ2h0IDogaW4gb3V0IEFkYS5TdHJlYW1zLlJvb3RfU3RyZWFtX1R5cGUnQ2xhc3MpCi0gICBpcwotICAgICAgTGVmdF9CdWZmZXIsIFJpZ2h0X0J1ZmZlciA6IFN0cmVhbV9FbGVtZW50X0FycmF5ICgwIC4uIDE2I0ZGRiMpOwotICAgICAgTGVmdF9MYXN0LCBSaWdodF9MYXN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgYmVnaW4KLSAgICAgIGxvb3AKLSAgICAgICAgIFJlYWQgKExlZnQsIExlZnRfQnVmZmVyLCBMZWZ0X0xhc3QpOwotICAgICAgICAgUmVhZCAoUmlnaHQsIFJpZ2h0X0J1ZmZlciwgUmlnaHRfTGFzdCk7Ci0KLSAgICAgICAgIGlmIExlZnRfTGFzdCAvPSBSaWdodF9MYXN0IHRoZW4KLSAgICAgICAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lICgiQ29tcGFyZSBlcnJvciA6IgotICAgICAgICAgICAgICAmIFN0cmVhbV9FbGVtZW50X09mZnNldCdJbWFnZSAoTGVmdF9MYXN0KQotICAgICAgICAgICAgICAmICIgLz0gIgotICAgICAgICAgICAgICAmIFN0cmVhbV9FbGVtZW50X09mZnNldCdJbWFnZSAoUmlnaHRfTGFzdCkpOwotCi0gICAgICAgICAgICByYWlzZSBDb25zdHJhaW50X0Vycm9yOwotCi0gICAgICAgICBlbHNpZiBMZWZ0X0J1ZmZlciAoMCAuLiBMZWZ0X0xhc3QpCi0gICAgICAgICAgICAgICAvPSBSaWdodF9CdWZmZXIgKDAgLi4gUmlnaHRfTGFzdCkKLSAgICAgICAgIHRoZW4KLSAgICAgICAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lICgiRVJST1I6IElOIGFuZCBPVVQgZmlsZXMgaXMgbm90IGVxdWFsLiIpOwotICAgICAgICAgICAgcmFpc2UgQ29uc3RyYWludF9FcnJvcjsKLQotICAgICAgICAgZW5kIGlmOwotCi0gICAgICAgICBleGl0IHdoZW4gTGVmdF9MYXN0IDwgTGVmdF9CdWZmZXInTGFzdDsKLSAgICAgIGVuZCBsb29wOwotICAgZW5kIENvbXBhcmVfU3RyZWFtczsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBDb3B5X1N0cmVhbXMgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgQ29weV9TdHJlYW1zCi0gICAgIChTb3VyY2UsIFRhcmdldCA6IGluIG91dCBBZGEuU3RyZWFtcy5Sb290X1N0cmVhbV9UeXBlJ0NsYXNzOwotICAgICAgQnVmZmVyX1NpemUgICAgOiBpbiAgICAgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IDEwMjQpCi0gICBpcwotICAgICAgQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gQnVmZmVyX1NpemUpOwotICAgICAgTGFzdCAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgYmVnaW4KLSAgICAgIGxvb3AKLSAgICAgICAgIFJlYWQgIChTb3VyY2UsIEJ1ZmZlciwgTGFzdCk7Ci0gICAgICAgICBXcml0ZSAoVGFyZ2V0LCBCdWZmZXIgKDEgLi4gTGFzdCkpOwotCi0gICAgICAgICBleGl0IHdoZW4gTGFzdCA8IEJ1ZmZlcidMYXN0OwotICAgICAgZW5kIGxvb3A7Ci0gICBlbmQgQ29weV9TdHJlYW1zOwotCi0gICAtLS0tLS0tLS0tLS0tCi0gICAtLSBEYXRhX0luIC0tCi0gICAtLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBEYXRhX0luCi0gICAgIChJdGVtIDogb3V0IFN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgTGFzdCA6IG91dCBTdHJlYW1fRWxlbWVudF9PZmZzZXQpIGlzCi0gICBiZWdpbgotICAgICAgUmVhZCAoRmlsZV9JbiwgSXRlbSwgTGFzdCk7Ci0gICBlbmQgRGF0YV9JbjsKLQotICAgLS0tLS0tLS0tLS0tLS0KLSAgIC0tIERhdGFfT3V0IC0tCi0gICAtLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgRGF0YV9PdXQgKEl0ZW0gOiBpbiBTdHJlYW1fRWxlbWVudF9BcnJheSkgaXMKLSAgIGJlZ2luCi0gICAgICBXcml0ZSAoRmlsZV9PdXQsIEl0ZW0pOwotICAgZW5kIERhdGFfT3V0OwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBHZW5lcmF0ZV9GaWxlIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBHZW5lcmF0ZV9GaWxlIGlzCi0gICAgICBzdWJ0eXBlIFZpc2libGVfU3ltYm9scyBpcyBTdHJlYW1fRWxlbWVudCByYW5nZSAxNiMyMCMgLi4gMTYjN0UjOwotCi0gICAgICBwYWNrYWdlIFJhbmRvbV9FbGVtZW50cyBpcwotICAgICAgICAgbmV3IEFkYS5OdW1lcmljcy5EaXNjcmV0ZV9SYW5kb20gKFZpc2libGVfU3ltYm9scyk7Ci0KLSAgICAgIEdlbiAgICA6IFJhbmRvbV9FbGVtZW50cy5HZW5lcmF0b3I7Ci0gICAgICBCdWZmZXIgOiBTdHJlYW1fRWxlbWVudF9BcnJheSA6PSAoMSAuLiA3NyA9PiAxNiMyMCMpICYgMTA7Ci0KLSAgICAgIEJ1ZmZlcl9Db3VudCA6IGNvbnN0YW50IENvdW50IDo9IEZpbGVfU2l6ZSAvIEJ1ZmZlcidMZW5ndGg7Ci0gICAgICAtLSAgTnVtYmVyIG9mIHNhbWUgYnVmZmVycyBpbiB0aGUgcGFja2V0LgotCi0gICAgICBEZW5zaXR5IDogY29uc3RhbnQgQ291bnQgOj0gMzA7IC0tICBmcm9tIDAgdG8gQnVmZmVyJ0xlbmd0aCAtIDI7Ci0KLSAgICAgIHByb2NlZHVyZSBGaWxsX0J1ZmZlciAoSiwgRCA6IGluIENvdW50KTsKLSAgICAgIC0tICBDaGFuZ2UgdGhlIHBhcnQgb2YgdGhlIGJ1ZmZlci4KLQotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC0tIEZpbGxfQnVmZmVyIC0tCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBwcm9jZWR1cmUgRmlsbF9CdWZmZXIgKEosIEQgOiBpbiBDb3VudCkgaXMKLSAgICAgIGJlZ2luCi0gICAgICAgICBmb3IgSyBpbiAwIC4uIEQgbG9vcAotICAgICAgICAgICAgQnVmZmVyCi0gICAgICAgICAgICAgIChTdHJlYW1fRWxlbWVudF9PZmZzZXQgKChKICsgSykgbW9kIChCdWZmZXInTGVuZ3RoIC0gMSkgKyAxKSkKLSAgICAgICAgICAgICA6PSBSYW5kb21fRWxlbWVudHMuUmFuZG9tIChHZW4pOwotCi0gICAgICAgICBlbmQgbG9vcDsKLSAgICAgIGVuZCBGaWxsX0J1ZmZlcjsKLQotICAgYmVnaW4KLSAgICAgIFJhbmRvbV9FbGVtZW50cy5SZXNldCAoR2VuLCBJbml0X1JhbmRvbSk7Ci0KLSAgICAgIENyZWF0ZSAoRmlsZV9JbiwgT3V0X0ZpbGUsIEluX0ZpbGVfTmFtZSk7Ci0KLSAgICAgIEZpbGxfQnVmZmVyICgxLCBCdWZmZXInTGVuZ3RoIC0gMik7Ci0KLSAgICAgIGZvciBKIGluIDEgLi4gQnVmZmVyX0NvdW50IGxvb3AKLSAgICAgICAgIFdyaXRlIChGaWxlX0luLCBCdWZmZXIpOwotCi0gICAgICAgICBGaWxsX0J1ZmZlciAoSiwgRGVuc2l0eSk7Ci0gICAgICBlbmQgbG9vcDsKLQotICAgICAgLS0gIGZpbGwgcmVtYWluIHNpemUuCi0KLSAgICAgIFdyaXRlCi0gICAgICAgIChGaWxlX0luLAotICAgICAgICAgQnVmZmVyCi0gICAgICAgICAgICgxIC4uIFN0cmVhbV9FbGVtZW50X09mZnNldAotICAgICAgICAgICAgICAgICAgIChGaWxlX1NpemUgLSBCdWZmZXInTGVuZ3RoICogQnVmZmVyX0NvdW50KSkpOwotCi0gICAgICBGbHVzaCAoRmlsZV9Jbik7Ci0gICAgICBDbG9zZSAoRmlsZV9Jbik7Ci0gICBlbmQgR2VuZXJhdGVfRmlsZTsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBQcmludF9TdGF0aXN0aWMgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgUHJpbnRfU3RhdGlzdGljIChNc2cgOiBTdHJpbmc7IERhdGFfU2l6ZSA6IFpMaWIuQ291bnQpIGlzCi0gICAgICB1c2UgQWRhLkNhbGVuZGFyOwotICAgICAgdXNlIEFkYS5UZXh0X0lPOwotCi0gICAgICBwYWNrYWdlIENvdW50X0lPIGlzIG5ldyBJbnRlZ2VyX0lPIChaTGliLkNvdW50KTsKLQotICAgICAgQ3Vycl9EdXIgOiBEdXJhdGlvbiA6PSBDbG9jayAtIFRpbWVfU3RhbXA7Ci0gICBiZWdpbgotICAgICAgUHV0IChNc2cpOwotCi0gICAgICBTZXRfQ29sICgyMCk7Ci0gICAgICBBZGEuVGV4dF9JTy5QdXQgKCJzaXplID0iKTsKLQotICAgICAgQ291bnRfSU8uUHV0Ci0gICAgICAgIChEYXRhX1NpemUsCi0gICAgICAgICBXaWR0aCA9PiBTdHJlYW1fSU8uQ291bnQnSW1hZ2UgKEZpbGVfU2l6ZSknTGVuZ3RoKTsKLQotICAgICAgUHV0X0xpbmUgKCIgZHVyYXRpb24gPSIgJiBEdXJhdGlvbidJbWFnZSAoQ3Vycl9EdXIpKTsKLSAgIGVuZCBQcmludF9TdGF0aXN0aWM7Ci0KLSAgIC0tLS0tLS0tLS0tCi0gICAtLSBTdGFtcCAtLQotICAgLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFN0YW1wIGlzCi0gICBiZWdpbgotICAgICAgVGltZV9TdGFtcCA6PSBBZGEuQ2FsZW5kYXIuQ2xvY2s7Ci0gICBlbmQgU3RhbXA7Ci0KLWJlZ2luCi0gICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoIlpMaWIgIiAmIFpMaWIuVmVyc2lvbik7Ci0KLSAgIGxvb3AKLSAgICAgIEdlbmVyYXRlX0ZpbGU7Ci0KLSAgICAgIGZvciBMZXZlbCBpbiBaTGliLkNvbXByZXNzaW9uX0xldmVsJ1JhbmdlIGxvb3AKLQotICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKCJMZXZlbCA9IgotICAgICAgICAgICAgJiBaTGliLkNvbXByZXNzaW9uX0xldmVsJ0ltYWdlIChMZXZlbCkpOwotCi0gICAgICAgICAtLSAgVGVzdCBnZW5lcmljIGludGVyZmFjZS4KLSAgICAgICAgIE9wZW4gICAoRmlsZV9JbiwgSW5fRmlsZSwgSW5fRmlsZV9OYW1lKTsKLSAgICAgICAgIENyZWF0ZSAoRmlsZV9PdXQsIE91dF9GaWxlLCBaX0ZpbGVfTmFtZSk7Ci0KLSAgICAgICAgIFN0YW1wOwotCi0gICAgICAgICAtLSAgRGVmbGF0ZSB1c2luZyBnZW5lcmljIGluc3RhbnRpYXRpb24uCi0KLSAgICAgICAgIFpMaWIuRGVmbGF0ZV9Jbml0Ci0gICAgICAgICAgICAgICAoRmlsdGVyICAgPT4gRmlsdGVyLAotICAgICAgICAgICAgICAgIExldmVsICAgID0+IExldmVsLAotICAgICAgICAgICAgICAgIFN0cmF0ZWd5ID0+IFN0cmF0ZWd5LAotICAgICAgICAgICAgICAgIEhlYWRlciAgID0+IEhlYWRlcik7Ci0KLSAgICAgICAgIFRyYW5zbGF0ZSAoRmlsdGVyKTsKLSAgICAgICAgIFByaW50X1N0YXRpc3RpYyAoIkdlbmVyaWMgY29tcHJlc3MiLCBaTGliLlRvdGFsX091dCAoRmlsdGVyKSk7Ci0gICAgICAgICBaTGliLkNsb3NlIChGaWx0ZXIpOwotCi0gICAgICAgICBDbG9zZSAoRmlsZV9Jbik7Ci0gICAgICAgICBDbG9zZSAoRmlsZV9PdXQpOwotCi0gICAgICAgICBPcGVuICAgKEZpbGVfSW4sIEluX0ZpbGUsIFpfRmlsZV9OYW1lKTsKLSAgICAgICAgIENyZWF0ZSAoRmlsZV9PdXQsIE91dF9GaWxlLCBPdXRfRmlsZV9OYW1lKTsKLQotICAgICAgICAgU3RhbXA7Ci0KLSAgICAgICAgIC0tICBJbmZsYXRlIHVzaW5nIGdlbmVyaWMgaW5zdGFudGlhdGlvbi4KLQotICAgICAgICAgWkxpYi5JbmZsYXRlX0luaXQgKEZpbHRlciwgSGVhZGVyID0+IEhlYWRlcik7Ci0KLSAgICAgICAgIFRyYW5zbGF0ZSAoRmlsdGVyKTsKLSAgICAgICAgIFByaW50X1N0YXRpc3RpYyAoIkdlbmVyaWMgZGVjb21wcmVzcyIsIFpMaWIuVG90YWxfT3V0IChGaWx0ZXIpKTsKLQotICAgICAgICAgWkxpYi5DbG9zZSAoRmlsdGVyKTsKLQotICAgICAgICAgQ2xvc2UgKEZpbGVfSW4pOwotICAgICAgICAgQ2xvc2UgKEZpbGVfT3V0KTsKLQotICAgICAgICAgQ29tcGFyZV9GaWxlcyAoSW5fRmlsZV9OYW1lLCBPdXRfRmlsZV9OYW1lKTsKLQotICAgICAgICAgLS0gIFRlc3Qgc3RyZWFtIGludGVyZmFjZS4KLQotICAgICAgICAgLS0gIENvbXByZXNzIHRvIHRoZSBiYWNrIHN0cmVhbS4KLQotICAgICAgICAgT3BlbiAgIChGaWxlX0luLCBJbl9GaWxlLCBJbl9GaWxlX05hbWUpOwotICAgICAgICAgQ3JlYXRlIChGaWxlX0JhY2ssIE91dF9GaWxlLCBaX0ZpbGVfTmFtZSk7Ci0KLSAgICAgICAgIFN0YW1wOwotCi0gICAgICAgICBaTGliLlN0cmVhbXMuQ3JlYXRlCi0gICAgICAgICAgIChTdHJlYW0gICAgICAgICAgPT4gRmlsZV9aLAotICAgICAgICAgICAgTW9kZSAgICAgICAgICAgID0+IFpMaWIuU3RyZWFtcy5PdXRfU3RyZWFtLAotICAgICAgICAgICAgQmFjayAgICAgICAgICAgID0+IFpMaWIuU3RyZWFtcy5TdHJlYW1fQWNjZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyZWFtIChGaWxlX0JhY2spKSwKLSAgICAgICAgICAgIEJhY2tfQ29tcHJlc3NlZCA9PiBUcnVlLAotICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgID0+IExldmVsLAotICAgICAgICAgICAgU3RyYXRlZ3kgICAgICAgID0+IFN0cmF0ZWd5LAotICAgICAgICAgICAgSGVhZGVyICAgICAgICAgID0+IEhlYWRlcik7Ci0KLSAgICAgICAgIENvcHlfU3RyZWFtcwotICAgICAgICAgICAoU291cmNlID0+IFN0cmVhbSAoRmlsZV9JbikuYWxsLAotICAgICAgICAgICAgVGFyZ2V0ID0+IEZpbGVfWik7Ci0KLSAgICAgICAgIC0tICBGbHVzaGluZyBpbnRlcm5hbCBidWZmZXJzIHRvIHRoZSBiYWNrIHN0cmVhbS4KLQotICAgICAgICAgWkxpYi5TdHJlYW1zLkZsdXNoIChGaWxlX1osIFpMaWIuRmluaXNoKTsKLQotICAgICAgICAgUHJpbnRfU3RhdGlzdGljICgiV3JpdGUgY29tcHJlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBaTGliLlN0cmVhbXMuV3JpdGVfVG90YWxfT3V0IChGaWxlX1opKTsKLQotICAgICAgICAgWkxpYi5TdHJlYW1zLkNsb3NlIChGaWxlX1opOwotCi0gICAgICAgICBDbG9zZSAoRmlsZV9Jbik7Ci0gICAgICAgICBDbG9zZSAoRmlsZV9CYWNrKTsKLQotICAgICAgICAgLS0gIENvbXBhcmUgcmVhZGluZyBmcm9tIG9yaWdpbmFsIGZpbGUgYW5kIGZyb20KLSAgICAgICAgIC0tICBkZWNvbXByZXNzaW9uIHN0cmVhbS4KLQotICAgICAgICAgT3BlbiAoRmlsZV9JbiwgICBJbl9GaWxlLCBJbl9GaWxlX05hbWUpOwotICAgICAgICAgT3BlbiAoRmlsZV9CYWNrLCBJbl9GaWxlLCBaX0ZpbGVfTmFtZSk7Ci0KLSAgICAgICAgIFpMaWIuU3RyZWFtcy5DcmVhdGUKLSAgICAgICAgICAgKFN0cmVhbSAgICAgICAgICA9PiBGaWxlX1osCi0gICAgICAgICAgICBNb2RlICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLkluX1N0cmVhbSwKLSAgICAgICAgICAgIEJhY2sgICAgICAgICAgICA9PiBaTGliLlN0cmVhbXMuU3RyZWFtX0FjY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmVhbSAoRmlsZV9CYWNrKSksCi0gICAgICAgICAgICBCYWNrX0NvbXByZXNzZWQgPT4gVHJ1ZSwKLSAgICAgICAgICAgIEhlYWRlciAgICAgICAgICA9PiBIZWFkZXIpOwotCi0gICAgICAgICBTdGFtcDsKLSAgICAgICAgIENvbXBhcmVfU3RyZWFtcyAoU3RyZWFtIChGaWxlX0luKS5hbGwsIEZpbGVfWik7Ci0KLSAgICAgICAgIFByaW50X1N0YXRpc3RpYyAoIlJlYWQgZGVjb21wcmVzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFpMaWIuU3RyZWFtcy5SZWFkX1RvdGFsX091dCAoRmlsZV9aKSk7Ci0KLSAgICAgICAgIFpMaWIuU3RyZWFtcy5DbG9zZSAoRmlsZV9aKTsKLSAgICAgICAgIENsb3NlIChGaWxlX0luKTsKLSAgICAgICAgIENsb3NlIChGaWxlX0JhY2spOwotCi0gICAgICAgICAtLSAgQ29tcHJlc3MgYnkgcmVhZGluZyBmcm9tIGNvbXByZXNzaW9uIHN0cmVhbS4KLQotICAgICAgICAgT3BlbiAoRmlsZV9CYWNrLCBJbl9GaWxlLCBJbl9GaWxlX05hbWUpOwotICAgICAgICAgQ3JlYXRlIChGaWxlX091dCwgT3V0X0ZpbGUsIFpfRmlsZV9OYW1lKTsKLQotICAgICAgICAgWkxpYi5TdHJlYW1zLkNyZWF0ZQotICAgICAgICAgICAoU3RyZWFtICAgICAgICAgID0+IEZpbGVfWiwKLSAgICAgICAgICAgIE1vZGUgICAgICAgICAgICA9PiBaTGliLlN0cmVhbXMuSW5fU3RyZWFtLAotICAgICAgICAgICAgQmFjayAgICAgICAgICAgID0+IFpMaWIuU3RyZWFtcy5TdHJlYW1fQWNjZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyZWFtIChGaWxlX0JhY2spKSwKLSAgICAgICAgICAgIEJhY2tfQ29tcHJlc3NlZCA9PiBGYWxzZSwKLSAgICAgICAgICAgIExldmVsICAgICAgICAgICA9PiBMZXZlbCwKLSAgICAgICAgICAgIFN0cmF0ZWd5ICAgICAgICA9PiBTdHJhdGVneSwKLSAgICAgICAgICAgIEhlYWRlciAgICAgICAgICA9PiBIZWFkZXIpOwotCi0gICAgICAgICBTdGFtcDsKLSAgICAgICAgIENvcHlfU3RyZWFtcwotICAgICAgICAgICAoU291cmNlID0+IEZpbGVfWiwKLSAgICAgICAgICAgIFRhcmdldCA9PiBTdHJlYW0gKEZpbGVfT3V0KS5hbGwpOwotCi0gICAgICAgICBQcmludF9TdGF0aXN0aWMgKCJSZWFkIGNvbXByZXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWkxpYi5TdHJlYW1zLlJlYWRfVG90YWxfT3V0IChGaWxlX1opKTsKLQotICAgICAgICAgWkxpYi5TdHJlYW1zLkNsb3NlIChGaWxlX1opOwotCi0gICAgICAgICBDbG9zZSAoRmlsZV9PdXQpOwotICAgICAgICAgQ2xvc2UgKEZpbGVfQmFjayk7Ci0KLSAgICAgICAgIC0tICBEZWNvbXByZXNzIHRvIGRlY29tcHJlc3Npb24gc3RyZWFtLgotCi0gICAgICAgICBPcGVuICAgKEZpbGVfSW4sICAgSW5fRmlsZSwgWl9GaWxlX05hbWUpOwotICAgICAgICAgQ3JlYXRlIChGaWxlX0JhY2ssIE91dF9GaWxlLCBPdXRfRmlsZV9OYW1lKTsKLQotICAgICAgICAgWkxpYi5TdHJlYW1zLkNyZWF0ZQotICAgICAgICAgICAoU3RyZWFtICAgICAgICAgID0+IEZpbGVfWiwKLSAgICAgICAgICAgIE1vZGUgICAgICAgICAgICA9PiBaTGliLlN0cmVhbXMuT3V0X1N0cmVhbSwKLSAgICAgICAgICAgIEJhY2sgICAgICAgICAgICA9PiBaTGliLlN0cmVhbXMuU3RyZWFtX0FjY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmVhbSAoRmlsZV9CYWNrKSksCi0gICAgICAgICAgICBCYWNrX0NvbXByZXNzZWQgPT4gRmFsc2UsCi0gICAgICAgICAgICBIZWFkZXIgICAgICAgICAgPT4gSGVhZGVyKTsKLQotICAgICAgICAgU3RhbXA7Ci0KLSAgICAgICAgIENvcHlfU3RyZWFtcwotICAgICAgICAgICAoU291cmNlID0+IFN0cmVhbSAoRmlsZV9JbikuYWxsLAotICAgICAgICAgICAgVGFyZ2V0ID0+IEZpbGVfWik7Ci0KLSAgICAgICAgIFByaW50X1N0YXRpc3RpYyAoIldyaXRlIGRlY29tcHJlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBaTGliLlN0cmVhbXMuV3JpdGVfVG90YWxfT3V0IChGaWxlX1opKTsKLQotICAgICAgICAgWkxpYi5TdHJlYW1zLkNsb3NlIChGaWxlX1opOwotICAgICAgICAgQ2xvc2UgKEZpbGVfSW4pOwotICAgICAgICAgQ2xvc2UgKEZpbGVfQmFjayk7Ci0KLSAgICAgICAgIENvbXBhcmVfRmlsZXMgKEluX0ZpbGVfTmFtZSwgT3V0X0ZpbGVfTmFtZSk7Ci0gICAgICBlbmQgbG9vcDsKLQotICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKENvdW50J0ltYWdlIChGaWxlX1NpemUpICYgIiBPay4iKTsKLQotICAgICAgZXhpdCB3aGVuIG5vdCBDb250aW51b3VzOwotCi0gICAgICBGaWxlX1NpemUgOj0gRmlsZV9TaXplICsgMTsKLSAgIGVuZCBsb29wOwotZW5kIFRlc3Q7CmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9hZGEvemxpYi1zdHJlYW1zLmFkYiBiL2xpYnMvemxpYi9jb250cmliL2FkYS96bGliLXN0cmVhbXMuYWRiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ5N2JhLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2FkYS96bGliLXN0cmVhbXMuYWRiCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0gICRJZDogemxpYi1zdHJlYW1zLmFkYix2IDEuMTAgMjAwNC8wNS8zMSAxMDo1Mzo0MCB2YWd1bCBFeHAgJAotCi13aXRoIEFkYS5VbmNoZWNrZWRfRGVhbGxvY2F0aW9uOwotCi1wYWNrYWdlIGJvZHkgWkxpYi5TdHJlYW1zIGlzCi0KLSAgIC0tLS0tLS0tLS0tCi0gICAtLSBDbG9zZSAtLQotICAgLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIENsb3NlIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGUpIGlzCi0gICAgICBwcm9jZWR1cmUgRnJlZSBpcyBuZXcgQWRhLlVuY2hlY2tlZF9EZWFsbG9jYXRpb24KLSAgICAgICAgIChTdHJlYW1fRWxlbWVudF9BcnJheSwgQnVmZmVyX0FjY2Vzcyk7Ci0gICBiZWdpbgotICAgICAgaWYgU3RyZWFtLk1vZGUgPSBPdXRfU3RyZWFtIG9yIFN0cmVhbS5Nb2RlID0gRHVwbGV4IHRoZW4KLSAgICAgICAgIC0tICBXZSBzaG91bGQgZmx1c2ggdGhlIGRhdGEgd3JpdHRlbiBieSB0aGUgd3JpdGVyLgotCi0gICAgICAgICBGbHVzaCAoU3RyZWFtLCBGaW5pc2gpOwotCi0gICAgICAgICBDbG9zZSAoU3RyZWFtLldyaXRlcik7Ci0gICAgICBlbmQgaWY7Ci0KLSAgICAgIGlmIFN0cmVhbS5Nb2RlID0gSW5fU3RyZWFtIG9yIFN0cmVhbS5Nb2RlID0gRHVwbGV4IHRoZW4KLSAgICAgICAgIENsb3NlIChTdHJlYW0uUmVhZGVyKTsKLSAgICAgICAgIEZyZWUgKFN0cmVhbS5CdWZmZXIpOwotICAgICAgZW5kIGlmOwotICAgZW5kIENsb3NlOwotCi0gICAtLS0tLS0tLS0tLS0KLSAgIC0tIENyZWF0ZSAtLQotICAgLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBDcmVhdGUKLSAgICAgKFN0cmVhbSAgICAgICAgICAgIDogICAgb3V0IFN0cmVhbV9UeXBlOwotICAgICAgTW9kZSAgICAgICAgICAgICAgOiBpbiAgICAgU3RyZWFtX01vZGU7Ci0gICAgICBCYWNrICAgICAgICAgICAgICA6IGluICAgICBTdHJlYW1fQWNjZXNzOwotICAgICAgQmFja19Db21wcmVzc2VkICAgOiBpbiAgICAgQm9vbGVhbjsKLSAgICAgIExldmVsICAgICAgICAgICAgIDogaW4gICAgIENvbXByZXNzaW9uX0xldmVsIDo9IERlZmF1bHRfQ29tcHJlc3Npb247Ci0gICAgICBTdHJhdGVneSAgICAgICAgICA6IGluICAgICBTdHJhdGVneV9UeXBlICAgICA6PSBEZWZhdWx0X1N0cmF0ZWd5OwotICAgICAgSGVhZGVyICAgICAgICAgICAgOiBpbiAgICAgSGVhZGVyX1R5cGUgICAgICAgOj0gRGVmYXVsdDsKLSAgICAgIFJlYWRfQnVmZmVyX1NpemUgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZTsKLSAgICAgIFdyaXRlX0J1ZmZlcl9TaXplIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZSkKLSAgIGlzCi0KLSAgICAgIHN1YnR5cGUgQnVmZmVyX1N1YnR5cGUgaXMgU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gUmVhZF9CdWZmZXJfU2l6ZSk7Ci0KLSAgICAgIHByb2NlZHVyZSBJbml0X0ZpbHRlcgotICAgICAgICAgKEZpbHRlciAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgICAgIENvbXByZXNzIDogaW4gICAgIEJvb2xlYW4pOwotCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLS0gSW5pdF9GaWx0ZXIgLS0KLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIHByb2NlZHVyZSBJbml0X0ZpbHRlcgotICAgICAgICAgKEZpbHRlciAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgICAgIENvbXByZXNzIDogaW4gICAgIEJvb2xlYW4pIGlzCi0gICAgICBiZWdpbgotICAgICAgICAgaWYgQ29tcHJlc3MgdGhlbgotICAgICAgICAgICAgRGVmbGF0ZV9Jbml0Ci0gICAgICAgICAgICAgIChGaWx0ZXIsIExldmVsLCBTdHJhdGVneSwgSGVhZGVyID0+IEhlYWRlcik7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBJbmZsYXRlX0luaXQgKEZpbHRlciwgSGVhZGVyID0+IEhlYWRlcik7Ci0gICAgICAgICBlbmQgaWY7Ci0gICAgICBlbmQgSW5pdF9GaWx0ZXI7Ci0KLSAgIGJlZ2luCi0gICAgICBTdHJlYW0uQmFjayA6PSBCYWNrOwotICAgICAgU3RyZWFtLk1vZGUgOj0gTW9kZTsKLQotICAgICAgaWYgTW9kZSA9IE91dF9TdHJlYW0gb3IgTW9kZSA9IER1cGxleCB0aGVuCi0gICAgICAgICBJbml0X0ZpbHRlciAoU3RyZWFtLldyaXRlciwgQmFja19Db21wcmVzc2VkKTsKLSAgICAgICAgIFN0cmVhbS5CdWZmZXJfU2l6ZSA6PSBXcml0ZV9CdWZmZXJfU2l6ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgIFN0cmVhbS5CdWZmZXJfU2l6ZSA6PSAwOwotICAgICAgZW5kIGlmOwotCi0gICAgICBpZiBNb2RlID0gSW5fU3RyZWFtIG9yIE1vZGUgPSBEdXBsZXggdGhlbgotICAgICAgICAgSW5pdF9GaWx0ZXIgKFN0cmVhbS5SZWFkZXIsIG5vdCBCYWNrX0NvbXByZXNzZWQpOwotCi0gICAgICAgICBTdHJlYW0uQnVmZmVyICAgICA6PSBuZXcgQnVmZmVyX1N1YnR5cGU7Ci0gICAgICAgICBTdHJlYW0uUmVzdF9GaXJzdCA6PSBTdHJlYW0uQnVmZmVyJ0xhc3QgKyAxOwotICAgICAgICAgU3RyZWFtLlJlc3RfTGFzdCAgOj0gU3RyZWFtLkJ1ZmZlcidMYXN0OwotICAgICAgZW5kIGlmOwotICAgZW5kIENyZWF0ZTsKLQotICAgLS0tLS0tLS0tLS0KLSAgIC0tIEZsdXNoIC0tCi0gICAtLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgRmx1c2gKLSAgICAgKFN0cmVhbSA6IGluIG91dCBTdHJlYW1fVHlwZTsKLSAgICAgIE1vZGUgICA6IGluICAgICBGbHVzaF9Nb2RlIDo9IFN5bmNfRmx1c2gpCi0gICBpcwotICAgICAgQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gU3RyZWFtLkJ1ZmZlcl9TaXplKTsKLSAgICAgIExhc3QgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgIGJlZ2luCi0gICAgICBsb29wCi0gICAgICAgICBGbHVzaCAoU3RyZWFtLldyaXRlciwgQnVmZmVyLCBMYXN0LCBNb2RlKTsKLQotICAgICAgICAgQWRhLlN0cmVhbXMuV3JpdGUgKFN0cmVhbS5CYWNrLmFsbCwgQnVmZmVyICgxIC4uIExhc3QpKTsKLQotICAgICAgICAgZXhpdCB3aGVuIExhc3QgPCBCdWZmZXInTGFzdDsKLSAgICAgIGVuZCBsb29wOwotICAgZW5kIEZsdXNoOwotCi0gICAtLS0tLS0tLS0tLS0tCi0gICAtLSBJc19PcGVuIC0tCi0gICAtLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIElzX09wZW4gKFN0cmVhbSA6IFN0cmVhbV9UeXBlKSByZXR1cm4gQm9vbGVhbiBpcwotICAgYmVnaW4KLSAgICAgIHJldHVybiBJc19PcGVuIChTdHJlYW0uUmVhZGVyKSBvciBlbHNlIElzX09wZW4gKFN0cmVhbS5Xcml0ZXIpOwotICAgZW5kIElzX09wZW47Ci0KLSAgIC0tLS0tLS0tLS0KLSAgIC0tIFJlYWQgLS0KLSAgIC0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFJlYWQKLSAgICAgKFN0cmVhbSA6IGluIG91dCBTdHJlYW1fVHlwZTsKLSAgICAgIEl0ZW0gICA6ICAgIG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIExhc3QgICA6ICAgIG91dCBTdHJlYW1fRWxlbWVudF9PZmZzZXQpCi0gICBpcwotCi0gICAgICBwcm9jZWR1cmUgUmVhZAotICAgICAgICAoSXRlbSA6IG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgICAgIExhc3QgOiBvdXQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KTsKLQotICAgICAgLS0tLS0tLS0tLQotICAgICAgLS0gUmVhZCAtLQotICAgICAgLS0tLS0tLS0tLQotCi0gICAgICBwcm9jZWR1cmUgUmVhZAotICAgICAgICAoSXRlbSA6IG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgICAgIExhc3QgOiBvdXQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KSBpcwotICAgICAgYmVnaW4KLSAgICAgICAgIEFkYS5TdHJlYW1zLlJlYWQgKFN0cmVhbS5CYWNrLmFsbCwgSXRlbSwgTGFzdCk7Ci0gICAgICBlbmQgUmVhZDsKLQotICAgICAgcHJvY2VkdXJlIFJlYWQgaXMgbmV3IFpMaWIuUmVhZAotICAgICAgICAgKFJlYWQgICAgICAgPT4gUmVhZCwKLSAgICAgICAgICBCdWZmZXIgICAgID0+IFN0cmVhbS5CdWZmZXIuYWxsLAotICAgICAgICAgIFJlc3RfRmlyc3QgPT4gU3RyZWFtLlJlc3RfRmlyc3QsCi0gICAgICAgICAgUmVzdF9MYXN0ICA9PiBTdHJlYW0uUmVzdF9MYXN0KTsKLQotICAgYmVnaW4KLSAgICAgIFJlYWQgKFN0cmVhbS5SZWFkZXIsIEl0ZW0sIExhc3QpOwotICAgZW5kIFJlYWQ7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIFJlYWRfVG90YWxfSW4gLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gUmVhZF9Ub3RhbF9JbiAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudCBpcwotICAgYmVnaW4KLSAgICAgIHJldHVybiBUb3RhbF9JbiAoU3RyZWFtLlJlYWRlcik7Ci0gICBlbmQgUmVhZF9Ub3RhbF9JbjsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIFJlYWRfVG90YWxfT3V0IC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBmdW5jdGlvbiBSZWFkX1RvdGFsX091dCAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudCBpcwotICAgYmVnaW4KLSAgICAgIHJldHVybiBUb3RhbF9PdXQgKFN0cmVhbS5SZWFkZXIpOwotICAgZW5kIFJlYWRfVG90YWxfT3V0OwotCi0gICAtLS0tLS0tLS0tLQotICAgLS0gV3JpdGUgLS0KLSAgIC0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBXcml0ZQotICAgICAoU3RyZWFtIDogaW4gb3V0IFN0cmVhbV9UeXBlOwotICAgICAgSXRlbSAgIDogaW4gICAgIFN0cmVhbV9FbGVtZW50X0FycmF5KQotICAgaXMKLQotICAgICAgcHJvY2VkdXJlIFdyaXRlIChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpOwotCi0gICAgICAtLS0tLS0tLS0tLQotICAgICAgLS0gV3JpdGUgLS0KLSAgICAgIC0tLS0tLS0tLS0tCi0KLSAgICAgIHByb2NlZHVyZSBXcml0ZSAoSXRlbSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KSBpcwotICAgICAgYmVnaW4KLSAgICAgICAgIEFkYS5TdHJlYW1zLldyaXRlIChTdHJlYW0uQmFjay5hbGwsIEl0ZW0pOwotICAgICAgZW5kIFdyaXRlOwotCi0gICAgICBwcm9jZWR1cmUgV3JpdGUgaXMgbmV3IFpMaWIuV3JpdGUKLSAgICAgICAgIChXcml0ZSAgICAgICA9PiBXcml0ZSwKLSAgICAgICAgICBCdWZmZXJfU2l6ZSA9PiBTdHJlYW0uQnVmZmVyX1NpemUpOwotCi0gICBiZWdpbgotICAgICAgV3JpdGUgKFN0cmVhbS5Xcml0ZXIsIEl0ZW0sIE5vX0ZsdXNoKTsKLSAgIGVuZCBXcml0ZTsKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIFdyaXRlX1RvdGFsX0luIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBmdW5jdGlvbiBXcml0ZV9Ub3RhbF9JbiAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudCBpcwotICAgYmVnaW4KLSAgICAgIHJldHVybiBUb3RhbF9JbiAoU3RyZWFtLldyaXRlcik7Ci0gICBlbmQgV3JpdGVfVG90YWxfSW47Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gV3JpdGVfVG90YWxfT3V0IC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gV3JpdGVfVG90YWxfT3V0IChTdHJlYW0gOiBpbiBTdHJlYW1fVHlwZSkgcmV0dXJuIENvdW50IGlzCi0gICBiZWdpbgotICAgICAgcmV0dXJuIFRvdGFsX091dCAoU3RyZWFtLldyaXRlcik7Ci0gICBlbmQgV3JpdGVfVG90YWxfT3V0OwotCi1lbmQgWkxpYi5TdHJlYW1zOwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvYWRhL3psaWItc3RyZWFtcy5hZHMgYi9saWJzL3psaWIvY29udHJpYi9hZGEvemxpYi1zdHJlYW1zLmFkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAxOTNjNi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9hZGEvemxpYi1zdHJlYW1zLmFkcworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tICAkSWQ6IHpsaWItc3RyZWFtcy5hZHMsdiAxLjEyIDIwMDQvMDUvMzEgMTA6NTM6NDAgdmFndWwgRXhwICQKLQotcGFja2FnZSBaTGliLlN0cmVhbXMgaXMKLQotICAgdHlwZSBTdHJlYW1fTW9kZSBpcyAoSW5fU3RyZWFtLCBPdXRfU3RyZWFtLCBEdXBsZXgpOwotCi0gICB0eXBlIFN0cmVhbV9BY2Nlc3MgaXMgYWNjZXNzIGFsbCBBZGEuU3RyZWFtcy5Sb290X1N0cmVhbV9UeXBlJ0NsYXNzOwotCi0gICB0eXBlIFN0cmVhbV9UeXBlIGlzCi0gICAgICBuZXcgQWRhLlN0cmVhbXMuUm9vdF9TdHJlYW1fVHlwZSB3aXRoIHByaXZhdGU7Ci0KLSAgIHByb2NlZHVyZSBSZWFkCi0gICAgIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGU7Ci0gICAgICBJdGVtICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBMYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KTsKLQotICAgcHJvY2VkdXJlIFdyaXRlCi0gICAgIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGU7Ci0gICAgICBJdGVtICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpOwotCi0gICBwcm9jZWR1cmUgRmx1c2gKLSAgICAgKFN0cmVhbSA6IGluIG91dCBTdHJlYW1fVHlwZTsKLSAgICAgIE1vZGUgICA6IGluICAgICBGbHVzaF9Nb2RlIDo9IFN5bmNfRmx1c2gpOwotICAgLS0gIEZsdXNoIHRoZSB3cml0dGVuIGRhdGEgdG8gdGhlIGJhY2sgc3RyZWFtLAotICAgLS0gIGFsbCBkYXRhIHBsYWNlZCB0byB0aGUgY29tcHJlc3NvciBpcyBmbHVzaGluZyB0byB0aGUgQmFjayBzdHJlYW0uCi0gICAtLSAgU2hvdWxkIG5vdCBiZSB1c2VkIHVudGlsbCBuZWNlc3NhcnksIGJlY291c2UgaXQgaXMgZGVjcmVhc2luZwotICAgLS0gIGNvbXByZXNzaW9uLgotCi0gICBmdW5jdGlvbiBSZWFkX1RvdGFsX0luIChTdHJlYW0gOiBpbiBTdHJlYW1fVHlwZSkgcmV0dXJuIENvdW50OwotICAgcHJhZ21hIElubGluZSAoUmVhZF9Ub3RhbF9Jbik7Ci0gICAtLSAgUmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gYmFjayBzdHJlYW0gc28gZmFyLgotCi0gICBmdW5jdGlvbiBSZWFkX1RvdGFsX091dCAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudDsKLSAgIHByYWdtYSBJbmxpbmUgKFJlYWRfVG90YWxfT3V0KTsKLSAgIC0tICBSZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgc28gZmFyLgotCi0gICBmdW5jdGlvbiBXcml0ZV9Ub3RhbF9JbiAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudDsKLSAgIHByYWdtYSBJbmxpbmUgKFdyaXRlX1RvdGFsX0luKTsKLSAgIC0tICBSZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc28gZmFyLgotCi0gICBmdW5jdGlvbiBXcml0ZV9Ub3RhbF9PdXQgKFN0cmVhbSA6IGluIFN0cmVhbV9UeXBlKSByZXR1cm4gQ291bnQ7Ci0gICBwcmFnbWEgSW5saW5lIChXcml0ZV9Ub3RhbF9PdXQpOwotICAgLS0gIFJldHVybiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgYmFjayBzdHJlYW0uCi0KLSAgIHByb2NlZHVyZSBDcmVhdGUKLSAgICAgKFN0cmVhbSAgICAgICAgICAgIDogICAgb3V0IFN0cmVhbV9UeXBlOwotICAgICAgTW9kZSAgICAgICAgICAgICAgOiBpbiAgICAgU3RyZWFtX01vZGU7Ci0gICAgICBCYWNrICAgICAgICAgICAgICA6IGluICAgICBTdHJlYW1fQWNjZXNzOwotICAgICAgQmFja19Db21wcmVzc2VkICAgOiBpbiAgICAgQm9vbGVhbjsKLSAgICAgIExldmVsICAgICAgICAgICAgIDogaW4gICAgIENvbXByZXNzaW9uX0xldmVsIDo9IERlZmF1bHRfQ29tcHJlc3Npb247Ci0gICAgICBTdHJhdGVneSAgICAgICAgICA6IGluICAgICBTdHJhdGVneV9UeXBlICAgICA6PSBEZWZhdWx0X1N0cmF0ZWd5OwotICAgICAgSGVhZGVyICAgICAgICAgICAgOiBpbiAgICAgSGVhZGVyX1R5cGUgICAgICAgOj0gRGVmYXVsdDsKLSAgICAgIFJlYWRfQnVmZmVyX1NpemUgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZTsKLSAgICAgIFdyaXRlX0J1ZmZlcl9TaXplIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZSk7Ci0gICAtLSAgQ3JlYXRlIHRoZSBDb21yZXNzaW9uL0RlY29tcHJlc3Npb24gc3RyZWFtLgotICAgLS0gIElmIG1vZGUgaXMgSW5fU3RyZWFtIHRoZW4gV3JpdGUgb3BlcmF0aW9uIGlzIGRpc2FibGVkLgotICAgLS0gIElmIG1vZGUgaXMgT3V0X1N0cmVhbSB0aGVuIFJlYWQgb3BlcmF0aW9uIGlzIGRpc2FibGVkLgotCi0gICAtLSAgSWYgQmFja19Db21wcmVzc2VkIGlzIHRydWUgdGhlbgotICAgLS0gIERhdGEgd3JpdHRlbiB0byB0aGUgU3RyZWFtIGlzIGNvbXByZXNzaW5nIHRvIHRoZSBCYWNrIHN0cmVhbQotICAgLS0gIGFuZCBkYXRhIHJlYWQgZnJvbSB0aGUgU3RyZWFtIGlzIGRlY29tcHJlc3NlZCBkYXRhIGZyb20gdGhlIEJhY2sgc3RyZWFtLgotCi0gICAtLSAgSWYgQmFja19Db21wcmVzc2VkIGlzIGZhbHNlIHRoZW4KLSAgIC0tICBEYXRhIHdyaXR0ZW4gdG8gdGhlIFN0cmVhbSBpcyBkZWNvbXByZXNzaW5nIHRvIHRoZSBCYWNrIHN0cmVhbQotICAgLS0gIGFuZCBkYXRhIHJlYWQgZnJvbSB0aGUgU3RyZWFtIGlzIGNvbXByZXNzZWQgZGF0YSBmcm9tIHRoZSBCYWNrIHN0cmVhbS4KLQotICAgLS0gICEhISBXaGVuIHRoZSBOZWVkX0hlYWRlciBpcyBGYWxzZSBaTGliLUFkYSBpcyB1c2luZyB1bmRvY3VtZW50ZWQKLSAgIC0tICBaTGliIDEuMS40IGZ1bmN0aW9uYWxpdHkgdG8gZG8gbm90IGNyZWF0ZS93YWl0IGZvciBaTGliIGhlYWRlcnMuCi0KLSAgIGZ1bmN0aW9uIElzX09wZW4gKFN0cmVhbSA6IFN0cmVhbV9UeXBlKSByZXR1cm4gQm9vbGVhbjsKLQotICAgcHJvY2VkdXJlIENsb3NlIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGUpOwotCi1wcml2YXRlCi0KLSAgIHVzZSBBZGEuU3RyZWFtczsKLQotICAgdHlwZSBCdWZmZXJfQWNjZXNzIGlzIGFjY2VzcyBhbGwgU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0KLSAgIHR5cGUgU3RyZWFtX1R5cGUKLSAgICAgaXMgbmV3IFJvb3RfU3RyZWFtX1R5cGUgd2l0aAotICAgcmVjb3JkCi0gICAgICBNb2RlICAgICAgIDogU3RyZWFtX01vZGU7Ci0KLSAgICAgIEJ1ZmZlciAgICAgOiBCdWZmZXJfQWNjZXNzOwotICAgICAgUmVzdF9GaXJzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIFJlc3RfTGFzdCAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICAtLSAgQnVmZmVyIGZvciBSZWFkIG9wZXJhdGlvbi4KLSAgICAgIC0tICBXZSBuZWVkIHRvIGhhdmUgdGhpcyBidWZmZXIgaW4gdGhlIHJlY29yZAotICAgICAgLS0gIGJlY291c2Ugbm90IGFsbCByZWFkIGRhdGEgZnJvbSBiYWNrIHN0cmVhbQotICAgICAgLS0gIGNvdWxkIGJlIHByb2Nlc3NlZCBkdXJpbmcgdGhlIHJlYWQgb3BlcmF0aW9uLgotCi0gICAgICBCdWZmZXJfU2l6ZSA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIC0tICBCdWZmZXIgc2l6ZSBmb3Igd3JpdGUgb3BlcmF0aW9uLgotICAgICAgLS0gIFdlIGRvIG5vdCBuZWVkIHRvIGhhdmUgdGhpcyBidWZmZXIKLSAgICAgIC0tICBpbiB0aGUgcmVjb3JkIGJlY291c2UgYWxsIGRhdGEgY291bGQgYmUKLSAgICAgIC0tICBwcm9jZXNzZWQgaW4gdGhlIHdyaXRlIG9wZXJhdGlvbi4KLQotICAgICAgQmFjayAgICAgICA6IFN0cmVhbV9BY2Nlc3M7Ci0gICAgICBSZWFkZXIgICAgIDogRmlsdGVyX1R5cGU7Ci0gICAgICBXcml0ZXIgICAgIDogRmlsdGVyX1R5cGU7Ci0gICBlbmQgcmVjb3JkOwotCi1lbmQgWkxpYi5TdHJlYW1zOwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvYWRhL3psaWItdGhpbi5hZGIgYi9saWJzL3psaWIvY29udHJpYi9hZGEvemxpYi10aGluLmFkYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhNGE3MS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9hZGEvemxpYi10aGluLmFkYgorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tICAkSWQ6IHpsaWItdGhpbi5hZGIsdiAxLjggMjAwMy8xMi8xNCAxODoyNzozMSB2YWd1bCBFeHAgJAotCi1wYWNrYWdlIGJvZHkgWkxpYi5UaGluIGlzCi0KLSAgIFpMSUJfVkVSU0lPTiAgOiBjb25zdGFudCBDaGFyc19QdHIgOj0gemxpYlZlcnNpb247Ci0KLSAgIFpfU3RyZWFtX1NpemUgOiBjb25zdGFudCBJbnQgOj0gWl9TdHJlYW0nU2l6ZSAvIFN5c3RlbS5TdG9yYWdlX1VuaXQ7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tCi0gICAtLSBBdmFpbF9JbiAtLQotICAgLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gQXZhaWxfSW4gKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVJbnQgaXMKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gU3RybS5BdmFpbF9JbjsKLSAgIGVuZCBBdmFpbF9JbjsKLQotICAgLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBBdmFpbF9PdXQgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLQotCi0gICBmdW5jdGlvbiBBdmFpbF9PdXQgKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVJbnQgaXMKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gU3RybS5BdmFpbF9PdXQ7Ci0gICBlbmQgQXZhaWxfT3V0OwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIERlZmxhdGVfSW5pdCAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIERlZmxhdGVfSW5pdAotICAgICAoc3RybSAgICAgICA6IFpfU3RyZWFtcDsKLSAgICAgIGxldmVsICAgICAgOiBJbnQ7Ci0gICAgICBtZXRob2QgICAgIDogSW50OwotICAgICAgd2luZG93Qml0cyA6IEludDsKLSAgICAgIG1lbUxldmVsICAgOiBJbnQ7Ci0gICAgICBzdHJhdGVneSAgIDogSW50KQotICAgICAgcmV0dXJuICAgICAgIEludCBpcwotICAgYmVnaW4KLSAgICAgIHJldHVybiBkZWZsYXRlSW5pdDIKLSAgICAgICAgICAgICAgIChzdHJtLAotICAgICAgICAgICAgICAgIGxldmVsLAotICAgICAgICAgICAgICAgIG1ldGhvZCwKLSAgICAgICAgICAgICAgICB3aW5kb3dCaXRzLAotICAgICAgICAgICAgICAgIG1lbUxldmVsLAotICAgICAgICAgICAgICAgIHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgIFpMSUJfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICBaX1N0cmVhbV9TaXplKTsKLSAgIGVuZCBEZWZsYXRlX0luaXQ7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gSW5mbGF0ZV9Jbml0IC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gSW5mbGF0ZV9Jbml0IChzdHJtIDogWl9TdHJlYW1wOyB3aW5kb3dCaXRzIDogSW50KSByZXR1cm4gSW50IGlzCi0gICBiZWdpbgotICAgICAgcmV0dXJuIGluZmxhdGVJbml0MiAoc3RybSwgd2luZG93Qml0cywgWkxJQl9WRVJTSU9OLCBaX1N0cmVhbV9TaXplKTsKLSAgIGVuZCBJbmZsYXRlX0luaXQ7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gTGFzdF9FcnJvcl9NZXNzYWdlIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gTGFzdF9FcnJvcl9NZXNzYWdlIChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBTdHJpbmcgaXMKLSAgICAgIHVzZSBJbnRlcmZhY2VzLkMuU3RyaW5nczsKLSAgIGJlZ2luCi0gICAgICBpZiBTdHJtLm1zZyA9IE51bGxfUHRyIHRoZW4KLSAgICAgICAgIHJldHVybiAiIjsKLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiBWYWx1ZSAoU3RybS5tc2cpOwotICAgICAgZW5kIGlmOwotICAgZW5kIExhc3RfRXJyb3JfTWVzc2FnZTsKLQotICAgLS0tLS0tLS0tLS0tCi0gICAtLSBTZXRfSW4gLS0KLSAgIC0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgU2V0X0luCi0gICAgIChTdHJtICAgOiBpbiBvdXQgWl9TdHJlYW07Ci0gICAgICBCdWZmZXIgOiBpbiAgICAgVm9pZHA7Ci0gICAgICBTaXplICAgOiBpbiAgICAgVUludCkgaXMKLSAgIGJlZ2luCi0gICAgICBTdHJtLk5leHRfSW4gIDo9IEJ1ZmZlcjsKLSAgICAgIFN0cm0uQXZhaWxfSW4gOj0gU2l6ZTsKLSAgIGVuZCBTZXRfSW47Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gU2V0X01lbV9GdW5jIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFNldF9NZW1fRnVuYwotICAgICAoU3RybSAgIDogaW4gb3V0IFpfU3RyZWFtOwotICAgICAgT3BhcXVlIDogaW4gICAgIFZvaWRwOwotICAgICAgQWxsb2MgIDogaW4gICAgIGFsbG9jX2Z1bmM7Ci0gICAgICBGcmVlICAgOiBpbiAgICAgZnJlZV9mdW5jKSBpcwotICAgYmVnaW4KLSAgICAgIFN0cm0ub3BhcXVlIDo9IE9wYXF1ZTsKLSAgICAgIFN0cm0uemFsbG9jIDo9IEFsbG9jOwotICAgICAgU3RybS56ZnJlZSAgOj0gRnJlZTsKLSAgIGVuZCBTZXRfTWVtX0Z1bmM7Ci0KLSAgIC0tLS0tLS0tLS0tLS0KLSAgIC0tIFNldF9PdXQgLS0KLSAgIC0tLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFNldF9PdXQKLSAgICAgKFN0cm0gICA6IGluIG91dCBaX1N0cmVhbTsKLSAgICAgIEJ1ZmZlciA6IGluICAgICBWb2lkcDsKLSAgICAgIFNpemUgICA6IGluICAgICBVSW50KSBpcwotICAgYmVnaW4KLSAgICAgIFN0cm0uTmV4dF9PdXQgIDo9IEJ1ZmZlcjsKLSAgICAgIFN0cm0uQXZhaWxfT3V0IDo9IFNpemU7Ci0gICBlbmQgU2V0X091dDsKLQotICAgLS0tLS0tLS0tLS0tLS0KLSAgIC0tIFRvdGFsX0luIC0tCi0gICAtLS0tLS0tLS0tLS0tLQotCi0gICBmdW5jdGlvbiBUb3RhbF9JbiAoU3RybSA6IGluIFpfU3RyZWFtKSByZXR1cm4gVUxvbmcgaXMKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gU3RybS5Ub3RhbF9JbjsKLSAgIGVuZCBUb3RhbF9JbjsKLQotICAgLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBUb3RhbF9PdXQgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLQotCi0gICBmdW5jdGlvbiBUb3RhbF9PdXQgKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVMb25nIGlzCi0gICBiZWdpbgotICAgICAgcmV0dXJuIFN0cm0uVG90YWxfT3V0OwotICAgZW5kIFRvdGFsX091dDsKLQotZW5kIFpMaWIuVGhpbjsKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2FkYS96bGliLXRoaW4uYWRzIGIvbGlicy96bGliL2NvbnRyaWIvYWRhL3psaWItdGhpbi5hZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDA3ZWIuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvYWRhL3psaWItdGhpbi5hZHMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0gIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIERtaXRyaXkgQW5pc2lta292ICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIE9wZW4gc291cmNlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHpsaWIuYWRzIGZpbGUuICAtLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLSAgJElkOiB6bGliLXRoaW4uYWRzLHYgMS4xMSAyMDA0LzA3LzIzIDA2OjMzOjExIHZhZ3VsIEV4cCAkCi0KLXdpdGggSW50ZXJmYWNlcy5DLlN0cmluZ3M7Ci0KLXdpdGggU3lzdGVtOwotCi1wcml2YXRlIHBhY2thZ2UgWkxpYi5UaGluIGlzCi0KLSAgIC0tICBGcm9tIHpjb25mLmgKLQotICAgTUFYX01FTV9MRVZFTCA6IGNvbnN0YW50IDo9IDk7ICAgICAgICAgLS0gIHpjb25mLmg6MTA1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemNvbmYuaDoxMDUKLSAgIE1BWF9XQklUUyA6IGNvbnN0YW50IDo9IDE1OyAgICAgIC0tICB6Y29uZi5oOjExNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIDMySyBMWjc3IHdpbmRvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MTE1Ci0gICBTRUVLX1NFVCA6IGNvbnN0YW50IDo9IDgjMDAwMCM7ICAtLSAgemNvbmYuaDoyNDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemNvbmYuaDoyNDQKLSAgIFNFRUtfQ1VSIDogY29uc3RhbnQgOj0gMTsgICAgICAgIC0tICB6Y29uZi5oOjI0NQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjQ1Ci0gICBTRUVLX0VORCA6IGNvbnN0YW50IDo9IDI7ICAgICAgICAtLSAgemNvbmYuaDoyNDYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBTZXQgZmlsZSBwb2ludGVyIHRvIEVPRiBwbHVzICJvZmZzZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemNvbmYuaDoyNDYKLQotICAgdHlwZSBCeXRlIGlzIG5ldyBJbnRlcmZhY2VzLkMudW5zaWduZWRfY2hhcjsgLS0gIDggYml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjE0Ci0gICB0eXBlIFVJbnQgaXMgbmV3IEludGVyZmFjZXMuQy51bnNpZ25lZDsgICAgICAtLSAgMTYgYml0cyBvciBtb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemNvbmYuaDoyMTYKLSAgIHR5cGUgSW50IGlzIG5ldyBJbnRlcmZhY2VzLkMuaW50OwotCi0gICB0eXBlIFVMb25nIGlzIG5ldyBJbnRlcmZhY2VzLkMudW5zaWduZWRfbG9uZzsgICAgIC0tICAzMiBiaXRzIG9yIG1vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjE3Ci0gICBzdWJ0eXBlIENoYXJzX1B0ciBpcyBJbnRlcmZhY2VzLkMuU3RyaW5ncy5jaGFyc19wdHI7Ci0KLSAgIHR5cGUgVUxvbmdfQWNjZXNzIGlzIGFjY2VzcyBVTG9uZzsKLSAgIHR5cGUgSW50X0FjY2VzcyBpcyBhY2Nlc3MgSW50OwotCi0gICBzdWJ0eXBlIFZvaWRwIGlzIFN5c3RlbS5BZGRyZXNzOyAgICAgICAgICAgIC0tICB6Y29uZi5oOjIzMgotCi0gICBzdWJ0eXBlIEJ5dGVfQWNjZXNzIGlzIFZvaWRwOwotCi0gICBOdWwgOiBjb25zdGFudCBWb2lkcCA6PSBTeXN0ZW0uTnVsbF9BZGRyZXNzOwotICAgLS0gIGVuZCBmcm9tIHpjb25mCi0KLSAgIFpfTk9fRkxVU0ggOiBjb25zdGFudCA6PSA4IzAwMDAjOyAgIC0tICB6bGliLmg6MTI1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEyNQotICAgWl9QQVJUSUFMX0ZMVVNIIDogY29uc3RhbnQgOj0gMTsgICAgICAgLS0gIHpsaWIuaDoxMjYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB3aWxsIGJlIHJlbW92ZWQsIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIFpfU1lOQ19GTFVTSCBpbnN0ZWFkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEyNgotICAgWl9TWU5DX0ZMVVNIIDogY29uc3RhbnQgOj0gMjsgICAgICAgLS0gIHpsaWIuaDoxMjcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTI3Ci0gICBaX0ZVTExfRkxVU0ggOiBjb25zdGFudCA6PSAzOyAgICAgICAtLSAgemxpYi5oOjEyOAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMjgKLSAgIFpfRklOSVNIIDogY29uc3RhbnQgOj0gNDsgICAgICAgIC0tICB6bGliLmg6MTI5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEyOQotICAgWl9PSyA6IGNvbnN0YW50IDo9IDgjMDAwMCM7ICAgLS0gIHpsaWIuaDoxMzIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTMyCi0gICBaX1NUUkVBTV9FTkQgOiBjb25zdGFudCA6PSAxOyAgICAgICAtLSAgemxpYi5oOjEzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMzMKLSAgIFpfTkVFRF9ESUNUIDogY29uc3RhbnQgOj0gMjsgICAgICAgIC0tICB6bGliLmg6MTM0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEzNAotICAgWl9FUlJOTyA6IGNvbnN0YW50IDo9IC0xOyAgICAgICAgLS0gIHpsaWIuaDoxMzUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTM1Ci0gICBaX1NUUkVBTV9FUlJPUiA6IGNvbnN0YW50IDo9IC0yOyAgICAgICAtLSAgemxpYi5oOjEzNgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMzYKLSAgIFpfREFUQV9FUlJPUiA6IGNvbnN0YW50IDo9IC0zOyAgICAgIC0tICB6bGliLmg6MTM3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEzNwotICAgWl9NRU1fRVJST1IgOiBjb25zdGFudCA6PSAtNDsgICAgICAgLS0gIHpsaWIuaDoxMzgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTM4Ci0gICBaX0JVRl9FUlJPUiA6IGNvbnN0YW50IDo9IC01OyAgICAgICAtLSAgemxpYi5oOjEzOQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMzkKLSAgIFpfVkVSU0lPTl9FUlJPUiA6IGNvbnN0YW50IDo9IC02OyAgICAgIC0tICB6bGliLmg6MTQwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE0MAotICAgWl9OT19DT01QUkVTU0lPTiA6IGNvbnN0YW50IDo9IDgjMDAwMCM7ICAgLS0gIHpsaWIuaDoxNDUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTQ1Ci0gICBaX0JFU1RfU1BFRUQgOiBjb25zdGFudCA6PSAxOyAgICAgICAtLSAgemxpYi5oOjE0NgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNDYKLSAgIFpfQkVTVF9DT01QUkVTU0lPTiA6IGNvbnN0YW50IDo9IDk7ICAgICAgIC0tICB6bGliLmg6MTQ3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE0NwotICAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OIDogY29uc3RhbnQgOj0gLTE7ICAgICAgLS0gIHpsaWIuaDoxNDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTQ4Ci0gICBaX0ZJTFRFUkVEIDogY29uc3RhbnQgOj0gMTsgICAgICAtLSAgemxpYi5oOjE1MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNTEKLSAgIFpfSFVGRk1BTl9PTkxZIDogY29uc3RhbnQgOj0gMjsgICAgICAgIC0tICB6bGliLmg6MTUyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE1MgotICAgWl9ERUZBVUxUX1NUUkFURUdZIDogY29uc3RhbnQgOj0gOCMwMDAwIzsgLS0gIHpsaWIuaDoxNTMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTUzCi0gICBaX0JJTkFSWSA6IGNvbnN0YW50IDo9IDgjMDAwMCM7ICAtLSAgemxpYi5oOjE1NgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNTYKLSAgIFpfQVNDSUkgOiBjb25zdGFudCA6PSAxOyAgICAgIC0tICB6bGliLmg6MTU3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE1NwotICAgWl9VTktOT1dOIDogY29uc3RhbnQgOj0gMjsgICAgICAgLS0gIHpsaWIuaDoxNTgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTU4Ci0gICBaX0RFRkxBVEVEIDogY29uc3RhbnQgOj0gODsgICAgICAtLSAgemxpYi5oOjE2MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNjEKLSAgIFpfTlVMTCA6IGNvbnN0YW50IDo9IDgjMDAwMCM7IC0tICB6bGliLmg6MTY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgZm9yIGluaXRpYWxpemluZyB6YWxsb2MsIHpmcmVlLCBvcGFxdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTY0Ci0gICB0eXBlIGd6RmlsZSBpcyBuZXcgVm9pZHA7ICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDo2NDYKLQotICAgdHlwZSBaX1N0cmVhbSBpcyBwcml2YXRlOwotCi0gICB0eXBlIFpfU3RyZWFtcCBpcyBhY2Nlc3MgYWxsIFpfU3RyZWFtOyAgICAgLS0gIHpsaWIuaDo4OQotCi0gICB0eXBlIGFsbG9jX2Z1bmMgaXMgYWNjZXNzIGZ1bmN0aW9uCi0gICAgIChPcGFxdWUgOiBWb2lkcDsKLSAgICAgIEl0ZW1zICA6IFVJbnQ7Ci0gICAgICBTaXplICAgOiBVSW50KQotICAgICAgcmV0dXJuIFZvaWRwOyAtLSAgemxpYi5oOjYzCi0KLSAgIHR5cGUgZnJlZV9mdW5jIGlzIGFjY2VzcyBwcm9jZWR1cmUgKG9wYXF1ZSA6IFZvaWRwOyBhZGRyZXNzIDogVm9pZHApOwotCi0gICBmdW5jdGlvbiB6bGliVmVyc2lvbiByZXR1cm4gQ2hhcnNfUHRyOwotCi0gICBmdW5jdGlvbiBEZWZsYXRlIChzdHJtIDogWl9TdHJlYW1wOyBmbHVzaCA6IEludCkgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gRGVmbGF0ZUVuZCAoc3RybSA6IFpfU3RyZWFtcCkgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gSW5mbGF0ZSAoc3RybSA6IFpfU3RyZWFtcDsgZmx1c2ggOiBJbnQpIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIEluZmxhdGVFbmQgKHN0cm0gOiBaX1N0cmVhbXApIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5Ci0gICAgIChzdHJtICAgICAgIDogWl9TdHJlYW1wOwotICAgICAgZGljdGlvbmFyeSA6IEJ5dGVfQWNjZXNzOwotICAgICAgZGljdExlbmd0aCA6IFVJbnQpCi0gICAgICByZXR1cm4gICAgICAgSW50OwotCi0gICBmdW5jdGlvbiBkZWZsYXRlQ29weSAoZGVzdCA6IFpfU3RyZWFtcDsgc291cmNlIDogWl9TdHJlYW1wKSByZXR1cm4gSW50OwotICAgLS0gIHpsaWIuaDo0NzgKLQotICAgZnVuY3Rpb24gZGVmbGF0ZVJlc2V0IChzdHJtIDogWl9TdHJlYW1wKSByZXR1cm4gSW50OyAtLSB6bGliLmg6NDk1Ci0KLSAgIGZ1bmN0aW9uIGRlZmxhdGVQYXJhbXMKLSAgICAgKHN0cm0gICAgIDogWl9TdHJlYW1wOwotICAgICAgbGV2ZWwgICAgOiBJbnQ7Ci0gICAgICBzdHJhdGVneSA6IEludCkKLSAgICAgIHJldHVybiAgICAgSW50OyAgICAgICAtLSB6bGliLmg6NTA2Ci0KLSAgIGZ1bmN0aW9uIGluZmxhdGVTZXREaWN0aW9uYXJ5Ci0gICAgIChzdHJtICAgICAgIDogWl9TdHJlYW1wOwotICAgICAgZGljdGlvbmFyeSA6IEJ5dGVfQWNjZXNzOwotICAgICAgZGljdExlbmd0aCA6IFVJbnQpCi0gICAgICByZXR1cm4gICAgICAgSW50OyAtLSAgemxpYi5oOjU0OAotCi0gICBmdW5jdGlvbiBpbmZsYXRlU3luYyAoc3RybSA6IFpfU3RyZWFtcCkgcmV0dXJuIEludDsgIC0tICB6bGliLmg6NTY1Ci0KLSAgIGZ1bmN0aW9uIGluZmxhdGVSZXNldCAoc3RybSA6IFpfU3RyZWFtcCkgcmV0dXJuIEludDsgLS0gIHpsaWIuaDo1ODAKLQotICAgZnVuY3Rpb24gY29tcHJlc3MKLSAgICAgKGRlc3QgICAgICA6IEJ5dGVfQWNjZXNzOwotICAgICAgZGVzdExlbiAgIDogVUxvbmdfQWNjZXNzOwotICAgICAgc291cmNlICAgIDogQnl0ZV9BY2Nlc3M7Ci0gICAgICBzb3VyY2VMZW4gOiBVTG9uZykKLSAgICAgIHJldHVybiAgICAgIEludDsgICAgICAgICAgIC0tIHpsaWIuaDo2MDEKLQotICAgZnVuY3Rpb24gY29tcHJlc3MyCi0gICAgIChkZXN0ICAgICAgOiBCeXRlX0FjY2VzczsKLSAgICAgIGRlc3RMZW4gICA6IFVMb25nX0FjY2VzczsKLSAgICAgIHNvdXJjZSAgICA6IEJ5dGVfQWNjZXNzOwotICAgICAgc291cmNlTGVuIDogVUxvbmc7Ci0gICAgICBsZXZlbCAgICAgOiBJbnQpCi0gICAgICByZXR1cm4gICAgICBJbnQ7ICAgICAgICAgIC0tIHpsaWIuaDo2MTUKLQotICAgZnVuY3Rpb24gdW5jb21wcmVzcwotICAgICAoZGVzdCAgICAgIDogQnl0ZV9BY2Nlc3M7Ci0gICAgICBkZXN0TGVuICAgOiBVTG9uZ19BY2Nlc3M7Ci0gICAgICBzb3VyY2UgICAgOiBCeXRlX0FjY2VzczsKLSAgICAgIHNvdXJjZUxlbiA6IFVMb25nKQotICAgICAgcmV0dXJuICAgICAgSW50OwotCi0gICBmdW5jdGlvbiBnem9wZW4gKHBhdGggOiBDaGFyc19QdHI7IG1vZGUgOiBDaGFyc19QdHIpIHJldHVybiBnekZpbGU7Ci0KLSAgIGZ1bmN0aW9uIGd6ZG9wZW4gKGZkIDogSW50OyBtb2RlIDogQ2hhcnNfUHRyKSByZXR1cm4gZ3pGaWxlOwotCi0gICBmdW5jdGlvbiBnenNldHBhcmFtcwotICAgICAoZmlsZSAgICAgOiBnekZpbGU7Ci0gICAgICBsZXZlbCAgICA6IEludDsKLSAgICAgIHN0cmF0ZWd5IDogSW50KQotICAgICAgcmV0dXJuICAgICBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGd6cmVhZAotICAgICAoZmlsZSA6IGd6RmlsZTsKLSAgICAgIGJ1ZiAgOiBWb2lkcDsKLSAgICAgIGxlbiAgOiBVSW50KQotICAgICAgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gZ3p3cml0ZQotICAgICAoZmlsZSA6IGluIGd6RmlsZTsKLSAgICAgIGJ1ZiAgOiBpbiBWb2lkcDsKLSAgICAgIGxlbiAgOiBpbiBVSW50KQotICAgICAgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gZ3pwcmludGYgKGZpbGUgOiBpbiBnekZpbGU7IGZvcm1hdCA6IGluIENoYXJzX1B0cikgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gZ3pwdXRzIChmaWxlIDogaW4gZ3pGaWxlOyBzIDogaW4gQ2hhcnNfUHRyKSByZXR1cm4gSW50OwotCi0gICBmdW5jdGlvbiBnemdldHMKLSAgICAgKGZpbGUgOiBnekZpbGU7Ci0gICAgICBidWYgIDogQ2hhcnNfUHRyOwotICAgICAgbGVuICA6IEludCkKLSAgICAgIHJldHVybiBDaGFyc19QdHI7Ci0KLSAgIGZ1bmN0aW9uIGd6cHV0YyAoZmlsZSA6IGd6RmlsZTsgY2hhciA6IEludCkgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gZ3pnZXRjIChmaWxlIDogZ3pGaWxlKSByZXR1cm4gSW50OwotCi0gICBmdW5jdGlvbiBnemZsdXNoIChmaWxlIDogZ3pGaWxlOyBmbHVzaCA6IEludCkgcmV0dXJuIEludDsKLQotICAgZnVuY3Rpb24gZ3pzZWVrCi0gICAgIChmaWxlICAgOiBnekZpbGU7Ci0gICAgICBvZmZzZXQgOiBJbnQ7Ci0gICAgICB3aGVuY2UgOiBJbnQpCi0gICAgICByZXR1cm4gICBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGd6cmV3aW5kIChmaWxlIDogZ3pGaWxlKSByZXR1cm4gSW50OwotCi0gICBmdW5jdGlvbiBnenRlbGwgKGZpbGUgOiBnekZpbGUpIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGd6ZW9mIChmaWxlIDogZ3pGaWxlKSByZXR1cm4gSW50OwotCi0gICBmdW5jdGlvbiBnemNsb3NlIChmaWxlIDogZ3pGaWxlKSByZXR1cm4gSW50OwotCi0gICBmdW5jdGlvbiBnemVycm9yIChmaWxlIDogZ3pGaWxlOyBlcnJudW0gOiBJbnRfQWNjZXNzKSByZXR1cm4gQ2hhcnNfUHRyOwotCi0gICBmdW5jdGlvbiBhZGxlcjMyCi0gICAgIChhZGxlciA6IFVMb25nOwotICAgICAgYnVmICAgOiBCeXRlX0FjY2VzczsKLSAgICAgIGxlbiAgIDogVUludCkKLSAgICAgIHJldHVybiAgVUxvbmc7Ci0KLSAgIGZ1bmN0aW9uIGNyYzMyCi0gICAgIChjcmMgIDogVUxvbmc7Ci0gICAgICBidWYgIDogQnl0ZV9BY2Nlc3M7Ci0gICAgICBsZW4gIDogVUludCkKLSAgICAgIHJldHVybiBVTG9uZzsKLQotICAgZnVuY3Rpb24gZGVmbGF0ZUluaXQKLSAgICAgKHN0cm0gICAgICAgIDogWl9TdHJlYW1wOwotICAgICAgbGV2ZWwgICAgICAgOiBJbnQ7Ci0gICAgICB2ZXJzaW9uICAgICA6IENoYXJzX1B0cjsKLSAgICAgIHN0cmVhbV9zaXplIDogSW50KQotICAgICAgcmV0dXJuICAgICAgICBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGRlZmxhdGVJbml0MgotICAgICAoc3RybSAgICAgICAgOiBaX1N0cmVhbXA7Ci0gICAgICBsZXZlbCAgICAgICA6IEludDsKLSAgICAgIG1ldGhvZCAgICAgIDogSW50OwotICAgICAgd2luZG93Qml0cyAgOiBJbnQ7Ci0gICAgICBtZW1MZXZlbCAgICA6IEludDsKLSAgICAgIHN0cmF0ZWd5ICAgIDogSW50OwotICAgICAgdmVyc2lvbiAgICAgOiBDaGFyc19QdHI7Ci0gICAgICBzdHJlYW1fc2l6ZSA6IEludCkKLSAgICAgIHJldHVybiAgICAgICAgSW50OwotCi0gICBmdW5jdGlvbiBEZWZsYXRlX0luaXQKLSAgICAgKHN0cm0gICAgICAgOiBaX1N0cmVhbXA7Ci0gICAgICBsZXZlbCAgICAgIDogSW50OwotICAgICAgbWV0aG9kICAgICA6IEludDsKLSAgICAgIHdpbmRvd0JpdHMgOiBJbnQ7Ci0gICAgICBtZW1MZXZlbCAgIDogSW50OwotICAgICAgc3RyYXRlZ3kgICA6IEludCkKLSAgICAgIHJldHVybiAgICAgICBJbnQ7Ci0gICBwcmFnbWEgSW5saW5lIChEZWZsYXRlX0luaXQpOwotCi0gICBmdW5jdGlvbiBpbmZsYXRlSW5pdAotICAgICAoc3RybSAgICAgICAgOiBaX1N0cmVhbXA7Ci0gICAgICB2ZXJzaW9uICAgICA6IENoYXJzX1B0cjsKLSAgICAgIHN0cmVhbV9zaXplIDogSW50KQotICAgICAgcmV0dXJuICAgICAgICBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGluZmxhdGVJbml0MgotICAgICAoc3RybSAgICAgICAgOiBpbiBaX1N0cmVhbXA7Ci0gICAgICB3aW5kb3dCaXRzICA6IGluIEludDsKLSAgICAgIHZlcnNpb24gICAgIDogaW4gQ2hhcnNfUHRyOwotICAgICAgc3RyZWFtX3NpemUgOiBpbiBJbnQpCi0gICAgICByZXR1cm4gICAgICBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGluZmxhdGVCYWNrSW5pdAotICAgICAoc3RybSAgICAgICAgOiBpbiBaX1N0cmVhbXA7Ci0gICAgICB3aW5kb3dCaXRzICA6IGluIEludDsKLSAgICAgIHdpbmRvdyAgICAgIDogaW4gQnl0ZV9BY2Nlc3M7Ci0gICAgICB2ZXJzaW9uICAgICA6IGluIENoYXJzX1B0cjsKLSAgICAgIHN0cmVhbV9zaXplIDogaW4gSW50KQotICAgICAgcmV0dXJuICAgICAgSW50OwotICAgLS0gIFNpemUgb2Ygd2luZG93IGhhdmUgdG8gYmUgMioqd2luZG93Qml0cy4KLQotICAgZnVuY3Rpb24gSW5mbGF0ZV9Jbml0IChzdHJtIDogWl9TdHJlYW1wOyB3aW5kb3dCaXRzIDogSW50KSByZXR1cm4gSW50OwotICAgcHJhZ21hIElubGluZSAoSW5mbGF0ZV9Jbml0KTsKLQotICAgZnVuY3Rpb24gekVycm9yIChlcnIgOiBJbnQpIHJldHVybiBDaGFyc19QdHI7Ci0KLSAgIGZ1bmN0aW9uIGluZmxhdGVTeW5jUG9pbnQgKHogOiBaX1N0cmVhbXApIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGdldF9jcmNfdGFibGUgcmV0dXJuIFVMb25nX0FjY2VzczsKLQotICAgLS0gIEludGVyZmFjZSB0byB0aGUgYXZhaWxhYmxlIGZpZWxkcyBvZiB0aGUgel9zdHJlYW0gc3RydWN0dXJlLgotICAgLS0gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbiB3aGVuIGF2YWlsX2luIGhhcwotICAgLS0gIGRyb3BwZWQgdG8gemVyby4gSXQgbXVzdCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dCB3aGVuIGF2YWlsX291dAotICAgLS0gIGhhcyBkcm9wcGVkIHRvIHplcm8uIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgemFsbG9jLCB6ZnJlZSBhbmQKLSAgIC0tICBvcGFxdWUgYmVmb3JlIGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24uCi0KLSAgIHByb2NlZHVyZSBTZXRfSW4KLSAgICAgKFN0cm0gICA6IGluIG91dCBaX1N0cmVhbTsKLSAgICAgIEJ1ZmZlciA6IGluIFZvaWRwOwotICAgICAgU2l6ZSAgIDogaW4gVUludCk7Ci0gICBwcmFnbWEgSW5saW5lIChTZXRfSW4pOwotCi0gICBwcm9jZWR1cmUgU2V0X091dAotICAgICAoU3RybSAgIDogaW4gb3V0IFpfU3RyZWFtOwotICAgICAgQnVmZmVyIDogaW4gVm9pZHA7Ci0gICAgICBTaXplICAgOiBpbiBVSW50KTsKLSAgIHByYWdtYSBJbmxpbmUgKFNldF9PdXQpOwotCi0gICBwcm9jZWR1cmUgU2V0X01lbV9GdW5jCi0gICAgIChTdHJtICAgOiBpbiBvdXQgWl9TdHJlYW07Ci0gICAgICBPcGFxdWUgOiBpbiBWb2lkcDsKLSAgICAgIEFsbG9jICA6IGluIGFsbG9jX2Z1bmM7Ci0gICAgICBGcmVlICAgOiBpbiBmcmVlX2Z1bmMpOwotICAgcHJhZ21hIElubGluZSAoU2V0X01lbV9GdW5jKTsKLQotICAgZnVuY3Rpb24gTGFzdF9FcnJvcl9NZXNzYWdlIChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBTdHJpbmc7Ci0gICBwcmFnbWEgSW5saW5lIChMYXN0X0Vycm9yX01lc3NhZ2UpOwotCi0gICBmdW5jdGlvbiBBdmFpbF9PdXQgKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVJbnQ7Ci0gICBwcmFnbWEgSW5saW5lIChBdmFpbF9PdXQpOwotCi0gICBmdW5jdGlvbiBBdmFpbF9JbiAoU3RybSA6IGluIFpfU3RyZWFtKSByZXR1cm4gVUludDsKLSAgIHByYWdtYSBJbmxpbmUgKEF2YWlsX0luKTsKLQotICAgZnVuY3Rpb24gVG90YWxfSW4gKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVMb25nOwotICAgcHJhZ21hIElubGluZSAoVG90YWxfSW4pOwotCi0gICBmdW5jdGlvbiBUb3RhbF9PdXQgKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVMb25nOwotICAgcHJhZ21hIElubGluZSAoVG90YWxfT3V0KTsKLQotICAgZnVuY3Rpb24gaW5mbGF0ZUNvcHkKLSAgICAgKGRlc3QgICA6IGluIFpfU3RyZWFtcDsKLSAgICAgIFNvdXJjZSA6IGluIFpfU3RyZWFtcCkKLSAgICAgIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIGNvbXByZXNzQm91bmQgKFNvdXJjZV9MZW4gOiBpbiBVTG9uZykgcmV0dXJuIFVMb25nOwotCi0gICBmdW5jdGlvbiBkZWZsYXRlQm91bmQKLSAgICAgKFN0cm0gICAgICAgOiBpbiBaX1N0cmVhbXA7Ci0gICAgICBTb3VyY2VfTGVuIDogaW4gVUxvbmcpCi0gICAgICByZXR1cm4gICAgIFVMb25nOwotCi0gICBmdW5jdGlvbiBnenVuZ2V0YyAoQyA6IGluIEludDsgRmlsZSA6IGluICBnekZpbGUpIHJldHVybiBJbnQ7Ci0KLSAgIGZ1bmN0aW9uIHpsaWJDb21waWxlRmxhZ3MgcmV0dXJuIFVMb25nOwotCi1wcml2YXRlCi0KLSAgIHR5cGUgWl9TdHJlYW0gaXMgcmVjb3JkICAgICAgICAgICAgLS0gemxpYi5oOjY4Ci0gICAgICBOZXh0X0luICAgOiBWb2lkcCAgICAgIDo9IE51bDsgIC0tIG5leHQgaW5wdXQgYnl0ZQotICAgICAgQXZhaWxfSW4gIDogVUludCAgICAgICA6PSAwOyAgICAtLSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4KLSAgICAgIFRvdGFsX0luICA6IFVMb25nICAgICAgOj0gMDsgICAgLS0gdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIKLSAgICAgIE5leHRfT3V0ICA6IFZvaWRwICAgICAgOj0gTnVsOyAgLS0gbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlCi0gICAgICBBdmFpbF9PdXQgOiBVSW50ICAgICAgIDo9IDA7ICAgIC0tIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG5leHRfb3V0Ci0gICAgICBUb3RhbF9PdXQgOiBVTG9uZyAgICAgIDo9IDA7ICAgIC0tIHRvdGFsIG5iIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIKLSAgICAgIG1zZyAgICAgICA6IENoYXJzX1B0cjsgICAgICAgICAgLS0gbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yCi0gICAgICBzdGF0ZSAgICAgOiBWb2lkcDsgICAgICAgICAgICAgIC0tIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucwotICAgICAgemFsbG9jICAgIDogYWxsb2NfZnVuYyA6PSBudWxsOyAtLSB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICAgICAgemZyZWUgICAgIDogZnJlZV9mdW5jICA6PSBudWxsOyAtLSB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIHN0YXRlCi0gICAgICBvcGFxdWUgICAgOiBWb2lkcDsgICAgICAgICAgICAgIC0tIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6YWxsb2MgYW5kIHpmcmVlCi0gICAgICBkYXRhX3R5cGUgOiBJbnQ7ICAgICAgICAgICAgICAgIC0tIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIGFzY2lpIG9yIGJpbmFyeQotICAgICAgYWRsZXIgICAgIDogVUxvbmc7ICAgICAgICAgICAgICAtLSBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIGRhdGEKLSAgICAgIHJlc2VydmVkICA6IFVMb25nOyAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgIGVuZCByZWNvcmQ7Ci0KLSAgIHByYWdtYSBDb252ZW50aW9uIChDLCBaX1N0cmVhbSk7Ci0KLSAgIHByYWdtYSBJbXBvcnQgKEMsIHpsaWJWZXJzaW9uLCAiemxpYlZlcnNpb24iKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIERlZmxhdGUsICJkZWZsYXRlIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBEZWZsYXRlRW5kLCAiZGVmbGF0ZUVuZCIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgSW5mbGF0ZSwgImluZmxhdGUiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIEluZmxhdGVFbmQsICJpbmZsYXRlRW5kIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlU2V0RGljdGlvbmFyeSwgImRlZmxhdGVTZXREaWN0aW9uYXJ5Iik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlQ29weSwgImRlZmxhdGVDb3B5Iik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlUmVzZXQsICJkZWZsYXRlUmVzZXQiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGRlZmxhdGVQYXJhbXMsICJkZWZsYXRlUGFyYW1zIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlU2V0RGljdGlvbmFyeSwgImluZmxhdGVTZXREaWN0aW9uYXJ5Iik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlU3luYywgImluZmxhdGVTeW5jIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlUmVzZXQsICJpbmZsYXRlUmVzZXQiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGNvbXByZXNzLCAiY29tcHJlc3MiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGNvbXByZXNzMiwgImNvbXByZXNzMiIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgdW5jb21wcmVzcywgInVuY29tcHJlc3MiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6b3BlbiwgImd6b3BlbiIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZ3pkb3BlbiwgImd6ZG9wZW4iKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6c2V0cGFyYW1zLCAiZ3pzZXRwYXJhbXMiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6cmVhZCwgImd6cmVhZCIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZ3p3cml0ZSwgImd6d3JpdGUiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6cHJpbnRmLCAiZ3pwcmludGYiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6cHV0cywgImd6cHV0cyIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZ3pnZXRzLCAiZ3pnZXRzIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnenB1dGMsICJnenB1dGMiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6Z2V0YywgImd6Z2V0YyIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZ3pmbHVzaCwgImd6Zmx1c2giKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGd6c2VlaywgImd6c2VlayIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZ3pyZXdpbmQsICJnenJld2luZCIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZ3p0ZWxsLCAiZ3p0ZWxsIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnemVvZiwgImd6ZW9mIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnemNsb3NlLCAiZ3pjbG9zZSIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZ3plcnJvciwgImd6ZXJyb3IiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGFkbGVyMzIsICJhZGxlcjMyIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBjcmMzMiwgImNyYzMyIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlSW5pdCwgImRlZmxhdGVJbml0XyIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZUluaXQsICJpbmZsYXRlSW5pdF8iKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGRlZmxhdGVJbml0MiwgImRlZmxhdGVJbml0Ml8iKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGluZmxhdGVJbml0MiwgImluZmxhdGVJbml0Ml8iKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIHpFcnJvciwgInpFcnJvciIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZVN5bmNQb2ludCwgImluZmxhdGVTeW5jUG9pbnQiKTsKLSAgIHByYWdtYSBJbXBvcnQgKEMsIGdldF9jcmNfdGFibGUsICJnZXRfY3JjX3RhYmxlIik7Ci0KLSAgIC0tICBzaW5jZSB6bGliIDEuMi4wOgotCi0gICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlQ29weSwgImluZmxhdGVDb3B5Iik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBjb21wcmVzc0JvdW5kLCAiY29tcHJlc3NCb3VuZCIpOwotICAgcHJhZ21hIEltcG9ydCAoQywgZGVmbGF0ZUJvdW5kLCAiZGVmbGF0ZUJvdW5kIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCBnenVuZ2V0YywgImd6dW5nZXRjIik7Ci0gICBwcmFnbWEgSW1wb3J0IChDLCB6bGliQ29tcGlsZUZsYWdzLCAiemxpYkNvbXBpbGVGbGFncyIpOwotCi0gICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlQmFja0luaXQsICJpbmZsYXRlQmFja0luaXRfIik7Ci0KLSAgIC0tICBJIHN0b3BwZWQgYmluZGluZyB0aGUgaW5mbGF0ZUJhY2sgcm91dGluZXMsIGJlY291c2UgcmVhbGl6ZSB0aGF0Ci0gICAtLSAgaXQgZG9lcyBub3Qgc3VwcG9ydCB6bGliIGFuZCBnemlwIGhlYWRlcnMgZm9yIG5vdywgYW5kIGhhdmUgbm8KLSAgIC0tICBzeW1tZXRyaWMgZGVmbGF0ZUJhY2sgcm91dGluZXMuCi0gICAtLSAgWkxpYi1BZGEgaXMgc3ltbWV0cmljIHJlZ2FyZGluZyBkZWZsYXRlL2luZmxhdGUgZGF0YSB0cmFuc2Zvcm1hdGlvbgotICAgLS0gIGFuZCBoYXMgYSBzaW1pbGFyIGdlbmVyaWMgY2FsbGJhY2sgaW50ZXJmYWNlIGZvciB0aGUKLSAgIC0tICBkZWZsYXRlL2luZmxhdGUgdHJhbnNmb3JtYXRpb24gYmFzZWQgb24gdGhlIHJlZ3VsYXIgRGVmbGF0ZS9JbmZsYXRlCi0gICAtLSAgcm91dGluZXMuCi0KLSAgIC0tICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlQmFjaywgImluZmxhdGVCYWNrIik7Ci0gICAtLSAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZUJhY2tFbmQsICJpbmZsYXRlQmFja0VuZCIpOwotCi1lbmQgWkxpYi5UaGluOwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvYWRhL3psaWIuYWRiIGIvbGlicy96bGliL2NvbnRyaWIvYWRhL3psaWIuYWRiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjZmZDY4Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2FkYS96bGliLmFkYgorKysgL2Rldi9udWxsCkBAIC0xLDcwMSArMCwwIEBACi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tICAkSWQ6IHpsaWIuYWRiLHYgMS4zMSAyMDA0LzA5LzA2IDA2OjUzOjE5IHZhZ3VsIEV4cCAkCi0KLXdpdGggQWRhLkV4Y2VwdGlvbnM7Ci13aXRoIEFkYS5VbmNoZWNrZWRfQ29udmVyc2lvbjsKLXdpdGggQWRhLlVuY2hlY2tlZF9EZWFsbG9jYXRpb247Ci0KLXdpdGggSW50ZXJmYWNlcy5DLlN0cmluZ3M7Ci0KLXdpdGggWkxpYi5UaGluOwotCi1wYWNrYWdlIGJvZHkgWkxpYiBpcwotCi0gICB1c2UgdHlwZSBUaGluLkludDsKLQotICAgdHlwZSBaX1N0cmVhbSBpcyBuZXcgVGhpbi5aX1N0cmVhbTsKLQotICAgdHlwZSBSZXR1cm5fQ29kZV9FbnVtIGlzCi0gICAgICAoT0ssCi0gICAgICAgU1RSRUFNX0VORCwKLSAgICAgICBORUVEX0RJQ1QsCi0gICAgICAgRVJSTk8sCi0gICAgICAgU1RSRUFNX0VSUk9SLAotICAgICAgIERBVEFfRVJST1IsCi0gICAgICAgTUVNX0VSUk9SLAotICAgICAgIEJVRl9FUlJPUiwKLSAgICAgICBWRVJTSU9OX0VSUk9SKTsKLQotICAgdHlwZSBGbGF0ZV9TdGVwX0Z1bmN0aW9uIGlzIGFjY2VzcwotICAgICBmdW5jdGlvbiAoU3RybSA6IGluIFRoaW4uWl9TdHJlYW1wOyBGbHVzaCA6IGluIFRoaW4uSW50KSByZXR1cm4gVGhpbi5JbnQ7Ci0gICBwcmFnbWEgQ29udmVudGlvbiAoQywgRmxhdGVfU3RlcF9GdW5jdGlvbik7Ci0KLSAgIHR5cGUgRmxhdGVfRW5kX0Z1bmN0aW9uIGlzIGFjY2VzcwotICAgICAgZnVuY3Rpb24gKEN0cm0gOiBpbiBUaGluLlpfU3RyZWFtcCkgcmV0dXJuIFRoaW4uSW50OwotICAgcHJhZ21hIENvbnZlbnRpb24gKEMsIEZsYXRlX0VuZF9GdW5jdGlvbik7Ci0KLSAgIHR5cGUgRmxhdGVfVHlwZSBpcyByZWNvcmQKLSAgICAgIFN0ZXAgOiBGbGF0ZV9TdGVwX0Z1bmN0aW9uOwotICAgICAgRG9uZSA6IEZsYXRlX0VuZF9GdW5jdGlvbjsKLSAgIGVuZCByZWNvcmQ7Ci0KLSAgIHN1YnR5cGUgRm9vdGVyX0FycmF5IGlzIFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIDgpOwotCi0gICBTaW1wbGVfR1ppcF9IZWFkZXIgOiBjb25zdGFudCBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiAxMCkKLSAgICAgOj0gKDE2IzFmIywgMTYjOGIjLCAgICAgICAgICAgICAgICAgLS0gIE1hZ2ljIGhlYWRlcgotICAgICAgICAgMTYjMDgjLCAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgWl9ERUZMQVRFRAotICAgICAgICAgMTYjMDAjLCAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgRmxhZ3MKLSAgICAgICAgIDE2IzAwIywgMTYjMDAjLCAxNiMwMCMsIDE2IzAwIywgLS0gIFRpbWUKLSAgICAgICAgIDE2IzAwIywgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIFhGbGFncwotICAgICAgICAgMTYjMDMjICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgT1MgY29kZQotICAgICAgICApOwotICAgLS0gIFRoZSBzaW1wbGVzdCBnemlwIGhlYWRlciBpcyBub3QgZm9yIGluZm9ybWF0aW9uYWwsIGJ1dCBqdXN0IGZvcgotICAgLS0gIGd6aXAgZm9ybWF0IGNvbXBhdGliaWxpdHkuCi0gICAtLSAgTm90ZSB0aGF0IHNvbWUgY29kZSBiZWxvdyBpcyB1c2luZyBhc3N1bXB0aW9uCi0gICAtLSAgU2ltcGxlX0daaXBfSGVhZGVyJ0xhc3QgPiBGb290ZXJfQXJyYXknTGFzdCwgc28gZG8gbm90IG1ha2UKLSAgIC0tICBTaW1wbGVfR1ppcF9IZWFkZXInTGFzdCA8PSBGb290ZXJfQXJyYXknTGFzdC4KLQotICAgUmV0dXJuX0NvZGUgOiBjb25zdGFudCBhcnJheSAoVGhpbi5JbnQgcmFuZ2UgPD4pIG9mIFJldHVybl9Db2RlX0VudW0KLSAgICAgOj0gKDAgPT4gT0ssCi0gICAgICAgICAxID0+IFNUUkVBTV9FTkQsCi0gICAgICAgICAyID0+IE5FRURfRElDVCwKLSAgICAgICAgLTEgPT4gRVJSTk8sCi0gICAgICAgIC0yID0+IFNUUkVBTV9FUlJPUiwKLSAgICAgICAgLTMgPT4gREFUQV9FUlJPUiwKLSAgICAgICAgLTQgPT4gTUVNX0VSUk9SLAotICAgICAgICAtNSA9PiBCVUZfRVJST1IsCi0gICAgICAgIC02ID0+IFZFUlNJT05fRVJST1IpOwotCi0gICBGbGF0ZSA6IGNvbnN0YW50IGFycmF5IChCb29sZWFuKSBvZiBGbGF0ZV9UeXBlCi0gICAgIDo9IChUcnVlICA9PiAoU3RlcCA9PiBUaGluLkRlZmxhdGUnQWNjZXNzLAotICAgICAgICAgICAgICAgICAgIERvbmUgPT4gVGhpbi5EZWZsYXRlRW5kJ0FjY2VzcyksCi0gICAgICAgICBGYWxzZSA9PiAoU3RlcCA9PiBUaGluLkluZmxhdGUnQWNjZXNzLAotICAgICAgICAgICAgICAgICAgIERvbmUgPT4gVGhpbi5JbmZsYXRlRW5kJ0FjY2VzcykpOwotCi0gICBGbHVzaF9GaW5pc2ggOiBjb25zdGFudCBhcnJheSAoQm9vbGVhbikgb2YgRmx1c2hfTW9kZQotICAgICA6PSAoVHJ1ZSA9PiBGaW5pc2gsIEZhbHNlID0+IE5vX0ZsdXNoKTsKLQotICAgcHJvY2VkdXJlIFJhaXNlX0Vycm9yIChTdHJlYW0gOiBpbiBaX1N0cmVhbSk7Ci0gICBwcmFnbWEgSW5saW5lIChSYWlzZV9FcnJvcik7Ci0KLSAgIHByb2NlZHVyZSBSYWlzZV9FcnJvciAoTWVzc2FnZSA6IGluIFN0cmluZyk7Ci0gICBwcmFnbWEgSW5saW5lIChSYWlzZV9FcnJvcik7Ci0KLSAgIHByb2NlZHVyZSBDaGVja19FcnJvciAoU3RyZWFtIDogaW4gWl9TdHJlYW07IENvZGUgOiBpbiBUaGluLkludCk7Ci0KLSAgIHByb2NlZHVyZSBGcmVlIGlzIG5ldyBBZGEuVW5jaGVja2VkX0RlYWxsb2NhdGlvbgotICAgICAgKFpfU3RyZWFtLCBaX1N0cmVhbV9BY2Nlc3MpOwotCi0gICBmdW5jdGlvbiBUb19UaGluX0FjY2VzcyBpcyBuZXcgQWRhLlVuY2hlY2tlZF9Db252ZXJzaW9uCi0gICAgIChaX1N0cmVhbV9BY2Nlc3MsIFRoaW4uWl9TdHJlYW1wKTsKLQotICAgcHJvY2VkdXJlIFRyYW5zbGF0ZV9HWmlwCi0gICAgIChGaWx0ZXIgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBJbl9EYXRhICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBJbl9MYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgT3V0X0RhdGEgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgT3V0X0xhc3QgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIEZsdXNoICAgICA6IGluICAgICBGbHVzaF9Nb2RlKTsKLSAgIC0tICBTZXBhcmF0ZSB0cmFuc2xhdGUgcm91dGluZSBmb3IgbWFrZSBnemlwIGhlYWRlci4KLQotICAgcHJvY2VkdXJlIFRyYW5zbGF0ZV9BdXRvCi0gICAgIChGaWx0ZXIgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBJbl9EYXRhICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBJbl9MYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgT3V0X0RhdGEgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgT3V0X0xhc3QgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIEZsdXNoICAgICA6IGluICAgICBGbHVzaF9Nb2RlKTsKLSAgIC0tICB0cmFuc2xhdGUgcm91dGluZSB3aXRob3V0IGFkZGl0aW9uYWwgaGVhZGVycy4KLQotICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIENoZWNrX0Vycm9yIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgQ2hlY2tfRXJyb3IgKFN0cmVhbSA6IGluIFpfU3RyZWFtOyBDb2RlIDogaW4gVGhpbi5JbnQpIGlzCi0gICAgICB1c2UgdHlwZSBUaGluLkludDsKLSAgIGJlZ2luCi0gICAgICBpZiBDb2RlIC89IFRoaW4uWl9PSyB0aGVuCi0gICAgICAgICBSYWlzZV9FcnJvcgotICAgICAgICAgICAgKFJldHVybl9Db2RlX0VudW0nSW1hZ2UgKFJldHVybl9Db2RlIChDb2RlKSkKLSAgICAgICAgICAgICAgJiAiOiAiICYgTGFzdF9FcnJvcl9NZXNzYWdlIChTdHJlYW0pKTsKLSAgICAgIGVuZCBpZjsKLSAgIGVuZCBDaGVja19FcnJvcjsKLQotICAgLS0tLS0tLS0tLS0KLSAgIC0tIENsb3NlIC0tCi0gICAtLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgQ2xvc2UKLSAgICAgKEZpbHRlciAgICAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgIElnbm9yZV9FcnJvciA6IGluICAgICBCb29sZWFuIDo9IEZhbHNlKQotICAgaXMKLSAgICAgIENvZGUgOiBUaGluLkludDsKLSAgIGJlZ2luCi0gICAgICBpZiBub3QgSWdub3JlX0Vycm9yIGFuZCB0aGVuIG5vdCBJc19PcGVuIChGaWx0ZXIpIHRoZW4KLSAgICAgICAgIHJhaXNlIFN0YXR1c19FcnJvcjsKLSAgICAgIGVuZCBpZjsKLQotICAgICAgQ29kZSA6PSBGbGF0ZSAoRmlsdGVyLkNvbXByZXNzaW9uKS5Eb25lIChUb19UaGluX0FjY2VzcyAoRmlsdGVyLlN0cm0pKTsKLQotICAgICAgaWYgSWdub3JlX0Vycm9yIG9yIGVsc2UgQ29kZSA9IFRoaW4uWl9PSyB0aGVuCi0gICAgICAgICBGcmVlIChGaWx0ZXIuU3RybSk7Ci0gICAgICBlbHNlCi0gICAgICAgICBkZWNsYXJlCi0gICAgICAgICAgICBFcnJvcl9NZXNzYWdlIDogY29uc3RhbnQgU3RyaW5nCi0gICAgICAgICAgICAgIDo9IExhc3RfRXJyb3JfTWVzc2FnZSAoRmlsdGVyLlN0cm0uYWxsKTsKLSAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICBGcmVlIChGaWx0ZXIuU3RybSk7Ci0gICAgICAgICAgICBBZGEuRXhjZXB0aW9ucy5SYWlzZV9FeGNlcHRpb24KLSAgICAgICAgICAgICAgIChaTGliX0Vycm9yJ0lkZW50aXR5LAotICAgICAgICAgICAgICAgIFJldHVybl9Db2RlX0VudW0nSW1hZ2UgKFJldHVybl9Db2RlIChDb2RlKSkKLSAgICAgICAgICAgICAgICAgICYgIjogIiAmIEVycm9yX01lc3NhZ2UpOwotICAgICAgICAgZW5kOwotICAgICAgZW5kIGlmOwotICAgZW5kIENsb3NlOwotCi0gICAtLS0tLS0tLS0tLQotICAgLS0gQ1JDMzIgLS0KLSAgIC0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIENSQzMyCi0gICAgIChDUkMgIDogaW4gVW5zaWduZWRfMzI7Ci0gICAgICBEYXRhIDogaW4gQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpCi0gICAgICByZXR1cm4gVW5zaWduZWRfMzIKLSAgIGlzCi0gICAgICB1c2UgVGhpbjsKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gVW5zaWduZWRfMzIgKGNyYzMyIChVTG9uZyAoQ1JDKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEnQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEnTGVuZ3RoKSk7Ci0gICBlbmQgQ1JDMzI7Ci0KLSAgIHByb2NlZHVyZSBDUkMzMgotICAgICAoQ1JDICA6IGluIG91dCBVbnNpZ25lZF8zMjsKLSAgICAgIERhdGEgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpIGlzCi0gICBiZWdpbgotICAgICAgQ1JDIDo9IENSQzMyIChDUkMsIERhdGEpOwotICAgZW5kIENSQzMyOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIERlZmxhdGVfSW5pdCAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBEZWZsYXRlX0luaXQKLSAgICAgKEZpbHRlciAgICAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgIExldmVsICAgICAgICA6IGluICAgICBDb21wcmVzc2lvbl9MZXZlbCAgOj0gRGVmYXVsdF9Db21wcmVzc2lvbjsKLSAgICAgIFN0cmF0ZWd5ICAgICA6IGluICAgICBTdHJhdGVneV9UeXBlICAgICAgOj0gRGVmYXVsdF9TdHJhdGVneTsKLSAgICAgIE1ldGhvZCAgICAgICA6IGluICAgICBDb21wcmVzc2lvbl9NZXRob2QgOj0gRGVmbGF0ZWQ7Ci0gICAgICBXaW5kb3dfQml0cyAgOiBpbiAgICAgV2luZG93X0JpdHNfVHlwZSAgIDo9IERlZmF1bHRfV2luZG93X0JpdHM7Ci0gICAgICBNZW1vcnlfTGV2ZWwgOiBpbiAgICAgTWVtb3J5X0xldmVsX1R5cGUgIDo9IERlZmF1bHRfTWVtb3J5X0xldmVsOwotICAgICAgSGVhZGVyICAgICAgIDogaW4gICAgIEhlYWRlcl9UeXBlICAgICAgICA6PSBEZWZhdWx0KQotICAgaXMKLSAgICAgIHVzZSB0eXBlIFRoaW4uSW50OwotICAgICAgV2luX0JpdHMgOiBUaGluLkludCA6PSBUaGluLkludCAoV2luZG93X0JpdHMpOwotICAgYmVnaW4KLSAgICAgIGlmIElzX09wZW4gKEZpbHRlcikgdGhlbgotICAgICAgICAgcmFpc2UgU3RhdHVzX0Vycm9yOwotICAgICAgZW5kIGlmOwotCi0gICAgICAtLSAgV2UgYWxsb3cgWkxpYiB0byBtYWtlIGhlYWRlciBvbmx5IGluIGNhc2Ugb2YgZGVmYXVsdCBoZWFkZXIgdHlwZS4KLSAgICAgIC0tICBPdGhlcndpc2Ugd2Ugd291bGQgZWl0aGVyIGRvIGhlYWRlciBieSBvdXJzZWxmcywgb3IgZG8gbm90IGRvCi0gICAgICAtLSAgaGVhZGVyIGF0IGFsbC4KLQotICAgICAgaWYgSGVhZGVyID0gTm9uZSBvciBlbHNlIEhlYWRlciA9IEdaaXAgdGhlbgotICAgICAgICAgV2luX0JpdHMgOj0gLVdpbl9CaXRzOwotICAgICAgZW5kIGlmOwotCi0gICAgICAtLSAgRm9yIHRoZSBHWmlwIENSQyBjYWxjdWxhdGlvbiBhbmQgbWFrZSBoZWFkZXJzLgotCi0gICAgICBpZiBIZWFkZXIgPSBHWmlwIHRoZW4KLSAgICAgICAgIEZpbHRlci5DUkMgICAgOj0gMDsKLSAgICAgICAgIEZpbHRlci5PZmZzZXQgOj0gU2ltcGxlX0daaXBfSGVhZGVyJ0ZpcnN0OwotICAgICAgZWxzZQotICAgICAgICAgRmlsdGVyLk9mZnNldCA6PSBTaW1wbGVfR1ppcF9IZWFkZXInTGFzdCArIDE7Ci0gICAgICBlbmQgaWY7Ci0KLSAgICAgIEZpbHRlci5TdHJtICAgICAgICA6PSBuZXcgWl9TdHJlYW07Ci0gICAgICBGaWx0ZXIuQ29tcHJlc3Npb24gOj0gVHJ1ZTsKLSAgICAgIEZpbHRlci5TdHJlYW1fRW5kICA6PSBGYWxzZTsKLSAgICAgIEZpbHRlci5IZWFkZXIgICAgICA6PSBIZWFkZXI7Ci0KLSAgICAgIGlmIFRoaW4uRGVmbGF0ZV9Jbml0Ci0gICAgICAgICAgIChUb19UaGluX0FjY2VzcyAoRmlsdGVyLlN0cm0pLAotICAgICAgICAgICAgTGV2ZWwgICAgICA9PiBUaGluLkludCAoTGV2ZWwpLAotICAgICAgICAgICAgbWV0aG9kICAgICA9PiBUaGluLkludCAoTWV0aG9kKSwKLSAgICAgICAgICAgIHdpbmRvd0JpdHMgPT4gV2luX0JpdHMsCi0gICAgICAgICAgICBtZW1MZXZlbCAgID0+IFRoaW4uSW50IChNZW1vcnlfTGV2ZWwpLAotICAgICAgICAgICAgc3RyYXRlZ3kgICA9PiBUaGluLkludCAoU3RyYXRlZ3kpKSAvPSBUaGluLlpfT0sKLSAgICAgIHRoZW4KLSAgICAgICAgIFJhaXNlX0Vycm9yIChGaWx0ZXIuU3RybS5hbGwpOwotICAgICAgZW5kIGlmOwotICAgZW5kIERlZmxhdGVfSW5pdDsKLQotICAgLS0tLS0tLS0tLS0KLSAgIC0tIEZsdXNoIC0tCi0gICAtLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgRmx1c2gKLSAgICAgKEZpbHRlciAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSkKLSAgIGlzCi0gICAgICBOb19EYXRhIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgOj0gKDEgLi4gMCA9PiAwKTsKLSAgICAgIExhc3QgICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICBiZWdpbgotICAgICAgVHJhbnNsYXRlIChGaWx0ZXIsIE5vX0RhdGEsIExhc3QsIE91dF9EYXRhLCBPdXRfTGFzdCwgRmx1c2gpOwotICAgZW5kIEZsdXNoOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gR2VuZXJpY19UcmFuc2xhdGUgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBHZW5lcmljX1RyYW5zbGF0ZQotICAgICAoRmlsdGVyICAgICAgICAgIDogaW4gb3V0IFpMaWIuRmlsdGVyX1R5cGU7Ci0gICAgICBJbl9CdWZmZXJfU2l6ZSAgOiBpbiAgICAgSW50ZWdlciA6PSBEZWZhdWx0X0J1ZmZlcl9TaXplOwotICAgICAgT3V0X0J1ZmZlcl9TaXplIDogaW4gICAgIEludGVnZXIgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZSkKLSAgIGlzCi0gICAgICBJbl9CdWZmZXIgIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICgxIC4uIFN0cmVhbV9FbGVtZW50X09mZnNldCAoSW5fQnVmZmVyX1NpemUpKTsKLSAgICAgIE91dF9CdWZmZXIgOiBTdHJlYW1fRWxlbWVudF9BcnJheQotICAgICAgICAgICAgICAgICAgICAgKDEgLi4gU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IChPdXRfQnVmZmVyX1NpemUpKTsKLSAgICAgIExhc3QgICAgICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBJbl9MYXN0ICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgSW5fRmlyc3QgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIE91dF9MYXN0ICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICBiZWdpbgotICAgICAgTWFpbiA6IGxvb3AKLSAgICAgICAgIERhdGFfSW4gKEluX0J1ZmZlciwgTGFzdCk7Ci0KLSAgICAgICAgIEluX0ZpcnN0IDo9IEluX0J1ZmZlcidGaXJzdDsKLQotICAgICAgICAgbG9vcAotICAgICAgICAgICAgVHJhbnNsYXRlCi0gICAgICAgICAgICAgIChGaWx0ZXIgICA9PiBGaWx0ZXIsCi0gICAgICAgICAgICAgICBJbl9EYXRhICA9PiBJbl9CdWZmZXIgKEluX0ZpcnN0IC4uIExhc3QpLAotICAgICAgICAgICAgICAgSW5fTGFzdCAgPT4gSW5fTGFzdCwKLSAgICAgICAgICAgICAgIE91dF9EYXRhID0+IE91dF9CdWZmZXIsCi0gICAgICAgICAgICAgICBPdXRfTGFzdCA9PiBPdXRfTGFzdCwKLSAgICAgICAgICAgICAgIEZsdXNoICAgID0+IEZsdXNoX0ZpbmlzaCAoTGFzdCA8IEluX0J1ZmZlcidGaXJzdCkpOwotCi0gICAgICAgICAgICBpZiBPdXRfQnVmZmVyJ0ZpcnN0IDw9IE91dF9MYXN0IHRoZW4KLSAgICAgICAgICAgICAgIERhdGFfT3V0IChPdXRfQnVmZmVyIChPdXRfQnVmZmVyJ0ZpcnN0IC4uIE91dF9MYXN0KSk7Ci0gICAgICAgICAgICBlbmQgaWY7Ci0KLSAgICAgICAgICAgIGV4aXQgTWFpbiB3aGVuIFN0cmVhbV9FbmQgKEZpbHRlcik7Ci0KLSAgICAgICAgICAgIC0tICBUaGUgZW5kIG9mIGluIGJ1ZmZlci4KLQotICAgICAgICAgICAgZXhpdCB3aGVuIEluX0xhc3QgPSBMYXN0OwotCi0gICAgICAgICAgICBJbl9GaXJzdCA6PSBJbl9MYXN0ICsgMTsKLSAgICAgICAgIGVuZCBsb29wOwotICAgICAgZW5kIGxvb3AgTWFpbjsKLQotICAgZW5kIEdlbmVyaWNfVHJhbnNsYXRlOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIEluZmxhdGVfSW5pdCAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBJbmZsYXRlX0luaXQKLSAgICAgKEZpbHRlciAgICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgV2luZG93X0JpdHMgOiBpbiAgICAgV2luZG93X0JpdHNfVHlwZSA6PSBEZWZhdWx0X1dpbmRvd19CaXRzOwotICAgICAgSGVhZGVyICAgICAgOiBpbiAgICAgSGVhZGVyX1R5cGUgICAgICA6PSBEZWZhdWx0KQotICAgaXMKLSAgICAgIHVzZSB0eXBlIFRoaW4uSW50OwotICAgICAgV2luX0JpdHMgOiBUaGluLkludCA6PSBUaGluLkludCAoV2luZG93X0JpdHMpOwotCi0gICAgICBwcm9jZWR1cmUgQ2hlY2tfVmVyc2lvbjsKLSAgICAgIC0tICBDaGVjayB0aGUgbGF0ZXN0IGhlYWRlciB0eXBlcyBjb21wYXRpYmlsaXR5LgotCi0gICAgICBwcm9jZWR1cmUgQ2hlY2tfVmVyc2lvbiBpcwotICAgICAgYmVnaW4KLSAgICAgICAgIGlmIFZlcnNpb24gPD0gIjEuMS40IiB0aGVuCi0gICAgICAgICAgICBSYWlzZV9FcnJvcgotICAgICAgICAgICAgICAoIkluZmxhdGUgaGVhZGVyIHR5cGUgIiAmIEhlYWRlcl9UeXBlJ0ltYWdlIChIZWFkZXIpCi0gICAgICAgICAgICAgICAmICIgaW5jb21wYXRpYmxlIHdpdGggWkxpYiB2ZXJzaW9uICIgJiBWZXJzaW9uKTsKLSAgICAgICAgIGVuZCBpZjsKLSAgICAgIGVuZCBDaGVja19WZXJzaW9uOwotCi0gICBiZWdpbgotICAgICAgaWYgSXNfT3BlbiAoRmlsdGVyKSB0aGVuCi0gICAgICAgICByYWlzZSBTdGF0dXNfRXJyb3I7Ci0gICAgICBlbmQgaWY7Ci0KLSAgICAgIGNhc2UgSGVhZGVyIGlzCi0gICAgICAgICB3aGVuIE5vbmUgPT4KLSAgICAgICAgICAgIENoZWNrX1ZlcnNpb247Ci0KLSAgICAgICAgICAgIC0tICBJbmZsYXRlIGRhdGEgd2l0aG91dCBoZWFkZXJzIGRldGVybWluZWQKLSAgICAgICAgICAgIC0tICBieSBuZWdhdGl2ZSBXaW5fQml0cy4KLQotICAgICAgICAgICAgV2luX0JpdHMgOj0gLVdpbl9CaXRzOwotICAgICAgICAgd2hlbiBHWmlwID0+Ci0gICAgICAgICAgICBDaGVja19WZXJzaW9uOwotCi0gICAgICAgICAgICAtLSAgSW5mbGF0ZSBnemlwIGRhdGEgZGVmaW5lZCBieSBmbGFnIDE2LgotCi0gICAgICAgICAgICBXaW5fQml0cyA6PSBXaW5fQml0cyArIDE2OwotICAgICAgICAgd2hlbiBBdXRvID0+Ci0gICAgICAgICAgICBDaGVja19WZXJzaW9uOwotCi0gICAgICAgICAgICAtLSAgSW5mbGF0ZSB3aXRoIGF1dG9tYXRpYyBkZXRlY3Rpb24KLSAgICAgICAgICAgIC0tICBvZiBnemlwIG9yIG5hdGl2ZSBoZWFkZXIgZGVmaW5lZCBieSBmbGFnIDMyLgotCi0gICAgICAgICAgICBXaW5fQml0cyA6PSBXaW5fQml0cyArIDMyOwotICAgICAgICAgd2hlbiBEZWZhdWx0ID0+IG51bGw7Ci0gICAgICBlbmQgY2FzZTsKLQotICAgICAgRmlsdGVyLlN0cm0gICAgICAgIDo9IG5ldyBaX1N0cmVhbTsKLSAgICAgIEZpbHRlci5Db21wcmVzc2lvbiA6PSBGYWxzZTsKLSAgICAgIEZpbHRlci5TdHJlYW1fRW5kICA6PSBGYWxzZTsKLSAgICAgIEZpbHRlci5IZWFkZXIgICAgICA6PSBIZWFkZXI7Ci0KLSAgICAgIGlmIFRoaW4uSW5mbGF0ZV9Jbml0Ci0gICAgICAgICAoVG9fVGhpbl9BY2Nlc3MgKEZpbHRlci5TdHJtKSwgV2luX0JpdHMpIC89IFRoaW4uWl9PSwotICAgICAgdGhlbgotICAgICAgICAgUmFpc2VfRXJyb3IgKEZpbHRlci5TdHJtLmFsbCk7Ci0gICAgICBlbmQgaWY7Ci0gICBlbmQgSW5mbGF0ZV9Jbml0OwotCi0gICAtLS0tLS0tLS0tLS0tCi0gICAtLSBJc19PcGVuIC0tCi0gICAtLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIElzX09wZW4gKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQm9vbGVhbiBpcwotICAgYmVnaW4KLSAgICAgIHJldHVybiBGaWx0ZXIuU3RybSAvPSBudWxsOwotICAgZW5kIElzX09wZW47Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBSYWlzZV9FcnJvciAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFJhaXNlX0Vycm9yIChNZXNzYWdlIDogaW4gU3RyaW5nKSBpcwotICAgYmVnaW4KLSAgICAgIEFkYS5FeGNlcHRpb25zLlJhaXNlX0V4Y2VwdGlvbiAoWkxpYl9FcnJvcidJZGVudGl0eSwgTWVzc2FnZSk7Ci0gICBlbmQgUmFpc2VfRXJyb3I7Ci0KLSAgIHByb2NlZHVyZSBSYWlzZV9FcnJvciAoU3RyZWFtIDogaW4gWl9TdHJlYW0pIGlzCi0gICBiZWdpbgotICAgICAgUmFpc2VfRXJyb3IgKExhc3RfRXJyb3JfTWVzc2FnZSAoU3RyZWFtKSk7Ci0gICBlbmQgUmFpc2VfRXJyb3I7Ci0KLSAgIC0tLS0tLS0tLS0KLSAgIC0tIFJlYWQgLS0KLSAgIC0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFJlYWQKLSAgICAgKEZpbHRlciA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgIEl0ZW0gICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIExhc3QgICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBGbHVzaCAgOiBpbiAgICAgRmx1c2hfTW9kZSA6PSBOb19GbHVzaCkKLSAgIGlzCi0gICAgICBJbl9MYXN0ICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgSXRlbV9GaXJzdCA6IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldCA6PSBJdGVtJ0ZpcnN0OwotICAgICAgVl9GbHVzaCAgICA6IEZsdXNoX01vZGUgOj0gRmx1c2g7Ci0KLSAgIGJlZ2luCi0gICAgICBwcmFnbWEgQXNzZXJ0IChSZXN0X0ZpcnN0IGluIEJ1ZmZlcidGaXJzdCAuLiBCdWZmZXInTGFzdCArIDEpOwotICAgICAgcHJhZ21hIEFzc2VydCAoUmVzdF9MYXN0IGluIEJ1ZmZlcidGaXJzdCAtIDEgLi4gQnVmZmVyJ0xhc3QpOwotCi0gICAgICBsb29wCi0gICAgICAgICBpZiBSZXN0X0xhc3QgPSBCdWZmZXInRmlyc3QgLSAxIHRoZW4KLSAgICAgICAgICAgIFZfRmx1c2ggOj0gRmluaXNoOwotCi0gICAgICAgICBlbHNpZiBSZXN0X0ZpcnN0ID4gUmVzdF9MYXN0IHRoZW4KLSAgICAgICAgICAgIFJlYWQgKEJ1ZmZlciwgUmVzdF9MYXN0KTsKLSAgICAgICAgICAgIFJlc3RfRmlyc3QgOj0gQnVmZmVyJ0ZpcnN0OwotCi0gICAgICAgICAgICBpZiBSZXN0X0xhc3QgPCBCdWZmZXInRmlyc3QgdGhlbgotICAgICAgICAgICAgICAgVl9GbHVzaCA6PSBGaW5pc2g7Ci0gICAgICAgICAgICBlbmQgaWY7Ci0gICAgICAgICBlbmQgaWY7Ci0KLSAgICAgICAgIFRyYW5zbGF0ZQotICAgICAgICAgICAoRmlsdGVyICAgPT4gRmlsdGVyLAotICAgICAgICAgICAgSW5fRGF0YSAgPT4gQnVmZmVyIChSZXN0X0ZpcnN0IC4uIFJlc3RfTGFzdCksCi0gICAgICAgICAgICBJbl9MYXN0ICA9PiBJbl9MYXN0LAotICAgICAgICAgICAgT3V0X0RhdGEgPT4gSXRlbSAoSXRlbV9GaXJzdCAuLiBJdGVtJ0xhc3QpLAotICAgICAgICAgICAgT3V0X0xhc3QgPT4gTGFzdCwKLSAgICAgICAgICAgIEZsdXNoICAgID0+IFZfRmx1c2gpOwotCi0gICAgICAgICBSZXN0X0ZpcnN0IDo9IEluX0xhc3QgKyAxOwotCi0gICAgICAgICBleGl0IHdoZW4gU3RyZWFtX0VuZCAoRmlsdGVyKQotICAgICAgICAgICBvciBlbHNlIExhc3QgPSBJdGVtJ0xhc3QKLSAgICAgICAgICAgb3IgZWxzZSAoTGFzdCA+PSBJdGVtJ0ZpcnN0IGFuZCB0aGVuIEFsbG93X1JlYWRfU29tZSk7Ci0KLSAgICAgICAgIEl0ZW1fRmlyc3QgOj0gTGFzdCArIDE7Ci0gICAgICBlbmQgbG9vcDsKLSAgIGVuZCBSZWFkOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBTdHJlYW1fRW5kIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIFN0cmVhbV9FbmQgKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQm9vbGVhbiBpcwotICAgYmVnaW4KLSAgICAgIGlmIEZpbHRlci5IZWFkZXIgPSBHWmlwIGFuZCBGaWx0ZXIuQ29tcHJlc3Npb24gdGhlbgotICAgICAgICAgcmV0dXJuIEZpbHRlci5TdHJlYW1fRW5kCi0gICAgICAgICAgICBhbmQgdGhlbiBGaWx0ZXIuT2Zmc2V0ID0gRm9vdGVyX0FycmF5J0xhc3QgKyAxOwotICAgICAgZWxzZQotICAgICAgICAgcmV0dXJuIEZpbHRlci5TdHJlYW1fRW5kOwotICAgICAgZW5kIGlmOwotICAgZW5kIFN0cmVhbV9FbmQ7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tCi0gICAtLSBUb3RhbF9JbiAtLQotICAgLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gVG90YWxfSW4gKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQ291bnQgaXMKLSAgIGJlZ2luCi0gICAgICByZXR1cm4gQ291bnQgKFRoaW4uVG90YWxfSW4gKFRvX1RoaW5fQWNjZXNzIChGaWx0ZXIuU3RybSkuYWxsKSk7Ci0gICBlbmQgVG90YWxfSW47Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLQotICAgLS0gVG90YWxfT3V0IC0tCi0gICAtLS0tLS0tLS0tLS0tLS0KLQotICAgZnVuY3Rpb24gVG90YWxfT3V0IChGaWx0ZXIgOiBpbiBGaWx0ZXJfVHlwZSkgcmV0dXJuIENvdW50IGlzCi0gICBiZWdpbgotICAgICAgcmV0dXJuIENvdW50IChUaGluLlRvdGFsX091dCAoVG9fVGhpbl9BY2Nlc3MgKEZpbHRlci5TdHJtKS5hbGwpKTsKLSAgIGVuZCBUb3RhbF9PdXQ7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLQotICAgLS0gVHJhbnNsYXRlIC0tCi0gICAtLS0tLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFRyYW5zbGF0ZQotICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgSW5fRGF0YSAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgSW5fTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSkgaXMKLSAgIGJlZ2luCi0gICAgICBpZiBGaWx0ZXIuSGVhZGVyID0gR1ppcCBhbmQgdGhlbiBGaWx0ZXIuQ29tcHJlc3Npb24gdGhlbgotICAgICAgICAgVHJhbnNsYXRlX0daaXAKLSAgICAgICAgICAgKEZpbHRlciAgID0+IEZpbHRlciwKLSAgICAgICAgICAgIEluX0RhdGEgID0+IEluX0RhdGEsCi0gICAgICAgICAgICBJbl9MYXN0ICA9PiBJbl9MYXN0LAotICAgICAgICAgICAgT3V0X0RhdGEgPT4gT3V0X0RhdGEsCi0gICAgICAgICAgICBPdXRfTGFzdCA9PiBPdXRfTGFzdCwKLSAgICAgICAgICAgIEZsdXNoICAgID0+IEZsdXNoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgIFRyYW5zbGF0ZV9BdXRvCi0gICAgICAgICAgIChGaWx0ZXIgICA9PiBGaWx0ZXIsCi0gICAgICAgICAgICBJbl9EYXRhICA9PiBJbl9EYXRhLAotICAgICAgICAgICAgSW5fTGFzdCAgPT4gSW5fTGFzdCwKLSAgICAgICAgICAgIE91dF9EYXRhID0+IE91dF9EYXRhLAotICAgICAgICAgICAgT3V0X0xhc3QgPT4gT3V0X0xhc3QsCi0gICAgICAgICAgICBGbHVzaCAgICA9PiBGbHVzaCk7Ci0gICAgICBlbmQgaWY7Ci0gICBlbmQgVHJhbnNsYXRlOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gVHJhbnNsYXRlX0F1dG8gLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBUcmFuc2xhdGVfQXV0bwotICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgSW5fRGF0YSAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgSW5fTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSkKLSAgIGlzCi0gICAgICB1c2UgdHlwZSBUaGluLkludDsKLSAgICAgIENvZGUgOiBUaGluLkludDsKLQotICAgYmVnaW4KLSAgICAgIGlmIG5vdCBJc19PcGVuIChGaWx0ZXIpIHRoZW4KLSAgICAgICAgIHJhaXNlIFN0YXR1c19FcnJvcjsKLSAgICAgIGVuZCBpZjsKLQotICAgICAgaWYgT3V0X0RhdGEnTGVuZ3RoID0gMCBhbmQgdGhlbiBJbl9EYXRhJ0xlbmd0aCA9IDAgdGhlbgotICAgICAgICAgcmFpc2UgQ29uc3RyYWludF9FcnJvcjsKLSAgICAgIGVuZCBpZjsKLQotICAgICAgU2V0X091dCAoRmlsdGVyLlN0cm0uYWxsLCBPdXRfRGF0YSdBZGRyZXNzLCBPdXRfRGF0YSdMZW5ndGgpOwotICAgICAgU2V0X0luICAoRmlsdGVyLlN0cm0uYWxsLCBJbl9EYXRhJ0FkZHJlc3MsIEluX0RhdGEnTGVuZ3RoKTsKLQotICAgICAgQ29kZSA6PSBGbGF0ZSAoRmlsdGVyLkNvbXByZXNzaW9uKS5TdGVwCi0gICAgICAgIChUb19UaGluX0FjY2VzcyAoRmlsdGVyLlN0cm0pLAotICAgICAgICAgVGhpbi5JbnQgKEZsdXNoKSk7Ci0KLSAgICAgIGlmIENvZGUgPSBUaGluLlpfU1RSRUFNX0VORCB0aGVuCi0gICAgICAgICBGaWx0ZXIuU3RyZWFtX0VuZCA6PSBUcnVlOwotICAgICAgZWxzZQotICAgICAgICAgQ2hlY2tfRXJyb3IgKEZpbHRlci5TdHJtLmFsbCwgQ29kZSk7Ci0gICAgICBlbmQgaWY7Ci0KLSAgICAgIEluX0xhc3QgIDo9IEluX0RhdGEnTGFzdAotICAgICAgICAgLSBTdHJlYW1fRWxlbWVudF9PZmZzZXQgKEF2YWlsX0luIChGaWx0ZXIuU3RybS5hbGwpKTsKLSAgICAgIE91dF9MYXN0IDo9IE91dF9EYXRhJ0xhc3QKLSAgICAgICAgIC0gU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IChBdmFpbF9PdXQgKEZpbHRlci5TdHJtLmFsbCkpOwotICAgZW5kIFRyYW5zbGF0ZV9BdXRvOwotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLS0gVHJhbnNsYXRlX0daaXAgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHByb2NlZHVyZSBUcmFuc2xhdGVfR1ppcAotICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgSW5fRGF0YSAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgSW5fTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSkKLSAgIGlzCi0gICAgICBPdXRfRmlyc3QgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0KLSAgICAgIHByb2NlZHVyZSBBZGRfRGF0YSAoRGF0YSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KTsKLSAgICAgIC0tICBBZGQgZGF0YSB0byBzdHJlYW0gZnJvbSB0aGUgRmlsdGVyLk9mZnNldCB0aWxsIG5lY2Vzc2FyeSwKLSAgICAgIC0tICB1c2VkIGZvciBhZGQgZ3ppcCBoZWFkci9mb290ZXIuCi0KLSAgICAgIHByb2NlZHVyZSBQdXRfMzIKLSAgICAgICAgKEl0ZW0gOiBpbiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICAgICBEYXRhIDogaW4gICAgIFVuc2lnbmVkXzMyKTsKLSAgICAgIHByYWdtYSBJbmxpbmUgKFB1dF8zMik7Ci0KLSAgICAgIC0tLS0tLS0tLS0tLS0tCi0gICAgICAtLSBBZGRfRGF0YSAtLQotICAgICAgLS0tLS0tLS0tLS0tLS0KLQotICAgICAgcHJvY2VkdXJlIEFkZF9EYXRhIChEYXRhIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpIGlzCi0gICAgICAgICBEYXRhX0ZpcnN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IHJlbmFtZXMgRmlsdGVyLk9mZnNldDsKLSAgICAgICAgIERhdGFfTGFzdCAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICAgICBEYXRhX0xlbiAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OyAtLSAgLTEKLSAgICAgICAgIE91dF9MZW4gICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7IC0tICAtMQotICAgICAgYmVnaW4KLSAgICAgICAgIE91dF9GaXJzdCA6PSBPdXRfTGFzdCArIDE7Ci0KLSAgICAgICAgIGlmIERhdGFfRmlyc3QgPiBEYXRhJ0xhc3QgdGhlbgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgZW5kIGlmOwotCi0gICAgICAgICBEYXRhX0xlbiAgOj0gRGF0YSdMYXN0ICAgICAtIERhdGFfRmlyc3Q7Ci0gICAgICAgICBPdXRfTGVuICAgOj0gT3V0X0RhdGEnTGFzdCAtIE91dF9GaXJzdDsKLQotICAgICAgICAgaWYgRGF0YV9MZW4gPD0gT3V0X0xlbiB0aGVuCi0gICAgICAgICAgICBPdXRfTGFzdCAgOj0gT3V0X0ZpcnN0ICArIERhdGFfTGVuOwotICAgICAgICAgICAgRGF0YV9MYXN0IDo9IERhdGEnTGFzdDsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIE91dF9MYXN0ICA6PSBPdXRfRGF0YSdMYXN0OwotICAgICAgICAgICAgRGF0YV9MYXN0IDo9IERhdGFfRmlyc3QgKyBPdXRfTGVuOwotICAgICAgICAgZW5kIGlmOwotCi0gICAgICAgICBPdXRfRGF0YSAoT3V0X0ZpcnN0IC4uIE91dF9MYXN0KSA6PSBEYXRhIChEYXRhX0ZpcnN0IC4uIERhdGFfTGFzdCk7Ci0KLSAgICAgICAgIERhdGFfRmlyc3QgOj0gRGF0YV9MYXN0ICsgMTsKLSAgICAgICAgIE91dF9GaXJzdCAgOj0gT3V0X0xhc3QgKyAxOwotICAgICAgZW5kIEFkZF9EYXRhOwotCi0gICAgICAtLS0tLS0tLS0tLS0KLSAgICAgIC0tIFB1dF8zMiAtLQotICAgICAgLS0tLS0tLS0tLS0tCi0KLSAgICAgIHByb2NlZHVyZSBQdXRfMzIKLSAgICAgICAgKEl0ZW0gOiBpbiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICAgICBEYXRhIDogaW4gICAgIFVuc2lnbmVkXzMyKQotICAgICAgaXMKLSAgICAgICAgIEQgOiBVbnNpZ25lZF8zMiA6PSBEYXRhOwotICAgICAgYmVnaW4KLSAgICAgICAgIGZvciBKIGluIEl0ZW0nRmlyc3QgLi4gSXRlbSdGaXJzdCArIDMgbG9vcAotICAgICAgICAgICAgSXRlbSAoSikgOj0gU3RyZWFtX0VsZW1lbnQgKEQgYW5kIDE2I0ZGIyk7Ci0gICAgICAgICAgICBEIDo9IFNoaWZ0X1JpZ2h0IChELCA4KTsKLSAgICAgICAgIGVuZCBsb29wOwotICAgICAgZW5kIFB1dF8zMjsKLQotICAgYmVnaW4KLSAgICAgIE91dF9MYXN0IDo9IE91dF9EYXRhJ0ZpcnN0IC0gMTsKLQotICAgICAgaWYgbm90IEZpbHRlci5TdHJlYW1fRW5kIHRoZW4KLSAgICAgICAgIEFkZF9EYXRhIChTaW1wbGVfR1ppcF9IZWFkZXIpOwotCi0gICAgICAgICBUcmFuc2xhdGVfQXV0bwotICAgICAgICAgICAoRmlsdGVyICAgPT4gRmlsdGVyLAotICAgICAgICAgICAgSW5fRGF0YSAgPT4gSW5fRGF0YSwKLSAgICAgICAgICAgIEluX0xhc3QgID0+IEluX0xhc3QsCi0gICAgICAgICAgICBPdXRfRGF0YSA9PiBPdXRfRGF0YSAoT3V0X0ZpcnN0IC4uIE91dF9EYXRhJ0xhc3QpLAotICAgICAgICAgICAgT3V0X0xhc3QgPT4gT3V0X0xhc3QsCi0gICAgICAgICAgICBGbHVzaCAgICA9PiBGbHVzaCk7Ci0KLSAgICAgICAgIENSQzMyIChGaWx0ZXIuQ1JDLCBJbl9EYXRhIChJbl9EYXRhJ0ZpcnN0IC4uIEluX0xhc3QpKTsKLSAgICAgIGVuZCBpZjsKLQotICAgICAgaWYgRmlsdGVyLlN0cmVhbV9FbmQgYW5kIHRoZW4gT3V0X0xhc3QgPD0gT3V0X0RhdGEnTGFzdCB0aGVuCi0gICAgICAgICAtLSAgVGhpcyBkZXRlY3Rpb24gbWV0aG9kIHdvdWxkIHdvcmsgb25seSB3aGVuCi0gICAgICAgICAtLSAgU2ltcGxlX0daaXBfSGVhZGVyJ0xhc3QgPiBGb290ZXJfQXJyYXknTGFzdAotCi0gICAgICAgICBpZiBGaWx0ZXIuT2Zmc2V0ID0gU2ltcGxlX0daaXBfSGVhZGVyJ0xhc3QgKyAxIHRoZW4KLSAgICAgICAgICAgIEZpbHRlci5PZmZzZXQgOj0gRm9vdGVyX0FycmF5J0ZpcnN0OwotICAgICAgICAgZW5kIGlmOwotCi0gICAgICAgICBkZWNsYXJlCi0gICAgICAgICAgICBGb290ZXIgOiBGb290ZXJfQXJyYXk7Ci0gICAgICAgICBiZWdpbgotICAgICAgICAgICAgUHV0XzMyIChGb290ZXIsIEZpbHRlci5DUkMpOwotICAgICAgICAgICAgUHV0XzMyIChGb290ZXIgKEZvb3RlcidGaXJzdCArIDQgLi4gRm9vdGVyJ0xhc3QpLAotICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZF8zMiAoVG90YWxfSW4gKEZpbHRlcikpKTsKLSAgICAgICAgICAgIEFkZF9EYXRhIChGb290ZXIpOwotICAgICAgICAgZW5kOwotICAgICAgZW5kIGlmOwotICAgZW5kIFRyYW5zbGF0ZV9HWmlwOwotCi0gICAtLS0tLS0tLS0tLS0tCi0gICAtLSBWZXJzaW9uIC0tCi0gICAtLS0tLS0tLS0tLS0tCi0KLSAgIGZ1bmN0aW9uIFZlcnNpb24gcmV0dXJuIFN0cmluZyBpcwotICAgYmVnaW4KLSAgICAgIHJldHVybiBJbnRlcmZhY2VzLkMuU3RyaW5ncy5WYWx1ZSAoVGhpbi56bGliVmVyc2lvbik7Ci0gICBlbmQgVmVyc2lvbjsKLQotICAgLS0tLS0tLS0tLS0KLSAgIC0tIFdyaXRlIC0tCi0gICAtLS0tLS0tLS0tLQotCi0gICBwcm9jZWR1cmUgV3JpdGUKLSAgICAgKEZpbHRlciA6IGluIG91dCBGaWx0ZXJfVHlwZTsKLSAgICAgIEl0ZW0gICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIEZsdXNoICA6IGluICAgICBGbHVzaF9Nb2RlIDo9IE5vX0ZsdXNoKQotICAgaXMKLSAgICAgIEJ1ZmZlciAgIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gQnVmZmVyX1NpemUpOwotICAgICAgSW5fTGFzdCAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBPdXRfTGFzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIEluX0ZpcnN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IEl0ZW0nRmlyc3Q7Ci0gICBiZWdpbgotICAgICAgaWYgSXRlbSdMZW5ndGggPSAwIGFuZCBGbHVzaCA9IE5vX0ZsdXNoIHRoZW4KLSAgICAgICAgIHJldHVybjsKLSAgICAgIGVuZCBpZjsKLQotICAgICAgbG9vcAotICAgICAgICAgVHJhbnNsYXRlCi0gICAgICAgICAgIChGaWx0ZXIgICA9PiBGaWx0ZXIsCi0gICAgICAgICAgICBJbl9EYXRhICA9PiBJdGVtIChJbl9GaXJzdCAuLiBJdGVtJ0xhc3QpLAotICAgICAgICAgICAgSW5fTGFzdCAgPT4gSW5fTGFzdCwKLSAgICAgICAgICAgIE91dF9EYXRhID0+IEJ1ZmZlciwKLSAgICAgICAgICAgIE91dF9MYXN0ID0+IE91dF9MYXN0LAotICAgICAgICAgICAgRmx1c2ggICAgPT4gRmx1c2gpOwotCi0gICAgICAgICBpZiBPdXRfTGFzdCA+PSBCdWZmZXInRmlyc3QgdGhlbgotICAgICAgICAgICAgV3JpdGUgKEJ1ZmZlciAoMSAuLiBPdXRfTGFzdCkpOwotICAgICAgICAgZW5kIGlmOwotCi0gICAgICAgICBleGl0IHdoZW4gSW5fTGFzdCA9IEl0ZW0nTGFzdCBvciBTdHJlYW1fRW5kIChGaWx0ZXIpOwotCi0gICAgICAgICBJbl9GaXJzdCA6PSBJbl9MYXN0ICsgMTsKLSAgICAgIGVuZCBsb29wOwotICAgZW5kIFdyaXRlOwotCi1lbmQgWkxpYjsKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2FkYS96bGliLmFkcyBiL2xpYnMvemxpYi9jb250cmliL2FkYS96bGliLmFkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmZmM0MC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9hZGEvemxpYi5hZHMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLSAgICAgICAgICAgICAgICAgICAgICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IERtaXRyaXkgQW5pc2lta292ICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAtLQotLS0gIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgIC0tCi0tLSAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0ICAgLS0KLS0tICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCAgICAgLS0KLS0tICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgICAtLQotLS0gIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VICAgICAgIC0tCi0tLSAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgIC0tCi0tLSAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgLS0KLS0tICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAtLQotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLSAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgb3RoZXIgZmlsZXMgaW5zdGFudGlhdGUgZ2VuZXJpY3MgZnJvbSB0aGlzICAgLS0KLS0tICB1bml0LCBvciB5b3UgbGluayB0aGlzIHVuaXQgd2l0aCBvdGhlciBmaWxlcyB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsICAtLQotLS0gIHRoaXMgIHVuaXQgIGRvZXMgbm90ICBieSBpdHNlbGYgY2F1c2UgIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSAgIC0tCi0tLSAgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90ICAgICAgLS0KLS0tICBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5IHRoZSBleGVjdXRhYmxlIGZpbGUgIG1pZ2h0IGJlICAtLQotLS0gIGNvdmVyZWQgYnkgdGhlICBHTlUgUHVibGljIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0gICRJZDogemxpYi5hZHMsdiAxLjI2IDIwMDQvMDkvMDYgMDY6NTM6MTkgdmFndWwgRXhwICQKLQotd2l0aCBBZGEuU3RyZWFtczsKLQotd2l0aCBJbnRlcmZhY2VzOwotCi1wYWNrYWdlIFpMaWIgaXMKLQotICAgWkxpYl9FcnJvciAgIDogZXhjZXB0aW9uOwotICAgU3RhdHVzX0Vycm9yIDogZXhjZXB0aW9uOwotCi0gICB0eXBlIENvbXByZXNzaW9uX0xldmVsIGlzIG5ldyBJbnRlZ2VyIHJhbmdlIC0xIC4uIDk7Ci0KLSAgIHR5cGUgRmx1c2hfTW9kZSBpcyBwcml2YXRlOwotCi0gICB0eXBlIENvbXByZXNzaW9uX01ldGhvZCBpcyBwcml2YXRlOwotCi0gICB0eXBlIFdpbmRvd19CaXRzX1R5cGUgaXMgbmV3IEludGVnZXIgcmFuZ2UgOCAuLiAxNTsKLQotICAgdHlwZSBNZW1vcnlfTGV2ZWxfVHlwZSBpcyBuZXcgSW50ZWdlciByYW5nZSAxIC4uIDk7Ci0KLSAgIHR5cGUgVW5zaWduZWRfMzIgaXMgbmV3IEludGVyZmFjZXMuVW5zaWduZWRfMzI7Ci0KLSAgIHR5cGUgU3RyYXRlZ3lfVHlwZSBpcyBwcml2YXRlOwotCi0gICB0eXBlIEhlYWRlcl9UeXBlIGlzIChOb25lLCBBdXRvLCBEZWZhdWx0LCBHWmlwKTsKLSAgIC0tICBIZWFkZXIgdHlwZSB1c2FnZSBoYXZlIGEgc29tZSBsaW1pdGF0aW9uIGZvciBpbmZsYXRlLgotICAgLS0gIFNlZSBjb21tZW50IGZvciBJbmZsYXRlX0luaXQuCi0KLSAgIHN1YnR5cGUgQ291bnQgaXMgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQ291bnQ7Ci0KLSAgIERlZmF1bHRfTWVtb3J5X0xldmVsIDogY29uc3RhbnQgTWVtb3J5X0xldmVsX1R5cGUgOj0gODsKLSAgIERlZmF1bHRfV2luZG93X0JpdHMgIDogY29uc3RhbnQgV2luZG93X0JpdHNfVHlwZSAgOj0gMTU7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIENvbXByZXNzaW9uIG1ldGhvZCBjb25zdGFudHMgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgRGVmbGF0ZWQgOiBjb25zdGFudCBDb21wcmVzc2lvbl9NZXRob2Q7Ci0gICAtLSAgT25seSBvbmUgbWV0aG9kIGFsbG93ZWQgaW4gdGhpcyBaTGliIHZlcnNpb24KLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBDb21wcmVzc2lvbiBsZXZlbCBjb25zdGFudHMgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBOb19Db21wcmVzc2lvbiAgICAgIDogY29uc3RhbnQgQ29tcHJlc3Npb25fTGV2ZWwgOj0gMDsKLSAgIEJlc3RfU3BlZWQgICAgICAgICAgOiBjb25zdGFudCBDb21wcmVzc2lvbl9MZXZlbCA6PSAxOwotICAgQmVzdF9Db21wcmVzc2lvbiAgICA6IGNvbnN0YW50IENvbXByZXNzaW9uX0xldmVsIDo9IDk7Ci0gICBEZWZhdWx0X0NvbXByZXNzaW9uIDogY29uc3RhbnQgQ29tcHJlc3Npb25fTGV2ZWwgOj0gLTE7Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAtLSBGbHVzaCBtb2RlIGNvbnN0YW50cyAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgTm9fRmx1c2ggICAgICA6IGNvbnN0YW50IEZsdXNoX01vZGU7Ci0gICAtLSAgUmVndWxhciB3YXkgZm9yIGNvbXByZXNzaW9uLCBubyBmbHVzaAotCi0gICBQYXJ0aWFsX0ZsdXNoIDogY29uc3RhbnQgRmx1c2hfTW9kZTsKLSAgIC0tICBXaWxsIGJlIHJlbW92ZWQsIHVzZSBaX1NZTkNfRkxVU0ggaW5zdGVhZAotCi0gICBTeW5jX0ZsdXNoICAgIDogY29uc3RhbnQgRmx1c2hfTW9kZTsKLSAgIC0tICBBbGwgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dAotICAgLS0gIGlzIGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5LCBzbyB0aGF0IHRoZSBkZWNvbXByZXNzb3IgY2FuIGdldCBhbGwKLSAgIC0tICBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuIChJbiBwYXJ0aWN1bGFyIGF2YWlsX2luIGlzIHplcm8gYWZ0ZXIgdGhlCi0gICAtLSAgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuIHByb3ZpZGVkICBiZWZvcmUgdGhlIGNhbGwuKQotICAgLS0gIEZsdXNoaW5nIG1heSBkZWdyYWRlIGNvbXByZXNzaW9uIGZvciBzb21lIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgYW5kIHNvCi0gICAtLSAgaXQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4KLQotICAgQmxvY2tfRmx1c2ggICA6IGNvbnN0YW50IEZsdXNoX01vZGU7Ci0gICAtLSAgWl9CTE9DSyByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBzdG9wCi0gICAtLSAgaWYgYW5kIHdoZW4gaXQgZ2V0IHRvIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgYm91bmRhcnkuIFdoZW4gZGVjb2RpbmcgdGhlCi0gICAtLSAgemxpYiBvciBnemlwIGZvcm1hdCwgdGhpcyB3aWxsIGNhdXNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkKLSAgIC0tICBhZnRlciB0aGUgaGVhZGVyIGFuZCBiZWZvcmUgdGhlIGZpcnN0IGJsb2NrLiBXaGVuIGRvaW5nIGEgcmF3IGluZmxhdGUsCi0gICAtLSAgaW5mbGF0ZSgpIHdpbGwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgdGhlIGZpcnN0IGJsb2NrLCBhbmQgd2lsbCByZXR1cm4KLSAgIC0tICB3aGVuIGl0IGdldHMgdG8gdGhlIGVuZCBvZiB0aGF0IGJsb2NrLCBvciB3aGVuIGl0IHJ1bnMgb3V0IG9mIGRhdGEuCi0KLSAgIEZ1bGxfRmx1c2ggICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlOwotICAgLS0gIEFsbCBvdXRwdXQgaXMgZmx1c2hlZCBhcyB3aXRoIFNZTkNfRkxVU0gsIGFuZCB0aGUgY29tcHJlc3Npb24gc3RhdGUKLSAgIC0tICBpcyByZXNldCBzbyB0aGF0IGRlY29tcHJlc3Npb24gY2FuIHJlc3RhcnQgZnJvbSB0aGlzIHBvaW50IGlmIHByZXZpb3VzCi0gICAtLSAgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYgcmFuZG9tIGFjY2VzcyBpcyBkZXNpcmVkLiBVc2luZwotICAgLS0gIEZ1bGxfRmx1c2ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZSB0aGUgY29tcHJlc3Npb24uCi0KLSAgIEZpbmlzaCAgICAgICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlOwotICAgLS0gIEp1c3QgZm9yIHRlbGwgdGhlIGNvbXByZXNzb3IgdGhhdCBpbnB1dCBkYXRhIGlzIGNvbXBsZXRlLgotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tIENvbXByZXNzaW9uIHN0cmF0ZWd5IGNvbnN0YW50cyAtLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIC0tICBSTEUgc3RhdGVneSBjb3VsZCBiZSB1c2VkIG9ubHkgaW4gdmVyc2lvbiAxLjIuMCBhbmQgbGF0ZXIuCi0KLSAgIEZpbHRlcmVkICAgICAgICAgOiBjb25zdGFudCBTdHJhdGVneV9UeXBlOwotICAgSHVmZm1hbl9Pbmx5ICAgICA6IGNvbnN0YW50IFN0cmF0ZWd5X1R5cGU7Ci0gICBSTEUgICAgICAgICAgICAgIDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZTsKLSAgIERlZmF1bHRfU3RyYXRlZ3kgOiBjb25zdGFudCBTdHJhdGVneV9UeXBlOwotCi0gICBEZWZhdWx0X0J1ZmZlcl9TaXplIDogY29uc3RhbnQgOj0gNDA5NjsKLQotICAgdHlwZSBGaWx0ZXJfVHlwZSBpcyB0YWdnZWQgbGltaXRlZCBwcml2YXRlOwotICAgLS0gIFRoZSBmaWx0ZXIgaXMgZm9yIGNvbXByZXNzaW9uIGFuZCBmb3IgZGVjb21wcmVzc2lvbi4KLSAgIC0tICBUaGUgdXNhZ2Ugb2YgdGhlIHR5cGUgaXMgZGVwZW5kIG9mIGl0cyBpbml0aWFsaXphdGlvbi4KLQotICAgZnVuY3Rpb24gVmVyc2lvbiByZXR1cm4gU3RyaW5nOwotICAgcHJhZ21hIElubGluZSAoVmVyc2lvbik7Ci0gICAtLSAgUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgWkxpYiB2ZXJzaW9uLgotCi0gICBwcm9jZWR1cmUgRGVmbGF0ZV9Jbml0Ci0gICAgIChGaWx0ZXIgICAgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBMZXZlbCAgICAgICAgOiBpbiAgICAgQ29tcHJlc3Npb25fTGV2ZWwgIDo9IERlZmF1bHRfQ29tcHJlc3Npb247Ci0gICAgICBTdHJhdGVneSAgICAgOiBpbiAgICAgU3RyYXRlZ3lfVHlwZSAgICAgIDo9IERlZmF1bHRfU3RyYXRlZ3k7Ci0gICAgICBNZXRob2QgICAgICAgOiBpbiAgICAgQ29tcHJlc3Npb25fTWV0aG9kIDo9IERlZmxhdGVkOwotICAgICAgV2luZG93X0JpdHMgIDogaW4gICAgIFdpbmRvd19CaXRzX1R5cGUgICA6PSBEZWZhdWx0X1dpbmRvd19CaXRzOwotICAgICAgTWVtb3J5X0xldmVsIDogaW4gICAgIE1lbW9yeV9MZXZlbF9UeXBlICA6PSBEZWZhdWx0X01lbW9yeV9MZXZlbDsKLSAgICAgIEhlYWRlciAgICAgICA6IGluICAgICBIZWFkZXJfVHlwZSAgICAgICAgOj0gRGVmYXVsdCk7Ci0gICAtLSAgQ29tcHJlc3NvciBpbml0aWFsaXphdGlvbi4KLSAgIC0tICBXaGVuIEhlYWRlciBwYXJhbWV0ZXIgaXMgQXV0byBvciBEZWZhdWx0LCB0aGVuIGRlZmF1bHQgemxpYiBoZWFkZXIKLSAgIC0tICB3b3VsZCBiZSBwcm92aWRlZCBmb3IgY29tcHJlc3NlZCBkYXRhLgotICAgLS0gIFdoZW4gSGVhZGVyIGlzIEdaaXAsIHRoZW4gZ3ppcCBoZWFkZXIgd291bGQgYmUgc2V0IGluc3RlYWQgb2YKLSAgIC0tICBkZWZhdWx0IGhlYWRlci4KLSAgIC0tICBXaGVuIEhlYWRlciBpcyBOb25lLCBubyBoZWFkZXIgd291bGQgYmUgc2V0IGZvciBjb21wcmVzc2VkIGRhdGEuCi0KLSAgIHByb2NlZHVyZSBJbmZsYXRlX0luaXQKLSAgICAgKEZpbHRlciAgICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgV2luZG93X0JpdHMgOiBpbiAgICAgV2luZG93X0JpdHNfVHlwZSA6PSBEZWZhdWx0X1dpbmRvd19CaXRzOwotICAgICAgSGVhZGVyICAgICAgOiBpbiAgICAgSGVhZGVyX1R5cGUgICAgICA6PSBEZWZhdWx0KTsKLSAgIC0tICBEZWNvbXByZXNzb3IgaW5pdGlhbGl6YXRpb24uCi0gICAtLSAgRGVmYXVsdCBoZWFkZXIgdHlwZSBtZWFuIHRoYXQgWkxpYiBkZWZhdWx0IGhlYWRlciBpcyBleHBlY3RpbmcgaW4gdGhlCi0gICAtLSAgaW5wdXQgY29tcHJlc3NlZCBzdHJlYW0uCi0gICAtLSAgSGVhZGVyIHR5cGUgTm9uZSBtZWFuIHRoYXQgbm8gaGVhZGVyIGlzIGV4cGVjdGluZyBpbiB0aGUgaW5wdXQgc3RyZWFtLgotICAgLS0gIEdaaXAgaGVhZGVyIHR5cGUgbWVhbiB0aGF0IEdaaXAgaGVhZGVyIGlzIGV4cGVjdGluZyBpbiB0aGUKLSAgIC0tICBpbnB1dCBjb21wcmVzc2VkIHN0cmVhbS4KLSAgIC0tICBBdXRvIGhlYWRlciB0eXBlIG1lYW4gdGhhdCBoZWFkZXIgdHlwZSAoR1ppcCBvciBOYXRpdmUpIHdvdWxkIGJlCi0gICAtLSAgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSBpbiB0aGUgaW5wdXQgc3RyZWFtLgotICAgLS0gIE5vdGUgdGhhdCBoZWFkZXIgdHlwZXMgcGFyYW1ldGVyIHZhbHVlcyBOb25lLCBHWmlwIGFuZCBBdXRvIGFyZQotICAgLS0gIHN1cHBvcnRlZCBmb3IgaW5mbGF0ZSByb3V0aW5lIG9ubHkgaW4gWkxpYiB2ZXJzaW9ucyAxLjIuMC4yIGFuZCBsYXRlci4KLSAgIC0tICBEZWZsYXRlX0luaXQgaXMgc3VwcG9ydGluZyBhbGwgaGVhZGVyIHR5cGVzLgotCi0gICBmdW5jdGlvbiBJc19PcGVuIChGaWx0ZXIgOiBpbiBGaWx0ZXJfVHlwZSkgcmV0dXJuIEJvb2xlYW47Ci0gICBwcmFnbWEgSW5saW5lIChJc19PcGVuKTsKLSAgIC0tICBJcyB0aGUgZmlsdGVyIG9wZW5lZCBmb3IgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbi4KLQotICAgcHJvY2VkdXJlIENsb3NlCi0gICAgIChGaWx0ZXIgICAgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBJZ25vcmVfRXJyb3IgOiBpbiAgICAgQm9vbGVhbiA6PSBGYWxzZSk7Ci0gICAtLSAgQ2xvc2luZyB0aGUgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc29yLgotICAgLS0gIElmIHN0cmVhbSBpcyBjbG9zaW5nIGJlZm9yZSB0aGUgY29tcGxldGUgYW5kIElnbm9yZV9FcnJvciBpcyBGYWxzZSwKLSAgIC0tICBUaGUgZXhjZXB0aW9uIHdvdWxkIGJlIHJhaXNlZC4KLQotICAgZ2VuZXJpYwotICAgICAgd2l0aCBwcm9jZWR1cmUgRGF0YV9JbgotICAgICAgICAoSXRlbSA6IG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgICAgIExhc3QgOiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KTsKLSAgICAgIHdpdGggcHJvY2VkdXJlIERhdGFfT3V0Ci0gICAgICAgIChJdGVtIDogaW4gQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpOwotICAgcHJvY2VkdXJlIEdlbmVyaWNfVHJhbnNsYXRlCi0gICAgIChGaWx0ZXIgICAgICAgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBJbl9CdWZmZXJfU2l6ZSAgOiBpbiAgICAgSW50ZWdlciA6PSBEZWZhdWx0X0J1ZmZlcl9TaXplOwotICAgICAgT3V0X0J1ZmZlcl9TaXplIDogaW4gICAgIEludGVnZXIgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZSk7Ci0gICAtLSAgQ29tcHJlc3MvZGVjb21wcmVzcyBkYXRhIGZldGNoIGZyb20gRGF0YV9JbiByb3V0aW5lIGFuZCBwYXNzIHRoZSByZXN1bHQKLSAgIC0tICB0byB0aGUgRGF0YV9PdXQgcm91dGluZS4gVXNlciBzaG91bGQgcHJvdmlkZSBEYXRhX0luIGFuZCBEYXRhX091dAotICAgLS0gIGZvciBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGRhdGEgZmxvdy4KLSAgIC0tICBDb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGRlcGVuZCBvbiBGaWx0ZXIgaW5pdGlhbGl6YXRpb24uCi0KLSAgIGZ1bmN0aW9uIFRvdGFsX0luIChGaWx0ZXIgOiBpbiBGaWx0ZXJfVHlwZSkgcmV0dXJuIENvdW50OwotICAgcHJhZ21hIElubGluZSAoVG90YWxfSW4pOwotICAgLS0gIFJldHVybnMgdG90YWwgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyCi0KLSAgIGZ1bmN0aW9uIFRvdGFsX091dCAoRmlsdGVyIDogaW4gRmlsdGVyX1R5cGUpIHJldHVybiBDb3VudDsKLSAgIHByYWdtYSBJbmxpbmUgKFRvdGFsX091dCk7Ci0gICAtLSAgUmV0dXJucyB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhcgotCi0gICBmdW5jdGlvbiBDUkMzMgotICAgICAoQ1JDICAgIDogaW4gVW5zaWduZWRfMzI7Ci0gICAgICBEYXRhICAgOiBpbiBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheSkKLSAgICAgIHJldHVybiBVbnNpZ25lZF8zMjsKLSAgIHByYWdtYSBJbmxpbmUgKENSQzMyKTsKLSAgIC0tICBDb21wdXRlIENSQzMyLCBpdCBjb3VsZCBiZSBuZWNlc3NhcnkgZm9yIG1ha2UgZ3ppcCBmb3JtYXQKLQotICAgcHJvY2VkdXJlIENSQzMyCi0gICAgIChDUkMgIDogaW4gb3V0IFVuc2lnbmVkXzMyOwotICAgICAgRGF0YSA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheSk7Ci0gICBwcmFnbWEgSW5saW5lIChDUkMzMik7Ci0gICAtLSAgQ29tcHV0ZSBDUkMzMiwgaXQgY291bGQgYmUgbmVjZXNzYXJ5IGZvciBtYWtlIGd6aXAgZm9ybWF0Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIC0tICBCZWxvdyBpcyBtb3JlIGNvbXBsZXggbG93IGxldmVsIHJvdXRpbmVzLiAgLS0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcHJvY2VkdXJlIFRyYW5zbGF0ZQotICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOwotICAgICAgSW5fRGF0YSAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgSW5fTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSk7Ci0gICAtLSAgQ29tcHJlc3MvZGVjb21wcmVzcyB0aGUgSW5fRGF0YSBidWZmZXIgYW5kIHBsYWNlIHRoZSByZXN1bHQgaW50bwotICAgLS0gIE91dF9EYXRhLiBJbl9MYXN0IGlzIHRoZSBpbmRleCBvZiBsYXN0IGVsZW1lbnQgZnJvbSBJbl9EYXRhIGFjY2VwdGVkIGJ5Ci0gICAtLSAgdGhlIEZpbHRlci4gT3V0X0xhc3QgaXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcmVjZWl2ZWQgZGF0YSBmcm9tCi0gICAtLSAgRmlsdGVyLiBUbyB0ZWxsIHRoZSBmaWx0ZXIgdGhhdCBpbmNvbWluZyBkYXRhIGFyZSBjb21wbGV0ZSBwdXQgdGhlCi0gICAtLSAgRmx1c2ggcGFyYW1ldGVyIHRvIEZpbmlzaC4KLQotICAgZnVuY3Rpb24gU3RyZWFtX0VuZCAoRmlsdGVyIDogaW4gRmlsdGVyX1R5cGUpIHJldHVybiBCb29sZWFuOwotICAgcHJhZ21hIElubGluZSAoU3RyZWFtX0VuZCk7Ci0gICAtLSAgUmV0dXJuIHRoZSB0cnVlIHdoZW4gdGhlIHN0cmVhbSBpcyBjb21wbGV0ZS4KLQotICAgcHJvY2VkdXJlIEZsdXNoCi0gICAgIChGaWx0ZXIgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBPdXRfRGF0YSAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBPdXRfTGFzdCAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgRmx1c2ggICAgIDogaW4gICAgIEZsdXNoX01vZGUpOwotICAgcHJhZ21hIElubGluZSAoRmx1c2gpOwotICAgLS0gIEZsdXNoaW5nIHRoZSBkYXRhIGZyb20gdGhlIGNvbXByZXNzb3IuCi0KLSAgIGdlbmVyaWMKLSAgICAgIHdpdGggcHJvY2VkdXJlIFdyaXRlCi0gICAgICAgIChJdGVtIDogaW4gQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpOwotICAgICAgLS0gIFVzZXIgc2hvdWxkIHByb3ZpZGUgdGhpcyByb3V0aW5lIGZvciBhY2NlcHQKLSAgICAgIC0tICBjb21wcmVzc2VkL2RlY29tcHJlc3NlZCBkYXRhLgotCi0gICAgICBCdWZmZXJfU2l6ZSA6IGluIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldAotICAgICAgICAgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZTsKLSAgICAgIC0tICBCdWZmZXIgc2l6ZSBmb3IgV3JpdGUgdXNlciByb3V0aW5lLgotCi0gICBwcm9jZWR1cmUgV3JpdGUKLSAgICAgKEZpbHRlciAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBJdGVtICAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgRmx1c2ggICA6IGluICAgICBGbHVzaF9Nb2RlIDo9IE5vX0ZsdXNoKTsKLSAgIC0tICBDb21wcmVzcy9EZWNvbXByZXNzIGRhdGEgZnJvbSBJdGVtIHRvIHRoZSBnZW5lcmljIHBhcmFtZXRlciBwcm9jZWR1cmUKLSAgIC0tICBXcml0ZS4gT3V0cHV0IGJ1ZmZlciBzaXplIGNvdWxkIGJlIHNldCBpbiBCdWZmZXJfU2l6ZSBnZW5lcmljIHBhcmFtZXRlci4KLQotICAgZ2VuZXJpYwotICAgICAgd2l0aCBwcm9jZWR1cmUgUmVhZAotICAgICAgICAoSXRlbSA6IG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKLSAgICAgICAgIExhc3QgOiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KTsKLSAgICAgIC0tICBVc2VyIHNob3VsZCBwcm92aWRlIGRhdGEgZm9yIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24KLSAgICAgIC0tICB0aHJ1IHRoaXMgcm91dGluZS4KLQotICAgICAgQnVmZmVyIDogaW4gb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OwotICAgICAgLS0gIEJ1ZmZlciBmb3Iga2VlcCByZW1haW5pbmcgZGF0YSBmcm9tIHRoZSBwcmV2aW91cwotICAgICAgLS0gIGJhY2sgcmVhZC4KLQotICAgICAgUmVzdF9GaXJzdCwgUmVzdF9MYXN0IDogaW4gb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKLSAgICAgIC0tICBSZXN0X0ZpcnN0IGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gQnVmZmVyJ0xhc3QgKyAxCi0gICAgICAtLSAgUmVzdF9MYXN0IGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gQnVmZmVyJ0xhc3QKLSAgICAgIC0tICBiZWZvcmUgdXNhZ2UuCi0KLSAgICAgIEFsbG93X1JlYWRfU29tZSA6IGluIEJvb2xlYW4gOj0gRmFsc2U7Ci0gICAgICAtLSAgSXMgaXQgYWxsb3dlZCB0byByZXR1cm4gTGFzdCA8IEl0ZW0nTGFzdCBiZWZvcmUgZW5kIG9mIGRhdGEuCi0KLSAgIHByb2NlZHVyZSBSZWFkCi0gICAgIChGaWx0ZXIgOiBpbiBvdXQgRmlsdGVyX1R5cGU7Ci0gICAgICBJdGVtICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7Ci0gICAgICBMYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OwotICAgICAgRmx1c2ggIDogaW4gICAgIEZsdXNoX01vZGUgOj0gTm9fRmx1c2gpOwotICAgLS0gIENvbXByZXNzL0RlY29tcHJlc3MgZGF0YSBmcm9tIGdlbmVyaWMgcGFyYW1ldGVyIHByb2NlZHVyZSBSZWFkIHRvIHRoZQotICAgLS0gIEl0ZW0uIFVzZXIgc2hvdWxkIHByb3ZpZGUgQnVmZmVyIGFuZCBpbml0aWFsaXplZCBSZXN0X0ZpcnN0LCBSZXN0X0xhc3QKLSAgIC0tICBpbmRpY2F0b3JzLiBJZiBBbGxvd19SZWFkX1NvbWUgaXMgVHJ1ZSwgUmVhZCByb3V0aW5lcyBjb3VsZCByZXR1cm4KLSAgIC0tICBMYXN0IDwgSXRlbSdMYXN0IG9ubHkgYXQgZW5kIG9mIHN0cmVhbS4KLQotcHJpdmF0ZQotCi0gICB1c2UgQWRhLlN0cmVhbXM7Ci0KLSAgIHByYWdtYSBBc3NlcnQgKEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50J1NpemUgICAgPSAgICA4KTsKLSAgIHByYWdtYSBBc3NlcnQgKEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50J01vZHVsdXMgPSAyKio4KTsKLQotICAgdHlwZSBGbHVzaF9Nb2RlIGlzIG5ldyBJbnRlZ2VyIHJhbmdlIDAgLi4gNTsKLQotICAgdHlwZSBDb21wcmVzc2lvbl9NZXRob2QgaXMgbmV3IEludGVnZXIgcmFuZ2UgOCAuLiA4OwotCi0gICB0eXBlIFN0cmF0ZWd5X1R5cGUgaXMgbmV3IEludGVnZXIgcmFuZ2UgMCAuLiAzOwotCi0gICBOb19GbHVzaCAgICAgIDogY29uc3RhbnQgRmx1c2hfTW9kZSA6PSAwOwotICAgUGFydGlhbF9GbHVzaCA6IGNvbnN0YW50IEZsdXNoX01vZGUgOj0gMTsKLSAgIFN5bmNfRmx1c2ggICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlIDo9IDI7Ci0gICBGdWxsX0ZsdXNoICAgIDogY29uc3RhbnQgRmx1c2hfTW9kZSA6PSAzOwotICAgRmluaXNoICAgICAgICA6IGNvbnN0YW50IEZsdXNoX01vZGUgOj0gNDsKLSAgIEJsb2NrX0ZsdXNoICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlIDo9IDU7Ci0KLSAgIEZpbHRlcmVkICAgICAgICAgOiBjb25zdGFudCBTdHJhdGVneV9UeXBlIDo9IDE7Ci0gICBIdWZmbWFuX09ubHkgICAgIDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZSA6PSAyOwotICAgUkxFICAgICAgICAgICAgICA6IGNvbnN0YW50IFN0cmF0ZWd5X1R5cGUgOj0gMzsKLSAgIERlZmF1bHRfU3RyYXRlZ3kgOiBjb25zdGFudCBTdHJhdGVneV9UeXBlIDo9IDA7Ci0KLSAgIERlZmxhdGVkIDogY29uc3RhbnQgQ29tcHJlc3Npb25fTWV0aG9kIDo9IDg7Ci0KLSAgIHR5cGUgWl9TdHJlYW07Ci0KLSAgIHR5cGUgWl9TdHJlYW1fQWNjZXNzIGlzIGFjY2VzcyBhbGwgWl9TdHJlYW07Ci0KLSAgIHR5cGUgRmlsdGVyX1R5cGUgaXMgdGFnZ2VkIGxpbWl0ZWQgcmVjb3JkCi0gICAgICBTdHJtICAgICAgICA6IFpfU3RyZWFtX0FjY2VzczsKLSAgICAgIENvbXByZXNzaW9uIDogQm9vbGVhbjsKLSAgICAgIFN0cmVhbV9FbmQgIDogQm9vbGVhbjsKLSAgICAgIEhlYWRlciAgICAgIDogSGVhZGVyX1R5cGU7Ci0gICAgICBDUkMgICAgICAgICA6IFVuc2lnbmVkXzMyOwotICAgICAgT2Zmc2V0ICAgICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7Ci0gICAgICAtLSAgT2Zmc2V0IGZvciBnemlwIGhlYWRlci9mb290ZXIgb3V0cHV0LgotICAgZW5kIHJlY29yZDsKLQotZW5kIFpMaWI7CmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9hZGEvemxpYi5ncHIgYi9saWJzL3psaWIvY29udHJpYi9hZGEvemxpYi5ncHIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NmIyMmEuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvYWRhL3psaWIuZ3ByCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcHJvamVjdCBabGliIGlzCi0KLSAgIGZvciBMYW5ndWFnZXMgdXNlICgiQWRhIik7Ci0gICBmb3IgU291cmNlX0RpcnMgdXNlICgiLiIpOwotICAgZm9yIE9iamVjdF9EaXIgdXNlICIuIjsKLSAgIGZvciBNYWluIHVzZSAoInRlc3QuYWRiIiwgIm10ZXN0LmFkYiIsICJyZWFkLmFkYiIsICJidWZmZXJfZGVtbyIpOwotCi0gICBwYWNrYWdlIENvbXBpbGVyIGlzCi0gICAgICBmb3IgRGVmYXVsdF9Td2l0Y2hlcyAoImFkYSIpIHVzZSAoIi1nbmF0d2NmaWxvcHJ1IiwgIi1nbmF0VmNkZmltb3JzdCIsICItZ25hdHlhYmNlZmhpa2xtbm9wcnN0Iik7Ci0gICBlbmQgQ29tcGlsZXI7Ci0KLSAgIHBhY2thZ2UgTGlua2VyIGlzCi0gICAgICBmb3IgRGVmYXVsdF9Td2l0Y2hlcyAoImFkYSIpIHVzZSAoIi1seiIpOwotICAgZW5kIExpbmtlcjsKLQotICAgcGFja2FnZSBCdWlsZGVyIGlzCi0gICAgICBmb3IgRGVmYXVsdF9Td2l0Y2hlcyAoImFkYSIpIHVzZSAoIi1zIiwgIi1nbmF0USIpOwotICAgZW5kIEJ1aWxkZXI7Ci0KLWVuZCBabGliOwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvYXNtNTg2L1JFQURNRS41ODYgYi9saWJzL3psaWIvY29udHJpYi9hc201ODYvUkVBRE1FLjU4NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiNzhmMy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9hc201ODYvUkVBRE1FLjU4NgorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLVRoaXMgaXMgYSBwYXRjaGVkIHZlcnNpb24gb2YgemxpYiBtb2RpZmllZCB0byB1c2UKLVBlbnRpdW0tb3B0aW1pemVkIGFzc2VtYmx5IGNvZGUgaW4gdGhlIGRlZmxhdGlvbiBhbGdvcml0aG0uIFRoZSBmaWxlcwotY2hhbmdlZC9hZGRlZCBieSB0aGlzIHBhdGNoIGFyZToKLQotUkVBRE1FLjU4NgotbWF0Y2guUwotCi1UaGUgZWZmZWN0aXZlbmVzcyBvZiB0aGVzZSBtb2RpZmljYXRpb25zIGlzIGEgYml0IG1hcmdpbmFsLCBhcyB0aGUgdGhlCi1wcm9ncmFtJ3MgYm90dGxlbmVjayBzZWVtcyB0byBiZSBtb3N0bHkgTDEtY2FjaGUgY29udGVudGlvbiwgZm9yIHdoaWNoCi10aGVyZSBpcyBubyByZWFsIHdheSB0byB3b3JrIGFyb3VuZCB3aXRob3V0IHJld3JpdGluZyB0aGUgYmFzaWMKLWFsZ29yaXRobS4gVGhlIHNwZWVkdXAgb24gYXZlcmFnZSBpcyBhcm91bmQgNS0xMCUgKHdoaWNoIGlzIGdlbmVyYWxseQotbGVzcyB0aGFuIHRoZSBhbW91bnQgb2YgdmFyaWFuY2UgYmV0d2VlbiBzdWJzZXF1ZW50IGV4ZWN1dGlvbnMpLgotSG93ZXZlciwgd2hlbiB1c2VkIGF0IGxldmVsIDkgY29tcHJlc3Npb24sIHRoZSBjYWNoZSBjb250ZW50aW9uIGNhbgotZHJvcCBlbm91Z2ggZm9yIHRoZSBhc3NlbWJseSB2ZXJzaW9uIHRvIGFjaGlldmUgMTAtMjAlIHNwZWVkdXAgKGFuZAotc29tZXRpbWVzIG1vcmUsIGRlcGVuZGluZyBvbiB0aGUgYW1vdW50IG9mIG92ZXJhbGwgcmVkdW5kYW5jeSBpbiB0aGUKLWZpbGVzKS4gRXZlbiBoZXJlLCB0aG91Z2gsIGNhY2hlIGNvbnRlbnRpb24gY2FuIHN0aWxsIGJlIHRoZSBsaW1pdGluZwotZmFjdG9yLCBkZXBlbmRpbmcgb24gdGhlIG5hdHVyZSBvZiB0aGUgcHJvZ3JhbSB1c2luZyB0aGUgemxpYiBsaWJyYXJ5LgotVGhpcyBtYXkgYWxzbyBtZWFuIHRoYXQgYmV0dGVyIGltcHJvdmVtZW50cyB3aWxsIGJlIHNlZW4gb24gYSBQZW50aXVtCi13aXRoIE1NWCwgd2hpY2ggc3VmZmVycyBtdWNoIGxlc3MgZnJvbSBMMS1jYWNoZSBjb250ZW50aW9uLCBidXQgSSBoYXZlCi1ub3QgeWV0IHZlcmlmaWVkIHRoaXMuCi0KLU5vdGUgdGhhdCB0aGlzIGNvZGUgaGFzIGJlZW4gdGFpbG9yZWQgZm9yIHRoZSBQZW50aXVtIGluIHBhcnRpY3VsYXIsCi1hbmQgd2lsbCBub3QgcGVyZm9ybSB3ZWxsIG9uIHRoZSBQZW50aXVtIFBybyAoZHVlIHRvIHRoZSB1c2Ugb2YgYQotcGFydGlhbCByZWdpc3RlciBpbiB0aGUgaW5uZXIgbG9vcCkuCi0KLUlmIHlvdSBhcmUgdXNpbmcgYW4gYXNzZW1ibGVyIG90aGVyIHRoYW4gR05VIGFzLCB5b3Ugd2lsbCBoYXZlIHRvCi10cmFuc2xhdGUgbWF0Y2guUyB0byB1c2UgeW91ciBhc3NlbWJsZXIncyBzeW50YXguIChIYXZlIGZ1bi4pCi0KLUJyaWFuIFJhaXRlcgotYnJlYWRib3hAbXVwcGV0bGFicy5jb20KLUFwcmlsLCAxOTk4Ci0KLQotQWRkZWQgZm9yIHpsaWIgMS4xLjM6Ci0KLVRoZSBwYXRjaGVzIGNvbWUgZnJvbQotaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAotCi1UbyBjb21waWxlIHpsaWIgd2l0aCB0aGlzIGFzbSBmaWxlLCBjb3B5IG1hdGNoLlMgdG8gdGhlIHpsaWIgZGlyZWN0b3J5Ci10aGVuIGRvOgotCi1DRkxBR1M9Ii1PMyAtREFTTVYiIC4vY29uZmlndXJlCi1tYWtlIE9CSkE9bWF0Y2gubwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvYXNtNTg2L21hdGNoLlMgYi9saWJzL3psaWIvY29udHJpYi9hc201ODYvbWF0Y2guUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2OGIzNS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9hc201ODYvbWF0Y2guUworKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKiBtYXRjaC5zIC0tIFBlbnRpdW0tb3B0aW1pemVkIHZlcnNpb24gb2YgbG9uZ2VzdF9tYXRjaCgpCi0gKiBXcml0dGVuIGZvciB6bGliIDEuMS4yCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggQnJpYW4gUmFpdGVyIDxicmVhZGJveEBtdXBwZXRsYWJzLmNvbT4KLSAqCi0gKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBOT19VTkRFUkxJTkUKLSNkZWZpbmUJbWF0Y2hfaW5pdAlfbWF0Y2hfaW5pdAotI2RlZmluZQlsb25nZXN0X21hdGNoCV9sb25nZXN0X21hdGNoCi0jZW5kaWYKLQotI2RlZmluZQlNQVhfTUFUQ0gJKDI1OCkKLSNkZWZpbmUJTUlOX01BVENICSgzKQotI2RlZmluZQlNSU5fTE9PS0FIRUFECShNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKQotI2RlZmluZQlNQVhfTUFUQ0hfOAkoKE1BWF9NQVRDSCArIDcpICYgfjcpCi0KLS8qIHN0YWNrIGZyYW1lIG9mZnNldHMgKi8KLQotI2RlZmluZQl3bWFzawkJCTAJLyogbG9jYWwgY29weSBvZiBzLT53bWFzawkqLwotI2RlZmluZQl3aW5kb3cJCQk0CS8qIGxvY2FsIGNvcHkgb2Ygcy0+d2luZG93CSovCi0jZGVmaW5lCXdpbmRvd2Jlc3RsZW4JCTgJLyogcy0+d2luZG93ICsgYmVzdGxlbgkJKi8KLSNkZWZpbmUJY2hhaW5sZW5zY2FuZW5kCQkxMgkvKiBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuCSovCi0JCQkJCS8qIGxvdyB3b3JkOiBsYXN0IGJ5dGVzIHNvdWdodAkqLwotI2RlZmluZQlzY2Fuc3RhcnQJCTE2CS8qIGZpcnN0IHR3byBieXRlcyBvZiBzdHJpbmcJKi8KLSNkZWZpbmUJc2NhbmFsaWduCQkyMAkvKiBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nCSovCi0jZGVmaW5lCW5pY2VtYXRjaAkJMjQJLyogYSBnb29kIGVub3VnaCBtYXRjaCBzaXplCSovCi0jZGVmaW5lCWJlc3RsZW4JCQkyOAkvKiBzaXplIG9mIGJlc3QgbWF0Y2ggc28gZmFyCSovCi0jZGVmaW5lCXNjYW4JCQkzMgkvKiBwdHIgdG8gc3RyaW5nIHdhbnRpbmcgbWF0Y2gJKi8KLQotI2RlZmluZQlMb2NhbFZhcnNTaXplCQkoMzYpCi0vKglzYXZlZCBlYngJCTM2ICovCi0vKglzYXZlZCBlZGkJCTQwICovCi0vKglzYXZlZCBlc2kJCTQ0ICovCi0vKglzYXZlZCBlYnAJCTQ4ICovCi0vKglyZXR1cm4gYWRkcmVzcwkJNTIgKi8KLSNkZWZpbmUJZGVmbGF0ZXN0YXRlCQk1NgkvKiB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCSovCi0jZGVmaW5lCWN1cm1hdGNoCQk2MAotCi0vKiBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzCi0gKiBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUsIHdpdGggdGhlCi0gKiBhc3N1bXB0aW9uIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgZHdvcmQtYWxpZ24gdGhlIGZpZWxkcy4gKFRodXMsCi0gKiBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzCi0gKiBwcm9ncmFtIHRvIGNyYXNoIGhvcnJpYmx5LCB3aXRob3V0IHNvIG11Y2ggYXMgYSB3YXJuaW5nIGF0Ci0gKiBjb21waWxlIHRpbWUuIFNpZ2guKQotICovCi0KLS8qIEFsbCB0aGUgK3psaWIxMjIyYWRkIG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgZmllbGRzCi0gKiAgaW4gemxpYiBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgc2luY2UgdGhlIGFzbSBjb2RlIHdhcyBmaXJzdCB3cml0dGVuCi0gKiAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAoLTQpIikuCi0gKiAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIGJldHdlZW4gMS4wLjUgYW5kIDEuMi4yLjEsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDAiKS4KLSAqIGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjIuMi4yIG9yIGxhdGVyICwgdXNlICJ6bGliMTIyMmFkZCBlcXUgOCIpLgotICovCi0KLSNkZWZpbmUgemxpYjEyMjJhZGQJCSg4KQotCi0jZGVmaW5lCWRzV1NpemUJCQkoMzYremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzV01hc2sJCQkoNDQremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzV2luZG93CQkoNDgremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzUHJldgkJCSg1Nit6bGliMTIyMmFkZCkKLSNkZWZpbmUJZHNNYXRjaExlbgkJKDg4K3psaWIxMjIyYWRkKQotI2RlZmluZQlkc1ByZXZNYXRjaAkJKDkyK3psaWIxMjIyYWRkKQotI2RlZmluZQlkc1N0clN0YXJ0CQkoMTAwK3psaWIxMjIyYWRkKQotI2RlZmluZQlkc01hdGNoU3RhcnQJCSgxMDQremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzTG9va2FoZWFkCQkoMTA4K3psaWIxMjIyYWRkKQotI2RlZmluZQlkc1ByZXZMZW4JCSgxMTIremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzTWF4Q2hhaW5MZW4JCSgxMTYremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzR29vZE1hdGNoCQkoMTMyK3psaWIxMjIyYWRkKQotI2RlZmluZQlkc05pY2VNYXRjaAkJKDEzNit6bGliMTIyMmFkZCkKLQotCi0uZmlsZSAibWF0Y2guUyIKLQotLmdsb2JsCW1hdGNoX2luaXQsIGxvbmdlc3RfbWF0Y2gKLQotLnRleHQKLQotLyogdUludCBsb25nZXN0X21hdGNoKGRlZmxhdGVfc3RhdGUgKmRlZmxhdGVzdGF0ZSwgSVBvcyBjdXJtYXRjaCkgKi8KLQotbG9uZ2VzdF9tYXRjaDoKLQotLyogU2F2ZSByZWdpc3RlcnMgdGhhdCB0aGUgY29tcGlsZXIgbWF5IGJlIHVzaW5nLCBhbmQgYWRqdXN0ICVlc3AgdG8JKi8KLS8qIG1ha2Ugcm9vbSBmb3Igb3VyIHN0YWNrIGZyYW1lLgkJCQkJKi8KLQotCQlwdXNobAklZWJwCi0JCXB1c2hsCSVlZGkKLQkJcHVzaGwJJWVzaQotCQlwdXNobAklZWJ4Ci0JCXN1YmwJJExvY2FsVmFyc1NpemUsICVlc3AKLQotLyogUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gJWVjeCB3aWxsIGhvbGQgY3VyX21hdGNoCQkqLwotLyogdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiAlZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUJKi8KLS8qIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIGR1cmluZyB0aGUgZnVuY3Rpb24ncyBzZXR1cCAoYmVmb3JlCQkqLwotLyogZW50ZXJpbmcgdGhlIG1haW4gbG9vcCkuCQkJCQkJKi8KLQotCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAotCQltb3ZsCWN1cm1hdGNoKCVlc3ApLCAlZWN4Ci0KLS8qIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOwkqLwotCi0JCW1vdmwJZHNOaWNlTWF0Y2goJWVkeCksICVlYXgKLQkJbW92bAlkc0xvb2thaGVhZCglZWR4KSwgJWVieAotCQljbXBsCSVlYXgsICVlYngKLQkJamwJTG9va2FoZWFkTGVzcwotCQltb3ZsCSVlYXgsICVlYngKLUxvb2thaGVhZExlc3M6CW1vdmwJJWVieCwgbmljZW1hdGNoKCVlc3ApCi0KLS8qIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7CQkJKi8KLQotCQltb3ZsCWRzV2luZG93KCVlZHgpLCAlZXNpCi0JCW1vdmwJJWVzaSwgd2luZG93KCVlc3ApCi0JCW1vdmwJZHNTdHJTdGFydCglZWR4KSwgJWVicAotCQlsZWEJKCVlc2ksJWVicCksICVlZGkKLQkJbW92bAklZWRpLCBzY2FuKCVlc3ApCi0KLS8qIERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcJCSovCi0vKiBkd29yZC1hbGlnbmVkLgkJCQkJCQkqLwotCi0JCW1vdmwJJWVkaSwgJWVheAotCQluZWdsCSVlYXgKLQkJYW5kbAkkMywgJWVheAotCQltb3ZsCSVlYXgsIHNjYW5hbGlnbiglZXNwKQotCi0vKiBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/CQkJKi8KLS8qICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOwkJCQkqLwotCi0JCW1vdmwJZHNXU2l6ZSglZWR4KSwgJWVheAotCQlzdWJsCSRNSU5fTE9PS0FIRUFELCAlZWF4Ci0JCXN1YmwJJWVheCwgJWVicAotCQlqZwlMaW1pdFBvc2l0aXZlCi0JCXhvcmwJJWVicCwgJWVicAotTGltaXRQb3NpdGl2ZToKLQotLyogdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsJCQkJKi8KLS8qIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7CQkJCSovCi0vKiAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOwkJCQkJCSovCi0vKiB9CQkJCQkJCQkJKi8KLQotCQltb3ZsCWRzUHJldkxlbiglZWR4KSwgJWVheAotCQltb3ZsCWRzR29vZE1hdGNoKCVlZHgpLCAlZWJ4Ci0JCWNtcGwJJWVieCwgJWVheAotCQltb3ZsCWRzTWF4Q2hhaW5MZW4oJWVkeCksICVlYngKLQkJamwJTGFzdE1hdGNoR29vZAotCQlzaHJsCSQyLCAlZWJ4Ci1MYXN0TWF0Y2hHb29kOgotCi0vKiBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuCSovCi0vKiB1c2UgdGhlIHNpZ24gZmxhZyBpbnN0ZWFkIG9mIHRoZSB6ZXJvIGZsYWcgZm9yIHRoZSBleGl0IHRlc3QuCSovCi0vKiBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSBzY2FuZW5kCSovCi0vKiBzY2FuZW5kIHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuCQkJKi8KLQotCQlkZWNsCSVlYngKLQkJc2hsbAkkMTYsICVlYngKLQotLyogaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7CQkJCQkqLwotCi0JCW1vdmwJZHNQcmV2TGVuKCVlZHgpLCAlZWF4Ci0JCW1vdmwJJWVheCwgYmVzdGxlbiglZXNwKQotCi0vKiBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluICVlc2kgbG9jYWxseSwgYW5kIGluICVlc2kuCSovCi0KLQkJYWRkbAklZWF4LCAlZXNpCi0JCW1vdmwJJWVzaSwgd2luZG93YmVzdGxlbiglZXNwKQotCi0vKiByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsJCQkJKi8KLS8qIHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsJCQkqLwotCi0JCW1vdncJKCVlZGkpLCAlYngKLQkJbW92dwklYngsIHNjYW5zdGFydCglZXNwKQotCQltb3Z3CS0xKCVlZGksJWVheCksICVieAotCQltb3ZsCSVlYngsIGNoYWlubGVuc2NhbmVuZCglZXNwKQotCi0vKiBQb3NmICpwcmV2ID0gcy0+cHJldjsJCQkJCQkqLwotLyogdUludCB3bWFzayA9IHMtPndfbWFzazsJCQkJCQkqLwotCi0JCW1vdmwJZHNQcmV2KCVlZHgpLCAlZWRpCi0JCW1vdmwJZHNXTWFzayglZWR4KSwgJWVkeAotCQltb3YJJWVkeCwgd21hc2soJWVzcCkKLQotLyogSnVtcCBpbnRvIHRoZSBtYWluIGxvb3AuCQkJCQkJKi8KLQotCQlqbXAJTG9vcEVudHJ5Ci0KLS5iYWxpZ24gMTYKLQotLyogZG8gewotICogICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOwotICogICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAotICogICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOwotICogICAgIFsuLi5dCi0gKiB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQKLSAqICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOwotICoKLSAqIEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUKLSAqIG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsCi0gKiBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4KLSAqCi0gKiBXaXRoaW4gdGhpcyBsb29wOgotICogJWVieCA9IGNoYWlubGVuc2NhbmVuZCAtIGkuZS4sICgoY2hhaW5sZW4gPDwgMTYpIHwgc2NhbmVuZCkKLSAqICVlY3ggPSBjdXJtYXRjaAotICogJWVkeCA9IGN1cm1hdGNoICYgd21hc2sKLSAqICVlc2kgPSB3aW5kb3diZXN0bGVuIC0gaS5lLiwgKHdpbmRvdyArIGJlc3RsZW4pCi0gKiAlZWRpID0gcHJldgotICogJWVicCA9IGxpbWl0Ci0gKgotICogVHdvIG9wdGltaXphdGlvbiBub3RlcyBvbiB0aGUgY2hvaWNlIG9mIGluc3RydWN0aW9uczoKLSAqCi0gKiBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gdXNlcyBhIDE2LWJpdCBhZGRyZXNzLCB3aGljaCBjb3N0cyBhbiBleHRyYSwKLSAqIHVucGFpcmFibGUgY3ljbGUuIFRoaXMgaXMgY2hlYXBlciB0aGFuIGRvaW5nIGEgMzItYml0IGFjY2VzcyBhbmQKLSAqIHplcm9pbmcgdGhlIGhpZ2ggd29yZCwgZHVlIHRvIHRoZSAzLWN5Y2xlIG1pc2FsaWdubWVudCBwZW5hbHR5IHdoaWNoCi0gKiB3b3VsZCBvY2N1ciBoYWxmIHRoZSB0aW1lLiBUaGlzIGFsc28gdHVybnMgb3V0IHRvIGJlIGNoZWFwZXIgdGhhbgotICogZG9pbmcgdHdvIHNlcGFyYXRlIDgtYml0IGFjY2Vzc2VzLCBhcyB0aGUgbWVtb3J5IGlzIHNvIHJhcmVseSBpbiB0aGUKLSAqIEwxIGNhY2hlLgotICoKLSAqIFRoZSB3aW5kb3cgYnVmZmVyLCBob3dldmVyLCBhcHBhcmVudGx5IHNwZW5kcyBhIGxvdCBvZiB0aW1lIGluIHRoZQotICogY2FjaGUsIGFuZCBzbyBpdCBpcyBmYXN0ZXIgdG8gcmV0cmlldmUgdGhlIHdvcmQgYXQgdGhlIGVuZCBvZiB0aGUKLSAqIG1hdGNoIHN0cmluZyB3aXRoIHR3byA4LWJpdCBsb2Fkcy4gVGhlIGluc3RydWN0aW9ucyB0aGF0IHRlc3QgdGhlCi0gKiB3b3JkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hdGNoIHN0cmluZywgaG93ZXZlciwgYXJlIGV4ZWN1dGVkCi0gKiBtdWNoIGxlc3MgZnJlcXVlbnRseSwgYW5kIHRoZXJlIGl0IHdhcyBjaGVhcGVyIHRvIHVzZSAxNi1iaXQKLSAqIGluc3RydWN0aW9ucywgd2hpY2ggYXZvaWRlZCB0aGUgbmVjZXNzaXR5IG9mIHNhdmluZyBvZmYgYW5kCi0gKiBzdWJzZXF1ZW50bHkgcmVsb2FkaW5nIG9uZSBvZiB0aGUgb3RoZXIgcmVnaXN0ZXJzLgotICovCi1Mb29rdXBMb29wOgotCQkJCQkJCS8qIDEgVSAmIFYgICovCi0JCW1vdncJKCVlZGksJWVkeCwyKSwgJWN4CQkvKiAyIFUgcGlwZSAqLwotCQltb3ZsCXdtYXNrKCVlc3ApLCAlZWR4CQkvKiAyIFYgcGlwZSAqLwotCQljbXBsCSVlYnAsICVlY3gJCQkvKiAzIFUgcGlwZSAqLwotCQlqYmUJTGVhdmVOb3cJCQkvKiAzIFYgcGlwZSAqLwotCQlzdWJsCSQweDAwMDEwMDAwLCAlZWJ4CQkvKiA0IFUgcGlwZSAqLwotCQlqcwlMZWF2ZU5vdwkJCS8qIDQgViBwaXBlICovCi1Mb29wRW50cnk6CW1vdmIJLTEoJWVzaSwlZWN4KSwgJWFsCQkvKiA1IFUgcGlwZSAqLwotCQlhbmRsCSVlY3gsICVlZHgJCQkvKiA1IFYgcGlwZSAqLwotCQljbXBiCSVibCwgJWFsCQkJLyogNiBVIHBpcGUgKi8KLQkJam56CUxvb2t1cExvb3AJCQkvKiA2IFYgcGlwZSAqLwotCQltb3ZiCSglZXNpLCVlY3gpLCAlYWgKLQkJY21wYgklYmgsICVhaAotCQlqbnoJTG9va3VwTG9vcAotCQltb3ZsCXdpbmRvdyglZXNwKSwgJWVheAotCQltb3Z3CSglZWF4LCVlY3gpLCAlYXgKLQkJY21wdwlzY2Fuc3RhcnQoJWVzcCksICVheAotCQlqbnoJTG9va3VwTG9vcAotCi0vKiBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4JCQkJCSovCi0KLQkJbW92bAklZWJ4LCBjaGFpbmxlbnNjYW5lbmQoJWVzcCkKLQotLyogUG9pbnQgJWVkaSB0byB0aGUgc3RyaW5nIHVuZGVyIHNjcnV0aW55LCBhbmQgJWVzaSB0byB0aGUgc3RyaW5nIHdlCSovCi0vKiBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgJWVzaSBhbmQgJWVkaSBhcmUJKi8KLS8qIGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgJWVkeCBpcwkqLwotLyogaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuCQkJCSovCi0KLQkJbW92bAl3aW5kb3coJWVzcCksICVlc2kKLQkJbW92bAlzY2FuKCVlc3ApLCAlZWRpCi0JCWFkZGwJJWVjeCwgJWVzaQotCQltb3ZsCXNjYW5hbGlnbiglZXNwKSwgJWVheAotCQltb3ZsCSQoLU1BWF9NQVRDSF84KSwgJWVkeAotCQlsZWEJTUFYX01BVENIXzgoJWVkaSwlZWF4KSwgJWVkaQotCQlsZWEJTUFYX01BVENIXzgoJWVzaSwlZWF4KSwgJWVzaQotCi0vKiBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsCi0gKiBhZGp1c3QgJWVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuCi0gKgotICogV2UgYWxyZWFkeSBrbm93IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlCi0gKiBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlCi0gKiBzdGFydGluZyB0aGUgY29tcGFyZSBsb29wLiBTbyB3aGF0IHRoaXMgY29kZSBkb2VzIGlzIHNraXAgb3ZlciAwLTMKLSAqIGJ5dGVzLCBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBkd29yZC1hbGlnbiB0aGUgJWVkaQotICogcG9pbnRlci4gKCVlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikKLSAqCi0gKiBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50Ci0gKiBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQotICogc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlCi0gKiBwZXJmb3JtYW5jZS4KLSAqLwotTG9vcENtcHM6Ci0JCW1vdmwJKCVlc2ksJWVkeCksICVlYXgKLQkJbW92bAkoJWVkaSwlZWR4KSwgJWVieAotCQl4b3JsCSVlYngsICVlYXgKLQkJam56CUxlYXZlTG9vcENtcHMKLQkJbW92bAk0KCVlc2ksJWVkeCksICVlYXgKLQkJbW92bAk0KCVlZGksJWVkeCksICVlYngKLQkJeG9ybAklZWJ4LCAlZWF4Ci0JCWpueglMZWF2ZUxvb3BDbXBzNAotCQlhZGRsCSQ4LCAlZWR4Ci0JCWpueglMb29wQ21wcwotCQlqbXAJTGVuTWF4aW11bQotTGVhdmVMb29wQ21wczQ6CWFkZGwJJDQsICVlZHgKLUxlYXZlTG9vcENtcHM6CXRlc3RsCSQweDAwMDBGRkZGLCAlZWF4Ci0JCWpueglMZW5Mb3dlcgotCQlhZGRsCSQyLCAlZWR4Ci0JCXNocmwJJDE2LCAlZWF4Ci1MZW5Mb3dlcjoJc3ViYgkkMSwgJWFsCi0JCWFkY2wJJDAsICVlZHgKLQotLyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsCSovCi0vKiB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4JKi8KLQotCQlsZWEJKCVlZGksJWVkeCksICVlYXgKLQkJbW92bAlzY2FuKCVlc3ApLCAlZWRpCi0JCXN1YmwJJWVkaSwgJWVheAotCQljbXBsCSRNQVhfTUFUQ0gsICVlYXgKLQkJamdlCUxlbk1heGltdW0KLQotLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbm90IGxvbmdlciB0aGFuIHRoZSBiZXN0IG1hdGNoIHdlCSovCi0vKiBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuCQkqLwotCi0JCW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4Ci0JCW1vdmwJYmVzdGxlbiglZXNwKSwgJWVieAotCQljbXBsCSVlYngsICVlYXgKLQkJamcJTG9uZ2VyTWF0Y2gKLQkJbW92bAljaGFpbmxlbnNjYW5lbmQoJWVzcCksICVlYngKLQkJbW92bAl3aW5kb3diZXN0bGVuKCVlc3ApLCAlZXNpCi0JCW1vdmwJZHNQcmV2KCVlZHgpLCAlZWRpCi0JCW1vdmwJd21hc2soJWVzcCksICVlZHgKLQkJYW5kbAklZWN4LCAlZWR4Ci0JCWptcAlMb29rdXBMb29wCi0KLS8qICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CQkJCQkqLwotLyogICAgICAgICBiZXN0X2xlbiA9IGxlbjsJCQkJCQkqLwotLyogICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOwkJCQkqLwotLyogICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CQkJKi8KLQotTG9uZ2VyTWF0Y2g6CW1vdmwJbmljZW1hdGNoKCVlc3ApLCAlZWJ4Ci0JCW1vdmwJJWVheCwgYmVzdGxlbiglZXNwKQotCQltb3ZsCSVlY3gsIGRzTWF0Y2hTdGFydCglZWR4KQotCQljbXBsCSVlYngsICVlYXgKLQkJamdlCUxlYXZlTm93Ci0JCW1vdmwJd2luZG93KCVlc3ApLCAlZXNpCi0JCWFkZGwJJWVheCwgJWVzaQotCQltb3ZsCSVlc2ksIHdpbmRvd2Jlc3RsZW4oJWVzcCkKLQkJbW92bAljaGFpbmxlbnNjYW5lbmQoJWVzcCksICVlYngKLQkJbW92dwktMSglZWRpLCVlYXgpLCAlYngKLQkJbW92bAlkc1ByZXYoJWVkeCksICVlZGkKLQkJbW92bAklZWJ4LCBjaGFpbmxlbnNjYW5lbmQoJWVzcCkKLQkJbW92bAl3bWFzayglZXNwKSwgJWVkeAotCQlhbmRsCSVlY3gsICVlZHgKLQkJam1wCUxvb2t1cExvb3AKLQotLyogQWNjZXB0IHRoZSBjdXJyZW50IHN0cmluZywgd2l0aCB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGguCQkqLwotCi1MZW5NYXhpbXVtOgltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAotCQltb3ZsCSRNQVhfTUFUQ0gsIGJlc3RsZW4oJWVzcCkKLQkJbW92bAklZWN4LCBkc01hdGNoU3RhcnQoJWVkeCkKLQotLyogaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOwkJKi8KLS8qIHJldHVybiBzLT5sb29rYWhlYWQ7CQkJCQkJCSovCi0KLUxlYXZlTm93OgotCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAotCQltb3ZsCWJlc3RsZW4oJWVzcCksICVlYngKLQkJbW92bAlkc0xvb2thaGVhZCglZWR4KSwgJWVheAotCQljbXBsCSVlYXgsICVlYngKLQkJamcJTG9va2FoZWFkUmV0Ci0JCW1vdmwJJWVieCwgJWVheAotTG9va2FoZWFkUmV0OgotCi0vKiBSZXN0b3JlIHRoZSBzdGFjayBhbmQgcmV0dXJuIGZyb20gd2hlbmNlIHdlIGNhbWUuCQkJKi8KLQotCQlhZGRsCSRMb2NhbFZhcnNTaXplLCAlZXNwCi0JCXBvcGwJJWVieAotCQlwb3BsCSVlc2kKLQkJcG9wbAklZWRpCi0JCXBvcGwJJWVicAotbWF0Y2hfaW5pdDoJcmV0CmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9hc202ODYvUkVBRE1FLjY4NiBiL2xpYnMvemxpYi9jb250cmliL2FzbTY4Ni9SRUFETUUuNjg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTkzZjIzLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2FzbTY4Ni9SRUFETUUuNjg2CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotVGhpcyBpcyBhIHBhdGNoZWQgdmVyc2lvbiBvZiB6bGliLCBtb2RpZmllZCB0byB1c2UKLVBlbnRpdW0tUHJvLW9wdGltaXplZCBhc3NlbWJseSBjb2RlIGluIHRoZSBkZWZsYXRpb24gYWxnb3JpdGhtLiBUaGUKLWZpbGVzIGNoYW5nZWQvYWRkZWQgYnkgdGhpcyBwYXRjaCBhcmU6Ci0KLVJFQURNRS42ODYKLW1hdGNoLlMKLQotVGhlIHNwZWVkdXAgdGhhdCB0aGlzIHBhdGNoIHByb3ZpZGVzIHZhcmllcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlCi1jb21waWxlciB1c2VkIHRvIGJ1aWxkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHpsaWIgZmFsbHMgYWZvdWwgb2YgdGhlCi1QUHJvJ3Mgc3BlZWQgdHJhcHMuIE15IG93biB0ZXN0cyBzaG93IGEgc3BlZWR1cCBvZiBhcm91bmQgMTAtMjAlIGF0Ci10aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCwgYW5kIDIwLTMwJSB1c2luZyAtOSwgYWdhaW5zdCBhIHZlcnNpb24KLWNvbXBpbGVkIHVzaW5nIGdjYyAyLjcuMi4zLiBZb3VyIG1pbGVhZ2UgbWF5IHZhcnkuCi0KLU5vdGUgdGhhdCB0aGlzIGNvZGUgaGFzIGJlZW4gdGFpbG9yZWQgZm9yIHRoZSBQUHJvL1BJSSBpbiBwYXJ0aWN1bGFyLAotYW5kIHdpbGwgbm90IHBlcmZvcm0gcGFydGljdWFybHkgd2VsbCBvbiBhIFBlbnRpdW0uCi0KLUlmIHlvdSBhcmUgdXNpbmcgYW4gYXNzZW1ibGVyIG90aGVyIHRoYW4gR05VIGFzLCB5b3Ugd2lsbCBoYXZlIHRvCi10cmFuc2xhdGUgbWF0Y2guUyB0byB1c2UgeW91ciBhc3NlbWJsZXIncyBzeW50YXguIChIYXZlIGZ1bi4pCi0KLUJyaWFuIFJhaXRlcgotYnJlYWRib3hAbXVwcGV0bGFicy5jb20KLUFwcmlsLCAxOTk4Ci0KLQotQWRkZWQgZm9yIHpsaWIgMS4xLjM6Ci0KLVRoZSBwYXRjaGVzIGNvbWUgZnJvbQotaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAotCi1UbyBjb21waWxlIHpsaWIgd2l0aCB0aGlzIGFzbSBmaWxlLCBjb3B5IG1hdGNoLlMgdG8gdGhlIHpsaWIgZGlyZWN0b3J5Ci10aGVuIGRvOgotCi1DRkxBR1M9Ii1PMyAtREFTTVYiIC4vY29uZmlndXJlCi1tYWtlIE9CSkE9bWF0Y2gubwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvYXNtNjg2L21hdGNoLlMgYi9saWJzL3psaWIvY29udHJpYi9hc202ODYvbWF0Y2guUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzZTllZS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9hc202ODYvbWF0Y2guUworKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKiBtYXRjaC5zIC0tIFBlbnRpdW0tUHJvLW9wdGltaXplZCB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2goKQotICogV3JpdHRlbiBmb3IgemxpYiAxLjEuMgotICogQ29weXJpZ2h0IChDKSAxOTk4IEJyaWFuIFJhaXRlciA8YnJlYWRib3hAbXVwcGV0bGFicy5jb20+Ci0gKgotICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTk9fVU5ERVJMSU5FCi0jZGVmaW5lCW1hdGNoX2luaXQJX21hdGNoX2luaXQKLSNkZWZpbmUJbG9uZ2VzdF9tYXRjaAlfbG9uZ2VzdF9tYXRjaAotI2VuZGlmCi0KLSNkZWZpbmUJTUFYX01BVENICSgyNTgpCi0jZGVmaW5lCU1JTl9NQVRDSAkoMykKLSNkZWZpbmUJTUlOX0xPT0tBSEVBRAkoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkKLSNkZWZpbmUJTUFYX01BVENIXzgJKChNQVhfTUFUQ0ggKyA3KSAmIH43KQotCi0vKiBzdGFjayBmcmFtZSBvZmZzZXRzICovCi0KLSNkZWZpbmUJY2hhaW5sZW53bWFzawkJMAkvKiBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuCSovCi0JCQkJCS8qIGxvdyB3b3JkOiBzLT53bWFzawkJKi8KLSNkZWZpbmUJd2luZG93CQkJNAkvKiBsb2NhbCBjb3B5IG9mIHMtPndpbmRvdwkqLwotI2RlZmluZQl3aW5kb3diZXN0bGVuCQk4CS8qIHMtPndpbmRvdyArIGJlc3RsZW4JCSovCi0jZGVmaW5lCXNjYW5zdGFydAkJMTYJLyogZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZwkqLwotI2RlZmluZQlzY2FuZW5kCQkJMTIJLyogbGFzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nCSovCi0jZGVmaW5lCXNjYW5hbGlnbgkJMjAJLyogZHdvcmQtbWlzYWxpZ25tZW50IG9mIHN0cmluZwkqLwotI2RlZmluZQluaWNlbWF0Y2gJCTI0CS8qIGEgZ29vZCBlbm91Z2ggbWF0Y2ggc2l6ZQkqLwotI2RlZmluZQliZXN0bGVuCQkJMjgJLyogc2l6ZSBvZiBiZXN0IG1hdGNoIHNvIGZhcgkqLwotI2RlZmluZQlzY2FuCQkJMzIJLyogcHRyIHRvIHN0cmluZyB3YW50aW5nIG1hdGNoCSovCi0KLSNkZWZpbmUJTG9jYWxWYXJzU2l6ZQkJKDM2KQotLyoJc2F2ZWQgZWJ4CQkzNiAqLwotLyoJc2F2ZWQgZWRpCQk0MCAqLwotLyoJc2F2ZWQgZXNpCQk0NCAqLwotLyoJc2F2ZWQgZWJwCQk0OCAqLwotLyoJcmV0dXJuIGFkZHJlc3MJCTUyICovCi0jZGVmaW5lCWRlZmxhdGVzdGF0ZQkJNTYJLyogdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwkqLwotI2RlZmluZQljdXJtYXRjaAkJNjAKLQotLyogQWxsIHRoZSAremxpYjEyMjJhZGQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmaWVsZHMKLSAqICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4KLSAqIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHVzZSAiemxpYjEyMjJhZGQgZXF1ICgtNCkiKS4KLSAqIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgYmV0d2VlbiAxLjAuNSBhbmQgMS4yLjIuMSwgdXNlICJ6bGliMTIyMmFkZCBlcXUgMCIpLgotICogaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuCi0gKi8KLQotI2RlZmluZSB6bGliMTIyMmFkZAkJKDgpCi0KLSNkZWZpbmUJZHNXU2l6ZQkJCSgzNit6bGliMTIyMmFkZCkKLSNkZWZpbmUJZHNXTWFzawkJCSg0NCt6bGliMTIyMmFkZCkKLSNkZWZpbmUJZHNXaW5kb3cJCSg0OCt6bGliMTIyMmFkZCkKLSNkZWZpbmUJZHNQcmV2CQkJKDU2K3psaWIxMjIyYWRkKQotI2RlZmluZQlkc01hdGNoTGVuCQkoODgremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzUHJldk1hdGNoCQkoOTIremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzU3RyU3RhcnQJCSgxMDAremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzTWF0Y2hTdGFydAkJKDEwNCt6bGliMTIyMmFkZCkKLSNkZWZpbmUJZHNMb29rYWhlYWQJCSgxMDgremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzUHJldkxlbgkJKDExMit6bGliMTIyMmFkZCkKLSNkZWZpbmUJZHNNYXhDaGFpbkxlbgkJKDExNit6bGliMTIyMmFkZCkKLSNkZWZpbmUJZHNHb29kTWF0Y2gJCSgxMzIremxpYjEyMjJhZGQpCi0jZGVmaW5lCWRzTmljZU1hdGNoCQkoMTM2K3psaWIxMjIyYWRkKQotCi0KLS5maWxlICJtYXRjaC5TIgotCi0uZ2xvYmwJbWF0Y2hfaW5pdCwgbG9uZ2VzdF9tYXRjaAotCi0udGV4dAotCi0vKiB1SW50IGxvbmdlc3RfbWF0Y2goZGVmbGF0ZV9zdGF0ZSAqZGVmbGF0ZXN0YXRlLCBJUG9zIGN1cm1hdGNoKSAqLwotCi1sb25nZXN0X21hdGNoOgotCi0vKiBTYXZlIHJlZ2lzdGVycyB0aGF0IHRoZSBjb21waWxlciBtYXkgYmUgdXNpbmcsIGFuZCBhZGp1c3QgJWVzcCB0bwkqLwotLyogbWFrZSByb29tIGZvciBvdXIgc3RhY2sgZnJhbWUuCQkJCQkqLwotCi0JCXB1c2hsCSVlYnAKLQkJcHVzaGwJJWVkaQotCQlwdXNobAklZXNpCi0JCXB1c2hsCSVlYngKLQkJc3VibAkkTG9jYWxWYXJzU2l6ZSwgJWVzcAotCi0vKiBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiAlZWN4IHdpbGwgaG9sZCBjdXJfbWF0Y2gJCSovCi0vKiB0aHJvdWdob3V0IHRoZSBlbnRpcmUgZnVuY3Rpb24uICVlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQkqLwotLyogZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBmdW5jdGlvbidzIHNldHVwIChiZWZvcmUJCSovCi0vKiBlbnRlcmluZyB0aGUgbWFpbiBsb29wKS4JCQkJCQkqLwotCi0JCW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4Ci0JCW1vdmwJY3VybWF0Y2goJWVzcCksICVlY3gKLQotLyogdUludCB3bWFzayA9IHMtPndfbWFzazsJCQkJCQkqLwotLyogdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsJCQkJKi8KLS8qIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7CQkJCSovCi0vKiAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOwkJCQkJCSovCi0vKiB9CQkJCQkJCQkJKi8KLQotCQltb3ZsCWRzUHJldkxlbiglZWR4KSwgJWVheAotCQltb3ZsCWRzR29vZE1hdGNoKCVlZHgpLCAlZWJ4Ci0JCWNtcGwJJWVieCwgJWVheAotCQltb3ZsCWRzV01hc2soJWVkeCksICVlYXgKLQkJbW92bAlkc01heENoYWluTGVuKCVlZHgpLCAlZWJ4Ci0JCWpsCUxhc3RNYXRjaEdvb2QKLQkJc2hybAkkMiwgJWVieAotTGFzdE1hdGNoR29vZDoKLQotLyogY2hhaW5sZW4gaXMgZGVjcmVtZW50ZWQgb25jZSBiZWZvcmVoYW5kIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbgkqLwotLyogdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0LgkqLwotLyogSXQgaXMgdGhlbiBzaGlmdGVkIGludG8gdGhlIGhpZ2ggd29yZCwgdG8gbWFrZSByb29tIGZvciB0aGUgd21hc2sJKi8KLS8qIHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuCQkJCSovCi0KLQkJZGVjbAklZWJ4Ci0JCXNobGwJJDE2LCAlZWJ4Ci0JCW9ybAklZWF4LCAlZWJ4Ci0JCW1vdmwJJWVieCwgY2hhaW5sZW53bWFzayglZXNwKQotCi0vKiBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsJKi8KLQotCQltb3ZsCWRzTmljZU1hdGNoKCVlZHgpLCAlZWF4Ci0JCW1vdmwJZHNMb29rYWhlYWQoJWVkeCksICVlYngKLQkJY21wbAklZWF4LCAlZWJ4Ci0JCWpsCUxvb2thaGVhZExlc3MKLQkJbW92bAklZWF4LCAlZWJ4Ci1Mb29rYWhlYWRMZXNzOgltb3ZsCSVlYngsIG5pY2VtYXRjaCglZXNwKQotCi0vKiByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OwkJCSovCi0KLQkJbW92bAlkc1dpbmRvdyglZWR4KSwgJWVzaQotCQltb3ZsCSVlc2ksIHdpbmRvdyglZXNwKQotCQltb3ZsCWRzU3RyU3RhcnQoJWVkeCksICVlYnAKLQkJbGVhCSglZXNpLCVlYnApLCAlZWRpCi0JCW1vdmwJJWVkaSwgc2NhbiglZXNwKQotCi0vKiBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nCQkqLwotLyogZHdvcmQtYWxpZ25lZC4JCQkJCQkJKi8KLQotCQltb3ZsCSVlZGksICVlYXgKLQkJbmVnbAklZWF4Ci0JCWFuZGwJJDMsICVlYXgKLQkJbW92bAklZWF4LCBzY2FuYWxpZ24oJWVzcCkKLQotLyogSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPwkJCSovCi0vKiAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsJCQkJKi8KLQotCQltb3ZsCWRzV1NpemUoJWVkeCksICVlYXgKLQkJc3VibAkkTUlOX0xPT0tBSEVBRCwgJWVheAotCQlzdWJsCSVlYXgsICVlYnAKLQkJamcJTGltaXRQb3NpdGl2ZQotCQl4b3JsCSVlYnAsICVlYnAKLUxpbWl0UG9zaXRpdmU6Ci0KLS8qIGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOwkJCQkJKi8KLQotCQltb3ZsCWRzUHJldkxlbiglZWR4KSwgJWVheAotCQltb3ZsCSVlYXgsIGJlc3RsZW4oJWVzcCkKLQotLyogU3RvcmUgdGhlIHN1bSBvZiBzLT53aW5kb3cgKyBiZXN0X2xlbiBpbiAlZXNpIGxvY2FsbHksIGFuZCBpbiAlZXNpLgkqLwotCi0JCWFkZGwJJWVheCwgJWVzaQotCQltb3ZsCSVlc2ksIHdpbmRvd2Jlc3RsZW4oJWVzcCkKLQotLyogcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaGYqKXNjYW47CQkJCSovCi0vKiByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CQkJKi8KLS8qIFBvc2YgKnByZXYgPSBzLT5wcmV2OwkJCQkJCSovCi0KLQkJbW92endsCSglZWRpKSwgJWVieAotCQltb3ZsCSVlYngsIHNjYW5zdGFydCglZXNwKQotCQltb3Z6d2wJLTEoJWVkaSwlZWF4KSwgJWVieAotCQltb3ZsCSVlYngsIHNjYW5lbmQoJWVzcCkKLQkJbW92bAlkc1ByZXYoJWVkeCksICVlZGkKLQotLyogSnVtcCBpbnRvIHRoZSBtYWluIGxvb3AuCQkJCQkJKi8KLQotCQltb3ZsCWNoYWlubGVud21hc2soJWVzcCksICVlZHgKLQkJam1wCUxvb3BFbnRyeQotCi0uYmFsaWduIDE2Ci0KLS8qIGRvIHsKLSAqICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKLSAqICAgICBpZiAoKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwKLSAqICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKLSAqICAgICBbLi4uXQotICogfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0Ci0gKiAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsKLSAqCi0gKiBIZXJlIGlzIHRoZSBpbm5lciBsb29wIG9mIHRoZSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIHdpbGwgc3BlbmQgdGhlCi0gKiBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbAotICogYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuCi0gKgotICogV2l0aGluIHRoaXMgbG9vcDoKLSAqICVlYnggPSBzY2FuZW5kCi0gKiAlZWN4ID0gY3VybWF0Y2gKLSAqICVlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykKLSAqICVlc2kgPSB3aW5kb3diZXN0bGVuIC0gaS5lLiwgKHdpbmRvdyArIGJlc3RsZW4pCi0gKiAlZWRpID0gcHJldgotICogJWVicCA9IGxpbWl0Ci0gKi8KLUxvb2t1cExvb3A6Ci0JCWFuZGwJJWVkeCwgJWVjeAotCQltb3Z6d2wJKCVlZGksJWVjeCwyKSwgJWVjeAotCQljbXBsCSVlYnAsICVlY3gKLQkJamJlCUxlYXZlTm93Ci0JCXN1YmwJJDB4MDAwMTAwMDAsICVlZHgKLQkJanMJTGVhdmVOb3cKLUxvb3BFbnRyeToJbW92endsCS0xKCVlc2ksJWVjeCksICVlYXgKLQkJY21wbAklZWJ4LCAlZWF4Ci0JCWpueglMb29rdXBMb29wCi0JCW1vdmwJd2luZG93KCVlc3ApLCAlZWF4Ci0JCW1vdnp3bAkoJWVheCwlZWN4KSwgJWVheAotCQljbXBsCXNjYW5zdGFydCglZXNwKSwgJWVheAotCQlqbnoJTG9va3VwTG9vcAotCi0vKiBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4JCQkJCSovCi0KLQkJbW92bAklZWR4LCBjaGFpbmxlbndtYXNrKCVlc3ApCi0KLS8qIFBvaW50ICVlZGkgdG8gdGhlIHN0cmluZyB1bmRlciBzY3J1dGlueSwgYW5kICVlc2kgdG8gdGhlIHN0cmluZyB3ZQkqLwotLyogYXJlIGhvcGluZyB0byBtYXRjaCBpdCB1cCB3aXRoLiBJbiBhY3R1YWxpdHksICVlc2kgYW5kICVlZGkgYXJlCSovCi0vKiBib3RoIHBvaW50ZWQgKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKSBieXRlcyBhaGVhZCwgYW5kICVlZHggaXMJKi8KLS8qIGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLgkJCQkqLwotCi0JCW1vdmwJd2luZG93KCVlc3ApLCAlZXNpCi0JCW1vdmwJc2NhbiglZXNwKSwgJWVkaQotCQlhZGRsCSVlY3gsICVlc2kKLQkJbW92bAlzY2FuYWxpZ24oJWVzcCksICVlYXgKLQkJbW92bAkkKC1NQVhfTUFUQ0hfOCksICVlZHgKLQkJbGVhCU1BWF9NQVRDSF84KCVlZGksJWVheCksICVlZGkKLQkJbGVhCU1BWF9NQVRDSF84KCVlc2ksJWVheCksICVlc2kKLQotLyogVGVzdCB0aGUgc3RyaW5ncyBmb3IgZXF1YWxpdHksIDggYnl0ZXMgYXQgYSB0aW1lLiBBdCB0aGUgZW5kLAotICogYWRqdXN0ICVlZHggc28gdGhhdCBpdCBpcyBvZmZzZXQgdG8gdGhlIGV4YWN0IGJ5dGUgdGhhdCBtaXNtYXRjaGVkLgotICoKLSAqIFdlIGFscmVhZHkga25vdyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQotICogc3RyaW5ncyBtYXRjaCBlYWNoIG90aGVyLCBhbmQgdGhleSBjYW4gYmUgc2FmZWx5IHBhc3NlZCBvdmVyIGJlZm9yZQotICogc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zCi0gKiBieXRlcywgYXMgbXVjaCBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gZHdvcmQtYWxpZ24gdGhlICVlZGkKLSAqIHBvaW50ZXIuICglZXNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pCi0gKgotICogSXQgc2hvdWxkIGJlIGNvbmZlc3NlZCB0aGF0IHRoaXMgbG9vcCB1c3VhbGx5IGRvZXMgbm90IHJlcHJlc2VudAotICogbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUKLSAqIHN0cmFpZ2h0Zm9yd2FyZCAicmVwIGNtcHNiIiB3b3VsZCBub3QgZHJhc3RpY2FsbHkgZGVncmFkZQotICogcGVyZm9ybWFuY2UuCi0gKi8KLUxvb3BDbXBzOgotCQltb3ZsCSglZXNpLCVlZHgpLCAlZWF4Ci0JCXhvcmwJKCVlZGksJWVkeCksICVlYXgKLQkJam56CUxlYXZlTG9vcENtcHMKLQkJbW92bAk0KCVlc2ksJWVkeCksICVlYXgKLQkJeG9ybAk0KCVlZGksJWVkeCksICVlYXgKLQkJam56CUxlYXZlTG9vcENtcHM0Ci0JCWFkZGwJJDgsICVlZHgKLQkJam56CUxvb3BDbXBzCi0JCWptcAlMZW5NYXhpbXVtCi1MZWF2ZUxvb3BDbXBzNDoJYWRkbAkkNCwgJWVkeAotTGVhdmVMb29wQ21wczoJdGVzdGwJJDB4MDAwMEZGRkYsICVlYXgKLQkJam56CUxlbkxvd2VyCi0JCWFkZGwJJDIsICVlZHgKLQkJc2hybAkkMTYsICVlYXgKLUxlbkxvd2VyOglzdWJiCSQxLCAlYWwKLQkJYWRjbAkkMCwgJWVkeAotCi0vKiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2guIElmIGl0IGlzIGxvbmdlciB0aGFuIE1BWF9NQVRDSCwJKi8KLS8qIHRoZW4gYXV0b21hdGljYWxseSBhY2NlcHQgaXQgYXMgdGhlIGJlc3QgcG9zc2libGUgbWF0Y2ggYW5kIGxlYXZlLgkqLwotCi0JCWxlYQkoJWVkaSwlZWR4KSwgJWVheAotCQltb3ZsCXNjYW4oJWVzcCksICVlZGkKLQkJc3VibAklZWRpLCAlZWF4Ci0JCWNtcGwJJE1BWF9NQVRDSCwgJWVheAotCQlqZ2UJTGVuTWF4aW11bQotCi0vKiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBub3QgbG9uZ2VyIHRoYW4gdGhlIGJlc3QgbWF0Y2ggd2UJKi8KLS8qIGhhdmUgc28gZmFyLCB0aGVuIGZvcmdldCBpdCBhbmQgcmV0dXJuIHRvIHRoZSBsb29rdXAgbG9vcC4JCSovCi0KLQkJbW92bAlkZWZsYXRlc3RhdGUoJWVzcCksICVlZHgKLQkJbW92bAliZXN0bGVuKCVlc3ApLCAlZWJ4Ci0JCWNtcGwJJWVieCwgJWVheAotCQlqZwlMb25nZXJNYXRjaAotCQltb3ZsCXdpbmRvd2Jlc3RsZW4oJWVzcCksICVlc2kKLQkJbW92bAlkc1ByZXYoJWVkeCksICVlZGkKLQkJbW92bAlzY2FuZW5kKCVlc3ApLCAlZWJ4Ci0JCW1vdmwJY2hhaW5sZW53bWFzayglZXNwKSwgJWVkeAotCQlqbXAJTG9va3VwTG9vcAotCi0vKiAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOwkJCQkJKi8KLS8qICAgICAgICAgYmVzdF9sZW4gPSBsZW47CQkJCQkJKi8KLS8qICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsJCQkJKi8KLS8qICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwkJCSovCi0KLUxvbmdlck1hdGNoOgltb3ZsCW5pY2VtYXRjaCglZXNwKSwgJWVieAotCQltb3ZsCSVlYXgsIGJlc3RsZW4oJWVzcCkKLQkJbW92bAklZWN4LCBkc01hdGNoU3RhcnQoJWVkeCkKLQkJY21wbAklZWJ4LCAlZWF4Ci0JCWpnZQlMZWF2ZU5vdwotCQltb3ZsCXdpbmRvdyglZXNwKSwgJWVzaQotCQlhZGRsCSVlYXgsICVlc2kKLQkJbW92bAklZXNpLCB3aW5kb3diZXN0bGVuKCVlc3ApCi0JCW1vdnp3bAktMSglZWRpLCVlYXgpLCAlZWJ4Ci0JCW1vdmwJZHNQcmV2KCVlZHgpLCAlZWRpCi0JCW1vdmwJJWVieCwgc2NhbmVuZCglZXNwKQotCQltb3ZsCWNoYWlubGVud21hc2soJWVzcCksICVlZHgKLQkJam1wCUxvb2t1cExvb3AKLQotLyogQWNjZXB0IHRoZSBjdXJyZW50IHN0cmluZywgd2l0aCB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGguCQkqLwotCi1MZW5NYXhpbXVtOgltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAotCQltb3ZsCSRNQVhfTUFUQ0gsIGJlc3RsZW4oJWVzcCkKLQkJbW92bAklZWN4LCBkc01hdGNoU3RhcnQoJWVkeCkKLQotLyogaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOwkJKi8KLS8qIHJldHVybiBzLT5sb29rYWhlYWQ7CQkJCQkJCSovCi0KLUxlYXZlTm93OgotCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAotCQltb3ZsCWJlc3RsZW4oJWVzcCksICVlYngKLQkJbW92bAlkc0xvb2thaGVhZCglZWR4KSwgJWVheAotCQljbXBsCSVlYXgsICVlYngKLQkJamcJTG9va2FoZWFkUmV0Ci0JCW1vdmwJJWVieCwgJWVheAotTG9va2FoZWFkUmV0OgotCi0vKiBSZXN0b3JlIHRoZSBzdGFjayBhbmQgcmV0dXJuIGZyb20gd2hlbmNlIHdlIGNhbWUuCQkJKi8KLQotCQlhZGRsCSRMb2NhbFZhcnNTaXplLCAlZXNwCi0JCXBvcGwJJWVieAotCQlwb3BsCSVlc2kKLQkJcG9wbAklZWRpCi0JCXBvcGwJJWVicAotbWF0Y2hfaW5pdDoJcmV0CmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9ibGFzdC9SRUFETUUgYi9saWJzL3psaWIvY29udHJpYi9ibGFzdC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTYwYjMuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvYmxhc3QvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1SZWFkIGJsYXN0LmggZm9yIHB1cnBvc2UgYW5kIHVzYWdlLgotCi1NYXJrIEFkbGVyCi1tYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9ibGFzdC9ibGFzdC5jIGIvbGlicy96bGliL2NvbnRyaWIvYmxhc3QvYmxhc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlNjk3YS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9ibGFzdC9ibGFzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ0ICswLDAgQEAKLS8qIGJsYXN0LmMKLSAqIENvcHlyaWdodCAoQykgMjAwMyBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gYmxhc3QuaAotICogdmVyc2lvbiAxLjEsIDE2IEZlYiAyMDAzCi0gKgotICogYmxhc3QuYyBkZWNvbXByZXNzZXMgZGF0YSBjb21wcmVzc2VkIGJ5IHRoZSBQS1dhcmUgQ29tcHJlc3Npb24gTGlicmFyeS4KLSAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIHRoZSBleHBsb2RlKCkgZnVuY3Rpb24gb2YKLSAqIHRoZSBQS1dhcmUgbGlicmFyeSwgaGVuY2UgdGhlIG5hbWUgImJsYXN0Ii4KLSAqCi0gKiBUaGlzIGRlY29tcHJlc3NvciBpcyBiYXNlZCBvbiB0aGUgZXhjZWxsZW50IGZvcm1hdCBkZXNjcmlwdGlvbiBwcm92aWRlZCBieQotICogQmVuIFJ1ZGlhay1Hb3VsZCBpbiBjb21wLmNvbXByZXNzaW9uIG9uIEF1Z3VzdCAxMywgMjAwMS4gIEludGVyZXN0aW5nbHksIHRoZQotICogZXhhbXBsZSBCZW4gcHJvdmlkZWQgaW4gdGhlIHBvc3QgaXMgaW5jb3JyZWN0LiAgVGhlIGRpc3RhbmNlIDExMDAwMSBzaG91bGQKLSAqIGluc3RlYWQgYmUgMTExMDAwLiAgV2hlbiBjb3JyZWN0ZWQsIHRoZSBleGFtcGxlIGJ5dGUgc3RyZWFtIGJlY29tZXM6Ci0gKgotICogICAgMDAgMDQgODIgMjQgMjUgOGYgODAgN2YKLSAqCi0gKiB3aGljaCBkZWNvbXByZXNzZXMgdG8gIkFJQUlBSUFJQUlBSUEiICh3aXRob3V0IHRoZSBxdW90ZXMpLgotICovCi0KLS8qCi0gKiBDaGFuZ2UgaGlzdG9yeToKLSAqCi0gKiAxLjAgIDEyIEZlYiAyMDAzICAgICAtIEZpcnN0IHZlcnNpb24KLSAqIDEuMSAgMTYgRmViIDIwMDMgICAgIC0gRml4ZWQgZGlzdGFuY2UgY2hlY2sgZm9yID4gNCBHQiB1bmNvbXByZXNzZWQgZGF0YQotICovCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4gICAgICAgICAgICAgLyogZm9yIHNldGptcCgpLCBsb25nam1wKCksIGFuZCBqbXBfYnVmICovCi0jaW5jbHVkZSAiYmxhc3QuaCIgICAgICAgICAgICAgIC8qIHByb3RvdHlwZSBmb3IgYmxhc3QoKSAqLwotCi0jZGVmaW5lIGxvY2FsIHN0YXRpYyAgICAgICAgICAgIC8qIGZvciBsb2NhbCBmdW5jdGlvbiBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBNQVhCSVRTIDEzICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCi0jZGVmaW5lIE1BWFdJTiA0MDk2ICAgICAgICAgICAgIC8qIG1heGltdW0gd2luZG93IHNpemUgKi8KLQotLyogaW5wdXQgYW5kIG91dHB1dCBzdGF0ZSAqLwotc3RydWN0IHN0YXRlIHsKLSAgICAvKiBpbnB1dCBzdGF0ZSAqLwotICAgIGJsYXN0X2luIGluZnVuOyAgICAgICAgICAgICAvKiBpbnB1dCBmdW5jdGlvbiBwcm92aWRlZCBieSB1c2VyICovCi0gICAgdm9pZCAqaW5ob3c7ICAgICAgICAgICAgICAgIC8qIG9wYXF1ZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gaW5mdW4oKSAqLwotICAgIHVuc2lnbmVkIGNoYXIgKmluOyAgICAgICAgICAvKiBuZXh0IGlucHV0IGxvY2F0aW9uICovCi0gICAgdW5zaWduZWQgbGVmdDsgICAgICAgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhdCBpbiAqLwotICAgIGludCBiaXRidWY7ICAgICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gICAgaW50IGJpdGNudDsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLQotICAgIC8qIGlucHV0IGxpbWl0IGVycm9yIHJldHVybiBzdGF0ZSBmb3IgYml0cygpIGFuZCBkZWNvZGUoKSAqLwotICAgIGptcF9idWYgZW52OwotCi0gICAgLyogb3V0cHV0IHN0YXRlICovCi0gICAgYmxhc3Rfb3V0IG91dGZ1bjsgICAgICAgICAgIC8qIG91dHB1dCBmdW5jdGlvbiBwcm92aWRlZCBieSB1c2VyICovCi0gICAgdm9pZCAqb3V0aG93OyAgICAgICAgICAgICAgIC8qIG9wYXF1ZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gb3V0ZnVuKCkgKi8KLSAgICB1bnNpZ25lZCBuZXh0OyAgICAgICAgICAgICAgLyogaW5kZXggb2YgbmV4dCB3cml0ZSBsb2NhdGlvbiBpbiBvdXRbXSAqLwotICAgIGludCBmaXJzdDsgICAgICAgICAgICAgICAgICAvKiB0cnVlIHRvIGNoZWNrIGRpc3RhbmNlcyAoZm9yIGZpcnN0IDRLKSAqLwotICAgIHVuc2lnbmVkIGNoYXIgb3V0W01BWFdJTl07ICAvKiBvdXRwdXQgYnVmZmVyIGFuZCBzbGlkaW5nIHdpbmRvdyAqLwotfTsKLQotLyoKLSAqIFJldHVybiBuZWVkIGJpdHMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgVGhpcyBhbHdheXMgbGVhdmVzIGxlc3MgdGhhbgotICogZWlnaHQgYml0cyBpbiB0aGUgYnVmZmVyLiAgYml0cygpIHdvcmtzIHByb3Blcmx5IGZvciBuZWVkID09IDAuCi0gKgotICogRm9ybWF0IG5vdGVzOgotICoKLSAqIC0gQml0cyBhcmUgc3RvcmVkIGluIGJ5dGVzIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgbW9zdAotICogICBzaWduaWZpY2FudCBiaXQuICBUaGVyZWZvcmUgYml0cyBhcmUgZHJvcHBlZCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIGJpdAotICogICBidWZmZXIsIHVzaW5nIHNoaWZ0IHJpZ2h0LCBhbmQgbmV3IGJ5dGVzIGFyZSBhcHBlbmRlZCB0byB0aGUgdG9wIG9mIHRoZQotICogICBiaXQgYnVmZmVyLCB1c2luZyBzaGlmdCBsZWZ0LgotICovCi1sb2NhbCBpbnQgYml0cyhzdHJ1Y3Qgc3RhdGUgKnMsIGludCBuZWVkKQotewotICAgIGludCB2YWw7ICAgICAgICAgICAgLyogYml0IGFjY3VtdWxhdG9yICovCi0KLSAgICAvKiBsb2FkIGF0IGxlYXN0IG5lZWQgYml0cyBpbnRvIHZhbCAqLwotICAgIHZhbCA9IHMtPmJpdGJ1ZjsKLSAgICB3aGlsZSAocy0+Yml0Y250IDwgbmVlZCkgewotICAgICAgICBpZiAocy0+bGVmdCA9PSAwKSB7Ci0gICAgICAgICAgICBzLT5sZWZ0ID0gcy0+aW5mdW4ocy0+aW5ob3csICYocy0+aW4pKTsKLSAgICAgICAgICAgIGlmIChzLT5sZWZ0ID09IDApIGxvbmdqbXAocy0+ZW52LCAxKTsgICAgICAgLyogb3V0IG9mIGlucHV0ICovCi0gICAgICAgIH0KLSAgICAgICAgdmFsIHw9IChpbnQpKCoocy0+aW4pKyspIDw8IHMtPmJpdGNudDsgICAgICAgICAgLyogbG9hZCBlaWdodCBiaXRzICovCi0gICAgICAgIHMtPmxlZnQtLTsKLSAgICAgICAgcy0+Yml0Y250ICs9IDg7Ci0gICAgfQotCi0gICAgLyogZHJvcCBuZWVkIGJpdHMgYW5kIHVwZGF0ZSBidWZmZXIsIGFsd2F5cyB6ZXJvIHRvIHNldmVuIGJpdHMgbGVmdCAqLwotICAgIHMtPmJpdGJ1ZiA9IHZhbCA+PiBuZWVkOwotICAgIHMtPmJpdGNudCAtPSBuZWVkOwotCi0gICAgLyogcmV0dXJuIG5lZWQgYml0cywgemVyb2luZyB0aGUgYml0cyBhYm92ZSB0aGF0ICovCi0gICAgcmV0dXJuIHZhbCAmICgoMSA8PCBuZWVkKSAtIDEpOwotfQotCi0vKgotICogSHVmZm1hbiBjb2RlIGRlY29kaW5nIHRhYmxlcy4gIGNvdW50WzEuLk1BWEJJVFNdIGlzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvZgotICogZWFjaCBsZW5ndGgsIHdoaWNoIGZvciBhIGNhbm9uaWNhbCBjb2RlIGFyZSBzdGVwcGVkIHRocm91Z2ggaW4gb3JkZXIuCi0gKiBzeW1ib2xbXSBhcmUgdGhlIHN5bWJvbCB2YWx1ZXMgaW4gY2Fub25pY2FsIG9yZGVyLCB3aGVyZSB0aGUgbnVtYmVyIG9mCi0gKiBlbnRyaWVzIGlzIHRoZSBzdW0gb2YgdGhlIGNvdW50cyBpbiBjb3VudFtdLiAgVGhlIGRlY29kaW5nIHByb2Nlc3MgY2FuIGJlCi0gKiBzZWVuIGluIHRoZSBmdW5jdGlvbiBkZWNvZGUoKSBiZWxvdy4KLSAqLwotc3RydWN0IGh1ZmZtYW4gewotICAgIHNob3J0ICpjb3VudDsgICAgICAgLyogbnVtYmVyIG9mIHN5bWJvbHMgb2YgZWFjaCBsZW5ndGggKi8KLSAgICBzaG9ydCAqc3ltYm9sOyAgICAgIC8qIGNhbm9uaWNhbGx5IG9yZGVyZWQgc3ltYm9scyAqLwotfTsKLQotLyoKLSAqIERlY29kZSBhIGNvZGUgZnJvbSB0aGUgc3RyZWFtIHMgdXNpbmcgaHVmZm1hbiB0YWJsZSBoLiAgUmV0dXJuIHRoZSBzeW1ib2wgb3IKLSAqIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhlcmUgaXMgYW4gZXJyb3IuICBJZiBhbGwgb2YgdGhlIGxlbmd0aHMgYXJlIHplcm8sIGkuZS4KLSAqIGFuIGVtcHR5IGNvZGUsIG9yIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUgYW5kIGFuIGludmFsaWQgY29kZSBpcyByZWNlaXZlZCwKLSAqIHRoZW4gLTkgaXMgcmV0dXJuZWQgYWZ0ZXIgcmVhZGluZyBNQVhCSVRTIGJpdHMuCi0gKgotICogRm9ybWF0IG5vdGVzOgotICoKLSAqIC0gVGhlIGNvZGVzIGFzIHN0b3JlZCBpbiB0aGUgY29tcHJlc3NlZCBkYXRhIGFyZSBiaXQtcmV2ZXJzZWQgcmVsYXRpdmUgdG8KLSAqICAgYSBzaW1wbGUgaW50ZWdlciBvcmRlcmluZyBvZiBjb2RlcyBvZiB0aGUgc2FtZSBsZW5ndGhzLiAgSGVuY2UgYmVsb3cgdGhlCi0gKiAgIGJpdHMgYXJlIHB1bGxlZCBmcm9tIHRoZSBjb21wcmVzc2VkIGRhdGEgb25lIGF0IGEgdGltZSBhbmQgdXNlZCB0bwotICogICBidWlsZCB0aGUgY29kZSB2YWx1ZSByZXZlcnNlZCBmcm9tIHdoYXQgaXMgaW4gdGhlIHN0cmVhbSBpbiBvcmRlciB0bwotICogICBwZXJtaXQgc2ltcGxlIGludGVnZXIgY29tcGFyaXNvbnMgZm9yIGRlY29kaW5nLgotICoKLSAqIC0gVGhlIGZpcnN0IGNvZGUgZm9yIHRoZSBzaG9ydGVzdCBsZW5ndGggaXMgYWxsIG9uZXMuICBTdWJzZXF1ZW50IGNvZGVzIG9mCi0gKiAgIHRoZSBzYW1lIGxlbmd0aCBhcmUgc2ltcGx5IGludGVnZXIgZGVjcmVtZW50cyBvZiB0aGUgcHJldmlvdXMgY29kZS4gIFdoZW4KLSAqICAgbW92aW5nIHVwIGEgbGVuZ3RoLCBhIG9uZSBiaXQgaXMgYXBwZW5kZWQgdG8gdGhlIGNvZGUuICBGb3IgYSBjb21wbGV0ZQotICogICBjb2RlLCB0aGUgbGFzdCBjb2RlIG9mIHRoZSBsb25nZXN0IGxlbmd0aCB3aWxsIGJlIGFsbCB6ZXJvcy4gIFRvIHN1cHBvcnQKLSAqICAgdGhpcyBvcmRlcmluZywgdGhlIGJpdHMgcHVsbGVkIGR1cmluZyBkZWNvZGluZyBhcmUgaW52ZXJ0ZWQgdG8gYXBwbHkgdGhlCi0gKiAgIG1vcmUgIm5hdHVyYWwiIG9yZGVyaW5nIHN0YXJ0aW5nIHdpdGggYWxsIHplcm9zIGFuZCBpbmNyZW1lbnRpbmcuCi0gKi8KLWxvY2FsIGludCBkZWNvZGUoc3RydWN0IHN0YXRlICpzLCBzdHJ1Y3QgaHVmZm1hbiAqaCkKLXsKLSAgICBpbnQgbGVuOyAgICAgICAgICAgIC8qIGN1cnJlbnQgbnVtYmVyIG9mIGJpdHMgaW4gY29kZSAqLwotICAgIGludCBjb2RlOyAgICAgICAgICAgLyogbGVuIGJpdHMgYmVpbmcgZGVjb2RlZCAqLwotICAgIGludCBmaXJzdDsgICAgICAgICAgLyogZmlyc3QgY29kZSBvZiBsZW5ndGggbGVuICovCi0gICAgaW50IGNvdW50OyAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgbGVuZ3RoIGxlbiAqLwotICAgIGludCBpbmRleDsgICAgICAgICAgLyogaW5kZXggb2YgZmlyc3QgY29kZSBvZiBsZW5ndGggbGVuIGluIHN5bWJvbCB0YWJsZSAqLwotICAgIGludCBiaXRidWY7ICAgICAgICAgLyogYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIGludCBsZWZ0OyAgICAgICAgICAgLyogYml0cyBsZWZ0IGluIG5leHQgb3IgbGVmdCB0byBwcm9jZXNzICovCi0gICAgc2hvcnQgKm5leHQ7ICAgICAgICAvKiBuZXh0IG51bWJlciBvZiBjb2RlcyAqLwotCi0gICAgYml0YnVmID0gcy0+Yml0YnVmOwotICAgIGxlZnQgPSBzLT5iaXRjbnQ7Ci0gICAgY29kZSA9IGZpcnN0ID0gaW5kZXggPSAwOwotICAgIGxlbiA9IDE7Ci0gICAgbmV4dCA9IGgtPmNvdW50ICsgMTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICB3aGlsZSAobGVmdC0tKSB7Ci0gICAgICAgICAgICBjb2RlIHw9IChiaXRidWYgJiAxKSBeIDE7ICAgLyogaW52ZXJ0IGNvZGUgKi8KLSAgICAgICAgICAgIGJpdGJ1ZiA+Pj0gMTsKLSAgICAgICAgICAgIGNvdW50ID0gKm5leHQrKzsKLSAgICAgICAgICAgIGlmIChjb2RlIDwgZmlyc3QgKyBjb3VudCkgeyAvKiBpZiBsZW5ndGggbGVuLCByZXR1cm4gc3ltYm9sICovCi0gICAgICAgICAgICAgICAgcy0+Yml0YnVmID0gYml0YnVmOwotICAgICAgICAgICAgICAgIHMtPmJpdGNudCA9IChzLT5iaXRjbnQgLSBsZW4pICYgNzsKLSAgICAgICAgICAgICAgICByZXR1cm4gaC0+c3ltYm9sW2luZGV4ICsgKGNvZGUgLSBmaXJzdCldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZXggKz0gY291bnQ7ICAgICAgICAgICAgIC8qIGVsc2UgdXBkYXRlIGZvciBuZXh0IGxlbmd0aCAqLwotICAgICAgICAgICAgZmlyc3QgKz0gY291bnQ7Ci0gICAgICAgICAgICBmaXJzdCA8PD0gMTsKLSAgICAgICAgICAgIGNvZGUgPDw9IDE7Ci0gICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgfQotICAgICAgICBsZWZ0ID0gKE1BWEJJVFMrMSkgLSBsZW47Ci0gICAgICAgIGlmIChsZWZ0ID09IDApIGJyZWFrOwotICAgICAgICBpZiAocy0+bGVmdCA9PSAwKSB7Ci0gICAgICAgICAgICBzLT5sZWZ0ID0gcy0+aW5mdW4ocy0+aW5ob3csICYocy0+aW4pKTsKLSAgICAgICAgICAgIGlmIChzLT5sZWZ0ID09IDApIGxvbmdqbXAocy0+ZW52LCAxKTsgICAgICAgLyogb3V0IG9mIGlucHV0ICovCi0gICAgICAgIH0KLSAgICAgICAgYml0YnVmID0gKihzLT5pbikrKzsKLSAgICAgICAgcy0+bGVmdC0tOwotICAgICAgICBpZiAobGVmdCA+IDgpIGxlZnQgPSA4OwotICAgIH0KLSAgICByZXR1cm4gLTk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByYW4gb3V0IG9mIGNvZGVzICovCi19Ci0KLS8qCi0gKiBHaXZlbiBhIGxpc3Qgb2YgcmVwZWF0ZWQgY29kZSBsZW5ndGhzIHJlcFswLi5uLTFdLCB3aGVyZSBlYWNoIGJ5dGUgaXMgYQotICogY291bnQgKGhpZ2ggZm91ciBiaXRzICsgMSkgYW5kIGEgY29kZSBsZW5ndGggKGxvdyBmb3VyIGJpdHMpLCBnZW5lcmF0ZSB0aGUKLSAqIGxpc3Qgb2YgY29kZSBsZW5ndGhzLiAgVGhpcyBjb21wYWN0aW9uIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIG9iamVjdCBjb2RlLgotICogVGhlbiBnaXZlbiB0aGUgbGlzdCBvZiBjb2RlIGxlbmd0aHMgbGVuZ3RoWzAuLm4tMV0gcmVwcmVzZW50aW5nIGEgY2Fub25pY2FsCi0gKiBIdWZmbWFuIGNvZGUgZm9yIG4gc3ltYm9scywgY29uc3RydWN0IHRoZSB0YWJsZXMgcmVxdWlyZWQgdG8gZGVjb2RlIHRob3NlCi0gKiBjb2Rlcy4gIFRob3NlIHRhYmxlcyBhcmUgdGhlIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCwgYW5kIHRoZSBzeW1ib2xzCi0gKiBzb3J0ZWQgYnkgbGVuZ3RoLCByZXRhaW5pbmcgdGhlaXIgb3JpZ2luYWwgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoLiAgVGhlCi0gKiByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IgYSBjb21wbGV0ZSBjb2RlIHNldCwgbmVnYXRpdmUgZm9yIGFuIG92ZXItCi0gKiBzdWJzY3JpYmVkIGNvZGUgc2V0LCBhbmQgcG9zaXRpdmUgZm9yIGFuIGluY29tcGxldGUgY29kZSBzZXQuICBUaGUgdGFibGVzCi0gKiBjYW4gYmUgdXNlZCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gb3IgcG9zaXRpdmUsIGJ1dCB0aGV5IGNhbm5vdCBiZSB1c2VkCi0gKiBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvLCBpdCBpcyBub3QKLSAqIHBvc3NpYmxlIGZvciBkZWNvZGUoKSB1c2luZyB0aGF0IHRhYmxlIHRvIHJldHVybiBhbiBlcnJvci0tYW55IHN0cmVhbSBvZgotICogZW5vdWdoIGJpdHMgd2lsbCByZXNvbHZlIHRvIGEgc3ltYm9sLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgdGhlbgotICogaXQgaXMgcG9zc2libGUgZm9yIGRlY29kZSgpIHVzaW5nIHRoYXQgdGFibGUgdG8gcmV0dXJuIGFuIGVycm9yIGZvciByZWNlaXZlZAotICogY29kZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBpbmNvbXBsZXRlIGxlbmd0aHMuCi0gKi8KLWxvY2FsIGludCBjb25zdHJ1Y3Qoc3RydWN0IGh1ZmZtYW4gKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlcCwgaW50IG4pCi17Ci0gICAgaW50IHN5bWJvbDsgICAgICAgICAvKiBjdXJyZW50IHN5bWJvbCB3aGVuIHN0ZXBwaW5nIHRocm91Z2ggbGVuZ3RoW10gKi8KLSAgICBpbnQgbGVuOyAgICAgICAgICAgIC8qIGN1cnJlbnQgbGVuZ3RoIHdoZW4gc3RlcHBpbmcgdGhyb3VnaCBoLT5jb3VudFtdICovCi0gICAgaW50IGxlZnQ7ICAgICAgICAgICAvKiBudW1iZXIgb2YgcG9zc2libGUgY29kZXMgbGVmdCBvZiBjdXJyZW50IGxlbmd0aCAqLwotICAgIHNob3J0IG9mZnNbTUFYQklUUysxXTsgICAgICAvKiBvZmZzZXRzIGluIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KLSAgICBzaG9ydCBsZW5ndGhbMjU2XTsgIC8qIGNvZGUgbGVuZ3RocyAqLwotCi0gICAgLyogY29udmVydCBjb21wYWN0IHJlcGVhdCBjb3VudHMgaW50byBzeW1ib2wgYml0IGxlbmd0aCBsaXN0ICovCi0gICAgc3ltYm9sID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIGxlbiA9ICpyZXArKzsKLSAgICAgICAgbGVmdCA9IChsZW4gPj4gNCkgKyAxOwotICAgICAgICBsZW4gJj0gMTU7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGxlbmd0aFtzeW1ib2wrK10gPSBsZW47Ci0gICAgICAgIH0gd2hpbGUgKC0tbGVmdCk7Ci0gICAgfSB3aGlsZSAoLS1uKTsKLSAgICBuID0gc3ltYm9sOwotCi0gICAgLyogY291bnQgbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovCi0gICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCi0gICAgICAgIGgtPmNvdW50W2xlbl0gPSAwOwotICAgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgbjsgc3ltYm9sKyspCi0gICAgICAgIChoLT5jb3VudFtsZW5ndGhbc3ltYm9sXV0pKys7ICAgLyogYXNzdW1lcyBsZW5ndGhzIGFyZSB3aXRoaW4gYm91bmRzICovCi0gICAgaWYgKGgtPmNvdW50WzBdID09IG4pICAgICAgICAgICAgICAgLyogbm8gY29kZXMhICovCi0gICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcGxldGUsIGJ1dCBkZWNvZGUoKSB3aWxsIGZhaWwgKi8KLQotICAgIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqLwotICAgIGxlZnQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uZSBwb3NzaWJsZSBjb2RlIG9mIHplcm8gbGVuZ3RoICovCi0gICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKLSAgICAgICAgbGVmdCA8PD0gMTsgICAgICAgICAgICAgICAgICAgICAvKiBvbmUgbW9yZSBiaXQsIGRvdWJsZSBjb2RlcyBsZWZ0ICovCi0gICAgICAgIGxlZnQgLT0gaC0+Y291bnRbbGVuXTsgICAgICAgICAgLyogZGVkdWN0IGNvdW50IGZyb20gcG9zc2libGUgY29kZXMgKi8KLSAgICAgICAgaWYgKGxlZnQgPCAwKSByZXR1cm4gbGVmdDsgICAgICAvKiBvdmVyLXN1YnNjcmliZWQtLXJldHVybiBuZWdhdGl2ZSAqLwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlZnQgPiAwIG1lYW5zIGluY29tcGxldGUgKi8KLQotICAgIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovCi0gICAgb2Zmc1sxXSA9IDA7Ci0gICAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykKLSAgICAgICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGgtPmNvdW50W2xlbl07Ci0KLSAgICAvKgotICAgICAqIHB1dCBzeW1ib2xzIGluIHRhYmxlIHNvcnRlZCBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaAotICAgICAqIGxlbmd0aAotICAgICAqLwotICAgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgbjsgc3ltYm9sKyspCi0gICAgICAgIGlmIChsZW5ndGhbc3ltYm9sXSAhPSAwKQotICAgICAgICAgICAgaC0+c3ltYm9sW29mZnNbbGVuZ3RoW3N5bWJvbF1dKytdID0gc3ltYm9sOwotCi0gICAgLyogcmV0dXJuIHplcm8gZm9yIGNvbXBsZXRlIHNldCwgcG9zaXRpdmUgZm9yIGluY29tcGxldGUgc2V0ICovCi0gICAgcmV0dXJuIGxlZnQ7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgUEtXYXJlIENvbXByZXNzaW9uIExpYnJhcnkgc3RyZWFtLgotICoKLSAqIEZvcm1hdCBub3RlczoKLSAqCi0gKiAtIEZpcnN0IGJ5dGUgaXMgMCBpZiBsaXRlcmFscyBhcmUgdW5jb2RlZCBvciAxIGlmIHRoZXkgYXJlIGNvZGVkLiAgU2Vjb25kCi0gKiAgIGJ5dGUgaXMgNCwgNSwgb3IgNiBmb3IgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzIGluIHRoZSBkaXN0YW5jZSBjb2RlLgotICogICBUaGlzIGlzIHRoZSBiYXNlLTIgbG9nYXJpdGhtIG9mIHRoZSBkaWN0aW9uYXJ5IHNpemUgbWludXMgc2l4LgotICoKLSAqIC0gQ29tcHJlc3NlZCBkYXRhIGlzIGEgY29tYmluYXRpb24gb2YgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZSBwYWlycwotICogICB0ZXJtaW5hdGVkIGJ5IGFuIGVuZCBjb2RlLiAgTGl0ZXJhbHMgYXJlIGVpdGhlciBIdWZmbWFuIGNvZGVkIG9yCi0gKiAgIHVuY29kZWQgYnl0ZXMuICBBIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIGEgY29kZWQgbGVuZ3RoIGZvbGxvd2VkIGJ5IGEKLSAqICAgY29kZWQgZGlzdGFuY2UgdG8gcmVwcmVzZW50IGEgc3RyaW5nIHRoYXQgb2NjdXJzIGVhcmxpZXIgaW4gdGhlCi0gKiAgIHVuY29tcHJlc3NlZCBkYXRhIHRoYXQgb2NjdXJzIGFnYWluIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgotICoKLSAqIC0gQSBiaXQgcHJlY2VkaW5nIGEgbGl0ZXJhbCBvciBsZW5ndGgvZGlzdGFuY2UgcGFpciBpbmRpY2F0ZXMgd2hpY2ggY29tZXMKLSAqICAgbmV4dCwgMCBmb3IgbGl0ZXJhbHMsIDEgZm9yIGxlbmd0aC9kaXN0YW5jZS4KLSAqCi0gKiAtIElmIGxpdGVyYWxzIGFyZSB1bmNvZGVkLCB0aGVuIHRoZSBuZXh0IGVpZ2h0IGJpdHMgYXJlIHRoZSBsaXRlcmFsLCBpbiB0aGUKLSAqICAgbm9ybWFsIGJpdCBvcmRlciBpbiB0aCBzdHJlYW0sIGkuZS4gbm8gYml0LXJldmVyc2FsIGlzIG5lZWRlZC4gU2ltaWxhcmx5LAotICogICBubyBiaXQgcmV2ZXJzYWwgaXMgbmVlZGVkIGZvciBlaXRoZXIgdGhlIGxlbmd0aCBleHRyYSBiaXRzIG9yIHRoZSBkaXN0YW5jZQotICogICBleHRyYSBiaXRzLgotICoKLSAqIC0gTGl0ZXJhbCBieXRlcyBhcmUgc2ltcGx5IHdyaXR0ZW4gdG8gdGhlIG91dHB1dC4gIEEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMKLSAqICAgYW4gaW5zdHJ1Y3Rpb24gdG8gY29weSBwcmV2aW91c2x5IHVuY29tcHJlc3NlZCBieXRlcyB0byB0aGUgb3V0cHV0LiAgVGhlCi0gKiAgIGNvcHkgaXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrIGluIHRoZSBvdXRwdXQgc3RyZWFtLCBjb3B5aW5nIGZvciBsZW5ndGgKLSAqICAgYnl0ZXMuCi0gKgotICogLSBEaXN0YW5jZXMgcG9pbnRpbmcgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGFyZSBub3QKLSAqICAgcGVybWl0dGVkLgotICoKLSAqIC0gT3ZlcmxhcHBlZCBjb3BpZXMsIHdoZXJlIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSwgYXJlCi0gKiAgIGFsbG93ZWQgYW5kIGNvbW1vbi4gIEZvciBleGFtcGxlLCBhIGRpc3RhbmNlIG9mIG9uZSBhbmQgYSBsZW5ndGggb2YgNTE4Ci0gKiAgIHNpbXBseSBjb3BpZXMgdGhlIGxhc3QgYnl0ZSA1MTggdGltZXMuICBBIGRpc3RhbmNlIG9mIGZvdXIgYW5kIGEgbGVuZ3RoIG9mCi0gKiAgIHR3ZWx2ZSBjb3BpZXMgdGhlIGxhc3QgZm91ciBieXRlcyB0aHJlZSB0aW1lcy4gIEEgc2ltcGxlIGZvcndhcmQgY29weQotICogICBpZ25vcmluZyB3aGV0aGVyIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSBvciBub3QgaW1wbGVtZW50cwotICogICB0aGlzIGNvcnJlY3RseS4KLSAqLwotbG9jYWwgaW50IGRlY29tcChzdHJ1Y3Qgc3RhdGUgKnMpCi17Ci0gICAgaW50IGxpdDsgICAgICAgICAgICAvKiB0cnVlIGlmIGxpdGVyYWxzIGFyZSBjb2RlZCAqLwotICAgIGludCBkaWN0OyAgICAgICAgICAgLyogbG9nMihkaWN0aW9uYXJ5IHNpemUpIC0gNiAqLwotICAgIGludCBzeW1ib2w7ICAgICAgICAgLyogZGVjb2RlZCBzeW1ib2wsIGV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlICovCi0gICAgaW50IGxlbjsgICAgICAgICAgICAvKiBsZW5ndGggZm9yIGNvcHkgKi8KLSAgICBpbnQgZGlzdDsgICAgICAgICAgIC8qIGRpc3RhbmNlIGZvciBjb3B5ICovCi0gICAgaW50IGNvcHk7ICAgICAgICAgICAvKiBjb3B5IGNvdW50ZXIgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpmcm9tLCAqdG87ICAgLyogY29weSBwb2ludGVycyAqLwotICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZCB0YWJsZXMgb25jZSAqLwotICAgIHN0YXRpYyBzaG9ydCBsaXRjbnRbTUFYQklUUysxXSwgbGl0c3ltWzI1Nl07ICAgICAgICAvKiBsaXRjb2RlIG1lbW9yeSAqLwotICAgIHN0YXRpYyBzaG9ydCBsZW5jbnRbTUFYQklUUysxXSwgbGVuc3ltWzE2XTsgICAgICAgICAvKiBsZW5jb2RlIG1lbW9yeSAqLwotICAgIHN0YXRpYyBzaG9ydCBkaXN0Y250W01BWEJJVFMrMV0sIGRpc3RzeW1bNjRdOyAgICAgICAvKiBkaXN0Y29kZSBtZW1vcnkgKi8KLSAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gbGl0Y29kZSA9IHtsaXRjbnQsIGxpdHN5bX07ICAgLyogbGVuZ3RoIGNvZGUgKi8KLSAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gbGVuY29kZSA9IHtsZW5jbnQsIGxlbnN5bX07ICAgLyogbGVuZ3RoIGNvZGUgKi8KLSAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gZGlzdGNvZGUgPSB7ZGlzdGNudCwgZGlzdHN5bX07LyogZGlzdGFuY2UgY29kZSAqLwotICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBsaXRlcmFsIGNvZGVzICovCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGl0bGVuW10gPSB7Ci0gICAgICAgIDExLCAxMjQsIDgsIDcsIDI4LCA3LCAxODgsIDEzLCA3NiwgNCwgMTAsIDgsIDEyLCAxMCwgMTIsIDEwLCA4LCAyMywgOCwKLSAgICAgICAgOSwgNywgNiwgNywgOCwgNywgNiwgNTUsIDgsIDIzLCAyNCwgMTIsIDExLCA3LCA5LCAxMSwgMTIsIDYsIDcsIDIyLCA1LAotICAgICAgICA3LCAyNCwgNiwgMTEsIDksIDYsIDcsIDIyLCA3LCAxMSwgMzgsIDcsIDksIDgsIDI1LCAxMSwgOCwgMTEsIDksIDEyLAotICAgICAgICA4LCAxMiwgNSwgMzgsIDUsIDM4LCA1LCAxMSwgNywgNSwgNiwgMjEsIDYsIDEwLCA1MywgOCwgNywgMjQsIDEwLCAyNywKLSAgICAgICAgNDQsIDI1MywgMjUzLCAyNTMsIDI1MiwgMjUyLCAyNTIsIDEzLCAxMiwgNDUsIDEyLCA0NSwgMTIsIDYxLCAxMiwgNDUsCi0gICAgICAgIDQ0LCAxNzN9OwotICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBsZW5ndGggY29kZXMgMC4uMTUgKi8KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBsZW5sZW5bXSA9IHsyLCAzNSwgMzYsIDUzLCAzOCwgMjN9OwotICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBkaXN0YW5jZSBjb2RlcyAwLi42MyAqLwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRpc3RsZW5bXSA9IHsyLCAyMCwgNTMsIDIzMCwgMjQ3LCAxNTEsIDI0OH07Ci0gICAgc3RhdGljIGNvbnN0IHNob3J0IGJhc2VbMTZdID0geyAgICAgLyogYmFzZSBmb3IgbGVuZ3RoIGNvZGVzICovCi0gICAgICAgIDMsIDIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMiwgMTYsIDI0LCA0MCwgNzIsIDEzNiwgMjY0fTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBleHRyYVsxNl0gPSB7ICAgICAvKiBleHRyYSBiaXRzIGZvciBsZW5ndGggY29kZXMgKi8KLSAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOH07Ci0KLSAgICAvKiBzZXQgdXAgZGVjb2RpbmcgdGFibGVzIChvbmNlLS1taWdodCBub3QgYmUgdGhyZWFkLXNhZmUpICovCi0gICAgaWYgKHZpcmdpbikgewotICAgICAgICBjb25zdHJ1Y3QoJmxpdGNvZGUsIGxpdGxlbiwgc2l6ZW9mKGxpdGxlbikpOwotICAgICAgICBjb25zdHJ1Y3QoJmxlbmNvZGUsIGxlbmxlbiwgc2l6ZW9mKGxlbmxlbikpOwotICAgICAgICBjb25zdHJ1Y3QoJmRpc3Rjb2RlLCBkaXN0bGVuLCBzaXplb2YoZGlzdGxlbikpOwotICAgICAgICB2aXJnaW4gPSAwOwotICAgIH0KLQotICAgIC8qIHJlYWQgaGVhZGVyICovCi0gICAgbGl0ID0gYml0cyhzLCA4KTsKLSAgICBpZiAobGl0ID4gMSkgcmV0dXJuIC0xOwotICAgIGRpY3QgPSBiaXRzKHMsIDgpOwotICAgIGlmIChkaWN0IDwgNCB8fCBkaWN0ID4gNikgcmV0dXJuIC0yOwotCi0gICAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2UgcGFpcnMgKi8KLSAgICBkbyB7Ci0gICAgICAgIGlmIChiaXRzKHMsIDEpKSB7Ci0gICAgICAgICAgICAvKiBnZXQgbGVuZ3RoICovCi0gICAgICAgICAgICBzeW1ib2wgPSBkZWNvZGUocywgJmxlbmNvZGUpOwotICAgICAgICAgICAgbGVuID0gYmFzZVtzeW1ib2xdICsgYml0cyhzLCBleHRyYVtzeW1ib2xdKTsKLSAgICAgICAgICAgIGlmIChsZW4gPT0gNTE5KSBicmVhazsgICAgICAgICAgICAgIC8qIGVuZCBjb2RlICovCi0KLSAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSAqLwotICAgICAgICAgICAgc3ltYm9sID0gbGVuID09IDIgPyAyIDogZGljdDsKLSAgICAgICAgICAgIGRpc3QgPSBkZWNvZGUocywgJmRpc3Rjb2RlKSA8PCBzeW1ib2w7Ci0gICAgICAgICAgICBkaXN0ICs9IGJpdHMocywgc3ltYm9sKTsKLSAgICAgICAgICAgIGRpc3QrKzsKLSAgICAgICAgICAgIGlmIChzLT5maXJzdCAmJiBkaXN0ID4gcy0+bmV4dCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTM7ICAgICAgICAgICAgICAvKiBkaXN0YW5jZSB0b28gZmFyIGJhY2sgKi8KLQotICAgICAgICAgICAgLyogY29weSBsZW5ndGggYnl0ZXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrICovCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgdG8gPSBzLT5vdXQgKyBzLT5uZXh0OwotICAgICAgICAgICAgICAgIGZyb20gPSB0byAtIGRpc3Q7Ci0gICAgICAgICAgICAgICAgY29weSA9IE1BWFdJTjsKLSAgICAgICAgICAgICAgICBpZiAocy0+bmV4dCA8IGRpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJvbSArPSBjb3B5OwotICAgICAgICAgICAgICAgICAgICBjb3B5ID0gZGlzdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29weSAtPSBzLT5uZXh0OwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVuKSBjb3B5ID0gbGVuOwotICAgICAgICAgICAgICAgIGxlbiAtPSBjb3B5OwotICAgICAgICAgICAgICAgIHMtPm5leHQgKz0gY29weTsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICp0bysrID0gKmZyb20rKzsKLSAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOwotICAgICAgICAgICAgICAgIGlmIChzLT5uZXh0ID09IE1BWFdJTikgewotICAgICAgICAgICAgICAgICAgICBpZiAocy0+b3V0ZnVuKHMtPm91dGhvdywgcy0+b3V0LCBzLT5uZXh0KSkgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm5leHQgPSAwOwotICAgICAgICAgICAgICAgICAgICBzLT5maXJzdCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAobGVuICE9IDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogZ2V0IGxpdGVyYWwgYW5kIHdyaXRlIGl0ICovCi0gICAgICAgICAgICBzeW1ib2wgPSBsaXQgPyBkZWNvZGUocywgJmxpdGNvZGUpIDogYml0cyhzLCA4KTsKLSAgICAgICAgICAgIHMtPm91dFtzLT5uZXh0KytdID0gc3ltYm9sOwotICAgICAgICAgICAgaWYgKHMtPm5leHQgPT0gTUFYV0lOKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPm91dGZ1bihzLT5vdXRob3csIHMtPm91dCwgcy0+bmV4dCkpIHJldHVybiAxOwotICAgICAgICAgICAgICAgIHMtPm5leHQgPSAwOwotICAgICAgICAgICAgICAgIHMtPmZpcnN0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gd2hpbGUgKDEpOwotICAgIHJldHVybiAwOwotfQotCi0vKiBTZWUgY29tbWVudHMgaW4gYmxhc3QuaCAqLwotaW50IGJsYXN0KGJsYXN0X2luIGluZnVuLCB2b2lkICppbmhvdywgYmxhc3Rfb3V0IG91dGZ1biwgdm9pZCAqb3V0aG93KQotewotICAgIHN0cnVjdCBzdGF0ZSBzOyAgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgc3RhdGUgKi8KLSAgICBpbnQgZXJyOyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHZhbHVlICovCi0KLSAgICAvKiBpbml0aWFsaXplIGlucHV0IHN0YXRlICovCi0gICAgcy5pbmZ1biA9IGluZnVuOwotICAgIHMuaW5ob3cgPSBpbmhvdzsKLSAgICBzLmxlZnQgPSAwOwotICAgIHMuYml0YnVmID0gMDsKLSAgICBzLmJpdGNudCA9IDA7Ci0KLSAgICAvKiBpbml0aWFsaXplIG91dHB1dCBzdGF0ZSAqLwotICAgIHMub3V0ZnVuID0gb3V0ZnVuOwotICAgIHMub3V0aG93ID0gb3V0aG93OwotICAgIHMubmV4dCA9IDA7Ci0gICAgcy5maXJzdCA9IDE7Ci0KLSAgICAvKiByZXR1cm4gaWYgYml0cygpIG9yIGRlY29kZSgpIHRyaWVzIHRvIHJlYWQgcGFzdCBhdmFpbGFibGUgaW5wdXQgKi8KLSAgICBpZiAoc2V0am1wKHMuZW52KSAhPSAwKSAgICAgICAgICAgICAvKiBpZiBjYW1lIGJhY2sgaGVyZSB2aWEgbG9uZ2ptcCgpLCAqLwotICAgICAgICBlcnIgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICB0aGVuIHNraXAgZGVjb21wKCksIHJldHVybiBlcnJvciAqLwotICAgIGVsc2UKLSAgICAgICAgZXJyID0gZGVjb21wKCZzKTsgICAgICAgICAgICAgICAvKiBkZWNvbXByZXNzICovCi0KLSAgICAvKiB3cml0ZSBhbnkgbGVmdG92ZXIgb3V0cHV0IGFuZCB1cGRhdGUgdGhlIGVycm9yIGNvZGUgaWYgbmVlZGVkICovCi0gICAgaWYgKGVyciAhPSAxICYmIHMubmV4dCAmJiBzLm91dGZ1bihzLm91dGhvdywgcy5vdXQsIHMubmV4dCkgJiYgZXJyID09IDApCi0gICAgICAgIGVyciA9IDE7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotI2lmZGVmIFRFU1QKLS8qIEV4YW1wbGUgb2YgaG93IHRvIHVzZSBibGFzdCgpICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2RlZmluZSBDSFVOSyAxNjM4NAotCi1sb2NhbCB1bnNpZ25lZCBpbmYodm9pZCAqaG93LCB1bnNpZ25lZCBjaGFyICoqYnVmKQotewotICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGhvbGRbQ0hVTktdOwotCi0gICAgKmJ1ZiA9IGhvbGQ7Ci0gICAgcmV0dXJuIGZyZWFkKGhvbGQsIDEsIENIVU5LLCAoRklMRSAqKWhvdyk7Ci19Ci0KLWxvY2FsIGludCBvdXRmKHZvaWQgKmhvdywgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4pCi17Ci0gICAgcmV0dXJuIGZ3cml0ZShidWYsIDEsIGxlbiwgKEZJTEUgKilob3cpICE9IGxlbjsKLX0KLQotLyogRGVjb21wcmVzcyBhIFBLV2FyZSBDb21wcmVzc2lvbiBMaWJyYXJ5IHN0cmVhbSBmcm9tIHN0ZGluIHRvIHN0ZG91dCAqLwotaW50IG1haW4odm9pZCkKLXsKLSAgICBpbnQgcmV0LCBuOwotCi0gICAgLyogZGVjb21wcmVzcyB0byBzdGRvdXQgKi8KLSAgICByZXQgPSBibGFzdChpbmYsIHN0ZGluLCBvdXRmLCBzdGRvdXQpOwotICAgIGlmIChyZXQgIT0gMCkgZnByaW50ZihzdGRlcnIsICJibGFzdCBlcnJvcjogJWRcbiIsIHJldCk7Ci0KLSAgICAvKiBzZWUgaWYgdGhlcmUgYXJlIGFueSBsZWZ0b3ZlciBieXRlcyAqLwotICAgIG4gPSAwOwotICAgIHdoaWxlIChnZXRjaGFyKCkgIT0gRU9GKSBuKys7Ci0gICAgaWYgKG4pIGZwcmludGYoc3RkZXJyLCAiYmxhc3Qgd2FybmluZzogJWQgdW51c2VkIGJ5dGVzIG9mIGlucHV0XG4iLCBuKTsKLQotICAgIC8qIHJldHVybiBibGFzdCgpIGVycm9yIGNvZGUgKi8KLSAgICByZXR1cm4gcmV0OwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9ibGFzdC9ibGFzdC5oIGIvbGlicy96bGliL2NvbnRyaWIvYmxhc3QvYmxhc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5ZTU0MS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9ibGFzdC9ibGFzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogYmxhc3QuaCAtLSBpbnRlcmZhY2UgZm9yIGJsYXN0LmMKLSAgQ29weXJpZ2h0IChDKSAyMDAzIE1hcmsgQWRsZXIKLSAgdmVyc2lvbiAxLjEsIDE2IEZlYiAyMDAzCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTWFyayBBZGxlciAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0gKi8KLQotCi0vKgotICogYmxhc3QoKSBkZWNvbXByZXNzZXMgdGhlIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkgKERDTCkgY29tcHJlc3NlZAotICogZm9ybWF0LiAgSXQgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyB0aGUgZXhwbG9kZSgpIGZ1bmN0aW9uIGluCi0gKiB0aGF0IGxpYnJhcnkuICAoTm90ZTogUEtXYXJlIG92ZXJ1c2VkIHRoZSAiaW1wbG9kZSIgdmVyYiwgYW5kIHRoZSBmb3JtYXQKLSAqIHVzZWQgYnkgdGhlaXIgbGlicmFyeSBpbXBsb2RlKCkgZnVuY3Rpb24gaXMgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kCi0gKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgaW1wbG9kZSBjb21wcmVzc2lvbiBtZXRob2Qgc3VwcG9ydGVkIGJ5IFBLWklQLikKLSAqLwotCi0KLXR5cGVkZWYgdW5zaWduZWQgKCpibGFzdF9pbikodm9pZCAqaG93LCB1bnNpZ25lZCBjaGFyICoqYnVmKTsKLXR5cGVkZWYgaW50ICgqYmxhc3Rfb3V0KSh2b2lkICpob3csIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuKTsKLS8qIERlZmluaXRpb25zIGZvciBpbnB1dC9vdXRwdXQgZnVuY3Rpb25zIHBhc3NlZCB0byBibGFzdCgpLiAgU2VlIGJlbG93IGZvcgotICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb25zIG5lZWQgdG8gZG8uCi0gKi8KLQotCi1pbnQgYmxhc3QoYmxhc3RfaW4gaW5mdW4sIHZvaWQgKmluaG93LCBibGFzdF9vdXQgb3V0ZnVuLCB2b2lkICpvdXRob3cpOwotLyogRGVjb21wcmVzcyBpbnB1dCB0byBvdXRwdXQgdXNpbmcgdGhlIHByb3ZpZGVkIGluZnVuKCkgYW5kIG91dGZ1bigpIGNhbGxzLgotICogT24gc3VjY2VzcywgdGhlIHJldHVybiB2YWx1ZSBvZiBibGFzdCgpIGlzIHplcm8uICBJZiB0aGVyZSBpcyBhbiBlcnJvciBpbgotICogdGhlIHNvdXJjZSBkYXRhLCBpLmUuIGl0IGlzIG5vdCBpbiB0aGUgcHJvcGVyIGZvcm1hdCwgdGhlbiBhIG5lZ2F0aXZlIHZhbHVlCi0gKiBpcyByZXR1cm5lZC4gIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggaW5wdXQgYXZhaWxhYmxlIG9yIHRoZXJlIGlzIG5vdCBlbm91Z2gKLSAqIG91dHB1dCBzcGFjZSwgdGhlbiBhIHBvc2l0aXZlIGVycm9yIGlzIHJldHVybmVkLgotICoKLSAqIFRoZSBpbnB1dCBmdW5jdGlvbiBpcyBpbnZva2VkOiBsZW4gPSBpbmZ1bihob3csICZidWYpLCB3aGVyZSBidWYgaXMgc2V0IGJ5Ci0gKiBpbmZ1bigpIHRvIHBvaW50IHRvIHRoZSBpbnB1dCBidWZmZXIsIGFuZCBpbmZ1bigpIHJldHVybnMgdGhlIG51bWJlciBvZgotICogYXZhaWxhYmxlIGJ5dGVzIHRoZXJlLiAgSWYgaW5mdW4oKSByZXR1cm5zIHplcm8sIHRoZW4gYmxhc3QoKSByZXR1cm5zIHdpdGgKLSAqIGFuIGlucHV0IGVycm9yLiAgKGJsYXN0KCkgb25seSBhc2tzIGZvciBpbnB1dCBpZiBpdCBuZWVkcyBpdC4pICBpbmhvdyBpcyBmb3IKLSAqIHVzZSBieSB0aGUgYXBwbGljYXRpb24gdG8gcGFzcyBhbiBpbnB1dCBkZXNjcmlwdG9yIHRvIGluZnVuKCksIGlmIGRlc2lyZWQuCi0gKgotICogVGhlIG91dHB1dCBmdW5jdGlvbiBpcyBpbnZva2VkOiBlcnIgPSBvdXRmdW4oaG93LCBidWYsIGxlbiksIHdoZXJlIHRoZSBieXRlcwotICogdG8gYmUgd3JpdHRlbiBhcmUgYnVmWzAuLmxlbi0xXS4gIElmIGVyciBpcyBub3QgemVybywgdGhlbiBibGFzdCgpIHJldHVybnMKLSAqIHdpdGggYW4gb3V0cHV0IGVycm9yLiAgb3V0ZnVuKCkgaXMgYWx3YXlzIGNhbGxlZCB3aXRoIGxlbiA8PSA0MDk2LiAgb3V0aG93Ci0gKiBpcyBmb3IgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBwYXNzIGFuIG91dHB1dCBkZXNjcmlwdG9yIHRvIG91dGZ1bigpLCBpZgotICogZGVzaXJlZC4KLSAqCi0gKiBUaGUgcmV0dXJuIGNvZGVzIGFyZToKLSAqCi0gKiAgIDI6ICByYW4gb3V0IG9mIGlucHV0IGJlZm9yZSBjb21wbGV0aW5nIGRlY29tcHJlc3Npb24KLSAqICAgMTogIG91dHB1dCBlcnJvciBiZWZvcmUgY29tcGxldGluZyBkZWNvbXByZXNzaW9uCi0gKiAgIDA6ICBzdWNjZXNzZnVsIGRlY29tcHJlc3Npb24KLSAqICAtMTogIGxpdGVyYWwgZmxhZyBub3QgemVybyBvciBvbmUKLSAqICAtMjogIGRpY3Rpb25hcnkgc2l6ZSBub3QgaW4gNC4uNgotICogIC0zOiAgZGlzdGFuY2UgaXMgdG9vIGZhciBiYWNrCi0gKgotICogQXQgdGhlIGJvdHRvbSBvZiBibGFzdC5jIGlzIGFuIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IHVzZXMgYmxhc3QoKSB0aGF0IGNhbiBiZQotICogY29tcGlsZWQgdG8gcHJvZHVjZSBhIGNvbW1hbmQtbGluZSBkZWNvbXByZXNzaW9uIGZpbHRlciBieSBkZWZpbmluZyBURVNULgotICovCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9ibGFzdC90ZXN0LnBrIGIvbGlicy96bGliL2NvbnRyaWIvYmxhc3QvdGVzdC5wawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxMGIyYi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9ibGFzdC90ZXN0LnBrCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvYmxhc3QvdGVzdC50eHQgYi9saWJzL3psaWIvY29udHJpYi9ibGFzdC90ZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjFjNS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9ibGFzdC90ZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUFJQUlBSUFJQUlBSUEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9kZWxwaGkvWkxpYi5wYXMgYi9saWJzL3psaWIvY29udHJpYi9kZWxwaGkvWkxpYi5wYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMmI4YjQuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvZGVscGhpL1pMaWIucGFzCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLXsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqfQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci17ICAgICAgIEJvcmxhbmQgRGVscGhpIFN1cHBsZW1lbnRhbCBDb21wb25lbnRzICAgICAgICAgIH0KLXsgICAgICAgWkxJQiBEYXRhIENvbXByZXNzaW9uIEludGVyZmFjZSBVbml0ICAgICAgICAgICAgfQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci17ICAgICAgIENvcHlyaWdodCAoYykgMTk5Nyw5OSBCb3JsYW5kIENvcnBvcmF0aW9uICAgICAgIH0KLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoteyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKip9Ci0KLXsgVXBkYXRlZCBmb3IgemxpYiAxLjIueCBieSBDb3NtaW4gVHJ1dGEgPGNvc21pbnRAY3MudWJiY2x1ai5ybz4gfQotCi11bml0IFpMaWI7Ci0KLWludGVyZmFjZQotCi11c2VzIFN5c1V0aWxzLCBDbGFzc2VzOwotCi10eXBlCi0gIFRBbGxvYyA9IGZ1bmN0aW9uIChBcHBEYXRhOiBQb2ludGVyOyBJdGVtcywgU2l6ZTogSW50ZWdlcik6IFBvaW50ZXI7IGNkZWNsOwotICBURnJlZSA9IHByb2NlZHVyZSAoQXBwRGF0YSwgQmxvY2s6IFBvaW50ZXIpOyBjZGVjbDsKLQotICAvLyBJbnRlcm5hbCBzdHJ1Y3R1cmUuICBJZ25vcmUuCi0gIFRaU3RyZWFtUmVjID0gcGFja2VkIHJlY29yZAotICAgIG5leHRfaW46IFBDaGFyOyAgICAgICAvLyBuZXh0IGlucHV0IGJ5dGUKLSAgICBhdmFpbF9pbjogSW50ZWdlcjsgICAgLy8gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luCi0gICAgdG90YWxfaW46IExvbmdpbnQ7ICAgIC8vIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyCi0KLSAgICBuZXh0X291dDogUENoYXI7ICAgICAgLy8gbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IGhlcmUKLSAgICBhdmFpbF9vdXQ6IEludGVnZXI7ICAgLy8gcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgbmV4dF9vdXQKLSAgICB0b3RhbF9vdXQ6IExvbmdpbnQ7ICAgLy8gdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhcgotCi0gICAgbXNnOiBQQ2hhcjsgICAgICAgICAgIC8vIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvcgotICAgIGludGVybmFsOiBQb2ludGVyOyAgICAvLyBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMKLQotICAgIHphbGxvYzogVEFsbG9jOyAgICAgICAvLyB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICAgIHpmcmVlOiBURnJlZTsgICAgICAgICAvLyB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIHN0YXRlCi0gICAgQXBwRGF0YTogUG9pbnRlcjsgICAgIC8vIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIHphbGxvYyBhbmQgemZyZWUKLQotICAgIGRhdGFfdHlwZTogSW50ZWdlcjsgICAvLyBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGFzY2lpIG9yIGJpbmFyeQotICAgIGFkbGVyOiBMb25naW50OyAgICAgICAvLyBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YQotICAgIHJlc2VydmVkOiBMb25naW50OyAgICAvLyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICBlbmQ7Ci0KLSAgLy8gQWJzdHJhY3QgYW5jZXN0b3IgY2xhc3MKLSAgVEN1c3RvbVpsaWJTdHJlYW0gPSBjbGFzcyhUU3RyZWFtKQotICBwcml2YXRlCi0gICAgRlN0cm06IFRTdHJlYW07Ci0gICAgRlN0cm1Qb3M6IEludGVnZXI7Ci0gICAgRk9uUHJvZ3Jlc3M6IFROb3RpZnlFdmVudDsKLSAgICBGWlJlYzogVFpTdHJlYW1SZWM7Ci0gICAgRkJ1ZmZlcjogYXJyYXkgW1dvcmRdIG9mIENoYXI7Ci0gIHByb3RlY3RlZAotICAgIHByb2NlZHVyZSBQcm9ncmVzcyhTZW5kZXI6IFRPYmplY3QpOyBkeW5hbWljOwotICAgIHByb3BlcnR5IE9uUHJvZ3Jlc3M6IFROb3RpZnlFdmVudCByZWFkIEZPblByb2dyZXNzIHdyaXRlIEZPblByb2dyZXNzOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZShTdHJtOiBUU3RyZWFtKTsKLSAgZW5kOwotCi17IFRDb21wcmVzc2lvblN0cmVhbSBjb21wcmVzc2VzIGRhdGEgb24gdGhlIGZseSBhcyBkYXRhIGlzIHdyaXR0ZW4gdG8gaXQsIGFuZAotICBzdG9yZXMgdGhlIGNvbXByZXNzZWQgZGF0YSB0byBhbm90aGVyIHN0cmVhbS4KLQotICBUQ29tcHJlc3Npb25TdHJlYW0gaXMgd3JpdGUtb25seSBhbmQgc3RyaWN0bHkgc2VxdWVudGlhbC4gUmVhZGluZyBmcm9tIHRoZQotICBzdHJlYW0gd2lsbCByYWlzZSBhbiBleGNlcHRpb24uIFVzaW5nIFNlZWsgdG8gbW92ZSB0aGUgc3RyZWFtIHBvaW50ZXIKLSAgd2lsbCByYWlzZSBhbiBleGNlcHRpb24uCi0KLSAgT3V0cHV0IGRhdGEgaXMgY2FjaGVkIGludGVybmFsbHksIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0gb25seSB3aGVuCi0gIHRoZSBpbnRlcm5hbCBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwuICBBbGwgcGVuZGluZyBvdXRwdXQgZGF0YSBpcyBmbHVzaGVkCi0gIHdoZW4gdGhlIHN0cmVhbSBpcyBkZXN0cm95ZWQuCi0KLSAgVGhlIFBvc2l0aW9uIHByb3BlcnR5IHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgb2YKLSAgZGF0YSB0aGF0IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBzdHJlYW0gc28gZmFyLgotCi0gIENvbXByZXNzaW9uUmF0ZSByZXR1cm5zIHRoZSBvbi10aGUtZmx5IHBlcmNlbnRhZ2UgYnkgd2hpY2ggdGhlIG9yaWdpbmFsCi0gIGRhdGEgaGFzIGJlZW4gY29tcHJlc3NlZDogICgxIC0gKENvbXByZXNzZWRCeXRlcyAvIFVuY29tcHJlc3NlZEJ5dGVzKSkgKiAxMDAKLSAgSWYgcmF3IGRhdGEgc2l6ZSA9IDEwMCBhbmQgY29tcHJlc3NlZCBkYXRhIHNpemUgPSAyNSwgdGhlIENvbXByZXNzaW9uUmF0ZQotICBpcyA3NSUKLQotICBUaGUgT25Qcm9ncmVzcyBldmVudCBpcyBjYWxsZWQgZWFjaCB0aW1lIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZpbGxlZCBhbmQKLSAgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4gIFRoaXMgaXMgdXNlZnVsIGZvciB1cGRhdGluZyBhIHByb2dyZXNzCi0gIGluZGljYXRvciB3aGVuIHlvdSBhcmUgd3JpdGluZyBhIGxhcmdlIGNodW5rIG9mIGRhdGEgdG8gdGhlIGNvbXByZXNzaW9uCi0gIHN0cmVhbSBpbiBhIHNpbmdsZSBjYWxsLn0KLQotCi0gIFRDb21wcmVzc2lvbkxldmVsID0gKGNsTm9uZSwgY2xGYXN0ZXN0LCBjbERlZmF1bHQsIGNsTWF4KTsKLQotICBUQ29tcHJlc3Npb25TdHJlYW0gPSBjbGFzcyhUQ3VzdG9tWmxpYlN0cmVhbSkKLSAgcHJpdmF0ZQotICAgIGZ1bmN0aW9uIEdldENvbXByZXNzaW9uUmF0ZTogU2luZ2xlOwotICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQ29tcHJlc3Npb25MZXZlbDogVENvbXByZXNzaW9uTGV2ZWw7IERlc3Q6IFRTdHJlYW0pOwotICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZCh2YXIgQnVmZmVyOyBDb3VudDogTG9uZ2ludCk6IExvbmdpbnQ7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFdyaXRlKGNvbnN0IEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBTZWVrKE9mZnNldDogTG9uZ2ludDsgT3JpZ2luOiBXb3JkKTogTG9uZ2ludDsgb3ZlcnJpZGU7Ci0gICAgcHJvcGVydHkgQ29tcHJlc3Npb25SYXRlOiBTaW5nbGUgcmVhZCBHZXRDb21wcmVzc2lvblJhdGU7Ci0gICAgcHJvcGVydHkgT25Qcm9ncmVzczsKLSAgZW5kOwotCi17IFREZWNvbXByZXNzaW9uU3RyZWFtIGRlY29tcHJlc3NlcyBkYXRhIG9uIHRoZSBmbHkgYXMgZGF0YSBpcyByZWFkIGZyb20gaXQuCi0KLSAgQ29tcHJlc3NlZCBkYXRhIGNvbWVzIGZyb20gYSBzZXBhcmF0ZSBzb3VyY2Ugc3RyZWFtLiAgVERlY29tcHJlc3Npb25TdHJlYW0KLSAgaXMgcmVhZC1vbmx5IGFuZCB1bmlkaXJlY3Rpb25hbDsgeW91IGNhbiBzZWVrIGZvcndhcmQgaW4gdGhlIHN0cmVhbSwgYnV0IG5vdAotICBiYWNrd2FyZHMuICBUaGUgc3BlY2lhbCBjYXNlIG9mIHNldHRpbmcgdGhlIHN0cmVhbSBwb3NpdGlvbiB0byB6ZXJvIGlzCi0gIGFsbG93ZWQuICBTZWVraW5nIGZvcndhcmQgZGVjb21wcmVzc2VzIGRhdGEgdW50aWwgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBpbgotICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gcmVhY2hlZC4gIFNlZWtpbmcgYmFja3dhcmRzLCBzZWVraW5nIHJlbGF0aXZlCi0gIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgcmVxdWVzdGluZyB0aGUgc2l6ZSBvZiB0aGUgc3RyZWFtLCBhbmQgd3JpdGluZyB0bwotICB0aGUgc3RyZWFtIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLgotCi0gIFRoZSBQb3NpdGlvbiBwcm9wZXJ0eSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdW5jb21wcmVzc2VkIGRhdGEgdGhhdAotICBoYXZlIGJlZW4gcmVhZCBmcm9tIHRoZSBzdHJlYW0gc28gZmFyLgotCi0gIFRoZSBPblByb2dyZXNzIGV2ZW50IGlzIGNhbGxlZCBlYWNoIHRpbWUgdGhlIGludGVybmFsIGlucHV0IGJ1ZmZlciBvZgotICBjb21wcmVzc2VkIGRhdGEgaXMgZXhoYXVzdGVkIGFuZCB0aGUgbmV4dCBibG9jayBpcyByZWFkIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLSAgVGhpcyBpcyB1c2VmdWwgZm9yIHVwZGF0aW5nIGEgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdoZW4geW91IGFyZSByZWFkaW5nIGEKLSAgbGFyZ2UgY2h1bmsgb2YgZGF0YSBmcm9tIHRoZSBkZWNvbXByZXNzaW9uIHN0cmVhbSBpbiBhIHNpbmdsZSBjYWxsLn0KLQotICBURGVjb21wcmVzc2lvblN0cmVhbSA9IGNsYXNzKFRDdXN0b21abGliU3RyZWFtKQotICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoU291cmNlOiBUU3RyZWFtKTsKLSAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQodmFyIEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBXcml0ZShjb25zdCBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gU2VlayhPZmZzZXQ6IExvbmdpbnQ7IE9yaWdpbjogV29yZCk6IExvbmdpbnQ7IG92ZXJyaWRlOwotICAgIHByb3BlcnR5IE9uUHJvZ3Jlc3M7Ci0gIGVuZDsKLQotCi0KLXsgQ29tcHJlc3NCdWYgY29tcHJlc3NlcyBkYXRhLCBidWZmZXIgdG8gYnVmZmVyLCBpbiBvbmUgY2FsbC4KLSAgIEluOiBJbkJ1ZiA9IHB0ciB0byBjb21wcmVzc2VkIGRhdGEKLSAgICAgICBJbkJ5dGVzID0gbnVtYmVyIG9mIGJ5dGVzIGluIEluQnVmCi0gIE91dDogT3V0QnVmID0gcHRyIHRvIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgY29udGFpbmluZyBkZWNvbXByZXNzZWQgZGF0YQotICAgICAgIE91dEJ5dGVzID0gbnVtYmVyIG9mIGJ5dGVzIGluIE91dEJ1ZiAgIH0KLXByb2NlZHVyZSBDb21wcmVzc0J1Zihjb25zdCBJbkJ1ZjogUG9pbnRlcjsgSW5CeXRlczogSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICBvdXQgT3V0QnVmOiBQb2ludGVyOyBvdXQgT3V0Qnl0ZXM6IEludGVnZXIpOwotCi0KLXsgRGVjb21wcmVzc0J1ZiBkZWNvbXByZXNzZXMgZGF0YSwgYnVmZmVyIHRvIGJ1ZmZlciwgaW4gb25lIGNhbGwuCi0gICBJbjogSW5CdWYgPSBwdHIgdG8gY29tcHJlc3NlZCBkYXRhCi0gICAgICAgSW5CeXRlcyA9IG51bWJlciBvZiBieXRlcyBpbiBJbkJ1ZgotICAgICAgIE91dEVzdGltYXRlID0gemVybywgb3IgZXN0LiBzaXplIG9mIHRoZSBkZWNvbXByZXNzZWQgZGF0YQotICBPdXQ6IE91dEJ1ZiA9IHB0ciB0byBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIGNvbnRhaW5pbmcgZGVjb21wcmVzc2VkIGRhdGEKLSAgICAgICBPdXRCeXRlcyA9IG51bWJlciBvZiBieXRlcyBpbiBPdXRCdWYgICB9Ci1wcm9jZWR1cmUgRGVjb21wcmVzc0J1Zihjb25zdCBJbkJ1ZjogUG9pbnRlcjsgSW5CeXRlczogSW50ZWdlcjsKLSBPdXRFc3RpbWF0ZTogSW50ZWdlcjsgb3V0IE91dEJ1ZjogUG9pbnRlcjsgb3V0IE91dEJ5dGVzOiBJbnRlZ2VyKTsKLQoteyBEZWNvbXByZXNzVG9Vc2VyQnVmIGRlY29tcHJlc3NlcyBkYXRhLCBidWZmZXIgdG8gYnVmZmVyLCBpbiBvbmUgY2FsbC4KLSAgIEluOiBJbkJ1ZiA9IHB0ciB0byBjb21wcmVzc2VkIGRhdGEKLSAgICAgICBJbkJ5dGVzID0gbnVtYmVyIG9mIGJ5dGVzIGluIEluQnVmCi0gIE91dDogT3V0QnVmID0gcHRyIHRvIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciB0byBjb250YWluIGRlY29tcHJlc3NlZCBkYXRhCi0gICAgICAgQnVmU2l6ZSA9IG51bWJlciBvZiBieXRlcyBpbiBPdXRCdWYgICB9Ci1wcm9jZWR1cmUgRGVjb21wcmVzc1RvVXNlckJ1Zihjb25zdCBJbkJ1ZjogUG9pbnRlcjsgSW5CeXRlczogSW50ZWdlcjsKLSAgY29uc3QgT3V0QnVmOiBQb2ludGVyOyBCdWZTaXplOiBJbnRlZ2VyKTsKLQotY29uc3QKLSAgemxpYl92ZXJzaW9uID0gJzEuMi4zJzsKLQotdHlwZQotICBFWmxpYkVycm9yID0gY2xhc3MoRXhjZXB0aW9uKTsKLSAgRUNvbXByZXNzaW9uRXJyb3IgPSBjbGFzcyhFWmxpYkVycm9yKTsKLSAgRURlY29tcHJlc3Npb25FcnJvciA9IGNsYXNzKEVabGliRXJyb3IpOwotCi1pbXBsZW1lbnRhdGlvbgotCi11c2VzIFpMaWJDb25zdDsKLQotY29uc3QKLSAgWl9OT19GTFVTSCAgICAgID0gMDsKLSAgWl9QQVJUSUFMX0ZMVVNIID0gMTsKLSAgWl9TWU5DX0ZMVVNIICAgID0gMjsKLSAgWl9GVUxMX0ZMVVNIICAgID0gMzsKLSAgWl9GSU5JU0ggICAgICAgID0gNDsKLQotICBaX09LICAgICAgICAgICAgPSAwOwotICBaX1NUUkVBTV9FTkQgICAgPSAxOwotICBaX05FRURfRElDVCAgICAgPSAyOwotICBaX0VSUk5PICAgICAgICAgPSAoLTEpOwotICBaX1NUUkVBTV9FUlJPUiAgPSAoLTIpOwotICBaX0RBVEFfRVJST1IgICAgPSAoLTMpOwotICBaX01FTV9FUlJPUiAgICAgPSAoLTQpOwotICBaX0JVRl9FUlJPUiAgICAgPSAoLTUpOwotICBaX1ZFUlNJT05fRVJST1IgPSAoLTYpOwotCi0gIFpfTk9fQ09NUFJFU1NJT04gICAgICAgPSAgIDA7Ci0gIFpfQkVTVF9TUEVFRCAgICAgICAgICAgPSAgIDE7Ci0gIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgPSAgIDk7Ci0gIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgPSAoLTEpOwotCi0gIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7Ci0gIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7Ci0gIFpfUkxFICAgICAgICAgICAgICAgICA9IDM7Ci0gIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7Ci0KLSAgWl9CSU5BUlkgICA9IDA7Ci0gIFpfQVNDSUkgICAgPSAxOwotICBaX1VOS05PV04gID0gMjsKLQotICBaX0RFRkxBVEVEID0gODsKLQotCi17JEwgYWRsZXIzMi5vYmp9Ci17JEwgY29tcHJlc3Mub2JqfQoteyRMIGNyYzMyLm9ian0KLXskTCBkZWZsYXRlLm9ian0KLXskTCBpbmZiYWNrLm9ian0KLXskTCBpbmZmYXN0Lm9ian0KLXskTCBpbmZsYXRlLm9ian0KLXskTCBpbmZ0cmVlcy5vYmp9Ci17JEwgdHJlZXMub2JqfQoteyRMIHVuY29tcHIub2JqfQoteyRMIHp1dGlsLm9ian0KLQotcHJvY2VkdXJlIGFkbGVyMzI7IGV4dGVybmFsOwotcHJvY2VkdXJlIGNvbXByZXNzQm91bmQ7IGV4dGVybmFsOwotcHJvY2VkdXJlIGNyYzMyOyBleHRlcm5hbDsKLXByb2NlZHVyZSBkZWZsYXRlSW5pdDJfOyBleHRlcm5hbDsKLXByb2NlZHVyZSBkZWZsYXRlUGFyYW1zOyBleHRlcm5hbDsKLQotZnVuY3Rpb24gX21hbGxvYyhTaXplOiBJbnRlZ2VyKTogUG9pbnRlcjsgY2RlY2w7Ci1iZWdpbgotICBSZXN1bHQgOj0gQWxsb2NNZW0oU2l6ZSk7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBfZnJlZShCbG9jazogUG9pbnRlcik7IGNkZWNsOwotYmVnaW4KLSAgRnJlZU1lbShCbG9jayk7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBfbWVtc2V0KFA6IFBvaW50ZXI7IEI6IEJ5dGU7IGNvdW50OiBJbnRlZ2VyKTsgY2RlY2w7Ci1iZWdpbgotICBGaWxsQ2hhcihQXiwgY291bnQsIEIpOwotZW5kOwotCi1wcm9jZWR1cmUgX21lbWNweShkZXN0LCBzb3VyY2U6IFBvaW50ZXI7IGNvdW50OiBJbnRlZ2VyKTsgY2RlY2w7Ci1iZWdpbgotICBNb3ZlKHNvdXJjZV4sIGRlc3ReLCBjb3VudCk7Ci1lbmQ7Ci0KLQotCi0vLyBkZWZsYXRlIGNvbXByZXNzZXMgZGF0YQotZnVuY3Rpb24gZGVmbGF0ZUluaXRfKHZhciBzdHJtOiBUWlN0cmVhbVJlYzsgbGV2ZWw6IEludGVnZXI7IHZlcnNpb246IFBDaGFyOwotICByZWNzaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlKHZhciBzdHJtOiBUWlN0cmVhbVJlYzsgZmx1c2g6IEludGVnZXIpOiBJbnRlZ2VyOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGRlZmxhdGVFbmQodmFyIHN0cm06IFRaU3RyZWFtUmVjKTogSW50ZWdlcjsgZXh0ZXJuYWw7Ci0KLS8vIGluZmxhdGUgZGVjb21wcmVzc2VzIGRhdGEKLWZ1bmN0aW9uIGluZmxhdGVJbml0Xyh2YXIgc3RybTogVFpTdHJlYW1SZWM7IHZlcnNpb246IFBDaGFyOwotICByZWNzaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlKHZhciBzdHJtOiBUWlN0cmVhbVJlYzsgZmx1c2g6IEludGVnZXIpOiBJbnRlZ2VyOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGluZmxhdGVFbmQodmFyIHN0cm06IFRaU3RyZWFtUmVjKTogSW50ZWdlcjsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlUmVzZXQodmFyIHN0cm06IFRaU3RyZWFtUmVjKTogSW50ZWdlcjsgZXh0ZXJuYWw7Ci0KLQotZnVuY3Rpb24gemxpYkFsbG9jTWVtKEFwcERhdGE6IFBvaW50ZXI7IEl0ZW1zLCBTaXplOiBJbnRlZ2VyKTogUG9pbnRlcjsgY2RlY2w7Ci1iZWdpbgotLy8gIEdldE1lbShSZXN1bHQsIEl0ZW1zKlNpemUpOwotICBSZXN1bHQgOj0gQWxsb2NNZW0oSXRlbXMgKiBTaXplKTsKLWVuZDsKLQotcHJvY2VkdXJlIHpsaWJGcmVlTWVtKEFwcERhdGEsIEJsb2NrOiBQb2ludGVyKTsgY2RlY2w7Ci1iZWdpbgotICBGcmVlTWVtKEJsb2NrKTsKLWVuZDsKLQote2Z1bmN0aW9uIHpsaWJDaGVjayhjb2RlOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBjb2RlOwotICBpZiBjb2RlIDwgMCB0aGVuCi0gICAgcmFpc2UgRVpsaWJFcnJvci5DcmVhdGUoJ2Vycm9yJyk7ICAgIC8vISEKLWVuZDt9Ci0KLWZ1bmN0aW9uIENDaGVjayhjb2RlOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBjb2RlOwotICBpZiBjb2RlIDwgMCB0aGVuCi0gICAgcmFpc2UgRUNvbXByZXNzaW9uRXJyb3IuQ3JlYXRlKCdlcnJvcicpOyAvLyEhCi1lbmQ7Ci0KLWZ1bmN0aW9uIERDaGVjayhjb2RlOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBjb2RlOwotICBpZiBjb2RlIDwgMCB0aGVuCi0gICAgcmFpc2UgRURlY29tcHJlc3Npb25FcnJvci5DcmVhdGUoJ2Vycm9yJyk7ICAvLyEhCi1lbmQ7Ci0KLXByb2NlZHVyZSBDb21wcmVzc0J1Zihjb25zdCBJbkJ1ZjogUG9pbnRlcjsgSW5CeXRlczogSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICBvdXQgT3V0QnVmOiBQb2ludGVyOyBvdXQgT3V0Qnl0ZXM6IEludGVnZXIpOwotdmFyCi0gIHN0cm06IFRaU3RyZWFtUmVjOwotICBQOiBQb2ludGVyOwotYmVnaW4KLSAgRmlsbENoYXIoc3RybSwgc2l6ZW9mKHN0cm0pLCAwKTsKLSAgc3RybS56YWxsb2MgOj0gemxpYkFsbG9jTWVtOwotICBzdHJtLnpmcmVlIDo9IHpsaWJGcmVlTWVtOwotICBPdXRCeXRlcyA6PSAoKEluQnl0ZXMgKyAoSW5CeXRlcyBkaXYgMTApICsgMTIpICsgMjU1KSBhbmQgbm90IDI1NTsKLSAgR2V0TWVtKE91dEJ1ZiwgT3V0Qnl0ZXMpOwotICB0cnkKLSAgICBzdHJtLm5leHRfaW4gOj0gSW5CdWY7Ci0gICAgc3RybS5hdmFpbF9pbiA6PSBJbkJ5dGVzOwotICAgIHN0cm0ubmV4dF9vdXQgOj0gT3V0QnVmOwotICAgIHN0cm0uYXZhaWxfb3V0IDo9IE91dEJ5dGVzOwotICAgIENDaGVjayhkZWZsYXRlSW5pdF8oc3RybSwgWl9CRVNUX0NPTVBSRVNTSU9OLCB6bGliX3ZlcnNpb24sIHNpemVvZihzdHJtKSkpOwotICAgIHRyeQotICAgICAgd2hpbGUgQ0NoZWNrKGRlZmxhdGUoc3RybSwgWl9GSU5JU0gpKSA8PiBaX1NUUkVBTV9FTkQgZG8KLSAgICAgIGJlZ2luCi0gICAgICAgIFAgOj0gT3V0QnVmOwotICAgICAgICBJbmMoT3V0Qnl0ZXMsIDI1Nik7Ci0gICAgICAgIFJlYWxsb2NNZW0oT3V0QnVmLCBPdXRCeXRlcyk7Ci0gICAgICAgIHN0cm0ubmV4dF9vdXQgOj0gUENoYXIoSW50ZWdlcihPdXRCdWYpICsgKEludGVnZXIoc3RybS5uZXh0X291dCkgLSBJbnRlZ2VyKFApKSk7Ci0gICAgICAgIHN0cm0uYXZhaWxfb3V0IDo9IDI1NjsKLSAgICAgIGVuZDsKLSAgICBmaW5hbGx5Ci0gICAgICBDQ2hlY2soZGVmbGF0ZUVuZChzdHJtKSk7Ci0gICAgZW5kOwotICAgIFJlYWxsb2NNZW0oT3V0QnVmLCBzdHJtLnRvdGFsX291dCk7Ci0gICAgT3V0Qnl0ZXMgOj0gc3RybS50b3RhbF9vdXQ7Ci0gIGV4Y2VwdAotICAgIEZyZWVNZW0oT3V0QnVmKTsKLSAgICByYWlzZQotICBlbmQ7Ci1lbmQ7Ci0KLQotcHJvY2VkdXJlIERlY29tcHJlc3NCdWYoY29uc3QgSW5CdWY6IFBvaW50ZXI7IEluQnl0ZXM6IEludGVnZXI7Ci0gIE91dEVzdGltYXRlOiBJbnRlZ2VyOyBvdXQgT3V0QnVmOiBQb2ludGVyOyBvdXQgT3V0Qnl0ZXM6IEludGVnZXIpOwotdmFyCi0gIHN0cm06IFRaU3RyZWFtUmVjOwotICBQOiBQb2ludGVyOwotICBCdWZJbmM6IEludGVnZXI7Ci1iZWdpbgotICBGaWxsQ2hhcihzdHJtLCBzaXplb2Yoc3RybSksIDApOwotICBzdHJtLnphbGxvYyA6PSB6bGliQWxsb2NNZW07Ci0gIHN0cm0uemZyZWUgOj0gemxpYkZyZWVNZW07Ci0gIEJ1ZkluYyA6PSAoSW5CeXRlcyArIDI1NSkgYW5kIG5vdCAyNTU7Ci0gIGlmIE91dEVzdGltYXRlID0gMCB0aGVuCi0gICAgT3V0Qnl0ZXMgOj0gQnVmSW5jCi0gIGVsc2UKLSAgICBPdXRCeXRlcyA6PSBPdXRFc3RpbWF0ZTsKLSAgR2V0TWVtKE91dEJ1ZiwgT3V0Qnl0ZXMpOwotICB0cnkKLSAgICBzdHJtLm5leHRfaW4gOj0gSW5CdWY7Ci0gICAgc3RybS5hdmFpbF9pbiA6PSBJbkJ5dGVzOwotICAgIHN0cm0ubmV4dF9vdXQgOj0gT3V0QnVmOwotICAgIHN0cm0uYXZhaWxfb3V0IDo9IE91dEJ5dGVzOwotICAgIERDaGVjayhpbmZsYXRlSW5pdF8oc3RybSwgemxpYl92ZXJzaW9uLCBzaXplb2Yoc3RybSkpKTsKLSAgICB0cnkKLSAgICAgIHdoaWxlIERDaGVjayhpbmZsYXRlKHN0cm0sIFpfTk9fRkxVU0gpKSA8PiBaX1NUUkVBTV9FTkQgZG8KLSAgICAgIGJlZ2luCi0gICAgICAgIFAgOj0gT3V0QnVmOwotICAgICAgICBJbmMoT3V0Qnl0ZXMsIEJ1ZkluYyk7Ci0gICAgICAgIFJlYWxsb2NNZW0oT3V0QnVmLCBPdXRCeXRlcyk7Ci0gICAgICAgIHN0cm0ubmV4dF9vdXQgOj0gUENoYXIoSW50ZWdlcihPdXRCdWYpICsgKEludGVnZXIoc3RybS5uZXh0X291dCkgLSBJbnRlZ2VyKFApKSk7Ci0gICAgICAgIHN0cm0uYXZhaWxfb3V0IDo9IEJ1ZkluYzsKLSAgICAgIGVuZDsKLSAgICBmaW5hbGx5Ci0gICAgICBEQ2hlY2soaW5mbGF0ZUVuZChzdHJtKSk7Ci0gICAgZW5kOwotICAgIFJlYWxsb2NNZW0oT3V0QnVmLCBzdHJtLnRvdGFsX291dCk7Ci0gICAgT3V0Qnl0ZXMgOj0gc3RybS50b3RhbF9vdXQ7Ci0gIGV4Y2VwdAotICAgIEZyZWVNZW0oT3V0QnVmKTsKLSAgICByYWlzZQotICBlbmQ7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBEZWNvbXByZXNzVG9Vc2VyQnVmKGNvbnN0IEluQnVmOiBQb2ludGVyOyBJbkJ5dGVzOiBJbnRlZ2VyOwotICBjb25zdCBPdXRCdWY6IFBvaW50ZXI7IEJ1ZlNpemU6IEludGVnZXIpOwotdmFyCi0gIHN0cm06IFRaU3RyZWFtUmVjOwotYmVnaW4KLSAgRmlsbENoYXIoc3RybSwgc2l6ZW9mKHN0cm0pLCAwKTsKLSAgc3RybS56YWxsb2MgOj0gemxpYkFsbG9jTWVtOwotICBzdHJtLnpmcmVlIDo9IHpsaWJGcmVlTWVtOwotICBzdHJtLm5leHRfaW4gOj0gSW5CdWY7Ci0gIHN0cm0uYXZhaWxfaW4gOj0gSW5CeXRlczsKLSAgc3RybS5uZXh0X291dCA6PSBPdXRCdWY7Ci0gIHN0cm0uYXZhaWxfb3V0IDo9IEJ1ZlNpemU7Ci0gIERDaGVjayhpbmZsYXRlSW5pdF8oc3RybSwgemxpYl92ZXJzaW9uLCBzaXplb2Yoc3RybSkpKTsKLSAgdHJ5Ci0gICAgaWYgRENoZWNrKGluZmxhdGUoc3RybSwgWl9GSU5JU0gpKSA8PiBaX1NUUkVBTV9FTkQgdGhlbgotICAgICAgcmFpc2UgRVpsaWJFcnJvci5DcmVhdGVSZXMoQHNUYXJnZXRCdWZmZXJUb29TbWFsbCk7Ci0gIGZpbmFsbHkKLSAgICBEQ2hlY2soaW5mbGF0ZUVuZChzdHJtKSk7Ci0gIGVuZDsKLWVuZDsKLQotLy8gVEN1c3RvbVpsaWJTdHJlYW0KLQotY29uc3RydWN0b3IgVEN1c3RvbVpMaWJTdHJlYW0uQ3JlYXRlKFN0cm06IFRTdHJlYW0pOwotYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRlN0cm0gOj0gU3RybTsKLSAgRlN0cm1Qb3MgOj0gU3RybS5Qb3NpdGlvbjsKLSAgRlpSZWMuemFsbG9jIDo9IHpsaWJBbGxvY01lbTsKLSAgRlpSZWMuemZyZWUgOj0gemxpYkZyZWVNZW07Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUQ3VzdG9tWkxpYlN0cmVhbS5Qcm9ncmVzcyhTZW5kZXI6IFRPYmplY3QpOwotYmVnaW4KLSAgaWYgQXNzaWduZWQoRk9uUHJvZ3Jlc3MpIHRoZW4gRk9uUHJvZ3Jlc3MoU2VuZGVyKTsKLWVuZDsKLQotCi0vLyBUQ29tcHJlc3Npb25TdHJlYW0KLQotY29uc3RydWN0b3IgVENvbXByZXNzaW9uU3RyZWFtLkNyZWF0ZShDb21wcmVzc2lvbkxldmVsOiBUQ29tcHJlc3Npb25MZXZlbDsKLSAgRGVzdDogVFN0cmVhbSk7Ci1jb25zdAotICBMZXZlbHM6IGFycmF5IFtUQ29tcHJlc3Npb25MZXZlbF0gb2YgU2hvcnRJbnQgPQotICAgIChaX05PX0NPTVBSRVNTSU9OLCBaX0JFU1RfU1BFRUQsIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGUoRGVzdCk7Ci0gIEZaUmVjLm5leHRfb3V0IDo9IEZCdWZmZXI7Ci0gIEZaUmVjLmF2YWlsX291dCA6PSBzaXplb2YoRkJ1ZmZlcik7Ci0gIENDaGVjayhkZWZsYXRlSW5pdF8oRlpSZWMsIExldmVsc1tDb21wcmVzc2lvbkxldmVsXSwgemxpYl92ZXJzaW9uLCBzaXplb2YoRlpSZWMpKSk7Ci1lbmQ7Ci0KLWRlc3RydWN0b3IgVENvbXByZXNzaW9uU3RyZWFtLkRlc3Ryb3k7Ci1iZWdpbgotICBGWlJlYy5uZXh0X2luIDo9IG5pbDsKLSAgRlpSZWMuYXZhaWxfaW4gOj0gMDsKLSAgdHJ5Ci0gICAgaWYgRlN0cm0uUG9zaXRpb24gPD4gRlN0cm1Qb3MgdGhlbiBGU3RybS5Qb3NpdGlvbiA6PSBGU3RybVBvczsKLSAgICB3aGlsZSAoQ0NoZWNrKGRlZmxhdGUoRlpSZWMsIFpfRklOSVNIKSkgPD4gWl9TVFJFQU1fRU5EKQotICAgICAgYW5kIChGWlJlYy5hdmFpbF9vdXQgPSAwKSBkbwotICAgIGJlZ2luCi0gICAgICBGU3RybS5Xcml0ZUJ1ZmZlcihGQnVmZmVyLCBzaXplb2YoRkJ1ZmZlcikpOwotICAgICAgRlpSZWMubmV4dF9vdXQgOj0gRkJ1ZmZlcjsKLSAgICAgIEZaUmVjLmF2YWlsX291dCA6PSBzaXplb2YoRkJ1ZmZlcik7Ci0gICAgZW5kOwotICAgIGlmIEZaUmVjLmF2YWlsX291dCA8IHNpemVvZihGQnVmZmVyKSB0aGVuCi0gICAgICBGU3RybS5Xcml0ZUJ1ZmZlcihGQnVmZmVyLCBzaXplb2YoRkJ1ZmZlcikgLSBGWlJlYy5hdmFpbF9vdXQpOwotICBmaW5hbGx5Ci0gICAgZGVmbGF0ZUVuZChGWlJlYyk7Ci0gIGVuZDsKLSAgaW5oZXJpdGVkIERlc3Ryb3k7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRDb21wcmVzc2lvblN0cmVhbS5SZWFkKHZhciBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsKLWJlZ2luCi0gIHJhaXNlIEVDb21wcmVzc2lvbkVycm9yLkNyZWF0ZVJlcyhAc0ludmFsaWRTdHJlYW1PcCk7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRDb21wcmVzc2lvblN0cmVhbS5Xcml0ZShjb25zdCBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsKLWJlZ2luCi0gIEZaUmVjLm5leHRfaW4gOj0gQEJ1ZmZlcjsKLSAgRlpSZWMuYXZhaWxfaW4gOj0gQ291bnQ7Ci0gIGlmIEZTdHJtLlBvc2l0aW9uIDw+IEZTdHJtUG9zIHRoZW4gRlN0cm0uUG9zaXRpb24gOj0gRlN0cm1Qb3M7Ci0gIHdoaWxlIChGWlJlYy5hdmFpbF9pbiA+IDApIGRvCi0gIGJlZ2luCi0gICAgQ0NoZWNrKGRlZmxhdGUoRlpSZWMsIDApKTsKLSAgICBpZiBGWlJlYy5hdmFpbF9vdXQgPSAwIHRoZW4KLSAgICBiZWdpbgotICAgICAgRlN0cm0uV3JpdGVCdWZmZXIoRkJ1ZmZlciwgc2l6ZW9mKEZCdWZmZXIpKTsKLSAgICAgIEZaUmVjLm5leHRfb3V0IDo9IEZCdWZmZXI7Ci0gICAgICBGWlJlYy5hdmFpbF9vdXQgOj0gc2l6ZW9mKEZCdWZmZXIpOwotICAgICAgRlN0cm1Qb3MgOj0gRlN0cm0uUG9zaXRpb247Ci0gICAgICBQcm9ncmVzcyhTZWxmKTsKLSAgICBlbmQ7Ci0gIGVuZDsKLSAgUmVzdWx0IDo9IENvdW50OwotZW5kOwotCi1mdW5jdGlvbiBUQ29tcHJlc3Npb25TdHJlYW0uU2VlayhPZmZzZXQ6IExvbmdpbnQ7IE9yaWdpbjogV29yZCk6IExvbmdpbnQ7Ci1iZWdpbgotICBpZiAoT2Zmc2V0ID0gMCkgYW5kIChPcmlnaW4gPSBzb0Zyb21DdXJyZW50KSB0aGVuCi0gICAgUmVzdWx0IDo9IEZaUmVjLnRvdGFsX2luCi0gIGVsc2UKLSAgICByYWlzZSBFQ29tcHJlc3Npb25FcnJvci5DcmVhdGVSZXMoQHNJbnZhbGlkU3RyZWFtT3ApOwotZW5kOwotCi1mdW5jdGlvbiBUQ29tcHJlc3Npb25TdHJlYW0uR2V0Q29tcHJlc3Npb25SYXRlOiBTaW5nbGU7Ci1iZWdpbgotICBpZiBGWlJlYy50b3RhbF9pbiA9IDAgdGhlbgotICAgIFJlc3VsdCA6PSAwCi0gIGVsc2UKLSAgICBSZXN1bHQgOj0gKDEuMCAtIChGWlJlYy50b3RhbF9vdXQgLyBGWlJlYy50b3RhbF9pbikpICogMTAwLjA7Ci1lbmQ7Ci0KLQotLy8gVERlY29tcHJlc3Npb25TdHJlYW0KLQotY29uc3RydWN0b3IgVERlY29tcHJlc3Npb25TdHJlYW0uQ3JlYXRlKFNvdXJjZTogVFN0cmVhbSk7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKFNvdXJjZSk7Ci0gIEZaUmVjLm5leHRfaW4gOj0gRkJ1ZmZlcjsKLSAgRlpSZWMuYXZhaWxfaW4gOj0gMDsKLSAgRENoZWNrKGluZmxhdGVJbml0XyhGWlJlYywgemxpYl92ZXJzaW9uLCBzaXplb2YoRlpSZWMpKSk7Ci1lbmQ7Ci0KLWRlc3RydWN0b3IgVERlY29tcHJlc3Npb25TdHJlYW0uRGVzdHJveTsKLWJlZ2luCi0gIEZTdHJtLlNlZWsoLUZaUmVjLmF2YWlsX2luLCAxKTsKLSAgaW5mbGF0ZUVuZChGWlJlYyk7Ci0gIGluaGVyaXRlZCBEZXN0cm95OwotZW5kOwotCi1mdW5jdGlvbiBURGVjb21wcmVzc2lvblN0cmVhbS5SZWFkKHZhciBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsKLWJlZ2luCi0gIEZaUmVjLm5leHRfb3V0IDo9IEBCdWZmZXI7Ci0gIEZaUmVjLmF2YWlsX291dCA6PSBDb3VudDsKLSAgaWYgRlN0cm0uUG9zaXRpb24gPD4gRlN0cm1Qb3MgdGhlbiBGU3RybS5Qb3NpdGlvbiA6PSBGU3RybVBvczsKLSAgd2hpbGUgKEZaUmVjLmF2YWlsX291dCA+IDApIGRvCi0gIGJlZ2luCi0gICAgaWYgRlpSZWMuYXZhaWxfaW4gPSAwIHRoZW4KLSAgICBiZWdpbgotICAgICAgRlpSZWMuYXZhaWxfaW4gOj0gRlN0cm0uUmVhZChGQnVmZmVyLCBzaXplb2YoRkJ1ZmZlcikpOwotICAgICAgaWYgRlpSZWMuYXZhaWxfaW4gPSAwIHRoZW4KLSAgICAgIGJlZ2luCi0gICAgICAgIFJlc3VsdCA6PSBDb3VudCAtIEZaUmVjLmF2YWlsX291dDsKLSAgICAgICAgRXhpdDsKLSAgICAgIGVuZDsKLSAgICAgIEZaUmVjLm5leHRfaW4gOj0gRkJ1ZmZlcjsKLSAgICAgIEZTdHJtUG9zIDo9IEZTdHJtLlBvc2l0aW9uOwotICAgICAgUHJvZ3Jlc3MoU2VsZik7Ci0gICAgZW5kOwotICAgIENDaGVjayhpbmZsYXRlKEZaUmVjLCAwKSk7Ci0gIGVuZDsKLSAgUmVzdWx0IDo9IENvdW50OwotZW5kOwotCi1mdW5jdGlvbiBURGVjb21wcmVzc2lvblN0cmVhbS5Xcml0ZShjb25zdCBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsKLWJlZ2luCi0gIHJhaXNlIEVEZWNvbXByZXNzaW9uRXJyb3IuQ3JlYXRlUmVzKEBzSW52YWxpZFN0cmVhbU9wKTsKLWVuZDsKLQotZnVuY3Rpb24gVERlY29tcHJlc3Npb25TdHJlYW0uU2VlayhPZmZzZXQ6IExvbmdpbnQ7IE9yaWdpbjogV29yZCk6IExvbmdpbnQ7Ci12YXIKLSAgSTogSW50ZWdlcjsKLSAgQnVmOiBhcnJheSBbMC4uNDA5NV0gb2YgQ2hhcjsKLWJlZ2luCi0gIGlmIChPZmZzZXQgPSAwKSBhbmQgKE9yaWdpbiA9IHNvRnJvbUJlZ2lubmluZykgdGhlbgotICBiZWdpbgotICAgIERDaGVjayhpbmZsYXRlUmVzZXQoRlpSZWMpKTsKLSAgICBGWlJlYy5uZXh0X2luIDo9IEZCdWZmZXI7Ci0gICAgRlpSZWMuYXZhaWxfaW4gOj0gMDsKLSAgICBGU3RybS5Qb3NpdGlvbiA6PSAwOwotICAgIEZTdHJtUG9zIDo9IDA7Ci0gIGVuZAotICBlbHNlIGlmICggKE9mZnNldCA+PSAwKSBhbmQgKE9yaWdpbiA9IHNvRnJvbUN1cnJlbnQpKSBvcgotICAgICAgICAgICggKChPZmZzZXQgLSBGWlJlYy50b3RhbF9vdXQpID4gMCkgYW5kIChPcmlnaW4gPSBzb0Zyb21CZWdpbm5pbmcpKSB0aGVuCi0gIGJlZ2luCi0gICAgaWYgT3JpZ2luID0gc29Gcm9tQmVnaW5uaW5nIHRoZW4gRGVjKE9mZnNldCwgRlpSZWMudG90YWxfb3V0KTsKLSAgICBpZiBPZmZzZXQgPiAwIHRoZW4KLSAgICBiZWdpbgotICAgICAgZm9yIEkgOj0gMSB0byBPZmZzZXQgZGl2IHNpemVvZihCdWYpIGRvCi0gICAgICAgIFJlYWRCdWZmZXIoQnVmLCBzaXplb2YoQnVmKSk7Ci0gICAgICBSZWFkQnVmZmVyKEJ1ZiwgT2Zmc2V0IG1vZCBzaXplb2YoQnVmKSk7Ci0gICAgZW5kOwotICBlbmQKLSAgZWxzZQotICAgIHJhaXNlIEVEZWNvbXByZXNzaW9uRXJyb3IuQ3JlYXRlUmVzKEBzSW52YWxpZFN0cmVhbU9wKTsKLSAgUmVzdWx0IDo9IEZaUmVjLnRvdGFsX291dDsKLWVuZDsKLQotCi1lbmQuCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9kZWxwaGkvWkxpYkNvbnN0LnBhcyBiL2xpYnMvemxpYi9jb250cmliL2RlbHBoaS9aTGliQ29uc3QucGFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGZlMTM2Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2RlbHBoaS9aTGliQ29uc3QucGFzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotdW5pdCBaTGliQ29uc3Q7Ci0KLWludGVyZmFjZQotCi1yZXNvdXJjZXN0cmluZwotICBzVGFyZ2V0QnVmZmVyVG9vU21hbGwgPSAnWkxpYiBlcnJvcjogdGFyZ2V0IGJ1ZmZlciBtYXkgYmUgdG9vIHNtYWxsJzsKLSAgc0ludmFsaWRTdHJlYW1PcCA9ICdJbnZhbGlkIHN0cmVhbSBvcGVyYXRpb24nOwotCi1pbXBsZW1lbnRhdGlvbgotCi1lbmQuCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9kZWxwaGkvcmVhZG1lLnR4dCBiL2xpYnMvemxpYi9jb250cmliL2RlbHBoaS9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGM5YThiLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2RlbHBoaS9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotCi1PdmVydmlldwotPT09PT09PT0KLQotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYW4gdXBkYXRlIHRvIHRoZSBaTGliIGludGVyZmFjZSB1bml0LAotZGlzdHJpYnV0ZWQgYnkgQm9ybGFuZCBhcyBhIERlbHBoaSBzdXBwbGVtZW50YWwgY29tcG9uZW50LgotCi1UaGUgb3JpZ2luYWwgWkxpYiB1bml0IGlzIENvcHlyaWdodCAoYykgMTk5Nyw5OSBCb3JsYW5kIENvcnAuLAotYW5kIGlzIGJhc2VkIG9uIHpsaWIgdmVyc2lvbiAxLjAuNC4gIFRoZXJlIGFyZSBhIHNlcmllcyBvZiBidWdzCi1hbmQgc2VjdXJpdHkgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgb2xkIHpsaWIgdmVyc2lvbiwgYW5kCi13ZSByZWNvbW1lbmQgdGhlIHVzZXJzIHRvIHVwZGF0ZSB0aGVpciBaTGliIHVuaXQuCi0KLQotU3VtbWFyeSBvZiBtb2RpZmljYXRpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLSBJbXByb3ZlZCBtYWtlZmlsZSwgYWRhcHRlZCB0byB6bGliIHZlcnNpb24gMS4yLjEuCi0KLS0gU29tZSBmaWVsZCB0eXBlcyBmcm9tIFRaU3RyZWFtUmVjIGFyZSBjaGFuZ2VkIGZyb20gSW50ZWdlciB0bwotICBMb25naW50LCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgemxpYi5oIGhlYWRlciwgYW5kIGZvciA2NC1iaXQKLSAgcmVhZGluZXNzLgotCi0tIFRoZSB6bGliX3ZlcnNpb24gY29uc3RhbnQgaXMgdXBkYXRlZC4KLQotLSBUaGUgbmV3IFpfUkxFIHN0cmF0ZWd5IGhhcyBpdHMgY29ycmVzcG9uZGluZyBzeW1ib2xpYyBjb25zdGFudC4KLQotLSBUaGUgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb24gdHlwZXMKLSAgKFRBbGxvYywgVEZyZWUsIHpsaWJBbGxvY01lbSBhbmQgemxpYkZyZWVNZW0pIGFyZSBub3cgY2RlY2wsCi0gIGFuZCBfbWFsbG9jIGFuZCBfZnJlZSBhcmUgYWRkZWQgYXMgQyBSVEwgc3R1YnMuICBBcyBhIHJlc3VsdCwKLSAgdGhlIG9yaWdpbmFsIEMgc291cmNlcyBvZiB6bGliIGNhbiBiZSBjb21waWxlZCBvdXQgb2YgdGhlIGJveCwKLSAgYW5kIGxpbmtlZCB0byB0aGUgWkxpYiB1bml0LgotCi0KLVN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudHMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ3VycmVudGx5LCB0aGUgWkxpYiB1bml0IHByb3ZpZGVzIG9ubHkgYSBsaW1pdGVkIHdyYXBwZXIgYXJvdW5kCi10aGUgemxpYiBsaWJyYXJ5LCBhbmQgbXVjaCBvZiB0aGUgb3JpZ2luYWwgemxpYiBmdW5jdGlvbmFsaXR5IGlzCi1taXNzaW5nLiAgSGFuZGxpbmcgY29tcHJlc3NlZCBmaWxlIGZvcm1hdHMgbGlrZSBaSVAvR1pJUCBvciBQTkcKLWNhbm5vdCBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IGhhdmluZyB0aGlzIGZ1bmN0aW9uYWxpdHkuCi1BcHBsaWNhdGlvbnMgdGhhdCBoYW5kbGUgdGhlc2UgZm9ybWF0cyBhcmUgZWl0aGVyIHVzaW5nIHRoZWlyIG93biwKLWR1cGxpY2F0ZWQgY29kZSwgb3Igbm90IHVzaW5nIHRoZSBaTGliIHVuaXQgYXQgYWxsLgotCi1IZXJlIGFyZSBhIGZldyBzdWdnZXN0aW9uczoKLQotLSBDaGVja3N1bSBjbGFzcyB3cmFwcGVycyBhcm91bmQgYWRsZXIzMigpIGFuZCBjcmMzMigpLCBzaW1pbGFyCi0gIHRvIHRoZSBKYXZhIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhlIGphdmEudXRpbC56aXAuQ2hlY2tzdW0KLSAgaW50ZXJmYWNlLgotCi0tIFRoZSBhYmlsaXR5IHRvIHJlYWQgYW5kIHdyaXRlIHJhdyBkZWZsYXRlIHN0cmVhbXMsIHdpdGhvdXQgdGhlCi0gIHpsaWIgc3RyZWFtIGhlYWRlciBhbmQgdHJhaWxlci4gIFJhdyBkZWZsYXRlIHN0cmVhbXMgYXJlIHVzZWQKLSAgaW4gdGhlIFpJUCBmaWxlIGZvcm1hdC4KLQotLSBUaGUgYWJpbGl0eSB0byByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMsIHVzZWQgaW4gdGhlIEdaSVAKLSAgZmlsZSBmb3JtYXQsIGFuZCBub3JtYWxseSBwcm9kdWNlZCBieSB0aGUgZ3ppcCBwcm9ncmFtLgotCi0tIFRoZSBhYmlsaXR5IHRvIHNlbGVjdCBhIGRpZmZlcmVudCBjb21wcmVzc2lvbiBzdHJhdGVneSwgdXNlZnVsCi0gIHRvIFBORyBhbmQgTU5HIGltYWdlIGNvbXByZXNzaW9uLCBhbmQgdG8gbXVsdGltZWRpYSBjb21wcmVzc2lvbgotICBpbiBnZW5lcmFsLiAgQmVzaWRlcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKLQotICAgIFRDb21wcmVzc2lvbkxldmVsID0gKGNsTm9uZSwgY2xGYXN0ZXN0LCBjbERlZmF1bHQsIGNsTWF4KTsKLQotICB3aGljaCwgaW4gZmFjdCwgY291bGQgaGF2ZSB1c2VkIHRoZSAneicgcHJlZml4IGFuZCBhdm9pZGVkCi0gIFRDb2xvci1saWtlIHN5bWJvbHMKLQotICAgIFRDb21wcmVzc2lvbkxldmVsID0gKHpjTm9uZSwgemNGYXN0ZXN0LCB6Y0RlZmF1bHQsIHpjTWF4KTsKLQotICB0aGVyZSBjb3VsZCBiZSBhIGNvbXByZXNzaW9uIHN0cmF0ZWd5Ci0KLSAgICBUQ29tcHJlc3Npb25TdHJhdGVneSA9ICh6c0RlZmF1bHQsIHpzRmlsdGVyZWQsIHpzSHVmZm1hbk9ubHksIHpzUmxlKTsKLQotLSBaSVAgYW5kIEdaSVAgc3RyZWFtIGhhbmRsaW5nIHZpYSBUU3RyZWFtcy4KLQotCi0tLQotQ29zbWluIFRydXRhIDxjb3NtaW50QGNzLnViYmNsdWoucm8+CmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9kZWxwaGkvemxpYmQzMi5tYWsgYi9saWJzL3psaWIvY29udHJpYi9kZWxwaGkvemxpYmQzMi5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZmFmYTAuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvZGVscGhpL3psaWJkMzIubWFrCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYgotIyBGb3IgdXNlIHdpdGggRGVscGhpIGFuZCBDKysgQnVpbGRlciB1bmRlciBXaW4zMgotIyBVcGRhdGVkIGZvciB6bGliIDEuMi54IGJ5IENvc21pbiBUcnV0YQotCi0jIC0tLS0tLS0tLS0tLSBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KLQotIyBUaGlzIHByb2plY3QgdXNlcyB0aGUgRGVscGhpIChmYXN0Y2FsbC9yZWdpc3RlcikgY2FsbGluZyBjb252ZW50aW9uOgotTE9DID0gLURaRVhQT1JUPV9fZmFzdGNhbGwgLURaRVhQT1JUVkE9X19jZGVjbAotCi1DQyA9IGJjYzMyCi1MRCA9IGJjYzMyCi1BUiA9IHRsaWIKLSMgZG8gbm90IHVzZSAiLXByIiBpbiBDRkxBR1MKLUNGTEFHUyA9IC1hIC1kIC1rLSAtTzIgJChMT0MpCi1MREZMQUdTID0KLQotCi0jIHZhcmlhYmxlcwotWkxJQl9MSUIgPSB6bGliLmxpYgotCi1PQkoxID0gYWRsZXIzMi5vYmogY29tcHJlc3Mub2JqIGNyYzMyLm9iaiBkZWZsYXRlLm9iaiBnemlvLm9iaiBpbmZiYWNrLm9iagotT0JKMiA9IGluZmZhc3Qub2JqIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiB0cmVlcy5vYmogdW5jb21wci5vYmogenV0aWwub2JqCi1PQkpQMSA9ICthZGxlcjMyLm9iaitjb21wcmVzcy5vYmorY3JjMzIub2JqK2RlZmxhdGUub2JqK2d6aW8ub2JqK2luZmJhY2sub2JqCi1PQkpQMiA9ICtpbmZmYXN0Lm9iaitpbmZsYXRlLm9iaitpbmZ0cmVlcy5vYmordHJlZXMub2JqK3VuY29tcHIub2JqK3p1dGlsLm9iagotCi0KLSMgdGFyZ2V0cwotYWxsOiAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotLmMub2JqOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWFkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKLQotY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCi0KLWNyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCi0KLWRlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZ3ppby5vYmo6IGd6aW8uYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWluZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmgKLQotaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmggaW5mZml4ZWQuaAotCi1pbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi0KLXRyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCi0KLXVuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKLQotenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZXhhbXBsZS5vYmo6IGV4YW1wbGUuYyB6bGliLmggemNvbmYuaAotCi1taW5pZ3ppcC5vYmo6IG1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKLQotCi0jIEZvciB0aGUgc2FrZSBvZiB0aGUgb2xkIEJvcmxhbmQgbWFrZSwKLSMgdGhlIGNvbW1hbmQgbGluZSBpcyBjdXQgdG8gZml0IGluIHRoZSBNUy1ET1MgMTI4IGJ5dGUgbGltaXQ6Ci0kKFpMSUJfTElCKTogJChPQkoxKSAkKE9CSjIpCi0JLWRlbCAkKFpMSUJfTElCKQotCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDEpCi0JJChBUikgJChaTElCX0xJQikgJChPQkpQMikKLQotCi0jIHRlc3RpbmcKLXRlc3Q6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCWV4YW1wbGUKLQllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZAotCi1leGFtcGxlLmV4ZTogZXhhbXBsZS5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCi0KLW1pbmlnemlwLmV4ZTogbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCi0JJChMRCkgJChMREZMQUdTKSBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKLQotCi0jIGNsZWFudXAKLWNsZWFuOgotCS1kZWwgKi5vYmoKLQktZGVsICouZXhlCi0JLWRlbCAqLmxpYgotCS1kZWwgKi50ZHMKLQktZGVsIHpsaWIuYmFrCi0JLWRlbCBmb28uZ3oKLQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmJ1aWxkIGIvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmJ1aWxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDRjYjJmLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi5idWlsZAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgotPHByb2plY3QgbmFtZT0iRG90WkxpYiIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4vRG90WkxpYiI+Ci0JPGRlc2NyaXB0aW9uPkEgLk5ldCB3cmFwcGVyIGxpYnJhcnkgYXJvdW5kIFpMaWIxLmRsbDwvZGVzY3JpcHRpb24+Ci0KLQk8cHJvcGVydHkgbmFtZT0ibnVuaXQubG9jYXRpb24iIHZhbHVlPSJjOi9wcm9ncmFtIGZpbGVzL05Vbml0IFYyLjEvYmluIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yb290IiB2YWx1ZT0iYmluIiAvPgotCQotCTxwcm9wZXJ0eSBuYW1lPSJkZWJ1ZyIgdmFsdWU9InRydWUiIC8+Ci0JPHByb3BlcnR5IG5hbWU9Im51bml0IiB2YWx1ZT0idHJ1ZSIgLz4KLQotCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5mb2xkZXIiIHZhbHVlPSIke2J1aWxkLnJvb3R9L2RlYnVnLyIgaWY9IiR7ZGVidWd9IiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5mb2xkZXIiIHZhbHVlPSIke2J1aWxkLnJvb3R9L3JlbGVhc2UvIiB1bmxlc3M9IiR7ZGVidWd9IiAvPgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IlJlbW92ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIj4KLQkJPGRlbGV0ZSBkaXI9IiR7YnVpbGQucm9vdH0iIGZhaWxvbmVycm9yPSJmYWxzZSIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlc2NyaXB0aW9uPSJjb21waWxlcyB0aGUgc291cmNlIGNvZGUiPgotCQkKLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5mb2xkZXJ9IiAvPgotCQk8Y3NjIHRhcmdldD0ibGlicmFyeSIgb3V0cHV0PSIke2J1aWxkLmZvbGRlcn1Eb3RaTGliLmRsbCIgZGVidWc9IiR7ZGVidWd9Ij4KLQkJCTxyZWZlcmVuY2VzIGJhc2VkaXI9IiR7bnVuaXQubG9jYXRpb259Ij4KLQkJCQk8aW5jbHVkZXMgaWY9IiR7bnVuaXR9IiBuYW1lPSJudW5pdC5mcmFtZXdvcmsuZGxsIiAvPgotCQkJPC9yZWZlcmVuY2VzPgotCQkJPHNvdXJjZXM+Ci0JCQkJPGluY2x1ZGVzIG5hbWU9IiouY3MiIC8+Ci0JCQkJPGV4Y2x1ZGVzIG5hbWU9IlVuaXRUZXN0cy5jcyIgdW5sZXNzPSIke251bml0fSIgLz4KLQkJCTwvc291cmNlcz4KLQkJCTxhcmcgdmFsdWU9Ii9kOm51bml0IiBpZj0iJHtudW5pdH0iIC8+Ci0JCTwvY3NjPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmNobSBiL2xpYnMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi5jaG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzdkZjcuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmNobQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Bc3NlbWJseUluZm8uY3MgYi9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQXNzZW1ibHlJbmZvLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjNhNTI1Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Bc3NlbWJseUluZm8uY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Ci0KLS8vCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLS8vCi1bYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkRvdFpMaWIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiLk5ldCBiaW5kaW5ncyBmb3IgWkxpYiBjb21wcmVzc2lvbiBkbGwgMS4yLngiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJIZW5yaWsgUmF2biIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiKGMpIDIwMDQgYnkgSGVucmlrIFJhdm4iKV0KLVthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQkJCi0KLS8vCi0vLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgotLy8KLS8vICAgICAgTWFqb3IgVmVyc2lvbgotLy8gICAgICBNaW5vciBWZXJzaW9uIAotLy8gICAgICBCdWlsZCBOdW1iZXIKLS8vICAgICAgUmV2aXNpb24KLS8vCi0vLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBSZXZpc2lvbiBhbmQgQnVpbGQgTnVtYmVycyAKLS8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6Ci0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQotCi0vLwotLy8gSW4gb3JkZXIgdG8gc2lnbiB5b3VyIGFzc2VtYmx5IHlvdSBtdXN0IHNwZWNpZnkgYSBrZXkgdG8gdXNlLiBSZWZlciB0byB0aGUgCi0vLyBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhc3NlbWJseSBzaWduaW5nLgotLy8KLS8vIFVzZSB0aGUgYXR0cmlidXRlcyBiZWxvdyB0byBjb250cm9sIHdoaWNoIGtleSBpcyB1c2VkIGZvciBzaWduaW5nLiAKLS8vCi0vLyBOb3RlczogCi0vLyAgICgqKSBJZiBubyBrZXkgaXMgc3BlY2lmaWVkLCB0aGUgYXNzZW1ibHkgaXMgbm90IHNpZ25lZC4KLS8vICAgKCopIEtleU5hbWUgcmVmZXJzIHRvIGEga2V5IHRoYXQgaGFzIGJlZW4gaW5zdGFsbGVkIGluIHRoZSBDcnlwdG8gU2VydmljZQotLy8gICAgICAgUHJvdmlkZXIgKENTUCkgb24geW91ciBtYWNoaW5lLiBLZXlGaWxlIHJlZmVycyB0byBhIGZpbGUgd2hpY2ggY29udGFpbnMKLS8vICAgICAgIGEga2V5LgotLy8gICAoKikgSWYgdGhlIEtleUZpbGUgYW5kIHRoZSBLZXlOYW1lIHZhbHVlcyBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZSAKLS8vICAgICAgIGZvbGxvd2luZyBwcm9jZXNzaW5nIG9jY3VyczoKLS8vICAgICAgICgxKSBJZiB0aGUgS2V5TmFtZSBjYW4gYmUgZm91bmQgaW4gdGhlIENTUCwgdGhhdCBrZXkgaXMgdXNlZC4KLS8vICAgICAgICgyKSBJZiB0aGUgS2V5TmFtZSBkb2VzIG5vdCBleGlzdCBhbmQgdGhlIEtleUZpbGUgZG9lcyBleGlzdCwgdGhlIGtleSAKLS8vICAgICAgICAgICBpbiB0aGUgS2V5RmlsZSBpcyBpbnN0YWxsZWQgaW50byB0aGUgQ1NQIGFuZCB1c2VkLgotLy8gICAoKikgSW4gb3JkZXIgdG8gY3JlYXRlIGEgS2V5RmlsZSwgeW91IGNhbiB1c2UgdGhlIHNuLmV4ZSAoU3Ryb25nIE5hbWUpIHV0aWxpdHkuCi0vLyAgICAgICBXaGVuIHNwZWNpZnlpbmcgdGhlIEtleUZpbGUsIHRoZSBsb2NhdGlvbiBvZiB0aGUgS2V5RmlsZSBzaG91bGQgYmUKLS8vICAgICAgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IG91dHB1dCBkaXJlY3Rvcnkgd2hpY2ggaXMKLS8vICAgICAgICVQcm9qZWN0IERpcmVjdG9yeSVcb2JqXDxjb25maWd1cmF0aW9uPi4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgS2V5RmlsZSBpcwotLy8gICAgICAgbG9jYXRlZCBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnksIHlvdSB3b3VsZCBzcGVjaWZ5IHRoZSBBc3NlbWJseUtleUZpbGUgCi0vLyAgICAgICBhdHRyaWJ1dGUgYXMgW2Fzc2VtYmx5OiBBc3NlbWJseUtleUZpbGUoIi4uXFwuLlxcbXlrZXkuc25rIildCi0vLyAgICgqKSBEZWxheSBTaWduaW5nIGlzIGFuIGFkdmFuY2VkIG9wdGlvbiAtIHNlZSB0aGUgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrCi0vLyAgICAgICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMuCi0vLwotW2Fzc2VtYmx5OiBBc3NlbWJseURlbGF5U2lnbihmYWxzZSldCi1bYXNzZW1ibHk6IEFzc2VtYmx5S2V5RmlsZSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5S2V5TmFtZSgiIildCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ2hlY2tzdW1JbXBsLmNzIGIvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0NoZWNrc3VtSW1wbC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmY2Y1Zi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ2hlY2tzdW1JbXBsLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vCi0vLyCpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0Ci0vLwotLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIAotLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLQotCi1uYW1lc3BhY2UgRG90WkxpYgotewotICAgICNyZWdpb24gQ2hlY2tzdW1HZW5lcmF0b3JCYXNlCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJbXBsZW1lbnRzIHRoZSBjb21tb24gZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGFsbCA8c2VlIGNyZWY9IkNoZWNrc3VtR2VuZXJhdG9yIi8+cwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxleGFtcGxlPjwvZXhhbXBsZT4KLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hlY2tzdW1HZW5lcmF0b3JCYXNlIDogQ2hlY2tzdW1HZW5lcmF0b3IKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBjaGVja3N1bQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcm90ZWN0ZWQgdWludCBfY3VycmVudDsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2hlY2tzdW0gZ2VuZXJhdG9yIGJhc2UgLSB0aGUgY3VycmVudCBjaGVja3N1bSBpcyAKLSAgICAgICAgLy8vIHNldCB0byB6ZXJvCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBDaGVja3N1bUdlbmVyYXRvckJhc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY3VycmVudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2hlY2tzdW0gZ2VuZXJhdG9yIGJhc2V3aXRoIGEgc3BlY2lmaWVkIHZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5pdGlhbFZhbHVlIj5UaGUgdmFsdWUgdG8gc2V0IHRoZSBjdXJyZW50IGNoZWNrc3VtIHRvPC9wYXJhbT4KLSAgICAgICAgcHVibGljIENoZWNrc3VtR2VuZXJhdG9yQmFzZSh1aW50IGluaXRpYWxWYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2N1cnJlbnQgPSBpbml0aWFsVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXNldHMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gdG8gemVybwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpIHsgX2N1cnJlbnQgPSAwOyB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cyB0aGUgY3VycmVudCBjaGVja3N1bSB2YWx1ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgdWludCBWYWx1ZSB7IGdldCB7IHJldHVybiBfY3VycmVudDsgfSB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHBhcnQgb2YgYW4gYXJyYXkgb2YgYnl0ZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgZGF0YSB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+V2hlcmUgaW4gPGM+ZGF0YTwvYz4gdG8gc3RhcnQgdXBkYXRpbmc8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gPGM+ZGF0YTwvYz4gdG8gdXNlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPlRoZSBzdW0gb2Ygb2Zmc2V0IGFuZCBjb3VudCBpcyBsYXJnZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIDxjPmRhdGE8L2M+PC9leGNlcHRpb24+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik51bGxSZWZlcmVuY2VFeGNlcHRpb24iPjxjPmRhdGE8L2M+IGlzIGEgbnVsbCByZWZlcmVuY2U8L2V4Y2VwdGlvbj4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5PZmZzZXQgb3IgY291bnQgaXMgbmVnYXRpdmUuPC9leGNlcHRpb24+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5BbGwgdGhlIG90aGVyIDxjPlVwZGF0ZTwvYz4gbWV0aG9kcyBhcmUgaW1wbG1lbmV0ZWQgaW4gdGVybXMgb2YgdGhpcyBvbmUuIAotICAgICAgICAvLy8gVGhpcyBpcyB0aGVyZWZvcmUgdGhlIG9ubHkgbWV0aG9kIGEgZGVyaXZlZCBjbGFzcyBoYXMgdG8gaW1wbGVtZW50PC9yZW1hcmtzPgotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCk7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIGFuIGFycmF5IG9mIGJ5dGVzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZShieXRlW10gZGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgVXBkYXRlKGRhdGEsIDAsIGRhdGEuTGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPgotICAgICAgICAvLy8gPHJlbWFya3M+VGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgY29udmVydGVkIGJ5IHRoZSBVVEYtOCBlbmNvZGluZzwvcmVtYXJrcz4KLSAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlKHN0cmluZyBkYXRhKQotICAgICAgICB7Ci0JCQlVcGRhdGUoRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhkYXRhKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggdGhlIGRhdGEgZnJvbSBhIHN0cmluZywgdXNpbmcgYSBzcGVjaWZpYyBlbmNvZGluZwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBzdHJpbmcgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbmNvZGluZyI+VGhlIGVuY29kaW5nIHRvIHVzZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZShzdHJpbmcgZGF0YSwgRW5jb2RpbmcgZW5jb2RpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFVwZGF0ZShlbmNvZGluZy5HZXRCeXRlcyhkYXRhKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0KLSAgICAjcmVnaW9uIENSQzMyCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJbXBsZW1lbnRzIGEgQ1JDMzIgY2hlY2tzdW0gZ2VuZXJhdG9yCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIENSQzMyQ2hlY2tzdW0gOiBDaGVja3N1bUdlbmVyYXRvckJhc2UgICAgCi0gICAgewotICAgICAgICAjcmVnaW9uIERMTCBpbXBvcnRzCi0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQotICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWludCBjcmMzMih1aW50IGNyYywgaW50IGRhdGEsIHVpbnQgbGVuZ3RoKTsKLQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIENSQzMyIGNoZWNrc3VtIGdlbmVyYXRvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgQ1JDMzJDaGVja3N1bSgpIDogYmFzZSgpIHt9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIENSQzMyIGNoZWNrc3VtIGdlbmVyYXRvciB3aXRoIGEgc3BlY2lmaWVkIHZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5pdGlhbFZhbHVlIj5UaGUgdmFsdWUgdG8gc2V0IHRoZSBjdXJyZW50IGNoZWNrc3VtIHRvPC9wYXJhbT4KLSAgICAgICAgcHVibGljIENSQzMyQ2hlY2tzdW0odWludCBpbml0aWFsVmFsdWUpIDogYmFzZShpbml0aWFsVmFsdWUpIHt9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHBhcnQgb2YgYW4gYXJyYXkgb2YgYnl0ZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgZGF0YSB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+V2hlcmUgaW4gPGM+ZGF0YTwvYz4gdG8gc3RhcnQgdXBkYXRpbmc8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gPGM+ZGF0YTwvYz4gdG8gdXNlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPlRoZSBzdW0gb2Ygb2Zmc2V0IGFuZCBjb3VudCBpcyBsYXJnZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIDxjPmRhdGE8L2M+PC9leGNlcHRpb24+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik51bGxSZWZlcmVuY2VFeGNlcHRpb24iPjxjPmRhdGE8L2M+IGlzIGEgbnVsbCByZWZlcmVuY2U8L2V4Y2VwdGlvbj4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5PZmZzZXQgb3IgY291bnQgaXMgbmVnYXRpdmUuPC9leGNlcHRpb24+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFVwZGF0ZShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICgob2Zmc2V0K2NvdW50KSA+IGRhdGEuTGVuZ3RoKSB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIEdDSGFuZGxlIGhEYXRhID0gR0NIYW5kbGUuQWxsb2MoZGF0YSwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY3VycmVudCA9IGNyYzMyKF9jdXJyZW50LCBoRGF0YS5BZGRyT2ZQaW5uZWRPYmplY3QoKS5Ub0ludDMyKCkrb2Zmc2V0LCAodWludCljb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaERhdGEuRnJlZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gICAgI3JlZ2lvbiBBZGxlcgotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSW1wbGVtZW50cyBhIGNoZWNrc3VtIGdlbmVyYXRvciB0aGF0IGNvbXB1dGVzIHRoZSBBZGxlciBjaGVja3N1bSBvbiBkYXRhCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEFkbGVyQ2hlY2tzdW0gOiBDaGVja3N1bUdlbmVyYXRvckJhc2UgICAgCi0gICAgewotICAgICAgICAjcmVnaW9uIERMTCBpbXBvcnRzCi0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQotICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWludCBhZGxlcjMyKHVpbnQgYWRsZXIsIGludCBkYXRhLCB1aW50IGxlbmd0aCk7Ci0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBZGxlciBjaGVja3N1bSBnZW5lcmF0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEFkbGVyQ2hlY2tzdW0oKSA6IGJhc2UoKSB7fQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBZGxlciBjaGVja3N1bSBnZW5lcmF0b3Igd2l0aCBhIHNwZWNpZmllZCB2YWx1ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluaXRpYWxWYWx1ZSI+VGhlIHZhbHVlIHRvIHNldCB0aGUgY3VycmVudCBjaGVja3N1bSB0bzwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBBZGxlckNoZWNrc3VtKHVpbnQgaW5pdGlhbFZhbHVlKSA6IGJhc2UoaW5pdGlhbFZhbHVlKSB7fQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCBwYXJ0IG9mIGFuIGFycmF5IG9mIGJ5dGVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPldoZXJlIGluIDxjPmRhdGE8L2M+IHRvIHN0YXJ0IHVwZGF0aW5nPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyBmcm9tIDxjPmRhdGE8L2M+IHRvIHVzZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgc3VtIG9mIG9mZnNldCBhbmQgY291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiA8Yz5kYXRhPC9jPjwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOdWxsUmVmZXJlbmNlRXhjZXB0aW9uIj48Yz5kYXRhPC9jPiBpcyBhIG51bGwgcmVmZXJlbmNlPC9leGNlcHRpb24+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiI+T2Zmc2V0IG9yIGNvdW50IGlzIG5lZ2F0aXZlLjwvZXhjZXB0aW9uPgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBkYXRhLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBHQ0hhbmRsZSBoRGF0YSA9IEdDSGFuZGxlLkFsbG9jKGRhdGEsIEdDSGFuZGxlVHlwZS5QaW5uZWQpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2N1cnJlbnQgPSBhZGxlcjMyKF9jdXJyZW50LCBoRGF0YS5BZGRyT2ZQaW5uZWRPYmplY3QoKS5Ub0ludDMyKCkrb2Zmc2V0LCAodWludCljb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaERhdGEuRnJlZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0NpcmN1bGFyQnVmZmVyLmNzIGIvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0NpcmN1bGFyQnVmZmVyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGY4YzJjLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9DaXJjdWxhckJ1ZmZlci5jcworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vCi0vLyCpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0Ci0vLwotLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIAotLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Ci0KLW5hbWVzcGFjZSBEb3RaTGliCi17Ci0KLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGNpcmN1bGFyIGJ1ZmZlcgotCS8vLyA8L3N1bW1hcnk+Ci0JaW50ZXJuYWwgY2xhc3MgQ2lyY3VsYXJCdWZmZXIKLQl7Ci0gICAgICAgICNyZWdpb24gUHJpdmF0ZSBkYXRhCi0gICAgICAgIHByaXZhdGUgaW50IF9jYXBhY2l0eTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX2hlYWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IF90YWlsOwotICAgICAgICBwcml2YXRlIGludCBfc2l6ZTsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gX2J1ZmZlcjsKLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgIHB1YmxpYyBDaXJjdWxhckJ1ZmZlcihpbnQgY2FwYWNpdHkpCi0gICAgICAgIHsgICAgCi0gICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoIGNhcGFjaXR5ID4gMCApOwotICAgICAgICAgICAgX2J1ZmZlciA9IG5ldyBieXRlW2NhcGFjaXR5XTsKLSAgICAgICAgICAgIF9jYXBhY2l0eSA9IGNhcGFjaXR5OwotICAgICAgICAgICAgX2hlYWQgPSAwOwotICAgICAgICAgICAgX3RhaWwgPSAwOwotICAgICAgICAgICAgX3NpemUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBTaXplIHsgZ2V0IHsgcmV0dXJuIF9zaXplOyB9IH0KLQotICAgICAgICBwdWJsaWMgaW50IFB1dChieXRlW10gc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlYnVnLkFzc2VydCggY291bnQgPiAwICk7Ci0gICAgICAgICAgICBpbnQgdHJ1ZUNvdW50ID0gTWF0aC5NaW4oY291bnQsIF9jYXBhY2l0eSAtIFNpemUpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cnVlQ291bnQ7ICsraSkKLSAgICAgICAgICAgICAgICBfYnVmZmVyWyhfdGFpbCtpKSAlIF9jYXBhY2l0eV0gPSBzb3VyY2Vbb2Zmc2V0K2ldOwotICAgICAgICAgICAgX3RhaWwgKz0gdHJ1ZUNvdW50OwotICAgICAgICAgICAgX3RhaWwgJT0gX2NhcGFjaXR5OwotICAgICAgICAgICAgX3NpemUgKz0gdHJ1ZUNvdW50OwotICAgICAgICAgICAgcmV0dXJuIHRydWVDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIFB1dChieXRlIGIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChTaXplID09IF9jYXBhY2l0eSkgLy8gbm8gcm9vbQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIF9idWZmZXJbX3RhaWwrK10gPSBiOwotICAgICAgICAgICAgX3RhaWwgJT0gX2NhcGFjaXR5OwotICAgICAgICAgICAgKytfc2l6ZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBHZXQoYnl0ZVtdIGRlc3RpbmF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCB0cnVlQ291bnQgPSBNYXRoLk1pbihjb3VudCxTaXplKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJ1ZUNvdW50OyArK2kpCi0gICAgICAgICAgICAgICAgZGVzdGluYXRpb25bb2Zmc2V0ICsgaV0gPSBfYnVmZmVyWyhfaGVhZCtpKSAlIF9jYXBhY2l0eV07Ci0gICAgICAgICAgICBfaGVhZCArPSB0cnVlQ291bnQ7Ci0gICAgICAgICAgICBfaGVhZCAlPSBfY2FwYWNpdHk7Ci0gICAgICAgICAgICBfc2l6ZSAtPSB0cnVlQ291bnQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZUNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBHZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoU2l6ZSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgaW50IHJlc3VsdCA9IChpbnQpX2J1ZmZlcltfaGVhZCsrICUgX2NhcGFjaXR5XTsKLSAgICAgICAgICAgIC0tX3NpemU7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ29kZWNCYXNlLmNzIGIvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0NvZGVjQmFzZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2MWY4OS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ29kZWNCYXNlLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vCi0vLyCpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0Ci0vLwotLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIAotLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7Ci0KLW5hbWVzcGFjZSBEb3RaTGliCi17Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBJbXBsZW1lbnRzIHRoZSBjb21tb24gZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGFsbCA8c2VlIGNyZWY9IkNvZGVjIi8+cwotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGFic3RyYWN0IGNsYXNzIENvZGVjQmFzZSA6IENvZGVjLCBJRGlzcG9zYWJsZQotCXsKLQotICAgICAgICAjcmVnaW9uIERhdGEgbWVtYmVycwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluc3RhbmNlIG9mIHRoZSBpbnRlcm5hbCB6bGliIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCBpcyAKLSAgICAgICAgLy8vIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zIGluIHRoZSB6bGliIGRsbAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBaU3RyZWFtIF96dHJlYW0gPSBuZXcgWlN0cmVhbSgpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRydWUgaWYgdGhlIG9iamVjdCBpbnN0YW5jZSBoYXMgYmVlbiBkaXNwb3NlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByb3RlY3RlZCBib29sIF9pc0Rpc3Bvc2VkID0gZmFsc2U7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHNpemUgb2YgdGhlIGludGVybmFsIGJ1ZmZlcnMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJvdGVjdGVkIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDE2Mzg0OwotCi0gICAgICAgIHByaXZhdGUgYnl0ZVtdIF9vdXRCdWZmZXIgPSBuZXcgYnl0ZVtrQnVmZmVyU2l6ZV07Ci0gICAgICAgIHByaXZhdGUgYnl0ZVtdIF9pbkJ1ZmZlciA9IG5ldyBieXRlW2tCdWZmZXJTaXplXTsKLQotICAgICAgICBwcml2YXRlIEdDSGFuZGxlIF9oSW5wdXQ7Ci0gICAgICAgIHByaXZhdGUgR0NIYW5kbGUgX2hPdXRwdXQ7Ci0KLSAgICAgICAgcHJpdmF0ZSB1aW50IF9jaGVja3N1bSA9IDA7Ci0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8Yz5Db2RlQmFzZTwvYz4gY2xhc3MuIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgQ29kZWNCYXNlKCkKLQkJewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2hJbnB1dCA9IEdDSGFuZGxlLkFsbG9jKF9pbkJ1ZmZlciwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7Ci0gICAgICAgICAgICAgICAgX2hPdXRwdXQgPSBHQ0hhbmRsZS5BbGxvYyhfb3V0QnVmZmVyLCBHQ0hhbmRsZVR5cGUuUGlubmVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2xlYW5VcChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgICNyZWdpb24gQ29kZWMgTWVtYmVycwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE9jY3VycyB3aGVuIG1vcmUgcHJvY2Vzc2VkIGRhdGEgYXJlIGF2YWlsYWJsZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGV2ZW50IERhdGFBdmFpbGFibGVIYW5kbGVyIERhdGFBdmFpbGFibGU7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmlyZXMgdGhlIDxzZWUgY3JlZj0iRGF0YUF2YWlsYWJsZSIvPiBldmVudAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBPbkRhdGFBdmFpbGFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3p0cmVhbS50b3RhbF9vdXQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChEYXRhQXZhaWxhYmxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIERhdGFBdmFpbGFibGUoIF9vdXRCdWZmZXIsIDAsIChpbnQpX3p0cmVhbS50b3RhbF9vdXQpOyAKLSAgICAgICAgICAgICAgICByZXNldE91dHB1dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBtb3JlIGRhdGEgdG8gdGhlIGNvZGVjIHRvIGJlIHByb2Nlc3NlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5CeXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgYWRkZWQgdG8gdGhlIGNvZGVjPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPkFkZGluZyBkYXRhIG1heSwgb3IgbWF5IG5vdCwgcmFpc2UgdGhlIDxjPkRhdGFBdmFpbGFibGU8L2M+IGV2ZW50PC9yZW1hcmtzPgotICAgICAgICBwdWJsaWMgdm9pZCBBZGQoYnl0ZVtdIGRhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZChkYXRhLDAsZGF0YS5MZW5ndGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBtb3JlIGRhdGEgdG8gdGhlIGNvZGVjIHRvIGJlIHByb2Nlc3NlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5CeXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgYWRkZWQgdG8gdGhlIGNvZGVjPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPlRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSB0byBhZGQgZnJvbSA8Yz5kYXRhPC9jPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPkFkZGluZyBkYXRhIG1heSwgb3IgbWF5IG5vdCwgcmFpc2UgdGhlIDxjPkRhdGFBdmFpbGFibGU8L2M+IGV2ZW50PC9yZW1hcmtzPgotICAgICAgICAvLy8gPHJlbWFya3M+VGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgZGVyaXZlZCBjbGFzczwvcmVtYXJrcz4KLSAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQWRkKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5UaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBkZXJpdmVkIGNsYXNzPC9yZW1hcmtzPgotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBGaW5pc2goKTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzIHRoZSBjaGVja3N1bSBvZiB0aGUgZGF0YSB0aGF0IGhhcyBiZWVuIGFkZGVkIHNvIGZhcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgdWludCBDaGVja3N1bSB7IGdldCB7IHJldHVybiBfY2hlY2tzdW07IH0gfQotCi0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAjcmVnaW9uIERlc3RydWN0b3IgJiBJRGlzcG9zYWJsZSBzdHVmZgotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERlc3Ryb3lzIHRoaXMgaW5zdGFuY2UKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgfkNvZGVjQmFzZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsZWFuVXAoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVsZWFzZXMgYW55IHVubWFuYWdlZCByZXNvdXJjZXMgYW5kIGNhbGxzIHRoZSA8c2VlIGNyZWY9IkNsZWFuVXAoKSIvPiBtZXRob2Qgb2YgdGhlIGRlcml2ZWQgY2xhc3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsZWFuVXAodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQZXJmb3JtcyBhbnkgY29kZWMgc3BlY2lmaWMgY2xlYW51cAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+VGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgZGVyaXZlZCBjbGFzczwvcmVtYXJrcz4KLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgQ2xlYW5VcCgpOwotCi0gICAgICAgIC8vIHBlcmZvcm1zIHRoZSByZWxlYXNlIG9mIHRoZSBoYW5kbGVzIGFuZCBjYWxscyB0aGUgZGVyZWl2ZWQgQ2xlYW5VcCgpCi0gICAgICAgIHByaXZhdGUgdm9pZCBDbGVhblVwKGJvb2wgaXNEaXNwb3NpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2xlYW5VcCgpOwotICAgICAgICAgICAgICAgIGlmIChfaElucHV0LklzQWxsb2NhdGVkKQotICAgICAgICAgICAgICAgICAgICBfaElucHV0LkZyZWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoX2hPdXRwdXQuSXNBbGxvY2F0ZWQpCi0gICAgICAgICAgICAgICAgICAgIF9oT3V0cHV0LkZyZWUoKTsKLQotICAgICAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gSGVscGVyIG1ldGhvZHMKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb3BpZXMgYSBudW1iZXIgb2YgYnl0ZXMgdG8gdGhlIGludGVybmFsIGNvZGVjIGJ1ZmZlciAtIHJlYWR5IGZvciBwcm9jY2VzaW5nCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGJ5dGUgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZGF0YSB0byBjb3B5PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdGFydEluZGV4Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gY29weTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29weUlucHV0KGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnRJbmRleCwgaW50IGNvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBBcnJheS5Db3B5KGRhdGEsIHN0YXJ0SW5kZXgsIF9pbkJ1ZmZlciwwLCBjb3VudCk7Ci0gICAgICAgICAgICBfenRyZWFtLm5leHRfaW4gPSBfaElucHV0LkFkZHJPZlBpbm5lZE9iamVjdCgpOwotICAgICAgICAgICAgX3p0cmVhbS50b3RhbF9pbiA9IDA7Ci0gICAgICAgICAgICBfenRyZWFtLmF2YWlsX2luID0gKHVpbnQpY291bnQ7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlc2V0cyB0aGUgaW50ZXJuYWwgb3V0cHV0IGJ1ZmZlcnMgdG8gYSBrbm93biBzdGF0ZSAtIHJlYWR5IGZvciBwcm9jZXNzaW5nCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0T3V0cHV0KCkKLSAgICAgICAgewotICAgICAgICAgICAgX3p0cmVhbS50b3RhbF9vdXQgPSAwOwotICAgICAgICAgICAgX3p0cmVhbS5hdmFpbF9vdXQgPSBrQnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIF96dHJlYW0ubmV4dF9vdXQgPSBfaE91dHB1dC5BZGRyT2ZQaW5uZWRPYmplY3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIHJ1bm5pbmcgY2hlY2tzdW0gcHJvcGVydHkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuZXdTdW0iPlRoZSBuZXcgY2hlY2tzdW0gdmFsdWU8L3BhcmFtPgotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDaGVja3N1bSh1aW50IG5ld1N1bSkKLSAgICAgICAgewotICAgICAgICAgICAgX2NoZWNrc3VtID0gbmV3U3VtOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9EZWZsYXRlci5jcyBiL2xpYnMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9EZWZsYXRlci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1NzIzYi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRGVmbGF0ZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8KLS8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQKLS8vCi0vLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gCi0vLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKLQotbmFtZXNwYWNlIERvdFpMaWIKLXsKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSW1wbGVtZW50cyBhIGRhdGEgY29tcHJlc3NvciwgdXNpbmcgdGhlIGRlZmxhdGUgYWxnb3JpdGhtIGluIHRoZSBaTGliIGRsbAotICAgIC8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIHNlYWxlZCBjbGFzcyBEZWZsYXRlciA6IENvZGVjQmFzZQotCXsKLSAgICAgICAgI3JlZ2lvbiBEbGwgaW1wb3J0cwotICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCwgQ2hhclNldD1DaGFyU2V0LkFuc2kpXQotICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGRlZmxhdGVJbml0XyhyZWYgWlN0cmVhbSBzeiwgaW50IGxldmVsLCBzdHJpbmcgdnMsIGludCBzaXplKTsKLQotICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZGVmbGF0ZShyZWYgWlN0cmVhbSBzeiwgaW50IGZsdXNoKTsKLQotICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZGVmbGF0ZVJlc2V0KHJlZiBaU3RyZWFtIHN6KTsKLQotICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZGVmbGF0ZUVuZChyZWYgWlN0cmVhbSBzeik7Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIG5ldyBpbnN0YW5jZSBvZiB0aGUgPGM+RGVmbGF0ZXI8L2M+Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV2ZWwiPlRoZSBjb21wcmVzc2lvbiBsZXZlbCB0byB1c2UgZm9yIHRoaXMgPGM+RGVmbGF0ZXI8L2M+PC9wYXJhbT4KLQkJcHVibGljIERlZmxhdGVyKENvbXByZXNzTGV2ZWwgbGV2ZWwpIDogYmFzZSgpCi0JCXsKLSAgICAgICAgICAgIGludCByZXR2YWwgPSBkZWZsYXRlSW5pdF8ocmVmIF96dHJlYW0sIChpbnQpbGV2ZWwsIEluZm8uVmVyc2lvbiwgTWFyc2hhbC5TaXplT2YoX3p0cmVhbSkpOwotICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKHJldHZhbCwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGRlZmxhdGVyIik7Ci0KLSAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7Ci0JCX0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyB0byBhZGQ8L3BhcmFtPgotICAgICAgICAvLy8gPHJlbWFya3M+QWRkaW5nIGRhdGEgbWF5LCBvciBtYXkgbm90LCByYWlzZSB0aGUgPGM+RGF0YUF2YWlsYWJsZTwvYz4gZXZlbnQ8L3JlbWFya3M+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEFkZChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICgob2Zmc2V0K2NvdW50KSA+IGRhdGEuTGVuZ3RoKSB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IHRvdGFsID0gY291bnQ7Ci0gICAgICAgICAgICBpbnQgaW5wdXRJbmRleCA9IG9mZnNldDsKLSAgICAgICAgICAgIGludCBlcnIgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAoZXJyID49IDAgJiYgaW5wdXRJbmRleCA8IHRvdGFsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvcHlJbnB1dChkYXRhLCBpbnB1dEluZGV4LCBNYXRoLk1pbih0b3RhbCAtIGlucHV0SW5kZXgsIGtCdWZmZXJTaXplKSk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGVyciA+PSAwICYmIF96dHJlYW0uYXZhaWxfaW4gPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gZGVmbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLk5vbmUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX3p0cmVhbS5hdmFpbF9vdXQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkRhdGFBdmFpbGFibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBkZWZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuTm9uZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXggKz0gKGludClfenRyZWFtLnRvdGFsX2luOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldENoZWNrc3VtKCBfenRyZWFtLmFkbGVyICk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZpbmlzaCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBlcnI7Ci0gICAgICAgICAgICBkbyAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBkZWZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuRmluaXNoKTsKLSAgICAgICAgICAgICAgICBPbkRhdGFBdmFpbGFibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChlcnIgPT0gMCk7Ci0gICAgICAgICAgICBzZXRDaGVja3N1bSggX3p0cmVhbS5hZGxlciApOwotICAgICAgICAgICAgZGVmbGF0ZVJlc2V0KHJlZiBfenRyZWFtKTsKLSAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDbG9zZXMgdGhlIGludGVybmFsIHpsaWIgZGVmbGF0ZSBzdHJlYW0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgQ2xlYW5VcCgpIHsgZGVmbGF0ZUVuZChyZWYgX3p0cmVhbSk7IH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Eb3RaTGliLmNzIGIvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RvdFpMaWIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYzc5M2EuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RvdFpMaWIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLy8KLS8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQKLS8vCi0vLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gCi0vLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKLXVzaW5nIFN5c3RlbS5UZXh0OwotCi0KLW5hbWVzcGFjZSBEb3RaTGliCi17Ci0KLSAgICAjcmVnaW9uIEludGVybmFsIHR5cGVzCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIERlZmluZXMgY29uc3RhbnRzIGZvciB0aGUgdmFyaW91cyBmbHVzaCB0eXBlcyB1c2VkIHdpdGggemxpYgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgZW51bSBGbHVzaFR5cGVzIAotICAgIHsKLSAgICAgICAgTm9uZSwgIFBhcnRpYWwsICBTeW5jLCAgRnVsbCwgIEZpbmlzaCwgIEJsb2NrCi0gICAgfQotCi0gICAgI3JlZ2lvbiBaU3RyZWFtIHN0cnVjdHVyZQotICAgIC8vIGludGVybmFsIG1hcHBpbmcgb2YgdGhlIHpsaWIgenN0cmVhbSBzdHJ1Y3R1cmUgZm9yIG1hcnNoYWxsaW5nCi0gICAgW1N0cnVjdExheW91dEF0dHJpYnV0ZShMYXlvdXRLaW5kLlNlcXVlbnRpYWwsIFBhY2s9NCwgU2l6ZT0wLCBDaGFyU2V0PUNoYXJTZXQuQW5zaSldCi0gICAgaW50ZXJuYWwgc3RydWN0IFpTdHJlYW0KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJbnRQdHIgbmV4dF9pbjsKLSAgICAgICAgcHVibGljIHVpbnQgYXZhaWxfaW47Ci0gICAgICAgIHB1YmxpYyB1aW50IHRvdGFsX2luOwotCi0gICAgICAgIHB1YmxpYyBJbnRQdHIgbmV4dF9vdXQ7Ci0gICAgICAgIHB1YmxpYyB1aW50IGF2YWlsX291dDsKLSAgICAgICAgcHVibGljIHVpbnQgdG90YWxfb3V0OwotCi0gICAgICAgIFtNYXJzaGFsQXMoVW5tYW5hZ2VkVHlwZS5MUFN0cildCi0gICAgICAgIHN0cmluZyBtc2c7IAotICAgICAgICB1aW50IHN0YXRlOwotCi0gICAgICAgIHVpbnQgemFsbG9jOwotICAgICAgICB1aW50IHpmcmVlOwotICAgICAgICB1aW50IG9wYXF1ZTsKLQotICAgICAgICBpbnQgZGF0YV90eXBlOwotICAgICAgICBwdWJsaWMgdWludCBhZGxlcjsKLSAgICAgICAgdWludCByZXNlcnZlZDsKLSAgICB9Ci0KLSAgICAjZW5kcmVnaW9uCi0gICAgCi0gICAgI2VuZHJlZ2lvbgotCi0gICAgI3JlZ2lvbiBQdWJsaWMgZW51bXMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIERlZmluZXMgY29uc3RhbnRzIGZvciB0aGUgYXZhaWxhYmxlIGNvbXByZXNzaW9uIGxldmVscyBpbiB6bGliCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBDb21wcmVzc0xldmVsIDogaW50Ci0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCB3aXRoIGEgcmVhc29uYWJsZSBjb21wcm9taXNlIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIHNwZWVkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIERlZmF1bHQgPSAtMSwgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTm8gY29tcHJlc3Npb24gYXQgYWxsLiBUaGUgZGF0YSBhcmUgcGFzc2VkIHN0cmFpZ2h0IHRocm91Z2guCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIE5vbmUgPSAwLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgbWF4aW11bSBjb21wcmVzc2lvbiByYXRlIGF2YWlsYWJsZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQmVzdCA9IDksICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBmYXN0ZXN0IGF2YWlsYWJsZSBjb21wcmVzc2lvbiBsZXZlbC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRmFzdGVzdCA9IDEKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gICAgI3JlZ2lvbiBFeGNlcHRpb24gY2xhc3NlcwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyBvbiB0aGUgemxpYiBkbGwKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBaTGliRXhjZXB0aW9uIDogQXBwbGljYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlpMaWJFeGNlcHRpb24iLz4gY2xhc3Mgd2l0aCBhIHNwZWNpZmllZCAKLSAgICAgICAgLy8vIGVycm9yIG1lc3NhZ2UgYW5kIGVycm9yIGNvZGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlcnJvckNvZGUiPlRoZSB6bGliIGVycm9yIGNvZGUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibXNnIj5BIG1lc3NhZ2UgdGhhdCAoaG9wZWZ1bGx5KSBkZXNjcmliZXMgdGhlIGVycm9yPC9wYXJhbT4KLSAgICAgICAgcHVibGljIFpMaWJFeGNlcHRpb24oaW50IGVycm9yQ29kZSwgc3RyaW5nIG1zZykgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIlpMaWIgZXJyb3IgezB9IHsxfSIsIGVycm9yQ29kZSwgbXNnKSkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iWkxpYkV4Y2VwdGlvbiIvPiBjbGFzcyB3aXRoIGEgc3BlY2lmaWVkIAotICAgICAgICAvLy8gZXJyb3IgY29kZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVycm9yQ29kZSI+VGhlIHpsaWIgZXJyb3IgY29kZSB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uPC9wYXJhbT4KLSAgICAgICAgcHVibGljIFpMaWJFeGNlcHRpb24oaW50IGVycm9yQ29kZSkgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIlpMaWIgZXJyb3IgezB9IiwgZXJyb3JDb2RlKSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotICAgICNlbmRyZWdpb24KLQotICAgICNyZWdpb24gSW50ZXJmYWNlcwotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBEZWNsYXJlcyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlcyBhIHJ1bm5pbmcgY2hlY2tzdW0gdG8gYmUgY2FsY3VsYXRlZCAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tzdW1HZW5lcmF0b3IKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNoZWNrc3VtCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHVpbnQgVmFsdWUgeyBnZXQ7IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDbGVhcnMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gdG8gMAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICB2b2lkIFJlc2V0KCk7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIGFuIGFycmF5IG9mIGJ5dGVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4KLSAgICAgICAgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCBwYXJ0IG9mIGFuIGFycmF5IG9mIGJ5dGVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPldoZXJlIGluIDxjPmRhdGE8L2M+IHRvIHN0YXJ0IHVwZGF0aW5nPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyBmcm9tIDxjPmRhdGE8L2M+IHRvIHVzZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgc3VtIG9mIG9mZnNldCBhbmQgY291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiA8Yz5kYXRhPC9jPjwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE51bGxFeGNlcHRpb24iPjxjPmRhdGE8L2M+IGlzIGEgbnVsbCByZWZlcmVuY2U8L2V4Y2VwdGlvbj4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5PZmZzZXQgb3IgY291bnQgaXMgbmVnYXRpdmUuPC9leGNlcHRpb24+Ci0gICAgICAgIHZvaWQgVXBkYXRlKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPgotICAgICAgICAvLy8gPHJlbWFya3M+VGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgY29udmVydGVkIGJ5IHRoZSBVVEYtOCBlbmNvZGluZzwvcmVtYXJrcz4KLSAgICAgICAgdm9pZCBVcGRhdGUoc3RyaW5nIGRhdGEpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nLCB1c2luZyBhIHNwZWNpZmljIGVuY29kaW5nCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVuY29kaW5nIj5UaGUgZW5jb2RpbmcgdG8gdXNlPC9wYXJhbT4KLSAgICAgICAgdm9pZCBVcGRhdGUoc3RyaW5nIGRhdGEsIEVuY29kaW5nIGVuY29kaW5nKTsKLSAgICB9Ci0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUmVwcmVzZW50cyB0aGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgZnJvbSBhIGNvZGVjIHdoZW4gbmV3IGRhdGEKLSAgICAvLy8gYXJlIGF2YWlsYWJsZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iZGF0YSI+VGhlIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgcHJvY2Vzc2VkIGRhdGE8L3BhcmFtcmVmPgotICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0ic3RhcnRJbmRleCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwcm9jZXNzZWQgYnl0ZSBpbiA8Yz5kYXRhPC9jPjwvcGFyYW1yZWY+Ci0gICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBwcm9jZXNzZWQgYnl0ZXMgYXZhaWxhYmxlPC9wYXJhbXJlZj4KLSAgICAvLy8gPHJlbWFya3M+T24gcmV0dXJuIGZyb20gdGhpcyBtZXRob2QsIHRoZSBkYXRhIG1heSBiZSBvdmVyd3JpdHRlbiwgc28gZ3JhYiBpdCB3aGlsZSB5b3UgY2FuLiAKLSAgICAvLy8gWW91IGNhbm5vdCBhc3N1bWUgdGhhdCBzdGFydEluZGV4IHdpbGwgYmUgemVyby4KLSAgICAvLy8gPC9yZW1hcmtzPgotICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIERhdGFBdmFpbGFibGVIYW5kbGVyKGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnRJbmRleCwgaW50IGNvdW50KTsKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRGVjbGFyZXMgbWV0aG9kcyBhbmQgZXZlbnRzIGZvciBpbXBsZW1lbnRpbmcgY29tcHJlc3NvcnMvZGVjb21wcmVzc29ycwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGludGVyZmFjZSBDb2RlYwotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gT2NjdXJzIHdoZW4gbW9yZSBwcm9jZXNzZWQgZGF0YSBhcmUgYXZhaWxhYmxlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBldmVudCBEYXRhQXZhaWxhYmxlSGFuZGxlciBEYXRhQXZhaWxhYmxlOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4KLSAgICAgICAgdm9pZCBBZGQoYnl0ZVtdIGRhdGEpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gYWRkIGZyb20gPGM+ZGF0YTwvYz48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4KLSAgICAgICAgdm9pZCBBZGQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCk7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmluaXNoZXMgdXAgYW55IHBlbmRpbmcgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBhbmQgaGFuZGxlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgdm9pZCBGaW5pc2goKTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzIHRoZSBjaGVja3N1bSBvZiB0aGUgZGF0YSB0aGF0IGhhcyBiZWVuIGFkZGVkIHNvIGZhcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICB1aW50IENoZWNrc3VtIHsgZ2V0OyB9Ci0KLQotICAgIH0KLQotICAgICNlbmRyZWdpb24KLQotICAgICNyZWdpb24gQ2xhc3NlcwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRW5jYXBzdWxhdGVzIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFpMaWIgbGlicmFyeQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEluZm8KLSAgICB7Ci0gICAgICAgICNyZWdpb24gRExMIGltcG9ydHMKLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQotICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWludCB6bGliQ29tcGlsZUZsYWdzKCk7Ci0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQotICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gc3RyaW5nIHpsaWJWZXJzaW9uKCk7Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAjcmVnaW9uIFByaXZhdGUgc3R1ZmYKLSAgICAgICAgcHJpdmF0ZSB1aW50IF9mbGFnczsKLQotICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdGhhdCB1bnBhY2tzIGEgYml0c2l6ZSBtYXNrCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBiaXRTaXplKHVpbnQgYml0cykKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChiaXRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIDE2OwotICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIDMyOwotICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIDY0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoZSA8Yz5JbmZvPC9jPiBjbGFzcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEluZm8oKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZmxhZ3MgPSB6bGliQ29tcGlsZUZsYWdzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggZGVidWcgaW5mbwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBIYXNEZWJ1Z0luZm8geyBnZXQgeyByZXR1cm4gMCAhPSAoX2ZsYWdzICYgMHgxMDApOyB9IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggYXNzZW1ibHkgb3B0aW1pemF0aW9ucwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBVc2VzQXNzZW1ibHlDb2RlIHsgZ2V0IHsgcmV0dXJuIDAgIT0gKF9mbGFncyAmIDB4MjAwKTsgfSB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgdW5zaWduZWQgaW50IHRoYXQgd2FzIGNvbXBpbGVkIGludG8gWmxpYgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFNpemVPZlVJbnQgeyBnZXQgeyByZXR1cm4gYml0U2l6ZShfZmxhZ3MgJiAzKTsgfSB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgdW5zaWduZWQgbG9uZyB0aGF0IHdhcyBjb21waWxlZCBpbnRvIFpsaWIKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBTaXplT2ZVTG9uZyB7IGdldCB7IHJldHVybiBiaXRTaXplKChfZmxhZ3MgPj4gMikgJiAzKTsgfSB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlcnMgdGhhdCB3ZXJlIGNvbXBpbGVkIGludG8gWmxpYgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFNpemVPZlBvaW50ZXIgeyBnZXQgeyByZXR1cm4gYml0U2l6ZSgoX2ZsYWdzID4+IDQpICYgMyk7IH0gfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHpfb2ZmX3QgdHlwZSB0aGF0IHdhcyBjb21waWxlZCBpbnRvIFpsaWIKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBTaXplT2ZPZmZzZXQgeyBnZXQgeyByZXR1cm4gYml0U2l6ZSgoX2ZsYWdzID4+IDYpICYgMyk7IH0gfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMgdGhlIHZlcnNpb24gb2YgWkxpYiBhcyBhIHN0cmluZywgZS5nLiAiMS4yLjEiCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFZlcnNpb24geyBnZXQgeyByZXR1cm4gemxpYlZlcnNpb24oKTsgfSB9Ci0gICAgfQotCi0gICAgI2VuZHJlZ2lvbgotCi19CmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRG90WkxpYi5jc3Byb2ogYi9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRG90WkxpYi5jc3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYTdmYjEuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RvdFpMaWIuY3Nwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTxWaXN1YWxTdHVkaW9Qcm9qZWN0PgotICAgIDxDU0hBUlAKLSAgICAgICAgUHJvamVjdFR5cGUgPSAiTG9jYWwiCi0gICAgICAgIFByb2R1Y3RWZXJzaW9uID0gIjcuMTAuMzA3NyIKLSAgICAgICAgU2NoZW1hVmVyc2lvbiA9ICIyLjAiCi0gICAgICAgIFByb2plY3RHdWlkID0gIntCQjFFRTBCMS0xODA4LTQ2Q0ItQjc4Ni05NDlEOTExMTdGQzV9IgotICAgID4KLSAgICAgICAgPEJ1aWxkPgotICAgICAgICAgICAgPFNldHRpbmdzCi0gICAgICAgICAgICAgICAgQXBwbGljYXRpb25JY29uID0gIiIKLSAgICAgICAgICAgICAgICBBc3NlbWJseUtleUNvbnRhaW5lck5hbWUgPSAiIgotICAgICAgICAgICAgICAgIEFzc2VtYmx5TmFtZSA9ICJEb3RaTGliIgotICAgICAgICAgICAgICAgIEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGUgPSAiIgotICAgICAgICAgICAgICAgIERlZmF1bHRDbGllbnRTY3JpcHQgPSAiSlNjcmlwdCIKLSAgICAgICAgICAgICAgICBEZWZhdWx0SFRNTFBhZ2VMYXlvdXQgPSAiR3JpZCIKLSAgICAgICAgICAgICAgICBEZWZhdWx0VGFyZ2V0U2NoZW1hID0gIklFNTAiCi0gICAgICAgICAgICAgICAgRGVsYXlTaWduID0gImZhbHNlIgotICAgICAgICAgICAgICAgIE91dHB1dFR5cGUgPSAiTGlicmFyeSIKLSAgICAgICAgICAgICAgICBQcmVCdWlsZEV2ZW50ID0gIiIKLSAgICAgICAgICAgICAgICBQb3N0QnVpbGRFdmVudCA9ICIiCi0gICAgICAgICAgICAgICAgUm9vdE5hbWVzcGFjZSA9ICJEb3RaTGliIgotICAgICAgICAgICAgICAgIFJ1blBvc3RCdWlsZEV2ZW50ID0gIk9uQnVpbGRTdWNjZXNzIgotICAgICAgICAgICAgICAgIFN0YXJ0dXBPYmplY3QgPSAiIgotICAgICAgICAgICAgPgotICAgICAgICAgICAgICAgIDxDb25maWcKLSAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJEZWJ1ZyIKLSAgICAgICAgICAgICAgICAgICAgQWxsb3dVbnNhZmVCbG9ja3MgPSAiZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzID0gIjI4NTIxMjY3MiIKLSAgICAgICAgICAgICAgICAgICAgQ2hlY2tGb3JPdmVyZmxvd1VuZGVyZmxvdyA9ICJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbk92ZXJyaWRlRmlsZSA9ICIiCi0gICAgICAgICAgICAgICAgICAgIERlZmluZUNvbnN0YW50cyA9ICJERUJVRztUUkFDRSIKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbkZpbGUgPSAiZG9jc1xEb3RaTGliLnhtbCIKLSAgICAgICAgICAgICAgICAgICAgRGVidWdTeW1ib2xzID0gInRydWUiCi0gICAgICAgICAgICAgICAgICAgIEZpbGVBbGlnbm1lbnQgPSAiNDA5NiIKLSAgICAgICAgICAgICAgICAgICAgSW5jcmVtZW50YWxCdWlsZCA9ICJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgTm9TdGRMaWIgPSAiZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgIE5vV2FybiA9ICIxNTkxIgotICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZSA9ICJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgT3V0cHV0UGF0aCA9ICJiaW5cRGVidWdcIgotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckZvckNvbUludGVyb3AgPSAiZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgIFJlbW92ZUludGVnZXJDaGVja3MgPSAiZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgIFRyZWF0V2FybmluZ3NBc0Vycm9ycyA9ICJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgV2FybmluZ0xldmVsID0gIjQiCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICA8Q29uZmlnCi0gICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiUmVsZWFzZSIKLSAgICAgICAgICAgICAgICAgICAgQWxsb3dVbnNhZmVCbG9ja3MgPSAiZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzID0gIjI4NTIxMjY3MiIKLSAgICAgICAgICAgICAgICAgICAgQ2hlY2tGb3JPdmVyZmxvd1VuZGVyZmxvdyA9ICJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbk92ZXJyaWRlRmlsZSA9ICIiCi0gICAgICAgICAgICAgICAgICAgIERlZmluZUNvbnN0YW50cyA9ICJUUkFDRSIKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbkZpbGUgPSAiZG9jc1xEb3RaTGliLnhtbCIKLSAgICAgICAgICAgICAgICAgICAgRGVidWdTeW1ib2xzID0gImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBGaWxlQWxpZ25tZW50ID0gIjQwOTYiCi0gICAgICAgICAgICAgICAgICAgIEluY3JlbWVudGFsQnVpbGQgPSAiZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgIE5vU3RkTGliID0gImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBOb1dhcm4gPSAiIgotICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZSA9ICJ0cnVlIgotICAgICAgICAgICAgICAgICAgICBPdXRwdXRQYXRoID0gImJpblxSZWxlYXNlXCIKLSAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJGb3JDb21JbnRlcm9wID0gImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBSZW1vdmVJbnRlZ2VyQ2hlY2tzID0gImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBUcmVhdFdhcm5pbmdzQXNFcnJvcnMgPSAiZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgIFdhcm5pbmdMZXZlbCA9ICI0IgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICA8L1NldHRpbmdzPgotICAgICAgICAgICAgPFJlZmVyZW5jZXM+Ci0gICAgICAgICAgICAgICAgPFJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBOYW1lID0gIlN5c3RlbSIKLSAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHlOYW1lID0gIlN5c3RlbSIKLSAgICAgICAgICAgICAgICAgICAgSGludFBhdGggPSAiQzpcV0lOTlRcTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcmtcdjEuMS40MzIyXFN5c3RlbS5kbGwiCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICA8UmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiU3lzdGVtLkRhdGEiCi0gICAgICAgICAgICAgICAgICAgIEFzc2VtYmx5TmFtZSA9ICJTeXN0ZW0uRGF0YSIKLSAgICAgICAgICAgICAgICAgICAgSGludFBhdGggPSAiQzpcV0lOTlRcTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcmtcdjEuMS40MzIyXFN5c3RlbS5EYXRhLmRsbCIKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgIDxSZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJTeXN0ZW0uWE1MIgotICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAiU3lzdGVtLlhtbCIKLSAgICAgICAgICAgICAgICAgICAgSGludFBhdGggPSAiQzpcV0lOTlRcTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcmtcdjEuMS40MzIyXFN5c3RlbS5YTUwuZGxsIgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgPFJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBOYW1lID0gIm51bml0LmZyYW1ld29yayIKLSAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHlOYW1lID0gIm51bml0LmZyYW1ld29yayIKLSAgICAgICAgICAgICAgICAgICAgSGludFBhdGggPSAiRTpcYXBwc1xOVW5pdCBWMi4xXFxiaW5cbnVuaXQuZnJhbWV3b3JrLmRsbCIKLSAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHlGb2xkZXJLZXkgPSAiaGtsbVxkblxudW5pdC5mcmFtZXdvcmsiCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDwvUmVmZXJlbmNlcz4KLSAgICAgICAgPC9CdWlsZD4KLSAgICAgICAgPEZpbGVzPgotICAgICAgICAgICAgPEluY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPEZpbGUKLSAgICAgICAgICAgICAgICAgICAgUmVsUGF0aCA9ICJBc3NlbWJseUluZm8uY3MiCi0gICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSIKLSAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSIKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgIDxGaWxlCi0gICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiQ2hlY2tzdW1JbXBsLmNzIgotICAgICAgICAgICAgICAgICAgICBTdWJUeXBlID0gIkNvZGUiCi0gICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICA8RmlsZQotICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkNpcmN1bGFyQnVmZmVyLmNzIgotICAgICAgICAgICAgICAgICAgICBTdWJUeXBlID0gIkNvZGUiCi0gICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICA8RmlsZQotICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkNvZGVjQmFzZS5jcyIKLSAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIgotICAgICAgICAgICAgICAgICAgICBCdWlsZEFjdGlvbiA9ICJDb21waWxlIgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgPEZpbGUKLSAgICAgICAgICAgICAgICAgICAgUmVsUGF0aCA9ICJEZWZsYXRlci5jcyIKLSAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIgotICAgICAgICAgICAgICAgICAgICBCdWlsZEFjdGlvbiA9ICJDb21waWxlIgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgPEZpbGUKLSAgICAgICAgICAgICAgICAgICAgUmVsUGF0aCA9ICJEb3RaTGliLmNzIgotICAgICAgICAgICAgICAgICAgICBTdWJUeXBlID0gIkNvZGUiCi0gICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICA8RmlsZQotICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkdaaXBTdHJlYW0uY3MiCi0gICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSIKLSAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSIKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgIDxGaWxlCi0gICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiSW5mbGF0ZXIuY3MiCi0gICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSIKLSAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSIKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgIDxGaWxlCi0gICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiVW5pdFRlc3RzLmNzIgotICAgICAgICAgICAgICAgICAgICBTdWJUeXBlID0gIkNvZGUiCi0gICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDwvSW5jbHVkZT4KLSAgICAgICAgPC9GaWxlcz4KLSAgICA8L0NTSEFSUD4KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0daaXBTdHJlYW0uY3MgYi9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvR1ppcFN0cmVhbS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5MWJlYy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvR1ppcFN0cmVhbS5jcworKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vLwotLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNAotLy8KLS8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAKLS8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwotCi1uYW1lc3BhY2UgRG90WkxpYgotewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gSW1wbGVtZW50cyBhIGNvbXByZXNzZWQgPHNlZSBjcmVmPSJTdHJlYW0iLz4sIGluIEdaaXAgKC5neikgZm9ybWF0LgotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIEdaaXBTdHJlYW0gOiBTdHJlYW0sIElEaXNwb3NhYmxlCi0JewotICAgICAgICAjcmVnaW9uIERsbCBJbXBvcnRzCi0gICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsLCBDaGFyU2V0PUNoYXJTZXQuQW5zaSldCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBJbnRQdHIgZ3pvcGVuKHN0cmluZyBuYW1lLCBzdHJpbmcgbW9kZSk7Ci0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQotICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGd6Y2xvc2UoSW50UHRyIGd6RmlsZSk7Ci0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQotICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGd6d3JpdGUoSW50UHRyIGd6RmlsZSwgaW50IGRhdGEsIGludCBsZW5ndGgpOwotCi0gICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnenJlYWQoSW50UHRyIGd6RmlsZSwgaW50IGRhdGEsIGludCBsZW5ndGgpOwotCi0gICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnemdldGMoSW50UHRyIGd6RmlsZSk7Ci0KLSAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQotICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGd6cHV0YyhJbnRQdHIgZ3pGaWxlLCBpbnQgYyk7Ci0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gUHJpdmF0ZSBkYXRhCi0gICAgICAgIHByaXZhdGUgSW50UHRyIF9nekZpbGU7Ci0gICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZCA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2wgX2lzV3JpdGluZzsKLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgZmlsZSBhcyBhIHdyaXRlYWJsZSBHWmlwU3RyZWFtCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBjb21wcmVzc2VkIGZpbGUgdG8gY3JlYXRlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZXZlbCI+VGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIHVzZSB3aGVuIGFkZGluZyBkYXRhPC9wYXJhbT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iWkxpYkV4Y2VwdGlvbiI+SWYgYW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGludGVybmFsIHpsaWIgZnVuY3Rpb248L2V4Y2VwdGlvbj4KLQkJcHVibGljIEdaaXBTdHJlYW0oc3RyaW5nIGZpbGVOYW1lLCBDb21wcmVzc0xldmVsIGxldmVsKQotCQl7Ci0gICAgICAgICAgICBfaXNXcml0aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIF9nekZpbGUgPSBnem9wZW4oZmlsZU5hbWUsIFN0cmluZy5Gb3JtYXQoIndiezB9IiwgKGludClsZXZlbCkpOwotICAgICAgICAgICAgaWYgKF9nekZpbGUgPT0gSW50UHRyLlplcm8pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpMaWJFeGNlcHRpb24oLTEsICJDb3VsZCBub3Qgb3BlbiAiICsgZmlsZU5hbWUpOwotCQl9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gT3BlbnMgYW4gZXhpc3RpbmcgZmlsZSBhcyBhIHJlYWRhYmxlIEdaaXBTdHJlYW0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+VGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gb3BlbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IlpMaWJFeGNlcHRpb24iPklmIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBpbnRlcm5hbCB6bGliIGZ1bmN0aW9uPC9leGNlcHRpb24+Ci0gICAgICAgIHB1YmxpYyBHWmlwU3RyZWFtKHN0cmluZyBmaWxlTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2lzV3JpdGluZyA9IGZhbHNlOwotICAgICAgICAgICAgX2d6RmlsZSA9IGd6b3BlbihmaWxlTmFtZSwgInJiIik7Ci0gICAgICAgICAgICBpZiAoX2d6RmlsZSA9PSBJbnRQdHIuWmVybykKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWkxpYkV4Y2VwdGlvbigtMSwgIkNvdWxkIG5vdCBvcGVuICIgKyBmaWxlTmFtZSk7Ci0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgI3JlZ2lvbiBBY2Nlc3MgcHJvcGVydGllcwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRydWUgb2YgdGhpcyBzdHJlYW0gY2FuIGJlIHJlYWQgZnJvbSwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblJlYWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFfaXNXcml0aW5nOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyBmYWxzZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuU2VlawotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdHNyZWFtIGlzIHdyaXRlYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhbldyaXRlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfaXNXcml0aW5nOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAKLSAgICAgICAgI3JlZ2lvbiBEZXN0cnVjdG9yICYgSURpc3Bvc2Ugc3R1ZmYKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZXN0cm95cyB0aGlzIGluc3RhbmNlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIH5HWmlwU3RyZWFtKCkKLSAgICAgICAgewotICAgICAgICAgICAgY2xlYW5VcChmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDbG9zZXMgdGhlIGV4dGVybmFsIGZpbGUgaGFuZGxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjbGVhblVwKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRG9lcyB0aGUgYWN0dWFsIGNsb3Npbmcgb2YgdGhlIGZpbGUgaGFuZGxlLgotICAgICAgICBwcml2YXRlIHZvaWQgY2xlYW5VcChib29sIGlzRGlzcG9zaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGd6Y2xvc2UoX2d6RmlsZSk7Ci0gICAgICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAKLSAgICAgICAgI3JlZ2lvbiBCYXNpYyByZWFkaW5nIGFuZCB3cml0aW5nCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEF0dGVtcHRzIHRvIHJlYWQgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZmZlciI+VGhlIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPlRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGVzdGluYXRpb24gYnl0ZSBpbiA8Yz5idWZmZXI8L2M+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQ8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIG51bWJlciBvZiBieXRlcyByZWFkPC9yZXR1cm5zPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE51bGxFeGNlcHRpb24iPklmIDxjPmJ1ZmZlcjwvYz4gaXMgbnVsbDwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24iPklmIDxjPmNvdW50PC9jPiBvciA8Yz5vZmZzZXQ8L2M+IGFyZSBuZWdhdGl2ZTwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+SWYgPGM+b2Zmc2V0PC9jPiAgKyA8Yz5jb3VudDwvYz4gaXMgJmd0OyBidWZmZXIuTGVuZ3RoPC9leGNlcHRpb24+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiI+SWYgdGhpcyBzdHJlYW0gaXMgbm90IHJlYWRhYmxlLjwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJPYmplY3REaXNwb3NlZEV4Y2VwdGlvbiI+SWYgdGhpcyBzdHJlYW0gaGFzIGJlZW4gZGlzcG9zZWQuPC9leGNlcHRpb24+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghQ2FuUmVhZCkgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmICgob2Zmc2V0K2NvdW50KSA+IGJ1ZmZlci5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsKLQotICAgICAgICAgICAgR0NIYW5kbGUgaCA9IEdDSGFuZGxlLkFsbG9jKGJ1ZmZlciwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0OwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ3pyZWFkKF9nekZpbGUsIGguQWRkck9mUGlubmVkT2JqZWN0KCkuVG9JbnQzMigpICsgb2Zmc2V0LCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGguRnJlZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEF0dGVtcHRzIHRvIHJlYWQgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgYnl0ZSB0aGF0IHdhcyByZWFkLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yIG9yIEVuZC1PZi1GaWxlPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRCeXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFDYW5SZWFkKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOwotICAgICAgICAgICAgcmV0dXJuIGd6Z2V0YyhfZ3pGaWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyBhIG51bWJlciBvZiBieXRlcyB0byB0aGUgc3RyZWFtCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmZmVyIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5JZiA8Yz5idWZmZXI8L2M+IGlzIG51bGw8L2V4Y2VwdGlvbj4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5JZiA8Yz5jb3VudDwvYz4gb3IgPGM+b2Zmc2V0PC9jPiBhcmUgbmVnYXRpdmU8L2V4Y2VwdGlvbj4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPklmIDxjPm9mZnNldDwvYz4gICsgPGM+Y291bnQ8L2M+IGlzICZndDsgYnVmZmVyLkxlbmd0aDwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGlzIG5vdCB3cml0ZWFibGUuPC9leGNlcHRpb24+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik9iamVjdERpc3Bvc2VkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBkaXNwb3NlZC48L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIUNhbldyaXRlKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IGNvdW50IDwgMCkgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gYnVmZmVyLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOwotCi0gICAgICAgICAgICBHQ0hhbmRsZSBoID0gR0NIYW5kbGUuQWxsb2MoYnVmZmVyLCBHQ0hhbmRsZVR5cGUuUGlubmVkKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBnendyaXRlKF9nekZpbGUsIGguQWRkck9mUGlubmVkT2JqZWN0KCkuVG9JbnQzMigpICsgb2Zmc2V0LCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGguRnJlZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIHN0cmVhbQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgYnl0ZSB0byBhZGQgdG8gdGhlIHN0cmVhbS48L3BhcmFtPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGlzIG5vdCB3cml0ZWFibGUuPC9leGNlcHRpb24+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik9iamVjdERpc3Bvc2VkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBkaXNwb3NlZC48L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKGJ5dGUgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghQ2FuV3JpdGUpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmIChfaXNEaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJHWmlwU3RyZWFtIik7Ci0KLSAgICAgICAgICAgIGludCByZXN1bHQgPSBnenB1dGMoX2d6RmlsZSwgKGludCl2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgI3JlZ2lvbiBQb3NpdGlvbiAmIGxlbmd0aCBzdHVmZgotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBOb3Qgc3VwcG9ydGVkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPkFsd2F5cyB0aHJvd248L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0TGVuZ3RoKGxvbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgTm90IHN1cHBwb3J0ZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9yaWdpbiI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFNlZWsobG9uZyBvZmZzZXQsIFNlZWtPcmlnaW4gb3JpZ2luKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmx1c2hlcyB0aGUgPGM+R1ppcFN0cmVhbTwvYz4uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5JbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIFRoaXMgaXMgYmVjYXVzZSBleGNlc3NpdmUKLSAgICAgICAgLy8vIGZsdXNoaW5nIG1heSBkZWdyYWRlIHRoZSBhY2hpZXZhYmxlIGNvbXByZXNzaW9uIHJhdGVzLjwvcmVtYXJrcz4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBsZWZ0IGVtcHR5IG9uIHB1cnBvc2UKLSAgICAgICAgfQotICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzL3NldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIDxjPkdaaXBTdHJlYW08L2M+LiBOb3Qgc3VwcHBvcnRlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPkluIHRoaXMgaW1wbGVtZW50YXRpb24gdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkPC9yZW1hcmtzPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPkFsd2F5cyB0aHJvd248L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUG9zaXRpb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHN0cmVhbS4gTm90IHN1cHBwb3J0ZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5JbiB0aGlzIGltcGxlbWVudGF0aW9uIHRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZDwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIExlbmd0aAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9JbmZsYXRlci5jcyBiL2xpYnMvemxpYi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9JbmZsYXRlci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlOWNmMy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvSW5mbGF0ZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8KLS8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQKLS8vCi0vLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gCi0vLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKLQotbmFtZXNwYWNlIERvdFpMaWIKLXsKLSAgICAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEltcGxlbWVudHMgYSBkYXRhIGRlY29tcHJlc3NvciwgdXNpbmcgdGhlIGluZmxhdGUgYWxnb3JpdGhtIGluIHRoZSBaTGliIGRsbAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEluZmxhdGVyIDogQ29kZWNCYXNlCi0JewotICAgICAgICAjcmVnaW9uIERsbCBpbXBvcnRzCi0gICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsLCBDaGFyU2V0PUNoYXJTZXQuQW5zaSldCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZUluaXRfKHJlZiBaU3RyZWFtIHN6LCBzdHJpbmcgdnMsIGludCBzaXplKTsKLQotICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZShyZWYgWlN0cmVhbSBzeiwgaW50IGZsdXNoKTsKLQotICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZVJlc2V0KHJlZiBaU3RyZWFtIHN6KTsKLQotICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZUVuZChyZWYgWlN0cmVhbSBzeik7Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIG5ldyBpbnN0YW5jZSBvZiB0aGUgPGM+SW5mbGF0ZXI8L2M+Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBJbmZsYXRlcigpIDogYmFzZSgpCi0JCXsKLSAgICAgICAgICAgIGludCByZXR2YWwgPSBpbmZsYXRlSW5pdF8ocmVmIF96dHJlYW0sIEluZm8uVmVyc2lvbiwgTWFyc2hhbC5TaXplT2YoX3p0cmVhbSkpOwotICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKHJldHZhbCwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGluZmxhdGVyIik7Ci0KLSAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gYWRkIGZyb20gPGM+ZGF0YTwvYz48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQWRkKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IGNvdW50IDwgMCkgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gZGF0YS5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBjb3VudDsKLSAgICAgICAgICAgIGludCBpbnB1dEluZGV4ID0gb2Zmc2V0OwotICAgICAgICAgICAgaW50IGVyciA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlIChlcnIgPj0gMCAmJiBpbnB1dEluZGV4IDwgdG90YWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29weUlucHV0KGRhdGEsIGlucHV0SW5kZXgsIE1hdGguTWluKHRvdGFsIC0gaW5wdXRJbmRleCwga0J1ZmZlclNpemUpKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBpbmZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuTm9uZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciA9PSAwKQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX3p0cmVhbS5hdmFpbF9vdXQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgT25EYXRhQXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBpbmZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuTm9uZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlucHV0SW5kZXggKz0gKGludClfenRyZWFtLnRvdGFsX2luOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Q2hlY2tzdW0oIF96dHJlYW0uYWRsZXIgKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmluaXNoZXMgdXAgYW55IHBlbmRpbmcgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBhbmQgaGFuZGxlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmluaXNoKCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGVycjsKLSAgICAgICAgICAgIGRvIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IGluZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5GaW5pc2gpOwotICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKGVyciA9PSAwKTsKLSAgICAgICAgICAgIHNldENoZWNrc3VtKCBfenRyZWFtLmFkbGVyICk7Ci0gICAgICAgICAgICBpbmZsYXRlUmVzZXQocmVmIF96dHJlYW0pOwotICAgICAgICAgICAgcmVzZXRPdXRwdXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENsb3NlcyB0aGUgaW50ZXJuYWwgemxpYiBpbmZsYXRlIHN0cmVhbQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBDbGVhblVwKCkgeyBpbmZsYXRlRW5kKHJlZiBfenRyZWFtKTsgfQotCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvVW5pdFRlc3RzLmNzIGIvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL1VuaXRUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU5NjMxNy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvVW5pdFRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8vCi0vLyCpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0Ci0vLwotLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIAotLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Ci11c2luZyBTeXN0ZW0uSU87Ci0KLS8vIHVuY29tbWVudCB0aGUgZGVmaW5lIGJlbG93IHRvIGluY2x1ZGUgdW5pdCB0ZXN0cwotLy8jZGVmaW5lIG51bml0Ci0jaWYgbnVuaXQKLXVzaW5nIE5Vbml0LkZyYW1ld29yazsKLQotLy8gVW5pdCB0ZXN0cyBmb3IgdGhlIERvdFpMaWIgY2xhc3MgbGlicmFyeQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFVzZSB0aGlzIHdpdGggTlVuaXQgMiBmcm9tIGh0dHA6Ly93d3cubnVuaXQub3JnCi0vLwotCi1uYW1lc3BhY2UgRG90WkxpYlRlc3RzCi17Ci0gICAgdXNpbmcgRG90WkxpYjsKLQotICAgIC8vIGhlbHBlciBtZXRob2RzCi0gICAgaW50ZXJuYWwgY2xhc3MgVXRpbHMKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBieXRlQXJyRXF1YWwoIGJ5dGVbXSBsaHMsIGJ5dGVbXSByaHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGhzLkxlbmd0aCAhPSByaHMuTGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBsaHMuTGVuZ3RoLTE7IGkgPj0gMDsgLS1pKQotICAgICAgICAgICAgICAgIGlmIChsaHNbaV0gIT0gcmhzW2ldKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICBbVGVzdEZpeHR1cmVdCi0gICAgcHVibGljIGNsYXNzIENpcmNCdWZmZXJUZXN0cwotICAgIHsKLSAgICAgICAgI3JlZ2lvbiBDaXJjdWxhciBidWZmZXIgdGVzdHMKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNpbmdsZVB1dEdldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENpcmN1bGFyQnVmZmVyIGJ1ZiA9IG5ldyBDaXJjdWxhckJ1ZmZlcigxMCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIGJ1Zi5TaXplICk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIC0xLCBidWYuR2V0KCkgKTsKLQotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWYuUHV0KCAxICkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBidWYuU2l6ZSApOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBidWYuR2V0KCkgKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMCwgYnVmLlNpemUgKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggLTEsIGJ1Zi5HZXQoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJsb2NrUHV0R2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2lyY3VsYXJCdWZmZXIgYnVmID0gbmV3IENpcmN1bGFyQnVmZmVyKDEwKTsKLSAgICAgICAgICAgIGJ5dGVbXSBhcnIgPSB7MSwyLDMsNCw1LDYsNyw4LDksMTB9OwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMCwgYnVmLlB1dChhcnIsMCwxMCkgKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMTAsIGJ1Zi5TaXplICk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSggYnVmLlB1dCgxMSkgKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMSwgYnVmLkdldCgpICk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCBidWYuUHV0KDExKSApOwotCi0gICAgICAgICAgICBieXRlW10gYXJyMiA9IChieXRlW10pYXJyLkNsb25lKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDksIGJ1Zi5HZXQoYXJyMiwxLDkpICk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCBVdGlscy5ieXRlQXJyRXF1YWwoYXJyLGFycjIpICk7Ci0gICAgICAgIH0KLQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgfQotCi0gICAgW1Rlc3RGaXh0dXJlXQotICAgIHB1YmxpYyBjbGFzcyBDaGVja3N1bVRlc3RzCi0gICAgewotICAgICAgICAjcmVnaW9uIENSQzMyIFRlc3RzCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBDUkMzMl9OdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgQ1JDMzJDaGVja3N1bSBjcmMzMiA9IG5ldyBDUkMzMkNoZWNrc3VtKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIGNyYzMyLlZhbHVlICk7Ci0KLSAgICAgICAgICAgIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oMSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIGNyYzMyLlZhbHVlICk7Ci0KLSAgICAgICAgICAgIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oNTU2KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggNTU2LCBjcmMzMi5WYWx1ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENSQzMyX0RhdGEoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUkMzMkNoZWNrc3VtIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oKTsKLSAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0geyAxLDIsMyw0LDUsNiw3IH07Ci0gICAgICAgICAgICBjcmMzMi5VcGRhdGUoZGF0YSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDB4NzBlNDY4ODgsIGNyYzMyLlZhbHVlICApOwotCi0gICAgICAgICAgICBjcmMzMiA9IG5ldyBDUkMzMkNoZWNrc3VtKCk7Ci0gICAgICAgICAgICBjcmMzMi5VcGRhdGUoInBlbmd1aW4iKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMHgwZTVjMWExMjAsIGNyYzMyLlZhbHVlICk7Ci0KLSAgICAgICAgICAgIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oMSk7Ci0gICAgICAgICAgICBjcmMzMi5VcGRhdGUoInBlbmd1aW4iKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweDQzYjZhYTk0LCBjcmMzMi5WYWx1ZSk7Ci0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgI3JlZ2lvbiBBZGxlciB0ZXN0cwotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBBZGxlcl9OdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgQWRsZXJDaGVja3N1bSBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgYWRsZXIuVmFsdWUpOwotCi0gICAgICAgICAgICBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKDEpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBhZGxlci5WYWx1ZSApOwotCi0gICAgICAgICAgICBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKDU1Nik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDU1NiwgYWRsZXIuVmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBBZGxlcl9EYXRhKCkKLSAgICAgICAgewotICAgICAgICAgICAgQWRsZXJDaGVja3N1bSBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKDEpOwotICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSB7IDEsMiwzLDQsNSw2LDcgfTsKLSAgICAgICAgICAgIGFkbGVyLlVwZGF0ZShkYXRhKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMHg1YjAwMWQsIGFkbGVyLlZhbHVlICApOwotCi0gICAgICAgICAgICBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKCk7Ci0gICAgICAgICAgICBhZGxlci5VcGRhdGUoInBlbmd1aW4iKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweDBiY2YwMmY2LCBhZGxlci5WYWx1ZSApOwotCi0gICAgICAgICAgICBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKDEpOwotICAgICAgICAgICAgYWRsZXIuVXBkYXRlKCJwZW5ndWluIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHgwYmQ2MDJmNywgYWRsZXIuVmFsdWUpOwotCi0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgIH0KLQotICAgIFtUZXN0Rml4dHVyZV0KLSAgICBwdWJsaWMgY2xhc3MgSW5mb1Rlc3RzCi0gICAgewotICAgICAgICAjcmVnaW9uIEluZm8gdGVzdHMKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluZm9fVmVyc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluZm8gaW5mbyA9IG5ldyBJbmZvKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEuMi4zIiwgSW5mby5WZXJzaW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMiwgaW5mby5TaXplT2ZVSW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMiwgaW5mby5TaXplT2ZVTG9uZyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzIsIGluZm8uU2l6ZU9mUG9pbnRlcik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzIsIGluZm8uU2l6ZU9mT2Zmc2V0KTsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgfQotCi0gICAgW1Rlc3RGaXh0dXJlXQotICAgIHB1YmxpYyBjbGFzcyBEZWZsYXRlSW5mbGF0ZVRlc3RzCi0gICAgewotICAgICAgICAjcmVnaW9uIERlZmxhdGUgdGVzdHMKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlZmxhdGVfSW5pdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nIChEZWZsYXRlciBkZWYgPSBuZXcgRGVmbGF0ZXIoQ29tcHJlc3NMZXZlbC5EZWZhdWx0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IGNvbXByZXNzZWREYXRhID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwcml2YXRlIHVpbnQgYWRsZXIxOwotCi0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IHVuY29tcHJlc3NlZERhdGEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHByaXZhdGUgdWludCBhZGxlcjI7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgQ0RhdGFBdmFpbChieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBjb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQotICAgICAgICAgICAgICAgIGNvbXByZXNzZWREYXRhLkFkZChkYXRhW2krc3RhcnRJbmRleF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlZmxhdGVfQ29tcHJlc3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wcmVzc2VkRGF0YS5DbGVhcigpOwotCi0gICAgICAgICAgICBieXRlW10gdGVzdERhdGEgPSBuZXcgYnl0ZVszNTAwMF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3REYXRhLkxlbmd0aDsgKytpKQotICAgICAgICAgICAgICAgIHRlc3REYXRhW2ldID0gNTsKLQotICAgICAgICAgICAgdXNpbmcgKERlZmxhdGVyIGRlZiA9IG5ldyBEZWZsYXRlcigoQ29tcHJlc3NMZXZlbCk1KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWYuRGF0YUF2YWlsYWJsZSArPSBuZXcgRGF0YUF2YWlsYWJsZUhhbmRsZXIoQ0RhdGFBdmFpbCk7Ci0gICAgICAgICAgICAgICAgZGVmLkFkZCh0ZXN0RGF0YSk7Ci0gICAgICAgICAgICAgICAgZGVmLkZpbmlzaCgpOwotICAgICAgICAgICAgICAgIGFkbGVyMSA9IGRlZi5DaGVja3N1bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgI3JlZ2lvbiBJbmZsYXRlIHRlc3RzCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJbmZsYXRlX0luaXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAoSW5mbGF0ZXIgaW5mID0gbmV3IEluZmxhdGVyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgRERhdGFBdmFpbChieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBjb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQotICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZERhdGEuQWRkKGRhdGFbaStzdGFydEluZGV4XSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSW5mbGF0ZV9FeHBhbmQoKQotICAgICAgICB7IAotICAgICAgICAgICAgdW5jb21wcmVzc2VkRGF0YS5DbGVhcigpOwotCi0gICAgICAgICAgICB1c2luZyAoSW5mbGF0ZXIgaW5mID0gbmV3IEluZmxhdGVyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5mLkRhdGFBdmFpbGFibGUgKz0gbmV3IERhdGFBdmFpbGFibGVIYW5kbGVyKEREYXRhQXZhaWwpOwotICAgICAgICAgICAgICAgIGluZi5BZGQoKGJ5dGVbXSljb21wcmVzc2VkRGF0YS5Ub0FycmF5KHR5cGVvZihieXRlKSkpOwotICAgICAgICAgICAgICAgIGluZi5GaW5pc2goKTsKLSAgICAgICAgICAgICAgICBhZGxlcjIgPSBpbmYuQ2hlY2tzdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIGFkbGVyMSwgYWRsZXIyICk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgIH0KLQotICAgIFtUZXN0Rml4dHVyZV0KLSAgICBwdWJsaWMgY2xhc3MgR1ppcFN0cmVhbVRlc3RzCi0gICAgewotICAgICAgICAjcmVnaW9uIEdaaXBTdHJlYW0gdGVzdAotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgR1ppcFN0cmVhbV9Xcml0ZVJlYWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAoR1ppcFN0cmVhbSBnek91dCA9IG5ldyBHWmlwU3RyZWFtKCJnenN0cmVhbS5neiIsIENvbXByZXNzTGV2ZWwuQmVzdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQmluYXJ5V3JpdGVyIHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoZ3pPdXQpOwotICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgiaGkgdGhlcmUiKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoTWF0aC5QSSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKDQyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXNpbmcgKEdaaXBTdHJlYW0gZ3pJbiA9IG5ldyBHWmlwU3RyZWFtKCJnenN0cmVhbS5neiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJpbmFyeVJlYWRlciByZWFkZXIgPSBuZXcgQmluYXJ5UmVhZGVyKGd6SW4pOwotICAgICAgICAgICAgICAgIHN0cmluZyBzID0gcmVhZGVyLlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImhpIHRoZXJlIixzKTsKLSAgICAgICAgICAgICAgICBkb3VibGUgZCA9IHJlYWRlci5SZWFkRG91YmxlKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKE1hdGguUEksIGQpOwotICAgICAgICAgICAgICAgIGludCBpID0gcmVhZGVyLlJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MixpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQl9Ci19Ci0KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2RvdHpsaWIvTElDRU5TRV8xXzAudHh0IGIvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9MSUNFTlNFXzFfMC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyN2E1YmMuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9MSUNFTlNFXzFfMC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1Cb29zdCBTb2Z0d2FyZSBMaWNlbnNlIC0gVmVyc2lvbiAxLjAgLSBBdWd1c3QgMTd0aCwgMjAwMwotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24KLW9idGFpbmluZyBhIGNvcHkgb2YgdGhlIHNvZnR3YXJlIGFuZCBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBjb3ZlcmVkIGJ5Ci10aGlzIGxpY2Vuc2UgKHRoZSAiU29mdHdhcmUiKSB0byB1c2UsIHJlcHJvZHVjZSwgZGlzcGxheSwgZGlzdHJpYnV0ZSwKLWV4ZWN1dGUsIGFuZCB0cmFuc21pdCB0aGUgU29mdHdhcmUsIGFuZCB0byBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlCi1Tb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCB0aGlyZC1wYXJ0aWVzIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0bwotZG8gc28sIGFsbCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmc6Ci0KLVRoZSBjb3B5cmlnaHQgbm90aWNlcyBpbiB0aGUgU29mdHdhcmUgYW5kIHRoaXMgZW50aXJlIHN0YXRlbWVudCwgaW5jbHVkaW5nCi10aGUgYWJvdmUgbGljZW5zZSBncmFudCwgdGhpcyByZXN0cmljdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotbXVzdCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgYW5kCi1hbGwgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU29mdHdhcmUsIHVubGVzcyBzdWNoIGNvcGllcyBvciBkZXJpdmF0aXZlCi13b3JrcyBhcmUgc29sZWx5IGluIHRoZSBmb3JtIG9mIG1hY2hpbmUtZXhlY3V0YWJsZSBvYmplY3QgY29kZSBnZW5lcmF0ZWQgYnkKLWEgc291cmNlIGxhbmd1YWdlIHByb2Nlc3Nvci4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVAotU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIEFOWU9ORSBESVNUUklCVVRJTkcgVEhFIFNPRlRXQVJFIEJFIExJQUJMRQotRk9SIEFOWSBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi1BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKLURFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL3JlYWRtZS50eHQgYi9saWJzL3psaWIvY29udHJpYi9kb3R6bGliL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZGIzZDIuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvZG90emxpYi9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYSAuTmV0IHdyYXBwZXIgY2xhc3MgbGlicmFyeSBmb3IgdGhlIFpMaWIxLmRsbAotCi1UaGUgd3JhcHBlciBpbmNsdWRlcyBzdXBwb3J0IGZvciBpbmZsYXRpbmcvZGVmbGF0aW5nIG1lbW9yeSBidWZmZXJzLCAKLS5OZXQgc3RyZWFtaW5nIHdyYXBwZXJzIGZvciB0aGUgZ3ogc3RyZWFtcyBwYXJ0IG9mIHpsaWIsIGFuZCB3cmFwcGVycwotZm9yIHRoZSBjaGVja3N1bSBwYXJ0cyBvZiB6bGliLiBTZWUgRG90WkxpYi9Vbml0VGVzdHMuY3MgZm9yIGV4YW1wbGVzLgotCi1EaXJlY3Rvcnkgc3RydWN0dXJlOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTElDRU5TRV8xXzAudHh0ICAgICAgIC0gTGljZW5zZSBmaWxlLgotcmVhZG1lLnR4dCAgICAgICAgICAgIC0gVGhpcyBmaWxlLgotRG90WkxpYi5jaG0gICAgICAgICAgIC0gQ2xhc3MgbGlicmFyeSBkb2N1bWVudGF0aW9uCi1Eb3RaTGliLmJ1aWxkICAgICAgICAgLSBOQW50IGJ1aWxkIGZpbGUKLURvdFpMaWIuc2xuICAgICAgICAgICAtIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMDMgc29sdXRpb24gZmlsZQotCi1Eb3RaTGliXCouY3MgICAgICAgICAgLSBTb3VyY2UgZmlsZXMgZm9yIHRoZSBjbGFzcyBsaWJyYXJ5Ci0KLVVuaXQgdGVzdHM6Ci0tLS0tLS0tLS0tLQotVGhlIGZpbGUgRG90WkxpYi9Vbml0VGVzdHMuY3MgY29udGFpbnMgdW5pdCB0ZXN0cyBmb3IgdXNlIHdpdGggTlVuaXQgMi4xIG9yIGhpZ2hlci4KLVRvIGluY2x1ZGUgdW5pdCB0ZXN0cyBpbiB0aGUgYnVpbGQsIGRlZmluZSBudW5pdCBiZWZvcmUgYnVpbGRpbmcuCi0KLQotQnVpbGQgaW5zdHJ1Y3Rpb25zOgotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBVc2luZyBWaXN1YWwgU3R1ZGlvLk5ldCAyMDAzOgotICAgT3BlbiBEb3RaTGliLnNsbiBpbiBWUy5OZXQgYW5kIGJ1aWxkIGZyb20gdGhlcmUuIE91dHB1dCBmaWxlIChEb3RaTGliLmRsbCkKLSAgIHdpbGwgYmUgZm91bmQgLi9Eb3RaTGliL2Jpbi9yZWxlYXNlIG9yIC4vRG90WkxpYi9iaW4vZGVidWcsIGRlcGVuZGluZyBvbiAKLSAgIHlvdSBhcmUgYnVpbGRpbmcgdGhlIHJlbGVhc2Ugb3IgZGVidWcgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gQ2hlY2sgCi0gICBEb3RaTGliL1VuaXRUZXN0cy5jcyBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBpbmNsdWRlIHVuaXQgdGVzdHMgaW4gdGhlCi0gICBidWlsZC4KLSAgIAotMi4gVXNpbmcgTkFudDoKLSAgIE9wZW4gYSBjb21tYW5kIHByb21wdCB3aXRoIGFjY2VzcyB0byB0aGUgYnVpbGQgZW52aXJvbm1lbnQgYW5kIHJ1biBuYW50Ci0gICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIERvdFpMaWIuYnVpbGQgZmlsZS4KLSAgIFlvdSBjYW4gZGVmaW5lIDIgcHJvcGVydGllcyBvbiB0aGUgbmFudCBjb21tYW5kLWxpbmUgdG8gY29udHJvbCB0aGUgYnVpbGQ6Ci0gICBkZWJ1Zz17dHJ1ZXxmYWxzZX0gdG8gdG9nZ2xlIGJldHdlZW4gcmVsZWFzZS9kZWJ1ZyBidWlsZHMgKGRlZmF1bHQ9dHJ1ZSkuCi0gICBudW5pdD17dHJ1ZXxmYWxzZX0gdG8gaW5jbHVkZSBvciBlc2NsdWRlIHVuaXQgdGVzdHMgKGRlZmF1bHQ9dHJ1ZSkuCi0gICBBbHNvIHRoZSB0YXJnZXQgY2xlYW4gd2lsbCByZW1vdmUgYmluYXJpZXMuCi0gICBPdXRwdXQgZmlsZSAoRG90WkxpYi5kbGwpIHdpbGwgYmUgZm91bmQgaW4gZWl0aGVyIC4vRG90WkxpYi9iaW4vcmVsZWFzZSAKLSAgIG9yIC4vRG90WkxpYi9iaW4vZGVidWcsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBhcmUgYnVpbGRpbmcgdGhlIHJlbGVhc2UgCi0gICBvciBkZWJ1ZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gICBFeGFtcGxlczogCi0gICAgIG5hbnQgLUQ6ZGVidWc9ZmFsc2UgLUQ6bnVuaXQ9ZmFsc2UKLSAgICAgICB3aWxsIGJ1aWxkIGEgcmVsZWFzZSBtb2RlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgd2l0aG91dCB1bml0IHRlc3RzLgotICAgICBuYW50Ci0gICAgICAgd2lsbCBidWlsZCBhIGRlYnVnIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgd2l0aCB1bml0IHRlc3RzIAotICAgICBuYW50IGNsZWFuCi0gICAgICAgd2lsbCByZW1vdmUgYWxsIHByZXZpb3VzbHkgYnVpbHQgZmlsZXMuCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIEhlbnJpayBSYXZuIDIwMDQKLQotVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIAotKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9pbmZiYWNrOS9SRUFETUUgYi9saWJzL3psaWIvY29udHJpYi9pbmZiYWNrOS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWVkMTMuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvaW5mYmFjazkvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotU2VlIGluZmJhY2s5LmggZm9yIHdoYXQgdGhpcyBpcyBhbmQgaG93IHRvIHVzZSBpdC4KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmJhY2s5LmMgYi9saWJzL3psaWIvY29udHJpYi9pbmZiYWNrOS9pbmZiYWNrOS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWRkZGU2Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmJhY2s5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDggKzAsMCBAQAotLyogaW5mYmFjazkuYyAtLSBpbmZsYXRlIGRlZmxhdGU2NCBkYXRhIHVzaW5nIGEgY2FsbC1iYWNrIGludGVyZmFjZQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotI2luY2x1ZGUgImluZmJhY2s5LmgiCi0jaW5jbHVkZSAiaW5mdHJlZTkuaCIKLSNpbmNsdWRlICJpbmZsYXRlOS5oIgotCi0jZGVmaW5lIFdTSVpFIDY1NTM2VUwKLQotLyoKLSAgIHN0cm0gcHJvdmlkZXMgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGluIHphbGxvYyBhbmQgemZyZWUsIG9yCi0gICBaX05VTEwgdG8gdXNlIHRoZSBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KLQotICAgd2luZG93IGlzIGEgdXNlci1zdXBwbGllZCB3aW5kb3cgYW5kIG91dHB1dCBidWZmZXIgdGhhdCBpcyA2NEsgYnl0ZXMuCi0gKi8KLWludCBaRVhQT1JUIGluZmxhdGVCYWNrOUluaXRfKHN0cm0sIHdpbmRvdywgdmVyc2lvbiwgc3RyZWFtX3NpemUpCi16X3N0cmVhbSBGQVIgKnN0cm07Ci11bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OwotY29uc3QgY2hhciAqdmVyc2lvbjsKLWludCBzdHJlYW1fc2l6ZTsKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotCi0gICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gWkxJQl9WRVJTSU9OWzBdIHx8Ci0gICAgICAgIHN0cmVhbV9zaXplICE9IChpbnQpKHNpemVvZih6X3N0cmVhbSkpKQotICAgICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCB3aW5kb3cgPT0gWl9OVUxMKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KLSAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKLSAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKLSAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOwotICAgIH0KLSAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilaQUxMT0Moc3RybSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7Ci0gICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7Ci0gICAgc3RybS0+c3RhdGUgPSAodm9pZHBmKXN0YXRlOwotICAgIHN0YXRlLT53aW5kb3cgPSB3aW5kb3c7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qCi0gICBCdWlsZCBhbmQgb3V0cHV0IGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGZvciBmaXhlZCBjb2RlCi0gICBkZWNvZGluZy4KLSAqLwotI2lmZGVmIE1BS0VGSVhFRAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLXZvaWQgbWFrZWZpeGVkOSh2b2lkKQotewotICAgIHVuc2lnbmVkIHN5bSwgYml0cywgbG93LCBzaXplOwotICAgIGNvZGUgKm5leHQsICpsZW5maXgsICpkaXN0Zml4OwotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIHN0YXRlOwotICAgIGNvZGUgZml4ZWRbNTQ0XTsKLQotICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovCi0gICAgc3ltID0gMDsKLSAgICB3aGlsZSAoc3ltIDwgMTQ0KSBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7Ci0gICAgd2hpbGUgKHN5bSA8IDI1Nikgc3RhdGUubGVuc1tzeW0rK10gPSA5OwotICAgIHdoaWxlIChzeW0gPCAyODApIHN0YXRlLmxlbnNbc3ltKytdID0gNzsKLSAgICB3aGlsZSAoc3ltIDwgMjg4KSBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7Ci0gICAgbmV4dCA9IGZpeGVkOwotICAgIGxlbmZpeCA9IG5leHQ7Ci0gICAgYml0cyA9IDk7Ci0gICAgaW5mbGF0ZV90YWJsZTkoTEVOUywgc3RhdGUubGVucywgMjg4LCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS53b3JrKTsKLQotICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCi0gICAgc3ltID0gMDsKLSAgICB3aGlsZSAoc3ltIDwgMzIpIHN0YXRlLmxlbnNbc3ltKytdID0gNTsKLSAgICBkaXN0Zml4ID0gbmV4dDsKLSAgICBiaXRzID0gNTsKLSAgICBpbmZsYXRlX3RhYmxlOShESVNUUywgc3RhdGUubGVucywgMzIsICYobmV4dCksICYoYml0cyksIHN0YXRlLndvcmspOwotCi0gICAgLyogd3JpdGUgdGFibGVzICovCi0gICAgcHV0cygiICAgIC8qIGluZmZpeDkuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZGVmbGF0ZTY0IGZpeGVkIGNvZGVzIik7Ci0gICAgcHV0cygiICAgICAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1ha2VmaXhlZDkoKS4iKTsKLSAgICBwdXRzKCIgICAgICovIik7Ci0gICAgcHV0cygiIik7Ci0gICAgcHV0cygiICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIik7Ci0gICAgcHV0cygiICAgICAgIEl0IGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBhbmQgaXMiKTsKLSAgICBwdXRzKCIgICAgICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLiIpOwotICAgIHB1dHMoIiAgICAgKi8iKTsKLSAgICBwdXRzKCIiKTsKLSAgICBzaXplID0gMVUgPDwgOTsKLSAgICBwcmludGYoIiAgICBzdGF0aWMgY29uc3QgY29kZSBsZW5maXhbJXVdID0geyIsIHNpemUpOwotICAgIGxvdyA9IDA7Ci0gICAgZm9yICg7OykgewotICAgICAgICBpZiAoKGxvdyAlIDYpID09IDApIHByaW50ZigiXG4gICAgICAgICIpOwotICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCBsZW5maXhbbG93XS5vcCwgbGVuZml4W2xvd10uYml0cywKLSAgICAgICAgICAgICAgIGxlbmZpeFtsb3ddLnZhbCk7Ci0gICAgICAgIGlmICgrK2xvdyA9PSBzaXplKSBicmVhazsKLSAgICAgICAgcHV0Y2hhcignLCcpOwotICAgIH0KLSAgICBwdXRzKCJcbiAgICB9OyIpOwotICAgIHNpemUgPSAxVSA8PCA1OwotICAgIHByaW50ZigiXG4gICAgc3RhdGljIGNvbnN0IGNvZGUgZGlzdGZpeFsldV0gPSB7Iiwgc2l6ZSk7Ci0gICAgbG93ID0gMDsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmICgobG93ICUgNSkgPT0gMCkgcHJpbnRmKCJcbiAgICAgICAgIik7Ci0gICAgICAgIHByaW50ZigieyV1LCV1LCVkfSIsIGRpc3RmaXhbbG93XS5vcCwgZGlzdGZpeFtsb3ddLmJpdHMsCi0gICAgICAgICAgICAgICBkaXN0Zml4W2xvd10udmFsKTsKLSAgICAgICAgaWYgKCsrbG93ID09IHNpemUpIGJyZWFrOwotICAgICAgICBwdXRjaGFyKCcsJyk7Ci0gICAgfQotICAgIHB1dHMoIlxuICAgIH07Iik7Ci19Ci0jZW5kaWYgLyogTUFLRUZJWEVEICovCi0KLS8qIE1hY3JvcyBmb3IgaW5mbGF0ZUJhY2soKTogKi8KLQotLyogQ2xlYXIgdGhlIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBJTklUQklUUygpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaG9sZCA9IDA7IFwKLSAgICAgICAgYml0cyA9IDA7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBBc3N1cmUgdGhhdCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZS4gIElmIGlucHV0IGlzIHJlcXVlc3RlZCwgYnV0IGRlbmllZCwKLSAgIHRoZW4gcmV0dXJuIGEgWl9CVUZfRVJST1IgZnJvbSBpbmZsYXRlQmFjaygpLiAqLwotI2RlZmluZSBQVUxMKCkgXAotICAgIGRvIHsgXAotICAgICAgICBpZiAoaGF2ZSA9PSAwKSB7IFwKLSAgICAgICAgICAgIGhhdmUgPSBpbihpbl9kZXNjLCAmbmV4dCk7IFwKLSAgICAgICAgICAgIGlmIChoYXZlID09IDApIHsgXAotICAgICAgICAgICAgICAgIG5leHQgPSBaX05VTEw7IFwKLSAgICAgICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsgXAotICAgICAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOyBcCi0gICAgICAgICAgICB9IFwKLSAgICAgICAgfSBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogR2V0IGEgYnl0ZSBvZiBpbnB1dCBpbnRvIHRoZSBiaXQgYWNjdW11bGF0b3IsIG9yIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkKLSAgIHdpdGggYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAqLwotI2RlZmluZSBQVUxMQllURSgpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgUFVMTCgpOyBcCi0gICAgICAgIGhhdmUtLTsgXAotICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKSgqbmV4dCsrKSA8PCBiaXRzOyBcCi0gICAgICAgIGJpdHMgKz0gODsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIEFzc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBuIGJpdHMgaW4gdGhlIGJpdCBhY2N1bXVsYXRvci4gIElmIHRoZXJlIGlzCi0gICBub3QgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dCB0byBkbyB0aGF0LCB0aGVuIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkgd2l0aAotICAgYW4gZXJyb3IuICovCi0jZGVmaW5lIE5FRURCSVRTKG4pIFwKLSAgICBkbyB7IFwKLSAgICAgICAgd2hpbGUgKGJpdHMgPCAodW5zaWduZWQpKG4pKSBcCi0gICAgICAgICAgICBQVUxMQllURSgpOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogUmV0dXJuIHRoZSBsb3cgbiBiaXRzIG9mIHRoZSBiaXQgYWNjdW11bGF0b3IgKG4gPD0gMTYpICovCi0jZGVmaW5lIEJJVFMobikgXAotICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQotCi0vKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBEUk9QQklUUyhuKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhvbGQgPj49IChuKTsgXAotICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KLSNkZWZpbmUgQllURUJJVFMoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCi0gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBBc3N1cmUgdGhhdCBzb21lIG91dHB1dCBzcGFjZSBpcyBhdmFpbGFibGUsIGJ5IHdyaXRpbmcgb3V0IHRoZSB3aW5kb3cKLSAgIGlmIGl0J3MgZnVsbC4gIElmIHRoZSB3cml0ZSBmYWlscywgcmV0dXJuIGZyb20gaW5mbGF0ZUJhY2soKSB3aXRoIGEKLSAgIFpfQlVGX0VSUk9SLiAqLwotI2RlZmluZSBST09NKCkgXAotICAgIGRvIHsgXAotICAgICAgICBpZiAobGVmdCA9PSAwKSB7IFwKLSAgICAgICAgICAgIHB1dCA9IHdpbmRvdzsgXAotICAgICAgICAgICAgbGVmdCA9IFdTSVpFOyBcCi0gICAgICAgICAgICB3cmFwID0gMTsgXAotICAgICAgICAgICAgaWYgKG91dChvdXRfZGVzYywgcHV0LCAodW5zaWduZWQpbGVmdCkpIHsgXAotICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOyBcCi0gICAgICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICB9IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKgotICAgc3RybSBwcm92aWRlcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGFuZCB3aW5kb3cgYnVmZmVyIG9uIGlucHV0LAotICAgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSB1bnVzZWQgaW5wdXQgb24gcmV0dXJuLiAgRm9yIFpfREFUQV9FUlJPUgotICAgcmV0dXJucywgc3RybSB3aWxsIGFsc28gcHJvdmlkZSBhbiBlcnJvciBtZXNzYWdlLgotCi0gICBpbigpIGFuZCBvdXQoKSBhcmUgdGhlIGNhbGwtYmFjayBpbnB1dCBhbmQgb3V0cHV0IGZ1bmN0aW9ucy4gIFdoZW4KLSAgIGluZmxhdGVCYWNrKCkgbmVlZHMgbW9yZSBpbnB1dCwgaXQgY2FsbHMgaW4oKS4gIFdoZW4gaW5mbGF0ZUJhY2soKSBoYXMKLSAgIGZpbGxlZCB0aGUgd2luZG93IHdpdGggb3V0cHV0LCBvciB3aGVuIGl0IGNvbXBsZXRlcyB3aXRoIGRhdGEgaW4gdGhlCi0gICB3aW5kb3csIGl0IGNhbGxzIG91dCgpIHRvIHdyaXRlIG91dCB0aGUgZGF0YS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdAotICAgY2hhbmdlIHRoZSBwcm92aWRlZCBpbnB1dCB1bnRpbCBpbigpIGlzIGNhbGxlZCBhZ2FpbiBvciBpbmZsYXRlQmFjaygpCi0gICByZXR1cm5zLiAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGNoYW5nZSB0aGUgd2luZG93L291dHB1dCBidWZmZXIgdW50aWwKLSAgIGluZmxhdGVCYWNrKCkgcmV0dXJucy4KLQotICAgaW4oKSBhbmQgb3V0KCkgYXJlIGNhbGxlZCB3aXRoIGEgZGVzY3JpcHRvciBwYXJhbWV0ZXIgcHJvdmlkZWQgaW4gdGhlCi0gICBpbmZsYXRlQmFjaygpIGNhbGwuICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcyB0aGUKLSAgIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGRvIHRoZSByZWFkIG9yIHdyaXRlLCBhcyB3ZWxsIGFzIGFjY3VtdWxhdGVkCi0gICBpbmZvcm1hdGlvbiBvbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdWNoIGFzIHRvdGFscyBhbmQgY2hlY2sgdmFsdWVzLgotCi0gICBpbigpIHNob3VsZCByZXR1cm4gemVybyBvbiBmYWlsdXJlLiAgb3V0KCkgc2hvdWxkIHJldHVybiBub24temVybyBvbgotICAgZmFpbHVyZS4gIElmIGVpdGhlciBpbigpIG9yIG91dCgpIGZhaWxzLCB0aGFuIGluZmxhdGVCYWNrKCkgcmV0dXJucyBhCi0gICBaX0JVRl9FUlJPUi4gIHN0cm0tPm5leHRfaW4gY2FuIGJlIGNoZWNrZWQgZm9yIFpfTlVMTCB0byBzZWUgd2hldGhlciBpdAotICAgd2FzIGluKCkgb3Igb3V0KCkgdGhhdCBjYXVzZWQgaW4gdGhlIGVycm9yLiAgT3RoZXJ3aXNlLCAgaW5mbGF0ZUJhY2soKQotICAgcmV0dXJucyBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9EQVRBX0VSUk9SIGZvciBhbiBkZWZsYXRlIGZvcm1hdAotICAgZXJyb3IsIG9yIFpfTUVNX0VSUk9SIGlmIGl0IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdGF0ZS4KLSAgIGluZmxhdGVCYWNrKCkgY2FuIGFsc28gcmV0dXJuIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICBhcmUgbm90IGNvcnJlY3QsIGkuZS4gc3RybSBpcyBaX05VTEwgb3IgdGhlIHN0YXRlIHdhcyBub3QgaW5pdGlhbGl6ZWQuCi0gKi8KLWludCBaRVhQT1JUIGluZmxhdGVCYWNrOShzdHJtLCBpbiwgaW5fZGVzYywgb3V0LCBvdXRfZGVzYykKLXpfc3RyZWFtIEZBUiAqc3RybTsKLWluX2Z1bmMgaW47Ci12b2lkIEZBUiAqaW5fZGVzYzsKLW91dF9mdW5jIG91dDsKLXZvaWQgRkFSICpvdXRfZGVzYzsKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCi0gICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCi0gICAgdW5zaWduZWQgaGF2ZTsgICAgICAgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCAqLwotICAgIHVuc2lnbmVkIGxvbmcgbGVmdDsgICAgICAgICAvKiBhdmFpbGFibGUgb3V0cHV0ICovCi0gICAgaW5mbGF0ZV9tb2RlIG1vZGU7ICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCi0gICAgaW50IGxhc3RibG9jazsgICAgICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovCi0gICAgaW50IHdyYXA7ICAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgdGhlIHdpbmRvdyBoYXMgd3JhcHBlZCAqLwotICAgIHVuc2lnbmVkIGxvbmcgd3JpdGU7ICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OyAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogYml0IGJ1ZmZlciAqLwotICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLSAgICB1bnNpZ25lZCBleHRyYTsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsgICAgICAgLyogbGl0ZXJhbCBvciBsZW5ndGggb2YgZGF0YSB0byBjb3B5ICovCi0gICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7ICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqLwotICAgIHVuc2lnbmVkIGxvbmcgY29weTsgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCi0gICAgY29kZSBjb25zdCBGQVIgKmxlbmNvZGU7ICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqLwotICAgIGNvZGUgY29uc3QgRkFSICpkaXN0Y29kZTsgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi8KLSAgICB1bnNpZ25lZCBsZW5iaXRzOyAgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgbGVuY29kZSAqLwotICAgIHVuc2lnbmVkIGRpc3RiaXRzOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqLwotICAgIGNvZGUgdGhpczsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovCi0gICAgY29kZSBsYXN0OyAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YWJsZSBlbnRyeSAqLwotICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovCi0gICAgaW50IHJldDsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG9yZGVyWzE5XSA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqLwotICAgICAgICB7MTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07Ci0jaW5jbHVkZSAiaW5mZml4OS5oIgotCi0gICAgLyogQ2hlY2sgdGhhdCB0aGUgc3RybSBleGlzdHMgYW5kIHRoYXQgdGhlIHN0YXRlIHdhcyBpbml0aWFsaXplZCAqLwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLQotICAgIC8qIFJlc2V0IHRoZSBzdGF0ZSAqLwotICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKLSAgICBtb2RlID0gVFlQRTsKLSAgICBsYXN0YmxvY2sgPSAwOwotICAgIHdyaXRlID0gMDsKLSAgICB3cmFwID0gMDsKLSAgICB3aW5kb3cgPSBzdGF0ZS0+d2luZG93OwotICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOwotICAgIGhhdmUgPSBuZXh0ICE9IFpfTlVMTCA/IHN0cm0tPmF2YWlsX2luIDogMDsKLSAgICBob2xkID0gMDsKLSAgICBiaXRzID0gMDsKLSAgICBwdXQgPSB3aW5kb3c7Ci0gICAgbGVmdCA9IFdTSVpFOwotICAgIGxlbmNvZGUgPSBaX05VTEw7Ci0gICAgZGlzdGNvZGUgPSBaX05VTEw7Ci0KLSAgICAvKiBJbmZsYXRlIHVudGlsIGVuZCBvZiBibG9jayBtYXJrZWQgYXMgbGFzdCAqLwotICAgIGZvciAoOzspCi0gICAgICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIFRZUEU6Ci0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgYW5kIGRpc3BhdGNoIGJsb2NrIHR5cGUgKi8KLSAgICAgICAgICAgIGlmIChsYXN0YmxvY2spIHsKLSAgICAgICAgICAgICAgICBCWVRFQklUUygpOwotICAgICAgICAgICAgICAgIG1vZGUgPSBET05FOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTkVFREJJVFMoMyk7Ci0gICAgICAgICAgICBsYXN0YmxvY2sgPSBCSVRTKDEpOwotICAgICAgICAgICAgRFJPUEJJVFMoMSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKLSAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLwotICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGJsb2NrID8gIiAobGFzdCkiIDogIiIpKTsKLSAgICAgICAgICAgICAgICBtb2RlID0gU1RPUkVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICBsZW5jb2RlID0gbGVuZml4OwotICAgICAgICAgICAgICAgIGxlbmJpdHMgPSA5OwotICAgICAgICAgICAgICAgIGRpc3Rjb2RlID0gZGlzdGZpeDsKLSAgICAgICAgICAgICAgICBkaXN0Yml0cyA9IDU7Ci0gICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RibG9jayA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgICAgICAgbW9kZSA9IExFTjsgICAgICAgICAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0YmxvY2sgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgICAgICAgIG1vZGUgPSBUQUJMRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJsb2NrIHR5cGUiOwotICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEUk9QQklUUygyKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RPUkVEOgotICAgICAgICAgICAgLyogZ2V0IGFuZCB2ZXJpZnkgc3RvcmVkIGJsb2NrIGxlbmd0aCAqLwotICAgICAgICAgICAgQllURUJJVFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLwotICAgICAgICAgICAgTkVFREJJVFMoMzIpOwotICAgICAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPSAoKGhvbGQgPj4gMTYpIF4gMHhmZmZmKSkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOwotICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZW5ndGggPSAodW5zaWduZWQpaG9sZCAmIDB4ZmZmZjsKLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAlbHVcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCkpOwotICAgICAgICAgICAgSU5JVEJJVFMoKTsKLQotICAgICAgICAgICAgLyogY29weSBzdG9yZWQgYmxvY2sgZnJvbSBpbnB1dCB0byBvdXRwdXQgKi8KLSAgICAgICAgICAgIHdoaWxlIChsZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgIGNvcHkgPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgUFVMTCgpOwotICAgICAgICAgICAgICAgIFJPT00oKTsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIGNvcHkgPSBoYXZlOwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7Ci0gICAgICAgICAgICAgICAgem1lbWNweShwdXQsIG5leHQsIGNvcHkpOwotICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKLSAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7Ci0gICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OwotICAgICAgICAgICAgICAgIHB1dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBjb3B5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXG4iKSk7Ci0gICAgICAgICAgICBtb2RlID0gVFlQRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVEFCTEU6Ci0gICAgICAgICAgICAvKiBnZXQgZHluYW1pYyB0YWJsZSBlbnRyaWVzIGRlc2NyaXB0b3IgKi8KLSAgICAgICAgICAgIE5FRURCSVRTKDE0KTsKLSAgICAgICAgICAgIHN0YXRlLT5ubGVuID0gQklUUyg1KSArIDI1NzsKLSAgICAgICAgICAgIERST1BCSVRTKDUpOwotICAgICAgICAgICAgc3RhdGUtPm5kaXN0ID0gQklUUyg1KSArIDE7Ci0gICAgICAgICAgICBEUk9QQklUUyg1KTsKLSAgICAgICAgICAgIHN0YXRlLT5uY29kZSA9IEJJVFMoNCkgKyA0OwotICAgICAgICAgICAgRFJPUEJJVFMoNCk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPm5sZW4gPiAyODYpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ0b28gbWFueSBsZW5ndGggc3ltYm9scyI7Ci0gICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKLQotICAgICAgICAgICAgLyogZ2V0IGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAobm90IGEgdHlwbykgKi8KLSAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5uY29kZSkgewotICAgICAgICAgICAgICAgIE5FRURCSVRTKDMpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9ICh1bnNpZ25lZCBzaG9ydClCSVRTKDMpOwotICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgMTkpCi0gICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gMDsKLSAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOwotICAgICAgICAgICAgbGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7Ci0gICAgICAgICAgICBsZW5iaXRzID0gNzsKLSAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGU5KENPREVTLCBzdGF0ZS0+bGVucywgMTksICYoc3RhdGUtPm5leHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGxlbmJpdHMpLCBzdGF0ZS0+d29yayk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKLSAgICAgICAgICAgICAgICBtb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcbiIpKTsKLQotICAgICAgICAgICAgLyogZ2V0IGxlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICB0aGlzID0gbGVuY29kZVtCSVRTKGxlbmJpdHMpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsIDwgMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUrK10gPSB0aGlzLnZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbCA9PSAxNikgewotICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzICsgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKShzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFsID09IDE3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyA3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgQklUUyg3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSArIGNvcHkgPiBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KLSAgICAgICAgICAgIGlmIChtb2RlID09IEJBRCkgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzICovCi0gICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKLSAgICAgICAgICAgIGxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOwotICAgICAgICAgICAgbGVuYml0cyA9IDk7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlOShMRU5TLCBzdGF0ZS0+bGVucywgc3RhdGUtPm5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bmV4dCksICYobGVuYml0cyksIHN0YXRlLT53b3JrKTsKLSAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOwotICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaXN0Y29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7Ci0gICAgICAgICAgICBkaXN0Yml0cyA9IDY7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlOShESVNUUywgc3RhdGUtPmxlbnMgKyBzdGF0ZS0+bmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bmRpc3QsICYoc3RhdGUtPm5leHQpLCAmKGRpc3RiaXRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+d29yayk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZXMgc2V0IjsKLSAgICAgICAgICAgICAgICBtb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBva1xuIikpOwotICAgICAgICAgICAgbW9kZSA9IExFTjsKLQotICAgICAgICBjYXNlIExFTjoKLSAgICAgICAgICAgIC8qIGdldCBhIGxpdGVyYWwsIGxlbmd0aCwgb3IgZW5kLW9mLWJsb2NrIGNvZGUgKi8KLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICB0aGlzID0gbGVuY29kZVtCSVRTKGxlbmJpdHMpXTsKLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5vcCAmJiAodGhpcy5vcCAmIDB4ZjApID09IDApIHsKLSAgICAgICAgICAgICAgICBsYXN0ID0gdGhpczsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMgPSBsZW5jb2RlW2xhc3QudmFsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgdGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICBsZW5ndGggPSAodW5zaWduZWQpdGhpcy52YWw7Ci0KLSAgICAgICAgICAgIC8qIHByb2Nlc3MgbGl0ZXJhbCAqLwotICAgICAgICAgICAgaWYgKHRoaXMub3AgPT0gMCkgewotICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgdGhpcy52YWwgPj0gMHgyMCAmJiB0aGlzLnZhbCA8IDB4N2YgPwotICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCB0aGlzLnZhbCkpOwotICAgICAgICAgICAgICAgIFJPT00oKTsKLSAgICAgICAgICAgICAgICAqcHV0KysgPSAodW5zaWduZWQgY2hhcikobGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBsZWZ0LS07Ci0gICAgICAgICAgICAgICAgbW9kZSA9IExFTjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogcHJvY2VzcyBlbmQgb2YgYmxvY2sgKi8KLSAgICAgICAgICAgIGlmICh0aGlzLm9wICYgMzIpIHsKLSAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOwotICAgICAgICAgICAgICAgIG1vZGUgPSBUWVBFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgKi8KLSAgICAgICAgICAgIGlmICh0aGlzLm9wICYgNjQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwotICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGxlbmd0aCBjb2RlIC0tIGdldCBleHRyYSBiaXRzLCBpZiBhbnkgKi8KLSAgICAgICAgICAgIGV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDMxOwotICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUyhleHRyYSk7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IEJJVFMoZXh0cmEpOwotICAgICAgICAgICAgICAgIERST1BCSVRTKGV4dHJhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICVsdVxuIiwgbGVuZ3RoKSk7Ci0KLSAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSBjb2RlICovCi0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgdGhpcyA9IGRpc3Rjb2RlW0JJVFMoZGlzdGJpdHMpXTsKLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHRoaXMub3AgJiAweGYwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IHRoaXM7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICB0aGlzID0gZGlzdGNvZGVbbGFzdC52YWwgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyB0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKLSAgICAgICAgICAgIGlmICh0aGlzLm9wICYgNjQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgPSAodW5zaWduZWQpdGhpcy52YWw7Ci0KLSAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSBleHRyYSBiaXRzLCBpZiBhbnkgKi8KLSAgICAgICAgICAgIGV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OwotICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUyhleHRyYSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IEJJVFMoZXh0cmEpOwotICAgICAgICAgICAgICAgIERST1BCSVRTKGV4dHJhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiBXU0laRSAtICh3cmFwID8gMDogbGVmdCkpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7Ci0gICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJWx1XG4iLCBvZmZzZXQpKTsKLQotICAgICAgICAgICAgLyogY29weSBtYXRjaCBmcm9tIHdpbmRvdyB0byBvdXRwdXQgKi8KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBST09NKCk7Ci0gICAgICAgICAgICAgICAgY29weSA9IFdTSVpFIC0gb2Zmc2V0OwotICAgICAgICAgICAgICAgIGlmIChjb3B5IDwgbGVmdCkgewotICAgICAgICAgICAgICAgICAgICBmcm9tID0gcHV0ICsgY29weTsKLSAgICAgICAgICAgICAgICAgICAgY29weSA9IGxlZnQgLSBjb3B5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgY29weSA9IGxlZnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVuZ3RoKSBjb3B5ID0gbGVuZ3RoOwotICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBjb3B5OwotICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICpwdXQrKyA9ICpmcm9tKys7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKLSAgICAgICAgICAgIH0gd2hpbGUgKGxlbmd0aCAhPSAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRE9ORToKLSAgICAgICAgICAgIC8qIGluZmxhdGUgc3RyZWFtIHRlcm1pbmF0ZWQgcHJvcGVybHkgLS0gd3JpdGUgbGVmdG92ZXIgb3V0cHV0ICovCi0gICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7Ci0gICAgICAgICAgICBpZiAobGVmdCA8IFdTSVpFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dChvdXRfZGVzYywgd2luZG93LCAodW5zaWduZWQpKFdTSVpFIC0gbGVmdCkpKQotICAgICAgICAgICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotCi0gICAgICAgIGNhc2UgQkFEOgotICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOwotICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7Ci0KLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgLyogY2FuJ3QgaGFwcGVuLCBidXQgbWFrZXMgY29tcGlsZXJzIGhhcHB5ICovCi0gICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FUlJPUjsKLSAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICB9Ci0KLSAgICAvKiBSZXR1cm4gdW51c2VkIGlucHV0ICovCi0gIGluZl9sZWF2ZToKLSAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsKLSAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2s5RW5kKHN0cm0pCi16X3N0cmVhbSBGQVIgKnN0cm07Ci17Ci0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBaRlJFRShzdHJtLCBzdHJtLT5zdGF0ZSk7Ci0gICAgc3RybS0+c3RhdGUgPSBaX05VTEw7Ci0gICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBlbmRcbiIpKTsKLSAgICByZXR1cm4gWl9PSzsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmJhY2s5LmggYi9saWJzL3psaWIvY29udHJpYi9pbmZiYWNrOS9pbmZiYWNrOS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDczYzBhLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmJhY2s5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBpbmZiYWNrOS5oIC0tIGhlYWRlciBmb3IgdXNpbmcgaW5mbGF0ZUJhY2s5IGZ1bmN0aW9ucwotICogQ29weXJpZ2h0IChDKSAyMDAzIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKgotICogVGhpcyBoZWFkZXIgZmlsZSBhbmQgYXNzb2NpYXRlZCBwYXRjaGVzIHByb3ZpZGUgYSBkZWNvZGVyIGZvciBQS1dhcmUncwotICogdW5kb2N1bWVudGVkIGRlZmxhdGU2NCBjb21wcmVzc2lvbiBtZXRob2QgKG1ldGhvZCA5KS4gIFVzZSB3aXRoIGluZmJhY2s5LmMsCi0gKiBpbmZ0cmVlOS5oLCBpbmZ0cmVlOS5jLCBhbmQgaW5mZml4OS5oLiAgVGhlc2UgcGF0Y2hlcyBhcmUgbm90IHN1cHBvcnRlZC4KLSAqIFRoaXMgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGggemxpYiwgc2luY2UgaXQgdXNlcyB6dXRpbC5oIGFuZCB6dXRpbC5vLgotICogVGhpcyBjb2RlIGhhcyBub3QgeWV0IGJlZW4gdGVzdGVkIG9uIDE2LWJpdCBhcmNoaXRlY3R1cmVzLiAgU2VlIHRoZQotICogY29tbWVudHMgaW4gemxpYi5oIGZvciBpbmZsYXRlQmFjaygpIHVzYWdlLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkCi0gKiBpZGVudGljYWxseSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gd2luZG93Qml0cyBwYXJhbWV0ZXIsIGFuZCBhIDY0SwotICogd2luZG93IG11c3QgYmUgcHJvdmlkZWQuICBBbHNvIGlmIGludCdzIGFyZSAxNiBiaXRzLCB0aGVuIGEgemVybyBmb3IKLSAqIHRoZSB0aGlyZCBwYXJhbWV0ZXIgb2YgdGhlICJvdXQiIGZ1bmN0aW9uIGFjdHVhbGx5IG1lYW5zIDY1NTM2VUwuCi0gKiB6bGliLmggbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgdGhpcyBoZWFkZXIgZmlsZS4KLSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2s5IE9GKCh6X3N0cmVhbSBGQVIgKnN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9mdW5jIGluLCB2b2lkIEZBUiAqaW5fZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9mdW5jIG91dCwgdm9pZCBGQVIgKm91dF9kZXNjKSk7Ci1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrOUVuZCBPRigoel9zdHJlYW0gRkFSICpzdHJtKSk7Ci1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrOUluaXRfIE9GKCh6X3N0cmVhbSBGQVIgKnN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOwotI2RlZmluZSBpbmZsYXRlQmFjazlJbml0KHN0cm0sIHdpbmRvdykgXAotICAgICAgICBpbmZsYXRlQmFjazlJbml0Xygoc3RybSksICh3aW5kb3cpLCBcCi0gICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmZpeDkuaCBiL2xpYnMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmZpeDkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU1NjcxZC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9pbmZiYWNrOS9pbmZmaXg5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotICAgIC8qIGluZmZpeDkuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZGVmbGF0ZTY0IGZpeGVkIGNvZGVzCi0gICAgICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFrZWZpeGVkOSgpLgotICAgICAqLwotCi0gICAgLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICBJdCBpcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGxpYnJhcnkgYW5kIGlzCi0gICAgICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICAgICAqLwotCi0gICAgc3RhdGljIGNvbnN0IGNvZGUgbGVuZml4WzUxMl0gPSB7Ci0gICAgICAgIHs5Niw3LDB9LHswLDgsODB9LHswLDgsMTZ9LHsxMzIsOCwxMTV9LHsxMzAsNywzMX0sezAsOCwxMTJ9LAotICAgICAgICB7MCw4LDQ4fSx7MCw5LDE5Mn0sezEyOCw3LDEwfSx7MCw4LDk2fSx7MCw4LDMyfSx7MCw5LDE2MH0sCi0gICAgICAgIHswLDgsMH0sezAsOCwxMjh9LHswLDgsNjR9LHswLDksMjI0fSx7MTI4LDcsNn0sezAsOCw4OH0sCi0gICAgICAgIHswLDgsMjR9LHswLDksMTQ0fSx7MTMxLDcsNTl9LHswLDgsMTIwfSx7MCw4LDU2fSx7MCw5LDIwOH0sCi0gICAgICAgIHsxMjksNywxN30sezAsOCwxMDR9LHswLDgsNDB9LHswLDksMTc2fSx7MCw4LDh9LHswLDgsMTM2fSwKLSAgICAgICAgezAsOCw3Mn0sezAsOSwyNDB9LHsxMjgsNyw0fSx7MCw4LDg0fSx7MCw4LDIwfSx7MTMzLDgsMjI3fSwKLSAgICAgICAgezEzMSw3LDQzfSx7MCw4LDExNn0sezAsOCw1Mn0sezAsOSwyMDB9LHsxMjksNywxM30sezAsOCwxMDB9LAotICAgICAgICB7MCw4LDM2fSx7MCw5LDE2OH0sezAsOCw0fSx7MCw4LDEzMn0sezAsOCw2OH0sezAsOSwyMzJ9LAotICAgICAgICB7MTI4LDcsOH0sezAsOCw5Mn0sezAsOCwyOH0sezAsOSwxNTJ9LHsxMzIsNyw4M30sezAsOCwxMjR9LAotICAgICAgICB7MCw4LDYwfSx7MCw5LDIxNn0sezEzMCw3LDIzfSx7MCw4LDEwOH0sezAsOCw0NH0sezAsOSwxODR9LAotICAgICAgICB7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sezAsOSwyNDh9LHsxMjgsNywzfSx7MCw4LDgyfSwKLSAgICAgICAgezAsOCwxOH0sezEzMyw4LDE2M30sezEzMSw3LDM1fSx7MCw4LDExNH0sezAsOCw1MH0sezAsOSwxOTZ9LAotICAgICAgICB7MTI5LDcsMTF9LHswLDgsOTh9LHswLDgsMzR9LHswLDksMTY0fSx7MCw4LDJ9LHswLDgsMTMwfSwKLSAgICAgICAgezAsOCw2Nn0sezAsOSwyMjh9LHsxMjgsNyw3fSx7MCw4LDkwfSx7MCw4LDI2fSx7MCw5LDE0OH0sCi0gICAgICAgIHsxMzIsNyw2N30sezAsOCwxMjJ9LHswLDgsNTh9LHswLDksMjEyfSx7MTMwLDcsMTl9LHswLDgsMTA2fSwKLSAgICAgICAgezAsOCw0Mn0sezAsOSwxODB9LHswLDgsMTB9LHswLDgsMTM4fSx7MCw4LDc0fSx7MCw5LDI0NH0sCi0gICAgICAgIHsxMjgsNyw1fSx7MCw4LDg2fSx7MCw4LDIyfSx7NjUsOCwwfSx7MTMxLDcsNTF9LHswLDgsMTE4fSwKLSAgICAgICAgezAsOCw1NH0sezAsOSwyMDR9LHsxMjksNywxNX0sezAsOCwxMDJ9LHswLDgsMzh9LHswLDksMTcyfSwKLSAgICAgICAgezAsOCw2fSx7MCw4LDEzNH0sezAsOCw3MH0sezAsOSwyMzZ9LHsxMjgsNyw5fSx7MCw4LDk0fSwKLSAgICAgICAgezAsOCwzMH0sezAsOSwxNTZ9LHsxMzIsNyw5OX0sezAsOCwxMjZ9LHswLDgsNjJ9LHswLDksMjIwfSwKLSAgICAgICAgezEzMCw3LDI3fSx7MCw4LDExMH0sezAsOCw0Nn0sezAsOSwxODh9LHswLDgsMTR9LHswLDgsMTQyfSwKLSAgICAgICAgezAsOCw3OH0sezAsOSwyNTJ9LHs5Niw3LDB9LHswLDgsODF9LHswLDgsMTd9LHsxMzMsOCwxMzF9LAotICAgICAgICB7MTMwLDcsMzF9LHswLDgsMTEzfSx7MCw4LDQ5fSx7MCw5LDE5NH0sezEyOCw3LDEwfSx7MCw4LDk3fSwKLSAgICAgICAgezAsOCwzM30sezAsOSwxNjJ9LHswLDgsMX0sezAsOCwxMjl9LHswLDgsNjV9LHswLDksMjI2fSwKLSAgICAgICAgezEyOCw3LDZ9LHswLDgsODl9LHswLDgsMjV9LHswLDksMTQ2fSx7MTMxLDcsNTl9LHswLDgsMTIxfSwKLSAgICAgICAgezAsOCw1N30sezAsOSwyMTB9LHsxMjksNywxN30sezAsOCwxMDV9LHswLDgsNDF9LHswLDksMTc4fSwKLSAgICAgICAgezAsOCw5fSx7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDJ9LHsxMjgsNyw0fSx7MCw4LDg1fSwKLSAgICAgICAgezAsOCwyMX0sezE0NCw4LDN9LHsxMzEsNyw0M30sezAsOCwxMTd9LHswLDgsNTN9LHswLDksMjAyfSwKLSAgICAgICAgezEyOSw3LDEzfSx7MCw4LDEwMX0sezAsOCwzN30sezAsOSwxNzB9LHswLDgsNX0sezAsOCwxMzN9LAotICAgICAgICB7MCw4LDY5fSx7MCw5LDIzNH0sezEyOCw3LDh9LHswLDgsOTN9LHswLDgsMjl9LHswLDksMTU0fSwKLSAgICAgICAgezEzMiw3LDgzfSx7MCw4LDEyNX0sezAsOCw2MX0sezAsOSwyMTh9LHsxMzAsNywyM30sezAsOCwxMDl9LAotICAgICAgICB7MCw4LDQ1fSx7MCw5LDE4Nn0sezAsOCwxM30sezAsOCwxNDF9LHswLDgsNzd9LHswLDksMjUwfSwKLSAgICAgICAgezEyOCw3LDN9LHswLDgsODN9LHswLDgsMTl9LHsxMzMsOCwxOTV9LHsxMzEsNywzNX0sezAsOCwxMTV9LAotICAgICAgICB7MCw4LDUxfSx7MCw5LDE5OH0sezEyOSw3LDExfSx7MCw4LDk5fSx7MCw4LDM1fSx7MCw5LDE2Nn0sCi0gICAgICAgIHswLDgsM30sezAsOCwxMzF9LHswLDgsNjd9LHswLDksMjMwfSx7MTI4LDcsN30sezAsOCw5MX0sCi0gICAgICAgIHswLDgsMjd9LHswLDksMTUwfSx7MTMyLDcsNjd9LHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNH0sCi0gICAgICAgIHsxMzAsNywxOX0sezAsOCwxMDd9LHswLDgsNDN9LHswLDksMTgyfSx7MCw4LDExfSx7MCw4LDEzOX0sCi0gICAgICAgIHswLDgsNzV9LHswLDksMjQ2fSx7MTI4LDcsNX0sezAsOCw4N30sezAsOCwyM30sezc3LDgsMH0sCi0gICAgICAgIHsxMzEsNyw1MX0sezAsOCwxMTl9LHswLDgsNTV9LHswLDksMjA2fSx7MTI5LDcsMTV9LHswLDgsMTAzfSwKLSAgICAgICAgezAsOCwzOX0sezAsOSwxNzR9LHswLDgsN30sezAsOCwxMzV9LHswLDgsNzF9LHswLDksMjM4fSwKLSAgICAgICAgezEyOCw3LDl9LHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU4fSx7MTMyLDcsOTl9LHswLDgsMTI3fSwKLSAgICAgICAgezAsOCw2M30sezAsOSwyMjJ9LHsxMzAsNywyN30sezAsOCwxMTF9LHswLDgsNDd9LHswLDksMTkwfSwKLSAgICAgICAgezAsOCwxNX0sezAsOCwxNDN9LHswLDgsNzl9LHswLDksMjU0fSx7OTYsNywwfSx7MCw4LDgwfSwKLSAgICAgICAgezAsOCwxNn0sezEzMiw4LDExNX0sezEzMCw3LDMxfSx7MCw4LDExMn0sezAsOCw0OH0sezAsOSwxOTN9LAotICAgICAgICB7MTI4LDcsMTB9LHswLDgsOTZ9LHswLDgsMzJ9LHswLDksMTYxfSx7MCw4LDB9LHswLDgsMTI4fSwKLSAgICAgICAgezAsOCw2NH0sezAsOSwyMjV9LHsxMjgsNyw2fSx7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NX0sCi0gICAgICAgIHsxMzEsNyw1OX0sezAsOCwxMjB9LHswLDgsNTZ9LHswLDksMjA5fSx7MTI5LDcsMTd9LHswLDgsMTA0fSwKLSAgICAgICAgezAsOCw0MH0sezAsOSwxNzd9LHswLDgsOH0sezAsOCwxMzZ9LHswLDgsNzJ9LHswLDksMjQxfSwKLSAgICAgICAgezEyOCw3LDR9LHswLDgsODR9LHswLDgsMjB9LHsxMzMsOCwyMjd9LHsxMzEsNyw0M30sezAsOCwxMTZ9LAotICAgICAgICB7MCw4LDUyfSx7MCw5LDIwMX0sezEyOSw3LDEzfSx7MCw4LDEwMH0sezAsOCwzNn0sezAsOSwxNjl9LAotICAgICAgICB7MCw4LDR9LHswLDgsMTMyfSx7MCw4LDY4fSx7MCw5LDIzM30sezEyOCw3LDh9LHswLDgsOTJ9LAotICAgICAgICB7MCw4LDI4fSx7MCw5LDE1M30sezEzMiw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTd9LAotICAgICAgICB7MTMwLDcsMjN9LHswLDgsMTA4fSx7MCw4LDQ0fSx7MCw5LDE4NX0sezAsOCwxMn0sezAsOCwxNDB9LAotICAgICAgICB7MCw4LDc2fSx7MCw5LDI0OX0sezEyOCw3LDN9LHswLDgsODJ9LHswLDgsMTh9LHsxMzMsOCwxNjN9LAotICAgICAgICB7MTMxLDcsMzV9LHswLDgsMTE0fSx7MCw4LDUwfSx7MCw5LDE5N30sezEyOSw3LDExfSx7MCw4LDk4fSwKLSAgICAgICAgezAsOCwzNH0sezAsOSwxNjV9LHswLDgsMn0sezAsOCwxMzB9LHswLDgsNjZ9LHswLDksMjI5fSwKLSAgICAgICAgezEyOCw3LDd9LHswLDgsOTB9LHswLDgsMjZ9LHswLDksMTQ5fSx7MTMyLDcsNjd9LHswLDgsMTIyfSwKLSAgICAgICAgezAsOCw1OH0sezAsOSwyMTN9LHsxMzAsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LHswLDksMTgxfSwKLSAgICAgICAgezAsOCwxMH0sezAsOCwxMzh9LHswLDgsNzR9LHswLDksMjQ1fSx7MTI4LDcsNX0sezAsOCw4Nn0sCi0gICAgICAgIHswLDgsMjJ9LHs2NSw4LDB9LHsxMzEsNyw1MX0sezAsOCwxMTh9LHswLDgsNTR9LHswLDksMjA1fSwKLSAgICAgICAgezEyOSw3LDE1fSx7MCw4LDEwMn0sezAsOCwzOH0sezAsOSwxNzN9LHswLDgsNn0sezAsOCwxMzR9LAotICAgICAgICB7MCw4LDcwfSx7MCw5LDIzN30sezEyOCw3LDl9LHswLDgsOTR9LHswLDgsMzB9LHswLDksMTU3fSwKLSAgICAgICAgezEzMiw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sezAsOSwyMjF9LHsxMzAsNywyN30sezAsOCwxMTB9LAotICAgICAgICB7MCw4LDQ2fSx7MCw5LDE4OX0sezAsOCwxNH0sezAsOCwxNDJ9LHswLDgsNzh9LHswLDksMjUzfSwKLSAgICAgICAgezk2LDcsMH0sezAsOCw4MX0sezAsOCwxN30sezEzMyw4LDEzMX0sezEzMCw3LDMxfSx7MCw4LDExM30sCi0gICAgICAgIHswLDgsNDl9LHswLDksMTk1fSx7MTI4LDcsMTB9LHswLDgsOTd9LHswLDgsMzN9LHswLDksMTYzfSwKLSAgICAgICAgezAsOCwxfSx7MCw4LDEyOX0sezAsOCw2NX0sezAsOSwyMjd9LHsxMjgsNyw2fSx7MCw4LDg5fSwKLSAgICAgICAgezAsOCwyNX0sezAsOSwxNDd9LHsxMzEsNyw1OX0sezAsOCwxMjF9LHswLDgsNTd9LHswLDksMjExfSwKLSAgICAgICAgezEyOSw3LDE3fSx7MCw4LDEwNX0sezAsOCw0MX0sezAsOSwxNzl9LHswLDgsOX0sezAsOCwxMzd9LAotICAgICAgICB7MCw4LDczfSx7MCw5LDI0M30sezEyOCw3LDR9LHswLDgsODV9LHswLDgsMjF9LHsxNDQsOCwzfSwKLSAgICAgICAgezEzMSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDN9LHsxMjksNywxM30sezAsOCwxMDF9LAotICAgICAgICB7MCw4LDM3fSx7MCw5LDE3MX0sezAsOCw1fSx7MCw4LDEzM30sezAsOCw2OX0sezAsOSwyMzV9LAotICAgICAgICB7MTI4LDcsOH0sezAsOCw5M30sezAsOCwyOX0sezAsOSwxNTV9LHsxMzIsNyw4M30sezAsOCwxMjV9LAotICAgICAgICB7MCw4LDYxfSx7MCw5LDIxOX0sezEzMCw3LDIzfSx7MCw4LDEwOX0sezAsOCw0NX0sezAsOSwxODd9LAotICAgICAgICB7MCw4LDEzfSx7MCw4LDE0MX0sezAsOCw3N30sezAsOSwyNTF9LHsxMjgsNywzfSx7MCw4LDgzfSwKLSAgICAgICAgezAsOCwxOX0sezEzMyw4LDE5NX0sezEzMSw3LDM1fSx7MCw4LDExNX0sezAsOCw1MX0sezAsOSwxOTl9LAotICAgICAgICB7MTI5LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LHswLDksMTY3fSx7MCw4LDN9LHswLDgsMTMxfSwKLSAgICAgICAgezAsOCw2N30sezAsOSwyMzF9LHsxMjgsNyw3fSx7MCw4LDkxfSx7MCw4LDI3fSx7MCw5LDE1MX0sCi0gICAgICAgIHsxMzIsNyw2N30sezAsOCwxMjN9LHswLDgsNTl9LHswLDksMjE1fSx7MTMwLDcsMTl9LHswLDgsMTA3fSwKLSAgICAgICAgezAsOCw0M30sezAsOSwxODN9LHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0N30sCi0gICAgICAgIHsxMjgsNyw1fSx7MCw4LDg3fSx7MCw4LDIzfSx7NzcsOCwwfSx7MTMxLDcsNTF9LHswLDgsMTE5fSwKLSAgICAgICAgezAsOCw1NX0sezAsOSwyMDd9LHsxMjksNywxNX0sezAsOCwxMDN9LHswLDgsMzl9LHswLDksMTc1fSwKLSAgICAgICAgezAsOCw3fSx7MCw4LDEzNX0sezAsOCw3MX0sezAsOSwyMzl9LHsxMjgsNyw5fSx7MCw4LDk1fSwKLSAgICAgICAgezAsOCwzMX0sezAsOSwxNTl9LHsxMzIsNyw5OX0sezAsOCwxMjd9LHswLDgsNjN9LHswLDksMjIzfSwKLSAgICAgICAgezEzMCw3LDI3fSx7MCw4LDExMX0sezAsOCw0N30sezAsOSwxOTF9LHswLDgsMTV9LHswLDgsMTQzfSwKLSAgICAgICAgezAsOCw3OX0sezAsOSwyNTV9Ci0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBjb2RlIGRpc3RmaXhbMzJdID0gewotICAgICAgICB7MTI4LDUsMX0sezEzNSw1LDI1N30sezEzMSw1LDE3fSx7MTM5LDUsNDA5N30sezEyOSw1LDV9LAotICAgICAgICB7MTM3LDUsMTAyNX0sezEzMyw1LDY1fSx7MTQxLDUsMTYzODV9LHsxMjgsNSwzfSx7MTM2LDUsNTEzfSwKLSAgICAgICAgezEzMiw1LDMzfSx7MTQwLDUsODE5M30sezEzMCw1LDl9LHsxMzgsNSwyMDQ5fSx7MTM0LDUsMTI5fSwKLSAgICAgICAgezE0Miw1LDMyNzY5fSx7MTI4LDUsMn0sezEzNSw1LDM4NX0sezEzMSw1LDI1fSx7MTM5LDUsNjE0NX0sCi0gICAgICAgIHsxMjksNSw3fSx7MTM3LDUsMTUzN30sezEzMyw1LDk3fSx7MTQxLDUsMjQ1Nzd9LHsxMjgsNSw0fSwKLSAgICAgICAgezEzNiw1LDc2OX0sezEzMiw1LDQ5fSx7MTQwLDUsMTIyODl9LHsxMzAsNSwxM30sezEzOCw1LDMwNzN9LAotICAgICAgICB7MTM0LDUsMTkzfSx7MTQyLDUsNDkxNTN9Ci0gICAgfTsKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmxhdGU5LmggYi9saWJzL3psaWIvY29udHJpYi9pbmZiYWNrOS9pbmZsYXRlOS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTlhNzkzLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2luZmJhY2s5L2luZmxhdGU5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBpbmZsYXRlOS5oIC0tIGludGVybmFsIGluZmxhdGUgc3RhdGUgZGVmaW5pdGlvbgotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi0vKiBQb3NzaWJsZSBpbmZsYXRlIG1vZGVzIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzICovCi10eXBlZGVmIGVudW0gewotICAgICAgICBUWVBFLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovCi0gICAgICAgIFNUT1JFRCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovCi0gICAgICAgIFRBQkxFLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqLwotICAgICAgICAgICAgTEVOLCAgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdCBjb2RlICovCi0gICAgRE9ORSwgICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KLSAgICBCQUQgICAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCi19IGluZmxhdGVfbW9kZTsKLQotLyoKLSAgICBTdGF0ZSB0cmFuc2l0aW9ucyBiZXR3ZWVuIGFib3ZlIG1vZGVzIC0KLQotICAgIChtb3N0IG1vZGVzIGNhbiBnbyB0byB0aGUgQkFEIG1vZGUgLS0gbm90IHNob3duIGZvciBjbGFyaXR5KQotCi0gICAgUmVhZCBkZWZsYXRlIGJsb2NrczoKLSAgICAgICAgICAgIFRZUEUgLT4gU1RPUkVEIG9yIFRBQkxFIG9yIExFTiBvciBET05FCi0gICAgICAgICAgICBTVE9SRUQgLT4gVFlQRQotICAgICAgICAgICAgVEFCTEUgLT4gTEVOTEVOUyAtPiBDT0RFTEVOUyAtPiBMRU4KLSAgICBSZWFkIGRlZmxhdGUgY29kZXM6Ci0gICAgICAgICAgICAgICAgTEVOIC0+IExFTiBvciBUWVBFCi0gKi8KLQotLyogc3RhdGUgbWFpbnRhaW5lZCBiZXR3ZWVuIGluZmxhdGUoKSBjYWxscy4gIEFwcHJveGltYXRlbHkgN0sgYnl0ZXMuICovCi1zdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSB7Ci0gICAgICAgIC8qIHNsaWRpbmcgd2luZG93ICovCi0gICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovCi0gICAgICAgIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi8KLSAgICB1bnNpZ25lZCBuY29kZTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLwotICAgIHVuc2lnbmVkIG5sZW47ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLwotICAgIHVuc2lnbmVkIG5kaXN0OyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCi0gICAgdW5zaWduZWQgaGF2ZTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovCi0gICAgY29kZSBGQVIgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIGNvZGVzW10gKi8KLSAgICB1bnNpZ25lZCBzaG9ydCBsZW5zWzMyMF07ICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGNvZGUgbGVuZ3RocyAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdvcmtbMjg4XTsgICAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi8KLSAgICBjb2RlIGNvZGVzW0VOT1VHSF07ICAgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovCi19OwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvaW5mYmFjazkvaW5mdHJlZTkuYyBiL2xpYnMvemxpYi9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTNmNzUuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvaW5mYmFjazkvaW5mdHJlZTkuYworKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKiBpbmZ0cmVlOS5jIC0tIGdlbmVyYXRlIEh1ZmZtYW4gdHJlZXMgZm9yIGVmZmljaWVudCBkZWNvZGluZwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotI2luY2x1ZGUgImluZnRyZWU5LmgiCi0KLSNkZWZpbmUgTUFYQklUUyAxNQotCi1jb25zdCBjaGFyIGluZmxhdGU5X2NvcHlyaWdodFtdID0KLSAgICIgaW5mbGF0ZTkgMS4yLjMgQ29weXJpZ2h0IDE5OTUtMjAwNSBNYXJrIEFkbGVyICI7Ci0vKgotICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCi0gIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKLSAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCi0gIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgotICovCi0KLS8qCi0gICBCdWlsZCBhIHNldCBvZiB0YWJsZXMgdG8gZGVjb2RlIHRoZSBwcm92aWRlZCBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLgotICAgVGhlIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIFRoZSByZXN1bHQgc3RhcnRzIGF0ICp0YWJsZSwKLSAgIHdob3NlIGluZGljZXMgYXJlIDAuLjJeYml0cy0xLiAgd29yayBpcyBhIHdyaXRhYmxlIGFycmF5IG9mIGF0IGxlYXN0Ci0gICBsZW5zIHNob3J0cywgd2hpY2ggaXMgdXNlZCBhcyBhIHdvcmsgYXJlYS4gIHR5cGUgaXMgdGhlIHR5cGUgb2YgY29kZQotICAgdG8gYmUgZ2VuZXJhdGVkLCBDT0RFUywgTEVOUywgb3IgRElTVFMuICBPbiByZXR1cm4sIHplcm8gaXMgc3VjY2VzcywKLSAgIC0xIGlzIGFuIGludmFsaWQgY29kZSwgYW5kICsxIG1lYW5zIHRoYXQgRU5PVUdIIGlzbid0IGVub3VnaC4gIHRhYmxlCi0gICBvbiByZXR1cm4gcG9pbnRzIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBlbnRyeSdzIGFkZHJlc3MuICBiaXRzIGlzIHRoZQotICAgcmVxdWVzdGVkIHJvb3QgdGFibGUgaW5kZXggYml0cywgYW5kIG9uIHJldHVybiBpdCBpcyB0aGUgYWN0dWFsIHJvb3QKLSAgIHRhYmxlIGluZGV4IGJpdHMuICBJdCB3aWxsIGRpZmZlciBpZiB0aGUgcmVxdWVzdCBpcyBncmVhdGVyIHRoYW4gdGhlCi0gICBsb25nZXN0IGNvZGUgb3IgaWYgaXQgaXMgbGVzcyB0aGFuIHRoZSBzaG9ydGVzdCBjb2RlLgotICovCi1pbnQgaW5mbGF0ZV90YWJsZTkodHlwZSwgbGVucywgY29kZXMsIHRhYmxlLCBiaXRzLCB3b3JrKQotY29kZXR5cGUgdHlwZTsKLXVuc2lnbmVkIHNob3J0IEZBUiAqbGVuczsKLXVuc2lnbmVkIGNvZGVzOwotY29kZSBGQVIgKiBGQVIgKnRhYmxlOwotdW5zaWduZWQgRkFSICpiaXRzOwotdW5zaWduZWQgc2hvcnQgRkFSICp3b3JrOwotewotICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBhIGNvZGUncyBsZW5ndGggaW4gYml0cyAqLwotICAgIHVuc2lnbmVkIHN5bTsgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBjb2RlIHN5bWJvbHMgKi8KLSAgICB1bnNpZ25lZCBtaW4sIG1heDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi8KLSAgICB1bnNpZ25lZCByb290OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi8KLSAgICB1bnNpZ25lZCBjdXJyOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi8KLSAgICB1bnNpZ25lZCBkcm9wOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqLwotICAgIGludCBsZWZ0OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcHJlZml4IGNvZGVzIGF2YWlsYWJsZSAqLwotICAgIHVuc2lnbmVkIHVzZWQ7ICAgICAgICAgICAgICAvKiBjb2RlIGVudHJpZXMgaW4gdGFibGUgdXNlZCAqLwotICAgIHVuc2lnbmVkIGh1ZmY7ICAgICAgICAgICAgICAvKiBIdWZmbWFuIGNvZGUgKi8KLSAgICB1bnNpZ25lZCBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqLwotICAgIHVuc2lnbmVkIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqLwotICAgIHVuc2lnbmVkIGxvdzsgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5ICovCi0gICAgdW5zaWduZWQgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi8KLSAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovCi0gICAgY29kZSBGQVIgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovCi0gICAgY29uc3QgdW5zaWduZWQgc2hvcnQgRkFSICpiYXNlOyAgICAgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBGQVIgKmV4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqLwotICAgIGludCBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqLwotICAgIHVuc2lnbmVkIHNob3J0IGNvdW50W01BWEJJVFMrMV07ICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqLwotICAgIHVuc2lnbmVkIHNob3J0IG9mZnNbTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxiYXNlWzMxXSA9IHsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGJhc2UgKi8KLSAgICAgICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LAotICAgICAgICAxOSwgMjMsIDI3LCAzMSwgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwKLSAgICAgICAgMTMxLCAxNjMsIDE5NSwgMjI3LCAzLCAwLCAwfTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGV4dFszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqLwotICAgICAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI5LCAxMjksIDEyOSwgMTI5LAotICAgICAgICAxMzAsIDEzMCwgMTMwLCAxMzAsIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMyLCAxMzIsIDEzMiwgMTMyLAotICAgICAgICAxMzMsIDEzMywgMTMzLCAxMzMsIDE0NCwgMjAxLCAxOTZ9OwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkYmFzZVszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjMxIGJhc2UgKi8KLSAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LAotICAgICAgICA2NSwgOTcsIDEyOSwgMTkzLCAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsCi0gICAgICAgIDQwOTcsIDYxNDUsIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDMyNzY5LCA0OTE1M307Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRleHRbMzJdID0geyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4zMSBleHRyYSAqLwotICAgICAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOSwgMTI5LCAxMzAsIDEzMCwgMTMxLCAxMzEsIDEzMiwgMTMyLAotICAgICAgICAxMzMsIDEzMywgMTM0LCAxMzQsIDEzNSwgMTM1LCAxMzYsIDEzNiwgMTM3LCAxMzcsIDEzOCwgMTM4LAotICAgICAgICAxMzksIDEzOSwgMTQwLCAxNDAsIDE0MSwgMTQxLCAxNDIsIDE0Mn07Ci0KLSAgICAvKgotICAgICAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGUKLSAgICAgICBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBFYWNoIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGUKLSAgICAgICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZQotICAgICAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyCi0gICAgICAgZm9yIGNvZGVzIHdpdGggZXF1YWwgbGVuZ3Rocy4gIFRoZW4gdGhlIGNvZGUgc3RhcnRzIHdpdGggYWxsIHplcm8gYml0cwotICAgICAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyCi0gICAgICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGgKLSAgICAgICBpbmNyZWFzZXMuICBGb3IgdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVzZSBiaXRzIGFyZSBzdG9yZWQgYmFja3dhcmRzCi0gICAgICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZQotICAgICAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzCi0gICAgICAgYXJlIGluY3JlbWVudGVkIGJhY2t3YXJkcy4KLQotICAgICAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluCi0gICAgICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy4KLSAgICAgICAxLi5NQVhCSVRTIGlzIGludGVycHJldGVkIGFzIHRoYXQgY29kZSBsZW5ndGguICB6ZXJvIG1lYW5zIHRoYXQgdGhhdAotICAgICAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuCi0KLSAgICAgICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsCi0gICAgICAgY3JlYXRpbmcgZnJvbSB0aGF0IGEgdGFibGUgb2Ygc3RhcnRpbmcgaW5kaWNlcyBmb3IgZWFjaCBsZW5ndGggaW4gdGhlCi0gICAgICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkCi0gICAgICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5Ci0gICAgICAgdGhlIGNhbGxlci4KLQotICAgICAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmcKLSAgICAgICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnkKLSAgICAgICBjb2RlcyBhdCBhbGwsIGNoZWNraW5nIGZvciBhIHZhbGlkIHNldCBvZiBsZW5ndGhzLCBhbmQgbG9va2luZyBhaGVhZAotICAgICAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZQotICAgICAgIGRlY29kaW5nIHRhYmxlcy4KLSAgICAgKi8KLQotICAgIC8qIGFjY3VtdWxhdGUgbGVuZ3RocyBmb3IgY29kZXMgKGFzc3VtZXMgbGVuc1tdIGFsbCBpbiAwLi5NQVhCSVRTKSAqLwotICAgIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKQotICAgICAgICBjb3VudFtsZW5dID0gMDsKLSAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykKLSAgICAgICAgY291bnRbbGVuc1tzeW1dXSsrOwotCi0gICAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi8KLSAgICByb290ID0gKmJpdHM7Ci0gICAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pCi0gICAgICAgIGlmIChjb3VudFttYXhdICE9IDApIGJyZWFrOwotICAgIGlmIChyb290ID4gbWF4KSByb290ID0gbWF4OwotICAgIGlmIChtYXggPT0gMCkgcmV0dXJuIC0xOyAgICAgICAgICAgIC8qIG5vIGNvZGVzISAqLwotICAgIGZvciAobWluID0gMTsgbWluIDw9IE1BWEJJVFM7IG1pbisrKQotICAgICAgICBpZiAoY291bnRbbWluXSAhPSAwKSBicmVhazsKLSAgICBpZiAocm9vdCA8IG1pbikgcm9vdCA9IG1pbjsKLQotICAgIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqLwotICAgIGxlZnQgPSAxOwotICAgIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7Ci0gICAgICAgIGxlZnQgPDw9IDE7Ci0gICAgICAgIGxlZnQgLT0gY291bnRbbGVuXTsKLSAgICAgICAgaWYgKGxlZnQgPCAwKSByZXR1cm4gLTE7ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi8KLSAgICB9Ci0gICAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09IENPREVTIHx8IG1heCAhPSAxKSkKLSAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIHNldCAqLwotCi0gICAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi8KLSAgICBvZmZzWzFdID0gMDsKLSAgICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKQotICAgICAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgY291bnRbbGVuXTsKLQotICAgIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi8KLSAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykKLSAgICAgICAgaWYgKGxlbnNbc3ltXSAhPSAwKSB3b3JrW29mZnNbbGVuc1tzeW1dXSsrXSA9ICh1bnNpZ25lZCBzaG9ydClzeW07Ci0KLSAgICAvKgotICAgICAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZwotICAgICAgIGZpbGxlZCBpcyBhdCBuZXh0IGFuZCBoYXMgY3VyciBpbmRleCBiaXRzLiAgVGhlIGNvZGUgYmVpbmcgdXNlZCBpcyBodWZmCi0gICAgICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wCi0gICAgICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLAotICAgICAgIHRob3NlIHRvcCBkcm9wICsgY3VyciAtIGxlbiBiaXRzIGFyZSBpbmNyZW1lbnRlZCB0aHJvdWdoIGFsbCB2YWx1ZXMgdG8KLSAgICAgICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy4KLQotICAgICAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHMKLSAgICAgICByb290LCBzdWItdGFibGVzIGFyZSBjcmVhdGVkIHBvaW50ZWQgdG8gYnkgdGhlIHJvb3QgZW50cnkgd2l0aCBhbiBpbmRleAotICAgICAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhCi0gICAgICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzCi0gICAgICAgYmVpbmcgZmlsbGVkLCBhbmQgZHJvcCBpcyByb290IHdoZW4gc3ViLXRhYmxlcyBhcmUgYmVpbmcgZmlsbGVkLgotCi0gICAgICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGUKLSAgICAgICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aAotICAgICAgIGNvdW50cyBhcmUgdXNlZCBmb3IgdGhpcywgYW5kIHNvIGNvdW50W10gaXMgZGVjcmVtZW50ZWQgYXMgY29kZXMgYXJlCi0gICAgICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLgotCi0gICAgICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGUKLSAgICAgICBwcm92aWRlZCAqdGFibGUgc3BhY2UuICBJdCBpcyBjaGVja2VkIHdoZW4gYSBMRU5TIHRhYmxlIGlzIGJlaW5nIG1hZGUKLSAgICAgICBhZ2FpbnN0IHRoZSBzcGFjZSBpbiAqdGFibGUsIEVOT1VHSCwgbWludXMgdGhlIG1heGltdW0gc3BhY2UgbmVlZGVkIGJ5Ci0gICAgICAgdGhlIHdvcnN0IGNhc2UgZGlzdGFuY2UgY29kZSwgTUFYRC4gIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IHRoZQotICAgICAgIHN1ZmZpY2llbmN5IG9mIEVOT1VHSCBoYXMgbm90IGJlZW4gcHJvdmVuIGV4aGF1c3RpdmVseSwgaGVuY2UgdGhlIGNoZWNrLgotICAgICAgIFRoaXMgYXNzdW1lcyB0aGF0IHdoZW4gdHlwZSA9PSBMRU5TLCBiaXRzID09IDkuCi0KLSAgICAgICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuCi0gICAgICAgYWxsIGNvZGVzIG9mIGxlbmd0aCBtYXgsIGkuZS4gYWxsIGNvZGVzLCBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhpcwotICAgICAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVzLCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHMKLSAgICAgICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuCi0gICAgICovCi0KLSAgICAvKiBzZXQgdXAgZm9yIGNvZGUgdHlwZSAqLwotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgQ09ERVM6Ci0gICAgICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqLwotICAgICAgICBlbmQgPSAxOTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRU5TOgotICAgICAgICBiYXNlID0gbGJhc2U7Ci0gICAgICAgIGJhc2UgLT0gMjU3OwotICAgICAgICBleHRyYSA9IGxleHQ7Ci0gICAgICAgIGV4dHJhIC09IDI1NzsKLSAgICAgICAgZW5kID0gMjU2OwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIERJU1RTICovCi0gICAgICAgIGJhc2UgPSBkYmFzZTsKLSAgICAgICAgZXh0cmEgPSBkZXh0OwotICAgICAgICBlbmQgPSAtMTsKLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsaXplIHN0YXRlIGZvciBsb29wICovCi0gICAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi8KLSAgICBzeW0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBzeW1ib2wgKi8KLSAgICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi8KLSAgICBuZXh0ID0gKnRhYmxlOyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovCi0gICAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqLwotICAgIGRyb3AgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGJpdHMgdG8gZHJvcCBmcm9tIGNvZGUgZm9yIGluZGV4ICovCi0gICAgbG93ID0gKHVuc2lnbmVkKSgtMSk7ICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi8KLSAgICB1c2VkID0gMVUgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqLwotICAgIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovCi0KLSAgICAvKiBjaGVjayBhdmFpbGFibGUgdGFibGUgc3BhY2UgKi8KLSAgICBpZiAodHlwZSA9PSBMRU5TICYmIHVzZWQgPj0gRU5PVUdIIC0gTUFYRCkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovCi0gICAgZm9yICg7OykgewotICAgICAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi8KLSAgICAgICAgdGhpcy5iaXRzID0gKHVuc2lnbmVkIGNoYXIpKGxlbiAtIGRyb3ApOwotICAgICAgICBpZiAoKGludCkod29ya1tzeW1dKSA8IGVuZCkgewotICAgICAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKTA7Ci0gICAgICAgICAgICB0aGlzLnZhbCA9IHdvcmtbc3ltXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoaW50KSh3b3JrW3N5bV0pID4gZW5kKSB7Ci0gICAgICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpKGV4dHJhW3dvcmtbc3ltXV0pOwotICAgICAgICAgICAgdGhpcy52YWwgPSBiYXNlW3dvcmtbc3ltXV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpKDMyICsgNjQpOyAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqLwotICAgICAgICAgICAgdGhpcy52YWwgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi8KLSAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSBkcm9wKTsKLSAgICAgICAgZmlsbCA9IDFVIDw8IGN1cnI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGZpbGwgLT0gaW5jcjsKLSAgICAgICAgICAgIG5leHRbKGh1ZmYgPj4gZHJvcCkgKyBmaWxsXSA9IHRoaXM7Ci0gICAgICAgIH0gd2hpbGUgKGZpbGwgIT0gMCk7Ci0KLSAgICAgICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi8KLSAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSAxKTsKLSAgICAgICAgd2hpbGUgKGh1ZmYgJiBpbmNyKQotICAgICAgICAgICAgaW5jciA+Pj0gMTsKLSAgICAgICAgaWYgKGluY3IgIT0gMCkgewotICAgICAgICAgICAgaHVmZiAmPSBpbmNyIC0gMTsKLSAgICAgICAgICAgIGh1ZmYgKz0gaW5jcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBodWZmID0gMDsKLQotICAgICAgICAvKiBnbyB0byBuZXh0IHN5bWJvbCwgdXBkYXRlIGNvdW50LCBsZW4gKi8KLSAgICAgICAgc3ltKys7Ci0gICAgICAgIGlmICgtLShjb3VudFtsZW5dKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobGVuID09IG1heCkgYnJlYWs7Ci0gICAgICAgICAgICBsZW4gPSBsZW5zW3dvcmtbc3ltXV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi8KLSAgICAgICAgaWYgKGxlbiA+IHJvb3QgJiYgKGh1ZmYgJiBtYXNrKSAhPSBsb3cpIHsKLSAgICAgICAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqLwotICAgICAgICAgICAgaWYgKGRyb3AgPT0gMCkKLSAgICAgICAgICAgICAgICBkcm9wID0gcm9vdDsKLQotICAgICAgICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqLwotICAgICAgICAgICAgbmV4dCArPSAxVSA8PCBjdXJyOwotCi0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi8KLSAgICAgICAgICAgIGN1cnIgPSBsZW4gLSBkcm9wOwotICAgICAgICAgICAgbGVmdCA9IChpbnQpKDEgPDwgY3Vycik7Ci0gICAgICAgICAgICB3aGlsZSAoY3VyciArIGRyb3AgPCBtYXgpIHsKLSAgICAgICAgICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTsKLSAgICAgICAgICAgICAgICBpZiAobGVmdCA8PSAwKSBicmVhazsKLSAgICAgICAgICAgICAgICBjdXJyKys7Ci0gICAgICAgICAgICAgICAgbGVmdCA8PD0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqLwotICAgICAgICAgICAgdXNlZCArPSAxVSA8PCBjdXJyOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEVOUyAmJiB1c2VkID49IEVOT1VHSCAtIE1BWEQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovCi0gICAgICAgICAgICBsb3cgPSBodWZmICYgbWFzazsKLSAgICAgICAgICAgICgqdGFibGUpW2xvd10ub3AgPSAodW5zaWduZWQgY2hhciljdXJyOwotICAgICAgICAgICAgKCp0YWJsZSlbbG93XS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpcm9vdDsKLSAgICAgICAgICAgICgqdGFibGUpW2xvd10udmFsID0gKHVuc2lnbmVkIHNob3J0KShuZXh0IC0gKnRhYmxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICAgRmlsbCBpbiByZXN0IG9mIHRhYmxlIGZvciBpbmNvbXBsZXRlIGNvZGVzLiAgVGhpcyBsb29wIGlzIHNpbWlsYXIgdG8gdGhlCi0gICAgICAgbG9vcCBhYm92ZSBpbiBpbmNyZW1lbnRpbmcgaHVmZiBmb3IgdGFibGUgaW5kaWNlcy4gIEl0IGlzIGFzc3VtZWQgdGhhdAotICAgICAgIGxlbiBpcyBlcXVhbCB0byBjdXJyICsgZHJvcCwgc28gdGhlcmUgaXMgbm8gbG9vcCBuZWVkZWQgdG8gaW5jcmVtZW50Ci0gICAgICAgdGhyb3VnaCBoaWdoIGluZGV4IGJpdHMuICBXaGVuIHRoZSBjdXJyZW50IHN1Yi10YWJsZSBpcyBmaWxsZWQsIHRoZSBsb29wCi0gICAgICAgZHJvcHMgYmFjayB0byB0aGUgcm9vdCB0YWJsZSB0byBmaWxsIGluIGFueSByZW1haW5pbmcgZW50cmllcyB0aGVyZS4KLSAgICAgKi8KLSAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgICAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KLSAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7Ci0gICAgdGhpcy52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKLSAgICB3aGlsZSAoaHVmZiAhPSAwKSB7Ci0gICAgICAgIC8qIHdoZW4gZG9uZSB3aXRoIHN1Yi10YWJsZSwgZHJvcCBiYWNrIHRvIHJvb3QgdGFibGUgKi8KLSAgICAgICAgaWYgKGRyb3AgIT0gMCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgewotICAgICAgICAgICAgZHJvcCA9IDA7Ci0gICAgICAgICAgICBsZW4gPSByb290OwotICAgICAgICAgICAgbmV4dCA9ICp0YWJsZTsKLSAgICAgICAgICAgIGN1cnIgPSByb290OwotICAgICAgICAgICAgdGhpcy5iaXRzID0gKHVuc2lnbmVkIGNoYXIpbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcHV0IGludmFsaWQgY29kZSBtYXJrZXIgaW4gdGFibGUgKi8KLSAgICAgICAgbmV4dFtodWZmID4+IGRyb3BdID0gdGhpczsKLQotICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLwotICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIDEpOwotICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpCi0gICAgICAgICAgICBpbmNyID4+PSAxOwotICAgICAgICBpZiAoaW5jciAhPSAwKSB7Ci0gICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOwotICAgICAgICAgICAgaHVmZiArPSBpbmNyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGh1ZmYgPSAwOwotICAgIH0KLQotICAgIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqLwotICAgICp0YWJsZSArPSB1c2VkOwotICAgICpiaXRzID0gcm9vdDsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmggYi9saWJzL3psaWIvY29udHJpYi9pbmZiYWNrOS9pbmZ0cmVlOS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjY4MDg0Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBpbmZ0cmVlOS5oIC0tIGhlYWRlciB0byB1c2UgaW5mdHJlZTkuYwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi0vKiBTdHJ1Y3R1cmUgZm9yIGRlY29kaW5nIHRhYmxlcy4gIEVhY2ggZW50cnkgcHJvdmlkZXMgZWl0aGVyIHRoZQotICAgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRvIHRoZSBvcGVyYXRpb24gcmVxdWVzdGVkIGJ5IHRoZSBjb2RlIHRoYXQKLSAgIGluZGV4ZWQgdGhhdCB0YWJsZSBlbnRyeSwgb3IgaXQgcHJvdmlkZXMgYSBwb2ludGVyIHRvIGFub3RoZXIKLSAgIHRhYmxlIHRoYXQgaW5kZXhlcyBtb3JlIGJpdHMgb2YgdGhlIGNvZGUuICBvcCBpbmRpY2F0ZXMgd2hldGhlcgotICAgdGhlIGVudHJ5IGlzIGEgcG9pbnRlciB0byBhbm90aGVyIHRhYmxlLCBhIGxpdGVyYWwsIGEgbGVuZ3RoIG9yCi0gICBkaXN0YW5jZSwgYW4gZW5kLW9mLWJsb2NrLCBvciBhbiBpbnZhbGlkIGNvZGUuICBGb3IgYSB0YWJsZQotICAgcG9pbnRlciwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIG9mCi0gICB0aGF0IHRhYmxlLiAgRm9yIGEgbGVuZ3RoIG9yIGRpc3RhbmNlLCB0aGUgbG93IGZvdXIgYml0cyBvZiBvcAotICAgaXMgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIGdldCBhZnRlciB0aGUgY29kZS4gIGJpdHMgaXMKLSAgIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGNvZGUgb3IgcGFydCBvZiB0aGUgY29kZSB0byBkcm9wIG9mZgotICAgb2YgdGhlIGJpdCBidWZmZXIuICB2YWwgaXMgdGhlIGFjdHVhbCBieXRlIHRvIG91dHB1dCBpbiB0aGUgY2FzZQotICAgb2YgYSBsaXRlcmFsLCB0aGUgYmFzZSBsZW5ndGggb3IgZGlzdGFuY2UsIG9yIHRoZSBvZmZzZXQgZnJvbQotICAgdGhlIGN1cnJlbnQgdGFibGUgdG8gdGhlIG5leHQgdGFibGUuICBFYWNoIGVudHJ5IGlzIGZvdXIgYnl0ZXMuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgY2hhciBvcDsgICAgICAgICAgIC8qIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgdGFibGUgYml0cyAqLwotICAgIHVuc2lnbmVkIGNoYXIgYml0czsgICAgICAgICAvKiBiaXRzIGluIHRoaXMgcGFydCBvZiB0aGUgY29kZSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHZhbDsgICAgICAgICAvKiBvZmZzZXQgaW4gdGFibGUgb3IgY29kZSB2YWx1ZSAqLwotfSBjb2RlOwotCi0vKiBvcCB2YWx1ZXMgYXMgc2V0IGJ5IGluZmxhdGVfdGFibGUoKToKLSAgICAwMDAwMDAwMCAtIGxpdGVyYWwKLSAgICAwMDAwdHR0dCAtIHRhYmxlIGxpbmssIHR0dHQgIT0gMCBpcyB0aGUgbnVtYmVyIG9mIHRhYmxlIGluZGV4IGJpdHMKLSAgICAxMDBlZWVlZSAtIGxlbmd0aCBvciBkaXN0YW5jZSwgZWVlZSBpcyB0aGUgbnVtYmVyIG9mIGV4dHJhIGJpdHMKLSAgICAwMTEwMDAwMCAtIGVuZCBvZiBibG9jawotICAgIDAxMDAwMDAwIC0gaW52YWxpZCBjb2RlCi0gKi8KLQotLyogTWF4aW11bSBzaXplIG9mIGR5bmFtaWMgdHJlZS4gIFRoZSBtYXhpbXVtIGZvdW5kIGluIGEgbG9uZyBidXQgbm9uLQotICAgZXhoYXVzdGl2ZSBzZWFyY2ggd2FzIDE0NDQgY29kZSBzdHJ1Y3R1cmVzICg4NTIgZm9yIGxlbmd0aC9saXRlcmFscwotICAgYW5kIDU5MiBmb3IgZGlzdGFuY2VzLCB0aGUgbGF0dGVyIGFjdHVhbGx5IHRoZSByZXN1bHQgb2YgYW4KLSAgIGV4aGF1c3RpdmUgc2VhcmNoKS4gIFRoZSB0cnVlIG1heGltdW0gaXMgbm90IGtub3duLCBidXQgdGhlIHZhbHVlCi0gICBiZWxvdyBpcyBtb3JlIHRoYW4gc2FmZS4gKi8KLSNkZWZpbmUgRU5PVUdIIDIwNDgKLSNkZWZpbmUgTUFYRCA1OTIKLQotLyogVHlwZSBvZiBjb2RlIHRvIGJ1aWxkIGZvciBpbmZ0YWJsZSgpICovCi10eXBlZGVmIGVudW0gewotICAgIENPREVTLAotICAgIExFTlMsCi0gICAgRElTVFMKLX0gY29kZXR5cGU7Ci0KLWV4dGVybiBpbnQgaW5mbGF0ZV90YWJsZTkgT0YoKGNvZGV0eXBlIHR5cGUsIHVuc2lnbmVkIHNob3J0IEZBUiAqbGVucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29kZXMsIGNvZGUgRkFSICogRkFSICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRkFSICpiaXRzLCB1bnNpZ25lZCBzaG9ydCBGQVIgKndvcmspKTsKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2luZmxhdGU4Ni9pbmZmYXM4Ni5jIGIvbGlicy96bGliL2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhczg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYTc2MzUuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhczg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTU3ICswLDAgQEAKLS8qIGluZmZhczg2LmMgaXMgYSBoYW5kIHR1bmVkIGFzc2VtYmxlciB2ZXJzaW9uIG9mCi0gKgotICogaW5mZmFzdC5jIC0tIGZhc3QgZGVjb2RpbmcKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ2hyaXMgQW5kZXJzb24gPGNocmlzdG9wQGNoYXJtLm5ldD4KLSAqIFBsZWFzZSB1c2UgdGhlIGNvcHlyaWdodCBjb25kaXRpb25zIGFib3ZlLgotICoKLSAqIERlYy0yOS0yMDAzIC0tIEkgYWRkZWQgQU1ENjQgaW5mbGF0ZSBhc20gc3VwcG9ydC4gIFRoaXMgdmVyc2lvbiBpcyBhbHNvCi0gKiBzbGlnaHRseSBxdWlja2VyIG9uIHg4NiBzeXN0ZW1zIGJlY2F1c2UsIGluc3RlYWQgb2YgdXNpbmcgcmVwIG1vdnNiIHRvIGNvcHkKLSAqIGRhdGEsIGl0IHVzZXMgcmVwIG1vdnN3LCB3aGljaCBtb3ZlcyBkYXRhIGluIDItYnl0ZSBjaHVua3MgaW5zdGVhZCBvZiBzaW5nbGUKLSAqIGJ5dGVzLiAgSSd2ZSB0ZXN0ZWQgdGhlIEFNRDY0IGNvZGUgb24gYSBGZWRvcmEgQ29yZSAxICsgdGhlIHg4Nl82NCB1cGRhdGVzCi0gKiBmcm9tIGh0dHA6Ly9mZWRvcmEubGludXguZHVrZS5lZHUvZmMxX3g4Nl82NAotICogd2hpY2ggaXMgcnVubmluZyBvbiBhbiBBdGhsb24gNjQgMzAwMCsgLyBHaWdhYnl0ZSBHQS1LOFZUODAwTSBzeXN0ZW0gd2l0aAotICogMUdCIHJhbS4gIFRoZSA2NC1iaXQgdmVyc2lvbiBpcyBhYm91dCA0JSBmYXN0ZXIgdGhhbiB0aGUgMzItYml0IHZlcnNpb24sCi0gKiB3aGVuIGRlY29tcHJlc3NpbmcgbW96aWxsYS1zb3VyY2UtMS4zLnRhci5nei4KLSAqCi0gKiBNYXItMTMtMjAwMyAtLSBNb3N0IG9mIHRoaXMgaXMgZGVyaXZlZCBmcm9tIGluZmZhc3QuUyB3aGljaCBpcyBkZXJpdmVkIGZyb20KLSAqIHRoZSBnY2MgLVMgb3V0cHV0IG9mIHpsaWItMS4yLjAvaW5mZmFzdC5jLiAgWmxpYi0xLjIuMCBpcyBpbiBiZXRhIHJlbGVhc2UgYXQKLSAqIHRoZSBtb21lbnQuICBJIGhhdmUgc3VjY2Vzc2Z1bGx5IGNvbXBpbGVkIGFuZCB0ZXN0ZWQgdGhpcyBjb2RlIHdpdGggZ2NjMi45NiwKLSAqIGdjYzMuMiwgaWNjNS4wLCBtc3ZjNi4wLiAgSXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgc3BlZWQgb2YgaW5mZmFzdC5TCi0gKiBjb21waWxlZCB3aXRoIGdjYyAtRE5PX01NWCwgYnV0IGluZmZhc3QuUyBpcyBzdGlsbCBmYXN0ZXIgb24gdGhlIFAzIHdpdGggTU1YCi0gKiBlbmFibGVkLiAgSSB3aWxsIGF0dGVtcHQgdG8gbWVyZ2UgdGhlIE1NWCBjb2RlIGludG8gdGhpcyB2ZXJzaW9uLiAgTmV3ZXIKLSAqIHZlcnNpb25zIG9mIHRoaXMgYW5kIGluZmZhc3QuUyBjYW4gYmUgZm91bmQgYXQKLSAqIGh0dHA6Ly93d3cuZWV0YmVldGVlLmNvbS96bGliLyBhbmQgaHR0cDovL3d3dy5jaGFybS5uZXQvfmNocmlzdG9wL3psaWIvCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZsYXRlLmgiCi0jaW5jbHVkZSAiaW5mZmFzdC5oIgotCi0vKiBNYXJrIEFkbGVyJ3MgY29tbWVudHMgZnJvbSBpbmZmYXN0LmM6ICovCi0KLS8qCi0gICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nCi0gICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXMKLSAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuCi0gICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yCi0gICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlCi0gICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS4KLQotICAgRW50cnkgYXNzdW1wdGlvbnM6Ci0KLSAgICAgICAgc3RhdGUtPm1vZGUgPT0gTEVOCi0gICAgICAgIHN0cm0tPmF2YWlsX2luID49IDYKLSAgICAgICAgc3RybS0+YXZhaWxfb3V0ID49IDI1OAotICAgICAgICBzdGFydCA+PSBzdHJtLT5hdmFpbF9vdXQKLSAgICAgICAgc3RhdGUtPmJpdHMgPCA4Ci0KLSAgIE9uIHJldHVybiwgc3RhdGUtPm1vZGUgaXMgb25lIG9mOgotCi0gICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dAotICAgICAgICBUWVBFIC0tIHJlYWNoZWQgZW5kIG9mIGJsb2NrIGNvZGUsIGluZmxhdGUoKSB0byBpbnRlcnByZXQgbmV4dCBibG9jawotICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YQotCi0gICBOb3RlczoKLQotICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlCi0gICAgICBsZW5ndGggY29kZSwgNSBiaXRzIGZvciB0aGUgbGVuZ3RoIGV4dHJhLCAxNSBiaXRzIGZvciB0aGUgZGlzdGFuY2UgY29kZSwKLSAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuCi0gICAgICBUaGVyZWZvcmUgaWYgc3RybS0+YXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWQKLSAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuCi0KLSAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNTgKLSAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKQotICAgICAgcmVxdWlyZXMgc3RybS0+YXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvcgotICAgICAgb3V0cHV0IHNwYWNlLgotICovCi12b2lkIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkKLXpfc3RyZWFtcCBzdHJtOwotdW5zaWduZWQgc3RhcnQ7ICAgICAgICAgLyogaW5mbGF0ZSgpJ3Mgc3RhcnRpbmcgdmFsdWUgZm9yIHN0cm0tPmF2YWlsX291dCAqLwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0gICAgc3RydWN0IGluZmZhc3RfYXIgewotLyogNjQgICAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYgIHg4Nl82NCAqLwotLyogYXIgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgKi8KLS8qICAwICAgIDAgKi8gdm9pZCAqZXNwOyAgICAgICAgICAgICAgICAvKiBlc3Agc2F2ZSAqLwotLyogIDggICAgNCAqLyB2b2lkICplYnA7ICAgICAgICAgICAgICAgIC8qIGVicCBzYXZlICovCi0vKiAxNiAgICA4ICovIHVuc2lnbmVkIGNoYXIgRkFSICppbjsgICAgLyogZXNpIHJzaSAgbG9jYWwgc3RybS0+bmV4dF9pbiAqLwotLyogMjQgICAxMiAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqbGFzdDsgIC8qICAgICByOSAgIHdoaWxlIGluIDwgbGFzdCAqLwotLyogMzIgICAxNiAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqb3V0OyAgIC8qIGVkaSByZGkgIGxvY2FsIHN0cm0tPm5leHRfb3V0ICovCi0vKiA0MCAgIDIwICovIHVuc2lnbmVkIGNoYXIgRkFSICpiZWc7ICAgLyogICAgICAgICAgaW5mbGF0ZSgpJ3MgaW5pdCBuZXh0X291dCAqLwotLyogNDggICAyNCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqZW5kOyAgIC8qICAgICByMTAgIHdoaWxlIG91dCA8IGVuZCAqLwotLyogNTYgICAyOCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93Oy8qICAgICAgICAgIHNpemUgb2Ygd2luZG93LCB3c2l6ZSE9MCAqLwotLyogNjQgICAzMiAqLyBjb2RlIGNvbnN0IEZBUiAqbGNvZGU7ICAgIC8qIGVicCByYnAgIGxvY2FsIHN0cm0tPmxlbmNvZGUgKi8KLS8qIDcyICAgMzYgKi8gY29kZSBjb25zdCBGQVIgKmRjb2RlOyAgICAvKiAgICAgcjExICBsb2NhbCBzdHJtLT5kaXN0Y29kZSAqLwotLyogODAgICA0MCAqLyB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgIC8qIGVkeCByZHggIGxvY2FsIHN0cm0tPmhvbGQgKi8KLS8qIDg4ICAgNDQgKi8gdW5zaWduZWQgYml0czsgICAgICAgICAgICAvKiBlYnggcmJ4ICBsb2NhbCBzdHJtLT5iaXRzICovCi0vKiA5MiAgIDQ4ICovIHVuc2lnbmVkIHdzaXplOyAgICAgICAgICAgLyogICAgICAgICAgd2luZG93IHNpemUgKi8KLS8qIDk2ICAgNTIgKi8gdW5zaWduZWQgd3JpdGU7ICAgICAgICAgICAvKiAgICAgICAgICB3aW5kb3cgd3JpdGUgaW5kZXggKi8KLS8qMTAwICAgNTYgKi8gdW5zaWduZWQgbG1hc2s7ICAgICAgICAgICAvKiAgICAgcjEyICBtYXNrIGZvciBsY29kZSAqLwotLyoxMDQgICA2MCAqLyB1bnNpZ25lZCBkbWFzazsgICAgICAgICAgIC8qICAgICByMTMgIG1hc2sgZm9yIGRjb2RlICovCi0vKjEwOCAgIDY0ICovIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgLyogICAgIHIxNCAgbWF0Y2ggbGVuZ3RoICovCi0vKjExMiAgIDY4ICovIHVuc2lnbmVkIGRpc3Q7ICAgICAgICAgICAgLyogICAgIHIxNSAgbWF0Y2ggZGlzdGFuY2UgKi8KLS8qMTE2ICAgNzIgKi8gdW5zaWduZWQgc3RhdHVzOyAgICAgICAgICAvKiAgICAgICAgICBzZXQgd2hlbiBzdGF0ZSBjaG5nKi8KLSAgICB9IGFyOwotCi0jaWYgZGVmaW5lZCggX19HTlVDX18gKSAmJiBkZWZpbmVkKCBfX2FtZDY0X18gKSAmJiAhIGRlZmluZWQoIF9faTM4NiApCi0jZGVmaW5lIFBBRF9BVkFJTF9JTiA2Ci0jZGVmaW5lIFBBRF9BVkFJTF9PVVQgMjU4Ci0jZWxzZQotI2RlZmluZSBQQURfQVZBSUxfSU4gNQotI2RlZmluZSBQQURfQVZBSUxfT1VUIDI1NwotI2VuZGlmCi0KLSAgICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqLwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIGFyLmluID0gc3RybS0+bmV4dF9pbjsKLSAgICBhci5sYXN0ID0gYXIuaW4gKyAoc3RybS0+YXZhaWxfaW4gLSBQQURfQVZBSUxfSU4pOwotICAgIGFyLm91dCA9IHN0cm0tPm5leHRfb3V0OwotICAgIGFyLmJlZyA9IGFyLm91dCAtIChzdGFydCAtIHN0cm0tPmF2YWlsX291dCk7Ci0gICAgYXIuZW5kID0gYXIub3V0ICsgKHN0cm0tPmF2YWlsX291dCAtIFBBRF9BVkFJTF9PVVQpOwotICAgIGFyLndzaXplID0gc3RhdGUtPndzaXplOwotICAgIGFyLndyaXRlID0gc3RhdGUtPndyaXRlOwotICAgIGFyLndpbmRvdyA9IHN0YXRlLT53aW5kb3c7Ci0gICAgYXIuaG9sZCA9IHN0YXRlLT5ob2xkOwotICAgIGFyLmJpdHMgPSBzdGF0ZS0+Yml0czsKLSAgICBhci5sY29kZSA9IHN0YXRlLT5sZW5jb2RlOwotICAgIGFyLmRjb2RlID0gc3RhdGUtPmRpc3Rjb2RlOwotICAgIGFyLmxtYXNrID0gKDFVIDw8IHN0YXRlLT5sZW5iaXRzKSAtIDE7Ci0gICAgYXIuZG1hc2sgPSAoMVUgPDwgc3RhdGUtPmRpc3RiaXRzKSAtIDE7Ci0KLSAgICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2gKLSAgICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqLwotCi0gICAgLyogYWxpZ24gaW4gb24gMS8yIGhvbGQgc2l6ZSBib3VuZGFyeSAqLwotICAgIHdoaWxlICgoKHVuc2lnbmVkIGxvbmcpKHZvaWQgKilhci5pbiAmIChzaXplb2YoYXIuaG9sZCkgLyAyIC0gMSkpICE9IDApIHsKLSAgICAgICAgYXIuaG9sZCArPSAodW5zaWduZWQgbG9uZykqYXIuaW4rKyA8PCBhci5iaXRzOwotICAgICAgICBhci5iaXRzICs9IDg7Ci0gICAgfQotCi0jaWYgZGVmaW5lZCggX19HTlVDX18gKSAmJiBkZWZpbmVkKCBfX2FtZDY0X18gKSAmJiAhIGRlZmluZWQoIF9faTM4NiApCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotIiAgICAgICAgbGVhcSAgICAlMCwgJSVyYXhcbiIKLSIgICAgICAgIG1vdnEgICAgJSVyYnAsIDgoJSVyYXgpXG4iICAgICAgIC8qIHNhdmUgcmVncyByYnAgYW5kIHJzcCAqLwotIiAgICAgICAgbW92cSAgICAlJXJzcCwgKCUlcmF4KVxuIgotIiAgICAgICAgbW92cSAgICAlJXJheCwgJSVyc3BcbiIgICAgICAgICAgLyogbWFrZSByc3AgcG9pbnQgdG8gJmFyICovCi0iICAgICAgICBtb3ZxICAgIDE2KCUlcnNwKSwgJSVyc2lcbiIgICAgICAvKiByc2kgID0gaW4gKi8KLSIgICAgICAgIG1vdnEgICAgMzIoJSVyc3ApLCAlJXJkaVxuIiAgICAgIC8qIHJkaSAgPSBvdXQgKi8KLSIgICAgICAgIG1vdnEgICAgMjQoJSVyc3ApLCAlJXI5XG4iICAgICAgIC8qIHI5ICAgPSBsYXN0ICovCi0iICAgICAgICBtb3ZxICAgIDQ4KCUlcnNwKSwgJSVyMTBcbiIgICAgICAvKiByMTAgID0gZW5kICovCi0iICAgICAgICBtb3ZxICAgIDY0KCUlcnNwKSwgJSVyYnBcbiIgICAgICAvKiByYnAgID0gbGNvZGUgKi8KLSIgICAgICAgIG1vdnEgICAgNzIoJSVyc3ApLCAlJXIxMVxuIiAgICAgIC8qIHIxMSAgPSBkY29kZSAqLwotIiAgICAgICAgbW92cSAgICA4MCglJXJzcCksICUlcmR4XG4iICAgICAgLyogcmR4ICA9IGhvbGQgKi8KLSIgICAgICAgIG1vdmwgICAgODgoJSVyc3ApLCAlJWVieFxuIiAgICAgIC8qIGVieCAgPSBiaXRzICovCi0iICAgICAgICBtb3ZsICAgIDEwMCglJXJzcCksICUlcjEyZFxuIiAgICAvKiByMTJkID0gbG1hc2sgKi8KLSIgICAgICAgIG1vdmwgICAgMTA0KCUlcnNwKSwgJSVyMTNkXG4iICAgIC8qIHIxM2QgPSBkbWFzayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcjE0ZCA9IGxlbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcjE1ZCA9IGRpc3QgKi8KLSIgICAgICAgIGNsZFxuIgotIiAgICAgICAgY21wcSAgICAlJXJkaSwgJSVyMTBcbiIKLSIgICAgICAgIGplICAgICAgLkxfb25lX3RpbWVcbiIgICAgICAgICAgIC8qIGlmIG9ubHkgb25lIGRlY29kZSBsZWZ0ICovCi0iICAgICAgICBjbXBxICAgICUlcnNpLCAlJXI5XG4iCi0iICAgICAgICBqZSAgICAgIC5MX29uZV90aW1lXG4iCi0iICAgICAgICBqbXAgICAgIC5MX2RvX2xvb3BcbiIKLQotIi5MX29uZV90aW1lOlxuIgotIiAgICAgICAgbW92cSAgICAlJXIxMiwgJSVyOFxuIiAgICAgICAgICAgLyogcjggPSBsbWFzayAqLwotIiAgICAgICAgY21wYiAgICAkMzIsICUlYmxcbiIKLSIgICAgICAgIGphICAgICAgLkxfZ2V0X2xlbmd0aF9jb2RlX29uZV90aW1lXG4iCi0KLSIgICAgICAgIGxvZHNsXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVheCA9ICoodWludCAqKWluKysgKi8KLSIgICAgICAgIG1vdmIgICAgJSVibCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCi0iICAgICAgICBhZGRiICAgICQzMiwgJSVibFxuIiAgICAgICAgICAgICAvKiBiaXRzICs9IDMyICovCi0iICAgICAgICBzaGxxICAgICUlY2wsICUlcmF4XG4iCi0iICAgICAgICBvcnEgICAgICUlcmF4LCAlJXJkeFxuIiAgICAgICAgICAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovCi0iICAgICAgICBqbXAgICAgIC5MX2dldF9sZW5ndGhfY29kZV9vbmVfdGltZVxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF93aGlsZV90ZXN0OlxuIgotIiAgICAgICAgY21wcSAgICAlJXJkaSwgJSVyMTBcbiIKLSIgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcFxuIgotIiAgICAgICAgY21wcSAgICAlJXJzaSwgJSVyOVxuIgotIiAgICAgICAgamJlICAgICAuTF9icmVha19sb29wXG4iCi0KLSIuTF9kb19sb29wOlxuIgotIiAgICAgICAgbW92cSAgICAlJXIxMiwgJSVyOFxuIiAgICAgICAgICAgLyogcjggPSBsbWFzayAqLwotIiAgICAgICAgY21wYiAgICAkMzIsICUlYmxcbiIKLSIgICAgICAgIGphICAgICAgLkxfZ2V0X2xlbmd0aF9jb2RlXG4iICAgIC8qIGlmICgzMiA8IGJpdHMpICovCi0KLSIgICAgICAgIGxvZHNsXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVheCA9ICoodWludCAqKWluKysgKi8KLSIgICAgICAgIG1vdmIgICAgJSVibCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCi0iICAgICAgICBhZGRiICAgICQzMiwgJSVibFxuIiAgICAgICAgICAgICAvKiBiaXRzICs9IDMyICovCi0iICAgICAgICBzaGxxICAgICUlY2wsICUlcmF4XG4iCi0iICAgICAgICBvcnEgICAgICUlcmF4LCAlJXJkeFxuIiAgICAgICAgICAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovCi0KLSIuTF9nZXRfbGVuZ3RoX2NvZGU6XG4iCi0iICAgICAgICBhbmRxICAgICUlcmR4LCAlJXI4XG4iICAgICAgICAgICAgLyogcjggJj0gaG9sZCAqLwotIiAgICAgICAgbW92bCAgICAoJSVyYnAsJSVyOCw0KSwgJSVlYXhcbiIgIC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8KLQotIiAgICAgICAgbW92YiAgICAlJWFoLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSB0aGlzLmJpdHMgKi8KLSIgICAgICAgIHN1YmIgICAgJSVhaCwgJSVibFxuIiAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCi0iICAgICAgICBzaHJxICAgICUlY2wsICUlcmR4XG4iICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KLQotIiAgICAgICAgdGVzdGIgICAlJWFsLCAlJWFsXG4iCi0iICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlXG4iIC8qIGlmIChvcCAhPSAwKSA0NS43JSAqLwotCi0iICAgICAgICBtb3ZxICAgICUlcjEyLCAlJXI4XG4iICAgICAgICAgICAgLyogcjggPSBsbWFzayAqLwotIiAgICAgICAgc2hybCAgICAkMTYsICUlZWF4XG4iICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KLSIgICAgICAgIHN0b3NiXG4iCi0KLSIuTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWU6XG4iCi0iICAgICAgICBhbmRxICAgICUlcmR4LCAlJXI4XG4iICAgICAgICAgICAgLyogcjggJj0gaG9sZCAqLwotIiAgICAgICAgbW92bCAgICAoJSVyYnAsJSVyOCw0KSwgJSVlYXhcbiIgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLwotCi0iLkxfZG9sZW46XG4iCi0iICAgICAgICBtb3ZiICAgICUlYWgsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IHRoaXMuYml0cyAqLwotIiAgICAgICAgc3ViYiAgICAlJWFoLCAlJWJsXG4iICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KLSIgICAgICAgIHNocnEgICAgJSVjbCwgJSVyZHhcbiIgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLwotCi0iICAgICAgICB0ZXN0YiAgICUlYWwsICUlYWxcbiIKLSIgICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VcbiIgLyogaWYgKG9wICE9IDApIDQ1LjclICovCi0KLSIgICAgICAgIHNocmwgICAgJDE2LCAlJWVheFxuIiAgICAgICAgICAgIC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovCi0iICAgICAgICBzdG9zYlxuIgotIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCi0KLSIuYWxpZ24gMzIsMHg5MFxuIgotIi5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlOlxuIgotIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVyMTRkXG4iICAgICAgICAgLyogbGVuID0gdGhpcyAqLwotIiAgICAgICAgc2hybCAgICAkMTYsICUlcjE0ZFxuIiAgICAgICAgICAgLyogbGVuID0gdGhpcy52YWwgKi8KLSIgICAgICAgIG1vdmIgICAgJSVhbCwgJSVjbFxuIgotCi0iICAgICAgICB0ZXN0YiAgICQxNiwgJSVhbFxuIgotIiAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoXG4iIC8qIGlmICgob3AgJiAxNikgPT0gMCkgOCUgKi8KLSIgICAgICAgIGFuZGIgICAgJDE1LCAlJWNsXG4iICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCi0iICAgICAgICBqeiAgICAgIC5MX2RlY29kZV9kaXN0YW5jZVxuIiAgICAvKiBpZiAoIW9wKSAqLwotCi0iLkxfYWRkX2JpdHNfdG9fbGVuOlxuIgotIiAgICAgICAgc3ViYiAgICAlJWNsLCAlJWJsXG4iCi0iICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgotIiAgICAgICAgaW5jbCAgICAlJWVheFxuIgotIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgotIiAgICAgICAgZGVjbCAgICAlJWVheFxuIgotIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLSIgICAgICAgIHNocnEgICAgJSVjbCwgJSVyZHhcbiIKLSIgICAgICAgIGFkZGwgICAgJSVlYXgsICUlcjE0ZFxuIiAgICAgICAgIC8qIGxlbiArPSBob2xkICYgbWFza1tvcF0gKi8KLQotIi5MX2RlY29kZV9kaXN0YW5jZTpcbiIKLSIgICAgICAgIG1vdnEgICAgJSVyMTMsICUlcjhcbiIgICAgICAgICAgIC8qIHI4ID0gZG1hc2sgKi8KLSIgICAgICAgIGNtcGIgICAgJDMyLCAlJWJsXG4iCi0iICAgICAgICBqYSAgICAgIC5MX2dldF9kaXN0YW5jZV9jb2RlXG4iICAvKiBpZiAoMzIgPCBiaXRzKSAqLwotCi0iICAgICAgICBsb2RzbFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlYXggPSAqKHVpbnQgKilpbisrICovCi0iICAgICAgICBtb3ZiICAgICUlYmwsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotIiAgICAgICAgYWRkYiAgICAkMzIsICUlYmxcbiIgICAgICAgICAgICAgLyogYml0cyArPSAzMiAqLwotIiAgICAgICAgc2hscSAgICAlJWNsLCAlJXJheFxuIgotIiAgICAgICAgb3JxICAgICAlJXJheCwgJSVyZHhcbiIgICAgICAgICAgLyogaG9sZCB8PSAqKCh1aW50ICopaW4pKysgPDwgYml0cyAqLwotCi0iLkxfZ2V0X2Rpc3RhbmNlX2NvZGU6XG4iCi0iICAgICAgICBhbmRxICAgICUlcmR4LCAlJXI4XG4iICAgICAgICAgICAvKiByOCAmPSBob2xkICovCi0iICAgICAgICBtb3ZsICAgICglJXIxMSwlJXI4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBkY29kZVtob2xkICYgZG1hc2tdICovCi0KLSIuTF9kb2Rpc3Q6XG4iCi0iICAgICAgICBtb3ZsICAgICUlZWF4LCAlJXIxNWRcbiIgICAgICAgICAvKiBkaXN0ID0gdGhpcyAqLwotIiAgICAgICAgc2hybCAgICAkMTYsICUlcjE1ZFxuIiAgICAgICAgICAgLyogZGlzdCA9IHRoaXMudmFsICovCi0iICAgICAgICBtb3ZiICAgICUlYWgsICUlY2xcbiIKLSIgICAgICAgIHN1YmIgICAgJSVhaCwgJSVibFxuIiAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCi0iICAgICAgICBzaHJxICAgICUlY2wsICUlcmR4XG4iICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KLSIgICAgICAgIG1vdmIgICAgJSVhbCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gdGhpcy5vcCAqLwotCi0iICAgICAgICB0ZXN0YiAgICQxNiwgJSVhbFxuIiAgICAgICAgICAgICAvKiBpZiAoKG9wICYgMTYpID09IDApICovCi0iICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0XG4iCi0iICAgICAgICBhbmRiICAgICQxNSwgJSVjbFxuIiAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLwotIiAgICAgICAganogICAgICAuTF9jaGVja19kaXN0X29uZVxuIgotCi0iLkxfYWRkX2JpdHNfdG9fZGlzdDpcbiIKLSIgICAgICAgIHN1YmIgICAgJSVjbCwgJSVibFxuIgotIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKLSIgICAgICAgIGluY2wgICAgJSVlYXhcbiIKLSIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKLSIgICAgICAgIGRlY2wgICAgJSVlYXhcbiIgICAgICAgICAgICAgICAgIC8qICgxIDw8IG9wKSAtIDEgKi8KLSIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCi0iICAgICAgICBzaHJxICAgICUlY2wsICUlcmR4XG4iCi0iICAgICAgICBhZGRsICAgICUlZWF4LCAlJXIxNWRcbiIgICAgICAgICAvKiBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkgKi8KLQotIi5MX2NoZWNrX3dpbmRvdzpcbiIKLSIgICAgICAgIG1vdnEgICAgJSVyc2ksICUlcjhcbiIgICAgICAgICAgIC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovCi0iICAgICAgICBtb3ZxICAgICUlcmRpLCAlJXJheFxuIgotIiAgICAgICAgc3VicSAgICA0MCglJXJzcCksICUlcmF4XG4iICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovCi0KLSIgICAgICAgIGNtcGwgICAgJSVyMTVkLCAlJWVheFxuIgotIiAgICAgICAgamIgICAgICAuTF9jbGlwX3dpbmRvd1xuIiAgICAgICAgLyogaWYgKGRpc3QgPiBuYnl0ZXMpIDQuMiUgKi8KLQotIiAgICAgICAgbW92bCAgICAlJXIxNGQsICUlZWN4XG4iICAgICAgICAgLyogZWN4ID0gbGVuICovCi0iICAgICAgICBtb3ZxICAgICUlcmRpLCAlJXJzaVxuIgotIiAgICAgICAgc3VicSAgICAlJXIxNSwgJSVyc2lcbiIgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLQotIiAgICAgICAgc2FybCAgICAlJWVjeFxuIgotIiAgICAgICAgam5jICAgICAuTF9jb3B5X3R3b1xuIiAgICAgICAgICAgLyogaWYgbGVuICUgMiA9PSAwICovCi0KLSIgICAgICAgIHJlcCAgICAgbW92c3dcbiIKLSIgICAgICAgIG1vdmIgICAgKCUlcnNpKSwgJSVhbFxuIgotIiAgICAgICAgbW92YiAgICAlJWFsLCAoJSVyZGkpXG4iCi0iICAgICAgICBpbmNxICAgICUlcmRpXG4iCi0KLSIgICAgICAgIG1vdnEgICAgJSVyOCwgJSVyc2lcbiIgICAgICAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlcnNpLCB0b3NzIGZyb20gKi8KLSIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgotCi0iLkxfY29weV90d286XG4iCi0iICAgICAgICByZXAgICAgIG1vdnN3XG4iCi0iICAgICAgICBtb3ZxICAgICUlcjgsICUlcnNpXG4iICAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJXJzaSwgdG9zcyBmcm9tICovCi0iICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKLQotIi5hbGlnbiAzMiwweDkwXG4iCi0iLkxfY2hlY2tfZGlzdF9vbmU6XG4iCi0iICAgICAgICBjbXBsICAgICQxLCAlJXIxNWRcbiIgICAgICAgICAgICAvKiBpZiBkaXN0IDEsIGlzIGEgbWVtc2V0ICovCi0iICAgICAgICBqbmUgICAgIC5MX2NoZWNrX3dpbmRvd1xuIgotIiAgICAgICAgY21wcSAgICAlJXJkaSwgNDAoJSVyc3ApXG4iICAgICAgLyogaWYgb3V0ID09IGJlZywgb3V0c2lkZSB3aW5kb3cgKi8KLSIgICAgICAgIGplICAgICAgLkxfY2hlY2tfd2luZG93XG4iCi0KLSIgICAgICAgIG1vdmwgICAgJSVyMTRkLCAlJWVjeFxuIiAgICAgICAgIC8qIGVjeCA9IGxlbiAqLwotIiAgICAgICAgbW92YiAgICAtMSglJXJkaSksICUlYWxcbiIKLSIgICAgICAgIG1vdmIgICAgJSVhbCwgJSVhaFxuIgotCi0iICAgICAgICBzYXJsICAgICUlZWN4XG4iCi0iICAgICAgICBqbmMgICAgIC5MX3NldF90d29cbiIKLSIgICAgICAgIG1vdmIgICAgJSVhbCwgKCUlcmRpKVxuIgotIiAgICAgICAgaW5jcSAgICAlJXJkaVxuIgotCi0iLkxfc2V0X3R3bzpcbiIKLSIgICAgICAgIHJlcCAgICAgc3Rvc3dcbiIKLSIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoOlxuIgotIiAgICAgICAgdGVzdGIgICAkNjQsICUlYWxcbiIKLSIgICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrXG4iIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KLQotIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKLSIgICAgICAgIGluY2wgICAgJSVlYXhcbiIKLSIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKLSIgICAgICAgIGRlY2wgICAgJSVlYXhcbiIKLSIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLSIgICAgICAgIGFkZGwgICAgJSVyMTRkLCAlJWVheFxuIiAgICAgICAgLyogZWF4ICs9IGxlbiAqLwotIiAgICAgICAgbW92bCAgICAoJSVyYnAsJSVyYXgsNCksICUlZWF4XG4iIC8qIGVheCA9IGxjb2RlW3ZhbCsoaG9sZCZtYXNrW29wXSldKi8KLSIgICAgICAgIGptcCAgICAgLkxfZG9sZW5cbiIKLQotIi5hbGlnbiAzMiwweDkwXG4iCi0iLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3Q6XG4iCi0iICAgICAgICB0ZXN0YiAgICQ2NCwgJSVhbFxuIgotIiAgICAgICAgam56ICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGVcbiIgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLwotCi0iICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgotIiAgICAgICAgaW5jbCAgICAlJWVheFxuIgotIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgotIiAgICAgICAgZGVjbCAgICAlJWVheFxuIgotIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotIiAgICAgICAgYWRkbCAgICAlJXIxNWQsICUlZWF4XG4iICAgICAgICAvKiBlYXggKz0gZGlzdCAqLwotIiAgICAgICAgbW92bCAgICAoJSVyMTEsJSVyYXgsNCksICUlZWF4XG4iIC8qIGVheCA9IGRjb2RlW3ZhbCsoaG9sZCZtYXNrW29wXSldKi8KLSIgICAgICAgIGptcCAgICAgLkxfZG9kaXN0XG4iCi0KLSIuYWxpZ24gMzIsMHg5MFxuIgotIi5MX2NsaXBfd2luZG93OlxuIgotIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVlY3hcbiIgICAgICAgICAvKiBlY3ggPSBuYnl0ZXMgKi8KLSIgICAgICAgIG1vdmwgICAgOTIoJSVyc3ApLCAlJWVheFxuIiAgICAgLyogZWF4ID0gd3NpemUsIHByZXBhcmUgZm9yIGRpc3QgY21wICovCi0iICAgICAgICBuZWdsICAgICUlZWN4XG4iICAgICAgICAgICAgICAgIC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8KLQotIiAgICAgICAgY21wbCAgICAlJXIxNWQsICUlZWF4XG4iCi0iICAgICAgICBqYiAgICAgIC5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhclxuIiAvKiBpZiAoZGlzdCA+IHdzaXplKSAqLwotCi0iICAgICAgICBhZGRsICAgICUlcjE1ZCwgJSVlY3hcbiIgICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCi0iICAgICAgICBjbXBsICAgICQwLCA5NiglJXJzcClcbiIKLSIgICAgICAgIGpuZSAgICAgLkxfd3JhcF9hcm91bmRfd2luZG93XG4iIC8qIGlmICh3cml0ZSAhPSAwKSAqLwotCi0iICAgICAgICBtb3ZxICAgIDU2KCUlcnNwKSwgJSVyc2lcbiIgICAgIC8qIGZyb20gID0gd2luZG93ICovCi0iICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIiAgICAgICAgIC8qIGVheCAgLT0gbmJ5dGVzICovCi0iICAgICAgICBhZGRxICAgICUlcmF4LCAlJXJzaVxuIiAgICAgICAgIC8qIGZyb20gKz0gd3NpemUgLSBuYnl0ZXMgKi8KLQotIiAgICAgICAgbW92bCAgICAlJXIxNGQsICUlZWF4XG4iICAgICAgICAvKiBlYXggPSBsZW4gKi8KLSIgICAgICAgIGNtcGwgICAgJSVlY3gsICUlcjE0ZFxuIgotIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBlYXggLT0gbmJ5dGVzICovCi0iICAgICAgICByZXAgICAgIG1vdnNiXG4iCi0iICAgICAgICBtb3ZxICAgICUlcmRpLCAlJXJzaVxuIgotIiAgICAgICAgc3VicSAgICAlJXIxNSwgJSVyc2lcbiIgICAgICAgICAvKiBmcm9tID0gJm91dFsgLWRpc3QgXSAqLwotIiAgICAgICAgam1wICAgICAuTF9kb19jb3B5XG4iCi0KLSIuYWxpZ24gMzIsMHg5MFxuIgotIi5MX3dyYXBfYXJvdW5kX3dpbmRvdzpcbiIKLSIgICAgICAgIG1vdmwgICAgOTYoJSVyc3ApLCAlJWVheFxuIiAgICAgLyogZWF4ID0gd3JpdGUgKi8KLSIgICAgICAgIGNtcGwgICAgJSVlYXgsICUlZWN4XG4iCi0iICAgICAgICBqYmUgICAgIC5MX2NvbnRpZ3VvdXNfaW5fd2luZG93XG4iIC8qIGlmICh3cml0ZSA+PSBuYnl0ZXMpICovCi0KLSIgICAgICAgIG1vdmwgICAgOTIoJSVyc3ApLCAlJWVzaVxuIiAgICAgLyogZnJvbSAgPSB3c2l6ZSAqLwotIiAgICAgICAgYWRkcSAgICA1NiglJXJzcCksICUlcnNpXG4iICAgICAvKiBmcm9tICs9IHdpbmRvdyAqLwotIiAgICAgICAgYWRkcSAgICAlJXJheCwgJSVyc2lcbiIgICAgICAgICAvKiBmcm9tICs9IHdyaXRlICovCi0iICAgICAgICBzdWJxICAgICUlcmN4LCAlJXJzaVxuIiAgICAgICAgIC8qIGZyb20gLT0gbmJ5dGVzICovCi0iICAgICAgICBzdWJsICAgICUlZWF4LCAlJWVjeFxuIiAgICAgICAgIC8qIG5ieXRlcyAtPSB3cml0ZSAqLwotCi0iICAgICAgICBtb3ZsICAgICUlcjE0ZCwgJSVlYXhcbiIgICAgICAgIC8qIGVheCA9IGxlbiAqLwotIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKLSIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgotIiAgICAgICAgbW92cSAgICA1NiglJXJzcCksICUlcnNpXG4iICAgICAvKiBmcm9tID0gd2luZG93ICovCi0iICAgICAgICBtb3ZsICAgIDk2KCUlcnNwKSwgJSVlY3hcbiIgICAgIC8qIG5ieXRlcyA9IHdyaXRlICovCi0iICAgICAgICBjbXBsICAgICUlZWN4LCAlJWVheFxuIgotIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0iICAgICAgICByZXAgICAgIG1vdnNiXG4iCi0iICAgICAgICBtb3ZxICAgICUlcmRpLCAlJXJzaVxuIgotIiAgICAgICAgc3VicSAgICAlJXIxNSwgJSVyc2lcbiIgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotIiAgICAgICAgam1wICAgICAuTF9kb19jb3B5XG4iCi0KLSIuYWxpZ24gMzIsMHg5MFxuIgotIi5MX2NvbnRpZ3VvdXNfaW5fd2luZG93OlxuIgotIiAgICAgICAgbW92cSAgICA1NiglJXJzcCksICUlcnNpXG4iICAgICAvKiByc2kgPSB3aW5kb3cgKi8KLSIgICAgICAgIGFkZHEgICAgJSVyYXgsICUlcnNpXG4iCi0iICAgICAgICBzdWJxICAgICUlcmN4LCAlJXJzaVxuIiAgICAgICAgIC8qIGZyb20gKz0gd3JpdGUgLSBuYnl0ZXMgKi8KLQotIiAgICAgICAgbW92bCAgICAlJXIxNGQsICUlZWF4XG4iICAgICAgICAvKiBlYXggPSBsZW4gKi8KLSIgICAgICAgIGNtcGwgICAgJSVlY3gsICUlZWF4XG4iCi0iICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0iICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIiAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLSIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKLSIgICAgICAgIG1vdnEgICAgJSVyZGksICUlcnNpXG4iCi0iICAgICAgICBzdWJxICAgICUlcjE1LCAlJXJzaVxuIiAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0iICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF9kb19jb3B5OlxuIgotIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVlY3hcbiIgICAgICAgICAvKiBlY3ggPSBsZW4gKi8KLSIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKLQotIiAgICAgICAgbW92cSAgICAlJXI4LCAlJXJzaVxuIiAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCi0iICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKLQotIi5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jazpcbiIKLSIgICAgICAgIHRlc3RiICAgJDMyLCAlJWFsXG4iCi0iICAgICAgICBqeiAgICAgIC5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZVxuIgotIiAgICAgICAgbW92bCAgICAkMSwgMTE2KCUlcnNwKVxuIgotIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCi0KLSIuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6XG4iCi0iICAgICAgICBtb3ZsICAgICQyLCAxMTYoJSVyc3ApXG4iCi0iICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKLQotIi5MX2ludmFsaWRfZGlzdGFuY2VfY29kZTpcbiIKLSIgICAgICAgIG1vdmwgICAgJDMsIDExNiglJXJzcClcbiIKLSIgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1c1xuIgotCi0iLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyOlxuIgotIiAgICAgICAgbW92bCAgICAkNCwgMTE2KCUlcnNwKVxuIgotIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCi0KLSIuTF9icmVha19sb29wOlxuIgotIiAgICAgICAgbW92bCAgICAkMCwgMTE2KCUlcnNwKVxuIgotCi0iLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1czpcbiIKLS8qIHB1dCBpbiwgb3V0LCBiaXRzLCBhbmQgaG9sZCBiYWNrIGludG8gYXIgYW5kIHBvcCBlc3AgKi8KLSIgICAgICAgIG1vdnEgICAgJSVyc2ksIDE2KCUlcnNwKVxuIiAgICAgLyogaW4gKi8KLSIgICAgICAgIG1vdnEgICAgJSVyZGksIDMyKCUlcnNwKVxuIiAgICAgLyogb3V0ICovCi0iICAgICAgICBtb3ZsICAgICUlZWJ4LCA4OCglJXJzcClcbiIgICAgIC8qIGJpdHMgKi8KLSIgICAgICAgIG1vdnEgICAgJSVyZHgsIDgwKCUlcnNwKVxuIiAgICAgLyogaG9sZCAqLwotIiAgICAgICAgbW92cSAgICAoJSVyc3ApLCAlJXJheFxuIiAgICAgICAvKiByZXN0b3JlIHJicCBhbmQgcnNwICovCi0iICAgICAgICBtb3ZxICAgIDgoJSVyc3ApLCAlJXJicFxuIgotIiAgICAgICAgbW92cSAgICAlJXJheCwgJSVyc3BcbiIKLSAgICAgICAgICA6Ci0gICAgICAgICAgOiAibSIgKGFyKQotICAgICAgICAgIDogIm1lbW9yeSIsICIlcmF4IiwgIiVyYngiLCAiJXJjeCIsICIlcmR4IiwgIiVyc2kiLCAiJXJkaSIsCi0gICAgICAgICAgICAiJXI4IiwgIiVyOSIsICIlcjEwIiwgIiVyMTEiLCAiJXIxMiIsICIlcjEzIiwgIiVyMTQiLCAiJXIxNSIKLSAgICApOwotI2VsaWYgKCBkZWZpbmVkKCBfX0dOVUNfXyApIHx8IGRlZmluZWQoIF9fSUNDICkgKSAmJiBkZWZpbmVkKCBfX2kzODYgKQotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSIgICAgICAgIGxlYWwgICAgJTAsICUlZWF4XG4iCi0iICAgICAgICBtb3ZsICAgICUlZXNwLCAoJSVlYXgpXG4iICAgICAgICAvKiBzYXZlIGVzcCwgZWJwICovCi0iICAgICAgICBtb3ZsICAgICUlZWJwLCA0KCUlZWF4KVxuIgotIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVlc3BcbiIKLSIgICAgICAgIG1vdmwgICAgOCglJWVzcCksICUlZXNpXG4iICAgICAgIC8qIGVzaSA9IGluICovCi0iICAgICAgICBtb3ZsICAgIDE2KCUlZXNwKSwgJSVlZGlcbiIgICAgICAvKiBlZGkgPSBvdXQgKi8KLSIgICAgICAgIG1vdmwgICAgNDAoJSVlc3ApLCAlJWVkeFxuIiAgICAgIC8qIGVkeCA9IGhvbGQgKi8KLSIgICAgICAgIG1vdmwgICAgNDQoJSVlc3ApLCAlJWVieFxuIiAgICAgIC8qIGVieCA9IGJpdHMgKi8KLSIgICAgICAgIG1vdmwgICAgMzIoJSVlc3ApLCAlJWVicFxuIiAgICAgIC8qIGVicCA9IGxjb2RlICovCi0KLSIgICAgICAgIGNsZFxuIgotIiAgICAgICAgam1wICAgICAuTF9kb19sb29wXG4iCi0KLSIuYWxpZ24gMzIsMHg5MFxuIgotIi5MX3doaWxlX3Rlc3Q6XG4iCi0iICAgICAgICBjbXBsICAgICUlZWRpLCAyNCglJWVzcClcbiIgICAgICAvKiBvdXQgPCBlbmQgKi8KLSIgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcFxuIgotIiAgICAgICAgY21wbCAgICAlJWVzaSwgMTIoJSVlc3ApXG4iICAgICAgLyogaW4gPCBsYXN0ICovCi0iICAgICAgICBqYmUgICAgIC5MX2JyZWFrX2xvb3BcbiIKLQotIi5MX2RvX2xvb3A6XG4iCi0iICAgICAgICBjbXBiICAgICQxNSwgJSVibFxuIgotIiAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGVcbiIgICAgLyogaWYgKDE1IDwgYml0cykgKi8KLQotIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKLSIgICAgICAgIGxvZHN3XG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCi0iICAgICAgICBtb3ZiICAgICUlYmwsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotIiAgICAgICAgYWRkYiAgICAkMTYsICUlYmxcbiIgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLwotIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgotIiAgICAgICAgb3JsICAgICAlJWVheCwgJSVlZHhcbiIgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLwotCi0iLkxfZ2V0X2xlbmd0aF9jb2RlOlxuIgotIiAgICAgICAgbW92bCAgICA1NiglJWVzcCksICUlZWF4XG4iICAgICAgLyogZWF4ID0gbG1hc2sgKi8KLSIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCi0iICAgICAgICBtb3ZsICAgICglJWVicCwlJWVheCw0KSwgJSVlYXhcbiIgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLwotCi0iLkxfZG9sZW46XG4iCi0iICAgICAgICBtb3ZiICAgICUlYWgsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IHRoaXMuYml0cyAqLwotIiAgICAgICAgc3ViYiAgICAlJWFoLCAlJWJsXG4iICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KLSIgICAgICAgIHNocmwgICAgJSVjbCwgJSVlZHhcbiIgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLwotCi0iICAgICAgICB0ZXN0YiAgICUlYWwsICUlYWxcbiIKLSIgICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VcbiIgLyogaWYgKG9wICE9IDApIDQ1LjclICovCi0KLSIgICAgICAgIHNocmwgICAgJDE2LCAlJWVheFxuIiAgICAgICAgICAgIC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovCi0iICAgICAgICBzdG9zYlxuIgotIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCi0KLSIuYWxpZ24gMzIsMHg5MFxuIgotIi5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlOlxuIgotIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVlY3hcbiIgICAgICAgICAgLyogbGVuID0gdGhpcyAqLwotIiAgICAgICAgc2hybCAgICAkMTYsICUlZWN4XG4iICAgICAgICAgICAgLyogbGVuID0gdGhpcy52YWwgKi8KLSIgICAgICAgIG1vdmwgICAgJSVlY3gsIDY0KCUlZXNwKVxuIiAgICAgIC8qIHNhdmUgbGVuICovCi0iICAgICAgICBtb3ZiICAgICUlYWwsICUlY2xcbiIKLQotIiAgICAgICAgdGVzdGIgICAkMTYsICUlYWxcbiIKLSIgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aFxuIiAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovCi0iICAgICAgICBhbmRiICAgICQxNSwgJSVjbFxuIiAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLwotIiAgICAgICAganogICAgICAuTF9kZWNvZGVfZGlzdGFuY2VcbiIgICAgLyogaWYgKCFvcCkgKi8KLSIgICAgICAgIGNtcGIgICAgJSVjbCwgJSVibFxuIgotIiAgICAgICAgamFlICAgICAuTF9hZGRfYml0c190b19sZW5cbiIgICAgLyogaWYgKG9wIDw9IGJpdHMpICovCi0KLSIgICAgICAgIG1vdmIgICAgJSVjbCwgJSVjaFxuIiAgICAgICAgICAgIC8qIHN0YXNoIG9wIGluIGNoLCBmcmVlaW5nIGNsICovCi0iICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgotIiAgICAgICAgbG9kc3dcbiIgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KLSIgICAgICAgIG1vdmIgICAgJSVibCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCi0iICAgICAgICBhZGRiICAgICQxNiwgJSVibFxuIiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCi0iICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCi0iICAgICAgICBvcmwgICAgICUlZWF4LCAlJWVkeFxuIiAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLwotIiAgICAgICAgbW92YiAgICAlJWNoLCAlJWNsXG4iICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLwotCi0iLkxfYWRkX2JpdHNfdG9fbGVuOlxuIgotIiAgICAgICAgc3ViYiAgICAlJWNsLCAlJWJsXG4iCi0iICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgotIiAgICAgICAgaW5jbCAgICAlJWVheFxuIgotIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgotIiAgICAgICAgZGVjbCAgICAlJWVheFxuIgotIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KLSIgICAgICAgIHNocmwgICAgJSVjbCwgJSVlZHhcbiIKLSIgICAgICAgIGFkZGwgICAgJSVlYXgsIDY0KCUlZXNwKVxuIiAgICAgIC8qIGxlbiArPSBob2xkICYgbWFza1tvcF0gKi8KLQotIi5MX2RlY29kZV9kaXN0YW5jZTpcbiIKLSIgICAgICAgIGNtcGIgICAgJDE1LCAlJWJsXG4iCi0iICAgICAgICBqYSAgICAgIC5MX2dldF9kaXN0YW5jZV9jb2RlXG4iICAvKiBpZiAoMTUgPCBiaXRzKSAqLwotCi0iICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgotIiAgICAgICAgbG9kc3dcbiIgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KLSIgICAgICAgIG1vdmIgICAgJSVibCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCi0iICAgICAgICBhZGRiICAgICQxNiwgJSVibFxuIiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCi0iICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCi0iICAgICAgICBvcmwgICAgICUlZWF4LCAlJWVkeFxuIiAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLwotCi0iLkxfZ2V0X2Rpc3RhbmNlX2NvZGU6XG4iCi0iICAgICAgICBtb3ZsICAgIDYwKCUlZXNwKSwgJSVlYXhcbiIgICAgICAvKiBlYXggPSBkbWFzayAqLwotIiAgICAgICAgbW92bCAgICAzNiglJWVzcCksICUlZWN4XG4iICAgICAgLyogZWN4ID0gZGNvZGUgKi8KLSIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCi0iICAgICAgICBtb3ZsICAgICglJWVjeCwlJWVheCw0KSwgJSVlYXhcbiIvKiBlYXggPSBkY29kZVtob2xkICYgZG1hc2tdICovCi0KLSIuTF9kb2Rpc3Q6XG4iCi0iICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVicFxuIiAgICAgICAgICAvKiBkaXN0ID0gdGhpcyAqLwotIiAgICAgICAgc2hybCAgICAkMTYsICUlZWJwXG4iICAgICAgICAgICAgLyogZGlzdCA9IHRoaXMudmFsICovCi0iICAgICAgICBtb3ZiICAgICUlYWgsICUlY2xcbiIKLSIgICAgICAgIHN1YmIgICAgJSVhaCwgJSVibFxuIiAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCi0iICAgICAgICBzaHJsICAgICUlY2wsICUlZWR4XG4iICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KLSIgICAgICAgIG1vdmIgICAgJSVhbCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gdGhpcy5vcCAqLwotCi0iICAgICAgICB0ZXN0YiAgICQxNiwgJSVhbFxuIiAgICAgICAgICAgICAvKiBpZiAoKG9wICYgMTYpID09IDApICovCi0iICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0XG4iCi0iICAgICAgICBhbmRiICAgICQxNSwgJSVjbFxuIiAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLwotIiAgICAgICAganogICAgICAuTF9jaGVja19kaXN0X29uZVxuIgotIiAgICAgICAgY21wYiAgICAlJWNsLCAlJWJsXG4iCi0iICAgICAgICBqYWUgICAgIC5MX2FkZF9iaXRzX3RvX2Rpc3RcbiIgICAvKiBpZiAob3AgPD0gYml0cykgOTcuNiUgKi8KLQotIiAgICAgICAgbW92YiAgICAlJWNsLCAlJWNoXG4iICAgICAgICAgICAgLyogc3Rhc2ggb3AgaW4gY2gsIGZyZWVpbmcgY2wgKi8KLSIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCi0iICAgICAgICBsb2Rzd1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLwotIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLSIgICAgICAgIGFkZGIgICAgJDE2LCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KLSIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKLSIgICAgICAgIG9ybCAgICAgJSVlYXgsICUlZWR4XG4iICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KLSIgICAgICAgIG1vdmIgICAgJSVjaCwgJSVjbFxuIiAgICAgICAgICAgIC8qIG1vdmUgb3AgYmFjayB0byBlY3ggKi8KLQotIi5MX2FkZF9iaXRzX3RvX2Rpc3Q6XG4iCi0iICAgICAgICBzdWJiICAgICUlY2wsICUlYmxcbiIKLSIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCi0iICAgICAgICBpbmNsICAgICUlZWF4XG4iCi0iICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCi0iICAgICAgICBkZWNsICAgICUlZWF4XG4iICAgICAgICAgICAgICAgICAvKiAoMSA8PCBvcCkgLSAxICovCi0iICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotIiAgICAgICAgc2hybCAgICAlJWNsLCAlJWVkeFxuIgotIiAgICAgICAgYWRkbCAgICAlJWVheCwgJSVlYnBcbiIgICAgICAgICAgLyogZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpICovCi0KLSIuTF9jaGVja193aW5kb3c6XG4iCi0iICAgICAgICBtb3ZsICAgICUlZXNpLCA4KCUlZXNwKVxuIiAgICAgICAvKiBzYXZlIGluIHNvIGZyb20gY2FuIHVzZSBpdCdzIHJlZyAqLwotIiAgICAgICAgbW92bCAgICAlJWVkaSwgJSVlYXhcbiIKLSIgICAgICAgIHN1YmwgICAgMjAoJSVlc3ApLCAlJWVheFxuIiAgICAgIC8qIG5ieXRlcyA9IG91dCAtIGJlZyAqLwotCi0iICAgICAgICBjbXBsICAgICUlZWJwLCAlJWVheFxuIgotIiAgICAgICAgamIgICAgICAuTF9jbGlwX3dpbmRvd1xuIiAgICAgICAgLyogaWYgKGRpc3QgPiBuYnl0ZXMpIDQuMiUgKi8KLQotIiAgICAgICAgbW92bCAgICA2NCglJWVzcCksICUlZWN4XG4iICAgICAgLyogZWN4ID0gbGVuICovCi0iICAgICAgICBtb3ZsICAgICUlZWRpLCAlJWVzaVxuIgotIiAgICAgICAgc3VibCAgICAlJWVicCwgJSVlc2lcbiIgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLQotIiAgICAgICAgc2FybCAgICAlJWVjeFxuIgotIiAgICAgICAgam5jICAgICAuTF9jb3B5X3R3b1xuIiAgICAgICAgICAgLyogaWYgbGVuICUgMiA9PSAwICovCi0KLSIgICAgICAgIHJlcCAgICAgbW92c3dcbiIKLSIgICAgICAgIG1vdmIgICAgKCUlZXNpKSwgJSVhbFxuIgotIiAgICAgICAgbW92YiAgICAlJWFsLCAoJSVlZGkpXG4iCi0iICAgICAgICBpbmNsICAgICUlZWRpXG4iCi0KLSIgICAgICAgIG1vdmwgICAgOCglJWVzcCksICUlZXNpXG4iICAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KLSIgICAgICAgIG1vdmwgICAgMzIoJSVlc3ApLCAlJWVicFxuIiAgICAgIC8qIGVicCA9IGxjb2RlICovCi0iICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKLQotIi5MX2NvcHlfdHdvOlxuIgotIiAgICAgICAgcmVwICAgICBtb3Zzd1xuIgotIiAgICAgICAgbW92bCAgICA4KCUlZXNwKSwgJSVlc2lcbiIgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLwotIiAgICAgICAgbW92bCAgICAzMiglJWVzcCksICUlZWJwXG4iICAgICAgLyogZWJwID0gbGNvZGUgKi8KLSIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF9jaGVja19kaXN0X29uZTpcbiIKLSIgICAgICAgIGNtcGwgICAgJDEsICUlZWJwXG4iICAgICAgICAgICAgLyogaWYgZGlzdCAxLCBpcyBhIG1lbXNldCAqLwotIiAgICAgICAgam5lICAgICAuTF9jaGVja193aW5kb3dcbiIKLSIgICAgICAgIGNtcGwgICAgJSVlZGksIDIwKCUlZXNwKVxuIgotIiAgICAgICAgamUgICAgICAuTF9jaGVja193aW5kb3dcbiIgICAgICAvKiBvdXQgPT0gYmVnLCBpZiBvdXRzaWRlIHdpbmRvdyAqLwotCi0iICAgICAgICBtb3ZsICAgIDY0KCUlZXNwKSwgJSVlY3hcbiIgICAgICAvKiBlY3ggPSBsZW4gKi8KLSIgICAgICAgIG1vdmIgICAgLTEoJSVlZGkpLCAlJWFsXG4iCi0iICAgICAgICBtb3ZiICAgICUlYWwsICUlYWhcbiIKLQotIiAgICAgICAgc2FybCAgICAlJWVjeFxuIgotIiAgICAgICAgam5jICAgICAuTF9zZXRfdHdvXG4iCi0iICAgICAgICBtb3ZiICAgICUlYWwsICglJWVkaSlcbiIKLSIgICAgICAgIGluY2wgICAgJSVlZGlcbiIKLQotIi5MX3NldF90d286XG4iCi0iICAgICAgICByZXAgICAgIHN0b3N3XG4iCi0iICAgICAgICBtb3ZsICAgIDMyKCUlZXNwKSwgJSVlYnBcbiIgICAgICAvKiBlYnAgPSBsY29kZSAqLwotIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCi0KLSIuYWxpZ24gMzIsMHg5MFxuIgotIi5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6XG4iCi0iICAgICAgICB0ZXN0YiAgICQ2NCwgJSVhbFxuIgotIiAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2tcbiIgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLwotCi0iICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgotIiAgICAgICAgaW5jbCAgICAlJWVheFxuIgotIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgotIiAgICAgICAgZGVjbCAgICAlJWVheFxuIgotIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotIiAgICAgICAgYWRkbCAgICA2NCglJWVzcCksICUlZWF4XG4iICAgICAvKiBlYXggKz0gbGVuICovCi0iICAgICAgICBtb3ZsICAgICglJWVicCwlJWVheCw0KSwgJSVlYXhcbiIgLyogZWF4ID0gbGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLwotIiAgICAgICAgam1wICAgICAuTF9kb2xlblxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDpcbiIKLSIgICAgICAgIHRlc3RiICAgJDY0LCAlJWFsXG4iCi0iICAgICAgICBqbnogICAgIC5MX2ludmFsaWRfZGlzdGFuY2VfY29kZVxuIiAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCi0KLSIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCi0iICAgICAgICBpbmNsICAgICUlZWF4XG4iCi0iICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCi0iICAgICAgICBkZWNsICAgICUlZWF4XG4iCi0iICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgIC8qIGVheCAmPSBob2xkICovCi0iICAgICAgICBhZGRsICAgICUlZWJwLCAlJWVheFxuIiAgICAgICAgIC8qIGVheCArPSBkaXN0ICovCi0iICAgICAgICBtb3ZsICAgIDM2KCUlZXNwKSwgJSVlY3hcbiIgICAgIC8qIGVjeCA9IGRjb2RlICovCi0iICAgICAgICBtb3ZsICAgICglJWVjeCwlJWVheCw0KSwgJSVlYXhcbiIgLyogZWF4ID0gZGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLwotIiAgICAgICAgam1wICAgICAuTF9kb2Rpc3RcbiIKLQotIi5hbGlnbiAzMiwweDkwXG4iCi0iLkxfY2xpcF93aW5kb3c6XG4iCi0iICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVjeFxuIgotIiAgICAgICAgbW92bCAgICA0OCglJWVzcCksICUlZWF4XG4iICAgICAvKiBlYXggPSB3c2l6ZSAqLwotIiAgICAgICAgbmVnbCAgICAlJWVjeFxuIiAgICAgICAgICAgICAgICAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovCi0iICAgICAgICBtb3ZsICAgIDI4KCUlZXNwKSwgJSVlc2lcbiIgICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KLQotIiAgICAgICAgY21wbCAgICAlJWVicCwgJSVlYXhcbiIKLSIgICAgICAgIGpiICAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyXG4iIC8qIGlmIChkaXN0ID4gd3NpemUpICovCi0KLSIgICAgICAgIGFkZGwgICAgJSVlYnAsICUlZWN4XG4iICAgICAgICAgLyogbmJ5dGVzID0gZGlzdCAtIG5ieXRlcyAqLwotIiAgICAgICAgY21wbCAgICAkMCwgNTIoJSVlc3ApXG4iCi0iICAgICAgICBqbmUgICAgIC5MX3dyYXBfYXJvdW5kX3dpbmRvd1xuIiAvKiBpZiAod3JpdGUgIT0gMCkgKi8KLQotIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIKLSIgICAgICAgIGFkZGwgICAgJSVlYXgsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLwotCi0iICAgICAgICBtb3ZsICAgIDY0KCUlZXNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCA9IGxlbiAqLwotIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKLSIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgotIiAgICAgICAgbW92bCAgICAlJWVkaSwgJSVlc2lcbiIKLSIgICAgICAgIHN1YmwgICAgJSVlYnAsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLSIgICAgICAgIGptcCAgICAgLkxfZG9fY29weVxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF93cmFwX2Fyb3VuZF93aW5kb3c6XG4iCi0iICAgICAgICBtb3ZsICAgIDUyKCUlZXNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCA9IHdyaXRlICovCi0iICAgICAgICBjbXBsICAgICUlZWF4LCAlJWVjeFxuIgotIiAgICAgICAgamJlICAgICAuTF9jb250aWd1b3VzX2luX3dpbmRvd1xuIiAvKiBpZiAod3JpdGUgPj0gbmJ5dGVzKSAqLwotCi0iICAgICAgICBhZGRsICAgIDQ4KCUlZXNwKSwgJSVlc2lcbiIgICAgIC8qIGZyb20gKz0gd3NpemUgKi8KLSIgICAgICAgIGFkZGwgICAgJSVlYXgsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSArPSB3cml0ZSAqLwotIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tIC09IG5ieXRlcyAqLwotIiAgICAgICAgc3VibCAgICAlJWVheCwgJSVlY3hcbiIgICAgICAgICAvKiBuYnl0ZXMgLT0gd3JpdGUgKi8KLQotIiAgICAgICAgbW92bCAgICA2NCglJWVzcCksICUlZWF4XG4iICAgICAvKiBlYXggPSBsZW4gKi8KLSIgICAgICAgIGNtcGwgICAgJSVlY3gsICUlZWF4XG4iCi0iICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0iICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIiAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLSIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKLSIgICAgICAgIG1vdmwgICAgMjgoJSVlc3ApLCAlJWVzaVxuIiAgICAgLyogZnJvbSA9IHdpbmRvdyAqLwotIiAgICAgICAgbW92bCAgICA1MiglJWVzcCksICUlZWN4XG4iICAgICAvKiBuYnl0ZXMgPSB3cml0ZSAqLwotIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKLSIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgotIiAgICAgICAgbW92bCAgICAlJWVkaSwgJSVlc2lcbiIKLSIgICAgICAgIHN1YmwgICAgJSVlYnAsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLSIgICAgICAgIGptcCAgICAgLkxfZG9fY29weVxuIgotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF9jb250aWd1b3VzX2luX3dpbmRvdzpcbiIKLSIgICAgICAgIGFkZGwgICAgJSVlYXgsICUlZXNpXG4iCi0iICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVzaVxuIiAgICAgICAgIC8qIGZyb20gKz0gd3JpdGUgLSBuYnl0ZXMgKi8KLQotIiAgICAgICAgbW92bCAgICA2NCglJWVzcCksICUlZWF4XG4iICAgICAvKiBlYXggPSBsZW4gKi8KLSIgICAgICAgIGNtcGwgICAgJSVlY3gsICUlZWF4XG4iCi0iICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0iICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIiAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLSIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKLSIgICAgICAgIG1vdmwgICAgJSVlZGksICUlZXNpXG4iCi0iICAgICAgICBzdWJsICAgICUlZWJwLCAlJWVzaVxuIiAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0iICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0iLmFsaWduIDMyLDB4OTBcbiIKLSIuTF9kb19jb3B5OlxuIgotIiAgICAgICAgbW92bCAgICAlJWVheCwgJSVlY3hcbiIKLSIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKLQotIiAgICAgICAgbW92bCAgICA4KCUlZXNwKSwgJSVlc2lcbiIgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCi0iICAgICAgICBtb3ZsICAgIDMyKCUlZXNwKSwgJSVlYnBcbiIgICAgIC8qIGVicCA9IGxjb2RlICovCi0iICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKLQotIi5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jazpcbiIKLSIgICAgICAgIHRlc3RiICAgJDMyLCAlJWFsXG4iCi0iICAgICAgICBqeiAgICAgIC5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZVxuIgotIiAgICAgICAgbW92bCAgICAkMSwgNzIoJSVlc3ApXG4iCi0iICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKLQotIi5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZTpcbiIKLSIgICAgICAgIG1vdmwgICAgJDIsIDcyKCUlZXNwKVxuIgotIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCi0KLSIuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGU6XG4iCi0iICAgICAgICBtb3ZsICAgICQzLCA3MiglJWVzcClcbiIKLSIgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1c1xuIgotCi0iLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyOlxuIgotIiAgICAgICAgbW92bCAgICA4KCUlZXNwKSwgJSVlc2lcbiIKLSIgICAgICAgIG1vdmwgICAgJDQsIDcyKCUlZXNwKVxuIgotIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCi0KLSIuTF9icmVha19sb29wOlxuIgotIiAgICAgICAgbW92bCAgICAkMCwgNzIoJSVlc3ApXG4iCi0KLSIuTF9icmVha19sb29wX3dpdGhfc3RhdHVzOlxuIgotLyogcHV0IGluLCBvdXQsIGJpdHMsIGFuZCBob2xkIGJhY2sgaW50byBhciBhbmQgcG9wIGVzcCAqLwotIiAgICAgICAgbW92bCAgICAlJWVzaSwgOCglJWVzcClcbiIgICAgICAvKiBzYXZlIGluICovCi0iICAgICAgICBtb3ZsICAgICUlZWRpLCAxNiglJWVzcClcbiIgICAgIC8qIHNhdmUgb3V0ICovCi0iICAgICAgICBtb3ZsICAgICUlZWJ4LCA0NCglJWVzcClcbiIgICAgIC8qIHNhdmUgYml0cyAqLwotIiAgICAgICAgbW92bCAgICAlJWVkeCwgNDAoJSVlc3ApXG4iICAgICAvKiBzYXZlIGhvbGQgKi8KLSIgICAgICAgIG1vdmwgICAgNCglJWVzcCksICUlZWJwXG4iICAgICAgLyogcmVzdG9yZSBlc3AsIGVicCAqLwotIiAgICAgICAgbW92bCAgICAoJSVlc3ApLCAlJWVzcFxuIgotICAgICAgICAgIDoKLSAgICAgICAgICA6ICJtIiAoYXIpCi0gICAgICAgICAgOiAibWVtb3J5IiwgIiVlYXgiLCAiJWVieCIsICIlZWN4IiwgIiVlZHgiLCAiJWVzaSIsICIlZWRpIgotICAgICk7Ci0jZWxpZiBkZWZpbmVkKCBfTVNDX1ZFUiApICYmICEgZGVmaW5lZCggX01fQU1ENjQgKQotICAgIF9fYXNtIHsKLQlsZWEJZWF4LCBhcgotCW1vdglbZWF4XSwgZXNwICAgICAgICAgLyogc2F2ZSBlc3AsIGVicCAqLwotCW1vdglbZWF4KzRdLCBlYnAKLQltb3YJZXNwLCBlYXgKLQltb3YJZXNpLCBbZXNwKzhdICAgICAgIC8qIGVzaSA9IGluICovCi0JbW92CWVkaSwgW2VzcCsxNl0gICAgICAvKiBlZGkgPSBvdXQgKi8KLQltb3YJZWR4LCBbZXNwKzQwXSAgICAgIC8qIGVkeCA9IGhvbGQgKi8KLQltb3YJZWJ4LCBbZXNwKzQ0XSAgICAgIC8qIGVieCA9IGJpdHMgKi8KLQltb3YJZWJwLCBbZXNwKzMyXSAgICAgIC8qIGVicCA9IGxjb2RlICovCi0KLQljbGQKLQlqbXAJTF9kb19sb29wCi0KLUFMSUdOIDQKLUxfd2hpbGVfdGVzdDoKLQljbXAJW2VzcCsyNF0sIGVkaQotCWpiZQlMX2JyZWFrX2xvb3AKLQljbXAJW2VzcCsxMl0sIGVzaQotCWpiZQlMX2JyZWFrX2xvb3AKLQotTF9kb19sb29wOgotCWNtcAlibCwgMTUKLQlqYQlMX2dldF9sZW5ndGhfY29kZSAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLwotCi0JeG9yCWVheCwgZWF4Ci0JbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KLQltb3YJY2wsIGJsICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLQlhZGQJYmwsIDE2ICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KLQlzaGwJZWF4LCBjbAotCW9yCWVkeCwgZWF4ICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KLQotTF9nZXRfbGVuZ3RoX2NvZGU6Ci0JbW92CWVheCwgW2VzcCs1Nl0gICAgICAvKiBlYXggPSBsbWFzayAqLwotCWFuZAllYXgsIGVkeCAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotCW1vdgllYXgsIFtlYnArZWF4KjRdIC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8KLQotTF9kb2xlbjoKLQltb3YJY2wsIGFoICAgICAgICAgICAgLyogY2wgPSB0aGlzLmJpdHMgKi8KLQlzdWIJYmwsIGFoICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KLQlzaHIJZWR4LCBjbCAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCi0KLQl0ZXN0CWFsLCBhbAotCWpueglMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlIC8qIGlmIChvcCAhPSAwKSA0NS43JSAqLwotCi0Jc2hyCWVheCwgMTYgICAgICAgICAgICAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLwotCXN0b3NiCi0Jam1wCUxfd2hpbGVfdGVzdAotCi1BTElHTiA0Ci1MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlOgotCW1vdgllY3gsIGVheCAgICAgICAgICAvKiBsZW4gPSB0aGlzICovCi0Jc2hyCWVjeCwgMTYgICAgICAgICAgICAvKiBsZW4gPSB0aGlzLnZhbCAqLwotCW1vdglbZXNwKzY0XSwgZWN4ICAgICAgLyogc2F2ZSBsZW4gKi8KLQltb3YJY2wsIGFsCi0KLQl0ZXN0CWFsLCAxNgotCWp6CUxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aCAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovCi0JYW5kCWNsLCAxNSAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLwotCWp6CUxfZGVjb2RlX2Rpc3RhbmNlICAgIC8qIGlmICghb3ApICovCi0JY21wCWJsLCBjbAotCWphZQlMX2FkZF9iaXRzX3RvX2xlbiAgICAvKiBpZiAob3AgPD0gYml0cykgKi8KLQotCW1vdgljaCwgY2wgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLwotCXhvcgllYXgsIGVheAotCWxvZHN3ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCi0JbW92CWNsLCBibCAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCi0JYWRkCWJsLCAxNiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCi0Jc2hsCWVheCwgY2wKLQlvcgllZHgsIGVheCAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLwotCW1vdgljbCwgY2ggICAgICAgICAgICAvKiBtb3ZlIG9wIGJhY2sgdG8gZWN4ICovCi0KLUxfYWRkX2JpdHNfdG9fbGVuOgotCXN1YglibCwgY2wKLQl4b3IJZWF4LCBlYXgKLQlpbmMJZWF4Ci0Jc2hsCWVheCwgY2wKLQlkZWMJZWF4Ci0JYW5kCWVheCwgZWR4ICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCi0Jc2hyCWVkeCwgY2wKLQlhZGQJW2VzcCs2NF0sIGVheCAgICAgIC8qIGxlbiArPSBob2xkICYgbWFza1tvcF0gKi8KLQotTF9kZWNvZGVfZGlzdGFuY2U6Ci0JY21wCWJsLCAxNQotCWphCUxfZ2V0X2Rpc3RhbmNlX2NvZGUgIC8qIGlmICgxNSA8IGJpdHMpICovCi0KLQl4b3IJZWF4LCBlYXgKLQlsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLwotCW1vdgljbCwgYmwgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotCWFkZAlibCwgMTYgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLwotCXNobAllYXgsIGNsCi0Jb3IJZWR4LCBlYXggICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KLQotTF9nZXRfZGlzdGFuY2VfY29kZToKLQltb3YJZWF4LCBbZXNwKzYwXSAgICAgIC8qIGVheCA9IGRtYXNrICovCi0JbW92CWVjeCwgW2VzcCszNl0gICAgICAvKiBlY3ggPSBkY29kZSAqLwotCWFuZAllYXgsIGVkeCAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotCW1vdgllYXgsIFtlY3grZWF4KjRdLyogZWF4ID0gZGNvZGVbaG9sZCAmIGRtYXNrXSAqLwotCi1MX2RvZGlzdDoKLQltb3YJZWJwLCBlYXggICAgICAgICAgLyogZGlzdCA9IHRoaXMgKi8KLQlzaHIJZWJwLCAxNiAgICAgICAgICAgIC8qIGRpc3QgPSB0aGlzLnZhbCAqLwotCW1vdgljbCwgYWgKLQlzdWIJYmwsIGFoICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KLQlzaHIJZWR4LCBjbCAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCi0JbW92CWNsLCBhbCAgICAgICAgICAgIC8qIGNsID0gdGhpcy5vcCAqLwotCi0JdGVzdAlhbCwgMTYgICAgICAgICAgICAgLyogaWYgKChvcCAmIDE2KSA9PSAwKSAqLwotCWp6CUxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3QKLQlhbmQJY2wsIDE1ICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCi0JanoJTF9jaGVja19kaXN0X29uZQotCWNtcAlibCwgY2wKLQlqYWUJTF9hZGRfYml0c190b19kaXN0ICAgLyogaWYgKG9wIDw9IGJpdHMpIDk3LjYlICovCi0KLQltb3YJY2gsIGNsICAgICAgICAgICAgLyogc3Rhc2ggb3AgaW4gY2gsIGZyZWVpbmcgY2wgKi8KLQl4b3IJZWF4LCBlYXgKLQlsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLwotCW1vdgljbCwgYmwgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotCWFkZAlibCwgMTYgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLwotCXNobAllYXgsIGNsCi0Jb3IJZWR4LCBlYXggICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLwotCW1vdgljbCwgY2ggICAgICAgICAgICAvKiBtb3ZlIG9wIGJhY2sgdG8gZWN4ICovCi0KLUxfYWRkX2JpdHNfdG9fZGlzdDoKLQlzdWIJYmwsIGNsCi0JeG9yCWVheCwgZWF4Ci0JaW5jCWVheAotCXNobAllYXgsIGNsCi0JZGVjCWVheCAgICAgICAgICAgICAgICAgLyogKDEgPDwgb3ApIC0gMSAqLwotCWFuZAllYXgsIGVkeCAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotCXNocgllZHgsIGNsCi0JYWRkCWVicCwgZWF4ICAgICAgICAgIC8qIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKSAqLwotCi1MX2NoZWNrX3dpbmRvdzoKLQltb3YJW2VzcCs4XSwgZXNpICAgICAgIC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovCi0JbW92CWVheCwgZWRpCi0Jc3ViCWVheCwgW2VzcCsyMF0gICAgICAvKiBuYnl0ZXMgPSBvdXQgLSBiZWcgKi8KLQotCWNtcAllYXgsIGVicAotCWpiCUxfY2xpcF93aW5kb3cgICAgICAgIC8qIGlmIChkaXN0ID4gbmJ5dGVzKSA0LjIlICovCi0KLQltb3YJZWN4LCBbZXNwKzY0XSAgICAgIC8qIGVjeCA9IGxlbiAqLwotCW1vdgllc2ksIGVkaQotCXN1Ygllc2ksIGVicCAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotCi0Jc2FyCWVjeCwgMQotCWpuYwlMX2NvcHlfdHdvCi0KLQlyZXAgICAgIG1vdnN3Ci0JbW92CWFsLCBbZXNpXQotCW1vdglbZWRpXSwgYWwKLQlpbmMJZWRpCi0KLQltb3YJZXNpLCBbZXNwKzhdICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLwotCW1vdgllYnAsIFtlc3ArMzJdICAgICAvKiBlYnAgPSBsY29kZSAqLwotCWptcAlMX3doaWxlX3Rlc3QKLQotTF9jb3B5X3R3bzoKLQlyZXAgICAgIG1vdnN3Ci0JbW92CWVzaSwgW2VzcCs4XSAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KLQltb3YJZWJwLCBbZXNwKzMyXSAgICAgLyogZWJwID0gbGNvZGUgKi8KLQlqbXAJTF93aGlsZV90ZXN0Ci0KLUFMSUdOIDQKLUxfY2hlY2tfZGlzdF9vbmU6Ci0JY21wCWVicCwgMSAgICAgICAgICAgIC8qIGlmIGRpc3QgMSwgaXMgYSBtZW1zZXQgKi8KLQlqbmUJTF9jaGVja193aW5kb3cKLQljbXAJW2VzcCsyMF0sIGVkaQotCWplCUxfY2hlY2tfd2luZG93ICAgIC8qIG91dCA9PSBiZWcsIGlmIG91dHNpZGUgd2luZG93ICovCi0KLQltb3YJZWN4LCBbZXNwKzY0XSAgICAgLyogZWN4ID0gbGVuICovCi0JbW92CWFsLCBbZWRpLTFdCi0JbW92CWFoLCBhbAotCi0Jc2FyCWVjeCwgMQotCWpuYwlMX3NldF90d28KLQltb3YJW2VkaV0sIGFsICAgICAgICAgLyogbWVtc2V0IG91dCB3aXRoIGZyb21bLTFdICovCi0JaW5jCWVkaQotCi1MX3NldF90d286Ci0JcmVwICAgICBzdG9zdwotCW1vdgllYnAsIFtlc3ArMzJdICAgICAvKiBlYnAgPSBsY29kZSAqLwotCWptcAlMX3doaWxlX3Rlc3QKLQotQUxJR04gNAotTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoOgotCXRlc3QJYWwsIDY0Ci0Jam56CUxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KLQotCXhvcgllYXgsIGVheAotCWluYwllYXgKLQlzaGwJZWF4LCBjbAotCWRlYwllYXgKLQlhbmQJZWF4LCBlZHggICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotCWFkZAllYXgsIFtlc3ArNjRdICAgICAvKiBlYXggKz0gbGVuICovCi0JbW92CWVheCwgW2VicCtlYXgqNF0gLyogZWF4ID0gbGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLwotCWptcAlMX2RvbGVuCi0KLUFMSUdOIDQKLUxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3Q6Ci0JdGVzdAlhbCwgNjQKLQlqbnoJTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLwotCi0JeG9yCWVheCwgZWF4Ci0JaW5jCWVheAotCXNobAllYXgsIGNsCi0JZGVjCWVheAotCWFuZAllYXgsIGVkeCAgICAgICAgIC8qIGVheCAmPSBob2xkICovCi0JYWRkCWVheCwgZWJwICAgICAgICAgLyogZWF4ICs9IGRpc3QgKi8KLQltb3YJZWN4LCBbZXNwKzM2XSAgICAgLyogZWN4ID0gZGNvZGUgKi8KLQltb3YJZWF4LCBbZWN4K2VheCo0XSAvKiBlYXggPSBkY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovCi0Jam1wCUxfZG9kaXN0Ci0KLUFMSUdOIDQKLUxfY2xpcF93aW5kb3c6Ci0JbW92CWVjeCwgZWF4Ci0JbW92CWVheCwgW2VzcCs0OF0gICAgIC8qIGVheCA9IHdzaXplICovCi0JbmVnCWVjeCAgICAgICAgICAgICAgICAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovCi0JbW92CWVzaSwgW2VzcCsyOF0gICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KLQotCWNtcAllYXgsIGVicAotCWpiCUxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyIC8qIGlmIChkaXN0ID4gd3NpemUpICovCi0KLQlhZGQJZWN4LCBlYnAgICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCi0JY21wCWR3b3JkIHB0ciBbZXNwKzUyXSwgMAotCWpuZQlMX3dyYXBfYXJvdW5kX3dpbmRvdyAvKiBpZiAod3JpdGUgIT0gMCkgKi8KLQotCXN1YgllYXgsIGVjeAotCWFkZAllc2ksIGVheCAgICAgICAgIC8qIGZyb20gKz0gd3NpemUgLSBuYnl0ZXMgKi8KLQotCW1vdgllYXgsIFtlc3ArNjRdICAgIC8qIGVheCA9IGxlbiAqLwotCWNtcAllYXgsIGVjeAotCWpiZQlMX2RvX2NvcHkgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLQlzdWIJZWF4LCBlY3ggICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0JcmVwICAgICBtb3ZzYgotCW1vdgllc2ksIGVkaQotCXN1Ygllc2ksIGVicCAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0Jam1wCUxfZG9fY29weQotCi1BTElHTiA0Ci1MX3dyYXBfYXJvdW5kX3dpbmRvdzoKLQltb3YJZWF4LCBbZXNwKzUyXSAgICAvKiBlYXggPSB3cml0ZSAqLwotCWNtcAllY3gsIGVheAotCWpiZQlMX2NvbnRpZ3VvdXNfaW5fd2luZG93IC8qIGlmICh3cml0ZSA+PSBuYnl0ZXMpICovCi0KLQlhZGQJZXNpLCBbZXNwKzQ4XSAgICAvKiBmcm9tICs9IHdzaXplICovCi0JYWRkCWVzaSwgZWF4ICAgICAgICAgLyogZnJvbSArPSB3cml0ZSAqLwotCXN1Ygllc2ksIGVjeCAgICAgICAgIC8qIGZyb20gLT0gbmJ5dGVzICovCi0Jc3ViCWVjeCwgZWF4ICAgICAgICAgLyogbmJ5dGVzIC09IHdyaXRlICovCi0KLQltb3YJZWF4LCBbZXNwKzY0XSAgICAvKiBlYXggPSBsZW4gKi8KLQljbXAJZWF4LCBlY3gKLQlqYmUJTF9kb19jb3B5ICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0Jc3ViCWVheCwgZWN4ICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotCXJlcCAgICAgbW92c2IKLQltb3YJZXNpLCBbZXNwKzI4XSAgICAgLyogZnJvbSA9IHdpbmRvdyAqLwotCW1vdgllY3gsIFtlc3ArNTJdICAgICAvKiBuYnl0ZXMgPSB3cml0ZSAqLwotCWNtcAllYXgsIGVjeAotCWpiZQlMX2RvX2NvcHkgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLQlzdWIJZWF4LCBlY3ggICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0JcmVwICAgICBtb3ZzYgotCW1vdgllc2ksIGVkaQotCXN1Ygllc2ksIGVicCAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0Jam1wCUxfZG9fY29weQotCi1BTElHTiA0Ci1MX2NvbnRpZ3VvdXNfaW5fd2luZG93OgotCWFkZAllc2ksIGVheAotCXN1Ygllc2ksIGVjeCAgICAgICAgIC8qIGZyb20gKz0gd3JpdGUgLSBuYnl0ZXMgKi8KLQotCW1vdgllYXgsIFtlc3ArNjRdICAgIC8qIGVheCA9IGxlbiAqLwotCWNtcAllYXgsIGVjeAotCWpiZQlMX2RvX2NvcHkgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLQlzdWIJZWF4LCBlY3ggICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0JcmVwICAgICBtb3ZzYgotCW1vdgllc2ksIGVkaQotCXN1Ygllc2ksIGVicCAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0Jam1wCUxfZG9fY29weQotCi1BTElHTiA0Ci1MX2RvX2NvcHk6Ci0JbW92CWVjeCwgZWF4Ci0JcmVwICAgICBtb3ZzYgotCi0JbW92CWVzaSwgW2VzcCs4XSAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KLQltb3YJZWJwLCBbZXNwKzMyXSAgICAgLyogZWJwID0gbGNvZGUgKi8KLQlqbXAJTF93aGlsZV90ZXN0Ci0KLUxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrOgotCXRlc3QJYWwsIDMyCi0JanoJTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGUKLQltb3YJZHdvcmQgcHRyIFtlc3ArNzJdLCAxCi0Jam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cwotCi1MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZToKLQltb3YJZHdvcmQgcHRyIFtlc3ArNzJdLCAyCi0Jam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cwotCi1MX2ludmFsaWRfZGlzdGFuY2VfY29kZToKLQltb3YJZHdvcmQgcHRyIFtlc3ArNzJdLCAzCi0Jam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cwotCi1MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjoKLQltb3YJZXNpLCBbZXNwKzRdCi0JbW92CWR3b3JkIHB0ciBbZXNwKzcyXSwgNAotCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMKLQotTF9icmVha19sb29wOgotCW1vdglkd29yZCBwdHIgW2VzcCs3Ml0sIDAKLQotTF9icmVha19sb29wX3dpdGhfc3RhdHVzOgotLyogcHV0IGluLCBvdXQsIGJpdHMsIGFuZCBob2xkIGJhY2sgaW50byBhciBhbmQgcG9wIGVzcCAqLwotCW1vdglbZXNwKzhdLCBlc2kgICAgIC8qIHNhdmUgaW4gKi8KLQltb3YJW2VzcCsxNl0sIGVkaSAgICAvKiBzYXZlIG91dCAqLwotCW1vdglbZXNwKzQ0XSwgZWJ4ICAgIC8qIHNhdmUgYml0cyAqLwotCW1vdglbZXNwKzQwXSwgZWR4ICAgIC8qIHNhdmUgaG9sZCAqLwotCW1vdgllYnAsIFtlc3ArNF0gICAgIC8qIHJlc3RvcmUgZXNwLCBlYnAgKi8KLQltb3YJZXNwLCBbZXNwXQotICAgIH0KLSNlbHNlCi0jZXJyb3IgIng4NiBhcmNoaXRlY3R1cmUgbm90IGRlZmluZWQiCi0jZW5kaWYKLQotICAgIGlmIChhci5zdGF0dXMgPiAxKSB7Ci0gICAgICAgIGlmIChhci5zdGF0dXMgPT0gMikKLSAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwotICAgICAgICBlbHNlIGlmIChhci5zdGF0dXMgPT0gMykKLSAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwotICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGFyLnN0YXR1cyA9PSAxICkgewotICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7Ci0gICAgfQotCi0gICAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovCi0gICAgYXIubGVuID0gYXIuYml0cyA+PiAzOwotICAgIGFyLmluIC09IGFyLmxlbjsKLSAgICBhci5iaXRzIC09IGFyLmxlbiA8PCAzOwotICAgIGFyLmhvbGQgJj0gKDFVIDw8IGFyLmJpdHMpIC0gMTsKLQotICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovCi0gICAgc3RybS0+bmV4dF9pbiA9IGFyLmluOwotICAgIHN0cm0tPm5leHRfb3V0ID0gYXIub3V0OwotICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKShhci5pbiA8IGFyLmxhc3QgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfSU4gKyAoYXIubGFzdCAtIGFyLmluKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBRF9BVkFJTF9JTiAtIChhci5pbiAtIGFyLmxhc3QpKTsKLSAgICBzdHJtLT5hdmFpbF9vdXQgPSAodW5zaWduZWQpKGFyLm91dCA8IGFyLmVuZCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfT1VUICsgKGFyLmVuZCAtIGFyLm91dCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX09VVCAtIChhci5vdXQgLSBhci5lbmQpKTsKLSAgICBzdGF0ZS0+aG9sZCA9IGFyLmhvbGQ7Ci0gICAgc3RhdGUtPmJpdHMgPSBhci5iaXRzOwotICAgIHJldHVybjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhc3QuUyBiL2xpYnMvemxpYi9jb250cmliL2luZmxhdGU4Ni9pbmZmYXN0LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNDVhMjkuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhc3QuUworKysgL2Rldi9udWxsCkBAIC0xLDEzNjggKzAsMCBAQAotLyoKLSAqIGluZmZhc3QuUyBpcyBhIGhhbmQgdHVuZWQgYXNzZW1ibGVyIHZlcnNpb24gb2Y6Ci0gKgotICogaW5mZmFzdC5jIC0tIGZhc3QgZGVjb2RpbmcKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ2hyaXMgQW5kZXJzb24gPGNocmlzdG9wQGNoYXJtLm5ldD4KLSAqIFBsZWFzZSB1c2UgdGhlIGNvcHlyaWdodCBjb25kaXRpb25zIGFib3ZlLgotICoKLSAqIFRoaXMgdmVyc2lvbiAoSmFuLTIzLTIwMDMpIG9mIGluZmxhdGVfZmFzdCB3YXMgY29kZWQgYW5kIHRlc3RlZCB1bmRlcgotICogR05VL0xpbnV4IG9uIGEgcGVudGl1bSAzLCB1c2luZyB0aGUgZ2NjLTMuMiBjb21waWxlciBkaXN0cmlidXRpb24uICBPbiB0aGF0Ci0gKiBtYWNoaW5lLCBJIGZvdW5kIHRoYXQgZ3ppcCBzdHlsZSBhcmNoaXZlcyBkZWNvbXByZXNzZWQgYWJvdXQgMjAlIGZhc3RlciB0aGFuCi0gKiB0aGUgZ2NjLTMuMiAtTzMgLWZvbWl0LWZyYW1lLXBvaW50ZXIgY29tcGlsZWQgdmVyc2lvbi4gIFlvdXIgcmVzdWx0cyB3aWxsCi0gKiBkZXBlbmQgb24gaG93IGxhcmdlIG9mIGEgYnVmZmVyIGlzIHVzZWQgZm9yIHpfc3RyZWFtLm5leHRfaW4gJiBuZXh0X291dAotICogKDhLLTMySyB3b3JrZWQgYmVzdCBmb3IgbXkgMjU2SyBjcHUgY2FjaGUpIGFuZCBob3cgbXVjaCBvdmVyaGVhZCB0aGVyZSBpcyBpbgotICogc3RyZWFtIHByb2Nlc3NpbmcgSS9PIGFuZCBjcmMzMi9hZGRsZXIzMi4gIEluIG15IGNhc2UsIHRoaXMgcm91dGluZSB1c2VkCi0gKiA3MCUgb2YgdGhlIGNwdSB0aW1lIGFuZCBjcmMzMiB1c2VkIDIwJS4KLSAqCi0gKiBJIGFtIGNvbmZpZGVudCB0aGF0IHRoaXMgdmVyc2lvbiB3aWxsIHdvcmsgaW4gdGhlIGdlbmVyYWwgY2FzZSwgYnV0IEkgaGF2ZQotICogbm90IHRlc3RlZCBhIHdpZGUgdmFyaWV0eSBvZiBkYXRhc2V0cyBvciBhIHdpZGUgdmFyaWV0eSBvZiBwbGF0Zm9ybXMuCi0gKgotICogSmFuLTI0LTIwMDMgLS0gQWRkZWQgLURVU0VfTU1YIGRlZmluZSBmb3Igc2xpZ2h0bHkgZmFzdGVyIGluZmxhdGluZy4KLSAqIEl0IHNob3VsZCBiZSBhIHJ1bnRpbWUgZmxhZyBpbnN0ZWFkIG9mIGNvbXBpbGUgdGltZSBmbGFnLi4uCi0gKgotICogSmFuLTI2LTIwMDMgLS0gQWRkZWQgcnVudGltZSBjaGVjayBmb3IgTU1YIHN1cHBvcnQgd2l0aCBjcHVpZCBpbnN0cnVjdGlvbi4KLSAqIFdpdGggLURVU0VfTU1YLCBvbmx5IE1NWCBjb2RlIGlzIGNvbXBpbGVkLiAgV2l0aCAtRE5PX01NWCwgb25seSBub24tTU1YIGNvZGUKLSAqIGlzIGNvbXBpbGVkLiAgV2l0aG91dCBlaXRoZXIgb3B0aW9uLCBydW50aW1lIGRldGVjdGlvbiBpcyBlbmFibGVkLiAgUnVudGltZQotICogZGV0ZWN0aW9uIHNob3VsZCB3b3JrIG9uIGFsbCBtb2Rlcm4gY3B1cyBhbmQgdGhlIHJlY29tZW5kZWQgYWxnb3JpdGhtIChmbGlwCi0gKiBJRCBiaXQgb24gZWZsYWdzIGFuZCB0aGVuIHVzZSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24pIGlzIHVzZWQgaW4gbWFueQotICogbXVsdGltZWRpYSBhcHBsaWNhdGlvbnMuICBUZXN0ZWQgdW5kZXIgd2luMmsgd2l0aCBnY2MtMi45NSBhbmQgZ2FzLTIuMTIKLSAqIGRpc3RyaWJ1dGVkIHdpdGggY3lnd2luMy4gIENvbXBpbGluZyB3aXRoIGdjYy0yLjk1IC1jIGluZmZhc3QuUyAtbwotICogaW5mZmFzdC5vYmogZ2VuZXJhdGVzIGEgQ09GRiBvYmplY3Qgd2hpY2ggY2FuIHRoZW4gYmUgbGlua2VkIHdpdGggTVNWQysrCi0gKiBjb21waWxlZCBjb2RlLiAgVGVzdGVkIHVuZGVyIEZyZWVCU0QgNC43IHdpdGggZ2NjLTIuOTUuCi0gKgotICogSmFuLTI4LTIwMDMgLS0gVGVzdGVkIEF0aGxvbiBYUC4uLiBNTVggbW9kZSBpcyBzbG93ZXIgdGhhbiBubyBNTVggKGFuZAotICogc2xvd2VyIHRoYW4gY29tcGlsZXIgZ2VuZXJhdGVkIGNvZGUpLiAgQWRqdXN0ZWQgY3B1aWQgY2hlY2sgdG8gdXNlIHRoZSBNTVgKLSAqIGNvZGUgb25seSBmb3IgUGVudGl1bXMgPCBQNCB1bnRpbCBJIGhhdmUgbW9yZSBkYXRhIG9uIHRoZSBQNC4gIFNwZWVkCi0gKiBpbXByb3ZtZW50IGlzIG9ubHkgYWJvdXQgMTUlIG9uIHRoZSBBdGhsb24gd2hlbiBjb21wYXJlZCB3aXRoIGNvZGUgZ2VuZXJhdGVkCi0gKiB3aXRoIE1TVkMrKy4gIE5vdCBzdXJlIHlldCwgYnV0IEkgdGhpbmsgdGhlIFA0IHdpbGwgYWxzbyBiZSBzbG93ZXIgdXNpbmcgdGhlCi0gKiBNTVggbW9kZSBiZWNhdXNlIG1hbnkgb2YgaXQncyB4ODYgQUxVIGluc3RydWN0aW9ucyBleGVjdXRlIGluIC41IGN5Y2xlcyBhbmQKLSAqIGhhdmUgbGVzcyBsYXRlbmN5IHRoYW4gTU1YIG9wcy4gIEFkZGVkIGNvZGUgdG8gYnVmZmVyIHRoZSBsYXN0IDExIGJ5dGVzIG9mCi0gKiB0aGUgaW5wdXQgc3RyZWFtIHNpbmNlIHRoZSBNTVggY29kZSBncmFicyBiaXRzIGluIGNodW5rcyBvZiAzMiwgd2hpY2gKLSAqIGRpZmZlcnMgZnJvbSB0aGUgaW5mZmFzdC5jIGFsZ29yaXRobS4gIEkgZG9uJ3QgdGhpbmsgdGhlcmUgd291bGQgaGF2ZSBiZWVuCi0gKiByZWFkIG92ZXJydW5zIHdoZXJlIGEgcGFnZSBib3VuZGFyeSB3YXMgY3Jvc3NlZCAoYSBzZWdmYXVsdCksIGJ1dCB0aGVyZQotICogY291bGQgaGF2ZSBiZWVuIG92ZXJydW5zIHdoZW4gbmV4dF9pbiBlbmRzIG9uIHVuYWxpZ25lZCBtZW1vcnkgKHVuaW50aWFsaXplZAotICogbWVtb3J5IHJlYWQpLgotICoKLSAqIE1hci0xMy0yMDAzIC0tIFA0IE1NWCBpcyBzbGlnaHRseSBzbG93ZXIgdGhhbiBQNCBOT19NTVguICBJIGNyZWF0ZWQgYSBDCi0gKiB2ZXJzaW9uIG9mIHRoZSBub24tTU1YIGNvZGUgc28gdGhhdCBpdCBkb2Vzbid0IGRlcGVuZCBvbiB6c3RybSBhbmQgenN0YXRlCi0gKiBzdHJ1Y3R1cmUgb2Zmc2V0cyB3aGljaCBhcmUgaGFyZCBjb2RlZCBpbiB0aGlzIGZpbGUuICBUaGlzIHdhcyBsYXN0IHRlc3RlZAotICogd2l0aCB6bGliLTEuMi4wIHdoaWNoIGlzIGN1cnJlbnRseSBpbiBiZXRhIHRlc3RpbmcsIG5ld2VyIHZlcnNpb25zIG9mIHRoaXMKLSAqIGFuZCBpbmZmYXM4Ni5jIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vd3d3LmVldGJlZXRlZS5jb20vemxpYi8gYW5kCi0gKiBodHRwOi8vd3d3LmNoYXJtLm5ldC9+Y2hyaXN0b3AvemxpYi8KLSAqLwotCi0KLS8qCi0gKiBpZiB5b3UgaGF2ZSB1bmRlcnNjb3JlIGxpbmtpbmcgcHJvYmxlbXMgKF9pbmZsYXRlX2Zhc3QgdW5kZWZpbmVkKSwgdHJ5Ci0gKiB1c2luZyAtREdBU19DT0ZGCi0gKi8KLSNpZiAhIGRlZmluZWQoIEdBU19DT0ZGICkgJiYgISBkZWZpbmVkKCBHQVNfRUxGICkKLQotI2lmIGRlZmluZWQoIFdJTjMyICkgfHwgZGVmaW5lZCggX19DWUdXSU5fXyApCi0jZGVmaW5lIEdBU19DT0ZGIC8qIHdpbmRvd3Mgb2JqZWN0IGZvcm1hdCAqLwotI2Vsc2UKLSNkZWZpbmUgR0FTX0VMRgotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIEdBU19DT0ZGICYmICEgR0FTX0VMRiAqLwotCi0KLSNpZiBkZWZpbmVkKCBHQVNfQ09GRiApCi0KLS8qIGNvZmYgZXh0ZXJuYWxzIGhhdmUgdW5kZXJzY29yZXMgKi8KLSNkZWZpbmUgaW5mbGF0ZV9mYXN0IF9pbmZsYXRlX2Zhc3QKLSNkZWZpbmUgaW5mbGF0ZV9mYXN0X3VzZV9tbXggX2luZmxhdGVfZmFzdF91c2VfbW14Ci0KLSNlbmRpZiAvKiBHQVNfQ09GRiAqLwotCi0KLS5maWxlICJpbmZmYXN0LlMiCi0KLS5nbG9ibCBpbmZsYXRlX2Zhc3QKLQotLnRleHQKLS5hbGlnbiA0LDAKLS5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZV9tc2c6Ci0uc3RyaW5nICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiCi0KLS5hbGlnbiA0LDAKLS5MX2ludmFsaWRfZGlzdGFuY2VfY29kZV9tc2c6Ci0uc3RyaW5nICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiCi0KLS5hbGlnbiA0LDAKLS5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2c6Ci0uc3RyaW5nICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIKLQotI2lmICEgZGVmaW5lZCggTk9fTU1YICkKLS5hbGlnbiA0LDAKLS5MX21hc2s6IC8qIG1hc2tbTl0gPSAoIDEgPDwgTiApIC0gMSAqLwotLmxvbmcgMAotLmxvbmcgMQotLmxvbmcgMwotLmxvbmcgNwotLmxvbmcgMTUKLS5sb25nIDMxCi0ubG9uZyA2MwotLmxvbmcgMTI3Ci0ubG9uZyAyNTUKLS5sb25nIDUxMQotLmxvbmcgMTAyMwotLmxvbmcgMjA0NwotLmxvbmcgNDA5NQotLmxvbmcgODE5MQotLmxvbmcgMTYzODMKLS5sb25nIDMyNzY3Ci0ubG9uZyA2NTUzNQotLmxvbmcgMTMxMDcxCi0ubG9uZyAyNjIxNDMKLS5sb25nIDUyNDI4NwotLmxvbmcgMTA0ODU3NQotLmxvbmcgMjA5NzE1MQotLmxvbmcgNDE5NDMwMwotLmxvbmcgODM4ODYwNwotLmxvbmcgMTY3NzcyMTUKLS5sb25nIDMzNTU0NDMxCi0ubG9uZyA2NzEwODg2MwotLmxvbmcgMTM0MjE3NzI3Ci0ubG9uZyAyNjg0MzU0NTUKLS5sb25nIDUzNjg3MDkxMQotLmxvbmcgMTA3Mzc0MTgyMwotLmxvbmcgMjE0NzQ4MzY0NwotLmxvbmcgNDI5NDk2NzI5NQotI2VuZGlmIC8qIE5PX01NWCAqLwotCi0udGV4dAotCi0vKgotICogc3RydWN0IHpfc3RyZWFtIG9mZnNldHMsIGluIHpsaWIuaAotICovCi0jZGVmaW5lIG5leHRfaW5fc3RybSAgIDAgICAvKiBzdHJtLT5uZXh0X2luICovCi0jZGVmaW5lIGF2YWlsX2luX3N0cm0gIDQgICAvKiBzdHJtLT5hdmFpbF9pbiAqLwotI2RlZmluZSBuZXh0X291dF9zdHJtICAxMiAgLyogc3RybS0+bmV4dF9vdXQgKi8KLSNkZWZpbmUgYXZhaWxfb3V0X3N0cm0gMTYgIC8qIHN0cm0tPmF2YWlsX291dCAqLwotI2RlZmluZSBtc2dfc3RybSAgICAgICAyNCAgLyogc3RybS0+bXNnICovCi0jZGVmaW5lIHN0YXRlX3N0cm0gICAgIDI4ICAvKiBzdHJtLT5zdGF0ZSAqLwotCi0vKgotICogc3RydWN0IGluZmxhdGVfc3RhdGUgb2Zmc2V0cywgaW4gaW5mbGF0ZS5oCi0gKi8KLSNkZWZpbmUgbW9kZV9zdGF0ZSAgICAgMCAgIC8qIHN0YXRlLT5tb2RlICovCi0jZGVmaW5lIHdzaXplX3N0YXRlICAgIDMyICAvKiBzdGF0ZS0+d3NpemUgKi8KLSNkZWZpbmUgd3JpdGVfc3RhdGUgICAgNDAgIC8qIHN0YXRlLT53cml0ZSAqLwotI2RlZmluZSB3aW5kb3dfc3RhdGUgICA0NCAgLyogc3RhdGUtPndpbmRvdyAqLwotI2RlZmluZSBob2xkX3N0YXRlICAgICA0OCAgLyogc3RhdGUtPmhvbGQgKi8KLSNkZWZpbmUgYml0c19zdGF0ZSAgICAgNTIgIC8qIHN0YXRlLT5iaXRzICovCi0jZGVmaW5lIGxlbmNvZGVfc3RhdGUgIDY4ICAvKiBzdGF0ZS0+bGVuY29kZSAqLwotI2RlZmluZSBkaXN0Y29kZV9zdGF0ZSA3MiAgLyogc3RhdGUtPmRpc3Rjb2RlICovCi0jZGVmaW5lIGxlbmJpdHNfc3RhdGUgIDc2ICAvKiBzdGF0ZS0+bGVuYml0cyAqLwotI2RlZmluZSBkaXN0Yml0c19zdGF0ZSA4MCAgLyogc3RhdGUtPmRpc3RiaXRzICovCi0KLS8qCi0gKiBpbmZsYXRlX2Zhc3QncyBhY3RpdmF0aW9uIHJlY29yZAotICovCi0jZGVmaW5lIGxvY2FsX3Zhcl9zaXplIDY0IC8qIGhvdyBtdWNoIGxvY2FsIHNwYWNlIGZvciB2YXJzICovCi0jZGVmaW5lIHN0cm1fc3AgICAgICAgIDg4IC8qIGZpcnN0IGFyZzogel9zdHJlYW0gKiAobG9jYWxfdmFyX3NpemUgKyAyNCkgKi8KLSNkZWZpbmUgc3RhcnRfc3AgICAgICAgOTIgLyogc2Vjb25kIGFyZzogdW5zaWduZWQgaW50IChsb2NhbF92YXJfc2l6ZSArIDI4KSAqLwotCi0vKgotICogb2Zmc2V0cyBmb3IgbG9jYWwgdmFycyBvbiBzdGFjawotICovCi0jZGVmaW5lIG91dCAgICAgICAgICAgIDYwICAvKiB1bnNpZ25lZCBjaGFyKiAqLwotI2RlZmluZSB3aW5kb3cgICAgICAgICA1NiAgLyogdW5zaWduZWQgY2hhciogKi8KLSNkZWZpbmUgd3NpemUgICAgICAgICAgNTIgIC8qIHVuc2lnbmVkIGludCAqLwotI2RlZmluZSB3cml0ZSAgICAgICAgICA0OCAgLyogdW5zaWduZWQgaW50ICovCi0jZGVmaW5lIGluICAgICAgICAgICAgIDQ0ICAvKiB1bnNpZ25lZCBjaGFyKiAqLwotI2RlZmluZSBiZWcgICAgICAgICAgICA0MCAgLyogdW5zaWduZWQgY2hhciogKi8KLSNkZWZpbmUgYnVmICAgICAgICAgICAgMjggIC8qIGNoYXJbIDEyIF0gKi8KLSNkZWZpbmUgbGVuICAgICAgICAgICAgMjQgIC8qIHVuc2lnbmVkIGludCAqLwotI2RlZmluZSBsYXN0ICAgICAgICAgICAyMCAgLyogdW5zaWduZWQgY2hhciogKi8KLSNkZWZpbmUgZW5kICAgICAgICAgICAgMTYgIC8qIHVuc2lnbmVkIGNoYXIqICovCi0jZGVmaW5lIGRjb2RlICAgICAgICAgIDEyICAvKiBjb2RlKiAqLwotI2RlZmluZSBsY29kZSAgICAgICAgICAgOCAgLyogY29kZSogKi8KLSNkZWZpbmUgZG1hc2sgICAgICAgICAgIDQgIC8qIHVuc2lnbmVkIGludCAqLwotI2RlZmluZSBsbWFzayAgICAgICAgICAgMCAgLyogdW5zaWduZWQgaW50ICovCi0KLS8qCi0gKiB0eXBlZGVmIGVudW0gaW5mbGF0ZV9tb2RlIGNvbnN0cywgaW4gaW5mbGF0ZS5oCi0gKi8KLSNkZWZpbmUgSU5GTEFURV9NT0RFX1RZUEUgMTEgIC8qIHN0YXRlLT5tb2RlIGZsYWdzIGVudW0tZWQgaW4gaW5mbGF0ZS5oICovCi0jZGVmaW5lIElORkxBVEVfTU9ERV9CQUQgIDI2Ci0KLQotI2lmICEgZGVmaW5lZCggVVNFX01NWCApICYmICEgZGVmaW5lZCggTk9fTU1YICkKLQotI2RlZmluZSBSVU5fVElNRV9NTVgKLQotI2RlZmluZSBDSEVDS19NTVggICAgMQotI2RlZmluZSBET19VU0VfTU1YICAgMgotI2RlZmluZSBET05UX1VTRV9NTVggMwotCi0uZ2xvYmwgaW5mbGF0ZV9mYXN0X3VzZV9tbXgKLQotLmRhdGEKLQotLmFsaWduIDQsMAotaW5mbGF0ZV9mYXN0X3VzZV9tbXg6IC8qIGludGVnZXIgZmxhZyBmb3IgcnVuIHRpbWUgY29udHJvbCAxPWNoZWNrLDI9bW14LDM9bm8gKi8KLS5sb25nIENIRUNLX01NWAotCi0jaWYgZGVmaW5lZCggR0FTX0VMRiApCi0vKiBlbGYgaW5mbyAqLwotLnR5cGUgICBpbmZsYXRlX2Zhc3RfdXNlX21teCxAb2JqZWN0Ci0uc2l6ZSAgIGluZmxhdGVfZmFzdF91c2VfbW14LDQKLSNlbmRpZgotCi0jZW5kaWYgLyogUlVOX1RJTUVfTU1YICovCi0KLSNpZiBkZWZpbmVkKCBHQVNfQ09GRiApCi0vKiBjb2ZmIGluZm86IHNjbCAyID0gZXh0ZXJuLCB0eXBlIDMyID0gZnVuY3Rpb24gKi8KLS5kZWYgaW5mbGF0ZV9mYXN0OyAuc2NsIDI7IC50eXBlIDMyOyAuZW5kZWYKLSNlbmRpZgotCi0udGV4dAotCi0uYWxpZ24gMzIsMHg5MAotaW5mbGF0ZV9mYXN0OgotICAgICAgICBwdXNobCAgICVlZGkKLSAgICAgICAgcHVzaGwgICAlZXNpCi0gICAgICAgIHB1c2hsICAgJWVicAotICAgICAgICBwdXNobCAgICVlYngKLSAgICAgICAgcHVzaGYgICAvKiBzYXZlIGVmbGFncyAoc3RybV9zcCwgc3RhdGVfc3AgYXNzdW1lcyB0aGlzIGlzIDMyIGJpdHMpICovCi0gICAgICAgIHN1YmwgICAgJGxvY2FsX3Zhcl9zaXplLCAlZXNwCi0gICAgICAgIGNsZAotCi0jZGVmaW5lIHN0cm1fciAgJWVzaQotI2RlZmluZSBzdGF0ZV9yICVlZGkKLQotICAgICAgICBtb3ZsICAgIHN0cm1fc3AoJWVzcCksIHN0cm1fcgotICAgICAgICBtb3ZsICAgIHN0YXRlX3N0cm0oc3RybV9yKSwgc3RhdGVfcgotCi0gICAgICAgIC8qIGluID0gc3RybS0+bmV4dF9pbjsKLSAgICAgICAgICogb3V0ID0gc3RybS0+bmV4dF9vdXQ7Ci0gICAgICAgICAqIGxhc3QgPSBpbiArIHN0cm0tPmF2YWlsX2luIC0gMTE7Ci0gICAgICAgICAqIGJlZyA9IG91dCAtIChzdGFydCAtIHN0cm0tPmF2YWlsX291dCk7Ci0gICAgICAgICAqIGVuZCA9IG91dCArIChzdHJtLT5hdmFpbF9vdXQgLSAyNTcpOwotICAgICAgICAgKi8KLSAgICAgICAgbW92bCAgICBhdmFpbF9pbl9zdHJtKHN0cm1fciksICVlZHgKLSAgICAgICAgbW92bCAgICBuZXh0X2luX3N0cm0oc3RybV9yKSwgJWVheAotCi0gICAgICAgIGFkZGwgICAgJWVheCwgJWVkeCAgICAgIC8qIGF2YWlsX2luICs9IG5leHRfaW4gKi8KLSAgICAgICAgc3VibCAgICAkMTEsICVlZHggICAgICAgLyogYXZhaWxfaW4gLT0gMTEgKi8KLQotICAgICAgICBtb3ZsICAgICVlYXgsIGluKCVlc3ApCi0gICAgICAgIG1vdmwgICAgJWVkeCwgbGFzdCglZXNwKQotCi0gICAgICAgIG1vdmwgICAgc3RhcnRfc3AoJWVzcCksICVlYnAKLSAgICAgICAgbW92bCAgICBhdmFpbF9vdXRfc3RybShzdHJtX3IpLCAlZWN4Ci0gICAgICAgIG1vdmwgICAgbmV4dF9vdXRfc3RybShzdHJtX3IpLCAlZWJ4Ci0KLSAgICAgICAgc3VibCAgICAlZWN4LCAlZWJwICAgICAgLyogc3RhcnQgLT0gYXZhaWxfb3V0ICovCi0gICAgICAgIG5lZ2wgICAgJWVicCAgICAgICAgICAgIC8qIHN0YXJ0ID0gLXN0YXJ0ICovCi0gICAgICAgIGFkZGwgICAgJWVieCwgJWVicCAgICAgIC8qIHN0YXJ0ICs9IG5leHRfb3V0ICovCi0KLSAgICAgICAgc3VibCAgICAkMjU3LCAlZWN4ICAgICAgLyogYXZhaWxfb3V0IC09IDI1NyAqLwotICAgICAgICBhZGRsICAgICVlYngsICVlY3ggICAgICAvKiBhdmFpbF9vdXQgKz0gb3V0ICovCi0KLSAgICAgICAgbW92bCAgICAlZWJ4LCBvdXQoJWVzcCkKLSAgICAgICAgbW92bCAgICAlZWJwLCBiZWcoJWVzcCkKLSAgICAgICAgbW92bCAgICAlZWN4LCBlbmQoJWVzcCkKLQotICAgICAgICAvKiB3c2l6ZSA9IHN0YXRlLT53c2l6ZTsKLSAgICAgICAgICogd3JpdGUgPSBzdGF0ZS0+d3JpdGU7Ci0gICAgICAgICAqIHdpbmRvdyA9IHN0YXRlLT53aW5kb3c7Ci0gICAgICAgICAqIGhvbGQgPSBzdGF0ZS0+aG9sZDsKLSAgICAgICAgICogYml0cyA9IHN0YXRlLT5iaXRzOwotICAgICAgICAgKiBsY29kZSA9IHN0YXRlLT5sZW5jb2RlOwotICAgICAgICAgKiBkY29kZSA9IHN0YXRlLT5kaXN0Y29kZTsKLSAgICAgICAgICogbG1hc2sgPSAoIDEgPDwgc3RhdGUtPmxlbmJpdHMgKSAtIDE7Ci0gICAgICAgICAqIGRtYXNrID0gKCAxIDw8IHN0YXRlLT5kaXN0Yml0cyApIC0gMTsKLSAgICAgICAgICovCi0KLSAgICAgICAgbW92bCAgICBsZW5jb2RlX3N0YXRlKHN0YXRlX3IpLCAlZWF4Ci0gICAgICAgIG1vdmwgICAgZGlzdGNvZGVfc3RhdGUoc3RhdGVfciksICVlY3gKLQotICAgICAgICBtb3ZsICAgICVlYXgsIGxjb2RlKCVlc3ApCi0gICAgICAgIG1vdmwgICAgJWVjeCwgZGNvZGUoJWVzcCkKLQotICAgICAgICBtb3ZsICAgICQxLCAlZWF4Ci0gICAgICAgIG1vdmwgICAgbGVuYml0c19zdGF0ZShzdGF0ZV9yKSwgJWVjeAotICAgICAgICBzaGxsICAgICVjbCwgJWVheAotICAgICAgICBkZWNsICAgICVlYXgKLSAgICAgICAgbW92bCAgICAlZWF4LCBsbWFzayglZXNwKQotCi0gICAgICAgIG1vdmwgICAgJDEsICVlYXgKLSAgICAgICAgbW92bCAgICBkaXN0Yml0c19zdGF0ZShzdGF0ZV9yKSwgJWVjeAotICAgICAgICBzaGxsICAgICVjbCwgJWVheAotICAgICAgICBkZWNsICAgICVlYXgKLSAgICAgICAgbW92bCAgICAlZWF4LCBkbWFzayglZXNwKQotCi0gICAgICAgIG1vdmwgICAgd3NpemVfc3RhdGUoc3RhdGVfciksICVlYXgKLSAgICAgICAgbW92bCAgICB3cml0ZV9zdGF0ZShzdGF0ZV9yKSwgJWVjeAotICAgICAgICBtb3ZsICAgIHdpbmRvd19zdGF0ZShzdGF0ZV9yKSwgJWVkeAotCi0gICAgICAgIG1vdmwgICAgJWVheCwgd3NpemUoJWVzcCkKLSAgICAgICAgbW92bCAgICAlZWN4LCB3cml0ZSglZXNwKQotICAgICAgICBtb3ZsICAgICVlZHgsIHdpbmRvdyglZXNwKQotCi0gICAgICAgIG1vdmwgICAgaG9sZF9zdGF0ZShzdGF0ZV9yKSwgJWVicAotICAgICAgICBtb3ZsICAgIGJpdHNfc3RhdGUoc3RhdGVfciksICVlYngKLQotI3VuZGVmIHN0cm1fcgotI3VuZGVmIHN0YXRlX3IKLQotI2RlZmluZSBpbl9yICAgICAgICVlc2kKLSNkZWZpbmUgZnJvbV9yICAgICAlZXNpCi0jZGVmaW5lIG91dF9yICAgICAgJWVkaQotCi0gICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3IKLSAgICAgICAgbW92bCAgICBsYXN0KCVlc3ApLCAlZWN4Ci0gICAgICAgIGNtcGwgICAgaW5fciwgJWVjeAotICAgICAgICBqYSAgICAgIC5MX2FsaWduX2xvbmcgICAgICAgICAgIC8qIGlmIGluIDwgbGFzdCAqLwotCi0gICAgICAgIGFkZGwgICAgJDExLCAlZWN4ICAgICAgICAgICAgICAgLyogZWN4ID0gJmluWyBhdmFpbF9pbiBdICovCi0gICAgICAgIHN1YmwgICAgaW5fciwgJWVjeCAgICAgICAgICAgICAgLyogZWN4ID0gYXZhaWxfaW4gKi8KLSAgICAgICAgbW92bCAgICAkMTIsICVlYXgKLSAgICAgICAgc3VibCAgICAlZWN4LCAlZWF4ICAgICAgICAgICAgICAvKiBlYXggPSAxMiAtIGF2YWlsX2luICovCi0gICAgICAgIGxlYWwgICAgYnVmKCVlc3ApLCAlZWRpCi0gICAgICAgIHJlcCAgICAgbW92c2IgICAgICAgICAgICAgICAgICAgLyogbWVtY3B5KCBidWYsIGluLCBhdmFpbF9pbiApICovCi0gICAgICAgIG1vdmwgICAgJWVheCwgJWVjeAotICAgICAgICB4b3JsICAgICVlYXgsICVlYXgKLSAgICAgICAgcmVwICAgICBzdG9zYiAgICAgICAgIC8qIG1lbXNldCggJmJ1ZlsgYXZhaWxfaW4gXSwgMCwgMTIgLSBhdmFpbF9pbiApICovCi0gICAgICAgIGxlYWwgICAgYnVmKCVlc3ApLCBpbl9yICAgICAgICAgLyogaW4gPSBidWYgKi8KLSAgICAgICAgbW92bCAgICBpbl9yLCBsYXN0KCVlc3ApICAgICAgICAvKiBsYXN0ID0gaW4sIGRvIGp1c3Qgb25lIGl0ZXJhdGlvbiAqLwotICAgICAgICBqbXAgICAgIC5MX2lzX2FsaWduZWQKLQotICAgICAgICAvKiBhbGlnbiBpbl9yIG9uIGxvbmcgYm91bmRhcnkgKi8KLS5MX2FsaWduX2xvbmc6Ci0gICAgICAgIHRlc3RsICAgJDMsIGluX3IKLSAgICAgICAganogICAgICAuTF9pc19hbGlnbmVkCi0gICAgICAgIHhvcmwgICAgJWVheCwgJWVheAotICAgICAgICBtb3ZiICAgIChpbl9yKSwgJWFsCi0gICAgICAgIGluY2wgICAgaW5fcgotICAgICAgICBtb3ZsICAgICVlYngsICVlY3gKLSAgICAgICAgYWRkbCAgICAkOCwgJWVieAotICAgICAgICBzaGxsICAgICVjbCwgJWVheAotICAgICAgICBvcmwgICAgICVlYXgsICVlYnAKLSAgICAgICAgam1wICAgICAuTF9hbGlnbl9sb25nCi0KLS5MX2lzX2FsaWduZWQ6Ci0gICAgICAgIG1vdmwgICAgb3V0KCVlc3ApLCBvdXRfcgotCi0jaWYgZGVmaW5lZCggTk9fTU1YICkKLSAgICAgICAgam1wICAgICAuTF9kb19sb29wCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoIFVTRV9NTVggKQotICAgICAgICBqbXAgICAgIC5MX2luaXRfbW14Ci0jZW5kaWYKLQotLyoqKiBSdW50aW1lIE1NWCBjaGVjayAqKiovCi0KLSNpZiBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQotLkxfY2hlY2tfbW14OgotICAgICAgICBjbXBsICAgICRET19VU0VfTU1YLCBpbmZsYXRlX2Zhc3RfdXNlX21teAotICAgICAgICBqZSAgICAgIC5MX2luaXRfbW14Ci0gICAgICAgIGphICAgICAgLkxfZG9fbG9vcCAvKiA+IDIgKi8KLQotICAgICAgICBwdXNobCAgICVlYXgKLSAgICAgICAgcHVzaGwgICAlZWJ4Ci0gICAgICAgIHB1c2hsICAgJWVjeAotICAgICAgICBwdXNobCAgICVlZHgKLSAgICAgICAgcHVzaGYKLSAgICAgICAgbW92bCAgICAoJWVzcCksICVlYXggICAgICAvKiBjb3B5IGVmbGFncyB0byBlYXggKi8KLSAgICAgICAgeG9ybCAgICAkMHgyMDAwMDAsICglZXNwKSAvKiB0cnkgdG9nZ2xpbmcgSUQgYml0IG9mIGVmbGFncyAoYml0IDIxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHNlZSBpZiBjcHUgc3VwcG9ydHMgY3B1aWQuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJRCBiaXQgbWV0aG9kIG5vdCBzdXBwb3J0ZWQgYnkgTmV4R2VuIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJpb3MgbWF5IGxvYWQgYSBjcHVpZCBpbnN0cnVjdGlvbiBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjcHVpZCBtYXkgYmUgZGlzYWJsZWQgb24gQ3lyaXggNS02eDg2ICovCi0gICAgICAgIHBvcGYKLSAgICAgICAgcHVzaGYKLSAgICAgICAgcG9wbCAgICAlZWR4ICAgICAgICAgICAgICAvKiBjb3B5IG5ldyBlZmxhZ3MgdG8gZWR4ICovCi0gICAgICAgIHhvcmwgICAgJWVheCwgJWVkeCAgICAgICAgLyogdGVzdCBpZiBJRCBiaXQgaXMgZmxpcHBlZCAqLwotICAgICAgICBqeiAgICAgIC5MX2RvbnRfdXNlX21teCAgIC8qIG5vdCBmbGlwcGVkIGlmIHplcm8gKi8KLSAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4Ci0gICAgICAgIGNwdWlkCi0gICAgICAgIGNtcGwgICAgJDB4NzU2ZTY1NDcsICVlYnggLyogY2hlY2sgZm9yIEdlbnVpbmVJbnRlbCBpbiBlYngsZWN4LGVkeCAqLwotICAgICAgICBqbmUgICAgIC5MX2RvbnRfdXNlX21teAotICAgICAgICBjbXBsICAgICQweDZjNjU3NDZlLCAlZWN4Ci0gICAgICAgIGpuZSAgICAgLkxfZG9udF91c2VfbW14Ci0gICAgICAgIGNtcGwgICAgJDB4NDk2NTZlNjksICVlZHgKLSAgICAgICAgam5lICAgICAuTF9kb250X3VzZV9tbXgKLSAgICAgICAgbW92bCAgICAkMSwgJWVheAotICAgICAgICBjcHVpZCAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBjcHUgZmVhdHVyZXMgKi8KLSAgICAgICAgc2hybCAgICAkOCwgJWVheAotICAgICAgICBhbmRsICAgICQxNSwgJWVheAotICAgICAgICBjbXBsICAgICQ2LCAlZWF4ICAgICAgICAgIC8qIGNoZWNrIGZvciBQZW50aXVtIGZhbWlseSwgaXMgMHhmIGZvciBQNCAqLwotICAgICAgICBqbmUgICAgIC5MX2RvbnRfdXNlX21teAotICAgICAgICB0ZXN0bCAgICQweDgwMDAwMCwgJWVkeCAgIC8qIHRlc3QgaWYgTU1YIGZlYXR1cmUgaXMgc2V0IChiaXQgMjMpICovCi0gICAgICAgIGpueiAgICAgLkxfdXNlX21teAotICAgICAgICBqbXAgICAgIC5MX2RvbnRfdXNlX21teAotLkxfdXNlX21teDoKLSAgICAgICAgbW92bCAgICAkRE9fVVNFX01NWCwgaW5mbGF0ZV9mYXN0X3VzZV9tbXgKLSAgICAgICAgam1wICAgICAuTF9jaGVja19tbXhfcG9wCi0uTF9kb250X3VzZV9tbXg6Ci0gICAgICAgIG1vdmwgICAgJERPTlRfVVNFX01NWCwgaW5mbGF0ZV9mYXN0X3VzZV9tbXgKLS5MX2NoZWNrX21teF9wb3A6Ci0gICAgICAgIHBvcGwgICAgJWVkeAotICAgICAgICBwb3BsICAgICVlY3gKLSAgICAgICAgcG9wbCAgICAlZWJ4Ci0gICAgICAgIHBvcGwgICAgJWVheAotICAgICAgICBqbXAgICAgIC5MX2NoZWNrX21teAotI2VuZGlmCi0KLQotLyoqKiBOb24tTU1YIGNvZGUgKioqLwotCi0jaWYgZGVmaW5lZCAoIE5PX01NWCApIHx8IGRlZmluZWQoIFJVTl9USU1FX01NWCApCi0KLSNkZWZpbmUgaG9sZF9yICAgICAlZWJwCi0jZGVmaW5lIGJpdHNfciAgICAgJWJsCi0jZGVmaW5lIGJpdHNsb25nX3IgJWVieAotCi0uYWxpZ24gMzIsMHg5MAotLkxfd2hpbGVfdGVzdDoKLSAgICAgICAgLyogd2hpbGUgKGluIDwgbGFzdCAmJiBvdXQgPCBlbmQpCi0gICAgICAgICAqLwotICAgICAgICBjbXBsICAgIG91dF9yLCBlbmQoJWVzcCkKLSAgICAgICAgamJlICAgICAuTF9icmVha19sb29wICAgICAgICAgICAvKiBpZiAob3V0ID49IGVuZCkgKi8KLQotICAgICAgICBjbXBsICAgIGluX3IsIGxhc3QoJWVzcCkKLSAgICAgICAgamJlICAgICAuTF9icmVha19sb29wCi0KLS5MX2RvX2xvb3A6Ci0gICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBpbiwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQKLSAgICAgICAgICoKLSAgICAgICAgICogZG8gewotICAgICAgICAgKiAgIGlmIChiaXRzIDwgMTUpIHsKLSAgICAgICAgICogICAgIGhvbGQgfD0gKigodW5zaWduZWQgc2hvcnQgKilpbikrKyA8PCBiaXRzOwotICAgICAgICAgKiAgICAgYml0cyArPSAxNgotICAgICAgICAgKiAgIH0KLSAgICAgICAgICogICB0aGlzID0gbGNvZGVbaG9sZCAmIGxtYXNrXQotICAgICAgICAgKi8KLSAgICAgICAgY21wYiAgICAkMTUsIGJpdHNfcgotICAgICAgICBqYSAgICAgIC5MX2dldF9sZW5ndGhfY29kZSAgICAgIC8qIGlmICgxNSA8IGJpdHMpICovCi0KLSAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4Ci0gICAgICAgIGxvZHN3ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KLSAgICAgICAgbW92YiAgICBiaXRzX3IsICVjbCAgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotICAgICAgICBhZGRiICAgICQxNiwgYml0c19yICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KLSAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKLSAgICAgICAgb3JsICAgICAlZWF4LCBob2xkX3IgICAgICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KLQotLkxfZ2V0X2xlbmd0aF9jb2RlOgotICAgICAgICBtb3ZsICAgIGxtYXNrKCVlc3ApLCAlZWR4ICAgICAgIC8qIGVkeCA9IGxtYXNrICovCi0gICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlY3ggICAgICAgLyogZWN4ID0gbGNvZGUgKi8KLSAgICAgICAgYW5kbCAgICBob2xkX3IsICVlZHggICAgICAgICAgICAvKiBlZHggJj0gaG9sZCAqLwotICAgICAgICBtb3ZsICAgICglZWN4LCVlZHgsNCksICVlYXggICAgIC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8KLQotLkxfZG9sZW46Ci0gICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBpbiwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQKLSAgICAgICAgICoKLSAgICAgICAgICogZG9sZW46Ci0gICAgICAgICAqICAgIGJpdHMgLT0gdGhpcy5iaXRzOwotICAgICAgICAgKiAgICBob2xkID4+PSB0aGlzLmJpdHMKLSAgICAgICAgICovCi0gICAgICAgIG1vdmIgICAgJWFoLCAlY2wgICAgICAgICAgICAgICAgLyogY2wgPSB0aGlzLmJpdHMgKi8KLSAgICAgICAgc3ViYiAgICAlYWgsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLwotICAgICAgICBzaHJsICAgICVjbCwgaG9sZF9yICAgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLwotCi0gICAgICAgIC8qIGNoZWNrIGlmIG9wIGlzIGEgbGl0ZXJhbAotICAgICAgICAgKiBpZiAob3AgPT0gMCkgewotICAgICAgICAgKiAgICBQVVAob3V0KSA9IHRoaXMudmFsOwotICAgICAgICAgKiAgfQotICAgICAgICAgKi8KLSAgICAgICAgdGVzdGIgICAlYWwsICVhbAotICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlIC8qIGlmIChvcCAhPSAwKSA0NS43JSAqLwotCi0gICAgICAgIHNocmwgICAgJDE2LCAlZWF4ICAgICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KLSAgICAgICAgc3Rvc2IKLSAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0Ci0KLS5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlOgotICAgICAgICAvKiByZWdzOiAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gbGVuCi0gICAgICAgICAqCi0gICAgICAgICAqIGVsc2UgaWYgKG9wICYgMTYpIHsKLSAgICAgICAgICogICBsZW4gPSB0aGlzLnZhbAotICAgICAgICAgKiAgIG9wICY9IDE1Ci0gICAgICAgICAqICAgaWYgKG9wKSB7Ci0gICAgICAgICAqICAgICBpZiAob3AgPiBiaXRzKSB7Ci0gICAgICAgICAqICAgICAgIGhvbGQgfD0gKigodW5zaWduZWQgc2hvcnQgKilpbikrKyA8PCBiaXRzOwotICAgICAgICAgKiAgICAgICBiaXRzICs9IDE2Ci0gICAgICAgICAqICAgICB9Ci0gICAgICAgICAqICAgICBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdOwotICAgICAgICAgKiAgICAgYml0cyAtPSBvcDsKLSAgICAgICAgICogICAgIGhvbGQgPj49IG9wOwotICAgICAgICAgKiAgIH0KLSAgICAgICAgICovCi0jZGVmaW5lIGxlbl9yICVlZHgKLSAgICAgICAgbW92bCAgICAlZWF4LCBsZW5fciAgICAgICAgICAgICAvKiBsZW4gPSB0aGlzICovCi0gICAgICAgIHNocmwgICAgJDE2LCBsZW5fciAgICAgICAgICAgICAgLyogbGVuID0gdGhpcy52YWwgKi8KLSAgICAgICAgbW92YiAgICAlYWwsICVjbAotCi0gICAgICAgIHRlc3RiICAgJDE2LCAlYWwKLSAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoIC8qIGlmICgob3AgJiAxNikgPT0gMCkgOCUgKi8KLSAgICAgICAgYW5kYiAgICAkMTUsICVjbCAgICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLwotICAgICAgICBqeiAgICAgIC5MX3NhdmVfbGVuICAgICAgICAgICAgIC8qIGlmICghb3ApICovCi0gICAgICAgIGNtcGIgICAgJWNsLCBiaXRzX3IKLSAgICAgICAgamFlICAgICAuTF9hZGRfYml0c190b19sZW4gICAgICAvKiBpZiAob3AgPD0gYml0cykgKi8KLQotICAgICAgICBtb3ZiICAgICVjbCwgJWNoICAgICAgICAgICAgICAgIC8qIHN0YXNoIG9wIGluIGNoLCBmcmVlaW5nIGNsICovCi0gICAgICAgIHhvcmwgICAgJWVheCwgJWVheAotICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCi0gICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wgICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLSAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCi0gICAgICAgIHNobGwgICAgJWNsLCAlZWF4Ci0gICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yICAgICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCi0gICAgICAgIG1vdmIgICAgJWNoLCAlY2wgICAgICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLwotCi0uTF9hZGRfYml0c190b19sZW46Ci0gICAgICAgIG1vdmwgICAgJDEsICVlYXgKLSAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKLSAgICAgICAgZGVjbCAgICAlZWF4Ci0gICAgICAgIHN1YmIgICAgJWNsLCBiaXRzX3IKLSAgICAgICAgYW5kbCAgICBob2xkX3IsICVlYXggICAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotICAgICAgICBzaHJsICAgICVjbCwgaG9sZF9yCi0gICAgICAgIGFkZGwgICAgJWVheCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLwotCi0uTF9zYXZlX2xlbjoKLSAgICAgICAgbW92bCAgICBsZW5fciwgbGVuKCVlc3ApICAgICAgICAvKiBzYXZlIGxlbiAqLwotI3VuZGVmICBsZW5fcgotCi0uTF9kZWNvZGVfZGlzdGFuY2U6Ci0gICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBpbiwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0Ci0gICAgICAgICAqCi0gICAgICAgICAqICAgaWYgKGJpdHMgPCAxNSkgewotICAgICAgICAgKiAgICAgaG9sZCB8PSAqKCh1bnNpZ25lZCBzaG9ydCAqKWluKSsrIDw8IGJpdHM7Ci0gICAgICAgICAqICAgICBiaXRzICs9IDE2Ci0gICAgICAgICAqICAgfQotICAgICAgICAgKiAgIHRoaXMgPSBkY29kZVtob2xkICYgZG1hc2tdOwotICAgICAgICAgKiBkb2Rpc3Q6Ci0gICAgICAgICAqICAgYml0cyAtPSB0aGlzLmJpdHM7Ci0gICAgICAgICAqICAgaG9sZCA+Pj0gdGhpcy5iaXRzOwotICAgICAgICAgKiAgIG9wID0gdGhpcy5vcDsKLSAgICAgICAgICovCi0KLSAgICAgICAgY21wYiAgICAkMTUsIGJpdHNfcgotICAgICAgICBqYSAgICAgIC5MX2dldF9kaXN0YW5jZV9jb2RlICAgIC8qIGlmICgxNSA8IGJpdHMpICovCi0KLSAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4Ci0gICAgICAgIGxvZHN3ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KLSAgICAgICAgbW92YiAgICBiaXRzX3IsICVjbCAgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotICAgICAgICBhZGRiICAgICQxNiwgYml0c19yICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KLSAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKLSAgICAgICAgb3JsICAgICAlZWF4LCBob2xkX3IgICAgICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KLQotLkxfZ2V0X2Rpc3RhbmNlX2NvZGU6Ci0gICAgICAgIG1vdmwgICAgZG1hc2soJWVzcCksICVlZHggICAgICAgLyogZWR4ID0gZG1hc2sgKi8KLSAgICAgICAgbW92bCAgICBkY29kZSglZXNwKSwgJWVjeCAgICAgICAvKiBlY3ggPSBkY29kZSAqLwotICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVkeCAgICAgICAgICAgIC8qIGVkeCAmPSBob2xkICovCi0gICAgICAgIG1vdmwgICAgKCVlY3gsJWVkeCw0KSwgJWVheCAgICAgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGRtYXNrXSAqLwotCi0jZGVmaW5lIGRpc3RfciAlZWR4Ci0uTF9kb2Rpc3Q6Ci0gICAgICAgIG1vdmwgICAgJWVheCwgZGlzdF9yICAgICAgICAgICAgLyogZGlzdCA9IHRoaXMgKi8KLSAgICAgICAgc2hybCAgICAkMTYsIGRpc3RfciAgICAgICAgICAgICAvKiBkaXN0ID0gdGhpcy52YWwgKi8KLSAgICAgICAgbW92YiAgICAlYWgsICVjbAotICAgICAgICBzdWJiICAgICVhaCwgYml0c19yICAgICAgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCi0gICAgICAgIHNocmwgICAgJWNsLCBob2xkX3IgICAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCi0KLSAgICAgICAgLyogaWYgKG9wICYgMTYpIHsKLSAgICAgICAgICogICBkaXN0ID0gdGhpcy52YWwKLSAgICAgICAgICogICBvcCAmPSAxNQotICAgICAgICAgKiAgIGlmIChvcCA+IGJpdHMpIHsKLSAgICAgICAgICogICAgIGhvbGQgfD0gKigodW5zaWduZWQgc2hvcnQgKilpbikrKyA8PCBiaXRzOwotICAgICAgICAgKiAgICAgYml0cyArPSAxNgotICAgICAgICAgKiAgIH0KLSAgICAgICAgICogICBkaXN0ICs9IGhvbGQgJiBtYXNrW29wXTsKLSAgICAgICAgICogICBiaXRzIC09IG9wOwotICAgICAgICAgKiAgIGhvbGQgPj49IG9wOwotICAgICAgICAgKi8KLSAgICAgICAgbW92YiAgICAlYWwsICVjbCAgICAgICAgICAgICAgICAvKiBjbCA9IHRoaXMub3AgKi8KLQotICAgICAgICB0ZXN0YiAgICQxNiwgJWFsICAgICAgICAgICAgICAgIC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8KLSAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdAotICAgICAgICBhbmRiICAgICQxNSwgJWNsICAgICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCi0gICAgICAgIGp6ICAgICAgLkxfY2hlY2tfZGlzdF9vbmUKLSAgICAgICAgY21wYiAgICAlY2wsIGJpdHNfcgotICAgICAgICBqYWUgICAgIC5MX2FkZF9iaXRzX3RvX2Rpc3QgICAgIC8qIGlmIChvcCA8PSBiaXRzKSA5Ny42JSAqLwotCi0gICAgICAgIG1vdmIgICAgJWNsLCAlY2ggICAgICAgICAgICAgICAgLyogc3Rhc2ggb3AgaW4gY2gsIGZyZWVpbmcgY2wgKi8KLSAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4Ci0gICAgICAgIGxvZHN3ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KLSAgICAgICAgbW92YiAgICBiaXRzX3IsICVjbCAgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotICAgICAgICBhZGRiICAgICQxNiwgYml0c19yICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KLSAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKLSAgICAgICAgb3JsICAgICAlZWF4LCBob2xkX3IgICAgICAgICAgICAvKiBob2xkIHw9ICooKHVzaG9ydCAqKWluKSsrIDw8IGJpdHMgKi8KLSAgICAgICAgbW92YiAgICAlY2gsICVjbCAgICAgICAgICAgICAgICAvKiBtb3ZlIG9wIGJhY2sgdG8gZWN4ICovCi0KLS5MX2FkZF9iaXRzX3RvX2Rpc3Q6Ci0gICAgICAgIG1vdmwgICAgJDEsICVlYXgKLSAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKLSAgICAgICAgZGVjbCAgICAlZWF4ICAgICAgICAgICAgICAgICAgICAvKiAoMSA8PCBvcCkgLSAxICovCi0gICAgICAgIHN1YmIgICAgJWNsLCBiaXRzX3IKLSAgICAgICAgYW5kbCAgICBob2xkX3IsICVlYXggICAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotICAgICAgICBzaHJsICAgICVjbCwgaG9sZF9yCi0gICAgICAgIGFkZGwgICAgJWVheCwgZGlzdF9yICAgICAgICAgICAgLyogZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpICovCi0gICAgICAgIGptcCAgICAgLkxfY2hlY2tfd2luZG93Ci0KLS5MX2NoZWNrX3dpbmRvdzoKLSAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAotICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzCi0gICAgICAgICAqCi0gICAgICAgICAqIG5ieXRlcyA9IG91dCAtIGJlZzsKLSAgICAgICAgICogaWYgKGRpc3QgPD0gbmJ5dGVzKSB7Ci0gICAgICAgICAqICAgZnJvbSA9IG91dCAtIGRpc3Q7Ci0gICAgICAgICAqICAgZG8gewotICAgICAgICAgKiAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAqICAgfSB3aGlsZSAoLS1sZW4gPiAwKSB7Ci0gICAgICAgICAqIH0KLSAgICAgICAgICovCi0KLSAgICAgICAgbW92bCAgICBpbl9yLCBpbiglZXNwKSAgICAgICAgICAvKiBzYXZlIGluIHNvIGZyb20gY2FuIHVzZSBpdCdzIHJlZyAqLwotICAgICAgICBtb3ZsICAgIG91dF9yLCAlZWF4Ci0gICAgICAgIHN1YmwgICAgYmVnKCVlc3ApLCAlZWF4ICAgICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovCi0KLSAgICAgICAgY21wbCAgICBkaXN0X3IsICVlYXgKLSAgICAgICAgamIgICAgICAuTF9jbGlwX3dpbmRvdyAgICAgICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLwotCi0gICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCAlZWN4Ci0gICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgotICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0KLSAgICAgICAgc3VibCAgICAkMywgJWVjeAotICAgICAgICBtb3ZiICAgIChmcm9tX3IpLCAlYWwKLSAgICAgICAgbW92YiAgICAlYWwsIChvdXRfcikKLSAgICAgICAgbW92YiAgICAxKGZyb21fciksICVhbAotICAgICAgICBtb3ZiICAgIDIoZnJvbV9yKSwgJWRsCi0gICAgICAgIGFkZGwgICAgJDMsIGZyb21fcgotICAgICAgICBtb3ZiICAgICVhbCwgMShvdXRfcikKLSAgICAgICAgbW92YiAgICAlZGwsIDIob3V0X3IpCi0gICAgICAgIGFkZGwgICAgJDMsIG91dF9yCi0gICAgICAgIHJlcCAgICAgbW92c2IKLQotICAgICAgICBtb3ZsICAgIGluKCVlc3ApLCBpbl9yICAgICAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KLSAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0Ci0KLS5hbGlnbiAxNiwweDkwCi0uTF9jaGVja19kaXN0X29uZToKLSAgICAgICAgY21wbCAgICAkMSwgZGlzdF9yCi0gICAgICAgIGpuZSAgICAgLkxfY2hlY2tfd2luZG93Ci0gICAgICAgIGNtcGwgICAgb3V0X3IsIGJlZyglZXNwKQotICAgICAgICBqZSAgICAgIC5MX2NoZWNrX3dpbmRvdwotCi0gICAgICAgIGRlY2wgICAgb3V0X3IKLSAgICAgICAgbW92bCAgICBsZW4oJWVzcCksICVlY3gKLSAgICAgICAgbW92YiAgICAob3V0X3IpLCAlYWwKLSAgICAgICAgc3VibCAgICAkMywgJWVjeAotCi0gICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQotICAgICAgICBtb3ZiICAgICVhbCwgMihvdXRfcikKLSAgICAgICAgbW92YiAgICAlYWwsIDMob3V0X3IpCi0gICAgICAgIGFkZGwgICAgJDQsIG91dF9yCi0gICAgICAgIHJlcCAgICAgc3Rvc2IKLQotICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QKLQotLmFsaWduIDE2LDB4OTAKLS5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6Ci0gICAgICAgIC8qIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7Ci0gICAgICAgICAqICAgdGhpcyA9IGxjb2RlW3RoaXMudmFsICsgKGhvbGQgJiBtYXNrW29wXSldOwotICAgICAgICAgKiB9Ci0gICAgICAgICAqLwotICAgICAgICB0ZXN0YiAgICQ2NCwgJWFsCi0gICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrICAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCi0KLSAgICAgICAgbW92bCAgICAkMSwgJWVheAotICAgICAgICBzaGxsICAgICVjbCwgJWVheAotICAgICAgICBkZWNsICAgICVlYXgKLSAgICAgICAgYW5kbCAgICBob2xkX3IsICVlYXggICAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLwotICAgICAgICBhZGRsICAgICVlZHgsICVlYXggICAgICAgICAgICAgIC8qIGVheCArPSB0aGlzLnZhbCAqLwotICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWR4ICAgICAgIC8qIGVkeCA9IGxjb2RlICovCi0gICAgICAgIG1vdmwgICAgKCVlZHgsJWVheCw0KSwgJWVheCAgICAgLyogZWF4ID0gbGNvZGVbdmFsICsgKGhvbGQmbWFza1tvcF0pXSAqLwotICAgICAgICBqbXAgICAgIC5MX2RvbGVuCi0KLS5hbGlnbiAxNiwweDkwCi0uTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDoKLSAgICAgICAgLyogZWxzZSBpZiAoKG9wICYgNjQpID09IDApIHsKLSAgICAgICAgICogICB0aGlzID0gZGNvZGVbdGhpcy52YWwgKyAoaG9sZCAmIG1hc2tbb3BdKV07Ci0gICAgICAgICAqIH0KLSAgICAgICAgICovCi0gICAgICAgIHRlc3RiICAgJDY0LCAlYWwKLSAgICAgICAgam56ICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KLQotICAgICAgICBtb3ZsICAgICQxLCAlZWF4Ci0gICAgICAgIHNobGwgICAgJWNsLCAlZWF4Ci0gICAgICAgIGRlY2wgICAgJWVheAotICAgICAgICBhbmRsICAgIGhvbGRfciwgJWVheCAgICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCi0gICAgICAgIGFkZGwgICAgJWVkeCwgJWVheCAgICAgICAgICAgICAgLyogZWF4ICs9IHRoaXMudmFsICovCi0gICAgICAgIG1vdmwgICAgZGNvZGUoJWVzcCksICVlZHggICAgICAgLyogZWR4ID0gZGNvZGUgKi8KLSAgICAgICAgbW92bCAgICAoJWVkeCwlZWF4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBkY29kZVt2YWwgKyAoaG9sZCZtYXNrW29wXSldICovCi0gICAgICAgIGptcCAgICAgLkxfZG9kaXN0Ci0KLS5hbGlnbiAxNiwweDkwCi0uTF9jbGlwX3dpbmRvdzoKLSAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAotICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzCi0gICAgICAgICAqCi0gICAgICAgICAqIGVsc2UgewotICAgICAgICAgKiAgIGlmIChkaXN0ID4gd3NpemUpIHsKLSAgICAgICAgICogICAgIGludmFsaWQgZGlzdGFuY2UKLSAgICAgICAgICogICB9Ci0gICAgICAgICAqICAgZnJvbSA9IHdpbmRvdzsKLSAgICAgICAgICogICBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzOwotICAgICAgICAgKiAgIGlmICh3cml0ZSA9PSAwKSB7Ci0gICAgICAgICAqICAgICBmcm9tICs9IHdzaXplIC0gbmJ5dGVzOwotICAgICAgICAgKi8KLSNkZWZpbmUgbmJ5dGVzX3IgJWVjeAotICAgICAgICBtb3ZsICAgICVlYXgsIG5ieXRlc19yCi0gICAgICAgIG1vdmwgICAgd3NpemUoJWVzcCksICVlYXggICAgICAgLyogcHJlcGFyZSBmb3IgZGlzdCBjb21wYXJlICovCi0gICAgICAgIG5lZ2wgICAgbmJ5dGVzX3IgICAgICAgICAgICAgICAgLyogbmJ5dGVzID0gLW5ieXRlcyAqLwotICAgICAgICBtb3ZsICAgIHdpbmRvdyglZXNwKSwgZnJvbV9yICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KLQotICAgICAgICBjbXBsICAgIGRpc3RfciwgJWVheAotICAgICAgICBqYiAgICAgIC5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhciAvKiBpZiAoZGlzdCA+IHdzaXplKSAqLwotCi0gICAgICAgIGFkZGwgICAgZGlzdF9yLCBuYnl0ZXNfciAgICAgICAgLyogbmJ5dGVzID0gZGlzdCAtIG5ieXRlcyAqLwotICAgICAgICBjbXBsICAgICQwLCB3cml0ZSglZXNwKQotICAgICAgICBqbmUgICAgIC5MX3dyYXBfYXJvdW5kX3dpbmRvdyAgIC8qIGlmICh3cml0ZSAhPSAwKSAqLwotCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsICVlYXgKLSAgICAgICAgYWRkbCAgICAlZWF4LCBmcm9tX3IgICAgICAgICAgICAvKiBmcm9tICs9IHdzaXplIC0gbmJ5dGVzICovCi0KLSAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAotICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzLCAlZWF4ID0gbGVuCi0gICAgICAgICAqCi0gICAgICAgICAqICAgICBpZiAobmJ5dGVzIDwgbGVuKSB7Ci0gICAgICAgICAqICAgICAgIGxlbiAtPSBuYnl0ZXM7Ci0gICAgICAgICAqICAgICAgIGRvIHsKLSAgICAgICAgICogICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICogICAgICAgfSB3aGlsZSAoLS1uYnl0ZXMpOwotICAgICAgICAgKiAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsKLSAgICAgICAgICogICAgIH0KLSAgICAgICAgICogICB9Ci0gICAgICAgICAqLwotI2RlZmluZSBsZW5fciAlZWF4Ci0gICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCBsZW5fcgotICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgotICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotICAgICAgICByZXAgICAgIG1vdnNiCi0gICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgotICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0gICAgICAgIGptcCAgICAgLkxfZG9fY29weTEKLQotICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgotICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotICAgICAgICByZXAgICAgIG1vdnNiCi0gICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgotICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0gICAgICAgIGptcCAgICAgLkxfZG9fY29weTEKLQotLkxfd3JhcF9hcm91bmRfd2luZG93OgotICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0Ci0gICAgICAgICAqICAgICAgICVlY3ggPSBuYnl0ZXMsICVlYXggPSB3cml0ZSwgJWVheCA9IGxlbgotICAgICAgICAgKgotICAgICAgICAgKiAgIGVsc2UgaWYgKHdyaXRlIDwgbmJ5dGVzKSB7Ci0gICAgICAgICAqICAgICBmcm9tICs9IHdzaXplICsgd3JpdGUgLSBuYnl0ZXM7Ci0gICAgICAgICAqICAgICBuYnl0ZXMgLT0gd3JpdGU7Ci0gICAgICAgICAqICAgICBpZiAobmJ5dGVzIDwgbGVuKSB7Ci0gICAgICAgICAqICAgICAgIGxlbiAtPSBuYnl0ZXM7Ci0gICAgICAgICAqICAgICAgIGRvIHsKLSAgICAgICAgICogICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICogICAgICAgfSB3aGlsZSAoLS1uYnl0ZXMpOwotICAgICAgICAgKiAgICAgICBmcm9tID0gd2luZG93OwotICAgICAgICAgKiAgICAgICBuYnl0ZXMgPSB3cml0ZTsKLSAgICAgICAgICogICAgICAgaWYgKG5ieXRlcyA8IGxlbikgewotICAgICAgICAgKiAgICAgICAgIGxlbiAtPSBuYnl0ZXM7Ci0gICAgICAgICAqICAgICAgICAgZG8gewotICAgICAgICAgKiAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAqICAgICAgICAgfSB3aGlsZSgtLW5ieXRlcyk7Ci0gICAgICAgICAqICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7Ci0gICAgICAgICAqICAgICAgIH0KLSAgICAgICAgICogICAgIH0KLSAgICAgICAgICogICB9Ci0gICAgICAgICAqLwotI2RlZmluZSB3cml0ZV9yICVlYXgKLSAgICAgICAgbW92bCAgICB3cml0ZSglZXNwKSwgd3JpdGVfcgotICAgICAgICBjbXBsICAgIHdyaXRlX3IsIG5ieXRlc19yCi0gICAgICAgIGpiZSAgICAgLkxfY29udGlndW91c19pbl93aW5kb3cgLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KLQotICAgICAgICBhZGRsICAgIHdzaXplKCVlc3ApLCBmcm9tX3IKLSAgICAgICAgYWRkbCAgICB3cml0ZV9yLCBmcm9tX3IKLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgZnJvbV9yICAgICAgICAvKiBmcm9tICs9IHdzaXplICsgd3JpdGUgLSBuYnl0ZXMgKi8KLSAgICAgICAgc3VibCAgICB3cml0ZV9yLCBuYnl0ZXNfciAgICAgICAvKiBuYnl0ZXMgLT0gd3JpdGUgKi8KLSN1bmRlZiB3cml0ZV9yCi0KLSAgICAgICAgbW92bCAgICBsZW4oJWVzcCksIGxlbl9yCi0gICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCi0gICAgICAgIGpiZSAgICAgLkxfZG9fY29weTEgICAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0gICAgICAgIHJlcCAgICAgbW92c2IKLSAgICAgICAgbW92bCAgICB3aW5kb3coJWVzcCksIGZyb21fciAgICAvKiBmcm9tID0gd2luZG93ICovCi0gICAgICAgIG1vdmwgICAgd3JpdGUoJWVzcCksIG5ieXRlc19yICAgLyogbmJ5dGVzID0gd3JpdGUgKi8KLSAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKLSAgICAgICAgamJlICAgICAuTF9kb19jb3B5MSAgICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLSAgICAgICAgcmVwICAgICBtb3ZzYgotICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKLSAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHkxCi0KLS5MX2NvbnRpZ3VvdXNfaW5fd2luZG93OgotICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVicCA9IGhvbGQsICVibCA9IGJpdHMsICVlZGkgPSBvdXQsICVlZHggPSBkaXN0Ci0gICAgICAgICAqICAgICAgICVlY3ggPSBuYnl0ZXMsICVlYXggPSB3cml0ZSwgJWVheCA9IGxlbgotICAgICAgICAgKgotICAgICAgICAgKiAgIGVsc2UgewotICAgICAgICAgKiAgICAgZnJvbSArPSB3cml0ZSAtIG5ieXRlczsKLSAgICAgICAgICogICAgIGlmIChuYnl0ZXMgPCBsZW4pIHsKLSAgICAgICAgICogICAgICAgbGVuIC09IG5ieXRlczsKLSAgICAgICAgICogICAgICAgZG8gewotICAgICAgICAgKiAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgKiAgICAgICB9IHdoaWxlICgtLW5ieXRlcyk7Ci0gICAgICAgICAqICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OwotICAgICAgICAgKiAgICAgfQotICAgICAgICAgKiAgIH0KLSAgICAgICAgICovCi0jZGVmaW5lIHdyaXRlX3IgJWVheAotICAgICAgICBhZGRsICAgIHdyaXRlX3IsIGZyb21fcgotICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBmcm9tX3IgICAgICAgIC8qIGZyb20gKz0gd3JpdGUgLSBuYnl0ZXMgKi8KLSN1bmRlZiB3cml0ZV9yCi0KLSAgICAgICAgbW92bCAgICBsZW4oJWVzcCksIGxlbl9yCi0gICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCi0gICAgICAgIGpiZSAgICAgLkxfZG9fY29weTEgICAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0gICAgICAgIHJlcCAgICAgbW92c2IKLSAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCi0gICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLQotLkxfZG9fY29weTE6Ci0gICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0Ci0gICAgICAgICAqICAgICAgICVlYXggPSBsZW4KLSAgICAgICAgICoKLSAgICAgICAgICogICAgIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgICAgICAqICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgKiAgICAgICBsZW4tLTsKLSAgICAgICAgICogICAgIH0KLSAgICAgICAgICogICB9Ci0gICAgICAgICAqIH0gd2hpbGUgKGluIDwgbGFzdCAmJiBvdXQgPCBlbmQpOwotICAgICAgICAgKi8KLSN1bmRlZiBuYnl0ZXNfcgotI2RlZmluZSBpbl9yICVlc2kKLSAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeAotICAgICAgICByZXAgICAgIG1vdnNiCi0KLSAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCi0gICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdAotCi0jdW5kZWYgbGVuX3IKLSN1bmRlZiBkaXN0X3IKLQotI2VuZGlmIC8qIE5PX01NWCB8fCBSVU5fVElNRV9NTVggKi8KLQotCi0vKioqIE1NWCBjb2RlICoqKi8KLQotI2lmIGRlZmluZWQoIFVTRV9NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQotCi0uYWxpZ24gMzIsMHg5MAotLkxfaW5pdF9tbXg6Ci0gICAgICAgIGVtbXMKLQotI3VuZGVmICBiaXRzX3IKLSN1bmRlZiAgYml0c2xvbmdfcgotI2RlZmluZSBiaXRzbG9uZ19yICVlYnAKLSNkZWZpbmUgaG9sZF9tbSAgICAlbW0wCi0gICAgICAgIG1vdmQgICAgJWVicCwgaG9sZF9tbQotICAgICAgICBtb3ZsICAgICVlYngsIGJpdHNsb25nX3IKLQotI2RlZmluZSB1c2VkX21tICAgJW1tMQotI2RlZmluZSBkbWFzazJfbW0gJW1tMgotI2RlZmluZSBsbWFzazJfbW0gJW1tMwotI2RlZmluZSBsbWFza19tbSAgJW1tNAotI2RlZmluZSBkbWFza19tbSAgJW1tNQotI2RlZmluZSB0bXBfbW0gICAgJW1tNgotCi0gICAgICAgIG1vdmQgICAgbG1hc2soJWVzcCksIGxtYXNrX21tCi0gICAgICAgIG1vdnEgICAgbG1hc2tfbW0sIGxtYXNrMl9tbQotICAgICAgICBtb3ZkICAgIGRtYXNrKCVlc3ApLCBkbWFza19tbQotICAgICAgICBtb3ZxICAgIGRtYXNrX21tLCBkbWFzazJfbW0KLSAgICAgICAgcHhvciAgICB1c2VkX21tLCB1c2VkX21tCi0gICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlYnggICAgICAgLyogZWJ4ID0gbGNvZGUgKi8KLSAgICAgICAgam1wICAgICAuTF9kb19sb29wX21teAotCi0uYWxpZ24gMzIsMHg5MAotLkxfd2hpbGVfdGVzdF9tbXg6Ci0gICAgICAgIC8qIHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKQotICAgICAgICAgKi8KLSAgICAgICAgY21wbCAgICBvdXRfciwgZW5kKCVlc3ApCi0gICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcCAgICAgICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovCi0KLSAgICAgICAgY21wbCAgICBpbl9yLCBsYXN0KCVlc3ApCi0gICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcAotCi0uTF9kb19sb29wX21teDoKLSAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8KLQotICAgICAgICBjbXBsICAgICQzMiwgYml0c2xvbmdfcgotICAgICAgICBqYSAgICAgIC5MX2dldF9sZW5ndGhfY29kZV9tbXggIC8qIGlmICgzMiA8IGJpdHMpICovCi0KLSAgICAgICAgbW92ZCAgICBiaXRzbG9uZ19yLCB0bXBfbW0KLSAgICAgICAgbW92ZCAgICAoaW5fciksICVtbTcKLSAgICAgICAgYWRkbCAgICAkNCwgaW5fcgotICAgICAgICBwc2xscSAgIHRtcF9tbSwgJW1tNwotICAgICAgICBhZGRsICAgICQzMiwgYml0c2xvbmdfcgotICAgICAgICBwb3IgICAgICVtbTcsIGhvbGRfbW0gICAgICAgICAgIC8qIGhvbGRfbW0gfD0gKigodWludCAqKWluKSsrIDw8IGJpdHMgKi8KLQotLkxfZ2V0X2xlbmd0aF9jb2RlX21teDoKLSAgICAgICAgcGFuZCAgICBob2xkX21tLCBsbWFza19tbQotICAgICAgICBtb3ZkICAgIGxtYXNrX21tLCAlZWF4Ci0gICAgICAgIG1vdnEgICAgbG1hc2syX21tLCBsbWFza19tbQotICAgICAgICBtb3ZsICAgICglZWJ4LCVlYXgsNCksICVlYXggICAgIC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8KLQotLkxfZG9sZW5fbW14OgotICAgICAgICBtb3Z6YmwgICVhaCwgJWVjeCAgICAgICAgICAgICAgIC8qIGVjeCA9IHRoaXMuYml0cyAqLwotICAgICAgICBtb3ZkICAgICVlY3gsIHVzZWRfbW0KLSAgICAgICAgc3VibCAgICAlZWN4LCBiaXRzbG9uZ19yICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLwotCi0gICAgICAgIHRlc3RiICAgJWFsLCAlYWwKLSAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZV9tbXggLyogaWYgKG9wICE9IDApIDQ1LjclICovCi0KLSAgICAgICAgc2hybCAgICAkMTYsICVlYXggICAgICAgICAgICAgICAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLwotICAgICAgICBzdG9zYgotICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RfbW14Ci0KLS5MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlX21teDoKLSNkZWZpbmUgbGVuX3IgICVlZHgKLSAgICAgICAgbW92bCAgICAlZWF4LCBsZW5fciAgICAgICAgICAgICAvKiBsZW4gPSB0aGlzICovCi0gICAgICAgIHNocmwgICAgJDE2LCBsZW5fciAgICAgICAgICAgICAgLyogbGVuID0gdGhpcy52YWwgKi8KLQotICAgICAgICB0ZXN0YiAgICQxNiwgJWFsCi0gICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aF9tbXggLyogaWYgKChvcCAmIDE2KSA9PSAwKSA4JSAqLwotICAgICAgICBhbmRsICAgICQxNSwgJWVheCAgICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCi0gICAgICAgIGp6ICAgICAgLkxfZGVjb2RlX2Rpc3RhbmNlX21teCAgLyogaWYgKCFvcCkgKi8KLQotICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLwotICAgICAgICBtb3ZkICAgICVlYXgsIHVzZWRfbW0KLSAgICAgICAgbW92ZCAgICBob2xkX21tLCAlZWN4Ci0gICAgICAgIHN1YmwgICAgJWVheCwgYml0c2xvbmdfcgotICAgICAgICBhbmRsICAgIC5MX21hc2soLCVlYXgsNCksICVlY3gKLSAgICAgICAgYWRkbCAgICAlZWN4LCBsZW5fciAgICAgICAgICAgICAvKiBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdICovCi0KLS5MX2RlY29kZV9kaXN0YW5jZV9tbXg6Ci0gICAgICAgIHBzcmxxICAgdXNlZF9tbSwgaG9sZF9tbSAgICAgICAgLyogaG9sZF9tbSA+Pj0gbGFzdCBiaXQgbGVuZ3RoICovCi0KLSAgICAgICAgY21wbCAgICAkMzIsIGJpdHNsb25nX3IKLSAgICAgICAgamEgICAgICAuTF9nZXRfZGlzdF9jb2RlX21teCAgICAvKiBpZiAoMzIgPCBiaXRzKSAqLwotCi0gICAgICAgIG1vdmQgICAgYml0c2xvbmdfciwgdG1wX21tCi0gICAgICAgIG1vdmQgICAgKGluX3IpLCAlbW03Ci0gICAgICAgIGFkZGwgICAgJDQsIGluX3IKLSAgICAgICAgcHNsbHEgICB0bXBfbW0sICVtbTcKLSAgICAgICAgYWRkbCAgICAkMzIsIGJpdHNsb25nX3IKLSAgICAgICAgcG9yICAgICAlbW03LCBob2xkX21tICAgICAgICAgICAvKiBob2xkX21tIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovCi0KLS5MX2dldF9kaXN0X2NvZGVfbW14OgotICAgICAgICBtb3ZsICAgIGRjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIGVieCA9IGRjb2RlICovCi0gICAgICAgIHBhbmQgICAgaG9sZF9tbSwgZG1hc2tfbW0KLSAgICAgICAgbW92ZCAgICBkbWFza19tbSwgJWVheAotICAgICAgICBtb3ZxICAgIGRtYXNrMl9tbSwgZG1hc2tfbW0KLSAgICAgICAgbW92bCAgICAoJWVieCwlZWF4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBkY29kZVtob2xkICYgbG1hc2tdICovCi0KLS5MX2RvZGlzdF9tbXg6Ci0jZGVmaW5lIGRpc3RfciAlZWJ4Ci0gICAgICAgIG1vdnpibCAgJWFoLCAlZWN4ICAgICAgICAgICAgICAgLyogZWN4ID0gdGhpcy5iaXRzICovCi0gICAgICAgIG1vdmwgICAgJWVheCwgZGlzdF9yCi0gICAgICAgIHNocmwgICAgJDE2LCBkaXN0X3IgICAgICAgICAgICAgLyogZGlzdCAgPSB0aGlzLnZhbCAqLwotICAgICAgICBzdWJsICAgICVlY3gsIGJpdHNsb25nX3IgICAgICAgIC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCi0gICAgICAgIG1vdmQgICAgJWVjeCwgdXNlZF9tbQotCi0gICAgICAgIHRlc3RiICAgJDE2LCAlYWwgICAgICAgICAgICAgICAgLyogaWYgKChvcCAmIDE2KSA9PSAwKSAqLwotICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0X21teAotICAgICAgICBhbmRsICAgICQxNSwgJWVheCAgICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCi0gICAgICAgIGp6ICAgICAgLkxfY2hlY2tfZGlzdF9vbmVfbW14Ci0KLS5MX2FkZF9iaXRzX3RvX2Rpc3RfbW14OgotICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLwotICAgICAgICBtb3ZkICAgICVlYXgsIHVzZWRfbW0gICAgICAgICAgIC8qIHNhdmUgYml0IGxlbmd0aCBvZiBjdXJyZW50IG9wICovCi0gICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVjeCAgICAgICAgICAgLyogZ2V0IHRoZSBuZXh0IGJpdHMgb24gaW5wdXQgc3RyZWFtICovCi0gICAgICAgIHN1YmwgICAgJWVheCwgYml0c2xvbmdfciAgICAgICAgLyogYml0cyAtPSBvcCBiaXRzICovCi0gICAgICAgIGFuZGwgICAgLkxfbWFzaygsJWVheCw0KSwgJWVjeCAgLyogZWN4ICAgPSBob2xkICYgbWFza1tvcF0gKi8KLSAgICAgICAgYWRkbCAgICAlZWN4LCBkaXN0X3IgICAgICAgICAgICAvKiBkaXN0ICs9IGhvbGQgJiBtYXNrW29wXSAqLwotCi0uTF9jaGVja193aW5kb3dfbW14OgotICAgICAgICBtb3ZsICAgIGluX3IsIGluKCVlc3ApICAgICAgICAgIC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovCi0gICAgICAgIG1vdmwgICAgb3V0X3IsICVlYXgKLSAgICAgICAgc3VibCAgICBiZWcoJWVzcCksICVlYXggICAgICAgICAvKiBuYnl0ZXMgPSBvdXQgLSBiZWcgKi8KLQotICAgICAgICBjbXBsICAgIGRpc3RfciwgJWVheAotICAgICAgICBqYiAgICAgIC5MX2NsaXBfd2luZG93X21teCAgICAgIC8qIGlmIChkaXN0ID4gbmJ5dGVzKSA0LjIlICovCi0KLSAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeAotICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKLSAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotCi0gICAgICAgIHN1YmwgICAgJDMsICVlY3gKLSAgICAgICAgbW92YiAgICAoZnJvbV9yKSwgJWFsCi0gICAgICAgIG1vdmIgICAgJWFsLCAob3V0X3IpCi0gICAgICAgIG1vdmIgICAgMShmcm9tX3IpLCAlYWwKLSAgICAgICAgbW92YiAgICAyKGZyb21fciksICVkbAotICAgICAgICBhZGRsICAgICQzLCBmcm9tX3IKLSAgICAgICAgbW92YiAgICAlYWwsIDEob3V0X3IpCi0gICAgICAgIG1vdmIgICAgJWRsLCAyKG91dF9yKQotICAgICAgICBhZGRsICAgICQzLCBvdXRfcgotICAgICAgICByZXAgICAgIG1vdnNiCi0KLSAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCi0gICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlYnggICAgICAgLyogbW92ZSBsY29kZSBiYWNrIHRvICVlYngsIHRvc3MgZGlzdCAqLwotICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RfbW14Ci0KLS5hbGlnbiAxNiwweDkwCi0uTF9jaGVja19kaXN0X29uZV9tbXg6Ci0gICAgICAgIGNtcGwgICAgJDEsIGRpc3RfcgotICAgICAgICBqbmUgICAgIC5MX2NoZWNrX3dpbmRvd19tbXgKLSAgICAgICAgY21wbCAgICBvdXRfciwgYmVnKCVlc3ApCi0gICAgICAgIGplICAgICAgLkxfY2hlY2tfd2luZG93X21teAotCi0gICAgICAgIGRlY2wgICAgb3V0X3IKLSAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeAotICAgICAgICBtb3ZiICAgIChvdXRfciksICVhbAotICAgICAgICBzdWJsICAgICQzLCAlZWN4Ci0KLSAgICAgICAgbW92YiAgICAlYWwsIDEob3V0X3IpCi0gICAgICAgIG1vdmIgICAgJWFsLCAyKG91dF9yKQotICAgICAgICBtb3ZiICAgICVhbCwgMyhvdXRfcikKLSAgICAgICAgYWRkbCAgICAkNCwgb3V0X3IKLSAgICAgICAgcmVwICAgICBzdG9zYgotCi0gICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlYnggICAgICAgLyogbW92ZSBsY29kZSBiYWNrIHRvICVlYngsIHRvc3MgZGlzdCAqLwotICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RfbW14Ci0KLS5hbGlnbiAxNiwweDkwCi0uTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoX21teDoKLSAgICAgICAgdGVzdGIgICAkNjQsICVhbAotICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jayAgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLwotCi0gICAgICAgIGFuZGwgICAgJDE1LCAlZWF4Ci0gICAgICAgIHBzcmxxICAgdXNlZF9tbSwgaG9sZF9tbSAgICAgICAgLyogaG9sZF9tbSA+Pj0gbGFzdCBiaXQgbGVuZ3RoICovCi0gICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVjeAotICAgICAgICBhbmRsICAgIC5MX21hc2soLCVlYXgsNCksICVlY3gKLSAgICAgICAgYWRkbCAgICBsZW5fciwgJWVjeAotICAgICAgICBtb3ZsICAgICglZWJ4LCVlY3gsNCksICVlYXggICAgIC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8KLSAgICAgICAgam1wICAgICAuTF9kb2xlbl9tbXgKLQotLmFsaWduIDE2LDB4OTAKLS5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0X21teDoKLSAgICAgICAgdGVzdGIgICAkNjQsICVhbAotICAgICAgICBqbnogICAgIC5MX2ludmFsaWRfZGlzdGFuY2VfY29kZSAgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLwotCi0gICAgICAgIGFuZGwgICAgJDE1LCAlZWF4Ci0gICAgICAgIHBzcmxxICAgdXNlZF9tbSwgaG9sZF9tbSAgICAgICAgLyogaG9sZF9tbSA+Pj0gbGFzdCBiaXQgbGVuZ3RoICovCi0gICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVjeAotICAgICAgICBhbmRsICAgIC5MX21hc2soLCVlYXgsNCksICVlY3gKLSAgICAgICAgbW92bCAgICBkY29kZSglZXNwKSwgJWVheCAgICAgICAvKiBlY3ggPSBkY29kZSAqLwotICAgICAgICBhZGRsICAgIGRpc3RfciwgJWVjeAotICAgICAgICBtb3ZsICAgICglZWF4LCVlY3gsNCksICVlYXggICAgIC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8KLSAgICAgICAgam1wICAgICAuTF9kb2Rpc3RfbW14Ci0KLS5hbGlnbiAxNiwweDkwCi0uTF9jbGlwX3dpbmRvd19tbXg6Ci0jZGVmaW5lIG5ieXRlc19yICVlY3gKLSAgICAgICAgbW92bCAgICAlZWF4LCBuYnl0ZXNfcgotICAgICAgICBtb3ZsICAgIHdzaXplKCVlc3ApLCAlZWF4ICAgICAgIC8qIHByZXBhcmUgZm9yIGRpc3QgY29tcGFyZSAqLwotICAgICAgICBuZWdsICAgIG5ieXRlc19yICAgICAgICAgICAgICAgIC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8KLSAgICAgICAgbW92bCAgICB3aW5kb3coJWVzcCksIGZyb21fciAgICAvKiBmcm9tID0gd2luZG93ICovCi0KLSAgICAgICAgY21wbCAgICBkaXN0X3IsICVlYXgKLSAgICAgICAgamIgICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXIgLyogaWYgKGRpc3QgPiB3c2l6ZSkgKi8KLQotICAgICAgICBhZGRsICAgIGRpc3RfciwgbmJ5dGVzX3IgICAgICAgIC8qIG5ieXRlcyA9IGRpc3QgLSBuYnl0ZXMgKi8KLSAgICAgICAgY21wbCAgICAkMCwgd3JpdGUoJWVzcCkKLSAgICAgICAgam5lICAgICAuTF93cmFwX2Fyb3VuZF93aW5kb3dfbW14IC8qIGlmICh3cml0ZSAhPSAwKSAqLwotCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsICVlYXgKLSAgICAgICAgYWRkbCAgICAlZWF4LCBmcm9tX3IgICAgICAgICAgICAvKiBmcm9tICs9IHdzaXplIC0gbmJ5dGVzICovCi0KLSAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKLSAgICAgICAgamJlICAgICAuTF9kb19jb3B5MV9tbXggICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KLSAgICAgICAgcmVwICAgICBtb3ZzYgotICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKLSAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLwotICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHkxX21teAotCi0gICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCi0gICAgICAgIGpiZSAgICAgLkxfZG9fY29weTFfbW14ICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0gICAgICAgIHJlcCAgICAgbW92c2IKLSAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCi0gICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLSAgICAgICAgam1wICAgICAuTF9kb19jb3B5MV9tbXgKLQotLkxfd3JhcF9hcm91bmRfd2luZG93X21teDoKLSNkZWZpbmUgd3JpdGVfciAlZWF4Ci0gICAgICAgIG1vdmwgICAgd3JpdGUoJWVzcCksIHdyaXRlX3IKLSAgICAgICAgY21wbCAgICB3cml0ZV9yLCBuYnl0ZXNfcgotICAgICAgICBqYmUgICAgIC5MX2NvbnRpZ3VvdXNfaW5fd2luZG93X21teCAvKiBpZiAod3JpdGUgPj0gbmJ5dGVzKSAqLwotCi0gICAgICAgIGFkZGwgICAgd3NpemUoJWVzcCksIGZyb21fcgotICAgICAgICBhZGRsICAgIHdyaXRlX3IsIGZyb21fcgotICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBmcm9tX3IgICAgICAgIC8qIGZyb20gKz0gd3NpemUgKyB3cml0ZSAtIG5ieXRlcyAqLwotICAgICAgICBzdWJsICAgIHdyaXRlX3IsIG5ieXRlc19yICAgICAgIC8qIG5ieXRlcyAtPSB3cml0ZSAqLwotI3VuZGVmIHdyaXRlX3IKLQotICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgotICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0gICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLwotICAgICAgICByZXAgICAgIG1vdnNiCi0gICAgICAgIG1vdmwgICAgd2luZG93KCVlc3ApLCBmcm9tX3IgICAgLyogZnJvbSA9IHdpbmRvdyAqLwotICAgICAgICBtb3ZsICAgIHdyaXRlKCVlc3ApLCBuYnl0ZXNfciAgIC8qIG5ieXRlcyA9IHdyaXRlICovCi0gICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCi0gICAgICAgIGpiZSAgICAgLkxfZG9fY29weTFfbW14ICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0gICAgICAgIHJlcCAgICAgbW92c2IKLSAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCi0gICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLSAgICAgICAgam1wICAgICAuTF9kb19jb3B5MV9tbXgKLQotLkxfY29udGlndW91c19pbl93aW5kb3dfbW14OgotI2RlZmluZSB3cml0ZV9yICVlYXgKLSAgICAgICAgYWRkbCAgICB3cml0ZV9yLCBmcm9tX3IKLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgZnJvbV9yICAgICAgICAvKiBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzICovCi0jdW5kZWYgd3JpdGVfcgotCi0gICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCi0gICAgICAgIGpiZSAgICAgLkxfZG9fY29weTFfbW14ICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLSAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCi0gICAgICAgIHJlcCAgICAgbW92c2IKLSAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCi0gICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLQotLkxfZG9fY29weTFfbW14OgotI3VuZGVmIG5ieXRlc19yCi0jZGVmaW5lIGluX3IgJWVzaQotICAgICAgICBtb3ZsICAgIGxlbl9yLCAlZWN4Ci0gICAgICAgIHJlcCAgICAgbW92c2IKLQotICAgICAgICBtb3ZsICAgIGluKCVlc3ApLCBpbl9yICAgICAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KLSAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVieCAgICAgICAvKiBtb3ZlIGxjb2RlIGJhY2sgdG8gJWVieCwgdG9zcyBkaXN0ICovCi0gICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdF9tbXgKLQotI3VuZGVmIGhvbGRfcgotI3VuZGVmIGJpdHNsb25nX3IKLQotI2VuZGlmIC8qIFVTRV9NTVggfHwgUlVOX1RJTUVfTU1YICovCi0KLQotLyoqKiBVU0VfTU1YLCBOT19NTVgsIGFuZCBSVU5USU1FX01NWCBmcm9tIGhlcmUgb24gKioqLwotCi0uTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGU6Ci0gICAgICAgIC8qIGVsc2UgewotICAgICAgICAgKiAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICAgKiAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgKiB9Ci0gICAgICAgICAqLwotICAgICAgICBtb3ZsICAgICQuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGVfbXNnLCAlZWN4Ci0gICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9CQUQsICVlZHgKLSAgICAgICAgam1wICAgICAuTF91cGRhdGVfc3RyZWFtX3N0YXRlCi0KLS5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jazoKLSAgICAgICAgLyogZWxzZSBpZiAob3AgJiAzMikgewotICAgICAgICAgKiAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICAgICAgICogICBicmVhazsKLSAgICAgICAgICogfQotICAgICAgICAgKi8KLSAgICAgICAgdGVzdGIgICAkMzIsICVhbAotICAgICAgICBqeiAgICAgIC5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZSAgLyogaWYgKChvcCAmIDMyKSA9PSAwKSAqLwotCi0gICAgICAgIG1vdmwgICAgJDAsICVlY3gKLSAgICAgICAgbW92bCAgICAkSU5GTEFURV9NT0RFX1RZUEUsICVlZHgKLSAgICAgICAgam1wICAgICAuTF91cGRhdGVfc3RyZWFtX3N0YXRlCi0KLS5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZToKLSAgICAgICAgLyogZWxzZSB7Ci0gICAgICAgICAqICAgc3RybS0+bXNnID0gImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7Ci0gICAgICAgICAqICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAqIH0KLSAgICAgICAgICovCi0gICAgICAgIG1vdmwgICAgJC5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZV9tc2csICVlY3gKLSAgICAgICAgbW92bCAgICAkSU5GTEFURV9NT0RFX0JBRCwgJWVkeAotICAgICAgICBqbXAgICAgIC5MX3VwZGF0ZV9zdHJlYW1fc3RhdGUKLQotLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyOgotICAgICAgICAvKiBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwotICAgICAgICAgKiBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICovCi0gICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3IgICAgICAgICAgLyogZnJvbV9yIGhhcyBpbidzIHJlZywgcHV0IGluIGJhY2sgKi8KLSAgICAgICAgbW92bCAgICAkLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyX21zZywgJWVjeAotICAgICAgICBtb3ZsICAgICRJTkZMQVRFX01PREVfQkFELCAlZWR4Ci0gICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQotCi0uTF91cGRhdGVfc3RyZWFtX3N0YXRlOgotICAgICAgICAvKiBzZXQgc3RybS0+bXNnID0gJWVjeCwgc3RybS0+c3RhdGUtPm1vZGUgPSAlZWR4ICovCi0gICAgICAgIG1vdmwgICAgc3RybV9zcCglZXNwKSwgJWVheAotICAgICAgICB0ZXN0bCAgICVlY3gsICVlY3ggICAgICAgICAgICAgIC8qIGlmIChtc2cgIT0gTlVMTCkgKi8KLSAgICAgICAganogICAgICAuTF9za2lwX21zZwotICAgICAgICBtb3ZsICAgICVlY3gsIG1zZ19zdHJtKCVlYXgpICAgIC8qIHN0cm0tPm1zZyA9IG1zZyAqLwotLkxfc2tpcF9tc2c6Ci0gICAgICAgIG1vdmwgICAgc3RhdGVfc3RybSglZWF4KSwgJWVheCAgLyogc3RhdGUgPSBzdHJtLT5zdGF0ZSAqLwotICAgICAgICBtb3ZsICAgICVlZHgsIG1vZGVfc3RhdGUoJWVheCkgIC8qIHN0YXRlLT5tb2RlID0gZWR4IChCQUQgfCBUWVBFKSAqLwotICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3AKLQotLmFsaWduIDMyLDB4OTAKLS5MX2JyZWFrX2xvb3A6Ci0KLS8qCi0gKiBSZWdzOgotICoKLSAqIGJpdHMgPSAlZWJwIHdoZW4gbW14LCBhbmQgaW4gJWVieCB3aGVuIG5vbi1tbXgKLSAqIGhvbGQgPSAlaG9sZF9tbSB3aGVuIG1teCwgYW5kIGluICVlYnAgd2hlbiBub24tbW14Ci0gKiBpbiAgID0gJWVzaQotICogb3V0ICA9ICVlZGkKLSAqLwotCi0jaWYgZGVmaW5lZCggVVNFX01NWCApIHx8IGRlZmluZWQoIFJVTl9USU1FX01NWCApCi0KLSNpZiBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQotCi0gICAgICAgIGNtcGwgICAgJERPX1VTRV9NTVgsIGluZmxhdGVfZmFzdF91c2VfbW14Ci0gICAgICAgIGpuZSAgICAgLkxfdXBkYXRlX25leHRfaW4KLQotI2VuZGlmIC8qIFJVTl9USU1FX01NWCAqLwotCi0gICAgICAgIG1vdmwgICAgJWVicCwgJWVieAotCi0uTF91cGRhdGVfbmV4dF9pbjoKLQotI2VuZGlmCi0KLSNkZWZpbmUgc3RybV9yICAlZWF4Ci0jZGVmaW5lIHN0YXRlX3IgJWVkeAotCi0gICAgICAgIC8qIGxlbiA9IGJpdHMgPj4gMzsKLSAgICAgICAgICogaW4gLT0gbGVuOwotICAgICAgICAgKiBiaXRzIC09IGxlbiA8PCAzOwotICAgICAgICAgKiBob2xkICY9ICgxVSA8PCBiaXRzKSAtIDE7Ci0gICAgICAgICAqIHN0YXRlLT5ob2xkID0gaG9sZDsKLSAgICAgICAgICogc3RhdGUtPmJpdHMgPSBiaXRzOwotICAgICAgICAgKiBzdHJtLT5uZXh0X2luID0gaW47Ci0gICAgICAgICAqIHN0cm0tPm5leHRfb3V0ID0gb3V0OwotICAgICAgICAgKi8KLSAgICAgICAgbW92bCAgICBzdHJtX3NwKCVlc3ApLCBzdHJtX3IKLSAgICAgICAgbW92bCAgICAlZWJ4LCAlZWN4Ci0gICAgICAgIG1vdmwgICAgc3RhdGVfc3RybShzdHJtX3IpLCBzdGF0ZV9yCi0gICAgICAgIHNocmwgICAgJDMsICVlY3gKLSAgICAgICAgc3VibCAgICAlZWN4LCBpbl9yCi0gICAgICAgIHNobGwgICAgJDMsICVlY3gKLSAgICAgICAgc3VibCAgICAlZWN4LCAlZWJ4Ci0gICAgICAgIG1vdmwgICAgb3V0X3IsIG5leHRfb3V0X3N0cm0oc3RybV9yKQotICAgICAgICBtb3ZsICAgICVlYngsIGJpdHNfc3RhdGUoc3RhdGVfcikKLSAgICAgICAgbW92bCAgICAlZWJ4LCAlZWN4Ci0KLSAgICAgICAgbGVhbCAgICBidWYoJWVzcCksICVlYngKLSAgICAgICAgY21wbCAgICAlZWJ4LCBsYXN0KCVlc3ApCi0gICAgICAgIGpuZSAgICAgLkxfYnVmX25vdF91c2VkICAgICAgICAgLyogaWYgYnVmICE9IGxhc3QgKi8KLQotICAgICAgICBzdWJsICAgICVlYngsIGluX3IgICAgICAgICAgICAgIC8qIGluIC09IGJ1ZiAqLwotICAgICAgICBtb3ZsICAgIG5leHRfaW5fc3RybShzdHJtX3IpLCAlZWJ4Ci0gICAgICAgIG1vdmwgICAgJWVieCwgbGFzdCglZXNwKSAgICAgICAgLyogbGFzdCA9IHN0cm0tPm5leHRfaW4gKi8KLSAgICAgICAgYWRkbCAgICAlZWJ4LCBpbl9yICAgICAgICAgICAgICAvKiBpbiArPSBzdHJtLT5uZXh0X2luICovCi0gICAgICAgIG1vdmwgICAgYXZhaWxfaW5fc3RybShzdHJtX3IpLCAlZWJ4Ci0gICAgICAgIHN1YmwgICAgJDExLCAlZWJ4Ci0gICAgICAgIGFkZGwgICAgJWVieCwgbGFzdCglZXNwKSAgICAvKiBsYXN0ID0gJnN0cm0tPm5leHRfaW5bIGF2YWlsX2luIC0gMTEgXSAqLwotCi0uTF9idWZfbm90X3VzZWQ6Ci0gICAgICAgIG1vdmwgICAgaW5fciwgbmV4dF9pbl9zdHJtKHN0cm1fcikKLQotICAgICAgICBtb3ZsICAgICQxLCAlZWJ4Ci0gICAgICAgIHNobGwgICAgJWNsLCAlZWJ4Ci0gICAgICAgIGRlY2wgICAgJWVieAotCi0jaWYgZGVmaW5lZCggVVNFX01NWCApIHx8IGRlZmluZWQoIFJVTl9USU1FX01NWCApCi0KLSNpZiBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQotCi0gICAgICAgIGNtcGwgICAgJERPX1VTRV9NTVgsIGluZmxhdGVfZmFzdF91c2VfbW14Ci0gICAgICAgIGpuZSAgICAgLkxfdXBkYXRlX2hvbGQKLQotI2VuZGlmIC8qIFJVTl9USU1FX01NWCAqLwotCi0gICAgICAgIHBzcmxxICAgdXNlZF9tbSwgaG9sZF9tbSAgICAgICAgLyogaG9sZF9tbSA+Pj0gbGFzdCBiaXQgbGVuZ3RoICovCi0gICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVicAotCi0gICAgICAgIGVtbXMKLQotLkxfdXBkYXRlX2hvbGQ6Ci0KLSNlbmRpZiAvKiBVU0VfTU1YIHx8IFJVTl9USU1FX01NWCAqLwotCi0gICAgICAgIGFuZGwgICAgJWVieCwgJWVicAotICAgICAgICBtb3ZsICAgICVlYnAsIGhvbGRfc3RhdGUoc3RhdGVfcikKLQotI2RlZmluZSBsYXN0X3IgJWVieAotCi0gICAgICAgIC8qIHN0cm0tPmF2YWlsX2luID0gaW4gPCBsYXN0ID8gMTEgKyAobGFzdCAtIGluKSA6IDExIC0gKGluIC0gbGFzdCkgKi8KLSAgICAgICAgbW92bCAgICBsYXN0KCVlc3ApLCBsYXN0X3IKLSAgICAgICAgY21wbCAgICBpbl9yLCBsYXN0X3IKLSAgICAgICAgamJlICAgICAuTF9sYXN0X2lzX3NtYWxsZXIgICAgIC8qIGlmIChpbiA+PSBsYXN0KSAqLwotCi0gICAgICAgIHN1YmwgICAgaW5fciwgbGFzdF9yICAgICAgICAgICAvKiBsYXN0IC09IGluICovCi0gICAgICAgIGFkZGwgICAgJDExLCBsYXN0X3IgICAgICAgICAgICAvKiBsYXN0ICs9IDExICovCi0gICAgICAgIG1vdmwgICAgbGFzdF9yLCBhdmFpbF9pbl9zdHJtKHN0cm1fcikKLSAgICAgICAgam1wICAgICAuTF9maXh1cF9vdXQKLS5MX2xhc3RfaXNfc21hbGxlcjoKLSAgICAgICAgc3VibCAgICBsYXN0X3IsIGluX3IgICAgICAgICAgIC8qIGluIC09IGxhc3QgKi8KLSAgICAgICAgbmVnbCAgICBpbl9yICAgICAgICAgICAgICAgICAgIC8qIGluID0gLWluICovCi0gICAgICAgIGFkZGwgICAgJDExLCBpbl9yICAgICAgICAgICAgICAvKiBpbiArPSAxMSAqLwotICAgICAgICBtb3ZsICAgIGluX3IsIGF2YWlsX2luX3N0cm0oc3RybV9yKQotCi0jdW5kZWYgbGFzdF9yCi0jZGVmaW5lIGVuZF9yICVlYngKLQotLkxfZml4dXBfb3V0OgotICAgICAgICAvKiBzdHJtLT5hdmFpbF9vdXQgPSBvdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gb3V0KSA6IDI1NyAtIChvdXQgLSBlbmQpKi8KLSAgICAgICAgbW92bCAgICBlbmQoJWVzcCksIGVuZF9yCi0gICAgICAgIGNtcGwgICAgb3V0X3IsIGVuZF9yCi0gICAgICAgIGpiZSAgICAgLkxfZW5kX2lzX3NtYWxsZXIgICAgICAvKiBpZiAob3V0ID49IGVuZCkgKi8KLQotICAgICAgICBzdWJsICAgIG91dF9yLCBlbmRfciAgICAgICAgICAgLyogZW5kIC09IG91dCAqLwotICAgICAgICBhZGRsICAgICQyNTcsIGVuZF9yICAgICAgICAgICAgLyogZW5kICs9IDI1NyAqLwotICAgICAgICBtb3ZsICAgIGVuZF9yLCBhdmFpbF9vdXRfc3RybShzdHJtX3IpCi0gICAgICAgIGptcCAgICAgLkxfZG9uZQotLkxfZW5kX2lzX3NtYWxsZXI6Ci0gICAgICAgIHN1YmwgICAgZW5kX3IsIG91dF9yICAgICAgICAgICAvKiBvdXQgLT0gZW5kICovCi0gICAgICAgIG5lZ2wgICAgb3V0X3IgICAgICAgICAgICAgICAgICAvKiBvdXQgPSAtb3V0ICovCi0gICAgICAgIGFkZGwgICAgJDI1Nywgb3V0X3IgICAgICAgICAgICAvKiBvdXQgKz0gMjU3ICovCi0gICAgICAgIG1vdmwgICAgb3V0X3IsIGF2YWlsX291dF9zdHJtKHN0cm1fcikKLQotI3VuZGVmIGVuZF9yCi0jdW5kZWYgc3RybV9yCi0jdW5kZWYgc3RhdGVfcgotCi0uTF9kb25lOgotICAgICAgICBhZGRsICAgICRsb2NhbF92YXJfc2l6ZSwgJWVzcAotICAgICAgICBwb3BmCi0gICAgICAgIHBvcGwgICAgJWVieAotICAgICAgICBwb3BsICAgICVlYnAKLSAgICAgICAgcG9wbCAgICAlZXNpCi0gICAgICAgIHBvcGwgICAgJWVkaQotICAgICAgICByZXQKLQotI2lmIGRlZmluZWQoIEdBU19FTEYgKQotLyogZWxmIGluZm8gKi8KLS50eXBlIGluZmxhdGVfZmFzdCxAZnVuY3Rpb24KLS5zaXplIGluZmxhdGVfZmFzdCwuLWluZmxhdGVfZmFzdAotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbS90ZXN0LmNwcCBiL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtL3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDI2NWIzLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtL3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCi0jaW5jbHVkZSAiemZzdHJlYW0uaCIKLQotaW50IG1haW4oKSB7Ci0KLSAgLy8gQ29uc3RydWN0IGEgc3RyZWFtIG9iamVjdCB3aXRoIHRoaXMgZmlsZWJ1ZmZlci4gIEFueXRoaW5nIHNlbnQKLSAgLy8gdG8gdGhpcyBzdHJlYW0gd2lsbCBnbyB0byBzdGFuZGFyZCBvdXQuCi0gIGd6b2ZzdHJlYW0gb3MoIDEsIGlvczo6b3V0ICk7Ci0KLSAgLy8gVGhpcyB0ZXh0IGlzIGdldHRpbmcgY29tcHJlc3NlZCBhbmQgc2VudCB0byBzdGRvdXQuCi0gIC8vIFRvIHByb3ZlIHRoaXMsIHJ1biAndGVzdCB8IHpjYXQnLgotICBvcyA8PCAiSGVsbG8sIE1vbW15IiA8PCBlbmRsOwotCi0gIG9zIDw8IHNldGNvbXByZXNzaW9ubGV2ZWwoIFpfTk9fQ09NUFJFU1NJT04gKTsKLSAgb3MgPDwgImhlbGxvLCBoZWxsbywgaGksIGhvISIgPDwgZW5kbDsKLQotICBzZXRjb21wcmVzc2lvbmxldmVsKCBvcywgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICkKLSAgICA8PCAiSSdtIGNvbXByZXNzaW5nIGFnYWluIiA8PCBlbmRsOwotCi0gIG9zLmNsb3NlKCk7Ci0KLSAgcmV0dXJuIDA7Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtL3pmc3RyZWFtLmNwcCBiL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtL3pmc3RyZWFtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjZDg1Zi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbS96ZnN0cmVhbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotCi0jaW5jbHVkZSAiemZzdHJlYW0uaCIKLQotZ3pmaWxlYnVmOjpnemZpbGVidWYoKSA6Ci0gIGZpbGUoTlVMTCksCi0gIG1vZGUoMCksCi0gIG93bl9maWxlX2Rlc2NyaXB0b3IoMCkKLXsgfQotCi1nemZpbGVidWY6On5nemZpbGVidWYoKSB7Ci0KLSAgc3luYygpOwotICBpZiAoIG93bl9maWxlX2Rlc2NyaXB0b3IgKQotICAgIGNsb3NlKCk7Ci0KLX0KLQotZ3pmaWxlYnVmICpnemZpbGVidWY6Om9wZW4oIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlvX21vZGUgKSB7Ci0KLSAgaWYgKCBpc19vcGVuKCkgKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNoYXIgY2hhcl9tb2RlWzEwXTsKLSAgY2hhciAqcCA9IGNoYXJfbW9kZTsKLQotICBpZiAoIGlvX21vZGUgJiBpb3M6OmluICkgewotICAgIG1vZGUgPSBpb3M6OmluOwotICAgICpwKysgPSAncic7Ci0gIH0gZWxzZSBpZiAoIGlvX21vZGUgJiBpb3M6OmFwcCApIHsKLSAgICBtb2RlID0gaW9zOjphcHA7Ci0gICAgKnArKyA9ICdhJzsKLSAgfSBlbHNlIHsKLSAgICBtb2RlID0gaW9zOjpvdXQ7Ci0gICAgKnArKyA9ICd3JzsKLSAgfQotCi0gIGlmICggaW9fbW9kZSAmIGlvczo6YmluYXJ5ICkgewotICAgIG1vZGUgfD0gaW9zOjpiaW5hcnk7Ci0gICAgKnArKyA9ICdiJzsKLSAgfQotCi0gIC8vIEhhcmQgY29kZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwKLSAgaWYgKCBpb19tb2RlICYgKGlvczo6b3V0fGlvczo6YXBwICkpIHsKLSAgICAqcCsrID0gJzknOwotICB9Ci0KLSAgLy8gUHV0IHRoZSBlbmQtb2Ytc3RyaW5nIGluZGljYXRvcgotICAqcCA9ICdcMCc7Ci0KLSAgaWYgKCAoZmlsZSA9IGd6b3BlbihuYW1lLCBjaGFyX21vZGUpKSA9PSBOVUxMICkKLSAgICByZXR1cm4gTlVMTDsKLQotICBvd25fZmlsZV9kZXNjcmlwdG9yID0gMTsKLQotICByZXR1cm4gdGhpczsKLQotfQotCi1nemZpbGVidWYgKmd6ZmlsZWJ1Zjo6YXR0YWNoKCBpbnQgZmlsZV9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlvX21vZGUgKSB7Ci0KLSAgaWYgKCBpc19vcGVuKCkgKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNoYXIgY2hhcl9tb2RlWzEwXTsKLSAgY2hhciAqcCA9IGNoYXJfbW9kZTsKLQotICBpZiAoIGlvX21vZGUgJiBpb3M6OmluICkgewotICAgIG1vZGUgPSBpb3M6OmluOwotICAgICpwKysgPSAncic7Ci0gIH0gZWxzZSBpZiAoIGlvX21vZGUgJiBpb3M6OmFwcCApIHsKLSAgICBtb2RlID0gaW9zOjphcHA7Ci0gICAgKnArKyA9ICdhJzsKLSAgfSBlbHNlIHsKLSAgICBtb2RlID0gaW9zOjpvdXQ7Ci0gICAgKnArKyA9ICd3JzsKLSAgfQotCi0gIGlmICggaW9fbW9kZSAmIGlvczo6YmluYXJ5ICkgewotICAgIG1vZGUgfD0gaW9zOjpiaW5hcnk7Ci0gICAgKnArKyA9ICdiJzsKLSAgfQotCi0gIC8vIEhhcmQgY29kZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwKLSAgaWYgKCBpb19tb2RlICYgKGlvczo6b3V0fGlvczo6YXBwICkpIHsKLSAgICAqcCsrID0gJzknOwotICB9Ci0KLSAgLy8gUHV0IHRoZSBlbmQtb2Ytc3RyaW5nIGluZGljYXRvcgotICAqcCA9ICdcMCc7Ci0KLSAgaWYgKCAoZmlsZSA9IGd6ZG9wZW4oZmlsZV9kZXNjcmlwdG9yLCBjaGFyX21vZGUpKSA9PSBOVUxMICkKLSAgICByZXR1cm4gTlVMTDsKLQotICBvd25fZmlsZV9kZXNjcmlwdG9yID0gMDsKLQotICByZXR1cm4gdGhpczsKLQotfQotCi1nemZpbGVidWYgKmd6ZmlsZWJ1Zjo6Y2xvc2UoKSB7Ci0KLSAgaWYgKCBpc19vcGVuKCkgKSB7Ci0KLSAgICBzeW5jKCk7Ci0gICAgZ3pjbG9zZSggZmlsZSApOwotICAgIGZpbGUgPSBOVUxMOwotCi0gIH0KLQotICByZXR1cm4gdGhpczsKLQotfQotCi1pbnQgZ3pmaWxlYnVmOjpzZXRjb21wcmVzc2lvbmxldmVsKCBpbnQgY29tcF9sZXZlbCApIHsKLQotICByZXR1cm4gZ3pzZXRwYXJhbXMoZmlsZSwgY29tcF9sZXZlbCwgLTIpOwotCi19Ci0KLWludCBnemZpbGVidWY6OnNldGNvbXByZXNzaW9uc3RyYXRlZ3koIGludCBjb21wX3N0cmF0ZWd5ICkgewotCi0gIHJldHVybiBnenNldHBhcmFtcyhmaWxlLCAtMiwgY29tcF9zdHJhdGVneSk7Ci0KLX0KLQotCi1zdHJlYW1wb3MgZ3pmaWxlYnVmOjpzZWVrb2ZmKCBzdHJlYW1vZmYgb2ZmLCBpb3M6OnNlZWtfZGlyIGRpciwgaW50IHdoaWNoICkgewotCi0gIHJldHVybiBzdHJlYW1wb3MoRU9GKTsKLQotfQotCi1pbnQgZ3pmaWxlYnVmOjp1bmRlcmZsb3coKSB7Ci0KLSAgLy8gSWYgdGhlIGZpbGUgaGFzbid0IGJlZW4gb3BlbmVkIGZvciByZWFkaW5nLCBlcnJvci4KLSAgaWYgKCAhaXNfb3BlbigpIHx8ICEobW9kZSAmIGlvczo6aW4pICkKLSAgICByZXR1cm4gRU9GOwotCi0gIC8vIGlmIGEgYnVmZmVyIGRvZXNuJ3QgZXhpc3RzLCBhbGxvY2F0ZSBvbmUuCi0gIGlmICggIWJhc2UoKSApIHsKLQotICAgIGlmICggKGFsbG9jYXRlKCkpID09IEVPRiApCi0gICAgICByZXR1cm4gRU9GOwotICAgIHNldHAoMCwwKTsKLQotICB9IGVsc2UgewotCi0gICAgaWYgKCBpbl9hdmFpbCgpICkKLSAgICAgIHJldHVybiAodW5zaWduZWQgY2hhcikgKmdwdHIoKTsKLQotICAgIGlmICggb3V0X3dhaXRpbmcoKSApIHsKLSAgICAgIGlmICggZmx1c2hidWYoKSA9PSBFT0YgKQotICAgICAgICByZXR1cm4gRU9GOwotICAgIH0KLQotICB9Ci0KLSAgLy8gQXR0ZW1wdCB0byBmaWxsIHRoZSBidWZmZXIuCi0KLSAgaW50IHJlc3VsdCA9IGZpbGxidWYoKTsKLSAgaWYgKCByZXN1bHQgPT0gRU9GICkgewotICAgIC8vIGRpc2FibGUgZ2V0IGFyZWEKLSAgICBzZXRnKDAsMCwwKTsKLSAgICByZXR1cm4gRU9GOwotICB9Ci0KLSAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAqZ3B0cigpOwotCi19Ci0KLWludCBnemZpbGVidWY6Om92ZXJmbG93KCBpbnQgYyApIHsKLQotICBpZiAoICFpc19vcGVuKCkgfHwgIShtb2RlICYgaW9zOjpvdXQpICkKLSAgICByZXR1cm4gRU9GOwotCi0gIGlmICggIWJhc2UoKSApIHsKLSAgICBpZiAoIGFsbG9jYXRlKCkgPT0gRU9GICkKLSAgICAgIHJldHVybiBFT0Y7Ci0gICAgc2V0ZygwLDAsMCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGluX2F2YWlsKCkpIHsKLSAgICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0gICAgaWYgKG91dF93YWl0aW5nKCkpIHsKLSAgICAgIGlmIChmbHVzaGJ1ZigpID09IEVPRikKLSAgICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0gIH0KLQotICBpbnQgYmwgPSBibGVuKCk7Ci0gIHNldHAoIGJhc2UoKSwgYmFzZSgpICsgYmwpOwotCi0gIGlmICggYyAhPSBFT0YgKSB7Ci0KLSAgICAqcHB0cigpID0gYzsKLSAgICBwYnVtcCgxKTsKLQotICB9Ci0KLSAgcmV0dXJuIDA7Ci0KLX0KLQotaW50IGd6ZmlsZWJ1Zjo6c3luYygpIHsKLQotICBpZiAoICFpc19vcGVuKCkgKQotICAgIHJldHVybiBFT0Y7Ci0KLSAgaWYgKCBvdXRfd2FpdGluZygpICkKLSAgICByZXR1cm4gZmx1c2hidWYoKTsKLQotICByZXR1cm4gMDsKLQotfQotCi1pbnQgZ3pmaWxlYnVmOjpmbHVzaGJ1ZigpIHsKLQotICBpbnQgbjsKLSAgY2hhciAqcTsKLQotICBxID0gcGJhc2UoKTsKLSAgbiA9IHBwdHIoKSAtIHE7Ci0KLSAgaWYgKCBnendyaXRlKCBmaWxlLCBxLCBuKSA8IG4gKQotICAgIHJldHVybiBFT0Y7Ci0KLSAgc2V0cCgwLDApOwotCi0gIHJldHVybiAwOwotCi19Ci0KLWludCBnemZpbGVidWY6OmZpbGxidWYoKSB7Ci0KLSAgaW50IHJlcXVpcmVkOwotICBjaGFyICpwOwotCi0gIHAgPSBiYXNlKCk7Ci0KLSAgcmVxdWlyZWQgPSBibGVuKCk7Ci0KLSAgaW50IHQgPSBnenJlYWQoIGZpbGUsIHAsIHJlcXVpcmVkICk7Ci0KLSAgaWYgKCB0IDw9IDApIHJldHVybiBFT0Y7Ci0KLSAgc2V0ZyggYmFzZSgpLCBiYXNlKCksIGJhc2UoKSt0KTsKLQotICByZXR1cm4gdDsKLQotfQotCi1nemZpbGVzdHJlYW1fY29tbW9uOjpnemZpbGVzdHJlYW1fY29tbW9uKCkgOgotICBpb3MoIGd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkgKQoteyB9Ci0KLWd6ZmlsZXN0cmVhbV9jb21tb246On5nemZpbGVzdHJlYW1fY29tbW9uKCkKLXsgfQotCi12b2lkIGd6ZmlsZXN0cmVhbV9jb21tb246OmF0dGFjaCggaW50IGZkLCBpbnQgaW9fbW9kZSApIHsKLQotICBpZiAoICFidWZmZXIuYXR0YWNoKCBmZCwgaW9fbW9kZSkgKQotICAgIGNsZWFyKCBpb3M6OmZhaWxiaXQgfCBpb3M6OmJhZGJpdCApOwotICBlbHNlCi0gICAgY2xlYXIoKTsKLQotfQotCi12b2lkIGd6ZmlsZXN0cmVhbV9jb21tb246Om9wZW4oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlICkgewotCi0gIGlmICggIWJ1ZmZlci5vcGVuKCBuYW1lLCBpb19tb2RlICkgKQotICAgIGNsZWFyKCBpb3M6OmZhaWxiaXQgfCBpb3M6OmJhZGJpdCApOwotICBlbHNlCi0gICAgY2xlYXIoKTsKLQotfQotCi12b2lkIGd6ZmlsZXN0cmVhbV9jb21tb246OmNsb3NlKCkgewotCi0gIGlmICggIWJ1ZmZlci5jbG9zZSgpICkKLSAgICBjbGVhciggaW9zOjpmYWlsYml0IHwgaW9zOjpiYWRiaXQgKTsKLQotfQotCi1nemZpbGVidWYgKmd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkKLXsKLSAgcmV0dXJuICZidWZmZXI7Ci19Ci0KLWd6aWZzdHJlYW06Omd6aWZzdHJlYW0oKSA6Ci0gIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCi17Ci0gIGNsZWFyKCBpb3M6OmJhZGJpdCApOwotfQotCi1nemlmc3RyZWFtOjpnemlmc3RyZWFtKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApIDoKLSAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKLXsKLSAgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6b3BlbiggbmFtZSwgaW9fbW9kZSApOwotfQotCi1nemlmc3RyZWFtOjpnemlmc3RyZWFtKCBpbnQgZmQsIGludCBpb19tb2RlICkgOgotICBpb3MoIGd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkgKQotewotICBnemZpbGVzdHJlYW1fY29tbW9uOjphdHRhY2goIGZkLCBpb19tb2RlICk7Ci19Ci0KLWd6aWZzdHJlYW06On5nemlmc3RyZWFtKCkgeyB9Ci0KLWd6b2ZzdHJlYW06Omd6b2ZzdHJlYW0oKSA6Ci0gIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCi17Ci0gIGNsZWFyKCBpb3M6OmJhZGJpdCApOwotfQotCi1nem9mc3RyZWFtOjpnem9mc3RyZWFtKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApIDoKLSAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKLXsKLSAgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6b3BlbiggbmFtZSwgaW9fbW9kZSApOwotfQotCi1nem9mc3RyZWFtOjpnem9mc3RyZWFtKCBpbnQgZmQsIGludCBpb19tb2RlICkgOgotICBpb3MoIGd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkgKQotewotICBnemZpbGVzdHJlYW1fY29tbW9uOjphdHRhY2goIGZkLCBpb19tb2RlICk7Ci19Ci0KLWd6b2ZzdHJlYW06On5nem9mc3RyZWFtKCkgeyB9CmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbS96ZnN0cmVhbS5oIGIvbGlicy96bGliL2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3OTA5OC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbS96ZnN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLQotI2lmbmRlZiB6ZnN0cmVhbV9oCi0jZGVmaW5lIHpmc3RyZWFtX2gKLQotI2luY2x1ZGUgPGZzdHJlYW0uaD4KLSNpbmNsdWRlICJ6bGliLmgiCi0KLWNsYXNzIGd6ZmlsZWJ1ZiA6IHB1YmxpYyBzdHJlYW1idWYgewotCi1wdWJsaWM6Ci0KLSAgZ3pmaWxlYnVmKCApOwotICB2aXJ0dWFsIH5nemZpbGVidWYoKTsKLQotICBnemZpbGVidWYgKm9wZW4oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlICk7Ci0gIGd6ZmlsZWJ1ZiAqYXR0YWNoKCBpbnQgZmlsZV9kZXNjcmlwdG9yLCBpbnQgaW9fbW9kZSApOwotICBnemZpbGVidWYgKmNsb3NlKCk7Ci0KLSAgaW50IHNldGNvbXByZXNzaW9ubGV2ZWwoIGludCBjb21wX2xldmVsICk7Ci0gIGludCBzZXRjb21wcmVzc2lvbnN0cmF0ZWd5KCBpbnQgY29tcF9zdHJhdGVneSApOwotCi0gIGlubGluZSBpbnQgaXNfb3BlbigpIGNvbnN0IHsgcmV0dXJuIChmaWxlICE9TlVMTCk7IH0KLQotICB2aXJ0dWFsIHN0cmVhbXBvcyBzZWVrb2ZmKCBzdHJlYW1vZmYsIGlvczo6c2Vla19kaXIsIGludCApOwotCi0gIHZpcnR1YWwgaW50IHN5bmMoKTsKLQotcHJvdGVjdGVkOgotCi0gIHZpcnR1YWwgaW50IHVuZGVyZmxvdygpOwotICB2aXJ0dWFsIGludCBvdmVyZmxvdyggaW50ID0gRU9GICk7Ci0KLXByaXZhdGU6Ci0KLSAgZ3pGaWxlIGZpbGU7Ci0gIHNob3J0IG1vZGU7Ci0gIHNob3J0IG93bl9maWxlX2Rlc2NyaXB0b3I7Ci0KLSAgaW50IGZsdXNoYnVmKCk7Ci0gIGludCBmaWxsYnVmKCk7Ci0KLX07Ci0KLWNsYXNzIGd6ZmlsZXN0cmVhbV9jb21tb24gOiB2aXJ0dWFsIHB1YmxpYyBpb3MgewotCi0gIGZyaWVuZCBjbGFzcyBnemlmc3RyZWFtOwotICBmcmllbmQgY2xhc3MgZ3pvZnN0cmVhbTsKLSAgZnJpZW5kIGd6b2ZzdHJlYW0gJnNldGNvbXByZXNzaW9ubGV2ZWwoIGd6b2ZzdHJlYW0gJiwgaW50ICk7Ci0gIGZyaWVuZCBnem9mc3RyZWFtICZzZXRjb21wcmVzc2lvbnN0cmF0ZWd5KCBnem9mc3RyZWFtICYsIGludCApOwotCi1wdWJsaWM6Ci0gIHZpcnR1YWwgfmd6ZmlsZXN0cmVhbV9jb21tb24oKTsKLQotICB2b2lkIGF0dGFjaCggaW50IGZkLCBpbnQgaW9fbW9kZSApOwotICB2b2lkIG9wZW4oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlICk7Ci0gIHZvaWQgY2xvc2UoKTsKLQotcHJvdGVjdGVkOgotICBnemZpbGVzdHJlYW1fY29tbW9uKCk7Ci0KLXByaXZhdGU6Ci0gIGd6ZmlsZWJ1ZiAqcmRidWYoKTsKLQotICBnemZpbGVidWYgYnVmZmVyOwotCi19OwotCi1jbGFzcyBnemlmc3RyZWFtIDogcHVibGljIGd6ZmlsZXN0cmVhbV9jb21tb24sIHB1YmxpYyBpc3RyZWFtIHsKLQotcHVibGljOgotCi0gIGd6aWZzdHJlYW0oKTsKLSAgZ3ppZnN0cmVhbSggY29uc3QgY2hhciAqbmFtZSwgaW50IGlvX21vZGUgPSBpb3M6OmluICk7Ci0gIGd6aWZzdHJlYW0oIGludCBmZCwgaW50IGlvX21vZGUgPSBpb3M6OmluICk7Ci0KLSAgdmlydHVhbCB+Z3ppZnN0cmVhbSgpOwotCi19OwotCi1jbGFzcyBnem9mc3RyZWFtIDogcHVibGljIGd6ZmlsZXN0cmVhbV9jb21tb24sIHB1YmxpYyBvc3RyZWFtIHsKLQotcHVibGljOgotCi0gIGd6b2ZzdHJlYW0oKTsKLSAgZ3pvZnN0cmVhbSggY29uc3QgY2hhciAqbmFtZSwgaW50IGlvX21vZGUgPSBpb3M6Om91dCApOwotICBnem9mc3RyZWFtKCBpbnQgZmQsIGludCBpb19tb2RlID0gaW9zOjpvdXQgKTsKLQotICB2aXJ0dWFsIH5nem9mc3RyZWFtKCk7Ci0KLX07Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGd6b21hbmlwIHsKLSAgZnJpZW5kIGd6b2ZzdHJlYW0gJm9wZXJhdG9yPDwoZ3pvZnN0cmVhbSAmLCBjb25zdCBnem9tYW5pcDxUPiAmKTsKLXB1YmxpYzoKLSAgZ3pvbWFuaXAoZ3pvZnN0cmVhbSAmKCpmKShnem9mc3RyZWFtICYsIFQpLCBUIHYpIDogZnVuYyhmKSwgdmFsKHYpIHsgfQotcHJpdmF0ZToKLSAgZ3pvZnN0cmVhbSAmKCpmdW5jKShnem9mc3RyZWFtICYsIFQpOwotICBUIHZhbDsKLX07Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IGd6b2ZzdHJlYW0gJm9wZXJhdG9yPDwoZ3pvZnN0cmVhbSAmcywgY29uc3QgZ3pvbWFuaXA8VD4gJm0pCi17Ci0gIHJldHVybiAoKm0uZnVuYykocywgbS52YWwpOwotfQotCi1pbmxpbmUgZ3pvZnN0cmVhbSAmc2V0Y29tcHJlc3Npb25sZXZlbCggZ3pvZnN0cmVhbSAmcywgaW50IGwgKQotewotICAocy5yZGJ1ZigpKS0+c2V0Y29tcHJlc3Npb25sZXZlbChsKTsKLSAgcmV0dXJuIHM7Ci19Ci0KLWlubGluZSBnem9mc3RyZWFtICZzZXRjb21wcmVzc2lvbnN0cmF0ZWd5KCBnem9mc3RyZWFtICZzLCBpbnQgbCApCi17Ci0gIChzLnJkYnVmKCkpLT5zZXRjb21wcmVzc2lvbnN0cmF0ZWd5KGwpOwotICByZXR1cm4gczsKLX0KLQotaW5saW5lIGd6b21hbmlwPGludD4gc2V0Y29tcHJlc3Npb25sZXZlbChpbnQgbCkKLXsKLSAgcmV0dXJuIGd6b21hbmlwPGludD4oJnNldGNvbXByZXNzaW9ubGV2ZWwsbCk7Ci19Ci0KLWlubGluZSBnem9tYW5pcDxpbnQ+IHNldGNvbXByZXNzaW9uc3RyYXRlZ3koaW50IGwpCi17Ci0gIHJldHVybiBnem9tYW5pcDxpbnQ+KCZzZXRjb21wcmVzc2lvbnN0cmF0ZWd5LGwpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtLmggYi9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbTIvenN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2QyMzMyLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqIENocmlzdGlhbiBNaWNoZWxzZW4gUmVzZWFyY2ggQVMKLSAqIEFkdmFuY2VkIENvbXB1dGluZwotICogRmFudG9mdHZlZ2VuIDM4LCA1MDM2IEJFUkdFTiwgTm9yd2F5Ci0gKiBodHRwOi8vd3d3LmNtci5ubwotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQotICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCi0gKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgotICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgQ2hyaXN0aWFuIE1pY2hlbHNlbiBSZXNlYXJjaCBBUyBtYWtlcyBubwotICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqLwotCi0jaWZuZGVmIFpTVFJFQU1fX0gKLSNkZWZpbmUgWlNUUkVBTV9fSAotCi0vKgotICogenN0cmVhbS5oIC0gQysrIGludGVyZmFjZSB0byB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiAkSWQ6IHpzdHJlYW0uaCAxLjEgMTk5Ny0wNi0yNSAxMjowMDo1NiswMiB0eWdlIEV4cCB0eWdlICQKLSAqLwotCi0jaW5jbHVkZSA8c3Ryc3RyZWFtLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJ6bGliLmgiCi0KLSNpZiBkZWZpbmVkKF9XSU4zMikKLSMgICBpbmNsdWRlIDxmY250bC5oPgotIyAgIGluY2x1ZGUgPGlvLmg+Ci0jICAgZGVmaW5lIFNFVF9CSU5BUllfTU9ERShmaWxlKSBzZXRtb2RlKGZpbGVubyhmaWxlKSwgT19CSU5BUlkpCi0jZWxzZQotIyAgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkKLSNlbmRpZgotCi1jbGFzcyB6c3RyaW5nbGVuIHsKLXB1YmxpYzoKLSAgICB6c3RyaW5nbGVuKGNsYXNzIGl6c3RyZWFtJik7Ci0gICAgenN0cmluZ2xlbihjbGFzcyBvenN0cmVhbSYsIGNvbnN0IGNoYXIqKTsKLSAgICBzaXplX3QgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWwud29yZDsgfQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgVmFsIHsgdW5zaWduZWQgY2hhciBieXRlOyBzaXplX3Qgd29yZDsgfSB2YWw7Ci19OwotCi0vLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaXpzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgaXpzdHJlYW0KLXsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGl6c3RyZWFtKCkgOiBtX2ZwKDApIHt9Ci0gICAgICAgIGl6c3RyZWFtKEZJTEUqIGZwKSA6IG1fZnAoMCkgeyBvcGVuKGZwKTsgfQotICAgICAgICBpenN0cmVhbShjb25zdCBjaGFyKiBuYW1lKSA6IG1fZnAoMCkgeyBvcGVuKG5hbWUpOyB9Ci0gICAgICAgIH5penN0cmVhbSgpIHsgY2xvc2UoKTsgfQotCi0gICAgICAgIC8qIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nLgotICAgICAgICAgKiBvcGVuKCkgY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0OwotICAgICAgICAgKiBpbiB0aGlzIGNhc2UgcmVhZCgpIHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQKLSAgICAgICAgICogZGVjb21wcmVzc2lvbi4gZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdHdvIGVycm9yCi0gICAgICAgICAqIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciogbmFtZSkgewotICAgICAgICAgICAgaWYgKG1fZnApIGNsb3NlKCk7Ci0gICAgICAgICAgICBtX2ZwID0gOjpnem9wZW4obmFtZSwgInJiIik7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG9wZW4oRklMRSogZnApIHsKLSAgICAgICAgICAgIFNFVF9CSU5BUllfTU9ERShmcCk7Ci0gICAgICAgICAgICBpZiAobV9mcCkgY2xvc2UoKTsKLSAgICAgICAgICAgIG1fZnAgPSA6Omd6ZG9wZW4oZmlsZW5vKGZwKSwgInJiIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGbHVzaGVzIGFsbCBwZW5kaW5nIGlucHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKLSAgICAgICAgICogYW5kIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgcmV0dXJuIHZhbHVlIGlzCi0gICAgICAgICAqIHRoZSB6bGliIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGVycm9yKCkgYmVsb3cpLgotICAgICAgICAgKi8KLSAgICAgICAgaW50IGNsb3NlKCkgewotICAgICAgICAgICAgaW50IHIgPSA6Omd6Y2xvc2UobV9mcCk7Ci0gICAgICAgICAgICBtX2ZwID0gMDsgcmV0dXJuIHI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBCaW5hcnkgcmVhZCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAgICAgICAgICovCi0gICAgICAgIGludCByZWFkKHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbikgewotICAgICAgICAgICAgcmV0dXJuIDo6Z3pyZWFkKG1fZnAsIGJ1ZiwgbGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQotICAgICAgICAgKiBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCi0gICAgICAgICAqIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgbm90IGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LAotICAgICAgICAgKiBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubwotICAgICAgICAgKiB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCi0gICAgICAgICAqLwotICAgICAgICBjb25zdCBjaGFyKiBlcnJvcihpbnQqIGVycm51bSkgewotICAgICAgICAgICAgcmV0dXJuIDo6Z3plcnJvcihtX2ZwLCBlcnJudW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgZ3pGaWxlIGZwKCkgeyByZXR1cm4gbV9mcDsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZ3pGaWxlIG1fZnA7Ci19OwotCi0vKgotICogQmluYXJ5IHJlYWQgdGhlIGdpdmVuIChhcnJheSBvZikgb2JqZWN0KHMpIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAqIElmIHRoZSBpbnB1dCBmaWxlIHdhcyBub3QgaW4gZ3ppcCBmb3JtYXQsIHJlYWQoKSBjb3BpZXMgdGhlIG9iamVjdHMgbnVtYmVyCi0gKiBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCi0gKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQKLSAqICgwIGZvciBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEl0ZW1zPgotaW5saW5lIGludCByZWFkKGl6c3RyZWFtJiB6cywgVCogeCwgSXRlbXMgaXRlbXMpIHsKLSAgICByZXR1cm4gOjpnenJlYWQoenMuZnAoKSwgeCwgaXRlbXMqc2l6ZW9mKFQpKTsKLX0KLQotLyoKLSAqIEJpbmFyeSBpbnB1dCB3aXRoIHRoZSAnPicgb3BlcmF0b3IuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPgotaW5saW5lIGl6c3RyZWFtJiBvcGVyYXRvcj4oaXpzdHJlYW0mIHpzLCBUJiB4KSB7Ci0gICAgOjpnenJlYWQoenMuZnAoKSwgJngsIHNpemVvZihUKSk7Ci0gICAgcmV0dXJuIHpzOwotfQotCi0KLWlubGluZSB6c3RyaW5nbGVuOjp6c3RyaW5nbGVuKGl6c3RyZWFtJiB6cykgewotICAgIHpzID4gdmFsLmJ5dGU7Ci0gICAgaWYgKHZhbC5ieXRlID09IDI1NSkgenMgPiB2YWwud29yZDsKLSAgICBlbHNlIHZhbC53b3JkID0gdmFsLmJ5dGU7Ci19Ci0KLS8qCi0gKiBSZWFkIGxlbmd0aCBvZiBzdHJpbmcgKyB0aGUgc3RyaW5nIHdpdGggdGhlICc+JyBvcGVyYXRvci4KLSAqLwotaW5saW5lIGl6c3RyZWFtJiBvcGVyYXRvcj4oaXpzdHJlYW0mIHpzLCBjaGFyKiB4KSB7Ci0gICAgenN0cmluZ2xlbiBsZW4oenMpOwotICAgIDo6Z3pyZWFkKHpzLmZwKCksIHgsIGxlbi52YWx1ZSgpKTsKLSAgICB4W2xlbi52YWx1ZSgpXSA9ICdcMCc7Ci0gICAgcmV0dXJuIHpzOwotfQotCi1pbmxpbmUgY2hhciogcmVhZF9zdHJpbmcoaXpzdHJlYW0mIHpzKSB7Ci0gICAgenN0cmluZ2xlbiBsZW4oenMpOwotICAgIGNoYXIqIHggPSBuZXcgY2hhcltsZW4udmFsdWUoKSsxXTsKLSAgICA6Omd6cmVhZCh6cy5mcCgpLCB4LCBsZW4udmFsdWUoKSk7Ci0gICAgeFtsZW4udmFsdWUoKV0gPSAnXDAnOwotICAgIHJldHVybiB4OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvenN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBvenN0cmVhbQotewotICAgIHB1YmxpYzoKLSAgICAgICAgb3pzdHJlYW0oKSA6IG1fZnAoMCksIG1fb3MoMCkgewotICAgICAgICB9Ci0gICAgICAgIG96c3RyZWFtKEZJTEUqIGZwLCBpbnQgbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pCi0gICAgICAgICAgICA6IG1fZnAoMCksIG1fb3MoMCkgewotICAgICAgICAgICAgb3BlbihmcCwgbGV2ZWwpOwotICAgICAgICB9Ci0gICAgICAgIG96c3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTikKLSAgICAgICAgICAgIDogbV9mcCgwKSwgbV9vcygwKSB7Ci0gICAgICAgICAgICBvcGVuKG5hbWUsIGxldmVsKTsKLSAgICAgICAgfQotICAgICAgICB+b3pzdHJlYW0oKSB7Ci0gICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHdyaXRpbmcuCi0gICAgICAgICAqIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGluIDAuLjkKLSAgICAgICAgICogZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdHdvIGVycm9yIGNhc2VzCi0gICAgICAgICAqIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciogbmFtZSwgaW50IGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSB7Ci0gICAgICAgICAgICBjaGFyIG1vZGVbNF0gPSAid2JcMCI7Ci0gICAgICAgICAgICBpZiAobGV2ZWwgIT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSBtb2RlWzJdID0gJzAnK2xldmVsOwotICAgICAgICAgICAgaWYgKG1fZnApIGNsb3NlKCk7Ci0gICAgICAgICAgICBtX2ZwID0gOjpnem9wZW4obmFtZSwgbW9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBvcGVuIGZyb20gYSBGSUxFIHBvaW50ZXIuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9wZW4oRklMRSogZnAsIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTikgewotICAgICAgICAgICAgU0VUX0JJTkFSWV9NT0RFKGZwKTsKLSAgICAgICAgICAgIGNoYXIgbW9kZVs0XSA9ICJ3YlwwIjsKLSAgICAgICAgICAgIGlmIChsZXZlbCAhPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIG1vZGVbMl0gPSAnMCcrbGV2ZWw7Ci0gICAgICAgICAgICBpZiAobV9mcCkgY2xvc2UoKTsKLSAgICAgICAgICAgIG1fZnAgPSA6Omd6ZG9wZW4oZmlsZW5vKGZwKSwgbW9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCi0gICAgICAgICAqIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHJldHVybiB2YWx1ZSBpcwotICAgICAgICAgKiB0aGUgemxpYiBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBlcnJvcigpIGJlbG93KS4KLSAgICAgICAgICovCi0gICAgICAgIGludCBjbG9zZSgpIHsKLSAgICAgICAgICAgIGlmIChtX29zKSB7Ci0gICAgICAgICAgICAgICAgOjpnendyaXRlKG1fZnAsIG1fb3MtPnN0cigpLCBtX29zLT5wY291bnQoKSk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlW10gbV9vcy0+c3RyKCk7IGRlbGV0ZSBtX29zOyBtX29zID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCByID0gOjpnemNsb3NlKG1fZnApOyBtX2ZwID0gMDsgcmV0dXJuIHI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBCaW5hcnkgd3JpdGUgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICAgICAgICAqLwotICAgICAgICBpbnQgd3JpdGUoY29uc3Qgdm9pZCogYnVmLCBzaXplX3QgbGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gOjpnendyaXRlKG1fZnAsICh2b2lkcCkgYnVmLCBsZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCi0gICAgICAgICAqIF9mbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCi0gICAgICAgICAqIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiBmbHVzaCgpIHJldHVybnMgWl9PSyBpZgotICAgICAgICAgKiB0aGUgZmx1c2hfIHBhcmFtZXRlciBpcyBaX0ZJTklTSCBhbmQgYWxsIG91dHB1dCBjb3VsZCBiZSBmbHVzaGVkLgotICAgICAgICAgKiBmbHVzaCgpIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IGNhbgotICAgICAgICAgKiBkZWdyYWRlIGNvbXByZXNzaW9uLgotICAgICAgICAgKi8KLSAgICAgICAgaW50IGZsdXNoKGludCBfZmx1c2gpIHsKLSAgICAgICAgICAgIG9zX2ZsdXNoKCk7Ci0gICAgICAgICAgICByZXR1cm4gOjpnemZsdXNoKG1fZnAsIF9mbHVzaCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUKLSAgICAgICAgICogZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgotICAgICAgICAgKiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKLSAgICAgICAgICogZXJybnVtIGlzIHNldCB0byBaX0VSUk5PIGFuZCB0aGUgYXBwbGljYXRpb24gbWF5IGNvbnN1bHQgZXJybm8KLSAgICAgICAgICogdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgotICAgICAgICAgKi8KLSAgICAgICAgY29uc3QgY2hhciogZXJyb3IoaW50KiBlcnJudW0pIHsKLSAgICAgICAgICAgIHJldHVybiA6Omd6ZXJyb3IobV9mcCwgZXJybnVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGd6RmlsZSBmcCgpIHsgcmV0dXJuIG1fZnA7IH0KLQotICAgICAgICBvc3RyZWFtJiBvcygpIHsKLSAgICAgICAgICAgIGlmIChtX29zID09IDApIG1fb3MgPSBuZXcgb3N0cnN0cmVhbTsKLSAgICAgICAgICAgIHJldHVybiAqbV9vczsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgb3NfZmx1c2goKSB7Ci0gICAgICAgICAgICBpZiAobV9vcyAmJiBtX29zLT5wY291bnQoKT4wKSB7Ci0gICAgICAgICAgICAgICAgb3N0cnN0cmVhbSogb3NzID0gbmV3IG9zdHJzdHJlYW07Ci0gICAgICAgICAgICAgICAgb3NzLT5maWxsKG1fb3MtPmZpbGwoKSk7Ci0gICAgICAgICAgICAgICAgb3NzLT5mbGFncyhtX29zLT5mbGFncygpKTsKLSAgICAgICAgICAgICAgICBvc3MtPnByZWNpc2lvbihtX29zLT5wcmVjaXNpb24oKSk7Ci0gICAgICAgICAgICAgICAgb3NzLT53aWR0aChtX29zLT53aWR0aCgpKTsKLSAgICAgICAgICAgICAgICA6Omd6d3JpdGUobV9mcCwgbV9vcy0+c3RyKCksIG1fb3MtPnBjb3VudCgpKTsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBtX29zLT5zdHIoKTsgZGVsZXRlIG1fb3M7IG1fb3MgPSBvc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGd6RmlsZSBtX2ZwOwotICAgICAgICBvc3Ryc3RyZWFtKiBtX29zOwotfTsKLQotLyoKLSAqIEJpbmFyeSB3cml0ZSB0aGUgZ2l2ZW4gKGFycmF5IG9mKSBvYmplY3QocykgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgotICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuCi0gKiAoMCBpbiBjYXNlIG9mIGVycm9yKS4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEl0ZW1zPgotaW5saW5lIGludCB3cml0ZShvenN0cmVhbSYgenMsIGNvbnN0IFQqIHgsIEl0ZW1zIGl0ZW1zKSB7Ci0gICAgcmV0dXJuIDo6Z3p3cml0ZSh6cy5mcCgpLCAodm9pZHApIHgsIGl0ZW1zKnNpemVvZihUKSk7Ci19Ci0KLS8qCi0gKiBCaW5hcnkgb3V0cHV0IHdpdGggdGhlICc8JyBvcGVyYXRvci4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1pbmxpbmUgb3pzdHJlYW0mIG9wZXJhdG9yPChvenN0cmVhbSYgenMsIGNvbnN0IFQmIHgpIHsKLSAgICA6Omd6d3JpdGUoenMuZnAoKSwgKHZvaWRwKSAmeCwgc2l6ZW9mKFQpKTsKLSAgICByZXR1cm4genM7Ci19Ci0KLWlubGluZSB6c3RyaW5nbGVuOjp6c3RyaW5nbGVuKG96c3RyZWFtJiB6cywgY29uc3QgY2hhciogeCkgewotICAgIHZhbC5ieXRlID0gMjU1OyAgdmFsLndvcmQgPSA6OnN0cmxlbih4KTsKLSAgICBpZiAodmFsLndvcmQgPCAyNTUpIHpzIDwgKHZhbC5ieXRlID0gdmFsLndvcmQpOwotICAgIGVsc2UgenMgPCB2YWw7Ci19Ci0KLS8qCi0gKiBXcml0ZSBsZW5ndGggb2Ygc3RyaW5nICsgdGhlIHN0cmluZyB3aXRoIHRoZSAnPCcgb3BlcmF0b3IuCi0gKi8KLWlubGluZSBvenN0cmVhbSYgb3BlcmF0b3I8KG96c3RyZWFtJiB6cywgY29uc3QgY2hhciogeCkgewotICAgIHpzdHJpbmdsZW4gbGVuKHpzLCB4KTsKLSAgICA6Omd6d3JpdGUoenMuZnAoKSwgKHZvaWRwKSB4LCBsZW4udmFsdWUoKSk7Ci0gICAgcmV0dXJuIHpzOwotfQotCi0jaWZkZWYgX01TQ19WRVIKLWlubGluZSBvenN0cmVhbSYgb3BlcmF0b3I8KG96c3RyZWFtJiB6cywgY2hhciogY29uc3QmIHgpIHsKLSAgICByZXR1cm4genMgPCAoY29uc3QgY2hhciopIHg7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIEFzY2lpIHdyaXRlIHdpdGggdGhlIDw8IG9wZXJhdG9yOwotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWlubGluZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG96c3RyZWFtJiB6cywgY29uc3QgVCYgeCkgewotICAgIHpzLm9zX2ZsdXNoKCk7Ci0gICAgcmV0dXJuIHpzLm9zKCkgPDwgeDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbTIvenN0cmVhbV90ZXN0LmNwcCBiL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjczZjYyLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI2luY2x1ZGUgInpzdHJlYW0uaCIKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8aW9tYW5pcC5oPgotCi12b2lkIG1haW4oKSB7Ci0gICAgY2hhciBoWzI1Nl0gPSAiSGVsbG8iOwotICAgIGNoYXIqIGcgPSAiR29vZGJ5ZSI7Ci0gICAgb3pzdHJlYW0gb3V0KCJ0ZW1wLmd6Iik7Ci0gICAgb3V0IDwgIlRoaXMgd29ya3Mgd2VsbCIgPCBoIDwgZzsKLSAgICBvdXQuY2xvc2UoKTsKLQotICAgIGl6c3RyZWFtIGluKCJ0ZW1wLmd6Iik7IC8vIHJlYWQgaXQgYmFjawotICAgIGNoYXIgKnggPSByZWFkX3N0cmluZyhpbiksICp5ID0gbmV3IGNoYXJbMjU2XSwgelsyNTZdOwotICAgIGluID4geSA+IHo7Ci0gICAgaW4uY2xvc2UoKTsKLSAgICBjb3V0IDw8IHggPDwgZW5kbCA8PCB5IDw8IGVuZGwgPDwgeiA8PCBlbmRsOwotCi0gICAgb3V0Lm9wZW4oInRlbXAuZ3oiKTsgLy8gdHJ5IGFzY2lpIG91dHB1dDsgemNhdCB0ZW1wLmd6IHRvIHNlZSB0aGUgcmVzdWx0cwotICAgIG91dCA8PCBzZXR3KDUwKSA8PCBzZXRmaWxsKCcjJykgPDwgc2V0cHJlY2lzaW9uKDIwKSA8PCB4IDw8IGVuZGwgPDwgeSA8PCBlbmRsIDw8IHogPDwgZW5kbDsKLSAgICBvdXQgPDwgeiA8PCBlbmRsIDw8IHkgPDwgZW5kbCA8PCB4IDw8IGVuZGw7Ci0gICAgb3V0IDw8IDEuMTIzNDU2Nzg5MDEyMzQ1Njc4OSA8PCBlbmRsOwotCi0gICAgZGVsZXRlW10geDsgZGVsZXRlW10geTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtMy9SRUFETUUgYi9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbTMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2IzMTlhLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtMy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1UaGVzZSBjbGFzc2VzIHByb3ZpZGUgYSBDKysgc3RyZWFtIGludGVyZmFjZSB0byB0aGUgemxpYiBsaWJyYXJ5LiBJdCBhbGxvd3MgeW91Ci10byBkbyB0aGluZ3MgbGlrZToKLQotICBnem9mc3RyZWFtIG91dGYoImJsYWguZ3oiKTsKLSAgb3V0ZiA8PCAiVGhlc2UgZ28gaW50byB0aGUgZ3ppcCBmaWxlICIgPDwgMTIzIDw8IGVuZGw7Ci0KLUl0IGRvZXMgdGhpcyBieSBkZXJpdmluZyBhIHNwZWNpYWxpemVkIHN0cmVhbSBidWZmZXIgZm9yIGd6aXBwZWQgZmlsZXMsIHdoaWNoIGlzCi10aGUgd2F5IFN0cm91c3RydXAgd291bGQgaGF2ZSBkb25lIGl0LiA6LT4KLQotVGhlIGd6aWZzdHJlYW0gYW5kIGd6b2ZzdHJlYW0gY2xhc3NlcyB3ZXJlIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBLZXZpbiBSdWxhbmQKLWFuZCBtYWRlIGF2YWlsYWJsZSBpbiB0aGUgemxpYiBjb250cmliL2lvc3RyZWFtIGRpcmVjdG9yeS4gVGhlIG9sZGVyIHZlcnNpb24gc3RpbGwKLWNvbXBpbGVzIHVuZGVyIGdjYyAyLnh4LCBidXQgbm90IHVuZGVyIGdjYyAzLnh4LCB3aGljaCBzcGFya2VkIHRoZSBkZXZlbG9wbWVudCBvZgotdGhpcyB2ZXJzaW9uLgotCi1UaGUgbmV3IGNsYXNzZXMgYXJlIGFzIHN0YW5kYXJkLWNvbXBsaWFudCBhcyBwb3NzaWJsZSwgY2xvc2VseSBmb2xsb3dpbmcgdGhlCi1hcHByb2FjaCBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSdzIGZzdHJlYW0gY2xhc3Nlcy4gSXQgY29tcGlsZXMgdW5kZXIgZ2NjIHZlcnNpb25zCi0zLjIgYW5kIDMuMywgYnV0IG5vdCB1bmRlciBnY2MgMi54eC4gVGhpcyBpcyBtYWlubHkgZHVlIHRvIGNoYW5nZXMgaW4gdGhlIHN0YW5kYXJkCi1saWJyYXJ5IG5hbWluZyBzY2hlbWUuIFRoZSBuZXcgdmVyc2lvbiBvZiBnemlmc3RyZWFtL2d6b2ZzdHJlYW0vZ3pmaWxlYnVmIGRpZmZlcnMKLWZyb20gdGhlIHByZXZpb3VzIG9uZSBpbiB0aGUgZm9sbG93aW5nIHJlc3BlY3RzOgotLSBhZGRlZCBzaG93bWFueWMKLS0gYWRkZWQgc2V0YnVmLCB3aXRoIHN1cHBvcnQgZm9yIHVuYnVmZmVyZWQgb3V0cHV0IHZpYSBzZXRidWYoMCwwKQotLSBhIGZldyBidWcgZml4ZXMgb2Ygc3RyZWFtIGJlaGF2aW9yCi0tIGd6aXBwZWQgb3V0cHV0IGZpbGUgb3BlbmVkIHdpdGggZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCBpbnN0ZWFkIG9mIG1heGltdW0gbGV2ZWwKLS0gc2V0Y29tcHJlc3Npb25sZXZlbCgpL3N0cmF0ZWd5KCkgbWVtYmVycyByZXBsYWNlZCBieSBzaW5nbGUgc2V0Y29tcHJlc3Npb24oKQotCi1UaGUgY29kZSBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRoIHRoZSBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlCi1hbmQgc2VsbCBpdCBmb3IgYW55IHB1cnBvc2Ugd2l0aG91dCBmZWUuCi0KLUx1ZHdpZyBTY2h3YXJkdAotPHNjaHdhcmR0QHN1bi5hYy56YT4KLQotRFNQIExhYgotRWxlY3RyaWNhbCAmIEVsZWN0cm9uaWMgRW5naW5lZXJpbmcgRGVwYXJ0bWVudAotVW5pdmVyc2l0eSBvZiBTdGVsbGVuYm9zY2gKLVNvdXRoIEFmcmljYQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvaW9zdHJlYW0zL1RPRE8gYi9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbTMvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzMmY5Ny4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbTMvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLVBvc3NpYmxlIHVwZ3JhZGVzIHRvIGd6ZmlsZWJ1ZjoKLQotLSBUaGUgYWJpbGl0eSB0byBkbyBwdXRiYWNrIChlLmcuIHB1dGJhY2tmYWlsKQotCi0tIFRoZSBhYmlsaXR5IHRvIHNlZWsgKHpsaWIgc3VwcG9ydHMgdGhpcywgYnV0IGNvdWxkIGJlIHNsb3cvdHJpY2t5KQotCi0tIFNpbXVsdGFuZW91cyByZWFkL3dyaXRlIGFjY2VzcyAoZG9lcyBpdCBtYWtlIHNlbnNlPykKLQotLSBTdXBwb3J0IGZvciBpb3NfYmFzZTo6YXRlIG9wZW4gbW9kZQotCi0tIExvY2FsZSBzdXBwb3J0PwotCi0tIENoZWNrIHB1YmxpYyBpbnRlcmZhY2UgdG8gc2VlIHdoaWNoIGNhbGxzIGdpdmUgcHJvYmxlbXMKLSAgKGR1ZSB0byBkZXBlbmRlbmNlIG9uIGxpYnJhcnkgaW50ZXJuYWxzKQotCi0tIE92ZXJyaWRlIG9wZXJhdG9yPDwob3N0cmVhbSYsIGd6ZmlsZWJ1ZiopIHRvIGFsbG93IGRpcmVjdCBjb3B5aW5nCi0gIG9mIHN0cmVhbSBidWZmZXIgdG8gc3RyZWFtICggaS5lLiBvcyA8PCBpcy5yZGJ1ZigpOyApCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbTMvdGVzdC5jYyBiL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtMy90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDIzNTMzLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtMy90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIFRlc3QgcHJvZ3JhbSBmb3IgZ3ppZnN0cmVhbSBhbmQgZ3pvZnN0cmVhbQotICoKLSAqIGJ5IEx1ZHdpZyBTY2h3YXJkdCA8c2Nod2FyZHRAc3VuLmFjLnphPgotICogb3JpZ2luYWwgdmVyc2lvbiBieSBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KLSAqLwotCi0jaW5jbHVkZSAiemZzdHJlYW0uaCIKLSNpbmNsdWRlIDxpb3N0cmVhbT4gICAgICAvLyBmb3IgY291dAotCi1pbnQgbWFpbigpIHsKLQotICBnem9mc3RyZWFtIG91dGY7Ci0gIGd6aWZzdHJlYW0gaW5mOwotICBjaGFyIGJ1Zls4MF07Ci0KLSAgb3V0Zi5vcGVuKCJ0ZXN0MS50eHQuZ3oiKTsKLSAgb3V0ZiA8PCAiVGhlIHF1aWNrIGJyb3duIGZveCBzaWRlc3RlcHBlZCB0aGUgbGF6eSBjYW5pbmVcbiIKLSAgICAgICA8PCAxLjMgPDwgIlxuUGxhbiAiIDw8IDkgPDwgc3RkOjplbmRsOwotICBvdXRmLmNsb3NlKCk7Ci0gIHN0ZDo6Y291dCA8PCAiV3JvdGUgdGhlIGZvbGxvd2luZyBtZXNzYWdlIHRvICd0ZXN0MS50eHQuZ3onIChjaGVjayB3aXRoIHpjYXQgb3Igemxlc3MpOlxuIgotICAgICAgICAgICAgPDwgIlRoZSBxdWljayBicm93biBmb3ggc2lkZXN0ZXBwZWQgdGhlIGxhenkgY2FuaW5lXG4iCi0gICAgICAgICAgICA8PCAxLjMgPDwgIlxuUGxhbiAiIDw8IDkgPDwgc3RkOjplbmRsOwotCi0gIHN0ZDo6Y291dCA8PCAiXG5SZWFkaW5nICd0ZXN0MS50eHQuZ3onIChidWZmZXJlZCkgcHJvZHVjZXM6XG4iOwotICBpbmYub3BlbigidGVzdDEudHh0Lmd6Iik7Ci0gIHdoaWxlIChpbmYuZ2V0bGluZShidWYsODAsJ1xuJykpIHsKLSAgICBzdGQ6OmNvdXQgPDwgYnVmIDw8ICJcdCgiIDw8IGluZi5yZGJ1ZigpLT5pbl9hdmFpbCgpIDw8ICIgY2hhcnMgbGVmdCBpbiBidWZmZXIpXG4iOwotICB9Ci0gIGluZi5jbG9zZSgpOwotCi0gIG91dGYucmRidWYoKS0+cHVic2V0YnVmKDAsMCk7Ci0gIG91dGYub3BlbigidGVzdDIudHh0Lmd6Iik7Ci0gIG91dGYgPDwgc2V0Y29tcHJlc3Npb24oWl9OT19DT01QUkVTU0lPTikKLSAgICAgICA8PCAiVGhlIHF1aWNrIGJyb3duIGZveCBzaWRlc3RlcHBlZCB0aGUgbGF6eSBjYW5pbmVcbiIKLSAgICAgICA8PCAxLjMgPDwgIlxuUGxhbiAiIDw8IDkgPDwgc3RkOjplbmRsOwotICBvdXRmLmNsb3NlKCk7Ci0gIHN0ZDo6Y291dCA8PCAiXG5Xcm90ZSB0aGUgc2FtZSBtZXNzYWdlIHRvICd0ZXN0Mi50eHQuZ3onIGluIHVuY29tcHJlc3NlZCBmb3JtIjsKLQotICBzdGQ6OmNvdXQgPDwgIlxuUmVhZGluZyAndGVzdDIudHh0Lmd6JyAodW5idWZmZXJlZCkgcHJvZHVjZXM6XG4iOwotICBpbmYucmRidWYoKS0+cHVic2V0YnVmKDAsMCk7Ci0gIGluZi5vcGVuKCJ0ZXN0Mi50eHQuZ3oiKTsKLSAgd2hpbGUgKGluZi5nZXRsaW5lKGJ1Ziw4MCwnXG4nKSkgewotICAgIHN0ZDo6Y291dCA8PCBidWYgPDwgIlx0KCIgPDwgaW5mLnJkYnVmKCktPmluX2F2YWlsKCkgPDwgIiBjaGFycyBsZWZ0IGluIGJ1ZmZlcilcbiI7Ci0gIH0KLSAgaW5mLmNsb3NlKCk7Ci0KLSAgcmV0dXJuIDA7Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtMy96ZnN0cmVhbS5jYyBiL2xpYnMvemxpYi9jb250cmliL2lvc3RyZWFtMy96ZnN0cmVhbS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlYjkzMy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbTMvemZzdHJlYW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLyoKLSAqIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCi0gKgotICogYnkgTHVkd2lnIFNjaHdhcmR0IDxzY2h3YXJkdEBzdW4uYWMuemE+Ci0gKiBvcmlnaW5hbCB2ZXJzaW9uIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgotICoKLSAqIFRoaXMgdmVyc2lvbiBpcyBzdGFuZGFyZC1jb21wbGlhbnQgYW5kIGNvbXBhdGlibGUgd2l0aCBnY2MgMy54LgotICovCi0KLSNpbmNsdWRlICJ6ZnN0cmVhbS5oIgotI2luY2x1ZGUgPGNzdHJpbmc+ICAgICAgICAgIC8vIGZvciBzdHJjcHksIHN0cmNhdCwgc3RybGVuIChtb2RlIHN0cmluZ3MpCi0jaW5jbHVkZSA8Y3N0ZGlvPiAgICAgICAgICAgLy8gZm9yIEJVRlNJWgotCi0vLyBJbnRlcm5hbCBidWZmZXIgc2l6ZXMgKGRlZmF1bHQgYW5kICJ1bmJ1ZmZlcmVkIiB2ZXJzaW9ucykKLSNkZWZpbmUgQklHQlVGU0laRSBCVUZTSVoKLSNkZWZpbmUgU01BTExCVUZTSVpFIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi1nemZpbGVidWY6Omd6ZmlsZWJ1ZigpCi06IGZpbGUoTlVMTCksIGlvX21vZGUoc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUoMCkpLCBvd25fZmQoZmFsc2UpLAotICBidWZmZXIoTlVMTCksIGJ1ZmZlcl9zaXplKEJJR0JVRlNJWkUpLCBvd25fYnVmZmVyKHRydWUpCi17Ci0gIC8vIE5vIGJ1ZmZlcnMgdG8gc3RhcnQgd2l0aAotICB0aGlzLT5kaXNhYmxlX2J1ZmZlcigpOwotfQotCi0vLyBEZXN0cnVjdG9yCi1nemZpbGVidWY6On5nemZpbGVidWYoKQotewotICAvLyBTeW5jIG91dHB1dCBidWZmZXIgYW5kIGNsb3NlIG9ubHkgaWYgcmVzcG9uc2libGUgZm9yIGZpbGUKLSAgLy8gKGkuZS4gYXR0YWNoZWQgc3RyZWFtcyBzaG91bGQgYmUgbGVmdCBvcGVuIGF0IHRoaXMgc3RhZ2UpCi0gIHRoaXMtPnN5bmMoKTsKLSAgaWYgKG93bl9mZCkKLSAgICB0aGlzLT5jbG9zZSgpOwotICAvLyBNYWtlIHN1cmUgaW50ZXJuYWwgYnVmZmVyIGlzIGRlYWxsb2NhdGVkCi0gIHRoaXMtPmRpc2FibGVfYnVmZmVyKCk7Ci19Ci0KLS8vIFNldCBjb21wcmVzc2lvbiBsZXZlbCBhbmQgc3RyYXRlZ3kKLWludAotZ3pmaWxlYnVmOjpzZXRjb21wcmVzc2lvbihpbnQgY29tcF9sZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBfc3RyYXRlZ3kpCi17Ci0gIHJldHVybiBnenNldHBhcmFtcyhmaWxlLCBjb21wX2xldmVsLCBjb21wX3N0cmF0ZWd5KTsKLX0KLQotLy8gT3BlbiBnemlwcGVkIGZpbGUKLWd6ZmlsZWJ1ZioKLWd6ZmlsZWJ1Zjo6b3Blbihjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUpCi17Ci0gIC8vIEZhaWwgaWYgZmlsZSBhbHJlYWR5IG9wZW4KLSAgaWYgKHRoaXMtPmlzX29wZW4oKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgLy8gRG9uJ3Qgc3VwcG9ydCBzaW11bHRhbmVvdXMgcmVhZC93cml0ZSBhY2Nlc3MgKHlldCkKLSAgaWYgKChtb2RlICYgc3RkOjppb3NfYmFzZTo6aW4pICYmIChtb2RlICYgc3RkOjppb3NfYmFzZTo6b3V0KSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvLyBCdWlsZCBtb2RlIHN0cmluZyBmb3IgZ3pvcGVuIGFuZCBjaGVjayBpdCBbMjcuOC4xLjMuMl0KLSAgY2hhciBjaGFyX21vZGVbNl0gPSAiXDBcMFwwXDBcMCI7Ci0gIGlmICghdGhpcy0+b3Blbl9tb2RlKG1vZGUsIGNoYXJfbW9kZSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gQXR0ZW1wdCB0byBvcGVuIGZpbGUKLSAgaWYgKChmaWxlID0gZ3pvcGVuKG5hbWUsIGNoYXJfbW9kZSkpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gT24gc3VjY2VzcywgYWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyIGFuZCBzZXQgZmxhZ3MKLSAgdGhpcy0+ZW5hYmxlX2J1ZmZlcigpOwotICBpb19tb2RlID0gbW9kZTsKLSAgb3duX2ZkID0gdHJ1ZTsKLSAgcmV0dXJuIHRoaXM7Ci19Ci0KLS8vIEF0dGFjaCB0byBnemlwcGVkIGZpbGUKLWd6ZmlsZWJ1ZioKLWd6ZmlsZWJ1Zjo6YXR0YWNoKGludCBmZCwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUpCi17Ci0gIC8vIEZhaWwgaWYgZmlsZSBhbHJlYWR5IG9wZW4KLSAgaWYgKHRoaXMtPmlzX29wZW4oKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgLy8gRG9uJ3Qgc3VwcG9ydCBzaW11bHRhbmVvdXMgcmVhZC93cml0ZSBhY2Nlc3MgKHlldCkKLSAgaWYgKChtb2RlICYgc3RkOjppb3NfYmFzZTo6aW4pICYmIChtb2RlICYgc3RkOjppb3NfYmFzZTo6b3V0KSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvLyBCdWlsZCBtb2RlIHN0cmluZyBmb3IgZ3pkb3BlbiBhbmQgY2hlY2sgaXQgWzI3LjguMS4zLjJdCi0gIGNoYXIgY2hhcl9tb2RlWzZdID0gIlwwXDBcMFwwXDAiOwotICBpZiAoIXRoaXMtPm9wZW5fbW9kZShtb2RlLCBjaGFyX21vZGUpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8vIEF0dGVtcHQgdG8gYXR0YWNoIHRvIGZpbGUKLSAgaWYgKChmaWxlID0gZ3pkb3BlbihmZCwgY2hhcl9tb2RlKSkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvLyBPbiBzdWNjZXNzLCBhbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXIgYW5kIHNldCBmbGFncwotICB0aGlzLT5lbmFibGVfYnVmZmVyKCk7Ci0gIGlvX21vZGUgPSBtb2RlOwotICBvd25fZmQgPSBmYWxzZTsKLSAgcmV0dXJuIHRoaXM7Ci19Ci0KLS8vIENsb3NlIGd6aXBwZWQgZmlsZQotZ3pmaWxlYnVmKgotZ3pmaWxlYnVmOjpjbG9zZSgpCi17Ci0gIC8vIEZhaWwgaW1tZWRpYXRlbHkgaWYgbm8gZmlsZSBpcyBvcGVuCi0gIGlmICghdGhpcy0+aXNfb3BlbigpKQotICAgIHJldHVybiBOVUxMOwotICAvLyBBc3N1bWUgc3VjY2VzcwotICBnemZpbGVidWYqIHJldHZhbCA9IHRoaXM7Ci0gIC8vIEF0dGVtcHQgdG8gc3luYyBhbmQgY2xvc2UgZ3ppcHBlZCBmaWxlCi0gIGlmICh0aGlzLT5zeW5jKCkgPT0gLTEpCi0gICAgcmV0dmFsID0gTlVMTDsKLSAgaWYgKGd6Y2xvc2UoZmlsZSkgPCAwKQotICAgIHJldHZhbCA9IE5VTEw7Ci0gIC8vIEZpbGUgaXMgbm93IGdvbmUgYW55d2F5IChwb3N0Y29uZGl0aW9uIFsyNy44LjEuMy44XSkKLSAgZmlsZSA9IE5VTEw7Ci0gIG93bl9mZCA9IGZhbHNlOwotICAvLyBEZXN0cm95IGludGVybmFsIGJ1ZmZlciBpZiBpdCBleGlzdHMKLSAgdGhpcy0+ZGlzYWJsZV9idWZmZXIoKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotCi0vLyBDb252ZXJ0IGludCBvcGVuIG1vZGUgdG8gbW9kZSBzdHJpbmcKLWJvb2wKLWd6ZmlsZWJ1Zjo6b3Blbl9tb2RlKHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICBjaGFyKiBjX21vZGUpIGNvbnN0Ci17Ci0gIGJvb2wgdGVzdGIgPSBtb2RlICYgc3RkOjppb3NfYmFzZTo6YmluYXJ5OwotICBib29sIHRlc3RpID0gbW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmluOwotICBib29sIHRlc3RvID0gbW9kZSAmIHN0ZDo6aW9zX2Jhc2U6Om91dDsKLSAgYm9vbCB0ZXN0dCA9IG1vZGUgJiBzdGQ6Omlvc19iYXNlOjp0cnVuYzsKLSAgYm9vbCB0ZXN0YSA9IG1vZGUgJiBzdGQ6Omlvc19iYXNlOjphcHA7Ci0KLSAgLy8gQ2hlY2sgZm9yIHZhbGlkIGZsYWcgY29tYmluYXRpb25zIC0gc2VlIFsyNy44LjEuMy4yXSAoVGFibGUgOTIpCi0gIC8vIE9yaWdpbmFsIHpmc3RyZWFtIGhhcmRjb2RlZCB0aGUgY29tcHJlc3Npb24gbGV2ZWwgdG8gbWF4aW11bSBoZXJlLi4uCi0gIC8vIERvdWJsZSB0aGUgdGltZSBmb3IgbGVzcyB0aGFuIDElIHNpemUgaW1wcm92ZW1lbnQgc2VlbXMKLSAgLy8gZXhjZXNzaXZlIHRob3VnaCAtIGtlZXBpbmcgaXQgYXQgdGhlIGRlZmF1bHQgbGV2ZWwKLSAgLy8gVG8gY2hhbmdlIGJhY2ssIGp1c3QgYXBwZW5kICI5IiB0byB0aGUgbmV4dCB0aHJlZSBtb2RlIHN0cmluZ3MKLSAgaWYgKCF0ZXN0aSAmJiB0ZXN0byAmJiAhdGVzdHQgJiYgIXRlc3RhKQotICAgIHN0cmNweShjX21vZGUsICJ3Iik7Ci0gIGlmICghdGVzdGkgJiYgdGVzdG8gJiYgIXRlc3R0ICYmIHRlc3RhKQotICAgIHN0cmNweShjX21vZGUsICJhIik7Ci0gIGlmICghdGVzdGkgJiYgdGVzdG8gJiYgdGVzdHQgJiYgIXRlc3RhKQotICAgIHN0cmNweShjX21vZGUsICJ3Iik7Ci0gIGlmICh0ZXN0aSAmJiAhdGVzdG8gJiYgIXRlc3R0ICYmICF0ZXN0YSkKLSAgICBzdHJjcHkoY19tb2RlLCAiciIpOwotICAvLyBObyByZWFkL3dyaXRlIG1vZGUgeWV0Ci0vLyAgaWYgKHRlc3RpICYmIHRlc3RvICYmICF0ZXN0dCAmJiAhdGVzdGEpCi0vLyAgICBzdHJjcHkoY19tb2RlLCAicisiKTsKLS8vICBpZiAodGVzdGkgJiYgdGVzdG8gJiYgdGVzdHQgJiYgIXRlc3RhKQotLy8gICAgc3RyY3B5KGNfbW9kZSwgIncrIik7Ci0KLSAgLy8gTW9kZSBzdHJpbmcgc2hvdWxkIGJlIGVtcHR5IGZvciBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIGZsYWdzCi0gIGlmIChzdHJsZW4oY19tb2RlKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHRlc3RiKQotICAgIHN0cmNhdChjX21vZGUsICJiIik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBEZXRlcm1pbmUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gaW50ZXJuYWwgZ2V0IGJ1ZmZlcgotc3RkOjpzdHJlYW1zaXplCi1nemZpbGVidWY6OnNob3dtYW55YygpCi17Ci0gIC8vIENhbGxzIHRvIHVuZGVyZmxvdyB3aWxsIGZhaWwgaWYgZmlsZSBub3Qgb3BlbmVkIGZvciByZWFkaW5nCi0gIGlmICghdGhpcy0+aXNfb3BlbigpIHx8ICEoaW9fbW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmluKSkKLSAgICByZXR1cm4gLTE7Ci0gIC8vIE1ha2Ugc3VyZSBnZXQgYXJlYSBpcyBpbiB1c2UKLSAgaWYgKHRoaXMtPmdwdHIoKSAmJiAodGhpcy0+Z3B0cigpIDwgdGhpcy0+ZWdwdHIoKSkpCi0gICAgcmV0dXJuIHN0ZDo6c3RyZWFtc2l6ZSh0aGlzLT5lZ3B0cigpIC0gdGhpcy0+Z3B0cigpKTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vLyBGaWxsIGdldCBhcmVhIGZyb20gZ3ppcHBlZCBmaWxlCi1nemZpbGVidWY6OmludF90eXBlCi1nemZpbGVidWY6OnVuZGVyZmxvdygpCi17Ci0gIC8vIElmIHNvbWV0aGluZyBpcyBsZWZ0IGluIHRoZSBnZXQgYXJlYSBieSBjaGFuY2UsIHJldHVybiBpdAotICAvLyAodGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgaGFwcGVuLCBhcyB1bmRlcmZsb3cgaXMgb25seSBzdXBwb3NlZAotICAvLyB0byBiZSBjYWxsZWQgd2hlbiBncHRyID49IGVncHRyLCBidXQgaXQgc2VydmVzIGFzIGVycm9yIGNoZWNrKQotICBpZiAodGhpcy0+Z3B0cigpICYmICh0aGlzLT5ncHRyKCkgPCB0aGlzLT5lZ3B0cigpKSkKLSAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCoodGhpcy0+Z3B0cigpKSk7Ci0KLSAgLy8gSWYgdGhlIGZpbGUgaGFzbid0IGJlZW4gb3BlbmVkIGZvciByZWFkaW5nLCBwcm9kdWNlIGVycm9yCi0gIGlmICghdGhpcy0+aXNfb3BlbigpIHx8ICEoaW9fbW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmluKSkKLSAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOwotCi0gIC8vIEF0dGVtcHQgdG8gZmlsbCBpbnRlcm5hbCBidWZmZXIgZnJvbSBnemlwcGVkIGZpbGUKLSAgLy8gKGJ1ZmZlciBtdXN0IGJlIGd1YXJhbnRlZWQgdG8gZXhpc3QuLi4pCi0gIGludCBieXRlc19yZWFkID0gZ3pyZWFkKGZpbGUsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOwotICAvLyBJbmRpY2F0ZXMgZXJyb3Igb3IgRU9GCi0gIGlmIChieXRlc19yZWFkIDw9IDApCi0gIHsKLSAgICAvLyBSZXNldCBnZXQgYXJlYQotICAgIHRoaXMtPnNldGcoYnVmZmVyLCBidWZmZXIsIGJ1ZmZlcik7Ci0gICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKLSAgfQotICAvLyBNYWtlIGFsbCBieXRlcyByZWFkIGZyb20gZmlsZSBhdmFpbGFibGUgYXMgZ2V0IGFyZWEKLSAgdGhpcy0+c2V0ZyhidWZmZXIsIGJ1ZmZlciwgYnVmZmVyICsgYnl0ZXNfcmVhZCk7Ci0KLSAgLy8gUmV0dXJuIG5leHQgY2hhcmFjdGVyIGluIGdldCBhcmVhCi0gIHJldHVybiB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKih0aGlzLT5ncHRyKCkpKTsKLX0KLQotLy8gV3JpdGUgcHV0IGFyZWEgdG8gZ3ppcHBlZCBmaWxlCi1nemZpbGVidWY6OmludF90eXBlCi1nemZpbGVidWY6Om92ZXJmbG93KGludF90eXBlIGMpCi17Ci0gIC8vIERldGVybWluZSB3aGV0aGVyIHB1dCBhcmVhIGlzIGluIHVzZQotICBpZiAodGhpcy0+cGJhc2UoKSkKLSAgewotICAgIC8vIERvdWJsZS1jaGVjayBwb2ludGVyIHJhbmdlCi0gICAgaWYgKHRoaXMtPnBwdHIoKSA+IHRoaXMtPmVwcHRyKCkgfHwgdGhpcy0+cHB0cigpIDwgdGhpcy0+cGJhc2UoKSkKLSAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7Ci0gICAgLy8gQWRkIGV4dHJhIGNoYXJhY3RlciB0byBidWZmZXIgaWYgbm90IEVPRgotICAgIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKGMsIHRyYWl0c190eXBlOjplb2YoKSkpCi0gICAgewotICAgICAgKih0aGlzLT5wcHRyKCkpID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShjKTsKLSAgICAgIHRoaXMtPnBidW1wKDEpOwotICAgIH0KLSAgICAvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZSB0byBmaWxlCi0gICAgaW50IGJ5dGVzX3RvX3dyaXRlID0gdGhpcy0+cHB0cigpIC0gdGhpcy0+cGJhc2UoKTsKLSAgICAvLyBPdmVyZmxvdyBkb2Vzbid0IGZhaWwgaWYgbm90aGluZyBpcyB0byBiZSB3cml0dGVuCi0gICAgaWYgKGJ5dGVzX3RvX3dyaXRlID4gMCkKLSAgICB7Ci0gICAgICAvLyBJZiB0aGUgZmlsZSBoYXNuJ3QgYmVlbiBvcGVuZWQgZm9yIHdyaXRpbmcsIHByb2R1Y2UgZXJyb3IKLSAgICAgIGlmICghdGhpcy0+aXNfb3BlbigpIHx8ICEoaW9fbW9kZSAmIHN0ZDo6aW9zX2Jhc2U6Om91dCkpCi0gICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7Ci0gICAgICAvLyBJZiBnemlwcGVkIGZpbGUgd29uJ3QgYWNjZXB0IGFsbCBieXRlcyB3cml0dGVuIHRvIGl0LCBmYWlsCi0gICAgICBpZiAoZ3p3cml0ZShmaWxlLCB0aGlzLT5wYmFzZSgpLCBieXRlc190b193cml0ZSkgIT0gYnl0ZXNfdG9fd3JpdGUpCi0gICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7Ci0gICAgICAvLyBSZXNldCBuZXh0IHBvaW50ZXIgdG8gcG9pbnQgdG8gcGJhc2Ugb24gc3VjY2VzcwotICAgICAgdGhpcy0+cGJ1bXAoLWJ5dGVzX3RvX3dyaXRlKTsKLSAgICB9Ci0gIH0KLSAgLy8gV3JpdGUgZXh0cmEgY2hhcmFjdGVyIHRvIGZpbGUgaWYgbm90IEVPRgotICBlbHNlIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKGMsIHRyYWl0c190eXBlOjplb2YoKSkpCi0gIHsKLSAgICAvLyBJZiB0aGUgZmlsZSBoYXNuJ3QgYmVlbiBvcGVuZWQgZm9yIHdyaXRpbmcsIHByb2R1Y2UgZXJyb3IKLSAgICBpZiAoIXRoaXMtPmlzX29wZW4oKSB8fCAhKGlvX21vZGUgJiBzdGQ6Omlvc19iYXNlOjpvdXQpKQotICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKLSAgICAvLyBJbXByb21wdHUgY2hhciBidWZmZXIgKGFsbG93cyAidW5idWZmZXJlZCIgb3V0cHV0KQotICAgIGNoYXJfdHlwZSBsYXN0X2NoYXIgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKGMpOwotICAgIC8vIElmIGd6aXBwZWQgZmlsZSB3b24ndCBhY2NlcHQgdGhpcyBjaGFyYWN0ZXIsIGZhaWwKLSAgICBpZiAoZ3p3cml0ZShmaWxlLCAmbGFzdF9jaGFyLCAxKSAhPSAxKQotICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKLSAgfQotCi0gIC8vIElmIHlvdSBnb3QgaGVyZSwgeW91IGhhdmUgc3VjY2VlZGVkIChldmVuIGlmIGMgd2FzIEVPRikKLSAgLy8gVGhlIHJldHVybiB2YWx1ZSBzaG91bGQgdGhlcmVmb3JlIGJlIG5vbi1FT0YKLSAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShjLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQotICAgIHJldHVybiB0cmFpdHNfdHlwZTo6bm90X2VvZihjKTsKLSAgZWxzZQotICAgIHJldHVybiBjOwotfQotCi0vLyBBc3NpZ24gbmV3IGJ1ZmZlcgotc3RkOjpzdHJlYW1idWYqCi1nemZpbGVidWY6OnNldGJ1ZihjaGFyX3R5cGUqIHAsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnN0cmVhbXNpemUgbikKLXsKLSAgLy8gRmlyc3QgbWFrZSBzdXJlIHN0dWZmIGlzIHN5bmMnZWQsIGZvciBzYWZldHkKLSAgaWYgKHRoaXMtPnN5bmMoKSA9PSAtMSkKLSAgICByZXR1cm4gTlVMTDsKLSAgLy8gSWYgYnVmZmVyaW5nIGlzIHR1cm5lZCBvZmYgb24gcHVycG9zZSB2aWEgc2V0YnVmKDAsMCksIHN0aWxsIGFsbG9jYXRlIG9uZS4uLgotICAvLyAiVW5idWZmZXJlZCIgb25seSByZWFsbHkgcmVmZXJzIHRvIHB1dCBbMjcuOC4xLjQuMTBdLCB3aGlsZSBnZXQgbmVlZHMgYXQKLSAgLy8gbGVhc3QgYSBidWZmZXIgb2Ygc2l6ZSAxICh2ZXJ5IGluZWZmaWNpZW50IHRob3VnaCwgdGhlcmVmb3JlIG1ha2UgaXQgYmlnZ2VyPykKLSAgLy8gVGhpcyBmb2xsb3dzIGZyb20gWzI3LjUuMi40LjNdLzEyIChncHRyIG5lZWRzIHRvIHBvaW50IGF0IHNvbWV0aGluZywgaXQgc2VlbXMpCi0gIGlmICghcCB8fCAhbikKLSAgewotICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgYnVmZmVyIChpZiBhbnkpIHdpdGggc21hbGwgaW50ZXJuYWwgYnVmZmVyCi0gICAgdGhpcy0+ZGlzYWJsZV9idWZmZXIoKTsKLSAgICBidWZmZXIgPSBOVUxMOwotICAgIGJ1ZmZlcl9zaXplID0gMDsKLSAgICBvd25fYnVmZmVyID0gdHJ1ZTsKLSAgICB0aGlzLT5lbmFibGVfYnVmZmVyKCk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgLy8gUmVwbGFjZSBleGlzdGluZyBidWZmZXIgKGlmIGFueSkgd2l0aCBleHRlcm5hbCBidWZmZXIKLSAgICB0aGlzLT5kaXNhYmxlX2J1ZmZlcigpOwotICAgIGJ1ZmZlciA9IHA7Ci0gICAgYnVmZmVyX3NpemUgPSBuOwotICAgIG93bl9idWZmZXIgPSBmYWxzZTsKLSAgICB0aGlzLT5lbmFibGVfYnVmZmVyKCk7Ci0gIH0KLSAgcmV0dXJuIHRoaXM7Ci19Ci0KLS8vIFdyaXRlIHB1dCBhcmVhIHRvIGd6aXBwZWQgZmlsZSAoaS5lLiBlbnN1cmVzIHRoYXQgcHV0IGFyZWEgaXMgZW1wdHkpCi1pbnQKLWd6ZmlsZWJ1Zjo6c3luYygpCi17Ci0gIHJldHVybiB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodGhpcy0+b3ZlcmZsb3coKSwgdHJhaXRzX3R5cGU6OmVvZigpKSA/IC0xIDogMDsKLX0KLQotLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwotCi0vLyBBbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXIKLXZvaWQKLWd6ZmlsZWJ1Zjo6ZW5hYmxlX2J1ZmZlcigpCi17Ci0gIC8vIElmIGludGVybmFsIGJ1ZmZlciByZXF1aXJlZCwgYWxsb2NhdGUgb25lCi0gIGlmIChvd25fYnVmZmVyICYmICFidWZmZXIpCi0gIHsKLSAgICAvLyBDaGVjayBmb3IgYnVmZmVyZWQgdnMuICJ1bmJ1ZmZlcmVkIgotICAgIGlmIChidWZmZXJfc2l6ZSA+IDApCi0gICAgewotICAgICAgLy8gQWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyCi0gICAgICBidWZmZXIgPSBuZXcgY2hhcl90eXBlW2J1ZmZlcl9zaXplXTsKLSAgICAgIC8vIEdldCBhcmVhIHN0YXJ0cyBlbXB0eSBhbmQgd2lsbCBiZSBleHBhbmRlZCBieSB1bmRlcmZsb3cgYXMgbmVlZCBhcmlzZXMKLSAgICAgIHRoaXMtPnNldGcoYnVmZmVyLCBidWZmZXIsIGJ1ZmZlcik7Ci0gICAgICAvLyBTZXR1cCBlbnRpcmUgaW50ZXJuYWwgYnVmZmVyIGFzIHB1dCBhcmVhLgotICAgICAgLy8gVGhlIG9uZS1wYXN0LWVuZCBwb2ludGVyIGFjdHVhbGx5IHBvaW50cyB0byB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBidWZmZXIsCi0gICAgICAvLyBzbyB0aGF0IG92ZXJmbG93KGMpIGNhbiBzYWZlbHkgYWRkIHRoZSBleHRyYSBjaGFyYWN0ZXIgYyB0byB0aGUgc2VxdWVuY2UuCi0gICAgICAvLyBUaGVzZSBwb2ludGVycyByZW1haW4gaW4gcGxhY2UgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYnVmZmVyCi0gICAgICB0aGlzLT5zZXRwKGJ1ZmZlciwgYnVmZmVyICsgYnVmZmVyX3NpemUgLSAxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIEV2ZW4gaW4gInVuYnVmZmVyZWQiIGNhc2UsIChzbWFsbD8pIGdldCBidWZmZXIgaXMgc3RpbGwgcmVxdWlyZWQKLSAgICAgIGJ1ZmZlcl9zaXplID0gU01BTExCVUZTSVpFOwotICAgICAgYnVmZmVyID0gbmV3IGNoYXJfdHlwZVtidWZmZXJfc2l6ZV07Ci0gICAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOwotICAgICAgLy8gIlVuYnVmZmVyZWQiIG1lYW5zIG5vIHB1dCBidWZmZXIKLSAgICAgIHRoaXMtPnNldHAoMCwgMCk7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIC8vIElmIGJ1ZmZlciBhbHJlYWR5IGFsbG9jYXRlZCwgcmVzZXQgYnVmZmVyIHBvaW50ZXJzIGp1c3QgdG8gbWFrZSBzdXJlIG5vCi0gICAgLy8gc3RhbGUgY2hhcnMgYXJlIGx5aW5nIGFyb3VuZAotICAgIHRoaXMtPnNldGcoYnVmZmVyLCBidWZmZXIsIGJ1ZmZlcik7Ci0gICAgdGhpcy0+c2V0cChidWZmZXIsIGJ1ZmZlciArIGJ1ZmZlcl9zaXplIC0gMSk7Ci0gIH0KLX0KLQotLy8gRGVzdHJveSBpbnRlcm5hbCBidWZmZXIKLXZvaWQKLWd6ZmlsZWJ1Zjo6ZGlzYWJsZV9idWZmZXIoKQotewotICAvLyBJZiBpbnRlcm5hbCBidWZmZXIgZXhpc3RzLCBkZWFsbG9jYXRlIGl0Ci0gIGlmIChvd25fYnVmZmVyICYmIGJ1ZmZlcikKLSAgewotICAgIC8vIFByZXNlcnZlIHVuYnVmZmVyZWQgc3RhdHVzIGJ5IHplcm9pbmcgc2l6ZQotICAgIGlmICghdGhpcy0+cGJhc2UoKSkKLSAgICAgIGJ1ZmZlcl9zaXplID0gMDsKLSAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgYnVmZmVyID0gTlVMTDsKLSAgICB0aGlzLT5zZXRnKDAsIDAsIDApOwotICAgIHRoaXMtPnNldHAoMCwgMCk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgLy8gUmVzZXQgYnVmZmVyIHBvaW50ZXJzIHRvIGluaXRpYWwgc3RhdGUgaWYgZXh0ZXJuYWwgYnVmZmVyIGV4aXN0cwotICAgIHRoaXMtPnNldGcoYnVmZmVyLCBidWZmZXIsIGJ1ZmZlcik7Ci0gICAgaWYgKGJ1ZmZlcikKLSAgICAgIHRoaXMtPnNldHAoYnVmZmVyLCBidWZmZXIgKyBidWZmZXJfc2l6ZSAtIDEpOwotICAgIGVsc2UKLSAgICAgIHRoaXMtPnNldHAoMCwgMCk7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGluaXRpYWxpemVzIHN0cmVhbSBidWZmZXIKLWd6aWZzdHJlYW06Omd6aWZzdHJlYW0oKQotOiBzdGQ6OmlzdHJlYW0oTlVMTCksIHNiKCkKLXsgdGhpcy0+aW5pdCgmc2IpOyB9Ci0KLS8vIEluaXRpYWxpemUgc3RyZWFtIGJ1ZmZlciBhbmQgb3BlbiBmaWxlCi1nemlmc3RyZWFtOjpnemlmc3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUpCi06IHN0ZDo6aXN0cmVhbShOVUxMKSwgc2IoKQotewotICB0aGlzLT5pbml0KCZzYik7Ci0gIHRoaXMtPm9wZW4obmFtZSwgbW9kZSk7Ci19Ci0KLS8vIEluaXRpYWxpemUgc3RyZWFtIGJ1ZmZlciBhbmQgYXR0YWNoIHRvIGZpbGUKLWd6aWZzdHJlYW06Omd6aWZzdHJlYW0oaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQotOiBzdGQ6OmlzdHJlYW0oTlVMTCksIHNiKCkKLXsKLSAgdGhpcy0+aW5pdCgmc2IpOwotICB0aGlzLT5hdHRhY2goZmQsIG1vZGUpOwotfQotCi0vLyBPcGVuIGZpbGUgYW5kIGdvIGludG8gZmFpbCgpIHN0YXRlIGlmIHVuc3VjY2Vzc2Z1bAotdm9pZAotZ3ppZnN0cmVhbTo6b3Blbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQotewotICBpZiAoIXNiLm9wZW4obmFtZSwgbW9kZSB8IHN0ZDo6aW9zX2Jhc2U6OmluKSkKLSAgICB0aGlzLT5zZXRzdGF0ZShzdGQ6Omlvc19iYXNlOjpmYWlsYml0KTsKLSAgZWxzZQotICAgIHRoaXMtPmNsZWFyKCk7Ci19Ci0KLS8vIEF0dGFjaCB0byBmaWxlIGFuZCBnbyBpbnRvIGZhaWwoKSBzdGF0ZSBpZiB1bnN1Y2Nlc3NmdWwKLXZvaWQKLWd6aWZzdHJlYW06OmF0dGFjaChpbnQgZmQsCi0gICAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKLXsKLSAgaWYgKCFzYi5hdHRhY2goZmQsIG1vZGUgfCBzdGQ6Omlvc19iYXNlOjppbikpCi0gICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIGVsc2UKLSAgICB0aGlzLT5jbGVhcigpOwotfQotCi0vLyBDbG9zZSBmaWxlCi12b2lkCi1nemlmc3RyZWFtOjpjbG9zZSgpCi17Ci0gIGlmICghc2IuY2xvc2UoKSkKLSAgICB0aGlzLT5zZXRzdGF0ZShzdGQ6Omlvc19iYXNlOjpmYWlsYml0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGluaXRpYWxpemVzIHN0cmVhbSBidWZmZXIKLWd6b2ZzdHJlYW06Omd6b2ZzdHJlYW0oKQotOiBzdGQ6Om9zdHJlYW0oTlVMTCksIHNiKCkKLXsgdGhpcy0+aW5pdCgmc2IpOyB9Ci0KLS8vIEluaXRpYWxpemUgc3RyZWFtIGJ1ZmZlciBhbmQgb3BlbiBmaWxlCi1nem9mc3RyZWFtOjpnem9mc3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUpCi06IHN0ZDo6b3N0cmVhbShOVUxMKSwgc2IoKQotewotICB0aGlzLT5pbml0KCZzYik7Ci0gIHRoaXMtPm9wZW4obmFtZSwgbW9kZSk7Ci19Ci0KLS8vIEluaXRpYWxpemUgc3RyZWFtIGJ1ZmZlciBhbmQgYXR0YWNoIHRvIGZpbGUKLWd6b2ZzdHJlYW06Omd6b2ZzdHJlYW0oaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQotOiBzdGQ6Om9zdHJlYW0oTlVMTCksIHNiKCkKLXsKLSAgdGhpcy0+aW5pdCgmc2IpOwotICB0aGlzLT5hdHRhY2goZmQsIG1vZGUpOwotfQotCi0vLyBPcGVuIGZpbGUgYW5kIGdvIGludG8gZmFpbCgpIHN0YXRlIGlmIHVuc3VjY2Vzc2Z1bAotdm9pZAotZ3pvZnN0cmVhbTo6b3Blbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQotewotICBpZiAoIXNiLm9wZW4obmFtZSwgbW9kZSB8IHN0ZDo6aW9zX2Jhc2U6Om91dCkpCi0gICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIGVsc2UKLSAgICB0aGlzLT5jbGVhcigpOwotfQotCi0vLyBBdHRhY2ggdG8gZmlsZSBhbmQgZ28gaW50byBmYWlsKCkgc3RhdGUgaWYgdW5zdWNjZXNzZnVsCi12b2lkCi1nem9mc3RyZWFtOjphdHRhY2goaW50IGZkLAotICAgICAgICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUpCi17Ci0gIGlmICghc2IuYXR0YWNoKGZkLCBtb2RlIHwgc3RkOjppb3NfYmFzZTo6b3V0KSkKLSAgICB0aGlzLT5zZXRzdGF0ZShzdGQ6Omlvc19iYXNlOjpmYWlsYml0KTsKLSAgZWxzZQotICAgIHRoaXMtPmNsZWFyKCk7Ci19Ci0KLS8vIENsb3NlIGZpbGUKLXZvaWQKLWd6b2ZzdHJlYW06OmNsb3NlKCkKLXsKLSAgaWYgKCFzYi5jbG9zZSgpKQotICAgIHRoaXMtPnNldHN0YXRlKHN0ZDo6aW9zX2Jhc2U6OmZhaWxiaXQpOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvaW9zdHJlYW0zL3pmc3RyZWFtLmggYi9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbTMvemZzdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3NDQ3OS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9pb3N0cmVhbTMvemZzdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vKgotICogQSBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGd6KiBmdW5jdGlvbnMKLSAqCi0gKiBieSBMdWR3aWcgU2Nod2FyZHQgPHNjaHdhcmR0QHN1bi5hYy56YT4KLSAqIG9yaWdpbmFsIHZlcnNpb24gYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+Ci0gKgotICogVGhpcyB2ZXJzaW9uIGlzIHN0YW5kYXJkLWNvbXBsaWFudCBhbmQgY29tcGF0aWJsZSB3aXRoIGdjYyAzLnguCi0gKi8KLQotI2lmbmRlZiBaRlNUUkVBTV9ICi0jZGVmaW5lIFpGU1RSRUFNX0gKLQotI2luY2x1ZGUgPGlzdHJlYW0+ICAvLyBub3QgaW9zdHJlYW0sIHNpbmNlIHdlIGRvbid0IG5lZWQgY2luL2NvdXQKLSNpbmNsdWRlIDxvc3RyZWFtPgotI2luY2x1ZGUgInpsaWIuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqICBAYnJpZWYgIEd6aXBwZWQgZmlsZSBzdHJlYW0gYnVmZmVyIGNsYXNzLgotICoKLSAqICBUaGlzIGNsYXNzIGltcGxlbWVudHMgYmFzaWNfZmlsZWJ1ZiBmb3IgZ3ppcHBlZCBmaWxlcy4gSXQgZG9lc24ndCB5ZXQgc3VwcG9ydAotICogIHNlZWtpbmcgKGFsbG93ZWQgYnkgemxpYiBidXQgc2xvdy9saW1pdGVkKSwgcHV0YmFjayBhbmQgcmVhZC93cml0ZSBhY2Nlc3MKLSAqICAodHJpY2t5KS4gT3RoZXJ3aXNlLCBpdCBhdHRlbXB0cyB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHRoZSBzdGFuZGFyZAotICogIGZpbGUgc3RyZWFtYnVmLgotKi8KLWNsYXNzIGd6ZmlsZWJ1ZiA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZgotewotcHVibGljOgotICAvLyAgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgZ3pmaWxlYnVmKCk7Ci0KLSAgLy8gIERlc3RydWN0b3IuCi0gIHZpcnR1YWwKLSAgfmd6ZmlsZWJ1ZigpOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBTZXQgY29tcHJlc3Npb24gbGV2ZWwgYW5kIHN0cmF0ZWd5IG9uIHRoZSBmbHkuCi0gICAqICBAcGFyYW0gIGNvbXBfbGV2ZWwgIENvbXByZXNzaW9uIGxldmVsIChzZWUgemxpYi5oIGZvciBhbGxvd2VkIHZhbHVlcykKLSAgICogIEBwYXJhbSAgY29tcF9zdHJhdGVneSAgQ29tcHJlc3Npb24gc3RyYXRlZ3kgKHNlZSB6bGliLmggZm9yIGFsbG93ZWQgdmFsdWVzKQotICAgKiAgQHJldHVybiAgWl9PSyBvbiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBvdGhlcndpc2UuCi0gICAqCi0gICAqICBVbmZvcnR1bmF0ZWx5LCB0aGVzZSBwYXJhbWV0ZXJzIGNhbm5vdCBiZSBtb2RpZmllZCBzZXBhcmF0ZWx5LCBhcyB0aGUKLSAgICogIHByZXZpb3VzIHpmc3RyZWFtIHZlcnNpb24gYXNzdW1lZC4gU2luY2UgdGhlIHN0cmF0ZWd5IGlzIHNlbGRvbSBjaGFuZ2VkLAotICAgKiAgaXQgY2FuIGRlZmF1bHQgYW5kIHNldGNvbXByZXNzaW9uKGxldmVsKSB0aGVuIGJlY29tZXMgbGlrZSB0aGUgb2xkCi0gICAqICBzZXRjb21wcmVzc2lvbmxldmVsKGxldmVsKS4KLSAgKi8KLSAgaW50Ci0gIHNldGNvbXByZXNzaW9uKGludCBjb21wX2xldmVsLAotICAgICAgICAgICAgICAgICBpbnQgY29tcF9zdHJhdGVneSA9IFpfREVGQVVMVF9TVFJBVEVHWSk7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIENoZWNrIGlmIGZpbGUgaXMgb3Blbi4KLSAgICogIEByZXR1cm4gIFRydWUgaWYgZmlsZSBpcyBvcGVuLgotICAqLwotICBib29sCi0gIGlzX29wZW4oKSBjb25zdCB7IHJldHVybiAoZmlsZSAhPSBOVUxMKTsgfQotCi0gIC8qKgotICAgKiAgQGJyaWVmICBPcGVuIGd6aXBwZWQgZmlsZS4KLSAgICogIEBwYXJhbSAgbmFtZSAgRmlsZSBuYW1lLgotICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MuCi0gICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KLSAgKi8KLSAgZ3pmaWxlYnVmKgotICBvcGVuKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSk7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIEF0dGFjaCB0byBhbHJlYWR5IG9wZW4gZ3ppcHBlZCBmaWxlLgotICAgKiAgQHBhcmFtICBmZCAgRmlsZSBkZXNjcmlwdG9yLgotICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MuCi0gICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KLSAgKi8KLSAgZ3pmaWxlYnVmKgotICBhdHRhY2goaW50IGZkLAotICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSk7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIENsb3NlIGd6aXBwZWQgZmlsZS4KLSAgICogIEByZXR1cm4gIEBjIHRoaXMgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgotICAqLwotICBnemZpbGVidWYqCi0gIGNsb3NlKCk7Ci0KLXByb3RlY3RlZDoKLSAgLyoqCi0gICAqICBAYnJpZWYgIENvbnZlcnQgaW9zIG9wZW4gbW9kZSBpbnQgdG8gbW9kZSBzdHJpbmcgdXNlZCBieSB6bGliLgotICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB2YWxpZCBtb2RlIGZsYWcgY29tYmluYXRpb24uCi0gICovCi0gIGJvb2wKLSAgb3Blbl9tb2RlKHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUsCi0gICAgICAgICAgICBjaGFyKiBjX21vZGUpIGNvbnN0OwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBOdW1iZXIgb2YgY2hhcmFjdGVycyBhdmFpbGFibGUgaW4gc3RyZWFtIGJ1ZmZlci4KLSAgICogIEByZXR1cm4gIE51bWJlciBvZiBjaGFyYWN0ZXJzLgotICAgKgotICAgKiAgVGhpcyBpbmRpY2F0ZXMgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gZ2V0IGFyZWEgb2Ygc3RyZWFtIGJ1ZmZlci4KLSAgICogIFRoZXNlIGNoYXJhY3RlcnMgY2FuIGJlIHJlYWQgd2l0aG91dCBhY2Nlc3NpbmcgdGhlIGd6aXBwZWQgZmlsZS4KLSAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmVhbXNpemUKLSAgc2hvd21hbnljKCk7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIEZpbGwgZ2V0IGFyZWEgZnJvbSBnemlwcGVkIGZpbGUuCi0gICAqICBAcmV0dXJuICBGaXJzdCBjaGFyYWN0ZXIgaW4gZ2V0IGFyZWEgb24gc3VjY2VzcywgRU9GIG9uIGVycm9yLgotICAgKgotICAgKiAgVGhpcyBhY3R1YWxseSByZWFkcyBjaGFyYWN0ZXJzIGZyb20gZ3ppcHBlZCBmaWxlIHRvIHN0cmVhbQotICAgKiAgYnVmZmVyLiBBbHdheXMgYnVmZmVyZWQuCi0gICovCi0gIHZpcnR1YWwgaW50X3R5cGUKLSAgdW5kZXJmbG93KCk7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIFdyaXRlIHB1dCBhcmVhIHRvIGd6aXBwZWQgZmlsZS4KLSAgICogIEBwYXJhbSAgYyAgRXh0cmEgY2hhcmFjdGVyIHRvIGFkZCB0byBidWZmZXIgY29udGVudHMuCi0gICAqICBAcmV0dXJuICBOb24tRU9GIG9uIHN1Y2Nlc3MsIEVPRiBvbiBlcnJvci4KLSAgICoKLSAgICogIFRoaXMgYWN0dWFsbHkgd3JpdGVzIGNoYXJhY3RlcnMgaW4gc3RyZWFtIGJ1ZmZlciB0bwotICAgKiAgZ3ppcHBlZCBmaWxlLiBXaXRoIHVuYnVmZmVyZWQgb3V0cHV0IHRoaXMgaXMgZG9uZSBvbmUKLSAgICogIGNoYXJhY3RlciBhdCBhIHRpbWUuCi0gICovCi0gIHZpcnR1YWwgaW50X3R5cGUKLSAgb3ZlcmZsb3coaW50X3R5cGUgYyA9IHRyYWl0c190eXBlOjplb2YoKSk7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIEluc3RhbGxzIGV4dGVybmFsIHN0cmVhbSBidWZmZXIuCi0gICAqICBAcGFyYW0gIHAgIFBvaW50ZXIgdG8gY2hhciBidWZmZXIuCi0gICAqICBAcGFyYW0gIG4gIFNpemUgb2YgZXh0ZXJuYWwgYnVmZmVyLgotICAgKiAgQHJldHVybiAgQGMgdGhpcyBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqICBDYWxsIHNldGJ1ZigwLDApIHRvIGVuYWJsZSB1bmJ1ZmZlcmVkIG91dHB1dC4KLSAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmVhbWJ1ZioKLSAgc2V0YnVmKGNoYXJfdHlwZSogcCwKLSAgICAgICAgIHN0ZDo6c3RyZWFtc2l6ZSBuKTsKLQotICAvKioKLSAgICogIEBicmllZiAgRmx1c2ggc3RyZWFtIGJ1ZmZlciB0byBmaWxlLgotICAgKiAgQHJldHVybiAgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4KLSAgICoKLSAgICogIFRoaXMgY2FsbHMgdW5kZXJmbG93KEVPRikgdG8gZG8gdGhlIGpvYi4KLSAgKi8KLSAgdmlydHVhbCBpbnQKLSAgc3luYygpOwotCi0vLwotLy8gU29tZSBmdXR1cmUgZW5oYW5jZW1lbnRzCi0vLwotLy8gIHZpcnR1YWwgaW50X3R5cGUgdWZsb3coKTsKLS8vICB2aXJ0dWFsIGludF90eXBlIHBiYWNrZmFpbChpbnRfdHlwZSBjID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKLS8vICB2aXJ0dWFsIHBvc190eXBlCi0vLyAgc2Vla29mZihvZmZfdHlwZSBvZmYsCi0vLyAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpzZWVrZGlyIHdheSwKLS8vICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjppbnxzdGQ6Omlvc19iYXNlOjpvdXQpOwotLy8gIHZpcnR1YWwgcG9zX3R5cGUKLS8vICBzZWVrcG9zKHBvc190eXBlIHNwLAotLy8gICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6OmlufHN0ZDo6aW9zX2Jhc2U6Om91dCk7Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiAgQGJyaWVmICBBbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXIuCi0gICAqCi0gICAqICBUaGlzIGZ1bmN0aW9uIGlzIHNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gSXQgd2lsbCBlbnN1cmUKLSAgICogIHRoYXQgYSBwcm9wZXIgaW50ZXJuYWwgYnVmZmVyIGV4aXN0cyBpZiBpdCBpcyByZXF1aXJlZC4gSWYgdGhlCi0gICAqICBidWZmZXIgYWxyZWFkeSBleGlzdHMgb3IgaXMgZXh0ZXJuYWwsIHRoZSBidWZmZXIgcG9pbnRlcnMgd2lsbCBiZQotICAgKiAgcmVzZXQgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuCi0gICovCi0gIHZvaWQKLSAgZW5hYmxlX2J1ZmZlcigpOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBEZXN0cm95IGludGVybmFsIGJ1ZmZlci4KLSAgICoKLSAgICogIFRoaXMgZnVuY3Rpb24gaXMgc2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLiBJdCB3aWxsIGVuc3VyZQotICAgKiAgdGhhdCB0aGUgaW50ZXJuYWwgYnVmZmVyIGlzIGRlYWxsb2NhdGVkIGlmIGl0IGV4aXN0cy4gSW4gYW55Ci0gICAqICBjYXNlLCBpdCB3aWxsIGFsc28gcmVzZXQgdGhlIGJ1ZmZlciBwb2ludGVycy4KLSAgKi8KLSAgdm9pZAotICBkaXNhYmxlX2J1ZmZlcigpOwotCi0gIC8qKgotICAgKiAgVW5kZXJseWluZyBmaWxlIHBvaW50ZXIuCi0gICovCi0gIGd6RmlsZSBmaWxlOwotCi0gIC8qKgotICAgKiAgTW9kZSBpbiB3aGljaCBmaWxlIHdhcyBvcGVuZWQuCi0gICovCi0gIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIGlvX21vZGU7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIFRydWUgaWYgdGhpcyBvYmplY3Qgb3ducyBmaWxlIGRlc2NyaXB0b3IuCi0gICAqCi0gICAqICBUaGlzIG1ha2VzIHRoZSBjbGFzcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgZmlsZQotICAgKiAgdXBvbiBkZXN0cnVjdGlvbi4KLSAgKi8KLSAgYm9vbCBvd25fZmQ7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIFN0cmVhbSBidWZmZXIuCi0gICAqCi0gICAqICBGb3Igc2ltcGxpY2l0eSB0aGlzIHJlbWFpbnMgYWxsb2NhdGVkIG9uIHRoZSBmcmVlIHN0b3JlIGZvciB0aGUKLSAgICogIGVudGlyZSBsaWZlIHNwYW4gb2YgdGhlIGd6ZmlsZWJ1ZiBvYmplY3QsIHVubGVzcyByZXBsYWNlZCBieSBzZXRidWYuCi0gICovCi0gIGNoYXJfdHlwZSogYnVmZmVyOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBTdHJlYW0gYnVmZmVyIHNpemUuCi0gICAqCi0gICAqICBEZWZhdWx0cyB0byBzeXN0ZW0gZGVmYXVsdCBidWZmZXIgc2l6ZSAodHlwaWNhbGx5IDgxOTIgYnl0ZXMpLgotICAgKiAgTW9kaWZpZWQgYnkgc2V0YnVmLgotICAqLwotICBzdGQ6OnN0cmVhbXNpemUgYnVmZmVyX3NpemU7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIFRydWUgaWYgdGhpcyBvYmplY3Qgb3ducyBzdHJlYW0gYnVmZmVyLgotICAgKgotICAgKiAgVGhpcyBtYWtlcyB0aGUgY2xhc3MgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBidWZmZXIKLSAgICogIHVwb24gZGVzdHJ1Y3Rpb24uCi0gICovCi0gIGJvb2wgb3duX2J1ZmZlcjsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiAgQGJyaWVmICBHemlwcGVkIGZpbGUgaW5wdXQgc3RyZWFtIGNsYXNzLgotICoKLSAqICBUaGlzIGNsYXNzIGltcGxlbWVudHMgaWZzdHJlYW0gZm9yIGd6aXBwZWQgZmlsZXMuIFNlZWtpbmcgYW5kIHB1dGJhY2sKLSAqICBpcyBub3Qgc3VwcG9ydGVkIHlldC4KLSovCi1jbGFzcyBnemlmc3RyZWFtIDogcHVibGljIHN0ZDo6aXN0cmVhbQotewotcHVibGljOgotICAvLyAgRGVmYXVsdCBjb25zdHJ1Y3RvcgotICBnemlmc3RyZWFtKCk7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJlYW0gb24gZ3ppcHBlZCBmaWxlIHRvIGJlIG9wZW5lZC4KLSAgICogIEBwYXJhbSAgbmFtZSAgRmlsZSBuYW1lLgotICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6aW4pLgotICAqLwotICBleHBsaWNpdAotICBnemlmc3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6OmluKTsKLQotICAvKioKLSAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmVhbSBvbiBhbHJlYWR5IG9wZW4gZ3ppcHBlZCBmaWxlLgotICAgKiAgQHBhcmFtICBmZCAgICBGaWxlIGRlc2NyaXB0b3IuCi0gICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gbW9kZSBmbGFncyAoZm9yY2VkIHRvIGNvbnRhaW4gaW9zOjppbikuCi0gICovCi0gIGV4cGxpY2l0Ci0gIGd6aWZzdHJlYW0oaW50IGZkLAotICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjppbik7Ci0KLSAgLyoqCi0gICAqICBPYnRhaW4gdW5kZXJseWluZyBzdHJlYW0gYnVmZmVyLgotICAqLwotICBnemZpbGVidWYqCi0gIHJkYnVmKCkgY29uc3QKLSAgeyByZXR1cm4gY29uc3RfY2FzdDxnemZpbGVidWYqPigmc2IpOyB9Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIENoZWNrIGlmIGZpbGUgaXMgb3Blbi4KLSAgICogIEByZXR1cm4gIFRydWUgaWYgZmlsZSBpcyBvcGVuLgotICAqLwotICBib29sCi0gIGlzX29wZW4oKSB7IHJldHVybiBzYi5pc19vcGVuKCk7IH0KLQotICAvKioKLSAgICogIEBicmllZiAgT3BlbiBnemlwcGVkIGZpbGUuCi0gICAqICBAcGFyYW0gIG5hbWUgIEZpbGUgbmFtZS4KLSAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBtb2RlIGZsYWdzIChmb3JjZWQgdG8gY29udGFpbiBpb3M6OmluKS4KLSAgICoKLSAgICogIFN0cmVhbSB3aWxsIGJlIGluIHN0YXRlIGdvb2QoKSBpZiBmaWxlIG9wZW5zIHN1Y2Nlc3NmdWxseTsKLSAgICogIG90aGVyd2lzZSBpbiBzdGF0ZSBmYWlsKCkuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBiZWhhdmlvciBvZgotICAgKiAgaWZzdHJlYW0sIHdoaWNoIG5ldmVyIHNldHMgdGhlIHN0YXRlIHRvIGdvb2QoKSBhbmQgdGhlcmVmb3JlCi0gICAqICB3b24ndCBhbGxvdyB5b3UgdG8gcmV1c2UgdGhlIHN0cmVhbSBmb3IgYSBzZWNvbmQgZmlsZSB1bmxlc3MKLSAgICogIHlvdSBtYW51YWxseSBjbGVhcigpIHRoZSBzdGF0ZS4gVGhlIGNob2ljZSBpcyBhIG1hdHRlciBvZgotICAgKiAgY29udmVuaWVuY2UuCi0gICovCi0gIHZvaWQKLSAgb3Blbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjppbik7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIEF0dGFjaCB0byBhbHJlYWR5IG9wZW4gZ3ppcHBlZCBmaWxlLgotICAgKiAgQHBhcmFtICBmZCAgRmlsZSBkZXNjcmlwdG9yLgotICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6aW4pLgotICAgKgotICAgKiAgU3RyZWFtIHdpbGwgYmUgaW4gc3RhdGUgZ29vZCgpIGlmIGF0dGFjaCBzdWNjZWVkZWQ7IG90aGVyd2lzZQotICAgKiAgaW4gc3RhdGUgZmFpbCgpLgotICAqLwotICB2b2lkCi0gIGF0dGFjaChpbnQgZmQsCi0gICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6aW4pOwotCi0gIC8qKgotICAgKiAgQGJyaWVmICBDbG9zZSBnemlwcGVkIGZpbGUuCi0gICAqCi0gICAqICBTdHJlYW0gd2lsbCBiZSBpbiBzdGF0ZSBmYWlsKCkgaWYgY2xvc2UgZmFpbGVkLgotICAqLwotICB2b2lkCi0gIGNsb3NlKCk7Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiAgVW5kZXJseWluZyBzdHJlYW0gYnVmZmVyLgotICAqLwotICBnemZpbGVidWYgc2I7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogIEBicmllZiAgR3ppcHBlZCBmaWxlIG91dHB1dCBzdHJlYW0gY2xhc3MuCi0gKgotICogIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBvZnN0cmVhbSBmb3IgZ3ppcHBlZCBmaWxlcy4gU2Vla2luZyBhbmQgcHV0YmFjawotICogIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgotKi8KLWNsYXNzIGd6b2ZzdHJlYW0gOiBwdWJsaWMgc3RkOjpvc3RyZWFtCi17Ci1wdWJsaWM6Ci0gIC8vICBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gIGd6b2ZzdHJlYW0oKTsKLQotICAvKioKLSAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmVhbSBvbiBnemlwcGVkIGZpbGUgdG8gYmUgb3BlbmVkLgotICAgKiAgQHBhcmFtICBuYW1lICBGaWxlIG5hbWUuCi0gICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gbW9kZSBmbGFncyAoZm9yY2VkIHRvIGNvbnRhaW4gaW9zOjpvdXQpLgotICAqLwotICBleHBsaWNpdAotICBnem9mc3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6Om91dCk7Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJlYW0gb24gYWxyZWFkeSBvcGVuIGd6aXBwZWQgZmlsZS4KLSAgICogIEBwYXJhbSAgZmQgICAgRmlsZSBkZXNjcmlwdG9yLgotICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6b3V0KS4KLSAgKi8KLSAgZXhwbGljaXQKLSAgZ3pvZnN0cmVhbShpbnQgZmQsCi0gICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6Om91dCk7Ci0KLSAgLyoqCi0gICAqICBPYnRhaW4gdW5kZXJseWluZyBzdHJlYW0gYnVmZmVyLgotICAqLwotICBnemZpbGVidWYqCi0gIHJkYnVmKCkgY29uc3QKLSAgeyByZXR1cm4gY29uc3RfY2FzdDxnemZpbGVidWYqPigmc2IpOyB9Ci0KLSAgLyoqCi0gICAqICBAYnJpZWYgIENoZWNrIGlmIGZpbGUgaXMgb3Blbi4KLSAgICogIEByZXR1cm4gIFRydWUgaWYgZmlsZSBpcyBvcGVuLgotICAqLwotICBib29sCi0gIGlzX29wZW4oKSB7IHJldHVybiBzYi5pc19vcGVuKCk7IH0KLQotICAvKioKLSAgICogIEBicmllZiAgT3BlbiBnemlwcGVkIGZpbGUuCi0gICAqICBAcGFyYW0gIG5hbWUgIEZpbGUgbmFtZS4KLSAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBtb2RlIGZsYWdzIChmb3JjZWQgdG8gY29udGFpbiBpb3M6Om91dCkuCi0gICAqCi0gICAqICBTdHJlYW0gd2lsbCBiZSBpbiBzdGF0ZSBnb29kKCkgaWYgZmlsZSBvcGVucyBzdWNjZXNzZnVsbHk7Ci0gICAqICBvdGhlcndpc2UgaW4gc3RhdGUgZmFpbCgpLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgYmVoYXZpb3Igb2YKLSAgICogIG9mc3RyZWFtLCB3aGljaCBuZXZlciBzZXRzIHRoZSBzdGF0ZSB0byBnb29kKCkgYW5kIHRoZXJlZm9yZQotICAgKiAgd29uJ3QgYWxsb3cgeW91IHRvIHJldXNlIHRoZSBzdHJlYW0gZm9yIGEgc2Vjb25kIGZpbGUgdW5sZXNzCi0gICAqICB5b3UgbWFudWFsbHkgY2xlYXIoKSB0aGUgc3RhdGUuIFRoZSBjaG9pY2UgaXMgYSBtYXR0ZXIgb2YKLSAgICogIGNvbnZlbmllbmNlLgotICAqLwotICB2b2lkCi0gIG9wZW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6b3V0KTsKLQotICAvKioKLSAgICogIEBicmllZiAgQXR0YWNoIHRvIGFscmVhZHkgb3BlbiBnemlwcGVkIGZpbGUuCi0gICAqICBAcGFyYW0gIGZkICBGaWxlIGRlc2NyaXB0b3IuCi0gICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gbW9kZSBmbGFncyAoZm9yY2VkIHRvIGNvbnRhaW4gaW9zOjpvdXQpLgotICAgKgotICAgKiAgU3RyZWFtIHdpbGwgYmUgaW4gc3RhdGUgZ29vZCgpIGlmIGF0dGFjaCBzdWNjZWVkZWQ7IG90aGVyd2lzZQotICAgKiAgaW4gc3RhdGUgZmFpbCgpLgotICAqLwotICB2b2lkCi0gIGF0dGFjaChpbnQgZmQsCi0gICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6b3V0KTsKLQotICAvKioKLSAgICogIEBicmllZiAgQ2xvc2UgZ3ppcHBlZCBmaWxlLgotICAgKgotICAgKiAgU3RyZWFtIHdpbGwgYmUgaW4gc3RhdGUgZmFpbCgpIGlmIGNsb3NlIGZhaWxlZC4KLSAgKi8KLSAgdm9pZAotICBjbG9zZSgpOwotCi1wcml2YXRlOgotICAvKioKLSAgICogIFVuZGVybHlpbmcgc3RyZWFtIGJ1ZmZlci4KLSAgKi8KLSAgZ3pmaWxlYnVmIHNiOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqICBAYnJpZWYgIEd6aXBwZWQgZmlsZSBvdXRwdXQgc3RyZWFtIG1hbmlwdWxhdG9yIGNsYXNzLgotICoKLSAqICBUaGlzIGNsYXNzIGRlZmluZXMgYSB0d28tYXJndW1lbnQgbWFuaXB1bGF0b3IgZm9yIGd6b2ZzdHJlYW0uIEl0IGlzIHVzZWQKLSAqICBhcyBiYXNlIGZvciB0aGUgc2V0Y29tcHJlc3Npb24oaW50LGludCkgbWFuaXB1bGF0b3IuCi0qLwotdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICBjbGFzcyBnem9tYW5pcDIKLSAgewotICBwdWJsaWM6Ci0gICAgLy8gQWxsb3dzIGluc2VydG9yIHRvIHBlZWsgYXQgaW50ZXJuYWxzCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRhLCB0eXBlbmFtZSBUYj4KLSAgICAgIGZyaWVuZCBnem9mc3RyZWFtJgotICAgICAgb3BlcmF0b3I8PChnem9mc3RyZWFtJiwKLSAgICAgICAgICAgICAgICAgY29uc3QgZ3pvbWFuaXAyPFRhLFRiPiYpOwotCi0gICAgLy8gQ29uc3RydWN0b3IKLSAgICBnem9tYW5pcDIoZ3pvZnN0cmVhbSYgKCpmKShnem9mc3RyZWFtJiwgVDEsIFQyKSwKLSAgICAgICAgICAgICAgVDEgdjEsCi0gICAgICAgICAgICAgIFQyIHYyKTsKLSAgcHJpdmF0ZToKLSAgICAvLyBVbmRlcmx5aW5nIG1hbmlwdWxhdG9yIGZ1bmN0aW9uCi0gICAgZ3pvZnN0cmVhbSYKLSAgICAoKmZ1bmMpKGd6b2ZzdHJlYW0mLCBUMSwgVDIpOwotCi0gICAgLy8gQXJndW1lbnRzIGZvciBtYW5pcHVsYXRvciBmdW5jdGlvbgotICAgIFQxIHZhbDE7Ci0gICAgVDIgdmFsMjsKLSAgfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBNYW5pcHVsYXRvciBmdW5jdGlvbiB0aHVua3MgdGhyb3VnaCB0byBzdHJlYW0gYnVmZmVyCi1pbmxpbmUgZ3pvZnN0cmVhbSYKLXNldGNvbXByZXNzaW9uKGd6b2ZzdHJlYW0gJmd6cywgaW50IGwsIGludCBzID0gWl9ERUZBVUxUX1NUUkFURUdZKQotewotICAoZ3pzLnJkYnVmKCkpLT5zZXRjb21wcmVzc2lvbihsLCBzKTsKLSAgcmV0dXJuIGd6czsKLX0KLQotLy8gTWFuaXB1bGF0b3IgY29uc3RydWN0b3Igc3RvcmVzIGFyZ3VtZW50cwotdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICBpbmxpbmUKLSAgZ3pvbWFuaXAyPFQxLFQyPjo6Z3pvbWFuaXAyKGd6b2ZzdHJlYW0gJigqZikoZ3pvZnN0cmVhbSAmLCBUMSwgVDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMiB2MikKLSAgOiBmdW5jKGYpLCB2YWwxKHYxKSwgdmFsMih2MikKLSAgeyB9Ci0KLS8vIEluc2VydG9yIGFwcGxpZXMgdW5kZXJseWluZyBtYW5pcHVsYXRvciBmdW5jdGlvbiB0byBzdHJlYW0KLXRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLSAgaW5saW5lIGd6b2ZzdHJlYW0mCi0gIG9wZXJhdG9yPDwoZ3pvZnN0cmVhbSYgcywgY29uc3QgZ3pvbWFuaXAyPFQxLFQyPiYgbSkKLSAgeyByZXR1cm4gKCptLmZ1bmMpKHMsIG0udmFsMSwgbS52YWwyKTsgfQotCi0vLyBJbnNlcnQgdGhpcyBvbnRvIHN0cmVhbSB0byBzaW1wbGlmeSBzZXR0aW5nIG9mIGNvbXByZXNzaW9uIGxldmVsCi1pbmxpbmUgZ3pvbWFuaXAyPGludCxpbnQ+Ci1zZXRjb21wcmVzc2lvbihpbnQgbCwgaW50IHMgPSBaX0RFRkFVTFRfU1RSQVRFR1kpCi17IHJldHVybiBnem9tYW5pcDI8aW50LGludD4oJnNldGNvbXByZXNzaW9uLCBsLCBzKTsgfQotCi0jZW5kaWYgLy8gWkZTVFJFQU1fSApkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvbWFzbTY4Ni9tYXRjaC5hc20gYi9saWJzL3psaWIvY29udHJpYi9tYXNtNjg2L21hdGNoLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiMTg2OS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9tYXNtNjg2L21hdGNoLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0KLTsgbWF0Y2guYXNtIC0tIFBlbnRpdW0tUHJvIG9wdGltaXplZCB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2goKQotOwotOyBVcGRhdGVkIGZvciB6bGliIDEuMS4zIGFuZCBjb252ZXJ0ZWQgdG8gTUFTTSA2LjF4Ci07IENvcHlyaWdodCAoQykgMjAwMCBEYW4gSGlnZG9uIDxoZGFuQGtpbmVzb2Z0LmNvbT4KLTsgICAgICAgICAgICAgICAgICAgIGFuZCBDaHVjayBXYWxib3VybiA8Y2h1Y2t3QGtpbmVzb2Z0LmNvbT4KLTsgQ29ycmVjdGlvbnMgYnkgQ29zbWluIFRydXRhIDxjb3NtaW50QGNzLnViYmNsdWoucm8+Ci07Ci07IFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotOyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi07IEJhc2VkIG9uIG1hdGNoLlMKLTsgV3JpdHRlbiBmb3IgemxpYiAxLjEuMgotOyBDb3B5cmlnaHQgKEMpIDE5OTggQnJpYW4gUmFpdGVyIDxicmVhZGJveEBtdXBwZXRsYWJzLmNvbT4KLTsKLTsgTW9kaWZpZWQgYnkgR2lsbGVzIFZvbGxhbnQgKDIwMDUpIGZvciBhZGQgZ3poZWFkIGFuZCBnemluZGV4Ci0KLQkuNjg2UAotCS5NT0RFTAlGTEFUCi0KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsgRVFVQVRFUwotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1NQVhfTUFUQ0gJRVFVIDI1OAotTUlOX01BVENICUVRVSAzCi1NSU5fTE9PS0FIRUFECUVRVSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkKLU1BWF9NQVRDSF84CUVRVSAoKE1BWF9NQVRDSCArIDcpIEFORCAoTk9UIDcpKQotCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07IFNUUlVDVFVSRVMKLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotOyBUaGlzIFNUUlVDVCBhc3N1bWVzIGEgNC1ieXRlIGFsaWdubWVudAotCi1ERUZMQVRFX1NUQVRFCVNUUlVDVAotZHNfc3RybQkJCWRkID8KLWRzX3N0YXR1cwkJZGQgPwotZHNfcGVuZGluZ19idWYJCWRkID8KLWRzX3BlbmRpbmdfYnVmX3NpemUJZGQgPwotZHNfcGVuZGluZ19vdXQJCWRkID8KLWRzX3BlbmRpbmcJCWRkID8KLWRzX3dyYXAJCQlkZCA/Ci07IGd6aGVhZCBhbmQgZ3ppbmRleCBhcmUgYWRkZWQgaW4gemxpYiAxLjIuMi4yIChzZWUgZGVmbGF0ZS5oKQotZHNfZ3poZWFkICAgICAgICAgICAgICAgZGQgPwotZHNfZ3ppbmRleCAgICAgICAgICAgICAgZGQgPwotZHNfZGF0YV90eXBlCQlkYiA/Ci1kc19tZXRob2QJCWRiID8KLQkJCWRiID8JOyBwYWRkaW5nCi0JCQlkYiA/CTsgcGFkZGluZwotZHNfbGFzdF9mbHVzaAkJZGQgPwotZHNfd19zaXplCQlkZCA/CTsgdXNlZAotZHNfd19iaXRzCQlkZCA/Ci1kc193X21hc2sJCWRkID8JOyB1c2VkCi1kc193aW5kb3cJCWRkID8JOyB1c2VkCi1kc193aW5kb3dfc2l6ZQkJZGQgPwotZHNfcHJldgkJCWRkID8JOyB1c2VkCi1kc19oZWFkCQkJZGQgPwotZHNfaW5zX2gJCWRkID8KLWRzX2hhc2hfc2l6ZQkJZGQgPwotZHNfaGFzaF9iaXRzCQlkZCA/Ci1kc19oYXNoX21hc2sJCWRkID8KLWRzX2hhc2hfc2hpZnQJCWRkID8KLWRzX2Jsb2NrX3N0YXJ0CQlkZCA/Ci1kc19tYXRjaF9sZW5ndGgJCWRkID8JOyB1c2VkCi1kc19wcmV2X21hdGNoCQlkZCA/CTsgdXNlZAotZHNfbWF0Y2hfYXZhaWxhYmxlCWRkID8KLWRzX3N0cnN0YXJ0CQlkZCA/CTsgdXNlZAotZHNfbWF0Y2hfc3RhcnQJCWRkID8JOyB1c2VkCi1kc19sb29rYWhlYWQJCWRkID8JOyB1c2VkCi1kc19wcmV2X2xlbmd0aAkJZGQgPwk7IHVzZWQKLWRzX21heF9jaGFpbl9sZW5ndGgJZGQgPwk7IHVzZWQKLWRzX21heF9sYXh5X21hdGNoCWRkID8KLWRzX2xldmVsCQlkZCA/Ci1kc19zdHJhdGVneQkJZGQgPwotZHNfZ29vZF9tYXRjaAkJZGQgPwk7IHVzZWQKLWRzX25pY2VfbWF0Y2gJCWRkID8JOyB1c2VkCi0KLTsgRG9uJ3QgbmVlZCBhbnltb3JlIG9mIHRoZSBzdHJ1Y3QgZm9yIG1hdGNoCi1ERUZMQVRFX1NUQVRFCUVORFMKLQotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyBDT0RFCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1fVEVYVAlTRUdNRU5UCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgbWF0Y2hfaW5pdAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUFMSUdOCTQKLVBVQkxJQwlfbWF0Y2hfaW5pdAotX21hdGNoX2luaXQJUFJPQwotCTsgbm8gaW5pdGlhbGl6YXRpb24gbmVlZGVkCi0JcmV0Ci1fbWF0Y2hfaW5pdAlFTkRQCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdUludCBsb25nZXN0X21hdGNoKGRlZmxhdGVfc3RhdGUgKmRlZmxhdGVzdGF0ZSwgSVBvcyBjdXJtYXRjaCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlBTElHTgk0Ci0KLVBVQkxJQwlfbG9uZ2VzdF9tYXRjaAotX2xvbmdlc3RfbWF0Y2gJUFJPQwotCi07IFNpbmNlIHRoaXMgY29kZSB1c2VzIEVCUCBmb3IgYSBzY3JhdGNoIHJlZ2lzdGVyLCB0aGUgc3RhY2sgZnJhbWUgbXVzdAotOyBiZSBtYW51YWxseSBjb25zdHJ1Y3RlZCBhbmQgcmVmZXJlbmNlZCByZWxhdGl2ZSB0byB0aGUgRVNQIHJlZ2lzdGVyLgotCi07IFN0YWNrIGltYWdlCi07IFZhcmlhYmxlcwotY2hhaW5sZW53bWFzawk9ICAwCTsgaGlnaCB3b3JkOiBjdXJyZW50IGNoYWluIGxlbgotCQkJOyBsb3cgd29yZDogcy0+d21hc2sKLXdpbmRvdwkJPSAgNAk7IGxvY2FsIGNvcHkgb2Ygcy0+d2luZG93Ci13aW5kb3diZXN0bGVuCT0gIDgJOyBzLT53aW5kb3cgKyBiZXN0bGVuCi1zY2FuZW5kCQk9IDEyCTsgbGFzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nCi1zY2Fuc3RhcnQJPSAxNgk7IGZpcnN0IHR3byBieXRlcyBvZiBzdHJpbmcKLXNjYW5hbGlnbgk9IDIwCTsgZHdvcmQtbWlzYWxpZ25tZW50IG9mIHN0cmluZwotbmljZW1hdGNoCT0gMjQJOyBhIGdvb2QgZW5vdWdoIG1hdGNoIHNpemUKLWJlc3RsZW4JCT0gMjgJOyBzaXplIG9mIGJlc3QgbWF0Y2ggc28gZmFyCi1zY2FuCQk9IDMyCTsgcHRyIHRvIHN0cmluZyB3YW50aW5nIG1hdGNoCi12YXJzaXplCQk9IDM2CTsgbnVtYmVyIG9mIGJ5dGVzIChhbHNvIG9mZnNldCB0byBsYXN0IHNhdmVkIHJlZ2lzdGVyKQotCi07IFNhdmVkIFJlZ2lzdGVycyAoYWN0dWFsbHkgcHVzaGVkIGludG8gcGxhY2UpCi1lYnhfc2F2ZQk9IDM2Ci1lZGlfc2F2ZQk9IDQwCi1lc2lfc2F2ZQk9IDQ0Ci1lYnBfc2F2ZQk9IDQ4Ci0KLTsgUGFyYW1ldGVycwotcmV0YWRkcgkJPSA1MgotZGVmbGF0ZXN0YXRlCT0gNTYKLWN1cm1hdGNoCT0gNjAKLQotOyBTYXZlIHJlZ2lzdGVycyB0aGF0IHRoZSBjb21waWxlciBtYXkgYmUgdXNpbmcKLQlwdXNoCWVicAotCXB1c2gJZWRpCi0JcHVzaAllc2kKLQlwdXNoCWVieAotCi07IEFsbG9jYXRlIGxvY2FsIHZhcmlhYmxlIHNwYWNlCi0Jc3ViCWVzcCx2YXJzaXplCi0KLTsgUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gZWN4IHdpbGwgaG9sZCBjdXJfbWF0Y2gKLTsgdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiBlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQotOyBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBkdXJpbmcgdGhlIGZ1bmN0aW9uJ3Mgc2V0dXAgKGJlZm9yZQotOyBlbnRlcmluZyB0aGUgbWFpbiBsb29wKS4KLQotCW1vdgllZHgsIFtlc3ArZGVmbGF0ZXN0YXRlXQotQVNTVU1FCWVkeDpQVFIgREVGTEFURV9TVEFURQotCi0JbW92CWVjeCwgW2VzcCtjdXJtYXRjaF0KLQotOyB1SW50IHdtYXNrID0gcy0+d19tYXNrOwotOyB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOwotOyBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgewotOyAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOwotOyB9Ci0KLQltb3YJZWF4LCBbZWR4XS5kc19wcmV2X2xlbmd0aAotCW1vdgllYngsIFtlZHhdLmRzX2dvb2RfbWF0Y2gKLQljbXAJZWF4LCBlYngKLQltb3YJZWF4LCBbZWR4XS5kc193X21hc2sKLQltb3YJZWJ4LCBbZWR4XS5kc19tYXhfY2hhaW5fbGVuZ3RoCi0JamwJU0hPUlQgTGFzdE1hdGNoR29vZAotCXNocgllYngsIDIKLUxhc3RNYXRjaEdvb2Q6Ci0KLTsgY2hhaW5sZW4gaXMgZGVjcmVtZW50ZWQgb25jZSBiZWZvcmVoYW5kIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbgotOyB1c2UgdGhlIHNpZ24gZmxhZyBpbnN0ZWFkIG9mIHRoZSB6ZXJvIGZsYWcgZm9yIHRoZSBleGl0IHRlc3QuCi07IEl0IGlzIHRoZW4gc2hpZnRlZCBpbnRvIHRoZSBoaWdoIHdvcmQsIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHdtYXNrCi07IHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuCi0KLQlkZWMJZWJ4Ci0Jc2hsCWVieCwgMTYKLQlvcgllYngsIGVheAotCW1vdglbZXNwK2NoYWlubGVud21hc2tdLCBlYngKLQotOyBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsKLQotCW1vdgllYXgsIFtlZHhdLmRzX25pY2VfbWF0Y2gKLQltb3YJZWJ4LCBbZWR4XS5kc19sb29rYWhlYWQKLQljbXAJZWJ4LCBlYXgKLQlqbAlTSE9SVCBMb29rYWhlYWRMZXNzCi0JbW92CWVieCwgZWF4Ci1Mb29rYWhlYWRMZXNzOgotCW1vdglbZXNwK25pY2VtYXRjaF0sIGVieAotCi07LyogcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsgICAgICAgICAgICAgICAgICAgICAqLwotCi0JbW92CWVzaSwgW2VkeF0uZHNfd2luZG93Ci0JbW92CVtlc3Ard2luZG93XSwgZXNpCi0JbW92CWVicCwgW2VkeF0uZHNfc3Ryc3RhcnQKLQlsZWEJZWRpLCBbZXNpK2VicF0KLQltb3YJW2VzcCtzY2FuXSxlZGkKLQotOy8qIERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcgICAgICAgICAgICAgKi8KLTsvKiBkd29yZC1hbGlnbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQltb3YJZWF4LCBlZGkKLQluZWcJZWF4Ci0JYW5kCWVheCwgMwotCW1vdglbZXNwK3NjYW5hbGlnbl0sIGVheAotCi07LyogSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPyAgICAgICAgICAgICAgICAgICAgICAqLwotOy8qICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCW1vdgllYXgsIFtlZHhdLmRzX3dfc2l6ZQotCXN1YgllYXgsIE1JTl9MT09LQUhFQUQKLQlzdWIJZWJwLCBlYXgKLQlqZwlTSE9SVCBMaW1pdFBvc2l0aXZlCi0JeG9yCWVicCwgZWJwCi1MaW1pdFBvc2l0aXZlOgotCi07LyogaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0JbW92CWVheCwgW2VkeF0uZHNfcHJldl9sZW5ndGgKLQltb3YJW2VzcCtiZXN0bGVuXSwgZWF4Ci0KLTsvKiBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluICVlc2kgbG9jYWxseSwgYW5kIGluICVlc2kuICovCi0KLQlhZGQJZXNpLCBlYXgKLQltb3YJW2VzcCt3aW5kb3diZXN0bGVuXSwgZXNpCi0KLTsvKiByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi07LyogcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOyAgICAgICAgICAgICAgICAqLwotOy8qIFBvc2YgKnByZXYgPSBzLT5wcmV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCW1vdnp4CWVieCwgV09SRCBQVFJbZWRpXQotCW1vdglbZXNwK3NjYW5zdGFydF0sIGVieAotCW1vdnp4CWVieCwgV09SRCBQVFJbZWF4K2VkaS0xXQotCW1vdglbZXNwK3NjYW5lbmRdLCBlYngKLQltb3YJZWRpLCBbZWR4XS5kc19wcmV2Ci0KLTsvKiBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQltb3YJZWR4LCBbZXNwK2NoYWlubGVud21hc2tdCi0Jam1wCVNIT1JUIExvb3BFbnRyeQotCi07LyogZG8gewotOyAqICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKLTsgKiAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8Ci07ICogICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOwotOyAqICAgICBbLi4uXQotOyAqIH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdAotOyAqICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOwotOyAqCi07ICogSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQotOyAqIG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsCi07ICogYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuCi07ICoKLTsgKiBXaXRoaW4gdGhpcyBsb29wOgotOyAqICVlYnggPSBzY2FuZW5kCi07ICogJWVjeCA9IGN1cm1hdGNoCi07ICogJWVkeCA9IGNoYWlubGVud21hc2sgLSBpLmUuLCAoKGNoYWlubGVuIDw8IDE2KSB8IHdtYXNrKQotOyAqICVlc2kgPSB3aW5kb3diZXN0bGVuIC0gaS5lLiwgKHdpbmRvdyArIGJlc3RsZW4pCi07ICogJWVkaSA9IHByZXYKLTsgKiAlZWJwID0gbGltaXQKLTsgKi8KLQotCUFMSUdOCTQKLUxvb2t1cExvb3A6Ci0JYW5kCWVjeCwgZWR4Ci0JbW92engJZWN4LCBXT1JEIFBUUltlZGkrZWN4KjJdCi0JY21wCWVjeCwgZWJwCi0JamJlCUxlYXZlTm93Ci0Jc3ViCWVkeCwgMDAwMDEwMDAwSAotCWpzCUxlYXZlTm93Ci0KLUxvb3BFbnRyeToKLQltb3Z6eAllYXgsIFdPUkQgUFRSW2VzaStlY3gtMV0KLQljbXAJZWF4LCBlYngKLQlqbnoJU0hPUlQgTG9va3VwTG9vcAotCi0JbW92CWVheCwgW2VzcCt3aW5kb3ddCi0JbW92engJZWF4LCBXT1JEIFBUUltlYXgrZWN4XQotCWNtcAllYXgsIFtlc3Arc2NhbnN0YXJ0XQotCWpueglTSE9SVCBMb29rdXBMb29wCi0KLTsvKiBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQltb3YJW2VzcCtjaGFpbmxlbndtYXNrXSwgZWR4Ci0KLTsvKiBQb2ludCAlZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCAlZXNpIHRvIHRoZSBzdHJpbmcgd2UgICovCi07LyogYXJlIGhvcGluZyB0byBtYXRjaCBpdCB1cCB3aXRoLiBJbiBhY3R1YWxpdHksICVlc2kgYW5kICVlZGkgYXJlICAgICAqLwotOy8qIGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgJWVkeCBpcyAgICAgKi8KLTsvKiBpbml0aWFsaXplZCB0byAtKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQltb3YJZXNpLCBbZXNwK3dpbmRvd10KLQltb3YJZWRpLCBbZXNwK3NjYW5dCi0JYWRkCWVzaSwgZWN4Ci0JbW92CWVheCwgW2VzcCtzY2FuYWxpZ25dCi0JbW92CWVkeCwgLU1BWF9NQVRDSF84Ci0JbGVhCWVkaSwgW2VkaStlYXgrTUFYX01BVENIXzhdCi0JbGVhCWVzaSwgW2VzaStlYXgrTUFYX01BVENIXzhdCi0KLTsvKiBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsCi07ICogYWRqdXN0ICVlZHggc28gdGhhdCBpdCBpcyBvZmZzZXQgdG8gdGhlIGV4YWN0IGJ5dGUgdGhhdCBtaXNtYXRjaGVkLgotOyAqCi07ICogV2UgYWxyZWFkeSBrbm93IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlCi07ICogc3RyaW5ncyBtYXRjaCBlYWNoIG90aGVyLCBhbmQgdGhleSBjYW4gYmUgc2FmZWx5IHBhc3NlZCBvdmVyIGJlZm9yZQotOyAqIHN0YXJ0aW5nIHRoZSBjb21wYXJlIGxvb3AuIFNvIHdoYXQgdGhpcyBjb2RlIGRvZXMgaXMgc2tpcCBvdmVyIDAtMwotOyAqIGJ5dGVzLCBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBkd29yZC1hbGlnbiB0aGUgJWVkaQotOyAqIHBvaW50ZXIuICglZXNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pCi07ICoKLTsgKiBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50Ci07ICogbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUKLTsgKiBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUKLTsgKiBwZXJmb3JtYW5jZS4KLTsgKi8KLQotTG9vcENtcHM6Ci0JbW92CWVheCwgRFdPUkQgUFRSW2VzaStlZHhdCi0JeG9yCWVheCwgRFdPUkQgUFRSW2VkaStlZHhdCi0Jam56CVNIT1JUIExlYXZlTG9vcENtcHMKLQotCW1vdgllYXgsIERXT1JEIFBUUltlc2krZWR4KzRdCi0JeG9yCWVheCwgRFdPUkQgUFRSW2VkaStlZHgrNF0KLQlqbnoJU0hPUlQgTGVhdmVMb29wQ21wczQKLQotCWFkZAllZHgsIDgKLQlqbnoJU0hPUlQgTG9vcENtcHMKLQlqbXAJTGVuTWF4aW11bQotCUFMSUdOCTQKLQotTGVhdmVMb29wQ21wczQ6Ci0JYWRkCWVkeCwgNAotCi1MZWF2ZUxvb3BDbXBzOgotCXRlc3QJZWF4LCAwMDAwMEZGRkZICi0Jam56CVNIT1JUIExlbkxvd2VyCi0KLQlhZGQJZWR4LCAyCi0Jc2hyCWVheCwgMTYKLQotTGVuTG93ZXI6Ci0Jc3ViCWFsLCAxCi0JYWRjCWVkeCwgMAotCi07LyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsICAqLwotOy8qIHRoZW4gYXV0b21hdGljYWxseSBhY2NlcHQgaXQgYXMgdGhlIGJlc3QgcG9zc2libGUgbWF0Y2ggYW5kIGxlYXZlLiAgKi8KLQotCWxlYQllYXgsIFtlZGkrZWR4XQotCW1vdgllZGksIFtlc3Arc2Nhbl0KLQlzdWIJZWF4LCBlZGkKLQljbXAJZWF4LCBNQVhfTUFUQ0gKLQlqZ2UJU0hPUlQgTGVuTWF4aW11bQotCi07LyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbm90IGxvbmdlciB0aGFuIHRoZSBiZXN0IG1hdGNoIHdlICAgICAqLwotOy8qIGhhdmUgc28gZmFyLCB0aGVuIGZvcmdldCBpdCBhbmQgcmV0dXJuIHRvIHRoZSBsb29rdXAgbG9vcC4gICAgICAgICAgKi8KLQotCW1vdgllZHgsIFtlc3ArZGVmbGF0ZXN0YXRlXQotCW1vdgllYngsIFtlc3ArYmVzdGxlbl0KLQljbXAJZWF4LCBlYngKLQlqZwlTSE9SVCBMb25nZXJNYXRjaAotCW1vdgllc2ksIFtlc3Ard2luZG93YmVzdGxlbl0KLQltb3YJZWRpLCBbZWR4XS5kc19wcmV2Ci0JbW92CWVieCwgW2VzcCtzY2FuZW5kXQotCW1vdgllZHgsIFtlc3ArY2hhaW5sZW53bWFza10KLQlqbXAJTG9va3VwTG9vcAotCUFMSUdOCTQKLQotOy8qICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLTsvKiAgICAgICAgIGJlc3RfbGVuID0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi07LyogICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotOy8qICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOyAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotTG9uZ2VyTWF0Y2g6Ci0JbW92CWVieCwgW2VzcCtuaWNlbWF0Y2hdCi0JbW92CVtlc3ArYmVzdGxlbl0sIGVheAotCW1vdglbZWR4XS5kc19tYXRjaF9zdGFydCwgZWN4Ci0JY21wCWVheCwgZWJ4Ci0JamdlCVNIT1JUIExlYXZlTm93Ci0JbW92CWVzaSwgW2VzcCt3aW5kb3ddCi0JYWRkCWVzaSwgZWF4Ci0JbW92CVtlc3Ard2luZG93YmVzdGxlbl0sIGVzaQotCW1vdnp4CWVieCwgV09SRCBQVFJbZWRpK2VheC0xXQotCW1vdgllZGksIFtlZHhdLmRzX3ByZXYKLQltb3YJW2VzcCtzY2FuZW5kXSwgZWJ4Ci0JbW92CWVkeCwgW2VzcCtjaGFpbmxlbndtYXNrXQotCWptcAlMb29rdXBMb29wCi0JQUxJR04JNAotCi07LyogQWNjZXB0IHRoZSBjdXJyZW50IHN0cmluZywgd2l0aCB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGguICAgICAgICAqLwotCi1MZW5NYXhpbXVtOgotCW1vdgllZHgsIFtlc3ArZGVmbGF0ZXN0YXRlXQotCW1vdglEV09SRCBQVFJbZXNwK2Jlc3RsZW5dLCBNQVhfTUFUQ0gKLQltb3YJW2VkeF0uZHNfbWF0Y2hfc3RhcnQsIGVjeAotCi07LyogaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOyAgICAgICAgICAqLwotOy8qIHJldHVybiBzLT5sb29rYWhlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotTGVhdmVOb3c6Ci0JbW92CWVkeCwgW2VzcCtkZWZsYXRlc3RhdGVdCi0JbW92CWVieCwgW2VzcCtiZXN0bGVuXQotCW1vdgllYXgsIFtlZHhdLmRzX2xvb2thaGVhZAotCWNtcAllYngsIGVheAotCWpnCVNIT1JUIExvb2thaGVhZFJldAotCW1vdgllYXgsIGVieAotTG9va2FoZWFkUmV0OgotCi07IFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4KLQotCWFkZAllc3AsIHZhcnNpemUKLQlwb3AJZWJ4Ci0JcG9wCWVzaQotCXBvcAllZGkKLQlwb3AJZWJwCi0JcmV0Ci0KLV9sb25nZXN0X21hdGNoCUVORFAKLQotX1RFWFQJRU5EUwotRU5ECmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9tYXNteDY0L2JsZF9tbDY0LmJhdCBiL2xpYnMvemxpYi9jb250cmliL21hc214NjQvYmxkX21sNjQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzRiY2VmLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21hc214NjQvYmxkX21sNjQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1tbDY0LmV4ZSAvRmxpbmZmYXN4NjQgL2MgL1ppIGluZmZhc3g2NC5hc20KLW1sNjQuZXhlIC9GbGd2bWF0NjQgICAvYyAvWmkgZ3ZtYXQ2NC5hc20KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5hc20gYi9saWJzL3psaWIvY29udHJpYi9tYXNteDY0L2d2bWF0NjQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWY2MWE1Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw1MTMgKzAsMCBAQAotO3VJbnQgbG9uZ2VzdF9tYXRjaF94NjQoCi07ICAgIGRlZmxhdGVfc3RhdGUgKnMsCi07ICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLQotOyBndm1hdDY0LmFzbSAtLSBBc20gcG9ydGlvbiBvZiB0aGUgb3B0aW1pemVkIGxvbmdlc3RfbWF0Y2ggZm9yIDMyIGJpdHMgeDg2Ci07IENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHksIEJyaWFuIFJhaXRlciBhbmQgR2lsbGVzIFZvbGxhbnQuCi07Ci07IEZpbGUgd3JpdHRlbiBieSBHaWxsZXMgVm9sbGFudCwgYnkgY29udmVydGluZyB0byBhc3NlbWJseSB0aGUgbG9uZ2VzdF9tYXRjaAotOyAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYyBvZiB6TGliIGFuZCBpbmZvWmlwIHppcC4KLTsKLTsgIGFuZCBieSB0YWtpbmcgaW5zcGlyYXRpb24gb24gYXNtNjg2IHdpdGggbWFzbSwgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUKLTsgICAgICAgIGZyb20gQnJpYW4gUmFpdGVyLCB3cml0dGVuIDE5OTgKLTsKLTsgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0Ci07ICAgICAgICAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbAotOyAgICAgICAgIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwKLTsKLTsgdG8gY29tcGlsZSB0aGlzIGZpbGUgZm9yIGluZm96aXAgWmlwLCBJIHVzZSBvcHRpb246Ci07ICAgbWw2NC5leGUgL0ZsZ3ZtYXQ2NCAvYyAvWmkgL0RJTkZPWklQIGd2bWF0NjQuYXNtCi07Ci07IHRvIGNvbXBpbGUgdGhpcyBmaWxlIGZvciB6TGliLCBJIHVzZSBvcHRpb246Ci07ICAgbWw2NC5leGUgL0ZsZ3ZtYXQ2NCAvYyAvWmkgZ3ZtYXQ2NC5hc20KLTsgQmUgY2FycmVmdWxsIHRvIGFkYXB0IHpsaWIxMjIyYWRkIGJlbG93IHRvIHlvdXIgdmVyc2lvbiBvZiB6TGliCi07ICAgKGlmIHlvdSB1c2UgYSB2ZXJzaW9uIG9mIHpMaWIgYmVmb3JlIDEuMC40IG9yIGFmdGVyIDEuMi4yLjIsIGNoYW5nZQotOyAgICB2YWx1ZSBvZiB6bGliMTIyMmFkZCBsYXRlcikKLTsKLTsgVGhpcyBmaWxlIGNvbXBpbGUgd2l0aCBNaWNyb3NvZnQgTWFjcm8gQXNzZW1ibGVyICh4NjQpIGZvciBBTUQ2NAotOwotOyAgIG1sNjQuZXhlIGlzIGdpdmVuIHdpdGggVmlzdWFsIFN0dWRpbyAyMDA1IGFuZCBXaW5kb3dzIDIwMDMgc2VydmVyIERESwotOwotOyAgICh5b3UgY2FuIGdldCBXaW5kb3dzIDIwMDMgc2VydmVyIERESyB3aXRoIG1sNjQgYW5kIGNsIGZvciBBTUQ2NCBmcm9tCi07ICAgICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvZGV2dG9vbHMvZGRrL2RlZmF1bHQubXNweCBmb3IgbG93IHByaWNlKQotOwotCi0KLTt1SW50IGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKQotOyAgICBkZWZsYXRlX3N0YXRlICpzOwotOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLS5jb2RlCi1sb25nZXN0X21hdGNoIFBST0MKLQotCi07TG9jYWxWYXJzU2l6ZSAgIGVxdSA4OAotIExvY2FsVmFyc1NpemUgICBlcXUgNzIKLQotOyByZWdpc3RlciB1c2VkIDogcmF4LHJieCxyY3gscmR4LHJzaSxyZGkscjgscjkscjEwLHIxMSxyMTIKLTsgZnJlZSByZWdpc3RlciA6ICByMTQscjE1Ci07IHJlZ2lzdGVyIGNhbiBiZSBzYXZlZCA6IHJzcAotCi0gY2hhaW5sZW53bWFzayAgIGVxdSAgcnNwICsgOCAtIExvY2FsVmFyc1NpemUgICAgOyBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBsb3cgd29yZDogcy0+d21hc2sKLTt3aW5kb3cgICAgICAgICAgZXF1ICByc3AgKyB4eCAtIExvY2FsVmFyc1NpemUgICA7IGxvY2FsIGNvcHkgb2Ygcy0+d2luZG93IDsgc3RvcmVkIGluIHIxMAotO3dpbmRvd2Jlc3RsZW4gICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgcy0+d2luZG93ICsgYmVzdGxlbiAsIHVzZSByMTArcjExCi07c2NhbnN0YXJ0ICAgICAgIGVxdSAgcnNwICsgeHggLSBMb2NhbFZhcnNTaXplICAgOyBmaXJzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nIDsgc3RvcmVkIGluIHIxMncKLTtzY2FuZW5kICAgICAgICAgZXF1ICByc3AgKyB4eCAtIExvY2FsVmFyc1NpemUgICA7IGxhc3QgdHdvIGJ5dGVzIG9mIHN0cmluZyB1c2UgZWJ4Ci07c2NhbmFsaWduICAgICAgIGVxdSAgcnNwICsgeHggLSBMb2NhbFZhcnNTaXplICAgOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nIHIxMwotO2Jlc3RsZW4gICAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgc2l6ZSBvZiBiZXN0IG1hdGNoIHNvIGZhciAtPiByMTFkCi07c2NhbiAgICAgICAgICAgIGVxdSAgcnNwICsgeHggLSBMb2NhbFZhcnNTaXplICAgOyBwdHIgdG8gc3RyaW5nIHdhbnRpbmcgbWF0Y2ggLT4gcjkKLUlGREVGIElORk9aSVAKLUVMU0UKLSBuaWNlbWF0Y2ggICAgICAgZXF1ICAocnNwICsgMTYgLSBMb2NhbFZhcnNTaXplKSA7IGEgZ29vZCBlbm91Z2ggbWF0Y2ggc2l6ZQotRU5ESUYKLQotc2F2ZV9yZGkgICAgICAgIGVxdSAgcnNwICsgMjQgLSBMb2NhbFZhcnNTaXplCi1zYXZlX3JzaSAgICAgICAgZXF1ICByc3AgKyAzMiAtIExvY2FsVmFyc1NpemUKLXNhdmVfcmJ4ICAgICAgICBlcXUgIHJzcCArIDQwIC0gTG9jYWxWYXJzU2l6ZQotc2F2ZV9yYnAgICAgICAgIGVxdSAgcnNwICsgNDggLSBMb2NhbFZhcnNTaXplCi1zYXZlX3IxMiAgICAgICAgZXF1ICByc3AgKyA1NiAtIExvY2FsVmFyc1NpemUKLXNhdmVfcjEzICAgICAgICBlcXUgIHJzcCArIDY0IC0gTG9jYWxWYXJzU2l6ZQotO3NhdmVfcjE0ICAgICAgICBlcXUgIHJzcCArIDcyIC0gTG9jYWxWYXJzU2l6ZQotO3NhdmVfcjE1ICAgICAgICBlcXUgIHJzcCArIDgwIC0gTG9jYWxWYXJzU2l6ZQotCi0KLQotOyAgYWxsIHRoZSArNCBvZmZzZXRzIGFyZSBkdWUgdG8gdGhlIGFkZGl0aW9uIG9mIHBlbmRpbmdfYnVmX3NpemUgKGluIHpsaWIKLTsgIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4KLTsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHJlbW92ZSB0aGUgKzQpLgotOyAgTm90ZSA6IHRoZXNlIHZhbHVlIGFyZSBnb29kIHdpdGggYSA4IGJ5dGVzIGJvdW5kYXJ5IHBhY2sgc3RydWN0dXJlCi0KLQotICAgIE1BWF9NQVRDSCAgICAgICAgICAgZXF1ICAgICAyNTgKLSAgICBNSU5fTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMwotICAgIE1JTl9MT09LQUhFQUQgICAgICAgZXF1ICAgICAoTUFYX01BVENIK01JTl9NQVRDSCsxKQotCi0KLTs7OyBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzCi07OzsgYXJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlLCB3aXRoIHRoZQotOzs7IGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywKLTs7OyBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzCi07OzsgcHJvZ3JhbSB0byBjcmFzaCBob3JyaWJseSwgd2l0aG91dCBzbyBtdWNoIGFzIGEgd2FybmluZyBhdAotOzs7IGNvbXBpbGUgdGltZS4gU2lnaC4pCi0KLTsgIGFsbCB0aGUgK3psaWIxMjIyYWRkIG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgZmllbGRzCi07ICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4KLTsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHVzZSAiemxpYjEyMjJhZGQgZXF1ICgtNCkiKS4KLTsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgYmV0d2VlbiAxLjAuNSBhbmQgMS4yLjIuMSwgdXNlICJ6bGliMTIyMmFkZCBlcXUgMCIpLgotOyAgaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuCi0KLQotSUZERUYgSU5GT1pJUAotCi1fREFUQSAgIFNFR01FTlQKLUNPTU0gICAgd2luZG93X3NpemU6RFdPUkQKLTsgV01hc2sgOyA3ZmZmCi1DT01NICAgIHdpbmRvdzpCWVRFOjAxMDA0MEgKLUNPTU0gICAgcHJldjpXT1JEOjA4MDAwSAotOyBNYXRjaExlbiA6IHVudXNlZAotOyBQcmV2TWF0Y2ggOiB1bnVzZWQKLUNPTU0gICAgc3Ryc3RhcnQ6RFdPUkQKLUNPTU0gICAgbWF0Y2hfc3RhcnQ6RFdPUkQKLTsgTG9va2FoZWFkIDogaWdub3JlCi1DT01NICAgIHByZXZfbGVuZ3RoOkRXT1JEIDsgUHJldkxlbgotQ09NTSAgICBtYXhfY2hhaW5fbGVuZ3RoOkRXT1JECi1DT01NICAgIGdvb2RfbWF0Y2g6RFdPUkQKLUNPTU0gICAgbmljZV9tYXRjaDpEV09SRAotcHJldl9hZCBlcXUgT0ZGU0VUIHByZXYKLXdpbmRvd19hZCBlcXUgT0ZGU0VUIHdpbmRvdwotbmljZW1hdGNoIGVxdSBuaWNlX21hdGNoCi1fREFUQSBFTkRTCi1XTWFzayBlcXUgMDdmZmZoCi0KLUVMU0UKLQotICBJRk5ERUYgemxpYjEyMjJhZGQKLSAgICB6bGliMTIyMmFkZCBlcXUgOAotICBFTkRJRgotZHNXU2l6ZSAgICAgICAgIGVxdSA1Nit6bGliMTIyMmFkZCsoemxpYjEyMjJhZGQvMikKLWRzV01hc2sgICAgICAgICBlcXUgNjQremxpYjEyMjJhZGQrKHpsaWIxMjIyYWRkLzIpCi1kc1dpbmRvdyAgICAgICAgZXF1IDcyK3psaWIxMjIyYWRkCi1kc1ByZXYgICAgICAgICAgZXF1IDg4K3psaWIxMjIyYWRkCi1kc01hdGNoTGVuICAgICAgZXF1IDEyOCt6bGliMTIyMmFkZAotZHNQcmV2TWF0Y2ggICAgIGVxdSAxMzIremxpYjEyMjJhZGQKLWRzU3RyU3RhcnQgICAgICBlcXUgMTQwK3psaWIxMjIyYWRkCi1kc01hdGNoU3RhcnQgICAgZXF1IDE0NCt6bGliMTIyMmFkZAotZHNMb29rYWhlYWQgICAgIGVxdSAxNDgremxpYjEyMjJhZGQKLWRzUHJldkxlbiAgICAgICBlcXUgMTUyK3psaWIxMjIyYWRkCi1kc01heENoYWluTGVuICAgZXF1IDE1Nit6bGliMTIyMmFkZAotZHNHb29kTWF0Y2ggICAgIGVxdSAxNzIremxpYjEyMjJhZGQKLWRzTmljZU1hdGNoICAgICBlcXUgMTc2K3psaWIxMjIyYWRkCi0KLXdpbmRvd19zaXplICAgICBlcXUgWyByY3ggKyBkc1dTaXplXQotV01hc2sgICAgICAgICAgIGVxdSBbIHJjeCArIGRzV01hc2tdCi13aW5kb3dfYWQgICAgICAgZXF1IFsgcmN4ICsgZHNXaW5kb3ddCi1wcmV2X2FkICAgICAgICAgZXF1IFsgcmN4ICsgZHNQcmV2XQotc3Ryc3RhcnQgICAgICAgIGVxdSBbIHJjeCArIGRzU3RyU3RhcnRdCi1tYXRjaF9zdGFydCAgICAgZXF1IFsgcmN4ICsgZHNNYXRjaFN0YXJ0XQotTG9va2FoZWFkICAgICAgIGVxdSBbIHJjeCArIGRzTG9va2FoZWFkXSA7IDBmZmZmZmZmZmggb24gaW5mb3ppcAotcHJldl9sZW5ndGggICAgIGVxdSBbIHJjeCArIGRzUHJldkxlbl0KLW1heF9jaGFpbl9sZW5ndGggZXF1IFsgcmN4ICsgZHNNYXhDaGFpbkxlbl0KLWdvb2RfbWF0Y2ggICAgICBlcXUgWyByY3ggKyBkc0dvb2RNYXRjaF0KLW5pY2VfbWF0Y2ggICAgICBlcXUgWyByY3ggKyBkc05pY2VNYXRjaF0KLUVORElGCi0KLTsgcGFyYW1ldGVyIDEgaW4gcjgoZGVmbGF0ZSBzdGF0ZSBzKSwgcGFyYW0gMiBpbiByZHggKGN1ciBtYXRjaCkKLQotOyBzZWUgaHR0cDovL3dlYmxvZ3MuYXNwLm5ldC9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDQvMDEvMTQvNTg1NzkuYXNweCBhbmQKLTsgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL2ttYXJjaC9oaC9rbWFyY2gvNjRiaXRBTURfOGU5NTFkZDItZWU3Ny00NzI4LTg3MDItNTVjZTRiNWRkMjRhLnhtbC5hc3AKLTsKLTsgQWxsIHJlZ2lzdGVycyBtdXN0IGJlIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGwsIGV4Y2VwdCBmb3IKLTsgICByYXgsIHJjeCwgcmR4LCByOCwgcjksIHIxMCwgYW5kIHIxMSwgd2hpY2ggYXJlIHNjcmF0Y2guCi0KLQotCi07OzsgU2F2ZSByZWdpc3RlcnMgdGhhdCB0aGUgY29tcGlsZXIgbWF5IGJlIHVzaW5nLCBhbmQgYWRqdXN0IGVzcCB0bwotOzs7IG1ha2Ugcm9vbSBmb3Igb3VyIHN0YWNrIGZyYW1lLgotCi0KLTs7OyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiByOGQgd2lsbCBob2xkIGN1cl9tYXRjaAotOzs7IHRocm91Z2hvdXQgdGhlIGVudGlyZSBmdW5jdGlvbi4gZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUKLTs7OyBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBkdXJpbmcgdGhlIGZ1bmN0aW9uJ3Mgc2V0dXAgKGJlZm9yZQotOzs7IGVudGVyaW5nIHRoZSBtYWluIGxvb3AuCi0KLTsgcGFyYW1ldGVyIDEgaW4gcmN4IChkZWZsYXRlX3N0YXRlKiBzKSwgcGFyYW0gMiBpbiBlZHggLT4gcjggKGN1ciBtYXRjaCkKLQotOyB0aGlzIGNsZWFyIGhpZ2ggMzIgYml0cyBvZiByOCwgd2hpY2ggY2FuIGJlIGdhcmJhZ2UgaW4gYm90aCByOCBhbmQgcmR4Ci0KLSAgICAgICAgbW92IFtzYXZlX3JkaV0scmRpCi0gICAgICAgIG1vdiBbc2F2ZV9yc2ldLHJzaQotICAgICAgICBtb3YgW3NhdmVfcmJ4XSxyYngKLSAgICAgICAgbW92IFtzYXZlX3JicF0scmJwCi1JRkRFRiBJTkZPWklQCi0gICAgICAgIG1vdiByOGQsZWN4Ci1FTFNFCi0gICAgICAgIG1vdiByOGQsZWR4Ci1FTkRJRgotICAgICAgICBtb3YgW3NhdmVfcjEyXSxyMTIKLSAgICAgICAgbW92IFtzYXZlX3IxM10scjEzCi07ICAgICAgICBtb3YgW3NhdmVfcjE0XSxyMTQKLTsgICAgICAgIG1vdiBbc2F2ZV9yMTVdLHIxNQotCi0KLTs7OyB1SW50IHdtYXNrID0gcy0+d19tYXNrOwotOzs7IHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7Ci07OzsgaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsKLTs7OyAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOwotOzs7IH0KLQotICAgICAgICBtb3YgZWRpLCBwcmV2X2xlbmd0aAotICAgICAgICBtb3YgZXNpLCBnb29kX21hdGNoCi0gICAgICAgIG1vdiBlYXgsIFdNYXNrCi0gICAgICAgIG1vdiBlYngsIG1heF9jaGFpbl9sZW5ndGgKLSAgICAgICAgY21wIGVkaSwgZXNpCi0gICAgICAgIGpsICBMYXN0TWF0Y2hHb29kCi0gICAgICAgIHNociBlYngsIDIKLUxhc3RNYXRjaEdvb2Q6Ci0KLTs7OyBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuCi07OzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0LgotOzs7IEl0IGlzIHRoZW4gc2hpZnRlZCBpbnRvIHRoZSBoaWdoIHdvcmQsIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHdtYXNrCi07OzsgdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4KLQotICAgICAgICBkZWMgZWJ4Ci0gICAgICAgIHNobCBlYngsIDE2Ci0gICAgICAgIG9yICBlYngsIGVheAotCi07Ozsgb24gemxpYiBvbmx5Ci07OzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7Ci0KLUlGREVGIElORk9aSVAKLSAgICAgICAgbW92IFtjaGFpbmxlbndtYXNrXSwgZWJ4Ci07IG9uIGluZm96aXAgbmljZV9tYXRjaCA9IFtuaWNlX21hdGNoXQotRUxTRQotICAgICAgICBtb3YgZWF4LCBuaWNlX21hdGNoCi0gICAgICAgIG1vdiBbY2hhaW5sZW53bWFza10sIGVieAotICAgICAgICBtb3YgcjEwZCwgTG9va2FoZWFkCi0gICAgICAgIGNtcCByMTBkLCBlYXgKLSAgICAgICAgY21vdm5sIHIxMGQsIGVheAotICAgICAgICBtb3YgW25pY2VtYXRjaF0scjEwZAotRU5ESUYKLQotOzs7IHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7Ci0gICAgICAgIG1vdiByMTAsIHdpbmRvd19hZAotICAgICAgICBtb3YgZWJwLCBzdHJzdGFydAotICAgICAgICBsZWEgcjEzLCBbcjEwICsgcmJwXQotCi07OzsgRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRoZSBzY2FuIHB0ciBpcyBvZmYgZnJvbSBiZWluZwotOzs7IGR3b3JkLWFsaWduZWQuCi0KLSAgICAgICAgIG1vdiByOSxyMTMKLSAgICAgICAgIG5lZyByMTMKLSAgICAgICAgIGFuZCByMTMsMwotCi07OzsgSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPwotOzs7ICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOwotSUZERUYgSU5GT1pJUAotICAgICAgICBtb3YgZWF4LDA3ZWZhaCA7IE1BWF9ESVNUID0gKFdTSVpFLU1JTl9MT09LQUhFQUQpICgweDgwMDAtKDMrOCsxKSkKLUVMU0UKLSAgICAgICAgbW92IGVheCwgd2luZG93X3NpemUKLSAgICAgICAgc3ViIGVheCwgTUlOX0xPT0tBSEVBRAotRU5ESUYKLSAgICAgICAgeG9yIGVkaSxlZGkKLSAgICAgICAgc3ViIGVicCwgZWF4Ci0KLSAgICAgICAgbW92IHIxMWQsIHByZXZfbGVuZ3RoCi0KLSAgICAgICAgY21vdm5nIGVicCxlZGkKLQotOzs7IGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOwotCi0KLTs7OyBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluIGVzaSBsb2NhbGx5LCBhbmQgaW4gZXNpLgotCi0gICAgICAgbGVhICByc2ksW3IxMCtyMTFdCi0KLTs7OyByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsKLTs7OyByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7Ci07OzsgUG9zZiAqcHJldiA9IHMtPnByZXY7Ci0KLSAgICAgICAgbW92enggcjEyZCx3b3JkIHB0ciBbcjldCi0gICAgICAgIG1vdnp4IGVieCwgd29yZCBwdHIgW3I5ICsgcjExIC0gMV0KLQotICAgICAgICBtb3YgcmRpLCBwcmV2X2FkCi0KLTs7OyBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4KLQotICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10KLQotICAgICAgICBjbXAgYngsd29yZCBwdHIgW3JzaSArIHI4IC0gMV0KLSAgICAgICAganogIExvb2t1cExvb3BJc1plcm8KLQotTG9va3VwTG9vcDE6Ci0gICAgICAgIGFuZCByOGQsIGVkeAotCi0gICAgICAgIG1vdnp4ICAgcjhkLCB3b3JkIHB0ciBbcmRpICsgcjgqMl0KLSAgICAgICAgY21wIHI4ZCwgZWJwCi0gICAgICAgIGpiZSBMZWF2ZU5vdwotICAgICAgICBzdWIgZWR4LCAwMDAxMDAwMGgKLSAgICAgICAganMgIExlYXZlTm93Ci0KLUxvb3BFbnRyeTE6Ci0gICAgICAgIGNtcCBieCx3b3JkIHB0ciBbcnNpICsgcjggLSAxXQotICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybwotCi1Mb29rdXBMb29wMjoKLSAgICAgICAgYW5kIHI4ZCwgZWR4Ci0KLSAgICAgICAgbW92enggICByOGQsIHdvcmQgcHRyIFtyZGkgKyByOCoyXQotICAgICAgICBjbXAgcjhkLCBlYnAKLSAgICAgICAgamJlIExlYXZlTm93Ci0gICAgICAgIHN1YiBlZHgsIDAwMDEwMDAwaAotICAgICAgICBqcyAgTGVhdmVOb3cKLQotTG9vcEVudHJ5MjoKLSAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdCi0gICAgICAgIGp6ICBMb29rdXBMb29wSXNaZXJvCi0KLUxvb2t1cExvb3A0OgotICAgICAgICBhbmQgcjhkLCBlZHgKLQotICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdCi0gICAgICAgIGNtcCByOGQsIGVicAotICAgICAgICBqYmUgTGVhdmVOb3cKLSAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoCi0gICAgICAgIGpzICBMZWF2ZU5vdwotCi1Mb29wRW50cnk0OgotCi0gICAgICAgIGNtcCBieCx3b3JkIHB0ciBbcnNpICsgcjggLSAxXQotICAgICAgICBqbnogTG9va3VwTG9vcDEKLSAgICAgICAgam1wIExvb2t1cExvb3BJc1plcm8KLQotCi07OzsgZG8gewotOzs7ICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKLTs7OyAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8Ci07OzsgICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOwotOzs7ICAgICBbLi4uXQotOzs7IH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdAotOzs7ICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOwotOzs7Ci07OzsgSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQotOzs7IG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsCi07OzsgYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuCi07OzsKLTs7OyBXaXRoaW4gdGhpcyBsb29wOgotOzs7IGVieCA9IHNjYW5lbmQKLTs7OyByOGQgPSBjdXJtYXRjaAotOzs7IGVkeCA9IGNoYWlubGVud21hc2sgLSBpLmUuLCAoKGNoYWlubGVuIDw8IDE2KSB8IHdtYXNrKQotOzs7IGVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikKLTs7OyBlZGkgPSBwcmV2Ci07OzsgZWJwID0gbGltaXQKLQotTG9va3VwTG9vcDoKLSAgICAgICAgYW5kIHI4ZCwgZWR4Ci0KLSAgICAgICAgbW92enggICByOGQsIHdvcmQgcHRyIFtyZGkgKyByOCoyXQotICAgICAgICBjbXAgcjhkLCBlYnAKLSAgICAgICAgamJlIExlYXZlTm93Ci0gICAgICAgIHN1YiBlZHgsIDAwMDEwMDAwaAotICAgICAgICBqcyAgTGVhdmVOb3cKLQotTG9vcEVudHJ5OgotCi0gICAgICAgIGNtcCBieCx3b3JkIHB0ciBbcnNpICsgcjggLSAxXQotICAgICAgICBqbnogTG9va3VwTG9vcDEKLUxvb2t1cExvb3BJc1plcm86Ci0gICAgICAgIGNtcCAgICAgcjEydywgd29yZCBwdHIgW3IxMCArIHI4XQotICAgICAgICBqbnogTG9va3VwTG9vcDEKLQotCi07OzsgU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uCi0gICAgICAgIG1vdiBbY2hhaW5sZW53bWFza10sIGVkeAotCi07OzsgUG9pbnQgZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCBlc2kgdG8gdGhlIHN0cmluZyB3ZQotOzs7IGFyZSBob3BpbmcgdG8gbWF0Y2ggaXQgdXAgd2l0aC4gSW4gYWN0dWFsaXR5LCBlc2kgYW5kIGVkaSBhcmUKLTs7OyBib3RoIHBvaW50ZWQgKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKSBieXRlcyBhaGVhZCwgYW5kIGVkeCBpcwotOzs7IGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLgotCi0gICAgICAgIGxlYSByc2ksW3I4K3IxMF0KLSAgICAgICAgbW92IHJkeCwgMGZmZmZmZmZmZmZmZmZlZjhoOyAtKE1BWF9NQVRDSF84KQotICAgICAgICBsZWEgcnNpLCBbcnNpICsgcjEzICsgMDEwOGhdIDtNQVhfTUFUQ0hfOF0KLSAgICAgICAgbGVhIHJkaSwgW3I5ICsgcjEzICsgMDEwOGhdIDtNQVhfTUFUQ0hfOF0KLQotICAgICAgICBwcmVmZXRjaHQxIFtyc2krcmR4XQotICAgICAgICBwcmVmZXRjaHQxIFtyZGkrcmR4XQotCi0KLTs7OyBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsCi07OzsgYWRqdXN0IHJkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuCi07OzsKLTs7OyBXZSBhbHJlYWR5IGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUKLTs7OyBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlCi07Ozsgc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zCi07OzsgYnl0ZXMsIGFzIG11Y2ggYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGR3b3JkLWFsaWduIHRoZSBlZGkKLTs7OyBwb2ludGVyLiAocnNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pCi07OzsKLTs7OyBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50Ci07OzsgbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUKLTs7OyBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUKLTs7OyBwZXJmb3JtYW5jZS4KLQotCi1Mb29wQ21wczoKLSAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeF0KLSAgICAgICAgeG9yIHJheCwgW3JkaSArIHJkeF0KLSAgICAgICAgam56IExlYXZlTG9vcENtcHMKLQotICAgICAgICBtb3YgcmF4LCBbcnNpICsgcmR4ICsgOF0KLSAgICAgICAgeG9yIHJheCwgW3JkaSArIHJkeCArIDhdCi0gICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzOAotCi0KLSAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeCArIDgrOF0KLSAgICAgICAgeG9yIHJheCwgW3JkaSArIHJkeCArIDgrOF0KLSAgICAgICAgam56IExlYXZlTG9vcENtcHMxNgotCi0gICAgICAgIGFkZCByZHgsOCs4KzgKLQotICAgICAgICBqbXAgc2hvcnQgTG9vcENtcHMKLUxlYXZlTG9vcENtcHMxNjogYWRkIHJkeCw4Ci1MZWF2ZUxvb3BDbXBzODogYWRkIHJkeCw4Ci1MZWF2ZUxvb3BDbXBzOgotCi0gICAgICAgIHRlc3QgICAgZWF4LCAwMDAwRkZGRmgKLSAgICAgICAgam56IExlbkxvd2VyCi0KLSAgICAgICAgdGVzdCBlYXgsMGZmZmZmZmZmaAotCi0gICAgICAgIGpueiBMZW5Mb3dlcjMyCi0KLSAgICAgICAgYWRkIHJkeCw0Ci0gICAgICAgIHNociByYXgsMzIKLSAgICAgICAgb3IgYXgsYXgKLSAgICAgICAgam56IExlbkxvd2VyCi0KLUxlbkxvd2VyMzI6Ci0gICAgICAgIHNociBlYXgsMTYKLSAgICAgICAgYWRkIHJkeCwyCi1MZW5Mb3dlcjogICBzdWIgYWwsIDEKLSAgICAgICAgYWRjIHJkeCwgMAotOzs7IENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaC4gSWYgaXQgaXMgbG9uZ2VyIHRoYW4gTUFYX01BVENILAotOzs7IHRoZW4gYXV0b21hdGljYWxseSBhY2NlcHQgaXQgYXMgdGhlIGJlc3QgcG9zc2libGUgbWF0Y2ggYW5kIGxlYXZlLgotCi0gICAgICAgIGxlYSByYXgsIFtyZGkgKyByZHhdCi0gICAgICAgIHN1YiByYXgsIHI5Ci0gICAgICAgIGNtcCBlYXgsIE1BWF9NQVRDSAotICAgICAgICBqZ2UgTGVuTWF4aW11bQotCi07OzsgSWYgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbm90IGxvbmdlciB0aGFuIHRoZSBiZXN0IG1hdGNoIHdlCi07OzsgaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLgotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgY21wIGVheCwgcjExZAotICAgICAgICBqZyAgTG9uZ2VyTWF0Y2gKLQotICAgICAgICBsZWEgcnNpLFtyMTArcjExXQotCi0gICAgICAgIG1vdiByZGksIHByZXZfYWQKLSAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdCi0gICAgICAgIGptcCBMb29rdXBMb29wCi0KLTs7OyAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOwotOzs7ICAgICAgICAgYmVzdF9sZW4gPSBsZW47Ci07OzsgICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOwotOzs7ICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwotCi1Mb25nZXJNYXRjaDoKLSAgICAgICAgbW92IHIxMWQsIGVheAotICAgICAgICBtb3YgbWF0Y2hfc3RhcnQsIHI4ZAotICAgICAgICBjbXAgZWF4LCBbbmljZW1hdGNoXQotICAgICAgICBqZ2UgTGVhdmVOb3cKLQotICAgICAgICBsZWEgcnNpLFtyMTArcmF4XQotCi0gICAgICAgIG1vdnp4ICAgZWJ4LCB3b3JkIHB0ciBbcjkgKyByYXggLSAxXQotICAgICAgICBtb3YgcmRpLCBwcmV2X2FkCi0gICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQotICAgICAgICBqbXAgTG9va3VwTG9vcAotCi07OzsgQWNjZXB0IHRoZSBjdXJyZW50IHN0cmluZywgd2l0aCB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGguCi0KLUxlbk1heGltdW06Ci0gICAgICAgIG1vdiByMTFkLE1BWF9NQVRDSAotICAgICAgICBtb3YgbWF0Y2hfc3RhcnQsIHI4ZAotCi07OzsgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOwotOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7Ci0KLUxlYXZlTm93OgotSUZERUYgSU5GT1pJUAotICAgICAgICBtb3YgZWF4LHIxMWQKLUVMU0UKLSAgICAgICAgbW92IGVheCwgTG9va2FoZWFkCi0gICAgICAgIGNtcCByMTFkLCBlYXgKLSAgICAgICAgY21vdm5nIGVheCwgcjExZAotRU5ESUYKLQotOzs7IFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4KLQotCi0gICAgICAgIG1vdiByc2ksW3NhdmVfcnNpXQotICAgICAgICBtb3YgcmRpLFtzYXZlX3JkaV0KLSAgICAgICAgbW92IHJieCxbc2F2ZV9yYnhdCi0gICAgICAgIG1vdiByYnAsW3NhdmVfcmJwXQotICAgICAgICBtb3YgcjEyLFtzYXZlX3IxMl0KLSAgICAgICAgbW92IHIxMyxbc2F2ZV9yMTNdCi07ICAgICAgICBtb3YgcjE0LFtzYXZlX3IxNF0KLTsgICAgICAgIG1vdiByMTUsW3NhdmVfcjE1XQotCi0KLSAgICAgICAgcmV0IDAKLTsgcGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHN0cmluZyAhCi07IFlvdXIgY2FuIGZyZWVseSB1c2UgZ3ZtYXQ2NCBpbiBhbnkgZnJlZSBvciBjb21tZXJjaWFsIGFwcAotOyBidXQgaXQgaXMgZmFyIGJldHRlciBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQotICAgIGRiICAgICAwZGgsMGFoLCJhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSBmcm9tIEJyaWFuIFJhaXRlciwgd3JpdHRlbiAxOTk4LCBjb252ZXJ0ZWQgdG8gYW1kIDY0IGJ5IEdpbGxlcyBWb2xsYW50IDIwMDUiLDBkaCwwYWgsMAotbG9uZ2VzdF9tYXRjaCAgIEVORFAKLQotbWF0Y2hfaW5pdCBQUk9DCi0gIHJldCAwCi1tYXRjaF9pbml0IEVORFAKLQotCi1FTkQKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5vYmogYi9saWJzL3psaWIvY29udHJpYi9tYXNteDY0L2d2bWF0NjQub2JqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDljYTAyLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5vYmoKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9tYXNteDY0L2luZmZhczg2NjQuYyBiL2xpYnMvemxpYi9jb250cmliL21hc214NjQvaW5mZmFzODY2NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjU0NTU1Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21hc214NjQvaW5mZmFzODY2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qIGluZmZhczg2NjQuYyBpcyBhIGhhbmQgdHVuZWQgYXNzZW1ibGVyIHZlcnNpb24gb2YgaW5mZmFzdC5jIC0gZmFzdCBkZWNvZGluZwotICogdmVyc2lvbiBmb3IgQU1ENjQgb24gV2luZG93cyB1c2luZyBNaWNyb3NvZnQgQyBjb21waWxlcgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ2hyaXMgQW5kZXJzb24gPGNocmlzdG9wQGNoYXJtLm5ldD4KLSAqIFBsZWFzZSB1c2UgdGhlIGNvcHlyaWdodCBjb25kaXRpb25zIGFib3ZlLgotICoKLSAqIDIwMDUgLSBBZGFwdGF0aW9uIHRvIE1pY3Jvc29mdCBDIENvbXBpbGVyIGZvciBBTUQ2NCBieSBHaWxsZXMgVm9sbGFudAotICoKLSAqIGluZmZhczg2NjQuYyBjYWxsIGZ1bmN0aW9uIGluZmZhczg2NjRmbmMgaW4gaW5mZmFzeDY0LmFzbQotICogIGluZmZhc3g2NC5hc20gaXMgYXV0b21hdGljYWxseSBjb252ZXJ0IGZyb20gQU1ENjQgcG9ydGlvbiBvZiBpbmZmYXM4Ni5jCi0gKgotICogRGVjLTI5LTIwMDMgLS0gSSBhZGRlZCBBTUQ2NCBpbmZsYXRlIGFzbSBzdXBwb3J0LiAgVGhpcyB2ZXJzaW9uIGlzIGFsc28KLSAqIHNsaWdodGx5IHF1aWNrZXIgb24geDg2IHN5c3RlbXMgYmVjYXVzZSwgaW5zdGVhZCBvZiB1c2luZyByZXAgbW92c2IgdG8gY29weQotICogZGF0YSwgaXQgdXNlcyByZXAgbW92c3csIHdoaWNoIG1vdmVzIGRhdGEgaW4gMi1ieXRlIGNodW5rcyBpbnN0ZWFkIG9mIHNpbmdsZQotICogYnl0ZXMuICBJJ3ZlIHRlc3RlZCB0aGUgQU1ENjQgY29kZSBvbiBhIEZlZG9yYSBDb3JlIDEgKyB0aGUgeDg2XzY0IHVwZGF0ZXMKLSAqIGZyb20gaHR0cDovL2ZlZG9yYS5saW51eC5kdWtlLmVkdS9mYzFfeDg2XzY0Ci0gKiB3aGljaCBpcyBydW5uaW5nIG9uIGFuIEF0aGxvbiA2NCAzMDAwKyAvIEdpZ2FieXRlIEdBLUs4VlQ4MDBNIHN5c3RlbSB3aXRoCi0gKiAxR0IgcmFtLiAgVGhlIDY0LWJpdCB2ZXJzaW9uIGlzIGFib3V0IDQlIGZhc3RlciB0aGFuIHRoZSAzMi1iaXQgdmVyc2lvbiwKLSAqIHdoZW4gZGVjb21wcmVzc2luZyBtb3ppbGxhLXNvdXJjZS0xLjMudGFyLmd6LgotICoKLSAqIE1hci0xMy0yMDAzIC0tIE1vc3Qgb2YgdGhpcyBpcyBkZXJpdmVkIGZyb20gaW5mZmFzdC5TIHdoaWNoIGlzIGRlcml2ZWQgZnJvbQotICogdGhlIGdjYyAtUyBvdXRwdXQgb2YgemxpYi0xLjIuMC9pbmZmYXN0LmMuICBabGliLTEuMi4wIGlzIGluIGJldGEgcmVsZWFzZSBhdAotICogdGhlIG1vbWVudC4gIEkgaGF2ZSBzdWNjZXNzZnVsbHkgY29tcGlsZWQgYW5kIHRlc3RlZCB0aGlzIGNvZGUgd2l0aCBnY2MyLjk2LAotICogZ2NjMy4yLCBpY2M1LjAsIG1zdmM2LjAuICBJdCBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBzcGVlZCBvZiBpbmZmYXN0LlMKLSAqIGNvbXBpbGVkIHdpdGggZ2NjIC1ETk9fTU1YLCBidXQgaW5mZmFzdC5TIGlzIHN0aWxsIGZhc3RlciBvbiB0aGUgUDMgd2l0aCBNTVgKLSAqIGVuYWJsZWQuICBJIHdpbGwgYXR0ZW1wdCB0byBtZXJnZSB0aGUgTU1YIGNvZGUgaW50byB0aGlzIHZlcnNpb24uICBOZXdlcgotICogdmVyc2lvbnMgb2YgdGhpcyBhbmQgaW5mZmFzdC5TIGNhbiBiZSBmb3VuZCBhdAotICogaHR0cDovL3d3dy5lZXRiZWV0ZWUuY29tL3psaWIvIGFuZCBodHRwOi8vd3d3LmNoYXJtLm5ldC9+Y2hyaXN0b3AvemxpYi8KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAienV0aWwuaCIKLSNpbmNsdWRlICJpbmZ0cmVlcy5oIgotI2luY2x1ZGUgImluZmxhdGUuaCIKLSNpbmNsdWRlICJpbmZmYXN0LmgiCi0KLS8qIE1hcmsgQWRsZXIncyBjb21tZW50cyBmcm9tIGluZmZhc3QuYzogKi8KLQotLyoKLSAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcKLSAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpcwotICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC4KLSAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3IKLSAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGUKLSAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLgotCi0gICBFbnRyeSBhc3N1bXB0aW9uczoKLQotICAgICAgICBzdGF0ZS0+bW9kZSA9PSBMRU4KLSAgICAgICAgc3RybS0+YXZhaWxfaW4gPj0gNgotICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4Ci0gICAgICAgIHN0YXJ0ID49IHN0cm0tPmF2YWlsX291dAotICAgICAgICBzdGF0ZS0+Yml0cyA8IDgKLQotICAgT24gcmV0dXJuLCBzdGF0ZS0+bW9kZSBpcyBvbmUgb2Y6Ci0KLSAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0Ci0gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrCi0gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhCi0KLSAgIE5vdGVzOgotCi0gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGUKLSAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLAotICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy4KLSAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLT5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZAotICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy4KLQotICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OAotICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpCi0gICAgICByZXF1aXJlcyBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yCi0gICAgICBvdXRwdXQgc3BhY2UuCi0gKi8KLQotCi0KLSAgICB0eXBlZGVmIHN0cnVjdCBpbmZmYXN0X2FyIHsKLS8qIDY0ICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2ICB4ODZfNjQgKi8KLS8qIGFyIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyICovCi0vKiAgMCAgICAwICovIHZvaWQgKmVzcDsgICAgICAgICAgICAgICAgLyogZXNwIHNhdmUgKi8KLS8qICA4ICAgIDQgKi8gdm9pZCAqZWJwOyAgICAgICAgICAgICAgICAvKiBlYnAgc2F2ZSAqLwotLyogMTYgICAgOCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgIC8qIGVzaSByc2kgIGxvY2FsIHN0cm0tPm5leHRfaW4gKi8KLS8qIDI0ICAgMTIgKi8gdW5zaWduZWQgY2hhciBGQVIgKmxhc3Q7ICAvKiAgICAgcjkgICB3aGlsZSBpbiA8IGxhc3QgKi8KLS8qIDMyICAgMTYgKi8gdW5zaWduZWQgY2hhciBGQVIgKm91dDsgICAvKiBlZGkgcmRpICBsb2NhbCBzdHJtLT5uZXh0X291dCAqLwotLyogNDAgICAyMCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqYmVnOyAgIC8qICAgICAgICAgIGluZmxhdGUoKSdzIGluaXQgbmV4dF9vdXQgKi8KLS8qIDQ4ICAgMjQgKi8gdW5zaWduZWQgY2hhciBGQVIgKmVuZDsgICAvKiAgICAgcjEwICB3aGlsZSBvdXQgPCBlbmQgKi8KLS8qIDU2ICAgMjggKi8gdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsvKiAgICAgICAgICBzaXplIG9mIHdpbmRvdywgd3NpemUhPTAgKi8KLS8qIDY0ICAgMzIgKi8gY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAvKiBlYnAgcmJwICBsb2NhbCBzdHJtLT5sZW5jb2RlICovCi0vKiA3MiAgIDM2ICovIGNvZGUgY29uc3QgRkFSICpkY29kZTsgICAgLyogICAgIHIxMSAgbG9jYWwgc3RybS0+ZGlzdGNvZGUgKi8KLS8qIDgwICAgNDAgKi8gc2l6ZV90IC8qdW5zaWduZWQgbG9uZyAqL2hvbGQ7ICAgICAgIC8qIGVkeCByZHggIGxvY2FsIHN0cm0tPmhvbGQgKi8KLS8qIDg4ICAgNDQgKi8gdW5zaWduZWQgYml0czsgICAgICAgICAgICAvKiBlYnggcmJ4ICBsb2NhbCBzdHJtLT5iaXRzICovCi0vKiA5MiAgIDQ4ICovIHVuc2lnbmVkIHdzaXplOyAgICAgICAgICAgLyogICAgICAgICAgd2luZG93IHNpemUgKi8KLS8qIDk2ICAgNTIgKi8gdW5zaWduZWQgd3JpdGU7ICAgICAgICAgICAvKiAgICAgICAgICB3aW5kb3cgd3JpdGUgaW5kZXggKi8KLS8qMTAwICAgNTYgKi8gdW5zaWduZWQgbG1hc2s7ICAgICAgICAgICAvKiAgICAgcjEyICBtYXNrIGZvciBsY29kZSAqLwotLyoxMDQgICA2MCAqLyB1bnNpZ25lZCBkbWFzazsgICAgICAgICAgIC8qICAgICByMTMgIG1hc2sgZm9yIGRjb2RlICovCi0vKjEwOCAgIDY0ICovIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgLyogICAgIHIxNCAgbWF0Y2ggbGVuZ3RoICovCi0vKjExMiAgIDY4ICovIHVuc2lnbmVkIGRpc3Q7ICAgICAgICAgICAgLyogICAgIHIxNSAgbWF0Y2ggZGlzdGFuY2UgKi8KLS8qMTE2ICAgNzIgKi8gdW5zaWduZWQgc3RhdHVzOyAgICAgICAgICAvKiAgICAgICAgICBzZXQgd2hlbiBzdGF0ZSBjaG5nKi8KLSAgICB9IHR5cGVfYXI7Ci0jaWZkZWYgQVNNSU5GCi0KLXZvaWQgaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KQotel9zdHJlYW1wIHN0cm07Ci11bnNpZ25lZCBzdGFydDsgICAgICAgICAvKiBpbmZsYXRlKCkncyBzdGFydGluZyB2YWx1ZSBmb3Igc3RybS0+YXZhaWxfb3V0ICovCi17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLSAgICB0eXBlX2FyIGFyOwotICAgIHZvaWQgaW5mZmFzODY2NGZuYyhzdHJ1Y3QgaW5mZmFzdF9hciAqIHBhcik7Ci0KLSAgICAKLQotI2lmIChkZWZpbmVkKCBfX0dOVUNfXyApICYmIGRlZmluZWQoIF9fYW1kNjRfXyApICYmICEgZGVmaW5lZCggX19pMzg2ICkpIHx8IChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0FNRDY0KSkKLSNkZWZpbmUgUEFEX0FWQUlMX0lOIDYKLSNkZWZpbmUgUEFEX0FWQUlMX09VVCAyNTggICAgCi0jZWxzZQotI2RlZmluZSBQQURfQVZBSUxfSU4gNQotI2RlZmluZSBQQURfQVZBSUxfT1VUIDI1NwotI2VuZGlmCi0KLSAgICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqLwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotCi0gICAgYXIuaW4gPSBzdHJtLT5uZXh0X2luOwotICAgIGFyLmxhc3QgPSBhci5pbiArIChzdHJtLT5hdmFpbF9pbiAtIFBBRF9BVkFJTF9JTik7Ci0gICAgYXIub3V0ID0gc3RybS0+bmV4dF9vdXQ7Ci0gICAgYXIuYmVnID0gYXIub3V0IC0gKHN0YXJ0IC0gc3RybS0+YXZhaWxfb3V0KTsKLSAgICBhci5lbmQgPSBhci5vdXQgKyAoc3RybS0+YXZhaWxfb3V0IC0gUEFEX0FWQUlMX09VVCk7Ci0gICAgYXIud3NpemUgPSBzdGF0ZS0+d3NpemU7Ci0gICAgYXIud3JpdGUgPSBzdGF0ZS0+d3JpdGU7Ci0gICAgYXIud2luZG93ID0gc3RhdGUtPndpbmRvdzsKLSAgICBhci5ob2xkID0gc3RhdGUtPmhvbGQ7Ci0gICAgYXIuYml0cyA9IHN0YXRlLT5iaXRzOwotICAgIGFyLmxjb2RlID0gc3RhdGUtPmxlbmNvZGU7Ci0gICAgYXIuZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7Ci0gICAgYXIubG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsKLSAgICBhci5kbWFzayA9ICgxVSA8PCBzdGF0ZS0+ZGlzdGJpdHMpIC0gMTsKLQotICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaAotICAgICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovCi0KLSAgICAvKiBhbGlnbiBpbiBvbiAxLzIgaG9sZCBzaXplIGJvdW5kYXJ5ICovCi0gICAgd2hpbGUgKCgoc2l6ZV90KSh2b2lkICopYXIuaW4gJiAoc2l6ZW9mKGFyLmhvbGQpIC8gMiAtIDEpKSAhPSAwKSB7Ci0gICAgICAgIGFyLmhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKmFyLmluKysgPDwgYXIuYml0czsKLSAgICAgICAgYXIuYml0cyArPSA4OwotICAgIH0KLQotICAgIGluZmZhczg2NjRmbmMoJmFyKTsKLQotICAgIGlmIChhci5zdGF0dXMgPiAxKSB7Ci0gICAgICAgIGlmIChhci5zdGF0dXMgPT0gMikKLSAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwotICAgICAgICBlbHNlIGlmIChhci5zdGF0dXMgPT0gMykKLSAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwotICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGFyLnN0YXR1cyA9PSAxICkgewotICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7Ci0gICAgfQotCi0gICAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovCi0gICAgYXIubGVuID0gYXIuYml0cyA+PiAzOwotICAgIGFyLmluIC09IGFyLmxlbjsKLSAgICBhci5iaXRzIC09IGFyLmxlbiA8PCAzOwotICAgIGFyLmhvbGQgJj0gKDFVIDw8IGFyLmJpdHMpIC0gMTsKLQotICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovCi0gICAgc3RybS0+bmV4dF9pbiA9IGFyLmluOwotICAgIHN0cm0tPm5leHRfb3V0ID0gYXIub3V0OwotICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKShhci5pbiA8IGFyLmxhc3QgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfSU4gKyAoYXIubGFzdCAtIGFyLmluKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBRF9BVkFJTF9JTiAtIChhci5pbiAtIGFyLmxhc3QpKTsKLSAgICBzdHJtLT5hdmFpbF9vdXQgPSAodW5zaWduZWQpKGFyLm91dCA8IGFyLmVuZCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfT1VUICsgKGFyLmVuZCAtIGFyLm91dCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX09VVCAtIChhci5vdXQgLSBhci5lbmQpKTsKLSAgICBzdGF0ZS0+aG9sZCA9ICh1bnNpZ25lZCBsb25nKWFyLmhvbGQ7Ci0gICAgc3RhdGUtPmJpdHMgPSBhci5iaXRzOwotICAgIHJldHVybjsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9tYXNteDY0L2luZmZhc3g2NC5hc20gYi9saWJzL3psaWIvY29udHJpYi9tYXNteDY0L2luZmZhc3g2NC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYTQzM2QuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvbWFzbXg2NC9pbmZmYXN4NjQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLTsgaW5mZmFzeDY0LmFzbSBpcyBhIGhhbmQgdHVuZWQgYXNzZW1ibGVyIHZlcnNpb24gb2YgaW5mZmFzdC5jIC0gZmFzdCBkZWNvZGluZwotOyB2ZXJzaW9uIGZvciBBTUQ2NCBvbiBXaW5kb3dzIHVzaW5nIE1pY3Jvc29mdCBDIGNvbXBpbGVyCi07Ci07IGluZmZhc3g2NC5hc20gaXMgYXV0b21hdGljYWxseSBjb252ZXJ0IGZyb20gQU1ENjQgcG9ydGlvbiBvZiBpbmZmYXM4Ni5jCi07IGluZmZhc3g2NC5hc20gaXMgY2FsbGVkIGJ5IGluZmZhczg2NjQuYywgd2hpY2ggY29udGFpbiBtb3JlIGluZm8uCi0KLQotOyB0byBjb21waWxlIHRoaXMgZmlsZSwgSSB1c2Ugb3B0aW9uCi07ICAgbWw2NC5leGUgL0ZsaW5mZmFzeDY0IC9jIC9aaSBpbmZmYXN4NjQuYXNtCi07ICAgd2l0aCBNaWNyb3NvZnQgTWFjcm8gQXNzZW1ibGVyICh4NjQpIGZvciBBTUQ2NAotOwotOyAgIG1sNjQuZXhlIGlzIGdpdmVuIHdpdGggVmlzdWFsIFN0dWRpbyAyMDA1LCBXaW5kb3dzIDIwMDMgc2VydmVyIERESwotOwotOyAgICh5b3UgY2FuIGdldCBXaW5kb3dzIDIwMDMgc2VydmVyIERESyB3aXRoIG1sNjQgYW5kIGNsLmV4ZSBmb3IgQU1ENjQgZnJvbSAKLTsgICAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2hkYy9kZXZ0b29scy9kZGsvZGVmYXVsdC5tc3B4IGZvciBsb3cgcHJpY2UpCi07Ci0KLS5jb2RlCi1pbmZmYXM4NjY0Zm5jIFBST0MKLQotOyBzZWUgaHR0cDovL3dlYmxvZ3MuYXNwLm5ldC9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDQvMDEvMTQvNTg1NzkuYXNweCBhbmQKLTsgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL2ttYXJjaC9oaC9rbWFyY2gvNjRiaXRBTURfOGU5NTFkZDItZWU3Ny00NzI4LTg3MDItNTVjZTRiNWRkMjRhLnhtbC5hc3AKLTsKLTsgQWxsIHJlZ2lzdGVycyBtdXN0IGJlIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGwsIGV4Y2VwdCBmb3IKLTsgICByYXgsIHJjeCwgcmR4LCByOCwgci05LCByMTAsIGFuZCByMTEsIHdoaWNoIGFyZSBzY3JhdGNoLgotCi0KLQltb3YgW3JzcC04XSxyc2kKLQltb3YgW3JzcC0xNl0scmRpCi0JbW92IFtyc3AtMjRdLHIxMgotCW1vdiBbcnNwLTMyXSxyMTMKLQltb3YgW3JzcC00MF0scjE0Ci0JbW92IFtyc3AtNDhdLHIxNQotCW1vdiBbcnNwLTU2XSxyYngKLQotCW1vdiByYXgscmN4Ci0KLQltb3YJW3JheCs4XSwgcmJwICAgICAgIDsgLyogc2F2ZSByZWdzIHJicCBhbmQgcnNwICovCi0JbW92CVtyYXhdLCByc3AKLQotCW1vdglyc3AsIHJheCAgICAgICAgICA7IC8qIG1ha2UgcnNwIHBvaW50IHRvICZhciAqLwotCi0JbW92CXJzaSwgW3JzcCsxNl0gICAgICA7IC8qIHJzaSAgPSBpbiAqLwotCW1vdglyZGksIFtyc3ArMzJdICAgICAgOyAvKiByZGkgID0gb3V0ICovCi0JbW92CXI5LCBbcnNwKzI0XSAgICAgICA7IC8qIHI5ICAgPSBsYXN0ICovCi0JbW92CXIxMCwgW3JzcCs0OF0gICAgICA7IC8qIHIxMCAgPSBlbmQgKi8KLQltb3YJcmJwLCBbcnNwKzY0XSAgICAgIDsgLyogcmJwICA9IGxjb2RlICovCi0JbW92CXIxMSwgW3JzcCs3Ml0gICAgICA7IC8qIHIxMSAgPSBkY29kZSAqLwotCW1vdglyZHgsIFtyc3ArODBdICAgICAgOyAvKiByZHggID0gaG9sZCAqLwotCW1vdgllYngsIFtyc3ArODhdICAgICAgOyAvKiBlYnggID0gYml0cyAqLwotCW1vdglyMTJkLCBbcnNwKzEwMF0gICAgOyAvKiByMTJkID0gbG1hc2sgKi8KLQltb3YJcjEzZCwgW3JzcCsxMDRdICAgIDsgLyogcjEzZCA9IGRtYXNrICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IC8qIHIxNGQgPSBsZW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgLyogcjE1ZCA9IGRpc3QgKi8KLQotCi0JY2xkCi0JY21wCXIxMCwgcmRpCi0JamUJTF9vbmVfdGltZSAgICAgICAgICAgOyAvKiBpZiBvbmx5IG9uZSBkZWNvZGUgbGVmdCAqLwotCWNtcAlyOSwgcnNpCi0KLSAgICBqbmUgTF9kb19sb29wCi0KLQotTF9vbmVfdGltZToKLQltb3YJcjgsIHIxMiAgICAgICAgICAgOyAvKiByOCA9IGxtYXNrICovCi0JY21wCWJsLCAzMgotCWphCUxfZ2V0X2xlbmd0aF9jb2RlX29uZV90aW1lCi0KLQlsb2RzZCAgICAgICAgICAgICAgICAgICAgICAgICA7IC8qIGVheCA9ICoodWludCAqKWluKysgKi8KLQltb3YJY2wsIGJsICAgICAgICAgICAgOyAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLwotCWFkZAlibCwgMzIgICAgICAgICAgICAgOyAvKiBiaXRzICs9IDMyICovCi0Jc2hsCXJheCwgY2wKLQlvcglyZHgsIHJheCAgICAgICAgICA7IC8qIGhvbGQgfD0gKigodWludCAqKWluKSsrIDw8IGJpdHMgKi8KLQlqbXAJTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWUKLQotQUxJR04gNAotTF93aGlsZV90ZXN0OgotCWNtcAlyMTAsIHJkaQotCWpiZQlMX2JyZWFrX2xvb3AKLQljbXAJcjksIHJzaQotCWpiZQlMX2JyZWFrX2xvb3AKLQotTF9kb19sb29wOgotCW1vdglyOCwgcjEyICAgICAgICAgICA7IC8qIHI4ID0gbG1hc2sgKi8KLQljbXAJYmwsIDMyCi0JamEJTF9nZXRfbGVuZ3RoX2NvZGUgICAgOyAvKiBpZiAoMzIgPCBiaXRzKSAqLwotCi0JbG9kc2QgICAgICAgICAgICAgICAgICAgICAgICAgOyAvKiBlYXggPSAqKHVpbnQgKilpbisrICovCi0JbW92CWNsLCBibCAgICAgICAgICAgIDsgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLQlhZGQJYmwsIDMyICAgICAgICAgICAgIDsgLyogYml0cyArPSAzMiAqLwotCXNobAlyYXgsIGNsCi0Jb3IJcmR4LCByYXggICAgICAgICAgOyAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovCi0KLUxfZ2V0X2xlbmd0aF9jb2RlOgotCWFuZAlyOCwgcmR4ICAgICAgICAgICAgOyAvKiByOCAmPSBob2xkICovCi0JbW92CWVheCwgW3JicCtyOCo0XSAgOyAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCi0KLQltb3YJY2wsIGFoICAgICAgICAgICAgOyAvKiBjbCA9IHRoaXMuYml0cyAqLwotCXN1YglibCwgYWggICAgICAgICAgICA7IC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCi0Jc2hyCXJkeCwgY2wgICAgICAgICAgIDsgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCi0KLQl0ZXN0CWFsLCBhbAotCWpueglMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlIDsgLyogaWYgKG9wICE9IDApIDQ1LjclICovCi0KLQltb3YJcjgsIHIxMiAgICAgICAgICAgIDsgLyogcjggPSBsbWFzayAqLwotCXNocgllYXgsIDE2ICAgICAgICAgICAgOyAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLwotCXN0b3NiCi0KLUxfZ2V0X2xlbmd0aF9jb2RlX29uZV90aW1lOgotCWFuZAlyOCwgcmR4ICAgICAgICAgICAgOyAvKiByOCAmPSBob2xkICovCi0JbW92CWVheCwgW3JicCtyOCo0XSA7IC8qIGVheCA9IGxjb2RlW2hvbGQgJiBsbWFza10gKi8KLQotTF9kb2xlbjoKLQltb3YJY2wsIGFoICAgICAgICAgICAgOyAvKiBjbCA9IHRoaXMuYml0cyAqLwotCXN1YglibCwgYWggICAgICAgICAgICA7IC8qIGJpdHMgLT0gdGhpcy5iaXRzICovCi0Jc2hyCXJkeCwgY2wgICAgICAgICAgIDsgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCi0KLQl0ZXN0CWFsLCBhbAotCWpueglMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlIDsgLyogaWYgKG9wICE9IDApIDQ1LjclICovCi0KLQlzaHIJZWF4LCAxNiAgICAgICAgICAgIDsgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KLQlzdG9zYgotCWptcAlMX3doaWxlX3Rlc3QKLQotQUxJR04gNAotTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZToKLQltb3YJcjE0ZCwgZWF4ICAgICAgICAgOyAvKiBsZW4gPSB0aGlzICovCi0Jc2hyCXIxNGQsIDE2ICAgICAgICAgICA7IC8qIGxlbiA9IHRoaXMudmFsICovCi0JbW92CWNsLCBhbAotCi0JdGVzdAlhbCwgMTYKLQlqeglMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGggOyAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovCi0JYW5kCWNsLCAxNSAgICAgICAgICAgICA7IC8qIG9wICY9IDE1ICovCi0JanoJTF9kZWNvZGVfZGlzdGFuY2UgICAgOyAvKiBpZiAoIW9wKSAqLwotCi1MX2FkZF9iaXRzX3RvX2xlbjoKLQlzdWIJYmwsIGNsCi0JeG9yCWVheCwgZWF4Ci0JaW5jCWVheAotCXNobAllYXgsIGNsCi0JZGVjCWVheAotCWFuZAllYXgsIGVkeCAgICAgICAgICA7IC8qIGVheCAmPSBob2xkICovCi0Jc2hyCXJkeCwgY2wKLQlhZGQJcjE0ZCwgZWF4ICAgICAgICAgOyAvKiBsZW4gKz0gaG9sZCAmIG1hc2tbb3BdICovCi0KLUxfZGVjb2RlX2Rpc3RhbmNlOgotCW1vdglyOCwgcjEzICAgICAgICAgICA7IC8qIHI4ID0gZG1hc2sgKi8KLQljbXAJYmwsIDMyCi0JamEJTF9nZXRfZGlzdGFuY2VfY29kZSAgOyAvKiBpZiAoMzIgPCBiaXRzKSAqLwotCi0JbG9kc2QgICAgICAgICAgICAgICAgICAgICAgICAgOyAvKiBlYXggPSAqKHVpbnQgKilpbisrICovCi0JbW92CWNsLCBibCAgICAgICAgICAgIDsgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KLQlhZGQJYmwsIDMyICAgICAgICAgICAgIDsgLyogYml0cyArPSAzMiAqLwotCXNobAlyYXgsIGNsCi0Jb3IJcmR4LCByYXggICAgICAgICAgOyAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovCi0KLUxfZ2V0X2Rpc3RhbmNlX2NvZGU6Ci0JYW5kCXI4LCByZHggICAgICAgICAgIDsgLyogcjggJj0gaG9sZCAqLwotCW1vdgllYXgsIFtyMTErcjgqNF0gOyAvKiBlYXggPSBkY29kZVtob2xkICYgZG1hc2tdICovCi0KLUxfZG9kaXN0OgotCW1vdglyMTVkLCBlYXggICAgICAgICA7IC8qIGRpc3QgPSB0aGlzICovCi0Jc2hyCXIxNWQsIDE2ICAgICAgICAgICA7IC8qIGRpc3QgPSB0aGlzLnZhbCAqLwotCW1vdgljbCwgYWgKLQlzdWIJYmwsIGFoICAgICAgICAgICAgOyAvKiBiaXRzIC09IHRoaXMuYml0cyAqLwotCXNocglyZHgsIGNsICAgICAgICAgICA7IC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLwotCW1vdgljbCwgYWwgICAgICAgICAgICA7IC8qIGNsID0gdGhpcy5vcCAqLwotCi0JdGVzdAlhbCwgMTYgICAgICAgICAgICAgOyAvKiBpZiAoKG9wICYgMTYpID09IDApICovCi0JanoJTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdAotCWFuZAljbCwgMTUgICAgICAgICAgICAgOyAvKiBvcCAmPSAxNSAqLwotCWp6CUxfY2hlY2tfZGlzdF9vbmUKLQotTF9hZGRfYml0c190b19kaXN0OgotCXN1YglibCwgY2wKLQl4b3IJZWF4LCBlYXgKLQlpbmMJZWF4Ci0Jc2hsCWVheCwgY2wKLQlkZWMJZWF4ICAgICAgICAgICAgICAgICA7IC8qICgxIDw8IG9wKSAtIDEgKi8KLQlhbmQJZWF4LCBlZHggICAgICAgICAgOyAvKiBlYXggJj0gaG9sZCAqLwotCXNocglyZHgsIGNsCi0JYWRkCXIxNWQsIGVheCAgICAgICAgIDsgLyogZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpICovCi0KLUxfY2hlY2tfd2luZG93OgotCW1vdglyOCwgcnNpICAgICAgICAgICA7IC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovCi0JbW92CXJheCwgcmRpCi0Jc3ViCXJheCwgW3JzcCs0MF0gICAgICA7IC8qIG5ieXRlcyA9IG91dCAtIGJlZyAqLwotCi0JY21wCWVheCwgcjE1ZAotCWpiCUxfY2xpcF93aW5kb3cgICAgICAgIDsgLyogaWYgKGRpc3QgPiBuYnl0ZXMpIDQuMiUgKi8KLQotCW1vdgllY3gsIHIxNGQgICAgICAgICA7IC8qIGVjeCA9IGxlbiAqLwotCW1vdglyc2ksIHJkaQotCXN1Yglyc2ksIHIxNSAgICAgICAgICA7IC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0KLQlzYXIJZWN4LCAxCi0Jam5jCUxfY29weV90d28gICAgICAgICAgIDsgLyogaWYgbGVuICUgMiA9PSAwICovCi0KLQlyZXAgICAgIG1vdnN3Ci0JbW92CWFsLCBbcnNpXQotCW1vdglbcmRpXSwgYWwKLQlpbmMJcmRpCi0KLQltb3YJcnNpLCByOCAgICAgICAgICAgOyAvKiBtb3ZlIGluIGJhY2sgdG8gJXJzaSwgdG9zcyBmcm9tICovCi0Jam1wCUxfd2hpbGVfdGVzdAotCi1MX2NvcHlfdHdvOgotCXJlcCAgICAgbW92c3cKLQltb3YJcnNpLCByOCAgICAgICAgICAgOyAvKiBtb3ZlIGluIGJhY2sgdG8gJXJzaSwgdG9zcyBmcm9tICovCi0Jam1wCUxfd2hpbGVfdGVzdAotCi1BTElHTiA0Ci1MX2NoZWNrX2Rpc3Rfb25lOgotCWNtcAlyMTVkLCAxICAgICAgICAgICAgOyAvKiBpZiBkaXN0IDEsIGlzIGEgbWVtc2V0ICovCi0Jam5lCUxfY2hlY2tfd2luZG93Ci0JY21wCVtyc3ArNDBdLCByZGkgICAgICA7IC8qIGlmIG91dCA9PSBiZWcsIG91dHNpZGUgd2luZG93ICovCi0JamUJTF9jaGVja193aW5kb3cKLQotCW1vdgllY3gsIHIxNGQgICAgICAgICA7IC8qIGVjeCA9IGxlbiAqLwotCW1vdglhbCwgW3JkaS0xXQotCW1vdglhaCwgYWwKLQotCXNhcgllY3gsIDEKLQlqbmMJTF9zZXRfdHdvCi0JbW92CVtyZGldLCBhbAotCWluYwlyZGkKLQotTF9zZXRfdHdvOgotCXJlcCAgICAgc3Rvc3cKLQlqbXAJTF93aGlsZV90ZXN0Ci0KLUFMSUdOIDQKLUxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDoKLQl0ZXN0CWFsLCA2NAotCWpueglMX3Rlc3RfZm9yX2VuZF9vZl9ibG9jayA7IC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KLQotCXhvcgllYXgsIGVheAotCWluYwllYXgKLQlzaGwJZWF4LCBjbAotCWRlYwllYXgKLQlhbmQJZWF4LCBlZHggICAgICAgICA7IC8qIGVheCAmPSBob2xkICovCi0JYWRkCWVheCwgcjE0ZCAgICAgICAgOyAvKiBlYXggKz0gbGVuICovCi0JbW92CWVheCwgW3JicCtyYXgqNF0gOyAvKiBlYXggPSBsY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovCi0Jam1wCUxfZG9sZW4KLQotQUxJR04gNAotTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDoKLQl0ZXN0CWFsLCA2NAotCWpueglMX2ludmFsaWRfZGlzdGFuY2VfY29kZSA7IC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KLQotCXhvcgllYXgsIGVheAotCWluYwllYXgKLQlzaGwJZWF4LCBjbAotCWRlYwllYXgKLQlhbmQJZWF4LCBlZHggICAgICAgICA7IC8qIGVheCAmPSBob2xkICovCi0JYWRkCWVheCwgcjE1ZCAgICAgICAgOyAvKiBlYXggKz0gZGlzdCAqLwotCW1vdgllYXgsIFtyMTErcmF4KjRdIDsgLyogZWF4ID0gZGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLwotCWptcAlMX2RvZGlzdAotCi1BTElHTiA0Ci1MX2NsaXBfd2luZG93OgotCW1vdgllY3gsIGVheCAgICAgICAgIDsgLyogZWN4ID0gbmJ5dGVzICovCi0JbW92CWVheCwgW3JzcCs5Ml0gICAgIDsgLyogZWF4ID0gd3NpemUsIHByZXBhcmUgZm9yIGRpc3QgY21wICovCi0JbmVnCWVjeCAgICAgICAgICAgICAgICA7IC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8KLQotCWNtcAllYXgsIHIxNWQKLQlqYglMX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhciA7IC8qIGlmIChkaXN0ID4gd3NpemUpICovCi0KLQlhZGQJZWN4LCByMTVkICAgICAgICAgOyAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCi0JY21wCWR3b3JkIHB0ciBbcnNwKzk2XSwgMAotCWpuZQlMX3dyYXBfYXJvdW5kX3dpbmRvdyA7IC8qIGlmICh3cml0ZSAhPSAwKSAqLwotCi0JbW92CXJzaSwgW3JzcCs1Nl0gICAgIDsgLyogZnJvbSAgPSB3aW5kb3cgKi8KLQlzdWIJZWF4LCBlY3ggICAgICAgICA7IC8qIGVheCAgLT0gbmJ5dGVzICovCi0JYWRkCXJzaSwgcmF4ICAgICAgICAgOyAvKiBmcm9tICs9IHdzaXplIC0gbmJ5dGVzICovCi0KLQltb3YJZWF4LCByMTRkICAgICAgICA7IC8qIGVheCA9IGxlbiAqLwotCWNtcAlyMTRkLCBlY3gKLQlqYmUJTF9kb19jb3B5ICAgICAgICAgICA7IC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0Jc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBlYXggLT0gbmJ5dGVzICovCi0JcmVwICAgICBtb3ZzYgotCW1vdglyc2ksIHJkaQotCXN1Yglyc2ksIHIxNSAgICAgICAgIDsgLyogZnJvbSA9ICZvdXRbIC1kaXN0IF0gKi8KLQlqbXAJTF9kb19jb3B5Ci0KLUFMSUdOIDQKLUxfd3JhcF9hcm91bmRfd2luZG93OgotCW1vdgllYXgsIFtyc3ArOTZdICAgICA7IC8qIGVheCA9IHdyaXRlICovCi0JY21wCWVjeCwgZWF4Ci0JamJlCUxfY29udGlndW91c19pbl93aW5kb3cgOyAvKiBpZiAod3JpdGUgPj0gbmJ5dGVzKSAqLwotCi0JbW92CWVzaSwgW3JzcCs5Ml0gICAgIDsgLyogZnJvbSAgPSB3c2l6ZSAqLwotCWFkZAlyc2ksIFtyc3ArNTZdICAgICA7IC8qIGZyb20gKz0gd2luZG93ICovCi0JYWRkCXJzaSwgcmF4ICAgICAgICAgOyAvKiBmcm9tICs9IHdyaXRlICovCi0Jc3ViCXJzaSwgcmN4ICAgICAgICAgOyAvKiBmcm9tIC09IG5ieXRlcyAqLwotCXN1YgllY3gsIGVheCAgICAgICAgIDsgLyogbmJ5dGVzIC09IHdyaXRlICovCi0KLQltb3YJZWF4LCByMTRkICAgICAgICA7IC8qIGVheCA9IGxlbiAqLwotCWNtcAllYXgsIGVjeAotCWpiZQlMX2RvX2NvcHkgICAgICAgICAgIDsgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCi0KLQlzdWIJZWF4LCBlY3ggICAgICAgICA7IC8qIGxlbiAtPSBuYnl0ZXMgKi8KLQlyZXAgICAgIG1vdnNiCi0JbW92CXJzaSwgW3JzcCs1Nl0gICAgIDsgLyogZnJvbSA9IHdpbmRvdyAqLwotCW1vdgllY3gsIFtyc3ArOTZdICAgICA7IC8qIG5ieXRlcyA9IHdyaXRlICovCi0JY21wCWVheCwgZWN4Ci0JamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KLQotCXN1YgllYXgsIGVjeCAgICAgICAgIDsgLyogbGVuIC09IG5ieXRlcyAqLwotCXJlcCAgICAgbW92c2IKLQltb3YJcnNpLCByZGkKLQlzdWIJcnNpLCByMTUgICAgICAgICA7IC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCi0Jam1wCUxfZG9fY29weQotCi1BTElHTiA0Ci1MX2NvbnRpZ3VvdXNfaW5fd2luZG93OgotCW1vdglyc2ksIFtyc3ArNTZdICAgICA7IC8qIHJzaSA9IHdpbmRvdyAqLwotCWFkZAlyc2ksIHJheAotCXN1Yglyc2ksIHJjeCAgICAgICAgIDsgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLwotCi0JbW92CWVheCwgcjE0ZCAgICAgICAgOyAvKiBlYXggPSBsZW4gKi8KLQljbXAJZWF4LCBlY3gKLQlqYmUJTF9kb19jb3B5ICAgICAgICAgICA7IC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi0Jc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBsZW4gLT0gbmJ5dGVzICovCi0JcmVwICAgICBtb3ZzYgotCW1vdglyc2ksIHJkaQotCXN1Yglyc2ksIHIxNSAgICAgICAgIDsgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KLQlqbXAJTF9kb19jb3B5ICAgICAgICAgICA7IC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLwotCi1BTElHTiA0Ci1MX2RvX2NvcHk6Ci0JbW92CWVjeCwgZWF4ICAgICAgICAgOyAvKiBlY3ggPSBsZW4gKi8KLQlyZXAgICAgIG1vdnNiCi0KLQltb3YJcnNpLCByOCAgICAgICAgICA7IC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KLQlqbXAJTF93aGlsZV90ZXN0Ci0KLUxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrOgotCXRlc3QJYWwsIDMyCi0JanoJTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGUKLQltb3YJZHdvcmQgcHRyIFtyc3ArMTE2XSwgMQotCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMKLQotTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6Ci0JbW92CWR3b3JkIHB0ciBbcnNwKzExNl0sIDIKLQlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzCi0KLUxfaW52YWxpZF9kaXN0YW5jZV9jb2RlOgotCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCAzCi0Jam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cwotCi1MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjoKLQltb3YJZHdvcmQgcHRyIFtyc3ArMTE2XSwgNAotCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMKLQotTF9icmVha19sb29wOgotCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCAwCi0KLUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1czoKLTsgLyogcHV0IGluLCBvdXQsIGJpdHMsIGFuZCBob2xkIGJhY2sgaW50byBhciBhbmQgcG9wIGVzcCAqLwotCW1vdglbcnNwKzE2XSwgcnNpICAgICA7IC8qIGluICovCi0JbW92CVtyc3ArMzJdLCByZGkgICAgIDsgLyogb3V0ICovCi0JbW92CVtyc3ArODhdLCBlYnggICAgIDsgLyogYml0cyAqLwotCW1vdglbcnNwKzgwXSwgcmR4ICAgICA7IC8qIGhvbGQgKi8KLQotCW1vdglyYXgsIFtyc3BdICAgICAgIDsgLyogcmVzdG9yZSByYnAgYW5kIHJzcCAqLwotCW1vdglyYnAsIFtyc3ArOF0KLQltb3YJcnNwLCByYXgKLQotCi0KLQltb3YgcnNpLFtyc3AtOF0KLQltb3YgcmRpLFtyc3AtMTZdCi0JbW92IHIxMixbcnNwLTI0XQotCW1vdiByMTMsW3JzcC0zMl0KLQltb3YgcjE0LFtyc3AtNDBdCi0JbW92IHIxNSxbcnNwLTQ4XQotCW1vdiByYngsW3JzcC01Nl0KLQkKLSAgICByZXQgMAotOyAgICAgICAgICA6Ci07ICAgICAgICAgIDogIm0iIChhcikKLTsgICAgICAgICAgOiAibWVtb3J5IiwgIiVyYXgiLCAiJXJieCIsICIlcmN4IiwgIiVyZHgiLCAiJXJzaSIsICIlcmRpIiwKLTsgICAgICAgICAgICAiJXI4IiwgIiVyOSIsICIlcjEwIiwgIiVyMTEiLCAiJXIxMiIsICIlcjEzIiwgIiVyMTQiLCAiJXIxNSIKLTsgICAgKTsKLQotaW5mZmFzODY2NGZuYyAJRU5EUAotO19URVhUCUVORFMKLUVORApkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvbWFzbXg2NC9pbmZmYXN4NjQub2JqIGIvbGlicy96bGliL2NvbnRyaWIvbWFzbXg2NC9pbmZmYXN4NjQub2JqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGY1ZDgyLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21hc214NjQvaW5mZmFzeDY0Lm9iagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21hc214NjQvcmVhZG1lLnR4dCBiL2xpYnMvemxpYi9jb250cmliL21hc214NjQvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzYzBmNy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9tYXNteDY0L3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1TdW1tYXJ5Ci0tLS0tLS0tCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBBU00gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmdW5jdGlvbnMKLWxvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCksIGZvciA2NCBiaXRzIHg4NiAoYm90aCBBTUQ2NCBhbmQgSW50ZWwgRU02NHQpLAotZm9yIHVzZSB3aXRoIE1pY3Jvc29mdCBNYWNybyBBc3NlbWJsZXIgKHg2NCkgZm9yIEFNRDY0IGFuZCBNaWNyb3NvZnQgQysrIDY0IGJpdHMuCi0KLWd2bWF0NjQuYXNtIGlzIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQgKDIwMDUpLCBieSB1c2luZyBCcmlhbiBSYWl0ZXIgNjg2LzMyIGJpdHMKLSAgIGFzc2VtYmx5IG9wdGltaXplZCB2ZXJzaW9uIGZyb20gSmVhbi1sb3VwIEdhaWxseSBvcmlnaW5hbCBsb25nZXN0X21hdGNoIGZ1bmN0aW9uCi0KLWluZmZhc3g2NC5hc20gYW5kIGluZmZhczg2NjQuYyB3ZXJlIHdyaXR0ZW4gYnkgQ2hyaXMgQW5kZXJzb24sIGJ5IG9wdGltaXppbmcKLSAgIG9yaWdpbmFsIGZ1bmN0aW9uIGZyb20gTWFyayBBZGxlcgotCi1Vc2UgaW5zdHJ1Y3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5IHRoZXNlIGZpbGVzIGludG8gdGhlIHpsaWIgc291cmNlIGRpcmVjdG9yeS4KLQotZGVmaW5lIEFTTVYgYW5kIEFTTUlORiBpbiB5b3VyIHByb2plY3QuIEluY2x1ZGUgaW5mZmFzODY2NC5jIGluIHlvdXIgc291cmNlIHRyZWUsCi1hbmQgaW5mZmFzeDY0Lm9iaiBhbmQgZ3ZtYXQ2NC5vYmogYXMgb2JqZWN0IHRvIGxpbmsuCi0KLQotQnVpbGQgaW5zdHJ1Y3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0KLXJ1biBibGRfNjQuYmF0IHdpdGggTWljcm9zb2Z0IE1hY3JvIEFzc2VtYmxlciAoeDY0KSBmb3IgQU1ENjQgKG1sNjQuZXhlKQotCi1tbDY0LmV4ZSBpcyBnaXZlbiB3aXRoIFZpc3VhbCBTdHVkaW8gMjAwNSwgV2luZG93cyAyMDAzIHNlcnZlciBEREsKLQotWW91IGNhbiBnZXQgV2luZG93cyAyMDAzIHNlcnZlciBEREsgd2l0aCBtbDY0IGFuZCBjbCBmb3IgQU1ENjQgZnJvbSAKLSAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvZGV2dG9vbHMvZGRrL2RlZmF1bHQubXNweCBmb3IgbG93IHByaWNlKQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvbWFzbXg4Ni9ibGRfbWwzMi5iYXQgYi9saWJzL3psaWIvY29udHJpYi9tYXNteDg2L2JsZF9tbDMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkNDQ3ZS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9tYXNteDg2L2JsZF9tbDMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotbWwgL2NvZmYgL1ppIC9jIC9GbGd2bWF0MzIubHN0ICBndm1hdDMyLmFzbSAKLW1sIC9jb2ZmIC9aaSAvYyAvRmxpbmZmYXMzMi5sc3QgaW5mZmFzMzIuYXNtIApkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvbWFzbXg4Ni9ndm1hdDMyLmFzbSBiL2xpYnMvemxpYi9jb250cmliL21hc214ODYvZ3ZtYXQzMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNGY4NTQuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvbWFzbXg4Ni9ndm1hdDMyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDk3MiArMCwwIEBACi07IGd2bWF0MzIuYXNtIC0tIEFzbSBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODYKLTsgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgSmVhbi1sb3VwIEdhaWxseSBhbmQgR2lsbGVzIFZvbGxhbnQuCi07IEZpbGUgd3JpdHRlbiBieSBHaWxsZXMgVm9sbGFudCwgYnkgbW9kaWZpeWluZyB0aGUgbG9uZ2VzdF9tYXRjaAotOyAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYwotOwotOyAgICAgICAgIGh0dHA6Ly93d3cuemxpYi5uZXQKLTsgICAgICAgICBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsCi07ICAgICAgICAgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAotOwotOyBGb3IgVmlzdWFsIEMrKyA0LnggYW5kIGhpZ2hlciBhbmQgTUwgNi54IGFuZCBoaWdoZXIKLTsgICBtbC5leGUgaXMgaW4gZGlyZWN0b3J5IFxNQVNNNjExQyBvZiBXaW45NSBEREsKLTsgICBtbC5leGUgaXMgYWxzbyBkaXN0cmlidXRlZCBpbiBodHRwOi8vd3d3Lm1hc20zMi5jb20vbWFzbWRsLmh0bQotOyAgICBhbmQgaW4gVkMrKzIwMDMgdG9vbGtpdCBhdCBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL3Zpc3VhbGMvdmN0b29sa2l0MjAwMy8KLTsKLTsgdGhpcyBmaWxlIGNvbnRhaW4gdHdvIGltcGxlbWVudGF0aW9uIG9mIGxvbmdlc3RfbWF0Y2gKLTsKLTsgIGxvbmdlc3RfbWF0Y2hfN2ZmZiA6IHdyaXR0ZW4gMTk5NiBieSBHaWxsZXMgVm9sbGFudCBvcHRpbWl6ZWQgZm9yIAotOyAgICAgICAgICAgIGZpcnN0IFBlbnRpdW0uIEFzc3VtZSBzLT53X21hc2sgPT0gMHg3ZmZmCi07ICBsb25nZXN0X21hdGNoXzY4NiA6IHdyaXR0ZW4gYnkgQnJpYW4gcmFpdGVyICgxOTk4KSwgb3B0aW1pemVkIGZvciBQZW50aXVtIFBybwotOwotOyAgZm9yIHVzaW5nIGFuIHNlZW1ibHkgdmVyc2lvbiBvZiBsb25nZXN0X21hdGNoLCB5b3UgbmVlZCBkZWZpbmUgQVNNViBpbiBwcm9qZWN0Ci07ICBUaGVyZSBpcyB0d28gd2F5IGluIHVzaW5nIGd2bWF0MzIuYXNtCi07Ci07ICBBKSBTdWdnZXN0ZWQgbWV0aG9kCi07ICAgIGlmIHlvdSB3YW50IGluY2x1ZGUgYm90aCBsb25nZXN0X21hdGNoXzdmZmYgYW5kIGxvbmdlc3RfbWF0Y2hfNjg2Ci07ICAgIGNvbXBpbGUgdGhlIGFzbSBmaWxlIHJ1bm5pbmcKLTsgICAgICAgICAgIG1sIC9jb2ZmIC9aaSAvRmxndm1hdDMyLmxzdCAvYyBndm1hdDMyLmFzbQotOyAgICBhbmQgaW5jbHVkZSBndm1hdDMyYy5jIGluIHlvdXIgcHJvamVjdAotOyAgICBpZiB5b3UgaGF2ZSBhbiBvbGQgY3B1ICgzODYsNDg2IG9yIGZpcnN0IFBlbnRpdW0pIGFuZCBzLT53X21hc2s9PTB4N2ZmZiwKLTsgICAgICAgIGxvbmdlc3RfbWF0Y2hfN2ZmZiB3aWxsIGJlIHVzZWQKLTsgICAgaWYgeW91IGhhdmUgYSBtb3JlIG1vZGVybiBDUFUgKFBlbnRpdW0gUHJvLCBJSSBhbmQgaGlnaGVyKQotOyAgICAgICAgbG9uZ2VzdF9tYXRjaF82ODYgd2lsbCBiZSB1c2VkCi07ICAgIG9uIG9sZCBjcHUgd2l0aCBzLT53X21hc2shPTB4N2ZmZiwgbG9uZ2VzdF9tYXRjaF82ODYgd2lsbCBiZSB1c2VkLAotOyAgICAgICAgYnV0IHRoaXMgaXMgbm90IGEgc2l0YXRpb24geW91J2xsIGZpbmQgb2Z0ZW4KLTsKLTsgIEIpIEFsdGVybmF0aXZlCi07ICAgIGlmIHlvdSBhcmUgbm90IGludGVycmVzZWQgaW4gb2xkIGNwdSBwZXJmb3JtYW5jZSBhbmQgd2FudCB0aGUgc21hbGxlcgotOyAgICAgICBiaW5hcmllcyBwb3NzaWJsZQotOwotOyAgICBjb21waWxlIHRoZSBhc20gZmlsZSBydW5uaW5nCi07ICAgICAgICAgICBtbCAvY29mZiAvWmkgL2MgL0ZsZ3ZtYXQzMi5sc3QgL0ROT09MRFBFTlRJVU1DT0RFIGd2bWF0MzIuYXNtCi07ICAgIGFuZCBkbyBub3QgaW5jbHVkZSBndm1hdDMyYy5jIGluIHlvdXIgcHJvamVjdCAob3UgZGVmaW5lIGFsc28gCi07ICAgICAgICAgICAgICBOT09MRFBFTlRJVU1DT0RFKQotOwotOyBub3RlIDogYXMgSSBrbm93biwgbG9uZ2VzdF9tYXRjaF82ODYgaXMgdmVyeSBmYXN0ZXIgdGhhbiBsb25nZXN0X21hdGNoXzdmZmYKLTsgICAgICAgIG9uIHBlbnRpdW0gUHJvL0lJL0lJSSwgZmFzdGVyIChidXQgbGVzcykgaW4gUDQsIGJ1dCBpdCBzZWVtCi07ICAgICAgICBsb25nZXN0X21hdGNoXzdmZmYgY2FuIGJlIGZhc3RlciAodmVyeSB2ZXJ5IGxpdHRlKSBvbiBBTUQgQXRobG9uNjQvSzgKLTsKLTsgc2VlIGJlbG93IDogemxpYjEyMjJhZGQgbXVzdCBiZSBhZGp1c3RlciBpZiB5b3UgdXNlIGEgemxpYiB2ZXJzaW9uIDwgMS4yLjIuMgotCi07dUludCBsb25nZXN0X21hdGNoXzdmZmYocywgY3VyX21hdGNoKQotOyAgICBkZWZsYXRlX3N0YXRlICpzOwotOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLQotICAgIE5iU3RhY2sgICAgICAgICBlcXUgICAgIDc2Ci0gICAgY3VyX21hdGNoICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTBdCi0gICAgc3RyX3MgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTRdCi07IDUgZHdvcmQgb24gdG9wIChyZXQsZWJwLGVzaSxlZGksZWJ4KQotICAgIGFkcnJldCAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay04XQotICAgIHB1c2hlYnAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0xMl0KLSAgICBwdXNoZWRpICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMTZdCi0gICAgcHVzaGVzaSAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTIwXQotICAgIHB1c2hlYnggICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0yNF0KLQotICAgIGNoYWluX2xlbmd0aCAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMjhdCi0gICAgbGltaXQgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay0zMl0KLSAgICBiZXN0X2xlbiAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTM2XQotICAgIHdpbmRvdyAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDBdCi0gICAgcHJldiAgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay00NF0KLSAgICBzY2FuX3N0YXJ0ICAgICAgZXF1ICAgICAgd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQ4XQotICAgIHdtYXNrICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTJdCi0gICAgbWF0Y2hfc3RhcnRfcHRyIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay01Nl0KLSAgICBuaWNlX21hdGNoICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTYwXQotICAgIHNjYW4gICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjRdCi0KLSAgICB3aW5kb3dsZW4gICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTY4XQotICAgIG1hdGNoX3N0YXJ0ICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNzJdCi0gICAgc3RyZW5kICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay03Nl0KLSAgICBOYlN0YWNrQWRkICAgICAgZXF1ICAgICAoTmJTdGFjay0yNCkKLQotICAgIC4zODZwCi0KLSAgICBuYW1lICAgIGd2bWF0Y2gKLSAgICAuTU9ERUwgIEZMQVQKLQotCi0KLTsgIGFsbCB0aGUgK3psaWIxMjIyYWRkIG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgZmllbGRzCi07ICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4KLTsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHVzZSAiemxpYjEyMjJhZGQgZXF1ICgtNCkiKS4KLTsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgYmV0d2VlbiAxLjAuNSBhbmQgMS4yLjIuMSwgdXNlICJ6bGliMTIyMmFkZCBlcXUgMCIpLgotOyAgaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuCi0KLSAgICB6bGliMTIyMmFkZCAgICAgICAgIGVxdSAgICAgOAotCi07ICBOb3RlIDogdGhlc2UgdmFsdWUgYXJlIGdvb2Qgd2l0aCBhIDggYnl0ZXMgYm91bmRhcnkgcGFjayBzdHJ1Y3R1cmUKLSAgICBkZXBfY2hhaW5fbGVuZ3RoICAgIGVxdSAgICAgNzRoK3psaWIxMjIyYWRkCi0gICAgZGVwX3dpbmRvdyAgICAgICAgICBlcXUgICAgIDMwaCt6bGliMTIyMmFkZAotICAgIGRlcF9zdHJzdGFydCAgICAgICAgZXF1ICAgICA2NGgremxpYjEyMjJhZGQKLSAgICBkZXBfcHJldl9sZW5ndGggICAgIGVxdSAgICAgNzBoK3psaWIxMjIyYWRkCi0gICAgZGVwX25pY2VfbWF0Y2ggICAgICBlcXUgICAgIDg4aCt6bGliMTIyMmFkZAotICAgIGRlcF93X3NpemUgICAgICAgICAgZXF1ICAgICAyNGgremxpYjEyMjJhZGQKLSAgICBkZXBfcHJldiAgICAgICAgICAgIGVxdSAgICAgMzhoK3psaWIxMjIyYWRkCi0gICAgZGVwX3dfbWFzayAgICAgICAgICBlcXUgICAgIDJjaCt6bGliMTIyMmFkZAotICAgIGRlcF9nb29kX21hdGNoICAgICAgZXF1ICAgICA4NGgremxpYjEyMjJhZGQKLSAgICBkZXBfbWF0Y2hfc3RhcnQgICAgIGVxdSAgICAgNjhoK3psaWIxMjIyYWRkCi0gICAgZGVwX2xvb2thaGVhZCAgICAgICBlcXUgICAgIDZjaCt6bGliMTIyMmFkZAotCi0KLV9URVhUICAgICAgICAgICAgICAgICAgIHNlZ21lbnQKLQotSUZERUYgTk9VTkRFUkxJTkUKLSAgIElGREVGIE5PT0xEUEVOVElVTUNPREUKLSAgICAgICAgICAgIHB1YmxpYyAgbG9uZ2VzdF9tYXRjaAotICAgICAgICAgICAgcHVibGljICBtYXRjaF9pbml0Ci0gICBFTFNFICAgICAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgIGxvbmdlc3RfbWF0Y2hfN2ZmZgotICAgICAgICAgICAgcHVibGljICBjcHVkZXRlY3QzMgotICAgICAgICAgICAgcHVibGljICBsb25nZXN0X21hdGNoXzY4NgotICAgRU5ESUYKLUVMU0UKLSAgIElGREVGIE5PT0xEUEVOVElVTUNPREUKLSAgICAgICAgICAgIHB1YmxpYyAgX2xvbmdlc3RfbWF0Y2gKLSAgICAgICAgICAgIHB1YmxpYyAgX21hdGNoX2luaXQKLSAgIEVMU0UKLSAgICAgICAgICAgIHB1YmxpYyAgX2xvbmdlc3RfbWF0Y2hfN2ZmZgotICAgICAgICAgICAgcHVibGljICBfY3B1ZGV0ZWN0MzIKLSAgICAgICAgICAgIHB1YmxpYyAgX2xvbmdlc3RfbWF0Y2hfNjg2Ci0gICBFTkRJRgotRU5ESUYKLQotICAgIE1BWF9NQVRDSCAgICAgICAgICAgZXF1ICAgICAyNTgKLSAgICBNSU5fTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMwotICAgIE1JTl9MT09LQUhFQUQgICAgICAgZXF1ICAgICAoTUFYX01BVENIK01JTl9NQVRDSCsxKQotCi0KLQotSUZOREVGIE5PT0xEUEVOVElVTUNPREUKLUlGREVGIE5PVU5ERVJMSU5FCi1sb25nZXN0X21hdGNoXzdmZmYgICBwcm9jIG5lYXIKLUVMU0UKLV9sb25nZXN0X21hdGNoXzdmZmYgIHByb2MgbmVhcgotRU5ESUYKLQotICAgIG1vdiAgICAgZWR4LFtlc3ArNF0KLQotCi0KLSAgICBwdXNoICAgIGVicAotICAgIHB1c2ggICAgZWRpCi0gICAgcHVzaCAgICBlc2kKLSAgICBwdXNoICAgIGVieAotCi0gICAgc3ViICAgICBlc3AsTmJTdGFja0FkZAotCi07IGluaXRpYWxpemUgb3IgY2hlY2sgdGhlIHZhcmlhYmxlcyB1c2VkIGluIG1hdGNoLmFzbS4KLSAgICBtb3YgICAgIGVicCxlZHgKLQotOyBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoCi07IGlmIChwcmV2X2xlbmd0aD49Z29vZF9tYXRjaCkgY2hhaW5fbGVuZ3RoID4+PSAyCi0gICAgbW92ICAgICBlZHgsW2VicCtkZXBfY2hhaW5fbGVuZ3RoXQotICAgIG1vdiAgICAgZWJ4LFtlYnArZGVwX3ByZXZfbGVuZ3RoXQotICAgIGNtcCAgICAgW2VicCtkZXBfZ29vZF9tYXRjaF0sZWJ4Ci0gICAgamEgICAgICBub3NocgotICAgIHNociAgICAgZWR4LDIKLW5vc2hyOgotOyB3ZSBpbmNyZW1lbnQgY2hhaW5fbGVuZ3RoIGJlY2F1c2UgaW4gdGhlIGFzbSwgdGhlIC0tY2hhaW5fbGVuZ2h0IGlzIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3AKLSAgICBpbmMgICAgIGVkeAotICAgIG1vdiAgICAgZWRpLFtlYnArZGVwX25pY2VfbWF0Y2hdCi0gICAgbW92ICAgICBjaGFpbl9sZW5ndGgsZWR4Ci0gICAgbW92ICAgICBlYXgsW2VicCtkZXBfbG9va2FoZWFkXQotICAgIGNtcCAgICAgZWF4LGVkaQotOyBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsKLSAgICBqYWUgICAgIG5vbG9va2FoZWFkbmljZW1hdGNoCi0gICAgbW92ICAgICBlZGksZWF4Ci1ub2xvb2thaGVhZG5pY2VtYXRjaDoKLTsgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aAotICAgIG1vdiAgICAgYmVzdF9sZW4sZWJ4Ci0KLTsgd2luZG93ID0gcy0+d2luZG93Ci0gICAgbW92ICAgICBlc2ksW2VicCtkZXBfd2luZG93XQotICAgIG1vdiAgICAgZWN4LFtlYnArZGVwX3N0cnN0YXJ0XQotICAgIG1vdiAgICAgd2luZG93LGVzaQotCi0gICAgbW92ICAgICBuaWNlX21hdGNoLGVkaQotOyBzY2FuID0gd2luZG93ICsgc3Ryc3RhcnQKLSAgICBhZGQgICAgIGVzaSxlY3gKLSAgICBtb3YgICAgIHNjYW4sZXNpCi07IGR4ID0gKndpbmRvdwotICAgIG1vdiAgICAgZHgsd29yZCBwdHIgW2VzaV0KLTsgYnggPSAqKHdpbmRvdytiZXN0X2xlbi0xKQotICAgIG1vdiAgICAgYngsd29yZCBwdHIgW2VzaStlYngtMV0KLSAgICBhZGQgICAgIGVzaSxNQVhfTUFUQ0gtMQotOyBzY2FuX3N0YXJ0ID0gKnNjYW4KLSAgICBtb3YgICAgIHNjYW5fc3RhcnQsZHgKLTsgc3RyZW5kID0gc2NhbiArIE1BWF9NQVRDSC0xCi0gICAgbW92ICAgICBzdHJlbmQsZXNpCi07IGJ4ID0gc2Nhbl9lbmQgPSAqKHdpbmRvdytiZXN0X2xlbi0xKQotCi07ICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8KLTsgICAgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7Ci0KLSAgICBtb3YgICAgIGVzaSxbZWJwK2RlcF93X3NpemVdCi0gICAgc3ViICAgICBlc2ksTUlOX0xPT0tBSEVBRAotOyBoZXJlIGVzaSA9IE1BWF9ESVNUKHMpCi0gICAgc3ViICAgICBlY3gsZXNpCi0gICAgamEgICAgICBub2Rpc3QKLSAgICB4b3IgICAgIGVjeCxlY3gKLW5vZGlzdDoKLSAgICBtb3YgICAgIGxpbWl0LGVjeAotCi07IHByZXYgPSBzLT5wcmV2Ci0gICAgbW92ICAgICBlZHgsW2VicCtkZXBfcHJldl0KLSAgICBtb3YgICAgIHByZXYsZWR4Ci0KLTsKLSAgICBtb3YgICAgIGVkeCxkd29yZCBwdHIgW2VicCtkZXBfbWF0Y2hfc3RhcnRdCi0gICAgbW92ICAgICBicCxzY2FuX3N0YXJ0Ci0gICAgbW92ICAgICBlYXgsY3VyX21hdGNoCi0gICAgbW92ICAgICBtYXRjaF9zdGFydCxlZHgKLQotICAgIG1vdiAgICAgZWR4LHdpbmRvdwotICAgIG1vdiAgICAgZWRpLGVkeAotICAgIGFkZCAgICAgZWRpLGJlc3RfbGVuCi0gICAgbW92ICAgICBlc2kscHJldgotICAgIGRlYyAgICAgZWRpCi07IHdpbmRvd2xlbiA9IHdpbmRvdyArIGJlc3RfbGVuIC0xCi0gICAgbW92ICAgICB3aW5kb3dsZW4sZWRpCi0KLSAgICBqbXAgICAgIGJlZ2lubG9vcDIKLSAgICBhbGlnbiAgIDQKLQotOyBoZXJlLCBpbiB0aGUgbG9vcAotOyAgICAgICBlYXggPSBheCA9IGN1cl9tYXRjaAotOyAgICAgICBlY3ggPSBsaW1pdAotOyAgICAgICAgYnggPSBzY2FuX2VuZAotOyAgICAgICAgYnAgPSBzY2FuX3N0YXJ0Ci07ICAgICAgIGVkaSA9IHdpbmRvd2xlbiAod2luZG93ICsgYmVzdF9sZW4gLTEpCi07ICAgICAgIGVzaSA9IHByZXYKLQotCi07Ly8gaGVyZTsgY2hhaW5fbGVuZ3RoIDw9MTYKLW5vcm1hbGJlZzBhZGQxNjoKLSAgICBhZGQgICAgIGNoYWluX2xlbmd0aCwxNgotICAgIGp6ICAgICAgZXhpdGxvb3AKLW5vcm1hbGJlZzA6Ci0gICAgY21wICAgICB3b3JkIHB0cltlZGkrZWF4XSxieAotICAgIGplICAgICAgbm9ybWFsYmVnMm5vcm9sbAotcmNvbnRsYWJub3JvbGw6Ci07IGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdCi0gICAgYW5kICAgICBlYXgsN2ZmZmgKLSAgICBtb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0KLTsgaWYgY3VyX21hdGNoID4gbGltaXQsIGdvIHRvIGV4aXRsb29wCi0gICAgY21wICAgICBlY3gsZWF4Ci0gICAgam5iICAgICBleGl0bG9vcAotOyBpZiAtLWNoYWluX2xlbmd0aCAhPSAwLCBnbyB0byBleGl0bG9vcAotICAgIGRlYyAgICAgY2hhaW5fbGVuZ3RoCi0gICAgam56ICAgICBub3JtYWxiZWcwCi0gICAgam1wICAgICBleGl0bG9vcAotCi1ub3JtYWxiZWcybm9yb2xsOgotOyBpZiAoc2Nhbl9zdGFydD09KihjdXJfbWF0Y2grd2luZG93KSkgZ290byBub3JtYWxiZWcyCi0gICAgY21wICAgICBicCx3b3JkIHB0cltlZHgrZWF4XQotICAgIGpuZSAgICAgcmNvbnRsYWJub3JvbGwKLSAgICBqbXAgICAgIG5vcm1hbGJlZzIKLQotY29udGxvb3AzOgotICAgIG1vdiAgICAgZWRpLHdpbmRvd2xlbgotCi07IGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdCi0gICAgYW5kICAgICBlYXgsN2ZmZmgKLSAgICBtb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0KLTsgaWYgY3VyX21hdGNoID4gbGltaXQsIGdvIHRvIGV4aXRsb29wCi0gICAgY21wICAgICBlY3gsZWF4Ci1qbmJleGl0bG9vcHNob3J0MToKLSAgICBqbmIgICAgIGV4aXRsb29wCi07IGlmIC0tY2hhaW5fbGVuZ3RoICE9IDAsIGdvIHRvIGV4aXRsb29wCi0KLQotOyBiZWdpbiB0aGUgbWFpbiBsb29wCi1iZWdpbmxvb3AyOgotICAgIHN1YiAgICAgY2hhaW5fbGVuZ3RoLDE2KzEKLTsgaWYgY2hhaW5fbGVuZ3RoIDw9MTYsIGRvbid0IHVzZSB0aGUgdW5yb2xsZWQgbG9vcAotICAgIGpuYSAgICAgbm9ybWFsYmVnMGFkZDE2Ci0KLWRvMTY6Ci0gICAgY21wICAgICB3b3JkIHB0cltlZGkrZWF4XSxieAotICAgIGplICAgICAgbm9ybWFsYmVnMmRjMAotCi1tYWNjbiAgIE1BQ1JPICAgbGFiCi0gICAgYW5kICAgICBlYXgsN2ZmZmgKLSAgICBtb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0KLSAgICBjbXAgICAgIGVjeCxlYXgKLSAgICBqbmIgICAgIGV4aXRsb29wCi0gICAgY21wICAgICB3b3JkIHB0cltlZGkrZWF4XSxieAotICAgIGplICAgICAgbGFiCi0gICAgRU5ETQotCi1yY29udGxvb3AwOgotICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjMQotCi1yY29udGxvb3AxOgotICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjMgotCi1yY29udGxvb3AyOgotICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjMwotCi1yY29udGxvb3AzOgotICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjNAotCi1yY29udGxvb3A0OgotICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjNQotCi1yY29udGxvb3A1OgotICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjNgotCi1yY29udGxvb3A2OgotICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjNwotCi1yY29udGxvb3A3OgotICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjOAotCi1yY29udGxvb3A4OgotICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjOQotCi1yY29udGxvb3A5OgotICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjMTAKLQotcmNvbnRsb29wMTA6Ci0gICAgbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxMQotCi1yY29udGxvb3AxMToKLSAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzEyCi0KLXJjb250bG9vcDEyOgotICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTMKLQotcmNvbnRsb29wMTM6Ci0gICAgbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxNAotCi1yY29udGxvb3AxNDoKLSAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzE1Ci0KLXJjb250bG9vcDE1OgotICAgIGFuZCAgICAgZWF4LDdmZmZoCi0gICAgbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdCi0gICAgY21wICAgICBlY3gsZWF4Ci0gICAgam5iICAgICBleGl0bG9vcAotCi0gICAgc3ViICAgICBjaGFpbl9sZW5ndGgsMTYKLSAgICBqYSAgICAgIGRvMTYKLSAgICBqbXAgICAgIG5vcm1hbGJlZzBhZGQxNgotCi07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotCi1ub3JtYmVnIE1BQ1JPICAgcmNvbnRsYWIsdmFsc3ViCi07IGlmIHdlIGFyZSBoZXJlLCB3ZSBrbm93IHRoYXQgKihtYXRjaCtiZXN0X2xlbi0xKSA9PSBzY2FuX2VuZAotICAgIGNtcCAgICAgYnAsd29yZCBwdHJbZWR4K2VheF0KLTsgaWYgKG1hdGNoICE9IHNjYW5fc3RhcnQpIGdvdG8gcmNvbnRsYWIKLSAgICBqbmUgICAgIHJjb250bGFiCi07IGNhbGN1bGF0ZSB0aGUgZ29vZCBjaGFpbl9sZW5ndGgsIGFuZCB3ZSdsbCBjb21wYXJlIHNjYW4gYW5kIG1hdGNoIHN0cmluZwotICAgIGFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2LXZhbHN1YgotICAgIGptcCAgICAgaXNlcQotICAgIEVORE0KLQotCi1ub3JtYWxiZWcyZGMxMToKLSAgICBub3JtYmVnIHJjb250bG9vcDExLDExCi0KLW5vcm1hbGJlZzJkYzEyOgotICAgIG5vcm1iZWcgc2hvcnQgcmNvbnRsb29wMTIsMTIKLQotbm9ybWFsYmVnMmRjMTM6Ci0gICAgbm9ybWJlZyBzaG9ydCByY29udGxvb3AxMywxMwotCi1ub3JtYWxiZWcyZGMxNDoKLSAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDE0LDE0Ci0KLW5vcm1hbGJlZzJkYzE1OgotICAgIG5vcm1iZWcgc2hvcnQgcmNvbnRsb29wMTUsMTUKLQotbm9ybWFsYmVnMmRjMTA6Ci0gICAgbm9ybWJlZyByY29udGxvb3AxMCwxMAotCi1ub3JtYWxiZWcyZGM5OgotICAgIG5vcm1iZWcgcmNvbnRsb29wOSw5Ci0KLW5vcm1hbGJlZzJkYzg6Ci0gICAgbm9ybWJlZyByY29udGxvb3A4LDgKLQotbm9ybWFsYmVnMmRjNzoKLSAgICBub3JtYmVnIHJjb250bG9vcDcsNwotCi1ub3JtYWxiZWcyZGM2OgotICAgIG5vcm1iZWcgcmNvbnRsb29wNiw2Ci0KLW5vcm1hbGJlZzJkYzU6Ci0gICAgbm9ybWJlZyByY29udGxvb3A1LDUKLQotbm9ybWFsYmVnMmRjNDoKLSAgICBub3JtYmVnIHJjb250bG9vcDQsNAotCi1ub3JtYWxiZWcyZGMzOgotICAgIG5vcm1iZWcgcmNvbnRsb29wMywzCi0KLW5vcm1hbGJlZzJkYzI6Ci0gICAgbm9ybWJlZyByY29udGxvb3AyLDIKLQotbm9ybWFsYmVnMmRjMToKLSAgICBub3JtYmVnIHJjb250bG9vcDEsMQotCi1ub3JtYWxiZWcyZGMwOgotICAgIG5vcm1iZWcgcmNvbnRsb29wMCwwCi0KLQotOyB3ZSBnbyBpbiBub3JtYWxiZWcyIGJlY2F1c2UgKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgPT0gc2Nhbl9lbmQKLQotbm9ybWFsYmVnMjoKLSAgICBtb3YgICAgIGVkaSx3aW5kb3cKLQotICAgIGNtcCAgICAgYnAsd29yZCBwdHJbZWRpK2VheF0KLSAgICBqbmUgICAgIGNvbnRsb29wMyAgICAgICAgICAgICAgICAgICA7IGlmICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCwgY29udGludWUKLQotaXNlcToKLTsgaWYgd2UgYXJlIGhlcmUsIHdlIGtub3cgdGhhdCAqKG1hdGNoK2Jlc3RfbGVuLTEpID09IHNjYW5fZW5kCi07IGFuZCAobWF0Y2ggPT0gc2Nhbl9zdGFydCkKLQotICAgIG1vdiAgICAgZWRpLGVkeAotICAgIG1vdiAgICAgZXNpLHNjYW4gICAgICAgICAgICAgICAgICAgIDsgZXNpID0gc2NhbgotICAgIGFkZCAgICAgZWRpLGVheCAgICAgICAgICAgICAgICAgICAgIDsgZWRpID0gd2luZG93ICsgY3VyX21hdGNoID0gbWF0Y2gKLQotICAgIG1vdiAgICAgZWR4LFtlc2krM10gICAgICAgICAgICAgICAgIDsgY29tcGFyZSBtYW51YWxseSBkd29yZCBhdCBtYXRjaCszCi0gICAgeG9yICAgICBlZHgsW2VkaSszXSAgICAgICAgICAgICAgICAgOyBhbmQgc2NhbiArMwotCi0gICAganogICAgICBiZWdpbmNvbXBhcmUgICAgICAgICAgICAgICAgOyBpZiBlcXVhbCwgZ28gdG8gbG9uZyBjb21wYXJlCi0KLTsgd2Ugd2lsbCBkZXRlcm1pbmUgdGhlIHVubWF0Y2ggYnl0ZSBhbmQgY2FsY3VsYXRlIGxlbiAoaW4gZXNpKQotICAgIG9yICAgICAgZGwsZGwKLSAgICBqZSAgICAgIGVxMXJyCi0gICAgbW92ICAgICBlc2ksMwotICAgIGptcCAgICAgdHJmaW52YWwKLWVxMXJyOgotICAgIG9yICAgICAgZHgsZHgKLSAgICBqZSAgICAgIGVxMQotCi0gICAgbW92ICAgICBlc2ksNAotICAgIGptcCAgICAgdHJmaW52YWwKLWVxMToKLSAgICBhbmQgICAgIGVkeCwwZmZmZmZmaAotICAgIGp6ICAgICAgZXExMQotICAgIG1vdiAgICAgZXNpLDUKLSAgICBqbXAgICAgIHRyZmludmFsCi1lcTExOgotICAgIG1vdiAgICAgZXNpLDYKLSAgICBqbXAgICAgIHRyZmludmFsCi0KLWJlZ2luY29tcGFyZToKLSAgICA7IGhlcmUgd2Ugbm93IHNjYW4gYW5kIG1hdGNoIGJlZ2luIHNhbWUKLSAgICBhZGQgICAgIGVkaSw2Ci0gICAgYWRkICAgICBlc2ksNgotICAgIG1vdiAgICAgZWN4LChNQVhfTUFUQ0gtKDIrNCkpLzQgICAgIDsgc2NhbiBmb3IgYXQgbW9zdCBNQVhfTUFUQ0ggYnl0ZXMKLSAgICByZXBlICAgIGNtcHNkICAgICAgICAgICAgICAgICAgICAgICA7IGxvb3AgdW50aWwgbWlzbWF0Y2gKLQotICAgIGplICAgICAgdHJmaW4gICAgICAgICAgICAgICAgICAgICAgIDsgZ28gdG8gdHJmaW4gaWYgbm90IHVubWF0Y2gKLTsgd2UgZGV0ZXJtaW5lIHRoZSB1bm1hdGNoIGJ5dGUKLSAgICBzdWIgICAgIGVzaSw0Ci0gICAgbW92ICAgICBlZHgsW2VkaS00XQotICAgIHhvciAgICAgZWR4LFtlc2ldCi0KLSAgICBvciAgICAgIGRsLGRsCi0gICAgam56ICAgICB0cmZpbgotICAgIGluYyAgICAgZXNpCi0KLSAgICBvciAgICAgIGR4LGR4Ci0gICAgam56ICAgICB0cmZpbgotICAgIGluYyAgICAgZXNpCi0KLSAgICBhbmQgICAgIGVkeCwwZmZmZmZmaAotICAgIGpueiAgICAgdHJmaW4KLSAgICBpbmMgICAgIGVzaQotCi10cmZpbjoKLSAgICBzdWIgICAgIGVzaSxzY2FuICAgICAgICAgIDsgZXNpID0gbGVuCi10cmZpbnZhbDoKLTsgaGVyZSB3ZSBoYXZlIGZpbmlzZWQgY29tcGFyZSwgYW5kIGVzaSBjb250YWluIGxlbiBvZiBlcXVhbCBzdHJpbmcKLSAgICBjbXAgICAgIGVzaSxiZXN0X2xlbiAgICAgICAgOyBpZiBsZW4gPiBiZXN0X2xlbiwgZ28gbmV3YmVzdGxlbgotICAgIGphICAgICAgc2hvcnQgbmV3YmVzdGxlbgotOyBub3cgd2UgcmVzdG9yZSBlZHgsIGVjeCBhbmQgZXNpLCBmb3IgdGhlIGJpZyBsb29wCi0gICAgbW92ICAgICBlc2kscHJldgotICAgIG1vdiAgICAgZWN4LGxpbWl0Ci0gICAgbW92ICAgICBlZHgsd2luZG93Ci0gICAgam1wICAgICBjb250bG9vcDMKLQotbmV3YmVzdGxlbjoKLSAgICBtb3YgICAgIGJlc3RfbGVuLGVzaSAgICAgICAgOyBsZW4gYmVjb21lIGJlc3RfbGVuCi0KLSAgICBtb3YgICAgIG1hdGNoX3N0YXJ0LGVheCAgICAgOyBzYXZlIG5ldyBwb3NpdGlvbiBhcyBtYXRjaF9zdGFydAotICAgIGNtcCAgICAgZXNpLG5pY2VfbWF0Y2ggICAgICA7IGlmIGJlc3RfbGVuID49IG5pY2VfbWF0Y2gsIGV4aXQKLSAgICBqYWUgICAgIGV4aXRsb29wCi0gICAgbW92ICAgICBlY3gsc2NhbgotICAgIG1vdiAgICAgZWR4LHdpbmRvdyAgICAgICAgICA7IHJlc3RvcmUgZWR4PXdpbmRvdwotICAgIGFkZCAgICAgZWN4LGVzaQotICAgIGFkZCAgICAgZXNpLGVkeAotCi0gICAgZGVjICAgICBlc2kKLSAgICBtb3YgICAgIHdpbmRvd2xlbixlc2kgICAgICAgOyB3aW5kb3dsZW4gPSB3aW5kb3cgKyBiZXN0X2xlbi0xCi0gICAgbW92ICAgICBieCxbZWN4LTFdICAgICAgICAgIDsgYnggPSAqKHNjYW4rYmVzdF9sZW4tMSkgPSBzY2FuX2VuZAotCi07IG5vdyB3ZSByZXN0b3JlIGVjeCBhbmQgZXNpLCBmb3IgdGhlIGJpZyBsb29wIDoKLSAgICBtb3YgICAgIGVzaSxwcmV2Ci0gICAgbW92ICAgICBlY3gsbGltaXQKLSAgICBqbXAgICAgIGNvbnRsb29wMwotCi1leGl0bG9vcDoKLTsgZXhpdCA6IHMtPm1hdGNoX3N0YXJ0PW1hdGNoX3N0YXJ0Ci0gICAgbW92ICAgICBlYngsbWF0Y2hfc3RhcnQKLSAgICBtb3YgICAgIGVicCxzdHJfcwotICAgIG1vdiAgICAgZWN4LGJlc3RfbGVuCi0gICAgbW92ICAgICBkd29yZCBwdHIgW2VicCtkZXBfbWF0Y2hfc3RhcnRdLGVieAotICAgIG1vdiAgICAgZWF4LGR3b3JkIHB0ciBbZWJwK2RlcF9sb29rYWhlYWRdCi0gICAgY21wICAgICBlY3gsZWF4Ci0gICAgamEgICAgICBtaW5leGxvCi0gICAgbW92ICAgICBlYXgsZWN4Ci1taW5leGxvOgotOyByZXR1cm4gbWluKGJlc3RfbGVuLHMtPmxvb2thaGVhZCkKLQotOyByZXN0b3JlIHN0YWNrIGFuZCByZWdpc3RlciBlYngsZXNpLGVkaSxlYnAKLSAgICBhZGQgICAgIGVzcCxOYlN0YWNrQWRkCi0KLSAgICBwb3AgICAgIGVieAotICAgIHBvcCAgICAgZXNpCi0gICAgcG9wICAgICBlZGkKLSAgICBwb3AgICAgIGVicAotICAgIHJldAotSW5mb0F1dGhvcjoKLTsgcGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHN0cmluZyAhCi07IFlvdXIgYXJlIGZyZWUgdXNlIGd2bWF0MzIgaW4gYW55IGZyZSBvciBjb21tZXJjaWFsIGFwcHMgaWYgeW91IGRvbid0IHJlbW92ZSB0aGUgc3RyaW5nIGluIHRoZSBiaW5hcnkhCi0gICAgZGIgICAgIDBkaCwwYWgsIkdWTWF0MzIgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgd3JpdHRlbiAxOTk2LTk4IGJ5IEdpbGxlcyBWb2xsYW50IiwwZGgsMGFoCi0KLQotCi1JRkRFRiBOT1VOREVSTElORQotbG9uZ2VzdF9tYXRjaF83ZmZmICAgZW5kcAotRUxTRQotX2xvbmdlc3RfbWF0Y2hfN2ZmZiAgZW5kcAotRU5ESUYKLQotCi1JRkRFRiBOT1VOREVSTElORQotY3B1ZGV0ZWN0MzIgICAgIHByb2MgbmVhcgotRUxTRQotX2NwdWRldGVjdDMyICAgIHByb2MgbmVhcgotRU5ESUYKLQotICAgIHB1c2ggICAgZWJ4Ci0KLSAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IHB1c2ggb3JpZ2luYWwgRUZMQUdTCi0gICAgcG9wICAgICBlYXggICAgICAgICAgICAgOyBnZXQgb3JpZ2luYWwgRUZMQUdTCi0gICAgbW92ICAgICBlY3gsIGVheCAgICAgICAgOyBzYXZlIG9yaWdpbmFsIEVGTEFHUwotICAgIHhvciAgICAgZWF4LCA0MDAwMGggICAgIDsgZmxpcCBBQyBiaXQgaW4gRUZMQUdTCi0gICAgcHVzaCAgICBlYXggICAgICAgICAgICAgOyBzYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sKLSAgICBwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUKLSAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IGdldCBuZXcgRUZMQUdTCi0gICAgcG9wICAgICBlYXggICAgICAgICAgICAgOyBzdG9yZSBuZXcgRUZMQUdTIGluIEVBWAotICAgIHhvciAgICAgZWF4LCBlY3ggICAgICAgIDsgY2FuknQgdG9nZ2xlIEFDIGJpdCwgcHJvY2Vzc29yPTgwMzg2Ci0gICAganogICAgICBlbmRfY3B1X2lzXzM4NiAgOyBqdW1wIGlmIDgwMzg2IHByb2Nlc3NvcgotICAgIHB1c2ggICAgZWN4Ci0gICAgcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIEFDIGJpdCBpbiBFRkxBR1MgZmlyc3QKLQotICAgIHB1c2hmZAotICAgIHB1c2hmZAotICAgIHBvcCAgICAgZWN4Ci0KLSAgICBtb3YgICAgIGVheCwgZWN4ICAgICAgICA7IGdldCBvcmlnaW5hbCBFRkxBR1MKLSAgICB4b3IgICAgIGVheCwgMjAwMDAwaCAgICA7IGZsaXAgSUQgYml0IGluIEVGTEFHUwotICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgIDsgc2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrCi0gICAgcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXBsYWNlIGN1cnJlbnQgRUZMQUdTIHZhbHVlCi0gICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBnZXQgbmV3IEVGTEFHUwotICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgc3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgKLSAgICBwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgb3JpZ2luYWwgRUZMQUdTCi0gICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgOyBjYW6SdCB0b2dnbGUgSUQgYml0LAotICAgIGplICAgICAgaXNfb2xkXzQ4NiAgICAgIDsgcHJvY2Vzc29yPW9sZAotCi0gICAgbW92ICAgICBlYXgsMQotICAgIGRiICAgICAgMGZoLDBhMmggICAgICAgIDtDUFVJRAotCi1leGl0Y3B1ZGV0ZWN0OgotICAgIHBvcCBlYngKLSAgICByZXQKLQotZW5kX2NwdV9pc18zODY6Ci0gICAgbW92ICAgICBlYXgsMDMwMGgKLSAgICBqbXAgICAgIGV4aXRjcHVkZXRlY3QKLQotaXNfb2xkXzQ4NjoKLSAgICBtb3YgICAgIGVheCwwNDAwaAotICAgIGptcCAgICAgZXhpdGNwdWRldGVjdAotCi1JRkRFRiBOT1VOREVSTElORQotY3B1ZGV0ZWN0MzIgICAgIGVuZHAKLUVMU0UKLV9jcHVkZXRlY3QzMiAgICBlbmRwCi1FTkRJRgotRU5ESUYKLQotTUFYX01BVENIICAgICAgIGVxdSAgICAgMjU4Ci1NSU5fTUFUQ0ggICAgICAgZXF1ICAgICAzCi1NSU5fTE9PS0FIRUFEICAgZXF1ICAgICAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkKLU1BWF9NQVRDSF84XyAgICAgZXF1ICAgICAoKE1BWF9NQVRDSCArIDcpIEFORCAwRkZGMGgpCi0KLQotOzs7IHN0YWNrIGZyYW1lIG9mZnNldHMKLQotY2hhaW5sZW53bWFzayAgIGVxdSAgZXNwICsgMCAgICA7IGhpZ2ggd29yZDogY3VycmVudCBjaGFpbiBsZW4KLSAgICAgICAgICAgICAgICAgICAgOyBsb3cgd29yZDogcy0+d21hc2sKLXdpbmRvdyAgICAgIGVxdSAgZXNwICsgNCAgICA7IGxvY2FsIGNvcHkgb2Ygcy0+d2luZG93Ci13aW5kb3diZXN0bGVuICAgZXF1ICBlc3AgKyA4ICAgIDsgcy0+d2luZG93ICsgYmVzdGxlbgotc2NhbnN0YXJ0ICAgZXF1ICBlc3AgKyAxNiAgIDsgZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZwotc2NhbmVuZCAgICAgZXF1ICBlc3AgKyAxMiAgIDsgbGFzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nCi1zY2FuYWxpZ24gICBlcXUgIGVzcCArIDIwICAgOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nCi1uaWNlbWF0Y2ggICBlcXUgIGVzcCArIDI0ICAgOyBhIGdvb2QgZW5vdWdoIG1hdGNoIHNpemUKLWJlc3RsZW4gICAgIGVxdSAgZXNwICsgMjggICA7IHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXIKLXNjYW4gICAgICAgIGVxdSAgZXNwICsgMzIgICA7IHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaAotCi1Mb2NhbFZhcnNTaXplICAgZXF1IDM2Ci07ICAgc2F2ZWQgZWJ4ICAgYnl0ZSBlc3AgKyAzNgotOyAgIHNhdmVkIGVkaSAgIGJ5dGUgZXNwICsgNDAKLTsgICBzYXZlZCBlc2kgICBieXRlIGVzcCArIDQ0Ci07ICAgc2F2ZWQgZWJwICAgYnl0ZSBlc3AgKyA0OAotOyAgIHJldHVybiBhZGRyZXNzICBieXRlIGVzcCArIDUyCi1kZWZsYXRlc3RhdGUgICAgZXF1ICBlc3AgKyA1NiAgIDsgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotY3VybWF0Y2ggICAgZXF1ICBlc3AgKyA2MAotCi07OzsgT2Zmc2V0cyBmb3IgZmllbGRzIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZS4gVGhlc2UgbnVtYmVycwotOzs7IGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSwgd2l0aCB0aGUKLTs7OyBhc3N1bXB0aW9uIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgZHdvcmQtYWxpZ24gdGhlIGZpZWxkcy4gKFRodXMsCi07OzsgY2hhbmdpbmcgdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSBjb3VsZCBlYXNpbHkgY2F1c2UgdGhpcwotOzs7IHByb2dyYW0gdG8gY3Jhc2ggaG9ycmlibHksIHdpdGhvdXQgc28gbXVjaCBhcyBhIHdhcm5pbmcgYXQKLTs7OyBjb21waWxlIHRpbWUuIFNpZ2guKQotCi1kc1dTaXplICAgICBlcXUgMzYremxpYjEyMjJhZGQKLWRzV01hc2sgICAgIGVxdSA0NCt6bGliMTIyMmFkZAotZHNXaW5kb3cgICAgZXF1IDQ4K3psaWIxMjIyYWRkCi1kc1ByZXYgICAgICBlcXUgNTYremxpYjEyMjJhZGQKLWRzTWF0Y2hMZW4gIGVxdSA4OCt6bGliMTIyMmFkZAotZHNQcmV2TWF0Y2ggZXF1IDkyK3psaWIxMjIyYWRkCi1kc1N0clN0YXJ0ICBlcXUgMTAwK3psaWIxMjIyYWRkCi1kc01hdGNoU3RhcnQgICAgZXF1IDEwNCt6bGliMTIyMmFkZAotZHNMb29rYWhlYWQgZXF1IDEwOCt6bGliMTIyMmFkZAotZHNQcmV2TGVuICAgZXF1IDExMit6bGliMTIyMmFkZAotZHNNYXhDaGFpbkxlbiAgIGVxdSAxMTYremxpYjEyMjJhZGQKLWRzR29vZE1hdGNoIGVxdSAxMzIremxpYjEyMjJhZGQKLWRzTmljZU1hdGNoIGVxdSAxMzYremxpYjEyMjJhZGQKLQotCi07OzsgbWF0Y2guYXNtIC0tIFBlbnRpdW0tUHJvLW9wdGltaXplZCB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2goKQotOzs7IFdyaXR0ZW4gZm9yIHpsaWIgMS4xLjIKLTs7OyBDb3B5cmlnaHQgKEMpIDE5OTggQnJpYW4gUmFpdGVyIDxicmVhZGJveEBtdXBwZXRsYWJzLmNvbT4KLTs7OyBZb3UgY2FuIGxvb2sgYXQgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAotOzs7Ci07OzsgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci07OzsgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLQotO0dMT0JBTCBfbG9uZ2VzdF9tYXRjaCwgX21hdGNoX2luaXQKLQotCi07U0VDVElPTiAgICAudGV4dAotCi07OzsgdUludCBsb25nZXN0X21hdGNoKGRlZmxhdGVfc3RhdGUgKmRlZmxhdGVzdGF0ZSwgSVBvcyBjdXJtYXRjaCkKLQotO19sb25nZXN0X21hdGNoOgotSUZERUYgTk9PTERQRU5USVVNQ09ERQotICAgIElGREVGIE5PVU5ERVJMSU5FCi0gICAgbG9uZ2VzdF9tYXRjaCAgICAgICBwcm9jIG5lYXIKLSAgICBFTFNFCi0gICAgX2xvbmdlc3RfbWF0Y2ggICAgICBwcm9jIG5lYXIKLSAgICBFTkRJRgotRUxTRQotICAgIElGREVGIE5PVU5ERVJMSU5FCi0gICAgbG9uZ2VzdF9tYXRjaF82ODYgICBwcm9jIG5lYXIKLSAgICBFTFNFCi0gICAgX2xvbmdlc3RfbWF0Y2hfNjg2ICBwcm9jIG5lYXIKLSAgICBFTkRJRgotRU5ESUYKLQotOzs7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCBlc3AgdG8KLTs7OyBtYWtlIHJvb20gZm9yIG91ciBzdGFjayBmcmFtZS4KLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBwdXNoICAgIGVkaQotICAgICAgICBwdXNoICAgIGVzaQotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBzdWIgZXNwLCBMb2NhbFZhcnNTaXplCi0KLTs7OyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiBlY3ggd2lsbCBob2xkIGN1cl9tYXRjaAotOzs7IHRocm91Z2hvdXQgdGhlIGVudGlyZSBmdW5jdGlvbi4gZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUKLTs7OyBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBkdXJpbmcgdGhlIGZ1bmN0aW9uJ3Mgc2V0dXAgKGJlZm9yZQotOzs7IGVudGVyaW5nIHRoZSBtYWluIGxvb3AuCi0KLSAgICAgICAgbW92IGVkeCwgW2RlZmxhdGVzdGF0ZV0KLSAgICAgICAgbW92IGVjeCwgW2N1cm1hdGNoXQotCi07OzsgdUludCB3bWFzayA9IHMtPndfbWFzazsKLTs7OyB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOwotOzs7IGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7Ci07OzsgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKLTs7OyB9Ci0KLSAgICAgICAgbW92IGVheCwgW2VkeCArIGRzUHJldkxlbl0KLSAgICAgICAgbW92IGVieCwgW2VkeCArIGRzR29vZE1hdGNoXQotICAgICAgICBjbXAgZWF4LCBlYngKLSAgICAgICAgbW92IGVheCwgW2VkeCArIGRzV01hc2tdCi0gICAgICAgIG1vdiBlYngsIFtlZHggKyBkc01heENoYWluTGVuXQotICAgICAgICBqbCAgTGFzdE1hdGNoR29vZAotICAgICAgICBzaHIgZWJ4LCAyCi1MYXN0TWF0Y2hHb29kOgotCi07OzsgY2hhaW5sZW4gaXMgZGVjcmVtZW50ZWQgb25jZSBiZWZvcmVoYW5kIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbgotOzs7IHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4KLTs7OyBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzawotOzs7IHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuCi0KLSAgICAgICAgZGVjIGVieAotICAgICAgICBzaGwgZWJ4LCAxNgotICAgICAgICBvciAgZWJ4LCBlYXgKLSAgICAgICAgbW92IFtjaGFpbmxlbndtYXNrXSwgZWJ4Ci0KLTs7OyBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsKLQotICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNOaWNlTWF0Y2hdCi0gICAgICAgIG1vdiBlYngsIFtlZHggKyBkc0xvb2thaGVhZF0KLSAgICAgICAgY21wIGVieCwgZWF4Ci0gICAgICAgIGpsICBMb29rYWhlYWRMZXNzCi0gICAgICAgIG1vdiBlYngsIGVheAotTG9va2FoZWFkTGVzczogIG1vdiBbbmljZW1hdGNoXSwgZWJ4Ci0KLTs7OyByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OwotCi0gICAgICAgIG1vdiBlc2ksIFtlZHggKyBkc1dpbmRvd10KLSAgICAgICAgbW92IFt3aW5kb3ddLCBlc2kKLSAgICAgICAgbW92IGVicCwgW2VkeCArIGRzU3RyU3RhcnRdCi0gICAgICAgIGxlYSBlZGksIFtlc2kgKyBlYnBdCi0gICAgICAgIG1vdiBbc2Nhbl0sIGVkaQotCi07OzsgRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRoZSBzY2FuIHB0ciBpcyBvZmYgZnJvbSBiZWluZwotOzs7IGR3b3JkLWFsaWduZWQuCi0KLSAgICAgICAgbW92IGVheCwgZWRpCi0gICAgICAgIG5lZyBlYXgKLSAgICAgICAgYW5kIGVheCwgMwotICAgICAgICBtb3YgW3NjYW5hbGlnbl0sIGVheAotCi07OzsgSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPwotOzs7ICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOwotCi0gICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc1dTaXplXQotICAgICAgICBzdWIgZWF4LCBNSU5fTE9PS0FIRUFECi0gICAgICAgIHN1YiBlYnAsIGVheAotICAgICAgICBqZyAgTGltaXRQb3NpdGl2ZQotICAgICAgICB4b3IgZWJwLCBlYnAKLUxpbWl0UG9zaXRpdmU6Ci0KLTs7OyBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsKLQotICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNQcmV2TGVuXQotICAgICAgICBtb3YgW2Jlc3RsZW5dLCBlYXgKLQotOzs7IFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gZXNpIGxvY2FsbHksIGFuZCBpbiBlc2kuCi0KLSAgICAgICAgYWRkIGVzaSwgZWF4Ci0gICAgICAgIG1vdiBbd2luZG93YmVzdGxlbl0sIGVzaQotCi07OzsgcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaGYqKXNjYW47Ci07OzsgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwotOzs7IFBvc2YgKnByZXYgPSBzLT5wcmV2OwotCi0gICAgICAgIG1vdnp4ICAgZWJ4LCB3b3JkIHB0ciBbZWRpXQotICAgICAgICBtb3YgW3NjYW5zdGFydF0sIGVieAotICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdCi0gICAgICAgIG1vdiBbc2NhbmVuZF0sIGVieAotICAgICAgICBtb3YgZWRpLCBbZWR4ICsgZHNQcmV2XQotCi07OzsgSnVtcCBpbnRvIHRoZSBtYWluIGxvb3AuCi0KLSAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdCi0gICAgICAgIGptcCBzaG9ydCBMb29wRW50cnkKLQotYWxpZ24gNAotCi07OzsgZG8gewotOzs7ICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKLTs7OyAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8Ci07OzsgICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOwotOzs7ICAgICBbLi4uXQotOzs7IH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdAotOzs7ICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOwotOzs7Ci07OzsgSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQotOzs7IG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsCi07OzsgYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuCi07OzsKLTs7OyBXaXRoaW4gdGhpcyBsb29wOgotOzs7IGVieCA9IHNjYW5lbmQKLTs7OyBlY3ggPSBjdXJtYXRjaAotOzs7IGVkeCA9IGNoYWlubGVud21hc2sgLSBpLmUuLCAoKGNoYWlubGVuIDw8IDE2KSB8IHdtYXNrKQotOzs7IGVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikKLTs7OyBlZGkgPSBwcmV2Ci07OzsgZWJwID0gbGltaXQKLQotTG9va3VwTG9vcDoKLSAgICAgICAgYW5kIGVjeCwgZWR4Ci0gICAgICAgIG1vdnp4ICAgZWN4LCB3b3JkIHB0ciBbZWRpICsgZWN4KjJdCi0gICAgICAgIGNtcCBlY3gsIGVicAotICAgICAgICBqYmUgTGVhdmVOb3cKLSAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoCi0gICAgICAgIGpzICBMZWF2ZU5vdwotTG9vcEVudHJ5OiAgbW92enggICBlYXgsIHdvcmQgcHRyIFtlc2kgKyBlY3ggLSAxXQotICAgICAgICBjbXAgZWF4LCBlYngKLSAgICAgICAgam56IExvb2t1cExvb3AKLSAgICAgICAgbW92IGVheCwgW3dpbmRvd10KLSAgICAgICAgbW92enggICBlYXgsIHdvcmQgcHRyIFtlYXggKyBlY3hdCi0gICAgICAgIGNtcCBlYXgsIFtzY2Fuc3RhcnRdCi0gICAgICAgIGpueiBMb29rdXBMb29wCi0KLTs7OyBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4KLQotICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlZHgKLQotOzs7IFBvaW50IGVkaSB0byB0aGUgc3RyaW5nIHVuZGVyIHNjcnV0aW55LCBhbmQgZXNpIHRvIHRoZSBzdHJpbmcgd2UKLTs7OyBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgZXNpIGFuZCBlZGkgYXJlCi07OzsgYm90aCBwb2ludGVkIChNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikgYnl0ZXMgYWhlYWQsIGFuZCBlZHggaXMKLTs7OyBpbml0aWFsaXplZCB0byAtKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKS4KLQotICAgICAgICBtb3YgZXNpLCBbd2luZG93XQotICAgICAgICBtb3YgZWRpLCBbc2Nhbl0KLSAgICAgICAgYWRkIGVzaSwgZWN4Ci0gICAgICAgIG1vdiBlYXgsIFtzY2FuYWxpZ25dCi0gICAgICAgIG1vdiBlZHgsIDBmZmZmZmVmOGg7IC0oTUFYX01BVENIXzgpCi0gICAgICAgIGxlYSBlZGksIFtlZGkgKyBlYXggKyAwMTA4aF0gO01BWF9NQVRDSF84XQotICAgICAgICBsZWEgZXNpLCBbZXNpICsgZWF4ICsgMDEwOGhdIDtNQVhfTUFUQ0hfOF0KLQotOzs7IFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwKLTs7OyBhZGp1c3QgZWR4IHNvIHRoYXQgaXQgaXMgb2Zmc2V0IHRvIHRoZSBleGFjdCBieXRlIHRoYXQgbWlzbWF0Y2hlZC4KLTs7OwotOzs7IFdlIGFscmVhZHkga25vdyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQotOzs7IHN0cmluZ3MgbWF0Y2ggZWFjaCBvdGhlciwgYW5kIHRoZXkgY2FuIGJlIHNhZmVseSBwYXNzZWQgb3ZlciBiZWZvcmUKLTs7OyBzdGFydGluZyB0aGUgY29tcGFyZSBsb29wLiBTbyB3aGF0IHRoaXMgY29kZSBkb2VzIGlzIHNraXAgb3ZlciAwLTMKLTs7OyBieXRlcywgYXMgbXVjaCBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gZHdvcmQtYWxpZ24gdGhlIGVkaQotOzs7IHBvaW50ZXIuIChlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikKLTs7OwotOzs7IEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQKLTs7OyBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQotOzs7IHN0cmFpZ2h0Zm9yd2FyZCAicmVwIGNtcHNiIiB3b3VsZCBub3QgZHJhc3RpY2FsbHkgZGVncmFkZQotOzs7IHBlcmZvcm1hbmNlLgotCi1Mb29wQ21wczoKLSAgICAgICAgbW92IGVheCwgW2VzaSArIGVkeF0KLSAgICAgICAgeG9yIGVheCwgW2VkaSArIGVkeF0KLSAgICAgICAgam56IExlYXZlTG9vcENtcHMKLSAgICAgICAgbW92IGVheCwgW2VzaSArIGVkeCArIDRdCi0gICAgICAgIHhvciBlYXgsIFtlZGkgKyBlZHggKyA0XQotICAgICAgICBqbnogTGVhdmVMb29wQ21wczQKLSAgICAgICAgYWRkIGVkeCwgOAotICAgICAgICBqbnogTG9vcENtcHMKLSAgICAgICAgam1wIHNob3J0IExlbk1heGltdW0KLUxlYXZlTG9vcENtcHM0OiBhZGQgZWR4LCA0Ci1MZWF2ZUxvb3BDbXBzOiAgdGVzdCAgICBlYXgsIDAwMDBGRkZGaAotICAgICAgICBqbnogTGVuTG93ZXIKLSAgICAgICAgYWRkIGVkeCwgIDIKLSAgICAgICAgc2hyIGVheCwgMTYKLUxlbkxvd2VyOiAgIHN1YiBhbCwgMQotICAgICAgICBhZGMgZWR4LCAwCi0KLTs7OyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2guIElmIGl0IGlzIGxvbmdlciB0aGFuIE1BWF9NQVRDSCwKLTs7OyB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4KLQotICAgICAgICBsZWEgZWF4LCBbZWRpICsgZWR4XQotICAgICAgICBtb3YgZWRpLCBbc2Nhbl0KLSAgICAgICAgc3ViIGVheCwgZWRpCi0gICAgICAgIGNtcCBlYXgsIE1BWF9NQVRDSAotICAgICAgICBqZ2UgTGVuTWF4aW11bQotCi07OzsgSWYgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbm90IGxvbmdlciB0aGFuIHRoZSBiZXN0IG1hdGNoIHdlCi07OzsgaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLgotCi0gICAgICAgIG1vdiBlZHgsIFtkZWZsYXRlc3RhdGVdCi0gICAgICAgIG1vdiBlYngsIFtiZXN0bGVuXQotICAgICAgICBjbXAgZWF4LCBlYngKLSAgICAgICAgamcgIExvbmdlck1hdGNoCi0gICAgICAgIG1vdiBlc2ksIFt3aW5kb3diZXN0bGVuXQotICAgICAgICBtb3YgZWRpLCBbZWR4ICsgZHNQcmV2XQotICAgICAgICBtb3YgZWJ4LCBbc2NhbmVuZF0KLSAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdCi0gICAgICAgIGptcCBMb29rdXBMb29wCi0KLTs7OyAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOwotOzs7ICAgICAgICAgYmVzdF9sZW4gPSBsZW47Ci07OzsgICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOwotOzs7ICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwotCi1Mb25nZXJNYXRjaDogICAgbW92IGVieCwgW25pY2VtYXRjaF0KLSAgICAgICAgbW92IFtiZXN0bGVuXSwgZWF4Ci0gICAgICAgIG1vdiBbZWR4ICsgZHNNYXRjaFN0YXJ0XSwgZWN4Ci0gICAgICAgIGNtcCBlYXgsIGVieAotICAgICAgICBqZ2UgTGVhdmVOb3cKLSAgICAgICAgbW92IGVzaSwgW3dpbmRvd10KLSAgICAgICAgYWRkIGVzaSwgZWF4Ci0gICAgICAgIG1vdiBbd2luZG93YmVzdGxlbl0sIGVzaQotICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdCi0gICAgICAgIG1vdiBlZGksIFtlZHggKyBkc1ByZXZdCi0gICAgICAgIG1vdiBbc2NhbmVuZF0sIGVieAotICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10KLSAgICAgICAgam1wIExvb2t1cExvb3AKLQotOzs7IEFjY2VwdCB0aGUgY3VycmVudCBzdHJpbmcsIHdpdGggdGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoLgotCi1MZW5NYXhpbXVtOiBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQotICAgICAgICBtb3YgZHdvcmQgcHRyIFtiZXN0bGVuXSwgTUFYX01BVENICi0gICAgICAgIG1vdiBbZWR4ICsgZHNNYXRjaFN0YXJ0XSwgZWN4Ci0KLTs7OyBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47Ci07OzsgcmV0dXJuIHMtPmxvb2thaGVhZDsKLQotTGVhdmVOb3c6Ci0gICAgICAgIG1vdiBlZHgsIFtkZWZsYXRlc3RhdGVdCi0gICAgICAgIG1vdiBlYngsIFtiZXN0bGVuXQotICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNMb29rYWhlYWRdCi0gICAgICAgIGNtcCBlYngsIGVheAotICAgICAgICBqZyAgTG9va2FoZWFkUmV0Ci0gICAgICAgIG1vdiBlYXgsIGVieAotTG9va2FoZWFkUmV0OgotCi07OzsgUmVzdG9yZSB0aGUgc3RhY2sgYW5kIHJldHVybiBmcm9tIHdoZW5jZSB3ZSBjYW1lLgotCi0gICAgICAgIGFkZCBlc3AsIExvY2FsVmFyc1NpemUKLSAgICAgICAgcG9wIGVieAotICAgICAgICBwb3AgZXNpCi0gICAgICAgIHBvcCBlZGkKLSAgICAgICAgcG9wIGVicAotCi0gICAgICAgIHJldAotOyBwbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgc3RyaW5nICEKLTsgWW91ciBjYW4gZnJlZWx5IHVzZSBndm1hdDMyIGluIGFueSBmcmVlIG9yIGNvbW1lcmNpYWwgYXBwIGlmIHlvdSBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQotICAgIGRiICAgICAwZGgsMGFoLCJhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSBmcm9tIEJyaWFuIFJhaXRlciwgd3JpdHRlbiAxOTk4IiwwZGgsMGFoCi0KLQotSUZERUYgTk9PTERQRU5USVVNQ09ERQotICAgIElGREVGIE5PVU5ERVJMSU5FCi0gICAgbG9uZ2VzdF9tYXRjaCAgICAgICBlbmRwCi0gICAgRUxTRQotICAgIF9sb25nZXN0X21hdGNoICAgICAgZW5kcAotICAgIEVORElGCi0KLSAgICBJRkRFRiBOT1VOREVSTElORQotICAgIG1hdGNoX2luaXQgICAgICBwcm9jIG5lYXIKLSAgICAgICAgICAgICAgICAgICAgcmV0Ci0gICAgbWF0Y2hfaW5pdCAgICAgIGVuZHAKLSAgICBFTFNFCi0gICAgX21hdGNoX2luaXQgICAgIHByb2MgbmVhcgotICAgICAgICAgICAgICAgICAgICByZXQKLSAgICBfbWF0Y2hfaW5pdCAgICAgZW5kcAotICAgIEVORElGICAgIAotRUxTRQotICAgIElGREVGIE5PVU5ERVJMSU5FCi0gICAgbG9uZ2VzdF9tYXRjaF82ODYgICBlbmRwCi0gICAgRUxTRQotICAgIF9sb25nZXN0X21hdGNoXzY4NiAgZW5kcAotICAgIEVORElGCi1FTkRJRgotCi1fVEVYVCAgIGVuZHMKLWVuZApkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvbWFzbXg4Ni9ndm1hdDMyLm9iaiBiL2xpYnMvemxpYi9jb250cmliL21hc214ODYvZ3ZtYXQzMi5vYmoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYjMyNjIuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvbWFzbXg4Ni9ndm1hdDMyLm9iagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21hc214ODYvZ3ZtYXQzMmMuYyBiL2xpYnMvemxpYi9jb250cmliL21hc214ODYvZ3ZtYXQzMmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmNTI1Yy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9tYXNteDg2L2d2bWF0MzJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKiBndm1hdDMyLmMgLS0gQyBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODYKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkgYW5kIEdpbGxlcyBWb2xsYW50LgotICogRmlsZSB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50LCBieSBtb2RpZml5aW5nIHRoZSBsb25nZXN0X21hdGNoCi0gKiAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYwotICogIGl0IHByZXBhcmUgYWxsIHBhcmFtZXRlcnMgYW5kIGNhbGwgdGhlIGFzc2VtYmx5IGxvbmdlc3RfbWF0Y2hfZ3Zhc20KLSAqICBsb25nZXN0X21hdGNoIGV4ZWN1dGUgc3RhbmRhcmQgQyBjb2RlIGlzIHdtYXNrICE9IDB4N2ZmZgotICogICAgIChhc3NlbWJseSBjb2RlIGlzIGZhc3RlciB3aXRoIGEgZml4ZWQgd21hc2spCi0gKgotICogUmVhZCBjb21tZW50IGF0IGJlZ2lubmluZyBvZiBndm1hdDMyLmFzbSBmb3IgbW9yZSBpbmZvcm1hdGlvbgotICovCi0KLSNpZiBkZWZpbmVkKEFTTVYpICYmICghZGVmaW5lZChOT09MRFBFTlRJVU1DT0RFKSkKLSNpbmNsdWRlICJkZWZsYXRlLmgiCi0KLS8qIGlmIHlvdXIgQyBjb21waWxlciBkb24ndCBhZGQgdW5kZXJsaW5lIGJlZm9yZSBmdW5jdGlvbiBuYW1lLAotICAgICAgICBkZWZpbmUgQUREX1VOREVSTElORV9BU01GVU5DICovCi0jaWZkZWYgQUREX1VOREVSTElORV9BU01GVU5DCi0jZGVmaW5lIGxvbmdlc3RfbWF0Y2hfN2ZmZiBfbG9uZ2VzdF9tYXRjaF83ZmZmCi0jZGVmaW5lIGxvbmdlc3RfbWF0Y2hfNjg2ICBfbG9uZ2VzdF9tYXRjaF82ODYKLSNkZWZpbmUgY3B1ZGV0ZWN0MzIgICAgICAgIF9jcHVkZXRlY3QzMgotI2VuZGlmCi0KLQotdW5zaWduZWQgbG9uZyBjcHVkZXRlY3QzMigpOwotCi11SW50IGxvbmdlc3RfbWF0Y2hfYygKLSAgICBkZWZsYXRlX3N0YXRlICpzLAotICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLQotCi11SW50IGxvbmdlc3RfbWF0Y2hfN2ZmZigKLSAgICBkZWZsYXRlX3N0YXRlICpzLAotICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLQotdUludCBsb25nZXN0X21hdGNoXzY4NigKLSAgICBkZWZsYXRlX3N0YXRlICpzLAotICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLQotCi1zdGF0aWMgdUludCBpSXNQUHJvPTI7Ci0KLXZvaWQgbWF0Y2hfaW5pdCAoKQotewotICAgIGlJc1BQcm8gPSAoKChjcHVkZXRlY3QzMigpLzB4MTAwKSYweGYpPj02KSA/IDEgOiAwOwotfQotCi11SW50IGxvbmdlc3RfbWF0Y2goCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcywKLSAgICBJUG9zIGN1cl9tYXRjaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLXsKLSAgICBpZiAoaUlzUFBybyE9MCkKLSAgICAgICAgcmV0dXJuIGxvbmdlc3RfbWF0Y2hfNjg2KHMsY3VyX21hdGNoKTsKLQotICAgIGlmIChzLT53X21hc2sgIT0gMHg3ZmZmKQotICAgICAgICByZXR1cm4gbG9uZ2VzdF9tYXRjaF82ODYocyxjdXJfbWF0Y2gpOwotCi0gICAgLyogbm93ICgocy0+d19tYXNrID09IDB4N2ZmZikgJiYgKGlJc1BQcm89PTApKSAqLwotICAgICAgICByZXR1cm4gbG9uZ2VzdF9tYXRjaF83ZmZmKHMsY3VyX21hdGNoKTsKLX0KLQotCi0jZW5kaWYgLyogZGVmaW5lZChBU01WKSAmJiAoIWRlZmluZWQoTk9PTERQRU5USVVNQ09ERSkpICovCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9tYXNteDg2L2luZmZhczMyLmFzbSBiL2xpYnMvemxpYi9jb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTE0ZjMyLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTA4MyArMCwwIEBACi07LyogaW5mZmFzMzIuYXNtIGlzIGEgaGFuZCB0dW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZiBpbmZmYXN0LmMgLS0gZmFzdCBkZWNvZGluZwotOyAqCi07ICogaW5mZmFzMzIuYXNtIGlzIGRlcml2YXRlZCBmcm9tIGluZmZhczg2LmMsIHdpdGggdHJhbnNsYXRpb24gb2YgYXNzZW1ibHkgY29kZQotOyAqCi07ICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcgotOyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLTsgKgotOyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0PgotOyAqIFBsZWFzZSB1c2UgdGhlIGNvcHlyaWdodCBjb25kaXRpb25zIGFib3ZlLgotOyAqCi07ICogTWFyLTEzLTIwMDMgLS0gTW9zdCBvZiB0aGlzIGlzIGRlcml2ZWQgZnJvbSBpbmZmYXN0LlMgd2hpY2ggaXMgZGVyaXZlZCBmcm9tCi07ICogdGhlIGdjYyAtUyBvdXRwdXQgb2YgemxpYi0xLjIuMC9pbmZmYXN0LmMuICBabGliLTEuMi4wIGlzIGluIGJldGEgcmVsZWFzZSBhdAotOyAqIHRoZSBtb21lbnQuICBJIGhhdmUgc3VjY2Vzc2Z1bGx5IGNvbXBpbGVkIGFuZCB0ZXN0ZWQgdGhpcyBjb2RlIHdpdGggZ2NjMi45NiwKLTsgKiBnY2MzLjIsIGljYzUuMCwgbXN2YzYuMC4gIEl0IGlzIHZlcnkgY2xvc2UgdG8gdGhlIHNwZWVkIG9mIGluZmZhc3QuUwotOyAqIGNvbXBpbGVkIHdpdGggZ2NjIC1ETk9fTU1YLCBidXQgaW5mZmFzdC5TIGlzIHN0aWxsIGZhc3RlciBvbiB0aGUgUDMgd2l0aCBNTVgKLTsgKiBlbmFibGVkLiAgSSB3aWxsIGF0dGVtcHQgdG8gbWVyZ2UgdGhlIE1NWCBjb2RlIGludG8gdGhpcyB2ZXJzaW9uLiAgTmV3ZXIKLTsgKiB2ZXJzaW9ucyBvZiB0aGlzIGFuZCBpbmZmYXN0LlMgY2FuIGJlIGZvdW5kIGF0Ci07ICogaHR0cDovL3d3dy5lZXRiZWV0ZWUuY29tL3psaWIvIGFuZCBodHRwOi8vd3d3LmNoYXJtLm5ldC9+Y2hyaXN0b3AvemxpYi8KLTsgKiAKLTsgKiAyMDA1IDogbW9kaWZpY2F0aW9uIGJ5IEdpbGxlcyBWb2xsYW50Ci07ICovCi07IEZvciBWaXN1YWwgQysrIDQueCBhbmQgaGlnaGVyIGFuZCBNTCA2LnggYW5kIGhpZ2hlcgotOyAgIG1sLmV4ZSBpcyBpbiBkaXJlY3RvcnkgXE1BU002MTFDIG9mIFdpbjk1IERESwotOyAgIG1sLmV4ZSBpcyBhbHNvIGRpc3RyaWJ1dGVkIGluIGh0dHA6Ly93d3cubWFzbTMyLmNvbS9tYXNtZGwuaHRtCi07ICAgIGFuZCBpbiBWQysrMjAwMyB0b29sa2l0IGF0IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vdmlzdWFsYy92Y3Rvb2xraXQyMDAzLwotOwotOwotOyAgIGNvbXBpbGUgd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9uCi07ICAgbWwgIC9jb2ZmIC9aaSAvYyAvRmxpbmZmYXMzMi5sc3QgaW5mZmFzMzIuYXNtCi0KLTsgICBpZiB5b3UgZGVmaW5lIE5PX0daSVAgKHNlZSBpbmZsYXRlLmgpLCBjb21waWxlIHdpdGgKLTsgICBtbCAgL2NvZmYgL1ppIC9jIC9GbGluZmZhczMyLmxzdCAvRE5PX0dVTlpJUCBpbmZmYXMzMi5hc20KLQotCi07IHpsaWIxMjJzdXAgaXMgMCBmb3J0IHpsaWIgMS4yLjIuMSBhbmQgbG93ZXIKLTsgemxpYjEyMnN1cCBpcyA4IGZvcnQgemxpYiAxLjIuMi4yIGFuZCBtb3JlICh3aXRoIGFkZGl0aW9uIG9mIGRtYXggYW5kIGhlYWQgCi07ICAgICAgICBpbiBpbmZsYXRlX3N0YXRlIGluIGluZmxhdGUuaCkKLXpsaWIxMjIyc3VwICAgICAgZXF1ICAgIDgKLQotCi1JRkRFRiBHVU5aSVAKLSAgSU5GTEFURV9NT0RFX1RZUEUgICAgZXF1IDExCi0gIElORkxBVEVfTU9ERV9CQUQgICAgIGVxdSAyNgotRUxTRQotICBJRk5ERUYgTk9fR1VOWklQCi0gICAgSU5GTEFURV9NT0RFX1RZUEUgICAgZXF1IDExCi0gICAgSU5GTEFURV9NT0RFX0JBRCAgICAgZXF1IDI2Ci0gIEVMU0UKLSAgICBJTkZMQVRFX01PREVfVFlQRSAgICBlcXUgMwotICAgIElORkxBVEVfTU9ERV9CQUQgICAgIGVxdSAxNwotICBFTkRJRgotRU5ESUYKLQotCi07IDc1ICJpbmZmYXN0LlMiCi07RklMRSAiaW5mZmFzdC5TIgotCi07OztHTE9CQUwgX2luZmxhdGVfZmFzdAotCi07OztTRUNUSU9OIC50ZXh0Ci0KLQotCi0JLjU4NnAKLQkubW14Ci0KLQluYW1lCWluZmxhdGVfZmFzdF94ODYKLQkuTU9ERUwJRkxBVAotCi1fREFUQQkJCXNlZ21lbnQKLWluZmxhdGVfZmFzdF91c2VfbW14OgotCWRkCTEKLQotCi1fVEVYVAkJCXNlZ21lbnQKLVBVQkxJQyBfaW5mbGF0ZV9mYXN0Ci0KLUFMSUdOIDQKLV9pbmZsYXRlX2Zhc3Q6Ci0Jam1wIGluZmxhdGVfZmFzdF9lbnRyeQotCi0KLQotQUxJR04gNAotCWRiCSdGYXN0IGRlY29kaW5nIENvZGUgZnJvbSBDaHJpcyBBbmRlcnNvbicKLQlkYgkwCi0KLUFMSUdOIDQKLWludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZV9tc2c6Ci0JZGIJJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZScKLQlkYgkwCi0KLUFMSUdOIDQKLWludmFsaWRfZGlzdGFuY2VfY29kZV9tc2c6Ci0JZGIJJ2ludmFsaWQgZGlzdGFuY2UgY29kZScKLQlkYgkwCi0KLUFMSUdOIDQKLWludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2c6Ci0JZGIJJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJwotCWRiCTAKLQotCi1BTElHTiA0Ci1pbmZsYXRlX2Zhc3RfbWFzazoKLWRkCTAKLWRkCTEKLWRkCTMKLWRkCTcKLWRkCTE1Ci1kZAkzMQotZGQJNjMKLWRkCTEyNwotZGQJMjU1Ci1kZAk1MTEKLWRkCTEwMjMKLWRkCTIwNDcKLWRkCTQwOTUKLWRkCTgxOTEKLWRkCTE2MzgzCi1kZAkzMjc2NwotZGQJNjU1MzUKLWRkCTEzMTA3MQotZGQJMjYyMTQzCi1kZAk1MjQyODcKLWRkCTEwNDg1NzUKLWRkCTIwOTcxNTEKLWRkCTQxOTQzMDMKLWRkCTgzODg2MDcKLWRkCTE2Nzc3MjE1Ci1kZAkzMzU1NDQzMQotZGQJNjcxMDg4NjMKLWRkCTEzNDIxNzcyNwotZGQJMjY4NDM1NDU1Ci1kZAk1MzY4NzA5MTEKLWRkCTEwNzM3NDE4MjMKLWRkCTIxNDc0ODM2NDcKLWRkCTQyOTQ5NjcyOTUKLQotCi1tb2RlX3N0YXRlCSBlcXUJMAk7Lyogc3RhdGUtPm1vZGUJKi8KLXdzaXplX3N0YXRlCSBlcXUJKDMyK3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPndzaXplICovCi13cml0ZV9zdGF0ZQkgZXF1CSgzNis0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPndyaXRlICovCi13aW5kb3dfc3RhdGUJIGVxdQkoNDArNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT53aW5kb3cgKi8KLWhvbGRfc3RhdGUJIGVxdQkoNDQrNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT5ob2xkCSovCi1iaXRzX3N0YXRlCSBlcXUJKDQ4KzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+Yml0cwkqLwotbGVuY29kZV9zdGF0ZQkgZXF1CSg2NCs0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmxlbmNvZGUgKi8KLWRpc3Rjb2RlX3N0YXRlCSBlcXUJKDY4KzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+ZGlzdGNvZGUgKi8KLWxlbmJpdHNfc3RhdGUJIGVxdQkoNzIrNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT5sZW5iaXRzICovCi1kaXN0Yml0c19zdGF0ZQkgZXF1CSg3Nis0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmRpc3RiaXRzICovCi0KLQotOztTRUNUSU9OIC50ZXh0Ci07IDIwNSAiaW5mZmFzdC5TIgotO0dMT0JBTAlpbmZsYXRlX2Zhc3RfdXNlX21teAotCi07U0VDVElPTiAuZGF0YQotCi0KLTsgR0xPQkFMIGluZmxhdGVfZmFzdF91c2VfbW14Om9iamVjdAotOy5zaXplIGluZmxhdGVfZmFzdF91c2VfbW14LCA0Ci07IDIyNiAiaW5mZmFzdC5TIgotO1NFQ1RJT04gLnRleHQKLQotQUxJR04gNAotaW5mbGF0ZV9mYXN0X2VudHJ5OgotCXB1c2ggIGVkaQotCXB1c2ggIGVzaQotCXB1c2ggIGVicAotCXB1c2ggIGVieAotCXB1c2hmZAotCXN1YiAgZXNwLDY0Ci0JY2xkCi0KLQotCi0KLQltb3YgIGVzaSwgW2VzcCs4OF0KLQltb3YgIGVkaSwgW2VzaSsyOF0KLQotCi0KLQotCi0KLQotCW1vdiAgZWR4LCBbZXNpKzRdCi0JbW92ICBlYXgsIFtlc2krMF0KLQotCWFkZCAgZWR4LGVheAotCXN1YiAgZWR4LDExCi0KLQltb3YgIFtlc3ArNDRdLGVheAotCW1vdiAgW2VzcCsyMF0sZWR4Ci0KLQltb3YgIGVicCwgW2VzcCs5Ml0KLQltb3YgIGVjeCwgW2VzaSsxNl0KLQltb3YgIGVieCwgW2VzaSsxMl0KLQotCXN1YiAgZWJwLGVjeAotCW5lZyAgZWJwCi0JYWRkICBlYnAsZWJ4Ci0KLQlzdWIgIGVjeCwyNTcKLQlhZGQgIGVjeCxlYngKLQotCW1vdiAgW2VzcCs2MF0sZWJ4Ci0JbW92ICBbZXNwKzQwXSxlYnAKLQltb3YgIFtlc3ArMTZdLGVjeAotOyAyODUgImluZmZhc3QuUyIKLQltb3YgIGVheCwgW2VkaStsZW5jb2RlX3N0YXRlXQotCW1vdiAgZWN4LCBbZWRpK2Rpc3Rjb2RlX3N0YXRlXQotCi0JbW92ICBbZXNwKzhdLGVheAotCW1vdiAgW2VzcCsxMl0sZWN4Ci0KLQltb3YgIGVheCwxCi0JbW92ICBlY3gsIFtlZGkrbGVuYml0c19zdGF0ZV0KLQlzaGwgIGVheCxjbAotCWRlYyAgZWF4Ci0JbW92ICBbZXNwKzBdLGVheAotCi0JbW92ICBlYXgsMQotCW1vdiAgZWN4LCBbZWRpK2Rpc3RiaXRzX3N0YXRlXQotCXNobCAgZWF4LGNsCi0JZGVjICBlYXgKLQltb3YgIFtlc3ArNF0sZWF4Ci0KLQltb3YgIGVheCwgW2VkaSt3c2l6ZV9zdGF0ZV0KLQltb3YgIGVjeCwgW2VkaSt3cml0ZV9zdGF0ZV0KLQltb3YgIGVkeCwgW2VkaSt3aW5kb3dfc3RhdGVdCi0KLQltb3YgIFtlc3ArNTJdLGVheAotCW1vdiAgW2VzcCs0OF0sZWN4Ci0JbW92ICBbZXNwKzU2XSxlZHgKLQotCW1vdiAgZWJwLCBbZWRpK2hvbGRfc3RhdGVdCi0JbW92ICBlYngsIFtlZGkrYml0c19zdGF0ZV0KLTsgMzIxICJpbmZmYXN0LlMiCi0JbW92ICBlc2ksIFtlc3ArNDRdCi0JbW92ICBlY3gsIFtlc3ArMjBdCi0JY21wICBlY3gsZXNpCi0JamEgICBMX2FsaWduX2xvbmcKLQotCWFkZCAgZWN4LDExCi0Jc3ViICBlY3gsZXNpCi0JbW92ICBlYXgsMTIKLQlzdWIgIGVheCxlY3gKLQlsZWEgIGVkaSwgW2VzcCsyOF0KLQlyZXAgbW92c2IKLQltb3YgIGVjeCxlYXgKLQl4b3IgIGVheCxlYXgKLQlyZXAgc3Rvc2IKLQlsZWEgIGVzaSwgW2VzcCsyOF0KLQltb3YgIFtlc3ArMjBdLGVzaQotCWptcCAgTF9pc19hbGlnbmVkCi0KLQotTF9hbGlnbl9sb25nOgotCXRlc3QgIGVzaSwzCi0JanogICBMX2lzX2FsaWduZWQKLQl4b3IgIGVheCxlYXgKLQltb3YgIGFsLCBbZXNpXQotCWluYyAgZXNpCi0JbW92ICBlY3gsZWJ4Ci0JYWRkICBlYngsOAotCXNobCAgZWF4LGNsCi0Jb3IgIGVicCxlYXgKLQlqbXAgTF9hbGlnbl9sb25nCi0KLUxfaXNfYWxpZ25lZDoKLQltb3YgIGVkaSwgW2VzcCs2MF0KLTsgMzY2ICJpbmZmYXN0LlMiCi1MX2NoZWNrX21teDoKLQljbXAgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDIKLQlqZSAgIExfaW5pdF9tbXgKLQlqYSAgIExfZG9fbG9vcAotCi0JcHVzaCAgZWF4Ci0JcHVzaCAgZWJ4Ci0JcHVzaCAgZWN4Ci0JcHVzaCAgZWR4Ci0JcHVzaGZkCi0JbW92ICBlYXgsIFtlc3BdCi0JeG9yICBkd29yZCBwdHIgW2VzcF0sMDIwMDAwMGgKLQotCi0KLQotCXBvcGZkCi0JcHVzaGZkCi0JcG9wICBlZHgKLQl4b3IgIGVkeCxlYXgKLQlqeiAgIExfZG9udF91c2VfbW14Ci0JeG9yICBlYXgsZWF4Ci0JY3B1aWQKLQljbXAgIGVieCwwNzU2ZTY1NDdoCi0Jam5lICBMX2RvbnRfdXNlX21teAotCWNtcCAgZWN4LDA2YzY1NzQ2ZWgKLQlqbmUgIExfZG9udF91c2VfbW14Ci0JY21wICBlZHgsMDQ5NjU2ZTY5aAotCWpuZSAgTF9kb250X3VzZV9tbXgKLQltb3YgIGVheCwxCi0JY3B1aWQKLQlzaHIgIGVheCw4Ci0JYW5kICBlYXgsMTUKLQljbXAgIGVheCw2Ci0Jam5lICBMX2RvbnRfdXNlX21teAotCXRlc3QgIGVkeCwwODAwMDAwaAotCWpueiAgTF91c2VfbW14Ci0Jam1wICBMX2RvbnRfdXNlX21teAotTF91c2VfbW14OgotCW1vdiAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMgotCWptcCAgTF9jaGVja19tbXhfcG9wCi1MX2RvbnRfdXNlX21teDoKLQltb3YgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDMKLUxfY2hlY2tfbW14X3BvcDoKLQlwb3AgIGVkeAotCXBvcCAgZWN4Ci0JcG9wICBlYngKLQlwb3AgIGVheAotCWptcCAgTF9jaGVja19tbXgKLTsgNDI2ICJpbmZmYXN0LlMiCi1BTElHTiA0Ci1MX2RvX2xvb3A6Ci07IDQzNyAiaW5mZmFzdC5TIgotCWNtcCAgYmwsMTUKLQlqYSAgIExfZ2V0X2xlbmd0aF9jb2RlCi0KLQl4b3IgIGVheCxlYXgKLQlsb2RzdwotCW1vdiAgY2wsYmwKLQlhZGQgIGJsLDE2Ci0Jc2hsICBlYXgsY2wKLQlvciAgZWJwLGVheAotCi1MX2dldF9sZW5ndGhfY29kZToKLQltb3YgIGVkeCwgW2VzcCswXQotCW1vdiAgZWN4LCBbZXNwKzhdCi0JYW5kICBlZHgsZWJwCi0JbW92ICBlYXgsIFtlY3grZWR4KjRdCi0KLUxfZG9sZW46Ci0KLQotCi0KLQotCi0JbW92ICBjbCxhaAotCXN1YiAgYmwsYWgKLQlzaHIgIGVicCxjbAotCi0KLQotCi0KLQotCXRlc3QgIGFsLGFsCi0Jam56ICAgTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZQotCi0Jc2hyICBlYXgsMTYKLQlzdG9zYgotCi1MX3doaWxlX3Rlc3Q6Ci0KLQotCWNtcCAgW2VzcCsxNl0sZWRpCi0JamJlICBMX2JyZWFrX2xvb3AKLQotCWNtcCAgW2VzcCsyMF0sZXNpCi0JamEgICBMX2RvX2xvb3AKLQlqbXAgIExfYnJlYWtfbG9vcAotCi1MX3Rlc3RfZm9yX2xlbmd0aF9iYXNlOgotOyA1MDIgImluZmZhc3QuUyIKLQltb3YgIGVkeCxlYXgKLQlzaHIgIGVkeCwxNgotCW1vdiAgY2wsYWwKLQotCXRlc3QgIGFsLDE2Ci0JanogICBMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGgKLQlhbmQgIGNsLDE1Ci0JanogICBMX3NhdmVfbGVuCi0JY21wICBibCxjbAotCWphZSAgTF9hZGRfYml0c190b19sZW4KLQotCW1vdiAgY2gsY2wKLQl4b3IgIGVheCxlYXgKLQlsb2RzdwotCW1vdiAgY2wsYmwKLQlhZGQgIGJsLDE2Ci0Jc2hsICBlYXgsY2wKLQlvciAgZWJwLGVheAotCW1vdiAgY2wsY2gKLQotTF9hZGRfYml0c190b19sZW46Ci0JbW92ICBlYXgsMQotCXNobCAgZWF4LGNsCi0JZGVjICBlYXgKLQlzdWIgIGJsLGNsCi0JYW5kICBlYXgsZWJwCi0Jc2hyICBlYnAsY2wKLQlhZGQgIGVkeCxlYXgKLQotTF9zYXZlX2xlbjoKLQltb3YgIFtlc3ArMjRdLGVkeAotCi0KLUxfZGVjb2RlX2Rpc3RhbmNlOgotOyA1NDkgImluZmZhc3QuUyIKLQljbXAgIGJsLDE1Ci0JamEgICBMX2dldF9kaXN0YW5jZV9jb2RlCi0KLQl4b3IgIGVheCxlYXgKLQlsb2RzdwotCW1vdiAgY2wsYmwKLQlhZGQgIGJsLDE2Ci0Jc2hsICBlYXgsY2wKLQlvciAgZWJwLGVheAotCi1MX2dldF9kaXN0YW5jZV9jb2RlOgotCW1vdiAgZWR4LCBbZXNwKzRdCi0JbW92ICBlY3gsIFtlc3ArMTJdCi0JYW5kICBlZHgsZWJwCi0JbW92ICBlYXgsIFtlY3grZWR4KjRdCi0KLQotTF9kb2Rpc3Q6Ci0JbW92ICBlZHgsZWF4Ci0Jc2hyICBlZHgsMTYKLQltb3YgIGNsLGFoCi0Jc3ViICBibCxhaAotCXNociAgZWJwLGNsCi07IDU4NCAiaW5mZmFzdC5TIgotCW1vdiAgY2wsYWwKLQotCXRlc3QgIGFsLDE2Ci0JanogIExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3QKLQlhbmQgIGNsLDE1Ci0JanogIExfY2hlY2tfZGlzdF9vbmUKLQljbXAgIGJsLGNsCi0JamFlICBMX2FkZF9iaXRzX3RvX2Rpc3QKLQotCW1vdiAgY2gsY2wKLQl4b3IgIGVheCxlYXgKLQlsb2RzdwotCW1vdiAgY2wsYmwKLQlhZGQgIGJsLDE2Ci0Jc2hsICBlYXgsY2wKLQlvciAgZWJwLGVheAotCW1vdiAgY2wsY2gKLQotTF9hZGRfYml0c190b19kaXN0OgotCW1vdiAgZWF4LDEKLQlzaGwgIGVheCxjbAotCWRlYyAgZWF4Ci0Jc3ViICBibCxjbAotCWFuZCAgZWF4LGVicAotCXNociAgZWJwLGNsCi0JYWRkICBlZHgsZWF4Ci0Jam1wICBMX2NoZWNrX3dpbmRvdwotCi1MX2NoZWNrX3dpbmRvdzoKLTsgNjI1ICJpbmZmYXN0LlMiCi0JbW92ICBbZXNwKzQ0XSxlc2kKLQltb3YgIGVheCxlZGkKLQlzdWIgIGVheCwgW2VzcCs0MF0KLQotCWNtcCAgZWF4LGVkeAotCWpiICAgTF9jbGlwX3dpbmRvdwotCi0JbW92ICBlY3gsIFtlc3ArMjRdCi0JbW92ICBlc2ksZWRpCi0Jc3ViICBlc2ksZWR4Ci0KLQlzdWIgIGVjeCwzCi0JbW92ICBhbCwgW2VzaV0KLQltb3YgIFtlZGldLGFsCi0JbW92ICBhbCwgW2VzaSsxXQotCW1vdiAgZGwsIFtlc2krMl0KLQlhZGQgIGVzaSwzCi0JbW92ICBbZWRpKzFdLGFsCi0JbW92ICBbZWRpKzJdLGRsCi0JYWRkICBlZGksMwotCXJlcCBtb3ZzYgotCi0JbW92ICBlc2ksIFtlc3ArNDRdCi0Jam1wICBMX3doaWxlX3Rlc3QKLQotQUxJR04gNAotTF9jaGVja19kaXN0X29uZToKLQljbXAgIGVkeCwxCi0Jam5lICBMX2NoZWNrX3dpbmRvdwotCWNtcCAgW2VzcCs0MF0sZWRpCi0JamUgIExfY2hlY2tfd2luZG93Ci0KLQlkZWMgIGVkaQotCW1vdiAgZWN4LCBbZXNwKzI0XQotCW1vdiAgYWwsIFtlZGldCi0Jc3ViICBlY3gsMwotCi0JbW92ICBbZWRpKzFdLGFsCi0JbW92ICBbZWRpKzJdLGFsCi0JbW92ICBbZWRpKzNdLGFsCi0JYWRkICBlZGksNAotCXJlcCBzdG9zYgotCi0Jam1wICBMX3doaWxlX3Rlc3QKLQotQUxJR04gNAotTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoOgotCi0KLQotCi0JdGVzdCAgYWwsNjQKLQlqbnogICBMX3Rlc3RfZm9yX2VuZF9vZl9ibG9jawotCi0JbW92ICBlYXgsMQotCXNobCAgZWF4LGNsCi0JZGVjICBlYXgKLQlhbmQgIGVheCxlYnAKLQlhZGQgIGVheCxlZHgKLQltb3YgIGVkeCwgW2VzcCs4XQotCW1vdiAgZWF4LCBbZWR4K2VheCo0XQotCWptcCAgTF9kb2xlbgotCi1BTElHTiA0Ci1MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0OgotCi0KLQotCi0JdGVzdCAgYWwsNjQKLQlqbnogICBMX2ludmFsaWRfZGlzdGFuY2VfY29kZQotCi0JbW92ICBlYXgsMQotCXNobCAgZWF4LGNsCi0JZGVjICBlYXgKLQlhbmQgIGVheCxlYnAKLQlhZGQgIGVheCxlZHgKLQltb3YgIGVkeCwgW2VzcCsxMl0KLQltb3YgIGVheCwgW2VkeCtlYXgqNF0KLQlqbXAgIExfZG9kaXN0Ci0KLUFMSUdOIDQKLUxfY2xpcF93aW5kb3c6Ci07IDcyMSAiaW5mZmFzdC5TIgotCW1vdiAgZWN4LGVheAotCW1vdiAgZWF4LCBbZXNwKzUyXQotCW5lZyAgZWN4Ci0JbW92ICBlc2ksIFtlc3ArNTZdCi0KLQljbXAgIGVheCxlZHgKLQlqYiAgIExfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyCi0KLQlhZGQgIGVjeCxlZHgKLQljbXAgIGR3b3JkIHB0ciBbZXNwKzQ4XSwwCi0Jam5lICBMX3dyYXBfYXJvdW5kX3dpbmRvdwotCi0Jc3ViICBlYXgsZWN4Ci0JYWRkICBlc2ksZWF4Ci07IDc0OSAiaW5mZmFzdC5TIgotCW1vdiAgZWF4LCBbZXNwKzI0XQotCWNtcCAgZWF4LGVjeAotCWpiZSAgTF9kb19jb3B5MQotCi0Jc3ViICBlYXgsZWN4Ci0JcmVwIG1vdnNiCi0JbW92ICBlc2ksZWRpCi0Jc3ViICBlc2ksZWR4Ci0Jam1wICBMX2RvX2NvcHkxCi0KLQljbXAgIGVheCxlY3gKLQlqYmUgIExfZG9fY29weTEKLQotCXN1YiAgZWF4LGVjeAotCXJlcCBtb3ZzYgotCW1vdiAgZXNpLGVkaQotCXN1YiAgZXNpLGVkeAotCWptcCAgTF9kb19jb3B5MQotCi1MX3dyYXBfYXJvdW5kX3dpbmRvdzoKLTsgNzkzICJpbmZmYXN0LlMiCi0JbW92ICBlYXgsIFtlc3ArNDhdCi0JY21wICBlY3gsZWF4Ci0JamJlICBMX2NvbnRpZ3VvdXNfaW5fd2luZG93Ci0KLQlhZGQgIGVzaSwgW2VzcCs1Ml0KLQlhZGQgIGVzaSxlYXgKLQlzdWIgIGVzaSxlY3gKLQlzdWIgIGVjeCxlYXgKLQotCi0JbW92ICBlYXgsIFtlc3ArMjRdCi0JY21wICBlYXgsZWN4Ci0JamJlICBMX2RvX2NvcHkxCi0KLQlzdWIgIGVheCxlY3gKLQlyZXAgbW92c2IKLQltb3YgIGVzaSwgW2VzcCs1Nl0KLQltb3YgIGVjeCwgW2VzcCs0OF0KLQljbXAgIGVheCxlY3gKLQlqYmUgIExfZG9fY29weTEKLQotCXN1YiAgZWF4LGVjeAotCXJlcCBtb3ZzYgotCW1vdiAgZXNpLGVkaQotCXN1YiAgZXNpLGVkeAotCWptcCAgTF9kb19jb3B5MQotCi1MX2NvbnRpZ3VvdXNfaW5fd2luZG93OgotOyA4MzYgImluZmZhc3QuUyIKLQlhZGQgIGVzaSxlYXgKLQlzdWIgIGVzaSxlY3gKLQotCi0JbW92ICBlYXgsIFtlc3ArMjRdCi0JY21wICBlYXgsZWN4Ci0JamJlICBMX2RvX2NvcHkxCi0KLQlzdWIgIGVheCxlY3gKLQlyZXAgbW92c2IKLQltb3YgIGVzaSxlZGkKLQlzdWIgIGVzaSxlZHgKLQotTF9kb19jb3B5MToKLTsgODYyICJpbmZmYXN0LlMiCi0JbW92ICBlY3gsZWF4Ci0JcmVwIG1vdnNiCi0KLQltb3YgIGVzaSwgW2VzcCs0NF0KLQlqbXAgIExfd2hpbGVfdGVzdAotOyA4NzggImluZmZhc3QuUyIKLUFMSUdOIDQKLUxfaW5pdF9tbXg6Ci0JZW1tcwotCi0KLQotCi0KLQltb3ZkIG1tMCxlYnAKLQltb3YgIGVicCxlYngKLTsgODk2ICJpbmZmYXN0LlMiCi0JbW92ZCBtbTQsW2VzcCswXQotCW1vdnEgbW0zLG1tNAotCW1vdmQgbW01LFtlc3ArNF0KLQltb3ZxIG1tMixtbTUKLQlweG9yIG1tMSxtbTEKLQltb3YgIGVieCwgW2VzcCs4XQotCWptcCAgTF9kb19sb29wX21teAotCi1BTElHTiA0Ci1MX2RvX2xvb3BfbW14OgotCXBzcmxxIG1tMCxtbTEKLQotCWNtcCAgZWJwLDMyCi0JamEgIExfZ2V0X2xlbmd0aF9jb2RlX21teAotCi0JbW92ZCBtbTYsZWJwCi0JbW92ZCBtbTcsW2VzaV0KLQlhZGQgIGVzaSw0Ci0JcHNsbHEgbW03LG1tNgotCWFkZCAgZWJwLDMyCi0JcG9yIG1tMCxtbTcKLQotTF9nZXRfbGVuZ3RoX2NvZGVfbW14OgotCXBhbmQgbW00LG1tMAotCW1vdmQgZWF4LG1tNAotCW1vdnEgbW00LG1tMwotCW1vdiAgZWF4LCBbZWJ4K2VheCo0XQotCi1MX2RvbGVuX21teDoKLQltb3Z6eCAgZWN4LGFoCi0JbW92ZCBtbTEsZWN4Ci0Jc3ViICBlYnAsZWN4Ci0KLQl0ZXN0ICBhbCxhbAotCWpueiBMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlX21teAotCi0Jc2hyICBlYXgsMTYKLQlzdG9zYgotCi1MX3doaWxlX3Rlc3RfbW14OgotCi0KLQljbXAgIFtlc3ArMTZdLGVkaQotCWpiZSBMX2JyZWFrX2xvb3AKLQotCWNtcCAgW2VzcCsyMF0sZXNpCi0JamEgTF9kb19sb29wX21teAotCWptcCBMX2JyZWFrX2xvb3AKLQotTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZV9tbXg6Ci0KLQltb3YgIGVkeCxlYXgKLQlzaHIgIGVkeCwxNgotCi0JdGVzdCAgYWwsMTYKLQlqeiAgTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoX21teAotCWFuZCAgZWF4LDE1Ci0JanogTF9kZWNvZGVfZGlzdGFuY2VfbW14Ci0KLQlwc3JscSBtbTAsbW0xCi0JbW92ZCBtbTEsZWF4Ci0JbW92ZCBlY3gsbW0wCi0Jc3ViICBlYnAsZWF4Ci0JYW5kICBlY3gsIFtpbmZsYXRlX2Zhc3RfbWFzaytlYXgqNF0KLQlhZGQgIGVkeCxlY3gKLQotTF9kZWNvZGVfZGlzdGFuY2VfbW14OgotCXBzcmxxIG1tMCxtbTEKLQotCWNtcCAgZWJwLDMyCi0JamEgTF9nZXRfZGlzdF9jb2RlX21teAotCi0JbW92ZCBtbTYsZWJwCi0JbW92ZCBtbTcsW2VzaV0KLQlhZGQgIGVzaSw0Ci0JcHNsbHEgbW03LG1tNgotCWFkZCAgZWJwLDMyCi0JcG9yIG1tMCxtbTcKLQotTF9nZXRfZGlzdF9jb2RlX21teDoKLQltb3YgIGVieCwgW2VzcCsxMl0KLQlwYW5kIG1tNSxtbTAKLQltb3ZkIGVheCxtbTUKLQltb3ZxIG1tNSxtbTIKLQltb3YgIGVheCwgW2VieCtlYXgqNF0KLQotTF9kb2Rpc3RfbW14OgotCi0JbW92enggIGVjeCxhaAotCW1vdiAgZWJ4LGVheAotCXNociAgZWJ4LDE2Ci0Jc3ViICBlYnAsZWN4Ci0JbW92ZCBtbTEsZWN4Ci0KLQl0ZXN0ICBhbCwxNgotCWp6IExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3RfbW14Ci0JYW5kICBlYXgsMTUKLQlqeiBMX2NoZWNrX2Rpc3Rfb25lX21teAotCi1MX2FkZF9iaXRzX3RvX2Rpc3RfbW14OgotCXBzcmxxIG1tMCxtbTEKLQltb3ZkIG1tMSxlYXgKLQltb3ZkIGVjeCxtbTAKLQlzdWIgIGVicCxlYXgKLQlhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQotCWFkZCAgZWJ4LGVjeAotCi1MX2NoZWNrX3dpbmRvd19tbXg6Ci0JbW92ICBbZXNwKzQ0XSxlc2kKLQltb3YgIGVheCxlZGkKLQlzdWIgIGVheCwgW2VzcCs0MF0KLQotCWNtcCAgZWF4LGVieAotCWpiIExfY2xpcF93aW5kb3dfbW14Ci0KLQltb3YgIGVjeCxlZHgKLQltb3YgIGVzaSxlZGkKLQlzdWIgIGVzaSxlYngKLQotCXN1YiAgZWN4LDMKLQltb3YgIGFsLCBbZXNpXQotCW1vdiAgW2VkaV0sYWwKLQltb3YgIGFsLCBbZXNpKzFdCi0JbW92ICBkbCwgW2VzaSsyXQotCWFkZCAgZXNpLDMKLQltb3YgIFtlZGkrMV0sYWwKLQltb3YgIFtlZGkrMl0sZGwKLQlhZGQgIGVkaSwzCi0JcmVwIG1vdnNiCi0KLQltb3YgIGVzaSwgW2VzcCs0NF0KLQltb3YgIGVieCwgW2VzcCs4XQotCWptcCAgTF93aGlsZV90ZXN0X21teAotCi1BTElHTiA0Ci1MX2NoZWNrX2Rpc3Rfb25lX21teDoKLQljbXAgIGVieCwxCi0Jam5lICBMX2NoZWNrX3dpbmRvd19tbXgKLQljbXAgIFtlc3ArNDBdLGVkaQotCWplICAgTF9jaGVja193aW5kb3dfbW14Ci0KLQlkZWMgIGVkaQotCW1vdiAgZWN4LGVkeAotCW1vdiAgYWwsIFtlZGldCi0Jc3ViICBlY3gsMwotCi0JbW92ICBbZWRpKzFdLGFsCi0JbW92ICBbZWRpKzJdLGFsCi0JbW92ICBbZWRpKzNdLGFsCi0JYWRkICBlZGksNAotCXJlcCBzdG9zYgotCi0JbW92ICBlYngsIFtlc3ArOF0KLQlqbXAgIExfd2hpbGVfdGVzdF9tbXgKLQotQUxJR04gNAotTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoX21teDoKLQl0ZXN0ICBhbCw2NAotCWpueiBMX3Rlc3RfZm9yX2VuZF9vZl9ibG9jawotCi0JYW5kICBlYXgsMTUKLQlwc3JscSBtbTAsbW0xCi0JbW92ZCBlY3gsbW0wCi0JYW5kICBlY3gsIFtpbmZsYXRlX2Zhc3RfbWFzaytlYXgqNF0KLQlhZGQgIGVjeCxlZHgKLQltb3YgIGVheCwgW2VieCtlY3gqNF0KLQlqbXAgTF9kb2xlbl9tbXgKLQotQUxJR04gNAotTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdF9tbXg6Ci0JdGVzdCAgYWwsNjQKLQlqbnogTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUKLQotCWFuZCAgZWF4LDE1Ci0JcHNybHEgbW0wLG1tMQotCW1vdmQgZWN4LG1tMAotCWFuZCAgZWN4LCBbaW5mbGF0ZV9mYXN0X21hc2srZWF4KjRdCi0JbW92ICBlYXgsIFtlc3ArMTJdCi0JYWRkICBlY3gsZWJ4Ci0JbW92ICBlYXgsIFtlYXgrZWN4KjRdCi0Jam1wICBMX2RvZGlzdF9tbXgKLQotQUxJR04gNAotTF9jbGlwX3dpbmRvd19tbXg6Ci0KLQltb3YgIGVjeCxlYXgKLQltb3YgIGVheCwgW2VzcCs1Ml0KLQluZWcgIGVjeAotCW1vdiAgZXNpLCBbZXNwKzU2XQotCi0JY21wICBlYXgsZWJ4Ci0JamIgIExfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyCi0KLQlhZGQgIGVjeCxlYngKLQljbXAgIGR3b3JkIHB0ciBbZXNwKzQ4XSwwCi0Jam5lICBMX3dyYXBfYXJvdW5kX3dpbmRvd19tbXgKLQotCXN1YiAgZWF4LGVjeAotCWFkZCAgZXNpLGVheAotCi0JY21wICBlZHgsZWN4Ci0JamJlICBMX2RvX2NvcHkxX21teAotCi0Jc3ViICBlZHgsZWN4Ci0JcmVwIG1vdnNiCi0JbW92ICBlc2ksZWRpCi0Jc3ViICBlc2ksZWJ4Ci0Jam1wICBMX2RvX2NvcHkxX21teAotCi0JY21wICBlZHgsZWN4Ci0JamJlICBMX2RvX2NvcHkxX21teAotCi0Jc3ViICBlZHgsZWN4Ci0JcmVwIG1vdnNiCi0JbW92ICBlc2ksZWRpCi0Jc3ViICBlc2ksZWJ4Ci0Jam1wICBMX2RvX2NvcHkxX21teAotCi1MX3dyYXBfYXJvdW5kX3dpbmRvd19tbXg6Ci0KLQltb3YgIGVheCwgW2VzcCs0OF0KLQljbXAgIGVjeCxlYXgKLQlqYmUgIExfY29udGlndW91c19pbl93aW5kb3dfbW14Ci0KLQlhZGQgIGVzaSwgW2VzcCs1Ml0KLQlhZGQgIGVzaSxlYXgKLQlzdWIgIGVzaSxlY3gKLQlzdWIgIGVjeCxlYXgKLQotCi0JY21wICBlZHgsZWN4Ci0JamJlICBMX2RvX2NvcHkxX21teAotCi0Jc3ViICBlZHgsZWN4Ci0JcmVwIG1vdnNiCi0JbW92ICBlc2ksIFtlc3ArNTZdCi0JbW92ICBlY3gsIFtlc3ArNDhdCi0JY21wICBlZHgsZWN4Ci0JamJlICBMX2RvX2NvcHkxX21teAotCi0Jc3ViICBlZHgsZWN4Ci0JcmVwIG1vdnNiCi0JbW92ICBlc2ksZWRpCi0Jc3ViICBlc2ksZWJ4Ci0Jam1wICBMX2RvX2NvcHkxX21teAotCi1MX2NvbnRpZ3VvdXNfaW5fd2luZG93X21teDoKLQotCWFkZCAgZXNpLGVheAotCXN1YiAgZXNpLGVjeAotCi0KLQljbXAgIGVkeCxlY3gKLQlqYmUgIExfZG9fY29weTFfbW14Ci0KLQlzdWIgIGVkeCxlY3gKLQlyZXAgbW92c2IKLQltb3YgIGVzaSxlZGkKLQlzdWIgIGVzaSxlYngKLQotTF9kb19jb3B5MV9tbXg6Ci0KLQotCW1vdiAgZWN4LGVkeAotCXJlcCBtb3ZzYgotCi0JbW92ICBlc2ksIFtlc3ArNDRdCi0JbW92ICBlYngsIFtlc3ArOF0KLQlqbXAgIExfd2hpbGVfdGVzdF9tbXgKLTsgMTE3NCAiaW5mZmFzdC5TIgotTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGU6Ci0KLQotCi0KLQotCW1vdiAgZWN4LCBpbnZhbGlkX2Rpc3RhbmNlX2NvZGVfbXNnCi0JbW92ICBlZHgsSU5GTEFURV9NT0RFX0JBRAotCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlCi0KLUxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrOgotCi0KLQotCi0KLQl0ZXN0ICBhbCwzMgotCWp6ICBMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZQotCi0JbW92ICBlY3gsMAotCW1vdiAgZWR4LElORkxBVEVfTU9ERV9UWVBFCi0Jam1wICBMX3VwZGF0ZV9zdHJlYW1fc3RhdGUKLQotTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6Ci0KLQotCi0KLQotCW1vdiAgZWN4LCBpbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnCi0JbW92ICBlZHgsSU5GTEFURV9NT0RFX0JBRAotCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlCi0KLUxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyOgotCi0KLQotCW1vdiAgZXNpLCBbZXNwKzQ0XQotCW1vdiAgZWN4LCBpbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJfbXNnCi0JbW92ICBlZHgsSU5GTEFURV9NT0RFX0JBRAotCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlCi0KLUxfdXBkYXRlX3N0cmVhbV9zdGF0ZToKLQotCW1vdiAgZWF4LCBbZXNwKzg4XQotCXRlc3QgIGVjeCxlY3gKLQlqeiAgTF9za2lwX21zZwotCW1vdiAgW2VheCsyNF0sZWN4Ci1MX3NraXBfbXNnOgotCW1vdiAgZWF4LCBbZWF4KzI4XQotCW1vdiAgW2VheCttb2RlX3N0YXRlXSxlZHgKLQlqbXAgIExfYnJlYWtfbG9vcAotCi1BTElHTiA0Ci1MX2JyZWFrX2xvb3A6Ci07IDEyNDMgImluZmZhc3QuUyIKLQljbXAgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDIKLQlqbmUgIExfdXBkYXRlX25leHRfaW4KLQotCi0KLQltb3YgIGVieCxlYnAKLQotTF91cGRhdGVfbmV4dF9pbjoKLTsgMTI2NiAiaW5mZmFzdC5TIgotCW1vdiAgZWF4LCBbZXNwKzg4XQotCW1vdiAgZWN4LGVieAotCW1vdiAgZWR4LCBbZWF4KzI4XQotCXNociAgZWN4LDMKLQlzdWIgIGVzaSxlY3gKLQlzaGwgIGVjeCwzCi0Jc3ViICBlYngsZWN4Ci0JbW92ICBbZWF4KzEyXSxlZGkKLQltb3YgIFtlZHgrYml0c19zdGF0ZV0sZWJ4Ci0JbW92ICBlY3gsZWJ4Ci0KLQlsZWEgIGVieCwgW2VzcCsyOF0KLQljbXAgIFtlc3ArMjBdLGVieAotCWpuZSAgTF9idWZfbm90X3VzZWQKLQotCXN1YiAgZXNpLGVieAotCW1vdiAgZWJ4LCBbZWF4KzBdCi0JbW92ICBbZXNwKzIwXSxlYngKLQlhZGQgIGVzaSxlYngKLQltb3YgIGVieCwgW2VheCs0XQotCXN1YiAgZWJ4LDExCi0JYWRkICBbZXNwKzIwXSxlYngKLQotTF9idWZfbm90X3VzZWQ6Ci0JbW92ICBbZWF4KzBdLGVzaQotCi0JbW92ICBlYngsMQotCXNobCAgZWJ4LGNsCi0JZGVjICBlYngKLQotCi0KLQotCi0JY21wICBkd29yZCBwdHIgW2luZmxhdGVfZmFzdF91c2VfbW14XSwyCi0Jam5lICBMX3VwZGF0ZV9ob2xkCi0KLQotCi0JcHNybHEgbW0wLG1tMQotCW1vdmQgZWJwLG1tMAotCi0JZW1tcwotCi1MX3VwZGF0ZV9ob2xkOgotCi0KLQotCWFuZCAgZWJwLGVieAotCW1vdiAgW2VkeCtob2xkX3N0YXRlXSxlYnAKLQotCi0KLQotCW1vdiAgZWJ4LCBbZXNwKzIwXQotCWNtcCAgZWJ4LGVzaQotCWpiZSAgTF9sYXN0X2lzX3NtYWxsZXIKLQotCXN1YiAgZWJ4LGVzaQotCWFkZCAgZWJ4LDExCi0JbW92ICBbZWF4KzRdLGVieAotCWptcCAgTF9maXh1cF9vdXQKLUxfbGFzdF9pc19zbWFsbGVyOgotCXN1YiAgZXNpLGVieAotCW5lZyAgZXNpCi0JYWRkICBlc2ksMTEKLQltb3YgIFtlYXgrNF0sZXNpCi0KLQotCi0KLUxfZml4dXBfb3V0OgotCi0JbW92ICBlYngsIFtlc3ArMTZdCi0JY21wICBlYngsZWRpCi0JamJlICBMX2VuZF9pc19zbWFsbGVyCi0KLQlzdWIgIGVieCxlZGkKLQlhZGQgIGVieCwyNTcKLQltb3YgIFtlYXgrMTZdLGVieAotCWptcCAgTF9kb25lCi1MX2VuZF9pc19zbWFsbGVyOgotCXN1YiAgZWRpLGVieAotCW5lZyAgZWRpCi0JYWRkICBlZGksMjU3Ci0JbW92ICBbZWF4KzE2XSxlZGkKLQotCi0KLQotCi1MX2RvbmU6Ci0JYWRkICBlc3AsNjQKLQlwb3BmZAotCXBvcCAgZWJ4Ci0JcG9wICBlYnAKLQlwb3AgIGVzaQotCXBvcCAgZWRpCi0JcmV0Ci0KLV9URVhUCWVuZHMKLWVuZApkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5vYmogYi9saWJzL3psaWIvY29udHJpYi9tYXNteDg2L2luZmZhczMyLm9iagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2NjY0ZC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9tYXNteDg2L2luZmZhczMyLm9iagorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21hc214ODYvbWthc20uYmF0IGIvbGlicy96bGliL2NvbnRyaWIvbWFzbXg4Ni9ta2FzbS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZjU2OWQuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvbWFzbXg4Ni9ta2FzbS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWNsIC9EQVNNViAvSS4uXC4uIC9PMiAvYyBndm1hdDMyYy5jCi1tbCAvY29mZiAvWmkgL2MgL0ZsZ3ZtYXQzMi5sc3QgZ3ZtYXQzMi5hc20KLW1sIC9jb2ZmIC9aaSAvYyAvRmxpbmZmYXMzMi5sc3QgaW5mZmFzMzIuYXNtCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9tYXNteDg2L3JlYWRtZS50eHQgYi9saWJzL3psaWIvY29udHJpYi9tYXNteDg2L3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTcxNjcuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvbWFzbXg4Ni9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCi1TdW1tYXJ5Ci0tLS0tLS0tCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBBU00gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmdW5jdGlvbnMKLWxvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCkuCi0KLQotVXNlIGluc3RydWN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLQotQ29weSB0aGVzZSBmaWxlcyBpbnRvIHRoZSB6bGliIHNvdXJjZSBkaXJlY3RvcnksIHRoZW4gcnVuIHRoZQotYXBwcm9wcmlhdGUgbWFrZWZpbGUsIGFzIHN1Z2dlc3RlZCBiZWxvdy4KLQotCi1CdWlsZCBpbnN0cnVjdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBXaXRoIE1pY3Jvc29mdCBDIGFuZCBNQVNNOgotbm1ha2UgLWYgd2luMzIvTWFrZWZpbGUubXNjIExPQz0iLURBU01WIC1EQVNNSU5GIiBPQkpBPSJndm1hdDMyYy5vYmogZ3ZtYXQzMi5vYmogaW5mZmFzMzIub2JqIgotCi0qIFdpdGggQm9ybGFuZCBDIGFuZCBUQVNNOgotbWFrZSAtZiB3aW4zMi9NYWtlZmlsZS5ib3IgTE9DQUxfWkxJQj0iLURBU01WIC1EQVNNSU5GIiBPQkpBPSJndm1hdDMyYy5vYmogZ3ZtYXQzMi5vYmogaW5mZmFzMzIub2JqIiBPQkpQQT0iK2d2bWF0MzJjLm9iaitndm1hdDMyLm9iaitpbmZmYXMzMi5vYmoiCi0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvQ2hhbmdlTG9nVW56aXAgYi9saWJzL3psaWIvY29udHJpYi9taW5pemlwL0NoYW5nZUxvZ1VuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGNhNmE5Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvQ2hhbmdlTG9nVW56aXAKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1DaGFuZ2UgaW4gMS4wMWUgKDEyIGZlYiAwNSkKLS0gRml4IGluIHppcE9wZW4yIGZvciBnbG9iYWxjb21tZW50IChSb2xmIEthbGJlcm1hdHRlcikKLS0gRml4IHBvc3NpYmxlIG1lbW9yeSBsZWFrIGluIHVuemlwLmMgKFpvcmFuIFN0ZXZhbm92aWMpCi0KLUNoYW5nZSBpbiAxLjAxYiAoMjAgbWF5IDA0KQotLSBJbnRlZ3JhdGUgcGF0Y2ggZnJvbSBEZWJpYW4gcGFja2FnZSAoc3VibWl0ZWQgYnkgTWFyayBCcm93bikKLS0gQWRkIHRvb2xzIG16dG9vbHMgZnJvbSBYYXZpZXIgUm9jaGUKLQotQ2hhbmdlIGluIDEuMDEgKDggbWF5IDA0KQotLSBmaXggYnVmZmVyIG92ZXJydW4gcmlzayBpbiB1bnppcC5jIChYYXZpZXIgUm9jaGUpCi0tIGZpeCBhIG1pbm9yIGJ1ZmZlciBpbnNlY3VyaXR5IGluIG1pbml6aXAuYyAoTWlrZSBXaGl0dGFrZXIpCi0KLUNoYW5nZSBpbiAxLjAwOiAoMTAgc2VwdCAwMykKLS0gcmVuYW1lIHRvIDEuMDAKLS0gY29zbWV0aWMgY29kZSBjaGFuZ2UKLQotQ2hhbmdlIGluIDAuMjI6ICgxOSBNYXkgMDMpCi0tIGNyeXB0aW5nIHN1cHBvcnQgKHVubGVzcyB5b3UgZGVmaW5lIE5PQ1JZUFQpCi0tIGFwcGVuZCBmaWxlIGluIGV4aXN0aW5nIHppcGZpbGUKLQotQ2hhbmdlIGluIDAuMjE6ICgxMCBNYXIgMDMpCi0tIGJ1ZyBmaXhlcwotCi1DaGFuZ2UgaW4gMC4xNzogKDI3IEphbiAwMikKLS0gYnVnIGZpeGVzCi0KLUNoYW5nZSBpbiAwLjE2OiAoMTkgSmFuIDAyKQotLSBTdXBwb3J0IG9mIGlvYXBpIGZvciB2aXJ0dWFsaXplIHppcCBmaWxlIGFjY2VzcwotCi1DaGFuZ2UgaW4gMC4xNTogKDE5IE1hciA5OCkKLS0gZml4IG1lbW9yeSBsZWFrIGluIG1pbml6aXAuYwotCi1DaGFuZ2UgaW4gMC4xNDogKDEwIE1hciA5OCkKLS0gZml4IGJ1Z3MgaW4gbWluaXppcC5jIHNhbXBsZSBmb3IgemlwcGluZyBiaWcgZmlsZQotLSBmaXggcHJvYmxlbSBpbiBtb250aCBpbiBkYXRlIGhhbmRsaW5nCi0tIGZpeCBidWcgaW4gdW56bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwgaW4gdW56aXAuYyBmb3IKLSAgICBjb21tZW50IGhhbmRsaW5nCi0KLUNoYW5nZSBpbiAwLjEzOiAoNiBNYXIgOTgpCi0tIGZpeCBidWdzIGluIHppcC5jCi0tIGFkZCByZWFsIG1pbml6aXAgc2FtcGxlCi0KLUNoYW5nZSBpbiAwLjEyOiAoNCBNYXIgOTgpCi0tIGFkZCB6aXAuYyBhbmQgemlwLmggZm9yIGNyZWF0ZXMgLnppcCBmaWxlCi0tIGZpeCBjaGFuZ2VfZmlsZV9kYXRlIGluIG1pbml1bnouYyBmb3IgVW5peCAoSmVhbi1sb3VwIEdhaWxseSkKLS0gZml4IG1pbml1bnouYyBmb3IgZmlsZSB3aXRob3V0IHNwZWNpZmljIHJlY29yZCBmb3IgZGlyZWN0b3J5Ci0KLUNoYW5nZSBpbiAwLjExOiAoMyBNYXIgOTgpCi0tIGZpeCBidWcgaW4gdW56R2V0Q3VycmVudEZpbGVJbmZvIGZvciBnZXQgZXh0cmEgZmllbGQgYW5kIGNvbW1lbnQKLS0gZW5oYW5jZSBtaW5pdW56IHNhbXBsZSwgcmVtb3ZlIHRoZSBiYWQgdW56dHN0LmMgc2FtcGxlCi0KLUNoYW5nZSBpbiAwLjEwOiAoMiBNYXIgOTgpCi0tIGZpeCBidWcgaW4gdW56UmVhZEN1cnJlbnRGaWxlCi0tIHJlbmFtZSB1bnppcCogdG8gdW56KiBmdW5jdGlvbiBhbmQgc3RydWN0dXJlCi0tIHJlbW92ZSBXaW5kb3dzLWxpa2UgaHVuZ2FyeSBub3RhdGlvbiB2YXJpYWJsZSBuYW1lCi0tIG1vZGlmeSBzb21lIHN0cnVjdHVyZSBpbiB1bnppcC5oCi0tIGFkZCBzb21lcyBjb21tZW50IGluIHNvdXJjZQotLSByZW1vdmUgdW56aXBHZXRjQ3VycmVudEZpbGUgZnVuY3Rpb24KLS0gcmVwbGFjZSBaVU5aRVhQT1JUIGJ5IFpFWFBPUlQKLS0gYWRkIHVuekdldExvY2FsRXh0cmFmaWVsZCBmb3IgZ2V0IHRoZSBsb2NhbCBleHRyYWZpZWxkIGluZm8KLS0gYWRkIGEgbmV3IHNhbXBsZSwgbWluaXVuei5jCi0KLUNoYW5nZSBpbiAwLjQ6ICgyNSBGZWIgOTgpCi0tIHN1cHByZXNzIHRoZSB0eXBlIHVuemlwRmlsZUluWmlwLgotICBPbmx5IG9uIGZpbGUgaW4gdGhlIHppcGZpbGUgY2FuIGJlIG9wZW4gYXQgdGhlIHNhbWUgdGltZQotLSBmaXggc29tZXMgdHlwbyBpbiBjb2RlCi0tIGFkZGVkIHRtX3VueiBzdHJ1Y3R1cmUgaW4gdW56aXBfZmlsZV9pbmZvIChkYXRlL3RpbWUgaW4gcmVhZGFibGUgZm9ybWF0KQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC9jcnlwdC5oIGIvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC9jcnlwdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjJmNGJjLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvY3J5cHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKiBjcnlwdC5oIC0tIGJhc2UgY29kZSBmb3IgY3J5cHQvdW5jcnlwdCBaSVBmaWxlCi0KLQotICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNSBHaWxsZXMgVm9sbGFudAotCi0gICBUaGlzIGNvZGUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGNyeXB0aW5nIGNvZGUgaW4gSW5mb3ppcCBkaXN0cmlidXRpb24KLQotICAgVGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwYXJ0cyBvZiB0aGlzIHNvdXJjZSBjb2RlIChhcyBvcHBvc2VkIHRvIHRoZQotICAgbm9uLWVjaG9pbmcgcGFzc3dvcmQgcGFydHMpIHdlcmUgb3JpZ2luYWxseSB3cml0dGVuIGluIEV1cm9wZS4gIFRoZQotICAgd2hvbGUgc291cmNlIHBhY2thZ2UgY2FuIGJlIGZyZWVseSBkaXN0cmlidXRlZCwgaW5jbHVkaW5nIGZyb20gdGhlIFVTQS4KLSAgIChQcmlvciB0byBKYW51YXJ5IDIwMDAsIHJlLWV4cG9ydCBmcm9tIHRoZSBVUyB3YXMgYSB2aW9sYXRpb24gb2YgVVMgbGF3LikKLQotICAgVGhpcyBlbmNyeXB0aW9uIGNvZGUgaXMgYSBkaXJlY3QgdHJhbnNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtIGZyb20KLSAgIFJvZ2VyIFNjaGxhZmx5LCBkZXNjcmliZWQgYnkgUGhpbCBLYXR6IGluIHRoZSBmaWxlIGFwcG5vdGUudHh0LiAgVGhpcwotICAgZmlsZSAoYXBwbm90ZS50eHQpIGlzIGRpc3RyaWJ1dGVkIHdpdGggdGhlIFBLWklQIHByb2dyYW0gKGV2ZW4gaW4gdGhlCi0gICB2ZXJzaW9uIHdpdGhvdXQgZW5jcnlwdGlvbiBjYXBhYmlsaXRpZXMpLgotCi0gICBJZiB5b3UgZG9uJ3QgbmVlZCBjcnlwdGluZyBpbiB5b3VyIGFwcGxpY2F0aW9uLCBqdXN0IGRlZmluZSBzeW1ib2xzCi0gICBOT0NSWVBUIGFuZCBOT1VOQ1JZUFQuCi0KLSAgIFRoaXMgY29kZSBzdXBwb3J0IHRoZSAiVHJhZGl0aW9uYWwgUEtXQVJFIEVuY3J5cHRpb24iLgotCi0gICBUaGUgbmV3IEFFUyBlbmNyeXB0aW9uIGFkZGVkIG9uIFppcCBmb3JtYXQgYnkgV2luemlwIChzZWUgdGhlIHBhZ2UKLSAgIGh0dHA6Ly93d3cud2luemlwLmNvbS9hZXNfaW5mby5odG0gKSBhbmQgUEtXYXJlIFBLWmlwIDUueCBTdHJvbmcKLSAgIEVuY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZC4KLSovCi0KLSNkZWZpbmUgQ1JDMzIoYywgYikgKCgqKHBjcmNfMzJfdGFiKygoKGludCkoYykgXiAoYikpICYgMHhmZikpKSBeICgoYykgPj4gOCkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmV0dXJuIHRoZSBuZXh0IGJ5dGUgaW4gdGhlIHBzZXVkby1yYW5kb20gc2VxdWVuY2UKLSAqLwotc3RhdGljIGludCBkZWNyeXB0X2J5dGUodW5zaWduZWQgbG9uZyogcGtleXMsIGNvbnN0IHVuc2lnbmVkIGxvbmcqIHBjcmNfMzJfdGFiKQotewotICAgIHVuc2lnbmVkIHRlbXA7ICAvKiBQT1RFTlRJQUwgQlVHOiAgdGVtcCoodGVtcF4xKSBtYXkgb3ZlcmZsb3cgaW4gYW4KLSAgICAgICAgICAgICAgICAgICAgICogdW5wcmVkaWN0YWJsZSBtYW5uZXIgb24gMTYtYml0IHN5c3RlbXM7IG5vdCBhIHByb2JsZW0KLSAgICAgICAgICAgICAgICAgICAgICogd2l0aCBhbnkga25vd24gY29tcGlsZXIgc28gZmFyLCB0aG91Z2ggKi8KLQotICAgIHRlbXAgPSAoKHVuc2lnbmVkKSgqKHBrZXlzKzIpKSAmIDB4ZmZmZikgfCAyOwotICAgIHJldHVybiAoaW50KSgoKHRlbXAgKiAodGVtcCBeIDEpKSA+PiA4KSAmIDB4ZmYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFVwZGF0ZSB0aGUgZW5jcnlwdGlvbiBrZXlzIHdpdGggdGhlIG5leHQgYnl0ZSBvZiBwbGFpbiB0ZXh0Ci0gKi8KLXN0YXRpYyBpbnQgdXBkYXRlX2tleXModW5zaWduZWQgbG9uZyogcGtleXMsY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWIsaW50IGMpCi17Ci0gICAgKCoocGtleXMrMCkpID0gQ1JDMzIoKCoocGtleXMrMCkpLCBjKTsKLSAgICAoKihwa2V5cysxKSkgKz0gKCoocGtleXMrMCkpICYgMHhmZjsKLSAgICAoKihwa2V5cysxKSkgPSAoKihwa2V5cysxKSkgKiAxMzQ3NzU4MTNMICsgMTsKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQga2V5c2hpZnQgPSAoaW50KSgoKihwa2V5cysxKSkgPj4gMjQpOwotICAgICAgKCoocGtleXMrMikpID0gQ1JDMzIoKCoocGtleXMrMikpLCBrZXlzaGlmdCk7Ci0gICAgfQotICAgIHJldHVybiBjOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW5pdGlhbGl6ZSB0aGUgZW5jcnlwdGlvbiBrZXlzIGFuZCB0aGUgcmFuZG9tIGhlYWRlciBhY2NvcmRpbmcgdG8KLSAqIHRoZSBnaXZlbiBwYXNzd29yZC4KLSAqLwotc3RhdGljIHZvaWQgaW5pdF9rZXlzKGNvbnN0IGNoYXIqIHBhc3N3ZCx1bnNpZ25lZCBsb25nKiBwa2V5cyxjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYikKLXsKLSAgICAqKHBrZXlzKzApID0gMzA1NDE5ODk2TDsKLSAgICAqKHBrZXlzKzEpID0gNTkxNzUxMDQ5TDsKLSAgICAqKHBrZXlzKzIpID0gODc4MDgyMTkyTDsKLSAgICB3aGlsZSAoKnBhc3N3ZCAhPSAnXDAnKSB7Ci0gICAgICAgIHVwZGF0ZV9rZXlzKHBrZXlzLHBjcmNfMzJfdGFiLChpbnQpKnBhc3N3ZCk7Ci0gICAgICAgIHBhc3N3ZCsrOwotICAgIH0KLX0KLQotI2RlZmluZSB6ZGVjb2RlKHBrZXlzLHBjcmNfMzJfdGFiLGMpIFwKLSAgICAodXBkYXRlX2tleXMocGtleXMscGNyY18zMl90YWIsYyBePSBkZWNyeXB0X2J5dGUocGtleXMscGNyY18zMl90YWIpKSkKLQotI2RlZmluZSB6ZW5jb2RlKHBrZXlzLHBjcmNfMzJfdGFiLGMsdCkgXAotICAgICh0PWRlY3J5cHRfYnl0ZShwa2V5cyxwY3JjXzMyX3RhYiksIHVwZGF0ZV9rZXlzKHBrZXlzLHBjcmNfMzJfdGFiLGMpLCB0XihjKSkKLQotI2lmZGVmIElOQ0xVREVDUllQVElOR0NPREVfSUZDUllQVEFMTE9XRUQKLQotI2RlZmluZSBSQU5EX0hFQURfTEVOICAxMgotICAgLyogImxhc3QgcmVzb3J0IiBzb3VyY2UgZm9yIHNlY29uZCBwYXJ0IG9mIGNyeXB0IHNlZWQgcGF0dGVybiAqLwotIyAgaWZuZGVmIFpDUl9TRUVEMgotIyAgICBkZWZpbmUgWkNSX1NFRUQyIDMxNDE1OTI2NTRVTCAgICAgLyogdXNlIFBJIGFzIGRlZmF1bHQgcGF0dGVybiAqLwotIyAgZW5kaWYKLQotc3RhdGljIGludCBjcnlwdGhlYWQocGFzc3dkLCBidWYsIGJ1ZlNpemUsIHBrZXlzLCBwY3JjXzMyX3RhYiwgY3JjRm9yQ3J5cHRpbmcpCi0gICAgY29uc3QgY2hhciAqcGFzc3dkOyAgICAgICAgIC8qIHBhc3N3b3JkIHN0cmluZyAqLwotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsgICAgICAgICAvKiB3aGVyZSB0byB3cml0ZSBoZWFkZXIgKi8KLSAgICBpbnQgYnVmU2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nKiBwa2V5czsKLSAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYjsKLSAgICB1bnNpZ25lZCBsb25nIGNyY0ZvckNyeXB0aW5nOwotewotICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW4gcmFuZG9tIGhlYWRlciAqLwotICAgIGludCB0OyAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5ICovCi0gICAgaW50IGM7ICAgICAgICAgICAgICAgICAgICAgICAvKiByYW5kb20gYnl0ZSAqLwotICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyW1JBTkRfSEVBRF9MRU4tMl07IC8qIHJhbmRvbSBoZWFkZXIgKi8KLSAgICBzdGF0aWMgdW5zaWduZWQgY2FsbHMgPSAwOyAgIC8qIGVuc3VyZSBkaWZmZXJlbnQgcmFuZG9tIGhlYWRlciBlYWNoIHRpbWUgKi8KLQotICAgIGlmIChidWZTaXplPFJBTkRfSEVBRF9MRU4pCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8qIEZpcnN0IGdlbmVyYXRlIFJBTkRfSEVBRF9MRU4tMiByYW5kb20gYnl0ZXMuIFdlIGVuY3J5cHQgdGhlCi0gICAgICogb3V0cHV0IG9mIHJhbmQoKSB0byBnZXQgbGVzcyBwcmVkaWN0YWJpbGl0eSwgc2luY2UgcmFuZCgpIGlzCi0gICAgICogb2Z0ZW4gcG9vcmx5IGltcGxlbWVudGVkLgotICAgICAqLwotICAgIGlmICgrK2NhbGxzID09IDEpCi0gICAgewotICAgICAgICBzcmFuZCgodW5zaWduZWQpKHRpbWUoTlVMTCkgXiBaQ1JfU0VFRDIpKTsKLSAgICB9Ci0gICAgaW5pdF9rZXlzKHBhc3N3ZCwgcGtleXMsIHBjcmNfMzJfdGFiKTsKLSAgICBmb3IgKG4gPSAwOyBuIDwgUkFORF9IRUFEX0xFTi0yOyBuKyspCi0gICAgewotICAgICAgICBjID0gKHJhbmQoKSA+PiA3KSAmIDB4ZmY7Ci0gICAgICAgIGhlYWRlcltuXSA9ICh1bnNpZ25lZCBjaGFyKXplbmNvZGUocGtleXMsIHBjcmNfMzJfdGFiLCBjLCB0KTsKLSAgICB9Ci0gICAgLyogRW5jcnlwdCByYW5kb20gaGVhZGVyIChsYXN0IHR3byBieXRlcyBpcyBoaWdoIHdvcmQgb2YgY3JjKSAqLwotICAgIGluaXRfa2V5cyhwYXNzd2QsIHBrZXlzLCBwY3JjXzMyX3RhYik7Ci0gICAgZm9yIChuID0gMDsgbiA8IFJBTkRfSEVBRF9MRU4tMjsgbisrKQotICAgIHsKLSAgICAgICAgYnVmW25dID0gKHVuc2lnbmVkIGNoYXIpemVuY29kZShwa2V5cywgcGNyY18zMl90YWIsIGhlYWRlcltuXSwgdCk7Ci0gICAgfQotICAgIGJ1ZltuKytdID0gemVuY29kZShwa2V5cywgcGNyY18zMl90YWIsIChpbnQpKGNyY0ZvckNyeXB0aW5nID4+IDE2KSAmIDB4ZmYsIHQpOwotICAgIGJ1ZltuKytdID0gemVuY29kZShwa2V5cywgcGNyY18zMl90YWIsIChpbnQpKGNyY0ZvckNyeXB0aW5nID4+IDI0KSAmIDB4ZmYsIHQpOwotICAgIHJldHVybiBuOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvaW9hcGkuYyBiL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvaW9hcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiZWUyMy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9taW5pemlwL2lvYXBpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyogaW9hcGkuYyAtLSBJTyBiYXNlIGZ1bmN0aW9uIGhlYWRlciBmb3IgY29tcHJlc3MvdW5jb21wcmVzcyAuemlwCi0gICBmaWxlcyB1c2luZyB6bGliICsgemlwIG9yIHVuemlwIEFQSQotCi0gICBWZXJzaW9uIDEuMDFlLCBGZWJydWFyeSAxMnRoLCAyMDA1Ci0KLSAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA1IEdpbGxlcyBWb2xsYW50Ci0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInpsaWIuaCIKLSNpbmNsdWRlICJpb2FwaS5oIgotCi0KLQotLyogSSd2ZSBmb3VuZCBhbiBvbGQgVW5peCAoYSBTdW5PUyA0LjEuM19VMSkgd2l0aG91dCBhbGwgU0VFS18qIGRlZmluZWQuLi4uICovCi0KLSNpZm5kZWYgU0VFS19DVVIKLSNkZWZpbmUgU0VFS19DVVIgICAgMQotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19FTkQKLSNkZWZpbmUgU0VFS19FTkQgICAgMgotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQKLSNkZWZpbmUgU0VFS19TRVQgICAgMAotI2VuZGlmCi0KLXZvaWRwZiBaQ0FMTEJBQ0sgZm9wZW5fZmlsZV9mdW5jIE9GKCgKLSAgIHZvaWRwZiBvcGFxdWUsCi0gICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgIGludCBtb2RlKSk7Ci0KLXVMb25nIFpDQUxMQkFDSyBmcmVhZF9maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIHZvaWRwZiBzdHJlYW0sCi0gICB2b2lkKiBidWYsCi0gICB1TG9uZyBzaXplKSk7Ci0KLXVMb25nIFpDQUxMQkFDSyBmd3JpdGVfZmlsZV9mdW5jIE9GKCgKLSAgIHZvaWRwZiBvcGFxdWUsCi0gICB2b2lkcGYgc3RyZWFtLAotICAgY29uc3Qgdm9pZCogYnVmLAotICAgdUxvbmcgc2l6ZSkpOwotCi1sb25nIFpDQUxMQkFDSyBmdGVsbF9maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIHZvaWRwZiBzdHJlYW0pKTsKLQotbG9uZyBaQ0FMTEJBQ0sgZnNlZWtfZmlsZV9mdW5jIE9GKCgKLSAgIHZvaWRwZiBvcGFxdWUsCi0gICB2b2lkcGYgc3RyZWFtLAotICAgdUxvbmcgb2Zmc2V0LAotICAgaW50IG9yaWdpbikpOwotCi1pbnQgWkNBTExCQUNLIGZjbG9zZV9maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIHZvaWRwZiBzdHJlYW0pKTsKLQotaW50IFpDQUxMQkFDSyBmZXJyb3JfZmlsZV9mdW5jIE9GKCgKLSAgIHZvaWRwZiBvcGFxdWUsCi0gICB2b2lkcGYgc3RyZWFtKSk7Ci0KLQotdm9pZHBmIFpDQUxMQkFDSyBmb3Blbl9maWxlX2Z1bmMgKG9wYXF1ZSwgZmlsZW5hbWUsIG1vZGUpCi0gICB2b2lkcGYgb3BhcXVlOwotICAgY29uc3QgY2hhciogZmlsZW5hbWU7Ci0gICBpbnQgbW9kZTsKLXsKLSAgICBGSUxFKiBmaWxlID0gTlVMTDsKLSAgICBjb25zdCBjaGFyKiBtb2RlX2ZvcGVuID0gTlVMTDsKLSAgICBpZiAoKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfUkVBRFdSSVRFRklMVEVSKT09WkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQpCi0gICAgICAgIG1vZGVfZm9wZW4gPSAicmIiOwotICAgIGVsc2UKLSAgICBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORykKLSAgICAgICAgbW9kZV9mb3BlbiA9ICJyK2IiOwotICAgIGVsc2UKLSAgICBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUpCi0gICAgICAgIG1vZGVfZm9wZW4gPSAid2IiOwotCi0gICAgaWYgKChmaWxlbmFtZSE9TlVMTCkgJiYgKG1vZGVfZm9wZW4gIT0gTlVMTCkpCi0gICAgICAgIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgbW9kZV9mb3Blbik7Ci0gICAgcmV0dXJuIGZpbGU7Ci19Ci0KLQotdUxvbmcgWkNBTExCQUNLIGZyZWFkX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0sIGJ1Ziwgc2l6ZSkKLSAgIHZvaWRwZiBvcGFxdWU7Ci0gICB2b2lkcGYgc3RyZWFtOwotICAgdm9pZCogYnVmOwotICAgdUxvbmcgc2l6ZTsKLXsKLSAgICB1TG9uZyByZXQ7Ci0gICAgcmV0ID0gKHVMb25nKWZyZWFkKGJ1ZiwgMSwgKHNpemVfdClzaXplLCAoRklMRSAqKXN0cmVhbSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotCi11TG9uZyBaQ0FMTEJBQ0sgZndyaXRlX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0sIGJ1Ziwgc2l6ZSkKLSAgIHZvaWRwZiBvcGFxdWU7Ci0gICB2b2lkcGYgc3RyZWFtOwotICAgY29uc3Qgdm9pZCogYnVmOwotICAgdUxvbmcgc2l6ZTsKLXsKLSAgICB1TG9uZyByZXQ7Ci0gICAgcmV0ID0gKHVMb25nKWZ3cml0ZShidWYsIDEsIChzaXplX3Qpc2l6ZSwgKEZJTEUgKilzdHJlYW0pOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLWxvbmcgWkNBTExCQUNLIGZ0ZWxsX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0pCi0gICB2b2lkcGYgb3BhcXVlOwotICAgdm9pZHBmIHN0cmVhbTsKLXsKLSAgICBsb25nIHJldDsKLSAgICByZXQgPSBmdGVsbCgoRklMRSAqKXN0cmVhbSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotbG9uZyBaQ0FMTEJBQ0sgZnNlZWtfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCi0gICB2b2lkcGYgb3BhcXVlOwotICAgdm9pZHBmIHN0cmVhbTsKLSAgIHVMb25nIG9mZnNldDsKLSAgIGludCBvcmlnaW47Ci17Ci0gICAgaW50IGZzZWVrX29yaWdpbj0wOwotICAgIGxvbmcgcmV0OwotICAgIHN3aXRjaCAob3JpZ2luKQotICAgIHsKLSAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOgotICAgICAgICBmc2Vla19vcmlnaW4gPSBTRUVLX0NVUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfRU5EIDoKLSAgICAgICAgZnNlZWtfb3JpZ2luID0gU0VFS19FTkQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCA6Ci0gICAgICAgIGZzZWVrX29yaWdpbiA9IFNFRUtfU0VUOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OiByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldCA9IDA7Ci0gICAgZnNlZWsoKEZJTEUgKilzdHJlYW0sIG9mZnNldCwgZnNlZWtfb3JpZ2luKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgWkNBTExCQUNLIGZjbG9zZV9maWxlX2Z1bmMgKG9wYXF1ZSwgc3RyZWFtKQotICAgdm9pZHBmIG9wYXF1ZTsKLSAgIHZvaWRwZiBzdHJlYW07Ci17Ci0gICAgaW50IHJldDsKLSAgICByZXQgPSBmY2xvc2UoKEZJTEUgKilzdHJlYW0pOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBaQ0FMTEJBQ0sgZmVycm9yX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0pCi0gICB2b2lkcGYgb3BhcXVlOwotICAgdm9pZHBmIHN0cmVhbTsKLXsKLSAgICBpbnQgcmV0OwotICAgIHJldCA9IGZlcnJvcigoRklMRSAqKXN0cmVhbSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBmaWxsX2ZvcGVuX2ZpbGVmdW5jIChwemxpYl9maWxlZnVuY19kZWYpCi0gIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Ci17Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56b3Blbl9maWxlID0gZm9wZW5fZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enJlYWRfZmlsZSA9IGZyZWFkX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnp3cml0ZV9maWxlID0gZndyaXRlX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnp0ZWxsX2ZpbGUgPSBmdGVsbF9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56c2Vla19maWxlID0gZnNlZWtfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emNsb3NlX2ZpbGUgPSBmY2xvc2VfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSBmZXJyb3JfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+b3BhcXVlID0gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvaW9hcGkuaCBiL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvaW9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0NTdiYS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9taW5pemlwL2lvYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBpb2FwaS5oIC0tIElPIGJhc2UgZnVuY3Rpb24gaGVhZGVyIGZvciBjb21wcmVzcy91bmNvbXByZXNzIC56aXAKLSAgIGZpbGVzIHVzaW5nIHpsaWIgKyB6aXAgb3IgdW56aXAgQVBJCi0KLSAgIFZlcnNpb24gMS4wMWUsIEZlYnJ1YXJ5IDEydGgsIDIwMDUKLQotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDUgR2lsbGVzIFZvbGxhbnQKLSovCi0KLSNpZm5kZWYgX1pMSUJJT0FQSV9ICi0jZGVmaW5lIF9aTElCSU9BUElfSAotCi0KLSNkZWZpbmUgWkxJQl9GSUxFRlVOQ19TRUVLX0NVUiAoMSkKLSNkZWZpbmUgWkxJQl9GSUxFRlVOQ19TRUVLX0VORCAoMikKLSNkZWZpbmUgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCAoMCkKLQotI2RlZmluZSBaTElCX0ZJTEVGVU5DX01PREVfUkVBRCAgICAgICgxKQotI2RlZmluZSBaTElCX0ZJTEVGVU5DX01PREVfV1JJVEUgICAgICgyKQotI2RlZmluZSBaTElCX0ZJTEVGVU5DX01PREVfUkVBRFdSSVRFRklMVEVSICgzKQotCi0jZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORyAoNCkKLSNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX0NSRUFURSAgICg4KQotCi0KLSNpZm5kZWYgWkNBTExCQUNLCi0KLSNpZiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZCAoV0lORE9XUykgfHwgZGVmaW5lZCAoX1dJTkRPV1MpKSAmJiBkZWZpbmVkKENBTExCQUNLKSAmJiBkZWZpbmVkIChVU0VXSU5ET1dTX0NBTExCQUNLKQotI2RlZmluZSBaQ0FMTEJBQ0sgQ0FMTEJBQ0sKLSNlbHNlCi0jZGVmaW5lIFpDQUxMQkFDSwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi10eXBlZGVmIHZvaWRwZiAoWkNBTExCQUNLICpvcGVuX2ZpbGVfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbW9kZSkpOwotdHlwZWRlZiB1TG9uZyAgKFpDQUxMQkFDSyAqcmVhZF9maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB2b2lkKiBidWYsIHVMb25nIHNpemUpKTsKLXR5cGVkZWYgdUxvbmcgIChaQ0FMTEJBQ0sgKndyaXRlX2ZpbGVfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sIGNvbnN0IHZvaWQqIGJ1ZiwgdUxvbmcgc2l6ZSkpOwotdHlwZWRlZiBsb25nICAgKFpDQUxMQkFDSyAqdGVsbF9maWxlX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKSk7Ci10eXBlZGVmIGxvbmcgICAoWkNBTExCQUNLICpzZWVrX2ZpbGVfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sIHVMb25nIG9mZnNldCwgaW50IG9yaWdpbikpOwotdHlwZWRlZiBpbnQgICAgKFpDQUxMQkFDSyAqY2xvc2VfZmlsZV9mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOwotdHlwZWRlZiBpbnQgICAgKFpDQUxMQkFDSyAqdGVzdGVycm9yX2ZpbGVfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKLQotdHlwZWRlZiBzdHJ1Y3QgemxpYl9maWxlZnVuY19kZWZfcwotewotICAgIG9wZW5fZmlsZV9mdW5jICAgICAgem9wZW5fZmlsZTsKLSAgICByZWFkX2ZpbGVfZnVuYyAgICAgIHpyZWFkX2ZpbGU7Ci0gICAgd3JpdGVfZmlsZV9mdW5jICAgICB6d3JpdGVfZmlsZTsKLSAgICB0ZWxsX2ZpbGVfZnVuYyAgICAgIHp0ZWxsX2ZpbGU7Ci0gICAgc2Vla19maWxlX2Z1bmMgICAgICB6c2Vla19maWxlOwotICAgIGNsb3NlX2ZpbGVfZnVuYyAgICAgemNsb3NlX2ZpbGU7Ci0gICAgdGVzdGVycm9yX2ZpbGVfZnVuYyB6ZXJyb3JfZmlsZTsKLSAgICB2b2lkcGYgICAgICAgICAgICAgIG9wYXF1ZTsKLX0gemxpYl9maWxlZnVuY19kZWY7Ci0KLQotCi12b2lkIGZpbGxfZm9wZW5fZmlsZWZ1bmMgT0YoKHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKLQotI2RlZmluZSBaUkVBRChmaWxlZnVuYyxmaWxlc3RyZWFtLGJ1ZixzaXplKSAoKCooKGZpbGVmdW5jKS56cmVhZF9maWxlKSkoKGZpbGVmdW5jKS5vcGFxdWUsZmlsZXN0cmVhbSxidWYsc2l6ZSkpCi0jZGVmaW5lIFpXUklURShmaWxlZnVuYyxmaWxlc3RyZWFtLGJ1ZixzaXplKSAoKCooKGZpbGVmdW5jKS56d3JpdGVfZmlsZSkpKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0sYnVmLHNpemUpKQotI2RlZmluZSBaVEVMTChmaWxlZnVuYyxmaWxlc3RyZWFtKSAoKCooKGZpbGVmdW5jKS56dGVsbF9maWxlKSkoKGZpbGVmdW5jKS5vcGFxdWUsZmlsZXN0cmVhbSkpCi0jZGVmaW5lIFpTRUVLKGZpbGVmdW5jLGZpbGVzdHJlYW0scG9zLG1vZGUpICgoKigoZmlsZWZ1bmMpLnpzZWVrX2ZpbGUpKSgoZmlsZWZ1bmMpLm9wYXF1ZSxmaWxlc3RyZWFtLHBvcyxtb2RlKSkKLSNkZWZpbmUgWkNMT1NFKGZpbGVmdW5jLGZpbGVzdHJlYW0pICgoKigoZmlsZWZ1bmMpLnpjbG9zZV9maWxlKSkoKGZpbGVmdW5jKS5vcGFxdWUsZmlsZXN0cmVhbSkpCi0jZGVmaW5lIFpFUlJPUihmaWxlZnVuYyxmaWxlc3RyZWFtKSAoKCooKGZpbGVmdW5jKS56ZXJyb3JfZmlsZSkpKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0pKQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9taW5pemlwL2lvd2luMzIuYyBiL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvaW93aW4zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWI1Zjc4Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvaW93aW4zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qIGlvd2luMzIuYyAtLSBJTyBiYXNlIGZ1bmN0aW9uIGhlYWRlciBmb3IgY29tcHJlc3MvdW5jb21wcmVzcyAuemlwCi0gICBmaWxlcyB1c2luZyB6bGliICsgemlwIG9yIHVuemlwIEFQSQotICAgVGhpcyBJTyBBUEkgdmVyc2lvbiB1c2VzIHRoZSBXaW4zMiBBUEkgKGZvciBNaWNyb3NvZnQgV2luZG93cykKLQotICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNSBHaWxsZXMgVm9sbGFudAotKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiemxpYi5oIgotI2luY2x1ZGUgImlvYXBpLmgiCi0jaW5jbHVkZSAiaW93aW4zMi5oIgotCi0jaWZuZGVmIElOVkFMSURfSEFORExFX1ZBTFVFCi0jZGVmaW5lIElOVkFMSURfSEFORExFX1ZBTFVFICgweEZGRkZGRkZGKQotI2VuZGlmCi0KLSNpZm5kZWYgSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSCi0jZGVmaW5lIElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUiAoKERXT1JEKS0xKQotI2VuZGlmCi0KLXZvaWRwZiBaQ0FMTEJBQ0sgd2luMzJfb3Blbl9maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgaW50IG1vZGUpKTsKLQotdUxvbmcgWkNBTExCQUNLIHdpbjMyX3JlYWRfZmlsZV9mdW5jIE9GKCgKLSAgIHZvaWRwZiBvcGFxdWUsCi0gICB2b2lkcGYgc3RyZWFtLAotICAgdm9pZCogYnVmLAotICAgdUxvbmcgc2l6ZSkpOwotCi11TG9uZyBaQ0FMTEJBQ0sgd2luMzJfd3JpdGVfZmlsZV9mdW5jIE9GKCgKLSAgIHZvaWRwZiBvcGFxdWUsCi0gICB2b2lkcGYgc3RyZWFtLAotICAgY29uc3Qgdm9pZCogYnVmLAotICAgdUxvbmcgc2l6ZSkpOwotCi1sb25nIFpDQUxMQkFDSyB3aW4zMl90ZWxsX2ZpbGVfZnVuYyBPRigoCi0gICB2b2lkcGYgb3BhcXVlLAotICAgdm9pZHBmIHN0cmVhbSkpOwotCi1sb25nIFpDQUxMQkFDSyB3aW4zMl9zZWVrX2ZpbGVfZnVuYyBPRigoCi0gICB2b2lkcGYgb3BhcXVlLAotICAgdm9pZHBmIHN0cmVhbSwKLSAgIHVMb25nIG9mZnNldCwKLSAgIGludCBvcmlnaW4pKTsKLQotaW50IFpDQUxMQkFDSyB3aW4zMl9jbG9zZV9maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIHZvaWRwZiBzdHJlYW0pKTsKLQotaW50IFpDQUxMQkFDSyB3aW4zMl9lcnJvcl9maWxlX2Z1bmMgT0YoKAotICAgdm9pZHBmIG9wYXF1ZSwKLSAgIHZvaWRwZiBzdHJlYW0pKTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBIQU5ETEUgaGY7Ci0gICAgaW50IGVycm9yOwotfSBXSU4zMkZJTEVfSU9XSU47Ci0KLXZvaWRwZiBaQ0FMTEJBQ0sgd2luMzJfb3Blbl9maWxlX2Z1bmMgKG9wYXF1ZSwgZmlsZW5hbWUsIG1vZGUpCi0gICB2b2lkcGYgb3BhcXVlOwotICAgY29uc3QgY2hhciogZmlsZW5hbWU7Ci0gICBpbnQgbW9kZTsKLXsKLSAgICBjb25zdCBjaGFyKiBtb2RlX2ZvcGVuID0gTlVMTDsKLSAgICBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLGR3U2hhcmVNb2RlLGR3RmxhZ3NBbmRBdHRyaWJ1dGVzIDsKLSAgICBIQU5ETEUgaEZpbGUgPSAwOwotICAgIHZvaWRwZiByZXQ9TlVMTDsKLQotICAgIGR3RGVzaXJlZEFjY2VzcyA9IGR3U2hhcmVNb2RlID0gZHdGbGFnc0FuZEF0dHJpYnV0ZXMgPSAwOwotCi0gICAgaWYgKChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQURXUklURUZJTFRFUik9PVpMSUJfRklMRUZVTkNfTU9ERV9SRUFEKQotICAgIHsKLSAgICAgICAgZHdEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19SRUFEOwotICAgICAgICBkd0NyZWF0aW9uRGlzcG9zaXRpb24gPSBPUEVOX0VYSVNUSU5HOwotICAgICAgICBkd1NoYXJlTW9kZSA9IEZJTEVfU0hBUkVfUkVBRDsKLSAgICB9Ci0gICAgZWxzZQotICAgIGlmIChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HKQotICAgIHsKLSAgICAgICAgZHdEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRDsKLSAgICAgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uID0gT1BFTl9FWElTVElORzsKLSAgICB9Ci0gICAgZWxzZQotICAgIGlmIChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX0NSRUFURSkKLSAgICB7Ci0gICAgICAgIGR3RGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQ7Ci0gICAgICAgIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiA9IENSRUFURV9BTFdBWVM7Ci0gICAgfQotCi0gICAgaWYgKChmaWxlbmFtZSE9TlVMTCkgJiYgKGR3RGVzaXJlZEFjY2VzcyAhPSAwKSkKLSAgICAgICAgaEZpbGUgPSBDcmVhdGVGaWxlKChMUENUU1RSKWZpbGVuYW1lLCBkd0Rlc2lyZWRBY2Nlc3MsIGR3U2hhcmVNb2RlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIE5VTEwpOwotCi0gICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgICBoRmlsZSA9IE5VTEw7Ci0KLSAgICBpZiAoaEZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIFdJTjMyRklMRV9JT1dJTiB3MzJmaW93OwotICAgICAgICB3MzJmaW93LmhmID0gaEZpbGU7Ci0gICAgICAgIHczMmZpb3cuZXJyb3IgPSAwOwotICAgICAgICByZXQgPSBtYWxsb2Moc2l6ZW9mKFdJTjMyRklMRV9JT1dJTikpOwotICAgICAgICBpZiAocmV0PT1OVUxMKQotICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotICAgICAgICBlbHNlICooKFdJTjMyRklMRV9JT1dJTiopcmV0KSA9IHczMmZpb3c7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLQotdUxvbmcgWkNBTExCQUNLIHdpbjMyX3JlYWRfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSwgYnVmLCBzaXplKQotICAgdm9pZHBmIG9wYXF1ZTsKLSAgIHZvaWRwZiBzdHJlYW07Ci0gICB2b2lkKiBidWY7Ci0gICB1TG9uZyBzaXplOwotewotICAgIHVMb25nIHJldD0wOwotICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7Ci0gICAgaWYgKHN0cmVhbSE9TlVMTCkKLSAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBoZjsKLSAgICBpZiAoaEZpbGUgIT0gTlVMTCkKLSAgICAgICAgaWYgKCFSZWFkRmlsZShoRmlsZSwgYnVmLCBzaXplLCAmcmV0LCBOVUxMKSkKLSAgICAgICAgewotICAgICAgICAgICAgRFdPUkQgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgIGlmIChkd0VyciA9PSBFUlJPUl9IQU5ETEVfRU9GKQotICAgICAgICAgICAgICAgIGR3RXJyID0gMDsKLSAgICAgICAgICAgICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGVycm9yPShpbnQpZHdFcnI7Ci0gICAgICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLQotdUxvbmcgWkNBTExCQUNLIHdpbjMyX3dyaXRlX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0sIGJ1Ziwgc2l6ZSkKLSAgIHZvaWRwZiBvcGFxdWU7Ci0gICB2b2lkcGYgc3RyZWFtOwotICAgY29uc3Qgdm9pZCogYnVmOwotICAgdUxvbmcgc2l6ZTsKLXsKLSAgICB1TG9uZyByZXQ9MDsKLSAgICBIQU5ETEUgaEZpbGUgPSBOVUxMOwotICAgIGlmIChzdHJlYW0hPU5VTEwpCi0gICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gaGY7Ci0KLSAgICBpZiAoaEZpbGUgIT1OVUxMKQotICAgICAgICBpZiAoIVdyaXRlRmlsZShoRmlsZSwgYnVmLCBzaXplLCAmcmV0LCBOVUxMKSkKLSAgICAgICAgewotICAgICAgICAgICAgRFdPUkQgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgIGlmIChkd0VyciA9PSBFUlJPUl9IQU5ETEVfRU9GKQotICAgICAgICAgICAgICAgIGR3RXJyID0gMDsKLSAgICAgICAgICAgICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGVycm9yPShpbnQpZHdFcnI7Ci0gICAgICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWxvbmcgWkNBTExCQUNLIHdpbjMyX3RlbGxfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSkKLSAgIHZvaWRwZiBvcGFxdWU7Ci0gICB2b2lkcGYgc3RyZWFtOwotewotICAgIGxvbmcgcmV0PS0xOwotICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7Ci0gICAgaWYgKHN0cmVhbSE9TlVMTCkKLSAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBoZjsKLSAgICBpZiAoaEZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERXT1JEIGR3U2V0ID0gU2V0RmlsZVBvaW50ZXIoaEZpbGUsIDAsIE5VTEwsIEZJTEVfQ1VSUkVOVCk7Ci0gICAgICAgIGlmIChkd1NldCA9PSBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgICAgICAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcj0oaW50KWR3RXJyOwotICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0PShsb25nKWR3U2V0OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1sb25nIFpDQUxMQkFDSyB3aW4zMl9zZWVrX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0sIG9mZnNldCwgb3JpZ2luKQotICAgdm9pZHBmIG9wYXF1ZTsKLSAgIHZvaWRwZiBzdHJlYW07Ci0gICB1TG9uZyBvZmZzZXQ7Ci0gICBpbnQgb3JpZ2luOwotewotICAgIERXT1JEIGR3TW92ZU1ldGhvZD0weEZGRkZGRkZGOwotICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7Ci0KLSAgICBsb25nIHJldD0tMTsKLSAgICBpZiAoc3RyZWFtIT1OVUxMKQotICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOwotICAgIHN3aXRjaCAob3JpZ2luKQotICAgIHsKLSAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOgotICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0NVUlJFTlQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0VORCA6Ci0gICAgICAgIGR3TW92ZU1ldGhvZCA9IEZJTEVfRU5EOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19TRVQgOgotICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0JFR0lOOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OiByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKGhGaWxlICE9IE5VTEwpCi0gICAgewotICAgICAgICBEV09SRCBkd1NldCA9IFNldEZpbGVQb2ludGVyKGhGaWxlLCBvZmZzZXQsIE5VTEwsIGR3TW92ZU1ldGhvZCk7Ci0gICAgICAgIGlmIChkd1NldCA9PSBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgICAgICAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcj0oaW50KWR3RXJyOwotICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0PTA7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBaQ0FMTEJBQ0sgd2luMzJfY2xvc2VfZmlsZV9mdW5jIChvcGFxdWUsIHN0cmVhbSkKLSAgIHZvaWRwZiBvcGFxdWU7Ci0gICB2b2lkcGYgc3RyZWFtOwotewotICAgIGludCByZXQ9LTE7Ci0KLSAgICBpZiAoc3RyZWFtIT1OVUxMKQotICAgIHsKLSAgICAgICAgSEFORExFIGhGaWxlOwotICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOwotICAgICAgICBpZiAoaEZpbGUgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotICAgICAgICAgICAgcmV0PTA7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShzdHJlYW0pOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgWkNBTExCQUNLIHdpbjMyX2Vycm9yX2ZpbGVfZnVuYyAob3BhcXVlLCBzdHJlYW0pCi0gICB2b2lkcGYgb3BhcXVlOwotICAgdm9pZHBmIHN0cmVhbTsKLXsKLSAgICBpbnQgcmV0PS0xOwotICAgIGlmIChzdHJlYW0hPU5VTEwpCi0gICAgewotICAgICAgICByZXQgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcjsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jIChwemxpYl9maWxlZnVuY19kZWYpCi0gIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Ci17Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56b3Blbl9maWxlID0gd2luMzJfb3Blbl9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56cmVhZF9maWxlID0gd2luMzJfcmVhZF9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56d3JpdGVfZmlsZSA9IHdpbjMyX3dyaXRlX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnp0ZWxsX2ZpbGUgPSB3aW4zMl90ZWxsX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpzZWVrX2ZpbGUgPSB3aW4zMl9zZWVrX2ZpbGVfZnVuYzsKLSAgICBwemxpYl9maWxlZnVuY19kZWYtPnpjbG9zZV9maWxlID0gd2luMzJfY2xvc2VfZmlsZV9mdW5jOwotICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSB3aW4zMl9lcnJvcl9maWxlX2Z1bmM7Ci0gICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT5vcGFxdWU9TlVMTDsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvaW93aW4zMi5oIGIvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTQzN2EuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBpb3dpbjMyLmggLS0gSU8gYmFzZSBmdW5jdGlvbiBoZWFkZXIgZm9yIGNvbXByZXNzL3VuY29tcHJlc3MgLnppcAotICAgZmlsZXMgdXNpbmcgemxpYiArIHppcCBvciB1bnppcCBBUEkKLSAgIFRoaXMgSU8gQVBJIHZlcnNpb24gdXNlcyB0aGUgV2luMzIgQVBJIChmb3IgTWljcm9zb2Z0IFdpbmRvd3MpCi0KLSAgIFZlcnNpb24gMS4wMWUsIEZlYnJ1YXJ5IDEydGgsIDIwMDUKLQotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDUgR2lsbGVzIFZvbGxhbnQKLSovCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIGZpbGxfd2luMzJfZmlsZWZ1bmMgT0YoKHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvbWluaXVuei5jIGIvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZTVlYTkuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODggKzAsMCBAQAotLyoKLSAgIG1pbml1bnouYwotICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNSBHaWxsZXMgVm9sbGFudAotKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpZmRlZiB1bml4Ci0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBpbmNsdWRlIDx1dGltZS5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jIGluY2x1ZGUgPGlvLmg+Ci0jZW5kaWYKLSNpZmRlZiBfX1dJTjMyX18KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJ1bnppcC5oIgotCi0jZGVmaW5lIENBU0VTRU5TSVRJVklUWSAoMCkKLSNkZWZpbmUgV1JJVEVCVUZGRVJTSVpFICg4MTkyKQotI2RlZmluZSBNQVhGSUxFTkFNRSAoMjU2KQotCi0jaWZkZWYgV0lOMzIKLSNkZWZpbmUgVVNFV0lOMzJJT0FQSQotI2luY2x1ZGUgImlvd2luMzIuaCIKLSNlbmRpZgotLyoKLSAgbWluaSB1bnppcCwgZGVtbyBvZiB1bnppcCBwYWNrYWdlCi0KLSAgdXNhZ2UgOgotICBVc2FnZSA6IG1pbml1bnogWy1leHZsb10gZmlsZS56aXAgW2ZpbGVfdG9fZXh0cmFjdF0gWy1kIGV4dHJhY3RkaXJdCi0KLSAgbGlzdCB0aGUgZmlsZSBpbiB0aGUgemlwZmlsZSwgYW5kIHByaW50IHRoZSBjb250ZW50IG9mIEZJTEVfSUQuWklQIG9yIFJFQURNRS5UWFQKLSAgICBpZiBpdCBleGlzdHMKLSovCi0KLQotLyogY2hhbmdlX2ZpbGVfZGF0ZSA6IGNoYW5nZSB0aGUgZGF0ZS90aW1lIG9mIGEgZmlsZQotICAgIGZpbGVuYW1lIDogdGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHdoZXJlIGRhdGUvdGltZSBtdXN0IGJlIG1vZGlmaWVkCi0gICAgZG9zZGF0ZSA6IHRoZSBuZXcgZGF0ZSBhdCB0aGUgTVNEb3MgZm9ybWF0ICg0IGJ5dGVzKQotICAgIHRtdV9kYXRlIDogdGhlIFNBTUUgbmV3IGRhdGUgYXQgdGhlIHRtX3VueiBmb3JtYXQgKi8KLXZvaWQgY2hhbmdlX2ZpbGVfZGF0ZShmaWxlbmFtZSxkb3NkYXRlLHRtdV9kYXRlKQotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgIHVMb25nIGRvc2RhdGU7Ci0gICAgdG1fdW56IHRtdV9kYXRlOwotewotI2lmZGVmIFdJTjMyCi0gIEhBTkRMRSBoRmlsZTsKLSAgRklMRVRJTUUgZnRtLGZ0TG9jYWwsZnRDcmVhdGUsZnRMYXN0QWNjLGZ0TGFzdFdyaXRlOwotCi0gIGhGaWxlID0gQ3JlYXRlRmlsZShmaWxlbmFtZSxHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgIDAsTlVMTCxPUEVOX0VYSVNUSU5HLDAsTlVMTCk7Ci0gIEdldEZpbGVUaW1lKGhGaWxlLCZmdENyZWF0ZSwmZnRMYXN0QWNjLCZmdExhc3RXcml0ZSk7Ci0gIERvc0RhdGVUaW1lVG9GaWxlVGltZSgoV09SRCkoZG9zZGF0ZT4+MTYpLChXT1JEKWRvc2RhdGUsJmZ0TG9jYWwpOwotICBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZSgmZnRMb2NhbCwmZnRtKTsKLSAgU2V0RmlsZVRpbWUoaEZpbGUsJmZ0bSwmZnRMYXN0QWNjLCZmdG0pOwotICBDbG9zZUhhbmRsZShoRmlsZSk7Ci0jZWxzZQotI2lmZGVmIHVuaXgKLSAgc3RydWN0IHV0aW1idWYgdXQ7Ci0gIHN0cnVjdCB0bSBuZXdkYXRlOwotICBuZXdkYXRlLnRtX3NlYyA9IHRtdV9kYXRlLnRtX3NlYzsKLSAgbmV3ZGF0ZS50bV9taW49dG11X2RhdGUudG1fbWluOwotICBuZXdkYXRlLnRtX2hvdXI9dG11X2RhdGUudG1faG91cjsKLSAgbmV3ZGF0ZS50bV9tZGF5PXRtdV9kYXRlLnRtX21kYXk7Ci0gIG5ld2RhdGUudG1fbW9uPXRtdV9kYXRlLnRtX21vbjsKLSAgaWYgKHRtdV9kYXRlLnRtX3llYXIgPiAxOTAwKQotICAgICAgbmV3ZGF0ZS50bV95ZWFyPXRtdV9kYXRlLnRtX3llYXIgLSAxOTAwOwotICBlbHNlCi0gICAgICBuZXdkYXRlLnRtX3llYXI9dG11X2RhdGUudG1feWVhciA7Ci0gIG5ld2RhdGUudG1faXNkc3Q9LTE7Ci0KLSAgdXQuYWN0aW1lPXV0Lm1vZHRpbWU9bWt0aW1lKCZuZXdkYXRlKTsKLSAgdXRpbWUoZmlsZW5hbWUsJnV0KTsKLSNlbmRpZgotI2VuZGlmCi19Ci0KLQotLyogbXlta2RpciBhbmQgY2hhbmdlX2ZpbGVfZGF0ZSBhcmUgbm90IDEwMCAlIHBvcnRhYmxlCi0gICBBcyBJIGRvbid0IGtub3cgd2VsbCBVbml4LCBJIHdhaXQgZmVlZGJhY2sgZm9yIHRoZSB1bml4IHBvcnRpb24gKi8KLQotaW50IG15bWtkaXIoZGlybmFtZSkKLSAgICBjb25zdCBjaGFyKiBkaXJuYW1lOwotewotICAgIGludCByZXQ9MDsKLSNpZmRlZiBXSU4zMgotICAgIHJldCA9IG1rZGlyKGRpcm5hbWUpOwotI2Vsc2UKLSNpZmRlZiB1bml4Ci0gICAgcmV0ID0gbWtkaXIgKGRpcm5hbWUsMDc3NSk7Ci0jZW5kaWYKLSNlbmRpZgotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBtYWtlZGlyIChuZXdkaXIpCi0gICAgY2hhciAqbmV3ZGlyOwotewotICBjaGFyICpidWZmZXIgOwotICBjaGFyICpwOwotICBpbnQgIGxlbiA9IChpbnQpc3RybGVuKG5ld2Rpcik7Ci0KLSAgaWYgKGxlbiA8PSAwKQotICAgIHJldHVybiAwOwotCi0gIGJ1ZmZlciA9IChjaGFyKiltYWxsb2MobGVuKzEpOwotICBzdHJjcHkoYnVmZmVyLG5ld2Rpcik7Ci0KLSAgaWYgKGJ1ZmZlcltsZW4tMV0gPT0gJy8nKSB7Ci0gICAgYnVmZmVyW2xlbi0xXSA9ICdcMCc7Ci0gIH0KLSAgaWYgKG15bWtkaXIoYnVmZmVyKSA9PSAwKQotICAgIHsKLSAgICAgIGZyZWUoYnVmZmVyKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBwID0gYnVmZmVyKzE7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNoYXIgaG9sZDsKLQotICAgICAgd2hpbGUoKnAgJiYgKnAgIT0gJ1xcJyAmJiAqcCAhPSAnLycpCi0gICAgICAgIHArKzsKLSAgICAgIGhvbGQgPSAqcDsKLSAgICAgICpwID0gMDsKLSAgICAgIGlmICgobXlta2RpcihidWZmZXIpID09IC0xKSAmJiAoZXJybm8gPT0gRU5PRU5UKSkKLSAgICAgICAgewotICAgICAgICAgIHByaW50ZigiY291bGRuJ3QgY3JlYXRlIGRpcmVjdG9yeSAlc1xuIixidWZmZXIpOwotICAgICAgICAgIGZyZWUoYnVmZmVyKTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgaWYgKGhvbGQgPT0gMCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICAqcCsrID0gaG9sZDsKLSAgICB9Ci0gIGZyZWUoYnVmZmVyKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgZG9fYmFubmVyKCkKLXsKLSAgICBwcmludGYoIk1pbmlVbnogMS4wMWIsIGRlbW8gb2YgekxpYiArIFVueiBwYWNrYWdlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnRcbiIpOwotICAgIHByaW50ZigibW9yZSBpbmZvIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbFxuXG4iKTsKLX0KLQotdm9pZCBkb19oZWxwKCkKLXsKLSAgICBwcmludGYoIlVzYWdlIDogbWluaXVueiBbLWVdIFsteF0gWy12XSBbLWxdIFstb10gWy1wIHBhc3N3b3JkXSBmaWxlLnppcCBbZmlsZV90b19leHRyLl0gWy1kIGV4dHJhY3RkaXJdXG5cbiIgXAotICAgICAgICAgICAiICAtZSAgRXh0cmFjdCB3aXRob3V0IHBhdGhuYW1lIChqdW5rIHBhdGhzKVxuIiBcCi0gICAgICAgICAgICIgIC14ICBFeHRyYWN0IHdpdGggcGF0aG5hbWVcbiIgXAotICAgICAgICAgICAiICAtdiAgbGlzdCBmaWxlc1xuIiBcCi0gICAgICAgICAgICIgIC1sICBsaXN0IGZpbGVzXG4iIFwKLSAgICAgICAgICAgIiAgLWQgIGRpcmVjdG9yeSB0byBleHRyYWN0IGludG9cbiIgXAotICAgICAgICAgICAiICAtbyAgb3ZlcndyaXRlIGZpbGVzIHdpdGhvdXQgcHJvbXB0aW5nXG4iIFwKLSAgICAgICAgICAgIiAgLXAgIGV4dHJhY3QgY3J5cHRlZCBmaWxlIHVzaW5nIHBhc3N3b3JkXG5cbiIpOwotfQotCi0KLWludCBkb19saXN0KHVmKQotICAgIHVuekZpbGUgdWY7Ci17Ci0gICAgdUxvbmcgaTsKLSAgICB1bnpfZ2xvYmFsX2luZm8gZ2k7Ci0gICAgaW50IGVycjsKLQotICAgIGVyciA9IHVuekdldEdsb2JhbEluZm8gKHVmLCZnaSk7Ci0gICAgaWYgKGVyciE9VU5aX09LKQotICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRHbG9iYWxJbmZvIFxuIixlcnIpOwotICAgIHByaW50ZigiIExlbmd0aCAgTWV0aG9kICAgU2l6ZSAgUmF0aW8gICBEYXRlICAgIFRpbWUgICBDUkMtMzIgICAgIE5hbWVcbiIpOwotICAgIHByaW50ZigiIC0tLS0tLSAgLS0tLS0tICAgLS0tLSAgLS0tLS0gICAtLS0tICAgIC0tLS0gICAtLS0tLS0gICAgIC0tLS1cbiIpOwotICAgIGZvciAoaT0wO2k8Z2kubnVtYmVyX2VudHJ5O2krKykKLSAgICB7Ci0gICAgICAgIGNoYXIgZmlsZW5hbWVfaW56aXBbMjU2XTsKLSAgICAgICAgdW56X2ZpbGVfaW5mbyBmaWxlX2luZm87Ci0gICAgICAgIHVMb25nIHJhdGlvPTA7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnN0cmluZ19tZXRob2Q7Ci0gICAgICAgIGNoYXIgY2hhckNyeXB0PScgJzsKLSAgICAgICAgZXJyID0gdW56R2V0Q3VycmVudEZpbGVJbmZvKHVmLCZmaWxlX2luZm8sZmlsZW5hbWVfaW56aXAsc2l6ZW9mKGZpbGVuYW1lX2luemlwKSxOVUxMLDAsTlVMTCwwKTsKLSAgICAgICAgaWYgKGVyciE9VU5aX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm9cbiIsZXJyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemU+MCkKLSAgICAgICAgICAgIHJhdGlvID0gKGZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUqMTAwKS9maWxlX2luZm8udW5jb21wcmVzc2VkX3NpemU7Ci0KLSAgICAgICAgLyogZGlzcGxheSBhICcqJyBpZiB0aGUgZmlsZSBpcyBjcnlwdGVkICovCi0gICAgICAgIGlmICgoZmlsZV9pbmZvLmZsYWcgJiAxKSAhPSAwKQotICAgICAgICAgICAgY2hhckNyeXB0PScqJzsKLQotICAgICAgICBpZiAoZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZD09MCkKLSAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IlN0b3JlZCI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgaWYgKGZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PVpfREVGTEFURUQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVJbnQgaUxldmVsPSh1SW50KSgoZmlsZV9pbmZvLmZsYWcgJiAweDYpLzIpOwotICAgICAgICAgICAgaWYgKGlMZXZlbD09MCkKLSAgICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iRGVmbDpOIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlMZXZlbD09MSkKLSAgICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iRGVmbDpYIjsKLSAgICAgICAgICAgIGVsc2UgaWYgKChpTGV2ZWw9PTIpIHx8IChpTGV2ZWw9PTMpKQotICAgICAgICAgICAgICBzdHJpbmdfbWV0aG9kPSJEZWZsOkYiOyAvKiAyOmZhc3QgLCAzIDogZXh0cmEgZmFzdCovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iVW5rbi4gIjsKLQotICAgICAgICBwcmludGYoIiU3bHUgICU2cyVjJTdsdSAlM2x1JSUgICUyLjJsdS0lMi4ybHUtJTIuMmx1ICAlMi4ybHU6JTIuMmx1ICAlOC44bHggICAlc1xuIiwKLSAgICAgICAgICAgICAgICBmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUsc3RyaW5nX21ldGhvZCwKLSAgICAgICAgICAgICAgICBjaGFyQ3J5cHQsCi0gICAgICAgICAgICAgICAgZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICByYXRpbywKLSAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX21vbiArIDEsCi0gICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9tZGF5LAotICAgICAgICAgICAgICAgICh1TG9uZylmaWxlX2luZm8udG11X2RhdGUudG1feWVhciAlIDEwMCwKLSAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX2hvdXIsKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9taW4sCi0gICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby5jcmMsZmlsZW5hbWVfaW56aXApOwotICAgICAgICBpZiAoKGkrMSk8Z2kubnVtYmVyX2VudHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSB1bnpHb1RvTmV4dEZpbGUodWYpOwotICAgICAgICAgICAgaWYgKGVyciE9VU5aX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdvVG9OZXh0RmlsZVxuIixlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGRvX2V4dHJhY3RfY3VycmVudGZpbGUodWYscG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCxwb3B0X292ZXJ3cml0ZSxwYXNzd29yZCkKLSAgICB1bnpGaWxlIHVmOwotICAgIGNvbnN0IGludCogcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aDsKLSAgICBpbnQqIHBvcHRfb3ZlcndyaXRlOwotICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOwotewotICAgIGNoYXIgZmlsZW5hbWVfaW56aXBbMjU2XTsKLSAgICBjaGFyKiBmaWxlbmFtZV93aXRob3V0cGF0aDsKLSAgICBjaGFyKiBwOwotICAgIGludCBlcnI9VU5aX09LOwotICAgIEZJTEUgKmZvdXQ9TlVMTDsKLSAgICB2b2lkKiBidWY7Ci0gICAgdUludCBzaXplX2J1ZjsKLQotICAgIHVuel9maWxlX2luZm8gZmlsZV9pbmZvOwotICAgIHVMb25nIHJhdGlvPTA7Ci0gICAgZXJyID0gdW56R2V0Q3VycmVudEZpbGVJbmZvKHVmLCZmaWxlX2luZm8sZmlsZW5hbWVfaW56aXAsc2l6ZW9mKGZpbGVuYW1lX2luemlwKSxOVUxMLDAsTlVMTCwwKTsKLQotICAgIGlmIChlcnIhPVVOWl9PSykKLSAgICB7Ci0gICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdldEN1cnJlbnRGaWxlSW5mb1xuIixlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHNpemVfYnVmID0gV1JJVEVCVUZGRVJTSVpFOwotICAgIGJ1ZiA9ICh2b2lkKiltYWxsb2Moc2l6ZV9idWYpOwotICAgIGlmIChidWY9PU5VTEwpCi0gICAgewotICAgICAgICBwcmludGYoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKLSAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOwotICAgIH0KLQotICAgIHAgPSBmaWxlbmFtZV93aXRob3V0cGF0aCA9IGZpbGVuYW1lX2luemlwOwotICAgIHdoaWxlICgoKnApICE9ICdcMCcpCi0gICAgewotICAgICAgICBpZiAoKCgqcCk9PScvJykgfHwgKCgqcCk9PSdcXCcpKQotICAgICAgICAgICAgZmlsZW5hbWVfd2l0aG91dHBhdGggPSBwKzE7Ci0gICAgICAgIHArKzsKLSAgICB9Ci0KLSAgICBpZiAoKCpmaWxlbmFtZV93aXRob3V0cGF0aCk9PSdcMCcpCi0gICAgewotICAgICAgICBpZiAoKCpwb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoKT09MCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCJjcmVhdGluZyBkaXJlY3Rvcnk6ICVzXG4iLGZpbGVuYW1lX2luemlwKTsKLSAgICAgICAgICAgIG15bWtkaXIoZmlsZW5hbWVfaW56aXApOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHdyaXRlX2ZpbGVuYW1lOwotICAgICAgICBpbnQgc2tpcD0wOwotCi0gICAgICAgIGlmICgoKnBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgpPT0wKQotICAgICAgICAgICAgd3JpdGVfZmlsZW5hbWUgPSBmaWxlbmFtZV9pbnppcDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgd3JpdGVfZmlsZW5hbWUgPSBmaWxlbmFtZV93aXRob3V0cGF0aDsKLQotICAgICAgICBlcnIgPSB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCh1ZixwYXNzd29yZCk7Ci0gICAgICAgIGlmIChlcnIhPVVOWl9PSykKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmRcbiIsZXJyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoKCpwb3B0X292ZXJ3cml0ZSk9PTApICYmIChlcnI9PVVOWl9PSykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgcmVwPTA7Ci0gICAgICAgICAgICBGSUxFKiBmdGVzdGV4aXN0OwotICAgICAgICAgICAgZnRlc3RleGlzdCA9IGZvcGVuKHdyaXRlX2ZpbGVuYW1lLCJyYiIpOwotICAgICAgICAgICAgaWYgKGZ0ZXN0ZXhpc3QhPU5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmNsb3NlKGZ0ZXN0ZXhpc3QpOwotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGFuc3dlclsxMjhdOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0OwotCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiVGhlIGZpbGUgJXMgZXhpc3RzLiBPdmVyd3JpdGUgPyBbeV1lcywgW25dbywgW0FdbGw6ICIsd3JpdGVfZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICByZXQgPSBzY2FuZigiJTFzIixhbnN3ZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDEpIAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXAgPSBhbnN3ZXJbMF0gOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcD49J2EnKSAmJiAocmVwPD0neicpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVwIC09IDB4MjA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICgocmVwIT0nWScpICYmIChyZXAhPSdOJykgJiYgKHJlcCE9J0EnKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXAgPT0gJ04nKQotICAgICAgICAgICAgICAgIHNraXAgPSAxOwotCi0gICAgICAgICAgICBpZiAocmVwID09ICdBJykKLSAgICAgICAgICAgICAgICAqcG9wdF9vdmVyd3JpdGU9MTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoc2tpcD09MCkgJiYgKGVycj09VU5aX09LKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm91dD1mb3Blbih3cml0ZV9maWxlbmFtZSwid2IiKTsKLQotICAgICAgICAgICAgLyogc29tZSB6aXBmaWxlIGRvbid0IGNvbnRhaW4gZGlyZWN0b3J5IGFsb25lIGJlZm9yZSBmaWxlICovCi0gICAgICAgICAgICBpZiAoKGZvdXQ9PU5VTEwpICYmICgoKnBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgpPT0wKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWVfd2l0aG91dHBhdGghPShjaGFyKilmaWxlbmFtZV9pbnppcCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjPSooZmlsZW5hbWVfd2l0aG91dHBhdGgtMSk7Ci0gICAgICAgICAgICAgICAgKihmaWxlbmFtZV93aXRob3V0cGF0aC0xKT0nXDAnOwotICAgICAgICAgICAgICAgIG1ha2VkaXIod3JpdGVfZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICooZmlsZW5hbWVfd2l0aG91dHBhdGgtMSk9YzsKLSAgICAgICAgICAgICAgICBmb3V0PWZvcGVuKHdyaXRlX2ZpbGVuYW1lLCJ3YiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm91dD09TlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIG9wZW5pbmcgJXNcbiIsd3JpdGVfZmlsZW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZvdXQhPU5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiIGV4dHJhY3Rpbmc6ICVzXG4iLHdyaXRlX2ZpbGVuYW1lKTsKLQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSB1bnpSZWFkQ3VycmVudEZpbGUodWYsYnVmLHNpemVfYnVmKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyPDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpSZWFkQ3VycmVudEZpbGVcbiIsZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlcnI+MCkKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ3cml0ZShidWYsZXJyLDEsZm91dCkhPTEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gd3JpdGluZyBleHRyYWN0ZWQgZmlsZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChlcnI+MCk7Ci0gICAgICAgICAgICBpZiAoZm91dCkKLSAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZvdXQpOwotCi0gICAgICAgICAgICBpZiAoZXJyPT0wKQotICAgICAgICAgICAgICAgIGNoYW5nZV9maWxlX2RhdGUod3JpdGVfZmlsZW5hbWUsZmlsZV9pbmZvLmRvc0RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2luZm8udG11X2RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSB1bnpDbG9zZUN1cnJlbnRGaWxlICh1Zik7Ci0gICAgICAgICAgICBpZiAoZXJyIT1VTlpfT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56Q2xvc2VDdXJyZW50RmlsZVxuIixlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUodWYpOyAvKiBkb24ndCBsb3NlIHRoZSBlcnJvciAqLwotICAgIH0KLQotICAgIGZyZWUoYnVmKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLWludCBkb19leHRyYWN0KHVmLG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCxvcHRfb3ZlcndyaXRlLHBhc3N3b3JkKQotICAgIHVuekZpbGUgdWY7Ci0gICAgaW50IG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aDsKLSAgICBpbnQgb3B0X292ZXJ3cml0ZTsKLSAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKLXsKLSAgICB1TG9uZyBpOwotICAgIHVuel9nbG9iYWxfaW5mbyBnaTsKLSAgICBpbnQgZXJyOwotICAgIEZJTEUqIGZvdXQ9TlVMTDsKLQotICAgIGVyciA9IHVuekdldEdsb2JhbEluZm8gKHVmLCZnaSk7Ci0gICAgaWYgKGVyciE9VU5aX09LKQotICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRHbG9iYWxJbmZvIFxuIixlcnIpOwotCi0gICAgZm9yIChpPTA7aTxnaS5udW1iZXJfZW50cnk7aSsrKQotICAgIHsKLSAgICAgICAgaWYgKGRvX2V4dHJhY3RfY3VycmVudGZpbGUodWYsJm9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdF9vdmVyd3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkKSAhPSBVTlpfT0spCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoKGkrMSk8Z2kubnVtYmVyX2VudHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSB1bnpHb1RvTmV4dEZpbGUodWYpOwotICAgICAgICAgICAgaWYgKGVyciE9VU5aX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdvVG9OZXh0RmlsZVxuIixlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBkb19leHRyYWN0X29uZWZpbGUodWYsZmlsZW5hbWUsb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoLG9wdF9vdmVyd3JpdGUscGFzc3dvcmQpCi0gICAgdW56RmlsZSB1ZjsKLSAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKLSAgICBpbnQgb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoOwotICAgIGludCBvcHRfb3ZlcndyaXRlOwotICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOwotewotICAgIGludCBlcnIgPSBVTlpfT0s7Ci0gICAgaWYgKHVuekxvY2F0ZUZpbGUodWYsZmlsZW5hbWUsQ0FTRVNFTlNJVElWSVRZKSE9VU5aX09LKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJmaWxlICVzIG5vdCBmb3VuZCBpbiB0aGUgemlwZmlsZVxuIixmaWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAgIGlmIChkb19leHRyYWN0X2N1cnJlbnRmaWxlKHVmLCZvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRfb3ZlcndyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCkgPT0gVU5aX09LKQotICAgICAgICByZXR1cm4gMDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAxOwotfQotCi0KLWludCBtYWluKGFyZ2MsYXJndikKLSAgICBpbnQgYXJnYzsKLSAgICBjaGFyICphcmd2W107Ci17Ci0gICAgY29uc3QgY2hhciAqemlwZmlsZW5hbWU9TlVMTDsKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZV90b19leHRyYWN0PU5VTEw7Ci0gICAgY29uc3QgY2hhciAqcGFzc3dvcmQ9TlVMTDsKLSAgICBjaGFyIGZpbGVuYW1lX3RyeVtNQVhGSUxFTkFNRSsxNl0gPSAiIjsKLSAgICBpbnQgaTsKLSAgICBpbnQgb3B0X2RvX2xpc3Q9MDsKLSAgICBpbnQgb3B0X2RvX2V4dHJhY3Q9MTsKLSAgICBpbnQgb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGg9MDsKLSAgICBpbnQgb3B0X292ZXJ3cml0ZT0wOwotICAgIGludCBvcHRfZXh0cmFjdGRpcj0wOwotICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU9TlVMTDsKLSAgICB1bnpGaWxlIHVmPU5VTEw7Ci0KLSAgICBkb19iYW5uZXIoKTsKLSAgICBpZiAoYXJnYz09MSkKLSAgICB7Ci0gICAgICAgIGRvX2hlbHAoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaT0xO2k8YXJnYztpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKmFyZ3ZbaV0pPT0nLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcD1hcmd2W2ldKzE7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKCpwKSE9J1wwJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgYz0qKHArKyk7OwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdsJykgfHwgKGM9PSdMJykpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRfZG9fbGlzdCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYz09J3YnKSB8fCAoYz09J1YnKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19saXN0ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0neCcpIHx8IChjPT0nWCcpKQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RvX2V4dHJhY3QgPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdlJykgfHwgKGM9PSdFJykpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRfZG9fZXh0cmFjdCA9IG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoID0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0nbycpIHx8IChjPT0nTycpKQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0X292ZXJ3cml0ZT0xOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdkJykgfHwgKGM9PSdEJykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9leHRyYWN0ZGlyPTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lPWFyZ3ZbaSsxXTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKGM9PSdwJykgfHwgKGM9PSdQJykpICYmIChpKzE8YXJnYykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkPWFyZ3ZbaSsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoemlwZmlsZW5hbWUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgemlwZmlsZW5hbWUgPSBhcmd2W2ldOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKChmaWxlbmFtZV90b19leHRyYWN0PT1OVUxMKSAmJiAoIW9wdF9leHRyYWN0ZGlyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX3RvX2V4dHJhY3QgPSBhcmd2W2ldIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh6aXBmaWxlbmFtZSE9TlVMTCkKLSAgICB7Ci0KLSMgICAgICAgIGlmZGVmIFVTRVdJTjMySU9BUEkKLSAgICAgICAgemxpYl9maWxlZnVuY19kZWYgZmZ1bmM7Ci0jICAgICAgICBlbmRpZgotCi0gICAgICAgIHN0cm5jcHkoZmlsZW5hbWVfdHJ5LCB6aXBmaWxlbmFtZSxNQVhGSUxFTkFNRS0xKTsKLSAgICAgICAgLyogc3RybmNweSBkb2VzbnQgYXBwZW5kIHRoZSB0cmFpbGluZyBOVUxMLCBvZiB0aGUgc3RyaW5nIGlzIHRvbyBsb25nLiAqLwotICAgICAgICBmaWxlbmFtZV90cnlbIE1BWEZJTEVOQU1FIF0gPSAnXDAnOwotCi0jICAgICAgICBpZmRlZiBVU0VXSU4zMklPQVBJCi0gICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmMoJmZmdW5jKTsKLSAgICAgICAgdWYgPSB1bnpPcGVuMih6aXBmaWxlbmFtZSwmZmZ1bmMpOwotIyAgICAgICAgZWxzZQotICAgICAgICB1ZiA9IHVuek9wZW4oemlwZmlsZW5hbWUpOwotIyAgICAgICAgZW5kaWYKLSAgICAgICAgaWYgKHVmPT1OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJjYXQoZmlsZW5hbWVfdHJ5LCIuemlwIik7Ci0jICAgICAgICAgICAgaWZkZWYgVVNFV0lOMzJJT0FQSQotICAgICAgICAgICAgdWYgPSB1bnpPcGVuMihmaWxlbmFtZV90cnksJmZmdW5jKTsKLSMgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB1ZiA9IHVuek9wZW4oZmlsZW5hbWVfdHJ5KTsKLSMgICAgICAgICAgICBlbmRpZgotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHVmPT1OVUxMKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiAlcyBvciAlcy56aXBcbiIsemlwZmlsZW5hbWUsemlwZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcHJpbnRmKCIlcyBvcGVuZWRcbiIsZmlsZW5hbWVfdHJ5KTsKLQotICAgIGlmIChvcHRfZG9fbGlzdD09MSkKLSAgICAgICAgcmV0dXJuIGRvX2xpc3QodWYpOwotICAgIGVsc2UgaWYgKG9wdF9kb19leHRyYWN0PT0xKQotICAgIHsKLSAgICAgICAgaWYgKG9wdF9leHRyYWN0ZGlyICYmIGNoZGlyKGRpcm5hbWUpKSAKLSAgICAgICAgewotICAgICAgICAgIHByaW50ZigiRXJyb3IgY2hhbmdpbmcgaW50byAlcywgYWJvcnRpbmdcbiIsIGRpcm5hbWUpOwotICAgICAgICAgIGV4aXQoLTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbGVuYW1lX3RvX2V4dHJhY3QgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBkb19leHRyYWN0KHVmLG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoLG9wdF9vdmVyd3JpdGUscGFzc3dvcmQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZG9fZXh0cmFjdF9vbmVmaWxlKHVmLGZpbGVuYW1lX3RvX2V4dHJhY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoLG9wdF9vdmVyd3JpdGUscGFzc3dvcmQpOwotICAgIH0KLSAgICB1bnpDbG9zZUN1cnJlbnRGaWxlKHVmKTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC9taW5pemlwLmMgYi9saWJzL3psaWIvY29udHJpYi9taW5pemlwL21pbml6aXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4ZWM1MC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9taW5pemlwL21pbml6aXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKgotICAgbWluaXppcC5jCi0gICBWZXJzaW9uIDEuMDFlLCBGZWJydWFyeSAxMnRoLCAyMDA1Ci0KLSAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA1IEdpbGxlcyBWb2xsYW50Ci0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpZmRlZiB1bml4Ci0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBpbmNsdWRlIDx1dGltZS5oPgotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGRpcmVjdC5oPgotIyBpbmNsdWRlIDxpby5oPgotI2VuZGlmCi0jaWZkZWYgX19XSU4zMl9fCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiemlwLmgiCi0KLSNpZmRlZiBXSU4zMgotI2RlZmluZSBVU0VXSU4zMklPQVBJCi0jaW5jbHVkZSAiaW93aW4zMi5oIgotI2VuZGlmCi0KLQotCi0jZGVmaW5lIFdSSVRFQlVGRkVSU0laRSAoMTYzODQpCi0jZGVmaW5lIE1BWEZJTEVOQU1FICgyNTYpCi0KLSNpZmRlZiBXSU4zMgotdUxvbmcgZmlsZXRpbWUoZiwgdG16aXAsIGR0KQotICAgIGNoYXIgKmY7ICAgICAgICAgICAgICAgIC8qIG5hbWUgb2YgZmlsZSB0byBnZXQgaW5mbyBvbiAqLwotICAgIHRtX3ppcCAqdG16aXA7ICAgICAgICAgICAgIC8qIHJldHVybiB2YWx1ZTogYWNjZXNzLCBtb2RpZmljLiBhbmQgY3JlYXRpb24gdGltZXMgKi8KLSAgICB1TG9uZyAqZHQ7ICAgICAgICAgICAgIC8qIGRvc3RpbWUgKi8KLXsKLSAgaW50IHJldCA9IDA7Ci0gIHsKLSAgICAgIEZJTEVUSU1FIGZ0TG9jYWw7Ci0gICAgICBIQU5ETEUgaEZpbmQ7Ci0gICAgICBXSU4zMl9GSU5EX0RBVEEgIGZmMzI7Ci0KLSAgICAgIGhGaW5kID0gRmluZEZpcnN0RmlsZShmLCZmZjMyKTsKLSAgICAgIGlmIChoRmluZCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgICAgIHsKLSAgICAgICAgRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUoJihmZjMyLmZ0TGFzdFdyaXRlVGltZSksJmZ0TG9jYWwpOwotICAgICAgICBGaWxlVGltZVRvRG9zRGF0ZVRpbWUoJmZ0TG9jYWwsKChMUFdPUkQpZHQpKzEsKChMUFdPUkQpZHQpKzApOwotICAgICAgICBGaW5kQ2xvc2UoaEZpbmQpOwotICAgICAgICByZXQgPSAxOwotICAgICAgfQotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0jZWxzZQotI2lmZGVmIHVuaXgKLXVMb25nIGZpbGV0aW1lKGYsIHRtemlwLCBkdCkKLSAgICBjaGFyICpmOyAgICAgICAgICAgICAgIC8qIG5hbWUgb2YgZmlsZSB0byBnZXQgaW5mbyBvbiAqLwotICAgIHRtX3ppcCAqdG16aXA7ICAgICAgICAgLyogcmV0dXJuIHZhbHVlOiBhY2Nlc3MsIG1vZGlmaWMuIGFuZCBjcmVhdGlvbiB0aW1lcyAqLwotICAgIHVMb25nICpkdDsgICAgICAgICAgICAgLyogZG9zdGltZSAqLwotewotICBpbnQgcmV0PTA7Ci0gIHN0cnVjdCBzdGF0IHM7ICAgICAgICAvKiByZXN1bHRzIG9mIHN0YXQoKSAqLwotICBzdHJ1Y3QgdG0qIGZpbGVkYXRlOwotICB0aW1lX3QgdG1fdD0wOwotCi0gIGlmIChzdHJjbXAoZiwiLSIpIT0wKQotICB7Ci0gICAgY2hhciBuYW1lW01BWEZJTEVOQU1FKzFdOwotICAgIGludCBsZW4gPSBzdHJsZW4oZik7Ci0gICAgaWYgKGxlbiA+IE1BWEZJTEVOQU1FKQotICAgICAgbGVuID0gTUFYRklMRU5BTUU7Ci0KLSAgICBzdHJuY3B5KG5hbWUsIGYsTUFYRklMRU5BTUUtMSk7Ci0gICAgLyogc3RybmNweSBkb2VzbnQgYXBwZW5kIHRoZSB0cmFpbGluZyBOVUxMLCBvZiB0aGUgc3RyaW5nIGlzIHRvbyBsb25nLiAqLwotICAgIG5hbWVbIE1BWEZJTEVOQU1FIF0gPSAnXDAnOwotCi0gICAgaWYgKG5hbWVbbGVuIC0gMV0gPT0gJy8nKQotICAgICAgbmFtZVtsZW4gLSAxXSA9ICdcMCc7Ci0gICAgLyogbm90IGFsbCBzeXN0ZW1zIGFsbG93IHN0YXQnaW5nIGEgZmlsZSB3aXRoIC8gYXBwZW5kZWQgKi8KLSAgICBpZiAoc3RhdChuYW1lLCZzKT09MCkKLSAgICB7Ci0gICAgICB0bV90ID0gcy5zdF9tdGltZTsKLSAgICAgIHJldCA9IDE7Ci0gICAgfQotICB9Ci0gIGZpbGVkYXRlID0gbG9jYWx0aW1lKCZ0bV90KTsKLQotICB0bXppcC0+dG1fc2VjICA9IGZpbGVkYXRlLT50bV9zZWM7Ci0gIHRtemlwLT50bV9taW4gID0gZmlsZWRhdGUtPnRtX21pbjsKLSAgdG16aXAtPnRtX2hvdXIgPSBmaWxlZGF0ZS0+dG1faG91cjsKLSAgdG16aXAtPnRtX21kYXkgPSBmaWxlZGF0ZS0+dG1fbWRheTsKLSAgdG16aXAtPnRtX21vbiAgPSBmaWxlZGF0ZS0+dG1fbW9uIDsKLSAgdG16aXAtPnRtX3llYXIgPSBmaWxlZGF0ZS0+dG1feWVhcjsKLQotICByZXR1cm4gcmV0OwotfQotI2Vsc2UKLXVMb25nIGZpbGV0aW1lKGYsIHRtemlwLCBkdCkKLSAgICBjaGFyICpmOyAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIGZpbGUgdG8gZ2V0IGluZm8gb24gKi8KLSAgICB0bV96aXAgKnRtemlwOyAgICAgICAgICAgICAvKiByZXR1cm4gdmFsdWU6IGFjY2VzcywgbW9kaWZpYy4gYW5kIGNyZWF0aW9uIHRpbWVzICovCi0gICAgdUxvbmcgKmR0OyAgICAgICAgICAgICAvKiBkb3N0aW1lICovCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi0KLQotCi1pbnQgY2hlY2tfZXhpc3RfZmlsZShmaWxlbmFtZSkKLSAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKLXsKLSAgICBGSUxFKiBmdGVzdGV4aXN0OwotICAgIGludCByZXQgPSAxOwotICAgIGZ0ZXN0ZXhpc3QgPSBmb3BlbihmaWxlbmFtZSwicmIiKTsKLSAgICBpZiAoZnRlc3RleGlzdD09TlVMTCkKLSAgICAgICAgcmV0ID0gMDsKLSAgICBlbHNlCi0gICAgICAgIGZjbG9zZShmdGVzdGV4aXN0KTsKLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIGRvX2Jhbm5lcigpCi17Ci0gICAgcHJpbnRmKCJNaW5pWmlwIDEuMDFiLCBkZW1vIG9mIHpMaWIgKyBaaXAgcGFja2FnZSB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50XG4iKTsKLSAgICBwcmludGYoIm1vcmUgaW5mbyBhdCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWxcblxuIik7Ci19Ci0KLXZvaWQgZG9faGVscCgpCi17Ci0gICAgcHJpbnRmKCJVc2FnZSA6IG1pbml6aXAgWy1vXSBbLWFdIFstMCB0byAtOV0gWy1wIHBhc3N3b3JkXSBmaWxlLnppcCBbZmlsZXNfdG9fYWRkXVxuXG4iIFwKLSAgICAgICAgICAgIiAgLW8gIE92ZXJ3cml0ZSBleGlzdGluZyBmaWxlLnppcFxuIiBcCi0gICAgICAgICAgICIgIC1hICBBcHBlbmQgdG8gZXhpc3RpbmcgZmlsZS56aXBcbiIgXAotICAgICAgICAgICAiICAtMCAgU3RvcmUgb25seVxuIiBcCi0gICAgICAgICAgICIgIC0xICBDb21wcmVzcyBmYXN0ZXJcbiIgXAotICAgICAgICAgICAiICAtOSAgQ29tcHJlc3MgYmV0dGVyXG5cbiIpOwotfQotCi0vKiBjYWxjdWxhdGUgdGhlIENSQzMyIG9mIGEgZmlsZSwKLSAgIGJlY2F1c2UgdG8gZW5jcnlwdCBhIGZpbGUsIHdlIG5lZWQga25vd24gdGhlIENSQzMyIG9mIHRoZSBmaWxlIGJlZm9yZSAqLwotaW50IGdldEZpbGVDcmMoY29uc3QgY2hhciogZmlsZW5hbWVpbnppcCx2b2lkKmJ1Zix1bnNpZ25lZCBsb25nIHNpemVfYnVmLHVuc2lnbmVkIGxvbmcqIHJlc3VsdF9jcmMpCi17Ci0gICB1bnNpZ25lZCBsb25nIGNhbGN1bGF0ZV9jcmM9MDsKLSAgIGludCBlcnI9WklQX09LOwotICAgRklMRSAqIGZpbiA9IGZvcGVuKGZpbGVuYW1laW56aXAsInJiIik7Ci0gICB1bnNpZ25lZCBsb25nIHNpemVfcmVhZCA9IDA7Ci0gICB1bnNpZ25lZCBsb25nIHRvdGFsX3JlYWQgPSAwOwotICAgaWYgKGZpbj09TlVMTCkKLSAgIHsKLSAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0gICB9Ci0KLSAgICBpZiAoZXJyID09IFpJUF9PSykKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gWklQX09LOwotICAgICAgICAgICAgc2l6ZV9yZWFkID0gKGludClmcmVhZChidWYsMSxzaXplX2J1ZixmaW4pOwotICAgICAgICAgICAgaWYgKHNpemVfcmVhZCA8IHNpemVfYnVmKQotICAgICAgICAgICAgICAgIGlmIChmZW9mKGZpbik9PTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiByZWFkaW5nICVzXG4iLGZpbGVuYW1laW56aXApOwotICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNpemVfcmVhZD4wKQotICAgICAgICAgICAgICAgIGNhbGN1bGF0ZV9jcmMgPSBjcmMzMihjYWxjdWxhdGVfY3JjLGJ1ZixzaXplX3JlYWQpOwotICAgICAgICAgICAgdG90YWxfcmVhZCArPSBzaXplX3JlYWQ7Ci0KLSAgICAgICAgfSB3aGlsZSAoKGVyciA9PSBaSVBfT0spICYmIChzaXplX3JlYWQ+MCkpOwotCi0gICAgaWYgKGZpbikKLSAgICAgICAgZmNsb3NlKGZpbik7Ci0KLSAgICAqcmVzdWx0X2NyYz1jYWxjdWxhdGVfY3JjOwotICAgIHByaW50ZigiZmlsZSAlcyBjcmMgJXhcbiIsZmlsZW5hbWVpbnppcCxjYWxjdWxhdGVfY3JjKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQgbWFpbihhcmdjLGFyZ3YpCi0gICAgaW50IGFyZ2M7Ci0gICAgY2hhciAqYXJndltdOwotewotICAgIGludCBpOwotICAgIGludCBvcHRfb3ZlcndyaXRlPTA7Ci0gICAgaW50IG9wdF9jb21wcmVzc19sZXZlbD1aX0RFRkFVTFRfQ09NUFJFU1NJT047Ci0gICAgaW50IHppcGZpbGVuYW1lYXJnID0gMDsKLSAgICBjaGFyIGZpbGVuYW1lX3RyeVtNQVhGSUxFTkFNRSsxNl07Ci0gICAgaW50IHppcG9rOwotICAgIGludCBlcnI9MDsKLSAgICBpbnQgc2l6ZV9idWY9MDsKLSAgICB2b2lkKiBidWY9TlVMTDsKLSAgICBjb25zdCBjaGFyKiBwYXNzd29yZD1OVUxMOwotCi0KLSAgICBkb19iYW5uZXIoKTsKLSAgICBpZiAoYXJnYz09MSkKLSAgICB7Ci0gICAgICAgIGRvX2hlbHAoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaT0xO2k8YXJnYztpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKmFyZ3ZbaV0pPT0nLScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcD1hcmd2W2ldKzE7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKCpwKSE9J1wwJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgYz0qKHArKyk7OwotICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdvJykgfHwgKGM9PSdPJykpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0nYScpIHx8IChjPT0nQScpKQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0X292ZXJ3cml0ZSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYz49JzAnKSAmJiAoYzw9JzknKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9jb21wcmVzc19sZXZlbCA9IGMtJzAnOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKGM9PSdwJykgfHwgKGM9PSdQJykpICYmIChpKzE8YXJnYykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkPWFyZ3ZbaSsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoemlwZmlsZW5hbWVhcmcgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgemlwZmlsZW5hbWVhcmcgPSBpIDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNpemVfYnVmID0gV1JJVEVCVUZGRVJTSVpFOwotICAgIGJ1ZiA9ICh2b2lkKiltYWxsb2Moc2l6ZV9idWYpOwotICAgIGlmIChidWY9PU5VTEwpCi0gICAgewotICAgICAgICBwcmludGYoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKLSAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOwotICAgIH0KLQotICAgIGlmICh6aXBmaWxlbmFtZWFyZz09MCkKLSAgICAgICAgemlwb2s9MDsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbnQgaSxsZW47Ci0gICAgICAgIGludCBkb3RfZm91bmQ9MDsKLQotICAgICAgICB6aXBvayA9IDEgOwotICAgICAgICBzdHJuY3B5KGZpbGVuYW1lX3RyeSwgYXJndlt6aXBmaWxlbmFtZWFyZ10sTUFYRklMRU5BTUUtMSk7Ci0gICAgICAgIC8qIHN0cm5jcHkgZG9lc250IGFwcGVuZCB0aGUgdHJhaWxpbmcgTlVMTCwgb2YgdGhlIHN0cmluZyBpcyB0b28gbG9uZy4gKi8KLSAgICAgICAgZmlsZW5hbWVfdHJ5WyBNQVhGSUxFTkFNRSBdID0gJ1wwJzsKLQotICAgICAgICBsZW49KGludClzdHJsZW4oZmlsZW5hbWVfdHJ5KTsKLSAgICAgICAgZm9yIChpPTA7aTxsZW47aSsrKQotICAgICAgICAgICAgaWYgKGZpbGVuYW1lX3RyeVtpXT09Jy4nKQotICAgICAgICAgICAgICAgIGRvdF9mb3VuZD0xOwotCi0gICAgICAgIGlmIChkb3RfZm91bmQ9PTApCi0gICAgICAgICAgICBzdHJjYXQoZmlsZW5hbWVfdHJ5LCIuemlwIik7Ci0KLSAgICAgICAgaWYgKG9wdF9vdmVyd3JpdGU9PTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGlmIHRoZSBmaWxlIGRvbid0IGV4aXN0LCB3ZSBub3QgYXBwZW5kIGZpbGUgKi8KLSAgICAgICAgICAgIGlmIChjaGVja19leGlzdF9maWxlKGZpbGVuYW1lX3RyeSk9PTApCi0gICAgICAgICAgICAgICAgb3B0X292ZXJ3cml0ZT0xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgaWYgKG9wdF9vdmVyd3JpdGU9PTApCi0gICAgICAgICAgICBpZiAoY2hlY2tfZXhpc3RfZmlsZShmaWxlbmFtZV90cnkpIT0wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgcmVwPTA7Ci0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgYW5zd2VyWzEyOF07Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiVGhlIGZpbGUgJXMgZXhpc3RzLiBPdmVyd3JpdGUgPyBbeV1lcywgW25dbywgW2FdcHBlbmQgOiAiLGZpbGVuYW1lX3RyeSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHNjYW5mKCIlMXMiLGFuc3dlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVwID0gYW5zd2VyWzBdIDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChyZXA+PSdhJykgJiYgKHJlcDw9J3onKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcCAtPSAweDIwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoKHJlcCE9J1knKSAmJiAocmVwIT0nTicpICYmIChyZXAhPSdBJykpOwotICAgICAgICAgICAgICAgIGlmIChyZXA9PSdOJykKLSAgICAgICAgICAgICAgICAgICAgemlwb2sgPSAwOwotICAgICAgICAgICAgICAgIGlmIChyZXA9PSdBJykKLSAgICAgICAgICAgICAgICAgICAgb3B0X292ZXJ3cml0ZSA9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHppcG9rPT0xKQotICAgIHsKLSAgICAgICAgemlwRmlsZSB6ZjsKLSAgICAgICAgaW50IGVycmNsb3NlOwotIyAgICAgICAgaWZkZWYgVVNFV0lOMzJJT0FQSQotICAgICAgICB6bGliX2ZpbGVmdW5jX2RlZiBmZnVuYzsKLSAgICAgICAgZmlsbF93aW4zMl9maWxlZnVuYygmZmZ1bmMpOwotICAgICAgICB6ZiA9IHppcE9wZW4yKGZpbGVuYW1lX3RyeSwob3B0X292ZXJ3cml0ZT09MikgPyAyIDogMCxOVUxMLCZmZnVuYyk7Ci0jICAgICAgICBlbHNlCi0gICAgICAgIHpmID0gemlwT3BlbihmaWxlbmFtZV90cnksKG9wdF9vdmVyd3JpdGU9PTIpID8gMiA6IDApOwotIyAgICAgICAgZW5kaWYKLQotICAgICAgICBpZiAoemYgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBvcGVuaW5nICVzXG4iLGZpbGVuYW1lX3RyeSk7Ci0gICAgICAgICAgICBlcnI9IFpJUF9FUlJOTzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmludGYoImNyZWF0aW5nICVzXG4iLGZpbGVuYW1lX3RyeSk7Ci0KLSAgICAgICAgZm9yIChpPXppcGZpbGVuYW1lYXJnKzE7KGk8YXJnYykgJiYgKGVycj09WklQX09LKTtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKCgoKCooYXJndltpXSkpPT0nLScpIHx8ICgoKihhcmd2W2ldKSk9PScvJykpICYmCi0gICAgICAgICAgICAgICAgICAoKGFyZ3ZbaV1bMV09PSdvJykgfHwgKGFyZ3ZbaV1bMV09PSdPJykgfHwKLSAgICAgICAgICAgICAgICAgICAoYXJndltpXVsxXT09J2EnKSB8fCAoYXJndltpXVsxXT09J0EnKSB8fAotICAgICAgICAgICAgICAgICAgIChhcmd2W2ldWzFdPT0ncCcpIHx8IChhcmd2W2ldWzFdPT0nUCcpIHx8Ci0gICAgICAgICAgICAgICAgICAgKChhcmd2W2ldWzFdPj0nMCcpIHx8IChhcmd2W2ldWzFdPD0nOScpKSkgJiYKLSAgICAgICAgICAgICAgICAgIChzdHJsZW4oYXJndltpXSkgPT0gMikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZJTEUgKiBmaW47Ci0gICAgICAgICAgICAgICAgaW50IHNpemVfcmVhZDsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZWluemlwID0gYXJndltpXTsKLSAgICAgICAgICAgICAgICB6aXBfZmlsZWluZm8gemk7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjcmNGaWxlPTA7Ci0KLSAgICAgICAgICAgICAgICB6aS50bXpfZGF0ZS50bV9zZWMgPSB6aS50bXpfZGF0ZS50bV9taW4gPSB6aS50bXpfZGF0ZS50bV9ob3VyID0KLSAgICAgICAgICAgICAgICB6aS50bXpfZGF0ZS50bV9tZGF5ID0gemkudG16X2RhdGUudG1fbW9uID0gemkudG16X2RhdGUudG1feWVhciA9IDA7Ci0gICAgICAgICAgICAgICAgemkuZG9zRGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgemkuaW50ZXJuYWxfZmEgPSAwOwotICAgICAgICAgICAgICAgIHppLmV4dGVybmFsX2ZhID0gMDsKLSAgICAgICAgICAgICAgICBmaWxldGltZShmaWxlbmFtZWluemlwLCZ6aS50bXpfZGF0ZSwmemkuZG9zRGF0ZSk7Ci0KLS8qCi0gICAgICAgICAgICAgICAgZXJyID0gemlwT3Blbk5ld0ZpbGVJblppcCh6ZixmaWxlbmFtZWluemlwLCZ6aSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCAvICogY29tbWVudCAqIC8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0X2NvbXByZXNzX2xldmVsICE9IDApID8gWl9ERUZMQVRFRCA6IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfY29tcHJlc3NfbGV2ZWwpOwotKi8KLSAgICAgICAgICAgICAgICBpZiAoKHBhc3N3b3JkICE9IE5VTEwpICYmIChlcnI9PVpJUF9PSykpCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IGdldEZpbGVDcmMoZmlsZW5hbWVpbnppcCxidWYsc2l6ZV9idWYsJmNyY0ZpbGUpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gemlwT3Blbk5ld0ZpbGVJblppcDMoemYsZmlsZW5hbWVpbnppcCwmemksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwgLyogY29tbWVudCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdF9jb21wcmVzc19sZXZlbCAhPSAwKSA/IFpfREVGTEFURUQgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2NvbXByZXNzX2xldmVsLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1ksICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCxjcmNGaWxlKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gWklQX09LKQotICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIG9wZW5pbmcgJXMgaW4gemlwZmlsZVxuIixmaWxlbmFtZWluemlwKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW4gPSBmb3BlbihmaWxlbmFtZWluemlwLCJyYiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmluPT1OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnI9WklQX0VSUk5POwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiBvcGVuaW5nICVzIGZvciByZWFkaW5nXG4iLGZpbGVuYW1laW56aXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGVyciA9PSBaSVBfT0spCi0gICAgICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFpJUF9PSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfcmVhZCA9IChpbnQpZnJlYWQoYnVmLDEsc2l6ZV9idWYsZmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3JlYWQgPCBzaXplX2J1ZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmVvZihmaW4pPT0wKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gcmVhZGluZyAlc1xuIixmaWxlbmFtZWluemlwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3JlYWQ+MCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB6aXBXcml0ZUluRmlsZUluWmlwICh6ZixidWYsc2l6ZV9yZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyPDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHdyaXRpbmcgJXMgaW4gdGhlIHppcGZpbGVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVpbnppcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChlcnIgPT0gWklQX09LKSAmJiAoc2l6ZV9yZWFkPjApKTsKLQotICAgICAgICAgICAgICAgIGlmIChmaW4pCi0gICAgICAgICAgICAgICAgICAgIGZjbG9zZShmaW4pOwotCi0gICAgICAgICAgICAgICAgaWYgKGVycjwwKQotICAgICAgICAgICAgICAgICAgICBlcnI9WklQX0VSUk5POwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHppcENsb3NlRmlsZUluWmlwKHpmKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciE9WklQX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiBjbG9zaW5nICVzIGluIHRoZSB6aXBmaWxlXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVpbnppcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVycmNsb3NlID0gemlwQ2xvc2UoemYsTlVMTCk7Ci0gICAgICAgIGlmIChlcnJjbG9zZSAhPSBaSVBfT0spCi0gICAgICAgICAgICBwcmludGYoImVycm9yIGluIGNsb3NpbmcgJXNcbiIsZmlsZW5hbWVfdHJ5KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICBkb19oZWxwKCk7Ci0gICAgfQotCi0gICAgZnJlZShidWYpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmMgYi9saWJzL3psaWIvY29udHJpYi9taW5pemlwL216dG9vbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE1MGVlNC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9taW5pemlwL216dG9vbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKgotICBBZGRpdGlvbmFsIHRvb2xzIGZvciBNaW5pemlwCi0gIENvZGU6IFhhdmllciBSb2NoZSAnMjAwNAotICBMaWNlbnNlOiBTYW1lIGFzIFpMSUIgKHd3dy5nemlwLm9yZykKLSovCi0KLS8qIENvZGUgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInpsaWIuaCIKLSNpbmNsdWRlICJ1bnppcC5oIgotCi0jZGVmaW5lIFJFQURfOChhZHIpICAoKHVuc2lnbmVkIGNoYXIpKihhZHIpKQotI2RlZmluZSBSRUFEXzE2KGFkcikgKCBSRUFEXzgoYWRyKSB8IChSRUFEXzgoYWRyKzEpIDw8IDgpICkKLSNkZWZpbmUgUkVBRF8zMihhZHIpICggUkVBRF8xNihhZHIpIHwgKFJFQURfMTYoKGFkcikrMikgPDwgMTYpICkKLQotI2RlZmluZSBXUklURV84KGJ1ZmYsIG4pIGRvIHsgXAotICAqKCh1bnNpZ25lZCBjaGFyKikoYnVmZikpID0gKHVuc2lnbmVkIGNoYXIpICgobikgJiAweGZmKTsgXAotfSB3aGlsZSgwKQotI2RlZmluZSBXUklURV8xNihidWZmLCBuKSBkbyB7IFwKLSAgV1JJVEVfOCgodW5zaWduZWQgY2hhciopKGJ1ZmYpLCBuKTsgXAotICBXUklURV84KCgodW5zaWduZWQgY2hhciopKGJ1ZmYpKSArIDEsIChuKSA+PiA4KTsgXAotfSB3aGlsZSgwKQotI2RlZmluZSBXUklURV8zMihidWZmLCBuKSBkbyB7IFwKLSAgV1JJVEVfMTYoKHVuc2lnbmVkIGNoYXIqKShidWZmKSwgKG4pICYgMHhmZmZmKTsgXAotICBXUklURV8xNigodW5zaWduZWQgY2hhciopKGJ1ZmYpICsgMiwgKG4pID4+IDE2KTsgXAotfSB3aGlsZSgwKQotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56UmVwYWlyKGZpbGUsIGZpbGVPdXQsIGZpbGVPdXRUbXAsIG5SZWNvdmVyZWQsIGJ5dGVzUmVjb3ZlcmVkKQotY29uc3QgY2hhciogZmlsZTsKLWNvbnN0IGNoYXIqIGZpbGVPdXQ7Ci1jb25zdCBjaGFyKiBmaWxlT3V0VG1wOwotdUxvbmcqIG5SZWNvdmVyZWQ7Ci11TG9uZyogYnl0ZXNSZWNvdmVyZWQ7Ci17Ci0gIGludCBlcnIgPSBaX09LOwotICBGSUxFKiBmcFppcCA9IGZvcGVuKGZpbGUsICJyYiIpOwotICBGSUxFKiBmcE91dCA9IGZvcGVuKGZpbGVPdXQsICJ3YiIpOwotICBGSUxFKiBmcE91dENEID0gZm9wZW4oZmlsZU91dFRtcCwgIndiIik7Ci0gIGlmIChmcFppcCAhPSBOVUxMICYmICBmcE91dCAhPSBOVUxMKSB7Ci0gICAgaW50IGVudHJpZXMgPSAwOwotICAgIHVMb25nIHRvdGFsQnl0ZXMgPSAwOwotICAgIGNoYXIgaGVhZGVyWzMwXTsKLSAgICBjaGFyIGZpbGVuYW1lWzI1Nl07Ci0gICAgY2hhciBleHRyYVsxMDI0XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBpbnQgb2Zmc2V0Q0QgPSAwOwotICAgIHdoaWxlICggZnJlYWQoaGVhZGVyLCAxLCAzMCwgZnBaaXApID09IDMwICkgewotICAgICAgaW50IGN1cnJlbnRPZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgICAgIC8qIEZpbGUgZW50cnkgKi8KLSAgICAgIGlmIChSRUFEXzMyKGhlYWRlcikgPT0gMHgwNDAzNGI1MCkgewotICAgICAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IFJFQURfMTYoaGVhZGVyICsgNCk7Ci0gICAgICAgIHVuc2lnbmVkIGludCBncGZsYWcgPSBSRUFEXzE2KGhlYWRlciArIDYpOwotICAgICAgICB1bnNpZ25lZCBpbnQgbWV0aG9kID0gUkVBRF8xNihoZWFkZXIgKyA4KTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZpbGV0aW1lID0gUkVBRF8xNihoZWFkZXIgKyAxMCk7Ci0gICAgICAgIHVuc2lnbmVkIGludCBmaWxlZGF0ZSA9IFJFQURfMTYoaGVhZGVyICsgMTIpOwotICAgICAgICB1bnNpZ25lZCBpbnQgY3JjID0gUkVBRF8zMihoZWFkZXIgKyAxNCk7IC8qIGNyYyAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgY3BzaXplID0gUkVBRF8zMihoZWFkZXIgKyAxOCk7IC8qIGNvbXByZXNzZWQgc2l6ZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgdW5jcHNpemUgPSBSRUFEXzMyKGhlYWRlciArIDIyKTsgLyogdW5jb21wcmVzc2VkIHN6ICovCi0gICAgICAgIHVuc2lnbmVkIGludCBmbnNpemUgPSBSRUFEXzE2KGhlYWRlciArIDI2KTsgLyogZmlsZSBuYW1lIGxlbmd0aCAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgZXh0c2l6ZSA9IFJFQURfMTYoaGVhZGVyICsgMjgpOyAvKiBleHRyYSBmaWVsZCBsZW5ndGggKi8KLSAgICAgICAgZmlsZW5hbWVbMF0gPSBleHRyYVswXSA9ICdcMCc7Ci0gICAgICAgIAotICAgICAgICAvKiBIZWFkZXIgKi8KLSAgICAgICAgaWYgKGZ3cml0ZShoZWFkZXIsIDEsIDMwLCBmcE91dCkgPT0gMzApIHsKLSAgICAgICAgICBvZmZzZXQgKz0gMzA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogRmlsZW5hbWUgKi8KLSAgICAgICAgaWYgKGZuc2l6ZSA+IDApIHsKLSAgICAgICAgICBpZiAoZnJlYWQoZmlsZW5hbWUsIDEsIGZuc2l6ZSwgZnBaaXApID09IGZuc2l6ZSkgewotICAgICAgICAgICAgaWYgKGZ3cml0ZShmaWxlbmFtZSwgMSwgZm5zaXplLCBmcE91dCkgPT0gZm5zaXplKSB7Ci0gICAgICAgICAgICAgIG9mZnNldCArPSBmbnNpemU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEV4dHJhIGZpZWxkICovCi0gICAgICAgIGlmIChleHRzaXplID4gMCkgewotICAgICAgICAgIGlmIChmcmVhZChleHRyYSwgMSwgZXh0c2l6ZSwgZnBaaXApID09IGV4dHNpemUpIHsKLSAgICAgICAgICAgIGlmIChmd3JpdGUoZXh0cmEsIDEsIGV4dHNpemUsIGZwT3V0KSA9PSBleHRzaXplKSB7Ci0gICAgICAgICAgICAgIG9mZnNldCArPSBleHRzaXplOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qIERhdGEgKi8KLSAgICAgICAgewotICAgICAgICAgIGludCBkYXRhU2l6ZSA9IGNwc2l6ZTsKLSAgICAgICAgICBpZiAoZGF0YVNpemUgPT0gMCkgewotICAgICAgICAgICAgZGF0YVNpemUgPSB1bmNwc2l6ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRhdGFTaXplID4gMCkgewotICAgICAgICAgICAgY2hhciogZGF0YSA9IG1hbGxvYyhkYXRhU2l6ZSk7Ci0gICAgICAgICAgICBpZiAoZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgIGlmICgoaW50KWZyZWFkKGRhdGEsIDEsIGRhdGFTaXplLCBmcFppcCkgPT0gZGF0YVNpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGludClmd3JpdGUoZGF0YSwgMSwgZGF0YVNpemUsIGZwT3V0KSA9PSBkYXRhU2l6ZSkgewotICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGRhdGFTaXplOwotICAgICAgICAgICAgICAgICAgdG90YWxCeXRlcyArPSBkYXRhU2l6ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBmcmVlKGRhdGEpOwotICAgICAgICAgICAgICBpZiAoZXJyICE9IFpfT0spIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZXJyID0gWl9NRU1fRVJST1I7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogQ2VudHJhbCBkaXJlY3RvcnkgZW50cnkgKi8KLSAgICAgICAgewotICAgICAgICAgIGNoYXIgaGVhZGVyWzQ2XTsKLSAgICAgICAgICBjaGFyKiBjb21tZW50ID0gIiI7Ci0gICAgICAgICAgaW50IGNvbXNpemUgPSAoaW50KSBzdHJsZW4oY29tbWVudCk7Ci0gICAgICAgICAgV1JJVEVfMzIoaGVhZGVyLCAweDAyMDE0YjUwKTsKLSAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyA0LCB2ZXJzaW9uKTsKLSAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyA2LCB2ZXJzaW9uKTsKLSAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyA4LCBncGZsYWcpOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDEwLCBtZXRob2QpOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDEyLCBmaWxldGltZSk7Ci0gICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMTQsIGZpbGVkYXRlKTsKLSAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAxNiwgY3JjKTsKLSAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAyMCwgY3BzaXplKTsKLSAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAyNCwgdW5jcHNpemUpOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDI4LCBmbnNpemUpOwotICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDMwLCBleHRzaXplKTsKLSAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyAzMiwgY29tc2l6ZSk7Ci0gICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMzQsIDApOyAgICAgLyogZGlzayAjICovCi0gICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMzYsIDApOyAgICAgLyogaW50IGF0dHJiICovCi0gICAgICAgICAgV1JJVEVfMzIoaGVhZGVyICsgMzgsIDApOyAgICAgLyogZXh0IGF0dHJiICovCi0gICAgICAgICAgV1JJVEVfMzIoaGVhZGVyICsgNDIsIGN1cnJlbnRPZmZzZXQpOwotICAgICAgICAgIC8qIEhlYWRlciAqLwotICAgICAgICAgIGlmIChmd3JpdGUoaGVhZGVyLCAxLCA0NiwgZnBPdXRDRCkgPT0gNDYpIHsKLSAgICAgICAgICAgIG9mZnNldENEICs9IDQ2OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBGaWxlbmFtZSAqLwotICAgICAgICAgICAgaWYgKGZuc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgaWYgKGZ3cml0ZShmaWxlbmFtZSwgMSwgZm5zaXplLCBmcE91dENEKSA9PSBmbnNpemUpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXRDRCArPSBmbnNpemU7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBFeHRyYSBmaWVsZCAqLwotICAgICAgICAgICAgaWYgKGV4dHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgIGlmIChmd3JpdGUoZXh0cmEsIDEsIGV4dHNpemUsIGZwT3V0Q0QpID09IGV4dHNpemUpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXRDRCArPSBleHRzaXplOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogQ29tbWVudCBmaWVsZCAqLwotICAgICAgICAgICAgaWYgKGNvbXNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgIGlmICgoaW50KWZ3cml0ZShjb21tZW50LCAxLCBjb21zaXplLCBmcE91dENEKSA9PSBjb21zaXplKSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0Q0QgKz0gY29tc2l6ZTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogU3VjY2VzcyAqLwotICAgICAgICBlbnRyaWVzKys7Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmFsIGNlbnRyYWwgZGlyZWN0b3J5ICAqLwotICAgIHsKLSAgICAgIGludCBlbnRyaWVzWmlwID0gZW50cmllczsKLSAgICAgIGNoYXIgaGVhZGVyWzIyXTsKLSAgICAgIGNoYXIqIGNvbW1lbnQgPSAiIjsgLy8gIlpJUCBGaWxlIHJlY292ZXJlZCBieSB6bGliL21pbml6aXAvbXp0b29scyI7Ci0gICAgICBpbnQgY29tc2l6ZSA9IChpbnQpIHN0cmxlbihjb21tZW50KTsKLSAgICAgIGlmIChlbnRyaWVzWmlwID4gMHhmZmZmKSB7Ci0gICAgICAgIGVudHJpZXNaaXAgPSAweGZmZmY7Ci0gICAgICB9Ci0gICAgICBXUklURV8zMihoZWFkZXIsIDB4MDYwNTRiNTApOwotICAgICAgV1JJVEVfMTYoaGVhZGVyICsgNCwgMCk7ICAgIC8qIGRpc2sgIyAqLwotICAgICAgV1JJVEVfMTYoaGVhZGVyICsgNiwgMCk7ICAgIC8qIGRpc2sgIyAqLwotICAgICAgV1JJVEVfMTYoaGVhZGVyICsgOCwgZW50cmllc1ppcCk7ICAgLyogaGFjayAqLwotICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMTAsIGVudHJpZXNaaXApOyAgLyogaGFjayAqLwotICAgICAgV1JJVEVfMzIoaGVhZGVyICsgMTIsIG9mZnNldENEKTsgICAgLyogc2l6ZSBvZiBDRCAqLwotICAgICAgV1JJVEVfMzIoaGVhZGVyICsgMTYsIG9mZnNldCk7ICAgICAgLyogb2Zmc2V0IHRvIENEICovCi0gICAgICBXUklURV8xNihoZWFkZXIgKyAyMCwgY29tc2l6ZSk7ICAgICAvKiBjb21tZW50ICovCi0gICAgICAKLSAgICAgIC8qIEhlYWRlciAqLwotICAgICAgaWYgKGZ3cml0ZShoZWFkZXIsIDEsIDIyLCBmcE91dENEKSA9PSAyMikgewotICAgICAgICAKLSAgICAgICAgLyogQ29tbWVudCBmaWVsZCAqLwotICAgICAgICBpZiAoY29tc2l6ZSA+IDApIHsKLSAgICAgICAgICBpZiAoKGludClmd3JpdGUoY29tbWVudCwgMSwgY29tc2l6ZSwgZnBPdXRDRCkgIT0gY29tc2l6ZSkgewotICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmFsIG1lcmdlIChmaWxlICsgY2VudHJhbCBkaXJlY3RvcnkpICovCi0gICAgZmNsb3NlKGZwT3V0Q0QpOwotICAgIGlmIChlcnIgPT0gWl9PSykgewotICAgICAgZnBPdXRDRCA9IGZvcGVuKGZpbGVPdXRUbXAsICJyYiIpOwotICAgICAgaWYgKGZwT3V0Q0QgIT0gTlVMTCkgewotICAgICAgICBpbnQgblJlYWQ7Ci0gICAgICAgIGNoYXIgYnVmZmVyWzgxOTJdOwotICAgICAgICB3aGlsZSAoIChuUmVhZCA9IChpbnQpZnJlYWQoYnVmZmVyLCAxLCBzaXplb2YoYnVmZmVyKSwgZnBPdXRDRCkpID4gMCkgewotICAgICAgICAgIGlmICgoaW50KWZ3cml0ZShidWZmZXIsIDEsIG5SZWFkLCBmcE91dCkgIT0gblJlYWQpIHsKLSAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmNsb3NlKGZwT3V0Q0QpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiBDbG9zZSAqLwotICAgIGZjbG9zZShmcFppcCk7Ci0gICAgZmNsb3NlKGZwT3V0KTsKLSAgICAKLSAgICAvKiBXaXBlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgKHZvaWQpcmVtb3ZlKGZpbGVPdXRUbXApOwotICAgIAotICAgIC8qIE51bWJlciBvZiByZWNvdmVyZWQgZW50cmllcyAqLwotICAgIGlmIChlcnIgPT0gWl9PSykgewotICAgICAgaWYgKG5SZWNvdmVyZWQgIT0gTlVMTCkgewotICAgICAgICAqblJlY292ZXJlZCA9IGVudHJpZXM7Ci0gICAgICB9Ci0gICAgICBpZiAoYnl0ZXNSZWNvdmVyZWQgIT0gTlVMTCkgewotICAgICAgICAqYnl0ZXNSZWNvdmVyZWQgPSB0b3RhbEJ5dGVzOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKLSAgfQotICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmggYi9saWJzL3psaWIvY29udHJpYi9taW5pemlwL216dG9vbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlNzhkYy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9taW5pemlwL216dG9vbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gIEFkZGl0aW9uYWwgdG9vbHMgZm9yIE1pbml6aXAKLSAgQ29kZTogWGF2aWVyIFJvY2hlICcyMDA0Ci0gIExpY2Vuc2U6IFNhbWUgYXMgWkxJQiAod3d3Lmd6aXAub3JnKQotKi8KLQotI2lmbmRlZiBfemlwX3Rvb2xzX0gKLSNkZWZpbmUgX3ppcF90b29sc19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBfWkxJQl9ICi0jaW5jbHVkZSAiemxpYi5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJ1bnppcC5oIgotCi0vKiBSZXBhaXIgYSBaSVAgZmlsZSAobWlzc2luZyBjZW50cmFsIGRpcmVjdG9yeSkgCi0gICBmaWxlOiBmaWxlIHRvIHJlY292ZXIKLSAgIGZpbGVPdXQ6IG91dHB1dCBmaWxlIGFmdGVyIHJlY292ZXJ5Ci0gICBmaWxlT3V0VG1wOiB0ZW1wb3JhcnkgZmlsZSBuYW1lIHVzZWQgZm9yIHJlY292ZXJ5Ci0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuelJlcGFpcihjb25zdCBjaGFyKiBmaWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZU91dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVPdXRUbXAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyogblJlY292ZXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcqIGJ5dGVzUmVjb3ZlcmVkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9taW5pemlwL3VuemlwLmMgYi9saWJzL3psaWIvY29udHJpYi9taW5pemlwL3VuemlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZDQ3NjYuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC91bnppcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5OCArMCwwIEBACi0vKiB1bnppcC5jIC0tIElPIGZvciB1bmNvbXByZXNzIC56aXAgZmlsZXMgdXNpbmcgemxpYgotICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNSBHaWxsZXMgVm9sbGFudAotCi0gICBSZWFkIHVuemlwLmggZm9yIG1vcmUgaW5mbwotKi8KLQotLyogRGVjcnlwdGlvbiBjb2RlIGNvbWVzIGZyb20gY3J5cHQuYyBieSBJbmZvLVpJUCBidXQgaGFzIGJlZW4gZ3JlYXRseSByZWR1Y2VkIGluIHRlcm1zIG9mCi1jb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgc29mdHdhcmUuIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSB0aGUgb3JpZ2luYWwgY3J5cHQuYy4gQ29kZQotd292ZW4gaW4gYnkgVGVycnkgVGhvcnNlbiAxLzIwMDMuCi0qLwotLyoKLSAgQ29weXJpZ2h0IChjKSAxOTkwLTIwMDAgSW5mby1aSVAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFNlZSB0aGUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSwgdmVyc2lvbiAyMDAwLUFwci0wOSBvciBsYXRlcgotICAodGhlIGNvbnRlbnRzIG9mIHdoaWNoIGFyZSBhbHNvIGluY2x1ZGVkIGluIHppcC5oKSBmb3IgdGVybXMgb2YgdXNlLgotICBJZiwgZm9yIHNvbWUgcmVhc29uLCBhbGwgdGhlc2UgZmlsZXMgYXJlIG1pc3NpbmcsIHRoZSBJbmZvLVpJUCBsaWNlbnNlCi0gIGFsc28gbWF5IGJlIGZvdW5kIGF0OiAgZnRwOi8vZnRwLmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9saWNlbnNlLmh0bWwKLSovCi0vKgotICBjcnlwdC5jIChmdWxsIHZlcnNpb24pIGJ5IEluZm8tWklQLiAgICAgIExhc3QgcmV2aXNlZDogIFtzZWUgY3J5cHQuaF0KLQotICBUaGUgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHBhcnRzIG9mIHRoaXMgc291cmNlIGNvZGUgKGFzIG9wcG9zZWQgdG8gdGhlCi0gIG5vbi1lY2hvaW5nIHBhc3N3b3JkIHBhcnRzKSB3ZXJlIG9yaWdpbmFsbHkgd3JpdHRlbiBpbiBFdXJvcGUuICBUaGUKLSAgd2hvbGUgc291cmNlIHBhY2thZ2UgY2FuIGJlIGZyZWVseSBkaXN0cmlidXRlZCwgaW5jbHVkaW5nIGZyb20gdGhlIFVTQS4KLSAgKFByaW9yIHRvIEphbnVhcnkgMjAwMCwgcmUtZXhwb3J0IGZyb20gdGhlIFVTIHdhcyBhIHZpb2xhdGlvbiBvZiBVUyBsYXcuKQotICovCi0KLS8qCi0gIFRoaXMgZW5jcnlwdGlvbiBjb2RlIGlzIGEgZGlyZWN0IHRyYW5zY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSBmcm9tCi0gIFJvZ2VyIFNjaGxhZmx5LCBkZXNjcmliZWQgYnkgUGhpbCBLYXR6IGluIHRoZSBmaWxlIGFwcG5vdGUudHh0LiAgVGhpcwotICBmaWxlIChhcHBub3RlLnR4dCkgaXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgUEtaSVAgcHJvZ3JhbSAoZXZlbiBpbiB0aGUKLSAgdmVyc2lvbiB3aXRob3V0IGVuY3J5cHRpb24gY2FwYWJpbGl0aWVzKS4KLSAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInpsaWIuaCIKLSNpbmNsdWRlICJ1bnppcC5oIgotCi0jaWZkZWYgU1REQwotIyAgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgTk9fRVJSTk9fSAotICAgIGV4dGVybiBpbnQgZXJybm87Ci0jZWxzZQotIyAgIGluY2x1ZGUgPGVycm5vLmg+Ci0jZW5kaWYKLQotCi0jaWZuZGVmIGxvY2FsCi0jICBkZWZpbmUgbG9jYWwgc3RhdGljCi0jZW5kaWYKLS8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLwotCi0KLSNpZm5kZWYgQ0FTRVNFTlNJVElWSVRZREVGQVVMVF9OTwotIyAgaWYgIWRlZmluZWQodW5peCkgJiYgIWRlZmluZWQoQ0FTRVNFTlNJVElWSVRZREVGQVVMVF9ZRVMpCi0jICAgIGRlZmluZSBDQVNFU0VOU0lUSVZJVFlERUZBVUxUX05PCi0jICBlbmRpZgotI2VuZGlmCi0KLQotI2lmbmRlZiBVTlpfQlVGU0laRQotI2RlZmluZSBVTlpfQlVGU0laRSAoMTYzODQpCi0jZW5kaWYKLQotI2lmbmRlZiBVTlpfTUFYRklMRU5BTUVJTlpJUAotI2RlZmluZSBVTlpfTUFYRklMRU5BTUVJTlpJUCAoMjU2KQotI2VuZGlmCi0KLSNpZm5kZWYgQUxMT0MKLSMgZGVmaW5lIEFMTE9DKHNpemUpIChtYWxsb2Moc2l6ZSkpCi0jZW5kaWYKLSNpZm5kZWYgVFJZRlJFRQotIyBkZWZpbmUgVFJZRlJFRShwKSB7aWYgKHApIGZyZWUocCk7fQotI2VuZGlmCi0KLSNkZWZpbmUgU0laRUNFTlRSQUxESVJJVEVNICgweDJlKQotI2RlZmluZSBTSVpFWklQTE9DQUxIRUFERVIgKDB4MWUpCi0KLQotCi0KLWNvbnN0IGNoYXIgdW56X2NvcHlyaWdodFtdID0KLSAgICIgdW56aXAgMS4wMSBDb3B5cmlnaHQgMTk5OC0yMDA0IEdpbGxlcyBWb2xsYW50IC0gaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbCI7Ci0KLS8qIHVuel9maWxlX2luZm9faW50ZXJudGFsIGNvbnRhaW4gaW50ZXJuYWwgaW5mbyBhYm91dCBhIGZpbGUgaW4gemlwZmlsZSovCi10eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9pbmZvX2ludGVybmFsX3MKLXsKLSAgICB1TG9uZyBvZmZzZXRfY3VyZmlsZTsvKiByZWxhdGl2ZSBvZmZzZXQgb2YgbG9jYWwgaGVhZGVyIDQgYnl0ZXMgKi8KLX0gdW56X2ZpbGVfaW5mb19pbnRlcm5hbDsKLQotCi0vKiBmaWxlX2luX3ppcF9yZWFkX2luZm9fcyBjb250YWluIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZSBpbiB6aXBmaWxlLAotICAgIHdoZW4gcmVhZGluZyBhbmQgZGVjb21wcmVzcyBpdCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBjaGFyICAqcmVhZF9idWZmZXI7ICAgICAgICAgLyogaW50ZXJuYWwgYnVmZmVyIGZvciBjb21wcmVzc2VkIGRhdGEgKi8KLSAgICB6X3N0cmVhbSBzdHJlYW07ICAgICAgICAgICAgLyogekxpYiBzdHJlYW0gc3RydWN0dXJlIGZvciBpbmZsYXRlICovCi0KLSAgICB1TG9uZyBwb3NfaW5femlwZmlsZTsgICAgICAgLyogcG9zaXRpb24gaW4gYnl0ZSBvbiB0aGUgemlwZmlsZSwgZm9yIGZzZWVrKi8KLSAgICB1TG9uZyBzdHJlYW1faW5pdGlhbGlzZWQ7ICAgLyogZmxhZyBzZXQgaWYgc3RyZWFtIHN0cnVjdHVyZSBpcyBpbml0aWFsaXNlZCovCi0KLSAgICB1TG9uZyBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZDsvKiBvZmZzZXQgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkICovCi0gICAgdUludCAgc2l6ZV9sb2NhbF9leHRyYWZpZWxkOy8qIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkICovCi0gICAgdUxvbmcgcG9zX2xvY2FsX2V4dHJhZmllbGQ7ICAgLyogcG9zaXRpb24gaW4gdGhlIGxvY2FsIGV4dHJhIGZpZWxkIGluIHJlYWQqLwotCi0gICAgdUxvbmcgY3JjMzI7ICAgICAgICAgICAgICAgIC8qIGNyYzMyIG9mIGFsbCBkYXRhIHVuY29tcHJlc3NlZCAqLwotICAgIHVMb25nIGNyYzMyX3dhaXQ7ICAgICAgICAgICAvKiBjcmMzMiB3ZSBtdXN0IG9idGFpbiBhZnRlciBkZWNvbXByZXNzIGFsbCAqLwotICAgIHVMb25nIHJlc3RfcmVhZF9jb21wcmVzc2VkOyAvKiBudW1iZXIgb2YgYnl0ZSB0byBiZSBkZWNvbXByZXNzZWQgKi8KLSAgICB1TG9uZyByZXN0X3JlYWRfdW5jb21wcmVzc2VkOy8qbnVtYmVyIG9mIGJ5dGUgdG8gYmUgb2J0YWluZWQgYWZ0ZXIgZGVjb21wKi8KLSAgICB6bGliX2ZpbGVmdW5jX2RlZiB6X2ZpbGVmdW5jOwotICAgIHZvaWRwZiBmaWxlc3RyZWFtOyAgICAgICAgLyogaW8gc3RydWN0b3JlIG9mIHRoZSB6aXBmaWxlICovCi0gICAgdUxvbmcgY29tcHJlc3Npb25fbWV0aG9kOyAgIC8qIGNvbXByZXNzaW9uIG1ldGhvZCAoMD09c3RvcmUpICovCi0gICAgdUxvbmcgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7LyogYnl0ZSBiZWZvcmUgdGhlIHppcGZpbGUsICg+MCBmb3Igc2Z4KSovCi0gICAgaW50ICAgcmF3OwotfSBmaWxlX2luX3ppcF9yZWFkX2luZm9fczsKLQotCi0vKiB1bnpfcyBjb250YWluIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB6aXBmaWxlCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB6bGliX2ZpbGVmdW5jX2RlZiB6X2ZpbGVmdW5jOwotICAgIHZvaWRwZiBmaWxlc3RyZWFtOyAgICAgICAgLyogaW8gc3RydWN0b3JlIG9mIHRoZSB6aXBmaWxlICovCi0gICAgdW56X2dsb2JhbF9pbmZvIGdpOyAgICAgICAvKiBwdWJsaWMgZ2xvYmFsIGluZm9ybWF0aW9uICovCi0gICAgdUxvbmcgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7LyogYnl0ZSBiZWZvcmUgdGhlIHppcGZpbGUsICg+MCBmb3Igc2Z4KSovCi0gICAgdUxvbmcgbnVtX2ZpbGU7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiB0aGUgY3VycmVudCBmaWxlIGluIHRoZSB6aXBmaWxlKi8KLSAgICB1TG9uZyBwb3NfaW5fY2VudHJhbF9kaXI7ICAgLyogcG9zIG9mIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIGNlbnRyYWwgZGlyKi8KLSAgICB1TG9uZyBjdXJyZW50X2ZpbGVfb2s7ICAgICAgLyogZmxhZyBhYm91dCB0aGUgdXNhYmlsaXR5IG9mIHRoZSBjdXJyZW50IGZpbGUqLwotICAgIHVMb25nIGNlbnRyYWxfcG9zOyAgICAgICAgICAvKiBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjZW50cmFsIGRpciovCi0KLSAgICB1TG9uZyBzaXplX2NlbnRyYWxfZGlyOyAgICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgICovCi0gICAgdUxvbmcgb2Zmc2V0X2NlbnRyYWxfZGlyOyAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3QgdG8gdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCi0KLSAgICB1bnpfZmlsZV9pbmZvIGN1cl9maWxlX2luZm87IC8qIHB1YmxpYyBpbmZvIGFib3V0IHRoZSBjdXJyZW50IGZpbGUgaW4gemlwKi8KLSAgICB1bnpfZmlsZV9pbmZvX2ludGVybmFsIGN1cl9maWxlX2luZm9faW50ZXJuYWw7IC8qIHByaXZhdGUgaW5mbyBhYm91dCBpdCovCi0gICAgZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkOyAvKiBzdHJ1Y3R1cmUgYWJvdXQgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGlmIHdlIGFyZSBkZWNvbXByZXNzaW5nIGl0ICovCi0gICAgaW50IGVuY3J5cHRlZDsKLSMgICAgaWZuZGVmIE5PVU5DUllQVAotICAgIHVuc2lnbmVkIGxvbmcga2V5c1szXTsgICAgIC8qIGtleXMgZGVmaW5pbmcgdGhlIHBzZXVkby1yYW5kb20gc2VxdWVuY2UgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYjsKLSMgICAgZW5kaWYKLX0gdW56X3M7Ci0KLQotI2lmbmRlZiBOT1VOQ1JZUFQKLSNpbmNsdWRlICJjcnlwdC5oIgotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBSZWFkIGEgYnl0ZSBmcm9tIGEgZ3pfc3RyZWFtOyB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4uIFJldHVybiBFT0YKLSAgIGZvciBlbmQgb2YgZmlsZS4KLSAgIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzIGhhcyBiZWVuIHN1Y2Vzc2Z1bGx5IG9wZW5lZCBmb3IgcmVhZGluZy4KLSovCi0KLQotbG9jYWwgaW50IHVuemxvY2FsX2dldEJ5dGUgT0YoKAotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCi0gICAgdm9pZHBmIGZpbGVzdHJlYW0sCi0gICAgaW50ICpwaSkpOwotCi1sb2NhbCBpbnQgdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxwaSkKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOwotICAgIHZvaWRwZiBmaWxlc3RyZWFtOwotICAgIGludCAqcGk7Ci17Ci0gICAgdW5zaWduZWQgY2hhciBjOwotICAgIGludCBlcnIgPSAoaW50KVpSRUFEKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmYywxKTsKLSAgICBpZiAoZXJyPT0xKQotICAgIHsKLSAgICAgICAgKnBpID0gKGludCljOwotICAgICAgICByZXR1cm4gVU5aX09LOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoWkVSUk9SKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSkpCi0gICAgICAgICAgICByZXR1cm4gVU5aX0VSUk5POwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gVU5aX0VPRjsKLSAgICB9Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBSZWFkcyBhIGxvbmcgaW4gTFNCIG9yZGVyIGZyb20gdGhlIGdpdmVuIGd6X3N0cmVhbS4gU2V0cwotKi8KLWxvY2FsIGludCB1bnpsb2NhbF9nZXRTaG9ydCBPRigoCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKLSAgICB2b2lkcGYgZmlsZXN0cmVhbSwKLSAgICB1TG9uZyAqcFgpKTsKLQotbG9jYWwgaW50IHVuemxvY2FsX2dldFNob3J0IChwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxwWCkKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOwotICAgIHZvaWRwZiBmaWxlc3RyZWFtOwotICAgIHVMb25nICpwWDsKLXsKLSAgICB1TG9uZyB4IDsKLSAgICBpbnQgaTsKLSAgICBpbnQgZXJyOwotCi0gICAgZXJyID0gdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCA9ICh1TG9uZylpOwotCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICBlcnIgPSB1bnpsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4ICs9ICgodUxvbmcpaSk8PDg7Ci0KLSAgICBpZiAoZXJyPT1VTlpfT0spCi0gICAgICAgICpwWCA9IHg7Ci0gICAgZWxzZQotICAgICAgICAqcFggPSAwOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWxvY2FsIGludCB1bnpsb2NhbF9nZXRMb25nIE9GKCgKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAotICAgIHZvaWRwZiBmaWxlc3RyZWFtLAotICAgIHVMb25nICpwWCkpOwotCi1sb2NhbCBpbnQgdW56bG9jYWxfZ2V0TG9uZyAocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0scFgpCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKLSAgICB2b2lkcGYgZmlsZXN0cmVhbTsKLSAgICB1TG9uZyAqcFg7Ci17Ci0gICAgdUxvbmcgeCA7Ci0gICAgaW50IGk7Ci0gICAgaW50IGVycjsKLQotICAgIGVyciA9IHVuemxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggPSAodUxvbmcpaTsKLQotICAgIGlmIChlcnI9PVVOWl9PSykKLSAgICAgICAgZXJyID0gdW56bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCArPSAoKHVMb25nKWkpPDw4OwotCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICBlcnIgPSB1bnpsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4ICs9ICgodUxvbmcpaSk8PDE2OwotCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICBlcnIgPSB1bnpsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4ICs9ICgodUxvbmcpaSk8PDI0OwotCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICAqcFggPSB4OwotICAgIGVsc2UKLSAgICAgICAgKnBYID0gMDsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qIE15IG93biBzdHJjbXBpIC8gc3RyY2FzZWNtcCAqLwotbG9jYWwgaW50IHN0cmNtcGNhc2Vub3NlbnNpdGl2ZV9pbnRlcm5hbCAoZmlsZU5hbWUxLGZpbGVOYW1lMikKLSAgICBjb25zdCBjaGFyKiBmaWxlTmFtZTE7Ci0gICAgY29uc3QgY2hhciogZmlsZU5hbWUyOwotewotICAgIGZvciAoOzspCi0gICAgewotICAgICAgICBjaGFyIGMxPSooZmlsZU5hbWUxKyspOwotICAgICAgICBjaGFyIGMyPSooZmlsZU5hbWUyKyspOwotICAgICAgICBpZiAoKGMxPj0nYScpICYmIChjMTw9J3onKSkKLSAgICAgICAgICAgIGMxIC09IDB4MjA7Ci0gICAgICAgIGlmICgoYzI+PSdhJykgJiYgKGMyPD0neicpKQotICAgICAgICAgICAgYzIgLT0gMHgyMDsKLSAgICAgICAgaWYgKGMxPT0nXDAnKQotICAgICAgICAgICAgcmV0dXJuICgoYzI9PSdcMCcpID8gMCA6IC0xKTsKLSAgICAgICAgaWYgKGMyPT0nXDAnKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGlmIChjMTxjMikKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGMxPmMyKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotfQotCi0KLSNpZmRlZiAgQ0FTRVNFTlNJVElWSVRZREVGQVVMVF9OTwotI2RlZmluZSBDQVNFU0VOU0lUSVZJVFlERUZBVUxUVkFMVUUgMgotI2Vsc2UKLSNkZWZpbmUgQ0FTRVNFTlNJVElWSVRZREVGQVVMVFZBTFVFIDEKLSNlbmRpZgotCi0jaWZuZGVmIFNUUkNNUENBU0VOT1NFTlRJVkVGVU5DVElPTgotI2RlZmluZSBTVFJDTVBDQVNFTk9TRU5USVZFRlVOQ1RJT04gc3RyY21wY2FzZW5vc2Vuc2l0aXZlX2ludGVybmFsCi0jZW5kaWYKLQotLyoKLSAgIENvbXBhcmUgdHdvIGZpbGVuYW1lIChmaWxlTmFtZTEsZmlsZU5hbWUyKS4KLSAgIElmIGlDYXNlU2VuaXNpdml0eSA9IDEsIGNvbXBhcmlzaW9uIGlzIGNhc2Ugc2Vuc2l0aXZpdHkgKGxpa2Ugc3RyY21wKQotICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMiwgY29tcGFyaXNpb24gaXMgbm90IGNhc2Ugc2Vuc2l0aXZpdHkgKGxpa2Ugc3RyY21waQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN0cmNhc2VjbXApCi0gICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAwLCBjYXNlIHNlbnNpdGl2aXR5IGlzIGRlZmF1dCBvZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0KLSAgICAgICAgKGxpa2UgMSBvbiBVbml4LCAyIG9uIFdpbmRvd3MpCi0KLSovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlIChmaWxlTmFtZTEsZmlsZU5hbWUyLGlDYXNlU2Vuc2l0aXZpdHkpCi0gICAgY29uc3QgY2hhciogZmlsZU5hbWUxOwotICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lMjsKLSAgICBpbnQgaUNhc2VTZW5zaXRpdml0eTsKLXsKLSAgICBpZiAoaUNhc2VTZW5zaXRpdml0eT09MCkKLSAgICAgICAgaUNhc2VTZW5zaXRpdml0eT1DQVNFU0VOU0lUSVZJVFlERUZBVUxUVkFMVUU7Ci0KLSAgICBpZiAoaUNhc2VTZW5zaXRpdml0eT09MSkKLSAgICAgICAgcmV0dXJuIHN0cmNtcChmaWxlTmFtZTEsZmlsZU5hbWUyKTsKLQotICAgIHJldHVybiBTVFJDTVBDQVNFTk9TRU5USVZFRlVOQ1RJT04oZmlsZU5hbWUxLGZpbGVOYW1lMik7Ci19Ci0KLSNpZm5kZWYgQlVGUkVBRENPTU1FTlQKLSNkZWZpbmUgQlVGUkVBRENPTU1FTlQgKDB4NDAwKQotI2VuZGlmCi0KLS8qCi0gIExvY2F0ZSB0aGUgQ2VudHJhbCBkaXJlY3Rvcnkgb2YgYSB6aXBmaWxlIChhdCB0aGUgZW5kLCBqdXN0IGJlZm9yZQotICAgIHRoZSBnbG9iYWwgY29tbWVudCkKLSovCi1sb2NhbCB1TG9uZyB1bnpsb2NhbF9TZWFyY2hDZW50cmFsRGlyIE9GKCgKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAotICAgIHZvaWRwZiBmaWxlc3RyZWFtKSk7Ci0KLWxvY2FsIHVMb25nIHVuemxvY2FsX1NlYXJjaENlbnRyYWxEaXIocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0pCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKLSAgICB2b2lkcGYgZmlsZXN0cmVhbTsKLXsKLSAgICB1bnNpZ25lZCBjaGFyKiBidWY7Ci0gICAgdUxvbmcgdVNpemVGaWxlOwotICAgIHVMb25nIHVCYWNrUmVhZDsKLSAgICB1TG9uZyB1TWF4QmFjaz0weGZmZmY7IC8qIG1heGltdW0gc2l6ZSBvZiBnbG9iYWwgY29tbWVudCAqLwotICAgIHVMb25nIHVQb3NGb3VuZD0wOwotCi0gICAgaWYgKFpTRUVLKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwwLFpMSUJfRklMRUZVTkNfU0VFS19FTkQpICE9IDApCi0gICAgICAgIHJldHVybiAwOwotCi0KLSAgICB1U2l6ZUZpbGUgPSBaVEVMTCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0pOwotCi0gICAgaWYgKHVNYXhCYWNrPnVTaXplRmlsZSkKLSAgICAgICAgdU1heEJhY2sgPSB1U2l6ZUZpbGU7Ci0KLSAgICBidWYgPSAodW5zaWduZWQgY2hhciopQUxMT0MoQlVGUkVBRENPTU1FTlQrNCk7Ci0gICAgaWYgKGJ1Zj09TlVMTCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICB1QmFja1JlYWQgPSA0OwotICAgIHdoaWxlICh1QmFja1JlYWQ8dU1heEJhY2spCi0gICAgewotICAgICAgICB1TG9uZyB1UmVhZFNpemUsdVJlYWRQb3MgOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaWYgKHVCYWNrUmVhZCtCVUZSRUFEQ09NTUVOVD51TWF4QmFjaykKLSAgICAgICAgICAgIHVCYWNrUmVhZCA9IHVNYXhCYWNrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1QmFja1JlYWQrPUJVRlJFQURDT01NRU5UOwotICAgICAgICB1UmVhZFBvcyA9IHVTaXplRmlsZS11QmFja1JlYWQgOwotCi0gICAgICAgIHVSZWFkU2l6ZSA9ICgoQlVGUkVBRENPTU1FTlQrNCkgPCAodVNpemVGaWxlLXVSZWFkUG9zKSkgPwotICAgICAgICAgICAgICAgICAgICAgKEJVRlJFQURDT01NRU5UKzQpIDogKHVTaXplRmlsZS11UmVhZFBvcyk7Ci0gICAgICAgIGlmIChaU0VFSygqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sdVJlYWRQb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoWlJFQUQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLGJ1Zix1UmVhZFNpemUpIT11UmVhZFNpemUpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBmb3IgKGk9KGludCl1UmVhZFNpemUtMzsgKGktLSk+MDspCi0gICAgICAgICAgICBpZiAoKCgqKGJ1ZitpKSk9PTB4NTApICYmICgoKihidWYraSsxKSk9PTB4NGIpICYmCi0gICAgICAgICAgICAgICAgKCgqKGJ1ZitpKzIpKT09MHgwNSkgJiYgKCgqKGJ1ZitpKzMpKT09MHgwNikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdVBvc0ZvdW5kID0gdVJlYWRQb3MraTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBpZiAodVBvc0ZvdW5kIT0wKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIFRSWUZSRUUoYnVmKTsKLSAgICByZXR1cm4gdVBvc0ZvdW5kOwotfQotCi0vKgotICBPcGVuIGEgWmlwIGZpbGUuIHBhdGggY29udGFpbiB0aGUgZnVsbCBwYXRobmFtZSAoYnkgZXhhbXBsZSwKLSAgICAgb24gYSBXaW5kb3dzIE5UIGNvbXB1dGVyICJjOlxcdGVzdFxcemxpYjExNC56aXAiIG9yIG9uIGFuIFVuaXggY29tcHV0ZXIKLSAgICAgInpsaWIvemxpYjExNC56aXAiLgotICAgICBJZiB0aGUgemlwZmlsZSBjYW5ub3QgYmUgb3BlbmVkIChmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaW4gbm90IHZhbGlkKSwgdGhlCi0gICAgICAgcmV0dXJuIHZhbHVlIGlzIE5VTEwuCi0gICAgIEVsc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMgYSB1bnpGaWxlIEhhbmRsZSwgdXNhYmxlIHdpdGggb3RoZXIgZnVuY3Rpb24KLSAgICAgICBvZiB0aGlzIHVuemlwIHBhY2thZ2UuCi0qLwotZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuMiAocGF0aCwgcHpsaWJfZmlsZWZ1bmNfZGVmKQotICAgIGNvbnN0IGNoYXIgKnBhdGg7Ci0gICAgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKLXsKLSAgICB1bnpfcyB1czsKLSAgICB1bnpfcyAqczsKLSAgICB1TG9uZyBjZW50cmFsX3Bvcyx1TDsKLQotICAgIHVMb25nIG51bWJlcl9kaXNrOyAgICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZGlzdCwgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbmluZyBaSVAsIHVuc3VwcG9ydGVkLCBhbHdheXMgMCovCi0gICAgdUxvbmcgbnVtYmVyX2Rpc2tfd2l0aF9DRDsgIC8qIG51bWJlciB0aGUgdGhlIGRpc2sgd2l0aCBjZW50cmFsIGRpciwgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3BhbmluZyBaSVAsIHVuc3VwcG9ydGVkLCBhbHdheXMgMCovCi0gICAgdUxvbmcgbnVtYmVyX2VudHJ5X0NEOyAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjZW50cmFsIGRpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2FtZSB0aGFuIG51bWJlcl9lbnRyeSBvbiBub3NwYW4pICovCi0KLSAgICBpbnQgZXJyPVVOWl9PSzsKLQotICAgIGlmICh1bnpfY29weXJpZ2h0WzBdIT0nICcpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKHB6bGliX2ZpbGVmdW5jX2RlZj09TlVMTCkKLSAgICAgICAgZmlsbF9mb3Blbl9maWxlZnVuYygmdXMuel9maWxlZnVuYyk7Ci0gICAgZWxzZQotICAgICAgICB1cy56X2ZpbGVmdW5jID0gKnB6bGliX2ZpbGVmdW5jX2RlZjsKLQotICAgIHVzLmZpbGVzdHJlYW09ICgqKHVzLnpfZmlsZWZ1bmMuem9wZW5fZmlsZSkpKHVzLnpfZmlsZWZ1bmMub3BhcXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORyk7Ci0gICAgaWYgKHVzLmZpbGVzdHJlYW09PU5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY2VudHJhbF9wb3MgPSB1bnpsb2NhbF9TZWFyY2hDZW50cmFsRGlyKCZ1cy56X2ZpbGVmdW5jLHVzLmZpbGVzdHJlYW0pOwotICAgIGlmIChjZW50cmFsX3Bvcz09MCkKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmIChaU0VFSyh1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50cmFsX3BvcyxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIC8qIHRoZSBzaWduYXR1cmUsIGFscmVhZHkgY2hlY2tlZCAqLwotICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1TCkhPVVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgKi8KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrKSE9VU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLwotICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2tfd2l0aF9DRCkhPVVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVzLmdpLm51bWJlcl9lbnRyeSkhPVVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciAqLwotICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmbnVtYmVyX2VudHJ5X0NEKSE9VU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKChudW1iZXJfZW50cnlfQ0QhPXVzLmdpLm51bWJlcl9lbnRyeSkgfHwKLSAgICAgICAgKG51bWJlcl9kaXNrX3dpdGhfQ0QhPTApIHx8Ci0gICAgICAgIChudW1iZXJfZGlzayE9MCkpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLQotICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVzLnNpemVfY2VudHJhbF9kaXIpIT1VTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZQotICAgICAgICAgIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCi0gICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVzLm9mZnNldF9jZW50cmFsX2RpcikhPVVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIC8qIHppcGZpbGUgY29tbWVudCBsZW5ndGggKi8KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVzLmdpLnNpemVfY29tbWVudCkhPVVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICgoY2VudHJhbF9wb3M8dXMub2Zmc2V0X2NlbnRyYWxfZGlyK3VzLnNpemVfY2VudHJhbF9kaXIpICYmCi0gICAgICAgIChlcnI9PVVOWl9PSykpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLQotICAgIGlmIChlcnIhPVVOWl9PSykKLSAgICB7Ci0gICAgICAgIFpDTE9TRSh1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdXMuYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUgPSBjZW50cmFsX3BvcyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzLm9mZnNldF9jZW50cmFsX2Rpcit1cy5zaXplX2NlbnRyYWxfZGlyKTsKLSAgICB1cy5jZW50cmFsX3BvcyA9IGNlbnRyYWxfcG9zOwotICAgIHVzLnBmaWxlX2luX3ppcF9yZWFkID0gTlVMTDsKLSAgICB1cy5lbmNyeXB0ZWQgPSAwOwotCi0KLSAgICBzPSh1bnpfcyopQUxMT0Moc2l6ZW9mKHVuel9zKSk7Ci0gICAgKnM9dXM7Ci0gICAgdW56R29Ub0ZpcnN0RmlsZSgodW56RmlsZSlzKTsKLSAgICByZXR1cm4gKHVuekZpbGUpczsKLX0KLQotCi1leHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW4gKHBhdGgpCi0gICAgY29uc3QgY2hhciAqcGF0aDsKLXsKLSAgICByZXR1cm4gdW56T3BlbjIocGF0aCwgTlVMTCk7Ci19Ci0KLS8qCi0gIENsb3NlIGEgWmlwRmlsZSBvcGVuZWQgd2l0aCB1bnppcE9wZW4uCi0gIElmIHRoZXJlIGlzIGZpbGVzIGluc2lkZSB0aGUgLlppcCBvcGVuZWQgd2l0aCB1bnppcE9wZW5DdXJyZW50RmlsZSAoc2VlIGxhdGVyKSwKLSAgICB0aGVzZSBmaWxlcyBNVVNUIGJlIGNsb3NlZCB3aXRoIHVuemlwQ2xvc2VDdXJyZW50RmlsZSBiZWZvcmUgY2FsbCB1bnppcENsb3NlLgotICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0uICovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56Q2xvc2UgKGZpbGUpCi0gICAgdW56RmlsZSBmaWxlOwotewotICAgIHVuel9zKiBzOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56X3MqKWZpbGU7Ci0KLSAgICBpZiAocy0+cGZpbGVfaW5femlwX3JlYWQhPU5VTEwpCi0gICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUoZmlsZSk7Ci0KLSAgICBaQ0xPU0Uocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSk7Ci0gICAgVFJZRlJFRShzKTsKLSAgICByZXR1cm4gVU5aX09LOwotfQotCi0KLS8qCi0gIFdyaXRlIGluZm8gYWJvdXQgdGhlIFppcEZpbGUgaW4gdGhlICpwZ2xvYmFsX2luZm8gc3RydWN0dXJlLgotICBObyBwcmVwYXJhdGlvbiBvZiB0aGUgc3RydWN0dXJlIGlzIG5lZWRlZAotICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0uICovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R2V0R2xvYmFsSW5mbyAoZmlsZSxwZ2xvYmFsX2luZm8pCi0gICAgdW56RmlsZSBmaWxlOwotICAgIHVuel9nbG9iYWxfaW5mbyAqcGdsb2JhbF9pbmZvOwotewotICAgIHVuel9zKiBzOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56X3MqKWZpbGU7Ci0gICAgKnBnbG9iYWxfaW5mbz1zLT5naTsKLSAgICByZXR1cm4gVU5aX09LOwotfQotCi0KLS8qCi0gICBUcmFuc2xhdGUgZGF0ZS90aW1lIGZyb20gRG9zIGZvcm1hdCB0byB0bV91bnogKHJlYWRhYmxlIG1vcmUgZWFzaWx0eSkKLSovCi1sb2NhbCB2b2lkIHVuemxvY2FsX0Rvc0RhdGVUb1RtdURhdGUgKHVsRG9zRGF0ZSwgcHRtKQotICAgIHVMb25nIHVsRG9zRGF0ZTsKLSAgICB0bV91bnoqIHB0bTsKLXsKLSAgICB1TG9uZyB1RGF0ZTsKLSAgICB1RGF0ZSA9ICh1TG9uZykodWxEb3NEYXRlPj4xNik7Ci0gICAgcHRtLT50bV9tZGF5ID0gKHVJbnQpKHVEYXRlJjB4MWYpIDsKLSAgICBwdG0tPnRtX21vbiA9ICAodUludCkoKCgodURhdGUpJjB4MUUwKS8weDIwKS0xKSA7Ci0gICAgcHRtLT50bV95ZWFyID0gKHVJbnQpKCgodURhdGUmMHgwRkUwMCkvMHgwMjAwKSsxOTgwKSA7Ci0KLSAgICBwdG0tPnRtX2hvdXIgPSAodUludCkgKCh1bERvc0RhdGUgJjB4RjgwMCkvMHg4MDApOwotICAgIHB0bS0+dG1fbWluID0gICh1SW50KSAoKHVsRG9zRGF0ZSYweDdFMCkvMHgyMCkgOwotICAgIHB0bS0+dG1fc2VjID0gICh1SW50KSAoMioodWxEb3NEYXRlJjB4MWYpKSA7Ci19Ci0KLS8qCi0gIEdldCBJbmZvIGFib3V0IHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUsIHdpdGggaW50ZXJuYWwgb25seSBpbmZvCi0qLwotbG9jYWwgaW50IHVuemxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsIE9GKCh1bnpGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9maWxlX2luZm8gKnBmaWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9maWxlX2luZm9faW50ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBmaWxlX2luZm9faW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFGaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6Q29tbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemUpKTsKLQotbG9jYWwgaW50IHVuemxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsIChmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5mb19pbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLCBmaWxlTmFtZUJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFGaWVsZCwgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pDb21tZW50LCAgY29tbWVudEJ1ZmZlclNpemUpCi0gICAgdW56RmlsZSBmaWxlOwotICAgIHVuel9maWxlX2luZm8gKnBmaWxlX2luZm87Ci0gICAgdW56X2ZpbGVfaW5mb19pbnRlcm5hbCAqcGZpbGVfaW5mb19pbnRlcm5hbDsKLSAgICBjaGFyICpzekZpbGVOYW1lOwotICAgIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZTsKLSAgICB2b2lkICpleHRyYUZpZWxkOwotICAgIHVMb25nIGV4dHJhRmllbGRCdWZmZXJTaXplOwotICAgIGNoYXIgKnN6Q29tbWVudDsKLSAgICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZTsKLXsKLSAgICB1bnpfcyogczsKLSAgICB1bnpfZmlsZV9pbmZvIGZpbGVfaW5mbzsKLSAgICB1bnpfZmlsZV9pbmZvX2ludGVybmFsIGZpbGVfaW5mb19pbnRlcm5hbDsKLSAgICBpbnQgZXJyPVVOWl9PSzsKLSAgICB1TG9uZyB1TWFnaWM7Ci0gICAgbG9uZyBsU2Vlaz0wOwotCi0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bnpfcyopZmlsZTsKLSAgICBpZiAoWlNFRUsocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyK3MtPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlLAotICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotCi0gICAgLyogd2UgY2hlY2sgdGhlIG1hZ2ljICovCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdU1hZ2ljKSAhPSBVTlpfT0spCi0gICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgICAgICBlbHNlIGlmICh1TWFnaWMhPTB4MDIwMTRiNTApCi0gICAgICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby52ZXJzaW9uKSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby52ZXJzaW9uX25lZWRlZCkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uZmxhZykgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kKSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmRvc0RhdGUpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIHVuemxvY2FsX0Rvc0RhdGVUb1RtdURhdGUoZmlsZV9pbmZvLmRvc0RhdGUsJmZpbGVfaW5mby50bXVfZGF0ZSk7Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmNyYykgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYSkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQpICE9IFVOWl9PSykKLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmRpc2tfbnVtX3N0YXJ0KSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5pbnRlcm5hbF9mYSkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5leHRlcm5hbF9mYSkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuemxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mb19pbnRlcm5hbC5vZmZzZXRfY3VyZmlsZSkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVuYW1lOwotICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChzekZpbGVOYW1lIT1OVUxMKSkKLSAgICB7Ci0gICAgICAgIHVMb25nIHVTaXplUmVhZCA7Ci0gICAgICAgIGlmIChmaWxlX2luZm8uc2l6ZV9maWxlbmFtZTxmaWxlTmFtZUJ1ZmZlclNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgICooc3pGaWxlTmFtZStmaWxlX2luZm8uc2l6ZV9maWxlbmFtZSk9J1wwJzsKLSAgICAgICAgICAgIHVTaXplUmVhZCA9IGZpbGVfaW5mby5zaXplX2ZpbGVuYW1lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVTaXplUmVhZCA9IGZpbGVOYW1lQnVmZmVyU2l6ZTsKLQotICAgICAgICBpZiAoKGZpbGVfaW5mby5zaXplX2ZpbGVuYW1lPjApICYmIChmaWxlTmFtZUJ1ZmZlclNpemU+MCkpCi0gICAgICAgICAgICBpZiAoWlJFQUQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxzekZpbGVOYW1lLHVTaXplUmVhZCkhPXVTaXplUmVhZCkKLSAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgICAgICBsU2VlayAtPSB1U2l6ZVJlYWQ7Ci0gICAgfQotCi0KLSAgICBpZiAoKGVycj09VU5aX09LKSAmJiAoZXh0cmFGaWVsZCE9TlVMTCkpCi0gICAgewotICAgICAgICB1TG9uZyB1U2l6ZVJlYWQgOwotICAgICAgICBpZiAoZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYTxleHRyYUZpZWxkQnVmZmVyU2l6ZSkKLSAgICAgICAgICAgIHVTaXplUmVhZCA9IGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVTaXplUmVhZCA9IGV4dHJhRmllbGRCdWZmZXJTaXplOwotCi0gICAgICAgIGlmIChsU2VlayE9MCkKLSAgICAgICAgICAgIGlmIChaU0VFSyhzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLGxTZWVrLFpMSUJfRklMRUZVTkNfU0VFS19DVVIpPT0wKQotICAgICAgICAgICAgICAgIGxTZWVrPTA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgaWYgKChmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhPjApICYmIChleHRyYUZpZWxkQnVmZmVyU2l6ZT4wKSkKLSAgICAgICAgICAgIGlmIChaUkVBRChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLGV4dHJhRmllbGQsdVNpemVSZWFkKSE9dVNpemVSZWFkKQotICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgICAgIGxTZWVrICs9IGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEgLSB1U2l6ZVJlYWQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE7Ci0KLQotICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChzekNvbW1lbnQhPU5VTEwpKQotICAgIHsKLSAgICAgICAgdUxvbmcgdVNpemVSZWFkIDsKLSAgICAgICAgaWYgKGZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudDxjb21tZW50QnVmZmVyU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgKihzekNvbW1lbnQrZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50KT0nXDAnOwotICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVTaXplUmVhZCA9IGNvbW1lbnRCdWZmZXJTaXplOwotCi0gICAgICAgIGlmIChsU2VlayE9MCkKLSAgICAgICAgICAgIGlmIChaU0VFSyhzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLGxTZWVrLFpMSUJfRklMRUZVTkNfU0VFS19DVVIpPT0wKQotICAgICAgICAgICAgICAgIGxTZWVrPTA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICAgICAgaWYgKChmaWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQ+MCkgJiYgKGNvbW1lbnRCdWZmZXJTaXplPjApKQotICAgICAgICAgICAgaWYgKFpSRUFEKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sc3pDb21tZW50LHVTaXplUmVhZCkhPXVTaXplUmVhZCkKLSAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgICAgICBsU2Vlays9ZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50IC0gdVNpemVSZWFkOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGxTZWVrKz1maWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQ7Ci0KLSAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocGZpbGVfaW5mbyE9TlVMTCkpCi0gICAgICAgICpwZmlsZV9pbmZvPWZpbGVfaW5mbzsKLQotICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChwZmlsZV9pbmZvX2ludGVybmFsIT1OVUxMKSkKLSAgICAgICAgKnBmaWxlX2luZm9faW50ZXJuYWw9ZmlsZV9pbmZvX2ludGVybmFsOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0KLS8qCi0gIFdyaXRlIGluZm8gYWJvdXQgdGhlIFppcEZpbGUgaW4gdGhlICpwZ2xvYmFsX2luZm8gc3RydWN0dXJlLgotICBObyBwcmVwYXJhdGlvbiBvZiB0aGUgc3RydWN0dXJlIGlzIG5lZWRlZAotICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0uCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEN1cnJlbnRGaWxlSW5mbyAoZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLCBmaWxlTmFtZUJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUZpZWxkLCBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q29tbWVudCwgIGNvbW1lbnRCdWZmZXJTaXplKQotICAgIHVuekZpbGUgZmlsZTsKLSAgICB1bnpfZmlsZV9pbmZvICpwZmlsZV9pbmZvOwotICAgIGNoYXIgKnN6RmlsZU5hbWU7Ci0gICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplOwotICAgIHZvaWQgKmV4dHJhRmllbGQ7Ci0gICAgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemU7Ci0gICAgY2hhciAqc3pDb21tZW50OwotICAgIHVMb25nIGNvbW1lbnRCdWZmZXJTaXplOwotewotICAgIHJldHVybiB1bnpsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbChmaWxlLHBmaWxlX2luZm8sTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6RmlsZU5hbWUsZmlsZU5hbWVCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFGaWVsZCxleHRyYUZpZWxkQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q29tbWVudCxjb21tZW50QnVmZmVyU2l6ZSk7Ci19Ci0KLS8qCi0gIFNldCB0aGUgY3VycmVudCBmaWxlIG9mIHRoZSB6aXBmaWxlIHRvIHRoZSBmaXJzdCBmaWxlLgotICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0KLSovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub0ZpcnN0RmlsZSAoZmlsZSkKLSAgICB1bnpGaWxlIGZpbGU7Ci17Ci0gICAgaW50IGVycj1VTlpfT0s7Ci0gICAgdW56X3MqIHM7Ci0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bnpfcyopZmlsZTsKLSAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXI9cy0+b2Zmc2V0X2NlbnRyYWxfZGlyOwotICAgIHMtPm51bV9maWxlPTA7Ci0gICAgZXJyPXVuemxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUsJnMtPmN1cl9maWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCwwKTsKLSAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoKLSAgU2V0IHRoZSBjdXJyZW50IGZpbGUgb2YgdGhlIHppcGZpbGUgdG8gdGhlIG5leHQgZmlsZS4KLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtCi0gIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRSBpZiB0aGUgYWN0dWFsIGZpbGUgd2FzIHRoZSBsYXRlc3QuCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9OZXh0RmlsZSAoZmlsZSkKLSAgICB1bnpGaWxlIGZpbGU7Ci17Ci0gICAgdW56X3MqIHM7Ci0gICAgaW50IGVycjsKLQotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56X3MqKWZpbGU7Ci0gICAgaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spCi0gICAgICAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKLSAgICBpZiAocy0+Z2kubnVtYmVyX2VudHJ5ICE9IDB4ZmZmZikgICAgLyogMl4xNiBmaWxlcyBvdmVyZmxvdyBoYWNrICovCi0gICAgICBpZiAocy0+bnVtX2ZpbGUrMT09cy0+Z2kubnVtYmVyX2VudHJ5KQotICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7Ci0KLSAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIgKz0gU0laRUNFTlRSQUxESVJJVEVNICsgcy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVuYW1lICsKLSAgICAgICAgICAgIHMtPmN1cl9maWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhICsgcy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCA7Ci0gICAgcy0+bnVtX2ZpbGUrKzsKLSAgICBlcnIgPSB1bnpsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbChmaWxlLCZzLT5jdXJfZmlsZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMLDApOwotICAgIHMtPmN1cnJlbnRfZmlsZV9vayA9IChlcnIgPT0gVU5aX09LKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qCi0gIFRyeSBsb2NhdGUgdGhlIGZpbGUgc3pGaWxlTmFtZSBpbiB0aGUgemlwZmlsZS4KLSAgRm9yIHRoZSBpQ2FzZVNlbnNpdGl2aXR5IHNpZ25pZmljYXRpb24sIHNlZSB1bnppcFN0cmluZ0ZpbGVOYW1lQ29tcGFyZQotCi0gIHJldHVybiB2YWx1ZSA6Ci0gIFVOWl9PSyBpZiB0aGUgZmlsZSBpcyBmb3VuZC4gSXQgYmVjb21lcyB0aGUgY3VycmVudCBmaWxlLgotICBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRSBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQKLSovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56TG9jYXRlRmlsZSAoZmlsZSwgc3pGaWxlTmFtZSwgaUNhc2VTZW5zaXRpdml0eSkKLSAgICB1bnpGaWxlIGZpbGU7Ci0gICAgY29uc3QgY2hhciAqc3pGaWxlTmFtZTsKLSAgICBpbnQgaUNhc2VTZW5zaXRpdml0eTsKLXsKLSAgICB1bnpfcyogczsKLSAgICBpbnQgZXJyOwotCi0gICAgLyogV2UgcmVtZW1iZXIgdGhlICdjdXJyZW50JyBwb3NpdGlvbiBpbiB0aGUgZmlsZSBzbyB0aGF0IHdlIGNhbiBqdW1wCi0gICAgICogYmFjayB0aGVyZSBpZiB3ZSBmYWlsLgotICAgICAqLwotICAgIHVuel9maWxlX2luZm8gY3VyX2ZpbGVfaW5mb1NhdmVkOwotICAgIHVuel9maWxlX2luZm9faW50ZXJuYWwgY3VyX2ZpbGVfaW5mb19pbnRlcm5hbFNhdmVkOwotICAgIHVMb25nIG51bV9maWxlU2F2ZWQ7Ci0gICAgdUxvbmcgcG9zX2luX2NlbnRyYWxfZGlyU2F2ZWQ7Ci0KLQotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0KLSAgICBpZiAoc3RybGVuKHN6RmlsZU5hbWUpPj1VTlpfTUFYRklMRU5BTUVJTlpJUCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCi0gICAgcz0odW56X3MqKWZpbGU7Ci0gICAgaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spCi0gICAgICAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKLQotICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgKi8KLSAgICBudW1fZmlsZVNhdmVkID0gcy0+bnVtX2ZpbGU7Ci0gICAgcG9zX2luX2NlbnRyYWxfZGlyU2F2ZWQgPSBzLT5wb3NfaW5fY2VudHJhbF9kaXI7Ci0gICAgY3VyX2ZpbGVfaW5mb1NhdmVkID0gcy0+Y3VyX2ZpbGVfaW5mbzsKLSAgICBjdXJfZmlsZV9pbmZvX2ludGVybmFsU2F2ZWQgPSBzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsOwotCi0gICAgZXJyID0gdW56R29Ub0ZpcnN0RmlsZShmaWxlKTsKLQotICAgIHdoaWxlIChlcnIgPT0gVU5aX09LKQotICAgIHsKLSAgICAgICAgY2hhciBzekN1cnJlbnRGaWxlTmFtZVtVTlpfTUFYRklMRU5BTUVJTlpJUCsxXTsKLSAgICAgICAgZXJyID0gdW56R2V0Q3VycmVudEZpbGVJbmZvKGZpbGUsTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q3VycmVudEZpbGVOYW1lLHNpemVvZihzekN1cnJlbnRGaWxlTmFtZSktMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDApOwotICAgICAgICBpZiAoZXJyID09IFVOWl9PSykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZShzekN1cnJlbnRGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pGaWxlTmFtZSxpQ2FzZVNlbnNpdGl2aXR5KT09MCkKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5aX09LOwotICAgICAgICAgICAgZXJyID0gdW56R29Ub05leHRGaWxlKGZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogV2UgZmFpbGVkLCBzbyByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgJ2N1cnJlbnQgZmlsZScgdG8gd2hlcmUgd2UKLSAgICAgKiB3ZXJlLgotICAgICAqLwotICAgIHMtPm51bV9maWxlID0gbnVtX2ZpbGVTYXZlZCA7Ci0gICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyID0gcG9zX2luX2NlbnRyYWxfZGlyU2F2ZWQgOwotICAgIHMtPmN1cl9maWxlX2luZm8gPSBjdXJfZmlsZV9pbmZvU2F2ZWQ7Ci0gICAgcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCA9IGN1cl9maWxlX2luZm9faW50ZXJuYWxTYXZlZDsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDb250cmlidXRlZCBieSBSeWFuIEhha3NpIChtYWlsdG86Ly9jcnlvZ2VuQGluZm9zZXJ2ZS5uZXQpCi0vLyBJIG5lZWQgcmFuZG9tIGFjY2VzcwotLy8KLS8vIEZ1cnRoZXIgb3B0aW1pemF0aW9uIGNvdWxkIGJlIHJlYWxpemVkIGJ5IGFkZGluZyBhbiBhYmlsaXR5Ci0vLyB0byBjYWNoZSB0aGUgZGlyZWN0b3J5IGluIG1lbW9yeS4gVGhlIGdvYWwgYmVpbmcgYSBzaW5nbGUKLS8vIGNvbXByZWhlbnNpdmUgZmlsZSByZWFkIHRvIHB1dCB0aGUgZmlsZSBJIG5lZWQgaW4gYSBtZW1vcnkuCi0qLwotCi0vKgotdHlwZWRlZiBzdHJ1Y3QgdW56X2ZpbGVfcG9zX3MKLXsKLSAgICB1TG9uZyBwb3NfaW5femlwX2RpcmVjdG9yeTsgICAvLyBvZmZzZXQgaW4gZmlsZQotICAgIHVMb25nIG51bV9vZl9maWxlOyAgICAgICAgICAgIC8vICMgb2YgZmlsZQotfSB1bnpfZmlsZV9wb3M7Ci0qLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R2V0RmlsZVBvcyhmaWxlLCBmaWxlX3BvcykKLSAgICB1bnpGaWxlIGZpbGU7Ci0gICAgdW56X2ZpbGVfcG9zKiBmaWxlX3BvczsKLXsKLSAgICB1bnpfcyogczsKLQotICAgIGlmIChmaWxlPT1OVUxMIHx8IGZpbGVfcG9zPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56X3MqKWZpbGU7Ci0gICAgaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spCi0gICAgICAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKLQotICAgIGZpbGVfcG9zLT5wb3NfaW5femlwX2RpcmVjdG9yeSAgPSBzLT5wb3NfaW5fY2VudHJhbF9kaXI7Ci0gICAgZmlsZV9wb3MtPm51bV9vZl9maWxlICAgICAgICAgICA9IHMtPm51bV9maWxlOwotCi0gICAgcmV0dXJuIFVOWl9PSzsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaWxlUG9zKGZpbGUsIGZpbGVfcG9zKQotICAgIHVuekZpbGUgZmlsZTsKLSAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zOwotewotICAgIHVuel9zKiBzOwotICAgIGludCBlcnI7Ci0KLSAgICBpZiAoZmlsZT09TlVMTCB8fCBmaWxlX3Bvcz09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotCi0gICAgLyoganVtcCB0byB0aGUgcmlnaHQgc3BvdCAqLwotICAgIHMtPnBvc19pbl9jZW50cmFsX2RpciA9IGZpbGVfcG9zLT5wb3NfaW5femlwX2RpcmVjdG9yeTsKLSAgICBzLT5udW1fZmlsZSAgICAgICAgICAgPSBmaWxlX3Bvcy0+bnVtX29mX2ZpbGU7Ci0KLSAgICAvKiBzZXQgdGhlIGN1cnJlbnQgZmlsZSAqLwotICAgIGVyciA9IHVuemxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUsJnMtPmN1cl9maWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwsMCk7Ci0gICAgLyogcmV0dXJuIHJlc3VsdHMgKi8KLSAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoKLS8vIFVuemlwIEhlbHBlciBGdW5jdGlvbnMgLSBzaG91bGQgYmUgaGVyZT8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSovCi0KLS8qCi0gIFJlYWQgdGhlIGxvY2FsIGhlYWRlciBvZiB0aGUgY3VycmVudCB6aXBmaWxlCi0gIENoZWNrIHRoZSBjb2hlcmVuY3kgb2YgdGhlIGxvY2FsIGhlYWRlciBhbmQgaW5mbyBpbiB0aGUgZW5kIG9mIGNlbnRyYWwKLSAgICAgICAgZGlyZWN0b3J5IGFib3V0IHRoaXMgZmlsZQotICBzdG9yZSBpbiAqcGlTaXplVmFyIHRoZSBzaXplIG9mIGV4dHJhIGluZm8gaW4gbG9jYWwgaGVhZGVyCi0gICAgICAgIChmaWxlbmFtZSBhbmQgc2l6ZSBvZiBleHRyYSBmaWVsZCBkYXRhKQotKi8KLWxvY2FsIGludCB1bnpsb2NhbF9DaGVja0N1cnJlbnRGaWxlQ29oZXJlbmN5SGVhZGVyIChzLHBpU2l6ZVZhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNpemVfbG9jYWxfZXh0cmFmaWVsZCkKLSAgICB1bnpfcyogczsKLSAgICB1SW50KiBwaVNpemVWYXI7Ci0gICAgdUxvbmcgKnBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZDsKLSAgICB1SW50ICAqcHNpemVfbG9jYWxfZXh0cmFmaWVsZDsKLXsKLSAgICB1TG9uZyB1TWFnaWMsdURhdGEsdUZsYWdzOwotICAgIHVMb25nIHNpemVfZmlsZW5hbWU7Ci0gICAgdUxvbmcgc2l6ZV9leHRyYV9maWVsZDsKLSAgICBpbnQgZXJyPVVOWl9PSzsKLQotICAgICpwaVNpemVWYXIgPSAwOwotICAgICpwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQgPSAwOwotICAgICpwc2l6ZV9sb2NhbF9leHRyYWZpZWxkID0gMDsKLQotICAgIGlmIChaU0VFSyhzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKLSAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKLQotCi0gICAgaWYgKGVycj09VU5aX09LKQotICAgICAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdU1hZ2ljKSAhPSBVTlpfT0spCi0gICAgICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgICAgICBlbHNlIGlmICh1TWFnaWMhPTB4MDQwMzRiNTApCi0gICAgICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0vKgotICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLndWZXJzaW9uKSkKLSAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwotKi8KLSAgICBpZiAodW56bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVGbGFncykgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotCi0gICAgaWYgKHVuemxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCkpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLQotICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9MCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QhPVpfREVGTEFURUQpKQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykgLyogZGF0ZS90aW1lICovCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0KLSAgICBpZiAodW56bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykgLyogY3JjICovCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8uY3JjKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1RmxhZ3MgJiA4KT09MCkpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBzaXplIGNvbXByICovCi0gICAgICAgIGVycj1VTlpfRVJSTk87Ci0gICAgZWxzZSBpZiAoKGVycj09VU5aX09LKSAmJiAodURhdGEhPXMtPmN1cl9maWxlX2luZm8uY29tcHJlc3NlZF9zaXplKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1RmxhZ3MgJiA4KT09MCkpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBzaXplIHVuY29tcHIgKi8KLSAgICAgICAgZXJyPVVOWl9FUlJOTzsKLSAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby51bmNvbXByZXNzZWRfc2l6ZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodUZsYWdzICYgOCk9PTApKQotICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7Ci0KLQotICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmc2l6ZV9maWxlbmFtZSkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHNpemVfZmlsZW5hbWUhPXMtPmN1cl9maWxlX2luZm8uc2l6ZV9maWxlbmFtZSkpCi0gICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKLQotICAgICpwaVNpemVWYXIgKz0gKHVJbnQpc2l6ZV9maWxlbmFtZTsKLQotICAgIGlmICh1bnpsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmc2l6ZV9leHRyYV9maWVsZCkgIT0gVU5aX09LKQotICAgICAgICBlcnI9VU5aX0VSUk5POwotICAgICpwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQ9IHMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRVpJUExPQ0FMSEVBREVSICsgc2l6ZV9maWxlbmFtZTsKLSAgICAqcHNpemVfbG9jYWxfZXh0cmFmaWVsZCA9ICh1SW50KXNpemVfZXh0cmFfZmllbGQ7Ci0KLSAgICAqcGlTaXplVmFyICs9ICh1SW50KXNpemVfZXh0cmFfZmllbGQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKgotICBPcGVuIGZvciByZWFkaW5nIGRhdGEgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZS4KLSAgSWYgdGhlcmUgaXMgbm8gZXJyb3IgYW5kIHRoZSBmaWxlIGlzIG9wZW5lZCwgdGhlIHJldHVybiB2YWx1ZSBpcyBVTlpfT0suCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTMgKGZpbGUsIG1ldGhvZCwgbGV2ZWwsIHJhdywgcGFzc3dvcmQpCi0gICAgdW56RmlsZSBmaWxlOwotICAgIGludCogbWV0aG9kOwotICAgIGludCogbGV2ZWw7Ci0gICAgaW50IHJhdzsKLSAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKLXsKLSAgICBpbnQgZXJyPVVOWl9PSzsKLSAgICB1SW50IGlTaXplVmFyOwotICAgIHVuel9zKiBzOwotICAgIGZpbGVfaW5femlwX3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOwotICAgIHVMb25nIG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOyAgLyogb2Zmc2V0IG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLwotICAgIHVJbnQgIHNpemVfbG9jYWxfZXh0cmFmaWVsZDsgICAgLyogc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgKi8KLSMgICAgaWZuZGVmIE5PVU5DUllQVAotICAgIGNoYXIgc291cmNlWzEyXTsKLSMgICAgZWxzZQotICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0jICAgIGVuZGlmCi0KLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0KLSAgICBpZiAocy0+cGZpbGVfaW5femlwX3JlYWQgIT0gTlVMTCkKLSAgICAgICAgdW56Q2xvc2VDdXJyZW50RmlsZShmaWxlKTsKLQotICAgIGlmICh1bnpsb2NhbF9DaGVja0N1cnJlbnRGaWxlQ29oZXJlbmN5SGVhZGVyKHMsJmlTaXplVmFyLAotICAgICAgICAgICAgICAgICZvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCwmc2l6ZV9sb2NhbF9leHRyYWZpZWxkKSE9VU5aX09LKQotICAgICAgICByZXR1cm4gVU5aX0JBRFpJUEZJTEU7Ci0KLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvID0gKGZpbGVfaW5femlwX3JlYWRfaW5mb19zKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTExPQyhzaXplb2YoZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MpKTsKLSAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOwotCi0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI9KGNoYXIqKUFMTE9DKFVOWl9CVUZTSVpFKTsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5vZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCA9IG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnNpemVfbG9jYWxfZXh0cmFmaWVsZCA9IHNpemVfbG9jYWxfZXh0cmFmaWVsZDsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfbG9jYWxfZXh0cmFmaWVsZD0wOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJhdz1yYXc7Ci0KLSAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI9PU5VTEwpCi0gICAgewotICAgICAgICBUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8pOwotICAgICAgICByZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7Ci0gICAgfQotCi0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkPTA7Ci0KLSAgICBpZiAobWV0aG9kIT1OVUxMKQotICAgICAgICAqbWV0aG9kID0gKGludClzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZDsKLQotICAgIGlmIChsZXZlbCE9TlVMTCkKLSAgICB7Ci0gICAgICAgICpsZXZlbCA9IDY7Ci0gICAgICAgIHN3aXRjaCAocy0+Y3VyX2ZpbGVfaW5mby5mbGFnICYgMHgwNikKLSAgICAgICAgewotICAgICAgICAgIGNhc2UgNiA6ICpsZXZlbCA9IDE7IGJyZWFrOwotICAgICAgICAgIGNhc2UgNCA6ICpsZXZlbCA9IDI7IGJyZWFrOwotICAgICAgICAgIGNhc2UgMiA6ICpsZXZlbCA9IDk7IGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9MCkgJiYKLSAgICAgICAgKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kIT1aX0RFRkxBVEVEKSkKLSAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOwotCi0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzJfd2FpdD1zLT5jdXJfZmlsZV9pbmZvLmNyYzsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMj0wOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNvbXByZXNzaW9uX21ldGhvZCA9Ci0gICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZDsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5maWxlc3RyZWFtPXMtPmZpbGVzdHJlYW07Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+el9maWxlZnVuYz1zLT56X2ZpbGVmdW5jOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlPXMtPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOwotCi0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dCA9IDA7Ci0KLSAgICBpZiAoKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kPT1aX0RFRkxBVEVEKSAmJgotICAgICAgICAoIXJhdykpCi0gICAgewotICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7Ci0gICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0gICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfaW4gPSAodm9pZHBmKTA7Ci0gICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gPSAwOwotCi0gICAgICBlcnI9aW5mbGF0ZUluaXQyKCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0sIC1NQVhfV0JJVFMpOwotICAgICAgaWYgKGVyciA9PSBaX09LKQotICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQ9MTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgVFJZRlJFRShwZmlsZV9pbl96aXBfcmVhZF9pbmZvKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgIH0KLSAgICAgICAgLyogd2luZG93Qml0cyBpcyBwYXNzZWQgPCAwIHRvIHRlbGwgdGhhdCB0aGVyZSBpcyBubyB6bGliIGhlYWRlci4KLSAgICAgICAgICogTm90ZSB0aGF0IGluIHRoaXMgY2FzZSBpbmZsYXRlICpyZXF1aXJlcyogYW4gZXh0cmEgImR1bW15IiBieXRlCi0gICAgICAgICAqIGFmdGVyIHRoZSBjb21wcmVzc2VkIHN0cmVhbSBpbiBvcmRlciB0byBjb21wbGV0ZSBkZWNvbXByZXNzaW9uIGFuZAotICAgICAgICAgKiByZXR1cm4gWl9TVFJFQU1fRU5ELgotICAgICAgICAgKiBJbiB1bnppcCwgaSBkb24ndCB3YWl0IGFic29sdXRlbHkgWl9TVFJFQU1fRU5EIGJlY2F1c2UgSSBrbm93biB0aGUKLSAgICAgICAgICogc2l6ZSBvZiBib3RoIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBkYXRhCi0gICAgICAgICAqLwotICAgIH0KLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCA9Ci0gICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSA7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCA9Ci0gICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplIDsKLQotCi0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2luX3ppcGZpbGUgPQotICAgICAgICAgICAgcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbC5vZmZzZXRfY3VyZmlsZSArIFNJWkVaSVBMT0NBTEhFQURFUiArCi0gICAgICAgICAgICAgIGlTaXplVmFyOwotCi0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpMDsKLQotICAgIHMtPnBmaWxlX2luX3ppcF9yZWFkID0gcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKLQotIyAgICBpZm5kZWYgTk9VTkNSWVBUCi0gICAgaWYgKHBhc3N3b3JkICE9IE5VTEwpCi0gICAgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgcy0+cGNyY18zMl90YWIgPSBnZXRfY3JjX3RhYmxlKCk7Ci0gICAgICAgIGluaXRfa2V5cyhwYXNzd29yZCxzLT5rZXlzLHMtPnBjcmNfMzJfdGFiKTsKLSAgICAgICAgaWYgKFpTRUVLKHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBzLT5wZmlsZV9pbl96aXBfcmVhZC0+cG9zX2luX3ppcGZpbGUgKwotICAgICAgICAgICAgICAgICAgICAgcy0+cGZpbGVfaW5femlwX3JlYWQtPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlLAotICAgICAgICAgICAgICAgICAgU0VFS19TRVQpIT0wKQotICAgICAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOwotICAgICAgICBpZihaUkVBRChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHNvdXJjZSwgMTIpPDEyKQotICAgICAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGk8MTI7IGkrKykKLSAgICAgICAgICAgIHpkZWNvZGUocy0+a2V5cyxzLT5wY3JjXzMyX3RhYixzb3VyY2VbaV0pOwotCi0gICAgICAgIHMtPnBmaWxlX2luX3ppcF9yZWFkLT5wb3NfaW5femlwZmlsZSs9MTI7Ci0gICAgICAgIHMtPmVuY3J5cHRlZD0xOwotICAgIH0KLSMgICAgZW5kaWYKLQotCi0gICAgcmV0dXJuIFVOWl9PSzsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZSAoZmlsZSkKLSAgICB1bnpGaWxlIGZpbGU7Ci17Ci0gICAgcmV0dXJuIHVuek9wZW5DdXJyZW50RmlsZTMoZmlsZSwgTlVMTCwgTlVMTCwgMCwgTlVMTCk7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCAoZmlsZSwgcGFzc3dvcmQpCi0gICAgdW56RmlsZSBmaWxlOwotICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOwotewotICAgIHJldHVybiB1bnpPcGVuQ3VycmVudEZpbGUzKGZpbGUsIE5VTEwsIE5VTEwsIDAsIHBhc3N3b3JkKTsKLX0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTIgKGZpbGUsbWV0aG9kLGxldmVsLHJhdykKLSAgICB1bnpGaWxlIGZpbGU7Ci0gICAgaW50KiBtZXRob2Q7Ci0gICAgaW50KiBsZXZlbDsKLSAgICBpbnQgcmF3OwotewotICAgIHJldHVybiB1bnpPcGVuQ3VycmVudEZpbGUzKGZpbGUsIG1ldGhvZCwgbGV2ZWwsIHJhdywgTlVMTCk7Ci19Ci0KLS8qCi0gIFJlYWQgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBmaWxlLgotICBidWYgY29udGFpbiBidWZmZXIgd2hlcmUgZGF0YSBtdXN0IGJlIGNvcGllZAotICBsZW4gdGhlIHNpemUgb2YgYnVmLgotCi0gIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGUgY29waWVkIGlmIHNvbWVzIGJ5dGVzIGFyZSBjb3BpZWQKLSAgcmV0dXJuIDAgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkCi0gIHJldHVybiA8MCB3aXRoIGVycm9yIGNvZGUgaWYgdGhlcmUgaXMgYW4gZXJyb3IKLSAgICAoVU5aX0VSUk5PIGZvciBJTyBlcnJvciwgb3IgekxpYiBlcnJvciBmb3IgdW5jb21wcmVzcyBlcnJvcikKLSovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56UmVhZEN1cnJlbnRGaWxlICAoZmlsZSwgYnVmLCBsZW4pCi0gICAgdW56RmlsZSBmaWxlOwotICAgIHZvaWRwIGJ1ZjsKLSAgICB1bnNpZ25lZCBsZW47Ci17Ci0gICAgaW50IGVycj1VTlpfT0s7Ci0gICAgdUludCBpUmVhZCA9IDA7Ci0gICAgdW56X3MqIHM7Ci0gICAgZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bnpfcyopZmlsZTsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOwotCi0gICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQotCi0gICAgaWYgKChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlciA9PSBOVUxMKSkKLSAgICAgICAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFOwotICAgIGlmIChsZW49PTApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0ID0gKEJ5dGVmKilidWY7Ci0KLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpbGVuOwotCi0gICAgaWYgKChsZW4+cGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCkgJiYKLSAgICAgICAgKCEocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkpCi0gICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPQotICAgICAgICAgICAgKHVJbnQpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZDsKLQotICAgIGlmICgobGVuPnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkKwotICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4pICYmCi0gICAgICAgICAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkKLSAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA9Ci0gICAgICAgICAgICAodUludClwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbjsKLQotICAgIHdoaWxlIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0PjApCi0gICAgewotICAgICAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbj09MCkgJiYKLSAgICAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZD4wKSkKLSAgICAgICAgewotICAgICAgICAgICAgdUludCB1UmVhZFRoaXMgPSBVTlpfQlVGU0laRTsKLSAgICAgICAgICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZDx1UmVhZFRoaXMpCi0gICAgICAgICAgICAgICAgdVJlYWRUaGlzID0gKHVJbnQpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQ7Ci0gICAgICAgICAgICBpZiAodVJlYWRUaGlzID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVOWl9FT0Y7Ci0gICAgICAgICAgICBpZiAoWlNFRUsocGZpbGVfaW5femlwX3JlYWRfaW5mby0+el9maWxlZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnBvc19pbl96aXBmaWxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5aX0VSUk5POwotICAgICAgICAgICAgaWYgKFpSRUFEKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICB1UmVhZFRoaXMpIT11UmVhZFRoaXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKLQotCi0jICAgICAgICAgICAgaWZuZGVmIE5PVU5DUllQVAotICAgICAgICAgICAgaWYocy0+ZW5jcnlwdGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVJbnQgaTsKLSAgICAgICAgICAgICAgICBmb3IoaT0wO2k8dVJlYWRUaGlzO2krKykKLSAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyW2ldID0KLSAgICAgICAgICAgICAgICAgICAgICB6ZGVjb2RlKHMtPmtleXMscy0+cGNyY18zMl90YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcltpXSk7Ci0gICAgICAgICAgICB9Ci0jICAgICAgICAgICAgZW5kaWYKLQotCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfaW5femlwZmlsZSArPSB1UmVhZFRoaXM7Ci0KLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkLT11UmVhZFRoaXM7Ci0KLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X2luID0KLSAgICAgICAgICAgICAgICAoQnl0ZWYqKXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyOwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpdVJlYWRUaGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jb21wcmVzc2lvbl9tZXRob2Q9PTApIHx8IChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXcpKQotICAgICAgICB7Ci0gICAgICAgICAgICB1SW50IHVEb0NvcHksaSA7Ci0KLSAgICAgICAgICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID09IDApICYmCi0gICAgICAgICAgICAgICAgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkID09IDApKQotICAgICAgICAgICAgICAgIHJldHVybiAoaVJlYWQ9PTApID8gVU5aX0VPRiA6IGlSZWFkOwotCi0gICAgICAgICAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luKQotICAgICAgICAgICAgICAgIHVEb0NvcHkgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0IDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1RG9Db3B5ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luIDsKLQotICAgICAgICAgICAgZm9yIChpPTA7aTx1RG9Db3B5O2krKykKLSAgICAgICAgICAgICAgICAqKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dCtpKSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X2luK2kpOwotCi0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiA9IGNyYzMyKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVEb0NvcHkpOwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZC09dURvQ29weTsKLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiAtPSB1RG9Db3B5OwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCAtPSB1RG9Db3B5OwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0ICs9IHVEb0NvcHk7Ci0gICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbiArPSB1RG9Db3B5OwotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dCArPSB1RG9Db3B5OwotICAgICAgICAgICAgaVJlYWQgKz0gdURvQ29weTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVMb25nIHVUb3RhbE91dEJlZm9yZSx1VG90YWxPdXRBZnRlcjsKLSAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpidWZCZWZvcmU7Ci0gICAgICAgICAgICB1TG9uZyB1T3V0VGhpczsKLSAgICAgICAgICAgIGludCBmbHVzaD1aX1NZTkNfRkxVU0g7Ci0KLSAgICAgICAgICAgIHVUb3RhbE91dEJlZm9yZSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQ7Ci0gICAgICAgICAgICBidWZCZWZvcmUgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQ7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgPT0KLSAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQpICYmCi0gICAgICAgICAgICAgICAgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkID09IDApKQotICAgICAgICAgICAgICAgIGZsdXNoID0gWl9GSU5JU0g7Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICAgZXJyPWluZmxhdGUoJnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbSxmbHVzaCk7Ci0KLSAgICAgICAgICAgIGlmICgoZXJyPj0wKSAmJiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm1zZyE9TlVMTCkpCi0gICAgICAgICAgICAgIGVyciA9IFpfREFUQV9FUlJPUjsKLQotICAgICAgICAgICAgdVRvdGFsT3V0QWZ0ZXIgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0OwotICAgICAgICAgICAgdU91dFRoaXMgPSB1VG90YWxPdXRBZnRlci11VG90YWxPdXRCZWZvcmU7Ci0KLSAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyID0KLSAgICAgICAgICAgICAgICBjcmMzMihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMixidWZCZWZvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAodUludCkodU91dFRoaXMpKTsKLQotICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCAtPQotICAgICAgICAgICAgICAgIHVPdXRUaGlzOwotCi0gICAgICAgICAgICBpUmVhZCArPSAodUludCkodVRvdGFsT3V0QWZ0ZXIgLSB1VG90YWxPdXRCZWZvcmUpOwotCi0gICAgICAgICAgICBpZiAoZXJyPT1aX1NUUkVBTV9FTkQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChpUmVhZD09MCkgPyBVTlpfRU9GIDogaVJlYWQ7Ci0gICAgICAgICAgICBpZiAoZXJyIT1aX09LKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVycj09Wl9PSykKLSAgICAgICAgcmV0dXJuIGlSZWFkOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoKLSAgR2l2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB1bmNvbXByZXNzZWQgZGF0YQotKi8KLWV4dGVybiB6X29mZl90IFpFWFBPUlQgdW56dGVsbCAoZmlsZSkKLSAgICB1bnpGaWxlIGZpbGU7Ci17Ci0gICAgdW56X3MqIHM7Ci0gICAgZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLSAgICBzPSh1bnpfcyopZmlsZTsKLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOwotCi0gICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCi0gICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKLQotICAgIHJldHVybiAoel9vZmZfdClwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0OwotfQotCi0KLS8qCi0gIHJldHVybiAxIGlmIHRoZSBlbmQgb2YgZmlsZSB3YXMgcmVhY2hlZCwgMCBlbHNld2hlcmUKLSovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56ZW9mIChmaWxlKQotICAgIHVuekZpbGUgZmlsZTsKLXsKLSAgICB1bnpfcyogczsKLSAgICBmaWxlX2luX3ppcF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7Ci0KLSAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCi0gICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgPT0gMCkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotCi0KLS8qCi0gIFJlYWQgZXh0cmEgZmllbGQgZnJvbSB0aGUgY3VycmVudCBmaWxlIChvcGVuZWQgYnkgdW56T3BlbkN1cnJlbnRGaWxlKQotICBUaGlzIGlzIHRoZSBsb2NhbC1oZWFkZXIgdmVyc2lvbiBvZiB0aGUgZXh0cmEgZmllbGQgKHNvbWV0aW1lcywgdGhlcmUgaXMKLSAgICBtb3JlIGluZm8gaW4gdGhlIGxvY2FsLWhlYWRlciB2ZXJzaW9uIHRoYW4gaW4gdGhlIGNlbnRyYWwtaGVhZGVyKQotCi0gIGlmIGJ1Zj09TlVMTCwgaXQgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCB0aGF0IGNhbiBiZSByZWFkCi0KLSAgaWYgYnVmIT1OVUxMLCBsZW4gaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgdGhlIGV4dHJhIGhlYWRlciBpcyBjb3BpZWQgaW4KLSAgICBidWYuCi0gIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW4gYnVmLCBvciAoaWYgPDApCi0gICAgdGhlIGVycm9yIGNvZGUKLSovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R2V0TG9jYWxFeHRyYWZpZWxkIChmaWxlLGJ1ZixsZW4pCi0gICAgdW56RmlsZSBmaWxlOwotICAgIHZvaWRwIGJ1ZjsKLSAgICB1bnNpZ25lZCBsZW47Ci17Ci0gICAgdW56X3MqIHM7Ci0gICAgZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87Ci0gICAgdUludCByZWFkX25vdzsKLSAgICB1TG9uZyBzaXplX3RvX3JlYWQ7Ci0KLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7Ci0KLSAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCi0gICAgc2l6ZV90b19yZWFkID0gKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnNpemVfbG9jYWxfZXh0cmFmaWVsZCAtCi0gICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2xvY2FsX2V4dHJhZmllbGQpOwotCi0gICAgaWYgKGJ1Zj09TlVMTCkKLSAgICAgICAgcmV0dXJuIChpbnQpc2l6ZV90b19yZWFkOwotCi0gICAgaWYgKGxlbj5zaXplX3RvX3JlYWQpCi0gICAgICAgIHJlYWRfbm93ID0gKHVJbnQpc2l6ZV90b19yZWFkOwotICAgIGVsc2UKLSAgICAgICAgcmVhZF9ub3cgPSAodUludClsZW4gOwotCi0gICAgaWYgKHJlYWRfbm93PT0wKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChaU0VFSyhwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jLAotICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5maWxlc3RyZWFtLAotICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5vZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCArCi0gICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnBvc19sb2NhbF9leHRyYWZpZWxkLAotICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKLSAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKLQotICAgIGlmIChaUkVBRChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jLAotICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5maWxlc3RyZWFtLAotICAgICAgICAgICAgICBidWYscmVhZF9ub3cpIT1yZWFkX25vdykKLSAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKLQotICAgIHJldHVybiAoaW50KXJlYWRfbm93OwotfQotCi0vKgotICBDbG9zZSB0aGUgZmlsZSBpbiB6aXAgb3BlbmVkIHdpdGggdW56aXBPcGVuQ3VycmVudEZpbGUKLSAgUmV0dXJuIFVOWl9DUkNFUlJPUiBpZiBhbGwgdGhlIGZpbGUgd2FzIHJlYWQgYnV0IHRoZSBDUkMgaXMgbm90IGdvb2QKLSovCi1leHRlcm4gaW50IFpFWFBPUlQgdW56Q2xvc2VDdXJyZW50RmlsZSAoZmlsZSkKLSAgICB1bnpGaWxlIGZpbGU7Ci17Ci0gICAgaW50IGVycj1VTlpfT0s7Ci0KLSAgICB1bnpfcyogczsKLSAgICBmaWxlX2luX3ppcF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKLSAgICBpZiAoZmlsZT09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7Ci0KLSAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKLSAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotCi0KLSAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgPT0gMCkgJiYKLSAgICAgICAgKCFwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXcpKQotICAgIHsKLSAgICAgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyICE9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyX3dhaXQpCi0gICAgICAgICAgICBlcnI9VU5aX0NSQ0VSUk9SOwotICAgIH0KLQotCi0gICAgVFJZRlJFRShwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcik7Ci0gICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIgPSBOVUxMOwotICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQpCi0gICAgICAgIGluZmxhdGVFbmQoJnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbSk7Ci0KLSAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQgPSAwOwotICAgIFRSWUZSRUUocGZpbGVfaW5femlwX3JlYWRfaW5mbyk7Ci0KLSAgICBzLT5wZmlsZV9pbl96aXBfcmVhZD1OVUxMOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKgotICBHZXQgdGhlIGdsb2JhbCBjb21tZW50IHN0cmluZyBvZiB0aGUgWmlwRmlsZSwgaW4gdGhlIHN6Q29tbWVudCBidWZmZXIuCi0gIHVTaXplQnVmIGlzIHRoZSBzaXplIG9mIHRoZSBzekNvbW1lbnQgYnVmZmVyLgotICByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlIGNvcGllZCBvciBhbiBlcnJvciBjb2RlIDwwCi0qLwotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbENvbW1lbnQgKGZpbGUsIHN6Q29tbWVudCwgdVNpemVCdWYpCi0gICAgdW56RmlsZSBmaWxlOwotICAgIGNoYXIgKnN6Q29tbWVudDsKLSAgICB1TG9uZyB1U2l6ZUJ1ZjsKLXsKLSAgICBpbnQgZXJyPVVOWl9PSzsKLSAgICB1bnpfcyogczsKLSAgICB1TG9uZyB1UmVhZFRoaXMgOwotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56X3MqKWZpbGU7Ci0KLSAgICB1UmVhZFRoaXMgPSB1U2l6ZUJ1ZjsKLSAgICBpZiAodVJlYWRUaGlzPnMtPmdpLnNpemVfY29tbWVudCkKLSAgICAgICAgdVJlYWRUaGlzID0gcy0+Z2kuc2l6ZV9jb21tZW50OwotCi0gICAgaWYgKFpTRUVLKHMtPnpfZmlsZWZ1bmMscy0+ZmlsZXN0cmVhbSxzLT5jZW50cmFsX3BvcysyMixaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKLSAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKLQotICAgIGlmICh1UmVhZFRoaXM+MCkKLSAgICB7Ci0gICAgICAqc3pDb21tZW50PSdcMCc7Ci0gICAgICBpZiAoWlJFQUQocy0+el9maWxlZnVuYyxzLT5maWxlc3RyZWFtLHN6Q29tbWVudCx1UmVhZFRoaXMpIT11UmVhZFRoaXMpCi0gICAgICAgIHJldHVybiBVTlpfRVJSTk87Ci0gICAgfQotCi0gICAgaWYgKChzekNvbW1lbnQgIT0gTlVMTCkgJiYgKHVTaXplQnVmID4gcy0+Z2kuc2l6ZV9jb21tZW50KSkKLSAgICAgICAgKihzekNvbW1lbnQrcy0+Z2kuc2l6ZV9jb21tZW50KT0nXDAnOwotICAgIHJldHVybiAoaW50KXVSZWFkVGhpczsKLX0KLQotLyogQWRkaXRpb25zIGJ5IFJYICcyMDA0ICovCi1leHRlcm4gdUxvbmcgWkVYUE9SVCB1bnpHZXRPZmZzZXQgKGZpbGUpCi0gICAgdW56RmlsZSBmaWxlOwotewotICAgIHVuel9zKiBzOwotCi0gICAgaWYgKGZpbGU9PU5VTEwpCi0gICAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOwotICAgIHM9KHVuel9zKilmaWxlOwotICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQotICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHMtPmdpLm51bWJlcl9lbnRyeSAhPSAwICYmIHMtPmdpLm51bWJlcl9lbnRyeSAhPSAweGZmZmYpCi0gICAgICBpZiAocy0+bnVtX2ZpbGU9PXMtPmdpLm51bWJlcl9lbnRyeSkKLSAgICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzLT5wb3NfaW5fY2VudHJhbF9kaXI7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpTZXRPZmZzZXQgKGZpbGUsIHBvcykKLSAgICAgICAgdW56RmlsZSBmaWxlOwotICAgICAgICB1TG9uZyBwb3M7Ci17Ci0gICAgdW56X3MqIHM7Ci0gICAgaW50IGVycjsKLQotICAgIGlmIChmaWxlPT1OVUxMKQotICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7Ci0gICAgcz0odW56X3MqKWZpbGU7Ci0KLSAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIgPSBwb3M7Ci0gICAgcy0+bnVtX2ZpbGUgPSBzLT5naS5udW1iZXJfZW50cnk7ICAgICAgLyogaGFjayAqLwotICAgIGVyciA9IHVuemxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUsJnMtPmN1cl9maWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMLDApOwotICAgIHMtPmN1cnJlbnRfZmlsZV9vayA9IChlcnIgPT0gVU5aX09LKTsKLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC91bnppcC5oIGIvbGlicy96bGliL2NvbnRyaWIvbWluaXppcC91bnppcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ3OTM3Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvdW56aXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKiB1bnppcC5oIC0tIElPIGZvciB1bmNvbXByZXNzIC56aXAgZmlsZXMgdXNpbmcgemxpYgotICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNSBHaWxsZXMgVm9sbGFudAotCi0gICBUaGlzIHVuemlwIHBhY2thZ2UgYWxsb3cgZXh0cmFjdCBmaWxlIGZyb20gLlpJUCBmaWxlLCBjb21wYXRpYmxlIHdpdGggUEtaaXAgMi4wNGcKLSAgICAgV2luWmlwLCBJbmZvWmlwIHRvb2xzIGFuZCBjb21wYXRpYmxlLgotCi0gICBNdWx0aSB2b2x1bWUgWmlwRmlsZSAoc3BhbikgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICBFbmNyeXB0aW9uIGNvbXBhdGlibGUgd2l0aCBwa3ppcCAyLjA0ZyBvbmx5IHN1cHBvcnRlZAotICAgT2xkIGNvbXByZXNzaW9ucyB1c2VkIGJ5IG9sZCBQS1ppcCAxLnggYXJlIG5vdCBzdXBwb3J0ZWQKLQotCi0gICBJIFdBSVQgRkVFREJBQ0sgYXQgbWFpbCBpbmZvQHdpbmltYWdlLmNvbQotICAgVmlzaXQgYWxzbyBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bSBmb3IgZXZvbHV0aW9uCi0KLSAgIENvbmRpdGlvbiBvZiB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBhcmUgdGhlIHNhbWUgdGhhbiB6bGliIDoKLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLQotKi8KLQotLyogZm9yIG1vcmUgaW5mbyBhYm91dCAuWklQIGZvcm1hdCwgc2VlCi0gICAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9kb2MvYXBwbm90ZS05ODExMTktaXouemlwCi0gICAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9kb2MvCi0gICBQa1dhcmUgaGFzIGFsc28gYSBzcGVjaWZpY2F0aW9uIGF0IDoKLSAgICAgIGZ0cDovL2Z0cC5wa3dhcmUuY29tL3Byb2JkZXNjLnppcAotKi8KLQotI2lmbmRlZiBfdW56X0gKLSNkZWZpbmUgX3Vuel9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBfWkxJQl9ICi0jaW5jbHVkZSAiemxpYi5oIgotI2VuZGlmCi0KLSNpZm5kZWYgX1pMSUJJT0FQSV9ICi0jaW5jbHVkZSAiaW9hcGkuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChTVFJJQ1RVTlpJUCkgfHwgZGVmaW5lZChTVFJJQ1RaSVBVTlpJUCkKLS8qIGxpa2UgdGhlIFNUUklDVCBvZiBXSU4zMiwgd2UgZGVmaW5lIGEgcG9pbnRlciB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQKLSAgICBmcm9tICh2b2lkKikgd2l0aG91dCBjYXN0ICovCi10eXBlZGVmIHN0cnVjdCBUYWd1bnpGaWxlX18geyBpbnQgdW51c2VkOyB9IHVuekZpbGVfXzsKLXR5cGVkZWYgdW56RmlsZV9fICp1bnpGaWxlOwotI2Vsc2UKLXR5cGVkZWYgdm9pZHAgdW56RmlsZTsKLSNlbmRpZgotCi0KLSNkZWZpbmUgVU5aX09LICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgICAgICAgICAoLTEwMCkKLSNkZWZpbmUgVU5aX0VSUk5PICAgICAgICAgICAgICAgICAgICAgICAoWl9FUlJOTykKLSNkZWZpbmUgVU5aX0VPRiAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgVU5aX1BBUkFNRVJST1IgICAgICAgICAgICAgICAgICAoLTEwMikKLSNkZWZpbmUgVU5aX0JBRFpJUEZJTEUgICAgICAgICAgICAgICAgICAoLTEwMykKLSNkZWZpbmUgVU5aX0lOVEVSTkFMRVJST1IgICAgICAgICAgICAgICAoLTEwNCkKLSNkZWZpbmUgVU5aX0NSQ0VSUk9SICAgICAgICAgICAgICAgICAgICAoLTEwNSkKLQotLyogdG1fdW56IGNvbnRhaW4gZGF0ZS90aW1lIGluZm8gKi8KLXR5cGVkZWYgc3RydWN0IHRtX3Vuel9zCi17Ci0gICAgdUludCB0bV9zZWM7ICAgICAgICAgICAgLyogc2Vjb25kcyBhZnRlciB0aGUgbWludXRlIC0gWzAsNTldICovCi0gICAgdUludCB0bV9taW47ICAgICAgICAgICAgLyogbWludXRlcyBhZnRlciB0aGUgaG91ciAtIFswLDU5XSAqLwotICAgIHVJbnQgdG1faG91cjsgICAgICAgICAgIC8qIGhvdXJzIHNpbmNlIG1pZG5pZ2h0IC0gWzAsMjNdICovCi0gICAgdUludCB0bV9tZGF5OyAgICAgICAgICAgLyogZGF5IG9mIHRoZSBtb250aCAtIFsxLDMxXSAqLwotICAgIHVJbnQgdG1fbW9uOyAgICAgICAgICAgIC8qIG1vbnRocyBzaW5jZSBKYW51YXJ5IC0gWzAsMTFdICovCi0gICAgdUludCB0bV95ZWFyOyAgICAgICAgICAgLyogeWVhcnMgLSBbMTk4MC4uMjA0NF0gKi8KLX0gdG1fdW56OwotCi0vKiB1bnpfZ2xvYmFsX2luZm8gc3RydWN0dXJlIGNvbnRhaW4gZ2xvYmFsIGRhdGEgYWJvdXQgdGhlIFpJUGZpbGUKLSAgIFRoZXNlIGRhdGEgY29tZXMgZnJvbSB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyICovCi10eXBlZGVmIHN0cnVjdCB1bnpfZ2xvYmFsX2luZm9fcwotewotICAgIHVMb25nIG51bWJlcl9lbnRyeTsgICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovCi0gICAgdUxvbmcgc2l6ZV9jb21tZW50OyAgICAgICAgIC8qIHNpemUgb2YgdGhlIGdsb2JhbCBjb21tZW50IG9mIHRoZSB6aXBmaWxlICovCi19IHVuel9nbG9iYWxfaW5mbzsKLQotCi0vKiB1bnpfZmlsZV9pbmZvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGluIHRoZSB6aXBmaWxlICovCi10eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9pbmZvX3MKLXsKLSAgICB1TG9uZyB2ZXJzaW9uOyAgICAgICAgICAgICAgLyogdmVyc2lvbiBtYWRlIGJ5ICAgICAgICAgICAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgdmVyc2lvbl9uZWVkZWQ7ICAgICAgIC8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgICAgICAgMiBieXRlcyAqLwotICAgIHVMb25nIGZsYWc7ICAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyBjb21wcmVzc2lvbl9tZXRob2Q7ICAgLyogY29tcHJlc3Npb24gbWV0aG9kICAgICAgICAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgZG9zRGF0ZTsgICAgICAgICAgICAgIC8qIGxhc3QgbW9kIGZpbGUgZGF0ZSBpbiBEb3MgZm10ICAgNCBieXRlcyAqLwotICAgIHVMb25nIGNyYzsgICAgICAgICAgICAgICAgICAvKiBjcmMtMzIgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXMgKi8KLSAgICB1TG9uZyBjb21wcmVzc2VkX3NpemU7ICAgICAgLyogY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgICA0IGJ5dGVzICovCi0gICAgdUxvbmcgdW5jb21wcmVzc2VkX3NpemU7ICAgIC8qIHVuY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgNCBieXRlcyAqLwotICAgIHVMb25nIHNpemVfZmlsZW5hbWU7ICAgICAgICAvKiBmaWxlbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyBzaXplX2ZpbGVfZXh0cmE7ICAgICAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICAgICAgICAgICAgICAyIGJ5dGVzICovCi0gICAgdUxvbmcgc2l6ZV9maWxlX2NvbW1lbnQ7ICAgIC8qIGZpbGUgY29tbWVudCBsZW5ndGggICAgICAgICAgICAgMiBieXRlcyAqLwotCi0gICAgdUxvbmcgZGlza19udW1fc3RhcnQ7ICAgICAgIC8qIGRpc2sgbnVtYmVyIHN0YXJ0ICAgICAgICAgICAgICAgMiBieXRlcyAqLwotICAgIHVMb25nIGludGVybmFsX2ZhOyAgICAgICAgICAvKiBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyBleHRlcm5hbF9mYTsgICAgICAgICAgLyogZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICA0IGJ5dGVzICovCi0KLSAgICB0bV91bnogdG11X2RhdGU7Ci19IHVuel9maWxlX2luZm87Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUgT0YgKChjb25zdCBjaGFyKiBmaWxlTmFtZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZU5hbWUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpQ2FzZVNlbnNpdGl2aXR5KSk7Ci0vKgotICAgQ29tcGFyZSB0d28gZmlsZW5hbWUgKGZpbGVOYW1lMSxmaWxlTmFtZTIpLgotICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMSwgY29tcGFyaXNpb24gaXMgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXApCi0gICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAyLCBjb21wYXJpc2lvbiBpcyBub3QgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXBpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN0cmNhc2VjbXApCi0gICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAwLCBjYXNlIHNlbnNpdGl2aXR5IGlzIGRlZmF1dCBvZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0KLSAgICAobGlrZSAxIG9uIFVuaXgsIDIgb24gV2luZG93cykKLSovCi0KLQotZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuIE9GKChjb25zdCBjaGFyICpwYXRoKSk7Ci0vKgotICBPcGVuIGEgWmlwIGZpbGUuIHBhdGggY29udGFpbiB0aGUgZnVsbCBwYXRobmFtZSAoYnkgZXhhbXBsZSwKLSAgICAgb24gYSBXaW5kb3dzIFhQIGNvbXB1dGVyICJjOlxcemxpYlxcemxpYjExMy56aXAiIG9yIG9uIGFuIFVuaXggY29tcHV0ZXIKLSAgICAgInpsaWIvemxpYjExMy56aXAiLgotICAgICBJZiB0aGUgemlwZmlsZSBjYW5ub3QgYmUgb3BlbmVkIChmaWxlIGRvbid0IGV4aXN0IG9yIGluIG5vdCB2YWxpZCksIHRoZQotICAgICAgIHJldHVybiB2YWx1ZSBpcyBOVUxMLgotICAgICBFbHNlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgdW56RmlsZSBIYW5kbGUsIHVzYWJsZSB3aXRoIG90aGVyIGZ1bmN0aW9uCi0gICAgICAgb2YgdGhpcyB1bnppcCBwYWNrYWdlLgotKi8KLQotZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuMiBPRigoY29uc3QgY2hhciAqcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKLS8qCi0gICBPcGVuIGEgWmlwIGZpbGUsIGxpa2UgdW56T3BlbiwgYnV0IHByb3ZpZGUgYSBzZXQgb2YgZmlsZSBsb3cgbGV2ZWwgQVBJCi0gICAgICBmb3IgcmVhZC93cml0ZSB0aGUgemlwIGZpbGUgKHNlZSBpb2FwaS5oKQotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekNsb3NlIE9GKCh1bnpGaWxlIGZpbGUpKTsKLS8qCi0gIENsb3NlIGEgWmlwRmlsZSBvcGVuZWQgd2l0aCB1bnppcE9wZW4uCi0gIElmIHRoZXJlIGlzIGZpbGVzIGluc2lkZSB0aGUgLlppcCBvcGVuZWQgd2l0aCB1bnpPcGVuQ3VycmVudEZpbGUgKHNlZSBsYXRlciksCi0gICAgdGhlc2UgZmlsZXMgTVVTVCBiZSBjbG9zZWQgd2l0aCB1bnppcENsb3NlQ3VycmVudEZpbGUgYmVmb3JlIGNhbGwgdW56aXBDbG9zZS4KLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R2V0R2xvYmFsSW5mbyBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9nbG9iYWxfaW5mbyAqcGdsb2JhbF9pbmZvKSk7Ci0vKgotICBXcml0ZSBpbmZvIGFib3V0IHRoZSBaaXBGaWxlIGluIHRoZSAqcGdsb2JhbF9pbmZvIHN0cnVjdHVyZS4KLSAgTm8gcHJlcGFyYXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpcyBuZWVkZWQKLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLwotCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRHbG9iYWxDb21tZW50IE9GKCh1bnpGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHVTaXplQnVmKSk7Ci0vKgotICBHZXQgdGhlIGdsb2JhbCBjb21tZW50IHN0cmluZyBvZiB0aGUgWmlwRmlsZSwgaW4gdGhlIHN6Q29tbWVudCBidWZmZXIuCi0gIHVTaXplQnVmIGlzIHRoZSBzaXplIG9mIHRoZSBzekNvbW1lbnQgYnVmZmVyLgotICByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlIGNvcGllZCBvciBhbiBlcnJvciBjb2RlIDwwCi0qLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBVbnppcCBwYWNrYWdlIGFsbG93IHlvdSBicm93c2UgdGhlIGRpcmVjdG9yeSBvZiB0aGUgemlwZmlsZSAqLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub0ZpcnN0RmlsZSBPRigodW56RmlsZSBmaWxlKSk7Ci0vKgotICBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgemlwZmlsZSB0byB0aGUgZmlyc3QgZmlsZS4KLSAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtCi0qLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub05leHRGaWxlIE9GKCh1bnpGaWxlIGZpbGUpKTsKLS8qCi0gIFNldCB0aGUgY3VycmVudCBmaWxlIG9mIHRoZSB6aXBmaWxlIHRvIHRoZSBuZXh0IGZpbGUuCi0gIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbQotICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgaWYgdGhlIGFjdHVhbCBmaWxlIHdhcyB0aGUgbGF0ZXN0LgotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekxvY2F0ZUZpbGUgT0YoKHVuekZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN6RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgaUNhc2VTZW5zaXRpdml0eSkpOwotLyoKLSAgVHJ5IGxvY2F0ZSB0aGUgZmlsZSBzekZpbGVOYW1lIGluIHRoZSB6aXBmaWxlLgotICBGb3IgdGhlIGlDYXNlU2Vuc2l0aXZpdHkgc2lnbmlmaWNhdGlvbiwgc2VlIHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZQotCi0gIHJldHVybiB2YWx1ZSA6Ci0gIFVOWl9PSyBpZiB0aGUgZmlsZSBpcyBmb3VuZC4gSXQgYmVjb21lcyB0aGUgY3VycmVudCBmaWxlLgotICBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRSBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQKLSovCi0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBSeWFuIHN1cHBsaWVkIGZ1bmN0aW9ucyAqLwotLyogdW56X2ZpbGVfaW5mbyBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZSBpbiB0aGUgemlwZmlsZSAqLwotdHlwZWRlZiBzdHJ1Y3QgdW56X2ZpbGVfcG9zX3MKLXsKLSAgICB1TG9uZyBwb3NfaW5femlwX2RpcmVjdG9yeTsgICAvKiBvZmZzZXQgaW4gemlwIGZpbGUgZGlyZWN0b3J5ICovCi0gICAgdUxvbmcgbnVtX29mX2ZpbGU7ICAgICAgICAgICAgLyogIyBvZiBmaWxlICovCi19IHVuel9maWxlX3BvczsKLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEZpbGVQb3MoCi0gICAgdW56RmlsZSBmaWxlLAotICAgIHVuel9maWxlX3BvcyogZmlsZV9wb3MpOwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub0ZpbGVQb3MoCi0gICAgdW56RmlsZSBmaWxlLAotICAgIHVuel9maWxlX3BvcyogZmlsZV9wb3MpOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEN1cnJlbnRGaWxlSW5mbyBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9maWxlX2luZm8gKnBmaWxlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBmaWxlTmFtZUJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFGaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzekNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemUpKTsKLS8qCi0gIEdldCBJbmZvIGFib3V0IHRoZSBjdXJyZW50IGZpbGUKLSAgaWYgcGZpbGVfaW5mbyE9TlVMTCwgdGhlICpwZmlsZV9pbmZvIHN0cnVjdHVyZSB3aWxsIGNvbnRhaW4gc29tZXMgaW5mbyBhYm91dAotICAgICAgICB0aGUgY3VycmVudCBmaWxlCi0gIGlmIHN6RmlsZU5hbWUhPU5VTEwsIHRoZSBmaWxlbWFuZSBzdHJpbmcgd2lsbCBiZSBjb3BpZWQgaW4gc3pGaWxlTmFtZQotICAgICAgICAgICAgKGZpbGVOYW1lQnVmZmVyU2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyKQotICBpZiBleHRyYUZpZWxkIT1OVUxMLCB0aGUgZXh0cmEgZmllbGQgaW5mb3JtYXRpb24gd2lsbCBiZSBjb3BpZWQgaW4gZXh0cmFGaWVsZAotICAgICAgICAgICAgKGV4dHJhRmllbGRCdWZmZXJTaXplIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIpLgotICAgICAgICAgICAgVGhpcyBpcyB0aGUgQ2VudHJhbC1oZWFkZXIgdmVyc2lvbiBvZiB0aGUgZXh0cmEgZmllbGQKLSAgaWYgc3pDb21tZW50IT1OVUxMLCB0aGUgY29tbWVudCBzdHJpbmcgb2YgdGhlIGZpbGUgd2lsbCBiZSBjb3BpZWQgaW4gc3pDb21tZW50Ci0gICAgICAgICAgICAoY29tbWVudEJ1ZmZlclNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcikKLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBmb3IgcmVhZGluZyB0aGUgY29udGVudCBvZiB0aGUgY3VycmVudCB6aXBmaWxlLCB5b3UgY2FuIG9wZW4gaXQsIHJlYWQgZGF0YQotICAgZnJvbSBpdCwgYW5kIGNsb3NlIGl0ICh5b3UgY2FuIGNsb3NlIGl0IGJlZm9yZSByZWFkaW5nIGFsbCB0aGUgZmlsZSkKLSAgICovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGUgT0YoKHVuekZpbGUgZmlsZSkpOwotLyoKLSAgT3BlbiBmb3IgcmVhZGluZyBkYXRhIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUuCi0gIElmIHRoZXJlIGlzIG5vIGVycm9yLCB0aGUgcmV0dXJuIHZhbHVlIGlzIFVOWl9PSy4KLSovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCkpOwotLyoKLSAgT3BlbiBmb3IgcmVhZGluZyBkYXRhIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUuCi0gIHBhc3N3b3JkIGlzIGEgY3J5cHRpbmcgcGFzc3dvcmQKLSAgSWYgdGhlcmUgaXMgbm8gZXJyb3IsIHRoZSByZXR1cm4gdmFsdWUgaXMgVU5aX09LLgotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTIgT0YoKHVuekZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXcpKTsKLS8qCi0gIFNhbWUgdGhhbiB1bnpPcGVuQ3VycmVudEZpbGUsIGJ1dCBvcGVuIGZvciByZWFkIHJhdyB0aGUgZmlsZSAobm90IHVuY29tcHJlc3MpCi0gICAgaWYgcmF3PT0xCi0gICptZXRob2Qgd2lsbCByZWNlaXZlIG1ldGhvZCBvZiBjb21wcmVzc2lvbiwgKmxldmVsIHdpbGwgcmVjZWl2ZSBsZXZlbCBvZgotICAgICBjb21wcmVzc2lvbgotICBub3RlIDogeW91IGNhbiBzZXQgbGV2ZWwgcGFyYW1ldGVyIGFzIE5VTEwgKGlmIHlvdSBkaWQgbm90IHdhbnQga25vd24gbGV2ZWwsCi0gICAgICAgICBidXQgeW91IENBTk5PVCBzZXQgbWV0aG9kIHBhcmFtZXRlciBhcyBOVUxMCi0qLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlMyBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCkpOwotLyoKLSAgU2FtZSB0aGFuIHVuek9wZW5DdXJyZW50RmlsZSwgYnV0IG9wZW4gZm9yIHJlYWQgcmF3IHRoZSBmaWxlIChub3QgdW5jb21wcmVzcykKLSAgICBpZiByYXc9PTEKLSAgKm1ldGhvZCB3aWxsIHJlY2VpdmUgbWV0aG9kIG9mIGNvbXByZXNzaW9uLCAqbGV2ZWwgd2lsbCByZWNlaXZlIGxldmVsIG9mCi0gICAgIGNvbXByZXNzaW9uCi0gIG5vdGUgOiB5b3UgY2FuIHNldCBsZXZlbCBwYXJhbWV0ZXIgYXMgTlVMTCAoaWYgeW91IGRpZCBub3Qgd2FudCBrbm93biBsZXZlbCwKLSAgICAgICAgIGJ1dCB5b3UgQ0FOTk9UIHNldCBtZXRob2QgcGFyYW1ldGVyIGFzIE5VTEwKLSovCi0KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuekNsb3NlQ3VycmVudEZpbGUgT0YoKHVuekZpbGUgZmlsZSkpOwotLyoKLSAgQ2xvc2UgdGhlIGZpbGUgaW4gemlwIG9wZW5lZCB3aXRoIHVuek9wZW5DdXJyZW50RmlsZQotICBSZXR1cm4gVU5aX0NSQ0VSUk9SIGlmIGFsbCB0aGUgZmlsZSB3YXMgcmVhZCBidXQgdGhlIENSQyBpcyBub3QgZ29vZAotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHVuelJlYWRDdXJyZW50RmlsZSBPRigodW56RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWRwIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pKTsKLS8qCi0gIFJlYWQgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBmaWxlIChvcGVuZWQgYnkgdW56T3BlbkN1cnJlbnRGaWxlKQotICBidWYgY29udGFpbiBidWZmZXIgd2hlcmUgZGF0YSBtdXN0IGJlIGNvcGllZAotICBsZW4gdGhlIHNpemUgb2YgYnVmLgotCi0gIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGUgY29waWVkIGlmIHNvbWVzIGJ5dGVzIGFyZSBjb3BpZWQKLSAgcmV0dXJuIDAgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkCi0gIHJldHVybiA8MCB3aXRoIGVycm9yIGNvZGUgaWYgdGhlcmUgaXMgYW4gZXJyb3IKLSAgICAoVU5aX0VSUk5PIGZvciBJTyBlcnJvciwgb3IgekxpYiBlcnJvciBmb3IgdW5jb21wcmVzcyBlcnJvcikKLSovCi0KLWV4dGVybiB6X29mZl90IFpFWFBPUlQgdW56dGVsbCBPRigodW56RmlsZSBmaWxlKSk7Ci0vKgotICBHaXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHVuY29tcHJlc3NlZCBkYXRhCi0qLwotCi1leHRlcm4gaW50IFpFWFBPUlQgdW56ZW9mIE9GKCh1bnpGaWxlIGZpbGUpKTsKLS8qCi0gIHJldHVybiAxIGlmIHRoZSBlbmQgb2YgZmlsZSB3YXMgcmVhY2hlZCwgMCBlbHNld2hlcmUKLSovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRMb2NhbEV4dHJhZmllbGQgT0YoKHVuekZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikpOwotLyoKLSAgUmVhZCBleHRyYSBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IGZpbGUgKG9wZW5lZCBieSB1bnpPcGVuQ3VycmVudEZpbGUpCi0gIFRoaXMgaXMgdGhlIGxvY2FsLWhlYWRlciB2ZXJzaW9uIG9mIHRoZSBleHRyYSBmaWVsZCAoc29tZXRpbWVzLCB0aGVyZSBpcwotICAgIG1vcmUgaW5mbyBpbiB0aGUgbG9jYWwtaGVhZGVyIHZlcnNpb24gdGhhbiBpbiB0aGUgY2VudHJhbC1oZWFkZXIpCi0KLSAgaWYgYnVmPT1OVUxMLCBpdCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkCi0KLSAgaWYgYnVmIT1OVUxMLCBsZW4gaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgdGhlIGV4dHJhIGhlYWRlciBpcyBjb3BpZWQgaW4KLSAgICBidWYuCi0gIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW4gYnVmLCBvciAoaWYgPDApCi0gICAgdGhlIGVycm9yIGNvZGUKLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEdldCB0aGUgY3VycmVudCBmaWxlIG9mZnNldCAqLwotZXh0ZXJuIHVMb25nIFpFWFBPUlQgdW56R2V0T2Zmc2V0ICh1bnpGaWxlIGZpbGUpOwotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZmZzZXQgKi8KLWV4dGVybiBpbnQgWkVYUE9SVCB1bnpTZXRPZmZzZXQgKHVuekZpbGUgZmlsZSwgdUxvbmcgcG9zKTsKLQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfdW56X0ggKi8KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvemlwLmMgYi9saWJzL3psaWIvY29udHJpYi9taW5pemlwL3ppcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2U3ZTg2Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvemlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIwICswLDAgQEAKLS8qIHppcC5jIC0tIElPIG9uIC56aXAgZmlsZXMgdXNpbmcgemxpYgotICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQotCi0gICAyNyBEZWMgMjAwNCBSb2xmIEthbGJlcm1hdHRlcgotICAgTW9kaWZpY2F0aW9uIHRvIHppcE9wZW4yIHRvIHN1cHBvcnQgZ2xvYmFsQ29tbWVudCByZXRyaWV2YWwuCi0KLSAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA1IEdpbGxlcyBWb2xsYW50Ci0KLSAgIFJlYWQgemlwLmggZm9yIG1vcmUgaW5mbwotKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSAiemxpYi5oIgotI2luY2x1ZGUgInppcC5oIgotI2luY2x1ZGUgInp1dGlsLmgiCi0KLSNpZmRlZiBTVERDCi0jICBpbmNsdWRlIDxzdGRkZWYuaD4KLSMgIGluY2x1ZGUgPHN0cmluZy5oPgotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBOT19FUlJOT19ICi0gICAgZXh0ZXJuIGludCBlcnJubzsKLSNlbHNlCi0jICAgaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZgotCi0KLSNpZm5kZWYgbG9jYWwKLSMgIGRlZmluZSBsb2NhbCBzdGF0aWMKLSNlbmRpZgotLyogY29tcGlsZSB3aXRoIC1EbG9jYWwgaWYgeW91ciBkZWJ1Z2dlciBjYW4ndCBmaW5kIHN0YXRpYyBzeW1ib2xzICovCi0KLSNpZm5kZWYgVkVSU0lPTk1BREVCWQotIyBkZWZpbmUgVkVSU0lPTk1BREVCWSAgICgweDApIC8qIHBsYXRmb3JtIGRlcGVkZW50ICovCi0jZW5kaWYKLQotI2lmbmRlZiBaX0JVRlNJWkUKLSNkZWZpbmUgWl9CVUZTSVpFICgxNjM4NCkKLSNlbmRpZgotCi0jaWZuZGVmIFpfTUFYRklMRU5BTUVJTlpJUAotI2RlZmluZSBaX01BWEZJTEVOQU1FSU5aSVAgKDI1NikKLSNlbmRpZgotCi0jaWZuZGVmIEFMTE9DCi0jIGRlZmluZSBBTExPQyhzaXplKSAobWFsbG9jKHNpemUpKQotI2VuZGlmCi0jaWZuZGVmIFRSWUZSRUUKLSMgZGVmaW5lIFRSWUZSRUUocCkge2lmIChwKSBmcmVlKHApO30KLSNlbmRpZgotCi0vKgotI2RlZmluZSBTSVpFQ0VOVFJBTERJUklURU0gKDB4MmUpCi0jZGVmaW5lIFNJWkVaSVBMT0NBTEhFQURFUiAoMHgxZSkKLSovCi0KLS8qIEkndmUgZm91bmQgYW4gb2xkIFVuaXggKGEgU3VuT1MgNC4xLjNfVTEpIHdpdGhvdXQgYWxsIFNFRUtfKiBkZWZpbmVkLi4uLiAqLwotCi0jaWZuZGVmIFNFRUtfQ1VSCi0jZGVmaW5lIFNFRUtfQ1VSICAgIDEKLSNlbmRpZgotCi0jaWZuZGVmIFNFRUtfRU5ECi0jZGVmaW5lIFNFRUtfRU5EICAgIDIKLSNlbmRpZgotCi0jaWZuZGVmIFNFRUtfU0VUCi0jZGVmaW5lIFNFRUtfU0VUICAgIDAKLSNlbmRpZgotCi0jaWZuZGVmIERFRl9NRU1fTEVWRUwKLSNpZiBNQVhfTUVNX0xFVkVMID49IDgKLSMgIGRlZmluZSBERUZfTUVNX0xFVkVMIDgKLSNlbHNlCi0jICBkZWZpbmUgREVGX01FTV9MRVZFTCAgTUFYX01FTV9MRVZFTAotI2VuZGlmCi0jZW5kaWYKLWNvbnN0IGNoYXIgemlwX2NvcHlyaWdodFtdID0KLSAgICIgemlwIDEuMDEgQ29weXJpZ2h0IDE5OTgtMjAwNCBHaWxsZXMgVm9sbGFudCAtIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwiOwotCi0KLSNkZWZpbmUgU0laRURBVEFfSU5EQVRBQkxPQ0sgKDQwOTYtKDQqNCkpCi0KLSNkZWZpbmUgTE9DQUxIRUFERVJNQUdJQyAgICAoMHgwNDAzNGI1MCkKLSNkZWZpbmUgQ0VOVFJBTEhFQURFUk1BR0lDICAoMHgwMjAxNGI1MCkKLSNkZWZpbmUgRU5ESEVBREVSTUFHSUMgICAgICAoMHgwNjA1NGI1MCkKLQotI2RlZmluZSBGTEFHX0xPQ0FMSEVBREVSX09GRlNFVCAoMHgwNikKLSNkZWZpbmUgQ1JDX0xPQ0FMSEVBREVSX09GRlNFVCAgKDB4MGUpCi0KLSNkZWZpbmUgU0laRUNFTlRSQUxIRUFERVIgKDB4MmUpIC8qIDQ2ICovCi0KLXR5cGVkZWYgc3RydWN0IGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsX3MKLXsKLSAgc3RydWN0IGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsX3MqIG5leHRfZGF0YWJsb2NrOwotICB1TG9uZyAgYXZhaWxfaW5fdGhpc19ibG9jazsKLSAgdUxvbmcgIGZpbGxlZF9pbl90aGlzX2Jsb2NrOwotICB1TG9uZyAgdW51c2VkOyAvKiBmb3IgZnV0dXJlIHVzZSBhbmQgYWxpZ25lbWVudCAqLwotICB1bnNpZ25lZCBjaGFyIGRhdGFbU0laRURBVEFfSU5EQVRBQkxPQ0tdOwotfSBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbDsKLQotdHlwZWRlZiBzdHJ1Y3QgbGlua2VkbGlzdF9kYXRhX3MKLXsKLSAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogZmlyc3RfYmxvY2s7Ci0gICAgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGxhc3RfYmxvY2s7Ci19IGxpbmtlZGxpc3RfZGF0YTsKLQotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHpfc3RyZWFtIHN0cmVhbTsgICAgICAgICAgICAvKiB6TGliIHN0cmVhbSBzdHJ1Y3R1cmUgZm9yIGluZmxhdGUgKi8KLSAgICBpbnQgIHN0cmVhbV9pbml0aWFsaXNlZDsgICAgLyogMSBpcyBzdHJlYW0gaXMgaW5pdGlhbGlzZWQgKi8KLSAgICB1SW50IHBvc19pbl9idWZmZXJlZF9kYXRhOyAgLyogbGFzdCB3cml0dGVuIGJ5dGUgaW4gYnVmZmVyZWRfZGF0YSAqLwotCi0gICAgdUxvbmcgcG9zX2xvY2FsX2hlYWRlcjsgICAgIC8qIG9mZnNldCBvZiB0aGUgbG9jYWwgaGVhZGVyIG9mIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudHkgd3JpdGluZyAqLwotICAgIGNoYXIqIGNlbnRyYWxfaGVhZGVyOyAgICAgICAvKiBjZW50cmFsIGhlYWRlciBkYXRhIGZvciB0aGUgY3VycmVudCBmaWxlICovCi0gICAgdUxvbmcgc2l6ZV9jZW50cmFsaGVhZGVyOyAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgaGVhZGVyIGZvciBjdXIgZmlsZSAqLwotICAgIHVMb25nIGZsYWc7ICAgICAgICAgICAgICAgICAvKiBmbGFnIG9mIHRoZSBmaWxlIGN1cnJlbnRseSB3cml0aW5nICovCi0KLSAgICBpbnQgIG1ldGhvZDsgICAgICAgICAgICAgICAgLyogY29tcHJlc3Npb24gbWV0aG9kIG9mIGZpbGUgY3VycmVudHkgd3IuKi8KLSAgICBpbnQgIHJhdzsgICAgICAgICAgICAgICAgICAgLyogMSBmb3IgZGlyZWN0bHkgd3JpdGluZyByYXcgZGF0YSAqLwotICAgIEJ5dGUgYnVmZmVyZWRfZGF0YVtaX0JVRlNJWkVdOy8qIGJ1ZmZlciBjb250YWluIGNvbXByZXNzZWQgZGF0YSB0byBiZSB3cml0Ki8KLSAgICB1TG9uZyBkb3NEYXRlOwotICAgIHVMb25nIGNyYzMyOwotICAgIGludCAgZW5jcnlwdDsKLSNpZm5kZWYgTk9DUllQVAotICAgIHVuc2lnbmVkIGxvbmcga2V5c1szXTsgICAgIC8qIGtleXMgZGVmaW5pbmcgdGhlIHBzZXVkby1yYW5kb20gc2VxdWVuY2UgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYjsKLSAgICBpbnQgY3J5cHRfaGVhZGVyX3NpemU7Ci0jZW5kaWYKLX0gY3VyZmlsZV9pbmZvOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHpsaWJfZmlsZWZ1bmNfZGVmIHpfZmlsZWZ1bmM7Ci0gICAgdm9pZHBmIGZpbGVzdHJlYW07ICAgICAgICAvKiBpbyBzdHJ1Y3RvcmUgb2YgdGhlIHppcGZpbGUgKi8KLSAgICBsaW5rZWRsaXN0X2RhdGEgY2VudHJhbF9kaXI7LyogZGF0YWJsb2NrIHdpdGggY2VudHJhbCBkaXIgaW4gY29uc3RydWN0aW9uKi8KLSAgICBpbnQgIGluX29wZW5lZF9maWxlX2luemlwOyAgLyogMSBpZiBhIGZpbGUgaW4gdGhlIHppcCBpcyBjdXJyZW50bHkgd3JpdC4qLwotICAgIGN1cmZpbGVfaW5mbyBjaTsgICAgICAgICAgICAvKiBpbmZvIG9uIHRoZSBmaWxlIGN1cnJldGx5IHdyaXRpbmcgKi8KLQotICAgIHVMb25nIGJlZ2luX3BvczsgICAgICAgICAgICAvKiBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB6aXBmaWxlICovCi0gICAgdUxvbmcgYWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0OwotICAgIHVMb25nIG51bWJlcl9lbnRyeTsKLSNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKLSAgICBjaGFyICpnbG9iYWxjb21tZW50OwotI2VuZGlmCi19IHppcF9pbnRlcm5hbDsKLQotCi0KLSNpZm5kZWYgTk9DUllQVAotI2RlZmluZSBJTkNMVURFQ1JZUFRJTkdDT0RFX0lGQ1JZUFRBTExPV0VECi0jaW5jbHVkZSAiY3J5cHQuaCIKLSNlbmRpZgotCi1sb2NhbCBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogYWxsb2NhdGVfbmV3X2RhdGFibG9jaygpCi17Ci0gICAgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGxkaTsKLSAgICBsZGkgPSAobGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqKQotICAgICAgICAgICAgICAgICBBTExPQyhzaXplb2YobGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwpKTsKLSAgICBpZiAobGRpIT1OVUxMKQotICAgIHsKLSAgICAgICAgbGRpLT5uZXh0X2RhdGFibG9jayA9IE5VTEwgOwotICAgICAgICBsZGktPmZpbGxlZF9pbl90aGlzX2Jsb2NrID0gMCA7Ci0gICAgICAgIGxkaS0+YXZhaWxfaW5fdGhpc19ibG9jayA9IFNJWkVEQVRBX0lOREFUQUJMT0NLIDsKLSAgICB9Ci0gICAgcmV0dXJuIGxkaTsKLX0KLQotbG9jYWwgdm9pZCBmcmVlX2RhdGFibG9jayhsZGkpCi0gICAgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGxkaTsKLXsKLSAgICB3aGlsZSAobGRpIT1OVUxMKQotICAgIHsKLSAgICAgICAgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGxkaW5leHQgPSBsZGktPm5leHRfZGF0YWJsb2NrOwotICAgICAgICBUUllGUkVFKGxkaSk7Ci0gICAgICAgIGxkaSA9IGxkaW5leHQ7Ci0gICAgfQotfQotCi1sb2NhbCB2b2lkIGluaXRfbGlua2VkbGlzdChsbCkKLSAgICBsaW5rZWRsaXN0X2RhdGEqIGxsOwotewotICAgIGxsLT5maXJzdF9ibG9jayA9IGxsLT5sYXN0X2Jsb2NrID0gTlVMTDsKLX0KLQotbG9jYWwgdm9pZCBmcmVlX2xpbmtlZGxpc3QobGwpCi0gICAgbGlua2VkbGlzdF9kYXRhKiBsbDsKLXsKLSAgICBmcmVlX2RhdGFibG9jayhsbC0+Zmlyc3RfYmxvY2spOwotICAgIGxsLT5maXJzdF9ibG9jayA9IGxsLT5sYXN0X2Jsb2NrID0gTlVMTDsKLX0KLQotCi1sb2NhbCBpbnQgYWRkX2RhdGFfaW5fZGF0YWJsb2NrKGxsLGJ1ZixsZW4pCi0gICAgbGlua2VkbGlzdF9kYXRhKiBsbDsKLSAgICBjb25zdCB2b2lkKiBidWY7Ci0gICAgdUxvbmcgbGVuOwotewotICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGk7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciogZnJvbV9jb3B5OwotCi0gICAgaWYgKGxsPT1OVUxMKQotICAgICAgICByZXR1cm4gWklQX0lOVEVSTkFMRVJST1I7Ci0KLSAgICBpZiAobGwtPmxhc3RfYmxvY2sgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGxsLT5maXJzdF9ibG9jayA9IGxsLT5sYXN0X2Jsb2NrID0gYWxsb2NhdGVfbmV3X2RhdGFibG9jaygpOwotICAgICAgICBpZiAobGwtPmZpcnN0X2Jsb2NrID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gWklQX0lOVEVSTkFMRVJST1I7Ci0gICAgfQotCi0gICAgbGRpID0gbGwtPmxhc3RfYmxvY2s7Ci0gICAgZnJvbV9jb3B5ID0gKHVuc2lnbmVkIGNoYXIqKWJ1ZjsKLQotICAgIHdoaWxlIChsZW4+MCkKLSAgICB7Ci0gICAgICAgIHVJbnQgY29weV90aGlzOwotICAgICAgICB1SW50IGk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIqIHRvX2NvcHk7Ci0KLSAgICAgICAgaWYgKGxkaS0+YXZhaWxfaW5fdGhpc19ibG9jaz09MCkKLSAgICAgICAgewotICAgICAgICAgICAgbGRpLT5uZXh0X2RhdGFibG9jayA9IGFsbG9jYXRlX25ld19kYXRhYmxvY2soKTsKLSAgICAgICAgICAgIGlmIChsZGktPm5leHRfZGF0YWJsb2NrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOwotICAgICAgICAgICAgbGRpID0gbGRpLT5uZXh0X2RhdGFibG9jayA7Ci0gICAgICAgICAgICBsbC0+bGFzdF9ibG9jayA9IGxkaTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsZGktPmF2YWlsX2luX3RoaXNfYmxvY2sgPCBsZW4pCi0gICAgICAgICAgICBjb3B5X3RoaXMgPSAodUludClsZGktPmF2YWlsX2luX3RoaXNfYmxvY2s7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvcHlfdGhpcyA9ICh1SW50KWxlbjsKLQotICAgICAgICB0b19jb3B5ID0gJihsZGktPmRhdGFbbGRpLT5maWxsZWRfaW5fdGhpc19ibG9ja10pOwotCi0gICAgICAgIGZvciAoaT0wO2k8Y29weV90aGlzO2krKykKLSAgICAgICAgICAgICoodG9fY29weStpKT0qKGZyb21fY29weStpKTsKLQotICAgICAgICBsZGktPmZpbGxlZF9pbl90aGlzX2Jsb2NrICs9IGNvcHlfdGhpczsKLSAgICAgICAgbGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrIC09IGNvcHlfdGhpczsKLSAgICAgICAgZnJvbV9jb3B5ICs9IGNvcHlfdGhpcyA7Ci0gICAgICAgIGxlbiAtPSBjb3B5X3RoaXM7Ci0gICAgfQotICAgIHJldHVybiBaSVBfT0s7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBJbnB1dHMgYSBsb25nIGluIExTQiBvcmRlciB0byB0aGUgZ2l2ZW4gZmlsZQotICAgbmJCeXRlID09IDEsIDIgb3IgNCAoYnl0ZSwgc2hvcnQgb3IgbG9uZykKLSovCi0KLWxvY2FsIGludCB6aXBsb2NhbF9wdXRWYWx1ZSBPRigoY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHBmIGZpbGVzdHJlYW0sIHVMb25nIHgsIGludCBuYkJ5dGUpKTsKLWxvY2FsIGludCB6aXBsb2NhbF9wdXRWYWx1ZSAocHpsaWJfZmlsZWZ1bmNfZGVmLCBmaWxlc3RyZWFtLCB4LCBuYkJ5dGUpCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZjsKLSAgICB2b2lkcGYgZmlsZXN0cmVhbTsKLSAgICB1TG9uZyB4OwotICAgIGludCBuYkJ5dGU7Ci17Ci0gICAgdW5zaWduZWQgY2hhciBidWZbNF07Ci0gICAgaW50IG47Ci0gICAgZm9yIChuID0gMDsgbiA8IG5iQnl0ZTsgbisrKQotICAgIHsKLSAgICAgICAgYnVmW25dID0gKHVuc2lnbmVkIGNoYXIpKHggJiAweGZmKTsKLSAgICAgICAgeCA+Pj0gODsKLSAgICB9Ci0gICAgaWYgKHggIT0gMCkKLSAgICAgIHsgICAgIC8qIGRhdGEgb3ZlcmZsb3cgLSBoYWNrIGZvciBaSVA2NCAoWCBSb2NoZSkgKi8KLSAgICAgIGZvciAobiA9IDA7IG4gPCBuYkJ5dGU7IG4rKykKLSAgICAgICAgewotICAgICAgICAgIGJ1ZltuXSA9IDB4ZmY7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIGlmIChaV1JJVEUoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLGJ1ZixuYkJ5dGUpIT0odUxvbmcpbmJCeXRlKQotICAgICAgICByZXR1cm4gWklQX0VSUk5POwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFpJUF9PSzsKLX0KLQotbG9jYWwgdm9pZCB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSBPRigodm9pZCogZGVzdCwgdUxvbmcgeCwgaW50IG5iQnl0ZSkpOwotbG9jYWwgdm9pZCB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSAoZGVzdCwgeCwgbmJCeXRlKQotICAgIHZvaWQqIGRlc3Q7Ci0gICAgdUxvbmcgeDsKLSAgICBpbnQgbmJCeXRlOwotewotICAgIHVuc2lnbmVkIGNoYXIqIGJ1Zj0odW5zaWduZWQgY2hhciopZGVzdDsKLSAgICBpbnQgbjsKLSAgICBmb3IgKG4gPSAwOyBuIDwgbmJCeXRlOyBuKyspIHsKLSAgICAgICAgYnVmW25dID0gKHVuc2lnbmVkIGNoYXIpKHggJiAweGZmKTsKLSAgICAgICAgeCA+Pj0gODsKLSAgICB9Ci0KLSAgICBpZiAoeCAhPSAwKQotICAgIHsgICAgIC8qIGRhdGEgb3ZlcmZsb3cgLSBoYWNrIGZvciBaSVA2NCAqLwotICAgICAgIGZvciAobiA9IDA7IG4gPCBuYkJ5dGU7IG4rKykKLSAgICAgICB7Ci0gICAgICAgICAgYnVmW25dID0gMHhmZjsKLSAgICAgICB9Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1sb2NhbCB1TG9uZyB6aXBsb2NhbF9UbXpEYXRlVG9Eb3NEYXRlKHB0bSxkb3NEYXRlKQotICAgIGNvbnN0IHRtX3ppcCogcHRtOwotICAgIHVMb25nIGRvc0RhdGU7Ci17Ci0gICAgdUxvbmcgeWVhciA9ICh1TG9uZylwdG0tPnRtX3llYXI7Ci0gICAgaWYgKHllYXI+MTk4MCkKLSAgICAgICAgeWVhci09MTk4MDsKLSAgICBlbHNlIGlmICh5ZWFyPjgwKQotICAgICAgICB5ZWFyLT04MDsKLSAgICByZXR1cm4KLSAgICAgICh1TG9uZykgKCgocHRtLT50bV9tZGF5KSArICgzMiAqIChwdG0tPnRtX21vbisxKSkgKyAoNTEyICogeWVhcikpIDw8IDE2KSB8Ci0gICAgICAgICgocHRtLT50bV9zZWMvMikgKyAoMzIqIHB0bS0+dG1fbWluKSArICgyMDQ4ICogKHVMb25nKXB0bS0+dG1faG91cikpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1sb2NhbCBpbnQgemlwbG9jYWxfZ2V0Qnl0ZSBPRigoCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKLSAgICB2b2lkcGYgZmlsZXN0cmVhbSwKLSAgICBpbnQgKnBpKSk7Ci0KLWxvY2FsIGludCB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHBpKQotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Ci0gICAgdm9pZHBmIGZpbGVzdHJlYW07Ci0gICAgaW50ICpwaTsKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGM7Ci0gICAgaW50IGVyciA9IChpbnQpWlJFQUQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZjLDEpOwotICAgIGlmIChlcnI9PTEpCi0gICAgewotICAgICAgICAqcGkgPSAoaW50KWM7Ci0gICAgICAgIHJldHVybiBaSVBfT0s7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChaRVJST1IoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKSkKLSAgICAgICAgICAgIHJldHVybiBaSVBfRVJSTk87Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBaSVBfRU9GOwotICAgIH0KLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIFJlYWRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgZnJvbSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBTZXRzCi0qLwotbG9jYWwgaW50IHppcGxvY2FsX2dldFNob3J0IE9GKCgKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAotICAgIHZvaWRwZiBmaWxlc3RyZWFtLAotICAgIHVMb25nICpwWCkpOwotCi1sb2NhbCBpbnQgemlwbG9jYWxfZ2V0U2hvcnQgKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHBYKQotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Ci0gICAgdm9pZHBmIGZpbGVzdHJlYW07Ci0gICAgdUxvbmcgKnBYOwotewotICAgIHVMb25nIHggOwotICAgIGludCBpOwotICAgIGludCBlcnI7Ci0KLSAgICBlcnIgPSB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4ID0gKHVMb25nKWk7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggKz0gKCh1TG9uZylpKTw8ODsKLQotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgKnBYID0geDsKLSAgICBlbHNlCi0gICAgICAgICpwWCA9IDA7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotbG9jYWwgaW50IHppcGxvY2FsX2dldExvbmcgT0YoKAotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCi0gICAgdm9pZHBmIGZpbGVzdHJlYW0sCi0gICAgdUxvbmcgKnBYKSk7Ci0KLWxvY2FsIGludCB6aXBsb2NhbF9nZXRMb25nIChwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxwWCkKLSAgICBjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmOwotICAgIHZvaWRwZiBmaWxlc3RyZWFtOwotICAgIHVMb25nICpwWDsKLXsKLSAgICB1TG9uZyB4IDsKLSAgICBpbnQgaTsKLSAgICBpbnQgZXJyOwotCi0gICAgZXJyID0gemlwbG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7Ci0gICAgeCA9ICh1TG9uZylpOwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKLSAgICB4ICs9ICgodUxvbmcpaSk8PDg7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggKz0gKCh1TG9uZylpKTw8MTY7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOwotICAgIHggKz0gKCh1TG9uZylpKTw8MjQ7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgICpwWCA9IHg7Ci0gICAgZWxzZQotICAgICAgICAqcFggPSAwOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLSNpZm5kZWYgQlVGUkVBRENPTU1FTlQKLSNkZWZpbmUgQlVGUkVBRENPTU1FTlQgKDB4NDAwKQotI2VuZGlmCi0vKgotICBMb2NhdGUgdGhlIENlbnRyYWwgZGlyZWN0b3J5IG9mIGEgemlwZmlsZSAoYXQgdGhlIGVuZCwganVzdCBiZWZvcmUKLSAgICB0aGUgZ2xvYmFsIGNvbW1lbnQpCi0qLwotbG9jYWwgdUxvbmcgemlwbG9jYWxfU2VhcmNoQ2VudHJhbERpciBPRigoCi0gICAgY29uc3QgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKLSAgICB2b2lkcGYgZmlsZXN0cmVhbSkpOwotCi1sb2NhbCB1TG9uZyB6aXBsb2NhbF9TZWFyY2hDZW50cmFsRGlyKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKQotICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Ci0gICAgdm9pZHBmIGZpbGVzdHJlYW07Ci17Ci0gICAgdW5zaWduZWQgY2hhciogYnVmOwotICAgIHVMb25nIHVTaXplRmlsZTsKLSAgICB1TG9uZyB1QmFja1JlYWQ7Ci0gICAgdUxvbmcgdU1heEJhY2s9MHhmZmZmOyAvKiBtYXhpbXVtIHNpemUgb2YgZ2xvYmFsIGNvbW1lbnQgKi8KLSAgICB1TG9uZyB1UG9zRm91bmQ9MDsKLQotICAgIGlmIChaU0VFSygqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sMCxaTElCX0ZJTEVGVU5DX1NFRUtfRU5EKSAhPSAwKQotICAgICAgICByZXR1cm4gMDsKLQotCi0gICAgdVNpemVGaWxlID0gWlRFTEwoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKTsKLQotICAgIGlmICh1TWF4QmFjaz51U2l6ZUZpbGUpCi0gICAgICAgIHVNYXhCYWNrID0gdVNpemVGaWxlOwotCi0gICAgYnVmID0gKHVuc2lnbmVkIGNoYXIqKUFMTE9DKEJVRlJFQURDT01NRU5UKzQpOwotICAgIGlmIChidWY9PU5VTEwpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgdUJhY2tSZWFkID0gNDsKLSAgICB3aGlsZSAodUJhY2tSZWFkPHVNYXhCYWNrKQotICAgIHsKLSAgICAgICAgdUxvbmcgdVJlYWRTaXplLHVSZWFkUG9zIDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGlmICh1QmFja1JlYWQrQlVGUkVBRENPTU1FTlQ+dU1heEJhY2spCi0gICAgICAgICAgICB1QmFja1JlYWQgPSB1TWF4QmFjazsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdUJhY2tSZWFkKz1CVUZSRUFEQ09NTUVOVDsKLSAgICAgICAgdVJlYWRQb3MgPSB1U2l6ZUZpbGUtdUJhY2tSZWFkIDsKLQotICAgICAgICB1UmVhZFNpemUgPSAoKEJVRlJFQURDT01NRU5UKzQpIDwgKHVTaXplRmlsZS11UmVhZFBvcykpID8KLSAgICAgICAgICAgICAgICAgICAgIChCVUZSRUFEQ09NTUVOVCs0KSA6ICh1U2l6ZUZpbGUtdVJlYWRQb3MpOwotICAgICAgICBpZiAoWlNFRUsoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHVSZWFkUG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKFpSRUFEKCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxidWYsdVJlYWRTaXplKSE9dVJlYWRTaXplKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZm9yIChpPShpbnQpdVJlYWRTaXplLTM7IChpLS0pPjA7KQotICAgICAgICAgICAgaWYgKCgoKihidWYraSkpPT0weDUwKSAmJiAoKCooYnVmK2krMSkpPT0weDRiKSAmJgotICAgICAgICAgICAgICAgICgoKihidWYraSsyKSk9PTB4MDUpICYmICgoKihidWYraSszKSk9PTB4MDYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVQb3NGb3VuZCA9IHVSZWFkUG9zK2k7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVQb3NGb3VuZCE9MCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBUUllGUkVFKGJ1Zik7Ci0gICAgcmV0dXJuIHVQb3NGb3VuZDsKLX0KLSNlbmRpZiAvKiAhTk9fQURERklMRUlORVhJU1RJTkdaSVAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuMiAocGF0aG5hbWUsIGFwcGVuZCwgZ2xvYmFsY29tbWVudCwgcHpsaWJfZmlsZWZ1bmNfZGVmKQotICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lOwotICAgIGludCBhcHBlbmQ7Ci0gICAgemlwY2hhcnBjKiBnbG9iYWxjb21tZW50OwotICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Ci17Ci0gICAgemlwX2ludGVybmFsIHppaW5pdDsKLSAgICB6aXBfaW50ZXJuYWwqIHppOwotICAgIGludCBlcnI9WklQX09LOwotCi0KLSAgICBpZiAocHpsaWJfZmlsZWZ1bmNfZGVmPT1OVUxMKQotICAgICAgICBmaWxsX2ZvcGVuX2ZpbGVmdW5jKCZ6aWluaXQuel9maWxlZnVuYyk7Ci0gICAgZWxzZQotICAgICAgICB6aWluaXQuel9maWxlZnVuYyA9ICpwemxpYl9maWxlZnVuY19kZWY7Ci0KLSAgICB6aWluaXQuZmlsZXN0cmVhbSA9ICgqKHppaW5pdC56X2ZpbGVmdW5jLnpvcGVuX2ZpbGUpKQotICAgICAgICAgICAgICAgICAoemlpbml0LnpfZmlsZWZ1bmMub3BhcXVlLAotICAgICAgICAgICAgICAgICAgcGF0aG5hbWUsCi0gICAgICAgICAgICAgICAgICAoYXBwZW5kID09IEFQUEVORF9TVEFUVVNfQ1JFQVRFKSA/Ci0gICAgICAgICAgICAgICAgICAoWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgfCBaTElCX0ZJTEVGVU5DX01PREVfV1JJVEUgfCBaTElCX0ZJTEVGVU5DX01PREVfQ1JFQVRFKSA6Ci0gICAgICAgICAgICAgICAgICAgIChaTElCX0ZJTEVGVU5DX01PREVfUkVBRCB8IFpMSUJfRklMRUZVTkNfTU9ERV9XUklURSB8IFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORykpOwotCi0gICAgaWYgKHppaW5pdC5maWxlc3RyZWFtID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHppaW5pdC5iZWdpbl9wb3MgPSBaVEVMTCh6aWluaXQuel9maWxlZnVuYyx6aWluaXQuZmlsZXN0cmVhbSk7Ci0gICAgemlpbml0LmluX29wZW5lZF9maWxlX2luemlwID0gMDsKLSAgICB6aWluaXQuY2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMDsKLSAgICB6aWluaXQubnVtYmVyX2VudHJ5ID0gMDsKLSAgICB6aWluaXQuYWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0ID0gMDsKLSAgICBpbml0X2xpbmtlZGxpc3QoJih6aWluaXQuY2VudHJhbF9kaXIpKTsKLQotCi0gICAgemkgPSAoemlwX2ludGVybmFsKilBTExPQyhzaXplb2YoemlwX2ludGVybmFsKSk7Ci0gICAgaWYgKHppPT1OVUxMKQotICAgIHsKLSAgICAgICAgWkNMT1NFKHppaW5pdC56X2ZpbGVmdW5jLHppaW5pdC5maWxlc3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogbm93IHdlIGFkZCBmaWxlIGluIGEgemlwZmlsZSAqLwotIyAgICBpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKLSAgICB6aWluaXQuZ2xvYmFsY29tbWVudCA9IE5VTEw7Ci0gICAgaWYgKGFwcGVuZCA9PSBBUFBFTkRfU1RBVFVTX0FERElOWklQKQotICAgIHsKLSAgICAgICAgdUxvbmcgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7LyogYnl0ZSBiZWZvcmUgdGhlIHppcGZpbGUsICg+MCBmb3Igc2Z4KSovCi0KLSAgICAgICAgdUxvbmcgc2l6ZV9jZW50cmFsX2RpcjsgICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICAqLwotICAgICAgICB1TG9uZyBvZmZzZXRfY2VudHJhbF9kaXI7ICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gICAgICAgIHVMb25nIGNlbnRyYWxfcG9zLHVMOwotCi0gICAgICAgIHVMb25nIG51bWJlcl9kaXNrOyAgICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZGlzdCwgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLwotICAgICAgICB1TG9uZyBudW1iZXJfZGlza193aXRoX0NEOyAgLyogbnVtYmVyIHRoZSB0aGUgZGlzayB3aXRoIGNlbnRyYWwgZGlyLCB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3BhbmluZyBaSVAsIHVuc3VwcG9ydGVkLCBhbHdheXMgMCovCi0gICAgICAgIHVMb25nIG51bWJlcl9lbnRyeTsKLSAgICAgICAgdUxvbmcgbnVtYmVyX2VudHJ5X0NEOyAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYW1lIHRoYW4gbnVtYmVyX2VudHJ5IG9uIG5vc3BhbikgKi8KLSAgICAgICAgdUxvbmcgc2l6ZV9jb21tZW50OwotCi0gICAgICAgIGNlbnRyYWxfcG9zID0gemlwbG9jYWxfU2VhcmNoQ2VudHJhbERpcigmemlpbml0LnpfZmlsZWZ1bmMsemlpbml0LmZpbGVzdHJlYW0pOwotICAgICAgICBpZiAoY2VudHJhbF9wb3M9PTApCi0gICAgICAgICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgICAgIGlmIChaU0VFSyh6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJhbF9wb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCi0gICAgICAgICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgICAgIC8qIHRoZSBzaWduYXR1cmUsIGFscmVhZHkgY2hlY2tlZCAqLwotICAgICAgICBpZiAoemlwbG9jYWxfZ2V0TG9uZygmemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLCZ1TCkhPVpJUF9PSykKLSAgICAgICAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAgICAgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLwotICAgICAgICBpZiAoemlwbG9jYWxfZ2V0U2hvcnQoJnppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2spIT1aSVBfT0spCi0gICAgICAgICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgICAgIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICAgICAgaWYgKHppcGxvY2FsX2dldFNob3J0KCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrX3dpdGhfQ0QpIT1aSVBfT0spCi0gICAgICAgICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KLSAgICAgICAgaWYgKHppcGxvY2FsX2dldFNob3J0KCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJm51bWJlcl9lbnRyeSkhPVpJUF9PSykKLSAgICAgICAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovCi0gICAgICAgIGlmICh6aXBsb2NhbF9nZXRTaG9ydCgmemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLCZudW1iZXJfZW50cnlfQ0QpIT1aSVBfT0spCi0gICAgICAgICAgICBlcnI9WklQX0VSUk5POwotCi0gICAgICAgIGlmICgobnVtYmVyX2VudHJ5X0NEIT1udW1iZXJfZW50cnkpIHx8Ci0gICAgICAgICAgICAobnVtYmVyX2Rpc2tfd2l0aF9DRCE9MCkgfHwKLSAgICAgICAgICAgIChudW1iZXJfZGlzayE9MCkpCi0gICAgICAgICAgICBlcnI9WklQX0JBRFpJUEZJTEU7Ci0KLSAgICAgICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KLSAgICAgICAgaWYgKHppcGxvY2FsX2dldExvbmcoJnppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSwmc2l6ZV9jZW50cmFsX2RpcikhPVpJUF9PSykKLSAgICAgICAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAgICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byB0aGUKLSAgICAgICAgICAgIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCi0gICAgICAgIGlmICh6aXBsb2NhbF9nZXRMb25nKCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJm9mZnNldF9jZW50cmFsX2RpcikhPVpJUF9PSykKLSAgICAgICAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAgICAgLyogemlwZmlsZSBnbG9iYWwgY29tbWVudCBsZW5ndGggKi8KLSAgICAgICAgaWYgKHppcGxvY2FsX2dldFNob3J0KCZ6aWluaXQuel9maWxlZnVuYywgemlpbml0LmZpbGVzdHJlYW0sJnNpemVfY29tbWVudCkhPVpJUF9PSykKLSAgICAgICAgICAgIGVycj1aSVBfRVJSTk87Ci0KLSAgICAgICAgaWYgKChjZW50cmFsX3BvczxvZmZzZXRfY2VudHJhbF9kaXIrc2l6ZV9jZW50cmFsX2RpcikgJiYKLSAgICAgICAgICAgIChlcnI9PVpJUF9PSykpCi0gICAgICAgICAgICBlcnI9WklQX0JBRFpJUEZJTEU7Ci0KLSAgICAgICAgaWYgKGVyciE9WklQX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBaQ0xPU0Uoemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNpemVfY29tbWVudD4wKQotICAgICAgICB7Ci0gICAgICAgICAgICB6aWluaXQuZ2xvYmFsY29tbWVudCA9IEFMTE9DKHNpemVfY29tbWVudCsxKTsKLSAgICAgICAgICAgIGlmICh6aWluaXQuZ2xvYmFsY29tbWVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNpemVfY29tbWVudCA9IFpSRUFEKHppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSx6aWluaXQuZ2xvYmFsY29tbWVudCxzaXplX2NvbW1lbnQpOwotICAgICAgICAgICAgICAgemlpbml0Lmdsb2JhbGNvbW1lbnRbc2l6ZV9jb21tZW50XT0wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUgPSBjZW50cmFsX3BvcyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvZmZzZXRfY2VudHJhbF9kaXIrc2l6ZV9jZW50cmFsX2Rpcik7Ci0gICAgICAgIHppaW5pdC5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQgPSBieXRlX2JlZm9yZV90aGVfemlwZmlsZTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICB1TG9uZyBzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQgPSBzaXplX2NlbnRyYWxfZGlyOwotICAgICAgICAgICAgc2l6ZV90IGJ1Zl9zaXplID0gU0laRURBVEFfSU5EQVRBQkxPQ0s7Ci0gICAgICAgICAgICB2b2lkKiBidWZfcmVhZCA9ICh2b2lkKilBTExPQyhidWZfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoWlNFRUsoemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgb2Zmc2V0X2NlbnRyYWxfZGlyICsgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsCi0gICAgICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSAhPSAwKQotICAgICAgICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKLQotICAgICAgICAgICAgd2hpbGUgKChzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQ+MCkgJiYgKGVycj09WklQX09LKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1TG9uZyByZWFkX3RoaXMgPSBTSVpFREFUQV9JTkRBVEFCTE9DSzsKLSAgICAgICAgICAgICAgICBpZiAocmVhZF90aGlzID4gc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkKQotICAgICAgICAgICAgICAgICAgICByZWFkX3RoaXMgPSBzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQ7Ci0gICAgICAgICAgICAgICAgaWYgKFpSRUFEKHppaW5pdC56X2ZpbGVmdW5jLCB6aWluaXQuZmlsZXN0cmVhbSxidWZfcmVhZCxyZWFkX3RoaXMpICE9IHJlYWRfdGhpcykKLSAgICAgICAgICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKLQotICAgICAgICAgICAgICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkX2RhdGFfaW5fZGF0YWJsb2NrKCZ6aWluaXQuY2VudHJhbF9kaXIsYnVmX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodUxvbmcpcmVhZF90aGlzKTsKLSAgICAgICAgICAgICAgICBzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQtPXJlYWRfdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRSWUZSRUUoYnVmX3JlYWQpOwotICAgICAgICB9Ci0gICAgICAgIHppaW5pdC5iZWdpbl9wb3MgPSBieXRlX2JlZm9yZV90aGVfemlwZmlsZTsKLSAgICAgICAgemlpbml0Lm51bWJlcl9lbnRyeSA9IG51bWJlcl9lbnRyeV9DRDsKLQotICAgICAgICBpZiAoWlNFRUsoemlpbml0LnpfZmlsZWZ1bmMsIHppaW5pdC5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgb2Zmc2V0X2NlbnRyYWxfZGlyK2J5dGVfYmVmb3JlX3RoZV96aXBmaWxlLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKLSAgICB9Ci0KLSAgICBpZiAoZ2xvYmFsY29tbWVudCkKLSAgICB7Ci0gICAgICAqZ2xvYmFsY29tbWVudCA9IHppaW5pdC5nbG9iYWxjb21tZW50OwotICAgIH0KLSMgICAgZW5kaWYgLyogIU5PX0FEREZJTEVJTkVYSVNUSU5HWklQKi8KLQotICAgIGlmIChlcnIgIT0gWklQX09LKQotICAgIHsKLSMgICAgaWZuZGVmIE5PX0FEREZJTEVJTkVYSVNUSU5HWklQCi0gICAgICAgIFRSWUZSRUUoemlpbml0Lmdsb2JhbGNvbW1lbnQpOwotIyAgICBlbmRpZiAvKiAhTk9fQURERklMRUlORVhJU1RJTkdaSVAqLwotICAgICAgICBUUllGUkVFKHppKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICp6aSA9IHppaW5pdDsKLSAgICAgICAgcmV0dXJuICh6aXBGaWxlKXppOwotICAgIH0KLX0KLQotZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuIChwYXRobmFtZSwgYXBwZW5kKQotICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lOwotICAgIGludCBhcHBlbmQ7Ci17Ci0gICAgcmV0dXJuIHppcE9wZW4yKHBhdGhuYW1lLGFwcGVuZCxOVUxMLE5VTEwpOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDMgKGZpbGUsIGZpbGVuYW1lLCB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2dsb2JhbCwgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCwgbWV0aG9kLCBsZXZlbCwgcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLCBjcmNGb3JDcnlwdGluZykKLSAgICB6aXBGaWxlIGZpbGU7Ci0gICAgY29uc3QgY2hhciogZmlsZW5hbWU7Ci0gICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaTsKLSAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsOwotICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsOwotICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsOwotICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbDsKLSAgICBjb25zdCBjaGFyKiBjb21tZW50OwotICAgIGludCBtZXRob2Q7Ci0gICAgaW50IGxldmVsOwotICAgIGludCByYXc7Ci0gICAgaW50IHdpbmRvd0JpdHM7Ci0gICAgaW50IG1lbUxldmVsOwotICAgIGludCBzdHJhdGVneTsKLSAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKLSAgICB1TG9uZyBjcmNGb3JDcnlwdGluZzsKLXsKLSAgICB6aXBfaW50ZXJuYWwqIHppOwotICAgIHVJbnQgc2l6ZV9maWxlbmFtZTsKLSAgICB1SW50IHNpemVfY29tbWVudDsKLSAgICB1SW50IGk7Ci0gICAgaW50IGVyciA9IFpJUF9PSzsKLQotIyAgICBpZmRlZiBOT0NSWVBUCi0gICAgaWYgKHBhc3N3b3JkICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKLSMgICAgZW5kaWYKLQotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKLSAgICBpZiAoKG1ldGhvZCE9MCkgJiYgKG1ldGhvZCE9Wl9ERUZMQVRFRCkpCi0gICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKLQotICAgIHppID0gKHppcF9pbnRlcm5hbCopZmlsZTsKLQotICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMSkKLSAgICB7Ci0gICAgICAgIGVyciA9IHppcENsb3NlRmlsZUluWmlwIChmaWxlKTsKLSAgICAgICAgaWYgKGVyciAhPSBaSVBfT0spCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotCi0gICAgaWYgKGZpbGVuYW1lPT1OVUxMKQotICAgICAgICBmaWxlbmFtZT0iLSI7Ci0KLSAgICBpZiAoY29tbWVudD09TlVMTCkKLSAgICAgICAgc2l6ZV9jb21tZW50ID0gMDsKLSAgICBlbHNlCi0gICAgICAgIHNpemVfY29tbWVudCA9ICh1SW50KXN0cmxlbihjb21tZW50KTsKLQotICAgIHNpemVfZmlsZW5hbWUgPSAodUludClzdHJsZW4oZmlsZW5hbWUpOwotCi0gICAgaWYgKHppcGZpID09IE5VTEwpCi0gICAgICAgIHppLT5jaS5kb3NEYXRlID0gMDsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoemlwZmktPmRvc0RhdGUgIT0gMCkKLSAgICAgICAgICAgIHppLT5jaS5kb3NEYXRlID0gemlwZmktPmRvc0RhdGU7Ci0gICAgICAgIGVsc2UgemktPmNpLmRvc0RhdGUgPSB6aXBsb2NhbF9UbXpEYXRlVG9Eb3NEYXRlKCZ6aXBmaS0+dG16X2RhdGUsemlwZmktPmRvc0RhdGUpOwotICAgIH0KLQotICAgIHppLT5jaS5mbGFnID0gMDsKLSAgICBpZiAoKGxldmVsPT04KSB8fCAobGV2ZWw9PTkpKQotICAgICAgemktPmNpLmZsYWcgfD0gMjsKLSAgICBpZiAoKGxldmVsPT0yKSkKLSAgICAgIHppLT5jaS5mbGFnIHw9IDQ7Ci0gICAgaWYgKChsZXZlbD09MSkpCi0gICAgICB6aS0+Y2kuZmxhZyB8PSA2OwotICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQotICAgICAgemktPmNpLmZsYWcgfD0gMTsKLQotICAgIHppLT5jaS5jcmMzMiA9IDA7Ci0gICAgemktPmNpLm1ldGhvZCA9IG1ldGhvZDsKLSAgICB6aS0+Y2kuZW5jcnlwdCA9IDA7Ci0gICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IDA7Ci0gICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhID0gMDsKLSAgICB6aS0+Y2kucmF3ID0gcmF3OwotICAgIHppLT5jaS5wb3NfbG9jYWxfaGVhZGVyID0gWlRFTEwoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0pIDsKLSAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyID0gU0laRUNFTlRSQUxIRUFERVIgKyBzaXplX2ZpbGVuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCArIHNpemVfY29tbWVudDsKLSAgICB6aS0+Y2kuY2VudHJhbF9oZWFkZXIgPSAoY2hhciopQUxMT0MoKHVJbnQpemktPmNpLnNpemVfY2VudHJhbGhlYWRlcik7Ci0KLSAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIsKHVMb25nKUNFTlRSQUxIRUFERVJNQUdJQyw0KTsKLSAgICAvKiB2ZXJzaW9uIGluZm8gKi8KLSAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrNCwodUxvbmcpVkVSU0lPTk1BREVCWSwyKTsKLSAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrNiwodUxvbmcpMjAsMik7Ci0gICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzgsKHVMb25nKXppLT5jaS5mbGFnLDIpOwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxMCwodUxvbmcpemktPmNpLm1ldGhvZCwyKTsKLSAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMTIsKHVMb25nKXppLT5jaS5kb3NEYXRlLDQpOwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxNiwodUxvbmcpMCw0KTsgLypjcmMqLwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyMCwodUxvbmcpMCw0KTsgLypjb21wciBzaXplKi8KLSAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMjQsKHVMb25nKTAsNCk7IC8qdW5jb21wciBzaXplKi8KLSAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMjgsKHVMb25nKXNpemVfZmlsZW5hbWUsMik7Ci0gICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzMwLCh1TG9uZylzaXplX2V4dHJhZmllbGRfZ2xvYmFsLDIpOwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszMiwodUxvbmcpc2l6ZV9jb21tZW50LDIpOwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszNCwodUxvbmcpMCwyKTsgLypkaXNrIG5tIHN0YXJ0Ki8KLQotICAgIGlmICh6aXBmaT09TlVMTCkKLSAgICAgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM2LCh1TG9uZykwLDIpOwotICAgIGVsc2UKLSAgICAgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM2LCh1TG9uZyl6aXBmaS0+aW50ZXJuYWxfZmEsMik7Ci0KLSAgICBpZiAoemlwZmk9PU5VTEwpCi0gICAgICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszOCwodUxvbmcpMCw0KTsKLSAgICBlbHNlCi0gICAgICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszOCwodUxvbmcpemlwZmktPmV4dGVybmFsX2ZhLDQpOwotCi0gICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQyLCh1TG9uZyl6aS0+Y2kucG9zX2xvY2FsX2hlYWRlci0gemktPmFkZF9wb3NpdGlvbl93aGVuX3dyaXR0aW5nX29mZnNldCw0KTsKLQotICAgIGZvciAoaT0wO2k8c2l6ZV9maWxlbmFtZTtpKyspCi0gICAgICAgICooemktPmNpLmNlbnRyYWxfaGVhZGVyK1NJWkVDRU5UUkFMSEVBREVSK2kpID0gKihmaWxlbmFtZStpKTsKLQotICAgIGZvciAoaT0wO2k8c2l6ZV9leHRyYWZpZWxkX2dsb2JhbDtpKyspCi0gICAgICAgICooemktPmNpLmNlbnRyYWxfaGVhZGVyK1NJWkVDRU5UUkFMSEVBREVSK3NpemVfZmlsZW5hbWUraSkgPQotICAgICAgICAgICAgICAqKCgoY29uc3QgY2hhciopZXh0cmFmaWVsZF9nbG9iYWwpK2kpOwotCi0gICAgZm9yIChpPTA7aTxzaXplX2NvbW1lbnQ7aSsrKQotICAgICAgICAqKHppLT5jaS5jZW50cmFsX2hlYWRlcitTSVpFQ0VOVFJBTEhFQURFUitzaXplX2ZpbGVuYW1lKwotICAgICAgICAgICAgICBzaXplX2V4dHJhZmllbGRfZ2xvYmFsK2kpID0gKihjb21tZW50K2kpOwotICAgIGlmICh6aS0+Y2kuY2VudHJhbF9oZWFkZXIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOwotCi0gICAgLyogd3JpdGUgdGhlIGxvY2FsIGhlYWRlciAqLwotICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpTE9DQUxIRUFERVJNQUdJQyw0KTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykyMCwyKTsvKiB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0ICovCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5jaS5mbGFnLDIpOwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5jaS5tZXRob2QsMik7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPmNpLmRvc0RhdGUsNCk7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsgLyogY3JjIDMyLCB1bmtub3duICovCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTAsNCk7IC8qIGNvbXByZXNzZWQgc2l6ZSwgdW5rbm93biAqLwotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDQpOyAvKiB1bmNvbXByZXNzZWQgc2l6ZSwgdW5rbm93biAqLwotCi0gICAgaWYgKGVycj09WklQX09LKQotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXNpemVfZmlsZW5hbWUsMik7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpc2l6ZV9leHRyYWZpZWxkX2xvY2FsLDIpOwotCi0gICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHNpemVfZmlsZW5hbWU+MCkpCi0gICAgICAgIGlmIChaV1JJVEUoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sZmlsZW5hbWUsc2l6ZV9maWxlbmFtZSkhPXNpemVfZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotCi0gICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHNpemVfZXh0cmFmaWVsZF9sb2NhbD4wKSkKLSAgICAgICAgaWYgKFpXUklURSh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSxleHRyYWZpZWxkX2xvY2FsLHNpemVfZXh0cmFmaWVsZF9sb2NhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9c2l6ZV9leHRyYWZpZWxkX2xvY2FsKQotICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLQotICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gPSAodUludCkwOwotICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpWl9CVUZTSVpFOwotICAgIHppLT5jaS5zdHJlYW0ubmV4dF9vdXQgPSB6aS0+Y2kuYnVmZmVyZWRfZGF0YTsKLSAgICB6aS0+Y2kuc3RyZWFtLnRvdGFsX2luID0gMDsKLSAgICB6aS0+Y2kuc3RyZWFtLnRvdGFsX291dCA9IDA7Ci0KLSAgICBpZiAoKGVycj09WklQX09LKSAmJiAoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKSAmJiAoIXppLT5jaS5yYXcpKQotICAgIHsKLSAgICAgICAgemktPmNpLnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgICAgICB6aS0+Y2kuc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOwotICAgICAgICB6aS0+Y2kuc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKLQotICAgICAgICBpZiAod2luZG93Qml0cz4wKQotICAgICAgICAgICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzOwotCi0gICAgICAgIGVyciA9IGRlZmxhdGVJbml0MigmemktPmNpLnN0cmVhbSwgbGV2ZWwsCi0gICAgICAgICAgICAgICBaX0RFRkxBVEVELCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpOwotCi0gICAgICAgIGlmIChlcnI9PVpfT0spCi0gICAgICAgICAgICB6aS0+Y2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMTsKLSAgICB9Ci0jICAgIGlmbmRlZiBOT0NSWVBUCi0gICAgemktPmNpLmNyeXB0X2hlYWRlcl9zaXplID0gMDsKLSAgICBpZiAoKGVycj09Wl9PSykgJiYgKHBhc3N3b3JkICE9IE5VTEwpKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBidWZIZWFkW1JBTkRfSEVBRF9MRU5dOwotICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZUhlYWQ7Ci0gICAgICAgIHppLT5jaS5lbmNyeXB0ID0gMTsKLSAgICAgICAgemktPmNpLnBjcmNfMzJfdGFiID0gZ2V0X2NyY190YWJsZSgpOwotICAgICAgICAvKmluaXRfa2V5cyhwYXNzd29yZCx6aS0+Y2kua2V5cyx6aS0+Y2kucGNyY18zMl90YWIpOyovCi0KLSAgICAgICAgc2l6ZUhlYWQ9Y3J5cHRoZWFkKHBhc3N3b3JkLGJ1ZkhlYWQsUkFORF9IRUFEX0xFTix6aS0+Y2kua2V5cyx6aS0+Y2kucGNyY18zMl90YWIsY3JjRm9yQ3J5cHRpbmcpOwotICAgICAgICB6aS0+Y2kuY3J5cHRfaGVhZGVyX3NpemUgPSBzaXplSGVhZDsKLQotICAgICAgICBpZiAoWldSSVRFKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGJ1ZkhlYWQsc2l6ZUhlYWQpICE9IHNpemVIZWFkKQotICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgICB9Ci0jICAgIGVuZGlmCi0KLSAgICBpZiAoZXJyPT1aX09LKQotICAgICAgICB6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPSAxOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMihmaWxlLCBmaWxlbmFtZSwgemlwZmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfZ2xvYmFsLCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwsIHJhdykKLSAgICB6aXBGaWxlIGZpbGU7Ci0gICAgY29uc3QgY2hhciogZmlsZW5hbWU7Ci0gICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaTsKLSAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsOwotICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsOwotICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsOwotICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbDsKLSAgICBjb25zdCBjaGFyKiBjb21tZW50OwotICAgIGludCBtZXRob2Q7Ci0gICAgaW50IGxldmVsOwotICAgIGludCByYXc7Ci17Ci0gICAgcmV0dXJuIHppcE9wZW5OZXdGaWxlSW5aaXAzIChmaWxlLCBmaWxlbmFtZSwgemlwZmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2dsb2JhbCwgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwsIHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOwotfQotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZmllbGRfbG9jYWwsIHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2dsb2JhbCwgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsKQotICAgIHppcEZpbGUgZmlsZTsKLSAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKLSAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpOwotICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWw7Ci0gICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWw7Ci0gICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWw7Ci0gICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsOwotICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQ7Ci0gICAgaW50IG1ldGhvZDsKLSAgICBpbnQgbGV2ZWw7Ci17Ci0gICAgcmV0dXJuIHppcE9wZW5OZXdGaWxlSW5aaXAyIChmaWxlLCBmaWxlbmFtZSwgemlwZmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2dsb2JhbCwgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwsIDApOwotfQotCi1sb2NhbCBpbnQgemlwRmx1c2hXcml0ZUJ1ZmZlcih6aSkKLSAgemlwX2ludGVybmFsKiB6aTsKLXsKLSAgICBpbnQgZXJyPVpJUF9PSzsKLQotICAgIGlmICh6aS0+Y2kuZW5jcnlwdCAhPSAwKQotICAgIHsKLSNpZm5kZWYgTk9DUllQVAotICAgICAgICB1SW50IGk7Ci0gICAgICAgIGludCB0OwotICAgICAgICBmb3IgKGk9MDtpPHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YTtpKyspCi0gICAgICAgICAgICB6aS0+Y2kuYnVmZmVyZWRfZGF0YVtpXSA9IHplbmNvZGUoemktPmNpLmtleXMsIHppLT5jaS5wY3JjXzMyX3RhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppLT5jaS5idWZmZXJlZF9kYXRhW2ldLHQpOwotI2VuZGlmCi0gICAgfQotICAgIGlmIChaV1JJVEUoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0semktPmNpLmJ1ZmZlcmVkX2RhdGEsemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPXppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSkKLSAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgICB6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEgPSAwOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBXcml0ZUluRmlsZUluWmlwIChmaWxlLCBidWYsIGxlbikKLSAgICB6aXBGaWxlIGZpbGU7Ci0gICAgY29uc3Qgdm9pZCogYnVmOwotICAgIHVuc2lnbmVkIGxlbjsKLXsKLSAgICB6aXBfaW50ZXJuYWwqIHppOwotICAgIGludCBlcnI9WklQX09LOwotCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwotICAgIHppID0gKHppcF9pbnRlcm5hbCopZmlsZTsKLQotICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMCkKLSAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwotCi0gICAgemktPmNpLnN0cmVhbS5uZXh0X2luID0gKHZvaWQqKWJ1ZjsKLSAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gbGVuOwotICAgIHppLT5jaS5jcmMzMiA9IGNyYzMyKHppLT5jaS5jcmMzMixidWYsbGVuKTsKLQotICAgIHdoaWxlICgoZXJyPT1aSVBfT0spICYmICh6aS0+Y2kuc3RyZWFtLmF2YWlsX2luPjApKQotICAgIHsKLSAgICAgICAgaWYgKHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh6aXBGbHVzaFdyaXRlQnVmZmVyKHppKSA9PSBaSVBfRVJSTk8pCi0gICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotICAgICAgICAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClaX0JVRlNJWkU7Ci0gICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0ID0gemktPmNpLmJ1ZmZlcmVkX2RhdGE7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmKGVyciAhPSBaSVBfT0spCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCkgJiYgKCF6aS0+Y2kucmF3KSkKLSAgICAgICAgewotICAgICAgICAgICAgdUxvbmcgdVRvdGFsT3V0QmVmb3JlID0gemktPmNpLnN0cmVhbS50b3RhbF9vdXQ7Ci0gICAgICAgICAgICBlcnI9ZGVmbGF0ZSgmemktPmNpLnN0cmVhbSwgIFpfTk9fRkxVU0gpOwotICAgICAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9ICh1SW50KSh6aS0+Y2kuc3RyZWFtLnRvdGFsX291dCAtIHVUb3RhbE91dEJlZm9yZSkgOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1SW50IGNvcHlfdGhpcyxpOwotICAgICAgICAgICAgaWYgKHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gPCB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCkKLSAgICAgICAgICAgICAgICBjb3B5X3RoaXMgPSB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvcHlfdGhpcyA9IHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0OwotICAgICAgICAgICAgZm9yIChpPTA7aTxjb3B5X3RoaXM7aSsrKQotICAgICAgICAgICAgICAgICooKChjaGFyKil6aS0+Y2kuc3RyZWFtLm5leHRfb3V0KStpKSA9Ci0gICAgICAgICAgICAgICAgICAgICooKChjb25zdCBjaGFyKil6aS0+Y2kuc3RyZWFtLm5leHRfaW4pK2kpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gLT0gY29weV90aGlzOwotICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0LT0gY29weV90aGlzOwotICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0ubmV4dF9pbis9IGNvcHlfdGhpczsKLSAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0Kz0gY29weV90aGlzOwotICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0udG90YWxfaW4rPSBjb3B5X3RoaXM7Ci0gICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS50b3RhbF9vdXQrPSBjb3B5X3RoaXM7Ci0gICAgICAgICAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9IGNvcHlfdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZUZpbGVJblppcFJhdyAoZmlsZSwgdW5jb21wcmVzc2VkX3NpemUsIGNyYzMyKQotICAgIHppcEZpbGUgZmlsZTsKLSAgICB1TG9uZyB1bmNvbXByZXNzZWRfc2l6ZTsKLSAgICB1TG9uZyBjcmMzMjsKLXsKLSAgICB6aXBfaW50ZXJuYWwqIHppOwotICAgIHVMb25nIGNvbXByZXNzZWRfc2l6ZTsKLSAgICBpbnQgZXJyPVpJUF9PSzsKLQotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKLSAgICB6aSA9ICh6aXBfaW50ZXJuYWwqKWZpbGU7Ci0KLSAgICBpZiAoemktPmluX29wZW5lZF9maWxlX2luemlwID09IDApCi0gICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKLSAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gMDsKLQotICAgIGlmICgoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKSAmJiAoIXppLT5jaS5yYXcpKQotICAgICAgICB3aGlsZSAoZXJyPT1aSVBfT0spCi0gICAgewotICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmU7Ci0gICAgICAgIGlmICh6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoemlwRmx1c2hXcml0ZUJ1ZmZlcih6aSkgPT0gWklQX0VSUk5PKQotICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLSAgICAgICAgICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpWl9CVUZTSVpFOwotICAgICAgICAgICAgemktPmNpLnN0cmVhbS5uZXh0X291dCA9IHppLT5jaS5idWZmZXJlZF9kYXRhOwotICAgICAgICB9Ci0gICAgICAgIHVUb3RhbE91dEJlZm9yZSA9IHppLT5jaS5zdHJlYW0udG90YWxfb3V0OwotICAgICAgICBlcnI9ZGVmbGF0ZSgmemktPmNpLnN0cmVhbSwgIFpfRklOSVNIKTsKLSAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9ICh1SW50KSh6aS0+Y2kuc3RyZWFtLnRvdGFsX291dCAtIHVUb3RhbE91dEJlZm9yZSkgOwotICAgIH0KLQotICAgIGlmIChlcnI9PVpfU1RSRUFNX0VORCkKLSAgICAgICAgZXJyPVpJUF9PSzsgLyogdGhpcyBpcyBub3JtYWwgKi8KLQotICAgIGlmICgoemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhPjApICYmIChlcnI9PVpJUF9PSykpCi0gICAgICAgIGlmICh6aXBGbHVzaFdyaXRlQnVmZmVyKHppKT09WklQX0VSUk5PKQotICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotCi0gICAgaWYgKCh6aS0+Y2kubWV0aG9kID09IFpfREVGTEFURUQpICYmICghemktPmNpLnJhdykpCi0gICAgewotICAgICAgICBlcnI9ZGVmbGF0ZUVuZCgmemktPmNpLnN0cmVhbSk7Ci0gICAgICAgIHppLT5jaS5zdHJlYW1faW5pdGlhbGlzZWQgPSAwOwotICAgIH0KLQotICAgIGlmICghemktPmNpLnJhdykKLSAgICB7Ci0gICAgICAgIGNyYzMyID0gKHVMb25nKXppLT5jaS5jcmMzMjsKLSAgICAgICAgdW5jb21wcmVzc2VkX3NpemUgPSAodUxvbmcpemktPmNpLnN0cmVhbS50b3RhbF9pbjsKLSAgICB9Ci0gICAgY29tcHJlc3NlZF9zaXplID0gKHVMb25nKXppLT5jaS5zdHJlYW0udG90YWxfb3V0OwotIyAgICBpZm5kZWYgTk9DUllQVAotICAgIGNvbXByZXNzZWRfc2l6ZSArPSB6aS0+Y2kuY3J5cHRfaGVhZGVyX3NpemU7Ci0jICAgIGVuZGlmCi0KLSAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMTYsY3JjMzIsNCk7IC8qY3JjKi8KLSAgICB6aXBsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRfc2l6ZSw0KTsgLypjb21wciBzaXplKi8KLSAgICBpZiAoemktPmNpLnN0cmVhbS5kYXRhX3R5cGUgPT0gWl9BU0NJSSkKLSAgICAgICAgemlwbG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM2LCh1TG9uZylaX0FTQ0lJLDIpOwotICAgIHppcGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkX3NpemUsNCk7IC8qdW5jb21wciBzaXplKi8KLQotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICAgICAgZXJyID0gYWRkX2RhdGFfaW5fZGF0YWJsb2NrKCZ6aS0+Y2VudHJhbF9kaXIsemktPmNpLmNlbnRyYWxfaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVMb25nKXppLT5jaS5zaXplX2NlbnRyYWxoZWFkZXIpOwotICAgIGZyZWUoemktPmNpLmNlbnRyYWxfaGVhZGVyKTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykKLSAgICB7Ci0gICAgICAgIGxvbmcgY3VyX3Bvc19pbnppcCA9IFpURUxMKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtKTsKLSAgICAgICAgaWYgKFpTRUVLKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgemktPmNpLnBvc19sb2NhbF9oZWFkZXIgKyAxNCxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKLSAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKLQotICAgICAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sY3JjMzIsNCk7IC8qIGNyYyAzMiwgdW5rbm93biAqLwotCi0gICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCi0gICAgICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sY29tcHJlc3NlZF9zaXplLDQpOwotCi0gICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogdW5jb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KLSAgICAgICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSx1bmNvbXByZXNzZWRfc2l6ZSw0KTsKLQotICAgICAgICBpZiAoWlNFRUsoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBjdXJfcG9zX2luemlwLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQotICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotICAgIH0KLQotICAgIHppLT5udW1iZXJfZW50cnkgKys7Ci0gICAgemktPmluX29wZW5lZF9maWxlX2luemlwID0gMDsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZUZpbGVJblppcCAoZmlsZSkKLSAgICB6aXBGaWxlIGZpbGU7Ci17Ci0gICAgcmV0dXJuIHppcENsb3NlRmlsZUluWmlwUmF3IChmaWxlLDAsMCk7Ci19Ci0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZSAoZmlsZSwgZ2xvYmFsX2NvbW1lbnQpCi0gICAgemlwRmlsZSBmaWxlOwotICAgIGNvbnN0IGNoYXIqIGdsb2JhbF9jb21tZW50OwotewotICAgIHppcF9pbnRlcm5hbCogemk7Ci0gICAgaW50IGVyciA9IDA7Ci0gICAgdUxvbmcgc2l6ZV9jZW50cmFsZGlyID0gMDsKLSAgICB1TG9uZyBjZW50cmFsZGlyX3Bvc19pbnppcDsKLSAgICB1SW50IHNpemVfZ2xvYmFsX2NvbW1lbnQ7Ci0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOwotICAgIHppID0gKHppcF9pbnRlcm5hbCopZmlsZTsKLQotICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMSkKLSAgICB7Ci0gICAgICAgIGVyciA9IHppcENsb3NlRmlsZUluWmlwIChmaWxlKTsKLSAgICB9Ci0KLSNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKLSAgICBpZiAoZ2xvYmFsX2NvbW1lbnQ9PU5VTEwpCi0gICAgICAgIGdsb2JhbF9jb21tZW50ID0gemktPmdsb2JhbGNvbW1lbnQ7Ci0jZW5kaWYKLSAgICBpZiAoZ2xvYmFsX2NvbW1lbnQ9PU5VTEwpCi0gICAgICAgIHNpemVfZ2xvYmFsX2NvbW1lbnQgPSAwOwotICAgIGVsc2UKLSAgICAgICAgc2l6ZV9nbG9iYWxfY29tbWVudCA9ICh1SW50KXN0cmxlbihnbG9iYWxfY29tbWVudCk7Ci0KLSAgICBjZW50cmFsZGlyX3Bvc19pbnppcCA9IFpURUxMKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtKTsKLSAgICBpZiAoZXJyPT1aSVBfT0spCi0gICAgewotICAgICAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpID0gemktPmNlbnRyYWxfZGlyLmZpcnN0X2Jsb2NrIDsKLSAgICAgICAgd2hpbGUgKGxkaSE9TlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKGxkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2s+MCkpCi0gICAgICAgICAgICAgICAgaWYgKFpXUklURSh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkaS0+ZGF0YSxsZGktPmZpbGxlZF9pbl90aGlzX2Jsb2NrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT1sZGktPmZpbGxlZF9pbl90aGlzX2Jsb2NrICkKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotCi0gICAgICAgICAgICBzaXplX2NlbnRyYWxkaXIgKz0gbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jazsKLSAgICAgICAgICAgIGxkaSA9IGxkaS0+bmV4dF9kYXRhYmxvY2s7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZnJlZV9kYXRhYmxvY2soemktPmNlbnRyYWxfZGlyLmZpcnN0X2Jsb2NrKTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykgLyogTWFnaWMgRW5kICovCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpRU5ESEVBREVSTUFHSUMsNCk7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgKi8KLSAgICAgICAgZXJyID0gemlwbG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDIpOwotCi0gICAgaWYgKGVycj09WklQX09LKSAvKiBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCwyKTsKLQotICAgIGlmIChlcnI9PVpJUF9PSykgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyIG9uIHRoaXMgZGlzayAqLwotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5udW1iZXJfZW50cnksMik7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciAqLwotICAgICAgICBlcnIgPSB6aXBsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5udW1iZXJfZW50cnksMik7Ci0KLSAgICBpZiAoZXJyPT1aSVBfT0spIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpc2l6ZV9jZW50cmFsZGlyLDQpOwotCi0gICAgaWYgKGVycj09WklQX09LKSAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVMb25nKShjZW50cmFsZGlyX3Bvc19pbnppcCAtIHppLT5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQpLDQpOwotCi0gICAgaWYgKGVycj09WklQX09LKSAvKiB6aXBmaWxlIGNvbW1lbnQgbGVuZ3RoICovCi0gICAgICAgIGVyciA9IHppcGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpc2l6ZV9nbG9iYWxfY29tbWVudCwyKTsKLQotICAgIGlmICgoZXJyPT1aSVBfT0spICYmIChzaXplX2dsb2JhbF9jb21tZW50PjApKQotICAgICAgICBpZiAoWldSSVRFKHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLAotICAgICAgICAgICAgICAgICAgIGdsb2JhbF9jb21tZW50LHNpemVfZ2xvYmFsX2NvbW1lbnQpICE9IHNpemVfZ2xvYmFsX2NvbW1lbnQpCi0gICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POwotCi0gICAgaWYgKFpDTE9TRSh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSkgIT0gMCkKLSAgICAgICAgaWYgKGVyciA9PSBaSVBfT0spCi0gICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87Ci0KLSNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKLSAgICBUUllGUkVFKHppLT5nbG9iYWxjb21tZW50KTsKLSNlbmRpZgotICAgIFRSWUZSRUUoemkpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvemlwLmggYi9saWJzL3psaWIvY29udHJpYi9taW5pemlwL3ppcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FjY2U4Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL21pbml6aXAvemlwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyogemlwLmggLS0gSU8gZm9yIGNvbXByZXNzIC56aXAgZmlsZXMgdXNpbmcgemxpYgotICAgVmVyc2lvbiAxLjAxZSwgRmVicnVhcnkgMTJ0aCwgMjAwNQotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNSBHaWxsZXMgVm9sbGFudAotCi0gICBUaGlzIHVuemlwIHBhY2thZ2UgYWxsb3cgY3JlYXRlcyAuWklQIGZpbGUsIGNvbXBhdGlibGUgd2l0aCBQS1ppcCAyLjA0ZwotICAgICBXaW5aaXAsIEluZm9aaXAgdG9vbHMgYW5kIGNvbXBhdGlibGUuCi0gICBNdWx0aSB2b2x1bWUgWmlwRmlsZSAoc3BhbikgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICBFbmNyeXB0aW9uIGNvbXBhdGlibGUgd2l0aCBwa3ppcCAyLjA0ZyBvbmx5IHN1cHBvcnRlZAotICAgT2xkIGNvbXByZXNzaW9ucyB1c2VkIGJ5IG9sZCBQS1ppcCAxLnggYXJlIG5vdCBzdXBwb3J0ZWQKLQotICBGb3IgdW5jb21wcmVzcyAuemlwIGZpbGUsIGxvb2sgYXQgdW56aXAuaAotCi0KLSAgIEkgV0FJVCBGRUVEQkFDSyBhdCBtYWlsIGluZm9Ad2luaW1hZ2UuY29tCi0gICBWaXNpdCBhbHNvIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbCBmb3IgZXZvbHV0aW9uCi0KLSAgIENvbmRpdGlvbiBvZiB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBhcmUgdGhlIHNhbWUgdGhhbiB6bGliIDoKLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLQotKi8KLQotLyogZm9yIG1vcmUgaW5mbyBhYm91dCAuWklQIGZvcm1hdCwgc2VlCi0gICAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9kb2MvYXBwbm90ZS05ODExMTktaXouemlwCi0gICAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9kb2MvCi0gICBQa1dhcmUgaGFzIGFsc28gYSBzcGVjaWZpY2F0aW9uIGF0IDoKLSAgICAgIGZ0cDovL2Z0cC5wa3dhcmUuY29tL3Byb2JkZXNjLnppcAotKi8KLQotI2lmbmRlZiBfemlwX0gKLSNkZWZpbmUgX3ppcF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBfWkxJQl9ICi0jaW5jbHVkZSAiemxpYi5oIgotI2VuZGlmCi0KLSNpZm5kZWYgX1pMSUJJT0FQSV9ICi0jaW5jbHVkZSAiaW9hcGkuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChTVFJJQ1RaSVApIHx8IGRlZmluZWQoU1RSSUNUWklQVU5aSVApCi0vKiBsaWtlIHRoZSBTVFJJQ1Qgb2YgV0lOMzIsIHdlIGRlZmluZSBhIHBvaW50ZXIgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkCi0gICAgZnJvbSAodm9pZCopIHdpdGhvdXQgY2FzdCAqLwotdHlwZWRlZiBzdHJ1Y3QgVGFnemlwRmlsZV9fIHsgaW50IHVudXNlZDsgfSB6aXBGaWxlX187Ci10eXBlZGVmIHppcEZpbGVfXyAqemlwRmlsZTsKLSNlbHNlCi10eXBlZGVmIHZvaWRwIHppcEZpbGU7Ci0jZW5kaWYKLQotI2RlZmluZSBaSVBfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBaSVBfRU9GICAgICAgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBaSVBfRVJSTk8gICAgICAgICAgICAgICAgICAgICAgIChaX0VSUk5PKQotI2RlZmluZSBaSVBfUEFSQU1FUlJPUiAgICAgICAgICAgICAgICAgICgtMTAyKQotI2RlZmluZSBaSVBfQkFEWklQRklMRSAgICAgICAgICAgICAgICAgICgtMTAzKQotI2RlZmluZSBaSVBfSU5URVJOQUxFUlJPUiAgICAgICAgICAgICAgICgtMTA0KQotCi0jaWZuZGVmIERFRl9NRU1fTEVWRUwKLSMgIGlmIE1BWF9NRU1fTEVWRUwgPj0gOAotIyAgICBkZWZpbmUgREVGX01FTV9MRVZFTCA4Ci0jICBlbHNlCi0jICAgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCi0jICBlbmRpZgotI2VuZGlmCi0vKiBkZWZhdWx0IG1lbUxldmVsICovCi0KLS8qIHRtX3ppcCBjb250YWluIGRhdGUvdGltZSBpbmZvICovCi10eXBlZGVmIHN0cnVjdCB0bV96aXBfcwotewotICAgIHVJbnQgdG1fc2VjOyAgICAgICAgICAgIC8qIHNlY29uZHMgYWZ0ZXIgdGhlIG1pbnV0ZSAtIFswLDU5XSAqLwotICAgIHVJbnQgdG1fbWluOyAgICAgICAgICAgIC8qIG1pbnV0ZXMgYWZ0ZXIgdGhlIGhvdXIgLSBbMCw1OV0gKi8KLSAgICB1SW50IHRtX2hvdXI7ICAgICAgICAgICAvKiBob3VycyBzaW5jZSBtaWRuaWdodCAtIFswLDIzXSAqLwotICAgIHVJbnQgdG1fbWRheTsgICAgICAgICAgIC8qIGRheSBvZiB0aGUgbW9udGggLSBbMSwzMV0gKi8KLSAgICB1SW50IHRtX21vbjsgICAgICAgICAgICAvKiBtb250aHMgc2luY2UgSmFudWFyeSAtIFswLDExXSAqLwotICAgIHVJbnQgdG1feWVhcjsgICAgICAgICAgIC8qIHllYXJzIC0gWzE5ODAuLjIwNDRdICovCi19IHRtX3ppcDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB0bV96aXAgICAgICB0bXpfZGF0ZTsgICAgICAgLyogZGF0ZSBpbiB1bmRlcnN0YW5kYWJsZSBmb3JtYXQgICAgICAgICAgICovCi0gICAgdUxvbmcgICAgICAgZG9zRGF0ZTsgICAgICAgLyogaWYgZG9zX2RhdGUgPT0gMCwgdG11X2RhdGUgaXMgdXNlZCAgICAgICovCi0vKiAgICB1TG9uZyAgICAgICBmbGFnOyAgICAgICAgKi8gICAvKiBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcgICAgICAgIDIgYnl0ZXMgKi8KLQotICAgIHVMb25nICAgICAgIGludGVybmFsX2ZhOyAgICAvKiBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgICAgICAgIDIgYnl0ZXMgKi8KLSAgICB1TG9uZyAgICAgICBleHRlcm5hbF9mYTsgICAgLyogZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICA0IGJ5dGVzICovCi19IHppcF9maWxlaW5mbzsKLQotdHlwZWRlZiBjb25zdCBjaGFyKiB6aXBjaGFycGM7Ci0KLQotI2RlZmluZSBBUFBFTkRfU1RBVFVTX0NSRUFURSAgICAgICAgKDApCi0jZGVmaW5lIEFQUEVORF9TVEFUVVNfQ1JFQVRFQUZURVIgICAoMSkKLSNkZWZpbmUgQVBQRU5EX1NUQVRVU19BRERJTlpJUCAgICAgICgyKQotCi1leHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4gT0YoKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgYXBwZW5kKSk7Ci0vKgotICBDcmVhdGUgYSB6aXBmaWxlLgotICAgICBwYXRobmFtZSBjb250YWluIG9uIFdpbmRvd3MgWFAgYSBmaWxlbmFtZSBsaWtlICJjOlxcemxpYlxcemxpYjExMy56aXAiIG9yIG9uCi0gICAgICAgYW4gVW5peCBjb21wdXRlciAiemxpYi96bGliMTEzLnppcCIuCi0gICAgIGlmIHRoZSBmaWxlIHBhdGhuYW1lIGV4aXN0IGFuZCBhcHBlbmQ9PUFQUEVORF9TVEFUVVNfQ1JFQVRFQUZURVIsIHRoZSB6aXAKLSAgICAgICB3aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICAgICAgICh1c2VmdWwgaWYgdGhlIGZpbGUgY29udGFpbiBhIHNlbGYgZXh0cmFjdG9yIGNvZGUpCi0gICAgIGlmIHRoZSBmaWxlIHBhdGhuYW1lIGV4aXN0IGFuZCBhcHBlbmQ9PUFQUEVORF9TVEFUVVNfQURESU5aSVAsIHdlIHdpbGwKLSAgICAgICBhZGQgZmlsZXMgaW4gZXhpc3RpbmcgemlwIChiZSBzdXJlIHlvdSBkb24ndCBhZGQgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QpCi0gICAgIElmIHRoZSB6aXBmaWxlIGNhbm5vdCBiZSBvcGVuZWQsIHRoZSByZXR1cm4gdmFsdWUgaXMgTlVMTC4KLSAgICAgRWxzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHppcEZpbGUgSGFuZGxlLCB1c2FibGUgd2l0aCBvdGhlciBmdW5jdGlvbgotICAgICAgIG9mIHRoaXMgemlwIHBhY2thZ2UuCi0qLwotCi0vKiBOb3RlIDogdGhlcmUgaXMgbm8gZGVsZXRlIGZ1bmN0aW9uIGludG8gYSB6aXBmaWxlLgotICAgSWYgeW91IHdhbnQgZGVsZXRlIGZpbGUgaW50byBhIHppcGZpbGUsIHlvdSBtdXN0IG9wZW4gYSB6aXBmaWxlLCBhbmQgY3JlYXRlIGFub3RoZXIKLSAgIE9mIGNvdXNlLCB5b3UgY2FuIHVzZSBSQVcgcmVhZGluZyBhbmQgd3JpdGluZyB0byBjb3B5IHRoZSBmaWxlIHlvdSBkaWQgbm90IHdhbnQgZGVsdGUKLSovCi0KLWV4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjIgT0YoKGNvbnN0IGNoYXIgKnBhdGhuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBwZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBjaGFycGMqIGdsb2JhbGNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAgT0YoKHppcEZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpKTsKLS8qCi0gIE9wZW4gYSBmaWxlIGluIHRoZSBaSVAgZm9yIHdyaXRpbmcuCi0gIGZpbGVuYW1lIDogdGhlIGZpbGVuYW1lIGluIHppcCAoaWYgTlVMTCwgJy0nIHdpdGhvdXQgcXVvdGUgd2lsbCBiZSB1c2VkCi0gICp6aXBmaSBjb250YWluIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbgotICBpZiBleHRyYWZpZWxkX2xvY2FsIT1OVUxMIGFuZCBzaXplX2V4dHJhZmllbGRfbG9jYWw+MCwgZXh0cmFmaWVsZF9sb2NhbAotICAgIGNvbnRhaW5zIHRoZSBleHRyYWZpZWxkIGRhdGEgdGhlIHRoZSBsb2NhbCBoZWFkZXIKLSAgaWYgZXh0cmFmaWVsZF9nbG9iYWwhPU5VTEwgYW5kIHNpemVfZXh0cmFmaWVsZF9nbG9iYWw+MCwgZXh0cmFmaWVsZF9nbG9iYWwKLSAgICBjb250YWlucyB0aGUgZXh0cmFmaWVsZCBkYXRhIHRoZSB0aGUgbG9jYWwgaGVhZGVyCi0gIGlmIGNvbW1lbnQgIT0gTlVMTCwgY29tbWVudCBjb250YWluIHRoZSBjb21tZW50IHN0cmluZwotICBtZXRob2QgY29udGFpbiB0aGUgY29tcHJlc3Npb24gbWV0aG9kICgwIGZvciBzdG9yZSwgWl9ERUZMQVRFRCBmb3IgZGVmbGF0ZSkKLSAgbGV2ZWwgY29udGFpbiB0aGUgbGV2ZWwgb2YgY29tcHJlc3Npb24gKGNhbiBiZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pCi0qLwotCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMiBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdykpOwotCi0vKgotICBTYW1lIHRoYW4gemlwT3Blbk5ld0ZpbGVJblppcCwgZXhjZXB0IGlmIHJhdz0xLCB3ZSB3cml0ZSByYXcgZmlsZQotICovCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwMyBPRigoemlwRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZW1MZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY3JjRm9yQ3R5cHRpbmcpKTsKLQotLyoKLSAgU2FtZSB0aGFuIHppcE9wZW5OZXdGaWxlSW5aaXAyLCBleGNlcHQKLSAgICB3aW5kb3dCaXRzLG1lbUxldmVsLCxzdHJhdGVneSA6IHNlZSBwYXJhbWV0ZXIgc3RyYXRlZ3kgaW4gZGVmbGF0ZUluaXQyCi0gICAgcGFzc3dvcmQgOiBjcnlwdGluZyBwYXNzd29yZCAoTlVMTCBmb3Igbm8gY3J5cHRpbmcpCi0gICAgY3JjRm9yQ3R5cHRpbmcgOiBjcmMgb2YgZmlsZSB0byBjb21wcmVzcyAobmVlZGVkIGZvciBjcnlwdGluZykKLSAqLwotCi0KLWV4dGVybiBpbnQgWkVYUE9SVCB6aXBXcml0ZUluRmlsZUluWmlwIE9GKCh6aXBGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7Ci0vKgotICBXcml0ZSBkYXRhIGluIHRoZSB6aXBmaWxlCi0qLwotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2VGaWxlSW5aaXAgT0YoKHppcEZpbGUgZmlsZSkpOwotLyoKLSAgQ2xvc2UgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZQotKi8KLQotZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3IE9GKCh6aXBGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHVuY29tcHJlc3NlZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjcmMzMikpOwotLyoKLSAgQ2xvc2UgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZSwgZm9yIGZpZWwgb3BlbmVkIHdpdGgKLSAgICBwYXJhbWV0ZXIgcmF3PTEgaW4gemlwT3Blbk5ld0ZpbGVJblppcDIKLSAgdW5jb21wcmVzc2VkX3NpemUgYW5kIGNyYzMyIGFyZSB2YWx1ZSBmb3IgdGhlIHVuY29tcHJlc3NlZCBzaXplCi0qLwotCi1leHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2UgT0YoKHppcEZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBnbG9iYWxfY29tbWVudCkpOwotLyoKLSAgQ2xvc2UgdGhlIHppcGZpbGUKLSovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfemlwX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL3Bhc2NhbC9leGFtcGxlLnBhcyBiL2xpYnMvemxpYi9jb250cmliL3Bhc2NhbC9leGFtcGxlLnBhcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUxOGIzNi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9wYXNjYWwvZXhhbXBsZS5wYXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTkgKzAsMCBAQAotKCogZXhhbXBsZS5jIC0tIHVzYWdlIGV4YW1wbGUgb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqCi0gKiBQYXNjYWwgdHJhbnNsYXRpb24KLSAqIENvcHlyaWdodCAoQykgMTk5OCBieSBKYWNxdWVzIE5vbXNzaSBOemFsaS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiByZWFkbWUudHh0Ci0gKgotICogQWRhcHRhdGlvbiB0byB0aGUgemxpYnBhcyBpbnRlcmZhY2UKLSAqIENvcHlyaWdodCAoQykgMjAwMyBieSBDb3NtaW4gVHJ1dGEuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcmVhZG1lLnR4dAotICopCi0KLXByb2dyYW0gZXhhbXBsZTsKLQoteyRERUZJTkUgVEVTVF9DT01QUkVTU30KLXtETyBOT1QgJERFRklORSBURVNUX0daSU99Ci17JERFRklORSBURVNUX0RFRkxBVEV9Ci17JERFRklORSBURVNUX0lORkxBVEV9Ci17JERFRklORSBURVNUX0ZMVVNIfQoteyRERUZJTkUgVEVTVF9TWU5DfQoteyRERUZJTkUgVEVTVF9ESUNUfQotCi11c2VzIFN5c1V0aWxzLCB6bGlicGFzOwotCi1jb25zdCBURVNURklMRSA9ICdmb28uZ3onOwotCi0oKiAiaGVsbG8gd29ybGQiIHdvdWxkIGJlIG1vcmUgc3RhbmRhcmQsIGJ1dCB0aGUgcmVwZWF0ZWQgImhlbGxvIgotICogc3RyZXNzZXMgdGhlIGNvbXByZXNzaW9uIGNvZGUgYmV0dGVyLCBzb3JyeS4uLgotICopCi1jb25zdCBoZWxsbzogUENoYXIgPSAnaGVsbG8sIGhlbGxvISc7Ci0KLWNvbnN0IGRpY3Rpb25hcnk6IFBDaGFyID0gJ2hlbGxvJzsKLQotdmFyIGRpY3RJZDogTG9uZ0ludDsgKCogQWRsZXIzMiB2YWx1ZSBvZiB0aGUgZGljdGlvbmFyeSAqKQotCi1wcm9jZWR1cmUgQ0hFQ0tfRVJSKGVycjogSW50ZWdlcjsgbXNnOiBTdHJpbmcpOwotYmVnaW4KLSAgaWYgZXJyIDw+IFpfT0sgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4obXNnLCAnIGVycm9yOiAnLCBlcnIpOwotICAgIEhhbHQoMSk7Ci0gIGVuZDsKLWVuZDsKLQotcHJvY2VkdXJlIEVYSVRfRVJSKGNvbnN0IG1zZzogU3RyaW5nKTsKLWJlZ2luCi0gIFdyaXRlTG4oJ0Vycm9yOiAnLCBtc2cpOwotICBIYWx0KDEpOwotZW5kOwotCi0oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgY29tcHJlc3MgYW5kIHVuY29tcHJlc3MKLSAqKQoteyRJRkRFRiBURVNUX0NPTVBSRVNTfQotcHJvY2VkdXJlIHRlc3RfY29tcHJlc3MoY29tcHI6IFBvaW50ZXI7IGNvbXByTGVuOiBMb25nSW50OwotICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcjogUG9pbnRlcjsgdW5jb21wckxlbjogTG9uZ0ludCk7Ci12YXIgZXJyOiBJbnRlZ2VyOwotICAgIGxlbjogTG9uZ0ludDsKLWJlZ2luCi0gIGxlbiA6PSBTdHJMZW4oaGVsbG8pKzE7Ci0KLSAgZXJyIDo9IGNvbXByZXNzKGNvbXByLCBjb21wckxlbiwgaGVsbG8sIGxlbik7Ci0gIENIRUNLX0VSUihlcnIsICdjb21wcmVzcycpOwotCi0gIFN0ckNvcHkoUENoYXIodW5jb21wciksICdnYXJiYWdlJyk7Ci0KLSAgZXJyIDo9IHVuY29tcHJlc3ModW5jb21wciwgdW5jb21wckxlbiwgY29tcHIsIGNvbXByTGVuKTsKLSAgQ0hFQ0tfRVJSKGVyciwgJ3VuY29tcHJlc3MnKTsKLQotICBpZiBTdHJDb21wKFBDaGFyKHVuY29tcHIpLCBoZWxsbykgPD4gMCB0aGVuCi0gICAgRVhJVF9FUlIoJ2JhZCB1bmNvbXByZXNzJykKLSAgZWxzZQotICAgIFdyaXRlTG4oJ3VuY29tcHJlc3MoKTogJywgUENoYXIodW5jb21wcikpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IHJlYWQvd3JpdGUgb2YgLmd6IGZpbGVzCi0gKikKLXskSUZERUYgVEVTVF9HWklPfQotcHJvY2VkdXJlIHRlc3RfZ3ppbyhjb25zdCBmbmFtZTogUENoYXI7ICgqIGNvbXByZXNzZWQgZmlsZSBuYW1lICopCi0gICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7Ci0gICAgICAgICAgICAgICAgICAgIHVuY29tcHJMZW46IExvbmdJbnQpOwotdmFyIGVycjogSW50ZWdlcjsKLSAgICBsZW46IEludGVnZXI7Ci0gICAgemZpbGU6IGd6RmlsZTsKLSAgICBwb3M6IExvbmdJbnQ7Ci1iZWdpbgotICBsZW4gOj0gU3RyTGVuKGhlbGxvKSsxOwotCi0gIHpmaWxlIDo9IGd6b3BlbihmbmFtZSwgJ3diJyk7Ci0gIGlmIHpmaWxlID0gTklMIHRoZW4KLSAgYmVnaW4KLSAgICBXcml0ZUxuKCdnem9wZW4gZXJyb3InKTsKLSAgICBIYWx0KDEpOwotICBlbmQ7Ci0gIGd6cHV0Yyh6ZmlsZSwgJ2gnKTsKLSAgaWYgZ3pwdXRzKHpmaWxlLCAnZWxsbycpIDw+IDQgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2d6cHV0cyBlcnI6ICcsIGd6ZXJyb3IoemZpbGUsIGVycikpOwotICAgIEhhbHQoMSk7Ci0gIGVuZDsKLSAgeyRJRkRFRiBHWl9GT1JNQVRfU1RSSU5HfQotICBpZiBnenByaW50Zih6ZmlsZSwgJywgJXMhJywgJ2hlbGxvJykgPD4gOCB0aGVuCi0gIGJlZ2luCi0gICAgV3JpdGVMbignZ3pwcmludGYgZXJyOiAnLCBnemVycm9yKHpmaWxlLCBlcnIpKTsKLSAgICBIYWx0KDEpOwotICBlbmQ7Ci0gIHskRUxTRX0KLSAgaWYgZ3pwdXRzKHpmaWxlLCAnLCBoZWxsbyEnKSA8PiA4IHRoZW4KLSAgYmVnaW4KLSAgICBXcml0ZUxuKCdnenB1dHMgZXJyOiAnLCBnemVycm9yKHpmaWxlLCBlcnIpKTsKLSAgICBIYWx0KDEpOwotICBlbmQ7Ci0gIHskRU5ESUZ9Ci0gIGd6c2Vlayh6ZmlsZSwgMSwgU0VFS19DVVIpOyAoKiBhZGQgb25lIHplcm8gYnl0ZSAqKQotICBnemNsb3NlKHpmaWxlKTsKLQotICB6ZmlsZSA6PSBnem9wZW4oZm5hbWUsICdyYicpOwotICBpZiB6ZmlsZSA9IE5JTCB0aGVuCi0gIGJlZ2luCi0gICAgV3JpdGVMbignZ3pvcGVuIGVycm9yJyk7Ci0gICAgSGFsdCgxKTsKLSAgZW5kOwotCi0gIFN0ckNvcHkoUENoYXIodW5jb21wciksICdnYXJiYWdlJyk7Ci0KLSAgaWYgZ3pyZWFkKHpmaWxlLCB1bmNvbXByLCB1bmNvbXByTGVuKSA8PiBsZW4gdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2d6cmVhZCBlcnI6ICcsIGd6ZXJyb3IoemZpbGUsIGVycikpOwotICAgIEhhbHQoMSk7Ci0gIGVuZDsKLSAgaWYgU3RyQ29tcChQQ2hhcih1bmNvbXByKSwgaGVsbG8pIDw+IDAgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2JhZCBnenJlYWQ6ICcsIFBDaGFyKHVuY29tcHIpKTsKLSAgICBIYWx0KDEpOwotICBlbmQKLSAgZWxzZQotICAgIFdyaXRlTG4oJ2d6cmVhZCgpOiAnLCBQQ2hhcih1bmNvbXByKSk7Ci0KLSAgcG9zIDo9IGd6c2Vlayh6ZmlsZSwgLTgsIFNFRUtfQ1VSKTsKLSAgaWYgKHBvcyA8PiA2KSBvciAoZ3p0ZWxsKHpmaWxlKSA8PiBwb3MpIHRoZW4KLSAgYmVnaW4KLSAgICBXcml0ZUxuKCdnenNlZWsgZXJyb3IsIHBvcz0nLCBwb3MsICcsIGd6dGVsbD0nLCBnenRlbGwoemZpbGUpKTsKLSAgICBIYWx0KDEpOwotICBlbmQ7Ci0KLSAgaWYgZ3pnZXRjKHpmaWxlKSA8PiAnICcgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2d6Z2V0YyBlcnJvcicpOwotICAgIEhhbHQoMSk7Ci0gIGVuZDsKLQotICBpZiBnenVuZ2V0YygnICcsIHpmaWxlKSA8PiAnICcgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2d6dW5nZXRjIGVycm9yJyk7Ci0gICAgSGFsdCgxKTsKLSAgZW5kOwotCi0gIGd6Z2V0cyh6ZmlsZSwgUENoYXIodW5jb21wciksIHVuY29tcHJMZW4pOwotICB1bmNvbXByTGVuIDo9IFN0ckxlbihQQ2hhcih1bmNvbXByKSk7Ci0gIGlmIHVuY29tcHJMZW4gPD4gNyB0aGVuICgqICIgaGVsbG8hIiAqKQotICBiZWdpbgotICAgIFdyaXRlTG4oJ2d6Z2V0cyBlcnIgYWZ0ZXIgZ3pzZWVrOiAnLCBnemVycm9yKHpmaWxlLCBlcnIpKTsKLSAgICBIYWx0KDEpOwotICBlbmQ7Ci0gIGlmIFN0ckNvbXAoUENoYXIodW5jb21wciksIGhlbGxvICsgNikgPD4gMCB0aGVuCi0gIGJlZ2luCi0gICAgV3JpdGVMbignYmFkIGd6Z2V0cyBhZnRlciBnenNlZWsnKTsKLSAgICBIYWx0KDEpOwotICBlbmQKLSAgZWxzZQotICAgIFdyaXRlTG4oJ2d6Z2V0cygpIGFmdGVyIGd6c2VlazogJywgUENoYXIodW5jb21wcikpOwotCi0gIGd6Y2xvc2UoemZpbGUpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGRlZmxhdGUgd2l0aCBzbWFsbCBidWZmZXJzCi0gKikKLXskSUZERUYgVEVTVF9ERUZMQVRFfQotcHJvY2VkdXJlIHRlc3RfZGVmbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQpOwotdmFyIGNfc3RyZWFtOiB6X3N0cmVhbTsgKCogY29tcHJlc3Npb24gc3RyZWFtICopCi0gICAgZXJyOiBJbnRlZ2VyOwotICAgIGxlbjogTG9uZ0ludDsKLWJlZ2luCi0gIGxlbiA6PSBTdHJMZW4oaGVsbG8pKzE7Ci0KLSAgY19zdHJlYW0uemFsbG9jIDo9IE5JTDsKLSAgY19zdHJlYW0uemZyZWUgOj0gTklMOwotICBjX3N0cmVhbS5vcGFxdWUgOj0gTklMOwotCi0gIGVyciA6PSBkZWZsYXRlSW5pdChjX3N0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKLSAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVJbml0Jyk7Ci0KLSAgY19zdHJlYW0ubmV4dF9pbiA6PSBoZWxsbzsKLSAgY19zdHJlYW0ubmV4dF9vdXQgOj0gY29tcHI7Ci0KLSAgd2hpbGUgKGNfc3RyZWFtLnRvdGFsX2luIDw+IGxlbikgYW5kCi0gICAgICAgIChjX3N0cmVhbS50b3RhbF9vdXQgPCBjb21wckxlbikgZG8KLSAgYmVnaW4KLSAgICBjX3N0cmVhbS5hdmFpbF9vdXQgOj0gMTsgeyBmb3JjZSBzbWFsbCBidWZmZXJzIH0KLSAgICBjX3N0cmVhbS5hdmFpbF9pbiA6PSAxOwotICAgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOwotICBlbmQ7Ci0KLSAgKCogRmluaXNoIHRoZSBzdHJlYW0sIHN0aWxsIGZvcmNpbmcgc21hbGwgYnVmZmVyczogKikKLSAgd2hpbGUgVFJVRSBkbwotICBiZWdpbgotICAgIGNfc3RyZWFtLmF2YWlsX291dCA6PSAxOwotICAgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gICAgaWYgZXJyID0gWl9TVFJFQU1fRU5EIHRoZW4KLSAgICAgIGJyZWFrOwotICAgIENIRUNLX0VSUihlcnIsICdkZWZsYXRlJyk7Ci0gIGVuZDsKLQotICBlcnIgOj0gZGVmbGF0ZUVuZChjX3N0cmVhbSk7Ci0gIENIRUNLX0VSUihlcnIsICdkZWZsYXRlRW5kJyk7Ci1lbmQ7Ci17JEVORElGfQotCi0oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgaW5mbGF0ZSB3aXRoIHNtYWxsIGJ1ZmZlcnMKLSAqKQoteyRJRkRFRiBURVNUX0lORkxBVEV9Ci1wcm9jZWR1cmUgdGVzdF9pbmZsYXRlKGNvbXByOiBQb2ludGVyOyBjb21wckxlbiA6IExvbmdJbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7IHVuY29tcHJMZW4gOiBMb25nSW50KTsKLXZhciBlcnI6IEludGVnZXI7Ci0gICAgZF9zdHJlYW06IHpfc3RyZWFtOyAoKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqKQotYmVnaW4KLSAgU3RyQ29weShQQ2hhcih1bmNvbXByKSwgJ2dhcmJhZ2UnKTsKLQotICBkX3N0cmVhbS56YWxsb2MgOj0gTklMOwotICBkX3N0cmVhbS56ZnJlZSA6PSBOSUw7Ci0gIGRfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7Ci0KLSAgZF9zdHJlYW0ubmV4dF9pbiA6PSBjb21wcjsKLSAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gMDsKLSAgZF9zdHJlYW0ubmV4dF9vdXQgOj0gdW5jb21wcjsKLQotICBlcnIgOj0gaW5mbGF0ZUluaXQoZF9zdHJlYW0pOwotICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUluaXQnKTsKLQotICB3aGlsZSAoZF9zdHJlYW0udG90YWxfb3V0IDwgdW5jb21wckxlbikgYW5kCi0gICAgICAgIChkX3N0cmVhbS50b3RhbF9pbiA8IGNvbXByTGVuKSBkbwotICBiZWdpbgotICAgIGRfc3RyZWFtLmF2YWlsX291dCA6PSAxOyAoKiBmb3JjZSBzbWFsbCBidWZmZXJzICopCi0gICAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gMTsKLSAgICBlcnIgOj0gaW5mbGF0ZShkX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgaWYgZXJyID0gWl9TVFJFQU1fRU5EIHRoZW4KLSAgICAgIGJyZWFrOwotICAgIENIRUNLX0VSUihlcnIsICdpbmZsYXRlJyk7Ci0gIGVuZDsKLQotICBlcnIgOj0gaW5mbGF0ZUVuZChkX3N0cmVhbSk7Ci0gIENIRUNLX0VSUihlcnIsICdpbmZsYXRlRW5kJyk7Ci0KLSAgaWYgU3RyQ29tcChQQ2hhcih1bmNvbXByKSwgaGVsbG8pIDw+IDAgdGhlbgotICAgIEVYSVRfRVJSKCdiYWQgaW5mbGF0ZScpCi0gIGVsc2UKLSAgICBXcml0ZUxuKCdpbmZsYXRlKCk6ICcsIFBDaGFyKHVuY29tcHIpKTsKLWVuZDsKLXskRU5ESUZ9Ci0KLSgqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBkZWZsYXRlIHdpdGggbGFyZ2UgYnVmZmVycyBhbmQgZHluYW1pYyBjaGFuZ2Ugb2YgY29tcHJlc3Npb24gbGV2ZWwKLSAqKQoteyRJRkRFRiBURVNUX0RFRkxBVEV9Ci1wcm9jZWR1cmUgdGVzdF9sYXJnZV9kZWZsYXRlKGNvbXByOiBQb2ludGVyOyBjb21wckxlbjogTG9uZ0ludDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcjogUG9pbnRlcjsgdW5jb21wckxlbjogTG9uZ0ludCk7Ci12YXIgY19zdHJlYW06IHpfc3RyZWFtOyAoKiBjb21wcmVzc2lvbiBzdHJlYW0gKikKLSAgICBlcnI6IEludGVnZXI7Ci1iZWdpbgotICBjX3N0cmVhbS56YWxsb2MgOj0gTklMOwotICBjX3N0cmVhbS56ZnJlZSA6PSBOSUw7Ci0gIGNfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7Ci0KLSAgZXJyIDo9IGRlZmxhdGVJbml0KGNfc3RyZWFtLCBaX0JFU1RfU1BFRUQpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUluaXQnKTsKLQotICBjX3N0cmVhbS5uZXh0X291dCA6PSBjb21wcjsKLSAgY19zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIoY29tcHJMZW4pOwotCi0gICgqIEF0IHRoaXMgcG9pbnQsIHVuY29tcHIgaXMgc3RpbGwgbW9zdGx5IHplcm9lcywgc28gaXQgc2hvdWxkIGNvbXByZXNzCi0gICAqIHZlcnkgd2VsbDoKLSAgICopCi0gIGNfc3RyZWFtLm5leHRfaW4gOj0gdW5jb21wcjsKLSAgY19zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcih1bmNvbXByTGVuKTsKLSAgZXJyIDo9IGRlZmxhdGUoY19zdHJlYW0sIFpfTk9fRkxVU0gpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOwotICBpZiBjX3N0cmVhbS5hdmFpbF9pbiA8PiAwIHRoZW4KLSAgICBFWElUX0VSUignZGVmbGF0ZSBub3QgZ3JlZWR5Jyk7Ci0KLSAgKCogRmVlZCBpbiBhbHJlYWR5IGNvbXByZXNzZWQgZGF0YSBhbmQgc3dpdGNoIHRvIG5vIGNvbXByZXNzaW9uOiAqKQotICBkZWZsYXRlUGFyYW1zKGNfc3RyZWFtLCBaX05PX0NPTVBSRVNTSU9OLCBaX0RFRkFVTFRfU1RSQVRFR1kpOwotICBjX3N0cmVhbS5uZXh0X2luIDo9IGNvbXByOwotICBjX3N0cmVhbS5hdmFpbF9pbiA6PSBJbnRlZ2VyKGNvbXByTGVuIGRpdiAyKTsKLSAgZXJyIDo9IGRlZmxhdGUoY19zdHJlYW0sIFpfTk9fRkxVU0gpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOwotCi0gICgqIFN3aXRjaCBiYWNrIHRvIGNvbXByZXNzaW5nIG1vZGU6ICopCi0gIGRlZmxhdGVQYXJhbXMoY19zdHJlYW0sIFpfQkVTVF9DT01QUkVTU0lPTiwgWl9GSUxURVJFRCk7Ci0gIGNfc3RyZWFtLm5leHRfaW4gOj0gdW5jb21wcjsKLSAgY19zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcih1bmNvbXByTGVuKTsKLSAgZXJyIDo9IGRlZmxhdGUoY19zdHJlYW0sIFpfTk9fRkxVU0gpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOwotCi0gIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gIGlmIGVyciA8PiBaX1NUUkVBTV9FTkQgdGhlbgotICAgIEVYSVRfRVJSKCdkZWZsYXRlIHNob3VsZCByZXBvcnQgWl9TVFJFQU1fRU5EJyk7Ci0KLSAgZXJyIDo9IGRlZmxhdGVFbmQoY19zdHJlYW0pOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUVuZCcpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGluZmxhdGUgd2l0aCBsYXJnZSBidWZmZXJzCi0gKikKLXskSUZERUYgVEVTVF9JTkZMQVRFfQotcHJvY2VkdXJlIHRlc3RfbGFyZ2VfaW5mbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7IHVuY29tcHJMZW46IExvbmdJbnQpOwotdmFyIGVycjogSW50ZWdlcjsKLSAgICBkX3N0cmVhbTogel9zdHJlYW07ICgqIGRlY29tcHJlc3Npb24gc3RyZWFtICopCi1iZWdpbgotICBTdHJDb3B5KFBDaGFyKHVuY29tcHIpLCAnZ2FyYmFnZScpOwotCi0gIGRfc3RyZWFtLnphbGxvYyA6PSBOSUw7Ci0gIGRfc3RyZWFtLnpmcmVlIDo9IE5JTDsKLSAgZF9zdHJlYW0ub3BhcXVlIDo9IE5JTDsKLQotICBkX3N0cmVhbS5uZXh0X2luIDo9IGNvbXByOwotICBkX3N0cmVhbS5hdmFpbF9pbiA6PSBJbnRlZ2VyKGNvbXByTGVuKTsKLQotICBlcnIgOj0gaW5mbGF0ZUluaXQoZF9zdHJlYW0pOwotICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUluaXQnKTsKLQotICB3aGlsZSBUUlVFIGRvCi0gIGJlZ2luCi0gICAgZF9zdHJlYW0ubmV4dF9vdXQgOj0gdW5jb21wcjsgICAgICAgICAgICAoKiBkaXNjYXJkIHRoZSBvdXRwdXQgKikKLSAgICBkX3N0cmVhbS5hdmFpbF9vdXQgOj0gSW50ZWdlcih1bmNvbXByTGVuKTsKLSAgICBlcnIgOj0gaW5mbGF0ZShkX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgaWYgZXJyID0gWl9TVFJFQU1fRU5EIHRoZW4KLSAgICAgIGJyZWFrOwotICAgIENIRUNLX0VSUihlcnIsICdsYXJnZSBpbmZsYXRlJyk7Ci0gIGVuZDsKLQotICBlcnIgOj0gaW5mbGF0ZUVuZChkX3N0cmVhbSk7Ci0gIENIRUNLX0VSUihlcnIsICdpbmZsYXRlRW5kJyk7Ci0KLSAgaWYgZF9zdHJlYW0udG90YWxfb3V0IDw+IDIgKiB1bmNvbXByTGVuICsgY29tcHJMZW4gZGl2IDIgdGhlbgotICBiZWdpbgotICAgIFdyaXRlTG4oJ2JhZCBsYXJnZSBpbmZsYXRlOiAnLCBkX3N0cmVhbS50b3RhbF9vdXQpOwotICAgIEhhbHQoMSk7Ci0gIGVuZAotICBlbHNlCi0gICAgV3JpdGVMbignbGFyZ2VfaW5mbGF0ZSgpOiBPSycpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGRlZmxhdGUgd2l0aCBmdWxsIGZsdXNoCi0gKikKLXskSUZERUYgVEVTVF9GTFVTSH0KLXByb2NlZHVyZSB0ZXN0X2ZsdXNoKGNvbXByOiBQb2ludGVyOyB2YXIgY29tcHJMZW4gOiBMb25nSW50KTsKLXZhciBjX3N0cmVhbTogel9zdHJlYW07ICgqIGNvbXByZXNzaW9uIHN0cmVhbSAqKQotICAgIGVycjogSW50ZWdlcjsKLSAgICBsZW46IEludGVnZXI7Ci1iZWdpbgotICBsZW4gOj0gU3RyTGVuKGhlbGxvKSsxOwotCi0gIGNfc3RyZWFtLnphbGxvYyA6PSBOSUw7Ci0gIGNfc3RyZWFtLnpmcmVlIDo9IE5JTDsKLSAgY19zdHJlYW0ub3BhcXVlIDo9IE5JTDsKLQotICBlcnIgOj0gZGVmbGF0ZUluaXQoY19zdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7Ci0gIENIRUNLX0VSUihlcnIsICdkZWZsYXRlSW5pdCcpOwotCi0gIGNfc3RyZWFtLm5leHRfaW4gOj0gaGVsbG87Ci0gIGNfc3RyZWFtLm5leHRfb3V0IDo9IGNvbXByOwotICBjX3N0cmVhbS5hdmFpbF9pbiA6PSAzOwotICBjX3N0cmVhbS5hdmFpbF9vdXQgOj0gSW50ZWdlcihjb21wckxlbik7Ci0gIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX0ZVTExfRkxVU0gpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOwotCi0gIEluYyhQQnl0ZUFycmF5KGNvbXByKV5bM10pOyAoKiBmb3JjZSBhbiBlcnJvciBpbiBmaXJzdCBjb21wcmVzc2VkIGJsb2NrICopCi0gIGNfc3RyZWFtLmF2YWlsX2luIDo9IGxlbiAtIDM7Ci0KLSAgZXJyIDo9IGRlZmxhdGUoY19zdHJlYW0sIFpfRklOSVNIKTsKLSAgaWYgZXJyIDw+IFpfU1RSRUFNX0VORCB0aGVuCi0gICAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKLQotICBlcnIgOj0gZGVmbGF0ZUVuZChjX3N0cmVhbSk7Ci0gIENIRUNLX0VSUihlcnIsICdkZWZsYXRlRW5kJyk7Ci0KLSAgY29tcHJMZW4gOj0gY19zdHJlYW0udG90YWxfb3V0OwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGluZmxhdGVTeW5jKCkKLSAqKQoteyRJRkRFRiBURVNUX1NZTkN9Ci1wcm9jZWR1cmUgdGVzdF9zeW5jKGNvbXByOiBQb2ludGVyOyBjb21wckxlbjogTG9uZ0ludDsKLSAgICAgICAgICAgICAgICAgICAgdW5jb21wcjogUG9pbnRlcjsgdW5jb21wckxlbiA6IExvbmdJbnQpOwotdmFyIGVycjogSW50ZWdlcjsKLSAgICBkX3N0cmVhbTogel9zdHJlYW07ICgqIGRlY29tcHJlc3Npb24gc3RyZWFtICopCi1iZWdpbgotICBTdHJDb3B5KFBDaGFyKHVuY29tcHIpLCAnZ2FyYmFnZScpOwotCi0gIGRfc3RyZWFtLnphbGxvYyA6PSBOSUw7Ci0gIGRfc3RyZWFtLnpmcmVlIDo9IE5JTDsKLSAgZF9zdHJlYW0ub3BhcXVlIDo9IE5JTDsKLQotICBkX3N0cmVhbS5uZXh0X2luIDo9IGNvbXByOwotICBkX3N0cmVhbS5hdmFpbF9pbiA6PSAyOyAoKiBqdXN0IHJlYWQgdGhlIHpsaWIgaGVhZGVyICopCi0KLSAgZXJyIDo9IGluZmxhdGVJbml0KGRfc3RyZWFtKTsKLSAgQ0hFQ0tfRVJSKGVyciwgJ2luZmxhdGVJbml0Jyk7Ci0KLSAgZF9zdHJlYW0ubmV4dF9vdXQgOj0gdW5jb21wcjsKLSAgZF9zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIodW5jb21wckxlbik7Ci0KLSAgaW5mbGF0ZShkX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gIENIRUNLX0VSUihlcnIsICdpbmZsYXRlJyk7Ci0KLSAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcihjb21wckxlbi0yKTsgICAoKiByZWFkIGFsbCBjb21wcmVzc2VkIGRhdGEgKikKLSAgZXJyIDo9IGluZmxhdGVTeW5jKGRfc3RyZWFtKTsgICAgICAgICAgICAgICAoKiBidXQgc2tpcCB0aGUgZGFtYWdlZCBwYXJ0ICopCi0gIENIRUNLX0VSUihlcnIsICdpbmZsYXRlU3luYycpOwotCi0gIGVyciA6PSBpbmZsYXRlKGRfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gIGlmIGVyciA8PiBaX0RBVEFfRVJST1IgdGhlbgotICAgIEVYSVRfRVJSKCdpbmZsYXRlIHNob3VsZCByZXBvcnQgREFUQV9FUlJPUicpOwotICAgICgqIEJlY2F1c2Ugb2YgaW5jb3JyZWN0IGFkbGVyMzIgKikKLQotICBlcnIgOj0gaW5mbGF0ZUVuZChkX3N0cmVhbSk7Ci0gIENIRUNLX0VSUihlcnIsICdpbmZsYXRlRW5kJyk7Ci0KLSAgV3JpdGVMbignYWZ0ZXIgaW5mbGF0ZVN5bmMoKTogaGVsJywgUENoYXIodW5jb21wcikpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGRlZmxhdGUgd2l0aCBwcmVzZXQgZGljdGlvbmFyeQotICopCi17JElGREVGIFRFU1RfRElDVH0KLXByb2NlZHVyZSB0ZXN0X2RpY3RfZGVmbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQpOwotdmFyIGNfc3RyZWFtOiB6X3N0cmVhbTsgKCogY29tcHJlc3Npb24gc3RyZWFtICopCi0gICAgZXJyOiBJbnRlZ2VyOwotYmVnaW4KLSAgY19zdHJlYW0uemFsbG9jIDo9IE5JTDsKLSAgY19zdHJlYW0uemZyZWUgOj0gTklMOwotICBjX3N0cmVhbS5vcGFxdWUgOj0gTklMOwotCi0gIGVyciA6PSBkZWZsYXRlSW5pdChjX3N0cmVhbSwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKLSAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVJbml0Jyk7Ci0KLSAgZXJyIDo9IGRlZmxhdGVTZXREaWN0aW9uYXJ5KGNfc3RyZWFtLCBkaWN0aW9uYXJ5LCBTdHJMZW4oZGljdGlvbmFyeSkpOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZVNldERpY3Rpb25hcnknKTsKLQotICBkaWN0SWQgOj0gY19zdHJlYW0uYWRsZXI7Ci0gIGNfc3RyZWFtLm5leHRfb3V0IDo9IGNvbXByOwotICBjX3N0cmVhbS5hdmFpbF9vdXQgOj0gSW50ZWdlcihjb21wckxlbik7Ci0KLSAgY19zdHJlYW0ubmV4dF9pbiA6PSBoZWxsbzsKLSAgY19zdHJlYW0uYXZhaWxfaW4gOj0gU3RyTGVuKGhlbGxvKSsxOwotCi0gIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gIGlmIGVyciA8PiBaX1NUUkVBTV9FTkQgdGhlbgotICAgIEVYSVRfRVJSKCdkZWZsYXRlIHNob3VsZCByZXBvcnQgWl9TVFJFQU1fRU5EJyk7Ci0KLSAgZXJyIDo9IGRlZmxhdGVFbmQoY19zdHJlYW0pOwotICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUVuZCcpOwotZW5kOwoteyRFTkRJRn0KLQotKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGluZmxhdGUgd2l0aCBhIHByZXNldCBkaWN0aW9uYXJ5Ci0gKikKLXskSUZERUYgVEVTVF9ESUNUfQotcHJvY2VkdXJlIHRlc3RfZGljdF9pbmZsYXRlKGNvbXByOiBQb2ludGVyOyBjb21wckxlbjogTG9uZ0ludDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByOiBQb2ludGVyOyB1bmNvbXByTGVuOiBMb25nSW50KTsKLXZhciBlcnI6IEludGVnZXI7Ci0gICAgZF9zdHJlYW06IHpfc3RyZWFtOyAoKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqKQotYmVnaW4KLSAgU3RyQ29weShQQ2hhcih1bmNvbXByKSwgJ2dhcmJhZ2UnKTsKLQotICBkX3N0cmVhbS56YWxsb2MgOj0gTklMOwotICBkX3N0cmVhbS56ZnJlZSA6PSBOSUw7Ci0gIGRfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7Ci0KLSAgZF9zdHJlYW0ubmV4dF9pbiA6PSBjb21wcjsKLSAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcihjb21wckxlbik7Ci0KLSAgZXJyIDo9IGluZmxhdGVJbml0KGRfc3RyZWFtKTsKLSAgQ0hFQ0tfRVJSKGVyciwgJ2luZmxhdGVJbml0Jyk7Ci0KLSAgZF9zdHJlYW0ubmV4dF9vdXQgOj0gdW5jb21wcjsKLSAgZF9zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIodW5jb21wckxlbik7Ci0KLSAgd2hpbGUgVFJVRSBkbwotICBiZWdpbgotICAgIGVyciA6PSBpbmZsYXRlKGRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICBpZiBlcnIgPSBaX1NUUkVBTV9FTkQgdGhlbgotICAgICAgYnJlYWs7Ci0gICAgaWYgZXJyID0gWl9ORUVEX0RJQ1QgdGhlbgotICAgIGJlZ2luCi0gICAgICBpZiBkX3N0cmVhbS5hZGxlciA8PiBkaWN0SWQgdGhlbgotICAgICAgICBFWElUX0VSUigndW5leHBlY3RlZCBkaWN0aW9uYXJ5Jyk7Ci0gICAgICBlcnIgOj0gaW5mbGF0ZVNldERpY3Rpb25hcnkoZF9zdHJlYW0sIGRpY3Rpb25hcnksIFN0ckxlbihkaWN0aW9uYXJ5KSk7Ci0gICAgZW5kOwotICAgIENIRUNLX0VSUihlcnIsICdpbmZsYXRlIHdpdGggZGljdCcpOwotICBlbmQ7Ci0KLSAgZXJyIDo9IGluZmxhdGVFbmQoZF9zdHJlYW0pOwotICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUVuZCcpOwotCi0gIGlmIFN0ckNvbXAoUENoYXIodW5jb21wciksIGhlbGxvKSA8PiAwIHRoZW4KLSAgICBFWElUX0VSUignYmFkIGluZmxhdGUgd2l0aCBkaWN0JykKLSAgZWxzZQotICAgIFdyaXRlTG4oJ2luZmxhdGUgd2l0aCBkaWN0aW9uYXJ5OiAnLCBQQ2hhcih1bmNvbXByKSk7Ci1lbmQ7Ci17JEVORElGfQotCi12YXIgY29tcHIsIHVuY29tcHI6IFBvaW50ZXI7Ci0gICAgY29tcHJMZW4sIHVuY29tcHJMZW46IExvbmdJbnQ7Ci0KLWJlZ2luCi0gIGlmIHpsaWJWZXJzaW9uXiA8PiBaTElCX1ZFUlNJT05bMV0gdGhlbgotICAgIEVYSVRfRVJSKCdJbmNvbXBhdGlibGUgemxpYiB2ZXJzaW9uJyk7Ci0KLSAgV3JpdGVMbignemxpYiB2ZXJzaW9uOiAnLCB6bGliVmVyc2lvbik7Ci0gIFdyaXRlTG4oJ3psaWIgY29tcGlsZSBmbGFnczogJywgRm9ybWF0KCcweCV4JywgW3psaWJDb21waWxlRmxhZ3NdKSk7Ci0KLSAgY29tcHJMZW4gOj0gMTAwMDAgKiBTaXplT2YoSW50ZWdlcik7ICgqIGRvbid0IG92ZXJmbG93IG9uIE1TRE9TICopCi0gIHVuY29tcHJMZW4gOj0gY29tcHJMZW47Ci0gIEdldE1lbShjb21wciwgY29tcHJMZW4pOwotICBHZXRNZW0odW5jb21wciwgdW5jb21wckxlbik7Ci0gIGlmIChjb21wciA9IE5JTCkgb3IgKHVuY29tcHIgPSBOSUwpIHRoZW4KLSAgICBFWElUX0VSUignT3V0IG9mIG1lbW9yeScpOwotICAoKiBjb21wciBhbmQgdW5jb21wciBhcmUgY2xlYXJlZCB0byBhdm9pZCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQKLSAgICogZGF0YSBhbmQgdG8gZW5zdXJlIHRoYXQgdW5jb21wciBjb21wcmVzc2VzIHdlbGwuCi0gICAqKQotICBGaWxsQ2hhcihjb21wcl4sIGNvbXByTGVuLCAwKTsKLSAgRmlsbENoYXIodW5jb21wcl4sIHVuY29tcHJMZW4sIDApOwotCi0gIHskSUZERUYgVEVTVF9DT01QUkVTU30KLSAgV3JpdGVMbignKiogVGVzdGluZyBjb21wcmVzcycpOwotICB0ZXN0X2NvbXByZXNzKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7Ci0gIHskRU5ESUZ9Ci0KLSAgeyRJRkRFRiBURVNUX0daSU99Ci0gIFdyaXRlTG4oJyoqIFRlc3RpbmcgZ3ppbycpOwotICBpZiBQYXJhbUNvdW50ID49IDEgdGhlbgotICAgIHRlc3RfZ3ppbyhQYXJhbVN0cigxKSwgdW5jb21wciwgdW5jb21wckxlbikKLSAgZWxzZQotICAgIHRlc3RfZ3ppbyhURVNURklMRSwgdW5jb21wciwgdW5jb21wckxlbik7Ci0gIHskRU5ESUZ9Ci0KLSAgeyRJRkRFRiBURVNUX0RFRkxBVEV9Ci0gIFdyaXRlTG4oJyoqIFRlc3RpbmcgZGVmbGF0ZSB3aXRoIHNtYWxsIGJ1ZmZlcnMnKTsKLSAgdGVzdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbik7Ci0gIHskRU5ESUZ9Ci0gIHskSUZERUYgVEVTVF9JTkZMQVRFfQotICBXcml0ZUxuKCcqKiBUZXN0aW5nIGluZmxhdGUgd2l0aCBzbWFsbCBidWZmZXJzJyk7Ci0gIHRlc3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwotICB7JEVORElGfQotCi0gIHskSUZERUYgVEVTVF9ERUZMQVRFfQotICBXcml0ZUxuKCcqKiBUZXN0aW5nIGRlZmxhdGUgd2l0aCBsYXJnZSBidWZmZXJzJyk7Ci0gIHRlc3RfbGFyZ2VfZGVmbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwotICB7JEVORElGfQotICB7JElGREVGIFRFU1RfSU5GTEFURX0KLSAgV3JpdGVMbignKiogVGVzdGluZyBpbmZsYXRlIHdpdGggbGFyZ2UgYnVmZmVycycpOwotICB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLSAgeyRFTkRJRn0KLQotICB7JElGREVGIFRFU1RfRkxVU0h9Ci0gIFdyaXRlTG4oJyoqIFRlc3RpbmcgZGVmbGF0ZSB3aXRoIGZ1bGwgZmx1c2gnKTsKLSAgdGVzdF9mbHVzaChjb21wciwgY29tcHJMZW4pOwotICB7JEVORElGfQotICB7JElGREVGIFRFU1RfU1lOQ30KLSAgV3JpdGVMbignKiogVGVzdGluZyBpbmZsYXRlU3luYycpOwotICB0ZXN0X3N5bmMoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLSAgeyRFTkRJRn0KLSAgY29tcHJMZW4gOj0gdW5jb21wckxlbjsKLQotICB7JElGREVGIFRFU1RfRElDVH0KLSAgV3JpdGVMbignKiogVGVzdGluZyBkZWZsYXRlIGFuZCBpbmZsYXRlIHdpdGggcHJlc2V0IGRpY3Rpb25hcnknKTsKLSAgdGVzdF9kaWN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKTsKLSAgdGVzdF9kaWN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLSAgeyRFTkRJRn0KLQotICBGcmVlTWVtKGNvbXByLCBjb21wckxlbik7Ci0gIEZyZWVNZW0odW5jb21wciwgdW5jb21wckxlbik7Ci1lbmQuCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9wYXNjYWwvcmVhZG1lLnR4dCBiL2xpYnMvemxpYi9jb250cmliL3Bhc2NhbC9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGU4N2M4Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL3Bhc2NhbC9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBhIFBhc2NhbCAoRGVscGhpLCBLeWxpeCkgaW50ZXJmYWNlIHRvIHRoZQotemxpYiBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCi0KLQotRGlyZWN0b3J5IGxpc3RpbmcKLT09PT09PT09PT09PT09PT09Ci0KLXpsaWJkMzIubWFrICAgICBtYWtlZmlsZSBmb3IgQm9ybGFuZCBDKysKLWV4YW1wbGUucGFzICAgICB1c2FnZSBleGFtcGxlIG9mIHpsaWIKLXpsaWJwYXMucGFzICAgICB0aGUgUGFzY2FsIGludGVyZmFjZSB0byB6bGliCi1yZWFkbWUudHh0ICAgICAgdGhpcyBmaWxlCi0KLQotQ29tcGF0aWJpbGl0eSBub3RlcwotPT09PT09PT09PT09PT09PT09PQotCi0tIEFsdGhvdWdoIHRoZSBuYW1lICJ6bGliIiB3b3VsZCBoYXZlIGJlZW4gbW9yZSBub3JtYWwgZm9yIHRoZQotICB6bGlicGFzIHVuaXQsIHRoaXMgbmFtZSBpcyBhbHJlYWR5IHRha2VuIGJ5IEJvcmxhbmQncyBaTGliIHVuaXQuCi0gIFRoaXMgaXMgc29tZWhvdyB1bmZvcnR1bmF0ZSwgYmVjYXVzZSB0aGF0IHVuaXQgaXMgbm90IGEgZ2VudWluZQotICBpbnRlcmZhY2UgdG8gdGhlIGZ1bGwtZmxlZGdlZCB6bGliIGZ1bmN0aW9uYWxpdHksIGJ1dCBhIHN1aXRlIG9mCi0gIGNsYXNzIHdyYXBwZXJzIGFyb3VuZCB6bGliIHN0cmVhbXMuICBPdGhlciBlc3NlbnRpYWwgZmVhdHVyZXMsCi0gIHN1Y2ggYXMgY2hlY2tzdW1zLCBhcmUgbWlzc2luZy4KLSAgSXQgd291bGQgaGF2ZSBiZWVuIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoYXQgdW5pdCB0byBoYXZlIGEgbmFtZQotICBsaWtlICJaU3RyZWFtcyIsIG9yIHNvbWV0aGluZyBzaW1pbGFyLgotCi0tIFRoZSBDIGFuZCB6bGliLXN1cHBsaWVkIHR5cGVzIGludCwgdUludCwgbG9uZywgdUxvbmcsIGV0Yy4gYXJlCi0gIHRyYW5zbGF0ZWQgZGlyZWN0bHkgaW50byBQYXNjYWwgdHlwZXMgb2Ygc2ltaWxhciBzaXplcyAoSW50ZWdlciwKLSAgTG9uZ0ludCwgZXRjLiksIHRvIGF2b2lkIG5hbWVzcGFjZSBwb2xsdXRpb24uICBJbiBwYXJ0aWN1bGFyLAotICB0aGVyZSBpcyBubyBjb252ZXJzaW9uIG9mIHVuc2lnbmVkIGludCBpbnRvIGEgUGFzY2FsIHVuc2lnbmVkCi0gIGludGVnZXIuICBUaGUgV29yZCB0eXBlIGlzIG5vbi1wb3J0YWJsZSBhbmQgaGFzIHRoZSBzYW1lIHNpemUKLSAgKDE2IGJpdHMpIGJvdGggaW4gYSAxNi1iaXQgYW5kIGluIGEgMzItYml0IGVudmlyb25tZW50LCB1bmxpa2UKLSAgSW50ZWdlci4gIEV2ZW4gaWYgdGhlcmUgaXMgYSAzMi1iaXQgQ2FyZGluYWwgdHlwZSwgdGhlcmUgaXMgbm8KLSAgcmVhbCBuZWVkIGZvciB1bnNpZ25lZCBpbnQgaW4gemxpYiB1bmRlciBhIDMyLWJpdCBlbnZpcm9ubWVudC4KLQotLSBFeGNlcHQgZm9yIHRoZSBjYWxsYmFja3MsIHRoZSB6bGliIGZ1bmN0aW9uIGludGVyZmFjZXMgYXJlCi0gIGFzc3VtaW5nIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbm9ybWFsbHkgdXNlZCBpbiBQYXNjYWwKLSAgKF9fcGFzY2FsIGZvciBET1MgYW5kIFdpbmRvd3MxNiwgX19mYXN0Y2FsbCBmb3IgV2luZG93czMyKS4KLSAgU2luY2UgdGhlIGNkZWNsIGtleXdvcmQgaXMgdXNlZCwgdGhlIG9sZCBUdXJibyBQYXNjYWwgZG9lcwotICBub3Qgd29yayB3aXRoIHRoaXMgaW50ZXJmYWNlLgotCi0tIFRoZSBneiogZnVuY3Rpb24gaW50ZXJmYWNlcyBhcmUgbm90IHRyYW5zbGF0ZWQsIHRvIGF2b2lkCi0gIGludGVyZmFjaW5nIHByb2JsZW1zIHdpdGggdGhlIEMgcnVudGltZSBsaWJyYXJ5LiAgQmVzaWRlcywKLSAgICBnenByaW50ZihnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0gIGNhbm5vdCBiZSB0cmFuc2xhdGVkIGludG8gUGFzY2FsLgotCi0KLUxlZ2FsIGlzc3VlcwotPT09PT09PT09PT09Ci0KLVRoZSB6bGlicGFzIGludGVyZmFjZSBpczoKLSAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlci4KLSAgQ29weXJpZ2h0IChDKSAxOTk4IGJ5IEJvYiBEZWxsYWNhLgotICBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgQ29zbWluIFRydXRhLgotCi1UaGUgZXhhbXBsZSBwcm9ncmFtIGlzOgotICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBieSBKZWFuLWxvdXAgR2FpbGx5LgotICBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSwyMDAwIGJ5IEphY3F1ZXMgTm9tc3NpIE56YWxpLgotICBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgQ29zbWluIFRydXRhLgotCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9wYXNjYWwvemxpYmQzMi5tYWsgYi9saWJzL3psaWIvY29udHJpYi9wYXNjYWwvemxpYmQzMi5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZmFmYTAuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvcGFzY2FsL3psaWJkMzIubWFrCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYgotIyBGb3IgdXNlIHdpdGggRGVscGhpIGFuZCBDKysgQnVpbGRlciB1bmRlciBXaW4zMgotIyBVcGRhdGVkIGZvciB6bGliIDEuMi54IGJ5IENvc21pbiBUcnV0YQotCi0jIC0tLS0tLS0tLS0tLSBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KLQotIyBUaGlzIHByb2plY3QgdXNlcyB0aGUgRGVscGhpIChmYXN0Y2FsbC9yZWdpc3RlcikgY2FsbGluZyBjb252ZW50aW9uOgotTE9DID0gLURaRVhQT1JUPV9fZmFzdGNhbGwgLURaRVhQT1JUVkE9X19jZGVjbAotCi1DQyA9IGJjYzMyCi1MRCA9IGJjYzMyCi1BUiA9IHRsaWIKLSMgZG8gbm90IHVzZSAiLXByIiBpbiBDRkxBR1MKLUNGTEFHUyA9IC1hIC1kIC1rLSAtTzIgJChMT0MpCi1MREZMQUdTID0KLQotCi0jIHZhcmlhYmxlcwotWkxJQl9MSUIgPSB6bGliLmxpYgotCi1PQkoxID0gYWRsZXIzMi5vYmogY29tcHJlc3Mub2JqIGNyYzMyLm9iaiBkZWZsYXRlLm9iaiBnemlvLm9iaiBpbmZiYWNrLm9iagotT0JKMiA9IGluZmZhc3Qub2JqIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiB0cmVlcy5vYmogdW5jb21wci5vYmogenV0aWwub2JqCi1PQkpQMSA9ICthZGxlcjMyLm9iaitjb21wcmVzcy5vYmorY3JjMzIub2JqK2RlZmxhdGUub2JqK2d6aW8ub2JqK2luZmJhY2sub2JqCi1PQkpQMiA9ICtpbmZmYXN0Lm9iaitpbmZsYXRlLm9iaitpbmZ0cmVlcy5vYmordHJlZXMub2JqK3VuY29tcHIub2JqK3p1dGlsLm9iagotCi0KLSMgdGFyZ2V0cwotYWxsOiAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotLmMub2JqOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWFkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKLQotY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCi0KLWNyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCi0KLWRlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZ3ppby5vYmo6IGd6aW8uYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWluZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmgKLQotaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmggaW5mZml4ZWQuaAotCi1pbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi0KLXRyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCi0KLXVuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKLQotenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZXhhbXBsZS5vYmo6IGV4YW1wbGUuYyB6bGliLmggemNvbmYuaAotCi1taW5pZ3ppcC5vYmo6IG1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKLQotCi0jIEZvciB0aGUgc2FrZSBvZiB0aGUgb2xkIEJvcmxhbmQgbWFrZSwKLSMgdGhlIGNvbW1hbmQgbGluZSBpcyBjdXQgdG8gZml0IGluIHRoZSBNUy1ET1MgMTI4IGJ5dGUgbGltaXQ6Ci0kKFpMSUJfTElCKTogJChPQkoxKSAkKE9CSjIpCi0JLWRlbCAkKFpMSUJfTElCKQotCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDEpCi0JJChBUikgJChaTElCX0xJQikgJChPQkpQMikKLQotCi0jIHRlc3RpbmcKLXRlc3Q6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCWV4YW1wbGUKLQllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZAotCi1leGFtcGxlLmV4ZTogZXhhbXBsZS5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCi0KLW1pbmlnemlwLmV4ZTogbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCi0JJChMRCkgJChMREZMQUdTKSBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKLQotCi0jIGNsZWFudXAKLWNsZWFuOgotCS1kZWwgKi5vYmoKLQktZGVsICouZXhlCi0JLWRlbCAqLmxpYgotCS1kZWwgKi50ZHMKLQktZGVsIHpsaWIuYmFrCi0JLWRlbCBmb28uZ3oKLQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzIGIvbGlicy96bGliL2NvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzY4NDhjLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL3Bhc2NhbC96bGlicGFzLnBhcworKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0oKiB6bGlicGFzIC0tIFBhc2NhbCBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzIENvc21pbiBUcnV0YS4KLSAqIERlcml2ZWQgZnJvbSBvcmlnaW5hbCBzb3VyY2VzIGJ5IEJvYiBEZWxsYWNhLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHJlYWRtZS50eHQKLSAqKQotCi11bml0IHpsaWJwYXM7Ci0KLWludGVyZmFjZQotCi1jb25zdAotICBaTElCX1ZFUlNJT04gPSAnMS4yLjMnOwotCi10eXBlCi0gIGFsbG9jX2Z1bmMgPSBmdW5jdGlvbihvcGFxdWU6IFBvaW50ZXI7IGl0ZW1zLCBzaXplOiBJbnRlZ2VyKTogUG9pbnRlcjsKLSAgICAgICAgICAgICAgICAgY2RlY2w7Ci0gIGZyZWVfZnVuYyAgPSBwcm9jZWR1cmUob3BhcXVlLCBhZGRyZXNzOiBQb2ludGVyKTsKLSAgICAgICAgICAgICAgICAgY2RlY2w7Ci0KLSAgaW5fZnVuYyAgICA9IGZ1bmN0aW9uKG9wYXF1ZTogUG9pbnRlcjsgdmFyIGJ1ZjogUEJ5dGUpOiBJbnRlZ2VyOwotICAgICAgICAgICAgICAgICBjZGVjbDsKLSAgb3V0X2Z1bmMgICA9IGZ1bmN0aW9uKG9wYXF1ZTogUG9pbnRlcjsgYnVmOiBQQnl0ZTsgc2l6ZTogSW50ZWdlcik6IEludGVnZXI7Ci0gICAgICAgICAgICAgICAgIGNkZWNsOwotCi0gIHpfc3RyZWFtcCA9IF56X3N0cmVhbTsKLSAgel9zdHJlYW0gPSBwYWNrZWQgcmVjb3JkCi0gICAgbmV4dF9pbjogUENoYXI7ICAgICAgICgqIG5leHQgaW5wdXQgYnl0ZSAqKQotICAgIGF2YWlsX2luOiBJbnRlZ2VyOyAgICAoKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4gKikKLSAgICB0b3RhbF9pbjogTG9uZ0ludDsgICAgKCogdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKikKLQotICAgIG5leHRfb3V0OiBQQ2hhcjsgICAgICAoKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKikKLSAgICBhdmFpbF9vdXQ6IEludGVnZXI7ICAgKCogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgbmV4dF9vdXQgKikKLSAgICB0b3RhbF9vdXQ6IExvbmdJbnQ7ICAgKCogdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqKQotCi0gICAgbXNnOiBQQ2hhcjsgICAgICAgICAgICgqIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqKQotICAgIHN0YXRlOiBQb2ludGVyOyAgICAgICAoKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKikKLQotICAgIHphbGxvYzogYWxsb2NfZnVuYzsgICAoKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqKQotICAgIHpmcmVlOiBmcmVlX2Z1bmM7ICAgICAoKiB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIHN0YXRlICopCi0gICAgb3BhcXVlOiBQb2ludGVyOyAgICAgICgqIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIHphbGxvYyBhbmQgemZyZWUgKikKLQotICAgIGRhdGFfdHlwZTogSW50ZWdlcjsgICAoKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGFzY2lpIG9yIGJpbmFyeSAqKQotICAgIGFkbGVyOiBMb25nSW50OyAgICAgICAoKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqKQotICAgIHJlc2VydmVkOiBMb25nSW50OyAgICAoKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqKQotICBlbmQ7Ci0KLSgqIGNvbnN0YW50cyAqKQotY29uc3QKLSAgWl9OT19GTFVTSCAgICAgID0gMDsKLSAgWl9QQVJUSUFMX0ZMVVNIID0gMTsKLSAgWl9TWU5DX0ZMVVNIICAgID0gMjsKLSAgWl9GVUxMX0ZMVVNIICAgID0gMzsKLSAgWl9GSU5JU0ggICAgICAgID0gNDsKLQotICBaX09LICAgICAgICAgICAgPSAgMDsKLSAgWl9TVFJFQU1fRU5EICAgID0gIDE7Ci0gIFpfTkVFRF9ESUNUICAgICA9ICAyOwotICBaX0VSUk5PICAgICAgICAgPSAtMTsKLSAgWl9TVFJFQU1fRVJST1IgID0gLTI7Ci0gIFpfREFUQV9FUlJPUiAgICA9IC0zOwotICBaX01FTV9FUlJPUiAgICAgPSAtNDsKLSAgWl9CVUZfRVJST1IgICAgID0gLTU7Ci0gIFpfVkVSU0lPTl9FUlJPUiA9IC02OwotCi0gIFpfTk9fQ09NUFJFU1NJT04gICAgICAgPSAgMDsKLSAgWl9CRVNUX1NQRUVEICAgICAgICAgICA9ICAxOwotICBaX0JFU1RfQ09NUFJFU1NJT04gICAgID0gIDk7Ci0gIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgPSAtMTsKLQotICBaX0ZJTFRFUkVEICAgICAgICAgICAgPSAxOwotICBaX0hVRkZNQU5fT05MWSAgICAgICAgPSAyOwotICBaX1JMRSAgICAgICAgICAgICAgICAgPSAzOwotICBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwOwotCi0gIFpfQklOQVJZICAgPSAwOwotICBaX0FTQ0lJICAgID0gMTsKLSAgWl9VTktOT1dOICA9IDI7Ci0KLSAgWl9ERUZMQVRFRCA9IDg7Ci0KLSgqIGJhc2ljIGZ1bmN0aW9ucyAqKQotZnVuY3Rpb24gemxpYlZlcnNpb246IFBDaGFyOwotZnVuY3Rpb24gZGVmbGF0ZUluaXQodmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbDogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBkZWZsYXRlKHZhciBzdHJtOiB6X3N0cmVhbTsgZmx1c2g6IEludGVnZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gZGVmbGF0ZUVuZCh2YXIgc3RybTogel9zdHJlYW0pOiBJbnRlZ2VyOwotZnVuY3Rpb24gaW5mbGF0ZUluaXQodmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGluZmxhdGUodmFyIHN0cm06IHpfc3RyZWFtOyBmbHVzaDogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlRW5kKHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7Ci0KLSgqIGFkdmFuY2VkIGZ1bmN0aW9ucyAqKQotZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHZhciBzdHJtOiB6X3N0cmVhbTsgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywKLSAgICAgICAgICAgICAgICAgICAgICBtZW1MZXZlbCwgc3RyYXRlZ3k6IEludGVnZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkodmFyIHN0cm06IHpfc3RyZWFtOyBjb25zdCBkaWN0aW9uYXJ5OiBQQ2hhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RMZW5ndGg6IEludGVnZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gZGVmbGF0ZUNvcHkodmFyIGRlc3QsIHNvdXJjZTogel9zdHJlYW0pOiBJbnRlZ2VyOwotZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7Ci1mdW5jdGlvbiBkZWZsYXRlUGFyYW1zKHZhciBzdHJtOiB6X3N0cmVhbTsgbGV2ZWwsIHN0cmF0ZWd5OiBJbnRlZ2VyKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGRlZmxhdGVCb3VuZCh2YXIgc3RybTogel9zdHJlYW07IHNvdXJjZUxlbjogTG9uZ0ludCk6IExvbmdJbnQ7Ci1mdW5jdGlvbiBkZWZsYXRlUHJpbWUodmFyIHN0cm06IHpfc3RyZWFtOyBiaXRzLCB2YWx1ZTogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlSW5pdDIodmFyIHN0cm06IHpfc3RyZWFtOyB3aW5kb3dCaXRzOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGluZmxhdGVTZXREaWN0aW9uYXJ5KHZhciBzdHJtOiB6X3N0cmVhbTsgY29uc3QgZGljdGlvbmFyeTogUENoYXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0TGVuZ3RoOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGluZmxhdGVTeW5jKHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlQ29weSh2YXIgZGVzdCwgc291cmNlOiB6X3N0cmVhbSk6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlUmVzZXQodmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGluZmxhdGVCYWNrSW5pdCh2YXIgc3RybTogel9zdHJlYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Qml0czogSW50ZWdlcjsgd2luZG93OiBQQ2hhcik6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlQmFjayh2YXIgc3RybTogel9zdHJlYW07IGluX2ZuOiBpbl9mdW5jOyBpbl9kZXNjOiBQb2ludGVyOwotICAgICAgICAgICAgICAgICAgICAgb3V0X2ZuOiBvdXRfZnVuYzsgb3V0X2Rlc2M6IFBvaW50ZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gaW5mbGF0ZUJhY2tFbmQodmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKLWZ1bmN0aW9uIHpsaWJDb21waWxlRmxhZ3M6IExvbmdJbnQ7Ci0KLSgqIHV0aWxpdHkgZnVuY3Rpb25zICopCi1mdW5jdGlvbiBjb21wcmVzcyhkZXN0OiBQQ2hhcjsgdmFyIGRlc3RMZW46IExvbmdJbnQ7Ci0gICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2U6IFBDaGFyOyBzb3VyY2VMZW46IExvbmdJbnQpOiBJbnRlZ2VyOwotZnVuY3Rpb24gY29tcHJlc3MyKGRlc3Q6IFBDaGFyOyB2YXIgZGVzdExlbjogTG9uZ0ludDsKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZTogUENoYXI7IHNvdXJjZUxlbjogTG9uZ0ludDsKLSAgICAgICAgICAgICAgICAgIGxldmVsOiBJbnRlZ2VyKTogSW50ZWdlcjsKLWZ1bmN0aW9uIGNvbXByZXNzQm91bmQoc291cmNlTGVuOiBMb25nSW50KTogTG9uZ0ludDsKLWZ1bmN0aW9uIHVuY29tcHJlc3MoZGVzdDogUENoYXI7IHZhciBkZXN0TGVuOiBMb25nSW50OwotICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2U6IFBDaGFyOyBzb3VyY2VMZW46IExvbmdJbnQpOiBJbnRlZ2VyOwotCi0oKiBjaGVja3N1bSBmdW5jdGlvbnMgKikKLWZ1bmN0aW9uIGFkbGVyMzIoYWRsZXI6IExvbmdJbnQ7IGNvbnN0IGJ1ZjogUENoYXI7IGxlbjogSW50ZWdlcik6IExvbmdJbnQ7Ci1mdW5jdGlvbiBjcmMzMihjcmM6IExvbmdJbnQ7IGNvbnN0IGJ1ZjogUENoYXI7IGxlbjogSW50ZWdlcik6IExvbmdJbnQ7Ci0KLSgqIHZhcmlvdXMgaGFja3MsIGRvbid0IGxvb2sgOikgKikKLWZ1bmN0aW9uIGRlZmxhdGVJbml0Xyh2YXIgc3RybTogel9zdHJlYW07IGxldmVsOiBJbnRlZ2VyOwotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb246IFBDaGFyOyBzdHJlYW1fc2l6ZTogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlSW5pdF8odmFyIHN0cm06IHpfc3RyZWFtOyBjb25zdCB2ZXJzaW9uOiBQQ2hhcjsKLSAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fc2l6ZTogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBkZWZsYXRlSW5pdDJfKHZhciBzdHJtOiB6X3N0cmVhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5OiBJbnRlZ2VyOwotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uOiBQQ2hhcjsgc3RyZWFtX3NpemU6IEludGVnZXIpOiBJbnRlZ2VyOwotZnVuY3Rpb24gaW5mbGF0ZUluaXQyXyh2YXIgc3RybTogel9zdHJlYW07IHdpbmRvd0JpdHM6IEludGVnZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb246IFBDaGFyOyBzdHJlYW1fc2l6ZTogSW50ZWdlcik6IEludGVnZXI7Ci1mdW5jdGlvbiBpbmZsYXRlQmFja0luaXRfKHZhciBzdHJtOiB6X3N0cmVhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Qml0czogSW50ZWdlcjsgd2luZG93OiBQQ2hhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogUENoYXI7IHN0cmVhbV9zaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsKLQotCi1pbXBsZW1lbnRhdGlvbgotCi17JEwgYWRsZXIzMi5vYmp9Ci17JEwgY29tcHJlc3Mub2JqfQoteyRMIGNyYzMyLm9ian0KLXskTCBkZWZsYXRlLm9ian0KLXskTCBpbmZiYWNrLm9ian0KLXskTCBpbmZmYXN0Lm9ian0KLXskTCBpbmZsYXRlLm9ian0KLXskTCBpbmZ0cmVlcy5vYmp9Ci17JEwgdHJlZXMub2JqfQoteyRMIHVuY29tcHIub2JqfQoteyRMIHp1dGlsLm9ian0KLQotZnVuY3Rpb24gYWRsZXIzMjsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBjb21wcmVzczsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBjb21wcmVzczI7IGV4dGVybmFsOwotZnVuY3Rpb24gY29tcHJlc3NCb3VuZDsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBjcmMzMjsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGRlZmxhdGVCb3VuZDsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlQ29weTsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlRW5kOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGRlZmxhdGVJbml0XzsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlSW5pdDJfOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGRlZmxhdGVQYXJhbXM7IGV4dGVybmFsOwotZnVuY3Rpb24gZGVmbGF0ZVByaW1lOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGRlZmxhdGVSZXNldDsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBkZWZsYXRlU2V0RGljdGlvbmFyeTsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGluZmxhdGVCYWNrOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGluZmxhdGVCYWNrRW5kOyBleHRlcm5hbDsKLWZ1bmN0aW9uIGluZmxhdGVCYWNrSW5pdF87IGV4dGVybmFsOwotZnVuY3Rpb24gaW5mbGF0ZUNvcHk7IGV4dGVybmFsOwotZnVuY3Rpb24gaW5mbGF0ZUVuZDsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlSW5pdF87IGV4dGVybmFsOwotZnVuY3Rpb24gaW5mbGF0ZUluaXQyXzsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiBpbmZsYXRlUmVzZXQ7IGV4dGVybmFsOwotZnVuY3Rpb24gaW5mbGF0ZVNldERpY3Rpb25hcnk7IGV4dGVybmFsOwotZnVuY3Rpb24gaW5mbGF0ZVN5bmM7IGV4dGVybmFsOwotZnVuY3Rpb24gdW5jb21wcmVzczsgZXh0ZXJuYWw7Ci1mdW5jdGlvbiB6bGliQ29tcGlsZUZsYWdzOyBleHRlcm5hbDsKLWZ1bmN0aW9uIHpsaWJWZXJzaW9uOyBleHRlcm5hbDsKLQotZnVuY3Rpb24gZGVmbGF0ZUluaXQodmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbDogSW50ZWdlcik6IEludGVnZXI7Ci1iZWdpbgotICBSZXN1bHQgOj0gZGVmbGF0ZUluaXRfKHN0cm0sIGxldmVsLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpOwotZW5kOwotCi1mdW5jdGlvbiBkZWZsYXRlSW5pdDIodmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneTogSW50ZWdlcik6IEludGVnZXI7Ci1iZWdpbgotICBSZXN1bHQgOj0gZGVmbGF0ZUluaXQyXyhzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSk7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIGluZmxhdGVJbml0KHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7Ci1iZWdpbgotICBSZXN1bHQgOj0gaW5mbGF0ZUluaXRfKHN0cm0sIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSk7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIGluZmxhdGVJbml0Mih2YXIgc3RybTogel9zdHJlYW07IHdpbmRvd0JpdHM6IEludGVnZXIpOiBJbnRlZ2VyOwotYmVnaW4KLSAgUmVzdWx0IDo9IGluZmxhdGVJbml0Ml8oc3RybSwgd2luZG93Qml0cywgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKTsKLWVuZDsKLQotZnVuY3Rpb24gaW5mbGF0ZUJhY2tJbml0KHZhciBzdHJtOiB6X3N0cmVhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzOiBJbnRlZ2VyOyB3aW5kb3c6IFBDaGFyKTogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBpbmZsYXRlQmFja0luaXRfKHN0cm0sIHdpbmRvd0JpdHMsIHdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKTsKLWVuZDsKLQotZnVuY3Rpb24gX21hbGxvYyhTaXplOiBJbnRlZ2VyKTogUG9pbnRlcjsgY2RlY2w7Ci1iZWdpbgotICBHZXRNZW0oUmVzdWx0LCBTaXplKTsKLWVuZDsKLQotcHJvY2VkdXJlIF9mcmVlKEJsb2NrOiBQb2ludGVyKTsgY2RlY2w7Ci1iZWdpbgotICBGcmVlTWVtKEJsb2NrKTsKLWVuZDsKLQotcHJvY2VkdXJlIF9tZW1zZXQoUDogUG9pbnRlcjsgQjogQnl0ZTsgY291bnQ6IEludGVnZXIpOyBjZGVjbDsKLWJlZ2luCi0gIEZpbGxDaGFyKFBeLCBjb3VudCwgQik7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBfbWVtY3B5KGRlc3QsIHNvdXJjZTogUG9pbnRlcjsgY291bnQ6IEludGVnZXIpOyBjZGVjbDsKLWJlZ2luCi0gIE1vdmUoc291cmNlXiwgZGVzdF4sIGNvdW50KTsKLWVuZDsKLQotZW5kLgpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvcHVmZi9SRUFETUUgYi9saWJzL3psaWIvY29udHJpYi9wdWZmL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjNGNiNS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9wdWZmL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLVB1ZmYgLS0gQSBTaW1wbGUgSW5mbGF0ZQotMyBNYXIgMjAwMwotTWFyayBBZGxlcgotbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQotCi1XaGF0IHRoaXMgaXMgLS0KLQotcHVmZi5jIHByb3ZpZGVzIHRoZSByb3V0aW5lIHB1ZmYoKSB0byBkZWNvbXByZXNzIHRoZSBkZWZsYXRlIGRhdGEgZm9ybWF0LiAgSXQKLWRvZXMgc28gbW9yZSBzbG93bHkgdGhhbiB6bGliLCBidXQgdGhlIGNvZGUgaXMgYWJvdXQgb25lLWZpZnRoIHRoZSBzaXplIG9mIHRoZQotaW5mbGF0ZSBjb2RlIGluIHpsaWIsIGFuZCB3cml0dGVuIHRvIGJlIHZlcnkgZWFzeSB0byByZWFkLgotCi1XaHkgSSB3cm90ZSB0aGlzIC0tCi0KLXB1ZmYuYyB3YXMgd3JpdHRlbiB0byBkb2N1bWVudCB0aGUgZGVmbGF0ZSBmb3JtYXQgdW5hbWJpZ3VvdXNseSwgYnkgdmlydHVlIG9mCi1iZWluZyB3b3JraW5nIEMgY29kZS4gIEl0IGlzIG1lYW50IHRvIHN1cHBsZW1lbnQgUkZDIDE5NTEsIHdoaWNoIGZvcm1hbGx5Ci1kZXNjcmliZXMgdGhlIGRlZmxhdGUgZm9ybWF0LiAgSSBoYXZlIHJlY2VpdmVkIG1hbnkgcXVlc3Rpb25zIG9uIGRldGFpbHMgb2YgdGhlCi1kZWZsYXRlIGZvcm1hdCwgYW5kIEkgaG9wZSB0aGF0IHJlYWRpbmcgdGhpcyBjb2RlIHdpbGwgYW5zd2VyIHRob3NlIHF1ZXN0aW9ucy4KLXB1ZmYuYyBpcyBoZWF2aWx5IGNvbW1lbnRlZCB3aXRoIGRldGFpbHMgb2YgdGhlIGRlZmxhdGUgZm9ybWF0LCBlc3BlY2lhbGx5Ci10aG9zZSBsaXR0bGUgbm9va3MgYW5kIGNyYW5pZXMgb2YgdGhlIGZvcm1hdCB0aGF0IG1pZ2h0IG5vdCBiZSBvYnZpb3VzIGZyb20gYQotc3BlY2lmaWNhdGlvbi4KLQotcHVmZi5jIG1heSBhbHNvIGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgd2hlcmUgY29kZSBzaXplIG9yIG1lbW9yeSB1c2FnZSBpcyBhCi12ZXJ5IGxpbWl0ZWQgcmVzb3VyY2UsIGFuZCBzcGVlZCBpcyBub3QgYXMgaW1wb3J0YW50LgotCi1Ib3cgdG8gdXNlIGl0IC0tCi0KLVdlbGwsIG1vc3QgbGlrZWx5IHlvdSBzaG91bGQganVzdCBiZSByZWFkaW5nIHB1ZmYuYyBhbmQgdXNpbmcgemxpYiBmb3IgYWN0dWFsCi1hcHBsaWNhdGlvbnMsIGJ1dCBpZiB5b3UgbXVzdCAuLi4KLQotSW5jbHVkZSBwdWZmLmggaW4geW91ciBjb2RlLCB3aGljaCBwcm92aWRlcyB0aGlzIHByb3RvdHlwZToKLQotaW50IHB1ZmYodW5zaWduZWQgY2hhciAqZGVzdCwgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcG9pbnRlciAqLwotICAgICAgICAgdW5zaWduZWQgbG9uZyAqZGVzdGxlbiwgICAgICAgIC8qIGFtb3VudCBvZiBvdXRwdXQgc3BhY2UgKi8KLSAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgICAgICAgICAvKiBwb2ludGVyIHRvIHNvdXJjZSBkYXRhIHBvaW50ZXIgKi8KLSAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnNvdXJjZWxlbik7ICAgICAvKiBhbW91bnQgb2YgaW5wdXQgYXZhaWxhYmxlICovCi0KLVRoZW4geW91IGNhbiBjYWxsIHB1ZmYoKSB0byBkZWNvbXByZXNzIGEgZGVmbGF0ZSBzdHJlYW0gdGhhdCBpcyBpbiBtZW1vcnkgaW4KLWl0cyBlbnRpcmV0eSBhdCBzb3VyY2UsIHRvIGEgc3VmZmljaWVudGx5IHNpemVkIGJsb2NrIG9mIG1lbW9yeSBmb3IgdGhlCi1kZWNvbXByZXNzZWQgZGF0YSBhdCBkZXN0LiAgcHVmZigpIGlzIHRoZSBvbmx5IGV4dGVybmFsIHN5bWJvbCBpbiBwdWZmLmMgIFRoZQotb25seSBDIGxpYnJhcnkgZnVuY3Rpb25zIHRoYXQgcHVmZi5jIG5lZWRzIGFyZSBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpLCB3aGljaAotYXJlIHVzZWQgdG8gc2ltcGxpZnkgZXJyb3IgY2hlY2tpbmcgaW4gdGhlIGNvZGUgdG8gaW1wcm92ZSByZWFkYWJpbHR5LiAgcHVmZi5jCi1kb2VzIG5vIG1lbW9yeSBhbGxvY2F0aW9uLCBhbmQgdXNlcyBsZXNzIHRoYW4gMksgYnl0ZXMgb2ZmIG9mIHRoZSBzdGFjay4KLQotSWYgZGVzdGxlbiBpcyBub3QgZW5vdWdoIHNwYWNlIGZvciB0aGUgdW5jb21wcmVzc2VkIGRhdGEsIHRoZW4gaW5mbGF0ZSB3aWxsCi1yZXR1cm4gYW4gZXJyb3Igd2l0aG91dCB3cml0aW5nIG1vcmUgdGhhbiBkZXN0bGVuIGJ5dGVzLiAgTm90ZSB0aGF0IHRoaXMgbWVhbnMKLXRoYXQgaW4gb3JkZXIgdG8gZGVjb21wcmVzcyB0aGUgZGVmbGF0ZSBkYXRhIHN1Y2Nlc3NmdWxseSwgeW91IG5lZWQgdG8ga25vdwotdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFoZWFkIG9mIHRpbWUuCi0KLUlmIG5lZWRlZCwgcHVmZigpIGNhbiBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIHdpdGggbm8KLW91dHB1dCBzcGFjZS4gIFRoaXMgaXMgZG9uZSBieSBwYXNzaW5nIGRlc3QgZXF1YWwgdG8gKHVuc2lnbmVkIGNoYXIgKikwLiAgVGhlbgotdGhlIGluaXRpYWwgdmFsdWUgb2YgKmRlc3RsZW4gaXMgaWdub3JlZCBhbmQgKmRlc3RsZW4gaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YKLXRoZSB1bmNvbXByZXNzZWQgZGF0YS4gIFNvIGlmIHRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBpcyBub3Qga25vd24sCi10aGVuIHR3byBwYXNzZXMgb2YgcHVmZigpIGNhbiBiZSB1c2VkLS1maXJzdCB0byBkZXRlcm1pbmUgdGhlIHNpemUsIGFuZCBzZWNvbmQKLXRvIGRvIHRoZSBhY3R1YWwgaW5mbGF0aW9uIGFmdGVyIGFsbG9jYXRpbmcgdGhlIGFwcHJvcHJpYXRlIG1lbW9yeS4gIE5vdAotcHJldHR5LCBidXQgaXQgd29ya3MuICAoVGhpcyBpcyBvbmUgb2YgdGhlIHJlYXNvbnMgeW91IHNob3VsZCBiZSB1c2luZyB6bGliLikKLQotVGhlIGRlZmxhdGUgZm9ybWF0IGlzIHNlbGYtdGVybWluYXRpbmcuICBJZiB0aGUgZGVmbGF0ZSBzdHJlYW0gZG9lcyBub3QgZW5kCi1pbiAqc291cmNlbGVuIGJ5dGVzLCBwdWZmKCkgd2lsbCByZXR1cm4gYW4gZXJyb3Igd2l0aG91dCByZWFkaW5nIGF0IG9yIHBhc3QKLWVuZHNvdXJjZS4KLQotT24gcmV0dXJuLCAqc291cmNlbGVuIGlzIHVwZGF0ZWQgdG8gdGhlIGFtb3VudCBvZiBpbnB1dCBkYXRhIGNvbnN1bWVkLCBhbmQKLSpkZXN0bGVuIGlzIHVwZGF0ZWQgdG8gdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLiAgU2VlIHRoZSBjb21tZW50cwotaW4gcHVmZi5jIGZvciB0aGUgcG9zc2libGUgcmV0dXJuIGNvZGVzIGZvciBwdWZmKCkuCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9wdWZmL3B1ZmYuYyBiL2xpYnMvemxpYi9jb250cmliL3B1ZmYvcHVmZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTBjYzQwLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL3B1ZmYvcHVmZi5jCisrKyAvZGV2L251bGwKQEAgLTEsODM3ICswLDAgQEAKLS8qCi0gKiBwdWZmLmMKLSAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwdWZmLmgKLSAqIHZlcnNpb24gMS44LCA5IEphbiAyMDA0Ci0gKgotICogcHVmZi5jIGlzIGEgc2ltcGxlIGluZmxhdGUgd3JpdHRlbiB0byBiZSBhbiB1bmFtYmlndW91cyB3YXkgdG8gc3BlY2lmeSB0aGUKLSAqIGRlZmxhdGUgZm9ybWF0LiAgSXQgaXMgbm90IHdyaXR0ZW4gZm9yIHNwZWVkIGJ1dCByYXRoZXIgc2ltcGxpY2l0eS4gIEFzIGEKLSAqIHNpZGUgYmVuZWZpdCwgdGhpcyBjb2RlIG1pZ2h0IGFjdHVhbGx5IGJlIHVzZWZ1bCB3aGVuIHNtYWxsIGNvZGUgaXMgbW9yZQotICogaW1wb3J0YW50IHRoYW4gc3BlZWQsIHN1Y2ggYXMgYm9vdHN0cmFwIGFwcGxpY2F0aW9ucy4gIEZvciB0eXBpY2FsIGRlZmxhdGUKLSAqIGRhdGEsIHpsaWIncyBpbmZsYXRlKCkgaXMgYWJvdXQgZm91ciB0aW1lcyBhcyBmYXN0IGFzIHB1ZmYoKS4gIHpsaWIncwotICogaW5mbGF0ZSBjb21waWxlcyB0byBhcm91bmQgMjBLIG9uIG15IG1hY2hpbmUsIHdoZXJlYXMgcHVmZi5jIGNvbXBpbGVzIHRvCi0gKiBhcm91bmQgNEsgb24gbXkgbWFjaGluZSAoYSBQb3dlclBDIHVzaW5nIEdOVSBjYykuICBJZiB0aGUgZmFzdGVyIGRlY29kZSgpCi0gKiBmdW5jdGlvbiBoZXJlIGlzIHVzZWQsIHRoZW4gcHVmZigpIGlzIG9ubHkgdHdpY2UgYXMgc2xvdyBhcyB6bGliJ3MKLSAqIGluZmxhdGUoKS4KLSAqCi0gKiBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSBjb21lcyBmcm9tIHRoZSBzdGFjay4gIFRoZSBzdGFjayByZXF1aXJlZAotICogaXMgbGVzcyB0aGFuIDJLIGJ5dGVzLiAgVGhpcyBjb2RlIGlzIGNvbXBhdGlibGUgd2l0aCAxNi1iaXQgaW50J3MgYW5kCi0gKiBhc3N1bWVzIHRoYXQgbG9uZydzIGFyZSBhdCBsZWFzdCAzMiBiaXRzLiAgcHVmZi5jIHVzZXMgdGhlIHNob3J0IGRhdGEgdHlwZSwKLSAqIGFzc3VtZWQgdG8gYmUgMTYgYml0cywgZm9yIGFycmF5cyBpbiBvcmRlciB0byB0byBjb25zZXJ2ZSBtZW1vcnkuICBUaGUgY29kZQotICogd29ya3Mgd2hldGhlciBpbnRlZ2VycyBhcmUgc3RvcmVkIGJpZyBlbmRpYW4gb3IgbGl0dGxlIGVuZGlhbi4KLSAqCi0gKiBJbiB0aGUgY29tbWVudHMgYmVsb3cgYXJlICJGb3JtYXQgbm90ZXMiIHRoYXQgZGVzY3JpYmUgdGhlIGluZmxhdGUgcHJvY2VzcwotICogYW5kIGRvY3VtZW50IHNvbWUgb2YgdGhlIGxlc3Mgb2J2aW91cyBhc3BlY3RzIG9mIHRoZSBmb3JtYXQuICBUaGlzIHNvdXJjZQotICogY29kZSBpcyBtZWFudCB0byBzdXBwbGVtZW50IFJGQyAxOTUxLCB3aGljaCBmb3JtYWxseSBkZXNjcmliZXMgdGhlIGRlZmxhdGUKLSAqIGZvcm1hdDoKLSAqCi0gKiAgICBodHRwOi8vd3d3LnpsaWIub3JnL3JmYy1kZWZsYXRlLmh0bWwKLSAqLwotCi0vKgotICogQ2hhbmdlIGhpc3Rvcnk6Ci0gKgotICogMS4wICAxMCBGZWIgMjAwMiAgICAgLSBGaXJzdCB2ZXJzaW9uCi0gKiAxLjEgIDE3IEZlYiAyMDAyICAgICAtIENsYXJpZmljYXRpb25zIG9mIHNvbWUgY29tbWVudHMgYW5kIG5vdGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIFVwZGF0ZSBwdWZmKCkgZGVzdCBhbmQgc291cmNlIHBvaW50ZXJzIG9uIG5lZ2F0aXZlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyB0byBmYWNpbGl0YXRlIGRlYnVnZ2luZyBkZWZsYXRvcnMKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gUmVtb3ZlIGxvbmdlc3QgZnJvbSBzdHJ1Y3QgaHVmZm1hbiAtLSBub3QgbmVlZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIFNpbXBsaWZ5IG9mZnNbXSBpbmRleCBpbiBjb25zdHJ1Y3QoKQotICogICAgICAgICAgICAgICAgICAgICAgLSBBZGQgaW5wdXQgc2l6ZSBhbmQgY2hlY2tpbmcsIHVzaW5nIGxvbmdqbXAoKSB0bwotICogICAgICAgICAgICAgICAgICAgICAgICBtYWludGFpbiBlYXN5IHJlYWRhYmlsaXR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAtIFVzZSBzaG9ydCBkYXRhIHR5cGUgZm9yIGxhcmdlIGFycmF5cwotICogICAgICAgICAgICAgICAgICAgICAgLSBVc2UgcG9pbnRlcnMgaW5zdGVhZCBvZiBsb25nIHRvIHNwZWNpZnkgc291cmNlIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBzaXplcyB0byBhdm9pZCBhcmJpdHJhcnkgNCBHQiBsaW1pdHMKLSAqIDEuMiAgMTcgTWFyIDIwMDIgICAgIC0gQWRkIGZhc3RlciB2ZXJzaW9uIG9mIGRlY29kZSgpLCBkb3VibGVzIHNwZWVkICghKSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGxlYXZlIHNpbXBsZSB2ZXJzaW9uIGZvciByZWFkYWJpbHR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAtIE1ha2Ugc3VyZSBpbnZhbGlkIGRpc3RhbmNlcyBkZXRlY3RlZCBpZiBwb2ludGVycwotICogICAgICAgICAgICAgICAgICAgICAgICBhcmUgMTYgYml0cwotICogICAgICAgICAgICAgICAgICAgICAgLSBGaXggZml4ZWQgY29kZXMgdGFibGUgZXJyb3IKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBhIHNjYW5uaW5nIG1vZGUgZm9yIGRldGVybWluaW5nIHNpemUgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGRhdGEKLSAqIDEuMyAgMjAgTWFyIDIwMDIgICAgIC0gR28gYmFjayB0byBsZW5ndGhzIGZvciBwdWZmKCkgcGFyYW1ldGVycyBbSmVhbi1sb3VwXQotICogICAgICAgICAgICAgICAgICAgICAgLSBBZGQgYSBwdWZmLmggZmlsZSBmb3IgdGhlIGludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgLSBBZGQgYnJhY2VzIGluIHB1ZmYoKSBmb3IgZWxzZSBkbyBbSmVhbi1sb3VwXQotICogICAgICAgICAgICAgICAgICAgICAgLSBVc2UgaW5kZXhlcyBpbnN0ZWFkIG9mIHBvaW50ZXJzIGZvciByZWFkYWJpbGl0eQotICogMS40ICAzMSBNYXIgMjAwMiAgICAgLSBTaW1wbGlmeSBjb25zdHJ1Y3QoKSBjb2RlIHNldCBjaGVjawotICogICAgICAgICAgICAgICAgICAgICAgLSBGaXggc29tZSBjb21tZW50cwotICogICAgICAgICAgICAgICAgICAgICAgLSBBZGQgRklYTENPREVTICNkZWZpbmUKLSAqIDEuNSAgIDYgQXByIDIwMDIgICAgIC0gTWlub3IgY29tbWVudCBmaXhlcwotICogMS42ICAgNyBBdWcgMjAwMiAgICAgLSBNaW5vciBmb3JtYXQgY2hhbmdlcwotICogMS43ICAgMyBNYXIgMjAwMyAgICAgLSBBZGRlZCB0ZXN0IGNvZGUgZm9yIGRpc3RyaWJ1dGlvbgotICogICAgICAgICAgICAgICAgICAgICAgLSBBZGRlZCB6bGliLWxpa2UgbGljZW5zZQotICogMS44ICAgOSBKYW4gMjAwNCAgICAgLSBBZGRlZCBzb21lIGNvbW1lbnRzIG9uIG5vIGRpc3RhbmNlIGNvZGVzIGNhc2UKLSAqLwotCi0jaW5jbHVkZSA8c2V0am1wLmg+ICAgICAgICAgICAgIC8qIGZvciBzZXRqbXAoKSwgbG9uZ2ptcCgpLCBhbmQgam1wX2J1ZiAqLwotI2luY2x1ZGUgInB1ZmYuaCIgICAgICAgICAgICAgICAvKiBwcm90b3R5cGUgZm9yIHB1ZmYoKSAqLwotCi0jZGVmaW5lIGxvY2FsIHN0YXRpYyAgICAgICAgICAgIC8qIGZvciBsb2NhbCBmdW5jdGlvbiBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBOSUwgKCh1bnNpZ25lZCBjaGFyICopMCkgICAgICAgIC8qIGZvciBubyBvdXRwdXQgb3B0aW9uICovCi0KLS8qCi0gKiBNYXhpbXVtcyBmb3IgYWxsb2NhdGlvbnMgYW5kIGxvb3BzLiAgSXQgaXMgbm90IHVzZWZ1bCB0byBjaGFuZ2UgdGhlc2UgLS0KLSAqIHRoZXkgYXJlIGZpeGVkIGJ5IHRoZSBkZWZsYXRlIGZvcm1hdC4KLSAqLwotI2RlZmluZSBNQVhCSVRTIDE1ICAgICAgICAgICAgICAvKiBtYXhpbXVtIGJpdHMgaW4gYSBjb2RlICovCi0jZGVmaW5lIE1BWExDT0RFUyAyODYgICAgICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCi0jZGVmaW5lIE1BWERDT0RFUyAzMCAgICAgICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCi0jZGVmaW5lIE1BWENPREVTIChNQVhMQ09ERVMrTUFYRENPREVTKSAgLyogbWF4aW11bSBjb2RlcyBsZW5ndGhzIHRvIHJlYWQgKi8KLSNkZWZpbmUgRklYTENPREVTIDI4OCAgICAgICAgICAgLyogbnVtYmVyIG9mIGZpeGVkIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCi0KLS8qIGlucHV0IGFuZCBvdXRwdXQgc3RhdGUgKi8KLXN0cnVjdCBzdGF0ZSB7Ci0gICAgLyogb3V0cHV0IHN0YXRlICovCi0gICAgdW5zaWduZWQgY2hhciAqb3V0OyAgICAgICAgIC8qIG91dHB1dCBidWZmZXIgKi8KLSAgICB1bnNpZ25lZCBsb25nIG91dGxlbjsgICAgICAgLyogYXZhaWxhYmxlIHNwYWNlIGF0IG91dCAqLwotICAgIHVuc2lnbmVkIGxvbmcgb3V0Y250OyAgICAgICAvKiBieXRlcyB3cml0dGVuIHRvIG91dCBzbyBmYXIgKi8KLQotICAgIC8qIGlucHV0IHN0YXRlICovCi0gICAgdW5zaWduZWQgY2hhciAqaW47ICAgICAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLwotICAgIHVuc2lnbmVkIGxvbmcgaW5sZW47ICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYXQgaW4gKi8KLSAgICB1bnNpZ25lZCBsb25nIGluY250OyAgICAgICAgLyogYnl0ZXMgcmVhZCBzbyBmYXIgKi8KLSAgICBpbnQgYml0YnVmOyAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLwotICAgIGludCBiaXRjbnQ7ICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCi0KLSAgICAvKiBpbnB1dCBsaW1pdCBlcnJvciByZXR1cm4gc3RhdGUgZm9yIGJpdHMoKSBhbmQgZGVjb2RlKCkgKi8KLSAgICBqbXBfYnVmIGVudjsKLX07Ci0KLS8qCi0gKiBSZXR1cm4gbmVlZCBiaXRzIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIFRoaXMgYWx3YXlzIGxlYXZlcyBsZXNzIHRoYW4KLSAqIGVpZ2h0IGJpdHMgaW4gdGhlIGJ1ZmZlci4gIGJpdHMoKSB3b3JrcyBwcm9wZXJseSBmb3IgbmVlZCA9PSAwLgotICoKLSAqIEZvcm1hdCBub3RlczoKLSAqCi0gKiAtIEJpdHMgYXJlIHN0b3JlZCBpbiBieXRlcyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIG1vc3QKLSAqICAgc2lnbmlmaWNhbnQgYml0LiAgVGhlcmVmb3JlIGJpdHMgYXJlIGRyb3BwZWQgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBiaXQKLSAqICAgYnVmZmVyLCB1c2luZyBzaGlmdCByaWdodCwgYW5kIG5ldyBieXRlcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRvcCBvZiB0aGUKLSAqICAgYml0IGJ1ZmZlciwgdXNpbmcgc2hpZnQgbGVmdC4KLSAqLwotbG9jYWwgaW50IGJpdHMoc3RydWN0IHN0YXRlICpzLCBpbnQgbmVlZCkKLXsKLSAgICBsb25nIHZhbDsgICAgICAgICAgIC8qIGJpdCBhY2N1bXVsYXRvciAoY2FuIHVzZSB1cCB0byAyMCBiaXRzKSAqLwotCi0gICAgLyogbG9hZCBhdCBsZWFzdCBuZWVkIGJpdHMgaW50byB2YWwgKi8KLSAgICB2YWwgPSBzLT5iaXRidWY7Ci0gICAgd2hpbGUgKHMtPmJpdGNudCA8IG5lZWQpIHsKLSAgICAgICAgaWYgKHMtPmluY250ID09IHMtPmlubGVuKSBsb25nam1wKHMtPmVudiwgMSk7ICAgLyogb3V0IG9mIGlucHV0ICovCi0gICAgICAgIHZhbCB8PSAobG9uZykocy0+aW5bcy0+aW5jbnQrK10pIDw8IHMtPmJpdGNudDsgIC8qIGxvYWQgZWlnaHQgYml0cyAqLwotICAgICAgICBzLT5iaXRjbnQgKz0gODsKLSAgICB9Ci0KLSAgICAvKiBkcm9wIG5lZWQgYml0cyBhbmQgdXBkYXRlIGJ1ZmZlciwgYWx3YXlzIHplcm8gdG8gc2V2ZW4gYml0cyBsZWZ0ICovCi0gICAgcy0+Yml0YnVmID0gKGludCkodmFsID4+IG5lZWQpOwotICAgIHMtPmJpdGNudCAtPSBuZWVkOwotCi0gICAgLyogcmV0dXJuIG5lZWQgYml0cywgemVyb2luZyB0aGUgYml0cyBhYm92ZSB0aGF0ICovCi0gICAgcmV0dXJuIChpbnQpKHZhbCAmICgoMUwgPDwgbmVlZCkgLSAxKSk7Ci19Ci0KLS8qCi0gKiBQcm9jZXNzIGEgc3RvcmVkIGJsb2NrLgotICoKLSAqIEZvcm1hdCBub3RlczoKLSAqCi0gKiAtIEFmdGVyIHRoZSB0d28tYml0IHN0b3JlZCBibG9jayB0eXBlICgwMCksIHRoZSBzdG9yZWQgYmxvY2sgbGVuZ3RoIGFuZAotICogICBzdG9yZWQgYnl0ZXMgYXJlIGJ5dGUtYWxpZ25lZCBmb3IgZmFzdCBjb3B5aW5nLiAgVGhlcmVmb3JlIGFueSBsZWZ0b3ZlcgotICogICBiaXRzIGluIHRoZSBieXRlIHRoYXQgaGFzIHRoZSBsYXN0IGJpdCBvZiB0aGUgdHlwZSwgYXMgbWFueSBhcyBzZXZlbiwgYXJlCi0gKiAgIGRpc2NhcmRlZC4gIFRoZSB2YWx1ZSBvZiB0aGUgZGlzY2FyZGVkIGJpdHMgYXJlIG5vdCBkZWZpbmVkIGFuZCBzaG91bGQgbm90Ci0gKiAgIGJlIGNoZWNrZWQgYWdhaW5zdCBhbnkgZXhwZWN0YXRpb24uCi0gKgotICogLSBUaGUgc2Vjb25kIGludmVydGVkIGNvcHkgb2YgdGhlIHN0b3JlZCBibG9jayBsZW5ndGggZG9lcyBub3QgaGF2ZSB0byBiZQotICogICBjaGVja2VkLCBidXQgaXQncyBwcm9iYWJseSBhIGdvb2QgaWRlYSB0byBkbyBzbyBhbnl3YXkuCi0gKgotICogLSBBIHN0b3JlZCBibG9jayBjYW4gaGF2ZSB6ZXJvIGxlbmd0aC4gIFRoaXMgaXMgc29tZXRpbWVzIHVzZWQgdG8gYnl0ZS1hbGlnbgotICogICBzdWJzZXRzIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgZm9yIHJhbmRvbSBhY2Nlc3Mgb3IgcGFydGlhbCByZWNvdmVyeS4KLSAqLwotbG9jYWwgaW50IHN0b3JlZChzdHJ1Y3Qgc3RhdGUgKnMpCi17Ci0gICAgdW5zaWduZWQgbGVuOyAgICAgICAvKiBsZW5ndGggb2Ygc3RvcmVkIGJsb2NrICovCi0KLSAgICAvKiBkaXNjYXJkIGxlZnRvdmVyIGJpdHMgZnJvbSBjdXJyZW50IGJ5dGUgKGFzc3VtZXMgcy0+Yml0Y250IDwgOCkgKi8KLSAgICBzLT5iaXRidWYgPSAwOwotICAgIHMtPmJpdGNudCA9IDA7Ci0KLSAgICAvKiBnZXQgbGVuZ3RoIGFuZCBjaGVjayBhZ2FpbnN0IGl0cyBvbmUncyBjb21wbGVtZW50ICovCi0gICAgaWYgKHMtPmluY250ICsgNCA+IHMtPmlubGVuKSByZXR1cm4gMjsgICAgICAvKiBub3QgZW5vdWdoIGlucHV0ICovCi0gICAgbGVuID0gcy0+aW5bcy0+aW5jbnQrK107Ci0gICAgbGVuIHw9IHMtPmluW3MtPmluY250KytdIDw8IDg7Ci0gICAgaWYgKHMtPmluW3MtPmluY250KytdICE9ICh+bGVuICYgMHhmZikgfHwKLSAgICAgICAgcy0+aW5bcy0+aW5jbnQrK10gIT0gKCh+bGVuID4+IDgpICYgMHhmZikpCi0gICAgICAgIHJldHVybiAtMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaWRuJ3QgbWF0Y2ggY29tcGxlbWVudCEgKi8KLQotICAgIC8qIGNvcHkgbGVuIGJ5dGVzIGZyb20gaW4gdG8gb3V0ICovCi0gICAgaWYgKHMtPmluY250ICsgbGVuID4gcy0+aW5sZW4pIHJldHVybiAyOyAgICAvKiBub3QgZW5vdWdoIGlucHV0ICovCi0gICAgaWYgKHMtPm91dCAhPSBOSUwpIHsKLSAgICAgICAgaWYgKHMtPm91dGNudCArIGxlbiA+IHMtPm91dGxlbikKLSAgICAgICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggb3V0cHV0IHNwYWNlICovCi0gICAgICAgIHdoaWxlIChsZW4tLSkKLSAgICAgICAgICAgIHMtPm91dFtzLT5vdXRjbnQrK10gPSBzLT5pbltzLT5pbmNudCsrXTsKLSAgICB9Ci0gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBqdXN0IHNjYW5uaW5nICovCi0gICAgICAgIHMtPm91dGNudCArPSBsZW47Ci0gICAgICAgIHMtPmluY250ICs9IGxlbjsKLSAgICB9Ci0KLSAgICAvKiBkb25lIHdpdGggYSB2YWxpZCBzdG9yZWQgYmxvY2sgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIEh1ZmZtYW4gY29kZSBkZWNvZGluZyB0YWJsZXMuICBjb3VudFsxLi5NQVhCSVRTXSBpcyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgb2YKLSAqIGVhY2ggbGVuZ3RoLCB3aGljaCBmb3IgYSBjYW5vbmljYWwgY29kZSBhcmUgc3RlcHBlZCB0aHJvdWdoIGluIG9yZGVyLgotICogc3ltYm9sW10gYXJlIHRoZSBzeW1ib2wgdmFsdWVzIGluIGNhbm9uaWNhbCBvcmRlciwgd2hlcmUgdGhlIG51bWJlciBvZgotICogZW50cmllcyBpcyB0aGUgc3VtIG9mIHRoZSBjb3VudHMgaW4gY291bnRbXS4gIFRoZSBkZWNvZGluZyBwcm9jZXNzIGNhbiBiZQotICogc2VlbiBpbiB0aGUgZnVuY3Rpb24gZGVjb2RlKCkgYmVsb3cuCi0gKi8KLXN0cnVjdCBodWZmbWFuIHsKLSAgICBzaG9ydCAqY291bnQ7ICAgICAgIC8qIG51bWJlciBvZiBzeW1ib2xzIG9mIGVhY2ggbGVuZ3RoICovCi0gICAgc2hvcnQgKnN5bWJvbDsgICAgICAvKiBjYW5vbmljYWxseSBvcmRlcmVkIHN5bWJvbHMgKi8KLX07Ci0KLS8qCi0gKiBEZWNvZGUgYSBjb2RlIGZyb20gdGhlIHN0cmVhbSBzIHVzaW5nIGh1ZmZtYW4gdGFibGUgaC4gIFJldHVybiB0aGUgc3ltYm9sIG9yCi0gKiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoZXJlIGlzIGFuIGVycm9yLiAgSWYgYWxsIG9mIHRoZSBsZW5ndGhzIGFyZSB6ZXJvLCBpLmUuCi0gKiBhbiBlbXB0eSBjb2RlLCBvciBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlIGFuZCBhbiBpbnZhbGlkIGNvZGUgaXMgcmVjZWl2ZWQsCi0gKiB0aGVuIC05IGlzIHJldHVybmVkIGFmdGVyIHJlYWRpbmcgTUFYQklUUyBiaXRzLgotICoKLSAqIEZvcm1hdCBub3RlczoKLSAqCi0gKiAtIFRoZSBjb2RlcyBhcyBzdG9yZWQgaW4gdGhlIGNvbXByZXNzZWQgZGF0YSBhcmUgYml0LXJldmVyc2VkIHJlbGF0aXZlIHRvCi0gKiAgIGEgc2ltcGxlIGludGVnZXIgb3JkZXJpbmcgb2YgY29kZXMgb2YgdGhlIHNhbWUgbGVuZ3Rocy4gIEhlbmNlIGJlbG93IHRoZQotICogICBiaXRzIGFyZSBwdWxsZWQgZnJvbSB0aGUgY29tcHJlc3NlZCBkYXRhIG9uZSBhdCBhIHRpbWUgYW5kIHVzZWQgdG8KLSAqICAgYnVpbGQgdGhlIGNvZGUgdmFsdWUgcmV2ZXJzZWQgZnJvbSB3aGF0IGlzIGluIHRoZSBzdHJlYW0gaW4gb3JkZXIgdG8KLSAqICAgcGVybWl0IHNpbXBsZSBpbnRlZ2VyIGNvbXBhcmlzb25zIGZvciBkZWNvZGluZy4gIEEgdGFibGUtYmFzZWQgZGVjb2RpbmcKLSAqICAgc2NoZW1lIChhcyB1c2VkIGluIHpsaWIpIGRvZXMgbm90IG5lZWQgdG8gZG8gdGhpcyByZXZlcnNhbC4KLSAqCi0gKiAtIFRoZSBmaXJzdCBjb2RlIGZvciB0aGUgc2hvcnRlc3QgbGVuZ3RoIGlzIGFsbCB6ZXJvcy4gIFN1YnNlcXVlbnQgY29kZXMgb2YKLSAqICAgdGhlIHNhbWUgbGVuZ3RoIGFyZSBzaW1wbHkgaW50ZWdlciBpbmNyZW1lbnRzIG9mIHRoZSBwcmV2aW91cyBjb2RlLiAgV2hlbgotICogICBtb3ZpbmcgdXAgYSBsZW5ndGgsIGEgemVybyBiaXQgaXMgYXBwZW5kZWQgdG8gdGhlIGNvZGUuICBGb3IgYSBjb21wbGV0ZQotICogICBjb2RlLCB0aGUgbGFzdCBjb2RlIG9mIHRoZSBsb25nZXN0IGxlbmd0aCB3aWxsIGJlIGFsbCBvbmVzLgotICoKLSAqIC0gSW5jb21wbGV0ZSBjb2RlcyBhcmUgaGFuZGxlZCBieSB0aGlzIGRlY29kZXIsIHNpbmNlIHRoZXkgYXJlIHBlcm1pdHRlZAotICogICBpbiB0aGUgZGVmbGF0ZSBmb3JtYXQuICBTZWUgdGhlIGZvcm1hdCBub3RlcyBmb3IgZml4ZWQoKSBhbmQgZHluYW1pYygpLgotICovCi0jaWZkZWYgU0xPVwotbG9jYWwgaW50IGRlY29kZShzdHJ1Y3Qgc3RhdGUgKnMsIHN0cnVjdCBodWZmbWFuICpoKQotewotICAgIGludCBsZW47ICAgICAgICAgICAgLyogY3VycmVudCBudW1iZXIgb2YgYml0cyBpbiBjb2RlICovCi0gICAgaW50IGNvZGU7ICAgICAgICAgICAvKiBsZW4gYml0cyBiZWluZyBkZWNvZGVkICovCi0gICAgaW50IGZpcnN0OyAgICAgICAgICAvKiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gKi8KLSAgICBpbnQgY291bnQ7ICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBsZW5ndGggbGVuICovCi0gICAgaW50IGluZGV4OyAgICAgICAgICAvKiBpbmRleCBvZiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gaW4gc3ltYm9sIHRhYmxlICovCi0KLSAgICBjb2RlID0gZmlyc3QgPSBpbmRleCA9IDA7Ci0gICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKLSAgICAgICAgY29kZSB8PSBiaXRzKHMsIDEpOyAgICAgICAgICAgICAvKiBnZXQgbmV4dCBiaXQgKi8KLSAgICAgICAgY291bnQgPSBoLT5jb3VudFtsZW5dOwotICAgICAgICBpZiAoY29kZSA8IGZpcnN0ICsgY291bnQpICAgICAgIC8qIGlmIGxlbmd0aCBsZW4sIHJldHVybiBzeW1ib2wgKi8KLSAgICAgICAgICAgIHJldHVybiBoLT5zeW1ib2xbaW5kZXggKyAoY29kZSAtIGZpcnN0KV07Ci0gICAgICAgIGluZGV4ICs9IGNvdW50OyAgICAgICAgICAgICAgICAgLyogZWxzZSB1cGRhdGUgZm9yIG5leHQgbGVuZ3RoICovCi0gICAgICAgIGZpcnN0ICs9IGNvdW50OwotICAgICAgICBmaXJzdCA8PD0gMTsKLSAgICAgICAgY29kZSA8PD0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIC05OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmFuIG91dCBvZiBjb2RlcyAqLwotfQotCi0vKgotICogQSBmYXN0ZXIgdmVyc2lvbiBvZiBkZWNvZGUoKSBmb3IgcmVhbCBhcHBsaWNhdGlvbnMgb2YgdGhpcyBjb2RlLiAgIEl0J3Mgbm90Ci0gKiBhcyByZWFkYWJsZSwgYnV0IGl0IG1ha2VzIHB1ZmYoKSB0d2ljZSBhcyBmYXN0LiAgQW5kIGl0IG9ubHkgbWFrZXMgdGhlIGNvZGUKLSAqIGEgZmV3IHBlcmNlbnQgbGFyZ2VyLgotICovCi0jZWxzZSAvKiAhU0xPVyAqLwotbG9jYWwgaW50IGRlY29kZShzdHJ1Y3Qgc3RhdGUgKnMsIHN0cnVjdCBodWZmbWFuICpoKQotewotICAgIGludCBsZW47ICAgICAgICAgICAgLyogY3VycmVudCBudW1iZXIgb2YgYml0cyBpbiBjb2RlICovCi0gICAgaW50IGNvZGU7ICAgICAgICAgICAvKiBsZW4gYml0cyBiZWluZyBkZWNvZGVkICovCi0gICAgaW50IGZpcnN0OyAgICAgICAgICAvKiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gKi8KLSAgICBpbnQgY291bnQ7ICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBsZW5ndGggbGVuICovCi0gICAgaW50IGluZGV4OyAgICAgICAgICAvKiBpbmRleCBvZiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gaW4gc3ltYm9sIHRhYmxlICovCi0gICAgaW50IGJpdGJ1ZjsgICAgICAgICAvKiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgaW50IGxlZnQ7ICAgICAgICAgICAvKiBiaXRzIGxlZnQgaW4gbmV4dCBvciBsZWZ0IHRvIHByb2Nlc3MgKi8KLSAgICBzaG9ydCAqbmV4dDsgICAgICAgIC8qIG5leHQgbnVtYmVyIG9mIGNvZGVzICovCi0KLSAgICBiaXRidWYgPSBzLT5iaXRidWY7Ci0gICAgbGVmdCA9IHMtPmJpdGNudDsKLSAgICBjb2RlID0gZmlyc3QgPSBpbmRleCA9IDA7Ci0gICAgbGVuID0gMTsKLSAgICBuZXh0ID0gaC0+Y291bnQgKyAxOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHdoaWxlIChsZWZ0LS0pIHsKLSAgICAgICAgICAgIGNvZGUgfD0gYml0YnVmICYgMTsKLSAgICAgICAgICAgIGJpdGJ1ZiA+Pj0gMTsKLSAgICAgICAgICAgIGNvdW50ID0gKm5leHQrKzsKLSAgICAgICAgICAgIGlmIChjb2RlIDwgZmlyc3QgKyBjb3VudCkgeyAvKiBpZiBsZW5ndGggbGVuLCByZXR1cm4gc3ltYm9sICovCi0gICAgICAgICAgICAgICAgcy0+Yml0YnVmID0gYml0YnVmOwotICAgICAgICAgICAgICAgIHMtPmJpdGNudCA9IChzLT5iaXRjbnQgLSBsZW4pICYgNzsKLSAgICAgICAgICAgICAgICByZXR1cm4gaC0+c3ltYm9sW2luZGV4ICsgKGNvZGUgLSBmaXJzdCldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZXggKz0gY291bnQ7ICAgICAgICAgICAgIC8qIGVsc2UgdXBkYXRlIGZvciBuZXh0IGxlbmd0aCAqLwotICAgICAgICAgICAgZmlyc3QgKz0gY291bnQ7Ci0gICAgICAgICAgICBmaXJzdCA8PD0gMTsKLSAgICAgICAgICAgIGNvZGUgPDw9IDE7Ci0gICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgfQotICAgICAgICBsZWZ0ID0gKE1BWEJJVFMrMSkgLSBsZW47Ci0gICAgICAgIGlmIChsZWZ0ID09IDApIGJyZWFrOwotICAgICAgICBpZiAocy0+aW5jbnQgPT0gcy0+aW5sZW4pIGxvbmdqbXAocy0+ZW52LCAxKTsgICAvKiBvdXQgb2YgaW5wdXQgKi8KLSAgICAgICAgYml0YnVmID0gcy0+aW5bcy0+aW5jbnQrK107Ci0gICAgICAgIGlmIChsZWZ0ID4gOCkgbGVmdCA9IDg7Ci0gICAgfQotICAgIHJldHVybiAtOTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhbiBvdXQgb2YgY29kZXMgKi8KLX0KLSNlbmRpZiAvKiBTTE9XICovCi0KLS8qCi0gKiBHaXZlbiB0aGUgbGlzdCBvZiBjb2RlIGxlbmd0aHMgbGVuZ3RoWzAuLm4tMV0gcmVwcmVzZW50aW5nIGEgY2Fub25pY2FsCi0gKiBIdWZmbWFuIGNvZGUgZm9yIG4gc3ltYm9scywgY29uc3RydWN0IHRoZSB0YWJsZXMgcmVxdWlyZWQgdG8gZGVjb2RlIHRob3NlCi0gKiBjb2Rlcy4gIFRob3NlIHRhYmxlcyBhcmUgdGhlIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCwgYW5kIHRoZSBzeW1ib2xzCi0gKiBzb3J0ZWQgYnkgbGVuZ3RoLCByZXRhaW5pbmcgdGhlaXIgb3JpZ2luYWwgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoLiAgVGhlCi0gKiByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IgYSBjb21wbGV0ZSBjb2RlIHNldCwgbmVnYXRpdmUgZm9yIGFuIG92ZXItCi0gKiBzdWJzY3JpYmVkIGNvZGUgc2V0LCBhbmQgcG9zaXRpdmUgZm9yIGFuIGluY29tcGxldGUgY29kZSBzZXQuICBUaGUgdGFibGVzCi0gKiBjYW4gYmUgdXNlZCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gb3IgcG9zaXRpdmUsIGJ1dCB0aGV5IGNhbm5vdCBiZSB1c2VkCi0gKiBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvLCBpdCBpcyBub3QKLSAqIHBvc3NpYmxlIGZvciBkZWNvZGUoKSB1c2luZyB0aGF0IHRhYmxlIHRvIHJldHVybiBhbiBlcnJvci0tYW55IHN0cmVhbSBvZgotICogZW5vdWdoIGJpdHMgd2lsbCByZXNvbHZlIHRvIGEgc3ltYm9sLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgdGhlbgotICogaXQgaXMgcG9zc2libGUgZm9yIGRlY29kZSgpIHVzaW5nIHRoYXQgdGFibGUgdG8gcmV0dXJuIGFuIGVycm9yIGZvciByZWNlaXZlZAotICogY29kZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBpbmNvbXBsZXRlIGxlbmd0aHMuCi0gKgotICogTm90IHVzZWQgYnkgZGVjb2RlKCksIGJ1dCB1c2VkIGZvciBlcnJvciBjaGVja2luZywgaC0+Y291bnRbMF0gaXMgdGhlIG51bWJlcgotICogb2YgdGhlIG4gc3ltYm9scyBub3QgaW4gdGhlIGNvZGUuICBTbyBuIC0gaC0+Y291bnRbMF0gaXMgdGhlIG51bWJlciBvZgotICogY29kZXMuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgZm9yIGluY29tcGxldGUgY29kZXMgdGhhdCBoYXZlIG1vcmUgdGhhbgotICogb25lIHN5bWJvbCwgd2hpY2ggaXMgYW4gZXJyb3IgaW4gYSBkeW5hbWljIGJsb2NrLgotICoKLSAqIEFzc3VtcHRpb246IGZvciBhbGwgaSBpbiAwLi5uLTEsIDAgPD0gbGVuZ3RoW2ldIDw9IE1BWEJJVFMKLSAqIFRoaXMgaXMgYXNzdXJlZCBieSB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBsZW5ndGggYXJyYXlzIGluIGR5bmFtaWMoKSBhbmQKLSAqIGZpeGVkKCkgYW5kIGlzIG5vdCB2ZXJpZmllZCBieSBjb25zdHJ1Y3QoKS4KLSAqCi0gKiBGb3JtYXQgbm90ZXM6Ci0gKgotICogLSBQZXJtaXR0ZWQgYW5kIGV4cGVjdGVkIGV4YW1wbGVzIG9mIGluY29tcGxldGUgY29kZXMgYXJlIG9uZSBvZiB0aGUgZml4ZWQKLSAqICAgY29kZXMgYW5kIGFueSBjb2RlIHdpdGggYSBzaW5nbGUgc3ltYm9sIHdoaWNoIGluIGRlZmxhdGUgaXMgY29kZWQgYXMgb25lCi0gKiAgIGJpdCBpbnN0ZWFkIG9mIHplcm8gYml0cy4gIFNlZSB0aGUgZm9ybWF0IG5vdGVzIGZvciBmaXhlZCgpIGFuZCBkeW5hbWljKCkuCi0gKgotICogLSBXaXRoaW4gYSBnaXZlbiBjb2RlIGxlbmd0aCwgdGhlIHN5bWJvbHMgYXJlIGtlcHQgaW4gYXNjZW5kaW5nIG9yZGVyIGZvcgotICogICB0aGUgY29kZSBiaXRzIGRlZmluaXRpb24uCi0gKi8KLWxvY2FsIGludCBjb25zdHJ1Y3Qoc3RydWN0IGh1ZmZtYW4gKmgsIHNob3J0ICpsZW5ndGgsIGludCBuKQotewotICAgIGludCBzeW1ib2w7ICAgICAgICAgLyogY3VycmVudCBzeW1ib2wgd2hlbiBzdGVwcGluZyB0aHJvdWdoIGxlbmd0aFtdICovCi0gICAgaW50IGxlbjsgICAgICAgICAgICAvKiBjdXJyZW50IGxlbmd0aCB3aGVuIHN0ZXBwaW5nIHRocm91Z2ggaC0+Y291bnRbXSAqLwotICAgIGludCBsZWZ0OyAgICAgICAgICAgLyogbnVtYmVyIG9mIHBvc3NpYmxlIGNvZGVzIGxlZnQgb2YgY3VycmVudCBsZW5ndGggKi8KLSAgICBzaG9ydCBvZmZzW01BWEJJVFMrMV07ICAgICAgLyogb2Zmc2V0cyBpbiBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCi0KLSAgICAvKiBjb3VudCBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi8KLSAgICBmb3IgKGxlbiA9IDA7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykKLSAgICAgICAgaC0+Y291bnRbbGVuXSA9IDA7Ci0gICAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBuOyBzeW1ib2wrKykKLSAgICAgICAgKGgtPmNvdW50W2xlbmd0aFtzeW1ib2xdXSkrKzsgICAvKiBhc3N1bWVzIGxlbmd0aHMgYXJlIHdpdGhpbiBib3VuZHMgKi8KLSAgICBpZiAoaC0+Y291bnRbMF0gPT0gbikgICAgICAgICAgICAgICAvKiBubyBjb2RlcyEgKi8KLSAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wbGV0ZSwgYnV0IGRlY29kZSgpIHdpbGwgZmFpbCAqLwotCi0gICAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovCi0gICAgbGVmdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25lIHBvc3NpYmxlIGNvZGUgb2YgemVybyBsZW5ndGggKi8KLSAgICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykgewotICAgICAgICBsZWZ0IDw8PSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIG9uZSBtb3JlIGJpdCwgZG91YmxlIGNvZGVzIGxlZnQgKi8KLSAgICAgICAgbGVmdCAtPSBoLT5jb3VudFtsZW5dOyAgICAgICAgICAvKiBkZWR1Y3QgY291bnQgZnJvbSBwb3NzaWJsZSBjb2RlcyAqLwotICAgICAgICBpZiAobGVmdCA8IDApIHJldHVybiBsZWZ0OyAgICAgIC8qIG92ZXItc3Vic2NyaWJlZC0tcmV0dXJuIG5lZ2F0aXZlICovCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVmdCA+IDAgbWVhbnMgaW5jb21wbGV0ZSAqLwotCi0gICAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi8KLSAgICBvZmZzWzFdID0gMDsKLSAgICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKQotICAgICAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgaC0+Y291bnRbbGVuXTsKLQotICAgIC8qCi0gICAgICogcHV0IHN5bWJvbHMgaW4gdGFibGUgc29ydGVkIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoCi0gICAgICogbGVuZ3RoCi0gICAgICovCi0gICAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBuOyBzeW1ib2wrKykKLSAgICAgICAgaWYgKGxlbmd0aFtzeW1ib2xdICE9IDApCi0gICAgICAgICAgICBoLT5zeW1ib2xbb2Zmc1tsZW5ndGhbc3ltYm9sXV0rK10gPSBzeW1ib2w7Ci0KLSAgICAvKiByZXR1cm4gemVybyBmb3IgY29tcGxldGUgc2V0LCBwb3NpdGl2ZSBmb3IgaW5jb21wbGV0ZSBzZXQgKi8KLSAgICByZXR1cm4gbGVmdDsKLX0KLQotLyoKLSAqIERlY29kZSBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZXMgdW50aWwgYW4gZW5kLW9mLWJsb2NrIGNvZGUuCi0gKgotICogRm9ybWF0IG5vdGVzOgotICoKLSAqIC0gQ29tcHJlc3NlZCBkYXRhIHRoYXQgaXMgYWZ0ZXIgdGhlIGJsb2NrIHR5cGUgaWYgZml4ZWQgb3IgYWZ0ZXIgdGhlIGNvZGUKLSAqICAgZGVzY3JpcHRpb24gaWYgZHluYW1pYyBpcyBhIGNvbWJpbmF0aW9uIG9mIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2UKLSAqICAgcGFpcnMgdGVybWluYXRlZCBieSBhbmQgZW5kLW9mLWJsb2NrIGNvZGUuICBMaXRlcmFscyBhcmUgc2ltcGx5IEh1ZmZtYW4KLSAqICAgY29kZWQgYnl0ZXMuICBBIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIGEgY29kZWQgbGVuZ3RoIGZvbGxvd2VkIGJ5IGEKLSAqICAgY29kZWQgZGlzdGFuY2UgdG8gcmVwcmVzZW50IGEgc3RyaW5nIHRoYXQgb2NjdXJzIGVhcmxpZXIgaW4gdGhlCi0gKiAgIHVuY29tcHJlc3NlZCBkYXRhIHRoYXQgb2NjdXJzIGFnYWluIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgotICoKLSAqIC0gTGl0ZXJhbHMsIGxlbmd0aHMsIGFuZCB0aGUgZW5kLW9mLWJsb2NrIGNvZGUgYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUKLSAqICAgY29kZSBvZiB1cCB0byAyODYgc3ltYm9scy4gIFRoZXkgYXJlIDI1NiBsaXRlcmFscyAoMC4uMjU1KSwgMjkgbGVuZ3RoCi0gKiAgIHN5bWJvbHMgKDI1Ny4uMjg1KSwgYW5kIHRoZSBlbmQtb2YtYmxvY2sgc3ltYm9sICgyNTYpLgotICoKLSAqIC0gVGhlcmUgYXJlIDI1NiBwb3NzaWJsZSBsZW5ndGhzICgzLi4yNTgpLCBhbmQgc28gMjkgc3ltYm9scyBhcmUgbm90IGVub3VnaAotICogICB0byByZXByZXNlbnQgYWxsIG9mIHRob3NlLiAgTGVuZ3RocyAzLi4xMCBhbmQgMjU4IGFyZSBpbiBmYWN0IHJlcHJlc2VudGVkCi0gKiAgIGJ5IGp1c3QgYSBsZW5ndGggc3ltYm9sLiAgTGVuZ3RocyAxMS4uMjU3IGFyZSByZXByZXNlbnRlZCBhcyBhIHN5bWJvbCBhbmQKLSAqICAgc29tZSBudW1iZXIgb2YgZXh0cmEgYml0cyB0aGF0IGFyZSBhZGRlZCBhcyBhbiBpbnRlZ2VyIHRvIHRoZSBiYXNlIGxlbmd0aAotICogICBvZiB0aGUgbGVuZ3RoIHN5bWJvbC4gIFRoZSBudW1iZXIgb2YgZXh0cmEgYml0cyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBiYXNlCi0gKiAgIGxlbmd0aCBzeW1ib2wuICBUaGVzZSBhcmUgaW4gdGhlIHN0YXRpYyBhcnJheXMgYmVsb3csIGxlbnNbXSBmb3IgdGhlIGJhc2UKLSAqICAgbGVuZ3RocyBhbmQgbGV4dFtdIGZvciB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgZXh0cmEgYml0cy4KLSAqCi0gKiAtIFRoZSByZWFzb24gdGhhdCAyNTggZ2V0cyBpdHMgb3duIHN5bWJvbCBpcyB0aGF0IHRoZSBsb25nZXN0IGxlbmd0aCBpcyB1c2VkCi0gKiAgIG9mdGVuIGluIGhpZ2hseSByZWR1bmRhbnQgZmlsZXMuICBOb3RlIHRoYXQgMjU4IGNhbiBhbHNvIGJlIGNvZGVkIGFzIHRoZQotICogICBiYXNlIHZhbHVlIDIyNyBwbHVzIHRoZSBtYXhpbXVtIGV4dHJhIHZhbHVlIG9mIDMxLiAgV2hpbGUgYSBnb29kIGRlZmxhdGUKLSAqICAgc2hvdWxkIG5ldmVyIGRvIHRoaXMsIGl0IGlzIG5vdCBhbiBlcnJvciwgYW5kIHNob3VsZCBiZSBkZWNvZGVkIHByb3Blcmx5LgotICoKLSAqIC0gSWYgYSBsZW5ndGggaXMgZGVjb2RlZCwgaW5jbHVkaW5nIGl0cyBleHRyYSBiaXRzIGlmIGFueSwgdGhlbiBpdCBpcwotICogICBmb2xsb3dlZCBhIGRpc3RhbmNlIGNvZGUuICBUaGVyZSBhcmUgdXAgdG8gMzAgZGlzdGFuY2Ugc3ltYm9scy4gIEFnYWluCi0gKiAgIHRoZXJlIGFyZSBtYW55IG1vcmUgcG9zc2libGUgZGlzdGFuY2VzICgxLi4zMjc2OCksIHNvIGV4dHJhIGJpdHMgYXJlIGFkZGVkCi0gKiAgIHRvIGEgYmFzZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgc3ltYm9sLiAgVGhlIGRpc3RhbmNlcyAxLi40IGdldCB0aGVpcgotICogICBvd24gc3ltYm9sLCBidXQgdGhlIHJlc3QgcmVxdWlyZSBleHRyYSBiaXRzLiAgVGhlIGJhc2UgZGlzdGFuY2VzIGFuZAotICogICBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBleHRyYSBiaXRzIGFyZSBiZWxvdyBpbiB0aGUgc3RhdGljIGFycmF5cyBkaXN0W10KLSAqICAgYW5kIGRleHRbXS4KLSAqCi0gKiAtIExpdGVyYWwgYnl0ZXMgYXJlIHNpbXBseSB3cml0dGVuIHRvIHRoZSBvdXRwdXQuICBBIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzCi0gKiAgIGFuIGluc3RydWN0aW9uIHRvIGNvcHkgcHJldmlvdXNseSB1bmNvbXByZXNzZWQgYnl0ZXMgdG8gdGhlIG91dHB1dC4gIFRoZQotICogICBjb3B5IGlzIGZyb20gZGlzdGFuY2UgYnl0ZXMgYmFjayBpbiB0aGUgb3V0cHV0IHN0cmVhbSwgY29weWluZyBmb3IgbGVuZ3RoCi0gKiAgIGJ5dGVzLgotICoKLSAqIC0gRGlzdGFuY2VzIHBvaW50aW5nIGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBhcmUgbm90Ci0gKiAgIHBlcm1pdHRlZC4KLSAqCi0gKiAtIE92ZXJsYXBwZWQgY29waWVzLCB3aGVyZSB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZGlzdGFuY2UsIGFyZQotICogICBhbGxvd2VkIGFuZCBjb21tb24uICBGb3IgZXhhbXBsZSwgYSBkaXN0YW5jZSBvZiBvbmUgYW5kIGEgbGVuZ3RoIG9mIDI1OAotICogICBzaW1wbHkgY29waWVzIHRoZSBsYXN0IGJ5dGUgMjU4IHRpbWVzLiAgQSBkaXN0YW5jZSBvZiBmb3VyIGFuZCBhIGxlbmd0aCBvZgotICogICB0d2VsdmUgY29waWVzIHRoZSBsYXN0IGZvdXIgYnl0ZXMgdGhyZWUgdGltZXMuICBBIHNpbXBsZSBmb3J3YXJkIGNvcHkKLSAqICAgaWdub3Jpbmcgd2hldGhlciB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZGlzdGFuY2Ugb3Igbm90IGltcGxlbWVudHMKLSAqICAgdGhpcyBjb3JyZWN0bHkuICBZb3Ugc2hvdWxkIG5vdCB1c2UgbWVtY3B5KCkgc2luY2UgaXRzIGJlaGF2aW9yIGlzIG5vdAotICogICBkZWZpbmVkIGZvciBvdmVybGFwcGVkIGFycmF5cy4gIFlvdSBzaG91bGQgbm90IHVzZSBtZW1tb3ZlKCkgb3IgYmNvcHkoKQotICogICBzaW5jZSB0aG91Z2ggdGhlaXIgYmVoYXZpb3IgLWlzLSBkZWZpbmVkIGZvciBvdmVybGFwcGluZyBhcnJheXMsIGl0IGlzCi0gKiAgIGRlZmluZWQgdG8gZG8gdGhlIHdyb25nIHRoaW5nIGluIHRoaXMgY2FzZS4KLSAqLwotbG9jYWwgaW50IGNvZGVzKHN0cnVjdCBzdGF0ZSAqcywKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgaHVmZm1hbiAqbGVuY29kZSwKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgaHVmZm1hbiAqZGlzdGNvZGUpCi17Ci0gICAgaW50IHN5bWJvbDsgICAgICAgICAvKiBkZWNvZGVkIHN5bWJvbCAqLwotICAgIGludCBsZW47ICAgICAgICAgICAgLyogbGVuZ3RoIGZvciBjb3B5ICovCi0gICAgdW5zaWduZWQgZGlzdDsgICAgICAvKiBkaXN0YW5jZSBmb3IgY29weSAqLwotICAgIHN0YXRpYyBjb25zdCBzaG9ydCBsZW5zWzI5XSA9IHsgLyogU2l6ZSBiYXNlIGZvciBsZW5ndGggY29kZXMgMjU3Li4yODUgKi8KLSAgICAgICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSwKLSAgICAgICAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTh9OwotICAgIHN0YXRpYyBjb25zdCBzaG9ydCBsZXh0WzI5XSA9IHsgLyogRXh0cmEgYml0cyBmb3IgbGVuZ3RoIGNvZGVzIDI1Ny4uMjg1ICovCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsCi0gICAgICAgIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDB9OwotICAgIHN0YXRpYyBjb25zdCBzaG9ydCBkaXN0c1szMF0gPSB7IC8qIE9mZnNldCBiYXNlIGZvciBkaXN0YW5jZSBjb2RlcyAwLi4yOSAqLwotICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsCi0gICAgICAgIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwKLSAgICAgICAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3N307Ci0gICAgc3RhdGljIGNvbnN0IHNob3J0IGRleHRbMzBdID0geyAvKiBFeHRyYSBiaXRzIGZvciBkaXN0YW5jZSBjb2RlcyAwLi4yOSAqLwotICAgICAgICAwLCAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LAotICAgICAgICA3LCA3LCA4LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwKLSAgICAgICAgMTIsIDEyLCAxMywgMTN9OwotCi0gICAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2UgcGFpcnMgKi8KLSAgICBkbyB7Ci0gICAgICAgIHN5bWJvbCA9IGRlY29kZShzLCBsZW5jb2RlKTsKLSAgICAgICAgaWYgKHN5bWJvbCA8IDApIHJldHVybiBzeW1ib2w7ICAvKiBpbnZhbGlkIHN5bWJvbCAqLwotICAgICAgICBpZiAoc3ltYm9sIDwgMjU2KSB7ICAgICAgICAgICAgIC8qIGxpdGVyYWw6IHN5bWJvbCBpcyB0aGUgYnl0ZSAqLwotICAgICAgICAgICAgLyogd3JpdGUgb3V0IHRoZSBsaXRlcmFsICovCi0gICAgICAgICAgICBpZiAocy0+b3V0ICE9IE5JTCkgewotICAgICAgICAgICAgICAgIGlmIChzLT5vdXRjbnQgPT0gcy0+b3V0bGVuKSByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICBzLT5vdXRbcy0+b3V0Y250XSA9IHN5bWJvbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPm91dGNudCsrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN5bWJvbCA+IDI1NikgeyAgICAgICAgLyogbGVuZ3RoICovCi0gICAgICAgICAgICAvKiBnZXQgYW5kIGNvbXB1dGUgbGVuZ3RoICovCi0gICAgICAgICAgICBzeW1ib2wgLT0gMjU3OwotICAgICAgICAgICAgaWYgKHN5bWJvbCA+PSAyOSkgcmV0dXJuIC05OyAgICAgICAgLyogaW52YWxpZCBmaXhlZCBjb2RlICovCi0gICAgICAgICAgICBsZW4gPSBsZW5zW3N5bWJvbF0gKyBiaXRzKHMsIGxleHRbc3ltYm9sXSk7Ci0KLSAgICAgICAgICAgIC8qIGdldCBhbmQgY2hlY2sgZGlzdGFuY2UgKi8KLSAgICAgICAgICAgIHN5bWJvbCA9IGRlY29kZShzLCBkaXN0Y29kZSk7Ci0gICAgICAgICAgICBpZiAoc3ltYm9sIDwgMCkgcmV0dXJuIHN5bWJvbDsgICAgICAvKiBpbnZhbGlkIHN5bWJvbCAqLwotICAgICAgICAgICAgZGlzdCA9IGRpc3RzW3N5bWJvbF0gKyBiaXRzKHMsIGRleHRbc3ltYm9sXSk7Ci0gICAgICAgICAgICBpZiAoZGlzdCA+IHMtPm91dGNudCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTEwOyAgICAgLyogZGlzdGFuY2UgdG9vIGZhciBiYWNrICovCi0KLSAgICAgICAgICAgIC8qIGNvcHkgbGVuZ3RoIGJ5dGVzIGZyb20gZGlzdGFuY2UgYnl0ZXMgYmFjayAqLwotICAgICAgICAgICAgaWYgKHMtPm91dCAhPSBOSUwpIHsKLSAgICAgICAgICAgICAgICBpZiAocy0+b3V0Y250ICsgbGVuID4gcy0+b3V0bGVuKSByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobGVuLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+b3V0W3MtPm91dGNudF0gPSBzLT5vdXRbcy0+b3V0Y250IC0gZGlzdF07Ci0gICAgICAgICAgICAgICAgICAgIHMtPm91dGNudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzLT5vdXRjbnQgKz0gbGVuOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoc3ltYm9sICE9IDI1Nik7ICAgICAgICAgICAgLyogZW5kIG9mIGJsb2NrIHN5bWJvbCAqLwotCi0gICAgLyogZG9uZSB3aXRoIGEgdmFsaWQgZml4ZWQgb3IgZHluYW1pYyBibG9jayAqLwotICAgIHJldHVybiAwOwotfQotCi0vKgotICogUHJvY2VzcyBhIGZpeGVkIGNvZGVzIGJsb2NrLgotICoKLSAqIEZvcm1hdCBub3RlczoKLSAqCi0gKiAtIFRoaXMgYmxvY2sgdHlwZSBjYW4gYmUgdXNlZnVsIGZvciBjb21wcmVzc2luZyBzbWFsbCBhbW91bnRzIG9mIGRhdGEgZm9yCi0gKiAgIHdoaWNoIHRoZSBzaXplIG9mIHRoZSBjb2RlIGRlc2NyaXB0aW9ucyBpbiBhIGR5bmFtaWMgYmxvY2sgZXhjZWVkcyB0aGUKLSAqICAgYmVuZWZpdCBvZiBjdXN0b20gY29kZXMgZm9yIHRoYXQgYmxvY2suICBGb3IgZml4ZWQgY29kZXMsIG5vIGJpdHMgYXJlCi0gKiAgIHNwZW50IG9uIGNvZGUgZGVzY3JpcHRpb25zLiAgSW5zdGVhZCB0aGUgY29kZSBsZW5ndGhzIGZvciBsaXRlcmFsL2xlbmd0aAotICogICBjb2RlcyBhbmQgZGlzdGFuY2UgY29kZXMgYXJlIGZpeGVkLiAgVGhlIHNwZWNpZmljIGxlbmd0aHMgZm9yIGVhY2ggc3ltYm9sCi0gKiAgIGNhbiBiZSBzZWVuIGluIHRoZSAiZm9yIiBsb29wcyBiZWxvdy4KLSAqCi0gKiAtIFRoZSBsaXRlcmFsL2xlbmd0aCBjb2RlIGlzIGNvbXBsZXRlLCBidXQgaGFzIHR3byBzeW1ib2xzIHRoYXQgYXJlIGludmFsaWQKLSAqICAgYW5kIHNob3VsZCByZXN1bHQgaW4gYW4gZXJyb3IgaWYgcmVjZWl2ZWQuICBUaGlzIGNhbm5vdCBiZSBpbXBsZW1lbnRlZAotICogICBzaW1wbHkgYXMgYW4gaW5jb21wbGV0ZSBjb2RlIHNpbmNlIHRob3NlIHR3byBzeW1ib2xzIGFyZSBpbiB0aGUgIm1pZGRsZSIKLSAqICAgb2YgdGhlIGNvZGUuICBUaGV5IGFyZSBlaWdodCBiaXRzIGxvbmcgYW5kIHRoZSBsb25nZXN0IGxpdGVyYWwvbGVuZ3RoXAotICogICBjb2RlIGlzIG5pbmUgYml0cy4gIFRoZXJlZm9yZSB0aGUgY29kZSBtdXN0IGJlIGNvbnN0cnVjdGVkIHdpdGggdGhvc2UKLSAqICAgc3ltYm9scywgYW5kIHRoZSBpbnZhbGlkIHN5bWJvbHMgbXVzdCBiZSBkZXRlY3RlZCBhZnRlciBkZWNvZGluZy4KLSAqCi0gKiAtIFRoZSBmaXhlZCBkaXN0YW5jZSBjb2RlcyBhbHNvIGhhdmUgdHdvIGludmFsaWQgc3ltYm9scyB0aGF0IHNob3VsZCByZXN1bHQKLSAqICAgaW4gYW4gZXJyb3IgaWYgcmVjZWl2ZWQuICBTaW5jZSBhbGwgb2YgdGhlIGRpc3RhbmNlIGNvZGVzIGFyZSB0aGUgc2FtZQotICogICBsZW5ndGgsIHRoaXMgY2FuIGJlIGltcGxlbWVudGVkIGFzIGFuIGluY29tcGxldGUgY29kZS4gIFRoZW4gdGhlIGludmFsaWQKLSAqICAgY29kZXMgYXJlIGRldGVjdGVkIHdoaWxlIGRlY29kaW5nLgotICovCi1sb2NhbCBpbnQgZml4ZWQoc3RydWN0IHN0YXRlICpzKQotewotICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsKLSAgICBzdGF0aWMgc2hvcnQgbGVuY250W01BWEJJVFMrMV0sIGxlbnN5bVtGSVhMQ09ERVNdOwotICAgIHN0YXRpYyBzaG9ydCBkaXN0Y250W01BWEJJVFMrMV0sIGRpc3RzeW1bTUFYRENPREVTXTsKLSAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gbGVuY29kZSA9IHtsZW5jbnQsIGxlbnN5bX07Ci0gICAgc3RhdGljIHN0cnVjdCBodWZmbWFuIGRpc3Rjb2RlID0ge2Rpc3RjbnQsIGRpc3RzeW19OwotCi0gICAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi8KLSAgICBpZiAodmlyZ2luKSB7Ci0gICAgICAgIGludCBzeW1ib2w7Ci0gICAgICAgIHNob3J0IGxlbmd0aHNbRklYTENPREVTXTsKLQotICAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqLwotICAgICAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IDE0NDsgc3ltYm9sKyspCi0gICAgICAgICAgICBsZW5ndGhzW3N5bWJvbF0gPSA4OwotICAgICAgICBmb3IgKDsgc3ltYm9sIDwgMjU2OyBzeW1ib2wrKykKLSAgICAgICAgICAgIGxlbmd0aHNbc3ltYm9sXSA9IDk7Ci0gICAgICAgIGZvciAoOyBzeW1ib2wgPCAyODA7IHN5bWJvbCsrKQotICAgICAgICAgICAgbGVuZ3Roc1tzeW1ib2xdID0gNzsKLSAgICAgICAgZm9yICg7IHN5bWJvbCA8IEZJWExDT0RFUzsgc3ltYm9sKyspCi0gICAgICAgICAgICBsZW5ndGhzW3N5bWJvbF0gPSA4OwotICAgICAgICBjb25zdHJ1Y3QoJmxlbmNvZGUsIGxlbmd0aHMsIEZJWExDT0RFUyk7Ci0KLSAgICAgICAgLyogZGlzdGFuY2UgdGFibGUgKi8KLSAgICAgICAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBNQVhEQ09ERVM7IHN5bWJvbCsrKQotICAgICAgICAgICAgbGVuZ3Roc1tzeW1ib2xdID0gNTsKLSAgICAgICAgY29uc3RydWN0KCZkaXN0Y29kZSwgbGVuZ3RocywgTUFYRENPREVTKTsKLQotICAgICAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqLwotICAgICAgICB2aXJnaW4gPSAwOwotICAgIH0KLQotICAgIC8qIGRlY29kZSBkYXRhIHVudGlsIGVuZC1vZi1ibG9jayBjb2RlICovCi0gICAgcmV0dXJuIGNvZGVzKHMsICZsZW5jb2RlLCAmZGlzdGNvZGUpOwotfQotCi0vKgotICogUHJvY2VzcyBhIGR5bmFtaWMgY29kZXMgYmxvY2suCi0gKgotICogRm9ybWF0IG5vdGVzOgotICoKLSAqIC0gQSBkeW5hbWljIGJsb2NrIHN0YXJ0cyB3aXRoIGEgZGVzY3JpcHRpb24gb2YgdGhlIGxpdGVyYWwvbGVuZ3RoIGFuZAotICogICBkaXN0YW5jZSBjb2RlcyBmb3IgdGhhdCBibG9jay4gIE5ldyBkeW5hbWljIGJsb2NrcyBhbGxvdyB0aGUgY29tcHJlc3NvciB0bwotICogICByYXBpZGx5IGFkYXB0IHRvIGNoYW5naW5nIGRhdGEgd2l0aCBuZXcgY29kZXMgb3B0aW1pemVkIGZvciB0aGF0IGRhdGEuCi0gKgotICogLSBUaGUgY29kZXMgdXNlZCBieSB0aGUgZGVmbGF0ZSBmb3JtYXQgYXJlICJjYW5vbmljYWwiLCB3aGljaCBtZWFucyB0aGF0Ci0gKiAgIHRoZSBhY3R1YWwgYml0cyBvZiB0aGUgY29kZXMgYXJlIGdlbmVyYXRlZCBpbiBhbiB1bmFtYmlndW91cyB3YXkgc2ltcGx5Ci0gKiAgIGZyb20gdGhlIG51bWJlciBvZiBiaXRzIGluIGVhY2ggY29kZS4gIFRoZXJlZm9yZSB0aGUgY29kZSBkZXNjcmlwdGlvbnMKLSAqICAgYXJlIHNpbXBseSBhIGxpc3Qgb2YgY29kZSBsZW5ndGhzIGZvciBlYWNoIHN5bWJvbC4KLSAqCi0gKiAtIFRoZSBjb2RlIGxlbmd0aHMgYXJlIHN0b3JlZCBpbiBvcmRlciBmb3IgdGhlIHN5bWJvbHMsIHNvIGxlbmd0aHMgYXJlCi0gKiAgIHByb3ZpZGVkIGZvciBlYWNoIG9mIHRoZSBsaXRlcmFsL2xlbmd0aCBzeW1ib2xzLCBhbmQgZm9yIGVhY2ggb2YgdGhlCi0gKiAgIGRpc3RhbmNlIHN5bWJvbHMuCi0gKgotICogLSBJZiBhIHN5bWJvbCBpcyBub3QgdXNlZCBpbiB0aGUgYmxvY2ssIHRoaXMgaXMgcmVwcmVzZW50ZWQgYnkgYSB6ZXJvIGFzCi0gKiAgIGFzIHRoZSBjb2RlIGxlbmd0aC4gIFRoaXMgZG9lcyBub3QgbWVhbiBhIHplcm8tbGVuZ3RoIGNvZGUsIGJ1dCByYXRoZXIKLSAqICAgdGhhdCBubyBjb2RlIHNob3VsZCBiZSBjcmVhdGVkIGZvciB0aGlzIHN5bWJvbC4gIFRoZXJlIGlzIG5vIHdheSBpbiB0aGUKLSAqICAgZGVmbGF0ZSBmb3JtYXQgdG8gcmVwcmVzZW50IGEgemVyby1sZW5ndGggY29kZS4KLSAqCi0gKiAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGluIGEgY29kZSBpcyAxNSwgc28gdGhlIHBvc3NpYmxlIGxlbmd0aHMgZm9yCi0gKiAgIGFueSBjb2RlIGFyZSAxLi4xNS4KLSAqCi0gKiAtIFRoZSBmYWN0IHRoYXQgYSBsZW5ndGggb2YgemVybyBpcyBub3QgcGVybWl0dGVkIGZvciBhIGNvZGUgaGFzIGFuCi0gKiAgIGludGVyZXN0aW5nIGNvbnNlcXVlbmNlLiAgTm9ybWFsbHkgaWYgb25seSBvbmUgc3ltYm9sIGlzIHVzZWQgZm9yIGEgZ2l2ZW4KLSAqICAgY29kZSwgdGhlbiBpbiBmYWN0IHRoYXQgY29kZSBjb3VsZCBiZSByZXByZXNlbnRlZCB3aXRoIHplcm8gYml0cy4gIEhvd2V2ZXIKLSAqICAgaW4gZGVmbGF0ZSwgdGhhdCBjb2RlIGhhcyB0byBiZSBhdCBsZWFzdCBvbmUgYml0LiAgU28gZm9yIGV4YW1wbGUsIGlmCi0gKiAgIG9ubHkgYSBzaW5nbGUgZGlzdGFuY2UgYmFzZSBzeW1ib2wgYXBwZWFycyBpbiBhIGJsb2NrLCB0aGVuIGl0IHdpbGwgYmUKLSAqICAgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgY29kZSBvZiBsZW5ndGggb25lLCBpbiBwYXJ0aWN1bGFyIG9uZSAwIGJpdC4gIFRoaXMKLSAqICAgaXMgYW4gaW5jb21wbGV0ZSBjb2RlLCBzaW5jZSBpZiBhIDEgYml0IGlzIHJlY2VpdmVkLCBpdCBoYXMgbm8gbWVhbmluZywKLSAqICAgYW5kIHNob3VsZCByZXN1bHQgaW4gYW4gZXJyb3IuICBTbyBpbmNvbXBsZXRlIGRpc3RhbmNlIGNvZGVzIG9mIG9uZSBzeW1ib2wKLSAqICAgc2hvdWxkIGJlIHBlcm1pdHRlZCwgYW5kIHRoZSByZWNlaXB0IG9mIGludmFsaWQgY29kZXMgc2hvdWxkIGJlIGhhbmRsZWQuCi0gKgotICogLSBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGhhdmUgYSBzaW5nbGUgbGl0ZXJhbC9sZW5ndGggY29kZSwgYnV0IHRoYXQgY29kZQotICogICBtdXN0IGJlIHRoZSBlbmQtb2YtYmxvY2sgY29kZSwgc2luY2UgZXZlcnkgZHluYW1pYyBibG9jayBoYXMgb25lLiAgVGhpcwotICogICBpcyBub3QgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBjcmVhdGUgYW4gZW1wdHkgYmxvY2sgKGFuIGVtcHR5IGZpeGVkCi0gKiAgIGJsb2NrIGlzIGZld2VyIGJpdHMpLCBidXQgaXQgaXMgYWxsb3dlZCBieSB0aGUgZm9ybWF0LiAgU28gaW5jb21wbGV0ZQotICogICBsaXRlcmFsL2xlbmd0aCBjb2RlcyBvZiBvbmUgc3ltYm9sIHNob3VsZCBhbHNvIGJlIHBlcm1pdHRlZC4KLSAqCi0gKiAtIElmIHRoZXJlIGFyZSBvbmx5IGxpdGVyYWwgY29kZXMgYW5kIG5vIGxlbmd0aHMsIHRoZW4gdGhlcmUgYXJlIG5vIGRpc3RhbmNlCi0gKiAgIGNvZGVzLiAgVGhpcyBpcyByZXByZXNlbnRlZCBieSBvbmUgZGlzdGFuY2UgY29kZSB3aXRoIHplcm8gYml0cy4KLSAqCi0gKiAtIFRoZSBsaXN0IG9mIHVwIHRvIDI4NiBsZW5ndGgvbGl0ZXJhbCBsZW5ndGhzIGFuZCB1cCB0byAzMCBkaXN0YW5jZSBsZW5ndGhzCi0gKiAgIGFyZSB0aGVtc2VsdmVzIGNvbXByZXNzZWQgdXNpbmcgSHVmZm1hbiBjb2RlcyBhbmQgcnVuLWxlbmd0aCBlbmNvZGluZy4gIEluCi0gKiAgIHRoZSBsaXN0IG9mIGNvZGUgbGVuZ3RocywgYSAwIHN5bWJvbCBtZWFucyBubyBjb2RlLCBhIDEuLjE1IHN5bWJvbCBtZWFucwotICogICB0aGF0IGxlbmd0aCwgYW5kIHRoZSBzeW1ib2xzIDE2LCAxNywgYW5kIDE4IGFyZSBydW4tbGVuZ3RoIGluc3RydWN0aW9ucy4KLSAqICAgRWFjaCBvZiAxNiwgMTcsIGFuZCAxOCBhcmUgZm9sbHdlZCBieSBleHRyYSBiaXRzIHRvIGRlZmluZSB0aGUgbGVuZ3RoIG9mCi0gKiAgIHRoZSBydW4uICAxNiBjb3BpZXMgdGhlIGxhc3QgbGVuZ3RoIDMgdG8gNiB0aW1lcy4gIDE3IHJlcHJlc2VudHMgMyB0byAxMAotICogICB6ZXJvIGxlbmd0aHMsIGFuZCAxOCByZXByZXNlbnRzIDExIHRvIDEzOCB6ZXJvIGxlbmd0aHMuICBVbnVzZWQgc3ltYm9scwotICogICBhcmUgY29tbW9uLCBoZW5jZSB0aGUgc3BlY2lhbCBjb2RpbmcgZm9yIHplcm8gbGVuZ3Rocy4KLSAqCi0gKiAtIFRoZSBzeW1ib2xzIGZvciAwLi4xOCBhcmUgSHVmZm1hbiBjb2RlZCwgYW5kIHNvIHRoYXQgY29kZSBtdXN0IGJlCi0gKiAgIGRlc2NyaWJlZCBmaXJzdC4gIFRoaXMgaXMgc2ltcGx5IGEgc2VxdWVuY2Ugb2YgdXAgdG8gMTkgdGhyZWUtYml0IHZhbHVlcwotICogICByZXByZXNlbnRpbmcgbm8gY29kZSAoMCkgb3IgdGhlIGNvZGUgbGVuZ3RoIGZvciB0aGF0IHN5bWJvbCAoMS4uNykuCi0gKgotICogLSBBIGR5bmFtaWMgYmxvY2sgc3RhcnRzIHdpdGggdGhyZWUgZml4ZWQtc2l6ZSBjb3VudHMgZnJvbSB3aGljaCBpcyBjb21wdXRlZAotICogICB0aGUgbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGUgbGVuZ3RocywgdGhlIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlCi0gKiAgIGxlbmd0aHMsIGFuZCB0aGUgbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAob2ssIHlvdSBjb21lIHVwIHdpdGgKLSAqICAgYSBiZXR0ZXIgbmFtZSEpIGluIHRoZSBjb2RlIGRlc2NyaXB0aW9ucy4gIEZvciB0aGUgbGl0ZXJhbC9sZW5ndGggYW5kCi0gKiAgIGRpc3RhbmNlIGNvZGVzLCBsZW5ndGhzIGFmdGVyIHRob3NlIHByb3ZpZGVkIGFyZSBjb25zaWRlcmVkIHplcm8sIGkuZS4gbm8KLSAqICAgY29kZS4gIFRoZSBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgYXJlIHJlY2VpdmVkIGluIGEgcGVybXV0ZWQgb3JkZXIgKHNlZQotICogICB0aGUgb3JkZXJbXSBhcnJheSBiZWxvdykgdG8gbWFrZSBhIHNob3J0IGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RoIGxpc3QgbW9yZQotICogICBsaWtlbHkuICBBcyBpdCB0dXJucyBvdXQsIHZlcnkgc2hvcnQgYW5kIHZlcnkgbG9uZyBjb2RlcyBhcmUgbGVzcyBsaWtlbHkKLSAqICAgdG8gYmUgc2VlbiBpbiBhIGR5bmFtaWMgY29kZSBkZXNjcmlwdGlvbiwgaGVuY2Ugd2hhdCBtYXkgYXBwZWFyIGluaXRpYWxseQotICogICB0byBiZSBhIHBlY3VsaWFyIG9yZGVyaW5nLgotICoKLSAqIC0gR2l2ZW4gdGhlIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlIGxlbmd0aHMgKG5sZW4pIGFuZCBkaXN0YW5jZSBjb2RlCi0gKiAgIGxlbmd0aHMgKG5kaXN0KSwgdGhlbiB0aGV5IGFyZSB0cmVhdGVkIGFzIG9uZSBsb25nIGxpc3Qgb2YgbmxlbiArIG5kaXN0Ci0gKiAgIGNvZGUgbGVuZ3Rocy4gIFRoZXJlZm9yZSBydW4tbGVuZ3RoIGNvZGluZyBjYW4gYW5kIG9mdGVuIGRvZXMgY3Jvc3MgdGhlCi0gKiAgIGJvdW5kYXJ5IGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIGxlbmd0aHMuCi0gKgotICogLSBTbyB0byBzdW1tYXJpemUsIHRoZSBjb2RlIGRlc2NyaXB0aW9uIGF0IHRoZSBzdGFydCBvZiBhIGR5bmFtaWMgYmxvY2sgaXMKLSAqICAgdGhyZWUgY291bnRzIGZvciB0aGUgbnVtYmVyIG9mIGNvZGUgbGVuZ3RocyBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIGNvZGVzLAotICogICB0aGUgZGlzdGFuY2UgY29kZXMsIGFuZCB0aGUgY29kZSBsZW5ndGggY29kZXMuICBUaGlzIGlzIGZvbGxvd2VkIGJ5IHRoZQotICogICBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMsIHRocmVlIGJpdHMgZWFjaC4gIFRoaXMgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlCi0gKiAgIGNvZGUgbGVuZ3RoIGNvZGUgd2hpY2ggaXMgdXNlZCB0byByZWFkIHRoZSByZW1haW5kZXIgb2YgdGhlIGxlbmd0aHMuICBUaGVuCi0gKiAgIHRoZSBsaXRlcmFsL2xlbmd0aCBjb2RlIGxlbmd0aHMgYW5kIGRpc3RhbmNlIGxlbmd0aHMgYXJlIHJlYWQgYXMgYSBzaW5nbGUKLSAqICAgc2V0IG9mIGxlbmd0aHMgdXNpbmcgdGhlIGNvZGUgbGVuZ3RoIGNvZGVzLiAgQ29kZXMgYXJlIGNvbnN0cnVjdGVkIGZyb20KLSAqICAgdGhlIHJlc3VsdGluZyB0d28gc2V0cyBvZiBsZW5ndGhzLCBhbmQgdGhlbiBmaW5hbGx5IHlvdSBjYW4gc3RhcnQKLSAqICAgZGVjb2RpbmcgYWN0dWFsIGNvbXByZXNzZWQgZGF0YSBpbiB0aGUgYmxvY2suCi0gKgotICogLSBGb3IgcmVmZXJlbmNlLCBhICJ0eXBpY2FsIiBzaXplIGZvciB0aGUgY29kZSBkZXNjcmlwdGlvbiBpbiBhIGR5bmFtaWMKLSAqICAgYmxvY2sgaXMgYXJvdW5kIDgwIGJ5dGVzLgotICovCi1sb2NhbCBpbnQgZHluYW1pYyhzdHJ1Y3Qgc3RhdGUgKnMpCi17Ci0gICAgaW50IG5sZW4sIG5kaXN0LCBuY29kZTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aHMgaW4gZGVzY3JpcHRvciAqLwotICAgIGludCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGxlbmd0aHNbXSAqLwotICAgIGludCBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0cnVjdCgpIHJldHVybiB2YWx1ZSAqLwotICAgIHNob3J0IGxlbmd0aHNbTUFYQ09ERVNdOyAgICAgICAgICAgIC8qIGRlc2NyaXB0b3IgY29kZSBsZW5ndGhzICovCi0gICAgc2hvcnQgbGVuY250W01BWEJJVFMrMV0sIGxlbnN5bVtNQVhMQ09ERVNdOyAgICAgICAgIC8qIGxlbmNvZGUgbWVtb3J5ICovCi0gICAgc2hvcnQgZGlzdGNudFtNQVhCSVRTKzFdLCBkaXN0c3ltW01BWERDT0RFU107ICAgICAgIC8qIGRpc3Rjb2RlIG1lbW9yeSAqLwotICAgIHN0cnVjdCBodWZmbWFuIGxlbmNvZGUgPSB7bGVuY250LCBsZW5zeW19OyAgICAgICAgICAvKiBsZW5ndGggY29kZSAqLwotICAgIHN0cnVjdCBodWZmbWFuIGRpc3Rjb2RlID0ge2Rpc3RjbnQsIGRpc3RzeW19OyAgICAgICAvKiBkaXN0YW5jZSBjb2RlICovCi0gICAgc3RhdGljIGNvbnN0IHNob3J0IG9yZGVyWzE5XSA9ICAgICAgLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGggY29kZXMgKi8KLSAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OwotCi0gICAgLyogZ2V0IG51bWJlciBvZiBsZW5ndGhzIGluIGVhY2ggdGFibGUsIGNoZWNrIGxlbmd0aHMgKi8KLSAgICBubGVuID0gYml0cyhzLCA1KSArIDI1NzsKLSAgICBuZGlzdCA9IGJpdHMocywgNSkgKyAxOwotICAgIG5jb2RlID0gYml0cyhzLCA0KSArIDQ7Ci0gICAgaWYgKG5sZW4gPiBNQVhMQ09ERVMgfHwgbmRpc3QgPiBNQVhEQ09ERVMpCi0gICAgICAgIHJldHVybiAtMzsgICAgICAgICAgICAgICAgICAgICAgLyogYmFkIGNvdW50cyAqLwotCi0gICAgLyogcmVhZCBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKHJlYWxseSksIG1pc3NpbmcgbGVuZ3RocyBhcmUgemVybyAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5jb2RlOyBpbmRleCsrKQotICAgICAgICBsZW5ndGhzW29yZGVyW2luZGV4XV0gPSBiaXRzKHMsIDMpOwotICAgIGZvciAoOyBpbmRleCA8IDE5OyBpbmRleCsrKQotICAgICAgICBsZW5ndGhzW29yZGVyW2luZGV4XV0gPSAwOwotCi0gICAgLyogYnVpbGQgaHVmZm1hbiB0YWJsZSBmb3IgY29kZSBsZW5ndGhzIGNvZGVzICh1c2UgbGVuY29kZSB0ZW1wb3JhcmlseSkgKi8KLSAgICBlcnIgPSBjb25zdHJ1Y3QoJmxlbmNvZGUsIGxlbmd0aHMsIDE5KTsKLSAgICBpZiAoZXJyICE9IDApIHJldHVybiAtNDsgICAgICAgICAgICAvKiByZXF1aXJlIGNvbXBsZXRlIGNvZGUgc2V0IGhlcmUgKi8KLQotICAgIC8qIHJlYWQgbGVuZ3RoL2xpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RoIHRhYmxlcyAqLwotICAgIGluZGV4ID0gMDsKLSAgICB3aGlsZSAoaW5kZXggPCBubGVuICsgbmRpc3QpIHsKLSAgICAgICAgaW50IHN5bWJvbDsgICAgICAgICAgICAgLyogZGVjb2RlZCB2YWx1ZSAqLwotICAgICAgICBpbnQgbGVuOyAgICAgICAgICAgICAgICAvKiBsYXN0IGxlbmd0aCB0byByZXBlYXQgKi8KLQotICAgICAgICBzeW1ib2wgPSBkZWNvZGUocywgJmxlbmNvZGUpOwotICAgICAgICBpZiAoc3ltYm9sIDwgMTYpICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBpbiAwLi4xNSAqLwotICAgICAgICAgICAgbGVuZ3Roc1tpbmRleCsrXSA9IHN5bWJvbDsKLSAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXBlYXQgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgICAgICAgIGxlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bWUgcmVwZWF0aW5nIHplcm9zICovCi0gICAgICAgICAgICBpZiAoc3ltYm9sID09IDE2KSB7ICAgICAgICAgLyogcmVwZWF0IGxhc3QgbGVuZ3RoIDMuLjYgdGltZXMgKi8KLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkgcmV0dXJuIC01OyAgICAgIC8qIG5vIGxhc3QgbGVuZ3RoISAqLwotICAgICAgICAgICAgICAgIGxlbiA9IGxlbmd0aHNbaW5kZXggLSAxXTsgICAgICAgLyogbGFzdCBsZW5ndGggKi8KLSAgICAgICAgICAgICAgICBzeW1ib2wgPSAzICsgYml0cyhzLCAyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN5bWJvbCA9PSAxNykgICAgICAvKiByZXBlYXQgemVybyAzLi4xMCB0aW1lcyAqLwotICAgICAgICAgICAgICAgIHN5bWJvbCA9IDMgKyBiaXRzKHMsIDMpOwotICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8qID09IDE4LCByZXBlYXQgemVybyAxMS4uMTM4IHRpbWVzICovCi0gICAgICAgICAgICAgICAgc3ltYm9sID0gMTEgKyBiaXRzKHMsIDcpOwotICAgICAgICAgICAgaWYgKGluZGV4ICsgc3ltYm9sID4gbmxlbiArIG5kaXN0KQotICAgICAgICAgICAgICAgIHJldHVybiAtNjsgICAgICAgICAgICAgIC8qIHRvbyBtYW55IGxlbmd0aHMhICovCi0gICAgICAgICAgICB3aGlsZSAoc3ltYm9sLS0pICAgICAgICAgICAgLyogcmVwZWF0IGxhc3Qgb3IgemVybyBzeW1ib2wgdGltZXMgKi8KLSAgICAgICAgICAgICAgICBsZW5ndGhzW2luZGV4KytdID0gbGVuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogYnVpbGQgaHVmZm1hbiB0YWJsZSBmb3IgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KLSAgICBlcnIgPSBjb25zdHJ1Y3QoJmxlbmNvZGUsIGxlbmd0aHMsIG5sZW4pOwotICAgIGlmIChlcnIgPCAwIHx8IChlcnIgPiAwICYmIG5sZW4gLSBsZW5jb2RlLmNvdW50WzBdICE9IDEpKQotICAgICAgICByZXR1cm4gLTc7ICAgICAgLyogb25seSBhbGxvdyBpbmNvbXBsZXRlIGNvZGVzIGlmIGp1c3Qgb25lIGNvZGUgKi8KLQotICAgIC8qIGJ1aWxkIGh1ZmZtYW4gdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovCi0gICAgZXJyID0gY29uc3RydWN0KCZkaXN0Y29kZSwgbGVuZ3RocyArIG5sZW4sIG5kaXN0KTsKLSAgICBpZiAoZXJyIDwgMCB8fCAoZXJyID4gMCAmJiBuZGlzdCAtIGRpc3Rjb2RlLmNvdW50WzBdICE9IDEpKQotICAgICAgICByZXR1cm4gLTg7ICAgICAgLyogb25seSBhbGxvdyBpbmNvbXBsZXRlIGNvZGVzIGlmIGp1c3Qgb25lIGNvZGUgKi8KLQotICAgIC8qIGRlY29kZSBkYXRhIHVudGlsIGVuZC1vZi1ibG9jayBjb2RlICovCi0gICAgcmV0dXJuIGNvZGVzKHMsICZsZW5jb2RlLCAmZGlzdGNvZGUpOwotfQotCi0vKgotICogSW5mbGF0ZSBzb3VyY2UgdG8gZGVzdC4gIE9uIHJldHVybiwgZGVzdGxlbiBhbmQgc291cmNlbGVuIGFyZSB1cGRhdGVkIHRvIHRoZQotICogc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYW5kIHRoZSBzaXplIG9mIHRoZSBkZWZsYXRlIGRhdGEgcmVzcGVjdGl2ZWx5LgotICogT24gc3VjY2VzcywgdGhlIHJldHVybiB2YWx1ZSBvZiBwdWZmKCkgaXMgemVyby4gIElmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZQotICogc291cmNlIGRhdGEsIGkuZS4gaXQgaXMgbm90IGluIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlbiBhIG5lZ2F0aXZlIHZhbHVlIGlzCi0gKiByZXR1cm5lZC4gIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggaW5wdXQgYXZhaWxhYmxlIG9yIHRoZXJlIGlzIG5vdCBlbm91Z2gKLSAqIG91dHB1dCBzcGFjZSwgdGhlbiBhIHBvc2l0aXZlIGVycm9yIGlzIHJldHVybmVkLiAgSW4gdGhhdCBjYXNlLCBkZXN0bGVuIGFuZAotICogc291cmNlbGVuIGFyZSBub3QgdXBkYXRlZCB0byBmYWNpbGl0YXRlIHJldHJ5aW5nIGZyb20gdGhlIGJlZ2lubmluZyB3aXRoIHRoZQotICogcHJvdmlzaW9uIG9mIG1vcmUgaW5wdXQgZGF0YSBvciBtb3JlIG91dHB1dCBzcGFjZS4gIEluIHRoZSBjYXNlIG9mIGludmFsaWQKLSAqIGluZmxhdGUgZGF0YSAoYSBuZWdhdGl2ZSBlcnJvciksIHRoZSBkZXN0IGFuZCBzb3VyY2UgcG9pbnRlcnMgYXJlIHVwZGF0ZWQgdG8KLSAqIGZhY2lsaXRhdGUgdGhlIGRlYnVnZ2luZyBvZiBkZWZsYXRvcnMuCi0gKgotICogcHVmZigpIGFsc28gaGFzIGEgbW9kZSB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2l0aAotICogbm8gb3V0cHV0IHdyaXR0ZW4uICBGb3IgdGhpcyBkZXN0IG11c3QgYmUgKHVuc2lnbmVkIGNoYXIgKikwLiAgSW4gdGhpcyBjYXNlLAotICogdGhlIGlucHV0IHZhbHVlIG9mICpkZXN0bGVuIGlzIGlnbm9yZWQsIGFuZCBvbiByZXR1cm4gKmRlc3RsZW4gaXMgc2V0IHRvIHRoZQotICogc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIG91dHB1dC4KLSAqCi0gKiBUaGUgcmV0dXJuIGNvZGVzIGFyZToKLSAqCi0gKiAgIDI6ICBhdmFpbGFibGUgaW5mbGF0ZSBkYXRhIGRpZCBub3QgdGVybWluYXRlCi0gKiAgIDE6ICBvdXRwdXQgc3BhY2UgZXhoYXVzdGVkIGJlZm9yZSBjb21wbGV0aW5nIGluZmxhdGUKLSAqICAgMDogIHN1Y2Nlc3NmdWwgaW5mbGF0ZQotICogIC0xOiAgaW52YWxpZCBibG9jayB0eXBlICh0eXBlID09IDMpCi0gKiAgLTI6ICBzdG9yZWQgYmxvY2sgbGVuZ3RoIGRpZCBub3QgbWF0Y2ggb25lJ3MgY29tcGxlbWVudAotICogIC0zOiAgZHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiB0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2UgY29kZXMKLSAqICAtNDogIGR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogY29kZSBsZW5ndGhzIGNvZGVzIGluY29tcGxldGUKLSAqICAtNTogIGR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogcmVwZWF0IGxlbmd0aHMgd2l0aCBubyBmaXJzdCBsZW5ndGgKLSAqICAtNjogIGR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogcmVwZWF0IG1vcmUgdGhhbiBzcGVjaWZpZWQgbGVuZ3RocwotICogIC03OiAgZHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUgbGVuZ3RocwotICogIC04OiAgZHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiBpbnZhbGlkIGRpc3RhbmNlIGNvZGUgbGVuZ3RocwotICogIC05OiAgaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBvciBkaXN0YW5jZSBjb2RlIGluIGZpeGVkIG9yIGR5bmFtaWMgYmxvY2sKLSAqIC0xMDogIGRpc3RhbmNlIGlzIHRvbyBmYXIgYmFjayBpbiBmaXhlZCBvciBkeW5hbWljIGJsb2NrCi0gKgotICogRm9ybWF0IG5vdGVzOgotICoKLSAqIC0gVGhyZWUgYml0cyBhcmUgcmVhZCBmb3IgZWFjaCBibG9jayB0byBkZXRlcm1pbmUgdGhlIGtpbmQgb2YgYmxvY2sgYW5kCi0gKiAgIHdoZXRoZXIgb3Igbm90IGl0IGlzIHRoZSBsYXN0IGJsb2NrLiAgVGhlbiB0aGUgYmxvY2sgaXMgZGVjb2RlZCBhbmQgdGhlCi0gKiAgIHByb2Nlc3MgcmVwZWF0ZWQgaWYgaXQgd2FzIG5vdCB0aGUgbGFzdCBibG9jay4KLSAqCi0gKiAtIFRoZSBsZWZ0b3ZlciBiaXRzIGluIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGRlZmxhdGUgZGF0YSBhZnRlciB0aGUgbGFzdAotICogICBibG9jayAoaWYgaXQgd2FzIGEgZml4ZWQgb3IgZHluYW1pYyBibG9jaykgYXJlIHVuZGVmaW5lZCBhbmQgaGF2ZSBubwotICogICBleHBlY3RlZCB2YWx1ZXMgdG8gY2hlY2suCi0gKi8KLWludCBwdWZmKHVuc2lnbmVkIGNoYXIgKmRlc3QsICAgICAgICAgICAvKiBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KLSAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmRlc3RsZW4sICAgICAgICAvKiBhbW91bnQgb2Ygb3V0cHV0IHNwYWNlICovCi0gICAgICAgICB1bnNpZ25lZCBjaGFyICpzb3VyY2UsICAgICAgICAgLyogcG9pbnRlciB0byBzb3VyY2UgZGF0YSBwb2ludGVyICovCi0gICAgICAgICB1bnNpZ25lZCBsb25nICpzb3VyY2VsZW4pICAgICAgLyogYW1vdW50IG9mIGlucHV0IGF2YWlsYWJsZSAqLwotewotICAgIHN0cnVjdCBzdGF0ZSBzOyAgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgc3RhdGUgKi8KLSAgICBpbnQgbGFzdCwgdHlwZTsgICAgICAgICAgICAgLyogYmxvY2sgaW5mb3JtYXRpb24gKi8KLSAgICBpbnQgZXJyOyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHZhbHVlICovCi0KLSAgICAvKiBpbml0aWFsaXplIG91dHB1dCBzdGF0ZSAqLwotICAgIHMub3V0ID0gZGVzdDsKLSAgICBzLm91dGxlbiA9ICpkZXN0bGVuOyAgICAgICAgICAgICAgICAvKiBpZ25vcmVkIGlmIGRlc3QgaXMgTklMICovCi0gICAgcy5vdXRjbnQgPSAwOwotCi0gICAgLyogaW5pdGlhbGl6ZSBpbnB1dCBzdGF0ZSAqLwotICAgIHMuaW4gPSBzb3VyY2U7Ci0gICAgcy5pbmxlbiA9ICpzb3VyY2VsZW47Ci0gICAgcy5pbmNudCA9IDA7Ci0gICAgcy5iaXRidWYgPSAwOwotICAgIHMuYml0Y250ID0gMDsKLQotICAgIC8qIHJldHVybiBpZiBiaXRzKCkgb3IgZGVjb2RlKCkgdHJpZXMgdG8gcmVhZCBwYXN0IGF2YWlsYWJsZSBpbnB1dCAqLwotICAgIGlmIChzZXRqbXAocy5lbnYpICE9IDApICAgICAgICAgICAgIC8qIGlmIGNhbWUgYmFjayBoZXJlIHZpYSBsb25nam1wKCkgKi8KLSAgICAgICAgZXJyID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNraXAgZG8tbG9vcCwgcmV0dXJuIGVycm9yICovCi0gICAgZWxzZSB7Ci0gICAgICAgIC8qIHByb2Nlc3MgYmxvY2tzIHVudGlsIGxhc3QgYmxvY2sgb3IgZXJyb3IgKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgbGFzdCA9IGJpdHMoJnMsIDEpOyAgICAgICAgIC8qIG9uZSBpZiBsYXN0IGJsb2NrICovCi0gICAgICAgICAgICB0eXBlID0gYml0cygmcywgMik7ICAgICAgICAgLyogYmxvY2sgdHlwZSAwLi4zICovCi0gICAgICAgICAgICBlcnIgPSB0eXBlID09IDAgPyBzdG9yZWQoJnMpIDoKLSAgICAgICAgICAgICAgICAgICh0eXBlID09IDEgPyBmaXhlZCgmcykgOgotICAgICAgICAgICAgICAgICAgICh0eXBlID09IDIgPyBkeW5hbWljKCZzKSA6Ci0gICAgICAgICAgICAgICAgICAgIC0xKSk7ICAgICAgICAgICAgICAgLyogdHlwZSA9PSAzLCBpbnZhbGlkICovCi0gICAgICAgICAgICBpZiAoZXJyICE9IDApIGJyZWFrOyAgICAgICAgLyogcmV0dXJuIHdpdGggZXJyb3IgKi8KLSAgICAgICAgfSB3aGlsZSAoIWxhc3QpOwotICAgIH0KLQotICAgIC8qIHVwZGF0ZSB0aGUgbGVuZ3RocyBhbmQgcmV0dXJuICovCi0gICAgaWYgKGVyciA8PSAwKSB7Ci0gICAgICAgICpkZXN0bGVuID0gcy5vdXRjbnQ7Ci0gICAgICAgICpzb3VyY2VsZW4gPSBzLmluY250OwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi0jaWZkZWYgVEVTVAotLyogRXhhbXBsZSBvZiBob3cgdG8gdXNlIHB1ZmYoKSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotbG9jYWwgdW5zaWduZWQgY2hhciAqeWFuayhjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpsZW4pCi17Ci0gICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKLSAgICBGSUxFICppbjsKLSAgICBzdHJ1Y3Qgc3RhdCBzOwotCi0gICAgKmxlbiA9IDA7Ci0gICAgaWYgKHN0YXQobmFtZSwgJnMpKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoKHMuc3RfbW9kZSAmIFNfSUZNVCkgIT0gU19JRlJFRykgcmV0dXJuIE5VTEw7Ci0gICAgc2l6ZSA9ICh1bnNpZ25lZCBsb25nKShzLnN0X3NpemUpOwotICAgIGlmIChzaXplID09IDAgfHwgKG9mZl90KXNpemUgIT0gcy5zdF9zaXplKSByZXR1cm4gTlVMTDsKLSAgICBpbiA9IGZvcGVuKG5hbWUsICJyIik7Ci0gICAgaWYgKGluID09IE5VTEwpIHJldHVybiBOVUxMOwotICAgIGJ1ZiA9IG1hbGxvYyhzaXplKTsKLSAgICBpZiAoYnVmICE9IE5VTEwgJiYgZnJlYWQoYnVmLCAxLCBzaXplLCBpbikgIT0gc2l6ZSkgewotICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgIGJ1ZiA9IE5VTEw7Ci0gICAgfQotICAgIGZjbG9zZShpbik7Ci0gICAgKmxlbiA9IHNpemU7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCByZXQ7Ci0gICAgdW5zaWduZWQgY2hhciAqc291cmNlOwotICAgIHVuc2lnbmVkIGxvbmcgbGVuLCBzb3VyY2VsZW4sIGRlc3RsZW47Ci0KLSAgICBpZiAoYXJnYyA8IDIpIHJldHVybiAyOwotICAgIHNvdXJjZSA9IHlhbmsoYXJndlsxXSwgJmxlbik7Ci0gICAgaWYgKHNvdXJjZSA9PSBOVUxMKSByZXR1cm4gMjsKLSAgICBzb3VyY2VsZW4gPSBsZW47Ci0gICAgcmV0ID0gcHVmZihOSUwsICZkZXN0bGVuLCBzb3VyY2UsICZzb3VyY2VsZW4pOwotICAgIGlmIChyZXQpCi0gICAgICAgIHByaW50ZigicHVmZigpIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICVkXG4iLCByZXQpOwotICAgIGVsc2UgewotICAgICAgICBwcmludGYoInB1ZmYoKSBzdWNjZWVkZWQgdW5jb21wcmVzc2luZyAlbHUgYnl0ZXNcbiIsIGRlc3RsZW4pOwotICAgICAgICBpZiAoc291cmNlbGVuIDwgbGVuKSBwcmludGYoIiVsdSBjb21wcmVzc2VkIGJ5dGVzIHVudXNlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIHNvdXJjZWxlbik7Ci0gICAgfQotICAgIGZyZWUoc291cmNlKTsKLSAgICByZXR1cm4gcmV0OwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi9wdWZmL3B1ZmYuaCBiL2xpYnMvemxpYi9jb250cmliL3B1ZmYvcHVmZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYxMjUyLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL3B1ZmYvcHVmZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogcHVmZi5oCi0gIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBNYXJrIEFkbGVyLCBhbGwgcmlnaHRzIHJlc2VydmVkCi0gIHZlcnNpb24gMS43LCAzIE1hciAyMDAyCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTWFyayBBZGxlciAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0gKi8KLQotCi0vKgotICogU2VlIHB1ZmYuYyBmb3IgcHVycG9zZSBhbmQgdXNhZ2UuCi0gKi8KLWludCBwdWZmKHVuc2lnbmVkIGNoYXIgKmRlc3QsICAgICAgICAgICAvKiBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KLSAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmRlc3RsZW4sICAgICAgICAvKiBhbW91bnQgb2Ygb3V0cHV0IHNwYWNlICovCi0gICAgICAgICB1bnNpZ25lZCBjaGFyICpzb3VyY2UsICAgICAgICAgLyogcG9pbnRlciB0byBzb3VyY2UgZGF0YSBwb2ludGVyICovCi0gICAgICAgICB1bnNpZ25lZCBsb25nICpzb3VyY2VsZW4pOyAgICAgLyogYW1vdW50IG9mIGlucHV0IGF2YWlsYWJsZSAqLwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvcHVmZi96ZXJvcy5yYXcgYi9saWJzL3psaWIvY29udHJpYi9wdWZmL3plcm9zLnJhdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3YjdiZS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi9wdWZmL3plcm9zLnJhdworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliLmMgYi9saWJzL3psaWIvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE0YjRiLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAiemxpYi5oIgotCi0KLXZvaWQgTXlEb01pbnVzNjQoTEFSR0VfSU5URUdFUiAqUixMQVJHRV9JTlRFR0VSIEEsTEFSR0VfSU5URUdFUiBCKQotewotICAgIFItPkhpZ2hQYXJ0ID0gQS5IaWdoUGFydCAtIEIuSGlnaFBhcnQ7Ci0gICAgaWYgKEEuTG93UGFydCA+PSBCLkxvd1BhcnQpCi0gICAgICAgIFItPkxvd1BhcnQgPSBBLkxvd1BhcnQgLSBCLkxvd1BhcnQ7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgUi0+TG93UGFydCA9IEEuTG93UGFydCAtIEIuTG93UGFydDsKLSAgICAgICAgUi0+SGlnaFBhcnQgLS07Ci0gICAgfQotfQotCi0jaWZkZWYgX01fWDY0Ci0vLyBzZWUgaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vbGlicmFyeS90d2NoaGU5NShlbi11cyx2cy44MCkuYXNweCBmb3IgX19yZHRzYwotdW5zaWduZWQgX19pbnQ2NCBfX3JkdHNjKHZvaWQpOwotdm9pZCBCZWdpbkNvdW50UmR0c2MoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCkKLXsKLSAvLyAgIHByaW50ZigicmR0c2MgPSAlSTY0eFxuIixfX3JkdHNjKCkpOwotICAgcGJlZ2luVGltZTY0LT5RdWFkUGFydD1fX3JkdHNjKCk7Ci19Ci0KLUxBUkdFX0lOVEVHRVIgR2V0UmVzUmR0c2MoTEFSR0VfSU5URUdFUiBiZWdpblRpbWU2NCxCT09MIGZDb21wdXRlVGltZVF1ZXJ5UGVyZikKLXsKLSAgICBMQVJHRV9JTlRFR0VSIExJcmVzOwotICAgIHVuc2lnbmVkIF9pbnQ2NCByZXM9X19yZHRzYygpLSgodW5zaWduZWQgX2ludDY0KShiZWdpblRpbWU2NC5RdWFkUGFydCkpOwotICAgIExJcmVzLlF1YWRQYXJ0PXJlczsKLSAgIC8vIHByaW50ZigicmR0c2MgPSAlSTY0eFxuIixfX3JkdHNjKCkpOwotICAgIHJldHVybiBMSXJlczsKLX0KLSNlbHNlCi0jaWZkZWYgX01fSVg4Ngotdm9pZCBteUdldFJEVFNDMzIoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCkKLXsKLSAgICBEV09SRCBkd0VkeCxkd0VheDsKLSAgICBfYXNtCi0gICAgewotICAgICAgICByZHRzYwotICAgICAgICBtb3YgZHdFYXgsZWF4Ci0gICAgICAgIG1vdiBkd0VkeCxlZHgKLSAgICB9Ci0gICAgcGJlZ2luVGltZTY0LT5Mb3dQYXJ0PWR3RWF4OwotICAgIHBiZWdpblRpbWU2NC0+SGlnaFBhcnQ9ZHdFZHg7Ci19Ci0KLXZvaWQgQmVnaW5Db3VudFJkdHNjKExBUkdFX0lOVEVHRVIgKiBwYmVnaW5UaW1lNjQpCi17Ci0gICAgbXlHZXRSRFRTQzMyKHBiZWdpblRpbWU2NCk7Ci19Ci0KLUxBUkdFX0lOVEVHRVIgR2V0UmVzUmR0c2MoTEFSR0VfSU5URUdFUiBiZWdpblRpbWU2NCxCT09MIGZDb21wdXRlVGltZVF1ZXJ5UGVyZikKLXsKLSAgICBMQVJHRV9JTlRFR0VSIExJcmVzLGVuZFRpbWU2NDsKLSAgICBteUdldFJEVFNDMzIoJmVuZFRpbWU2NCk7Ci0KLSAgICBMSXJlcy5Mb3dQYXJ0PUxJcmVzLkhpZ2hQYXJ0PTA7Ci0gICAgTXlEb01pbnVzNjQoJkxJcmVzLGVuZFRpbWU2NCxiZWdpblRpbWU2NCk7Ci0gICAgcmV0dXJuIExJcmVzOwotfQotI2Vsc2UKLXZvaWQgbXlHZXRSRFRTQzMyKExBUkdFX0lOVEVHRVIgKiBwYmVnaW5UaW1lNjQpCi17Ci19Ci0KLXZvaWQgQmVnaW5Db3VudFJkdHNjKExBUkdFX0lOVEVHRVIgKiBwYmVnaW5UaW1lNjQpCi17Ci19Ci0KLUxBUkdFX0lOVEVHRVIgR2V0UmVzUmR0c2MoTEFSR0VfSU5URUdFUiBiZWdpblRpbWU2NCxCT09MIGZDb21wdXRlVGltZVF1ZXJ5UGVyZikKLXsKLSAgICBMQVJHRV9JTlRFR0VSIGxyOwotICAgIGxyLlF1YWRQYXJ0PTA7Ci0gICAgcmV0dXJuIGxyOwotfQotI2VuZGlmCi0jZW5kaWYKLQotdm9pZCBCZWdpbkNvdW50UGVyZkNvdW50ZXIoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCxCT09MIGZDb21wdXRlVGltZVF1ZXJ5UGVyZikKLXsKLSAgICBpZiAoKCFmQ29tcHV0ZVRpbWVRdWVyeVBlcmYpIHx8ICghUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIocGJlZ2luVGltZTY0KSkpCi0gICAgewotICAgICAgICBwYmVnaW5UaW1lNjQtPkxvd1BhcnQgPSBHZXRUaWNrQ291bnQoKTsKLSAgICAgICAgcGJlZ2luVGltZTY0LT5IaWdoUGFydCA9IDA7Ci0gICAgfQotfQotCi1EV09SRCBHZXRNc2VjU2luY2VQZXJmQ291bnRlcihMQVJHRV9JTlRFR0VSIGJlZ2luVGltZTY0LEJPT0wgZkNvbXB1dGVUaW1lUXVlcnlQZXJmKQotewotICAgIExBUkdFX0lOVEVHRVIgZW5kVGltZTY0LHRpY2tzUGVyU2Vjb25kLHRpY2tzOwotICAgIERXT1JETE9ORyB0aWNrc1NoaWZ0ZWQsdGlja1NlY1NoaWZ0ZWQ7Ci0gICAgRFdPUkQgZHdMb2c9MTYrMDsKLSAgICBEV09SRCBkd1JldDsKLSAgICBpZiAoKCFmQ29tcHV0ZVRpbWVRdWVyeVBlcmYpIHx8ICghUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJmVuZFRpbWU2NCkpKQotICAgICAgICBkd1JldCA9IChHZXRUaWNrQ291bnQoKSAtIGJlZ2luVGltZTY0Lkxvd1BhcnQpKjE7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTXlEb01pbnVzNjQoJnRpY2tzLGVuZFRpbWU2NCxiZWdpblRpbWU2NCk7Ci0gICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJnRpY2tzUGVyU2Vjb25kKTsKLQotICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICB0aWNrc1NoaWZ0ZWQgPSBJbnQ2NFNocmxNb2QzMigqKERXT1JETE9ORyopJnRpY2tzLGR3TG9nKTsKLSAgICAgICAgICAgIHRpY2tTZWNTaGlmdGVkID0gSW50NjRTaHJsTW9kMzIoKihEV09SRExPTkcqKSZ0aWNrc1BlclNlY29uZCxkd0xvZyk7Ci0gICAgICAgIAotICAgICAgICB9IAotCi0gICAgICAgIGR3UmV0ID0gKERXT1JEKSgoKChEV09SRCl0aWNrc1NoaWZ0ZWQpKjEwMDApLyhEV09SRCkodGlja1NlY1NoaWZ0ZWQpKTsKLSAgICAgICAgZHdSZXQgKj0xOwotICAgIH0KLSAgICByZXR1cm4gZHdSZXQ7Ci19Ci0KLWludCBSZWFkRmlsZU1lbW9yeShjb25zdCBjaGFyKiBmaWxlbmFtZSxsb25nKiBwbEZpbGVTaXplLHZvaWQqKiBwRmlsZVB0cikKLXsKLSAgICBGSUxFKiBzdHJlYW07Ci0gICAgdm9pZCogcHRyOwotICAgIGludCByZXRWYWw9MTsKLSAgICBzdHJlYW09Zm9wZW4oZmlsZW5hbWUsICJyYiIpOwotICAgIGlmIChzdHJlYW09PU5VTEwpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZnNlZWsoc3RyZWFtLDAsU0VFS19FTkQpOwotCi0gICAgKnBsRmlsZVNpemU9ZnRlbGwoc3RyZWFtKTsKLSAgICBmc2VlayhzdHJlYW0sMCxTRUVLX1NFVCk7Ci0gICAgcHRyPW1hbGxvYygoKnBsRmlsZVNpemUpKzEpOwotICAgIGlmIChwdHI9PU5VTEwpCi0gICAgICAgIHJldFZhbD0wOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChmcmVhZChwdHIsIDEsICpwbEZpbGVTaXplLHN0cmVhbSkgIT0gKCpwbEZpbGVTaXplKSkKLSAgICAgICAgICAgIHJldFZhbD0wOwotICAgIH0KLSAgICBmY2xvc2Uoc3RyZWFtKTsKLSAgICAqcEZpbGVQdHI9cHRyOwotICAgIHJldHVybiByZXRWYWw7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgaW50IEJsb2NrU2l6ZUNvbXByZXNzPTB4ODAwMDsKLSAgICBpbnQgQmxvY2tTaXplVW5jb21wcmVzcz0weDgwMDA7Ci0gICAgaW50IGNwckxldmVsPVpfREVGQVVMVF9DT01QUkVTU0lPTiA7Ci0gICAgbG9uZyBsRmlsZVNpemU7Ci0gICAgdW5zaWduZWQgY2hhciogRmlsZVB0cjsKLSAgICBsb25nIGxCdWZmZXJTaXplQ3ByOwotICAgIGxvbmcgbEJ1ZmZlclNpemVVbmNwcjsKLSAgICBsb25nIGxDb21wcmVzc2VkU2l6ZT0wOwotICAgIHVuc2lnbmVkIGNoYXIqIENwclB0cjsKLSAgICB1bnNpZ25lZCBjaGFyKiBVbmNwclB0cjsKLSAgICBsb25nIGxTaXplQ3ByLGxTaXplVW5jcHI7Ci0gICAgRFdPUkQgZHdHZXRUaWNrLGR3TXNlY1FQOwotICAgIExBUkdFX0lOVEVHRVIgbGlfcXAsbGlfcmR0c2MsZHdSZXNSZHRzYzsKLQotICAgIGlmIChhcmdjPD0xKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJydW4gVGVzdFpsaWIgPEZpbGU+IFtCbG9ja1NpemVDb21wcmVzc10gW0Jsb2NrU2l6ZVVuY29tcHJlc3NdIFtjb21wcmVzLiBsZXZlbF1cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoUmVhZEZpbGVNZW1vcnkoYXJndlsxXSwmbEZpbGVTaXplLCZGaWxlUHRyKT09MCkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiZXJyb3IgcmVhZGluZyAlc1xuIixhcmd2WzFdKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UgcHJpbnRmKCJmaWxlICVzIHJlYWQsICV1IGJ5dGVzXG4iLGFyZ3ZbMV0sbEZpbGVTaXplKTsKLQotICAgIGlmIChhcmdjPj0zKQotICAgICAgICBCbG9ja1NpemVDb21wcmVzcz1hdG9sKGFyZ3ZbMl0pOwotCi0gICAgaWYgKGFyZ2M+PTQpCi0gICAgICAgIEJsb2NrU2l6ZVVuY29tcHJlc3M9YXRvbChhcmd2WzNdKTsKLQotICAgIGlmIChhcmdjPj01KQotICAgICAgICBjcHJMZXZlbD0oaW50KWF0b2woYXJndls0XSk7Ci0KLSAgICBsQnVmZmVyU2l6ZUNwciA9IGxGaWxlU2l6ZSArIChsRmlsZVNpemUvMHgxMCkgKyAweDIwMDsKLSAgICBsQnVmZmVyU2l6ZVVuY3ByID0gbEJ1ZmZlclNpemVDcHI7Ci0KLSAgICBDcHJQdHI9KHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhsQnVmZmVyU2l6ZUNwciArIEJsb2NrU2l6ZUNvbXByZXNzKTsKLQotICAgIEJlZ2luQ291bnRQZXJmQ291bnRlcigmbGlfcXAsVFJVRSk7Ci0gICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpOwotICAgIEJlZ2luQ291bnRSZHRzYygmbGlfcmR0c2MpOwotICAgIHsKLSAgICAgICAgel9zdHJlYW0gemNwcjsKLSAgICAgICAgaW50IHJldD1aX09LOwotICAgICAgICBsb25nIGxPcmlnVG9EbyA9IGxGaWxlU2l6ZTsKLSAgICAgICAgbG9uZyBsT3JpZ0RvbmUgPSAwOwotICAgICAgICBpbnQgc3RlcD0wOwotICAgICAgICBtZW1zZXQoJnpjcHIsMCxzaXplb2Yoel9zdHJlYW0pKTsKLSAgICAgICAgZGVmbGF0ZUluaXQoJnpjcHIsY3ByTGV2ZWwpOwotCi0gICAgICAgIHpjcHIubmV4dF9pbiA9IEZpbGVQdHI7Ci0gICAgICAgIHpjcHIubmV4dF9vdXQgPSBDcHJQdHI7Ci0KLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIGFsbF9yZWFkX2JlZm9yZSA9IHpjcHIudG90YWxfaW47Ci0gICAgICAgICAgICB6Y3ByLmF2YWlsX2luID0gbWluKGxPcmlnVG9EbyxCbG9ja1NpemVDb21wcmVzcyk7Ci0gICAgICAgICAgICB6Y3ByLmF2YWlsX291dCA9IEJsb2NrU2l6ZUNvbXByZXNzOwotICAgICAgICAgICAgcmV0PWRlZmxhdGUoJnpjcHIsKHpjcHIuYXZhaWxfaW49PWxPcmlnVG9EbykgPyBaX0ZJTklTSCA6IFpfU1lOQ19GTFVTSCk7Ci0gICAgICAgICAgICBsT3JpZ0RvbmUgKz0gKHpjcHIudG90YWxfaW4tYWxsX3JlYWRfYmVmb3JlKTsKLSAgICAgICAgICAgIGxPcmlnVG9EbyAtPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOwotICAgICAgICAgICAgc3RlcCsrOwotICAgICAgICB9IHdoaWxlIChyZXQ9PVpfT0spOwotCi0gICAgICAgIGxTaXplQ3ByPXpjcHIudG90YWxfb3V0OwotICAgICAgICBkZWZsYXRlRW5kKCZ6Y3ByKTsKLSAgICAgICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpLWR3R2V0VGljazsKLSAgICAgICAgZHdNc2VjUVA9R2V0TXNlY1NpbmNlUGVyZkNvdW50ZXIobGlfcXAsVFJVRSk7Ci0gICAgICAgIGR3UmVzUmR0c2M9R2V0UmVzUmR0c2MobGlfcmR0c2MsVFJVRSk7Ci0gICAgICAgIHByaW50ZigidG90YWwgY29tcHJlc3Mgc2l6ZSA9ICV1LCBpbiAldSBzdGVwXG4iLGxTaXplQ3ByLHN0ZXApOwotICAgICAgICBwcmludGYoInRpbWUgPSAldSBtc2VjID0gJWYgc2VjXG4iLGR3R2V0VGljayxkd0dldFRpY2svKGRvdWJsZSkxMDAwLik7Ci0gICAgICAgIHByaW50ZigiZGVmY3ByIHRpbWUgUVAgPSAldSBtc2VjID0gJWYgc2VjXG4iLGR3TXNlY1FQLGR3TXNlY1FQLyhkb3VibGUpMTAwMC4pOwotICAgICAgICBwcmludGYoImRlZmNwciByZXN1bHQgcmR0c2MgPSAlSTY0eFxuXG4iLGR3UmVzUmR0c2MuUXVhZFBhcnQpOwotICAgIH0KLQotICAgIENwclB0cj0odW5zaWduZWQgY2hhciopcmVhbGxvYyhDcHJQdHIsbFNpemVDcHIpOwotICAgIFVuY3ByUHRyPSh1bnNpZ25lZCBjaGFyKiltYWxsb2MobEJ1ZmZlclNpemVVbmNwciArIEJsb2NrU2l6ZVVuY29tcHJlc3MpOwotCi0gICAgQmVnaW5Db3VudFBlcmZDb3VudGVyKCZsaV9xcCxUUlVFKTsKLSAgICBkd0dldFRpY2s9R2V0VGlja0NvdW50KCk7Ci0gICAgQmVnaW5Db3VudFJkdHNjKCZsaV9yZHRzYyk7Ci0gICAgewotICAgICAgICB6X3N0cmVhbSB6Y3ByOwotICAgICAgICBpbnQgcmV0PVpfT0s7Ci0gICAgICAgIGxvbmcgbE9yaWdUb0RvID0gbFNpemVDcHI7Ci0gICAgICAgIGxvbmcgbE9yaWdEb25lID0gMDsKLSAgICAgICAgaW50IHN0ZXA9MDsKLSAgICAgICAgbWVtc2V0KCZ6Y3ByLDAsc2l6ZW9mKHpfc3RyZWFtKSk7Ci0gICAgICAgIGluZmxhdGVJbml0KCZ6Y3ByKTsKLQotICAgICAgICB6Y3ByLm5leHRfaW4gPSBDcHJQdHI7Ci0gICAgICAgIHpjcHIubmV4dF9vdXQgPSBVbmNwclB0cjsKLQotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgYWxsX3JlYWRfYmVmb3JlID0gemNwci50b3RhbF9pbjsKLSAgICAgICAgICAgIHpjcHIuYXZhaWxfaW4gPSBtaW4obE9yaWdUb0RvLEJsb2NrU2l6ZVVuY29tcHJlc3MpOwotICAgICAgICAgICAgemNwci5hdmFpbF9vdXQgPSBCbG9ja1NpemVVbmNvbXByZXNzOwotICAgICAgICAgICAgcmV0PWluZmxhdGUoJnpjcHIsWl9TWU5DX0ZMVVNIKTsKLSAgICAgICAgICAgIGxPcmlnRG9uZSArPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOwotICAgICAgICAgICAgbE9yaWdUb0RvIC09ICh6Y3ByLnRvdGFsX2luLWFsbF9yZWFkX2JlZm9yZSk7Ci0gICAgICAgICAgICBzdGVwKys7Ci0gICAgICAgIH0gd2hpbGUgKHJldD09Wl9PSyk7Ci0KLSAgICAgICAgbFNpemVVbmNwcj16Y3ByLnRvdGFsX291dDsKLSAgICAgICAgaW5mbGF0ZUVuZCgmemNwcik7Ci0gICAgICAgIGR3R2V0VGljaz1HZXRUaWNrQ291bnQoKS1kd0dldFRpY2s7Ci0gICAgICAgIGR3TXNlY1FQPUdldE1zZWNTaW5jZVBlcmZDb3VudGVyKGxpX3FwLFRSVUUpOwotICAgICAgICBkd1Jlc1JkdHNjPUdldFJlc1JkdHNjKGxpX3JkdHNjLFRSVUUpOwotICAgICAgICBwcmludGYoInRvdGFsIHVuY29tcHJlc3Mgc2l6ZSA9ICV1LCBpbiAldSBzdGVwXG4iLGxTaXplVW5jcHIsc3RlcCk7Ci0gICAgICAgIHByaW50ZigidGltZSA9ICV1IG1zZWMgPSAlZiBzZWNcbiIsZHdHZXRUaWNrLGR3R2V0VGljay8oZG91YmxlKTEwMDAuKTsKLSAgICAgICAgcHJpbnRmKCJ1bmNwciAgdGltZSBRUCA9ICV1IG1zZWMgPSAlZiBzZWNcbiIsZHdNc2VjUVAsZHdNc2VjUVAvKGRvdWJsZSkxMDAwLik7Ci0gICAgICAgIHByaW50ZigidW5jcHIgIHJlc3VsdCByZHRzYyA9ICVJNjR4XG5cbiIsZHdSZXNSZHRzYy5RdWFkUGFydCk7Ci0gICAgfQotCi0gICAgaWYgKGxTaXplVW5jcHI9PWxGaWxlU2l6ZSkKLSAgICB7Ci0gICAgICAgIGlmIChtZW1jbXAoRmlsZVB0cixVbmNwclB0cixsRmlsZVNpemUpPT0wKQotICAgICAgICAgICAgcHJpbnRmKCJjb21wYXJlIG9rXG4iKTsKLQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIudHh0IGIvbGlicy96bGliL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTA4YmIyLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVRvIGJ1aWxkIHRlc3R6TGliIHdpdGggVmlzdWFsIFN0dWRpbyAyMDA1OgotCi1jb3B5IHRvIGEgZGlyZWN0b3J5IGZpbGUgZnJvbSA6Ci0tIHJvb3Qgb2YgekxpYiB0cmVlCi0tIGNvbnRyaWIvdGVzdHpsaWIKLS0gY29udHJpYi9tYXNteDg2Ci0tIGNvbnRyaWIvbWFzbXg2NAotLSBjb250cmliL3ZzdHVkaW8vdmM3Ci0KLWFuZCBvcGVuIHRlc3R6bGliOC5zbG4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi91bnRnei9NYWtlZmlsZS5tc2MgYi9saWJzL3psaWIvY29udHJpYi91bnRnei9NYWtlZmlsZS5tc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Yjg2MDIuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NvbnRyaWIvdW50Z3ovTWFrZWZpbGUubXNjCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotQ0M9Y2wKLUNGTEFHUz0tTUQKLQotdW50Z3ouZXhlOiB1bnRnei5vYmogLi5cLi5cemxpYi5saWIKLQkkKENDKSAkKENGTEFHUykgdW50Z3oub2JqIC4uXC4uXHpsaWIubGliCi0KLXVudGd6Lm9iajogdW50Z3ouYyAuLlwuLlx6bGliLmgKLQkkKENDKSAkKENGTEFHUykgLWMgLUkuLlwuLiB1bnRnei5jCi0KLS4uXC4uXHpsaWIubGliOgotCWNkIC4uXC4uCi0JJChNQUtFKSAtZiB3aW4zMlxtYWtlZmlsZS5tc2MKLQljZCBjb250cmliXHVudGd6Ci0KLWNsZWFuOgotCS1kZWwgdW50Z3oub2JqCi0JLWRlbCB1bnRnei5leGUKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL3VudGd6L3VudGd6LmMgYi9saWJzL3psaWIvY29udHJpYi91bnRnei91bnRnei5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODFlYTM5Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL3VudGd6L3VudGd6LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzUgKzAsMCBAQAotLyoKLSAqIHVudGd6LmMgLS0gRGlzcGxheSBjb250ZW50cyBhbmQgZXh0cmFjdCBmaWxlcyBmcm9tIGEgZ3ppcCdkIFRBUiBmaWxlCi0gKgotICogd3JpdHRlbiBieSBQZWRybyBBLiBBcmFuZGEgR3V0aWVycmV6IDxwYWFnQHRpZC5lcz4KLSAqIGFkYXB0YXRpb24gdG8gVW5peCBieSBKZWFuLWxvdXAgR2FpbGx5IDxqbG91cEBnemlwLm9yZz4KLSAqIHZhcmlvdXMgZml4ZXMgYnkgQ29zbWluIFRydXRhIDxjb3NtaW50QGNzLnViYmNsdWoucm8+Ci0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgInpsaWIuaCIKLQotI2lmZGVmIHVuaXgKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2Vsc2UKLSMgIGluY2x1ZGUgPGRpcmVjdC5oPgotIyAgaW5jbHVkZSA8aW8uaD4KLSNlbmRpZgotCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jICBpZm5kZWYgRl9PSwotIyAgICBkZWZpbmUgRl9PSyAgMAotIyAgZW5kaWYKLSMgIGRlZmluZSBta2RpcihkaXJuYW1lLG1vZGUpICAgX21rZGlyKGRpcm5hbWUpCi0jICBpZmRlZiBfTVNDX1ZFUgotIyAgICBkZWZpbmUgYWNjZXNzKHBhdGgsbW9kZSkgICBfYWNjZXNzKHBhdGgsbW9kZSkKLSMgICAgZGVmaW5lIGNobW9kKHBhdGgsbW9kZSkgICAgX2NobW9kKHBhdGgsbW9kZSkKLSMgICAgZGVmaW5lIHN0cmR1cChzdHIpICAgICAgICAgX3N0cmR1cChzdHIpCi0jICBlbmRpZgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbHNlCi0jICBpbmNsdWRlIDx1dGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dGltZS5oPgotCi0KLS8qIHZhbHVlcyB1c2VkIGluIHR5cGVmbGFnIGZpZWxkICovCi0KLSNkZWZpbmUgUkVHVFlQRSAgJzAnICAgICAgICAgICAgLyogcmVndWxhciBmaWxlICovCi0jZGVmaW5lIEFSRUdUWVBFICdcMCcgICAgICAgICAgIC8qIHJlZ3VsYXIgZmlsZSAqLwotI2RlZmluZSBMTktUWVBFICAnMScgICAgICAgICAgICAvKiBsaW5rICovCi0jZGVmaW5lIFNZTVRZUEUgICcyJyAgICAgICAgICAgIC8qIHJlc2VydmVkICovCi0jZGVmaW5lIENIUlRZUEUgICczJyAgICAgICAgICAgIC8qIGNoYXJhY3RlciBzcGVjaWFsICovCi0jZGVmaW5lIEJMS1RZUEUgICc0JyAgICAgICAgICAgIC8qIGJsb2NrIHNwZWNpYWwgKi8KLSNkZWZpbmUgRElSVFlQRSAgJzUnICAgICAgICAgICAgLyogZGlyZWN0b3J5ICovCi0jZGVmaW5lIEZJRk9UWVBFICc2JyAgICAgICAgICAgIC8qIEZJRk8gc3BlY2lhbCAqLwotI2RlZmluZSBDT05UVFlQRSAnNycgICAgICAgICAgICAvKiByZXNlcnZlZCAqLwotCi0vKiBHTlUgdGFyIGV4dGVuc2lvbnMgKi8KLQotI2RlZmluZSBHTlVUWVBFX0RVTVBESVIgICdEJyAgICAvKiBmaWxlIG5hbWVzIGZyb20gZHVtcGVkIGRpcmVjdG9yeSAqLwotI2RlZmluZSBHTlVUWVBFX0xPTkdMSU5LICdLJyAgICAvKiBsb25nIGxpbmsgbmFtZSAqLwotI2RlZmluZSBHTlVUWVBFX0xPTkdOQU1FICdMJyAgICAvKiBsb25nIGZpbGUgbmFtZSAqLwotI2RlZmluZSBHTlVUWVBFX01VTFRJVk9MICdNJyAgICAvKiBjb250aW51YXRpb24gb2YgZmlsZSBmcm9tIGFub3RoZXIgdm9sdW1lICovCi0jZGVmaW5lIEdOVVRZUEVfTkFNRVMgICAgJ04nICAgIC8qIGZpbGUgbmFtZSB0aGF0IGRvZXMgbm90IGZpdCBpbnRvIG1haW4gaGRyICovCi0jZGVmaW5lIEdOVVRZUEVfU1BBUlNFICAgJ1MnICAgIC8qIHNwYXJzZSBmaWxlICovCi0jZGVmaW5lIEdOVVRZUEVfVk9MSERSICAgJ1YnICAgIC8qIHRhcGUvdm9sdW1lIGhlYWRlciAqLwotCi0KLS8qIHRhciBoZWFkZXIgKi8KLQotI2RlZmluZSBCTE9DS1NJWkUgICAgIDUxMgotI2RlZmluZSBTSE9SVE5BTUVTSVpFIDEwMAotCi1zdHJ1Y3QgdGFyX2hlYWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBieXRlIG9mZnNldCAqLwotICBjaGFyIG5hbWVbMTAwXTsgICAgICAgICAgICAgICAvKiAgIDAgKi8KLSAgY2hhciBtb2RlWzhdOyAgICAgICAgICAgICAgICAgLyogMTAwICovCi0gIGNoYXIgdWlkWzhdOyAgICAgICAgICAgICAgICAgIC8qIDEwOCAqLwotICBjaGFyIGdpZFs4XTsgICAgICAgICAgICAgICAgICAvKiAxMTYgKi8KLSAgY2hhciBzaXplWzEyXTsgICAgICAgICAgICAgICAgLyogMTI0ICovCi0gIGNoYXIgbXRpbWVbMTJdOyAgICAgICAgICAgICAgIC8qIDEzNiAqLwotICBjaGFyIGNoa3N1bVs4XTsgICAgICAgICAgICAgICAvKiAxNDggKi8KLSAgY2hhciB0eXBlZmxhZzsgICAgICAgICAgICAgICAgLyogMTU2ICovCi0gIGNoYXIgbGlua25hbWVbMTAwXTsgICAgICAgICAgIC8qIDE1NyAqLwotICBjaGFyIG1hZ2ljWzZdOyAgICAgICAgICAgICAgICAvKiAyNTcgKi8KLSAgY2hhciB2ZXJzaW9uWzJdOyAgICAgICAgICAgICAgLyogMjYzICovCi0gIGNoYXIgdW5hbWVbMzJdOyAgICAgICAgICAgICAgIC8qIDI2NSAqLwotICBjaGFyIGduYW1lWzMyXTsgICAgICAgICAgICAgICAvKiAyOTcgKi8KLSAgY2hhciBkZXZtYWpvcls4XTsgICAgICAgICAgICAgLyogMzI5ICovCi0gIGNoYXIgZGV2bWlub3JbOF07ICAgICAgICAgICAgIC8qIDMzNyAqLwotICBjaGFyIHByZWZpeFsxNTVdOyAgICAgICAgICAgICAvKiAzNDUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAwICovCi19OwotCi11bmlvbiB0YXJfYnVmZmVyCi17Ci0gIGNoYXIgICAgICAgICAgICAgICBidWZmZXJbQkxPQ0tTSVpFXTsKLSAgc3RydWN0IHRhcl9oZWFkZXIgIGhlYWRlcjsKLX07Ci0KLXN0cnVjdCBhdHRyX2l0ZW0KLXsKLSAgc3RydWN0IGF0dHJfaXRlbSAgKm5leHQ7Ci0gIGNoYXIgICAgICAgICAgICAgICpmbmFtZTsKLSAgaW50ICAgICAgICAgICAgICAgIG1vZGU7Ci0gIHRpbWVfdCAgICAgICAgICAgICB0aW1lOwotfTsKLQotZW51bSB7IFRHWl9FWFRSQUNULCBUR1pfTElTVCwgVEdaX0lOVkFMSUQgfTsKLQotY2hhciAqVEdaZm5hbWUgICAgICAgICAgT0YoKGNvbnN0IGNoYXIgKikpOwotdm9pZCBUR1pub3Rmb3VuZCAgICAgICAgT0YoKGNvbnN0IGNoYXIgKikpOwotCi1pbnQgZ2V0b2N0ICAgICAgICAgICAgICBPRigoY2hhciAqLCBpbnQpKTsKLWNoYXIgKnN0cnRpbWUgICAgICAgICAgIE9GKCh0aW1lX3QgKikpOwotaW50IHNldGZpbGV0aW1lICAgICAgICAgT0YoKGNoYXIgKiwgdGltZV90KSk7Ci12b2lkIHB1c2hfYXR0ciAgICAgICAgICBPRigoc3RydWN0IGF0dHJfaXRlbSAqKiwgY2hhciAqLCBpbnQsIHRpbWVfdCkpOwotdm9pZCByZXN0b3JlX2F0dHIgICAgICAgT0YoKHN0cnVjdCBhdHRyX2l0ZW0gKiopKTsKLQotaW50IEV4cHJNYXRjaCAgICAgICAgICAgT0YoKGNoYXIgKiwgY2hhciAqKSk7Ci0KLWludCBtYWtlZGlyICAgICAgICAgICAgIE9GKChjaGFyICopKTsKLWludCBtYXRjaG5hbWUgICAgICAgICAgIE9GKChpbnQsIGludCwgY2hhciAqKiwgY2hhciAqKSk7Ci0KLXZvaWQgZXJyb3IgICAgICAgICAgICAgIE9GKChjb25zdCBjaGFyICopKTsKLWludCB0YXIgICAgICAgICAgICAgICAgIE9GKChnekZpbGUsIGludCwgaW50LCBpbnQsIGNoYXIgKiopKTsKLQotdm9pZCBoZWxwICAgICAgICAgICAgICAgT0YoKGludCkpOwotaW50IG1haW4gICAgICAgICAgICAgICAgT0YoKGludCwgY2hhciAqKikpOwotCi1jaGFyICpwcm9nOwotCi1jb25zdCBjaGFyICpUR1pzdWZmaXhbXSA9IHsgIlwwIiwgIi50YXIiLCAiLnRhci5neiIsICIudGF6IiwgIi50Z3oiLCBOVUxMIH07Ci0KLS8qIHJldHVybiB0aGUgZmlsZSBuYW1lIG9mIHRoZSBUR1ogYXJjaGl2ZSAqLwotLyogb3IgTlVMTCBpZiBpdCBkb2VzIG5vdCBleGlzdCAqLwotCi1jaGFyICpUR1pmbmFtZSAoY29uc3QgY2hhciAqYXJjbmFtZSkKLXsKLSAgc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOwotICBpbnQgb3JpZ2xlbixpOwotCi0gIHN0cmNweShidWZmZXIsYXJjbmFtZSk7Ci0gIG9yaWdsZW4gPSBzdHJsZW4oYnVmZmVyKTsKLQotICBmb3IgKGk9MDsgVEdac3VmZml4W2ldOyBpKyspCi0gICAgewotICAgICAgIHN0cmNweShidWZmZXIrb3JpZ2xlbixUR1pzdWZmaXhbaV0pOwotICAgICAgIGlmIChhY2Nlc3MoYnVmZmVyLEZfT0spID09IDApCi0gICAgICAgICByZXR1cm4gYnVmZmVyOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyogZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGZpbGVuYW1lICovCi0KLXZvaWQgVEdabm90Zm91bmQgKGNvbnN0IGNoYXIgKmFyY25hbWUpCi17Ci0gIGludCBpOwotCi0gIGZwcmludGYoc3RkZXJyLCIlczogQ291bGRuJ3QgZmluZCAiLHByb2cpOwotICBmb3IgKGk9MDtUR1pzdWZmaXhbaV07aSsrKQotICAgIGZwcmludGYoc3RkZXJyLChUR1pzdWZmaXhbaSsxXSkgPyAiJXMlcywgIiA6ICJvciAlcyVzXG4iLAotICAgICAgICAgICAgYXJjbmFtZSwKLSAgICAgICAgICAgIFRHWnN1ZmZpeFtpXSk7Ci0gIGV4aXQoMSk7Ci19Ci0KLQotLyogY29udmVydCBvY3RhbCBkaWdpdHMgdG8gaW50ICovCi0vKiBvbiBlcnJvciByZXR1cm4gLTEgKi8KLQotaW50IGdldG9jdCAoY2hhciAqcCxpbnQgd2lkdGgpCi17Ci0gIGludCByZXN1bHQgPSAwOwotICBjaGFyIGM7Ci0KLSAgd2hpbGUgKHdpZHRoLS0pCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBpZiAoYyA9PSAwKQotICAgICAgICBicmVhazsKLSAgICAgIGlmIChjID09ICcgJykKLSAgICAgICAgY29udGludWU7Ci0gICAgICBpZiAoYyA8ICcwJyB8fCBjID4gJzcnKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICByZXN1bHQgPSByZXN1bHQgKiA4ICsgKGMgLSAnMCcpOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBjb252ZXJ0IHRpbWVfdCB0byBzdHJpbmcgKi8KLS8qIHVzZSB0aGUgIllZWVkvTU0vREQgaGg6bW06c3MiIGZvcm1hdCAqLwotCi1jaGFyICpzdHJ0aW1lICh0aW1lX3QgKnQpCi17Ci0gIHN0cnVjdCB0bSAgICpsb2NhbDsKLSAgc3RhdGljIGNoYXIgcmVzdWx0WzMyXTsKLQotICBsb2NhbCA9IGxvY2FsdGltZSh0KTsKLSAgc3ByaW50ZihyZXN1bHQsIiU0ZC8lMDJkLyUwMmQgJTAyZDolMDJkOiUwMmQiLAotICAgICAgICAgIGxvY2FsLT50bV95ZWFyKzE5MDAsIGxvY2FsLT50bV9tb24rMSwgbG9jYWwtPnRtX21kYXksCi0gICAgICAgICAgbG9jYWwtPnRtX2hvdXIsIGxvY2FsLT50bV9taW4sIGxvY2FsLT50bV9zZWMpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIHNldCBmaWxlIHRpbWUgKi8KLQotaW50IHNldGZpbGV0aW1lIChjaGFyICpmbmFtZSx0aW1lX3QgZnRpbWUpCi17Ci0jaWZkZWYgV0lOMzIKLSAgc3RhdGljIGludCBpc1dpbk5UID0gLTE7Ci0gIFNZU1RFTVRJTUUgc3Q7Ci0gIEZJTEVUSU1FIGxvY2Z0LCBtb2RmdDsKLSAgc3RydWN0IHRtICpsb2N0bTsKLSAgSEFORExFIGhGaWxlOwotICBpbnQgcmVzdWx0OwotCi0gIGxvY3RtID0gbG9jYWx0aW1lKCZmdGltZSk7Ci0gIGlmIChsb2N0bSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBzdC53WWVhciAgICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX3llYXIgKyAxOTAwOwotICBzdC53TW9udGggICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX21vbiArIDE7Ci0gIHN0LndEYXlPZldlZWsgICAgPSAoV09SRClsb2N0bS0+dG1fd2RheTsKLSAgc3Qud0RheSAgICAgICAgICA9IChXT1JEKWxvY3RtLT50bV9tZGF5OwotICBzdC53SG91ciAgICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX2hvdXI7Ci0gIHN0LndNaW51dGUgICAgICAgPSAoV09SRClsb2N0bS0+dG1fbWluOwotICBzdC53U2Vjb25kICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX3NlYzsKLSAgc3Qud01pbGxpc2Vjb25kcyA9IDA7Ci0gIGlmICghU3lzdGVtVGltZVRvRmlsZVRpbWUoJnN0LCAmbG9jZnQpIHx8Ci0gICAgICAhTG9jYWxGaWxlVGltZVRvRmlsZVRpbWUoJmxvY2Z0LCAmbW9kZnQpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoaXNXaW5OVCA8IDApCi0gICAgaXNXaW5OVCA9IChHZXRWZXJzaW9uKCkgPCAweDgwMDAwMDAwKSA/IDEgOiAwOwotICBoRmlsZSA9IENyZWF0ZUZpbGUoZm5hbWUsIEdFTkVSSUNfV1JJVEUsIDAsIE5VTEwsIE9QRU5fRVhJU1RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAoaXNXaW5OVCA/IEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTIDogMCksCi0gICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgIHJldHVybiAtMTsKLSAgcmVzdWx0ID0gU2V0RmlsZVRpbWUoaEZpbGUsIE5VTEwsIE5VTEwsICZtb2RmdCkgPyAwIDogLTE7Ci0gIENsb3NlSGFuZGxlKGhGaWxlKTsKLSAgcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gIHN0cnVjdCB1dGltYnVmIHNldHRpbWU7Ci0KLSAgc2V0dGltZS5hY3RpbWUgPSBzZXR0aW1lLm1vZHRpbWUgPSBmdGltZTsKLSAgcmV0dXJuIHV0aW1lKGZuYW1lLCZzZXR0aW1lKTsKLSNlbmRpZgotfQotCi0KLS8qIHB1c2ggZmlsZSBhdHRyaWJ1dGVzICovCi0KLXZvaWQgcHVzaF9hdHRyKHN0cnVjdCBhdHRyX2l0ZW0gKipsaXN0LGNoYXIgKmZuYW1lLGludCBtb2RlLHRpbWVfdCB0aW1lKQotewotICBzdHJ1Y3QgYXR0cl9pdGVtICppdGVtOwotCi0gIGl0ZW0gPSAoc3RydWN0IGF0dHJfaXRlbSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGF0dHJfaXRlbSkpOwotICBpZiAoaXRlbSA9PSBOVUxMKQotICAgIGVycm9yKCJPdXQgb2YgbWVtb3J5Iik7Ci0gIGl0ZW0tPmZuYW1lID0gc3RyZHVwKGZuYW1lKTsKLSAgaXRlbS0+bW9kZSAgPSBtb2RlOwotICBpdGVtLT50aW1lICA9IHRpbWU7Ci0gIGl0ZW0tPm5leHQgID0gKmxpc3Q7Ci0gICpsaXN0ICAgICAgID0gaXRlbTsKLX0KLQotCi0vKiByZXN0b3JlIGZpbGUgYXR0cmlidXRlcyAqLwotCi12b2lkIHJlc3RvcmVfYXR0cihzdHJ1Y3QgYXR0cl9pdGVtICoqbGlzdCkKLXsKLSAgc3RydWN0IGF0dHJfaXRlbSAqaXRlbSwgKnByZXY7Ci0KLSAgZm9yIChpdGVtID0gKmxpc3Q7IGl0ZW0gIT0gTlVMTDsgKQotICAgIHsKLSAgICAgIHNldGZpbGV0aW1lKGl0ZW0tPmZuYW1lLGl0ZW0tPnRpbWUpOwotICAgICAgY2htb2QoaXRlbS0+Zm5hbWUsaXRlbS0+bW9kZSk7Ci0gICAgICBwcmV2ID0gaXRlbTsKLSAgICAgIGl0ZW0gPSBpdGVtLT5uZXh0OwotICAgICAgZnJlZShwcmV2KTsKLSAgICB9Ci0gICpsaXN0ID0gTlVMTDsKLX0KLQotCi0vKiBtYXRjaCByZWd1bGFyIGV4cHJlc3Npb24gKi8KLQotI2RlZmluZSBJU1NQRUNJQUwoYykgKCgoYykgPT0gJyonKSB8fCAoKGMpID09ICcvJykpCi0KLWludCBFeHByTWF0Y2ggKGNoYXIgKnN0cmluZyxjaGFyICpleHByKQotewotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoSVNTUEVDSUFMKCpleHByKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICgqZXhwciA9PSAnLycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICgqc3RyaW5nICE9ICdcXCcgJiYgKnN0cmluZyAhPSAnLycpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgIHN0cmluZyArKzsgZXhwcisrOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCpleHByID09ICcqJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCpleHByICsrID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgIHdoaWxlICgqKytzdHJpbmcgIT0gKmV4cHIpCi0gICAgICAgICAgICAgICAgaWYgKCpzdHJpbmcgPT0gMCkKLSAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKnN0cmluZyAhPSAqZXhwcikKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgIGlmICgqZXhwcisrID09IDApCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICBzdHJpbmcrKzsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0vKiByZWN1cnNpdmUgbWtkaXIgKi8KLS8qIGFib3J0IG9uIEVOT0VOVDsgaWdub3JlIG90aGVyIGVycm9ycyBsaWtlICJkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMiICovCi0vKiByZXR1cm4gMSBpZiBPSyAqLwotLyogICAgICAgIDAgb24gZXJyb3IgKi8KLQotaW50IG1ha2VkaXIgKGNoYXIgKm5ld2RpcikKLXsKLSAgY2hhciAqYnVmZmVyID0gc3RyZHVwKG5ld2Rpcik7Ci0gIGNoYXIgKnA7Ci0gIGludCAgbGVuID0gc3RybGVuKGJ1ZmZlcik7Ci0KLSAgaWYgKGxlbiA8PSAwKSB7Ci0gICAgZnJlZShidWZmZXIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChidWZmZXJbbGVuLTFdID09ICcvJykgewotICAgIGJ1ZmZlcltsZW4tMV0gPSAnXDAnOwotICB9Ci0gIGlmIChta2RpcihidWZmZXIsIDA3NTUpID09IDApCi0gICAgewotICAgICAgZnJlZShidWZmZXIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHAgPSBidWZmZXIrMTsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2hhciBob2xkOwotCi0gICAgICB3aGlsZSgqcCAmJiAqcCAhPSAnXFwnICYmICpwICE9ICcvJykKLSAgICAgICAgcCsrOwotICAgICAgaG9sZCA9ICpwOwotICAgICAgKnAgPSAwOwotICAgICAgaWYgKChta2RpcihidWZmZXIsIDA3NTUpID09IC0xKSAmJiAoZXJybm8gPT0gRU5PRU5UKSkKLSAgICAgICAgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogQ291bGRuJ3QgY3JlYXRlIGRpcmVjdG9yeSAlc1xuIixwcm9nLGJ1ZmZlcik7Ci0gICAgICAgICAgZnJlZShidWZmZXIpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICBpZiAoaG9sZCA9PSAwKQotICAgICAgICBicmVhazsKLSAgICAgICpwKysgPSBob2xkOwotICAgIH0KLSAgZnJlZShidWZmZXIpOwotICByZXR1cm4gMTsKLX0KLQotCi1pbnQgbWF0Y2huYW1lIChpbnQgYXJnLGludCBhcmdjLGNoYXIgKiphcmd2LGNoYXIgKmZuYW1lKQotewotICBpZiAoYXJnID09IGFyZ2MpICAgICAgLyogbm8gYXJndW1lbnRzIGdpdmVuICh1bnRneiB0Z3phcmNoaXZlKSAqLwotICAgIHJldHVybiAxOwotCi0gIHdoaWxlIChhcmcgPCBhcmdjKQotICAgIGlmIChFeHByTWF0Y2goZm5hbWUsYXJndlthcmcrK10pKQotICAgICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7IC8qIGlnbm9yZSB0aGlzIGZvciB0aGUgbW9tZW50IGJlaW5nICovCi19Ci0KLQotLyogdGFyIGZpbGUgbGlzdCBvciBleHRyYWN0ICovCi0KLWludCB0YXIgKGd6RmlsZSBpbixpbnQgYWN0aW9uLGludCBhcmcsaW50IGFyZ2MsY2hhciAqKmFyZ3YpCi17Ci0gIHVuaW9uICB0YXJfYnVmZmVyIGJ1ZmZlcjsKLSAgaW50ICAgIGxlbjsKLSAgaW50ICAgIGVycjsKLSAgaW50ICAgIGdldGhlYWRlciA9IDE7Ci0gIGludCAgICByZW1haW5pbmcgPSAwOwotICBGSUxFICAgKm91dGZpbGUgPSBOVUxMOwotICBjaGFyICAgZm5hbWVbQkxPQ0tTSVpFXTsKLSAgaW50ICAgIHRhcm1vZGU7Ci0gIHRpbWVfdCB0YXJ0aW1lOwotICBzdHJ1Y3QgYXR0cl9pdGVtICphdHRyaWJ1dGVzID0gTlVMTDsKLQotICBpZiAoYWN0aW9uID09IFRHWl9MSVNUKQotICAgIHByaW50ZigiICAgIGRhdGUgICAgICB0aW1lICAgICBzaXplICAgICAgICAgICAgICAgICAgICAgICBmaWxlXG4iCi0gICAgICAgICAgICIgLS0tLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGxlbiA9IGd6cmVhZChpbiwgJmJ1ZmZlciwgQkxPQ0tTSVpFKTsKLSAgICAgIGlmIChsZW4gPCAwKQotICAgICAgICBlcnJvcihnemVycm9yKGluLCAmZXJyKSk7Ci0gICAgICAvKgotICAgICAgICogQWx3YXlzIGV4cGVjdCBjb21wbGV0ZSBibG9ja3MgdG8gcHJvY2VzcwotICAgICAgICogdGhlIHRhciBpbmZvcm1hdGlvbi4KLSAgICAgICAqLwotICAgICAgaWYgKGxlbiAhPSBCTE9DS1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBUR1pfSU5WQUxJRDsgLyogZm9yY2UgZXJyb3IgZXhpdCAqLwotICAgICAgICAgIHJlbWFpbmluZyA9IDA7ICAgICAgICAvKiBmb3JjZSBJL08gY2xlYW51cCAqLwotICAgICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBJZiB3ZSBoYXZlIHRvIGdldCBhIHRhciBoZWFkZXIKLSAgICAgICAqLwotICAgICAgaWYgKGdldGhlYWRlciA+PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgLyoKLSAgICAgICAgICAgKiBpZiB3ZSBtZXQgdGhlIGVuZCBvZiB0aGUgdGFyCi0gICAgICAgICAgICogb3IgdGhlIGVuZC1vZi10YXIgYmxvY2ssCi0gICAgICAgICAgICogd2UgYXJlIGRvbmUKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAobGVuID09IDAgfHwgYnVmZmVyLmhlYWRlci5uYW1lWzBdID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIHRhcm1vZGUgPSBnZXRvY3QoYnVmZmVyLmhlYWRlci5tb2RlLDgpOwotICAgICAgICAgIHRhcnRpbWUgPSAodGltZV90KWdldG9jdChidWZmZXIuaGVhZGVyLm10aW1lLDEyKTsKLSAgICAgICAgICBpZiAodGFybW9kZSA9PSAtMSB8fCB0YXJ0aW1lID09ICh0aW1lX3QpLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJ1ZmZlci5oZWFkZXIubmFtZVswXSA9IDA7Ci0gICAgICAgICAgICAgIGFjdGlvbiA9IFRHWl9JTlZBTElEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGdldGhlYWRlciA9PSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdHJuY3B5KGZuYW1lLGJ1ZmZlci5oZWFkZXIubmFtZSxTSE9SVE5BTUVTSVpFKTsKLSAgICAgICAgICAgICAgaWYgKGZuYW1lW1NIT1JUTkFNRVNJWkUtMV0gIT0gMCkKLSAgICAgICAgICAgICAgICAgIGZuYW1lW1NIT1JUTkFNRVNJWkVdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAqIFRoZSBmaWxlIG5hbWUgaXMgbG9uZ2VyIHRoYW4gU0hPUlROQU1FU0laRQotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoZm5hbWUsYnVmZmVyLmhlYWRlci5uYW1lLFNIT1JUTkFNRVNJWkUtMSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgIGVycm9yKCJiYWQgbG9uZyBuYW1lIik7Ci0gICAgICAgICAgICAgIGdldGhlYWRlciA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKgotICAgICAgICAgICAqIEFjdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgZmxhZwotICAgICAgICAgICAqLwotICAgICAgICAgIHN3aXRjaCAoYnVmZmVyLmhlYWRlci50eXBlZmxhZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgRElSVFlQRToKLSAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBUR1pfTElTVCkKLSAgICAgICAgICAgICAgICBwcmludGYoIiAlcyAgICAgPGRpcj4gJXNcbiIsc3RydGltZSgmdGFydGltZSksZm5hbWUpOwotICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IFRHWl9FWFRSQUNUKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG1ha2VkaXIoZm5hbWUpOwotICAgICAgICAgICAgICAgICAgcHVzaF9hdHRyKCZhdHRyaWJ1dGVzLGZuYW1lLHRhcm1vZGUsdGFydGltZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkVHVFlQRToKLSAgICAgICAgICAgIGNhc2UgQVJFR1RZUEU6Ci0gICAgICAgICAgICAgIHJlbWFpbmluZyA9IGdldG9jdChidWZmZXIuaGVhZGVyLnNpemUsMTIpOwotICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID09IC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFRHWl9JTlZBTElEOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IFRHWl9MSVNUKQotICAgICAgICAgICAgICAgIHByaW50ZigiICVzICU5ZCAlc1xuIixzdHJ0aW1lKCZ0YXJ0aW1lKSxyZW1haW5pbmcsZm5hbWUpOwotICAgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT0gVEdaX0VYVFJBQ1QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKG1hdGNobmFtZShhcmcsYXJnYyxhcmd2LGZuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGUgPSBmb3BlbihmbmFtZSwid2IiKTsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0ZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0cnkgY3JlYXRpbmcgZGlyZWN0b3J5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RycmNocihmbmFtZSwgJy8nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKnAgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlZGlyKGZuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKnAgPSAnLyc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGUgPSBmb3BlbihmbmFtZSwid2IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKG91dGZpbGUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRXh0cmFjdGluZyAlc1xuIixmbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogQ291bGRuJ3QgY3JlYXRlICVzIixwcm9nLGZuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBvdXRmaWxlID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGdldGhlYWRlciA9IDA7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBHTlVUWVBFX0xPTkdMSU5LOgotICAgICAgICAgICAgY2FzZSBHTlVUWVBFX0xPTkdOQU1FOgotICAgICAgICAgICAgICByZW1haW5pbmcgPSBnZXRvY3QoYnVmZmVyLmhlYWRlci5zaXplLDEyKTsKLSAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDAgfHwgcmVtYWluaW5nID49IEJMT0NLU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBhY3Rpb24gPSBUR1pfSU5WQUxJRDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbGVuID0gZ3pyZWFkKGluLCBmbmFtZSwgQkxPQ0tTSVpFKTsKLSAgICAgICAgICAgICAgaWYgKGxlbiA8IDApCi0gICAgICAgICAgICAgICAgZXJyb3IoZ3plcnJvcihpbiwgJmVycikpOwotICAgICAgICAgICAgICBpZiAoZm5hbWVbQkxPQ0tTSVpFLTFdICE9IDAgfHwgKGludClzdHJsZW4oZm5hbWUpID4gcmVtYWluaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFRHWl9JTlZBTElEOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBnZXRoZWFkZXIgPSAyOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gVEdaX0xJU1QpCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMgICAgIDwtLS0+ICVzXG4iLHN0cnRpbWUoJnRhcnRpbWUpLGZuYW1lKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkIGludCBieXRlcyA9IChyZW1haW5pbmcgPiBCTE9DS1NJWkUpID8gQkxPQ0tTSVpFIDogcmVtYWluaW5nOwotCi0gICAgICAgICAgaWYgKG91dGZpbGUgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGZ3cml0ZSgmYnVmZmVyLHNpemVvZihjaGFyKSxieXRlcyxvdXRmaWxlKSAhPSBieXRlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAgIiVzOiBFcnJvciB3cml0aW5nICVzIC0tIHNraXBwaW5nXG4iLHByb2csZm5hbWUpOwotICAgICAgICAgICAgICAgICAgZmNsb3NlKG91dGZpbGUpOwotICAgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICByZW1vdmUoZm5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICByZW1haW5pbmcgLT0gYnl0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0aGVhZGVyID0gMTsKLSAgICAgICAgICBpZiAob3V0ZmlsZSAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmY2xvc2Uob3V0ZmlsZSk7Ci0gICAgICAgICAgICAgIG91dGZpbGUgPSBOVUxMOwotICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IFRHWl9JTlZBTElEKQotICAgICAgICAgICAgICAgIHB1c2hfYXR0cigmYXR0cmlidXRlcyxmbmFtZSx0YXJtb2RlLHRhcnRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBBYmFuZG9uIGlmIGVycm9ycyBhcmUgZm91bmQKLSAgICAgICAqLwotICAgICAgaWYgKGFjdGlvbiA9PSBUR1pfSU5WQUxJRCkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yKCJicm9rZW4gYXJjaGl2ZSIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gIC8qCi0gICAqIFJlc3RvcmUgZmlsZSBtb2RlcyBhbmQgdGltZSBzdGFtcHMKLSAgICovCi0gIHJlc3RvcmVfYXR0cigmYXR0cmlidXRlcyk7Ci0KLSAgaWYgKGd6Y2xvc2UoaW4pICE9IFpfT0spCi0gICAgZXJyb3IoImZhaWxlZCBnemNsb3NlIik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXZvaWQgaGVscChpbnQgZXhpdHZhbCkKLXsKLSAgcHJpbnRmKCJ1bnRneiB2ZXJzaW9uIDAuMi4xXG4iCi0gICAgICAgICAiICB1c2luZyB6bGliIHZlcnNpb24gJXNcblxuIiwKLSAgICAgICAgIHpsaWJWZXJzaW9uKCkpOwotICBwcmludGYoIlVzYWdlOiB1bnRneiBmaWxlLnRneiAgICAgICAgICAgIGV4dHJhY3QgYWxsIGZpbGVzXG4iCi0gICAgICAgICAiICAgICAgIHVudGd6IGZpbGUudGd6IGZuYW1lIC4uLiAgZXh0cmFjdCBzZWxlY3RlZCBmaWxlc1xuIgotICAgICAgICAgIiAgICAgICB1bnRneiAtbCBmaWxlLnRneiAgICAgICAgIGxpc3QgYXJjaGl2ZSBjb250ZW50c1xuIgotICAgICAgICAgIiAgICAgICB1bnRneiAtaCAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwXG4iKTsKLSAgZXhpdChleGl0dmFsKTsKLX0KLQotdm9pZCBlcnJvcihjb25zdCBjaGFyICptc2cpCi17Ci0gIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9nLCBtc2cpOwotICBleGl0KDEpOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChfX0dOVUNfXykKLWludCBfQ1JUX2dsb2IgPSAwOyAgICAgIC8qIGRpc2FibGUgYXJndW1lbnQgZ2xvYmJpbmcgaW4gTWluR1cgKi8KLSNlbmRpZgotCi1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKLXsKLSAgICBpbnQgICAgICAgICBhY3Rpb24gPSBUR1pfRVhUUkFDVDsKLSAgICBpbnQgICAgICAgICBhcmcgPSAxOwotICAgIGNoYXIgICAgICAgICpUR1pmaWxlOwotICAgIGd6RmlsZSAgICAgICpmOwotCi0gICAgcHJvZyA9IHN0cnJjaHIoYXJndlswXSwnXFwnKTsKLSAgICBpZiAocHJvZyA9PSBOVUxMKQotICAgICAgewotICAgICAgICBwcm9nID0gc3RycmNocihhcmd2WzBdLCcvJyk7Ci0gICAgICAgIGlmIChwcm9nID09IE5VTEwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJvZyA9IHN0cnJjaHIoYXJndlswXSwnOicpOwotICAgICAgICAgICAgaWYgKHByb2cgPT0gTlVMTCkKLSAgICAgICAgICAgICAgcHJvZyA9IGFyZ3ZbMF07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHByb2crKzsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwcm9nKys7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgcHJvZysrOwotCi0gICAgaWYgKGFyZ2MgPT0gMSkKLSAgICAgIGhlbHAoMCk7Ci0KLSAgICBpZiAoc3RyY21wKGFyZ3ZbYXJnXSwiLWwiKSA9PSAwKQotICAgICAgewotICAgICAgICBhY3Rpb24gPSBUR1pfTElTVDsKLSAgICAgICAgaWYgKGFyZ2MgPT0gKythcmcpCi0gICAgICAgICAgaGVscCgwKTsKLSAgICAgIH0KLSAgICBlbHNlIGlmIChzdHJjbXAoYXJndlthcmddLCItaCIpID09IDApCi0gICAgICB7Ci0gICAgICAgIGhlbHAoMCk7Ci0gICAgICB9Ci0KLSAgICBpZiAoKFRHWmZpbGUgPSBUR1pmbmFtZShhcmd2W2FyZ10pKSA9PSBOVUxMKQotICAgICAgVEdabm90Zm91bmQoYXJndlthcmddKTsKLQotICAgICsrYXJnOwotICAgIGlmICgoYWN0aW9uID09IFRHWl9MSVNUKSAmJiAoYXJnICE9IGFyZ2MpKQotICAgICAgaGVscCgxKTsKLQotLyoKLSAqICBQcm9jZXNzIHRoZSBUR1ogZmlsZQotICovCi0gICAgc3dpdGNoKGFjdGlvbikKLSAgICAgIHsKLSAgICAgIGNhc2UgVEdaX0xJU1Q6Ci0gICAgICBjYXNlIFRHWl9FWFRSQUNUOgotICAgICAgICBmID0gZ3pvcGVuKFRHWmZpbGUsInJiIik7Ci0gICAgICAgIGlmIChmID09IE5VTEwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiBDb3VsZG4ndCBnem9wZW4gJXNcbiIscHJvZyxUR1pmaWxlKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgIH0KLSAgICAgICAgZXhpdCh0YXIoZiwgYWN0aW9uLCBhcmcsIGFyZ2MsIGFyZ3YpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBlcnJvcigiVW5rbm93biBvcHRpb24iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NvbnRyaWIvdnN0dWRpby9yZWFkbWUudHh0IGIvbGlicy96bGliL2NvbnRyaWIvdnN0dWRpby9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDkzMWY5Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL3ZzdHVkaW8vcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLUJ1aWxkaW5nIGluc3RydWN0aW9ucyBmb3IgdGhlIERMTCB2ZXJzaW9ucyBvZiBabGliIDEuMi4zCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBwcm9qZWN0cyB0aGF0IGJ1aWxkIHpsaWIgYW5kIG1pbml6aXAgdXNpbmcKLU1pY3Jvc29mdCBWaXN1YWwgQysrIDcuMC83LjEsIGFuZCBWaXN1YWwgQysrIC4KLQotWW91IGRvbid0IG5lZWQgdG8gYnVpbGQgdGhlc2UgcHJvamVjdHMgeW91cnNlbGYuIFlvdSBjYW4gZG93bmxvYWQgdGhlCi1iaW5hcmllcyBmcm9tOgotICBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsCi0KLU1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0IHRoaXMgc2l0ZS4KLQotCi1CdWlsZCBpbnN0cnVjdGlvbnMgZm9yIFZpc3VhbCBTdHVkaW8gNy54ICgzMiBiaXRzKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gVW5jb21wcmVzcyBjdXJyZW50IHpsaWIsIGluY2x1ZGluZyBhbGwgY29udHJpYi8qIGZpbGVzCi0tIERvd25sb2FkIHRoZSBjcnRkbGwgbGlicmFyeSBmcm9tCi0gICAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9jcnRkbGwuemlwCi0gIFVuemlwIGNydGRsbC56aXAgdG8gZXh0cmFjdCBjcnRkbGwubGliIG9uIGNvbnRyaWJcdnN0dWRpb1x2YzcuCi0tIE9wZW4gY29udHJpYlx2c3R1ZGlvXHZjN1x6bGlidmMuc2xuIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgNy54Ci0gIChWaXN1YWwgU3R1ZGlvIC5OZXQgMjAwMiBvciAyMDAzKS4KLQotQnVpbGQgaW5zdHJ1Y3Rpb25zIGZvciBWaXN1YWwgU3R1ZGlvIDIwMDUgKDMyIGJpdHMgb3IgNjQgYml0cykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIFVuY29tcHJlc3MgY3VycmVudCB6bGliLCBpbmNsdWRpbmcgYWxsIGNvbnRyaWIvKiBmaWxlcwotLSBGb3IgMzIgYml0cyBvbmx5OiBkb3dubG9hZCB0aGUgY3J0ZGxsIGxpYnJhcnkgZnJvbQotICAgIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvY3J0ZGxsLnppcAotICBVbnppcCBjcnRkbGwuemlwIHRvIGV4dHJhY3QgY3J0ZGxsLmxpYiBvbiBjb250cmliXHZzdHVkaW9cdmM4LgotLSBPcGVuIGNvbnRyaWJcdnN0dWRpb1x2YzhcemxpYnZjLnNsbiB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrIDguMAotCi1CdWlsZCBpbnN0cnVjdGlvbnMgZm9yIFZpc3VhbCBTdHVkaW8gMjAwNSA2NCBiaXRzLCBQU0RLIGNvbXBpbGVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1hdCB0aGUgdGltZSBvZiB3cml0aW5nIHRoaXMgdGV4dCBmaWxlLCBWaXN1YWwgU3R1ZGlvIDIwMDUgKGFuZCAKLSAgTWljcm9zb2Z0IFZpc3VhbCBDKysgOC4wKSBpcyBvbiB0aGUgYmV0YSAyIHN0YWdlLgotVXNpbmcgeW91IGNhbiBnZXQgdGhlIGZyZWUgNjQgYml0cyBjb21waWxlciBmcm9tIFBsYXRmb3JtIFNESywgCi0gIHdoaWNoIGlzIE5PVCBhIGJldGEsIGFuZCBjb21waWxlIHVzaW5nIHRoZSBWaXN1YWwgc3R1ZGlvIDIwMDUgSURFCi1zZWUgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vbWlzYy9zZGs2NG9udnMyMDA1LyBmb3IgaW5zdHJ1Y3Rpb24KLQotLSBVbmNvbXByZXNzIGN1cnJlbnQgemxpYiwgaW5jbHVkaW5nIGFsbCBjb250cmliLyogZmlsZXMKLS0gc3RhcnQgVmlzdWFsIFN0dWRpbyAyMDA1IGZyb20gYSBwbGF0Zm9ybSBTREsgY29tbWFuZCBwcm9tcHQsIHVzaW5nCi0gIHRoZSAvdXNlZW52IHN3aXRjaAotLSBPcGVuIGNvbnRyaWJcdnN0dWRpb1x2YzhcemxpYnZjLnNsbiB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrIDguMAotCi0KLUltcG9ydGFudAotLS0tLS0tLS0tCi0tIFRvIHVzZSB6bGlid2FwaS5kbGwgaW4geW91ciBhcHBsaWNhdGlvbiwgeW91IG11c3QgZGVmaW5lIHRoZQotICBtYWNybyBaTElCX1dJTkFQSSB3aGVuIGNvbXBpbGluZyB5b3VyIGFwcGxpY2F0aW9uJ3Mgc291cmNlIGZpbGVzLgotCi0KLUFkZGl0aW9uYWwgbm90ZXMKLS0tLS0tLS0tLS0tLS0tLS0KLS0gVGhpcyBETEwsIG5hbWVkIHpsaWJ3YXBpLmRsbCwgaXMgY29tcGF0aWJsZSB0byB0aGUgb2xkIHpsaWIuZGxsIGJ1aWx0Ci0gIGJ5IEdpbGxlcyBWb2xsYW50IGZyb20gdGhlIHpsaWIgMS4xLnggc291cmNlcywgYW5kIGRpc3RyaWJ1dGVkIGF0Ci0gICAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbAotICBJdCB1c2VzIHRoZSBXSU5BUEkgY2FsbGluZyBjb252ZW50aW9uIGZvciB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLCBhbmQKLSAgaW5jbHVkZXMgdGhlIG1pbml6aXAgZnVuY3Rpb25hbGl0eS4gSWYgeW91ciBhcHBsaWNhdGlvbiBuZWVkcyB0aGF0Ci0gIHBhcnRpY3VsYXIgYnVpbGQgb2YgemxpYi5kbGwsIHlvdSBjYW4gcmVuYW1lIHpsaWJ3YXBpLmRsbCB0byB6bGliLmRsbC4KLQotLSBUaGUgbmV3IERMTCB3YXMgcmVuYW1lZCBiZWNhdXNlIHRoZXJlIGV4aXN0IHNldmVyYWwgaW5jb21wYXRpYmxlCi0gIHZlcnNpb25zIG9mIHpsaWIuZGxsIG9uIHRoZSBJbnRlcm5ldC4KLQotLSBUaGVyZSBpcyBhbHNvIGFuIG9mZmljaWFsIERMTCBidWlsZCBvZiB6bGliLCBuYW1lZCB6bGliMS5kbGwuIFRoaXMgb25lCi0gIGlzIGV4cG9ydGluZyB0aGUgZnVuY3Rpb25zIHVzaW5nIHRoZSBDREVDTCBjb252ZW50aW9uLiBTZWUgdGhlIGZpbGUKLSAgd2luMzJcRExMX0ZBUS50eHQgZm91bmQgaW4gdGhpcyB6bGliIGRpc3RyaWJ1dGlvbi4KLQotLSBUaGVyZSB1c2VkIHRvIGJlIGEgWkxJQl9ETEwgbWFjcm8gaW4gemxpYiAxLjEueCwgYnV0IG5vdyB0aGlzIHN5bWJvbAotICBoYXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgZWZmZWN0LiBUbyBhdm9pZCBjb21wYXRpYmlsaXR5IHByb2JsZW1zLCBkbwotICBub3QgZGVmaW5lIGl0IGhlcmUuCi0KLQotR2lsbGVzIFZvbGxhbnQKLWluZm9Ad2luaW1hZ2UuY29tCmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi92c3R1ZGlvL3ZjNy96bGliLnJjIGIvbGlicy96bGliL2NvbnRyaWIvdnN0dWRpby92YzcvemxpYi5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmNzU2Ny4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi92c3R1ZGlvL3ZjNy96bGliLnJjCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2RlZmluZSBJRFJfVkVSU0lPTjEgIDEKLUlEUl9WRVJTSU9OMQlWRVJTSU9OSU5GTwlNT1ZFQUJMRSBJTVBVUkUgTE9BRE9OQ0FMTCBESVNDQVJEQUJMRQotICBGSUxFVkVSU0lPTgkgMSwyLDMsMAotICBQUk9EVUNUVkVSU0lPTiAxLDIsMywwCi0gIEZJTEVGTEFHU01BU0sJVlNfRkZJX0ZJTEVGTEFHU01BU0sKLSAgRklMRUZMQUdTCTAKLSAgRklMRU9TCVZPU19ET1NfV0lORE9XUzMyCi0gIEZJTEVUWVBFCVZGVF9ETEwKLSAgRklMRVNVQlRZUEUJMAkvLyBub3QgdXNlZAotQkVHSU4KLSAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgotICBCRUdJTgotICAgIEJMT0NLICIwNDA5MDRFNCIKLSAgICAvL2xhbmd1YWdlIElEID0gVS5TLiBFbmdsaXNoLCBjaGFyIHNldCA9IFdpbmRvd3MsIE11bHRpbGluZ3VhbAotCi0gICAgQkVHSU4KLSAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiemxpYiBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnlcMCIKLSAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsCSIxLjIuMy4wXDAiCi0gICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwJInpsaWJcMCIKLSAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwJInpsaWIuZGxsXDAiCi0gICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLAkiWkxpYi5ETExcMCIKLSAgICAgIFZBTFVFICJDb21tZW50cyIsIkRMTCBzdXBwb3J0IGJ5IEFsZXNzYW5kcm8gSWFjb3BldHRpICYgR2lsbGVzIFZvbGxhbnRcMCIKLSAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICIoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkgJiBNYXJrIEFkbGVyXDAiCi0gICAgRU5ECi0gIEVORAotICBCTE9DSyAiVmFyRmlsZUluZm8iCi0gIEJFR0lOCi0gICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwNDA5LCAxMjUyCi0gIEVORAotRU5ECmRpZmYgLS1naXQgYS9saWJzL3psaWIvY29udHJpYi92c3R1ZGlvL3ZjNy96bGlidmMuZGVmIGIvbGlicy96bGliL2NvbnRyaWIvdnN0dWRpby92YzcvemxpYnZjLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkZmRiOC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY29udHJpYi92c3R1ZGlvL3ZjNy96bGlidmMuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotCi1WRVJTSU9OCQkxLjIzCi0KLUhFQVBTSVpFCTEwNDg1NzYsODE5MgotCi1FWFBPUlRTCi0gICAgICAgIGFkbGVyMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEKLSAgICAgICAgY29tcHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMgotICAgICAgICBjcmMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzCi0gICAgICAgIGRlZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQKLSAgICAgICAgZGVmbGF0ZUNvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANQotICAgICAgICBkZWZsYXRlRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA2Ci0gICAgICAgIGRlZmxhdGVJbml0Ml8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQDcKLSAgICAgICAgZGVmbGF0ZUluaXRfICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAOAotICAgICAgICBkZWZsYXRlUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA5Ci0gICAgICAgIGRlZmxhdGVSZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEwCi0gICAgICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICAgICAgICAgICAgICAgICAgICAgQDExCi0gICAgICAgIGd6Y2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEyCi0gICAgICAgIGd6ZG9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEzCi0gICAgICAgIGd6ZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0Ci0gICAgICAgIGd6Zmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE1Ci0gICAgICAgIGd6b3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE2Ci0gICAgICAgIGd6cmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE3Ci0gICAgICAgIGd6d3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE4Ci0gICAgICAgIGluZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE5Ci0gICAgICAgIGluZmxhdGVFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIwCi0gICAgICAgIGluZmxhdGVJbml0Ml8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIxCi0gICAgICAgIGluZmxhdGVJbml0XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIyCi0gICAgICAgIGluZmxhdGVSZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIzCi0gICAgICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5ICAgICAgICAgICAgICAgICAgICAgQDI0Ci0gICAgICAgIGluZmxhdGVTeW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI1Ci0gICAgICAgIHVuY29tcHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI2Ci0gICAgICAgIHpsaWJWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI3Ci0gICAgICAgIGd6cHJpbnRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI4Ci0gICAgICAgIGd6cHV0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI5Ci0gICAgICAgIGd6Z2V0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMwCi0gICAgICAgIGd6c2VlayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMxCi0gICAgICAgIGd6cmV3aW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMyCi0gICAgICAgIGd6dGVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMzCi0gICAgICAgIGd6ZW9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM0Ci0gICAgICAgIGd6c2V0cGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM1Ci0gICAgICAgIHpFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM2Ci0gICAgICAgIGluZmxhdGVTeW5jUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgQDM3Ci0gICAgICAgIGdldF9jcmNfdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM4Ci0gICAgICAgIGNvbXByZXNzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM5Ci0gICAgICAgIGd6cHV0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQwCi0gICAgICAgIGd6Z2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQxCi0gICAgICAgIGluZmxhdGVDb3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQyCi0gICAgICAgIGluZmxhdGVCYWNrSW5pdF8gICAgICAgICAgICAgICAgICAgICAgICAgQDQzCi0gICAgICAgIGluZmxhdGVCYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ0Ci0gICAgICAgIGluZmxhdGVCYWNrRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ1Ci0gICAgICAgIGNvbXByZXNzQm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ2Ci0gICAgICAgIGRlZmxhdGVCb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ3Ci0gICAgICAgIGd6Y2xlYXJlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ4Ci0gICAgICAgIGd6dW5nZXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ5Ci0gICAgICAgIHpsaWJDb21waWxlRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgQDUwCi0gICAgICAgIGRlZmxhdGVQcmltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDUxCi0KLSAgICAgICAgdW56T3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANjEKLSAgICAgICAgdW56Q2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANjIKLSAgICAgICAgdW56R2V0R2xvYmFsSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICBANjMKLSAgICAgICAgdW56R2V0Q3VycmVudEZpbGVJbmZvICAgICAgICAgICAgICAgICAgICBANjQKLSAgICAgICAgdW56R29Ub0ZpcnN0RmlsZSAgICAgICAgICAgICAgICAgICAgICAgICBANjUKLSAgICAgICAgdW56R29Ub05leHRGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICBANjYKLSAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgICBANjcKLSAgICAgICAgdW56UmVhZEN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgICBANjgKLSAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlMyAgICAgICAgICAgICAgICAgICAgICBANjkKLSAgICAgICAgdW56dGVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzAKLSAgICAgICAgdW56ZW9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzEKLSAgICAgICAgdW56Q2xvc2VDdXJyZW50RmlsZSAgICAgICAgICAgICAgICAgICAgICBANzIKLSAgICAgICAgdW56R2V0R2xvYmFsQ29tbWVudCAgICAgICAgICAgICAgICAgICAgICBANzMKLSAgICAgICAgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlICAgICAgICAgICAgICAgICBANzQKLSAgICAgICAgdW56TG9jYXRlRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzUKLSAgICAgICAgdW56R2V0TG9jYWxFeHRyYWZpZWxkICAgICAgICAgICAgICAgICAgICBANzYKLSAgICAgICAgdW56T3BlbjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzcKLSAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlMiAgICAgICAgICAgICAgICAgICAgICBANzgKLSAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmQgICAgICAgICAgICAgICBANzkKLQotICAgICAgICB6aXBPcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4MAotICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgIEA4MQotICAgICAgICB6aXBXcml0ZUluRmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgIEA4MgotICAgICAgICB6aXBDbG9zZUZpbGVJblppcCAgICAgICAgICAgICAgICAgICAgICAgIEA4MwotICAgICAgICB6aXBDbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4NAotICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwMiAgICAgICAgICAgICAgICAgICAgIEA4NgotICAgICAgICB6aXBDbG9zZUZpbGVJblppcFJhdyAgICAgICAgICAgICAgICAgICAgIEA4NwotICAgICAgICB6aXBPcGVuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4OAotICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwMyAgICAgICAgICAgICAgICAgICAgIEA4OQotCi0gICAgICAgIHVuekdldEZpbGVQb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEwMAotICAgICAgICB1bnpHb1RvRmlsZVBvcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMDEKLQotICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jICAgICAgICAgICAgICAgICAgICAgIEAxMTAKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL3ZzdHVkaW8vdmM4L3psaWIucmMgYi9saWJzL3psaWIvY29udHJpYi92c3R1ZGlvL3ZjOC96bGliLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGY3NTY3Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL3ZzdHVkaW8vdmM4L3psaWIucmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jZGVmaW5lIElEUl9WRVJTSU9OMSAgMQotSURSX1ZFUlNJT04xCVZFUlNJT05JTkZPCU1PVkVBQkxFIElNUFVSRSBMT0FET05DQUxMIERJU0NBUkRBQkxFCi0gIEZJTEVWRVJTSU9OCSAxLDIsMywwCi0gIFBST0RVQ1RWRVJTSU9OIDEsMiwzLDAKLSAgRklMRUZMQUdTTUFTSwlWU19GRklfRklMRUZMQUdTTUFTSwotICBGSUxFRkxBR1MJMAotICBGSUxFT1MJVk9TX0RPU19XSU5ET1dTMzIKLSAgRklMRVRZUEUJVkZUX0RMTAotICBGSUxFU1VCVFlQRQkwCS8vIG5vdCB1c2VkCi1CRUdJTgotICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0gIEJFR0lOCi0gICAgQkxPQ0sgIjA0MDkwNEU0IgotICAgIC8vbGFuZ3VhZ2UgSUQgPSBVLlMuIEVuZ2xpc2gsIGNoYXIgc2V0ID0gV2luZG93cywgTXVsdGlsaW5ndWFsCi0KLSAgICBCRUdJTgotICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJ6bGliIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeVwwIgotICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwJIjEuMi4zLjBcMCIKLSAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLAkiemxpYlwwIgotICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLAkiemxpYi5kbGxcMCIKLSAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsCSJaTGliLkRMTFwwIgotICAgICAgVkFMVUUgIkNvbW1lbnRzIiwiRExMIHN1cHBvcnQgYnkgQWxlc3NhbmRybyBJYWNvcGV0dGkgJiBHaWxsZXMgVm9sbGFudFwwIgotICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIihDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseSAmIE1hcmsgQWRsZXJcMCIKLSAgICBFTkQKLSAgRU5ECi0gIEJMT0NLICJWYXJGaWxlSW5mbyIKLSAgQkVHSU4KLSAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDA0MDksIDEyNTIKLSAgRU5ECi1FTkQKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jb250cmliL3ZzdHVkaW8vdmM4L3psaWJ2Yy5kZWYgYi9saWJzL3psaWIvY29udHJpYi92c3R1ZGlvL3ZjOC96bGlidmMuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGRmZGI4Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9jb250cmliL3ZzdHVkaW8vdmM4L3psaWJ2Yy5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0KLVZFUlNJT04JCTEuMjMKLQotSEVBUFNJWkUJMTA0ODU3Niw4MTkyCi0KLUVYUE9SVFMKLSAgICAgICAgYWRsZXIzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMQotICAgICAgICBjb21wcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyCi0gICAgICAgIGNyYzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMKLSAgICAgICAgZGVmbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANAotICAgICAgICBkZWZsYXRlQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA1Ci0gICAgICAgIGRlZmxhdGVFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDYKLSAgICAgICAgZGVmbGF0ZUluaXQyXyAgICAgICAgICAgICAgICAgICAgICAgICAgICBANwotICAgICAgICBkZWZsYXRlSW5pdF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4Ci0gICAgICAgIGRlZmxhdGVQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDkKLSAgICAgICAgZGVmbGF0ZVJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTAKLSAgICAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgICAgICAgICAgICAgICAgICAgICBAMTEKLSAgICAgICAgZ3pjbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTIKLSAgICAgICAgZ3pkb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTMKLSAgICAgICAgZ3plcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQKLSAgICAgICAgZ3pmbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTUKLSAgICAgICAgZ3pvcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTYKLSAgICAgICAgZ3pyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTcKLSAgICAgICAgZ3p3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTgKLSAgICAgICAgaW5mbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTkKLSAgICAgICAgaW5mbGF0ZUVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjAKLSAgICAgICAgaW5mbGF0ZUluaXQyXyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjEKLSAgICAgICAgaW5mbGF0ZUluaXRfICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjIKLSAgICAgICAgaW5mbGF0ZVJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjMKLSAgICAgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkgICAgICAgICAgICAgICAgICAgICBAMjQKLSAgICAgICAgaW5mbGF0ZVN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjUKLSAgICAgICAgdW5jb21wcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjYKLSAgICAgICAgemxpYlZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjcKLSAgICAgICAgZ3pwcmludGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjgKLSAgICAgICAgZ3pwdXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjkKLSAgICAgICAgZ3pnZXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzAKLSAgICAgICAgZ3pzZWVrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzEKLSAgICAgICAgZ3pyZXdpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzIKLSAgICAgICAgZ3p0ZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzMKLSAgICAgICAgZ3plb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzQKLSAgICAgICAgZ3pzZXRwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzUKLSAgICAgICAgekVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzYKLSAgICAgICAgaW5mbGF0ZVN5bmNQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICBAMzcKLSAgICAgICAgZ2V0X2NyY190YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzgKLSAgICAgICAgY29tcHJlc3MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzkKLSAgICAgICAgZ3pwdXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDAKLSAgICAgICAgZ3pnZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDEKLSAgICAgICAgaW5mbGF0ZUNvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDIKLSAgICAgICAgaW5mbGF0ZUJhY2tJbml0XyAgICAgICAgICAgICAgICAgICAgICAgICBANDMKLSAgICAgICAgaW5mbGF0ZUJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDQKLSAgICAgICAgaW5mbGF0ZUJhY2tFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICBANDUKLSAgICAgICAgY29tcHJlc3NCb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDYKLSAgICAgICAgZGVmbGF0ZUJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDcKLSAgICAgICAgZ3pjbGVhcmVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDgKLSAgICAgICAgZ3p1bmdldGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDkKLSAgICAgICAgemxpYkNvbXBpbGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBANTAKLSAgICAgICAgZGVmbGF0ZVByaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANTEKLQotICAgICAgICB1bnpPcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA2MQotICAgICAgICB1bnpDbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA2MgotICAgICAgICB1bnpHZXRHbG9iYWxJbmZvICAgICAgICAgICAgICAgICAgICAgICAgIEA2MwotICAgICAgICB1bnpHZXRDdXJyZW50RmlsZUluZm8gICAgICAgICAgICAgICAgICAgIEA2NAotICAgICAgICB1bnpHb1RvRmlyc3RGaWxlICAgICAgICAgICAgICAgICAgICAgICAgIEA2NQotICAgICAgICB1bnpHb1RvTmV4dEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgIEA2NgotICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUgICAgICAgICAgICAgICAgICAgICAgIEA2NwotICAgICAgICB1bnpSZWFkQ3VycmVudEZpbGUgICAgICAgICAgICAgICAgICAgICAgIEA2OAotICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUzICAgICAgICAgICAgICAgICAgICAgIEA2OQotICAgICAgICB1bnp0ZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3MAotICAgICAgICB1bnplb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3MQotICAgICAgICB1bnpDbG9zZUN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgIEA3MgotICAgICAgICB1bnpHZXRHbG9iYWxDb21tZW50ICAgICAgICAgICAgICAgICAgICAgIEA3MwotICAgICAgICB1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUgICAgICAgICAgICAgICAgIEA3NAotICAgICAgICB1bnpMb2NhdGVGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3NQotICAgICAgICB1bnpHZXRMb2NhbEV4dHJhZmllbGQgICAgICAgICAgICAgICAgICAgIEA3NgotICAgICAgICB1bnpPcGVuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3NwotICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUyICAgICAgICAgICAgICAgICAgICAgIEA3OAotICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCAgICAgICAgICAgICAgIEA3OQotCi0gICAgICAgIHppcE9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDgwCi0gICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXAgICAgICAgICAgICAgICAgICAgICAgQDgxCi0gICAgICAgIHppcFdyaXRlSW5GaWxlSW5aaXAgICAgICAgICAgICAgICAgICAgICAgQDgyCi0gICAgICAgIHppcENsb3NlRmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgICAgQDgzCi0gICAgICAgIHppcENsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDg0Ci0gICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXAyICAgICAgICAgICAgICAgICAgICAgQDg2Ci0gICAgICAgIHppcENsb3NlRmlsZUluWmlwUmF3ICAgICAgICAgICAgICAgICAgICAgQDg3Ci0gICAgICAgIHppcE9wZW4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDg4Ci0gICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXAzICAgICAgICAgICAgICAgICAgICAgQDg5Ci0KLSAgICAgICAgdW56R2V0RmlsZVBvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTAwCi0gICAgICAgIHVuekdvVG9GaWxlUG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEwMQotCi0gICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmMgICAgICAgICAgICAgICAgICAgICAgQDExMApkaWZmIC0tZ2l0IGEvbGlicy96bGliL2NyYzMyLmMgYi9saWJzL3psaWIvY3JjMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1OGE5ZS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvY3JjMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKiBjcmMzMi5jIC0tIGNvbXB1dGUgdGhlIENSQy0zMiBvZiBhIGRhdGEgc3RyZWFtCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKgotICogVGhhbmtzIHRvIFJvZG5leSBCcm93biA8cmJyb3duNjRAY3NjLmNvbS5hdT4gZm9yIGhpcyBjb250cmlidXRpb24gb2YgZmFzdGVyCi0gKiBDUkMgbWV0aG9kczogZXhjbHVzaXZlLW9yaW5nIDMyIGJpdHMgb2YgZGF0YSBhdCBhIHRpbWUsIGFuZCBwcmUtY29tcHV0aW5nCi0gKiB0YWJsZXMgZm9yIHVwZGF0aW5nIHRoZSBzaGlmdCByZWdpc3RlciBpbiBvbmUgc3RlcCB3aXRoIHRocmVlIGV4Y2x1c2l2ZS1vcnMKLSAqIGluc3RlYWQgb2YgZm91ciBzdGVwcyB3aXRoIGZvdXIgZXhjbHVzaXZlLW9ycy4gIFRoaXMgcmVzdWx0cyBpbiBhYm91dCBhCi0gKiBmYWN0b3Igb2YgdHdvIGluY3JlYXNlIGluIHNwZWVkIG9uIGEgUG93ZXIgUEMgRzQgKFBQQzc0NTUpIHVzaW5nIGdjYyAtTzMuCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLS8qCi0gIE5vdGUgb24gdGhlIHVzZSBvZiBEWU5BTUlDX0NSQ19UQUJMRTogdGhlcmUgaXMgbm8gbXV0ZXggb3Igc2VtYXBob3JlCi0gIHByb3RlY3Rpb24gb24gdGhlIHN0YXRpYyB2YXJpYWJsZXMgdXNlZCB0byBjb250cm9sIHRoZSBmaXJzdC11c2UgZ2VuZXJhdGlvbgotICBvZiB0aGUgY3JjIHRhYmxlcy4gIFRoZXJlZm9yZSwgaWYgeW91ICNkZWZpbmUgRFlOQU1JQ19DUkNfVEFCTEUsIHlvdSBzaG91bGQKLSAgZmlyc3QgY2FsbCBnZXRfY3JjX3RhYmxlKCkgdG8gaW5pdGlhbGl6ZSB0aGUgdGFibGVzIGJlZm9yZSBhbGxvd2luZyBtb3JlIHRoYW4KLSAgb25lIHRocmVhZCB0byB1c2UgY3JjMzIoKS4KLSAqLwotCi0jaWZkZWYgTUFLRUNSQ0gKLSMgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0jICBpZm5kZWYgRFlOQU1JQ19DUkNfVEFCTEUKLSMgICAgZGVmaW5lIERZTkFNSUNfQ1JDX1RBQkxFCi0jICBlbmRpZiAvKiAhRFlOQU1JQ19DUkNfVEFCTEUgKi8KLSNlbmRpZiAvKiBNQUtFQ1JDSCAqLwotCi0jaW5jbHVkZSAienV0aWwuaCIgICAgICAvKiBmb3IgU1REQyBhbmQgRkFSIGRlZmluaXRpb25zICovCi0KLSNkZWZpbmUgbG9jYWwgc3RhdGljCi0KLS8qIEZpbmQgYSBmb3VyLWJ5dGUgaW50ZWdlciB0eXBlIGZvciBjcmMzMl9saXR0bGUoKSBhbmQgY3JjMzJfYmlnKCkuICovCi0jaWZuZGVmIE5PQllGT1VSCi0jICBpZmRlZiBTVERDICAgICAgICAgICAvKiBuZWVkIEFOU0kgQyBsaW1pdHMuaCB0byBkZXRlcm1pbmUgc2l6ZXMgKi8KLSMgICAgaW5jbHVkZSA8bGltaXRzLmg+Ci0jICAgIGRlZmluZSBCWUZPVVIKLSMgICAgaWYgKFVJTlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCB1NDsKLSMgICAgZWxzZQotIyAgICAgIGlmIChVTE9OR19NQVggPT0gMHhmZmZmZmZmZlVMKQotICAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIHU0OwotIyAgICAgIGVsc2UKLSMgICAgICAgIGlmIChVU0hSVF9NQVggPT0gMHhmZmZmZmZmZlVMKQotICAgICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHU0OwotIyAgICAgICAgZWxzZQotIyAgICAgICAgICB1bmRlZiBCWUZPVVIgICAgIC8qIGNhbid0IGZpbmQgYSBmb3VyLWJ5dGUgaW50ZWdlciB0eXBlISAqLwotIyAgICAgICAgZW5kaWYKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYgLyogU1REQyAqLwotI2VuZGlmIC8qICFOT0JZRk9VUiAqLwotCi0vKiBEZWZpbml0aW9ucyBmb3IgZG9pbmcgdGhlIGNyYyBmb3VyIGRhdGEgYnl0ZXMgYXQgYSB0aW1lLiAqLwotI2lmZGVmIEJZRk9VUgotIyAgZGVmaW5lIFJFVih3KSAoKCh3KT4+MjQpKygoKHcpPj44KSYweGZmMDApKyBcCi0gICAgICAgICAgICAgICAgKCgodykmMHhmZjAwKTw8OCkrKCgodykmMHhmZik8PDI0KSkKLSAgIGxvY2FsIHVuc2lnbmVkIGxvbmcgY3JjMzJfbGl0dGxlIE9GKCh1bnNpZ25lZCBsb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKiwgdW5zaWduZWQpKTsKLSAgIGxvY2FsIHVuc2lnbmVkIGxvbmcgY3JjMzJfYmlnIE9GKCh1bnNpZ25lZCBsb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKiwgdW5zaWduZWQpKTsKLSMgIGRlZmluZSBUQkxTIDgKLSNlbHNlCi0jICBkZWZpbmUgVEJMUyAxCi0jZW5kaWYgLyogQllGT1VSICovCi0KLS8qIExvY2FsIGZ1bmN0aW9ucyBmb3IgY3JjIGNvbmNhdGVuYXRpb24gKi8KLWxvY2FsIHVuc2lnbmVkIGxvbmcgZ2YyX21hdHJpeF90aW1lcyBPRigodW5zaWduZWQgbG9uZyAqbWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHZlYykpOwotbG9jYWwgdm9pZCBnZjJfbWF0cml4X3NxdWFyZSBPRigodW5zaWduZWQgbG9uZyAqc3F1YXJlLCB1bnNpZ25lZCBsb25nICptYXQpKTsKLQotI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCi0KLWxvY2FsIHZvbGF0aWxlIGludCBjcmNfdGFibGVfZW1wdHkgPSAxOwotbG9jYWwgdW5zaWduZWQgbG9uZyBGQVIgY3JjX3RhYmxlW1RCTFNdWzI1Nl07Ci1sb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlIE9GKCh2b2lkKSk7Ci0jaWZkZWYgTUFLRUNSQ0gKLSAgIGxvY2FsIHZvaWQgd3JpdGVfdGFibGUgT0YoKEZJTEUgKiwgY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgKikpOwotI2VuZGlmIC8qIE1BS0VDUkNIICovCi0vKgotICBHZW5lcmF0ZSB0YWJsZXMgZm9yIGEgYnl0ZS13aXNlIDMyLWJpdCBDUkMgY2FsY3VsYXRpb24gb24gdGhlIHBvbHlub21pYWw6Ci0gIHheMzIreF4yNit4XjIzK3heMjIreF4xNit4XjEyK3heMTEreF4xMCt4XjgreF43K3heNSt4XjQreF4yK3grMS4KLQotICBQb2x5bm9taWFscyBvdmVyIEdGKDIpIGFyZSByZXByZXNlbnRlZCBpbiBiaW5hcnksIG9uZSBiaXQgcGVyIGNvZWZmaWNpZW50LAotICB3aXRoIHRoZSBsb3dlc3QgcG93ZXJzIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIFRoZW4gYWRkaW5nIHBvbHlub21pYWxzCi0gIGlzIGp1c3QgZXhjbHVzaXZlLW9yLCBhbmQgbXVsdGlwbHlpbmcgYSBwb2x5bm9taWFsIGJ5IHggaXMgYSByaWdodCBzaGlmdCBieQotICBvbmUuICBJZiB3ZSBjYWxsIHRoZSBhYm92ZSBwb2x5bm9taWFsIHAsIGFuZCByZXByZXNlbnQgYSBieXRlIGFzIHRoZQotICBwb2x5bm9taWFsIHEsIGFsc28gd2l0aCB0aGUgbG93ZXN0IHBvd2VyIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCAoc28gdGhlCi0gIGJ5dGUgMHhiMSBpcyB0aGUgcG9seW5vbWlhbCB4XjcreF4zK3grMSksIHRoZW4gdGhlIENSQyBpcyAocSp4XjMyKSBtb2QgcCwKLSAgd2hlcmUgYSBtb2QgYiBtZWFucyB0aGUgcmVtYWluZGVyIGFmdGVyIGRpdmlkaW5nIGEgYnkgYi4KLQotICBUaGlzIGNhbGN1bGF0aW9uIGlzIGRvbmUgdXNpbmcgdGhlIHNoaWZ0LXJlZ2lzdGVyIG1ldGhvZCBvZiBtdWx0aXBseWluZyBhbmQKLSAgdGFraW5nIHRoZSByZW1haW5kZXIuICBUaGUgcmVnaXN0ZXIgaXMgaW5pdGlhbGl6ZWQgdG8gemVybywgYW5kIGZvciBlYWNoCi0gIGluY29taW5nIGJpdCwgeF4zMiBpcyBhZGRlZCBtb2QgcCB0byB0aGUgcmVnaXN0ZXIgaWYgdGhlIGJpdCBpcyBhIG9uZSAod2hlcmUKLSAgeF4zMiBtb2QgcCBpcyBwK3heMzIgPSB4XjI2Ky4uLisxKSwgYW5kIHRoZSByZWdpc3RlciBpcyBtdWx0aXBsaWVkIG1vZCBwIGJ5Ci0gIHggKHdoaWNoIGlzIHNoaWZ0aW5nIHJpZ2h0IGJ5IG9uZSBhbmQgYWRkaW5nIHheMzIgbW9kIHAgaWYgdGhlIGJpdCBzaGlmdGVkCi0gIG91dCBpcyBhIG9uZSkuICBXZSBzdGFydCB3aXRoIHRoZSBoaWdoZXN0IHBvd2VyIChsZWFzdCBzaWduaWZpY2FudCBiaXQpIG9mCi0gIHEgYW5kIHJlcGVhdCBmb3IgYWxsIGVpZ2h0IGJpdHMgb2YgcS4KLQotICBUaGUgZmlyc3QgdGFibGUgaXMgc2ltcGx5IHRoZSBDUkMgb2YgYWxsIHBvc3NpYmxlIGVpZ2h0IGJpdCB2YWx1ZXMuICBUaGlzIGlzCi0gIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGdlbmVyYXRlIENSQ3Mgb24gZGF0YSBhIGJ5dGUgYXQgYSB0aW1lIGZvciBhbGwKLSAgY29tYmluYXRpb25zIG9mIENSQyByZWdpc3RlciB2YWx1ZXMgYW5kIGluY29taW5nIGJ5dGVzLiAgVGhlIHJlbWFpbmluZyB0YWJsZXMKLSAgYWxsb3cgZm9yIHdvcmQtYXQtYS10aW1lIENSQyBjYWxjdWxhdGlvbiBmb3IgYm90aCBiaWctZW5kaWFuIGFuZCBsaXR0bGUtCi0gIGVuZGlhbiBtYWNoaW5lcywgd2hlcmUgYSB3b3JkIGlzIGZvdXIgYnl0ZXMuCi0qLwotbG9jYWwgdm9pZCBtYWtlX2NyY190YWJsZSgpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBjOwotICAgIGludCBuLCBrOwotICAgIHVuc2lnbmVkIGxvbmcgcG9seTsgICAgICAgICAgICAgICAgIC8qIHBvbHlub21pYWwgZXhjbHVzaXZlLW9yIHBhdHRlcm4gKi8KLSAgICAvKiB0ZXJtcyBvZiBwb2x5bm9taWFsIGRlZmluaW5nIHRoaXMgY3JjIChleGNlcHQgeF4zMik6ICovCi0gICAgc3RhdGljIHZvbGF0aWxlIGludCBmaXJzdCA9IDE7ICAgICAgLyogZmxhZyB0byBsaW1pdCBjb25jdXJyZW50IG1ha2luZyAqLwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBbXSA9IHswLDEsMiw0LDUsNyw4LDEwLDExLDEyLDE2LDIyLDIzLDI2fTsKLQotICAgIC8qIFNlZSBpZiBhbm90aGVyIHRhc2sgaXMgYWxyZWFkeSBkb2luZyB0aGlzIChub3QgdGhyZWFkLXNhZmUsIGJ1dCBiZXR0ZXIKLSAgICAgICB0aGFuIG5vdGhpbmcgLS0gc2lnbmlmaWNhbnRseSByZWR1Y2VzIGR1cmF0aW9uIG9mIHZ1bG5lcmFiaWxpdHkgaW4KLSAgICAgICBjYXNlIHRoZSBhZHZpY2UgYWJvdXQgRFlOQU1JQ19DUkNfVEFCTEUgaXMgaWdub3JlZCkgKi8KLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSAwOwotCi0gICAgICAgIC8qIG1ha2UgZXhjbHVzaXZlLW9yIHBhdHRlcm4gZnJvbSBwb2x5bm9taWFsICgweGVkYjg4MzIwVUwpICovCi0gICAgICAgIHBvbHkgPSAwVUw7Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCBzaXplb2YocCkvc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOyBuKyspCi0gICAgICAgICAgICBwb2x5IHw9IDFVTCA8PCAoMzEgLSBwW25dKTsKLQotICAgICAgICAvKiBnZW5lcmF0ZSBhIGNyYyBmb3IgZXZlcnkgOC1iaXQgdmFsdWUgKi8KLSAgICAgICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKSB7Ci0gICAgICAgICAgICBjID0gKHVuc2lnbmVkIGxvbmcpbjsKLSAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCi0gICAgICAgICAgICAgICAgYyA9IGMgJiAxID8gcG9seSBeIChjID4+IDEpIDogYyA+PiAxOwotICAgICAgICAgICAgY3JjX3RhYmxlWzBdW25dID0gYzsKLSAgICAgICAgfQotCi0jaWZkZWYgQllGT1VSCi0gICAgICAgIC8qIGdlbmVyYXRlIGNyYyBmb3IgZWFjaCB2YWx1ZSBmb2xsb3dlZCBieSBvbmUsIHR3bywgYW5kIHRocmVlIHplcm9zLAotICAgICAgICAgICBhbmQgdGhlbiB0aGUgYnl0ZSByZXZlcnNhbCBvZiB0aG9zZSBhcyB3ZWxsIGFzIHRoZSBmaXJzdCB0YWJsZSAqLwotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspIHsKLSAgICAgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bbl07Ci0gICAgICAgICAgICBjcmNfdGFibGVbNF1bbl0gPSBSRVYoYyk7Ci0gICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgNDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgYyA9IGNyY190YWJsZVswXVtjICYgMHhmZl0gXiAoYyA+PiA4KTsKLSAgICAgICAgICAgICAgICBjcmNfdGFibGVba11bbl0gPSBjOwotICAgICAgICAgICAgICAgIGNyY190YWJsZVtrICsgNF1bbl0gPSBSRVYoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZiAvKiBCWUZPVVIgKi8KLQotICAgICAgICBjcmNfdGFibGVfZW1wdHkgPSAwOwotICAgIH0KLSAgICBlbHNlIHsgICAgICAvKiBub3QgZmlyc3QgKi8KLSAgICAgICAgLyogd2FpdCBmb3IgdGhlIG90aGVyIGd1eSB0byBmaW5pc2ggKG5vdCBlZmZpY2llbnQsIGJ1dCByYXJlKSAqLwotICAgICAgICB3aGlsZSAoY3JjX3RhYmxlX2VtcHR5KQotICAgICAgICAgICAgOwotICAgIH0KLQotI2lmZGVmIE1BS0VDUkNICi0gICAgLyogd3JpdGUgb3V0IENSQyB0YWJsZXMgdG8gY3JjMzIuaCAqLwotICAgIHsKLSAgICAgICAgRklMRSAqb3V0OwotCi0gICAgICAgIG91dCA9IGZvcGVuKCJjcmMzMi5oIiwgInciKTsKLSAgICAgICAgaWYgKG91dCA9PSBOVUxMKSByZXR1cm47Ci0gICAgICAgIGZwcmludGYob3V0LCAiLyogY3JjMzIuaCAtLSB0YWJsZXMgZm9yIHJhcGlkIENSQyBjYWxjdWxhdGlvblxuIik7Ci0gICAgICAgIGZwcmludGYob3V0LCAiICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY3JjMzIuY1xuICovXG5cbiIpOwotICAgICAgICBmcHJpbnRmKG91dCwgImxvY2FsIGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICIpOwotICAgICAgICBmcHJpbnRmKG91dCwgImNyY190YWJsZVtUQkxTXVsyNTZdID1cbntcbiAge1xuIik7Ci0gICAgICAgIHdyaXRlX3RhYmxlKG91dCwgY3JjX3RhYmxlWzBdKTsKLSMgIGlmZGVmIEJZRk9VUgotICAgICAgICBmcHJpbnRmKG91dCwgIiNpZmRlZiBCWUZPVVJcbiIpOwotICAgICAgICBmb3IgKGsgPSAxOyBrIDwgODsgaysrKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKG91dCwgIiAgfSxcbiAge1xuIik7Ci0gICAgICAgICAgICB3cml0ZV90YWJsZShvdXQsIGNyY190YWJsZVtrXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZnByaW50ZihvdXQsICIjZW5kaWZcbiIpOwotIyAgZW5kaWYgLyogQllGT1VSICovCi0gICAgICAgIGZwcmludGYob3V0LCAiICB9XG59O1xuIik7Ci0gICAgICAgIGZjbG9zZShvdXQpOwotICAgIH0KLSNlbmRpZiAvKiBNQUtFQ1JDSCAqLwotfQotCi0jaWZkZWYgTUFLRUNSQ0gKLWxvY2FsIHZvaWQgd3JpdGVfdGFibGUob3V0LCB0YWJsZSkKLSAgICBGSUxFICpvdXQ7Ci0gICAgY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgKnRhYmxlOwotewotICAgIGludCBuOwotCi0gICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKQotICAgICAgICBmcHJpbnRmKG91dCwgIiVzMHglMDhseFVMJXMiLCBuICUgNSA/ICIiIDogIiAgICAiLCB0YWJsZVtuXSwKLSAgICAgICAgICAgICAgICBuID09IDI1NSA/ICJcbiIgOiAobiAlIDUgPT0gNCA/ICIsXG4iIDogIiwgIikpOwotfQotI2VuZGlmIC8qIE1BS0VDUkNIICovCi0KLSNlbHNlIC8qICFEWU5BTUlDX0NSQ19UQUJMRSAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUYWJsZXMgb2YgQ1JDLTMycyBvZiBhbGwgc2luZ2xlLWJ5dGUgdmFsdWVzLCBtYWRlIGJ5IG1ha2VfY3JjX3RhYmxlKCkuCi0gKi8KLSNpbmNsdWRlICJjcmMzMi5oIgotI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgYXNtIHZlcnNpb25zIG9mIGNyYzMyKCkKLSAqLwotY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgKiBaRVhQT1JUIGdldF9jcmNfdGFibGUoKQotewotI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCi0gICAgaWYgKGNyY190YWJsZV9lbXB0eSkKLSAgICAgICAgbWFrZV9jcmNfdGFibGUoKTsKLSNlbmRpZiAvKiBEWU5BTUlDX0NSQ19UQUJMRSAqLwotICAgIHJldHVybiAoY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgKiljcmNfdGFibGU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgRE8xIGNyYyA9IGNyY190YWJsZVswXVsoKGludCljcmMgXiAoKmJ1ZisrKSkgJiAweGZmXSBeIChjcmMgPj4gOCkKLSNkZWZpbmUgRE84IERPMTsgRE8xOyBETzE7IERPMTsgRE8xOyBETzE7IERPMTsgRE8xCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVuc2lnbmVkIGxvbmcgWkVYUE9SVCBjcmMzMihjcmMsIGJ1ZiwgbGVuKQotICAgIHVuc2lnbmVkIGxvbmcgY3JjOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWY7Ci0gICAgdW5zaWduZWQgbGVuOwotewotICAgIGlmIChidWYgPT0gWl9OVUxMKSByZXR1cm4gMFVMOwotCi0jaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKLSAgICBpZiAoY3JjX3RhYmxlX2VtcHR5KQotICAgICAgICBtYWtlX2NyY190YWJsZSgpOwotI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCi0KLSNpZmRlZiBCWUZPVVIKLSAgICBpZiAoc2l6ZW9mKHZvaWQgKikgPT0gc2l6ZW9mKHB0cmRpZmZfdCkpIHsKLSAgICAgICAgdTQgZW5kaWFuOwotCi0gICAgICAgIGVuZGlhbiA9IDE7Ci0gICAgICAgIGlmICgqKCh1bnNpZ25lZCBjaGFyICopKCZlbmRpYW4pKSkKLSAgICAgICAgICAgIHJldHVybiBjcmMzMl9saXR0bGUoY3JjLCBidWYsIGxlbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBjcmMzMl9iaWcoY3JjLCBidWYsIGxlbik7Ci0gICAgfQotI2VuZGlmIC8qIEJZRk9VUiAqLwotICAgIGNyYyA9IGNyYyBeIDB4ZmZmZmZmZmZVTDsKLSAgICB3aGlsZSAobGVuID49IDgpIHsKLSAgICAgICAgRE84OwotICAgICAgICBsZW4gLT0gODsKLSAgICB9Ci0gICAgaWYgKGxlbikgZG8gewotICAgICAgICBETzE7Ci0gICAgfSB3aGlsZSAoLS1sZW4pOwotICAgIHJldHVybiBjcmMgXiAweGZmZmZmZmZmVUw7Ci19Ci0KLSNpZmRlZiBCWUZPVVIKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBET0xJVDQgYyBePSAqYnVmNCsrOyBcCi0gICAgICAgIGMgPSBjcmNfdGFibGVbM11bYyAmIDB4ZmZdIF4gY3JjX3RhYmxlWzJdWyhjID4+IDgpICYgMHhmZl0gXiBcCi0gICAgICAgICAgICBjcmNfdGFibGVbMV1bKGMgPj4gMTYpICYgMHhmZl0gXiBjcmNfdGFibGVbMF1bYyA+PiAyNF0KLSNkZWZpbmUgRE9MSVQzMiBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNAotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1sb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2xpdHRsZShjcmMsIGJ1ZiwgbGVuKQotICAgIHVuc2lnbmVkIGxvbmcgY3JjOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWY7Ci0gICAgdW5zaWduZWQgbGVuOwotewotICAgIHJlZ2lzdGVyIHU0IGM7Ci0gICAgcmVnaXN0ZXIgY29uc3QgdTQgRkFSICpidWY0OwotCi0gICAgYyA9ICh1NCljcmM7Ci0gICAgYyA9IH5jOwotICAgIHdoaWxlIChsZW4gJiYgKChwdHJkaWZmX3QpYnVmICYgMykpIHsKLSAgICAgICAgYyA9IGNyY190YWJsZVswXVsoYyBeICpidWYrKykgJiAweGZmXSBeIChjID4+IDgpOwotICAgICAgICBsZW4tLTsKLSAgICB9Ci0KLSAgICBidWY0ID0gKGNvbnN0IHU0IEZBUiAqKShjb25zdCB2b2lkIEZBUiAqKWJ1ZjsKLSAgICB3aGlsZSAobGVuID49IDMyKSB7Ci0gICAgICAgIERPTElUMzI7Ci0gICAgICAgIGxlbiAtPSAzMjsKLSAgICB9Ci0gICAgd2hpbGUgKGxlbiA+PSA0KSB7Ci0gICAgICAgIERPTElUNDsKLSAgICAgICAgbGVuIC09IDQ7Ci0gICAgfQotICAgIGJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqKWJ1ZjQ7Ci0KLSAgICBpZiAobGVuKSBkbyB7Ci0gICAgICAgIGMgPSBjcmNfdGFibGVbMF1bKGMgXiAqYnVmKyspICYgMHhmZl0gXiAoYyA+PiA4KTsKLSAgICB9IHdoaWxlICgtLWxlbik7Ci0gICAgYyA9IH5jOwotICAgIHJldHVybiAodW5zaWduZWQgbG9uZyljOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIERPQklHNCBjIF49ICorK2J1ZjQ7IFwKLSAgICAgICAgYyA9IGNyY190YWJsZVs0XVtjICYgMHhmZl0gXiBjcmNfdGFibGVbNV1bKGMgPj4gOCkgJiAweGZmXSBeIFwKLSAgICAgICAgICAgIGNyY190YWJsZVs2XVsoYyA+PiAxNikgJiAweGZmXSBeIGNyY190YWJsZVs3XVtjID4+IDI0XQotI2RlZmluZSBET0JJRzMyIERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWxvY2FsIHVuc2lnbmVkIGxvbmcgY3JjMzJfYmlnKGNyYywgYnVmLCBsZW4pCi0gICAgdW5zaWduZWQgbG9uZyBjcmM7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZjsKLSAgICB1bnNpZ25lZCBsZW47Ci17Ci0gICAgcmVnaXN0ZXIgdTQgYzsKLSAgICByZWdpc3RlciBjb25zdCB1NCBGQVIgKmJ1ZjQ7Ci0KLSAgICBjID0gUkVWKCh1NCljcmMpOwotICAgIGMgPSB+YzsKLSAgICB3aGlsZSAobGVuICYmICgocHRyZGlmZl90KWJ1ZiAmIDMpKSB7Ci0gICAgICAgIGMgPSBjcmNfdGFibGVbNF1bKGMgPj4gMjQpIF4gKmJ1ZisrXSBeIChjIDw8IDgpOwotICAgICAgICBsZW4tLTsKLSAgICB9Ci0KLSAgICBidWY0ID0gKGNvbnN0IHU0IEZBUiAqKShjb25zdCB2b2lkIEZBUiAqKWJ1ZjsKLSAgICBidWY0LS07Ci0gICAgd2hpbGUgKGxlbiA+PSAzMikgewotICAgICAgICBET0JJRzMyOwotICAgICAgICBsZW4gLT0gMzI7Ci0gICAgfQotICAgIHdoaWxlIChsZW4gPj0gNCkgewotICAgICAgICBET0JJRzQ7Ci0gICAgICAgIGxlbiAtPSA0OwotICAgIH0KLSAgICBidWY0Kys7Ci0gICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICopYnVmNDsKLQotICAgIGlmIChsZW4pIGRvIHsKLSAgICAgICAgYyA9IGNyY190YWJsZVs0XVsoYyA+PiAyNCkgXiAqYnVmKytdIF4gKGMgPDwgOCk7Ci0gICAgfSB3aGlsZSAoLS1sZW4pOwotICAgIGMgPSB+YzsKLSAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpKFJFVihjKSk7Ci19Ci0KLSNlbmRpZiAvKiBCWUZPVVIgKi8KLQotI2RlZmluZSBHRjJfRElNIDMyICAgICAgLyogZGltZW5zaW9uIG9mIEdGKDIpIHZlY3RvcnMgKGxlbmd0aCBvZiBDUkMpICovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWxvY2FsIHVuc2lnbmVkIGxvbmcgZ2YyX21hdHJpeF90aW1lcyhtYXQsIHZlYykKLSAgICB1bnNpZ25lZCBsb25nICptYXQ7Ci0gICAgdW5zaWduZWQgbG9uZyB2ZWM7Ci17Ci0gICAgdW5zaWduZWQgbG9uZyBzdW07Ci0KLSAgICBzdW0gPSAwOwotICAgIHdoaWxlICh2ZWMpIHsKLSAgICAgICAgaWYgKHZlYyAmIDEpCi0gICAgICAgICAgICBzdW0gXj0gKm1hdDsKLSAgICAgICAgdmVjID4+PSAxOwotICAgICAgICBtYXQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHN1bTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotbG9jYWwgdm9pZCBnZjJfbWF0cml4X3NxdWFyZShzcXVhcmUsIG1hdCkKLSAgICB1bnNpZ25lZCBsb25nICpzcXVhcmU7Ci0gICAgdW5zaWduZWQgbG9uZyAqbWF0OwotewotICAgIGludCBuOwotCi0gICAgZm9yIChuID0gMDsgbiA8IEdGMl9ESU07IG4rKykKLSAgICAgICAgc3F1YXJlW25dID0gZ2YyX21hdHJpeF90aW1lcyhtYXQsIG1hdFtuXSk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZShjcmMxLCBjcmMyLCBsZW4yKQotICAgIHVMb25nIGNyYzE7Ci0gICAgdUxvbmcgY3JjMjsKLSAgICB6X29mZl90IGxlbjI7Ci17Ci0gICAgaW50IG47Ci0gICAgdW5zaWduZWQgbG9uZyByb3c7Ci0gICAgdW5zaWduZWQgbG9uZyBldmVuW0dGMl9ESU1dOyAgICAvKiBldmVuLXBvd2VyLW9mLXR3byB6ZXJvcyBvcGVyYXRvciAqLwotICAgIHVuc2lnbmVkIGxvbmcgb2RkW0dGMl9ESU1dOyAgICAgLyogb2RkLXBvd2VyLW9mLXR3byB6ZXJvcyBvcGVyYXRvciAqLwotCi0gICAgLyogZGVnZW5lcmF0ZSBjYXNlICovCi0gICAgaWYgKGxlbjIgPT0gMCkKLSAgICAgICAgcmV0dXJuIGNyYzE7Ci0KLSAgICAvKiBwdXQgb3BlcmF0b3IgZm9yIG9uZSB6ZXJvIGJpdCBpbiBvZGQgKi8KLSAgICBvZGRbMF0gPSAweGVkYjg4MzIwTDsgICAgICAgICAgIC8qIENSQy0zMiBwb2x5bm9taWFsICovCi0gICAgcm93ID0gMTsKLSAgICBmb3IgKG4gPSAxOyBuIDwgR0YyX0RJTTsgbisrKSB7Ci0gICAgICAgIG9kZFtuXSA9IHJvdzsKLSAgICAgICAgcm93IDw8PSAxOwotICAgIH0KLQotICAgIC8qIHB1dCBvcGVyYXRvciBmb3IgdHdvIHplcm8gYml0cyBpbiBldmVuICovCi0gICAgZ2YyX21hdHJpeF9zcXVhcmUoZXZlbiwgb2RkKTsKLQotICAgIC8qIHB1dCBvcGVyYXRvciBmb3IgZm91ciB6ZXJvIGJpdHMgaW4gb2RkICovCi0gICAgZ2YyX21hdHJpeF9zcXVhcmUob2RkLCBldmVuKTsKLQotICAgIC8qIGFwcGx5IGxlbjIgemVyb3MgdG8gY3JjMSAoZmlyc3Qgc3F1YXJlIHdpbGwgcHV0IHRoZSBvcGVyYXRvciBmb3Igb25lCi0gICAgICAgemVybyBieXRlLCBlaWdodCB6ZXJvIGJpdHMsIGluIGV2ZW4pICovCi0gICAgZG8gewotICAgICAgICAvKiBhcHBseSB6ZXJvcyBvcGVyYXRvciBmb3IgdGhpcyBiaXQgb2YgbGVuMiAqLwotICAgICAgICBnZjJfbWF0cml4X3NxdWFyZShldmVuLCBvZGQpOwotICAgICAgICBpZiAobGVuMiAmIDEpCi0gICAgICAgICAgICBjcmMxID0gZ2YyX21hdHJpeF90aW1lcyhldmVuLCBjcmMxKTsKLSAgICAgICAgbGVuMiA+Pj0gMTsKLQotICAgICAgICAvKiBpZiBubyBtb3JlIGJpdHMgc2V0LCB0aGVuIGRvbmUgKi8KLSAgICAgICAgaWYgKGxlbjIgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIGFub3RoZXIgaXRlcmF0aW9uIG9mIHRoZSBsb29wIHdpdGggb2RkIGFuZCBldmVuIHN3YXBwZWQgKi8KLSAgICAgICAgZ2YyX21hdHJpeF9zcXVhcmUob2RkLCBldmVuKTsKLSAgICAgICAgaWYgKGxlbjIgJiAxKQotICAgICAgICAgICAgY3JjMSA9IGdmMl9tYXRyaXhfdGltZXMob2RkLCBjcmMxKTsKLSAgICAgICAgbGVuMiA+Pj0gMTsKLQotICAgICAgICAvKiBpZiBubyBtb3JlIGJpdHMgc2V0LCB0aGVuIGRvbmUgKi8KLSAgICB9IHdoaWxlIChsZW4yICE9IDApOwotCi0gICAgLyogcmV0dXJuIGNvbWJpbmVkIGNyYyAqLwotICAgIGNyYzEgXj0gY3JjMjsKLSAgICByZXR1cm4gY3JjMTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9jcmMzMi5oIGIvbGlicy96bGliL2NyYzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTNiNjEuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2NyYzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEgKzAsMCBAQAotLyogY3JjMzIuaCAtLSB0YWJsZXMgZm9yIHJhcGlkIENSQyBjYWxjdWxhdGlvbgotICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY3JjMzIuYwotICovCi0KLWxvY2FsIGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSIGNyY190YWJsZVtUQkxTXVsyNTZdID0KLXsKLSAgewotICAgIDB4MDAwMDAwMDBVTCwgMHg3NzA3MzA5NlVMLCAweGVlMGU2MTJjVUwsIDB4OTkwOTUxYmFVTCwgMHgwNzZkYzQxOVVMLAotICAgIDB4NzA2YWY0OGZVTCwgMHhlOTYzYTUzNVVMLCAweDllNjQ5NWEzVUwsIDB4MGVkYjg4MzJVTCwgMHg3OWRjYjhhNFVMLAotICAgIDB4ZTBkNWU5MWVVTCwgMHg5N2QyZDk4OFVMLCAweDA5YjY0YzJiVUwsIDB4N2ViMTdjYmRVTCwgMHhlN2I4MmQwN1VMLAotICAgIDB4OTBiZjFkOTFVTCwgMHgxZGI3MTA2NFVMLCAweDZhYjAyMGYyVUwsIDB4ZjNiOTcxNDhVTCwgMHg4NGJlNDFkZVVMLAotICAgIDB4MWFkYWQ0N2RVTCwgMHg2ZGRkZTRlYlVMLCAweGY0ZDRiNTUxVUwsIDB4ODNkMzg1YzdVTCwgMHgxMzZjOTg1NlVMLAotICAgIDB4NjQ2YmE4YzBVTCwgMHhmZDYyZjk3YVVMLCAweDhhNjVjOWVjVUwsIDB4MTQwMTVjNGZVTCwgMHg2MzA2NmNkOVVMLAotICAgIDB4ZmEwZjNkNjNVTCwgMHg4ZDA4MGRmNVVMLCAweDNiNmUyMGM4VUwsIDB4NGM2OTEwNWVVTCwgMHhkNTYwNDFlNFVMLAotICAgIDB4YTI2NzcxNzJVTCwgMHgzYzAzZTRkMVVMLCAweDRiMDRkNDQ3VUwsIDB4ZDIwZDg1ZmRVTCwgMHhhNTBhYjU2YlVMLAotICAgIDB4MzViNWE4ZmFVTCwgMHg0MmIyOTg2Y1VMLCAweGRiYmJjOWQ2VUwsIDB4YWNiY2Y5NDBVTCwgMHgzMmQ4NmNlM1VMLAotICAgIDB4NDVkZjVjNzVVTCwgMHhkY2Q2MGRjZlVMLCAweGFiZDEzZDU5VUwsIDB4MjZkOTMwYWNVTCwgMHg1MWRlMDAzYVVMLAotICAgIDB4YzhkNzUxODBVTCwgMHhiZmQwNjExNlVMLCAweDIxYjRmNGI1VUwsIDB4NTZiM2M0MjNVTCwgMHhjZmJhOTU5OVVMLAotICAgIDB4YjhiZGE1MGZVTCwgMHgyODAyYjg5ZVVMLCAweDVmMDU4ODA4VUwsIDB4YzYwY2Q5YjJVTCwgMHhiMTBiZTkyNFVMLAotICAgIDB4MmY2ZjdjODdVTCwgMHg1ODY4NGMxMVVMLCAweGMxNjExZGFiVUwsIDB4YjY2NjJkM2RVTCwgMHg3NmRjNDE5MFVMLAotICAgIDB4MDFkYjcxMDZVTCwgMHg5OGQyMjBiY1VMLCAweGVmZDUxMDJhVUwsIDB4NzFiMTg1ODlVTCwgMHgwNmI2YjUxZlVMLAotICAgIDB4OWZiZmU0YTVVTCwgMHhlOGI4ZDQzM1VMLCAweDc4MDdjOWEyVUwsIDB4MGYwMGY5MzRVTCwgMHg5NjA5YTg4ZVVMLAotICAgIDB4ZTEwZTk4MThVTCwgMHg3ZjZhMGRiYlVMLCAweDA4NmQzZDJkVUwsIDB4OTE2NDZjOTdVTCwgMHhlNjYzNWMwMVVMLAotICAgIDB4NmI2YjUxZjRVTCwgMHgxYzZjNjE2MlVMLCAweDg1NjUzMGQ4VUwsIDB4ZjI2MjAwNGVVTCwgMHg2YzA2OTVlZFVMLAotICAgIDB4MWIwMWE1N2JVTCwgMHg4MjA4ZjRjMVVMLCAweGY1MGZjNDU3VUwsIDB4NjViMGQ5YzZVTCwgMHgxMmI3ZTk1MFVMLAotICAgIDB4OGJiZWI4ZWFVTCwgMHhmY2I5ODg3Y1VMLCAweDYyZGQxZGRmVUwsIDB4MTVkYTJkNDlVTCwgMHg4Y2QzN2NmM1VMLAotICAgIDB4ZmJkNDRjNjVVTCwgMHg0ZGIyNjE1OFVMLCAweDNhYjU1MWNlVUwsIDB4YTNiYzAwNzRVTCwgMHhkNGJiMzBlMlVMLAotICAgIDB4NGFkZmE1NDFVTCwgMHgzZGQ4OTVkN1VMLCAweGE0ZDFjNDZkVUwsIDB4ZDNkNmY0ZmJVTCwgMHg0MzY5ZTk2YVVMLAotICAgIDB4MzQ2ZWQ5ZmNVTCwgMHhhZDY3ODg0NlVMLCAweGRhNjBiOGQwVUwsIDB4NDQwNDJkNzNVTCwgMHgzMzAzMWRlNVVMLAotICAgIDB4YWEwYTRjNWZVTCwgMHhkZDBkN2NjOVVMLCAweDUwMDU3MTNjVUwsIDB4MjcwMjQxYWFVTCwgMHhiZTBiMTAxMFVMLAotICAgIDB4YzkwYzIwODZVTCwgMHg1NzY4YjUyNVVMLCAweDIwNmY4NWIzVUwsIDB4Yjk2NmQ0MDlVTCwgMHhjZTYxZTQ5ZlVMLAotICAgIDB4NWVkZWY5MGVVTCwgMHgyOWQ5Yzk5OFVMLCAweGIwZDA5ODIyVUwsIDB4YzdkN2E4YjRVTCwgMHg1OWIzM2QxN1VMLAotICAgIDB4MmViNDBkODFVTCwgMHhiN2JkNWMzYlVMLCAweGMwYmE2Y2FkVUwsIDB4ZWRiODgzMjBVTCwgMHg5YWJmYjNiNlVMLAotICAgIDB4MDNiNmUyMGNVTCwgMHg3NGIxZDI5YVVMLCAweGVhZDU0NzM5VUwsIDB4OWRkMjc3YWZVTCwgMHgwNGRiMjYxNVVMLAotICAgIDB4NzNkYzE2ODNVTCwgMHhlMzYzMGIxMlVMLCAweDk0NjQzYjg0VUwsIDB4MGQ2ZDZhM2VVTCwgMHg3YTZhNWFhOFVMLAotICAgIDB4ZTQwZWNmMGJVTCwgMHg5MzA5ZmY5ZFVMLCAweDBhMDBhZTI3VUwsIDB4N2QwNzllYjFVTCwgMHhmMDBmOTM0NFVMLAotICAgIDB4ODcwOGEzZDJVTCwgMHgxZTAxZjI2OFVMLCAweDY5MDZjMmZlVUwsIDB4Zjc2MjU3NWRVTCwgMHg4MDY1NjdjYlVMLAotICAgIDB4MTk2YzM2NzFVTCwgMHg2ZTZiMDZlN1VMLCAweGZlZDQxYjc2VUwsIDB4ODlkMzJiZTBVTCwgMHgxMGRhN2E1YVVMLAotICAgIDB4NjdkZDRhY2NVTCwgMHhmOWI5ZGY2ZlVMLCAweDhlYmVlZmY5VUwsIDB4MTdiN2JlNDNVTCwgMHg2MGIwOGVkNVVMLAotICAgIDB4ZDZkNmEzZThVTCwgMHhhMWQxOTM3ZVVMLCAweDM4ZDhjMmM0VUwsIDB4NGZkZmYyNTJVTCwgMHhkMWJiNjdmMVVMLAotICAgIDB4YTZiYzU3NjdVTCwgMHgzZmI1MDZkZFVMLCAweDQ4YjIzNjRiVUwsIDB4ZDgwZDJiZGFVTCwgMHhhZjBhMWI0Y1VMLAotICAgIDB4MzYwMzRhZjZVTCwgMHg0MTA0N2E2MFVMLCAweGRmNjBlZmMzVUwsIDB4YTg2N2RmNTVVTCwgMHgzMTZlOGVlZlVMLAotICAgIDB4NDY2OWJlNzlVTCwgMHhjYjYxYjM4Y1VMLCAweGJjNjY4MzFhVUwsIDB4MjU2ZmQyYTBVTCwgMHg1MjY4ZTIzNlVMLAotICAgIDB4Y2MwYzc3OTVVTCwgMHhiYjBiNDcwM1VMLCAweDIyMDIxNmI5VUwsIDB4NTUwNTI2MmZVTCwgMHhjNWJhM2JiZVVMLAotICAgIDB4YjJiZDBiMjhVTCwgMHgyYmI0NWE5MlVMLCAweDVjYjM2YTA0VUwsIDB4YzJkN2ZmYTdVTCwgMHhiNWQwY2YzMVVMLAotICAgIDB4MmNkOTllOGJVTCwgMHg1YmRlYWUxZFVMLCAweDliNjRjMmIwVUwsIDB4ZWM2M2YyMjZVTCwgMHg3NTZhYTM5Y1VMLAotICAgIDB4MDI2ZDkzMGFVTCwgMHg5YzA5MDZhOVVMLCAweGViMGUzNjNmVUwsIDB4NzIwNzY3ODVVTCwgMHgwNTAwNTcxM1VMLAotICAgIDB4OTViZjRhODJVTCwgMHhlMmI4N2ExNFVMLCAweDdiYjEyYmFlVUwsIDB4MGNiNjFiMzhVTCwgMHg5MmQyOGU5YlVMLAotICAgIDB4ZTVkNWJlMGRVTCwgMHg3Y2RjZWZiN1VMLCAweDBiZGJkZjIxVUwsIDB4ODZkM2QyZDRVTCwgMHhmMWQ0ZTI0MlVMLAotICAgIDB4NjhkZGIzZjhVTCwgMHgxZmRhODM2ZVVMLCAweDgxYmUxNmNkVUwsIDB4ZjZiOTI2NWJVTCwgMHg2ZmIwNzdlMVVMLAotICAgIDB4MThiNzQ3NzdVTCwgMHg4ODA4NWFlNlVMLCAweGZmMGY2YTcwVUwsIDB4NjYwNjNiY2FVTCwgMHgxMTAxMGI1Y1VMLAotICAgIDB4OGY2NTllZmZVTCwgMHhmODYyYWU2OVVMLCAweDYxNmJmZmQzVUwsIDB4MTY2Y2NmNDVVTCwgMHhhMDBhZTI3OFVMLAotICAgIDB4ZDcwZGQyZWVVTCwgMHg0ZTA0ODM1NFVMLCAweDM5MDNiM2MyVUwsIDB4YTc2NzI2NjFVTCwgMHhkMDYwMTZmN1VMLAotICAgIDB4NDk2OTQ3NGRVTCwgMHgzZTZlNzdkYlVMLCAweGFlZDE2YTRhVUwsIDB4ZDlkNjVhZGNVTCwgMHg0MGRmMGI2NlVMLAotICAgIDB4MzdkODNiZjBVTCwgMHhhOWJjYWU1M1VMLCAweGRlYmI5ZWM1VUwsIDB4NDdiMmNmN2ZVTCwgMHgzMGI1ZmZlOVVMLAotICAgIDB4YmRiZGYyMWNVTCwgMHhjYWJhYzI4YVVMLCAweDUzYjM5MzMwVUwsIDB4MjRiNGEzYTZVTCwgMHhiYWQwMzYwNVVMLAotICAgIDB4Y2RkNzA2OTNVTCwgMHg1NGRlNTcyOVVMLCAweDIzZDk2N2JmVUwsIDB4YjM2NjdhMmVVTCwgMHhjNDYxNGFiOFVMLAotICAgIDB4NWQ2ODFiMDJVTCwgMHgyYTZmMmI5NFVMLCAweGI0MGJiZTM3VUwsIDB4YzMwYzhlYTFVTCwgMHg1YTA1ZGYxYlVMLAotICAgIDB4MmQwMmVmOGRVTAotI2lmZGVmIEJZRk9VUgotICB9LAotICB7Ci0gICAgMHgwMDAwMDAwMFVMLCAweDE5MWIzMTQxVUwsIDB4MzIzNjYyODJVTCwgMHgyYjJkNTNjM1VMLCAweDY0NmNjNTA0VUwsCi0gICAgMHg3ZDc3ZjQ0NVVMLCAweDU2NWFhNzg2VUwsIDB4NGY0MTk2YzdVTCwgMHhjOGQ5OGEwOFVMLCAweGQxYzJiYjQ5VUwsCi0gICAgMHhmYWVmZTg4YVVMLCAweGUzZjRkOWNiVUwsIDB4YWNiNTRmMGNVTCwgMHhiNWFlN2U0ZFVMLCAweDllODMyZDhlVUwsCi0gICAgMHg4Nzk4MWNjZlVMLCAweDRhYzIxMjUxVUwsIDB4NTNkOTIzMTBVTCwgMHg3OGY0NzBkM1VMLCAweDYxZWY0MTkyVUwsCi0gICAgMHgyZWFlZDc1NVVMLCAweDM3YjVlNjE0VUwsIDB4MWM5OGI1ZDdVTCwgMHgwNTgzODQ5NlVMLCAweDgyMWI5ODU5VUwsCi0gICAgMHg5YjAwYTkxOFVMLCAweGIwMmRmYWRiVUwsIDB4YTkzNmNiOWFVTCwgMHhlNjc3NWQ1ZFVMLCAweGZmNmM2YzFjVUwsCi0gICAgMHhkNDQxM2ZkZlVMLCAweGNkNWEwZTllVUwsIDB4OTU4NDI0YTJVTCwgMHg4YzlmMTVlM1VMLCAweGE3YjI0NjIwVUwsCi0gICAgMHhiZWE5Nzc2MVVMLCAweGYxZThlMWE2VUwsIDB4ZThmM2QwZTdVTCwgMHhjM2RlODMyNFVMLCAweGRhYzViMjY1VUwsCi0gICAgMHg1ZDVkYWVhYVVMLCAweDQ0NDY5ZmViVUwsIDB4NmY2YmNjMjhVTCwgMHg3NjcwZmQ2OVVMLCAweDM5MzE2YmFlVUwsCi0gICAgMHgyMDJhNWFlZlVMLCAweDBiMDcwOTJjVUwsIDB4MTIxYzM4NmRVTCwgMHhkZjQ2MzZmM1VMLCAweGM2NWQwN2IyVUwsCi0gICAgMHhlZDcwNTQ3MVVMLCAweGY0NmI2NTMwVUwsIDB4YmIyYWYzZjdVTCwgMHhhMjMxYzJiNlVMLCAweDg5MWM5MTc1VUwsCi0gICAgMHg5MDA3YTAzNFVMLCAweDE3OWZiY2ZiVUwsIDB4MGU4NDhkYmFVTCwgMHgyNWE5ZGU3OVVMLCAweDNjYjJlZjM4VUwsCi0gICAgMHg3M2YzNzlmZlVMLCAweDZhZTg0OGJlVUwsIDB4NDFjNTFiN2RVTCwgMHg1OGRlMmEzY1VMLCAweGYwNzk0ZjA1VUwsCi0gICAgMHhlOTYyN2U0NFVMLCAweGMyNGYyZDg3VUwsIDB4ZGI1NDFjYzZVTCwgMHg5NDE1OGEwMVVMLCAweDhkMGViYjQwVUwsCi0gICAgMHhhNjIzZTg4M1VMLCAweGJmMzhkOWMyVUwsIDB4MzhhMGM1MGRVTCwgMHgyMWJiZjQ0Y1VMLCAweDBhOTZhNzhmVUwsCi0gICAgMHgxMzhkOTZjZVVMLCAweDVjY2MwMDA5VUwsIDB4NDVkNzMxNDhVTCwgMHg2ZWZhNjI4YlVMLCAweDc3ZTE1M2NhVUwsCi0gICAgMHhiYWJiNWQ1NFVMLCAweGEzYTA2YzE1VUwsIDB4ODg4ZDNmZDZVTCwgMHg5MTk2MGU5N1VMLCAweGRlZDc5ODUwVUwsCi0gICAgMHhjN2NjYTkxMVVMLCAweGVjZTFmYWQyVUwsIDB4ZjVmYWNiOTNVTCwgMHg3MjYyZDc1Y1VMLCAweDZiNzllNjFkVUwsCi0gICAgMHg0MDU0YjVkZVVMLCAweDU5NGY4NDlmVUwsIDB4MTYwZTEyNThVTCwgMHgwZjE1MjMxOVVMLCAweDI0Mzg3MGRhVUwsCi0gICAgMHgzZDIzNDE5YlVMLCAweDY1ZmQ2YmE3VUwsIDB4N2NlNjVhZTZVTCwgMHg1N2NiMDkyNVVMLCAweDRlZDAzODY0VUwsCi0gICAgMHgwMTkxYWVhM1VMLCAweDE4OGE5ZmUyVUwsIDB4MzNhN2NjMjFVTCwgMHgyYWJjZmQ2MFVMLCAweGFkMjRlMWFmVUwsCi0gICAgMHhiNDNmZDBlZVVMLCAweDlmMTI4MzJkVUwsIDB4ODYwOWIyNmNVTCwgMHhjOTQ4MjRhYlVMLCAweGQwNTMxNWVhVUwsCi0gICAgMHhmYjdlNDYyOVVMLCAweGUyNjU3NzY4VUwsIDB4MmYzZjc5ZjZVTCwgMHgzNjI0NDhiN1VMLCAweDFkMDkxYjc0VUwsCi0gICAgMHgwNDEyMmEzNVVMLCAweDRiNTNiY2YyVUwsIDB4NTI0ODhkYjNVTCwgMHg3OTY1ZGU3MFVMLCAweDYwN2VlZjMxVUwsCi0gICAgMHhlN2U2ZjNmZVVMLCAweGZlZmRjMmJmVUwsIDB4ZDVkMDkxN2NVTCwgMHhjY2NiYTAzZFVMLCAweDgzOGEzNmZhVUwsCi0gICAgMHg5YTkxMDdiYlVMLCAweGIxYmM1NDc4VUwsIDB4YThhNzY1MzlVTCwgMHgzYjgzOTg0YlVMLCAweDIyOThhOTBhVUwsCi0gICAgMHgwOWI1ZmFjOVVMLCAweDEwYWVjYjg4VUwsIDB4NWZlZjVkNGZVTCwgMHg0NmY0NmMwZVVMLCAweDZkZDkzZmNkVUwsCi0gICAgMHg3NGMyMGU4Y1VMLCAweGYzNWExMjQzVUwsIDB4ZWE0MTIzMDJVTCwgMHhjMTZjNzBjMVVMLCAweGQ4Nzc0MTgwVUwsCi0gICAgMHg5NzM2ZDc0N1VMLCAweDhlMmRlNjA2VUwsIDB4YTUwMGI1YzVVTCwgMHhiYzFiODQ4NFVMLCAweDcxNDE4YTFhVUwsCi0gICAgMHg2ODVhYmI1YlVMLCAweDQzNzdlODk4VUwsIDB4NWE2Y2Q5ZDlVTCwgMHgxNTJkNGYxZVVMLCAweDBjMzY3ZTVmVUwsCi0gICAgMHgyNzFiMmQ5Y1VMLCAweDNlMDAxY2RkVUwsIDB4Yjk5ODAwMTJVTCwgMHhhMDgzMzE1M1VMLCAweDhiYWU2MjkwVUwsCi0gICAgMHg5MmI1NTNkMVVMLCAweGRkZjRjNTE2VUwsIDB4YzRlZmY0NTdVTCwgMHhlZmMyYTc5NFVMLCAweGY2ZDk5NmQ1VUwsCi0gICAgMHhhZTA3YmNlOVVMLCAweGI3MWM4ZGE4VUwsIDB4OWMzMWRlNmJVTCwgMHg4NTJhZWYyYVVMLCAweGNhNmI3OWVkVUwsCi0gICAgMHhkMzcwNDhhY1VMLCAweGY4NWQxYjZmVUwsIDB4ZTE0NjJhMmVVTCwgMHg2NmRlMzZlMVVMLCAweDdmYzUwN2EwVUwsCi0gICAgMHg1NGU4NTQ2M1VMLCAweDRkZjM2NTIyVUwsIDB4MDJiMmYzZTVVTCwgMHgxYmE5YzJhNFVMLCAweDMwODQ5MTY3VUwsCi0gICAgMHgyOTlmYTAyNlVMLCAweGU0YzVhZWI4VUwsIDB4ZmRkZTlmZjlVTCwgMHhkNmYzY2MzYVVMLCAweGNmZThmZDdiVUwsCi0gICAgMHg4MGE5NmJiY1VMLCAweDk5YjI1YWZkVUwsIDB4YjI5ZjA5M2VVTCwgMHhhYjg0Mzg3ZlVMLCAweDJjMWMyNGIwVUwsCi0gICAgMHgzNTA3MTVmMVVMLCAweDFlMmE0NjMyVUwsIDB4MDczMTc3NzNVTCwgMHg0ODcwZTFiNFVMLCAweDUxNmJkMGY1VUwsCi0gICAgMHg3YTQ2ODMzNlVMLCAweDYzNWRiMjc3VUwsIDB4Y2JmYWQ3NGVVTCwgMHhkMmUxZTYwZlVMLCAweGY5Y2NiNWNjVUwsCi0gICAgMHhlMGQ3ODQ4ZFVMLCAweGFmOTYxMjRhVUwsIDB4YjY4ZDIzMGJVTCwgMHg5ZGEwNzBjOFVMLCAweDg0YmI0MTg5VUwsCi0gICAgMHgwMzIzNWQ0NlVMLCAweDFhMzg2YzA3VUwsIDB4MzExNTNmYzRVTCwgMHgyODBlMGU4NVVMLCAweDY3NGY5ODQyVUwsCi0gICAgMHg3ZTU0YTkwM1VMLCAweDU1NzlmYWMwVUwsIDB4NGM2MmNiODFVTCwgMHg4MTM4YzUxZlVMLCAweDk4MjNmNDVlVUwsCi0gICAgMHhiMzBlYTc5ZFVMLCAweGFhMTU5NmRjVUwsIDB4ZTU1NDAwMWJVTCwgMHhmYzRmMzE1YVVMLCAweGQ3NjI2Mjk5VUwsCi0gICAgMHhjZTc5NTNkOFVMLCAweDQ5ZTE0ZjE3VUwsIDB4NTBmYTdlNTZVTCwgMHg3YmQ3MmQ5NVVMLCAweDYyY2MxY2Q0VUwsCi0gICAgMHgyZDhkOGExM1VMLCAweDM0OTZiYjUyVUwsIDB4MWZiYmU4OTFVTCwgMHgwNmEwZDlkMFVMLCAweDVlN2VmM2VjVUwsCi0gICAgMHg0NzY1YzJhZFVMLCAweDZjNDg5MTZlVUwsIDB4NzU1M2EwMmZVTCwgMHgzYTEyMzZlOFVMLCAweDIzMDkwN2E5VUwsCi0gICAgMHgwODI0NTQ2YVVMLCAweDExM2Y2NTJiVUwsIDB4OTZhNzc5ZTRVTCwgMHg4ZmJjNDhhNVVMLCAweGE0OTExYjY2VUwsCi0gICAgMHhiZDhhMmEyN1VMLCAweGYyY2JiY2UwVUwsIDB4ZWJkMDhkYTFVTCwgMHhjMGZkZGU2MlVMLCAweGQ5ZTZlZjIzVUwsCi0gICAgMHgxNGJjZTFiZFVMLCAweDBkYTdkMGZjVUwsIDB4MjY4YTgzM2ZVTCwgMHgzZjkxYjI3ZVVMLCAweDcwZDAyNGI5VUwsCi0gICAgMHg2OWNiMTVmOFVMLCAweDQyZTY0NjNiVUwsIDB4NWJmZDc3N2FVTCwgMHhkYzY1NmJiNVVMLCAweGM1N2U1YWY0VUwsCi0gICAgMHhlZTUzMDkzN1VMLCAweGY3NDgzODc2VUwsIDB4YjgwOWFlYjFVTCwgMHhhMTEyOWZmMFVMLCAweDhhM2ZjYzMzVUwsCi0gICAgMHg5MzI0ZmQ3MlVMCi0gIH0sCi0gIHsKLSAgICAweDAwMDAwMDAwVUwsIDB4MDFjMjZhMzdVTCwgMHgwMzg0ZDQ2ZVVMLCAweDAyNDZiZTU5VUwsIDB4MDcwOWE4ZGNVTCwKLSAgICAweDA2Y2JjMmViVUwsIDB4MDQ4ZDdjYjJVTCwgMHgwNTRmMTY4NVVMLCAweDBlMTM1MWI4VUwsIDB4MGZkMTNiOGZVTCwKLSAgICAweDBkOTc4NWQ2VUwsIDB4MGM1NWVmZTFVTCwgMHgwOTFhZjk2NFVMLCAweDA4ZDg5MzUzVUwsIDB4MGE5ZTJkMGFVTCwKLSAgICAweDBiNWM0NzNkVUwsIDB4MWMyNmEzNzBVTCwgMHgxZGU0Yzk0N1VMLCAweDFmYTI3NzFlVUwsIDB4MWU2MDFkMjlVTCwKLSAgICAweDFiMmYwYmFjVUwsIDB4MWFlZDYxOWJVTCwgMHgxOGFiZGZjMlVMLCAweDE5NjliNWY1VUwsIDB4MTIzNWYyYzhVTCwKLSAgICAweDEzZjc5OGZmVUwsIDB4MTFiMTI2YTZVTCwgMHgxMDczNGM5MVVMLCAweDE1M2M1YTE0VUwsIDB4MTRmZTMwMjNVTCwKLSAgICAweDE2Yjg4ZTdhVUwsIDB4MTc3YWU0NGRVTCwgMHgzODRkNDZlMFVMLCAweDM5OGYyY2Q3VUwsIDB4M2JjOTkyOGVVTCwKLSAgICAweDNhMGJmOGI5VUwsIDB4M2Y0NGVlM2NVTCwgMHgzZTg2ODQwYlVMLCAweDNjYzAzYTUyVUwsIDB4M2QwMjUwNjVVTCwKLSAgICAweDM2NWUxNzU4VUwsIDB4Mzc5YzdkNmZVTCwgMHgzNWRhYzMzNlVMLCAweDM0MThhOTAxVUwsIDB4MzE1N2JmODRVTCwKLSAgICAweDMwOTVkNWIzVUwsIDB4MzJkMzZiZWFVTCwgMHgzMzExMDFkZFVMLCAweDI0NmJlNTkwVUwsIDB4MjVhOThmYTdVTCwKLSAgICAweDI3ZWYzMWZlVUwsIDB4MjYyZDViYzlVTCwgMHgyMzYyNGQ0Y1VMLCAweDIyYTAyNzdiVUwsIDB4MjBlNjk5MjJVTCwKLSAgICAweDIxMjRmMzE1VUwsIDB4MmE3OGI0MjhVTCwgMHgyYmJhZGUxZlVMLCAweDI5ZmM2MDQ2VUwsIDB4MjgzZTBhNzFVTCwKLSAgICAweDJkNzExY2Y0VUwsIDB4MmNiMzc2YzNVTCwgMHgyZWY1Yzg5YVVMLCAweDJmMzdhMmFkVUwsIDB4NzA5YThkYzBVTCwKLSAgICAweDcxNThlN2Y3VUwsIDB4NzMxZTU5YWVVTCwgMHg3MmRjMzM5OVVMLCAweDc3OTMyNTFjVUwsIDB4NzY1MTRmMmJVTCwKLSAgICAweDc0MTdmMTcyVUwsIDB4NzVkNTliNDVVTCwgMHg3ZTg5ZGM3OFVMLCAweDdmNGJiNjRmVUwsIDB4N2QwZDA4MTZVTCwKLSAgICAweDdjY2Y2MjIxVUwsIDB4Nzk4MDc0YTRVTCwgMHg3ODQyMWU5M1VMLCAweDdhMDRhMGNhVUwsIDB4N2JjNmNhZmRVTCwKLSAgICAweDZjYmMyZWIwVUwsIDB4NmQ3ZTQ0ODdVTCwgMHg2ZjM4ZmFkZVVMLCAweDZlZmE5MGU5VUwsIDB4NmJiNTg2NmNVTCwKLSAgICAweDZhNzdlYzViVUwsIDB4NjgzMTUyMDJVTCwgMHg2OWYzMzgzNVVMLCAweDYyYWY3ZjA4VUwsIDB4NjM2ZDE1M2ZVTCwKLSAgICAweDYxMmJhYjY2VUwsIDB4NjBlOWMxNTFVTCwgMHg2NWE2ZDdkNFVMLCAweDY0NjRiZGUzVUwsIDB4NjYyMjAzYmFVTCwKLSAgICAweDY3ZTA2OThkVUwsIDB4NDhkN2NiMjBVTCwgMHg0OTE1YTExN1VMLCAweDRiNTMxZjRlVUwsIDB4NGE5MTc1NzlVTCwKLSAgICAweDRmZGU2M2ZjVUwsIDB4NGUxYzA5Y2JVTCwgMHg0YzVhYjc5MlVMLCAweDRkOThkZGE1VUwsIDB4NDZjNDlhOThVTCwKLSAgICAweDQ3MDZmMGFmVUwsIDB4NDU0MDRlZjZVTCwgMHg0NDgyMjRjMVVMLCAweDQxY2QzMjQ0VUwsIDB4NDAwZjU4NzNVTCwKLSAgICAweDQyNDllNjJhVUwsIDB4NDM4YjhjMWRVTCwgMHg1NGYxNjg1MFVMLCAweDU1MzMwMjY3VUwsIDB4NTc3NWJjM2VVTCwKLSAgICAweDU2YjdkNjA5VUwsIDB4NTNmOGMwOGNVTCwgMHg1MjNhYWFiYlVMLCAweDUwN2MxNGUyVUwsIDB4NTFiZTdlZDVVTCwKLSAgICAweDVhZTIzOWU4VUwsIDB4NWIyMDUzZGZVTCwgMHg1OTY2ZWQ4NlVMLCAweDU4YTQ4N2IxVUwsIDB4NWRlYjkxMzRVTCwKLSAgICAweDVjMjlmYjAzVUwsIDB4NWU2ZjQ1NWFVTCwgMHg1ZmFkMmY2ZFVMLCAweGUxMzUxYjgwVUwsIDB4ZTBmNzcxYjdVTCwKLSAgICAweGUyYjFjZmVlVUwsIDB4ZTM3M2E1ZDlVTCwgMHhlNjNjYjM1Y1VMLCAweGU3ZmVkOTZiVUwsIDB4ZTViODY3MzJVTCwKLSAgICAweGU0N2EwZDA1VUwsIDB4ZWYyNjRhMzhVTCwgMHhlZWU0MjAwZlVMLCAweGVjYTI5ZTU2VUwsIDB4ZWQ2MGY0NjFVTCwKLSAgICAweGU4MmZlMmU0VUwsIDB4ZTllZDg4ZDNVTCwgMHhlYmFiMzY4YVVMLCAweGVhNjk1Y2JkVUwsIDB4ZmQxM2I4ZjBVTCwKLSAgICAweGZjZDFkMmM3VUwsIDB4ZmU5NzZjOWVVTCwgMHhmZjU1MDZhOVVMLCAweGZhMWExMDJjVUwsIDB4ZmJkODdhMWJVTCwKLSAgICAweGY5OWVjNDQyVUwsIDB4Zjg1Y2FlNzVVTCwgMHhmMzAwZTk0OFVMLCAweGYyYzI4MzdmVUwsIDB4ZjA4NDNkMjZVTCwKLSAgICAweGYxNDY1NzExVUwsIDB4ZjQwOTQxOTRVTCwgMHhmNWNiMmJhM1VMLCAweGY3OGQ5NWZhVUwsIDB4ZjY0ZmZmY2RVTCwKLSAgICAweGQ5Nzg1ZDYwVUwsIDB4ZDhiYTM3NTdVTCwgMHhkYWZjODkwZVVMLCAweGRiM2VlMzM5VUwsIDB4ZGU3MWY1YmNVTCwKLSAgICAweGRmYjM5ZjhiVUwsIDB4ZGRmNTIxZDJVTCwgMHhkYzM3NGJlNVVMLCAweGQ3NmIwY2Q4VUwsIDB4ZDZhOTY2ZWZVTCwKLSAgICAweGQ0ZWZkOGI2VUwsIDB4ZDUyZGIyODFVTCwgMHhkMDYyYTQwNFVMLCAweGQxYTBjZTMzVUwsIDB4ZDNlNjcwNmFVTCwKLSAgICAweGQyMjQxYTVkVUwsIDB4YzU1ZWZlMTBVTCwgMHhjNDljOTQyN1VMLCAweGM2ZGEyYTdlVUwsIDB4YzcxODQwNDlVTCwKLSAgICAweGMyNTc1NmNjVUwsIDB4YzM5NTNjZmJVTCwgMHhjMWQzODJhMlVMLCAweGMwMTFlODk1VUwsIDB4Y2I0ZGFmYThVTCwKLSAgICAweGNhOGZjNTlmVUwsIDB4YzhjOTdiYzZVTCwgMHhjOTBiMTFmMVVMLCAweGNjNDQwNzc0VUwsIDB4Y2Q4NjZkNDNVTCwKLSAgICAweGNmYzBkMzFhVUwsIDB4Y2UwMmI5MmRVTCwgMHg5MWFmOTY0MFVMLCAweDkwNmRmYzc3VUwsIDB4OTIyYjQyMmVVTCwKLSAgICAweDkzZTkyODE5VUwsIDB4OTZhNjNlOWNVTCwgMHg5NzY0NTRhYlVMLCAweDk1MjJlYWYyVUwsIDB4OTRlMDgwYzVVTCwKLSAgICAweDlmYmNjN2Y4VUwsIDB4OWU3ZWFkY2ZVTCwgMHg5YzM4MTM5NlVMLCAweDlkZmE3OWExVUwsIDB4OThiNTZmMjRVTCwKLSAgICAweDk5NzcwNTEzVUwsIDB4OWIzMWJiNGFVTCwgMHg5YWYzZDE3ZFVMLCAweDhkODkzNTMwVUwsIDB4OGM0YjVmMDdVTCwKLSAgICAweDhlMGRlMTVlVUwsIDB4OGZjZjhiNjlVTCwgMHg4YTgwOWRlY1VMLCAweDhiNDJmN2RiVUwsIDB4ODkwNDQ5ODJVTCwKLSAgICAweDg4YzYyM2I1VUwsIDB4ODM5YTY0ODhVTCwgMHg4MjU4MGViZlVMLCAweDgwMWViMGU2VUwsIDB4ODFkY2RhZDFVTCwKLSAgICAweDg0OTNjYzU0VUwsIDB4ODU1MWE2NjNVTCwgMHg4NzE3MTgzYVVMLCAweDg2ZDU3MjBkVUwsIDB4YTllMmQwYTBVTCwKLSAgICAweGE4MjBiYTk3VUwsIDB4YWE2NjA0Y2VVTCwgMHhhYmE0NmVmOVVMLCAweGFlZWI3ODdjVUwsIDB4YWYyOTEyNGJVTCwKLSAgICAweGFkNmZhYzEyVUwsIDB4YWNhZGM2MjVVTCwgMHhhN2YxODExOFVMLCAweGE2MzNlYjJmVUwsIDB4YTQ3NTU1NzZVTCwKLSAgICAweGE1YjczZjQxVUwsIDB4YTBmODI5YzRVTCwgMHhhMTNhNDNmM1VMLCAweGEzN2NmZGFhVUwsIDB4YTJiZTk3OWRVTCwKLSAgICAweGI1YzQ3M2QwVUwsIDB4YjQwNjE5ZTdVTCwgMHhiNjQwYTdiZVVMLCAweGI3ODJjZDg5VUwsIDB4YjJjZGRiMGNVTCwKLSAgICAweGIzMGZiMTNiVUwsIDB4YjE0OTBmNjJVTCwgMHhiMDhiNjU1NVVMLCAweGJiZDcyMjY4VUwsIDB4YmExNTQ4NWZVTCwKLSAgICAweGI4NTNmNjA2VUwsIDB4Yjk5MTljMzFVTCwgMHhiY2RlOGFiNFVMLCAweGJkMWNlMDgzVUwsIDB4YmY1YTVlZGFVTCwKLSAgICAweGJlOTgzNGVkVUwKLSAgfSwKLSAgewotICAgIDB4MDAwMDAwMDBVTCwgMHhiOGJjNjc2NVVMLCAweGFhMDljODhiVUwsIDB4MTJiNWFmZWVVTCwgMHg4ZjYyOTc1N1VMLAotICAgIDB4MzdkZWYwMzJVTCwgMHgyNTZiNWZkY1VMLCAweDlkZDczOGI5VUwsIDB4YzViNDI4ZWZVTCwgMHg3ZDA4NGY4YVVMLAotICAgIDB4NmZiZGUwNjRVTCwgMHhkNzAxODcwMVVMLCAweDRhZDZiZmI4VUwsIDB4ZjI2YWQ4ZGRVTCwgMHhlMGRmNzczM1VMLAotICAgIDB4NTg2MzEwNTZVTCwgMHg1MDE5NTc5ZlVMLCAweGU4YTUzMGZhVUwsIDB4ZmExMDlmMTRVTCwgMHg0MmFjZjg3MVVMLAotICAgIDB4ZGY3YmMwYzhVTCwgMHg2N2M3YTdhZFVMLCAweDc1NzIwODQzVUwsIDB4Y2RjZTZmMjZVTCwgMHg5NWFkN2Y3MFVMLAotICAgIDB4MmQxMTE4MTVVTCwgMHgzZmE0YjdmYlVMLCAweDg3MThkMDllVUwsIDB4MWFjZmU4MjdVTCwgMHhhMjczOGY0MlVMLAotICAgIDB4YjBjNjIwYWNVTCwgMHgwODdhNDdjOVVMLCAweGEwMzJhZjNlVUwsIDB4MTg4ZWM4NWJVTCwgMHgwYTNiNjdiNVVMLAotICAgIDB4YjI4NzAwZDBVTCwgMHgyZjUwMzg2OVVMLCAweDk3ZWM1ZjBjVUwsIDB4ODU1OWYwZTJVTCwgMHgzZGU1OTc4N1VMLAotICAgIDB4NjU4Njg3ZDFVTCwgMHhkZDNhZTBiNFVMLCAweGNmOGY0ZjVhVUwsIDB4NzczMzI4M2ZVTCwgMHhlYWU0MTA4NlVMLAotICAgIDB4NTI1ODc3ZTNVTCwgMHg0MGVkZDgwZFVMLCAweGY4NTFiZjY4VUwsIDB4ZjAyYmY4YTFVTCwgMHg0ODk3OWZjNFVMLAotICAgIDB4NWEyMjMwMmFVTCwgMHhlMjllNTc0ZlVMLCAweDdmNDk2ZmY2VUwsIDB4YzdmNTA4OTNVTCwgMHhkNTQwYTc3ZFVMLAotICAgIDB4NmRmY2MwMThVTCwgMHgzNTlmZDA0ZVVMLCAweDhkMjNiNzJiVUwsIDB4OWY5NjE4YzVVTCwgMHgyNzJhN2ZhMFVMLAotICAgIDB4YmFmZDQ3MTlVTCwgMHgwMjQxMjA3Y1VMLCAweDEwZjQ4ZjkyVUwsIDB4YTg0OGU4ZjdVTCwgMHg5YjE0NTgzZFVMLAotICAgIDB4MjNhODNmNThVTCwgMHgzMTFkOTBiNlVMLCAweDg5YTFmN2QzVUwsIDB4MTQ3NmNmNmFVTCwgMHhhY2NhYTgwZlVMLAotICAgIDB4YmU3ZjA3ZTFVTCwgMHgwNmMzNjA4NFVMLCAweDVlYTA3MGQyVUwsIDB4ZTYxYzE3YjdVTCwgMHhmNGE5Yjg1OVVMLAotICAgIDB4NGMxNWRmM2NVTCwgMHhkMWMyZTc4NVVMLCAweDY5N2U4MGUwVUwsIDB4N2JjYjJmMGVVTCwgMHhjMzc3NDg2YlVMLAotICAgIDB4Y2IwZDBmYTJVTCwgMHg3M2IxNjhjN1VMLCAweDYxMDRjNzI5VUwsIDB4ZDliOGEwNGNVTCwgMHg0NDZmOThmNVVMLAotICAgIDB4ZmNkM2ZmOTBVTCwgMHhlZTY2NTA3ZVVMLCAweDU2ZGEzNzFiVUwsIDB4MGViOTI3NGRVTCwgMHhiNjA1NDAyOFVMLAotICAgIDB4YTRiMGVmYzZVTCwgMHgxYzBjODhhM1VMLCAweDgxZGJiMDFhVUwsIDB4Mzk2N2Q3N2ZVTCwgMHgyYmQyNzg5MVVMLAotICAgIDB4OTM2ZTFmZjRVTCwgMHgzYjI2ZjcwM1VMLCAweDgzOWE5MDY2VUwsIDB4OTEyZjNmODhVTCwgMHgyOTkzNThlZFVMLAotICAgIDB4YjQ0NDYwNTRVTCwgMHgwY2Y4MDczMVVMLCAweDFlNGRhOGRmVUwsIDB4YTZmMWNmYmFVTCwgMHhmZTkyZGZlY1VMLAotICAgIDB4NDYyZWI4ODlVTCwgMHg1NDliMTc2N1VMLCAweGVjMjc3MDAyVUwsIDB4NzFmMDQ4YmJVTCwgMHhjOTRjMmZkZVVMLAotICAgIDB4ZGJmOTgwMzBVTCwgMHg2MzQ1ZTc1NVVMLCAweDZiM2ZhMDljVUwsIDB4ZDM4M2M3ZjlVTCwgMHhjMTM2NjgxN1VMLAotICAgIDB4Nzk4YTBmNzJVTCwgMHhlNDVkMzdjYlVMLCAweDVjZTE1MGFlVUwsIDB4NGU1NGZmNDBVTCwgMHhmNmU4OTgyNVVMLAotICAgIDB4YWU4Yjg4NzNVTCwgMHgxNjM3ZWYxNlVMLCAweDA0ODI0MGY4VUwsIDB4YmMzZTI3OWRVTCwgMHgyMWU5MWYyNFVMLAotICAgIDB4OTk1NTc4NDFVTCwgMHg4YmUwZDdhZlVMLCAweDMzNWNiMGNhVUwsIDB4ZWQ1OWI2M2JVTCwgMHg1NWU1ZDE1ZVVMLAotICAgIDB4NDc1MDdlYjBVTCwgMHhmZmVjMTlkNVVMLCAweDYyM2IyMTZjVUwsIDB4ZGE4NzQ2MDlVTCwgMHhjODMyZTllN1VMLAotICAgIDB4NzA4ZThlODJVTCwgMHgyOGVkOWVkNFVMLCAweDkwNTFmOWIxVUwsIDB4ODJlNDU2NWZVTCwgMHgzYTU4MzEzYVVMLAotICAgIDB4YTc4ZjA5ODNVTCwgMHgxZjMzNmVlNlVMLCAweDBkODZjMTA4VUwsIDB4YjUzYWE2NmRVTCwgMHhiZDQwZTFhNFVMLAotICAgIDB4MDVmYzg2YzFVTCwgMHgxNzQ5MjkyZlVMLCAweGFmZjU0ZTRhVUwsIDB4MzIyMjc2ZjNVTCwgMHg4YTllMTE5NlVMLAotICAgIDB4OTgyYmJlNzhVTCwgMHgyMDk3ZDkxZFVMLCAweDc4ZjRjOTRiVUwsIDB4YzA0OGFlMmVVTCwgMHhkMmZkMDFjMFVMLAotICAgIDB4NmE0MTY2YTVVTCwgMHhmNzk2NWUxY1VMLCAweDRmMmEzOTc5VUwsIDB4NWQ5Zjk2OTdVTCwgMHhlNTIzZjFmMlVMLAotICAgIDB4NGQ2YjE5MDVVTCwgMHhmNWQ3N2U2MFVMLCAweGU3NjJkMThlVUwsIDB4NWZkZWI2ZWJVTCwgMHhjMjA5OGU1MlVMLAotICAgIDB4N2FiNWU5MzdVTCwgMHg2ODAwNDZkOVVMLCAweGQwYmMyMWJjVUwsIDB4ODhkZjMxZWFVTCwgMHgzMDYzNTY4ZlVMLAotICAgIDB4MjJkNmY5NjFVTCwgMHg5YTZhOWUwNFVMLCAweDA3YmRhNmJkVUwsIDB4YmYwMWMxZDhVTCwgMHhhZGI0NmUzNlVMLAotICAgIDB4MTUwODA5NTNVTCwgMHgxZDcyNGU5YVVMLCAweGE1Y2UyOWZmVUwsIDB4Yjc3Yjg2MTFVTCwgMHgwZmM3ZTE3NFVMLAotICAgIDB4OTIxMGQ5Y2RVTCwgMHgyYWFjYmVhOFVMLCAweDM4MTkxMTQ2VUwsIDB4ODBhNTc2MjNVTCwgMHhkOGM2NjY3NVVMLAotICAgIDB4NjA3YTAxMTBVTCwgMHg3MmNmYWVmZVVMLCAweGNhNzNjOTliVUwsIDB4NTdhNGYxMjJVTCwgMHhlZjE4OTY0N1VMLAotICAgIDB4ZmRhZDM5YTlVTCwgMHg0NTExNWVjY1VMLCAweDc2NGRlZTA2VUwsIDB4Y2VmMTg5NjNVTCwgMHhkYzQ0MjY4ZFVMLAotICAgIDB4NjRmODQxZThVTCwgMHhmOTJmNzk1MVVMLCAweDQxOTMxZTM0VUwsIDB4NTMyNmIxZGFVTCwgMHhlYjlhZDZiZlVMLAotICAgIDB4YjNmOWM2ZTlVTCwgMHgwYjQ1YTE4Y1VMLCAweDE5ZjAwZTYyVUwsIDB4YTE0YzY5MDdVTCwgMHgzYzliNTFiZVVMLAotICAgIDB4ODQyNzM2ZGJVTCwgMHg5NjkyOTkzNVVMLCAweDJlMmVmZTUwVUwsIDB4MjY1NGI5OTlVTCwgMHg5ZWU4ZGVmY1VMLAotICAgIDB4OGM1ZDcxMTJVTCwgMHgzNGUxMTY3N1VMLCAweGE5MzYyZWNlVUwsIDB4MTE4YTQ5YWJVTCwgMHgwMzNmZTY0NVVMLAotICAgIDB4YmI4MzgxMjBVTCwgMHhlM2UwOTE3NlVMLCAweDViNWNmNjEzVUwsIDB4NDllOTU5ZmRVTCwgMHhmMTU1M2U5OFVMLAotICAgIDB4NmM4MjA2MjFVTCwgMHhkNDNlNjE0NFVMLCAweGM2OGJjZWFhVUwsIDB4N2UzN2E5Y2ZVTCwgMHhkNjdmNDEzOFVMLAotICAgIDB4NmVjMzI2NWRVTCwgMHg3Yzc2ODliM1VMLCAweGM0Y2FlZWQ2VUwsIDB4NTkxZGQ2NmZVTCwgMHhlMWExYjEwYVVMLAotICAgIDB4ZjMxNDFlZTRVTCwgMHg0YmE4Nzk4MVVMLCAweDEzY2I2OWQ3VUwsIDB4YWI3NzBlYjJVTCwgMHhiOWMyYTE1Y1VMLAotICAgIDB4MDE3ZWM2MzlVTCwgMHg5Y2E5ZmU4MFVMLCAweDI0MTU5OWU1VUwsIDB4MzZhMDM2MGJVTCwgMHg4ZTFjNTE2ZVVMLAotICAgIDB4ODY2NjE2YTdVTCwgMHgzZWRhNzFjMlVMLCAweDJjNmZkZTJjVUwsIDB4OTRkM2I5NDlVTCwgMHgwOTA0ODFmMFVMLAotICAgIDB4YjFiOGU2OTVVTCwgMHhhMzBkNDk3YlVMLCAweDFiYjEyZTFlVUwsIDB4NDNkMjNlNDhVTCwgMHhmYjZlNTkyZFVMLAotICAgIDB4ZTlkYmY2YzNVTCwgMHg1MTY3OTFhNlVMLCAweGNjYjBhOTFmVUwsIDB4NzQwY2NlN2FVTCwgMHg2NmI5NjE5NFVMLAotICAgIDB4ZGUwNTA2ZjFVTAotICB9LAotICB7Ci0gICAgMHgwMDAwMDAwMFVMLCAweDk2MzAwNzc3VUwsIDB4MmM2MTBlZWVVTCwgMHhiYTUxMDk5OVVMLCAweDE5YzQ2ZDA3VUwsCi0gICAgMHg4ZmY0NmE3MFVMLCAweDM1YTU2M2U5VUwsIDB4YTM5NTY0OWVVTCwgMHgzMjg4ZGIwZVVMLCAweGE0YjhkYzc5VUwsCi0gICAgMHgxZWU5ZDVlMFVMLCAweDg4ZDlkMjk3VUwsIDB4MmI0Y2I2MDlVTCwgMHhiZDdjYjE3ZVVMLCAweDA3MmRiOGU3VUwsCi0gICAgMHg5MTFkYmY5MFVMLCAweDY0MTBiNzFkVUwsIDB4ZjIyMGIwNmFVTCwgMHg0ODcxYjlmM1VMLCAweGRlNDFiZTg0VUwsCi0gICAgMHg3ZGQ0ZGExYVVMLCAweGViZTRkZDZkVUwsIDB4NTFiNWQ0ZjRVTCwgMHhjNzg1ZDM4M1VMLCAweDU2OTg2YzEzVUwsCi0gICAgMHhjMGE4NmI2NFVMLCAweDdhZjk2MmZkVUwsIDB4ZWNjOTY1OGFVTCwgMHg0ZjVjMDExNFVMLCAweGQ5NmMwNjYzVUwsCi0gICAgMHg2MzNkMGZmYVVMLCAweGY1MGQwODhkVUwsIDB4YzgyMDZlM2JVTCwgMHg1ZTEwNjk0Y1VMLCAweGU0NDE2MGQ1VUwsCi0gICAgMHg3MjcxNjdhMlVMLCAweGQxZTQwMzNjVUwsIDB4NDdkNDA0NGJVTCwgMHhmZDg1MGRkMlVMLCAweDZiYjUwYWE1VUwsCi0gICAgMHhmYWE4YjUzNVVMLCAweDZjOThiMjQyVUwsIDB4ZDZjOWJiZGJVTCwgMHg0MGY5YmNhY1VMLCAweGUzNmNkODMyVUwsCi0gICAgMHg3NTVjZGY0NVVMLCAweGNmMGRkNmRjVUwsIDB4NTkzZGQxYWJVTCwgMHhhYzMwZDkyNlVMLCAweDNhMDBkZTUxVUwsCi0gICAgMHg4MDUxZDdjOFVMLCAweDE2NjFkMGJmVUwsIDB4YjVmNGI0MjFVTCwgMHgyM2M0YjM1NlVMLCAweDk5OTViYWNmVUwsCi0gICAgMHgwZmE1YmRiOFVMLCAweDllYjgwMjI4VUwsIDB4MDg4ODA1NWZVTCwgMHhiMmQ5MGNjNlVMLCAweDI0ZTkwYmIxVUwsCi0gICAgMHg4NzdjNmYyZlVMLCAweDExNGM2ODU4VUwsIDB4YWIxZDYxYzFVTCwgMHgzZDJkNjZiNlVMLCAweDkwNDFkYzc2VUwsCi0gICAgMHgwNjcxZGIwMVVMLCAweGJjMjBkMjk4VUwsIDB4MmExMGQ1ZWZVTCwgMHg4OTg1YjE3MVVMLCAweDFmYjViNjA2VUwsCi0gICAgMHhhNWU0YmY5ZlVMLCAweDMzZDRiOGU4VUwsIDB4YTJjOTA3NzhVTCwgMHgzNGY5MDAwZlVMLCAweDhlYTgwOTk2VUwsCi0gICAgMHgxODk4MGVlMVVMLCAweGJiMGQ2YTdmVUwsIDB4MmQzZDZkMDhVTCwgMHg5NzZjNjQ5MVVMLCAweDAxNWM2M2U2VUwsCi0gICAgMHhmNDUxNmI2YlVMLCAweDYyNjE2YzFjVUwsIDB4ZDgzMDY1ODVVTCwgMHg0ZTAwNjJmMlVMLCAweGVkOTUwNjZjVUwsCi0gICAgMHg3YmE1MDExYlVMLCAweGMxZjQwODgyVUwsIDB4NTdjNDBmZjVVTCwgMHhjNmQ5YjA2NVVMLCAweDUwZTliNzEyVUwsCi0gICAgMHhlYWI4YmU4YlVMLCAweDdjODhiOWZjVUwsIDB4ZGYxZGRkNjJVTCwgMHg0OTJkZGExNVVMLCAweGYzN2NkMzhjVUwsCi0gICAgMHg2NTRjZDRmYlVMLCAweDU4NjFiMjRkVUwsIDB4Y2U1MWI1M2FVTCwgMHg3NDAwYmNhM1VMLCAweGUyMzBiYmQ0VUwsCi0gICAgMHg0MWE1ZGY0YVVMLCAweGQ3OTVkODNkVUwsIDB4NmRjNGQxYTRVTCwgMHhmYmY0ZDZkM1VMLCAweDZhZTk2OTQzVUwsCi0gICAgMHhmY2Q5NmUzNFVMLCAweDQ2ODg2N2FkVUwsIDB4ZDBiODYwZGFVTCwgMHg3MzJkMDQ0NFVMLCAweGU1MWQwMzMzVUwsCi0gICAgMHg1ZjRjMGFhYVVMLCAweGM5N2MwZGRkVUwsIDB4M2M3MTA1NTBVTCwgMHhhYTQxMDIyN1VMLCAweDEwMTAwYmJlVUwsCi0gICAgMHg4NjIwMGNjOVVMLCAweDI1YjU2ODU3VUwsIDB4YjM4NTZmMjBVTCwgMHgwOWQ0NjZiOVVMLCAweDlmZTQ2MWNlVUwsCi0gICAgMHgwZWY5ZGU1ZVVMLCAweDk4YzlkOTI5VUwsIDB4MjI5OGQwYjBVTCwgMHhiNGE4ZDdjN1VMLCAweDE3M2RiMzU5VUwsCi0gICAgMHg4MTBkYjQyZVVMLCAweDNiNWNiZGI3VUwsIDB4YWQ2Y2JhYzBVTCwgMHgyMDgzYjhlZFVMLCAweGI2YjNiZjlhVUwsCi0gICAgMHgwY2UyYjYwM1VMLCAweDlhZDJiMTc0VUwsIDB4Mzk0N2Q1ZWFVTCwgMHhhZjc3ZDI5ZFVMLCAweDE1MjZkYjA0VUwsCi0gICAgMHg4MzE2ZGM3M1VMLCAweDEyMGI2M2UzVUwsIDB4ODQzYjY0OTRVTCwgMHgzZTZhNmQwZFVMLCAweGE4NWE2YTdhVUwsCi0gICAgMHgwYmNmMGVlNFVMLCAweDlkZmYwOTkzVUwsIDB4MjdhZTAwMGFVTCwgMHhiMTllMDc3ZFVMLCAweDQ0OTMwZmYwVUwsCi0gICAgMHhkMmEzMDg4N1VMLCAweDY4ZjIwMTFlVUwsIDB4ZmVjMjA2NjlVTCwgMHg1ZDU3NjJmN1VMLCAweGNiNjc2NTgwVUwsCi0gICAgMHg3MTM2NmMxOVVMLCAweGU3MDY2YjZlVUwsIDB4NzYxYmQ0ZmVVTCwgMHhlMDJiZDM4OVVMLCAweDVhN2FkYTEwVUwsCi0gICAgMHhjYzRhZGQ2N1VMLCAweDZmZGZiOWY5VUwsIDB4ZjllZmJlOGVVTCwgMHg0M2JlYjcxN1VMLCAweGQ1OGViMDYwVUwsCi0gICAgMHhlOGEzZDZkNlVMLCAweDdlOTNkMWExVUwsIDB4YzRjMmQ4MzhVTCwgMHg1MmYyZGY0ZlVMLCAweGYxNjdiYmQxVUwsCi0gICAgMHg2NzU3YmNhNlVMLCAweGRkMDZiNTNmVUwsIDB4NGIzNmIyNDhVTCwgMHhkYTJiMGRkOFVMLCAweDRjMWIwYWFmVUwsCi0gICAgMHhmNjRhMDMzNlVMLCAweDYwN2EwNDQxVUwsIDB4YzNlZjYwZGZVTCwgMHg1NWRmNjdhOFVMLCAweGVmOGU2ZTMxVUwsCi0gICAgMHg3OWJlNjk0NlVMLCAweDhjYjM2MWNiVUwsIDB4MWE4MzY2YmNVTCwgMHhhMGQyNmYyNVVMLCAweDM2ZTI2ODUyVUwsCi0gICAgMHg5NTc3MGNjY1VMLCAweDAzNDcwYmJiVUwsIDB4YjkxNjAyMjJVTCwgMHgyZjI2MDU1NVVMLCAweGJlM2JiYWM1VUwsCi0gICAgMHgyODBiYmRiMlVMLCAweDkyNWFiNDJiVUwsIDB4MDQ2YWIzNWNVTCwgMHhhN2ZmZDdjMlVMLCAweDMxY2ZkMGI1VUwsCi0gICAgMHg4YjllZDkyY1VMLCAweDFkYWVkZTViVUwsIDB4YjBjMjY0OWJVTCwgMHgyNmYyNjNlY1VMLCAweDljYTM2YTc1VUwsCi0gICAgMHgwYTkzNmQwMlVMLCAweGE5MDYwOTljVUwsIDB4M2YzNjBlZWJVTCwgMHg4NTY3MDc3MlVMLCAweDEzNTcwMDA1VUwsCi0gICAgMHg4MjRhYmY5NVVMLCAweDE0N2FiOGUyVUwsIDB4YWUyYmIxN2JVTCwgMHgzODFiYjYwY1VMLCAweDliOGVkMjkyVUwsCi0gICAgMHgwZGJlZDVlNVVMLCAweGI3ZWZkYzdjVUwsIDB4MjFkZmRiMGJVTCwgMHhkNGQyZDM4NlVMLCAweDQyZTJkNGYxVUwsCi0gICAgMHhmOGIzZGQ2OFVMLCAweDZlODNkYTFmVUwsIDB4Y2QxNmJlODFVTCwgMHg1YjI2YjlmNlVMLCAweGUxNzdiMDZmVUwsCi0gICAgMHg3NzQ3YjcxOFVMLCAweGU2NWEwODg4VUwsIDB4NzA2YTBmZmZVTCwgMHhjYTNiMDY2NlVMLCAweDVjMGIwMTExVUwsCi0gICAgMHhmZjllNjU4ZlVMLCAweDY5YWU2MmY4VUwsIDB4ZDNmZjZiNjFVTCwgMHg0NWNmNmMxNlVMLCAweDc4ZTIwYWEwVUwsCi0gICAgMHhlZWQyMGRkN1VMLCAweDU0ODMwNDRlVUwsIDB4YzJiMzAzMzlVTCwgMHg2MTI2NjdhN1VMLCAweGY3MTY2MGQwVUwsCi0gICAgMHg0ZDQ3Njk0OVVMLCAweGRiNzc2ZTNlVUwsIDB4NGE2YWQxYWVVTCwgMHhkYzVhZDZkOVVMLCAweDY2MGJkZjQwVUwsCi0gICAgMHhmMDNiZDgzN1VMLCAweDUzYWViY2E5VUwsIDB4YzU5ZWJiZGVVTCwgMHg3ZmNmYjI0N1VMLCAweGU5ZmZiNTMwVUwsCi0gICAgMHgxY2YyYmRiZFVMLCAweDhhYzJiYWNhVUwsIDB4MzA5M2IzNTNVTCwgMHhhNmEzYjQyNFVMLCAweDA1MzZkMGJhVUwsCi0gICAgMHg5MzA2ZDdjZFVMLCAweDI5NTdkZTU0VUwsIDB4YmY2N2Q5MjNVTCwgMHgyZTdhNjZiM1VMLCAweGI4NGE2MWM0VUwsCi0gICAgMHgwMjFiNjg1ZFVMLCAweDk0MmI2ZjJhVUwsIDB4MzdiZTBiYjRVTCwgMHhhMThlMGNjM1VMLCAweDFiZGYwNTVhVUwsCi0gICAgMHg4ZGVmMDIyZFVMCi0gIH0sCi0gIHsKLSAgICAweDAwMDAwMDAwVUwsIDB4NDEzMTFiMTlVTCwgMHg4MjYyMzYzMlVMLCAweGMzNTMyZDJiVUwsIDB4MDRjNTZjNjRVTCwKLSAgICAweDQ1ZjQ3NzdkVUwsIDB4ODZhNzVhNTZVTCwgMHhjNzk2NDE0ZlVMLCAweDA4OGFkOWM4VUwsIDB4NDliYmMyZDFVTCwKLSAgICAweDhhZThlZmZhVUwsIDB4Y2JkOWY0ZTNVTCwgMHgwYzRmYjVhY1VMLCAweDRkN2VhZWI1VUwsIDB4OGUyZDgzOWVVTCwKLSAgICAweGNmMWM5ODg3VUwsIDB4NTExMmMyNGFVTCwgMHgxMDIzZDk1M1VMLCAweGQzNzBmNDc4VUwsIDB4OTI0MWVmNjFVTCwKLSAgICAweDU1ZDdhZTJlVUwsIDB4MTRlNmI1MzdVTCwgMHhkN2I1OTgxY1VMLCAweDk2ODQ4MzA1VUwsIDB4NTk5ODFiODJVTCwKLSAgICAweDE4YTkwMDliVUwsIDB4ZGJmYTJkYjBVTCwgMHg5YWNiMzZhOVVMLCAweDVkNWQ3N2U2VUwsIDB4MWM2YzZjZmZVTCwKLSAgICAweGRmM2Y0MWQ0VUwsIDB4OWUwZTVhY2RVTCwgMHhhMjI0ODQ5NVVMLCAweGUzMTU5ZjhjVUwsIDB4MjA0NmIyYTdVTCwKLSAgICAweDYxNzdhOWJlVUwsIDB4YTZlMWU4ZjFVTCwgMHhlN2QwZjNlOFVMLCAweDI0ODNkZWMzVUwsIDB4NjViMmM1ZGFVTCwKLSAgICAweGFhYWU1ZDVkVUwsIDB4ZWI5ZjQ2NDRVTCwgMHgyOGNjNmI2ZlVMLCAweDY5ZmQ3MDc2VUwsIDB4YWU2YjMxMzlVTCwKLSAgICAweGVmNWEyYTIwVUwsIDB4MmMwOTA3MGJVTCwgMHg2ZDM4MWMxMlVMLCAweGYzMzY0NmRmVUwsIDB4YjIwNzVkYzZVTCwKLSAgICAweDcxNTQ3MGVkVUwsIDB4MzA2NTZiZjRVTCwgMHhmN2YzMmFiYlVMLCAweGI2YzIzMWEyVUwsIDB4NzU5MTFjODlVTCwKLSAgICAweDM0YTAwNzkwVUwsIDB4ZmJiYzlmMTdVTCwgMHhiYThkODQwZVVMLCAweDc5ZGVhOTI1VUwsIDB4MzhlZmIyM2NVTCwKLSAgICAweGZmNzlmMzczVUwsIDB4YmU0OGU4NmFVTCwgMHg3ZDFiYzU0MVVMLCAweDNjMmFkZTU4VUwsIDB4MDU0Zjc5ZjBVTCwKLSAgICAweDQ0N2U2MmU5VUwsIDB4ODcyZDRmYzJVTCwgMHhjNjFjNTRkYlVMLCAweDAxOGExNTk0VUwsIDB4NDBiYjBlOGRVTCwKLSAgICAweDgzZTgyM2E2VUwsIDB4YzJkOTM4YmZVTCwgMHgwZGM1YTAzOFVMLCAweDRjZjRiYjIxVUwsIDB4OGZhNzk2MGFVTCwKLSAgICAweGNlOTY4ZDEzVUwsIDB4MDkwMGNjNWNVTCwgMHg0ODMxZDc0NVVMLCAweDhiNjJmYTZlVUwsIDB4Y2E1M2UxNzdVTCwKLSAgICAweDU0NWRiYmJhVUwsIDB4MTU2Y2EwYTNVTCwgMHhkNjNmOGQ4OFVMLCAweDk3MGU5NjkxVUwsIDB4NTA5OGQ3ZGVVTCwKLSAgICAweDExYTljY2M3VUwsIDB4ZDJmYWUxZWNVTCwgMHg5M2NiZmFmNVVMLCAweDVjZDc2MjcyVUwsIDB4MWRlNjc5NmJVTCwKLSAgICAweGRlYjU1NDQwVUwsIDB4OWY4NDRmNTlVTCwgMHg1ODEyMGUxNlVMLCAweDE5MjMxNTBmVUwsIDB4ZGE3MDM4MjRVTCwKLSAgICAweDliNDEyMzNkVUwsIDB4YTc2YmZkNjVVTCwgMHhlNjVhZTY3Y1VMLCAweDI1MDljYjU3VUwsIDB4NjQzOGQwNGVVTCwKLSAgICAweGEzYWU5MTAxVUwsIDB4ZTI5ZjhhMThVTCwgMHgyMWNjYTczM1VMLCAweDYwZmRiYzJhVUwsIDB4YWZlMTI0YWRVTCwKLSAgICAweGVlZDAzZmI0VUwsIDB4MmQ4MzEyOWZVTCwgMHg2Y2IyMDk4NlVMLCAweGFiMjQ0OGM5VUwsIDB4ZWExNTUzZDBVTCwKLSAgICAweDI5NDY3ZWZiVUwsIDB4Njg3NzY1ZTJVTCwgMHhmNjc5M2YyZlVMLCAweGI3NDgyNDM2VUwsIDB4NzQxYjA5MWRVTCwKLSAgICAweDM1MmExMjA0VUwsIDB4ZjJiYzUzNGJVTCwgMHhiMzhkNDg1MlVMLCAweDcwZGU2NTc5VUwsIDB4MzFlZjdlNjBVTCwKLSAgICAweGZlZjNlNmU3VUwsIDB4YmZjMmZkZmVVTCwgMHg3YzkxZDBkNVVMLCAweDNkYTBjYmNjVUwsIDB4ZmEzNjhhODNVTCwKLSAgICAweGJiMDc5MTlhVUwsIDB4Nzg1NGJjYjFVTCwgMHgzOTY1YTdhOFVMLCAweDRiOTg4MzNiVUwsIDB4MGFhOTk4MjJVTCwKLSAgICAweGM5ZmFiNTA5VUwsIDB4ODhjYmFlMTBVTCwgMHg0ZjVkZWY1ZlVMLCAweDBlNmNmNDQ2VUwsIDB4Y2QzZmQ5NmRVTCwKLSAgICAweDhjMGVjMjc0VUwsIDB4NDMxMjVhZjNVTCwgMHgwMjIzNDFlYVVMLCAweGMxNzA2Y2MxVUwsIDB4ODA0MTc3ZDhVTCwKLSAgICAweDQ3ZDczNjk3VUwsIDB4MDZlNjJkOGVVTCwgMHhjNWI1MDBhNVVMLCAweDg0ODQxYmJjVUwsIDB4MWE4YTQxNzFVTCwKLSAgICAweDViYmI1YTY4VUwsIDB4OThlODc3NDNVTCwgMHhkOWQ5NmM1YVVMLCAweDFlNGYyZDE1VUwsIDB4NWY3ZTM2MGNVTCwKLSAgICAweDljMmQxYjI3VUwsIDB4ZGQxYzAwM2VVTCwgMHgxMjAwOThiOVVMLCAweDUzMzE4M2EwVUwsIDB4OTA2MmFlOGJVTCwKLSAgICAweGQxNTNiNTkyVUwsIDB4MTZjNWY0ZGRVTCwgMHg1N2Y0ZWZjNFVMLCAweDk0YTdjMmVmVUwsIDB4ZDU5NmQ5ZjZVTCwKLSAgICAweGU5YmMwN2FlVUwsIDB4YTg4ZDFjYjdVTCwgMHg2YmRlMzE5Y1VMLCAweDJhZWYyYTg1VUwsIDB4ZWQ3OTZiY2FVTCwKLSAgICAweGFjNDg3MGQzVUwsIDB4NmYxYjVkZjhVTCwgMHgyZTJhNDZlMVVMLCAweGUxMzZkZTY2VUwsIDB4YTAwN2M1N2ZVTCwKLSAgICAweDYzNTRlODU0VUwsIDB4MjI2NWYzNGRVTCwgMHhlNWYzYjIwMlVMLCAweGE0YzJhOTFiVUwsIDB4Njc5MTg0MzBVTCwKLSAgICAweDI2YTA5ZjI5VUwsIDB4YjhhZWM1ZTRVTCwgMHhmOTlmZGVmZFVMLCAweDNhY2NmM2Q2VUwsIDB4N2JmZGU4Y2ZVTCwKLSAgICAweGJjNmJhOTgwVUwsIDB4ZmQ1YWIyOTlVTCwgMHgzZTA5OWZiMlVMLCAweDdmMzg4NGFiVUwsIDB4YjAyNDFjMmNVTCwKLSAgICAweGYxMTUwNzM1VUwsIDB4MzI0NjJhMWVVTCwgMHg3Mzc3MzEwN1VMLCAweGI0ZTE3MDQ4VUwsIDB4ZjVkMDZiNTFVTCwKLSAgICAweDM2ODM0NjdhVUwsIDB4NzdiMjVkNjNVTCwgMHg0ZWQ3ZmFjYlVMLCAweDBmZTZlMWQyVUwsIDB4Y2NiNWNjZjlVTCwKLSAgICAweDhkODRkN2UwVUwsIDB4NGExMjk2YWZVTCwgMHgwYjIzOGRiNlVMLCAweGM4NzBhMDlkVUwsIDB4ODk0MWJiODRVTCwKLSAgICAweDQ2NWQyMzAzVUwsIDB4MDc2YzM4MWFVTCwgMHhjNDNmMTUzMVVMLCAweDg1MGUwZTI4VUwsIDB4NDI5ODRmNjdVTCwKLSAgICAweDAzYTk1NDdlVUwsIDB4YzBmYTc5NTVVTCwgMHg4MWNiNjI0Y1VMLCAweDFmYzUzODgxVUwsIDB4NWVmNDIzOThVTCwKLSAgICAweDlkYTcwZWIzVUwsIDB4ZGM5NjE1YWFVTCwgMHgxYjAwNTRlNVVMLCAweDVhMzE0ZmZjVUwsIDB4OTk2MjYyZDdVTCwKLSAgICAweGQ4NTM3OWNlVUwsIDB4MTc0ZmUxNDlVTCwgMHg1NjdlZmE1MFVMLCAweDk1MmRkNzdiVUwsIDB4ZDQxY2NjNjJVTCwKLSAgICAweDEzOGE4ZDJkVUwsIDB4NTJiYjk2MzRVTCwgMHg5MWU4YmIxZlVMLCAweGQwZDlhMDA2VUwsIDB4ZWNmMzdlNWVVTCwKLSAgICAweGFkYzI2NTQ3VUwsIDB4NmU5MTQ4NmNVTCwgMHgyZmEwNTM3NVVMLCAweGU4MzYxMjNhVUwsIDB4YTkwNzA5MjNVTCwKLSAgICAweDZhNTQyNDA4VUwsIDB4MmI2NTNmMTFVTCwgMHhlNDc5YTc5NlVMLCAweGE1NDhiYzhmVUwsIDB4NjYxYjkxYTRVTCwKLSAgICAweDI3MmE4YWJkVUwsIDB4ZTBiY2NiZjJVTCwgMHhhMThkZDBlYlVMLCAweDYyZGVmZGMwVUwsIDB4MjNlZmU2ZDlVTCwKLSAgICAweGJkZTFiYzE0VUwsIDB4ZmNkMGE3MGRVTCwgMHgzZjgzOGEyNlVMLCAweDdlYjI5MTNmVUwsIDB4YjkyNGQwNzBVTCwKLSAgICAweGY4MTVjYjY5VUwsIDB4M2I0NmU2NDJVTCwgMHg3YTc3ZmQ1YlVMLCAweGI1NmI2NWRjVUwsIDB4ZjQ1YTdlYzVVTCwKLSAgICAweDM3MDk1M2VlVUwsIDB4NzYzODQ4ZjdVTCwgMHhiMWFlMDliOFVMLCAweGYwOWYxMmExVUwsIDB4MzNjYzNmOGFVTCwKLSAgICAweDcyZmQyNDkzVUwKLSAgfSwKLSAgewotICAgIDB4MDAwMDAwMDBVTCwgMHgzNzZhYzIwMVVMLCAweDZlZDQ4NDAzVUwsIDB4NTliZTQ2MDJVTCwgMHhkY2E4MDkwN1VMLAotICAgIDB4ZWJjMmNiMDZVTCwgMHhiMjdjOGQwNFVMLCAweDg1MTY0ZjA1VUwsIDB4Yjg1MTEzMGVVTCwgMHg4ZjNiZDEwZlVMLAotICAgIDB4ZDY4NTk3MGRVTCwgMHhlMWVmNTUwY1VMLCAweDY0ZjkxYTA5VUwsIDB4NTM5M2Q4MDhVTCwgMHgwYTJkOWUwYVVMLAotICAgIDB4M2Q0NzVjMGJVTCwgMHg3MGEzMjYxY1VMLCAweDQ3YzllNDFkVUwsIDB4MWU3N2EyMWZVTCwgMHgyOTFkNjAxZVVMLAotICAgIDB4YWMwYjJmMWJVTCwgMHg5YjYxZWQxYVVMLCAweGMyZGZhYjE4VUwsIDB4ZjViNTY5MTlVTCwgMHhjOGYyMzUxMlVMLAotICAgIDB4ZmY5OGY3MTNVTCwgMHhhNjI2YjExMVVMLCAweDkxNGM3MzEwVUwsIDB4MTQ1YTNjMTVVTCwgMHgyMzMwZmUxNFVMLAotICAgIDB4N2E4ZWI4MTZVTCwgMHg0ZGU0N2ExN1VMLCAweGUwNDY0ZDM4VUwsIDB4ZDcyYzhmMzlVTCwgMHg4ZTkyYzkzYlVMLAotICAgIDB4YjlmODBiM2FVTCwgMHgzY2VlNDQzZlVMLCAweDBiODQ4NjNlVUwsIDB4NTIzYWMwM2NVTCwgMHg2NTUwMDIzZFVMLAotICAgIDB4NTgxNzVlMzZVTCwgMHg2ZjdkOWMzN1VMLCAweDM2YzNkYTM1VUwsIDB4MDFhOTE4MzRVTCwgMHg4NGJmNTczMVVMLAotICAgIDB4YjNkNTk1MzBVTCwgMHhlYTZiZDMzMlVMLCAweGRkMDExMTMzVUwsIDB4OTBlNTZiMjRVTCwgMHhhNzhmYTkyNVVMLAotICAgIDB4ZmUzMWVmMjdVTCwgMHhjOTViMmQyNlVMLCAweDRjNGQ2MjIzVUwsIDB4N2IyN2EwMjJVTCwgMHgyMjk5ZTYyMFVMLAotICAgIDB4MTVmMzI0MjFVTCwgMHgyOGI0NzgyYVVMLCAweDFmZGViYTJiVUwsIDB4NDY2MGZjMjlVTCwgMHg3MTBhM2UyOFVMLAotICAgIDB4ZjQxYzcxMmRVTCwgMHhjMzc2YjMyY1VMLCAweDlhYzhmNTJlVUwsIDB4YWRhMjM3MmZVTCwgMHhjMDhkOWE3MFVMLAotICAgIDB4ZjdlNzU4NzFVTCwgMHhhZTU5MWU3M1VMLCAweDk5MzNkYzcyVUwsIDB4MWMyNTkzNzdVTCwgMHgyYjRmNTE3NlVMLAotICAgIDB4NzJmMTE3NzRVTCwgMHg0NTliZDU3NVVMLCAweDc4ZGM4OTdlVUwsIDB4NGZiNjRiN2ZVTCwgMHgxNjA4MGQ3ZFVMLAotICAgIDB4MjE2MmNmN2NVTCwgMHhhNDc0ODA3OVVMLCAweDkzMWU0Mjc4VUwsIDB4Y2FhMDA0N2FVTCwgMHhmZGNhYzY3YlVMLAotICAgIDB4YjAyZWJjNmNVTCwgMHg4NzQ0N2U2ZFVMLCAweGRlZmEzODZmVUwsIDB4ZTk5MGZhNmVVTCwgMHg2Yzg2YjU2YlVMLAotICAgIDB4NWJlYzc3NmFVTCwgMHgwMjUyMzE2OFVMLCAweDM1MzhmMzY5VUwsIDB4MDg3ZmFmNjJVTCwgMHgzZjE1NmQ2M1VMLAotICAgIDB4NjZhYjJiNjFVTCwgMHg1MWMxZTk2MFVMLCAweGQ0ZDdhNjY1VUwsIDB4ZTNiZDY0NjRVTCwgMHhiYTAzMjI2NlVMLAotICAgIDB4OGQ2OWUwNjdVTCwgMHgyMGNiZDc0OFVMLCAweDE3YTExNTQ5VUwsIDB4NGUxZjUzNGJVTCwgMHg3OTc1OTE0YVVMLAotICAgIDB4ZmM2M2RlNGZVTCwgMHhjYjA5MWM0ZVVMLCAweDkyYjc1YTRjVUwsIDB4YTVkZDk4NGRVTCwgMHg5ODlhYzQ0NlVMLAotICAgIDB4YWZmMDA2NDdVTCwgMHhmNjRlNDA0NVVMLCAweGMxMjQ4MjQ0VUwsIDB4NDQzMmNkNDFVTCwgMHg3MzU4MGY0MFVMLAotICAgIDB4MmFlNjQ5NDJVTCwgMHgxZDhjOGI0M1VMLCAweDUwNjhmMTU0VUwsIDB4NjcwMjMzNTVVTCwgMHgzZWJjNzU1N1VMLAotICAgIDB4MDlkNmI3NTZVTCwgMHg4Y2MwZjg1M1VMLCAweGJiYWEzYTUyVUwsIDB4ZTIxNDdjNTBVTCwgMHhkNTdlYmU1MVVMLAotICAgIDB4ZTgzOWUyNWFVTCwgMHhkZjUzMjA1YlVMLCAweDg2ZWQ2NjU5VUwsIDB4YjE4N2E0NThVTCwgMHgzNDkxZWI1ZFVMLAotICAgIDB4MDNmYjI5NWNVTCwgMHg1YTQ1NmY1ZVVMLCAweDZkMmZhZDVmVUwsIDB4ODAxYjM1ZTFVTCwgMHhiNzcxZjdlMFVMLAotICAgIDB4ZWVjZmIxZTJVTCwgMHhkOWE1NzNlM1VMLCAweDVjYjMzY2U2VUwsIDB4NmJkOWZlZTdVTCwgMHgzMjY3YjhlNVVMLAotICAgIDB4MDUwZDdhZTRVTCwgMHgzODRhMjZlZlVMLCAweDBmMjBlNGVlVUwsIDB4NTY5ZWEyZWNVTCwgMHg2MWY0NjBlZFVMLAotICAgIDB4ZTRlMjJmZThVTCwgMHhkMzg4ZWRlOVVMLCAweDhhMzZhYmViVUwsIDB4YmQ1YzY5ZWFVTCwgMHhmMGI4MTNmZFVMLAotICAgIDB4YzdkMmQxZmNVTCwgMHg5ZTZjOTdmZVVMLCAweGE5MDY1NWZmVUwsIDB4MmMxMDFhZmFVTCwgMHgxYjdhZDhmYlVMLAotICAgIDB4NDJjNDllZjlVTCwgMHg3NWFlNWNmOFVMLCAweDQ4ZTkwMGYzVUwsIDB4N2Y4M2MyZjJVTCwgMHgyNjNkODRmMFVMLAotICAgIDB4MTE1NzQ2ZjFVTCwgMHg5NDQxMDlmNFVMLCAweGEzMmJjYmY1VUwsIDB4ZmE5NThkZjdVTCwgMHhjZGZmNGZmNlVMLAotICAgIDB4NjA1ZDc4ZDlVTCwgMHg1NzM3YmFkOFVMLCAweDBlODlmY2RhVUwsIDB4MzllMzNlZGJVTCwgMHhiY2Y1NzFkZVVMLAotICAgIDB4OGI5ZmIzZGZVTCwgMHhkMjIxZjVkZFVMLCAweGU1NGIzN2RjVUwsIDB4ZDgwYzZiZDdVTCwgMHhlZjY2YTlkNlVMLAotICAgIDB4YjZkOGVmZDRVTCwgMHg4MWIyMmRkNVVMLCAweDA0YTQ2MmQwVUwsIDB4MzNjZWEwZDFVTCwgMHg2YTcwZTZkM1VMLAotICAgIDB4NWQxYTI0ZDJVTCwgMHgxMGZlNWVjNVVMLCAweDI3OTQ5Y2M0VUwsIDB4N2UyYWRhYzZVTCwgMHg0OTQwMThjN1VMLAotICAgIDB4Y2M1NjU3YzJVTCwgMHhmYjNjOTVjM1VMLCAweGEyODJkM2MxVUwsIDB4OTVlODExYzBVTCwgMHhhOGFmNGRjYlVMLAotICAgIDB4OWZjNThmY2FVTCwgMHhjNjdiYzljOFVMLCAweGYxMTEwYmM5VUwsIDB4NzQwNzQ0Y2NVTCwgMHg0MzZkODZjZFVMLAotICAgIDB4MWFkM2MwY2ZVTCwgMHgyZGI5MDJjZVVMLCAweDQwOTZhZjkxVUwsIDB4NzdmYzZkOTBVTCwgMHgyZTQyMmI5MlVMLAotICAgIDB4MTkyOGU5OTNVTCwgMHg5YzNlYTY5NlVMLCAweGFiNTQ2NDk3VUwsIDB4ZjJlYTIyOTVVTCwgMHhjNTgwZTA5NFVMLAotICAgIDB4ZjhjN2JjOWZVTCwgMHhjZmFkN2U5ZVVMLCAweDk2MTMzODljVUwsIDB4YTE3OWZhOWRVTCwgMHgyNDZmYjU5OFVMLAotICAgIDB4MTMwNTc3OTlVTCwgMHg0YWJiMzE5YlVMLCAweDdkZDFmMzlhVUwsIDB4MzAzNTg5OGRVTCwgMHgwNzVmNGI4Y1VMLAotICAgIDB4NWVlMTBkOGVVTCwgMHg2OThiY2Y4ZlVMLCAweGVjOWQ4MDhhVUwsIDB4ZGJmNzQyOGJVTCwgMHg4MjQ5MDQ4OVVMLAotICAgIDB4YjUyM2M2ODhVTCwgMHg4ODY0OWE4M1VMLCAweGJmMGU1ODgyVUwsIDB4ZTZiMDFlODBVTCwgMHhkMWRhZGM4MVVMLAotICAgIDB4NTRjYzkzODRVTCwgMHg2M2E2NTE4NVVMLCAweDNhMTgxNzg3VUwsIDB4MGQ3MmQ1ODZVTCwgMHhhMGQwZTJhOVVMLAotICAgIDB4OTdiYTIwYThVTCwgMHhjZTA0NjZhYVVMLCAweGY5NmVhNGFiVUwsIDB4N2M3OGViYWVVTCwgMHg0YjEyMjlhZlVMLAotICAgIDB4MTJhYzZmYWRVTCwgMHgyNWM2YWRhY1VMLCAweDE4ODFmMWE3VUwsIDB4MmZlYjMzYTZVTCwgMHg3NjU1NzVhNFVMLAotICAgIDB4NDEzZmI3YTVVTCwgMHhjNDI5ZjhhMFVMLCAweGYzNDMzYWExVUwsIDB4YWFmZDdjYTNVTCwgMHg5ZDk3YmVhMlVMLAotICAgIDB4ZDA3M2M0YjVVTCwgMHhlNzE5MDZiNFVMLCAweGJlYTc0MGI2VUwsIDB4ODljZDgyYjdVTCwgMHgwY2RiY2RiMlVMLAotICAgIDB4M2JiMTBmYjNVTCwgMHg2MjBmNDliMVVMLCAweDU1NjU4YmIwVUwsIDB4NjgyMmQ3YmJVTCwgMHg1ZjQ4MTViYVVMLAotICAgIDB4MDZmNjUzYjhVTCwgMHgzMTljOTFiOVVMLCAweGI0OGFkZWJjVUwsIDB4ODNlMDFjYmRVTCwgMHhkYTVlNWFiZlVMLAotICAgIDB4ZWQzNDk4YmVVTAotICB9LAotICB7Ci0gICAgMHgwMDAwMDAwMFVMLCAweDY1NjdiY2I4VUwsIDB4OGJjODA5YWFVTCwgMHhlZWFmYjUxMlVMLCAweDU3OTc2MjhmVUwsCi0gICAgMHgzMmYwZGUzN1VMLCAweGRjNWY2YjI1VUwsIDB4YjkzOGQ3OWRVTCwgMHhlZjI4YjRjNVVMLCAweDhhNGYwODdkVUwsCi0gICAgMHg2NGUwYmQ2ZlVMLCAweDAxODcwMWQ3VUwsIDB4YjhiZmQ2NGFVTCwgMHhkZGQ4NmFmMlVMLCAweDMzNzdkZmUwVUwsCi0gICAgMHg1NjEwNjM1OFVMLCAweDlmNTcxOTUwVUwsIDB4ZmEzMGE1ZThVTCwgMHgxNDlmMTBmYVVMLCAweDcxZjhhYzQyVUwsCi0gICAgMHhjOGMwN2JkZlVMLCAweGFkYTdjNzY3VUwsIDB4NDMwODcyNzVVTCwgMHgyNjZmY2VjZFVMLCAweDcwN2ZhZDk1VUwsCi0gICAgMHgxNTE4MTEyZFVMLCAweGZiYjdhNDNmVUwsIDB4OWVkMDE4ODdVTCwgMHgyN2U4Y2YxYVVMLCAweDQyOGY3M2EyVUwsCi0gICAgMHhhYzIwYzZiMFVMLCAweGM5NDc3YTA4VUwsIDB4M2VhZjMyYTBVTCwgMHg1YmM4OGUxOFVMLCAweGI1NjczYjBhVUwsCi0gICAgMHhkMDAwODdiMlVMLCAweDY5Mzg1MDJmVUwsIDB4MGM1ZmVjOTdVTCwgMHhlMmYwNTk4NVVMLCAweDg3OTdlNTNkVUwsCi0gICAgMHhkMTg3ODY2NVVMLCAweGI0ZTAzYWRkVUwsIDB4NWE0ZjhmY2ZVTCwgMHgzZjI4MzM3N1VMLCAweDg2MTBlNGVhVUwsCi0gICAgMHhlMzc3NTg1MlVMLCAweDBkZDhlZDQwVUwsIDB4NjhiZjUxZjhVTCwgMHhhMWY4MmJmMFVMLCAweGM0OWY5NzQ4VUwsCi0gICAgMHgyYTMwMjI1YVVMLCAweDRmNTc5ZWUyVUwsIDB4ZjY2ZjQ5N2ZVTCwgMHg5MzA4ZjVjN1VMLCAweDdkYTc0MGQ1VUwsCi0gICAgMHgxOGMwZmM2ZFVMLCAweDRlZDA5ZjM1VUwsIDB4MmJiNzIzOGRVTCwgMHhjNTE4OTY5ZlVMLCAweGEwN2YyYTI3VUwsCi0gICAgMHgxOTQ3ZmRiYVVMLCAweDdjMjA0MTAyVUwsIDB4OTI4ZmY0MTBVTCwgMHhmN2U4NDhhOFVMLCAweDNkNTgxNDliVUwsCi0gICAgMHg1ODNmYTgyM1VMLCAweGI2OTAxZDMxVUwsIDB4ZDNmN2ExODlVTCwgMHg2YWNmNzYxNFVMLCAweDBmYThjYWFjVUwsCi0gICAgMHhlMTA3N2ZiZVVMLCAweDg0NjBjMzA2VUwsIDB4ZDI3MGEwNWVVTCwgMHhiNzE3MWNlNlVMLCAweDU5YjhhOWY0VUwsCi0gICAgMHgzY2RmMTU0Y1VMLCAweDg1ZTdjMmQxVUwsIDB4ZTA4MDdlNjlVTCwgMHgwZTJmY2I3YlVMLCAweDZiNDg3N2MzVUwsCi0gICAgMHhhMjBmMGRjYlVMLCAweGM3NjhiMTczVUwsIDB4MjljNzA0NjFVTCwgMHg0Y2EwYjhkOVVMLCAweGY1OTg2ZjQ0VUwsCi0gICAgMHg5MGZmZDNmY1VMLCAweDdlNTA2NmVlVUwsIDB4MWIzN2RhNTZVTCwgMHg0ZDI3YjkwZVVMLCAweDI4NDAwNWI2VUwsCi0gICAgMHhjNmVmYjBhNFVMLCAweGEzODgwYzFjVUwsIDB4MWFiMGRiODFVTCwgMHg3ZmQ3NjczOVVMLCAweDkxNzhkMjJiVUwsCi0gICAgMHhmNDFmNmU5M1VMLCAweDAzZjcyNjNiVUwsIDB4NjY5MDlhODNVTCwgMHg4ODNmMmY5MVVMLCAweGVkNTg5MzI5VUwsCi0gICAgMHg1NDYwNDRiNFVMLCAweDMxMDdmODBjVUwsIDB4ZGZhODRkMWVVTCwgMHhiYWNmZjFhNlVMLCAweGVjZGY5MmZlVUwsCi0gICAgMHg4OWI4MmU0NlVMLCAweDY3MTc5YjU0VUwsIDB4MDI3MDI3ZWNVTCwgMHhiYjQ4ZjA3MVVMLCAweGRlMmY0Y2M5VUwsCi0gICAgMHgzMDgwZjlkYlVMLCAweDU1ZTc0NTYzVUwsIDB4OWNhMDNmNmJVTCwgMHhmOWM3ODNkM1VMLCAweDE3NjgzNmMxVUwsCi0gICAgMHg3MjBmOGE3OVVMLCAweGNiMzc1ZGU0VUwsIDB4YWU1MGUxNWNVTCwgMHg0MGZmNTQ0ZVVMLCAweDI1OThlOGY2VUwsCi0gICAgMHg3Mzg4OGJhZVVMLCAweDE2ZWYzNzE2VUwsIDB4Zjg0MDgyMDRVTCwgMHg5ZDI3M2ViY1VMLCAweDI0MWZlOTIxVUwsCi0gICAgMHg0MTc4NTU5OVVMLCAweGFmZDdlMDhiVUwsIDB4Y2FiMDVjMzNVTCwgMHgzYmI2NTllZFVMLCAweDVlZDFlNTU1VUwsCi0gICAgMHhiMDdlNTA0N1VMLCAweGQ1MTllY2ZmVUwsIDB4NmMyMTNiNjJVTCwgMHgwOTQ2ODdkYVVMLCAweGU3ZTkzMmM4VUwsCi0gICAgMHg4MjhlOGU3MFVMLCAweGQ0OWVlZDI4VUwsIDB4YjFmOTUxOTBVTCwgMHg1ZjU2ZTQ4MlVMLCAweDNhMzE1ODNhVUwsCi0gICAgMHg4MzA5OGZhN1VMLCAweGU2NmUzMzFmVUwsIDB4MDhjMTg2MGRVTCwgMHg2ZGE2M2FiNVVMLCAweGE0ZTE0MGJkVUwsCi0gICAgMHhjMTg2ZmMwNVVMLCAweDJmMjk0OTE3VUwsIDB4NGE0ZWY1YWZVTCwgMHhmMzc2MjIzMlVMLCAweDk2MTE5ZThhVUwsCi0gICAgMHg3OGJlMmI5OFVMLCAweDFkZDk5NzIwVUwsIDB4NGJjOWY0NzhVTCwgMHgyZWFlNDhjMFVMLCAweGMwMDFmZGQyVUwsCi0gICAgMHhhNTY2NDE2YVVMLCAweDFjNWU5NmY3VUwsIDB4NzkzOTJhNGZVTCwgMHg5Nzk2OWY1ZFVMLCAweGYyZjEyM2U1VUwsCi0gICAgMHgwNTE5NmI0ZFVMLCAweDYwN2VkN2Y1VUwsIDB4OGVkMTYyZTdVTCwgMHhlYmI2ZGU1ZlVMLCAweDUyOGUwOWMyVUwsCi0gICAgMHgzN2U5YjU3YVVMLCAweGQ5NDYwMDY4VUwsIDB4YmMyMWJjZDBVTCwgMHhlYTMxZGY4OFVMLCAweDhmNTY2MzMwVUwsCi0gICAgMHg2MWY5ZDYyMlVMLCAweDA0OWU2YTlhVUwsIDB4YmRhNmJkMDdVTCwgMHhkOGMxMDFiZlVMLCAweDM2NmViNGFkVUwsCi0gICAgMHg1MzA5MDgxNVVMLCAweDlhNGU3MjFkVUwsIDB4ZmYyOWNlYTVVTCwgMHgxMTg2N2JiN1VMLCAweDc0ZTFjNzBmVUwsCi0gICAgMHhjZGQ5MTA5MlVMLCAweGE4YmVhYzJhVUwsIDB4NDYxMTE5MzhVTCwgMHgyMzc2YTU4MFVMLCAweDc1NjZjNmQ4VUwsCi0gICAgMHgxMDAxN2E2MFVMLCAweGZlYWVjZjcyVUwsIDB4OWJjOTczY2FVTCwgMHgyMmYxYTQ1N1VMLCAweDQ3OTYxOGVmVUwsCi0gICAgMHhhOTM5YWRmZFVMLCAweGNjNWUxMTQ1VUwsIDB4MDZlZTRkNzZVTCwgMHg2Mzg5ZjFjZVVMLCAweDhkMjY0NGRjVUwsCi0gICAgMHhlODQxZjg2NFVMLCAweDUxNzkyZmY5VUwsIDB4MzQxZTkzNDFVTCwgMHhkYWIxMjY1M1VMLCAweGJmZDY5YWViVUwsCi0gICAgMHhlOWM2ZjliM1VMLCAweDhjYTE0NTBiVUwsIDB4NjIwZWYwMTlVTCwgMHgwNzY5NGNhMVVMLCAweGJlNTE5YjNjVUwsCi0gICAgMHhkYjM2Mjc4NFVMLCAweDM1OTk5Mjk2VUwsIDB4NTBmZTJlMmVVTCwgMHg5OWI5NTQyNlVMLCAweGZjZGVlODllVUwsCi0gICAgMHgxMjcxNWQ4Y1VMLCAweDc3MTZlMTM0VUwsIDB4Y2UyZTM2YTlVTCwgMHhhYjQ5OGExMVVMLCAweDQ1ZTYzZjAzVUwsCi0gICAgMHgyMDgxODNiYlVMLCAweDc2OTFlMGUzVUwsIDB4MTNmNjVjNWJVTCwgMHhmZDU5ZTk0OVVMLCAweDk4M2U1NWYxVUwsCi0gICAgMHgyMTA2ODI2Y1VMLCAweDQ0NjEzZWQ0VUwsIDB4YWFjZThiYzZVTCwgMHhjZmE5Mzc3ZVVMLCAweDM4NDE3ZmQ2VUwsCi0gICAgMHg1ZDI2YzM2ZVVMLCAweGIzODk3NjdjVUwsIDB4ZDZlZWNhYzRVTCwgMHg2ZmQ2MWQ1OVVMLCAweDBhYjFhMWUxVUwsCi0gICAgMHhlNDFlMTRmM1VMLCAweDgxNzlhODRiVUwsIDB4ZDc2OWNiMTNVTCwgMHhiMjBlNzdhYlVMLCAweDVjYTFjMmI5VUwsCi0gICAgMHgzOWM2N2UwMVVMLCAweDgwZmVhOTljVUwsIDB4ZTU5OTE1MjRVTCwgMHgwYjM2YTAzNlVMLCAweDZlNTExYzhlVUwsCi0gICAgMHhhNzE2NjY4NlVMLCAweGMyNzFkYTNlVUwsIDB4MmNkZTZmMmNVTCwgMHg0OWI5ZDM5NFVMLCAweGYwODEwNDA5VUwsCi0gICAgMHg5NWU2YjhiMVVMLCAweDdiNDkwZGEzVUwsIDB4MWUyZWIxMWJVTCwgMHg0ODNlZDI0M1VMLCAweDJkNTk2ZWZiVUwsCi0gICAgMHhjM2Y2ZGJlOVVMLCAweGE2OTE2NzUxVUwsIDB4MWZhOWIwY2NVTCwgMHg3YWNlMGM3NFVMLCAweDk0NjFiOTY2VUwsCi0gICAgMHhmMTA2MDVkZVVMCi0jZW5kaWYKLSAgfQotfTsKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9kZWZsYXRlLmMgYi9saWJzL3psaWIvZGVmbGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNlMWY2Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9kZWZsYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzM2ICswLDAgQEAKLS8qIGRlZmxhdGUuYyAtLSBjb21wcmVzcyBkYXRhIHVzaW5nIHRoZSBkZWZsYXRpb24gYWxnb3JpdGhtCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qCi0gKiAgQUxHT1JJVEhNCi0gKgotICogICAgICBUaGUgImRlZmxhdGlvbiIgcHJvY2VzcyBkZXBlbmRzIG9uIGJlaW5nIGFibGUgdG8gaWRlbnRpZnkgcG9ydGlvbnMKLSAqICAgICAgb2YgdGhlIGlucHV0IHRleHQgd2hpY2ggYXJlIGlkZW50aWNhbCB0byBlYXJsaWVyIGlucHV0ICh3aXRoaW4gYQotICogICAgICBzbGlkaW5nIHdpbmRvdyB0cmFpbGluZyBiZWhpbmQgdGhlIGlucHV0IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQpLgotICoKLSAqICAgICAgVGhlIG1vc3Qgc3RyYWlnaHRmb3J3YXJkIHRlY2huaXF1ZSB0dXJucyBvdXQgdG8gYmUgdGhlIGZhc3Rlc3QgZm9yCi0gKiAgICAgIG1vc3QgaW5wdXQgZmlsZXM6IHRyeSBhbGwgcG9zc2libGUgbWF0Y2hlcyBhbmQgc2VsZWN0IHRoZSBsb25nZXN0LgotICogICAgICBUaGUga2V5IGZlYXR1cmUgb2YgdGhpcyBhbGdvcml0aG0gaXMgdGhhdCBpbnNlcnRpb25zIGludG8gdGhlIHN0cmluZwotICogICAgICBkaWN0aW9uYXJ5IGFyZSB2ZXJ5IHNpbXBsZSBhbmQgdGh1cyBmYXN0LCBhbmQgZGVsZXRpb25zIGFyZSBhdm9pZGVkCi0gKiAgICAgIGNvbXBsZXRlbHkuIEluc2VydGlvbnMgYXJlIHBlcmZvcm1lZCBhdCBlYWNoIGlucHV0IGNoYXJhY3Rlciwgd2hlcmVhcwotICogICAgICBzdHJpbmcgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkIG9ubHkgd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggZW5kcy4gU28gaXQKLSAqICAgICAgaXMgcHJlZmVyYWJsZSB0byBzcGVuZCBtb3JlIHRpbWUgaW4gbWF0Y2hlcyB0byBhbGxvdyB2ZXJ5IGZhc3Qgc3RyaW5nCi0gKiAgICAgIGluc2VydGlvbnMgYW5kIGF2b2lkIGRlbGV0aW9ucy4gVGhlIG1hdGNoaW5nIGFsZ29yaXRobSBmb3Igc21hbGwKLSAqICAgICAgc3RyaW5ncyBpcyBpbnNwaXJlZCBmcm9tIHRoYXQgb2YgUmFiaW4gJiBLYXJwLiBBIGJydXRlIGZvcmNlIGFwcHJvYWNoCi0gKiAgICAgIGlzIHVzZWQgdG8gZmluZCBsb25nZXIgc3RyaW5ncyB3aGVuIGEgc21hbGwgbWF0Y2ggaGFzIGJlZW4gZm91bmQuCi0gKiAgICAgIEEgc2ltaWxhciBhbGdvcml0aG0gaXMgdXNlZCBpbiBjb21pYyAoYnkgSmFuLU1hcmsgV2FtcykgYW5kIGZyZWV6ZQotICogICAgICAoYnkgTGVvbmlkIEJyb3VraGlzKS4KLSAqICAgICAgICAgQSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1c2VkIGEgbW9yZSBzb3BoaXN0aWNhdGVkIGFsZ29yaXRobQotICogICAgICAoYnkgRmlhbGEgYW5kIEdyZWVuZSkgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBydW4gaW4gbGluZWFyIGFtb3J0aXplZAotICogICAgICB0aW1lLCBidXQgaGFzIGEgbGFyZ2VyIGF2ZXJhZ2UgY29zdCwgdXNlcyBtb3JlIG1lbW9yeSBhbmQgaXMgcGF0ZW50ZWQuCi0gKiAgICAgIEhvd2V2ZXIgdGhlIEYmRyBhbGdvcml0aG0gbWF5IGJlIGZhc3RlciBmb3Igc29tZSBoaWdobHkgcmVkdW5kYW50Ci0gKiAgICAgIGZpbGVzIGlmIHRoZSBwYXJhbWV0ZXIgbWF4X2NoYWluX2xlbmd0aCAoZGVzY3JpYmVkIGJlbG93KSBpcyB0b28gbGFyZ2UuCi0gKgotICogIEFDS05PV0xFREdFTUVOVFMKLSAqCi0gKiAgICAgIFRoZSBpZGVhIG9mIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGlzIGR1ZSB0byBKYW4tTWFyayBXYW1zLCBhbmQKLSAqICAgICAgSSBmb3VuZCBpdCBpbiAnZnJlZXplJyB3cml0dGVuIGJ5IExlb25pZCBCcm91a2hpcy4KLSAqICAgICAgVGhhbmtzIHRvIG1hbnkgcGVvcGxlIGZvciBidWcgcmVwb3J0cyBhbmQgdGVzdGluZy4KLSAqCi0gKiAgUkVGRVJFTkNFUwotICoKLSAqICAgICAgRGV1dHNjaCwgTC5QLiwiREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24iLgotICogICAgICBBdmFpbGFibGUgaW4gaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MS50eHQKLSAqCi0gKiAgICAgIEEgZGVzY3JpcHRpb24gb2YgdGhlIFJhYmluIGFuZCBLYXJwIGFsZ29yaXRobSBpcyBnaXZlbiBpbiB0aGUgYm9vawotICogICAgICAgICAiQWxnb3JpdGhtcyIgYnkgUi4gU2VkZ2V3aWNrLCBBZGRpc29uLVdlc2xleSwgcDI1Mi4KLSAqCi0gKiAgICAgIEZpYWxhLEUuUi4sIGFuZCBHcmVlbmUsRC5ILgotICogICAgICAgICBEYXRhIENvbXByZXNzaW9uIHdpdGggRmluaXRlIFdpbmRvd3MsIENvbW0uQUNNLCAzMiw0ICgxOTg5KSA0OTAtNTk1Ci0gKgotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jaW5jbHVkZSAiZGVmbGF0ZS5oIgotCi1jb25zdCBjaGFyIGRlZmxhdGVfY29weXJpZ2h0W10gPQotICAgIiBkZWZsYXRlIDEuMi4zIENvcHlyaWdodCAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseSAiOwotLyoKLSAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQotICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90Ci0gIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcwotICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KLSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqICBGdW5jdGlvbiBwcm90b3R5cGVzLgotICovCi10eXBlZGVmIGVudW0gewotICAgIG5lZWRfbW9yZSwgICAgICAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi8KLSAgICBibG9ja19kb25lLCAgICAgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovCi0gICAgZmluaXNoX3N0YXJ0ZWQsIC8qIGZpbmlzaCBzdGFydGVkLCBuZWVkIG9ubHkgbW9yZSBvdXRwdXQgYXQgbmV4dCBkZWZsYXRlICovCi0gICAgZmluaXNoX2RvbmUgICAgIC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi8KLX0gYmxvY2tfc3RhdGU7Ci0KLXR5cGVkZWYgYmxvY2tfc3RhdGUgKCpjb21wcmVzc19mdW5jKSBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Ci0vKiBDb21wcmVzc2lvbiBmdW5jdGlvbi4gUmV0dXJucyB0aGUgYmxvY2sgc3RhdGUgYWZ0ZXIgdGhlIGNhbGwuICovCi0KLWxvY2FsIHZvaWQgZmlsbF93aW5kb3cgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKLWxvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc3RvcmVkIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKLWxvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfZmFzdCAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKLSNpZm5kZWYgRkFTVEVTVAotbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zbG93ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOwotI2VuZGlmCi1sb2NhbCB2b2lkIGxtX2luaXQgICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci1sb2NhbCB2b2lkIHB1dFNob3J0TVNCICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB1SW50IGIpKTsKLWxvY2FsIHZvaWQgZmx1c2hfcGVuZGluZyAgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci1sb2NhbCBpbnQgcmVhZF9idWYgICAgICAgIE9GKCh6X3N0cmVhbXAgc3RybSwgQnl0ZWYgKmJ1ZiwgdW5zaWduZWQgc2l6ZSkpOwotI2lmbmRlZiBGQVNURVNUCi0jaWZkZWYgQVNNVgotICAgICAgdm9pZCBtYXRjaF9pbml0IE9GKCh2b2lkKSk7IC8qIGFzbSBjb2RlIGluaXRpYWxpemF0aW9uICovCi0gICAgICB1SW50IGxvbmdlc3RfbWF0Y2ggIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIGN1cl9tYXRjaCkpOwotI2Vsc2UKLWxvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaCAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7Ci0jZW5kaWYKLSNlbmRpZgotbG9jYWwgdUludCBsb25nZXN0X21hdGNoX2Zhc3QgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7Ci0KLSNpZmRlZiBERUJVRwotbG9jYWwgIHZvaWQgY2hlY2tfbWF0Y2ggT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3Mgc3RhcnQsIElQb3MgbWF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkpOwotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogTG9jYWwgZGF0YQotICovCi0KLSNkZWZpbmUgTklMIDAKLS8qIFRhaWwgb2YgaGFzaCBjaGFpbnMgKi8KLQotI2lmbmRlZiBUT09fRkFSCi0jICBkZWZpbmUgVE9PX0ZBUiA0MDk2Ci0jZW5kaWYKLS8qIE1hdGNoZXMgb2YgbGVuZ3RoIDMgYXJlIGRpc2NhcmRlZCBpZiB0aGVpciBkaXN0YW5jZSBleGNlZWRzIFRPT19GQVIgKi8KLQotI2RlZmluZSBNSU5fTE9PS0FIRUFEIChNQVhfTUFUQ0grTUlOX01BVENIKzEpCi0vKiBNaW5pbXVtIGFtb3VudCBvZiBsb29rYWhlYWQsIGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgotICogU2VlIGRlZmxhdGUuYyBmb3IgY29tbWVudHMgYWJvdXQgdGhlIE1JTl9NQVRDSCsxLgotICovCi0KLS8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvbgotICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvCi0gKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmUKLSAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgY29uZmlnX3MgewotICAgdXNoIGdvb2RfbGVuZ3RoOyAvKiByZWR1Y2UgbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KLSAgIHVzaCBtYXhfbGF6eTsgICAgLyogZG8gbm90IHBlcmZvcm0gbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KLSAgIHVzaCBuaWNlX2xlbmd0aDsgLyogcXVpdCBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KLSAgIHVzaCBtYXhfY2hhaW47Ci0gICBjb21wcmVzc19mdW5jIGZ1bmM7Ci19IGNvbmZpZzsKLQotI2lmZGVmIEZBU1RFU1QKLWxvY2FsIGNvbnN0IGNvbmZpZyBjb25maWd1cmF0aW9uX3RhYmxlWzJdID0gewotLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqLwotLyogMCAqLyB7MCwgICAgMCwgIDAsICAgIDAsIGRlZmxhdGVfc3RvcmVkfSwgIC8qIHN0b3JlIG9ubHkgKi8KLS8qIDEgKi8gezQsICAgIDQsICA4LCAgICA0LCBkZWZsYXRlX2Zhc3R9fTsgLyogbWF4IHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi8KLSNlbHNlCi1sb2NhbCBjb25zdCBjb25maWcgY29uZmlndXJhdGlvbl90YWJsZVsxMF0gPSB7Ci0vKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCi0vKiAwICovIHswLCAgICAwLCAgMCwgICAgMCwgZGVmbGF0ZV9zdG9yZWR9LCAgLyogc3RvcmUgb25seSAqLwotLyogMSAqLyB7NCwgICAgNCwgIDgsICAgIDQsIGRlZmxhdGVfZmFzdH0sIC8qIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovCi0vKiAyICovIHs0LCAgICA1LCAxNiwgICAgOCwgZGVmbGF0ZV9mYXN0fSwKLS8qIDMgKi8gezQsICAgIDYsIDMyLCAgIDMyLCBkZWZsYXRlX2Zhc3R9LAotCi0vKiA0ICovIHs0LCAgICA0LCAxNiwgICAxNiwgZGVmbGF0ZV9zbG93fSwgIC8qIGxhenkgbWF0Y2hlcyAqLwotLyogNSAqLyB7OCwgICAxNiwgMzIsICAgMzIsIGRlZmxhdGVfc2xvd30sCi0vKiA2ICovIHs4LCAgIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93fSwKLS8qIDcgKi8gezgsICAgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3d9LAotLyogOCAqLyB7MzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3d9LAotLyogOSAqLyB7MzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3d9fTsgLyogbWF4IGNvbXByZXNzaW9uICovCi0jZW5kaWYKLQotLyogTm90ZTogdGhlIGRlZmxhdGUoKSBjb2RlIHJlcXVpcmVzIG1heF9sYXp5ID49IE1JTl9NQVRDSCBhbmQgbWF4X2NoYWluID49IDQKLSAqIEZvciBkZWZsYXRlX2Zhc3QoKSAobGV2ZWxzIDw9IDMpIGdvb2QgaXMgaWdub3JlZCBhbmQgbGF6eSBoYXMgYSBkaWZmZXJlbnQKLSAqIG1lYW5pbmcuCi0gKi8KLQotI2RlZmluZSBFUVVBTCAwCi0vKiByZXN1bHQgb2YgbWVtY21wIGZvciBlcXVhbCBzdHJpbmdzICovCi0KLSNpZm5kZWYgTk9fRFVNTVlfREVDTAotc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFVwZGF0ZSBhIGhhc2ggdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgYnl0ZQotICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIHRvIFVQREFURV9IQVNIIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKLSAqICAgIGlucHV0IGNoYXJhY3RlcnMsIHNvIHRoYXQgYSBydW5uaW5nIGhhc2gga2V5IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZQotICogICAgcHJldmlvdXMga2V5IGluc3RlYWQgb2YgY29tcGxldGUgcmVjYWxjdWxhdGlvbiBlYWNoIHRpbWUuCi0gKi8KLSNkZWZpbmUgVVBEQVRFX0hBU0gocyxoLGMpIChoID0gKCgoaCk8PHMtPmhhc2hfc2hpZnQpIF4gKGMpKSAmIHMtPmhhc2hfbWFzaykKLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEluc2VydCBzdHJpbmcgc3RyIGluIHRoZSBkaWN0aW9uYXJ5IGFuZCBzZXQgbWF0Y2hfaGVhZCB0byB0aGUgcHJldmlvdXMgaGVhZAotICogb2YgdGhlIGhhc2ggY2hhaW4gKHRoZSBtb3N0IHJlY2VudCBzdHJpbmcgd2l0aCBzYW1lIGhhc2gga2V5KS4gUmV0dXJuCi0gKiB0aGUgcHJldmlvdXMgbGVuZ3RoIG9mIHRoZSBoYXNoIGNoYWluLgotICogSWYgdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggLURGQVNURVNULCB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgZm9yY2VkCi0gKiB0byAxLCBhbmQgbm8gaGFzaCBjaGFpbnMgYXJlIG1haW50YWluZWQuCi0gKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gSU5TRVJUX1NUUklORyBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCi0gKiAgICBpbnB1dCBjaGFyYWN0ZXJzIGFuZCB0aGUgZmlyc3QgTUlOX01BVENIIGJ5dGVzIG9mIHN0ciBhcmUgdmFsaWQKLSAqICAgIChleGNlcHQgZm9yIHRoZSBsYXN0IE1JTl9NQVRDSC0xIGJ5dGVzIG9mIHRoZSBpbnB1dCBmaWxlKS4KLSAqLwotI2lmZGVmIEZBU1RFU1QKLSNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBzdHIsIG1hdGNoX2hlYWQpIFwKLSAgIChVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WyhzdHIpICsgKE1JTl9NQVRDSC0xKV0pLCBcCi0gICAgbWF0Y2hfaGVhZCA9IHMtPmhlYWRbcy0+aW5zX2hdLCBcCi0gICAgcy0+aGVhZFtzLT5pbnNfaF0gPSAoUG9zKShzdHIpKQotI2Vsc2UKLSNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBzdHIsIG1hdGNoX2hlYWQpIFwKLSAgIChVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WyhzdHIpICsgKE1JTl9NQVRDSC0xKV0pLCBcCi0gICAgbWF0Y2hfaGVhZCA9IHMtPnByZXZbKHN0cikgJiBzLT53X21hc2tdID0gcy0+aGVhZFtzLT5pbnNfaF0sIFwKLSAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3MpKHN0cikpCi0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBJbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIChhdm9pZGluZyA2NEsgb3ZlcmZsb3cgZm9yIDE2IGJpdCBzeXN0ZW1zKS4KLSAqIHByZXZbXSB3aWxsIGJlIGluaXRpYWxpemVkIG9uIHRoZSBmbHkuCi0gKi8KLSNkZWZpbmUgQ0xFQVJfSEFTSChzKSBcCi0gICAgcy0+aGVhZFtzLT5oYXNoX3NpemUtMV0gPSBOSUw7IFwKLSAgICB6bWVtemVybygoQnl0ZWYgKilzLT5oZWFkLCAodW5zaWduZWQpKHMtPmhhc2hfc2l6ZS0xKSpzaXplb2YoKnMtPmhlYWQpKTsKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfKHN0cm0sIGxldmVsLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKLSAgICB6X3N0cmVhbXAgc3RybTsKLSAgICBpbnQgbGV2ZWw7Ci0gICAgY29uc3QgY2hhciAqdmVyc2lvbjsKLSAgICBpbnQgc3RyZWFtX3NpemU7Ci17Ci0gICAgcmV0dXJuIGRlZmxhdGVJbml0Ml8oc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIE1BWF9XQklUUywgREVGX01FTV9MRVZFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1ksIHZlcnNpb24sIHN0cmVhbV9zaXplKTsKLSAgICAvKiBUbyBkbzogaWdub3JlIHN0cm0tPm5leHRfaW4gaWYgd2UgdXNlIGl0IGFzIHdpbmRvdyAqLwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgIHZlcnNpb24sIHN0cmVhbV9zaXplKQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIGludCAgbGV2ZWw7Ci0gICAgaW50ICBtZXRob2Q7Ci0gICAgaW50ICB3aW5kb3dCaXRzOwotICAgIGludCAgbWVtTGV2ZWw7Ci0gICAgaW50ICBzdHJhdGVneTsKLSAgICBjb25zdCBjaGFyICp2ZXJzaW9uOwotICAgIGludCBzdHJlYW1fc2l6ZTsKLXsKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIGludCB3cmFwID0gMTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBteV92ZXJzaW9uW10gPSBaTElCX1ZFUlNJT047Ci0KLSAgICB1c2hmICpvdmVybGF5OwotICAgIC8qIFdlIG92ZXJsYXkgcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmLiBUaGlzIHdvcmtzIHNpbmNlIHRoZSBhdmVyYWdlCi0gICAgICogb3V0cHV0IHNpemUgZm9yIChsZW5ndGgsZGlzdGFuY2UpIGNvZGVzIGlzIDw9IDI0IGJpdHMuCi0gICAgICovCi0KLSAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBteV92ZXJzaW9uWzBdIHx8Ci0gICAgICAgIHN0cmVhbV9zaXplICE9IHNpemVvZih6X3N0cmVhbSkpIHsKLSAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKLSAgICB9Ci0gICAgaWYgKHN0cm0gPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICBzdHJtLT5tc2cgPSBaX05VTEw7Ci0gICAgaWYgKHN0cm0tPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwKSB7Ci0gICAgICAgIHN0cm0tPnphbGxvYyA9IHpjYWxsb2M7Ci0gICAgICAgIHN0cm0tPm9wYXF1ZSA9ICh2b2lkcGYpMDsKLSAgICB9Ci0gICAgaWYgKHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkgc3RybS0+emZyZWUgPSB6Y2ZyZWU7Ci0KLSNpZmRlZiBGQVNURVNUCi0gICAgaWYgKGxldmVsICE9IDApIGxldmVsID0gMTsKLSNlbHNlCi0gICAgaWYgKGxldmVsID09IFpfREVGQVVMVF9DT01QUkVTU0lPTikgbGV2ZWwgPSA2OwotI2VuZGlmCi0KLSAgICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovCi0gICAgICAgIHdyYXAgPSAwOwotICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7Ci0gICAgfQotI2lmZGVmIEdaSVAKLSAgICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHsKLSAgICAgICAgd3JhcCA9IDI7ICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovCi0gICAgICAgIHdpbmRvd0JpdHMgLT0gMTY7Ci0gICAgfQotI2VuZGlmCi0gICAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9IFpfREVGTEFURUQgfHwKLSAgICAgICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHwKLSAgICAgICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkgewotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgfQotICAgIGlmICh3aW5kb3dCaXRzID09IDgpIHdpbmRvd0JpdHMgPSA5OyAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqLwotICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0Moc3RybSwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKLSAgICBpZiAocyA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopczsKLSAgICBzLT5zdHJtID0gc3RybTsKLQotICAgIHMtPndyYXAgPSB3cmFwOwotICAgIHMtPmd6aGVhZCA9IFpfTlVMTDsKLSAgICBzLT53X2JpdHMgPSB3aW5kb3dCaXRzOwotICAgIHMtPndfc2l6ZSA9IDEgPDwgcy0+d19iaXRzOwotICAgIHMtPndfbWFzayA9IHMtPndfc2l6ZSAtIDE7Ci0KLSAgICBzLT5oYXNoX2JpdHMgPSBtZW1MZXZlbCArIDc7Ci0gICAgcy0+aGFzaF9zaXplID0gMSA8PCBzLT5oYXNoX2JpdHM7Ci0gICAgcy0+aGFzaF9tYXNrID0gcy0+aGFzaF9zaXplIC0gMTsKLSAgICBzLT5oYXNoX3NoaWZ0ID0gICgocy0+aGFzaF9iaXRzK01JTl9NQVRDSC0xKS9NSU5fTUFUQ0gpOwotCi0gICAgcy0+d2luZG93ID0gKEJ5dGVmICopIFpBTExPQyhzdHJtLCBzLT53X3NpemUsIDIqc2l6ZW9mKEJ5dGUpKTsKLSAgICBzLT5wcmV2ICAgPSAoUG9zZiAqKSAgWkFMTE9DKHN0cm0sIHMtPndfc2l6ZSwgc2l6ZW9mKFBvcykpOwotICAgIHMtPmhlYWQgICA9IChQb3NmICopICBaQUxMT0Moc3RybSwgcy0+aGFzaF9zaXplLCBzaXplb2YoUG9zKSk7Ci0KLSAgICBzLT5saXRfYnVmc2l6ZSA9IDEgPDwgKG1lbUxldmVsICsgNik7IC8qIDE2SyBlbGVtZW50cyBieSBkZWZhdWx0ICovCi0KLSAgICBvdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKHN0cm0sIHMtPmxpdF9idWZzaXplLCBzaXplb2YodXNoKSsyKTsKLSAgICBzLT5wZW5kaW5nX2J1ZiA9ICh1Y2hmICopIG92ZXJsYXk7Ci0gICAgcy0+cGVuZGluZ19idWZfc2l6ZSA9ICh1bGcpcy0+bGl0X2J1ZnNpemUgKiAoc2l6ZW9mKHVzaCkrMkwpOwotCi0gICAgaWYgKHMtPndpbmRvdyA9PSBaX05VTEwgfHwgcy0+cHJldiA9PSBaX05VTEwgfHwgcy0+aGVhZCA9PSBaX05VTEwgfHwKLSAgICAgICAgcy0+cGVuZGluZ19idWYgPT0gWl9OVUxMKSB7Ci0gICAgICAgIHMtPnN0YXR1cyA9IEZJTklTSF9TVEFURTsKLSAgICAgICAgc3RybS0+bXNnID0gKGNoYXIqKUVSUl9NU0coWl9NRU1fRVJST1IpOwotICAgICAgICBkZWZsYXRlRW5kIChzdHJtKTsKLSAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIH0KLSAgICBzLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTsKLSAgICBzLT5sX2J1ZiA9IHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKnMtPmxpdF9idWZzaXplOwotCi0gICAgcy0+bGV2ZWwgPSBsZXZlbDsKLSAgICBzLT5zdHJhdGVneSA9IHN0cmF0ZWd5OwotICAgIHMtPm1ldGhvZCA9IChCeXRlKW1ldGhvZDsKLQotICAgIHJldHVybiBkZWZsYXRlUmVzZXQoc3RybSk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IChzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5OwotICAgIHVJbnQgIGRpY3RMZW5ndGg7Ci17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICB1SW50IGxlbmd0aCA9IGRpY3RMZW5ndGg7Ci0gICAgdUludCBuOwotICAgIElQb3MgaGFzaF9oZWFkID0gMDsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgZGljdGlvbmFyeSA9PSBaX05VTEwgfHwKLSAgICAgICAgc3RybS0+c3RhdGUtPndyYXAgPT0gMiB8fAotICAgICAgICAoc3RybS0+c3RhdGUtPndyYXAgPT0gMSAmJiBzdHJtLT5zdGF0ZS0+c3RhdHVzICE9IElOSVRfU1RBVEUpKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICBzID0gc3RybS0+c3RhdGU7Ci0gICAgaWYgKHMtPndyYXApCi0gICAgICAgIHN0cm0tPmFkbGVyID0gYWRsZXIzMihzdHJtLT5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7Ci0KLSAgICBpZiAobGVuZ3RoIDwgTUlOX01BVENIKSByZXR1cm4gWl9PSzsKLSAgICBpZiAobGVuZ3RoID4gTUFYX0RJU1QocykpIHsKLSAgICAgICAgbGVuZ3RoID0gTUFYX0RJU1Qocyk7Ci0gICAgICAgIGRpY3Rpb25hcnkgKz0gZGljdExlbmd0aCAtIGxlbmd0aDsgLyogdXNlIHRoZSB0YWlsIG9mIHRoZSBkaWN0aW9uYXJ5ICovCi0gICAgfQotICAgIHptZW1jcHkocy0+d2luZG93LCBkaWN0aW9uYXJ5LCBsZW5ndGgpOwotICAgIHMtPnN0cnN0YXJ0ID0gbGVuZ3RoOwotICAgIHMtPmJsb2NrX3N0YXJ0ID0gKGxvbmcpbGVuZ3RoOwotCi0gICAgLyogSW5zZXJ0IGFsbCBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIChleGNlcHQgZm9yIHRoZSBsYXN0IHR3byBieXRlcykuCi0gICAgICogcy0+bG9va2FoZWFkIHN0YXlzIG51bGwsIHNvIHMtPmluc19oIHdpbGwgYmUgcmVjb21wdXRlZCBhdCB0aGUgbmV4dAotICAgICAqIGNhbGwgb2YgZmlsbF93aW5kb3cuCi0gICAgICovCi0gICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbMF07Ci0gICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1sxXSk7Ci0gICAgZm9yIChuID0gMDsgbiA8PSBsZW5ndGggLSBNSU5fTUFUQ0g7IG4rKykgewotICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIG4sIGhhc2hfaGVhZCk7Ci0gICAgfQotICAgIGlmIChoYXNoX2hlYWQpIGhhc2hfaGVhZCA9IDA7ICAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVSZXNldCAoc3RybSkKLSAgICB6X3N0cmVhbXAgc3RybTsKLXsKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAotICAgICAgICBzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCB8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApIHsKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIH0KLQotICAgIHN0cm0tPnRvdGFsX2luID0gc3RybS0+dG90YWxfb3V0ID0gMDsKLSAgICBzdHJtLT5tc2cgPSBaX05VTEw7IC8qIHVzZSB6ZnJlZSBpZiB3ZSBldmVyIGFsbG9jYXRlIG1zZyBkeW5hbWljYWxseSAqLwotICAgIHN0cm0tPmRhdGFfdHlwZSA9IFpfVU5LTk9XTjsKLQotICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOwotICAgIHMtPnBlbmRpbmcgPSAwOwotICAgIHMtPnBlbmRpbmdfb3V0ID0gcy0+cGVuZGluZ19idWY7Ci0KLSAgICBpZiAocy0+d3JhcCA8IDApIHsKLSAgICAgICAgcy0+d3JhcCA9IC1zLT53cmFwOyAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqLwotICAgIH0KLSAgICBzLT5zdGF0dXMgPSBzLT53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEU7Ci0gICAgc3RybS0+YWRsZXIgPQotI2lmZGVmIEdaSVAKLSAgICAgICAgcy0+d3JhcCA9PSAyID8gY3JjMzIoMEwsIFpfTlVMTCwgMCkgOgotI2VuZGlmCi0gICAgICAgIGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7Ci0gICAgcy0+bGFzdF9mbHVzaCA9IFpfTk9fRkxVU0g7Ci0KLSAgICBfdHJfaW5pdChzKTsKLSAgICBsbV9pbml0KHMpOwotCi0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVTZXRIZWFkZXIgKHN0cm0sIGhlYWQpCi0gICAgel9zdHJlYW1wIHN0cm07Ci0gICAgZ3pfaGVhZGVycCBoZWFkOwotewotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBpZiAoc3RybS0+c3RhdGUtPndyYXAgIT0gMikgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0cm0tPnN0YXRlLT5nemhlYWQgPSBoZWFkOwotICAgIHJldHVybiBaX09LOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlUHJpbWUgKHN0cm0sIGJpdHMsIHZhbHVlKQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIGludCBiaXRzOwotICAgIGludCB2YWx1ZTsKLXsKLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RybS0+c3RhdGUtPmJpX3ZhbGlkID0gYml0czsKLSAgICBzdHJtLT5zdGF0ZS0+YmlfYnVmID0gKHVzaCkodmFsdWUgJiAoKDEgPDwgYml0cykgLSAxKSk7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVQYXJhbXMoc3RybSwgbGV2ZWwsIHN0cmF0ZWd5KQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIGludCBsZXZlbDsKLSAgICBpbnQgc3RyYXRlZ3k7Ci17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBjb21wcmVzc19mdW5jIGZ1bmM7Ci0gICAgaW50IGVyciA9IFpfT0s7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgcyA9IHN0cm0tPnN0YXRlOwotCi0jaWZkZWYgRkFTVEVTVAotICAgIGlmIChsZXZlbCAhPSAwKSBsZXZlbCA9IDE7Ci0jZWxzZQotICAgIGlmIChsZXZlbCA9PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIGxldmVsID0gNjsKLSNlbmRpZgotICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8IHN0cmF0ZWd5IDwgMCB8fCBzdHJhdGVneSA+IFpfRklYRUQpIHsKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIH0KLSAgICBmdW5jID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYzsKLQotICAgIGlmIChmdW5jICE9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmZ1bmMgJiYgc3RybS0+dG90YWxfaW4gIT0gMCkgewotICAgICAgICAvKiBGbHVzaCB0aGUgbGFzdCBidWZmZXI6ICovCi0gICAgICAgIGVyciA9IGRlZmxhdGUoc3RybSwgWl9QQVJUSUFMX0ZMVVNIKTsKLSAgICB9Ci0gICAgaWYgKHMtPmxldmVsICE9IGxldmVsKSB7Ci0gICAgICAgIHMtPmxldmVsID0gbGV2ZWw7Ci0gICAgICAgIHMtPm1heF9sYXp5X21hdGNoICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfbGF6eTsKLSAgICAgICAgcy0+Z29vZF9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmdvb2RfbGVuZ3RoOwotICAgICAgICBzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0ubmljZV9sZW5ndGg7Ci0gICAgICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfY2hhaW47Ci0gICAgfQotICAgIHMtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZVR1bmUoc3RybSwgZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluKQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIGludCBnb29kX2xlbmd0aDsKLSAgICBpbnQgbWF4X2xhenk7Ci0gICAgaW50IG5pY2VfbGVuZ3RoOwotICAgIGludCBtYXhfY2hhaW47Ci17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzID0gc3RybS0+c3RhdGU7Ci0gICAgcy0+Z29vZF9tYXRjaCA9IGdvb2RfbGVuZ3RoOwotICAgIHMtPm1heF9sYXp5X21hdGNoID0gbWF4X2xhenk7Ci0gICAgcy0+bmljZV9tYXRjaCA9IG5pY2VfbGVuZ3RoOwotICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBtYXhfY2hhaW47Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZvciB0aGUgZGVmYXVsdCB3aW5kb3dCaXRzIG9mIDE1IGFuZCBtZW1MZXZlbCBvZiA4LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAqIGEgY2xvc2UgdG8gZXhhY3QsIGFzIHdlbGwgYXMgc21hbGwsIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUuCi0gKiBUaGV5IGFyZSBjb2RlZCBhcyBjb25zdGFudHMgaGVyZSBmb3IgYSByZWFzb24tLWlmIHRoZSAjZGVmaW5lJ3MgYXJlCi0gKiBjaGFuZ2VkLCB0aGVuIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2hhbmdlZCBhcyB3ZWxsLiAgVGhlIHJldHVybgotICogdmFsdWUgZm9yIDE1IGFuZCA4IG9ubHkgd29ya3MgZm9yIHRob3NlIGV4YWN0IHNldHRpbmdzLgotICoKLSAqIEZvciBhbnkgc2V0dGluZyBvdGhlciB0aGFuIHRob3NlIGRlZmF1bHRzIGZvciB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbCwKLSAqIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhIGNvbnNlcnZhdGl2ZSB3b3JzdCBjYXNlIGZvciB0aGUgbWF4aW11bSBleHBhbnNpb24KLSAqIHJlc3VsdGluZyBmcm9tIHVzaW5nIGZpeGVkIGJsb2NrcyBpbnN0ZWFkIG9mIHN0b3JlZCBibG9ja3MsIHdoaWNoIGRlZmxhdGUKLSAqIGNhbiBlbWl0IG9uIGNvbXByZXNzZWQgZGF0YSBmb3Igc29tZSBjb21iaW5hdGlvbnMgb2YgdGhlIHBhcmFtZXRlcnMuCi0gKgotICogVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3JlIHNvcGhpc3RpY2F0ZWQgdG8gcHJvdmlkZSBjbG9zZXIgdXBwZXIgYm91bmRzCi0gKiBmb3IgZXZlcnkgY29tYmluYXRpb24gb2Ygd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwsIGFzIHdlbGwgYXMgd3JhcC4KLSAqIEJ1dCBldmVuIHRoZSBjb25zZXJ2YXRpdmUgdXBwZXIgYm91bmQgb2YgYWJvdXQgMTQlIGV4cGFuc2lvbiBkb2VzIG5vdAotICogc2VlbSBvbmVyb3VzIGZvciBvdXRwdXQgYnVmZmVyIGFsbG9jYXRpb24uCi0gKi8KLXVMb25nIFpFWFBPUlQgZGVmbGF0ZUJvdW5kKHN0cm0sIHNvdXJjZUxlbikKLSAgICB6X3N0cmVhbXAgc3RybTsKLSAgICB1TG9uZyBzb3VyY2VMZW47Ci17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICB1TG9uZyBkZXN0TGVuOwotCi0gICAgLyogY29uc2VydmF0aXZlIHVwcGVyIGJvdW5kICovCi0gICAgZGVzdExlbiA9IHNvdXJjZUxlbiArCi0gICAgICAgICAgICAgICgoc291cmNlTGVuICsgNykgPj4gMykgKyAoKHNvdXJjZUxlbiArIDYzKSA+PiA2KSArIDExOwotCi0gICAgLyogaWYgY2FuJ3QgZ2V0IHBhcmFtZXRlcnMsIHJldHVybiBjb25zZXJ2YXRpdmUgYm91bmQgKi8KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKQotICAgICAgICByZXR1cm4gZGVzdExlbjsKLQotICAgIC8qIGlmIG5vdCBkZWZhdWx0IHBhcmFtZXRlcnMsIHJldHVybiBjb25zZXJ2YXRpdmUgYm91bmQgKi8KLSAgICBzID0gc3RybS0+c3RhdGU7Ci0gICAgaWYgKHMtPndfYml0cyAhPSAxNSB8fCBzLT5oYXNoX2JpdHMgIT0gOCArIDcpCi0gICAgICAgIHJldHVybiBkZXN0TGVuOwotCi0gICAgLyogZGVmYXVsdCBzZXR0aW5nczogcmV0dXJuIHRpZ2h0IGJvdW5kIGZvciB0aGF0IGNhc2UgKi8KLSAgICByZXR1cm4gY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci4KLSAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbgotICogcGVuZGluZ19idWYuCi0gKi8KLWxvY2FsIHZvaWQgcHV0U2hvcnRNU0IgKHMsIGIpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICB1SW50IGI7Ci17Ci0gICAgcHV0X2J5dGUocywgKEJ5dGUpKGIgPj4gOCkpOwotICAgIHB1dF9ieXRlKHMsIChCeXRlKShiICYgMHhmZikpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzCi0gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0Ci0gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9vdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuCi0gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuCi0gKi8KLWxvY2FsIHZvaWQgZmx1c2hfcGVuZGluZyhzdHJtKQotICAgIHpfc3RyZWFtcCBzdHJtOwotewotICAgIHVuc2lnbmVkIGxlbiA9IHN0cm0tPnN0YXRlLT5wZW5kaW5nOwotCi0gICAgaWYgKGxlbiA+IHN0cm0tPmF2YWlsX291dCkgbGVuID0gc3RybS0+YXZhaWxfb3V0OwotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOwotCi0gICAgem1lbWNweShzdHJtLT5uZXh0X291dCwgc3RybS0+c3RhdGUtPnBlbmRpbmdfb3V0LCBsZW4pOwotICAgIHN0cm0tPm5leHRfb3V0ICArPSBsZW47Ci0gICAgc3RybS0+c3RhdGUtPnBlbmRpbmdfb3V0ICArPSBsZW47Ci0gICAgc3RybS0+dG90YWxfb3V0ICs9IGxlbjsKLSAgICBzdHJtLT5hdmFpbF9vdXQgIC09IGxlbjsKLSAgICBzdHJtLT5zdGF0ZS0+cGVuZGluZyAtPSBsZW47Ci0gICAgaWYgKHN0cm0tPnN0YXRlLT5wZW5kaW5nID09IDApIHsKLSAgICAgICAgc3RybS0+c3RhdGUtPnBlbmRpbmdfb3V0ID0gc3RybS0+c3RhdGUtPnBlbmRpbmdfYnVmOwotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZSAoc3RybSwgZmx1c2gpCi0gICAgel9zdHJlYW1wIHN0cm07Ci0gICAgaW50IGZsdXNoOwotewotICAgIGludCBvbGRfZmx1c2g7IC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi8KLSAgICBkZWZsYXRlX3N0YXRlICpzOwotCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAotICAgICAgICBmbHVzaCA+IFpfRklOSVNIIHx8IGZsdXNoIDwgMCkgewotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgfQotICAgIHMgPSBzdHJtLT5zdGF0ZTsKLQotICAgIGlmIChzdHJtLT5uZXh0X291dCA9PSBaX05VTEwgfHwKLSAgICAgICAgKHN0cm0tPm5leHRfaW4gPT0gWl9OVUxMICYmIHN0cm0tPmF2YWlsX2luICE9IDApIHx8Ci0gICAgICAgIChzLT5zdGF0dXMgPT0gRklOSVNIX1NUQVRFICYmIGZsdXNoICE9IFpfRklOSVNIKSkgewotICAgICAgICBFUlJfUkVUVVJOKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTsKLSAgICB9Ci0gICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSBFUlJfUkVUVVJOKHN0cm0sIFpfQlVGX0VSUk9SKTsKLQotICAgIHMtPnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi8KLSAgICBvbGRfZmx1c2ggPSBzLT5sYXN0X2ZsdXNoOwotICAgIHMtPmxhc3RfZmx1c2ggPSBmbHVzaDsKLQotICAgIC8qIFdyaXRlIHRoZSBoZWFkZXIgKi8KLSAgICBpZiAocy0+c3RhdHVzID09IElOSVRfU1RBVEUpIHsKLSNpZmRlZiBHWklQCi0gICAgICAgIGlmIChzLT53cmFwID09IDIpIHsKLSAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7Ci0gICAgICAgICAgICBwdXRfYnl0ZShzLCAzMSk7Ci0gICAgICAgICAgICBwdXRfYnl0ZShzLCAxMzkpOwotICAgICAgICAgICAgcHV0X2J5dGUocywgOCk7Ci0gICAgICAgICAgICBpZiAocy0+Z3poZWFkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5sZXZlbCA9PSA5ID8gMiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMtPmxldmVsIDwgMiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7Ci0gICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChzLT5nemhlYWQtPnRleHQgPyAxIDogMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmhjcmMgPyAyIDogMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmV4dHJhID09IFpfTlVMTCA/IDAgOiA0KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmd6aGVhZC0+bmFtZSA9PSBaX05VTEwgPyAwIDogOCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmNvbW1lbnQgPT0gWl9OVUxMID8gMCA6IDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkocy0+Z3poZWFkLT50aW1lICYgMHhmZikpOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgocy0+Z3poZWFkLT50aW1lID4+IDgpICYgMHhmZikpOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgocy0+Z3poZWFkLT50aW1lID4+IDE2KSAmIDB4ZmYpKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHMtPmd6aGVhZC0+dGltZSA+PiAyNCkgJiAweGZmKSk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+bGV2ZWwgPT0gOSA/IDIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLT5sZXZlbCA8IDIgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IDogMCkpOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmd6aGVhZC0+b3MgJiAweGZmKTsKLSAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmd6aGVhZC0+ZXh0cmFfbGVuICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChzLT5nemhlYWQtPmV4dHJhX2xlbiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjKQotICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nKTsKLSAgICAgICAgICAgICAgICBzLT5nemluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBFWFRSQV9TVEFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgewotICAgICAgICAgICAgdUludCBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy0+d19iaXRzLTgpPDw0KSkgPDwgODsKLSAgICAgICAgICAgIHVJbnQgbGV2ZWxfZmxhZ3M7Ci0KLSAgICAgICAgICAgIGlmIChzLT5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLT5sZXZlbCA8IDIpCi0gICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAocy0+bGV2ZWwgPCA2KQotICAgICAgICAgICAgICAgIGxldmVsX2ZsYWdzID0gMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHMtPmxldmVsID09IDYpCi0gICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAyOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxldmVsX2ZsYWdzID0gMzsKLSAgICAgICAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7Ci0gICAgICAgICAgICBpZiAocy0+c3Ryc3RhcnQgIT0gMCkgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOwotICAgICAgICAgICAgaGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTsKLQotICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKLSAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqLwotICAgICAgICAgICAgaWYgKHMtPnN0cnN0YXJ0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgPj4gMTYpKTsKLSAgICAgICAgICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgJiAweGZmZmYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgfQotICAgIH0KLSNpZmRlZiBHWklQCi0gICAgaWYgKHMtPnN0YXR1cyA9PSBFWFRSQV9TVEFURSkgewotICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB1SW50IGJlZyA9IHMtPnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovCi0KLSAgICAgICAgICAgIHdoaWxlIChzLT5nemluZGV4IDwgKHMtPmd6aGVhZC0+ZXh0cmFfbGVuICYgMHhmZmZmKSkgewotICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOwotICAgICAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwotICAgICAgICAgICAgICAgICAgICBiZWcgPSBzLT5wZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmd6aGVhZC0+ZXh0cmFbcy0+Z3ppbmRleF0pOwotICAgICAgICAgICAgICAgIHMtPmd6aW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKLSAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOwotICAgICAgICAgICAgaWYgKHMtPmd6aW5kZXggPT0gcy0+Z3poZWFkLT5leHRyYV9sZW4pIHsKLSAgICAgICAgICAgICAgICBzLT5nemluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBOQU1FX1NUQVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHMtPnN0YXR1cyA9IE5BTUVfU1RBVEU7Ci0gICAgfQotICAgIGlmIChzLT5zdGF0dXMgPT0gTkFNRV9TVEFURSkgewotICAgICAgICBpZiAocy0+Z3poZWFkLT5uYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVJbnQgYmVnID0gcy0+cGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi8KLSAgICAgICAgICAgIGludCB2YWw7Ci0KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKLSAgICAgICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKLSAgICAgICAgICAgICAgICAgICAgYmVnID0gcy0+cGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbCA9IHMtPmd6aGVhZC0+bmFtZVtzLT5nemluZGV4KytdOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7Ci0gICAgICAgICAgICB9IHdoaWxlICh2YWwgIT0gMCk7Ci0gICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCi0gICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKLSAgICAgICAgICAgIGlmICh2YWwgPT0gMCkgewotICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOwotICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcy0+c3RhdHVzID0gQ09NTUVOVF9TVEFURTsKLSAgICB9Ci0gICAgaWYgKHMtPnN0YXR1cyA9PSBDT01NRU5UX1NUQVRFKSB7Ci0gICAgICAgIGlmIChzLT5nemhlYWQtPmNvbW1lbnQgIT0gTlVMTCkgewotICAgICAgICAgICAgdUludCBiZWcgPSBzLT5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLwotICAgICAgICAgICAgaW50IHZhbDsKLQotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOwotICAgICAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwotICAgICAgICAgICAgICAgICAgICBiZWcgPSBzLT5wZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsID0gcy0+Z3poZWFkLT5jb21tZW50W3MtPmd6aW5kZXgrK107Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgdmFsKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKHZhbCAhPSAwKTsKLSAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKLSAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOwotICAgICAgICAgICAgaWYgKHZhbCA9PSAwKQotICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEhDUkNfU1RBVEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcy0+c3RhdHVzID0gSENSQ19TVEFURTsKLSAgICB9Ci0gICAgaWYgKHMtPnN0YXR1cyA9PSBIQ1JDX1NUQVRFKSB7Ci0gICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMpIHsKLSAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nICsgMiA+IHMtPnBlbmRpbmdfYnVmX3NpemUpCi0gICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKLSAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nICsgMiA8PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKHN0cm0tPmFkbGVyICYgMHhmZikpOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gOCkgJiAweGZmKSk7Ci0gICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBCVVNZX1NUQVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHMtPnN0YXR1cyA9IEJVU1lfU1RBVEU7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovCi0gICAgaWYgKHMtPnBlbmRpbmcgIT0gMCkgewotICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwotICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKLSAgICAgICAgICAgIC8qIFNpbmNlIGF2YWlsX291dCBpcyAwLCBkZWZsYXRlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGgKLSAgICAgICAgICAgICAqIG1vcmUgb3V0cHV0IHNwYWNlLCBidXQgcG9zc2libHkgd2l0aCBib3RoIHBlbmRpbmcgYW5kCi0gICAgICAgICAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbywKLSAgICAgICAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvciBzaXR1YXRpb24gc28gbWFrZSBzdXJlIHdlCi0gICAgICAgICAgICAgKiByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgYXQgbmV4dCBjYWxsIG9mIGRlZmxhdGU6Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsKLSAgICAgICAgICAgIHJldHVybiBaX09LOwotICAgICAgICB9Ci0KLSAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmUKLSAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcAotICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi4KLSAgICAgKi8KLSAgICB9IGVsc2UgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgZmx1c2ggPD0gb2xkX2ZsdXNoICYmCi0gICAgICAgICAgICAgICBmbHVzaCAhPSBaX0ZJTklTSCkgewotICAgICAgICBFUlJfUkVUVVJOKHN0cm0sIFpfQlVGX0VSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqLwotICAgIGlmIChzLT5zdGF0dXMgPT0gRklOSVNIX1NUQVRFICYmIHN0cm0tPmF2YWlsX2luICE9IDApIHsKLSAgICAgICAgRVJSX1JFVFVSTihzdHJtLCBaX0JVRl9FUlJPUik7Ci0gICAgfQotCi0gICAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLgotICAgICAqLwotICAgIGlmIChzdHJtLT5hdmFpbF9pbiAhPSAwIHx8IHMtPmxvb2thaGVhZCAhPSAwIHx8Ci0gICAgICAgIChmbHVzaCAhPSBaX05PX0ZMVVNIICYmIHMtPnN0YXR1cyAhPSBGSU5JU0hfU1RBVEUpKSB7Ci0gICAgICAgIGJsb2NrX3N0YXRlIGJzdGF0ZTsKLQotICAgICAgICBic3RhdGUgPSAoKihjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5mdW5jKSkocywgZmx1c2gpOwotCi0gICAgICAgIGlmIChic3RhdGUgPT0gZmluaXNoX3N0YXJ0ZWQgfHwgYnN0YXRlID09IGZpbmlzaF9kb25lKSB7Ci0gICAgICAgICAgICBzLT5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJzdGF0ZSA9PSBuZWVkX21vcmUgfHwgYnN0YXRlID09IGZpbmlzaF9zdGFydGVkKSB7Ci0gICAgICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKLSAgICAgICAgICAgICAgICBzLT5sYXN0X2ZsdXNoID0gLTE7IC8qIGF2b2lkIEJVRl9FUlJPUiBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFpfT0s7Ci0gICAgICAgICAgICAvKiBJZiBmbHVzaCAhPSBaX05PX0ZMVVNIICYmIGF2YWlsX291dCA9PSAwLCB0aGUgbmV4dCBjYWxsCi0gICAgICAgICAgICAgKiBvZiBkZWZsYXRlIHNob3VsZCB1c2UgdGhlIHNhbWUgZmx1c2ggcGFyYW1ldGVyIHRvIG1ha2Ugc3VyZQotICAgICAgICAgICAgICogdGhhdCB0aGUgZmx1c2ggaXMgY29tcGxldGUuIFNvIHdlIGRvbid0IGhhdmUgdG8gb3V0cHV0IGFuCi0gICAgICAgICAgICAgKiBlbXB0eSBibG9jayBoZXJlLCB0aGlzIHdpbGwgYmUgZG9uZSBhdCBuZXh0IGNhbGwuIFRoaXMgYWxzbwotICAgICAgICAgICAgICogZW5zdXJlcyB0aGF0IGZvciBhIHZlcnkgc21hbGwgb3V0cHV0IGJ1ZmZlciwgd2UgZW1pdCBhdCBtb3N0Ci0gICAgICAgICAgICAgKiBvbmUgZW1wdHkgYmxvY2suCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgfQotICAgICAgICBpZiAoYnN0YXRlID09IGJsb2NrX2RvbmUpIHsKLSAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX1BBUlRJQUxfRkxVU0gpIHsKLSAgICAgICAgICAgICAgICBfdHJfYWxpZ24ocyk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi8KLSAgICAgICAgICAgICAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIChjaGFyKikwLCAwTCwgMCk7Ci0gICAgICAgICAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWQKLSAgICAgICAgICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX0ZVTExfRkxVU0gpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xFQVJfSEFTSChzKTsgICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwotICAgICAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7Ci0gICAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovCi0gICAgICAgICAgICAgIHJldHVybiBaX09LOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEFzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCAiYnVnMiIpOwotCi0gICAgaWYgKGZsdXNoICE9IFpfRklOSVNIKSByZXR1cm4gWl9PSzsKLSAgICBpZiAocy0+d3JhcCA8PSAwKSByZXR1cm4gWl9TVFJFQU1fRU5EOwotCi0gICAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi8KLSNpZmRlZiBHWklQCi0gICAgaWYgKHMtPndyYXAgPT0gMikgewotICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoc3RybS0+YWRsZXIgJiAweGZmKSk7Ci0gICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gOCkgJiAweGZmKSk7Ci0gICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gMTYpICYgMHhmZikpOwotICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPmFkbGVyID4+IDI0KSAmIDB4ZmYpKTsKLSAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKHN0cm0tPnRvdGFsX2luICYgMHhmZikpOwotICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPnRvdGFsX2luID4+IDgpICYgMHhmZikpOwotICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpKTsKLSAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT50b3RhbF9pbiA+PiAyNCkgJiAweGZmKSk7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyID4+IDE2KSk7Ci0gICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciAmIDB4ZmZmZikpOwotICAgIH0KLSAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwotICAgIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW4KLSAgICAgKiB0byBmbHVzaCB0aGUgcmVzdC4KLSAgICAgKi8KLSAgICBpZiAocy0+d3JhcCA+IDApIHMtPndyYXAgPSAtcy0+d3JhcDsgLyogd3JpdGUgdGhlIHRyYWlsZXIgb25seSBvbmNlISAqLwotICAgIHJldHVybiBzLT5wZW5kaW5nICE9IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlRW5kIChzdHJtKQotICAgIHpfc3RyZWFtcCBzdHJtOwotewotICAgIGludCBzdGF0dXM7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICBzdGF0dXMgPSBzdHJtLT5zdGF0ZS0+c3RhdHVzOwotICAgIGlmIChzdGF0dXMgIT0gSU5JVF9TVEFURSAmJgotICAgICAgICBzdGF0dXMgIT0gRVhUUkFfU1RBVEUgJiYKLSAgICAgICAgc3RhdHVzICE9IE5BTUVfU1RBVEUgJiYKLSAgICAgICAgc3RhdHVzICE9IENPTU1FTlRfU1RBVEUgJiYKLSAgICAgICAgc3RhdHVzICE9IEhDUkNfU1RBVEUgJiYKLSAgICAgICAgc3RhdHVzICE9IEJVU1lfU1RBVEUgJiYKLSAgICAgICAgc3RhdHVzICE9IEZJTklTSF9TVEFURSkgewotICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIH0KLQotICAgIC8qIERlYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9uczogKi8KLSAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+cGVuZGluZ19idWYpOwotICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5oZWFkKTsKLSAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+cHJldik7Ci0gICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPndpbmRvdyk7Ci0KLSAgICBaRlJFRShzdHJtLCBzdHJtLT5zdGF0ZSk7Ci0gICAgc3RybS0+c3RhdGUgPSBaX05VTEw7Ci0KLSAgICByZXR1cm4gc3RhdHVzID09IEJVU1lfU1RBVEUgPyBaX0RBVEFfRVJST1IgOiBaX09LOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5IHRoZSBzb3VyY2Ugc3RhdGUgdG8gdGhlIGRlc3RpbmF0aW9uIHN0YXRlLgotICogVG8gc2ltcGxpZnkgdGhlIHNvdXJjZSwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkIGZvciAxNi1iaXQgTVNET1MgKHdoaWNoCi0gKiBkb2Vzbid0IGhhdmUgZW5vdWdoIG1lbW9yeSBhbnl3YXkgdG8gZHVwbGljYXRlIGNvbXByZXNzaW9uIHN0YXRlcykuCi0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVDb3B5IChkZXN0LCBzb3VyY2UpCi0gICAgel9zdHJlYW1wIGRlc3Q7Ci0gICAgel9zdHJlYW1wIHNvdXJjZTsKLXsKLSNpZmRlZiBNQVhTRUdfNjRLCi0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotI2Vsc2UKLSAgICBkZWZsYXRlX3N0YXRlICpkczsKLSAgICBkZWZsYXRlX3N0YXRlICpzczsKLSAgICB1c2hmICpvdmVybGF5OwotCi0KLSAgICBpZiAoc291cmNlID09IFpfTlVMTCB8fCBkZXN0ID09IFpfTlVMTCB8fCBzb3VyY2UtPnN0YXRlID09IFpfTlVMTCkgewotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgfQotCi0gICAgc3MgPSBzb3VyY2UtPnN0YXRlOwotCi0gICAgem1lbWNweShkZXN0LCBzb3VyY2UsIHNpemVvZih6X3N0cmVhbSkpOwotCi0gICAgZHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0MoZGVzdCwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKLSAgICBpZiAoZHMgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKSBkczsKLSAgICB6bWVtY3B5KGRzLCBzcywgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKLSAgICBkcy0+c3RybSA9IGRlc3Q7Ci0KLSAgICBkcy0+d2luZG93ID0gKEJ5dGVmICopIFpBTExPQyhkZXN0LCBkcy0+d19zaXplLCAyKnNpemVvZihCeXRlKSk7Ci0gICAgZHMtPnByZXYgICA9IChQb3NmICopICBaQUxMT0MoZGVzdCwgZHMtPndfc2l6ZSwgc2l6ZW9mKFBvcykpOwotICAgIGRzLT5oZWFkICAgPSAoUG9zZiAqKSAgWkFMTE9DKGRlc3QsIGRzLT5oYXNoX3NpemUsIHNpemVvZihQb3MpKTsKLSAgICBvdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKGRlc3QsIGRzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7Ci0gICAgZHMtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTsKLQotICAgIGlmIChkcy0+d2luZG93ID09IFpfTlVMTCB8fCBkcy0+cHJldiA9PSBaX05VTEwgfHwgZHMtPmhlYWQgPT0gWl9OVUxMIHx8Ci0gICAgICAgIGRzLT5wZW5kaW5nX2J1ZiA9PSBaX05VTEwpIHsKLSAgICAgICAgZGVmbGF0ZUVuZCAoZGVzdCk7Ci0gICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICB9Ci0gICAgLyogZm9sbG93aW5nIHptZW1jcHkgZG8gbm90IHdvcmsgZm9yIDE2LWJpdCBNU0RPUyAqLwotICAgIHptZW1jcHkoZHMtPndpbmRvdywgc3MtPndpbmRvdywgZHMtPndfc2l6ZSAqIDIgKiBzaXplb2YoQnl0ZSkpOwotICAgIHptZW1jcHkoZHMtPnByZXYsIHNzLT5wcmV2LCBkcy0+d19zaXplICogc2l6ZW9mKFBvcykpOwotICAgIHptZW1jcHkoZHMtPmhlYWQsIHNzLT5oZWFkLCBkcy0+aGFzaF9zaXplICogc2l6ZW9mKFBvcykpOwotICAgIHptZW1jcHkoZHMtPnBlbmRpbmdfYnVmLCBzcy0+cGVuZGluZ19idWYsICh1SW50KWRzLT5wZW5kaW5nX2J1Zl9zaXplKTsKLQotICAgIGRzLT5wZW5kaW5nX291dCA9IGRzLT5wZW5kaW5nX2J1ZiArIChzcy0+cGVuZGluZ19vdXQgLSBzcy0+cGVuZGluZ19idWYpOwotICAgIGRzLT5kX2J1ZiA9IG92ZXJsYXkgKyBkcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7Ci0gICAgZHMtPmxfYnVmID0gZHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKmRzLT5saXRfYnVmc2l6ZTsKLQotICAgIGRzLT5sX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2x0cmVlOwotICAgIGRzLT5kX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2R0cmVlOwotICAgIGRzLT5ibF9kZXNjLmR5bl90cmVlID0gZHMtPmJsX3RyZWU7Ci0KLSAgICByZXR1cm4gWl9PSzsKLSNlbmRpZiAvKiBNQVhTRUdfNjRLICovCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMgotICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2gKLSAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkCi0gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9pbiBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC4KLSAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLgotICovCi1sb2NhbCBpbnQgcmVhZF9idWYoc3RybSwgYnVmLCBzaXplKQotICAgIHpfc3RyZWFtcCBzdHJtOwotICAgIEJ5dGVmICpidWY7Ci0gICAgdW5zaWduZWQgc2l6ZTsKLXsKLSAgICB1bnNpZ25lZCBsZW4gPSBzdHJtLT5hdmFpbF9pbjsKLQotICAgIGlmIChsZW4gPiBzaXplKSBsZW4gPSBzaXplOwotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIDA7Ci0KLSAgICBzdHJtLT5hdmFpbF9pbiAgLT0gbGVuOwotCi0gICAgaWYgKHN0cm0tPnN0YXRlLT53cmFwID09IDEpIHsKLSAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKHN0cm0tPmFkbGVyLCBzdHJtLT5uZXh0X2luLCBsZW4pOwotICAgIH0KLSNpZmRlZiBHWklQCi0gICAgZWxzZSBpZiAoc3RybS0+c3RhdGUtPndyYXAgPT0gMikgewotICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzdHJtLT5uZXh0X2luLCBsZW4pOwotICAgIH0KLSNlbmRpZgotICAgIHptZW1jcHkoYnVmLCBzdHJtLT5uZXh0X2luLCBsZW4pOwotICAgIHN0cm0tPm5leHRfaW4gICs9IGxlbjsKLSAgICBzdHJtLT50b3RhbF9pbiArPSBsZW47Ci0KLSAgICByZXR1cm4gKGludClsZW47Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogSW5pdGlhbGl6ZSB0aGUgImxvbmdlc3QgbWF0Y2giIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbQotICovCi1sb2NhbCB2b2lkIGxtX2luaXQgKHMpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLXsKLSAgICBzLT53aW5kb3dfc2l6ZSA9ICh1bGcpMkwqcy0+d19zaXplOwotCi0gICAgQ0xFQVJfSEFTSChzKTsKLQotICAgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6Ci0gICAgICovCi0gICAgcy0+bWF4X2xhenlfbWF0Y2ggICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm1heF9sYXp5OwotICAgIHMtPmdvb2RfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5nb29kX2xlbmd0aDsKLSAgICBzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0ubmljZV9sZW5ndGg7Ci0gICAgcy0+bWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm1heF9jaGFpbjsKLQotICAgIHMtPnN0cnN0YXJ0ID0gMDsKLSAgICBzLT5ibG9ja19zdGFydCA9IDBMOwotICAgIHMtPmxvb2thaGVhZCA9IDA7Ci0gICAgcy0+bWF0Y2hfbGVuZ3RoID0gcy0+cHJldl9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKLSAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAwOwotICAgIHMtPmluc19oID0gMDsKLSNpZm5kZWYgRkFTVEVTVAotI2lmZGVmIEFTTVYKLSAgICBtYXRjaF9pbml0KCk7IC8qIGluaXRpYWxpemUgdGhlIGFzbSBjb2RlICovCi0jZW5kaWYKLSNlbmRpZgotfQotCi0jaWZuZGVmIEZBU1RFU1QKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2V0IG1hdGNoX3N0YXJ0IHRvIHRoZSBsb25nZXN0IG1hdGNoIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdHJpbmcgYW5kCi0gKiByZXR1cm4gaXRzIGxlbmd0aC4gTWF0Y2hlcyBzaG9ydGVyIG9yIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFyZSBkaXNjYXJkZWQsCi0gKiBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gcHJldl9sZW5ndGggYW5kIG1hdGNoX3N0YXJ0IGlzCi0gKiBnYXJiYWdlLgotICogSU4gYXNzZXJ0aW9uczogY3VyX21hdGNoIGlzIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluIGZvciB0aGUgY3VycmVudAotICogICBzdHJpbmcgKHN0cnN0YXJ0KSBhbmQgaXRzIGRpc3RhbmNlIGlzIDw9IE1BWF9ESVNULCBhbmQgcHJldl9sZW5ndGggPj0gMQotICogT1VUIGFzc2VydGlvbjogdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QgZ3JlYXRlciB0aGFuIHMtPmxvb2thaGVhZC4KLSAqLwotI2lmbmRlZiBBU01WCi0vKiBGb3IgODB4ODYgYW5kIDY4MHgwLCBhbiBvcHRpbWl6ZWQgdmVyc2lvbiB3aWxsIGJlIHByb3ZpZGVkIGluIG1hdGNoLmFzbSBvcgotICogbWF0Y2guUy4gVGhlIGNvZGUgd2lsbCBiZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudC4KLSAqLwotbG9jYWwgdUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLwotewotICAgIHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7LyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovCi0gICAgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi8KLSAgICByZWdpc3RlciBCeXRlZiAqbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqLwotICAgIHJlZ2lzdGVyIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi8KLSAgICBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqLwotICAgIGludCBuaWNlX21hdGNoID0gcy0+bmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqLwotICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8KLSAgICAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsKLSAgICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLAotICAgICAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuCi0gICAgICovCi0gICAgUG9zZiAqcHJldiA9IHMtPnByZXY7Ci0gICAgdUludCB3bWFzayA9IHMtPndfbWFzazsKLQotI2lmZGVmIFVOQUxJR05FRF9PSwotICAgIC8qIENvbXBhcmUgdHdvIGJ5dGVzIGF0IGEgdGltZS4gTm90ZTogdGhpcyBpcyBub3QgYWx3YXlzIGJlbmVmaWNpYWwuCi0gICAgICogVHJ5IHdpdGggYW5kIHdpdGhvdXQgLURVTkFMSUdORURfT0sgdG8gY2hlY2suCi0gICAgICovCi0gICAgcmVnaXN0ZXIgQnl0ZWYgKnN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIIC0gMTsKLSAgICByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsKLSAgICByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7Ci0jZWxzZQotICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKLSAgICByZWdpc3RlciBCeXRlIHNjYW5fZW5kMSAgPSBzY2FuW2Jlc3RfbGVuLTFdOwotICAgIHJlZ2lzdGVyIEJ5dGUgc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOwotI2VuZGlmCi0KLSAgICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi4KLSAgICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5LgotICAgICAqLwotICAgIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCAiQ29kZSB0b28gY2xldmVyIik7Ci0KLSAgICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqLwotICAgIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7Ci0gICAgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKLSAgICB9Ci0gICAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeQotICAgICAqIHRvIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljLgotICAgICAqLwotICAgIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOwotCi0gICAgQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgIm5lZWQgbG9va2FoZWFkIik7Ci0KLSAgICBkbyB7Ci0gICAgICAgIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgIm5vIGZ1dHVyZSIpOwotICAgICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKLQotICAgICAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2UKLSAgICAgICAgICogb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMi4gIE5vdGUgdGhhdCB0aGUgY2hlY2tzIGJlbG93Ci0gICAgICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZQotICAgICAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZAotICAgICAgICAgKiBjb25kaXRpb25hbCBqdW1wcyB3aWxsIGJlIG1hZGUgdGhhdCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzLgotICAgICAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc28KLSAgICAgICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuCi0gICAgICAgICAqLwotI2lmIChkZWZpbmVkKFVOQUxJR05FRF9PSykgJiYgTUFYX01BVENIID09IDI1OCkKLSAgICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSA9PSAyLiBEbyBub3QgdXNlCi0gICAgICAgICAqIFVOQUxJR05FRF9PSyBpZiB5b3VyIGNvbXBpbGVyIHVzZXMgYSBkaWZmZXJlbnQgc2l6ZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAotICAgICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKLQotICAgICAgICAvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleSBhcmUKLSAgICAgICAgICogYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0IHRoZSBoYXNoIGtleXMKLSAgICAgICAgICogYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LiBDb21wYXJlIDIgYnl0ZXMgYXQgYSB0aW1lIGF0Ci0gICAgICAgICAqIHN0cnN0YXJ0KzMsICs1LCAuLi4gdXAgdG8gc3Ryc3RhcnQrMjU3LiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50Ci0gICAgICAgICAqIGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDR0aCBjb21wYXJpc29uOyB0aGUgMTI4dGggY2hlY2sgd2lsbCBiZSBtYWRlCi0gICAgICAgICAqIGF0IHN0cnN0YXJ0KzI1Ny4gSWYgTUFYX01BVENILTIgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCwgaXQgaXMKLSAgICAgICAgICogbmVjZXNzYXJ5IHRvIHB1dCBtb3JlIGd1YXJkIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdywgb3IKLSAgICAgICAgICogdG8gY2hlY2sgbW9yZSBvZnRlbiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZC4KLSAgICAgICAgICovCi0gICAgICAgIEFzc2VydChzY2FuWzJdID09IG1hdGNoWzJdLCAic2NhblsyXT8iKTsKLSAgICAgICAgc2NhbisrLCBtYXRjaCsrOwotICAgICAgICBkbyB7Ci0gICAgICAgIH0gd2hpbGUgKCoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgotICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKLSAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCi0gICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgotICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKLSAgICAgICAgLyogVGhlIGZ1bm55ICJkbyB7fSIgZ2VuZXJhdGVzIGJldHRlciBjb2RlIG9uIG1vc3QgY29tcGlsZXJzICovCi0KLSAgICAgICAgLyogSGVyZSwgc2NhbiA8PSB3aW5kb3crc3Ryc3RhcnQrMjU3ICovCi0gICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7Ci0gICAgICAgIGlmICgqc2NhbiA9PSAqbWF0Y2gpIHNjYW4rKzsKLQotICAgICAgICBsZW4gPSAoTUFYX01BVENIIC0gMSkgLSAoaW50KShzdHJlbmQtc2Nhbik7Ci0gICAgICAgIHNjYW4gPSBzdHJlbmQgLSAoTUFYX01BVENILTEpOwotCi0jZWxzZSAvKiBVTkFMSUdORURfT0sgKi8KLQotICAgICAgICBpZiAobWF0Y2hbYmVzdF9sZW5dICAgIT0gc2Nhbl9lbmQgIHx8Ci0gICAgICAgICAgICBtYXRjaFtiZXN0X2xlbi0xXSAhPSBzY2FuX2VuZDEgfHwKLSAgICAgICAgICAgICptYXRjaCAgICAgICAgICAgICE9ICpzY2FuICAgICB8fAotICAgICAgICAgICAgKisrbWF0Y2ggICAgICAgICAgIT0gc2NhblsxXSkgICAgICBjb250aW51ZTsKLQotICAgICAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQotICAgICAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQotICAgICAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQotICAgICAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0Ci0gICAgICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgotICAgICAgICAgKi8KLSAgICAgICAgc2NhbiArPSAyLCBtYXRjaCsrOwotICAgICAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7Ci0KLSAgICAgICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjsKLSAgICAgICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguCi0gICAgICAgICAqLwotICAgICAgICBkbyB7Ci0gICAgICAgIH0gd2hpbGUgKCorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgotICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCi0gICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgotICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKLQotICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOwotCi0gICAgICAgIGxlbiA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOwotICAgICAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIOwotCi0jZW5kaWYgLyogVU5BTElHTkVEX09LICovCi0KLSAgICAgICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7Ci0gICAgICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKLSAgICAgICAgICAgIGJlc3RfbGVuID0gbGVuOwotICAgICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsKLSNpZmRlZiBVTkFMSUdORURfT0sKLSAgICAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsKLSNlbHNlCi0gICAgICAgICAgICBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKLSAgICAgICAgICAgIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0Ci0gICAgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7Ci0KLSAgICBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47Ci0gICAgcmV0dXJuIHMtPmxvb2thaGVhZDsKLX0KLSNlbmRpZiAvKiBBU01WICovCi0jZW5kaWYgLyogRkFTVEVTVCAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE9wdGltaXplZCB2ZXJzaW9uIGZvciBsZXZlbCA9PSAxIG9yIHN0cmF0ZWd5ID09IFpfUkxFIG9ubHkKLSAqLwotbG9jYWwgdUludCBsb25nZXN0X21hdGNoX2Zhc3QocywgY3VyX21hdGNoKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG1hdGNoICovCi17Ci0gICAgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi8KLSAgICByZWdpc3RlciBCeXRlZiAqbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqLwotICAgIHJlZ2lzdGVyIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi8KLSAgICByZWdpc3RlciBCeXRlZiAqc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0g7Ci0KLSAgICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi4KLSAgICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5LgotICAgICAqLwotICAgIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCAiQ29kZSB0b28gY2xldmVyIik7Ci0KLSAgICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFELCAibmVlZCBsb29rYWhlYWQiKTsKLQotICAgIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgIm5vIGZ1dHVyZSIpOwotCi0gICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7Ci0KLSAgICAvKiBSZXR1cm4gZmFpbHVyZSBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyOgotICAgICAqLwotICAgIGlmIChtYXRjaFswXSAhPSBzY2FuWzBdIHx8IG1hdGNoWzFdICE9IHNjYW5bMV0pIHJldHVybiBNSU5fTUFUQ0gtMTsKLQotICAgIC8qIFRoZSBjaGVjayBhdCBiZXN0X2xlbi0xIGNhbiBiZSByZW1vdmVkIGJlY2F1c2UgaXQgd2lsbCBiZSBtYWRlCi0gICAgICogYWdhaW4gbGF0ZXIuIChUaGlzIGhldXJpc3RpYyBpcyBub3QgYWx3YXlzIGEgd2luLikKLSAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQotICAgICAqIGFyZSBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQKLSAgICAgKiB0aGUgaGFzaCBrZXlzIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC4KLSAgICAgKi8KLSAgICBzY2FuICs9IDIsIG1hdGNoICs9IDI7Ci0gICAgQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgIm1hdGNoWzJdPyIpOwotCi0gICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjsKLSAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC4KLSAgICAgKi8KLSAgICBkbyB7Ci0gICAgfSB3aGlsZSAoKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCi0gICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCi0gICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCi0gICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCi0gICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7Ci0KLSAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOwotCi0gICAgbGVuID0gTUFYX01BVENIIC0gKGludCkoc3RyZW5kIC0gc2Nhbik7Ci0KLSAgICBpZiAobGVuIDwgTUlOX01BVENIKSByZXR1cm4gTUlOX01BVENIIC0gMTsKLQotICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOwotICAgIHJldHVybiAodUludClsZW4gPD0gcy0+bG9va2FoZWFkID8gKHVJbnQpbGVuIDogcy0+bG9va2FoZWFkOwotfQotCi0jaWZkZWYgREVCVUcKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ2hlY2sgdGhhdCB0aGUgbWF0Y2ggYXQgbWF0Y2hfc3RhcnQgaXMgaW5kZWVkIGEgbWF0Y2guCi0gKi8KLWxvY2FsIHZvaWQgY2hlY2tfbWF0Y2gocywgc3RhcnQsIG1hdGNoLCBsZW5ndGgpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBJUG9zIHN0YXJ0LCBtYXRjaDsKLSAgICBpbnQgbGVuZ3RoOwotewotICAgIC8qIGNoZWNrIHRoYXQgdGhlIG1hdGNoIGlzIGluZGVlZCBhIG1hdGNoICovCi0gICAgaWYgKHptZW1jbXAocy0+d2luZG93ICsgbWF0Y2gsCi0gICAgICAgICAgICAgICAgcy0+d2luZG93ICsgc3RhcnQsIGxlbmd0aCkgIT0gRVFVQUwpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIgc3RhcnQgJXUsIG1hdGNoICV1LCBsZW5ndGggJWRcbiIsCi0gICAgICAgICAgICAgICAgc3RhcnQsIG1hdGNoLCBsZW5ndGgpOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVjJWMiLCBzLT53aW5kb3dbbWF0Y2grK10sIHMtPndpbmRvd1tzdGFydCsrXSk7Ci0gICAgICAgIH0gd2hpbGUgKC0tbGVuZ3RoICE9IDApOwotICAgICAgICB6X2Vycm9yKCJpbnZhbGlkIG1hdGNoIik7Ci0gICAgfQotICAgIGlmICh6X3ZlcmJvc2UgPiAxKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCJcXFslZCwlZF0iLCBzdGFydC1tYXRjaCwgbGVuZ3RoKTsKLSAgICAgICAgZG8geyBwdXRjKHMtPndpbmRvd1tzdGFydCsrXSwgc3RkZXJyKTsgfSB3aGlsZSAoLS1sZW5ndGggIT0gMCk7Ci0gICAgfQotfQotI2Vsc2UKLSMgIGRlZmluZSBjaGVja19tYXRjaChzLCBzdGFydCwgbWF0Y2gsIGxlbmd0aCkKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZpbGwgdGhlIHdpbmRvdyB3aGVuIHRoZSBsb29rYWhlYWQgYmVjb21lcyBpbnN1ZmZpY2llbnQuCi0gKiBVcGRhdGVzIHN0cnN0YXJ0IGFuZCBsb29rYWhlYWQuCi0gKgotICogSU4gYXNzZXJ0aW9uOiBsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFECi0gKiBPVVQgYXNzZXJ0aW9uczogc3Ryc3RhcnQgPD0gd2luZG93X3NpemUtTUlOX0xPT0tBSEVBRAotICogICAgQXQgbGVhc3Qgb25lIGJ5dGUgaGFzIGJlZW4gcmVhZCwgb3IgYXZhaWxfaW4gPT0gMDsgcmVhZHMgYXJlCi0gKiAgICBwZXJmb3JtZWQgZm9yIGF0IGxlYXN0IHR3byBieXRlcyAocmVxdWlyZWQgZm9yIHRoZSB6aXAgdHJhbnNsYXRlX2VvbAotICogICAgb3B0aW9uIC0tIG5vdCBzdXBwb3J0ZWQgaGVyZSkuCi0gKi8KLWxvY2FsIHZvaWQgZmlsbF93aW5kb3cocykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIG4sIG07Ci0gICAgcmVnaXN0ZXIgUG9zZiAqcDsKLSAgICB1bnNpZ25lZCBtb3JlOyAgICAvKiBBbW91bnQgb2YgZnJlZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSB3aW5kb3cuICovCi0gICAgdUludCB3c2l6ZSA9IHMtPndfc2l6ZTsKLQotICAgIGRvIHsKLSAgICAgICAgbW9yZSA9ICh1bnNpZ25lZCkocy0+d2luZG93X3NpemUgLSh1bGcpcy0+bG9va2FoZWFkIC0odWxnKXMtPnN0cnN0YXJ0KTsKLQotICAgICAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqLwotICAgICAgICBpZiAoc2l6ZW9mKGludCkgPD0gMikgewotICAgICAgICAgICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbW9yZSA9IHdzaXplOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSgtMSkpIHsKLSAgICAgICAgICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYKLSAgICAgICAgICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1vcmUtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsCi0gICAgICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuCi0gICAgICAgICAqLwotICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPj0gd3NpemUrTUFYX0RJU1QocykpIHsKLQotICAgICAgICAgICAgem1lbWNweShzLT53aW5kb3csIHMtPndpbmRvdyt3c2l6ZSwgKHVuc2lnbmVkKXdzaXplKTsKLSAgICAgICAgICAgIHMtPm1hdGNoX3N0YXJ0IC09IHdzaXplOwotICAgICAgICAgICAgcy0+c3Ryc3RhcnQgICAgLT0gd3NpemU7IC8qIHdlIG5vdyBoYXZlIHN0cnN0YXJ0ID49IE1BWF9ESVNUICovCi0gICAgICAgICAgICBzLT5ibG9ja19zdGFydCAtPSAobG9uZykgd3NpemU7Ci0KLSAgICAgICAgICAgIC8qIFNsaWRlIHRoZSBoYXNoIHRhYmxlIChjb3VsZCBiZSBhdm9pZGVkIHdpdGggMzIgYml0IHZhbHVlcwotICAgICAgICAgICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDAKLSAgICAgICAgICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDAKLSAgICAgICAgICAgICAgIGxhdGVyLiAoVXNpbmcgbGV2ZWwgMCBwZXJtYW5lbnRseSBpcyBub3QgYW4gb3B0aW1hbCB1c2FnZSBvZgotICAgICAgICAgICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLikKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogJSUlIGF2b2lkIHRoaXMgd2hlbiBaX1JMRSAqLwotICAgICAgICAgICAgbiA9IHMtPmhhc2hfc2l6ZTsKLSAgICAgICAgICAgIHAgPSAmcy0+aGVhZFtuXTsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBtID0gKi0tcDsKLSAgICAgICAgICAgICAgICAqcCA9IChQb3MpKG0gPj0gd3NpemUgPyBtLXdzaXplIDogTklMKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7Ci0KLSAgICAgICAgICAgIG4gPSB3c2l6ZTsKLSNpZm5kZWYgRkFTVEVTVAotICAgICAgICAgICAgcCA9ICZzLT5wcmV2W25dOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG0gPSAqLS1wOwotICAgICAgICAgICAgICAgICpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOwotICAgICAgICAgICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0Ci0gICAgICAgICAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7Ci0jZW5kaWYKLSAgICAgICAgICAgIG1vcmUgKz0gd3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIHJldHVybjsKLQotICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzoKLSAgICAgICAgICogICAgc3Ryc3RhcnQgPD0gV1NJWkUrTUFYX0RJU1QtMSAmJiBsb29rYWhlYWQgPD0gTUlOX0xPT0tBSEVBRCAtIDEgJiYKLSAgICAgICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0Ci0gICAgICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKQotICAgICAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gMipXU0laRSArIDIKLSAgICAgICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksCi0gICAgICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmCi0gICAgICAgICAqICAgc3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgPD0gaW5wdXRfc2l6ZSA9PiBtb3JlID49IE1JTl9MT09LQUhFQUQuCi0gICAgICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuCi0gICAgICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi4KLSAgICAgICAgICovCi0gICAgICAgIEFzc2VydChtb3JlID49IDIsICJtb3JlIDwgMiIpOwotCi0gICAgICAgIG4gPSByZWFkX2J1ZihzLT5zdHJtLCBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIHMtPmxvb2thaGVhZCwgbW9yZSk7Ci0gICAgICAgIHMtPmxvb2thaGVhZCArPSBuOwotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqLwotICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgewotICAgICAgICAgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdOwotICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzLT5zdHJzdGFydCsxXSk7Ci0jaWYgTUlOX01BVENIICE9IDMKLSAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCi0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsCi0gICAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC4KLSAgICAgICAgICovCi0KLSAgICB9IHdoaWxlIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMtPnN0cm0tPmF2YWlsX2luICE9IDApOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZsdXNoIHRoZSBjdXJyZW50IGJsb2NrLCB3aXRoIGdpdmVuIGVuZC1vZi1maWxlIGZsYWcuCi0gKiBJTiBhc3NlcnRpb246IHN0cnN0YXJ0IGlzIHNldCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1hdGNoLgotICovCi0jZGVmaW5lIEZMVVNIX0JMT0NLX09OTFkocywgZW9mKSB7IFwKLSAgIF90cl9mbHVzaF9ibG9jayhzLCAocy0+YmxvY2tfc3RhcnQgPj0gMEwgPyBcCi0gICAgICAgICAgICAgICAgICAgKGNoYXJmICopJnMtPndpbmRvd1sodW5zaWduZWQpcy0+YmxvY2tfc3RhcnRdIDogXAotICAgICAgICAgICAgICAgICAgIChjaGFyZiAqKVpfTlVMTCksIFwKLSAgICAgICAgICAgICAgICAodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KSwgXAotICAgICAgICAgICAgICAgIChlb2YpKTsgXAotICAgcy0+YmxvY2tfc3RhcnQgPSBzLT5zdHJzdGFydDsgXAotICAgZmx1c2hfcGVuZGluZyhzLT5zdHJtKTsgXAotICAgVHJhY2V2KChzdGRlcnIsIltGTFVTSF0iKSk7IFwKLX0KLQotLyogU2FtZSBidXQgZm9yY2UgcHJlbWF0dXJlIGV4aXQgaWYgbmVjZXNzYXJ5LiAqLwotI2RlZmluZSBGTFVTSF9CTE9DSyhzLCBlb2YpIHsgXAotICAgRkxVU0hfQkxPQ0tfT05MWShzLCBlb2YpOyBcCi0gICBpZiAocy0+c3RybS0+YXZhaWxfb3V0ID09IDApIHJldHVybiAoZW9mKSA/IGZpbmlzaF9zdGFydGVkIDogbmVlZF9tb3JlOyBcCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4KLSAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLgotICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2UKLSAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkCi0gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uCi0gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tCi0gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuCi0gKi8KLWxvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgaW50IGZsdXNoOwotewotICAgIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkCi0gICAgICogdG8gcGVuZGluZ19idWZfc2l6ZSwgYW5kIGVhY2ggc3RvcmVkIGJsb2NrIGhhcyBhIDUgYnl0ZSBoZWFkZXI6Ci0gICAgICovCi0gICAgdWxnIG1heF9ibG9ja19zaXplID0gMHhmZmZmOwotICAgIHVsZyBtYXhfc3RhcnQ7Ci0KLSAgICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLT5wZW5kaW5nX2J1Zl9zaXplIC0gNSkgewotICAgICAgICBtYXhfYmxvY2tfc2l6ZSA9IHMtPnBlbmRpbmdfYnVmX3NpemUgLSA1OwotICAgIH0KLQotICAgIC8qIENvcHkgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIGlucHV0IHRvIG91dHB1dDogKi8KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIC8qIEZpbGwgdGhlIHdpbmRvdyBhcyBtdWNoIGFzIHBvc3NpYmxlOiAqLwotICAgICAgICBpZiAocy0+bG9va2FoZWFkIDw9IDEpIHsKLQotICAgICAgICAgICAgQXNzZXJ0KHMtPnN0cnN0YXJ0IDwgcy0+d19zaXplK01BWF9ESVNUKHMpIHx8Ci0gICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc3RhcnQgPj0gKGxvbmcpcy0+d19zaXplLCAic2xpZGUgdG9vIGxhdGUiKTsKLQotICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7Ci0gICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDAgJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgcmV0dXJuIG5lZWRfbW9yZTsKLQotICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KLSAgICAgICAgfQotICAgICAgICBBc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsICJibG9jayBnb25lIik7Ci0KLSAgICAgICAgcy0+c3Ryc3RhcnQgKz0gcy0+bG9va2FoZWFkOwotICAgICAgICBzLT5sb29rYWhlYWQgPSAwOwotCi0gICAgICAgIC8qIEVtaXQgYSBzdG9yZWQgYmxvY2sgaWYgcGVuZGluZ19idWYgd2lsbCBiZSBmdWxsOiAqLwotICAgICAgICBtYXhfc3RhcnQgPSBzLT5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplOwotICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPT0gMCB8fCAodWxnKXMtPnN0cnN0YXJ0ID49IG1heF9zdGFydCkgewotICAgICAgICAgICAgLyogc3Ryc3RhcnQgPT0gMCBpcyBwb3NzaWJsZSB3aGVuIHdyYXBhcm91bmQgb24gMTYtYml0IG1hY2hpbmUgKi8KLSAgICAgICAgICAgIHMtPmxvb2thaGVhZCA9ICh1SW50KShzLT5zdHJzdGFydCAtIG1heF9zdGFydCk7Ci0gICAgICAgICAgICBzLT5zdHJzdGFydCA9ICh1SW50KW1heF9zdGFydDsKLSAgICAgICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOwotICAgICAgICB9Ci0gICAgICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZQotICAgICAgICAgKiBuZWdhdGl2ZSBhbmQgdGhlIGRhdGEgd2lsbCBiZSBnb25lOgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHMtPnN0cnN0YXJ0IC0gKHVJbnQpcy0+YmxvY2tfc3RhcnQgPj0gTUFYX0RJU1QocykpIHsKLSAgICAgICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOwotICAgICAgICB9Ci0gICAgfQotICAgIEZMVVNIX0JMT0NLKHMsIGZsdXNoID09IFpfRklOSVNIKTsKLSAgICByZXR1cm4gZmx1c2ggPT0gWl9GSU5JU0ggPyBmaW5pc2hfZG9uZSA6IGJsb2NrX2RvbmU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29tcHJlc3MgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybiB0aGUgY3VycmVudAotICogYmxvY2sgc3RhdGUuCi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgYW5kIGluc2VydHMKLSAqIG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IG9ubHkgZm9yIHVubWF0Y2hlZCBzdHJpbmdzIG9yIGZvciBzaG9ydAotICogbWF0Y2hlcy4gSXQgaXMgdXNlZCBvbmx5IGZvciB0aGUgZmFzdCBjb21wcmVzc2lvbiBvcHRpb25zLgotICovCi1sb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2Zhc3QocywgZmx1c2gpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBpbnQgZmx1c2g7Ci17Ci0gICAgSVBvcyBoYXNoX2hlYWQgPSBOSUw7IC8qIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gKi8KLSAgICBpbnQgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCi0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAotICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcwotICAgICAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGUKLSAgICAgICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7Ci0gICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKLSAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmVlZF9tb3JlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGUKLSAgICAgICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46Ci0gICAgICAgICAqLwotICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgewotICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguCi0gICAgICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENICi0gICAgICAgICAqLwotICAgICAgICBpZiAoaGFzaF9oZWFkICE9IE5JTCAmJiBzLT5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBNQVhfRElTVChzKSkgewotICAgICAgICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcKLSAgICAgICAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaAotICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLgotICAgICAgICAgICAgICovCi0jaWZkZWYgRkFTVEVTVAotICAgICAgICAgICAgaWYgKChzLT5zdHJhdGVneSAhPSBaX0hVRkZNQU5fT05MWSAmJiBzLT5zdHJhdGVneSAhPSBaX1JMRSkgfHwKLSAgICAgICAgICAgICAgICAocy0+c3RyYXRlZ3kgPT0gWl9STEUgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPT0gMSkpIHsKLSAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoX2Zhc3QgKHMsIGhhc2hfaGVhZCk7Ci0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZICYmIHMtPnN0cmF0ZWd5ICE9IFpfUkxFKSB7Ci0gICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c3RyYXRlZ3kgPT0gWl9STEUgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPT0gMSkgewotICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2hfZmFzdCAocywgaGFzaF9oZWFkKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIG9yIGxvbmdlc3RfbWF0Y2hfZmFzdCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KLSAgICAgICAgfQotICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkgewotICAgICAgICAgICAgY2hlY2tfbWF0Y2gocywgcy0+c3Ryc3RhcnQsIHMtPm1hdGNoX3N0YXJ0LCBzLT5tYXRjaF9sZW5ndGgpOwotCi0gICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOwotCi0gICAgICAgICAgICBzLT5sb29rYWhlYWQgLT0gcy0+bWF0Y2hfbGVuZ3RoOwotCi0gICAgICAgICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoCi0gICAgICAgICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgotICAgICAgICAgICAgICovCi0jaWZuZGVmIEZBU1RFU1QKLSAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gcy0+bWF4X2luc2VydF9sZW5ndGggJiYKLSAgICAgICAgICAgICAgICBzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7Ci0gICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCsrOwotICAgICAgICAgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOwotICAgICAgICAgICAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlCi0gICAgICAgICAgICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tcy0+bWF0Y2hfbGVuZ3RoICE9IDApOwotICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0gICAgICAgICAgICB9IGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHMtPm1hdGNoX2xlbmd0aDsKLSAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIHMtPmluc19oID0gcy0+d2luZG93W3MtPnN0cnN0YXJ0XTsKLSAgICAgICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3MtPnN0cnN0YXJ0KzFdKTsKLSNpZiBNSU5fTUFUQ0ggIT0gMwotICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovCi0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOwotICAgICAgICAgICAgX3RyX3RhbGx5X2xpdCAocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSwgYmZsdXNoKTsKLSAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOwotICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmZsdXNoKSBGTFVTSF9CTE9DSyhzLCAwKTsKLSAgICB9Ci0gICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOwotICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKLX0KLQotI2lmbmRlZiBGQVNURVNUCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenkKLSAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXMKLSAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uCi0gKi8KLWxvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIGludCBmbHVzaDsKLXsKLSAgICBJUG9zIGhhc2hfaGVhZCA9IE5JTDsgICAgLyogaGVhZCBvZiBoYXNoIGNoYWluICovCi0gICAgaW50IGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLwotCi0gICAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovCi0gICAgZm9yICg7OykgewotICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKLSAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKLSAgICAgICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCi0gICAgICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCi0gICAgICAgICAqLwotICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkgewotICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7Ci0gICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5lZWRfbW9yZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCi0gICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKLSAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgotICAgICAgICAgKi8KLSAgICAgICAgcy0+cHJldl9sZW5ndGggPSBzLT5tYXRjaF9sZW5ndGgsIHMtPnByZXZfbWF0Y2ggPSBzLT5tYXRjaF9zdGFydDsKLSAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7Ci0KLSAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgcy0+cHJldl9sZW5ndGggPCBzLT5tYXhfbGF6eV9tYXRjaCAmJgotICAgICAgICAgICAgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QocykpIHsKLSAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCi0gICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKLSAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZICYmIHMtPnN0cmF0ZWd5ICE9IFpfUkxFKSB7Ci0gICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c3RyYXRlZ3kgPT0gWl9STEUgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPT0gMSkgewotICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2hfZmFzdCAocywgaGFzaF9oZWFkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBvciBsb25nZXN0X21hdGNoX2Zhc3QoKSBzZXRzIG1hdGNoX3N0YXJ0ICovCi0KLSAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gNSAmJiAocy0+c3RyYXRlZ3kgPT0gWl9GSUxURVJFRAotI2lmIFRPT19GQVIgPD0gMzI3NjcKLSAgICAgICAgICAgICAgICB8fCAocy0+bWF0Y2hfbGVuZ3RoID09IE1JTl9NQVRDSCAmJgotICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0ID4gVE9PX0ZBUikKLSNlbmRpZgotICAgICAgICAgICAgICAgICkpIHsKLQotICAgICAgICAgICAgICAgIC8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIG1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2UKLSAgICAgICAgICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudAotICAgICAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLT5tYXRjaF9sZW5ndGggPD0gcy0+cHJldl9sZW5ndGgpIHsKLSAgICAgICAgICAgIHVJbnQgbWF4X2luc2VydCA9IHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIC0gTUlOX01BVENIOwotICAgICAgICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovCi0KLSAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LTEsIHMtPnByZXZfbWF0Y2gsIHMtPnByZXZfbGVuZ3RoKTsKLQotICAgICAgICAgICAgX3RyX3RhbGx5X2Rpc3Qocywgcy0+c3Ryc3RhcnQgLTEgLSBzLT5wcmV2X21hdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7Ci0KLSAgICAgICAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLgotICAgICAgICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdAotICAgICAgICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpbgotICAgICAgICAgICAgICogdGhlIGhhc2ggdGFibGUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5wcmV2X2xlbmd0aC0xOwotICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLT0gMjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoKytzLT5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoLS1zLT5wcmV2X2xlbmd0aCAhPSAwKTsKLSAgICAgICAgICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7Ci0gICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0KLSAgICAgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOwotCi0gICAgICAgIH0gZWxzZSBpZiAocy0+bWF0Y2hfYXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYQotICAgICAgICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaAotICAgICAgICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOwotICAgICAgICAgICAgX3RyX3RhbGx5X2xpdChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0sIGJmbHVzaCk7Ci0gICAgICAgICAgICBpZiAoYmZsdXNoKSB7Ci0gICAgICAgICAgICAgICAgRkxVU0hfQkxPQ0tfT05MWShzLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0gICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKLSAgICAgICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9vdXQgPT0gMCkgcmV0dXJuIG5lZWRfbW9yZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3IKLSAgICAgICAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAxOwotICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKLSAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOwotICAgICAgICB9Ci0gICAgfQotICAgIEFzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgIm5vIGZsdXNoPyIpOwotICAgIGlmIChzLT5tYXRjaF9hdmFpbGFibGUpIHsKLSAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOwotICAgICAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKLSAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKLSAgICB9Ci0gICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOwotICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKLX0KLSNlbmRpZiAvKiBGQVNURVNUICovCi0KLSNpZiAwCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZQotICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mCi0gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pCi0gKi8KLWxvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfcmxlKHMsIGZsdXNoKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgaW50IGZsdXNoOwotewotICAgIGludCBiZmx1c2g7ICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCi0gICAgdUludCBydW47ICAgICAgICAgICAvKiBsZW5ndGggb2YgcnVuICovCi0gICAgdUludCBtYXg7ICAgICAgICAgICAvKiBtYXhpbXVtIGxlbmd0aCBvZiBydW4gKi8KLSAgICB1SW50IHByZXY7ICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovCi0gICAgQnl0ZWYgKnNjYW47ICAgICAgICAvKiBzY2FuIGZvciBlbmQgb2YgcnVuICovCi0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAotICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcwotICAgICAgICAgKiBmb3IgdGhlIGxvbmdlc3QgZW5jb2RhYmxlIHJ1bi4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNQVhfTUFUQ0gpIHsKLSAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOwotICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1BWF9NQVRDSCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5lZWRfbW9yZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqLwotICAgICAgICBydW4gPSAwOwotICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPiAwKSB7ICAgICAgLyogaWYgdGhlcmUgaXMgYSBwcmV2aW91cyBieXRlLCB0aGF0IGlzICovCi0gICAgICAgICAgICBtYXggPSBzLT5sb29rYWhlYWQgPCBNQVhfTUFUQ0ggPyBzLT5sb29rYWhlYWQgOiBNQVhfTUFUQ0g7Ci0gICAgICAgICAgICBzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgLSAxOwotICAgICAgICAgICAgcHJldiA9ICpzY2FuKys7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaWYgKCpzY2FuKysgIT0gcHJldikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IHdoaWxlICgrK3J1biA8IG1heCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBFbWl0IG1hdGNoIGlmIGhhdmUgcnVuIG9mIE1JTl9NQVRDSCBvciBsb25nZXIsIGVsc2UgZW1pdCBsaXRlcmFsICovCi0gICAgICAgIGlmIChydW4gPj0gTUlOX01BVENIKSB7Ci0gICAgICAgICAgICBjaGVja19tYXRjaChzLCBzLT5zdHJzdGFydCwgcy0+c3Ryc3RhcnQgLSAxLCBydW4pOwotICAgICAgICAgICAgX3RyX3RhbGx5X2Rpc3QocywgMSwgcnVuIC0gTUlOX01BVENILCBiZmx1c2gpOwotICAgICAgICAgICAgcy0+bG9va2FoZWFkIC09IHJ1bjsKLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHJ1bjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi8KLSAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwiJWMiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7Ci0gICAgICAgICAgICBfdHJfdGFsbHlfbGl0IChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdLCBiZmx1c2gpOwotICAgICAgICAgICAgcy0+bG9va2FoZWFkLS07Ci0gICAgICAgICAgICBzLT5zdHJzdGFydCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOwotICAgIH0KLSAgICBGTFVTSF9CTE9DSyhzLCBmbHVzaCA9PSBaX0ZJTklTSCk7Ci0gICAgcmV0dXJuIGZsdXNoID09IFpfRklOSVNIID8gZmluaXNoX2RvbmUgOiBibG9ja19kb25lOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3psaWIvZGVmbGF0ZS5oIGIvbGlicy96bGliL2RlZmxhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhNWFiMy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvZGVmbGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qIGRlZmxhdGUuaCAtLSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDQgSmVhbi1sb3VwIEdhaWxseQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2lmbmRlZiBERUZMQVRFX0gKLSNkZWZpbmUgREVGTEFURV9ICi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotCi0vKiBkZWZpbmUgTk9fR1pJUCB3aGVuIGNvbXBpbGluZyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGd6aXAgaGVhZGVyIGFuZAotICAgdHJhaWxlciBjcmVhdGlvbiBieSBkZWZsYXRlKCkuICBOT19HWklQIHdvdWxkIGJlIHVzZWQgdG8gYXZvaWQgbGlua2luZyBpbgotICAgdGhlIGNyYyBjb2RlIHdoZW4gaXQgaXMgbm90IG5lZWRlZC4gIEZvciBzaGFyZWQgbGlicmFyaWVzLCBnemlwIGVuY29kaW5nCi0gICBzaG91bGQgYmUgbGVmdCBlbmFibGVkLiAqLwotI2lmbmRlZiBOT19HWklQCi0jICBkZWZpbmUgR1pJUAotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogSW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuCi0gKi8KLQotI2RlZmluZSBMRU5HVEhfQ09ERVMgMjkKLS8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqLwotCi0jZGVmaW5lIExJVEVSQUxTICAyNTYKLS8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqLwotCi0jZGVmaW5lIExfQ09ERVMgKExJVEVSQUxTKzErTEVOR1RIX0NPREVTKQotLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovCi0KLSNkZWZpbmUgRF9DT0RFUyAgIDMwCi0vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KLQotI2RlZmluZSBCTF9DT0RFUyAgMTkKLS8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqLwotCi0jZGVmaW5lIEhFQVBfU0laRSAoMipMX0NPREVTKzEpCi0vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqLwotCi0jZGVmaW5lIE1BWF9CSVRTIDE1Ci0vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi8KLQotI2RlZmluZSBJTklUX1NUQVRFICAgIDQyCi0jZGVmaW5lIEVYVFJBX1NUQVRFICAgNjkKLSNkZWZpbmUgTkFNRV9TVEFURSAgICA3MwotI2RlZmluZSBDT01NRU5UX1NUQVRFIDkxCi0jZGVmaW5lIEhDUkNfU1RBVEUgICAxMDMKLSNkZWZpbmUgQlVTWV9TVEFURSAgIDExMwotI2RlZmluZSBGSU5JU0hfU1RBVEUgNjY2Ci0vKiBTdHJlYW0gc3RhdHVzICovCi0KLQotLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2YWx1ZSBhbmQgaXRzIGNvZGUgc3RyaW5nLiAqLwotdHlwZWRlZiBzdHJ1Y3QgY3RfZGF0YV9zIHsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHVzaCAgZnJlcTsgICAgICAgLyogZnJlcXVlbmN5IGNvdW50ICovCi0gICAgICAgIHVzaCAgY29kZTsgICAgICAgLyogYml0IHN0cmluZyAqLwotICAgIH0gZmM7Ci0gICAgdW5pb24gewotICAgICAgICB1c2ggIGRhZDsgICAgICAgIC8qIGZhdGhlciBub2RlIGluIEh1ZmZtYW4gdHJlZSAqLwotICAgICAgICB1c2ggIGxlbjsgICAgICAgIC8qIGxlbmd0aCBvZiBiaXQgc3RyaW5nICovCi0gICAgfSBkbDsKLX0gRkFSIGN0X2RhdGE7Ci0KLSNkZWZpbmUgRnJlcSBmYy5mcmVxCi0jZGVmaW5lIENvZGUgZmMuY29kZQotI2RlZmluZSBEYWQgIGRsLmRhZAotI2RlZmluZSBMZW4gIGRsLmxlbgotCi10eXBlZGVmIHN0cnVjdCBzdGF0aWNfdHJlZV9kZXNjX3MgIHN0YXRpY190cmVlX2Rlc2M7Ci0KLXR5cGVkZWYgc3RydWN0IHRyZWVfZGVzY19zIHsKLSAgICBjdF9kYXRhICpkeW5fdHJlZTsgICAgICAgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi8KLSAgICBpbnQgICAgIG1heF9jb2RlOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwotICAgIHN0YXRpY190cmVlX2Rlc2MgKnN0YXRfZGVzYzsgLyogdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHRyZWUgKi8KLX0gRkFSIHRyZWVfZGVzYzsKLQotdHlwZWRlZiB1c2ggUG9zOwotdHlwZWRlZiBQb3MgRkFSIFBvc2Y7Ci10eXBlZGVmIHVuc2lnbmVkIElQb3M7Ci0KLS8qIEEgUG9zIGlzIGFuIGluZGV4IGluIHRoZSBjaGFyYWN0ZXIgd2luZG93LiBXZSB1c2Ugc2hvcnQgaW5zdGVhZCBvZiBpbnQgdG8KLSAqIHNhdmUgc3BhY2UgaW4gdGhlIHZhcmlvdXMgdGFibGVzLiBJUG9zIGlzIHVzZWQgb25seSBmb3IgcGFyYW1ldGVyIHBhc3NpbmcuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgewotICAgIHpfc3RyZWFtcCBzdHJtOyAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovCi0gICAgaW50ICAgc3RhdHVzOyAgICAgICAgLyogYXMgdGhlIG5hbWUgaW1wbGllcyAqLwotICAgIEJ5dGVmICpwZW5kaW5nX2J1ZjsgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovCi0gICAgdWxnICAgcGVuZGluZ19idWZfc2l6ZTsgLyogc2l6ZSBvZiBwZW5kaW5nX2J1ZiAqLwotICAgIEJ5dGVmICpwZW5kaW5nX291dDsgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovCi0gICAgdUludCAgIHBlbmRpbmc7ICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovCi0gICAgaW50ICAgd3JhcDsgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqLwotICAgIGd6X2hlYWRlcnAgIGd6aGVhZDsgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovCi0gICAgdUludCAgIGd6aW5kZXg7ICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi8KLSAgICBCeXRlICBtZXRob2Q7ICAgICAgICAvKiBTVE9SRUQgKGZvciB6aXAgb25seSkgb3IgREVGTEFURUQgKi8KLSAgICBpbnQgICBsYXN0X2ZsdXNoOyAgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovCi0KLSAgICAgICAgICAgICAgICAvKiB1c2VkIGJ5IGRlZmxhdGUuYzogKi8KLQotICAgIHVJbnQgIHdfc2l6ZTsgICAgICAgIC8qIExaNzcgd2luZG93IHNpemUgKDMySyBieSBkZWZhdWx0KSAqLwotICAgIHVJbnQgIHdfYml0czsgICAgICAgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqLwotICAgIHVJbnQgIHdfbWFzazsgICAgICAgIC8qIHdfc2l6ZSAtIDEgKi8KLQotICAgIEJ5dGVmICp3aW5kb3c7Ci0gICAgLyogU2xpZGluZyB3aW5kb3cuIElucHV0IGJ5dGVzIGFyZSByZWFkIGludG8gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB3aW5kb3csCi0gICAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemUKLSAgICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mCi0gICAgICogd1NpemUtTUFYX01BVENIIGJ5dGVzLCBidXQgdGhpcyBlbnN1cmVzIHRoYXQgSU8gaXMgYWx3YXlzCi0gICAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuIEFsc28sIGl0IGxpbWl0cwotICAgICAqIHRoZSB3aW5kb3cgc2l6ZSB0byA2NEssIHdoaWNoIGlzIHF1aXRlIHVzZWZ1bCBvbiBNU0RPUy4KLSAgICAgKiBUbyBkbzogdXNlIHRoZSB1c2VyIGlucHV0IGJ1ZmZlciBhcyBzbGlkaW5nIHdpbmRvdy4KLSAgICAgKi8KLQotICAgIHVsZyB3aW5kb3dfc2l6ZTsKLSAgICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlcgotICAgICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuCi0gICAgICovCi0KLSAgICBQb3NmICpwcmV2OwotICAgIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzCi0gICAgICogYXJyYXkgdG8gNjRLLCB0aGlzIGxpbmsgaXMgbWFpbnRhaW5lZCBvbmx5IGZvciB0aGUgbGFzdCAzMksgc3RyaW5ncy4KLSAgICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy4KLSAgICAgKi8KLQotICAgIFBvc2YgKmhlYWQ7IC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovCi0KLSAgICB1SW50ICBpbnNfaDsgICAgICAgICAgLyogaGFzaCBpbmRleCBvZiBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWQgKi8KLSAgICB1SW50ICBoYXNoX3NpemU7ICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi8KLSAgICB1SW50ICBoYXNoX2JpdHM7ICAgICAgLyogbG9nMihoYXNoX3NpemUpICovCi0gICAgdUludCAgaGFzaF9tYXNrOyAgICAgIC8qIGhhc2hfc2l6ZS0xICovCi0KLSAgICB1SW50ICBoYXNoX3NoaWZ0OwotICAgIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0Ci0gICAgICogc3RlcC4gSXQgbXVzdCBiZSBzdWNoIHRoYXQgYWZ0ZXIgTUlOX01BVENIIHN0ZXBzLCB0aGUgb2xkZXN0Ci0gICAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6Ci0gICAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0cwotICAgICAqLwotCi0gICAgbG9uZyBibG9ja19zdGFydDsKLSAgICAvKiBXaW5kb3cgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBvdXRwdXQgYmxvY2suIEdldHMKLSAgICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLgotICAgICAqLwotCi0gICAgdUludCBtYXRjaF9sZW5ndGg7ICAgICAgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqLwotICAgIElQb3MgcHJldl9tYXRjaDsgICAgICAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi8KLSAgICBpbnQgbWF0Y2hfYXZhaWxhYmxlOyAgICAgICAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi8KLSAgICB1SW50IHN0cnN0YXJ0OyAgICAgICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi8KLSAgICB1SW50IG1hdGNoX3N0YXJ0OyAgICAgICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqLwotICAgIHVJbnQgbG9va2FoZWFkOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqLwotCi0gICAgdUludCBwcmV2X2xlbmd0aDsKLSAgICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXMKLSAgICAgKiBhcmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbi4KLSAgICAgKi8KLQotICAgIHVJbnQgbWF4X2NoYWluX2xlbmd0aDsKLSAgICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpcwotICAgICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGUKLSAgICAgKiBzcGVlZC4KLSAgICAgKi8KLQotICAgIHVJbnQgbWF4X2xhenlfbWF0Y2g7Ci0gICAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseQotICAgICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uCi0gICAgICogbGV2ZWxzID49IDQuCi0gICAgICovCi0jICAgZGVmaW5lIG1heF9pbnNlcnRfbGVuZ3RoICBtYXhfbGF6eV9tYXRjaAotICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90Ci0gICAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgotICAgICAqIG1heF9pbnNlcnRfbGVuZ3RoIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDw9IDMuCi0gICAgICovCi0KLSAgICBpbnQgbGV2ZWw7ICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqLwotICAgIGludCBzdHJhdGVneTsgLyogZmF2b3Igb3IgZm9yY2UgSHVmZm1hbiBjb2RpbmcqLwotCi0gICAgdUludCBnb29kX21hdGNoOwotICAgIC8qIFVzZSBhIGZhc3RlciBzZWFyY2ggd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhpcyAqLwotCi0gICAgaW50IG5pY2VfbWF0Y2g7IC8qIFN0b3Agc2VhcmNoaW5nIHdoZW4gY3VycmVudCBtYXRjaCBleGNlZWRzIHRoaXMgKi8KLQotICAgICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi8KLSAgICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi8KLSAgICBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovCi0gICAgc3RydWN0IGN0X2RhdGFfcyBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovCi0gICAgc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovCi0KLSAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgbF9kZXNjOyAgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi8KLSAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgZF9kZXNjOyAgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBkaXN0YW5jZSB0cmVlICovCi0gICAgc3RydWN0IHRyZWVfZGVzY19zIGJsX2Rlc2M7ICAgICAgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovCi0KLSAgICB1c2ggYmxfY291bnRbTUFYX0JJVFMrMV07Ci0gICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovCi0KLSAgICBpbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovCi0gICAgaW50IGhlYXBfbGVuOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaGVhcCAqLwotICAgIGludCBoZWFwX21heDsgICAgICAgICAgICAgICAvKiBlbGVtZW50IG9mIGxhcmdlc3QgZnJlcXVlbmN5ICovCi0gICAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC4KLSAgICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLgotICAgICAqLwotCi0gICAgdWNoIGRlcHRoWzIqTF9DT0RFUysxXTsKLSAgICAvKiBEZXB0aCBvZiBlYWNoIHN1YnRyZWUgdXNlZCBhcyB0aWUgYnJlYWtlciBmb3IgdHJlZXMgb2YgZXF1YWwgZnJlcXVlbmN5Ci0gICAgICovCi0KLSAgICB1Y2hmICpsX2J1ZjsgICAgICAgICAgLyogYnVmZmVyIGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovCi0KLSAgICB1SW50ICBsaXRfYnVmc2l6ZTsKLSAgICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yCi0gICAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOgotICAgICAqICAgLSBmcmVxdWVuY2llcyBjYW4gYmUga2VwdCBpbiAxNiBiaXQgY291bnRlcnMKLSAgICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0Ci0gICAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuCi0gICAgICogICAgIHdoZW4gaW5wdXQgY29tZXMgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yCi0gICAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKQotICAgICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhbgotICAgICAqICAgICBldmVuIGVtaXQgYSBzdG9yZWQgZmlsZSBpbnN0ZWFkIG9mIGEgc3RvcmVkIGJsb2NrIChzYXZpbmcgNSBieXRlcykuCi0gICAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLgotICAgICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3QKLSAgICAgKiAgICAgYWRhcHRhdGlvbiB0byBjaGFuZ2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvcgotICAgICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnkKLSAgICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmUKLSAgICAgKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nCi0gICAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS4KLSAgICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0Ci0gICAgICovCi0KLSAgICB1SW50IGxhc3RfbGl0OyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KLQotICAgIHVzaGYgKmRfYnVmOwotICAgIC8qIEJ1ZmZlciBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmUKLSAgICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZwotICAgICAqIGFycmF5IHdvdWxkIGJlIG5lY2Vzc2FyeS4KLSAgICAgKi8KLQotICAgIHVsZyBvcHRfbGVuOyAgICAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggb3B0aW1hbCB0cmVlcyAqLwotICAgIHVsZyBzdGF0aWNfbGVuOyAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovCi0gICAgdUludCBtYXRjaGVzOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqLwotICAgIGludCBsYXN0X2VvYl9sZW47ICAgLyogYml0IGxlbmd0aCBvZiBFT0IgY29kZSBmb3IgbGFzdCBibG9jayAqLwotCi0jaWZkZWYgREVCVUcKLSAgICB1bGcgY29tcHJlc3NlZF9sZW47IC8qIHRvdGFsIGJpdCBsZW5ndGggb2YgY29tcHJlc3NlZCBmaWxlIG1vZCAyXjMyICovCi0gICAgdWxnIGJpdHNfc2VudDsgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGNvbXByZXNzZWQgZGF0YSBzZW50IG1vZCAyXjMyICovCi0jZW5kaWYKLQotICAgIHVzaCBiaV9idWY7Ci0gICAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3QKLSAgICAgKiBzaWduaWZpY2FudCBiaXRzKS4KLSAgICAgKi8KLSAgICBpbnQgYmlfdmFsaWQ7Ci0gICAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0Ci0gICAgICogYXJlIGFsd2F5cyB6ZXJvLgotICAgICAqLwotCi19IEZBUiBkZWZsYXRlX3N0YXRlOwotCi0vKiBPdXRwdXQgYSBieXRlIG9uIHRoZSBzdHJlYW0uCi0gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdfYnVmLgotICovCi0jZGVmaW5lIHB1dF9ieXRlKHMsIGMpIHtzLT5wZW5kaW5nX2J1ZltzLT5wZW5kaW5nKytdID0gKGMpO30KLQotCi0jZGVmaW5lIE1JTl9MT09LQUhFQUQgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkKLS8qIE1pbmltdW0gYW1vdW50IG9mIGxvb2thaGVhZCwgZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuCi0gKiBTZWUgZGVmbGF0ZS5jIGZvciBjb21tZW50cyBhYm91dCB0aGUgTUlOX01BVENIKzEuCi0gKi8KLQotI2RlZmluZSBNQVhfRElTVChzKSAgKChzKS0+d19zaXplLU1JTl9MT09LQUhFQUQpCi0vKiBJbiBvcmRlciB0byBzaW1wbGlmeSB0aGUgY29kZSwgcGFydGljdWxhcmx5IG9uIDE2IGJpdCBtYWNoaW5lcywgbWF0Y2gKLSAqIGRpc3RhbmNlcyBhcmUgbGltaXRlZCB0byBNQVhfRElTVCBpbnN0ZWFkIG9mIFdTSVpFLgotICovCi0KLSAgICAgICAgLyogaW4gdHJlZXMuYyAqLwotdm9pZCBfdHJfaW5pdCAgICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci1pbnQgIF90cl90YWxseSAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHVuc2lnbmVkIGRpc3QsIHVuc2lnbmVkIGxjKSk7Ci12b2lkIF90cl9mbHVzaF9ibG9jayAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsIHVsZyBzdG9yZWRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW9mKSk7Ci12b2lkIF90cl9hbGlnbiAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKLXZvaWQgX3RyX3N0b3JlZF9ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlb2YpKTsKLQotI2RlZmluZSBkX2NvZGUoZGlzdCkgXAotICAgKChkaXN0KSA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NisoKGRpc3QpPj43KV0pCi0vKiBNYXBwaW5nIGZyb20gYSBkaXN0YW5jZSB0byBhIGRpc3RhbmNlIGNvZGUuIGRpc3QgaXMgdGhlIGRpc3RhbmNlIC0gMSBhbmQKLSAqIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLiBfZGlzdF9jb2RlWzI1Nl0gYW5kIF9kaXN0X2NvZGVbMjU3XSBhcmUgbmV2ZXIKLSAqIHVzZWQuCi0gKi8KLQotI2lmbmRlZiBERUJVRwotLyogSW5saW5lIHZlcnNpb25zIG9mIF90cl90YWxseSBmb3Igc3BlZWQ6ICovCi0KLSNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQotICBleHRlcm4gdWNoIF9sZW5ndGhfY29kZVtdOwotICBleHRlcm4gdWNoIF9kaXN0X2NvZGVbXTsKLSNlbHNlCi0gIGV4dGVybiBjb25zdCB1Y2ggX2xlbmd0aF9jb2RlW107Ci0gIGV4dGVybiBjb25zdCB1Y2ggX2Rpc3RfY29kZVtdOwotI2VuZGlmCi0KLSMgZGVmaW5lIF90cl90YWxseV9saXQocywgYywgZmx1c2gpIFwKLSAgeyB1Y2ggY2MgPSAoYyk7IFwKLSAgICBzLT5kX2J1ZltzLT5sYXN0X2xpdF0gPSAwOyBcCi0gICAgcy0+bF9idWZbcy0+bGFzdF9saXQrK10gPSBjYzsgXAotICAgIHMtPmR5bl9sdHJlZVtjY10uRnJlcSsrOyBcCi0gICAgZmx1c2ggPSAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7IFwKLSAgIH0KLSMgZGVmaW5lIF90cl90YWxseV9kaXN0KHMsIGRpc3RhbmNlLCBsZW5ndGgsIGZsdXNoKSBcCi0gIHsgdWNoIGxlbiA9IChsZW5ndGgpOyBcCi0gICAgdXNoIGRpc3QgPSAoZGlzdGFuY2UpOyBcCi0gICAgcy0+ZF9idWZbcy0+bGFzdF9saXRdID0gZGlzdDsgXAotICAgIHMtPmxfYnVmW3MtPmxhc3RfbGl0KytdID0gbGVuOyBcCi0gICAgZGlzdC0tOyBcCi0gICAgcy0+ZHluX2x0cmVlW19sZW5ndGhfY29kZVtsZW5dK0xJVEVSQUxTKzFdLkZyZXErKzsgXAotICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsgXAotICAgIGZsdXNoID0gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOyBcCi0gIH0KLSNlbHNlCi0jIGRlZmluZSBfdHJfdGFsbHlfbGl0KHMsIGMsIGZsdXNoKSBmbHVzaCA9IF90cl90YWxseShzLCAwLCBjKQotIyBkZWZpbmUgX3RyX3RhbGx5X2Rpc3QocywgZGlzdGFuY2UsIGxlbmd0aCwgZmx1c2gpIFwKLSAgICAgICAgICAgICAgZmx1c2ggPSBfdHJfdGFsbHkocywgZGlzdGFuY2UsIGxlbmd0aCkKLSNlbmRpZgotCi0jZW5kaWYgLyogREVGTEFURV9IICovCmRpZmYgLS1naXQgYS9saWJzL3psaWIvZXhhbXBsZS1yZXMucmMgYi9saWJzL3psaWIvZXhhbXBsZS1yZXMucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOTMyMDUuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2V4YW1wbGUtcmVzLnJjCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDx3aW52ZXIuaD4KLSAgCi0jZGVmaW5lIFZFUl9GSUxFVkVSU0lPTiAxLDIsMiwxODI4Ci0jZGVmaW5lIFZFUl9GSUxFVkVSU0lPTl9TVFIgIjEuMi4yLjE4MjgiCi0jZGVmaW5lIFZFUl9GSUxFTFRWRVJTSU9OX1NUUiAiIgotI2RlZmluZSBWRVJfTEVHQUxDT1BZUklHSFRfU1RSICKpIDIwMDUgSmVhbi1sb3VwIEdhaWxseSA8amxvdXBAZ3ppcC5vcmcgPiwgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4iCi0vLyNkZWZpbmUgVkVSX0NPTU1FTlRfU1RSICAiIgkgCi0KLSNkZWZpbmUgVkVSX0ZJTEVERVNDUklQVElPTl9TVFIgIlpsaWI6IGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIC8gZGVjb21wcmVzc2lvbiBsaWJyYXJ5IgotI2RlZmluZSBWRVJfSU5URVJOQUxOQU1FX1NUUiAiZXhhbXBsZSIKLSNkZWZpbmUgVkVSX09SSUdJTkFMRklMRU5BTUVfU1RSICJleGFtcGxlLmV4ZSIKLSNkZWZpbmUgVkVSX1dXV19TVFIgImh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYiIKLSNkZWZpbmUgVkVSX0NPTVBBTllOQU1FX1NUUiAiWmxpYiIKLSNkZWZpbmUgVkVSX0xJQ0VOU0VfU1RSICIoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLCBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4gSmVhbi1sb3VwIEdhaWxseSBNYXJrIEFkbGVyIGpsb3VwQGd6aXAub3JnIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUgIgotI2RlZmluZSBWRVJfTEVHQUxUUkFERU1BUktTX1NUUiAiWmxpYq4sIFpsaWKuLCBleGFtcGxlriIKLQotI2RlZmluZSBWRVJfUFJPRFVDVE5BTUVfU1RSICJabGliIgotI2RlZmluZSBWRVJfUFJPRFVDVFZFUlNJT04gMSwyLDIsMTgyOAotI2RlZmluZSBWRVJfUFJPRFVDVFZFUlNJT05fU1RSICIxLjIuMi4xODI4IgotCi0KLSN1bmRlZiBPRkZJQ0lBTAotI2RlZmluZSBGSU5BTCAgICAgICAgICAgIDEKLQotI2RlZmluZSBHTlVXSU4zMl9TUEVDSUFMQlVJTERfU1RSCSJHTlUgZm9yIFdpbjMyIDxnbnV3aW4zMi5zb3VyY2Vmb3JnZS5uZXQ+IgotCi0jZGVmaW5lIFZFUl9GSUxFVFlQRQkJCVZGVF9BUFAKLSNpZm5kZWYgVkVSX0ZJTEVUWVBFCi0jZGVmaW5lIFZFUl9GSUxFVFlQRSAgICAgICAgICAgICAgICBWRlRfQVBQCi0jZW5kaWYKLQotI2RlZmluZSBWRVJfRklMRVNVQlRZUEUgICAgICAgICAgICAgVkZUMl9VTktOT1dOCi0KLSNpZm5kZWYgREVCVUcKLSNkZWZpbmUgVkVSX0RFQlVHICAgICAgICAgICAgICAgICAgIDAKLSNlbHNlIC8qIERFQlVHICovCi0jZGVmaW5lIFZFUl9ERUJVRyAgICAgICAgICAgICAgICAgICBWU19GRl9ERUJVRwotI2VuZGlmCi0KLSNpZm5kZWYgUEFUQ0hFRAotI2RlZmluZSBWRVJfUEFUQ0hFRCAgICAgICAgICAgICAgICAgICAwCi0jZWxzZSAvKiBQQVRDSEVEICovCi0jZGVmaW5lIFZFUl9QQVRDSEVEICAgICAgICAgICAgICAgICAgIFZTX0ZGX1BBVENIRUQKLSNlbmRpZgotCi0jaWZuZGVmIE9GRklDSUFMCi0jZGVmaW5lIFZFUl9TUEVDSUFMQlVJTEQgICAgICAgICAgICBWU19GRl9TUEVDSUFMQlVJTEQKLSNpZm5kZWYgVkVSX1NQRUNJQUxCVUlMRF9TVFIKLSNkZWZpbmUgVkVSX1NQRUNJQUxCVUlMRF9TVFIJCUdOVVdJTjMyX1NQRUNJQUxCVUlMRF9TVFIKLSNlbmRpZgotI2Vsc2UgLyogT0ZGSUNJQUwgKi8KLSNkZWZpbmUgVkVSX1NQRUNJQUxCVUlMRCAgICAgICAgICAgIDAKLSNlbmRpZiAvKiBPRkZJQ0lBTCAqLwotCi0jaWZuZGVmIEZJTkFMCi0jZGVmaW5lIFZFUl9QUklWQVRFQlVJTEQgICAgICAgICAgICBWU19GRl9QUklWQVRFQlVJTEQKLSNpZm5kZWYgVkVSX1BSSVZBVEVCVUlMRF9TVFIKLSNkZWZpbmUgVkVSX1BSSVZBVEVCVUlMRF9TVFIJCSJQcmUtcmVsZWFzZSIKLSNlbmRpZiAvKiBWRVJfUFJJVkFURUJVSUxEX1NUUiAqLwotI2RlZmluZSBWRVJfUFJFUkVMRUFTRSAgICAgICAgICAgICAgVlNfRkZfUFJFUkVMRUFTRQotI2Vsc2UgLyogRklOQUwgKi8KLSNkZWZpbmUgVkVSX1BSSVZBVEVCVUlMRCAgICAgICAgICAgIDAKLSNkZWZpbmUgVkVSX1BSRVJFTEVBU0UgICAgICAgICAgICAgIDAKLSNlbmRpZiAvKiBGSU5BTCAqLwotCi0jZGVmaW5lIFZFUl9GSUxFRkxBR1NNQVNLICAgICAgICAgICBWU19GRklfRklMRUZMQUdTTUFTSwotI2RlZmluZSBWRVJfRklMRUZMQUdTICAgICAgICAgICAgICAgKFZFUl9QUklWQVRFQlVJTER8VkVSX1NQRUNJQUxCVUlMRHxWRVJfUFJFUkVMRUFTRXxWRVJfREVCVUd8VkVSX1BBVENIRUQpCi0KLSNkZWZpbmUgVkVSX0ZJTEVPUyAgICAgICAgICAgICAgICAgIFZPU19fV0lORE9XUzMyCi0KLSNpZmRlZiBSQ19JTlZPS0VECi0KLVZTX1ZFUlNJT05fSU5GTyAgICAgICAgIFZFUlNJT05JTkZPCi1GSUxFVkVSU0lPTiAgICAgCVZFUl9GSUxFVkVSU0lPTgotUFJPRFVDVFZFUlNJT04gIAlWRVJfUFJPRFVDVFZFUlNJT04KLUZJTEVGTEFHU01BU0sgICAJVkVSX0ZJTEVGTEFHU01BU0sKLUZJTEVGTEFHUyAgICAgICAJVkVSX0ZJTEVGTEFHUwotRklMRU9TICAgICAgICAgIAlWRVJfRklMRU9TCi1GSUxFVFlQRSAgICAgICAgCVZFUl9GSUxFVFlQRQotRklMRVNVQlRZUEUgICAgIAlWRVJfRklMRVNVQlRZUEUKLQotQkVHSU4KLSAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0gICAgQkVHSU4KLQlCTE9DSyAiMDQwOTA0RTQiCi0gICAgLyogbGFuZ3VhZ2UgSUQgPSBVLlMuIEVuZ2xpc2gsIGNoYXIgc2V0ID0gV2luZG93cywgTXVsdGlsaW5ndWFsICovCi0JQkVHSU4KLSNpZmRlZiBWRVJfQ09NTUVOVF9TVFIKLQkgICAgVkFMVUUgIkNvbW1lbnRzIiwgICAgICAgICAgVkVSX0NPTU1FTlRfU1RSCi0jZW5kaWYKLQkgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgICAgICBWRVJfQ09NUEFOWU5BTUVfU1RSCi0JICAgIFZBTFVFICJMaWNlbnNlIiwJCSAgVkVSX0xJQ0VOU0VfU1RSCi0JICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAgVkVSX0ZJTEVERVNDUklQVElPTl9TVFIKLQkgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgICAgICBWRVJfRklMRVZFUlNJT05fU1RSCi0jaWYgIShWRVJfRklMRVRZUEUtVkZUX0RMTCkKLQkgICAgVkFMVUUgIkxpYlRvb2xGaWxlVmVyc2lvbiIsVkVSX0ZJTEVMVFZFUlNJT05fU1RSCi0jZW5kaWYKLQkJVkFMVUUgIkludGVybmFsTmFtZSIsICAgICBWRVJfSU5URVJOQUxOQU1FX1NUUgotI2lmZGVmIFZFUl9MRUdBTENPUFlSSUdIVF9TVFIKLQkJVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgICBWRVJfTEVHQUxDT1BZUklHSFRfU1RSCi0jZW5kaWYKLSNpZmRlZiBWRVJfTEVHQUxUUkFERU1BUktTX1NUUgotCSAgICBWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgIFZFUl9MRUdBTFRSQURFTUFSS1NfU1RSCi0jZW5kaWYKLQkgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCBWRVJfT1JJR0lOQUxGSUxFTkFNRV9TVFIKLQkgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgICAgICBWRVJfUFJPRFVDVE5BTUVfU1RSCi0JICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICAgVkVSX1BST0RVQ1RWRVJTSU9OX1NUUgotI2lmZGVmIFZFUl9QQVRDSExFVkVMX1NUUgotCSAgICBWQUxVRSAiUGF0Y2ggbGV2ZWwiLCAgVkVSX1BBVENITEVWRUxfU1RSCi0jZW5kaWYKLSNpZmRlZiBWRVJfUFJJVkFURUJVSUxEX1NUUgotCSAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwgIFZFUl9QUklWQVRFQlVJTERfU1RSCi0jZW5kaWYKLSNpZmRlZiBWRVJfU1BFQ0lBTEJVSUxEX1NUUgotCSAgICBWQUxVRSAiU3BlY2lhbEJ1aWxkIiwgIFZFUl9TUEVDSUFMQlVJTERfU1RSCi0jZW5kaWYKLSNpZmRlZiBWRVJfQVVUSE9SX1NUUgotCSAgICBWQUxVRSAiQXV0aG9ycyIsICBWRVJfQVVUSE9SX1NUUgotI2VuZGlmCi0jaWZkZWYgVkVSX1dXV19TVFIKLQkgICAgVkFMVUUgIldXVyIsICBWRVJfV1dXX1NUUgotI2VuZGlmCi1FTkQKLSAgICBFTkQKLSAgICBCTE9DSyAiVmFyRmlsZUluZm8iCi0gICAgQkVHSU4KLQlWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMTI1MgotICAgIEVORAotRU5ECi0KLSNlbmRpZiAvKiAgUkNfSU5WT0tFRCAqLwotNTAwIElDT04gTU9WRUFCTEUgUFVSRSBMT0FET05DQUxMIERJU0NBUkRBQkxFICJ6bGliLmljbyIKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9leGFtcGxlLXN0YXRpYy1yZXMucmMgYi9saWJzL3psaWIvZXhhbXBsZS1zdGF0aWMtcmVzLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDk2M2IzLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9leGFtcGxlLXN0YXRpYy1yZXMucmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHdpbnZlci5oPgotICAKLSNkZWZpbmUgVkVSX0ZJTEVWRVJTSU9OIDEsMiwxLDE0MjkKLSNkZWZpbmUgVkVSX0ZJTEVWRVJTSU9OX1NUUiAiMS4yLjEuMTQyOSIKLSNkZWZpbmUgVkVSX0ZJTEVMVFZFUlNJT05fU1RSICIiCi0jZGVmaW5lIFZFUl9MRUdBTENPUFlSSUdIVF9TVFIgIqkgMjAwMyBKZWFuLWxvdXAgR2FpbGx5IDxqbG91cEBnemlwLm9yZyA+LCBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PiIKLS8vI2RlZmluZSBWRVJfQ09NTUVOVF9TVFIgICIiCSAKLQotI2RlZmluZSBWRVJfRklMRURFU0NSSVBUSU9OX1NUUiAiWmxpYjogZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gLyBkZWNvbXByZXNzaW9uIGxpYnJhcnkiCi0jZGVmaW5lIFZFUl9JTlRFUk5BTE5BTUVfU1RSICJleGFtcGxlLXN0YXRpYyIKLSNkZWZpbmUgVkVSX09SSUdJTkFMRklMRU5BTUVfU1RSICJleGFtcGxlLXN0YXRpYy5leGUiCi0jZGVmaW5lIFZFUl9XV1dfU1RSICJodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIiCi0jZGVmaW5lIFZFUl9DT01QQU5ZTkFNRV9TVFIgIlpsaWIiCi0jZGVmaW5lIFZFUl9MSUNFTlNFX1NUUiAiIChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlciBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLiBKZWFuLWxvdXAgR2FpbGx5IE1hcmsgQWRsZXIgamxvdXBAZ3ppcC5vcmcgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSIKLSNkZWZpbmUgVkVSX0xFR0FMVFJBREVNQVJLU19TVFIgIlpsaWKuLCBleGFtcGxlLXN0YXRpY64iCi0KLSNkZWZpbmUgVkVSX1BST0RVQ1ROQU1FX1NUUiAiWmxpYiIKLSNkZWZpbmUgVkVSX1BST0RVQ1RWRVJTSU9OIDEsMiwxLDE0MjkKLSNkZWZpbmUgVkVSX1BST0RVQ1RWRVJTSU9OX1NUUiAiMS4yLjEuMTQyOSIKLQotI3VuZGVmIE9GRklDSUFMCi0jZGVmaW5lIEZJTkFMICAgICAgICAgICAgMQotCi0jZGVmaW5lIEdOVVdJTjMyX1NQRUNJQUxCVUlMRF9TVFIJIkdOVSBmb3IgV2luMzIgPGdudXdpbjMyLnNvdXJjZWZvcmdlLm5ldD4iCi0KLSNkZWZpbmUgVkVSX0ZJTEVUWVBFCQkJVkZUX0FQUAotI2lmbmRlZiBWRVJfRklMRVRZUEUKLSNkZWZpbmUgVkVSX0ZJTEVUWVBFICAgICAgICAgICAgICAgIFZGVF9BUFAKLSNlbmRpZgotCi0jZGVmaW5lIFZFUl9GSUxFU1VCVFlQRSAgICAgICAgICAgICBWRlQyX1VOS05PV04KLQotI2lmbmRlZiBERUJVRwotI2RlZmluZSBWRVJfREVCVUcgICAgICAgICAgICAgICAgICAgMAotI2Vsc2UgLyogREVCVUcgKi8KLSNkZWZpbmUgVkVSX0RFQlVHICAgICAgICAgICAgICAgICAgIFZTX0ZGX0RFQlVHCi0jZW5kaWYKLQotI2lmbmRlZiBQQVRDSEVECi0jZGVmaW5lIFZFUl9QQVRDSEVEICAgICAgICAgICAgICAgICAgIDAKLSNlbHNlIC8qIFBBVENIRUQgKi8KLSNkZWZpbmUgVkVSX1BBVENIRUQgICAgICAgICAgICAgICAgICAgVlNfRkZfUEFUQ0hFRAotI2VuZGlmCi0KLSNpZm5kZWYgT0ZGSUNJQUwKLSNkZWZpbmUgVkVSX1NQRUNJQUxCVUlMRCAgICAgICAgICAgIFZTX0ZGX1NQRUNJQUxCVUlMRAotI2lmbmRlZiBWRVJfU1BFQ0lBTEJVSUxEX1NUUgotI2RlZmluZSBWRVJfU1BFQ0lBTEJVSUxEX1NUUgkJR05VV0lOMzJfU1BFQ0lBTEJVSUxEX1NUUgotI2VuZGlmCi0jZWxzZSAvKiBPRkZJQ0lBTCAqLwotI2RlZmluZSBWRVJfU1BFQ0lBTEJVSUxEICAgICAgICAgICAgMAotI2VuZGlmIC8qIE9GRklDSUFMICovCi0KLSNpZm5kZWYgRklOQUwKLSNkZWZpbmUgVkVSX1BSSVZBVEVCVUlMRCAgICAgICAgICAgIFZTX0ZGX1BSSVZBVEVCVUlMRAotI2lmbmRlZiBWRVJfUFJJVkFURUJVSUxEX1NUUgotI2RlZmluZSBWRVJfUFJJVkFURUJVSUxEX1NUUgkJIlByZS1yZWxlYXNlIgotI2VuZGlmIC8qIFZFUl9QUklWQVRFQlVJTERfU1RSICovCi0jZGVmaW5lIFZFUl9QUkVSRUxFQVNFICAgICAgICAgICAgICBWU19GRl9QUkVSRUxFQVNFCi0jZWxzZSAvKiBGSU5BTCAqLwotI2RlZmluZSBWRVJfUFJJVkFURUJVSUxEICAgICAgICAgICAgMAotI2RlZmluZSBWRVJfUFJFUkVMRUFTRSAgICAgICAgICAgICAgMAotI2VuZGlmIC8qIEZJTkFMICovCi0KLSNkZWZpbmUgVkVSX0ZJTEVGTEFHU01BU0sgICAgICAgICAgIFZTX0ZGSV9GSUxFRkxBR1NNQVNLCi0jZGVmaW5lIFZFUl9GSUxFRkxBR1MgICAgICAgICAgICAgICAoVkVSX1BSSVZBVEVCVUlMRHxWRVJfU1BFQ0lBTEJVSUxEfFZFUl9QUkVSRUxFQVNFfFZFUl9ERUJVR3xWRVJfUEFUQ0hFRCkKLQotI2RlZmluZSBWRVJfRklMRU9TICAgICAgICAgICAgICAgICAgVk9TX19XSU5ET1dTMzIKLQotI2lmZGVmIFJDX0lOVk9LRUQKLQotVlNfVkVSU0lPTl9JTkZPICAgICAgICAgVkVSU0lPTklORk8KLUZJTEVWRVJTSU9OICAgICAJVkVSX0ZJTEVWRVJTSU9OCi1QUk9EVUNUVkVSU0lPTiAgCVZFUl9QUk9EVUNUVkVSU0lPTgotRklMRUZMQUdTTUFTSyAgIAlWRVJfRklMRUZMQUdTTUFTSwotRklMRUZMQUdTICAgICAgIAlWRVJfRklMRUZMQUdTCi1GSUxFT1MgICAgICAgICAgCVZFUl9GSUxFT1MKLUZJTEVUWVBFICAgICAgICAJVkVSX0ZJTEVUWVBFCi1GSUxFU1VCVFlQRSAgICAgCVZFUl9GSUxFU1VCVFlQRQotCi1CRUdJTgotICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKLSAgICBCRUdJTgotCUJMT0NLICIwNDA5MDRFNCIKLSAgICAvKiBsYW5ndWFnZSBJRCA9IFUuUy4gRW5nbGlzaCwgY2hhciBzZXQgPSBXaW5kb3dzLCBNdWx0aWxpbmd1YWwgKi8KLQlCRUdJTgotI2lmZGVmIFZFUl9DT01NRU5UX1NUUgotCSAgICBWQUxVRSAiQ29tbWVudHMiLCAgICAgICAgICBWRVJfQ09NTUVOVF9TVFIKLSNlbmRpZgotCSAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAgICAgIFZFUl9DT01QQU5ZTkFNRV9TVFIKLQkgICAgVkFMVUUgIkxpY2Vuc2UiLAkJICBWRVJfTElDRU5TRV9TVFIKLQkgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICBWRVJfRklMRURFU0NSSVBUSU9OX1NUUgotCSAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAgICAgIFZFUl9GSUxFVkVSU0lPTl9TVFIKLSNpZiAhKFZFUl9GSUxFVFlQRS1WRlRfRExMKQotCSAgICBWQUxVRSAiTGliVG9vbEZpbGVWZXJzaW9uIixWRVJfRklMRUxUVkVSU0lPTl9TVFIKLSNlbmRpZgotCQlWQUxVRSAiSW50ZXJuYWxOYW1lIiwgICAgIFZFUl9JTlRFUk5BTE5BTUVfU1RSCi0jaWZkZWYgVkVSX0xFR0FMQ09QWVJJR0hUX1NUUgotCQlWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAgIFZFUl9MRUdBTENPUFlSSUdIVF9TVFIKLSNlbmRpZgotI2lmZGVmIFZFUl9MRUdBTFRSQURFTUFSS1NfU1RSCi0JICAgIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAgVkVSX0xFR0FMVFJBREVNQVJLU19TVFIKLSNlbmRpZgotCSAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsIFZFUl9PUklHSU5BTEZJTEVOQU1FX1NUUgotCSAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAgICAgIFZFUl9QUk9EVUNUTkFNRV9TVFIKLQkgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgICBWRVJfUFJPRFVDVFZFUlNJT05fU1RSCi0jaWZkZWYgVkVSX1BBVENITEVWRUxfU1RSCi0JICAgIFZBTFVFICJQYXRjaCBsZXZlbCIsICBWRVJfUEFUQ0hMRVZFTF9TVFIKLSNlbmRpZgotI2lmZGVmIFZFUl9QUklWQVRFQlVJTERfU1RSCi0JICAgIFZBTFVFICJQcml2YXRlQnVpbGQiLCAgVkVSX1BSSVZBVEVCVUlMRF9TVFIKLSNlbmRpZgotI2lmZGVmIFZFUl9TUEVDSUFMQlVJTERfU1RSCi0JICAgIFZBTFVFICJTcGVjaWFsQnVpbGQiLCAgVkVSX1NQRUNJQUxCVUlMRF9TVFIKLSNlbmRpZgotRU5ECi0gICAgRU5ECi0gICAgQkxPQ0sgIlZhckZpbGVJbmZvIgotICAgIEJFR0lOCi0JVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyNTIKLSAgICBFTkQKLUVORAotCi0jZW5kaWYgLyogIFJDX0lOVk9LRUQgKi8KLTUwMCBJQ09OIE1PVkVBQkxFIFBVUkUgTE9BRE9OQ0FMTCBESVNDQVJEQUJMRSAiemxpYi5pY28iCmRpZmYgLS1naXQgYS9saWJzL3psaWIvZXhhbXBsZS5jIGIvbGlicy96bGliL2V4YW1wbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4YTBlZS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvZXhhbXBsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY1ICswLDAgQEAKLS8qIGV4YW1wbGUuYyAtLSB1c2FnZSBleGFtcGxlIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInpsaWIuaCIKLQotI2lmZGVmIFNUREMKLSMgIGluY2x1ZGUgPHN0cmluZy5oPgotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKFJJU0NPUykKLSMgIGRlZmluZSBURVNURklMRSAiZm9vLWd6IgotI2Vsc2UKLSMgIGRlZmluZSBURVNURklMRSAiZm9vLmd6IgotI2VuZGlmCi0KLSNkZWZpbmUgQ0hFQ0tfRVJSKGVyciwgbXNnKSB7IFwKLSAgICBpZiAoZXJyICE9IFpfT0spIHsgXAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGVycm9yOiAlZFxuIiwgbXNnLCBlcnIpOyBcCi0gICAgICAgIGV4aXQoMSk7IFwKLSAgICB9IFwKLX0KLQotY29uc3QgY2hhciBoZWxsb1tdID0gImhlbGxvLCBoZWxsbyEiOwotLyogImhlbGxvIHdvcmxkIiB3b3VsZCBiZSBtb3JlIHN0YW5kYXJkLCBidXQgdGhlIHJlcGVhdGVkICJoZWxsbyIKLSAqIHN0cmVzc2VzIHRoZSBjb21wcmVzc2lvbiBjb2RlIGJldHRlciwgc29ycnkuLi4KLSAqLwotCi1jb25zdCBjaGFyIGRpY3Rpb25hcnlbXSA9ICJoZWxsbyI7Ci11TG9uZyBkaWN0SWQ7IC8qIEFkbGVyMzIgdmFsdWUgb2YgdGhlIGRpY3Rpb25hcnkgKi8KLQotdm9pZCB0ZXN0X2NvbXByZXNzICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Ci12b2lkIHRlc3RfZ3ppbyAgICAgICAgICBPRigoY29uc3QgY2hhciAqZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwotdm9pZCB0ZXN0X2RlZmxhdGUgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbikpOwotdm9pZCB0ZXN0X2luZmxhdGUgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Ci12b2lkIHRlc3RfbGFyZ2VfZGVmbGF0ZSBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKLXZvaWQgdGVzdF9sYXJnZV9pbmZsYXRlIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwotdm9pZCB0ZXN0X2ZsdXNoICAgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyAqY29tcHJMZW4pKTsKLXZvaWQgdGVzdF9zeW5jICAgICAgICAgIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwotdm9pZCB0ZXN0X2RpY3RfZGVmbGF0ZSAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbikpOwotdm9pZCB0ZXN0X2RpY3RfaW5mbGF0ZSAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Ci1pbnQgIG1haW4gICAgICAgICAgICAgICBPRigoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkpOwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgY29tcHJlc3MoKSBhbmQgdW5jb21wcmVzcygpCi0gKi8KLXZvaWQgdGVzdF9jb21wcmVzcyhjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCi0gICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOwotICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOwotewotICAgIGludCBlcnI7Ci0gICAgdUxvbmcgbGVuID0gKHVMb25nKXN0cmxlbihoZWxsbykrMTsKLQotICAgIGVyciA9IGNvbXByZXNzKGNvbXByLCAmY29tcHJMZW4sIChjb25zdCBCeXRlZiopaGVsbG8sIGxlbik7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImNvbXByZXNzIik7Ci0KLSAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7Ci0KLSAgICBlcnIgPSB1bmNvbXByZXNzKHVuY29tcHIsICZ1bmNvbXByTGVuLCBjb21wciwgY29tcHJMZW4pOwotICAgIENIRUNLX0VSUihlcnIsICJ1bmNvbXByZXNzIik7Ci0KLSAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgdW5jb21wcmVzc1xuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCJ1bmNvbXByZXNzKCk6ICVzXG4iLCAoY2hhciAqKXVuY29tcHIpOwotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IHJlYWQvd3JpdGUgb2YgLmd6IGZpbGVzCi0gKi8KLXZvaWQgdGVzdF9nemlvKGZuYW1lLCB1bmNvbXByLCB1bmNvbXByTGVuKQotICAgIGNvbnN0IGNoYXIgKmZuYW1lOyAvKiBjb21wcmVzc2VkIGZpbGUgbmFtZSAqLwotICAgIEJ5dGUgKnVuY29tcHI7Ci0gICAgdUxvbmcgdW5jb21wckxlbjsKLXsKLSNpZmRlZiBOT19HWkNPTVBSRVNTCi0gICAgZnByaW50ZihzdGRlcnIsICJOT19HWkNPTVBSRVNTIC0tIGd6KiBmdW5jdGlvbnMgY2Fubm90IGNvbXByZXNzXG4iKTsKLSNlbHNlCi0gICAgaW50IGVycjsKLSAgICBpbnQgbGVuID0gKGludClzdHJsZW4oaGVsbG8pKzE7Ci0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgel9vZmZfdCBwb3M7Ci0KLSAgICBmaWxlID0gZ3pvcGVuKGZuYW1lLCAid2IiKTsKLSAgICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pvcGVuIGVycm9yXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgZ3pwdXRjKGZpbGUsICdoJyk7Ci0gICAgaWYgKGd6cHV0cyhmaWxlLCAiZWxsbyIpICE9IDQpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenB1dHMgZXJyOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGlmIChnenByaW50ZihmaWxlLCAiLCAlcyEiLCAiaGVsbG8iKSAhPSA4KSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pwcmludGYgZXJyOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGd6c2VlayhmaWxlLCAxTCwgU0VFS19DVVIpOyAvKiBhZGQgb25lIHplcm8gYnl0ZSAqLwotICAgIGd6Y2xvc2UoZmlsZSk7Ci0KLSAgICBmaWxlID0gZ3pvcGVuKGZuYW1lLCAicmIiKTsKLSAgICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pvcGVuIGVycm9yXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOwotCi0gICAgaWYgKGd6cmVhZChmaWxlLCB1bmNvbXByLCAodW5zaWduZWQpdW5jb21wckxlbikgIT0gbGVuKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pyZWFkIGVycjogJXNcbiIsIGd6ZXJyb3IoZmlsZSwgJmVycikpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgZ3pyZWFkOiAlc1xuIiwgKGNoYXIqKXVuY29tcHIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiZ3pyZWFkKCk6ICVzXG4iLCAoY2hhciopdW5jb21wcik7Ci0gICAgfQotCi0gICAgcG9zID0gZ3pzZWVrKGZpbGUsIC04TCwgU0VFS19DVVIpOwotICAgIGlmIChwb3MgIT0gNiB8fCBnenRlbGwoZmlsZSkgIT0gcG9zKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pzZWVrIGVycm9yLCBwb3M9JWxkLCBnenRlbGw9JWxkXG4iLAotICAgICAgICAgICAgICAgIChsb25nKXBvcywgKGxvbmcpZ3p0ZWxsKGZpbGUpKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBpZiAoZ3pnZXRjKGZpbGUpICE9ICcgJykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6Z2V0YyBlcnJvclxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgaWYgKGd6dW5nZXRjKCcgJywgZmlsZSkgIT0gJyAnKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3p1bmdldGMgZXJyb3JcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGd6Z2V0cyhmaWxlLCAoY2hhciopdW5jb21wciwgKGludCl1bmNvbXByTGVuKTsKLSAgICBpZiAoc3RybGVuKChjaGFyKil1bmNvbXByKSAhPSA3KSB7IC8qICIgaGVsbG8hIiAqLwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6Z2V0cyBlcnIgYWZ0ZXIgZ3pzZWVrOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvICsgNikpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgZ3pnZXRzIGFmdGVyIGd6c2Vla1xuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCJnemdldHMoKSBhZnRlciBnenNlZWs6ICVzXG4iLCAoY2hhciopdW5jb21wcik7Ci0gICAgfQotCi0gICAgZ3pjbG9zZShmaWxlKTsKLSNlbmRpZgotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgZGVmbGF0ZSgpIHdpdGggc21hbGwgYnVmZmVycwotICovCi12b2lkIHRlc3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pCi0gICAgQnl0ZSAqY29tcHI7Ci0gICAgdUxvbmcgY29tcHJMZW47Ci17Ci0gICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLwotICAgIGludCBlcnI7Ci0gICAgdUxvbmcgbGVuID0gKHVMb25nKXN0cmxlbihoZWxsbykrMTsKLQotICAgIGNfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7Ci0gICAgY19zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0gICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOwotCi0gICAgY19zdHJlYW0ubmV4dF9pbiAgPSAoQnl0ZWYqKWhlbGxvOwotICAgIGNfc3RyZWFtLm5leHRfb3V0ID0gY29tcHI7Ci0KLSAgICB3aGlsZSAoY19zdHJlYW0udG90YWxfaW4gIT0gbGVuICYmIGNfc3RyZWFtLnRvdGFsX291dCA8IGNvbXByTGVuKSB7Ci0gICAgICAgIGNfc3RyZWFtLmF2YWlsX2luID0gY19zdHJlYW0uYXZhaWxfb3V0ID0gMTsgLyogZm9yY2Ugc21hbGwgYnVmZmVycyAqLwotICAgICAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlIik7Ci0gICAgfQotICAgIC8qIEZpbmlzaCB0aGUgc3RyZWFtLCBzdGlsbCBmb3JjaW5nIHNtYWxsIGJ1ZmZlcnM6ICovCi0gICAgZm9yICg7OykgewotICAgICAgICBjX3N0cmVhbS5hdmFpbF9vdXQgPSAxOwotICAgICAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9GSU5JU0gpOwotICAgICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgYnJlYWs7Ci0gICAgICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlIik7Ci0gICAgfQotCi0gICAgZXJyID0gZGVmbGF0ZUVuZCgmY19zdHJlYW0pOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlRW5kIik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBpbmZsYXRlKCkgd2l0aCBzbWFsbCBidWZmZXJzCi0gKi8KLXZvaWQgdGVzdF9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKLSAgICBCeXRlICpjb21wciwgKnVuY29tcHI7Ci0gICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Ci17Ci0gICAgaW50IGVycjsKLSAgICB6X3N0cmVhbSBkX3N0cmVhbTsgLyogZGVjb21wcmVzc2lvbiBzdHJlYW0gKi8KLQotICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKLQotICAgIGRfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7Ci0gICAgZF9zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0gICAgZF9zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgZF9zdHJlYW0ubmV4dF9pbiAgPSBjb21wcjsKLSAgICBkX3N0cmVhbS5hdmFpbF9pbiA9IDA7Ci0gICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOwotCi0gICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKLQotICAgIHdoaWxlIChkX3N0cmVhbS50b3RhbF9vdXQgPCB1bmNvbXByTGVuICYmIGRfc3RyZWFtLnRvdGFsX2luIDwgY29tcHJMZW4pIHsKLSAgICAgICAgZF9zdHJlYW0uYXZhaWxfaW4gPSBkX3N0cmVhbS5hdmFpbF9vdXQgPSAxOyAvKiBmb3JjZSBzbWFsbCBidWZmZXJzICovCi0gICAgICAgIGVyciA9IGluZmxhdGUoJmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIGJyZWFrOwotICAgICAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZSIpOwotICAgIH0KLQotICAgIGVyciA9IGluZmxhdGVFbmQoJmRfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUVuZCIpOwotCi0gICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8pKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGluZmxhdGVcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiaW5mbGF0ZSgpOiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBkZWZsYXRlKCkgd2l0aCBsYXJnZSBidWZmZXJzIGFuZCBkeW5hbWljIGNoYW5nZSBvZiBjb21wcmVzc2lvbiBsZXZlbAotICovCi12b2lkIHRlc3RfbGFyZ2VfZGVmbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCi0gICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOwotICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOwotewotICAgIHpfc3RyZWFtIGNfc3RyZWFtOyAvKiBjb21wcmVzc2lvbiBzdHJlYW0gKi8KLSAgICBpbnQgZXJyOwotCi0gICAgY19zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBjX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLSAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7Ci0KLSAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfQkVTVF9TUEVFRCk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7Ci0KLSAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOwotICAgIGNfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KWNvbXByTGVuOwotCi0gICAgLyogQXQgdGhpcyBwb2ludCwgdW5jb21wciBpcyBzdGlsbCBtb3N0bHkgemVyb2VzLCBzbyBpdCBzaG91bGQgY29tcHJlc3MKLSAgICAgKiB2ZXJ5IHdlbGw6Ci0gICAgICovCi0gICAgY19zdHJlYW0ubmV4dF9pbiA9IHVuY29tcHI7Ci0gICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1bmNvbXByTGVuOwotICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotICAgIGlmIChjX3N0cmVhbS5hdmFpbF9pbiAhPSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBub3QgZ3JlZWR5XG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICAvKiBGZWVkIGluIGFscmVhZHkgY29tcHJlc3NlZCBkYXRhIGFuZCBzd2l0Y2ggdG8gbm8gY29tcHJlc3Npb246ICovCi0gICAgZGVmbGF0ZVBhcmFtcygmY19zdHJlYW0sIFpfTk9fQ09NUFJFU1NJT04sIFpfREVGQVVMVF9TVFJBVEVHWSk7Ci0gICAgY19zdHJlYW0ubmV4dF9pbiA9IGNvbXByOwotICAgIGNfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW4vMjsKLSAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKLQotICAgIC8qIFN3aXRjaCBiYWNrIHRvIGNvbXByZXNzaW5nIG1vZGU6ICovCi0gICAgZGVmbGF0ZVBhcmFtcygmY19zdHJlYW0sIFpfQkVTVF9DT01QUkVTU0lPTiwgWl9GSUxURVJFRCk7Ci0gICAgY19zdHJlYW0ubmV4dF9pbiA9IHVuY29tcHI7Ci0gICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1bmNvbXByTGVuOwotICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotCi0gICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKLSAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlZmxhdGUgc2hvdWxkIHJlcG9ydCBaX1NUUkVBTV9FTkRcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBlcnIgPSBkZWZsYXRlRW5kKCZjX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVFbmQiKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGluZmxhdGUoKSB3aXRoIGxhcmdlIGJ1ZmZlcnMKLSAqLwotdm9pZCB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQotICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKLSAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKLXsKLSAgICBpbnQgZXJyOwotICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLwotCi0gICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOwotCi0gICAgZF9zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBkX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLSAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7Ci0KLSAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOwotICAgIGRfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW47Ci0KLSAgICBlcnIgPSBpbmZsYXRlSW5pdCgmZF9zdHJlYW0pOwotICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlSW5pdCIpOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBkX3N0cmVhbS5uZXh0X291dCA9IHVuY29tcHI7ICAgICAgICAgICAgLyogZGlzY2FyZCB0aGUgb3V0cHV0ICovCi0gICAgICAgIGRfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXVuY29tcHJMZW47Ci0gICAgICAgIGVyciA9IGluZmxhdGUoJmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIGJyZWFrOwotICAgICAgICBDSEVDS19FUlIoZXJyLCAibGFyZ2UgaW5mbGF0ZSIpOwotICAgIH0KLQotICAgIGVyciA9IGluZmxhdGVFbmQoJmRfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUVuZCIpOwotCi0gICAgaWYgKGRfc3RyZWFtLnRvdGFsX291dCAhPSAyKnVuY29tcHJMZW4gKyBjb21wckxlbi8yKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGxhcmdlIGluZmxhdGU6ICVsZFxuIiwgZF9zdHJlYW0udG90YWxfb3V0KTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoImxhcmdlX2luZmxhdGUoKTogT0tcbiIpOwotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGRlZmxhdGUoKSB3aXRoIGZ1bGwgZmx1c2gKLSAqLwotdm9pZCB0ZXN0X2ZsdXNoKGNvbXByLCBjb21wckxlbikKLSAgICBCeXRlICpjb21wcjsKLSAgICB1TG9uZyAqY29tcHJMZW47Ci17Ci0gICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLwotICAgIGludCBlcnI7Ci0gICAgdUludCBsZW4gPSAodUludClzdHJsZW4oaGVsbG8pKzE7Ci0KLSAgICBjX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIGNfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOwotICAgIGNfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKLQotICAgIGVyciA9IGRlZmxhdGVJbml0KCZjX3N0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUluaXQiKTsKLQotICAgIGNfc3RyZWFtLm5leHRfaW4gID0gKEJ5dGVmKiloZWxsbzsKLSAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOwotICAgIGNfc3RyZWFtLmF2YWlsX2luID0gMzsKLSAgICBjX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCkqY29tcHJMZW47Ci0gICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRlVMTF9GTFVTSCk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKLQotICAgIGNvbXByWzNdKys7IC8qIGZvcmNlIGFuIGVycm9yIGluIGZpcnN0IGNvbXByZXNzZWQgYmxvY2sgKi8KLSAgICBjX3N0cmVhbS5hdmFpbF9pbiA9IGxlbiAtIDM7Ci0KLSAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9GSU5JU0gpOwotICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlIik7Ci0gICAgfQotICAgIGVyciA9IGRlZmxhdGVFbmQoJmNfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUVuZCIpOwotCi0gICAgKmNvbXByTGVuID0gY19zdHJlYW0udG90YWxfb3V0OwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgaW5mbGF0ZVN5bmMoKQotICovCi12b2lkIHRlc3Rfc3luYyhjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCi0gICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOwotICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOwotewotICAgIGludCBlcnI7Ci0gICAgel9zdHJlYW0gZF9zdHJlYW07IC8qIGRlY29tcHJlc3Npb24gc3RyZWFtICovCi0KLSAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7Ci0KLSAgICBkX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIGRfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOwotICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKLQotICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7Ci0gICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAyOyAvKiBqdXN0IHJlYWQgdGhlIHpsaWIgaGVhZGVyICovCi0KLSAgICBlcnIgPSBpbmZsYXRlSW5pdCgmZF9zdHJlYW0pOwotICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlSW5pdCIpOwotCi0gICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOwotICAgIGRfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXVuY29tcHJMZW47Ci0KLSAgICBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGUiKTsKLQotICAgIGRfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW4tMjsgICAvKiByZWFkIGFsbCBjb21wcmVzc2VkIGRhdGEgKi8KLSAgICBlcnIgPSBpbmZsYXRlU3luYygmZF9zdHJlYW0pOyAgICAgICAgICAgLyogYnV0IHNraXAgdGhlIGRhbWFnZWQgcGFydCAqLwotICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlU3luYyIpOwotCi0gICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfRklOSVNIKTsKLSAgICBpZiAoZXJyICE9IFpfREFUQV9FUlJPUikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluZmxhdGUgc2hvdWxkIHJlcG9ydCBEQVRBX0VSUk9SXG4iKTsKLSAgICAgICAgLyogQmVjYXVzZSBvZiBpbmNvcnJlY3QgYWRsZXIzMiAqLwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKLQotICAgIHByaW50ZigiYWZ0ZXIgaW5mbGF0ZVN5bmMoKTogaGVsJXNcbiIsIChjaGFyICopdW5jb21wcik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBkZWZsYXRlKCkgd2l0aCBwcmVzZXQgZGljdGlvbmFyeQotICovCi12b2lkIHRlc3RfZGljdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbikKLSAgICBCeXRlICpjb21wcjsKLSAgICB1TG9uZyBjb21wckxlbjsKLXsKLSAgICB6X3N0cmVhbSBjX3N0cmVhbTsgLyogY29tcHJlc3Npb24gc3RyZWFtICovCi0gICAgaW50IGVycjsKLQotICAgIGNfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7Ci0gICAgY19zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0gICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0JFU1RfQ09NUFJFU1NJT04pOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOwotCi0gICAgZXJyID0gZGVmbGF0ZVNldERpY3Rpb25hcnkoJmNfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBCeXRlZiopZGljdGlvbmFyeSwgc2l6ZW9mKGRpY3Rpb25hcnkpKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZVNldERpY3Rpb25hcnkiKTsKLQotICAgIGRpY3RJZCA9IGNfc3RyZWFtLmFkbGVyOwotICAgIGNfc3RyZWFtLm5leHRfb3V0ID0gY29tcHI7Ci0gICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpY29tcHJMZW47Ci0KLSAgICBjX3N0cmVhbS5uZXh0X2luID0gKEJ5dGVmKiloZWxsbzsKLSAgICBjX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXN0cmxlbihoZWxsbykrMTsKLQotICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWZsYXRlIHNob3VsZCByZXBvcnQgWl9TVFJFQU1fRU5EXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgZXJyID0gZGVmbGF0ZUVuZCgmY19zdHJlYW0pOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlRW5kIik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBpbmZsYXRlKCkgd2l0aCBhIHByZXNldCBkaWN0aW9uYXJ5Ci0gKi8KLXZvaWQgdGVzdF9kaWN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQotICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKLSAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKLXsKLSAgICBpbnQgZXJyOwotICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLwotCi0gICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOwotCi0gICAgZF9zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBkX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLSAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7Ci0KLSAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOwotICAgIGRfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW47Ci0KLSAgICBlcnIgPSBpbmZsYXRlSW5pdCgmZF9zdHJlYW0pOwotICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlSW5pdCIpOwotCi0gICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOwotICAgIGRfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXVuY29tcHJMZW47Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGVyciA9IGluZmxhdGUoJmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIGJyZWFrOwotICAgICAgICBpZiAoZXJyID09IFpfTkVFRF9ESUNUKSB7Ci0gICAgICAgICAgICBpZiAoZF9zdHJlYW0uYWRsZXIgIT0gZGljdElkKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmV4cGVjdGVkIGRpY3Rpb25hcnkiKTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gaW5mbGF0ZVNldERpY3Rpb25hcnkoJmRfc3RyZWFtLCAoY29uc3QgQnl0ZWYqKWRpY3Rpb25hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGljdGlvbmFyeSkpOwotICAgICAgICB9Ci0gICAgICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlIHdpdGggZGljdCIpOwotICAgIH0KLQotICAgIGVyciA9IGluZmxhdGVFbmQoJmRfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUVuZCIpOwotCi0gICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8pKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGluZmxhdGUgd2l0aCBkaWN0XG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoImluZmxhdGUgd2l0aCBkaWN0aW9uYXJ5OiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVXNhZ2U6ICBleGFtcGxlIFtvdXRwdXQuZ3ogIFtpbnB1dC5nel1dCi0gKi8KLQotaW50IG1haW4oYXJnYywgYXJndikKLSAgICBpbnQgYXJnYzsKLSAgICBjaGFyICphcmd2W107Ci17Ci0gICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOwotICAgIHVMb25nIGNvbXByTGVuID0gMTAwMDAqc2l6ZW9mKGludCk7IC8qIGRvbid0IG92ZXJmbG93IG9uIE1TRE9TICovCi0gICAgdUxvbmcgdW5jb21wckxlbiA9IGNvbXByTGVuOwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBteVZlcnNpb24gPSBaTElCX1ZFUlNJT047Ci0KLSAgICBpZiAoemxpYlZlcnNpb24oKVswXSAhPSBteVZlcnNpb25bMF0pIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvbXBhdGlibGUgemxpYiB2ZXJzaW9uXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLQotICAgIH0gZWxzZSBpZiAoc3RyY21wKHpsaWJWZXJzaW9uKCksIFpMSUJfVkVSU0lPTikgIT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IGRpZmZlcmVudCB6bGliIHZlcnNpb25cbiIpOwotICAgIH0KLQotICAgIHByaW50ZigiemxpYiB2ZXJzaW9uICVzID0gMHglMDR4LCBjb21waWxlIGZsYWdzID0gMHglbHhcbiIsCi0gICAgICAgICAgICBaTElCX1ZFUlNJT04sIFpMSUJfVkVSTlVNLCB6bGliQ29tcGlsZUZsYWdzKCkpOwotCi0gICAgY29tcHIgICAgPSAoQnl0ZSopY2FsbG9jKCh1SW50KWNvbXByTGVuLCAxKTsKLSAgICB1bmNvbXByICA9IChCeXRlKiljYWxsb2MoKHVJbnQpdW5jb21wckxlbiwgMSk7Ci0gICAgLyogY29tcHIgYW5kIHVuY29tcHIgYXJlIGNsZWFyZWQgdG8gYXZvaWQgcmVhZGluZyB1bmluaXRpYWxpemVkCi0gICAgICogZGF0YSBhbmQgdG8gZW5zdXJlIHRoYXQgdW5jb21wciBjb21wcmVzc2VzIHdlbGwuCi0gICAgICovCi0gICAgaWYgKGNvbXByID09IFpfTlVMTCB8fCB1bmNvbXByID09IFpfTlVMTCkgewotICAgICAgICBwcmludGYoIm91dCBvZiBtZW1vcnlcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICB0ZXN0X2NvbXByZXNzKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7Ci0KLSAgICB0ZXN0X2d6aW8oKGFyZ2MgPiAxID8gYXJndlsxXSA6IFRFU1RGSUxFKSwKLSAgICAgICAgICAgICAgdW5jb21wciwgdW5jb21wckxlbik7Ci0KLSAgICB0ZXN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKTsKLSAgICB0ZXN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLQotICAgIHRlc3RfbGFyZ2VfZGVmbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwotICAgIHRlc3RfbGFyZ2VfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwotCi0gICAgdGVzdF9mbHVzaChjb21wciwgJmNvbXByTGVuKTsKLSAgICB0ZXN0X3N5bmMoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLSAgICBjb21wckxlbiA9IHVuY29tcHJMZW47Ci0KLSAgICB0ZXN0X2RpY3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pOwotICAgIHRlc3RfZGljdF9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7Ci0KLSAgICBmcmVlKGNvbXByKTsKLSAgICBmcmVlKHVuY29tcHIpOwotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJzL3psaWIvZXhhbXBsZXMvUkVBRE1FLmV4YW1wbGVzIGIvbGlicy96bGliL2V4YW1wbGVzL1JFQURNRS5leGFtcGxlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzMmQ3YS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvZXhhbXBsZXMvUkVBRE1FLmV4YW1wbGVzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZXhhbXBsZXMgb2YgdGhlIHVzZSBvZiB6bGliLgotCi1maXRibGsuYwotICAgIGNvbXByZXNzIGp1c3QgZW5vdWdoIGlucHV0IHRvIG5lYXJseSBmaWxsIGEgcmVxdWVzdGVkIG91dHB1dCBzaXplCi0gICAgLSB6bGliIGlzbid0IGRlc2lnbmVkIHRvIGRvIHRoaXMsIGJ1dCBmaXRibGsgZG9lcyBpdCBhbnl3YXkKLQotZ3VuLmMKLSAgICB1bmNvbXByZXNzIGEgZ3ppcCBmaWxlCi0gICAgLSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIGluZmxhdGVCYWNrKCkgZm9yIGhpZ2ggc3BlZWQgZmlsZS10by1maWxlCi0gICAgICBkZWNvbXByZXNzaW9uIHVzaW5nIGNhbGwtYmFjayBmdW5jdGlvbnMKLSAgICAtIGlzIGFwcHJveGltYXRlbHkgdHdpY2UgYXMgZmFzdCBhcyBnemlwIC1kCi0gICAgLSBhbHNvIHByb3ZpZGVzIFVuaXggdW5jb21wcmVzcyBmdW5jdGlvbmFsaXR5LCBhZ2FpbiB0d2ljZSBhcyBmYXN0Ci0KLWd6YXBwZW5kLmMKLSAgICBhcHBlbmQgdG8gYSBnemlwIGZpbGUKLSAgICAtIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIFpfQkxPQ0sgZmx1c2ggcGFyYW1ldGVyIGZvciBpbmZsYXRlKCkKLSAgICAtIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgZGVmbGF0ZVByaW1lKCkgdG8gc3RhcnQgYXQgYW55IGJpdAotCi1nempvaW4uYwotICAgIGpvaW4gZ3ppcCBmaWxlcyB3aXRob3V0IHJlY2FsY3VsYXRpbmcgdGhlIGNyYyBvciByZWNvbXByZXNzaW5nCi0gICAgLSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBaX0JMT0NLIGZsdXNoIHBhcmFtZXRlciBmb3IgaW5mbGF0ZSgpCi0gICAgLSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIGNyYzMyX2NvbWJpbmUoKQotCi1nemxvZy5jCi1nemxvZy5oCi0gICAgZWZmaWNpZW50bHkgbWFpbnRhaW4gYSBtZXNzYWdlIGxvZyBmaWxlIGluIGd6aXAgZm9ybWF0Ci0gICAgLSBpbGx1c3RyYXRlcyB1c2Ugb2YgcmF3IGRlZmxhdGUgYW5kIFpfU1lOQ19GTFVTSAotICAgIC0gaWxsdXN0cmF0ZXMgdXNlIG9mIGd6aXAgaGVhZGVyIGV4dHJhIGZpZWxkCi0KLXpsaWJfaG93Lmh0bWwKLSAgICBwYWluZnVsbHkgY29tcHJlaGVuc2l2ZSBkZXNjcmlwdGlvbiBvZiB6cGlwZS5jIChzZWUgYmVsb3cpCi0gICAgLSBkZXNjcmliZXMgaW4gZXhjcnVjaWF0aW5nIGRldGFpbCB0aGUgdXNlIG9mIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpCi0KLXpwaXBlLmMKLSAgICByZWFkcyBhbmQgd3JpdGVzIHpsaWIgc3RyZWFtcyBmcm9tIHN0ZGluIHRvIHN0ZG91dAotICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHByb3BlciB1c2Ugb2YgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkKLSAgICAtIGRlZXBseSBjb21tZW50ZWQgaW4gemxpYl9ob3cuaHRtbCAoc2VlIGFib3ZlKQotCi16cmFuLmMKLSAgICBpbmRleCBhIHpsaWIgb3IgZ3ppcCBzdHJlYW0gYW5kIHJhbmRvbWx5IGFjY2VzcyBpdAotICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBaX0JMT0NLLCBpbmZsYXRlUHJpbWUoKSwgYW5kCi0gICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIHRvIHByb3ZpZGUgcmFuZG9tIGFjY2VzcwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2V4YW1wbGVzL2ZpdGJsay5jIGIvbGlicy96bGliL2V4YW1wbGVzL2ZpdGJsay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjFkZTVjLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9leGFtcGxlcy9maXRibGsuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKiBmaXRibGsuYzogZXhhbXBsZSBvZiBmaXR0aW5nIGNvbXByZXNzZWQgb3V0cHV0IHRvIGEgc3BlY2lmaWVkIHNpemUKLSAgIE5vdCBjb3B5cmlnaHRlZCAtLSBwcm92aWRlZCB0byB0aGUgcHVibGljIGRvbWFpbgotICAgVmVyc2lvbiAxLjEgIDI1IE5vdmVtYmVyIDIwMDQgIE1hcmsgQWRsZXIgKi8KLQotLyogVmVyc2lvbiBoaXN0b3J5OgotICAgMS4wICAyNCBOb3YgMjAwNCAgRmlyc3QgdmVyc2lvbgotICAgMS4xICAyNSBOb3YgMjAwNCAgQ2hhbmdlIGRlZmxhdGVJbml0MigpIHRvIGRlZmxhdGVJbml0KCkKLSAgICAgICAgICAgICAgICAgICAgIFVzZSBmaXhlZC1zaXplLCBzdGFjay1hbGxvY2F0ZWQgcmF3IGJ1ZmZlcnMKLSAgICAgICAgICAgICAgICAgICAgIFNpbXBsaWZ5IGNvZGUgbW92aW5nIGNvbXByZXNzaW9uIHRvIHN1YnJvdXRpbmVzCi0gICAgICAgICAgICAgICAgICAgICBVc2UgYXNzZXJ0KCkgZm9yIGludGVybmFsIGVycm9ycwotICAgICAgICAgICAgICAgICAgICAgQWRkIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFwcHJvYWNoCi0gKi8KLQotLyogQXBwcm9hY2ggdG8ganVzdCBmaXR0aW5nIGEgcmVxdWVzdGVkIGNvbXByZXNzZWQgc2l6ZToKLQotICAgZml0YmxrIHBlcmZvcm1zIHRocmVlIGNvbXByZXNzaW9uIHBhc3NlcyBvbiBhIHBvcnRpb24gb2YgdGhlIGlucHV0Ci0gICBkYXRhIGluIG9yZGVyIHRvIGRldGVybWluZSBob3cgbXVjaCBvZiB0aGF0IGlucHV0IHdpbGwgY29tcHJlc3MgdG8KLSAgIG5lYXJseSB0aGUgcmVxdWVzdGVkIG91dHB1dCBibG9jayBzaXplLiAgVGhlIGZpcnN0IHBhc3MgZ2VuZXJhdGVzCi0gICBlbm91Z2ggZGVmbGF0ZSBibG9ja3MgdG8gcHJvZHVjZSBvdXRwdXQgdG8gZmlsbCB0aGUgcmVxdWVzdGVkCi0gICBvdXRwdXQgc2l6ZSBwbHVzIGEgc3BlY2ZpZWQgZXhjZXNzIGFtb3VudCAoc2VlIHRoZSBFWENFU1MgZGVmaW5lCi0gICBiZWxvdykuICBUaGUgbGFzdCBkZWZsYXRlIGJsb2NrIG1heSBnbyBxdWl0ZSBhIGJpdCBwYXN0IHRoYXQsIGJ1dAotICAgaXMgZGlzY2FyZGVkLiAgVGhlIHNlY29uZCBwYXNzIGRlY29tcHJlc3NlcyBhbmQgcmVjb21wcmVzc2VzIGp1c3QKLSAgIHRoZSBjb21wcmVzc2VkIGRhdGEgdGhhdCBmaXQgaW4gdGhlIHJlcXVlc3RlZCBwbHVzIGV4Y2VzcyBzaXplZAotICAgYnVmZmVyLiAgVGhlIGRlZmxhdGUgcHJvY2VzcyBpcyB0ZXJtaW5hdGVkIGFmdGVyIHRoYXQgYW1vdW50IG9mCi0gICBpbnB1dCwgd2hpY2ggaXMgbGVzcyB0aGFuIHRoZSBhbW91bnQgY29uc3VtZWQgb24gdGhlIGZpcnN0IHBhc3MuCi0gICBUaGUgbGFzdCBkZWZsYXRlIGJsb2NrIG9mIHRoZSByZXN1bHQgd2lsbCBiZSBvZiBhIGNvbXBhcmFibGUgc2l6ZQotICAgdG8gdGhlIGZpbmFsIHByb2R1Y3QsIHNvIHRoYXQgdGhlIGhlYWRlciBmb3IgdGhhdCBkZWZsYXRlIGJsb2NrIGFuZAotICAgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGZvciB0aGF0IGJsb2NrIHdpbGwgYmUgYWJvdXQgdGhlIHNhbWUgYXMgaW4KLSAgIHRoZSBmaW5hbCBwcm9kdWN0LiAgVGhlIHRoaXJkIGNvbXByZXNzaW9uIHBhc3MgZGVjb21wcmVzc2VzIHRoZQotICAgcmVzdWx0IG9mIHRoZSBzZWNvbmQgc3RlcCwgYnV0IG9ubHkgdGhlIGNvbXByZXNzZWQgZGF0YSB1cCB0byB0aGUKLSAgIHJlcXVlc3RlZCBzaXplIG1pbnVzIGFuIGFtb3VudCB0byBhbGxvdyB0aGUgY29tcHJlc3NlZCBzdHJlYW0gdG8KLSAgIGNvbXBsZXRlIChzZWUgdGhlIE1BUkdJTiBkZWZpbmUgYmVsb3cpLiAgVGhhdCB3aWxsIHJlc3VsdCBpbiBhCi0gICBmaW5hbCBjb21wcmVzc2VkIHN0cmVhbSB3aG9zZSBsZW5ndGggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQotICAgcmVxdWVzdGVkIHNpemUuICBBc3N1bWluZyBzdWZmaWNpZW50IGlucHV0IGFuZCBhIHJlcXVlc3RlZCBzaXplCi0gICBncmVhdGVyIHRoYW4gYSBmZXcgaHVuZHJlZCBieXRlcywgdGhlIHNob3J0ZmFsbCB3aWxsIHR5cGljYWxseSBiZQotICAgbGVzcyB0aGFuIHRlbiBieXRlcy4KLQotICAgSWYgdGhlIGlucHV0IGlzIHNob3J0IGVub3VnaCB0aGF0IHRoZSBmaXJzdCBjb21wcmVzc2lvbiBjb21wbGV0ZXMKLSAgIGJlZm9yZSBmaWxsaW5nIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IHNpemUsIHRoZW4gdGhhdCBjb21wcmVzc2VkCi0gICBzdHJlYW0gaXMgcmV0dXJuIHdpdGggbm8gcmVjb21wcmVzc2lvbi4KLQotICAgRVhDRVNTIGlzIGNob3NlbiB0byBiZSBqdXN0IGdyZWF0ZXIgdGhhbiB0aGUgc2hvcnRmYWxsIHNlZW4gaW4gYQotICAgdHdvIHBhc3MgYXBwcm9hY2ggc2ltaWxhciB0byB0aGUgYWJvdmUuICBUaGF0IHNob3J0ZmFsbCBpcyBkdWUgdG8KLSAgIHRoZSBsYXN0IGRlZmxhdGUgYmxvY2sgY29tcHJlc3NpbmcgbW9yZSBlZmZpY2llbnRseSB3aXRoIGEgc21hbGxlcgotICAgaGVhZGVyIG9uIHRoZSBzZWNvbmQgcGFzcy4gIEVYQ0VTUyBpcyBzZXQgdG8gYmUgbGFyZ2UgZW5vdWdoIHNvCi0gICB0aGF0IHRoZXJlIGlzIGVub3VnaCB1bmNvbXByZXNzZWQgZGF0YSBmb3IgdGhlIHNlY29uZCBwYXNzIHRvIGZpbGwKLSAgIG91dCB0aGUgcmVxdWVzdGVkIHNpemUsIGFuZCBzbWFsbCBlbm91Z2ggc28gdGhhdCB0aGUgZmluYWwgZGVmbGF0ZQotICAgYmxvY2sgb2YgdGhlIHNlY29uZCBwYXNzIHdpbGwgYmUgY2xvc2UgaW4gc2l6ZSB0byB0aGUgZmluYWwgZGVmbGF0ZQotICAgYmxvY2sgb2YgdGhlIHRoaXJkIGFuZCBmaW5hbCBwYXNzLiAgTUFSR0lOIGlzIGNob3NlbiB0byBiZSBqdXN0Ci0gICBsYXJnZSBlbm91Z2ggdG8gYXNzdXJlIHRoYXQgdGhlIGZpbmFsIGNvbXByZXNzaW9uIGhhcyBlbm91Z2ggcm9vbQotICAgdG8gY29tcGxldGUgaW4gYWxsIGNhc2VzLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgInpsaWIuaCIKLQotI2RlZmluZSBsb2NhbCBzdGF0aWMKLQotLyogcHJpbnQgbmFzdHlncmFtIGFuZCBsZWF2ZSAqLwotbG9jYWwgdm9pZCBxdWl0KGNoYXIgKndoeSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImZpdGJsayBhYm9ydDogJXNcbiIsIHdoeSk7Ci0gICAgZXhpdCgxKTsKLX0KLQotI2RlZmluZSBSQVdMRU4gNDA5NiAgICAvKiBpbnRlcm1lZGlhdGUgdW5jb21wcmVzc2VkIGJ1ZmZlciBzaXplICovCi0KLS8qIGNvbXByZXNzIGZyb20gZmlsZSB0byBkZWYgdW50aWwgcHJvdmlkZWQgYnVmZmVyIGlzIGZ1bGwgb3IgZW5kIG9mCi0gICBpbnB1dCByZWFjaGVkOyByZXR1cm4gbGFzdCBkZWZsYXRlKCkgcmV0dXJuIHZhbHVlLCBvciBaX0VSUk5PIGlmCi0gICB0aGVyZSB3YXMgcmVhZCBlcnJvciBvbiB0aGUgZmlsZSAqLwotbG9jYWwgaW50IHBhcnRjb21wcmVzcyhGSUxFICppbiwgel9zdHJlYW1wIGRlZikKLXsKLSAgICBpbnQgcmV0LCBmbHVzaDsKLSAgICB1bnNpZ25lZCBjaGFyIHJhd1tSQVdMRU5dOwotCi0gICAgZmx1c2ggPSBaX05PX0ZMVVNIOwotICAgIGRvIHsKLSAgICAgICAgZGVmLT5hdmFpbF9pbiA9IGZyZWFkKHJhdywgMSwgUkFXTEVOLCBpbik7Ci0gICAgICAgIGlmIChmZXJyb3IoaW4pKQotICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87Ci0gICAgICAgIGRlZi0+bmV4dF9pbiA9IHJhdzsKLSAgICAgICAgaWYgKGZlb2YoaW4pKQotICAgICAgICAgICAgZmx1c2ggPSBaX0ZJTklTSDsKLSAgICAgICAgcmV0ID0gZGVmbGF0ZShkZWYsIGZsdXNoKTsKLSAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7Ci0gICAgfSB3aGlsZSAoZGVmLT5hdmFpbF9vdXQgIT0gMCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi0vKiByZWNvbXByZXNzIGZyb20gaW5mJ3MgaW5wdXQgdG8gZGVmJ3Mgb3V0cHV0OyB0aGUgaW5wdXQgZm9yIGluZiBhbmQKLSAgIHRoZSBvdXRwdXQgZm9yIGRlZiBhcmUgc2V0IGluIHRob3NlIHN0cnVjdHVyZXMgYmVmb3JlIGNhbGxpbmc7Ci0gICByZXR1cm4gbGFzdCBkZWZsYXRlKCkgcmV0dXJuIHZhbHVlLCBvciBaX01FTV9FUlJPUiBpZiBpbmZsYXRlKCkKLSAgIHdhcyBub3QgYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IHdoZW4gaXQgbmVlZGVkIHRvICovCi1sb2NhbCBpbnQgcmVjb21wcmVzcyh6X3N0cmVhbXAgaW5mLCB6X3N0cmVhbXAgZGVmKQotewotICAgIGludCByZXQsIGZsdXNoOwotICAgIHVuc2lnbmVkIGNoYXIgcmF3W1JBV0xFTl07Ci0KLSAgICBmbHVzaCA9IFpfTk9fRkxVU0g7Ci0gICAgZG8gewotICAgICAgICAvKiBkZWNvbXByZXNzICovCi0gICAgICAgIGluZi0+YXZhaWxfb3V0ID0gUkFXTEVOOwotICAgICAgICBpbmYtPm5leHRfb3V0ID0gcmF3OwotICAgICAgICByZXQgPSBpbmZsYXRlKGluZiwgWl9OT19GTFVTSCk7Ci0gICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IgJiYgcmV0ICE9IFpfREFUQV9FUlJPUiAmJgotICAgICAgICAgICAgICAgcmV0ICE9IFpfTkVFRF9ESUNUKTsKLSAgICAgICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUikKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgLyogY29tcHJlc3Mgd2hhdCB3YXMgZGVjb21wcmVzZWQgdW50aWwgZG9uZSBvciBubyByb29tICovCi0gICAgICAgIGRlZi0+YXZhaWxfaW4gPSBSQVdMRU4gLSBpbmYtPmF2YWlsX291dDsKLSAgICAgICAgZGVmLT5uZXh0X2luID0gcmF3OwotICAgICAgICBpZiAoaW5mLT5hdmFpbF9vdXQgIT0gMCkKLSAgICAgICAgICAgIGZsdXNoID0gWl9GSU5JU0g7Ci0gICAgICAgIHJldCA9IGRlZmxhdGUoZGVmLCBmbHVzaCk7Ci0gICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOwotICAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQgJiYgZGVmLT5hdmFpbF9vdXQgIT0gMCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBFWENFU1MgMjU2ICAgICAgLyogZW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBzdHJlYW0gb3ZlcmFnZSAqLwotI2RlZmluZSBNQVJHSU4gOCAgICAgICAgLyogYW1vdW50IHRvIGJhY2sgb2ZmIGZvciBjb21wbGV0aW9uICovCi0KLS8qIGNvbXByZXNzIGZyb20gc3RkaW4gdG8gZml4ZWQtc2l6ZSBibG9jayBvbiBzdGRvdXQgKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqLwotICAgIHVuc2lnbmVkIHNpemU7ICAgICAgICAgIC8qIHJlcXVlc3RlZCBmaXhlZCBvdXRwdXQgYmxvY2sgc2l6ZSAqLwotICAgIHVuc2lnbmVkIGhhdmU7ICAgICAgICAgIC8qIGJ5dGVzIHdyaXR0ZW4gYnkgZGVmbGF0ZSgpIGNhbGwgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpibGs7ICAgICAvKiBpbnRlcm1lZGlhdGUgYW5kIGZpbmFsIHN0cmVhbSAqLwotICAgIHVuc2lnbmVkIGNoYXIgKnRtcDsgICAgIC8qIGNsb3NlIHRvIGRlc2lyZWQgc2l6ZSBzdHJlYW0gKi8KLSAgICB6X3N0cmVhbSBkZWYsIGluZjsgICAgICAvKiB6bGliIGRlZmxhdGUgYW5kIGluZmxhdGUgc3RhdGVzICovCi0KLSAgICAvKiBnZXQgcmVxdWVzdGVkIG91dHB1dCBzaXplICovCi0gICAgaWYgKGFyZ2MgIT0gMikKLSAgICAgICAgcXVpdCgibmVlZCBvbmUgYXJndW1lbnQ6IHNpemUgb2Ygb3V0cHV0IGJsb2NrIik7Ci0gICAgcmV0ID0gc3RydG9sKGFyZ3ZbMV0sIGFyZ3YgKyAxLCAxMCk7Ci0gICAgaWYgKGFyZ3ZbMV1bMF0gIT0gMCkKLSAgICAgICAgcXVpdCgiYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpOwotICAgIGlmIChyZXQgPCA4KSAgICAgICAgICAgIC8qIDggaXMgbWluaW11bSB6bGliIHN0cmVhbSBzaXplICovCi0gICAgICAgIHF1aXQoIm5lZWQgcG9zaXRpdmUgc2l6ZSBvZiA4IG9yIGdyZWF0ZXIiKTsKLSAgICBzaXplID0gKHVuc2lnbmVkKXJldDsKLQotICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgYnVmZmVycyBhbmQgY29tcHJlc3Npb24gZW5naW5lICovCi0gICAgYmxrID0gbWFsbG9jKHNpemUgKyBFWENFU1MpOwotICAgIGRlZi56YWxsb2MgPSBaX05VTEw7Ci0gICAgZGVmLnpmcmVlID0gWl9OVUxMOwotICAgIGRlZi5vcGFxdWUgPSBaX05VTEw7Ci0gICAgcmV0ID0gZGVmbGF0ZUluaXQoJmRlZiwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKLSAgICBpZiAocmV0ICE9IFpfT0sgfHwgYmxrID09IE5VTEwpCi0gICAgICAgIHF1aXQoIm91dCBvZiBtZW1vcnkiKTsKLQotICAgIC8qIGNvbXByZXNzIGZyb20gc3RkaW4gdW50aWwgb3V0cHV0IGZ1bGwsIG9yIG5vIG1vcmUgaW5wdXQgKi8KLSAgICBkZWYuYXZhaWxfb3V0ID0gc2l6ZSArIEVYQ0VTUzsKLSAgICBkZWYubmV4dF9vdXQgPSBibGs7Ci0gICAgcmV0ID0gcGFydGNvbXByZXNzKHN0ZGluLCAmZGVmKTsKLSAgICBpZiAocmV0ID09IFpfRVJSTk8pCi0gICAgICAgIHF1aXQoImVycm9yIHJlYWRpbmcgaW5wdXQiKTsKLQotICAgIC8qIGlmIGl0IGFsbCBmaXQsIHRoZW4gc2l6ZSB3YXMgdW5kZXJzdWJzY3JpYmVkIC0tIGRvbmUhICovCi0gICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQgJiYgZGVmLmF2YWlsX291dCA+PSBFWENFU1MpIHsKLSAgICAgICAgLyogd3JpdGUgYmxvY2sgdG8gc3Rkb3V0ICovCi0gICAgICAgIGhhdmUgPSBzaXplICsgRVhDRVNTIC0gZGVmLmF2YWlsX291dDsKLSAgICAgICAgaWYgKGZ3cml0ZShibGssIDEsIGhhdmUsIHN0ZG91dCkgIT0gaGF2ZSB8fCBmZXJyb3Ioc3Rkb3V0KSkKLSAgICAgICAgICAgIHF1aXQoImVycm9yIHdyaXRpbmcgb3V0cHV0Iik7Ci0KLSAgICAgICAgLyogY2xlYW4gdXAgYW5kIHByaW50IHJlc3VsdHMgdG8gc3RkZXJyICovCi0gICAgICAgIHJldCA9IGRlZmxhdGVFbmQoJmRlZik7Ci0gICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOwotICAgICAgICBmcmVlKGJsayk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICIldSBieXRlcyB1bnVzZWQgb3V0IG9mICV1IHJlcXVlc3RlZCAoYWxsIGlucHV0KVxuIiwKLSAgICAgICAgICAgICAgICBzaXplIC0gaGF2ZSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIGl0IGRpZG4ndCBhbGwgZml0IC0tIHNldCB1cCBmb3IgcmVjb21wcmVzc2lvbiAqLwotICAgIGluZi56YWxsb2MgPSBaX05VTEw7Ci0gICAgaW5mLnpmcmVlID0gWl9OVUxMOwotICAgIGluZi5vcGFxdWUgPSBaX05VTEw7Ci0gICAgaW5mLmF2YWlsX2luID0gMDsKLSAgICBpbmYubmV4dF9pbiA9IFpfTlVMTDsKLSAgICByZXQgPSBpbmZsYXRlSW5pdCgmaW5mKTsKLSAgICB0bXAgPSBtYWxsb2Moc2l6ZSArIEVYQ0VTUyk7Ci0gICAgaWYgKHJldCAhPSBaX09LIHx8IHRtcCA9PSBOVUxMKQotICAgICAgICBxdWl0KCJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgcmV0ID0gZGVmbGF0ZVJlc2V0KCZkZWYpOwotICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOwotCi0gICAgLyogZG8gZmlyc3QgcmVjb21wcmVzc2lvbiBjbG9zZSB0byB0aGUgcmlnaHQgYW1vdW50ICovCi0gICAgaW5mLmF2YWlsX2luID0gc2l6ZSArIEVYQ0VTUzsKLSAgICBpbmYubmV4dF9pbiA9IGJsazsKLSAgICBkZWYuYXZhaWxfb3V0ID0gc2l6ZSArIEVYQ0VTUzsKLSAgICBkZWYubmV4dF9vdXQgPSB0bXA7Ci0gICAgcmV0ID0gcmVjb21wcmVzcygmaW5mLCAmZGVmKTsKLSAgICBpZiAocmV0ID09IFpfTUVNX0VSUk9SKQotICAgICAgICBxdWl0KCJvdXQgb2YgbWVtb3J5Iik7Ci0KLSAgICAvKiBzZXQgdXAgZm9yIG5leHQgcmVvY21wcmVzc2lvbiAqLwotICAgIHJldCA9IGluZmxhdGVSZXNldCgmaW5mKTsKLSAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsKLSAgICByZXQgPSBkZWZsYXRlUmVzZXQoJmRlZik7Ci0gICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7Ci0KLSAgICAvKiBkbyBzZWNvbmQgYW5kIGZpbmFsIHJlY29tcHJlc3Npb24gKHRoaXJkIGNvbXByZXNzaW9uKSAqLwotICAgIGluZi5hdmFpbF9pbiA9IHNpemUgLSBNQVJHSU47ICAgLyogYXNzdXJlIHN0cmVhbSB3aWxsIGNvbXBsZXRlICovCi0gICAgaW5mLm5leHRfaW4gPSB0bXA7Ci0gICAgZGVmLmF2YWlsX291dCA9IHNpemU7Ci0gICAgZGVmLm5leHRfb3V0ID0gYmxrOwotICAgIHJldCA9IHJlY29tcHJlc3MoJmluZiwgJmRlZik7Ci0gICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUikKLSAgICAgICAgcXVpdCgib3V0IG9mIG1lbW9yeSIpOwotICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRU5EKTsgICAgLyogb3RoZXJ3aXNlIE1BUkdJTiB0b28gc21hbGwgKi8KLQotICAgIC8qIGRvbmUgLS0gd3JpdGUgYmxvY2sgdG8gc3Rkb3V0ICovCi0gICAgaGF2ZSA9IHNpemUgLSBkZWYuYXZhaWxfb3V0OwotICAgIGlmIChmd3JpdGUoYmxrLCAxLCBoYXZlLCBzdGRvdXQpICE9IGhhdmUgfHwgZmVycm9yKHN0ZG91dCkpCi0gICAgICAgIHF1aXQoImVycm9yIHdyaXRpbmcgb3V0cHV0Iik7Ci0KLSAgICAvKiBjbGVhbiB1cCBhbmQgcHJpbnQgcmVzdWx0cyB0byBzdGRlcnIgKi8KLSAgICBmcmVlKHRtcCk7Ci0gICAgcmV0ID0gaW5mbGF0ZUVuZCgmaW5mKTsKLSAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsKLSAgICByZXQgPSBkZWZsYXRlRW5kKCZkZWYpOwotICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOwotICAgIGZyZWUoYmxrKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICIldSBieXRlcyB1bnVzZWQgb3V0IG9mICV1IHJlcXVlc3RlZCAoJWx1IGlucHV0KVxuIiwKLSAgICAgICAgICAgIHNpemUgLSBoYXZlLCBzaXplLCBkZWYudG90YWxfaW4pOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2V4YW1wbGVzL2d1bi5jIGIvbGlicy96bGliL2V4YW1wbGVzL2d1bi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmVjNTkwLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9leGFtcGxlcy9ndW4uYworKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKiBndW4uYyAtLSBzaW1wbGUgZ3VuemlwIHRvIGdpdmUgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGluZmxhdGVCYWNrKCkKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gICBWZXJzaW9uIDEuMyAgMTIgSnVuZSAyMDA1ICBNYXJrIEFkbGVyICovCi0KLS8qIFZlcnNpb24gaGlzdG9yeToKLSAgIDEuMCAgMTYgRmViIDIwMDMgIEZpcnN0IHZlcnNpb24gZm9yIHRlc3Rpbmcgb2YgaW5mbGF0ZUJhY2soKQotICAgMS4xICAyMSBGZWIgMjAwNSAgRGVjb21wcmVzcyBjb25jYXRlbmF0ZWQgZ3ppcCBzdHJlYW1zCi0gICAgICAgICAgICAgICAgICAgICBSZW1vdmUgdXNlIG9mICJ0aGlzIiB2YXJpYWJsZSAoQysrIGtleXdvcmQpCi0gICAgICAgICAgICAgICAgICAgICBGaXggcmV0dXJuIHZhbHVlIGZvciBpbigpCi0gICAgICAgICAgICAgICAgICAgICBJbXByb3ZlIGFsbG9jYXRpb24gZmFpbHVyZSBjaGVja2luZwotICAgICAgICAgICAgICAgICAgICAgQWRkIHR5cGVjYXN0aW5nIGZvciB2b2lkICogc3RydWN0dXJlcwotICAgICAgICAgICAgICAgICAgICAgQWRkIC1oIG9wdGlvbiBmb3IgY29tbWFuZCB2ZXJzaW9uIGFuZCB1c2FnZQotICAgICAgICAgICAgICAgICAgICAgQWRkIGEgYnVuY2ggb2YgY29tbWVudHMKLSAgIDEuMiAgMjAgTWFyIDIwMDUgIEFkZCBVbml4IGNvbXByZXNzIChMWlcpIGRlY29tcHJlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgIENvcHkgZmlsZSBhdHRyaWJ1dGVzIGZyb20gaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZQotICAgMS4zICAxMiBKdW4gMjAwNSAgQWRkIGNhc3RzIGZvciBlcnJvciBtZXNzYWdlcyBbT2Jlcmh1bWVyXQotICovCi0KLS8qCi0gICBndW4gWyAtdCBdIFsgbmFtZSAuLi4gXQotCi0gICBkZWNvbXByZXNzZXMgdGhlIGRhdGEgaW4gdGhlIG5hbWVkIGd6aXAgZmlsZXMuICBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLAotICAgZ3VuIHdpbGwgZGVjb21wcmVzcyBmcm9tIHN0ZGluIHRvIHN0ZG91dC4gIFRoZSBuYW1lcyBtdXN0IGVuZCBpbiAuZ3osIC1neiwKLSAgIC56LCAteiwgX3osIG9yIC5aLiAgVGhlIHVuY29tcHJlc3NlZCBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0byBhIGZpbGUgbmFtZQotICAgd2l0aCB0aGUgc3VmZml4IHN0cmlwcGVkLiAgT24gc3VjY2VzcywgdGhlIG9yaWdpbmFsIGZpbGUgaXMgZGVsZXRlZC4gIE9uCi0gICBmYWlsdXJlLCB0aGUgb3V0cHV0IGZpbGUgaXMgZGVsZXRlZC4gIEZvciBtb3N0IGZhaWx1cmVzLCB0aGUgY29tbWFuZCB3aWxsCi0gICBjb250aW51ZSB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgbmFtZXMgb24gdGhlIGNvbW1hbmQgbGluZS4gIEEgbWVtb3J5Ci0gICBhbGxvY2F0aW9uIGZhaWx1cmUgd2lsbCBhYm9ydCB0aGUgY29tbWFuZC4gIElmIC10IGlzIHNwZWNpZmllZCwgdGhlbiB0aGUKLSAgIGxpc3RlZCBmaWxlcyBvciBzdGRpbiB3aWxsIGJlIHRlc3RlZCBhcyBnemlwIGZpbGVzIGZvciBpbnRlZ3JpdHkgKHdpdGhvdXQKLSAgIGNoZWNraW5nIGZvciBhIHByb3BlciBzdWZmaXgpLCBubyBvdXRwdXQgd2lsbCBiZSB3cml0dGVuLCBhbmQgbm8gZmlsZXMKLSAgIHdpbGwgYmUgZGVsZXRlZC4KLQotICAgTGlrZSBnemlwLCBndW4gYWxsb3dzIGNvbmNhdGVuYXRlZCBnemlwIHN0cmVhbXMgYW5kIHdpbGwgZGVjb21wcmVzcyB0aGVtLAotICAgd3JpdGluZyBhbGwgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIHRvIHRoZSBvdXRwdXQuICBVbmxpa2UgZ3ppcCwgZ3VuIGFsbG93cwotICAgYW4gZW1wdHkgZmlsZSBvbiBpbnB1dCwgYW5kIHdpbGwgcHJvZHVjZSBubyBlcnJvciB3cml0aW5nIGFuIGVtcHR5IG91dHB1dAotICAgZmlsZS4KLQotICAgZ3VuIHdpbGwgYWxzbyBkZWNvbXByZXNzIGZpbGVzIG1hZGUgYnkgVW5peCBjb21wcmVzcywgd2hpY2ggdXNlcyBMWlcKLSAgIGNvbXByZXNzaW9uLiAgVGhlc2UgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYnkgdmlydHVlIG9mIHRoZWlyCi0gICBtYWdpYyBoZWFkZXIgYnl0ZXMuICBTaW5jZSB0aGUgZW5kIG9mIFVuaXggY29tcHJlc3Mgc3RyZWFtIGlzIG1hcmtlZCBieSB0aGUKLSAgIGVuZC1vZi1maWxlLCB0aGV5IGNhbm5vdCBiZSBjb25jYW50ZW5hdGVkLiAgSWYgYSBVbml4IGNvbXByZXNzIHN0cmVhbSBpcwotICAgZW5jb3VudGVyZWQgaW4gYW4gaW5wdXQgZmlsZSwgaXQgaXMgdGhlIGxhc3Qgc3RyZWFtIGluIHRoYXQgZmlsZS4KLQotICAgTGlrZSBndW56aXAgYW5kIHVuY29tcHJlc3MsIHRoZSBmaWxlIGF0dHJpYnV0ZXMgb2YgdGhlIG9yaWduYWwgY29tcHJlc3NlZAotICAgZmlsZSBhcmUgbWFpbnRhaW5lZCBpbiB0aGUgZmluYWwgdW5jb21wcmVzc2VkIGZpbGUsIHRvIHRoZSBleHRlbnQgdGhhdCB0aGUKLSAgIHVzZXIgcGVybWlzc2lvbnMgYWxsb3cgaXQuCi0KLSAgIE9uIG15IE1hYyBPUyBYIFBvd2VyUEMgRzQsIGd1biBpcyBhbG1vc3QgdHdpY2UgYXMgZmFzdCBhcyBndW56aXAgKHZlcnNpb24KLSAgIDEuMi40KSBpcyBvbiB0aGUgc2FtZSBmaWxlLCB3aGVuIGd1biBpcyBsaW5rZWQgd2l0aCB6bGliIDEuMi4yLiAgQWxzbyB0aGUKLSAgIExaVyBkZWNvbXByZXNzaW9uIHByb3ZpZGVkIGJ5IGd1biBpcyBhYm91dCB0d2ljZSBhcyBmYXN0IGFzIHRoZSBzdGFuZGFyZAotICAgVW5peCB1bmNvbXByZXNzIGNvbW1hbmQuCi0gKi8KLQotLyogZXh0ZXJuYWwgZnVuY3Rpb25zIGFuZCByZWxhdGVkIHR5cGVzIGFuZCBjb25zdGFudHMgKi8KLSNpbmNsdWRlIDxzdGRpby5oPiAgICAgICAgICAvKiBmcHJpbnRmKCkgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4gICAgICAgICAvKiBtYWxsb2MoKSwgZnJlZSgpICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAgLyogc3RyZXJyb3IoKSwgc3RyY21wKCksIHN0cmxlbigpLCBtZW1jcHkoKSAqLwotI2luY2x1ZGUgPGVycm5vLmg+ICAgICAgICAgIC8qIGVycm5vICovCi0jaW5jbHVkZSA8ZmNudGwuaD4gICAgICAgICAgLyogb3BlbigpICovCi0jaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgLyogcmVhZCgpLCB3cml0ZSgpLCBjbG9zZSgpLCBjaG93bigpLCB1bmxpbmsoKSAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+ICAgICAgIC8qIHN0YXQoKSwgY2htb2QoKSAqLwotI2luY2x1ZGUgPHV0aW1lLmg+ICAgICAgICAgIC8qIHV0aW1lKCkgKi8KLSNpbmNsdWRlICJ6bGliLmgiICAgICAgICAgICAvKiBpbmZsYXRlQmFja0luaXQoKSwgaW5mbGF0ZUJhY2soKSwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlQmFja0VuZCgpLCBjcmMzMigpICovCi0KLS8qIGZ1bmN0aW9uIGRlY2xhcmF0aW9uICovCi0jZGVmaW5lIGxvY2FsIHN0YXRpYwotCi0vKiBidWZmZXIgY29uc3RhbnRzICovCi0jZGVmaW5lIFNJWkUgMzI3NjhVICAgICAgICAgLyogaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgc2l6ZXMgKi8KLSNkZWZpbmUgUElFQ0UgMTYzODQgICAgICAgICAvKiBsaW1pdHMgaS9vIGNodW5rcyBmb3IgMTYtYml0IGludCBjYXNlICovCi0KLS8qIHN0cnVjdHVyZSBmb3IgaW5mYmFjaygpIHRvIHBhc3MgdG8gaW5wdXQgZnVuY3Rpb24gaW4oKSAtLSBpdCBtYWludGFpbnMgdGhlCi0gICBpbnB1dCBmaWxlIGFuZCBhIGJ1ZmZlciBvZiBzaXplIFNJWkUgKi8KLXN0cnVjdCBpbmQgewotICAgIGludCBpbmZpbGU7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5idWY7Ci19OwotCi0vKiBMb2FkIGlucHV0IGJ1ZmZlciwgYXNzdW1lZCB0byBiZSBlbXB0eSwgYW5kIHJldHVybiBieXRlcyBsb2FkZWQgYW5kIGEKLSAgIHBvaW50ZXIgdG8gdGhlbS4gIHJlYWQoKSBpcyBjYWxsZWQgdW50aWwgdGhlIGJ1ZmZlciBpcyBmdWxsLCBvciB1bnRpbCBpdAotICAgcmV0dXJucyBlbmQtb2YtZmlsZSBvciBlcnJvci4gIFJldHVybiAwIG9uIGVycm9yLiAqLwotbG9jYWwgdW5zaWduZWQgaW4odm9pZCAqaW5fZGVzYywgdW5zaWduZWQgY2hhciAqKmJ1ZikKLXsKLSAgICBpbnQgcmV0OwotICAgIHVuc2lnbmVkIGxlbjsKLSAgICB1bnNpZ25lZCBjaGFyICpuZXh0OwotICAgIHN0cnVjdCBpbmQgKm1lID0gKHN0cnVjdCBpbmQgKilpbl9kZXNjOwotCi0gICAgbmV4dCA9IG1lLT5pbmJ1ZjsKLSAgICAqYnVmID0gbmV4dDsKLSAgICBsZW4gPSAwOwotICAgIGRvIHsKLSAgICAgICAgcmV0ID0gUElFQ0U7Ci0gICAgICAgIGlmICgodW5zaWduZWQpcmV0ID4gU0laRSAtIGxlbikKLSAgICAgICAgICAgIHJldCA9IChpbnQpKFNJWkUgLSBsZW4pOwotICAgICAgICByZXQgPSAoaW50KXJlYWQobWUtPmluZmlsZSwgbmV4dCwgcmV0KTsKLSAgICAgICAgaWYgKHJldCA9PSAtMSkgewotICAgICAgICAgICAgbGVuID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5leHQgKz0gcmV0OwotICAgICAgICBsZW4gKz0gcmV0OwotICAgIH0gd2hpbGUgKHJldCAhPSAwICYmIGxlbiA8IFNJWkUpOwotICAgIHJldHVybiBsZW47Ci19Ci0KLS8qIHN0cnVjdHVyZSBmb3IgaW5mYmFjaygpIHRvIHBhc3MgdG8gb3V0cHV0IGZ1bmN0aW9uIG91dCgpIC0tIGl0IG1haW50YWlucyB0aGUKLSAgIG91dHB1dCBmaWxlLCBhIHJ1bm5pbmcgQ1JDLTMyIGNoZWNrIG9uIHRoZSBvdXRwdXQgYW5kIHRoZSB0b3RhbCBudW1iZXIgb2YKLSAgIGJ5dGVzIG91dHB1dCwgYm90aCBmb3IgY2hlY2tpbmcgYWdhaW5zdCB0aGUgZ3ppcCB0cmFpbGVyLiAgKFRoZSBsZW5ndGggaW4KLSAgIHRoZSBnemlwIHRyYWlsZXIgaXMgc3RvcmVkIG1vZHVsbyAyXjMyLCBzbyBpdCdzIG9rIGlmIGEgbG9uZyBpcyAzMiBiaXRzIGFuZAotICAgdGhlIG91dHB1dCBpcyBncmVhdGVyIHRoYW4gNCBHQi4pICovCi1zdHJ1Y3Qgb3V0ZCB7Ci0gICAgaW50IG91dGZpbGU7Ci0gICAgaW50IGNoZWNrOyAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgY2hlY2tpbmcgY3JjIGFuZCB0b3RhbCAqLwotICAgIHVuc2lnbmVkIGxvbmcgY3JjOwotICAgIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci19OwotCi0vKiBXcml0ZSBvdXRwdXQgYnVmZmVyIGFuZCB1cGRhdGUgdGhlIENSQy0zMiBhbmQgdG90YWwgYnl0ZXMgd3JpdHRlbi4gIHdyaXRlKCkKLSAgIGlzIGNhbGxlZCB1bnRpbCBhbGwgb2YgdGhlIG91dHB1dCBpcyB3cml0dGVuIG9yIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotICAgT24gc3VjY2VzcyBvdXQoKSByZXR1cm5zIDAuICBGb3IgYSB3cml0ZSBmYWlsdXJlLCBvdXQoKSByZXR1cm5zIDEuICBJZiB0aGUKLSAgIG91dHB1dCBmaWxlIGRlc2NyaXB0b3IgaXMgLTEsIHRoZW4gbm90aGluZyBpcyB3cml0dGVuLgotICovCi1sb2NhbCBpbnQgb3V0KHZvaWQgKm91dF9kZXNjLCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxlbikKLXsKLSAgICBpbnQgcmV0OwotICAgIHN0cnVjdCBvdXRkICptZSA9IChzdHJ1Y3Qgb3V0ZCAqKW91dF9kZXNjOwotCi0gICAgaWYgKG1lLT5jaGVjaykgewotICAgICAgICBtZS0+Y3JjID0gY3JjMzIobWUtPmNyYywgYnVmLCBsZW4pOwotICAgICAgICBtZS0+dG90YWwgKz0gbGVuOwotICAgIH0KLSAgICBpZiAobWUtPm91dGZpbGUgIT0gLTEpCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHJldCA9IFBJRUNFOwotICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClyZXQgPiBsZW4pCi0gICAgICAgICAgICAgICAgcmV0ID0gKGludClsZW47Ci0gICAgICAgICAgICByZXQgPSAoaW50KXdyaXRlKG1lLT5vdXRmaWxlLCBidWYsIHJldCk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgYnVmICs9IHJldDsKLSAgICAgICAgICAgIGxlbiAtPSByZXQ7Ci0gICAgICAgIH0gd2hpbGUgKGxlbiAhPSAwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogbmV4dCBpbnB1dCBieXRlIG1hY3JvIGZvciB1c2UgaW5zaWRlIGx1bnBpcGUoKSBhbmQgZ3VucGlwZSgpICovCi0jZGVmaW5lIE5FWFQoKSAoaGF2ZSA/IDAgOiAoaGF2ZSA9IGluKGluZHAsICZuZXh0KSksIFwKLSAgICAgICAgICAgICAgICBsYXN0ID0gaGF2ZSA/IChoYXZlLS0sIChpbnQpKCpuZXh0KyspKSA6IC0xKQotCi0vKiBtZW1vcnkgZm9yIGd1bnBpcGUoKSBhbmQgbHVucGlwZSgpIC0tCi0gICB0aGUgZmlyc3QgMjU2IGVudHJpZXMgb2YgcHJlZml4W10gYW5kIHN1ZmZpeFtdIGFyZSBuZXZlciB1c2VkLCBjb3VsZAotICAgaGF2ZSBvZmZzZXQgdGhlIGluZGV4LCBidXQgaXQncyBmYXN0ZXIgdG8gd2FzdGUgdGhlIG1lbW9yeSAqLwotdW5zaWduZWQgY2hhciBpbmJ1ZltTSVpFXTsgICAgICAgICAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLwotdW5zaWduZWQgY2hhciBvdXRidWZbU0laRV07ICAgICAgICAgICAgIC8qIG91dHB1dCBidWZmZXIgKi8KLXVuc2lnbmVkIHNob3J0IHByZWZpeFs2NTUzNl07ICAgICAgICAgICAvKiBpbmRleCB0byBMWlcgcHJlZml4IHN0cmluZyAqLwotdW5zaWduZWQgY2hhciBzdWZmaXhbNjU1MzZdOyAgICAgICAgICAgIC8qIG9uZS1jaGFyYWN0ZXIgTFpXIHN1ZmZpeCAqLwotdW5zaWduZWQgY2hhciBtYXRjaFs2NTI4MCArIDJdOyAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcmV2ZXJzZWQgbWF0Y2ggb3IgZ3ppcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMySyBzbGlkaW5nIHdpbmRvdyAqLwotCi0vKiB0aHJvdyBvdXQgd2hhdCdzIGxlZnQgaW4gdGhlIGN1cnJlbnQgYml0cyBieXRlIGJ1ZmZlciAodGhpcyBpcyBhIHZlc3RpZ2lhbAotICAgYXNwZWN0IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IGRlcml2ZWQgZnJvbSBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0Ci0gICBtYWRlIHVzZSBvZiBhIHNwZWNpYWwgVkFYIG1hY2hpbmUgaW5zdHJ1Y3Rpb24hKSAqLwotI2RlZmluZSBGTFVTSENPREUoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGxlZnQgPSAwOyBcCi0gICAgICAgIHJlbSA9IDA7IFwKLSAgICAgICAgaWYgKGNodW5rID4gaGF2ZSkgeyBcCi0gICAgICAgICAgICBjaHVuayAtPSBoYXZlOyBcCi0gICAgICAgICAgICBoYXZlID0gMDsgXAotICAgICAgICAgICAgaWYgKE5FWFQoKSA9PSAtMSkgXAotICAgICAgICAgICAgICAgIGJyZWFrOyBcCi0gICAgICAgICAgICBjaHVuay0tOyBcCi0gICAgICAgICAgICBpZiAoY2h1bmsgPiBoYXZlKSB7IFwKLSAgICAgICAgICAgICAgICBjaHVuayA9IGhhdmUgPSAwOyBcCi0gICAgICAgICAgICAgICAgYnJlYWs7IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICB9IFwKLSAgICAgICAgaGF2ZSAtPSBjaHVuazsgXAotICAgICAgICBuZXh0ICs9IGNodW5rOyBcCi0gICAgICAgIGNodW5rID0gMDsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIERlY29tcHJlc3MgYSBjb21wcmVzcyAoTFpXKSBmaWxlIGZyb20gaW5kcCB0byBvdXRmaWxlLiAgVGhlIGNvbXByZXNzIG1hZ2ljCi0gICBoZWFkZXIgKHR3byBieXRlcykgaGFzIGFscmVhZHkgYmVlbiByZWFkIGFuZCB2ZXJpZmllZC4gIFRoZXJlIGFyZSBoYXZlIGJ5dGVzCi0gICBvZiBidWZmZXJlZCBpbnB1dCBhdCBuZXh0LiAgc3RybSBpcyB1c2VkIGZvciBwYXNzaW5nIGVycm9yIGluZm9ybWF0aW9uIGJhY2sKLSAgIHRvIGd1bnBpcGUoKS4KLQotICAgbHVucGlwZSgpIHdpbGwgcmV0dXJuIFpfT0sgb24gc3VjY2VzcywgWl9CVUZfRVJST1IgZm9yIGFuIHVuZXhwZWN0ZWQgZW5kIG9mCi0gICBmaWxlLCByZWFkIGVycm9yLCBvciB3cml0ZSBlcnJvciAoYSB3cml0ZSBlcnJvciBpbmRpY2F0ZWQgYnkgc3RybS0+bmV4dF9pbgotICAgbm90IGVxdWFsIHRvIFpfTlVMTCksIG9yIFpfREFUQV9FUlJPUiBmb3IgaW52YWxpZCBpbnB1dC4KLSAqLwotbG9jYWwgaW50IGx1bnBpcGUodW5zaWduZWQgaGF2ZSwgdW5zaWduZWQgY2hhciAqbmV4dCwgc3RydWN0IGluZCAqaW5kcCwKLSAgICAgICAgICAgICAgICAgIGludCBvdXRmaWxlLCB6X3N0cmVhbSAqc3RybSkKLXsKLSAgICBpbnQgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogbGFzdCBieXRlIHJlYWQgYnkgTkVYVCgpLCBvciAtMSBpZiBFT0YgKi8KLSAgICBpbnQgY2h1bms7ICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgbGVmdCBpbiBjdXJyZW50IGNodW5rICovCi0gICAgaW50IGxlZnQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgbGVmdCBpbiByZW0gKi8KLSAgICB1bnNpZ25lZCByZW07ICAgICAgICAgICAgICAgLyogdW51c2VkIGJpdHMgZnJvbSBpbnB1dCAqLwotICAgIGludCBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGJpdHMgcGVyIGNvZGUgKi8KLSAgICB1bnNpZ25lZCBjb2RlOyAgICAgICAgICAgICAgLyogY29kZSwgdGFibGUgdHJhdmVyc2FsIGluZGV4ICovCi0gICAgdW5zaWduZWQgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGN1cnJlbnQgYml0cyBjb2RlcyAqLwotICAgIGludCBtYXg7ICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGJpdHMgcGVyIGNvZGUgZm9yIHRoaXMgc3RyZWFtICovCi0gICAgaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIGNvbXByZXNzIGZsYWdzLCB0aGVuIGJsb2NrIGNvbXByZXNzIGZsYWcgKi8KLSAgICB1bnNpZ25lZCBlbmQ7ICAgICAgICAgICAgICAgLyogbGFzdCB2YWxpZCBlbnRyeSBpbiBwcmVmaXgvc3VmZml4IHRhYmxlcyAqLwotICAgIHVuc2lnbmVkIHRlbXA7ICAgICAgICAgICAgICAvKiBjdXJyZW50IGNvZGUgKi8KLSAgICB1bnNpZ25lZCBwcmV2OyAgICAgICAgICAgICAgLyogcHJldmlvdXMgY29kZSAqLwotICAgIHVuc2lnbmVkIGZpbmFsOyAgICAgICAgICAgICAvKiBsYXN0IGNoYXJhY3RlciB3cml0dGVuIGZvciBwcmV2aW91cyBjb2RlICovCi0gICAgdW5zaWduZWQgc3RhY2s7ICAgICAgICAgICAgIC8qIG5leHQgcG9zaXRpb24gZm9yIHJldmVyc2VkIHN0cmluZyAqLwotICAgIHVuc2lnbmVkIG91dGNudDsgICAgICAgICAgICAvKiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCi0gICAgc3RydWN0IG91dGQgb3V0ZDsgICAgICAgICAgIC8qIG91dHB1dCBzdHJ1Y3R1cmUgKi8KLQotICAgIC8qIHNldCB1cCBvdXRwdXQgKi8KLSAgICBvdXRkLm91dGZpbGUgPSBvdXRmaWxlOwotICAgIG91dGQuY2hlY2sgPSAwOwotCi0gICAgLyogcHJvY2VzcyByZW1haW5kZXIgb2YgY29tcHJlc3MgaGVhZGVyIC0tIGEgZmxhZ3MgYnl0ZSAqLwotICAgIGZsYWdzID0gTkVYVCgpOwotICAgIGlmIChsYXN0ID09IC0xKQotICAgICAgICByZXR1cm4gWl9CVUZfRVJST1I7Ci0gICAgaWYgKGZsYWdzICYgMHg2MCkgewotICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGx6dyBmbGFncyBzZXQiOwotICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgIH0KLSAgICBtYXggPSBmbGFncyAmIDB4MWY7Ci0gICAgaWYgKG1heCA8IDkgfHwgbWF4ID4gMTYpIHsKLSAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikibHp3IGJpdHMgb3V0IG9mIHJhbmdlIjsKLSAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgICB9Ci0gICAgaWYgKG1heCA9PSA5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDkgZG9lc24ndCByZWFsbHkgbWVhbiA5ICovCi0gICAgICAgIG1heCA9IDEwOwotICAgIGZsYWdzICY9IDB4ODA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIGJsb2NrIGNvbXByZXNzICovCi0KLSAgICAvKiBjbGVhciB0YWJsZSAqLwotICAgIGJpdHMgPSA5OwotICAgIG1hc2sgPSAweDFmZjsKLSAgICBlbmQgPSBmbGFncyA/IDI1NiA6IDI1NTsKLQotICAgIC8qIHNldCB1cDogZ2V0IGZpcnN0IDktYml0IGNvZGUsIHdoaWNoIGlzIHRoZSBmaXJzdCBkZWNvbXByZXNzZWQgYnl0ZSwgYnV0Ci0gICAgICAgZG9uJ3QgY3JlYXRlIGEgdGFibGUgZW50cnkgdW50aWwgdGhlIG5leHQgY29kZSAqLwotICAgIGlmIChORVhUKCkgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBjb21wcmVzc2VkIGRhdGEgaXMgb2sgKi8KLSAgICAgICAgcmV0dXJuIFpfT0s7Ci0gICAgZmluYWwgPSBwcmV2ID0gKHVuc2lnbmVkKWxhc3Q7ICAgICAgICAgIC8qIGxvdyA4IGJpdHMgb2YgY29kZSAqLwotICAgIGlmIChORVhUKCkgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAvKiBtaXNzaW5nIGEgYml0ICovCi0gICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKLSAgICBpZiAobGFzdCAmIDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBtdXN0IGJlIDwgMjU2ICovCi0gICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbHp3IGNvZGUiOwotICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgIH0KLSAgICByZW0gPSAodW5zaWduZWQpbGFzdCA+PiAxOyAgICAgICAgICAgICAgLyogcmVtYWluaW5nIDcgYml0cyAqLwotICAgIGxlZnQgPSA3OwotICAgIGNodW5rID0gYml0cyAtIDI7ICAgICAgICAgICAgICAgICAgICAgICAvKiA3IGJ5dGVzIGxlZnQgaW4gdGhpcyBjaHVuayAqLwotICAgIG91dGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKWZpbmFsOyAgICAgICAvKiB3cml0ZSBmaXJzdCBkZWNvbXByZXNzZWQgYnl0ZSAqLwotICAgIG91dGNudCA9IDE7Ci0KLSAgICAvKiBkZWNvZGUgY29kZXMgKi8KLSAgICBzdGFjayA9IDA7Ci0gICAgZm9yICg7OykgewotICAgICAgICAvKiBpZiB0aGUgdGFibGUgd2lsbCBiZSBmdWxsIGFmdGVyIHRoaXMsIGluY3JlbWVudCB0aGUgY29kZSBzaXplICovCi0gICAgICAgIGlmIChlbmQgPj0gbWFzayAmJiBiaXRzIDwgbWF4KSB7Ci0gICAgICAgICAgICBGTFVTSENPREUoKTsKLSAgICAgICAgICAgIGJpdHMrKzsKLSAgICAgICAgICAgIG1hc2sgPDw9IDE7Ci0gICAgICAgICAgICBtYXNrKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBnZXQgYSBjb2RlIG9mIGxlbmd0aCBiaXRzICovCi0gICAgICAgIGlmIChjaHVuayA9PSAwKSAgICAgICAgICAgICAgICAgICAgIC8qIGRlY3JlbWVudCBjaHVuayBtb2R1bG8gYml0cyAqLwotICAgICAgICAgICAgY2h1bmsgPSBiaXRzOwotICAgICAgICBjb2RlID0gcmVtOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBvZiBjb2RlICovCi0gICAgICAgIGlmIChORVhUKCkgPT0gLTEpIHsgICAgICAgICAgICAgICAgIC8qIEVPRiBpcyBlbmQgb2YgY29tcHJlc3NlZCBkYXRhICovCi0gICAgICAgICAgICAvKiB3cml0ZSByZW1haW5pbmcgYnVmZmVyZWQgb3V0cHV0ICovCi0gICAgICAgICAgICBpZiAob3V0Y250ICYmIG91dCgmb3V0ZCwgb3V0YnVmLCBvdXRjbnQpKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bmV4dF9pbiA9IG91dGJ1ZjsgICAgIC8qIHNpZ25hbCB3cml0ZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBaX09LOwotICAgICAgICB9Ci0gICAgICAgIGNvZGUgKz0gKHVuc2lnbmVkKWxhc3QgPDwgbGVmdDsgICAgIC8qIG1pZGRsZSAob3IgaGlnaCkgYml0cyBvZiBjb2RlICovCi0gICAgICAgIGxlZnQgKz0gODsKLSAgICAgICAgY2h1bmstLTsKLSAgICAgICAgaWYgKGJpdHMgPiBsZWZ0KSB7ICAgICAgICAgICAgICAgICAgLyogbmVlZCBtb3JlIGJpdHMgKi8KLSAgICAgICAgICAgIGlmIChORVhUKCkgPT0gLTEpICAgICAgICAgICAgICAgLyogY2FuJ3QgZW5kIGluIG1pZGRsZSBvZiBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOwotICAgICAgICAgICAgY29kZSArPSAodW5zaWduZWQpbGFzdCA8PCBsZWZ0OyAvKiBoaWdoIGJpdHMgb2YgY29kZSAqLwotICAgICAgICAgICAgbGVmdCArPSA4OwotICAgICAgICAgICAgY2h1bmstLTsKLSAgICAgICAgfQotICAgICAgICBjb2RlICY9IG1hc2s7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXNrIHRvIGN1cnJlbnQgY29kZSBsZW5ndGggKi8KLSAgICAgICAgbGVmdCAtPSBiaXRzOyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHVudXNlZCBiaXRzICovCi0gICAgICAgIHJlbSA9ICh1bnNpZ25lZClsYXN0ID4+ICg4IC0gbGVmdCk7IC8qIHVudXNlZCBiaXRzIGZyb20gbGFzdCBieXRlICovCi0KLSAgICAgICAgLyogcHJvY2VzcyBjbGVhciBjb2RlICgyNTYpICovCi0gICAgICAgIGlmIChjb2RlID09IDI1NiAmJiBmbGFncykgewotICAgICAgICAgICAgRkxVU0hDT0RFKCk7Ci0gICAgICAgICAgICBiaXRzID0gOTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgYml0cyBhbmQgbWFzayAqLwotICAgICAgICAgICAgbWFzayA9IDB4MWZmOwotICAgICAgICAgICAgZW5kID0gMjU1OyAgICAgICAgICAgICAgICAgICAgICAvKiBlbXB0eSB0YWJsZSAqLwotICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBjb2RlICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBzcGVjaWFsIGNvZGUgdG8gcmV1c2UgbGFzdCBtYXRjaCAqLwotICAgICAgICB0ZW1wID0gY29kZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBjdXJyZW50IGNvZGUgKi8KLSAgICAgICAgaWYgKGNvZGUgPiBlbmQpIHsKLSAgICAgICAgICAgIC8qIEJlIHBpY2t5IG9uIHRoZSBhbGxvd2VkIGNvZGUgaGVyZSwgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb2RlCi0gICAgICAgICAgICAgICB3ZSBkcm9wIHRocm91Z2ggKHByZXYpIHdpbGwgYmUgYSB2YWxpZCBpbmRleCBzbyB0aGF0IHJhbmRvbQotICAgICAgICAgICAgICAgaW5wdXQgZG9lcyBub3QgY2F1c2UgYW4gZXhjZXB0aW9uLiAgVGhlIGNvZGUgIT0gZW5kICsgMSBjaGVjayBpcwotICAgICAgICAgICAgICAgZW1waXJpY2FsbHkgZGVyaXZlZCwgYW5kIG5vdCBjaGVja2VkIGluIHRoZSBvcmlnaW5hbCB1bmNvbXByZXNzCi0gICAgICAgICAgICAgICBjb2RlLiAgSWYgdGhpcyBldmVyIGNhdXNlcyBhIHByb2JsZW0sIHRoYXQgY2hlY2sgY291bGQgYmUgc2FmZWx5Ci0gICAgICAgICAgICAgICByZW1vdmVkLiAgTGVhdmluZyB0aGlzIGNoZWNrIGluIGdyZWF0bHkgaW1wcm92ZXMgZ3VuJ3MgYWJpbGl0eQotICAgICAgICAgICAgICAgdG8gZGV0ZWN0IHJhbmRvbSBvciBjb3JydXB0ZWQgaW5wdXQgYWZ0ZXIgYSBjb21wcmVzcyBoZWFkZXIuCi0gICAgICAgICAgICAgICBJbiBhbnkgY2FzZSwgdGhlIHByZXYgPiBlbmQgY2hlY2sgbXVzdCBiZSByZXRhaW5lZC4gKi8KLSAgICAgICAgICAgIGlmIChjb2RlICE9IGVuZCArIDEgfHwgcHJldiA+IGVuZCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbHp3IGNvZGUiOwotICAgICAgICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaFtzdGFjaysrXSA9ICh1bnNpZ25lZCBjaGFyKWZpbmFsOwotICAgICAgICAgICAgY29kZSA9IHByZXY7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB3YWxrIHRocm91Z2ggbGlua2VkIGxpc3QgdG8gZ2VuZXJhdGUgb3V0cHV0IGluIHJldmVyc2Ugb3JkZXIgKi8KLSAgICAgICAgd2hpbGUgKGNvZGUgPj0gMjU2KSB7Ci0gICAgICAgICAgICBtYXRjaFtzdGFjaysrXSA9IHN1ZmZpeFtjb2RlXTsKLSAgICAgICAgICAgIGNvZGUgPSBwcmVmaXhbY29kZV07Ci0gICAgICAgIH0KLSAgICAgICAgbWF0Y2hbc3RhY2srK10gPSAodW5zaWduZWQgY2hhciljb2RlOwotICAgICAgICBmaW5hbCA9IGNvZGU7Ci0KLSAgICAgICAgLyogbGluayBuZXcgdGFibGUgZW50cnkgKi8KLSAgICAgICAgaWYgKGVuZCA8IG1hc2spIHsKLSAgICAgICAgICAgIGVuZCsrOwotICAgICAgICAgICAgcHJlZml4W2VuZF0gPSAodW5zaWduZWQgc2hvcnQpcHJldjsKLSAgICAgICAgICAgIHN1ZmZpeFtlbmRdID0gKHVuc2lnbmVkIGNoYXIpZmluYWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzZXQgcHJldmlvdXMgY29kZSBmb3IgbmV4dCBpdGVyYXRpb24gKi8KLSAgICAgICAgcHJldiA9IHRlbXA7Ci0KLSAgICAgICAgLyogd3JpdGUgb3V0cHV0IGluIGZvcndhcmQgb3JkZXIgKi8KLSAgICAgICAgd2hpbGUgKHN0YWNrID4gU0laRSAtIG91dGNudCkgewotICAgICAgICAgICAgd2hpbGUgKG91dGNudCA8IFNJWkUpCi0gICAgICAgICAgICAgICAgb3V0YnVmW291dGNudCsrXSA9IG1hdGNoWy0tc3RhY2tdOwotICAgICAgICAgICAgaWYgKG91dCgmb3V0ZCwgb3V0YnVmLCBvdXRjbnQpKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bmV4dF9pbiA9IG91dGJ1ZjsgLyogc2lnbmFsIHdyaXRlIGVycm9yICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0Y250ID0gMDsKLSAgICAgICAgfQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBvdXRidWZbb3V0Y250KytdID0gbWF0Y2hbLS1zdGFja107Ci0gICAgICAgIH0gd2hpbGUgKHN0YWNrKTsKLQotICAgICAgICAvKiBsb29wIGZvciBuZXh0IGNvZGUgd2l0aCBmaW5hbCBhbmQgcHJldiBhcyB0aGUgbGFzdCBtYXRjaCwgcmVtIGFuZAotICAgICAgICAgICBsZWZ0IHByb3ZpZGUgdGhlIGZpcnN0IDAuLjcgYml0cyBvZiB0aGUgbmV4dCBjb2RlLCBlbmQgaXMgdGhlIGxhc3QKLSAgICAgICAgICAgdmFsaWQgdGFibGUgZW50cnkgKi8KLSAgICB9Ci19Ci0KLS8qIERlY29tcHJlc3MgYSBnemlwIGZpbGUgZnJvbSBpbmZpbGUgdG8gb3V0ZmlsZS4gIHN0cm0gaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4KLSAgIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCB3aXRoIGluZmxhdGVCYWNrSW5pdCgpLiAgVGhlIGlucHV0IGZpbGUgbWF5IGNvbnNpc3QKLSAgIG9mIGEgc2VyaWVzIG9mIGd6aXAgc3RyZWFtcywgaW4gd2hpY2ggY2FzZSBhbGwgb2YgdGhlbSB3aWxsIGJlIGRlY29tcHJlc3NlZAotICAgdG8gdGhlIG91dHB1dCBmaWxlLiAgSWYgb3V0ZmlsZSBpcyAtMSwgdGhlbiB0aGUgZ3ppcCBzdHJlYW0ocykgaW50ZWdyaXR5IGlzCi0gICBjaGVja2VkIGFuZCBub3RoaW5nIGlzIHdyaXR0ZW4uCi0KLSAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSB6bGliIGVycm9yIGNvZGU6IFpfTUVNX0VSUk9SIGlmIG91dCBvZiBtZW1vcnksCi0gICBaX0RBVEFfRVJST1IgaWYgdGhlIGhlYWRlciBvciB0aGUgY29tcHJlc3NlZCBkYXRhIGlzIGludmFsaWQsIG9yIGlmIHRoZQotICAgdHJhaWxlciBDUkMtMzIgY2hlY2sgb3IgbGVuZ3RoIGRvZXNuJ3QgbWF0Y2gsIFpfQlVGX0VSUk9SIGlmIHRoZSBpbnB1dCBlbmRzCi0gICBwcmVtYXR1cmVseSBvciBhIHdyaXRlIGVycm9yIG9jY3Vycywgb3IgWl9FUlJOTyBpZiBqdW5rIChub3QgYSBhbm90aGVyIGd6aXAKLSAgIHN0cmVhbSkgZm9sbG93cyBhIHZhbGlkIGd6aXAgc3RyZWFtLgotICovCi1sb2NhbCBpbnQgZ3VucGlwZSh6X3N0cmVhbSAqc3RybSwgaW50IGluZmlsZSwgaW50IG91dGZpbGUpCi17Ci0gICAgaW50IHJldCwgZmlyc3QsIGxhc3Q7Ci0gICAgdW5zaWduZWQgaGF2ZSwgZmxhZ3MsIGxlbjsKLSAgICB1bnNpZ25lZCBjaGFyICpuZXh0OwotICAgIHN0cnVjdCBpbmQgaW5kLCAqaW5kcDsKLSAgICBzdHJ1Y3Qgb3V0ZCBvdXRkOwotCi0gICAgLyogc2V0dXAgaW5wdXQgYnVmZmVyICovCi0gICAgaW5kLmluZmlsZSA9IGluZmlsZTsKLSAgICBpbmQuaW5idWYgPSBpbmJ1ZjsKLSAgICBpbmRwID0gJmluZDsKLQotICAgIC8qIGRlY29tcHJlc3MgY29uY2F0ZW5hdGVkIGd6aXAgc3RyZWFtcyAqLwotICAgIGhhdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBpbnB1dCBkYXRhIHJlYWQgaW4geWV0ICovCi0gICAgZmlyc3QgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb2tpbmcgZm9yIGZpcnN0IGd6aXAgaGVhZGVyICovCi0gICAgc3RybS0+bmV4dF9pbiA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIHNvIFpfQlVGX0VSUk9SIG1lYW5zIEVPRiAqLwotICAgIGZvciAoOzspIHsKLSAgICAgICAgLyogbG9vayBmb3IgdGhlIHR3byBtYWdpYyBoZWFkZXIgYnl0ZXMgZm9yIGEgZ3ppcCBzdHJlYW0gKi8KLSAgICAgICAgaWYgKE5FWFQoKSA9PSAtMSkgewotICAgICAgICAgICAgcmV0ID0gWl9PSzsKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW1wdHkgZ3ppcCBzdHJlYW0gaXMgb2sgKi8KLSAgICAgICAgfQotICAgICAgICBpZiAobGFzdCAhPSAzMSB8fCAoTkVYVCgpICE9IDEzOSAmJiBsYXN0ICE9IDE1NykpIHsKLSAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBoZWFkZXIgY2hlY2siOwotICAgICAgICAgICAgcmV0ID0gZmlyc3QgPyBaX0RBVEFfRVJST1IgOiBaX0VSUk5POwotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgYSBnemlwIG9yIGNvbXByZXNzIGhlYWRlciAqLwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgbm9uLWhlYWRlciBpcyBqdW5rICovCi0KLSAgICAgICAgLyogcHJvY2VzcyBhIGNvbXByZXNzIChMWlcpIGZpbGUgLS0gY2FuJ3QgYmUgY29uY2F0ZW5hdGVkIGFmdGVyIHRoaXMgKi8KLSAgICAgICAgaWYgKGxhc3QgPT0gMTU3KSB7Ci0gICAgICAgICAgICByZXQgPSBsdW5waXBlKGhhdmUsIG5leHQsIGluZHAsIG91dGZpbGUsIHN0cm0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBwcm9jZXNzIHJlbWFpbmRlciBvZiBnemlwIGhlYWRlciAqLwotICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKLSAgICAgICAgaWYgKE5FWFQoKSAhPSA4KSB7ICAgICAgICAgICAgICAgICAgLyogb25seSBkZWZsYXRlIG1ldGhvZCBhbGxvd2VkICovCi0gICAgICAgICAgICBpZiAobGFzdCA9PSAtMSkgYnJlYWs7Ci0gICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7Ci0gICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBmbGFncyA9IE5FWFQoKTsgICAgICAgICAgICAgICAgICAgICAvKiBoZWFkZXIgZmxhZ3MgKi8KLSAgICAgICAgTkVYVCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY2FyZCBtb2QgdGltZSwgeGZsZ3MsIG9zICovCi0gICAgICAgIE5FWFQoKTsKLSAgICAgICAgTkVYVCgpOwotICAgICAgICBORVhUKCk7Ci0gICAgICAgIE5FWFQoKTsKLSAgICAgICAgTkVYVCgpOwotICAgICAgICBpZiAobGFzdCA9PSAtMSkgYnJlYWs7Ci0gICAgICAgIGlmIChmbGFncyAmIDB4ZTApIHsKLSAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gaGVhZGVyIGZsYWdzIHNldCI7Ci0gICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmxhZ3MgJiA0KSB7ICAgICAgICAgICAgICAgICAgICAvKiBleHRyYSBmaWVsZCAqLwotICAgICAgICAgICAgbGVuID0gTkVYVCgpOwotICAgICAgICAgICAgbGVuICs9ICh1bnNpZ25lZCkoTkVYVCgpKSA8PCA4OwotICAgICAgICAgICAgaWYgKGxhc3QgPT0gLTEpIGJyZWFrOwotICAgICAgICAgICAgd2hpbGUgKGxlbiA+IGhhdmUpIHsKLSAgICAgICAgICAgICAgICBsZW4gLT0gaGF2ZTsKLSAgICAgICAgICAgICAgICBoYXZlID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoTkVYVCgpID09IC0xKSBicmVhazsKLSAgICAgICAgICAgICAgICBsZW4tLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsYXN0ID09IC0xKSBicmVhazsKLSAgICAgICAgICAgIGhhdmUgLT0gbGVuOwotICAgICAgICAgICAgbmV4dCArPSBsZW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZsYWdzICYgOCkgICAgICAgICAgICAgICAgICAgICAgLyogZmlsZSBuYW1lICovCi0gICAgICAgICAgICB3aGlsZSAoTkVYVCgpICE9IDAgJiYgbGFzdCAhPSAtMSkKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgIGlmIChmbGFncyAmIDE2KSAgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1lbnQgKi8KLSAgICAgICAgICAgIHdoaWxlIChORVhUKCkgIT0gMCAmJiBsYXN0ICE9IC0xKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgaWYgKGZsYWdzICYgMikgeyAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIGNyYyAqLwotICAgICAgICAgICAgTkVYVCgpOwotICAgICAgICAgICAgTkVYVCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXN0ID09IC0xKSBicmVhazsKLQotICAgICAgICAvKiBzZXQgdXAgb3V0cHV0ICovCi0gICAgICAgIG91dGQub3V0ZmlsZSA9IG91dGZpbGU7Ci0gICAgICAgIG91dGQuY2hlY2sgPSAxOwotICAgICAgICBvdXRkLmNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotICAgICAgICBvdXRkLnRvdGFsID0gMDsKLQotICAgICAgICAvKiBkZWNvbXByZXNzIGRhdGEgdG8gb3V0cHV0ICovCi0gICAgICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OwotICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7Ci0gICAgICAgIHJldCA9IGluZmxhdGVCYWNrKHN0cm0sIGluLCBpbmRwLCBvdXQsICZvdXRkKTsKLSAgICAgICAgaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpIGJyZWFrOwotICAgICAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsKLSAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX2luOwotICAgICAgICBzdHJtLT5uZXh0X2luID0gWl9OVUxMOyAgICAgICAgICAgICAvKiBzbyBaX0JVRl9FUlJPUiBtZWFucyBFT0YgKi8KLQotICAgICAgICAvKiBjaGVjayB0cmFpbGVyICovCi0gICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOwotICAgICAgICBpZiAoTkVYVCgpICE9IChvdXRkLmNyYyAmIDB4ZmYpIHx8Ci0gICAgICAgICAgICBORVhUKCkgIT0gKChvdXRkLmNyYyA+PiA4KSAmIDB4ZmYpIHx8Ci0gICAgICAgICAgICBORVhUKCkgIT0gKChvdXRkLmNyYyA+PiAxNikgJiAweGZmKSB8fAotICAgICAgICAgICAgTkVYVCgpICE9ICgob3V0ZC5jcmMgPj4gMjQpICYgMHhmZikpIHsKLSAgICAgICAgICAgIC8qIGNyYyBlcnJvciAqLwotICAgICAgICAgICAgaWYgKGxhc3QgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgZGF0YSBjaGVjayI7Ci0gICAgICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE5FWFQoKSAhPSAob3V0ZC50b3RhbCAmIDB4ZmYpIHx8Ci0gICAgICAgICAgICBORVhUKCkgIT0gKChvdXRkLnRvdGFsID4+IDgpICYgMHhmZikgfHwKLSAgICAgICAgICAgIE5FWFQoKSAhPSAoKG91dGQudG90YWwgPj4gMTYpICYgMHhmZikgfHwKLSAgICAgICAgICAgIE5FWFQoKSAhPSAoKG91dGQudG90YWwgPj4gMjQpICYgMHhmZikpIHsKLSAgICAgICAgICAgIC8qIGxlbmd0aCBlcnJvciAqLwotICAgICAgICAgICAgaWYgKGxhc3QgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrIjsKLSAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGdvIGJhY2sgYW5kIGxvb2sgZm9yIGFub3RoZXIgZ3ppcCBzdHJlYW0gKi8KLSAgICB9Ci0KLSAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCi0gICAgcmV0dXJuIHJldDsKLX0KLQotLyogQ29weSBmaWxlIGF0dHJpYnV0ZXMsIGZyb20gLT4gdG8sIGFzIGJlc3Qgd2UgY2FuLiAgVGhpcyBpcyBiZXN0IGVmZm9ydCwgc28KLSAgIG5vIGVycm9ycyBhcmUgcmVwb3J0ZWQuICBUaGUgbW9kZSBiaXRzLCBpbmNsdWRpbmcgc3VpZCwgc2dpZCwgYW5kIHRoZSBzdGlja3kKLSAgIGJpdCBhcmUgY29waWVkIChpZiBhbGxvd2VkKSwgdGhlIG93bmVyJ3MgdXNlciBpZCBhbmQgZ3JvdXAgaWQgYXJlIGNvcGllZAotICAgKGFnYWluIGlmIGFsbG93ZWQpLCBhbmQgdGhlIGFjY2VzcyBhbmQgbW9kaWZ5IHRpbWVzIGFyZSBjb3BpZWQuICovCi1sb2NhbCB2b2lkIGNvcHltZXRhKGNoYXIgKmZyb20sIGNoYXIgKnRvKQotewotICAgIHN0cnVjdCBzdGF0IHdhczsKLSAgICBzdHJ1Y3QgdXRpbWJ1ZiB3aGVuOwotCi0gICAgLyogZ2V0IGFsbCBvZiBmcm9tJ3MgVW5peCBtZXRhIGRhdGEsIHJldHVybiBpZiBub3QgYSByZWd1bGFyIGZpbGUgKi8KLSAgICBpZiAoc3RhdChmcm9tLCAmd2FzKSAhPSAwIHx8ICh3YXMuc3RfbW9kZSAmIFNfSUZNVCkgIT0gU19JRlJFRykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogc2V0IHRvJ3MgbW9kZSBiaXRzLCBpZ25vcmUgZXJyb3JzICovCi0gICAgKHZvaWQpY2htb2QodG8sIHdhcy5zdF9tb2RlICYgMDc3NzcpOwotCi0gICAgLyogY29weSBvd25lcidzIHVzZXIgYW5kIGdyb3VwLCBpZ25vcmUgZXJyb3JzICovCi0gICAgKHZvaWQpY2hvd24odG8sIHdhcy5zdF91aWQsIHdhcy5zdF9naWQpOwotCi0gICAgLyogY29weSBhY2Nlc3MgYW5kIG1vZGlmeSB0aW1lcywgaWdub3JlIGVycm9ycyAqLwotICAgIHdoZW4uYWN0aW1lID0gd2FzLnN0X2F0aW1lOwotICAgIHdoZW4ubW9kdGltZSA9IHdhcy5zdF9tdGltZTsKLSAgICAodm9pZCl1dGltZSh0bywgJndoZW4pOwotfQotCi0vKiBEZWNvbXByZXNzIHRoZSBmaWxlIGlubmFtZSB0byB0aGUgZmlsZSBvdXRubmFtZSwgb2YgaWYgdGVzdCBpcyB0cnVlLCBqdXN0Ci0gICBkZWNvbXByZXNzIHdpdGhvdXQgd3JpdGluZyBhbmQgY2hlY2sgdGhlIGd6aXAgdHJhaWxlciBmb3IgaW50ZWdyaXR5LiAgSWYKLSAgIGlubmFtZSBpcyBOVUxMIG9yIGFuIGVtcHR5IHN0cmluZywgcmVhZCBmcm9tIHN0ZGluLiAgSWYgb3V0bmFtZSBpcyBOVUxMIG9yCi0gICBhbiBlbXB0eSBzdHJpbmcsIHdyaXRlIHRvIHN0ZG91dC4gIHN0cm0gaXMgYSBwcmUtaW5pdGlhbGl6ZWQgaW5mbGF0ZUJhY2sKLSAgIHN0cnVjdHVyZS4gIFdoZW4gYXBwcm9wcmlhdGUsIGNvcHkgdGhlIGZpbGUgYXR0cmlidXRlcyBmcm9tIGlubmFtZSB0bwotICAgb3V0bmFtZS4KLQotICAgZ3VuemlwKCkgcmV0dXJucyAxIGlmIHRoZXJlIGlzIGFuIG91dC1vZi1tZW1vcnkgZXJyb3Igb3IgYW4gdW5leHBlY3RlZAotICAgcmV0dXJuIGNvZGUgZnJvbSBndW5waXBlKCkuICBPdGhlcndpc2UgaXQgcmV0dXJucyAwLgotICovCi1sb2NhbCBpbnQgZ3VuemlwKHpfc3RyZWFtICpzdHJtLCBjaGFyICppbm5hbWUsIGNoYXIgKm91dG5hbWUsIGludCB0ZXN0KQotewotICAgIGludCByZXQ7Ci0gICAgaW50IGluZmlsZSwgb3V0ZmlsZTsKLQotICAgIC8qIG9wZW4gZmlsZXMgKi8KLSAgICBpZiAoaW5uYW1lID09IE5VTEwgfHwgKmlubmFtZSA9PSAwKSB7Ci0gICAgICAgIGlubmFtZSA9ICItIjsKLSAgICAgICAgaW5maWxlID0gMDsgICAgIC8qIHN0ZGluICovCi0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpbmZpbGUgPSBvcGVuKGlubmFtZSwgT19SRE9OTFksIDApOwotICAgICAgICBpZiAoaW5maWxlID09IC0xKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBjYW5ub3Qgb3BlbiAlc1xuIiwgaW5uYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh0ZXN0KQotICAgICAgICBvdXRmaWxlID0gLTE7Ci0gICAgZWxzZSBpZiAob3V0bmFtZSA9PSBOVUxMIHx8ICpvdXRuYW1lID09IDApIHsKLSAgICAgICAgb3V0bmFtZSA9ICItIjsKLSAgICAgICAgb3V0ZmlsZSA9IDE7ICAgIC8qIHN0ZG91dCAqLwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgb3V0ZmlsZSA9IG9wZW4ob3V0bmFtZSwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSwgMDY2Nik7Ci0gICAgICAgIGlmIChvdXRmaWxlID09IC0xKSB7Ci0gICAgICAgICAgICBjbG9zZShpbmZpbGUpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gY2Fubm90IGNyZWF0ZSAlc1xuIiwgb3V0bmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlcnJubyA9IDA7Ci0KLSAgICAvKiBkZWNvbXByZXNzICovCi0gICAgcmV0ID0gZ3VucGlwZShzdHJtLCBpbmZpbGUsIG91dGZpbGUpOwotICAgIGlmIChvdXRmaWxlID4gMikgY2xvc2Uob3V0ZmlsZSk7Ci0gICAgaWYgKGluZmlsZSA+IDIpIGNsb3NlKGluZmlsZSk7Ci0KLSAgICAvKiBpbnRlcnByZXQgcmVzdWx0ICovCi0gICAgc3dpdGNoIChyZXQpIHsKLSAgICBjYXNlIFpfT0s6Ci0gICAgY2FzZSBaX0VSUk5POgotICAgICAgICBpZiAoaW5maWxlID4gMiAmJiBvdXRmaWxlID4gMikgewotICAgICAgICAgICAgY29weW1ldGEoaW5uYW1lLCBvdXRuYW1lKTsgICAgICAgICAgLyogY29weSBhdHRyaWJ1dGVzICovCi0gICAgICAgICAgICB1bmxpbmsoaW5uYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0ID09IFpfRVJSTk8pCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biB3YXJuaW5nOiB0cmFpbGluZyBnYXJiYWdlIGlnbm9yZWQgaW4gJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgIGlubmFtZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgWl9EQVRBX0VSUk9SOgotICAgICAgICBpZiAob3V0ZmlsZSA+IDIpIHVubGluayhvdXRuYW1lKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gZGF0YSBlcnJvciBvbiAlczogJXNcbiIsIGlubmFtZSwgc3RybS0+bXNnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBaX01FTV9FUlJPUjoKLSAgICAgICAgaWYgKG91dGZpbGUgPiAyKSB1bmxpbmsob3V0bmFtZSk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIG91dCBvZiBtZW1vcnkgZXJyb3ItLWFib3J0aW5nXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBaX0JVRl9FUlJPUjoKLSAgICAgICAgaWYgKG91dGZpbGUgPiAyKSB1bmxpbmsob3V0bmFtZSk7Ci0gICAgICAgIGlmIChzdHJtLT5uZXh0X2luICE9IFpfTlVMTCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gd3JpdGUgZXJyb3Igb24gJXM6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICBvdXRuYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGVycm5vKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biByZWFkIGVycm9yIG9uICVzOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgaW5uYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gdW5leHBlY3RlZCBlbmQgb2YgZmlsZSBvbiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgaW5uYW1lKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBpZiAob3V0ZmlsZSA+IDIpIHVubGluayhvdXRuYW1lKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gaW50ZXJuYWwgZXJyb3ItLWFib3J0aW5nXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiBQcm9jZXNzIHRoZSBndW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIFNlZSB0aGUgY29tbWFuZCBzeW50YXggbmVhciB0aGUKLSAgIGJlZ2lubmluZyBvZiB0aGlzIHNvdXJjZSBmaWxlLiAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCByZXQsIGxlbiwgdGVzdDsKLSAgICBjaGFyICpvdXRuYW1lOwotICAgIHVuc2lnbmVkIGNoYXIgKndpbmRvdzsKLSAgICB6X3N0cmVhbSBzdHJtOwotCi0gICAgLyogaW5pdGlhbGl6ZSBpbmZsYXRlQmFjayBzdGF0ZSBmb3IgcmVwZWF0ZWQgdXNlICovCi0gICAgd2luZG93ID0gbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldXNlIExaVyBtYXRjaCBidWZmZXIgKi8KLSAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKLSAgICBzdHJtLnpmcmVlID0gWl9OVUxMOwotICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOwotICAgIHJldCA9IGluZmxhdGVCYWNrSW5pdCgmc3RybSwgMTUsIHdpbmRvdyk7Ci0gICAgaWYgKHJldCAhPSBaX09LKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIG91dCBvZiBtZW1vcnkgZXJyb3ItLWFib3J0aW5nXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogZGVjb21wcmVzcyBlYWNoIGZpbGUgdG8gdGhlIHNhbWUgbmFtZSB3aXRoIHRoZSBzdWZmaXggcmVtb3ZlZCAqLwotICAgIGFyZ2MtLTsKLSAgICBhcmd2Kys7Ci0gICAgdGVzdCA9IDA7Ci0gICAgaWYgKGFyZ2MgJiYgc3RyY21wKCphcmd2LCAiLWgiKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIDEuMyAoMTIgSnVuIDIwMDUpXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3B5cmlnaHQgKGMpIDIwMDUgTWFyayBBZGxlclxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGd1biBbLXRdIFtmaWxlMS5neiBbZmlsZTIuWiAuLi5dXVxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoYXJnYyAmJiBzdHJjbXAoKmFyZ3YsICItdCIpID09IDApIHsKLSAgICAgICAgdGVzdCA9IDE7Ci0gICAgICAgIGFyZ2MtLTsKLSAgICAgICAgYXJndisrOwotICAgIH0KLSAgICBpZiAoYXJnYykKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKHRlc3QpCi0gICAgICAgICAgICAgICAgb3V0bmFtZSA9IE5VTEw7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsZW4gPSAoaW50KXN0cmxlbigqYXJndik7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcCgqYXJndiArIGxlbiAtIDMsICIuZ3oiKSA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNtcCgqYXJndiArIGxlbiAtIDMsICItZ3oiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YgKyBsZW4gLSAyLCAiLnoiKSA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNtcCgqYXJndiArIGxlbiAtIDIsICIteiIpID09IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgc3RyY21wKCphcmd2ICsgbGVuIC0gMiwgIl96IikgPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICBzdHJjbXAoKmFyZ3YgKyBsZW4gLSAyLCAiLloiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMjsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gZXJyb3I6IG5vIGd6IHR5cGUgb24gJXMtLXNraXBwaW5nXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dG5hbWUgPSBtYWxsb2MobGVuICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKG91dG5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBvdXQgb2YgbWVtb3J5IGVycm9yLS1hYm9ydGluZ1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkob3V0bmFtZSwgKmFyZ3YsIGxlbik7Ci0gICAgICAgICAgICAgICAgb3V0bmFtZVtsZW5dID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldCA9IGd1bnppcCgmc3RybSwgKmFyZ3YsIG91dG5hbWUsIHRlc3QpOwotICAgICAgICAgICAgaWYgKG91dG5hbWUgIT0gTlVMTCkgZnJlZShvdXRuYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXQpIGJyZWFrOwotICAgICAgICB9IHdoaWxlIChhcmd2KyssIC0tYXJnYyk7Ci0gICAgZWxzZQotICAgICAgICByZXQgPSBndW56aXAoJnN0cm0sIE5VTEwsIE5VTEwsIHRlc3QpOwotCi0gICAgLyogY2xlYW4gdXAgKi8KLSAgICBpbmZsYXRlQmFja0VuZCgmc3RybSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9leGFtcGxlcy9nemFwcGVuZC5jIGIvbGlicy96bGliL2V4YW1wbGVzL2d6YXBwZW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZTg3OGUuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2V4YW1wbGVzL2d6YXBwZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDAgKzAsMCBAQAotLyogZ3phcHBlbmQgLS0gY29tbWFuZCB0byBhcHBlbmQgdG8gYSBnemlwIGZpbGUKLQotICBDb3B5cmlnaHQgKEMpIDIwMDMgTWFyayBBZGxlciwgYWxsIHJpZ2h0cyByZXNlcnZlZAotICB2ZXJzaW9uIDEuMSwgNCBOb3YgMjAwMwotCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIE1hcmsgQWRsZXIgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQotICovCi0KLS8qCi0gKiBDaGFuZ2UgaGlzdG9yeToKLSAqCi0gKiAxLjAgIDE5IE9jdCAyMDAzICAgICAtIEZpcnN0IHZlcnNpb24KLSAqIDEuMSAgIDQgTm92IDIwMDMgICAgIC0gRXhwYW5kIGFuZCBjbGFyaWZ5IHNvbWUgY29tbWVudHMgYW5kIG5vdGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCB2ZXJzaW9uIGFuZCBjb3B5cmlnaHQgdG8gaGVscAotICogICAgICAgICAgICAgICAgICAgICAgLSBTZW5kIGhlbHAgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBzb21lIHByZWVtcHRpdmUgdHlwZWNhc3RzCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBMIHRvIGNvbnN0YW50cyBpbiBsc2VlaygpIGNhbGxzCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIFJlbW92ZSBzb21lIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiBlcnJvciBtZXNzYWdlcwotICogICAgICAgICAgICAgICAgICAgICAgLSBVc2UgbmV3IGRhdGFfdHlwZSBkZWZpbml0aW9uIGZvciB6bGliIDEuMi4xCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIFNpbXBsZnkgYW5kIHVuaWZ5IGZpbGUgb3BlcmF0aW9ucwotICogICAgICAgICAgICAgICAgICAgICAgLSBGaW5pc2ggb2ZmIGd6aXAgZmlsZSBpbiBnenRhY2soKQotICogICAgICAgICAgICAgICAgICAgICAgLSBVc2UgZGVmbGF0ZVByaW1lKCkgaW5zdGVhZCBvZiBhZGRpbmcgZW1wdHkgYmxvY2tzCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIEtlZXAgZ3ppcCBmaWxlIGNsZWFuIG9uIGFwcGVuZGVkIGZpbGUgcmVhZCBlcnJvcnMKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gVXNlIGluLXBsYWNlIHJvdGF0ZSBpbnN0ZWFkIG9mIGF1eGlsaWFyeSBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKFdoeSB5b3UgYXNrPyAgQmVjYXVzZSBpdCB3YXMgZnVuIHRvIHdyaXRlISkKLSAqLwotCi0vKgotICAgZ3phcHBlbmQgdGFrZXMgYSBnemlwIGZpbGUgYW5kIGFwcGVuZHMgdG8gaXQsIGNvbXByZXNzaW5nIGZpbGVzIGZyb20gdGhlCi0gICBjb21tYW5kIGxpbmUgb3IgZGF0YSBmcm9tIHN0ZGluLiAgVGhlIGd6aXAgZmlsZSBpcyB3cml0dGVuIHRvIGRpcmVjdGx5LCB0bwotICAgYXZvaWQgY29weWluZyB0aGF0IGZpbGUsIGluIGNhc2UgaXQncyBsYXJnZS4gIE5vdGUgdGhhdCB0aGlzIHJlc3VsdHMgaW4gdGhlCi0gICB1bmZyaWVuZGx5IGJlaGF2aW9yIHRoYXQgaWYgZ3phcHBlbmQgZmFpbHMsIHRoZSBnemlwIGZpbGUgaXMgY29ycnVwdGVkLgotCi0gICBUaGlzIHByb2dyYW0gd2FzIHdyaXR0ZW4gdG8gaWxsdXN0cmF0ZSB0aGUgdXNlIG9mIHRoZSBuZXcgWl9CTE9DSyBvcHRpb24gb2YKLSAgIHpsaWIgMS4yLngncyBpbmZsYXRlKCkgZnVuY3Rpb24uICBUaGlzIG9wdGlvbiByZXR1cm5zIGZyb20gaW5mbGF0ZSgpIGF0IGVhY2gKLSAgIGJsb2NrIGJvdW5kYXJ5IHRvIGZhY2lsaXRhdGUgbG9jYXRpbmcgYW5kIG1vZGlmeWluZyB0aGUgbGFzdCBibG9jayBiaXQgYXQKLSAgIHRoZSBzdGFydCBvZiB0aGUgZmluYWwgZGVmbGF0ZSBibG9jay4gIEFsc28gd2hldGhlciB1c2luZyBaX0JMT0NLIG9yIG5vdCwKLSAgIGFub3RoZXIgcmVxdWlyZWQgZmVhdHVyZSBvZiB6bGliIDEuMi54IGlzIHRoYXQgaW5mbGF0ZSgpIG5vdyBwcm92aWRlcyB0aGUKLSAgIG51bWJlciBvZiB1bnVzdWVkIGJpdHMgaW4gdGhlIGxhc3QgaW5wdXQgYnl0ZSB1c2VkLiAgZ3phcHBlbmQgd2lsbCBub3Qgd29yawotICAgd2l0aCB2ZXJzaW9ucyBvZiB6bGliIGVhcmxpZXIgdGhhbiAxLjIuMS4KLQotICAgZ3phcHBlbmQgZmlyc3QgZGVjb21wcmVzc2VzIHRoZSBnemlwIGZpbGUgaW50ZXJuYWxseSwgZGlzY2FyZGluZyBhbGwgYnV0Ci0gICB0aGUgbGFzdCAzMksgb2YgdW5jb21wcmVzc2VkIGRhdGEsIGFuZCBub3RpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IGJsb2NrCi0gICBiaXQgYW5kIHRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLgotICAgVGhlIGd6aXAgdHJhaWxlciBjb250YWluaW5nIHRoZSBDUkMtMzIgYW5kIGxlbmd0aCBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEKLSAgIGlzIHZlcmlmaWVkLiAgVGhpcyB0cmFpbGVyIHdpbGwgYmUgbGF0ZXIgb3ZlcndyaXR0ZW4uCi0KLSAgIFRoZW4gdGhlIGxhc3QgYmxvY2sgYml0IGlzIGNsZWFyZWQgYnkgc2Vla2luZyBiYWNrIGluIHRoZSBmaWxlIGFuZCByZXdyaXRpbmcKLSAgIHRoZSBieXRlIHRoYXQgY29udGFpbnMgaXQuICBTZWVraW5nIGZvcndhcmQsIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGNvbXByZXNzZWQKLSAgIGRhdGEgaXMgc2F2ZWQgYWxvbmcgd2l0aCB0aGUgbnVtYmVyIG9mIHVudXNlZCBiaXRzIHRvIGluaXRpYWxpemUgZGVmbGF0ZS4KLQotICAgQSBkZWZsYXRlIHByb2Nlc3MgaXMgaW5pdGlhbGl6ZWQsIHVzaW5nIHRoZSBsYXN0IDMySyBvZiB0aGUgdW5jb21wcmVzc2VkCi0gICBkYXRhIGZyb20gdGhlIGd6aXAgZmlsZSB0byBpbml0aWFsaXplIHRoZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIHRvdGFsCi0gICB1bmNvbXByZXNzZWQgZGF0YSB3YXMgbGVzcyB0aGFuIDMySywgdGhlbiBhbGwgb2YgaXQgaXMgdXNlZCB0byBpbml0aWFsaXplCi0gICB0aGUgZGljdGlvbmFyeS4gIFRoZSBkZWZsYXRlIG91dHB1dCBiaXQgYnVmZmVyIGlzIGFsc28gaW5pdGlhbGl6ZWQgd2l0aCB0aGUKLSAgIGxhc3QgYml0cyBmcm9tIHRoZSBvcmlnaW5hbCBkZWZsYXRlIHN0cmVhbS4gIEZyb20gaGVyZSBvbiwgdGhlIGRhdGEgdG8KLSAgIGFwcGVuZCBpcyBzaW1wbHkgY29tcHJlc3NlZCB1c2luZyBkZWZsYXRlLCBhbmQgd3JpdHRlbiB0byB0aGUgZ3ppcCBmaWxlLgotICAgV2hlbiB0aGF0IGlzIGNvbXBsZXRlLCB0aGUgbmV3IENSQy0zMiBhbmQgdW5jb21wcmVzc2VkIGxlbmd0aCBhcmUgd3JpdHRlbgotICAgYXMgdGhlIHRyYWlsZXIgb2YgdGhlIGd6aXAgZmlsZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgInpsaWIuaCIKLQotI2RlZmluZSBsb2NhbCBzdGF0aWMKLSNkZWZpbmUgTEdDSFVOSyAxNAotI2RlZmluZSBDSFVOSyAoMVUgPDwgTEdDSFVOSykKLSNkZWZpbmUgRFNJWkUgMzI3NjhVCi0KLS8qIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIHRlcm1pbmF0ZSB3aXRoIGV4dHJlbWUgcHJlanVkaWNlICovCi1sb2NhbCB2b2lkIGJ5ZShjaGFyICptc2cxLCBjaGFyICptc2cyKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiZ3phcHBlbmQgZXJyb3I6ICVzJXNcbiIsIG1zZzEsIG1zZzIpOwotICAgIGV4aXQoMSk7Ci19Ci0KLS8qIHJldHVybiB0aGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YgYSBhbmQgYiB1c2luZyBFdWNsaWQncyBhbGdvcml0aG0sCi0gICBtb2RpZmllZCB0byBiZSBmYXN0IHdoZW4gb25lIGFyZ3VtZW50IG11Y2ggZ3JlYXRlciB0aGFuIHRoZSBvdGhlciwgYW5kCi0gICBjb2RlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBzd2FwcGluZyAqLwotbG9jYWwgdW5zaWduZWQgZ2NkKHVuc2lnbmVkIGEsIHVuc2lnbmVkIGIpCi17Ci0gICAgdW5zaWduZWQgYzsKLQotICAgIHdoaWxlIChhICYmIGIpCi0gICAgICAgIGlmIChhID4gYikgewotICAgICAgICAgICAgYyA9IGI7Ci0gICAgICAgICAgICB3aGlsZSAoYSAtIGMgPj0gYykKLSAgICAgICAgICAgICAgICBjIDw8PSAxOwotICAgICAgICAgICAgYSAtPSBjOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYyA9IGE7Ci0gICAgICAgICAgICB3aGlsZSAoYiAtIGMgPj0gYykKLSAgICAgICAgICAgICAgICBjIDw8PSAxOwotICAgICAgICAgICAgYiAtPSBjOwotICAgICAgICB9Ci0gICAgcmV0dXJuIGEgKyBiOwotfQotCi0vKiByb3RhdGUgbGlzdFswLi5sZW4tMV0gbGVmdCBieSByb3QgcG9zaXRpb25zLCBpbiBwbGFjZSAqLwotbG9jYWwgdm9pZCByb3RhdGUodW5zaWduZWQgY2hhciAqbGlzdCwgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCByb3QpCi17Ci0gICAgdW5zaWduZWQgY2hhciB0bXA7Ci0gICAgdW5zaWduZWQgY3ljbGVzOwotICAgIHVuc2lnbmVkIGNoYXIgKnN0YXJ0LCAqbGFzdCwgKnRvLCAqZnJvbTsKLQotICAgIC8qIG5vcm1hbGl6ZSByb3QgYW5kIGhhbmRsZSBkZWdlbmVyYXRlIGNhc2VzICovCi0gICAgaWYgKGxlbiA8IDIpIHJldHVybjsKLSAgICBpZiAocm90ID49IGxlbikgcm90ICU9IGxlbjsKLSAgICBpZiAocm90ID09IDApIHJldHVybjsKLQotICAgIC8qIHBvaW50ZXIgdG8gbGFzdCBlbnRyeSBpbiBsaXN0ICovCi0gICAgbGFzdCA9IGxpc3QgKyAobGVuIC0gMSk7Ci0KLSAgICAvKiBkbyBzaW1wbGUgbGVmdCBzaGlmdCBieSBvbmUgKi8KLSAgICBpZiAocm90ID09IDEpIHsKLSAgICAgICAgdG1wID0gKmxpc3Q7Ci0gICAgICAgIG1lbWNweShsaXN0LCBsaXN0ICsgMSwgbGVuIC0gMSk7Ci0gICAgICAgICpsYXN0ID0gdG1wOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogZG8gc2ltcGxlIHJpZ2h0IHNoaWZ0IGJ5IG9uZSAqLwotICAgIGlmIChyb3QgPT0gbGVuIC0gMSkgewotICAgICAgICB0bXAgPSAqbGFzdDsKLSAgICAgICAgbWVtbW92ZShsaXN0ICsgMSwgbGlzdCwgbGVuIC0gMSk7Ci0gICAgICAgICpsaXN0ID0gdG1wOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogb3RoZXJ3aXNlIGRvIHJvdGF0ZSBhcyBhIHNldCBvZiBjeWNsZXMgaW4gcGxhY2UgKi8KLSAgICBjeWNsZXMgPSBnY2QobGVuLCByb3QpOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY3ljbGVzICovCi0gICAgZG8gewotICAgICAgICBzdGFydCA9IGZyb20gPSBsaXN0ICsgY3ljbGVzOyAgIC8qIHN0YXJ0IGluZGV4IGlzIGFyYml0cmFyeSAqLwotICAgICAgICB0bXAgPSAqZnJvbTsgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgZW50cnkgdG8gYmUgb3ZlcndyaXR0ZW4gKi8KLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgdG8gPSBmcm9tOyAgICAgICAgICAgICAgICAgIC8qIG5leHQgc3RlcCBpbiBjeWNsZSAqLwotICAgICAgICAgICAgZnJvbSArPSByb3Q7ICAgICAgICAgICAgICAgIC8qIGdvIHJpZ2h0IHJvdCBwb3NpdGlvbnMgKi8KLSAgICAgICAgICAgIGlmIChmcm9tID4gbGFzdCkgZnJvbSAtPSBsZW47ICAgLyogKHBvaW50ZXIgYmV0dGVyIG5vdCB3cmFwKSAqLwotICAgICAgICAgICAgaWYgKGZyb20gPT0gc3RhcnQpIGJyZWFrOyAgIC8qIGFsbCBidXQgb25lIHNoaWZ0ZWQgKi8KLSAgICAgICAgICAgICp0byA9ICpmcm9tOyAgICAgICAgICAgICAgICAvKiBzaGlmdCBsZWZ0ICovCi0gICAgICAgIH0KLSAgICAgICAgKnRvID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wbGV0ZSB0aGUgY2lyY2xlICovCi0gICAgfSB3aGlsZSAoLS1jeWNsZXMpOwotfQotCi0vKiBzdHJ1Y3R1cmUgZm9yIGd6aXAgZmlsZSByZWFkIG9wZXJhdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgZmQ7ICAgICAgICAgICAgICAgICAgICAgLyogZmlsZSBkZXNjcmlwdG9yICovCi0gICAgaW50IHNpemU7ICAgICAgICAgICAgICAgICAgIC8qIDEgPDwgc2l6ZSBpcyBieXRlcyBpbiBidWYgKi8KLSAgICB1bnNpZ25lZCBsZWZ0OyAgICAgICAgICAgICAgLyogYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHQgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpidWY7ICAgICAgICAgLyogYnVmZmVyICovCi0gICAgdW5zaWduZWQgY2hhciAqbmV4dDsgICAgICAgIC8qIG5leHQgYnl0ZSBpbiBidWZmZXIgKi8KLSAgICBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgLyogZmlsZSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLwotfSBmaWxlOwotCi0vKiByZWxvYWQgYnVmZmVyICovCi1sb2NhbCBpbnQgcmVhZGluKGZpbGUgKmluKQotewotICAgIGludCBsZW47Ci0KLSAgICBsZW4gPSByZWFkKGluLT5mZCwgaW4tPmJ1ZiwgMSA8PCBpbi0+c2l6ZSk7Ci0gICAgaWYgKGxlbiA9PSAtMSkgYnllKCJlcnJvciByZWFkaW5nICIsIGluLT5uYW1lKTsKLSAgICBpbi0+bGVmdCA9ICh1bnNpZ25lZClsZW47Ci0gICAgaW4tPm5leHQgPSBpbi0+YnVmOwotICAgIHJldHVybiBsZW47Ci19Ci0KLS8qIHJlYWQgZnJvbSBmaWxlIGluLCBleGl0IGlmIGVuZC1vZi1maWxlICovCi1sb2NhbCBpbnQgcmVhZG1vcmUoZmlsZSAqaW4pCi17Ci0gICAgaWYgKHJlYWRpbihpbikgPT0gMCkgYnllKCJ1bmV4cGVjdGVkIGVuZCBvZiAiLCBpbi0+bmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgcmVhZDEoaW4pIChpbi0+bGVmdCA9PSAwID8gcmVhZG1vcmUoaW4pIDogMCwgXAotICAgICAgICAgICAgICAgICAgIGluLT5sZWZ0LS0sICooaW4tPm5leHQpKyspCi0KLS8qIHNraXAgb3ZlciBuIGJ5dGVzIG9mIGluICovCi1sb2NhbCB2b2lkIHNraXAoZmlsZSAqaW4sIHVuc2lnbmVkIG4pCi17Ci0gICAgdW5zaWduZWQgYnlwYXNzOwotCi0gICAgaWYgKG4gPiBpbi0+bGVmdCkgewotICAgICAgICBuIC09IGluLT5sZWZ0OwotICAgICAgICBieXBhc3MgPSBuICYgfigoMVUgPDwgaW4tPnNpemUpIC0gMSk7Ci0gICAgICAgIGlmIChieXBhc3MpIHsKLSAgICAgICAgICAgIGlmIChsc2Vlayhpbi0+ZmQsIChvZmZfdClieXBhc3MsIFNFRUtfQ1VSKSA9PSAtMSkKLSAgICAgICAgICAgICAgICBieWUoInNlZWtpbmcgIiwgaW4tPm5hbWUpOwotICAgICAgICAgICAgbiAtPSBieXBhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgcmVhZG1vcmUoaW4pOwotICAgICAgICBpZiAobiA+IGluLT5sZWZ0KQotICAgICAgICAgICAgYnllKCJ1bmV4cGVjdGVkIGVuZCBvZiAiLCBpbi0+bmFtZSk7Ci0gICAgfQotICAgIGluLT5sZWZ0IC09IG47Ci0gICAgaW4tPm5leHQgKz0gbjsKLX0KLQotLyogcmVhZCBhIGZvdXItYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyLCBsaXR0bGUtZW5kaWFuLCBmcm9tIGluICovCi11bnNpZ25lZCBsb25nIHJlYWQ0KGZpbGUgKmluKQotewotICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gICAgdmFsID0gcmVhZDEoaW4pOwotICAgIHZhbCArPSAodW5zaWduZWQpcmVhZDEoaW4pIDw8IDg7Ci0gICAgdmFsICs9ICh1bnNpZ25lZCBsb25nKXJlYWQxKGluKSA8PCAxNjsKLSAgICB2YWwgKz0gKHVuc2lnbmVkIGxvbmcpcmVhZDEoaW4pIDw8IDI0OwotICAgIHJldHVybiB2YWw7Ci19Ci0KLS8qIHNraXAgb3ZlciBnemlwIGhlYWRlciAqLwotbG9jYWwgdm9pZCBnemhlYWRlcihmaWxlICppbikKLXsKLSAgICBpbnQgZmxhZ3M7Ci0gICAgdW5zaWduZWQgbjsKLQotICAgIGlmIChyZWFkMShpbikgIT0gMzEgfHwgcmVhZDEoaW4pICE9IDEzOSkgYnllKGluLT5uYW1lLCAiIG5vdCBhIGd6aXAgZmlsZSIpOwotICAgIGlmIChyZWFkMShpbikgIT0gOCkgYnllKCJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCBpbiIsIGluLT5uYW1lKTsKLSAgICBmbGFncyA9IHJlYWQxKGluKTsKLSAgICBpZiAoZmxhZ3MgJiAweGUwKSBieWUoInVua25vd24gaGVhZGVyIGZsYWdzIHNldCBpbiIsIGluLT5uYW1lKTsKLSAgICBza2lwKGluLCA2KTsKLSAgICBpZiAoZmxhZ3MgJiA0KSB7Ci0gICAgICAgIG4gPSByZWFkMShpbik7Ci0gICAgICAgIG4gKz0gKHVuc2lnbmVkKShyZWFkMShpbikpIDw8IDg7Ci0gICAgICAgIHNraXAoaW4sIG4pOwotICAgIH0KLSAgICBpZiAoZmxhZ3MgJiA4KSB3aGlsZSAocmVhZDEoaW4pICE9IDApIDsKLSAgICBpZiAoZmxhZ3MgJiAxNikgd2hpbGUgKHJlYWQxKGluKSAhPSAwKSA7Ci0gICAgaWYgKGZsYWdzICYgMikgc2tpcChpbiwgMik7Ci19Ci0KLS8qIGRlY29tcHJlc3MgZ3ppcCBmaWxlICJuYW1lIiwgcmV0dXJuIHN0cm0gd2l0aCBhIGRlZmxhdGUgc3RyZWFtIHJlYWR5IHRvCi0gICBjb250aW51ZSBjb21wcmVzc2lvbiBvZiB0aGUgZGF0YSBpbiB0aGUgZ3ppcCBmaWxlLCBhbmQgcmV0dXJuIGEgZmlsZQotICAgZGVzY3JpcHRvciBwb2ludGluZyB0byB3aGVyZSB0byB3cml0ZSB0aGUgY29tcHJlc3NlZCBkYXRhIC0tIHRoZSBkZWZsYXRlCi0gICBzdHJlYW0gaXMgaW5pdGlhbGl6ZWQgdG8gY29tcHJlc3MgdXNpbmcgbGV2ZWwgImxldmVsIiAqLwotbG9jYWwgaW50IGd6c2NhbihjaGFyICpuYW1lLCB6X3N0cmVhbSAqc3RybSwgaW50IGxldmVsKQotewotICAgIGludCByZXQsIGxhc3RiaXQsIGxlZnQsIGZ1bGw7Ci0gICAgdW5zaWduZWQgaGF2ZTsKLSAgICB1bnNpZ25lZCBsb25nIGNyYywgdG90OwotICAgIHVuc2lnbmVkIGNoYXIgKndpbmRvdzsKLSAgICBvZmZfdCBsYXN0b2ZmLCBlbmQ7Ci0gICAgZmlsZSBnejsKLQotICAgIC8qIG9wZW4gZ3ppcCBmaWxlICovCi0gICAgZ3oubmFtZSA9IG5hbWU7Ci0gICAgZ3ouZmQgPSBvcGVuKG5hbWUsIE9fUkRXUiwgMCk7Ci0gICAgaWYgKGd6LmZkID09IC0xKSBieWUoImNhbm5vdCBvcGVuICIsIG5hbWUpOwotICAgIGd6LmJ1ZiA9IG1hbGxvYyhDSFVOSyk7Ci0gICAgaWYgKGd6LmJ1ZiA9PSBOVUxMKSBieWUoIm91dCBvZiBtZW1vcnkiLCAiIik7Ci0gICAgZ3ouc2l6ZSA9IExHQ0hVTks7Ci0gICAgZ3oubGVmdCA9IDA7Ci0KLSAgICAvKiBza2lwIGd6aXAgaGVhZGVyICovCi0gICAgZ3poZWFkZXIoJmd6KTsKLQotICAgIC8qIHByZXBhcmUgdG8gZGVjb21wcmVzcyAqLwotICAgIHdpbmRvdyA9IG1hbGxvYyhEU0laRSk7Ci0gICAgaWYgKHdpbmRvdyA9PSBOVUxMKSBieWUoIm91dCBvZiBtZW1vcnkiLCAiIik7Ci0gICAgc3RybS0+emFsbG9jID0gWl9OVUxMOwotICAgIHN0cm0tPnpmcmVlID0gWl9OVUxMOwotICAgIHN0cm0tPm9wYXF1ZSA9IFpfTlVMTDsKLSAgICByZXQgPSBpbmZsYXRlSW5pdDIoc3RybSwgLTE1KTsKLSAgICBpZiAocmV0ICE9IFpfT0spIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIgb3IgbGlicmFyeSBtaXNtYXRjaCIpOwotCi0gICAgLyogZGVjb21wcmVzcyB0aGUgZGVmbGF0ZSBzdHJlYW0sIHNhdmluZyBhcHBlbmQgaW5mb3JtYXRpb24gKi8KLSAgICBsYXN0Yml0ID0gMDsKLSAgICBsYXN0b2ZmID0gbHNlZWsoZ3ouZmQsIDBMLCBTRUVLX0NVUikgLSBnei5sZWZ0OwotICAgIGxlZnQgPSAwOwotICAgIHN0cm0tPmF2YWlsX2luID0gZ3oubGVmdDsKLSAgICBzdHJtLT5uZXh0X2luID0gZ3oubmV4dDsKLSAgICBjcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICBoYXZlID0gZnVsbCA9IDA7Ci0gICAgZG8gewotICAgICAgICAvKiBpZiBuZWVkZWQsIGdldCBtb3JlIGlucHV0ICovCi0gICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICAgICAgICByZWFkbW9yZSgmZ3opOwotICAgICAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBnei5sZWZ0OwotICAgICAgICAgICAgc3RybS0+bmV4dF9pbiA9IGd6Lm5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzZXQgdXAgb3V0cHV0IHRvIG5leHQgYXZhaWxhYmxlIHNlY3Rpb24gb2Ygc2xpZGluZyB3aW5kb3cgKi8KLSAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gRFNJWkUgLSBoYXZlOwotICAgICAgICBzdHJtLT5uZXh0X291dCA9IHdpbmRvdyArIGhhdmU7Ci0KLSAgICAgICAgLyogaW5mbGF0ZSBhbmQgY2hlY2sgZm9yIGVycm9ycyAqLwotICAgICAgICByZXQgPSBpbmZsYXRlKHN0cm0sIFpfQkxPQ0spOwotICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VSUk9SKSBieWUoImludGVybmFsIHN0cmVhbSBlcnJvciEiLCAiIik7Ci0gICAgICAgIGlmIChyZXQgPT0gWl9NRU1fRVJST1IpIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKLSAgICAgICAgaWYgKHJldCA9PSBaX0RBVEFfRVJST1IpCi0gICAgICAgICAgICBieWUoImludmFsaWQgY29tcHJlc3NlZCBkYXRhLS1mb3JtYXQgdmlvbGF0ZWQgaW4iLCBuYW1lKTsKLQotICAgICAgICAvKiB1cGRhdGUgY3JjIGFuZCBzbGlkaW5nIHdpbmRvdyBwb2ludGVyICovCi0gICAgICAgIGNyYyA9IGNyYzMyKGNyYywgd2luZG93ICsgaGF2ZSwgRFNJWkUgLSBoYXZlIC0gc3RybS0+YXZhaWxfb3V0KTsKLSAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCkKLSAgICAgICAgICAgIGhhdmUgPSBEU0laRSAtIHN0cm0tPmF2YWlsX291dDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBoYXZlID0gMDsKLSAgICAgICAgICAgIGZ1bGwgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcHJvY2VzcyBlbmQgb2YgYmxvY2sgKi8KLSAgICAgICAgaWYgKHN0cm0tPmRhdGFfdHlwZSAmIDEyOCkgewotICAgICAgICAgICAgaWYgKHN0cm0tPmRhdGFfdHlwZSAmIDY0KQotICAgICAgICAgICAgICAgIGxlZnQgPSBzdHJtLT5kYXRhX3R5cGUgJiAweDFmOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGFzdGJpdCA9IHN0cm0tPmRhdGFfdHlwZSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgbGFzdG9mZiA9IGxzZWVrKGd6LmZkLCAwTCwgU0VFS19DVVIpIC0gc3RybS0+YXZhaWxfaW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChyZXQgIT0gWl9TVFJFQU1fRU5EKTsKLSAgICBpbmZsYXRlRW5kKHN0cm0pOwotICAgIGd6LmxlZnQgPSBzdHJtLT5hdmFpbF9pbjsKLSAgICBnei5uZXh0ID0gc3RybS0+bmV4dF9pbjsKLQotICAgIC8qIHNhdmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSAqLwotICAgIGVuZCA9IGxzZWVrKGd6LmZkLCAwTCwgU0VFS19DVVIpIC0gZ3oubGVmdDsKLQotICAgIC8qIGNoZWNrIGd6aXAgdHJhaWxlciBhbmQgc2F2ZSB0b3RhbCBmb3IgZGVmbGF0ZSAqLwotICAgIGlmIChjcmMgIT0gcmVhZDQoJmd6KSkKLSAgICAgICAgYnllKCJpbnZhbGlkIGNvbXByZXNzZWQgZGF0YS0tY3JjIG1pc21hdGNoIGluICIsIG5hbWUpOwotICAgIHRvdCA9IHN0cm0tPnRvdGFsX291dDsKLSAgICBpZiAoKHRvdCAmIDB4ZmZmZmZmZmZVTCkgIT0gcmVhZDQoJmd6KSkKLSAgICAgICAgYnllKCJpbnZhbGlkIGNvbXByZXNzZWQgZGF0YS0tbGVuZ3RoIG1pc21hdGNoIGluIiwgbmFtZSk7Ci0KLSAgICAvKiBpZiBub3QgYXQgZW5kIG9mIGZpbGUsIHdhcm4gKi8KLSAgICBpZiAoZ3oubGVmdCB8fCByZWFkaW4oJmd6KSkKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAiZ3phcHBlbmQgd2FybmluZzoganVuayBhdCBlbmQgb2YgZ3ppcCBmaWxlIG92ZXJ3cml0dGVuXG4iKTsKLQotICAgIC8qIGNsZWFyIGxhc3QgYmxvY2sgYml0ICovCi0gICAgbHNlZWsoZ3ouZmQsIGxhc3RvZmYgLSAobGFzdGJpdCAhPSAwKSwgU0VFS19TRVQpOwotICAgIGlmIChyZWFkKGd6LmZkLCBnei5idWYsIDEpICE9IDEpIGJ5ZSgicmVhZGluZyBhZnRlciBzZWVrIG9uICIsIG5hbWUpOwotICAgICpnei5idWYgPSAodW5zaWduZWQgY2hhcikoKmd6LmJ1ZiBeICgxIDw8ICgoOCAtIGxhc3RiaXQpICYgNykpKTsKLSAgICBsc2Vlayhnei5mZCwgLTFMLCBTRUVLX0NVUik7Ci0gICAgaWYgKHdyaXRlKGd6LmZkLCBnei5idWYsIDEpICE9IDEpIGJ5ZSgid3JpdGluZyBhZnRlciBzZWVrIHRvICIsIG5hbWUpOwotCi0gICAgLyogaWYgd2luZG93IHdyYXBwZWQsIGJ1aWxkIGRpY3Rpb25hcnkgZnJvbSB3aW5kb3cgYnkgcm90YXRpbmcgKi8KLSAgICBpZiAoZnVsbCkgewotICAgICAgICByb3RhdGUod2luZG93LCBEU0laRSwgaGF2ZSk7Ci0gICAgICAgIGhhdmUgPSBEU0laRTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgdXAgZGVmbGF0ZSBzdHJlYW0gd2l0aCB3aW5kb3csIGNyYywgdG90YWxfaW4sIGFuZCBsZWZ0b3ZlciBiaXRzICovCi0gICAgcmV0ID0gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCAtMTUsIDgsIFpfREVGQVVMVF9TVFJBVEVHWSk7Ci0gICAgaWYgKHJldCAhPSBaX09LKSBieWUoIm91dCBvZiBtZW1vcnkiLCAiIik7Ci0gICAgZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgd2luZG93LCBoYXZlKTsKLSAgICBzdHJtLT5hZGxlciA9IGNyYzsKLSAgICBzdHJtLT50b3RhbF9pbiA9IHRvdDsKLSAgICBpZiAobGVmdCkgewotICAgICAgICBsc2Vlayhnei5mZCwgLS1lbmQsIFNFRUtfU0VUKTsKLSAgICAgICAgaWYgKHJlYWQoZ3ouZmQsIGd6LmJ1ZiwgMSkgIT0gMSkgYnllKCJyZWFkaW5nIGFmdGVyIHNlZWsgb24gIiwgbmFtZSk7Ci0gICAgICAgIGRlZmxhdGVQcmltZShzdHJtLCA4IC0gbGVmdCwgKmd6LmJ1Zik7Ci0gICAgfQotICAgIGxzZWVrKGd6LmZkLCBlbmQsIFNFRUtfU0VUKTsKLQotICAgIC8qIGNsZWFuIHVwIGFuZCByZXR1cm4gKi8KLSAgICBmcmVlKHdpbmRvdyk7Ci0gICAgZnJlZShnei5idWYpOwotICAgIHJldHVybiBnei5mZDsKLX0KLQotLyogYXBwZW5kIGZpbGUgIm5hbWUiIHRvIGd6aXAgZmlsZSBnZCB1c2luZyBkZWZsYXRlIHN0cmVhbSBzdHJtIC0tIGlmIGxhc3QKLSAgIGlzIHRydWUsIHRoZW4gZmluaXNoIG9mZiB0aGUgZGVmbGF0ZSBzdHJlYW0gYXQgdGhlIGVuZCAqLwotbG9jYWwgdm9pZCBnenRhY2soY2hhciAqbmFtZSwgaW50IGdkLCB6X3N0cmVhbSAqc3RybSwgaW50IGxhc3QpCi17Ci0gICAgaW50IGZkLCBsZW4sIHJldDsKLSAgICB1bnNpZ25lZCBsZWZ0OwotICAgIHVuc2lnbmVkIGNoYXIgKmluLCAqb3V0OwotCi0gICAgLyogb3BlbiBmaWxlIHRvIGNvbXByZXNzIGFuZCBhcHBlbmQgKi8KLSAgICBmZCA9IDA7Ci0gICAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgICAgICBmZCA9IG9wZW4obmFtZSwgT19SRE9OTFksIDApOwotICAgICAgICBpZiAoZmQgPT0gLTEpCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6YXBwZW5kIHdhcm5pbmc6ICVzIG5vdCBmb3VuZCwgc2tpcHBpbmcgLi4uXG4iLAotICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBidWZmZXJzICovCi0gICAgaW4gPSBmZCA9PSAtMSA/IE5VTEwgOiBtYWxsb2MoQ0hVTkspOwotICAgIG91dCA9IG1hbGxvYyhDSFVOSyk7Ci0gICAgaWYgKG91dCA9PSBOVUxMKSBieWUoIm91dCBvZiBtZW1vcnkiLCAiIik7Ci0KLSAgICAvKiBjb21wcmVzcyBpbnB1dCBmaWxlIGFuZCBhcHBlbmQgdG8gZ3ppcCBmaWxlICovCi0gICAgZG8gewotICAgICAgICAvKiBnZXQgbW9yZSBpbnB1dCAqLwotICAgICAgICBsZW4gPSBmZCA9PSAtMSA/IDAgOiByZWFkKGZkLCBpbiwgQ0hVTkspOwotICAgICAgICBpZiAobGVuID09IC0xKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAgImd6YXBwZW5kIHdhcm5pbmc6IGVycm9yIHJlYWRpbmcgJXMsIHNraXBwaW5nIHJlc3QgLi4uXG4iLAotICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgc3RybS0+YXZhaWxfaW4gPSAodW5zaWduZWQpbGVuOwotICAgICAgICBzdHJtLT5uZXh0X2luID0gaW47Ci0gICAgICAgIGlmIChsZW4pIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIGluLCAodW5zaWduZWQpbGVuKTsKLQotICAgICAgICAvKiBjb21wcmVzcyBhbmQgd3JpdGUgYWxsIGF2YWlsYWJsZSBvdXRwdXQgKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gQ0hVTks7Ci0gICAgICAgICAgICBzdHJtLT5uZXh0X291dCA9IG91dDsKLSAgICAgICAgICAgIHJldCA9IGRlZmxhdGUoc3RybSwgbGFzdCAmJiBsZW4gPT0gMCA/IFpfRklOSVNIIDogWl9OT19GTFVTSCk7Ci0gICAgICAgICAgICBsZWZ0ID0gQ0hVTksgLSBzdHJtLT5hdmFpbF9vdXQ7Ci0gICAgICAgICAgICB3aGlsZSAobGVmdCkgewotICAgICAgICAgICAgICAgIGxlbiA9IHdyaXRlKGdkLCBvdXQgKyBDSFVOSyAtIHN0cm0tPmF2YWlsX291dCAtIGxlZnQsIGxlZnQpOwotICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gLTEpIGJ5ZSgid3JpdGluZyBnemlwIGZpbGUiLCAiIik7Ci0gICAgICAgICAgICAgICAgbGVmdCAtPSAodW5zaWduZWQpbGVuOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChzdHJtLT5hdmFpbF9vdXQgPT0gMCAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKTsKLSAgICB9IHdoaWxlIChsZW4gIT0gMCk7Ci0KLSAgICAvKiB3cml0ZSB0cmFpbGVyIGFmdGVyIGxhc3QgZW50cnkgKi8KLSAgICBpZiAobGFzdCkgewotICAgICAgICBkZWZsYXRlRW5kKHN0cm0pOwotICAgICAgICBvdXRbMF0gPSAodW5zaWduZWQgY2hhcikoc3RybS0+YWRsZXIpOwotICAgICAgICBvdXRbMV0gPSAodW5zaWduZWQgY2hhcikoc3RybS0+YWRsZXIgPj4gOCk7Ci0gICAgICAgIG91dFsyXSA9ICh1bnNpZ25lZCBjaGFyKShzdHJtLT5hZGxlciA+PiAxNik7Ci0gICAgICAgIG91dFszXSA9ICh1bnNpZ25lZCBjaGFyKShzdHJtLT5hZGxlciA+PiAyNCk7Ci0gICAgICAgIG91dFs0XSA9ICh1bnNpZ25lZCBjaGFyKShzdHJtLT50b3RhbF9pbik7Ci0gICAgICAgIG91dFs1XSA9ICh1bnNpZ25lZCBjaGFyKShzdHJtLT50b3RhbF9pbiA+PiA4KTsKLSAgICAgICAgb3V0WzZdID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPnRvdGFsX2luID4+IDE2KTsKLSAgICAgICAgb3V0WzddID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPnRvdGFsX2luID4+IDI0KTsKLSAgICAgICAgbGVuID0gODsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmV0ID0gd3JpdGUoZ2QsIG91dCArIDggLSBsZW4sIGxlbik7Ci0gICAgICAgICAgICBpZiAocmV0ID09IC0xKSBieWUoIndyaXRpbmcgZ3ppcCBmaWxlIiwgIiIpOwotICAgICAgICAgICAgbGVuIC09IHJldDsKLSAgICAgICAgfSB3aGlsZSAobGVuKTsKLSAgICAgICAgY2xvc2UoZ2QpOwotICAgIH0KLQotICAgIC8qIGNsZWFuIHVwIGFuZCByZXR1cm4gKi8KLSAgICBmcmVlKG91dCk7Ci0gICAgaWYgKGluICE9IE5VTEwpIGZyZWUoaW4pOwotICAgIGlmIChmZCA+IDApIGNsb3NlKGZkKTsKLX0KLQotLyogcHJvY2VzcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3B0aW9uIGlmIHByZXNlbnQsIHNjYW4gdGhlIGd6aXAgZmlsZSwgYW5kCi0gICBhcHBlbmQgdGhlIHNwZWNpZmllZCBmaWxlcywgb3IgYXBwZW5kIHRoZSBkYXRhIGZyb20gc3RkaW4gaWYgbm8gb3RoZXIgZmlsZQotICAgbmFtZXMgYXJlIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgLS0gdGhlIGd6aXAgZmlsZSBtdXN0IGJlIHdyaXRhYmxlCi0gICBhbmQgc2Vla2FibGUgKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgZ2QsIGxldmVsOwotICAgIHpfc3RyZWFtIHN0cm07Ci0KLSAgICAvKiBpZ25vcmUgY29tbWFuZCBuYW1lICovCi0gICAgYXJndisrOwotCi0gICAgLyogcHJvdmlkZSB1c2FnZSBpZiBubyBhcmd1bWVudHMgKi8KLSAgICBpZiAoKmFyZ3YgPT0gTlVMTCkgewotICAgICAgICBwcmludGYoImd6YXBwZW5kIDEuMSAoNCBOb3YgMjAwMykgQ29weXJpZ2h0IChDKSAyMDAzIE1hcmsgQWRsZXJcbiIpOwotICAgICAgICBwcmludGYoCi0gICAgICAgICAgICAidXNhZ2U6IGd6YXBwZW5kIFstbGV2ZWxdIGZpbGUuZ3ogWyBhZGR0aGlzIFsgYW5kdGhpcyAuLi4gXV1cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBzZXQgY29tcHJlc3Npb24gbGV2ZWwgKi8KLSAgICBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsKLSAgICBpZiAoYXJndlswXVswXSA9PSAnLScpIHsKLSAgICAgICAgaWYgKGFyZ3ZbMF1bMV0gPCAnMCcgfHwgYXJndlswXVsxXSA+ICc5JyB8fCBhcmd2WzBdWzJdICE9IDApCi0gICAgICAgICAgICBieWUoImludmFsaWQgY29tcHJlc3Npb24gbGV2ZWwiLCAiIik7Ci0gICAgICAgIGxldmVsID0gYXJndlswXVsxXSAtICcwJzsKLSAgICAgICAgaWYgKCorK2FyZ3YgPT0gTlVMTCkgYnllKCJubyBnemlwIGZpbGUgbmFtZSBhZnRlciBvcHRpb25zIiwgIiIpOwotICAgIH0KLQotICAgIC8qIHByZXBhcmUgdG8gYXBwZW5kIHRvIGd6aXAgZmlsZSAqLwotICAgIGdkID0gZ3pzY2FuKCphcmd2KyssICZzdHJtLCBsZXZlbCk7Ci0KLSAgICAvKiBhcHBlbmQgZmlsZXMgb24gY29tbWFuZCBsaW5lLCBvciBmcm9tIHN0ZGluIGlmIG5vbmUgKi8KLSAgICBpZiAoKmFyZ3YgPT0gTlVMTCkKLSAgICAgICAgZ3p0YWNrKE5VTEwsIGdkLCAmc3RybSwgMSk7Ci0gICAgZWxzZQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBnenRhY2soKmFyZ3YsIGdkLCAmc3RybSwgYXJndlsxXSA9PSBOVUxMKTsKLSAgICAgICAgfSB3aGlsZSAoKisrYXJndiAhPSBOVUxMKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9leGFtcGxlcy9nempvaW4uYyBiL2xpYnMvemxpYi9leGFtcGxlcy9nempvaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5MzQ3Yy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvZXhhbXBsZXMvZ3pqb2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyogZ3pqb2luIC0tIGNvbW1hbmQgdG8gam9pbiBnemlwIGZpbGVzIGludG8gb25lIGd6aXAgZmlsZQotCi0gIENvcHlyaWdodCAoQykgMjAwNCBNYXJrIEFkbGVyLCBhbGwgcmlnaHRzIHJlc2VydmVkCi0gIHZlcnNpb24gMS4wLCAxMSBEZWMgMjAwNAotCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIE1hcmsgQWRsZXIgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQotICovCi0KLS8qCi0gKiBDaGFuZ2UgaGlzdG9yeToKLSAqCi0gKiAxLjAgIDExIERlYyAyMDA0ICAgICAtIEZpcnN0IHZlcnNpb24KLSAqIDEuMSAgMTIgSnVuIDIwMDUgICAgIC0gQ2hhbmdlZCBzc2l6ZV90IHRvIGxvbmcgZm9yIHBvcnRhYmlsaXR5Ci0gKi8KLQotLyoKLSAgIGd6am9pbiB0YWtlcyBvbmUgb3IgbW9yZSBnemlwIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmUgYW5kIHdyaXRlcyBvdXQgYQotICAgc2luZ2xlIGd6aXAgZmlsZSB0aGF0IHdpbGwgdW5jb21wcmVzcyB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUKLSAgIHVuY29tcHJlc3NlZCBkYXRhIGZyb20gdGhlIGluZGl2aWR1YWwgZ3ppcCBmaWxlcy4gIGd6am9pbiBkb2VzIHRoaXMgd2l0aG91dAotICAgaGF2aW5nIHRvIHJlY29tcHJlc3MgYW55IG9mIHRoZSBkYXRhIGFuZCB3aXRob3V0IGhhdmluZyB0byBjYWxjdWxhdGUgYSBuZXcKLSAgIGNyYzMyIGZvciB0aGUgY29uY2F0ZW5hdGVkIHVuY29tcHJlc3NlZCBkYXRhLiAgZ3pqb2luIGRvZXMgaG93ZXZlciBoYXZlIHRvCi0gICBkZWNvbXByZXNzIGFsbCBvZiB0aGUgaW5wdXQgZGF0YSBpbiBvcmRlciB0byBmaW5kIHRoZSBiaXRzIGluIHRoZSBjb21wcmVzc2VkCi0gICBkYXRhIHRoYXQgbmVlZCB0byBiZSBtb2RpZmllZCB0byBjb25jYXRlbmF0ZSB0aGUgc3RyZWFtcy4KLQotICAgZ3pqb2luIGRvZXMgbm90IGRvIGFuIGludGVncml0eSBjaGVjayBvbiB0aGUgaW5wdXQgZ3ppcCBmaWxlcyBvdGhlciB0aGFuCi0gICBjaGVja2luZyB0aGUgZ3ppcCBoZWFkZXIgYW5kIGRlY29tcHJlc3NpbmcgdGhlIGNvbXByZXNzZWQgZGF0YS4gIFRoZXkgYXJlCi0gICBvdGhlcndpc2UgYXNzdW1lZCB0byBiZSBjb21wbGV0ZSBhbmQgY29ycmVjdC4KLQotICAgRWFjaCBqb2ludCBiZXR3ZWVuIGd6aXAgZmlsZXMgcmVtb3ZlcyBhdCBsZWFzdCAxOCBieXRlcyBvZiBwcmV2aW91cyB0cmFpbGVyCi0gICBhbmQgc3Vic2VxdWVudCBoZWFkZXIsIGFuZCBpbnNlcnRzIGFuIGF2ZXJhZ2Ugb2YgYWJvdXQgdGhyZWUgYnl0ZXMgdG8gdGhlCi0gICBjb21wcmVzc2VkIGRhdGEgaW4gb3JkZXIgdG8gY29ubmVjdCB0aGUgc3RyZWFtcy4gIFRoZSBvdXRwdXQgZ3ppcCBmaWxlCi0gICBoYXMgYSBtaW5pbWFsIHRlbi1ieXRlIGd6aXAgaGVhZGVyIHdpdGggbm8gZmlsZSBuYW1lIG9yIG1vZGlmaWNhdGlvbiB0aW1lLgotCi0gICBUaGlzIHByb2dyYW0gd2FzIHdyaXR0ZW4gdG8gaWxsdXN0cmF0ZSB0aGUgdXNlIG9mIHRoZSBaX0JMT0NLIG9wdGlvbiBvZgotICAgaW5mbGF0ZSgpIGFuZCB0aGUgY3JjMzJfY29tYmluZSgpIGZ1bmN0aW9uLiAgZ3pqb2luIHdpbGwgbm90IGNvbXBpbGUgd2l0aAotICAgdmVyc2lvbnMgb2YgemxpYiBlYXJsaWVyIHRoYW4gMS4yLjMuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgLyogZnB1dHMoKSwgZnByaW50ZigpLCBmd3JpdGUoKSwgcHV0YygpICovCi0jaW5jbHVkZSA8c3RkbGliLmg+ICAgICAvKiBleGl0KCksIG1hbGxvYygpLCBmcmVlKCkgKi8KLSNpbmNsdWRlIDxmY250bC5oPiAgICAgIC8qIG9wZW4oKSAqLwotI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgLyogY2xvc2UoKSwgcmVhZCgpLCBsc2VlaygpICovCi0jaW5jbHVkZSAiemxpYi5oIgotICAgIC8qIGNyYzMyKCksIGNyYzMyX2NvbWJpbmUoKSwgaW5mbGF0ZUluaXQyKCksIGluZmxhdGUoKSwgaW5mbGF0ZUVuZCgpICovCi0KLSNkZWZpbmUgbG9jYWwgc3RhdGljCi0KLS8qIGV4aXQgd2l0aCBhbiBlcnJvciAocmV0dXJuIGEgdmFsdWUgdG8gYWxsb3cgdXNlIGluIGFuIGV4cHJlc3Npb24pICovCi1sb2NhbCBpbnQgYmFpbChjaGFyICp3aHkxLCBjaGFyICp3aHkyKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiZ3pqb2luIGVycm9yOiAlcyVzLCBvdXRwdXQgaW5jb21wbGV0ZVxuIiwgd2h5MSwgd2h5Mik7Ci0gICAgZXhpdCgxKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogLS0gc2ltcGxlIGJ1ZmZlcmVkIGZpbGUgaW5wdXQgd2l0aCBhY2Nlc3MgdG8gdGhlIGJ1ZmZlciAtLSAqLwotCi0jZGVmaW5lIENIVU5LIDMyNzY4ICAgICAgICAgLyogbXVzdCBiZSBhIHBvd2VyIG9mIHR3byBhbmQgZml0IGluIHVuc2lnbmVkICovCi0KLS8qIGJpbiBidWZmZXJlZCBpbnB1dCBmaWxlIHR5cGUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICpuYW1lOyAgICAgICAgICAgICAvKiBuYW1lIG9mIGZpbGUgZm9yIGVycm9yIG1lc3NhZ2VzICovCi0gICAgaW50IGZkOyAgICAgICAgICAgICAgICAgLyogZmlsZSBkZXNjcmlwdG9yICovCi0gICAgdW5zaWduZWQgbGVmdDsgICAgICAgICAgLyogYnl0ZXMgcmVtYWluaW5nIGF0IG5leHQgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpuZXh0OyAgICAvKiBuZXh0IGJ5dGUgdG8gcmVhZCAqLwotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsgICAgIC8qIGFsbG9jYXRlZCBidWZmZXIgb2YgbGVuZ3RoIENIVU5LICovCi19IGJpbjsKLQotLyogY2xvc2UgYSBidWZmZXJlZCBmaWxlIGFuZCBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KLWxvY2FsIHZvaWQgYmNsb3NlKGJpbiAqaW4pCi17Ci0gICAgaWYgKGluICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGluLT5mZCAhPSAtMSkKLSAgICAgICAgICAgIGNsb3NlKGluLT5mZCk7Ci0gICAgICAgIGlmIChpbi0+YnVmICE9IE5VTEwpCi0gICAgICAgICAgICBmcmVlKGluLT5idWYpOwotICAgICAgICBmcmVlKGluKTsKLSAgICB9Ci19Ci0KLS8qIG9wZW4gYSBidWZmZXJlZCBmaWxlIGZvciBpbnB1dCwgcmV0dXJuIGEgcG9pbnRlciB0byB0eXBlIGJpbiwgb3IgTlVMTCBvbgotICAgZmFpbHVyZSAqLwotbG9jYWwgYmluICpib3BlbihjaGFyICpuYW1lKQotewotICAgIGJpbiAqaW47Ci0KLSAgICBpbiA9IG1hbGxvYyhzaXplb2YoYmluKSk7Ci0gICAgaWYgKGluID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGluLT5idWYgPSBtYWxsb2MoQ0hVTkspOwotICAgIGluLT5mZCA9IG9wZW4obmFtZSwgT19SRE9OTFksIDApOwotICAgIGlmIChpbi0+YnVmID09IE5VTEwgfHwgaW4tPmZkID09IC0xKSB7Ci0gICAgICAgIGJjbG9zZShpbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpbi0+bGVmdCA9IDA7Ci0gICAgaW4tPm5leHQgPSBpbi0+YnVmOwotICAgIGluLT5uYW1lID0gbmFtZTsKLSAgICByZXR1cm4gaW47Ci19Ci0KLS8qIGxvYWQgYnVmZmVyIGZyb20gZmlsZSwgcmV0dXJuIC0xIG9uIHJlYWQgZXJyb3IsIDAgb3IgMSBvbiBzdWNjZXNzLCB3aXRoCi0gICAxIGluZGljYXRpbmcgdGhhdCBlbmQtb2YtZmlsZSB3YXMgcmVhY2hlZCAqLwotbG9jYWwgaW50IGJsb2FkKGJpbiAqaW4pCi17Ci0gICAgbG9uZyBsZW47Ci0KLSAgICBpZiAoaW4gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChpbi0+bGVmdCAhPSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpbi0+bmV4dCA9IGluLT5idWY7Ci0gICAgZG8gewotICAgICAgICBsZW4gPSAobG9uZylyZWFkKGluLT5mZCwgaW4tPmJ1ZiArIGluLT5sZWZ0LCBDSFVOSyAtIGluLT5sZWZ0KTsKLSAgICAgICAgaWYgKGxlbiA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGluLT5sZWZ0ICs9ICh1bnNpZ25lZClsZW47Ci0gICAgfSB3aGlsZSAobGVuICE9IDAgJiYgaW4tPmxlZnQgPCBDSFVOSyk7Ci0gICAgcmV0dXJuIGxlbiA9PSAwID8gMSA6IDA7Ci19Ci0KLS8qIGdldCBhIGJ5dGUgZnJvbSB0aGUgZmlsZSwgYmFpbCBpZiBlbmQgb2YgZmlsZSAqLwotI2RlZmluZSBiZ2V0KGluKSAoaW4tPmxlZnQgPyAwIDogYmxvYWQoaW4pLCBcCi0gICAgICAgICAgICAgICAgICBpbi0+bGVmdCA/IChpbi0+bGVmdC0tLCAqKGluLT5uZXh0KSsrKSA6IFwKLSAgICAgICAgICAgICAgICAgICAgYmFpbCgidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBvbiAiLCBpbi0+bmFtZSkpCi0KLS8qIGdldCBhIGZvdXItYnl0ZSBsaXR0bGUtZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBmaWxlICovCi1sb2NhbCB1bnNpZ25lZCBsb25nIGJnZXQ0KGJpbiAqaW4pCi17Ci0gICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgICB2YWwgPSBiZ2V0KGluKTsKLSAgICB2YWwgKz0gKHVuc2lnbmVkIGxvbmcpKGJnZXQoaW4pKSA8PCA4OwotICAgIHZhbCArPSAodW5zaWduZWQgbG9uZykoYmdldChpbikpIDw8IDE2OwotICAgIHZhbCArPSAodW5zaWduZWQgbG9uZykoYmdldChpbikpIDw8IDI0OwotICAgIHJldHVybiB2YWw7Ci19Ci0KLS8qIHNraXAgYnl0ZXMgaW4gZmlsZSAqLwotbG9jYWwgdm9pZCBic2tpcChiaW4gKmluLCB1bnNpZ25lZCBza2lwKQotewotICAgIC8qIGNoZWNrIHBvaW50ZXIgKi8KLSAgICBpZiAoaW4gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogZWFzeSBjYXNlIC0tIHNraXAgYnl0ZXMgaW4gYnVmZmVyICovCi0gICAgaWYgKHNraXAgPD0gaW4tPmxlZnQpIHsKLSAgICAgICAgaW4tPmxlZnQgLT0gc2tpcDsKLSAgICAgICAgaW4tPm5leHQgKz0gc2tpcDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIHNraXAgd2hhdCdzIGluIGJ1ZmZlciwgZGlzY2FyZCBidWZmZXIgY29udGVudHMgKi8KLSAgICBza2lwIC09IGluLT5sZWZ0OwotICAgIGluLT5sZWZ0ID0gMDsKLQotICAgIC8qIHNlZWsgcGFzdCBtdWx0aXBsZXMgb2YgQ0hVTksgYnl0ZXMgKi8KLSAgICBpZiAoc2tpcCA+IENIVU5LKSB7Ci0gICAgICAgIHVuc2lnbmVkIGxlZnQ7Ci0KLSAgICAgICAgbGVmdCA9IHNraXAgJiAoQ0hVTksgLSAxKTsKLSAgICAgICAgaWYgKGxlZnQgPT0gMCkgewotICAgICAgICAgICAgLyogZXhhY3QgbnVtYmVyIG9mIGNodW5rczogc2VlayBhbGwgdGhlIHdheSBtaW51cyBvbmUgYnl0ZSB0byBjaGVjawotICAgICAgICAgICAgICAgZm9yIGVuZC1vZi1maWxlIHdpdGggYSByZWFkICovCi0gICAgICAgICAgICBsc2Vlayhpbi0+ZmQsIHNraXAgLSAxLCBTRUVLX0NVUik7Ci0gICAgICAgICAgICBpZiAocmVhZChpbi0+ZmQsIGluLT5idWYsIDEpICE9IDEpCi0gICAgICAgICAgICAgICAgYmFpbCgidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBvbiAiLCBpbi0+bmFtZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBza2lwIHRoZSBpbnRlZ3JhbCBjaHVua3MsIHVwZGF0ZSBza2lwIHdpdGggcmVtYWluZGVyICovCi0gICAgICAgIGxzZWVrKGluLT5mZCwgc2tpcCAtIGxlZnQsIFNFRUtfQ1VSKTsKLSAgICAgICAgc2tpcCA9IGxlZnQ7Ci0gICAgfQotCi0gICAgLyogcmVhZCBtb3JlIGlucHV0IGFuZCBza2lwIHJlbWFpbmRlciAqLwotICAgIGJsb2FkKGluKTsKLSAgICBpZiAoc2tpcCA+IGluLT5sZWZ0KQotICAgICAgICBiYWlsKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIG9uICIsIGluLT5uYW1lKTsKLSAgICBpbi0+bGVmdCAtPSBza2lwOwotICAgIGluLT5uZXh0ICs9IHNraXA7Ci19Ci0KLS8qIC0tIGVuZCBvZiBidWZmZXJlZCBpbnB1dCBmdW5jdGlvbnMgLS0gKi8KLQotLyogc2tpcCB0aGUgZ3ppcCBoZWFkZXIgZnJvbSBmaWxlIGluICovCi1sb2NhbCB2b2lkIGd6aGVhZChiaW4gKmluKQotewotICAgIGludCBmbGFnczsKLQotICAgIC8qIHZlcmlmeSBnemlwIG1hZ2ljIGhlYWRlciBhbmQgY29tcHJlc3Npb24gbWV0aG9kICovCi0gICAgaWYgKGJnZXQoaW4pICE9IDB4MWYgfHwgYmdldChpbikgIT0gMHg4YiB8fCBiZ2V0KGluKSAhPSA4KQotICAgICAgICBiYWlsKGluLT5uYW1lLCAiIGlzIG5vdCBhIHZhbGlkIGd6aXAgZmlsZSIpOwotCi0gICAgLyogZ2V0IGFuZCB2ZXJpZnkgZmxhZ3MgKi8KLSAgICBmbGFncyA9IGJnZXQoaW4pOwotICAgIGlmICgoZmxhZ3MgJiAweGUwKSAhPSAwKQotICAgICAgICBiYWlsKCJ1bmtub3duIHJlc2VydmVkIGJpdHMgc2V0IGluICIsIGluLT5uYW1lKTsKLQotICAgIC8qIHNraXAgbW9kaWZpY2F0aW9uIHRpbWUsIGV4dHJhIGZsYWdzLCBhbmQgb3MgKi8KLSAgICBic2tpcChpbiwgNik7Ci0KLSAgICAvKiBza2lwIGV4dHJhIGZpZWxkIGlmIHByZXNlbnQgKi8KLSAgICBpZiAoZmxhZ3MgJiA0KSB7Ci0gICAgICAgIHVuc2lnbmVkIGxlbjsKLQotICAgICAgICBsZW4gPSBiZ2V0KGluKTsKLSAgICAgICAgbGVuICs9ICh1bnNpZ25lZCkoYmdldChpbikpIDw8IDg7Ci0gICAgICAgIGJza2lwKGluLCBsZW4pOwotICAgIH0KLQotICAgIC8qIHNraXAgZmlsZSBuYW1lIGlmIHByZXNlbnQgKi8KLSAgICBpZiAoZmxhZ3MgJiA4KQotICAgICAgICB3aGlsZSAoYmdldChpbikgIT0gMCkKLSAgICAgICAgICAgIDsKLQotICAgIC8qIHNraXAgY29tbWVudCBpZiBwcmVzZW50ICovCi0gICAgaWYgKGZsYWdzICYgMTYpCi0gICAgICAgIHdoaWxlIChiZ2V0KGluKSAhPSAwKQotICAgICAgICAgICAgOwotCi0gICAgLyogc2tpcCBoZWFkZXIgY3JjIGlmIHByZXNlbnQgKi8KLSAgICBpZiAoZmxhZ3MgJiAyKQotICAgICAgICBic2tpcChpbiwgMik7Ci19Ci0KLS8qIHdyaXRlIGEgZm91ci1ieXRlIGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciB0byBvdXQgKi8KLWxvY2FsIHZvaWQgcHV0NCh1bnNpZ25lZCBsb25nIHZhbCwgRklMRSAqb3V0KQotewotICAgIHB1dGModmFsICYgMHhmZiwgb3V0KTsKLSAgICBwdXRjKCh2YWwgPj4gOCkgJiAweGZmLCBvdXQpOwotICAgIHB1dGMoKHZhbCA+PiAxNikgJiAweGZmLCBvdXQpOwotICAgIHB1dGMoKHZhbCA+PiAyNCkgJiAweGZmLCBvdXQpOwotfQotCi0vKiBMb2FkIHVwIHpsaWIgc3RyZWFtIGZyb20gYnVmZmVyZWQgaW5wdXQsIGJhaWwgaWYgZW5kIG9mIGZpbGUgKi8KLWxvY2FsIHZvaWQgenB1bGwoel9zdHJlYW1wIHN0cm0sIGJpbiAqaW4pCi17Ci0gICAgaWYgKGluLT5sZWZ0ID09IDApCi0gICAgICAgIGJsb2FkKGluKTsKLSAgICBpZiAoaW4tPmxlZnQgPT0gMCkKLSAgICAgICAgYmFpbCgidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBvbiAiLCBpbi0+bmFtZSk7Ci0gICAgc3RybS0+YXZhaWxfaW4gPSBpbi0+bGVmdDsKLSAgICBzdHJtLT5uZXh0X2luID0gaW4tPm5leHQ7Ci19Ci0KLS8qIFdyaXRlIGhlYWRlciBmb3IgZ3ppcCBmaWxlIHRvIG91dCBhbmQgaW5pdGlhbGl6ZSB0cmFpbGVyLiAqLwotbG9jYWwgdm9pZCBnemluaXQodW5zaWduZWQgbG9uZyAqY3JjLCB1bnNpZ25lZCBsb25nICp0b3QsIEZJTEUgKm91dCkKLXsKLSAgICBmd3JpdGUoIlx4MWZceDhiXHgwOFwwXDBcMFwwXDBcMFx4ZmYiLCAxLCAxMCwgb3V0KTsKLSAgICAqY3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7Ci0gICAgKnRvdCA9IDA7Ci19Ci0KLS8qIENvcHkgdGhlIGNvbXByZXNzZWQgZGF0YSBmcm9tIG5hbWUsIHplcm9pbmcgdGhlIGxhc3QgYmxvY2sgYml0IG9mIHRoZSBsYXN0Ci0gICBibG9jayBpZiBjbHIgaXMgdHJ1ZSwgYW5kIGFkZGluZyBlbXB0eSBibG9ja3MgYXMgbmVlZGVkIHRvIGdldCB0byBhIGJ5dGUKLSAgIGJvdW5kYXJ5LiAgSWYgY2xyIGlzIGZhbHNlLCB0aGVuIHRoZSBsYXN0IGJsb2NrIGJlY29tZXMgdGhlIGxhc3QgYmxvY2sgb2YKLSAgIHRoZSBvdXRwdXQsIGFuZCB0aGUgZ3ppcCB0cmFpbGVyIGlzIHdyaXR0ZW4uICBjcmMgYW5kIHRvdCBtYWludGFpbnMgdGhlCi0gICBjcmMgYW5kIGxlbmd0aCAobW9kdWxvIDJeMzIpIG9mIHRoZSBvdXRwdXQgZm9yIHRoZSB0cmFpbGVyLiAgVGhlIHJlc3VsdGluZwotICAgZ3ppcCBmaWxlIGlzIHdyaXR0ZW4gdG8gb3V0LiAgZ3ppbml0KCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsCi0gICBvZiBnemNvcHkoKSB0byB3cml0ZSB0aGUgZ3ppcCBoZWFkZXIgYW5kIHRvIGluaXRpYWxpemUgY3JjIGFuZCB0b3QuICovCi1sb2NhbCB2b2lkIGd6Y29weShjaGFyICpuYW1lLCBpbnQgY2xyLCB1bnNpZ25lZCBsb25nICpjcmMsIHVuc2lnbmVkIGxvbmcgKnRvdCwKLSAgICAgICAgICAgICAgICAgIEZJTEUgKm91dCkKLXsKLSAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAvKiByZXR1cm4gdmFsdWUgZnJvbSB6bGliIGZ1bmN0aW9ucyAqLwotICAgIGludCBwb3M7ICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRoZSAibGFzdCBibG9jayIgYml0IGlzIGluIGJ5dGUgKi8KLSAgICBpbnQgbGFzdDsgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHByb2Nlc3NpbmcgdGhlIGxhc3QgYmxvY2sgKi8KLSAgICBiaW4gKmluOyAgICAgICAgICAgICAgICAvKiBidWZmZXJlZCBpbnB1dCBmaWxlICovCi0gICAgdW5zaWduZWQgY2hhciAqc3RhcnQ7ICAgLyogc3RhcnQgb2YgY29tcHJlc3NlZCBkYXRhIGluIGJ1ZmZlciAqLwotICAgIHVuc2lnbmVkIGNoYXIgKmp1bms7ICAgIC8qIGJ1ZmZlciBmb3IgdW5jb21wcmVzc2VkIGRhdGEgLS0gZGlzY2FyZGVkICovCi0gICAgel9vZmZfdCBsZW47ICAgICAgICAgICAgLyogbGVuZ3RoIG9mIHVuY29tcHJlc3NlZCBkYXRhIChzdXBwb3J0ID4gNCBHQikgKi8KLSAgICB6X3N0cmVhbSBzdHJtOyAgICAgICAgICAvKiB6bGliIGluZmxhdGUgc3RyZWFtICovCi0KLSAgICAvKiBvcGVuIGd6aXAgZmlsZSBhbmQgc2tpcCBoZWFkZXIgKi8KLSAgICBpbiA9IGJvcGVuKG5hbWUpOwotICAgIGlmIChpbiA9PSBOVUxMKQotICAgICAgICBiYWlsKCJjb3VsZCBub3Qgb3BlbiAiLCBuYW1lKTsKLSAgICBnemhlYWQoaW4pOwotCi0gICAgLyogYWxsb2NhdGUgYnVmZmVyIGZvciB1bmNvbXByZXNzZWQgZGF0YSBhbmQgaW5pdGlhbGl6ZSByYXcgaW5mbGF0ZQotICAgICAgIHN0cmVhbSAqLwotICAgIGp1bmsgPSBtYWxsb2MoQ0hVTkspOwotICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOwotICAgIHN0cm0uemZyZWUgPSBaX05VTEw7Ci0gICAgc3RybS5vcGFxdWUgPSBaX05VTEw7Ci0gICAgc3RybS5hdmFpbF9pbiA9IDA7Ci0gICAgc3RybS5uZXh0X2luID0gWl9OVUxMOwotICAgIHJldCA9IGluZmxhdGVJbml0Migmc3RybSwgLTE1KTsKLSAgICBpZiAoanVuayA9PSBOVUxMIHx8IHJldCAhPSBaX09LKQotICAgICAgICBiYWlsKCJvdXQgb2YgbWVtb3J5IiwgIiIpOwotCi0gICAgLyogaW5mbGF0ZSBhbmQgY29weSBjb21wcmVzc2VkIGRhdGEsIGNsZWFyIGxhc3QtYmxvY2sgYml0IGlmIHJlcXVlc3RlZCAqLwotICAgIGxlbiA9IDA7Ci0gICAgenB1bGwoJnN0cm0sIGluKTsKLSAgICBzdGFydCA9IHN0cm0ubmV4dF9pbjsKLSAgICBsYXN0ID0gc3RhcnRbMF0gJiAxOwotICAgIGlmIChsYXN0ICYmIGNscikKLSAgICAgICAgc3RhcnRbMF0gJj0gfjE7Ci0gICAgc3RybS5hdmFpbF9vdXQgPSAwOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgLyogaWYgaW5wdXQgdXNlZCBhbmQgb3V0cHV0IGRvbmUsIHdyaXRlIHVzZWQgaW5wdXQgYW5kIGdldCBtb3JlICovCi0gICAgICAgIGlmIChzdHJtLmF2YWlsX2luID09IDAgJiYgc3RybS5hdmFpbF9vdXQgIT0gMCkgewotICAgICAgICAgICAgZndyaXRlKHN0YXJ0LCAxLCBzdHJtLm5leHRfaW4gLSBzdGFydCwgb3V0KTsKLSAgICAgICAgICAgIHN0YXJ0ID0gaW4tPmJ1ZjsKLSAgICAgICAgICAgIGluLT5sZWZ0ID0gMDsKLSAgICAgICAgICAgIHpwdWxsKCZzdHJtLCBpbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBkZWNvbXByZXNzIC0tIHJldHVybiBlYXJseSB3aGVuIGVuZC1vZi1ibG9jayByZWFjaGVkICovCi0gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gQ0hVTks7Ci0gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBqdW5rOwotICAgICAgICByZXQgPSBpbmZsYXRlKCZzdHJtLCBaX0JMT0NLKTsKLSAgICAgICAgc3dpdGNoIChyZXQpIHsKLSAgICAgICAgY2FzZSBaX01FTV9FUlJPUjoKLSAgICAgICAgICAgIGJhaWwoIm91dCBvZiBtZW1vcnkiLCAiIik7Ci0gICAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgotICAgICAgICAgICAgYmFpbCgiaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgaW4gIiwgaW4tPm5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdXBkYXRlIGxlbmd0aCBvZiB1bmNvbXByZXNzZWQgZGF0YSAqLwotICAgICAgICBsZW4gKz0gQ0hVTksgLSBzdHJtLmF2YWlsX291dDsKLQotICAgICAgICAvKiBjaGVjayBmb3IgYmxvY2sgYm91bmRhcnkgKG9ubHkgZ2V0IHRoaXMgd2hlbiBibG9jayBjb3BpZWQgb3V0KSAqLwotICAgICAgICBpZiAoc3RybS5kYXRhX3R5cGUgJiAxMjgpIHsKLSAgICAgICAgICAgIC8qIGlmIHRoYXQgd2FzIHRoZSBsYXN0IGJsb2NrLCB0aGVuIGRvbmUgKi8KLSAgICAgICAgICAgIGlmIChsYXN0KQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gbGFzdCBieXRlICovCi0gICAgICAgICAgICBwb3MgPSBzdHJtLmRhdGFfdHlwZSAmIDc7Ci0KLSAgICAgICAgICAgIC8qIGZpbmQgdGhlIG5leHQgbGFzdC1ibG9jayBiaXQgKi8KLSAgICAgICAgICAgIGlmIChwb3MgIT0gMCkgewotICAgICAgICAgICAgICAgIC8qIG5leHQgbGFzdC1ibG9jayBiaXQgaXMgaW4gbGFzdCB1c2VkIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICBwb3MgPSAweDEwMCA+PiBwb3M7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IHN0cm0ubmV4dF9pblstMV0gJiBwb3M7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgY2xyKQotICAgICAgICAgICAgICAgICAgICBzdHJtLm5leHRfaW5bLTFdICY9IH5wb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBuZXh0IGxhc3QtYmxvY2sgYml0IGlzIGluIG5leHQgdW51c2VkIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICBpZiAoc3RybS5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGhhdmUgdGhhdCBieXRlIHlldCAtLSBnZXQgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZndyaXRlKHN0YXJ0LCAxLCBzdHJtLm5leHRfaW4gLSBzdGFydCwgb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpbi0+YnVmOwotICAgICAgICAgICAgICAgICAgICBpbi0+bGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHpwdWxsKCZzdHJtLCBpbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxhc3QgPSBzdHJtLm5leHRfaW5bMF0gJiAxOwotICAgICAgICAgICAgICAgIGlmIChsYXN0ICYmIGNscikKLSAgICAgICAgICAgICAgICAgICAgc3RybS5uZXh0X2luWzBdICY9IH4xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogdXBkYXRlIGJ1ZmZlciB3aXRoIHVudXNlZCBpbnB1dCAqLwotICAgIGluLT5sZWZ0ID0gc3RybS5hdmFpbF9pbjsKLSAgICBpbi0+bmV4dCA9IHN0cm0ubmV4dF9pbjsKLQotICAgIC8qIGNvcHkgdXNlZCBpbnB1dCwgd3JpdGUgZW1wdHkgYmxvY2tzIHRvIGdldCB0byBieXRlIGJvdW5kYXJ5ICovCi0gICAgcG9zID0gc3RybS5kYXRhX3R5cGUgJiA3OwotICAgIGZ3cml0ZShzdGFydCwgMSwgaW4tPm5leHQgLSBzdGFydCAtIDEsIG91dCk7Ci0gICAgbGFzdCA9IGluLT5uZXh0Wy0xXTsKLSAgICBpZiAocG9zID09IDAgfHwgIWNscikKLSAgICAgICAgLyogYWxyZWFkeSBhdCBieXRlIGJvdW5kYXJ5LCBvciBsYXN0IGZpbGU6IHdyaXRlIGxhc3QgYnl0ZSAqLwotICAgICAgICBwdXRjKGxhc3QsIG91dCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGFwcGVuZCBlbXB0eSBibG9ja3MgdG8gbGFzdCBieXRlICovCi0gICAgICAgIGxhc3QgJj0gKCgweDEwMCA+PiBwb3MpIC0gMSk7ICAgICAgIC8qIGFzc3VyZSB1bnVzZWQgYml0cyBhcmUgemVybyAqLwotICAgICAgICBpZiAocG9zICYgMSkgewotICAgICAgICAgICAgLyogb2RkIC0tIGFwcGVuZCBhbiBlbXB0eSBzdG9yZWQgYmxvY2sgKi8KLSAgICAgICAgICAgIHB1dGMobGFzdCwgb3V0KTsKLSAgICAgICAgICAgIGlmIChwb3MgPT0gMSkKLSAgICAgICAgICAgICAgICBwdXRjKDAsIG91dCk7ICAgICAgICAgICAgICAgLyogdHdvIG1vcmUgYml0cyBpbiBibG9jayBoZWFkZXIgKi8KLSAgICAgICAgICAgIGZ3cml0ZSgiXDBcMFx4ZmZceGZmIiwgMSwgNCwgb3V0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIGV2ZW4gLS0gYXBwZW5kIDEsIDIsIG9yIDMgZW1wdHkgZml4ZWQgYmxvY2tzICovCi0gICAgICAgICAgICBzd2l0Y2ggKHBvcykgewotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgIHB1dGMobGFzdCB8IDgsIG91dCk7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IDA7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgcHV0YyhsYXN0IHwgMHgyMCwgb3V0KTsKLSAgICAgICAgICAgICAgICBsYXN0ID0gMDsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBwdXRjKGxhc3QgfCAweDgwLCBvdXQpOwotICAgICAgICAgICAgICAgIHB1dGMoMCwgb3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHVwZGF0ZSBjcmMgYW5kIHRvdCAqLwotICAgICpjcmMgPSBjcmMzMl9jb21iaW5lKCpjcmMsIGJnZXQ0KGluKSwgbGVuKTsKLSAgICAqdG90ICs9ICh1bnNpZ25lZCBsb25nKWxlbjsKLQotICAgIC8qIGNsZWFuIHVwICovCi0gICAgaW5mbGF0ZUVuZCgmc3RybSk7Ci0gICAgZnJlZShqdW5rKTsKLSAgICBiY2xvc2UoaW4pOwotCi0gICAgLyogd3JpdGUgdHJhaWxlciBpZiB0aGlzIGlzIHRoZSBsYXN0IGd6aXAgZmlsZSAqLwotICAgIGlmICghY2xyKSB7Ci0gICAgICAgIHB1dDQoKmNyYywgb3V0KTsKLSAgICAgICAgcHV0NCgqdG90LCBvdXQpOwotICAgIH0KLX0KLQotLyogam9pbiB0aGUgZ3ppcCBmaWxlcyBvbiB0aGUgY29tbWFuZCBsaW5lLCB3cml0ZSByZXN1bHQgdG8gc3Rkb3V0ICovCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBjcmMsIHRvdDsgICAgIC8qIHJ1bm5pbmcgY3JjIGFuZCB0b3RhbCB1bmNvbXByZXNzZWQgbGVuZ3RoICovCi0KLSAgICAvKiBza2lwIGNvbW1hbmQgbmFtZSAqLwotICAgIGFyZ2MtLTsKLSAgICBhcmd2Kys7Ci0KLSAgICAvKiBzaG93IHVzYWdlIGlmIG5vIGFyZ3VtZW50cyAqLwotICAgIGlmIChhcmdjID09IDApIHsKLSAgICAgICAgZnB1dHMoImd6am9pbiB1c2FnZTogZ3pqb2luIGYxLmd6IFtmMi5neiBbZjMuZ3ogLi4uXV0gPiBmam9pbi5nelxuIiwKLSAgICAgICAgICAgICAgc3RkZXJyKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogam9pbiBnemlwIGZpbGVzIG9uIGNvbW1hbmQgbGluZSBhbmQgd3JpdGUgdG8gc3Rkb3V0ICovCi0gICAgZ3ppbml0KCZjcmMsICZ0b3QsIHN0ZG91dCk7Ci0gICAgd2hpbGUgKGFyZ2MtLSkKLSAgICAgICAgZ3pjb3B5KCphcmd2KyssIGFyZ2MsICZjcmMsICZ0b3QsIHN0ZG91dCk7Ci0KLSAgICAvKiBkb25lICovCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJzL3psaWIvZXhhbXBsZXMvZ3psb2cuYyBiL2xpYnMvemxpYi9leGFtcGxlcy9nemxvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzFmODE3Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9leGFtcGxlcy9nemxvZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qCi0gKiBnemxvZy5jCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIGd6bG9nLmgKLSAqIHZlcnNpb24gMS4wLCAyNiBOb3YgMjAwNAotICoKLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAgICAgIC8qIG1lbWNtcCgpICovCi0jaW5jbHVkZSA8c3RkbGliLmg+ICAgICAgICAgICAgIC8qIG1hbGxvYygpLCBmcmVlKCksIE5VTEwgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgICAgICAgLyogc2l6ZV90LCBvZmZfdCAqLwotI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgICAgICAgICAvKiByZWFkKCksIGNsb3NlKCksIHNsZWVwKCksIGZ0cnVuY2F0ZSgpLCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsc2VlaygpICovCi0jaW5jbHVkZSA8ZmNudGwuaD4gICAgICAgICAgICAgIC8qIG9wZW4oKSAqLwotI2luY2x1ZGUgPHN5cy9maWxlLmg+ICAgICAgICAgICAvKiBmbG9jaygpICovCi0jaW5jbHVkZSAiemxpYi5oIiAgICAgICAgICAgICAgIC8qIGRlZmxhdGVJbml0MigpLCBkZWZsYXRlKCksIGRlZmxhdGVFbmQoKSAqLwotCi0jaW5jbHVkZSAiZ3psb2cuaCIgICAgICAgICAgICAgIC8qIGludGVyZmFjZSAqLwotI2RlZmluZSBsb2NhbCBzdGF0aWMKLQotLyogbG9nIG9iamVjdCBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgaWQ7ICAgICAgICAgICAgICAgICAvKiBvYmplY3QgaWRlbnRpZmllciAqLwotICAgIGludCBmZDsgICAgICAgICAgICAgICAgIC8qIGxvZyBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBvZmZfdCBleHRyYTsgICAgICAgICAgICAvKiBvZmZzZXQgb2YgZXh0cmEgImFwIiBzdWJmaWVsZCAqLwotICAgIG9mZl90IG1hcmtfb2ZmOyAgICAgICAgIC8qIG9mZnNldCBvZiBtYXJrZWQgZGF0YSAqLwotICAgIG9mZl90IGxhc3Rfb2ZmOyAgICAgICAgIC8qIG9mZnNldCBvZiBsYXN0IGJsb2NrICovCi0gICAgdW5zaWduZWQgbG9uZyBjcmM7ICAgICAgLyogdW5jb21wcmVzc2VkIGNyYyAqLwotICAgIHVuc2lnbmVkIGxvbmcgbGVuOyAgICAgIC8qIHVuY29tcHJlc3NlZCBsZW5ndGggKG1vZHVsbyAyXjMyKSAqLwotICAgIHVuc2lnbmVkIHN0b3JlZDsgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IHN0b3JlZCBibG9jayAqLwotfSBnel9sb2c7Ci0KLSNkZWZpbmUgR1pMT0dJRCAxOTMzNCAgICAgICAvKiBnel9sb2cgb2JqZWN0IGlkZW50aWZpZXIgKi8KLQotI2RlZmluZSBMT0NLX1JFVFJZIDEgICAgICAgICAgICAvKiByZXRyeSBsb2NrIG9uY2UgYSBzZWNvbmQgKi8KLSNkZWZpbmUgTE9DS19QQVRJRU5DRSAxMjAwICAgICAgLyogdHJ5IGFib3V0IHR3ZW50eSBtaW51dGVzIGJlZm9yZSBmb3JjaW5nICovCi0KLS8qIGFjcXVpcmUgYSBsb2NrIG9uIGEgZmlsZSAqLwotbG9jYWwgaW50IGxvY2soaW50IGZkKQotewotICAgIGludCBwYXRpZW5jZTsKLQotICAgIC8qIHRyeSB0byBsb2NrIGV2ZXJ5IExPQ0tfUkVUUlkgc2Vjb25kcyBmb3IgTE9DS19QQVRJRU5DRSBzZWNvbmRzICovCi0gICAgcGF0aWVuY2UgPSBMT0NLX1BBVElFTkNFOwotICAgIGRvIHsKLSAgICAgICAgaWYgKGZsb2NrKGZkLCBMT0NLX0VYICsgTE9DS19OQikgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAodm9pZClzbGVlcChMT0NLX1JFVFJZKTsKLSAgICAgICAgcGF0aWVuY2UgLT0gTE9DS19SRVRSWTsKLSAgICB9IHdoaWxlIChwYXRpZW5jZSA+IDApOwotCi0gICAgLyogd2UndmUgcnVuIG91dCBvZiBwYXRpZW5jZSAtLSBnaXZlIHVwICovCi0gICAgcmV0dXJuIC0xOwotfQotCi0vKiByZWxlYXNlIGxvY2sgKi8KLWxvY2FsIHZvaWQgdW5sb2NrKGludCBmZCkKLXsKLSAgICAodm9pZClmbG9jayhmZCwgTE9DS19VTik7Ci19Ci0KLS8qIHJlbGVhc2UgYSBsb2cgb2JqZWN0ICovCi1sb2NhbCB2b2lkIGxvZ19jbGVhbihnel9sb2cgKmxvZykKLXsKLSAgICB1bmxvY2sobG9nLT5mZCk7Ci0gICAgKHZvaWQpY2xvc2UobG9nLT5mZCk7Ci0gICAgZnJlZShsb2cpOwotfQotCi0vKiByZWFkIGFuIHVuc2lnbmVkIGxvbmcgZnJvbSBhIGJ5dGUgYnVmZmVyIGxpdHRsZS1lbmRpYW4gKi8KLWxvY2FsIHVuc2lnbmVkIGxvbmcgbWFrZV91bGcodW5zaWduZWQgY2hhciAqYnVmKQotewotICAgIGludCBuOwotICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gICAgdmFsID0gKHVuc2lnbmVkIGxvbmcpKCpidWYrKyk7Ci0gICAgZm9yIChuID0gODsgbiA8IDMyOyBuICs9IDgpCi0gICAgICAgIHZhbCArPSAodW5zaWduZWQgbG9uZykoKmJ1ZisrKSA8PCBuOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLS8qIHJlYWQgYW4gb2ZmX3QgZnJvbSBhIGJ5dGUgYnVmZmVyIGxpdHRsZS1lbmRpYW4gKi8KLWxvY2FsIG9mZl90IG1ha2Vfb2ZmKHVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKLSAgICBpbnQgbjsKLSAgICBvZmZfdCB2YWw7Ci0KLSAgICB2YWwgPSAob2ZmX3QpKCpidWYrKyk7Ci0gICAgZm9yIChuID0gODsgbiA8IDY0OyBuICs9IDgpCi0gICAgICAgIHZhbCArPSAob2ZmX3QpKCpidWYrKykgPDwgbjsKLSAgICByZXR1cm4gdmFsOwotfQotCi0vKiB3cml0ZSBhbiB1bnNpZ25lZCBsb25nIGxpdHRsZS1lbmRpYW4gdG8gYnl0ZSBidWZmZXIgKi8KLWxvY2FsIHZvaWQgZGljZV91bGcodW5zaWduZWQgbG9uZyB2YWwsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKLSAgICBpbnQgbjsKLQotICAgIGZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKLSAgICAgICAgKmJ1ZisrID0gdmFsICYgMHhmZjsKLSAgICAgICAgdmFsID4+PSA4OwotICAgIH0KLX0KLQotLyogd3JpdGUgYW4gb2ZmX3QgbGl0dGxlLWVuZGlhbiB0byBieXRlIGJ1ZmZlciAqLwotbG9jYWwgdm9pZCBkaWNlX29mZihvZmZfdCB2YWwsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKLSAgICBpbnQgbjsKLQotICAgIGZvciAobiA9IDA7IG4gPCA4OyBuKyspIHsKLSAgICAgICAgKmJ1ZisrID0gdmFsICYgMHhmZjsKLSAgICAgICAgdmFsID4+PSA4OwotICAgIH0KLX0KLQotLyogaW5pdGlhbCwgZW1wdHkgZ3ppcCBmaWxlIGZvciBhcHBlbmRpbmcgKi8KLWxvY2FsIGNoYXIgZW1wdHlfZ3pbXSA9IHsKLSAgICAweDFmLCAweDhiLCAgICAgICAgICAgICAgICAgLyogbWFnaWMgZ3ppcCBpZCAqLwotICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgaXMgZGVmbGF0ZSAqLwotICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVyZSBpcyBhbiBleHRyYSBmaWVsZCAqLwotICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAvKiBubyBtb2RpZmljYXRpb24gdGltZSBwcm92aWRlZCAqLwotICAgIDAsIDB4ZmYsICAgICAgICAgICAgICAgICAgICAvKiBubyBleHRyYSBmbGFncywgbm8gT1MgKi8KLSAgICAyMCwgMCwgJ2EnLCAncCcsIDE2LCAwLCAgICAgLyogZXh0cmEgZmllbGQgd2l0aCAiYXAiIHN1YmZpZWxkICovCi0gICAgMzIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgIC8qIG9mZnNldCBvZiB1bmNvbXByZXNzZWQgZGF0YSAqLwotICAgIDMyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAvKiBvZmZzZXQgb2YgbGFzdCBibG9jayAqLwotICAgIDEsIDAsIDAsIDB4ZmYsIDB4ZmYsICAgICAgICAvKiBlbXB0eSBzdG9yZWQgYmxvY2sgKGxhc3QpICovCi0gICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgIC8qIGNyYyAqLwotICAgIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAvKiB1bmNvbXByZXNzZWQgbGVuZ3RoICovCi19OwotCi0vKiBpbml0aWFsaXplIGEgbG9nIG9iamVjdCB3aXRoIGxvY2tpbmcgKi8KLXZvaWQgKmd6bG9nX29wZW4oY2hhciAqcGF0aCkKLXsKLSAgICB1bnNpZ25lZCB4bGVuOwotICAgIHVuc2lnbmVkIGNoYXIgdGVtcFsyMF07Ci0gICAgdW5zaWduZWQgc3ViX2xlbjsKLSAgICBpbnQgZ29vZDsKLSAgICBnel9sb2cgKmxvZzsKLQotICAgIC8qIGFsbG9jYXRlIGxvZyBzdHJ1Y3R1cmUgKi8KLSAgICBsb2cgPSBtYWxsb2Moc2l6ZW9mKGd6X2xvZykpOwotICAgIGlmIChsb2cgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgbG9nLT5pZCA9IEdaTE9HSUQ7Ci0KLSAgICAvKiBvcGVuIGZpbGUsIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeSwgYW5kIGxvY2tpbmcgaXQgKi8KLSAgICBsb2ctPmZkID0gb3BlbihwYXRoLCBPX1JEV1IgfCBPX0NSRUFULCAwNjAwKTsKLSAgICBpZiAobG9nLT5mZCA8IDApIHsKLSAgICAgICAgZnJlZShsb2cpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGxvY2sobG9nLT5mZCkpIHsKLSAgICAgICAgY2xvc2UobG9nLT5mZCk7Ci0gICAgICAgIGZyZWUobG9nKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogaWYgZmlsZSBpcyBlbXB0eSwgd3JpdGUgbmV3IGd6aXAgc3RyZWFtICovCi0gICAgaWYgKGxzZWVrKGxvZy0+ZmQsIDAsIFNFRUtfRU5EKSA9PSAwKSB7Ci0gICAgICAgIGlmICh3cml0ZShsb2ctPmZkLCBlbXB0eV9neiwgc2l6ZW9mKGVtcHR5X2d6KSkgIT0gc2l6ZW9mKGVtcHR5X2d6KSkgewotICAgICAgICAgICAgbG9nX2NsZWFuKGxvZyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNoZWNrIGd6aXAgaGVhZGVyICovCi0gICAgKHZvaWQpbHNlZWsobG9nLT5mZCwgMCwgU0VFS19TRVQpOwotICAgIGlmIChyZWFkKGxvZy0+ZmQsIHRlbXAsIDEyKSAhPSAxMiB8fCB0ZW1wWzBdICE9IDB4MWYgfHwKLSAgICAgICAgdGVtcFsxXSAhPSAweDhiIHx8IHRlbXBbMl0gIT0gOCB8fCAodGVtcFszXSAmIDQpID09IDApIHsKLSAgICAgICAgbG9nX2NsZWFuKGxvZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIHByb2Nlc3MgZXh0cmEgZmllbGQgdG8gZmluZCAiYXAiIHN1Yi1maWVsZCAqLwotICAgIHhsZW4gPSB0ZW1wWzEwXSArICh0ZW1wWzExXSA8PCA4KTsKLSAgICBnb29kID0gMDsKLSAgICB3aGlsZSAoeGxlbikgewotICAgICAgICBpZiAoeGxlbiA8IDQgfHwgcmVhZChsb2ctPmZkLCB0ZW1wLCA0KSAhPSA0KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHN1Yl9sZW4gPSB0ZW1wWzJdOwotICAgICAgICBzdWJfbGVuICs9IHRlbXBbM10gPDwgODsKLSAgICAgICAgeGxlbiAtPSA0OwotICAgICAgICBpZiAobWVtY21wKHRlbXAsICJhcCIsIDIpID09IDAgJiYgc3ViX2xlbiA9PSAxNikgewotICAgICAgICAgICAgZ29vZCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoeGxlbiA8IHN1Yl9sZW4pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgKHZvaWQpbHNlZWsobG9nLT5mZCwgc3ViX2xlbiwgU0VFS19DVVIpOwotICAgICAgICB4bGVuIC09IHN1Yl9sZW47Ci0gICAgfQotICAgIGlmICghZ29vZCkgewotICAgICAgICBsb2dfY2xlYW4obG9nKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogcmVhZCBpbiAiYXAiIHN1Yi1maWVsZCAqLwotICAgIGxvZy0+ZXh0cmEgPSBsc2Vlayhsb2ctPmZkLCAwLCBTRUVLX0NVUik7Ci0gICAgaWYgKHJlYWQobG9nLT5mZCwgdGVtcCwgMTYpICE9IDE2KSB7Ci0gICAgICAgIGxvZ19jbGVhbihsb2cpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbG9nLT5tYXJrX29mZiA9IG1ha2Vfb2ZmKHRlbXApOwotICAgIGxvZy0+bGFzdF9vZmYgPSBtYWtlX29mZih0ZW1wICsgOCk7Ci0KLSAgICAvKiBnZXQgY3JjLCBsZW5ndGggb2YgZ3ppcCBmaWxlICovCi0gICAgKHZvaWQpbHNlZWsobG9nLT5mZCwgbG9nLT5sYXN0X29mZiwgU0VFS19TRVQpOwotICAgIGlmIChyZWFkKGxvZy0+ZmQsIHRlbXAsIDEzKSAhPSAxMyB8fAotICAgICAgICBtZW1jbXAodGVtcCwgIlwwMDFcMDAwXDAwMFwzNzdcMzc3IiwgNSkgIT0gMCkgewotICAgICAgICBsb2dfY2xlYW4obG9nKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGxvZy0+Y3JjID0gbWFrZV91bGcodGVtcCArIDUpOwotICAgIGxvZy0+bGVuID0gbWFrZV91bGcodGVtcCArIDkpOwotCi0gICAgLyogc2V0IHVwIHRvIHdyaXRlIG92ZXIgZW1wdHkgbGFzdCBibG9jayAqLwotICAgICh2b2lkKWxzZWVrKGxvZy0+ZmQsIGxvZy0+bGFzdF9vZmYgKyA1LCBTRUVLX1NFVCk7Ci0gICAgbG9nLT5zdG9yZWQgPSAwOwotICAgIHJldHVybiAodm9pZCAqKWxvZzsKLX0KLQotLyogbWF4aW11bSBhbW91bnQgdG8gcHV0IGluIGEgc3RvcmVkIGJsb2NrIGJlZm9yZSBzdGFydGluZyBhIG5ldyBvbmUgKi8KLSNkZWZpbmUgTUFYX0JMT0NLIDE2Mzg0Ci0KLS8qIHdyaXRlIGEgYmxvY2sgdG8gYSBsb2cgb2JqZWN0ICovCi1pbnQgZ3psb2dfd3JpdGUodm9pZCAqb2JqLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuKQotewotICAgIHNpemVfdCBzb21lOwotICAgIHVuc2lnbmVkIGNoYXIgdGVtcFs1XTsKLSAgICBnel9sb2cgKmxvZzsKLQotICAgIC8qIGNoZWNrIG9iamVjdCAqLwotICAgIGxvZyA9IChnel9sb2cgKilvYmo7Ci0gICAgaWYgKGxvZyA9PSBOVUxMIHx8IGxvZy0+aWQgIT0gR1pMT0dJRCkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAvKiB3cml0ZSBzdG9yZWQgYmxvY2tzIHVudGlsIGFsbCBvZiB0aGUgaW5wdXQgaXMgd3JpdHRlbiAqLwotICAgIGRvIHsKLSAgICAgICAgc29tZSA9IE1BWF9CTE9DSyAtIGxvZy0+c3RvcmVkOwotICAgICAgICBpZiAoc29tZSA+IGxlbikKLSAgICAgICAgICAgIHNvbWUgPSBsZW47Ci0gICAgICAgIGlmICh3cml0ZShsb2ctPmZkLCBkYXRhLCBzb21lKSAhPSBzb21lKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGxvZy0+Y3JjID0gY3JjMzIobG9nLT5jcmMsIGRhdGEsIHNvbWUpOwotICAgICAgICBsb2ctPmxlbiArPSBzb21lOwotICAgICAgICBsZW4gLT0gc29tZTsKLSAgICAgICAgZGF0YSArPSBzb21lOwotICAgICAgICBsb2ctPnN0b3JlZCArPSBzb21lOwotCi0gICAgICAgIC8qIGlmIHRoZSBzdG9yZWQgYmxvY2sgaXMgZnVsbCwgZW5kIGl0IGFuZCBzdGFydCBhbm90aGVyICovCi0gICAgICAgIGlmIChsb2ctPnN0b3JlZCA9PSBNQVhfQkxPQ0spIHsKLSAgICAgICAgICAgICh2b2lkKWxzZWVrKGxvZy0+ZmQsIGxvZy0+bGFzdF9vZmYsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHRlbXBbMF0gPSAwOwotICAgICAgICAgICAgZGljZV91bGcobG9nLT5zdG9yZWQgKyAoKHVuc2lnbmVkIGxvbmcpKH5sb2ctPnN0b3JlZCkgPDwgMTYpLAotICAgICAgICAgICAgICAgICAgICAgdGVtcCArIDEpOwotICAgICAgICAgICAgaWYgKHdyaXRlKGxvZy0+ZmQsIHRlbXAsIDUpICE9IDUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICBsb2ctPmxhc3Rfb2ZmID0gbHNlZWsobG9nLT5mZCwgbG9nLT5zdG9yZWQsIFNFRUtfQ1VSKTsKLSAgICAgICAgICAgICh2b2lkKWxzZWVrKGxvZy0+ZmQsIDUsIFNFRUtfQ1VSKTsKLSAgICAgICAgICAgIGxvZy0+c3RvcmVkID0gMDsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGxlbik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIHJlY29tcHJlc3MgdGhlIHJlbWFpbmluZyBzdG9yZWQgZGVmbGF0ZSBkYXRhIGluIHBsYWNlICovCi1sb2NhbCBpbnQgcmVjb21wKGd6X2xvZyAqbG9nKQotewotICAgIHpfc3RyZWFtIHN0cm07Ci0gICAgc2l6ZV90IGxlbiwgbWF4OwotICAgIHVuc2lnbmVkIGNoYXIgKmluOwotICAgIHVuc2lnbmVkIGNoYXIgKm91dDsKLSAgICB1bnNpZ25lZCBjaGFyIHRlbXBbMTZdOwotCi0gICAgLyogYWxsb2NhdGUgc3BhY2UgYW5kIHJlYWQgaXQgYWxsIGluIChpdCdzIGFyb3VuZCAxIE1CKSAqLwotICAgIGxlbiA9IGxvZy0+bGFzdF9vZmYgLSBsb2ctPm1hcmtfb2ZmOwotICAgIG1heCA9IGxlbiArIChsZW4gPj4gMTIpICsgKGxlbiA+PiAxNCkgKyAxMTsKLSAgICBvdXQgPSBtYWxsb2MobWF4KTsKLSAgICBpZiAob3V0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAxOwotICAgIGluID0gbWFsbG9jKGxlbik7Ci0gICAgaWYgKGluID09IE5VTEwpIHsKLSAgICAgICAgZnJlZShvdXQpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgKHZvaWQpbHNlZWsobG9nLT5mZCwgbG9nLT5tYXJrX29mZiwgU0VFS19TRVQpOwotICAgIGlmIChyZWFkKGxvZy0+ZmQsIGluLCBsZW4pICE9IGxlbikgewotICAgICAgICBmcmVlKGluKTsKLSAgICAgICAgZnJlZShvdXQpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiByZWNvbXByZXNzIGluIG1lbW9yeSwgZGVjb2Rpbmcgc3RvcmVkIGRhdGEgYXMgd2UgZ28gKi8KLSAgICAvKiBub3RlOiB0aGlzIGFzc3VtZXMgdGhhdCB1bnNpZ25lZCBpcyBmb3VyIGJ5dGVzIG9yIG1vcmUgKi8KLSAgICAvKiAgICAgICBjb25zaWRlciBub3QgbWFraW5nIHRoYXQgYXNzdW1wdGlvbiAqLwotICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOwotICAgIHN0cm0uemZyZWUgPSBaX05VTEw7Ci0gICAgc3RybS5vcGFxdWUgPSBaX05VTEw7Ci0gICAgaWYgKGRlZmxhdGVJbml0Migmc3RybSwgWl9CRVNUX0NPTVBSRVNTSU9OLCBaX0RFRkxBVEVELCAtMTUsIDgsCi0gICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSkgIT0gWl9PSykgewotICAgICAgICBmcmVlKGluKTsKLSAgICAgICAgZnJlZShvdXQpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgc3RybS5uZXh0X2luID0gaW47Ci0gICAgc3RybS5hdmFpbF9vdXQgPSBtYXg7Ci0gICAgc3RybS5uZXh0X291dCA9IG91dDsKLSAgICB3aGlsZSAobGVuID49IDUpIHsKLSAgICAgICAgaWYgKHN0cm0ubmV4dF9pblswXSAhPSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBzdHJtLm5leHRfaW5bMV0gKyAoc3RybS5uZXh0X2luWzJdIDw8IDgpOwotICAgICAgICBzdHJtLm5leHRfaW4gKz0gNTsKLSAgICAgICAgbGVuIC09IDU7Ci0gICAgICAgIGlmIChzdHJtLmF2YWlsX2luICE9IDApIHsKLSAgICAgICAgICAgIGlmIChsZW4gPCBzdHJtLmF2YWlsX2luKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgbGVuIC09IHN0cm0uYXZhaWxfaW47Ci0gICAgICAgICAgICAodm9pZClkZWZsYXRlKCZzdHJtLCBaX05PX0ZMVVNIKTsKLSAgICAgICAgICAgIGlmIChzdHJtLmF2YWlsX2luICE9IDAgfHwgc3RybS5hdmFpbF9vdXQgPT0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAodm9pZClkZWZsYXRlKCZzdHJtLCBaX1NZTkNfRkxVU0gpOwotICAgICh2b2lkKWRlZmxhdGVFbmQoJnN0cm0pOwotICAgIGZyZWUoaW4pOwotICAgIGlmIChsZW4gIT0gMCB8fCBzdHJtLmF2YWlsX291dCA9PSAwKSB7Ci0gICAgICAgIGZyZWUob3V0KTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogb3ZlcndyaXRlIHN0b3JlZCBkYXRhIHdpdGggY29tcHJlc3NlZCBkYXRhICovCi0gICAgKHZvaWQpbHNlZWsobG9nLT5mZCwgbG9nLT5tYXJrX29mZiwgU0VFS19TRVQpOwotICAgIGxlbiA9IG1heCAtIHN0cm0uYXZhaWxfb3V0OwotICAgIGlmICh3cml0ZShsb2ctPmZkLCBvdXQsIGxlbikgIT0gbGVuKSB7Ci0gICAgICAgIGZyZWUob3V0KTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGZyZWUob3V0KTsKLQotICAgIC8qIHdyaXRlIGxhc3QgZW1wdHkgYmxvY2ssIGNyYywgYW5kIGxlbmd0aCAqLwotICAgIGxvZy0+bWFya19vZmYgPSBsb2ctPmxhc3Rfb2ZmID0gbHNlZWsobG9nLT5mZCwgMCwgU0VFS19DVVIpOwotICAgIHRlbXBbMF0gPSAxOwotICAgIGRpY2VfdWxnKDB4ZmZmZkwgPDwgMTYsIHRlbXAgKyAxKTsKLSAgICBkaWNlX3VsZyhsb2ctPmNyYywgdGVtcCArIDUpOwotICAgIGRpY2VfdWxnKGxvZy0+bGVuLCB0ZW1wICsgOSk7Ci0gICAgaWYgKHdyaXRlKGxvZy0+ZmQsIHRlbXAsIDEzKSAhPSAxMykKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAvKiB0cnVuY2F0ZSBmaWxlIHRvIGRpc2NhcmQgcmVtYWluaW5nIHN0b3JlZCBkYXRhIGFuZCBvbGQgdHJhaWxlciAqLwotICAgIGZ0cnVuY2F0ZShsb2ctPmZkLCBsc2Vlayhsb2ctPmZkLCAwLCBTRUVLX0NVUikpOwotCi0gICAgLyogdXBkYXRlIGV4dHJhIGZpZWxkIHRvIHBvaW50IHRvIG5ldyBsYXN0IGVtcHR5IGJsb2NrICovCi0gICAgKHZvaWQpbHNlZWsobG9nLT5mZCwgbG9nLT5leHRyYSwgU0VFS19TRVQpOwotICAgIGRpY2Vfb2ZmKGxvZy0+bWFya19vZmYsIHRlbXApOwotICAgIGRpY2Vfb2ZmKGxvZy0+bGFzdF9vZmYsIHRlbXAgKyA4KTsKLSAgICBpZiAod3JpdGUobG9nLT5mZCwgdGVtcCwgMTYpICE9IDE2KQotICAgICAgICByZXR1cm4gMTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogbWF4aW11bSBhY2N1bXVsYXRpb24gb2Ygc3RvcmVkIGJsb2NrcyBiZWZvcmUgY29tcHJlc3NpbmcgKi8KLSNkZWZpbmUgTUFYX1NUT1JFRCAxMDQ4NTc2Ci0KLS8qIGNsb3NlIGxvZyBvYmplY3QgKi8KLWludCBnemxvZ19jbG9zZSh2b2lkICpvYmopCi17Ci0gICAgdW5zaWduZWQgY2hhciB0ZW1wWzhdOwotICAgIGd6X2xvZyAqbG9nOwotCi0gICAgLyogY2hlY2sgb2JqZWN0ICovCi0gICAgbG9nID0gKGd6X2xvZyAqKW9iajsKLSAgICBpZiAobG9nID09IE5VTEwgfHwgbG9nLT5pZCAhPSBHWkxPR0lEKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIC8qIGdvIHRvIHN0YXJ0IG9mIG1vc3QgcmVjZW50IGJsb2NrIGJlaW5nIHdyaXR0ZW4gKi8KLSAgICAodm9pZClsc2Vlayhsb2ctPmZkLCBsb2ctPmxhc3Rfb2ZmLCBTRUVLX1NFVCk7Ci0KLSAgICAvKiBpZiBzb21lIHN0dWZmIHdhcyBwdXQgdGhlcmUsIHVwZGF0ZSBibG9jayAqLwotICAgIGlmIChsb2ctPnN0b3JlZCkgewotICAgICAgICB0ZW1wWzBdID0gMDsKLSAgICAgICAgZGljZV91bGcobG9nLT5zdG9yZWQgKyAoKHVuc2lnbmVkIGxvbmcpKH5sb2ctPnN0b3JlZCkgPDwgMTYpLAotICAgICAgICAgICAgICAgICB0ZW1wICsgMSk7Ci0gICAgICAgIGlmICh3cml0ZShsb2ctPmZkLCB0ZW1wLCA1KSAhPSA1KQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGxvZy0+bGFzdF9vZmYgPSBsc2Vlayhsb2ctPmZkLCBsb2ctPnN0b3JlZCwgU0VFS19DVVIpOwotICAgIH0KLQotICAgIC8qIHdyaXRlIGxhc3QgYmxvY2sgKGVtcHR5KSAqLwotICAgIGlmICh3cml0ZShsb2ctPmZkLCAiXDAwMVwwMDBcMDAwXDM3N1wzNzciLCA1KSAhPSA1KQotICAgICAgICByZXR1cm4gMTsKLQotICAgIC8qIHdyaXRlIHVwZGF0ZWQgY3JjIGFuZCB1bmNvbXByZXNzZWQgbGVuZ3RoICovCi0gICAgZGljZV91bGcobG9nLT5jcmMsIHRlbXApOwotICAgIGRpY2VfdWxnKGxvZy0+bGVuLCB0ZW1wICsgNCk7Ci0gICAgaWYgKHdyaXRlKGxvZy0+ZmQsIHRlbXAsIDgpICE9IDgpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgLyogcHV0IG9mZnNldCBvZiB0aGF0IGxhc3QgYmxvY2sgaW4gZ3ppcCBleHRyYSBibG9jayAqLwotICAgICh2b2lkKWxzZWVrKGxvZy0+ZmQsIGxvZy0+ZXh0cmEgKyA4LCBTRUVLX1NFVCk7Ci0gICAgZGljZV9vZmYobG9nLT5sYXN0X29mZiwgdGVtcCk7Ci0gICAgaWYgKHdyaXRlKGxvZy0+ZmQsIHRlbXAsIDgpICE9IDgpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgLyogaWYgbW9yZSB0aGFuIDEgTUIgc3RvcmVkLCB0aGVuIHRpbWUgdG8gY29tcHJlc3MgaXQgKi8KLSAgICBpZiAobG9nLT5sYXN0X29mZiAtIGxvZy0+bWFya19vZmYgPiBNQVhfU1RPUkVEKSB7Ci0gICAgICAgIGlmIChyZWNvbXAobG9nKSkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIC8qIHVubG9jayBhbmQgY2xvc2UgZmlsZSAqLwotICAgIGxvZ19jbGVhbihsb2cpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2V4YW1wbGVzL2d6bG9nLmggYi9saWJzL3psaWIvZXhhbXBsZXMvZ3psb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwMGJkNS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvZXhhbXBsZXMvZ3psb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIGd6bG9nLmgKLSAgQ29weXJpZ2h0IChDKSAyMDA0IE1hcmsgQWRsZXIsIGFsbCByaWdodHMgcmVzZXJ2ZWQKLSAgdmVyc2lvbiAxLjAsIDI2IE5vdiAyMDA0Ci0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTWFyayBBZGxlciAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0gKi8KLQotLyoKLSAgIFRoZSBnemxvZyBvYmplY3QgYWxsb3dzIHdyaXRpbmcgc2hvcnQgbWVzc2FnZXMgdG8gYSBnemlwcGVkIGxvZyBmaWxlLAotICAgb3BlbmluZyB0aGUgbG9nIGZpbGUgbG9ja2VkIGZvciBzbWFsbCBidXJzdHMsIGFuZCB0aGVuIGNsb3NpbmcgaXQuICBUaGUgbG9nCi0gICBvYmplY3Qgd29ya3MgYnkgYXBwZW5kaW5nIHN0b3JlZCBkYXRhIHRvIHRoZSBnemlwIGZpbGUgdW50aWwgMSBNQiBoYXMgYmVlbgotICAgYWNjdW11bGF0ZWQuICBBdCB0aGF0IHRpbWUsIHRoZSBzdG9yZWQgZGF0YSBpcyBjb21wcmVzc2VkLCBhbmQgcmVwbGFjZXMgdGhlCi0gICB1bmNvbXByZXNzZWQgZGF0YSBpbiB0aGUgZmlsZS4gIFRoZSBsb2cgZmlsZSBpcyB0cnVuY2F0ZWQgdG8gaXRzIG5ldyBzaXplIGF0Ci0gICB0aGF0IHRpbWUuICBBZnRlciBjbG9zaW5nLCB0aGUgbG9nIGZpbGUgaXMgYWx3YXlzIHZhbGlkIGd6aXAgZmlsZSB0aGF0IGNhbgotICAgZGVjb21wcmVzc2VkIHRvIHJlY292ZXIgd2hhdCB3YXMgd3JpdHRlbi4KLQotICAgQSBnemlwIGhlYWRlciAiZXh0cmEiIGZpZWxkIGNvbnRhaW5zIHR3byBmaWxlIG9mZnNldHMgZm9yIGFwcGVuZGluZy4gIFRoZQotICAgZmlyc3QgcG9pbnRzIHRvIGp1c3QgYWZ0ZXIgdGhlIGxhc3QgY29tcHJlc3NlZCBkYXRhLiAgVGhlIHNlY29uZCBwb2ludHMgdG8KLSAgIHRoZSBsYXN0IHN0b3JlZCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sIHdoaWNoIGlzIGVtcHR5LiAgQWxsIG9mIHRoZQotICAgZGF0YSBiZXR3ZWVuIHRob3NlIHBvaW50ZXJzIGlzIHVuY29tcHJlc3NlZC4KLSAqLwotCi0vKiBPcGVuIGEgZ3psb2cgb2JqZWN0LCBjcmVhdGluZyB0aGUgbG9nIGZpbGUgaWYgaXQgZG9lcyBub3QgZXhpc3QuICBSZXR1cm4KLSAgIE5VTEwgb24gZXJyb3IuICBOb3RlIHRoYXQgZ3psb2dfb3BlbigpIGNvdWxkIHRha2UgYSBsb25nIHRpbWUgdG8gcmV0dXJuIGlmCi0gICB0aGVyZSBpcyBkaWZmaWN1bHR5IGluIGxvY2tpbmcgdGhlIGZpbGUuICovCi12b2lkICpnemxvZ19vcGVuKGNoYXIgKnBhdGgpOwotCi0vKiBXcml0ZSB0byBhIGd6bG9nIG9iamVjdC4gIFJldHVybiBub24temVybyBvbiBlcnJvci4gIFRoaXMgZnVuY3Rpb24gd2lsbAotICAgc2ltcGx5IHdyaXRlIGRhdGEgdG8gdGhlIGZpbGUgdW5jb21wcmVzc2VkLiAgQ29tcHJlc3Npb24gb2YgdGhlIGRhdGEKLSAgIHdpbGwgbm90IG9jY3VyIHVudGlsIGd6bG9nX2Nsb3NlKCkgaXMgY2FsbGVkLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdAotICAgZ3psb2dfd3JpdGUoKSBpcyB1c2VkIGZvciBhIHNob3J0IG1lc3NhZ2UsIGFuZCB0aGVuIGd6bG9nX2Nsb3NlKCkgaXMKLSAgIGNhbGxlZC4gIElmIGEgbGFyZ2UgYW1vdW50IG9mIGRhdGEgaXMgdG8gYmUgd3JpdHRlbiwgdGhlbiB0aGUgYXBwbGljYXRpb24KLSAgIHNob3VsZCB3cml0ZSBubyBtb3JlIHRoYW4gMSBNQiBhdCBhIHRpbWUgd2l0aCBnemxvZ193cml0ZSgpIGJlZm9yZQotICAgY2FsbGluZyBnemxvZ19jbG9zZSgpIGFuZCB0aGVuIGd6bG9nX29wZW4oKSBhZ2Fpbi4gKi8KLWludCBnemxvZ193cml0ZSh2b2lkICpsb2csIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4pOwotCi0vKiBDbG9zZSBhIGd6bG9nIG9iamVjdC4gIFJldHVybiBub24temVybyBvbiBlcnJvci4gIFRoZSBsb2cgZmlsZSBpcyBsb2NrZWQKLSAgIHVudGlsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGNvbXByZXNzIHN0b3JlZCBkYXRhCi0gICBhdCB0aGUgZW5kIG9mIHRoZSBnemlwIGZpbGUgaWYgYXQgbGVhc3QgMSBNQiBoYXMgYmVlbiBhY2N1bXVsYXRlZC4gIE5vdGUKLSAgIHRoYXQgdGhlIGZpbGUgd2lsbCBub3QgYmUgYSB2YWxpZCBnemlwIGZpbGUgdW50aWwgdGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMuCi0gKi8KLWludCBnemxvZ19jbG9zZSh2b2lkICpsb2cpOwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2V4YW1wbGVzL3psaWJfaG93Lmh0bWwgYi9saWJzL3psaWIvZXhhbXBsZXMvemxpYl9ob3cuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5OThkYi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvZXhhbXBsZXMvemxpYl9ob3cuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2xvb3NlLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08dGl0bGU+emxpYiBVc2FnZSBFeGFtcGxlPC90aXRsZT4KLTwhLS0gIENvcHlyaWdodCAoYykgMjAwNCBNYXJrIEFkbGVyLiAgLS0+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzAwQTAwMCI+Ci08aDIgYWxpZ249ImNlbnRlciI+IHpsaWIgVXNhZ2UgRXhhbXBsZSA8L2gyPgotV2Ugb2Z0ZW4gZ2V0IHF1ZXN0aW9ucyBhYm91dCBob3cgdGhlIDx0dD5kZWZsYXRlKCk8L3R0PiBhbmQgPHR0PmluZmxhdGUoKTwvdHQ+IGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZC4KLVVzZXJzIHdvbmRlciB3aGVuIHRoZXkgc2hvdWxkIHByb3ZpZGUgbW9yZSBpbnB1dCwgd2hlbiB0aGV5IHNob3VsZCB1c2UgbW9yZSBvdXRwdXQsCi13aGF0IHRvIGRvIHdpdGggYSA8dHQ+Wl9CVUZfRVJST1I8L3R0PiwgaG93IHRvIG1ha2Ugc3VyZSB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzIHByb3Blcmx5LCBhbmQKLXNvIG9uLiAgU28gZm9yIHRob3NlIHdobyBoYXZlIHJlYWQgPHR0PnpsaWIuaDwvdHQ+IChhIGZldyB0aW1lcyksIGFuZAotd291bGQgbGlrZSBmdXJ0aGVyIGVkaWZpY2F0aW9uLCBiZWxvdyBpcyBhbiBhbm5vdGF0ZWQgZXhhbXBsZSBpbiBDIG9mIHNpbXBsZSByb3V0aW5lcyB0byBjb21wcmVzcyBhbmQgZGVjb21wcmVzcwotZnJvbSBhbiBpbnB1dCBmaWxlIHRvIGFuIG91dHB1dCBmaWxlIHVzaW5nIDx0dD5kZWZsYXRlKCk8L3R0PiBhbmQgPHR0PmluZmxhdGUoKTwvdHQ+IHJlc3BlY3RpdmVseS4gIFRoZQotYW5ub3RhdGlvbnMgYXJlIGludGVyc3BlcnNlZCBiZXR3ZWVuIGxpbmVzIG9mIHRoZSBjb2RlLiAgU28gcGxlYXNlIHJlYWQgYmV0d2VlbiB0aGUgbGluZXMuCi1XZSBob3BlIHRoaXMgaGVscHMgZXhwbGFpbiBzb21lIG9mIHRoZSBpbnRyaWNhY2llcyBvZiA8ZW0+emxpYjwvZW0+LgotPHA+Ci1XaXRob3V0IGZ1cnRoZXIgYWRpZXUsIGhlcmUgaXMgdGhlIHByb2dyYW0gPGEgaHJlZj0ienBpcGUuYyI+PHR0PnpwaXBlLmM8L3R0PjwvYT46Ci08cHJlPjxiPgotLyogenBpcGUuYzogZXhhbXBsZSBvZiBwcm9wZXIgdXNlIG9mIHpsaWIncyBpbmZsYXRlKCkgYW5kIGRlZmxhdGUoKQotICAgTm90IGNvcHlyaWdodGVkIC0tIHByb3ZpZGVkIHRvIHRoZSBwdWJsaWMgZG9tYWluCi0gICBWZXJzaW9uIDEuMiAgOSBOb3ZlbWJlciAyMDA0ICBNYXJrIEFkbGVyICovCi0KLS8qIFZlcnNpb24gaGlzdG9yeToKLSAgIDEuMCAgMzAgT2N0IDIwMDQgIEZpcnN0IHZlcnNpb24KLSAgIDEuMSAgIDggTm92IDIwMDQgIEFkZCB2b2lkIGNhc3RpbmcgZm9yIHVudXNlZCByZXR1cm4gdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICBVc2Ugc3dpdGNoIHN0YXRlbWVudCBmb3IgaW5mbGF0ZSgpIHJldHVybiB2YWx1ZXMKLSAgIDEuMiAgIDkgTm92IDIwMDQgIEFkZCBhc3NlcnRpb25zIHRvIGRvY3VtZW50IHpsaWIgZ3VhcmFudGVlcwotICovCi08L2I+PC9wcmU+PCEtLSAtLT4KLVdlIG5vdyBpbmNsdWRlIHRoZSBoZWFkZXIgZmlsZXMgZm9yIHRoZSByZXF1aXJlZCBkZWZpbml0aW9ucy4gIEZyb20KLTx0dD5zdGRpby5oPC90dD4gd2UgdXNlIDx0dD5mb3BlbigpPC90dD4sIDx0dD5mcmVhZCgpPC90dD4sIDx0dD5md3JpdGUoKTwvdHQ+LAotPHR0PmZlb2YoKTwvdHQ+LCA8dHQ+ZmVycm9yKCk8L3R0PiwgYW5kIDx0dD5mY2xvc2UoKTwvdHQ+IGZvciBmaWxlIGkvbywgYW5kCi08dHQ+ZnB1dHMoKTwvdHQ+IGZvciBlcnJvciBtZXNzYWdlcy4gIEZyb20gPHR0PnN0cmluZy5oPC90dD4gd2UgdXNlCi08dHQ+c3RyY21wKCk8L3R0PiBmb3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHByb2Nlc3NpbmcuCi1Gcm9tIDx0dD5hc3NlcnQuaDwvdHQ+IHdlIHVzZSB0aGUgPHR0PmFzc2VydCgpPC90dD4gbWFjcm8uCi1Gcm9tIDx0dD56bGliLmg8L3R0Pgotd2UgdXNlIHRoZSBiYXNpYyBjb21wcmVzc2lvbiBmdW5jdGlvbnMgPHR0PmRlZmxhdGVJbml0KCk8L3R0PiwKLTx0dD5kZWZsYXRlKCk8L3R0PiwgYW5kIDx0dD5kZWZsYXRlRW5kKCk8L3R0PiwgYW5kIHRoZSBiYXNpYyBkZWNvbXByZXNzaW9uCi1mdW5jdGlvbnMgPHR0PmluZmxhdGVJbml0KCk8L3R0PiwgPHR0PmluZmxhdGUoKTwvdHQ+LCBhbmQKLTx0dD5pbmZsYXRlRW5kKCk8L3R0Pi4KLTxwcmU+PGI+Ci0jaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKLSNpbmNsdWRlICZsdDthc3NlcnQuaCZndDsKLSNpbmNsdWRlICJ6bGliLmgiCi08L2I+PC9wcmU+PCEtLSAtLT4KLTx0dD5DSFVOSzwvdHQ+IGlzIHNpbXBseSB0aGUgYnVmZmVyIHNpemUgZm9yIGZlZWRpbmcgZGF0YSB0byBhbmQgcHVsbGluZyBkYXRhCi1mcm9tIHRoZSA8ZW0+emxpYjwvZW0+IHJvdXRpbmVzLiAgTGFyZ2VyIGJ1ZmZlciBzaXplcyB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCwKLWVzcGVjaWFsbHkgZm9yIDx0dD5pbmZsYXRlKCk8L3R0Pi4gIElmIHRoZSBtZW1vcnkgaXMgYXZhaWxhYmxlLCBidWZmZXJzIHNpemVzCi1vbiB0aGUgb3JkZXIgb2YgMTI4SyBvciAyNTZLIGJ5dGVzIHNob3VsZCBiZSB1c2VkLgotPHByZT48Yj4KLSNkZWZpbmUgQ0hVTksgMTYzODQKLTwvYj48L3ByZT48IS0tIC0tPgotVGhlIDx0dD5kZWYoKTwvdHQ+IHJvdXRpbmUgY29tcHJlc3NlcyBkYXRhIGZyb20gYW4gaW5wdXQgZmlsZSB0byBhbiBvdXRwdXQgZmlsZS4gIFRoZSBvdXRwdXQgZGF0YQotd2lsbCBiZSBpbiB0aGUgPGVtPnpsaWI8L2VtPiBmb3JtYXQsIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIHRoZSA8ZW0+Z3ppcDwvZW0+IG9yIDxlbT56aXA8L2VtPgotZm9ybWF0cy4gIFRoZSA8ZW0+emxpYjwvZW0+IGZvcm1hdCBoYXMgYSB2ZXJ5IHNtYWxsIGhlYWRlciBvZiBvbmx5IHR3byBieXRlcyB0byBpZGVudGlmeSBpdCBhcwotYSA8ZW0+emxpYjwvZW0+IHN0cmVhbSBhbmQgdG8gcHJvdmlkZSBkZWNvZGluZyBpbmZvcm1hdGlvbiwgYW5kIGEgZm91ci1ieXRlIHRyYWlsZXIgd2l0aCBhIGZhc3QKLWNoZWNrIHZhbHVlIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhZnRlciBkZWNvZGluZy4KLTxwcmU+PGI+Ci0vKiBDb21wcmVzcyBmcm9tIGZpbGUgc291cmNlIHRvIGZpbGUgZGVzdCB1bnRpbCBFT0Ygb24gc291cmNlLgotICAgZGVmKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUKLSAgIGFsbG9jYXRlZCBmb3IgcHJvY2Vzc2luZywgWl9TVFJFQU1fRVJST1IgaWYgYW4gaW52YWxpZCBjb21wcmVzc2lvbgotICAgbGV2ZWwgaXMgc3VwcGxpZWQsIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgdmVyc2lvbiBvZiB6bGliLmggYW5kIHRoZQotICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBsaW5rZWQgZG8gbm90IG1hdGNoLCBvciBaX0VSUk5PIGlmIHRoZXJlIGlzCi0gICBhbiBlcnJvciByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGZpbGVzLiAqLwotaW50IGRlZihGSUxFICpzb3VyY2UsIEZJTEUgKmRlc3QsIGludCBsZXZlbCkKLXsKLTwvYj48L3ByZT4KLUhlcmUgYXJlIHRoZSBsb2NhbCB2YXJpYWJsZXMgZm9yIDx0dD5kZWYoKTwvdHQ+LiAgPHR0PnJldDwvdHQ+IHdpbGwgYmUgdXNlZCBmb3IgPGVtPnpsaWI8L2VtPgotcmV0dXJuIGNvZGVzLiAgPHR0PmZsdXNoPC90dD4gd2lsbCBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IGZsdXNoaW5nIHN0YXRlIGZvciA8dHQ+ZGVmbGF0ZSgpPC90dD4sCi13aGljaCBpcyBlaXRoZXIgbm8gZmx1c2hpbmcsIG9yIGZsdXNoIHRvIGNvbXBsZXRpb24gYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZSBpcyByZWFjaGVkLgotPHR0PmhhdmU8L3R0PiBpcyB0aGUgYW1vdW50IG9mIGRhdGEgcmV0dXJuZWQgZnJvbSA8dHQ+ZGVmbGF0ZSgpPC90dD4uICBUaGUgPHR0PnN0cm08L3R0PiBzdHJ1Y3R1cmUKLWlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byBhbmQgZnJvbSB0aGUgPGVtPnpsaWI8L2VtPiByb3V0aW5lcywgYW5kIHRvIG1haW50YWluIHRoZQotPHR0PmRlZmxhdGUoKTwvdHQ+IHN0YXRlLiAgPHR0PmluPC90dD4gYW5kIDx0dD5vdXQ8L3R0PiBhcmUgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBmb3IKLTx0dD5kZWZsYXRlKCk8L3R0Pi4KLTxwcmU+PGI+Ci0gICAgaW50IHJldCwgZmx1c2g7Ci0gICAgdW5zaWduZWQgaGF2ZTsKLSAgICB6X3N0cmVhbSBzdHJtOwotICAgIGNoYXIgaW5bQ0hVTktdOwotICAgIGNoYXIgb3V0W0NIVU5LXTsKLTwvYj48L3ByZT48IS0tIC0tPgotVGhlIGZpcnN0IHRoaW5nIHdlIGRvIGlzIHRvIGluaXRpYWxpemUgdGhlIDxlbT56bGliPC9lbT4gc3RhdGUgZm9yIGNvbXByZXNzaW9uIHVzaW5nCi08dHQ+ZGVmbGF0ZUluaXQoKTwvdHQ+LiAgVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBmaXJzdCB1c2Ugb2YgPHR0PmRlZmxhdGUoKTwvdHQ+LgotVGhlIDx0dD56YWxsb2M8L3R0PiwgPHR0PnpmcmVlPC90dD4sIGFuZCA8dHQ+b3BhcXVlPC90dD4gZmllbGRzIGluIHRoZSA8dHQ+c3RybTwvdHQ+Ci1zdHJ1Y3R1cmUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyA8dHQ+ZGVmbGF0ZUluaXQoKTwvdHQ+LiAgSGVyZSB0aGV5IGFyZQotc2V0IHRvIHRoZSA8ZW0+emxpYjwvZW0+IGNvbnN0YW50IDx0dD5aX05VTEw8L3R0PiB0byByZXF1ZXN0IHRoYXQgPGVtPnpsaWI8L2VtPiB1c2UKLXRoZSBkZWZhdWx0IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLiAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gY2hvb3NlIHRvIHByb3ZpZGUKLWN1c3RvbSBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBoZXJlLiAgPHR0PmRlZmxhdGVJbml0KCk8L3R0PiB3aWxsIGFsbG9jYXRlIG9uIHRoZQotb3JkZXIgb2YgMjU2SyBieXRlcyBmb3IgdGhlIGludGVybmFsIHN0YXRlLgotKFNlZSA8YSBocmVmPSJ6bGliX3RlY2guaHRtbCI+PGVtPnpsaWIgVGVjaG5pY2FsIERldGFpbHM8L2VtPjwvYT4uKQotPHA+Ci08dHQ+ZGVmbGF0ZUluaXQoKTwvdHQ+IGlzIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHRvIGJlIGluaXRpYWxpemVkIGFuZAotdGhlIGNvbXByZXNzaW9uIGxldmVsLCB3aGljaCBpcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiAtMSB0byA5LiAgTG93ZXIgY29tcHJlc3Npb24KLWxldmVscyByZXN1bHQgaW4gZmFzdGVyIGV4ZWN1dGlvbiwgYnV0IGxlc3MgY29tcHJlc3Npb24uICBIaWdoZXIgbGV2ZWxzIHJlc3VsdCBpbgotZ3JlYXRlciBjb21wcmVzc2lvbiwgYnV0IHNsb3dlciBleGVjdXRpb24uICBUaGUgPGVtPnpsaWI8L2VtPiBjb25zdGFudCBaX0RFRkFVTFRfQ09NUFJFU1NJT04sCi1lcXVhbCB0byAtMSwKLXByb3ZpZGVzIGEgZ29vZCBjb21wcm9taXNlIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIHNwZWVkIGFuZCBpcyBlcXVpdmFsZW50IHRvIGxldmVsIDYuCi1MZXZlbCAwIGFjdHVhbGx5IGRvZXMgbm8gY29tcHJlc3Npb24gYXQgYWxsLCBhbmQgaW4gZmFjdCBleHBhbmRzIHRoZSBkYXRhIHNsaWdodGx5IHRvIHByb2R1Y2UKLXRoZSA8ZW0+emxpYjwvZW0+IGZvcm1hdCAoaXQgaXMgbm90IGEgYnl0ZS1mb3ItYnl0ZSBjb3B5IG9mIHRoZSBpbnB1dCkuCi1Nb3JlIGFkdmFuY2VkIGFwcGxpY2F0aW9ucyBvZiA8ZW0+emxpYjwvZW0+Ci1tYXkgdXNlIDx0dD5kZWZsYXRlSW5pdDIoKTwvdHQ+IGhlcmUgaW5zdGVhZC4gIFN1Y2ggYW4gYXBwbGljYXRpb24gbWF5IHdhbnQgdG8gcmVkdWNlIGhvdwotbXVjaCBtZW1vcnkgd2lsbCBiZSB1c2VkLCBhdCBzb21lIHByaWNlIGluIGNvbXByZXNzaW9uLiAgT3IgaXQgbWF5IG5lZWQgdG8gcmVxdWVzdCBhCi08ZW0+Z3ppcDwvZW0+IGhlYWRlciBhbmQgdHJhaWxlciBpbnN0ZWFkIG9mIGEgPGVtPnpsaWI8L2VtPiBoZWFkZXIgYW5kIHRyYWlsZXIsIG9yIHJhdwotZW5jb2Rpbmcgd2l0aCBubyBoZWFkZXIgb3IgdHJhaWxlciBhdCBhbGwuCi08cD4KLVdlIG11c3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiA8dHQ+ZGVmbGF0ZUluaXQoKTwvdHQ+IGFnYWluc3QgdGhlIDxlbT56bGliPC9lbT4gY29uc3RhbnQKLTx0dD5aX09LPC90dD4gdG8gbWFrZSBzdXJlIHRoYXQgaXQgd2FzIGFibGUgdG8KLWFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlLCBhbmQgdGhhdCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIHdlcmUgdmFsaWQuCi08dHQ+ZGVmbGF0ZUluaXQoKTwvdHQ+IHdpbGwgYWxzbyBjaGVjayB0aGF0IHRoZSB2ZXJzaW9uIG9mIDxlbT56bGliPC9lbT4gdGhhdCB0aGUgPHR0PnpsaWIuaDwvdHQ+Ci1maWxlIGNhbWUgZnJvbSBtYXRjaGVzIHRoZSB2ZXJzaW9uIG9mIDxlbT56bGliPC9lbT4gYWN0dWFsbHkgbGlua2VkIHdpdGggdGhlIHByb2dyYW0uICBUaGlzCi1pcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgZW52aXJvbm1lbnRzIGluIHdoaWNoIDxlbT56bGliPC9lbT4gaXMgYSBzaGFyZWQgbGlicmFyeS4KLTxwPgotTm90ZSB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiBpbml0aWFsaXplIG11bHRpcGxlLCBpbmRlcGVuZGVudCA8ZW0+emxpYjwvZW0+IHN0cmVhbXMsIHdoaWNoIGNhbgotb3BlcmF0ZSBpbiBwYXJhbGxlbC4gIFRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBtYWludGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUgYWxsb3dzIHRoZSA8ZW0+emxpYjwvZW0+Ci1yb3V0aW5lcyB0byBiZSByZWVudHJhbnQuCi08cHJlPjxiPgotICAgIC8qIGFsbG9jYXRlIGRlZmxhdGUgc3RhdGUgKi8KLSAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKLSAgICBzdHJtLnpmcmVlID0gWl9OVUxMOwotICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOwotICAgIHJldCA9IGRlZmxhdGVJbml0KCZhbXA7c3RybSwgbGV2ZWwpOwotICAgIGlmIChyZXQgIT0gWl9PSykKLSAgICAgICAgcmV0dXJuIHJldDsKLTwvYj48L3ByZT48IS0tIC0tPgotV2l0aCB0aGUgcGxlYXNhbnRyaWVzIG91dCBvZiB0aGUgd2F5LCBub3cgd2UgY2FuIGdldCBkb3duIHRvIGJ1c2luZXNzLiAgVGhlIG91dGVyIDx0dD5kbzwvdHQ+LWxvb3AKLXJlYWRzIGFsbCBvZiB0aGUgaW5wdXQgZmlsZSBhbmQgZXhpdHMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbG9vcCBvbmNlIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuCi1UaGlzIGxvb3AgY29udGFpbnMgdGhlIG9ubHkgY2FsbCBvZiA8dHQ+ZGVmbGF0ZSgpPC90dD4uICBTbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IGFsbCBvZiB0aGUKLWlucHV0IGRhdGEgaGFzIGJlZW4gcHJvY2Vzc2VkIGFuZCB0aGF0IGFsbCBvZiB0aGUgb3V0cHV0IGRhdGEgaGFzIGJlZW4gZ2VuZXJhdGVkIGFuZCBjb25zdW1lZAotYmVmb3JlIHdlIGZhbGwgb3V0IG9mIHRoZSBsb29wIGF0IHRoZSBib3R0b20uCi08cHJlPjxiPgotICAgIC8qIGNvbXByZXNzIHVudGlsIGVuZCBvZiBmaWxlICovCi0gICAgZG8gewotPC9iPjwvcHJlPgotV2Ugc3RhcnQgb2ZmIGJ5IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBpbnB1dCBmaWxlLiAgVGhlIG51bWJlciBvZiBieXRlcyByZWFkIGlzIHB1dCBkaXJlY3RseQotaW50byA8dHQ+YXZhaWxfaW48L3R0PiwgYW5kIGEgcG9pbnRlciB0byB0aG9zZSBieXRlcyBpcyBwdXQgaW50byA8dHQ+bmV4dF9pbjwvdHQ+LiAgV2UgYWxzbwotY2hlY2sgdG8gc2VlIGlmIGVuZC1vZi1maWxlIG9uIHRoZSBpbnB1dCBoYXMgYmVlbiByZWFjaGVkLiAgSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgZmlsZSwgdGhlbiA8dHQ+Zmx1c2g8L3R0PiBpcyBzZXQgdG8gdGhlCi08ZW0+emxpYjwvZW0+IGNvbnN0YW50IDx0dD5aX0ZJTklTSDwvdHQ+LCB3aGljaCBpcyBsYXRlciBwYXNzZWQgdG8gPHR0PmRlZmxhdGUoKTwvdHQ+IHRvCi1pbmRpY2F0ZSB0aGF0IHRoaXMgaXMgdGhlIGxhc3QgY2h1bmsgb2YgaW5wdXQgZGF0YSB0byBjb21wcmVzcy4gIFdlIG5lZWQgdG8gdXNlIDx0dD5mZW9mKCk8L3R0PgotdG8gY2hlY2sgZm9yIGVuZC1vZi1maWxlIGFzIG9wcG9zZWQgdG8gc2VlaW5nIGlmIGZld2VyIHRoYW4gPHR0PkNIVU5LPC90dD4gYnl0ZXMgaGF2ZSBiZWVuIHJlYWQuICBUaGUKLXJlYXNvbiBpcyB0aGF0IGlmIHRoZSBpbnB1dCBmaWxlIGxlbmd0aCBpcyBhbiBleGFjdCBtdWx0aXBsZSBvZiA8dHQ+Q0hVTks8L3R0Piwgd2Ugd2lsbCBtaXNzCi10aGUgZmFjdCB0aGF0IHdlIGdvdCB0byB0aGUgZW5kLW9mLWZpbGUsIGFuZCBub3Qga25vdyB0byB0ZWxsIDx0dD5kZWZsYXRlKCk8L3R0PiB0byBmaW5pc2gKLXVwIHRoZSBjb21wcmVzc2VkIHN0cmVhbS4gIElmIHdlIGFyZSBub3QgeWV0IGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0LCB0aGVuIHRoZSA8ZW0+emxpYjwvZW0+Ci1jb25zdGFudCA8dHQ+Wl9OT19GTFVTSDwvdHQ+IHdpbGwgYmUgcGFzc2VkIHRvIDx0dD5kZWZsYXRlPC90dD4gdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgc3RpbGwKLWluIHRoZSBtaWRkbGUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgotPHA+Ci1JZiB0aGVyZSBpcyBhbiBlcnJvciBpbiByZWFkaW5nIGZyb20gdGhlIGlucHV0IGZpbGUsIHRoZSBwcm9jZXNzIGlzIGFib3J0ZWQgd2l0aAotPHR0PmRlZmxhdGVFbmQoKTwvdHQ+IGJlaW5nIGNhbGxlZCB0byBmcmVlIHRoZSBhbGxvY2F0ZWQgPGVtPnpsaWI8L2VtPiBzdGF0ZSBiZWZvcmUgcmV0dXJuaW5nCi10aGUgZXJyb3IuICBXZSB3b3VsZG4ndCB3YW50IGEgbWVtb3J5IGxlYWssIG5vdyB3b3VsZCB3ZT8gIDx0dD5kZWZsYXRlRW5kKCk8L3R0PiBjYW4gYmUgY2FsbGVkCi1hdCBhbnkgdGltZSBhZnRlciB0aGUgc3RhdGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICBPbmNlIHRoYXQncyBkb25lLCA8dHQ+ZGVmbGF0ZUluaXQoKTwvdHQ+IChvcgotPHR0PmRlZmxhdGVJbml0MigpPC90dD4pIHdvdWxkIGhhdmUgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IGEgbmV3IGNvbXByZXNzaW9uIHByb2Nlc3MuICBUaGVyZSBpcwotbm8gcG9pbnQgaGVyZSBpbiBjaGVja2luZyB0aGUgPHR0PmRlZmxhdGVFbmQoKTwvdHQ+IHJldHVybiBjb2RlLiAgVGhlIGRlYWxsb2NhdGlvbiBjYW4ndCBmYWlsLgotPHByZT48Yj4KLSAgICAgICAgc3RybS5hdmFpbF9pbiA9IGZyZWFkKGluLCAxLCBDSFVOSywgc291cmNlKTsKLSAgICAgICAgaWYgKGZlcnJvcihzb3VyY2UpKSB7Ci0gICAgICAgICAgICAodm9pZClkZWZsYXRlRW5kKCZhbXA7c3RybSk7Ci0gICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKLSAgICAgICAgfQotICAgICAgICBmbHVzaCA9IGZlb2Yoc291cmNlKSA/IFpfRklOSVNIIDogWl9OT19GTFVTSDsKLSAgICAgICAgc3RybS5uZXh0X2luID0gaW47Ci08L2I+PC9wcmU+PCEtLSAtLT4KLVRoZSBpbm5lciA8dHQ+ZG88L3R0Pi1sb29wIHBhc3NlcyBvdXIgY2h1bmsgb2YgaW5wdXQgZGF0YSB0byA8dHQ+ZGVmbGF0ZSgpPC90dD4sIGFuZCB0aGVuCi1rZWVwcyBjYWxsaW5nIDx0dD5kZWZsYXRlKCk8L3R0PiB1bnRpbCBpdCBpcyBkb25lIHByb2R1Y2luZyBvdXRwdXQuICBPbmNlIHRoZXJlIGlzIG5vIG1vcmUKLW5ldyBvdXRwdXQsIDx0dD5kZWZsYXRlKCk8L3R0PiBpcyBndWFyYW50ZWVkIHRvIGhhdmUgY29uc3VtZWQgYWxsIG9mIHRoZSBpbnB1dCwgaS5lLiwKLTx0dD5hdmFpbF9pbjwvdHQ+IHdpbGwgYmUgemVyby4KLTxwcmU+PGI+Ci0gICAgICAgIC8qIHJ1biBkZWZsYXRlKCkgb24gaW5wdXQgdW50aWwgb3V0cHV0IGJ1ZmZlciBub3QgZnVsbCwgZmluaXNoCi0gICAgICAgICAgIGNvbXByZXNzaW9uIGlmIGFsbCBvZiBzb3VyY2UgaGFzIGJlZW4gcmVhZCBpbiAqLwotICAgICAgICBkbyB7Ci08L2I+PC9wcmU+Ci1PdXRwdXQgc3BhY2UgaXMgcHJvdmlkZWQgdG8gPHR0PmRlZmxhdGUoKTwvdHQ+IGJ5IHNldHRpbmcgPHR0PmF2YWlsX291dDwvdHQ+IHRvIHRoZSBudW1iZXIKLW9mIGF2YWlsYWJsZSBvdXRwdXQgYnl0ZXMgYW5kIDx0dD5uZXh0X291dDwvdHQ+IHRvIGEgcG9pbnRlciB0byB0aGF0IHNwYWNlLgotPHByZT48Yj4KLSAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gQ0hVTks7Ci0gICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gb3V0OwotPC9iPjwvcHJlPgotTm93IHdlIGNhbGwgdGhlIGNvbXByZXNzaW9uIGVuZ2luZSBpdHNlbGYsIDx0dD5kZWZsYXRlKCk8L3R0Pi4gIEl0IHRha2VzIGFzIG1hbnkgb2YgdGhlCi08dHQ+YXZhaWxfaW48L3R0PiBieXRlcyBhdCA8dHQ+bmV4dF9pbjwvdHQ+IGFzIGl0IGNhbiBwcm9jZXNzLCBhbmQgd3JpdGVzIGFzIG1hbnkgYXMKLTx0dD5hdmFpbF9vdXQ8L3R0PiBieXRlcyB0byA8dHQ+bmV4dF9vdXQ8L3R0Pi4gIFRob3NlIGNvdW50ZXJzIGFuZCBwb2ludGVycyBhcmUgdGhlbgotdXBkYXRlZCBwYXN0IHRoZSBpbnB1dCBkYXRhIGNvbnN1bWVkIGFuZCB0aGUgb3V0cHV0IGRhdGEgd3JpdHRlbi4gIEl0IGlzIHRoZSBhbW91bnQgb2YKLW91dHB1dCBzcGFjZSBhdmFpbGFibGUgdGhhdCBtYXkgbGltaXQgaG93IG11Y2ggaW5wdXQgaXMgY29uc3VtZWQuCi1IZW5jZSB0aGUgaW5uZXIgbG9vcCB0byBtYWtlIHN1cmUgdGhhdAotYWxsIG9mIHRoZSBpbnB1dCBpcyBjb25zdW1lZCBieSBwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UgZWFjaCB0aW1lLiAgU2luY2UgPHR0PmF2YWlsX2luPC90dD4KLWFuZCA8dHQ+bmV4dF9pbjwvdHQ+IGFyZSB1cGRhdGVkIGJ5IDx0dD5kZWZsYXRlKCk8L3R0Piwgd2UgZG9uJ3QgaGF2ZSB0byBtZXNzIHdpdGggdGhvc2UKLWJldHdlZW4gPHR0PmRlZmxhdGUoKTwvdHQ+IGNhbGxzIHVudGlsIGl0J3MgYWxsIHVzZWQgdXAuCi08cD4KLVRoZSBwYXJhbWV0ZXJzIHRvIDx0dD5kZWZsYXRlKCk8L3R0PiBhcmUgYSBwb2ludGVyIHRvIHRoZSA8dHQ+c3RybTwvdHQ+IHN0cnVjdHVyZSBjb250YWluaW5nCi10aGUgaW5wdXQgYW5kIG91dHB1dCBpbmZvcm1hdGlvbiBhbmQgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIGVuZ2luZSBzdGF0ZSwgYW5kIGEgcGFyYW1ldGVyCi1pbmRpY2F0aW5nIHdoZXRoZXIgYW5kIGhvdyB0byBmbHVzaCBkYXRhIHRvIHRoZSBvdXRwdXQuICBOb3JtYWxseSA8dHQ+ZGVmbGF0ZTwvdHQ+IHdpbGwgY29uc3VtZQotc2V2ZXJhbCBLIGJ5dGVzIG9mIGlucHV0IGRhdGEgYmVmb3JlIHByb2R1Y2luZyBhbnkgb3V0cHV0IChleGNlcHQgZm9yIHRoZSBoZWFkZXIpLCBpbiBvcmRlcgotdG8gYWNjdW11bGF0ZSBzdGF0aXN0aWNzIG9uIHRoZSBkYXRhIGZvciBvcHRpbXVtIGNvbXByZXNzaW9uLiAgSXQgd2lsbCB0aGVuIHB1dCBvdXQgYSBidXJzdCBvZgotY29tcHJlc3NlZCBkYXRhLCBhbmQgcHJvY2VlZCB0byBjb25zdW1lIG1vcmUgaW5wdXQgYmVmb3JlIHRoZSBuZXh0IGJ1cnN0LiAgRXZlbnR1YWxseSwKLTx0dD5kZWZsYXRlKCk8L3R0PgotbXVzdCBiZSB0b2xkIHRvIHRlcm1pbmF0ZSB0aGUgc3RyZWFtLCBjb21wbGV0ZSB0aGUgY29tcHJlc3Npb24gd2l0aCBwcm92aWRlZCBpbnB1dCBkYXRhLCBhbmQKLXdyaXRlIG91dCB0aGUgdHJhaWxlciBjaGVjayB2YWx1ZS4gIDx0dD5kZWZsYXRlKCk8L3R0PiB3aWxsIGNvbnRpbnVlIHRvIGNvbXByZXNzIG5vcm1hbGx5IGFzIGxvbmcKLWFzIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaXMgPHR0PlpfTk9fRkxVU0g8L3R0Pi4gIE9uY2UgdGhlIDx0dD5aX0ZJTklTSDwvdHQ+IHBhcmFtZXRlciBpcyBwcm92aWRlZCwKLTx0dD5kZWZsYXRlKCk8L3R0PiB3aWxsIGJlZ2luIHRvIGNvbXBsZXRlIHRoZSBjb21wcmVzc2VkIG91dHB1dCBzdHJlYW0uICBIb3dldmVyIGRlcGVuZGluZyBvbiBob3cKLW11Y2ggb3V0cHV0IHNwYWNlIGlzIHByb3ZpZGVkLCA8dHQ+ZGVmbGF0ZSgpPC90dD4gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIHNldmVyYWwgdGltZXMgdW50aWwgaXQKLWhhcyBwcm92aWRlZCB0aGUgY29tcGxldGUgY29tcHJlc3NlZCBzdHJlYW0sIGV2ZW4gYWZ0ZXIgaXQgaGFzIGNvbnN1bWVkIGFsbCBvZiB0aGUgaW5wdXQuICBUaGUgZmx1c2gKLXBhcmFtZXRlciBtdXN0IGNvbnRpbnVlIHRvIGJlIDx0dD5aX0ZJTklTSDwvdHQ+IGZvciB0aG9zZSBzdWJzZXF1ZW50IGNhbGxzLgotPHA+Ci1UaGVyZSBhcmUgb3RoZXIgdmFsdWVzIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgdGhhdCBhcmUgdXNlZCBpbiBtb3JlIGFkdmFuY2VkIGFwcGxpY2F0aW9ucy4gIFlvdSBjYW4KLWZvcmNlIDx0dD5kZWZsYXRlKCk8L3R0PiB0byBwcm9kdWNlIGEgYnVyc3Qgb2Ygb3V0cHV0IHRoYXQgZW5jb2RlcyBhbGwgb2YgdGhlIGlucHV0IGRhdGEgcHJvdmlkZWQKLXNvIGZhciwgZXZlbiBpZiBpdCB3b3VsZG4ndCBoYXZlIG90aGVyd2lzZSwgZm9yIGV4YW1wbGUgdG8gY29udHJvbCBkYXRhIGxhdGVuY3kgb24gYSBsaW5rIHdpdGgKLWNvbXByZXNzZWQgZGF0YS4gIFlvdSBjYW4gYWxzbyBhc2sgdGhhdCA8dHQ+ZGVmbGF0ZSgpPC90dD4gZG8gdGhhdCBhcyB3ZWxsIGFzIGVyYXNlIGFueSBoaXN0b3J5IHVwIHRvCi10aGF0IHBvaW50IHNvIHRoYXQgd2hhdCBmb2xsb3dzIGNhbiBiZSBkZWNvbXByZXNzZWQgaW5kZXBlbmRlbnRseSwgZm9yIGV4YW1wbGUgZm9yIHJhbmRvbSBhY2Nlc3MKLWFwcGxpY2F0aW9ucy4gIEJvdGggcmVxdWVzdHMgd2lsbCBkZWdyYWRlIGNvbXByZXNzaW9uIGJ5IGFuIGFtb3VudCBkZXBlbmRpbmcgb24gaG93IG9mdGVuIHN1Y2gKLXJlcXVlc3RzIGFyZSBtYWRlLgotPHA+Ci08dHQ+ZGVmbGF0ZSgpPC90dD4gaGFzIGEgcmV0dXJuIHZhbHVlIHRoYXQgY2FuIGluZGljYXRlIGVycm9ycywgeWV0IHdlIGRvIG5vdCBjaGVjayBpdCBoZXJlLiAgV2h5Ci1ub3Q/ICBXZWxsLCBpdCB0dXJucyBvdXQgdGhhdCA8dHQ+ZGVmbGF0ZSgpPC90dD4gY2FuIGRvIG5vIHdyb25nIGhlcmUuICBMZXQncyBnbyB0aHJvdWdoCi08dHQ+ZGVmbGF0ZSgpPC90dD4ncyByZXR1cm4gdmFsdWVzIGFuZCBkaXNwZW5zZSB3aXRoIHRoZW0gb25lIGJ5IG9uZS4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlCi08dHQ+Wl9PSzwvdHQ+LCA8dHQ+Wl9TVFJFQU1fRU5EPC90dD4sIDx0dD5aX1NUUkVBTV9FUlJPUjwvdHQ+LCBvciA8dHQ+Wl9CVUZfRVJST1I8L3R0Pi4gIDx0dD5aX09LPC90dD4KLWlzLCB3ZWxsLCBvay4gIDx0dD5aX1NUUkVBTV9FTkQ8L3R0PiBpcyBhbHNvIG9rIGFuZCB3aWxsIGJlIHJldHVybmVkIGZvciB0aGUgbGFzdCBjYWxsIG9mCi08dHQ+ZGVmbGF0ZSgpPC90dD4uICBUaGlzIGlzIGFscmVhZHkgZ3VhcmFudGVlZCBieSBjYWxsaW5nIDx0dD5kZWZsYXRlKCk8L3R0PiB3aXRoIDx0dD5aX0ZJTklTSDwvdHQ+Ci11bnRpbCBpdCBoYXMgbm8gbW9yZSBvdXRwdXQuICA8dHQ+Wl9TVFJFQU1fRVJST1I8L3R0PiBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSBzdHJlYW0gaXMgbm90Ci1pbml0aWFsaXplZCBwcm9wZXJseSwgYnV0IHdlIGRpZCBpbml0aWFsaXplIGl0IHByb3Blcmx5LiAgVGhlcmUgaXMgbm8gaGFybSBpbiBjaGVja2luZyBmb3IKLTx0dD5aX1NUUkVBTV9FUlJPUjwvdHQ+IGhlcmUsIGZvciBleGFtcGxlIHRvIGNoZWNrIGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCBzb21lCi1vdGhlciBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiBpbmFkdmVydGVudGx5IGNsb2JiZXJlZCB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlIDxlbT56bGliPC9lbT4gc3RhdGUuCi08dHQ+Wl9CVUZfRVJST1I8L3R0PiB3aWxsIGJlIGV4cGxhaW5lZCBmdXJ0aGVyIGJlbG93LCBidXQKLXN1ZmZpY2UgaXQgdG8gc2F5IHRoYXQgdGhpcyBpcyBzaW1wbHkgYW4gaW5kaWNhdGlvbiB0aGF0IDx0dD5kZWZsYXRlKCk8L3R0PiBjb3VsZCBub3QgY29uc3VtZQotbW9yZSBpbnB1dCBvciBwcm9kdWNlIG1vcmUgb3V0cHV0LiAgPHR0PmRlZmxhdGUoKTwvdHQ+IGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIG91dHB1dCBzcGFjZQotb3IgbW9yZSBhdmFpbGFibGUgaW5wdXQsIHdoaWNoIGl0IHdpbGwgYmUgaW4gdGhpcyBjb2RlLgotPHByZT48Yj4KLSAgICAgICAgICAgIHJldCA9IGRlZmxhdGUoJmFtcDtzdHJtLCBmbHVzaCk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi8KLSAgICAgICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOyAgLyogc3RhdGUgbm90IGNsb2JiZXJlZCAqLwotPC9iPjwvcHJlPgotTm93IHdlIGNvbXB1dGUgaG93IG11Y2ggb3V0cHV0IDx0dD5kZWZsYXRlKCk8L3R0PiBwcm92aWRlZCBvbiB0aGUgbGFzdCBjYWxsLCB3aGljaCBpcyB0aGUKLWRpZmZlcmVuY2UgYmV0d2VlbiBob3cgbXVjaCBzcGFjZSB3YXMgcHJvdmlkZWQgYmVmb3JlIHRoZSBjYWxsLCBhbmQgaG93IG11Y2ggb3V0cHV0IHNwYWNlCi1pcyBzdGlsbCBhdmFpbGFibGUgYWZ0ZXIgdGhlIGNhbGwuICBUaGVuIHRoYXQgZGF0YSwgaWYgYW55LCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZS4KLVdlIGNhbiB0aGVuIHJldXNlIHRoZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgbmV4dCBjYWxsIG9mIDx0dD5kZWZsYXRlKCk8L3R0Pi4gIEFnYWluIGlmIHRoZXJlCi1pcyBhIGZpbGUgaS9vIGVycm9yLCB3ZSBjYWxsIDx0dD5kZWZsYXRlRW5kKCk8L3R0PiBiZWZvcmUgcmV0dXJuaW5nIHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsuCi08cHJlPjxiPgotICAgICAgICAgICAgaGF2ZSA9IENIVU5LIC0gc3RybS5hdmFpbF9vdXQ7Ci0gICAgICAgICAgICBpZiAoZndyaXRlKG91dCwgMSwgaGF2ZSwgZGVzdCkgIT0gaGF2ZSB8fCBmZXJyb3IoZGVzdCkpIHsKLSAgICAgICAgICAgICAgICAodm9pZClkZWZsYXRlRW5kKCZhbXA7c3RybSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87Ci0gICAgICAgICAgICB9Ci08L2I+PC9wcmU+Ci1UaGUgaW5uZXIgPHR0PmRvPC90dD4tbG9vcCBpcyByZXBlYXRlZCB1bnRpbCB0aGUgbGFzdCA8dHQ+ZGVmbGF0ZSgpPC90dD4gY2FsbCBmYWlscyB0byBmaWxsIHRoZQotcHJvdmlkZWQgb3V0cHV0IGJ1ZmZlci4gIFRoZW4gd2Uga25vdyB0aGF0IDx0dD5kZWZsYXRlKCk8L3R0PiBoYXMgZG9uZSBhcyBtdWNoIGFzIGl0IGNhbiB3aXRoCi10aGUgcHJvdmlkZWQgaW5wdXQsIGFuZCB0aGF0IGFsbCBvZiB0aGF0IGlucHV0IGhhcyBiZWVuIGNvbnN1bWVkLiAgV2UgY2FuIHRoZW4gZmFsbCBvdXQgb2YgdGhpcwotbG9vcCBhbmQgcmV1c2UgdGhlIGlucHV0IGJ1ZmZlci4KLTxwPgotVGhlIHdheSB3ZSB0ZWxsIHRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGhhcyBubyBtb3JlIG91dHB1dCBpcyBieSBzZWVpbmcgdGhhdCBpdCBkaWQgbm90IGZpbGwKLXRoZSBvdXRwdXQgYnVmZmVyLCBsZWF2aW5nIDx0dD5hdmFpbF9vdXQ8L3R0PiBncmVhdGVyIHRoYW4gemVyby4gIEhvd2V2ZXIgc3VwcG9zZSB0aGF0Ci08dHQ+ZGVmbGF0ZSgpPC90dD4gaGFzIG5vIG1vcmUgb3V0cHV0LCBidXQganVzdCBzbyBoYXBwZW5lZCB0byBleGFjdGx5IGZpbGwgdGhlIG91dHB1dCBidWZmZXIhCi08dHQ+YXZhaWxfb3V0PC90dD4gaXMgemVybywgYW5kIHdlIGNhbid0IHRlbGwgdGhhdCA8dHQ+ZGVmbGF0ZSgpPC90dD4gaGFzIGRvbmUgYWxsIGl0IGNhbi4KLUFzIGZhciBhcyB3ZSBrbm93LCA8dHQ+ZGVmbGF0ZSgpPC90dD4KLWhhcyBtb3JlIG91dHB1dCBmb3IgdXMuICBTbyB3ZSBjYWxsIGl0IGFnYWluLiAgQnV0IG5vdyA8dHQ+ZGVmbGF0ZSgpPC90dD4gcHJvZHVjZXMgbm8gb3V0cHV0Ci1hdCBhbGwsIGFuZCA8dHQ+YXZhaWxfb3V0PC90dD4gcmVtYWlucyB1bmNoYW5nZWQgYXMgPHR0PkNIVU5LPC90dD4uICBUaGF0IDx0dD5kZWZsYXRlKCk8L3R0PiBjYWxsCi13YXNuJ3QgYWJsZSB0byBkbyBhbnl0aGluZywgZWl0aGVyIGNvbnN1bWUgaW5wdXQgb3IgcHJvZHVjZSBvdXRwdXQsIGFuZCBzbyBpdCByZXR1cm5zCi08dHQ+Wl9CVUZfRVJST1I8L3R0Pi4gIChTZWUsIEkgdG9sZCB5b3UgSSdkIGNvdmVyIHRoaXMgbGF0ZXIuKSAgSG93ZXZlciB0aGlzIGlzIG5vdCBhIHByb2JsZW0gYXQKLWFsbC4gIE5vdyB3ZSBmaW5hbGx5IGhhdmUgdGhlIGRlc2lyZWQgaW5kaWNhdGlvbiB0aGF0IDx0dD5kZWZsYXRlKCk8L3R0PiBpcyByZWFsbHkgZG9uZSwKLWFuZCBzbyB3ZSBkcm9wIG91dCBvZiB0aGUgaW5uZXIgbG9vcCB0byBwcm92aWRlIG1vcmUgaW5wdXQgdG8gPHR0PmRlZmxhdGUoKTwvdHQ+LgotPHA+Ci1XaXRoIDx0dD5mbHVzaDwvdHQ+IHNldCB0byA8dHQ+Wl9GSU5JU0g8L3R0PiwgdGhpcyBmaW5hbCBzZXQgb2YgPHR0PmRlZmxhdGUoKTwvdHQ+IGNhbGxzIHdpbGwKLWNvbXBsZXRlIHRoZSBvdXRwdXQgc3RyZWFtLiAgT25jZSB0aGF0IGlzIGRvbmUsIHN1YnNlcXVlbnQgY2FsbHMgb2YgPHR0PmRlZmxhdGUoKTwvdHQ+IHdvdWxkIHJldHVybgotPHR0PlpfU1RSRUFNX0VSUk9SPC90dD4gaWYgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyBub3QgPHR0PlpfRklOSVNIPC90dD4sIGFuZCBkbyBubyBtb3JlIHByb2Nlc3NpbmcKLXVudGlsIHRoZSBzdGF0ZSBpcyByZWluaXRpYWxpemVkLgotPHA+Ci1Tb21lIGFwcGxpY2F0aW9ucyBvZiA8ZW0+emxpYjwvZW0+IGhhdmUgdHdvIGxvb3BzIHRoYXQgY2FsbCA8dHQ+ZGVmbGF0ZSgpPC90dD4KLWluc3RlYWQgb2YgdGhlIHNpbmdsZSBpbm5lciBsb29wIHdlIGhhdmUgaGVyZS4gIFRoZSBmaXJzdCBsb29wIHdvdWxkIGNhbGwKLXdpdGhvdXQgZmx1c2hpbmcgYW5kIGZlZWQgYWxsIG9mIHRoZSBkYXRhIHRvIDx0dD5kZWZsYXRlKCk8L3R0Pi4gIFRoZSBzZWNvbmQgbG9vcCB3b3VsZCBjYWxsCi08dHQ+ZGVmbGF0ZSgpPC90dD4gd2l0aCBubyBtb3JlCi1kYXRhIGFuZCB0aGUgPHR0PlpfRklOSVNIPC90dD4gcGFyYW1ldGVyIHRvIGNvbXBsZXRlIHRoZSBwcm9jZXNzLiAgQXMgeW91IGNhbiBzZWUgZnJvbSB0aGlzCi1leGFtcGxlLCB0aGF0IGNhbiBiZSBhdm9pZGVkIGJ5IHNpbXBseSBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjdXJyZW50IGZsdXNoIHN0YXRlLgotPHByZT48Yj4KLSAgICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9vdXQgPT0gMCk7Ci0gICAgICAgIGFzc2VydChzdHJtLmF2YWlsX2luID09IDApOyAgICAgLyogYWxsIGlucHV0IHdpbGwgYmUgdXNlZCAqLwotPC9iPjwvcHJlPjwhLS0gLS0+Ci1Ob3cgd2UgY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBwcm9jZXNzZWQgYWxsIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhhdCBpbmZvcm1hdGlvbiB3YXMKLXNhdmVkIGluIHRoZSA8dHQ+Zmx1c2g8L3R0PiB2YXJpYWJsZSwgc28gd2Ugc2VlIGlmIHRoYXQgd2FzIHNldCB0byA8dHQ+Wl9GSU5JU0g8L3R0Pi4gIElmIHNvLAotdGhlbiB3ZSdyZSBkb25lIGFuZCB3ZSBmYWxsIG91dCBvZiB0aGUgb3V0ZXIgbG9vcC4gIFdlJ3JlIGd1YXJhbnRlZWQgdG8gZ2V0IDx0dD5aX1NUUkVBTV9FTkQ8L3R0PgotZnJvbSB0aGUgbGFzdCA8dHQ+ZGVmbGF0ZSgpPC90dD4gY2FsbCwgc2luY2Ugd2UgcmFuIGl0IHVudGlsIHRoZSBsYXN0IGNodW5rIG9mIGlucHV0IHdhcwotY29uc3VtZWQgYW5kIGFsbCBvZiB0aGUgb3V0cHV0IHdhcyBnZW5lcmF0ZWQuCi08cHJlPjxiPgotICAgICAgICAvKiBkb25lIHdoZW4gbGFzdCBkYXRhIGluIGZpbGUgcHJvY2Vzc2VkICovCi0gICAgfSB3aGlsZSAoZmx1c2ggIT0gWl9GSU5JU0gpOwotICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRU5EKTsgICAgICAgIC8qIHN0cmVhbSB3aWxsIGJlIGNvbXBsZXRlICovCi08L2I+PC9wcmU+PCEtLSAtLT4KLVRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBkZWFsbG9jYXRlIHRoZSBzdGF0ZSB0byBhdm9pZCBhIG1lbW9yeSBsZWFrCi0ob3IgcmF0aGVyIG1vcmUgbGlrZSBhIG1lbW9yeSBoZW1vcnJoYWdlIGlmIHlvdSBkaWRuJ3QgZG8gdGhpcykuICBUaGVuCi1maW5hbGx5IHdlIGNhbiByZXR1cm4gd2l0aCBhIGhhcHB5IHJldHVybiB2YWx1ZS4KLTxwcmU+PGI+Ci0gICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLwotICAgICh2b2lkKWRlZmxhdGVFbmQoJmFtcDtzdHJtKTsKLSAgICByZXR1cm4gWl9PSzsKLX0KLTwvYj48L3ByZT48IS0tIC0tPgotTm93IHdlIGRvIHRoZSBzYW1lIHRoaW5nIGZvciBkZWNvbXByZXNzaW9uIGluIHRoZSA8dHQ+aW5mKCk8L3R0PiByb3V0aW5lLiA8dHQ+aW5mKCk8L3R0PgotZGVjb21wcmVzc2VzIHdoYXQgaXMgaG9wZWZ1bGx5IGEgdmFsaWQgPGVtPnpsaWI8L2VtPiBzdHJlYW0gZnJvbSB0aGUgaW5wdXQgZmlsZSBhbmQgd3JpdGVzIHRoZQotdW5jb21wcmVzc2VkIGRhdGEgdG8gdGhlIG91dHB1dCBmaWxlLiAgTXVjaCBvZiB0aGUgZGlzY3Vzc2lvbiBhYm92ZSBmb3IgPHR0PmRlZigpPC90dD4KLWFwcGxpZXMgdG8gPHR0PmluZigpPC90dD4gYXMgd2VsbCwgc28gdGhlIGRpc2N1c3Npb24gaGVyZSB3aWxsIGZvY3VzIG9uIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCi10aGUgdHdvLgotPHByZT48Yj4KLS8qIERlY29tcHJlc3MgZnJvbSBmaWxlIHNvdXJjZSB0byBmaWxlIGRlc3QgdW50aWwgc3RyZWFtIGVuZHMgb3IgRU9GLgotICAgaW5mKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUKLSAgIGFsbG9jYXRlZCBmb3IgcHJvY2Vzc2luZywgWl9EQVRBX0VSUk9SIGlmIHRoZSBkZWZsYXRlIGRhdGEgaXMKLSAgIGludmFsaWQgb3IgaW5jb21wbGV0ZSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHpsaWIuaCBhbmQKLSAgIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGxpbmtlZCBkbyBub3QgbWF0Y2gsIG9yIFpfRVJSTk8gaWYgdGhlcmUKLSAgIGlzIGFuIGVycm9yIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgZmlsZXMuICovCi1pbnQgaW5mKEZJTEUgKnNvdXJjZSwgRklMRSAqZGVzdCkKLXsKLTwvYj48L3ByZT4KLVRoZSBsb2NhbCB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIHRoZXkgZG8gZm9yIDx0dD5kZWYoKTwvdHQ+LiAgVGhlCi1vbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCB0aGVyZSBpcyBubyA8dHQ+Zmx1c2g8L3R0PiB2YXJpYWJsZSwgc2luY2UgPHR0PmluZmxhdGUoKTwvdHQ+Ci1jYW4gdGVsbCBmcm9tIHRoZSA8ZW0+emxpYjwvZW0+IHN0cmVhbSBpdHNlbGYgd2hlbiB0aGUgc3RyZWFtIGlzIGNvbXBsZXRlLgotPHByZT48Yj4KLSAgICBpbnQgcmV0OwotICAgIHVuc2lnbmVkIGhhdmU7Ci0gICAgel9zdHJlYW0gc3RybTsKLSAgICBjaGFyIGluW0NIVU5LXTsKLSAgICBjaGFyIG91dFtDSFVOS107Ci08L2I+PC9wcmU+PCEtLSAtLT4KLVRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgc3RhdGUgaXMgdGhlIHNhbWUsIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIGNvbXByZXNzaW9uIGxldmVsLAotb2YgY291cnNlLCBhbmQgdHdvIG1vcmUgZWxlbWVudHMgb2YgdGhlIHN0cnVjdHVyZSBhcmUgaW5pdGlhbGl6ZWQuICA8dHQ+YXZhaWxfaW48L3R0PgotYW5kIDx0dD5uZXh0X2luPC90dD4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyA8dHQ+aW5mbGF0ZUluaXQoKTwvdHQ+LiAgVGhpcwotaXMgYmVjYXVzZSB0aGUgYXBwbGljYXRpb24gaGFzIHRoZSBvcHRpb24gdG8gcHJvdmlkZSB0aGUgc3RhcnQgb2YgdGhlIHpsaWIgc3RyZWFtIGluCi1vcmRlciBmb3IgPHR0PmluZmxhdGVJbml0KCk8L3R0PiB0byBoYXZlIGFjY2VzcyB0byBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcHJlc3Npb24KLW1ldGhvZCB0byBhaWQgaW4gbWVtb3J5IGFsbG9jYXRpb24uICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiA8ZW0+emxpYjwvZW0+Ci0odXAgdGhyb3VnaCB2ZXJzaW9ucyAxLjIueCksIHRoZSBtZXRob2QtZGVwZW5kZW50IG1lbW9yeSBhbGxvY2F0aW9ucyBhcmUgZGVmZXJyZWQgdG8gdGhlIGZpcnN0IGNhbGwgb2YKLTx0dD5pbmZsYXRlKCk8L3R0PiBhbnl3YXkuICBIb3dldmVyIHRob3NlIGZpZWxkcyBtdXN0IGJlIGluaXRpYWxpemVkIHNpbmNlIGxhdGVyIHZlcnNpb25zCi1vZiA8ZW0+emxpYjwvZW0+IHRoYXQgcHJvdmlkZSBtb3JlIGNvbXByZXNzaW9uIG1ldGhvZHMgbWF5IHRha2UgYWR2YW50YWdlIG9mIHRoaXMgaW50ZXJmYWNlLgotSW4gYW55IGNhc2UsIG5vIGRlY29tcHJlc3Npb24gaXMgcGVyZm9ybWVkIGJ5IDx0dD5pbmZsYXRlSW5pdCgpPC90dD4sIHNvIHRoZQotPHR0PmF2YWlsX291dDwvdHQ+IGFuZCA8dHQ+bmV4dF9vdXQ8L3R0PiBmaWVsZHMgZG8gbm90IG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcuCi08cD4KLUhlcmUgPHR0PmF2YWlsX2luPC90dD4gaXMgc2V0IHRvIHplcm8gYW5kIDx0dD5uZXh0X2luPC90dD4gaXMgc2V0IHRvIDx0dD5aX05VTEw8L3R0PiB0bwotaW5kaWNhdGUgdGhhdCBubyBpbnB1dCBkYXRhIGlzIGJlaW5nIHByb3ZpZGVkLgotPHByZT48Yj4KLSAgICAvKiBhbGxvY2F0ZSBpbmZsYXRlIHN0YXRlICovCi0gICAgc3RybS56YWxsb2MgPSBaX05VTEw7Ci0gICAgc3RybS56ZnJlZSA9IFpfTlVMTDsKLSAgICBzdHJtLm9wYXF1ZSA9IFpfTlVMTDsKLSAgICBzdHJtLmF2YWlsX2luID0gMDsKLSAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7Ci0gICAgcmV0ID0gaW5mbGF0ZUluaXQoJmFtcDtzdHJtKTsKLSAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICAgIHJldHVybiByZXQ7Ci08L2I+PC9wcmU+PCEtLSAtLT4KLVRoZSBvdXRlciA8dHQ+ZG88L3R0Pi1sb29wIGRlY29tcHJlc3NlcyBpbnB1dCB1bnRpbCA8dHQ+aW5mbGF0ZSgpPC90dD4gaW5kaWNhdGVzCi10aGF0IGl0IGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBhbmQgaGFzIHByb2R1Y2VkIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkCi1vdXRwdXQuICBUaGlzIGlzIGluIGNvbnRyYXN0IHRvIDx0dD5kZWYoKTwvdHQ+IHdoaWNoIHByb2Nlc3NlcyBhbGwgb2YgdGhlIGlucHV0IGZpbGUuCi1JZiBlbmQtb2YtZmlsZSBpcyByZWFjaGVkIGJlZm9yZSB0aGUgY29tcHJlc3NlZCBkYXRhIHNlbGYtdGVybWluYXRlcywgdGhlbiB0aGUgY29tcHJlc3NlZAotZGF0YSBpcyBpbmNvbXBsZXRlIGFuZCBhbiBlcnJvciBpcyByZXR1cm5lZC4KLTxwcmU+PGI+Ci0gICAgLyogZGVjb21wcmVzcyB1bnRpbCBkZWZsYXRlIHN0cmVhbSBlbmRzIG9yIGVuZCBvZiBmaWxlICovCi0gICAgZG8gewotPC9iPjwvcHJlPgotV2UgcmVhZCBpbnB1dCBkYXRhIGFuZCBzZXQgdGhlIDx0dD5zdHJtPC90dD4gc3RydWN0dXJlIGFjY29yZGluZ2x5LiAgSWYgd2UndmUgcmVhY2hlZCB0aGUKLWVuZCBvZiB0aGUgaW5wdXQgZmlsZSwgdGhlbiB3ZSBsZWF2ZSB0aGUgb3V0ZXIgbG9vcCBhbmQgcmVwb3J0IGFuIGVycm9yLCBzaW5jZSB0aGUKLWNvbXByZXNzZWQgZGF0YSBpcyBpbmNvbXBsZXRlLiAgTm90ZSB0aGF0IHdlIG1heSByZWFkIG1vcmUgZGF0YSB0aGFuIGlzIGV2ZW50dWFsbHkgY29uc3VtZWQKLWJ5IDx0dD5pbmZsYXRlKCk8L3R0PiwgaWYgdGhlIGlucHV0IGZpbGUgY29udGludWVzIHBhc3QgdGhlIDxlbT56bGliPC9lbT4gc3RyZWFtLgotRm9yIGFwcGxpY2F0aW9ucyB3aGVyZSA8ZW0+emxpYjwvZW0+IHN0cmVhbXMgYXJlIGVtYmVkZGVkIGluIG90aGVyIGRhdGEsIHRoaXMgcm91dGluZSB3b3VsZAotbmVlZCB0byBiZSBtb2RpZmllZCB0byByZXR1cm4gdGhlIHVudXNlZCBkYXRhLCBvciBhdCBsZWFzdCBpbmRpY2F0ZSBob3cgbXVjaCBvZiB0aGUgaW5wdXQKLWRhdGEgd2FzIG5vdCB1c2VkLCBzbyB0aGUgYXBwbGljYXRpb24gd291bGQga25vdyB3aGVyZSB0byBwaWNrIHVwIGFmdGVyIHRoZSA8ZW0+emxpYjwvZW0+IHN0cmVhbS4KLTxwcmU+PGI+Ci0gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBmcmVhZChpbiwgMSwgQ0hVTkssIHNvdXJjZSk7Ci0gICAgICAgIGlmIChmZXJyb3Ioc291cmNlKSkgewotICAgICAgICAgICAgKHZvaWQpaW5mbGF0ZUVuZCgmYW1wO3N0cm0pOwotICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cm0uYXZhaWxfaW4gPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBzdHJtLm5leHRfaW4gPSBpbjsKLTwvYj48L3ByZT48IS0tIC0tPgotVGhlIGlubmVyIDx0dD5kbzwvdHQ+LWxvb3AgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uIGl0IGRpZCBpbiA8dHQ+ZGVmKCk8L3R0Piwgd2hpY2ggaXMgdG8KLWtlZXAgY2FsbGluZyA8dHQ+aW5mbGF0ZSgpPC90dD4gdW50aWwgaGFzIGdlbmVyYXRlZCBhbGwgb2YgdGhlIG91dHB1dCBpdCBjYW4gd2l0aCB0aGUKLXByb3ZpZGVkIGlucHV0LgotPHByZT48Yj4KLSAgICAgICAgLyogcnVuIGluZmxhdGUoKSBvbiBpbnB1dCB1bnRpbCBvdXRwdXQgYnVmZmVyIG5vdCBmdWxsICovCi0gICAgICAgIGRvIHsKLTwvYj48L3ByZT4KLUp1c3QgbGlrZSBpbiA8dHQ+ZGVmKCk8L3R0PiwgdGhlIHNhbWUgb3V0cHV0IHNwYWNlIGlzIHByb3ZpZGVkIGZvciBlYWNoIGNhbGwgb2YgPHR0PmluZmxhdGUoKTwvdHQ+LgotPHByZT48Yj4KLSAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gQ0hVTks7Ci0gICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gb3V0OwotPC9iPjwvcHJlPgotTm93IHdlIHJ1biB0aGUgZGVjb21wcmVzc2lvbiBlbmdpbmUgaXRzZWxmLiAgVGhlcmUgaXMgbm8gbmVlZCB0byBhZGp1c3QgdGhlIGZsdXNoIHBhcmFtZXRlciwgc2luY2UKLXRoZSA8ZW0+emxpYjwvZW0+IGZvcm1hdCBpcyBzZWxmLXRlcm1pbmF0aW5nLiBUaGUgbWFpbiBkaWZmZXJlbmNlIGhlcmUgaXMgdGhhdCB0aGVyZSBhcmUKLXJldHVybiB2YWx1ZXMgdGhhdCB3ZSBuZWVkIHRvIHBheSBhdHRlbnRpb24gdG8uICA8dHQ+Wl9EQVRBX0VSUk9SPC90dD4KLWluZGljYXRlcyB0aGF0IDx0dD5pbmZsYXRlKCk8L3R0PiBkZXRlY3RlZCBhbiBlcnJvciBpbiB0aGUgPGVtPnpsaWI8L2VtPiBjb21wcmVzc2VkIGRhdGEgZm9ybWF0LAotd2hpY2ggbWVhbnMgdGhhdCBlaXRoZXIgdGhlIGRhdGEgaXMgbm90IGEgPGVtPnpsaWI8L2VtPiBzdHJlYW0gdG8gYmVnaW4gd2l0aCwgb3IgdGhhdCB0aGUgZGF0YSB3YXMKLWNvcnJ1cHRlZCBzb21ld2hlcmUgYWxvbmcgdGhlIHdheSBzaW5jZSBpdCB3YXMgY29tcHJlc3NlZC4gIFRoZSBvdGhlciBlcnJvciB0byBiZSBwcm9jZXNzZWQgaXMKLTx0dD5aX01FTV9FUlJPUjwvdHQ+LCB3aGljaCBjYW4gb2NjdXIgc2luY2UgbWVtb3J5IGFsbG9jYXRpb24gaXMgZGVmZXJyZWQgdW50aWwgPHR0PmluZmxhdGUoKTwvdHQ+Ci1uZWVkcyBpdCwgdW5saWtlIDx0dD5kZWZsYXRlKCk8L3R0Piwgd2hvc2UgbWVtb3J5IGlzIGFsbG9jYXRlZCBhdCB0aGUgc3RhcnQgYnkgPHR0PmRlZmxhdGVJbml0KCk8L3R0Pi4KLTxwPgotQWR2YW5jZWQgYXBwbGljYXRpb25zIG1heSB1c2UKLTx0dD5kZWZsYXRlU2V0RGljdGlvbmFyeSgpPC90dD4gdG8gcHJpbWUgPHR0PmRlZmxhdGUoKTwvdHQ+IHdpdGggYSBzZXQgb2YgbGlrZWx5IGRhdGEgdG8gaW1wcm92ZSB0aGUKLWZpcnN0IDMySyBvciBzbyBvZiBjb21wcmVzc2lvbi4gIFRoaXMgaXMgbm90ZWQgaW4gdGhlIDxlbT56bGliPC9lbT4gaGVhZGVyLCBzbyA8dHQ+aW5mbGF0ZSgpPC90dD4KLXJlcXVlc3RzIHRoYXQgdGhhdCBkaWN0aW9uYXJ5IGJlIHByb3ZpZGVkIGJlZm9yZSBpdCBjYW4gc3RhcnQgdG8gZGVjb21wcmVzcy4gIFdpdGhvdXQgdGhlIGRpY3Rpb25hcnksCi1jb3JyZWN0IGRlY29tcHJlc3Npb24gaXMgbm90IHBvc3NpYmxlLiAgRm9yIHRoaXMgcm91dGluZSwgd2UgaGF2ZSBubyBpZGVhIHdoYXQgdGhlIGRpY3Rpb25hcnkgaXMsCi1zbyB0aGUgPHR0PlpfTkVFRF9ESUNUPC90dD4gaW5kaWNhdGlvbiBpcyBjb252ZXJ0ZWQgdG8gYSA8dHQ+Wl9EQVRBX0VSUk9SPC90dD4uCi08cD4KLTx0dD5pbmZsYXRlKCk8L3R0PiBjYW4gYWxzbyByZXR1cm4gPHR0PlpfU1RSRUFNX0VSUk9SPC90dD4sIHdoaWNoIHNob3VsZCBub3QgYmUgcG9zc2libGUgaGVyZSwKLWJ1dCBjb3VsZCBiZSBjaGVja2VkIGZvciBhcyBub3RlZCBhYm92ZSBmb3IgPHR0PmRlZigpPC90dD4uICA8dHQ+Wl9CVUZfRVJST1I8L3R0PiBkb2VzIG5vdCBuZWVkIHRvIGJlCi1jaGVja2VkIGZvciBoZXJlLCBmb3IgdGhlIHNhbWUgcmVhc29ucyBub3RlZCBmb3IgPHR0PmRlZigpPC90dD4uICA8dHQ+Wl9TVFJFQU1fRU5EPC90dD4gd2lsbCBiZQotY2hlY2tlZCBmb3IgbGF0ZXIuCi08cHJlPjxiPgotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZSgmYW1wO3N0cm0sIFpfTk9fRkxVU0gpOwotICAgICAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7ICAvKiBzdGF0ZSBub3QgY2xvYmJlcmVkICovCi0gICAgICAgICAgICBzd2l0Y2ggKHJldCkgewotICAgICAgICAgICAgY2FzZSBaX05FRURfRElDVDoKLSAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7ICAgICAvKiBhbmQgZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgICBjYXNlIFpfREFUQV9FUlJPUjoKLSAgICAgICAgICAgIGNhc2UgWl9NRU1fRVJST1I6Ci0gICAgICAgICAgICAgICAgKHZvaWQpaW5mbGF0ZUVuZCgmYW1wO3N0cm0pOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci08L2I+PC9wcmU+Ci1UaGUgb3V0cHV0IG9mIDx0dD5pbmZsYXRlKCk8L3R0PiBpcyBoYW5kbGVkIGlkZW50aWNhbGx5IHRvIHRoYXQgb2YgPHR0PmRlZmxhdGUoKTwvdHQ+LgotPHByZT48Yj4KLSAgICAgICAgICAgIGhhdmUgPSBDSFVOSyAtIHN0cm0uYXZhaWxfb3V0OwotICAgICAgICAgICAgaWYgKGZ3cml0ZShvdXQsIDEsIGhhdmUsIGRlc3QpICE9IGhhdmUgfHwgZmVycm9yKGRlc3QpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpaW5mbGF0ZUVuZCgmYW1wO3N0cm0pOwotICAgICAgICAgICAgICAgIHJldHVybiBaX0VSUk5POwotICAgICAgICAgICAgfQotPC9iPjwvcHJlPgotVGhlIGlubmVyIDx0dD5kbzwvdHQ+LWxvb3AgZW5kcyB3aGVuIDx0dD5pbmZsYXRlKCk8L3R0PiBoYXMgbm8gbW9yZSBvdXRwdXQgYXMgaW5kaWNhdGVkCi1ieSBub3QgZmlsbGluZyB0aGUgb3V0cHV0IGJ1ZmZlciwganVzdCBhcyBmb3IgPHR0PmRlZmxhdGUoKTwvdHQ+LiAgSW4gdGhpcyBjYXNlLCB3ZSBjYW5ub3QKLWFzc2VydCB0aGF0IDx0dD5zdHJtLmF2YWlsX2luPC90dD4gd2lsbCBiZSB6ZXJvLCBzaW5jZSB0aGUgZGVmbGF0ZSBzdHJlYW0gbWF5IGVuZCBiZWZvcmUgdGhlIGZpbGUKLWRvZXMuCi08cHJlPjxiPgotICAgICAgICB9IHdoaWxlIChzdHJtLmF2YWlsX291dCA9PSAwKTsKLTwvYj48L3ByZT48IS0tIC0tPgotVGhlIG91dGVyIDx0dD5kbzwvdHQ+LWxvb3AgZW5kcyB3aGVuIDx0dD5pbmZsYXRlKCk8L3R0PiByZXBvcnRzIHRoYXQgaXQgaGFzIHJlYWNoZWQgdGhlCi1lbmQgb2YgdGhlIGlucHV0IDxlbT56bGliPC9lbT4gc3RyZWFtLCBoYXMgY29tcGxldGVkIHRoZSBkZWNvbXByZXNzaW9uIGFuZCBpbnRlZ3JpdHkKLWNoZWNrLCBhbmQgaGFzIHByb3ZpZGVkIGFsbCBvZiB0aGUgb3V0cHV0LiAgVGhpcyBpcyBpbmRpY2F0ZWQgYnkgdGhlIDx0dD5pbmZsYXRlKCk8L3R0PgotcmV0dXJuIHZhbHVlIDx0dD5aX1NUUkVBTV9FTkQ8L3R0Pi4gIFRoZSBpbm5lciBsb29wIGlzIGd1YXJhbnRlZWQgdG8gbGVhdmUgPHR0PnJldDwvdHQ+Ci1lcXVhbCB0byA8dHQ+Wl9TVFJFQU1fRU5EPC90dD4gaWYgdGhlIGxhc3QgY2h1bmsgb2YgdGhlIGlucHV0IGZpbGUgcmVhZCBjb250YWluZWQgdGhlIGVuZAotb2YgdGhlIDxlbT56bGliPC9lbT4gc3RyZWFtLiAgU28gaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgPHR0PlpfU1RSRUFNX0VORDwvdHQ+LCB0aGUKLWxvb3AgY29udGludWVzIHRvIHJlYWQgbW9yZSBpbnB1dC4KLTxwcmU+PGI+Ci0gICAgICAgIC8qIGRvbmUgd2hlbiBpbmZsYXRlKCkgc2F5cyBpdCdzIGRvbmUgKi8KLSAgICB9IHdoaWxlIChyZXQgIT0gWl9TVFJFQU1fRU5EKTsKLTwvYj48L3ByZT48IS0tIC0tPgotQXQgdGhpcyBwb2ludCwgZGVjb21wcmVzc2lvbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLCBvciB3ZSBicm9rZSBvdXQgb2YgdGhlIGxvb3AgZHVlIHRvIG5vCi1tb3JlIGRhdGEgYmVpbmcgYXZhaWxhYmxlIGZyb20gdGhlIGlucHV0IGZpbGUuICBJZiB0aGUgbGFzdCA8dHQ+aW5mbGF0ZSgpPC90dD4gcmV0dXJuIHZhbHVlCi1pcyBub3QgPHR0PlpfU1RSRUFNX0VORDwvdHQ+LCB0aGVuIHRoZSA8ZW0+emxpYjwvZW0+IHN0cmVhbSB3YXMgaW5jb21wbGV0ZSBhbmQgYSBkYXRhIGVycm9yCi1pcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgd2UgcmV0dXJuIHdpdGggYSBoYXBweSByZXR1cm4gdmFsdWUuICBPZiBjb3Vyc2UsIDx0dD5pbmZsYXRlRW5kKCk8L3R0PgotaXMgY2FsbGVkIGZpcnN0IHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsuCi08cHJlPjxiPgotICAgIC8qIGNsZWFuIHVwIGFuZCByZXR1cm4gKi8KLSAgICAodm9pZClpbmZsYXRlRW5kKCZhbXA7c3RybSk7Ci0gICAgcmV0dXJuIHJldCA9PSBaX1NUUkVBTV9FTkQgPyBaX09LIDogWl9EQVRBX0VSUk9SOwotfQotPC9iPjwvcHJlPjwhLS0gLS0+Ci1UaGF0IGVuZHMgdGhlIHJvdXRpbmVzIHRoYXQgZGlyZWN0bHkgdXNlIDxlbT56bGliPC9lbT4uICBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIG1ha2UgdGhpcwotYSBjb21tYW5kLWxpbmUgcHJvZ3JhbSBieSBydW5uaW5nIGRhdGEgdGhyb3VnaCB0aGUgYWJvdmUgcm91dGluZXMgZnJvbSA8dHQ+c3RkaW48L3R0PiB0bwotPHR0PnN0ZG91dDwvdHQ+LCBhbmQgaGFuZGxpbmcgYW55IGVycm9ycyByZXBvcnRlZCBieSA8dHQ+ZGVmKCk8L3R0PiBvciA8dHQ+aW5mKCk8L3R0Pi4KLTxwPgotPHR0PnplcnIoKTwvdHQ+IGlzIHVzZWQgdG8gaW50ZXJwcmV0IHRoZSBwb3NzaWJsZSBlcnJvciBjb2RlcyBmcm9tIDx0dD5kZWYoKTwvdHQ+Ci1hbmQgPHR0PmluZigpPC90dD4sIGFzIGRldGFpbGVkIGluIHRoZWlyIGNvbW1lbnRzIGFib3ZlLCBhbmQgcHJpbnQgb3V0IGFuIGVycm9yIG1lc3NhZ2UuCi1Ob3RlIHRoYXQgdGhlc2UgYXJlIG9ubHkgYSBzdWJzZXQgb2YgdGhlIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMgZnJvbSA8dHQ+ZGVmbGF0ZSgpPC90dD4KLWFuZCA8dHQ+aW5mbGF0ZSgpPC90dD4uCi08cHJlPjxiPgotLyogcmVwb3J0IGEgemxpYiBvciBpL28gZXJyb3IgKi8KLXZvaWQgemVycihpbnQgcmV0KQotewotICAgIGZwdXRzKCJ6cGlwZTogIiwgc3RkZXJyKTsKLSAgICBzd2l0Y2ggKHJldCkgewotICAgIGNhc2UgWl9FUlJOTzoKLSAgICAgICAgaWYgKGZlcnJvcihzdGRpbikpCi0gICAgICAgICAgICBmcHV0cygiZXJyb3IgcmVhZGluZyBzdGRpblxuIiwgc3RkZXJyKTsKLSAgICAgICAgaWYgKGZlcnJvcihzdGRvdXQpKQotICAgICAgICAgICAgZnB1dHMoImVycm9yIHdyaXRpbmcgc3Rkb3V0XG4iLCBzdGRlcnIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpfU1RSRUFNX0VSUk9SOgotICAgICAgICBmcHV0cygiaW52YWxpZCBjb21wcmVzc2lvbiBsZXZlbFxuIiwgc3RkZXJyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBaX0RBVEFfRVJST1I6Ci0gICAgICAgIGZwdXRzKCJpbnZhbGlkIG9yIGluY29tcGxldGUgZGVmbGF0ZSBkYXRhXG4iLCBzdGRlcnIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpfTUVNX0VSUk9SOgotICAgICAgICBmcHV0cygib3V0IG9mIG1lbW9yeVxuIiwgc3RkZXJyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBaX1ZFUlNJT05fRVJST1I6Ci0gICAgICAgIGZwdXRzKCJ6bGliIHZlcnNpb24gbWlzbWF0Y2ghXG4iLCBzdGRlcnIpOwotICAgIH0KLX0KLTwvYj48L3ByZT48IS0tIC0tPgotSGVyZSBpcyB0aGUgPHR0Pm1haW4oKTwvdHQ+IHJvdXRpbmUgdXNlZCB0byB0ZXN0IDx0dD5kZWYoKTwvdHQ+IGFuZCA8dHQ+aW5mKCk8L3R0Pi4gIFRoZQotPHR0PnpwaXBlPC90dD4gY29tbWFuZCBpcyBzaW1wbHkgYSBjb21wcmVzc2lvbiBwaXBlIGZyb20gPHR0PnN0ZGluPC90dD4gdG8gPHR0PnN0ZG91dDwvdHQ+LCBpZgotbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgb3IgaXQgaXMgYSBkZWNvbXByZXNzaW9uIHBpcGUgaWYgPHR0PnpwaXBlIC1kPC90dD4gaXMgdXNlZC4gIElmIGFueSBvdGhlcgotYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgbm8gY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBpcyBwZXJmb3JtZWQuICBJbnN0ZWFkIGEgdXNhZ2UKLW1lc3NhZ2UgaXMgZGlzcGxheWVkLiAgRXhhbXBsZXMgYXJlIDx0dD56cGlwZSA8IGZvby50eHQgPiBmb28udHh0Lno8L3R0PiB0byBjb21wcmVzcywgYW5kCi08dHQ+enBpcGUgLWQgPCBmb28udHh0LnogPiBmb28udHh0PC90dD4gdG8gZGVjb21wcmVzcy4KLTxwcmU+PGI+Ci0vKiBjb21wcmVzcyBvciBkZWNvbXByZXNzIGZyb20gc3RkaW4gdG8gc3Rkb3V0ICovCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IHJldDsKLQotICAgIC8qIGRvIGNvbXByZXNzaW9uIGlmIG5vIGFyZ3VtZW50cyAqLwotICAgIGlmIChhcmdjID09IDEpIHsKLSAgICAgICAgcmV0ID0gZGVmKHN0ZGluLCBzdGRvdXQsIFpfREVGQVVMVF9DT01QUkVTU0lPTik7Ci0gICAgICAgIGlmIChyZXQgIT0gWl9PSykKLSAgICAgICAgICAgIHplcnIocmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKiBkbyBkZWNvbXByZXNzaW9uIGlmIC1kIHNwZWNpZmllZCAqLwotICAgIGVsc2UgaWYgKGFyZ2MgPT0gMiAmYW1wOyZhbXA7IHN0cmNtcChhcmd2WzFdLCAiLWQiKSA9PSAwKSB7Ci0gICAgICAgIHJldCA9IGluZihzdGRpbiwgc3Rkb3V0KTsKLSAgICAgICAgaWYgKHJldCAhPSBaX09LKQotICAgICAgICAgICAgemVycihyZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8qIG90aGVyd2lzZSwgcmVwb3J0IHVzYWdlICovCi0gICAgZWxzZSB7Ci0gICAgICAgIGZwdXRzKCJ6cGlwZSB1c2FnZTogenBpcGUgWy1kXSAmbHQ7IHNvdXJjZSAmZ3Q7IGRlc3RcbiIsIHN0ZGVycik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLX0KLTwvYj48L3ByZT4KLTxocj4KLTxpPkNvcHlyaWdodCAoYykgMjAwNCBieSBNYXJrIEFkbGVyPGJyPkxhc3QgbW9kaWZpZWQgMTMgTm92ZW1iZXIgMjAwNDwvaT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9leGFtcGxlcy96cGlwZS5jIGIvbGlicy96bGliL2V4YW1wbGVzL3pwaXBlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YWJiNTYuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2V4YW1wbGVzL3pwaXBlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyogenBpcGUuYzogZXhhbXBsZSBvZiBwcm9wZXIgdXNlIG9mIHpsaWIncyBpbmZsYXRlKCkgYW5kIGRlZmxhdGUoKQotICAgTm90IGNvcHlyaWdodGVkIC0tIHByb3ZpZGVkIHRvIHRoZSBwdWJsaWMgZG9tYWluCi0gICBWZXJzaW9uIDEuMiAgOSBOb3ZlbWJlciAyMDA0ICBNYXJrIEFkbGVyICovCi0KLS8qIFZlcnNpb24gaGlzdG9yeToKLSAgIDEuMCAgMzAgT2N0IDIwMDQgIEZpcnN0IHZlcnNpb24KLSAgIDEuMSAgIDggTm92IDIwMDQgIEFkZCB2b2lkIGNhc3RpbmcgZm9yIHVudXNlZCByZXR1cm4gdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICBVc2Ugc3dpdGNoIHN0YXRlbWVudCBmb3IgaW5mbGF0ZSgpIHJldHVybiB2YWx1ZXMKLSAgIDEuMiAgIDkgTm92IDIwMDQgIEFkZCBhc3NlcnRpb25zIHRvIGRvY3VtZW50IHpsaWIgZ3VhcmFudGVlcwotICAgMS4zICAgNiBBcHIgMjAwNSAgUmVtb3ZlIGluY29ycmVjdCBhc3NlcnRpb24gaW4gaW5mKCkKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlICJ6bGliLmgiCi0KLSNkZWZpbmUgQ0hVTksgMTYzODQKLQotLyogQ29tcHJlc3MgZnJvbSBmaWxlIHNvdXJjZSB0byBmaWxlIGRlc3QgdW50aWwgRU9GIG9uIHNvdXJjZS4KLSAgIGRlZigpIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiBtZW1vcnkgY291bGQgbm90IGJlCi0gICBhbGxvY2F0ZWQgZm9yIHByb2Nlc3NpbmcsIFpfU1RSRUFNX0VSUk9SIGlmIGFuIGludmFsaWQgY29tcHJlc3Npb24KLSAgIGxldmVsIGlzIHN1cHBsaWVkLCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgemxpYi5oIGFuZCB0aGUKLSAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbGlua2VkIGRvIG5vdCBtYXRjaCwgb3IgWl9FUlJOTyBpZiB0aGVyZSBpcwotICAgYW4gZXJyb3IgcmVhZGluZyBvciB3cml0aW5nIHRoZSBmaWxlcy4gKi8KLWludCBkZWYoRklMRSAqc291cmNlLCBGSUxFICpkZXN0LCBpbnQgbGV2ZWwpCi17Ci0gICAgaW50IHJldCwgZmx1c2g7Ci0gICAgdW5zaWduZWQgaGF2ZTsKLSAgICB6X3N0cmVhbSBzdHJtOwotICAgIGNoYXIgaW5bQ0hVTktdOwotICAgIGNoYXIgb3V0W0NIVU5LXTsKLQotICAgIC8qIGFsbG9jYXRlIGRlZmxhdGUgc3RhdGUgKi8KLSAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKLSAgICBzdHJtLnpmcmVlID0gWl9OVUxMOwotICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOwotICAgIHJldCA9IGRlZmxhdGVJbml0KCZzdHJtLCBsZXZlbCk7Ci0gICAgaWYgKHJldCAhPSBaX09LKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgLyogY29tcHJlc3MgdW50aWwgZW5kIG9mIGZpbGUgKi8KLSAgICBkbyB7Ci0gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBmcmVhZChpbiwgMSwgQ0hVTkssIHNvdXJjZSk7Ci0gICAgICAgIGlmIChmZXJyb3Ioc291cmNlKSkgewotICAgICAgICAgICAgKHZvaWQpZGVmbGF0ZUVuZCgmc3RybSk7Ci0gICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKLSAgICAgICAgfQotICAgICAgICBmbHVzaCA9IGZlb2Yoc291cmNlKSA/IFpfRklOSVNIIDogWl9OT19GTFVTSDsKLSAgICAgICAgc3RybS5uZXh0X2luID0gaW47Ci0KLSAgICAgICAgLyogcnVuIGRlZmxhdGUoKSBvbiBpbnB1dCB1bnRpbCBvdXRwdXQgYnVmZmVyIG5vdCBmdWxsLCBmaW5pc2gKLSAgICAgICAgICAgY29tcHJlc3Npb24gaWYgYWxsIG9mIHNvdXJjZSBoYXMgYmVlbiByZWFkIGluICovCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gQ0hVTks7Ci0gICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gb3V0OwotICAgICAgICAgICAgcmV0ID0gZGVmbGF0ZSgmc3RybSwgZmx1c2gpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovCi0gICAgICAgICAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsgIC8qIHN0YXRlIG5vdCBjbG9iYmVyZWQgKi8KLSAgICAgICAgICAgIGhhdmUgPSBDSFVOSyAtIHN0cm0uYXZhaWxfb3V0OwotICAgICAgICAgICAgaWYgKGZ3cml0ZShvdXQsIDEsIGhhdmUsIGRlc3QpICE9IGhhdmUgfHwgZmVycm9yKGRlc3QpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpZGVmbGF0ZUVuZCgmc3RybSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfb3V0ID09IDApOwotICAgICAgICBhc3NlcnQoc3RybS5hdmFpbF9pbiA9PSAwKTsgICAgIC8qIGFsbCBpbnB1dCB3aWxsIGJlIHVzZWQgKi8KLQotICAgICAgICAvKiBkb25lIHdoZW4gbGFzdCBkYXRhIGluIGZpbGUgcHJvY2Vzc2VkICovCi0gICAgfSB3aGlsZSAoZmx1c2ggIT0gWl9GSU5JU0gpOwotICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRU5EKTsgICAgICAgIC8qIHN0cmVhbSB3aWxsIGJlIGNvbXBsZXRlICovCi0KLSAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCi0gICAgKHZvaWQpZGVmbGF0ZUVuZCgmc3RybSk7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qIERlY29tcHJlc3MgZnJvbSBmaWxlIHNvdXJjZSB0byBmaWxlIGRlc3QgdW50aWwgc3RyZWFtIGVuZHMgb3IgRU9GLgotICAgaW5mKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUKLSAgIGFsbG9jYXRlZCBmb3IgcHJvY2Vzc2luZywgWl9EQVRBX0VSUk9SIGlmIHRoZSBkZWZsYXRlIGRhdGEgaXMKLSAgIGludmFsaWQgb3IgaW5jb21wbGV0ZSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHpsaWIuaCBhbmQKLSAgIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGxpbmtlZCBkbyBub3QgbWF0Y2gsIG9yIFpfRVJSTk8gaWYgdGhlcmUKLSAgIGlzIGFuIGVycm9yIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgZmlsZXMuICovCi1pbnQgaW5mKEZJTEUgKnNvdXJjZSwgRklMRSAqZGVzdCkKLXsKLSAgICBpbnQgcmV0OwotICAgIHVuc2lnbmVkIGhhdmU7Ci0gICAgel9zdHJlYW0gc3RybTsKLSAgICBjaGFyIGluW0NIVU5LXTsKLSAgICBjaGFyIG91dFtDSFVOS107Ci0KLSAgICAvKiBhbGxvY2F0ZSBpbmZsYXRlIHN0YXRlICovCi0gICAgc3RybS56YWxsb2MgPSBaX05VTEw7Ci0gICAgc3RybS56ZnJlZSA9IFpfTlVMTDsKLSAgICBzdHJtLm9wYXF1ZSA9IFpfTlVMTDsKLSAgICBzdHJtLmF2YWlsX2luID0gMDsKLSAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7Ci0gICAgcmV0ID0gaW5mbGF0ZUluaXQoJnN0cm0pOwotICAgIGlmIChyZXQgIT0gWl9PSykKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIC8qIGRlY29tcHJlc3MgdW50aWwgZGVmbGF0ZSBzdHJlYW0gZW5kcyBvciBlbmQgb2YgZmlsZSAqLwotICAgIGRvIHsKLSAgICAgICAgc3RybS5hdmFpbF9pbiA9IGZyZWFkKGluLCAxLCBDSFVOSywgc291cmNlKTsKLSAgICAgICAgaWYgKGZlcnJvcihzb3VyY2UpKSB7Ci0gICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKLSAgICAgICAgICAgIHJldHVybiBaX0VSUk5POwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJtLmF2YWlsX2luID09IDApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RybS5uZXh0X2luID0gaW47Ci0KLSAgICAgICAgLyogcnVuIGluZmxhdGUoKSBvbiBpbnB1dCB1bnRpbCBvdXRwdXQgYnVmZmVyIG5vdCBmdWxsICovCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gQ0hVTks7Ci0gICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gb3V0OwotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZSgmc3RybSwgWl9OT19GTFVTSCk7Ci0gICAgICAgICAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsgIC8qIHN0YXRlIG5vdCBjbG9iYmVyZWQgKi8KLSAgICAgICAgICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgICAgICAgICBjYXNlIFpfTkVFRF9ESUNUOgotICAgICAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsgICAgIC8qIGFuZCBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgotICAgICAgICAgICAgY2FzZSBaX01FTV9FUlJPUjoKLSAgICAgICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGF2ZSA9IENIVU5LIC0gc3RybS5hdmFpbF9vdXQ7Ci0gICAgICAgICAgICBpZiAoZndyaXRlKG91dCwgMSwgaGF2ZSwgZGVzdCkgIT0gaGF2ZSB8fCBmZXJyb3IoZGVzdCkpIHsKLSAgICAgICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9vdXQgPT0gMCk7Ci0KLSAgICAgICAgLyogZG9uZSB3aGVuIGluZmxhdGUoKSBzYXlzIGl0J3MgZG9uZSAqLwotICAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQpOwotCi0gICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLwotICAgICh2b2lkKWluZmxhdGVFbmQoJnN0cm0pOwotICAgIHJldHVybiByZXQgPT0gWl9TVFJFQU1fRU5EID8gWl9PSyA6IFpfREFUQV9FUlJPUjsKLX0KLQotLyogcmVwb3J0IGEgemxpYiBvciBpL28gZXJyb3IgKi8KLXZvaWQgemVycihpbnQgcmV0KQotewotICAgIGZwdXRzKCJ6cGlwZTogIiwgc3RkZXJyKTsKLSAgICBzd2l0Y2ggKHJldCkgewotICAgIGNhc2UgWl9FUlJOTzoKLSAgICAgICAgaWYgKGZlcnJvcihzdGRpbikpCi0gICAgICAgICAgICBmcHV0cygiZXJyb3IgcmVhZGluZyBzdGRpblxuIiwgc3RkZXJyKTsKLSAgICAgICAgaWYgKGZlcnJvcihzdGRvdXQpKQotICAgICAgICAgICAgZnB1dHMoImVycm9yIHdyaXRpbmcgc3Rkb3V0XG4iLCBzdGRlcnIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpfU1RSRUFNX0VSUk9SOgotICAgICAgICBmcHV0cygiaW52YWxpZCBjb21wcmVzc2lvbiBsZXZlbFxuIiwgc3RkZXJyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBaX0RBVEFfRVJST1I6Ci0gICAgICAgIGZwdXRzKCJpbnZhbGlkIG9yIGluY29tcGxldGUgZGVmbGF0ZSBkYXRhXG4iLCBzdGRlcnIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFpfTUVNX0VSUk9SOgotICAgICAgICBmcHV0cygib3V0IG9mIG1lbW9yeVxuIiwgc3RkZXJyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBaX1ZFUlNJT05fRVJST1I6Ci0gICAgICAgIGZwdXRzKCJ6bGliIHZlcnNpb24gbWlzbWF0Y2ghXG4iLCBzdGRlcnIpOwotICAgIH0KLX0KLQotLyogY29tcHJlc3Mgb3IgZGVjb21wcmVzcyBmcm9tIHN0ZGluIHRvIHN0ZG91dCAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCByZXQ7Ci0KLSAgICAvKiBkbyBjb21wcmVzc2lvbiBpZiBubyBhcmd1bWVudHMgKi8KLSAgICBpZiAoYXJnYyA9PSAxKSB7Ci0gICAgICAgIHJldCA9IGRlZihzdGRpbiwgc3Rkb3V0LCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOwotICAgICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICAgICAgICB6ZXJyKHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyogZG8gZGVjb21wcmVzc2lvbiBpZiAtZCBzcGVjaWZpZWQgKi8KLSAgICBlbHNlIGlmIChhcmdjID09IDIgJiYgc3RyY21wKGFyZ3ZbMV0sICItZCIpID09IDApIHsKLSAgICAgICAgcmV0ID0gaW5mKHN0ZGluLCBzdGRvdXQpOwotICAgICAgICBpZiAocmV0ICE9IFpfT0spCi0gICAgICAgICAgICB6ZXJyKHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyogb3RoZXJ3aXNlLCByZXBvcnQgdXNhZ2UgKi8KLSAgICBlbHNlIHsKLSAgICAgICAgZnB1dHMoInpwaXBlIHVzYWdlOiB6cGlwZSBbLWRdIDwgc291cmNlID4gZGVzdFxuIiwgc3RkZXJyKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2V4YW1wbGVzL3pyYW4uYyBiL2xpYnMvemxpYi9leGFtcGxlcy96cmFuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzcxN2UuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2V4YW1wbGVzL3pyYW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKiB6cmFuLmMgLS0gZXhhbXBsZSBvZiB6bGliL2d6aXAgc3RyZWFtIGluZGV4aW5nIGFuZCByYW5kb20gYWNjZXNzCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICAgVmVyc2lvbiAxLjAgIDI5IE1heSAyMDA1ICBNYXJrIEFkbGVyICovCi0KLS8qIElsbHVzdHJhdGUgdGhlIHVzZSBvZiBaX0JMT0NLLCBpbmZsYXRlUHJpbWUoKSwgYW5kIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkKLSAgIGZvciByYW5kb20gYWNjZXNzIG9mIGEgY29tcHJlc3NlZCBmaWxlLiAgQSBmaWxlIGNvbnRhaW5pbmcgYSB6bGliIG9yIGd6aXAKLSAgIHN0cmVhbSBpcyBwcm92aWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVGhlIGNvbXByZXNzZWQgc3RyZWFtIGlzIGRlY29kZWQgaW4KLSAgIGl0cyBlbnRpcmV0eSwgYW5kIGFuIGluZGV4IGJ1aWx0IHdpdGggYWNjZXNzIHBvaW50cyBhYm91dCBldmVyeSBTUEFOIGJ5dGVzCi0gICBpbiB0aGUgdW5jb21wcmVzc2VkIG91dHB1dC4gIFRoZSBjb21wcmVzc2VkIGZpbGUgaXMgbGVmdCBvcGVuLCBhbmQgY2FuIHRoZW4KLSAgIGJlIHJlYWQgcmFuZG9tbHksIGhhdmluZyB0byBkZWNvbXByZXNzIG9uIHRoZSBhdmVyYWdlIFNQQU4vMiB1bmNvbXByZXNzZWQKLSAgIGJ5dGVzIGJlZm9yZSBnZXR0aW5nIHRvIHRoZSBkZXNpcmVkIGJsb2NrIG9mIGRhdGEuCi0KLSAgIEFuIGFjY2VzcyBwb2ludCBjYW4gYmUgY3JlYXRlZCBhdCB0aGUgc3RhcnQgb2YgYW55IGRlZmxhdGUgYmxvY2ssIGJ5IHNhdmluZwotICAgdGhlIHN0YXJ0aW5nIGZpbGUgb2Zmc2V0IGFuZCBiaXQgb2YgdGhhdCBibG9jaywgYW5kIHRoZSAzMksgYnl0ZXMgb2YKLSAgIHVuY29tcHJlc3NlZCBkYXRhIHRoYXQgcHJlY2VkZSB0aGF0IGJsb2NrLiAgQWxzbyB0aGUgdW5jb21wcmVzc2VkIG9mZnNldCBvZgotICAgdGhhdCBibG9jayBpcyBzYXZlZCB0byBwcm92aWRlIGEgcmVmZXJlY2UgZm9yIGxvY2F0aW5nIGEgZGVzaXJlZCBzdGFydGluZwotICAgcG9pbnQgaW4gdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0uICBidWlsZF9pbmRleCgpIHdvcmtzIGJ5IGRlY29tcHJlc3NpbmcgdGhlCi0gICBpbnB1dCB6bGliIG9yIGd6aXAgc3RyZWFtIGEgYmxvY2sgYXQgYSB0aW1lLCBhbmQgYXQgdGhlIGVuZCBvZiBlYWNoIGJsb2NrCi0gICBkZWNpZGluZyBpZiBlbm91Z2ggdW5jb21wcmVzc2VkIGRhdGEgaGFzIGdvbmUgYnkgdG8ganVzdGlmeSB0aGUgY3JlYXRpb24gb2YKLSAgIGEgbmV3IGFjY2VzcyBwb2ludC4gIElmIHNvLCB0aGF0IHBvaW50IGlzIHNhdmVkIGluIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdAotICAgZ3Jvd3MgYXMgbmVlZGVkIHRvIGFjY29tbW9kYXRlIHRoZSBwb2ludHMuCi0KLSAgIFRvIHVzZSB0aGUgaW5kZXgsIGFuIG9mZnNldCBpbiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgaXMgcHJvdmlkZWQsIGZvciB3aGljaAotICAgdGhlIGxhdGVzdCBhY2NlZXMgcG9pbnQgYXQgb3IgcHJlY2VkaW5nIHRoYXQgb2Zmc2V0IGlzIGxvY2F0ZWQgaW4gdGhlIGluZGV4LgotICAgVGhlIGlucHV0IGZpbGUgaXMgcG9zaXRpb25lZCB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIHRoZSBpbmRleCwgYW5kIGlmCi0gICBuZWNlc3NhcnkgdGhlIGZpcnN0IGZldyBiaXRzIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSBmaWxlLgotICAgaW5mbGF0ZSBpcyBpbml0aWFsaXplZCB3aXRoIHRob3NlIGJpdHMgYW5kIHRoZSAzMksgb2YgdW5jb21wcmVzc2VkIGRhdGEsIGFuZAotICAgdGhlIGRlY29tcHJlc3Npb24gdGhlbiBwcm9jZWVkcyB1bnRpbCB0aGUgZGVzaXJlZCBvZmZzZXQgaW4gdGhlIGZpbGUgaXMKLSAgIHJlYWNoZWQuICBUaGVuIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRpbnVlcyB0byByZWFkIHRoZSBkZXNpcmVkIHVuY29tcHJlc3NlZAotICAgZGF0YSBmcm9tIHRoZSBmaWxlLgotCi0gICBBbm90aGVyIGFwcHJvYWNoIHdvdWxkIGJlIHRvIGdlbmVyYXRlIHRoZSBpbmRleCBvbiBkZW1hbmQuICBJbiB0aGF0IGNhc2UsCi0gICByZXF1ZXN0cyBmb3IgcmFuZG9tIGFjY2VzcyByZWFkcyBmcm9tIHRoZSBjb21wcmVzc2VkIGRhdGEgd291bGQgdHJ5IHRvIHVzZQotICAgdGhlIGluZGV4LCBidXQgaWYgYSByZWFkIGZhciBlbm91Z2ggcGFzdCB0aGUgZW5kIG9mIHRoZSBpbmRleCBpcyByZXF1aXJlZCwKLSAgIHRoZW4gZnVydGhlciBpbmRleCBlbnRyaWVzIHdvdWxkIGJlIGdlbmVyYXRlZCBhbmQgYWRkZWQuCi0KLSAgIFRoZXJlIGlzIHNvbWUgZmFpciBiaXQgb2Ygb3ZlcmhlYWQgdG8gc3RhcnRpbmcgaW5mbGF0aW9uIGZvciB0aGUgcmFuZG9tCi0gICBhY2Nlc3MsIG1haW5seSBjb3B5aW5nIHRoZSAzMksgYnl0ZSBkaWN0aW9uYXJ5LiAgU28gaWYgc21hbGwgcGllY2VzIG9mIHRoZQotICAgZmlsZSBhcmUgYmVpbmcgYWNjZXNzZWQsIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8gaW1wbGVtZW50IGEgY2FjaGUgdG8gaG9sZAotICAgc29tZSBsb29rYWhlYWQgYW5kIGF2b2lkIG1hbnkgY2FsbHMgdG8gZXh0cmFjdCgpIGZvciBzbWFsbCBsZW5ndGhzLgotCi0gICBBbm90aGVyIHdheSB0byBidWlsZCBhbiBpbmRleCB3b3VsZCBiZSB0byB1c2UgaW5mbGF0ZUNvcHkoKS4gIFRoYXQgd291bGQKLSAgIG5vdCBiZSBjb25zdHJhaW5lZCB0byBoYXZlIGFjY2VzcyBwb2ludHMgYXQgYmxvY2sgYm91bmRhcmllcywgYnV0IHJlcXVpcmVzCi0gICBtb3JlIG1lbW9yeSBwZXIgYWNjZXNzIHBvaW50LCBhbmQgYWxzbyBjYW5ub3QgYmUgc2F2ZWQgdG8gZmlsZSBkdWUgdG8gdGhlCi0gICB1c2Ugb2YgcG9pbnRlcnMgaW4gdGhlIHN0YXRlLiAgVGhlIGFwcHJvYWNoIGhlcmUgYWxsb3dzIGZvciBzdG9yYWdlIG9mIHRoZQotICAgaW5kZXggaW4gYSBmaWxlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInpsaWIuaCIKLQotI2RlZmluZSBsb2NhbCBzdGF0aWMKLQotI2RlZmluZSBTUEFOIDEwNDg1NzZMICAgICAgIC8qIGRlc2lyZWQgZGlzdGFuY2UgYmV0d2VlbiBhY2Nlc3MgcG9pbnRzICovCi0jZGVmaW5lIFdJTlNJWkUgMzI3NjhVICAgICAgLyogc2xpZGluZyB3aW5kb3cgc2l6ZSAqLwotI2RlZmluZSBDSFVOSyAxNjM4NCAgICAgICAgIC8qIGZpbGUgaW5wdXQgYnVmZmVyIHNpemUgKi8KLQotLyogYWNjZXNzIHBvaW50IGVudHJ5ICovCi1zdHJ1Y3QgcG9pbnQgewotICAgIG9mZl90IG91dDsgICAgICAgICAgLyogY29ycmVzcG9uZGluZyBvZmZzZXQgaW4gdW5jb21wcmVzc2VkIGRhdGEgKi8KLSAgICBvZmZfdCBpbjsgICAgICAgICAgIC8qIG9mZnNldCBpbiBpbnB1dCBmaWxlIG9mIGZpcnN0IGZ1bGwgYnl0ZSAqLwotICAgIGludCBiaXRzOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgKDEtNykgZnJvbSBieXRlIGF0IGluIC0gMSwgb3IgMCAqLwotICAgIHVuc2lnbmVkIGNoYXIgd2luZG93W1dJTlNJWkVdOyAgLyogcHJlY2VkaW5nIDMySyBvZiB1bmNvbXByZXNzZWQgZGF0YSAqLwotfTsKLQotLyogYWNjZXNzIHBvaW50IGxpc3QgKi8KLXN0cnVjdCBhY2Nlc3MgewotICAgIGludCBoYXZlOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGxpc3QgZW50cmllcyBmaWxsZWQgaW4gKi8KLSAgICBpbnQgc2l6ZTsgICAgICAgICAgIC8qIG51bWJlciBvZiBsaXN0IGVudHJpZXMgYWxsb2NhdGVkICovCi0gICAgc3RydWN0IHBvaW50ICpsaXN0OyAvKiBhbGxvY2F0ZWQgbGlzdCAqLwotfTsKLQotLyogRGVhbGxvY2F0ZSBhbiBpbmRleCBidWlsdCBieSBidWlsZF9pbmRleCgpICovCi1sb2NhbCB2b2lkIGZyZWVfaW5kZXgoc3RydWN0IGFjY2VzcyAqaW5kZXgpCi17Ci0gICAgaWYgKGluZGV4ICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShpbmRleC0+bGlzdCk7Ci0gICAgICAgIGZyZWUoaW5kZXgpOwotICAgIH0KLX0KLQotLyogQWRkIGFuIGVudHJ5IHRvIHRoZSBhY2Nlc3MgcG9pbnQgbGlzdC4gIElmIG91dCBvZiBtZW1vcnksIGRlYWxsb2NhdGUgdGhlCi0gICBleGlzdGluZyBsaXN0IGFuZCByZXR1cm4gTlVMTC4gKi8KLWxvY2FsIHN0cnVjdCBhY2Nlc3MgKmFkZHBvaW50KHN0cnVjdCBhY2Nlc3MgKmluZGV4LCBpbnQgYml0cywKLSAgICBvZmZfdCBpbiwgb2ZmX3Qgb3V0LCB1bnNpZ25lZCBsZWZ0LCB1bnNpZ25lZCBjaGFyICp3aW5kb3cpCi17Ci0gICAgc3RydWN0IHBvaW50ICpuZXh0OwotCi0gICAgLyogaWYgbGlzdCBpcyBlbXB0eSwgY3JlYXRlIGl0IChzdGFydCB3aXRoIGVpZ2h0IHBvaW50cykgKi8KLSAgICBpZiAoaW5kZXggPT0gTlVMTCkgewotICAgICAgICBpbmRleCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGFjY2VzcykpOwotICAgICAgICBpZiAoaW5kZXggPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGluZGV4LT5saXN0ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG9pbnQpIDw8IDMpOwotICAgICAgICBpZiAoaW5kZXgtPmxpc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgZnJlZShpbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpbmRleC0+c2l6ZSA9IDg7Ci0gICAgICAgIGluZGV4LT5oYXZlID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpZiBsaXN0IGlzIGZ1bGwsIG1ha2UgaXQgYmlnZ2VyICovCi0gICAgZWxzZSBpZiAoaW5kZXgtPmhhdmUgPT0gaW5kZXgtPnNpemUpIHsKLSAgICAgICAgaW5kZXgtPnNpemUgPDw9IDE7Ci0gICAgICAgIG5leHQgPSByZWFsbG9jKGluZGV4LT5saXN0LCBzaXplb2Yoc3RydWN0IHBvaW50KSAqIGluZGV4LT5zaXplKTsKLSAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgewotICAgICAgICAgICAgZnJlZV9pbmRleChpbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpbmRleC0+bGlzdCA9IG5leHQ7Ci0gICAgfQotCi0gICAgLyogZmlsbCBpbiBlbnRyeSBhbmQgaW5jcmVtZW50IGhvdyBtYW55IHdlIGhhdmUgKi8KLSAgICBuZXh0ID0gaW5kZXgtPmxpc3QgKyBpbmRleC0+aGF2ZTsKLSAgICBuZXh0LT5iaXRzID0gYml0czsKLSAgICBuZXh0LT5pbiA9IGluOwotICAgIG5leHQtPm91dCA9IG91dDsKLSAgICBpZiAobGVmdCkKLSAgICAgICAgbWVtY3B5KG5leHQtPndpbmRvdywgd2luZG93ICsgV0lOU0laRSAtIGxlZnQsIGxlZnQpOwotICAgIGlmIChsZWZ0IDwgV0lOU0laRSkKLSAgICAgICAgbWVtY3B5KG5leHQtPndpbmRvdyArIGxlZnQsIHdpbmRvdywgV0lOU0laRSAtIGxlZnQpOwotICAgIGluZGV4LT5oYXZlKys7Ci0KLSAgICAvKiByZXR1cm4gbGlzdCwgcG9zc2libHkgcmVhbGxvY2F0ZWQgKi8KLSAgICByZXR1cm4gaW5kZXg7Ci19Ci0KLS8qIE1ha2Ugb25lIGVudGlyZSBwYXNzIHRocm91Z2ggdGhlIGNvbXByZXNzZWQgc3RyZWFtIGFuZCBidWlsZCBhbiBpbmRleCwgd2l0aAotICAgYWNjZXNzIHBvaW50cyBhYm91dCBldmVyeSBzcGFuIGJ5dGVzIG9mIHVuY29tcHJlc3NlZCBvdXRwdXQgLS0gc3BhbiBpcwotICAgY2hvc2VuIHRvIGJhbGFuY2UgdGhlIHNwZWVkIG9mIHJhbmRvbSBhY2Nlc3MgYWdhaW5zdCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgb2YgdGhlIGxpc3QsIGFib3V0IDMySyBieXRlcyBwZXIgYWNjZXNzIHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgYWZ0ZXIgdGhlIGVuZAotICAgb2YgdGhlIGZpcnN0IHpsaWIgb3IgZ3ppcCBzdHJlYW0gaW4gdGhlIGZpbGUgaXMgaWdub3JlZC4gIGJ1aWxkX2luZGV4KCkKLSAgIHJldHVybnMgdGhlIG51bWJlciBvZiBhY2Nlc3MgcG9pbnRzIG9uIHN1Y2Nlc3MgKD49IDEpLCBaX01FTV9FUlJPUiBmb3Igb3V0Ci0gICBvZiBtZW1vcnksIFpfREFUQV9FUlJPUiBmb3IgYW4gZXJyb3IgaW4gdGhlIGlucHV0IGZpbGUsIG9yIFpfRVJSTk8gZm9yIGEKLSAgIGZpbGUgcmVhZCBlcnJvci4gIE9uIHN1Y2Nlc3MsICpidWlsdCBwb2ludHMgdG8gdGhlIHJlc3VsdGluZyBpbmRleC4gKi8KLWxvY2FsIGludCBidWlsZF9pbmRleChGSUxFICppbiwgb2ZmX3Qgc3Bhbiwgc3RydWN0IGFjY2VzcyAqKmJ1aWx0KQotewotICAgIGludCByZXQ7Ci0gICAgb2ZmX3QgdG90aW4sIHRvdG91dDsgICAgICAgIC8qIG91ciBvd24gdG90YWwgY291bnRlcnMgdG8gYXZvaWQgNEdCIGxpbWl0ICovCi0gICAgb2ZmX3QgbGFzdDsgICAgICAgICAgICAgICAgIC8qIHRvdG91dCB2YWx1ZSBvZiBsYXN0IGFjY2VzcyBwb2ludCAqLwotICAgIHN0cnVjdCBhY2Nlc3MgKmluZGV4OyAgICAgICAvKiBhY2Nlc3MgcG9pbnRzIGJlaW5nIGdlbmVyYXRlZCAqLwotICAgIHpfc3RyZWFtIHN0cm07Ci0gICAgdW5zaWduZWQgY2hhciBpbnB1dFtDSFVOS107Ci0gICAgdW5zaWduZWQgY2hhciB3aW5kb3dbV0lOU0laRV07Ci0KLSAgICAvKiBpbml0aWFsaXplIGluZmxhdGUgKi8KLSAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKLSAgICBzdHJtLnpmcmVlID0gWl9OVUxMOwotICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOwotICAgIHN0cm0uYXZhaWxfaW4gPSAwOwotICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKLSAgICByZXQgPSBpbmZsYXRlSW5pdDIoJnN0cm0sIDQ3KTsgICAgICAvKiBhdXRvbWF0aWMgemxpYiBvciBnemlwIGRlY29kaW5nICovCi0gICAgaWYgKHJldCAhPSBaX09LKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgLyogaW5mbGF0ZSB0aGUgaW5wdXQsIG1haW50YWluIGEgc2xpZGluZyB3aW5kb3csIGFuZCBidWlsZCBhbiBpbmRleCAtLSB0aGlzCi0gICAgICAgYWxzbyB2YWxpZGF0ZXMgdGhlIGludGVncml0eSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIHVzaW5nIHRoZSBjaGVjawotICAgICAgIGluZm9ybWF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGd6aXAgb3IgemxpYiBzdHJlYW0gKi8KLSAgICB0b3RpbiA9IHRvdG91dCA9IGxhc3QgPSAwOwotICAgIGluZGV4ID0gTlVMTDsgICAgICAgICAgICAgICAvKiB3aWxsIGJlIGFsbG9jYXRlZCBieSBmaXJzdCBhZGRwb2ludCgpICovCi0gICAgc3RybS5hdmFpbF9vdXQgPSAwOwotICAgIGRvIHsKLSAgICAgICAgLyogZ2V0IHNvbWUgY29tcHJlc3NlZCBkYXRhIGZyb20gaW5wdXQgZmlsZSAqLwotICAgICAgICBzdHJtLmF2YWlsX2luID0gZnJlYWQoaW5wdXQsIDEsIENIVU5LLCBpbik7Ci0gICAgICAgIGlmIChmZXJyb3IoaW4pKSB7Ci0gICAgICAgICAgICByZXQgPSBaX0VSUk5POwotICAgICAgICAgICAgZ290byBidWlsZF9pbmRleF9lcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RybS5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICBnb3RvIGJ1aWxkX2luZGV4X2Vycm9yOwotICAgICAgICB9Ci0gICAgICAgIHN0cm0ubmV4dF9pbiA9IGlucHV0OwotCi0gICAgICAgIC8qIHByb2Nlc3MgYWxsIG9mIHRoYXQsIG9yIHVudGlsIGVuZCBvZiBzdHJlYW0gKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgLyogcmVzZXQgc2xpZGluZyB3aW5kb3cgaWYgbmVjZXNzYXJ5ICovCi0gICAgICAgICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT0gMCkgewotICAgICAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gV0lOU0laRTsKLSAgICAgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gd2luZG93OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBpbmZsYXRlIHVudGlsIG91dCBvZiBpbnB1dCwgb3V0cHV0LCBvciBhdCBlbmQgb2YgYmxvY2sgLS0KLSAgICAgICAgICAgICAgIHVwZGF0ZSB0aGUgdG90YWwgaW5wdXQgYW5kIG91dHB1dCBjb3VudGVycyAqLwotICAgICAgICAgICAgdG90aW4gKz0gc3RybS5hdmFpbF9pbjsKLSAgICAgICAgICAgIHRvdG91dCArPSBzdHJtLmF2YWlsX291dDsKLSAgICAgICAgICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfQkxPQ0spOyAgICAgIC8qIHJldHVybiBhdCBlbmQgb2YgYmxvY2sgKi8KLSAgICAgICAgICAgIHRvdGluIC09IHN0cm0uYXZhaWxfaW47Ci0gICAgICAgICAgICB0b3RvdXQgLT0gc3RybS5hdmFpbF9vdXQ7Ci0gICAgICAgICAgICBpZiAocmV0ID09IFpfTkVFRF9ESUNUKQotICAgICAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gWl9NRU1fRVJST1IgfHwgcmV0ID09IFpfREFUQV9FUlJPUikKLSAgICAgICAgICAgICAgICBnb3RvIGJ1aWxkX2luZGV4X2Vycm9yOwotICAgICAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIGlmIGF0IGVuZCBvZiBibG9jaywgY29uc2lkZXIgYWRkaW5nIGFuIGluZGV4IGVudHJ5IChub3RlIHRoYXQgaWYKLSAgICAgICAgICAgICAgIGRhdGFfdHlwZSBpbmRpY2F0ZXMgYW4gZW5kLW9mLWJsb2NrLCB0aGVuIGFsbCBvZiB0aGUKLSAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBkYXRhIGZyb20gdGhhdCBibG9jayBoYXMgYmVlbiBkZWxpdmVyZWQsIGFuZCBub25lCi0gICAgICAgICAgICAgICBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGFmdGVyIHRoYXQgYmxvY2sgaGFzIGJlZW4gY29uc3VtZWQsCi0gICAgICAgICAgICAgICBleGNlcHQgZm9yIHVwIHRvIHNldmVuIGJpdHMpIC0tIHRoZSB0b3RvdXQgPT0gMCBwcm92aWRlcyBhbgotICAgICAgICAgICAgICAgZW50cnkgcG9pbnQgYWZ0ZXIgdGhlIHpsaWIgb3IgZ3ppcCBoZWFkZXIsIGFuZCBhc3N1cmVzIHRoYXQgdGhlCi0gICAgICAgICAgICAgICBpbmRleCBhbHdheXMgaGFzIGF0IGxlYXN0IG9uZSBhY2Nlc3MgcG9pbnQ7IHdlIGF2b2lkIGNyZWF0aW5nIGFuCi0gICAgICAgICAgICAgICBhY2Nlc3MgcG9pbnQgYWZ0ZXIgdGhlIGxhc3QgYmxvY2sgYnkgY2hlY2tpbmcgYml0IDYgb2YgZGF0YV90eXBlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgoc3RybS5kYXRhX3R5cGUgJiAxMjgpICYmICEoc3RybS5kYXRhX3R5cGUgJiA2NCkgJiYKLSAgICAgICAgICAgICAgICAodG90b3V0ID09IDAgfHwgdG90b3V0IC0gbGFzdCA+IHNwYW4pKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBhZGRwb2ludChpbmRleCwgc3RybS5kYXRhX3R5cGUgJiA3LCB0b3RpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdG91dCwgc3RybS5hdmFpbF9vdXQsIHdpbmRvdyk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gWl9NRU1fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gYnVpbGRfaW5kZXhfZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxhc3QgPSB0b3RvdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfaW4gIT0gMCk7Ci0gICAgfSB3aGlsZSAocmV0ICE9IFpfU1RSRUFNX0VORCk7Ci0KLSAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuIGluZGV4IChyZWxlYXNlIHVudXNlZCBlbnRyaWVzIGluIGxpc3QpICovCi0gICAgKHZvaWQpaW5mbGF0ZUVuZCgmc3RybSk7Ci0gICAgaW5kZXggPSByZWFsbG9jKGluZGV4LCBzaXplb2Yoc3RydWN0IHBvaW50KSAqIGluZGV4LT5oYXZlKTsKLSAgICBpbmRleC0+c2l6ZSA9IGluZGV4LT5oYXZlOwotICAgICpidWlsdCA9IGluZGV4OwotICAgIHJldHVybiBpbmRleC0+c2l6ZTsKLQotICAgIC8qIHJldHVybiBlcnJvciAqLwotICBidWlsZF9pbmRleF9lcnJvcjoKLSAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKLSAgICBpZiAoaW5kZXggIT0gTlVMTCkKLSAgICAgICAgZnJlZV9pbmRleChpbmRleCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyogVXNlIHRoZSBpbmRleCB0byByZWFkIGxlbiBieXRlcyBmcm9tIG9mZnNldCBpbnRvIGJ1ZiwgcmV0dXJuIGJ5dGVzIHJlYWQgb3IKLSAgIG5lZ2F0aXZlIGZvciBlcnJvciAoWl9EQVRBX0VSUk9SIG9yIFpfTUVNX0VSUk9SKS4gIElmIGRhdGEgaXMgcmVxdWVzdGVkIHBhc3QKLSAgIHRoZSBlbmQgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLCB0aGVuIGV4dHJhY3QoKSB3aWxsIHJldHVybiBhIHZhbHVlIGxlc3MKLSAgIHRoYW4gbGVuLCBpbmRpY2F0aW5nIGhvdyBtdWNoIGFzIGFjdHVhbGx5IHJlYWQgaW50byBidWYuICBUaGlzIGZ1bmN0aW9uCi0gICBzaG91bGQgbm90IHJldHVybiBhIGRhdGEgZXJyb3IgdW5sZXNzIHRoZSBmaWxlIHdhcyBtb2RpZmllZCBzaW5jZSB0aGUgaW5kZXgKLSAgIHdhcyBnZW5lcmF0ZWQuICBleHRyYWN0KCkgbWF5IGFsc28gcmV0dXJuIFpfRVJSTk8gaWYgdGhlcmUgaXMgYW4gZXJyb3Igb24KLSAgIHJlYWRpbmcgb3Igc2Vla2luZyB0aGUgaW5wdXQgZmlsZS4gKi8KLWxvY2FsIGludCBleHRyYWN0KEZJTEUgKmluLCBzdHJ1Y3QgYWNjZXNzICppbmRleCwgb2ZmX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQotewotICAgIGludCByZXQsIHNraXA7Ci0gICAgel9zdHJlYW0gc3RybTsKLSAgICBzdHJ1Y3QgcG9pbnQgKmhlcmU7Ci0gICAgdW5zaWduZWQgY2hhciBpbnB1dFtDSFVOS107Ci0gICAgdW5zaWduZWQgY2hhciBkaXNjYXJkW1dJTlNJWkVdOwotCi0gICAgLyogcHJvY2VlZCBvbmx5IGlmIHNvbWV0aGluZyByZWFzb25hYmxlIHRvIGRvICovCi0gICAgaWYgKGxlbiA8IDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogZmluZCB3aGVyZSBpbiBzdHJlYW0gdG8gc3RhcnQgKi8KLSAgICBoZXJlID0gaW5kZXgtPmxpc3Q7Ci0gICAgcmV0ID0gaW5kZXgtPmhhdmU7Ci0gICAgd2hpbGUgKC0tcmV0ICYmIGhlcmVbMV0ub3V0IDw9IG9mZnNldCkKLSAgICAgICAgaGVyZSsrOwotCi0gICAgLyogaW5pdGlhbGl6ZSBmaWxlIGFuZCBpbmZsYXRlIHN0YXRlIHRvIHN0YXJ0IHRoZXJlICovCi0gICAgc3RybS56YWxsb2MgPSBaX05VTEw7Ci0gICAgc3RybS56ZnJlZSA9IFpfTlVMTDsKLSAgICBzdHJtLm9wYXF1ZSA9IFpfTlVMTDsKLSAgICBzdHJtLmF2YWlsX2luID0gMDsKLSAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7Ci0gICAgcmV0ID0gaW5mbGF0ZUluaXQyKCZzdHJtLCAtMTUpOyAgICAgICAgIC8qIHJhdyBpbmZsYXRlICovCi0gICAgaWYgKHJldCAhPSBaX09LKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIHJldCA9IGZzZWVrbyhpbiwgaGVyZS0+aW4gLSAoaGVyZS0+Yml0cyA/IDEgOiAwKSwgU0VFS19TRVQpOwotICAgIGlmIChyZXQgPT0gLTEpCi0gICAgICAgIGdvdG8gZXh0cmFjdF9yZXQ7Ci0gICAgaWYgKGhlcmUtPmJpdHMpIHsKLSAgICAgICAgcmV0ID0gZ2V0Yyhpbik7Ci0gICAgICAgIGlmIChyZXQgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldCA9IGZlcnJvcihpbikgPyBaX0VSUk5PIDogWl9EQVRBX0VSUk9SOwotICAgICAgICAgICAgZ290byBleHRyYWN0X3JldDsKLSAgICAgICAgfQotICAgICAgICAodm9pZClpbmZsYXRlUHJpbWUoJnN0cm0sIGhlcmUtPmJpdHMsIHJldCA+PiAoOCAtIGhlcmUtPmJpdHMpKTsKLSAgICB9Ci0gICAgKHZvaWQpaW5mbGF0ZVNldERpY3Rpb25hcnkoJnN0cm0sIGhlcmUtPndpbmRvdywgV0lOU0laRSk7Ci0KLSAgICAvKiBza2lwIHVuY29tcHJlc3NlZCBieXRlcyB1bnRpbCBvZmZzZXQgcmVhY2hlZCwgdGhlbiBzYXRpc2Z5IHJlcXVlc3QgKi8KLSAgICBvZmZzZXQgLT0gaGVyZS0+b3V0OwotICAgIHN0cm0uYXZhaWxfaW4gPSAwOwotICAgIHNraXAgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBza2lwcGluZyB0byBvZmZzZXQgKi8KLSAgICBkbyB7Ci0gICAgICAgIC8qIGRlZmluZSB3aGVyZSB0byBwdXQgdW5jb21wcmVzc2VkIGRhdGEsIGFuZCBob3cgbXVjaCAqLwotICAgICAgICBpZiAob2Zmc2V0ID09IDAgJiYgc2tpcCkgeyAgICAgICAgICAvKiBhdCBvZmZzZXQgbm93ICovCi0gICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlbjsKLSAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBidWY7Ci0gICAgICAgICAgICBza2lwID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgZG8gdGhpcyBvbmNlICovCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG9mZnNldCA+IFdJTlNJWkUpIHsgICAgICAgICAgICAgLyogc2tpcCBXSU5TSVpFIGJ5dGVzICovCi0gICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IFdJTlNJWkU7Ci0gICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gZGlzY2FyZDsKLSAgICAgICAgICAgIG9mZnNldCAtPSBXSU5TSVpFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG9mZnNldCAhPSAwKSB7ICAgICAgICAgICAgIC8qIGxhc3Qgc2tpcCAqLwotICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSAodW5zaWduZWQpb2Zmc2V0OwotICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IGRpc2NhcmQ7Ci0gICAgICAgICAgICBvZmZzZXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdW5jb21wcmVzcyB1bnRpbCBhdmFpbF9vdXQgZmlsbGVkLCBvciBlbmQgb2Ygc3RyZWFtICovCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChzdHJtLmF2YWlsX2luID09IDApIHsKLSAgICAgICAgICAgICAgICBzdHJtLmF2YWlsX2luID0gZnJlYWQoaW5wdXQsIDEsIENIVU5LLCBpbik7Ci0gICAgICAgICAgICAgICAgaWYgKGZlcnJvcihpbikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gWl9FUlJOTzsKLSAgICAgICAgICAgICAgICAgICAgZ290byBleHRyYWN0X3JldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0cm0uYXZhaWxfaW4gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXh0cmFjdF9yZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IGlucHV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZSgmc3RybSwgWl9OT19GTFVTSCk7ICAgICAgIC8qIG5vcm1hbCBpbmZsYXRlICovCi0gICAgICAgICAgICBpZiAocmV0ID09IFpfTkVFRF9ESUNUKQotICAgICAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gWl9NRU1fRVJST1IgfHwgcmV0ID09IFpfREFUQV9FUlJPUikKLSAgICAgICAgICAgICAgICBnb3RvIGV4dHJhY3RfcmV0OwotICAgICAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfb3V0ICE9IDApOwotCi0gICAgICAgIC8qIGlmIHJlYWNoIGVuZCBvZiBzdHJlYW0sIHRoZW4gZG9uJ3Qga2VlcCB0cnlpbmcgdG8gZ2V0IG1vcmUgKi8KLSAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBkbyB1bnRpbCBvZmZzZXQgcmVhY2hlZCBhbmQgcmVxdWVzdGVkIGRhdGEgcmVhZCwgb3Igc3RyZWFtIGVuZHMgKi8KLSAgICB9IHdoaWxlIChza2lwKTsKLQotICAgIC8qIGNvbXB1dGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyByZWFkIGFmdGVyIG9mZnNldCAqLwotICAgIHJldCA9IHNraXAgPyAwIDogbGVuIC0gc3RybS5hdmFpbF9vdXQ7Ci0KLSAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuIGJ5dGVzIHJlYWQgb3IgZXJyb3IgKi8KLSAgZXh0cmFjdF9yZXQ6Ci0gICAgKHZvaWQpaW5mbGF0ZUVuZCgmc3RybSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyogRGVtb25zdHJhdGUgdGhlIHVzZSBvZiBidWlsZF9pbmRleCgpIGFuZCBleHRyYWN0KCkgYnkgcHJvY2Vzc2luZyB0aGUgZmlsZQotICAgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHRoZSBleHRyYWN0aW5nIDE2SyBmcm9tIGFib3V0IDIvM3JkcyBvZgotICAgdGhlIHdheSB0aHJvdWdoIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0LCBhbmQgd3JpdGluZyB0aGF0IHRvIHN0ZG91dC4gKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgbGVuOwotICAgIG9mZl90IG9mZnNldDsKLSAgICBGSUxFICppbjsKLSAgICBzdHJ1Y3QgYWNjZXNzICppbmRleDsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZltDSFVOS107Ci0KLSAgICAvKiBvcGVuIGlucHV0IGZpbGUgKi8KLSAgICBpZiAoYXJnYyAhPSAyKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IHpyYW4gZmlsZS5nelxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpbiA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOwotICAgIGlmIChpbiA9PSBOVUxMKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogY291bGQgbm90IG9wZW4gJXMgZm9yIHJlYWRpbmdcbiIsIGFyZ3ZbMV0pOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBidWlsZCBpbmRleCAqLwotICAgIGxlbiA9IGJ1aWxkX2luZGV4KGluLCBTUEFOLCAmaW5kZXgpOwotICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgIGZjbG9zZShpbik7Ci0gICAgICAgIHN3aXRjaCAobGVuKSB7Ci0gICAgICAgIGNhc2UgWl9NRU1fRVJST1I6Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInpyYW46IG91dCBvZiBtZW1vcnlcbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ6cmFuOiBjb21wcmVzc2VkIGRhdGEgZXJyb3IgaW4gJXNcbiIsIGFyZ3ZbMV0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWl9FUlJOTzoKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogcmVhZCBlcnJvciBvbiAlc1xuIiwgYXJndlsxXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogZXJyb3IgJWQgd2hpbGUgYnVpbGRpbmcgaW5kZXhcbiIsIGxlbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogYnVpbHQgaW5kZXggd2l0aCAlZCBhY2Nlc3MgcG9pbnRzXG4iLCBsZW4pOwotCi0gICAgLyogdXNlIGluZGV4IGJ5IHJlYWRpbmcgc29tZSBieXRlcyBmcm9tIGFuIGFyYml0cmFyeSBvZmZzZXQgKi8KLSAgICBvZmZzZXQgPSAoaW5kZXgtPmxpc3RbaW5kZXgtPmhhdmUgLSAxXS5vdXQgPDwgMSkgLyAzOwotICAgIGxlbiA9IGV4dHJhY3QoaW4sIGluZGV4LCBvZmZzZXQsIGJ1ZiwgQ0hVTkspOwotICAgIGlmIChsZW4gPCAwKQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInpyYW46IGV4dHJhY3Rpb24gZmFpbGVkOiAlcyBlcnJvclxuIiwKLSAgICAgICAgICAgICAgICBsZW4gPT0gWl9NRU1fRVJST1IgPyAib3V0IG9mIG1lbW9yeSIgOiAiaW5wdXQgY29ycnVwdGVkIik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZ3cml0ZShidWYsIDEsIGxlbiwgc3Rkb3V0KTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ6cmFuOiBleHRyYWN0ZWQgJWQgYnl0ZXMgYXQgJWxsdVxuIiwgbGVuLCBvZmZzZXQpOwotICAgIH0KLQotICAgIC8qIGNsZWFuIHVwIGFuZCBleGl0ICovCi0gICAgZnJlZV9pbmRleChpbmRleCk7Ci0gICAgZmNsb3NlKGluKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9nemlvLmMgYi9saWJzL3psaWIvZ3ppby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjAxODMxLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9nemlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI2ICswLDAgQEAKLS8qIGd6aW8uYyAtLSBJTyBvbiAuZ3ogZmlsZXMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKgotICogQ29tcGlsZSB0aGlzIGZpbGUgd2l0aCAtRE5PX0daQ09NUFJFU1MgdG8gYXZvaWQgdGhlIGNvbXByZXNzaW9uIGNvZGUuCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAienV0aWwuaCIKLQotI2lmZGVmIE5PX0RFRkxBVEUgICAgICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZGVmaW5pdGlvbiAqLwotIyAgZGVmaW5lIE5PX0daQ09NUFJFU1MKLSNlbmRpZgotCi0jaWZuZGVmIE5PX0RVTU1ZX0RFQ0wKLXN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KLSNlbmRpZgotCi0jaWZuZGVmIFpfQlVGU0laRQotIyAgaWZkZWYgTUFYU0VHXzY0SwotIyAgICBkZWZpbmUgWl9CVUZTSVpFIDQwOTYgLyogbWluaW1pemUgbWVtb3J5IHVzYWdlIGZvciAxNi1iaXQgRE9TICovCi0jICBlbHNlCi0jICAgIGRlZmluZSBaX0JVRlNJWkUgMTYzODQKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZm5kZWYgWl9QUklOVEZfQlVGU0laRQotIyAgZGVmaW5lIFpfUFJJTlRGX0JVRlNJWkUgNDA5NgotI2VuZGlmCi0KLSNpZmRlZiBfX01WU19fCi0jICBwcmFnbWEgbWFwIChmZG9wZW4gLCAiXDE3NFwxNzRGRE9QRU4iKQotICAgRklMRSAqZmRvcGVuKGludCwgY29uc3QgY2hhciAqKTsKLSNlbmRpZgotCi0jaWZuZGVmIFNUREMKLWV4dGVybiB2b2lkcCAgbWFsbG9jIE9GKCh1SW50IHNpemUpKTsKLWV4dGVybiB2b2lkICAgZnJlZSAgIE9GKCh2b2lkcGYgcHRyKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBBTExPQyhzaXplKSBtYWxsb2Moc2l6ZSkKLSNkZWZpbmUgVFJZRlJFRShwKSB7aWYgKHApIGZyZWUocCk7fQotCi1zdGF0aWMgaW50IGNvbnN0IGd6X21hZ2ljWzJdID0gezB4MWYsIDB4OGJ9OyAvKiBnemlwIG1hZ2ljIGhlYWRlciAqLwotCi0vKiBnemlwIGZsYWcgYnl0ZSAqLwotI2RlZmluZSBBU0NJSV9GTEFHICAgMHgwMSAvKiBiaXQgMCBzZXQ6IGZpbGUgcHJvYmFibHkgYXNjaWkgdGV4dCAqLwotI2RlZmluZSBIRUFEX0NSQyAgICAgMHgwMiAvKiBiaXQgMSBzZXQ6IGhlYWRlciBDUkMgcHJlc2VudCAqLwotI2RlZmluZSBFWFRSQV9GSUVMRCAgMHgwNCAvKiBiaXQgMiBzZXQ6IGV4dHJhIGZpZWxkIHByZXNlbnQgKi8KLSNkZWZpbmUgT1JJR19OQU1FICAgIDB4MDggLyogYml0IDMgc2V0OiBvcmlnaW5hbCBmaWxlIG5hbWUgcHJlc2VudCAqLwotI2RlZmluZSBDT01NRU5UICAgICAgMHgxMCAvKiBiaXQgNCBzZXQ6IGZpbGUgY29tbWVudCBwcmVzZW50ICovCi0jZGVmaW5lIFJFU0VSVkVEICAgICAweEUwIC8qIGJpdHMgNS4uNzogcmVzZXJ2ZWQgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZ3pfc3RyZWFtIHsKLSAgICB6X3N0cmVhbSBzdHJlYW07Ci0gICAgaW50ICAgICAgel9lcnI7ICAgLyogZXJyb3IgY29kZSBmb3IgbGFzdCBzdHJlYW0gb3BlcmF0aW9uICovCi0gICAgaW50ICAgICAgel9lb2Y7ICAgLyogc2V0IGlmIGVuZCBvZiBpbnB1dCBmaWxlICovCi0gICAgRklMRSAgICAgKmZpbGU7ICAgLyogLmd6IGZpbGUgKi8KLSAgICBCeXRlICAgICAqaW5idWY7ICAvKiBpbnB1dCBidWZmZXIgKi8KLSAgICBCeXRlICAgICAqb3V0YnVmOyAvKiBvdXRwdXQgYnVmZmVyICovCi0gICAgdUxvbmcgICAgY3JjOyAgICAgLyogY3JjMzIgb2YgdW5jb21wcmVzc2VkIGRhdGEgKi8KLSAgICBjaGFyICAgICAqbXNnOyAgICAvKiBlcnJvciBtZXNzYWdlICovCi0gICAgY2hhciAgICAgKnBhdGg7ICAgLyogcGF0aCBuYW1lIGZvciBkZWJ1Z2dpbmcgb25seSAqLwotICAgIGludCAgICAgIHRyYW5zcGFyZW50OyAvKiAxIGlmIGlucHV0IGZpbGUgaXMgbm90IGEgLmd6IGZpbGUgKi8KLSAgICBjaGFyICAgICBtb2RlOyAgICAvKiAndycgb3IgJ3InICovCi0gICAgel9vZmZfdCAgc3RhcnQ7ICAgLyogc3RhcnQgb2YgY29tcHJlc3NlZCBkYXRhIGluIGZpbGUgKGhlYWRlciBza2lwcGVkKSAqLwotICAgIHpfb2ZmX3QgIGluOyAgICAgIC8qIGJ5dGVzIGludG8gZGVmbGF0ZSBvciBpbmZsYXRlICovCi0gICAgel9vZmZfdCAgb3V0OyAgICAgLyogYnl0ZXMgb3V0IG9mIGRlZmxhdGUgb3IgaW5mbGF0ZSAqLwotICAgIGludCAgICAgIGJhY2s7ICAgIC8qIG9uZSBjaGFyYWN0ZXIgcHVzaC1iYWNrICovCi0gICAgaW50ICAgICAgbGFzdDsgICAgLyogdHJ1ZSBpZiBwdXNoLWJhY2sgaXMgbGFzdCBjaGFyYWN0ZXIgKi8KLX0gZ3pfc3RyZWFtOwotCi0KLWxvY2FsIGd6RmlsZSBnel9vcGVuICAgICAgT0YoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUsIGludCAgZmQpKTsKLWxvY2FsIGludCBkb19mbHVzaCAgICAgICAgT0YoKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpKTsKLWxvY2FsIGludCAgICBnZXRfYnl0ZSAgICAgT0YoKGd6X3N0cmVhbSAqcykpOwotbG9jYWwgdm9pZCAgIGNoZWNrX2hlYWRlciBPRigoZ3pfc3RyZWFtICpzKSk7Ci1sb2NhbCBpbnQgICAgZGVzdHJveSAgICAgIE9GKChnel9zdHJlYW0gKnMpKTsKLWxvY2FsIHZvaWQgICBwdXRMb25nICAgICAgT0YoKEZJTEUgKmZpbGUsIHVMb25nIHgpKTsKLWxvY2FsIHVMb25nICBnZXRMb25nICAgICAgT0YoKGd6X3N0cmVhbSAqcykpOwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gVGhlIG1vZGUgcGFyYW1ldGVyCi0gICBpcyBhcyBpbiBmb3BlbiAoInJiIiBvciAid2IiKS4gVGhlIGZpbGUgaXMgZ2l2ZW4gZWl0aGVyIGJ5IGZpbGUgZGVzY3JpcHRvcgotICAgb3IgcGF0aCBuYW1lIChpZiBmZCA9PSAtMSkuCi0gICAgIGd6X29wZW4gcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3IgaWYgdGhlcmUgd2FzCi0gICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGU7IGVycm5vCi0gICBjYW4gYmUgY2hlY2tlZCB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUKLSAgIHpsaWIgZXJyb3IgaXMgWl9NRU1fRVJST1IpLgotKi8KLWxvY2FsIGd6RmlsZSBnel9vcGVuIChwYXRoLCBtb2RlLCBmZCkKLSAgICBjb25zdCBjaGFyICpwYXRoOwotICAgIGNvbnN0IGNoYXIgKm1vZGU7Ci0gICAgaW50ICBmZDsKLXsKLSAgICBpbnQgZXJyOwotICAgIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsgLyogY29tcHJlc3Npb24gbGV2ZWwgKi8KLSAgICBpbnQgc3RyYXRlZ3kgPSBaX0RFRkFVTFRfU1RSQVRFR1k7IC8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5ICovCi0gICAgY2hhciAqcCA9IChjaGFyKiltb2RlOwotICAgIGd6X3N0cmVhbSAqczsKLSAgICBjaGFyIGZtb2RlWzgwXTsgLyogY29weSBvZiBtb2RlLCB3aXRob3V0IHRoZSBjb21wcmVzc2lvbiBsZXZlbCAqLwotICAgIGNoYXIgKm0gPSBmbW9kZTsKLQotICAgIGlmICghcGF0aCB8fCAhbW9kZSkgcmV0dXJuIFpfTlVMTDsKLQotICAgIHMgPSAoZ3pfc3RyZWFtICopQUxMT0Moc2l6ZW9mKGd6X3N0cmVhbSkpOwotICAgIGlmICghcykgcmV0dXJuIFpfTlVMTDsKLQotICAgIHMtPnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIHMtPnN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLSAgICBzLT5zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWYgPSBaX05VTEw7Ci0gICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmID0gWl9OVUxMOwotICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IHMtPnN0cmVhbS5hdmFpbF9vdXQgPSAwOwotICAgIHMtPmZpbGUgPSBOVUxMOwotICAgIHMtPnpfZXJyID0gWl9PSzsKLSAgICBzLT56X2VvZiA9IDA7Ci0gICAgcy0+aW4gPSAwOwotICAgIHMtPm91dCA9IDA7Ci0gICAgcy0+YmFjayA9IEVPRjsKLSAgICBzLT5jcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICBzLT5tc2cgPSBOVUxMOwotICAgIHMtPnRyYW5zcGFyZW50ID0gMDsKLQotICAgIHMtPnBhdGggPSAoY2hhciopQUxMT0Moc3RybGVuKHBhdGgpKzEpOwotICAgIGlmIChzLT5wYXRoID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOwotICAgIH0KLSAgICBzdHJjcHkocy0+cGF0aCwgcGF0aCk7IC8qIGRvIHRoaXMgZWFybHkgZm9yIGRlYnVnZ2luZyAqLwotCi0gICAgcy0+bW9kZSA9ICdcMCc7Ci0gICAgZG8gewotICAgICAgICBpZiAoKnAgPT0gJ3InKSBzLT5tb2RlID0gJ3InOwotICAgICAgICBpZiAoKnAgPT0gJ3cnIHx8ICpwID09ICdhJykgcy0+bW9kZSA9ICd3JzsKLSAgICAgICAgaWYgKCpwID49ICcwJyAmJiAqcCA8PSAnOScpIHsKLSAgICAgICAgICAgIGxldmVsID0gKnAgLSAnMCc7Ci0gICAgICAgIH0gZWxzZSBpZiAoKnAgPT0gJ2YnKSB7Ci0gICAgICAgICAgc3RyYXRlZ3kgPSBaX0ZJTFRFUkVEOwotICAgICAgICB9IGVsc2UgaWYgKCpwID09ICdoJykgewotICAgICAgICAgIHN0cmF0ZWd5ID0gWl9IVUZGTUFOX09OTFk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKnAgPT0gJ1InKSB7Ci0gICAgICAgICAgc3RyYXRlZ3kgPSBaX1JMRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICptKysgPSAqcDsgLyogY29weSB0aGUgbW9kZSAqLwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoKnArKyAmJiBtICE9IGZtb2RlICsgc2l6ZW9mKGZtb2RlKSk7Ci0gICAgaWYgKHMtPm1vZGUgPT0gJ1wwJykgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOwotCi0gICAgaWYgKHMtPm1vZGUgPT0gJ3cnKSB7Ci0jaWZkZWYgTk9fR1pDT01QUkVTUwotICAgICAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKLSNlbHNlCi0gICAgICAgIGVyciA9IGRlZmxhdGVJbml0MigmKHMtPnN0cmVhbSksIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9ERUZMQVRFRCwgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgc3RyYXRlZ3kpOwotICAgICAgICAvKiB3aW5kb3dCaXRzIGlzIHBhc3NlZCA8IDAgdG8gc3VwcHJlc3MgemxpYiBoZWFkZXIgKi8KLQotICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBzLT5vdXRidWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsKLSNlbmRpZgotICAgICAgICBpZiAoZXJyICE9IFpfT0sgfHwgcy0+b3V0YnVmID09IFpfTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcy0+c3RyZWFtLm5leHRfaW4gID0gcy0+aW5idWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsKLQotICAgICAgICBlcnIgPSBpbmZsYXRlSW5pdDIoJihzLT5zdHJlYW0pLCAtTUFYX1dCSVRTKTsKLSAgICAgICAgLyogd2luZG93Qml0cyBpcyBwYXNzZWQgPCAwIHRvIHRlbGwgdGhhdCB0aGVyZSBpcyBubyB6bGliIGhlYWRlci4KLSAgICAgICAgICogTm90ZSB0aGF0IGluIHRoaXMgY2FzZSBpbmZsYXRlICpyZXF1aXJlcyogYW4gZXh0cmEgImR1bW15IiBieXRlCi0gICAgICAgICAqIGFmdGVyIHRoZSBjb21wcmVzc2VkIHN0cmVhbSBpbiBvcmRlciB0byBjb21wbGV0ZSBkZWNvbXByZXNzaW9uIGFuZAotICAgICAgICAgKiByZXR1cm4gWl9TVFJFQU1fRU5ELiBIZXJlIHRoZSBnemlwIENSQzMyIGVuc3VyZXMgdGhhdCA0IGJ5dGVzIGFyZQotICAgICAgICAgKiBwcmVzZW50IGFmdGVyIHRoZSBjb21wcmVzc2VkIHN0cmVhbS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChlcnIgIT0gWl9PSyB8fCBzLT5pbmJ1ZiA9PSBaX05VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gWl9CVUZTSVpFOwotCi0gICAgZXJybm8gPSAwOwotICAgIHMtPmZpbGUgPSBmZCA8IDAgPyBGX09QRU4ocGF0aCwgZm1vZGUpIDogKEZJTEUqKWZkb3BlbihmZCwgZm1vZGUpOwotCi0gICAgaWYgKHMtPmZpbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZGVzdHJveShzKSwgKGd6RmlsZSlaX05VTEw7Ci0gICAgfQotICAgIGlmIChzLT5tb2RlID09ICd3JykgewotICAgICAgICAvKiBXcml0ZSBhIHZlcnkgc2ltcGxlIC5neiBoZWFkZXI6Ci0gICAgICAgICAqLwotICAgICAgICBmcHJpbnRmKHMtPmZpbGUsICIlYyVjJWMlYyVjJWMlYyVjJWMlYyIsIGd6X21hZ2ljWzBdLCBnel9tYWdpY1sxXSwKLSAgICAgICAgICAgICBaX0RFRkxBVEVELCAwIC8qZmxhZ3MqLywgMCwwLDAsMCAvKnRpbWUqLywgMCAvKnhmbGFncyovLCBPU19DT0RFKTsKLSAgICAgICAgcy0+c3RhcnQgPSAxMEw7Ci0gICAgICAgIC8qIFdlIHVzZSAxMEwgaW5zdGVhZCBvZiBmdGVsbChzLT5maWxlKSB0byBiZWNhdXNlIGZ0ZWxsIGNhdXNlcyBhbgotICAgICAgICAgKiBmZmx1c2ggb24gc29tZSBzeXN0ZW1zLiBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgZG9lc24ndCB1c2UKLSAgICAgICAgICogc3RhcnQgYW55d2F5IGluIHdyaXRlIG1vZGUsIHNvIHRoaXMgaW5pdGlhbGl6YXRpb24gaXMgbm90Ci0gICAgICAgICAqIG5lY2Vzc2FyeS4KLSAgICAgICAgICovCi0gICAgfSBlbHNlIHsKLSAgICAgICAgY2hlY2tfaGVhZGVyKHMpOyAvKiBza2lwIHRoZSAuZ3ogaGVhZGVyICovCi0gICAgICAgIHMtPnN0YXJ0ID0gZnRlbGwocy0+ZmlsZSkgLSBzLT5zdHJlYW0uYXZhaWxfaW47Ci0gICAgfQotCi0gICAgcmV0dXJuIChnekZpbGUpczsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCi0qLwotZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuIChwYXRoLCBtb2RlKQotICAgIGNvbnN0IGNoYXIgKnBhdGg7Ci0gICAgY29uc3QgY2hhciAqbW9kZTsKLXsKLSAgICByZXR1cm4gZ3pfb3BlbiAocGF0aCwgbW9kZSwgLTEpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgQXNzb2NpYXRlIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gZmQgaXMgbm90IGR1cCdlZCBoZXJlCi0gICB0byBtaW1pYyB0aGUgYmVoYXZpbyh1KXIgb2YgZmRvcGVuLgotKi8KLWd6RmlsZSBaRVhQT1JUIGd6ZG9wZW4gKGZkLCBtb2RlKQotICAgIGludCBmZDsKLSAgICBjb25zdCBjaGFyICptb2RlOwotewotICAgIGNoYXIgbmFtZVs0Nl07ICAgICAgLyogYWxsb3cgZm9yIHVwIHRvIDEyOC1iaXQgaW50ZWdlcnMgKi8KLQotICAgIGlmIChmZCA8IDApIHJldHVybiAoZ3pGaWxlKVpfTlVMTDsKLSAgICBzcHJpbnRmKG5hbWUsICI8ZmQ6JWQ+IiwgZmQpOyAvKiBmb3IgZGVidWdnaW5nICovCi0KLSAgICByZXR1cm4gZ3pfb3BlbiAobmFtZSwgbW9kZSwgZmQpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIHN0cmF0ZWd5Ci0gKi8KLWludCBaRVhQT1JUIGd6c2V0cGFyYW1zIChmaWxlLCBsZXZlbCwgc3RyYXRlZ3kpCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgaW50IGxldmVsOwotICAgIGludCBzdHJhdGVneTsKLXsKLSAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOwotCi0gICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICd3JykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgLyogTWFrZSByb29tIHRvIGFsbG93IGZsdXNoaW5nICovCi0gICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgewotCi0gICAgICAgIHMtPnN0cmVhbS5uZXh0X291dCA9IHMtPm91dGJ1ZjsKLSAgICAgICAgaWYgKGZ3cml0ZShzLT5vdXRidWYsIDEsIFpfQlVGU0laRSwgcy0+ZmlsZSkgIT0gWl9CVUZTSVpFKSB7Ci0gICAgICAgICAgICBzLT56X2VyciA9IFpfRVJSTk87Ci0gICAgICAgIH0KLSAgICAgICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IFpfQlVGU0laRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGVmbGF0ZVBhcmFtcyAoJihzLT5zdHJlYW0pLCBsZXZlbCwgc3RyYXRlZ3kpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgUmVhZCBhIGJ5dGUgZnJvbSBhIGd6X3N0cmVhbTsgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luLiBSZXR1cm4gRU9GCi0gICBmb3IgZW5kIG9mIGZpbGUuCi0gICBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gcyBoYXMgYmVlbiBzdWNlc3NmdWxseSBvcGVuZWQgZm9yIHJlYWRpbmcuCi0qLwotbG9jYWwgaW50IGdldF9ieXRlKHMpCi0gICAgZ3pfc3RyZWFtICpzOwotewotICAgIGlmIChzLT56X2VvZikgcmV0dXJuIEVPRjsKLSAgICBpZiAocy0+c3RyZWFtLmF2YWlsX2luID09IDApIHsKLSAgICAgICAgZXJybm8gPSAwOwotICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSAodUludClmcmVhZChzLT5pbmJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKTsKLSAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICAgICAgICBzLT56X2VvZiA9IDE7Ci0gICAgICAgICAgICBpZiAoZmVycm9yKHMtPmZpbGUpKSBzLT56X2VyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICByZXR1cm4gRU9GOwotICAgICAgICB9Ci0gICAgICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7Ci0gICAgfQotICAgIHMtPnN0cmVhbS5hdmFpbF9pbi0tOwotICAgIHJldHVybiAqKHMtPnN0cmVhbS5uZXh0X2luKSsrOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgIENoZWNrIHRoZSBnemlwIGhlYWRlciBvZiBhIGd6X3N0cmVhbSBvcGVuZWQgZm9yIHJlYWRpbmcuIFNldCB0aGUgc3RyZWFtCi0gICAgbW9kZSB0byB0cmFuc3BhcmVudCBpZiB0aGUgZ3ppcCBtYWdpYyBoZWFkZXIgaXMgbm90IHByZXNlbnQ7IHNldCBzLT5lcnIKLSAgICB0byBaX0RBVEFfRVJST1IgaWYgdGhlIG1hZ2ljIGhlYWRlciBpcyBwcmVzZW50IGJ1dCB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyCi0gICAgaXMgaW5jb3JyZWN0LgotICAgIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBzdWNlc3NmdWxseTsKLSAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gaXMgemVybyBmb3IgdGhlIGZpcnN0IHRpbWUsIGJ1dCBtYXkgYmUgbm9uLXplcm8KLSAgICAgICBmb3IgY29uY2F0ZW5hdGVkIC5neiBmaWxlcy4KLSovCi1sb2NhbCB2b2lkIGNoZWNrX2hlYWRlcihzKQotICAgIGd6X3N0cmVhbSAqczsKLXsKLSAgICBpbnQgbWV0aG9kOyAvKiBtZXRob2QgYnl0ZSAqLwotICAgIGludCBmbGFnczsgIC8qIGZsYWdzIGJ5dGUgKi8KLSAgICB1SW50IGxlbjsKLSAgICBpbnQgYzsKLQotICAgIC8qIEFzc3VyZSB0d28gYnl0ZXMgaW4gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4gcGVlayBhaGVhZCAtLSBoYW5kbGUgY2FzZQotICAgICAgIHdoZXJlIGZpcnN0IGJ5dGUgb2YgaGVhZGVyIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBhZnRlciB0aGUgbGFzdAotICAgICAgIGd6aXAgc2VnbWVudCAqLwotICAgIGxlbiA9IHMtPnN0cmVhbS5hdmFpbF9pbjsKLSAgICBpZiAobGVuIDwgMikgewotICAgICAgICBpZiAobGVuKSBzLT5pbmJ1ZlswXSA9IHMtPnN0cmVhbS5uZXh0X2luWzBdOwotICAgICAgICBlcnJubyA9IDA7Ci0gICAgICAgIGxlbiA9ICh1SW50KWZyZWFkKHMtPmluYnVmICsgbGVuLCAxLCBaX0JVRlNJWkUgPj4gbGVuLCBzLT5maWxlKTsKLSAgICAgICAgaWYgKGxlbiA9PSAwICYmIGZlcnJvcihzLT5maWxlKSkgcy0+el9lcnIgPSBaX0VSUk5POwotICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gKz0gbGVuOwotICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOwotICAgICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX2luIDwgMikgewotICAgICAgICAgICAgcy0+dHJhbnNwYXJlbnQgPSBzLT5zdHJlYW0uYXZhaWxfaW47Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBQZWVrIGFoZWFkIHRvIGNoZWNrIHRoZSBnemlwIG1hZ2ljIGhlYWRlciAqLwotICAgIGlmIChzLT5zdHJlYW0ubmV4dF9pblswXSAhPSBnel9tYWdpY1swXSB8fAotICAgICAgICBzLT5zdHJlYW0ubmV4dF9pblsxXSAhPSBnel9tYWdpY1sxXSkgewotICAgICAgICBzLT50cmFuc3BhcmVudCA9IDE7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcy0+c3RyZWFtLmF2YWlsX2luIC09IDI7Ci0gICAgcy0+c3RyZWFtLm5leHRfaW4gKz0gMjsKLQotICAgIC8qIENoZWNrIHRoZSByZXN0IG9mIHRoZSBnemlwIGhlYWRlciAqLwotICAgIG1ldGhvZCA9IGdldF9ieXRlKHMpOwotICAgIGZsYWdzID0gZ2V0X2J5dGUocyk7Ci0gICAgaWYgKG1ldGhvZCAhPSBaX0RFRkxBVEVEIHx8IChmbGFncyAmIFJFU0VSVkVEKSAhPSAwKSB7Ci0gICAgICAgIHMtPnpfZXJyID0gWl9EQVRBX0VSUk9SOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogRGlzY2FyZCB0aW1lLCB4ZmxhZ3MgYW5kIE9TIGNvZGU6ICovCi0gICAgZm9yIChsZW4gPSAwOyBsZW4gPCA2OyBsZW4rKykgKHZvaWQpZ2V0X2J5dGUocyk7Ci0KLSAgICBpZiAoKGZsYWdzICYgRVhUUkFfRklFTEQpICE9IDApIHsgLyogc2tpcCB0aGUgZXh0cmEgZmllbGQgKi8KLSAgICAgICAgbGVuICA9ICAodUludClnZXRfYnl0ZShzKTsKLSAgICAgICAgbGVuICs9ICgodUludClnZXRfYnl0ZShzKSk8PDg7Ci0gICAgICAgIC8qIGxlbiBpcyBnYXJiYWdlIGlmIEVPRiBidXQgdGhlIGxvb3AgYmVsb3cgd2lsbCBxdWl0IGFueXdheSAqLwotICAgICAgICB3aGlsZSAobGVuLS0gIT0gMCAmJiBnZXRfYnl0ZShzKSAhPSBFT0YpIDsKLSAgICB9Ci0gICAgaWYgKChmbGFncyAmIE9SSUdfTkFNRSkgIT0gMCkgeyAvKiBza2lwIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgKi8KLSAgICAgICAgd2hpbGUgKChjID0gZ2V0X2J5dGUocykpICE9IDAgJiYgYyAhPSBFT0YpIDsKLSAgICB9Ci0gICAgaWYgKChmbGFncyAmIENPTU1FTlQpICE9IDApIHsgICAvKiBza2lwIHRoZSAuZ3ogZmlsZSBjb21tZW50ICovCi0gICAgICAgIHdoaWxlICgoYyA9IGdldF9ieXRlKHMpKSAhPSAwICYmIGMgIT0gRU9GKSA7Ci0gICAgfQotICAgIGlmICgoZmxhZ3MgJiBIRUFEX0NSQykgIT0gMCkgeyAgLyogc2tpcCB0aGUgaGVhZGVyIGNyYyAqLwotICAgICAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IDI7IGxlbisrKSAodm9pZClnZXRfYnl0ZShzKTsKLSAgICB9Ci0gICAgcy0+el9lcnIgPSBzLT56X2VvZiA/IFpfREFUQV9FUlJPUiA6IFpfT0s7Ci19Ci0KLSAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENsZWFudXAgdGhlbiBmcmVlIHRoZSBnaXZlbiBnel9zdHJlYW0uIFJldHVybiBhIHpsaWIgZXJyb3IgY29kZS4KLSAgIFRyeSBmcmVlaW5nIGluIHRoZSByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb25zLgotICovCi1sb2NhbCBpbnQgZGVzdHJveSAocykKLSAgICBnel9zdHJlYW0gKnM7Ci17Ci0gICAgaW50IGVyciA9IFpfT0s7Ci0KLSAgICBpZiAoIXMpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIFRSWUZSRUUocy0+bXNnKTsKLQotICAgIGlmIChzLT5zdHJlYW0uc3RhdGUgIT0gTlVMTCkgewotICAgICAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKLSNpZmRlZiBOT19HWkNPTVBSRVNTCi0gICAgICAgICAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKLSNlbHNlCi0gICAgICAgICAgICBlcnIgPSBkZWZsYXRlRW5kKCYocy0+c3RyZWFtKSk7Ci0jZW5kaWYKLSAgICAgICAgfSBlbHNlIGlmIChzLT5tb2RlID09ICdyJykgewotICAgICAgICAgICAgZXJyID0gaW5mbGF0ZUVuZCgmKHMtPnN0cmVhbSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChzLT5maWxlICE9IE5VTEwgJiYgZmNsb3NlKHMtPmZpbGUpKSB7Ci0jaWZkZWYgRVNQSVBFCi0gICAgICAgIGlmIChlcnJubyAhPSBFU1BJUEUpIC8qIGZjbG9zZSBpcyBicm9rZW4gZm9yIHBpcGVzIGluIEhQL1VYICovCi0jZW5kaWYKLSAgICAgICAgICAgIGVyciA9IFpfRVJSTk87Ci0gICAgfQotICAgIGlmIChzLT56X2VyciA8IDApIGVyciA9IHMtPnpfZXJyOwotCi0gICAgVFJZRlJFRShzLT5pbmJ1Zik7Ci0gICAgVFJZRlJFRShzLT5vdXRidWYpOwotICAgIFRSWUZSRUUocy0+cGF0aCk7Ci0gICAgVFJZRlJFRShzKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgUmVhZHMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLgotICAgZ3pyZWFkIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkICgwIGZvciBlbmQgb2YgZmlsZSkuCi0qLwotaW50IFpFWFBPUlQgZ3pyZWFkIChmaWxlLCBidWYsIGxlbikKLSAgICBnekZpbGUgZmlsZTsKLSAgICB2b2lkcCBidWY7Ci0gICAgdW5zaWduZWQgbGVuOwotewotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0gICAgQnl0ZWYgKnN0YXJ0ID0gKEJ5dGVmKilidWY7IC8qIHN0YXJ0aW5nIHBvaW50IGZvciBjcmMgY29tcHV0YXRpb24gKi8KLSAgICBCeXRlICAqbmV4dF9vdXQ7IC8qID09IHN0cmVhbS5uZXh0X291dCBidXQgbm90IGZvcmNlZCBmYXIgKGZvciBNU0RPUykgKi8KLQotICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAncicpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIGlmIChzLT56X2VyciA9PSBaX0RBVEFfRVJST1IgfHwgcy0+el9lcnIgPT0gWl9FUlJOTykgcmV0dXJuIC0xOwotICAgIGlmIChzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQpIHJldHVybiAwOyAgLyogRU9GICovCi0KLSAgICBuZXh0X291dCA9IChCeXRlKilidWY7Ci0gICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gKEJ5dGVmKilidWY7Ci0gICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IGxlbjsKLQotICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfb3V0ICYmIHMtPmJhY2sgIT0gRU9GKSB7Ci0gICAgICAgICpuZXh0X291dCsrID0gcy0+YmFjazsKLSAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0Kys7Ci0gICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQtLTsKLSAgICAgICAgcy0+YmFjayA9IEVPRjsKLSAgICAgICAgcy0+b3V0Kys7Ci0gICAgICAgIHN0YXJ0Kys7Ci0gICAgICAgIGlmIChzLT5sYXN0KSB7Ci0gICAgICAgICAgICBzLT56X2VyciA9IFpfU1RSRUFNX0VORDsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKHMtPnN0cmVhbS5hdmFpbF9vdXQgIT0gMCkgewotCi0gICAgICAgIGlmIChzLT50cmFuc3BhcmVudCkgewotICAgICAgICAgICAgLyogQ29weSBmaXJzdCB0aGUgbG9va2FoZWFkIGJ5dGVzOiAqLwotICAgICAgICAgICAgdUludCBuID0gcy0+c3RyZWFtLmF2YWlsX2luOwotICAgICAgICAgICAgaWYgKG4gPiBzLT5zdHJlYW0uYXZhaWxfb3V0KSBuID0gcy0+c3RyZWFtLmF2YWlsX291dDsKLSAgICAgICAgICAgIGlmIChuID4gMCkgewotICAgICAgICAgICAgICAgIHptZW1jcHkocy0+c3RyZWFtLm5leHRfb3V0LCBzLT5zdHJlYW0ubmV4dF9pbiwgbik7Ci0gICAgICAgICAgICAgICAgbmV4dF9vdXQgKz0gbjsKLSAgICAgICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBuZXh0X291dDsKLSAgICAgICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiAgICs9IG47Ci0gICAgICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX291dCAtPSBuOwotICAgICAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiAgLT0gbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfb3V0ID4gMCkgewotICAgICAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgLT0KLSAgICAgICAgICAgICAgICAgICAgKHVJbnQpZnJlYWQobmV4dF9vdXQsIDEsIHMtPnN0cmVhbS5hdmFpbF9vdXQsIHMtPmZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVuIC09IHMtPnN0cmVhbS5hdmFpbF9vdXQ7Ci0gICAgICAgICAgICBzLT5pbiAgKz0gbGVuOwotICAgICAgICAgICAgcy0+b3V0ICs9IGxlbjsKLSAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgcy0+el9lb2YgPSAxOwotICAgICAgICAgICAgcmV0dXJuIChpbnQpbGVuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfaW4gPT0gMCAmJiAhcy0+el9lb2YpIHsKLQotICAgICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpZnJlYWQocy0+aW5idWYsIDEsIFpfQlVGU0laRSwgcy0+ZmlsZSk7Ci0gICAgICAgICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX2luID09IDApIHsKLSAgICAgICAgICAgICAgICBzLT56X2VvZiA9IDE7Ci0gICAgICAgICAgICAgICAgaWYgKGZlcnJvcihzLT5maWxlKSkgewotICAgICAgICAgICAgICAgICAgICBzLT56X2VyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7Ci0gICAgICAgIH0KLSAgICAgICAgcy0+aW4gKz0gcy0+c3RyZWFtLmF2YWlsX2luOwotICAgICAgICBzLT5vdXQgKz0gcy0+c3RyZWFtLmF2YWlsX291dDsKLSAgICAgICAgcy0+el9lcnIgPSBpbmZsYXRlKCYocy0+c3RyZWFtKSwgWl9OT19GTFVTSCk7Ci0gICAgICAgIHMtPmluIC09IHMtPnN0cmVhbS5hdmFpbF9pbjsKLSAgICAgICAgcy0+b3V0IC09IHMtPnN0cmVhbS5hdmFpbF9vdXQ7Ci0KLSAgICAgICAgaWYgKHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCkgewotICAgICAgICAgICAgLyogQ2hlY2sgQ1JDIGFuZCBvcmlnaW5hbCBzaXplICovCi0gICAgICAgICAgICBzLT5jcmMgPSBjcmMzMihzLT5jcmMsIHN0YXJ0LCAodUludCkocy0+c3RyZWFtLm5leHRfb3V0IC0gc3RhcnQpKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gcy0+c3RyZWFtLm5leHRfb3V0OwotCi0gICAgICAgICAgICBpZiAoZ2V0TG9uZyhzKSAhPSBzLT5jcmMpIHsKLSAgICAgICAgICAgICAgICBzLT56X2VyciA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpZ2V0TG9uZyhzKTsKLSAgICAgICAgICAgICAgICAvKiBUaGUgdW5jb21wcmVzc2VkIGxlbmd0aCByZXR1cm5lZCBieSBhYm92ZSBnZXRsb25nKCkgbWF5IGJlCi0gICAgICAgICAgICAgICAgICogZGlmZmVyZW50IGZyb20gcy0+b3V0IGluIGNhc2Ugb2YgY29uY2F0ZW5hdGVkIC5neiBmaWxlcy4KLSAgICAgICAgICAgICAgICAgKiBDaGVjayBmb3Igc3VjaCBmaWxlczoKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBjaGVja19oZWFkZXIocyk7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPnpfZXJyID09IFpfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgaW5mbGF0ZVJlc2V0KCYocy0+c3RyZWFtKSk7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocy0+el9lcnIgIT0gWl9PSyB8fCBzLT56X2VvZikgYnJlYWs7Ci0gICAgfQotICAgIHMtPmNyYyA9IGNyYzMyKHMtPmNyYywgc3RhcnQsICh1SW50KShzLT5zdHJlYW0ubmV4dF9vdXQgLSBzdGFydCkpOwotCi0gICAgaWYgKGxlbiA9PSBzLT5zdHJlYW0uYXZhaWxfb3V0ICYmCi0gICAgICAgIChzLT56X2VyciA9PSBaX0RBVEFfRVJST1IgfHwgcy0+el9lcnIgPT0gWl9FUlJOTykpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gKGludCkobGVuIC0gcy0+c3RyZWFtLmF2YWlsX291dCk7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICBSZWFkcyBvbmUgYnl0ZSBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZQotICAgb3IgLTEgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4KLSovCi1pbnQgWkVYUE9SVCBnemdldGMoZmlsZSkKLSAgICBnekZpbGUgZmlsZTsKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGM7Ci0KLSAgICByZXR1cm4gZ3pyZWFkKGZpbGUsICZjLCAxKSA9PSAxID8gYyA6IC0xOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgUHVzaCBvbmUgYnl0ZSBiYWNrIG9udG8gdGhlIHN0cmVhbS4KLSovCi1pbnQgWkVYUE9SVCBnenVuZ2V0YyhjLCBmaWxlKQotICAgIGludCBjOwotICAgIGd6RmlsZSBmaWxlOwotewotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0KLSAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InIHx8IGMgPT0gRU9GIHx8IHMtPmJhY2sgIT0gRU9GKSByZXR1cm4gRU9GOwotICAgIHMtPmJhY2sgPSBjOwotICAgIHMtPm91dC0tOwotICAgIHMtPmxhc3QgPSAocy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EKTsKLSAgICBpZiAocy0+bGFzdCkgcy0+el9lcnIgPSBaX09LOwotICAgIHMtPnpfZW9mID0gMDsKLSAgICByZXR1cm4gYzsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZQotICAgcmVhZCwgb3IgYSBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuCi0gICBlbmQtb2YtZmlsZSBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBUaGUgc3RyaW5nIGlzIHRoZW4gdGVybWluYXRlZAotICAgd2l0aCBhIG51bGwgY2hhcmFjdGVyLgotICAgICAgZ3pnZXRzIHJldHVybnMgYnVmLCBvciBaX05VTEwgaW4gY2FzZSBvZiBlcnJvci4KLQotICAgICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgbm90IG9wdGltaXplZCBhdCBhbGwuCi0qLwotY2hhciAqIFpFWFBPUlQgZ3pnZXRzKGZpbGUsIGJ1ZiwgbGVuKQotICAgIGd6RmlsZSBmaWxlOwotICAgIGNoYXIgKmJ1ZjsKLSAgICBpbnQgbGVuOwotewotICAgIGNoYXIgKmIgPSBidWY7Ci0gICAgaWYgKGJ1ZiA9PSBaX05VTEwgfHwgbGVuIDw9IDApIHJldHVybiBaX05VTEw7Ci0KLSAgICB3aGlsZSAoLS1sZW4gPiAwICYmIGd6cmVhZChmaWxlLCBidWYsIDEpID09IDEgJiYgKmJ1ZisrICE9ICdcbicpIDsKLSAgICAqYnVmID0gJ1wwJzsKLSAgICByZXR1cm4gYiA9PSBidWYgJiYgbGVuID4gMCA/IFpfTlVMTCA6IGI7Ci19Ci0KLQotI2lmbmRlZiBOT19HWkNPTVBSRVNTCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuCi0qLwotaW50IFpFWFBPUlQgZ3p3cml0ZSAoZmlsZSwgYnVmLCBsZW4pCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgdm9pZHBjIGJ1ZjsKLSAgICB1bnNpZ25lZCBsZW47Ci17Ci0gICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKLQotICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAndycpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIHMtPnN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilidWY7Ci0gICAgcy0+c3RyZWFtLmF2YWlsX2luID0gbGVuOwotCi0gICAgd2hpbGUgKHMtPnN0cmVhbS5hdmFpbF9pbiAhPSAwKSB7Ci0KLSAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgewotCi0gICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBzLT5vdXRidWY7Ci0gICAgICAgICAgICBpZiAoZndyaXRlKHMtPm91dGJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKSAhPSBaX0JVRlNJWkUpIHsKLSAgICAgICAgICAgICAgICBzLT56X2VyciA9IFpfRVJSTk87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gWl9CVUZTSVpFOwotICAgICAgICB9Ci0gICAgICAgIHMtPmluICs9IHMtPnN0cmVhbS5hdmFpbF9pbjsKLSAgICAgICAgcy0+b3V0ICs9IHMtPnN0cmVhbS5hdmFpbF9vdXQ7Ci0gICAgICAgIHMtPnpfZXJyID0gZGVmbGF0ZSgmKHMtPnN0cmVhbSksIFpfTk9fRkxVU0gpOwotICAgICAgICBzLT5pbiAtPSBzLT5zdHJlYW0uYXZhaWxfaW47Ci0gICAgICAgIHMtPm91dCAtPSBzLT5zdHJlYW0uYXZhaWxfb3V0OwotICAgICAgICBpZiAocy0+el9lcnIgIT0gWl9PSykgYnJlYWs7Ci0gICAgfQotICAgIHMtPmNyYyA9IGNyYzMyKHMtPmNyYywgKGNvbnN0IEJ5dGVmICopYnVmLCBsZW4pOwotCi0gICAgcmV0dXJuIChpbnQpKGxlbiAtIHMtPnN0cmVhbS5hdmFpbF9pbik7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIENvbnZlcnRzLCBmb3JtYXRzLCBhbmQgd3JpdGVzIHRoZSBhcmdzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgdW5kZXIKLSAgIGNvbnRyb2wgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGFzIGluIGZwcmludGYuIGd6cHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZgotICAgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuCi0qLwotI2lmZGVmIFNUREMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotaW50IFpFWFBPUlRWQSBnenByaW50ZiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLyogYXJncyAqLyAuLi4pCi17Ci0gICAgY2hhciBidWZbWl9QUklOVEZfQlVGU0laRV07Ci0gICAgdmFfbGlzdCB2YTsKLSAgICBpbnQgbGVuOwotCi0gICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwotICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotI2lmZGVmIE5PX3ZzbnByaW50ZgotIyAgaWZkZWYgSEFTX3ZzcHJpbnRmX3ZvaWQKLSAgICAodm9pZCl2c3ByaW50ZihidWYsIGZvcm1hdCwgdmEpOwotICAgIHZhX2VuZCh2YSk7Ci0gICAgZm9yIChsZW4gPSAwOyBsZW4gPCBzaXplb2YoYnVmKTsgbGVuKyspCi0gICAgICAgIGlmIChidWZbbGVuXSA9PSAwKSBicmVhazsKLSMgIGVsc2UKLSAgICBsZW4gPSB2c3ByaW50ZihidWYsIGZvcm1hdCwgdmEpOwotICAgIHZhX2VuZCh2YSk7Ci0jICBlbmRpZgotI2Vsc2UKLSMgIGlmZGVmIEhBU192c25wcmludGZfdm9pZAotICAgICh2b2lkKXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIHZhKTsKLSAgICB2YV9lbmQodmEpOwotICAgIGxlbiA9IHN0cmxlbihidWYpOwotIyAgZWxzZQotICAgIGxlbiA9IHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIHZhKTsKLSAgICB2YV9lbmQodmEpOwotIyAgZW5kaWYKLSNlbmRpZgotICAgIGlmIChsZW4gPD0gMCB8fCBsZW4gPj0gKGludClzaXplb2YoYnVmKSB8fCBidWZbc2l6ZW9mKGJ1ZikgLSAxXSAhPSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZ3p3cml0ZShmaWxlLCBidWYsICh1bnNpZ25lZClsZW4pOwotfQotI2Vsc2UgLyogbm90IEFOU0kgQyAqLwotCi1pbnQgWkVYUE9SVFZBIGd6cHJpbnRmIChmaWxlLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwKLSAgICAgICAgICAgICAgICAgICAgICAgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKQotICAgIGd6RmlsZSBmaWxlOwotICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICBpbnQgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLAotICAgICAgICBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjA7Ci17Ci0gICAgY2hhciBidWZbWl9QUklOVEZfQlVGU0laRV07Ci0gICAgaW50IGxlbjsKLQotICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKLSNpZmRlZiBOT19zbnByaW50ZgotIyAgaWZkZWYgSEFTX3NwcmludGZfdm9pZAotICAgIHNwcmludGYoYnVmLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKLSAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7Ci0gICAgZm9yIChsZW4gPSAwOyBsZW4gPCBzaXplb2YoYnVmKTsgbGVuKyspCi0gICAgICAgIGlmIChidWZbbGVuXSA9PSAwKSBicmVhazsKLSMgIGVsc2UKLSAgICBsZW4gPSBzcHJpbnRmKGJ1ZiwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCi0gICAgICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKLSMgIGVuZGlmCi0jZWxzZQotIyAgaWZkZWYgSEFTX3NucHJpbnRmX3ZvaWQKLSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKLSAgICAgICAgICAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOwotICAgIGxlbiA9IHN0cmxlbihidWYpOwotIyAgZWxzZQotICAgIGxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAotICAgICAgICAgICAgICAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOwotIyAgZW5kaWYKLSNlbmRpZgotICAgIGlmIChsZW4gPD0gMCB8fCBsZW4gPj0gc2l6ZW9mKGJ1ZikgfHwgYnVmW3NpemVvZihidWYpIC0gMV0gIT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGd6d3JpdGUoZmlsZSwgYnVmLCBsZW4pOwotfQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICBnenB1dGMgcmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KLSovCi1pbnQgWkVYUE9SVCBnenB1dGMoZmlsZSwgYykKLSAgICBnekZpbGUgZmlsZTsKLSAgICBpbnQgYzsKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGNjID0gKHVuc2lnbmVkIGNoYXIpIGM7IC8qIHJlcXVpcmVkIGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKi8KLQotICAgIHJldHVybiBnendyaXRlKGZpbGUsICZjYywgMSkgPT0gMSA/IChpbnQpY2MgOiAtMTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29tcHJlc3NlZCBmaWxlLCBleGNsdWRpbmcKLSAgIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3Rlci4KLSAgICAgIGd6cHV0cyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgotKi8KLWludCBaRVhQT1JUIGd6cHV0cyhmaWxlLCBzKQotICAgIGd6RmlsZSBmaWxlOwotICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gICAgcmV0dXJuIGd6d3JpdGUoZmlsZSwgKGNoYXIqKXMsICh1bnNpZ25lZClzdHJsZW4ocykpOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuIFRoZSBwYXJhbWV0ZXIKLSAgIGZsdXNoIGlzIGFzIGluIHRoZSBkZWZsYXRlKCkgZnVuY3Rpb24uCi0qLwotbG9jYWwgaW50IGRvX2ZsdXNoIChmaWxlLCBmbHVzaCkKLSAgICBnekZpbGUgZmlsZTsKLSAgICBpbnQgZmx1c2g7Ci17Ci0gICAgdUludCBsZW47Ci0gICAgaW50IGRvbmUgPSAwOwotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0KLSAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3cnKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSAwOyAvKiBzaG91bGQgYmUgemVybyBhbHJlYWR5IGFueXdheSAqLwotCi0gICAgZm9yICg7OykgewotICAgICAgICBsZW4gPSBaX0JVRlNJWkUgLSBzLT5zdHJlYW0uYXZhaWxfb3V0OwotCi0gICAgICAgIGlmIChsZW4gIT0gMCkgewotICAgICAgICAgICAgaWYgKCh1SW50KWZ3cml0ZShzLT5vdXRidWYsIDEsIGxlbiwgcy0+ZmlsZSkgIT0gbGVuKSB7Ci0gICAgICAgICAgICAgICAgcy0+el9lcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgICAgIHJldHVybiBaX0VSUk5POwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmOwotICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IFpfQlVGU0laRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG9uZSkgYnJlYWs7Ci0gICAgICAgIHMtPm91dCArPSBzLT5zdHJlYW0uYXZhaWxfb3V0OwotICAgICAgICBzLT56X2VyciA9IGRlZmxhdGUoJihzLT5zdHJlYW0pLCBmbHVzaCk7Ci0gICAgICAgIHMtPm91dCAtPSBzLT5zdHJlYW0uYXZhaWxfb3V0OwotCi0gICAgICAgIC8qIElnbm9yZSB0aGUgc2Vjb25kIG9mIHR3byBjb25zZWN1dGl2ZSBmbHVzaGVzOiAqLwotICAgICAgICBpZiAobGVuID09IDAgJiYgcy0+el9lcnIgPT0gWl9CVUZfRVJST1IpIHMtPnpfZXJyID0gWl9PSzsKLQotICAgICAgICAvKiBkZWZsYXRlIGhhcyBmaW5pc2hlZCBmbHVzaGluZyBvbmx5IHdoZW4gaXQgaGFzbid0IHVzZWQgdXAKLSAgICAgICAgICogYWxsIHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXI6Ci0gICAgICAgICAqLwotICAgICAgICBkb25lID0gKHMtPnN0cmVhbS5hdmFpbF9vdXQgIT0gMCB8fCBzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQpOwotCi0gICAgICAgIGlmIChzLT56X2VyciAhPSBaX09LICYmIHMtPnpfZXJyICE9IFpfU1RSRUFNX0VORCkgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAgcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EID8gWl9PSyA6IHMtPnpfZXJyOwotfQotCi1pbnQgWkVYUE9SVCBnemZsdXNoIChmaWxlLCBmbHVzaCkKLSAgICAgZ3pGaWxlIGZpbGU7Ci0gICAgIGludCBmbHVzaDsKLXsKLSAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOwotICAgIGludCBlcnIgPSBkb19mbHVzaCAoZmlsZSwgZmx1c2gpOwotCi0gICAgaWYgKGVycikgcmV0dXJuIGVycjsKLSAgICBmZmx1c2gocy0+ZmlsZSk7Ci0gICAgcmV0dXJuICBzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQgPyBaX09LIDogcy0+el9lcnI7Ci19Ci0jZW5kaWYgLyogTk9fR1pDT01QUkVTUyAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUgZ2l2ZW4KLSAgIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgICAgZ3pzZWVrIHJldHVybnMgdGhlIHJlc3VsdGluZyBvZmZzZXQgbG9jYXRpb24gYXMgbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbQotICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbSwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KLSAgICAgIFNFRUtfRU5EIGlzIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJucyBlcnJvci4KLSAgICAgIEluIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgZ3pzZWVrIGNhbiBiZSBleHRyZW1lbHkgc2xvdy4KLSovCi16X29mZl90IFpFWFBPUlQgZ3pzZWVrIChmaWxlLCBvZmZzZXQsIHdoZW5jZSkKLSAgICBnekZpbGUgZmlsZTsKLSAgICB6X29mZl90IG9mZnNldDsKLSAgICBpbnQgd2hlbmNlOwotewotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0KLSAgICBpZiAocyA9PSBOVUxMIHx8IHdoZW5jZSA9PSBTRUVLX0VORCB8fAotICAgICAgICBzLT56X2VyciA9PSBaX0VSUk5PIHx8IHMtPnpfZXJyID09IFpfREFUQV9FUlJPUikgewotICAgICAgICByZXR1cm4gLTFMOwotICAgIH0KLQotICAgIGlmIChzLT5tb2RlID09ICd3JykgewotI2lmZGVmIE5PX0daQ09NUFJFU1MKLSAgICAgICAgcmV0dXJuIC0xTDsKLSNlbHNlCi0gICAgICAgIGlmICh3aGVuY2UgPT0gU0VFS19TRVQpIHsKLSAgICAgICAgICAgIG9mZnNldCAtPSBzLT5pbjsKLSAgICAgICAgfQotICAgICAgICBpZiAob2Zmc2V0IDwgMCkgcmV0dXJuIC0xTDsKLQotICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBvZmZzZXQgaXMgdGhlIG51bWJlciBvZiB6ZXJvIGJ5dGVzIHRvIHdyaXRlLiAqLwotICAgICAgICBpZiAocy0+aW5idWYgPT0gWl9OVUxMKSB7Ci0gICAgICAgICAgICBzLT5pbmJ1ZiA9IChCeXRlKilBTExPQyhaX0JVRlNJWkUpOyAvKiBmb3Igc2Vla2luZyAqLwotICAgICAgICAgICAgaWYgKHMtPmluYnVmID09IFpfTlVMTCkgcmV0dXJuIC0xTDsKLSAgICAgICAgICAgIHptZW16ZXJvKHMtPmluYnVmLCBaX0JVRlNJWkUpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChvZmZzZXQgPiAwKSAgewotICAgICAgICAgICAgdUludCBzaXplID0gWl9CVUZTSVpFOwotICAgICAgICAgICAgaWYgKG9mZnNldCA8IFpfQlVGU0laRSkgc2l6ZSA9ICh1SW50KW9mZnNldDsKLQotICAgICAgICAgICAgc2l6ZSA9IGd6d3JpdGUoZmlsZSwgcy0+aW5idWYsIHNpemUpOwotICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIC0xTDsKLQotICAgICAgICAgICAgb2Zmc2V0IC09IHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHMtPmluOwotI2VuZGlmCi0gICAgfQotICAgIC8qIFJlc3Qgb2YgZnVuY3Rpb24gaXMgZm9yIHJlYWRpbmcgb25seSAqLwotCi0gICAgLyogY29tcHV0ZSBhYnNvbHV0ZSBwb3NpdGlvbiAqLwotICAgIGlmICh3aGVuY2UgPT0gU0VFS19DVVIpIHsKLSAgICAgICAgb2Zmc2V0ICs9IHMtPm91dDsKLSAgICB9Ci0gICAgaWYgKG9mZnNldCA8IDApIHJldHVybiAtMUw7Ci0KLSAgICBpZiAocy0+dHJhbnNwYXJlbnQpIHsKLSAgICAgICAgLyogbWFwIHRvIGZzZWVrICovCi0gICAgICAgIHMtPmJhY2sgPSBFT0Y7Ci0gICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IDA7Ci0gICAgICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7Ci0gICAgICAgIGlmIChmc2VlayhzLT5maWxlLCBvZmZzZXQsIFNFRUtfU0VUKSA8IDApIHJldHVybiAtMUw7Ci0KLSAgICAgICAgcy0+aW4gPSBzLT5vdXQgPSBvZmZzZXQ7Ci0gICAgICAgIHJldHVybiBvZmZzZXQ7Ci0gICAgfQotCi0gICAgLyogRm9yIGEgbmVnYXRpdmUgc2VlaywgcmV3aW5kIGFuZCB1c2UgcG9zaXRpdmUgc2VlayAqLwotICAgIGlmIChvZmZzZXQgPj0gcy0+b3V0KSB7Ci0gICAgICAgIG9mZnNldCAtPSBzLT5vdXQ7Ci0gICAgfSBlbHNlIGlmIChnenJld2luZChmaWxlKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xTDsKLSAgICB9Ci0gICAgLyogb2Zmc2V0IGlzIG5vdyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuICovCi0KLSAgICBpZiAob2Zmc2V0ICE9IDAgJiYgcy0+b3V0YnVmID09IFpfTlVMTCkgewotICAgICAgICBzLT5vdXRidWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsKLSAgICAgICAgaWYgKHMtPm91dGJ1ZiA9PSBaX05VTEwpIHJldHVybiAtMUw7Ci0gICAgfQotICAgIGlmIChvZmZzZXQgJiYgcy0+YmFjayAhPSBFT0YpIHsKLSAgICAgICAgcy0+YmFjayA9IEVPRjsKLSAgICAgICAgcy0+b3V0Kys7Ci0gICAgICAgIG9mZnNldC0tOwotICAgICAgICBpZiAocy0+bGFzdCkgcy0+el9lcnIgPSBaX1NUUkVBTV9FTkQ7Ci0gICAgfQotICAgIHdoaWxlIChvZmZzZXQgPiAwKSAgewotICAgICAgICBpbnQgc2l6ZSA9IFpfQlVGU0laRTsKLSAgICAgICAgaWYgKG9mZnNldCA8IFpfQlVGU0laRSkgc2l6ZSA9IChpbnQpb2Zmc2V0OwotCi0gICAgICAgIHNpemUgPSBnenJlYWQoZmlsZSwgcy0+b3V0YnVmLCAodUludClzaXplKTsKLSAgICAgICAgaWYgKHNpemUgPD0gMCkgcmV0dXJuIC0xTDsKLSAgICAgICAgb2Zmc2V0IC09IHNpemU7Ci0gICAgfQotICAgIHJldHVybiBzLT5vdXQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBSZXdpbmRzIGlucHV0IGZpbGUuCi0qLwotaW50IFpFWFBPUlQgZ3pyZXdpbmQgKGZpbGUpCi0gICAgZ3pGaWxlIGZpbGU7Ci17Ci0gICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKLQotICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAncicpIHJldHVybiAtMTsKLQotICAgIHMtPnpfZXJyID0gWl9PSzsKLSAgICBzLT56X2VvZiA9IDA7Ci0gICAgcy0+YmFjayA9IEVPRjsKLSAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSAwOwotICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7Ci0gICAgcy0+Y3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7Ci0gICAgaWYgKCFzLT50cmFuc3BhcmVudCkgKHZvaWQpaW5mbGF0ZVJlc2V0KCZzLT5zdHJlYW0pOwotICAgIHMtPmluID0gMDsKLSAgICBzLT5vdXQgPSAwOwotICAgIHJldHVybiBmc2VlayhzLT5maWxlLCBzLT5zdGFydCwgU0VFS19TRVQpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCi0gICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCi0qLwotel9vZmZfdCBaRVhQT1JUIGd6dGVsbCAoZmlsZSkKLSAgICBnekZpbGUgZmlsZTsKLXsKLSAgICByZXR1cm4gZ3pzZWVrKGZpbGUsIDBMTCwgU0VFS19DVVIpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KLSAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCi0qLwotaW50IFpFWFBPUlQgZ3plb2YgKGZpbGUpCi0gICAgZ3pGaWxlIGZpbGU7Ci17Ci0gICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKLQotICAgIC8qIFdpdGggY29uY2F0ZW5hdGVkIGNvbXByZXNzZWQgZmlsZXMgdGhhdCBjYW4gaGF2ZSBlbWJlZGRlZAotICAgICAqIGNyYyB0cmFpbGVycywgel9lb2YgaXMgbm8gbG9uZ2VyIHRoZSBvbmx5L2Jlc3QgaW5kaWNhdG9yIG9mIEVPRgotICAgICAqIG9uIGEgZ3pfc3RyZWFtLiBIYW5kbGUgZW5kLW9mLXN0cmVhbSBlcnJvciBleHBsaWNpdGx5IGhlcmUuCi0gICAgICovCi0gICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICdyJykgcmV0dXJuIDA7Ci0gICAgaWYgKHMtPnpfZW9mKSByZXR1cm4gMTsKLSAgICByZXR1cm4gcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgUmV0dXJucyAxIGlmIHJlYWRpbmcgYW5kIGRvaW5nIHNvIHRyYW5zcGFyZW50bHksIG90aGVyd2lzZSB6ZXJvLgotKi8KLWludCBaRVhQT1JUIGd6ZGlyZWN0IChmaWxlKQotICAgIGd6RmlsZSBmaWxlOwotewotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0KLSAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InKSByZXR1cm4gMDsKLSAgICByZXR1cm4gcy0+dHJhbnNwYXJlbnQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgT3V0cHV0cyBhIGxvbmcgaW4gTFNCIG9yZGVyIHRvIHRoZSBnaXZlbiBmaWxlCi0qLwotbG9jYWwgdm9pZCBwdXRMb25nIChmaWxlLCB4KQotICAgIEZJTEUgKmZpbGU7Ci0gICAgdUxvbmcgeDsKLXsKLSAgICBpbnQgbjsKLSAgICBmb3IgKG4gPSAwOyBuIDwgNDsgbisrKSB7Ci0gICAgICAgIGZwdXRjKChpbnQpKHggJiAweGZmKSwgZmlsZSk7Ci0gICAgICAgIHggPj49IDg7Ci0gICAgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIFJlYWRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgZnJvbSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBTZXRzIHpfZXJyIGluIGNhc2UKLSAgIG9mIGVycm9yLgotKi8KLWxvY2FsIHVMb25nIGdldExvbmcgKHMpCi0gICAgZ3pfc3RyZWFtICpzOwotewotICAgIHVMb25nIHggPSAodUxvbmcpZ2V0X2J5dGUocyk7Ci0gICAgaW50IGM7Ci0KLSAgICB4ICs9ICgodUxvbmcpZ2V0X2J5dGUocykpPDw4OwotICAgIHggKz0gKCh1TG9uZylnZXRfYnl0ZShzKSk8PDE2OwotICAgIGMgPSBnZXRfYnl0ZShzKTsKLSAgICBpZiAoYyA9PSBFT0YpIHMtPnpfZXJyID0gWl9EQVRBX0VSUk9SOwotICAgIHggKz0gKCh1TG9uZyljKTw8MjQ7Ci0gICAgcmV0dXJuIHg7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCi0gICBhbmQgZGVhbGxvY2F0ZXMgYWxsIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuCi0qLwotaW50IFpFWFBPUlQgZ3pjbG9zZSAoZmlsZSkKLSAgICBnekZpbGUgZmlsZTsKLXsKLSAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOwotCi0gICAgaWYgKHMgPT0gTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgaWYgKHMtPm1vZGUgPT0gJ3cnKSB7Ci0jaWZkZWYgTk9fR1pDT01QUkVTUwotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0jZWxzZQotICAgICAgICBpZiAoZG9fZmx1c2ggKGZpbGUsIFpfRklOSVNIKSAhPSBaX09LKQotICAgICAgICAgICAgcmV0dXJuIGRlc3Ryb3koKGd6X3N0cmVhbSopZmlsZSk7Ci0KLSAgICAgICAgcHV0TG9uZyAocy0+ZmlsZSwgcy0+Y3JjKTsKLSAgICAgICAgcHV0TG9uZyAocy0+ZmlsZSwgKHVMb25nKShzLT5pbiAmIDB4ZmZmZmZmZmYpKTsKLSNlbmRpZgotICAgIH0KLSAgICByZXR1cm4gZGVzdHJveSgoZ3pfc3RyZWFtKilmaWxlKTsKLX0KLQotI2lmZGVmIFNUREMKLSMgIGRlZmluZSB6c3RyZXJyb3IoZXJybnVtKSBzdHJlcnJvcihlcnJudW0pCi0jZWxzZQotIyAgZGVmaW5lIHpzdHJlcnJvcihlcnJudW0pICIiCi0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgotICAgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksCi0gICBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubwotICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgotKi8KLWNvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IgKGZpbGUsIGVycm51bSkKLSAgICBnekZpbGUgZmlsZTsKLSAgICBpbnQgKmVycm51bTsKLXsKLSAgICBjaGFyICptOwotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0KLSAgICBpZiAocyA9PSBOVUxMKSB7Ci0gICAgICAgICplcnJudW0gPSBaX1NUUkVBTV9FUlJPUjsKLSAgICAgICAgcmV0dXJuIChjb25zdCBjaGFyKilFUlJfTVNHKFpfU1RSRUFNX0VSUk9SKTsKLSAgICB9Ci0gICAgKmVycm51bSA9IHMtPnpfZXJyOwotICAgIGlmICgqZXJybnVtID09IFpfT0spIHJldHVybiAoY29uc3QgY2hhciopIiI7Ci0KLSAgICBtID0gKGNoYXIqKSgqZXJybnVtID09IFpfRVJSTk8gPyB6c3RyZXJyb3IoZXJybm8pIDogcy0+c3RyZWFtLm1zZyk7Ci0KLSAgICBpZiAobSA9PSBOVUxMIHx8ICptID09ICdcMCcpIG0gPSAoY2hhciopRVJSX01TRyhzLT56X2Vycik7Ci0KLSAgICBUUllGUkVFKHMtPm1zZyk7Ci0gICAgcy0+bXNnID0gKGNoYXIqKUFMTE9DKHN0cmxlbihzLT5wYXRoKSArIHN0cmxlbihtKSArIDMpOwotICAgIGlmIChzLT5tc2cgPT0gWl9OVUxMKSByZXR1cm4gKGNvbnN0IGNoYXIqKUVSUl9NU0coWl9NRU1fRVJST1IpOwotICAgIHN0cmNweShzLT5tc2csIHMtPnBhdGgpOwotICAgIHN0cmNhdChzLT5tc2csICI6ICIpOwotICAgIHN0cmNhdChzLT5tc2csIG0pOwotICAgIHJldHVybiAoY29uc3QgY2hhciopcy0+bXNnOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgQ2xlYXIgdGhlIGVycm9yIGFuZCBlbmQtb2YtZmlsZSBmbGFncywgYW5kIGRvIHRoZSBzYW1lIGZvciB0aGUgcmVhbCBmaWxlLgotKi8KLXZvaWQgWkVYUE9SVCBnemNsZWFyZXJyIChmaWxlKQotICAgIGd6RmlsZSBmaWxlOwotewotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0KLSAgICBpZiAocyA9PSBOVUxMKSByZXR1cm47Ci0gICAgaWYgKHMtPnpfZXJyICE9IFpfU1RSRUFNX0VORCkgcy0+el9lcnIgPSBaX09LOwotICAgIHMtPnpfZW9mID0gMDsKLSAgICBjbGVhcmVycihzLT5maWxlKTsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9pbmZiYWNrLmMgYi9saWJzL3psaWIvaW5mYmFjay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTVkYmM5Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9pbmZiYWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotLyogaW5mYmFjay5jIC0tIGluZmxhdGUgdXNpbmcgYSBjYWxsLWJhY2sgaW50ZXJmYWNlCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyoKLSAgIFRoaXMgY29kZSBpcyBsYXJnZWx5IGNvcGllZCBmcm9tIGluZmxhdGUuYy4gIE5vcm1hbGx5IGVpdGhlciBpbmZiYWNrLm8gb3IKLSAgIGluZmxhdGUubyB3b3VsZCBiZSBsaW5rZWQgaW50byBhbiBhcHBsaWNhdGlvbi0tbm90IGJvdGguICBUaGUgaW50ZXJmYWNlCi0gICB3aXRoIGluZmZhc3QuYyBpcyByZXRhaW5lZCBzbyB0aGF0IG9wdGltaXplZCBhc3NlbWJsZXItY29kZWQgdmVyc2lvbnMgb2YKLSAgIGluZmxhdGVfZmFzdCgpIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIGluZmxhdGUuYyBvciBpbmZiYWNrLmMuCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZsYXRlLmgiCi0jaW5jbHVkZSAiaW5mZmFzdC5oIgotCi0vKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1sb2NhbCB2b2lkIGZpeGVkdGFibGVzIE9GKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlKSk7Ci0KLS8qCi0gICBzdHJtIHByb3ZpZGVzIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBpbiB6YWxsb2MgYW5kIHpmcmVlLCBvcgotICAgWl9OVUxMIHRvIHVzZSB0aGUgbGlicmFyeSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCi0KLSAgIHdpbmRvd0JpdHMgaXMgaW4gdGhlIHJhbmdlIDguLjE1LCBhbmQgd2luZG93IGlzIGEgdXNlci1zdXBwbGllZAotICAgd2luZG93IGFuZCBvdXRwdXQgYnVmZmVyIHRoYXQgaXMgMioqd2luZG93Qml0cyBieXRlcy4KLSAqLwotaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0XyhzdHJtLCB3aW5kb3dCaXRzLCB3aW5kb3csIHZlcnNpb24sIHN0cmVhbV9zaXplKQotel9zdHJlYW1wIHN0cm07Ci1pbnQgd2luZG93Qml0czsKLXVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7Ci1jb25zdCBjaGFyICp2ZXJzaW9uOwotaW50IHN0cmVhbV9zaXplOwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0KLSAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKLSAgICAgICAgc3RyZWFtX3NpemUgIT0gKGludCkoc2l6ZW9mKHpfc3RyZWFtKSkpCi0gICAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7Ci0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHdpbmRvdyA9PSBaX05VTEwgfHwKLSAgICAgICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KLSAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKLSAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKLSAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOwotICAgIH0KLSAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilaQUxMT0Moc3RybSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7Ci0gICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7Ci0gICAgc3RybS0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKXN0YXRlOwotICAgIHN0YXRlLT5kbWF4ID0gMzI3NjhVOwotICAgIHN0YXRlLT53Yml0cyA9IHdpbmRvd0JpdHM7Ci0gICAgc3RhdGUtPndzaXplID0gMVUgPDwgd2luZG93Qml0czsKLSAgICBzdGF0ZS0+d2luZG93ID0gd2luZG93OwotICAgIHN0YXRlLT53cml0ZSA9IDA7Ci0gICAgc3RhdGUtPndoYXZlID0gMDsKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotLyoKLSAgIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG8KLSAgIGZpeGVkIGNvZGUgZGVjb2RpbmcuICBOb3JtYWxseSB0aGlzIHJldHVybnMgZml4ZWQgdGFibGVzIGZyb20gaW5mZml4ZWQuaC4KLSAgIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGUKLSAgIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmQKLSAgIHRoZXJlYWZ0ZXIuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvZGUgYnkgYWJvdXQgMksgYnl0ZXMsIGluCi0gICBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmUKLSAgIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW4KLSAgIG1heSBub3QgYmUgdGhyZWFkLXNhZmUuCi0gKi8KLWxvY2FsIHZvaWQgZml4ZWR0YWJsZXMoc3RhdGUpCi1zdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotewotI2lmZGVmIEJVSUxERklYRUQKLSAgICBzdGF0aWMgaW50IHZpcmdpbiA9IDE7Ci0gICAgc3RhdGljIGNvZGUgKmxlbmZpeCwgKmRpc3RmaXg7Ci0gICAgc3RhdGljIGNvZGUgZml4ZWRbNTQ0XTsKLQotICAgIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovCi0gICAgaWYgKHZpcmdpbikgewotICAgICAgICB1bnNpZ25lZCBzeW0sIGJpdHM7Ci0gICAgICAgIHN0YXRpYyBjb2RlICpuZXh0OwotCi0gICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovCi0gICAgICAgIHN5bSA9IDA7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAxNDQpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAyNTYpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDk7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAyODApIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDc7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAyODgpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7Ci0gICAgICAgIG5leHQgPSBmaXhlZDsKLSAgICAgICAgbGVuZml4ID0gbmV4dDsKLSAgICAgICAgYml0cyA9IDk7Ci0gICAgICAgIGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIDI4OCwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOwotCi0gICAgICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCi0gICAgICAgIHN5bSA9IDA7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAzMikgc3RhdGUtPmxlbnNbc3ltKytdID0gNTsKLSAgICAgICAgZGlzdGZpeCA9IG5leHQ7Ci0gICAgICAgIGJpdHMgPSA1OwotICAgICAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucywgMzIsICYobmV4dCksICYoYml0cyksIHN0YXRlLT53b3JrKTsKLQotICAgICAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqLwotICAgICAgICB2aXJnaW4gPSAwOwotICAgIH0KLSNlbHNlIC8qICFCVUlMREZJWEVEICovCi0jICAgaW5jbHVkZSAiaW5mZml4ZWQuaCIKLSNlbmRpZiAvKiBCVUlMREZJWEVEICovCi0gICAgc3RhdGUtPmxlbmNvZGUgPSBsZW5maXg7Ci0gICAgc3RhdGUtPmxlbmJpdHMgPSA5OwotICAgIHN0YXRlLT5kaXN0Y29kZSA9IGRpc3RmaXg7Ci0gICAgc3RhdGUtPmRpc3RiaXRzID0gNTsKLX0KLQotLyogTWFjcm9zIGZvciBpbmZsYXRlQmFjaygpOiAqLwotCi0vKiBMb2FkIHJldHVybmVkIHN0YXRlIGZyb20gaW5mbGF0ZV9mYXN0KCkgKi8KLSNkZWZpbmUgTE9BRCgpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgcHV0ID0gc3RybS0+bmV4dF9vdXQ7IFwKLSAgICAgICAgbGVmdCA9IHN0cm0tPmF2YWlsX291dDsgXAotICAgICAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsgXAotICAgICAgICBoYXZlID0gc3RybS0+YXZhaWxfaW47IFwKLSAgICAgICAgaG9sZCA9IHN0YXRlLT5ob2xkOyBcCi0gICAgICAgIGJpdHMgPSBzdGF0ZS0+Yml0czsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIFNldCBzdGF0ZSBmcm9tIHJlZ2lzdGVycyBmb3IgaW5mbGF0ZV9mYXN0KCkgKi8KLSNkZWZpbmUgUkVTVE9SRSgpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBwdXQ7IFwKLSAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVmdDsgXAotICAgICAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsgXAotICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7IFwKLSAgICAgICAgc3RhdGUtPmhvbGQgPSBob2xkOyBcCi0gICAgICAgIHN0YXRlLT5iaXRzID0gYml0czsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIENsZWFyIHRoZSBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgSU5JVEJJVFMoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhvbGQgPSAwOyBcCi0gICAgICAgIGJpdHMgPSAwOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogQXNzdXJlIHRoYXQgc29tZSBpbnB1dCBpcyBhdmFpbGFibGUuICBJZiBpbnB1dCBpcyByZXF1ZXN0ZWQsIGJ1dCBkZW5pZWQsCi0gICB0aGVuIHJldHVybiBhIFpfQlVGX0VSUk9SIGZyb20gaW5mbGF0ZUJhY2soKS4gKi8KLSNkZWZpbmUgUFVMTCgpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaWYgKGhhdmUgPT0gMCkgeyBcCi0gICAgICAgICAgICBoYXZlID0gaW4oaW5fZGVzYywgJm5leHQpOyBcCi0gICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSB7IFwKLSAgICAgICAgICAgICAgICBuZXh0ID0gWl9OVUxMOyBcCi0gICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7IFwKLSAgICAgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsgXAotICAgICAgICAgICAgfSBcCi0gICAgICAgIH0gXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIEdldCBhIGJ5dGUgb2YgaW5wdXQgaW50byB0aGUgYml0IGFjY3VtdWxhdG9yLCBvciByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpCi0gICB3aXRoIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gKi8KLSNkZWZpbmUgUFVMTEJZVEUoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIFBVTEwoKTsgXAotICAgICAgICBoYXZlLS07IFwKLSAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKm5leHQrKykgPDwgYml0czsgXAotICAgICAgICBiaXRzICs9IDg7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBBc3N1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgbiBiaXRzIGluIHRoZSBiaXQgYWNjdW11bGF0b3IuICBJZiB0aGVyZSBpcwotICAgbm90IGVub3VnaCBhdmFpbGFibGUgaW5wdXQgdG8gZG8gdGhhdCwgdGhlbiByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpIHdpdGgKLSAgIGFuIGVycm9yLiAqLwotI2RlZmluZSBORUVEQklUUyhuKSBcCi0gICAgZG8geyBcCi0gICAgICAgIHdoaWxlIChiaXRzIDwgKHVuc2lnbmVkKShuKSkgXAotICAgICAgICAgICAgUFVMTEJZVEUoKTsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIFJldHVybiB0aGUgbG93IG4gYml0cyBvZiB0aGUgYml0IGFjY3VtdWxhdG9yIChuIDwgMTYpICovCi0jZGVmaW5lIEJJVFMobikgXAotICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQotCi0vKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBEUk9QQklUUyhuKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhvbGQgPj49IChuKTsgXAotICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KLSNkZWZpbmUgQllURUJJVFMoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCi0gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBBc3N1cmUgdGhhdCBzb21lIG91dHB1dCBzcGFjZSBpcyBhdmFpbGFibGUsIGJ5IHdyaXRpbmcgb3V0IHRoZSB3aW5kb3cKLSAgIGlmIGl0J3MgZnVsbC4gIElmIHRoZSB3cml0ZSBmYWlscywgcmV0dXJuIGZyb20gaW5mbGF0ZUJhY2soKSB3aXRoIGEKLSAgIFpfQlVGX0VSUk9SLiAqLwotI2RlZmluZSBST09NKCkgXAotICAgIGRvIHsgXAotICAgICAgICBpZiAobGVmdCA9PSAwKSB7IFwKLSAgICAgICAgICAgIHB1dCA9IHN0YXRlLT53aW5kb3c7IFwKLSAgICAgICAgICAgIGxlZnQgPSBzdGF0ZS0+d3NpemU7IFwKLSAgICAgICAgICAgIHN0YXRlLT53aGF2ZSA9IGxlZnQ7IFwKLSAgICAgICAgICAgIGlmIChvdXQob3V0X2Rlc2MsIHB1dCwgbGVmdCkpIHsgXAotICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOyBcCi0gICAgICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICB9IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKgotICAgc3RybSBwcm92aWRlcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGFuZCB3aW5kb3cgYnVmZmVyIG9uIGlucHV0LAotICAgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSB1bnVzZWQgaW5wdXQgb24gcmV0dXJuLiAgRm9yIFpfREFUQV9FUlJPUgotICAgcmV0dXJucywgc3RybSB3aWxsIGFsc28gcHJvdmlkZSBhbiBlcnJvciBtZXNzYWdlLgotCi0gICBpbigpIGFuZCBvdXQoKSBhcmUgdGhlIGNhbGwtYmFjayBpbnB1dCBhbmQgb3V0cHV0IGZ1bmN0aW9ucy4gIFdoZW4KLSAgIGluZmxhdGVCYWNrKCkgbmVlZHMgbW9yZSBpbnB1dCwgaXQgY2FsbHMgaW4oKS4gIFdoZW4gaW5mbGF0ZUJhY2soKSBoYXMKLSAgIGZpbGxlZCB0aGUgd2luZG93IHdpdGggb3V0cHV0LCBvciB3aGVuIGl0IGNvbXBsZXRlcyB3aXRoIGRhdGEgaW4gdGhlCi0gICB3aW5kb3csIGl0IGNhbGxzIG91dCgpIHRvIHdyaXRlIG91dCB0aGUgZGF0YS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdAotICAgY2hhbmdlIHRoZSBwcm92aWRlZCBpbnB1dCB1bnRpbCBpbigpIGlzIGNhbGxlZCBhZ2FpbiBvciBpbmZsYXRlQmFjaygpCi0gICByZXR1cm5zLiAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGNoYW5nZSB0aGUgd2luZG93L291dHB1dCBidWZmZXIgdW50aWwKLSAgIGluZmxhdGVCYWNrKCkgcmV0dXJucy4KLQotICAgaW4oKSBhbmQgb3V0KCkgYXJlIGNhbGxlZCB3aXRoIGEgZGVzY3JpcHRvciBwYXJhbWV0ZXIgcHJvdmlkZWQgaW4gdGhlCi0gICBpbmZsYXRlQmFjaygpIGNhbGwuICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcyB0aGUKLSAgIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGRvIHRoZSByZWFkIG9yIHdyaXRlLCBhcyB3ZWxsIGFzIGFjY3VtdWxhdGVkCi0gICBpbmZvcm1hdGlvbiBvbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdWNoIGFzIHRvdGFscyBhbmQgY2hlY2sgdmFsdWVzLgotCi0gICBpbigpIHNob3VsZCByZXR1cm4gemVybyBvbiBmYWlsdXJlLiAgb3V0KCkgc2hvdWxkIHJldHVybiBub24temVybyBvbgotICAgZmFpbHVyZS4gIElmIGVpdGhlciBpbigpIG9yIG91dCgpIGZhaWxzLCB0aGFuIGluZmxhdGVCYWNrKCkgcmV0dXJucyBhCi0gICBaX0JVRl9FUlJPUi4gIHN0cm0tPm5leHRfaW4gY2FuIGJlIGNoZWNrZWQgZm9yIFpfTlVMTCB0byBzZWUgd2hldGhlciBpdAotICAgd2FzIGluKCkgb3Igb3V0KCkgdGhhdCBjYXVzZWQgaW4gdGhlIGVycm9yLiAgT3RoZXJ3aXNlLCAgaW5mbGF0ZUJhY2soKQotICAgcmV0dXJucyBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9EQVRBX0VSUk9SIGZvciBhbiBkZWZsYXRlIGZvcm1hdAotICAgZXJyb3IsIG9yIFpfTUVNX0VSUk9SIGlmIGl0IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdGF0ZS4KLSAgIGluZmxhdGVCYWNrKCkgY2FuIGFsc28gcmV0dXJuIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICBhcmUgbm90IGNvcnJlY3QsIGkuZS4gc3RybSBpcyBaX05VTEwgb3IgdGhlIHN0YXRlIHdhcyBub3QgaW5pdGlhbGl6ZWQuCi0gKi8KLWludCBaRVhQT1JUIGluZmxhdGVCYWNrKHN0cm0sIGluLCBpbl9kZXNjLCBvdXQsIG91dF9kZXNjKQotel9zdHJlYW1wIHN0cm07Ci1pbl9mdW5jIGluOwotdm9pZCBGQVIgKmluX2Rlc2M7Ci1vdXRfZnVuYyBvdXQ7Ci12b2lkIEZBUiAqb3V0X2Rlc2M7Ci17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqbmV4dDsgICAgLyogbmV4dCBpbnB1dCAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpwdXQ7ICAgICAvKiBuZXh0IG91dHB1dCAqLwotICAgIHVuc2lnbmVkIGhhdmUsIGxlZnQ7ICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLwotICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLwotICAgIHVuc2lnbmVkIGNvcHk7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCi0gICAgY29kZSB0aGlzOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KLSAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCi0gICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KLSAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgb3JkZXJbMTldID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovCi0gICAgICAgIHsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKLQotICAgIC8qIENoZWNrIHRoYXQgdGhlIHN0cm0gZXhpc3RzIGFuZCB0aGF0IHRoZSBzdGF0ZSB3YXMgaW5pdGlhbGl6ZWQgKi8KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0KLSAgICAvKiBSZXNldCB0aGUgc3RhdGUgKi8KLSAgICBzdHJtLT5tc2cgPSBaX05VTEw7Ci0gICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgIHN0YXRlLT5sYXN0ID0gMDsKLSAgICBzdGF0ZS0+d2hhdmUgPSAwOwotICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOwotICAgIGhhdmUgPSBuZXh0ICE9IFpfTlVMTCA/IHN0cm0tPmF2YWlsX2luIDogMDsKLSAgICBob2xkID0gMDsKLSAgICBiaXRzID0gMDsKLSAgICBwdXQgPSBzdGF0ZS0+d2luZG93OwotICAgIGxlZnQgPSBzdGF0ZS0+d3NpemU7Ci0KLSAgICAvKiBJbmZsYXRlIHVudGlsIGVuZCBvZiBibG9jayBtYXJrZWQgYXMgbGFzdCAqLwotICAgIGZvciAoOzspCi0gICAgICAgIHN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKLSAgICAgICAgY2FzZSBUWVBFOgotICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGFuZCBkaXNwYXRjaCBibG9jayB0eXBlICovCi0gICAgICAgICAgICBpZiAoc3RhdGUtPmxhc3QpIHsKLSAgICAgICAgICAgICAgICBCWVRFQklUUygpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRE9ORTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5FRURCSVRTKDMpOwotICAgICAgICAgICAgc3RhdGUtPmxhc3QgPSBCSVRTKDEpOwotICAgICAgICAgICAgRFJPUEJJVFMoMSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKLSAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLwotICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gU1RPUkVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsgICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBibG9jayAqLwotICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRBQkxFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYmxvY2sgdHlwZSI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEUk9QQklUUygyKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RPUkVEOgotICAgICAgICAgICAgLyogZ2V0IGFuZCB2ZXJpZnkgc3RvcmVkIGJsb2NrIGxlbmd0aCAqLwotICAgICAgICAgICAgQllURUJJVFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLwotICAgICAgICAgICAgTkVFREJJVFMoMzIpOwotICAgICAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPSAoKGhvbGQgPj4gMTYpIF4gMHhmZmZmKSkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZClob2xkICYgMHhmZmZmOwotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XG4iLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoKSk7Ci0gICAgICAgICAgICBJTklUQklUUygpOwotCi0gICAgICAgICAgICAvKiBjb3B5IHN0b3JlZCBibG9jayBmcm9tIGlucHV0IHRvIG91dHB1dCAqLwotICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOwotICAgICAgICAgICAgICAgIFBVTEwoKTsKLSAgICAgICAgICAgICAgICBST09NKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OwotICAgICAgICAgICAgICAgIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsKLSAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKLSAgICAgICAgICAgICAgICBwdXQgKz0gY29weTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcbiIpKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVEFCTEU6Ci0gICAgICAgICAgICAvKiBnZXQgZHluYW1pYyB0YWJsZSBlbnRyaWVzIGRlc2NyaXB0b3IgKi8KLSAgICAgICAgICAgIE5FRURCSVRTKDE0KTsKLSAgICAgICAgICAgIHN0YXRlLT5ubGVuID0gQklUUyg1KSArIDI1NzsKLSAgICAgICAgICAgIERST1BCSVRTKDUpOwotICAgICAgICAgICAgc3RhdGUtPm5kaXN0ID0gQklUUyg1KSArIDE7Ci0gICAgICAgICAgICBEUk9QQklUUyg1KTsKLSAgICAgICAgICAgIHN0YXRlLT5uY29kZSA9IEJJVFMoNCkgKyA0OwotICAgICAgICAgICAgRFJPUEJJVFMoNCk7Ci0jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECi0gICAgICAgICAgICBpZiAoc3RhdGUtPm5sZW4gPiAyODYgfHwgc3RhdGUtPm5kaXN0ID4gMzApIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKLQotICAgICAgICAgICAgLyogZ2V0IGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAobm90IGEgdHlwbykgKi8KLSAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5uY29kZSkgewotICAgICAgICAgICAgICAgIE5FRURCSVRTKDMpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9ICh1bnNpZ25lZCBzaG9ydClCSVRTKDMpOwotICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgMTkpCi0gICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gMDsKLSAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOwotICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOwotICAgICAgICAgICAgc3RhdGUtPmxlbmJpdHMgPSA3OwotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUtPmxlbnMsIDE5LCAmKHN0YXRlLT5uZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKLSAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcbiIpKTsKLQotICAgICAgICAgICAgLyogZ2V0IGxlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy52YWwgPCAxNikgewotICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMpOwotICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9IHRoaXMudmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsID09IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKShzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFsID09IDE3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyA3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgQklUUyg3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSArIGNvcHkgPiBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9ICh1bnNpZ25lZCBzaG9ydClsZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovCi0gICAgICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gQkFEKSBicmVhazsKLQotICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgKi8KLSAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOwotICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOwotICAgICAgICAgICAgc3RhdGUtPmxlbmJpdHMgPSA5OwotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgc3RhdGUtPm5sZW4sICYoc3RhdGUtPm5leHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOwotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+ZGlzdGNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOwotICAgICAgICAgICAgc3RhdGUtPmRpc3RiaXRzID0gNjsKLSAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLT5sZW5zICsgc3RhdGUtPm5sZW4sIHN0YXRlLT5uZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5uZXh0KSwgJihzdGF0ZS0+ZGlzdGJpdHMpLCBzdGF0ZS0+d29yayk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZXMgc2V0IjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgb2tcbiIpKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOwotCi0gICAgICAgIGNhc2UgTEVOOgotICAgICAgICAgICAgLyogdXNlIGluZmxhdGVfZmFzdCgpIGlmIHdlIGhhdmUgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgKi8KLSAgICAgICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHsKLSAgICAgICAgICAgICAgICBSRVNUT1JFKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLT53aGF2ZSA8IHN0YXRlLT53c2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPndoYXZlID0gc3RhdGUtPndzaXplIC0gbGVmdDsKLSAgICAgICAgICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhdGUtPndzaXplKTsKLSAgICAgICAgICAgICAgICBMT0FEKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGdldCBhIGxpdGVyYWwsIGxlbmd0aCwgb3IgZW5kLW9mLWJsb2NrIGNvZGUgKi8KLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOwotICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aGlzLm9wICYmICh0aGlzLm9wICYgMHhmMCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzOwotICAgICAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW2xhc3QudmFsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgdGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKXRoaXMudmFsOwotCi0gICAgICAgICAgICAvKiBwcm9jZXNzIGxpdGVyYWwgKi8KLSAgICAgICAgICAgIGlmICh0aGlzLm9wID09IDApIHsKLSAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIHRoaXMudmFsID49IDB4MjAgJiYgdGhpcy52YWwgPCAweDdmID8KLSAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgdGhpcy52YWwpKTsKLSAgICAgICAgICAgICAgICBST09NKCk7Ci0gICAgICAgICAgICAgICAgKnB1dCsrID0gKHVuc2lnbmVkIGNoYXIpKHN0YXRlLT5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGxlZnQtLTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogcHJvY2VzcyBlbmQgb2YgYmxvY2sgKi8KLSAgICAgICAgICAgIGlmICh0aGlzLm9wICYgMzIpIHsKLSAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlICovCi0gICAgICAgICAgICBpZiAodGhpcy5vcCAmIDY0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogbGVuZ3RoIGNvZGUgLS0gZ2V0IGV4dHJhIGJpdHMsIGlmIGFueSAqLwotICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OwotICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcbiIsIHN0YXRlLT5sZW5ndGgpKTsKLQotICAgICAgICAgICAgLyogZ2V0IGRpc3RhbmNlIGNvZGUgKi8KLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmRpc3Rjb2RlW0JJVFMoc3RhdGUtPmRpc3RiaXRzKV07Ci0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCh0aGlzLm9wICYgMHhmMCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzOwotICAgICAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5kaXN0Y29kZVtsYXN0LnZhbCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOwotICAgICAgICAgICAgaWYgKHRoaXMub3AgJiA2NCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ID0gKHVuc2lnbmVkKXRoaXMudmFsOwotCi0gICAgICAgICAgICAvKiBnZXQgZGlzdGFuY2UgZXh0cmEgYml0cywgaWYgYW55ICovCi0gICAgICAgICAgICBzdGF0ZS0+ZXh0cmEgPSAodW5zaWduZWQpKHRoaXMub3ApICYgMTU7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhICE9IDApIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5vZmZzZXQgKz0gQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgICAgIERST1BCSVRTKHN0YXRlLT5leHRyYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IHN0YXRlLT53c2l6ZSAtIChzdGF0ZS0+d2hhdmUgPCBzdGF0ZS0+d3NpemUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA6IDApKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgc3RhdGUtPm9mZnNldCkpOwotCi0gICAgICAgICAgICAvKiBjb3B5IG1hdGNoIGZyb20gd2luZG93IHRvIG91dHB1dCAqLwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIFJPT00oKTsKLSAgICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPndzaXplIC0gc3RhdGUtPm9mZnNldDsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA8IGxlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCArIGNvcHk7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHkgPSBsZWZ0IC0gY29weTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS0+b2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBjb3B5ID0gbGVmdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS0+bGVuZ3RoKSBjb3B5ID0gc3RhdGUtPmxlbmd0aDsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgKnB1dCsrID0gKmZyb20rKzsKLSAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOwotICAgICAgICAgICAgfSB3aGlsZSAoc3RhdGUtPmxlbmd0aCAhPSAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRE9ORToKLSAgICAgICAgICAgIC8qIGluZmxhdGUgc3RyZWFtIHRlcm1pbmF0ZWQgcHJvcGVybHkgLS0gd3JpdGUgbGVmdG92ZXIgb3V0cHV0ICovCi0gICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7Ci0gICAgICAgICAgICBpZiAobGVmdCA8IHN0YXRlLT53c2l6ZSkgewotICAgICAgICAgICAgICAgIGlmIChvdXQob3V0X2Rlc2MsIHN0YXRlLT53aW5kb3csIHN0YXRlLT53c2l6ZSAtIGxlZnQpKQotICAgICAgICAgICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotCi0gICAgICAgIGNhc2UgQkFEOgotICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOwotICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7Ci0KLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgLyogY2FuJ3QgaGFwcGVuLCBidXQgbWFrZXMgY29tcGlsZXJzIGhhcHB5ICovCi0gICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FUlJPUjsKLSAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICB9Ci0KLSAgICAvKiBSZXR1cm4gdW51c2VkIGlucHV0ICovCi0gIGluZl9sZWF2ZToKLSAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsKLSAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tFbmQoc3RybSkKLXpfc3RyZWFtcCBzdHJtOwotewotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOwotICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7Ci0gICAgcmV0dXJuIFpfT0s7Ci19CmRpZmYgLS1naXQgYS9saWJzL3psaWIvaW5mZmFzdC5jIGIvbGlicy96bGliL2luZmZhc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlZTkyZS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvaW5mZmFzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZsYXRlLmgiCi0jaW5jbHVkZSAiaW5mZmFzdC5oIgotCi0jaWZuZGVmIEFTTUlORgotCi0vKiBBbGxvdyBtYWNoaW5lIGRlcGVuZGVudCBvcHRpbWl6YXRpb24gZm9yIHBvc3QtaW5jcmVtZW50IG9yIHByZS1pbmNyZW1lbnQuCi0gICBCYXNlZCBvbiB0ZXN0aW5nIHRvIGRhdGUsCi0gICBQcmUtaW5jcmVtZW50IHByZWZlcnJlZCBmb3I6Ci0gICAtIFBvd2VyUEMgRzMgKEFkbGVyKQotICAgLSBNSVBTIFI1MDAwIChSYW5kZXJzLVBlaHJzb24pCi0gICBQb3N0LWluY3JlbWVudCBwcmVmZXJyZWQgZm9yOgotICAgLSBub25lCi0gICBObyBtZWFzdXJhYmxlIGRpZmZlcmVuY2U6Ci0gICAtIFBlbnRpdW0gSUlJIChBbmRlcnNvbikKLSAgIC0gTTY4MDYwIChOaWtsKQotICovCi0jaWZkZWYgUE9TVElOQwotIyAgZGVmaW5lIE9GRiAwCi0jICBkZWZpbmUgUFVQKGEpICooYSkrKwotI2Vsc2UKLSMgIGRlZmluZSBPRkYgMQotIyAgZGVmaW5lIFBVUChhKSAqKysoYSkKLSNlbmRpZgotCi0vKgotICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZwotICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzCi0gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLgotICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvcgotICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZQotICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuCi0KLSAgIEVudHJ5IGFzc3VtcHRpb25zOgotCi0gICAgICAgIHN0YXRlLT5tb2RlID09IExFTgotICAgICAgICBzdHJtLT5hdmFpbF9pbiA+PSA2Ci0gICAgICAgIHN0cm0tPmF2YWlsX291dCA+PSAyNTgKLSAgICAgICAgc3RhcnQgPj0gc3RybS0+YXZhaWxfb3V0Ci0gICAgICAgIHN0YXRlLT5iaXRzIDwgOAotCi0gICBPbiByZXR1cm4sIHN0YXRlLT5tb2RlIGlzIG9uZSBvZjoKLQotICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXQKLSAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2sKLSAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGEKLQotICAgTm90ZXM6Ci0KLSAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZQotICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsCi0gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLgotICAgICAgVGhlcmVmb3JlIGlmIHN0cm0tPmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkCi0gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLgotCi0gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4Ci0gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KCkKLSAgICAgIHJlcXVpcmVzIHN0cm0tPmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3IKLSAgICAgIG91dHB1dCBzcGFjZS4KLSAqLwotdm9pZCBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpCi16X3N0cmVhbXAgc3RybTsKLXVuc2lnbmVkIHN0YXJ0OyAgICAgICAgIC8qIGluZmxhdGUoKSdzIHN0YXJ0aW5nIHZhbHVlIGZvciBzdHJtLT5hdmFpbF9vdXQgKi8KLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICppbjsgICAgICAvKiBsb2NhbCBzdHJtLT5uZXh0X2luICovCi0gICAgdW5zaWduZWQgY2hhciBGQVIgKmxhc3Q7ICAgIC8qIHdoaWxlIGluIDwgbGFzdCwgZW5vdWdoIGlucHV0IGF2YWlsYWJsZSAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpvdXQ7ICAgICAvKiBsb2NhbCBzdHJtLT5uZXh0X291dCAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpiZWc7ICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0tPm5leHRfb3V0ICovCi0gICAgdW5zaWduZWQgY2hhciBGQVIgKmVuZDsgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqLwotI2lmZGVmIElORkxBVEVfU1RSSUNUCi0gICAgdW5zaWduZWQgZG1heDsgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqLwotI2VuZGlmCi0gICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLwotICAgIHVuc2lnbmVkIHdoYXZlOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovCi0gICAgdW5zaWduZWQgd3JpdGU7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi8KLSAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogbG9jYWwgc3RybS0+aG9sZCAqLwotICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLT5iaXRzICovCi0gICAgY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAgIC8qIGxvY2FsIHN0cm0tPmxlbmNvZGUgKi8KLSAgICBjb2RlIGNvbnN0IEZBUiAqZGNvZGU7ICAgICAgLyogbG9jYWwgc3RybS0+ZGlzdGNvZGUgKi8KLSAgICB1bnNpZ25lZCBsbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovCi0gICAgdW5zaWduZWQgZG1hc2s7ICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovCi0gICAgY29kZSB0aGlzOyAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqLwotICAgIHVuc2lnbmVkIG9wOyAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi8KLSAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi8KLSAgICB1bnNpZ25lZCBkaXN0OyAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovCi0KLSAgICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqLwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIGluID0gc3RybS0+bmV4dF9pbiAtIE9GRjsKLSAgICBsYXN0ID0gaW4gKyAoc3RybS0+YXZhaWxfaW4gLSA1KTsKLSAgICBvdXQgPSBzdHJtLT5uZXh0X291dCAtIE9GRjsKLSAgICBiZWcgPSBvdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOwotICAgIGVuZCA9IG91dCArIChzdHJtLT5hdmFpbF9vdXQgLSAyNTcpOwotI2lmZGVmIElORkxBVEVfU1RSSUNUCi0gICAgZG1heCA9IHN0YXRlLT5kbWF4OwotI2VuZGlmCi0gICAgd3NpemUgPSBzdGF0ZS0+d3NpemU7Ci0gICAgd2hhdmUgPSBzdGF0ZS0+d2hhdmU7Ci0gICAgd3JpdGUgPSBzdGF0ZS0+d3JpdGU7Ci0gICAgd2luZG93ID0gc3RhdGUtPndpbmRvdzsKLSAgICBob2xkID0gc3RhdGUtPmhvbGQ7Ci0gICAgYml0cyA9IHN0YXRlLT5iaXRzOwotICAgIGxjb2RlID0gc3RhdGUtPmxlbmNvZGU7Ci0gICAgZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7Ci0gICAgbG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsKLSAgICBkbWFzayA9ICgxVSA8PCBzdGF0ZS0+ZGlzdGJpdHMpIC0gMTsKLQotICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaAotICAgICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovCi0gICAgZG8gewotICAgICAgICBpZiAoYml0cyA8IDE1KSB7Ci0gICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOwotICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgIGJpdHMgKz0gODsKLSAgICAgICAgfQotICAgICAgICB0aGlzID0gbGNvZGVbaG9sZCAmIGxtYXNrXTsKLSAgICAgIGRvbGVuOgotICAgICAgICBvcCA9ICh1bnNpZ25lZCkodGhpcy5iaXRzKTsKLSAgICAgICAgaG9sZCA+Pj0gb3A7Ci0gICAgICAgIGJpdHMgLT0gb3A7Ci0gICAgICAgIG9wID0gKHVuc2lnbmVkKSh0aGlzLm9wKTsKLSAgICAgICAgaWYgKG9wID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi8KLSAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgdGhpcy52YWwgPj0gMHgyMCAmJiB0aGlzLnZhbCA8IDB4N2YgPwotICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgotICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgdGhpcy52YWwpKTsKLSAgICAgICAgICAgIFBVUChvdXQpID0gKHVuc2lnbmVkIGNoYXIpKHRoaXMudmFsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi8KLSAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkodGhpcy52YWwpOwotICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi8KLSAgICAgICAgICAgIGlmIChvcCkgewotICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsZW4gKz0gKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOwotICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOwotICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgbGVuKSk7Ci0gICAgICAgICAgICBpZiAoYml0cyA8IDE1KSB7Ci0gICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICBiaXRzICs9IDg7Ci0gICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICBiaXRzICs9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKLSAgICAgICAgICBkb2Rpc3Q6Ci0gICAgICAgICAgICBvcCA9ICh1bnNpZ25lZCkodGhpcy5iaXRzKTsKLSAgICAgICAgICAgIGhvbGQgPj49IG9wOwotICAgICAgICAgICAgYml0cyAtPSBvcDsKLSAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKSh0aGlzLm9wKTsKLSAgICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi8KLSAgICAgICAgICAgICAgICBkaXN0ID0gKHVuc2lnbmVkKSh0aGlzLnZhbCk7Ci0gICAgICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqLwotICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOwotICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRpc3QgKz0gKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOwotI2lmZGVmIElORkxBVEVfU1RSSUNUCi0gICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOwotICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7Ci0gICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgZGlzdCkpOwotICAgICAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKShvdXQgLSBiZWcpOyAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqLwotICAgICAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgaW4gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChvcCA+IHdoYXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gPSB3aW5kb3cgLSBPRkY7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZSA9PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod3JpdGUgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHdyaXRlIC0gb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCAtPSB3cml0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHdpbmRvdyAtIE9GRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGUgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSB3cml0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdyaXRlIC0gb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOwotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovCi0gICAgICAgICAgICAgICAgdGhpcyA9IGRjb2RlW3RoaXMudmFsICsgKGhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpKV07Ci0gICAgICAgICAgICAgICAgZ290byBkb2Rpc3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi8KLSAgICAgICAgICAgIHRoaXMgPSBsY29kZVt0aGlzLnZhbCArIChob2xkICYgKCgxVSA8PCBvcCkgLSAxKSldOwotICAgICAgICAgICAgZ290byBkb2xlbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovCi0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGluIDwgbGFzdCAmJiBvdXQgPCBlbmQpOwotCi0gICAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovCi0gICAgbGVuID0gYml0cyA+PiAzOwotICAgIGluIC09IGxlbjsKLSAgICBiaXRzIC09IGxlbiA8PCAzOwotICAgIGhvbGQgJj0gKDFVIDw8IGJpdHMpIC0gMTsKLQotICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovCi0gICAgc3RybS0+bmV4dF9pbiA9IGluICsgT0ZGOwotICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0ICsgT0ZGOwotICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKShpbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBpbikgOiA1IC0gKGluIC0gbGFzdCkpOwotICAgIHN0cm0tPmF2YWlsX291dCA9ICh1bnNpZ25lZCkob3V0IDwgZW5kID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NyArIChlbmQgLSBvdXQpIDogMjU3IC0gKG91dCAtIGVuZCkpOwotICAgIHN0YXRlLT5ob2xkID0gaG9sZDsKLSAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7Ci0gICAgcmV0dXJuOwotfQotCi0vKgotICAgaW5mbGF0ZV9mYXN0KCkgc3BlZWR1cHMgdGhhdCB0dXJuZWQgb3V0IHNsb3dlciAob24gYSBQb3dlclBDIEczIDc1MENYZSk6Ci0gICAtIFVzaW5nIGJpdCBmaWVsZHMgZm9yIGNvZGUgc3RydWN0dXJlCi0gICAtIERpZmZlcmVudCBvcCBkZWZpbml0aW9uIHRvIGF2b2lkICYgZm9yIGV4dHJhIGJpdHMgKGRvICYgZm9yIHRhYmxlIGJpdHMpCi0gICAtIFRocmVlIHNlcGFyYXRlIGRlY29kaW5nIGRvLWxvb3BzIGZvciBkaXJlY3QsIHdpbmRvdywgYW5kIHdyaXRlID09IDAKLSAgIC0gU3BlY2lhbCBjYXNlIGZvciBkaXN0YW5jZSA+IDEgY29waWVzIHRvIGRvIG92ZXJsYXBwZWQgbG9hZCBhbmQgc3RvcmUgY29weQotICAgLSBFeHBsaWNpdCBicmFuY2ggcHJlZGljdGlvbnMgKGJhc2VkIG9uIG1lYXN1cmVkIGJyYW5jaCBwcm9iYWJpbGl0aWVzKQotICAgLSBEZWZlcnJpbmcgbWF0Y2ggY29weSBhbmQgaW50ZXJzcGVyc2VkIGl0IHdpdGggZGVjb2Rpbmcgc3Vic2VxdWVudCBjb2RlcwotICAgLSBTd2FwcGluZyBsaXRlcmFsL2xlbmd0aCBlbHNlCi0gICAtIFN3YXBwaW5nIHdpbmRvdy9kaXJlY3QgZWxzZQotICAgLSBMYXJnZXIgdW5yb2xsZWQgY29weSBsb29wcyAodGhyZWUgaXMgYWJvdXQgcmlnaHQpCi0gICAtIE1vdmluZyBsZW4gLT0gMyBzdGF0ZW1lbnQgaW50byBtaWRkbGUgb2YgbG9vcAotICovCi0KLSNlbmRpZiAvKiAhQVNNSU5GICovCmRpZmYgLS1naXQgYS9saWJzL3psaWIvaW5mZmFzdC5oIGIvbGlicy96bGliL2luZmZhc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4OGQyZC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvaW5mZmFzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyogaW5mZmFzdC5oIC0tIGhlYWRlciB0byB1c2UgaW5mZmFzdC5jCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLXZvaWQgaW5mbGF0ZV9mYXN0IE9GKCh6X3N0cmVhbXAgc3RybSwgdW5zaWduZWQgc3RhcnQpKTsKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9pbmZmaXhlZC5oIGIvbGlicy96bGliL2luZmZpeGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWQ0YjUuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2luZmZpeGVkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0gICAgLyogaW5mZml4ZWQuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMKLSAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQoKS4KLSAgICAgKi8KLQotICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0Ci0gICAgICAgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kCi0gICAgICAgaXMgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICAgICAqLwotCi0gICAgc3RhdGljIGNvbnN0IGNvZGUgbGVuZml4WzUxMl0gPSB7Ci0gICAgICAgIHs5Niw3LDB9LHswLDgsODB9LHswLDgsMTZ9LHsyMCw4LDExNX0sezE4LDcsMzF9LHswLDgsMTEyfSx7MCw4LDQ4fSwKLSAgICAgICAgezAsOSwxOTJ9LHsxNiw3LDEwfSx7MCw4LDk2fSx7MCw4LDMyfSx7MCw5LDE2MH0sezAsOCwwfSx7MCw4LDEyOH0sCi0gICAgICAgIHswLDgsNjR9LHswLDksMjI0fSx7MTYsNyw2fSx7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NH0sezE5LDcsNTl9LAotICAgICAgICB7MCw4LDEyMH0sezAsOCw1Nn0sezAsOSwyMDh9LHsxNyw3LDE3fSx7MCw4LDEwNH0sezAsOCw0MH0sezAsOSwxNzZ9LAotICAgICAgICB7MCw4LDh9LHswLDgsMTM2fSx7MCw4LDcyfSx7MCw5LDI0MH0sezE2LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sCi0gICAgICAgIHsyMSw4LDIyN30sezE5LDcsNDN9LHswLDgsMTE2fSx7MCw4LDUyfSx7MCw5LDIwMH0sezE3LDcsMTN9LHswLDgsMTAwfSwKLSAgICAgICAgezAsOCwzNn0sezAsOSwxNjh9LHswLDgsNH0sezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMyfSx7MTYsNyw4fSwKLSAgICAgICAgezAsOCw5Mn0sezAsOCwyOH0sezAsOSwxNTJ9LHsyMCw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTZ9LAotICAgICAgICB7MTgsNywyM30sezAsOCwxMDh9LHswLDgsNDR9LHswLDksMTg0fSx7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sCi0gICAgICAgIHswLDksMjQ4fSx7MTYsNywzfSx7MCw4LDgyfSx7MCw4LDE4fSx7MjEsOCwxNjN9LHsxOSw3LDM1fSx7MCw4LDExNH0sCi0gICAgICAgIHswLDgsNTB9LHswLDksMTk2fSx7MTcsNywxMX0sezAsOCw5OH0sezAsOCwzNH0sezAsOSwxNjR9LHswLDgsMn0sCi0gICAgICAgIHswLDgsMTMwfSx7MCw4LDY2fSx7MCw5LDIyOH0sezE2LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDh9LAotICAgICAgICB7MjAsNyw2N30sezAsOCwxMjJ9LHswLDgsNTh9LHswLDksMjEyfSx7MTgsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LAotICAgICAgICB7MCw5LDE4MH0sezAsOCwxMH0sezAsOCwxMzh9LHswLDgsNzR9LHswLDksMjQ0fSx7MTYsNyw1fSx7MCw4LDg2fSwKLSAgICAgICAgezAsOCwyMn0sezY0LDgsMH0sezE5LDcsNTF9LHswLDgsMTE4fSx7MCw4LDU0fSx7MCw5LDIwNH0sezE3LDcsMTV9LAotICAgICAgICB7MCw4LDEwMn0sezAsOCwzOH0sezAsOSwxNzJ9LHswLDgsNn0sezAsOCwxMzR9LHswLDgsNzB9LHswLDksMjM2fSwKLSAgICAgICAgezE2LDcsOX0sezAsOCw5NH0sezAsOCwzMH0sezAsOSwxNTZ9LHsyMCw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sCi0gICAgICAgIHswLDksMjIwfSx7MTgsNywyN30sezAsOCwxMTB9LHswLDgsNDZ9LHswLDksMTg4fSx7MCw4LDE0fSx7MCw4LDE0Mn0sCi0gICAgICAgIHswLDgsNzh9LHswLDksMjUyfSx7OTYsNywwfSx7MCw4LDgxfSx7MCw4LDE3fSx7MjEsOCwxMzF9LHsxOCw3LDMxfSwKLSAgICAgICAgezAsOCwxMTN9LHswLDgsNDl9LHswLDksMTk0fSx7MTYsNywxMH0sezAsOCw5N30sezAsOCwzM30sezAsOSwxNjJ9LAotICAgICAgICB7MCw4LDF9LHswLDgsMTI5fSx7MCw4LDY1fSx7MCw5LDIyNn0sezE2LDcsNn0sezAsOCw4OX0sezAsOCwyNX0sCi0gICAgICAgIHswLDksMTQ2fSx7MTksNyw1OX0sezAsOCwxMjF9LHswLDgsNTd9LHswLDksMjEwfSx7MTcsNywxN30sezAsOCwxMDV9LAotICAgICAgICB7MCw4LDQxfSx7MCw5LDE3OH0sezAsOCw5fSx7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDJ9LHsxNiw3LDR9LAotICAgICAgICB7MCw4LDg1fSx7MCw4LDIxfSx7MTYsOCwyNTh9LHsxOSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDJ9LAotICAgICAgICB7MTcsNywxM30sezAsOCwxMDF9LHswLDgsMzd9LHswLDksMTcwfSx7MCw4LDV9LHswLDgsMTMzfSx7MCw4LDY5fSwKLSAgICAgICAgezAsOSwyMzR9LHsxNiw3LDh9LHswLDgsOTN9LHswLDgsMjl9LHswLDksMTU0fSx7MjAsNyw4M30sezAsOCwxMjV9LAotICAgICAgICB7MCw4LDYxfSx7MCw5LDIxOH0sezE4LDcsMjN9LHswLDgsMTA5fSx7MCw4LDQ1fSx7MCw5LDE4Nn0sezAsOCwxM30sCi0gICAgICAgIHswLDgsMTQxfSx7MCw4LDc3fSx7MCw5LDI1MH0sezE2LDcsM30sezAsOCw4M30sezAsOCwxOX0sezIxLDgsMTk1fSwKLSAgICAgICAgezE5LDcsMzV9LHswLDgsMTE1fSx7MCw4LDUxfSx7MCw5LDE5OH0sezE3LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LAotICAgICAgICB7MCw5LDE2Nn0sezAsOCwzfSx7MCw4LDEzMX0sezAsOCw2N30sezAsOSwyMzB9LHsxNiw3LDd9LHswLDgsOTF9LAotICAgICAgICB7MCw4LDI3fSx7MCw5LDE1MH0sezIwLDcsNjd9LHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNH0sezE4LDcsMTl9LAotICAgICAgICB7MCw4LDEwN30sezAsOCw0M30sezAsOSwxODJ9LHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0Nn0sCi0gICAgICAgIHsxNiw3LDV9LHswLDgsODd9LHswLDgsMjN9LHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOX0sezAsOCw1NX0sCi0gICAgICAgIHswLDksMjA2fSx7MTcsNywxNX0sezAsOCwxMDN9LHswLDgsMzl9LHswLDksMTc0fSx7MCw4LDd9LHswLDgsMTM1fSwKLSAgICAgICAgezAsOCw3MX0sezAsOSwyMzh9LHsxNiw3LDl9LHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU4fSx7MjAsNyw5OX0sCi0gICAgICAgIHswLDgsMTI3fSx7MCw4LDYzfSx7MCw5LDIyMn0sezE4LDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MH0sCi0gICAgICAgIHswLDgsMTV9LHswLDgsMTQzfSx7MCw4LDc5fSx7MCw5LDI1NH0sezk2LDcsMH0sezAsOCw4MH0sezAsOCwxNn0sCi0gICAgICAgIHsyMCw4LDExNX0sezE4LDcsMzF9LHswLDgsMTEyfSx7MCw4LDQ4fSx7MCw5LDE5M30sezE2LDcsMTB9LHswLDgsOTZ9LAotICAgICAgICB7MCw4LDMyfSx7MCw5LDE2MX0sezAsOCwwfSx7MCw4LDEyOH0sezAsOCw2NH0sezAsOSwyMjV9LHsxNiw3LDZ9LAotICAgICAgICB7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NX0sezE5LDcsNTl9LHswLDgsMTIwfSx7MCw4LDU2fSx7MCw5LDIwOX0sCi0gICAgICAgIHsxNyw3LDE3fSx7MCw4LDEwNH0sezAsOCw0MH0sezAsOSwxNzd9LHswLDgsOH0sezAsOCwxMzZ9LHswLDgsNzJ9LAotICAgICAgICB7MCw5LDI0MX0sezE2LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sezIxLDgsMjI3fSx7MTksNyw0M30sezAsOCwxMTZ9LAotICAgICAgICB7MCw4LDUyfSx7MCw5LDIwMX0sezE3LDcsMTN9LHswLDgsMTAwfSx7MCw4LDM2fSx7MCw5LDE2OX0sezAsOCw0fSwKLSAgICAgICAgezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMzfSx7MTYsNyw4fSx7MCw4LDkyfSx7MCw4LDI4fSx7MCw5LDE1M30sCi0gICAgICAgIHsyMCw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTd9LHsxOCw3LDIzfSx7MCw4LDEwOH0sezAsOCw0NH0sCi0gICAgICAgIHswLDksMTg1fSx7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sezAsOSwyNDl9LHsxNiw3LDN9LHswLDgsODJ9LAotICAgICAgICB7MCw4LDE4fSx7MjEsOCwxNjN9LHsxOSw3LDM1fSx7MCw4LDExNH0sezAsOCw1MH0sezAsOSwxOTd9LHsxNyw3LDExfSwKLSAgICAgICAgezAsOCw5OH0sezAsOCwzNH0sezAsOSwxNjV9LHswLDgsMn0sezAsOCwxMzB9LHswLDgsNjZ9LHswLDksMjI5fSwKLSAgICAgICAgezE2LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDl9LHsyMCw3LDY3fSx7MCw4LDEyMn0sezAsOCw1OH0sCi0gICAgICAgIHswLDksMjEzfSx7MTgsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LHswLDksMTgxfSx7MCw4LDEwfSx7MCw4LDEzOH0sCi0gICAgICAgIHswLDgsNzR9LHswLDksMjQ1fSx7MTYsNyw1fSx7MCw4LDg2fSx7MCw4LDIyfSx7NjQsOCwwfSx7MTksNyw1MX0sCi0gICAgICAgIHswLDgsMTE4fSx7MCw4LDU0fSx7MCw5LDIwNX0sezE3LDcsMTV9LHswLDgsMTAyfSx7MCw4LDM4fSx7MCw5LDE3M30sCi0gICAgICAgIHswLDgsNn0sezAsOCwxMzR9LHswLDgsNzB9LHswLDksMjM3fSx7MTYsNyw5fSx7MCw4LDk0fSx7MCw4LDMwfSwKLSAgICAgICAgezAsOSwxNTd9LHsyMCw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sezAsOSwyMjF9LHsxOCw3LDI3fSx7MCw4LDExMH0sCi0gICAgICAgIHswLDgsNDZ9LHswLDksMTg5fSx7MCw4LDE0fSx7MCw4LDE0Mn0sezAsOCw3OH0sezAsOSwyNTN9LHs5Niw3LDB9LAotICAgICAgICB7MCw4LDgxfSx7MCw4LDE3fSx7MjEsOCwxMzF9LHsxOCw3LDMxfSx7MCw4LDExM30sezAsOCw0OX0sezAsOSwxOTV9LAotICAgICAgICB7MTYsNywxMH0sezAsOCw5N30sezAsOCwzM30sezAsOSwxNjN9LHswLDgsMX0sezAsOCwxMjl9LHswLDgsNjV9LAotICAgICAgICB7MCw5LDIyN30sezE2LDcsNn0sezAsOCw4OX0sezAsOCwyNX0sezAsOSwxNDd9LHsxOSw3LDU5fSx7MCw4LDEyMX0sCi0gICAgICAgIHswLDgsNTd9LHswLDksMjExfSx7MTcsNywxN30sezAsOCwxMDV9LHswLDgsNDF9LHswLDksMTc5fSx7MCw4LDl9LAotICAgICAgICB7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDN9LHsxNiw3LDR9LHswLDgsODV9LHswLDgsMjF9LHsxNiw4LDI1OH0sCi0gICAgICAgIHsxOSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDN9LHsxNyw3LDEzfSx7MCw4LDEwMX0sezAsOCwzN30sCi0gICAgICAgIHswLDksMTcxfSx7MCw4LDV9LHswLDgsMTMzfSx7MCw4LDY5fSx7MCw5LDIzNX0sezE2LDcsOH0sezAsOCw5M30sCi0gICAgICAgIHswLDgsMjl9LHswLDksMTU1fSx7MjAsNyw4M30sezAsOCwxMjV9LHswLDgsNjF9LHswLDksMjE5fSx7MTgsNywyM30sCi0gICAgICAgIHswLDgsMTA5fSx7MCw4LDQ1fSx7MCw5LDE4N30sezAsOCwxM30sezAsOCwxNDF9LHswLDgsNzd9LHswLDksMjUxfSwKLSAgICAgICAgezE2LDcsM30sezAsOCw4M30sezAsOCwxOX0sezIxLDgsMTk1fSx7MTksNywzNX0sezAsOCwxMTV9LHswLDgsNTF9LAotICAgICAgICB7MCw5LDE5OX0sezE3LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LHswLDksMTY3fSx7MCw4LDN9LHswLDgsMTMxfSwKLSAgICAgICAgezAsOCw2N30sezAsOSwyMzF9LHsxNiw3LDd9LHswLDgsOTF9LHswLDgsMjd9LHswLDksMTUxfSx7MjAsNyw2N30sCi0gICAgICAgIHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNX0sezE4LDcsMTl9LHswLDgsMTA3fSx7MCw4LDQzfSx7MCw5LDE4M30sCi0gICAgICAgIHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0N30sezE2LDcsNX0sezAsOCw4N30sezAsOCwyM30sCi0gICAgICAgIHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOX0sezAsOCw1NX0sezAsOSwyMDd9LHsxNyw3LDE1fSx7MCw4LDEwM30sCi0gICAgICAgIHswLDgsMzl9LHswLDksMTc1fSx7MCw4LDd9LHswLDgsMTM1fSx7MCw4LDcxfSx7MCw5LDIzOX0sezE2LDcsOX0sCi0gICAgICAgIHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU5fSx7MjAsNyw5OX0sezAsOCwxMjd9LHswLDgsNjN9LHswLDksMjIzfSwKLSAgICAgICAgezE4LDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MX0sezAsOCwxNX0sezAsOCwxNDN9LHswLDgsNzl9LAotICAgICAgICB7MCw5LDI1NX0KLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IGNvZGUgZGlzdGZpeFszMl0gPSB7Ci0gICAgICAgIHsxNiw1LDF9LHsyMyw1LDI1N30sezE5LDUsMTd9LHsyNyw1LDQwOTd9LHsxNyw1LDV9LHsyNSw1LDEwMjV9LAotICAgICAgICB7MjEsNSw2NX0sezI5LDUsMTYzODV9LHsxNiw1LDN9LHsyNCw1LDUxM30sezIwLDUsMzN9LHsyOCw1LDgxOTN9LAotICAgICAgICB7MTgsNSw5fSx7MjYsNSwyMDQ5fSx7MjIsNSwxMjl9LHs2NCw1LDB9LHsxNiw1LDJ9LHsyMyw1LDM4NX0sCi0gICAgICAgIHsxOSw1LDI1fSx7MjcsNSw2MTQ1fSx7MTcsNSw3fSx7MjUsNSwxNTM3fSx7MjEsNSw5N30sezI5LDUsMjQ1Nzd9LAotICAgICAgICB7MTYsNSw0fSx7MjQsNSw3Njl9LHsyMCw1LDQ5fSx7MjgsNSwxMjI4OX0sezE4LDUsMTN9LHsyNiw1LDMwNzN9LAotICAgICAgICB7MjIsNSwxOTN9LHs2NCw1LDB9Ci0gICAgfTsKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9pbmZsYXRlLmMgYi9saWJzL3psaWIvaW5mbGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTJmZGVlLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9pbmZsYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY4ICswLDAgQEAKLS8qIGluZmxhdGUuYyAtLSB6bGliIGRlY29tcHJlc3Npb24KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKgotICogQ2hhbmdlIGhpc3Rvcnk6Ci0gKgotICogMS4yLmJldGEwICAgIDI0IE5vdiAyMDAyCi0gKiAtIEZpcnN0IHZlcnNpb24gLS0gY29tcGxldGUgcmV3cml0ZSBvZiBpbmZsYXRlIHRvIHNpbXBsaWZ5IGNvZGUsIGF2b2lkCi0gKiAgIGNyZWF0aW9uIG9mIHdpbmRvdyB3aGVuIG5vdCBuZWVkZWQsIG1pbmltaXplIHVzZSBvZiB3aW5kb3cgd2hlbiBpdCBpcwotICogICBuZWVkZWQsIG1ha2UgaW5mZmFzdC5jIGV2ZW4gZmFzdGVyLCBpbXBsZW1lbnQgZ3ppcCBkZWNvZGluZywgYW5kIHRvCi0gKiAgIGltcHJvdmUgY29kZSByZWFkYWJpbGl0eSBhbmQgc3R5bGUgb3ZlciB0aGUgcHJldmlvdXMgemxpYiBpbmZsYXRlIGNvZGUKLSAqCi0gKiAxLjIuYmV0YTEgICAgMjUgTm92IDIwMDIKLSAqIC0gVXNlIHBvaW50ZXJzIGZvciBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCBjaGVja2luZyBpbiBpbmZmYXN0LmMKLSAqIC0gUmVtb3ZlIGlucHV0IGFuZCBvdXRwdXQgY291bnRlcnMgaW4gaW5mZmFzdC5jCi0gKiAtIENoYW5nZSBpbmZmYXN0LmMgZW50cnkgYW5kIGxvb3AgZnJvbSBhdmFpbF9pbiA+PSA3IHRvID49IDYKLSAqIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IHNlY29uZCBieXRlIHB1bGwgZnJvbSBsZW5ndGggZXh0cmEgaW4gaW5mZmFzdC5jCi0gKiAtIFVucm9sbCBkaXJlY3QgY29weSB0byB0aHJlZSBjb3BpZXMgcGVyIGxvb3AgaW4gaW5mZmFzdC5jCi0gKgotICogMS4yLmJldGEyICAgIDQgRGVjIDIwMDIKLSAqIC0gQ2hhbmdlIGV4dGVybmFsIHJvdXRpbmUgbmFtZXMgdG8gcmVkdWNlIHBvdGVudGlhbCBjb25mbGljdHMKLSAqIC0gQ29ycmVjdCBmaWxlbmFtZSB0byBpbmZmaXhlZC5oIGZvciBmaXhlZCB0YWJsZXMgaW4gaW5mbGF0ZS5jCi0gKiAtIE1ha2UgaGJ1ZltdIHVuc2lnbmVkIGNoYXIgdG8gbWF0Y2ggcGFyYW1ldGVyIHR5cGUgaW4gaW5mbGF0ZS5jCi0gKiAtIENoYW5nZSBzdHJtLT5uZXh0X291dFstc3RhdGUtPm9mZnNldF0gdG8gKihzdHJtLT5uZXh0X291dCAtIHN0YXRlLT5vZmZzZXQpCi0gKiAgIHRvIGF2b2lkIG5lZ2F0aW9uIHByb2JsZW0gb24gQWxwaGFzICg2NCBiaXQpIGluIGluZmxhdGUuYwotICoKLSAqIDEuMi5iZXRhMyAgICAyMiBEZWMgMjAwMgotICogLSBBZGQgY29tbWVudHMgb24gc3RhdGUtPmJpdHMgYXNzZXJ0aW9uIGluIGluZmZhc3QuYwotICogLSBBZGQgY29tbWVudHMgb24gb3AgZmllbGQgaW4gaW5mdHJlZXMuaAotICogLSBGaXggYnVnIGluIHJldXNlIG9mIGFsbG9jYXRlZCB3aW5kb3cgYWZ0ZXIgaW5mbGF0ZVJlc2V0KCkKLSAqIC0gUmVtb3ZlIGJpdCBmaWVsZHMtLWJhY2sgdG8gYnl0ZSBzdHJ1Y3R1cmUgZm9yIHNwZWVkCi0gKiAtIFJlbW92ZSBkaXN0YW5jZSBleHRyYSA9PSAwIGNoZWNrIGluIGluZmxhdGVfZmFzdCgpLS1vbmx5IGhlbHBzIGZvciBsZW5ndGhzCi0gKiAtIENoYW5nZSBwb3N0LWluY3JlbWVudHMgdG8gcHJlLWluY3JlbWVudHMgaW4gaW5mbGF0ZV9mYXN0KCksIFBQQyBiaWFzZWQ/Ci0gKiAtIEFkZCBjb21waWxlIHRpbWUgb3B0aW9uLCBQT1NUSU5DLCB0byB1c2UgcG9zdC1pbmNyZW1lbnRzIGluc3RlYWQgKEludGVsPykKLSAqIC0gTWFrZSBNQVRDSCBjb3B5IGluIGluZmxhdGUoKSBtdWNoIGZhc3RlciBmb3Igd2hlbiBpbmZsYXRlX2Zhc3QoKSBub3QgdXNlZAotICogLSBVc2UgbG9jYWwgY29waWVzIG9mIHN0cmVhbSBuZXh0IGFuZCBhdmFpbCB2YWx1ZXMsIGFzIHdlbGwgYXMgbG9jYWwgYml0Ci0gKiAgIGJ1ZmZlciBhbmQgYml0IGNvdW50IGluIGluZmxhdGUoKS0tZm9yIHNwZWVkIHdoZW4gaW5mbGF0ZV9mYXN0KCkgbm90IHVzZWQKLSAqCi0gKiAxLjIuYmV0YTQgICAgMSBKYW4gMjAwMwotICogLSBTcGxpdCBwdHIgLSAyNTcgc3RhdGVtZW50cyBpbiBpbmZsYXRlX3RhYmxlKCkgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKLSAqIC0gTW92ZSBhIGNvbW1lbnQgb24gb3V0cHV0IGJ1ZmZlciBzaXplcyBmcm9tIGluZmZhc3QuYyB0byBpbmZsYXRlLmMKLSAqIC0gQWRkIGNvbW1lbnRzIGluIGluZmZhc3QuYyB0byBpbnRyb2R1Y2UgdGhlIGluZmxhdGVfZmFzdCgpIHJvdXRpbmUKLSAqIC0gUmVhcnJhbmdlIHdpbmRvdyBjb3BpZXMgaW4gaW5mbGF0ZV9mYXN0KCkgZm9yIHNwZWVkIGFuZCBzaW1wbGlmaWNhdGlvbgotICogLSBVbnJvbGwgbGFzdCBjb3B5IGZvciB3aW5kb3cgbWF0Y2ggaW4gaW5mbGF0ZV9mYXN0KCkKLSAqIC0gVXNlIGxvY2FsIGNvcGllcyBvZiB3aW5kb3cgdmFyaWFibGVzIGluIGluZmxhdGVfZmFzdCgpIGZvciBzcGVlZAotICogLSBQdWxsIG91dCBjb21tb24gd3JpdGUgPT0gMCBjYXNlIGZvciBzcGVlZCBpbiBpbmZsYXRlX2Zhc3QoKQotICogLSBNYWtlIG9wIGFuZCBsZW4gaW4gaW5mbGF0ZV9mYXN0KCkgdW5zaWduZWQgZm9yIGNvbnNpc3RlbmN5Ci0gKiAtIEFkZCBGQVIgdG8gbGNvZGUgYW5kIGRjb2RlIGRlY2xhcmF0aW9ucyBpbiBpbmZsYXRlX2Zhc3QoKQotICogLSBTaW1wbGlmaWVkIGJhZCBkaXN0YW5jZSBjaGVjayBpbiBpbmZsYXRlX2Zhc3QoKQotICogLSBBZGRlZCBpbmZsYXRlQmFja0luaXQoKSwgaW5mbGF0ZUJhY2soKSwgYW5kIGluZmxhdGVCYWNrRW5kKCkgaW4gbmV3Ci0gKiAgIHNvdXJjZSBmaWxlIGluZmJhY2suYyB0byBwcm92aWRlIGEgY2FsbC1iYWNrIGludGVyZmFjZSB0byBpbmZsYXRlIGZvcgotICogICBwcm9ncmFtcyBsaWtlIGd6aXAgYW5kIHVuemlwIC0tIHVzZXMgd2luZG93IGFzIG91dHB1dCBidWZmZXIgdG8gYXZvaWQKLSAqICAgd2luZG93IGNvcHlpbmcKLSAqCi0gKiAxLjIuYmV0YTUgICAgMSBKYW4gMjAwMwotICogLSBJbXByb3ZlZCBpbmZsYXRlQmFjaygpIGludGVyZmFjZSB0byBhbGxvdyB0aGUgY2FsbGVyIHRvIHByb3ZpZGUgaW5pdGlhbAotICogICBpbnB1dCBpbiBzdHJtLgotICogLSBGaXhlZCBzdG9yZWQgYmxvY2tzIGJ1ZyBpbiBpbmZsYXRlQmFjaygpCi0gKgotICogMS4yLmJldGE2ICAgIDQgSmFuIDIwMDMKLSAqIC0gQWRkZWQgY29tbWVudHMgaW4gaW5mZmFzdC5jIG9uIGVmZmVjdGl2ZW5lc3Mgb2YgUE9TVElOQwotICogLSBUeXBlY2FzdGluZyBhbGwgYXJvdW5kIHRvIHJlZHVjZSBjb21waWxlciB3YXJuaW5ncwotICogLSBDaGFuZ2VkIGxvb3BzIGZyb20gd2hpbGUgKDEpIG9yIGRvIHt9IHdoaWxlICgxKSB0byBmb3IgKDs7KSwgYWdhaW4gdG8KLSAqICAgbWFrZSBjb21waWxlcnMgaGFwcHkKLSAqIC0gQ2hhbmdlZCB0eXBlIG9mIHdpbmRvdyBpbiBpbmZsYXRlQmFja0luaXQoKSB0byB1bnNpZ25lZCBjaGFyICoKLSAqCi0gKiAxLjIuYmV0YTcgICAgMjcgSmFuIDIwMDMKLSAqIC0gQ2hhbmdlZCBtYW55IHR5cGVzIHRvIHVuc2lnbmVkIG9yIHVuc2lnbmVkIHNob3J0IHRvIGF2b2lkIHdhcm5pbmdzCi0gKiAtIEFkZGVkIGluZmxhdGVDb3B5KCkgZnVuY3Rpb24KLSAqCi0gKiAxLjIuMCAgICAgICAgOSBNYXIgMjAwMwotICogLSBDaGFuZ2VkIGluZmxhdGVCYWNrKCkgaW50ZXJmYWNlIHRvIHByb3ZpZGUgc2VwYXJhdGUgb3BhcXVlIGRlc2NyaXB0b3JzCi0gKiAgIGZvciB0aGUgaW4oKSBhbmQgb3V0KCkgZnVuY3Rpb25zCi0gKiAtIENoYW5nZWQgaW5mbGF0ZUJhY2soKSBhcmd1bWVudCBhbmQgaW5fZnVuYyB0eXBlZGVmIHRvIHN3YXAgdGhlIGxlbmd0aAotICogICBhbmQgYnVmZmVyIGFkZHJlc3MgcmV0dXJuIHZhbHVlcyBmb3IgdGhlIGlucHV0IGZ1bmN0aW9uCi0gKiAtIENoZWNrIG5leHRfaW4gYW5kIG5leHRfb3V0IGZvciBaX05VTEwgb24gZW50cnkgdG8gaW5mbGF0ZSgpCi0gKgotICogVGhlIGhpc3RvcnkgZm9yIHZlcnNpb25zIGFmdGVyIDEuMi4wIGFyZSBpbiBDaGFuZ2VMb2cgaW4gemxpYiBkaXN0cmlidXRpb24uCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZsYXRlLmgiCi0jaW5jbHVkZSAiaW5mZmFzdC5oIgotCi0jaWZkZWYgTUFLRUZJWEVECi0jICBpZm5kZWYgQlVJTERGSVhFRAotIyAgICBkZWZpbmUgQlVJTERGSVhFRAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1sb2NhbCB2b2lkIGZpeGVkdGFibGVzIE9GKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlKSk7Ci1sb2NhbCBpbnQgdXBkYXRld2luZG93IE9GKCh6X3N0cmVhbXAgc3RybSwgdW5zaWduZWQgb3V0KSk7Ci0jaWZkZWYgQlVJTERGSVhFRAotICAgdm9pZCBtYWtlZml4ZWQgT0YoKHZvaWQpKTsKLSNlbmRpZgotbG9jYWwgdW5zaWduZWQgc3luY3NlYXJjaCBPRigodW5zaWduZWQgRkFSICpoYXZlLCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7Ci0KLWludCBaRVhQT1JUIGluZmxhdGVSZXNldChzdHJtKQotel9zdHJlYW1wIHN0cm07Ci17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLSAgICBzdHJtLT50b3RhbF9pbiA9IHN0cm0tPnRvdGFsX291dCA9IHN0YXRlLT50b3RhbCA9IDA7Ci0gICAgc3RybS0+bXNnID0gWl9OVUxMOwotICAgIHN0cm0tPmFkbGVyID0gMTsgICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi8KLSAgICBzdGF0ZS0+bW9kZSA9IEhFQUQ7Ci0gICAgc3RhdGUtPmxhc3QgPSAwOwotICAgIHN0YXRlLT5oYXZlZGljdCA9IDA7Ci0gICAgc3RhdGUtPmRtYXggPSAzMjc2OFU7Ci0gICAgc3RhdGUtPmhlYWQgPSBaX05VTEw7Ci0gICAgc3RhdGUtPndzaXplID0gMDsKLSAgICBzdGF0ZS0+d2hhdmUgPSAwOwotICAgIHN0YXRlLT53cml0ZSA9IDA7Ci0gICAgc3RhdGUtPmhvbGQgPSAwOwotICAgIHN0YXRlLT5iaXRzID0gMDsKLSAgICBzdGF0ZS0+bGVuY29kZSA9IHN0YXRlLT5kaXN0Y29kZSA9IHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogcmVzZXRcbiIpKTsKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotaW50IFpFWFBPUlQgaW5mbGF0ZVByaW1lKHN0cm0sIGJpdHMsIHZhbHVlKQotel9zdHJlYW1wIHN0cm07Ci1pbnQgYml0czsKLWludCB2YWx1ZTsKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIGlmIChiaXRzID4gMTYgfHwgc3RhdGUtPmJpdHMgKyBiaXRzID4gMzIpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICB2YWx1ZSAmPSAoMUwgPDwgYml0cykgLSAxOwotICAgIHN0YXRlLT5ob2xkICs9IHZhbHVlIDw8IHN0YXRlLT5iaXRzOwotICAgIHN0YXRlLT5iaXRzICs9IGJpdHM7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8oc3RybSwgd2luZG93Qml0cywgdmVyc2lvbiwgc3RyZWFtX3NpemUpCi16X3N0cmVhbXAgc3RybTsKLWludCB3aW5kb3dCaXRzOwotY29uc3QgY2hhciAqdmVyc2lvbjsKLWludCBzdHJlYW1fc2l6ZTsKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotCi0gICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gWkxJQl9WRVJTSU9OWzBdIHx8Ci0gICAgICAgIHN0cmVhbV9zaXplICE9IChpbnQpKHNpemVvZih6X3N0cmVhbSkpKQotICAgICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOwotICAgIGlmIChzdHJtID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovCi0gICAgaWYgKHN0cm0tPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwKSB7Ci0gICAgICAgIHN0cm0tPnphbGxvYyA9IHpjYWxsb2M7Ci0gICAgICAgIHN0cm0tPm9wYXF1ZSA9ICh2b2lkcGYpMDsKLSAgICB9Ci0gICAgaWYgKHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkgc3RybS0+emZyZWUgPSB6Y2ZyZWU7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopCi0gICAgICAgICAgICBaQUxMT0Moc3RybSwgMSwgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7Ci0gICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7Ci0gICAgc3RybS0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKXN0YXRlOwotICAgIGlmICh3aW5kb3dCaXRzIDwgMCkgewotICAgICAgICBzdGF0ZS0+d3JhcCA9IDA7Ci0gICAgICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0czsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHN0YXRlLT53cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxOwotI2lmZGVmIEdVTlpJUAotICAgICAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB3aW5kb3dCaXRzICY9IDE1OwotI2VuZGlmCi0gICAgfQotICAgIGlmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpIHsKLSAgICAgICAgWkZSRUUoc3RybSwgc3RhdGUpOwotICAgICAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIH0KLSAgICBzdGF0ZS0+d2JpdHMgPSAodW5zaWduZWQpd2luZG93Qml0czsKLSAgICBzdGF0ZS0+d2luZG93ID0gWl9OVUxMOwotICAgIHJldHVybiBpbmZsYXRlUmVzZXQoc3RybSk7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVJbml0XyhzdHJtLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKLXpfc3RyZWFtcCBzdHJtOwotY29uc3QgY2hhciAqdmVyc2lvbjsKLWludCBzdHJlYW1fc2l6ZTsKLXsKLSAgICByZXR1cm4gaW5mbGF0ZUluaXQyXyhzdHJtLCBERUZfV0JJVFMsIHZlcnNpb24sIHN0cmVhbV9zaXplKTsKLX0KLQotLyoKLSAgIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG8KLSAgIGZpeGVkIGNvZGUgZGVjb2RpbmcuICBOb3JtYWxseSB0aGlzIHJldHVybnMgZml4ZWQgdGFibGVzIGZyb20gaW5mZml4ZWQuaC4KLSAgIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGUKLSAgIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmQKLSAgIHRoZXJlYWZ0ZXIuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvZGUgYnkgYWJvdXQgMksgYnl0ZXMsIGluCi0gICBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmUKLSAgIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW4KLSAgIG1heSBub3QgYmUgdGhyZWFkLXNhZmUuCi0gKi8KLWxvY2FsIHZvaWQgZml4ZWR0YWJsZXMoc3RhdGUpCi1zdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotewotI2lmZGVmIEJVSUxERklYRUQKLSAgICBzdGF0aWMgaW50IHZpcmdpbiA9IDE7Ci0gICAgc3RhdGljIGNvZGUgKmxlbmZpeCwgKmRpc3RmaXg7Ci0gICAgc3RhdGljIGNvZGUgZml4ZWRbNTQ0XTsKLQotICAgIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovCi0gICAgaWYgKHZpcmdpbikgewotICAgICAgICB1bnNpZ25lZCBzeW0sIGJpdHM7Ci0gICAgICAgIHN0YXRpYyBjb2RlICpuZXh0OwotCi0gICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovCi0gICAgICAgIHN5bSA9IDA7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAxNDQpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAyNTYpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDk7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAyODApIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDc7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAyODgpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7Ci0gICAgICAgIG5leHQgPSBmaXhlZDsKLSAgICAgICAgbGVuZml4ID0gbmV4dDsKLSAgICAgICAgYml0cyA9IDk7Ci0gICAgICAgIGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIDI4OCwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOwotCi0gICAgICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCi0gICAgICAgIHN5bSA9IDA7Ci0gICAgICAgIHdoaWxlIChzeW0gPCAzMikgc3RhdGUtPmxlbnNbc3ltKytdID0gNTsKLSAgICAgICAgZGlzdGZpeCA9IG5leHQ7Ci0gICAgICAgIGJpdHMgPSA1OwotICAgICAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucywgMzIsICYobmV4dCksICYoYml0cyksIHN0YXRlLT53b3JrKTsKLQotICAgICAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqLwotICAgICAgICB2aXJnaW4gPSAwOwotICAgIH0KLSNlbHNlIC8qICFCVUlMREZJWEVEICovCi0jICAgaW5jbHVkZSAiaW5mZml4ZWQuaCIKLSNlbmRpZiAvKiBCVUlMREZJWEVEICovCi0gICAgc3RhdGUtPmxlbmNvZGUgPSBsZW5maXg7Ci0gICAgc3RhdGUtPmxlbmJpdHMgPSA5OwotICAgIHN0YXRlLT5kaXN0Y29kZSA9IGRpc3RmaXg7Ci0gICAgc3RhdGUtPmRpc3RiaXRzID0gNTsKLX0KLQotI2lmZGVmIE1BS0VGSVhFRAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qCi0gICBXcml0ZSBvdXQgdGhlIGluZmZpeGVkLmggdGhhdCBpcyAjaW5jbHVkZSdkIGFib3ZlLiAgRGVmaW5pbmcgTUFLRUZJWEVEIGFsc28KLSAgIGRlZmluZXMgQlVJTERGSVhFRCwgc28gdGhlIHRhYmxlcyBhcmUgYnVpbHQgb24gdGhlIGZseS4gIG1ha2VmaXhlZCgpIHdyaXRlcwotICAgdGhvc2UgdGFibGVzIHRvIHN0ZG91dCwgd2hpY2ggd291bGQgYmUgcGlwZWQgdG8gaW5mZml4ZWQuaC4gIEEgc21hbGwgcHJvZ3JhbQotICAgY2FuIHNpbXBseSBjYWxsIG1ha2VmaXhlZCB0byBkbyB0aGlzOgotCi0gICAgdm9pZCBtYWtlZml4ZWQodm9pZCk7Ci0KLSAgICBpbnQgbWFpbih2b2lkKQotICAgIHsKLSAgICAgICAgbWFrZWZpeGVkKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgVGhlbiB0aGF0IGNhbiBiZSBsaW5rZWQgd2l0aCB6bGliIGJ1aWx0IHdpdGggTUFLRUZJWEVEIGRlZmluZWQgYW5kIHJ1bjoKLQotICAgIGEub3V0ID4gaW5mZml4ZWQuaAotICovCi12b2lkIG1ha2VmaXhlZCgpCi17Ci0gICAgdW5zaWduZWQgbG93LCBzaXplOwotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIHN0YXRlOwotCi0gICAgZml4ZWR0YWJsZXMoJnN0YXRlKTsKLSAgICBwdXRzKCIgICAgLyogaW5mZml4ZWQuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMiKTsKLSAgICBwdXRzKCIgICAgICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFrZWZpeGVkKCkuIik7Ci0gICAgcHV0cygiICAgICAqLyIpOwotICAgIHB1dHMoIiIpOwotICAgIHB1dHMoIiAgICAvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiIpOwotICAgIHB1dHMoIiAgICAgICBJdCBpcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGxpYnJhcnkgYW5kIGlzIik7Ci0gICAgcHV0cygiICAgICAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4iKTsKLSAgICBwdXRzKCIgICAgICovIik7Ci0gICAgcHV0cygiIik7Ci0gICAgc2l6ZSA9IDFVIDw8IDk7Ci0gICAgcHJpbnRmKCIgICAgc3RhdGljIGNvbnN0IGNvZGUgbGVuZml4WyV1XSA9IHsiLCBzaXplKTsKLSAgICBsb3cgPSAwOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKChsb3cgJSA3KSA9PSAwKSBwcmludGYoIlxuICAgICAgICAiKTsKLSAgICAgICAgcHJpbnRmKCJ7JXUsJXUsJWR9Iiwgc3RhdGUubGVuY29kZVtsb3ddLm9wLCBzdGF0ZS5sZW5jb2RlW2xvd10uYml0cywKLSAgICAgICAgICAgICAgIHN0YXRlLmxlbmNvZGVbbG93XS52YWwpOwotICAgICAgICBpZiAoKytsb3cgPT0gc2l6ZSkgYnJlYWs7Ci0gICAgICAgIHB1dGNoYXIoJywnKTsKLSAgICB9Ci0gICAgcHV0cygiXG4gICAgfTsiKTsKLSAgICBzaXplID0gMVUgPDwgNTsKLSAgICBwcmludGYoIlxuICAgIHN0YXRpYyBjb25zdCBjb2RlIGRpc3RmaXhbJXVdID0geyIsIHNpemUpOwotICAgIGxvdyA9IDA7Ci0gICAgZm9yICg7OykgewotICAgICAgICBpZiAoKGxvdyAlIDYpID09IDApIHByaW50ZigiXG4gICAgICAgICIpOwotICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCBzdGF0ZS5kaXN0Y29kZVtsb3ddLm9wLCBzdGF0ZS5kaXN0Y29kZVtsb3ddLmJpdHMsCi0gICAgICAgICAgICAgICBzdGF0ZS5kaXN0Y29kZVtsb3ddLnZhbCk7Ci0gICAgICAgIGlmICgrK2xvdyA9PSBzaXplKSBicmVhazsKLSAgICAgICAgcHV0Y2hhcignLCcpOwotICAgIH0KLSAgICBwdXRzKCJcbiAgICB9OyIpOwotfQotI2VuZGlmIC8qIE1BS0VGSVhFRCAqLwotCi0vKgotICAgVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZQotICAgcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZAotICAgd2hlbiBhIHdpbmRvdyBpcyBhbHJlYWR5IGluIHVzZSwgb3Igd2hlbiBvdXRwdXQgaGFzIGJlZW4gd3JpdHRlbiBkdXJpbmcgdGhpcwotICAgaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LgotICAgSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnkKLSAgIGlzIGxvYWRlZC4KLQotICAgUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZAotICAgYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvdwotICAgdXBvbiByZXR1cm4gZnJvbSBpbmZsYXRlKCksIGFuZCBzaW5jZSBhbGwgZGlzdGFuY2VzIGFmdGVyIHRoZSBmaXJzdCAzMksgb2YKLSAgIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci4KLSAgIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuCi0gKi8KLWxvY2FsIGludCB1cGRhdGV3aW5kb3coc3RybSwgb3V0KQotel9zdHJlYW1wIHN0cm07Ci11bnNpZ25lZCBvdXQ7Ci17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLSAgICB1bnNpZ25lZCBjb3B5LCBkaXN0OwotCi0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0KLSAgICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovCi0gICAgaWYgKHN0YXRlLT53aW5kb3cgPT0gWl9OVUxMKSB7Ci0gICAgICAgIHN0YXRlLT53aW5kb3cgPSAodW5zaWduZWQgY2hhciBGQVIgKikKLSAgICAgICAgICAgICAgICAgICAgICAgIFpBTExPQyhzdHJtLCAxVSA8PCBzdGF0ZS0+d2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKLSAgICAgICAgaWYgKHN0YXRlLT53aW5kb3cgPT0gWl9OVUxMKSByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBpZiB3aW5kb3cgbm90IGluIHVzZSB5ZXQsIGluaXRpYWxpemUgKi8KLSAgICBpZiAoc3RhdGUtPndzaXplID09IDApIHsKLSAgICAgICAgc3RhdGUtPndzaXplID0gMVUgPDwgc3RhdGUtPndiaXRzOwotICAgICAgICBzdGF0ZS0+d3JpdGUgPSAwOwotICAgICAgICBzdGF0ZS0+d2hhdmUgPSAwOwotICAgIH0KLQotICAgIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqLwotICAgIGNvcHkgPSBvdXQgLSBzdHJtLT5hdmFpbF9vdXQ7Ci0gICAgaWYgKGNvcHkgPj0gc3RhdGUtPndzaXplKSB7Ci0gICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdywgc3RybS0+bmV4dF9vdXQgLSBzdGF0ZS0+d3NpemUsIHN0YXRlLT53c2l6ZSk7Ci0gICAgICAgIHN0YXRlLT53cml0ZSA9IDA7Ci0gICAgICAgIHN0YXRlLT53aGF2ZSA9IHN0YXRlLT53c2l6ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGRpc3QgPSBzdGF0ZS0+d3NpemUgLSBzdGF0ZS0+d3JpdGU7Ci0gICAgICAgIGlmIChkaXN0ID4gY29weSkgZGlzdCA9IGNvcHk7Ci0gICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53cml0ZSwgc3RybS0+bmV4dF9vdXQgLSBjb3B5LCBkaXN0KTsKLSAgICAgICAgY29weSAtPSBkaXN0OwotICAgICAgICBpZiAoY29weSkgewotICAgICAgICAgICAgem1lbWNweShzdGF0ZS0+d2luZG93LCBzdHJtLT5uZXh0X291dCAtIGNvcHksIGNvcHkpOwotICAgICAgICAgICAgc3RhdGUtPndyaXRlID0gY29weTsKLSAgICAgICAgICAgIHN0YXRlLT53aGF2ZSA9IHN0YXRlLT53c2l6ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHN0YXRlLT53cml0ZSArPSBkaXN0OwotICAgICAgICAgICAgaWYgKHN0YXRlLT53cml0ZSA9PSBzdGF0ZS0+d3NpemUpIHN0YXRlLT53cml0ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPndoYXZlIDwgc3RhdGUtPndzaXplKSBzdGF0ZS0+d2hhdmUgKz0gZGlzdDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogTWFjcm9zIGZvciBpbmZsYXRlKCk6ICovCi0KLS8qIGNoZWNrIGZ1bmN0aW9uIHRvIHVzZSBhZGxlcjMyKCkgZm9yIHpsaWIgb3IgY3JjMzIoKSBmb3IgZ3ppcCAqLwotI2lmZGVmIEdVTlpJUAotIyAgZGVmaW5lIFVQREFURShjaGVjaywgYnVmLCBsZW4pIFwKLSAgICAoc3RhdGUtPmZsYWdzID8gY3JjMzIoY2hlY2ssIGJ1ZiwgbGVuKSA6IGFkbGVyMzIoY2hlY2ssIGJ1ZiwgbGVuKSkKLSNlbHNlCi0jICBkZWZpbmUgVVBEQVRFKGNoZWNrLCBidWYsIGxlbikgYWRsZXIzMihjaGVjaywgYnVmLCBsZW4pCi0jZW5kaWYKLQotLyogY2hlY2sgbWFjcm9zIGZvciBoZWFkZXIgY3JjICovCi0jaWZkZWYgR1VOWklQCi0jICBkZWZpbmUgQ1JDMihjaGVjaywgd29yZCkgXAotICAgIGRvIHsgXAotICAgICAgICBoYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpKHdvcmQpOyBcCi0gICAgICAgIGhidWZbMV0gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDgpOyBcCi0gICAgICAgIGNoZWNrID0gY3JjMzIoY2hlY2ssIGhidWYsIDIpOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotIyAgZGVmaW5lIENSQzQoY2hlY2ssIHdvcmQpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSh3b3JkKTsgXAotICAgICAgICBoYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiA4KTsgXAotICAgICAgICBoYnVmWzJdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiAxNik7IFwKLSAgICAgICAgaGJ1ZlszXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gMjQpOyBcCi0gICAgICAgIGNoZWNrID0gY3JjMzIoY2hlY2ssIGhidWYsIDQpOyBcCi0gICAgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0vKiBMb2FkIHJlZ2lzdGVycyB3aXRoIHN0YXRlIGluIGluZmxhdGUoKSBmb3Igc3BlZWQgKi8KLSNkZWZpbmUgTE9BRCgpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgcHV0ID0gc3RybS0+bmV4dF9vdXQ7IFwKLSAgICAgICAgbGVmdCA9IHN0cm0tPmF2YWlsX291dDsgXAotICAgICAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsgXAotICAgICAgICBoYXZlID0gc3RybS0+YXZhaWxfaW47IFwKLSAgICAgICAgaG9sZCA9IHN0YXRlLT5ob2xkOyBcCi0gICAgICAgIGJpdHMgPSBzdGF0ZS0+Yml0czsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIFJlc3RvcmUgc3RhdGUgZnJvbSByZWdpc3RlcnMgaW4gaW5mbGF0ZSgpICovCi0jZGVmaW5lIFJFU1RPUkUoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIHN0cm0tPm5leHRfb3V0ID0gcHV0OyBcCi0gICAgICAgIHN0cm0tPmF2YWlsX291dCA9IGxlZnQ7IFwKLSAgICAgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7IFwKLSAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOyBcCi0gICAgICAgIHN0YXRlLT5ob2xkID0gaG9sZDsgXAotICAgICAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBDbGVhciB0aGUgaW5wdXQgYml0IGFjY3VtdWxhdG9yICovCi0jZGVmaW5lIElOSVRCSVRTKCkgXAotICAgIGRvIHsgXAotICAgICAgICBob2xkID0gMDsgXAotICAgICAgICBiaXRzID0gMDsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIEdldCBhIGJ5dGUgb2YgaW5wdXQgaW50byB0aGUgYml0IGFjY3VtdWxhdG9yLCBvciByZXR1cm4gZnJvbSBpbmZsYXRlKCkKLSAgIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gKi8KLSNkZWZpbmUgUFVMTEJZVEUoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGlmIChoYXZlID09IDApIGdvdG8gaW5mX2xlYXZlOyBcCi0gICAgICAgIGhhdmUtLTsgXAotICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKSgqbmV4dCsrKSA8PCBiaXRzOyBcCi0gICAgICAgIGJpdHMgKz0gODsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIEFzc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBuIGJpdHMgaW4gdGhlIGJpdCBhY2N1bXVsYXRvci4gIElmIHRoZXJlIGlzCi0gICBub3QgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dCB0byBkbyB0aGF0LCB0aGVuIHJldHVybiBmcm9tIGluZmxhdGUoKS4gKi8KLSNkZWZpbmUgTkVFREJJVFMobikgXAotICAgIGRvIHsgXAotICAgICAgICB3aGlsZSAoYml0cyA8ICh1bnNpZ25lZCkobikpIFwKLSAgICAgICAgICAgIFBVTExCWVRFKCk7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBSZXR1cm4gdGhlIGxvdyBuIGJpdHMgb2YgdGhlIGJpdCBhY2N1bXVsYXRvciAobiA8IDE2KSAqLwotI2RlZmluZSBCSVRTKG4pIFwKLSAgICAoKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IChuKSkgLSAxKSkKLQotLyogUmVtb3ZlIG4gYml0cyBmcm9tIHRoZSBiaXQgYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgRFJPUEJJVFMobikgXAotICAgIGRvIHsgXAotICAgICAgICBob2xkID4+PSAobik7IFwKLSAgICAgICAgYml0cyAtPSAodW5zaWduZWQpKG4pOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogUmVtb3ZlIHplcm8gdG8gc2V2ZW4gYml0cyBhcyBuZWVkZWQgdG8gZ28gdG8gYSBieXRlIGJvdW5kYXJ5ICovCi0jZGVmaW5lIEJZVEVCSVRTKCkgXAotICAgIGRvIHsgXAotICAgICAgICBob2xkID4+PSBiaXRzICYgNzsgXAotICAgICAgICBiaXRzIC09IGJpdHMgJiA3OyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogUmV2ZXJzZSB0aGUgYnl0ZXMgaW4gYSAzMi1iaXQgdmFsdWUgKi8KLSNkZWZpbmUgUkVWRVJTRShxKSBcCi0gICAgKCgoKHEpID4+IDI0KSAmIDB4ZmYpICsgKCgocSkgPj4gOCkgJiAweGZmMDApICsgXAotICAgICAoKChxKSAmIDB4ZmYwMCkgPDwgOCkgKyAoKChxKSAmIDB4ZmYpIDw8IDI0KSkKLQotLyoKLSAgIGluZmxhdGUoKSB1c2VzIGEgc3RhdGUgbWFjaGluZSB0byBwcm9jZXNzIGFzIG11Y2ggaW5wdXQgZGF0YSBhbmQgZ2VuZXJhdGUgYXMKLSAgIG11Y2ggb3V0cHV0IGRhdGEgYXMgcG9zc2libGUgYmVmb3JlIHJldHVybmluZy4gIFRoZSBzdGF0ZSBtYWNoaW5lIGlzCi0gICBzdHJ1Y3R1cmVkIHJvdWdobHkgYXMgZm9sbG93czoKLQotICAgIGZvciAoOzspIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAuLi4KLSAgICBjYXNlIFNUQVRFbjoKLSAgICAgICAgaWYgKG5vdCBlbm91Z2ggaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgdG8gbWFrZSBwcm9ncmVzcykKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgLi4uIG1ha2UgcHJvZ3Jlc3MgLi4uCi0gICAgICAgIHN0YXRlID0gU1RBVEVtOwotICAgICAgICBicmVhazsKLSAgICAuLi4KLSAgICB9Ci0KLSAgIHNvIHdoZW4gaW5mbGF0ZSgpIGlzIGNhbGxlZCBhZ2FpbiwgdGhlIHNhbWUgY2FzZSBpcyBhdHRlbXB0ZWQgYWdhaW4sIGFuZAotICAgaWYgdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlcyBhcmUgcHJvdmlkZWQsIHRoZSBtYWNoaW5lIHByb2NlZWRzIHRvIHRoZQotICAgbmV4dCBzdGF0ZS4gIFRoZSBORUVEQklUUygpIG1hY3JvIGlzIHVzdWFsbHkgdGhlIHdheSB0aGUgc3RhdGUgZXZhbHVhdGVzCi0gICB3aGV0aGVyIGl0IGNhbiBwcm9jZWVkIG9yIHNob3VsZCByZXR1cm4uICBORUVEQklUUygpIGRvZXMgdGhlIHJldHVybiBpZgotICAgdGhlIHJlcXVlc3RlZCBiaXRzIGFyZSBub3QgYXZhaWxhYmxlLiAgVGhlIHR5cGljYWwgdXNlIG9mIHRoZSBCSVRTIG1hY3JvcwotICAgaXM6Ci0KLSAgICAgICAgTkVFREJJVFMobik7Ci0gICAgICAgIC4uLiBkbyBzb21ldGhpbmcgd2l0aCBCSVRTKG4pIC4uLgotICAgICAgICBEUk9QQklUUyhuKTsKLQotICAgd2hlcmUgTkVFREJJVFMobikgZWl0aGVyIHJldHVybnMgZnJvbSBpbmZsYXRlKCkgaWYgdGhlcmUgaXNuJ3QgZW5vdWdoCi0gICBpbnB1dCBsZWZ0IHRvIGxvYWQgbiBiaXRzIGludG8gdGhlIGFjY3VtdWxhdG9yLCBvciBpdCBjb250aW51ZXMuICBCSVRTKG4pCi0gICBnaXZlcyB0aGUgbG93IG4gYml0cyBpbiB0aGUgYWNjdW11bGF0b3IuICBXaGVuIGRvbmUsIERST1BCSVRTKG4pIGRyb3BzCi0gICB0aGUgbG93IG4gYml0cyBvZmYgdGhlIGFjY3VtdWxhdG9yLiAgSU5JVEJJVFMoKSBjbGVhcnMgdGhlIGFjY3VtdWxhdG9yCi0gICBhbmQgc2V0cyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBiaXRzIHRvIHplcm8uICBCWVRFQklUUygpIGRpc2NhcmRzIGp1c3QKLSAgIGVub3VnaCBiaXRzIHRvIHB1dCB0aGUgYWNjdW11bGF0b3Igb24gYSBieXRlIGJvdW5kYXJ5LiAgQWZ0ZXIgQllURUJJVFMoKQotICAgYW5kIGEgTkVFREJJVFMoOCksIHRoZW4gQklUUyg4KSB3b3VsZCByZXR1cm4gdGhlIG5leHQgYnl0ZSBpbiB0aGUgc3RyZWFtLgotCi0gICBORUVEQklUUyhuKSB1c2VzIFBVTExCWVRFKCkgdG8gZ2V0IGFuIGF2YWlsYWJsZSBieXRlIG9mIGlucHV0LCBvciB0byByZXR1cm4KLSAgIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gIFRoZSBkZWNvZGluZyBvZiB2YXJpYWJsZSBsZW5ndGggY29kZXMgdXNlcwotICAgUFVMTEJZVEUoKSBkaXJlY3RseSBpbiBvcmRlciB0byBwdWxsIGp1c3QgZW5vdWdoIGJ5dGVzIHRvIGRlY29kZSB0aGUgbmV4dAotICAgY29kZSwgYW5kIG5vIG1vcmUuCi0KLSAgIFNvbWUgc3RhdGVzIGxvb3AgdW50aWwgdGhleSBnZXQgZW5vdWdoIGlucHV0LCBtYWtpbmcgc3VyZSB0aGF0IGVub3VnaAotICAgc3RhdGUgaW5mb3JtYXRpb24gaXMgbWFpbnRhaW5lZCB0byBjb250aW51ZSB0aGUgbG9vcCB3aGVyZSBpdCBsZWZ0IG9mZgotICAgaWYgTkVFREJJVFMoKSByZXR1cm5zIGluIHRoZSBsb29wLiAgRm9yIGV4YW1wbGUsIHdhbnQsIG5lZWQsIGFuZCBrZWVwCi0gICB3b3VsZCBhbGwgaGF2ZSB0byBhY3R1YWxseSBiZSBwYXJ0IG9mIHRoZSBzYXZlZCBzdGF0ZSBpbiBjYXNlIE5FRURCSVRTKCkKLSAgIHJldHVybnM6Ci0KLSAgICBjYXNlIFNUQVRFdzoKLSAgICAgICAgd2hpbGUgKHdhbnQgPCBuZWVkKSB7Ci0gICAgICAgICAgICBORUVEQklUUyhuKTsKLSAgICAgICAgICAgIGtlZXBbd2FudCsrXSA9IEJJVFMobik7Ci0gICAgICAgICAgICBEUk9QQklUUyhuKTsKLSAgICAgICAgfQotICAgICAgICBzdGF0ZSA9IFNUQVRFeDsKLSAgICBjYXNlIFNUQVRFeDoKLQotICAgQXMgc2hvd24gYWJvdmUsIGlmIHRoZSBuZXh0IHN0YXRlIGlzIGFsc28gdGhlIG5leHQgY2FzZSwgdGhlbiB0aGUgYnJlYWsKLSAgIGlzIG9taXR0ZWQuCi0KLSAgIEEgc3RhdGUgbWF5IGFsc28gcmV0dXJuIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggb3V0cHV0IHNwYWNlIGF2YWlsYWJsZSB0bwotICAgY29tcGxldGUgdGhhdCBzdGF0ZS4gIFRob3NlIHN0YXRlcyBhcmUgY29weWluZyBzdG9yZWQgZGF0YSwgd3JpdGluZyBhCi0gICBsaXRlcmFsIGJ5dGUsIGFuZCBjb3B5aW5nIGEgbWF0Y2hpbmcgc3RyaW5nLgotCi0gICBXaGVuIHJldHVybmluZywgYSAiZ290byBpbmZfbGVhdmUiIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSB0b3RhbCBjb3VudGVycywKLSAgIHVwZGF0ZSB0aGUgY2hlY2sgdmFsdWUsIGFuZCBkZXRlcm1pbmUgd2hldGhlciBhbnkgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZQotICAgZHVyaW5nIHRoYXQgaW5mbGF0ZSgpIGNhbGwgaW4gb3JkZXIgdG8gcmV0dXJuIHRoZSBwcm9wZXIgcmV0dXJuIGNvZGUuCi0gICBQcm9ncmVzcyBpcyBkZWZpbmVkIGFzIGEgY2hhbmdlIGluIGVpdGhlciBzdHJtLT5hdmFpbF9pbiBvciBzdHJtLT5hdmFpbF9vdXQuCi0gICBXaGVuIHRoZXJlIGlzIGEgd2luZG93LCBnb3RvIGluZl9sZWF2ZSB3aWxsIHVwZGF0ZSB0aGUgd2luZG93IHdpdGggdGhlIGxhc3QKLSAgIG91dHB1dCB3cml0dGVuLiAgSWYgYSBnb3RvIGluZl9sZWF2ZSBvY2N1cnMgaW4gdGhlIG1pZGRsZSBvZiBkZWNvbXByZXNzaW9uCi0gICBhbmQgdGhlcmUgaXMgbm8gd2luZG93IGN1cnJlbnRseSwgZ290byBpbmZfbGVhdmUgd2lsbCBjcmVhdGUgb25lIGFuZCBjb3B5Ci0gICBvdXRwdXQgdG8gdGhlIHdpbmRvdyBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCi0KLSAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIHRoZSBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpIG9ubHkgYWZmZWN0cyB0aGUKLSAgIHJldHVybiBjb2RlIChwZXIgemxpYi5oKS4gIGluZmxhdGUoKSBhbHdheXMgd3JpdGVzIGFzIG11Y2ggYXMgcG9zc2libGUgdG8KLSAgIHN0cm0tPm5leHRfb3V0LCBnaXZlbiB0aGUgc3BhY2UgYXZhaWxhYmxlIGFuZCB0aGUgcHJvdmlkZWQgaW5wdXQtLXRoZSBlZmZlY3QKLSAgIGRvY3VtZW50ZWQgaW4gemxpYi5oIG9mIFpfU1lOQ19GTFVTSC4gIEZ1cnRoZXJtb3JlLCBpbmZsYXRlKCkgYWx3YXlzIGRlZmVycwotICAgdGhlIGFsbG9jYXRpb24gb2YgYW5kIGNvcHlpbmcgaW50byBhIHNsaWRpbmcgd2luZG93IHVudGlsIG5lY2Vzc2FyeSwgd2hpY2gKLSAgIHByb3ZpZGVzIHRoZSBlZmZlY3QgZG9jdW1lbnRlZCBpbiB6bGliLmggZm9yIFpfRklOSVNIIHdoZW4gdGhlIGVudGlyZSBpbnB1dAotICAgc3RyZWFtIGF2YWlsYWJsZS4gIFNvIHRoZSBvbmx5IHRoaW5nIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYWN0dWFsbHkgZG9lcyBpczoKLSAgIHdoZW4gZmx1c2ggaXMgc2V0IHRvIFpfRklOSVNILCBpbmZsYXRlKCkgY2Fubm90IHJldHVybiBaX09LLiAgSW5zdGVhZCBpdAotICAgd2lsbCByZXR1cm4gWl9CVUZfRVJST1IgaWYgaXQgaGFzIG5vdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KLSAqLwotCi1pbnQgWkVYUE9SVCBpbmZsYXRlKHN0cm0sIGZsdXNoKQotel9zdHJlYW1wIHN0cm07Ci1pbnQgZmx1c2g7Ci17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqbmV4dDsgICAgLyogbmV4dCBpbnB1dCAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpwdXQ7ICAgICAvKiBuZXh0IG91dHB1dCAqLwotICAgIHVuc2lnbmVkIGhhdmUsIGxlZnQ7ICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLwotICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLwotICAgIHVuc2lnbmVkIGluLCBvdXQ7ICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCi0gICAgdW5zaWduZWQgY29weTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpmcm9tOyAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi8KLSAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqLwotICAgIGNvZGUgbGFzdDsgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi8KLSAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqLwotICAgIGludCByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqLwotI2lmZGVmIEdVTlpJUAotICAgIHVuc2lnbmVkIGNoYXIgaGJ1Zls0XTsgICAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqLwotI2VuZGlmCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG9yZGVyWzE5XSA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqLwotICAgICAgICB7MTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IHN0cm0tPm5leHRfb3V0ID09IFpfTlVMTCB8fAotICAgICAgICAoc3RybS0+bmV4dF9pbiA9PSBaX05VTEwgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBUWVBFKSBzdGF0ZS0+bW9kZSA9IFRZUEVETzsgICAgICAvKiBza2lwIGNoZWNrICovCi0gICAgTE9BRCgpOwotICAgIGluID0gaGF2ZTsKLSAgICBvdXQgPSBsZWZ0OwotICAgIHJldCA9IFpfT0s7Ci0gICAgZm9yICg7OykKLSAgICAgICAgc3dpdGNoIChzdGF0ZS0+bW9kZSkgewotICAgICAgICBjYXNlIEhFQUQ6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPndyYXAgPT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRURPOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTkVFREJJVFMoMTYpOwotI2lmZGVmIEdVTlpJUAotICAgICAgICAgICAgaWYgKChzdGF0ZS0+d3JhcCAmIDIpICYmIGhvbGQgPT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqLwotICAgICAgICAgICAgICAgIHN0YXRlLT5jaGVjayA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotICAgICAgICAgICAgICAgIENSQzIoc3RhdGUtPmNoZWNrLCBob2xkKTsKLSAgICAgICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRkxBR1M7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+ZmxhZ3MgPSAwOyAgICAgICAgICAgLyogZXhwZWN0IHpsaWIgaGVhZGVyICovCi0gICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5kb25lID0gLTE7Ci0gICAgICAgICAgICBpZiAoIShzdGF0ZS0+d3JhcCAmIDEpIHx8ICAgLyogY2hlY2sgaWYgemxpYiBoZWFkZXIgYWxsb3dlZCAqLwotI2Vsc2UKLSAgICAgICAgICAgIGlmICgKLSNlbmRpZgotICAgICAgICAgICAgICAgICgoQklUUyg4KSA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGhlYWRlciBjaGVjayI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoQklUUyg0KSAhPSBaX0RFRkxBVEVEKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRFJPUEJJVFMoNCk7Ci0gICAgICAgICAgICBsZW4gPSBCSVRTKDQpICsgODsKLSAgICAgICAgICAgIGlmIChsZW4gPiBzdGF0ZS0+d2JpdHMpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIHdpbmRvdyBzaXplIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlLT5kbWF4ID0gMVUgPDwgbGVuOwotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXG4iKSk7Ci0gICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7Ci0gICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgR1VOWklQCi0gICAgICAgIGNhc2UgRkxBR1M6Ci0gICAgICAgICAgICBORUVEQklUUygxNik7Ci0gICAgICAgICAgICBzdGF0ZS0+ZmxhZ3MgPSAoaW50KShob2xkKTsKLSAgICAgICAgICAgIGlmICgoc3RhdGUtPmZsYWdzICYgMHhmZikgIT0gWl9ERUZMQVRFRCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweGUwMDApIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKLSAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+dGV4dCA9IChpbnQpKChob2xkID4+IDgpICYgMSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7Ci0gICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUSU1FOwotICAgICAgICBjYXNlIFRJTUU6Ci0gICAgICAgICAgICBORUVEQklUUygzMik7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT50aW1lID0gaG9sZDsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApIENSQzQoc3RhdGUtPmNoZWNrLCBob2xkKTsKLSAgICAgICAgICAgIElOSVRCSVRTKCk7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE9TOwotICAgICAgICBjYXNlIE9TOgotICAgICAgICAgICAgTkVFREJJVFMoMTYpOwotICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkgewotICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT54ZmxhZ3MgPSAoaW50KShob2xkICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPm9zID0gKGludCkoaG9sZCA+PiA4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApIENSQzIoc3RhdGUtPmNoZWNrLCBob2xkKTsKLSAgICAgICAgICAgIElOSVRCSVRTKCk7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEVYTEVOOwotICAgICAgICBjYXNlIEVYTEVOOgotICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDQwMCkgewotICAgICAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKShob2xkKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZXh0cmFfbGVuID0gKHVuc2lnbmVkKWhvbGQ7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOwotICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCi0gICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmV4dHJhID0gWl9OVUxMOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBFWFRSQTsKLSAgICAgICAgY2FzZSBFWFRSQToKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDA0MDApIHsKLSAgICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPmxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIGNvcHkgPSBoYXZlOwotICAgICAgICAgICAgICAgIGlmIChjb3B5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYSAhPSBaX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0YXRlLT5oZWFkLT5leHRyYV9sZW4gLSBzdGF0ZS0+bGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgem1lbWNweShzdGF0ZS0+aGVhZC0+ZXh0cmEgKyBsZW4sIG5leHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS0+aGVhZC0+ZXh0cmFfbWF4ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmV4dHJhX21heCAtIGxlbiA6IGNvcHkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Y2hlY2sgPSBjcmMzMihzdGF0ZS0+Y2hlY2ssIG5leHQsIGNvcHkpOwotICAgICAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmxlbmd0aCkgZ290byBpbmZfbGVhdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gMDsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTkFNRTsKLSAgICAgICAgY2FzZSBOQU1FOgotICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDgwMCkgewotICAgICAgICAgICAgICAgIGlmIChoYXZlID09IDApIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgICAgIGNvcHkgPSAwOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKShuZXh0W2NvcHkrK10pOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPm5hbWUgIT0gWl9OVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA8IHN0YXRlLT5oZWFkLT5uYW1lX21heCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5uYW1lW3N0YXRlLT5sZW5ndGgrK10gPSBsZW47Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Y2hlY2sgPSBjcmMzMihzdGF0ZS0+Y2hlY2ssIG5leHQsIGNvcHkpOwotICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKLSAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbikgZ290byBpbmZfbGVhdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCi0gICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPm5hbWUgPSBaX05VTEw7Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gMDsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQ09NTUVOVDsKLSAgICAgICAgY2FzZSBDT01NRU5UOgotICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MTAwMCkgewotICAgICAgICAgICAgICAgIGlmIChoYXZlID09IDApIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgICAgIGNvcHkgPSAwOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKShuZXh0W2NvcHkrK10pOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmNvbW1lbnQgIT0gWl9OVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA8IHN0YXRlLT5oZWFkLT5jb21tX21heCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5jb21tZW50W3N0YXRlLT5sZW5ndGgrK10gPSBsZW47Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Y2hlY2sgPSBjcmMzMihzdGF0ZS0+Y2hlY2ssIG5leHQsIGNvcHkpOwotICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKLSAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbikgZ290byBpbmZfbGVhdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCi0gICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmNvbW1lbnQgPSBaX05VTEw7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEhDUkM7Ci0gICAgICAgIGNhc2UgSENSQzoKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUygxNik7Ci0gICAgICAgICAgICAgICAgaWYgKGhvbGQgIT0gKHN0YXRlLT5jaGVjayAmIDB4ZmZmZikpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaGVhZGVyIGNyYyBtaXNtYXRjaCI7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+aGNyYyA9IChpbnQpKChzdGF0ZS0+ZmxhZ3MgPj4gOSkgJiAxKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZG9uZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgY2FzZSBESUNUSUQ6Ci0gICAgICAgICAgICBORUVEQklUUygzMik7Ci0gICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9IFJFVkVSU0UoaG9sZCk7Ci0gICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBESUNUOwotICAgICAgICBjYXNlIERJQ1Q6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmVkaWN0ID09IDApIHsKLSAgICAgICAgICAgICAgICBSRVNUT1JFKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgICAgICBjYXNlIFRZUEU6Ci0gICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9CTE9DSykgZ290byBpbmZfbGVhdmU7Ci0gICAgICAgIGNhc2UgVFlQRURPOgotICAgICAgICAgICAgaWYgKHN0YXRlLT5sYXN0KSB7Ci0gICAgICAgICAgICAgICAgQllURUJJVFMoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENIRUNLOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTkVFREJJVFMoMyk7Ci0gICAgICAgICAgICBzdGF0ZS0+bGFzdCA9IEJJVFMoMSk7Ci0gICAgICAgICAgICBEUk9QQklUUygxKTsKLSAgICAgICAgICAgIHN3aXRjaCAoQklUUygyKSkgewotICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovCi0gICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBTVE9SRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqLwotICAgICAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTsKLSAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOyAgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovCi0gICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVEFCTEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBibG9jayB0eXBlIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUkVEOgotICAgICAgICAgICAgQllURUJJVFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLwotICAgICAgICAgICAgTkVFREJJVFMoMzIpOwotICAgICAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPSAoKGhvbGQgPj4gMTYpIF4gMHhmZmZmKSkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZClob2xkICYgMHhmZmZmOwotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XG4iLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoKSk7Ci0gICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT1BZOwotICAgICAgICBjYXNlIENPUFk6Ci0gICAgICAgICAgICBjb3B5ID0gc3RhdGUtPmxlbmd0aDsKLSAgICAgICAgICAgIGlmIChjb3B5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID09IDApIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgICAgIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsKLSAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKLSAgICAgICAgICAgICAgICBwdXQgKz0gY29weTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcbiIpKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRBQkxFOgotICAgICAgICAgICAgTkVFREJJVFMoMTQpOwotICAgICAgICAgICAgc3RhdGUtPm5sZW4gPSBCSVRTKDUpICsgMjU3OwotICAgICAgICAgICAgRFJPUEJJVFMoNSk7Ci0gICAgICAgICAgICBzdGF0ZS0+bmRpc3QgPSBCSVRTKDUpICsgMTsKLSAgICAgICAgICAgIERST1BCSVRTKDUpOwotICAgICAgICAgICAgc3RhdGUtPm5jb2RlID0gQklUUyg0KSArIDQ7Ci0gICAgICAgICAgICBEUk9QQklUUyg0KTsKLSNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bmxlbiA+IDI4NiB8fCBzdGF0ZS0+bmRpc3QgPiAzMCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOwotICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5MRU5TOwotICAgICAgICBjYXNlIExFTkxFTlM6Ci0gICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmNvZGUpIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUygzKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAodW5zaWduZWQgc2hvcnQpQklUUygzKTsKLSAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IDE5KQotICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9IDA7Ci0gICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gNzsKLSAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLT5sZW5zLCAxOSwgJihzdGF0ZS0+bmV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXG4iKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPREVMRU5TOwotICAgICAgICBjYXNlIENPREVMRU5TOgotICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbCA8IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gdGhpcy52YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWwgPT0gMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52YWwgPT0gMTcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyBCSVRTKDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoNyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlICsgY29weSA+IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBCQUQpIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAqLwotICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDk7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLT5sZW5zLCBzdGF0ZS0+bmxlbiwgJihzdGF0ZS0+bmV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlLT5kaXN0Y29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7Ci0gICAgICAgICAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA2OwotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMgKyBzdGF0ZS0+bmxlbiwgc3RhdGUtPm5kaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPm5leHQpLCAmKHN0YXRlLT5kaXN0Yml0cyksIHN0YXRlLT53b3JrKTsKLSAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBva1xuIikpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47Ci0gICAgICAgIGNhc2UgTEVOOgotICAgICAgICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkgewotICAgICAgICAgICAgICAgIFJFU1RPUkUoKTsKLSAgICAgICAgICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgb3V0KTsKLSAgICAgICAgICAgICAgICBMT0FEKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5vcCAmJiAodGhpcy5vcCAmIDB4ZjApID09IDApIHsKLSAgICAgICAgICAgICAgICBsYXN0ID0gdGhpczsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtsYXN0LnZhbCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOwotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCl0aGlzLnZhbDsKLSAgICAgICAgICAgIGlmICgoaW50KSh0aGlzLm9wKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCB0aGlzLnZhbCA+PSAweDIwICYmIHRoaXMudmFsIDwgMHg3ZiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgotICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIHRoaXMudmFsKSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMSVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5vcCAmIDMyKSB7Ci0gICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5vcCAmIDY0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkodGhpcy5vcCkgJiAxNTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVORVhUOwotICAgICAgICBjYXNlIExFTkVYVDoKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZXh0cmEpIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggKz0gQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgICAgIERST1BCSVRTKHN0YXRlLT5leHRyYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgc3RhdGUtPmxlbmd0aCkpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBESVNUOwotICAgICAgICBjYXNlIERJU1Q6Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5kaXN0Y29kZVtCSVRTKHN0YXRlLT5kaXN0Yml0cyldOwotICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgodGhpcy5vcCAmIDB4ZjApID09IDApIHsKLSAgICAgICAgICAgICAgICBsYXN0ID0gdGhpczsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+ZGlzdGNvZGVbbGFzdC52YWwgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyB0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKLSAgICAgICAgICAgIGlmICh0aGlzLm9wICYgNjQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPm9mZnNldCA9ICh1bnNpZ25lZCl0aGlzLnZhbDsKLSAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkodGhpcy5vcCkgJiAxNTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElTVEVYVDsKLSAgICAgICAgY2FzZSBESVNURVhUOgotICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSkgewotICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm9mZnNldCArPSBCSVRTKHN0YXRlLT5leHRyYSk7Ci0gICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBJTkZMQVRFX1NUUklDVAotICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBzdGF0ZS0+ZG1heCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBzdGF0ZS0+d2hhdmUgKyBvdXQgLSBsZWZ0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgc3RhdGUtPm9mZnNldCkpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBNQVRDSDsKLSAgICAgICAgY2FzZSBNQVRDSDoKLSAgICAgICAgICAgIGlmIChsZWZ0ID09IDApIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgY29weSA9IG91dCAtIGxlZnQ7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IGNvcHkpIHsgICAgICAgICAvKiBjb3B5IGZyb20gd2luZG93ICovCi0gICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5vZmZzZXQgLSBjb3B5OwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPndyaXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHkgLT0gc3RhdGUtPndyaXRlOwotICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUtPndpbmRvdyArIChzdGF0ZS0+d3NpemUgLSBjb3B5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUtPndpbmRvdyArIChzdGF0ZS0+d3JpdGUgLSBjb3B5KTsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT5sZW5ndGgpIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqLwotICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS0+b2Zmc2V0OwotICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSBjb3B5ID0gbGVmdDsKLSAgICAgICAgICAgIGxlZnQgLT0gY29weTsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAqcHV0KysgPSAqZnJvbSsrOwotICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuZ3RoID09IDApIHN0YXRlLT5tb2RlID0gTEVOOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTElUOgotICAgICAgICAgICAgaWYgKGxlZnQgPT0gMCkgZ290byBpbmZfbGVhdmU7Ci0gICAgICAgICAgICAqcHV0KysgPSAodW5zaWduZWQgY2hhcikoc3RhdGUtPmxlbmd0aCk7Ci0gICAgICAgICAgICBsZWZ0LS07Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIRUNLOgotICAgICAgICAgICAgaWYgKHN0YXRlLT53cmFwKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoMzIpOwotICAgICAgICAgICAgICAgIG91dCAtPSBsZWZ0OwotICAgICAgICAgICAgICAgIHN0cm0tPnRvdGFsX291dCArPSBvdXQ7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPnRvdGFsICs9IG91dDsKLSAgICAgICAgICAgICAgICBpZiAob3V0KQotICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBVUERBVEUoc3RhdGUtPmNoZWNrLCBwdXQgLSBvdXQsIG91dCk7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbGVmdDsKLSAgICAgICAgICAgICAgICBpZiAoKAotI2lmZGVmIEdVTlpJUAotICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmZsYWdzID8gaG9sZCA6Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgIFJFVkVSU0UoaG9sZCkpICE9IHN0YXRlLT5jaGVjaykgewotICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgZGF0YSBjaGVjayI7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXG4iKSk7Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgR1VOWklQCi0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTkdUSDsKLSAgICAgICAgY2FzZSBMRU5HVEg6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPndyYXAgJiYgc3RhdGUtPmZsYWdzKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoMzIpOwotICAgICAgICAgICAgICAgIGlmIChob2xkICE9IChzdGF0ZS0+dG90YWwgJiAweGZmZmZmZmZmVUwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBsZW5ndGggY2hlY2siOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7Ci0gICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVzIHRyYWlsZXJcbiIpKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBET05FOwotICAgICAgICBjYXNlIERPTkU6Ci0gICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7Ci0gICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKLSAgICAgICAgY2FzZSBCQUQ6Ci0gICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKLSAgICAgICAgY2FzZSBNRU06Ci0gICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgICAgIGNhc2UgU1lOQzoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgLyoKLSAgICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS4KLSAgICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyCi0gICAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuCi0gICAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLgotICAgICAqLwotICBpbmZfbGVhdmU6Ci0gICAgUkVTVE9SRSgpOwotICAgIGlmIChzdGF0ZS0+d3NpemUgfHwgKHN0YXRlLT5tb2RlIDwgQ0hFQ0sgJiYgb3V0ICE9IHN0cm0tPmF2YWlsX291dCkpCi0gICAgICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgb3V0KSkgewotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBNRU07Ci0gICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgICAgIH0KLSAgICBpbiAtPSBzdHJtLT5hdmFpbF9pbjsKLSAgICBvdXQgLT0gc3RybS0+YXZhaWxfb3V0OwotICAgIHN0cm0tPnRvdGFsX2luICs9IGluOwotICAgIHN0cm0tPnRvdGFsX291dCArPSBvdXQ7Ci0gICAgc3RhdGUtPnRvdGFsICs9IG91dDsKLSAgICBpZiAoc3RhdGUtPndyYXAgJiYgb3V0KQotICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9Ci0gICAgICAgICAgICBVUERBVEUoc3RhdGUtPmNoZWNrLCBzdHJtLT5uZXh0X291dCAtIG91dCwgb3V0KTsKLSAgICBzdHJtLT5kYXRhX3R5cGUgPSBzdGF0ZS0+Yml0cyArIChzdGF0ZS0+bGFzdCA/IDY0IDogMCkgKwotICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS0+bW9kZSA9PSBUWVBFID8gMTI4IDogMCk7Ci0gICAgaWYgKCgoaW4gPT0gMCAmJiBvdXQgPT0gMCkgfHwgZmx1c2ggPT0gWl9GSU5JU0gpICYmIHJldCA9PSBaX09LKQotICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlRW5kKHN0cm0pCi16X3N0cmVhbXAgc3RybTsKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgaWYgKHN0YXRlLT53aW5kb3cgIT0gWl9OVUxMKSBaRlJFRShzdHJtLCBzdGF0ZS0+d2luZG93KTsKLSAgICBaRlJFRShzdHJtLCBzdHJtLT5zdGF0ZSk7Ci0gICAgc3RybS0+c3RhdGUgPSBaX05VTEw7Ci0gICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBlbmRcbiIpKTsKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotaW50IFpFWFBPUlQgaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSwgZGljdExlbmd0aCkKLXpfc3RyZWFtcCBzdHJtOwotY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnk7Ci11SW50IGRpY3RMZW5ndGg7Ci17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLSAgICB1bnNpZ25lZCBsb25nIGlkOwotCi0gICAgLyogY2hlY2sgc3RhdGUgKi8KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgaWYgKHN0YXRlLT53cmFwICE9IDAgJiYgc3RhdGUtPm1vZGUgIT0gRElDVCkKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZCAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBESUNUKSB7Ci0gICAgICAgIGlkID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgaWQgPSBhZGxlcjMyKGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsKLSAgICAgICAgaWYgKGlkICE9IHN0YXRlLT5jaGVjaykKLSAgICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gICAgfQotCi0gICAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyAqLwotICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS0+YXZhaWxfb3V0KSkgewotICAgICAgICBzdGF0ZS0+bW9kZSA9IE1FTTsKLSAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIH0KLSAgICBpZiAoZGljdExlbmd0aCA+IHN0YXRlLT53c2l6ZSkgewotICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3csIGRpY3Rpb25hcnkgKyBkaWN0TGVuZ3RoIC0gc3RhdGUtPndzaXplLAotICAgICAgICAgICAgICAgIHN0YXRlLT53c2l6ZSk7Ci0gICAgICAgIHN0YXRlLT53aGF2ZSA9IHN0YXRlLT53c2l6ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53c2l6ZSAtIGRpY3RMZW5ndGgsIGRpY3Rpb25hcnksCi0gICAgICAgICAgICAgICAgZGljdExlbmd0aCk7Ci0gICAgICAgIHN0YXRlLT53aGF2ZSA9IGRpY3RMZW5ndGg7Ci0gICAgfQotICAgIHN0YXRlLT5oYXZlZGljdCA9IDE7Ci0gICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XG4iKSk7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkKLXpfc3RyZWFtcCBzdHJtOwotZ3pfaGVhZGVycCBoZWFkOwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0KLSAgICAvKiBjaGVjayBzdGF0ZSAqLwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLSAgICBpZiAoKHN0YXRlLT53cmFwICYgMikgPT0gMCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovCi0gICAgc3RhdGUtPmhlYWQgPSBoZWFkOwotICAgIGhlYWQtPmRvbmUgPSAwOwotICAgIHJldHVybiBaX09LOwotfQotCi0vKgotICAgU2VhcmNoIGJ1ZlswLi5sZW4tMV0gZm9yIHRoZSBwYXR0ZXJuOiAwLCAwLCAweGZmLCAweGZmLiAgUmV0dXJuIHdoZW4gZm91bmQKLSAgIG9yIHdoZW4gb3V0IG9mIGlucHV0LiAgV2hlbiBjYWxsZWQsICpoYXZlIGlzIHRoZSBudW1iZXIgb2YgcGF0dGVybiBieXRlcwotICAgZm91bmQgaW4gb3JkZXIgc28gZmFyLCBpbiAwLi4zLiAgT24gcmV0dXJuICpoYXZlIGlzIHVwZGF0ZWQgdG8gdGhlIG5ldwotICAgc3RhdGUuICBJZiBvbiByZXR1cm4gKmhhdmUgZXF1YWxzIGZvdXIsIHRoZW4gdGhlIHBhdHRlcm4gd2FzIGZvdW5kIGFuZCB0aGUKLSAgIHJldHVybiB2YWx1ZSBpcyBob3cgbWFueSBieXRlcyB3ZXJlIHJlYWQgaW5jbHVkaW5nIHRoZSBsYXN0IGJ5dGUgb2YgdGhlCi0gICBwYXR0ZXJuLiAgSWYgKmhhdmUgaXMgbGVzcyB0aGFuIGZvdXIsIHRoZW4gdGhlIHBhdHRlcm4gaGFzIG5vdCBiZWVuIGZvdW5kCi0gICB5ZXQgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgbGVuLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBzeW5jc2VhcmNoKCkgY2FuIGJlCi0gICBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGRhdGEgYW5kIHRoZSAqaGF2ZSBzdGF0ZS4gICpoYXZlIGlzIGluaXRpYWxpemVkIHRvCi0gICB6ZXJvIGZvciB0aGUgZmlyc3QgY2FsbC4KLSAqLwotbG9jYWwgdW5zaWduZWQgc3luY3NlYXJjaChoYXZlLCBidWYsIGxlbikKLXVuc2lnbmVkIEZBUiAqaGF2ZTsKLXVuc2lnbmVkIGNoYXIgRkFSICpidWY7Ci11bnNpZ25lZCBsZW47Ci17Ci0gICAgdW5zaWduZWQgZ290OwotICAgIHVuc2lnbmVkIG5leHQ7Ci0KLSAgICBnb3QgPSAqaGF2ZTsKLSAgICBuZXh0ID0gMDsKLSAgICB3aGlsZSAobmV4dCA8IGxlbiAmJiBnb3QgPCA0KSB7Ci0gICAgICAgIGlmICgoaW50KShidWZbbmV4dF0pID09IChnb3QgPCAyID8gMCA6IDB4ZmYpKQotICAgICAgICAgICAgZ290Kys7Ci0gICAgICAgIGVsc2UgaWYgKGJ1ZltuZXh0XSkKLSAgICAgICAgICAgIGdvdCA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdvdCA9IDQgLSBnb3Q7Ci0gICAgICAgIG5leHQrKzsKLSAgICB9Ci0gICAgKmhhdmUgPSBnb3Q7Ci0gICAgcmV0dXJuIG5leHQ7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVTeW5jKHN0cm0pCi16X3N0cmVhbXAgc3RybTsKLXsKLSAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGxvb2sgYXQgb3IgbG9va2VkIGF0ICovCi0gICAgdW5zaWduZWQgbG9uZyBpbiwgb3V0OyAgICAgIC8qIHRlbXBvcmFyeSB0byBzYXZlIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsgICAgICAgLyogdG8gcmVzdG9yZSBiaXQgYnVmZmVyIHRvIGJ5dGUgc3RyaW5nICovCi0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgc3RhdGUtPmJpdHMgPCA4KSByZXR1cm4gWl9CVUZfRVJST1I7Ci0KLSAgICAvKiBpZiBmaXJzdCB0aW1lLCBzdGFydCBzZWFyY2ggaW4gYml0IGJ1ZmZlciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBTWU5DKSB7Ci0gICAgICAgIHN0YXRlLT5tb2RlID0gU1lOQzsKLSAgICAgICAgc3RhdGUtPmhvbGQgPDw9IHN0YXRlLT5iaXRzICYgNzsKLSAgICAgICAgc3RhdGUtPmJpdHMgLT0gc3RhdGUtPmJpdHMgJiA3OwotICAgICAgICBsZW4gPSAwOwotICAgICAgICB3aGlsZSAoc3RhdGUtPmJpdHMgPj0gOCkgewotICAgICAgICAgICAgYnVmW2xlbisrXSA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+aG9sZCk7Ci0gICAgICAgICAgICBzdGF0ZS0+aG9sZCA+Pj0gODsKLSAgICAgICAgICAgIHN0YXRlLT5iaXRzIC09IDg7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGUtPmhhdmUgPSAwOwotICAgICAgICBzeW5jc2VhcmNoKCYoc3RhdGUtPmhhdmUpLCBidWYsIGxlbik7Ci0gICAgfQotCi0gICAgLyogc2VhcmNoIGF2YWlsYWJsZSBpbnB1dCAqLwotICAgIGxlbiA9IHN5bmNzZWFyY2goJihzdGF0ZS0+aGF2ZSksIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKLSAgICBzdHJtLT5hdmFpbF9pbiAtPSBsZW47Ci0gICAgc3RybS0+bmV4dF9pbiArPSBsZW47Ci0gICAgc3RybS0+dG90YWxfaW4gKz0gbGVuOwotCi0gICAgLyogcmV0dXJuIG5vIGpveSBvciBzZXQgdXAgdG8gcmVzdGFydCBpbmZsYXRlKCkgb24gYSBuZXcgYmxvY2sgKi8KLSAgICBpZiAoc3RhdGUtPmhhdmUgIT0gNCkgcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgICBpbiA9IHN0cm0tPnRvdGFsX2luOyAgb3V0ID0gc3RybS0+dG90YWxfb3V0OwotICAgIGluZmxhdGVSZXNldChzdHJtKTsKLSAgICBzdHJtLT50b3RhbF9pbiA9IGluOyAgc3RybS0+dG90YWxfb3V0ID0gb3V0OwotICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotLyoKLSAgIFJldHVybnMgdHJ1ZSBpZiBpbmZsYXRlIGlzIGN1cnJlbnRseSBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZ2VuZXJhdGVkIGJ5Ci0gICBaX1NZTkNfRkxVU0ggb3IgWl9GVUxMX0ZMVVNILiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgb25lIFBQUAotICAgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBhbiBhZGRpdGlvbmFsIHNhZmV0eSBjaGVjay4gUFBQIHVzZXMKLSAgIFpfU1lOQ19GTFVTSCBidXQgcmVtb3ZlcyB0aGUgbGVuZ3RoIGJ5dGVzIG9mIHRoZSByZXN1bHRpbmcgZW1wdHkgc3RvcmVkCi0gICBibG9jay4gV2hlbiBkZWNvbXByZXNzaW5nLCBQUFAgY2hlY2tzIHRoYXQgYXQgdGhlIGVuZCBvZiBpbnB1dCBwYWNrZXQsCi0gICBpbmZsYXRlIGlzIHdhaXRpbmcgZm9yIHRoZXNlIGxlbmd0aCBieXRlcy4KLSAqLwotaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmNQb2ludChzdHJtKQotel9zdHJlYW1wIHN0cm07Ci17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLSAgICByZXR1cm4gc3RhdGUtPm1vZGUgPT0gU1RPUkVEICYmIHN0YXRlLT5iaXRzID09IDA7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVDb3B5KGRlc3QsIHNvdXJjZSkKLXpfc3RyZWFtcCBkZXN0Owotel9zdHJlYW1wIHNvdXJjZTsKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqY29weTsKLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OwotICAgIHVuc2lnbmVkIHdzaXplOwotCi0gICAgLyogY2hlY2sgaW5wdXQgKi8KLSAgICBpZiAoZGVzdCA9PSBaX05VTEwgfHwgc291cmNlID09IFpfTlVMTCB8fCBzb3VyY2UtPnN0YXRlID09IFpfTlVMTCB8fAotICAgICAgICBzb3VyY2UtPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwIHx8IHNvdXJjZS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc291cmNlLT5zdGF0ZTsKLQotICAgIC8qIGFsbG9jYXRlIHNwYWNlICovCi0gICAgY29weSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKikKLSAgICAgICAgICAgWkFMTE9DKHNvdXJjZSwgMSwgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7Ci0gICAgaWYgKGNvcHkgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgd2luZG93ID0gWl9OVUxMOwotICAgIGlmIChzdGF0ZS0+d2luZG93ICE9IFpfTlVMTCkgewotICAgICAgICB3aW5kb3cgPSAodW5zaWduZWQgY2hhciBGQVIgKikKLSAgICAgICAgICAgICAgICAgWkFMTE9DKHNvdXJjZSwgMVUgPDwgc3RhdGUtPndiaXRzLCBzaXplb2YodW5zaWduZWQgY2hhcikpOwotICAgICAgICBpZiAod2luZG93ID09IFpfTlVMTCkgewotICAgICAgICAgICAgWkZSRUUoc291cmNlLCBjb3B5KTsKLSAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNvcHkgc3RhdGUgKi8KLSAgICB6bWVtY3B5KGRlc3QsIHNvdXJjZSwgc2l6ZW9mKHpfc3RyZWFtKSk7Ci0gICAgem1lbWNweShjb3B5LCBzdGF0ZSwgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7Ci0gICAgaWYgKHN0YXRlLT5sZW5jb2RlID49IHN0YXRlLT5jb2RlcyAmJgotICAgICAgICBzdGF0ZS0+bGVuY29kZSA8PSBzdGF0ZS0+Y29kZXMgKyBFTk9VR0ggLSAxKSB7Ci0gICAgICAgIGNvcHktPmxlbmNvZGUgPSBjb3B5LT5jb2RlcyArIChzdGF0ZS0+bGVuY29kZSAtIHN0YXRlLT5jb2Rlcyk7Ci0gICAgICAgIGNvcHktPmRpc3Rjb2RlID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPmRpc3Rjb2RlIC0gc3RhdGUtPmNvZGVzKTsKLSAgICB9Ci0gICAgY29weS0+bmV4dCA9IGNvcHktPmNvZGVzICsgKHN0YXRlLT5uZXh0IC0gc3RhdGUtPmNvZGVzKTsKLSAgICBpZiAod2luZG93ICE9IFpfTlVMTCkgewotICAgICAgICB3c2l6ZSA9IDFVIDw8IHN0YXRlLT53Yml0czsKLSAgICAgICAgem1lbWNweSh3aW5kb3csIHN0YXRlLT53aW5kb3csIHdzaXplKTsKLSAgICB9Ci0gICAgY29weS0+d2luZG93ID0gd2luZG93OwotICAgIGRlc3QtPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKiljb3B5OwotICAgIHJldHVybiBaX09LOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2luZmxhdGUuaCBiL2xpYnMvemxpYi9pbmZsYXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YmQzZTcuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL2luZmxhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKiBpbmZsYXRlLmggLS0gaW50ZXJuYWwgaW5mbGF0ZSBzdGF0ZSBkZWZpbml0aW9uCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLS8qIGRlZmluZSBOT19HWklQIHdoZW4gY29tcGlsaW5nIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgZ3ppcCBoZWFkZXIgYW5kCi0gICB0cmFpbGVyIGRlY29kaW5nIGJ5IGluZmxhdGUoKS4gIE5PX0daSVAgd291bGQgYmUgdXNlZCB0byBhdm9pZCBsaW5raW5nIGluCi0gICB0aGUgY3JjIGNvZGUgd2hlbiBpdCBpcyBub3QgbmVlZGVkLiAgRm9yIHNoYXJlZCBsaWJyYXJpZXMsIGd6aXAgZGVjb2RpbmcKLSAgIHNob3VsZCBiZSBsZWZ0IGVuYWJsZWQuICovCi0jaWZuZGVmIE5PX0daSVAKLSMgIGRlZmluZSBHVU5aSVAKLSNlbmRpZgotCi0vKiBQb3NzaWJsZSBpbmZsYXRlIG1vZGVzIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzICovCi10eXBlZGVmIGVudW0gewotICAgIEhFQUQsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqLwotICAgIEZMQUdTLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1ldGhvZCBhbmQgZmxhZ3MgKGd6aXApICovCi0gICAgVElNRSwgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovCi0gICAgT1MsICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovCi0gICAgRVhMRU4sICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgbGVuZ3RoIChnemlwKSAqLwotICAgIEVYVFJBLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqLwotICAgIE5BTUUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovCi0gICAgQ09NTUVOVCwgICAgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGNvbW1lbnQgKGd6aXApICovCi0gICAgSENSQywgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi8KLSAgICBESUNUSUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovCi0gICAgRElDVCwgICAgICAgLyogd2FpdGluZyBmb3IgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsICovCi0gICAgICAgIFRZUEUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi8KLSAgICAgICAgVFlQRURPLCAgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqLwotICAgICAgICBTVE9SRUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBzdG9yZWQgc2l6ZSAobGVuZ3RoIGFuZCBjb21wbGVtZW50KSAqLwotICAgICAgICBDT1BZLCAgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqLwotICAgICAgICBUQUJMRSwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkeW5hbWljIGJsb2NrIHRhYmxlIGxlbmd0aHMgKi8KLSAgICAgICAgTEVOTEVOUywgICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovCi0gICAgICAgIENPREVMRU5TLCAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLwotICAgICAgICAgICAgTEVOLCAgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdCBjb2RlICovCi0gICAgICAgICAgICBMRU5FWFQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqLwotICAgICAgICAgICAgRElTVCwgICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqLwotICAgICAgICAgICAgRElTVEVYVCwgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgZXh0cmEgYml0cyAqLwotICAgICAgICAgICAgTUFUQ0gsICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovCi0gICAgICAgICAgICBMSVQsICAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqLwotICAgIENIRUNLLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBjaGVjayB2YWx1ZSAqLwotICAgIExFTkdUSCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovCi0gICAgRE9ORSwgICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KLSAgICBCQUQsICAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCi0gICAgTUVNLCAgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KLSAgICBTWU5DICAgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi8KLX0gaW5mbGF0ZV9tb2RlOwotCi0vKgotICAgIFN0YXRlIHRyYW5zaXRpb25zIGJldHdlZW4gYWJvdmUgbW9kZXMgLQotCi0gICAgKG1vc3QgbW9kZXMgY2FuIGdvIHRvIHRoZSBCQUQgb3IgTUVNIG1vZGUgLS0gbm90IHNob3duIGZvciBjbGFyaXR5KQotCi0gICAgUHJvY2VzcyBoZWFkZXI6Ci0gICAgICAgIEhFQUQgLT4gKGd6aXApIG9yICh6bGliKQotICAgICAgICAoZ3ppcCkgLT4gRkxBR1MgLT4gVElNRSAtPiBPUyAtPiBFWExFTiAtPiBFWFRSQSAtPiBOQU1FCi0gICAgICAgIE5BTUUgLT4gQ09NTUVOVCAtPiBIQ1JDIC0+IFRZUEUKLSAgICAgICAgKHpsaWIpIC0+IERJQ1RJRCBvciBUWVBFCi0gICAgICAgIERJQ1RJRCAtPiBESUNUIC0+IFRZUEUKLSAgICBSZWFkIGRlZmxhdGUgYmxvY2tzOgotICAgICAgICAgICAgVFlQRSAtPiBTVE9SRUQgb3IgVEFCTEUgb3IgTEVOIG9yIENIRUNLCi0gICAgICAgICAgICBTVE9SRUQgLT4gQ09QWSAtPiBUWVBFCi0gICAgICAgICAgICBUQUJMRSAtPiBMRU5MRU5TIC0+IENPREVMRU5TIC0+IExFTgotICAgIFJlYWQgZGVmbGF0ZSBjb2RlczoKLSAgICAgICAgICAgICAgICBMRU4gLT4gTEVORVhUIG9yIExJVCBvciBUWVBFCi0gICAgICAgICAgICAgICAgTEVORVhUIC0+IERJU1QgLT4gRElTVEVYVCAtPiBNQVRDSCAtPiBMRU4KLSAgICAgICAgICAgICAgICBMSVQgLT4gTEVOCi0gICAgUHJvY2VzcyB0cmFpbGVyOgotICAgICAgICBDSEVDSyAtPiBMRU5HVEggLT4gRE9ORQotICovCi0KLS8qIHN0YXRlIG1haW50YWluZWQgYmV0d2VlbiBpbmZsYXRlKCkgY2FsbHMuICBBcHByb3hpbWF0ZWx5IDdLIGJ5dGVzLiAqLwotc3RydWN0IGluZmxhdGVfc3RhdGUgewotICAgIGluZmxhdGVfbW9kZSBtb2RlOyAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqLwotICAgIGludCBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHByb2Nlc3NpbmcgbGFzdCBibG9jayAqLwotICAgIGludCB3cmFwOyAgICAgICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovCi0gICAgaW50IGhhdmVkaWN0OyAgICAgICAgICAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqLwotICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBnemlwIGhlYWRlciBtZXRob2QgYW5kIGZsYWdzICgwIGlmIHpsaWIpICovCi0gICAgdW5zaWduZWQgZG1heDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovCi0gICAgdW5zaWduZWQgbG9uZyBjaGVjazsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovCi0gICAgdW5zaWduZWQgbG9uZyB0b3RhbDsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIG91dHB1dCBjb3VudCAqLwotICAgIGd6X2hlYWRlcnAgaGVhZDsgICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovCi0gICAgICAgIC8qIHNsaWRpbmcgd2luZG93ICovCi0gICAgdW5zaWduZWQgd2JpdHM7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovCi0gICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLwotICAgIHVuc2lnbmVkIHdoYXZlOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovCi0gICAgdW5zaWduZWQgd3JpdGU7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIG5lZWRlZCAqLwotICAgICAgICAvKiBiaXQgYWNjdW11bGF0b3IgKi8KLSAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogaW5wdXQgYml0IGFjY3VtdWxhdG9yICovCi0gICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluICJpbiIgKi8KLSAgICAgICAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi8KLSAgICB1bnNpZ25lZCBsZW5ndGg7ICAgICAgICAgICAgLyogbGl0ZXJhbCBvciBsZW5ndGggb2YgZGF0YSB0byBjb3B5ICovCi0gICAgdW5zaWduZWQgb2Zmc2V0OyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqLwotICAgICAgICAvKiBmb3IgdGFibGUgYW5kIGNvZGUgZGVjb2RpbmcgKi8KLSAgICB1bnNpZ25lZCBleHRyYTsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi8KLSAgICAgICAgLyogZml4ZWQgYW5kIGR5bmFtaWMgY29kZSB0YWJsZXMgKi8KLSAgICBjb2RlIGNvbnN0IEZBUiAqbGVuY29kZTsgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzICovCi0gICAgY29kZSBjb25zdCBGQVIgKmRpc3Rjb2RlOyAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAqLwotICAgIHVuc2lnbmVkIGxlbmJpdHM7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovCi0gICAgdW5zaWduZWQgZGlzdGJpdHM7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovCi0gICAgICAgIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi8KLSAgICB1bnNpZ25lZCBuY29kZTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLwotICAgIHVuc2lnbmVkIG5sZW47ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLwotICAgIHVuc2lnbmVkIG5kaXN0OyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCi0gICAgdW5zaWduZWQgaGF2ZTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovCi0gICAgY29kZSBGQVIgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIGNvZGVzW10gKi8KLSAgICB1bnNpZ25lZCBzaG9ydCBsZW5zWzMyMF07ICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGNvZGUgbGVuZ3RocyAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdvcmtbMjg4XTsgICAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi8KLSAgICBjb2RlIGNvZGVzW0VOT1VHSF07ICAgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovCi19OwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL2luZnRyZWVzLmMgYi9saWJzL3psaWIvaW5mdHJlZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5YzEzZi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvaW5mdHJlZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKiBpbmZ0cmVlcy5jIC0tIGdlbmVyYXRlIEh1ZmZtYW4gdHJlZXMgZm9yIGVmZmljaWVudCBkZWNvZGluZwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotI2luY2x1ZGUgImluZnRyZWVzLmgiCi0KLSNkZWZpbmUgTUFYQklUUyAxNQotCi1jb25zdCBjaGFyIGluZmxhdGVfY29weXJpZ2h0W10gPQotICAgIiBpbmZsYXRlIDEuMi4zIENvcHlyaWdodCAxOTk1LTIwMDUgTWFyayBBZGxlciAiOwotLyoKLSAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQotICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90Ci0gIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcwotICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KLSAqLwotCi0vKgotICAgQnVpbGQgYSBzZXQgb2YgdGFibGVzIHRvIGRlY29kZSB0aGUgcHJvdmlkZWQgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4KLSAgIFRoZSBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBUaGUgcmVzdWx0IHN0YXJ0cyBhdCAqdGFibGUsCi0gICB3aG9zZSBpbmRpY2VzIGFyZSAwLi4yXmJpdHMtMS4gIHdvcmsgaXMgYSB3cml0YWJsZSBhcnJheSBvZiBhdCBsZWFzdAotICAgbGVucyBzaG9ydHMsIHdoaWNoIGlzIHVzZWQgYXMgYSB3b3JrIGFyZWEuICB0eXBlIGlzIHRoZSB0eXBlIG9mIGNvZGUKLSAgIHRvIGJlIGdlbmVyYXRlZCwgQ09ERVMsIExFTlMsIG9yIERJU1RTLiAgT24gcmV0dXJuLCB6ZXJvIGlzIHN1Y2Nlc3MsCi0gICAtMSBpcyBhbiBpbnZhbGlkIGNvZGUsIGFuZCArMSBtZWFucyB0aGF0IEVOT1VHSCBpc24ndCBlbm91Z2guICB0YWJsZQotICAgb24gcmV0dXJuIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgZW50cnkncyBhZGRyZXNzLiAgYml0cyBpcyB0aGUKLSAgIHJlcXVlc3RlZCByb290IHRhYmxlIGluZGV4IGJpdHMsIGFuZCBvbiByZXR1cm4gaXQgaXMgdGhlIGFjdHVhbCByb290Ci0gICB0YWJsZSBpbmRleCBiaXRzLiAgSXQgd2lsbCBkaWZmZXIgaWYgdGhlIHJlcXVlc3QgaXMgZ3JlYXRlciB0aGFuIHRoZQotICAgbG9uZ2VzdCBjb2RlIG9yIGlmIGl0IGlzIGxlc3MgdGhhbiB0aGUgc2hvcnRlc3QgY29kZS4KLSAqLwotaW50IGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgY29kZXMsIHRhYmxlLCBiaXRzLCB3b3JrKQotY29kZXR5cGUgdHlwZTsKLXVuc2lnbmVkIHNob3J0IEZBUiAqbGVuczsKLXVuc2lnbmVkIGNvZGVzOwotY29kZSBGQVIgKiBGQVIgKnRhYmxlOwotdW5zaWduZWQgRkFSICpiaXRzOwotdW5zaWduZWQgc2hvcnQgRkFSICp3b3JrOwotewotICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBhIGNvZGUncyBsZW5ndGggaW4gYml0cyAqLwotICAgIHVuc2lnbmVkIHN5bTsgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBjb2RlIHN5bWJvbHMgKi8KLSAgICB1bnNpZ25lZCBtaW4sIG1heDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi8KLSAgICB1bnNpZ25lZCByb290OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi8KLSAgICB1bnNpZ25lZCBjdXJyOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi8KLSAgICB1bnNpZ25lZCBkcm9wOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqLwotICAgIGludCBsZWZ0OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcHJlZml4IGNvZGVzIGF2YWlsYWJsZSAqLwotICAgIHVuc2lnbmVkIHVzZWQ7ICAgICAgICAgICAgICAvKiBjb2RlIGVudHJpZXMgaW4gdGFibGUgdXNlZCAqLwotICAgIHVuc2lnbmVkIGh1ZmY7ICAgICAgICAgICAgICAvKiBIdWZmbWFuIGNvZGUgKi8KLSAgICB1bnNpZ25lZCBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqLwotICAgIHVuc2lnbmVkIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqLwotICAgIHVuc2lnbmVkIGxvdzsgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5ICovCi0gICAgdW5zaWduZWQgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi8KLSAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovCi0gICAgY29kZSBGQVIgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovCi0gICAgY29uc3QgdW5zaWduZWQgc2hvcnQgRkFSICpiYXNlOyAgICAgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBGQVIgKmV4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqLwotICAgIGludCBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqLwotICAgIHVuc2lnbmVkIHNob3J0IGNvdW50W01BWEJJVFMrMV07ICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqLwotICAgIHVuc2lnbmVkIHNob3J0IG9mZnNbTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxiYXNlWzMxXSA9IHsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGJhc2UgKi8KLSAgICAgICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSwKLSAgICAgICAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDB9OwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBsZXh0WzMxXSA9IHsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovCi0gICAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LAotICAgICAgICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgMjAxLCAxOTZ9OwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkYmFzZVszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi8KLSAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLAotICAgICAgICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsCi0gICAgICAgIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDB9OwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZXh0WzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi8KLSAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsCi0gICAgICAgIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LAotICAgICAgICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0fTsKLQotICAgIC8qCi0gICAgICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZQotICAgICAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZQotICAgICAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlCi0gICAgICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXIKLSAgICAgICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzCi0gICAgICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXIKLSAgICAgICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aAotICAgICAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHMKLSAgICAgICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlCi0gICAgICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXMKLSAgICAgICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLgotCi0gICAgICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW4KLSAgICAgICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLgotICAgICAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0Ci0gICAgICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS4KLQotICAgICAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCwKLSAgICAgICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGUKLSAgICAgICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWQKLSAgICAgICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnkKLSAgICAgICB0aGUgY2FsbGVyLgotCi0gICAgICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZwotICAgICAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueQotICAgICAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkCi0gICAgICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlCi0gICAgICAgZGVjb2RpbmcgdGFibGVzLgotICAgICAqLwotCi0gICAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovCi0gICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCi0gICAgICAgIGNvdW50W2xlbl0gPSAwOwotICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQotICAgICAgICBjb3VudFtsZW5zW3N5bV1dKys7Ci0KLSAgICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqLwotICAgIHJvb3QgPSAqYml0czsKLSAgICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkKLSAgICAgICAgaWYgKGNvdW50W21heF0gIT0gMCkgYnJlYWs7Ci0gICAgaWYgKHJvb3QgPiBtYXgpIHJvb3QgPSBtYXg7Ci0gICAgaWYgKG1heCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqLwotICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KLSAgICAgICAgdGhpcy5iaXRzID0gKHVuc2lnbmVkIGNoYXIpMTsKLSAgICAgICAgdGhpcy52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKLSAgICAgICAgKigqdGFibGUpKysgPSB0aGlzOyAgICAgICAgICAgICAvKiBtYWtlIGEgdGFibGUgdG8gZm9yY2UgYW4gZXJyb3IgKi8KLSAgICAgICAgKigqdGFibGUpKysgPSB0aGlzOwotICAgICAgICAqYml0cyA9IDE7Ci0gICAgICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqLwotICAgIH0KLSAgICBmb3IgKG1pbiA9IDE7IG1pbiA8PSBNQVhCSVRTOyBtaW4rKykKLSAgICAgICAgaWYgKGNvdW50W21pbl0gIT0gMCkgYnJlYWs7Ci0gICAgaWYgKHJvb3QgPCBtaW4pIHJvb3QgPSBtaW47Ci0KLSAgICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi8KLSAgICBsZWZ0ID0gMTsKLSAgICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykgewotICAgICAgICBsZWZ0IDw8PSAxOwotICAgICAgICBsZWZ0IC09IGNvdW50W2xlbl07Ci0gICAgICAgIGlmIChsZWZ0IDwgMCkgcmV0dXJuIC0xOyAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkICovCi0gICAgfQotICAgIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PSBDT0RFUyB8fCBtYXggIT0gMSkpCi0gICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi8KLQotICAgIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovCi0gICAgb2Zmc1sxXSA9IDA7Ci0gICAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykKLSAgICAgICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07Ci0KLSAgICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovCi0gICAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspCi0gICAgICAgIGlmIChsZW5zW3N5bV0gIT0gMCkgd29ya1tvZmZzW2xlbnNbc3ltXV0rK10gPSAodW5zaWduZWQgc2hvcnQpc3ltOwotCi0gICAgLyoKLSAgICAgICBDcmVhdGUgYW5kIGZpbGwgaW4gZGVjb2RpbmcgdGFibGVzLiAgSW4gdGhpcyBsb29wLCB0aGUgdGFibGUgYmVpbmcKLSAgICAgICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZgotICAgICAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcAotICAgICAgIGJpdHMgb2ZmIG9mIHRoZSBib3R0b20uICBGb3IgY29kZXMgd2hlcmUgbGVuIGlzIGxlc3MgdGhhbiBkcm9wICsgY3VyciwKLSAgICAgICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvCi0gICAgICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuCi0KLSAgICAgICByb290IGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgdGhlIHJvb3QgdGFibGUuICBXaGVuIGxlbiBleGNlZWRzCi0gICAgICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXgKLSAgICAgICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYQotICAgICAgIG5ldyBzdWItdGFibGUgc2hvdWxkIGJlIHN0YXJ0ZWQuICBkcm9wIGlzIHplcm8gd2hlbiB0aGUgcm9vdCB0YWJsZSBpcwotICAgICAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC4KLQotICAgICAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlCi0gICAgICAgY29kZSBsZW5ndGhzIHRvIGRldGVybWluZSB3aGF0IHNpemUgc3ViLXRhYmxlIGlzIG5lZWRlZC4gIFRoZSBsZW5ndGgKLSAgICAgICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZQotICAgICAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy4KLQotICAgICAgIHVzZWQga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdGFibGUgZW50cmllcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlCi0gICAgICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCB3aGVuIGEgTEVOUyB0YWJsZSBpcyBiZWluZyBtYWRlCi0gICAgICAgYWdhaW5zdCB0aGUgc3BhY2UgaW4gKnRhYmxlLCBFTk9VR0gsIG1pbnVzIHRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCBieQotICAgICAgIHRoZSB3b3JzdCBjYXNlIGRpc3RhbmNlIGNvZGUsIE1BWEQuICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCB0aGUKLSAgICAgICBzdWZmaWNpZW5jeSBvZiBFTk9VR0ggaGFzIG5vdCBiZWVuIHByb3ZlbiBleGhhdXN0aXZlbHksIGhlbmNlIHRoZSBjaGVjay4KLSAgICAgICBUaGlzIGFzc3VtZXMgdGhhdCB3aGVuIHR5cGUgPT0gTEVOUywgYml0cyA9PSA5LgotCi0gICAgICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlbgotICAgICAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXMKLSAgICAgICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzCi0gICAgICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLgotICAgICAqLwotCi0gICAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi8KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIENPREVTOgotICAgICAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi8KLSAgICAgICAgZW5kID0gMTk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTEVOUzoKLSAgICAgICAgYmFzZSA9IGxiYXNlOwotICAgICAgICBiYXNlIC09IDI1NzsKLSAgICAgICAgZXh0cmEgPSBsZXh0OwotICAgICAgICBleHRyYSAtPSAyNTc7Ci0gICAgICAgIGVuZCA9IDI1NjsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgICAgICAgICAvKiBESVNUUyAqLwotICAgICAgICBiYXNlID0gZGJhc2U7Ci0gICAgICAgIGV4dHJhID0gZGV4dDsKLSAgICAgICAgZW5kID0gLTE7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgbG9vcCAqLwotICAgIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovCi0gICAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovCi0gICAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovCi0gICAgbmV4dCA9ICp0YWJsZTsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqLwotICAgIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi8KLSAgICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqLwotICAgIGxvdyA9ICh1bnNpZ25lZCkoLTEpOyAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovCi0gICAgdXNlZCA9IDFVIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi8KLSAgICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqLwotCi0gICAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovCi0gICAgaWYgKHR5cGUgPT0gTEVOUyAmJiB1c2VkID49IEVOT1VHSCAtIE1BWEQpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgLyogcHJvY2VzcyBhbGwgY29kZXMgYW5kIG1ha2UgdGFibGUgZW50cmllcyAqLwotICAgIGZvciAoOzspIHsKLSAgICAgICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovCi0gICAgICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKShsZW4gLSBkcm9wKTsKLSAgICAgICAgaWYgKChpbnQpKHdvcmtbc3ltXSkgPCBlbmQpIHsKLSAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikwOwotICAgICAgICAgICAgdGhpcy52YWwgPSB3b3JrW3N5bV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKGludCkod29ya1tzeW1dKSA+IGVuZCkgewotICAgICAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKShleHRyYVt3b3JrW3N5bV1dKTsKLSAgICAgICAgICAgIHRoaXMudmFsID0gYmFzZVt3b3JrW3N5bV1dOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKSgzMiArIDY0KTsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi8KLSAgICAgICAgICAgIHRoaXMudmFsID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovCi0gICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gZHJvcCk7Ci0gICAgICAgIGZpbGwgPSAxVSA8PCBjdXJyOwotICAgICAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqLwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBmaWxsIC09IGluY3I7Ci0gICAgICAgICAgICBuZXh0WyhodWZmID4+IGRyb3ApICsgZmlsbF0gPSB0aGlzOwotICAgICAgICB9IHdoaWxlIChmaWxsICE9IDApOwotCi0gICAgICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovCi0gICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gMSk7Ci0gICAgICAgIHdoaWxlIChodWZmICYgaW5jcikKLSAgICAgICAgICAgIGluY3IgPj49IDE7Ci0gICAgICAgIGlmIChpbmNyICE9IDApIHsKLSAgICAgICAgICAgIGh1ZmYgJj0gaW5jciAtIDE7Ci0gICAgICAgICAgICBodWZmICs9IGluY3I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaHVmZiA9IDA7Ci0KLSAgICAgICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovCi0gICAgICAgIHN5bSsrOwotICAgICAgICBpZiAoLS0oY291bnRbbGVuXSkgPT0gMCkgewotICAgICAgICAgICAgaWYgKGxlbiA9PSBtYXgpIGJyZWFrOwotICAgICAgICAgICAgbGVuID0gbGVuc1t3b3JrW3N5bV1dOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY3JlYXRlIG5ldyBzdWItdGFibGUgaWYgbmVlZGVkICovCi0gICAgICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT0gbG93KSB7Ci0gICAgICAgICAgICAvKiBpZiBmaXJzdCB0aW1lLCB0cmFuc2l0aW9uIHRvIHN1Yi10YWJsZXMgKi8KLSAgICAgICAgICAgIGlmIChkcm9wID09IDApCi0gICAgICAgICAgICAgICAgZHJvcCA9IHJvb3Q7Ci0KLSAgICAgICAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi8KLSAgICAgICAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqLwotCi0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi8KLSAgICAgICAgICAgIGN1cnIgPSBsZW4gLSBkcm9wOwotICAgICAgICAgICAgbGVmdCA9IChpbnQpKDEgPDwgY3Vycik7Ci0gICAgICAgICAgICB3aGlsZSAoY3VyciArIGRyb3AgPCBtYXgpIHsKLSAgICAgICAgICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTsKLSAgICAgICAgICAgICAgICBpZiAobGVmdCA8PSAwKSBicmVhazsKLSAgICAgICAgICAgICAgICBjdXJyKys7Ci0gICAgICAgICAgICAgICAgbGVmdCA8PD0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqLwotICAgICAgICAgICAgdXNlZCArPSAxVSA8PCBjdXJyOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEVOUyAmJiB1c2VkID49IEVOT1VHSCAtIE1BWEQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovCi0gICAgICAgICAgICBsb3cgPSBodWZmICYgbWFzazsKLSAgICAgICAgICAgICgqdGFibGUpW2xvd10ub3AgPSAodW5zaWduZWQgY2hhciljdXJyOwotICAgICAgICAgICAgKCp0YWJsZSlbbG93XS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpcm9vdDsKLSAgICAgICAgICAgICgqdGFibGUpW2xvd10udmFsID0gKHVuc2lnbmVkIHNob3J0KShuZXh0IC0gKnRhYmxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICAgRmlsbCBpbiByZXN0IG9mIHRhYmxlIGZvciBpbmNvbXBsZXRlIGNvZGVzLiAgVGhpcyBsb29wIGlzIHNpbWlsYXIgdG8gdGhlCi0gICAgICAgbG9vcCBhYm92ZSBpbiBpbmNyZW1lbnRpbmcgaHVmZiBmb3IgdGFibGUgaW5kaWNlcy4gIEl0IGlzIGFzc3VtZWQgdGhhdAotICAgICAgIGxlbiBpcyBlcXVhbCB0byBjdXJyICsgZHJvcCwgc28gdGhlcmUgaXMgbm8gbG9vcCBuZWVkZWQgdG8gaW5jcmVtZW50Ci0gICAgICAgdGhyb3VnaCBoaWdoIGluZGV4IGJpdHMuICBXaGVuIHRoZSBjdXJyZW50IHN1Yi10YWJsZSBpcyBmaWxsZWQsIHRoZSBsb29wCi0gICAgICAgZHJvcHMgYmFjayB0byB0aGUgcm9vdCB0YWJsZSB0byBmaWxsIGluIGFueSByZW1haW5pbmcgZW50cmllcyB0aGVyZS4KLSAgICAgKi8KLSAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgICAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KLSAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7Ci0gICAgdGhpcy52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKLSAgICB3aGlsZSAoaHVmZiAhPSAwKSB7Ci0gICAgICAgIC8qIHdoZW4gZG9uZSB3aXRoIHN1Yi10YWJsZSwgZHJvcCBiYWNrIHRvIHJvb3QgdGFibGUgKi8KLSAgICAgICAgaWYgKGRyb3AgIT0gMCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgewotICAgICAgICAgICAgZHJvcCA9IDA7Ci0gICAgICAgICAgICBsZW4gPSByb290OwotICAgICAgICAgICAgbmV4dCA9ICp0YWJsZTsKLSAgICAgICAgICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKWxlbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHB1dCBpbnZhbGlkIGNvZGUgbWFya2VyIGluIHRhYmxlICovCi0gICAgICAgIG5leHRbaHVmZiA+PiBkcm9wXSA9IHRoaXM7Ci0KLSAgICAgICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi8KLSAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSAxKTsKLSAgICAgICAgd2hpbGUgKGh1ZmYgJiBpbmNyKQotICAgICAgICAgICAgaW5jciA+Pj0gMTsKLSAgICAgICAgaWYgKGluY3IgIT0gMCkgewotICAgICAgICAgICAgaHVmZiAmPSBpbmNyIC0gMTsKLSAgICAgICAgICAgIGh1ZmYgKz0gaW5jcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBodWZmID0gMDsKLSAgICB9Ci0KLSAgICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi8KLSAgICAqdGFibGUgKz0gdXNlZDsKLSAgICAqYml0cyA9IHJvb3Q7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJzL3psaWIvaW5mdHJlZXMuaCBiL2xpYnMvemxpYi9pbmZ0cmVlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTEwNGM4Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9pbmZ0cmVlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogaW5mdHJlZXMuaCAtLSBoZWFkZXIgdG8gdXNlIGluZnRyZWVzLmMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotLyogU3RydWN0dXJlIGZvciBkZWNvZGluZyB0YWJsZXMuICBFYWNoIGVudHJ5IHByb3ZpZGVzIGVpdGhlciB0aGUKLSAgIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgY29kZSB0aGF0Ci0gICBpbmRleGVkIHRoYXQgdGFibGUgZW50cnksIG9yIGl0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBhbm90aGVyCi0gICB0YWJsZSB0aGF0IGluZGV4ZXMgbW9yZSBiaXRzIG9mIHRoZSBjb2RlLiAgb3AgaW5kaWNhdGVzIHdoZXRoZXIKLSAgIHRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgdG8gYW5vdGhlciB0YWJsZSwgYSBsaXRlcmFsLCBhIGxlbmd0aCBvcgotICAgZGlzdGFuY2UsIGFuIGVuZC1vZi1ibG9jaywgb3IgYW4gaW52YWxpZCBjb2RlLiAgRm9yIGEgdGFibGUKLSAgIHBvaW50ZXIsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wIGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBvZgotICAgdGhhdCB0YWJsZS4gIEZvciBhIGxlbmd0aCBvciBkaXN0YW5jZSwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AKLSAgIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBnZXQgYWZ0ZXIgdGhlIGNvZGUuICBiaXRzIGlzCi0gICB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjb2RlIG9yIHBhcnQgb2YgdGhlIGNvZGUgdG8gZHJvcCBvZmYKLSAgIG9mIHRoZSBiaXQgYnVmZmVyLiAgdmFsIGlzIHRoZSBhY3R1YWwgYnl0ZSB0byBvdXRwdXQgaW4gdGhlIGNhc2UKLSAgIG9mIGEgbGl0ZXJhbCwgdGhlIGJhc2UgbGVuZ3RoIG9yIGRpc3RhbmNlLCBvciB0aGUgb2Zmc2V0IGZyb20KLSAgIHRoZSBjdXJyZW50IHRhYmxlIHRvIHRoZSBuZXh0IHRhYmxlLiAgRWFjaCBlbnRyeSBpcyBmb3VyIGJ5dGVzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGNoYXIgb3A7ICAgICAgICAgICAvKiBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIHRhYmxlIGJpdHMgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgICAgICAgLyogYml0cyBpbiB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB2YWw7ICAgICAgICAgLyogb2Zmc2V0IGluIHRhYmxlIG9yIGNvZGUgdmFsdWUgKi8KLX0gY29kZTsKLQotLyogb3AgdmFsdWVzIGFzIHNldCBieSBpbmZsYXRlX3RhYmxlKCk6Ci0gICAgMDAwMDAwMDAgLSBsaXRlcmFsCi0gICAgMDAwMHR0dHQgLSB0YWJsZSBsaW5rLCB0dHR0ICE9IDAgaXMgdGhlIG51bWJlciBvZiB0YWJsZSBpbmRleCBiaXRzCi0gICAgMDAwMWVlZWUgLSBsZW5ndGggb3IgZGlzdGFuY2UsIGVlZWUgaXMgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzCi0gICAgMDExMDAwMDAgLSBlbmQgb2YgYmxvY2sKLSAgICAwMTAwMDAwMCAtIGludmFsaWQgY29kZQotICovCi0KLS8qIE1heGltdW0gc2l6ZSBvZiBkeW5hbWljIHRyZWUuICBUaGUgbWF4aW11bSBmb3VuZCBpbiBhIGxvbmcgYnV0IG5vbi0KLSAgIGV4aGF1c3RpdmUgc2VhcmNoIHdhcyAxNDQ0IGNvZGUgc3RydWN0dXJlcyAoODUyIGZvciBsZW5ndGgvbGl0ZXJhbHMKLSAgIGFuZCA1OTIgZm9yIGRpc3RhbmNlcywgdGhlIGxhdHRlciBhY3R1YWxseSB0aGUgcmVzdWx0IG9mIGFuCi0gICBleGhhdXN0aXZlIHNlYXJjaCkuICBUaGUgdHJ1ZSBtYXhpbXVtIGlzIG5vdCBrbm93biwgYnV0IHRoZSB2YWx1ZQotICAgYmVsb3cgaXMgbW9yZSB0aGFuIHNhZmUuICovCi0jZGVmaW5lIEVOT1VHSCAyMDQ4Ci0jZGVmaW5lIE1BWEQgNTkyCi0KLS8qIFR5cGUgb2YgY29kZSB0byBidWlsZCBmb3IgaW5mdGFibGUoKSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBDT0RFUywKLSAgICBMRU5TLAotICAgIERJU1RTCi19IGNvZGV0eXBlOwotCi1leHRlcm4gaW50IGluZmxhdGVfdGFibGUgT0YoKGNvZGV0eXBlIHR5cGUsIHVuc2lnbmVkIHNob3J0IEZBUiAqbGVucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29kZXMsIGNvZGUgRkFSICogRkFSICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRkFSICpiaXRzLCB1bnNpZ25lZCBzaG9ydCBGQVIgKndvcmspKTsKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9tYWtlX3Ztcy5jb20gYi9saWJzL3psaWIvbWFrZV92bXMuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmExZmI1Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9tYWtlX3Ztcy5jb20KKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotJCEgbWFrZSBsaWJ6IHVuZGVyIFZNUyB3cml0dGVuIGJ5Ci0kISBNYXJ0aW4gUC5KLiBaaW5zZXIKLSQhIDx6aW5zZXJAemluc2VyLm5vLWlwLmluZm8gb3Igemluc2VyQHN5c2Rldi5kZXV0c2NoZS1ib2Vyc2UuY29tPgotJCEKLSQgb24gZXJyb3IgdGhlbiBnb3RvIGVycl9leGl0Ci0kIQotJCEKLSQhIEp1c3Qgc29tZSBnZW5lcmFsIGNvbnN0YW50cy4uLgotJCEKLSQgdHJ1ZSAgPSAxCi0kIGZhbHNlID0gMAotJCB0bXBuYW0gPSAidGVtcF8iICsgZiRnZXRqcGkoIiIsInBpZCIpCi0kIFNBWSA9ICJXUklURSBTWVMkT1VUUFVUIgotJCEKLSQhIFNldHVwIHZhcmlhYmxlcyBob2xkaW5nICJjb25maWciIGluZm9ybWF0aW9uCi0kIQotJCBNYWtlICAgICA9ICIiCi0kIG5hbWUgICAgID0gIlpsaWIiCi0kIHZlcnNpb24gID0gIj8uPy4/IgotJCB2X3N0cmluZyA9ICJaTElCX1ZFUlNJT04iCi0kIHZfZmlsZSAgID0gInpsaWIuaCIKLSQgY2NvcHQgICAgPSAiIgotJCBsb3B0cyAgICA9ICIiCi0kIGxpbmtvbmx5ID0gZmFsc2UKLSQgb3B0ZmlsZSAgPSBuYW1lICsgIi5vcHQiCi0kIGl0c19kZWNjID0gZmFsc2UKLSQgaXRzX3ZheGMgPSBmYWxzZQotJCBpdHNfZ251YyA9IGZhbHNlCi0kIGF4cCAgICAgID0gZiRnZXRzeWkoIkhXX01PREVMIikuZ2UuMTAyNAotJCBzX2Nhc2UgICA9IGZhbHNlCi0kISBDaGVjayBmb3IgTU1LL01NUwotJCEKLSQgSWYgRiRTZWFyY2ggKCJTeXMkU3lzdGVtOk1NUy5FWEUiKSAubmVzLiAiIiBUaGVuIE1ha2UgPSAiTU1TIgotJCBJZiBGJFR5cGUgKE1NSykgLmVxcy4gIlNUUklORyIgVGhlbiBNYWtlID0gIk1NSyIKLSQhCi0kIQotJCBnb3N1YiBmaW5kX3ZlcnNpb24KLSQhCi0kIGdvc3ViIGNoZWNrX29wdHMKLSQhCi0kISBMb29rIGZvciB0aGUgY29tcGlsZXIgdXNlZAotJCEKLSQgZ29zdWIgY2hlY2tfY29tcGlsZXIKLSQgaWYgaXRzX2RlY2MKLSQgdGhlbgotJCAgIGNjb3B0ID0gIi9wcmVmaXg9YWxsIiArIGNjb3B0Ci0kICAgaWYgZiR0cm5sbm0oIlNZUyIpIC5lcXMuICIiCi0kICAgdGhlbgotJCAgICAgaWYgYXhwCi0kICAgICB0aGVuCi0kICAgICAgIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6Ci0kICAgICBlbHNlCi0kICAgICAgIGNjb3B0ID0gIi9kZWNjIiArIGNjb3B0Ci0kICAgICAgIGRlZmluZSBzeXMgZGVjYyRsaWJyYXJ5X2luY2x1ZGU6Ci0kICAgICBlbmRpZgotJCAgIGVuZGlmCi0kIGVuZGlmCi0kIGlmIGl0c192YXhjIC5vci4gaXRzX2dudWMKLSQgdGhlbgotJCAgICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBzeXMkbGlicmFyeToKLSQgZW5kaWYKLSQhCi0kISBCdWlsZCB0aGUgdGhpbmcgcGxhaW4gb3Igd2l0aCBtbXMKLSQhCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkNvbXBpbGluZyBabGliIHNvdXJjZXMgLi4uIgotJCBpZiBtYWtlLmVxcy4iIgotJCAgdGhlbgotJCAgIGRlbGUgZXhhbXBsZS5vYmo7KixtaW5pZ3ppcC5vYmo7KgotJCAgIENBTEwgTUFLRSBhZGxlcjMyLk9CSiAiQ0MgJydDQ09QVCcgYWRsZXIzMiIgLQotICAgICAgICAgICAgICAgIGFkbGVyMzIuYyB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSBjb21wcmVzcy5PQkogIkNDICcnQ0NPUFQnIGNvbXByZXNzIiAtCi0gICAgICAgICAgICAgICAgY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSBjcmMzMi5PQkogIkNDICcnQ0NPUFQnIGNyYzMyIiAtCi0gICAgICAgICAgICAgICAgY3JjMzIuYyB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSBkZWZsYXRlLk9CSiAiQ0MgJydDQ09QVCcgZGVmbGF0ZSIgLQotICAgICAgICAgICAgICAgIGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSBnemlvLk9CSiAiQ0MgJydDQ09QVCcgZ3ppbyIgLQotICAgICAgICAgICAgICAgIGd6aW8uYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0kICAgQ0FMTCBNQUtFIGluZmJhY2suT0JKICJDQyAnJ0NDT1BUJyBpbmZiYWNrIiAtCi0gICAgICAgICAgICAgICAgaW5mYmFjay5jIHp1dGlsLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oIGluZmZpeGVkLmgKLSQgICBDQUxMIE1BS0UgaW5mZmFzdC5PQkogIkNDICcnQ0NPUFQnIGluZmZhc3QiIC0KLSAgICAgICAgICAgICAgICBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZmYXN0LmgKLSQgICBDQUxMIE1BS0UgaW5mbGF0ZS5PQkogIkNDICcnQ0NPUFQnIGluZmxhdGUiIC0KLSAgICAgICAgICAgICAgICBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCi0kICAgQ0FMTCBNQUtFIGluZnRyZWVzLk9CSiAiQ0MgJydDQ09QVCcgaW5mdHJlZXMiIC0KLSAgICAgICAgICAgICAgICBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotJCAgIENBTEwgTUFLRSB0cmVlcy5PQkogIkNDICcnQ0NPUFQnIHRyZWVzIiAtCi0gICAgICAgICAgICAgICAgdHJlZXMuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSB1bmNvbXByLk9CSiAiQ0MgJydDQ09QVCcgdW5jb21wciIgLQotICAgICAgICAgICAgICAgIHVuY29tcHIuYyB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSB6dXRpbC5PQkogIkNDICcnQ0NPUFQnIHp1dGlsIiAtCi0gICAgICAgICAgICAgICAgenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0kICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgWmxpYiAuLi4iCi0kICAgQ0FMTCBNQUtFIGxpYnouT0xCICJsaWIvY3JlYSBsaWJ6Lm9sYiAqLm9iaiIgKi5PQkoKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBleGFtcGxlLi4uIgotJCAgIENBTEwgTUFLRSBleGFtcGxlLk9CSiAiQ0MgJydDQ09QVCcgZXhhbXBsZSIgLQotICAgICAgICAgICAgICAgIGV4YW1wbGUuYyB6bGliLmggemNvbmYuaAotJCAgIGNhbGwgbWFrZSBleGFtcGxlLmV4ZSAiTElOSyBleGFtcGxlLGxpYnoub2xiL2xpYiIgZXhhbXBsZS5vYmogbGliei5vbGIKLSQgICBpZiBmJHNlYXJjaCgieDExdm1zOnh2bXN1dGlscy5vbGIiKSAubmVzLiAiIgotJCAgIHRoZW4KLSQgICAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIG1pbmlnemlwLi4uIgotJCAgICAgQ0FMTCBNQUtFIG1pbmlnemlwLk9CSiAiQ0MgJydDQ09QVCcgbWluaWd6aXAiIC0KLSAgICAgICAgICAgICAgICBtaW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCi0kICAgICBjYWxsIG1ha2UgbWluaWd6aXAuZXhlIC0KLSAgICAgICAgICAgICAgICAiTElOSyBtaW5pZ3ppcCxsaWJ6Lm9sYi9saWIseDExdm1zOnh2bXN1dGlscy5vbGIvbGliIiAtCi0gICAgICAgICAgICAgICAgbWluaWd6aXAub2JqIGxpYnoub2xiCi0kICAgZW5kaWYKLSQgIGVsc2UKLSQgICBnb3N1YiBjcmVhX21tcwotJCAgIFNBWSAiTWFrZSAnJ25hbWUnICcndmVyc2lvbicgd2l0aCAnJ01ha2UnICIKLSQgICAnbWFrZScKLSQgIGVuZGlmCi0kIQotJCEgQWxwaGEgZ2V0cyBhIHNoYXJlYWJsZSBpbWFnZQotJCEKLSQgSWYgYXhwCi0kIFRoZW4KLSQgICBnb3N1YiBjcmVhX29saXN0Ci0kICAgd3JpdGUgc3lzJG91dHB1dCAiQ3JlYXRpbmcgbGlienNoci5leGUiCi0kICAgY2FsbCBhbmFsX29ial9heHAgbW9kdWxlcy5vcHQgX2xpbmsub3B0Ci0kICAgaWYgc19jYXNlCi0kICAgdGhlbgotJCAgICAgIG9wZW4vYXBwZW5kIG9wdGYgbW9kdWxlcy5vcHQKLSQgICAgICB3cml0ZSBvcHRmICJjYXNlX3NlbnNpdGl2ZT1ZRVMiCi0kICAgICAgY2xvc2Ugb3B0ZgotJCAgIGVuZGlmCi0kICAgTElOS18nbG9wdHMnL1NIQVJFPWxpYnpzaHIuZXhlIG1vZHVsZXMub3B0L29wdCxfbGluay5vcHQvb3B0Ci0kIGVuZGlmCi0kIHdyaXRlIHN5cyRvdXRwdXQgIlpsaWIgYnVpbGQgY29tcGxldGVkIgotJCBleGl0Ci0kQ0NfRVJSOgotJCB3cml0ZSBzeXMkb3V0cHV0ICJDIGNvbXBpbGVyIHJlcXVpcmVkIHRvIGJ1aWxkICcnbmFtZSciCi0kIGdvdG8gZXJyX2V4aXQKLSRFUlJfRVhJVDoKLSQgc2V0IG1lc3NhZ2UvZmFjaWwvaWRlbnQvc2V2ZXIvdGV4dAotJCB3cml0ZSBzeXMkb3V0cHV0ICJFeGl0aW5nLi4uIgotJCBleGl0IDIKLSQhCi0kIQotJE1BS0U6IFNVQlJPVVRJTkUgICAhU1VCUk9VVElORSBUTyBDSEVDSyBERVBFTkRFTkNJRVMKLSQgViA9ICdGJFZlcmlmeSgwKQotJCEgUDEgPSBXaGF0IHdlIGFyZSB0cnlpbmcgdG8gbWFrZQotJCEgUDIgPSBDb21tYW5kIHRvIG1ha2UgaXQKLSQhIFAzIC0gUDggIFdoYXQgaXQgZGVwZW5kcyBvbgotJAotJCBJZiBGJFNlYXJjaChQMSkgLkVxcy4gIiIgVGhlbiBHb3RvIE1ha2VpdAotJCBUaW1lID0gRiRDdlRpbWUoRiRGaWxlKFAxLCJSRFQiKSkKLSRhcmc9MwotJExvb3A6Ci0kICAgICAgIEFyZ3VtZW50ID0gUCdhcmcKLSQgICAgICAgSWYgQXJndW1lbnQgLkVxcy4gIiIgVGhlbiBHb3RvIEV4aXQKLSQgICAgICAgRWw9MAotJExvb3AyOgotJCAgICAgICBGaWxlID0gRiRFbGVtZW50KEVsLCIgIixBcmd1bWVudCkKLSQgICAgICAgSWYgRmlsZSAuRXFzLiAiICIgVGhlbiBHb3RvIEVuZGwKLSQgICAgICAgQUZpbGUgPSAiIgotJExvb3AzOgotJCAgICAgICBPRmlsZSA9IEFGaWxlCi0kICAgICAgIEFGaWxlID0gRiRTZWFyY2goRmlsZSkKLSQgICAgICAgSWYgQUZpbGUgLkVxcy4gIiIgLk9yLiBBRmlsZSAuRXFzLiBPRmlsZSBUaGVuIEdvdG8gTmV4dEVsCi0kICAgICAgIElmIEYkQ3ZUaW1lKEYkRmlsZShBRmlsZSwiUkRUIikpIC5HZXMuIFRpbWUgVGhlbiBHb3RvIE1ha2VpdAotJCAgICAgICBHb3RvIExvb3AzCi0kTmV4dEVMOgotJCAgICAgICBFbCA9IEVsICsgMQotJCAgICAgICBHb3RvIExvb3AyCi0kRW5kTDoKLSQgYXJnPWFyZysxCi0kIElmIGFyZyAuTGUuIDggVGhlbiBHb3RvIExvb3AKLSQgR290byBFeGl0Ci0kCi0kTWFrZWl0OgotJCBWVj1GJFZFUklGWSgwKQotJCB3cml0ZSBzeXMkb3V0cHV0IFAyCi0kICdQMgotJCBWVj0nRiRWZXJpZnkoVlYpCi0kRXhpdDoKLSQgSWYgViBUaGVuIFNldCBWZXJpZnkKLSRFTkRTVUJST1VUSU5FCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIENoZWNrIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCBzZXQgc3ltYm9scyBhY2NvcmRpbmdseQotJCEKLSQgQ0hFQ0tfT1BUUzoKLSQgaSA9IDEKLSQgT1BUX0xPT1A6Ci0kIGlmIGkgLmx0LiA5Ci0kIHRoZW4KLSQgICBjcGFybSA9IGYkZWRpdChwJ2knLCJ1cGNhc2UiKQotJCAgIGlmIGNwYXJtIC5lcXMuICJERUJVRyIKLSQgICB0aGVuCi0kICAgICBjY29wdCA9IGNjb3B0ICsgIi9ub29wdC9kZWIiCi0kICAgICBsb3B0cyA9IGxvcHRzICsgIi9kZWIiCi0kICAgZW5kaWYKLSQgICBpZiBmJGxvY2F0ZSgiQ0NPUFQ9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKLSQgICB0aGVuCi0kICAgICBzdGFydCA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCi0kICAgICBsZW4gICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0Ci0kICAgICBjY29wdCA9IGNjb3B0ICsgZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKLSQgICAgIGlmIGYkbG9jYXRlKCJBU19JUyIsZiRlZGl0KGNjb3B0LCJVUENBU0UiKSkgLmx0LiBmJGxlbmd0aChjY29wdCkgLQotICAgICAgICAgdGhlbiBzX2Nhc2UgPSB0cnVlCi0kICAgZW5kaWYKLSQgICBpZiBjcGFybSAuZXFzLiAiTElOSyIgdGhlbiBsaW5rb25seSA9IHRydWUKLSQgICBpZiBmJGxvY2F0ZSgiTE9QVFM9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKLSQgICB0aGVuCi0kICAgICBzdGFydCA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCi0kICAgICBsZW4gICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0Ci0kICAgICBsb3B0cyA9IGxvcHRzICsgZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKLSQgICBlbmRpZgotJCAgIGlmIGYkbG9jYXRlKCJDQz0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQotJCAgIHRoZW4KLSQgICAgIHN0YXJ0ICA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCi0kICAgICBsZW4gICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAotJCAgICAgY2NfY29tID0gZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKLSAgICAgIGlmIChjY19jb20gLm5lcy4gIkRFQ0MiKSAuYW5kLiAtCi0gICAgICAgICAoY2NfY29tIC5uZXMuICJWQVhDIikgLmFuZC4gLQotCSAoY2NfY29tIC5uZXMuICJHTlVDIikKLSQgICAgIHRoZW4KLSQgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVW5zdXBwb3J0ZWQgY29tcGlsZXIgY2hvaWNlICcnY2NfY29tJyBpZ25vcmVkIgotJCAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVc2UgREVDQywgVkFYQywgb3IgR05VQyBpbnN0ZWFkIgotJCAgICAgZWxzZQotJCAgICAgCWlmIGNjX2NvbSAuZXFzLiAiREVDQyIgdGhlbiBpdHNfZGVjYyA9IHRydWUKLSQgICAgIAlpZiBjY19jb20gLmVxcy4gIlZBWEMiIHRoZW4gaXRzX3ZheGMgPSB0cnVlCi0kICAgICAJaWYgY2NfY29tIC5lcXMuICJHTlVDIiB0aGVuIGl0c19nbnVjID0gdHJ1ZQotJCAgICAgZW5kaWYKLSQgICBlbmRpZgotJCAgIGlmIGYkbG9jYXRlKCJNQUtFPSIsY3Bhcm0pIC5sdC4gZiRsZW5ndGgoY3Bhcm0pCi0kICAgdGhlbgotJCAgICAgc3RhcnQgID0gZiRsb2NhdGUoIj0iLGNwYXJtKSArIDEKLSQgICAgIGxlbiAgICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0Ci0kICAgICBtbWtzID0gZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKLSQgICAgIGlmIChtbWtzIC5lcXMuICJNTUsiKSAub3IuIChtbWtzIC5lcXMuICJNTVMiKQotJCAgICAgdGhlbgotJCAgICAgICBtYWtlID0gbW1rcwotJCAgICAgZWxzZQotJCAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVbnN1cHBvcnRlZCBtYWtlIGNob2ljZSAnJ21ta3MnIGlnbm9yZWQiCi0kICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVzZSBNTUsgb3IgTU1TIGluc3RlYWQiCi0kICAgICBlbmRpZgotJCAgIGVuZGlmCi0kICAgaSA9IGkgKyAxCi0kICAgZ290byBvcHRfbG9vcAotJCBlbmRpZgotJCByZXR1cm4KLSQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kIQotJCEgTG9vayBmb3IgdGhlIGNvbXBpbGVyIHVzZWQKLSQhCi0kQ0hFQ0tfQ09NUElMRVI6Ci0kIGlmICgubm90LiAoaXRzX2RlY2MgLm9yLiBpdHNfdmF4YyAub3IuIGl0c19nbnVjKSkKLSQgdGhlbgotJCAgIGl0c19kZWNjID0gKGYkc2VhcmNoKCJTWVMkU1lTVEVNOkRFQ0MkQ09NUElMRVIuRVhFIikgLm5lcy4gIiIpCi0kICAgaXRzX3ZheGMgPSAubm90LiBpdHNfZGVjYyAuYW5kLiAoRiRTZWFyY2goIlNZUyRTeXN0ZW06VkFYQy5FeGUiKSAubmVzLiAiIikKLSQgICBpdHNfZ251YyA9IC5ub3QuIChpdHNfZGVjYyAub3IuIGl0c192YXhjKSAuYW5kLiAoZiR0cm5sbm0oImdudV9jYyIpIC5uZXMuICIiKQotJCBlbmRpZgotJCEKLSQhIEV4aXQgaWYgbm8gY29tcGlsZXIgYXZhaWxhYmxlCi0kIQotJCBpZiAoLm5vdC4gKGl0c19kZWNjIC5vci4gaXRzX3ZheGMgLm9yLiBpdHNfZ251YykpCi0kIHRoZW4gZ290byBDQ19FUlIKLSQgZWxzZQotJCAgIGlmIGl0c19kZWNjIHRoZW4gd3JpdGUgc3lzJG91dHB1dCAiQ0MgY29tcGlsZXIgY2hlY2sgLi4uIENvbXBhcSBDIgotJCAgIGlmIGl0c192YXhjIHRoZW4gd3JpdGUgc3lzJG91dHB1dCAiQ0MgY29tcGlsZXIgY2hlY2sgLi4uIFZBWCBDIgotJCAgIGlmIGl0c19nbnVjIHRoZW4gd3JpdGUgc3lzJG91dHB1dCAiQ0MgY29tcGlsZXIgY2hlY2sgLi4uIEdOVSBDIgotJCBlbmRpZgotJCByZXR1cm4KLSQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kIQotJCEgSWYgTU1TL01NSyBhcmUgYXZhaWxhYmxlIGR1bXAgb3V0IHRoZSBkZXNjcmlwLm1tcyBpZiByZXF1aXJlZAotJCEKLSRDUkVBX01NUzoKLSQgd3JpdGUgc3lzJG91dHB1dCAiQ3JlYXRpbmcgZGVzY3JpcC5tbXMuLi4iCi0kIGNyZWF0ZSBkZXNjcmlwLm1tcwotJCBvcGVuL2FwcGVuZCBvdXQgZGVzY3JpcC5tbXMKLSQgY29weSBzeXMkaW5wdXQ6IG91dAotJCBkZWNrCi0jIGRlc2NyaXAubW1zOiBNTVMgZGVzY3JpcHRpb24gZmlsZSBmb3IgYnVpbGRpbmcgemxpYiBvbiBWTVMKLSMgd3JpdHRlbiBieSBNYXJ0aW4gUC5KLiBaaW5zZXIKLSMgPHppbnNlckB6aW5zZXIubm8taXAuaW5mbyBvciB6aW5zZXJAc3lzZGV2LmRldXRzY2hlLWJvZXJzZS5jb20+Ci0KLU9CSlMgPSBhZGxlcjMyLm9iaiwgY29tcHJlc3Mub2JqLCBjcmMzMi5vYmosIGd6aW8ub2JqLCB1bmNvbXByLm9iaiwgaW5mYmFjay5vYmpcCi0gICAgICAgZGVmbGF0ZS5vYmosIHRyZWVzLm9iaiwgenV0aWwub2JqLCBpbmZsYXRlLm9iaiwgXAotICAgICAgIGluZnRyZWVzLm9iaiwgaW5mZmFzdC5vYmoKLQotJCBlb2QKLSQgd3JpdGUgb3V0ICJDRkxBR1M9IiwgY2NvcHQKLSQgd3JpdGUgb3V0ICJMT1BUUz0iLCBsb3B0cwotJCBjb3B5IHN5cyRpbnB1dDogb3V0Ci0kIGRlY2sKLQotYWxsIDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlIGxpYnoub2xiCi0gICAgICAgIEAgd3JpdGUgc3lzJG91dHB1dCAiIEV4YW1wbGUgYXBwbGljYXRpb25zIGF2YWlsYWJsZSIKLQotbGliei5vbGIgOiBsaWJ6Lm9sYigkKE9CSlMpKQotCUAgd3JpdGUgc3lzJG91dHB1dCAiIGxpYnogYXZhaWxhYmxlIgotCi1leGFtcGxlLmV4ZSA6IGV4YW1wbGUub2JqIGxpYnoub2xiCi0gICAgICAgICAgICAgIGxpbmsgJChMT1BUUykgZXhhbXBsZSxsaWJ6Lm9sYi9saWIKLQotbWluaWd6aXAuZXhlIDogbWluaWd6aXAub2JqIGxpYnoub2xiCi0gICAgICAgICAgICAgIGxpbmsgJChMT1BUUykgbWluaWd6aXAsbGliei5vbGIvbGliLHgxMXZtczp4dm1zdXRpbHMub2xiL2xpYgotCi1jbGVhbiA6Ci0JZGVsZXRlICoub2JqOyosbGliei5vbGI7KiwqLm9wdDsqLCouZXhlOyoKLQotCi0jIE90aGVyIGRlcGVuZGVuY2llcy4KLWFkbGVyMzIub2JqICA6IGFkbGVyMzIuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1jb21wcmVzcy5vYmogOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCi1jcmMzMi5vYmogICAgOiBjcmMzMi5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWRlZmxhdGUub2JqICA6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotZXhhbXBsZS5vYmogIDogZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCi1nemlvLm9iaiAgICAgOiBnemlvLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAotaW5mZmFzdC5vYmogIDogaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZmYXN0LmgKLWluZmxhdGUub2JqICA6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1pbmZ0cmVlcy5vYmogOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotbWluaWd6aXAub2JqIDogbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAotdHJlZXMub2JqICAgIDogdHJlZXMuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotdW5jb21wci5vYmogIDogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCi16dXRpbC5vYmogICAgOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWluZmJhY2sub2JqICA6IGluZmJhY2suYyB6dXRpbC5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaCBpbmZmaXhlZC5oCi0kIGVvZAotJCBjbG9zZSBvdXQKLSQgcmV0dXJuCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIFJlYWQgbGlzdCBvZiBjb3JlIGxpYnJhcnkgc291cmNlcyBmcm9tIG1ha2VmaWxlLmluIGFuZCBjcmVhdGUgb3B0aW9ucwotJCEgbmVlZGVkIHRvIGJ1aWxkIHNoYXJlYWJsZSBpbWFnZQotJCEKLSRDUkVBX09MSVNUOgotJCBvcGVuL3JlYWQgbWluIG1ha2VmaWxlLmluCi0kIG9wZW4vd3JpdGUgbW9kIG1vZHVsZXMub3B0Ci0kIHNyY19jaGVjayA9ICJPQkpTID0iCi0kTVJMT09QOgotJCByZWFkL2VuZD1tcmRvbmUgbWluIHJlYwotJCBpZiAoZiRleHRyYWN0KDAsNixyZWMpIC5uZXMuIHNyY19jaGVjaykgdGhlbiBnb3RvIG1ybG9vcAotJCByZWMgPSByZWMgLSBzcmNfY2hlY2sKLSQgZ29zdWIgZXh0cmFfZmlsbmFtCi0kIGlmIChmJGVsZW1lbnQoMSwiXCIscmVjKSAuZXFzLiAiXCIpIHRoZW4gZ290byBtcmRvbmUKLSRNUlNMT09QOgotJCByZWFkL2VuZD1tcmRvbmUgbWluIHJlYwotJCBnb3N1YiBleHRyYV9maWxuYW0KLSQgaWYgKGYkZWxlbWVudCgxLCJcIixyZWMpIC5uZXMuICJcIikgdGhlbiBnb3RvIG1yc2xvb3AKLSRNUkRPTkU6Ci0kIGNsb3NlIG1pbgotJCBjbG9zZSBtb2QKLSQgcmV0dXJuCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIFRha2UgcmVjb3JkIGV4dHJhY3RlZCBpbiBjcmVhX29saXN0IGFuZCBzcGxpdCBpdCBpbnRvIHNpbmdsZSBmaWxlbmFtZXMKLSQhCi0kRVhUUkFfRklMTkFNOgotJCBteXJlYyA9IGYkZWRpdChyZWMgLSAiXCIsICJ0cmltLGNvbXByZXNzIikKLSQgaSA9IDAKLSRGRUxPT1A6Ci0kIHNyY2ZpbCA9IGYkZWxlbWVudChpLCIgIiwgbXlyZWMpCi0kIGlmIChzcmNmaWwgLm5lcy4gIiAiKQotJCB0aGVuCi0kICAgd3JpdGUgbW9kIGYkcGFyc2Uoc3JjZmlsLCwsIk5BTUUiKSwgIi5vYmoiCi0kICAgaSA9IGkgKyAxCi0kICAgZ290byBmZWxvb3AKLSQgZW5kaWYKLSQgcmV0dXJuCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIEZpbmQgY3VycmVudCBabGliIHZlcnNpb24gbnVtYmVyCi0kIQotJEZJTkRfVkVSU0lPTjoKLSQgb3Blbi9yZWFkIGhfaW4gJ3ZfZmlsZScKLSRobG9vcDoKLSQgcmVhZC9lbmQ9aGRvbmUgaF9pbiByZWMKLSQgcmVjID0gZiRlZGl0KHJlYywiVFJJTSIpCi0kIGlmIChmJGV4dHJhY3QoMCwxLHJlYykgLm5lcy4gIiMiKSB0aGVuIGdvdG8gaGxvb3AKLSQgcmVjID0gZiRlZGl0KHJlYyAtICIjIiwgIlRSSU0iKQotJCBpZiBmJGVsZW1lbnQoMCwiICIscmVjKSAubmVzLiAiZGVmaW5lIiB0aGVuIGdvdG8gaGxvb3AKLSQgaWYgZiRlbGVtZW50KDEsIiAiLHJlYykgLmVxcy4gdl9zdHJpbmcKLSQgdGhlbgotJCAgIHZlcnNpb24gPSAnZiRlbGVtZW50KDIsIiAiLHJlYyknCi0kICAgZ290byBoZG9uZQotJCBlbmRpZgotJCBnb3RvIGhsb29wCi0kaGRvbmU6Ci0kIGNsb3NlIGhfaW4KLSQgcmV0dXJuCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJCEKLSQhIEFuYWx5emUgT2JqZWN0IGZpbGVzIGZvciBPcGVuVk1TIEFYUCB0byBleHRyYWN0IFByb2NlZHVyZSBhbmQgRGF0YQotJCEgaW5mb3JtYXRpb24gdG8gYnVpbGQgYSBzeW1ib2wgdmVjdG9yIGZvciBhIHNoYXJlYWJsZSBpbWFnZQotJCEgQWxsIHRoZSAiYnJhaW5zIiBvZiB0aGlzIGxvZ2ljIHdhcyBzdWdnZXN0ZWQgYnkgSGFydG11dCBCZWNrZXIKLSQhIChIYXJ0bXV0LkJlY2tlckBjb21wYXEuY29tKS4gQWxsIHRoZSBidWdzIHdlcmUgaW50cm9kdWNlZCBieSBtZQotJCEgKHppbnNlckBkZWN1cy5kZSksIHNvIGlmIHlvdSBkbyBoYXZlIHByb2JsZW0gcmVwb3J0cyBwbGVhc2UgZG8gbm90Ci0kISBib3RoZXIgSGFydG11dC9IUCwgYnV0IGdldCBpbiB0b3VjaCB3aXRoIG1lCi0kIQotJCBBTkFMX09CSl9BWFA6IFN1YnJvdXRpbmUKLSQgViA9ICdGJFZlcmlmeSgwKQotJCBTQVkgOj0gIldSSVRFXyBTWVMkT1VUUFVUIgotJAotJCBJRiBGJFNFQVJDSCgiJydQMSciKSAuRVFTLiAiIgotJCBUSEVOCi0kICAgIFNBWSAiQU5BTF9PQkpfQVhQLUUtTk9TVUNIRklMRTogIEVycm9yLCBpbnB1dGZpbGUgJydwMScgbm90IGF2YWlsYWJsZSIKLSQgICAgZ290byBleGl0X2FhCi0kIEVORElGCi0kIElGICInJ1AyJyIgLkVRUy4gIiIKLSQgVEhFTgotJCAgICBTQVkgIkFOQUxfT0JKX0FYUDogIEVycm9yLCBubyBvdXRwdXQgZmlsZSBwcm92aWRlZCIKLSQgICAgZ290byBleGl0X2FhCi0kIEVORElGCi0kCi0kIG9wZW4vcmVhZCBpbiAncDEKLSQgY3JlYXRlIGEudG1wCi0kIG9wZW4vYXBwZW5kIGF0bXAgYS50bXAKLSQgbG9vcDoKLSQgcmVhZC9lbmQ9ZW5kX2xvb3AgaW4gbGluZQotJCBmPSBmJHNlYXJjaChsaW5lKQotJCBpZiBmIC5lcXMuICIiCi0kIHRoZW4KLSQJd3JpdGUgc3lzJG91dHB1dCAiQU5BTF9PQkpfQVhQLXctbm9zdWNoZmlsZSwgJydsaW5lJyIKLSQJZ290byBsb29wCi0kIGVuZGlmCi0kIGRlZmluZS91c2VyIHN5cyRvdXRwdXQgbmw6Ci0kIGRlZmluZS91c2VyIHN5cyRlcnJvciBubDoKLSQgYW5hbC9vYmovZ3NkICdmIC9vdXQ9eC50bXAKLSQgb3Blbi9yZWFkIHh0bXAgeC50bXAKLSQgWExPT1A6Ci0kIHJlYWQvZW5kPWVuZF94bG9vcCB4dG1wIHhsaW5lCi0kIHhsaW5lID0gZiRlZGl0KHhsaW5lLCJjb21wcmVzcyIpCi0kIHdyaXRlIGF0bXAgeGxpbmUKLSQgZ290byB4bG9vcAotJCBFTkRfWExPT1A6Ci0kIGNsb3NlIHh0bXAKLSQgZ290byBsb29wCi0kIGVuZF9sb29wOgotJCBjbG9zZSBpbgotJCBjbG9zZSBhdG1wCi0kIGlmIGYkc2VhcmNoKCJhLnRtcCIpIC5lcXMuICIiIC0KLQl0aGVuICQgZXhpdAotJCAhIGFsbCBnbG9iYWwgZGVmaW5pdGlvbnMKLSQgc2VhcmNoIGEudG1wICJzeW1ib2w6IiwiRUdTWSRWX0RFRiAxIiwiRUdTWSRWX05PUk0gMSIvb3V0PWIudG1wCi0kICEgYWxsIHByb2NlZHVyZXMKLSQgc2VhcmNoIGIudG1wICJFR1NZJFZfTk9STSAxIi93aW5kPSgwLDEpIC9vdXQ9Yy50bXAKLSQgc2VhcmNoIGMudG1wICJzeW1ib2w6Ii9vdXQ9ZC50bXAKLSQgZGVmaW5lL3VzZXIgc3lzJG91dHB1dCBubDoKLSQgZWRpdG8vZWR0L2NvbW1hbmQ9c3lzJGlucHV0IGQudG1wCi1zdWIvc3ltYm9sOiAiL3N5bWJvbF92ZWN0b3I9KC93aG9sZQotc3ViLyIvPVBST0NFRFVSRSkvd2hvbGUKLWV4aXQKLSQgISBhbGwgZGF0YQotJCBzZWFyY2ggYi50bXAgIkVHU1kkVl9ERUYgMSIvd2luZD0oMCwxKSAvb3V0PWUudG1wCi0kIHNlYXJjaCBlLnRtcCAic3ltYm9sOiIvb3V0PWYudG1wCi0kIGRlZmluZS91c2VyIHN5cyRvdXRwdXQgbmw6Ci0kIGVkaXRvL2VkdC9jb21tYW5kPXN5cyRpbnB1dCBmLnRtcAotc3ViL3N5bWJvbDogIi9zeW1ib2xfdmVjdG9yPSgvd2hvbGUKLXN1Yi8iLz1EQVRBKS93aG9sZQotZXhpdAotJCBzb3J0L25vZHVwbCBkLnRtcCxmLnRtcCAncDInCi0kIGRlbGV0ZSBhLnRtcDsqLGIudG1wOyosYy50bXA7KixkLnRtcDsqLGUudG1wOyosZi50bXA7KgotJCBpZiBmJHNlYXJjaCgieC50bXAiKSAubmVzLiAiIiAtCi0JdGhlbiAkIGRlbGV0ZSB4LnRtcDsqCi0kIQotJCBFWElUX0FBOgotJCBpZiBWIHRoZW4gc2V0IHZlcmlmeQotJCBlbmRzdWJyb3V0aW5lCi0kIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL21pbmlnemlwLXJlcy5yYyBiL2xpYnMvemxpYi9taW5pZ3ppcC1yZXMucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzE4OWYuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL21pbmlnemlwLXJlcy5yYworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8d2ludmVyLmg+Ci0gIAotI2RlZmluZSBWRVJfRklMRVZFUlNJT04gMSwyLDIsMTgyOAotI2RlZmluZSBWRVJfRklMRVZFUlNJT05fU1RSICIxLjIuMi4xODI4IgotI2RlZmluZSBWRVJfRklMRUxUVkVSU0lPTl9TVFIgIiIKLSNkZWZpbmUgVkVSX0xFR0FMQ09QWVJJR0hUX1NUUiAiqSAyMDA1IEplYW4tbG91cCBHYWlsbHkgPGpsb3VwQGd6aXAub3JnID4sIE1hcmsgQWRsZXIgPG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHU+IgotLy8jZGVmaW5lIFZFUl9DT01NRU5UX1NUUiAgIiIJIAotCi0jZGVmaW5lIFZFUl9GSUxFREVTQ1JJUFRJT05fU1RSICJabGliOiBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiAvIGRlY29tcHJlc3Npb24gbGlicmFyeSIKLSNkZWZpbmUgVkVSX0lOVEVSTkFMTkFNRV9TVFIgIm1pbmlnemlwIgotI2RlZmluZSBWRVJfT1JJR0lOQUxGSUxFTkFNRV9TVFIgIm1pbmlnemlwLmV4ZSIKLSNkZWZpbmUgVkVSX1dXV19TVFIgImh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYiIKLSNkZWZpbmUgVkVSX0NPTVBBTllOQU1FX1NUUiAiWmxpYiIKLSNkZWZpbmUgVkVSX0xJQ0VOU0VfU1RSICIoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLCBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4gSmVhbi1sb3VwIEdhaWxseSBNYXJrIEFkbGVyIGpsb3VwQGd6aXAub3JnIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUgIgotI2RlZmluZSBWRVJfTEVHQUxUUkFERU1BUktTX1NUUiAiWmxpYq4sIFpsaWKuLCBtaW5pZ3ppcK4iCi0KLSNkZWZpbmUgVkVSX1BST0RVQ1ROQU1FX1NUUiAiWmxpYiIKLSNkZWZpbmUgVkVSX1BST0RVQ1RWRVJTSU9OIDEsMiwyLDE4MjgKLSNkZWZpbmUgVkVSX1BST0RVQ1RWRVJTSU9OX1NUUiAiMS4yLjIuMTgyOCIKLQotCi0jdW5kZWYgT0ZGSUNJQUwKLSNkZWZpbmUgRklOQUwgICAgICAgICAgICAxCi0KLSNkZWZpbmUgR05VV0lOMzJfU1BFQ0lBTEJVSUxEX1NUUgkiR05VIGZvciBXaW4zMiA8Z251d2luMzIuc291cmNlZm9yZ2UubmV0PiIKLQotI2RlZmluZSBWRVJfRklMRVRZUEUJCQlWRlRfQVBQCi0jaWZuZGVmIFZFUl9GSUxFVFlQRQotI2RlZmluZSBWRVJfRklMRVRZUEUgICAgICAgICAgICAgICAgVkZUX0FQUAotI2VuZGlmCi0KLSNkZWZpbmUgVkVSX0ZJTEVTVUJUWVBFICAgICAgICAgICAgIFZGVDJfVU5LTk9XTgotCi0jaWZuZGVmIERFQlVHCi0jZGVmaW5lIFZFUl9ERUJVRyAgICAgICAgICAgICAgICAgICAwCi0jZWxzZSAvKiBERUJVRyAqLwotI2RlZmluZSBWRVJfREVCVUcgICAgICAgICAgICAgICAgICAgVlNfRkZfREVCVUcKLSNlbmRpZgotCi0jaWZuZGVmIFBBVENIRUQKLSNkZWZpbmUgVkVSX1BBVENIRUQgICAgICAgICAgICAgICAgICAgMAotI2Vsc2UgLyogUEFUQ0hFRCAqLwotI2RlZmluZSBWRVJfUEFUQ0hFRCAgICAgICAgICAgICAgICAgICBWU19GRl9QQVRDSEVECi0jZW5kaWYKLQotI2lmbmRlZiBPRkZJQ0lBTAotI2RlZmluZSBWRVJfU1BFQ0lBTEJVSUxEICAgICAgICAgICAgVlNfRkZfU1BFQ0lBTEJVSUxECi0jaWZuZGVmIFZFUl9TUEVDSUFMQlVJTERfU1RSCi0jZGVmaW5lIFZFUl9TUEVDSUFMQlVJTERfU1RSCQlHTlVXSU4zMl9TUEVDSUFMQlVJTERfU1RSCi0jZW5kaWYKLSNlbHNlIC8qIE9GRklDSUFMICovCi0jZGVmaW5lIFZFUl9TUEVDSUFMQlVJTEQgICAgICAgICAgICAwCi0jZW5kaWYgLyogT0ZGSUNJQUwgKi8KLQotI2lmbmRlZiBGSU5BTAotI2RlZmluZSBWRVJfUFJJVkFURUJVSUxEICAgICAgICAgICAgVlNfRkZfUFJJVkFURUJVSUxECi0jaWZuZGVmIFZFUl9QUklWQVRFQlVJTERfU1RSCi0jZGVmaW5lIFZFUl9QUklWQVRFQlVJTERfU1RSCQkiUHJlLXJlbGVhc2UiCi0jZW5kaWYgLyogVkVSX1BSSVZBVEVCVUlMRF9TVFIgKi8KLSNkZWZpbmUgVkVSX1BSRVJFTEVBU0UgICAgICAgICAgICAgIFZTX0ZGX1BSRVJFTEVBU0UKLSNlbHNlIC8qIEZJTkFMICovCi0jZGVmaW5lIFZFUl9QUklWQVRFQlVJTEQgICAgICAgICAgICAwCi0jZGVmaW5lIFZFUl9QUkVSRUxFQVNFICAgICAgICAgICAgICAwCi0jZW5kaWYgLyogRklOQUwgKi8KLQotI2RlZmluZSBWRVJfRklMRUZMQUdTTUFTSyAgICAgICAgICAgVlNfRkZJX0ZJTEVGTEFHU01BU0sKLSNkZWZpbmUgVkVSX0ZJTEVGTEFHUyAgICAgICAgICAgICAgIChWRVJfUFJJVkFURUJVSUxEfFZFUl9TUEVDSUFMQlVJTER8VkVSX1BSRVJFTEVBU0V8VkVSX0RFQlVHfFZFUl9QQVRDSEVEKQotCi0jZGVmaW5lIFZFUl9GSUxFT1MgICAgICAgICAgICAgICAgICBWT1NfX1dJTkRPV1MzMgotCi0jaWZkZWYgUkNfSU5WT0tFRAotCi1WU19WRVJTSU9OX0lORk8gICAgICAgICBWRVJTSU9OSU5GTwotRklMRVZFUlNJT04gICAgIAlWRVJfRklMRVZFUlNJT04KLVBST0RVQ1RWRVJTSU9OICAJVkVSX1BST0RVQ1RWRVJTSU9OCi1GSUxFRkxBR1NNQVNLICAgCVZFUl9GSUxFRkxBR1NNQVNLCi1GSUxFRkxBR1MgICAgICAgCVZFUl9GSUxFRkxBR1MKLUZJTEVPUyAgICAgICAgICAJVkVSX0ZJTEVPUwotRklMRVRZUEUgICAgICAgIAlWRVJfRklMRVRZUEUKLUZJTEVTVUJUWVBFICAgICAJVkVSX0ZJTEVTVUJUWVBFCi0KLUJFR0lOCi0gICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgotICAgIEJFR0lOCi0JQkxPQ0sgIjA0MDkwNEU0IgotICAgIC8qIGxhbmd1YWdlIElEID0gVS5TLiBFbmdsaXNoLCBjaGFyIHNldCA9IFdpbmRvd3MsIE11bHRpbGluZ3VhbCAqLwotCUJFR0lOCi0jaWZkZWYgVkVSX0NPTU1FTlRfU1RSCi0JICAgIFZBTFVFICJDb21tZW50cyIsICAgICAgICAgIFZFUl9DT01NRU5UX1NUUgotI2VuZGlmCi0JICAgIFZBTFVFICJDb21wYW55TmFtZSIsICAgICAgVkVSX0NPTVBBTllOQU1FX1NUUgotCSAgICBWQUxVRSAiTGljZW5zZSIsCQkgIFZFUl9MSUNFTlNFX1NUUgotCSAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgIFZFUl9GSUxFREVTQ1JJUFRJT05fU1RSCi0JICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICAgICAgVkVSX0ZJTEVWRVJTSU9OX1NUUgotI2lmICEoVkVSX0ZJTEVUWVBFLVZGVF9ETEwpCi0JICAgIFZBTFVFICJMaWJUb29sRmlsZVZlcnNpb24iLFZFUl9GSUxFTFRWRVJTSU9OX1NUUgotI2VuZGlmCi0JCVZBTFVFICJJbnRlcm5hbE5hbWUiLCAgICAgVkVSX0lOVEVSTkFMTkFNRV9TVFIKLSNpZmRlZiBWRVJfTEVHQUxDT1BZUklHSFRfU1RSCi0JCVZBTFVFICJMZWdhbENvcHlyaWdodCIsICAgVkVSX0xFR0FMQ09QWVJJR0hUX1NUUgotI2VuZGlmCi0jaWZkZWYgVkVSX0xFR0FMVFJBREVNQVJLU19TVFIKLQkgICAgVkFMVUUgIkxlZ2FsVHJhZGVtYXJrcyIsICBWRVJfTEVHQUxUUkFERU1BUktTX1NUUgotI2VuZGlmCi0JICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgVkVSX09SSUdJTkFMRklMRU5BTUVfU1RSCi0JICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICAgICAgVkVSX1BST0RVQ1ROQU1FX1NUUgotCSAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAgIFZFUl9QUk9EVUNUVkVSU0lPTl9TVFIKLSNpZmRlZiBWRVJfUEFUQ0hMRVZFTF9TVFIKLQkgICAgVkFMVUUgIlBhdGNoIGxldmVsIiwgIFZFUl9QQVRDSExFVkVMX1NUUgotI2VuZGlmCi0jaWZkZWYgVkVSX1BSSVZBVEVCVUlMRF9TVFIKLQkgICAgVkFMVUUgIlByaXZhdGVCdWlsZCIsICBWRVJfUFJJVkFURUJVSUxEX1NUUgotI2VuZGlmCi0jaWZkZWYgVkVSX1NQRUNJQUxCVUlMRF9TVFIKLQkgICAgVkFMVUUgIlNwZWNpYWxCdWlsZCIsICBWRVJfU1BFQ0lBTEJVSUxEX1NUUgotI2VuZGlmCi0jaWZkZWYgVkVSX0FVVEhPUl9TVFIKLQkgICAgVkFMVUUgIkF1dGhvcnMiLCAgVkVSX0FVVEhPUl9TVFIKLSNlbmRpZgotI2lmZGVmIFZFUl9XV1dfU1RSCi0JICAgIFZBTFVFICJXV1ciLCAgVkVSX1dXV19TVFIKLSNlbmRpZgotRU5ECi0gICAgRU5ECi0gICAgQkxPQ0sgIlZhckZpbGVJbmZvIgotICAgIEJFR0lOCi0JVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyNTIKLSAgICBFTkQKLUVORAotCi0jZW5kaWYgLyogIFJDX0lOVk9LRUQgKi8KLTUwMCBJQ09OIE1PVkVBQkxFIFBVUkUgTE9BRE9OQ0FMTCBESVNDQVJEQUJMRSAiemxpYi5pY28iCmRpZmYgLS1naXQgYS9saWJzL3psaWIvbWluaWd6aXAtc3RhdGljLXJlcy5yYyBiL2xpYnMvemxpYi9taW5pZ3ppcC1zdGF0aWMtcmVzLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGZiY2RmLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9taW5pZ3ppcC1zdGF0aWMtcmVzLnJjCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDx3aW52ZXIuaD4KLSAgCi0jZGVmaW5lIFZFUl9GSUxFVkVSU0lPTiAxLDIsMSwxNDI5Ci0jZGVmaW5lIFZFUl9GSUxFVkVSU0lPTl9TVFIgIjEuMi4xLjE0MjkiCi0jZGVmaW5lIFZFUl9GSUxFTFRWRVJTSU9OX1NUUiAiIgotI2RlZmluZSBWRVJfTEVHQUxDT1BZUklHSFRfU1RSICKpIDIwMDMgSmVhbi1sb3VwIEdhaWxseSA8amxvdXBAZ3ppcC5vcmcgPiwgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4iCi0vLyNkZWZpbmUgVkVSX0NPTU1FTlRfU1RSICAiIgkgCi0KLSNkZWZpbmUgVkVSX0ZJTEVERVNDUklQVElPTl9TVFIgIlpsaWI6IGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIC8gZGVjb21wcmVzc2lvbiBsaWJyYXJ5IgotI2RlZmluZSBWRVJfSU5URVJOQUxOQU1FX1NUUiAibWluaWd6aXAtc3RhdGljIgotI2RlZmluZSBWRVJfT1JJR0lOQUxGSUxFTkFNRV9TVFIgIm1pbmlnemlwLXN0YXRpYy5leGUiCi0jZGVmaW5lIFZFUl9XV1dfU1RSICJodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIiCi0jZGVmaW5lIFZFUl9DT01QQU5ZTkFNRV9TVFIgIlpsaWIiCi0jZGVmaW5lIFZFUl9MSUNFTlNFX1NUUiAiIChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlciBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLiBKZWFuLWxvdXAgR2FpbGx5IE1hcmsgQWRsZXIgamxvdXBAZ3ppcC5vcmcgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSIKLSNkZWZpbmUgVkVSX0xFR0FMVFJBREVNQVJLU19TVFIgIlpsaWKuLCBtaW5pZ3ppcC1zdGF0aWOuIgotCi0jZGVmaW5lIFZFUl9QUk9EVUNUTkFNRV9TVFIgIlpsaWIiCi0jZGVmaW5lIFZFUl9QUk9EVUNUVkVSU0lPTiAxLDIsMSwxNDI5Ci0jZGVmaW5lIFZFUl9QUk9EVUNUVkVSU0lPTl9TVFIgIjEuMi4xLjE0MjkiCi0KLSN1bmRlZiBPRkZJQ0lBTAotI2RlZmluZSBGSU5BTCAgICAgICAgICAgIDEKLQotI2RlZmluZSBHTlVXSU4zMl9TUEVDSUFMQlVJTERfU1RSCSJHTlUgZm9yIFdpbjMyIDxnbnV3aW4zMi5zb3VyY2Vmb3JnZS5uZXQ+IgotCi0jZGVmaW5lIFZFUl9GSUxFVFlQRQkJCVZGVF9BUFAKLSNpZm5kZWYgVkVSX0ZJTEVUWVBFCi0jZGVmaW5lIFZFUl9GSUxFVFlQRSAgICAgICAgICAgICAgICBWRlRfQVBQCi0jZW5kaWYKLQotI2RlZmluZSBWRVJfRklMRVNVQlRZUEUgICAgICAgICAgICAgVkZUMl9VTktOT1dOCi0KLSNpZm5kZWYgREVCVUcKLSNkZWZpbmUgVkVSX0RFQlVHICAgICAgICAgICAgICAgICAgIDAKLSNlbHNlIC8qIERFQlVHICovCi0jZGVmaW5lIFZFUl9ERUJVRyAgICAgICAgICAgICAgICAgICBWU19GRl9ERUJVRwotI2VuZGlmCi0KLSNpZm5kZWYgUEFUQ0hFRAotI2RlZmluZSBWRVJfUEFUQ0hFRCAgICAgICAgICAgICAgICAgICAwCi0jZWxzZSAvKiBQQVRDSEVEICovCi0jZGVmaW5lIFZFUl9QQVRDSEVEICAgICAgICAgICAgICAgICAgIFZTX0ZGX1BBVENIRUQKLSNlbmRpZgotCi0jaWZuZGVmIE9GRklDSUFMCi0jZGVmaW5lIFZFUl9TUEVDSUFMQlVJTEQgICAgICAgICAgICBWU19GRl9TUEVDSUFMQlVJTEQKLSNpZm5kZWYgVkVSX1NQRUNJQUxCVUlMRF9TVFIKLSNkZWZpbmUgVkVSX1NQRUNJQUxCVUlMRF9TVFIJCUdOVVdJTjMyX1NQRUNJQUxCVUlMRF9TVFIKLSNlbmRpZgotI2Vsc2UgLyogT0ZGSUNJQUwgKi8KLSNkZWZpbmUgVkVSX1NQRUNJQUxCVUlMRCAgICAgICAgICAgIDAKLSNlbmRpZiAvKiBPRkZJQ0lBTCAqLwotCi0jaWZuZGVmIEZJTkFMCi0jZGVmaW5lIFZFUl9QUklWQVRFQlVJTEQgICAgICAgICAgICBWU19GRl9QUklWQVRFQlVJTEQKLSNpZm5kZWYgVkVSX1BSSVZBVEVCVUlMRF9TVFIKLSNkZWZpbmUgVkVSX1BSSVZBVEVCVUlMRF9TVFIJCSJQcmUtcmVsZWFzZSIKLSNlbmRpZiAvKiBWRVJfUFJJVkFURUJVSUxEX1NUUiAqLwotI2RlZmluZSBWRVJfUFJFUkVMRUFTRSAgICAgICAgICAgICAgVlNfRkZfUFJFUkVMRUFTRQotI2Vsc2UgLyogRklOQUwgKi8KLSNkZWZpbmUgVkVSX1BSSVZBVEVCVUlMRCAgICAgICAgICAgIDAKLSNkZWZpbmUgVkVSX1BSRVJFTEVBU0UgICAgICAgICAgICAgIDAKLSNlbmRpZiAvKiBGSU5BTCAqLwotCi0jZGVmaW5lIFZFUl9GSUxFRkxBR1NNQVNLICAgICAgICAgICBWU19GRklfRklMRUZMQUdTTUFTSwotI2RlZmluZSBWRVJfRklMRUZMQUdTICAgICAgICAgICAgICAgKFZFUl9QUklWQVRFQlVJTER8VkVSX1NQRUNJQUxCVUlMRHxWRVJfUFJFUkVMRUFTRXxWRVJfREVCVUd8VkVSX1BBVENIRUQpCi0KLSNkZWZpbmUgVkVSX0ZJTEVPUyAgICAgICAgICAgICAgICAgIFZPU19fV0lORE9XUzMyCi0KLSNpZmRlZiBSQ19JTlZPS0VECi0KLVZTX1ZFUlNJT05fSU5GTyAgICAgICAgIFZFUlNJT05JTkZPCi1GSUxFVkVSU0lPTiAgICAgCVZFUl9GSUxFVkVSU0lPTgotUFJPRFVDVFZFUlNJT04gIAlWRVJfUFJPRFVDVFZFUlNJT04KLUZJTEVGTEFHU01BU0sgICAJVkVSX0ZJTEVGTEFHU01BU0sKLUZJTEVGTEFHUyAgICAgICAJVkVSX0ZJTEVGTEFHUwotRklMRU9TICAgICAgICAgIAlWRVJfRklMRU9TCi1GSUxFVFlQRSAgICAgICAgCVZFUl9GSUxFVFlQRQotRklMRVNVQlRZUEUgICAgIAlWRVJfRklMRVNVQlRZUEUKLQotQkVHSU4KLSAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0gICAgQkVHSU4KLQlCTE9DSyAiMDQwOTA0RTQiCi0gICAgLyogbGFuZ3VhZ2UgSUQgPSBVLlMuIEVuZ2xpc2gsIGNoYXIgc2V0ID0gV2luZG93cywgTXVsdGlsaW5ndWFsICovCi0JQkVHSU4KLSNpZmRlZiBWRVJfQ09NTUVOVF9TVFIKLQkgICAgVkFMVUUgIkNvbW1lbnRzIiwgICAgICAgICAgVkVSX0NPTU1FTlRfU1RSCi0jZW5kaWYKLQkgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgICAgICBWRVJfQ09NUEFOWU5BTUVfU1RSCi0JICAgIFZBTFVFICJMaWNlbnNlIiwJCSAgVkVSX0xJQ0VOU0VfU1RSCi0JICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAgVkVSX0ZJTEVERVNDUklQVElPTl9TVFIKLQkgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgICAgICBWRVJfRklMRVZFUlNJT05fU1RSCi0jaWYgIShWRVJfRklMRVRZUEUtVkZUX0RMTCkKLQkgICAgVkFMVUUgIkxpYlRvb2xGaWxlVmVyc2lvbiIsVkVSX0ZJTEVMVFZFUlNJT05fU1RSCi0jZW5kaWYKLQkJVkFMVUUgIkludGVybmFsTmFtZSIsICAgICBWRVJfSU5URVJOQUxOQU1FX1NUUgotI2lmZGVmIFZFUl9MRUdBTENPUFlSSUdIVF9TVFIKLQkJVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgICBWRVJfTEVHQUxDT1BZUklHSFRfU1RSCi0jZW5kaWYKLSNpZmRlZiBWRVJfTEVHQUxUUkFERU1BUktTX1NUUgotCSAgICBWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgIFZFUl9MRUdBTFRSQURFTUFSS1NfU1RSCi0jZW5kaWYKLQkgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCBWRVJfT1JJR0lOQUxGSUxFTkFNRV9TVFIKLQkgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgICAgICBWRVJfUFJPRFVDVE5BTUVfU1RSCi0JICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICAgVkVSX1BST0RVQ1RWRVJTSU9OX1NUUgotI2lmZGVmIFZFUl9QQVRDSExFVkVMX1NUUgotCSAgICBWQUxVRSAiUGF0Y2ggbGV2ZWwiLCAgVkVSX1BBVENITEVWRUxfU1RSCi0jZW5kaWYKLSNpZmRlZiBWRVJfUFJJVkFURUJVSUxEX1NUUgotCSAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwgIFZFUl9QUklWQVRFQlVJTERfU1RSCi0jZW5kaWYKLSNpZmRlZiBWRVJfU1BFQ0lBTEJVSUxEX1NUUgotCSAgICBWQUxVRSAiU3BlY2lhbEJ1aWxkIiwgIFZFUl9TUEVDSUFMQlVJTERfU1RSCi0jZW5kaWYKLUVORAotICAgIEVORAotICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKLSAgICBCRUdJTgotCVZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjUyCi0gICAgRU5ECi1FTkQKLQotI2VuZGlmIC8qICBSQ19JTlZPS0VEICovCi01MDAgSUNPTiBNT1ZFQUJMRSBQVVJFIExPQURPTkNBTEwgRElTQ0FSREFCTEUgInpsaWIuaWNvIgpkaWZmIC0tZ2l0IGEvbGlicy96bGliL21pbmlnemlwLmMgYi9saWJzL3psaWIvbWluaWd6aXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyNGI5Ni4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvbWluaWd6aXAuYworKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKiBtaW5pZ3ppcC5jIC0tIHNpbXVsYXRlIGd6aXAgdXNpbmcgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKgotICogbWluaWd6aXAgaXMgYSBtaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBnemlwIHV0aWxpdHkuIFRoaXMgaXMKLSAqIG9ubHkgYW4gZXhhbXBsZSBvZiB1c2luZyB6bGliIGFuZCBpc24ndCBtZWFudCB0byByZXBsYWNlIHRoZQotICogZnVsbC1mZWF0dXJlZCBnemlwLiBObyBhdHRlbXB0IGlzIG1hZGUgdG8gZGVhbCB3aXRoIGZpbGUgc3lzdGVtcwotICogbGltaXRpbmcgbmFtZXMgdG8gMTQgb3IgOCszIGNoYXJhY3RlcnMsIGV0Yy4uLiBFcnJvciBjaGVja2luZyBpcwotICogdmVyeSBsaW1pdGVkLiBTbyB1c2UgbWluaWd6aXAgb25seSBmb3IgdGVzdGluZzsgdXNlIGd6aXAgZm9yIHRoZQotICogcmVhbCB0aGluZy4gT24gTVNET1MsIHVzZSBvbmx5IG9uIGZpbGUgbmFtZXMgd2l0aG91dCBleHRlbnNpb24KLSAqIG9yIGluIHBpcGUgbW9kZS4KLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiemxpYi5oIgotCi0jaWZkZWYgU1REQwotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX01NQVAKLSMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyAgaW5jbHVkZSA8c3lzL21tYW4uaD4KLSMgIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jICBpbmNsdWRlIDxmY250bC5oPgotIyAgaW5jbHVkZSA8aW8uaD4KLSMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkgc2V0bW9kZShmaWxlbm8oZmlsZSksIE9fQklOQVJZKQotI2Vsc2UKLSMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkKLSNlbmRpZgotCi0jaWZkZWYgVk1TCi0jICBkZWZpbmUgdW5saW5rIGRlbGV0ZQotIyAgZGVmaW5lIEdaX1NVRkZJWCAiLWd6IgotI2VuZGlmCi0jaWZkZWYgUklTQ09TCi0jICBkZWZpbmUgdW5saW5rIHJlbW92ZQotIyAgZGVmaW5lIEdaX1NVRkZJWCAiLWd6IgotIyAgZGVmaW5lIGZpbGVubyhmaWxlKSBmaWxlLT5fX2ZpbGUKLSNlbmRpZgotI2lmIGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19kZXN0X29zICE9IF9fYmVfb3MgJiYgX19kZXN0X29zICE9IF9fd2luMzJfb3MKLSMgIGluY2x1ZGUgPHVuaXguaD4gLyogZm9yIGZpbGVubyAqLwotI2VuZGlmCi0KLSNpZm5kZWYgV0lOMzIgLyogdW5saW5rIGFscmVhZHkgaW4gc3RkaW8uaCBmb3IgV0lOMzIgKi8KLSAgZXh0ZXJuIGludCB1bmxpbmsgT0YoKGNvbnN0IGNoYXIgKikpOwotI2VuZGlmCi0KLSNpZm5kZWYgR1pfU1VGRklYCi0jICBkZWZpbmUgR1pfU1VGRklYICIuZ3oiCi0jZW5kaWYKLSNkZWZpbmUgU1VGRklYX0xFTiAoc2l6ZW9mKEdaX1NVRkZJWCktMSkKLQotI2RlZmluZSBCVUZMRU4gICAgICAxNjM4NAotI2RlZmluZSBNQVhfTkFNRV9MRU4gMTAyNAotCi0jaWZkZWYgTUFYU0VHXzY0SwotIyAgZGVmaW5lIGxvY2FsIHN0YXRpYwotICAgLyogTmVlZGVkIGZvciBzeXN0ZW1zIHdpdGggbGltaXRhdGlvbiBvbiBzdGFjayBzaXplLiAqLwotI2Vsc2UKLSMgIGRlZmluZSBsb2NhbAotI2VuZGlmCi0KLWNoYXIgKnByb2c7Ci0KLXZvaWQgZXJyb3IgICAgICAgICAgICBPRigoY29uc3QgY2hhciAqbXNnKSk7Ci12b2lkIGd6X2NvbXByZXNzICAgICAgT0YoKEZJTEUgICAqaW4sIGd6RmlsZSBvdXQpKTsKLSNpZmRlZiBVU0VfTU1BUAotaW50ICBnel9jb21wcmVzc19tbWFwIE9GKChGSUxFICAgKmluLCBnekZpbGUgb3V0KSk7Ci0jZW5kaWYKLXZvaWQgZ3pfdW5jb21wcmVzcyAgICBPRigoZ3pGaWxlIGluLCBGSUxFICAgKm91dCkpOwotdm9pZCBmaWxlX2NvbXByZXNzICAgIE9GKChjaGFyICAqZmlsZSwgY2hhciAqbW9kZSkpOwotdm9pZCBmaWxlX3VuY29tcHJlc3MgIE9GKChjaGFyICAqZmlsZSkpOwotaW50ICBtYWluICAgICAgICAgICAgIE9GKChpbnQgYXJnYywgY2hhciAqYXJndltdKSk7Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRGlzcGxheSBlcnJvciBtZXNzYWdlIGFuZCBleGl0Ci0gKi8KLXZvaWQgZXJyb3IobXNnKQotICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZywgbXNnKTsKLSAgICBleGl0KDEpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbXByZXNzIGlucHV0IHRvIG91dHB1dCB0aGVuIGNsb3NlIGJvdGggZmlsZXMuCi0gKi8KLQotdm9pZCBnel9jb21wcmVzcyhpbiwgb3V0KQotICAgIEZJTEUgICAqaW47Ci0gICAgZ3pGaWxlIG91dDsKLXsKLSAgICBsb2NhbCBjaGFyIGJ1ZltCVUZMRU5dOwotICAgIGludCBsZW47Ci0gICAgaW50IGVycjsKLQotI2lmZGVmIFVTRV9NTUFQCi0gICAgLyogVHJ5IGZpcnN0IGNvbXByZXNzaW5nIHdpdGggbW1hcC4gSWYgbW1hcCBmYWlscyAobWluaWd6aXAgdXNlZCBpbiBhCi0gICAgICogcGlwZSksIHVzZSB0aGUgbm9ybWFsIGZyZWFkIGxvb3AuCi0gICAgICovCi0gICAgaWYgKGd6X2NvbXByZXNzX21tYXAoaW4sIG91dCkgPT0gWl9PSykgcmV0dXJuOwotI2VuZGlmCi0gICAgZm9yICg7OykgewotICAgICAgICBsZW4gPSAoaW50KWZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIGluKTsKLSAgICAgICAgaWYgKGZlcnJvcihpbikpIHsKLSAgICAgICAgICAgIHBlcnJvcigiZnJlYWQiKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlbiA9PSAwKSBicmVhazsKLQotICAgICAgICBpZiAoZ3p3cml0ZShvdXQsIGJ1ZiwgKHVuc2lnbmVkKWxlbikgIT0gbGVuKSBlcnJvcihnemVycm9yKG91dCwgJmVycikpOwotICAgIH0KLSAgICBmY2xvc2UoaW4pOwotICAgIGlmIChnemNsb3NlKG91dCkgIT0gWl9PSykgZXJyb3IoImZhaWxlZCBnemNsb3NlIik7Ci19Ci0KLSNpZmRlZiBVU0VfTU1BUCAvKiBNTUFQIHZlcnNpb24sIE1pZ3VlbCBBbGJyZWNodCA8bWFsYnJlY2hAZXNvLm9yZz4gKi8KLQotLyogVHJ5IGNvbXByZXNzaW5nIHRoZSBpbnB1dCBmaWxlIGF0IG9uY2UgdXNpbmcgbW1hcC4gUmV0dXJuIFpfT0sgaWYKLSAqIGlmIHN1Y2Nlc3MsIFpfRVJSTk8gb3RoZXJ3aXNlLgotICovCi1pbnQgZ3pfY29tcHJlc3NfbW1hcChpbiwgb3V0KQotICAgIEZJTEUgICAqaW47Ci0gICAgZ3pGaWxlIG91dDsKLXsKLSAgICBpbnQgbGVuOwotICAgIGludCBlcnI7Ci0gICAgaW50IGlmZCA9IGZpbGVubyhpbik7Ci0gICAgY2FkZHJfdCBidWY7ICAgIC8qIG1tYXAnZWQgYnVmZmVyIGZvciB0aGUgZW50aXJlIGlucHV0IGZpbGUgKi8KLSAgICBvZmZfdCBidWZfbGVuOyAgLyogbGVuZ3RoIG9mIHRoZSBpbnB1dCBmaWxlICovCi0gICAgc3RydWN0IHN0YXQgc2I7Ci0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGZpbGUsIG5lZWRlZCBmb3IgbW1hcDogKi8KLSAgICBpZiAoZnN0YXQoaWZkLCAmc2IpIDwgMCkgcmV0dXJuIFpfRVJSTk87Ci0gICAgYnVmX2xlbiA9IHNiLnN0X3NpemU7Ci0gICAgaWYgKGJ1Zl9sZW4gPD0gMCkgcmV0dXJuIFpfRVJSTk87Ci0KLSAgICAvKiBOb3cgZG8gdGhlIGFjdHVhbCBtbWFwOiAqLwotICAgIGJ1ZiA9IG1tYXAoKGNhZGRyX3QpIDAsIGJ1Zl9sZW4sIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgaWZkLCAob2ZmX3QpMCk7Ci0gICAgaWYgKGJ1ZiA9PSAoY2FkZHJfdCkoLTEpKSByZXR1cm4gWl9FUlJOTzsKLQotICAgIC8qIENvbXByZXNzIHRoZSB3aG9sZSBmaWxlIGF0IG9uY2U6ICovCi0gICAgbGVuID0gZ3p3cml0ZShvdXQsIChjaGFyICopYnVmLCAodW5zaWduZWQpYnVmX2xlbik7Ci0KLSAgICBpZiAobGVuICE9IChpbnQpYnVmX2xlbikgZXJyb3IoZ3plcnJvcihvdXQsICZlcnIpKTsKLQotICAgIG11bm1hcChidWYsIGJ1Zl9sZW4pOwotICAgIGZjbG9zZShpbik7Ci0gICAgaWYgKGd6Y2xvc2Uob3V0KSAhPSBaX09LKSBlcnJvcigiZmFpbGVkIGd6Y2xvc2UiKTsKLSAgICByZXR1cm4gWl9PSzsKLX0KLSNlbmRpZiAvKiBVU0VfTU1BUCAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFVuY29tcHJlc3MgaW5wdXQgdG8gb3V0cHV0IHRoZW4gY2xvc2UgYm90aCBmaWxlcy4KLSAqLwotdm9pZCBnel91bmNvbXByZXNzKGluLCBvdXQpCi0gICAgZ3pGaWxlIGluOwotICAgIEZJTEUgICAqb3V0OwotewotICAgIGxvY2FsIGNoYXIgYnVmW0JVRkxFTl07Ci0gICAgaW50IGxlbjsKLSAgICBpbnQgZXJyOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBsZW4gPSBnenJlYWQoaW4sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICBpZiAobGVuIDwgMCkgZXJyb3IgKGd6ZXJyb3IoaW4sICZlcnIpKTsKLSAgICAgICAgaWYgKGxlbiA9PSAwKSBicmVhazsKLQotICAgICAgICBpZiAoKGludClmd3JpdGUoYnVmLCAxLCAodW5zaWduZWQpbGVuLCBvdXQpICE9IGxlbikgewotICAgICAgICAgICAgZXJyb3IoImZhaWxlZCBmd3JpdGUiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZmNsb3NlKG91dCkpIGVycm9yKCJmYWlsZWQgZmNsb3NlIik7Ci0KLSAgICBpZiAoZ3pjbG9zZShpbikgIT0gWl9PSykgZXJyb3IoImZhaWxlZCBnemNsb3NlIik7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb21wcmVzcyB0aGUgZ2l2ZW4gZmlsZTogY3JlYXRlIGEgY29ycmVzcG9uZGluZyAuZ3ogZmlsZSBhbmQgcmVtb3ZlIHRoZQotICogb3JpZ2luYWwuCi0gKi8KLXZvaWQgZmlsZV9jb21wcmVzcyhmaWxlLCBtb2RlKQotICAgIGNoYXIgICpmaWxlOwotICAgIGNoYXIgICptb2RlOwotewotICAgIGxvY2FsIGNoYXIgb3V0ZmlsZVtNQVhfTkFNRV9MRU5dOwotICAgIEZJTEUgICppbjsKLSAgICBnekZpbGUgb3V0OwotCi0gICAgc3RyY3B5KG91dGZpbGUsIGZpbGUpOwotICAgIHN0cmNhdChvdXRmaWxlLCBHWl9TVUZGSVgpOwotCi0gICAgaW4gPSBmb3BlbihmaWxlLCAicmIiKTsKLSAgICBpZiAoaW4gPT0gTlVMTCkgewotICAgICAgICBwZXJyb3IoZmlsZSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIG91dCA9IGd6b3BlbihvdXRmaWxlLCBtb2RlKTsKLSAgICBpZiAob3V0ID09IE5VTEwpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3QgZ3pvcGVuICVzXG4iLCBwcm9nLCBvdXRmaWxlKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgZ3pfY29tcHJlc3MoaW4sIG91dCk7Ci0KLSAgICB1bmxpbmsoZmlsZSk7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBVbmNvbXByZXNzIHRoZSBnaXZlbiBmaWxlIGFuZCByZW1vdmUgdGhlIG9yaWdpbmFsLgotICovCi12b2lkIGZpbGVfdW5jb21wcmVzcyhmaWxlKQotICAgIGNoYXIgICpmaWxlOwotewotICAgIGxvY2FsIGNoYXIgYnVmW01BWF9OQU1FX0xFTl07Ci0gICAgY2hhciAqaW5maWxlLCAqb3V0ZmlsZTsKLSAgICBGSUxFICAqb3V0OwotICAgIGd6RmlsZSBpbjsKLSAgICB1SW50IGxlbiA9ICh1SW50KXN0cmxlbihmaWxlKTsKLQotICAgIHN0cmNweShidWYsIGZpbGUpOwotCi0gICAgaWYgKGxlbiA+IFNVRkZJWF9MRU4gJiYgc3RyY21wKGZpbGUrbGVuLVNVRkZJWF9MRU4sIEdaX1NVRkZJWCkgPT0gMCkgewotICAgICAgICBpbmZpbGUgPSBmaWxlOwotICAgICAgICBvdXRmaWxlID0gYnVmOwotICAgICAgICBvdXRmaWxlW2xlbi0zXSA9ICdcMCc7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgb3V0ZmlsZSA9IGZpbGU7Ci0gICAgICAgIGluZmlsZSA9IGJ1ZjsKLSAgICAgICAgc3RyY2F0KGluZmlsZSwgR1pfU1VGRklYKTsKLSAgICB9Ci0gICAgaW4gPSBnem9wZW4oaW5maWxlLCAicmIiKTsKLSAgICBpZiAoaW4gPT0gTlVMTCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBnem9wZW4gJXNcbiIsIHByb2csIGluZmlsZSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIG91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOwotICAgIGlmIChvdXQgPT0gTlVMTCkgewotICAgICAgICBwZXJyb3IoZmlsZSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgZ3pfdW5jb21wcmVzcyhpbiwgb3V0KTsKLQotICAgIHVubGluayhpbmZpbGUpOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVXNhZ2U6ICBtaW5pZ3ppcCBbLWRdIFstZl0gWy1oXSBbLXJdIFstMSB0byAtOV0gW2ZpbGVzLi4uXQotICogICAtZCA6IGRlY29tcHJlc3MKLSAqICAgLWYgOiBjb21wcmVzcyB3aXRoIFpfRklMVEVSRUQKLSAqICAgLWggOiBjb21wcmVzcyB3aXRoIFpfSFVGRk1BTl9PTkxZCi0gKiAgIC1yIDogY29tcHJlc3Mgd2l0aCBaX1JMRQotICogICAtMSB0byAtOSA6IGNvbXByZXNzaW9uIGxldmVsCi0gKi8KLQotaW50IG1haW4oYXJnYywgYXJndikKLSAgICBpbnQgYXJnYzsKLSAgICBjaGFyICphcmd2W107Ci17Ci0gICAgaW50IHVuY29tcHIgPSAwOwotICAgIGd6RmlsZSBmaWxlOwotICAgIGNoYXIgb3V0bW9kZVsyMF07Ci0KLSAgICBzdHJjcHkob3V0bW9kZSwgIndiNiAiKTsKLQotICAgIHByb2cgPSBhcmd2WzBdOwotICAgIGFyZ2MtLSwgYXJndisrOwotCi0gICAgd2hpbGUgKGFyZ2MgPiAwKSB7Ci0gICAgICBpZiAoc3RyY21wKCphcmd2LCAiLWQiKSA9PSAwKQotICAgICAgICB1bmNvbXByID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1mIikgPT0gMCkKLSAgICAgICAgb3V0bW9kZVszXSA9ICdmJzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1oIikgPT0gMCkKLSAgICAgICAgb3V0bW9kZVszXSA9ICdoJzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1yIikgPT0gMCkKLSAgICAgICAgb3V0bW9kZVszXSA9ICdSJzsKLSAgICAgIGVsc2UgaWYgKCgqYXJndilbMF0gPT0gJy0nICYmICgqYXJndilbMV0gPj0gJzEnICYmICgqYXJndilbMV0gPD0gJzknICYmCi0gICAgICAgICAgICAgICAoKmFyZ3YpWzJdID09IDApCi0gICAgICAgIG91dG1vZGVbMl0gPSAoKmFyZ3YpWzFdOwotICAgICAgZWxzZQotICAgICAgICBicmVhazsKLSAgICAgIGFyZ2MtLSwgYXJndisrOwotICAgIH0KLSAgICBpZiAob3V0bW9kZVszXSA9PSAnICcpCi0gICAgICAgIG91dG1vZGVbM10gPSAwOwotICAgIGlmIChhcmdjID09IDApIHsKLSAgICAgICAgU0VUX0JJTkFSWV9NT0RFKHN0ZGluKTsKLSAgICAgICAgU0VUX0JJTkFSWV9NT0RFKHN0ZG91dCk7Ci0gICAgICAgIGlmICh1bmNvbXByKSB7Ci0gICAgICAgICAgICBmaWxlID0gZ3pkb3BlbihmaWxlbm8oc3RkaW4pLCAicmIiKTsKLSAgICAgICAgICAgIGlmIChmaWxlID09IE5VTEwpIGVycm9yKCJjYW4ndCBnemRvcGVuIHN0ZGluIik7Ci0gICAgICAgICAgICBnel91bmNvbXByZXNzKGZpbGUsIHN0ZG91dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaWxlID0gZ3pkb3BlbihmaWxlbm8oc3Rkb3V0KSwgb3V0bW9kZSk7Ci0gICAgICAgICAgICBpZiAoZmlsZSA9PSBOVUxMKSBlcnJvcigiY2FuJ3QgZ3pkb3BlbiBzdGRvdXQiKTsKLSAgICAgICAgICAgIGd6X2NvbXByZXNzKHN0ZGluLCBmaWxlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICh1bmNvbXByKSB7Ci0gICAgICAgICAgICAgICAgZmlsZV91bmNvbXByZXNzKCphcmd2KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmlsZV9jb21wcmVzcygqYXJndiwgb3V0bW9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGFyZ3YrKywgLS1hcmdjKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJzL3psaWIvbXNkb3MvTWFrZWZpbGUuYm9yIGIvbGlicy96bGliL21zZG9zL01ha2VmaWxlLmJvcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4MTMyZC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvbXNkb3MvTWFrZWZpbGUuYm9yCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHpsaWIKLSMgQm9ybGFuZCBDKysKLSMgTGFzdCB1cGRhdGVkOiAxNS1NYXItMjAwMwotCi0jIFRvIHVzZSwgZG8gIm1ha2UgLWZtYWtlZmlsZS5ib3IiCi0jIFRvIGNvbXBpbGUgaW4gc21hbGwgbW9kZWwsIHNldCBiZWxvdzogTU9ERUw9cwotCi0jIFdBUk5JTkc6IHRoZSBzbWFsbCBtb2RlbCBpcyBzdXBwb3J0ZWQgYnV0IG9ubHkgZm9yIHNtYWxsIHZhbHVlcyBvZgotIyBNQVhfV0JJVFMgYW5kIE1BWF9NRU1fTEVWRUwuIEZvciBleGFtcGxlOgotIyAgICAtRE1BWF9XQklUUz0xMSAtRERFRl9XQklUUz0xMSAtRE1BWF9NRU1fTEVWRUw9MwotIyBJZiB5b3Ugd2lzaCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKGRlZmF1bHQgMjU2SyBmb3IgYmlnCi0jIG9iamVjdHMgcGx1cyBhIGZldyBLKSwgeW91IGNhbiBhZGQgdG8gdGhlIExPQyBtYWNybyBiZWxvdzoKLSMgICAtRE1BWF9NRU1fTEVWRUw9NyAtRE1BWF9XQklUUz0xNAotIyBTZWUgemNvbmYuaCBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cy4KLQotIyAtLS0tLS0tLS0tLS0gVHVyYm8gQysrLCBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KLQotIyAgICBPcHRpb25hbCBub25zdGFuZGFyZCBwcmVwcm9jZXNzb3IgZmxhZ3MgKGUuZy4gLURNQVhfTUVNX0xFVkVMPTcpCi0jICAgIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQgdmlhICJzZXQgTE9DQUxfWkxJQj0tREZPTyIgb3IgYWRkZWQKLSMgICAgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIExPQyBoZXJlOgotTE9DID0gJChMT0NBTF9aTElCKQotCi0jIHR5cGUgZm9yIENQVSByZXF1aXJlZDogMDogODA4NiwgMTogODAxODYsIDI6IDgwMjg2LCAzOiA4MDM4NiwgZXRjLgotQ1BVX1RZUCA9IDAKLQotIyBtZW1vcnkgbW9kZWw6IG9uZSBvZiBzLCBtLCBjLCBsIChzbWFsbCwgbWVkaXVtLCBjb21wYWN0LCBsYXJnZSkKLU1PREVMPWwKLQotIyByZXBsYWNlIGJjYyB3aXRoIHRjYyBmb3IgVHVyYm8gQysrIDEuMCwgd2l0aCBiY2MzMiBmb3IgdGhlIDMyIGJpdCB2ZXJzaW9uCi1DQz1iY2MKLUxEPWJjYwotQVI9dGxpYgotCi0jIGNvbXBpbGVyIGZsYWdzCi0jIHJlcGxhY2UgIi1PMiIgYnkgIi1PIC1HIC1hIC1kIiBmb3IgVHVyYm8gQysrIDEuMAotQ0ZMQUdTPS1PMiAtWiAtbSQoTU9ERUwpICQoTE9DKQotCi1MREZMQUdTPS1tJChNT0RFTCkgLWYtCi0KLQotIyB2YXJpYWJsZXMKLVpMSUJfTElCID0gemxpYl8kKE1PREVMKS5saWIKLQotT0JKMSA9IGFkbGVyMzIub2JqIGNvbXByZXNzLm9iaiBjcmMzMi5vYmogZGVmbGF0ZS5vYmogZ3ppby5vYmogaW5mYmFjay5vYmoKLU9CSjIgPSBpbmZmYXN0Lm9iaiBpbmZsYXRlLm9iaiBpbmZ0cmVlcy5vYmogdHJlZXMub2JqIHVuY29tcHIub2JqIHp1dGlsLm9iagotT0JKUDEgPSArYWRsZXIzMi5vYmorY29tcHJlc3Mub2JqK2NyYzMyLm9iaitkZWZsYXRlLm9iaitnemlvLm9iaitpbmZiYWNrLm9iagotT0JKUDIgPSAraW5mZmFzdC5vYmoraW5mbGF0ZS5vYmoraW5mdHJlZXMub2JqK3RyZWVzLm9iait1bmNvbXByLm9iait6dXRpbC5vYmoKLQotCi0jIHRhcmdldHMKLWFsbDogJChaTElCX0xJQikgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0KLS5jLm9iajoKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1hZGxlcjMyLm9iajogYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCi0KLWNvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAotCi1jcmMzMi5vYmo6IGNyYzMyLmMgemxpYi5oIHpjb25mLmggY3JjMzIuaAotCi1kZWZsYXRlLm9iajogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWd6aW8ub2JqOiBnemlvLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAotCi1pbmZiYWNrLm9iajogaW5mYmFjay5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAotIGluZmZhc3QuaCBpbmZmaXhlZC5oCi0KLWluZmZhc3Qub2JqOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oCi0KLWluZmxhdGUub2JqOiBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotCi10cmVlcy5vYmo6IHRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBkZWZsYXRlLmggdHJlZXMuaAotCi11bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCi0KLXp1dGlsLm9iajogenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWV4YW1wbGUub2JqOiBleGFtcGxlLmMgemxpYi5oIHpjb25mLmgKLQotbWluaWd6aXAub2JqOiBtaW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCi0KLQotIyB0aGUgY29tbWFuZCBsaW5lIGlzIGN1dCB0byBmaXQgaW4gdGhlIE1TLURPUyAxMjggYnl0ZSBsaW1pdDoKLSQoWkxJQl9MSUIpOiAkKE9CSjEpICQoT0JKMikKLQktZGVsICQoWkxJQl9MSUIpCi0JJChBUikgJChaTElCX0xJQikgJChPQkpQMSkKLQkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAyKQotCi1leGFtcGxlLmV4ZTogZXhhbXBsZS5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCi0KLW1pbmlnemlwLmV4ZTogbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCi0JJChMRCkgJChMREZMQUdTKSBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKLQotdGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0JZXhhbXBsZQotCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCi0KLWNsZWFuOgotCS1kZWwgKi5vYmoKLQktZGVsICoubGliCi0JLWRlbCAqLmV4ZQotCS1kZWwgemxpYl8qLmJhawotCS1kZWwgZm9vLmd6CmRpZmYgLS1naXQgYS9saWJzL3psaWIvbXNkb3MvTWFrZWZpbGUuZGoyIGIvbGlicy96bGliL21zZG9zL01ha2VmaWxlLmRqMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzZDFkOS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvbXNkb3MvTWFrZWZpbGUuZGoyCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHpsaWIuICBNb2RpZmllZCBmb3IgZGpncHAgdjIuMCBieSBGLiBKLiBEb25haG9lLCAzLzE1Lzk2LgotIyBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5LgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0KLSMgVG8gY29tcGlsZSwgb3IgdG8gY29tcGlsZSBhbmQgdGVzdCwgdHlwZToKLSMKLSMgICBtYWtlIC1mbWFrZWZpbGUuZGoyOyAgbWFrZSB0ZXN0IC1mbWFrZWZpbGUuZGoyCi0jCi0jIFRvIGluc3RhbGwgbGliei5hLCB6Y29uZi5oIGFuZCB6bGliLmggaW4gdGhlIGRqZ3BwIGRpcmVjdG9yaWVzLCB0eXBlOgotIwotIyAgICBtYWtlIGluc3RhbGwgLWZtYWtlZmlsZS5kajIKLSMKLSMgYWZ0ZXIgZmlyc3QgZGVmaW5pbmcgTElCUkFSWV9QQVRIIGFuZCBJTkNMVURFX1BBVEggaW4gZGpncHAuZW52IGFzCi0jIGluIHRoZSBzYW1wbGUgYmVsb3cgaWYgdGhlIHBhdHRlcm4gb2YgdGhlIERKR1BQIGRpc3RyaWJ1dGlvbiBpcyB0bwotIyBiZSBmb2xsb3dlZC4gIFJlbWVtYmVyIHRoYXQsIHdoaWxlIDxzcD4nZXMgYXJvdW5kIDw9PiBhcmUgaWdub3JlZCBpbgotIyBtYWtlZmlsZXMsIHRoZXkgYXJlICpub3QqIGluIGJhdGNoIGZpbGVzIG9yIGluIGRqZ3BwLmVudi4KLSMgLSAtIC0gLSAtCi0jIFttYWtlXQotIyBJTkNMVURFX1BBVEg9JVw+O0lOQ0xVREVfUEFUSCUlXERKRElSJVxpbmNsdWRlCi0jIExJQlJBUllfUEFUSD0lXD47TElCUkFSWV9QQVRIJSVcREpESVIlXGxpYgotIyBCVVRUPS1tNDg2Ci0jIC0gLSAtIC0gLQotIyBBbHRlcm5hdGVseSwgdGhlc2UgdmFyaWFibGVzIG1heSBiZSBkZWZpbmVkIGJlbG93LCBvdmVycmlkaW5nIHRoZSB2YWx1ZXMKLSMgaW4gZGpncHAuZW52LCBhcwotIyBJTkNMVURFX1BBVEg9YzpcdXNyXGluY2x1ZGUKLSMgTElCUkFSWV9QQVRIPWM6XHVzclxsaWIKLQotQ0M9Z2NjCi0KLSNDRkxBR1M9LU1NRCAtTwotI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NwotI0NGTEFHUz0tTU1EIC1nIC1EREVCVUcKLUNGTEFHUz0tTU1EIC1PMyAkKEJVVFQpIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKLSAgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCi0KLSMgSWYgY3AuZXhlIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAiY29weSAvWSIgd2l0aCAiY3AgLWZwIiAuCi1DUD1jb3B5IC9ZCi0jIElmIGdudSBpbnN0YWxsLmV4ZSBpcyBhdmFpbGFibGUsIHJlcGxhY2UgJChDUCkgd2l0aCBnaW5zdGFsbC4KLUlOU1RBTEw9JChDUCkKLSMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgUk0gaXMgInJtIC1mLiIgIElmICJybS5leGUiIGlzIGZvdW5kLCBjb21tZW50IG91dDoKLVJNPWRlbAotTERMSUJTPS1MLiAtbHoKLUxEPSQoQ0MpIC1zIC1vCi1MRFNIQVJFRD0kKENDKQotCi1JTkNMPXpsaWIuaCB6Y29uZi5oCi1MSUJTPWxpYnouYQotCi1BUj1hciByY3MKLQotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6aW8ubyB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8gXAotICAgICAgIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubwotCi1PQkpBID0KLSMgdG8gdXNlIHRoZSBhc20gY29kZTogbWFrZSBPQkpBPW1hdGNoLm8KLQotVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KLQotYWxsOiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotY2hlY2s6IHRlc3QKLXRlc3Q6IGFsbAotCS4vZXhhbXBsZQotCWVjaG8gaGVsbG8gd29ybGQgfCAuXG1pbmlnemlwIHwgLlxtaW5pZ3ppcCAtZAotCi0lLm8gOiAlLmMKLQkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKLQotbGliei5hOiAkKE9CSlMpICQoT0JKQSkKLQkkKEFSKSAkQCAkKE9CSlMpICQoT0JKQSkKLQotJS5leGUgOiAlLm8gJChMSUJTKQotCSQoTEQpICRAICQ8ICQoTERMSUJTKQotCi0jIElOQ0xVREVfUEFUSCBhbmQgTElCUkFSWV9QQVRIIHdlcmUgc2V0IGZvciBbbWFrZV0gaW4gZGpncHAuZW52IC4KLQotLlBIT05ZIDogdW5pbnN0YWxsIGNsZWFuCi0KLWluc3RhbGw6ICQoSU5DTCkgJChMSUJTKQotCS1AaWYgbm90IGV4aXN0ICQoSU5DTFVERV9QQVRIKVxudWwgbWtkaXIgJChJTkNMVURFX1BBVEgpCi0JLUBpZiBub3QgZXhpc3QgJChMSUJSQVJZX1BBVEgpXG51bCBta2RpciAkKExJQlJBUllfUEFUSCkKLQkkKElOU1RBTEwpIHpsaWIuaCAkKElOQ0xVREVfUEFUSCkKLQkkKElOU1RBTEwpIHpjb25mLmggJChJTkNMVURFX1BBVEgpCi0JJChJTlNUQUxMKSBsaWJ6LmEgJChMSUJSQVJZX1BBVEgpCi0KLXVuaW5zdGFsbDoKLQkkKFJNKSAkKElOQ0xVREVfUEFUSClcemxpYi5oCi0JJChSTSkgJChJTkNMVURFX1BBVEgpXHpjb25mLmgKLQkkKFJNKSAkKExJQlJBUllfUEFUSClcbGliei5hCi0KLWNsZWFuOgotCSQoUk0pICouZAotCSQoUk0pICoubwotCSQoUk0pICouZXhlCi0JJChSTSkgbGliei5hCi0JJChSTSkgZm9vLmd6Ci0KLURFUFMgOj0gJCh3aWxkY2FyZCAqLmQpCi1pZm5lcSAoJChERVBTKSwpCi1pbmNsdWRlICQoREVQUykKLWVuZGlmCmRpZmYgLS1naXQgYS9saWJzL3psaWIvbXNkb3MvTWFrZWZpbGUuZW14IGIvbGlicy96bGliL21zZG9zL01ha2VmaWxlLmVteApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YzMxZi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvbXNkb3MvTWFrZWZpbGUuZW14CisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYi4gIE1vZGlmaWVkIGZvciBlbXggMC45YyBieSBDaHIuIFNwaWVsZXIsIDYvMTcvOTguCi0jIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEplYW4tbG91cCBHYWlsbHkuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLQotIyBUbyBjb21waWxlLCBvciB0byBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgotIwotIyAgIG1ha2UgLWZtYWtlZmlsZS5lbXg7ICBtYWtlIHRlc3QgLWZtYWtlZmlsZS5lbXgKLSMKLQotQ0M9Z2NjCi0KLSNDRkxBR1M9LU1NRCAtTwotI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NwotI0NGTEFHUz0tTU1EIC1nIC1EREVCVUcKLUNGTEFHUz0tTU1EIC1PMyAkKEJVVFQpIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKLSAgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCi0KLSMgSWYgY3AuZXhlIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAiY29weSAvWSIgd2l0aCAiY3AgLWZwIiAuCi1DUD1jb3B5IC9ZCi0jIElmIGdudSBpbnN0YWxsLmV4ZSBpcyBhdmFpbGFibGUsIHJlcGxhY2UgJChDUCkgd2l0aCBnaW5zdGFsbC4KLUlOU1RBTEw9JChDUCkKLSMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgUk0gaXMgInJtIC1mLiIgIElmICJybS5leGUiIGlzIGZvdW5kLCBjb21tZW50IG91dDoKLVJNPWRlbAotTERMSUJTPS1MLiAtbHpsaWIKLUxEPSQoQ0MpIC1zIC1vCi1MRFNIQVJFRD0kKENDKQotCi1JTkNMPXpsaWIuaCB6Y29uZi5oCi1MSUJTPXpsaWIuYQotCi1BUj1hciByY3MKLQotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6aW8ubyB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8gXAotICAgICAgIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubwotCi1URVNUX09CSlMgPSBleGFtcGxlLm8gbWluaWd6aXAubwotCi1hbGw6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCi10ZXN0OiBhbGwKLQkuL2V4YW1wbGUKLQllY2hvIGhlbGxvIHdvcmxkIHwgLlxtaW5pZ3ppcCB8IC5cbWluaWd6aXAgLWQKLQotJS5vIDogJS5jCi0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0KLXpsaWIuYTogJChPQkpTKQotCSQoQVIpICRAICQoT0JKUykKLQotJS5leGUgOiAlLm8gJChMSUJTKQotCSQoTEQpICRAICQ8ICQoTERMSUJTKQotCi0KLS5QSE9OWSA6IGNsZWFuCi0KLWNsZWFuOgotCSQoUk0pICouZAotCSQoUk0pICoubwotCSQoUk0pICouZXhlCi0JJChSTSkgemxpYi5hCi0JJChSTSkgZm9vLmd6Ci0KLURFUFMgOj0gJCh3aWxkY2FyZCAqLmQpCi1pZm5lcSAoJChERVBTKSwpCi1pbmNsdWRlICQoREVQUykKLWVuZGlmCmRpZmYgLS1naXQgYS9saWJzL3psaWIvbXNkb3MvTWFrZWZpbGUubXNjIGIvbGlicy96bGliL21zZG9zL01ha2VmaWxlLm1zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmYzY2NS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvbXNkb3MvTWFrZWZpbGUubXNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHpsaWIKLSMgTWljcm9zb2Z0IEMgNS4xIG9yIGxhdGVyCi0jIExhc3QgdXBkYXRlZDogMTktTWFyLTIwMDMKLQotIyBUbyB1c2UsIGRvICJtYWtlIG1ha2VmaWxlLm1zYyIKLSMgVG8gY29tcGlsZSBpbiBzbWFsbCBtb2RlbCwgc2V0IGJlbG93OiBNT0RFTD1TCi0KLSMgSWYgeW91IHdpc2ggdG8gcmVkdWNlIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIChkZWZhdWx0IDI1NksgZm9yIGJpZwotIyBvYmplY3RzIHBsdXMgYSBmZXcgSyksIHlvdSBjYW4gYWRkIHRvIHRoZSBMT0MgbWFjcm8gYmVsb3c6Ci0jICAgLURNQVhfTUVNX0xFVkVMPTcgLURNQVhfV0JJVFM9MTQKLSMgU2VlIHpjb25mLmggZm9yIGRldGFpbHMgYWJvdXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMuCi0KLSMgLS0tLS0tLS0tLS0tLSBNaWNyb3NvZnQgQyA1LjEgYW5kIGxhdGVyIC0tLS0tLS0tLS0tLS0KLQotIyAgICBPcHRpb25hbCBub25zdGFuZGFyZCBwcmVwcm9jZXNzb3IgZmxhZ3MgKGUuZy4gLURNQVhfTUVNX0xFVkVMPTcpCi0jICAgIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQgdmlhICJzZXQgTE9DQUxfWkxJQj0tREZPTyIgb3IgYWRkZWQKLSMgICAgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIExPQyBoZXJlOgotTE9DID0gJChMT0NBTF9aTElCKQotCi0jIFR5cGUgZm9yIENQVSByZXF1aXJlZDogMDogODA4NiwgMTogODAxODYsIDI6IDgwMjg2LCAzOiA4MDM4NiwgZXRjLgotQ1BVX1RZUCA9IDAKLQotIyBNZW1vcnkgbW9kZWw6IG9uZSBvZiBTLCBNLCBDLCBMIChzbWFsbCwgbWVkaXVtLCBjb21wYWN0LCBsYXJnZSkKLU1PREVMPUwKLQotQ0M9Y2wKLUNGTEFHUz0tbm9sb2dvIC1BJChNT0RFTCkgLUckKENQVV9UWVApIC1XMyAtT2FpdCAtR3MgJChMT0MpCi0jLU94IGdlbmVyYXRlcyBiYWQgY29kZSB3aXRoIE1TQyA1LjEKLUxJQl9DRkxBR1M9LVpsICQoQ0ZMQUdTKQotCi1MRD1saW5rCi1MREZMQUdTPS9ub2kvZS9zdDoweDE1MDAvbm9lL2ZhcmNhbGwvcGFja2NvZGUKLSMgIi9mYXJjYWxsL3BhY2tjb2RlIiBhcmUgb25seSB1c2VmdWwgZm9yIGBsYXJnZSBjb2RlJyBtZW1vcnkgbW9kZWxzCi0jIGJ1dCBzaG91bGQgYmUgYSAibm8tb3AiIGZvciBzbWFsbCBjb2RlIG1vZGVscy4KLQotCi0jIHZhcmlhYmxlcwotWkxJQl9MSUIgPSB6bGliXyQoTU9ERUwpLmxpYgotCi1PQkoxID0gYWRsZXIzMi5vYmogY29tcHJlc3Mub2JqIGNyYzMyLm9iaiBkZWZsYXRlLm9iaiBnemlvLm9iaiBpbmZiYWNrLm9iagotT0JKMiA9IGluZmZhc3Qub2JqIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiB0cmVlcy5vYmogdW5jb21wci5vYmogenV0aWwub2JqCi0KLQotIyB0YXJnZXRzCi1hbGw6ICAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotLmMub2JqOgotCSQoQ0MpIC1jICQoTElCX0NGTEFHUykgJCouYwotCi1hZGxlcjMyLm9iajogYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCi0KLWNvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAotCi1jcmMzMi5vYmo6IGNyYzMyLmMgemxpYi5oIHpjb25mLmggY3JjMzIuaAotCi1kZWZsYXRlLm9iajogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWd6aW8ub2JqOiBnemlvLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAotCi1pbmZiYWNrLm9iajogaW5mYmFjay5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAotIGluZmZhc3QuaCBpbmZmaXhlZC5oCi0KLWluZmZhc3Qub2JqOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oCi0KLWluZmxhdGUub2JqOiBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotCi10cmVlcy5vYmo6IHRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBkZWZsYXRlLmggdHJlZXMuaAotCi11bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCi0KLXp1dGlsLm9iajogenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWV4YW1wbGUub2JqOiBleGFtcGxlLmMgemxpYi5oIHpjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi1taW5pZ3ppcC5vYmo6IG1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKLQkkKENDKSAtYyAkKENGTEFHUykgJCouYwotCi0KLSMgdGhlIGNvbW1hbmQgbGluZSBpcyBjdXQgdG8gZml0IGluIHRoZSBNUy1ET1MgMTI4IGJ5dGUgbGltaXQ6Ci0kKFpMSUJfTElCKTogJChPQkoxKSAkKE9CSjIpCi0JaWYgZXhpc3QgJChaTElCX0xJQikgZGVsICQoWkxJQl9MSUIpCi0JbGliICQoWkxJQl9MSUIpICQoT0JKMSk7Ci0JbGliICQoWkxJQl9MSUIpICQoT0JKMik7Ci0KLWV4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQotCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmosLCwkKFpMSUJfTElCKTsKLQotbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIG1pbmlnemlwLm9iaiwsLCQoWkxJQl9MSUIpOwotCi10ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQlleGFtcGxlCi0JZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKLQotY2xlYW46Ci0JLWRlbCAqLm9iagotCS1kZWwgKi5saWIKLQktZGVsICouZXhlCi0JLWRlbCAqLm1hcAotCS1kZWwgemxpYl8qLmJhawotCS1kZWwgZm9vLmd6CmRpZmYgLS1naXQgYS9saWJzL3psaWIvbXNkb3MvTWFrZWZpbGUudGMgYi9saWJzL3psaWIvbXNkb3MvTWFrZWZpbGUudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MDc1MGEuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL21zZG9zL01ha2VmaWxlLnRjCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYgotIyBUdXJibyBDIDIuMDEsIFR1cmJvIEMrKyAxLjAxCi0jIExhc3QgdXBkYXRlZDogMTUtTWFyLTIwMDMKLQotIyBUbyB1c2UsIGRvICJtYWtlIC1mbWFrZWZpbGUudGMiCi0jIFRvIGNvbXBpbGUgaW4gc21hbGwgbW9kZWwsIHNldCBiZWxvdzogTU9ERUw9cwotCi0jIFdBUk5JTkc6IHRoZSBzbWFsbCBtb2RlbCBpcyBzdXBwb3J0ZWQgYnV0IG9ubHkgZm9yIHNtYWxsIHZhbHVlcyBvZgotIyBNQVhfV0JJVFMgYW5kIE1BWF9NRU1fTEVWRUwuIEZvciBleGFtcGxlOgotIyAgICAtRE1BWF9XQklUUz0xMSAtRE1BWF9NRU1fTEVWRUw9MwotIyBJZiB5b3Ugd2lzaCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKGRlZmF1bHQgMjU2SyBmb3IgYmlnCi0jIG9iamVjdHMgcGx1cyBhIGZldyBLKSwgeW91IGNhbiBhZGQgdG8gQ0ZMQUdTIGJlbG93OgotIyAgIC1ETUFYX01FTV9MRVZFTD03IC1ETUFYX1dCSVRTPTE0Ci0jIFNlZSB6Y29uZi5oIGZvciBkZXRhaWxzIGFib3V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzLgotCi0jIC0tLS0tLS0tLS0tLSBUdXJibyBDIDIuMDEsIFR1cmJvIEMrKyAxLjAxIC0tLS0tLS0tLS0tLQotTU9ERUw9bAotQ0M9dGNjCi1MRD10Y2MKLUFSPXRsaWIKLSMgQ0ZMQUdTPS1PMiAtRyAtWiAtbSQoTU9ERUwpIC1ETUFYX1dCSVRTPTExIC1ETUFYX01FTV9MRVZFTD0zCi1DRkxBR1M9LU8yIC1HIC1aIC1tJChNT0RFTCkKLUxERkxBR1M9LW0kKE1PREVMKSAtZi0KLQotCi0jIHZhcmlhYmxlcwotWkxJQl9MSUIgPSB6bGliXyQoTU9ERUwpLmxpYgotCi1PQkoxID0gYWRsZXIzMi5vYmogY29tcHJlc3Mub2JqIGNyYzMyLm9iaiBkZWZsYXRlLm9iaiBnemlvLm9iaiBpbmZiYWNrLm9iagotT0JKMiA9IGluZmZhc3Qub2JqIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiB0cmVlcy5vYmogdW5jb21wci5vYmogenV0aWwub2JqCi1PQkpQMSA9ICthZGxlcjMyLm9iaitjb21wcmVzcy5vYmorY3JjMzIub2JqK2RlZmxhdGUub2JqK2d6aW8ub2JqK2luZmJhY2sub2JqCi1PQkpQMiA9ICtpbmZmYXN0Lm9iaitpbmZsYXRlLm9iaitpbmZ0cmVlcy5vYmordHJlZXMub2JqK3VuY29tcHIub2JqK3p1dGlsLm9iagotCi0KLSMgdGFyZ2V0cwotYWxsOiAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotLmMub2JqOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCi0KLWFkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKLQotY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCi0KLWNyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCi0KLWRlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZ3ppby5vYmo6IGd6aW8uYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWluZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmgKLQotaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmggaW5mZml4ZWQuaAotCi1pbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi0KLXRyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCi0KLXVuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKLQotenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZXhhbXBsZS5vYmo6IGV4YW1wbGUuYyB6bGliLmggemNvbmYuaAotCi1taW5pZ3ppcC5vYmo6IG1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKLQotCi0jIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgotJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQotCS1kZWwgJChaTElCX0xJQikKLQkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAxKQotCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDIpCi0KLWV4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQotCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmogJChaTElCX0xJQikKLQotbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKLQkkKExEKSAkKExERkxBR1MpIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQotCi10ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQlleGFtcGxlCi0JZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKLQotY2xlYW46Ci0JLWRlbCAqLm9iagotCS1kZWwgKi5saWIKLQktZGVsICouZXhlCi0JLWRlbCB6bGliXyouYmFrCi0JLWRlbCBmb28uZ3oKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9vbGQvTWFrZWZpbGUucmlzY29zIGIvbGlicy96bGliL29sZC9NYWtlZmlsZS5yaXNjb3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZTI5ZDMuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL29sZC9NYWtlZmlsZS5yaXNjb3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotIyBQcm9qZWN0OiAgIHpsaWJfMV8wMwotIyBQYXRjaGVkIGZvciB6bGliIDEuMS4yIHJ3QHNoYWRvdy5vcmcudWsgMTk5ODA0MzAKLSMgdGVzdCB3b3JrcyBvdXQtb2YtdGhlLWJveCwgaW5zdGFsbHMgYHNvbWV3aGVyZScgb24gZGVtYW5kCi0KLSMgVG9vbGZsYWdzOgotQ0NmbGFncyA9IC1jIC1kZXBlbmQgIURlcGVuZCAtSUM6IC1nIC10aHJvd2JhY2sgIC1EUklTQ09TICAtZmFoCi1DKytmbGFncyA9IC1jIC1kZXBlbmQgIURlcGVuZCAtSUM6IC10aHJvd2JhY2sKLUxpbmtmbGFncyA9IC1haWYgLWMrKyAtbyAkQAotT2JqQXNtZmxhZ3MgPSAtdGhyb3diYWNrIC1Ob0NhY2hlIC1kZXBlbmQgIURlcGVuZAotQ01IR2ZsYWdzID0KLUxpYkZpbGVmbGFncyA9IC1jIC1sIC1vICRACi1TcXVlZXplZmxhZ3MgPSAtbyAkQAotCi0jIGNoYW5nZSB0aGUgbGluZSBiZWxvdyB0byB3aGVyZSBfeW91XyB3YW50IHRoZSBsaWJyYXJ5IGluc3RhbGxlZC4KLWxpYmRlc3QgPSBsaWI6emxpYgotCi0jIEZpbmFsIHRhcmdldHM6Ci1ALmxpYjogICBALm8uYWRsZXIzMiBALm8uY29tcHJlc3MgQC5vLmNyYzMyIEAuby5kZWZsYXRlIEAuby5nemlvIFwKLSAgICAgICAgQC5vLmluZmJsb2NrIEAuby5pbmZjb2RlcyBALm8uaW5mZmFzdCBALm8uaW5mbGF0ZSBALm8uaW5mdHJlZXMgQC5vLmluZnV0aWwgQC5vLnRyZWVzIFwKLSAgICAgICAgQC5vLnVuY29tcHIgQC5vLnp1dGlsCi0gICAgICAgIExpYkZpbGUgJChMaWJGaWxlZmxhZ3MpIEAuby5hZGxlcjMyIEAuby5jb21wcmVzcyBALm8uY3JjMzIgQC5vLmRlZmxhdGUgXAotICAgICAgICBALm8uZ3ppbyBALm8uaW5mYmxvY2sgQC5vLmluZmNvZGVzIEAuby5pbmZmYXN0IEAuby5pbmZsYXRlIEAuby5pbmZ0cmVlcyBALm8uaW5mdXRpbCBcCi0gICAgICAgIEAuby50cmVlcyBALm8udW5jb21wciBALm8uenV0aWwKLXRlc3Q6ICAgQC5taW5pZ3ppcCBALmV4YW1wbGUgQC5saWIKLQlAY29weSBALmxpYiBALmxpYmMgIEF+Q35ERn5Mfk5+UH5RflJTflRWCi0JQGVjaG8gcnVubmluZyB0ZXN0czogaGFuZyBvbi4KLQlAL0AubWluaWd6aXAgLWYgLTkgbGliYwotCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6Ci0JQC9ALm1pbmlnemlwIC1mIC0xIGxpYmMKLQlAL0AubWluaWd6aXAgLWQgbGliYy1negotCUAvQC5taW5pZ3ppcCAtaCAtOSBsaWJjCi0JQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKLQlAL0AubWluaWd6aXAgLWggLTEgbGliYwotCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6Ci0JQC9ALm1pbmlnemlwIC05IGxpYmMKLQlAL0AubWluaWd6aXAgLWQgbGliYy1negotCUAvQC5taW5pZ3ppcCAtMSBsaWJjCi0JQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKLQlAZGlmZiBALmxpYiBALmxpYmMKLQlAZWNobyB0aGF0IHNob3VsZCBoYXZlIHJlcG9ydGVkICdALmxpYiBhbmQgQC5saWJjIGlkZW50aWNhbCcgaWYgeW91IGhhdmUgZGlmZi4KLQlAL0AuZXhhbXBsZSBALmZyZWQgQC5mcmVkCi0JQGVjaG8gdGhhdCB3aWxsIGhhdmUgZ2l2ZW4gbG90cyBvZiBoZWxsbyEncy4KLQotQC5taW5pZ3ppcDogICBALm8ubWluaWd6aXAgQC5saWIgQzpvLlN0dWJzCi0gICAgICAgIExpbmsgJChMaW5rZmxhZ3MpIEAuby5taW5pZ3ppcCBALmxpYiBDOm8uU3R1YnMKLUAuZXhhbXBsZTogICBALm8uZXhhbXBsZSBALmxpYiBDOm8uU3R1YnMKLSAgICAgICAgTGluayAkKExpbmtmbGFncykgQC5vLmV4YW1wbGUgQC5saWIgQzpvLlN0dWJzCi0KLWluc3RhbGw6IEAubGliCi0JY2RpciAkKGxpYmRlc3QpCi0JY2RpciAkKGxpYmRlc3QpLmgKLQlAY29weSBALmguemxpYiAkKGxpYmRlc3QpLmguemxpYiBBfkN+REZ+TH5OflB+UX5SU35UVgotCUBjb3B5IEAuaC56Y29uZiAkKGxpYmRlc3QpLmguemNvbmYgQX5DfkRGfkx+Tn5QflF+UlN+VFYKLQlAY29weSBALmxpYiAkKGxpYmRlc3QpLmxpYiAgQX5DfkRGfkx+Tn5QflF+UlN+VFYKLQlAZWNobyBva2F5LCBpbnN0YWxsZWQgemxpYiBpbiAkKGxpYmRlc3QpCi0KLWNsZWFuOjsgcmVtb3ZlIEAubWluaWd6aXAKLQlyZW1vdmUgQC5leGFtcGxlCi0JcmVtb3ZlIEAubGliYwotCS13aXBlIEAuby4qIEZ+cn5jVgotCXJlbW92ZSBALmZyZWQKLQotIyBVc2VyLWVkaXRhYmxlIGRlcGVuZGVuY2llczoKLS5jLm86Ci0gICAgICAgIGNjICQoY2NmbGFncykgLW8gJEAgJDwKLQotIyBTdGF0aWMgZGVwZW5kZW5jaWVzOgotCi0jIER5bmFtaWMgZGVwZW5kZW5jaWVzOgotby5leGFtcGxlOgljLmV4YW1wbGUKLW8uZXhhbXBsZToJaC56bGliCi1vLmV4YW1wbGU6CWguemNvbmYKLW8ubWluaWd6aXA6CWMubWluaWd6aXAKLW8ubWluaWd6aXA6CWguemxpYgotby5taW5pZ3ppcDoJaC56Y29uZgotby5hZGxlcjMyOgljLmFkbGVyMzIKLW8uYWRsZXIzMjoJaC56bGliCi1vLmFkbGVyMzI6CWguemNvbmYKLW8uY29tcHJlc3M6CWMuY29tcHJlc3MKLW8uY29tcHJlc3M6CWguemxpYgotby5jb21wcmVzczoJaC56Y29uZgotby5jcmMzMjoJYy5jcmMzMgotby5jcmMzMjoJaC56bGliCi1vLmNyYzMyOgloLnpjb25mCi1vLmRlZmxhdGU6CWMuZGVmbGF0ZQotby5kZWZsYXRlOgloLmRlZmxhdGUKLW8uZGVmbGF0ZToJaC56dXRpbAotby5kZWZsYXRlOgloLnpsaWIKLW8uZGVmbGF0ZToJaC56Y29uZgotby5nemlvOgljLmd6aW8KLW8uZ3ppbzoJaC56dXRpbAotby5nemlvOgloLnpsaWIKLW8uZ3ppbzoJaC56Y29uZgotby5pbmZibG9jazoJYy5pbmZibG9jawotby5pbmZibG9jazoJaC56dXRpbAotby5pbmZibG9jazoJaC56bGliCi1vLmluZmJsb2NrOgloLnpjb25mCi1vLmluZmJsb2NrOgloLmluZmJsb2NrCi1vLmluZmJsb2NrOgloLmluZnRyZWVzCi1vLmluZmJsb2NrOgloLmluZmNvZGVzCi1vLmluZmJsb2NrOgloLmluZnV0aWwKLW8uaW5mY29kZXM6CWMuaW5mY29kZXMKLW8uaW5mY29kZXM6CWguenV0aWwKLW8uaW5mY29kZXM6CWguemxpYgotby5pbmZjb2RlczoJaC56Y29uZgotby5pbmZjb2RlczoJaC5pbmZ0cmVlcwotby5pbmZjb2RlczoJaC5pbmZibG9jawotby5pbmZjb2RlczoJaC5pbmZjb2Rlcwotby5pbmZjb2RlczoJaC5pbmZ1dGlsCi1vLmluZmNvZGVzOgloLmluZmZhc3QKLW8uaW5mZmFzdDoJYy5pbmZmYXN0Ci1vLmluZmZhc3Q6CWguenV0aWwKLW8uaW5mZmFzdDoJaC56bGliCi1vLmluZmZhc3Q6CWguemNvbmYKLW8uaW5mZmFzdDoJaC5pbmZ0cmVlcwotby5pbmZmYXN0OgloLmluZmJsb2NrCi1vLmluZmZhc3Q6CWguaW5mY29kZXMKLW8uaW5mZmFzdDoJaC5pbmZ1dGlsCi1vLmluZmZhc3Q6CWguaW5mZmFzdAotby5pbmZsYXRlOgljLmluZmxhdGUKLW8uaW5mbGF0ZToJaC56dXRpbAotby5pbmZsYXRlOgloLnpsaWIKLW8uaW5mbGF0ZToJaC56Y29uZgotby5pbmZsYXRlOgloLmluZmJsb2NrCi1vLmluZnRyZWVzOgljLmluZnRyZWVzCi1vLmluZnRyZWVzOgloLnp1dGlsCi1vLmluZnRyZWVzOgloLnpsaWIKLW8uaW5mdHJlZXM6CWguemNvbmYKLW8uaW5mdHJlZXM6CWguaW5mdHJlZXMKLW8uaW5mdHJlZXM6CWguaW5mZml4ZWQKLW8uaW5mdXRpbDoJYy5pbmZ1dGlsCi1vLmluZnV0aWw6CWguenV0aWwKLW8uaW5mdXRpbDoJaC56bGliCi1vLmluZnV0aWw6CWguemNvbmYKLW8uaW5mdXRpbDoJaC5pbmZibG9jawotby5pbmZ1dGlsOgloLmluZnRyZWVzCi1vLmluZnV0aWw6CWguaW5mY29kZXMKLW8uaW5mdXRpbDoJaC5pbmZ1dGlsCi1vLnRyZWVzOgljLnRyZWVzCi1vLnRyZWVzOgloLmRlZmxhdGUKLW8udHJlZXM6CWguenV0aWwKLW8udHJlZXM6CWguemxpYgotby50cmVlczoJaC56Y29uZgotby50cmVlczoJaC50cmVlcwotby51bmNvbXByOgljLnVuY29tcHIKLW8udW5jb21wcjoJaC56bGliCi1vLnVuY29tcHI6CWguemNvbmYKLW8uenV0aWw6CWMuenV0aWwKLW8uenV0aWw6CWguenV0aWwKLW8uenV0aWw6CWguemxpYgotby56dXRpbDoJaC56Y29uZgpkaWZmIC0tZ2l0IGEvbGlicy96bGliL29sZC9SRUFETUUgYi9saWJzL3psaWIvb2xkL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwYmYwNy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvb2xkL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZmlsZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHVwZGF0ZWQgZm9yIHpsaWIgMS4yLngKLQotKFZvbHVudGVlcnMgYXJlIGVuY291cmFnZWQgdG8gaGVscCBjbGVhbiB0aGlzIHVwLiAgVGhhbmtzLikKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9vbGQvZGVzY3JpcC5tbXMgYi9saWJzL3psaWIvb2xkL2Rlc2NyaXAubW1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY2ZGE1Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9vbGQvZGVzY3JpcC5tbXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIGRlc2NyaXAubW1zOiBNTVMgZGVzY3JpcHRpb24gZmlsZSBmb3IgYnVpbGRpbmcgemxpYiBvbiBWTVMKLSMgd3JpdHRlbiBieSBNYXJ0aW4gUC5KLiBaaW5zZXIgPG0uemluc2VyQGdzaS5kZT4KLQotY2NfZGVmcyA9Ci1jX2RlYiA9Ci0KLS5pZmRlZiBfX0RFQ0NfXwotcHJlZiA9IC9wcmVmaXg9YWxsCi0uZW5kaWYKLQotT0JKUyA9IGFkbGVyMzIub2JqLCBjb21wcmVzcy5vYmosIGNyYzMyLm9iaiwgZ3ppby5vYmosIHVuY29tcHIub2JqLFwKLSAgICAgICBkZWZsYXRlLm9iaiwgdHJlZXMub2JqLCB6dXRpbC5vYmosIGluZmxhdGUub2JqLCBpbmZibG9jay5vYmosXAotICAgICAgIGluZnRyZWVzLm9iaiwgaW5mY29kZXMub2JqLCBpbmZ1dGlsLm9iaiwgaW5mZmFzdC5vYmoKLQotQ0ZMQUdTPSAkKENfREVCKSAkKENDX0RFRlMpICQoUFJFRikKLQotYWxsIDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0gICAgICAgIEAgd3JpdGUgc3lzJG91dHB1dCAiIEV4YW1wbGUgYXBwbGljYXRpb25zIGF2YWlsYWJsZSIKLWxpYnoub2xiIDogbGliei5vbGIoJChPQkpTKSkKLQlAIHdyaXRlIHN5cyRvdXRwdXQgIiBsaWJ6IGF2YWlsYWJsZSIKLQotZXhhbXBsZS5leGUgOiBleGFtcGxlLm9iaiBsaWJ6Lm9sYgotICAgICAgICAgICAgICBsaW5rIGV4YW1wbGUsbGliei5vbGIvbGliCi0KLW1pbmlnemlwLmV4ZSA6IG1pbmlnemlwLm9iaiBsaWJ6Lm9sYgotICAgICAgICAgICAgICBsaW5rIG1pbmlnemlwLGxpYnoub2xiL2xpYix4MTF2bXM6eHZtc3V0aWxzLm9sYi9saWIKLQotY2xlYW4gOgotCWRlbGV0ZSAqLm9iajsqLGxpYnoub2xiOyoKLQotCi0jIE90aGVyIGRlcGVuZGVuY2llcy4KLWFkbGVyMzIub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaAotY29tcHJlc3Mub2JqIDogemxpYi5oIHpjb25mLmgKLWNyYzMyLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWRlZmxhdGUub2JqIDogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWV4YW1wbGUub2JqIDogemxpYi5oIHpjb25mLmgKLWd6aW8ub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaAotaW5mYmxvY2sub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmgKLWluZmNvZGVzLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZ1dGlsLmggaW5mY29kZXMuaCBpbmZmYXN0LmgKLWluZmZhc3Qub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKLWluZmxhdGUub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCi1pbmZ0cmVlcy5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLWluZnV0aWwub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaAotbWluaWd6aXAub2JqIDogemxpYi5oIHpjb25mLmgKLXRyZWVzLm9iaiA6IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi11bmNvbXByLm9iaiA6IHpsaWIuaCB6Y29uZi5oCi16dXRpbC5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS9saWJzL3psaWIvb2xkL29zMi9NYWtlZmlsZS5vczIgYi9saWJzL3psaWIvb2xkL29zMi9NYWtlZmlsZS5vczIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMDVhYWEuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL29sZC9vczIvTWFrZWZpbGUub3MyCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHpsaWIgdW5kZXIgT1MvMiB1c2luZyBHQ0MgKFBHQ0MpCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLQotIyBUbyBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgotIyAgIGNwIE1ha2VmaWxlLm9zMiAuLgotIyAgIGNkIC4uCi0jICAgbWFrZSAtZiBNYWtlZmlsZS5vczIgdGVzdAotCi0jIFRoaXMgbWFrZWZpbGUgd2lsbCBidWlsZCBhIHN0YXRpYyBsaWJyYXJ5IHoubGliLCBhIHNoYXJlZCBsaWJyYXJ5Ci0jIHouZGxsIGFuZCBhIGltcG9ydCBsaWJyYXJ5IHpkbGwubGliLiBZb3UgY2FuIHVzZSBlaXRoZXIgei5saWIgb3IKLSMgemRsbC5saWIgYnkgc3BlY2lmeWluZyBlaXRoZXIgLWx6IG9yIC1semRsbCBvbiBnY2MncyBjb21tYW5kIGxpbmUKLQotQ0M9Z2NjIC1ab21mIC1zCi0KLUNGTEFHUz0tTzYgLVdhbGwKLSNDRkxBR1M9LU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTcKLSNDRkxBR1M9LWcgLURERUJVRwotI0NGTEFHUz0tTzMgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV2NvbnZlcnNpb24gXAotIyAgICAgICAgICAgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyBCVUcgV0FSTklORzogIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBpbmZjb2Rlcy5jIGhpdHMgYSBidWcgaW4gcGdjYy0xLjAsIHNvIHlvdSBoYXZlIHRvIHVzZSBlaXRoZXIKLSMjIC1PIyB3aGVyZSAjIDw9IDQgb3Igb25lIG9mICgtZm5vLW9tbWl0LWZyYW1lLXBvaW50ZXIgb3IgLWZuby1mb3JjZS1tZW0pCi0jIyBUaGlzIGJ1ZyBpcyByZXBvcnRlZGx5IGZpeGVkIGluIHBnY2MgPjEuMCwgYnV0IHRoaXMgd2FzIG5vdCB0ZXN0ZWQKLUNGTEFHUys9LWZuby1mb3JjZS1tZW0KLQotTERGTEFHUz0tcyAtTC4gLWx6ZGxsIC1aY3J0ZGxsCi1MRFNIQVJFRD0kKENDKSAtcyAtWm9tZiAtWmRsbCAtWmNydGRsbAotCi1WRVI9MS4xLjAKLVpMSUI9ei5saWIKLVNIQVJFRExJQj16LmRsbAotU0hBUkVETElCSU1QPXpkbGwubGliCi1MSUJTPSQoWkxJQikgJChTSEFSRURMSUIpICQoU0hBUkVETElCSU1QKQotCi1BUj1lbXhvbWZhciBjcgotSU1QTElCPWVteGltcAotUkFOTElCPWVjaG8KLVRBUj10YXIKLVNIRUxMPWJhc2gKLQotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6aW8ubyB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8gXAotICAgICAgIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJsb2NrLm8gaW5mdHJlZXMubyBpbmZjb2Rlcy5vIGluZnV0aWwubyBpbmZmYXN0Lm8KLQotVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KLQotRElTVEZJTEVTID0gUkVBRE1FIElOREVYIENoYW5nZUxvZyBjb25maWd1cmUgTWFrZSpbYS16MC05XSAqLltjaF0gZGVzY3JpcC5tbXMgXAotICBhbGdvcml0aG0udHh0IHpsaWIuMyBtc2Rvcy9NYWtlKlthLXowLTldIG1zZG9zL3psaWIuZGVmIG1zZG9zL3psaWIucmMgXAotICBudC9NYWtlZmlsZS5udCBudC96bGliLmRudCAgY29udHJpYi9SRUFETUUuY29udHJpYiBjb250cmliLyoudHh0IFwKLSAgY29udHJpYi9hc20zODYvKi5hc20gY29udHJpYi9hc20zODYvKi5jIFwKLSAgY29udHJpYi9hc20zODYvKi5iYXQgY29udHJpYi9hc20zODYvemxpYnZjLmQ/PyBjb250cmliL2lvc3RyZWFtLyouY3BwIFwKLSAgY29udHJpYi9pb3N0cmVhbS8qLmggIGNvbnRyaWIvaW9zdHJlYW0yLyouaCBjb250cmliL2lvc3RyZWFtMi8qLmNwcCBcCi0gIGNvbnRyaWIvdW50Z3ovTWFrZWZpbGUgY29udHJpYi91bnRnei8qLmMgY29udHJpYi91bnRnei8qLnczMgotCi1hbGw6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCi10ZXN0OiBhbGwKLQlATERfTElCUkFSWV9QQVRIPS46JChMRF9MSUJSQVJZX1BBVEgpIDsgZXhwb3J0IExEX0xJQlJBUllfUEFUSDsgXAotCWVjaG8gaGVsbG8gd29ybGQgfCAuL21pbmlnemlwIHwgLi9taW5pZ3ppcCAtZCB8fCBcCi0JICBlY2hvICcJCSoqKiBtaW5pZ3ppcCB0ZXN0IEZBSUxFRCAqKionIDsgXAotCWlmIC4vZXhhbXBsZTsgdGhlbiBcCi0JICBlY2hvICcJCSoqKiB6bGliIHRlc3QgT0sgKioqJzsgXAotCWVsc2UgXAotCSAgZWNobyAnCQkqKiogemxpYiB0ZXN0IEZBSUxFRCAqKionOyBcCi0JZmkKLQotJChaTElCKTogJChPQkpTKQotCSQoQVIpICRAICQoT0JKUykKLQktQCAoJChSQU5MSUIpICRAIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQotCi0kKFNIQVJFRExJQik6ICQoT0JKUykgb3MyL3ouZGVmCi0JJChMRFNIQVJFRCkgLW8gJEAgJF4KLQotJChTSEFSRURMSUJJTVApOiBvczIvei5kZWYKLQkkKElNUExJQikgLW8gJEAgJF4KLQotZXhhbXBsZS5leGU6IGV4YW1wbGUubyAkKExJQlMpCi0JJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKExERkxBR1MpCi0KLW1pbmlnemlwLmV4ZTogbWluaWd6aXAubyAkKExJQlMpCi0JJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChMREZMQUdTKQotCi1jbGVhbjoKLQlybSAtZiAqLm8gKn4gZXhhbXBsZSBtaW5pZ3ppcCBsaWJ6LmEgbGliei5zbyogZm9vLmd6Ci0KLWRpc3RjbGVhbjoJY2xlYW4KLQotemlwOgotCW12IE1ha2VmaWxlIE1ha2VmaWxlfjsgY3AgLXAgTWFrZWZpbGUuaW4gTWFrZWZpbGUKLQlybSAtZiB0ZXN0LmMgenRlc3QqLmMKLQl2PWBzZWQgLW4gLWUgJ3MvXC4vL2cnIC1lICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIDwgemxpYi5oYDtcCi0JemlwIC11bDkgemxpYiQkdiAkKERJU1RGSUxFUykKLQltdiBNYWtlZmlsZX4gTWFrZWZpbGUKLQotZGlzdDoKLQltdiBNYWtlZmlsZSBNYWtlZmlsZX47IGNwIC1wIE1ha2VmaWxlLmluIE1ha2VmaWxlCi0Jcm0gLWYgdGVzdC5jIHp0ZXN0Ki5jCi0JZD16bGliLWBzZWQgLW4gJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgO1wKLQlybSAtZiAkJGQudGFyLmd6OyBcCi0JaWYgdGVzdCAhIC1kIC4uLyQkZDsgdGhlbiBybSAtZiAuLi8kJGQ7IGxuIC1zIGBwd2RgIC4uLyQkZDsgZmk7IFwKLQlmaWxlcz0iIjsgXAotCWZvciBmIGluICQoRElTVEZJTEVTKTsgZG8gZmlsZXM9IiQkZmlsZXMgJCRkLyQkZiI7IGRvbmU7IFwKLQljZCAuLjsgXAotCUdaSVA9LTkgJChUQVIpIGNob2Z6ICQkZC8kJGQudGFyLmd6ICQkZmlsZXM7IFwKLQlpZiB0ZXN0ICEgLWQgJCRkOyB0aGVuIHJtIC1mICQkZDsgZmkKLQltdiBNYWtlZmlsZX4gTWFrZWZpbGUKLQotdGFnczoKLQlldGFncyAqLltjaF0KLQotZGVwZW5kOgotCW1ha2VkZXBlbmQgLS0gJChDRkxBR1MpIC0tICouW2NoXQotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLWFkbGVyMzIubzogemxpYi5oIHpjb25mLmgKLWNvbXByZXNzLm86IHpsaWIuaCB6Y29uZi5oCi1jcmMzMi5vOiB6bGliLmggemNvbmYuaAotZGVmbGF0ZS5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotZXhhbXBsZS5vOiB6bGliLmggemNvbmYuaAotZ3ppby5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1pbmZibG9jay5vOiBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotaW5mY29kZXMubzogenV0aWwuaCB6bGliLmggemNvbmYuaAotaW5mY29kZXMubzogaW5mdHJlZXMuaCBpbmZibG9jay5oIGluZmNvZGVzLmggaW5mdXRpbC5oIGluZmZhc3QuaAotaW5mZmFzdC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLWluZmZhc3QubzogaW5mYmxvY2suaCBpbmZjb2Rlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKLWluZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCi1pbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLWluZnV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmgKLW1pbmlnemlwLm86IHpsaWIuaCB6Y29uZi5oCi10cmVlcy5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB0cmVlcy5oCi11bmNvbXByLm86IHpsaWIuaCB6Y29uZi5oCi16dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS9saWJzL3psaWIvb2xkL29zMi96bGliLmRlZiBiL2xpYnMvemxpYi9vbGQvb3MyL3psaWIuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzc1M2YxLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9vbGQvb3MyL3psaWIuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotOwotOyBTbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIC4uL250L3psaWIuZG50IDotKQotOwotCi1MSUJSQVJZCQlaCi1ERVNDUklQVElPTgkiWmxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5IGZvciBPUy8yIgotQ09ERQkJUFJFTE9BRCBNT1ZFQUJMRSBESVNDQVJEQUJMRQotREFUQQkJUFJFTE9BRCBNT1ZFQUJMRSBNVUxUSVBMRQotCi1FWFBPUlRTCi0gICAgYWRsZXIzMgotICAgIGNvbXByZXNzCi0gICAgY3JjMzIKLSAgICBkZWZsYXRlCi0gICAgZGVmbGF0ZUNvcHkKLSAgICBkZWZsYXRlRW5kCi0gICAgZGVmbGF0ZUluaXQyXwotICAgIGRlZmxhdGVJbml0XwotICAgIGRlZmxhdGVQYXJhbXMKLSAgICBkZWZsYXRlUmVzZXQKLSAgICBkZWZsYXRlU2V0RGljdGlvbmFyeQotICAgIGd6Y2xvc2UKLSAgICBnemRvcGVuCi0gICAgZ3plcnJvcgotICAgIGd6Zmx1c2gKLSAgICBnem9wZW4KLSAgICBnenJlYWQKLSAgICBnendyaXRlCi0gICAgaW5mbGF0ZQotICAgIGluZmxhdGVFbmQKLSAgICBpbmZsYXRlSW5pdDJfCi0gICAgaW5mbGF0ZUluaXRfCi0gICAgaW5mbGF0ZVJlc2V0Ci0gICAgaW5mbGF0ZVNldERpY3Rpb25hcnkKLSAgICBpbmZsYXRlU3luYwotICAgIHVuY29tcHJlc3MKLSAgICB6bGliVmVyc2lvbgotICAgIGd6cHJpbnRmCi0gICAgZ3pwdXRjCi0gICAgZ3pnZXRjCi0gICAgZ3pzZWVrCi0gICAgZ3pyZXdpbmQKLSAgICBnenRlbGwKLSAgICBnemVvZgotICAgIGd6c2V0cGFyYW1zCi0gICAgekVycm9yCi0gICAgaW5mbGF0ZVN5bmNQb2ludAotICAgIGdldF9jcmNfdGFibGUKLSAgICBjb21wcmVzczIKLSAgICBnenB1dHMKLSAgICBnemdldHMKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9vbGQvdmlzdWFsLWJhc2ljLnR4dCBiL2xpYnMvemxpYi9vbGQvdmlzdWFsLWJhc2ljLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlZmU1OC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvb2xkL3Zpc3VhbC1iYXNpYy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotU2VlIGJlbG93IHNvbWUgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBmb3IgVmlzdWFsIEJhc2ljLgotCi1GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uOgotCi1ROiBFYWNoIHRpbWUgSSB1c2UgdGhlIGNvbXByZXNzIGZ1bmN0aW9uIEkgZ2V0IHRoZSAtNSBlcnJvciAobm90IGVub3VnaAotICAgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcikuCi0KLUE6IE1ha2Ugc3VyZSB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyIGlzIHBhc3NlZCBieQotICAgcmVmZXJlbmNlICgiYXMgYW55IiksIG5vdCBieSB2YWx1ZSAoImFzIGxvbmciKS4gQWxzbyBjaGVjayB0aGF0Ci0gICBiZWZvcmUgdGhlIGNhbGwgb2YgY29tcHJlc3MgdGhpcyBsZW5ndGggaXMgZXF1YWwgdG8gdGhlIHRvdGFsIHNpemUgb2YKLSAgIHRoZSBjb21wcmVzc2VkIGJ1ZmZlciBhbmQgbm90IHplcm8uCi0KLQotRnJvbTogIkpvbiBDYXJ1YW5hIiA8am9uLW5ldEB1c2EubmV0PgotU3ViamVjdDogUmU6IEhvdyB0byBwb3J0IHpsaWIgZGVjbGFyZXMgdG8gdmI/Ci1EYXRlOiBNb24sIDI4IE9jdCAxOTk2IDE4OjMzOjAzIC0wNjAwCi0KLUdvdCB0aGUgYW5zd2VyISAoSSBoYXZlbid0IGhhZCB0aW1lIHRvIGNoZWNrIHRoaXMgYnV0IGl0J3Mgd2hhdCBJIGdvdCwgYW5kCi1sb29rcyBjb3JyZWN0KToKLQotSGUgaGFzIHRoZSBmb2xsb3dpbmcgcm91dGluZXMgd29ya2luZzoKLSAgICAgICAgY29tcHJlc3MKLSAgICAgICAgdW5jb21wcmVzcwotICAgICAgICBnem9wZW4KLSAgICAgICAgZ3p3cml0ZQotICAgICAgICBnenJlYWQKLSAgICAgICAgZ3pjbG9zZQotCi1EZWNsYXJlcyBmb2xsb3c6IChRdW90ZWQgZnJvbSBDYXJsb3MgUmlvcyA8Y19yaW9zQHNvbmRhLmNsPiwgaW4gVmI0IGZvcm0pCi0KLSNJZiBXaW4xNiBUaGVuICAgJ1VzZSBXaW4xNiBjYWxscy4KLURlY2xhcmUgRnVuY3Rpb24gY29tcHJlc3MgTGliICJaTElCLkRMTCIgKEJ5VmFsIGNvbXByIEFzCi0gICAgICAgIFN0cmluZywgY29tcHJMZW4gQXMgQW55LCBCeVZhbCBidWYgQXMgU3RyaW5nLCBCeVZhbCBidWZsZW4KLSAgICAgICAgQXMgTG9uZykgQXMgSW50ZWdlcgotRGVjbGFyZSBGdW5jdGlvbiB1bmNvbXByZXNzIExpYiAiWkxJQi5ETEwiIChCeVZhbCB1bmNvbXByCi0gICAgICAgIEFzIFN0cmluZywgdW5jb21wckxlbiBBcyBBbnksIEJ5VmFsIGNvbXByIEFzIFN0cmluZywgQnlWYWwKLSAgICAgICAgbGNvbXByIEFzIExvbmcpIEFzIEludGVnZXIKLURlY2xhcmUgRnVuY3Rpb24gZ3pvcGVuIExpYiAiWkxJQi5ETEwiIChCeVZhbCBmaWxlUGF0aCBBcwotICAgICAgICBTdHJpbmcsIEJ5VmFsIG1vZGUgQXMgU3RyaW5nKSBBcyBMb25nCi1EZWNsYXJlIEZ1bmN0aW9uIGd6cmVhZCBMaWIgIlpMSUIuRExMIiAoQnlWYWwgZmlsZSBBcwotICAgICAgICBMb25nLCBCeVZhbCB1bmNvbXByIEFzIFN0cmluZywgQnlWYWwgdW5jb21wckxlbiBBcyBJbnRlZ2VyKQotICAgICAgICBBcyBJbnRlZ2VyCi1EZWNsYXJlIEZ1bmN0aW9uIGd6d3JpdGUgTGliICJaTElCLkRMTCIgKEJ5VmFsIGZpbGUgQXMKLSAgICAgICAgTG9uZywgQnlWYWwgdW5jb21wciBBcyBTdHJpbmcsIEJ5VmFsIHVuY29tcHJMZW4gQXMgSW50ZWdlcikKLSAgICAgICAgQXMgSW50ZWdlcgotRGVjbGFyZSBGdW5jdGlvbiBnemNsb3NlIExpYiAiWkxJQi5ETEwiIChCeVZhbCBmaWxlIEFzCi0gICAgICAgIExvbmcpIEFzIEludGVnZXIKLSNFbHNlCi1EZWNsYXJlIEZ1bmN0aW9uIGNvbXByZXNzIExpYiAiWkxJQjMyLkRMTCIKLSAgICAgICAgKEJ5VmFsIGNvbXByIEFzIFN0cmluZywgY29tcHJMZW4gQXMgQW55LCBCeVZhbCBidWYgQXMKLSAgICAgICAgU3RyaW5nLCBCeVZhbCBidWZsZW4gQXMgTG9uZykgQXMgSW50ZWdlcgotRGVjbGFyZSBGdW5jdGlvbiB1bmNvbXByZXNzIExpYiAiWkxJQjMyLkRMTCIKLSAgICAgICAgKEJ5VmFsIHVuY29tcHIgQXMgU3RyaW5nLCB1bmNvbXByTGVuIEFzIEFueSwgQnlWYWwgY29tcHIgQXMKLSAgICAgICAgU3RyaW5nLCBCeVZhbCBsY29tcHIgQXMgTG9uZykgQXMgTG9uZwotRGVjbGFyZSBGdW5jdGlvbiBnem9wZW4gTGliICJaTElCMzIuRExMIgotICAgICAgICAoQnlWYWwgZmlsZSBBcyBTdHJpbmcsIEJ5VmFsIG1vZGUgQXMgU3RyaW5nKSBBcyBMb25nCi1EZWNsYXJlIEZ1bmN0aW9uIGd6cmVhZCBMaWIgIlpMSUIzMi5ETEwiCi0gICAgICAgIChCeVZhbCBmaWxlIEFzIExvbmcsIEJ5VmFsIHVuY29tcHIgQXMgU3RyaW5nLCBCeVZhbAotICAgICAgICB1bmNvbXByTGVuIEFzIExvbmcpIEFzIExvbmcKLURlY2xhcmUgRnVuY3Rpb24gZ3p3cml0ZSBMaWIgIlpMSUIzMi5ETEwiCi0gICAgICAgIChCeVZhbCBmaWxlIEFzIExvbmcsIEJ5VmFsIHVuY29tcHIgQXMgU3RyaW5nLCBCeVZhbAotICAgICAgICB1bmNvbXByTGVuIEFzIExvbmcpIEFzIExvbmcKLURlY2xhcmUgRnVuY3Rpb24gZ3pjbG9zZSBMaWIgIlpMSUIzMi5ETEwiCi0gICAgICAgIChCeVZhbCBmaWxlIEFzIExvbmcpIEFzIExvbmcKLSNFbmQgSWYKLQotLUpvbiBDYXJ1YW5hCi1qb24tbmV0QHVzYS5uZXQKLU1pY3Jvc29mdCBTaXRlYnVpbGRlciBOZXR3b3JrIExldmVsIDEgTWVtYmVyIC0gSFRNTCBXcml0ZXIncyBHdWlsZCBNZW1iZXIKLQotCi1IZXJlIGlzIGFub3RoZXIgZXhhbXBsZSBmcm9tIE1pY2hhZWwgPG1pY2hhZWxfYm9yZ3N5c0Bob3RtYWlsLmNvbT4gdGhhdCBoZQotc2F5cyBjb25mb3JtcyB0byB0aGUgVkIgZ3VpZGVsaW5lcywgYW5kIHRoYXQgc29sdmVzIHRoZSBwcm9ibGVtIG9mIG5vdAota25vd2luZyB0aGUgdW5jb21wcmVzc2VkIHNpemUgYnkgc3RvcmluZyBpdCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlOgotCi0nQ2FsbGluZyB0aGUgZnVuY3Rpb25zOgotJ2JyYWNrZXQgbWVhbmluZzogPHBhcmFtZXRlcj4gW29wdGlvbmFsXSB7UmFuZ2Ugb2YgcG9zc2libGUgdmFsdWVzfQotJ0NhbGwgc3ViQ29tcHJlc3NGaWxlKDxwYXRoIHdpdGggZmlsZW5hbWUgdG8gY29tcHJlc3M+IFssIDxwYXRoIHdpdGgKLWZpbGVuYW1lIHRvIHdyaXRlIHRvPiwgW2xldmVsIG9mIGNvbXByZXNzaW9uIHsxLi45fV1dKQotJ0NhbGwgc3ViVW5jb21wcmVzc0ZpbGUoPHBhdGggd2l0aCBmaWxlbmFtZSB0byBjb21wcmVzcz4pCi0KLU9wdGlvbiBFeHBsaWNpdAotUHJpdmF0ZSBsbmdwdnRQY25TbWwgQXMgTG9uZyAnU3RvcmVzIHZhbHVlIGZvciAnbG5nUGVyY2VudFNtYWxsZXInCi1Qcml2YXRlIENvbnN0IFNVQ0NFU1MgQXMgTG9uZyA9IDAKLVByaXZhdGUgQ29uc3Qgc3RyRmlsRXh0IEFzIFN0cmluZyA9ICIuY3ByIgotUHJpdmF0ZSBEZWNsYXJlIEZ1bmN0aW9uIGxuZ2ZuY0NwciBMaWIgInpsaWIuZGxsIiBBbGlhcyAiY29tcHJlc3MyIiAoQnlSZWYKLWRlc3QgQXMgQW55LCBCeVJlZiBkZXN0TGVuIEFzIEFueSwgQnlSZWYgc3JjIEFzIEFueSwgQnlWYWwgc3JjTGVuIEFzIExvbmcsCi1CeVZhbCBsZXZlbCBBcyBJbnRlZ2VyKSBBcyBMb25nCi1Qcml2YXRlIERlY2xhcmUgRnVuY3Rpb24gbG5nZm5jVWNwIExpYiAiemxpYi5kbGwiIEFsaWFzICJ1bmNvbXByZXNzIiAoQnlSZWYKLWRlc3QgQXMgQW55LCBCeVJlZiBkZXN0TGVuIEFzIEFueSwgQnlSZWYgc3JjIEFzIEFueSwgQnlWYWwgc3JjTGVuIEFzIExvbmcpCi1BcyBMb25nCi0KLVB1YmxpYyBTdWIgc3ViQ29tcHJlc3NGaWxlKEJ5VmFsIHN0cmFyZ09yaUZpbFB0aCBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsCi1zdHJhcmdDcHJGaWxQdGggQXMgU3RyaW5nLCBPcHRpb25hbCBCeVZhbCBpbnRMdmwgQXMgSW50ZWdlciA9IDkpCi0gICAgRGltIHN0ckNwclB0aCBBcyBTdHJpbmcKLSAgICBEaW0gbG5nT3JpU2l6IEFzIExvbmcKLSAgICBEaW0gbG5nQ3ByU2l6IEFzIExvbmcKLSAgICBEaW0gYnl0YXJ5T3JpKCkgQXMgQnl0ZQotICAgIERpbSBieXRhcnlDcHIoKSBBcyBCeXRlCi0gICAgbG5nT3JpU2l6ID0gRmlsZUxlbihzdHJhcmdPcmlGaWxQdGgpCi0gICAgUmVEaW0gYnl0YXJ5T3JpKGxuZ09yaVNpeiAtIDEpCi0gICAgT3BlbiBzdHJhcmdPcmlGaWxQdGggRm9yIEJpbmFyeSBBY2Nlc3MgUmVhZCBBcyAjMQotICAgICAgICBHZXQgIzEsICwgYnl0YXJ5T3JpKCkKLSAgICBDbG9zZSAjMQotICAgIHN0ckNwclB0aCA9IElJZihzdHJhcmdDcHJGaWxQdGggPSAiIiwgc3RyYXJnT3JpRmlsUHRoLCBzdHJhcmdDcHJGaWxQdGgpCi0nU2VsZWN0IGZpbGUgcGF0aCBhbmQgbmFtZQotICAgIHN0ckNwclB0aCA9IHN0ckNwclB0aCAmIElJZihSaWdodChzdHJDcHJQdGgsIExlbihzdHJGaWxFeHQpKSA9Ci1zdHJGaWxFeHQsICIiLCBzdHJGaWxFeHQpICdBZGQgZmlsZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cwotICAgIGxuZ0NwclNpeiA9IChsbmdPcmlTaXogKiAxLjAxKSArIDEyICdDb21wcmVzc2lvbiBuZWVkcyB0ZW1wb3JhcnkgYSBiaXQKLW1vcmUgc3BhY2UgdGhlbiBvcmlnaW5hbCBmaWxlIHNpemUKLSAgICBSZURpbSBieXRhcnlDcHIobG5nQ3ByU2l6IC0gMSkKLSAgICBJZiBsbmdmbmNDcHIoYnl0YXJ5Q3ByKDApLCBsbmdDcHJTaXosIGJ5dGFyeU9yaSgwKSwgbG5nT3JpU2l6LCBpbnRMdmwpID0KLVNVQ0NFU1MgVGhlbgotICAgICAgICBsbmdwdnRQY25TbWwgPSAoMSMgLSAobG5nQ3ByU2l6IC8gbG5nT3JpU2l6KSkgKiAxMDAKLSAgICAgICAgUmVEaW0gUHJlc2VydmUgYnl0YXJ5Q3ByKGxuZ0NwclNpeiAtIDEpCi0gICAgICAgIE9wZW4gc3RyQ3ByUHRoIEZvciBCaW5hcnkgQWNjZXNzIFdyaXRlIEFzICMxCi0gICAgICAgICAgICBQdXQgIzEsICwgYnl0YXJ5Q3ByKCkKLSAgICAgICAgICAgIFB1dCAjMSwgLCBsbmdPcmlTaXogJ0FkZCB0aGUgdGhlIG9yaWdpbmFsIHNpemUgdmFsdWUgdG8gdGhlIGVuZAotKGxhc3QgNCBieXRlcykKLSAgICAgICAgQ2xvc2UgIzEKLSAgICBFbHNlCi0gICAgICAgIE1zZ0JveCAiQ29tcHJlc3Npb24gZXJyb3IiCi0gICAgRW5kIElmCi0gICAgRXJhc2UgYnl0YXJ5Q3ByCi0gICAgRXJhc2UgYnl0YXJ5T3JpCi1FbmQgU3ViCi0KLVB1YmxpYyBTdWIgc3ViVW5jb21wcmVzc0ZpbGUoQnlWYWwgc3RyYXJnRmlsUHRoIEFzIFN0cmluZykKLSAgICBEaW0gYnl0YXJ5Q3ByKCkgQXMgQnl0ZQotICAgIERpbSBieXRhcnlPcmkoKSBBcyBCeXRlCi0gICAgRGltIGxuZ09yaVNpeiBBcyBMb25nCi0gICAgRGltIGxuZ0NwclNpeiBBcyBMb25nCi0gICAgRGltIHN0ck9yaVB0aCBBcyBTdHJpbmcKLSAgICBsbmdDcHJTaXogPSBGaWxlTGVuKHN0cmFyZ0ZpbFB0aCkKLSAgICBSZURpbSBieXRhcnlDcHIobG5nQ3ByU2l6IC0gMSkKLSAgICBPcGVuIHN0cmFyZ0ZpbFB0aCBGb3IgQmluYXJ5IEFjY2VzcyBSZWFkIEFzICMxCi0gICAgICAgIEdldCAjMSwgLCBieXRhcnlDcHIoKQotICAgIENsb3NlICMxCi0gICAgJ1JlYWQgdGhlIG9yaWdpbmFsIGZpbGUgc2l6ZSB2YWx1ZToKLSAgICBsbmdPcmlTaXogPSBieXRhcnlDcHIobG5nQ3ByU2l6IC0gMSkgKiAoMiBeIDI0KSBfCi0gICAgICAgICAgICAgICsgYnl0YXJ5Q3ByKGxuZ0NwclNpeiAtIDIpICogKDIgXiAxNikgXwotICAgICAgICAgICAgICArIGJ5dGFyeUNwcihsbmdDcHJTaXogLSAzKSAqICgyIF4gOCkgXwotICAgICAgICAgICAgICArIGJ5dGFyeUNwcihsbmdDcHJTaXogLSA0KQotICAgIFJlRGltIFByZXNlcnZlIGJ5dGFyeUNwcihsbmdDcHJTaXogLSA1KSAnQ3V0IG9mIHRoZSBvcmlnaW5hbCBzaXplIHZhbHVlCi0gICAgUmVEaW0gYnl0YXJ5T3JpKGxuZ09yaVNpeiAtIDEpCi0gICAgSWYgbG5nZm5jVWNwKGJ5dGFyeU9yaSgwKSwgbG5nT3JpU2l6LCBieXRhcnlDcHIoMCksIGxuZ0NwclNpeikgPSBTVUNDRVNTCi1UaGVuCi0gICAgICAgIHN0ck9yaVB0aCA9IExlZnQoc3RyYXJnRmlsUHRoLCBMZW4oc3RyYXJnRmlsUHRoKSAtIExlbihzdHJGaWxFeHQpKQotICAgICAgICBPcGVuIHN0ck9yaVB0aCBGb3IgQmluYXJ5IEFjY2VzcyBXcml0ZSBBcyAjMQotICAgICAgICAgICAgUHV0ICMxLCAsIGJ5dGFyeU9yaSgpCi0gICAgICAgIENsb3NlICMxCi0gICAgRWxzZQotICAgICAgICBNc2dCb3ggIlVuY29tcHJlc3Npb24gZXJyb3IiCi0gICAgRW5kIElmCi0gICAgRXJhc2UgYnl0YXJ5Q3ByCi0gICAgRXJhc2UgYnl0YXJ5T3JpCi1FbmQgU3ViCi1QdWJsaWMgUHJvcGVydHkgR2V0IGxuZ1BlcmNlbnRTbWFsbGVyKCkgQXMgTG9uZwotICAgIGxuZ1BlcmNlbnRTbWFsbGVyID0gbG5ncHZ0UGNuU21sCi1FbmQgUHJvcGVydHkKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9vbGQvemxpYi5odG1sIGIvbGlicy96bGliL29sZC96bGliLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMWIxOTAuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL29sZC96bGliLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NzEgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLSA8dGl0bGU+Ci0gemxpYiBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeSB2ZXJzaW9uIDEuMS40Ci0gPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGJnY29sb3I9IldoaXRlIiB0ZXh0PSJCbGFjayIgdmxpbms9IlJlZCIgYWxpbms9Ik5hdnkiIGxpbms9IlJlZCI+Ci08IS0tIGJhY2tncm91bmQ9InpsaWJiZy5naWYiIC0tPgotCi08aDE+IHpsaWIgMS4xLjQgTWFudWFsIDwvaDE+Ci08aHI+Ci08YSBuYW1lPSJDb250ZW50cyI+PGgyPkNvbnRlbnRzPC9oMj4KLTxvbCB0eXBlPSJJIj4KLTxsaT4gPGEgaHJlZj0iI1Byb2xvZ3VlIj5Qcm9sb2d1ZTwvYT4KLTxsaT4gPGEgaHJlZj0iI0ludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPgotPGxpPiA8YSBocmVmPSIjVXRpbGl0eSBmdW5jdGlvbnMiPlV0aWxpdHkgZnVuY3Rpb25zPC9hPgotPGxpPiA8YSBocmVmPSIjQmFzaWMgZnVuY3Rpb25zIj5CYXNpYyBmdW5jdGlvbnM8L2E+Ci08bGk+IDxhIGhyZWY9IiNBZHZhbmNlZCBmdW5jdGlvbnMiPkFkdmFuY2VkIGZ1bmN0aW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iI0NvbnN0YW50cyI+Q29uc3RhbnRzPC9hPgotPGxpPiA8YSBocmVmPSIjc3RydWN0IHpfc3RyZWFtX3MiPnN0cnVjdCB6X3N0cmVhbV9zPC9hPgotPGxpPiA8YSBocmVmPSIjQ2hlY2tzdW0gZnVuY3Rpb25zIj5DaGVja3N1bSBmdW5jdGlvbnM8L2E+Ci08bGk+IDxhIGhyZWY9IiNNaXNjIj5NaXNjPC9hPgotPC9vbD4KLTxocj4KLTxhIG5hbWU9IlByb2xvZ3VlIj48aDI+IFByb2xvZ3VlIDwvaDI+Ci0gICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeSB2ZXJzaW9uIDEuMS40LCBNYXJjaCAxMXRoLCAyMDAyCi0gIDxwPgotICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCi0gIDxwPgotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0gIDxwPgotICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gIDxvbD4KLSAgIDxsaT4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkIDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAgPGxpPiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gICA8bGk+IFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0gIDwvb2w+Ci0KLSAgPGRsPgotICA8ZHQ+SmVhbi1sb3VwIEdhaWxseQotICA8ZGQ+PGEgaHJlZj0ibWFpbHRvOmpsb3VwQGd6aXAub3JnIj5qbG91cEBnemlwLm9yZzwvYT4KLSAgPGR0Pk1hcmsgQWRsZXIKLSAgPGRkPjxhIGhyZWY9Im1haWx0bzptYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ij5tYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PC9hPgotICA8L2RsPgotCi0gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCi0gIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzCi0gIDxhIGhyZWY9ImZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MC50eHQiPgotICBmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTAudHh0IDwvYT4KLSAgKHpsaWIgZm9ybWF0KSwKLSAgPGEgaHJlZj0iZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMxOTUxLnR4dCI+Ci0gIHJmYzE5NTEudHh0IDwvYT4KLSAgKDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBmb3JtYXQpIGFuZAotICA8YSBocmVmPSJmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTIudHh0Ij4KLSAgcmZjMTk1Mi50eHQgPC9hPgotICAoZ3ppcCBmb3JtYXQpLgotICA8cD4KLSAgVGhpcyBtYW51YWwgaXMgY29udmVydGVkIGZyb20gemxpYi5oIGJ5Ci0gIDxhIGhyZWY9Im1haWx0bzpwaWFpcEBjc2llLm50dS5lZHUudHciPiBwaWFpcCA8L2E+Ci0gIDxwPgotICBWaXNpdCA8YSBocmVmPSJodHRwOi8vZnRwLmNkcm9tLmNvbS9wdWIvaW5mb3ppcC96bGliLyI+Ci0gIGh0dHA6Ly9mdHAuY2Ryb20uY29tL3B1Yi9pbmZvemlwL3psaWIvPC9hPgotICBmb3IgdGhlIG9mZmljaWFsIHpsaWIgd2ViIHBhZ2UuCi0gIDxwPgotCi08aHI+Ci08YSBuYW1lPSJJbnRyb2R1Y3Rpb24iPjxoMj4gSW50cm9kdWN0aW9uIDwvaDI+Ci0gICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCi0gIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkCi0gIGRhdGEuICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kCi0gIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZQotICBzdHJlYW0gaW50ZXJmYWNlLgotICA8cD4KLQotICAgICBDb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwIGlmIHRoZSBidWZmZXJzIGFyZSBsYXJnZQotICBlbm91Z2ggKGZvciBleGFtcGxlIGlmIGFuIGlucHV0IGZpbGUgaXMgbW1hcCdlZCksIG9yIGNhbiBiZSBkb25lIGJ5Ci0gIHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCi0gIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKLSAgKHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSkgYmVmb3JlIGVhY2ggY2FsbC4KLSAgPHA+Ci0KLSAgICAgVGhlIGxpYnJhcnkgYWxzbyBzdXBwb3J0cyByZWFkaW5nIGFuZCB3cml0aW5nIGZpbGVzIGluIGd6aXAgKC5neikgZm9ybWF0Ci0gIHdpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpby4KLSAgPHA+Ci0KLSAgICAgVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuIFRoZSBkZWNvZGVyIGNoZWNrcwotICB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyCi0gIGNyYXNoIGV2ZW4gaW4gY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCi0gIDxwPgotCi08aHI+Ci08YSBuYW1lPSJVdGlsaXR5IGZ1bmN0aW9ucyI+PGgyPiBVdGlsaXR5IGZ1bmN0aW9ucyA8L2gyPgotICAgICBUaGUgZm9sbG93aW5nIHV0aWxpdHkgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhlCi0gICA8YSBocmVmPSIjQmFzaWMgZnVuY3Rpb25zIj5iYXNpYyBzdHJlYW0tb3JpZW50ZWQgZnVuY3Rpb25zPC9hPi4KLSAgIFRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UsIHNvbWUKLSAgIGRlZmF1bHQgb3B0aW9ucyBhcmUgYXNzdW1lZCAoY29tcHJlc3Npb24gbGV2ZWwgYW5kIG1lbW9yeSB1c2FnZSwKLSAgIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucykuIFRoZSBzb3VyY2UgY29kZSBvZiB0aGVzZQotICAgdXRpbGl0eSBmdW5jdGlvbnMgY2FuIGVhc2lseSBiZSBtb2RpZmllZCBpZiB5b3UgbmVlZCBzcGVjaWFsIG9wdGlvbnMuCi08aDM+IEZ1bmN0aW9uIGxpc3QgPC9oMz4KLTx1bD4KLTxsaT4gaW50ICA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pOwotPGxpPiBpbnQgIDxhIGhyZWY9IiNjb21wcmVzczIiPmNvbXByZXNzMjwvYT4gKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuLCBpbnQgbGV2ZWwpOwotPGxpPiBpbnQgIDxhIGhyZWY9IiN1bmNvbXByZXNzIj51bmNvbXByZXNzPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pOwotPGxpPiB0eXBlZGVmIHZvaWRwIGd6RmlsZTsKLTxsaT4gIGd6RmlsZSAgPGEgaHJlZj0iI2d6b3BlbiI+Z3pvcGVuPC9hPiAgKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpOwotPGxpPiBnekZpbGUgIDxhIGhyZWY9IiNnemRvcGVuIj5nemRvcGVuPC9hPiAgKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSk7Ci08bGk+IGludCAgPGEgaHJlZj0iI2d6c2V0cGFyYW1zIj5nenNldHBhcmFtczwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7Ci08bGk+IGludCAgICAgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiAgKGd6RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7Ci08bGk+IGludCAgICAgPGEgaHJlZj0iI2d6d3JpdGUiPmd6d3JpdGU8L2E+IChnekZpbGUgZmlsZSwgY29uc3Qgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pOwotPGxpPiBpbnQgVkEgICA8YSBocmVmPSIjZ3pwcmludGYiPmd6cHJpbnRmPC9hPiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKLTxsaT4gaW50ICA8YSBocmVmPSIjZ3pwdXRzIj5nenB1dHM8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcyk7Ci08bGk+IGNoYXIgKiAgPGEgaHJlZj0iI2d6Z2V0cyI+Z3pnZXRzPC9hPiAoZ3pGaWxlIGZpbGUsIGNoYXIgKmJ1ZiwgaW50IGxlbik7Ci08bGk+IGludCAgICAgPGEgaHJlZj0iI2d6cHV0YyI+Z3pwdXRjPC9hPiAoZ3pGaWxlIGZpbGUsIGludCBjKTsKLTxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pnZXRjIj5nemdldGM8L2E+IChnekZpbGUgZmlsZSk7Ci08bGk+IGludCAgICAgPGEgaHJlZj0iI2d6Zmx1c2giPmd6Zmx1c2g8L2E+IChnekZpbGUgZmlsZSwgaW50IGZsdXNoKTsKLTxsaT4gel9vZmZfdCAgICAgPGEgaHJlZj0iI2d6c2VlayI+Z3pzZWVrPC9hPiAoZ3pGaWxlIGZpbGUsIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKLTxsaT4gel9vZmZfdCAgICAgPGEgaHJlZj0iI2d6dGVsbCI+Z3p0ZWxsPC9hPiAoZ3pGaWxlIGZpbGUpOwotPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnenJld2luZCI+Z3pyZXdpbmQ8L2E+IChnekZpbGUgZmlsZSk7Ci08bGk+IGludCAgPGEgaHJlZj0iI2d6ZW9mIj5nemVvZjwvYT4gKGd6RmlsZSBmaWxlKTsKLTxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pjbG9zZSI+Z3pjbG9zZTwvYT4gKGd6RmlsZSBmaWxlKTsKLTxsaT4gY29uc3QgY2hhciAqICA8YSBocmVmPSIjZ3plcnJvciI+Z3plcnJvcjwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgKmVycm51bSk7Ci08L3VsPgotPGgzPiBGdW5jdGlvbiBkZXNjcmlwdGlvbiA8L2gzPgotPGRsPgotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJjb21wcmVzcyI+Y29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7PC9mb250PgotPGRkPgotICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcwotICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAotICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4KLSAgIHNvdXJjZUxlbiBwbHVzIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQotICAgY29tcHJlc3NlZCBidWZmZXIuPHA+Ci0gICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gPGEgaHJlZj0iI2NvbXByZXNzIj5jb21wcmVzczwvYT4gYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCi0gICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuPHA+Ci0gICAgIDxhIGhyZWY9IiNjb21wcmVzcyI+Y29tcHJlc3M8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QKLSAgIGVub3VnaCBtZW1vcnksIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAotICAgYnVmZmVyLjxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImNvbXByZXNzMiI+Y29tcHJlc3MyPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4sIGludCBsZXZlbCk7PC9mb250PgotPGRkPgotICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gVGhlIGxldmVsCi0gICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4uICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKLSAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKLSAgIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCAwLjElIGxhcmdlciB0aGFuIHNvdXJjZUxlbiBwbHVzCi0gICAxMiBieXRlcy4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuCi0gICA8cD4KLQotICAgICA8YSBocmVmPSIjY29tcHJlc3MyIj5jb21wcmVzczI8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCi0gICBtZW1vcnksIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIsCi0gICA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGludmFsaWQuCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJ1bmNvbXByZXNzIj51bmNvbXByZXNzPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pOzwvZm9udD4KLTxkZD4KLSAgICAgRGVjb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcwotICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAotICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQotICAgZW50aXJlIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgaGF2ZQotICAgYmVlbiBzYXZlZCBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yCi0gICBieSBzb21lIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKQotICAgVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuIDxwPgotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCi0gICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCi0gICA8cD4KLQotICAgICA8YSBocmVmPSIjdW5jb21wcmVzcyI+dW5jb21wcmVzczwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIsIG9yIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIGlucHV0IGRhdGEgd2FzIGNvcnJ1cHRlZC4KLSAgIDxwPgotCi08ZHQ+IHR5cGVkZWYgdm9pZHAgZ3pGaWxlOwotPGRkPiA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGd6RmlsZSAgPGEgbmFtZT0iZ3pvcGVuIj5nem9wZW48L2E+ICAoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSk7PC9mb250PgotPGRkPgotICAgICBPcGVucyBhIGd6aXAgKC5neikgZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLiBUaGUgbW9kZSBwYXJhbWV0ZXIKLSAgIGlzIGFzIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwKLSAgICgid2I5Iikgb3IgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvcgotICAgSHVmZm1hbiBvbmx5IGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIi4gKFNlZSB0aGUgZGVzY3JpcHRpb24KLSAgIG9mIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0cmF0ZWd5IHBhcmFtZXRlci4pCi0gICA8cD4KLQotICAgICA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+IGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdCA7IGluIHRoaXMKLSAgIGNhc2UgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiB3aWxsIGRpcmVjdGx5IHJlYWQgZnJvbSB0aGUgZmlsZSB3aXRob3V0IGRlY29tcHJlc3Npb24uCi0gICA8cD4KLQotICAgICA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+IHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIG9yIGlmIHRoZXJlIHdhcwotICAgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgKGRlKWNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IDsgZXJybm8KLSAgIGNhbiBiZSBjaGVja2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgKGlmIGVycm5vIGlzIHplcm8sIHRoZQotICAgemxpYiBlcnJvciBpcyA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPikuCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gZ3pGaWxlICA8YSBuYW1lPSJnemRvcGVuIj5nemRvcGVuPC9hPiAgKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSk7PC9mb250PgotPGRkPgotICAgICA8YSBocmVmPSIjZ3pkb3BlbiI+Z3pkb3BlbjwvYT4oKSBhc3NvY2lhdGVzIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gIEZpbGUKLSAgIGRlc2NyaXB0b3JzIGFyZSBvYnRhaW5lZCBmcm9tIGNhbGxzIGxpa2Ugb3BlbiwgZHVwLCBjcmVhdCwgcGlwZSBvcgotICAgZmlsZW5vIChpbiB0aGUgZmlsZSBoYXMgYmVlbiBwcmV2aW91c2x5IG9wZW5lZCB3aXRoIGZvcGVuKS4KLSAgIFRoZSBtb2RlIHBhcmFtZXRlciBpcyBhcyBpbiA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+LgotICAgPHA+Ci0gICAgIFRoZSBuZXh0IGNhbGwgb2YgPGEgaHJlZj0iI2d6Y2xvc2UiPmd6Y2xvc2U8L2E+IG9uIHRoZSByZXR1cm5lZCBnekZpbGUgd2lsbCBhbHNvIGNsb3NlIHRoZQotICAgZmlsZSBkZXNjcmlwdG9yIGZkLCBqdXN0IGxpa2UgZmNsb3NlKGZkb3BlbihmZCksIG1vZGUpIGNsb3NlcyB0aGUgZmlsZQotICAgZGVzY3JpcHRvciBmZC4gSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgPGEgaHJlZj0iI2d6ZG9wZW4iPmd6ZG9wZW48L2E+KGR1cChmZCksIG1vZGUpLgotICAgPHA+Ci0gICAgIDxhIGhyZWY9IiNnemRvcGVuIj5nemRvcGVuPC9hPiByZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUKLSAgIHRoZSAoZGUpY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJnenNldHBhcmFtcyI+Z3pzZXRwYXJhbXM8L2E+IChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpOzwvZm9udD4KLTxkZD4KLSAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBvciBzdHJhdGVneS4gU2VlIHRoZSBkZXNjcmlwdGlvbgotICAgb2YgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlc2UgcGFyYW1ldGVycy4KLSAgIDxwPgotICAgICA8YSBocmVmPSIjZ3pzZXRwYXJhbXMiPmd6c2V0cGFyYW1zPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgZmlsZSB3YXMgbm90Ci0gICBvcGVuZWQgZm9yIHdyaXRpbmcuCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnenJlYWQiPmd6cmVhZDwvYT4gIChnekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pOzwvZm9udD4KLTxkZD4KLSAgICAgUmVhZHMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLgotICAgSWYgdGhlIGlucHV0IGZpbGUgd2FzIG5vdCBpbiBnemlwIGZvcm1hdCwgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiBjb3BpZXMgdGhlIGdpdmVuIG51bWJlcgotICAgb2YgYnl0ZXMgaW50byB0aGUgYnVmZmVyLgotICAgPHA+Ci0gICAgIDxhIGhyZWY9IiNnenJlYWQiPmd6cmVhZDwvYT4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSByZWFkICgwIGZvcgotICAgZW5kIG9mIGZpbGUsIC0xIGZvciBlcnJvcikuCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnendyaXRlIj5nendyaXRlPC9hPiAoZ3pGaWxlIGZpbGUsIGNvbnN0IHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICA8YSBocmVmPSIjZ3p3cml0ZSI+Z3p3cml0ZTwvYT4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuCi0gICAoMCBpbiBjYXNlIG9mIGVycm9yKS4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgVkEgICA8YSBuYW1lPSJnenByaW50ZiI+Z3pwcmludGY8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOzwvZm9udD4KLTxkZD4KLSAgICAgQ29udmVydHMsIGZvcm1hdHMsIGFuZCB3cml0ZXMgdGhlIGFyZ3MgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSB1bmRlcgotICAgY29udHJvbCBvZiB0aGUgZm9ybWF0IHN0cmluZywgYXMgaW4gZnByaW50Zi4gPGEgaHJlZj0iI2d6cHJpbnRmIj5nenByaW50ZjwvYT4gcmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiAoMCBpbiBjYXNlIG9mIGVycm9yKS4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9Imd6cHV0cyI+Z3pwdXRzPC9hPiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKnMpOzwvZm9udD4KLTxkZD4KLSAgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29tcHJlc3NlZCBmaWxlLCBleGNsdWRpbmcKLSAgIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3Rlci4KLSAgIDxwPgotICAgICAgPGEgaHJlZj0iI2d6cHV0cyI+Z3pwdXRzPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgotICAgICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGNoYXIgKiAgPGEgbmFtZT0iZ3pnZXRzIj5nemdldHM8L2E+IChnekZpbGUgZmlsZSwgY2hhciAqYnVmLCBpbnQgbGVuKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgICBSZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgdW50aWwgbGVuLTEgY2hhcmFjdGVycyBhcmUgcmVhZCwgb3IKLSAgIGEgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbiBlbmQtb2YtZmlsZQotICAgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlIHN0cmluZyBpcyB0aGVuIHRlcm1pbmF0ZWQgd2l0aCBhIG51bGwKLSAgIGNoYXJhY3Rlci4KLSAgIDxwPgotICAgICAgPGEgaHJlZj0iI2d6Z2V0cyI+Z3pnZXRzPC9hPiByZXR1cm5zIGJ1Ziwgb3IgPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiBpbiBjYXNlIG9mIGVycm9yLgotICAgICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pwdXRjIj5nenB1dGM8L2E+IChnekZpbGUgZmlsZSwgaW50IGMpOzwvZm9udD4KLTxkZD4KLSAgICAgIFdyaXRlcyBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgY2hhciwgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgotICAgPGEgaHJlZj0iI2d6cHV0YyI+Z3pwdXRjPC9hPiByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pnZXRjIj5nemdldGM8L2E+IChnekZpbGUgZmlsZSk7PC9mb250PgotPGRkPgotICAgICAgUmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiA8YSBocmVmPSIjZ3pnZXRjIj5nemdldGM8L2E+IHJldHVybnMgdGhpcyBieXRlCi0gICBvciAtMSBpbiBjYXNlIG9mIGVuZCBvZiBmaWxlIG9yIGVycm9yLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pmbHVzaCI+Z3pmbHVzaDwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpOzwvZm9udD4KLTxkZD4KLSAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCi0gICBmbHVzaCBpcyBhcyBpbiB0aGUgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkgZnVuY3Rpb24uIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIKLSAgIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIDxhIGhyZWY9IiNnemVycm9yIj5nemVycm9yPC9hPiBiZWxvdykuIDxhIGhyZWY9IiNnemZsdXNoIj5nemZsdXNoPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZgotICAgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiBhbmQgYWxsIG91dHB1dCBjb3VsZCBiZSBmbHVzaGVkLgotICAgPHA+Ci0gICAgIDxhIGhyZWY9IiNnemZsdXNoIj5nemZsdXNoPC9hPiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBzdHJpY3RseSBuZWNlc3NhcnkgYmVjYXVzZSBpdCBjYW4KLSAgIGRlZ3JhZGUgY29tcHJlc3Npb24uCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gel9vZmZfdCAgICAgPGEgbmFtZT0iZ3pzZWVrIj5nenNlZWs8L2E+IChnekZpbGUgZmlsZSwgel9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpOzwvZm9udD4KLTxkZD4KLSAgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IG9yIDxhIGhyZWY9IiNnendyaXRlIj5nendyaXRlPC9hPiBvbiB0aGUKLSAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiBUaGUgd2hlbmNlIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGluIGxzZWVrKDIpOwotICAgdGhlIHZhbHVlIFNFRUtfRU5EIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICA8cD4KLSAgICAgSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciByZWFkaW5nLCB0aGlzIGZ1bmN0aW9uIGlzIGVtdWxhdGVkIGJ1dCBjYW4gYmUKLSAgIGV4dHJlbWVseSBzbG93LiBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcsIG9ubHkgZm9yd2FyZCBzZWVrcyBhcmUKLSAgIHN1cHBvcnRlZCA7IDxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4gdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKLSAgIHN0YXJ0aW5nIHBvc2l0aW9uLgotICAgPHA+Ci0gICAgICA8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+IHJldHVybnMgdGhlIHJlc3VsdGluZyBvZmZzZXQgbG9jYXRpb24gYXMgbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbQotICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbSwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvciwgaW4KLSAgIHBhcnRpY3VsYXIgaWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nIGFuZCB0aGUgbmV3IHN0YXJ0aW5nIHBvc2l0aW9uCi0gICB3b3VsZCBiZSBiZWZvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnenJld2luZCI+Z3pyZXdpbmQ8L2E+IChnekZpbGUgZmlsZSk7PC9mb250PgotPGRkPgotICAgICBSZXdpbmRzIHRoZSBnaXZlbiBmaWxlLiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGZvciByZWFkaW5nLgotICAgICA8cD4KLSAgIDxhIGhyZWY9IiNnenJld2luZCI+Z3pyZXdpbmQ8L2E+KGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gKGludCk8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+KGZpbGUsIDBMLCBTRUVLX1NFVCkKLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiB6X29mZl90ICAgICA8YSBuYW1lPSJnenRlbGwiPmd6dGVsbDwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IG9yIDxhIGhyZWY9IiNnendyaXRlIj5nendyaXRlPC9hPiBvbiB0aGUKLSAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgotICAgPHA+Ci0KLSAgIDxhIGhyZWY9IiNnenRlbGwiPmd6dGVsbDwvYT4oZmlsZSkgaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+KGZpbGUsIDBMLCBTRUVLX0NVUikKLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9Imd6ZW9mIj5nemVvZjwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIFJldHVybnMgMSB3aGVuIEVPRiBoYXMgcHJldmlvdXNseSBiZWVuIGRldGVjdGVkIHJlYWRpbmcgdGhlIGdpdmVuCi0gICBpbnB1dCBzdHJlYW0sIG90aGVyd2lzZSB6ZXJvLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pjbG9zZSI+Z3pjbG9zZTwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKLSAgIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgotICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gPGEgaHJlZj0iI2d6ZXJyb3IiPmd6ZXJyb3I8L2E+IGJlbG93KS4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBjb25zdCBjaGFyICogIDxhIG5hbWU9Imd6ZXJyb3IiPmd6ZXJyb3I8L2E+IChnekZpbGUgZmlsZSwgaW50ICplcnJudW0pOzwvZm9udD4KLTxkZD4KLSAgICAgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGxhc3QgZXJyb3Igd2hpY2ggb2NjdXJyZWQgb24gdGhlCi0gICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCi0gICBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKLSAgIGVycm51bSBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfRVJSTk8iPlpfRVJSTk88L2E+IGFuZCB0aGUgYXBwbGljYXRpb24gbWF5IGNvbnN1bHQgZXJybm8KLSAgIHRvIGdldCB0aGUgZXhhY3QgZXJyb3IgY29kZS4KLSAgIDxwPgotPC9kbD4KLTxocj4KLTxhIG5hbWU9IkJhc2ljIGZ1bmN0aW9ucyI+PGgyPiBCYXNpYyBmdW5jdGlvbnMgPC9oMj4KLTxoMz4gRnVuY3Rpb24gbGlzdCA8L2gzPgotPHVsPgotPGxpPiAgY29uc3QgY2hhciAqICA8YSBocmVmPSIjemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPiAodm9pZCk7Ci08bGk+ICBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBsZXZlbCk7Ci08bGk+ICBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgZmx1c2gpOwotPGxpPiAgaW50ICA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Ci08bGk+ICBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOwotPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGZsdXNoKTsKLTxsaT4gIGludCAgPGEgaHJlZj0iI2luZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOwotPC91bD4KLQotPGgzPiBGdW5jdGlvbiBkZXNjcmlwdGlvbiA8L2gzPgotPGRsPgotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGNvbnN0IGNoYXIgKiAgPGEgbmFtZT0iemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPiAodm9pZCk7PC9mb250PgotPGRkPiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbXBhcmUgPGEgaHJlZj0iI3psaWJWZXJzaW9uIj56bGliVmVyc2lvbjwvYT4gYW5kIFpMSUJfVkVSU0lPTiBmb3IgY29uc2lzdGVuY3kuCi0gICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGRpZmZlcnMsIHRoZSBsaWJyYXJ5IGNvZGUgYWN0dWFsbHkgdXNlZCBpcwotICAgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgemxpYi5oIGhlYWRlciBmaWxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgVGhpcyBjaGVjayBpcyBhdXRvbWF0aWNhbGx5IG1hZGUgYnkgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gYW5kIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+LgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgbGV2ZWwpOzwvZm9udD4KLTxkZD4KLSAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBmb3IgY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKLSAgIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCi0gICBJZiA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBhcmUgc2V0IHRvIDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4sIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IHVwZGF0ZXMgdGhlbSB0bwotICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCi0gICA8cD4KLQotICAgICBUaGUgY29tcHJlc3Npb24gbGV2ZWwgbXVzdCBiZSA8YSBocmVmPSIjWl9ERUZBVUxUX0NPTVBSRVNTSU9OIj5aX0RFRkFVTFRfQ09NUFJFU1NJT048L2E+LCBvciBiZXR3ZWVuIDAgYW5kIDk6Ci0gICAxIGdpdmVzIGJlc3Qgc3BlZWQsIDkgZ2l2ZXMgYmVzdCBjb21wcmVzc2lvbiwgMCBnaXZlcyBubyBjb21wcmVzc2lvbiBhdAotICAgYWxsICh0aGUgaW5wdXQgZGF0YSBpcyBzaW1wbHkgY29waWVkIGEgYmxvY2sgYXQgYSB0aW1lKS4KLSAgIDxwPgotCi0gICA8YSBocmVmPSIjWl9ERUZBVUxUX0NPTVBSRVNTSU9OIj5aX0RFRkFVTFRfQ09NUFJFU1NJT048L2E+IHJlcXVlc3RzIGEgZGVmYXVsdCBjb21wcm9taXNlIGJldHdlZW4gc3BlZWQgYW5kCi0gICBjb21wcmVzc2lvbiAoY3VycmVudGx5IGVxdWl2YWxlbnQgdG8gbGV2ZWwgNikuCi0gICA8cD4KLQotICAgICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBsZXZlbCBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBsZXZlbCwKLSAgIDxhIGhyZWY9IiNaX1ZFUlNJT05fRVJST1IiPlpfVkVSU0lPTl9FUlJPUjwvYT4gaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uICg8YSBocmVmPSIjemxpYl92ZXJzaW9uIj56bGliX3ZlcnNpb248L2E+KSBpcyBpbmNvbXBhdGlibGUKLSAgIHdpdGggdGhlIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyIChaTElCX1ZFUlNJT04pLgotICAgPGEgaHJlZj0iI21zZyI+bXNnPC9hPiBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gZG9lcyBub3QKLSAgIHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJkZWZsYXRlIj5kZWZsYXRlPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgZmx1c2gpOzwvZm9udD4KLTxkZD4KLSAgICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAotICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBpbnRyb2R1Y2Ugc29tZQotICBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgotICBmb3JjZWQgdG8gZmx1c2guPHA+Ci0KLSAgICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCi0gIGZvbGxvd2luZyBhY3Rpb25zOgotCi0gIDx1bD4KLSAgPGxpPiBDb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4KLSAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAotICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBhcmUgdXBkYXRlZCBhbmQKLSAgICBwcm9jZXNzaW5nIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuCi0KLSAgPGxpPgotICAgIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIHVwZGF0ZSA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPgotICAgIGFjY29yZGluZ2x5LiBUaGlzIGFjdGlvbiBpcyBmb3JjZWQgaWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBub24gemVyby4KLSAgICBGb3JjaW5nIGZsdXNoIGZyZXF1ZW50bHkgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvLCBzbyB0aGlzIHBhcmFtZXRlcgotICAgIHNob3VsZCBiZSBzZXQgb25seSB3aGVuIG5lY2Vzc2FyeSAoaW4gaW50ZXJhY3RpdmUgYXBwbGljYXRpb25zKS4KLSAgICBTb21lIG91dHB1dCBtYXkgYmUgcHJvdmlkZWQgZXZlbiBpZiBmbHVzaCBpcyBub3Qgc2V0LgotICA8L3VsPiA8cD4KLQotICBCZWZvcmUgdGhlIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKLSAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCi0gIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gb3IgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBhY2NvcmRpbmdseSA7IDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4KLSAgc2hvdWxkIG5ldmVyIGJlIHplcm8gYmVmb3JlIHRoZSBjYWxsLiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlCi0gIGNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvciBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbAotICAoPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiA9PSAwKSwgb3IgYWZ0ZXIgZWFjaCBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLiBJZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4KLSAgYW5kIHdpdGggemVybyA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUKLSAgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCi0gIDxwPgotCi0gICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzCi0gIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQgaXMgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnksIHNvCi0gIHRoYXQgdGhlIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbCBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuIChJbiBwYXJ0aWN1bGFyCi0gIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IGlzIHplcm8gYWZ0ZXIgdGhlIGNhbGwgaWYgZW5vdWdoIG91dHB1dCBzcGFjZSBoYXMgYmVlbiBwcm92aWRlZAotICBiZWZvcmUgdGhlIGNhbGwuKSAgRmx1c2hpbmcgbWF5IGRlZ3JhZGUgY29tcHJlc3Npb24gZm9yIHNvbWUgY29tcHJlc3Npb24KLSAgYWxnb3JpdGhtcyBhbmQgc28gaXQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4KLSAgPHA+Ci0KLSAgICBJZiBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPiwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKLSAgPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgYW5kIHRoZSBjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBpcyByZXNldCBzbyB0aGF0IGRlY29tcHJlc3Npb24gY2FuCi0gIHJlc3RhcnQgZnJvbSB0aGlzIHBvaW50IGlmIHByZXZpb3VzIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBkYW1hZ2VkIG9yIGlmCi0gIHJhbmRvbSBhY2Nlc3MgaXMgZGVzaXJlZC4gVXNpbmcgPGEgaHJlZj0iI1pfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPiB0b28gb2Z0ZW4gY2FuIHNlcmlvdXNseSBkZWdyYWRlCi0gIHRoZSBjb21wcmVzc2lvbi4KLSAgPHA+Ci0KLSAgICBJZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgotICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkCi0gIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4pLCB1bnRpbCB0aGUgZmx1c2ggaXMgY29tcGxldGUgKDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiByZXR1cm5zIHdpdGggbm9uLXplcm8KLSAgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPikuCi0gIDxwPgotCi0gICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4sIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkLAotICBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIGFuZCA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gaWYgdGhlcmUKLSAgd2FzIGVub3VnaCBvdXRwdXQgc3BhY2UgOyBpZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCi0gIGNhbGxlZCBhZ2FpbiB3aXRoIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+KSBidXQgbm8KLSAgbW9yZSBpbnB1dCBkYXRhLCB1bnRpbCBpdCByZXR1cm5zIHdpdGggPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBvciBhbiBlcnJvci4gQWZ0ZXIKLSAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGhhcyByZXR1cm5lZCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+LCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZQotICBzdHJlYW0gYXJlIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4gb3IgPGEgaHJlZj0iI2RlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+LgotICA8cD4KLQotICAgIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IGlmIGFsbCB0aGUgY29tcHJlc3Npb24KLSAgaXMgdG8gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwLiBJbiB0aGlzIGNhc2UsIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gbXVzdCBiZSBhdCBsZWFzdAotICAwLjElIGxhcmdlciB0aGFuIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IHBsdXMgMTIgYnl0ZXMuICBJZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gZG9lcyBub3QgcmV0dXJuCi0gIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4sIHRoZW4gaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYXMgZGVzY3JpYmVkIGFib3ZlLgotICA8cD4KLQotICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIHNldHMgc3RybS0mZ3QgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gdG8gdGhlIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSBvZiBhbGwgaW5wdXQgcmVhZAotICBzbyBmYXIgKHRoYXQgaXMsIDxhIGhyZWY9IiN0b3RhbF9pbiI+dG90YWxfaW48L2E+IGJ5dGVzKS4KLSAgPHA+Ci0KLSAgICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBtYXkgdXBkYXRlIDxhIGhyZWY9IiNkYXRhX3R5cGUiPmRhdGFfdHlwZTwvYT4gaWYgaXQgY2FuIG1ha2UgYSBnb29kIGd1ZXNzIGFib3V0Ci0gIHRoZSBpbnB1dCBkYXRhIHR5cGUgKDxhIGhyZWY9IiNaX0FTQ0lJIj5aX0FTQ0lJPC9hPiBvciA8YSBocmVmPSIjWl9CSU5BUlkiPlpfQklOQVJZPC9hPikuIEluIGRvdWJ0LCB0aGUgZGF0YSBpcyBjb25zaWRlcmVkCi0gIGJpbmFyeS4gVGhpcyBmaWVsZCBpcyBvbmx5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3NlcyBhbmQgZG9lcyBub3QgYWZmZWN0Ci0gIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaW4gYW55IG1hbm5lci4KLSAgPHA+Ci0KLSAgICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKLSAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBpZiBhbGwgaW5wdXQgaGFzIGJlZW4KLSAgY29uc3VtZWQgYW5kIGFsbCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQgKG9ubHkgd2hlbiBmbHVzaCBpcyBzZXQgdG8KLSAgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4pLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlCi0gIGlmIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBvciA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiB3YXMgTlVMTCksIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+IGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlCi0gIChmb3IgZXhhbXBsZSA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBvciA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IHdhcyB6ZXJvKS4KLSAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImRlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KLTxkZD4KLSAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KLSAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKLSAgIHBlbmRpbmcgb3V0cHV0LgotICAgPHA+Ci0KLSAgICAgPGEgaHJlZj0iI2RlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZQotICAgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQsIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIHN0cmVhbSB3YXMgZnJlZWQKLSAgIHByZW1hdHVyZWx5IChzb21lIGlucHV0IG9yIG91dHB1dCB3YXMgZGlzY2FyZGVkKS4gSW4gdGhlIGVycm9yIGNhc2UsCi0gICA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUKLSAgIGRlYWxsb2NhdGVkKS4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KLTxkZD4KLQlJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGZvciBkZWNvbXByZXNzaW9uLiBUaGUgZmllbGRzCi0gICA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4sIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+LCA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+LCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBhbmQgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQotICAgdGhlIGNhbGxlci4gSWYgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGlzIG5vdCA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBpcyBsYXJnZSBlbm91Z2ggKHRoZSBleGFjdAotICAgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY29tcHJlc3Npb24gbWV0aG9kKSwgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gZGV0ZXJtaW5lcyB0aGUKLSAgIGNvbXByZXNzaW9uIG1ldGhvZCBmcm9tIHRoZSB6bGliIGhlYWRlciBhbmQgYWxsb2NhdGVzIGFsbCBkYXRhIHN0cnVjdHVyZXMKLSAgIGFjY29yZGluZ2x5IDsgb3RoZXJ3aXNlIHRoZSBhbGxvY2F0aW9uIHdpbGwgYmUgZGVmZXJyZWQgdG8gdGhlIGZpcnN0IGNhbGwgb2YKLSAgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPi4gIElmIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFyZSBzZXQgdG8gPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiwgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gdXBkYXRlcyB0aGVtIHRvCi0gICB1c2UgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KLSAgIDxwPgotCi0gICAgIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCi0gICBtZW1vcnksIDxhIGhyZWY9IiNaX1ZFUlNJT05fRVJST1IiPlpfVkVSU0lPTl9FUlJPUjwvYT4gaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIuICA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yCi0gICBtZXNzYWdlLiA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uIGFwYXJ0IGZyb20gcmVhZGluZwotICAgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLiAgKFNvIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQKLSAgIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IG1heSBiZSBtb2RpZmllZCwgYnV0IDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IGFyZSB1bmNoYW5nZWQuKQotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGUiPmluZmxhdGU8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBmbHVzaCk7PC9mb250PgotPGRkPgotICAgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBkZWNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKLSAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgc29tZQotICBpbnRyb2R1Y2Ugc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KQotICBleGNlcHQgd2hlbiBmb3JjZWQgdG8gZmx1c2guCi0gIDxwPgotCi0gIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKLSAgZm9sbG93aW5nIGFjdGlvbnM6Ci0KLSAgPHVsPgotICA8bGk+IERlY29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gYW5kIHVwZGF0ZSA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+Ci0gICAgYWNjb3JkaW5nbHkuIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKLSAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nCi0gICAgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKS4KLQotICA8bGk+IFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIHVwZGF0ZSA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQKLSAgICA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IGFjY29yZGluZ2x5LiAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgcHJvdmlkZXMgYXMgbXVjaCBvdXRwdXQgYXMgcG9zc2libGUsCi0gICAgdW50aWwgdGhlcmUgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIKLSAgICAoc2VlIGJlbG93IGFib3V0IHRoZSBmbHVzaCBwYXJhbWV0ZXIpLgotICA8L3VsPiA8cD4KLQotICBCZWZvcmUgdGhlIGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKLSAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCi0gIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuCi0gIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IKLSAgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gPT0gMCksIG9yIGFmdGVyIGVhY2gKLSAgY2FsbCBvZiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKS4gSWYgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGFuZCB3aXRoIHplcm8gPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiwgaXQKLSAgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZQotICBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgotICA8cD4KLQotICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIDxhIGhyZWY9IiNaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4sIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBmbHVzaGVzIGFzIG11Y2gKLSAgb3V0cHV0IGFzIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGUgZmx1c2hpbmcgYmVoYXZpb3Igb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IGlzCi0gIG5vdCBzcGVjaWZpZWQgZm9yIHZhbHVlcyBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIG90aGVyIHRoYW4gPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPgotICBhbmQgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4sIGJ1dCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSBmbHVzaGVzIGFzIG11Y2ggb3V0cHV0Ci0gIGFzIHBvc3NpYmxlIGFueXdheS4KLSAgPHA+Ci0KLSAgICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBvciBhbgotICBlcnJvci4gSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcAotICAoYSBzaW5nbGUgY2FsbCBvZiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4pLCB0aGUgcGFyYW1ldGVyIGZsdXNoIHNob3VsZCBiZSBzZXQgdG8KLSAgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4uIEluIHRoaXMgY2FzZSBhbGwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQgYW5kIGFsbCBwZW5kaW5nCi0gIG91dHB1dCBpcyBmbHVzaGVkIDsgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUKLSAgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbWF5IGhhdmUgYmVlbiBzYXZlZAotICBieSB0aGUgY29tcHJlc3NvciBmb3IgdGhpcyBwdXJwb3NlLikgVGhlIG5leHQgb3BlcmF0aW9uIG9uIHRoaXMgc3RyZWFtIG11c3QKLSAgYmUgPGEgaHJlZj0iI2luZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+IHRvIGRlYWxsb2NhdGUgdGhlIGRlY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uIFRoZSB1c2Ugb2YgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4KLSAgaXMgbmV2ZXIgcmVxdWlyZWQsIGJ1dCBjYW4gYmUgdXNlZCB0byBpbmZvcm0gPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IHRoYXQgYSBmYXN0ZXIgcm91dGluZQotICBtYXkgYmUgdXNlZCBmb3IgdGhlIHNpbmdsZSA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSBjYWxsLgotICA8cD4KLQotICAgICBJZiBhIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50IChzZWUgPGEgaHJlZj0iI2luZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4KLSAgYmVsb3cpLCA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gc2V0cyBzdHJtLTxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+IHRvIHRoZSA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gY2hlY2tzdW0gb2YgdGhlCi0gIGRpY3Rpb25hcnkgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIDxhIGhyZWY9IiNaX05FRURfRElDVCI+Wl9ORUVEX0RJQ1Q8L2E+IDsgb3RoZXJ3aXNlCi0gIGl0IHNldHMgc3RybS0mZ3QgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gdG8gdGhlIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkCi0gIHNvIGZhciAodGhhdCBpcywgPGEgaHJlZj0iI3RvdGFsX291dCI+dG90YWxfb3V0PC9hPiBieXRlcykgYW5kIHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+LCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IG9yCi0gIGFuIGVycm9yIGNvZGUgYXMgZGVzY3JpYmVkIGJlbG93LiBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpCi0gIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gY2hlY2tzdW0gaXMgZXF1YWwgdG8gdGhhdCBzYXZlZCBieSB0aGUKLSAgY29tcHJlc3NvciBhbmQgcmV0dXJucyA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCi0gIDxwPgotCi0gICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0IHByb2Nlc3NlZAotICBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gaWYgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGhhcwotICBiZWVuIHJlYWNoZWQgYW5kIGFsbCB1bmNvbXByZXNzZWQgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkLCA8YSBocmVmPSIjWl9ORUVEX0RJQ1QiPlpfTkVFRF9ESUNUPC9hPiBpZiBhCi0gIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50LCA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+IGlmIHRoZSBpbnB1dCBkYXRhIHdhcwotICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0Ci0gIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQKLSAgKGZvciBleGFtcGxlIGlmIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBvciA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiB3YXMgTlVMTCksIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QKLSAgZW5vdWdoIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUgb3IgaWYgdGhlcmUgd2FzIG5vdAotICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB3aGVuIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGlzIHVzZWQuIEluIHRoZSA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+Ci0gIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgdGhlbiBjYWxsIDxhIGhyZWY9IiNpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+IHRvIGxvb2sgZm9yIGEgZ29vZAotICBjb21wcmVzc2lvbiBibG9jay4KLSAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KLTxkZD4KLSAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KLSAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKLSAgIHBlbmRpbmcgb3V0cHV0LgotICAgPHA+Ci0KLSAgICAgPGEgaHJlZj0iI2luZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4KLSAgIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBlcnJvciBjYXNlLCA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEKLSAgIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkKS4KLTwvZGw+Ci08aHI+Ci08YSBuYW1lPSJBZHZhbmNlZCBmdW5jdGlvbnMiPjxoMj4gQWR2YW5jZWQgZnVuY3Rpb25zIDwvaDI+Ci0gICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG5lZWRlZCBvbmx5IGluIHNvbWUgc3BlY2lhbCBhcHBsaWNhdGlvbnMuCi08aDM+IEZ1bmN0aW9uIGxpc3QgPC9oMz4KLTx1bD4KLTxsaT4gIGludCAgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLAotPGxpPiBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LCB1SW50ICBkaWN0TGVuZ3RoKTsKLTxsaT4gaW50ICA8YSBocmVmPSIjZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBkZXN0LCA8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHNvdXJjZSk7Ci08bGk+IGludCAgPGEgaHJlZj0iI2RlZmxhdGVSZXNldCI+ZGVmbGF0ZVJlc2V0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKLTxsaT4gaW50ICA8YSBocmVmPSIjZGVmbGF0ZVBhcmFtcyI+ZGVmbGF0ZVBhcmFtczwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpOwotPGxpPiBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50ICB3aW5kb3dCaXRzKTsKLTxsaT4gIGludCAgPGEgaHJlZj0iI2luZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksIHVJbnQgIGRpY3RMZW5ndGgpOwotPGxpPiBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOwotPGxpPiBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlUmVzZXQiPmluZmxhdGVSZXNldDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Ci0KLTwvdWw+Ci08aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+Ci08ZGw+Ci08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50ICBsZXZlbCwgaW50ICBtZXRob2QsIGludCAgd2luZG93Qml0cywgaW50ICBtZW1MZXZlbCwgaW50ICBzdHJhdGVneSk7PC9mb250PgotCi08ZGQ+IFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IHdpdGggbW9yZSBjb21wcmVzc2lvbiBvcHRpb25zLiBUaGUKLSAgIGZpZWxkcyA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4sIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5Ci0gICB0aGUgY2FsbGVyLjxwPgotCi0gICAgIFRoZSBtZXRob2QgcGFyYW1ldGVyIGlzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuIEl0IG11c3QgYmUgPGEgaHJlZj0iI1pfREVGTEFURUQiPlpfREVGTEFURUQ8L2E+IGluCi0gICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuPHA+Ci0KLSAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplCi0gICAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yIHRoaXMKLSAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIExhcmdlciB2YWx1ZXMgb2YgdGhpcyBwYXJhbWV0ZXIgcmVzdWx0IGluIGJldHRlcgotICAgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgotICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gaXMgdXNlZCBpbnN0ZWFkLjxwPgotCi0gICAgIFRoZSBtZW1MZXZlbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkCi0gICBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LiBtZW1MZXZlbD0xIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0Ci0gICBpcyBzbG93IGFuZCByZWR1Y2VzIGNvbXByZXNzaW9uIHJhdGlvIDsgbWVtTGV2ZWw9OSB1c2VzIG1heGltdW0gbWVtb3J5Ci0gICBmb3Igb3B0aW1hbCBzcGVlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4gU2VlIHpjb25mLmggZm9yIHRvdGFsIG1lbW9yeQotICAgdXNhZ2UgYXMgYSBmdW5jdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC48cD4KLQotICAgICBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIGlzIHVzZWQgdG8gdHVuZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBVc2UgdGhlCi0gICB2YWx1ZSA8YSBocmVmPSIjWl9ERUZBVUxUX1NUUkFURUdZIj5aX0RFRkFVTFRfU1RSQVRFR1k8L2E+IGZvciBub3JtYWwgZGF0YSwgPGEgaHJlZj0iI1pfRklMVEVSRUQiPlpfRklMVEVSRUQ8L2E+IGZvciBkYXRhIHByb2R1Y2VkIGJ5IGEKLSAgIGZpbHRlciAob3IgcHJlZGljdG9yKSwgb3IgPGEgaHJlZj0iI1pfSFVGRk1BTl9PTkxZIj5aX0hVRkZNQU5fT05MWTwvYT4gdG8gZm9yY2UgSHVmZm1hbiBlbmNvZGluZyBvbmx5IChubwotICAgc3RyaW5nIG1hdGNoKS4gIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEKLSAgIHNvbWV3aGF0IHJhbmRvbSBkaXN0cmlidXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcwotICAgdHVuZWQgdG8gPGEgaHJlZj0iI2NvbXByZXNzIj5jb21wcmVzczwvYT4gdGhlbSBiZXR0ZXIuIFRoZSBlZmZlY3Qgb2YgPGEgaHJlZj0iI1pfRklMVEVSRUQiPlpfRklMVEVSRUQ8L2E+IGlzIHRvIGZvcmNlIG1vcmUKLSAgIEh1ZmZtYW4gY29kaW5nIGFuZCBsZXNzIHN0cmluZyBtYXRjaGluZyA7IGl0IGlzIHNvbWV3aGF0IGludGVybWVkaWF0ZQotICAgYmV0d2VlbiBaX0RFRkFVTFQgYW5kIDxhIGhyZWY9IiNaX0hVRkZNQU5fT05MWSI+Wl9IVUZGTUFOX09OTFk8L2E+LiBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cwotICAgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBub3QgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBjb21wcmVzc2VkIG91dHB1dCBldmVuCi0gICBpZiBpdCBpcyBub3Qgc2V0IGFwcHJvcHJpYXRlbHkuPHA+Ci0KLSAgICAgIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCi0gICBtZXRob2QpLiA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IGRvZXMKLSAgIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZVNldERpY3Rpb25hcnkiPmRlZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwgdUludCAgZGljdExlbmd0aCk7PC9mb250PgotPGRkPgotICAgICBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlCi0gICB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQKLSAgIGltbWVkaWF0ZWx5IGFmdGVyIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+LCA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IG9yIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4sIGJlZm9yZSBhbnkKLSAgIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+LiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKLSAgIGRpY3Rpb25hcnkgKHNlZSA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPikuPHA+Ci0KLSAgICAgVGhlIGRpY3Rpb25hcnkgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseQotICAgdG8gYmUgZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seQotICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gVXNpbmcgYQotICAgZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbiBiZQotICAgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeSA7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyIHRoYW4KLSAgIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS48cD4KLQotICAgICBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzaW9uIGRhdGEgc3RydWN0dXJlcyBzZWxlY3RlZCBieQotICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gb3IgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiwgYSBwYXJ0IG9mIHRoZSBkaWN0aW9uYXJ5IG1heSBpbiBlZmZlY3QgYmUKLSAgIGRpc2NhcmRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIGRpY3Rpb25hcnkgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpbmRvdyBzaXplIGluCi0gICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gb3IgZGVmbGF0ZTIuIFRodXMgdGhlIHN0cmluZ3MgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZnVsIHNob3VsZCBiZQotICAgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuPHA+Ci0KLSAgICAgVXBvbiByZXR1cm4gb2YgdGhpcyBmdW5jdGlvbiwgc3RybS0mZ3QgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gaXMgc2V0IHRvIHRoZSBBZGxlcjMyIHZhbHVlCi0gICBvZiB0aGUgZGljdGlvbmFyeSA7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQotICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAoVGhlIEFkbGVyMzIgdmFsdWUKLSAgIGFwcGxpZXMgdG8gdGhlIHdob2xlIGRpY3Rpb25hcnkgZXZlbiBpZiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBkaWN0aW9uYXJ5IGlzCi0gICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLik8cD4KLQotICAgICA8YSBocmVmPSIjZGVmbGF0ZVNldERpY3Rpb25hcnkiPmRlZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhCi0gICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBOVUxMIGRpY3Rpb25hcnkpIG9yIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gaXMKLSAgIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUgaWYgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHN0cmVhbQotICAgb3IgaWYgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBic29ydCkuIDxhIGhyZWY9IiNkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+IGRvZXMgbm90Ci0gICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBkZXN0LCA8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHNvdXJjZSk7PC9mb250PgotPGRkPgotICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLjxwPgotCi0gICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHNldmVyYWwgY29tcHJlc3Npb24gc3RyYXRlZ2llcyB3aWxsIGJlCi0gICB0cmllZCwgZm9yIGV4YW1wbGUgd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIHByZS1wcm9jZXNzaW5nIHRoZSBpbnB1dAotICAgZGF0YSB3aXRoIGEgZmlsdGVyLiBUaGUgc3RyZWFtcyB0aGF0IHdpbGwgYmUgZGlzY2FyZGVkIHNob3VsZCB0aGVuIGJlIGZyZWVkCi0gICBieSBjYWxsaW5nIDxhIGhyZWY9IiNkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPi4gIE5vdGUgdGhhdCA8YSBocmVmPSIjZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAotICAgY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kCi0gICBjYW4gY29uc3VtZSBsb3RzIG9mIG1lbW9yeS48cD4KLQotICAgICA8YSBocmVmPSIjZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc291cmNlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50Ci0gICAoc3VjaCBhcyA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGJlaW5nIE5VTEwpLiA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAotICAgZGVzdGluYXRpb24uPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KLTxkZD4gICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gZm9sbG93ZWQgYnkgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4sCi0gICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LgotICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgdGhlIHNhbWUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGFueSBvdGhlciBhdHRyaWJ1dGVzCi0gICB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4uPHA+Ci0KLSAgICAgIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2Vzcywgb3IgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBvciA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBiZWluZyBOVUxMKS48cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7PC9mb250PgotPGRkPgotICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4gIFRoZQotICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4uICBUaGlzIGNhbiBiZQotICAgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQgZGF0YSwgb3IKLSAgIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBraW5kIG9mIGlucHV0IGRhdGEgcmVxdWlyaW5nIGEgZGlmZmVyZW50Ci0gICBzdHJhdGVneS4gSWYgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGNoYW5nZWQsIHRoZSBpbnB1dCBhdmFpbGFibGUgc28gZmFyCi0gICBpcyBjb21wcmVzc2VkIHdpdGggdGhlIG9sZCBsZXZlbCAoYW5kIG1heSBiZSBmbHVzaGVkKTsgdGhlIG5ldyBsZXZlbCB3aWxsCi0gICB0YWtlIGVmZmVjdCBvbmx5IGF0IHRoZSBuZXh0IGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuPHA+Ci0KLSAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiwgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBtdXN0IGJlIHNldCBhcyBmb3IKLSAgIGEgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSwgc2luY2UgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgaW5wdXQgbWF5IGhhdmUgdG8KLSAgIGJlIGNvbXByZXNzZWQgYW5kIGZsdXNoZWQuIEluIHBhcnRpY3VsYXIsIHN0cm0tJmd0IDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gbXVzdCBiZQotICAgbm9uLXplcm8uPHA+Ci0KLSAgICAgPGEgaHJlZj0iI2RlZmxhdGVQYXJhbXMiPmRlZmxhdGVQYXJhbXM8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50IG9yIGlmIGEgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPgotICAgaWYgc3RybS0mZ3RhdmFpbF9vdXQgd2FzIHplcm8uPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iaW5mbGF0ZUluaXQyIj5pbmZsYXRlSW5pdDI8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCAgd2luZG93Qml0cyk7PC9mb250PgotCi08ZGQ+ICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiB3aXRoIGFuIGV4dHJhIHBhcmFtZXRlci4gVGhlCi0gICBmaWVsZHMgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+LCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiwgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZAotICAgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuPHA+Ci0KLSAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIG1heGltdW0gd2luZG93Ci0gICBzaXplICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IKLSAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gaXMgdXNlZAotICAgaW5zdGVhZC4gSWYgYSBjb21wcmVzc2VkIHN0cmVhbSB3aXRoIGEgbGFyZ2VyIHdpbmRvdyBzaXplIGlzIGdpdmVuIGFzCi0gICBpbnB1dCwgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgd2lsbCByZXR1cm4gd2l0aCB0aGUgZXJyb3IgY29kZSA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+IGluc3RlYWQgb2YKLSAgIHRyeWluZyB0byBhbGxvY2F0ZSBhIGxhcmdlciB3aW5kb3cuPHA+Ci0KLSAgICAgIDxhIGhyZWY9IiNpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhIG5lZ2F0aXZlCi0gICBtZW1MZXZlbCkuIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIDxhIGhyZWY9IiNpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4KLSAgIGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24gYXBhcnQgZnJvbSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZgotICAgcHJlc2VudDogdGhpcyB3aWxsIGJlIGRvbmUgYnkgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuIChTbyA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IG1heSBiZQotICAgbW9kaWZpZWQsIGJ1dCA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBhcmUgdW5jaGFuZ2VkLik8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwgdUludCAgZGljdExlbmd0aCk7PC9mb250PgotPGRkPgotICAgICBJbml0aWFsaXplcyB0aGUgZGVjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIHVuY29tcHJlc3NlZCBieXRlCi0gICBzZXF1ZW5jZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+Ci0gICBpZiB0aGlzIGNhbGwgcmV0dXJuZWQgPGEgaHJlZj0iI1pfTkVFRF9ESUNUIj5aX05FRURfRElDVDwvYT4uIFRoZSBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvcgotICAgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgQWRsZXIzMiB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGNhbGwgb2YKLSAgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPi4gVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lCi0gICBkaWN0aW9uYXJ5IChzZWUgPGEgaHJlZj0iI2RlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4pLjxwPgotCi0gICAgIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGEKLSAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBpcwotICAgaW5jb25zaXN0ZW50LCA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+IGlmIHRoZSBnaXZlbiBkaWN0aW9uYXJ5IGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICBleHBlY3RlZCBvbmUgKGluY29ycmVjdCBBZGxlcjMyIHZhbHVlKS4gPGEgaHJlZj0iI2luZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4gZG9lcyBub3QKLSAgIHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IHN1YnNlcXVlbnQgY2FsbHMgb2YKLSAgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLjxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImluZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgotCi08ZGQ+ICAgIFNraXBzIGludmFsaWQgY29tcHJlc3NlZCBkYXRhIHVudGlsIGEgZnVsbCBmbHVzaCBwb2ludCAoc2VlIGFib3ZlIHRoZQotICBkZXNjcmlwdGlvbiBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gd2l0aCA8YSBocmVmPSIjWl9GVUxMX0ZMVVNIIj5aX0ZVTExfRkxVU0g8L2E+KSBjYW4gYmUgZm91bmQsIG9yIHVudGlsIGFsbAotICBhdmFpbGFibGUgaW5wdXQgaXMgc2tpcHBlZC4gTm8gb3V0cHV0IGlzIHByb3ZpZGVkLjxwPgotCi0gICAgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgYSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPgotICBpZiBubyBtb3JlIGlucHV0IHdhcyBwcm92aWRlZCwgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpZiBubyBmbHVzaCBwb2ludCBoYXMgYmVlbiBmb3VuZCwKLSAgb3IgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudC4gSW4gdGhlIHN1Y2Nlc3MKLSAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBzYXZlIHRoZSBjdXJyZW50IGN1cnJlbnQgdmFsdWUgb2YgPGEgaHJlZj0iI3RvdGFsX2luIj50b3RhbF9pbjwvYT4gd2hpY2gKLSAgaW5kaWNhdGVzIHdoZXJlIHZhbGlkIGNvbXByZXNzZWQgZGF0YSB3YXMgZm91bmQuIEluIHRoZSBlcnJvciBjYXNlLCB0aGUKLSAgYXBwbGljYXRpb24gbWF5IHJlcGVhdGVkbHkgY2FsbCA8YSBocmVmPSIjaW5mbGF0ZVN5bmMiPmluZmxhdGVTeW5jPC9hPiwgcHJvdmlkaW5nIG1vcmUgaW5wdXQgZWFjaCB0aW1lLAotICB1bnRpbCBzdWNjZXNzIG9yIGVuZCBvZiB0aGUgaW5wdXQgZGF0YS48cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJpbmZsYXRlUmVzZXQiPmluZmxhdGVSZXNldDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgotPGRkPgotICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gPGEgaHJlZj0iI2luZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+IGZvbGxvd2VkIGJ5IDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+LAotICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBkZWNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LgotICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IDxhIGhyZWY9IiNpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4uCi0gICA8cD4KLQotICAgICAgPGEgaHJlZj0iI2luZmxhdGVSZXNldCI+aW5mbGF0ZVJlc2V0PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IG9yIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGJlaW5nIE5VTEwpLgotICAgPHA+Ci08L2RsPgotCi08aHI+Ci08YSBuYW1lPSJDaGVja3N1bSBmdW5jdGlvbnMiPjxoMj4gQ2hlY2tzdW0gZnVuY3Rpb25zIDwvaDI+Ci0gICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHJlbGF0ZWQgdG8gY29tcHJlc3Npb24gYnV0IGFyZSBleHBvcnRlZAotICAgYW55d2F5IGJlY2F1c2UgdGhleSBtaWdodCBiZSB1c2VmdWwgaW4gYXBwbGljYXRpb25zIHVzaW5nIHRoZQotICAgY29tcHJlc3Npb24gbGlicmFyeS4KLTxoMz4gRnVuY3Rpb24gbGlzdCA8L2gzPgotPHVsPgotPGxpPiB1TG9uZyAgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+ICh1TG9uZyA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiwgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pOwotPGxpPiB1TG9uZyAgPGEgaHJlZj0iI2NyYzMyIj5jcmMzMjwvYT4gICAodUxvbmcgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbik7Ci08L3VsPgotPGgzPiBGdW5jdGlvbiBkZXNjcmlwdGlvbiA8L2gzPgotPGRsPgotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gdUxvbmcgIDxhIG5hbWU9ImFkbGVyMzIiPmFkbGVyMzI8L2E+ICh1TG9uZyA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiwgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pOzwvZm9udD4KLTxkZD4KLSAgICAgVXBkYXRlIGEgcnVubmluZyBBZGxlci0zMiBjaGVja3N1bSB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZAotICAgcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCi0gICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgotICAgPHA+Ci0gICBBbiBBZGxlci0zMiBjaGVja3N1bSBpcyBhbG1vc3QgYXMgcmVsaWFibGUgYXMgYSBDUkMzMiBidXQgY2FuIGJlIGNvbXB1dGVkCi0gICBtdWNoIGZhc3Rlci4gVXNhZ2UgZXhhbXBsZToKLSAgIDxwcmU+Ci0KLSAgICAgdUxvbmcgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gPSA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4oMEwsIDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4sIDApOwotCi0gICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gPSA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4oPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4sIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICAgfQotICAgICBpZiAoPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gIT0gb3JpZ2luYWxfYWRsZXIpIGVycm9yKCk7Ci0gICA8L3ByZT4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gdUxvbmcgIDxhIG5hbWU9ImNyYzMyIj5jcmMzMjwvYT4gICAodUxvbmcgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbik7PC9mb250PgotPGRkPgotICAgICBVcGRhdGUgYSBydW5uaW5nIGNyYyB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQKLSAgIGNyYy4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZQotICAgZm9yIHRoZSBjcmMuIFByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nIChvbmUncyBjb21wbGVtZW50KSBpcyBwZXJmb3JtZWQKLSAgIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHNvIGl0IHNob3VsZG4ndCBiZSBkb25lIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSAgIFVzYWdlIGV4YW1wbGU6Ci0gICA8cHJlPgotCi0gICAgIHVMb25nIGNyYyA9IDxhIGhyZWY9IiNjcmMzMiI+Y3JjMzI8L2E+KDBMLCA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+LCAwKTsKLQotICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgewotICAgICAgIGNyYyA9IDxhIGhyZWY9IiNjcmMzMiI+Y3JjMzI8L2E+KGNyYywgYnVmZmVyLCBsZW5ndGgpOwotICAgICB9Ci0gICAgIGlmIChjcmMgIT0gb3JpZ2luYWxfY3JjKSBlcnJvcigpOwotICAgPC9wcmU+Ci08L2RsPgotPGhyPgotPGEgbmFtZT0ic3RydWN0IHpfc3RyZWFtX3MiPjxoMj4gc3RydWN0IHpfc3RyZWFtX3MgPC9oMj4KLTxmb250IGNvbG9yPSJCbHVlIj4KLTxhIG5hbWU9Inpfc3RyZWFtX3MiPgotPHByZT4KLXR5cGVkZWYgc3RydWN0IHpfc3RyZWFtX3MgewotICAgIEJ5dGVmICAgICo8YSBuYW1lPSJuZXh0X2luIj5uZXh0X2luPC9hPjsgIC8qIG5leHQgaW5wdXQgYnl0ZSAqLwotICAgIHVJbnQgICAgIDxhIG5hbWU9ImF2YWlsX2luIj5hdmFpbF9pbjwvYT47ICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiAqLwotICAgIHVMb25nICAgIDxhIG5hbWU9InRvdGFsX2luIj50b3RhbF9pbjwvYT47ICAvKiB0b3RhbCBuYiBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqLwotCi0gICAgQnl0ZWYgICAgKjxhIG5hbWU9Im5leHRfb3V0Ij5uZXh0X291dDwvYT47IC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqLwotICAgIHVJbnQgICAgIDxhIG5hbWU9ImF2YWlsX291dCI+YXZhaWxfb3V0PC9hPjsgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gKi8KLSAgICB1TG9uZyAgICA8YSBuYW1lPSJ0b3RhbF9vdXQiPnRvdGFsX291dDwvYT47IC8qIHRvdGFsIG5iIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi8KLQotICAgIGNoYXIgICAgICo8YSBuYW1lPSJtc2ciPm1zZzwvYT47ICAgICAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCi0gICAgc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqPGEgbmFtZT0ic3RhdGUiPnN0YXRlPC9hPjsgLyogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICovCi0KLSAgICBhbGxvY19mdW5jIDxhIG5hbWU9InphbGxvYyI+emFsbG9jPC9hPjsgIC8qIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+ICovCi0gICAgZnJlZV9mdW5jICA8YSBuYW1lPSJ6ZnJlZSI+emZyZWU8L2E+OyAgIC8qIHVzZWQgdG8gZnJlZSB0aGUgaW50ZXJuYWwgPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gKi8KLSAgICB2b2lkcGYgICAgIDxhIG5hbWU9Im9wYXF1ZSI+b3BhcXVlPC9hPjsgIC8qIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+ICovCi0KLSAgICBpbnQgICAgIDxhIG5hbWU9ImRhdGFfdHlwZSI+ZGF0YV90eXBlPC9hPjsgIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYXNjaWkgb3IgYmluYXJ5ICovCi0gICAgdUxvbmcgICA8YSBuYW1lPSJhZGxlciI+YWRsZXI8L2E+OyAgICAgIC8qIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KLSAgICB1TG9uZyAgIDxhIG5hbWU9InJlc2VydmVkIj5yZXNlcnZlZDwvYT47ICAgLyogPGEgaHJlZj0iI3Jlc2VydmVkIj5yZXNlcnZlZDwvYT4gZm9yIGZ1dHVyZSB1c2UgKi8KLX0gPGEgaHJlZj0iI3pfc3RyZWFtX3MiPnpfc3RyZWFtPC9hPiA7Ci0KLXR5cGVkZWYgPGEgaHJlZj0iI3pfc3RyZWFtX3MiPnpfc3RyZWFtPC9hPiBGQVIgKiA8YSBuYW1lPSJ6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT47ICD/Ci08L3ByZT4KLTwvZm9udD4KLSAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IHdoZW4gPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gaGFzCi0gICBkcm9wcGVkIHRvIHplcm8uIEl0IG11c3QgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IHdoZW4gPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPgotICAgaGFzIGRyb3BwZWQgdG8gemVyby4gVGhlIGFwcGxpY2F0aW9uIG11c3QgaW5pdGlhbGl6ZSA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+LCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBhbmQKLSAgIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gYmVmb3JlIGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24uIEFsbCBvdGhlciBmaWVsZHMgYXJlIHNldCBieSB0aGUKLSAgIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIG11c3Qgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiA8cD4KLQotICAgVGhlIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdAotICAgcGFyYW1ldGVyIGZvciBjYWxscyBvZiA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPi4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjdXN0b20KLSAgIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGUgY29tcHJlc3Npb24gbGlicmFyeSBhdHRhY2hlcyBubyBtZWFuaW5nIHRvIHRoZQotICAgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiB2YWx1ZS4gPHA+Ci0KLSAgIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gbXVzdCByZXR1cm4gPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG9iamVjdC4KLSAgIElmIHpsaWIgaXMgdXNlZCBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uLCA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBtdXN0IGJlCi0gICB0aHJlYWQgc2FmZS4gPHA+Ci0KLSAgIE9uIDE2LWJpdCBzeXN0ZW1zLCB0aGUgZnVuY3Rpb25zIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IG11c3QgYmUgYWJsZSB0byBhbGxvY2F0ZQotICAgZXhhY3RseSA2NTUzNiBieXRlcywgYnV0IHdpbGwgbm90IGJlIHJlcXVpcmVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzCi0gICBpZiB0aGUgc3ltYm9sIE1BWFNFR182NEsgaXMgZGVmaW5lZCAoc2VlIHpjb25mLmgpLiBXQVJOSU5HOiBPbiBNU0RPUywKLSAgIHBvaW50ZXJzIHJldHVybmVkIGJ5IDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gZm9yIG9iamVjdHMgb2YgZXhhY3RseSA2NTUzNiBieXRlcyAqbXVzdCoKLSAgIGhhdmUgdGhlaXIgb2Zmc2V0IG5vcm1hbGl6ZWQgdG8gemVyby4gVGhlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbgotICAgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5IGVuc3VyZXMgdGhpcyAoc2VlIHp1dGlsLmMpLiBUbyByZWR1Y2UgbWVtb3J5Ci0gICByZXF1aXJlbWVudHMgYW5kIGF2b2lkIGFueSBhbGxvY2F0aW9uIG9mIDY0SyBvYmplY3RzLCBhdCB0aGUgZXhwZW5zZSBvZgotICAgY29tcHJlc3Npb24gcmF0aW8sIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCAtRE1BWF9XQklUUz0xNCAoc2VlIHpjb25mLmgpLgotICAgPHA+Ci0KLSAgIFRoZSBmaWVsZHMgPGEgaHJlZj0iI3RvdGFsX2luIj50b3RhbF9pbjwvYT4gYW5kIDxhIGhyZWY9IiN0b3RhbF9vdXQiPnRvdGFsX291dDwvYT4gY2FuIGJlIHVzZWQgZm9yIHN0YXRpc3RpY3Mgb3IKLSAgIHByb2dyZXNzIHJlcG9ydHMuIEFmdGVyIGNvbXByZXNzaW9uLCA8YSBocmVmPSIjdG90YWxfaW4iPnRvdGFsX2luPC9hPiBob2xkcyB0aGUgdG90YWwgc2l6ZSBvZgotICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFuZCBtYXkgYmUgc2F2ZWQgZm9yIHVzZSBpbiB0aGUgZGVjb21wcmVzc29yCi0gICAocGFydGljdWxhcmx5IGlmIHRoZSBkZWNvbXByZXNzb3Igd2FudHMgdG8gZGVjb21wcmVzcyBldmVyeXRoaW5nIGluCi0gICBhIHNpbmdsZSBzdGVwKS4gPHA+Ci0KLTxocj4KLTxhIG5hbWU9IkNvbnN0YW50cyI+PGgyPiBDb25zdGFudHMgPC9oMj4KLTxmb250IGNvbG9yPSJCbHVlIj4KLTxwcmU+Ci0jZGVmaW5lIDxhIG5hbWU9IlpfTk9fRkxVU0giPlpfTk9fRkxVU0g8L2E+ICAgICAgMAotI2RlZmluZSA8YSBuYW1lPSJaX1BBUlRJQUxfRkxVU0giPlpfUEFSVElBTF9GTFVTSDwvYT4gMQotCS8qIHdpbGwgYmUgcmVtb3ZlZCwgdXNlIDxhIGhyZWY9IiNaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4gaW5zdGVhZCAqLwotI2RlZmluZSA8YSBuYW1lPSJaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4gICAgMgotI2RlZmluZSA8YSBuYW1lPSJaX0ZVTExfRkxVU0giPlpfRlVMTF9GTFVTSDwvYT4gICAgMwotI2RlZmluZSA8YSBuYW1lPSJaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+ICAgICAgICA0Ci0vKiBBbGxvd2VkIGZsdXNoIHZhbHVlcyA7IHNlZSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBiZWxvdyBmb3IgZGV0YWlscyAqLwotCi0jZGVmaW5lIDxhIG5hbWU9IlpfT0siPlpfT0s8L2E+ICAgICAgICAgICAgMAotI2RlZmluZSA8YSBuYW1lPSJaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gICAgMQotI2RlZmluZSA8YSBuYW1lPSJaX05FRURfRElDVCI+Wl9ORUVEX0RJQ1Q8L2E+ICAgICAyCi0jZGVmaW5lIDxhIG5hbWU9IlpfRVJSTk8iPlpfRVJSTk88L2E+ICAgICAgICAoLTEpCi0jZGVmaW5lIDxhIG5hbWU9IlpfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gKC0yKQotI2RlZmluZSA8YSBuYW1lPSJaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gICAoLTMpCi0jZGVmaW5lIDxhIG5hbWU9IlpfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gICAgKC00KQotI2RlZmluZSA8YSBuYW1lPSJaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+ICAgICgtNSkKLSNkZWZpbmUgPGEgbmFtZT0iWl9WRVJTSU9OX0VSUk9SIj5aX1ZFUlNJT05fRVJST1I8L2E+ICgtNikKLS8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQotICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KLSAqLwotCi0jZGVmaW5lIDxhIG5hbWU9IlpfTk9fQ09NUFJFU1NJT04iPlpfTk9fQ09NUFJFU1NJT048L2E+ICAgICAgICAgMAotI2RlZmluZSA8YSBuYW1lPSJaX0JFU1RfU1BFRUQiPlpfQkVTVF9TUEVFRDwvYT4gICAgICAgICAgICAgMQotI2RlZmluZSA8YSBuYW1lPSJaX0JFU1RfQ09NUFJFU1NJT04iPlpfQkVTVF9DT01QUkVTU0lPTjwvYT4gICAgICAgOQotI2RlZmluZSA8YSBuYW1lPSJaX0RFRkFVTFRfQ09NUFJFU1NJT04iPlpfREVGQVVMVF9DT01QUkVTU0lPTjwvYT4gICgtMSkKLS8qIGNvbXByZXNzaW9uIGxldmVscyAqLwotCi0jZGVmaW5lIDxhIG5hbWU9IlpfRklMVEVSRUQiPlpfRklMVEVSRUQ8L2E+ICAgICAgICAgICAgMQotI2RlZmluZSA8YSBuYW1lPSJaX0hVRkZNQU5fT05MWSI+Wl9IVUZGTUFOX09OTFk8L2E+ICAgICAgICAyCi0jZGVmaW5lIDxhIG5hbWU9IlpfREVGQVVMVF9TVFJBVEVHWSI+Wl9ERUZBVUxUX1NUUkFURUdZPC9hPiAgICAwCi0vKiBjb21wcmVzc2lvbiBzdHJhdGVneSA7IHNlZSA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+KCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KLQotI2RlZmluZSA8YSBuYW1lPSJaX0JJTkFSWSI+Wl9CSU5BUlk8L2E+ICAgMAotI2RlZmluZSA8YSBuYW1lPSJaX0FTQ0lJIj5aX0FTQ0lJPC9hPiAgICAxCi0jZGVmaW5lIDxhIG5hbWU9IlpfVU5LTk9XTiI+Wl9VTktOT1dOPC9hPiAgMgotLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSA8YSBocmVmPSIjZGF0YV90eXBlIj5kYXRhX3R5cGU8L2E+IGZpZWxkICovCi0KLSNkZWZpbmUgPGEgbmFtZT0iWl9ERUZMQVRFRCI+Wl9ERUZMQVRFRDwvYT4gICA4Ci0vKiBUaGUgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGNvbXByZXNzaW9uIG1ldGhvZCAodGhlIG9ubHkgb25lIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24pICovCi0KLSNkZWZpbmUgPGEgbmFtZT0iWl9OVUxMIj5aX05VTEw8L2E+ICAwICAvKiBmb3IgaW5pdGlhbGl6aW5nIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+LCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+ICovCi0KLSNkZWZpbmUgPGEgbmFtZT0iemxpYl92ZXJzaW9uIj56bGliX3ZlcnNpb248L2E+IDxhIGhyZWY9IiN6bGliVmVyc2lvbiI+emxpYlZlcnNpb248L2E+KCkKLS8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgbGVzcyB0aGFuIDEuMC4yICovCi08L3ByZT4KLTwvZm9udD4KLQotPGhyPgotPGEgbmFtZT0iTWlzYyI+PGgyPiBNaXNjIDwvaDI+Ci0gPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gYW5kIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgotIGFuZCB0aGUgY29tcGlsZXIncyB2aWV3IG9mIDxhIGhyZWY9IiN6X3N0cmVhbV9zIj56X3N0cmVhbTwvYT4uCi0gPHA+Ci0gT3RoZXIgZnVuY3Rpb25zOgotIDxkbD4KLSA8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBjb25zdCBjaGFyICAgKiAgPGEgbmFtZT0iekVycm9yIj56RXJyb3I8L2E+ICAgICAgICAgICAoaW50IGVycik7PC9mb250PgotIDxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgICAgICAgICA8YSBuYW1lPSJpbmZsYXRlU3luY1BvaW50Ij5pbmZsYXRlU3luY1BvaW50PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiB6KTs8L2ZvbnQ+Ci0gPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gY29uc3QgdUxvbmdmICogIDxhIG5hbWU9ImdldF9jcmNfdGFibGUiPmdldF9jcmNfdGFibGU8L2E+ICAgICh2b2lkKTs8L2ZvbnQ+Ci0gPC9kbD4KLSA8aHI+Ci0gPGZvbnQgc2l6ZT0iLTEiPgotIExhc3QgdXBkYXRlOiBXZWQgT2N0IDEzIDIwOjQyOjM0IDE5OTk8YnI+Ci0gcGlhcGlAY3NpZS5udHUuZWR1LnR3Ci0gPC9mb250PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9saWJzL3psaWIvcGF0Y2hlcy9mb28uZ3ogYi9saWJzL3psaWIvcGF0Y2hlcy9mb28uZ3oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZDRhMzcuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL3BhdGNoZXMvZm9vLmd6CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3BhdGNoZXMvemxpYi0xLjIuMi5kaWZmIGIvbGlicy96bGliL3BhdGNoZXMvemxpYi0xLjIuMi5kaWZmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGU0NTZlLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9wYXRjaGVzL3psaWItMS4yLjIuZGlmZgorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi1kaWZmIC1pcHV3ciAteCBjb25maWcubG9nIC14IGNvbmZpZy5zdGF0dXMgLXggY29uZmlnLmNhY2hlIC14ICcqLlBvJyAteCAnKi5wb3QnIC14ICcqLmJhaycgLXggJyoub3JpZycgLXggJyoucmVqJyAteCAnKi5uZXcnIC14ICcqficgLXggJyoubycgLXggJyouZXhlJyAteCBwYXRjaGVzIC14ICcqLmRsbCcgLXgnKi5sYScgLXggcmVzIC14IGRlYmlhbiAteCAnKi5sb2cnIC14ICcqLmxpYicgLXgnKi5hJyAteCAubGlicyAteCcqLmRlZicgLXgnKi51dScgLXgnKi5yYycgemxpYi0xLjIuMi1vcmlnL01ha2VmaWxlIHpsaWItMS4yLjIvTWFrZWZpbGUKLS0tLSB6bGliLTEuMi4yLW9yaWcvTWFrZWZpbGUJMjAwNC0wOS0xNSAxNjoyNzoyMC4wMDAwMDAwMDAgKzAyMDAKLSsrKyB6bGliLTEuMi4yL01ha2VmaWxlCTIwMDUtMDEtMDIgMTM6Mjk6MTEuMTg3NTAwMDAwICswMTAwCi1AQCAtMTYsNDUgKzE2LDgzIEBACi0gIyBUbyBpbnN0YWxsIGluICRIT01FIGluc3RlYWQgb2YgL3Vzci9sb2NhbCwgdXNlOgotICMgICAgbWFrZSBpbnN0YWxsIHByZWZpeD0kSE9NRQotIAotLUNDPWNjCi0rQ0M9Z2NjCi0gCi0gQ0ZMQUdTPS1PCi0gI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NwotICNDRkxBR1M9LWcgLURERUJVRwotICNDRkxBR1M9LU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKLSAjICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCi0rQ0ZMQUdTID0JLU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKLSsgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzIFwKLSsgICAgICAgICAgICAtRF9fR1czMl9fIC1EX0xBUkdFRklMRV9TT1VSQ0U9MSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0U9MSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IFwKLSsgICAgICAgICAgICAtbW1zLWJpdGZpZWxkcyAgLWZuby1leGNlcHRpb25zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1tYXJjaD1pMzg2IC1tY3B1PWk2ODYJIFwKLSsJCQktaWRpcmFmdGVyIGU6L3Byb2dyYX4xL2dudXdpbjMyL2luY2x1ZGUgLWlkaXJhZnRlciBoOi9nbGliYy9pbmNsdWRlCi0gCi0tTERGTEFHUz1saWJ6LmEKLS1MRFNIQVJFRD0kKENDKQotK0xERkxBR1M9LVdsLC1zICQoVkVSU0FERCkKLStMRFNIQVJFRD1vMmRsbAotIENQUD0kKENDKSAtRQotIAotK01BSk9SPTEKLStNSU5PUj0yCi0rQlVJTEQ9MgotK1ZFUlNJT04gPSAkKE1BSk9SKS4kKE1JTk9SKS4kKEJVSUxEKQotK0NVUlJFTlQgPSAzCi0rIyBNQUpPUiArIEJVSUxECi0rUkVWSVNJT04gPSAkKE1JTk9SKQotK0FHRSA9ICQoQlVJTEQpCi0rTFRWRVJTSU9OID0gJChDVVJSRU5UKTokKFJFVklTSU9OKTokKEFHRSkKLStWRVJTQUREID0gLVdsLC0tbWFqb3ItaW1hZ2UtdmVyc2lvbj0kKE1BSk9SKSAtV2wsLS1taW5vci1pbWFnZS12ZXJzaW9uPSQoTUlOT1IpIAotKwotIExJQlM9bGliei5hCi0gU0hBUkVETElCPWxpYnouc28KLSBTSEFSRURMSUJWPWxpYnouc28uMS4yLjIKLSBTSEFSRURMSUJNPWxpYnouc28uMQotK1NUQVRMSUI9bGliei5hCi0rSU1QTElCPWxpYnouZGxsLmEKLStMSUJTPSQoU1RBVExJQikgJChJTVBMSUIpIGxpYnoubGliIGxpYnotYmNjLmxpYgotK1NIQVJFRExJQj16bGliLmRsbAotK1NIQVJFRExJQlY9emxpYjEuZGxsCi0rU0hBUkVETElCTT16bGliMTIxLmRsbAotK0VYVFJBTElCUz0tbGd3MzJjCi0gCi0gQVI9YXIgcmMKLSBSQU5MSUI9cmFubGliCi0gVEFSPXRhcgotIFNIRUxMPS9iaW4vc2gKLS1FWEU9Ci0rRVhFPS5leGUKLSsKLSsuU1VGRklYRVM6Ci0rLlNVRkZJWEVTOiAuYyAucmMgLm8gLmV4ZQotIAotLXByZWZpeCA9IC91c3IvbG9jYWwKLSslLkUgOiAlLmMKLSsJJChDUFApICQoQ0ZMQUdTKSAtbyAkQCAkPAotKyUucGljLm8gOiBDRkxBR1MgKz0gLURaTElCX0RMTAotKyUucGljLm8gOiAlLmMKLSsJJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0rIyBSdWxlIHRvIG1ha2UgY29tcGlsZWQgcmVzb3VyY2UgKFdpbmRvd3MpCi0rLnJjLm86Ci0rCXdpbmRyZXMgLWkgJDwgLW8gJEAKLSsKLStwcmVmaXggPSBjOi9wcm9ncmF+MS9abGliCi0gZXhlY19wcmVmaXggPSAke3ByZWZpeH0KLStiaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKLSBsaWJkaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKLSBpbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKLS1tYW5kaXIgPSAke3ByZWZpeH0vc2hhcmUvbWFuCi0rbWFuZGlyID0gJHtwcmVmaXh9L21hbgotIG1hbjNkaXIgPSAke21hbmRpcn0vbWFuMwotIAotIE9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6aW8ubyB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8gXAotICAgICAgICB6dXRpbC5vIGluZmxhdGUubyBpbmZiYWNrLm8gaW5mdHJlZXMubyBpbmZmYXN0Lm8KLStETExPQkpTID0gJChPQkpTOi5vPS5waWMubykgemxpYi1kbGwtcmVzLm8gemxpYi1kbGx2ZXJzaW9uLm8KLSAKLSBPQkpBID0KLSAjIHRvIHVzZSB0aGUgYXNtIGNvZGU6IG1ha2UgT0JKQT1tYXRjaC5vCi0gCi0gVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KLSAKLS1hbGw6IGV4YW1wbGUkKEVYRSkgbWluaWd6aXAkKEVYRSkKLSthbGw6IGV4YW1wbGUgbWluaWd6aXAgZXhhbXBsZS1zdGF0aWMgbWluaWd6aXAtc3RhdGljCi0rCi0gCi0gY2hlY2s6IHRlc3QKLSB0ZXN0OiBhbGwKLUBAIC02Nyw3ICsxMDUsOSBAQCB0ZXN0OiBhbGwKLSAJICBlY2hvICcJCSoqKiB6bGliIHRlc3QgRkFJTEVEICoqKic7IFwKLSAJZmkKLSAKLS1saWJ6LmE6ICQoT0JKUykgJChPQkpBKQotKyQoSU1QTElCKTogJChTVEFUTElCKSAkKFNIQVJFRExJQlYpCi0rCi0rJChTVEFUTElCKTogJChPQkpTKSAkKE9CSkEpCi0gCSQoQVIpICRAICQoT0JKUykgJChPQkpBKQotIAktQCAoJChSQU5MSUIpICRAIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQotIAotQEAgLTc3LDM1ICsxMTcsNDQgQEAgbWF0Y2gubzogbWF0Y2guUwotIAltdiBfbWF0Y2gubyBtYXRjaC5vCi0gCXJtIC1mIF9tYXRjaC5zCi0gCi0tJChTSEFSRURMSUJWKTogJChPQkpTKQotLQkkKExEU0hBUkVEKSAtbyAkQCAkKE9CSlMpCi0rJChTSEFSRURMSUJWKTogJChETExPQkpTKQotKwkkKExEU0hBUkVEKSAtbyAkKFNIQVJFRExJQikgLWwgJChJTVBMSUIpICQoRExMT0JKUykgJChMREZMQUdTKSAtdmVyc2lvbi1pbmZvICQoTFRWRVJTSU9OKSAkKEVYVFJBTElCUykKLSAJcm0gLWYgJChTSEFSRURMSUIpICQoU0hBUkVETElCTSkKLS0JbG4gLXMgJEAgJChTSEFSRURMSUIpCi0tCWxuIC1zICRAICQoU0hBUkVETElCTSkKLSsjCWxuIC1zICRAICQoU0hBUkVETElCKQotKyMJbG4gLXMgJEAgJChTSEFSRURMSUJNKQotKwotK2V4YW1wbGUtc3RhdGljOiBleGFtcGxlLm8gZXhhbXBsZS1yZXMubyAkKFNUQVRMSUIpCi0rCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBleGFtcGxlLm8gIGV4YW1wbGUtcmVzLm8gJChMREZMQUdTKSBsaWJ6LmEgJChFWFRSQUxJQlMpCi0rCi0rZXhhbXBsZTogZXhhbXBsZS5waWMubyBleGFtcGxlLXJlcy5vICQoSU1QTElCKQotKwkkKENDKSAkKENGTEFHUykgLW8gJEAgZXhhbXBsZS5waWMubyAgZXhhbXBsZS1yZXMubyAkKExERkxBR1MpIGxpYnouZGxsLmEgJChFWFRSQUxJQlMpCi0gCi0tZXhhbXBsZSQoRVhFKTogZXhhbXBsZS5vICQoTElCUykKLS0JJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKExERkxBR1MpCi0rbWluaWd6aXAtc3RhdGljOiBtaW5pZ3ppcC5vIG1pbmlnemlwLXJlcy5vICQoU1RBVExJQikKLSsJJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gIG1pbmlnemlwLXJlcy5vICQoTERGTEFHUykgbGliei5hICQoRVhUUkFMSUJTKQotIAotLW1pbmlnemlwJChFWEUpOiBtaW5pZ3ppcC5vICQoTElCUykKLS0JJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChMREZMQUdTKQotK21pbmlnemlwOiBtaW5pZ3ppcC5waWMubyBtaW5pZ3ppcC1yZXMubyAkKElNUExJQikKLSsJJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLnBpYy5vICBtaW5pZ3ppcC1yZXMubyAkKExERkxBR1MpIGxpYnouZGxsLmEgJChFWFRSQUxJQlMpCi0gCi0gaW5zdGFsbDogJChMSUJTKQotIAktQGlmIFsgISAtZCAkKGV4ZWNfcHJlZml4KSBdOyB0aGVuIG1rZGlyIC1wICQoZXhlY19wcmVmaXgpOyBmaQotIAktQGlmIFsgISAtZCAkKGluY2x1ZGVkaXIpICBdOyB0aGVuIG1rZGlyIC1wICQoaW5jbHVkZWRpcik7IGZpCi0gCS1AaWYgWyAhIC1kICQobGliZGlyKSAgICAgIF07IHRoZW4gbWtkaXIgLXAgJChsaWJkaXIpOyBmaQotKwktQGlmIFsgISAtZCAkKGJpbmRpcikgICAgICBdOyB0aGVuIG1rZGlyIC1wICQoYmluZGlyKTsgZmkKLSAJLUBpZiBbICEgLWQgJChtYW4zZGlyKSAgICAgXTsgdGhlbiBta2RpciAtcCAkKG1hbjNkaXIpOyBmaQotLQljcCB6bGliLmggemNvbmYuaCAkKGluY2x1ZGVkaXIpCi0rCWNwIC1mcCB6bGliLmggemNvbmYuaCAkKGluY2x1ZGVkaXIpCi0gCWNobW9kIDY0NCAkKGluY2x1ZGVkaXIpL3psaWIuaCAkKGluY2x1ZGVkaXIpL3pjb25mLmgKLS0JY3AgJChMSUJTKSAkKGxpYmRpcikKLSsJY3AgLWZwICQoTElCUykgJChsaWJkaXIpCi0gCWNkICQobGliZGlyKTsgY2htb2QgNzU1ICQoTElCUykKLSAJLUAoY2QgJChsaWJkaXIpOyAkKFJBTkxJQikgbGliei5hIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQotLQljZCAkKGxpYmRpcik7IGlmIHRlc3QgLWYgJChTSEFSRURMSUJWKTsgdGhlbiBcCi0rCWNwIC1mcCAkKFNIQVJFRExJQlYpICQoYmluZGlyKQotKwljZCAkKGJpbmRpcik7IGNobW9kIDc1NSAkKFNIQVJFRExJQlYpOyBcCi0rIwlpZiB0ZXN0IC1mICQoU0hBUkVETElCVik7IHRoZW4gXAotIAkgIHJtIC1mICQoU0hBUkVETElCKSAkKFNIQVJFRExJQk0pOyBcCi0gCSAgbG4gLXMgJChTSEFSRURMSUJWKSAkKFNIQVJFRExJQik7IFwKLSAJICBsbiAtcyAkKFNIQVJFRExJQlYpICQoU0hBUkVETElCTSk7IFwKLSAJICAobGRjb25maWcgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXAotIAlmaQotLQljcCB6bGliLjMgJChtYW4zZGlyKQotKwljcCAtZnAgemxpYi4zICQobWFuM2RpcikKLSAJY2htb2QgNjQ0ICQobWFuM2RpcikvemxpYi4zCi0gIyBUaGUgcmFubGliIGluIGluc3RhbGwgaXMgbmVlZGVkIG9uIE5lWFRTVEVQIHdoaWNoIGNoZWNrcyBmaWxlIHRpbWVzCi0gIyBsZGNvbmZpZyBpcyBmb3IgTGludXgKLUBAIC0xMjAsOCArMTY5LDggQEAgdW5pbnN0YWxsOgotIAotIG1vc3RseWNsZWFuOiBjbGVhbgotIGNsZWFuOgotLQlybSAtZiAqLm8gKn4gZXhhbXBsZSQoRVhFKSBtaW5pZ3ppcCQoRVhFKSBcCi0tCSAgIGxpYnouKiBmb28uZ3ogc29fbG9jYXRpb25zIFwKLSsJcm0gLWYgKi5vICoucGljLm8gKn4gZXhhbXBsZSQoRVhFKSBtaW5pZ3ppcCQoRVhFKSBcCi0rCSAgIGxpYnouKiAkKExJQlMpICQoU0hBUkVETElCVikgZm9vLmd6IHNvX2xvY2F0aW9ucyBcCi0gCSAgIF9tYXRjaC5zIG1ha2V0cmVlIGNvbnRyaWIvaW5mYmFjazkvKi5vCi0gCi0gbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi1kaWZmIC1pcHV3ciAteCBjb25maWcubG9nIC14IGNvbmZpZy5zdGF0dXMgLXggY29uZmlnLmNhY2hlIC14ICcqLlBvJyAteCAnKi5wb3QnIC14ICcqLmJhaycgLXggJyoub3JpZycgLXggJyoucmVqJyAteCAnKi5uZXcnIC14ICcqficgLXggJyoubycgLXggJyouZXhlJyAteCBwYXRjaGVzIC14ICcqLmRsbCcgLXgnKi5sYScgLXggcmVzIC14IGRlYmlhbiAteCAnKi5sb2cnIC14ICcqLmxpYicgLXgnKi5hJyAteCAubGlicyAteCcqLmRlZicgLXgnKi51dScgLXgnKi5yYycgemxpYi0xLjIuMi1vcmlnL2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUgemxpYi0xLjIuMi9jb250cmliL2JsYXN0L01ha2VmaWxlCi0tLS0gemxpYi0xLjIuMi1vcmlnL2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUJMjAwMy0wMy0wMyAwNjo0NToyMi4wMDAwMDAwMDAgKzAxMDAKLSsrKyB6bGliLTEuMi4yL2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUJMjAwNC0xMi0yNSAxMTowMDoxNS4zNDM3NTAwMDAgKzAxMDAKLUBAIC0xLDUgKzEsNSBAQAotIGJsYXN0OiBibGFzdC5jIGJsYXN0LmgKLS0JY2MgLURURVNUIC1vIGJsYXN0IGJsYXN0LmMKLSsJZ2NjIC1EVEVTVCAtbyBibGFzdCBibGFzdC5jCi0gCi0gdGVzdDogYmxhc3QKLSAJYmxhc3QgPCB0ZXN0LnBrIHwgY21wIC0gdGVzdC50eHQKLWRpZmYgLWlwdXdyIC14IGNvbmZpZy5sb2cgLXggY29uZmlnLnN0YXR1cyAteCBjb25maWcuY2FjaGUgLXggJyouUG8nIC14ICcqLnBvdCcgLXggJyouYmFrJyAteCAnKi5vcmlnJyAteCAnKi5yZWonIC14ICcqLm5ldycgLXggJyp+JyAteCAnKi5vJyAteCAnKi5leGUnIC14IHBhdGNoZXMgLXggJyouZGxsJyAteCcqLmxhJyAteCByZXMgLXggZGViaWFuIC14ICcqLmxvZycgLXggJyoubGliJyAteCcqLmEnIC14IC5saWJzIC14JyouZGVmJyAteCcqLnV1JyAteCcqLnJjJyB6bGliLTEuMi4yLW9yaWcvY29udHJpYi9taW5pemlwL01ha2VmaWxlIHpsaWItMS4yLjIvY29udHJpYi9taW5pemlwL01ha2VmaWxlCi0tLS0gemxpYi0xLjIuMi1vcmlnL2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZQkyMDAzLTA5LTEwIDIwOjAwOjE2LjAwMDAwMDAwMCArMDIwMAotKysrIHpsaWItMS4yLjIvY29udHJpYi9taW5pemlwL01ha2VmaWxlCTIwMDQtMTItMjUgMTE6MDA6MTUuMzQzNzUwMDAwICswMTAwCi1AQCAtMSw4ICsxLDggQEAKLS1DQz1jYwotK0NDPWdjYwotIENGTEFHUz0tTyAtSS4uLy4uCi0gCi0tVU5aX09CSlMgPSBtaW5pdW56Lm8gdW56aXAubyBpb2FwaS5vIC4uLy4uL2xpYnouYQotLVpJUF9PQkpTID0gbWluaXppcC5vIHppcC5vICAgaW9hcGkubyAuLi8uLi9saWJ6LmEKLStVTlpfT0JKUyA9IG1pbml1bnoubyB1bnppcC5vIGlvd2luMzIubyBpb2FwaS5vIC4uLy4uL2xpYnouYQotK1pJUF9PQkpTID0gbWluaXppcC5vIHppcC5vICAgaW93aW4zMi5vIGlvYXBpLm8gLi4vLi4vbGliei5hCi0gCi0gLmMubzoKLSAJJChDQykgLWMgJChDRkxBR1MpICQqLmMKLWRpZmYgLWlwdXdyIC14IGNvbmZpZy5sb2cgLXggY29uZmlnLnN0YXR1cyAteCBjb25maWcuY2FjaGUgLXggJyouUG8nIC14ICcqLnBvdCcgLXggJyouYmFrJyAteCAnKi5vcmlnJyAteCAnKi5yZWonIC14ICcqLm5ldycgLXggJyp+JyAteCAnKi5vJyAteCAnKi5leGUnIC14IHBhdGNoZXMgLXggJyouZGxsJyAteCcqLmxhJyAteCByZXMgLXggZGViaWFuIC14ICcqLmxvZycgLXggJyoubGliJyAteCcqLmEnIC14IC5saWJzIC14JyouZGVmJyAteCcqLnV1JyAteCcqLnJjJyB6bGliLTEuMi4yLW9yaWcvY29udHJpYi9taW5pemlwL21pbml1bnouYyB6bGliLTEuMi4yL2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMKLS0tLSB6bGliLTEuMi4yLW9yaWcvY29udHJpYi9taW5pemlwL21pbml1bnouYwkyMDA0LTEwLTA0IDA0OjQ1OjA1LjAwMDAwMDAwMCArMDIwMAotKysrIHpsaWItMS4yLjIvY29udHJpYi9taW5pemlwL21pbml1bnouYwkyMDA0LTEyLTI1IDExOjAwOjE1LjM1OTM3NTAwMCArMDEwMAotQEAgLTksNyArOSw2IEBACi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotICNpbmNsdWRlIDxzdHJpbmcuaD4KLS0jaW5jbHVkZSA8dGltZS5oPgotICNpbmNsdWRlIDxlcnJuby5oPgotICNpbmNsdWRlIDxmY250bC5oPgotIAotQEAgLTIwLDYgKzE5LDEwIEBACi0gIyBpbmNsdWRlIDxkaXJlY3QuaD4KLSAjIGluY2x1ZGUgPGlvLmg+Ci0gI2VuZGlmCi0rI2lmZGVmIF9fV0lOMzJfXwotKyNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0rI2VuZGlmCi0rI2luY2x1ZGUgPHRpbWUuaD4KLSAKLSAjaW5jbHVkZSAidW56aXAuaCIKLSAKLWRpZmYgLWlwdXdyIC14IGNvbmZpZy5sb2cgLXggY29uZmlnLnN0YXR1cyAteCBjb25maWcuY2FjaGUgLXggJyouUG8nIC14ICcqLnBvdCcgLXggJyouYmFrJyAteCAnKi5vcmlnJyAteCAnKi5yZWonIC14ICcqLm5ldycgLXggJyp+JyAteCAnKi5vJyAteCAnKi5leGUnIC14IHBhdGNoZXMgLXggJyouZGxsJyAteCcqLmxhJyAteCByZXMgLXggZGViaWFuIC14ICcqLmxvZycgLXggJyoubGliJyAteCcqLmEnIC14IC5saWJzIC14JyouZGVmJyAteCcqLnV1JyAteCcqLnJjJyB6bGliLTEuMi4yLW9yaWcvY29udHJpYi9taW5pemlwL21pbml6aXAuYyB6bGliLTEuMi4yL2NvbnRyaWIvbWluaXppcC9taW5pemlwLmMKLS0tLSB6bGliLTEuMi4yLW9yaWcvY29udHJpYi9taW5pemlwL21pbml6aXAuYwkyMDA0LTA1LTMxIDAxOjI0OjMyLjAwMDAwMDAwMCArMDIwMAotKysrIHpsaWItMS4yLjIvY29udHJpYi9taW5pemlwL21pbml6aXAuYwkyMDA0LTEyLTI1IDExOjAwOjE1LjM1OTM3NTAwMCArMDEwMAotQEAgLTgsNyArOCw2IEBACi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotICNpbmNsdWRlIDxzdHJpbmcuaD4KLS0jaW5jbHVkZSA8dGltZS5oPgotICNpbmNsdWRlIDxlcnJuby5oPgotICNpbmNsdWRlIDxmY250bC5oPgotIAotQEAgLTIxLDYgKzIwLDEwIEBACi0gIyBpbmNsdWRlIDxkaXJlY3QuaD4KLSAjIGluY2x1ZGUgPGlvLmg+Ci0gI2VuZGlmCi0rI2lmZGVmIF9fV0lOMzJfXwotKyNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0rI2VuZGlmCi0rI2luY2x1ZGUgPHRpbWUuaD4KLSAKLSAjaW5jbHVkZSAiemlwLmgiCi0gCi1kaWZmIC1pcHV3ciAteCBjb25maWcubG9nIC14IGNvbmZpZy5zdGF0dXMgLXggY29uZmlnLmNhY2hlIC14ICcqLlBvJyAteCAnKi5wb3QnIC14ICcqLmJhaycgLXggJyoub3JpZycgLXggJyoucmVqJyAteCAnKi5uZXcnIC14ICcqficgLXggJyoubycgLXggJyouZXhlJyAteCBwYXRjaGVzIC14ICcqLmRsbCcgLXgnKi5sYScgLXggcmVzIC14IGRlYmlhbiAteCAnKi5sb2cnIC14ICcqLmxpYicgLXgnKi5hJyAteCAubGlicyAteCcqLmRlZicgLXgnKi51dScgLXgnKi5yYycgemxpYi0xLjIuMi1vcmlnL2NvbnRyaWIvbWluaXppcC96aXAuYyB6bGliLTEuMi4yL2NvbnRyaWIvbWluaXppcC96aXAuYwotLS0tIHpsaWItMS4yLjItb3JpZy9jb250cmliL21pbml6aXAvemlwLmMJMjAwNC0wOS0yMiAxNjozNjo1MC4wMDAwMDAwMDAgKzAyMDAKLSsrKyB6bGliLTEuMi4yL2NvbnRyaWIvbWluaXppcC96aXAuYwkyMDA0LTEyLTI1IDExOjAwOjE1LjM3NTAwMDAwMCArMDEwMAotQEAgLTEzLDYgKzEzLDcgQEAKLSAjaW5jbHVkZSA8dGltZS5oPgotICNpbmNsdWRlICJ6bGliLmgiCi0gI2luY2x1ZGUgInppcC5oIgotKyNpbmNsdWRlICJ6dXRpbC5oIgotIAotICNpZmRlZiBTVERDCi0gIyAgaW5jbHVkZSA8c3RkZGVmLmg+Ci1kaWZmIC1pcHV3ciAteCBjb25maWcubG9nIC14IGNvbmZpZy5zdGF0dXMgLXggY29uZmlnLmNhY2hlIC14ICcqLlBvJyAteCAnKi5wb3QnIC14ICcqLmJhaycgLXggJyoub3JpZycgLXggJyoucmVqJyAteCAnKi5uZXcnIC14ICcqficgLXggJyoubycgLXggJyouZXhlJyAteCBwYXRjaGVzIC14ICcqLmRsbCcgLXgnKi5sYScgLXggcmVzIC14IGRlYmlhbiAteCAnKi5sb2cnIC14ICcqLmxpYicgLXgnKi5hJyAteCAubGlicyAteCcqLmRlZicgLXgnKi51dScgLXgnKi5yYycgemxpYi0xLjIuMi1vcmlnL2NvbnRyaWIvdW50Z3ovdW50Z3ouYyB6bGliLTEuMi4yL2NvbnRyaWIvdW50Z3ovdW50Z3ouYwotLS0tIHpsaWItMS4yLjItb3JpZy9jb250cmliL3VudGd6L3VudGd6LmMJMjAwNC0wMy0wNyAwNzowMDowMC4wMDAwMDAwMDAgKzAxMDAKLSsrKyB6bGliLTEuMi4yL2NvbnRyaWIvdW50Z3ovdW50Z3ouYwkyMDA0LTEyLTI1IDExOjAwOjE1LjM3NTAwMDAwMCArMDEwMAotQEAgLTksNyArOSw2IEBACi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotICNpbmNsdWRlIDxzdHJpbmcuaD4KLS0jaW5jbHVkZSA8dGltZS5oPgotICNpbmNsdWRlIDxlcnJuby5oPgotIAotICNpbmNsdWRlICJ6bGliLmgiCi1AQCAtMzIsOSArMzEsMTEgQEAKLSAjICAgIGRlZmluZSBjaG1vZChwYXRoLG1vZGUpICAgIF9jaG1vZChwYXRoLG1vZGUpCi0gIyAgICBkZWZpbmUgc3RyZHVwKHN0cikgICAgICAgICBfc3RyZHVwKHN0cikKLSAjICBlbmRpZgotKyNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0gI2Vsc2UKLSAjICBpbmNsdWRlIDx1dGltZS5oPgotICNlbmRpZgotKyNpbmNsdWRlIDx0aW1lLmg+Ci0gCi0gCi0gLyogdmFsdWVzIHVzZWQgaW4gdHlwZWZsYWcgZmllbGQgKi8KLWRpZmYgLWlwdXdyIC14IGNvbmZpZy5sb2cgLXggY29uZmlnLnN0YXR1cyAteCBjb25maWcuY2FjaGUgLXggJyouUG8nIC14ICcqLnBvdCcgLXggJyouYmFrJyAteCAnKi5vcmlnJyAteCAnKi5yZWonIC14ICcqLm5ldycgLXggJyp+JyAteCAnKi5vJyAteCAnKi5leGUnIC14IHBhdGNoZXMgLXggJyouZGxsJyAteCcqLmxhJyAteCByZXMgLXggZGViaWFuIC14ICcqLmxvZycgLXggJyoubGliJyAteCcqLmEnIC14IC5saWJzIC14JyouZGVmJyAteCcqLnV1JyAteCcqLnJjJyB6bGliLTEuMi4yLW9yaWcvZ3ppby5jIHpsaWItMS4yLjIvZ3ppby5jCi0tLS0gemxpYi0xLjIuMi1vcmlnL2d6aW8uYwkyMDA0LTEwLTA0IDA0OjMwOjM3LjAwMDAwMDAwMCArMDIwMAotKysrIHpsaWItMS4yLjIvZ3ppby5jCTIwMDQtMTItMjUgMTE6MDA6MTUuMzkwNjI1MDAwICswMTAwCi1AQCAtODgxLDcgKzg4MSw3IEBAIGludCBaRVhQT1JUIGd6cmV3aW5kIChmaWxlKQotIHpfb2ZmX3QgWkVYUE9SVCBnenRlbGwgKGZpbGUpCi0gICAgIGd6RmlsZSBmaWxlOwotIHsKLS0gICAgcmV0dXJuIGd6c2VlayhmaWxlLCAwTCwgU0VFS19DVVIpOwotKyAgICByZXR1cm4gZ3pzZWVrKGZpbGUsIDBMTCwgU0VFS19DVVIpOwotIH0KLSAKLSAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRpZmYgLWlwdXdyIC14IGNvbmZpZy5sb2cgLXggY29uZmlnLnN0YXR1cyAteCBjb25maWcuY2FjaGUgLXggJyouUG8nIC14ICcqLnBvdCcgLXggJyouYmFrJyAteCAnKi5vcmlnJyAteCAnKi5yZWonIC14ICcqLm5ldycgLXggJyp+JyAteCAnKi5vJyAteCAnKi5leGUnIC14IHBhdGNoZXMgLXggJyouZGxsJyAteCcqLmxhJyAteCByZXMgLXggZGViaWFuIC14ICcqLmxvZycgLXggJyoubGliJyAteCcqLmEnIC14IC5saWJzIC14JyouZGVmJyAteCcqLnV1JyAteCcqLnJjJyB6bGliLTEuMi4yLW9yaWcvemNvbmYuaCB6bGliLTEuMi4yL3pjb25mLmgKLS0tLSB6bGliLTEuMi4yLW9yaWcvemNvbmYuaAkyMDA0LTA1LTMwIDIyOjM4OjAwLjAwMDAwMDAwMCArMDIwMAotKysrIHpsaWItMS4yLjIvemNvbmYuaAkyMDA0LTEyLTI1IDExOjAwOjE1LjM5MDYyNTAwMCArMDEwMAotQEAgLTI3OCw3ICsyNzgsNyBAQCB0eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7Ci0gICAgdHlwZWRlZiBCeXRlICAgICAgICp2b2lkcDsKLSAjZW5kaWYKLSAKLS0jaWYgMCAgICAgICAgICAgLyogSEFWRV9VTklTVERfSCAtLSB0aGlzIGxpbmUgaXMgdXBkYXRlZCBieSAuL2NvbmZpZ3VyZSAqLwotKyNpZiAxICAgICAgICAgICAvKiBIQVZFX1VOSVNURF9IIC0tIHRoaXMgbGluZSBpcyB1cGRhdGVkIGJ5IC4vY29uZmlndXJlICovCi0gIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBvZmZfdCAqLwotICMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAvKiBmb3IgU0VFS18qIGFuZCBvZmZfdCAqLwotICMgIGlmZGVmIFZNUwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3BhdGNoZXMvemxpYi0xLjIuMi5kaWZmLmxvZyBiL2xpYnMvemxpYi9wYXRjaGVzL3psaWItMS4yLjIuZGlmZi5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZmFiYmIuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL3BhdGNoZXMvemxpYi0xLjIuMi5kaWZmLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLUhtbS4uLiAgTG9va3MgbGlrZSBhIHVuaWZpZWQgZGlmZiB0byBtZS4uLgotVGhlIHRleHQgbGVhZGluZyB1cCB0byB0aGlzIHdhczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18ZGlmZiAtaXB1d3IgLXggY29uZmlnLmxvZyAteCBjb25maWcuc3RhdHVzIC14IGNvbmZpZy5jYWNoZSAteCAnKi5QbycgLXggJyoucG90JyAteCAnKi5iYWsnIC14ICcqLm9yaWcnIC14ICcqLnJlaicgLXggJyoubmV3JyAteCAnKn4nIC14ICcqLm8nIC14ICcqLmV4ZScgLXggcGF0Y2hlcyAteCAnKi5kbGwnIC14JyoubGEnIC14IHJlcyAteCBkZWJpYW4gLXggJyoubG9nJyAteCAnKi5saWInIC14JyouYScgLXggLmxpYnMgLXgnKi5kZWYnIC14JyoudXUnIC14JyoucmMnIHpsaWItMS4yLjItb3JpZy9NYWtlZmlsZSB6bGliLTEuMi4yL01ha2VmaWxlCi18LS0tIHpsaWItMS4yLjItb3JpZy9NYWtlZmlsZQkyMDA0LTA5LTE1IDE2OjI3OjIwLjAwMDAwMDAwMCArMDIwMAotfCsrKyB6bGliLTEuMi4yL01ha2VmaWxlCTIwMDUtMDEtMDIgMTM6Mjk6MTEuMTg3NTAwMDAwICswMTAwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotUGF0Y2hpbmcgZmlsZSBNYWtlZmlsZSB1c2luZyBQbGFuIEEuLi4KLUh1bmsgIzEgRkFJTEVEIGF0IDE2LgotSHVuayAjMiBzdWNjZWVkZWQgYXQgMTA1LgotSHVuayAjMyBzdWNjZWVkZWQgYXQgMTE3LgotSHVuayAjNCBzdWNjZWVkZWQgYXQgMTY5LgotTm90IHNldHRpbmcgdGltZSBvZiBmaWxlIE1ha2VmaWxlICh0aW1lIG1pc21hdGNoKQotMSBvdXQgb2YgNCBodW5rcyBGQUlMRUQgLS0gc2F2aW5nIHJlamVjdHMgdG8gZmlsZSBNYWtlZmlsZS5yZWoKLUhtbS4uLiAgVGhlIG5leHQgcGF0Y2ggbG9va3MgbGlrZSBhIHVuaWZpZWQgZGlmZiB0byBtZS4uLgotVGhlIHRleHQgbGVhZGluZyB1cCB0byB0aGlzIHdhczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18ZGlmZiAtaXB1d3IgLXggY29uZmlnLmxvZyAteCBjb25maWcuc3RhdHVzIC14IGNvbmZpZy5jYWNoZSAteCAnKi5QbycgLXggJyoucG90JyAteCAnKi5iYWsnIC14ICcqLm9yaWcnIC14ICcqLnJlaicgLXggJyoubmV3JyAteCAnKn4nIC14ICcqLm8nIC14ICcqLmV4ZScgLXggcGF0Y2hlcyAteCAnKi5kbGwnIC14JyoubGEnIC14IHJlcyAteCBkZWJpYW4gLXggJyoubG9nJyAteCAnKi5saWInIC14JyouYScgLXggLmxpYnMgLXgnKi5kZWYnIC14JyoudXUnIC14JyoucmMnIHpsaWItMS4yLjItb3JpZy9jb250cmliL2JsYXN0L01ha2VmaWxlIHpsaWItMS4yLjIvY29udHJpYi9ibGFzdC9NYWtlZmlsZQotfC0tLSB6bGliLTEuMi4yLW9yaWcvY29udHJpYi9ibGFzdC9NYWtlZmlsZQkyMDAzLTAzLTAzIDA2OjQ1OjIyLjAwMDAwMDAwMCArMDEwMAotfCsrKyB6bGliLTEuMi4yL2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUJMjAwNC0xMi0yNSAxMTowMDoxNS4zNDM3NTAwMDAgKzAxMDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QYXRjaGluZyBmaWxlIGNvbnRyaWIvYmxhc3QvTWFrZWZpbGUgdXNpbmcgUGxhbiBBLi4uCi1IdW5rICMxIHN1Y2NlZWRlZCBhdCAxLgotSG1tLi4uICBUaGUgbmV4dCBwYXRjaCBsb29rcyBsaWtlIGEgdW5pZmllZCBkaWZmIHRvIG1lLi4uCi1UaGUgdGV4dCBsZWFkaW5nIHVwIHRvIHRoaXMgd2FzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXxkaWZmIC1pcHV3ciAteCBjb25maWcubG9nIC14IGNvbmZpZy5zdGF0dXMgLXggY29uZmlnLmNhY2hlIC14ICcqLlBvJyAteCAnKi5wb3QnIC14ICcqLmJhaycgLXggJyoub3JpZycgLXggJyoucmVqJyAteCAnKi5uZXcnIC14ICcqficgLXggJyoubycgLXggJyouZXhlJyAteCBwYXRjaGVzIC14ICcqLmRsbCcgLXgnKi5sYScgLXggcmVzIC14IGRlYmlhbiAteCAnKi5sb2cnIC14ICcqLmxpYicgLXgnKi5hJyAteCAubGlicyAteCcqLmRlZicgLXgnKi51dScgLXgnKi5yYycgemxpYi0xLjIuMi1vcmlnL2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZSB6bGliLTEuMi4yL2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZQotfC0tLSB6bGliLTEuMi4yLW9yaWcvY29udHJpYi9taW5pemlwL01ha2VmaWxlCTIwMDMtMDktMTAgMjA6MDA6MTYuMDAwMDAwMDAwICswMjAwCi18KysrIHpsaWItMS4yLjIvY29udHJpYi9taW5pemlwL01ha2VmaWxlCTIwMDQtMTItMjUgMTE6MDA6MTUuMzQzNzUwMDAwICswMTAwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotUGF0Y2hpbmcgZmlsZSBjb250cmliL21pbml6aXAvTWFrZWZpbGUgdXNpbmcgUGxhbiBBLi4uCi1IdW5rICMxIHN1Y2NlZWRlZCBhdCAxLgotTm90IHNldHRpbmcgdGltZSBvZiBmaWxlIGNvbnRyaWIvbWluaXppcC9NYWtlZmlsZSAodGltZSBtaXNtYXRjaCkKLUhtbS4uLiAgVGhlIG5leHQgcGF0Y2ggbG9va3MgbGlrZSBhIHVuaWZpZWQgZGlmZiB0byBtZS4uLgotVGhlIHRleHQgbGVhZGluZyB1cCB0byB0aGlzIHdhczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18ZGlmZiAtaXB1d3IgLXggY29uZmlnLmxvZyAteCBjb25maWcuc3RhdHVzIC14IGNvbmZpZy5jYWNoZSAteCAnKi5QbycgLXggJyoucG90JyAteCAnKi5iYWsnIC14ICcqLm9yaWcnIC14ICcqLnJlaicgLXggJyoubmV3JyAteCAnKn4nIC14ICcqLm8nIC14ICcqLmV4ZScgLXggcGF0Y2hlcyAteCAnKi5kbGwnIC14JyoubGEnIC14IHJlcyAteCBkZWJpYW4gLXggJyoubG9nJyAteCAnKi5saWInIC14JyouYScgLXggLmxpYnMgLXgnKi5kZWYnIC14JyoudXUnIC14JyoucmMnIHpsaWItMS4yLjItb3JpZy9jb250cmliL21pbml6aXAvbWluaXVuei5jIHpsaWItMS4yLjIvY29udHJpYi9taW5pemlwL21pbml1bnouYwotfC0tLSB6bGliLTEuMi4yLW9yaWcvY29udHJpYi9taW5pemlwL21pbml1bnouYwkyMDA0LTEwLTA0IDA0OjQ1OjA1LjAwMDAwMDAwMCArMDIwMAotfCsrKyB6bGliLTEuMi4yL2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMJMjAwNC0xMi0yNSAxMTowMDoxNS4zNTkzNzUwMDAgKzAxMDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QYXRjaGluZyBmaWxlIGNvbnRyaWIvbWluaXppcC9taW5pdW56LmMgdXNpbmcgUGxhbiBBLi4uCi1IdW5rICMxIHN1Y2NlZWRlZCBhdCA5LgotSHVuayAjMiBzdWNjZWVkZWQgYXQgMTkuCi1Ob3Qgc2V0dGluZyB0aW1lIG9mIGZpbGUgY29udHJpYi9taW5pemlwL21pbml1bnouYyAodGltZSBtaXNtYXRjaCkKLUhtbS4uLiAgVGhlIG5leHQgcGF0Y2ggbG9va3MgbGlrZSBhIHVuaWZpZWQgZGlmZiB0byBtZS4uLgotVGhlIHRleHQgbGVhZGluZyB1cCB0byB0aGlzIHdhczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18ZGlmZiAtaXB1d3IgLXggY29uZmlnLmxvZyAteCBjb25maWcuc3RhdHVzIC14IGNvbmZpZy5jYWNoZSAteCAnKi5QbycgLXggJyoucG90JyAteCAnKi5iYWsnIC14ICcqLm9yaWcnIC14ICcqLnJlaicgLXggJyoubmV3JyAteCAnKn4nIC14ICcqLm8nIC14ICcqLmV4ZScgLXggcGF0Y2hlcyAteCAnKi5kbGwnIC14JyoubGEnIC14IHJlcyAteCBkZWJpYW4gLXggJyoubG9nJyAteCAnKi5saWInIC14JyouYScgLXggLmxpYnMgLXgnKi5kZWYnIC14JyoudXUnIC14JyoucmMnIHpsaWItMS4yLjItb3JpZy9jb250cmliL21pbml6aXAvbWluaXppcC5jIHpsaWItMS4yLjIvY29udHJpYi9taW5pemlwL21pbml6aXAuYwotfC0tLSB6bGliLTEuMi4yLW9yaWcvY29udHJpYi9taW5pemlwL21pbml6aXAuYwkyMDA0LTA1LTMxIDAxOjI0OjMyLjAwMDAwMDAwMCArMDIwMAotfCsrKyB6bGliLTEuMi4yL2NvbnRyaWIvbWluaXppcC9taW5pemlwLmMJMjAwNC0xMi0yNSAxMTowMDoxNS4zNTkzNzUwMDAgKzAxMDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QYXRjaGluZyBmaWxlIGNvbnRyaWIvbWluaXppcC9taW5pemlwLmMgdXNpbmcgUGxhbiBBLi4uCi1IdW5rICMxIHN1Y2NlZWRlZCBhdCA4LgotSHVuayAjMiBzdWNjZWVkZWQgYXQgMjAuCi1Ob3Qgc2V0dGluZyB0aW1lIG9mIGZpbGUgY29udHJpYi9taW5pemlwL21pbml6aXAuYyAodGltZSBtaXNtYXRjaCkKLUhtbS4uLiAgVGhlIG5leHQgcGF0Y2ggbG9va3MgbGlrZSBhIHVuaWZpZWQgZGlmZiB0byBtZS4uLgotVGhlIHRleHQgbGVhZGluZyB1cCB0byB0aGlzIHdhczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18ZGlmZiAtaXB1d3IgLXggY29uZmlnLmxvZyAteCBjb25maWcuc3RhdHVzIC14IGNvbmZpZy5jYWNoZSAteCAnKi5QbycgLXggJyoucG90JyAteCAnKi5iYWsnIC14ICcqLm9yaWcnIC14ICcqLnJlaicgLXggJyoubmV3JyAteCAnKn4nIC14ICcqLm8nIC14ICcqLmV4ZScgLXggcGF0Y2hlcyAteCAnKi5kbGwnIC14JyoubGEnIC14IHJlcyAteCBkZWJpYW4gLXggJyoubG9nJyAteCAnKi5saWInIC14JyouYScgLXggLmxpYnMgLXgnKi5kZWYnIC14JyoudXUnIC14JyoucmMnIHpsaWItMS4yLjItb3JpZy9jb250cmliL21pbml6aXAvemlwLmMgemxpYi0xLjIuMi9jb250cmliL21pbml6aXAvemlwLmMKLXwtLS0gemxpYi0xLjIuMi1vcmlnL2NvbnRyaWIvbWluaXppcC96aXAuYwkyMDA0LTA5LTIyIDE2OjM2OjUwLjAwMDAwMDAwMCArMDIwMAotfCsrKyB6bGliLTEuMi4yL2NvbnRyaWIvbWluaXppcC96aXAuYwkyMDA0LTEyLTI1IDExOjAwOjE1LjM3NTAwMDAwMCArMDEwMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVBhdGNoaW5nIGZpbGUgY29udHJpYi9taW5pemlwL3ppcC5jIHVzaW5nIFBsYW4gQS4uLgotSHVuayAjMSBzdWNjZWVkZWQgYXQgMTYgKG9mZnNldCAzIGxpbmVzKS4KLU5vdCBzZXR0aW5nIHRpbWUgb2YgZmlsZSBjb250cmliL21pbml6aXAvemlwLmMgKHRpbWUgbWlzbWF0Y2gpCi1IbW0uLi4gIFRoZSBuZXh0IHBhdGNoIGxvb2tzIGxpa2UgYSB1bmlmaWVkIGRpZmYgdG8gbWUuLi4KLVRoZSB0ZXh0IGxlYWRpbmcgdXAgdG8gdGhpcyB3YXM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfGRpZmYgLWlwdXdyIC14IGNvbmZpZy5sb2cgLXggY29uZmlnLnN0YXR1cyAteCBjb25maWcuY2FjaGUgLXggJyouUG8nIC14ICcqLnBvdCcgLXggJyouYmFrJyAteCAnKi5vcmlnJyAteCAnKi5yZWonIC14ICcqLm5ldycgLXggJyp+JyAteCAnKi5vJyAteCAnKi5leGUnIC14IHBhdGNoZXMgLXggJyouZGxsJyAteCcqLmxhJyAteCByZXMgLXggZGViaWFuIC14ICcqLmxvZycgLXggJyoubGliJyAteCcqLmEnIC14IC5saWJzIC14JyouZGVmJyAteCcqLnV1JyAteCcqLnJjJyB6bGliLTEuMi4yLW9yaWcvY29udHJpYi91bnRnei91bnRnei5jIHpsaWItMS4yLjIvY29udHJpYi91bnRnei91bnRnei5jCi18LS0tIHpsaWItMS4yLjItb3JpZy9jb250cmliL3VudGd6L3VudGd6LmMJMjAwNC0wMy0wNyAwNzowMDowMC4wMDAwMDAwMDAgKzAxMDAKLXwrKysgemxpYi0xLjIuMi9jb250cmliL3VudGd6L3VudGd6LmMJMjAwNC0xMi0yNSAxMTowMDoxNS4zNzUwMDAwMDAgKzAxMDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QYXRjaGluZyBmaWxlIGNvbnRyaWIvdW50Z3ovdW50Z3ouYyB1c2luZyBQbGFuIEEuLi4KLUh1bmsgIzEgc3VjY2VlZGVkIGF0IDkuCi1IdW5rICMyIHN1Y2NlZWRlZCBhdCAzMS4KLUhtbS4uLiAgVGhlIG5leHQgcGF0Y2ggbG9va3MgbGlrZSBhIHVuaWZpZWQgZGlmZiB0byBtZS4uLgotVGhlIHRleHQgbGVhZGluZyB1cCB0byB0aGlzIHdhczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18ZGlmZiAtaXB1d3IgLXggY29uZmlnLmxvZyAteCBjb25maWcuc3RhdHVzIC14IGNvbmZpZy5jYWNoZSAteCAnKi5QbycgLXggJyoucG90JyAteCAnKi5iYWsnIC14ICcqLm9yaWcnIC14ICcqLnJlaicgLXggJyoubmV3JyAteCAnKn4nIC14ICcqLm8nIC14ICcqLmV4ZScgLXggcGF0Y2hlcyAteCAnKi5kbGwnIC14JyoubGEnIC14IHJlcyAteCBkZWJpYW4gLXggJyoubG9nJyAteCAnKi5saWInIC14JyouYScgLXggLmxpYnMgLXgnKi5kZWYnIC14JyoudXUnIC14JyoucmMnIHpsaWItMS4yLjItb3JpZy9nemlvLmMgemxpYi0xLjIuMi9nemlvLmMKLXwtLS0gemxpYi0xLjIuMi1vcmlnL2d6aW8uYwkyMDA0LTEwLTA0IDA0OjMwOjM3LjAwMDAwMDAwMCArMDIwMAotfCsrKyB6bGliLTEuMi4yL2d6aW8uYwkyMDA0LTEyLTI1IDExOjAwOjE1LjM5MDYyNTAwMCArMDEwMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVBhdGNoaW5nIGZpbGUgZ3ppby5jIHVzaW5nIFBsYW4gQS4uLgotSHVuayAjMSBzdWNjZWVkZWQgYXQgODgxLgotTm90IHNldHRpbmcgdGltZSBvZiBmaWxlIGd6aW8uYyAodGltZSBtaXNtYXRjaCkKLUhtbS4uLiAgVGhlIG5leHQgcGF0Y2ggbG9va3MgbGlrZSBhIHVuaWZpZWQgZGlmZiB0byBtZS4uLgotVGhlIHRleHQgbGVhZGluZyB1cCB0byB0aGlzIHdhczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18ZGlmZiAtaXB1d3IgLXggY29uZmlnLmxvZyAteCBjb25maWcuc3RhdHVzIC14IGNvbmZpZy5jYWNoZSAteCAnKi5QbycgLXggJyoucG90JyAteCAnKi5iYWsnIC14ICcqLm9yaWcnIC14ICcqLnJlaicgLXggJyoubmV3JyAteCAnKn4nIC14ICcqLm8nIC14ICcqLmV4ZScgLXggcGF0Y2hlcyAteCAnKi5kbGwnIC14JyoubGEnIC14IHJlcyAteCBkZWJpYW4gLXggJyoubG9nJyAteCAnKi5saWInIC14JyouYScgLXggLmxpYnMgLXgnKi5kZWYnIC14JyoudXUnIC14JyoucmMnIHpsaWItMS4yLjItb3JpZy96Y29uZi5oIHpsaWItMS4yLjIvemNvbmYuaAotfC0tLSB6bGliLTEuMi4yLW9yaWcvemNvbmYuaAkyMDA0LTA1LTMwIDIyOjM4OjAwLjAwMDAwMDAwMCArMDIwMAotfCsrKyB6bGliLTEuMi4yL3pjb25mLmgJMjAwNC0xMi0yNSAxMTowMDoxNS4zOTA2MjUwMDAgKzAxMDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QYXRjaGluZyBmaWxlIHpjb25mLmggdXNpbmcgUGxhbiBBLi4uCi1IdW5rICMxIHN1Y2NlZWRlZCBhdCAyODQgKG9mZnNldCA2IGxpbmVzKS4KLU5vdCBzZXR0aW5nIHRpbWUgb2YgZmlsZSB6Y29uZi5oICh0aW1lIG1pc21hdGNoKQotZG9uZQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3BhdGNoZXMvemxpYi0xLjIuMy5kaWZmIGIvbGlicy96bGliL3BhdGNoZXMvemxpYi0xLjIuMy5kaWZmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2RhNmEwLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9wYXRjaGVzL3psaWItMS4yLjMuZGlmZgorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi1kaWZmIC1pcHV3ciAteCBjb25maWcubG9nIC14IGNvbmZpZy5zdGF0dXMgLXggY29uZmlnLmNhY2hlIC14ICcqLlBvJyAteCAnKi5wb3QnIC14ICcqLmJhaycgLXggJyoub3JpZycgLXggJyoucmVqJyAteCAnKi5uZXcnIC14ICcqficgLXggJyoubycgLXggJyouZXhlJyAteCBwYXRjaGVzIC14ICcqLmRsbCcgLXgnKi5sYScgLXggcmVzIC14IGRlYmlhbiAteCAnKi5sb2cnIC14ICcqLmxpYicgLXgnKi5hJyAteCAubGlicyAteCcqLmRlZicgLXgnKi51dScgLXgnKi5yYycgemxpYi0xLjIuMy1vcmlnL01ha2VmaWxlIHpsaWItMS4yLjMvTWFrZWZpbGUKLS0tLSB6bGliLTEuMi4zLW9yaWcvTWFrZWZpbGUJMjAwNS0wNy0xOCAwNDoyNToyMS4wMDAwMDAwMDAgKzAyMDAKLSsrKyB6bGliLTEuMi4zL01ha2VmaWxlCTIwMDUtMDctMjAgMTc6NTI6MjguNDUzMTI1MDAwICswMjAwCi1AQCAtMTYsNDUgKzE2LDgxIEBACi0gIyBUbyBpbnN0YWxsIGluICRIT01FIGluc3RlYWQgb2YgL3Vzci9sb2NhbCwgdXNlOgotICMgICAgbWFrZSBpbnN0YWxsIHByZWZpeD0kSE9NRQotIAotLUNDPWNjCi0rQ0M9Z2NjCi0gCi0gQ0ZMQUdTPS1PCi0gI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NwotICNDRkxBR1M9LWcgLURERUJVRwotICNDRkxBR1M9LU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKLSAjICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCi0rQ0ZMQUdTID0gLU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKLSsgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzIFwKLSsgICAgICAgICAgICAtRF9fR1czMl9fIC1EX0xBUkdFRklMRV9TT1VSQ0U9MSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0U9MSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IFwKLSsgICAgICAgICAgICAtbW1zLWJpdGZpZWxkcyAgLWZuby1leGNlcHRpb25zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1tYXJjaD1pMzg2IC1tY3B1PWk2ODYgIFwKLSsgICAtaWRpcmFmdGVyIGU6L3Byb2dyYX4xL2dudXdpbjMyL2luY2x1ZGUgLWlkaXJhZnRlciBoOi9nbGliYy9pbmNsdWRlCi0gCi0tTERGTEFHUz1saWJ6LmEKLS1MRFNIQVJFRD0kKENDKQotK0xERkxBR1M9LVdsLC1zICQoVkVSU0FERCkKLStMRFNIQVJFRD1vMmRsbAotIENQUD0kKENDKSAtRQotIAotK01BSk9SPTEKLStNSU5PUj0yCi0rQlVJTEQ9MwotK1ZFUlNJT04gPSAkKE1BSk9SKS4kKE1JTk9SKS4kKEJVSUxEKQotK0NVUlJFTlQgPSA0IyBNQUpPUiArIEJVSUxECi0rUkVWSVNJT04gPSAkKE1JTk9SKQotK0FHRSA9ICQoQlVJTEQpCi0rTFRWRVJTSU9OID0gJChDVVJSRU5UKTokKFJFVklTSU9OKTokKEFHRSkKLStWRVJTQUREID0gLVdsLC0tbWFqb3ItaW1hZ2UtdmVyc2lvbj0kKE1BSk9SKSAtV2wsLS1taW5vci1pbWFnZS12ZXJzaW9uPSQoTUlOT1IpIAotKwotIExJQlM9bGliei5hCi0gU0hBUkVETElCPWxpYnouc28KLSBTSEFSRURMSUJWPWxpYnouc28uMS4yLjMKLSBTSEFSRURMSUJNPWxpYnouc28uMQotK1NUQVRMSUI9bGliei5hCi0rSU1QTElCPWxpYnouZGxsLmEKLStMSUJTPSQoU1RBVExJQikgJChJTVBMSUIpIHpsaWIubGliIHpsaWItYmNjLmxpYgotK1NIQVJFRExJQj16bGliLmRsbAotK1NIQVJFRExJQlY9emxpYjEuZGxsCi0rU0hBUkVETElCTT16bGliMTIxLmRsbAotK0VYVFJBTElCUz0tTGU6L3Byb2dyYX4xL2dudXdpbjMyL2xpYiAtbGd3MzJjCi0gCi0gQVI9YXIgcmMKLSBSQU5MSUI9cmFubGliCi0gVEFSPXRhcgotIFNIRUxMPS9iaW4vc2gKLS1FWEU9Ci0rRVhFPS5leGUKLSsKLSsuU1VGRklYRVM6Ci0rLlNVRkZJWEVTOiAuYyAucmMgLm8gLmV4ZQotKwotKyUuRSA6ICUuYwotKwkkKENQUCkgJChDRkxBR1MpIC1vICRAICQ8Ci0rJS5waWMubyA6IENGTEFHUyArPSAtRFpMSUJfRExMCi0rJS5waWMubyA6ICUuYwotKwkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLSsjIFJ1bGUgdG8gbWFrZSBjb21waWxlZCByZXNvdXJjZSAoV2luZG93cykKLSsucmMubzoKLSsJd2luZHJlcyAtaSAkPCAtbyAkQAotIAotLXByZWZpeCA9IC91c3IvbG9jYWwKLStwcmVmaXggPSBjOi9wcm9ncmF+MS9abGliCi0gZXhlY19wcmVmaXggPSAke3ByZWZpeH0KLStiaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKLSBsaWJkaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKLSBpbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKLS1tYW5kaXIgPSAke3ByZWZpeH0vc2hhcmUvbWFuCi0rbWFuZGlyID0gJHtwcmVmaXh9L21hbgotIG1hbjNkaXIgPSAke21hbmRpcn0vbWFuMwotIAotIE9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6aW8ubyB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8gXAotICAgICAgICB6dXRpbC5vIGluZmxhdGUubyBpbmZiYWNrLm8gaW5mdHJlZXMubyBpbmZmYXN0Lm8KLStETExPQkpTID0gJChPQkpTOi5vPS5waWMubykgemxpYi1kbGwtcmVzLm8gemxpYi1kbGx2ZXJzaW9uLm8KLSAKLSBPQkpBID0KLSAjIHRvIHVzZSB0aGUgYXNtIGNvZGU6IG1ha2UgT0JKQT1tYXRjaC5vCi0gCi0gVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KLSAKLS1hbGw6IGV4YW1wbGUkKEVYRSkgbWluaWd6aXAkKEVYRSkKLSthbGw6IGV4YW1wbGUgbWluaWd6aXAgZXhhbXBsZS1zdGF0aWMgbWluaWd6aXAtc3RhdGljCi0gCi0gY2hlY2s6IHRlc3QKLSB0ZXN0OiBhbGwKLUBAIC02Nyw3ICsxMDMsOSBAQCB0ZXN0OiBhbGwKLSAJICBlY2hvICcJCSoqKiB6bGliIHRlc3QgRkFJTEVEICoqKic7IFwKLSAJZmkKLSAKLS1saWJ6LmE6ICQoT0JKUykgJChPQkpBKQotKyQoSU1QTElCKTogJChTVEFUTElCKSAkKFNIQVJFRExJQlYpCi0rCi0rJChTVEFUTElCKTogJChPQkpTKSAkKE9CSkEpCi0gCSQoQVIpICRAICQoT0JKUykgJChPQkpBKQotIAktQCAoJChSQU5MSUIpICRAIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQotIAotQEAgLTc3LDM1ICsxMTUsNDUgQEAgbWF0Y2gubzogbWF0Y2guUwotIAltdiBfbWF0Y2gubyBtYXRjaC5vCi0gCXJtIC1mIF9tYXRjaC5zCi0gCi0tJChTSEFSRURMSUJWKTogJChPQkpTKQotLQkkKExEU0hBUkVEKSAtbyAkQCAkKE9CSlMpCi0rJChTSEFSRURMSUJWKTogJChETExPQkpTKQotKwllY2hvICQoTERTSEFSRUQpIC1vICQoU0hBUkVETElCKSAtbCAkKElNUExJQikgJChETExPQkpTKSAkKExERkxBR1MpIC12ZXJzaW9uLWluZm8gJChMVFZFUlNJT04pICQoRVhUUkFMSUJTKQotKwkkKExEU0hBUkVEKSAtbyAkKFNIQVJFRExJQikgLWwgJChJTVBMSUIpICQoRExMT0JKUykgJChMREZMQUdTKSAtdmVyc2lvbi1pbmZvICQoTFRWRVJTSU9OKSAkKEVYVFJBTElCUykKLSAJcm0gLWYgJChTSEFSRURMSUIpICQoU0hBUkVETElCTSkKLS0JbG4gLXMgJEAgJChTSEFSRURMSUIpCi0tCWxuIC1zICRAICQoU0hBUkVETElCTSkKLSsjCWxuIC1zICRAICQoU0hBUkVETElCKQotKyMJbG4gLXMgJEAgJChTSEFSRURMSUJNKQotKwotK2V4YW1wbGUtc3RhdGljOiBleGFtcGxlLm8gZXhhbXBsZS1yZXMubyAkKFNUQVRMSUIpCi0rCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBleGFtcGxlLm8gIGV4YW1wbGUtcmVzLm8gJChMREZMQUdTKSBsaWJ6LmEgJChFWFRSQUxJQlMpCi0rCi0rZXhhbXBsZTogZXhhbXBsZS5waWMubyBleGFtcGxlLXJlcy5vICQoSU1QTElCKQotKwkkKENDKSAkKENGTEFHUykgLW8gJEAgZXhhbXBsZS5waWMubyAgZXhhbXBsZS1yZXMubyAkKExERkxBR1MpIGxpYnouZGxsLmEgJChFWFRSQUxJQlMpCi0gCi0tZXhhbXBsZSQoRVhFKTogZXhhbXBsZS5vICQoTElCUykKLS0JJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKExERkxBR1MpCi0rbWluaWd6aXAtc3RhdGljOiBtaW5pZ3ppcC5vIG1pbmlnemlwLXJlcy5vICQoU1RBVExJQikKLSsJJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gIG1pbmlnemlwLXJlcy5vICQoTERGTEFHUykgbGliei5hICQoRVhUUkFMSUJTKQotIAotLW1pbmlnemlwJChFWEUpOiBtaW5pZ3ppcC5vICQoTElCUykKLS0JJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChMREZMQUdTKQotK21pbmlnemlwOiBtaW5pZ3ppcC5waWMubyBtaW5pZ3ppcC1yZXMubyAkKElNUExJQikKLSsJJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLnBpYy5vICBtaW5pZ3ppcC1yZXMubyAkKExERkxBR1MpIGxpYnouZGxsLmEgJChFWFRSQUxJQlMpCi0gCi0gaW5zdGFsbDogJChMSUJTKQotIAktQGlmIFsgISAtZCAkKGV4ZWNfcHJlZml4KSBdOyB0aGVuIG1rZGlyIC1wICQoZXhlY19wcmVmaXgpOyBmaQotIAktQGlmIFsgISAtZCAkKGluY2x1ZGVkaXIpICBdOyB0aGVuIG1rZGlyIC1wICQoaW5jbHVkZWRpcik7IGZpCi0gCS1AaWYgWyAhIC1kICQobGliZGlyKSAgICAgIF07IHRoZW4gbWtkaXIgLXAgJChsaWJkaXIpOyBmaQotKwktQGlmIFsgISAtZCAkKGJpbmRpcikgICAgICBdOyB0aGVuIG1rZGlyIC1wICQoYmluZGlyKTsgZmkKLSAJLUBpZiBbICEgLWQgJChtYW4zZGlyKSAgICAgXTsgdGhlbiBta2RpciAtcCAkKG1hbjNkaXIpOyBmaQotLQljcCB6bGliLmggemNvbmYuaCAkKGluY2x1ZGVkaXIpCi0rCWNwIC1mcCB6bGliLmggemNvbmYuaCAkKGluY2x1ZGVkaXIpCi0gCWNobW9kIDY0NCAkKGluY2x1ZGVkaXIpL3psaWIuaCAkKGluY2x1ZGVkaXIpL3pjb25mLmgKLS0JY3AgJChMSUJTKSAkKGxpYmRpcikKLSsJY3AgLWZwICQoTElCUykgJChsaWJkaXIpCi0gCWNkICQobGliZGlyKTsgY2htb2QgNzU1ICQoTElCUykKLSAJLUAoY2QgJChsaWJkaXIpOyAkKFJBTkxJQikgbGliei5hIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQotLQljZCAkKGxpYmRpcik7IGlmIHRlc3QgLWYgJChTSEFSRURMSUJWKTsgdGhlbiBcCi0rCWNwIC1mcCAkKFNIQVJFRExJQlYpICQoYmluZGlyKQotKwljZCAkKGJpbmRpcik7IGNobW9kIDc1NSAkKFNIQVJFRExJQlYpOyBcCi0rIwlpZiB0ZXN0IC1mICQoU0hBUkVETElCVik7IHRoZW4gXAotIAkgIHJtIC1mICQoU0hBUkVETElCKSAkKFNIQVJFRExJQk0pOyBcCi0gCSAgbG4gLXMgJChTSEFSRURMSUJWKSAkKFNIQVJFRExJQik7IFwKLSAJICBsbiAtcyAkKFNIQVJFRExJQlYpICQoU0hBUkVETElCTSk7IFwKLSAJICAobGRjb25maWcgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXAotIAlmaQotLQljcCB6bGliLjMgJChtYW4zZGlyKQotKwljcCAtZnAgemxpYi4zICQobWFuM2RpcikKLSAJY2htb2QgNjQ0ICQobWFuM2RpcikvemxpYi4zCi0gIyBUaGUgcmFubGliIGluIGluc3RhbGwgaXMgbmVlZGVkIG9uIE5lWFRTVEVQIHdoaWNoIGNoZWNrcyBmaWxlIHRpbWVzCi0gIyBsZGNvbmZpZyBpcyBmb3IgTGludXgKLUBAIC0xMjAsOCArMTY4LDggQEAgdW5pbnN0YWxsOgotIAotIG1vc3RseWNsZWFuOiBjbGVhbgotIGNsZWFuOgotLQlybSAtZiAqLm8gKn4gZXhhbXBsZSQoRVhFKSBtaW5pZ3ppcCQoRVhFKSBcCi0tCSAgIGxpYnouKiBmb28uZ3ogc29fbG9jYXRpb25zIFwKLSsJcm0gLWYgKi5vICoucGljLm8gKn4gZXhhbXBsZSQoRVhFKSBtaW5pZ3ppcCQoRVhFKSBcCi0rCSAgIGxpYnouKiAkKExJQlMpICQoU0hBUkVETElCVikgZm9vLmd6IHNvX2xvY2F0aW9ucyBcCi0gCSAgIF9tYXRjaC5zIG1ha2V0cmVlIGNvbnRyaWIvaW5mYmFjazkvKi5vCi0gCi0gbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi1kaWZmIC1pcHV3ciAteCBjb25maWcubG9nIC14IGNvbmZpZy5zdGF0dXMgLXggY29uZmlnLmNhY2hlIC14ICcqLlBvJyAteCAnKi5wb3QnIC14ICcqLmJhaycgLXggJyoub3JpZycgLXggJyoucmVqJyAteCAnKi5uZXcnIC14ICcqficgLXggJyoubycgLXggJyouZXhlJyAteCBwYXRjaGVzIC14ICcqLmRsbCcgLXgnKi5sYScgLXggcmVzIC14IGRlYmlhbiAteCAnKi5sb2cnIC14ICcqLmxpYicgLXgnKi5hJyAteCAubGlicyAteCcqLmRlZicgLXgnKi51dScgLXgnKi5yYycgemxpYi0xLjIuMy1vcmlnL2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUgemxpYi0xLjIuMy9jb250cmliL2JsYXN0L01ha2VmaWxlCi0tLS0gemxpYi0xLjIuMy1vcmlnL2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUJMjAwMy0wMy0wMyAwNjo0NToyMi4wMDAwMDAwMDAgKzAxMDAKLSsrKyB6bGliLTEuMi4zL2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUJMjAwNC0xMi0yNSAxMTowMDoxNS4wMDAwMDAwMDAgKzAxMDAKLUBAIC0xLDUgKzEsNSBAQAotIGJsYXN0OiBibGFzdC5jIGJsYXN0LmgKLS0JY2MgLURURVNUIC1vIGJsYXN0IGJsYXN0LmMKLSsJZ2NjIC1EVEVTVCAtbyBibGFzdCBibGFzdC5jCi0gCi0gdGVzdDogYmxhc3QKLSAJYmxhc3QgPCB0ZXN0LnBrIHwgY21wIC0gdGVzdC50eHQKLWRpZmYgLWlwdXdyIC14IGNvbmZpZy5sb2cgLXggY29uZmlnLnN0YXR1cyAteCBjb25maWcuY2FjaGUgLXggJyouUG8nIC14ICcqLnBvdCcgLXggJyouYmFrJyAteCAnKi5vcmlnJyAteCAnKi5yZWonIC14ICcqLm5ldycgLXggJyp+JyAteCAnKi5vJyAteCAnKi5leGUnIC14IHBhdGNoZXMgLXggJyouZGxsJyAteCcqLmxhJyAteCByZXMgLXggZGViaWFuIC14ICcqLmxvZycgLXggJyoubGliJyAteCcqLmEnIC14IC5saWJzIC14JyouZGVmJyAteCcqLnV1JyAteCcqLnJjJyB6bGliLTEuMi4zLW9yaWcvY29udHJpYi9taW5pemlwL01ha2VmaWxlIHpsaWItMS4yLjMvY29udHJpYi9taW5pemlwL01ha2VmaWxlCi0tLS0gemxpYi0xLjIuMy1vcmlnL2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZQkyMDA1LTA3LTEyIDIwOjA4OjQwLjAwMDAwMDAwMCArMDIwMAotKysrIHpsaWItMS4yLjMvY29udHJpYi9taW5pemlwL01ha2VmaWxlCTIwMDUtMDctMjAgMTc6NDA6MjYuMDkzNzUwMDAwICswMjAwCi1AQCAtMSw4ICsxLDggQEAKLS1DQz1jYwotK0NDPWdjYwotIENGTEFHUz0tTyAtSS4uLy4uCi0gCi0tVU5aX09CSlMgPSBtaW5pdW56Lm8gdW56aXAubyBpb2FwaS5vIC4uLy4uL2xpYnouYQotLVpJUF9PQkpTID0gbWluaXppcC5vIHppcC5vICAgaW9hcGkubyAuLi8uLi9saWJ6LmEKLStVTlpfT0JKUyA9IG1pbml1bnoubyB1bnppcC5vIGlvd2luMzIubyBpb2FwaS5vIC4uLy4uL2xpYnouYQotK1pJUF9PQkpTID0gbWluaXppcC5vIHppcC5vICAgaW93aW4zMi5vIGlvYXBpLm8gLi4vLi4vbGliei5hCi0gCi0gLmMubzoKLSAJJChDQykgLWMgJChDRkxBR1MpICQqLmMKLWRpZmYgLWlwdXdyIC14IGNvbmZpZy5sb2cgLXggY29uZmlnLnN0YXR1cyAteCBjb25maWcuY2FjaGUgLXggJyouUG8nIC14ICcqLnBvdCcgLXggJyouYmFrJyAteCAnKi5vcmlnJyAteCAnKi5yZWonIC14ICcqLm5ldycgLXggJyp+JyAteCAnKi5vJyAteCAnKi5leGUnIC14IHBhdGNoZXMgLXggJyouZGxsJyAteCcqLmxhJyAteCByZXMgLXggZGViaWFuIC14ICcqLmxvZycgLXggJyoubGliJyAteCcqLmEnIC14IC5saWJzIC14JyouZGVmJyAteCcqLnV1JyAteCcqLnJjJyB6bGliLTEuMi4zLW9yaWcvY29udHJpYi9taW5pemlwL21pbml1bnouYyB6bGliLTEuMi4zL2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMKLS0tLSB6bGliLTEuMi4zLW9yaWcvY29udHJpYi9taW5pemlwL21pbml1bnouYwkyMDA1LTA3LTEyIDIwOjA4OjQwLjAwMDAwMDAwMCArMDIwMAotKysrIHpsaWItMS4yLjMvY29udHJpYi9taW5pemlwL21pbml1bnouYwkyMDA1LTA3LTIwIDE3OjQwOjI2LjA5Mzc1MDAwMCArMDIwMAotQEAgLTksNyArOSw2IEBACi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotICNpbmNsdWRlIDxzdHJpbmcuaD4KLS0jaW5jbHVkZSA8dGltZS5oPgotICNpbmNsdWRlIDxlcnJuby5oPgotICNpbmNsdWRlIDxmY250bC5oPgotIAotQEAgLTIwLDYgKzE5LDEwIEBACi0gIyBpbmNsdWRlIDxkaXJlY3QuaD4KLSAjIGluY2x1ZGUgPGlvLmg+Ci0gI2VuZGlmCi0rI2lmZGVmIF9fV0lOMzJfXwotKyNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0rI2VuZGlmCi0rI2luY2x1ZGUgPHRpbWUuaD4KLSAKLSAjaW5jbHVkZSAidW56aXAuaCIKLSAKLWRpZmYgLWlwdXdyIC14IGNvbmZpZy5sb2cgLXggY29uZmlnLnN0YXR1cyAteCBjb25maWcuY2FjaGUgLXggJyouUG8nIC14ICcqLnBvdCcgLXggJyouYmFrJyAteCAnKi5vcmlnJyAteCAnKi5yZWonIC14ICcqLm5ldycgLXggJyp+JyAteCAnKi5vJyAteCAnKi5leGUnIC14IHBhdGNoZXMgLXggJyouZGxsJyAteCcqLmxhJyAteCByZXMgLXggZGViaWFuIC14ICcqLmxvZycgLXggJyoubGliJyAteCcqLmEnIC14IC5saWJzIC14JyouZGVmJyAteCcqLnV1JyAteCcqLnJjJyB6bGliLTEuMi4zLW9yaWcvY29udHJpYi9taW5pemlwL21pbml6aXAuYyB6bGliLTEuMi4zL2NvbnRyaWIvbWluaXppcC9taW5pemlwLmMKLS0tLSB6bGliLTEuMi4zLW9yaWcvY29udHJpYi9taW5pemlwL21pbml6aXAuYwkyMDA1LTA3LTEyIDIwOjA4OjQwLjAwMDAwMDAwMCArMDIwMAotKysrIHpsaWItMS4yLjMvY29udHJpYi9taW5pemlwL21pbml6aXAuYwkyMDA1LTA3LTIwIDE3OjQwOjI2LjEwOTM3NTAwMCArMDIwMAotQEAgLTgsNyArOCw2IEBACi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotICNpbmNsdWRlIDxzdHJpbmcuaD4KLS0jaW5jbHVkZSA8dGltZS5oPgotICNpbmNsdWRlIDxlcnJuby5oPgotICNpbmNsdWRlIDxmY250bC5oPgotIAotQEAgLTIxLDYgKzIwLDEwIEBACi0gIyBpbmNsdWRlIDxkaXJlY3QuaD4KLSAjIGluY2x1ZGUgPGlvLmg+Ci0gI2VuZGlmCi0rI2lmZGVmIF9fV0lOMzJfXwotKyNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0rI2VuZGlmCi0rI2luY2x1ZGUgPHRpbWUuaD4KLSAKLSAjaW5jbHVkZSAiemlwLmgiCi0gCi1kaWZmIC1pcHV3ciAteCBjb25maWcubG9nIC14IGNvbmZpZy5zdGF0dXMgLXggY29uZmlnLmNhY2hlIC14ICcqLlBvJyAteCAnKi5wb3QnIC14ICcqLmJhaycgLXggJyoub3JpZycgLXggJyoucmVqJyAteCAnKi5uZXcnIC14ICcqficgLXggJyoubycgLXggJyouZXhlJyAteCBwYXRjaGVzIC14ICcqLmRsbCcgLXgnKi5sYScgLXggcmVzIC14IGRlYmlhbiAteCAnKi5sb2cnIC14ICcqLmxpYicgLXgnKi5hJyAteCAubGlicyAteCcqLmRlZicgLXgnKi51dScgLXgnKi5yYycgemxpYi0xLjIuMy1vcmlnL2NvbnRyaWIvbWluaXppcC96aXAuYyB6bGliLTEuMi4zL2NvbnRyaWIvbWluaXppcC96aXAuYwotLS0tIHpsaWItMS4yLjMtb3JpZy9jb250cmliL21pbml6aXAvemlwLmMJMjAwNS0wNy0xMiAyMDowODo0MC4wMDAwMDAwMDAgKzAyMDAKLSsrKyB6bGliLTEuMi4zL2NvbnRyaWIvbWluaXppcC96aXAuYwkyMDA1LTA3LTIwIDE3OjQwOjI2LjEwOTM3NTAwMCArMDIwMAotQEAgLTE2LDYgKzE2LDcgQEAKLSAjaW5jbHVkZSA8dGltZS5oPgotICNpbmNsdWRlICJ6bGliLmgiCi0gI2luY2x1ZGUgInppcC5oIgotKyNpbmNsdWRlICJ6dXRpbC5oIgotIAotICNpZmRlZiBTVERDCi0gIyAgaW5jbHVkZSA8c3RkZGVmLmg+Ci1kaWZmIC1pcHV3ciAteCBjb25maWcubG9nIC14IGNvbmZpZy5zdGF0dXMgLXggY29uZmlnLmNhY2hlIC14ICcqLlBvJyAteCAnKi5wb3QnIC14ICcqLmJhaycgLXggJyoub3JpZycgLXggJyoucmVqJyAteCAnKi5uZXcnIC14ICcqficgLXggJyoubycgLXggJyouZXhlJyAteCBwYXRjaGVzIC14ICcqLmRsbCcgLXgnKi5sYScgLXggcmVzIC14IGRlYmlhbiAteCAnKi5sb2cnIC14ICcqLmxpYicgLXgnKi5hJyAteCAubGlicyAteCcqLmRlZicgLXgnKi51dScgLXgnKi5yYycgemxpYi0xLjIuMy1vcmlnL2NvbnRyaWIvdW50Z3ovdW50Z3ouYyB6bGliLTEuMi4zL2NvbnRyaWIvdW50Z3ovdW50Z3ouYwotLS0tIHpsaWItMS4yLjMtb3JpZy9jb250cmliL3VudGd6L3VudGd6LmMJMjAwNC0wMy0wNyAwNzowMDowMC4wMDAwMDAwMDAgKzAxMDAKLSsrKyB6bGliLTEuMi4zL2NvbnRyaWIvdW50Z3ovdW50Z3ouYwkyMDA0LTEyLTI1IDExOjAwOjE1LjAwMDAwMDAwMCArMDEwMAotQEAgLTksNyArOSw2IEBACi0gI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gI2luY2x1ZGUgPHN0ZGxpYi5oPgotICNpbmNsdWRlIDxzdHJpbmcuaD4KLS0jaW5jbHVkZSA8dGltZS5oPgotICNpbmNsdWRlIDxlcnJuby5oPgotIAotICNpbmNsdWRlICJ6bGliLmgiCi1AQCAtMzIsOSArMzEsMTEgQEAKLSAjICAgIGRlZmluZSBjaG1vZChwYXRoLG1vZGUpICAgIF9jaG1vZChwYXRoLG1vZGUpCi0gIyAgICBkZWZpbmUgc3RyZHVwKHN0cikgICAgICAgICBfc3RyZHVwKHN0cikKLSAjICBlbmRpZgotKyNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0gI2Vsc2UKLSAjICBpbmNsdWRlIDx1dGltZS5oPgotICNlbmRpZgotKyNpbmNsdWRlIDx0aW1lLmg+Ci0gCi0gCi0gLyogdmFsdWVzIHVzZWQgaW4gdHlwZWZsYWcgZmllbGQgKi8KLWRpZmYgLWlwdXdyIC14IGNvbmZpZy5sb2cgLXggY29uZmlnLnN0YXR1cyAteCBjb25maWcuY2FjaGUgLXggJyouUG8nIC14ICcqLnBvdCcgLXggJyouYmFrJyAteCAnKi5vcmlnJyAteCAnKi5yZWonIC14ICcqLm5ldycgLXggJyp+JyAteCAnKi5vJyAteCAnKi5leGUnIC14IHBhdGNoZXMgLXggJyouZGxsJyAteCcqLmxhJyAteCByZXMgLXggZGViaWFuIC14ICcqLmxvZycgLXggJyoubGliJyAteCcqLmEnIC14IC5saWJzIC14JyouZGVmJyAteCcqLnV1JyAteCcqLnJjJyB6bGliLTEuMi4zLW9yaWcvZ3ppby5jIHpsaWItMS4yLjMvZ3ppby5jCi0tLS0gemxpYi0xLjIuMy1vcmlnL2d6aW8uYwkyMDA1LTA3LTExIDIyOjMxOjQ4LjAwMDAwMDAwMCArMDIwMAotKysrIHpsaWItMS4yLjMvZ3ppby5jCTIwMDUtMDctMjAgMTc6NDA6MjYuMTI1MDAwMDAwICswMjAwCi1AQCAtODgxLDcgKzg4MSw3IEBAIGludCBaRVhQT1JUIGd6cmV3aW5kIChmaWxlKQotIHpfb2ZmX3QgWkVYUE9SVCBnenRlbGwgKGZpbGUpCi0gICAgIGd6RmlsZSBmaWxlOwotIHsKLS0gICAgcmV0dXJuIGd6c2VlayhmaWxlLCAwTCwgU0VFS19DVVIpOwotKyAgICByZXR1cm4gZ3pzZWVrKGZpbGUsIDBMTCwgU0VFS19DVVIpOwotIH0KLSAKLSAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRpZmYgLWlwdXdyIC14IGNvbmZpZy5sb2cgLXggY29uZmlnLnN0YXR1cyAteCBjb25maWcuY2FjaGUgLXggJyouUG8nIC14ICcqLnBvdCcgLXggJyouYmFrJyAteCAnKi5vcmlnJyAteCAnKi5yZWonIC14ICcqLm5ldycgLXggJyp+JyAteCAnKi5vJyAteCAnKi5leGUnIC14IHBhdGNoZXMgLXggJyouZGxsJyAteCcqLmxhJyAteCByZXMgLXggZGViaWFuIC14ICcqLmxvZycgLXggJyoubGliJyAteCcqLmEnIC14IC5saWJzIC14JyouZGVmJyAteCcqLnV1JyAteCcqLnJjJyB6bGliLTEuMi4zLW9yaWcvemNvbmYuaCB6bGliLTEuMi4zL3pjb25mLmgKLS0tLSB6bGliLTEuMi4zLW9yaWcvemNvbmYuaAkyMDA1LTA1LTI4IDA4OjQwOjM1LjAwMDAwMDAwMCArMDIwMAotKysrIHpsaWItMS4yLjMvemNvbmYuaAkyMDA1LTA3LTIwIDE3OjQwOjI2LjEyNTAwMDAwMCArMDIwMAotQEAgLTI4NCw3ICsyODQsNyBAQCB0eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7Ci0gICAgdHlwZWRlZiBCeXRlICAgICAgICp2b2lkcDsKLSAjZW5kaWYKLSAKLS0jaWYgMCAgICAgICAgICAgLyogSEFWRV9VTklTVERfSCAtLSB0aGlzIGxpbmUgaXMgdXBkYXRlZCBieSAuL2NvbmZpZ3VyZSAqLwotKyNpZiAxICAgICAgICAgICAvKiBIQVZFX1VOSVNURF9IIC0tIHRoaXMgbGluZSBpcyB1cGRhdGVkIGJ5IC4vY29uZmlndXJlICovCi0gIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBvZmZfdCAqLwotICMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAvKiBmb3IgU0VFS18qIGFuZCBvZmZfdCAqLwotICMgIGlmZGVmIFZNUwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3BhdGNoZXMvemxpYi1kbGx2ZXJzaW9uLmMgYi9saWJzL3psaWIvcGF0Y2hlcy96bGliLWRsbHZlcnNpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiNTllOS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvcGF0Y2hlcy96bGliLWRsbHZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIFNlZTogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL3NoZWxsY2MvcGxhdGZvcm0vc2hlbGwvcHJvZ3JhbW1lcnNndWlkZS92ZXJzaW9ucy5hc3AgKi8KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8c2hsd2FwaS5oPgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotLyogX19kZWNsc3BlYyhkbGxleHBvcnQpICovIEhSRVNVTFQgRGxsR2V0VmVyc2lvbiAoRExMVkVSU0lPTklORk8yICpwZHZpKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLUhSRVNVTFQgRGxsR2V0VmVyc2lvbiAoRExMVkVSU0lPTklORk8yICpwZHZpKQotewotCWlmICggIXBkdmkgfHwgKHBkdmktPmluZm8xLmNiU2l6ZSAhPSBzaXplb2YgKCpwZHZpKSkgKQotCQlyZXR1cm4gKEVfSU5WQUxJREFSRyk7Ci0JcGR2aS0+aW5mbzEuZHdNYWpvclZlcnNpb24gPSAxOwotCXBkdmktPmluZm8xLmR3TWlub3JWZXJzaW9uID0gMjsKLQlwZHZpLT5pbmZvMS5kd0J1aWxkTnVtYmVyID0gMzsKLQlwZHZpLT5pbmZvMS5kd1BsYXRmb3JtSUQgPSBETExWRVJfUExBVEZPUk1fV0lORE9XUzsKLQlpZiAocGR2aS0+aW5mbzEuY2JTaXplID09IHNpemVvZiAoRExMVkVSU0lPTklORk8yKSkKLQkJcGR2aS0+dWxsVmVyc2lvbiA9IE1BS0VETExWRVJVTEwgKDEsIDIsIDMsIDIwMjcpOwotCXJldHVybiBTX09LOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3BhdGNoZXMvemxpYi1sdHZlcnNpb24gYi9saWJzL3psaWIvcGF0Y2hlcy96bGliLWx0dmVyc2lvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkOTI5Ny4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvcGF0Y2hlcy96bGliLWx0dmVyc2lvbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTQ6MjozCmRpZmYgLS1naXQgYS9saWJzL3psaWIvcGF0Y2hlcy96bGliLmljbyBiL2xpYnMvemxpYi9wYXRjaGVzL3psaWIuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjVlNGM5Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9wYXRjaGVzL3psaWIuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3Byb2plY3RzL1JFQURNRS5wcm9qZWN0cyBiL2xpYnMvemxpYi9wcm9qZWN0cy9SRUFETUUucHJvamVjdHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMDI5ZTQuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL3Byb2plY3RzL1JFQURNRS5wcm9qZWN0cworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHByb2plY3QgZmlsZXMgZm9yIGJ1aWxkaW5nIHpsaWIgdW5kZXIgdmFyaW91cwotSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudHMgKElERSkuCi0KLUlmIHlvdSB3aXNoIHRvIHN1Ym1pdCBhIG5ldyBwcm9qZWN0IHRvIHRoaXMgZGlyZWN0b3J5LCB5b3Ugc2hvdWxkIGNvbXBseQotdG8gdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMuICBPdGhlcndpc2UgKGUuZy4gaWYgeW91IHdpc2ggdG8gaW50ZWdyYXRlCi1hIGN1c3RvbSBwaWVjZSBvZiBjb2RlIHRoYXQgY2hhbmdlcyB0aGUgemxpYiBpbnRlcmZhY2Ugb3IgaXRzIGJlaGF2aW9yKSwKLXBsZWFzZSBjb25zaWRlciBzdWJtaXR0aW5nIHRoZSBwcm9qZWN0IHRvIHRoZSBjb250cmliIGRpcmVjdG9yeS4KLQotCi1SZXF1aXJlbWVudHMKLT09PT09PT09PT09PQotCi0tIFRoZSBwcm9qZWN0IG11c3QgYnVpbGQgemxpYiB1c2luZyB0aGUgc291cmNlIGZpbGVzIGZyb20gdGhlIG9mZmljaWFsCi0gIHpsaWIgc291cmNlIGRpc3RyaWJ1dGlvbiwgZXhjbHVzaXZlbHkuCi0KLS0gSWYgdGhlIHByb2plY3QgcHJvZHVjZXMgcmVkaXN0cmlidXRhYmxlIGJ1aWxkcyAoZS5nLiBzaGFyZWQgb2JqZWN0cwotICBvciBETEwgZmlsZXMpLCB0aGVzZSBidWlsZHMgbXVzdCBiZSBjb21wYXRpYmxlIHRvIHRob3NlIHByb2R1Y2VkIGJ5Ci0gIG1ha2VmaWxlcywgaWYgc3VjaCBtYWtlZmlsZXMgZXhpc3QgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgotICBJbiBwYXJ0aWN1bGFyLCBpZiB0aGUgcHJvamVjdCBwcm9kdWNlcyBhIERMTCBidWlsZCBmb3IgdGhlIFdpbjMyCi0gIHBsYXRmb3JtLCB0aGlzIGJ1aWxkIG11c3QgY29tcGx5IHRvIHRoZSBvZmZpY2lhbGx5LWFtbWVuZGVkIFdpbjMyIERMTAotICBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlIChBQkkpLCBkZXNjcmliZWQgaW4gd2luMzIvRExMX0ZBUS50eHQuCi0KLS0gVGhlIHByb2plY3QgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBidWlsZCB0YXJnZXRzLCB3aGljaCBkZXBlbmQgb24KLSAgM3JkLXBhcnR5ICh1bm9mZmljaWFsbHktc3VwcG9ydGVkKSBzb2Z0d2FyZSwgcHJlc2VudCBpbiB0aGUgY29udHJpYgotICBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSwgaXQgaXMgcG9zc2libGUgdG8gcHJvdmlkZSBhbiAiQVNNIGJ1aWxkIiwKLSAgYmVzaWRlcyB0aGUgb2ZmaWNpYWxseS1zdXBwb3J0ZWQgYnVpbGQsIGFuZCBoYXZlIEFTTSBzb3VyY2UgZmlsZXMKLSAgYW1vbmcgaXRzIGRlcGVuZGVuY2llcy4KLQotLSBJZiB0aGVyZSBhcmUgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgcHJvamVjdCBmaWxlcyBjcmVhdGVkCi0gIGJ5IGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBhbiBJREUgKGUuZy4gVmlzdWFsIEMrKyA2LjAgdnMuIDcuMCksIHRoZSBuYW1lCi0gIG9mIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBzaG91bGQgY29udGFpbiB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIElERQotICBmb3Igd2hpY2ggdGhlIHByb2plY3QgaXMgaW50ZW5kZWQgKGUuZy4gInZpc3VhbGM2IiBmb3IgVmlzdWFsIEMrKyA2LjAsCi0gIG9yICJ2aXN1YWxjNyIgZm9yIFZpc3VhbCBDKysgNy4wIGFuZCA3LjEpLgotCi0KLUN1cnJlbnQgcHJvamVjdHMKLT09PT09PT09PT09PT09PT0KLQotdmlzdWFsYzYvICAgYnkgU2ltb24tUGllcnJlIENhZGlldXggPG1ldGhvZGV4QG1ldGhvZGV4LmNhPgotICAgICAgICAgICAgYW5kIENvc21pbiBUcnV0YSA8Y29zbWludEBjcy51YmJjbHVqLnJvPgotICAgICAgICBQcm9qZWN0IGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyA2LjAKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9wcm9qZWN0cy92aXN1YWxjNi9SRUFETUUudHh0IGIvbGlicy96bGliL3Byb2plY3RzL3Zpc3VhbGM2L1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMGFlZjAuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL3Byb2plY3RzL3Zpc3VhbGM2L1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi1NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGVzLCBGb3JtYXQgVmVyc2lvbiA2LjAwIGZvciB6bGliLgotCi1Db3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBTaW1vbi1QaWVycmUgQ2FkaWV1eC4KLUNvcHlyaWdodCAoQykgMjAwNCBDb3NtaW4gVHJ1dGEuCi1Gb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oLgotCi0KLVRoaXMgcHJvamVjdCBidWlsZHMgdGhlIHpsaWIgYmluYXJpZXMgYXMgZm9sbG93czoKLQotKiBXaW4zMl9ETExfUmVsZWFzZVx6bGliMS5kbGwgICAgICAgRExMIGJ1aWxkCi0qIFdpbjMyX0RMTF9EZWJ1Z1x6bGliMWQuZGxsICAgICAgICBETEwgYnVpbGQgKGRlYnVnIHZlcnNpb24pCi0qIFdpbjMyX0RMTF9BU01fUmVsZWFzZVx6bGliMS5kbGwgICBETEwgYnVpbGQgdXNpbmcgQVNNIGNvZGUKLSogV2luMzJfRExMX0FTTV9EZWJ1Z1x6bGliMWQuZGxsICAgIERMTCBidWlsZCB1c2luZyBBU00gY29kZSAoZGVidWcgdmVyc2lvbikKLSogV2luMzJfTElCX1JlbGVhc2VcemxpYi5saWIgICAgICAgIHN0YXRpYyBidWlsZAotKiBXaW4zMl9MSUJfRGVidWdcemxpYmQubGliICAgICAgICAgc3RhdGljIGJ1aWxkIChkZWJ1ZyB2ZXJzaW9uKQotKiBXaW4zMl9MSUJfQVNNX1JlbGVhc2VcemxpYi5saWIgICAgc3RhdGljIGJ1aWxkIHVzaW5nIEFTTSBjb2RlCi0qIFdpbjMyX0xJQl9BU01fRGVidWdcemxpYmQubGliICAgICBzdGF0aWMgYnVpbGQgdXNpbmcgQVNNIGNvZGUgKGRlYnVnIHZlcnNpb24pCi0KLQotRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBETEwgYnVpbGRzLCBwbGVhc2Ugc2VlIHRoZSBETEwgRkFRCi1pbiAuLlwuLlx3aW4zMlxETExfRkFRLnR4dC4KLQotCi1UbyBidWlsZCBhbmQgdGVzdDoKLQotMSkgT24gdGhlIG1haW4gbWVudSwgc2VsZWN0ICJGaWxlIHwgT3BlbiBXb3Jrc3BhY2UiLgotICAgT3BlbiAiemxpYi5kc3ciLgotCi0yKSBTZWxlY3QgIkJ1aWxkIHwgU2V0IEFjdGl2ZSBDb25maWd1cmF0aW9uIi4KLSAgIENob29zZSB0aGUgY29uZmlndXJhdGlvbiB5b3Ugd2lzaCB0byBidWlsZC4KLQotMykgU2VsZWN0ICJCdWlsZCB8IENsZWFuIi4KLQotNCkgU2VsZWN0ICJCdWlsZCB8IEJ1aWxkIC4uLiAoRjcpIi4gIElnbm9yZSB3YXJuaW5nIG1lc3NhZ2VzIGFib3V0Ci0gICBub3QgYmVpbmcgYWJsZSB0byBmaW5kIGNlcnRhaW4gaW5jbHVkZSBmaWxlcyAoZS5nLiBhbGxvYy5oKS4KLQotNSkgSWYgeW91IGJ1aWx0IG9uZSBvZiB0aGUgc2FtcGxlIHByb2dyYW1zIChleGFtcGxlIG9yIG1pbmlnemlwKSwKLSAgIHNlbGVjdCAiQnVpbGQgfCBFeGVjdXRlIC4uLiAoQ3RybCtGNSkiLgotCi0KLVRvIHVzZToKLQotMSkgU2VsZWN0ICJQcm9qZWN0IHwgU2V0dGluZ3MgKEFsdCtGNykiLgotICAgTWFrZSBub3RlIG9mIHRoZSBjb25maWd1cmF0aW9uIG5hbWVzIHVzZWQgaW4geW91ciBwcm9qZWN0LgotICAgVXN1YWxseSwgdGhlc2UgbmFtZXMgYXJlICJXaW4zMiBSZWxlYXNlIiBhbmQgIldpbjMyIERlYnVnIi4KLQotMikgSW4gdGhlIFdvcmtzcGFjZSB3aW5kb3csIHNlbGVjdCB0aGUgIkZpbGVWaWV3IiB0YWIuCi0gICBSaWdodC1jbGljayBvbiB0aGUgcm9vdCBpdGVtICJXb3Jrc3BhY2UgJy4uLiciLgotICAgU2VsZWN0ICJJbnNlcnQgUHJvamVjdCBpbnRvIFdvcmtzcGFjZSIuCi0gICBTd2l0Y2ggb24gdGhlIGNoZWNrYm94ICJEZXBlbmRlbmN5IG9mOiIsIGFuZCBzZWxlY3QgdGhlIG5hbWUKLSAgIG9mIHlvdXIgcHJvamVjdC4gIE9wZW4gInpsaWIuZHNwIi4KLQotMykgU2VsZWN0ICJCdWlsZCB8IENvbmZpZ3VyYXRpb25zIi4KLSAgIEZvciBlYWNoIGNvbmZpZ3VyYXRpb24gb2YgeW91ciBwcm9qZWN0OgotICAgMy4xKSBDaG9vc2UgdGhlIHpsaWIgY29uZmlndXJhdGlvbiB5b3Ugd2lzaCB0byB1c2UuCi0gICAzLjIpIENsaWNrIG9uICJBZGQiLgotICAgMy4zKSBTZXQgdGhlIG5ldyB6bGliIGNvbmZpZ3VyYXRpb24gbmFtZSB0byB0aGUgbmFtZSB1c2VkIGJ5Ci0gICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGN1cnJlbnQgaXRlcmF0aW9uLgotCi00KSBTZWxlY3QgIkJ1aWxkIHwgU2V0IEFjdGl2ZSBDb25maWd1cmF0aW9uIi4KLSAgIENob29zZSB0aGUgY29uZmlndXJhdGlvbiB5b3Ugd2lzaCB0byBidWlsZC4KLQotNSkgU2VsZWN0ICJCdWlsZCB8IEJ1aWxkIC4uLiAoRjcpIi4KLQotNikgSWYgeW91IGJ1aWx0IGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSwgc2VsZWN0Ci0gICAiQnVpbGQgfCBFeGVjdXRlIC4uLiAoQ3RybCtGNSkiLgotCi0KLU5vdGU6Ci0KLVRvIGJ1aWxkIHRoZSBBU00tZW5hYmxlZCBjb2RlLCB5b3UgbmVlZCBNaWNyb3NvZnQgQXNzZW1ibGVyCi0oTUwuRVhFKS4gIFlvdSBjYW4gZ2V0IGl0IGJ5IGRvd25sb2FkaW5nIGFuZCBpbnN0YWxsaW5nIHRoZQotbGF0ZXN0IFByb2Nlc3NvciBQYWNrIGZvciBWaXN1YWwgQysrIDYuMC4KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9wcm9qZWN0cy92aXN1YWxjNi9leGFtcGxlLmRzcCBiL2xpYnMvemxpYi9wcm9qZWN0cy92aXN1YWxjNi9leGFtcGxlLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViNjVkNi4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvcHJvamVjdHMvdmlzdWFsYzYvZXhhbXBsZS5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJleGFtcGxlIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMwotCi1DRkc9ZXhhbXBsZSAtIFdpbjMyIExJQiBEZWJ1ZwotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJleGFtcGxlLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiZXhhbXBsZS5tYWsiIENGRz0iZXhhbXBsZSAtIFdpbjMyIExJQiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJleGFtcGxlIC0gV2luMzIgRExMIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAiZXhhbXBsZSAtIFdpbjMyIERMTCBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJleGFtcGxlIC0gV2luMzIgRExMIEFTTSBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgImV4YW1wbGUgLSBXaW4zMiBETEwgQVNNIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgImV4YW1wbGUgLSBXaW4zMiBMSUIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJleGFtcGxlIC0gV2luMzIgTElCIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgImV4YW1wbGUgLSBXaW4zMiBMSUIgQVNNIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAiZXhhbXBsZSAtIFdpbjMyIExJQiBBU00gRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiZXhhbXBsZSAtIFdpbjMyIERMTCBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZXhhbXBsZV9fX1dpbjMyX0RMTF9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZXhhbXBsZV9fX1dpbjMyX0RMTF9SZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0RMTF9SZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0RMTF9SZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWAotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiZXhhbXBsZSAtIFdpbjMyIERMTCBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImV4YW1wbGVfX19XaW4zMl9ETExfRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJleGFtcGxlX19fV2luMzJfRExMX0RlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0RMTF9EZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9ETExfRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIENQUCAvWVgKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImV4YW1wbGUgLSBXaW4zMiBETEwgQVNNIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJleGFtcGxlX19fV2luMzJfRExMX0FTTV9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZXhhbXBsZV9fX1dpbjMyX0RMTF9BU01fUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9ETExfQVNNX1JlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfRExMX0FTTV9SZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWAotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiZXhhbXBsZSAtIFdpbjMyIERMTCBBU00gRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJleGFtcGxlX19fV2luMzJfRExMX0FTTV9EZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImV4YW1wbGVfX19XaW4zMl9ETExfQVNNX0RlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0RMTF9BU01fRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfRExMX0FTTV9EZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MKLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWAotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIEFERCBMSU5LMzIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiZXhhbXBsZSAtIFdpbjMyIExJQiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZXhhbXBsZV9fX1dpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZXhhbXBsZV9fX1dpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWAotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiZXhhbXBsZSAtIFdpbjMyIExJQiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImV4YW1wbGVfX19XaW4zMl9MSUJfRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJleGFtcGxlX19fV2luMzJfTElCX0RlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0xJQl9EZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9MSUJfRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIENQUCAvWVgKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImV4YW1wbGUgLSBXaW4zMiBMSUIgQVNNIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJleGFtcGxlX19fV2luMzJfTElCX0FTTV9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZXhhbXBsZV9fX1dpbjMyX0xJQl9BU01fUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9MSUJfQVNNX1JlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfTElCX0FTTV9SZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWAotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiZXhhbXBsZSAtIFdpbjMyIExJQiBBU00gRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJleGFtcGxlX19fV2luMzJfTElCX0FTTV9EZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImV4YW1wbGVfX19XaW4zMl9MSUJfQVNNX0RlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0xJQl9BU01fRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfTElCX0FTTV9EZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MKLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWAotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIEFERCBMSU5LMzIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiZXhhbXBsZSAtIFdpbjMyIERMTCBSZWxlYXNlIgotIyBOYW1lICJleGFtcGxlIC0gV2luMzIgRExMIERlYnVnIgotIyBOYW1lICJleGFtcGxlIC0gV2luMzIgRExMIEFTTSBSZWxlYXNlIgotIyBOYW1lICJleGFtcGxlIC0gV2luMzIgRExMIEFTTSBEZWJ1ZyIKLSMgTmFtZSAiZXhhbXBsZSAtIFdpbjMyIExJQiBSZWxlYXNlIgotIyBOYW1lICJleGFtcGxlIC0gV2luMzIgTElCIERlYnVnIgotIyBOYW1lICJleGFtcGxlIC0gV2luMzIgTElCIEFTTSBSZWxlYXNlIgotIyBOYW1lICJleGFtcGxlIC0gV2luMzIgTElCIEFTTSBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cZXhhbXBsZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cemNvbmYuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHpsaWIuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi9wcm9qZWN0cy92aXN1YWxjNi9taW5pZ3ppcC5kc3AgYi9saWJzL3psaWIvcHJvamVjdHMvdmlzdWFsYzYvbWluaWd6aXAuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTMxMWFhLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9wcm9qZWN0cy92aXN1YWxjNi9taW5pZ3ppcC5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJtaW5pZ3ppcCIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKLQotQ0ZHPW1pbmlnemlwIC0gV2luMzIgTElCIERlYnVnCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIm1pbmlnemlwLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAibWluaWd6aXAubWFrIiBDRkc9Im1pbmlnemlwIC0gV2luMzIgTElCIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIm1pbmlnemlwIC0gV2luMzIgRExMIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAibWluaWd6aXAgLSBXaW4zMiBETEwgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAibWluaWd6aXAgLSBXaW4zMiBETEwgQVNNIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAibWluaWd6aXAgLSBXaW4zMiBETEwgQVNNIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgIm1pbmlnemlwIC0gV2luMzIgTElCIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAibWluaWd6aXAgLSBXaW4zMiBMSUIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAibWluaWd6aXAgLSBXaW4zMiBMSUIgQVNNIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAibWluaWd6aXAgLSBXaW4zMiBMSUIgQVNNIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIm1pbmlnemlwIC0gV2luMzIgRExMIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJtaW5pZ3ppcF9fX1dpbjMyX0RMTF9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibWluaWd6aXBfX19XaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9GRCAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIENQUCAvWVgKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1pbmlnemlwIC0gV2luMzIgRExMIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibWluaWd6aXBfX19XaW4zMl9ETExfRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJtaW5pZ3ppcF9fX1dpbjMyX0RMTF9EZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9ETExfRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfRExMX0RlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJtaW5pZ3ppcCAtIFdpbjMyIERMTCBBU00gUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIm1pbmlnemlwX19fV2luMzJfRExMX0FTTV9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibWluaWd6aXBfX19XaW4zMl9ETExfQVNNX1JlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiV2luMzJfRExMX0FTTV9SZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0RMTF9BU01fUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9GRCAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIENQUCAvWVgKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1pbmlnemlwIC0gV2luMzIgRExMIEFTTSBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIm1pbmlnemlwX19fV2luMzJfRExMX0FTTV9EZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIm1pbmlnemlwX19fV2luMzJfRExMX0FTTV9EZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9ETExfQVNNX0RlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0RMTF9BU01fRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIENQUCAvWVgKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1pbmlnemlwIC0gV2luMzIgTElCIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJtaW5pZ3ppcF9fX1dpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibWluaWd6aXBfX19XaW4zMl9MSUJfUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9MSUJfUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9MSUJfUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9GRCAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIENQUCAvWVgKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1pbmlnemlwIC0gV2luMzIgTElCIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAibWluaWd6aXBfX19XaW4zMl9MSUJfRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJtaW5pZ3ppcF9fX1dpbjMyX0xJQl9EZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9MSUJfRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfTElCX0RlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBDUFAgL1lYCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJtaW5pZ3ppcCAtIFdpbjMyIExJQiBBU00gUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIm1pbmlnemlwX19fV2luMzJfTElCX0FTTV9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAibWluaWd6aXBfX19XaW4zMl9MSUJfQVNNX1JlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiV2luMzJfTElCX0FTTV9SZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0xJQl9BU01fUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9GRCAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVgKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIENQUCAvWVgKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIm1pbmlnemlwIC0gV2luMzIgTElCIEFTTSBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIm1pbmlnemlwX19fV2luMzJfTElCX0FTTV9EZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIm1pbmlnemlwX19fV2luMzJfTElCX0FTTV9EZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9MSUJfQVNNX0RlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0xJQl9BU01fRGVidWciCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWAotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIENQUCAvWVgKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIm1pbmlnemlwIC0gV2luMzIgRExMIFJlbGVhc2UiCi0jIE5hbWUgIm1pbmlnemlwIC0gV2luMzIgRExMIERlYnVnIgotIyBOYW1lICJtaW5pZ3ppcCAtIFdpbjMyIERMTCBBU00gUmVsZWFzZSIKLSMgTmFtZSAibWluaWd6aXAgLSBXaW4zMiBETEwgQVNNIERlYnVnIgotIyBOYW1lICJtaW5pZ3ppcCAtIFdpbjMyIExJQiBSZWxlYXNlIgotIyBOYW1lICJtaW5pZ3ppcCAtIFdpbjMyIExJQiBEZWJ1ZyIKLSMgTmFtZSAibWluaWd6aXAgLSBXaW4zMiBMSUIgQVNNIFJlbGVhc2UiCi0jIE5hbWUgIm1pbmlnemlwIC0gV2luMzIgTElCIEFTTSBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbWluaWd6aXAuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHpjb25mLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlx6bGliLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9saWJzL3psaWIvcHJvamVjdHMvdmlzdWFsYzYvemxpYi5kc3AgYi9saWJzL3psaWIvcHJvamVjdHMvdmlzdWFsYzYvemxpYi5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjYxM2MuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL3Byb2plY3RzL3Zpc3VhbGM2L3psaWIuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iemxpYiIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0Ci0KLUNGRz16bGliIC0gV2luMzIgTElCIERlYnVnCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgInpsaWIubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJ6bGliLm1hayIgQ0ZHPSJ6bGliIC0gV2luMzIgTElCIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgInpsaWIgLSBXaW4zMiBETEwgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiemxpYiAtIFdpbjMyIERMTCBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiemxpYiAtIFdpbjMyIERMTCBBU00gUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiemxpYiAtIFdpbjMyIERMTCBBU00gRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgInpsaWIgLSBXaW4zMiBMSUIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCi0hTUVTU0FHRSAiemxpYiAtIFdpbjMyIExJQiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCi0hTUVTU0FHRSAiemxpYiAtIFdpbjMyIExJQiBBU00gUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCi0hTUVTU0FHRSAiemxpYiAtIFdpbjMyIExJQiBBU00gRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBETEwgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgInpsaWJfX19XaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInpsaWJfX19XaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9ETExfUmVsZWFzZSIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotQ1BQPWNsLmV4ZQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9GRCAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVggL1ljIC9ZdQotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1Ci1NVEw9bWlkbC5leGUKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotUlNDPXJjLmV4ZQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2IC9vdXQ6IldpbjMyX0RMTF9SZWxlYXNlXHpsaWIxLmRsbCIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBETEwgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJ6bGliX19fV2luMzJfRExMX0RlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiemxpYl9fX1dpbjMyX0RMTF9EZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9ETExfRGVidWciCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfRExMX0RlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi1DUFA9Y2wuZXhlCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVggL1ljIC9ZdQotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQotTVRMPW1pZGwuZXhlCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLVJTQz1yYy5leGUKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiAvbm9sb2dvIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiV2luMzJfRExMX0RlYnVnXHpsaWIxZC5kbGwiIC9wZGJ0eXBlOnNlcHQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBETEwgQVNNIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJ6bGliX19fV2luMzJfRExMX0FTTV9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiemxpYl9fX1dpbjMyX0RMTF9BU01fUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9ETExfQVNNX1JlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiV2luMzJfRExMX0FTTV9SZWxlYXNlIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi1DUFA9Y2wuZXhlCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWCAvWWMgL1l1Ci0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJBU01WIiAvRCAiQVNNSU5GIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1Ci1NVEw9bWlkbC5leGUKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotUlNDPXJjLmV4ZQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2IC9vdXQ6IldpbjMyX0RMTF9BU01fUmVsZWFzZVx6bGliMS5kbGwiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgRExMIEFTTSBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgInpsaWJfX19XaW4zMl9ETExfQVNNX0RlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiemxpYl9fX1dpbjMyX0RMTF9BU01fRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiV2luMzJfRExMX0FTTV9EZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJXaW4zMl9ETExfQVNNX0RlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi1DUFA9Y2wuZXhlCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVggL1ljIC9ZdQotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiQVNNViIgL0QgIkFTTUlORiIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUKLU1UTD1taWRsLmV4ZQotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi1SU0M9cmMuZXhlCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIEFERCBMSU5LMzIgL25vbG9nbyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IldpbjMyX0RMTF9BU01fRGVidWdcemxpYjFkLmRsbCIgL3BkYnR5cGU6c2VwdAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYiAtIFdpbjMyIExJQiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiemxpYl9fX1dpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiemxpYl9fX1dpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIldpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0xJQl9SZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgIiIKLUNQUD1jbC5leGUKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYIC9ZYyAvWXUKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQotUlNDPXJjLmV4ZQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElCMzI9bGluay5leGUgLWxpYgotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCi0jIEFERCBMSUIzMiAvbm9sb2dvCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgTElCIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiemxpYl9fX1dpbjMyX0xJQl9EZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInpsaWJfX19XaW4zMl9MSUJfRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiV2luMzJfTElCX0RlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0xJQl9EZWJ1ZyIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi1DUFA9Y2wuZXhlCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYwotIyBTVUJUUkFDVCBCQVNFIENQUCAvWVggL1ljIC9ZdQotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRkQgL0daIC9jCi0jIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQotUlNDPXJjLmV4ZQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElCMzI9bGluay5leGUgLWxpYgotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCi0jIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6IldpbjMyX0xJQl9EZWJ1Z1x6bGliZC5saWIiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgTElCIEFTTSBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiemxpYl9fX1dpbjMyX0xJQl9BU01fUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInpsaWJfX19XaW4zMl9MSUJfQVNNX1JlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiV2luMzJfTElCX0FTTV9SZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0xJQl9BU01fUmVsZWFzZSIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi1DUFA9Y2wuZXhlCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvVzMgL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0ZEIC9jCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWCAvWWMgL1l1Ci0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJBU01WIiAvRCAiQVNNSU5GIiAvRkQgL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1Ci1SU0M9cmMuZXhlCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSUIzMj1saW5rLmV4ZSAtbGliCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KLSMgQUREIExJQjMyIC9ub2xvZ28KLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBMSUIgQVNNIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiemxpYl9fX1dpbjMyX0xJQl9BU01fRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ6bGliX19fV2luMzJfTElCX0FTTV9EZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJXaW4zMl9MSUJfQVNNX0RlYnVnIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIldpbjMyX0xJQl9BU01fRGVidWciCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotQ1BQPWNsLmV4ZQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MKLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYIC9ZYyAvWXUKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIkFTTVYiIC9EICJBU01JTkYiIC9GRCAvR1ogL2MKLSMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1Ci1SU0M9cmMuZXhlCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSUIzMj1saW5rLmV4ZSAtbGliCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KLSMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiV2luMzJfTElCX0FTTV9EZWJ1Z1x6bGliZC5saWIiCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJ6bGliIC0gV2luMzIgRExMIFJlbGVhc2UiCi0jIE5hbWUgInpsaWIgLSBXaW4zMiBETEwgRGVidWciCi0jIE5hbWUgInpsaWIgLSBXaW4zMiBETEwgQVNNIFJlbGVhc2UiCi0jIE5hbWUgInpsaWIgLSBXaW4zMiBETEwgQVNNIERlYnVnIgotIyBOYW1lICJ6bGliIC0gV2luMzIgTElCIFJlbGVhc2UiCi0jIE5hbWUgInpsaWIgLSBXaW4zMiBMSUIgRGVidWciCi0jIE5hbWUgInpsaWIgLSBXaW4zMiBMSUIgQVNNIFJlbGVhc2UiCi0jIE5hbWUgInpsaWIgLSBXaW4zMiBMSUIgQVNNIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxhZGxlcjMyLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxjb21wcmVzcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cY3JjMzIuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGRlZmxhdGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGd6aW8uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGluZmJhY2suYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGluZmZhc3QuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGluZmxhdGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGluZnRyZWVzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlx0cmVlcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cdW5jb21wci5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cd2luMzJcemxpYi5kZWYKLQotIUlGICAiJChDRkcpIiA9PSAiemxpYiAtIFdpbjMyIERMTCBSZWxlYXNlIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYiAtIFdpbjMyIERMTCBEZWJ1ZyIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBETEwgQVNNIFJlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgRExMIEFTTSBEZWJ1ZyIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBMSUIgUmVsZWFzZSIKLQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgTElCIERlYnVnIgotCi0jIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBMSUIgQVNNIFJlbGVhc2UiCi0KLSMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYiAtIFdpbjMyIExJQiBBU00gRGVidWciCi0KLSMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlx6dXRpbC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cY3JjMzIuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGRlZmxhdGUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGluZmZhc3QuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGluZmZpeGVkLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxpbmZsYXRlLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxpbmZ0cmVlcy5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cdHJlZXMuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHpjb25mLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlx6bGliLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlx6dXRpbC5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHdpbjMyXHpsaWIxLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkFzc2VtYmxlciBGaWxlcyAoVW5zdXBwb3J0ZWQpIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImFzbTtvYmo7YztjcHA7Y3h4O2g7aHBwO2h4eCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGNvbnRyaWJcbWFzbXg4Nlxndm1hdDMyLmFzbQotCi0hSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgRExMIFJlbGVhc2UiCi0KLSMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYiAtIFdpbjMyIERMTCBEZWJ1ZyIKLQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgRExMIEFTTSBSZWxlYXNlIgotCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcuLi4KLUludERpcj0uXFdpbjMyX0RMTF9BU01fUmVsZWFzZQotSW5wdXRQYXRoPS4uXC4uXGNvbnRyaWJcbWFzbXg4Nlxndm1hdDMyLmFzbQotSW5wdXROYW1lPWd2bWF0MzIKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW1sLmV4ZSAvbm9sb2dvIC9jIC9jb2ZmIC9DeCAvRm8iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiICIkKElucHV0UGF0aCkiCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYiAtIFdpbjMyIERMTCBBU00gRGVidWciCi0KLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZy4uLgotSW50RGlyPS5cV2luMzJfRExMX0FTTV9EZWJ1ZwotSW5wdXRQYXRoPS4uXC4uXGNvbnRyaWJcbWFzbXg4Nlxndm1hdDMyLmFzbQotSW5wdXROYW1lPWd2bWF0MzIKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW1sLmV4ZSAvbm9sb2dvIC9jIC9jb2ZmIC9DeCAvWmkgL0ZvIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiAiJChJbnB1dFBhdGgpIgotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBMSUIgUmVsZWFzZSIKLQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgTElCIERlYnVnIgotCi0jIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBMSUIgQVNNIFJlbGVhc2UiCi0KLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZy4uLgotSW50RGlyPS5cV2luMzJfTElCX0FTTV9SZWxlYXNlCi1JbnB1dFBhdGg9Li5cLi5cY29udHJpYlxtYXNteDg2XGd2bWF0MzIuYXNtCi1JbnB1dE5hbWU9Z3ZtYXQzMgotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbWwuZXhlIC9ub2xvZ28gL2MgL2NvZmYgL0N4IC9GbyIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgIiQoSW5wdXRQYXRoKSIKLQotIyBFbmQgQ3VzdG9tIEJ1aWxkCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgTElCIEFTTSBEZWJ1ZyIKLQotIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBBc3NlbWJsaW5nLi4uCi1JbnREaXI9LlxXaW4zMl9MSUJfQVNNX0RlYnVnCi1JbnB1dFBhdGg9Li5cLi5cY29udHJpYlxtYXNteDg2XGd2bWF0MzIuYXNtCi1JbnB1dE5hbWU9Z3ZtYXQzMgotCi0iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiCi0JbWwuZXhlIC9ub2xvZ28gL2MgL2NvZmYgL0N4IC9aaSAvRm8iJChJbnREaXIpXCQoSW5wdXROYW1lKS5vYmoiICIkKElucHV0UGF0aCkiCi0KLSMgRW5kIEN1c3RvbSBCdWlsZAotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxjb250cmliXG1hc214ODZcZ3ZtYXQzMmMuYwotCi0hSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgRExMIFJlbGVhc2UiCi0KLSMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQotIyBBREQgQ1BQIC9JICIuLlwuLiIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBETEwgRGVidWciCi0KLSMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQotIyBBREQgQ1BQIC9JICIuLlwuLiIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBETEwgQVNNIFJlbGVhc2UiCi0KLSMgQUREIENQUCAvSSAiLi5cLi4iCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgRExMIEFTTSBEZWJ1ZyIKLQotIyBBREQgQ1BQIC9JICIuLlwuLiIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBMSUIgUmVsZWFzZSIKLQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCi0jIEFERCBDUFAgL0kgIi4uXC4uIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYiAtIFdpbjMyIExJQiBEZWJ1ZyIKLQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCi0jIEFERCBDUFAgL0kgIi4uXC4uIgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYiAtIFdpbjMyIExJQiBBU00gUmVsZWFzZSIKLQotIyBBREQgQ1BQIC9JICIuLlwuLiIKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBMSUIgQVNNIERlYnVnIgotCi0jIEFERCBDUFAgL0kgIi4uXC4uIgotCi0hRU5ESUYgCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxjb250cmliXG1hc214ODZcaW5mZmFzMzIuYXNtCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBETEwgUmVsZWFzZSIKLQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgRExMIERlYnVnIgotCi0jIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBETEwgQVNNIFJlbGVhc2UiCi0KLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZy4uLgotSW50RGlyPS5cV2luMzJfRExMX0FTTV9SZWxlYXNlCi1JbnB1dFBhdGg9Li5cLi5cY29udHJpYlxtYXNteDg2XGluZmZhczMyLmFzbQotSW5wdXROYW1lPWluZmZhczMyCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQltbC5leGUgL25vbG9nbyAvYyAvY29mZiAvQ3ggL0ZvIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiAiJChJbnB1dFBhdGgpIgotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBETEwgQVNNIERlYnVnIgotCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcuLi4KLUludERpcj0uXFdpbjMyX0RMTF9BU01fRGVidWcKLUlucHV0UGF0aD0uLlwuLlxjb250cmliXG1hc214ODZcaW5mZmFzMzIuYXNtCi1JbnB1dE5hbWU9aW5mZmFzMzIKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW1sLmV4ZSAvbm9sb2dvIC9jIC9jb2ZmIC9DeCAvWmkgL0ZvIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiAiJChJbnB1dFBhdGgpIgotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBMSUIgUmVsZWFzZSIKLQotIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgTElCIERlYnVnIgotCi0jIFBST1AgRXhjbHVkZV9Gcm9tX0J1aWxkIDEKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBMSUIgQVNNIFJlbGVhc2UiCi0KLSMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gQXNzZW1ibGluZy4uLgotSW50RGlyPS5cV2luMzJfTElCX0FTTV9SZWxlYXNlCi1JbnB1dFBhdGg9Li5cLi5cY29udHJpYlxtYXNteDg2XGluZmZhczMyLmFzbQotSW5wdXROYW1lPWluZmZhczMyCi0KLSIkKEludERpcilcJChJbnB1dE5hbWUpLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSIKLQltbC5leGUgL25vbG9nbyAvYyAvY29mZiAvQ3ggL0ZvIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiAiJChJbnB1dFBhdGgpIgotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBMSUIgQVNNIERlYnVnIgotCi0jIEJlZ2luIEN1c3RvbSBCdWlsZCAtIEFzc2VtYmxpbmcuLi4KLUludERpcj0uXFdpbjMyX0xJQl9BU01fRGVidWcKLUlucHV0UGF0aD0uLlwuLlxjb250cmliXG1hc214ODZcaW5mZmFzMzIuYXNtCi1JbnB1dE5hbWU9aW5mZmFzMzIKLQotIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIgotCW1sLmV4ZSAvbm9sb2dvIC9jIC9jb2ZmIC9DeCAvWmkgL0ZvIiQoSW50RGlyKVwkKElucHV0TmFtZSkub2JqIiAiJChJbnB1dFBhdGgpIgotCi0jIEVuZCBDdXN0b20gQnVpbGQKLQotIUVORElGIAotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cUkVBRE1FLnR4dAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbGlicy96bGliL3Byb2plY3RzL3Zpc3VhbGM2L3psaWIuZHN3IGIvbGlicy96bGliL3Byb2plY3RzL3Zpc3VhbGM2L3psaWIuZHN3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ0ODU2Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi9wcm9qZWN0cy92aXN1YWxjNi96bGliLmRzdworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLU1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb2plY3Q6ICJleGFtcGxlIj0uXGV4YW1wbGUuZHNwIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIHpsaWIKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAibWluaWd6aXAiPS5cbWluaWd6aXAuZHNwIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLSAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kKLSAgICBQcm9qZWN0X0RlcF9OYW1lIHpsaWIKLSAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAiemxpYiI9Llx6bGliLmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTw0Pgote3t7Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1HbG9iYWw6Ci0KLVBhY2thZ2U9PDU+Ci17e3sKLX19fQotCi1QYWNrYWdlPTwzPgote3t7Ci19fX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCmRpZmYgLS1naXQgYS9saWJzL3psaWIvcW54L3BhY2thZ2UucXBnIGIvbGlicy96bGliL3FueC9wYWNrYWdlLnFwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0YTQ3Yy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvcW54L3BhY2thZ2UucXBnCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTxRUEc6R2VuZXJhdGlvbj4KLSAgIDxRUEc6T3B0aW9ucz4KLSAgICAgIDxRUEc6VXNlciB1bmF0dGVuZGVkPSJubyIgdmVyYm9zaXR5PSIyIiBsaXN0ZmlsZXM9InllcyIvPgotICAgICAgPFFQRzpEZWZhdWx0cyB0eXBlPSJxbnhfcGFja2FnZSIvPgotICAgICAgPFFQRzpTb3VyY2U+PC9RUEc6U291cmNlPgotICAgICAgPFFQRzpSZWxlYXNlIG51bWJlcj0iKyIvPgotICAgICAgPFFQRzpCdWlsZD48L1FQRzpCdWlsZD4KLSAgICAgIDxRUEc6RmlsZVNvcnRpbmcgc3RyaXA9InllcyIvPgotICAgICAgPFFQRzpQYWNrYWdlIHRhcmdldHM9ImNvbWJpbmUiLz4KLSAgICAgIDxRUEc6UmVwb3NpdG9yeSBnZW5lcmF0ZT0ieWVzIi8+Ci0gICAgICA8UVBHOkZpbmFsRGlyPjwvUVBHOkZpbmFsRGlyPgotICAgICAgPFFQRzpDbGVhbnVwPjwvUVBHOkNsZWFudXA+Ci0gICA8L1FQRzpPcHRpb25zPgotCi0gICA8UVBHOlJlc3BvbnNpYmxlPgotICAgICAgPFFQRzpDb21wYW55PjwvUVBHOkNvbXBhbnk+Ci0gICAgICA8UVBHOkRlcGFydG1lbnQ+PC9RUEc6RGVwYXJ0bWVudD4KLSAgICAgIDxRUEc6R3JvdXA+PC9RUEc6R3JvdXA+Ci0gICAgICA8UVBHOlRlYW0+PC9RUEc6VGVhbT4KLSAgICAgIDxRUEc6RW1wbG95ZWU+PC9RUEc6RW1wbG95ZWU+Ci0gICAgICA8UVBHOkVtYWlsQWRkcmVzcz48L1FQRzpFbWFpbEFkZHJlc3M+Ci0gICA8L1FQRzpSZXNwb25zaWJsZT4KLQotICAgPFFQRzpWYWx1ZXM+Ci0gICAgICA8UVBHOkZpbGVzPgotICAgICAgICAgPFFQRzpBZGQgZmlsZT0iLi4vemNvbmYuaCIgaW5zdGFsbD0iL29wdC9pbmNsdWRlLyIgdXNlcj0icm9vdDpzeXMiIHBlcm1pc3Npb249IjY0NCIvPgotICAgICAgICAgPFFQRzpBZGQgZmlsZT0iLi4vemxpYi5oIiBpbnN0YWxsPSIvb3B0L2luY2x1ZGUvIiB1c2VyPSJyb290OnN5cyIgcGVybWlzc2lvbj0iNjQ0Ii8+Ci0gICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi9saWJ6LnNvLjEuMi4zIiBpbnN0YWxsPSIvb3B0L2xpYi8iIHVzZXI9InJvb3Q6YmluIiBwZXJtaXNzaW9uPSI2NDQiLz4KLSAgICAgICAgIDxRUEc6QWRkIGZpbGU9ImxpYnouc28iIGluc3RhbGw9Ii9vcHQvbGliLyIgY29tcG9uZW50PSJkZXYiIGZpbGV0eXBlPSJzeW1saW5rIiBsaW5rdG89ImxpYnouc28uMS4yLjMiLz4KLSAgICAgICAgIDxRUEc6QWRkIGZpbGU9ImxpYnouc28uMSIgaW5zdGFsbD0iL29wdC9saWIvIiBmaWxldHlwZT0ic3ltbGluayIgbGlua3RvPSJsaWJ6LnNvLjEuMi4zIi8+Ci0gICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi9saWJ6LnNvLjEuMi4zIiBpbnN0YWxsPSIvb3B0L2xpYi8iIGNvbXBvbmVudD0ic2xpYiIvPgotICAgICAgPC9RUEc6RmlsZXM+Ci0KLSAgICAgIDxRUEc6UGFja2FnZUZpbHRlcj4KLSAgICAgICAgIDxRUE06UGFja2FnZU1hbmlmZXN0PgotICAgICAgICAgICAgPFFQTTpQYWNrYWdlRGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8UVBNOlBhY2thZ2VUeXBlPkxpYnJhcnk8L1FQTTpQYWNrYWdlVHlwZT4KLSAgICAgICAgICAgICAgIDxRUE06UGFja2FnZVJlbGVhc2VOb3Rlcz48L1FQTTpQYWNrYWdlUmVsZWFzZU5vdGVzPgotICAgICAgICAgICAgICAgPFFQTTpQYWNrYWdlUmVsZWFzZVVyZ2VuY3k+TWVkaXVtPC9RUE06UGFja2FnZVJlbGVhc2VVcmdlbmN5PgotICAgICAgICAgICAgICAgPFFQTTpQYWNrYWdlUmVwb3NpdG9yeT48L1FQTTpQYWNrYWdlUmVwb3NpdG9yeT4KLSAgICAgICAgICAgICAgIDxRUE06RmlsZVZlcnNpb24+Mi4wPC9RUE06RmlsZVZlcnNpb24+Ci0gICAgICAgICAgICA8L1FQTTpQYWNrYWdlRGVzY3JpcHRpb24+Ci0KLSAgICAgICAgICAgIDxRUE06UHJvZHVjdERlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0TmFtZT56bGliPC9RUE06UHJvZHVjdE5hbWU+Ci0gICAgICAgICAgICAgICA8UVBNOlByb2R1Y3RJZGVudGlmaWVyPnpsaWI8L1FQTTpQcm9kdWN0SWRlbnRpZmllcj4KLSAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdEVtYWlsPmFsYWluLmJvbm5lZm95QGljYnQuY29tPC9RUE06UHJvZHVjdEVtYWlsPgotICAgICAgICAgICAgICAgPFFQTTpWZW5kb3JOYW1lPlB1YmxpYzwvUVBNOlZlbmRvck5hbWU+Ci0gICAgICAgICAgICAgICA8UVBNOlZlbmRvckluc3RhbGxOYW1lPnB1YmxpYzwvUVBNOlZlbmRvckluc3RhbGxOYW1lPgotICAgICAgICAgICAgICAgPFFQTTpWZW5kb3JVUkw+d3d3Lmd6aXAub3JnL3psaWI8L1FQTTpWZW5kb3JVUkw+Ci0gICAgICAgICAgICAgICA8UVBNOlZlbmRvckVtYmVkVVJMPjwvUVBNOlZlbmRvckVtYmVkVVJMPgotICAgICAgICAgICAgICAgPFFQTTpWZW5kb3JFbWFpbD48L1FQTTpWZW5kb3JFbWFpbD4KLSAgICAgICAgICAgICAgIDxRUE06QXV0aG9yTmFtZT5KZWFuLUxvdXAgR2FpbGx5LE1hcmsgQWRsZXI8L1FQTTpBdXRob3JOYW1lPgotICAgICAgICAgICAgICAgPFFQTTpBdXRob3JVUkw+d3d3Lmd6aXAub3JnL3psaWI8L1FQTTpBdXRob3JVUkw+Ci0gICAgICAgICAgICAgICA8UVBNOkF1dGhvckVtYmVkVVJMPjwvUVBNOkF1dGhvckVtYmVkVVJMPgotICAgICAgICAgICAgICAgPFFQTTpBdXRob3JFbWFpbD56bGliQGd6aXAub3JnPC9RUE06QXV0aG9yRW1haWw+Ci0gICAgICAgICAgICAgICA8UVBNOlByb2R1Y3RJY29uU21hbGw+PC9RUE06UHJvZHVjdEljb25TbWFsbD4KLSAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdEljb25MYXJnZT48L1FQTTpQcm9kdWN0SWNvbkxhcmdlPgotICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0RGVzY3JpcHRpb25TaG9ydD5BIG1hc3NpdmVseSBzcGlmZnkgeWV0IGRlbGljYXRlbHkgdW5vYnRydXNpdmUgY29tcHJlc3Npb24gbGlicmFyeS48L1FQTTpQcm9kdWN0RGVzY3JpcHRpb25TaG9ydD4KLSAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdERlc2NyaXB0aW9uTG9uZz56bGliIGlzIGRlc2lnbmVkIHRvIGJlIGEgZnJlZSwgZ2VuZXJhbC1wdXJwb3NlLCBsZWdhbGx5IHVuZW5jdW1iZXJlZCwgbG9zc2xlc3MgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5IGZvciB1c2Ugb24gdmlydHVhbGx5IGFueSBjb21wdXRlciBoYXJkd2FyZSBhbmQgb3BlcmF0aW5nIHN5c3RlbS48L1FQTTpQcm9kdWN0RGVzY3JpcHRpb25Mb25nPgotICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0RGVzY3JpcHRpb25VUkw+aHR0cDovL3d3dy5nemlwLm9yZy96bGliPC9RUE06UHJvZHVjdERlc2NyaXB0aW9uVVJMPgotICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0RGVzY3JpcHRpb25FbWJlZFVSTD48L1FQTTpQcm9kdWN0RGVzY3JpcHRpb25FbWJlZFVSTD4KLSAgICAgICAgICAgIDwvUVBNOlByb2R1Y3REZXNjcmlwdGlvbj4KLQotICAgICAgICAgICAgPFFQTTpSZWxlYXNlRGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VWZXJzaW9uPjEuMi4zPC9RUE06UmVsZWFzZVZlcnNpb24+Ci0gICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VVcmdlbmN5Pk1lZGl1bTwvUVBNOlJlbGVhc2VVcmdlbmN5PgotICAgICAgICAgICAgICAgPFFQTTpSZWxlYXNlU3RhYmlsaXR5PlN0YWJsZTwvUVBNOlJlbGVhc2VTdGFiaWxpdHk+Ci0gICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VOb3RlTWlub3I+PC9RUE06UmVsZWFzZU5vdGVNaW5vcj4KLSAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZU5vdGVNYWpvcj48L1FQTTpSZWxlYXNlTm90ZU1ham9yPgotICAgICAgICAgICAgICAgPFFQTTpFeGNsdWRlQ291bnRyaWVzPgotICAgICAgICAgICAgICAgICAgPFFQTTpDb3VudHJ5PjwvUVBNOkNvdW50cnk+Ci0gICAgICAgICAgICAgICA8L1FQTTpFeGNsdWRlQ291bnRyaWVzPgotCi0gICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VDb3B5cmlnaHQ+Tm8gTGljZW5zZTwvUVBNOlJlbGVhc2VDb3B5cmlnaHQ+Ci0gICAgICAgICAgICA8L1FQTTpSZWxlYXNlRGVzY3JpcHRpb24+Ci0KLSAgICAgICAgICAgIDxRUE06Q29udGVudERlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPFFQTTpDb250ZW50VG9waWMgeG1sbXVsdGlwbGU9InRydWUiPlNvZnR3YXJlIERldmVsb3BtZW50L0xpYnJhcmllcyBhbmQgRXh0ZW5zaW9ucy9DIExpYnJhcmllczwvUVBNOkNvbnRlbnRUb3BpYz4KLSAgICAgICAgICAgICAgIDxRUE06Q29udGVudEtleXdvcmQ+emxpYixjb21wcmVzc2lvbjwvUVBNOkNvbnRlbnRLZXl3b3JkPgotICAgICAgICAgICAgICAgPFFQTTpUYXJnZXRPUz5xbng2PC9RUE06VGFyZ2V0T1M+Ci0gICAgICAgICAgICAgICA8UVBNOkhvc3RPUz5xbng2PC9RUE06SG9zdE9TPgotICAgICAgICAgICAgICAgPFFQTTpEaXNwbGF5RW52aXJvbm1lbnQgeG1sbXVsdGlwbGU9InRydWUiPk5vbmU8L1FQTTpEaXNwbGF5RW52aXJvbm1lbnQ+Ci0gICAgICAgICAgICAgICA8UVBNOlRhcmdldEF1ZGllbmNlIHhtbG11bHRpcGxlPSJ0cnVlIj5EZXZlbG9wZXI8L1FQTTpUYXJnZXRBdWRpZW5jZT4KLSAgICAgICAgICAgIDwvUVBNOkNvbnRlbnREZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvUVBNOlBhY2thZ2VNYW5pZmVzdD4KLSAgICAgIDwvUVBHOlBhY2thZ2VGaWx0ZXI+Ci0KLSAgICAgIDxRUEc6UGFja2FnZUZpbHRlciBwcm9jPSJub25lIiB0YXJnZXQ9Im5vbmUiPgotICAgICAgICAgPFFQTTpQYWNrYWdlTWFuaWZlc3Q+Ci0gICAgICAgICAgICA8UVBNOlByb2R1Y3RJbnN0YWxsYXRpb25EZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICA8UVBNOlByb2R1Y3RSZXF1aXJlbWVudHM+PC9RUE06UHJvZHVjdFJlcXVpcmVtZW50cz4KLSAgICAgICAgICAgIDwvUVBNOlByb2R1Y3RJbnN0YWxsYXRpb25EZXBlbmRlbmNpZXM+Ci0KLSAgICAgICAgICAgIDxRUE06UHJvZHVjdEluc3RhbGxhdGlvblByb2NlZHVyZT4KLSAgICAgICAgICAgICAgIDxRUE06U2NyaXB0IHhtbG11bHRpcGxlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgIDxRUE06U2NyaXB0TmFtZT48L1FQTTpTY3JpcHROYW1lPgotICAgICAgICAgICAgICAgICAgPFFQTTpTY3JpcHRUeXBlPkluc3RhbGw8L1FQTTpTY3JpcHRUeXBlPgotICAgICAgICAgICAgICAgICAgPFFQTTpTY3JpcHRUaW1pbmc+UG9zdDwvUVBNOlNjcmlwdFRpbWluZz4KLSAgICAgICAgICAgICAgICAgIDxRUE06U2NyaXB0QmxvY2tpbmc+Tm88L1FQTTpTY3JpcHRCbG9ja2luZz4KLSAgICAgICAgICAgICAgICAgIDxRUE06U2NyaXB0UmVzdWx0Pklnbm9yZTwvUVBNOlNjcmlwdFJlc3VsdD4KLSAgICAgICAgICAgICAgICAgIDxRUE06U2hvcnREZXNjcmlwdGlvbj48L1FQTTpTaG9ydERlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPFFQTTpVc2VCaW5hcmllcz5ObzwvUVBNOlVzZUJpbmFyaWVzPgotICAgICAgICAgICAgICAgICAgPFFQTTpQcmlvcml0eT5PcHRpb25hbDwvUVBNOlByaW9yaXR5PgotICAgICAgICAgICAgICAgPC9RUE06U2NyaXB0PgotICAgICAgICAgICAgPC9RUE06UHJvZHVjdEluc3RhbGxhdGlvblByb2NlZHVyZT4KLSAgICAgICAgIDwvUVBNOlBhY2thZ2VNYW5pZmVzdD4KLQotICAgICAgICAgPFFQTTpMYXVuY2g+Ci0gICAgICAgICA8L1FQTTpMYXVuY2g+Ci0gICAgICA8L1FQRzpQYWNrYWdlRmlsdGVyPgotCi0gICAgICA8UVBHOlBhY2thZ2VGaWx0ZXIgdHlwZT0iY29yZSIgY29tcG9uZW50PSJub25lIj4KLSAgICAgICAgIDxRUE06UGFja2FnZU1hbmlmZXN0PgotICAgICAgICAgICAgPFFQTTpQcm9kdWN0SW5zdGFsbGF0aW9uUHJvY2VkdXJlPgotCSAgICAgICA8UVBNOk9yZGVyRGVwZW5kZW5jeSB4bWxtdWx0aXBsZT0idHJ1ZSI+Ci0JICAgICAgICAgIDxRUE06T3JkZXI+SW5zdGFsbE92ZXI8L1FQTTpPcmRlcj4KLQkgICAgICAgICAgPFFQTTpQcm9kdWN0PnpsaWI8L1FQTTpQcm9kdWN0PgotCSAgICAgICA8L1FQTTpPcmRlckRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L1FQTTpQcm9kdWN0SW5zdGFsbGF0aW9uUHJvY2VkdXJlPgotICAgICAgICAgPC9RUE06UGFja2FnZU1hbmlmZXN0PgotCi0gICAgICAgICA8UVBNOkxhdW5jaD4KLSAgICAgICAgIDwvUVBNOkxhdW5jaD4KLSAgICAgIDwvUVBHOlBhY2thZ2VGaWx0ZXI+Ci0KLSAgICAgIDxRUEc6UGFja2FnZUZpbHRlciB0eXBlPSJjb3JlIiBjb21wb25lbnQ9ImRldiI+Ci0gICAgICAgICA8UVBNOlBhY2thZ2VNYW5pZmVzdD4KLSAgICAgICAgICAgIDxRUE06UHJvZHVjdEluc3RhbGxhdGlvblByb2NlZHVyZT4KLQkgICAgICAgPFFQTTpPcmRlckRlcGVuZGVuY3kgeG1sbXVsdGlwbGU9InRydWUiPgotCSAgICAgICAgICA8UVBNOk9yZGVyPkluc3RhbGxPdmVyPC9RUE06T3JkZXI+Ci0JICAgICAgICAgIDxRUE06UHJvZHVjdD56bGliLWRldjwvUVBNOlByb2R1Y3Q+Ci0JICAgICAgIDwvUVBNOk9yZGVyRGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvUVBNOlByb2R1Y3RJbnN0YWxsYXRpb25Qcm9jZWR1cmU+Ci0gICAgICAgICA8L1FQTTpQYWNrYWdlTWFuaWZlc3Q+Ci0KLSAgICAgICAgIDxRUE06TGF1bmNoPgotICAgICAgICAgPC9RUE06TGF1bmNoPgotICAgICAgPC9RUEc6UGFja2FnZUZpbHRlcj4KLSAgIDwvUVBHOlZhbHVlcz4KLTwvUVBHOkdlbmVyYXRpb24+CmRpZmYgLS1naXQgYS9saWJzL3psaWIvdHJlZXMuYyBiL2xpYnMvemxpYi90cmVlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTVlNGUxLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi90cmVlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxOSArMCwwIEBACi0vKiB0cmVlcy5jIC0tIG91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5Ci0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyoKLSAqICBBTEdPUklUSE0KLSAqCi0gKiAgICAgIFRoZSAiZGVmbGF0aW9uIiBwcm9jZXNzIHVzZXMgc2V2ZXJhbCBIdWZmbWFuIHRyZWVzLiBUaGUgbW9yZQotICogICAgICBjb21tb24gc291cmNlIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgc2hvcnRlciBiaXQgc2VxdWVuY2VzLgotICoKLSAqICAgICAgRWFjaCBjb2RlIHRyZWUgaXMgc3RvcmVkIGluIGEgY29tcHJlc3NlZCBmb3JtIHdoaWNoIGlzIGl0c2VsZgotICogYSBIdWZmbWFuIGVuY29kaW5nIG9mIHRoZSBsZW5ndGhzIG9mIGFsbCB0aGUgY29kZSBzdHJpbmdzIChpbgotICogYXNjZW5kaW5nIG9yZGVyIGJ5IHNvdXJjZSB2YWx1ZXMpLiAgVGhlIGFjdHVhbCBjb2RlIHN0cmluZ3MgYXJlCi0gKiByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGxlbmd0aHMgaW4gdGhlIGluZmxhdGUgcHJvY2VzcywgYXMgZGVzY3JpYmVkCi0gKiBpbiB0aGUgZGVmbGF0ZSBzcGVjaWZpY2F0aW9uLgotICoKLSAqICBSRUZFUkVOQ0VTCi0gKgotICogICAgICBEZXV0c2NoLCBMLlAuLCInRGVmbGF0ZScgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIi4KLSAqICAgICAgQXZhaWxhYmxlIGluIGZ0cC51dS5uZXQ6L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy9kZWZsYXRlLTEuMS5kb2MKLSAqCi0gKiAgICAgIFN0b3JlciwgSmFtZXMgQS4KLSAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBNZXRob2RzIGFuZCBUaGVvcnksIHBwLiA0OS01MC4KLSAqICAgICAgICAgIENvbXB1dGVyIFNjaWVuY2UgUHJlc3MsIDE5ODguICBJU0JOIDAtNzE2Ny04MTU2LTUuCi0gKgotICogICAgICBTZWRnZXdpY2ssIFIuCi0gKiAgICAgICAgICBBbGdvcml0aG1zLCBwMjkwLgotICogICAgICAgICAgQWRkaXNvbi1XZXNsZXksIDE5ODMuIElTQk4gMC0yMDEtMDY2NzItNi4KLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotLyogI2RlZmluZSBHRU5fVFJFRVNfSCAqLwotCi0jaW5jbHVkZSAiZGVmbGF0ZS5oIgotCi0jaWZkZWYgREVCVUcKLSMgIGluY2x1ZGUgPGN0eXBlLmg+Ci0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb25zdGFudHMKLSAqLwotCi0jZGVmaW5lIE1BWF9CTF9CSVRTIDcKLS8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi8KLQotI2RlZmluZSBFTkRfQkxPQ0sgMjU2Ci0vKiBlbmQgb2YgYmxvY2sgbGl0ZXJhbCBjb2RlICovCi0KLSNkZWZpbmUgUkVQXzNfNiAgICAgIDE2Ci0vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovCi0KLSNkZWZpbmUgUkVQWl8zXzEwICAgIDE3Ci0vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KLQotI2RlZmluZSBSRVBaXzExXzEzOCAgMTgKLS8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDExLTEzOCB0aW1lcyAgKDcgYml0cyBvZiByZXBlYXQgY291bnQpICovCi0KLWxvY2FsIGNvbnN0IGludCBleHRyYV9sYml0c1tMRU5HVEhfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggbGVuZ3RoIGNvZGUgKi8KLSAgID0gezAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMH07Ci0KLWxvY2FsIGNvbnN0IGludCBleHRyYV9kYml0c1tEX0NPREVTXSAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi8KLSAgID0gezAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTN9OwotCi1sb2NhbCBjb25zdCBpbnQgZXh0cmFfYmxiaXRzW0JMX0NPREVTXS8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovCi0gICA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3fTsKLQotbG9jYWwgY29uc3QgdWNoIGJsX29yZGVyW0JMX0NPREVTXQotICAgPSB7MTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNX07Ci0vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nCi0gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy4KLSAqLwotCi0jZGVmaW5lIEJ1Zl9zaXplICg4ICogMipzaXplb2YoY2hhcikpCi0vKiBOdW1iZXIgb2YgYml0cyB1c2VkIHdpdGhpbiBiaV9idWYuIChiaV9idWYgbWlnaHQgYmUgaW1wbGVtZW50ZWQgb24KLSAqIG1vcmUgdGhhbiAxNiBiaXRzIG9uIHNvbWUgc3lzdGVtcy4pCi0gKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBMb2NhbCBkYXRhLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgb25seSBvbmNlLgotICovCi0KLSNkZWZpbmUgRElTVF9DT0RFX0xFTiAgNTEyIC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqLwotCi0jaWYgZGVmaW5lZChHRU5fVFJFRVNfSCkgfHwgIWRlZmluZWQoU1REQykKLS8qIG5vbiBBTlNJIGNvbXBpbGVycyBtYXkgbm90IGFjY2VwdCB0cmVlcy5oICovCi0KLWxvY2FsIGN0X2RhdGEgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl07Ci0vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBubwotICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXIKLSAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdAotICogYmVsb3cpLgotICovCi0KLWxvY2FsIGN0X2RhdGEgc3RhdGljX2R0cmVlW0RfQ09ERVNdOwotLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlLiAoQWN0dWFsbHkgYSB0cml2aWFsIHRyZWUgc2luY2UgYWxsIGNvZGVzIHVzZQotICogNSBiaXRzLikKLSAqLwotCi11Y2ggX2Rpc3RfY29kZVtESVNUX0NPREVfTEVOXTsKLS8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXMKLSAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2YKLSAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLgotICovCi0KLXVjaCBfbGVuZ3RoX2NvZGVbTUFYX01BVENILU1JTl9NQVRDSCsxXTsKLS8qIGxlbmd0aCBjb2RlIGZvciBlYWNoIG5vcm1hbGl6ZWQgbWF0Y2ggbGVuZ3RoICgwID09IE1JTl9NQVRDSCkgKi8KLQotbG9jYWwgaW50IGJhc2VfbGVuZ3RoW0xFTkdUSF9DT0RFU107Ci0vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqLwotCi1sb2NhbCBpbnQgYmFzZV9kaXN0W0RfQ09ERVNdOwotLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi8KLQotI2Vsc2UKLSMgIGluY2x1ZGUgInRyZWVzLmgiCi0jZW5kaWYgLyogR0VOX1RSRUVTX0ggKi8KLQotc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyB7Ci0gICAgY29uc3QgY3RfZGF0YSAqc3RhdGljX3RyZWU7ICAvKiBzdGF0aWMgdHJlZSBvciBOVUxMICovCi0gICAgY29uc3QgaW50ZiAqZXh0cmFfYml0czsgICAgICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGNvZGUgb3IgTlVMTCAqLwotICAgIGludCAgICAgZXh0cmFfYmFzZTsgICAgICAgICAgLyogYmFzZSBpbmRleCBmb3IgZXh0cmFfYml0cyAqLwotICAgIGludCAgICAgZWxlbXM7ICAgICAgICAgICAgICAgLyogbWF4IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHJlZSAqLwotICAgIGludCAgICAgbWF4X2xlbmd0aDsgICAgICAgICAgLyogbWF4IGJpdCBsZW5ndGggZm9yIHRoZSBjb2RlcyAqLwotfTsKLQotbG9jYWwgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2xfZGVzYyA9Ci17c3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMrMSwgTF9DT0RFUywgTUFYX0JJVFN9OwotCi1sb2NhbCBzdGF0aWNfdHJlZV9kZXNjICBzdGF0aWNfZF9kZXNjID0KLXtzdGF0aWNfZHRyZWUsIGV4dHJhX2RiaXRzLCAwLCAgICAgICAgICBEX0NPREVTLCBNQVhfQklUU307Ci0KLWxvY2FsIHN0YXRpY190cmVlX2Rlc2MgIHN0YXRpY19ibF9kZXNjID0KLXsoY29uc3QgY3RfZGF0YSAqKTAsIGV4dHJhX2JsYml0cywgMCwgICBCTF9DT0RFUywgTUFYX0JMX0JJVFN9OwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIExvY2FsIChzdGF0aWMpIHJvdXRpbmVzIGluIHRoaXMgZmlsZS4KLSAqLwotCi1sb2NhbCB2b2lkIHRyX3N0YXRpY19pbml0IE9GKCh2b2lkKSk7Ci1sb2NhbCB2b2lkIGluaXRfYmxvY2sgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci1sb2NhbCB2b2lkIHBxZG93bmhlYXAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgaykpOwotbG9jYWwgdm9pZCBnZW5fYml0bGVuICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdHJlZV9kZXNjICpkZXNjKSk7Ci1sb2NhbCB2b2lkIGdlbl9jb2RlcyAgICAgIE9GKChjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUsIHVzaGYgKmJsX2NvdW50KSk7Ci1sb2NhbCB2b2lkIGJ1aWxkX3RyZWUgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB0cmVlX2Rlc2MgKmRlc2MpKTsKLWxvY2FsIHZvaWQgc2Nhbl90cmVlICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGN0X2RhdGEgKnRyZWUsIGludCBtYXhfY29kZSkpOwotbG9jYWwgdm9pZCBzZW5kX3RyZWUgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlKSk7Ci1sb2NhbCBpbnQgIGJ1aWxkX2JsX3RyZWUgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci1sb2NhbCB2b2lkIHNlbmRfYWxsX3RyZWVzIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgbGNvZGVzLCBpbnQgZGNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsY29kZXMpKTsKLWxvY2FsIHZvaWQgY29tcHJlc3NfYmxvY2sgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGN0X2RhdGEgKmx0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RfZGF0YSAqZHRyZWUpKTsKLWxvY2FsIHZvaWQgc2V0X2RhdGFfdHlwZSAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKLWxvY2FsIHVuc2lnbmVkIGJpX3JldmVyc2UgT0YoKHVuc2lnbmVkIHZhbHVlLCBpbnQgbGVuZ3RoKSk7Ci1sb2NhbCB2b2lkIGJpX3dpbmR1cCAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci1sb2NhbCB2b2lkIGJpX2ZsdXNoICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci1sb2NhbCB2b2lkIGNvcHlfYmxvY2sgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjaGFyZiAqYnVmLCB1bnNpZ25lZCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZGVyKSk7Ci0KLSNpZmRlZiBHRU5fVFJFRVNfSAotbG9jYWwgdm9pZCBnZW5fdHJlZXNfaGVhZGVyIE9GKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBERUJVRwotIyAgZGVmaW5lIHNlbmRfY29kZShzLCBjLCB0cmVlKSBzZW5kX2JpdHMocywgdHJlZVtjXS5Db2RlLCB0cmVlW2NdLkxlbikKLSAgIC8qIFNlbmQgYSBjb2RlIG9mIHRoZSBnaXZlbiB0cmVlLiBjIGFuZCB0cmVlIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzICovCi0KLSNlbHNlIC8qIERFQlVHICovCi0jICBkZWZpbmUgc2VuZF9jb2RlKHMsIGMsIHRyZWUpIFwKLSAgICAgeyBpZiAoel92ZXJib3NlPjIpIGZwcmludGYoc3RkZXJyLCJcbmNkICUzZCAiLChjKSk7IFwKLSAgICAgICBzZW5kX2JpdHMocywgdHJlZVtjXS5Db2RlLCB0cmVlW2NdLkxlbik7IH0KLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIE91dHB1dCBhIHNob3J0IExTQiBmaXJzdCBvbiB0aGUgc3RyZWFtLgotICogSU4gYXNzZXJ0aW9uOiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiBwZW5kaW5nQnVmLgotICovCi0jZGVmaW5lIHB1dF9zaG9ydChzLCB3KSB7IFwKLSAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7IFwKLSAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7IFwKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy4KLSAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLgotICovCi0jaWZkZWYgREVCVUcKLWxvY2FsIHZvaWQgc2VuZF9iaXRzICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCB2YWx1ZSwgaW50IGxlbmd0aCkpOwotCi1sb2NhbCB2b2lkIHNlbmRfYml0cyhzLCB2YWx1ZSwgbGVuZ3RoKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgaW50IHZhbHVlOyAgLyogdmFsdWUgdG8gc2VuZCAqLwotICAgIGludCBsZW5ndGg7IC8qIG51bWJlciBvZiBiaXRzICovCi17Ci0gICAgVHJhY2V2digoc3RkZXJyLCIgbCAlMmQgdiAlNHggIiwgbGVuZ3RoLCB2YWx1ZSkpOwotICAgIEFzc2VydChsZW5ndGggPiAwICYmIGxlbmd0aCA8PSAxNSwgImludmFsaWQgbGVuZ3RoIik7Ci0gICAgcy0+Yml0c19zZW50ICs9ICh1bGcpbGVuZ3RoOwotCi0gICAgLyogSWYgbm90IGVub3VnaCByb29tIGluIGJpX2J1ZiwgdXNlICh2YWxpZCkgYml0cyBmcm9tIGJpX2J1ZiBhbmQKLSAgICAgKiAoMTYgLSBiaV92YWxpZCkgYml0cyBmcm9tIHZhbHVlLCBsZWF2aW5nICh3aWR0aCAtICgxNi1iaV92YWxpZCkpCi0gICAgICogdW51c2VkIGJpdHMgaW4gdmFsdWUuCi0gICAgICovCi0gICAgaWYgKHMtPmJpX3ZhbGlkID4gKGludClCdWZfc2l6ZSAtIGxlbmd0aCkgewotICAgICAgICBzLT5iaV9idWYgfD0gKHZhbHVlIDw8IHMtPmJpX3ZhbGlkKTsKLSAgICAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7Ci0gICAgICAgIHMtPmJpX2J1ZiA9ICh1c2gpdmFsdWUgPj4gKEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQpOwotICAgICAgICBzLT5iaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBzLT5iaV9idWYgfD0gdmFsdWUgPDwgcy0+YmlfdmFsaWQ7Ci0gICAgICAgIHMtPmJpX3ZhbGlkICs9IGxlbmd0aDsKLSAgICB9Ci19Ci0jZWxzZSAvKiAhREVCVUcgKi8KLQotI2RlZmluZSBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkgXAoteyBpbnQgbGVuID0gbGVuZ3RoO1wKLSAgaWYgKHMtPmJpX3ZhbGlkID4gKGludClCdWZfc2l6ZSAtIGxlbikge1wKLSAgICBpbnQgdmFsID0gdmFsdWU7XAotICAgIHMtPmJpX2J1ZiB8PSAodmFsIDw8IHMtPmJpX3ZhbGlkKTtcCi0gICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7XAotICAgIHMtPmJpX2J1ZiA9ICh1c2gpdmFsID4+IChCdWZfc2l6ZSAtIHMtPmJpX3ZhbGlkKTtcCi0gICAgcy0+YmlfdmFsaWQgKz0gbGVuIC0gQnVmX3NpemU7XAotICB9IGVsc2Uge1wKLSAgICBzLT5iaV9idWYgfD0gKHZhbHVlKSA8PCBzLT5iaV92YWxpZDtcCi0gICAgcy0+YmlfdmFsaWQgKz0gbGVuO1wKLSAgfVwKLX0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0KLS8qIHRoZSBhcmd1bWVudHMgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLgotICovCi1sb2NhbCB2b2lkIHRyX3N0YXRpY19pbml0KCkKLXsKLSNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQotICAgIHN0YXRpYyBpbnQgc3RhdGljX2luaXRfZG9uZSA9IDA7Ci0gICAgaW50IG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi8KLSAgICBpbnQgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovCi0gICAgaW50IGxlbmd0aDsgICAvKiBsZW5ndGggdmFsdWUgKi8KLSAgICBpbnQgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi8KLSAgICBpbnQgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovCi0gICAgdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdOwotICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqLwotCi0gICAgaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjsKLQotICAgIC8qIEZvciBzb21lIGVtYmVkZGVkIHRhcmdldHMsIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdCBpbml0aWFsaXplZDogKi8KLSAgICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlOwotICAgIHN0YXRpY19sX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2xiaXRzOwotICAgIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7Ci0gICAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7Ci0gICAgc3RhdGljX2JsX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2JsYml0czsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi8KLSAgICBsZW5ndGggPSAwOwotICAgIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMtMTsgY29kZSsrKSB7Ci0gICAgICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoOwotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7Ci0gICAgICAgICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gKHVjaCljb2RlOwotICAgICAgICB9Ci0gICAgfQotICAgIEFzc2VydCAobGVuZ3RoID09IDI1NiwgInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2Iik7Ci0gICAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWQKLSAgICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZQotICAgICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBlbmNvZGluZzoKLSAgICAgKi8KLSAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoLTFdID0gKHVjaCljb2RlOwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBkaXN0ICgwLi4zMkspIC0+IGRpc3QgY29kZSAoMC4uMjkpICovCi0gICAgZGlzdCA9IDA7Ci0gICAgZm9yIChjb2RlID0gMCA7IGNvZGUgPCAxNjsgY29kZSsrKSB7Ci0gICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8ZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHsKLSAgICAgICAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9ICh1Y2gpY29kZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IGRpc3QgIT0gMjU2Iik7Ci0gICAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovCi0gICAgZm9yICggOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7Ci0gICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNzsKLSAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDwoZXh0cmFfZGJpdHNbY29kZV0tNykpOyBuKyspIHsKLSAgICAgICAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9ICh1Y2gpY29kZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IDI1NitkaXN0ICE9IDUxMiIpOwotCi0gICAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqLwotICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgYmxfY291bnRbYml0c10gPSAwOwotICAgIG4gPSAwOwotICAgIHdoaWxlIChuIDw9IDE0Mykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKLSAgICB3aGlsZSAobiA8PSAyNTUpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDksIGJsX2NvdW50WzldKys7Ci0gICAgd2hpbGUgKG4gPD0gMjc5KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA3LCBibF9jb3VudFs3XSsrOwotICAgIHdoaWxlIChuIDw9IDI4Nykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKLSAgICAvKiBDb2RlcyAyODYgYW5kIDI4NyBkbyBub3QgZXhpc3QsIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGUKLSAgICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGUKLSAgICAgKiBhbGwgb25lcykKLSAgICAgKi8KLSAgICBnZW5fY29kZXMoKGN0X2RhdGEgKilzdGF0aWNfbHRyZWUsIExfQ09ERVMrMSwgYmxfY291bnQpOwotCi0gICAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovCi0gICAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7IG4rKykgewotICAgICAgICBzdGF0aWNfZHRyZWVbbl0uTGVuID0gNTsKLSAgICAgICAgc3RhdGljX2R0cmVlW25dLkNvZGUgPSBiaV9yZXZlcnNlKCh1bnNpZ25lZCluLCA1KTsKLSAgICB9Ci0gICAgc3RhdGljX2luaXRfZG9uZSA9IDE7Ci0KLSMgIGlmZGVmIEdFTl9UUkVFU19ICi0gICAgZ2VuX3RyZWVzX2hlYWRlcigpOwotIyAgZW5kaWYKLSNlbmRpZiAvKiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKSAqLwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEdlbmVyZXJhdGUgdGhlIGZpbGUgdHJlZXMuaCBkZXNjcmliaW5nIHRoZSBzdGF0aWMgdHJlZXMuCi0gKi8KLSNpZmRlZiBHRU5fVFJFRVNfSAotIyAgaWZuZGVmIERFQlVHCi0jICAgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0jICBlbmRpZgotCi0jICBkZWZpbmUgU0VQQVJBVE9SKGksIGxhc3QsIHdpZHRoKSBcCi0gICAgICAoKGkpID09IChsYXN0KT8gIlxufTtcblxuIiA6ICAgIFwKLSAgICAgICAoKGkpICUgKHdpZHRoKSA9PSAod2lkdGgpLTEgPyAiLFxuIiA6ICIsICIpKQotCi12b2lkIGdlbl90cmVlc19oZWFkZXIoKQotewotICAgIEZJTEUgKmhlYWRlciA9IGZvcGVuKCJ0cmVlcy5oIiwgInciKTsKLSAgICBpbnQgaTsKLQotICAgIEFzc2VydCAoaGVhZGVyICE9IE5VTEwsICJDYW4ndCBvcGVuIHRyZWVzLmgiKTsKLSAgICBmcHJpbnRmKGhlYWRlciwKLSAgICAgICAgICAgICIvKiBoZWFkZXIgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGggLURHRU5fVFJFRVNfSCAqL1xuXG4iKTsKLQotICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXSA9IHtcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBMX0NPREVTKzI7IGkrKykgewotICAgICAgICBmcHJpbnRmKGhlYWRlciwgInt7JTN1fSx7JTN1fX0lcyIsIHN0YXRpY19sdHJlZVtpXS5Db2RlLAotICAgICAgICAgICAgICAgIHN0YXRpY19sdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBMX0NPREVTKzEsIDUpKTsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2R0cmVlW0RfQ09ERVNdID0ge1xuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IERfQ09ERVM7IGkrKykgewotICAgICAgICBmcHJpbnRmKGhlYWRlciwgInt7JTJ1fSx7JTJ1fX0lcyIsIHN0YXRpY19kdHJlZVtpXS5Db2RlLAotICAgICAgICAgICAgICAgIHN0YXRpY19kdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBEX0NPREVTLTEsIDUpKTsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKGhlYWRlciwgImNvbnN0IHVjaCBfZGlzdF9jb2RlW0RJU1RfQ09ERV9MRU5dID0ge1xuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IERJU1RfQ09ERV9MRU47IGkrKykgewotICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiUydSVzIiwgX2Rpc3RfY29kZVtpXSwKLSAgICAgICAgICAgICAgICBTRVBBUkFUT1IoaSwgRElTVF9DT0RFX0xFTi0xLCAyMCkpOwotICAgIH0KLQotICAgIGZwcmludGYoaGVhZGVyLCAiY29uc3QgdWNoIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdPSB7XG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01BVENILU1JTl9NQVRDSCsxOyBpKyspIHsKLSAgICAgICAgZnByaW50ZihoZWFkZXIsICIlMnUlcyIsIF9sZW5ndGhfY29kZVtpXSwKLSAgICAgICAgICAgICAgICBTRVBBUkFUT1IoaSwgTUFYX01BVENILU1JTl9NQVRDSCwgMjApKTsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGludCBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdID0ge1xuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IExFTkdUSF9DT0RFUzsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTF1JXMiLCBiYXNlX2xlbmd0aFtpXSwKLSAgICAgICAgICAgICAgICBTRVBBUkFUT1IoaSwgTEVOR1RIX0NPREVTLTEsIDIwKSk7Ci0gICAgfQotCi0gICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBpbnQgYmFzZV9kaXN0W0RfQ09ERVNdID0ge1xuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IERfQ09ERVM7IGkrKykgewotICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiU1dSVzIiwgYmFzZV9kaXN0W2ldLAotICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBEX0NPREVTLTEsIDEwKSk7Ci0gICAgfQotCi0gICAgZmNsb3NlKGhlYWRlcik7Ci19Ci0jZW5kaWYgLyogR0VOX1RSRUVTX0ggKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uCi0gKi8KLXZvaWQgX3RyX2luaXQocykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotewotICAgIHRyX3N0YXRpY19pbml0KCk7Ci0KLSAgICBzLT5sX2Rlc2MuZHluX3RyZWUgPSBzLT5keW5fbHRyZWU7Ci0gICAgcy0+bF9kZXNjLnN0YXRfZGVzYyA9ICZzdGF0aWNfbF9kZXNjOwotCi0gICAgcy0+ZF9kZXNjLmR5bl90cmVlID0gcy0+ZHluX2R0cmVlOwotICAgIHMtPmRfZGVzYy5zdGF0X2Rlc2MgPSAmc3RhdGljX2RfZGVzYzsKLQotICAgIHMtPmJsX2Rlc2MuZHluX3RyZWUgPSBzLT5ibF90cmVlOwotICAgIHMtPmJsX2Rlc2Muc3RhdF9kZXNjID0gJnN0YXRpY19ibF9kZXNjOwotCi0gICAgcy0+YmlfYnVmID0gMDsKLSAgICBzLT5iaV92YWxpZCA9IDA7Ci0gICAgcy0+bGFzdF9lb2JfbGVuID0gODsgLyogZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZSAqLwotI2lmZGVmIERFQlVHCi0gICAgcy0+Y29tcHJlc3NlZF9sZW4gPSAwTDsKLSAgICBzLT5iaXRzX3NlbnQgPSAwTDsKLSNlbmRpZgotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovCi0gICAgaW5pdF9ibG9jayhzKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLgotICovCi1sb2NhbCB2b2lkIGluaXRfYmxvY2socykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotewotICAgIGludCBuOyAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi8KLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqLwotICAgIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSBzLT5keW5fbHRyZWVbbl0uRnJlcSA9IDA7Ci0gICAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7ICBuKyspIHMtPmR5bl9kdHJlZVtuXS5GcmVxID0gMDsKLSAgICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgcy0+YmxfdHJlZVtuXS5GcmVxID0gMDsKLQotICAgIHMtPmR5bl9sdHJlZVtFTkRfQkxPQ0tdLkZyZXEgPSAxOwotICAgIHMtPm9wdF9sZW4gPSBzLT5zdGF0aWNfbGVuID0gMEw7Ci0gICAgcy0+bGFzdF9saXQgPSBzLT5tYXRjaGVzID0gMDsKLX0KLQotI2RlZmluZSBTTUFMTEVTVCAxCi0vKiBJbmRleCB3aXRoaW4gdGhlIGhlYXAgYXJyYXkgb2YgbGVhc3QgZnJlcXVlbnQgbm9kZSBpbiB0aGUgSHVmZm1hbiB0cmVlICovCi0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBSZW1vdmUgdGhlIHNtYWxsZXN0IGVsZW1lbnQgZnJvbSB0aGUgaGVhcCBhbmQgcmVjcmVhdGUgdGhlIGhlYXAgd2l0aAotICogb25lIGxlc3MgZWxlbWVudC4gVXBkYXRlcyBoZWFwIGFuZCBoZWFwX2xlbi4KLSAqLwotI2RlZmluZSBwcXJlbW92ZShzLCB0cmVlLCB0b3ApIFwKLXtcCi0gICAgdG9wID0gcy0+aGVhcFtTTUFMTEVTVF07IFwKLSAgICBzLT5oZWFwW1NNQUxMRVNUXSA9IHMtPmhlYXBbcy0+aGVhcF9sZW4tLV07IFwKLSAgICBwcWRvd25oZWFwKHMsIHRyZWUsIFNNQUxMRVNUKTsgXAotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuCi0gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC4KLSAqLwotI2RlZmluZSBzbWFsbGVyKHRyZWUsIG4sIG0sIGRlcHRoKSBcCi0gICAodHJlZVtuXS5GcmVxIDwgdHJlZVttXS5GcmVxIHx8IFwKLSAgICh0cmVlW25dLkZyZXEgPT0gdHJlZVttXS5GcmVxICYmIGRlcHRoW25dIDw9IGRlcHRoW21dKSkKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgaywKLSAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nCi0gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzCi0gKiB0d28gc29ucykuCi0gKi8KLWxvY2FsIHZvaWQgcHFkb3duaGVhcChzLCB0cmVlLCBrKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgY3RfZGF0YSAqdHJlZTsgIC8qIHRoZSB0cmVlIHRvIHJlc3RvcmUgKi8KLSAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqLwotewotICAgIGludCB2ID0gcy0+aGVhcFtrXTsKLSAgICBpbnQgaiA9IGsgPDwgMTsgIC8qIGxlZnQgc29uIG9mIGsgKi8KLSAgICB3aGlsZSAoaiA8PSBzLT5oZWFwX2xlbikgewotICAgICAgICAvKiBTZXQgaiB0byB0aGUgc21hbGxlc3Qgb2YgdGhlIHR3byBzb25zOiAqLwotICAgICAgICBpZiAoaiA8IHMtPmhlYXBfbGVuICYmCi0gICAgICAgICAgICBzbWFsbGVyKHRyZWUsIHMtPmhlYXBbaisxXSwgcy0+aGVhcFtqXSwgcy0+ZGVwdGgpKSB7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRXhpdCBpZiB2IGlzIHNtYWxsZXIgdGhhbiBib3RoIHNvbnMgKi8KLSAgICAgICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgcy0+aGVhcFtqXSwgcy0+ZGVwdGgpKSBicmVhazsKLQotICAgICAgICAvKiBFeGNoYW5nZSB2IHdpdGggdGhlIHNtYWxsZXN0IHNvbiAqLwotICAgICAgICBzLT5oZWFwW2tdID0gcy0+aGVhcFtqXTsgIGsgPSBqOwotCi0gICAgICAgIC8qIEFuZCBjb250aW51ZSBkb3duIHRoZSB0cmVlLCBzZXR0aW5nIGogdG8gdGhlIGxlZnQgc29uIG9mIGsgKi8KLSAgICAgICAgaiA8PD0gMTsKLSAgICB9Ci0gICAgcy0+aGVhcFtrXSA9IHY7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGgKLSAqIGZvciB0aGUgY3VycmVudCBibG9jay4KLSAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kCi0gKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LgotICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZQotICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLgotICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcwotICogICAgIG5vdCBudWxsLgotICovCi1sb2NhbCB2b2lkIGdlbl9iaXRsZW4ocywgZGVzYykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqLwotewotICAgIGN0X2RhdGEgKnRyZWUgICAgICAgID0gZGVzYy0+ZHluX3RyZWU7Ci0gICAgaW50IG1heF9jb2RlICAgICAgICAgPSBkZXNjLT5tYXhfY29kZTsKLSAgICBjb25zdCBjdF9kYXRhICpzdHJlZSA9IGRlc2MtPnN0YXRfZGVzYy0+c3RhdGljX3RyZWU7Ci0gICAgY29uc3QgaW50ZiAqZXh0cmEgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPmV4dHJhX2JpdHM7Ci0gICAgaW50IGJhc2UgICAgICAgICAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPmV4dHJhX2Jhc2U7Ci0gICAgaW50IG1heF9sZW5ndGggICAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPm1heF9sZW5ndGg7Ci0gICAgaW50IGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovCi0gICAgaW50IG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi8KLSAgICBpbnQgYml0czsgICAgICAgICAgIC8qIGJpdCBsZW5ndGggKi8KLSAgICBpbnQgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi8KLSAgICB1c2ggZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqLwotICAgIGludCBvdmVyZmxvdyA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYml0IGxlbmd0aCB0b28gbGFyZ2UgKi8KLQotICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgcy0+YmxfY291bnRbYml0c10gPSAwOwotCi0gICAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXkKLSAgICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS4KLSAgICAgKi8KLSAgICB0cmVlW3MtPmhlYXBbcy0+aGVhcF9tYXhdXS5MZW4gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovCi0KLSAgICBmb3IgKGggPSBzLT5oZWFwX21heCsxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHsKLSAgICAgICAgbiA9IHMtPmhlYXBbaF07Ci0gICAgICAgIGJpdHMgPSB0cmVlW3RyZWVbbl0uRGFkXS5MZW4gKyAxOwotICAgICAgICBpZiAoYml0cyA+IG1heF9sZW5ndGgpIGJpdHMgPSBtYXhfbGVuZ3RoLCBvdmVyZmxvdysrOwotICAgICAgICB0cmVlW25dLkxlbiA9ICh1c2gpYml0czsKLSAgICAgICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KLQotICAgICAgICBpZiAobiA+IG1heF9jb2RlKSBjb250aW51ZTsgLyogbm90IGEgbGVhZiBub2RlICovCi0KLSAgICAgICAgcy0+YmxfY291bnRbYml0c10rKzsKLSAgICAgICAgeGJpdHMgPSAwOwotICAgICAgICBpZiAobiA+PSBiYXNlKSB4Yml0cyA9IGV4dHJhW24tYmFzZV07Ci0gICAgICAgIGYgPSB0cmVlW25dLkZyZXE7Ci0gICAgICAgIHMtPm9wdF9sZW4gKz0gKHVsZylmICogKGJpdHMgKyB4Yml0cyk7Ci0gICAgICAgIGlmIChzdHJlZSkgcy0+c3RhdGljX2xlbiArPSAodWxnKWYgKiAoc3RyZWVbbl0uTGVuICsgeGJpdHMpOwotICAgIH0KLSAgICBpZiAob3ZlcmZsb3cgPT0gMCkgcmV0dXJuOwotCi0gICAgVHJhY2UoKHN0ZGVyciwiXG5iaXQgbGVuZ3RoIG92ZXJmbG93XG4iKSk7Ci0gICAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi8KLQotICAgIC8qIEZpbmQgdGhlIGZpcnN0IGJpdCBsZW5ndGggd2hpY2ggY291bGQgaW5jcmVhc2U6ICovCi0gICAgZG8gewotICAgICAgICBiaXRzID0gbWF4X2xlbmd0aC0xOwotICAgICAgICB3aGlsZSAocy0+YmxfY291bnRbYml0c10gPT0gMCkgYml0cy0tOwotICAgICAgICBzLT5ibF9jb3VudFtiaXRzXS0tOyAgICAgIC8qIG1vdmUgb25lIGxlYWYgZG93biB0aGUgdHJlZSAqLwotICAgICAgICBzLT5ibF9jb3VudFtiaXRzKzFdICs9IDI7IC8qIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIgKi8KLSAgICAgICAgcy0+YmxfY291bnRbbWF4X2xlbmd0aF0tLTsKLSAgICAgICAgLyogVGhlIGJyb3RoZXIgb2YgdGhlIG92ZXJmbG93IGl0ZW0gYWxzbyBtb3ZlcyBvbmUgc3RlcCB1cCwKLSAgICAgICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdCi0gICAgICAgICAqLwotICAgICAgICBvdmVyZmxvdyAtPSAyOwotICAgIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7Ci0KLSAgICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuCi0gICAgICogaCBpcyBzdGlsbCBlcXVhbCB0byBIRUFQX1NJWkUuIChJdCBpcyBzaW1wbGVyIHRvIHJlY29uc3RydWN0IGFsbAotICAgICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuCi0gICAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pCi0gICAgICovCi0gICAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPSAwOyBiaXRzLS0pIHsKLSAgICAgICAgbiA9IHMtPmJsX2NvdW50W2JpdHNdOwotICAgICAgICB3aGlsZSAobiAhPSAwKSB7Ci0gICAgICAgICAgICBtID0gcy0+aGVhcFstLWhdOwotICAgICAgICAgICAgaWYgKG0gPiBtYXhfY29kZSkgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSB0cmVlW21dLkxlbiAhPSAodW5zaWduZWQpIGJpdHMpIHsKLSAgICAgICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCJjb2RlICVkIGJpdHMgJWQtPiVkXG4iLCBtLCB0cmVlW21dLkxlbiwgYml0cykpOwotICAgICAgICAgICAgICAgIHMtPm9wdF9sZW4gKz0gKChsb25nKWJpdHMgLSAobG9uZyl0cmVlW21dLkxlbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobG9uZyl0cmVlW21dLkZyZXE7Ci0gICAgICAgICAgICAgICAgdHJlZVttXS5MZW4gPSAodXNoKWJpdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuLS07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlCi0gKiBvcHRpbWFsKS4KLSAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yCi0gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLgotICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub24KLSAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLgotICovCi1sb2NhbCB2b2lkIGdlbl9jb2RlcyAodHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KQotICAgIGN0X2RhdGEgKnRyZWU7ICAgICAgICAgICAgIC8qIHRoZSB0cmVlIHRvIGRlY29yYXRlICovCi0gICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCi0gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqLwotewotICAgIHVzaCBuZXh0X2NvZGVbTUFYX0JJVFMrMV07IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovCi0gICAgdXNoIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovCi0gICAgaW50IGJpdHM7ICAgICAgICAgICAgICAgICAgLyogYml0IGluZGV4ICovCi0gICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqLwotCi0gICAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzCi0gICAgICogd2l0aG91dCBiaXQgcmV2ZXJzYWwuCi0gICAgICovCi0gICAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7Ci0gICAgICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMtMV0pIDw8IDE7Ci0gICAgfQotICAgIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGUKLSAgICAgKiBtdXN0IGJlIGFsbCBvbmVzLgotICAgICAqLwotICAgIEFzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSwKLSAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgYml0IGNvdW50cyIpOwotICAgIFRyYWNldigoc3RkZXJyLCJcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgIiwgbWF4X2NvZGUpKTsKLQotICAgIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHsKLSAgICAgICAgaW50IGxlbiA9IHRyZWVbbl0uTGVuOwotICAgICAgICBpZiAobGVuID09IDApIGNvbnRpbnVlOwotICAgICAgICAvKiBOb3cgcmV2ZXJzZSB0aGUgYml0cyAqLwotICAgICAgICB0cmVlW25dLkNvZGUgPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7Ci0KLSAgICAgICAgVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVyciwiXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpICIsCi0gICAgICAgICAgICAgbiwgKGlzZ3JhcGgobikgPyBuIDogJyAnKSwgbGVuLCB0cmVlW25dLkNvZGUsIG5leHRfY29kZVtsZW5dLTEpKTsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuCi0gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLgotICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLgotICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aAotICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzCi0gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LgotICovCi1sb2NhbCB2b2lkIGJ1aWxkX3RyZWUocywgZGVzYykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqLwotewotICAgIGN0X2RhdGEgKnRyZWUgICAgICAgICA9IGRlc2MtPmR5bl90cmVlOwotICAgIGNvbnN0IGN0X2RhdGEgKnN0cmVlICA9IGRlc2MtPnN0YXRfZGVzYy0+c3RhdGljX3RyZWU7Ci0gICAgaW50IGVsZW1zICAgICAgICAgICAgID0gZGVzYy0+c3RhdF9kZXNjLT5lbGVtczsKLSAgICBpbnQgbiwgbTsgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIGhlYXAgZWxlbWVudHMgKi8KLSAgICBpbnQgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCi0gICAgaW50IG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi8KLQotICAgIC8qIENvbnN0cnVjdCB0aGUgaW5pdGlhbCBoZWFwLCB3aXRoIGxlYXN0IGZyZXF1ZW50IGVsZW1lbnQgaW4KLSAgICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4KLSAgICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLgotICAgICAqLwotICAgIHMtPmhlYXBfbGVuID0gMCwgcy0+aGVhcF9tYXggPSBIRUFQX1NJWkU7Ci0KLSAgICBmb3IgKG4gPSAwOyBuIDwgZWxlbXM7IG4rKykgewotICAgICAgICBpZiAodHJlZVtuXS5GcmVxICE9IDApIHsKLSAgICAgICAgICAgIHMtPmhlYXBbKysocy0+aGVhcF9sZW4pXSA9IG1heF9jb2RlID0gbjsKLSAgICAgICAgICAgIHMtPmRlcHRoW25dID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyZWVbbl0uTGVuID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsCi0gICAgICogYW5kIHRoYXQgYXQgbGVhc3Qgb25lIGJpdCBzaG91bGQgYmUgc2VudCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lCi0gICAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3QKLSAgICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LgotICAgICAqLwotICAgIHdoaWxlIChzLT5oZWFwX2xlbiA8IDIpIHsKLSAgICAgICAgbm9kZSA9IHMtPmhlYXBbKysocy0+aGVhcF9sZW4pXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7Ci0gICAgICAgIHRyZWVbbm9kZV0uRnJlcSA9IDE7Ci0gICAgICAgIHMtPmRlcHRoW25vZGVdID0gMDsKLSAgICAgICAgcy0+b3B0X2xlbi0tOyBpZiAoc3RyZWUpIHMtPnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZV0uTGVuOwotICAgICAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi8KLSAgICB9Ci0gICAgZGVzYy0+bWF4X2NvZGUgPSBtYXhfY29kZTsKLQotICAgIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSwKLSAgICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczoKLSAgICAgKi8KLSAgICBmb3IgKG4gPSBzLT5oZWFwX2xlbi8yOyBuID49IDE7IG4tLSkgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsKLQotICAgIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d28KLSAgICAgKiBmcmVxdWVudCBub2Rlcy4KLSAgICAgKi8KLSAgICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi8KLSAgICBkbyB7Ci0gICAgICAgIHBxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovCi0gICAgICAgIG0gPSBzLT5oZWFwW1NNQUxMRVNUXTsgLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi8KLQotICAgICAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovCi0gICAgICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IG07Ci0KLSAgICAgICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi8KLSAgICAgICAgdHJlZVtub2RlXS5GcmVxID0gdHJlZVtuXS5GcmVxICsgdHJlZVttXS5GcmVxOwotICAgICAgICBzLT5kZXB0aFtub2RlXSA9ICh1Y2gpKChzLT5kZXB0aFtuXSA+PSBzLT5kZXB0aFttXSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlcHRoW25dIDogcy0+ZGVwdGhbbV0pICsgMSk7Ci0gICAgICAgIHRyZWVbbl0uRGFkID0gdHJlZVttXS5EYWQgPSAodXNoKW5vZGU7Ci0jaWZkZWYgRFVNUF9CTF9UUkVFCi0gICAgICAgIGlmICh0cmVlID09IHMtPmJsX3RyZWUpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcbm5vZGUgJWQoJWQpLCBzb25zICVkKCVkKSAlZCglZCkiLAotICAgICAgICAgICAgICAgICAgICBub2RlLCB0cmVlW25vZGVdLkZyZXEsIG4sIHRyZWVbbl0uRnJlcSwgbSwgdHJlZVttXS5GcmVxKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIC8qIGFuZCBpbnNlcnQgdGhlIG5ldyBub2RlIGluIHRoZSBoZWFwICovCi0gICAgICAgIHMtPmhlYXBbU01BTExFU1RdID0gbm9kZSsrOwotICAgICAgICBwcWRvd25oZWFwKHMsIHRyZWUsIFNNQUxMRVNUKTsKLQotICAgIH0gd2hpbGUgKHMtPmhlYXBfbGVuID49IDIpOwotCi0gICAgcy0+aGVhcFstLShzLT5oZWFwX21heCldID0gcy0+aGVhcFtTTUFMTEVTVF07Ci0KLSAgICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LiBXZSBjYW4gbm93Ci0gICAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLgotICAgICAqLwotICAgIGdlbl9iaXRsZW4ocywgKHRyZWVfZGVzYyAqKWRlc2MpOwotCi0gICAgLyogVGhlIGZpZWxkIGxlbiBpcyBub3cgc2V0LCB3ZSBjYW4gZ2VuZXJhdGUgdGhlIGJpdCBjb2RlcyAqLwotICAgIGdlbl9jb2RlcyAoKGN0X2RhdGEgKil0cmVlLCBtYXhfY29kZSwgcy0+YmxfY291bnQpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXMKLSAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuCi0gKi8KLWxvY2FsIHZvaWQgc2Nhbl90cmVlIChzLCB0cmVlLCBtYXhfY29kZSkKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIGN0X2RhdGEgKnRyZWU7ICAgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqLwotICAgIGludCBtYXhfY29kZTsgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovCi17Ci0gICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqLwotICAgIGludCBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi8KLSAgICBpbnQgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovCi0gICAgaW50IG5leHRsZW4gPSB0cmVlWzBdLkxlbjsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqLwotICAgIGludCBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovCi0gICAgaW50IG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqLwotICAgIGludCBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi8KLQotICAgIGlmIChuZXh0bGVuID09IDApIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0gMzsKLSAgICB0cmVlW21heF9jb2RlKzFdLkxlbiA9ICh1c2gpMHhmZmZmOyAvKiBndWFyZCAqLwotCi0gICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7Ci0gICAgICAgIGN1cmxlbiA9IG5leHRsZW47IG5leHRsZW4gPSB0cmVlW24rMV0uTGVuOwotICAgICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKLSAgICAgICAgICAgIHMtPmJsX3RyZWVbY3VybGVuXS5GcmVxICs9IGNvdW50OwotICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoY3VybGVuICE9IHByZXZsZW4pIHMtPmJsX3RyZWVbY3VybGVuXS5GcmVxKys7Ci0gICAgICAgICAgICBzLT5ibF90cmVlW1JFUF8zXzZdLkZyZXErKzsKLSAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkgewotICAgICAgICAgICAgcy0+YmxfdHJlZVtSRVBaXzNfMTBdLkZyZXErKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHMtPmJsX3RyZWVbUkVQWl8xMV8xMzhdLkZyZXErKzsKLSAgICAgICAgfQotICAgICAgICBjb3VudCA9IDA7IHByZXZsZW4gPSBjdXJsZW47Ci0gICAgICAgIGlmIChuZXh0bGVuID09IDApIHsKLSAgICAgICAgICAgIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0gMzsKLSAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gPT0gbmV4dGxlbikgewotICAgICAgICAgICAgbWF4X2NvdW50ID0gNiwgbWluX2NvdW50ID0gMzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1heF9jb3VudCA9IDcsIG1pbl9jb3VudCA9IDQ7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2VuZCBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSBpbiBjb21wcmVzc2VkIGZvcm0sIHVzaW5nIHRoZSBjb2RlcyBpbgotICogYmxfdHJlZS4KLSAqLwotbG9jYWwgdm9pZCBzZW5kX3RyZWUgKHMsIHRyZWUsIG1heF9jb2RlKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqLwotICAgIGludCBtYXhfY29kZTsgICAgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovCi17Ci0gICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqLwotICAgIGludCBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi8KLSAgICBpbnQgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovCi0gICAgaW50IG5leHRsZW4gPSB0cmVlWzBdLkxlbjsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqLwotICAgIGludCBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovCi0gICAgaW50IG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqLwotICAgIGludCBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi8KLQotICAgIC8qIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gLTE7ICovICAvKiBndWFyZCBhbHJlYWR5IHNldCAqLwotICAgIGlmIChuZXh0bGVuID09IDApIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0gMzsKLQotICAgIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykgewotICAgICAgICBjdXJsZW4gPSBuZXh0bGVuOyBuZXh0bGVuID0gdHJlZVtuKzFdLkxlbjsKLSAgICAgICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09IG5leHRsZW4pIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7Ci0gICAgICAgICAgICBkbyB7IHNlbmRfY29kZShzLCBjdXJsZW4sIHMtPmJsX3RyZWUpOyB9IHdoaWxlICgtLWNvdW50ICE9IDApOwotCi0gICAgICAgIH0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKLSAgICAgICAgICAgIGlmIChjdXJsZW4gIT0gcHJldmxlbikgewotICAgICAgICAgICAgICAgIHNlbmRfY29kZShzLCBjdXJsZW4sIHMtPmJsX3RyZWUpOyBjb3VudC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgIiAzXzY/Iik7Ci0gICAgICAgICAgICBzZW5kX2NvZGUocywgUkVQXzNfNiwgcy0+YmxfdHJlZSk7IHNlbmRfYml0cyhzLCBjb3VudC0zLCAyKTsKLQotICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7Ci0gICAgICAgICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLT5ibF90cmVlKTsgc2VuZF9iaXRzKHMsIGNvdW50LTMsIDMpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZW5kX2NvZGUocywgUkVQWl8xMV8xMzgsIHMtPmJsX3RyZWUpOyBzZW5kX2JpdHMocywgY291bnQtMTEsIDcpOwotICAgICAgICB9Ci0gICAgICAgIGNvdW50ID0gMDsgcHJldmxlbiA9IGN1cmxlbjsKLSAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkgewotICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOwotICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKSB7Ci0gICAgICAgICAgICBtYXhfY291bnQgPSA2LCBtaW5fY291bnQgPSAzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWF4X2NvdW50ID0gNywgbWluX2NvdW50ID0gNDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluCi0gKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC4KLSAqLwotbG9jYWwgaW50IGJ1aWxkX2JsX3RyZWUocykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotewotICAgIGludCBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KLQotICAgIC8qIERldGVybWluZSB0aGUgYml0IGxlbmd0aCBmcmVxdWVuY2llcyBmb3IgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KLSAgICBzY2FuX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fbHRyZWUsIHMtPmxfZGVzYy5tYXhfY29kZSk7Ci0gICAgc2Nhbl90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2R0cmVlLCBzLT5kX2Rlc2MubWF4X2NvZGUpOwotCi0gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi8KLSAgICBidWlsZF90cmVlKHMsICh0cmVlX2Rlc2MgKikoJihzLT5ibF9kZXNjKSkpOwotICAgIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHQKLSAgICAgKiB0aGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aHMgY29kZXMgYW5kIHRoZSA1KzUrNCBiaXRzIGZvciB0aGUgY291bnRzLgotICAgICAqLwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0Ci0gICAgICogcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCA0IGJpdCBsZW5ndGggY29kZXMgYmUgc2VudC4gKGFwcG5vdGUudHh0IHNheXMKLSAgICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pCi0gICAgICovCi0gICAgZm9yIChtYXhfYmxpbmRleCA9IEJMX0NPREVTLTE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHsKLSAgICAgICAgaWYgKHMtPmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdXS5MZW4gIT0gMCkgYnJlYWs7Ci0gICAgfQotICAgIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovCi0gICAgcy0+b3B0X2xlbiArPSAzKihtYXhfYmxpbmRleCsxKSArIDUrNSs0OwotICAgIFRyYWNldigoc3RkZXJyLCAiXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkIiwKLSAgICAgICAgICAgIHMtPm9wdF9sZW4sIHMtPnN0YXRpY19sZW4pKTsKLQotICAgIHJldHVybiBtYXhfYmxpbmRleDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcgZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGUKLSAqIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMsIHRoZSBsaXRlcmFsIHRyZWUgYW5kIHRoZSBkaXN0YW5jZSB0cmVlLgotICogSU4gYXNzZXJ0aW9uOiBsY29kZXMgPj0gMjU3LCBkY29kZXMgPj0gMSwgYmxjb2RlcyA+PSA0LgotICovCi1sb2NhbCB2b2lkIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgaW50IGxjb2RlcywgZGNvZGVzLCBibGNvZGVzOyAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqLwotewotICAgIGludCByYW5rOyAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW4gYmxfb3JkZXIgKi8KLQotICAgIEFzc2VydCAobGNvZGVzID49IDI1NyAmJiBkY29kZXMgPj0gMSAmJiBibGNvZGVzID49IDQsICJub3QgZW5vdWdoIGNvZGVzIik7Ci0gICAgQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLAotICAgICAgICAgICAgInRvbyBtYW55IGNvZGVzIik7Ci0gICAgVHJhY2V2KChzdGRlcnIsICJcbmJsIGNvdW50czogIikpOwotICAgIHNlbmRfYml0cyhzLCBsY29kZXMtMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCi0gICAgc2VuZF9iaXRzKHMsIGRjb2Rlcy0xLCAgIDUpOwotICAgIHNlbmRfYml0cyhzLCBibGNvZGVzLTQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqLwotICAgIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHsKLSAgICAgICAgVHJhY2V2KChzdGRlcnIsICJcbmJsIGNvZGUgJTJkICIsIGJsX29yZGVyW3JhbmtdKSk7Ci0gICAgICAgIHNlbmRfYml0cyhzLCBzLT5ibF90cmVlW2JsX29yZGVyW3JhbmtdXS5MZW4sIDMpOwotICAgIH0KLSAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKLQotICAgIHNlbmRfdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwgbGNvZGVzLTEpOyAvKiBsaXRlcmFsIHRyZWUgKi8KLSAgICBUcmFjZXYoKHN0ZGVyciwgIlxubGl0IHRyZWU6IHNlbnQgJWxkIiwgcy0+Yml0c19zZW50KSk7Ci0KLSAgICBzZW5kX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fZHRyZWUsIGRjb2Rlcy0xKTsgLyogZGlzdGFuY2UgdHJlZSAqLwotICAgIFRyYWNldigoc3RkZXJyLCAiXG5kaXN0IHRyZWU6IHNlbnQgJWxkIiwgcy0+Yml0c19zZW50KSk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2VuZCBhIHN0b3JlZCBibG9jawotICovCi12b2lkIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBlb2YpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBjaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqLwotICAgIHVsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqLwotICAgIGludCBlb2Y7ICAgICAgICAgIC8qIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovCi17Ci0gICAgc2VuZF9iaXRzKHMsIChTVE9SRURfQkxPQ0s8PDEpK2VvZiwgMyk7ICAvKiBzZW5kIGJsb2NrIHR5cGUgKi8KLSNpZmRlZiBERUJVRwotICAgIHMtPmNvbXByZXNzZWRfbGVuID0gKHMtPmNvbXByZXNzZWRfbGVuICsgMyArIDcpICYgKHVsZyl+N0w7Ci0gICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gKHN0b3JlZF9sZW4gKyA0KSA8PCAzOwotI2VuZGlmCi0gICAgY29weV9ibG9jayhzLCBidWYsICh1bnNpZ25lZClzdG9yZWRfbGVuLCAxKTsgLyogd2l0aCBoZWFkZXIgKi8KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTZW5kIG9uZSBlbXB0eSBzdGF0aWMgYmxvY2sgdG8gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlLgotICogVGhpcyB0YWtlcyAxMCBiaXRzLCBvZiB3aGljaCA3IG1heSByZW1haW4gaW4gdGhlIGJpdCBidWZmZXIuCi0gKiBUaGUgY3VycmVudCBpbmZsYXRlIGNvZGUgcmVxdWlyZXMgOSBiaXRzIG9mIGxvb2thaGVhZC4gSWYgdGhlCi0gKiBsYXN0IHR3byBjb2RlcyBmb3IgdGhlIHByZXZpb3VzIGJsb2NrIChyZWFsIGNvZGUgcGx1cyBFT0IpIHdlcmUgY29kZWQKLSAqIG9uIDUgYml0cyBvciBsZXNzLCBpbmZsYXRlIG1heSBoYXZlIG9ubHkgNSszIGJpdHMgb2YgbG9va2FoZWFkIHRvIGRlY29kZQotICogdGhlIGxhc3QgcmVhbCBjb2RlLiBJbiB0aGlzIGNhc2Ugd2Ugc2VuZCB0d28gZW1wdHkgc3RhdGljIGJsb2NrcyBpbnN0ZWFkCi0gKiBvZiBvbmUuIChUaGVyZSBhcmUgbm8gcHJvYmxlbXMgaWYgdGhlIHByZXZpb3VzIGJsb2NrIGlzIHN0b3JlZCBvciBmaXhlZC4pCi0gKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgYXNzdW1lIHRoZSB3b3JzdCBjYXNlIG9mIGxhc3QgcmVhbCBjb2RlIGVuY29kZWQKLSAqIG9uIG9uZSBiaXQgb25seS4KLSAqLwotdm9pZCBfdHJfYWxpZ24ocykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotewotICAgIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVM8PDEsIDMpOwotICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7Ci0jaWZkZWYgREVCVUcKLSAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAxMEw7IC8qIDMgZm9yIGJsb2NrIHR5cGUsIDcgZm9yIEVPQiAqLwotI2VuZGlmCi0gICAgYmlfZmx1c2gocyk7Ci0gICAgLyogT2YgdGhlIDEwIGJpdHMgZm9yIHRoZSBlbXB0eSBibG9jaywgd2UgaGF2ZSBhbHJlYWR5IHNlbnQKLSAgICAgKiAoMTAgLSBiaV92YWxpZCkgYml0cy4gVGhlIGxvb2thaGVhZCBmb3IgdGhlIGxhc3QgcmVhbCBjb2RlIChiZWZvcmUKLSAgICAgKiB0aGUgRU9CIG9mIHRoZSBwcmV2aW91cyBibG9jaykgd2FzIHRodXMgYXQgbGVhc3Qgb25lIHBsdXMgdGhlIGxlbmd0aAotICAgICAqIG9mIHRoZSBFT0IgcGx1cyB3aGF0IHdlIGhhdmUganVzdCBzZW50IG9mIHRoZSBlbXB0eSBzdGF0aWMgYmxvY2suCi0gICAgICovCi0gICAgaWYgKDEgKyBzLT5sYXN0X2VvYl9sZW4gKyAxMCAtIHMtPmJpX3ZhbGlkIDwgOSkgewotICAgICAgICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTPDwxLCAzKTsKLSAgICAgICAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTsKLSNpZmRlZiBERUJVRwotICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAxMEw7Ci0jZW5kaWYKLSAgICAgICAgYmlfZmx1c2gocyk7Ci0gICAgfQotICAgIHMtPmxhc3RfZW9iX2xlbiA9IDc7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nIGZvciB0aGUgY3VycmVudCBibG9jazogZHluYW1pYyB0cmVlcywgc3RhdGljCi0gKiB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwIGZpbGUuCi0gKi8KLXZvaWQgX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgZW9mKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2ssIG9yIE5VTEwgaWYgdG9vIG9sZCAqLwotICAgIHVsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqLwotICAgIGludCBlb2Y7ICAgICAgICAgIC8qIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovCi17Ci0gICAgdWxnIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgLyogb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBpbiBieXRlcyAqLwotICAgIGludCBtYXhfYmxpbmRleCA9IDA7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovCi0KLSAgICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovCi0gICAgaWYgKHMtPmxldmVsID4gMCkgewotCi0gICAgICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovCi0gICAgICAgIGlmIChzdG9yZWRfbGVuID4gMCAmJiBzLT5zdHJtLT5kYXRhX3R5cGUgPT0gWl9VTktOT1dOKQotICAgICAgICAgICAgc2V0X2RhdGFfdHlwZShzKTsKLQotICAgICAgICAvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovCi0gICAgICAgIGJ1aWxkX3RyZWUocywgKHRyZWVfZGVzYyAqKSgmKHMtPmxfZGVzYykpKTsKLSAgICAgICAgVHJhY2V2KChzdGRlcnIsICJcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCi0gICAgICAgICAgICAgICAgcy0+c3RhdGljX2xlbikpOwotCi0gICAgICAgIGJ1aWxkX3RyZWUocywgKHRyZWVfZGVzYyAqKSgmKHMtPmRfZGVzYykpKTsKLSAgICAgICAgVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGQiLCBzLT5vcHRfbGVuLAotICAgICAgICAgICAgICAgIHMtPnN0YXRpY19sZW4pKTsKLSAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mCi0gICAgICAgICAqIHRoZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEsIGV4Y2x1ZGluZyB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMuCi0gICAgICAgICAqLwotCi0gICAgICAgIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWUgZm9yIHRoZSBhYm92ZSB0d28gdHJlZXMsIGFuZCBnZXQgdGhlIGluZGV4Ci0gICAgICAgICAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgotICAgICAgICAgKi8KLSAgICAgICAgbWF4X2JsaW5kZXggPSBidWlsZF9ibF90cmVlKHMpOwotCi0gICAgICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSB0aGUgYmxvY2sgbGVuZ3RocyBpbiBieXRlcy4gKi8KLSAgICAgICAgb3B0X2xlbmIgPSAocy0+b3B0X2xlbiszKzcpPj4zOwotICAgICAgICBzdGF0aWNfbGVuYiA9IChzLT5zdGF0aWNfbGVuKzMrNyk+PjM7Ci0KLSAgICAgICAgVHJhY2V2KChzdGRlcnIsICJcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1ICIsCi0gICAgICAgICAgICAgICAgb3B0X2xlbmIsIHMtPm9wdF9sZW4sIHN0YXRpY19sZW5iLCBzLT5zdGF0aWNfbGVuLCBzdG9yZWRfbGVuLAotICAgICAgICAgICAgICAgIHMtPmxhc3RfbGl0KSk7Ci0KLSAgICAgICAgaWYgKHN0YXRpY19sZW5iIDw9IG9wdF9sZW5iKSBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgImxvc3QgYnVmIik7Ci0gICAgICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxvY2sgKi8KLSAgICB9Ci0KLSNpZmRlZiBGT1JDRV9TVE9SRUQKLSAgICBpZiAoYnVmICE9IChjaGFyKikwKSB7IC8qIGZvcmNlIHN0b3JlZCBibG9jayAqLwotI2Vsc2UKLSAgICBpZiAoc3RvcmVkX2xlbis0IDw9IG9wdF9sZW5iICYmIGJ1ZiAhPSAoY2hhciopMCkgewotICAgICAgICAgICAgICAgICAgICAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovCi0jZW5kaWYKLSAgICAgICAgLyogVGhlIHRlc3QgYnVmICE9IE5VTEwgaXMgb25seSBuZWNlc3NhcnkgaWYgTElUX0JVRlNJWkUgPiBXU0laRS4KLSAgICAgICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZQotICAgICAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW4KLSAgICAgICAgICogc3VjY2Vzc2Z1bC4gSWYgTElUX0JVRlNJWkUgPD0gV1NJWkUsIGl0IGlzIG5ldmVyIHRvbyBsYXRlIHRvCi0gICAgICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suCi0gICAgICAgICAqLwotICAgICAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgZW9mKTsKLQotI2lmZGVmIEZPUkNFX1NUQVRJQwotICAgIH0gZWxzZSBpZiAoc3RhdGljX2xlbmIgPj0gMCkgeyAvKiBmb3JjZSBzdGF0aWMgdHJlZXMgKi8KLSNlbHNlCi0gICAgfSBlbHNlIGlmIChzLT5zdHJhdGVneSA9PSBaX0ZJWEVEIHx8IHN0YXRpY19sZW5iID09IG9wdF9sZW5iKSB7Ci0jZW5kaWYKLSAgICAgICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVM8PDEpK2VvZiwgMyk7Ci0gICAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIChjdF9kYXRhICopc3RhdGljX2x0cmVlLCAoY3RfZGF0YSAqKXN0YXRpY19kdHJlZSk7Ci0jaWZkZWYgREVCVUcKLSAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMyArIHMtPnN0YXRpY19sZW47Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUzw8MSkrZW9mLCAzKTsKLSAgICAgICAgc2VuZF9hbGxfdHJlZXMocywgcy0+bF9kZXNjLm1heF9jb2RlKzEsIHMtPmRfZGVzYy5tYXhfY29kZSsxLAotICAgICAgICAgICAgICAgICAgICAgICBtYXhfYmxpbmRleCsxKTsKLSAgICAgICAgY29tcHJlc3NfYmxvY2socywgKGN0X2RhdGEgKilzLT5keW5fbHRyZWUsIChjdF9kYXRhICopcy0+ZHluX2R0cmVlKTsKLSNpZmRlZiBERUJVRwotICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAzICsgcy0+b3B0X2xlbjsKLSNlbmRpZgotICAgIH0KLSAgICBBc3NlcnQgKHMtPmNvbXByZXNzZWRfbGVuID09IHMtPmJpdHNfc2VudCwgImJhZCBjb21wcmVzc2VkIHNpemUiKTsKLSAgICAvKiBUaGUgYWJvdmUgY2hlY2sgaXMgbWFkZSBtb2QgMl4zMiwgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDUxMiBNQgotICAgICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLgotICAgICAqLwotICAgIGluaXRfYmxvY2socyk7Ci0KLSAgICBpZiAoZW9mKSB7Ci0gICAgICAgIGJpX3dpbmR1cChzKTsKLSNpZmRlZiBERUJVRwotICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSA3OyAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLwotI2VuZGlmCi0gICAgfQotICAgIFRyYWNldigoc3RkZXJyLCJcbmNvbXBybGVuICVsdSglbHUpICIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLAotICAgICAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03KmVvZikpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZgotICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLgotICovCi1pbnQgX3RyX3RhbGx5IChzLCBkaXN0LCBsYykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLwotICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqLwotewotICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9ICh1c2gpZGlzdDsKLSAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9ICh1Y2gpbGM7Ci0gICAgaWYgKGRpc3QgPT0gMCkgewotICAgICAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi8KLSAgICAgICAgcy0+ZHluX2x0cmVlW2xjXS5GcmVxKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcy0+bWF0Y2hlcysrOwotICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCi0gICAgICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqLwotICAgICAgICBBc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJgotICAgICAgICAgICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJgotICAgICAgICAgICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICAiX3RyX3RhbGx5OiBiYWQgbWF0Y2giKTsKLQotICAgICAgICBzLT5keW5fbHRyZWVbX2xlbmd0aF9jb2RlW2xjXStMSVRFUkFMUysxXS5GcmVxKys7Ci0gICAgICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsKLSAgICB9Ci0KLSNpZmRlZiBUUlVOQ0FURV9CTE9DSwotICAgIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqLwotICAgIGlmICgocy0+bGFzdF9saXQgJiAweDFmZmYpID09IDAgJiYgcy0+bGV2ZWwgPiAyKSB7Ci0gICAgICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqLwotICAgICAgICB1bGcgb3V0X2xlbmd0aCA9ICh1bGcpcy0+bGFzdF9saXQqOEw7Ci0gICAgICAgIHVsZyBpbl9sZW5ndGggPSAodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KTsKLSAgICAgICAgaW50IGRjb2RlOwotICAgICAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7Ci0gICAgICAgICAgICBvdXRfbGVuZ3RoICs9ICh1bGcpcy0+ZHluX2R0cmVlW2Rjb2RlXS5GcmVxICoKLSAgICAgICAgICAgICAgICAoNUwrZXh0cmFfZGJpdHNbZGNvZGVdKTsKLSAgICAgICAgfQotICAgICAgICBvdXRfbGVuZ3RoID4+PSAzOwotICAgICAgICBUcmFjZXYoKHN0ZGVyciwiXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgIiwKLSAgICAgICAgICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsCi0gICAgICAgICAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpOwotICAgICAgICBpZiAocy0+bWF0Y2hlcyA8IHMtPmxhc3RfbGl0LzIgJiYgb3V0X2xlbmd0aCA8IGluX2xlbmd0aC8yKSByZXR1cm4gMTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOwotICAgIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggbGl0X2J1ZnNpemUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0SwotICAgICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCi0gICAgICogNjRLLTEgYnl0ZXMuCi0gICAgICovCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzCi0gKi8KLWxvY2FsIHZvaWQgY29tcHJlc3NfYmxvY2socywgbHRyZWUsIGR0cmVlKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqLwotICAgIGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovCi17Ci0gICAgdW5zaWduZWQgZGlzdDsgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLwotICAgIGludCBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovCi0gICAgdW5zaWduZWQgbHggPSAwOyAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovCi0gICAgdW5zaWduZWQgY29kZTsgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovCi0gICAgaW50IGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovCi0KLSAgICBpZiAocy0+bGFzdF9saXQgIT0gMCkgZG8gewotICAgICAgICBkaXN0ID0gcy0+ZF9idWZbbHhdOwotICAgICAgICBsYyA9IHMtPmxfYnVmW2x4KytdOwotICAgICAgICBpZiAoZGlzdCA9PSAwKSB7Ci0gICAgICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqLwotICAgICAgICAgICAgVHJhY2Vjdihpc2dyYXBoKGxjKSwgKHN0ZGVyciwiICclYycgIiwgbGMpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi8KLSAgICAgICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdOwotICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUrTElURVJBTFMrMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqLwotICAgICAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTsKLSAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07Ci0gICAgICAgICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7ICAgICAgIC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi8KLSAgICAgICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7Ci0gICAgICAgICAgICBBc3NlcnQgKGNvZGUgPCBEX0NPREVTLCAiYmFkIGRfY29kZSIpOwotCi0gICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovCi0gICAgICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdOwotICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKLSAgICAgICAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTsKLSAgICAgICAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqLwotCi0gICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovCi0gICAgICAgIEFzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsCi0gICAgICAgICAgICAgICAicGVuZGluZ0J1ZiBvdmVyZmxvdyIpOwotCi0gICAgfSB3aGlsZSAobHggPCBzLT5sYXN0X2xpdCk7Ci0KLSAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7Ci0gICAgcy0+bGFzdF9lb2JfbGVuID0gbHRyZWVbRU5EX0JMT0NLXS5MZW47Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2V0IHRoZSBkYXRhIHR5cGUgdG8gQklOQVJZIG9yIFRFWFQsIHVzaW5nIGEgY3J1ZGUgYXBwcm94aW1hdGlvbjoKLSAqIHNldCBpdCB0byBaX1RFWFQgaWYgYWxsIHN5bWJvbHMgYXJlIGVpdGhlciBwcmludGFibGUgY2hhcmFjdGVycyAoMzMgdG8gMjU1KQotICogb3Igd2hpdGUgc3BhY2VzICg5IHRvIDEzLCBvciAzMik7IG9yIHNldCBpdCB0byBaX0JJTkFSWSBvdGhlcndpc2UuCi0gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgRnJlcSBvZiBkeW5fbHRyZWUgYXJlIHNldC4KLSAqLwotbG9jYWwgdm9pZCBzZXRfZGF0YV90eXBlKHMpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLXsKLSAgICBpbnQgbjsKLQotICAgIGZvciAobiA9IDA7IG4gPCA5OyBuKyspCi0gICAgICAgIGlmIChzLT5keW5fbHRyZWVbbl0uRnJlcSAhPSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgaWYgKG4gPT0gOSkKLSAgICAgICAgZm9yIChuID0gMTQ7IG4gPCAzMjsgbisrKQotICAgICAgICAgICAgaWYgKHMtPmR5bl9sdHJlZVtuXS5GcmVxICE9IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgcy0+c3RybS0+ZGF0YV90eXBlID0gKG4gPT0gMzIpID8gWl9URVhUIDogWl9CSU5BUlk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXIKLSAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSkKLSAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTUKLSAqLwotbG9jYWwgdW5zaWduZWQgYmlfcmV2ZXJzZShjb2RlLCBsZW4pCi0gICAgdW5zaWduZWQgY29kZTsgLyogdGhlIHZhbHVlIHRvIGludmVydCAqLwotICAgIGludCBsZW47ICAgICAgIC8qIGl0cyBiaXQgbGVuZ3RoICovCi17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgcmVzID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIHJlcyB8PSBjb2RlICYgMTsKLSAgICAgICAgY29kZSA+Pj0gMSwgcmVzIDw8PSAxOwotICAgIH0gd2hpbGUgKC0tbGVuID4gMCk7Ci0gICAgcmV0dXJuIHJlcyA+PiAxOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyLCBrZWVwaW5nIGF0IG1vc3QgNyBiaXRzIGluIGl0LgotICovCi1sb2NhbCB2b2lkIGJpX2ZsdXNoKHMpCi0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLXsKLSAgICBpZiAocy0+YmlfdmFsaWQgPT0gMTYpIHsKLSAgICAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7Ci0gICAgICAgIHMtPmJpX2J1ZiA9IDA7Ci0gICAgICAgIHMtPmJpX3ZhbGlkID0gMDsKLSAgICB9IGVsc2UgaWYgKHMtPmJpX3ZhbGlkID49IDgpIHsKLSAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpcy0+YmlfYnVmKTsKLSAgICAgICAgcy0+YmlfYnVmID4+PSA4OwotICAgICAgICBzLT5iaV92YWxpZCAtPSA4OwotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciBhbmQgYWxpZ24gdGhlIG91dHB1dCBvbiBhIGJ5dGUgYm91bmRhcnkKLSAqLwotbG9jYWwgdm9pZCBiaV93aW5kdXAocykKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotewotICAgIGlmIChzLT5iaV92YWxpZCA+IDgpIHsKLSAgICAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7Ci0gICAgfSBlbHNlIGlmIChzLT5iaV92YWxpZCA+IDApIHsKLSAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpcy0+YmlfYnVmKTsKLSAgICB9Ci0gICAgcy0+YmlfYnVmID0gMDsKLSAgICBzLT5iaV92YWxpZCA9IDA7Ci0jaWZkZWYgREVCVUcKLSAgICBzLT5iaXRzX3NlbnQgPSAocy0+Yml0c19zZW50KzcpICYgfjc7Ci0jZW5kaWYKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0cwotICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuCi0gKi8KLWxvY2FsIHZvaWQgY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKQotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgY2hhcmYgICAgKmJ1ZjsgICAgLyogdGhlIGlucHV0IGRhdGEgKi8KLSAgICB1bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovCi0gICAgaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovCi17Ci0gICAgYmlfd2luZHVwKHMpOyAgICAgICAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLwotICAgIHMtPmxhc3RfZW9iX2xlbiA9IDg7IC8qIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUgKi8KLQotICAgIGlmIChoZWFkZXIpIHsKLSAgICAgICAgcHV0X3Nob3J0KHMsICh1c2gpbGVuKTsKLSAgICAgICAgcHV0X3Nob3J0KHMsICh1c2gpfmxlbik7Ci0jaWZkZWYgREVCVUcKLSAgICAgICAgcy0+Yml0c19zZW50ICs9IDIqMTY7Ci0jZW5kaWYKLSAgICB9Ci0jaWZkZWYgREVCVUcKLSAgICBzLT5iaXRzX3NlbnQgKz0gKHVsZylsZW48PDM7Ci0jZW5kaWYKLSAgICB3aGlsZSAobGVuLS0pIHsKLSAgICAgICAgcHV0X2J5dGUocywgKmJ1ZisrKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJzL3psaWIvdHJlZXMuaCBiL2xpYnMvemxpYi90cmVlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmZhY2Y5Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi90cmVlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovCi0KLWxvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl0gPSB7Ci17eyAxMn0seyAgOH19LCB7ezE0MH0seyAgOH19LCB7eyA3Nn0seyAgOH19LCB7ezIwNH0seyAgOH19LCB7eyA0NH0seyAgOH19LAote3sxNzJ9LHsgIDh9fSwge3sxMDh9LHsgIDh9fSwge3syMzZ9LHsgIDh9fSwge3sgMjh9LHsgIDh9fSwge3sxNTZ9LHsgIDh9fSwKLXt7IDkyfSx7ICA4fX0sIHt7MjIwfSx7ICA4fX0sIHt7IDYwfSx7ICA4fX0sIHt7MTg4fSx7ICA4fX0sIHt7MTI0fSx7ICA4fX0sCi17ezI1Mn0seyAgOH19LCB7eyAgMn0seyAgOH19LCB7ezEzMH0seyAgOH19LCB7eyA2Nn0seyAgOH19LCB7ezE5NH0seyAgOH19LAote3sgMzR9LHsgIDh9fSwge3sxNjJ9LHsgIDh9fSwge3sgOTh9LHsgIDh9fSwge3syMjZ9LHsgIDh9fSwge3sgMTh9LHsgIDh9fSwKLXt7MTQ2fSx7ICA4fX0sIHt7IDgyfSx7ICA4fX0sIHt7MjEwfSx7ICA4fX0sIHt7IDUwfSx7ICA4fX0sIHt7MTc4fSx7ICA4fX0sCi17ezExNH0seyAgOH19LCB7ezI0Mn0seyAgOH19LCB7eyAxMH0seyAgOH19LCB7ezEzOH0seyAgOH19LCB7eyA3NH0seyAgOH19LAote3syMDJ9LHsgIDh9fSwge3sgNDJ9LHsgIDh9fSwge3sxNzB9LHsgIDh9fSwge3sxMDZ9LHsgIDh9fSwge3syMzR9LHsgIDh9fSwKLXt7IDI2fSx7ICA4fX0sIHt7MTU0fSx7ICA4fX0sIHt7IDkwfSx7ICA4fX0sIHt7MjE4fSx7ICA4fX0sIHt7IDU4fSx7ICA4fX0sCi17ezE4Nn0seyAgOH19LCB7ezEyMn0seyAgOH19LCB7ezI1MH0seyAgOH19LCB7eyAgNn0seyAgOH19LCB7ezEzNH0seyAgOH19LAote3sgNzB9LHsgIDh9fSwge3sxOTh9LHsgIDh9fSwge3sgMzh9LHsgIDh9fSwge3sxNjZ9LHsgIDh9fSwge3sxMDJ9LHsgIDh9fSwKLXt7MjMwfSx7ICA4fX0sIHt7IDIyfSx7ICA4fX0sIHt7MTUwfSx7ICA4fX0sIHt7IDg2fSx7ICA4fX0sIHt7MjE0fSx7ICA4fX0sCi17eyA1NH0seyAgOH19LCB7ezE4Mn0seyAgOH19LCB7ezExOH0seyAgOH19LCB7ezI0Nn0seyAgOH19LCB7eyAxNH0seyAgOH19LAote3sxNDJ9LHsgIDh9fSwge3sgNzh9LHsgIDh9fSwge3syMDZ9LHsgIDh9fSwge3sgNDZ9LHsgIDh9fSwge3sxNzR9LHsgIDh9fSwKLXt7MTEwfSx7ICA4fX0sIHt7MjM4fSx7ICA4fX0sIHt7IDMwfSx7ICA4fX0sIHt7MTU4fSx7ICA4fX0sIHt7IDk0fSx7ICA4fX0sCi17ezIyMn0seyAgOH19LCB7eyA2Mn0seyAgOH19LCB7ezE5MH0seyAgOH19LCB7ezEyNn0seyAgOH19LCB7ezI1NH0seyAgOH19LAote3sgIDF9LHsgIDh9fSwge3sxMjl9LHsgIDh9fSwge3sgNjV9LHsgIDh9fSwge3sxOTN9LHsgIDh9fSwge3sgMzN9LHsgIDh9fSwKLXt7MTYxfSx7ICA4fX0sIHt7IDk3fSx7ICA4fX0sIHt7MjI1fSx7ICA4fX0sIHt7IDE3fSx7ICA4fX0sIHt7MTQ1fSx7ICA4fX0sCi17eyA4MX0seyAgOH19LCB7ezIwOX0seyAgOH19LCB7eyA0OX0seyAgOH19LCB7ezE3N30seyAgOH19LCB7ezExM30seyAgOH19LAote3syNDF9LHsgIDh9fSwge3sgIDl9LHsgIDh9fSwge3sxMzd9LHsgIDh9fSwge3sgNzN9LHsgIDh9fSwge3syMDF9LHsgIDh9fSwKLXt7IDQxfSx7ICA4fX0sIHt7MTY5fSx7ICA4fX0sIHt7MTA1fSx7ICA4fX0sIHt7MjMzfSx7ICA4fX0sIHt7IDI1fSx7ICA4fX0sCi17ezE1M30seyAgOH19LCB7eyA4OX0seyAgOH19LCB7ezIxN30seyAgOH19LCB7eyA1N30seyAgOH19LCB7ezE4NX0seyAgOH19LAote3sxMjF9LHsgIDh9fSwge3syNDl9LHsgIDh9fSwge3sgIDV9LHsgIDh9fSwge3sxMzN9LHsgIDh9fSwge3sgNjl9LHsgIDh9fSwKLXt7MTk3fSx7ICA4fX0sIHt7IDM3fSx7ICA4fX0sIHt7MTY1fSx7ICA4fX0sIHt7MTAxfSx7ICA4fX0sIHt7MjI5fSx7ICA4fX0sCi17eyAyMX0seyAgOH19LCB7ezE0OX0seyAgOH19LCB7eyA4NX0seyAgOH19LCB7ezIxM30seyAgOH19LCB7eyA1M30seyAgOH19LAote3sxODF9LHsgIDh9fSwge3sxMTd9LHsgIDh9fSwge3syNDV9LHsgIDh9fSwge3sgMTN9LHsgIDh9fSwge3sxNDF9LHsgIDh9fSwKLXt7IDc3fSx7ICA4fX0sIHt7MjA1fSx7ICA4fX0sIHt7IDQ1fSx7ICA4fX0sIHt7MTczfSx7ICA4fX0sIHt7MTA5fSx7ICA4fX0sCi17ezIzN30seyAgOH19LCB7eyAyOX0seyAgOH19LCB7ezE1N30seyAgOH19LCB7eyA5M30seyAgOH19LCB7ezIyMX0seyAgOH19LAote3sgNjF9LHsgIDh9fSwge3sxODl9LHsgIDh9fSwge3sxMjV9LHsgIDh9fSwge3syNTN9LHsgIDh9fSwge3sgMTl9LHsgIDl9fSwKLXt7Mjc1fSx7ICA5fX0sIHt7MTQ3fSx7ICA5fX0sIHt7NDAzfSx7ICA5fX0sIHt7IDgzfSx7ICA5fX0sIHt7MzM5fSx7ICA5fX0sCi17ezIxMX0seyAgOX19LCB7ezQ2N30seyAgOX19LCB7eyA1MX0seyAgOX19LCB7ezMwN30seyAgOX19LCB7ezE3OX0seyAgOX19LAote3s0MzV9LHsgIDl9fSwge3sxMTV9LHsgIDl9fSwge3szNzF9LHsgIDl9fSwge3syNDN9LHsgIDl9fSwge3s0OTl9LHsgIDl9fSwKLXt7IDExfSx7ICA5fX0sIHt7MjY3fSx7ICA5fX0sIHt7MTM5fSx7ICA5fX0sIHt7Mzk1fSx7ICA5fX0sIHt7IDc1fSx7ICA5fX0sCi17ezMzMX0seyAgOX19LCB7ezIwM30seyAgOX19LCB7ezQ1OX0seyAgOX19LCB7eyA0M30seyAgOX19LCB7ezI5OX0seyAgOX19LAote3sxNzF9LHsgIDl9fSwge3s0Mjd9LHsgIDl9fSwge3sxMDd9LHsgIDl9fSwge3szNjN9LHsgIDl9fSwge3syMzV9LHsgIDl9fSwKLXt7NDkxfSx7ICA5fX0sIHt7IDI3fSx7ICA5fX0sIHt7MjgzfSx7ICA5fX0sIHt7MTU1fSx7ICA5fX0sIHt7NDExfSx7ICA5fX0sCi17eyA5MX0seyAgOX19LCB7ezM0N30seyAgOX19LCB7ezIxOX0seyAgOX19LCB7ezQ3NX0seyAgOX19LCB7eyA1OX0seyAgOX19LAote3szMTV9LHsgIDl9fSwge3sxODd9LHsgIDl9fSwge3s0NDN9LHsgIDl9fSwge3sxMjN9LHsgIDl9fSwge3szNzl9LHsgIDl9fSwKLXt7MjUxfSx7ICA5fX0sIHt7NTA3fSx7ICA5fX0sIHt7ICA3fSx7ICA5fX0sIHt7MjYzfSx7ICA5fX0sIHt7MTM1fSx7ICA5fX0sCi17ezM5MX0seyAgOX19LCB7eyA3MX0seyAgOX19LCB7ezMyN30seyAgOX19LCB7ezE5OX0seyAgOX19LCB7ezQ1NX0seyAgOX19LAote3sgMzl9LHsgIDl9fSwge3syOTV9LHsgIDl9fSwge3sxNjd9LHsgIDl9fSwge3s0MjN9LHsgIDl9fSwge3sxMDN9LHsgIDl9fSwKLXt7MzU5fSx7ICA5fX0sIHt7MjMxfSx7ICA5fX0sIHt7NDg3fSx7ICA5fX0sIHt7IDIzfSx7ICA5fX0sIHt7Mjc5fSx7ICA5fX0sCi17ezE1MX0seyAgOX19LCB7ezQwN30seyAgOX19LCB7eyA4N30seyAgOX19LCB7ezM0M30seyAgOX19LCB7ezIxNX0seyAgOX19LAote3s0NzF9LHsgIDl9fSwge3sgNTV9LHsgIDl9fSwge3szMTF9LHsgIDl9fSwge3sxODN9LHsgIDl9fSwge3s0Mzl9LHsgIDl9fSwKLXt7MTE5fSx7ICA5fX0sIHt7Mzc1fSx7ICA5fX0sIHt7MjQ3fSx7ICA5fX0sIHt7NTAzfSx7ICA5fX0sIHt7IDE1fSx7ICA5fX0sCi17ezI3MX0seyAgOX19LCB7ezE0M30seyAgOX19LCB7ezM5OX0seyAgOX19LCB7eyA3OX0seyAgOX19LCB7ezMzNX0seyAgOX19LAote3syMDd9LHsgIDl9fSwge3s0NjN9LHsgIDl9fSwge3sgNDd9LHsgIDl9fSwge3szMDN9LHsgIDl9fSwge3sxNzV9LHsgIDl9fSwKLXt7NDMxfSx7ICA5fX0sIHt7MTExfSx7ICA5fX0sIHt7MzY3fSx7ICA5fX0sIHt7MjM5fSx7ICA5fX0sIHt7NDk1fSx7ICA5fX0sCi17eyAzMX0seyAgOX19LCB7ezI4N30seyAgOX19LCB7ezE1OX0seyAgOX19LCB7ezQxNX0seyAgOX19LCB7eyA5NX0seyAgOX19LAote3szNTF9LHsgIDl9fSwge3syMjN9LHsgIDl9fSwge3s0Nzl9LHsgIDl9fSwge3sgNjN9LHsgIDl9fSwge3szMTl9LHsgIDl9fSwKLXt7MTkxfSx7ICA5fX0sIHt7NDQ3fSx7ICA5fX0sIHt7MTI3fSx7ICA5fX0sIHt7MzgzfSx7ICA5fX0sIHt7MjU1fSx7ICA5fX0sCi17ezUxMX0seyAgOX19LCB7eyAgMH0seyAgN319LCB7eyA2NH0seyAgN319LCB7eyAzMn0seyAgN319LCB7eyA5Nn0seyAgN319LAote3sgMTZ9LHsgIDd9fSwge3sgODB9LHsgIDd9fSwge3sgNDh9LHsgIDd9fSwge3sxMTJ9LHsgIDd9fSwge3sgIDh9LHsgIDd9fSwKLXt7IDcyfSx7ICA3fX0sIHt7IDQwfSx7ICA3fX0sIHt7MTA0fSx7ICA3fX0sIHt7IDI0fSx7ICA3fX0sIHt7IDg4fSx7ICA3fX0sCi17eyA1Nn0seyAgN319LCB7ezEyMH0seyAgN319LCB7eyAgNH0seyAgN319LCB7eyA2OH0seyAgN319LCB7eyAzNn0seyAgN319LAote3sxMDB9LHsgIDd9fSwge3sgMjB9LHsgIDd9fSwge3sgODR9LHsgIDd9fSwge3sgNTJ9LHsgIDd9fSwge3sxMTZ9LHsgIDd9fSwKLXt7ICAzfSx7ICA4fX0sIHt7MTMxfSx7ICA4fX0sIHt7IDY3fSx7ICA4fX0sIHt7MTk1fSx7ICA4fX0sIHt7IDM1fSx7ICA4fX0sCi17ezE2M30seyAgOH19LCB7eyA5OX0seyAgOH19LCB7ezIyN30seyAgOH19Ci19OwotCi1sb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXSA9IHsKLXt7IDB9LHsgNX19LCB7ezE2fSx7IDV9fSwge3sgOH0seyA1fX0sIHt7MjR9LHsgNX19LCB7eyA0fSx7IDV9fSwKLXt7MjB9LHsgNX19LCB7ezEyfSx7IDV9fSwge3syOH0seyA1fX0sIHt7IDJ9LHsgNX19LCB7ezE4fSx7IDV9fSwKLXt7MTB9LHsgNX19LCB7ezI2fSx7IDV9fSwge3sgNn0seyA1fX0sIHt7MjJ9LHsgNX19LCB7ezE0fSx7IDV9fSwKLXt7MzB9LHsgNX19LCB7eyAxfSx7IDV9fSwge3sxN30seyA1fX0sIHt7IDl9LHsgNX19LCB7ezI1fSx7IDV9fSwKLXt7IDV9LHsgNX19LCB7ezIxfSx7IDV9fSwge3sxM30seyA1fX0sIHt7Mjl9LHsgNX19LCB7eyAzfSx7IDV9fSwKLXt7MTl9LHsgNX19LCB7ezExfSx7IDV9fSwge3syN30seyA1fX0sIHt7IDd9LHsgNX19LCB7ezIzfSx7IDV9fQotfTsKLQotY29uc3QgdWNoIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7Ci0gMCwgIDEsICAyLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsCi0gOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCi0xMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCi0xMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCi0xMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsCi0xMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0xMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0xNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0xNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0xNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0xNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0xNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0xNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgIDAsICAwLCAxNiwgMTcsCi0xOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsCi0yMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCi0yNCwgMjQsIDI0LCAyNCwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsCi0yNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCi0yNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCi0yNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCi0yNywgMjcsIDI3LCAyNywgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCi0yOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCi0yOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCi0yOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCi0yOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCi0yOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCi0yOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5Ci19OwotCi1jb25zdCB1Y2ggX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV09IHsKLSAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwKLTEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLTE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwKLTE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwKLTIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwKLTIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywKLTIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKLTI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKLTI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwKLTI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKLTI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKLTI2LCAyNiwgMjYsIDI2LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKLTI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI4Ci19OwotCi1sb2NhbCBjb25zdCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXSA9IHsKLTAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDEwLCAxMiwgMTQsIDE2LCAyMCwgMjQsIDI4LCAzMiwgNDAsIDQ4LCA1NiwKLTY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAwCi19OwotCi1sb2NhbCBjb25zdCBpbnQgYmFzZV9kaXN0W0RfQ09ERVNdID0gewotICAgIDAsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNiwgICAgIDgsICAgIDEyLCAgICAxNiwgICAgMjQsCi0gICAzMiwgICAgNDgsICAgIDY0LCAgICA5NiwgICAxMjgsICAgMTkyLCAgIDI1NiwgICAzODQsICAgNTEyLCAgIDc2OCwKLSAxMDI0LCAgMTUzNiwgIDIwNDgsICAzMDcyLCAgNDA5NiwgIDYxNDQsICA4MTkyLCAxMjI4OCwgMTYzODQsIDI0NTc2Ci19OwotCmRpZmYgLS1naXQgYS9saWJzL3psaWIvdW5jb21wci5jIGIvbGlicy96bGliL3VuY29tcHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5ZTNkMC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvdW5jb21wci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogdW5jb21wci5jIC0tIGRlY29tcHJlc3MgYSBtZW1vcnkgYnVmZmVyCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jZGVmaW5lIFpMSUJfSU5URVJOQUwKLSNpbmNsdWRlICJ6bGliLmgiCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCi0gICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCi0gICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCi0gICBlbnRpcmUgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlCi0gICBiZWVuIHNhdmVkIHByZXZpb3VzbHkgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IKLSAgIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pCi0gICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KLSAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkZWNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQotICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgotCi0gICAgIHVuY29tcHJlc3MgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKLSAgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAotICAgYnVmZmVyLCBvciBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzIGNvcnJ1cHRlZC4KLSovCi1pbnQgWkVYUE9SVCB1bmNvbXByZXNzIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbikKLSAgICBCeXRlZiAqZGVzdDsKLSAgICB1TG9uZ2YgKmRlc3RMZW47Ci0gICAgY29uc3QgQnl0ZWYgKnNvdXJjZTsKLSAgICB1TG9uZyBzb3VyY2VMZW47Ci17Ci0gICAgel9zdHJlYW0gc3RyZWFtOwotICAgIGludCBlcnI7Ci0KLSAgICBzdHJlYW0ubmV4dF9pbiA9IChCeXRlZiopc291cmNlOwotICAgIHN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXNvdXJjZUxlbjsKLSAgICAvKiBDaGVjayBmb3Igc291cmNlID4gNjRLIG9uIDE2LWJpdCBtYWNoaW5lOiAqLwotICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX2luICE9IHNvdXJjZUxlbikgcmV0dXJuIFpfQlVGX0VSUk9SOwotCi0gICAgc3RyZWFtLm5leHRfb3V0ID0gZGVzdDsKLSAgICBzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmRlc3RMZW47Ci0gICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfb3V0ICE9ICpkZXN0TGVuKSByZXR1cm4gWl9CVUZfRVJST1I7Ci0KLSAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0KLSAgICBlcnIgPSBpbmZsYXRlSW5pdCgmc3RyZWFtKTsKLSAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBlcnI7Ci0KLSAgICBlcnIgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKLSAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgewotICAgICAgICBpbmZsYXRlRW5kKCZzdHJlYW0pOwotICAgICAgICBpZiAoZXJyID09IFpfTkVFRF9ESUNUIHx8IChlcnIgPT0gWl9CVUZfRVJST1IgJiYgc3RyZWFtLmF2YWlsX2luID09IDApKQotICAgICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgKmRlc3RMZW4gPSBzdHJlYW0udG90YWxfb3V0OwotCi0gICAgZXJyID0gaW5mbGF0ZUVuZCgmc3RyZWFtKTsKLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3dpbjMyL0RMTF9GQVEudHh0IGIvbGlicy96bGliL3dpbjMyL0RMTF9GQVEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjE4ZTA3Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi93aW4zMi9ETExfRkFRLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0KLSAgICAgICAgICAgIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IFpMSUIxLkRMTAotCi0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBkZXNpZ24sIHRoZSByYXRpb25hbGUsIGFuZCB0aGUgdXNhZ2UKLW9mIHRoZSBvZmZpY2lhbCBETEwgYnVpbGQgb2YgemxpYiwgbmFtZWQgWkxJQjEuRExMLiAgSWYgeW91IGhhdmUKLWdlbmVyYWwgcXVlc3Rpb25zIGFib3V0IHpsaWIsIHlvdSBzaG91bGQgc2VlIHRoZSBmaWxlICJGQVEiIGZvdW5kCi1pbiB0aGUgemxpYiBkaXN0cmlidXRpb24sIG9yIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sCi0KLQotIDEuIFdoYXQgaXMgWkxJQjEuRExMLCBhbmQgaG93IGNhbiBJIGdldCBpdD8KLQotICAtIFpMSUIxLkRMTCBpcyB0aGUgb2ZmaWNpYWwgYnVpbGQgb2YgemxpYiBhcyBhIERMTC4KLSAgICAoUGxlYXNlIHJlbWFyayB0aGUgY2hhcmFjdGVyICcxJyBpbiB0aGUgbmFtZS4pCi0KLSAgICBQb2ludGVycyB0byBhIHByZWNvbXBpbGVkIFpMSUIxLkRMTCBjYW4gYmUgZm91bmQgaW4gdGhlIHpsaWIKLSAgICB3ZWIgc2l0ZSBhdDoKLSAgICAgIGh0dHA6Ly93d3cuemxpYi5vcmcvCi0KLSAgICBBcHBsaWNhdGlvbnMgdGhhdCBsaW5rIHRvIFpMSUIxLkRMTCBjYW4gcmVseSBvbiB0aGUgZm9sbG93aW5nCi0gICAgc3BlY2lmaWNhdGlvbjoKLQotICAgICogVGhlIGV4cG9ydGVkIHN5bWJvbHMgYXJlIGV4Y2x1c2l2ZWx5IGRlZmluZWQgaW4gdGhlIHNvdXJjZQotICAgICAgZmlsZXMgInpsaWIuaCIgYW5kICJ6bGliLmRlZiIsIGZvdW5kIGluIGFuIG9mZmljaWFsIHpsaWIKLSAgICAgIHNvdXJjZSBkaXN0cmlidXRpb24uCi0gICAgKiBUaGUgc3ltYm9scyBhcmUgZXhwb3J0ZWQgYnkgbmFtZSwgbm90IGJ5IG9yZGluYWwuCi0gICAgKiBUaGUgZXhwb3J0ZWQgbmFtZXMgYXJlIHVuZGVjb3JhdGVkLgotICAgICogVGhlIGNhbGxpbmcgY29udmVudGlvbiBvZiBmdW5jdGlvbnMgaXMgIkMiIChDREVDTCkuCi0gICAgKiBUaGUgWkxJQjEuRExMIGJpbmFyeSBpcyBsaW5rZWQgdG8gTVNWQ1JULkRMTC4KLQotICAgIFRoZSBhcmNoaXZlIGluIHdoaWNoIFpMSUIxLkRMTCBpcyBidW5kbGVkIGNvbnRhaW5zIGNvbXBpbGVkCi0gICAgdGVzdCBwcm9ncmFtcyB0aGF0IG11c3QgcnVuIHdpdGggYSB2YWxpZCBidWlsZCBvZiBaTElCMS5ETEwuCi0gICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gZG93bmxvYWQgdGhlIHByZWJ1aWx0IERMTCBmcm9tIHRoZSB6bGliCi0gICAgd2ViIHNpdGUsIGluc3RlYWQgb2YgYnVpbGRpbmcgaXQgeW91cnNlbGYsIHRvIGF2b2lkIHBvdGVudGlhbAotICAgIGluY29tcGF0aWJpbGl0aWVzIHRoYXQgY291bGQgYmUgaW50cm9kdWNlZCBieSB5b3VyIGNvbXBpbGVyCi0gICAgYW5kIGJ1aWxkIHNldHRpbmdzLiAgSWYgeW91IGRvIGJ1aWxkIHRoZSBETEwgeW91cnNlbGYsIHBsZWFzZQotICAgIG1ha2Ugc3VyZSB0aGF0IGl0IGNvbXBsaWVzIHdpdGggYWxsIHRoZSBhYm92ZSByZXF1aXJlbWVudHMsCi0gICAgYW5kIGl0IHJ1bnMgd2l0aCB0aGUgcHJlY29tcGlsZWQgdGVzdCBwcm9ncmFtcywgYnVuZGxlZCB3aXRoCi0gICAgdGhlIG9yaWdpbmFsIFpMSUIxLkRMTCBkaXN0cmlidXRpb24uCi0KLSAgICBJZiwgZm9yIGFueSByZWFzb24sIHlvdSBuZWVkIHRvIGJ1aWxkIGFuIGluY29tcGF0aWJsZSBETEwsCi0gICAgcGxlYXNlIHVzZSBhIGRpZmZlcmVudCBmaWxlIG5hbWUuCi0KLQotIDIuIFdoeSBkaWQgeW91IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgRExMIHRvIFpMSUIxLkRMTD8KLSAgICBXaGF0IGhhcHBlbmVkIHRvIHRoZSBvbGQgWkxJQi5ETEw/Ci0KLSAgLSBUaGUgb2xkIFpMSUIuRExMLCBidWlsdCBmcm9tIHpsaWItMS4xLjQgb3IgZWFybGllciwgcmVxdWlyZWQKLSAgICBjb21waWxhdGlvbiBzZXR0aW5ncyB0aGF0IHdlcmUgaW5jb21wYXRpYmxlIHRvIHRob3NlIHVzZWQgYnkKLSAgICBhIHN0YXRpYyBidWlsZC4gIFRoZSBETEwgc2V0dGluZ3Mgd2VyZSBzdXBwb3NlZCB0byBiZSBlbmFibGVkCi0gICAgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIFpMSUJfRExMLCBiZWZvcmUgaW5jbHVkaW5nICJ6bGliLmgiLgotICAgIEluY29ycmVjdCBoYW5kbGluZyBvZiB0aGlzIG1hY3JvIHdhcyBzaWxlbnRseSBhY2NlcHRlZCBhdAotICAgIGJ1aWxkIHRpbWUsIHJlc3VsdGluZyBpbiB0d28gbWFqb3IgcHJvYmxlbXM6Ci0KLSAgICAqIFpMSUJfRExMIHdhcyBtaXNzaW5nIGZyb20gdGhlIG9sZCBtYWtlZmlsZS4gIFdoZW4gYnVpbGRpbmcKLSAgICAgIHRoZSBETEwsIG5vdCBhbGwgcGVvcGxlIGFkZGVkIGl0IHRvIHRoZSBidWlsZCBvcHRpb25zLiAgSW4KLSAgICAgIGNvbnNlcXVlbmNlLCBpbmNvbXBhdGlibGUgaW5jYXJuYXRpb25zIG9mIFpMSUIuRExMIHN0YXJ0ZWQKLSAgICAgIHRvIGNpcmN1bGF0ZSBhcm91bmQgdGhlIG5ldC4KLQotICAgICogV2hlbiBzd2l0Y2hpbmcgZnJvbSB1c2luZyB0aGUgc3RhdGljIGxpYnJhcnkgdG8gdXNpbmcgdGhlCi0gICAgICBETEwsIGFwcGxpY2F0aW9ucyBoYWQgdG8gZGVmaW5lIHRoZSBaTElCX0RMTCBtYWNybyBhbmQKLSAgICAgIHRvIHJlY29tcGlsZSBhbGwgdGhlIHNvdXJjZXMgdGhhdCBjb250YWluZWQgY2FsbHMgdG8gemxpYgotICAgICAgZnVuY3Rpb25zLiAgRmFpbHVyZSB0byBkbyBzbyByZXN1bHRlZCBpbiBjcmVhdGluZyBiaW5hcmllcwotICAgICAgdGhhdCB3ZXJlIHVuYWJsZSB0byBydW4gd2l0aCB0aGUgb2ZmaWNpYWwgWkxJQi5ETEwgYnVpbGQuCi0KLSAgICBUaGUgb25seSBwb3NzaWJsZSBzb2x1dGlvbiB0aGF0IHdlIGNvdWxkIGZvcmVzZWUgd2FzIHRvIG1ha2UKLSAgICBhIGJpbmFyeS1pbmNvbXBhdGlibGUgY2hhbmdlIGluIHRoZSBETEwgaW50ZXJmYWNlLCBpbiBvcmRlciB0bwotICAgIHJlbW92ZSB0aGUgZGVwZW5kZW5jeSBvbiB0aGUgWkxJQl9ETEwgbWFjcm8sIGFuZCB0byByZWxlYXNlCi0gICAgdGhlIG5ldyBETEwgdW5kZXIgYSBkaWZmZXJlbnQgbmFtZS4KLQotICAgIFdlIGNob3NlIHRoZSBuYW1lIFpMSUIxLkRMTCwgd2hlcmUgJzEnIGluZGljYXRlcyB0aGUgbWFqb3IKLSAgICB6bGliIHZlcnNpb24gbnVtYmVyLiAgV2UgaG9wZSB0aGF0IHdlIHdpbGwgbm90IGhhdmUgdG8gYnJlYWsKLSAgICB0aGUgYmluYXJ5IGNvbXBhdGliaWxpdHkgYWdhaW4sIGF0IGxlYXN0IG5vdCBhcyBsb25nIGFzIHRoZQotICAgIHpsaWItMS54IHNlcmllcyB3aWxsIGxhc3QuCi0KLSAgICBUaGVyZSBpcyBzdGlsbCBhIFpMSUJfRExMIG1hY3JvLCB0aGF0IGNhbiB0cmlnZ2VyIGEgbW9yZQotICAgIGVmZmljaWVudCBidWlsZCBhbmQgdXNlIG9mIHRoZSBETEwsIGJ1dCBjb21wYXRpYmlsaXR5IG5vCi0gICAgbG9uZ2VyIGRlcGVuZGVudHMgb24gaXQuCi0KLQotIDMuIENhbiBJIGJ1aWxkIFpMSUIuRExMIGZyb20gdGhlIG5ldyB6bGliIHNvdXJjZXMsIGFuZCByZXBsYWNlCi0gICAgYW4gb2xkIFpMSUIuRExMLCB0aGF0IHdhcyBidWlsdCBmcm9tIHpsaWItMS4xLjQgb3IgZWFybGllcj8KLQotICAtIEluIHByaW5jaXBsZSwgeW91IGNhbiBkbyBpdCBieSBhc3NpZ25pbmcgY2FsbGluZyBjb252ZW50aW9uCi0gICAga2V5d29yZHMgdG8gdGhlIG1hY3JvcyBaRVhQT1JUIGFuZCBaRVhQT1JUVkEuICBJbiBwcmFjdGljZSwKLSAgICBpdCBkZXBlbmRzIG9uIHdoYXQgeW91IG1lYW4gYnkgImFuIG9sZCBaTElCLkRMTCIsIGJlY2F1c2UgdGhlCi0gICAgb2xkIERMTCBleGlzdHMgaW4gc2V2ZXJhbCBtdXR1YWxseS1pbmNvbXBhdGlibGUgdmVyc2lvbnMuCi0gICAgWW91IGhhdmUgdG8gZmluZCBvdXQgZmlyc3Qgd2hhdCBraW5kIG9mIGNhbGxpbmcgY29udmVudGlvbiBpcwotICAgIGJlaW5nIHVzZWQgaW4geW91ciBwYXJ0aWN1bGFyIFpMSUIuRExMIGJ1aWxkLCBhbmQgdG8gdXNlIHRoZQotICAgIHNhbWUgb25lIGluIHRoZSBuZXcgYnVpbGQuICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMgYWxsCi0gICAgYWJvdXQsIHlvdSBtaWdodCBiZSBiZXR0ZXIgb2ZmIGlmIHlvdSB3b3VsZCBqdXN0IGxlYXZlIHRoZSBvbGQKLSAgICBETEwgaW50YWN0LgotCi0KLSA0LiBDYW4gSSBjb21waWxlIG15IGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBuZXcgemxpYiBpbnRlcmZhY2UsIGFuZAotICAgIGxpbmsgaXQgdG8gYW4gb2xkIFpMSUIuRExMLCB0aGF0IHdhcyBidWlsdCBmcm9tIHpsaWItMS4xLjQgb3IKLSAgICBlYXJsaWVyPwotCi0gIC0gVGhlIG9mZmljaWFsIGFuc3dlciBpcyAibm8iOyB0aGUgcmVhbCBhbnN3ZXIgZGVwZW5kcyBhZ2FpbiBvbgotICAgIHdoYXQga2luZCBvZiBaTElCLkRMTCB5b3UgaGF2ZS4gIEV2ZW4gaWYgeW91IGFyZSBsdWNreSwgdGhpcwotICAgIGNvdXJzZSBvZiBhY3Rpb24gaXMgdW5yZWxpYWJsZS4KLQotICAgIElmIHlvdSByZWJ1aWxkIHlvdXIgYXBwbGljYXRpb24gYW5kIHlvdSBpbnRlbmQgdG8gdXNlIGEgbmV3ZXIKLSAgICB2ZXJzaW9uIG9mIHpsaWIgKHBvc3QtIDEuMS40KSwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8KLSAgICBsaW5rIGl0IHRvIHRoZSBuZXcgWkxJQjEuRExMLgotCi0KLSA1LiBXaHkgYXJlIHRoZSB6bGliIHN5bWJvbHMgZXhwb3J0ZWQgYnkgbmFtZSwgYW5kIG5vdCBieSBvcmRpbmFsPwotCi0gIC0gQWx0aG91Z2ggZXhwb3J0aW5nIHN5bWJvbHMgYnkgb3JkaW5hbCBpcyBhIGxpdHRsZSBmYXN0ZXIsIGl0Ci0gICAgaXMgcmlza3kuICBBbnkgc2luZ2xlIGdsaXRjaCBpbiB0aGUgbWFpbnRlbmFuY2Ugb3IgdXNlIG9mIHRoZQotICAgIERFRiBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG9yZGluYWxzIGNhbiByZXN1bHQgaW4gaW5jb21wYXRpYmxlCi0gICAgYnVpbGRzIGFuZCBmcnVzdHJhdGluZyBjcmFzaGVzLiAgU2ltcGx5IHB1dCwgdGhlIGJlbmVmaXRzIG9mCi0gICAgZXhwb3J0aW5nIHN5bWJvbHMgYnkgb3JkaW5hbCBkbyBub3QganVzdGlmeSB0aGUgcmlza3MuCi0KLSAgICBUZWNobmljYWxseSwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIG1haW50YWluIG9yZGluYWxzIGluCi0gICAgdGhlIERFRiBmaWxlLCBhbmQgc3RpbGwgZXhwb3J0IHRoZSBzeW1ib2xzIGJ5IG5hbWUuICBPcmRpbmFscwotICAgIGV4aXN0IGluIGV2ZXJ5IERMTCwgYW5kIGV2ZW4gaWYgdGhlIGR5bmFtaWMgbGlua2luZyBwZXJmb3JtZWQKLSAgICBhdCB0aGUgRExMIHN0YXJ0dXAgaXMgc2VhcmNoaW5nIGZvciBuYW1lcywgb3JkaW5hbHMgc2VydmUgYXMKLSAgICBoaW50cywgZm9yIGEgZmFzdGVyIG5hbWUgbG9va3VwLiAgSG93ZXZlciwgaWYgdGhlIERFRiBmaWxlCi0gICAgY29udGFpbnMgb3JkaW5hbHMsIHRoZSBNaWNyb3NvZnQgbGlua2VyIGF1dG9tYXRpY2FsbHkgYnVpbGRzCi0gICAgYW4gaW1wbGliIHRoYXQgd2lsbCBjYXVzZSB0aGUgZXhlY3V0YWJsZXMgbGlua2VkIHRvIGl0IHRvIHVzZQotICAgIHRob3NlIG9yZGluYWxzLCBhbmQgbm90IHRoZSBuYW1lcy4gIEl0IGlzIGludGVyZXN0aW5nIHRvCi0gICAgbm90aWNlIHRoYXQgdGhlIEdOVSBsaW5rZXIgZm9yIFdpbjMyIGRvZXMgbm90IHN1ZmZlciBmcm9tIHRoaXMKLSAgICBwcm9ibGVtLgotCi0gICAgSXQgaXMgcG9zc2libGUgdG8gYXZvaWQgdGhlIERFRiBmaWxlIGlmIHRoZSBleHBvcnRlZCBzeW1ib2xzCi0gICAgYXJlIGFjY29tcGFuaWVkIGJ5IGEgIl9fZGVjbHNwZWMoZGxsZXhwb3J0KSIgYXR0cmlidXRlIGluIHRoZQotICAgIHNvdXJjZSBmaWxlcy4gIFlvdSBjYW4gZG8gdGhpcyBpbiB6bGliIGJ5IHByZWRlZmluaW5nIHRoZQotICAgIFpMSUJfRExMIG1hY3JvLgotCi0KLSA2LiBJIHNlZSB0aGF0IHRoZSBaTElCMS5ETEwgZnVuY3Rpb25zIHVzZSB0aGUgIkMiIChDREVDTCkgY2FsbGluZwotICAgIGNvbnZlbnRpb24uICBXaHkgbm90IHVzZSB0aGUgU1REQ0FMTCBjb252ZW50aW9uPwotICAgIFNURENBTEwgaXMgdGhlIHN0YW5kYXJkIGNvbnZlbnRpb24gaW4gV2luMzIsIGFuZCBJIG5lZWQgaXQgaW4KLSAgICBteSBWaXN1YWwgQmFzaWMgcHJvamVjdCEKLQotICAgIChGb3IgcmVhZGFiaWxpdHksIHdlIHVzZSBDREVDTCB0byByZWZlciB0byB0aGUgY29udmVudGlvbgotICAgICB0cmlnZ2VyZWQgYnkgdGhlICJfX2NkZWNsIiBrZXl3b3JkLCBTVERDQUxMIHRvIHJlZmVyIHRvCi0gICAgIHRoZSBjb252ZW50aW9uIHRyaWdnZXJlZCBieSAiX19zdGRjYWxsIiwgYW5kIEZBU1RDQUxMIHRvCi0gICAgIHJlZmVyIHRvIHRoZSBjb252ZW50aW9uIHRyaWdnZXJlZCBieSAiX19mYXN0Y2FsbCIuKQotCi0gIC0gTW9zdCBvZiB0aGUgbmF0aXZlIFdpbmRvd3MgQVBJIGZ1bmN0aW9ucyAod2l0aG91dCB2YXJhcmdzKSB1c2UKLSAgICBpbmRlZWQgdGhlIFdJTkFQSSBjb252ZW50aW9uICh3aGljaCB0cmFuc2xhdGVzIHRvIFNURENBTEwgaW4KLSAgICBXaW4zMiksIGJ1dCB0aGUgc3RhbmRhcmQgQyBmdW5jdGlvbnMgdXNlIENERUNMLiAgSWYgYSB1c2VyCi0gICAgYXBwbGljYXRpb24gaXMgaW50cmluc2ljYWxseSB0aWVkIHRvIHRoZSBXaW5kb3dzIEFQSSAoZS5nLgotICAgIGl0IGNhbGxzIG5hdGl2ZSBXaW5kb3dzIEFQSSBmdW5jdGlvbnMgc3VjaCBhcyBDcmVhdGVGaWxlKCkpLAotICAgIHNvbWV0aW1lcyBpdCBtYWtlcyBzZW5zZSB0byBkZWNvcmF0ZSBpdHMgb3duIGZ1bmN0aW9ucyB3aXRoCi0gICAgV0lOQVBJLiAgQnV0IGlmIEFOU0kgQyBvciBQT1NJWCBwb3J0YWJpbGl0eSBpcyBhIGdvYWwgKGUuZy4KLSAgICBpdCBjYWxscyBzdGFuZGFyZCBDIGZ1bmN0aW9ucyBzdWNoIGFzIGZvcGVuKCkpLCBpdCBpcyBub3QgYQotICAgIHNvdW5kIGRlY2lzaW9uIHRvIHJlcXVlc3QgdGhlIGluY2x1c2lvbiBvZiA8d2luZG93cy5oPiwgb3IgdG8KLSAgICB1c2Ugbm9uLUFOU0kgY29uc3RydWN0cywgZm9yIHRoZSBzb2xlIHB1cnBvc2UgdG8gbWFrZSB0aGUgdXNlcgotICAgIGZ1bmN0aW9ucyBTVERDQUxMLWFibGUuCi0KLSAgICBUaGUgZnVuY3Rpb25hbGl0eSBvZmZlcmVkIGJ5IHpsaWIgaXMgbm90IGluIHRoZSBjYXRlZ29yeSBvZgotICAgICJXaW5kb3dzIGZ1bmN0aW9uYWxpdHkiLCBidXQgaXMgbW9yZSBsaWtlICJDIGZ1bmN0aW9uYWxpdHkiLgotCi0gICAgVGVjaG5pY2FsbHksIFNURENBTEwgaXMgbm90IGJhZDsgaW4gZmFjdCwgaXQgaXMgc2xpZ2h0bHkKLSAgICBmYXN0ZXIgdGhhbiBDREVDTCwgYW5kIGl0IHdvcmtzIHdpdGggdmFyaWFibGUtYXJndW1lbnQKLSAgICBmdW5jdGlvbnMsIGp1c3QgbGlrZSBDREVDTC4gIEl0IGlzIHVuZm9ydHVuYXRlIHRoYXQsIGluIHNwaXRlCi0gICAgb2YgdXNpbmcgU1REQ0FMTCBpbiB0aGUgV2luZG93cyBBUEksIGl0IGlzIG5vdCB0aGUgZGVmYXVsdAotICAgIGNvbnZlbnRpb24gdXNlZCBieSB0aGUgQyBjb21waWxlcnMgdGhhdCBydW4gdW5kZXIgV2luZG93cy4KLSAgICBUaGUgcm9vdHMgb2YgdGhlIHByb2JsZW0gcmVzaWRlIGRlZXAgaW5zaWRlIHRoZSB1bnNhZmV0eSBvZgotICAgIHRoZSBLJlItc3R5bGUgZnVuY3Rpb24gcHJvdG90eXBlcywgd2hlcmUgdGhlIGFyZ3VtZW50IHR5cGVzCi0gICAgYXJlIG5vdCBzcGVjaWZpZWQ7IGJ1dCB0aGF0IGlzIGFub3RoZXIgc3RvcnkgZm9yIGFub3RoZXIgZGF5LgotCi0gICAgVGhlIHJlbWFpbmluZyBmYWN0IGlzIHRoYXQgQ0RFQ0wgaXMgdGhlIGRlZmF1bHQgY29udmVudGlvbi4KLSAgICBFdmVuIGlmIGFuIGV4cGxpY2l0IGNvbnZlbnRpb24gaXMgaGFyZC1jb2RlZCBpbnRvIHRoZSBmdW5jdGlvbgotICAgIHByb3RvdHlwZXMgaW5zaWRlIEMgaGVhZGVycywgcHJvYmxlbXMgbWF5IGFwcGVhci4gIFRoZQotICAgIG5lY2Vzc2l0eSB0byBleHBvc2UgdGhlIGNvbnZlbnRpb24gaW4gdXNlcnMnIGNhbGxiYWNrcyBpcyBvbmUKLSAgICBvZiB0aGVzZSBwcm9ibGVtcy4KLQotICAgIFRoZSBjYWxsaW5nIGNvbnZlbnRpb24gaXNzdWVzIGFyZSBhbHNvIGltcG9ydGFudCB3aGVuIHVzaW5nCi0gICAgemxpYiBpbiBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXMuICBTb21lIG9mIHRoZW0sIGxpa2UgQWRhCi0gICAgKEdOQVQpIGFuZCBGb3J0cmFuIChHTlUgRzc3KSwgaGF2ZSBDIGJpbmRpbmdzIGltcGxlbWVudGVkCi0gICAgaW5pdGlhbGx5IG9uIFVuaXgsIGFuZCByZWx5aW5nIG9uIHRoZSBDIGNhbGxpbmcgY29udmVudGlvbi4KLSAgICBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIHByZS0gLk5FVCB2ZXJzaW9ucyBvZiBNaWNyb3NvZnQgVmlzdWFsCi0gICAgQmFzaWMgcmVxdWlyZSBTVERDQUxMLCB3aGlsZSBCb3JsYW5kIERlbHBoaSBwcmVmZXJzLCBhbHRob3VnaAotICAgIGl0IGRvZXMgbm90IHJlcXVpcmUsIEZBU1RDQUxMLgotCi0gICAgSW4gZmFpcm5lc3MgdG8gYWxsIHBvc3NpYmxlIHVzZXMgb2YgemxpYiBvdXRzaWRlIHRoZSBDCi0gICAgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIHdlIGNob29zZSB0aGUgZGVmYXVsdCAiQyIgY29udmVudGlvbi4KLSAgICBBbnlvbmUgaW50ZXJlc3RlZCBpbiBkaWZmZXJlbnQgYmluZGluZ3Mgb3IgY29udmVudGlvbnMgaXMKLSAgICBlbmNvdXJhZ2VkIHRvIG1haW50YWluIHNwZWNpYWxpemVkIHByb2plY3RzLiAgVGhlICJjb250cmliLyIKLSAgICBkaXJlY3RvcnkgZnJvbSB0aGUgemxpYiBkaXN0cmlidXRpb24gYWxyZWFkeSBob2xkcyBhIGNvdXBsZQotICAgIG9mIGZvcmVpZ24gYmluZGluZ3MsIHN1Y2ggYXMgQWRhLCBDKyssIGFuZCBEZWxwaGkuCi0KLQotIDcuIEkgbmVlZCBhIERMTCBmb3IgbXkgVmlzdWFsIEJhc2ljIHByb2plY3QuICBXaGF0IGNhbiBJIGRvPwotCi0gIC0gRGVmaW5lIHRoZSBaTElCX1dJTkFQSSBtYWNybyBiZWZvcmUgaW5jbHVkaW5nICJ6bGliLmgiLCB3aGVuCi0gICAgYnVpbGRpbmcgYm90aCB0aGUgRExMIGFuZCB0aGUgdXNlciBhcHBsaWNhdGlvbiAoZXhjZXB0IHRoYXQKLSAgICB5b3UgZG9uJ3QgbmVlZCB0byBkZWZpbmUgYW55dGhpbmcgd2hlbiB1c2luZyB0aGUgRExMIGluIFZpc3VhbAotICAgIEJhc2ljKS4gIFRoZSBaTElCX1dJTkFQSSBtYWNybyB3aWxsIHN3aXRjaCBvbiB0aGUgV0lOQVBJCi0gICAgKFNURENBTEwpIGNvbnZlbnRpb24uICBUaGUgbmFtZSBvZiB0aGlzIERMTCBtdXN0IGJlIGRpZmZlcmVudAotICAgIHRoYW4gdGhlIG9mZmljaWFsIFpMSUIxLkRMTC4KLQotICAgIEdpbGxlcyBWb2xsYW50IGhhcyBjb250cmlidXRlZCBhIGJ1aWxkIG5hbWVkIFpMSUJXQVBJLkRMTCwKLSAgICB3aXRoIHRoZSBaTElCX1dJTkFQSSBtYWNybyB0dXJuZWQgb24sIGFuZCB3aXRoIHRoZSBtaW5pemlwCi0gICAgZnVuY3Rpb25hbGl0eSBidWlsdCBpbi4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZAotICAgIHRoZSBub3RlcyBpbnNpZGUgImNvbnRyaWIvdnN0dWRpby9yZWFkbWUudHh0IiwgZm91bmQgaW4gdGhlCi0gICAgemxpYiBkaXN0cmlidXRpb24uCi0KLQotIDguIEkgbmVlZCB0byB1c2UgemxpYiBpbiBteSBNaWNyb3NvZnQgLk5FVCBwcm9qZWN0LiAgV2hhdCBjYW4gSQotICAgIGRvPwotCi0gIC0gSGVucmlrIFJhdm4gaGFzIGNvbnRyaWJ1dGVkIGEgLk5FVCB3cmFwcGVyIGFyb3VuZCB6bGliLiAgTG9vawotICAgIGludG8gY29udHJpYi9kb3R6bGliLywgaW5zaWRlIHRoZSB6bGliIGRpc3RyaWJ1dGlvbi4KLQotCi0gOS4gSWYgbXkgYXBwbGljYXRpb24gdXNlcyBaTElCMS5ETEwsIHNob3VsZCBJIGxpbmsgaXQgdG8KLSAgICBNU1ZDUlQuRExMPyAgV2h5PwotCi0gIC0gSXQgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGluayB5b3VyCi0gICAgYXBwbGljYXRpb24gdG8gTVNWQ1JULkRMTCwgaWYgaXQgdXNlcyBaTElCMS5ETEwuCi0KLSAgICBUaGUgZXhlY3V0YWJsZXMgKC5FWEUsIC5ETEwsIGV0Yy4pIHRoYXQgYXJlIGludm9sdmVkIGluIHRoZQotICAgIHNhbWUgcHJvY2VzcyBhbmQgYXJlIHVzaW5nIHRoZSBDIHJ1bi10aW1lIGxpYnJhcnkgKGkuZS4gdGhleQotICAgIGFyZSBjYWxsaW5nIHN0YW5kYXJkIEMgZnVuY3Rpb25zKSwgbXVzdCBsaW5rIHRvIHRoZSBzYW1lCi0gICAgbGlicmFyeS4gIFRoZXJlIGFyZSBzZXZlcmFsIGxpYnJhcmllcyBpbiB0aGUgV2luMzIgc3lzdGVtOgotICAgIENSVERMTC5ETEwsIE1TVkNSVC5ETEwsIHRoZSBzdGF0aWMgQyBsaWJyYXJpZXMsIGV0Yy4KLSAgICBTaW5jZSBaTElCMS5ETEwgaXMgbGlua2VkIHRvIE1TVkNSVC5ETEwsIHRoZSBleGVjdXRhYmxlcyB0aGF0Ci0gICAgZGVwZW5kIG9uIGl0IHNob3VsZCBhbHNvIGJlIGxpbmtlZCB0byBNU1ZDUlQuRExMLgotCi0KLTEwLiBXaHkgYXJlIHlvdSBzYXlpbmcgdGhhdCBaTElCMS5ETEwgYW5kIG15IGFwcGxpY2F0aW9uIHNob3VsZAotICAgIGJlIGxpbmtlZCB0byB0aGUgc2FtZSBDIHJ1bi10aW1lIChDUlQpIGxpYnJhcnk/ICBJIGxpbmtlZCBteQotICAgIGFwcGxpY2F0aW9uIGFuZCBteSBETExzIHRvIGRpZmZlcmVudCBDIGxpYnJhcmllcyAoZS5nLiBteQotICAgIGFwcGxpY2F0aW9uIHRvIGEgc3RhdGljIGxpYnJhcnksIGFuZCBteSBETExzIHRvIE1TVkNSVC5ETEwpLAotICAgIGFuZCBldmVyeXRoaW5nIHdvcmtzIGZpbmUuCi0KLSAgLSBJZiBhIHVzZXIgbGlicmFyeSBpbnZva2VzIG9ubHkgcHVyZSBXaW4zMiBBUEkgKGFjY2Vzc2libGUgdmlhCi0gICAgPHdpbmRvd3MuaD4gYW5kIHRoZSByZWxhdGVkIGhlYWRlcnMpLCBpdHMgRExMIGJ1aWxkIHdpbGwgd29yawotICAgIGluIGFueSBjb250ZXh0LiAgQnV0IGlmIHRoaXMgbGlicmFyeSBpbnZva2VzIHN0YW5kYXJkIEMgQVBJLAotICAgIHRoaW5ncyBnZXQgbW9yZSBjb21wbGljYXRlZC4KLQotICAgIFRoZXJlIGlzIGEgc2luZ2xlIFdpbjMyIGxpYnJhcnkgaW4gYSBXaW4zMiBzeXN0ZW0uICBFdmVyeQotICAgIGZ1bmN0aW9uIGluIHRoaXMgbGlicmFyeSByZXNpZGVzIGluIGEgc2luZ2xlIERMTCBtb2R1bGUsIHRoYXQKLSAgICBpcyBzYWZlIHRvIGNhbGwgZnJvbSBhbnl3aGVyZS4gIE9uIHRoZSBvdGhlciBoYW5kLCB0aGVyZSBhcmUKLSAgICBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgQyBsaWJyYXJ5LCBhbmQgZWFjaCBvZiB0aGVtIGhhcyBpdHMKLSAgICBvd24gc2VwYXJhdGUgaW50ZXJuYWwgc3RhdGUuICBTdGFuZGFsb25lIGV4ZWN1dGFibGVzIGFuZCB1c2VyCi0gICAgRExMcyB0aGF0IGNhbGwgc3RhbmRhcmQgQyBmdW5jdGlvbnMgbXVzdCBsaW5rIHRvIGEgQyBydW4tdGltZQotICAgIChDUlQpIGxpYnJhcnksIGJlIGl0IHN0YXRpYyBvciBzaGFyZWQgKERMTCkuICBJbnRlcm1peGluZwotICAgIG9jY3VycyB3aGVuIGFuIGV4ZWN1dGFibGUgKG5vdCBuZWNlc3NhcmlseSBzdGFuZGFsb25lKSBhbmQgYQotICAgIERMTCBhcmUgbGlua2VkIHRvIGRpZmZlcmVudCBDUlRzLCBhbmQgYm90aCBhcmUgcnVubmluZyBpbiB0aGUKLSAgICBzYW1lIHByb2Nlc3MuCi0KLSAgICBJbnRlcm1peGluZyBtdWx0aXBsZSBDUlRzIGlzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZWlyCi0gICAgaW50ZXJuYWwgc3RhdGVzIGFyZSBrZXB0IGludGFjdC4gIFRoZSBNaWNyb3NvZnQgS25vd2xlZGdlIEJhc2UKLSAgICBhcnRpY2xlcyBLQjk0MjQ4ICJIT1dUTzogVXNlIHRoZSBDIFJ1bi1UaW1lIiBhbmQgS0IxNDA1ODQKLSAgICAiSE9XVE86IExpbmsgd2l0aCB0aGUgQ29ycmVjdCBDIFJ1bi1UaW1lIChDUlQpIExpYnJhcnkiCi0gICAgbWVudGlvbiB0aGUgcG90ZW50aWFsIHByb2JsZW1zIHJhaXNlZCBieSBpbnRlcm1peGluZy4KLQotICAgIElmIGludGVybWl4aW5nIHdvcmtzIGZvciB5b3UsIGl0J3MgYmVjYXVzZSB5b3VyIGFwcGxpY2F0aW9uCi0gICAgYW5kIERMTHMgYXJlIGF2b2lkaW5nIHRoZSBjb3JydXB0aW9uIG9mIGVhY2ggb2YgdGhlIENSVHMnCi0gICAgaW50ZXJuYWwgc3RhdGVzLCBtYXliZSBieSBjYXJlZnVsIGRlc2lnbiwgb3IgbWF5YmUgYnkgZm9ydHVuZS4KLQotICAgIEFsc28gbm90ZSB0aGF0IGxpbmtpbmcgWkxJQjEuRExMIHRvIG5vbi1NaWNyb3NvZnQgQ1JUcywgc3VjaAotICAgIGFzIHRob3NlIHByb3ZpZGVkIGJ5IEJvcmxhbmQsIHJhaXNlcyBzaW1pbGFyIHByb2JsZW1zLgotCi0KLTExLiBXaHkgYXJlIHlvdSBsaW5raW5nIFpMSUIxLkRMTCB0byBNU1ZDUlQuRExMPwotCi0gIC0gTVNWQ1JULkRMTCBleGlzdHMgb24gZXZlcnkgV2luZG93cyA5NSB3aXRoIGEgbmV3IHNlcnZpY2UgcGFjawotICAgIGluc3RhbGxlZCwgb3Igd2l0aCBNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIgNCBvciBsYXRlciwgYW5kCi0gICAgb24gYWxsIG90aGVyIFdpbmRvd3MgNC54IG9yIGxhdGVyIChXaW5kb3dzIDk4LCBXaW5kb3dzIE5UIDQsCi0gICAgb3IgbGF0ZXIpLiAgSXQgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGU7IGlmIG5vdCBwcmVzZW50IGluIHRoZQotICAgIHN5c3RlbSwgaXQgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBNaWNyb3NvZnQgb3IgZnJvbSBvdGhlcgotICAgIHNvZnR3YXJlIHByb3ZpZGVyIGZvciBmcmVlLgotCi0gICAgVGhlIGZhY3QgdGhhdCBNU1ZDUlQuRExMIGRvZXMgbm90IGV4aXN0IG9uIGEgdmlyZ2luIFdpbmRvd3MgOTUKLSAgICBpcyBub3Qgc28gcHJvYmxlbWF0aWMuICBXaW5kb3dzIDk1IGlzIHNjYXJjZWx5IGZvdW5kIG5vd2FkYXlzLAotICAgIE1pY3Jvc29mdCBlbmRlZCBpdHMgc3VwcG9ydCBhIGxvbmcgdGltZSBhZ28sIGFuZCBtYW55IHJlY2VudAotICAgIGFwcGxpY2F0aW9ucyBmcm9tIHZhcmlvdXMgdmVuZG9ycywgaW5jbHVkaW5nIE1pY3Jvc29mdCwgZG8gbm90Ci0gICAgZXZlbiBydW4gb24gaXQuICBGdXJ0aGVybW9yZSwgbm8gc2VyaW91cyB1c2VyIHNob3VsZCBydW4KLSAgICBXaW5kb3dzIDk1IHdpdGhvdXQgYSBwcm9wZXIgdXBkYXRlIGluc3RhbGxlZC4KLQotCi0xMi4gV2h5IGFyZSB5b3Ugbm90IGxpbmtpbmcgWkxJQjEuRExMIHRvCi0gICAgPDxteSBmYXZvcml0ZSBDIHJ1bi10aW1lIGxpYnJhcnk+PiA/Ci0KLSAgLSBXZSBjb25zaWRlcmVkIGFuZCBhYmFuZG9uZWQgdGhlIGZvbGxvd2luZyBhbHRlcm5hdGl2ZXM6Ci0KLSAgICAqIExpbmtpbmcgWkxJQjEuRExMIHRvIGEgc3RhdGljIEMgbGlicmFyeSAoTElCQy5MSUIsIG9yCi0gICAgICBMSUJDTVQuTElCKSBpcyBub3QgYSBnb29kIG9wdGlvbi4gIFBlb3BsZSBhcmUgdXNpbmcgdGhlIERMTAotICAgICAgbWFpbmx5IHRvIHNhdmUgZGlzayBzcGFjZS4gIElmIHlvdSBhcmUgbGlua2luZyB5b3VyIHByb2dyYW0KLSAgICAgIHRvIGEgc3RhdGljIEMgbGlicmFyeSwgeW91IG1heSBhcyB3ZWxsIGNvbnNpZGVyIGxpbmtpbmcgemxpYgotICAgICAgaW4gc3RhdGljYWxseSwgdG9vLgotCi0gICAgKiBMaW5raW5nIFpMSUIxLkRMTCB0byBDUlRETEwuRExMIGxvb2tzIGFwcGVhbGluZywgYmVjYXVzZQotICAgICAgQ1JURExMLkRMTCBpcyBwcmVzZW50IG9uIGV2ZXJ5IFdpbjMyIGluc3RhbGxhdGlvbi4KLSAgICAgIFVuZm9ydHVuYXRlbHksIGl0IGhhcyBhIHNlcmllcyBvZiBwcm9ibGVtczogaXQgZG9lcyBub3QKLSAgICAgIHdvcmsgcHJvcGVybHkgd2l0aCBNaWNyb3NvZnQncyBDKysgbGlicmFyaWVzLCBpdCBkb2VzIG5vdAotICAgICAgcHJvdmlkZSBzdXBwb3J0IGZvciA2NC1iaXQgZmlsZSBvZmZzZXRzLCAoYW5kIHNvIG9uLi4uKSwKLSAgICAgIGFuZCBNaWNyb3NvZnQgZGlzY29udGludWVkIGl0cyBzdXBwb3J0IGEgbG9uZyB0aW1lIGFnby4KLQotICAgICogTGlua2luZyBaTElCMS5ETEwgdG8gTVNWQ1I3MC5ETEwgb3IgTVNWQ1I3MS5ETEwsIHN1cHBsaWVkCi0gICAgICB3aXRoIHRoZSBNaWNyb3NvZnQgLk5FVCBwbGF0Zm9ybSwgYW5kIFZpc3VhbCBDKysgNy4wLzcuMSwKLSAgICAgIHJhaXNlcyBwcm9ibGVtcyByZWxhdGVkIHRvIHRoZSBzdGF0dXMgb2YgWkxJQjEuRExMIGFzIGEKLSAgICAgIHN5c3RlbSBjb21wb25lbnQuICBBY2NvcmRpbmcgdG8gdGhlIE1pY3Jvc29mdCBLbm93bGVkZ2UgQmFzZQotICAgICAgYXJ0aWNsZSBLQjMyNjkyMiAiSU5GTzogUmVkaXN0cmlidXRpb24gb2YgdGhlIFNoYXJlZCBDCi0gICAgICBSdW50aW1lIENvbXBvbmVudCBpbiBWaXN1YWwgQysrIC5ORVQiLCBNU1ZDUjcwLkRMTCBhbmQKLSAgICAgIE1TVkNSNzEuRExMIGFyZSBub3Qgc3VwcG9zZWQgdG8gZnVuY3Rpb24gYXMgc3lzdGVtIERMTHMsCi0gICAgICBiZWNhdXNlIHRoZXkgbWF5IGNsYXNoIHdpdGggTVNWQ1JULkRMTC4gIEluc3RlYWQsIHRoZQotICAgICAgYXBwbGljYXRpb24ncyBpbnN0YWxsZXIgaXMgc3VwcG9zZWQgdG8gcHV0IHRoZXNlIERMTHMKLSAgICAgIChpZiBuZWVkZWQpIGluIHRoZSBhcHBsaWNhdGlvbidzIHByaXZhdGUgZGlyZWN0b3J5LgotICAgICAgSWYgWkxJQjEuRExMIGRlcGVuZHMgb24gYSBub24tc3lzdGVtIHJ1bnRpbWUsIGl0IGNhbm5vdAotICAgICAgZnVuY3Rpb24gYXMgYSByZWRpc3RyaWJ1dGFibGUgc3lzdGVtIGNvbXBvbmVudC4KLQotICAgICogTGlua2luZyBaTElCMS5ETEwgdG8gbm9uLU1pY3Jvc29mdCBydW50aW1lcywgc3VjaCBhcwotICAgICAgQm9ybGFuZCdzLCBvciBDeWd3aW4ncywgcmFpc2VzIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGhlCi0gICAgICByZWxpYWJsZSBwcmVzZW5jZSBvZiB0aGVzZSBydW50aW1lcyBvbiBXaW4zMiBzeXN0ZW1zLgotICAgICAgSXQncyBlYXNpZXIgdG8gbGV0IHRoZSBETEwgYnVpbGQgb2YgemxpYiB1cCB0byB0aGUgcGVvcGxlCi0gICAgICB3aG8gZGlzdHJpYnV0ZSB0aGVzZSBydW50aW1lcywgYW5kIHdobyBtYXkgcHJvY2VlZCBhcwotICAgICAgZXhwbGFpbmVkIGluIHRoZSBhbnN3ZXIgdG8gUXVlc3Rpb24gMTQuCi0KLQotMTMuIElmIFpMSUIxLkRMTCBjYW5ub3QgYmUgbGlua2VkIHRvIE1TVkNSNzAuRExMIG9yIE1TVkNSNzEuRExMLAotICAgIGhvdyBjYW4gSSBidWlsZC91c2UgWkxJQjEuRExMIGluIE1pY3Jvc29mdCBWaXN1YWwgQysrIDcuMAotICAgIChWaXN1YWwgU3R1ZGlvIC5ORVQpIG9yIG5ld2VyPwotCi0gIC0gRHVlIHRvIHRoZSBwcm9ibGVtcyBleHBsYWluZWQgaW4gdGhlIE1pY3Jvc29mdCBLbm93bGVkZ2UgQmFzZQotICAgIGFydGljbGUgS0IzMjY5MjIgKHNlZSB0aGUgcHJldmlvdXMgYW5zd2VyKSwgdGhlIEMgcnVudGltZSB0aGF0Ci0gICAgY29tZXMgd2l0aCB0aGUgVkM3IGVudmlyb25tZW50IGlzIG5vIGxvbmdlciBjb25zaWRlcmVkIGEKLSAgICBzeXN0ZW0gY29tcG9uZW50LiAgVGhhdCBpcywgaXQgc2hvdWxkIG5vdCBiZSBhc3N1bWVkIHRoYXQgdGhpcwotICAgIHJ1bnRpbWUgZXhpc3RzLCBvciBtYXkgYmUgaW5zdGFsbGVkIGluIGEgc3lzdGVtIGRpcmVjdG9yeS4KLSAgICBTaW5jZSBaTElCMS5ETEwgaXMgc3VwcG9zZWQgdG8gYmUgYSBzeXN0ZW0gY29tcG9uZW50LCBpdCBtYXkKLSAgICBub3QgZGVwZW5kIG9uIGEgbm9uLXN5c3RlbSBjb21wb25lbnQuCi0KLSAgICBJbiBvcmRlciB0byBsaW5rIFpMSUIxLkRMTCBhbmQgeW91ciBhcHBsaWNhdGlvbiB0byBNU1ZDUlQuRExMCi0gICAgaW4gVkM3LCB5b3UgbmVlZCB0aGUgbGlicmFyeSBvZiBWaXN1YWwgQysrIDYuMCBvciBvbGRlci4gIElmCi0gICAgeW91IGRvbid0IGhhdmUgdGhpcyBsaWJyYXJ5IGF0IGhhbmQsIGl0J3MgcHJvYmFibHkgYmVzdCBub3QgdG8KLSAgICB1c2UgWkxJQjEuRExMLgotCi0gICAgV2UgYXJlIGhvcGluZyB0aGF0LCBpbiB0aGUgZnV0dXJlLCBNaWNyb3NvZnQgd2lsbCBwcm92aWRlIGEKLSAgICB3YXkgdG8gYnVpbGQgYXBwbGljYXRpb25zIGxpbmtlZCB0byBhIHByb3BlciBzeXN0ZW0gcnVudGltZSwKLSAgICBmcm9tIHRoZSBWaXN1YWwgQysrIGVudmlyb25tZW50LiAgVW50aWwgdGhlbiwgeW91IGhhdmUgYQotICAgIGNvdXBsZSBvZiBhbHRlcm5hdGl2ZXMsIHN1Y2ggYXMgbGlua2luZyB6bGliIGluIHN0YXRpY2FsbHkuCi0gICAgSWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBkeW5hbWljIGxpbmtpbmcsIHlvdSBtYXkgcHJvY2VlZAotICAgIGFzIGV4cGxhaW5lZCBpbiB0aGUgYW5zd2VyIHRvIFF1ZXN0aW9uIDE0LgotCi0KLTE0LiBJIG5lZWQgdG8gbGluayBteSBvd24gRExMIGJ1aWxkIHRvIGEgQ1JUIGRpZmZlcmVudCB0aGFuCi0gICAgTVNWQ1JULkRMTC4gIFdoYXQgY2FuIEkgZG8/Ci0KLSAgLSBGZWVsIGZyZWUgdG8gcmVidWlsZCB0aGUgRExMIGZyb20gdGhlIHpsaWIgc291cmNlcywgYW5kIGxpbmsKLSAgICBpdCB0aGUgd2F5IHlvdSB3YW50LiAgWW91IHNob3VsZCwgaG93ZXZlciwgY2xlYXJseSBzdGF0ZSB0aGF0Ci0gICAgeW91ciBidWlsZCBpcyB1bm9mZmljaWFsLiAgWW91IHNob3VsZCBnaXZlIGl0IGEgZGlmZmVyZW50IGZpbGUKLSAgICBuYW1lLCBhbmQvb3IgaW5zdGFsbCBpdCBpbiBhIHByaXZhdGUgZGlyZWN0b3J5IHRoYXQgY2FuIGJlCi0gICAgYWNjZXNzZWQgYnkgeW91ciBhcHBsaWNhdGlvbiBvbmx5LCBhbmQgaXMgbm90IHZpc2libGUgdG8gdGhlCi0gICAgb3RoZXJzIChlLmcuIGl0J3Mgbm90IGluIHRoZSBTWVNURU0gb3IgdGhlIFNZU1RFTTMyIGRpcmVjdG9yeSwKLSAgICBhbmQgaXQncyBub3QgaW4gdGhlIFBBVEgpLiAgT3RoZXJ3aXNlLCB5b3VyIGJ1aWxkIG1heSBjbGFzaAotICAgIHdpdGggYXBwbGljYXRpb25zIHRoYXQgbGluayB0byB0aGUgb2ZmaWNpYWwgYnVpbGQuCi0KLSAgICBGb3IgZXhhbXBsZSwgaW4gQ3lnd2luLCB6bGliIGlzIGxpbmtlZCB0byB0aGUgQ3lnd2luIHJ1bnRpbWUKLSAgICBDWUdXSU4xLkRMTCwgYW5kIGl0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBuYW1lIENZR1ouRExMLgotCi0KLTE1LiBNYXkgSSBpbmNsdWRlIGFkZGl0aW9uYWwgcGllY2VzIG9mIGNvZGUgdGhhdCBJIGZpbmQgdXNlZnVsLAotICAgIGxpbmsgdGhlbSBpbiBaTElCMS5ETEwsIGFuZCBleHBvcnQgdGhlbT8KLQotICAtIE5vLiAgQSBsZWdpdGltYXRlIGJ1aWxkIG9mIFpMSUIxLkRMTCBtdXN0IG5vdCBpbmNsdWRlIGNvZGUKLSAgICB0aGF0IGRvZXMgbm90IG9yaWdpbmF0ZSBmcm9tIHRoZSBvZmZpY2lhbCB6bGliIHNvdXJjZSBjb2RlLgotICAgIEJ1dCB5b3UgY2FuIG1ha2UgeW91ciBvd24gcHJpdmF0ZSBETEwgYnVpbGQsIHVuZGVyIGEgZGlmZmVyZW50Ci0gICAgZmlsZSBuYW1lLCBhcyBzdWdnZXN0ZWQgaW4gdGhlIHByZXZpb3VzIGFuc3dlci4KLQotICAgIEZvciBleGFtcGxlLCB6bGliIGlzIGEgcGFydCBvZiB0aGUgVkNMIGxpYnJhcnksIGRpc3RyaWJ1dGVkCi0gICAgd2l0aCBCb3JsYW5kIERlbHBoaSBhbmQgQysrIEJ1aWxkZXIuICBUaGUgRExMIGJ1aWxkIG9mIFZDTAotICAgIGlzIGEgcmVkaXN0cmlidXRhYmxlIGZpbGUsIG5hbWVkIFZDTHh4LkRMTC4KLQotCi0xNi4gTWF5IEkgcmVtb3ZlIHNvbWUgZnVuY3Rpb25hbGl0eSBvdXQgb2YgWkxJQjEuRExMLCBieSBlbmFibGluZwotICAgIG1hY3JvcyBsaWtlIE5PX0daQ09NUFJFU1Mgb3IgTk9fR1pJUCBhdCBjb21waWxlIHRpbWU/Ci0KLSAgLSBOby4gIEEgbGVnaXRpbWF0ZSBidWlsZCBvZiBaTElCMS5ETEwgbXVzdCBwcm92aWRlIHRoZSBjb21wbGV0ZQotICAgIHpsaWIgZnVuY3Rpb25hbGl0eSwgYXMgaW1wbGVtZW50ZWQgaW4gdGhlIG9mZmljaWFsIHpsaWIgc291cmNlCi0gICAgY29kZS4gIEJ1dCB5b3UgY2FuIG1ha2UgeW91ciBvd24gcHJpdmF0ZSBETEwgYnVpbGQsIHVuZGVyIGEKLSAgICBkaWZmZXJlbnQgZmlsZSBuYW1lLCBhcyBzdWdnZXN0ZWQgaW4gdGhlIHByZXZpb3VzIGFuc3dlci4KLQotCi0xNy4gSSBtYWRlIG15IG93biBaTElCMS5ETEwgYnVpbGQuICBDYW4gSSB0ZXN0IGl0IGZvciBjb21wbGlhbmNlPwotCi0gIC0gV2UgcHJlZmVyIHRoYXQgeW91IGRvd25sb2FkIHRoZSBvZmZpY2lhbCBETEwgZnJvbSB0aGUgemxpYgotICAgIHdlYiBzaXRlLiAgSWYgeW91IG5lZWQgc29tZXRoaW5nIHBlY3VsaWFyIGZyb20gdGhpcyBETEwsIHlvdQotICAgIGNhbiBzZW5kIHlvdXIgc3VnZ2VzdGlvbiB0byB0aGUgemxpYiBtYWlsaW5nIGxpc3QuCi0KLSAgICBIb3dldmVyLCBpbiBjYXNlIHlvdSBkbyByZWJ1aWxkIHRoZSBETEwgeW91cnNlbGYsIHlvdSBjYW4gcnVuCi0gICAgaXQgd2l0aCB0aGUgdGVzdCBwcm9ncmFtcyBmb3VuZCBpbiB0aGUgRExMIGRpc3RyaWJ1dGlvbi4KLSAgICBSdW5uaW5nIHRoZXNlIHRlc3QgcHJvZ3JhbXMgaXMgbm90IGEgZ3VhcmFudGVlIG9mIGNvbXBsaWFuY2UsCi0gICAgYnV0IGEgZmFpbHVyZSBjYW4gaW1wbHkgYSBkZXRlY3RlZCBwcm9ibGVtLgotCi0qKgotCi1UaGlzIGRvY3VtZW50IGlzIHdyaXR0ZW4gYW5kIG1haW50YWluZWQgYnkKLUNvc21pbiBUcnV0YSA8Y29zbWludEBjcy51YmJjbHVqLnJvPgpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3dpbjMyL01ha2VmaWxlLmJvciBiL2xpYnMvemxpYi93aW4zMi9NYWtlZmlsZS5ib3IKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDI1MTkuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL3dpbjMyL01ha2VmaWxlLmJvcgorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0jIE1ha2VmaWxlIGZvciB6bGliCi0jIEJvcmxhbmQgQysrIGZvciBXaW4zMgotIwotIyBVcGRhdGVkIGZvciB6bGliIDEuMi54IGJ5IENvc21pbiBUcnV0YSwgMTEtTWFyLTIwMDMKLSMgTGFzdCB1cGRhdGVkOiAyOC1BdWctMjAwMwotIwotIyBVc2FnZToKLSMgIG1ha2UgLWYgd2luMzIvTWFrZWZpbGUuYm9yCi0jICBtYWtlIC1mIHdpbjMyL01ha2VmaWxlLmJvciBMT0NBTF9aTElCPS1EQVNNViBPQkpBPW1hdGNoLm9iaiBPQkpQQT0rbWF0Y2gub2JqCi0KLSMgLS0tLS0tLS0tLS0tIEJvcmxhbmQgQysrIC0tLS0tLS0tLS0tLQotCi0jIE9wdGlvbmFsIG5vbnN0YW5kYXJkIHByZXByb2Nlc3NvciBmbGFncyAoZS5nLiAtRE1BWF9NRU1fTEVWRUw9NykKLSMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudCB2aWEgInNldCBMT0NBTF9aTElCPS1ERk9PIiBvcgotIyBhZGRlZCB0byB0aGUgZGVjbGFyYXRpb24gb2YgTE9DIGhlcmU6Ci1MT0MgPSAkKExPQ0FMX1pMSUIpCi0KLUNDID0gYmNjMzIKLUFTID0gYmNjMzIKLUxEID0gYmNjMzIKLUFSID0gdGxpYgotQ0ZMQUdTICA9IC1hIC1kIC1rLSAtTzIgJChMT0MpCi1BU0ZMQUdTID0gJChMT0MpCi1MREZMQUdTID0gJChMT0MpCi0KLQotIyB2YXJpYWJsZXMKLVpMSUJfTElCID0gemxpYi5saWIKLQotT0JKMSAgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6aW8ub2JqIGluZmJhY2sub2JqCi1PQkoyICA9IGluZmZhc3Qub2JqIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiB0cmVlcy5vYmogdW5jb21wci5vYmogenV0aWwub2JqCi0jT0JKQSA9Ci1PQkpQMSA9ICthZGxlcjMyLm9iaitjb21wcmVzcy5vYmorY3JjMzIub2JqK2RlZmxhdGUub2JqK2d6aW8ub2JqK2luZmJhY2sub2JqCi1PQkpQMiA9ICtpbmZmYXN0Lm9iaitpbmZsYXRlLm9iaitpbmZ0cmVlcy5vYmordHJlZXMub2JqK3VuY29tcHIub2JqK3p1dGlsLm9iagotI09CSlBBPQotCi0KLSMgdGFyZ2V0cwotYWxsOiAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQotLmMub2JqOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkPAotCi0uYXNtLm9iajoKLQkkKEFTKSAtYyAkKEFTRkxBR1MpICQ8Ci0KLWFkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKLQotY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCi0KLWNyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCi0KLWRlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZ3ppby5vYmo6IGd6aW8uYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWluZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmgKLQotaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSBpbmZmYXN0LmggaW5mZml4ZWQuaAotCi1pbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi0KLXRyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCi0KLXVuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKLQotenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZXhhbXBsZS5vYmo6IGV4YW1wbGUuYyB6bGliLmggemNvbmYuaAotCi1taW5pZ3ppcC5vYmo6IG1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKLQotCi0jIEZvciB0aGUgc2FrZSBvZiB0aGUgb2xkIEJvcmxhbmQgbWFrZSwKLSMgdGhlIGNvbW1hbmQgbGluZSBpcyBjdXQgdG8gZml0IGluIHRoZSBNUy1ET1MgMTI4IGJ5dGUgbGltaXQ6Ci0kKFpMSUJfTElCKTogJChPQkoxKSAkKE9CSjIpICQoT0JKQSkKLQktZGVsICQoWkxJQl9MSUIpCi0JJChBUikgJChaTElCX0xJQikgJChPQkpQMSkKLQkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAyKQotCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUEEpCi0KLQotIyB0ZXN0aW5nCi10ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKLQlleGFtcGxlCi0JZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKLQotZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCi0JJChMRCkgJChMREZMQUdTKSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQotCi1taW5pZ3ppcC5leGU6IG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQotCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCi0KLQotIyBjbGVhbnVwCi1jbGVhbjoKLQktZGVsICoub2JqCi0JLWRlbCAqLmxpYgotCS1kZWwgKi5leGUKLQktZGVsICoudGRzCi0JLWRlbCB6bGliLmJhawotCS1kZWwgZm9vLmd6CmRpZmYgLS1naXQgYS9saWJzL3psaWIvd2luMzIvTWFrZWZpbGUuZW14IGIvbGlicy96bGliL3dpbjMyL01ha2VmaWxlLmVteApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwODQyNC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvd2luMzIvTWFrZWZpbGUuZW14CisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgemxpYi4gIE1vZGlmaWVkIGZvciBlbXgvcnN4bnQgYnkgQ2hyLiBTcGllbGVyLCA2LzE2Lzk4LgotIyBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5LgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0KLSMgVG8gY29tcGlsZSwgb3IgdG8gY29tcGlsZSBhbmQgdGVzdCwgdHlwZToKLSMKLSMgICBtYWtlIC1mbWFrZWZpbGUuZW14OyAgbWFrZSB0ZXN0IC1mbWFrZWZpbGUuZW14Ci0jCi0KLUNDPWdjYyAtWndpbjMyCi0KLSNDRkxBR1M9LU1NRCAtTwotI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NwotI0NGTEFHUz0tTU1EIC1nIC1EREVCVUcKLUNGTEFHUz0tTU1EIC1PMyAkKEJVVFQpIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKLSAgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCi0KLSMgSWYgY3AuZXhlIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAiY29weSAvWSIgd2l0aCAiY3AgLWZwIiAuCi1DUD1jb3B5IC9ZCi0jIElmIGdudSBpbnN0YWxsLmV4ZSBpcyBhdmFpbGFibGUsIHJlcGxhY2UgJChDUCkgd2l0aCBnaW5zdGFsbC4KLUlOU1RBTEw9JChDUCkKLSMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgUk0gaXMgInJtIC1mLiIgIElmICJybS5leGUiIGlzIGZvdW5kLCBjb21tZW50IG91dDoKLVJNPWRlbAotTERMSUJTPS1MLiAtbHpsaWIKLUxEPSQoQ0MpIC1zIC1vCi1MRFNIQVJFRD0kKENDKQotCi1JTkNMPXpsaWIuaCB6Y29uZi5oCi1MSUJTPXpsaWIuYQotCi1BUj1hciByY3MKLQotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6aW8ubyB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8gXAotICAgICAgIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubwotCi1URVNUX09CSlMgPSBleGFtcGxlLm8gbWluaWd6aXAubwotCi1hbGw6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCi10ZXN0OiBhbGwKLQkuL2V4YW1wbGUKLQllY2hvIGhlbGxvIHdvcmxkIHwgLlxtaW5pZ3ppcCB8IC5cbWluaWd6aXAgLWQKLQotJS5vIDogJS5jCi0JJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACi0KLXpsaWIuYTogJChPQkpTKQotCSQoQVIpICRAICQoT0JKUykKLQotJS5leGUgOiAlLm8gJChMSUJTKQotCSQoTEQpICRAICQ8ICQoTERMSUJTKQotCi0KLS5QSE9OWSA6IGNsZWFuCi0KLWNsZWFuOgotCSQoUk0pICouZAotCSQoUk0pICoubwotCSQoUk0pICouZXhlCi0JJChSTSkgemxpYi5hCi0JJChSTSkgZm9vLmd6Ci0KLURFUFMgOj0gJCh3aWxkY2FyZCAqLmQpCi1pZm5lcSAoJChERVBTKSwpCi1pbmNsdWRlICQoREVQUykKLWVuZGlmCmRpZmYgLS1naXQgYS9saWJzL3psaWIvd2luMzIvTWFrZWZpbGUuZ2NjIGIvbGlicy96bGliL3dpbjMyL01ha2VmaWxlLmdjYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJhODQzMC4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvd2luMzIvTWFrZWZpbGUuZ2NjCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHpsaWIsIGRlcml2ZWQgZnJvbSBNYWtlZmlsZS5kajIuCi0jIE1vZGlmaWVkIGZvciBtaW5ndzMyIGJ5IEMuIFNwaWVsZXIsIDYvMTYvOTguCi0jIFVwZGF0ZWQgZm9yIHpsaWIgMS4yLnggYnkgQ2hyaXN0aWFuIFNwaWVsZXIgYW5kIENvc21pbiBUcnV0YSwgTWFyLTIwMDMuCi0jIExhc3QgdXBkYXRlZDogMS1BdWctMjAwMy4KLSMgVGVzdGVkIHVuZGVyIEN5Z3dpbiBhbmQgTWluR1cuCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotCi0jIFRvIGNvbXBpbGUsIG9yIHRvIGNvbXBpbGUgYW5kIHRlc3QsIHR5cGU6Ci0jCi0jICAgbWFrZSAtZm1ha2VmaWxlLmdjYzsgIG1ha2UgdGVzdCB0ZXN0ZGxsIC1mbWFrZWZpbGUuZ2NjCi0jCi0jIFRvIHVzZSB0aGUgYXNtIGNvZGUsIHR5cGU6Ci0jICAgY3AgY29udHJpYi9hc20/ODYvbWF0Y2guUyAuL21hdGNoLlMKLSMgICBtYWtlIExPQz0tREFTTVYgT0JKQT1tYXRjaC5vIC1mbWFrZWZpbGUuZ2NjCi0jCi0jIFRvIGluc3RhbGwgbGliei5hLCB6Y29uZi5oIGFuZCB6bGliLmggaW4gdGhlIHN5c3RlbSBkaXJlY3RvcmllcywgdHlwZToKLSMKLSMgICBtYWtlIGluc3RhbGwgLWZtYWtlZmlsZS5nY2MKLQotIyBOb3RlOgotIyBJZiB0aGUgcGxhdGZvcm0gaXMgKm5vdCogTWluR1cgKGUuZy4gaXQgaXMgQ3lnd2luIG9yIFVXSU4pLAotIyB0aGUgRExMIG5hbWUgc2hvdWxkIGJlIGNoYW5nZWQgZnJvbSAiemxpYjEuZGxsIi4KLQotU1RBVElDTElCID0gbGliei5hCi1TSEFSRURMSUIgPSB6bGliMS5kbGwKLUlNUExJQiAgICA9IGxpYnpkbGwuYQotCi0jTE9DID0gLURBU01WCi0jTE9DID0gLURERUJVRyAtZwotCi1DQyA9IGdjYwotQ0ZMQUdTID0gJChMT0MpIC1PMyAtV2FsbAotCi1BUyA9ICQoQ0MpCi1BU0ZMQUdTID0gJChMT0MpIC1XYWxsCi0KLUxEID0gJChDQykKLUxERkxBR1MgPSAkKExPQykgLXMKLQotQVIgPSBhcgotQVJGTEFHUyA9IHJjcwotCi1SQyA9IHdpbmRyZXMKLVJDRkxBR1MgPSAtLWRlZmluZSBHQ0NfV0lORFJFUwotCi1DUCA9IGNwIC1mcAotIyBJZiBHTlUgaW5zdGFsbCBpcyBhdmFpbGFibGUsIHJlcGxhY2UgJChDUCkgd2l0aCBpbnN0YWxsLgotSU5TVEFMTCA9ICQoQ1ApCi1STSA9IHJtIC1mCi0KLXByZWZpeCA9IC91c3IvbG9jYWwKLWV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCi0KLU9CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGRlZmxhdGUubyBnemlvLm8gaW5mYmFjay5vIFwKLSAgICAgICBpbmZmYXN0Lm8gaW5mbGF0ZS5vIGluZnRyZWVzLm8gdHJlZXMubyB1bmNvbXByLm8genV0aWwubwotT0JKQSA9Ci0KLWFsbDogJChTVEFUSUNMSUIpICQoU0hBUkVETElCKSAkKElNUExJQikgZXhhbXBsZSBtaW5pZ3ppcCBleGFtcGxlX2QgbWluaWd6aXBfZAotCi10ZXN0OiBleGFtcGxlIG1pbmlnemlwCi0JLi9leGFtcGxlCi0JZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXAgfCAuL21pbmlnemlwIC1kCi0KLXRlc3RkbGw6IGV4YW1wbGVfZCBtaW5pZ3ppcF9kCi0JLi9leGFtcGxlX2QKLQllY2hvIGhlbGxvIHdvcmxkIHwgLi9taW5pZ3ppcF9kIHwgLi9taW5pZ3ppcF9kIC1kCi0KLS5jLm86Ci0JJChDQykgJChDRkxBR1MpIC1jIC1vICRAICQ8Ci0KLS5TLm86Ci0JJChBUykgJChBU0ZMQUdTKSAtYyAtbyAkQCAkPAotCi0kKFNUQVRJQ0xJQik6ICQoT0JKUykgJChPQkpBKQotCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKSAkKE9CSkEpCi0KLSQoSU1QTElCKTogJChTSEFSRURMSUIpCi0KLSQoU0hBUkVETElCKTogd2luMzIvemxpYi5kZWYgJChPQkpTKSAkKE9CSkEpIHpsaWJyYy5vCi0JZGxsd3JhcCAtLWRyaXZlci1uYW1lICQoQ0MpIC0tZGVmIHdpbjMyL3psaWIuZGVmIFwKLQkgIC0taW1wbGliICQoSU1QTElCKSAtbyAkQCAkKE9CSlMpICQoT0JKQSkgemxpYnJjLm8KLQlzdHJpcCAkQAotCi1leGFtcGxlOiBleGFtcGxlLm8gJChTVEFUSUNMSUIpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCBleGFtcGxlLm8gJChTVEFUSUNMSUIpCi0KLW1pbmlnemlwOiBtaW5pZ3ppcC5vICQoU1RBVElDTElCKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgbWluaWd6aXAubyAkKFNUQVRJQ0xJQikKLQotZXhhbXBsZV9kOiBleGFtcGxlLm8gJChJTVBMSUIpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCBleGFtcGxlLm8gJChJTVBMSUIpCi0KLW1pbmlnemlwX2Q6IG1pbmlnemlwLm8gJChJTVBMSUIpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCBtaW5pZ3ppcC5vICQoSU1QTElCKQotCi16bGlicmMubzogd2luMzIvemxpYjEucmMKLQkkKFJDKSAkKFJDRkxBR1MpIC1vICRAIHdpbjMyL3psaWIxLnJjCi0KLQotIyBJTkNMVURFX1BBVEggYW5kIExJQlJBUllfUEFUSCBtdXN0IGJlIHNldC4KLQotLlBIT05ZOiBpbnN0YWxsIHVuaW5zdGFsbCBjbGVhbgotCi1pbnN0YWxsOiB6bGliLmggemNvbmYuaCAkKExJQikKLQktQGlmIG5vdCBleGlzdCAkKElOQ0xVREVfUEFUSCkvbnVsIG1rZGlyICQoSU5DTFVERV9QQVRIKQotCS1AaWYgbm90IGV4aXN0ICQoTElCUkFSWV9QQVRIKS9udWwgbWtkaXIgJChMSUJSQVJZX1BBVEgpCi0JLSQoSU5TVEFMTCkgemxpYi5oICQoSU5DTFVERV9QQVRIKQotCS0kKElOU1RBTEwpIHpjb25mLmggJChJTkNMVURFX1BBVEgpCi0JLSQoSU5TVEFMTCkgJChTVEFUSUNMSUIpICQoTElCUkFSWV9QQVRIKQotCS0kKElOU1RBTEwpICQoSU1QTElCKSAkKExJQlJBUllfUEFUSCkKLQotdW5pbnN0YWxsOgotCS0kKFJNKSAkKElOQ0xVREVfUEFUSCkvemxpYi5oCi0JLSQoUk0pICQoSU5DTFVERV9QQVRIKS96Y29uZi5oCi0JLSQoUk0pICQoTElCUkFSWV9QQVRIKS8kKFNUQVRJQ0xJQikKLQktJChSTSkgJChMSUJSQVJZX1BBVEgpLyQoSU1QTElCKQotCi1jbGVhbjoKLQktJChSTSkgJChTVEFUSUNMSUIpCi0JLSQoUk0pICQoU0hBUkVETElCKQotCS0kKFJNKSAkKElNUExJQikKLQktJChSTSkgKi5vCi0JLSQoUk0pICouZXhlCi0JLSQoUk0pIGZvby5negotCi1hZGxlcjMyLm86IHpsaWIuaCB6Y29uZi5oCi1jb21wcmVzcy5vOiB6bGliLmggemNvbmYuaAotY3JjMzIubzogY3JjMzIuaCB6bGliLmggemNvbmYuaAotZGVmbGF0ZS5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotZXhhbXBsZS5vOiB6bGliLmggemNvbmYuaAotZ3ppby5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1pbmZmYXN0Lm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZsYXRlLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZiYWNrLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLW1pbmlnemlwLm86IHpsaWIuaCB6Y29uZi5oCi10cmVlcy5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB0cmVlcy5oCi11bmNvbXByLm86IHpsaWIuaCB6Y29uZi5oCi16dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS9saWJzL3psaWIvd2luMzIvTWFrZWZpbGUubXNjIGIvbGlicy96bGliL3dpbjMyL01ha2VmaWxlLm1zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4ZWNhYS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvd2luMzIvTWFrZWZpbGUubXNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHpsaWIgLS0gTWljcm9zb2Z0IChWaXN1YWwpIEMKLSMKLSMgQXV0aG9yczoKLSMgICBDb3NtaW4gVHJ1dGEsIDExLU1hci0yMDAzCi0jICAgQ2hyaXN0aWFuIFNwaWVsZXIsIDE5LU1hci0yMDAzCi0jCi0jIExhc3QgdXBkYXRlZDoKLSMgICBDb3NtaW4gVHJ1dGEsIDI3LUF1Zy0yMDAzCi0jCi0jIFVzYWdlOgotIyAgIG5tYWtlIC1mIHdpbjMyL01ha2VmaWxlLm1zYyAgICAgICAgICAgIChzdGFuZGFyZCBidWlsZCkKLSMgICBubWFrZSAtZiB3aW4zMi9NYWtlZmlsZS5tc2MgTE9DPS1ERk9PICAobm9uc3RhbmRhcmQgYnVpbGQpCi0jICAgbm1ha2UgLWYgd2luMzIvTWFrZWZpbGUubXNjIExPQz0tREFTTVYgT0JKQT1tYXRjaC5vYmogICh1c2UgQVNNIGNvZGUpCi0KLQotIyBvcHRpb25hbCBidWlsZCBmbGFncwotTE9DID0KLQotCi0jIHZhcmlhYmxlcwotU1RBVElDTElCID0gemxpYi5saWIKLVNIQVJFRExJQiA9IHpsaWIxLmRsbAotSU1QTElCICAgID0gemRsbC5saWIKLQotQ0MgPSBjbAotQVMgPSBtbAotTEQgPSBsaW5rCi1BUiA9IGxpYgotUkMgPSByYwotQ0ZMQUdTICA9IC1ub2xvZ28gLU1EIC1PMiAkKExPQykKLUFTRkxBR1MgPSAtY29mZgotTERGTEFHUyA9IC1ub2xvZ28gLXJlbGVhc2UKLUFSRkxBR1MgPSAtbm9sb2dvCi1SQ0ZMQUdTID0gL2RXSU4zMiAvcgotCi1PQkpTID0gYWRsZXIzMi5vYmogY29tcHJlc3Mub2JqIGNyYzMyLm9iaiBkZWZsYXRlLm9iaiBnemlvLm9iaiBpbmZiYWNrLm9iaiBcCi0gICAgICAgaW5mZmFzdC5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKLU9CSkEgPQotCi0KLSMgdGFyZ2V0cwotYWxsOiAkKFNUQVRJQ0xJQikgJChTSEFSRURMSUIpICQoSU1QTElCKSBcCi0gICAgIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZSBleGFtcGxlX2QuZXhlIG1pbmlnemlwX2QuZXhlCi0KLSQoU1RBVElDTElCKTogJChPQkpTKSAkKE9CSkEpCi0JJChBUikgJChBUkZMQUdTKSAtb3V0OiRAICQoT0JKUykgJChPQkpBKQotCi0kKElNUExJQik6ICQoU0hBUkVETElCKQotCi0kKFNIQVJFRExJQik6IHdpbjMyL3psaWIuZGVmICQoT0JKUykgJChPQkpBKSB6bGliMS5yZXMKLQkkKExEKSAkKExERkxBR1MpIC1kZWY6d2luMzIvemxpYi5kZWYgLWRsbCAtaW1wbGliOiQoSU1QTElCKSBcCi0JICAtb3V0OiRAICQoT0JKUykgJChPQkpBKSB6bGliMS5yZXMKLQotZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoU1RBVElDTElCKQotCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmogJChTVEFUSUNMSUIpCi0KLW1pbmlnemlwLmV4ZTogbWluaWd6aXAub2JqICQoU1RBVElDTElCKQotCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoU1RBVElDTElCKQotCi1leGFtcGxlX2QuZXhlOiBleGFtcGxlLm9iaiAkKElNUExJQikKLQkkKExEKSAkKExERkxBR1MpIC1vdXQ6JEAgZXhhbXBsZS5vYmogJChJTVBMSUIpCi0KLW1pbmlnemlwX2QuZXhlOiBtaW5pZ3ppcC5vYmogJChJTVBMSUIpCi0JJChMRCkgJChMREZMQUdTKSAtb3V0OiRAIG1pbmlnemlwLm9iaiAkKElNUExJQikKLQotLmMub2JqOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkPAotCi0uYXNtLm9iajoKLQkkKEFTKSAtYyAkKEFTRkxBR1MpICQ8Ci0KLWFkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKLQotY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCi0KLWNyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCi0KLWRlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZ3ppby5vYmo6IGd6aW8uYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0KLWluZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCi0gICAgICAgICAgICAgaW5mZmFzdC5oIGluZmZpeGVkLmgKLQotaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSAgICAgICAgICAgICBpbmZmYXN0LmgKLQotaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKLSAgICAgICAgICAgICBpbmZmYXN0LmggaW5mZml4ZWQuaAotCi1pbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi0KLXRyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCi0KLXVuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKLQotenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLQotZXhhbXBsZS5vYmo6IGV4YW1wbGUuYyB6bGliLmggemNvbmYuaAotCi1taW5pZ3ppcC5vYmo6IG1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKLQotemxpYjEucmVzOiB3aW4zMi96bGliMS5yYwotCSQoUkMpICQoUkNGTEFHUykgL2ZvJEAgd2luMzIvemxpYjEucmMKLQotCi0jIHRlc3RpbmcKLXRlc3Q6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQotCWV4YW1wbGUKLQllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZAotCi10ZXN0ZGxsOiBleGFtcGxlX2QuZXhlIG1pbmlnemlwX2QuZXhlCi0JZXhhbXBsZV9kCi0JZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwX2QgfCBtaW5pZ3ppcF9kIC1kCi0KLQotIyBjbGVhbnVwCi1jbGVhbjoKLQktZGVsICQoU1RBVElDTElCKQotCS1kZWwgJChTSEFSRURMSUIpCi0JLWRlbCAkKElNUExJQikKLQktZGVsICoub2JqCi0JLWRlbCAqLnJlcwotCS1kZWwgKi5leHAKLQktZGVsICouZXhlCi0JLWRlbCBmb28uZ3oKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi93aW4zMi9WaXN1YWxDLnR4dCBiL2xpYnMvemxpYi93aW4zMi9WaXN1YWxDLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5YTVmYy4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvd2luMzIvVmlzdWFsQy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotVG8gYnVpbGQgemxpYiB1c2luZyB0aGUgTWljcm9zb2Z0IFZpc3VhbCBDKysgZW52aXJvbm1lbnQsCi11c2UgdGhlIGFwcHJvcHJpYXRlIHByb2plY3QgZnJvbSB0aGUgcHJvamVjdHMvIGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi93aW4zMi96bGliLmRlZiBiL2xpYnMvemxpYi93aW4zMi96bGliLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3Y2JjMS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvd2luMzIvemxpYi5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1MSUJSQVJZCi07IHpsaWIgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0KLUVYUE9SVFMKLTsgYmFzaWMgZnVuY3Rpb25zCi0gICAgemxpYlZlcnNpb24KLSAgICBkZWZsYXRlCi0gICAgZGVmbGF0ZUVuZAotICAgIGluZmxhdGUKLSAgICBpbmZsYXRlRW5kCi07IGFkdmFuY2VkIGZ1bmN0aW9ucwotICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5Ci0gICAgZGVmbGF0ZUNvcHkKLSAgICBkZWZsYXRlUmVzZXQKLSAgICBkZWZsYXRlUGFyYW1zCi0gICAgZGVmbGF0ZUJvdW5kCi0gICAgZGVmbGF0ZVByaW1lCi0gICAgaW5mbGF0ZVNldERpY3Rpb25hcnkKLSAgICBpbmZsYXRlU3luYwotICAgIGluZmxhdGVDb3B5Ci0gICAgaW5mbGF0ZVJlc2V0Ci0gICAgaW5mbGF0ZUJhY2sKLSAgICBpbmZsYXRlQmFja0VuZAotICAgIHpsaWJDb21waWxlRmxhZ3MKLTsgdXRpbGl0eSBmdW5jdGlvbnMKLSAgICBjb21wcmVzcwotICAgIGNvbXByZXNzMgotICAgIGNvbXByZXNzQm91bmQKLSAgICB1bmNvbXByZXNzCi0gICAgZ3pvcGVuCi0gICAgZ3pkb3BlbgotICAgIGd6c2V0cGFyYW1zCi0gICAgZ3pyZWFkCi0gICAgZ3p3cml0ZQotICAgIGd6cHJpbnRmCi0gICAgZ3pwdXRzCi0gICAgZ3pnZXRzCi0gICAgZ3pwdXRjCi0gICAgZ3pnZXRjCi0gICAgZ3p1bmdldGMKLSAgICBnemZsdXNoCi0gICAgZ3pzZWVrCi0gICAgZ3pyZXdpbmQKLSAgICBnenRlbGwKLSAgICBnemVvZgotICAgIGd6Y2xvc2UKLSAgICBnemVycm9yCi0gICAgZ3pjbGVhcmVycgotOyBjaGVja3N1bSBmdW5jdGlvbnMKLSAgICBhZGxlcjMyCi0gICAgY3JjMzIKLTsgdmFyaW91cyBoYWNrcywgZG9uJ3QgbG9vayA6KQotICAgIGRlZmxhdGVJbml0XwotICAgIGRlZmxhdGVJbml0Ml8KLSAgICBpbmZsYXRlSW5pdF8KLSAgICBpbmZsYXRlSW5pdDJfCi0gICAgaW5mbGF0ZUJhY2tJbml0XwotICAgIGluZmxhdGVTeW5jUG9pbnQKLSAgICBnZXRfY3JjX3RhYmxlCi0gICAgekVycm9yCmRpZmYgLS1naXQgYS9saWJzL3psaWIvd2luMzIvemxpYjEucmMgYi9saWJzL3psaWIvd2luMzIvemxpYjEucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MDI1YzkuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL3dpbjMyL3psaWIxLnJjCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2lmZGVmIEdDQ19XSU5EUkVTCi1WU19WRVJTSU9OX0lORk8JCVZFUlNJT05JTkZPCi0jZWxzZQotVlNfVkVSU0lPTl9JTkZPCQlWRVJTSU9OSU5GTwlNT1ZFQUJMRSBJTVBVUkUgTE9BRE9OQ0FMTCBESVNDQVJEQUJMRQotI2VuZGlmCi0gIEZJTEVWRVJTSU9OCQkxLDIsMiwwCi0gIFBST0RVQ1RWRVJTSU9OCTEsMiwyLDAKLSAgRklMRUZMQUdTTUFTSwkJVlNfRkZJX0ZJTEVGTEFHU01BU0sKLSNpZmRlZiBfREVCVUcKLSAgRklMRUZMQUdTCQkxCi0jZWxzZQotICBGSUxFRkxBR1MJCTAKLSNlbmRpZgotICBGSUxFT1MJCVZPU19ET1NfV0lORE9XUzMyCi0gIEZJTEVUWVBFCQlWRlRfRExMCi0gIEZJTEVTVUJUWVBFCQkwCS8vIG5vdCB1c2VkCi1CRUdJTgotICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0gIEJFR0lOCi0gICAgQkxPQ0sgIjA0MDkwNEU0IgotICAgIC8vbGFuZ3VhZ2UgSUQgPSBVLlMuIEVuZ2xpc2gsIGNoYXIgc2V0ID0gV2luZG93cywgTXVsdGlsaW5ndWFsCi0gICAgQkVHSU4KLSAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLAkiemxpYiBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnlcMCIKLSAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsCSIxLjIuM1wwIgotICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsCSJ6bGliMS5kbGxcMCIKLSAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsCSIoQykgMTk5NS0yMDA0IEplYW4tbG91cCBHYWlsbHkgJiBNYXJrIEFkbGVyXDAiCi0gICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsCSJ6bGliMS5kbGxcMCIKLSAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsCSJ6bGliXDAiCi0gICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLAkiMS4yLjNcMCIKLSAgICAgIFZBTFVFICJDb21tZW50cyIsIkRMTCBzdXBwb3J0IGJ5IEFsZXNzYW5kcm8gSWFjb3BldHRpICYgR2lsbGVzIFZvbGxhbnRcMCIKLSAgICBFTkQKLSAgRU5ECi0gIEJMT0NLICJWYXJGaWxlSW5mbyIKLSAgQkVHSU4KLSAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDA0MDksIDEyNTIKLSAgRU5ECi1FTkQKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi96Y29uZi5oIGIvbGlicy96bGliL3pjb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMmI3ZjYuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL3pjb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNpZm5kZWYgWkNPTkZfSAotI2RlZmluZSBaQ09ORl9ICi0KLS8qCi0gKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCi0gKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KLSAqLwotI2lmZGVmIFpfUFJFRklYCi0jICBkZWZpbmUgZGVmbGF0ZUluaXRfICAgICAgICAgIHpfZGVmbGF0ZUluaXRfCi0jICBkZWZpbmUgZGVmbGF0ZSAgICAgICAgICAgICAgIHpfZGVmbGF0ZQotIyAgZGVmaW5lIGRlZmxhdGVFbmQgICAgICAgICAgICB6X2RlZmxhdGVFbmQKLSMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICAgel9pbmZsYXRlSW5pdF8KLSMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCi0jICBkZWZpbmUgaW5mbGF0ZUVuZCAgICAgICAgICAgIHpfaW5mbGF0ZUVuZAotIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KLSMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5Ci0jICBkZWZpbmUgZGVmbGF0ZVJlc2V0ICAgICAgICAgIHpfZGVmbGF0ZVJlc2V0Ci0jICBkZWZpbmUgZGVmbGF0ZVBhcmFtcyAgICAgICAgIHpfZGVmbGF0ZVBhcmFtcwotIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgICAgICAgICB6X2RlZmxhdGVCb3VuZAotIyAgZGVmaW5lIGRlZmxhdGVQcmltZSAgICAgICAgICB6X2RlZmxhdGVQcmltZQotIyAgZGVmaW5lIGluZmxhdGVJbml0Ml8gICAgICAgICB6X2luZmxhdGVJbml0Ml8KLSMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSAgel9pbmZsYXRlU2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGluZmxhdGVTeW5jICAgICAgICAgICB6X2luZmxhdGVTeW5jCi0jICBkZWZpbmUgaW5mbGF0ZVN5bmNQb2ludCAgICAgIHpfaW5mbGF0ZVN5bmNQb2ludAotIyAgZGVmaW5lIGluZmxhdGVDb3B5ICAgICAgICAgICB6X2luZmxhdGVDb3B5Ci0jICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0Ci0jICBkZWZpbmUgaW5mbGF0ZUJhY2sgICAgICAgICAgIHpfaW5mbGF0ZUJhY2sKLSMgIGRlZmluZSBpbmZsYXRlQmFja0VuZCAgICAgICAgel9pbmZsYXRlQmFja0VuZAotIyAgZGVmaW5lIGNvbXByZXNzICAgICAgICAgICAgICB6X2NvbXByZXNzCi0jICBkZWZpbmUgY29tcHJlc3MyICAgICAgICAgICAgIHpfY29tcHJlc3MyCi0jICBkZWZpbmUgY29tcHJlc3NCb3VuZCAgICAgICAgIHpfY29tcHJlc3NCb3VuZAotIyAgZGVmaW5lIHVuY29tcHJlc3MgICAgICAgICAgICB6X3VuY29tcHJlc3MKLSMgIGRlZmluZSBhZGxlcjMyICAgICAgICAgICAgICAgel9hZGxlcjMyCi0jICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgIHpfY3JjMzIKLSMgIGRlZmluZSBnZXRfY3JjX3RhYmxlICAgICAgICAgel9nZXRfY3JjX3RhYmxlCi0jICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCi0KLSMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCi0jICBkZWZpbmUgZnJlZV9mdW5jICAgICAgICAgICAgIHpfZnJlZV9mdW5jCi0jICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYwotIyAgZGVmaW5lIG91dF9mdW5jICAgICAgICAgICAgICB6X291dF9mdW5jCi0jICBkZWZpbmUgQnl0ZSAgICAgICAgICAgICAgICAgIHpfQnl0ZQotIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKLSMgIGRlZmluZSB1TG9uZyAgICAgICAgICAgICAgICAgel91TG9uZwotIyAgZGVmaW5lIEJ5dGVmICAgICAgICAgICAgICAgICB6X0J5dGVmCi0jICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKLSMgIGRlZmluZSBpbnRmICAgICAgICAgICAgICAgICAgel9pbnRmCi0jICBkZWZpbmUgdUludGYgICAgICAgICAgICAgICAgIHpfdUludGYKLSMgIGRlZmluZSB1TG9uZ2YgICAgICAgICAgICAgICAgel91TG9uZ2YKLSMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKLSMgIGRlZmluZSB2b2lkcCAgICAgICAgICAgICAgICAgel92b2lkcAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoTVNET1MpCi0jICBkZWZpbmUgTVNET1MKLSNlbmRpZgotI2lmIChkZWZpbmVkKE9TXzIpIHx8IGRlZmluZWQoX19PUzJfXykpICYmICFkZWZpbmVkKE9TMikKLSMgIGRlZmluZSBPUzIKLSNlbmRpZgotI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCi0jICBkZWZpbmUgV0lORE9XUwotI2VuZGlmCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0jICBpZm5kZWYgV0lOMzIKLSMgICAgZGVmaW5lIFdJTjMyCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiAhZGVmaW5lZChXSU4zMikKLSMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX18zODZfXykKLSMgICAgaWZuZGVmIFNZUzE2QklUCi0jICAgICAgZGVmaW5lIFNZUzE2QklUCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qCi0gKiBDb21waWxlIHdpdGggLURNQVhTRUdfNjRLIGlmIHRoZSBhbGxvYyBmdW5jdGlvbiBjYW5ub3QgYWxsb2NhdGUgbW9yZQotICogdGhhbiA2NGsgYnl0ZXMgYXQgYSB0aW1lIChuZWVkZWQgb24gc3lzdGVtcyB3aXRoIDE2LWJpdCBpbnQpLgotICovCi0jaWZkZWYgU1lTMTZCSVQKLSMgIGRlZmluZSBNQVhTRUdfNjRLCi0jZW5kaWYKLSNpZmRlZiBNU0RPUwotIyAgZGVmaW5lIFVOQUxJR05FRF9PSwotI2VuZGlmCi0KLSNpZmRlZiBfX1NURENfVkVSU0lPTl9fCi0jICBpZm5kZWYgU1REQwotIyAgICBkZWZpbmUgU1REQwotIyAgZW5kaWYKLSMgIGlmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAotIyAgICBpZm5kZWYgU1REQzk5Ci0jICAgICAgZGVmaW5lIFNUREM5OQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSkKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChfX0hPU19BSVhfXykpCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fT1M0MDBfXykgJiYgIWRlZmluZWQoU1REQykgICAgLyogaVNlcmllcyAoZm9ybWVybHkgQVMvNDAwKS4gKi8KLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLQotI2lmbmRlZiBTVERDCi0jICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCi0jICAgIGRlZmluZSBjb25zdCAgICAgICAvKiBub3RlOiBuZWVkIGEgbW9yZSBnZW50bGUgc29sdXRpb24gaGVyZSAqLwotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLwotI2lmIGRlZmluZWQoX19NV0VSS1NfXyl8fGRlZmluZWQoYXBwbGVjKXx8ZGVmaW5lZChUSElOS19DKXx8ZGVmaW5lZChfX1NDX18pCi0jICBkZWZpbmUgTk9fRFVNTVlfREVDTAotI2VuZGlmCi0KLS8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLwotI2lmbmRlZiBNQVhfTUVNX0xFVkVMCi0jICBpZmRlZiBNQVhTRUdfNjRLCi0jICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgotICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcwotICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5Ci0gKiBnemlwLikKLSAqLwotI2lmbmRlZiBNQVhfV0JJVFMKLSMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KLSNlbmRpZgotCi0vKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKLSAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCi0gdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCi0gcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKLSB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKLSAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgotIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCi0KLSAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cwotIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKLSBmb3Igc21hbGwgb2JqZWN0cy4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotIyAgaWZkZWYgU1REQwotIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBGQVIgYXJlIG5lZWRlZCBvbmx5IGZvciBNU0RPUyBtaXhlZAotICogbW9kZWwgcHJvZ3JhbW1pbmcgKHNtYWxsIG9yIG1lZGl1bSBtb2RlbCB3aXRoIHNvbWUgZmFyIGFsbG9jYXRpb25zKS4KLSAqIFRoaXMgd2FzIHRlc3RlZCBvbmx5IHdpdGggTVNDOyBmb3Igb3RoZXIgTVNET1MgY29tcGlsZXJzIHlvdSBtYXkgaGF2ZQotICogdG8gZGVmaW5lIE5PX01FTUNQWSBpbiB6dXRpbC5oLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlIG1peGVkIG1vZGVsLAotICoganVzdCBkZWZpbmUgRkFSIHRvIGJlIGVtcHR5LgotICovCi0jaWZkZWYgU1lTMTZCSVQKLSMgIGlmIGRlZmluZWQoTV9JODZTTSkgfHwgZGVmaW5lZChNX0k4Nk1NKQotICAgICAvKiBNU0Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCi0jICAgIGRlZmluZSBTTUFMTF9NRURJVU0KLSMgICAgaWZkZWYgX01TQ19WRVIKLSMgICAgICBkZWZpbmUgRkFSIF9mYXIKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBGQVIgZmFyCi0jICAgIGVuZGlmCi0jICBlbmRpZgotIyAgaWYgKGRlZmluZWQoX19TTUFMTF9fKSB8fCBkZWZpbmVkKF9fTUVESVVNX18pKQotICAgICAvKiBUdXJibyBDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgICBkZWZpbmUgU01BTExfTUVESVVNCi0jICAgIGlmZGVmIF9fQk9STEFORENfXwotIyAgICAgIGRlZmluZSBGQVIgX2ZhcgotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIEZBUiBmYXIKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikKLSAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgYXMgYSBETEwsIGRlZmluZSBaTElCX0RMTC4KLSAgICAqIFRoaXMgaXMgbm90IG1hbmRhdG9yeSwgYnV0IGl0IG9mZmVycyBhIGxpdHRsZSBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KLSAgICAqLwotIyAgaWZkZWYgWkxJQl9ETEwKLSMgICAgaWYgZGVmaW5lZChXSU4zMikgJiYgKCFkZWZpbmVkKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA+PSAweDUwMCkpCi0jICAgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAotIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICAgIGVsc2UKLSMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYgIC8qIFpMSUJfRExMICovCi0gICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIHdpdGggdGhlIFdJTkFQSS9XSU5BUElWIGNhbGxpbmcgY29udmVudGlvbiwKLSAgICAqIGRlZmluZSBaTElCX1dJTkFQSS4KLSAgICAqIENhdXRpb246IHRoZSBzdGFuZGFyZCBaTElCMS5ETEwgaXMgTk9UIGNvbXBpbGVkIHVzaW5nIFpMSUJfV0lOQVBJLgotICAgICovCi0jICBpZmRlZiBaTElCX1dJTkFQSQotIyAgICBpZmRlZiBGQVIKLSMgICAgICB1bmRlZiBGQVIKLSMgICAgZW5kaWYKLSMgICAgaW5jbHVkZSA8d2luZG93cy5oPgotICAgICAvKiBObyBuZWVkIGZvciBfZXhwb3J0LCB1c2UgWkxJQi5ERUYgaW5zdGVhZC4gKi8KLSAgICAgLyogRm9yIGNvbXBsZXRlIFdpbmRvd3MgY29tcGF0aWJpbGl0eSwgdXNlIFdJTkFQSSwgbm90IF9fc3RkY2FsbC4gKi8KLSMgICAgZGVmaW5lIFpFWFBPUlQgV0lOQVBJCi0jICAgIGlmZGVmIFdJTjMyCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBXSU5BUElWCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIEZBUiBDREVDTAotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19CRU9TX18pCi0jICBpZmRlZiBaTElCX0RMTAotIyAgICBpZmRlZiBaTElCX0lOVEVSTkFMCi0jICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFpFWFRFUk4KLSMgIGRlZmluZSBaRVhURVJOIGV4dGVybgotI2VuZGlmCi0jaWZuZGVmIFpFWFBPUlQKLSMgIGRlZmluZSBaRVhQT1JUCi0jZW5kaWYKLSNpZm5kZWYgWkVYUE9SVFZBCi0jICBkZWZpbmUgWkVYUE9SVFZBCi0jZW5kaWYKLQotI2lmbmRlZiBGQVIKLSMgIGRlZmluZSBGQVIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX19NQUNUWVBFU19fKQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCeXRlOyAgLyogOCBiaXRzICovCi0jZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgdUludDsgIC8qIDE2IGJpdHMgb3IgbW9yZSAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICB1TG9uZzsgLyogMzIgYml0cyBvciBtb3JlICovCi0KLSNpZmRlZiBTTUFMTF9NRURJVU0KLSAgIC8qIEJvcmxhbmQgQy9DKysgYW5kIHNvbWUgb2xkIE1TQyB2ZXJzaW9ucyBpZ25vcmUgRkFSIGluc2lkZSB0eXBlZGVmICovCi0jICBkZWZpbmUgQnl0ZWYgQnl0ZSBGQVIKLSNlbHNlCi0gICB0eXBlZGVmIEJ5dGUgIEZBUiBCeXRlZjsKLSNlbmRpZgotdHlwZWRlZiBjaGFyICBGQVIgY2hhcmY7Ci10eXBlZGVmIGludCAgIEZBUiBpbnRmOwotdHlwZWRlZiB1SW50ICBGQVIgdUludGY7Ci10eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7Ci0KLSNpZmRlZiBTVERDCi0gICB0eXBlZGVmIHZvaWQgY29uc3QgKnZvaWRwYzsKLSAgIHR5cGVkZWYgdm9pZCBGQVIgICAqdm9pZHBmOwotICAgdHlwZWRlZiB2b2lkICAgICAgICp2b2lkcDsKLSNlbHNlCi0gICB0eXBlZGVmIEJ5dGUgY29uc3QgKnZvaWRwYzsKLSAgIHR5cGVkZWYgQnl0ZSBGQVIgICAqdm9pZHBmOwotICAgdHlwZWRlZiBCeXRlICAgICAgICp2b2lkcDsKLSNlbmRpZgotCi0jaWYgSEFWRV9VTklTVERfSCAgICAgICAgICAgLyogSEFWRV9VTklTVERfSCAtLSB0aGlzIGxpbmUgaXMgdXBkYXRlZCBieSAuL2NvbmZpZ3VyZSAqLwotIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBvZmZfdCAqLwotIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgIC8qIGZvciBTRUVLXyogYW5kIG9mZl90ICovCi0jICBpZmRlZiBWTVMKLSMgICAgaW5jbHVkZSA8dW5peGlvLmg+ICAgLyogZm9yIG9mZl90ICovCi0jICBlbmRpZgotIyAgZGVmaW5lIHpfb2ZmX3Qgb2ZmX3QKLSNlbmRpZgotI2lmbmRlZiBTRUVLX1NFVAotIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCi0jICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLwotIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KLSNlbmRpZgotI2lmbmRlZiB6X29mZl90Ci0jICBkZWZpbmUgel9vZmZfdCBsb25nCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19PUzQwMF9fKQotIyAgZGVmaW5lIE5PX3ZzbnByaW50ZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fTVZTX18pCi0jICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jICBpZmRlZiBGQVIKLSMgICAgdW5kZWYgRkFSCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCi0jaWYgZGVmaW5lZChfX01WU19fKQotIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXRfLCJERUlOIikKLSMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0Ml8sIkRFSU4yIikKLSMgICBwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKLSMgICBwcmFnbWEgbWFwKGRlZmxhdGVCb3VuZCwiREVCTkQiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQotIyAgIHByYWdtYSBtYXAoY29tcHJlc3NCb3VuZCwiQ01CTkQiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90YWJsZSwiSU5UQUJMIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX2NvcHlyaWdodCwiSU5DT1BZIikKLSNlbmRpZgotCi0jZW5kaWYgLyogWkNPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3pjb25mLmluLmggYi9saWJzL3psaWIvemNvbmYuaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhOTQzMS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvemNvbmYuaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKiB6Y29uZi5oIC0tIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2lmbmRlZiBaQ09ORl9ICi0jZGVmaW5lIFpDT05GX0gKLQotLyoKLSAqIElmIHlvdSAqcmVhbGx5KiBuZWVkIGEgdW5pcXVlIHByZWZpeCBmb3IgYWxsIHR5cGVzIGFuZCBsaWJyYXJ5IGZ1bmN0aW9ucywKLSAqIGNvbXBpbGUgd2l0aCAtRFpfUFJFRklYLiBUaGUgInN0YW5kYXJkIiB6bGliIHNob3VsZCBiZSBjb21waWxlZCB3aXRob3V0IGl0LgotICovCi0jaWZkZWYgWl9QUkVGSVgKLSMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KLSMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCi0jICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAotIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XwotIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgICB6X2luZmxhdGUKLSMgIGRlZmluZSBpbmZsYXRlRW5kICAgICAgICAgICAgel9pbmZsYXRlRW5kCi0jICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXwotIyAgZGVmaW5lIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2RlZmxhdGVTZXREaWN0aW9uYXJ5Ci0jICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKLSMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKLSMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCi0jICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCi0jICBkZWZpbmUgZGVmbGF0ZVByaW1lICAgICAgICAgIHpfZGVmbGF0ZVByaW1lCi0jICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXwotIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5Ci0jICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKLSMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50Ci0jICBkZWZpbmUgaW5mbGF0ZUNvcHkgICAgICAgICAgIHpfaW5mbGF0ZUNvcHkKLSMgIGRlZmluZSBpbmZsYXRlUmVzZXQgICAgICAgICAgel9pbmZsYXRlUmVzZXQKLSMgIGRlZmluZSBpbmZsYXRlQmFjayAgICAgICAgICAgel9pbmZsYXRlQmFjawotIyAgZGVmaW5lIGluZmxhdGVCYWNrRW5kICAgICAgICB6X2luZmxhdGVCYWNrRW5kCi0jICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKLSMgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKLSMgIGRlZmluZSBjb21wcmVzc0JvdW5kICAgICAgICAgel9jb21wcmVzc0JvdW5kCi0jICBkZWZpbmUgdW5jb21wcmVzcyAgICAgICAgICAgIHpfdW5jb21wcmVzcwotIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKLSMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgotIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKLSMgIGRlZmluZSB6RXJyb3IgICAgICAgICAgICAgICAgel96RXJyb3IKLQotIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKLSMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKLSMgIGRlZmluZSBpbl9mdW5jICAgICAgICAgICAgICAgel9pbl9mdW5jCi0jICBkZWZpbmUgb3V0X2Z1bmMgICAgICAgICAgICAgIHpfb3V0X2Z1bmMKLSMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCi0jICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAotIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCi0jICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKLSMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgotIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKLSMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgotIyAgZGVmaW5lIHVMb25nZiAgICAgICAgICAgICAgICB6X3VMb25nZgotIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgICAgICAgICB6X3ZvaWRwZgotIyAgZGVmaW5lIHZvaWRwICAgICAgICAgICAgICAgICB6X3ZvaWRwCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChNU0RPUykKLSMgIGRlZmluZSBNU0RPUwotI2VuZGlmCi0jaWYgKGRlZmluZWQoT1NfMikgfHwgZGVmaW5lZChfX09TMl9fKSkgJiYgIWRlZmluZWQoT1MyKQotIyAgZGVmaW5lIE9TMgotI2VuZGlmCi0jaWYgZGVmaW5lZChfV0lORE9XUykgJiYgIWRlZmluZWQoV0lORE9XUykKLSMgIGRlZmluZSBXSU5ET1dTCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKLSMgIGlmbmRlZiBXSU4zMgotIyAgICBkZWZpbmUgV0lOMzIKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lORE9XUykpICYmICFkZWZpbmVkKFdJTjMyKQotIyAgaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfXzM4Nl9fKQotIyAgICBpZm5kZWYgU1lTMTZCSVQKLSMgICAgICBkZWZpbmUgU1lTMTZCSVQKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyoKLSAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCi0gKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCi0gKi8KLSNpZmRlZiBTWVMxNkJJVAotIyAgZGVmaW5lIE1BWFNFR182NEsKLSNlbmRpZgotI2lmZGVmIE1TRE9TCi0jICBkZWZpbmUgVU5BTElHTkVEX09LCi0jZW5kaWYKLQotI2lmZGVmIF9fU1REQ19WRVJTSU9OX18KLSMgIGlmbmRlZiBTVERDCi0jICAgIGRlZmluZSBTVERDCi0jICBlbmRpZgotIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCi0jICAgIGlmbmRlZiBTVERDOTkKLSMgICAgICBkZWZpbmUgU1REQzk5Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykpCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0jaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0jaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fSE9TX0FJWF9fKSkKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19PUzQwMF9fKSAmJiAhZGVmaW5lZChTVERDKSAgICAvKiBpU2VyaWVzIChmb3JtZXJseSBBUy80MDApLiAqLwotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotCi0jaWZuZGVmIFNUREMKLSMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KLSMgICAgZGVmaW5lIGNvbnN0ICAgICAgIC8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCi0jaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKLSMgIGRlZmluZSBOT19EVU1NWV9ERUNMCi0jZW5kaWYKLQotLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCi0jaWZuZGVmIE1BWF9NRU1fTEVWRUwKLSMgIGlmZGVmIE1BWFNFR182NEsKLSMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAotIyAgZWxzZQotIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5Ci0jICBlbmRpZgotI2VuZGlmCi0KLS8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCi0gKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCi0gKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKLSAqIGd6aXAuKQotICovCi0jaWZuZGVmIE1BWF9XQklUUwotIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLwotI2VuZGlmCi0KLS8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgotICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKLSB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKLSBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQotIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAotICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCi0gT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KLQotICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCi0gdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcwotIGZvciBzbWFsbCBvYmplY3RzLgotKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KLQotI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0jICBpZmRlZiBTVERDCi0jICAgIGRlZmluZSBPRihhcmdzKSAgYXJncwotIyAgZWxzZQotIyAgICBkZWZpbmUgT0YoYXJncykgICgpCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCi0gKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgotICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCi0gKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCi0gKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCi0gKi8KLSNpZmRlZiBTWVMxNkJJVAotIyAgaWYgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pCi0gICAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KLSMgICAgZGVmaW5lIFNNQUxMX01FRElVTQotIyAgICBpZmRlZiBfTVNDX1ZFUgotIyAgICAgIGRlZmluZSBGQVIgX2ZhcgotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIEZBUiBmYXIKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jICBpZiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCi0gICAgIC8qIFR1cmJvIEMgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCi0jICAgIGRlZmluZSBTTUFMTF9NRURJVU0KLSMgICAgaWZkZWYgX19CT1JMQU5EQ19fCi0jICAgICAgZGVmaW5lIEZBUiBfZmFyCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgRkFSIGZhcgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKQotICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiBhcyBhIERMTCwgZGVmaW5lIFpMSUJfRExMLgotICAgICogVGhpcyBpcyBub3QgbWFuZGF0b3J5LCBidXQgaXQgb2ZmZXJzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGluY3JlYXNlLgotICAgICovCi0jICBpZmRlZiBaTElCX0RMTAotIyAgICBpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKSkKLSMgICAgICBpZmRlZiBaTElCX0lOVEVSTkFMCi0jICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jICAgICAgZWxzZQotIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICBlbmRpZiAgLyogWkxJQl9ETEwgKi8KLSAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgd2l0aCB0aGUgV0lOQVBJL1dJTkFQSVYgY2FsbGluZyBjb252ZW50aW9uLAotICAgICogZGVmaW5lIFpMSUJfV0lOQVBJLgotICAgICogQ2F1dGlvbjogdGhlIHN0YW5kYXJkIFpMSUIxLkRMTCBpcyBOT1QgY29tcGlsZWQgdXNpbmcgWkxJQl9XSU5BUEkuCi0gICAgKi8KLSMgIGlmZGVmIFpMSUJfV0lOQVBJCi0jICAgIGlmZGVmIEZBUgotIyAgICAgIHVuZGVmIEZBUgotIyAgICBlbmRpZgotIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0gICAgIC8qIE5vIG5lZWQgZm9yIF9leHBvcnQsIHVzZSBaTElCLkRFRiBpbnN0ZWFkLiAqLwotICAgICAvKiBGb3IgY29tcGxldGUgV2luZG93cyBjb21wYXRpYmlsaXR5LCB1c2UgV0lOQVBJLCBub3QgX19zdGRjYWxsLiAqLwotIyAgICBkZWZpbmUgWkVYUE9SVCBXSU5BUEkKLSMgICAgaWZkZWYgV0lOMzIKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIFdJTkFQSVYKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgRkFSIENERUNMCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX0JFT1NfXykKLSMgIGlmZGVmIFpMSUJfRExMCi0jICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKLSMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgWkVYVEVSTgotIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCi0jZW5kaWYKLSNpZm5kZWYgWkVYUE9SVAotIyAgZGVmaW5lIFpFWFBPUlQKLSNlbmRpZgotI2lmbmRlZiBaRVhQT1JUVkEKLSMgIGRlZmluZSBaRVhQT1JUVkEKLSNlbmRpZgotCi0jaWZuZGVmIEZBUgotIyAgZGVmaW5lIEZBUgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChfX01BQ1RZUEVTX18pCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KLSNlbmRpZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KLQotI2lmZGVmIFNNQUxMX01FRElVTQotICAgLyogQm9ybGFuZCBDL0MrKyBhbmQgc29tZSBvbGQgTVNDIHZlcnNpb25zIGlnbm9yZSBGQVIgaW5zaWRlIHR5cGVkZWYgKi8KLSMgIGRlZmluZSBCeXRlZiBCeXRlIEZBUgotI2Vsc2UKLSAgIHR5cGVkZWYgQnl0ZSAgRkFSIEJ5dGVmOwotI2VuZGlmCi10eXBlZGVmIGNoYXIgIEZBUiBjaGFyZjsKLXR5cGVkZWYgaW50ICAgRkFSIGludGY7Ci10eXBlZGVmIHVJbnQgIEZBUiB1SW50ZjsKLXR5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKLQotI2lmZGVmIFNUREMKLSAgIHR5cGVkZWYgdm9pZCBjb25zdCAqdm9pZHBjOwotICAgdHlwZWRlZiB2b2lkIEZBUiAgICp2b2lkcGY7Ci0gICB0eXBlZGVmIHZvaWQgICAgICAgKnZvaWRwOwotI2Vsc2UKLSAgIHR5cGVkZWYgQnl0ZSBjb25zdCAqdm9pZHBjOwotICAgdHlwZWRlZiBCeXRlIEZBUiAgICp2b2lkcGY7Ci0gICB0eXBlZGVmIEJ5dGUgICAgICAgKnZvaWRwOwotI2VuZGlmCi0KLSNpZiAwICAgICAgICAgICAvKiBIQVZFX1VOSVNURF9IIC0tIHRoaXMgbGluZSBpcyB1cGRhdGVkIGJ5IC4vY29uZmlndXJlICovCi0jICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogZm9yIG9mZl90ICovCi0jICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgLyogZm9yIFNFRUtfKiBhbmQgb2ZmX3QgKi8KLSMgIGlmZGVmIFZNUwotIyAgICBpbmNsdWRlIDx1bml4aW8uaD4gICAvKiBmb3Igb2ZmX3QgKi8KLSMgIGVuZGlmCi0jICBkZWZpbmUgel9vZmZfdCBvZmZfdAotI2VuZGlmCi0jaWZuZGVmIFNFRUtfU0VUCi0jICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KLSMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCi0jICBkZWZpbmUgU0VFS19FTkQgICAgICAgIDIgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IiAqLwotI2VuZGlmCi0jaWZuZGVmIHpfb2ZmX3QKLSMgIGRlZmluZSB6X29mZl90IGxvbmcKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX09TNDAwX18pCi0jICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19NVlNfXykKLSMgIGRlZmluZSBOT192c25wcmludGYKLSMgIGlmZGVmIEZBUgotIyAgICB1bmRlZiBGQVIKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KLSNpZiBkZWZpbmVkKF9fTVZTX18pCi0jICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQotIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQotIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQotIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCi0jICAgcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS9saWJzL3psaWIvemxpYi1kbGwtcmVzLnJjIGIvbGlicy96bGliL3psaWItZGxsLXJlcy5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4ZGRiZS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvemxpYi1kbGwtcmVzLnJjCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDx3aW52ZXIuaD4KLSAgCi0jZGVmaW5lIFZFUl9GSUxFVkVSU0lPTiAxLDIsMywyMDI3Ci0jZGVmaW5lIFZFUl9GSUxFVkVSU0lPTl9TVFIgIjEuMi4zLjIwMjciCi0jZGVmaW5lIFZFUl9GSUxFTFRWRVJTSU9OX1NUUiAiWmxpYjogZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gLyBkZWNvbXByZXNzaW9uIGxpYnJhcnkiCi0jZGVmaW5lIFZFUl9MRUdBTENPUFlSSUdIVF9TVFIgIqkgMjAwNSBKZWFuLWxvdXAgR2FpbGx5IDxqbG91cEBnemlwLm9yZyA+LCBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PiIKLS8vI2RlZmluZSBWRVJfQ09NTUVOVF9TVFIgICIiCSAKLQotI2RlZmluZSBWRVJfRklMRURFU0NSSVBUSU9OX1NUUiAiWmxpYjogZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gLyBkZWNvbXByZXNzaW9uIGxpYnJhcnkiCi0jZGVmaW5lIFZFUl9JTlRFUk5BTE5BTUVfU1RSICJ6bGliMSIKLSNkZWZpbmUgVkVSX09SSUdJTkFMRklMRU5BTUVfU1RSICJ6bGliMS5kbGwiCi0jZGVmaW5lIFZFUl9XV1dfU1RSICJodHRwOi8vd3d3LnpsaWIubmV0IgotI2RlZmluZSBWRVJfQ09NUEFOWU5BTUVfU1RSICJabGliIgotI2RlZmluZSBWRVJfTElDRU5TRV9TVFIgIihDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlciBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLiBKZWFuLWxvdXAgR2FpbGx5IE1hcmsgQWRsZXIgamxvdXBAZ3ppcC5vcmcgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSAiCi0jZGVmaW5lIFZFUl9MRUdBTFRSQURFTUFSS1NfU1RSICJabGliriwgWmxpYq4sIHpsaWIxriIKLQotI2RlZmluZSBWRVJfUFJPRFVDVE5BTUVfU1RSICJabGliIgotI2RlZmluZSBWRVJfUFJPRFVDVFZFUlNJT04gMSwyLDMsMjAyNwotI2RlZmluZSBWRVJfUFJPRFVDVFZFUlNJT05fU1RSICIxLjIuMy4yMDI3IgotCi0KLSN1bmRlZiBPRkZJQ0lBTAotI2RlZmluZSBGSU5BTCAgICAgICAgICAgIDEKLQotI2RlZmluZSBHTlVXSU4zMl9TUEVDSUFMQlVJTERfU1RSCSJHTlUgZm9yIFdpbjMyIDxnbnV3aW4zMi5zb3VyY2Vmb3JnZS5uZXQ+IgotCi0jZGVmaW5lIFZFUl9GSUxFVFlQRQkJCVZGVF9ETEwKLSNpZm5kZWYgVkVSX0ZJTEVUWVBFCi0jZGVmaW5lIFZFUl9GSUxFVFlQRSAgICAgICAgICAgICAgICBWRlRfQVBQCi0jZW5kaWYKLQotI2RlZmluZSBWRVJfRklMRVNVQlRZUEUgICAgICAgICAgICAgVkZUMl9VTktOT1dOCi0KLSNpZm5kZWYgREVCVUcKLSNkZWZpbmUgVkVSX0RFQlVHICAgICAgICAgICAgICAgICAgIDAKLSNlbHNlIC8qIERFQlVHICovCi0jZGVmaW5lIFZFUl9ERUJVRyAgICAgICAgICAgICAgICAgICBWU19GRl9ERUJVRwotI2VuZGlmCi0KLSNpZm5kZWYgUEFUQ0hFRAotI2RlZmluZSBWRVJfUEFUQ0hFRCAgICAgICAgICAgICAgICAgICAwCi0jZWxzZSAvKiBQQVRDSEVEICovCi0jZGVmaW5lIFZFUl9QQVRDSEVEICAgICAgICAgICAgICAgICAgIFZTX0ZGX1BBVENIRUQKLSNlbmRpZgotCi0jaWZuZGVmIE9GRklDSUFMCi0jZGVmaW5lIFZFUl9TUEVDSUFMQlVJTEQgICAgICAgICAgICBWU19GRl9TUEVDSUFMQlVJTEQKLSNpZm5kZWYgVkVSX1NQRUNJQUxCVUlMRF9TVFIKLSNkZWZpbmUgVkVSX1NQRUNJQUxCVUlMRF9TVFIJCUdOVVdJTjMyX1NQRUNJQUxCVUlMRF9TVFIKLSNlbmRpZgotI2Vsc2UgLyogT0ZGSUNJQUwgKi8KLSNkZWZpbmUgVkVSX1NQRUNJQUxCVUlMRCAgICAgICAgICAgIDAKLSNlbmRpZiAvKiBPRkZJQ0lBTCAqLwotCi0jaWZuZGVmIEZJTkFMCi0jZGVmaW5lIFZFUl9QUklWQVRFQlVJTEQgICAgICAgICAgICBWU19GRl9QUklWQVRFQlVJTEQKLSNpZm5kZWYgVkVSX1BSSVZBVEVCVUlMRF9TVFIKLSNkZWZpbmUgVkVSX1BSSVZBVEVCVUlMRF9TVFIJCSJQcmUtcmVsZWFzZSIKLSNlbmRpZiAvKiBWRVJfUFJJVkFURUJVSUxEX1NUUiAqLwotI2RlZmluZSBWRVJfUFJFUkVMRUFTRSAgICAgICAgICAgICAgVlNfRkZfUFJFUkVMRUFTRQotI2Vsc2UgLyogRklOQUwgKi8KLSNkZWZpbmUgVkVSX1BSSVZBVEVCVUlMRCAgICAgICAgICAgIDAKLSNkZWZpbmUgVkVSX1BSRVJFTEVBU0UgICAgICAgICAgICAgIDAKLSNlbmRpZiAvKiBGSU5BTCAqLwotCi0jZGVmaW5lIFZFUl9GSUxFRkxBR1NNQVNLICAgICAgICAgICBWU19GRklfRklMRUZMQUdTTUFTSwotI2RlZmluZSBWRVJfRklMRUZMQUdTICAgICAgICAgICAgICAgKFZFUl9QUklWQVRFQlVJTER8VkVSX1NQRUNJQUxCVUlMRHxWRVJfUFJFUkVMRUFTRXxWRVJfREVCVUd8VkVSX1BBVENIRUQpCi0KLSNkZWZpbmUgVkVSX0ZJTEVPUyAgICAgICAgICAgICAgICAgIFZPU19fV0lORE9XUzMyCi0KLSNpZmRlZiBSQ19JTlZPS0VECi0KLVZTX1ZFUlNJT05fSU5GTyAgICAgICAgIFZFUlNJT05JTkZPCi1GSUxFVkVSU0lPTiAgICAgCVZFUl9GSUxFVkVSU0lPTgotUFJPRFVDVFZFUlNJT04gIAlWRVJfUFJPRFVDVFZFUlNJT04KLUZJTEVGTEFHU01BU0sgICAJVkVSX0ZJTEVGTEFHU01BU0sKLUZJTEVGTEFHUyAgICAgICAJVkVSX0ZJTEVGTEFHUwotRklMRU9TICAgICAgICAgIAlWRVJfRklMRU9TCi1GSUxFVFlQRSAgICAgICAgCVZFUl9GSUxFVFlQRQotRklMRVNVQlRZUEUgICAgIAlWRVJfRklMRVNVQlRZUEUKLQotQkVHSU4KLSAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0gICAgQkVHSU4KLQlCTE9DSyAiMDQwOTA0RTQiCi0gICAgLyogbGFuZ3VhZ2UgSUQgPSBVLlMuIEVuZ2xpc2gsIGNoYXIgc2V0ID0gV2luZG93cywgTXVsdGlsaW5ndWFsICovCi0JQkVHSU4KLSNpZmRlZiBWRVJfQ09NTUVOVF9TVFIKLQkgICAgVkFMVUUgIkNvbW1lbnRzIiwgICAgICAgICAgVkVSX0NPTU1FTlRfU1RSCi0jZW5kaWYKLQkgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgICAgICBWRVJfQ09NUEFOWU5BTUVfU1RSCi0JICAgIFZBTFVFICJMaWNlbnNlIiwJCSAgVkVSX0xJQ0VOU0VfU1RSCi0JICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAgVkVSX0ZJTEVERVNDUklQVElPTl9TVFIKLQkgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgICAgICBWRVJfRklMRVZFUlNJT05fU1RSCi0jaWYgIShWRVJfRklMRVRZUEUtVkZUX0RMTCkKLQkgICAgVkFMVUUgIkxpYlRvb2xGaWxlVmVyc2lvbiIsVkVSX0ZJTEVMVFZFUlNJT05fU1RSCi0jZW5kaWYKLQkJVkFMVUUgIkludGVybmFsTmFtZSIsICAgICBWRVJfSU5URVJOQUxOQU1FX1NUUgotI2lmZGVmIFZFUl9MRUdBTENPUFlSSUdIVF9TVFIKLQkJVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgICBWRVJfTEVHQUxDT1BZUklHSFRfU1RSCi0jZW5kaWYKLSNpZmRlZiBWRVJfTEVHQUxUUkFERU1BUktTX1NUUgotCSAgICBWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgIFZFUl9MRUdBTFRSQURFTUFSS1NfU1RSCi0jZW5kaWYKLQkgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCBWRVJfT1JJR0lOQUxGSUxFTkFNRV9TVFIKLQkgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgICAgICBWRVJfUFJPRFVDVE5BTUVfU1RSCi0JICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICAgVkVSX1BST0RVQ1RWRVJTSU9OX1NUUgotI2lmZGVmIFZFUl9QQVRDSExFVkVMX1NUUgotCSAgICBWQUxVRSAiUGF0Y2ggbGV2ZWwiLCAgVkVSX1BBVENITEVWRUxfU1RSCi0jZW5kaWYKLSNpZmRlZiBWRVJfUFJJVkFURUJVSUxEX1NUUgotCSAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwgIFZFUl9QUklWQVRFQlVJTERfU1RSCi0jZW5kaWYKLSNpZmRlZiBWRVJfU1BFQ0lBTEJVSUxEX1NUUgotCSAgICBWQUxVRSAiU3BlY2lhbEJ1aWxkIiwgIFZFUl9TUEVDSUFMQlVJTERfU1RSCi0jZW5kaWYKLSNpZmRlZiBWRVJfQVVUSE9SX1NUUgotCSAgICBWQUxVRSAiQXV0aG9ycyIsICBWRVJfQVVUSE9SX1NUUgotI2VuZGlmCi0jaWZkZWYgVkVSX1dXV19TVFIKLQkgICAgVkFMVUUgIldXVyIsICBWRVJfV1dXX1NUUgotI2VuZGlmCi1FTkQKLSAgICBFTkQKLSAgICBCTE9DSyAiVmFyRmlsZUluZm8iCi0gICAgQkVHSU4KLQlWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMTI1MgotICAgIEVORAotRU5ECi0KLSNlbmRpZiAvKiAgUkNfSU5WT0tFRCAqLwotNTAwIElDT04gTU9WRUFCTEUgUFVSRSBMT0FET05DQUxMIERJU0NBUkRBQkxFICJ6bGliLmljbyIKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi96bGliLWRsbHZlcnNpb24uYyBiL2xpYnMvemxpYi96bGliLWRsbHZlcnNpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiNTllOS4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvemxpYi1kbGx2ZXJzaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBTZWU6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9zaGVsbGNjL3BsYXRmb3JtL3NoZWxsL3Byb2dyYW1tZXJzZ3VpZGUvdmVyc2lvbnMuYXNwICovCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHNobHdhcGkuaD4KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLS8qIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSAqLyBIUkVTVUxUIERsbEdldFZlcnNpb24gKERMTFZFUlNJT05JTkZPMiAqcGR2aSk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi1IUkVTVUxUIERsbEdldFZlcnNpb24gKERMTFZFUlNJT05JTkZPMiAqcGR2aSkKLXsKLQlpZiAoICFwZHZpIHx8IChwZHZpLT5pbmZvMS5jYlNpemUgIT0gc2l6ZW9mICgqcGR2aSkpICkKLQkJcmV0dXJuIChFX0lOVkFMSURBUkcpOwotCXBkdmktPmluZm8xLmR3TWFqb3JWZXJzaW9uID0gMTsKLQlwZHZpLT5pbmZvMS5kd01pbm9yVmVyc2lvbiA9IDI7Ci0JcGR2aS0+aW5mbzEuZHdCdWlsZE51bWJlciA9IDM7Ci0JcGR2aS0+aW5mbzEuZHdQbGF0Zm9ybUlEID0gRExMVkVSX1BMQVRGT1JNX1dJTkRPV1M7Ci0JaWYgKHBkdmktPmluZm8xLmNiU2l6ZSA9PSBzaXplb2YgKERMTFZFUlNJT05JTkZPMikpCi0JCXBkdmktPnVsbFZlcnNpb24gPSBNQUtFRExMVkVSVUxMICgxLCAyLCAzLCAyMDI3KTsKLQlyZXR1cm4gU19PSzsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvemxpYi96bGliLWx0dmVyc2lvbiBiL2xpYnMvemxpYi96bGliLWx0dmVyc2lvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkOTI5Ny4uMDAwMDAwMAotLS0gYS9saWJzL3psaWIvemxpYi1sdHZlcnNpb24KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi00OjI6MwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3psaWIuMyBiL2xpYnMvemxpYi96bGliLjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYjgxNjIuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL3psaWIuMworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0uVEggWkxJQiAzICIxOCBKdWx5IDIwMDUiCi0uU0ggTkFNRQotemxpYiBcLSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGxpYnJhcnkKLS5TSCBTWU5PUFNJUwotW3NlZQotLkkgemxpYi5oCi1mb3IgZnVsbCBkZXNjcmlwdGlvbl0KLS5TSCBERVNDUklQVElPTgotVGhlCi0uSSB6bGliCi1saWJyYXJ5IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KLVRoZSBjb2RlIGlzIHRocmVhZCBzYWZlLgotSXQgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywKLWluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4KLVRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBvbmx5IG9uZSBjb21wcmVzc2lvbiBtZXRob2QgKGRlZmxhdGlvbikKLWJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIKLWFuZCB3aWxsIGhhdmUgdGhlIHNhbWUgc3RyZWFtIGludGVyZmFjZS4KLS5MUAotQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UgZW5vdWdoCi0oZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwKLW9yIGNhbiBiZSBkb25lIGJ5IHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4KLUluIHRoZSBsYXR0ZXIgY2FzZSwKLXRoZSBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0Ci0ocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgotLkxQCi1UaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4KLS5JUiBnemlwICgxKQotKC5neikgZm9ybWF0Ci13aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8uCi0uTFAKLVRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLgotVGhlIGRlY29kZXIgY2hlY2tzIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLAotc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyIGNyYXNoIGV2ZW4gaW4gY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCi0uTFAKLUFsbCBmdW5jdGlvbnMgb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUKLS5JUiB6bGliLmggLgotVGhlIGRpc3RyaWJ1dGlvbiBzb3VyY2UgaW5jbHVkZXMgZXhhbXBsZXMgb2YgdXNlIG9mIHRoZSBsaWJyYXJ5Ci1pbiB0aGUgZmlsZXMKLS5JIGV4YW1wbGUuYwotYW5kCi0uSVIgbWluaWd6aXAuYyAuCi0uTFAKLUNoYW5nZXMgdG8gdGhpcyB2ZXJzaW9uIGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlCi0uSSBDaGFuZ2VMb2cKLXRoYXQgYWNjb21wYW5pZXMgdGhlIHNvdXJjZSwKLWFuZCBhcmUgY29uY2VybmVkIHByaW1hcmlseSB3aXRoIGJ1ZyBmaXhlcyBhbmQgcG9ydGFiaWxpdHkgZW5oYW5jZW1lbnRzLgotLkxQCi1BIEphdmEgaW1wbGVtZW50YXRpb24gb2YKLS5JIHpsaWIKLWlzIGF2YWlsYWJsZSBpbiB0aGUgSmF2YSBEZXZlbG9wbWVudCBLaXQgMS4xOgotLklQCi1odHRwOi8vd3d3LmphdmFzb2Z0LmNvbS9wcm9kdWN0cy9KREsvMS4xL2RvY3MvYXBpL1BhY2thZ2UtamF2YS51dGlsLnppcC5odG1sCi0uTFAKLUEgUGVybCBpbnRlcmZhY2UgdG8KLS5JUiB6bGliICwKLXdyaXR0ZW4gYnkgUGF1bCBNYXJxdWVzcyAocG1xc0BjcGFuLm9yZyksCi1pcyBhdmFpbGFibGUgYXQgQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMsCi1pbmNsdWRpbmc6Ci0uSVAKLWh0dHA6Ly93d3cuY3Bhbi5vcmcvbW9kdWxlcy9ieS1tb2R1bGUvQ29tcHJlc3MvCi0uTFAKLUEgUHl0aG9uIGludGVyZmFjZSB0bwotLklSIHpsaWIgLAotd3JpdHRlbiBieSBBLk0uIEt1Y2hsaW5nIChhbWtAbWFnbmV0LmNvbSksCi1pcyBhdmFpbGFibGUgaW4gUHl0aG9uIDEuNSBhbmQgbGF0ZXIgdmVyc2lvbnM6Ci0uSVAKLWh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvbGliL21vZHVsZS16bGliLmh0bWwKLS5MUAotQQotLkkgemxpYgotYmluZGluZyBmb3IKLS5JUiB0Y2wgKDEpLAotd3JpdHRlbiBieSBBbmRyZWFzIEt1cHJpZXMgKGEua3Vwcmllc0B3ZXN0ZW5kLmNvbSksCi1pcyBhdmFpbGxhYmxlIGF0OgotLklQCi1odHRwOi8vd3d3Lndlc3RlbmQuY29tL35rdXByaWVzL2RvYy90cmYvbWFuL21hbi5odG1sCi0uTFAKLUFuIGV4cGVyaW1lbnRhbCBwYWNrYWdlIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIGluIC56aXAgZm9ybWF0LAotd3JpdHRlbiBvbiB0b3Agb2YKLS5JIHpsaWIKLWJ5IEdpbGxlcyBWb2xsYW50IChpbmZvQHdpbmltYWdlLmNvbSksCi1pcyBhdmFpbGFibGUgYXQ6Ci0uSVAKLWh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbAotYW5kIGFsc28gaW4gdGhlCi0uSSBjb250cmliL21pbml6aXAKLWRpcmVjdG9yeSBvZiB0aGUgbWFpbgotLkkgemxpYgotd2ViIHNpdGUuCi0uU0ggIlNFRSBBTFNPIgotVGhlCi0uSSB6bGliCi13ZWIgc2l0ZSBjYW4gYmUgZm91bmQgYXQgZWl0aGVyIG9mIHRoZXNlIGxvY2F0aW9uczoKLS5JUAotaHR0cDovL3d3dy56bGliLm9yZwotLmJyCi1odHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvCi0uTFAKLVRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQwotKFJlcXVlc3QgZm9yIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzOgotLklQCi1odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dCAoY29uY2VybmluZyB6bGliIGZvcm1hdCkKLS5icgotaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MS50eHQgKGNvbmNlcm5pbmcgZGVmbGF0ZSBmb3JtYXQpCi0uYnIKLWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTIudHh0IChjb25jZXJuaW5nIGd6aXAgZm9ybWF0KQotLkxQCi1UaGVzZSBkb2N1bWVudHMgYXJlIGFsc28gYXZhaWxhYmxlIGluIG90aGVyIGZvcm1hdHMgZnJvbToKLS5JUAotZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sCi0uTFAKLU1hcmsgTmVsc29uIChtYXJrbkBpZWVlLm9yZykgd3JvdGUgYW4gYXJ0aWNsZSBhYm91dAotLkkgemxpYgotZm9yIHRoZSBKYW4uIDE5OTcgaXNzdWUgb2YgIERyLiBEb2JiJ3MgSm91cm5hbDsKLWEgY29weSBvZiB0aGUgYXJ0aWNsZSBpcyBhdmFpbGFibGUgYXQ6Ci0uSVAKLWh0dHA6Ly9kb2dtYS5uZXQvbWFya24vYXJ0aWNsZXMvemxpYnRvb2wvemxpYnRvb2wuaHRtCi0uU0ggIlJFUE9SVElORyBQUk9CTEVNUyIKLUJlZm9yZSByZXBvcnRpbmcgYSBwcm9ibGVtLAotcGxlYXNlIGNoZWNrIHRoZQotLkkgemxpYgotd2ViIHNpdGUgdG8gdmVyaWZ5IHRoYXQgeW91IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mCi0uSVIgemxpYiA7Ci1vdGhlcndpc2UsCi1vYnRhaW4gdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCBzZWUgaWYgdGhlIHByb2JsZW0gc3RpbGwgZXhpc3RzLgotUGxlYXNlIHJlYWQgdGhlCi0uSSB6bGliCi1GQVEgYXQ6Ci0uSVAKLWh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sCi0uTFAKLWJlZm9yZSBhc2tpbmcgZm9yIGhlbHAuCi1TZW5kIHF1ZXN0aW9ucyBhbmQvb3IgY29tbWVudHMgdG8gemxpYkBnemlwLm9yZywKLW9yIChmb3IgdGhlIFdpbmRvd3MgRExMIHZlcnNpb24pIHRvIEdpbGxlcyBWb2xsYW50IChpbmZvQHdpbmltYWdlLmNvbSkuCi0uU0ggQVVUSE9SUwotVmVyc2lvbiAxLjIuMwotQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseSAoamxvdXBAZ3ppcC5vcmcpCi1hbmQgTWFyayBBZGxlciAobWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSkuCi0uTFAKLVRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzLWlzLCIKLXdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLUluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi1hcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotU2VlIHRoZSBkaXN0cmlidXRpb24gZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byByZXF1aXJlbWVudHMKLWdvdmVybmluZyByZWRpc3RyaWJ1dGlvbi4KLVRoZSBkZWZsYXRlIGZvcm1hdCB1c2VkIGJ5Ci0uSSB6bGliCi13YXMgZGVmaW5lZCBieSBQaGlsIEthdHouCi1UaGUgZGVmbGF0ZSBhbmQKLS5JIHpsaWIKLXNwZWNpZmljYXRpb25zIHdlcmUgd3JpdHRlbiBieSBMLiBQZXRlciBEZXV0c2NoLgotVGhhbmtzIHRvIGFsbCB0aGUgcGVvcGxlIHdobyByZXBvcnRlZCBwcm9ibGVtcyBhbmQgc3VnZ2VzdGVkIHZhcmlvdXMKLWltcHJvdmVtZW50cyBpbgotLklSIHpsaWIgOwotd2hvIGFyZSB0b28gbnVtZXJvdXMgdG8gY2l0ZSBoZXJlLgotLkxQCi1VTklYIG1hbnVhbCBwYWdlIGJ5IFIuIFAuIEMuIFJvZGdlcnMsCi1VLlMuIE5hdGlvbmFsIExpYnJhcnkgb2YgTWVkaWNpbmUgKHJvZGdlcnNAbmxtLm5paC5nb3YpLgotLlwiIGVuZCBvZiBtYW4gcGFnZQpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3psaWIuaCBiL2xpYnMvemxpYi96bGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjgxNzkuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL3psaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNTcgKzAsMCBAQAotLyogemxpYi5oIC0tIGludGVyZmFjZSBvZiB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gIHZlcnNpb24gMS4yLjMsIEp1bHkgMTh0aCwgMjAwNQotCi0gIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgotICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0KLQotICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgotICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dAotICAoemxpYiBmb3JtYXQpLCByZmMxOTUxLnR4dCAoZGVmbGF0ZSBmb3JtYXQpIGFuZCByZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpLgotKi8KLQotI2lmbmRlZiBaTElCX0gKLSNkZWZpbmUgWkxJQl9ICi0KLSNpbmNsdWRlICJ6Y29uZi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjIuMyIKLSNkZWZpbmUgWkxJQl9WRVJOVU0gMHgxMjMwCi0KLS8qCi0gICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCi0gIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkCi0gIGRhdGEuICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kCi0gIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZQotICBzdHJlYW0gaW50ZXJmYWNlLgotCi0gICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCi0gIGVub3VnaCAoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwgb3IgY2FuIGJlIGRvbmUgYnkKLSAgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKLSAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAotICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgotCi0gICAgIFRoZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgaW4tbWVtb3J5IGZ1bmN0aW9ucyBpcwotICB0aGUgemxpYiBmb3JtYXQsIHdoaWNoIGlzIGEgemxpYiB3cmFwcGVyIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTAsIHdyYXBwZWQKLSAgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0sIHdoaWNoIGlzIGl0c2VsZiBkb2N1bWVudGVkIGluIFJGQyAxOTUxLgotCi0gICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAotICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8gdXNpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHN0YXJ0Ci0gIHdpdGggImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEKLSAgZ3ppcCB3cmFwcGVyLCBkb2N1bWVudGVkIGluIFJGQyAxOTUyLCB3cmFwcGVkIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLgotCi0gICAgIFRoaXMgbGlicmFyeSBjYW4gb3B0aW9uYWxseSByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMgaW4gbWVtb3J5IGFzIHdlbGwuCi0KLSAgICAgVGhlIHpsaWIgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byBiZSBjb21wYWN0IGFuZCBmYXN0IGZvciB1c2UgaW4gbWVtb3J5Ci0gIGFuZCBvbiBjb21tdW5pY2F0aW9ucyBjaGFubmVscy4gIFRoZSBnemlwIGZvcm1hdCB3YXMgZGVzaWduZWQgZm9yIHNpbmdsZS0KLSAgZmlsZSBjb21wcmVzc2lvbiBvbiBmaWxlIHN5c3RlbXMsIGhhcyBhIGxhcmdlciBoZWFkZXIgdGhhbiB6bGliIHRvIG1haW50YWluCi0gIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiwgYW5kIHVzZXMgYSBkaWZmZXJlbnQsIHNsb3dlciBjaGVjayBtZXRob2QgdGhhbiB6bGliLgotCi0gICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKLSAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgotICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgotKi8KLQotdHlwZWRlZiB2b2lkcGYgKCphbGxvY19mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdUludCBpdGVtcywgdUludCBzaXplKSk7Ci10eXBlZGVmIHZvaWQgICAoKmZyZWVfZnVuYykgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgYWRkcmVzcykpOwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IHpfc3RyZWFtX3MgewotICAgIEJ5dGVmICAgICpuZXh0X2luOyAgLyogbmV4dCBpbnB1dCBieXRlICovCi0gICAgdUludCAgICAgYXZhaWxfaW47ICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4gKi8KLSAgICB1TG9uZyAgICB0b3RhbF9pbjsgIC8qIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovCi0KLSAgICBCeXRlZiAgICAqbmV4dF9vdXQ7IC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqLwotICAgIHVJbnQgICAgIGF2YWlsX291dDsgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgbmV4dF9vdXQgKi8KLSAgICB1TG9uZyAgICB0b3RhbF9vdXQ7IC8qIHRvdGFsIG5iIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi8KLQotICAgIGNoYXIgICAgICptc2c7ICAgICAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCi0gICAgc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqc3RhdGU7IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLwotCi0gICAgYWxsb2NfZnVuYyB6YWxsb2M7ICAvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIGZyZWVfZnVuYyAgemZyZWU7ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIHZvaWRwZiAgICAgb3BhcXVlOyAgLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZSAqLwotCi0gICAgaW50ICAgICBkYXRhX3R5cGU7ICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGJpbmFyeSBvciB0ZXh0ICovCi0gICAgdUxvbmcgICBhZGxlcjsgICAgICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLwotICAgIHVMb25nICAgcmVzZXJ2ZWQ7ICAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLX0gel9zdHJlYW07Ci0KLXR5cGVkZWYgel9zdHJlYW0gRkFSICp6X3N0cmVhbXA7Ci0KLS8qCi0gICAgIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHBhc3NlZCB0byBhbmQgZnJvbSB6bGliIHJvdXRpbmVzLiAgU2VlIFJGQyAxOTUyCi0gIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIG1lYW5pbmdzIG9mIHRoZXNlIGZpZWxkcy4KLSovCi10eXBlZGVmIHN0cnVjdCBnel9oZWFkZXJfcyB7Ci0gICAgaW50ICAgICB0ZXh0OyAgICAgICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovCi0gICAgdUxvbmcgICB0aW1lOyAgICAgICAvKiBtb2RpZmljYXRpb24gdGltZSAqLwotICAgIGludCAgICAgeGZsYWdzOyAgICAgLyogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KLSAgICBpbnQgICAgIG9zOyAgICAgICAgIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi8KLSAgICBCeXRlZiAgICpleHRyYTsgICAgIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi8KLSAgICB1SW50ICAgIGV4dHJhX2xlbjsgIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqLwotICAgIHVJbnQgICAgZXh0cmFfbWF4OyAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KLSAgICBCeXRlZiAgICpuYW1lOyAgICAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi8KLSAgICB1SW50ICAgIG5hbWVfbWF4OyAgIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KLSAgICBCeXRlZiAgICpjb21tZW50OyAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGNvbW1lbnQgb3IgWl9OVUxMICovCi0gICAgdUludCAgICBjb21tX21heDsgICAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCi0gICAgaW50ICAgICBoY3JjOyAgICAgICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqLwotICAgIGludCAgICAgZG9uZTsgICAgICAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KLX0gZ3pfaGVhZGVyOwotCi10eXBlZGVmIGd6X2hlYWRlciBGQVIgKmd6X2hlYWRlcnA7Ci0KLS8qCi0gICBUaGUgYXBwbGljYXRpb24gbXVzdCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4gd2hlbiBhdmFpbF9pbiBoYXMKLSAgIGRyb3BwZWQgdG8gemVyby4gSXQgbXVzdCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dCB3aGVuIGF2YWlsX291dAotICAgaGFzIGRyb3BwZWQgdG8gemVyby4gVGhlIGFwcGxpY2F0aW9uIG11c3QgaW5pdGlhbGl6ZSB6YWxsb2MsIHpmcmVlIGFuZAotICAgb3BhcXVlIGJlZm9yZSBjYWxsaW5nIHRoZSBpbml0IGZ1bmN0aW9uLiBBbGwgb3RoZXIgZmllbGRzIGFyZSBzZXQgYnkgdGhlCi0gICBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBtdXN0IG5vdCBiZSB1cGRhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLQotICAgVGhlIG9wYXF1ZSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0Ci0gICBwYXJhbWV0ZXIgZm9yIGNhbGxzIG9mIHphbGxvYyBhbmQgemZyZWUuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3VzdG9tCi0gICBtZW1vcnkgbWFuYWdlbWVudC4gVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXR0YWNoZXMgbm8gbWVhbmluZyB0byB0aGUKLSAgIG9wYXF1ZSB2YWx1ZS4KLQotICAgemFsbG9jIG11c3QgcmV0dXJuIFpfTlVMTCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG9iamVjdC4KLSAgIElmIHpsaWIgaXMgdXNlZCBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uLCB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUKLSAgIHRocmVhZCBzYWZlLgotCi0gICBPbiAxNi1iaXQgc3lzdGVtcywgdGhlIGZ1bmN0aW9ucyB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUgYWJsZSB0byBhbGxvY2F0ZQotICAgZXhhY3RseSA2NTUzNiBieXRlcywgYnV0IHdpbGwgbm90IGJlIHJlcXVpcmVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzCi0gICBpZiB0aGUgc3ltYm9sIE1BWFNFR182NEsgaXMgZGVmaW5lZCAoc2VlIHpjb25mLmgpLiBXQVJOSU5HOiBPbiBNU0RPUywKLSAgIHBvaW50ZXJzIHJldHVybmVkIGJ5IHphbGxvYyBmb3Igb2JqZWN0cyBvZiBleGFjdGx5IDY1NTM2IGJ5dGVzICptdXN0KgotICAgaGF2ZSB0aGVpciBvZmZzZXQgbm9ybWFsaXplZCB0byB6ZXJvLiBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uCi0gICBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuIFRvIHJlZHVjZSBtZW1vcnkKLSAgIHJlcXVpcmVtZW50cyBhbmQgYXZvaWQgYW55IGFsbG9jYXRpb24gb2YgNjRLIG9iamVjdHMsIGF0IHRoZSBleHBlbnNlIG9mCi0gICBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIC1ETUFYX1dCSVRTPTE0IChzZWUgemNvbmYuaCkuCi0KLSAgIFRoZSBmaWVsZHMgdG90YWxfaW4gYW5kIHRvdGFsX291dCBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvcgotICAgcHJvZ3Jlc3MgcmVwb3J0cy4gQWZ0ZXIgY29tcHJlc3Npb24sIHRvdGFsX2luIGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mCi0gICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYW5kIG1heSBiZSBzYXZlZCBmb3IgdXNlIGluIHRoZSBkZWNvbXByZXNzb3IKLSAgIChwYXJ0aWN1bGFybHkgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4KLSAgIGEgc2luZ2xlIHN0ZXApLgotKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uc3RhbnRzICovCi0KLSNkZWZpbmUgWl9OT19GTFVTSCAgICAgIDAKLSNkZWZpbmUgWl9QQVJUSUFMX0ZMVVNIIDEgLyogd2lsbCBiZSByZW1vdmVkLCB1c2UgWl9TWU5DX0ZMVVNIIGluc3RlYWQgKi8KLSNkZWZpbmUgWl9TWU5DX0ZMVVNIICAgIDIKLSNkZWZpbmUgWl9GVUxMX0ZMVVNIICAgIDMKLSNkZWZpbmUgWl9GSU5JU0ggICAgICAgIDQKLSNkZWZpbmUgWl9CTE9DSyAgICAgICAgIDUKLS8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KLQotI2RlZmluZSBaX09LICAgICAgICAgICAgMAotI2RlZmluZSBaX1NUUkVBTV9FTkQgICAgMQotI2RlZmluZSBaX05FRURfRElDVCAgICAgMgotI2RlZmluZSBaX0VSUk5PICAgICAgICAoLTEpCi0jZGVmaW5lIFpfU1RSRUFNX0VSUk9SICgtMikKLSNkZWZpbmUgWl9EQVRBX0VSUk9SICAgKC0zKQotI2RlZmluZSBaX01FTV9FUlJPUiAgICAoLTQpCi0jZGVmaW5lIFpfQlVGX0VSUk9SICAgICgtNSkKLSNkZWZpbmUgWl9WRVJTSU9OX0VSUk9SICgtNikKLS8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQotICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KLSAqLwotCi0jZGVmaW5lIFpfTk9fQ09NUFJFU1NJT04gICAgICAgICAwCi0jZGVmaW5lIFpfQkVTVF9TUEVFRCAgICAgICAgICAgICAxCi0jZGVmaW5lIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgICA5Ci0jZGVmaW5lIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgKC0xKQotLyogY29tcHJlc3Npb24gbGV2ZWxzICovCi0KLSNkZWZpbmUgWl9GSUxURVJFRCAgICAgICAgICAgIDEKLSNkZWZpbmUgWl9IVUZGTUFOX09OTFkgICAgICAgIDIKLSNkZWZpbmUgWl9STEUgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgWl9GSVhFRCAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgWl9ERUZBVUxUX1NUUkFURUdZICAgIDAKLS8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5OyBzZWUgZGVmbGF0ZUluaXQyKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KLQotI2RlZmluZSBaX0JJTkFSWSAgIDAKLSNkZWZpbmUgWl9URVhUICAgICAxCi0jZGVmaW5lIFpfQVNDSUkgICAgWl9URVhUICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjIuMiBhbmQgZWFybGllciAqLwotI2RlZmluZSBaX1VOS05PV04gIDIKLS8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi8KLQotI2RlZmluZSBaX0RFRkxBVEVEICAgOAotLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICh0aGUgb25seSBvbmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbikgKi8KLQotI2RlZmluZSBaX05VTEwgIDAgIC8qIGZvciBpbml0aWFsaXppbmcgemFsbG9jLCB6ZnJlZSwgb3BhcXVlICovCi0KLSNkZWZpbmUgemxpYl92ZXJzaW9uIHpsaWJWZXJzaW9uKCkKLS8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgPCAxLjAuMiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNpYyBmdW5jdGlvbnMgKi8KLQotWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCB6bGliVmVyc2lvbiBPRigodm9pZCkpOwotLyogVGhlIGFwcGxpY2F0aW9uIGNhbiBjb21wYXJlIHpsaWJWZXJzaW9uIGFuZCBaTElCX1ZFUlNJT04gZm9yIGNvbnNpc3RlbmN5LgotICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBkaWZmZXJzLCB0aGUgbGlicmFyeSBjb2RlIGFjdHVhbGx5IHVzZWQgaXMKLSAgIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHpsaWIuaCBoZWFkZXIgZmlsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSAgIFRoaXMgY2hlY2sgaXMgYXV0b21hdGljYWxseSBtYWRlIGJ5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdC4KLSAqLwotCi0vKgotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCkpOwotCi0gICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGNvbXByZXNzaW9uLiBUaGUgZmllbGRzCi0gICB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlIGNhbGxlci4KLSAgIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGRlZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0bwotICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCi0KLSAgICAgVGhlIGNvbXByZXNzaW9uIGxldmVsIG11c3QgYmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLCBvciBiZXR3ZWVuIDAgYW5kIDk6Ci0gICAxIGdpdmVzIGJlc3Qgc3BlZWQsIDkgZ2l2ZXMgYmVzdCBjb21wcmVzc2lvbiwgMCBnaXZlcyBubyBjb21wcmVzc2lvbiBhdAotICAgYWxsICh0aGUgaW5wdXQgZGF0YSBpcyBzaW1wbHkgY29waWVkIGEgYmxvY2sgYXQgYSB0aW1lKS4KLSAgIFpfREVGQVVMVF9DT01QUkVTU0lPTiByZXF1ZXN0cyBhIGRlZmF1bHQgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGFuZAotICAgY29tcHJlc3Npb24gKGN1cnJlbnRseSBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgotCi0gICAgIGRlZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBsZXZlbCBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBsZXZlbCwKLSAgIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKHpsaWJfdmVyc2lvbikgaXMgaW5jb21wYXRpYmxlCi0gICB3aXRoIHRoZSB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciAoWkxJQl9WRVJTSU9OKS4KLSAgIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQgZG9lcyBub3QKLSAgIHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCi0qLwotCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOwotLyoKLSAgICBkZWZsYXRlIGNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKLSAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlIHNvbWUKLSAgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KLSAgZm9yY2VkIHRvIGZsdXNoLgotCi0gICAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gZGVmbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKLSAgZm9sbG93aW5nIGFjdGlvbnM6Ci0KLSAgLSBDb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgotICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90Ci0gICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCBuZXh0X2luIGFuZCBhdmFpbF9pbiBhcmUgdXBkYXRlZCBhbmQKLSAgICBwcm9jZXNzaW5nIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgZGVmbGF0ZSgpLgotCi0gIC0gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCBuZXh0X291dCBhbmQgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQKLSAgICBhY2NvcmRpbmdseS4gVGhpcyBhY3Rpb24gaXMgZm9yY2VkIGlmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgbm9uIHplcm8uCi0gICAgRm9yY2luZyBmbHVzaCBmcmVxdWVudGx5IGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbywgc28gdGhpcyBwYXJhbWV0ZXIKLSAgICBzaG91bGQgYmUgc2V0IG9ubHkgd2hlbiBuZWNlc3NhcnkgKGluIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucykuCi0gICAgU29tZSBvdXRwdXQgbWF5IGJlIHByb3ZpZGVkIGV2ZW4gaWYgZmx1c2ggaXMgbm90IHNldC4KLQotICBCZWZvcmUgdGhlIGNhbGwgb2YgZGVmbGF0ZSgpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0Ci0gIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZwotICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIGF2YWlsX2luIG9yIGF2YWlsX291dCBhY2NvcmRpbmdseTsgYXZhaWxfb3V0Ci0gIHNob3VsZCBuZXZlciBiZSB6ZXJvIGJlZm9yZSB0aGUgY2FsbC4gVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZQotICBjb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwKLSAgKGF2YWlsX291dCA9PSAwKSwgb3IgYWZ0ZXIgZWFjaCBjYWxsIG9mIGRlZmxhdGUoKS4gSWYgZGVmbGF0ZSByZXR1cm5zIFpfT0sKLSAgYW5kIHdpdGggemVybyBhdmFpbF9vdXQsIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZQotICBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KLQotICAgIE5vcm1hbGx5IHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfTk9fRkxVU0gsIHdoaWNoIGFsbG93cyBkZWZsYXRlIHRvCi0gIGRlY2lkZSBob3cgbXVjaCBkYXRhIHRvIGFjY3VtdWFsdGUgYmVmb3JlIHByb2R1Y2luZyBvdXRwdXQsIGluIG9yZGVyIHRvCi0gIG1heGltaXplIGNvbXByZXNzaW9uLgotCi0gICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9TWU5DX0ZMVVNILCBhbGwgcGVuZGluZyBvdXRwdXQgaXMKLSAgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dCBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28KLSAgdGhhdCB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsIGlucHV0IGRhdGEgYXZhaWxhYmxlIHNvIGZhci4gKEluIHBhcnRpY3VsYXIKLSAgYXZhaWxfaW4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuIHByb3ZpZGVkCi0gIGJlZm9yZSB0aGUgY2FsbC4pICBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZSBjb21wcmVzc2lvbgotICBhbGdvcml0aG1zIGFuZCBzbyBpdCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LgotCi0gICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfRlVMTF9GTFVTSCwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKLSAgWl9TWU5DX0ZMVVNILCBhbmQgdGhlIGNvbXByZXNzaW9uIHN0YXRlIGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4KLSAgcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYKLSAgcmFuZG9tIGFjY2VzcyBpcyBkZXNpcmVkLiBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQotICBjb21wcmVzc2lvbi4KLQotICAgIElmIGRlZmxhdGUgcmV0dXJucyB3aXRoIGF2YWlsX291dCA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCi0gIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKLSAgYXZhaWxfb3V0KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlIChkZWZsYXRlIHJldHVybnMgd2l0aCBub24temVybwotICBhdmFpbF9vdXQpLiBJbiB0aGUgY2FzZSBvZiBhIFpfRlVMTF9GTFVTSCBvciBaX1NZTkNfRkxVU0gsIG1ha2Ugc3VyZSB0aGF0Ci0gIGF2YWlsX291dCBpcyBncmVhdGVyIHRoYW4gc2l4IHRvIGF2b2lkIHJlcGVhdGVkIGZsdXNoIG1hcmtlcnMgZHVlIHRvCi0gIGF2YWlsX291dCA9PSAwIG9uIHJldHVybi4KLQotICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfRklOSVNILCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCwKLSAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIGlmIHRoZXJlCi0gIHdhcyBlbm91Z2ggb3V0cHV0IHNwYWNlOyBpZiBkZWZsYXRlIHJldHVybnMgd2l0aCBaX09LLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKLSAgY2FsbGVkIGFnYWluIHdpdGggWl9GSU5JU0ggYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkIGF2YWlsX291dCkgYnV0IG5vCi0gIG1vcmUgaW5wdXQgZGF0YSwgdW50aWwgaXQgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvci4gQWZ0ZXIKLSAgZGVmbGF0ZSBoYXMgcmV0dXJuZWQgWl9TVFJFQU1fRU5ELCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZQotICBzdHJlYW0gYXJlIGRlZmxhdGVSZXNldCBvciBkZWZsYXRlRW5kLgotCi0gICAgWl9GSU5JU0ggY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVmbGF0ZUluaXQgaWYgYWxsIHRoZSBjb21wcmVzc2lvbgotICBpcyB0byBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAuIEluIHRoaXMgY2FzZSwgYXZhaWxfb3V0IG11c3QgYmUgYXQgbGVhc3QKLSAgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlZmxhdGVCb3VuZCAoc2VlIGJlbG93KS4gSWYgZGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4KLSAgWl9TVFJFQU1fRU5ELCB0aGVuIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFzIGRlc2NyaWJlZCBhYm92ZS4KLQotICAgIGRlZmxhdGUoKSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBpbnB1dCByZWFkCi0gIHNvIGZhciAodGhhdCBpcywgdG90YWxfaW4gYnl0ZXMpLgotCi0gICAgZGVmbGF0ZSgpIG1heSB1cGRhdGUgc3RybS0+ZGF0YV90eXBlIGlmIGl0IGNhbiBtYWtlIGEgZ29vZCBndWVzcyBhYm91dAotICB0aGUgaW5wdXQgZGF0YSB0eXBlIChaX0JJTkFSWSBvciBaX1RFWFQpLiBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAotICBiaW5hcnkuIFRoaXMgZmllbGQgaXMgb25seSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMgYW5kIGRvZXMgbm90IGFmZmVjdAotICB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGluIGFueSBtYW5uZXIuCi0KLSAgICBkZWZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dAotICBwcm9jZXNzZWQgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgYWxsIGlucHV0IGhhcyBiZWVuCi0gIGNvbnN1bWVkIGFuZCBhbGwgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkIChvbmx5IHdoZW4gZmx1c2ggaXMgc2V0IHRvCi0gIFpfRklOSVNIKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQotICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKLSAgKGZvciBleGFtcGxlIGF2YWlsX2luIG9yIGF2YWlsX291dCB3YXMgemVybykuIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QKLSAgZmF0YWwsIGFuZCBkZWZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0Ci0gIHNwYWNlIHRvIGNvbnRpbnVlIGNvbXByZXNzaW5nLgotKi8KLQotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci0vKgotICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgotICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQotICAgcGVuZGluZyBvdXRwdXQuCi0KLSAgICAgZGVmbGF0ZUVuZCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIGZyZWVkCi0gICBwcmVtYXR1cmVseSAoc29tZSBpbnB1dCBvciBvdXRwdXQgd2FzIGRpc2NhcmRlZCkuIEluIHRoZSBlcnJvciBjYXNlLAotICAgbXNnIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUKLSAgIGRlYWxsb2NhdGVkKS4KLSovCi0KLQotLyoKLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci0KLSAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbi4gVGhlIGZpZWxkcwotICAgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQotICAgdGhlIGNhbGxlci4gSWYgbmV4dF9pbiBpcyBub3QgWl9OVUxMIGFuZCBhdmFpbF9pbiBpcyBsYXJnZSBlbm91Z2ggKHRoZSBleGFjdAotICAgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY29tcHJlc3Npb24gbWV0aG9kKSwgaW5mbGF0ZUluaXQgZGV0ZXJtaW5lcyB0aGUKLSAgIGNvbXByZXNzaW9uIG1ldGhvZCBmcm9tIHRoZSB6bGliIGhlYWRlciBhbmQgYWxsb2NhdGVzIGFsbCBkYXRhIHN0cnVjdHVyZXMKLSAgIGFjY29yZGluZ2x5OyBvdGhlcndpc2UgdGhlIGFsbG9jYXRpb24gd2lsbCBiZSBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCBvZgotICAgaW5mbGF0ZS4gIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGluZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0bwotICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCi0KLSAgICAgaW5mbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCi0gICBtZW1vcnksIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCi0gICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlci4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvcgotICAgbWVzc2FnZS4gaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcKLSAgIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiB0aGlzIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQKLSAgIGF2YWlsX2luIG1heSBiZSBtb2RpZmllZCwgYnV0IG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVuY2hhbmdlZC4pCi0qLwotCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOwotLyoKLSAgICBpbmZsYXRlIGRlY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAotICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBpbnRyb2R1Y2UKLSAgc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgotICBmb3JjZWQgdG8gZmx1c2guCi0KLSAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gaW5mbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKLSAgZm9sbG93aW5nIGFjdGlvbnM6Ci0KLSAgLSBEZWNvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgbmV4dF9pbiBhbmQgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luCi0gICAgYWNjb3JkaW5nbHkuIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKLSAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gaXMgdXBkYXRlZCBhbmQgcHJvY2Vzc2luZwotICAgIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgotCi0gIC0gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCBuZXh0X291dCBhbmQgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQKLSAgICBhY2NvcmRpbmdseS4gIGluZmxhdGUoKSBwcm92aWRlcyBhcyBtdWNoIG91dHB1dCBhcyBwb3NzaWJsZSwgdW50aWwgdGhlcmUKLSAgICBpcyBubyBtb3JlIGlucHV0IGRhdGEgb3Igbm8gbW9yZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAoc2VlIGJlbG93Ci0gICAgYWJvdXQgdGhlIGZsdXNoIHBhcmFtZXRlcikuCi0KLSAgQmVmb3JlIHRoZSBjYWxsIG9mIGluZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAotICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKLSAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyB0aGUgbmV4dF8qIGFuZCBhdmFpbF8qIHZhbHVlcyBhY2NvcmRpbmdseS4KLSAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvcgotICBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoYXZhaWxfb3V0ID09IDApLCBvciBhZnRlciBlYWNoCi0gIGNhbGwgb2YgaW5mbGF0ZSgpLiBJZiBpbmZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQKLSAgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZQotICBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgotCi0gICAgVGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgY2FuIGJlIFpfTk9fRkxVU0gsIFpfU1lOQ19GTFVTSCwKLSAgWl9GSU5JU0gsIG9yIFpfQkxPQ0suIFpfU1lOQ19GTFVTSCByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBmbHVzaCBhcyBtdWNoCi0gIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gWl9CTE9DSyByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBzdG9wCi0gIGlmIGFuZCB3aGVuIGl0IGdldHMgdG8gdGhlIG5leHQgZGVmbGF0ZSBibG9jayBib3VuZGFyeS4gV2hlbiBkZWNvZGluZyB0aGUKLSAgemxpYiBvciBnemlwIGZvcm1hdCwgdGhpcyB3aWxsIGNhdXNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIKLSAgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gV2hlbiBkb2luZyBhIHJhdyBpbmZsYXRlLCBpbmZsYXRlKCkKLSAgd2lsbCBnbyBhaGVhZCBhbmQgcHJvY2VzcyB0aGUgZmlyc3QgYmxvY2ssIGFuZCB3aWxsIHJldHVybiB3aGVuIGl0IGdldHMgdG8KLSAgdGhlIGVuZCBvZiB0aGF0IGJsb2NrLCBvciB3aGVuIGl0IHJ1bnMgb3V0IG9mIGRhdGEuCi0KLSAgICBUaGUgWl9CTE9DSyBvcHRpb24gYXNzaXN0cyBpbiBhcHBlbmRpbmcgdG8gb3IgY29tYmluaW5nIGRlZmxhdGUgc3RyZWFtcy4KLSAgQWxzbyB0byBhc3Npc3QgaW4gdGhpcywgb24gcmV0dXJuIGluZmxhdGUoKSB3aWxsIHNldCBzdHJtLT5kYXRhX3R5cGUgdG8gdGhlCi0gIG51bWJlciBvZiB1bnVzZWQgYml0cyBpbiB0aGUgbGFzdCBieXRlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pbiwgcGx1cyA2NAotICBpZiBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBkZWZsYXRlIHN0cmVhbSwKLSAgcGx1cyAxMjggaWYgaW5mbGF0ZSgpIHJldHVybmVkIGltbWVkaWF0ZWx5IGFmdGVyIGRlY29kaW5nIGFuIGVuZC1vZi1ibG9jawotICBjb2RlIG9yIGRlY29kaW5nIHRoZSBjb21wbGV0ZSBoZWFkZXIgdXAgdG8ganVzdCBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlCi0gIGRlZmxhdGUgc3RyZWFtLiBUaGUgZW5kLW9mLWJsb2NrIHdpbGwgbm90IGJlIGluZGljYXRlZCB1bnRpbCBhbGwgb2YgdGhlCi0gIHVuY29tcHJlc3NlZCBkYXRhIGZyb20gdGhhdCBibG9jayBoYXMgYmVlbiB3cml0dGVuIHRvIHN0cm0tPm5leHRfb3V0LiAgVGhlCi0gIG51bWJlciBvZiB1bnVzZWQgYml0cyBtYXkgaW4gZ2VuZXJhbCBiZSBncmVhdGVyIHRoYW4gc2V2ZW4sIGV4Y2VwdCB3aGVuCi0gIGJpdCA3IG9mIGRhdGFfdHlwZSBpcyBzZXQsIGluIHdoaWNoIGNhc2UgdGhlIG51bWJlciBvZiB1bnVzZWQgYml0cyB3aWxsIGJlCi0gIGxlc3MgdGhhbiBlaWdodC4KLQotICAgIGluZmxhdGUoKSBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgWl9TVFJFQU1fRU5EIG9yIGFuCi0gIGVycm9yLiBIb3dldmVyIGlmIGFsbCBkZWNvbXByZXNzaW9uIGlzIHRvIGJlIHBlcmZvcm1lZCBpbiBhIHNpbmdsZSBzdGVwCi0gIChhIHNpbmdsZSBjYWxsIG9mIGluZmxhdGUpLCB0aGUgcGFyYW1ldGVyIGZsdXNoIHNob3VsZCBiZSBzZXQgdG8KLSAgWl9GSU5JU0guIEluIHRoaXMgY2FzZSBhbGwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQgYW5kIGFsbCBwZW5kaW5nCi0gIG91dHB1dCBpcyBmbHVzaGVkOyBhdmFpbF9vdXQgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgdGhlCi0gIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4gc2F2ZWQKLSAgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSBuZXh0IG9wZXJhdGlvbiBvbiB0aGlzIHN0cmVhbSBtdXN0Ci0gIGJlIGluZmxhdGVFbmQgdG8gZGVhbGxvY2F0ZSB0aGUgZGVjb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHVzZSBvZiBaX0ZJTklTSAotICBpcyBuZXZlciByZXF1aXJlZCwgYnV0IGNhbiBiZSB1c2VkIHRvIGluZm9ybSBpbmZsYXRlIHRoYXQgYSBmYXN0ZXIgYXBwcm9hY2gKLSAgbWF5IGJlIHVzZWQgZm9yIHRoZSBzaW5nbGUgaW5mbGF0ZSgpIGNhbGwuCi0KLSAgICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgaW5mbGF0ZSgpIGFsd2F5cyBmbHVzaGVzIGFzIG11Y2ggb3V0cHV0IGFzCi0gIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBhbmQgYWx3YXlzIHVzZXMgdGhlIGZhc3RlciBhcHByb2FjaCBvbiB0aGUKLSAgZmlyc3QgY2FsbC4gU28gdGhlIG9ubHkgZWZmZWN0IG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgotICBpcyBvbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGluZmxhdGUoKSwgYXMgbm90ZWQgYmVsb3csIG9yIHdoZW4gaXQgcmV0dXJucyBlYXJseQotICBiZWNhdXNlIFpfQkxPQ0sgaXMgdXNlZC4KLQotICAgICBJZiBhIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhZnRlciB0aGlzIGNhbGwgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeQotICBiZWxvdyksIGluZmxhdGUgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiB0aGUgZGljdGlvbmFyeQotICBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9ORUVEX0RJQ1Q7IG90aGVyd2lzZSBpdCBzZXRzCi0gIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQgc28gZmFyICh0aGF0IGlzLAotICB0b3RhbF9vdXQgYnl0ZXMpIGFuZCByZXR1cm5zIFpfT0ssIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvciBjb2RlIGFzIGRlc2NyaWJlZAotICBiZWxvdy4gQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCBpbmZsYXRlKCkgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIGFkbGVyMzIKLSAgY2hlY2tzdW0gaXMgZXF1YWwgdG8gdGhhdCBzYXZlZCBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX1NUUkVBTV9FTkQKLSAgb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KLQotICAgIGluZmxhdGUoKSB3aWxsIGRlY29tcHJlc3MgYW5kIGNoZWNrIGVpdGhlciB6bGliLXdyYXBwZWQgb3IgZ3ppcC13cmFwcGVkCi0gIGRlZmxhdGUgZGF0YS4gIFRoZSBoZWFkZXIgdHlwZSBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LiAgQW55IGluZm9ybWF0aW9uCi0gIGNvbnRhaW5lZCBpbiB0aGUgZ3ppcCBoZWFkZXIgaXMgbm90IHJldGFpbmVkLCBzbyBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRoYXQKLSAgaW5mb3JtYXRpb24gc2hvdWxkIGluc3RlYWQgdXNlIHJhdyBpbmZsYXRlLCBzZWUgaW5mbGF0ZUluaXQyKCkgYmVsb3csIG9yCi0gIGluZmxhdGVCYWNrKCkgYW5kIHBlcmZvcm0gdGhlaXIgb3duIHByb2Nlc3Npbmcgb2YgdGhlIGd6aXAgaGVhZGVyIGFuZAotICB0cmFpbGVyLgotCi0gICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCi0gIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMKLSAgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCwgWl9ORUVEX0RJQ1QgaWYgYQotICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcwotICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0IGNoZWNrCi0gIHZhbHVlKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKLSAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgTlVMTCksIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSwKLSAgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUgb3IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUKLSAgb3V0cHV0IGJ1ZmZlciB3aGVuIFpfRklOSVNIIGlzIHVzZWQuIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwsIGFuZAotICBpbmZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0IHNwYWNlIHRvCi0gIGNvbnRpbnVlIGRlY29tcHJlc3NpbmcuIElmIFpfREFUQV9FUlJPUiBpcyByZXR1cm5lZCwgdGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuCi0gIGNhbGwgaW5mbGF0ZVN5bmMoKSB0byBsb29rIGZvciBhIGdvb2QgY29tcHJlc3Npb24gYmxvY2sgaWYgYSBwYXJ0aWFsIHJlY292ZXJ5Ci0gIG9mIHRoZSBkYXRhIGlzIGRlc2lyZWQuCi0qLwotCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCi0gICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55Ci0gICBwZW5kaW5nIG91dHB1dC4KLQotICAgICBpbmZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0YXRlCi0gICB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgZXJyb3IgY2FzZSwgbXNnIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEKLSAgIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkKS4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2VkIGZ1bmN0aW9ucyAqLwotCi0vKgotICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBuZWVkZWQgb25seSBpbiBzb21lIHNwZWNpYWwgYXBwbGljYXRpb25zLgotKi8KLQotLyoKLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1lbUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgc3RyYXRlZ3kpKTsKLQotICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBkZWZsYXRlSW5pdCB3aXRoIG1vcmUgY29tcHJlc3Npb24gb3B0aW9ucy4gVGhlCi0gICBmaWVsZHMgbmV4dF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5Ci0gICB0aGUgY2FsbGVyLgotCi0gICAgIFRoZSBtZXRob2QgcGFyYW1ldGVyIGlzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuIEl0IG11c3QgYmUgWl9ERUZMQVRFRCBpbgotICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZQotICAgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yIHRoaXMKLSAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIExhcmdlciB2YWx1ZXMgb2YgdGhpcyBwYXJhbWV0ZXIgcmVzdWx0IGluIGJldHRlcgotICAgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgotICAgZGVmbGF0ZUluaXQgaXMgdXNlZCBpbnN0ZWFkLgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGRlZmxhdGUuIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKLSAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiBkZWZsYXRlKCkgd2lsbCB0aGVuIGdlbmVyYXRlIHJhdyBkZWZsYXRlIGRhdGEKLSAgIHdpdGggbm8gemxpYiBoZWFkZXIgb3IgdHJhaWxlciwgYW5kIHdpbGwgbm90IGNvbXB1dGUgYW4gYWRsZXIzMiBjaGVjayB2YWx1ZS4KLQotICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBlbmNvZGluZy4gQWRkCi0gICAxNiB0byB3aW5kb3dCaXRzIHRvIHdyaXRlIGEgc2ltcGxlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyIGFyb3VuZCB0aGUKLSAgIGNvbXByZXNzZWQgZGF0YSBpbnN0ZWFkIG9mIGEgemxpYiB3cmFwcGVyLiBUaGUgZ3ppcCBoZWFkZXIgd2lsbCBoYXZlIG5vCi0gICBmaWxlIG5hbWUsIG5vIGV4dHJhIGRhdGEsIG5vIGNvbW1lbnQsIG5vIG1vZGlmaWNhdGlvbiB0aW1lIChzZXQgdG8gemVybyksCi0gICBubyBoZWFkZXIgY3JjLCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBiZSBzZXQgdG8gMjU1ICh1bmtub3duKS4gIElmIGEKLSAgIGd6aXAgc3RyZWFtIGlzIGJlaW5nIHdyaXR0ZW4sIHN0cm0tPmFkbGVyIGlzIGEgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgotCi0gICAgIFRoZSBtZW1MZXZlbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkCi0gICBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiBtZW1MZXZlbD0xIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0Ci0gICBpcyBzbG93IGFuZCByZWR1Y2VzIGNvbXByZXNzaW9uIHJhdGlvOyBtZW1MZXZlbD05IHVzZXMgbWF4aW11bSBtZW1vcnkKLSAgIGZvciBvcHRpbWFsIHNwZWVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiBTZWUgemNvbmYuaCBmb3IgdG90YWwgbWVtb3J5Ci0gICB1c2FnZSBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLgotCi0gICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uIFVzZSB0aGUKLSAgIHZhbHVlIFpfREVGQVVMVF9TVFJBVEVHWSBmb3Igbm9ybWFsIGRhdGEsIFpfRklMVEVSRUQgZm9yIGRhdGEgcHJvZHVjZWQgYnkgYQotICAgZmlsdGVyIChvciBwcmVkaWN0b3IpLCBaX0hVRkZNQU5fT05MWSB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vCi0gICBzdHJpbmcgbWF0Y2gpLCBvciBaX1JMRSB0byBsaW1pdCBtYXRjaCBkaXN0YW5jZXMgdG8gb25lIChydW4tbGVuZ3RoCi0gICBlbmNvZGluZykuIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEgc29tZXdoYXQKLSAgIHJhbmRvbSBkaXN0cmlidXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcyB0dW5lZCB0bwotICAgY29tcHJlc3MgdGhlbSBiZXR0ZXIuIFRoZSBlZmZlY3Qgb2YgWl9GSUxURVJFRCBpcyB0byBmb3JjZSBtb3JlIEh1ZmZtYW4KLSAgIGNvZGluZyBhbmQgbGVzcyBzdHJpbmcgbWF0Y2hpbmc7IGl0IGlzIHNvbWV3aGF0IGludGVybWVkaWF0ZSBiZXR3ZWVuCi0gICBaX0RFRkFVTFQgYW5kIFpfSFVGRk1BTl9PTkxZLiBaX1JMRSBpcyBkZXNpZ25lZCB0byBiZSBhbG1vc3QgYXMgZmFzdCBhcwotICAgWl9IVUZGTUFOX09OTFksIGJ1dCBnaXZlIGJldHRlciBjb21wcmVzc2lvbiBmb3IgUE5HIGltYWdlIGRhdGEuIFRoZSBzdHJhdGVneQotICAgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cyB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlCi0gICBjb21wcmVzc2VkIG91dHB1dCBldmVuIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS4gIFpfRklYRUQgcHJldmVudHMgdGhlCi0gICB1c2Ugb2YgZHluYW1pYyBIdWZmbWFuIGNvZGVzLCBhbGxvd2luZyBmb3IgYSBzaW1wbGVyIGRlY29kZXIgZm9yIHNwZWNpYWwKLSAgIGFwcGxpY2F0aW9ucy4KLQotICAgICAgZGVmbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGFuIGludmFsaWQKLSAgIG1ldGhvZCkuIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQyIGRvZXMKLSAgIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKLS8qCi0gICAgIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGUgc2VxdWVuY2UKLSAgIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZAotICAgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVmbGF0ZUluaXQsIGRlZmxhdGVJbml0MiBvciBkZWZsYXRlUmVzZXQsIGJlZm9yZSBhbnkKLSAgIGNhbGwgb2YgZGVmbGF0ZS4gVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lCi0gICBkaWN0aW9uYXJ5IChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkpLgotCi0gICAgIFRoZSBkaWN0aW9uYXJ5IHNob3VsZCBjb25zaXN0IG9mIHN0cmluZ3MgKGJ5dGUgc2VxdWVuY2VzKSB0aGF0IGFyZSBsaWtlbHkKLSAgIHRvIGJlIGVuY291bnRlcmVkIGxhdGVyIGluIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQsIHdpdGggdGhlIG1vc3QgY29tbW9ubHkKLSAgIHVzZWQgc3RyaW5ncyBwcmVmZXJhYmx5IHB1dCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnkuIFVzaW5nIGEKLSAgIGRpY3Rpb25hcnkgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHNob3J0IGFuZCBjYW4gYmUKLSAgIHByZWRpY3RlZCB3aXRoIGdvb2QgYWNjdXJhY3k7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyIHRoYW4KLSAgIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS4KLQotICAgICBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzaW9uIGRhdGEgc3RydWN0dXJlcyBzZWxlY3RlZCBieQotICAgZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLCBhIHBhcnQgb2YgdGhlIGRpY3Rpb25hcnkgbWF5IGluIGVmZmVjdCBiZQotICAgZGlzY2FyZGVkLCBmb3IgZXhhbXBsZSBpZiB0aGUgZGljdGlvbmFyeSBpcyBsYXJnZXIgdGhhbiB0aGUgd2luZG93IHNpemUgaW4KLSAgIGRlZmxhdGUgb3IgZGVmbGF0ZTIuIFRodXMgdGhlIHN0cmluZ3MgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZnVsIHNob3VsZCBiZQotICAgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuIEluIGFkZGl0aW9uLCB0aGUKLSAgIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGVmbGF0ZSB3aWxsIHVzZSBhdCBtb3N0IHRoZSB3aW5kb3cgc2l6ZSBtaW51cwotICAgMjYyIGJ5dGVzIG9mIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5LgotCi0gICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tPmFkbGVyIGlzIHNldCB0byB0aGUgYWRsZXIzMiB2YWx1ZQotICAgb2YgdGhlIGRpY3Rpb25hcnk7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQotICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAoVGhlIGFkbGVyMzIgdmFsdWUKLSAgIGFwcGxpZXMgdG8gdGhlIHdob2xlIGRpY3Rpb25hcnkgZXZlbiBpZiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBkaWN0aW9uYXJ5IGlzCi0gICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLikgSWYgYSByYXcgZGVmbGF0ZSB3YXMgcmVxdWVzdGVkLCB0aGVuIHRoZQotICAgYWRsZXIzMiB2YWx1ZSBpcyBub3QgY29tcHV0ZWQgYW5kIHN0cm0tPmFkbGVyIGlzIG5vdCBzZXQuCi0KLSAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIGEKLSAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcwotICAgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZSBpZiBkZWZsYXRlIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHN0cmVhbQotICAgb3IgaWYgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBic29ydCkuIGRlZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90Ci0gICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlQ29weSBPRigoel9zdHJlYW1wIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X3N0cmVhbXAgc291cmNlKSk7Ci0vKgotICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLgotCi0gICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHNldmVyYWwgY29tcHJlc3Npb24gc3RyYXRlZ2llcyB3aWxsIGJlCi0gICB0cmllZCwgZm9yIGV4YW1wbGUgd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIHByZS1wcm9jZXNzaW5nIHRoZSBpbnB1dAotICAgZGF0YSB3aXRoIGEgZmlsdGVyLiBUaGUgc3RyZWFtcyB0aGF0IHdpbGwgYmUgZGlzY2FyZGVkIHNob3VsZCB0aGVuIGJlIGZyZWVkCi0gICBieSBjYWxsaW5nIGRlZmxhdGVFbmQuICBOb3RlIHRoYXQgZGVmbGF0ZUNvcHkgZHVwbGljYXRlcyB0aGUgaW50ZXJuYWwKLSAgIGNvbXByZXNzaW9uIHN0YXRlIHdoaWNoIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gdGhpcyBzdHJhdGVneSBpcyBzbG93IGFuZAotICAgY2FuIGNvbnN1bWUgbG90cyBvZiBtZW1vcnkuCi0KLSAgICAgZGVmbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKLSAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKLSAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBOVUxMKS4gbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAotICAgZGVzdGluYXRpb24uCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBkZWZsYXRlRW5kIGZvbGxvd2VkIGJ5IGRlZmxhdGVJbml0LAotICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4KLSAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcwotICAgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSBkZWZsYXRlSW5pdDIuCi0KLSAgICAgIGRlZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIE5VTEwpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUGFyYW1zIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3kpKTsKLS8qCi0gICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LiAgVGhlCi0gICBpbnRlcnByZXRhdGlvbiBvZiBsZXZlbCBhbmQgc3RyYXRlZ3kgaXMgYXMgaW4gZGVmbGF0ZUluaXQyLiAgVGhpcyBjYW4gYmUKLSAgIHVzZWQgdG8gc3dpdGNoIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIHN0cmFpZ2h0IGNvcHkgb2YgdGhlIGlucHV0IGRhdGEsIG9yCi0gICB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQga2luZCBvZiBpbnB1dCBkYXRhIHJlcXVpcmluZyBhIGRpZmZlcmVudAotICAgc3RyYXRlZ3kuIElmIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBjaGFuZ2VkLCB0aGUgaW5wdXQgYXZhaWxhYmxlIHNvIGZhcgotICAgaXMgY29tcHJlc3NlZCB3aXRoIHRoZSBvbGQgbGV2ZWwgKGFuZCBtYXkgYmUgZmx1c2hlZCk7IHRoZSBuZXcgbGV2ZWwgd2lsbAotICAgdGFrZSBlZmZlY3Qgb25seSBhdCB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KLQotICAgICBCZWZvcmUgdGhlIGNhbGwgb2YgZGVmbGF0ZVBhcmFtcywgdGhlIHN0cmVhbSBzdGF0ZSBtdXN0IGJlIHNldCBhcyBmb3IKLSAgIGEgY2FsbCBvZiBkZWZsYXRlKCksIHNpbmNlIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGlucHV0IG1heSBoYXZlIHRvCi0gICBiZSBjb21wcmVzc2VkIGFuZCBmbHVzaGVkLiBJbiBwYXJ0aWN1bGFyLCBzdHJtLT5hdmFpbF9vdXQgbXVzdCBiZSBub24temVyby4KLQotICAgICBkZWZsYXRlUGFyYW1zIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCBvciBpZiBhIHBhcmFtZXRlciB3YXMgaW52YWxpZCwgWl9CVUZfRVJST1IKLSAgIGlmIHN0cm0tPmF2YWlsX291dCB3YXMgemVyby4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVR1bmUgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdvb2RfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9sYXp5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5pY2VfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jaGFpbikpOwotLyoKLSAgICAgRmluZSB0dW5lIGRlZmxhdGUncyBpbnRlcm5hbCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAgVGhpcyBzaG91bGQgb25seSBiZQotICAgdXNlZCBieSBzb21lb25lIHdobyB1bmRlcnN0YW5kcyB0aGUgYWxnb3JpdGhtIHVzZWQgYnkgemxpYidzIGRlZmxhdGUgZm9yCi0gICBzZWFyY2hpbmcgZm9yIHRoZSBiZXN0IG1hdGNoaW5nIHN0cmluZywgYW5kIGV2ZW4gdGhlbiBvbmx5IGJ5IHRoZSBtb3N0Ci0gICBmYW5hdGljIG9wdGltaXplciB0cnlpbmcgdG8gc3F1ZWV6ZSBvdXQgdGhlIGxhc3QgY29tcHJlc3NlZCBiaXQgZm9yIHRoZWlyCi0gICBzcGVjaWZpYyBpbnB1dCBkYXRhLiAgUmVhZCB0aGUgZGVmbGF0ZS5jIHNvdXJjZSBjb2RlIGZvciB0aGUgbWVhbmluZyBvZiB0aGUKLSAgIG1heF9sYXp5LCBnb29kX2xlbmd0aCwgbmljZV9sZW5ndGgsIGFuZCBtYXhfY2hhaW4gcGFyYW1ldGVycy4KLQotICAgICBkZWZsYXRlVHVuZSgpIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgZGVmbGF0ZUluaXQoKSBvciBkZWZsYXRlSW5pdDIoKSwgYW5kCi0gICByZXR1cm5zIFpfT0sgb24gc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgZm9yIGFuIGludmFsaWQgZGVmbGF0ZSBzdHJlYW0uCi0gKi8KLQotWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGRlZmxhdGVCb3VuZCBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBzb3VyY2VMZW4pKTsKLS8qCi0gICAgIGRlZmxhdGVCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgotICAgZGVmbGF0aW9uIG9mIHNvdXJjZUxlbiBieXRlcy4gIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZmxhdGVJbml0KCkKLSAgIG9yIGRlZmxhdGVJbml0MigpLiAgVGhpcyB3b3VsZCBiZSB1c2VkIHRvIGFsbG9jYXRlIGFuIG91dHB1dCBidWZmZXIKLSAgIGZvciBkZWZsYXRpb24gaW4gYSBzaW5nbGUgcGFzcywgYW5kIHNvIHdvdWxkIGJlIGNhbGxlZCBiZWZvcmUgZGVmbGF0ZSgpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUHJpbWUgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkpOwotLyoKLSAgICAgZGVmbGF0ZVByaW1lKCkgaW5zZXJ0cyBiaXRzIGluIHRoZSBkZWZsYXRlIG91dHB1dCBzdHJlYW0uICBUaGUgaW50ZW50Ci0gIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IG9mZiB0aGUgZGVmbGF0ZSBvdXRwdXQgd2l0aCB0aGUKLSAgYml0cyBsZWZ0b3ZlciBmcm9tIGEgcHJldmlvdXMgZGVmbGF0ZSBzdHJlYW0gd2hlbiBhcHBlbmRpbmcgdG8gaXQuICBBcyBzdWNoLAotICB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHJhdyBkZWZsYXRlLCBhbmQgbXVzdCBiZSB1c2VkIGJlZm9yZSB0aGUKLSAgZmlyc3QgZGVmbGF0ZSgpIGNhbGwgYWZ0ZXIgYSBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZQotICBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YKLSAgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgb3V0cHV0LgotCi0gICAgICBkZWZsYXRlUHJpbWUgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlU2V0SGVhZGVyIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3pfaGVhZGVycCBoZWFkKSk7Ci0vKgotICAgICAgZGVmbGF0ZVNldEhlYWRlcigpIHByb3ZpZGVzIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIGZvciB3aGVuIGEgZ3ppcAotICAgc3RyZWFtIGlzIHJlcXVlc3RlZCBieSBkZWZsYXRlSW5pdDIoKS4gIGRlZmxhdGVTZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkCi0gICBhZnRlciBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKSBhbmQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mCi0gICBkZWZsYXRlKCkuICBUaGUgdGV4dCwgdGltZSwgb3MsIGV4dHJhIGZpZWxkLCBuYW1lLCBhbmQgY29tbWVudCBpbmZvcm1hdGlvbgotICAgaW4gdGhlIHByb3ZpZGVkIGd6X2hlYWRlciBzdHJ1Y3R1cmUgYXJlIHdyaXR0ZW4gdG8gdGhlIGd6aXAgaGVhZGVyICh4ZmxhZyBpcwotICAgaWdub3JlZCAtLSB0aGUgZXh0cmEgZmxhZ3MgYXJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIGNvbXByZXNzaW9uIGxldmVsKS4gIFRoZQotICAgY2FsbGVyIG11c3QgYXNzdXJlIHRoYXQsIGlmIG5vdCBaX05VTEwsIG5hbWUgYW5kIGNvbW1lbnQgYXJlIHRlcm1pbmF0ZWQgd2l0aAotICAgYSB6ZXJvIGJ5dGUsIGFuZCB0aGF0IGlmIGV4dHJhIGlzIG5vdCBaX05VTEwsIHRoYXQgZXh0cmFfbGVuIGJ5dGVzIGFyZQotICAgYXZhaWxhYmxlIHRoZXJlLiAgSWYgaGNyYyBpcyB0cnVlLCBhIGd6aXAgaGVhZGVyIGNyYyBpcyBpbmNsdWRlZC4gIE5vdGUgdGhhdAotICAgdGhlIGN1cnJlbnQgdmVyc2lvbnMgb2YgdGhlIGNvbW1hbmQtbGluZSB2ZXJzaW9uIG9mIGd6aXAgKHVwIHRocm91Z2ggdmVyc2lvbgotICAgMS4zLngpIGRvIG5vdCBzdXBwb3J0IGhlYWRlciBjcmMncywgYW5kIHdpbGwgcmVwb3J0IHRoYXQgaXQgaXMgYSAibXVsdGktcGFydAotICAgZ3ppcCBmaWxlIiBhbmQgZ2l2ZSB1cC4KLQotICAgICAgSWYgZGVmbGF0ZVNldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlIGRlZmF1bHQgZ3ppcCBoZWFkZXIgaGFzIHRleHQgZmFsc2UsCi0gICB0aGUgdGltZSBzZXQgdG8gemVybywgYW5kIG9zIHNldCB0byAyNTUsIHdpdGggbm8gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQKLSAgIGZpZWxkcy4gIFRoZSBnemlwIGhlYWRlciBpcyByZXR1cm5lZCB0byB0aGUgZGVmYXVsdCBzdGF0ZSBieSBkZWZsYXRlUmVzZXQoKS4KLQotICAgICAgZGVmbGF0ZVNldEhlYWRlciByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi0vKgotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDIgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cykpOwotCi0gICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIGluZmxhdGVJbml0IHdpdGggYW4gZXh0cmEgcGFyYW1ldGVyLiBUaGUKLSAgIGZpZWxkcyBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQKLSAgIGJlZm9yZSBieSB0aGUgY2FsbGVyLgotCi0gICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdwotICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCi0gICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIGluZmxhdGVJbml0IGlzIHVzZWQKLSAgIGluc3RlYWQuIHdpbmRvd0JpdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHdpbmRvd0JpdHMgdmFsdWUKLSAgIHByb3ZpZGVkIHRvIGRlZmxhdGVJbml0MigpIHdoaWxlIGNvbXByZXNzaW5nLCBvciBpdCBtdXN0IGJlIGVxdWFsIHRvIDE1IGlmCi0gICBkZWZsYXRlSW5pdDIoKSB3YXMgbm90IHVzZWQuIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cKLSAgIHNpemUgaXMgZ2l2ZW4gYXMgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlCi0gICBaX0RBVEFfRVJST1IgaW5zdGVhZCBvZiB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGluZmxhdGUuIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKLSAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiBpbmZsYXRlKCkgd2lsbCB0aGVuIHByb2Nlc3MgcmF3IGRlZmxhdGUgZGF0YSwKLSAgIG5vdCBsb29raW5nIGZvciBhIHpsaWIgb3IgZ3ppcCBoZWFkZXIsIG5vdCBnZW5lcmF0aW5nIGEgY2hlY2sgdmFsdWUsIGFuZCBub3QKLSAgIGxvb2tpbmcgZm9yIGFueSBjaGVjayB2YWx1ZXMgZm9yIGNvbXBhcmlzb24gYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiBUaGlzCi0gICBpcyBmb3IgdXNlIHdpdGggb3RoZXIgZm9ybWF0cyB0aGF0IHVzZSB0aGUgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0Ci0gICBzdWNoIGFzIHppcC4gIFRob3NlIGZvcm1hdHMgcHJvdmlkZSB0aGVpciBvd24gY2hlY2sgdmFsdWVzLiBJZiBhIGN1c3RvbQotICAgZm9ybWF0IGlzIGRldmVsb3BlZCB1c2luZyB0aGUgcmF3IGRlZmxhdGUgZm9ybWF0IGZvciBjb21wcmVzc2VkIGRhdGEsIGl0IGlzCi0gICByZWNvbW1lbmRlZCB0aGF0IGEgY2hlY2sgdmFsdWUgc3VjaCBhcyBhbiBhZGxlcjMyIG9yIGEgY3JjMzIgYmUgYXBwbGllZCB0bwotICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFzIGlzIGRvbmUgaW4gdGhlIHpsaWIsIGd6aXAsIGFuZCB6aXAgZm9ybWF0cy4gIEZvcgotICAgbW9zdCBhcHBsaWNhdGlvbnMsIHRoZSB6bGliIGZvcm1hdCBzaG91bGQgYmUgdXNlZCBhcyBpcy4gTm90ZSB0aGF0IGNvbW1lbnRzCi0gICBhYm92ZSBvbiB0aGUgdXNlIGluIGRlZmxhdGVJbml0MigpIGFwcGxpZXMgdG8gdGhlIG1hZ25pdHVkZSBvZiB3aW5kb3dCaXRzLgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgZ3JlYXRlciB0aGFuIDE1IGZvciBvcHRpb25hbCBnemlwIGRlY29kaW5nLiBBZGQKLSAgIDMyIHRvIHdpbmRvd0JpdHMgdG8gZW5hYmxlIHpsaWIgYW5kIGd6aXAgZGVjb2Rpbmcgd2l0aCBhdXRvbWF0aWMgaGVhZGVyCi0gICBkZXRlY3Rpb24sIG9yIGFkZCAxNiB0byBkZWNvZGUgb25seSB0aGUgZ3ppcCBmb3JtYXQgKHRoZSB6bGliIGZvcm1hdCB3aWxsCi0gICByZXR1cm4gYSBaX0RBVEFfRVJST1IpLiAgSWYgYSBnemlwIHN0cmVhbSBpcyBiZWluZyBkZWNvZGVkLCBzdHJtLT5hZGxlciBpcwotICAgYSBjcmMzMiBpbnN0ZWFkIG9mIGFuIGFkbGVyMzIuCi0KLSAgICAgaW5mbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGEgbnVsbCBzdHJtKS4gbXNnCi0gICBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQyIGRvZXMgbm90IHBlcmZvcm0KLSAgIGFueSBkZWNvbXByZXNzaW9uIGFwYXJ0IGZyb20gcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogdGhpcyB3aWxsCi0gICBiZSBkb25lIGJ5IGluZmxhdGUoKS4gKFNvIG5leHRfaW4gYW5kIGF2YWlsX2luIG1heSBiZSBtb2RpZmllZCwgYnV0IG5leHRfb3V0Ci0gICBhbmQgYXZhaWxfb3V0IGFyZSB1bmNoYW5nZWQuKQotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKLS8qCi0gICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKLSAgIHNlcXVlbmNlLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCBvZiBpbmZsYXRlLAotICAgaWYgdGhhdCBjYWxsIHJldHVybmVkIFpfTkVFRF9ESUNULiBUaGUgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IKLSAgIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhhdCBjYWxsIG9mIGluZmxhdGUuCi0gICBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUgZGljdGlvbmFyeSAoc2VlCi0gICBkZWZsYXRlU2V0RGljdGlvbmFyeSkuICBGb3IgcmF3IGluZmxhdGUsIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZAotICAgaW1tZWRpYXRlbHkgYWZ0ZXIgaW5mbGF0ZUluaXQyKCkgb3IgaW5mbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSBhbnkgY2FsbCBvZgotICAgaW5mbGF0ZSgpIHRvIHNldCB0aGUgZGljdGlvbmFyeS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluc3VyZSB0aGF0IHRoZQotICAgZGljdGlvbmFyeSB0aGF0IHdhcyB1c2VkIGZvciBjb21wcmVzc2lvbiBpcyBwcm92aWRlZC4KLQotICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYQotICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCi0gICBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQotICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgYWRsZXIzMiB2YWx1ZSkuIGluZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90Ci0gICBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBzdWJzZXF1ZW50IGNhbGxzIG9mCi0gICBpbmZsYXRlKCkuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTeW5jIE9GKCh6X3N0cmVhbXAgc3RybSkpOwotLyoKLSAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKLSAgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZSB3aXRoIFpfRlVMTF9GTFVTSCkgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKLSAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuIE5vIG91dHB1dCBpcyBwcm92aWRlZC4KLQotICAgIGluZmxhdGVTeW5jIHJldHVybnMgWl9PSyBpZiBhIGZ1bGwgZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsIFpfQlVGX0VSUk9SCi0gIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCBaX0RBVEFfRVJST1IgaWYgbm8gZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsCi0gIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBzdWNjZXNzCi0gIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc2F2ZSB0aGUgY3VycmVudCBjdXJyZW50IHZhbHVlIG9mIHRvdGFsX2luIHdoaWNoCi0gIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlCi0gIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgaW5mbGF0ZVN5bmMsIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2ggdGltZSwKLSAgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfc3RyZWFtcCBzb3VyY2UpKTsKLS8qCi0gICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uCi0KLSAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gcmFuZG9tbHkgYWNjZXNzaW5nIGEgbGFyZ2Ugc3RyZWFtLiAgVGhlCi0gICBmaXJzdCBwYXNzIHRocm91Z2ggdGhlIHN0cmVhbSBjYW4gcGVyaW9kaWNhbGx5IHJlY29yZCB0aGUgaW5mbGF0ZSBzdGF0ZSwKLSAgIGFsbG93aW5nIHJlc3RhcnRpbmcgaW5mbGF0ZSBhdCB0aG9zZSBwb2ludHMgd2hlbiByYW5kb21seSBhY2Nlc3NpbmcgdGhlCi0gICBzdHJlYW0uCi0KLSAgICAgaW5mbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKLSAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKLSAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBOVUxMKS4gbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAotICAgZGVzdGluYXRpb24uCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBpbmZsYXRlRW5kIGZvbGxvd2VkIGJ5IGluZmxhdGVJbml0LAotICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBkZWNvbXByZXNzaW9uIHN0YXRlLgotICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGluZmxhdGVJbml0Mi4KLQotICAgICAgaW5mbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgTlVMTCkuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVQcmltZSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSk7Ci0vKgotICAgICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYml0cyBpbiB0aGUgaW5mbGF0ZSBpbnB1dCBzdHJlYW0uICBUaGUgaW50ZW50IGlzCi0gIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGluZmxhdGluZyBhdCBhIGJpdCBwb3NpdGlvbiBpbiB0aGUKLSAgbWlkZGxlIG9mIGEgYnl0ZS4gIFRoZSBwcm92aWRlZCBiaXRzIHdpbGwgYmUgdXNlZCBiZWZvcmUgYW55IGJ5dGVzIGFyZSB1c2VkCi0gIGZyb20gbmV4dF9pbi4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHJhdyBpbmZsYXRlLCBhbmQKLSAgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdCBpbmZsYXRlKCkgY2FsbCBhZnRlciBpbmZsYXRlSW5pdDIoKSBvcgotICBpbmZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlCi0gIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgaW5wdXQuCi0KLSAgICAgIGluZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVHZXRIZWFkZXIgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnel9oZWFkZXJwIGhlYWQpKTsKLS8qCi0gICAgICBpbmZsYXRlR2V0SGVhZGVyKCkgcmVxdWVzdHMgdGhhdCBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBiZSBzdG9yZWQgaW4gdGhlCi0gICBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlLiAgaW5mbGF0ZUdldEhlYWRlcigpIG1heSBiZSBjYWxsZWQgYWZ0ZXIKLSAgIGluZmxhdGVJbml0MigpIG9yIGluZmxhdGVSZXNldCgpLCBhbmQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mIGluZmxhdGUoKS4KLSAgIEFzIGluZmxhdGUoKSBwcm9jZXNzZXMgdGhlIGd6aXAgc3RyZWFtLCBoZWFkLT5kb25lIGlzIHplcm8gdW50aWwgdGhlIGhlYWRlcgotICAgaXMgY29tcGxldGVkLCBhdCB3aGljaCB0aW1lIGhlYWQtPmRvbmUgaXMgc2V0IHRvIG9uZS4gIElmIGEgemxpYiBzdHJlYW0gaXMKLSAgIGJlaW5nIGRlY29kZWQsIHRoZW4gaGVhZC0+ZG9uZSBpcyBzZXQgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSB3aWxsIGJlCi0gICBubyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3J0aGNvbWluZy4gIE5vdGUgdGhhdCBaX0JMT0NLIGNhbiBiZSB1c2VkIHRvCi0gICBmb3JjZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGhlYWRlciBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlCi0gICBhbmQgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpcyBkZWNvbXByZXNzZWQuCi0KLSAgICAgIFRoZSB0ZXh0LCB0aW1lLCB4ZmxhZ3MsIGFuZCBvcyBmaWVsZHMgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSBnemlwIGhlYWRlcgotICAgY29udGVudHMuICBoY3JjIGlzIHNldCB0byB0cnVlIGlmIHRoZXJlIGlzIGEgaGVhZGVyIENSQy4gIChUaGUgaGVhZGVyIENSQwotICAgd2FzIHZhbGlkIGlmIGRvbmUgaXMgc2V0IHRvIG9uZS4pICBJZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGVuIGV4dHJhX21heAotICAgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIGV4dHJhLiAgT25jZSBkb25lIGlzIHRydWUsCi0gICBleHRyYV9sZW4gY29udGFpbnMgdGhlIGFjdHVhbCBleHRyYSBmaWVsZCBsZW5ndGgsIGFuZCBleHRyYSBjb250YWlucyB0aGUKLSAgIGV4dHJhIGZpZWxkLCBvciB0aGF0IGZpZWxkIHRydW5jYXRlZCBpZiBleHRyYV9tYXggaXMgbGVzcyB0aGFuIGV4dHJhX2xlbi4KLSAgIElmIG5hbWUgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBuYW1lX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAotICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gbmFtZV9tYXguICBJZgotICAgY29tbWVudCBpcyBub3QgWl9OVUxMLCB0aGVuIHVwIHRvIGNvbW1fbWF4IGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhlcmUsCi0gICB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJvIHVubGVzcyB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBjb21tX21heC4gIFdoZW4KLSAgIGFueSBvZiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCBhcmUgbm90IFpfTlVMTCBhbmQgdGhlIHJlc3BlY3RpdmUgZmllbGQgaXMKLSAgIG5vdCBwcmVzZW50IGluIHRoZSBoZWFkZXIsIHRoZW4gdGhhdCBmaWVsZCBpcyBzZXQgdG8gWl9OVUxMIHRvIHNpZ25hbCBpdHMKLSAgIGFic2VuY2UuICBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIGRlZmxhdGVTZXRIZWFkZXIoKSB3aXRoIHRoZSByZXR1cm5lZAotICAgc3RydWN0dXJlIHRvIGR1cGxpY2F0ZSB0aGUgaGVhZGVyLiAgSG93ZXZlciBpZiB0aG9zZSBmaWVsZHMgYXJlIHNldCB0bwotICAgYWxsb2NhdGVkIG1lbW9yeSwgdGhlbiB0aGUgYXBwbGljYXRpb24gd2lsbCBuZWVkIHRvIHNhdmUgdGhvc2UgcG9pbnRlcnMKLSAgIGVsc2V3aGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlIGV2ZW50dWFsbHkgZnJlZWQuCi0KLSAgICAgIElmIGluZmxhdGVHZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZW4gdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzaW1wbHkKLSAgIGRpc2NhcmRlZC4gIFRoZSBoZWFkZXIgaXMgYWx3YXlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5LCBpbmNsdWRpbmcgdGhlIGhlYWRlcgotICAgQ1JDIGlmIHByZXNlbnQuICBpbmZsYXRlUmVzZXQoKSB3aWxsIHJlc2V0IHRoZSBwcm9jZXNzIHRvIGRpc2NhcmQgdGhlIGhlYWRlcgotICAgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24gd291bGQgbmVlZCB0byBjYWxsIGluZmxhdGVHZXRIZWFkZXIoKSBhZ2FpbiB0bwotICAgcmV0cmlldmUgdGhlIGhlYWRlciBmcm9tIHRoZSBuZXh0IGd6aXAgc3RyZWFtLgotCi0gICAgICBpbmZsYXRlR2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KLSovCi0KLS8qCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrSW5pdCBPRigoel9zdHJlYW1wIHN0cm0sIGludCB3aW5kb3dCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3cpKTsKLQotICAgICBJbml0aWFsaXplIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGRlY29tcHJlc3Npb24gdXNpbmcgaW5mbGF0ZUJhY2soKQotICAgY2FsbHMuICBUaGUgZmllbGRzIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBpbiBzdHJtIG11c3QgYmUgaW5pdGlhbGl6ZWQKLSAgIGJlZm9yZSB0aGUgY2FsbC4gIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIFpfTlVMTCwgdGhlbiB0aGUgZGVmYXVsdCBsaWJyYXJ5LQotICAgZGVyaXZlZCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBhcmUgdXNlZC4gIHdpbmRvd0JpdHMgaXMgdGhlIGJhc2UgdHdvCi0gICBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplLCBpbiB0aGUgcmFuZ2UgOC4uMTUuICB3aW5kb3cgaXMgYSBjYWxsZXIKLSAgIHN1cHBsaWVkIGJ1ZmZlciBvZiB0aGF0IHNpemUuICBFeGNlcHQgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zIHdoZXJlIGl0IGlzCi0gICBhc3N1cmVkIHRoYXQgZGVmbGF0ZSB3YXMgdXNlZCB3aXRoIHNtYWxsIHdpbmRvdyBzaXplcywgd2luZG93Qml0cyBtdXN0IGJlIDE1Ci0gICBhbmQgYSAzMksgYnl0ZSB3aW5kb3cgbXVzdCBiZSBzdXBwbGllZCB0byBiZSBhYmxlIHRvIGRlY29tcHJlc3MgZ2VuZXJhbAotICAgZGVmbGF0ZSBzdHJlYW1zLgotCi0gICAgIFNlZSBpbmZsYXRlQmFjaygpIGZvciB0aGUgdXNhZ2Ugb2YgdGhlc2Ugcm91dGluZXMuCi0KLSAgICAgaW5mbGF0ZUJhY2tJbml0IHdpbGwgcmV0dXJuIFpfT0sgb24gc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYW55IG9mCi0gICB0aGUgcGFyYW1hdGVycyBhcmUgaW52YWxpZCwgWl9NRU1fRVJST1IgaWYgdGhlIGludGVybmFsIHN0YXRlIGNvdWxkIG5vdAotICAgYmUgYWxsb2NhdGVkLCBvciBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgZG9lcyBub3QKLSAgIG1hdGNoIHRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIgZmlsZS4KLSovCi0KLXR5cGVkZWYgdW5zaWduZWQgKCppbl9mdW5jKSBPRigodm9pZCBGQVIgKiwgdW5zaWduZWQgY2hhciBGQVIgKiBGQVIgKikpOwotdHlwZWRlZiBpbnQgKCpvdXRfZnVuYykgT0YoKHZvaWQgRkFSICosIHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7Ci0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2sgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZnVuYyBpbiwgdm9pZCBGQVIgKmluX2Rlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZnVuYyBvdXQsIHZvaWQgRkFSICpvdXRfZGVzYykpOwotLyoKLSAgICAgaW5mbGF0ZUJhY2soKSBkb2VzIGEgcmF3IGluZmxhdGUgd2l0aCBhIHNpbmdsZSBjYWxsIHVzaW5nIGEgY2FsbC1iYWNrCi0gICBpbnRlcmZhY2UgZm9yIGlucHV0IGFuZCBvdXRwdXQuICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaW5mbGF0ZSgpIGZvcgotICAgZmlsZSBpL28gYXBwbGljYXRpb25zIGluIHRoYXQgaXQgYXZvaWRzIGNvcHlpbmcgYmV0d2VlbiB0aGUgb3V0cHV0IGFuZCB0aGUKLSAgIHNsaWRpbmcgd2luZG93IGJ5IHNpbXBseSBtYWtpbmcgdGhlIHdpbmRvdyBpdHNlbGYgdGhlIG91dHB1dCBidWZmZXIuICBUaGlzCi0gICBmdW5jdGlvbiB0cnVzdHMgdGhlIGFwcGxpY2F0aW9uIHRvIG5vdCBjaGFuZ2UgdGhlIG91dHB1dCBidWZmZXIgcGFzc2VkIGJ5Ci0gICB0aGUgb3V0cHV0IGZ1bmN0aW9uLCBhdCBsZWFzdCB1bnRpbCBpbmZsYXRlQmFjaygpIHJldHVybnMuCi0KLSAgICAgaW5mbGF0ZUJhY2tJbml0KCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlCi0gICBhbmQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgd2l0aCB0aGUgdXNlci1wcm92aWRlZCB3aW5kb3cgYnVmZmVyLgotICAgaW5mbGF0ZUJhY2soKSBtYXkgdGhlbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzIHRvIGluZmxhdGUgYSBjb21wbGV0ZSwgcmF3Ci0gICBkZWZsYXRlIHN0cmVhbSB3aXRoIGVhY2ggY2FsbC4gIGluZmxhdGVCYWNrRW5kKCkgaXMgdGhlbiBjYWxsZWQgdG8gZnJlZQotICAgdGhlIGFsbG9jYXRlZCBzdGF0ZS4KLQotICAgICBBIHJhdyBkZWZsYXRlIHN0cmVhbSBpcyBvbmUgd2l0aCBubyB6bGliIG9yIGd6aXAgaGVhZGVyIG9yIHRyYWlsZXIuCi0gICBUaGlzIHJvdXRpbmUgd291bGQgbm9ybWFsbHkgYmUgdXNlZCBpbiBhIHV0aWxpdHkgdGhhdCByZWFkcyB6aXAgb3IgZ3ppcAotICAgZmlsZXMgYW5kIHdyaXRlcyBvdXQgdW5jb21wcmVzc2VkIGZpbGVzLiAgVGhlIHV0aWxpdHkgd291bGQgZGVjb2RlIHRoZQotICAgaGVhZGVyIGFuZCBwcm9jZXNzIHRoZSB0cmFpbGVyIG9uIGl0cyBvd24sIGhlbmNlIHRoaXMgcm91dGluZSBleHBlY3RzCi0gICBvbmx5IHRoZSByYXcgZGVmbGF0ZSBzdHJlYW0gdG8gZGVjb21wcmVzcy4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlCi0gICBub3JtYWwgYmVoYXZpb3Igb2YgaW5mbGF0ZSgpLCB3aGljaCBleHBlY3RzIGVpdGhlciBhIHpsaWIgb3IgZ3ppcCBoZWFkZXIgYW5kCi0gICB0cmFpbGVyIGFyb3VuZCB0aGUgZGVmbGF0ZSBzdHJlYW0uCi0KLSAgICAgaW5mbGF0ZUJhY2soKSB1c2VzIHR3byBzdWJyb3V0aW5lcyBzdXBwbGllZCBieSB0aGUgY2FsbGVyIHRoYXQgYXJlIHRoZW4KLSAgIGNhbGxlZCBieSBpbmZsYXRlQmFjaygpIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgaW5mbGF0ZUJhY2soKSBjYWxscyB0aG9zZQotICAgcm91dGluZXMgdW50aWwgaXQgcmVhZHMgYSBjb21wbGV0ZSBkZWZsYXRlIHN0cmVhbSBhbmQgd3JpdGVzIG91dCBhbGwgb2YgdGhlCi0gICB1bmNvbXByZXNzZWQgZGF0YSwgb3IgdW50aWwgaXQgZW5jb3VudGVycyBhbiBlcnJvci4gIFRoZSBmdW5jdGlvbidzCi0gICBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdHlwZXMgYXJlIGRlZmluZWQgYWJvdmUgaW4gdGhlIGluX2Z1bmMgYW5kIG91dF9mdW5jCi0gICB0eXBlZGVmcy4gIGluZmxhdGVCYWNrKCkgd2lsbCBjYWxsIGluKGluX2Rlc2MsICZidWYpIHdoaWNoIHNob3VsZCByZXR1cm4gdGhlCi0gICBudW1iZXIgb2YgYnl0ZXMgb2YgcHJvdmlkZWQgaW5wdXQsIGFuZCBhIHBvaW50ZXIgdG8gdGhhdCBpbnB1dCBpbiBidWYuICBJZgotICAgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLCBpbigpIG11c3QgcmV0dXJuIHplcm8tLWJ1ZiBpcyBpZ25vcmVkIGluIHRoYXQKLSAgIGNhc2UtLWFuZCBpbmZsYXRlQmFjaygpIHdpbGwgcmV0dXJuIGEgYnVmZmVyIGVycm9yLiAgaW5mbGF0ZUJhY2soKSB3aWxsIGNhbGwKLSAgIG91dChvdXRfZGVzYywgYnVmLCBsZW4pIHRvIHdyaXRlIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBidWZbMC4ubGVuLTFdLiAgb3V0KCkKLSAgIHNob3VsZCByZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBub24temVybyBvbiBmYWlsdXJlLiAgSWYgb3V0KCkgcmV0dXJucwotICAgbm9uLXplcm8sIGluZmxhdGVCYWNrKCkgd2lsbCByZXR1cm4gd2l0aCBhbiBlcnJvci4gIE5laXRoZXIgaW4oKSBub3Igb3V0KCkKLSAgIGFyZSBwZXJtaXR0ZWQgdG8gY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgd2luZG93IHByb3ZpZGVkIHRvCi0gICBpbmZsYXRlQmFja0luaXQoKSwgd2hpY2ggaXMgYWxzbyB0aGUgYnVmZmVyIHRoYXQgb3V0KCkgdXNlcyB0byB3cml0ZSBmcm9tLgotICAgVGhlIGxlbmd0aCB3cml0dGVuIGJ5IG91dCgpIHdpbGwgYmUgYXQgbW9zdCB0aGUgd2luZG93IHNpemUuICBBbnkgbm9uLXplcm8KLSAgIGFtb3VudCBvZiBpbnB1dCBtYXkgYmUgcHJvdmlkZWQgYnkgaW4oKS4KLQotICAgICBGb3IgY29udmVuaWVuY2UsIGluZmxhdGVCYWNrKCkgY2FuIGJlIHByb3ZpZGVkIGlucHV0IG9uIHRoZSBmaXJzdCBjYWxsIGJ5Ci0gICBzZXR0aW5nIHN0cm0tPm5leHRfaW4gYW5kIHN0cm0tPmF2YWlsX2luLiAgSWYgdGhhdCBpbnB1dCBpcyBleGhhdXN0ZWQsIHRoZW4KLSAgIGluKCkgd2lsbCBiZSBjYWxsZWQuICBUaGVyZWZvcmUgc3RybS0+bmV4dF9pbiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZQotICAgY2FsbGluZyBpbmZsYXRlQmFjaygpLiAgSWYgc3RybS0+bmV4dF9pbiBpcyBaX05VTEwsIHRoZW4gaW4oKSB3aWxsIGJlIGNhbGxlZAotICAgaW1tZWRpYXRlbHkgZm9yIGlucHV0LiAgSWYgc3RybS0+bmV4dF9pbiBpcyBub3QgWl9OVUxMLCB0aGVuIHN0cm0tPmF2YWlsX2luCi0gICBtdXN0IGFsc28gYmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGVuIGlmIHN0cm0tPmF2YWlsX2luIGlzIG5vdCB6ZXJvLCBpbnB1dCB3aWxsCi0gICBpbml0aWFsbHkgYmUgdGFrZW4gZnJvbSBzdHJtLT5uZXh0X2luWzAgLi4gc3RybS0+YXZhaWxfaW4gLSAxXS4KLQotICAgICBUaGUgaW5fZGVzYyBhbmQgb3V0X2Rlc2MgcGFyYW1ldGVycyBvZiBpbmZsYXRlQmFjaygpIGlzIHBhc3NlZCBhcyB0aGUKLSAgIGZpcnN0IHBhcmFtZXRlciBvZiBpbigpIGFuZCBvdXQoKSByZXNwZWN0aXZlbHkgd2hlbiB0aGV5IGFyZSBjYWxsZWQuICBUaGVzZQotICAgZGVzY3JpcHRvcnMgY2FuIGJlIG9wdGlvbmFsbHkgdXNlZCB0byBwYXNzIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBjYWxsZXItCi0gICBzdXBwbGllZCBpbigpIGFuZCBvdXQoKSBmdW5jdGlvbnMgbmVlZCB0byBkbyB0aGVpciBqb2IuCi0KLSAgICAgT24gcmV0dXJuLCBpbmZsYXRlQmFjaygpIHdpbGwgc2V0IHN0cm0tPm5leHRfaW4gYW5kIHN0cm0tPmF2YWlsX2luIHRvCi0gICBwYXNzIGJhY2sgYW55IHVudXNlZCBpbnB1dCB0aGF0IHdhcyBwcm92aWRlZCBieSB0aGUgbGFzdCBpbigpIGNhbGwuICBUaGUKLSAgIHJldHVybiB2YWx1ZXMgb2YgaW5mbGF0ZUJhY2soKSBjYW4gYmUgWl9TVFJFQU1fRU5EIG9uIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SCi0gICBpZiBpbigpIG9yIG91dCgpIHJldHVybmVkIGFuIGVycm9yLCBaX0RBVEFfRVJST1IgaWYgdGhlcmUgd2FzIGEgZm9ybWF0Ci0gICBlcnJvciBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0gKGluIHdoaWNoIGNhc2Ugc3RybS0+bXNnIGlzIHNldCB0byBpbmRpY2F0ZSB0aGUKLSAgIG5hdHVyZSBvZiB0aGUgZXJyb3IpLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBub3QgcHJvcGVybHkKLSAgIGluaXRpYWxpemVkLiAgSW4gdGhlIGNhc2Ugb2YgWl9CVUZfRVJST1IsIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBjYW4gYmUKLSAgIGRpc3Rpbmd1aXNoZWQgdXNpbmcgc3RybS0+bmV4dF9pbiB3aGljaCB3aWxsIGJlIFpfTlVMTCBvbmx5IGlmIGluKCkgcmV0dXJuZWQKLSAgIGFuIGVycm9yLiAgSWYgc3RybS0+bmV4dCBpcyBub3QgWl9OVUxMLCB0aGVuIHRoZSBaX0JVRl9FUlJPUiB3YXMgZHVlIHRvCi0gICBvdXQoKSByZXR1cm5pbmcgbm9uLXplcm8uICAoaW4oKSB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgYmVmb3JlIG91dCgpLCBzbwotICAgc3RybS0+bmV4dF9pbiBpcyBhc3N1cmVkIHRvIGJlIGRlZmluZWQgaWYgb3V0KCkgcmV0dXJucyBub24temVyby4pICBOb3RlCi0gICB0aGF0IGluZmxhdGVCYWNrKCkgY2Fubm90IHJldHVybiBaX09LLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGluZmxhdGVCYWNrSW5pdCgpIGlzIGZyZWVkLgotCi0gICAgIGluZmxhdGVCYWNrRW5kKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0KLSAgIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncyBPRigodm9pZCkpOwotLyogUmV0dXJuIGZsYWdzIGluZGljYXRpbmcgY29tcGlsZS10aW1lIG9wdGlvbnMuCi0KLSAgICBUeXBlIHNpemVzLCB0d28gYml0cyBlYWNoLCAwMCA9IDE2IGJpdHMsIDAxID0gMzIsIDEwID0gNjQsIDExID0gb3RoZXI6Ci0gICAgIDEuMDogc2l6ZSBvZiB1SW50Ci0gICAgIDMuMjogc2l6ZSBvZiB1TG9uZwotICAgICA1LjQ6IHNpemUgb2Ygdm9pZHBmIChwb2ludGVyKQotICAgICA3LjY6IHNpemUgb2Ygel9vZmZfdAotCi0gICAgQ29tcGlsZXIsIGFzc2VtYmxlciwgYW5kIGRlYnVnIG9wdGlvbnM6Ci0gICAgIDg6IERFQlVHCi0gICAgIDk6IEFTTVYgb3IgQVNNSU5GIC0tIHVzZSBBU00gY29kZQotICAgICAxMDogWkxJQl9XSU5BUEkgLS0gZXhwb3J0ZWQgZnVuY3Rpb25zIHVzZSB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbgotICAgICAxMTogMCAocmVzZXJ2ZWQpCi0KLSAgICBPbmUtdGltZSB0YWJsZSBidWlsZGluZyAoc21hbGxlciBjb2RlLCBidXQgbm90IHRocmVhZC1zYWZlIGlmIHRydWUpOgotICAgICAxMjogQlVJTERGSVhFRCAtLSBidWlsZCBzdGF0aWMgYmxvY2sgZGVjb2RpbmcgdGFibGVzIHdoZW4gbmVlZGVkCi0gICAgIDEzOiBEWU5BTUlDX0NSQ19UQUJMRSAtLSBidWlsZCBDUkMgY2FsY3VsYXRpb24gdGFibGVzIHdoZW4gbmVlZGVkCi0gICAgIDE0LDE1OiAwIChyZXNlcnZlZCkKLQotICAgIExpYnJhcnkgY29udGVudCAoaW5kaWNhdGVzIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSk6Ci0gICAgIDE2OiBOT19HWkNPTVBSRVNTIC0tIGd6KiBmdW5jdGlvbnMgY2Fubm90IGNvbXByZXNzICh0byBhdm9pZCBsaW5raW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmxhdGUgY29kZSB3aGVuIG5vdCBuZWVkZWQpCi0gICAgIDE3OiBOT19HWklQIC0tIGRlZmxhdGUgY2FuJ3Qgd3JpdGUgZ3ppcCBzdHJlYW1zLCBhbmQgaW5mbGF0ZSBjYW4ndCBkZXRlY3QKLSAgICAgICAgICAgICAgICAgICAgYW5kIGRlY29kZSBnemlwIHN0cmVhbXMgKHRvIGF2b2lkIGxpbmtpbmcgY3JjIGNvZGUpCi0gICAgIDE4LTE5OiAwIChyZXNlcnZlZCkKLQotICAgIE9wZXJhdGlvbiB2YXJpYXRpb25zIChjaGFuZ2VzIGluIGxpYnJhcnkgZnVuY3Rpb25hbGl0eSk6Ci0gICAgIDIwOiBQS1pJUF9CVUdfV09SS0FST1VORCAtLSBzbGlnaHRseSBtb3JlIHBlcm1pc3NpdmUgaW5mbGF0ZQotICAgICAyMTogRkFTVEVTVCAtLSBkZWZsYXRlIGFsZ29yaXRobSB3aXRoIG9ubHkgb25lLCBsb3dlc3QgY29tcHJlc3Npb24gbGV2ZWwKLSAgICAgMjIsMjM6IDAgKHJlc2VydmVkKQotCi0gICAgVGhlIHNwcmludGYgdmFyaWFudCB1c2VkIGJ5IGd6cHJpbnRmICh6ZXJvIGlzIGJlc3QpOgotICAgICAyNDogMCA9IHZzKiwgMSA9IHMqIC0tIDEgbWVhbnMgbGltaXRlZCB0byAyMCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZvcm1hdAotICAgICAyNTogMCA9ICpucHJpbnRmLCAxID0gKnByaW50ZiAtLSAxIG1lYW5zIGd6cHJpbnRmKCkgbm90IHNlY3VyZSEKLSAgICAgMjY6IDAgPSByZXR1cm5zIHZhbHVlLCAxID0gdm9pZCAtLSAxIG1lYW5zIGluZmVycmVkIHN0cmluZyBsZW5ndGggcmV0dXJuZWQKLQotICAgIFJlbWFpbmRlcjoKLSAgICAgMjctMzE6IDAgKHJlc2VydmVkKQotICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KLQotLyoKLSAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZQotICAgYmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9ucy4gVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZQotICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAotICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCi0gICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgY29tcHJlc3MgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbikpOwotLyoKLSAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKLSAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKLSAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmFsdWUgcmV0dXJuZWQKLSAgIGJ5IGNvbXByZXNzQm91bmQoc291cmNlTGVuKS4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKLSAgIGNvbXByZXNzZWQgYnVmZmVyLgotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQotICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgotICAgICBjb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzMiBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpKTsKLS8qCi0gICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKLSAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBkZWZsYXRlSW5pdC4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQotICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQotICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieQotICAgY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQotICAgY29tcHJlc3NlZCBidWZmZXIuCi0KLSAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAotICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgotKi8KLQotWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgT0YoKHVMb25nIHNvdXJjZUxlbikpOwotLyoKLSAgICAgY29tcHJlc3NCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgotICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBvbiBzb3VyY2VMZW4gYnl0ZXMuICBJdCB3b3VsZCBiZSB1c2VkIGJlZm9yZQotICAgYSBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgdW5jb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKLS8qCi0gICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKLSAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKLSAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKLSAgIGVudGlyZSB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUKLSAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgotICAgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikKLSAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCi0gICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCi0KLSAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkIG9yIGluY29tcGxldGUuCi0qLwotCi0KLXR5cGVkZWYgdm9pZHAgZ3pGaWxlOwotCi1aRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiAgT0YoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpKTsKLS8qCi0gICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIFRoZSBtb2RlIHBhcmFtZXRlcgotICAgaXMgYXMgaW4gZm9wZW4gKCJyYiIgb3IgIndiIikgYnV0IGNhbiBhbHNvIGluY2x1ZGUgYSBjb21wcmVzc2lvbiBsZXZlbAotICAgKCJ3YjkiKSBvciBhIHN0cmF0ZWd5OiAnZicgZm9yIGZpbHRlcmVkIGRhdGEgYXMgaW4gIndiNmYiLCAnaCcgZm9yCi0gICBIdWZmbWFuIG9ubHkgY29tcHJlc3Npb24gYXMgaW4gIndiMWgiLCBvciAnUicgZm9yIHJ1bi1sZW5ndGggZW5jb2RpbmcKLSAgIGFzIGluICJ3YjFSIi4gKFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uCi0gICBhYm91dCB0aGUgc3RyYXRlZ3kgcGFyYW1ldGVyLikKLQotICAgICBnem9wZW4gY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0OyBpbiB0aGlzCi0gICBjYXNlIGd6cmVhZCB3aWxsIGRpcmVjdGx5IHJlYWQgZnJvbSB0aGUgZmlsZSB3aXRob3V0IGRlY29tcHJlc3Npb24uCi0KLSAgICAgZ3pvcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIG9yIGlmIHRoZXJlIHdhcwotICAgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlOyBlcnJubwotICAgY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyAoaWYgZXJybm8gaXMgemVybywgdGhlCi0gICB6bGliIGVycm9yIGlzIFpfTUVNX0VSUk9SKS4gICovCi0KLVpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pkb3BlbiAgT0YoKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSkpOwotLyoKLSAgICAgZ3pkb3BlbigpIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZQotICAgZGVzY3JpcHRvcnMgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yCi0gICBmaWxlbm8gKGluIHRoZSBmaWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLgotICAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIGd6b3Blbi4KLSAgICAgVGhlIG5leHQgY2FsbCBvZiBnemNsb3NlIG9uIHRoZSByZXR1cm5lZCBnekZpbGUgd2lsbCBhbHNvIGNsb3NlIHRoZQotICAgZmlsZSBkZXNjcmlwdG9yIGZkLCBqdXN0IGxpa2UgZmNsb3NlKGZkb3BlbihmZCksIG1vZGUpIGNsb3NlcyB0aGUgZmlsZQotICAgZGVzY3JpcHRvciBmZC4gSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZ3pkb3BlbihkdXAoZmQpLCBtb2RlKS4KLSAgICAgZ3pkb3BlbiByZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUKLSAgIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGd6c2V0cGFyYW1zIE9GKChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpKTsKLS8qCi0gICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuIFNlZSB0aGUgZGVzY3JpcHRpb24KLSAgIG9mIGRlZmxhdGVJbml0MiBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlc2UgcGFyYW1ldGVycy4KLSAgICAgZ3pzZXRwYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBmaWxlIHdhcyBub3QKLSAgIG9wZW5lZCBmb3Igd3JpdGluZy4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pyZWFkICBPRigoZ3pGaWxlIGZpbGUsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKSk7Ci0vKgotICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCBnenJlYWQgY29waWVzIHRoZSBnaXZlbiBudW1iZXIKLSAgIG9mIGJ5dGVzIGludG8gdGhlIGJ1ZmZlci4KLSAgICAgZ3pyZWFkIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgcmVhZCAoMCBmb3IKLSAgIGVuZCBvZiBmaWxlLCAtMSBmb3IgZXJyb3IpLiAqLwotCi1aRVhURVJOIGludCBaRVhQT1JUICAgIGd6d3JpdGUgT0YoKGd6RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkcGMgYnVmLCB1bnNpZ25lZCBsZW4pKTsKLS8qCi0gICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICBnendyaXRlIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbgotICAgKDAgaW4gY2FzZSBvZiBlcnJvcikuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUVkEgICBnenByaW50ZiBPRigoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSk7Ci0vKgotICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCi0gICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiBnenByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLiAgVGhlIG51bWJlciBvZgotICAgdW5jb21wcmVzc2VkIGJ5dGVzIHdyaXR0ZW4gaXMgbGltaXRlZCB0byA0MDk1LiBUaGUgY2FsbGVyIHNob3VsZCBhc3N1cmUgdGhhdAotICAgdGhpcyBsaW1pdCBpcyBub3QgZXhjZWVkZWQuIElmIGl0IGlzIGV4Y2VlZGVkLCB0aGVuIGd6cHJpbnRmKCkgd2lsbCByZXR1cm4KLSAgIHJldHVybiBhbiBlcnJvciAoMCkgd2l0aCBub3RoaW5nIHdyaXR0ZW4uIEluIHRoaXMgY2FzZSwgdGhlcmUgbWF5IGFsc28gYmUgYQotICAgYnVmZmVyIG92ZXJmbG93IHdpdGggdW5wcmVkaWN0YWJsZSBjb25zZXF1ZW5jZXMsIHdoaWNoIGlzIHBvc3NpYmxlIG9ubHkgaWYKLSAgIHpsaWIgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGluc2VjdXJlIGZ1bmN0aW9ucyBzcHJpbnRmKCkgb3IgdnNwcmludGYoKQotICAgYmVjYXVzZSB0aGUgc2VjdXJlIHNucHJpbnRmKCkgb3IgdnNucHJpbnRmKCkgZnVuY3Rpb25zIHdlcmUgbm90IGF2YWlsYWJsZS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRzIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcykpOwotLyoKLSAgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29tcHJlc3NlZCBmaWxlLCBleGNsdWRpbmcKLSAgIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3Rlci4KLSAgICAgIGd6cHV0cyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgotKi8KLQotWkVYVEVSTiBjaGFyICogWkVYUE9SVCBnemdldHMgT0YoKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pKTsKLS8qCi0gICAgICBSZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgdW50aWwgbGVuLTEgY2hhcmFjdGVycyBhcmUgcmVhZCwgb3IKLSAgIGEgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbiBlbmQtb2YtZmlsZQotICAgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlIHN0cmluZyBpcyB0aGVuIHRlcm1pbmF0ZWQgd2l0aCBhIG51bGwKLSAgIGNoYXJhY3Rlci4KLSAgICAgIGd6Z2V0cyByZXR1cm5zIGJ1Ziwgb3IgWl9OVUxMIGluIGNhc2Ugb2YgZXJyb3IuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUICAgIGd6cHV0YyBPRigoZ3pGaWxlIGZpbGUsIGludCBjKSk7Ci0vKgotICAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICBnenB1dGMgcmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pnZXRjIE9GKChnekZpbGUgZmlsZSkpOwotLyoKLSAgICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gZ3pnZXRjIHJldHVybnMgdGhpcyBieXRlCi0gICBvciAtMSBpbiBjYXNlIG9mIGVuZCBvZiBmaWxlIG9yIGVycm9yLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenVuZ2V0YyBPRigoaW50IGMsIGd6RmlsZSBmaWxlKSk7Ci0vKgotICAgICAgUHVzaCBvbmUgY2hhcmFjdGVyIGJhY2sgb250byB0aGUgc3RyZWFtIHRvIGJlIHJlYWQgYWdhaW4gbGF0ZXIuCi0gICBPbmx5IG9uZSBjaGFyYWN0ZXIgb2YgcHVzaC1iYWNrIGlzIGFsbG93ZWQuICBnenVuZ2V0YygpIHJldHVybnMgdGhlCi0gICBjaGFyYWN0ZXIgcHVzaGVkLCBvciAtMSBvbiBmYWlsdXJlLiAgZ3p1bmdldGMoKSB3aWxsIGZhaWwgaWYgYQotICAgY2hhcmFjdGVyIGhhcyBiZWVuIHB1c2hlZCBidXQgbm90IHJlYWQgeWV0LCBvciBpZiBjIGlzIC0xLiBUaGUgcHVzaGVkCi0gICBjaGFyYWN0ZXIgd2lsbCBiZSBkaXNjYXJkZWQgaWYgdGhlIHN0cmVhbSBpcyByZXBvc2l0aW9uZWQgd2l0aCBnenNlZWsoKQotICAgb3IgZ3pyZXdpbmQoKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pmbHVzaCBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOwotLyoKLSAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCi0gICBmbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCi0gICBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBnemVycm9yIGJlbG93KS4gZ3pmbHVzaCByZXR1cm5zIFpfT0sgaWYKLSAgIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaXMgWl9GSU5JU0ggYW5kIGFsbCBvdXRwdXQgY291bGQgYmUgZmx1c2hlZC4KLSAgICAgZ3pmbHVzaCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBzdHJpY3RseSBuZWNlc3NhcnkgYmVjYXVzZSBpdCBjYW4KLSAgIGRlZ3JhZGUgY29tcHJlc3Npb24uCi0qLwotCi1aRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCAgICBnenNlZWsgT0YoKGd6RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X29mZl90IG9mZnNldCwgaW50IHdoZW5jZSkpOwotLyoKLSAgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKLSAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiBUaGUgd2hlbmNlIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGluIGxzZWVrKDIpOwotICAgdGhlIHZhbHVlIFNFRUtfRU5EIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZCBidXQgY2FuIGJlCi0gICBleHRyZW1lbHkgc2xvdy4gSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nLCBvbmx5IGZvcndhcmQgc2Vla3MgYXJlCi0gICBzdXBwb3J0ZWQ7IGd6c2VlayB0aGVuIGNvbXByZXNzZXMgYSBzZXF1ZW5jZSBvZiB6ZXJvZXMgdXAgdG8gdGhlIG5ldwotICAgc3RhcnRpbmcgcG9zaXRpb24uCi0KLSAgICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KLSAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGluCi0gICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgotICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenJld2luZCBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCi0KLSAgIGd6cmV3aW5kKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gKGludClnenNlZWsoZmlsZSwgMEwsIFNFRUtfU0VUKQotKi8KLQotWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3p0ZWxsIE9GKChnekZpbGUgZmlsZSkpOwotLyoKLSAgICAgUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCi0gICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCi0KLSAgIGd6dGVsbChmaWxlKSBpcyBlcXVpdmFsZW50IHRvIGd6c2VlayhmaWxlLCAwTCwgU0VFS19DVVIpCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGd6ZW9mIE9GKChnekZpbGUgZmlsZSkpOwotLyoKLSAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KLSAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGd6ZGlyZWN0IE9GKChnekZpbGUgZmlsZSkpOwotLyoKLSAgICAgUmV0dXJucyAxIGlmIGZpbGUgaXMgYmVpbmcgcmVhZCBkaXJlY3RseSB3aXRob3V0IGRlY29tcHJlc3Npb24sIG90aGVyd2lzZQotICAgemVyby4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pjbG9zZSBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKLSAgIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgotICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gZ3plcnJvciBiZWxvdykuCi0qLwotCi1aRVhURVJOIGNvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IgT0YoKGd6RmlsZSBmaWxlLCBpbnQgKmVycm51bSkpOwotLyoKLSAgICAgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGxhc3QgZXJyb3Igd2hpY2ggb2NjdXJyZWQgb24gdGhlCi0gICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCi0gICBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKLSAgIGVycm51bSBpcyBzZXQgdG8gWl9FUlJOTyBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdWx0IGVycm5vCi0gICB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCi0qLwotCi1aRVhURVJOIHZvaWQgWkVYUE9SVCBnemNsZWFyZXJyIE9GKChnekZpbGUgZmlsZSkpOwotLyoKLSAgICAgQ2xlYXJzIHRoZSBlcnJvciBhbmQgZW5kLW9mLWZpbGUgZmxhZ3MgZm9yIGZpbGUuIFRoaXMgaXMgYW5hbG9nb3VzIHRvIHRoZQotICAgY2xlYXJlcnIoKSBmdW5jdGlvbiBpbiBzdGRpby4gVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnRpbnVpbmcgdG8gcmVhZCBhIGd6aXAKLSAgIGZpbGUgdGhhdCBpcyBiZWluZyB3cml0dGVuIGNvbmN1cnJlbnRseS4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLwotCi0vKgotICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKLSAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKLSAgIGNvbXByZXNzaW9uIGxpYnJhcnkuCi0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMiBPRigodUxvbmcgYWRsZXIsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7Ci0vKgotICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCi0gICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAgIHRoZSByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCi0gICBBbiBBZGxlci0zMiBjaGVja3N1bSBpcyBhbG1vc3QgYXMgcmVsaWFibGUgYXMgYSBDUkMzMiBidXQgY2FuIGJlIGNvbXB1dGVkCi0gICBtdWNoIGZhc3Rlci4gVXNhZ2UgZXhhbXBsZToKLQotICAgICB1TG9uZyBhZGxlciA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7Ci0KLSAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKLSAgICAgICBhZGxlciA9IGFkbGVyMzIoYWRsZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICAgfQotICAgICBpZiAoYWRsZXIgIT0gb3JpZ2luYWxfYWRsZXIpIGVycm9yKCk7Ci0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lIE9GKCh1TG9uZyBhZGxlcjEsIHVMb25nIGFkbGVyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3QgbGVuMikpOwotLyoKLSAgICAgQ29tYmluZSB0d28gQWRsZXItMzIgY2hlY2tzdW1zIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsIHNlcTEKLSAgIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBBZGxlci0zMiBjaGVja3N1bXMgd2VyZSBjYWxjdWxhdGVkIGZvcgotICAgZWFjaCwgYWRsZXIxIGFuZCBhZGxlcjIuICBhZGxlcjMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZgotICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4KLSovCi0KLVpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMiAgIE9GKCh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7Ci0vKgotICAgICBVcGRhdGUgYSBydW5uaW5nIENSQy0zMiB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZCByZXR1cm4gdGhlCi0gICB1cGRhdGVkIENSQy0zMi4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWlyZWQgaW5pdGlhbAotICAgdmFsdWUgZm9yIHRoZSBmb3IgdGhlIGNyYy4gUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzCi0gICBwZXJmb3JtZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgVXNhZ2UgZXhhbXBsZToKLQotICAgICB1TG9uZyBjcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLQotICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgewotICAgICAgIGNyYyA9IGNyYzMyKGNyYywgYnVmZmVyLCBsZW5ndGgpOwotICAgICB9Ci0gICAgIGlmIChjcmMgIT0gb3JpZ2luYWxfY3JjKSBlcnJvcigpOwotKi8KLQotWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nIGNyYzEsIHVMb25nIGNyYzIsIHpfb2ZmX3QgbGVuMikpOwotCi0vKgotICAgICBDb21iaW5lIHR3byBDUkMtMzIgY2hlY2sgdmFsdWVzIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsCi0gICBzZXExIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBDUkMtMzIgY2hlY2sgdmFsdWVzIHdlcmUKLSAgIGNhbGN1bGF0ZWQgZm9yIGVhY2gsIGNyYzEgYW5kIGNyYzIuICBjcmMzMl9jb21iaW5lKCkgcmV0dXJucyB0aGUgQ1JDLTMyCi0gICBjaGVjayB2YWx1ZSBvZiBzZXExIGFuZCBzZXEyIGNvbmNhdGVuYXRlZCwgcmVxdWlyaW5nIG9ubHkgY3JjMSwgY3JjMiwgYW5kCi0gICBsZW4yLgotKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB2YXJpb3VzIGhhY2tzLCBkb24ndCBsb29rIDopICovCi0KLS8qIGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBhcmUgbWFjcm9zIHRvIGFsbG93IGNoZWNraW5nIHRoZSB6bGliIHZlcnNpb24KLSAqIGFuZCB0aGUgY29tcGlsZXIncyB2aWV3IG9mIHpfc3RyZWFtOgotICovCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyXyBPRigoel9zdHJlYW1wIHN0cm0sIGludCAgbGV2ZWwsIGludCAgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywgaW50IG1lbUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksIGNvbnN0IGNoYXIgKnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICB3aW5kb3dCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sIGludCB3aW5kb3dCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3NpemUpKTsKLSNkZWZpbmUgZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIFwKLSAgICAgICAgZGVmbGF0ZUluaXRfKChzdHJtKSwgKGxldmVsKSwgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQotI2RlZmluZSBpbmZsYXRlSW5pdChzdHJtKSBcCi0gICAgICAgIGluZmxhdGVJbml0Xygoc3RybSksICAgICAgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgXAotICAgICAgICBkZWZsYXRlSW5pdDJfKChzdHJtKSwobGV2ZWwpLChtZXRob2QpLCh3aW5kb3dCaXRzKSwobWVtTGV2ZWwpLFwKLSAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kpLCAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQotI2RlZmluZSBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykgXAotICAgICAgICBpbmZsYXRlSW5pdDJfKChzdHJtKSwgKHdpbmRvd0JpdHMpLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCi0jZGVmaW5lIGluZmxhdGVCYWNrSW5pdChzdHJtLCB3aW5kb3dCaXRzLCB3aW5kb3cpIFwKLSAgICAgICAgaW5mbGF0ZUJhY2tJbml0Xygoc3RybSksICh3aW5kb3dCaXRzKSwgKHdpbmRvdyksIFwKLSAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQotCi0KLSNpZiAhZGVmaW5lZChaVVRJTF9IKSAmJiAhZGVmaW5lZChOT19EVU1NWV9ERUNMKQotICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7aW50IGR1bW15O307IC8qIGhhY2sgZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLwotI2VuZGlmCi0KLVpFWFRFUk4gY29uc3QgY2hhciAgICogWkVYUE9SVCB6RXJyb3IgICAgICAgICAgIE9GKChpbnQpKTsKLVpFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBpbmZsYXRlU3luY1BvaW50IE9GKCh6X3N0cmVhbXAgeikpOwotWkVYVEVSTiBjb25zdCB1TG9uZ2YgKiBaRVhQT1JUIGdldF9jcmNfdGFibGUgICAgT0YoKHZvaWQpKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIFpMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvbGlicy96bGliL3psaWIuaWNvIGIvbGlicy96bGliL3psaWIuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjVlNGM5Li4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi96bGliLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvemxpYi96dXRpbC5jIGIvbGlicy96bGliL3p1dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NWY1OTQuLjAwMDAwMDAKLS0tIGEvbGlicy96bGliL3p1dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyogenV0aWwuYyAtLSB0YXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0KLSNpZm5kZWYgTk9fRFVNTVlfREVDTAotc3RydWN0IGludGVybmFsX3N0YXRlICAgICAge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCi0jZW5kaWYKLQotY29uc3QgY2hhciAqIGNvbnN0IHpfZXJybXNnWzEwXSA9IHsKLSJuZWVkIGRpY3Rpb25hcnkiLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi8KLSJzdHJlYW0gZW5kIiwgICAgICAgICAgLyogWl9TVFJFQU1fRU5EICAgICAgMSAgKi8KLSIiLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi8KLSJmaWxlIGVycm9yIiwgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi8KLSJzdHJlYW0gZXJyb3IiLCAgICAgICAgLyogWl9TVFJFQU1fRVJST1IgICgtMikgKi8KLSJkYXRhIGVycm9yIiwgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi8KLSJpbnN1ZmZpY2llbnQgbWVtb3J5IiwgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi8KLSJidWZmZXIgZXJyb3IiLCAgICAgICAgLyogWl9CVUZfRVJST1IgICAgICgtNSkgKi8KLSJpbmNvbXBhdGlibGUgdmVyc2lvbiIsLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi8KLSIifTsKLQotCi1jb25zdCBjaGFyICogWkVYUE9SVCB6bGliVmVyc2lvbigpCi17Ci0gICAgcmV0dXJuIFpMSUJfVkVSU0lPTjsKLX0KLQotdUxvbmcgWkVYUE9SVCB6bGliQ29tcGlsZUZsYWdzKCkKLXsKLSAgICB1TG9uZyBmbGFnczsKLQotICAgIGZsYWdzID0gMDsKLSAgICBzd2l0Y2ggKHNpemVvZih1SW50KSkgewotICAgIGNhc2UgMjogICAgIGJyZWFrOwotICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDE7ICAgICBicmVhazsKLSAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyOyAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMzsKLSAgICB9Ci0gICAgc3dpdGNoIChzaXplb2YodUxvbmcpKSB7Ci0gICAgY2FzZSAyOiAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMSA8PCAyOyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMiA8PCAyOyAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMyA8PCAyOwotICAgIH0KLSAgICBzd2l0Y2ggKHNpemVvZih2b2lkcGYpKSB7Ci0gICAgY2FzZSAyOiAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMSA8PCA0OyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMiA8PCA0OyAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMyA8PCA0OwotICAgIH0KLSAgICBzd2l0Y2ggKHNpemVvZih6X29mZl90KSkgewotICAgIGNhc2UgMjogICAgIGJyZWFrOwotICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgNjsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgNjsgICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgNjsKLSAgICB9Ci0jaWZkZWYgREVCVUcKLSAgICBmbGFncyArPSAxIDw8IDg7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKEFTTVYpIHx8IGRlZmluZWQoQVNNSU5GKQotICAgIGZsYWdzICs9IDEgPDwgOTsKLSNlbmRpZgotI2lmZGVmIFpMSUJfV0lOQVBJCi0gICAgZmxhZ3MgKz0gMSA8PCAxMDsKLSNlbmRpZgotI2lmZGVmIEJVSUxERklYRUQKLSAgICBmbGFncyArPSAxIDw8IDEyOwotI2VuZGlmCi0jaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKLSAgICBmbGFncyArPSAxIDw8IDEzOwotI2VuZGlmCi0jaWZkZWYgTk9fR1pDT01QUkVTUwotICAgIGZsYWdzICs9IDFMIDw8IDE2OwotI2VuZGlmCi0jaWZkZWYgTk9fR1pJUAotICAgIGZsYWdzICs9IDFMIDw8IDE3OwotI2VuZGlmCi0jaWZkZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKLSAgICBmbGFncyArPSAxTCA8PCAyMDsKLSNlbmRpZgotI2lmZGVmIEZBU1RFU1QKLSAgICBmbGFncyArPSAxTCA8PCAyMTsKLSNlbmRpZgotI2lmZGVmIFNUREMKLSMgIGlmZGVmIE5PX3ZzbnByaW50ZgotICAgICAgICBmbGFncyArPSAxTCA8PCAyNTsKLSMgICAgaWZkZWYgSEFTX3ZzcHJpbnRmX3ZvaWQKLSAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjY7Ci0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGlmZGVmIEhBU192c25wcmludGZfdm9pZAotICAgICAgICBmbGFncyArPSAxTCA8PCAyNjsKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZWxzZQotICAgICAgICBmbGFncyArPSAxTCA8PCAyNDsKLSMgIGlmZGVmIE5PX3NucHJpbnRmCi0gICAgICAgIGZsYWdzICs9IDFMIDw8IDI1OwotIyAgICBpZmRlZiBIQVNfc3ByaW50Zl92b2lkCi0gICAgICAgIGZsYWdzICs9IDFMIDw8IDI2OwotIyAgICBlbmRpZgotIyAgZWxzZQotIyAgICBpZmRlZiBIQVNfc25wcmludGZfdm9pZAotICAgICAgICBmbGFncyArPSAxTCA8PCAyNjsKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLSAgICByZXR1cm4gZmxhZ3M7Ci19Ci0KLSNpZmRlZiBERUJVRwotCi0jICBpZm5kZWYgdmVyYm9zZQotIyAgICBkZWZpbmUgdmVyYm9zZSAwCi0jICBlbmRpZgotaW50IHpfdmVyYm9zZSA9IHZlcmJvc2U7Ci0KLXZvaWQgel9lcnJvciAobSkKLSAgICBjaGFyICptOwotewotICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG0pOwotICAgIGV4aXQoMSk7Ci19Ci0jZW5kaWYKLQotLyogZXhwb3J0ZWQgdG8gYWxsb3cgY29udmVyc2lvbiBvZiBlcnJvciBjb2RlIHRvIHN0cmluZyBmb3IgY29tcHJlc3MoKSBhbmQKLSAqIHVuY29tcHJlc3MoKQotICovCi1jb25zdCBjaGFyICogWkVYUE9SVCB6RXJyb3IoZXJyKQotICAgIGludCBlcnI7Ci17Ci0gICAgcmV0dXJuIEVSUl9NU0coZXJyKTsKLX0KLQotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKLSAgICAvKiBUaGUgTWljcm9zb2Z0IEMgUnVuLVRpbWUgTGlicmFyeSBmb3IgV2luZG93cyBDRSBkb2Vzbid0IGhhdmUKLSAgICAgKiBlcnJuby4gIFdlIGRlZmluZSBpdCBhcyBhIGdsb2JhbCB2YXJpYWJsZSB0byBzaW1wbGlmeSBwb3J0aW5nLgotICAgICAqIEl0cyB2YWx1ZSBpcyBhbHdheXMgMCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLgotICAgICAqLwotICAgIGludCBlcnJubyA9IDA7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX01FTUNQWQotCi12b2lkIHptZW1jcHkoZGVzdCwgc291cmNlLCBsZW4pCi0gICAgQnl0ZWYqIGRlc3Q7Ci0gICAgY29uc3QgQnl0ZWYqIHNvdXJjZTsKLSAgICB1SW50ICBsZW47Ci17Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm47Ci0gICAgZG8gewotICAgICAgICAqZGVzdCsrID0gKnNvdXJjZSsrOyAvKiA/Pz8gdG8gYmUgdW5yb2xsZWQgKi8KLSAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKLX0KLQotaW50IHptZW1jbXAoczEsIHMyLCBsZW4pCi0gICAgY29uc3QgQnl0ZWYqIHMxOwotICAgIGNvbnN0IEJ5dGVmKiBzMjsKLSAgICB1SW50ICBsZW47Ci17Ci0gICAgdUludCBqOwotCi0gICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0gICAgICAgIGlmIChzMVtqXSAhPSBzMltqXSkgcmV0dXJuIDIqKHMxW2pdID4gczJbal0pLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIHptZW16ZXJvKGRlc3QsIGxlbikKLSAgICBCeXRlZiogZGVzdDsKLSAgICB1SW50ICBsZW47Ci17Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm47Ci0gICAgZG8gewotICAgICAgICAqZGVzdCsrID0gMDsgIC8qID8/PyB0byBiZSB1bnJvbGxlZCAqLwotICAgIH0gd2hpbGUgKC0tbGVuICE9IDApOwotfQotI2VuZGlmCi0KLQotI2lmZGVmIFNZUzE2QklUCi0KLSNpZmRlZiBfX1RVUkJPQ19fCi0vKiBUdXJibyBDIGluIDE2LWJpdCBtb2RlICovCi0KLSMgIGRlZmluZSBNWV9aQ0FMTE9DCi0KLS8qIFR1cmJvIEMgbWFsbG9jKCkgZG9lcyBub3QgYWxsb3cgZHluYW1pYyBhbGxvY2F0aW9uIG9mIDY0SyBieXRlcwotICogYW5kIGZhcm1hbGxvYyg2NEspIHJldHVybnMgYSBwb2ludGVyIHdpdGggYW4gb2Zmc2V0IG9mIDgsIHNvIHdlCi0gKiBtdXN0IGZpeCB0aGUgcG9pbnRlci4gV2FybmluZzogdGhlIHBvaW50ZXIgbXVzdCBiZSBwdXQgYmFjayB0byBpdHMKLSAqIG9yaWdpbmFsIGZvcm0gaW4gb3JkZXIgdG8gZnJlZSBpdCwgdXNlIHpjZnJlZSgpLgotICovCi0KLSNkZWZpbmUgTUFYX1BUUiAxMAotLyogMTAqNjRLID0gNjQwSyAqLwotCi1sb2NhbCBpbnQgbmV4dF9wdHIgPSAwOwotCi10eXBlZGVmIHN0cnVjdCBwdHJfdGFibGVfcyB7Ci0gICAgdm9pZHBmIG9yZ19wdHI7Ci0gICAgdm9pZHBmIG5ld19wdHI7Ci19IHB0cl90YWJsZTsKLQotbG9jYWwgcHRyX3RhYmxlIHRhYmxlW01BWF9QVFJdOwotLyogVGhpcyB0YWJsZSBpcyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBvcmlnaW5hbCBmb3JtIG9mIHBvaW50ZXJzCi0gKiB0byBsYXJnZSBidWZmZXJzICg2NEspLiBTdWNoIHBvaW50ZXJzIGFyZSBub3JtYWxpemVkIHdpdGggYSB6ZXJvIG9mZnNldC4KLSAqIFNpbmNlIE1TRE9TIGlzIG5vdCBhIHByZWVtcHRpdmUgbXVsdGl0YXNraW5nIE9TLCB0aGlzIHRhYmxlIGlzIG5vdAotICogcHJvdGVjdGVkIGZyb20gY29uY3VycmVudCBhY2Nlc3MuIFRoaXMgaGFjayBkb2Vzbid0IHdvcmsgYW55d2F5IG9uCi0gKiBhIHByb3RlY3RlZCBzeXN0ZW0gbGlrZSBPUy8yLiBVc2UgTWljcm9zb2Z0IEMgaW5zdGVhZC4KLSAqLwotCi12b2lkcGYgemNhbGxvYyAodm9pZHBmIG9wYXF1ZSwgdW5zaWduZWQgaXRlbXMsIHVuc2lnbmVkIHNpemUpCi17Ci0gICAgdm9pZHBmIGJ1ZiA9IG9wYXF1ZTsgLyoganVzdCB0byBtYWtlIHNvbWUgY29tcGlsZXJzIGhhcHB5ICovCi0gICAgdWxnIGJzaXplID0gKHVsZylpdGVtcypzaXplOwotCi0gICAgLyogSWYgd2UgYWxsb2NhdGUgbGVzcyB0aGFuIDY1NTIwIGJ5dGVzLCB3ZSBhc3N1bWUgdGhhdCBmYXJtYWxsb2MKLSAgICAgKiB3aWxsIHJldHVybiBhIHVzYWJsZSBwb2ludGVyIHdoaWNoIGRvZXNuJ3QgaGF2ZSB0byBiZSBub3JtYWxpemVkLgotICAgICAqLwotICAgIGlmIChic2l6ZSA8IDY1NTIwTCkgewotICAgICAgICBidWYgPSBmYXJtYWxsb2MoYnNpemUpOwotICAgICAgICBpZiAoKih1c2gqKSZidWYgIT0gMCkgcmV0dXJuIGJ1ZjsKLSAgICB9IGVsc2UgewotICAgICAgICBidWYgPSBmYXJtYWxsb2MoYnNpemUgKyAxNkwpOwotICAgIH0KLSAgICBpZiAoYnVmID09IE5VTEwgfHwgbmV4dF9wdHIgPj0gTUFYX1BUUikgcmV0dXJuIE5VTEw7Ci0gICAgdGFibGVbbmV4dF9wdHJdLm9yZ19wdHIgPSBidWY7Ci0KLSAgICAvKiBOb3JtYWxpemUgdGhlIHBvaW50ZXIgdG8gc2VnOjAgKi8KLSAgICAqKCh1c2gqKSZidWYrMSkgKz0gKCh1c2gpKCh1Y2gqKWJ1Zi0wKSArIDE1KSA+PiA0OwotICAgICoodXNoKikmYnVmID0gMDsKLSAgICB0YWJsZVtuZXh0X3B0cisrXS5uZXdfcHRyID0gYnVmOwotICAgIHJldHVybiBidWY7Ci19Ci0KLXZvaWQgIHpjZnJlZSAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikKLXsKLSAgICBpbnQgbjsKLSAgICBpZiAoKih1c2gqKSZwdHIgIT0gMCkgeyAvKiBvYmplY3QgPCA2NEsgKi8KLSAgICAgICAgZmFyZnJlZShwdHIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8qIEZpbmQgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi8KLSAgICBmb3IgKG4gPSAwOyBuIDwgbmV4dF9wdHI7IG4rKykgewotICAgICAgICBpZiAocHRyICE9IHRhYmxlW25dLm5ld19wdHIpIGNvbnRpbnVlOwotCi0gICAgICAgIGZhcmZyZWUodGFibGVbbl0ub3JnX3B0cik7Ci0gICAgICAgIHdoaWxlICgrK24gPCBuZXh0X3B0cikgewotICAgICAgICAgICAgdGFibGVbbi0xXSA9IHRhYmxlW25dOwotICAgICAgICB9Ci0gICAgICAgIG5leHRfcHRyLS07Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcHRyID0gb3BhcXVlOyAvKiBqdXN0IHRvIG1ha2Ugc29tZSBjb21waWxlcnMgaGFwcHkgKi8KLSAgICBBc3NlcnQoMCwgInpjZnJlZTogcHRyIG5vdCBmb3VuZCIpOwotfQotCi0jZW5kaWYgLyogX19UVVJCT0NfXyAqLwotCi0KLSNpZmRlZiBNX0k4NgotLyogTWljcm9zb2Z0IEMgaW4gMTYtYml0IG1vZGUgKi8KLQotIyAgZGVmaW5lIE1ZX1pDQUxMT0MKLQotI2lmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSIDw9IDYwMCkpCi0jICBkZWZpbmUgX2hhbGxvYyAgaGFsbG9jCi0jICBkZWZpbmUgX2hmcmVlICAgaGZyZWUKLSNlbmRpZgotCi12b2lkcGYgemNhbGxvYyAodm9pZHBmIG9wYXF1ZSwgdW5zaWduZWQgaXRlbXMsIHVuc2lnbmVkIHNpemUpCi17Ci0gICAgaWYgKG9wYXF1ZSkgb3BhcXVlID0gMDsgLyogdG8gbWFrZSBjb21waWxlciBoYXBweSAqLwotICAgIHJldHVybiBfaGFsbG9jKChsb25nKWl0ZW1zLCBzaXplKTsKLX0KLQotdm9pZCAgemNmcmVlICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKQotewotICAgIGlmIChvcGFxdWUpIG9wYXF1ZSA9IDA7IC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICBfaGZyZWUocHRyKTsKLX0KLQotI2VuZGlmIC8qIE1fSTg2ICovCi0KLSNlbmRpZiAvKiBTWVMxNkJJVCAqLwotCi0KLSNpZm5kZWYgTVlfWkNBTExPQyAvKiBBbnkgc3lzdGVtIHdpdGhvdXQgYSBzcGVjaWFsIGFsbG9jIGZ1bmN0aW9uICovCi0KLSNpZm5kZWYgU1REQwotZXh0ZXJuIHZvaWRwICBtYWxsb2MgT0YoKHVJbnQgc2l6ZSkpOwotZXh0ZXJuIHZvaWRwICBjYWxsb2MgT0YoKHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgICBmcmVlICAgT0YoKHZvaWRwZiBwdHIpKTsKLSNlbmRpZgotCi12b2lkcGYgemNhbGxvYyAob3BhcXVlLCBpdGVtcywgc2l6ZSkKLSAgICB2b2lkcGYgb3BhcXVlOwotICAgIHVuc2lnbmVkIGl0ZW1zOwotICAgIHVuc2lnbmVkIHNpemU7Ci17Ci0gICAgaWYgKG9wYXF1ZSkgaXRlbXMgKz0gc2l6ZSAtIHNpemU7IC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICByZXR1cm4gc2l6ZW9mKHVJbnQpID4gMiA/ICh2b2lkcGYpbWFsbG9jKGl0ZW1zICogc2l6ZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWRwZiljYWxsb2MoaXRlbXMsIHNpemUpOwotfQotCi12b2lkICB6Y2ZyZWUgKG9wYXF1ZSwgcHRyKQotICAgIHZvaWRwZiBvcGFxdWU7Ci0gICAgdm9pZHBmIHB0cjsKLXsKLSAgICBmcmVlKHB0cik7Ci0gICAgaWYgKG9wYXF1ZSkgcmV0dXJuOyAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi19Ci0KLSNlbmRpZiAvKiBNWV9aQ0FMTE9DICovCmRpZmYgLS1naXQgYS9saWJzL3psaWIvenV0aWwuaCBiL2xpYnMvemxpYi96dXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Q1ZWZmLi4wMDAwMDAwCi0tLSBhL2xpYnMvemxpYi96dXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qIHp1dGlsLmggLS0gaW50ZXJuYWwgaW50ZXJmYWNlIGFuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2lmbmRlZiBaVVRJTF9ICi0jZGVmaW5lIFpVVElMX0gKLQotI2RlZmluZSBaTElCX0lOVEVSTkFMCi0jaW5jbHVkZSAiemxpYi5oIgotCi0jaWZkZWYgU1REQwotIyAgaWZuZGVmIF9XSU4zMl9XQ0UKLSMgICAgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jICBlbmRpZgotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIE5PX0VSUk5PX0gKLSMgICBpZmRlZiBfV0lOMzJfV0NFCi0gICAgICAvKiBUaGUgTWljcm9zb2Z0IEMgUnVuLVRpbWUgTGlicmFyeSBmb3IgV2luZG93cyBDRSBkb2Vzbid0IGhhdmUKLSAgICAgICAqIGVycm5vLiAgV2UgZGVmaW5lIGl0IGFzIGEgZ2xvYmFsIHZhcmlhYmxlIHRvIHNpbXBsaWZ5IHBvcnRpbmcuCi0gICAgICAgKiBJdHMgdmFsdWUgaXMgYWx3YXlzIDAgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4gIFdlIHJlbmFtZSBpdCB0bwotICAgICAgICogYXZvaWQgY29uZmxpY3Qgd2l0aCBvdGhlciBsaWJyYXJpZXMgdGhhdCB1c2UgdGhlIHNhbWUgd29ya2Fyb3VuZC4KLSAgICAgICAqLwotIyAgICAgZGVmaW5lIGVycm5vIHpfZXJybm8KLSMgICBlbmRpZgotICAgIGV4dGVybiBpbnQgZXJybm87Ci0jZWxzZQotIyAgaWZuZGVmIF9XSU4zMl9XQ0UKLSMgICAgaW5jbHVkZSA8ZXJybm8uaD4KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBsb2NhbAotIyAgZGVmaW5lIGxvY2FsIHN0YXRpYwotI2VuZGlmCi0vKiBjb21waWxlIHdpdGggLURsb2NhbCBpZiB5b3VyIGRlYnVnZ2VyIGNhbid0IGZpbmQgc3RhdGljIHN5bWJvbHMgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1Y2g7Ci10eXBlZGVmIHVjaCBGQVIgdWNoZjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNoOwotdHlwZWRlZiB1c2ggRkFSIHVzaGY7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVsZzsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCB6X2Vycm1zZ1sxMF07IC8qIGluZGV4ZWQgYnkgMi16bGliX2Vycm9yICovCi0vKiAoc2l6ZSBnaXZlbiB0byBhdm9pZCBzaWxseSB3YXJuaW5ncyB3aXRoIFZpc3VhbCBDKyspICovCi0KLSNkZWZpbmUgRVJSX01TRyhlcnIpIHpfZXJybXNnW1pfTkVFRF9ESUNULShlcnIpXQotCi0jZGVmaW5lIEVSUl9SRVRVUk4oc3RybSxlcnIpIFwKLSAgcmV0dXJuIChzdHJtLT5tc2cgPSAoY2hhciopRVJSX01TRyhlcnIpLCAoZXJyKSkKLS8qIFRvIGJlIHVzZWQgb25seSB3aGVuIHRoZSBzdGF0ZSBpcyBrbm93biB0byBiZSB2YWxpZCAqLwotCi0gICAgICAgIC8qIGNvbW1vbiBjb25zdGFudHMgKi8KLQotI2lmbmRlZiBERUZfV0JJVFMKLSMgIGRlZmluZSBERUZfV0JJVFMgTUFYX1dCSVRTCi0jZW5kaWYKLS8qIGRlZmF1bHQgd2luZG93Qml0cyBmb3IgZGVjb21wcmVzc2lvbi4gTUFYX1dCSVRTIGlzIGZvciBjb21wcmVzc2lvbiBvbmx5ICovCi0KLSNpZiBNQVhfTUVNX0xFVkVMID49IDgKLSMgIGRlZmluZSBERUZfTUVNX0xFVkVMIDgKLSNlbHNlCi0jICBkZWZpbmUgREVGX01FTV9MRVZFTCAgTUFYX01FTV9MRVZFTAotI2VuZGlmCi0vKiBkZWZhdWx0IG1lbUxldmVsICovCi0KLSNkZWZpbmUgU1RPUkVEX0JMT0NLIDAKLSNkZWZpbmUgU1RBVElDX1RSRUVTIDEKLSNkZWZpbmUgRFlOX1RSRUVTICAgIDIKLS8qIFRoZSB0aHJlZSBraW5kcyBvZiBibG9jayB0eXBlICovCi0KLSNkZWZpbmUgTUlOX01BVENIICAzCi0jZGVmaW5lIE1BWF9NQVRDSCAgMjU4Ci0vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovCi0KLSNkZWZpbmUgUFJFU0VUX0RJQ1QgMHgyMCAvKiBwcmVzZXQgZGljdGlvbmFyeSBmbGFnIGluIHpsaWIgaGVhZGVyICovCi0KLSAgICAgICAgLyogdGFyZ2V0IGRlcGVuZGVuY2llcyAqLwotCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgKGRlZmluZWQoV0lORE9XUykgJiYgIWRlZmluZWQoV0lOMzIpKQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDAKLSMgIGlmIGRlZmluZWQoX19UVVJCT0NfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jICAgIGlmKF9fU1REQ19fID09IDEpICYmIChkZWZpbmVkKF9fTEFSR0VfXykgfHwgZGVmaW5lZChfX0NPTVBBQ1RfXykpCi0gICAgICAgLyogQWxsb3cgY29tcGlsYXRpb24gd2l0aCBBTlNJIGtleXdvcmRzIG9ubHkgZW5hYmxlZCAqLwotICAgICAgIHZvaWQgX0NkZWNsIGZhcmZyZWUoIHZvaWQgKmJsb2NrICk7Ci0gICAgICAgdm9pZCAqX0NkZWNsIGZhcm1hbGxvYyggdW5zaWduZWQgbG9uZyBuYnl0ZXMgKTsKLSMgICAgZWxzZQotIyAgICAgIGluY2x1ZGUgPGFsbG9jLmg+Ci0jICAgIGVuZGlmCi0jICBlbHNlIC8qIE1TQyBvciBESkdQUCAqLwotIyAgICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEFNSUdBCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFZBWEMpIHx8IGRlZmluZWQoVk1TKQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDIKLSMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgXAotICAgICBmb3BlbigobmFtZSksIChtb2RlKSwgIm1iYz02MCIsICJjdHg9c3RtIiwgInJmbT1maXgiLCAibXJzPTUxMiIpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQVRBUkkpIHx8IGRlZmluZWQoYXRhcmlzdCkKLSMgIGRlZmluZSBPU19DT0RFICAweDA1Ci0jZW5kaWYKLQotI2lmZGVmIE9TMgotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDYKLSMgIGlmZGVmIE1fSTg2Ci0gICAgICNpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoTUFDT1MpIHx8IGRlZmluZWQoVEFSR0VUX09TX01BQykKLSMgIGRlZmluZSBPU19DT0RFICAweDA3Ci0jICBpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIF9fZGVzdF9vcyAhPSBfX2JlX29zICYmIF9fZGVzdF9vcyAhPSBfX3dpbjMyX29zCi0jICAgIGluY2x1ZGUgPHVuaXguaD4gLyogZm9yIGZkb3BlbiAqLwotIyAgZWxzZQotIyAgICBpZm5kZWYgZmRvcGVuCi0jICAgICAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUT1BTMjAKLSMgIGRlZmluZSBPU19DT0RFICAweDBhCi0jZW5kaWYKLQotI2lmZGVmIFdJTjMyCi0jICBpZm5kZWYgX19DWUdXSU5fXyAgLyogQ3lnd2luIGlzIFVuaXgsIG5vdCBXaW4zMiAqLwotIyAgICBkZWZpbmUgT1NfQ09ERSAgMHgwYgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX181MFNFUklFUyAvKiBQcmltZS9QUklNT1MgKi8KLSMgIGRlZmluZSBPU19DT0RFICAweDBmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX0JFT1NfKSB8fCBkZWZpbmVkKFJJU0NPUykKLSMgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLwotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gNjAwKSkKLSMgIGlmIGRlZmluZWQoX1dJTjMyX1dDRSkKLSMgICAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCi0jICAgIGlmbmRlZiBfUFRSRElGRl9UX0RFRklORUQKLSAgICAgICB0eXBlZGVmIGludCBwdHJkaWZmX3Q7Ci0jICAgICAgZGVmaW5lIF9QVFJESUZGX1RfREVGSU5FRAotIyAgICBlbmRpZgotIyAgZWxzZQotIyAgICBkZWZpbmUgZmRvcGVuKGZkLHR5cGUpICBfZmRvcGVuKGZkLHR5cGUpCi0jICBlbmRpZgotI2VuZGlmCi0KLSAgICAgICAgLyogY29tbW9uIGRlZmF1bHRzICovCi0KLSNpZm5kZWYgT1NfQ09ERQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDMgIC8qIGFzc3VtZSBVbml4ICovCi0jZW5kaWYKLQotI2lmbmRlZiBGX09QRU4KLSMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgZm9wZW4oKG5hbWUpLCAobW9kZSkpCi0jZW5kaWYKLQotICAgICAgICAgLyogZnVuY3Rpb25zICovCi0KLSNpZiBkZWZpbmVkKFNUREM5OSkgfHwgKGRlZmluZWQoX19UVVJCT0NfXykgJiYgX19UVVJCT0NfXyA+PSAweDU1MCkKLSMgIGlmbmRlZiBIQVZFX1ZTTlBSSU5URgotIyAgICBkZWZpbmUgSEFWRV9WU05QUklOVEYKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jICBpZm5kZWYgSEFWRV9WU05QUklOVEYKLSMgICAgZGVmaW5lIEhBVkVfVlNOUFJJTlRGCi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIEhBVkVfVlNOUFJJTlRGCi0jICBpZmRlZiBNU0RPUwotICAgICAvKiB2c25wcmludGYgbWF5IGV4aXN0IG9uIHNvbWUgTVMtRE9TIGNvbXBpbGVycyAoREpHUFA/KSwKLSAgICAgICAgYnV0IGZvciBub3cgd2UganVzdCBhc3N1bWUgaXQgZG9lc24ndC4gKi8KLSMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgotIyAgZW5kaWYKLSMgIGlmZGVmIF9fVFVSQk9DX18KLSMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgotIyAgZW5kaWYKLSMgIGlmZGVmIFdJTjMyCi0gICAgIC8qIEluIFdpbjMyLCB2c25wcmludGYgaXMgYXZhaWxhYmxlIGFzIHRoZSAibm9uLUFOU0kiIF92c25wcmludGYuICovCi0jICAgIGlmICFkZWZpbmVkKHZzbnByaW50ZikgJiYgIWRlZmluZWQoTk9fdnNucHJpbnRmKQotIyAgICAgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSMgIGlmZGVmIF9fU0FTQwotIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jICBlbmRpZgotI2VuZGlmCi0jaWZkZWYgVk1TCi0jICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQocHlyKQotIyAgZGVmaW5lIE5PX01FTUNQWQotI2VuZGlmCi0jaWYgZGVmaW5lZChTTUFMTF9NRURJVU0pICYmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX1NDX18pCi0gLyogVXNlIG91ciBvd24gZnVuY3Rpb25zIGZvciBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsIHdpdGggTVNDIDw9IDUuMC4KLSAgKiBZb3UgbWF5IGhhdmUgdG8gdXNlIHRoZSBzYW1lIHN0cmF0ZWd5IGZvciBCb3JsYW5kIEMgKHVudGVzdGVkKS4KLSAgKiBUaGUgX19TQ19fIGNoZWNrIGlzIGZvciBTeW1hbnRlYy4KLSAgKi8KLSMgIGRlZmluZSBOT19NRU1DUFkKLSNlbmRpZgotI2lmIGRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoSEFWRV9NRU1DUFkpICYmICFkZWZpbmVkKE5PX01FTUNQWSkKLSMgIGRlZmluZSBIQVZFX01FTUNQWQotI2VuZGlmCi0jaWZkZWYgSEFWRV9NRU1DUFkKLSMgIGlmZGVmIFNNQUxMX01FRElVTSAvKiBNU0RPUyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KLSMgICAgZGVmaW5lIHptZW1jcHkgX2ZtZW1jcHkKLSMgICAgZGVmaW5lIHptZW1jbXAgX2ZtZW1jbXAKLSMgICAgZGVmaW5lIHptZW16ZXJvKGRlc3QsIGxlbikgX2ZtZW1zZXQoZGVzdCwgMCwgbGVuKQotIyAgZWxzZQotIyAgICBkZWZpbmUgem1lbWNweSBtZW1jcHkKLSMgICAgZGVmaW5lIHptZW1jbXAgbWVtY21wCi0jICAgIGRlZmluZSB6bWVtemVybyhkZXN0LCBsZW4pIG1lbXNldChkZXN0LCAwLCBsZW4pCi0jICBlbmRpZgotI2Vsc2UKLSAgIGV4dGVybiB2b2lkIHptZW1jcHkgIE9GKChCeXRlZiogZGVzdCwgY29uc3QgQnl0ZWYqIHNvdXJjZSwgdUludCBsZW4pKTsKLSAgIGV4dGVybiBpbnQgIHptZW1jbXAgIE9GKChjb25zdCBCeXRlZiogczEsIGNvbnN0IEJ5dGVmKiBzMiwgdUludCBsZW4pKTsKLSAgIGV4dGVybiB2b2lkIHptZW16ZXJvIE9GKChCeXRlZiogZGVzdCwgdUludCBsZW4pKTsKLSNlbmRpZgotCi0vKiBEaWFnbm9zdGljIGZ1bmN0aW9ucyAqLwotI2lmZGVmIERFQlVHCi0jICBpbmNsdWRlIDxzdGRpby5oPgotICAgZXh0ZXJuIGludCB6X3ZlcmJvc2U7Ci0gICBleHRlcm4gdm9pZCB6X2Vycm9yICAgIE9GKChjaGFyICptKSk7Ci0jICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgel9lcnJvcihtc2cpO30KLSMgIGRlZmluZSBUcmFjZSh4KSB7aWYgKHpfdmVyYm9zZT49MCkgZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAoel92ZXJib3NlPjApIGZwcmludGYgeCA7fQotIyAgZGVmaW5lIFRyYWNldnYoeCkge2lmICh6X3ZlcmJvc2U+MSkgZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh6X3ZlcmJvc2U+MCAmJiAoYykpIGZwcmludGYgeCA7fQotIyAgZGVmaW5lIFRyYWNlY3YoYyx4KSB7aWYgKHpfdmVyYm9zZT4xICYmIChjKSkgZnByaW50ZiB4IDt9Ci0jZWxzZQotIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKLSMgIGRlZmluZSBUcmFjZSh4KQotIyAgZGVmaW5lIFRyYWNldih4KQotIyAgZGVmaW5lIFRyYWNldnYoeCkKLSMgIGRlZmluZSBUcmFjZWMoYyx4KQotIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQotI2VuZGlmCi0KLQotdm9pZHBmIHpjYWxsb2MgT0YoKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKSk7Ci12b2lkICAgemNmcmVlICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikpOwotCi0jZGVmaW5lIFpBTExPQyhzdHJtLCBpdGVtcywgc2l6ZSkgXAotICAgICAgICAgICAoKigoc3RybSktPnphbGxvYykpKChzdHJtKS0+b3BhcXVlLCAoaXRlbXMpLCAoc2l6ZSkpCi0jZGVmaW5lIFpGUkVFKHN0cm0sIGFkZHIpICAoKigoc3RybSktPnpmcmVlKSkoKHN0cm0pLT5vcGFxdWUsICh2b2lkcGYpKGFkZHIpKQotI2RlZmluZSBUUllfRlJFRShzLCBwKSB7aWYgKHApIFpGUkVFKHMsIHApO30KLQotI2VuZGlmIC8qIFpVVElMX0ggKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL192a3RyYWNlcmVwbGF5LnBzMSBiL3Rlc3RzL192a3RyYWNlcmVwbGF5LnBzMQppbmRleCA2MjJmOTM0Li5kNzdiMjUyIDEwMDY0NAotLS0gYS90ZXN0cy9fdmt0cmFjZXJlcGxheS5wczEKKysrIGIvdGVzdHMvX3ZrdHJhY2VyZXBsYXkucHMxCkBAIC0yMyw3ICsyMyw3IEBACiBjcCAuLlwuLlx2a3RyYWNlXCRkUGF0aFx2a3JlcGxheS5leGUgLg0KIGNwIC4uXC4uXHZrdHJhY2VcJGRQYXRoXHZrdHJhY2UuZXhlIC4NCiBjcCAuLlwuLlxkZW1vc1wkZFBhdGhcY3ViZS5leGUgLg0KLWNwIC4uXC4uXGRlbW9zXCoucG5nIC4NCitjcCAuLlwuLlxkZW1vc1wqLnBwbSAuDQogY3AgLi5cLi5cZGVtb3NcKi5zcHYgLg0KIGNwIC4uXC4uXGxvYWRlclwkZFBhdGhcdnVsa2FuLTAuZGxsIC4NCiBjcCAuLlwuLlxsYXllcnNcJGRQYXRoXFZLTGF5ZXJTY3JlZW5TaG90LmRsbCAuDQpkaWZmIC0tZ2l0IGEvdGVzdHMvdmt0ZXN0ZnJhbWV3b3JrLmNwcCBiL3Rlc3RzL3ZrdGVzdGZyYW1ld29yay5jcHAKaW5kZXggYTNkZjQ3Mi4uMGQ4ODA5MSAxMDA2NDQKLS0tIGEvdGVzdHMvdmt0ZXN0ZnJhbWV3b3JrLmNwcAorKysgYi90ZXN0cy92a3Rlc3RmcmFtZXdvcmsuY3BwCkBAIC0yNyw3ICsyNyw5IEBACiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHdhbmQvTWFnaWNrV2FuZC5oPgorI2lmbmRlZiBfV0lOMzIKICNpbmNsdWRlIDx4Y2IveGNiLmg+CisjZW5kaWYKICNpbmNsdWRlICJ2a19leHRfa2hyX3N3YXBjaGFpbi5oIgogI2luY2x1ZGUgInZrX2V4dF9raHJfZGV2aWNlX3N3YXBjaGFpbi5oIgogCkBAIC0xNTYsNyArMTU4LDkgQEAKICAgICBzdGQ6Omxpc3Q8VmtUZXN0SW1hZ2VSZWNvcmQ+OjppdGVyYXRvciBtX2Rpc3BsYXlfaW1hZ2U7CiAKICAgICB2b2lkIERpc3BsYXkoKTsKKyNpZm5kZWYgX1dJTjMyCiAgICAgdm9pZCBIYW5kbGVFdmVudCh4Y2JfZ2VuZXJpY19ldmVudF90ICpldmVudCk7CisjZW5kaWYKIH07CiAKICNpZm5kZWYgX1dJTjMyCkBAIC0zMjQsNyArMzI4LDcgQEAKICAgICBBU1NFUlRfVFJVRShmaWxlLmlzX29wZW4oKSkgPDwgIlVuYWJsZSB0byBvcGVuIGZpbGU6ICIgPDwgZmlsZW5hbWU7CiAKICAgICBmaWxlIDw8ICJQNlxuIjsKLSAgICBmaWxlIDw8IGRpc3BsYXlJbWFnZS53aWR0aCgpIDw8ICJcbiI7CisgICAgZmlsZSA8PCBkaXNwbGF5SW1hZ2Uud2lkdGgoKSA8PCAiICI7CiAgICAgZmlsZSA8PCBkaXNwbGF5SW1hZ2UuaGVpZ2h0KCkgPDwgIlxuIjsKICAgICBmaWxlIDw8IDI1NSA8PCAiXG4iOwogCmRpZmYgLS1naXQgYS90ZXN0cy92a3RyYWNlcmVwbGF5LnNoIGIvdGVzdHMvdmt0cmFjZXJlcGxheS5zaAppbmRleCBmNTNmOTFkLi45NjYxOGVkIDEwMDc1NQotLS0gYS90ZXN0cy92a3RyYWNlcmVwbGF5LnNoCisrKyBiL3Rlc3RzL3ZrdHJhY2VyZXBsYXkuc2gKQEAgLTIwLDcgKzIwLDcgQEAKIGNwIC4uLy4uL3ZrdHJhY2Uvdmt0cmFjZSAuCiBjcCAuLi8uLi92a3RyYWNlL2xpYnZrdHJhY2VfbGF5ZXIuc28gLgogY3AgLi4vLi4vZGVtb3MvY3ViZSAuCi1jcCAuLi8uLi9kZW1vcy8qcG5nIC4KK2NwIC4uLy4uL2RlbW9zLypwcG0gLgogY3AgLi4vLi4vZGVtb3MvKnNwdiAuCiBleHBvcnQgTERfTElCUkFSWV9QQVRIPWBwd2RgLy4uL2xvYWRlcjokTERfTElCUkFSWV9QQVRICiBleHBvcnQgVktfTEFZRVJfUEFUSD1gcHdkYC8uLi8uLi9sYXllcnMK