LyokVCBodHRwZC5jIEdDIDEuMTM4IDA3LzIzLzA1IDEzOjEwOjQ5ICovDQoNCi8qDQogKiBcYWRkdG9ncm91cCBleGFtcGxlYXBwcyBAeyCjDQogKiBcZGVmZ3JvdXAgaHR0cGQgV2ViIHNlcnZlciBAeyBUaGUgdUlQIHdlYiBzZXJ2ZXIgaXMgYSB2ZXJ5IHNpbXBsaXN0aWMNCiAqIGltcGxlbWVudGF0aW9uIG9mIGFuIEhUVFAgc2VydmVyLiBJdCBjYW4gc2VydmUgd2ViIHBhZ2VzIGFuZCBmaWxlcyBmcm9tIGENCiAqIHJlYWQtb25seSBST00gZmlsZXN5c3RlbSwgYW5kIHByb3ZpZGVzIGEgdmVyeSBzbWFsbCBzY3JpcHRpbmcgbGFuZ3VhZ2UuIFRoZQ0KICogc2NyaXB0IGxhbmd1YWdlIGlzIHZlcnkgc2ltcGxlIGFuZCB3b3JrcyBhcyBmb2xsb3dzLiBFYWNoIHNjcmlwdCBsaW5lIHN0YXJ0cw0KICogd2l0aCBhIGNvbW1hbmQgY2hhcmFjdGVyLCBlaXRoZXIgImkiLCAidCIsICJjIiwgIiMiIG9yICIuIi4gVGhlICJpIiBjb21tYW5kDQogKiB0ZWxscyB0aGUgc2NyaXB0IGludGVycHJldGVyIHRvICJpbmNsdWRlIiBhIGZpbGUgZnJvbSB0aGUgdmlydHVhbCBmaWxlIHN5c3RlbQ0KICogYW5kIG91dHB1dCBpdCB0byB0aGUgd2ViIGJyb3dzZXIuIFRoZSAidCIgY29tbWFuZCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBsaW5lDQogKiBvZiB0ZXh0IHRoYXQgaXMgdG8gYmUgb3V0cHV0IHRvIHRoZSBicm93c2VyLiBUaGUgImMiIGNvbW1hbmQgaXMgdXNlZCB0byBjYWxsDQogKiBvbmUgb2YgdGhlIEMgZnVuY3Rpb25zIGZyb20gdGhlIGh0dHBkLWNnaS5jIGZpbGUuIEEgbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGEgIiMiDQogKiBpcyBpZ25vcmVkIChpLmUuLCB0aGUgIiMiIGRlbm90ZXMgYSBjb21tZW50KSwgYW5kIHRoZSAiLiIgZGVub3RlcyB0aGUgbGFzdA0KICogc2NyaXB0IGxpbmUuIFRoZSBzY3JpcHQgdGhhdCBwcm9kdWNlcyB0aGUgZmlsZSBzdGF0aXN0aWNzIHBhZ2UgbG9va3Mgc29tZXdoYXQNCiAqIGxpa2UgdGhpczogXGNvZGUgaSAvaGVhZGVyLmh0bWwgdCA8aDE+RmlsZSBzdGF0aXN0aWNzPC9oMT48YnI+PHRhYmxlDQogKiB3aWR0aD0iMTAwJSI+IHQgPHRyPjx0ZD48YSBocmVmPSIvaW5kZXguaHRtbCI+L2luZGV4Lmh0bWw8L2E+PC90ZD48dGQ+IGMgYQ0KICogL2luZGV4Lmh0bWwgdCA8L3RkPjwvdHI+IDx0cj48dGQ+PGEgaHJlZj0iL2NnaS9maWxlcyI+L2NnaS9maWxlczwvYT48L3RkPjx0ZD4gYw0KICogYSAvY2dpL2ZpbGVzIHQgPC90ZD48L3RyPiA8dHI+PHRkPjxhIGhyZWY9Ii9jZ2kvdGNwIj4vY2dpL3RjcDwvYT48L3RkPjx0ZD4gYyBhDQogKiAvY2dpL3RjcCB0IDwvdGQ+PC90cj4gPHRyPjx0ZD48YSBocmVmPSIvNDA0Lmh0bWwiPi80MDQuaHRtbDwvYT48L3RkPjx0ZD4gYyBhDQogKiAvNDA0Lmh0bWwgdCA8L3RkPjwvdHI+PC90YWJsZT4gaSAvZm9vdGVyLnBsYWluIC4gXGVuZGNvZGUgow0KICogXGZpbGUgSFRUUCBzZXJ2ZXIuIFxhdXRob3IgQWRhbSBEdW5rZWxzIDxhZGFtQGR1bmtlbHMuY29tPiCjDQogKiBDb3B5cmlnaHQgKGMpIDIwMDEsIEFkYW0gRHVua2Vscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gUmVkaXN0cmlidXRpb24gYW5kIHVzZQ0KICogaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQNCiAqIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UNCiAqIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUNCiAqIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlDQogKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluDQogKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gMy4gVGhlDQogKiBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIFRISVMgU09GVFdBUkUgSVMNCiAqIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsDQogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EDQogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUg0KICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUg0KICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQ0KICogR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pDQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVA0KICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQNCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSB1SVAgVENQL0lQIHN0YWNrLiAkSWQ6IGh0dHBkLmMsdiAxLjI4LjIuNiAyMDAzLzEwLzA3DQogKiAxMzoyMjoyNyBhZGFtIEV4cCAkDQogKi8NCiNpbmNsdWRlICJ1aXAuaCINCiNpbmNsdWRlICJodHRwZC5oIg0KI2luY2x1ZGUgImZzLmgiDQojaW5jbHVkZSAiZnNkYXRhLmgiDQojaW5jbHVkZSAiY2dpLmgiDQoNCiNkZWZpbmUgTlVMTCAgICAoIHZvaWQgKiApIDANCg0KLyogVGhlIEhUVFAgc2VydmVyIHN0YXRlczogKi8NCiNkZWZpbmUgSFRUUF9OT0dFVCAgMA0KI2RlZmluZSBIVFRQX0ZJTEUgICAxDQojZGVmaW5lIEhUVFBfVEVYVCAgIDINCiNkZWZpbmUgSFRUUF9GVU5DICAgMw0KI2RlZmluZSBIVFRQX0VORCAgICA0DQoNCiNpZmRlZiBERUJVRw0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojZGVmaW5lIFBSSU5UKCB4ICkNCiNkZWZpbmUgUFJJTlRMTiggeCApDQojZWxzZSAvKiBERUJVRyAqLw0KI2RlZmluZSBQUklOVCggeCApDQojZGVmaW5lIFBSSU5UTE4oIHggKQ0KI2VuZGlmIC8qIERFQlVHICovDQoNCnN0cnVjdCBodHRwZF9zdGF0ZSAgICAgICAgICAgICAgKmhzOw0KDQpleHRlcm4gY29uc3Qgc3RydWN0IGZzZGF0YV9maWxlIGZpbGVfaW5kZXhfaHRtbDsNCmV4dGVybiBjb25zdCBzdHJ1Y3QgZnNkYXRhX2ZpbGUgZmlsZV80MDRfaHRtbDsNCg0Kc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICBuZXh0X3NjcmlwdGxpbmUoIHZvaWQgKTsNCnN0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgbmV4dF9zY3JpcHRzdGF0ZSggdm9pZCApOw0KDQojZGVmaW5lIElTT19HICAgICAgIDB4NDcNCiNkZWZpbmUgSVNPX0UgICAgICAgMHg0NQ0KI2RlZmluZSBJU09fVCAgICAgICAweDU0DQojZGVmaW5lIElTT19zbGFzaCAgIDB4MmYNCiNkZWZpbmUgSVNPX2MgICAgICAgMHg2Mw0KI2RlZmluZSBJU09fZyAgICAgICAweDY3DQojZGVmaW5lIElTT19pICAgICAgIDB4NjkNCiNkZWZpbmUgSVNPX3NwYWNlICAgMHgyMA0KI2RlZmluZSBJU09fbmwgICAgICAweDBhDQojZGVmaW5lIElTT19jciAgICAgIDB4MGQNCiNkZWZpbmUgSVNPX2EgICAgICAgMHg2MQ0KI2RlZmluZSBJU09fdCAgICAgICAweDc0DQojZGVmaW5lIElTT19oYXNoICAgIDB4MjMNCiNkZWZpbmUgSVNPX3BlcmlvZCAgMHgyZQ0KDQojZGVmaW5lIGh0dHBQT1JUICAgIDgwDQoNCi8qDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICBJbml0aWFsaXplIHRoZSB3ZWIgc2VydmVyLiBTdGFydHMgdG8gbGlzdGVuIGZvciBpbmNvbWluZyBjb25uZWN0aW9uIHJlcXVlc3RzIG9uIFRDUCBwb3J0IDgwLg0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKi8NCnZvaWQgaHR0cGRfaW5pdCggdm9pZCApDQp7DQogICAgZnNfaW5pdCgpOw0KDQogICAgLyogTGlzdGVuIHRvIHBvcnQgODAuICovDQogICAgdWlwX2xpc3RlbiggSFRPTlMoIGh0dHBQT1JUICkgKTsNCn0NCg0KLyoNCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKi8NCnZvaWQgaHR0cGRfYXBwY2FsbCggdm9pZCApDQp7DQogICAgLyp+fn5+fn5+fn5+fn5+fn5+fn5+Ki8NCiAgICBzdHJ1Y3QgZnNfZmlsZSAgZnNmaWxlOw0KICAgIHU4X3QgICAgICAgICAgICBpOw0KICAgIC8qfn5+fn5+fn5+fn5+fn5+fn5+fiovDQoNCiAgICBzd2l0Y2goIHVpcF9jb25uLT5scG9ydCApDQogICAgew0KICAgIC8qIFRoaXMgaXMgdGhlIHdlYiBzZXJ2ZXI6ICovDQogICAgY2FzZSBIVE9OUyggaHR0cFBPUlQgKToNCiAgICAgICAgLyogUGljayBvdXQgdGhlIGFwcGxpY2F0aW9uIHN0YXRlIGZyb20gdGhlIHVpcF9jb25uIHN0cnVjdHVyZS4gKi8NCiAgICAgICAgaHMgPSAoIHN0cnVjdCBodHRwZF9zdGF0ZSAqICkgKCB1aXBfY29ubi0+YXBwc3RhdGUgKTsNCg0KICAgICAgICAvKg0KICAgICAgICAgKiBXZSB1c2UgdGhlIHVpcF8gdGVzdCBmdW5jdGlvbnMgdG8gZGVkdWNlIHdoeSB3ZSB3ZXJlIGNhbGxlZC4gSWYgdWlwX2Nvbm5lY3RlZCgpDQogICAgICAgICAqIGlzIG5vbi16ZXJvLCB3ZSB3ZXJlIGNhbGxlZCBiZWNhdXNlIGEgcmVtb3RlIGhvc3QgaGFzIGNvbm5lY3RlZCB0byB1cy4gSWYNCiAgICAgICAgICogdWlwX25ld2RhdGEoKSBpcyBub24temVybywgd2Ugd2VyZSBjYWxsZWQgYmVjYXVzZSB0aGUgcmVtb3RlIGhvc3QgaGFzIHNlbnQgdXMNCiAgICAgICAgICogbmV3IGRhdGEsIGFuZCBpZiB1aXBfYWNrZWQoKSBpcyBub24temVybywgdGhlIHJlbW90ZSBob3N0IGhhcyBhY2tub3dsZWRnZWQgdGhlDQogICAgICAgICAqIGRhdGEgd2UgcHJldmlvdXNseSBzZW50IHRvIGl0Lg0KICAgICAgICAgKi8NCiAgICAgICAgaWYoIHVpcF9jb25uZWN0ZWQoKSApDQogICAgICAgIHsNCiAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgKiBTaW5jZSB3ZSBoYXZlIGp1c3QgYmVlbiBjb25uZWN0ZWQgd2l0aCB0aGUgcmVtb3RlIGhvc3QsIHdlIHJlc2V0IHRoZSBzdGF0ZSBmb3INCiAgICAgICAgICAgICAqIHRoaXMgY29ubmVjdGlvbi4gVGhlIC0+Y291bnQgdmFyaWFibGUgY29udGFpbnMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgeWV0DQogICAgICAgICAgICAgKiB0byBiZSBzZW50IHRvIHRoZSByZW1vdGUgaG9zdCwgYW5kIHRoZSAtPnN0YXRlIGlzIHNldCB0byBIVFRQX05PR0VUIHRvIHNpZ25hbA0KICAgICAgICAgICAgICogdGhhdCB3ZSBoYXZlbid0IHJlY2VpdmVkIGFueSBIVFRQIEdFVCByZXF1ZXN0IGZvciB0aGlzIGNvbm5lY3Rpb24geWV0Lg0KICAgICAgICAgICAgICovDQogICAgICAgICAgICBocy0+c3RhdGUgPSBIVFRQX05PR0VUOw0KICAgICAgICAgICAgaHMtPmNvdW50ID0gMDsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKCB1aXBfcG9sbCgpICkNCiAgICAgICAgew0KICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAqIElmIHdlIGFyZSBwb2xsZWQgdGVuIHRpbWVzLCB3ZSBhYm9ydCB0aGUgY29ubmVjdGlvbi4gVGhpcyBpcyBiZWNhdXNlIHdlIGRvbid0DQogICAgICAgICAgICAgKiB3YW50IGNvbm5lY3Rpb25zIGxpbmdlcmluZyBpbmRlZmluYXRlbHkgaW4gdGhlIHN5c3RlbS4NCiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgaWYoIGhzLT5jb3VudCsrID49IDEwICkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB1aXBfYWJvcnQoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYoIHVpcF9uZXdkYXRhKCkgJiYgaHMtPnN0YXRlID09IEhUVFBfTk9HRVQgKQ0KICAgICAgICB7DQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZmlyc3QgZGF0YSB3ZSByZWNlaXZlLCBhbmQgaXQgc2hvdWxkIGNvbnRhaW4gYSBHRVQuIKMNCiAgICAgICAgICAgICAqIENoZWNrIGZvciBHRVQuDQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIGlmDQogICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgdWlwX2FwcGRhdGFbMF0gIT0gSVNPX0cNCiAgICAgICAgICAgIHx8ICB1aXBfYXBwZGF0YVsxXSAhPSBJU09fRQ0KICAgICAgICAgICAgfHwgIHVpcF9hcHBkYXRhWzJdICE9IElTT19UDQogICAgICAgICAgICB8fCAgdWlwX2FwcGRhdGFbM10gIT0gSVNPX3NwYWNlDQogICAgICAgICAgICApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLyogSWYgaXQgaXNuJ3QgYSBHRVQsIHdlIGFib3J0IHRoZSBjb25uZWN0aW9uLiAqLw0KICAgICAgICAgICAgICAgIHVpcF9hYm9ydCgpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLyogRmluZCB0aGUgZmlsZSB3ZSBhcmUgbG9va2luZyBmb3IuICovDQogICAgICAgICAgICBmb3IoIGkgPSA0OyBpIDwgNDA7ICsraSApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYoIHVpcF9hcHBkYXRhW2ldID09IElTT19zcGFjZSB8fCB1aXBfYXBwZGF0YVtpXSA9PSBJU09fY3IgfHwgdWlwX2FwcGRhdGFbaV0gPT0gSVNPX25sICkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHVpcF9hcHBkYXRhW2ldID0gMDsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBQUklOVCggInJlcXVlc3QgZm9yIGZpbGUgIiApOw0KICAgICAgICAgICAgUFJJTlRMTiggJnVpcF9hcHBkYXRhWzRdICk7DQoNCiAgICAgICAgICAgIC8qIENoZWNrIGZvciBhIHJlcXVlc3QgZm9yICIvIi4gKi8NCiAgICAgICAgICAgIGlmKCB1aXBfYXBwZGF0YVs0XSA9PSBJU09fc2xhc2ggJiYgdWlwX2FwcGRhdGFbNV0gPT0gMCApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZnNfb3BlbiggZmlsZV9pbmRleF9odG1sLm5hbWUsICZmc2ZpbGUgKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiggIWZzX29wZW4oICggY29uc3QgY2hhciAqICkgJnVpcF9hcHBkYXRhWzRdLCAmZnNmaWxlICkgKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgUFJJTlRMTiggImNvdWxkbid0IG9wZW4gZmlsZSIgKTsNCiAgICAgICAgICAgICAgICAgICAgZnNfb3BlbiggZmlsZV80MDRfaHRtbC5uYW1lLCAmZnNmaWxlICk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZg0KICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgIHVpcF9hcHBkYXRhWzRdID09IElTT19zbGFzaA0KICAgICAgICAgICAgJiYgIHVpcF9hcHBkYXRhWzVdID09IElTT19jDQogICAgICAgICAgICAmJiAgdWlwX2FwcGRhdGFbNl0gPT0gSVNPX2cNCiAgICAgICAgICAgICYmICB1aXBfYXBwZGF0YVs3XSA9PSBJU09faQ0KICAgICAgICAgICAgJiYgIHVpcF9hcHBkYXRhWzhdID09IElTT19zbGFzaA0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogSWYgdGhlIHJlcXVlc3QgaXMgZm9yIGEgZmlsZSB0aGF0IHN0YXJ0cyB3aXRoICIvY2dpLyIsIHdlIHByZXBhcmUgZm9yIGludm9raW5nDQogICAgICAgICAgICAgICAgICogYSBzY3JpcHQuDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgaHMtPnNjcmlwdCA9IGZzZmlsZS5kYXRhOw0KICAgICAgICAgICAgICAgIG5leHRfc2NyaXB0c3RhdGUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBocy0+c2NyaXB0ID0gTlVMTDsNCg0KICAgICAgICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgICogVGhlIHdlYiBzZXJ2ZXIgaXMgbm93IG5vIGxvbmdlciBpbiB0aGUgSFRUUF9OT0dFVCBzdGF0ZSwgYnV0IGluIHRoZSBIVFRQX0ZJTEUNCiAgICAgICAgICAgICAgICAgKiBzdGF0ZSBzaW5jZSBpcyBoYXMgbm93IGdvdCB0aGUgR0VUIGZyb20gdGhlIGNsaWVudCBhbmQgd2lsbCBzdGFydCB0cmFuc21pdHRpbmcNCiAgICAgICAgICAgICAgICAgKiB0aGUgZmlsZS4NCiAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICBocy0+c3RhdGUgPSBIVFRQX0ZJTEU7DQoNCiAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAqIFBvaW50IHRoZSBmaWxlIHBvaW50ZXJzIGluIHRoZSBjb25uZWN0aW9uIHN0YXRlIHRvIHBvaW50IHRvIHRoZSBmaXJzdCBieXRlIG9mDQogICAgICAgICAgICAgICAgICogdGhlIGZpbGUuDQogICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgaHMtPmRhdGFwdHIgPSBmc2ZpbGUuZGF0YTsNCiAgICAgICAgICAgICAgICBocy0+Y291bnQgPSBmc2ZpbGUubGVuOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYoIGhzLT5zdGF0ZSAhPSBIVFRQX0ZVTkMgKQ0KICAgICAgICB7DQogICAgICAgICAgICAvKg0KICAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlIGNsaWVudCAocmVtb3RlIGVuZCkgaGFzIGFja25vd2xlZGdlZCBhbnkgZGF0YSB0aGF0IHdlJ3ZlDQogICAgICAgICAgICAgKiBwcmV2aW91c2x5IHNlbnQuIElmIHNvLCB3ZSBtb3ZlIHRoZSBmaWxlIHBvaW50ZXIgZnVydGhlciBpbnRvIHRoZSBmaWxlIGFuZCBzZW5kDQogICAgICAgICAgICAgKiBiYWNrIG1vcmUgZGF0YS4gSWYgd2UgYXJlIG91dCBvZiBkYXRhIHRvIHNlbmQsIHdlIGNsb3NlIHRoZSBjb25uZWN0aW9uLg0KICAgICAgICAgICAgICovDQogICAgICAgICAgICBpZiggdWlwX2Fja2VkKCkgKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmKCBocy0+Y291bnQgPj0gdWlwX2Nvbm4tPmxlbiApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBocy0+Y291bnQgLT0gdWlwX2Nvbm4tPmxlbjsNCiAgICAgICAgICAgICAgICAgICAgaHMtPmRhdGFwdHIgKz0gdWlwX2Nvbm4tPmxlbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaHMtPmNvdW50ID0gMDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiggaHMtPmNvdW50ID09IDAgKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYoIGhzLT5zY3JpcHQgIT0gTlVMTCApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfc2NyaXB0bGluZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9zY3JpcHRzdGF0ZSgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdWlwX2Nsb3NlKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICAvKiBDYWxsIHRoZSBDR0kgZnVuY3Rpb24uICovDQogICAgICAgICAgICBpZiggY2dpdGFiW2hzLT5zY3JpcHRbMl0gLSBJU09fYV0odWlwX2Fja2VkKCkpICkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvKiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBub24temVybywgd2UganVtcCB0byB0aGUgbmV4dCBsaW5lIGluIHRoZSBzY3JpcHQuICovDQogICAgICAgICAgICAgICAgbmV4dF9zY3JpcHRsaW5lKCk7DQogICAgICAgICAgICAgICAgbmV4dF9zY3JpcHRzdGF0ZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYoIGhzLT5zdGF0ZSAhPSBIVFRQX0ZVTkMgJiYgIXVpcF9wb2xsKCkgKQ0KICAgICAgICB7DQogICAgICAgICAgICAvKiBTZW5kIGEgcGllY2Ugb2YgZGF0YSwgYnV0IG5vdCBtb3JlIHRoYW4gdGhlIE1TUyBvZiB0aGUgY29ubmVjdGlvbi4gKi8NCiAgICAgICAgICAgIHVpcF9zZW5kKCAoIHZvaWQgKiApIGhzLT5kYXRhcHRyLCBocy0+Y291bnQgKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qIEZpbmFsbHksIHJldHVybiB0byB1SVAuIE91ciBvdXRnb2luZyBwYWNrZXQgd2lsbCBzb29uIGJlIG9uIGl0cyB3YXkuLi4gKi8NCiAgICAgICAgcmV0dXJuOw0KDQogICAgZGVmYXVsdDoNCiAgICAgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8NCiAgICAgICAgdWlwX2Fib3J0KCk7DQogICAgICAgIGJyZWFrOw0KICAgIH0NCn0NCg0KLyoNCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIG5leHRfc2NyaXB0bGluZSgpOiBSZWFkcyB0aGUgc2NyaXB0IHVudGlsIGl0IGZpbmRzIGEgbmV3bGluZS4NCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICovDQpzdGF0aWMgdm9pZCBuZXh0X3NjcmlwdGxpbmUoIHZvaWQgKQ0Kew0KICAgIC8qIExvb3AgdW50aWwgd2UgZmluZCBhIG5ld2xpbmUgY2hhcmFjdGVyLiAqLw0KICAgIGRvDQogICAgew0KICAgICAgICArKyggaHMtPnNjcmlwdCApOw0KICAgIH0gd2hpbGUoIGhzLT5zY3JpcHRbMF0gIT0gSVNPX25sICk7DQoNCiAgICAvKiBFYXQgdXAgdGhlIG5ld2xpbmUgYXMgd2VsbC4gKi8NCiAgICArKyggaHMtPnNjcmlwdCApOw0KfQ0KDQovKg0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgbmV4dF9zY2lwdHN0YXRlOiBSZWFkcyBvbmUgbGluZSBvZiBzY3JpcHQgYW5kIGRlY2lkZXMgd2hhdCB0byBkbyBuZXh0Lg0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKi8NCnN0YXRpYyB2b2lkIG5leHRfc2NyaXB0c3RhdGUoIHZvaWQgKQ0Kew0KICAgIC8qfn5+fn5+fn5+fn5+fn5+fn5+fiovDQogICAgc3RydWN0IGZzX2ZpbGUgIGZzZmlsZTsNCiAgICB1OF90ICAgICAgICAgICAgaTsNCiAgICAvKn5+fn5+fn5+fn5+fn5+fn5+fn4qLw0KDQphZ2FpbjoNCiAgICBzd2l0Y2goIGhzLT5zY3JpcHRbMF0gKQ0KICAgIHsNCiAgICBjYXNlIElTT190Og0KICAgICAgICAvKiBTZW5kIGEgdGV4dCBzdHJpbmcuICovDQogICAgICAgIGhzLT5zdGF0ZSA9IEhUVFBfVEVYVDsNCiAgICAgICAgaHMtPmRhdGFwdHIgPSAmaHMtPnNjcmlwdFsyXTsNCg0KICAgICAgICAvKiBDYWxjdWxhdGUgbGVuZ3RoIG9mIHN0cmluZy4gKi8NCiAgICAgICAgZm9yKCBpID0gMDsgaHMtPmRhdGFwdHJbaV0gIT0gSVNPX25sOyArK2kgKTsNCiAgICAgICAgaHMtPmNvdW50ID0gaTsNCiAgICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIElTT19jOg0KICAgICAgICAvKiBDYWxsIGEgZnVuY3Rpb24uICovDQogICAgICAgIGhzLT5zdGF0ZSA9IEhUVFBfRlVOQzsNCiAgICAgICAgaHMtPmRhdGFwdHIgPSBOVUxMOw0KICAgICAgICBocy0+Y291bnQgPSAwOw0KICAgICAgICBjZ2l0YWJbaHMtPnNjcmlwdFsyXSAtIElTT19hXSggMCApOw0KICAgICAgICBicmVhazsNCg0KICAgIGNhc2UgSVNPX2k6DQogICAgICAgIC8qIEluY2x1ZGUgYSBmaWxlLiAqLw0KICAgICAgICBocy0+c3RhdGUgPSBIVFRQX0ZJTEU7DQogICAgICAgIGlmKCAhZnNfb3BlbiggJmhzLT5zY3JpcHRbMl0sICZmc2ZpbGUgKSApDQogICAgICAgIHsNCiAgICAgICAgICAgIHVpcF9hYm9ydCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgaHMtPmRhdGFwdHIgPSBmc2ZpbGUuZGF0YTsNCiAgICAgICAgaHMtPmNvdW50ID0gZnNmaWxlLmxlbjsNCiAgICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIElTT19oYXNoOg0KICAgICAgICAvKiBDb21tZW50IGxpbmUuICovDQogICAgICAgIG5leHRfc2NyaXB0bGluZSgpOw0KICAgICAgICBnb3RvIGFnYWluOw0KDQogICAgY2FzZSBJU09fcGVyaW9kOg0KICAgICAgICAvKiBFbmQgb2Ygc2NyaXB0LiAqLw0KICAgICAgICBocy0+c3RhdGUgPSBIVFRQX0VORDsNCiAgICAgICAgdWlwX2Nsb3NlKCk7DQogICAgICAgIGJyZWFrOw0KDQogICAgZGVmYXVsdDoNCiAgICAgICAgdWlwX2Fib3J0KCk7DQogICAgICAgIGJyZWFrOw0KICAgIH0NCn0NCg0KLyoNCiAqIEB9IKMNCiAqIEB9DQogKi8NCg==