Improvement of DHCP code
wiegelj <[email protected]> Thu, 21 Nov 2019 10:07:01 +0100
| Newsgroups | gmane.comp.hardware.microcontrollers.ethernut |
|---|---|
| Message-ID | <[email protected]> |
SGkgZm9sa3MsCgpJIGRvbid0IGtub3cgaWYgYXR0YWNobWVudHMgYXJlIHdvcmtpbmcgaW4gdGhl IG1haWxpbmcgbGlzdCwgYnV0IEkgd2FudAp0byBzaGFyZSBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9m IHRoZSBkaGNwIHNvZnR3YXJlIGluIHRoZSBhdHRhY2hlbWVudC4gSXQKaXMgZGVyaXZlZCBmcm9t IHRoZSBldGhlcm51dC01LjEuMC0xIHZlcnNpb24gYW5kIGhhcyBhbiBhZGRpdGlvbmFsIGZpeApm cm9tIEhlbnJpayAoVGhhbmsgeW91IGZvciB0aGlzKS4KCkkgaG9wZSB0aGF0IHNvbWVvbmUgaXMg Y2hlY2tpbmcgaW4gdGhlIHNvdXJjZS4gSSBzcGVudCBhIGxvdCBvZiB0aW1lCmxvb2tpbmcgZm9y IHByb2JsZW1zIGluIHRoZSBkaGNwIGNvZGUuCgpCZXN0IHJlZ2FyZHMKCkrDtnJnCgotLS0tLS0t LS0tLS0tLSBuZXh0IHBhcnQgLS0tLS0tLS0tLS0tLS0KLyoNCiAqIENvcHlyaWdodCAoQykgMjAw MS0yMDA1IGJ5IGVnbml0ZSBTb2Z0d2FyZSBHbWJILiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoN CiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp dGggb3Igd2l0aG91dA0KICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zDQogKiBhcmUgbWV0Og0KICoNCiAqIDEuIFJlZGlz dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0 DQogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n IGRpc2NsYWltZXIuDQogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQ0KICogICAgZG9j dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry aWJ1dGlvbi4NCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJz IG5vciB0aGUgbmFtZXMgb2YNCiAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZA0KICogICAgZnJvbSB0aGlzIHNvZnR3YXJl IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICoNCiAqIFRISVMg U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC VVRPUlMNCiAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT LCBJTkNMVURJTkcsIEJVVCBOT1QNCiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTDQogKiBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KICogQ09QWVJJR0hU IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU LA0KICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB TUFHRVMgKElOQ0xVRElORywNCiAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUw0KICogT0YgVVNFLCBEQVRBLCBPUiBQ Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEDQogKiBBTkQg T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM SUFCSUxJVFksDQogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YNCiAqIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRg0KICogU1VDSCBEQU1BR0UuDQog Kg0KICogRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc2VlIGh0dHA6Ly93d3cuZXRoZXJudXQu ZGUvDQogKg0KICogLQ0KICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzIGJ5DQog KiAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdo dHMgcmVzZXJ2ZWQuDQogKg0KICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCiAqIGFyZSBtZXQ6 DQogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi b3ZlIGNvcHlyaWdodA0KICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCiAqICAgIG5vdGljZSwg dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0 aGUNCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3 aXRoIHRoZSBkaXN0cmlidXRpb24uDQogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2 ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycw0KICogICAgbWF5IGJlIHVz ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3 YXJlDQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCiAq DQogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklC VVRPUlMgYGBBUyBJUycnIEFORA0KICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQogKiBJTVBMSUVEIFdBUlJBTlRJ RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T RQ0KICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBD T05UUklCVVRPUlMgQkUgTElBQkxFDQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTA0KICogREFNQUdFUyAo SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg R09PRFMNCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig QlVTSU5FU1MgSU5URVJSVVBUSU9OKQ0KICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QNCiAqIExJQUJJTElU WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO IEFOWSBXQVkNCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YNCiAqIFNVQ0ggREFNQUdFLg0KICogLQ0KICogUG9y dGlvbnMgQ29weXJpZ2h0IChjKSAxOTkzIGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9u Lg0KICoNCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRl IHRoaXMgc29mdHdhcmUgZm9yIGFueQ0KICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlz IGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQ0KICogY29weXJpZ2h0IG5v dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcywgYW5k IHRoYXQNCiAqIHRoZSBuYW1lIG9mIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIG5vdCBi ZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yDQogKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0 cmlidXRpb24gb2YgdGhlIGRvY3VtZW50IG9yIHNvZnR3YXJlIHdpdGhvdXQNCiAqIHNwZWNpZmlj LCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uDQogKg0KICogVEhFIFNPRlRXQVJFIElTIFBST1ZJ REVEICJBUyBJUyIgQU5EIERJR0lUQUwgRVFVSVBNRU5UIENPUlAuIERJU0NMQUlNUyBBTEwNCiAq IFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJ TVBMSUVEIFdBUlJBTlRJRVMNCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gICBJ TiBOTyBFVkVOVCBTSEFMTCBESUdJVEFMIEVRVUlQTUVOVA0KICogQ09SUE9SQVRJT04gQkUgTElB QkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTA0K ICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1Mg T0YgVVNFLCBEQVRBIE9SDQogKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05U UkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUw0KICogQUNUSU9OLCBBUklTSU5HIE9V VCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElT DQogKiBTT0ZUV0FSRS4NCiAqLw0KDQovKiENCiAqIFxmaWxlIHByby9kaGNwYy5jDQogKiBcYnJp ZWYgREhDUCBjbGllbnQuDQogKg0KICogXHZlcmJhdGltDQogKg0KICogJExvZyQNCiAqIFJldmlz aW9uIDEuMjcgIDIwMDkvMDIvMTMgMTQ6NTI6MDUgIGhhcmFsZGtpcHANCiAqIEluY2x1ZGUgbWVt ZGVidWcuaCBmb3IgaGVhcCBtYW5hZ2VtZW50IGRlYnVnZ2luZyBzdXBwb3J0Lg0KICoNCiAqIFJl dmlzaW9uIDEuMjYgIDIwMDkvMDIvMDYgMTU6Mzc6NDAgIGhhcmFsZGtpcHANCiAqIEFkZGVkIHN0 YWNrIHNwYWNlIG11bHRpcGxpZXIgYW5kIGFkZGVuZC4gQWRqdXN0ZWQgc3RhY2sgc3BhY2UuDQog Kg0KICogUmV2aXNpb24gMS4yNSAgMjAwOS8wMS8xNyAxMToyNjo1MiAgaGFyYWxka2lwcA0KICog R2V0dGluZyByaWQgb2YgdHdvIHJlbWFpbmluZyBCU0QgdHlwZXMgaW4gZmF2b3Igb2Ygc3RkaW50 Lg0KICogUmVwbGFjZWQgJ3VfaW50JyBieSAndW5zaW5nZWQgaW50JyBhbmQgJ3VwdHJfdCcgYnkg J3VpbnRwdHJfdCcuDQogKg0KICogUmV2aXNpb24gMS4yNCAgMjAwOC8xMC8wNSAxNjo0NjoxNSAg aGFyYWxka2lwcA0KICogQWRkZWQgbWlzc2luZyBhdHRyaWJ1dGVzICdwYWNrZWQnLiBUaGlzIG1h eSBmaXggYSBwcm9ibGVtIHdpdGgNCiAqIGRpZmZlcmVudCBBUk0gY29tcGlsZXIgb3B0aW1pemF0 aW9uIHNldHRpbmdzLg0KICoNCiAqIFJldmlzaW9uIDEuMjMgIDIwMDgvMDgvMTEgMDc6MDA6MzQg IGhhcmFsZGtpcHANCiAqIEJTRCB0eXBlcyByZXBsYWNlZCBieSBzdGRpbnQgdHlwZXMgKGZlYXR1 cmUgcmVxdWVzdCAjMTI4MjcyMSkuDQogKg0KICogUmV2aXNpb24gMS4yMiAgMjAwNi8wOC8wMSAw NzozODo0MSAgaGFyYWxka2lwcA0KICogREhDUCBjbGllbnQgZmFpbGVkIGJlY2F1c2Ugb2YgYWxp Z25tZW50IGVycm9ycy4gUmVtb3ZlZCB0aGUgZGlzcGVuc2FibGUNCiAqICdwYWNrZWQnIGF0dHJp YnV0ZSBmcm9tIHRoZSBkeW5fY2ZnIHN0cnVjdHVyZS4NCiAqDQogKiBSZXZpc2lvbiAxLjIxICAy MDA2LzAxLzIzIDE5OjUyOjEwICBoYXJhbGRraXBwDQogKiBBZGRlZCByZXF1aXJlZCB0eXBlY2Fz dHMgYmVmb3JlIGxlZnQgc2hpZnQuDQogKg0KICogUmV2aXNpb24gMS4yMCAgMjAwNi8wMS8yMyAx NzozNTo1NCAgaGFyYWxka2lwcA0KICogQk9PVFAgYW5kIERZTkNGRyBzdHJ1Y3R1cmVzIG11c3Qg YmUgcGFja2VkLg0KICogRml4ZWQgbWVtb3J5IGFsaWdubWVudCBidWcsIHdoaWNoIHJldHJpZXZl ZCB3cm9uZyB2YWx1ZXMgZnJvbSBESENQIG9wdGlvbnMuDQogKg0KICogUmV2aXNpb24gMS4xOSAg MjAwNS8wOC8wMiAxNzo0NzowNCAgaGFyYWxka2lwcA0KICogTWFqb3IgQVBJIGRvY3VtZW50YXRp b24gdXBkYXRlLg0KICoNCiAqIFJldmlzaW9uIDEuMTggIDIwMDUvMDQvMDUgMTc6NDQ6NTcgIGhh cmFsZGtpcHANCiAqIE1hZGUgc3RhY2sgc3BhY2UgY29uZmlndXJhYmxlLg0KICoNCiAqIFJldmlz aW9uIDEuMTcgIDIwMDUvMDMvMjggMTg6MjY6NTkgIG1yam9uZXM0dQ0KICogRml4ZWQgbm9uLXJl bGVhc2UgYnVnIGluIERDSFAgY2xpZW50DQogKg0KICogUmV2aXNpb24gMS4xNiAgMjAwNS8wMi8w MyAxNDozMzo1NiAgaGFyYWxka2lwcA0KICogU2V2ZXJhbCBidWcgZml4ZXMgYW5kIGVuaGFuY2Vt ZW50cy4gVGhlIG1vc3QgaW1wb3J0YW50IGZpeCB3aWxsDQogKiBhdm9pZCBoYW5naW5nLCB3aGVu IEV0aGVybnV0IGlzIHJlc2V0IHdoaWxlIElDTVAgcGluZ3MgYXJlDQogKiByZWNlaXZlZC4gQSBs YXJnZSBudW1iZXIgb2YgY2hhbmdlcyBtYWtlIHRoZSBjbGllbnQgdG8gZm9sbG93DQogKiBSRkMg MjEzMSBtb3JlIGNsb3NlbHksIGxpa2UgbWFpbnRhaW5pbmcgcmVuZXdhbCBhbmQgcmViaW5kIHRp bWUuDQogKiBUd28gbmV3IEFQSSBjYWxscywgTnV0RGhjcFN0YXR1cygpIGFuZCBOdXREaGNwRXJy b3IoKSwgYWxsb3cNCiAqIHRvIHF1ZXJ5IHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgREhDUCBj bGllbnQuIFRoZSBwcmV2aW91c2x5DQogKiBpbnRyb2R1Y2VkIEFQSSBjYWxsIE51dERoY3BJc0Nv bmZpZ3VyZWQoKSBoYXMgYmVlbiBtYXJrZWQNCiAqIGRlcHJlY2F0ZWQuIEFub3RoZXIgcHJvYmxl bSB3YXMgd2l0aCB0aW1lb3V0LCBiZWNhdXNlIHRoZSBjbGllbnQNCiAqIGNvbnRpbnVlZCBuZWdv dGlhdGlvbiB3aXRoIHRoZSBzZXJ2ZXIgYWZ0ZXIgdGhlIHRpbWVvdXQgdGltZQ0KICogZ2l2ZW4g aW4gdGhlIEFQSSBjYWxsZWQgZWxhcHNlZC4gTm93IGFsbCBpbnRlcm5hbCB0aW1lb3V0cyBhcmUN CiAqIGFkanVzdGVkIHRvIHRoZSBBUEkgdGltZW91dC4gRnVydGhlcm1vcmUgdGhlIHByZXZpb3Vz IHZlcnNpb24NCiAqIGxldCB0aGUgY2xpZW50IGNvbnRpbnVlIG9uIGZhdGFsIGVycm9ycyBsaWtl IFVEUCByZWNlaXZlIG9yIFVEUA0KICogYnJvYWRjYXN0IGZhaWx1cmVzLiBOb3cgdGhlIGNsaWVu dCBzdG9wcyBvbiBzdWNoIGVycm9ycyBhbmQNCiAqIGluZm9ybXMgdGhlIGNhbGxlci4gRmluYWxs eSB0aGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiBlbmhhbmNlZC4NCiAqDQogKiBSZXZpc2lvbiAx LjE1ICAyMDA0LzEyLzMxIDEwOjUxOjQwICBkcnN1bmcNCiAqIEJ1Z2ZpeGVzIGZyb20gTWljaGVs IEhlbmRyaWtzIGFwcGxpZWQ6DQogKiBBbGxvY2F0ZSBlbXB0eSBkeW5jZmcncyB0byBwcmV2ZW50 IGZyZWVpbmcgdHdpY2Ugb2YgZG9tYWluL2hvc3RuYW1lDQogKiBDbGVhciBwb2ludGVyIGFmdGVy IFJlbGVhc2VEeW5DZmcgdG8gcHJldmVudCBmcmVlaW5nIHR3aWNlDQogKiBNYWtlIHN1cmUgU2Vs ZWN0T2ZmZXIgaXMgbmV2ZXIgY2FsbGVkIHdpdGggMCBvZmZlcnMNCiAqIFdoZW4gZmFsbGluZyBi YWNrIGZyb20gcmVib290aW5nIHRvIHNlbGVjdGluZywgY2xlYXINCiAqIHRoZSByZWNlaXZlZCBp cCBhZGRyZXNzIHNvIE51dERoY3BJZkNvbmZpZyBkb2VzIG5vdA0KICogYXNzdW1lIGl0IGhhcyBi ZWVuIGNvbmZpZ3VyZWQgcHJvcGVybHkNCiAqDQogKiBSZXZpc2lvbiAxLjE0ICAyMDA0LzA0LzE1 IDA3OjE2OjQ3ICBkcnN1bmcNCiAqIE5vdyBpdCB3b3Jrcy4uLiA6LS8NCiAqDQogKiBSZXZpc2lv biAxLjEzICAyMDA0LzA0LzE1IDA3OjExOjUwICBkcnN1bmcNCiAqIEFkZGVkIGhvc3RuYW1lIHN1 cHBvcnQgdG8gTnV0REhDUERpc2NvdmVyDQogKg0KICogUmV2aXNpb24gMS4xMiAgMjAwNC8wMy8x OCAxMToyNDowMSAgaGFyYWxka2lwcA0KICogRGVwcmVjYXRlZCBmdW5jdGlvbnMgcmVtb3ZlZA0K ICoNCiAqIFJldmlzaW9uIDEuMTEgIDIwMDQvMDMvMDMgMTc6NTM6MjggIGRyc3VuZw0KICogU3Vw cG9ydCBmb3IgbmV3IGZpZWxkICdob3N0bmFtZScgaW4gc3RydWN0dXJlIGNvbmZvcyBhZGRlZC4N CiAqDQogKiBSZXZpc2lvbiAxLjEwICAyMDA0LzAyLzI1IDE2OjM0OjMyICBoYXJhbGRraXBwDQog KiBOZXcgQVBJIGFkZGVkIHRvIHJlbGluZ3Vpc2ggdGhlIERIQ1AgbGVhc2UuIENvbGxlY3Rpbmcg bW9yZQ0KICogdGhhbiBvbmUgb2ZmZXIgaXMgbm93IGRpc2FibGVkLCBpZiB0aGUgYXBwbGljYXRp b24gc2V0cyB0aW1lb3V0DQogKiBiZWxvdyB0aHJlZSB0aW1lcyBvZiBNQVhfREhDUF9XQUlUICg1 IHNlY29uZHMpLiBUaGUgbGVhc2UgcmVuZXdhbA0KICogd2lsbCBub3cgc3RhcnQgd2hlbiAzLzQg aGFzIGVsYXBzZWQsIG9wcG9zZWQgdG8gMS8yIHVzZWQgcHJldmlvdXNseS4NCiAqIEZpbmFsbHkg dGhlIERIQ1AgdGhyZWFkIHdpbGwgc2xlZXAgYXMgbG9uZyBhcyBwb3NzaWJsZSwgd2hpbGUgdGhl DQogKiBwcmV2aW91cyB2ZXJzaW9uIHdva2UgdXAgZXZlcnkgdGVuIHNlY29uZHMuDQogKg0KICog UmV2aXNpb24gMS45ICAyMDA0LzAyLzAyIDE4OjU0OjQzICBkcnN1bmcNCiAqIGdhdGV3YXkgaXAg YWRkcmVzcyB3YXMgbm90IHNldCwgaWYgc3RhdGljIG5ldHdvcmsgY29uZmlndXJhdGlvbiBmcm9t IEVFUFJPTSBpcyB1c2VkLg0KICoNCiAqIFJldmlzaW9uIDEuOCAgMjAwNC8wMS8xNCAxNzo1MDo0 MSAgZHJzdW5nDQogKiBGaXggZm9yIFdpbjJrIERIQ1Agc2VydmVyIGFwcGxpZWQuIFRoYW5rcyB0 byBEYW1pYW4gU2xlZQ0KICoNCiAqIFJldmlzaW9uIDEuNyAgMjAwMy8xMS8wMyAxNjoyMjo1OSAg aGFyYWxka2lwcA0KICogUmVuZXdhbCBkaXNhYmxlZCBpZiBsZWFzZSB0aW1lIGlzIHNldCB0byB6 ZXJvDQogKg0KICogUmV2aXNpb24gMS42ICAyMDAzLzEwLzEzIDEwOjE4OjA4ICBoYXJhbGRraXBw DQogKiBVc2luZyBuZXcgc2Vjb25kcyBjb3VudGVyDQogKg0KICogUmV2aXNpb24gMS41ICAyMDAz LzA4LzA3IDA5OjA5OjA4ICBoYXJhbGRraXBwDQogKiBSZWRlc2lnbiB0byBmb2xsb3cgUkZDIDIx MzEgbW9yZSBjbG9zZWx5Lg0KICoNCiAqIFJldmlzaW9uIDEuNCAgMjAwMy8wNy8yMCAxODoyNTo0 MCAgaGFyYWxka2lwcA0KICogU3VwcG9ydCBzZWNvbmRhcnkgRE5TLg0KICoNCiAqIFJldmlzaW9u IDEuMyAgMjAwMy8wNy8xNyAwOTo0NDoxNCAgaGFyYWxka2lwcA0KICogUmVtb3ZlZCBkZWZhdWx0 IE1BQyBhZGRyZXNzIGFuZCBsZXQgdGhlIGNhbGxlciBoYXZlIGEgc2Vjb25kIGNoYW5jZS4NCiAq DQogKiBSZXZpc2lvbiAxLjIgIDIwMDMvMDUvMTUgMTQ6MjU6MzggIGhhcmFsZGtpcHANCiAqIFNv bWUgREhDUCBzZXJ2ZXJzIGRpc2NhcmQgZGlzY292ZXIgdGVsZWdyYW1zLg0KICogVGhhbmtzIHRv IFRvbW9oaXJvIEhhcmFpa2F3YS4NCiAqDQogKiBSZXZpc2lvbiAxLjEuMS4xICAyMDAzLzA1LzA5 IDE0OjQxOjU3ICBoYXJhbGRraXBwDQogKiBJbml0aWFsIHVzaW5nIDMuMi4xDQogKg0KICogXGVu ZHZlcmJhdGltDQogKi8NCg0KI2luY2x1ZGUgPGNmZy9vcy5oPg0KI2luY2x1ZGUgPHN5cy90aHJl YWQuaD4NCiNpbmNsdWRlIDxzeXMvZXZlbnQuaD4NCiNpbmNsdWRlIDxzeXMvdGltZXIuaD4NCiNp bmNsdWRlIDxzeXMvY29uZm5ldC5oPg0KI2luY2x1ZGUgPHN5cy9jb25mb3MuaD4NCg0KI2luY2x1 ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPHRpbWUuaD4NCiNp bmNsdWRlIDxtZW1kZWJ1Zy5oPg0KDQojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+DQojaW5jbHVkZSA8 bmV0aW5ldC9pbi5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4NCiNpbmNsdWRlIDxu ZXRkYi5oPg0KI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPg0KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4N CiNpbmNsdWRlIDxwcm8vZGhjcC5oPg0KDQojaWZkZWYgTlVUREVCVUcNCiNpbmNsdWRlIDxuZXQv bmV0ZGVidWcuaD4NCiNlbmRpZg0KDQojaWYgMA0KLyogVXNlIGZvciBsb2NhbCBkZWJ1Z2dpbmcu ICovDQojZGVmaW5lIE5VVERFQlVHDQojaW5jbHVkZSA8c3RkaW8uaD4NCiNkZWZpbmUgX190Y3Bf dHJzIHN0ZG91dA0Kc3RhdGljIHVpbnRfZmFzdDhfdCBfX3RjcF90cmYgPSAxOw0KI2VuZGlmDQoN Ci8qIQ0KICogXGFkZHRvZ3JvdXAgeGdESENQQw0KICovDQovKkB7Ki8NCg0KLyohDQogKiBcbmFt ZSBESENQIENsaWVudCBDb25maWd1cmF0aW9uDQogKg0KICogVGhlIE51dC9PUyBDb25maWd1cmF0 b3IgbWF5IGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVzLg0KICovDQovKkB7 Ki8NCg0KLyohDQogKiBcYnJpZWYgVURQIHBvcnQgb2YgREhDUCBzZXJ2ZXIuDQogKg0KICogXHNo b3dpbml0aWFsaXplcg0KICovDQojaWZuZGVmIERIQ1BfU0VSVkVSUE9SVA0KI2RlZmluZSBESENQ X1NFUlZFUlBPUlQgICAgICA2Nw0KI2VuZGlmDQoNCi8qIQ0KICogXGJyaWVmIFVEUCBwb3J0IG9m IERIQ1AgY2xpZW50Lg0KICoNCiAqIFxzaG93aW5pdGlhbGl6ZXINCiAqLw0KI2lmbmRlZiBESENQ X0NMSUVOVFBPUlQNCiNkZWZpbmUgREhDUF9DTElFTlRQT1JUICAgICAgNjgNCiNlbmRpZg0KDQov KiENCiAqIFxicmllZiBNYXhpbXVtIERIQ1AgbWVzc2FnZSBzaXplIHdlIGNhbiBhY2NlcHQuDQog Kg0KICogUkZDIDIxMzEgZGVtYW5kcywgdGhhdCBhIERIQ1AgY2xpZW50IG11c3QgYmUgcHJlcGFy ZWQgdG8gcmVjZWl2ZSBESENQDQogKiBtZXNzYWdlcyB3aXRoIGFuIG9wdGlvbnMgZmllbGQgbGVu Z3RoIG9mIGF0IGxlYXN0IDMxMiBvY3RldHMuIFRoaXMNCiAqIGltcGxpZXMgdGhhdCB3ZSBtdXN0 IGJlIGFibGUgdG8gYWNjZXB0IG1lc3NhZ2VzIG9mIHVwIHRvIDU3NiBvY3RldHMuDQogKg0KICog XHNob3dpbml0aWFsaXplcg0KICovDQojaWZuZGVmIE1BWF9ESENQX01TR1NJWkUNCiNkZWZpbmUg TUFYX0RIQ1BfTVNHU0laRSAgICA1NzYNCiNlbmRpZg0KDQovKiENCiAqIFxicmllZiBNaW5pbXVt IERIQ1AgbWVzc2FnZSBsZW5ndGguDQogKg0KICogVXNlZCB0byBtYWludGFpbiBCT09UUCBjb21w YXRpYmlsaXR5IG9mIG91dGdvaW5nIG1lc3NhZ2VzLg0KICoNCiAqIFxzaG93aW5pdGlhbGl6ZXIN CiAqLw0KI2lmbmRlZiBNSU5fREhDUF9NU0dTSVpFDQojZGVmaW5lIE1JTl9ESENQX01TR1NJWkUg ICAgMzAwDQojZW5kaWYNCg0KLyohDQogKiBcYnJpZWYgTWF4aW11bSBVRFAgYnVmZmVyIHNpemUg dXNlZCBieSB0aGUgREhDUCBjbGllbnQuDQogKg0KICogSWYgdGhpcyBpdGVtIGlzIG5vdCBlcXVh bCB6ZXJvLCB0aGUgREhDUCBjbGllbnQgd2lsbCB1c2UgaXRzIHZhbHVlIHRvDQogKiBzZXQgI1NP X1JDVkJVRiBieSBjYWxsaW5nIE51dFVkcFNldFNvY2tPcHQoKS4NCiAqDQogKiBJZiB0aGlzIGl0 ZW0gaXMgc2V0IHRvIHplcm8sIE51dFVkcFNldFNvY2tPcHQoKSBpcyBub3QgY2FsbGVkIGFuZCB0 aGUNCiAqIFVEUCBzb2NrZXQgaW50ZXJmYWNlIHdpbGwgYnVmZmVyIHRoZSBsYXN0IGluY29taW5n IGRhdGFncmFtIG9uIHRoZQ0KICogI0RIQ1BfQ0xJRU5UUE9SVCBzb2NrZXQgcG9ydCBvbmx5LiBB bnkgcHJldmlvdXNseSByZWNlaXZlZCBkYXRhZ3JhbSBpcw0KICogc2lsZW50bHkgZGlzY2FyZGVk LiBBcyBsb25nIGFzIG9uZSBESENQIHNlcnZlciBpcyBleHBlY3RlZCBpbiB0aGUgbG9jYWwNCiAq IG5ldHdvcmssIHRoaXMgd2lsbCBiZSBmaW5lIGFuZCBzYXZlIHNvbWUgaGVhcCBtZW1vcnkgd2hp bGUgREhDUCBpcw0KICogYWN0aXZlLg0KICoNCiAqIFxzaG93aW5pdGlhbGl6ZXINCiAqLw0KI2lm bmRlZiBNQVhfREhDUF9CVUZTSVpFDQojZGVmaW5lIE1BWF9ESENQX0JVRlNJWkUgICAgMTcyOA0K I2VuZGlmDQoNCi8qIQ0KICogXGJyaWVmIE1pbmltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0 byB3YWl0IGZvciBhIHJlc3BvbnNlLg0KICoNCiAqIElmIHdlIHJlY2VpdmUgbm8gcmVzcG9uc2Ug ZnJvbSBhIERIQ1Agc2VydmVyIHdpdGhpbiB0aGlzIHRpbWUsIHdlDQogKiB3aWxsIGRvdWJsZSB0 aGlzIHZhbHVlIHVwIHRvIFxyZWYgTUFYX0RIQ1BfV0FJVCBhbmQgcmVwZWF0IG91cg0KICogcmVx dWVzdCB1cCB0byBccmVmIE1BWF9EQ0hQX1JFVFJJRVMgdGltZXMgYmVmb3JlIGdpdmluZyB1cC4N CiAqDQogKiBcc2hvd2luaXRpYWxpemVyDQogKi8NCiNpZm5kZWYgTUlOX0RIQ1BfV0FJVA0KI2Rl ZmluZSBNSU5fREhDUF9XQUlUICAgICAgIDQwMDANCiNlbmRpZg0KDQovKiENCiAqIFxicmllZiBN YXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgYSByZXNwb25zZS4NCiAq DQogKiBUaGUgdGltZW91dCB2YWx1ZSBmb3IgcmVjZWl2aW5nIHNlcnZlciByZXNwb25zZXMgd2ls bCBiZSBkb3VibGVkDQogKiBvbiBlYWNoIHJldHJ5IGJ1dCBsaW1pdGVkIGJ5IHRoaXMgdmFsdWUu DQogKg0KICogXHNob3dpbml0aWFsaXplcg0KICovDQojaWZuZGVmIE1BWF9ESENQX1dBSVQNCiNk ZWZpbmUgTUFYX0RIQ1BfV0FJVCAgICAgICA2NDAwMA0KI2VuZGlmDQoNCi8qIQ0KICogXGJyaWVm IE1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3QgcmV0cmllcy4NCiAqDQogKiBXZSB3aWxsIGdpdmUg dXAgYWZ0ZXIgcmVzZW5kaW5nIHRoaXMgbnVtYmVyIG9mIHJlcXVlc3RzIHdpdGhvdXQNCiAqIHJl Y2VpdmluZyBhIHJlc3BvbnNlLg0KICoNCiAqIFxzaG93aW5pdGlhbGl6ZXINCiAqLw0KI2lmbmRl ZiBNQVhfRENIUF9SRVRSSUVTDQojZGVmaW5lIE1BWF9EQ0hQX1JFVFJJRVMgICAgMw0KI2VuZGlm DQoNCi8qIQ0KICogXGJyaWVmIE1heGltdW0gbnVtYmVyIG9mIHJlbGVhc2UgcmV0cmllcy4NCiAq DQogKiBSRkMgMjEzMSBkb2Vzbid0IHNwZWNpZnkgYSBzZXJ2ZXIgcmVzcG9uc2UgdG8gcmVsZWFz ZSBtZXNzYWdlcyBmcm9tDQogKiB0aGUgY2xpZW50LiBJZiB0aGUgbWVzc2FnZSBnZXRzIGxvc3Qs IHRoZW4gdGhlIGxlYXNlIGlzbid0IHJlbGVhc2VkLg0KICoNCiAqIFxzaG93aW5pdGlhbGl6ZXIN CiAqLw0KI2lmbmRlZiBNQVhfRENIUF9SRUxFQVNFX1JFVFJJRVMNCiNkZWZpbmUgTUFYX0RDSFBf UkVMRUFTRV9SRVRSSUVTICAgIDANCiNlbmRpZg0KDQovKiENCiAqIFxicmllZiBEZWZhdWx0IGxl YXNlIHRpbWUgaW4gc2Vjb25kcy4NCiAqDQogKiBUaGlzIHZhbHVlIGlzIHVzZWQgaWYgdGhlIHNl cnZlciBkb2Vzbid0IHByb3ZpZGUgYSBsZWFzZSB0aW1lLg0KICoNCiAqIFxzaG93aW5pdGlhbGl6 ZXINCiAqLw0KI2lmbmRlZiBESENQX0RFRkFVTFRfTEVBU0UNCiNkZWZpbmUgREhDUF9ERUZBVUxU X0xFQVNFICA0MzIwMA0KI2VuZGlmDQoNCi8qIQ0KICogXGJyaWVmIE1heGltdW0gc2xlZXAgdGlt ZSBpbiBzZWNvbmRzLg0KICoNCiAqIFxzaG93aW5pdGlhbGl6ZXINCiAqLw0KI2lmbmRlZiBNQVhf REhDUF9OQVBUSU1FDQojZGVmaW5lIE1BWF9ESENQX05BUFRJTUUgICAgNDI5NDk2Nw0KI2VuZGlm DQoNCi8qIQ0KICogXGJyaWVmIFN0YWNrIHNpemUgb2YgdGhlIERIQ1AgY2xpZW50IHRocmVhZC4N CiAqDQogKiBcc2hvd2luaXRpYWxpemVyDQogKi8NCiNpZm5kZWYgTlVUX1RIUkVBRF9ESENQU1RB Q0sNCiNpZiBkZWZpbmVkKF9fQVZSX18pDQojaWYgZGVmaW5lZChfX0dOVUNfXykNCi8qIGF2ci1n Y2Mgc2l6ZSBvcHRpbWl6ZWQgY29kZSB1c2VkIDE5MiBieXRlcy4gKi8NCiNkZWZpbmUgTlVUX1RI UkVBRF9ESENQU1RBQ0sgICAgMjg4DQojZWxzZQ0KLyogaWNjLWF2ciB2Ny4xOSB1c2VkIDM2MCBi eXRlcy4gKi8NCiNkZWZpbmUgTlVUX1RIUkVBRF9ESENQU1RBQ0sgICAgNTEyDQojZW5kaWYNCiNl bHNlDQovKiBhcm0tZWxmLWdjYyB1c2VkIDI3NiBieXRlcyB3aXRoIHNpemUgb3B0aW1pemVkLCA2 ODAgYnl0ZXMgd2l0aCBkZWJ1ZyBjb2RlLiAqLw0KLyogYXJtLW5vbmUtZWFiaSBjcmVhdGVzIHN0 YWNrIG92ZXJmbG93IHdpdGggMzg0IGJ5dGVzIG9uIEVJUiAxLjAgYm9hcmQuICovDQojZGVmaW5l IE5VVF9USFJFQURfREhDUFNUQUNLICAgIDUxMg0KI2VuZGlmDQojZW5kaWYNCg0KLypAfSovDQoN Ci8qIQ0KICogXG5hbWUgREhDUCBNZXNzYWdlIFR5cGVzDQogKg0KICogU2VlIFJGQyAyMTMxLg0K ICovDQovKkB7Ki8NCg0KLyohIFxicmllZiBDbGllbnQgYnJvYWRjYXN0IHRvIGxvY2F0ZSBhdmFp bGFibGUgc2VydmVycy4NCiAqLw0KI2RlZmluZSBESENQX0RJU0NPVkVSICAgMQ0KDQovKiEgXGJy aWVmIFNlcnZlciB0byBjbGllbnQgaW4gcmVzcG9uc2UgdG8gREhDUF9ESVNDT1ZFUi4NCiAqDQog KiBDb250YWlucyBhbiBvZmZlciBvZiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuDQogKi8NCiNk ZWZpbmUgREhDUF9PRkZFUiAgICAgIDINCg0KLyohIFxicmllZiBDbGllbnQgbWVzc2FnZSB0byBz ZXJ2ZXJzLg0KICoNCiAqIFVzZWQgZm9yDQogKiAtIHJlcXVlc3Rpbmcgb2ZmZXJlZCBwYXJhbWV0 ZXJzIGZyb20gb25lIHNlcnZlciBhbmQgaW1wbGljaXRseSBkZWNsaW5pbmcgb2ZmZXJzIGZyb20g YWxsIG90aGVycy4NCiAqIC0gY29uZmlybWluZyBjb3JyZWN0bmVzcyBvZiBwcmV2aW91c2x5IGFs bG9jYXRlZCBhZGRyZXNzIGFmdGVyLCBlLmcuLCBzeXN0ZW0gcmVib290Lg0KICogLSBleHRlbmRp bmcgdGhlIGxlYXNlIG9uIGEgcGFydGljdWxhciBuZXR3b3JrIGFkZHJlc3MuDQogKi8NCiNkZWZp bmUgREhDUF9SRVFVRVNUICAgIDMNCg0KLyohIFxicmllZiBDbGllbnQgdG8gc2VydmVyIGluZGlj YXRpbmcgbmV0d29yayBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdXNlLg0KICoNCiAqIE5vdCB1c2Vk IGJ5IE51dC9OZXQuDQogKi8NCiNkZWZpbmUgREhDUF9ERUNMSU5FICAgIDQNCg0KLyohIFxicmll ZiBTZXJ2ZXIgdG8gY2xpZW50IHdpdGggY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLg0KICoNCiAq IENvbnRhaW5zIGNvbW1pdHRlZCBuZXR3b3JrIGFkZHJlc3MuDQogKi8NCiNkZWZpbmUgREhDUF9B Q0sgICAgICAgIDUNCg0KLyohIFxicmllZiBTZXJ2ZXIgdG8gY2xpZW50IGluZGljYXRpbmcgY2xp ZW50J3Mgbm90aW9uIG9mIG5ldHdvcmsgYWRkcmVzcyBpcyBpbmNvcnJlY3QuDQogKg0KICogTWF5 IGJlIGNhdXNlZCBieSB0aGUgY2xpZW50J3MgbW92ZSB0byBuZXcgc3VibmV0IG9yIGJ5IGV4cGly YXRpb24gb2YgdGhlIGNsaWVudCdzIGxlYXNlLg0KICovDQojZGVmaW5lIERIQ1BfTkFLICAgICAg ICA2DQoNCi8qISBcYnJpZWYgQ2xpZW50IHRvIHNlcnZlciByZWxpbnF1aXNoaW5nIG5ldHdvcmsg YWRkcmVzcyBhbmQgY2FuY2VsbGluZyByZW1haW5pbmcgbGVhc2UuDQogKi8NCiNkZWZpbmUgREhD UF9SRUxFQVNFICAgIDcNCg0KLyohIFxicmllZiBDbGllbnQgdG8gc2VydmVyLCBhc2tpbmcgb25s eSBmb3IgbG9jYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLg0KICoNCiAqIFVzZWQsIGlmIHRo ZSBjbGllbnQgYWxyZWFkeSBoYXMgZXh0ZXJuYWxseSBjb25maWd1cmVkIG5ldHdvcmsgYWRkcmVz cy4NCiAqLw0KI2RlZmluZSBESENQX0lORk9STSAgICAgOA0KDQovKkB9Ki8NCg0KDQovKiENCiAq IFxuYW1lIERIQ1AgT3B0aW9ucw0KICoNCiAqIE51dC9OZXQgcmVjb2duaXplcyBhIHN1YnNldCBv ZiBvcHRpb25zIGRlZmluZWQgaW4gUkZDIDIxMzIuDQogKi8NCi8qQHsqLw0KDQovKiENCiAqIFxi cmllZiBESENQIHBhZCBvcHRpb24uDQogKg0KICogVGhlIHBhZCBvcHRpb24gY2FuIGJlIHVzZWQg dG8gY2F1c2Ugc3Vic2VxdWVudCBmaWVsZHMgdG8gYWxpZ24gb24NCiAqIHdvcmQgYm91bmRhcmll cy4NCiAqLw0KI2RlZmluZSBESENQT1BUX1BBRCAgICAgICAgICAwDQoNCi8qIQ0KICogXGJyaWVm IERIQ1Agc3VibmV0IG1hc2sgb3B0aW9uLg0KICovDQojZGVmaW5lIERIQ1BPUFRfTkVUTUFTSyAg ICAgIDENCg0KLyohDQogKiBcYnJpZWYgREhDUCByb3V0ZXIgb3B0aW9uLg0KICovDQojZGVmaW5l IERIQ1BPUFRfR0FURVdBWSAgICAgIDMNCg0KLyohDQogKiBcYnJpZWYgREhDUCBkb21haW4gbmFt ZSBzZXJ2ZXIgb3B0aW9uLg0KICovDQojZGVmaW5lIERIQ1BPUFRfRE5TICAgICAgICAgIDYNCg0K LyohDQogKiBcYnJpZWYgREhDUCBob3N0IG5hbWUgb3B0aW9uLg0KICovDQojZGVmaW5lIERIQ1BP UFRfSE9TVE5BTUUgICAgIDEyDQoNCi8qIQ0KICogXGJyaWVmIERIQ1AgZG9tYWluIG5hbWUgb3B0 aW9uLg0KICovDQojZGVmaW5lIERIQ1BPUFRfRE9NQUlOICAgICAgIDE1DQoNCi8qIQ0KICogXGJy aWVmIERIQ1AgYnJvYWRjYXN0IGFkZHJlc3Mgb3B0aW9uLg0KICovDQojZGVmaW5lIERIQ1BPUFRf QlJPQURDQVNUICAgIDI4DQoNCi8qIQ0KICogXGJyaWVmIERIQ1AgcmVxdWVzdGVkIElQIGFkZHJl c3Mgb3B0aW9uLg0KICovDQojZGVmaW5lIERIQ1BPUFRfUkVRRVNUSVAgICAgIDUwDQoNCi8qIQ0K ICogXGJyaWVmIERIQ1AgSVAgYWRkcmVzcyBsZWFzZSB0aW1lIG9wdGlvbi4NCiAqLw0KI2RlZmlu ZSBESENQT1BUX0xFQVNFVElNRSAgICA1MQ0KDQovKiENCiAqIFxicmllZiBESENQIG1lc3NhZ2Ug dHlwZSBvcHRpb24uDQogKi8NCiNkZWZpbmUgREhDUE9QVF9NU0dUWVBFICAgICAgNTMNCg0KLyoh DQogKiBcYnJpZWYgREhDUCBzZXJ2ZXIgaWRlbnRpZmllciBvcHRpb24uDQogKi8NCiNkZWZpbmUg REhDUE9QVF9TSUQgICAgICAgICAgNTQNCg0KLyohDQogKiBcYnJpZWYgREhDUCBwYXJhbWV0ZXIg cmVxdWVzdCBsaXN0IG9wdGlvbi4NCiAqLw0KI2RlZmluZSBESENQT1BUX1BBUkFNUkVRVUVTVCA1 NQ0KDQovKiENCiAqIFxicmllZiBNYXhpbXVtIERIQ1AgbWVzc2FnZSBzaXplIG9wdGlvbi4NCiAq Lw0KI2RlZmluZSBESENQT1BUX01BWE1TR1NJWkUgICA1Nw0KDQovKiENCiAqIFxicmllZiBESENQ IHJlbmV3YWwgdGltZSBvcHRpb24uDQogKi8NCiNkZWZpbmUgREhDUE9QVF9SRU5FV0FMVElNRSAg NTgNCg0KLyohDQogKiBcYnJpZWYgREhDUCByZWJpbmRpbmcgdGltZSBvcHRpb24uDQogKi8NCiNk ZWZpbmUgREhDUE9QVF9SRUJJTkRUSU1FICAgNTkNCg0KLyohDQogKiBcYnJpZWYgREhDUCBlbmQg b3B0aW9uLg0KICovDQojZGVmaW5lIERIQ1BPUFRfRU5EICAgICAgICAgIDI1NQ0KDQovKkB9Ki8N Cg0KLyohDQogKiBcYnJpZWYgQk9PVFAgbWVzc2FnZSBzdHJ1Y3R1cmUgdHlwZS4NCiAqLw0KdHlw ZWRlZiBzdHJ1Y3QgYm9vdHAgQk9PVFA7DQoNCi8qIQ0KICogXGJyaWVmIEJPT1RQIG1lc3NhZ2Ug c3RydWN0dXJlLg0KICovDQpzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGJvb3RwIHsN CiAgICB1aW50OF90IGJwX29wOyAgICAgICAgICAgICAgLyohPCBcYnJpZWYgUGFja2V0IG9wY29k ZSB0eXBlOiAxPXJlcXVlc3QsIDI9cmVwbHkgKi8NCiAgICB1aW50OF90IGJwX2h0eXBlOyAgICAg ICAgICAgLyohPCBcYnJpZWYgSGFyZHdhcmUgYWRkcmVzcyB0eXBlOiAxPUV0aGVybmV0ICovDQog ICAgdWludDhfdCBicF9obGVuOyAgICAgICAgICAgIC8qITwgXGJyaWVmIEhhcmR3YXJlIGFkZHJl c3MgbGVuZ3RoOiA2IGZvciBFdGhlcm5ldCAqLw0KICAgIHVpbnQ4X3QgYnBfaG9wczsgICAgICAg ICAgICAvKiE8IFxicmllZiBHYXRld2F5IGhvcHMgKi8NCiAgICB1aW50MzJfdCBicF94aWQ7ICAg ICAgICAgICAgICAvKiE8IFxicmllZiBUcmFuc2FjdGlvbiBJRCAqLw0KICAgIHVpbnQxNl90IGJw X3NlY3M7ICAgICAgICAgICAgLyohPCBcYnJpZWYgU2Vjb25kcyBzaW5jZSBib290IGJlZ2FuICov DQogICAgdWludDE2X3QgYnBfZmxhZ3M7ICAgICAgICAgICAvKiE8IFxicmllZiBSRkMxNTMyIGJy b2FkY2FzdCwgZXRjLiAqLw0KICAgIHVpbnQzMl90IGJwX2NpYWRkcjsgICAgICAgICAgIC8qITwg XGJyaWVmIENsaWVudCBJUCBhZGRyZXNzICovDQogICAgdWludDMyX3QgYnBfeWlhZGRyOyAgICAg ICAgICAgLyohPCBcYnJpZWYgJ1lvdXInIElQIGFkZHJlc3MgKi8NCiAgICB1aW50MzJfdCBicF9z aWFkZHI7ICAgICAgICAgICAvKiE8IFxicmllZiBTZXJ2ZXIgSVAgYWRkcmVzcyAqLw0KICAgIHVp bnQzMl90IGJwX2dpYWRkcjsgICAgICAgICAgIC8qITwgXGJyaWVmIEdhdGV3YXkgSVAgYWRkcmVz cyAqLw0KICAgIHVpbnQ4X3QgYnBfY2hhZGRyWzE2XTsgICAgICAvKiE8IFxicmllZiBDbGllbnQg aGFyZHdhcmUgYWRkcmVzcyAqLw0KICAgIGNoYXIgYnBfc25hbWVbNjRdOyAgICAgICAgICAvKiE8 IFxicmllZiBTZXJ2ZXIgaG9zdCBuYW1lICovDQogICAgY2hhciBicF9maWxlWzEyOF07ICAgICAg ICAgIC8qITwgXGJyaWVmIEJvb3QgZmlsZSBuYW1lICovDQogICAgdWludDhfdCBicF9vcHRpb25z WzMxMl07ICAgIC8qITwgXGJyaWVmIFZlbmRvci1zcGVjaWZpYyBhcmVhICovDQp9Ow0KDQovKiEN CiAqIFxicmllZiBEeW5hbWljIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIHR5cGUuDQogKi8NCnR5 cGVkZWYgc3RydWN0IGR5bl9jZmcgRFlOQ0ZHOw0KDQovKiENCiAqIFxicmllZiBEeW5hbWljIGNv bmZpZ3VyYXRpb24gc3RydWN0dXJlLg0KICovDQpzdHJ1Y3QgZHluX2NmZyB7DQogICAgdWludDhf dCBkeW5fbXNndHlwOyAgICAgICAgIC8qITwgXGJyaWVmIERIQ1AgbWVzc2FnZSB0eXBlICovDQog ICAgdWludDMyX3QgZHluX3lpYWRkcjsgICAgICAgICAgLyohPCBcYnJpZWYgT2ZmZXJlZCBJUCBh ZGRyZXNzLiAqLw0KICAgIHVpbnQzMl90IGR5bl9uZXRtYXNrOyAgICAgICAgIC8qITwgXGJyaWVm IExvY2FsIElQIG5ldG1hc2suICovDQogICAgdWludDMyX3QgZHluX2Jyb2FkY2FzdDsgICAgICAg LyohPCBcYnJpZWYgTG9jYWwgSVAgYnJvYWRjYXN0IGFkZHJlc3MuICovDQogICAgdWludDMyX3Qg ZHluX2dhdGV3YXk7ICAgICAgICAgLyohPCBcYnJpZWYgRGVmYXVsdCBnYXRlIElQIGFkZHJlc3Mu ICovDQogICAgdWludDMyX3QgZHluX3BkbnM7ICAgICAgICAgICAgLyohPCBcYnJpZWYgUHJpbWFy eSBETlMgSVAgYWRkcmVzcy4gKi8NCiAgICB1aW50MzJfdCBkeW5fc2RuczsgICAgICAgICAgICAv KiE8IFxicmllZiBTZWNvbmRhcnkgRE5TIElQIGFkZHJlc3MuICovDQogICAgdWludDMyX3QgZHlu X3NpZDsgICAgICAgICAgICAgLyohPCBcYnJpZWYgU2VydmVyIGlkZW50aWZpZXIuICovDQogICAg dWludDMyX3QgZHluX3JlbmV3YWxUaW1lOyAgICAgLyohPCBcYnJpZWYgUmVuZXdhbCB0aW1lIGlu IHNlY29uZHMuICovDQogICAgdWludDMyX3QgZHluX3JlYmluZFRpbWU7ICAgICAgLyohPCBcYnJp ZWYgUmViaW5kIHRpbWUgaW4gc2Vjb25kcy4gKi8NCiAgICB1aW50MzJfdCBkeW5fbGVhc2VUaW1l OyAgICAgICAvKiE8IFxicmllZiBPZmZlcmVkIGxlYXNlIHRpbWUgaW4gc2Vjb25kcy4gKi8NCiAg ICB1aW50OF90ICpkeW5faG9zdG5hbWU7ICAgICAgLyohPCBcYnJpZWYgTG9jYWwgaG9zdG5hbWUu ICovDQogICAgdWludDhfdCAqZHluX2RvbWFpbjsgICAgICAgIC8qITwgXGJyaWVmIE5hbWUgb2Yg bG9jYWwgZG9tYWluLiAqLw0KfTsNCg0KLyohDQogKiBcYnJpZWYgQ3VycmVudCBjb25maWd1cmF0 aW9uLg0KICoNCiAqIFRoaXMgc3RydWN0dXJlIGlzIGZpbGxlZCBieSBwYXJzaW5nIG9mZmVyIG9y IGFja25vd2xlZGdlIG1lc3NhZ2VzIGZyb20NCiAqIHRoZSBzZXJ2ZXIuDQogKi8NCnN0YXRpYyBE WU5DRkcgKmRoY3BDb25maWc7DQoNCi8qIQ0KICogXGJyaWVmIENsaWVudCB0aHJlYWQgaWRlbnRp Zmllci4NCiAqDQogKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgY2xpZW50IHRocmVhZCBpcyBy dW5uaW5nLiBaZXJvIGluZGljYXRlcyB0aGF0DQogKiBpdCBpcyBub3QuDQogKi8NCnN0YXRpYyBI QU5ETEUgZGhjcFRocmVhZDsNCg0KLyohDQogKiBcYnJpZWYgQ3VycmVudCBzdGF0ZSBvZiB0aGUg REhDUCBjbGllbnQgc3RhdGUgbWFjaGluZS4NCiAqLw0Kc3RhdGljIHVpbnQ4X3QgZGhjcFN0YXRl Ow0KDQovKiENCiAqIFxicmllZiBMYXRlc3QgREhDUCBlcnJvciBjb2RlLg0KICovDQpzdGF0aWMg aW50IGRoY3BFcnJvcjsNCg0KLyohDQogKiBcYnJpZWYgREhDUCB3YWtlIHVwIHF1ZXVlLg0KICoN CiAqIFRoZSBESENQIHN0YXRlIG1hY2hpbmUgY2FuIGJlIHdva2VuIHVwIGJ5IHBvc3RpbmcgdG8g dGhpcyBxdWV1ZS4NCiAqLw0Kc3RhdGljIEhBTkRMRSBkaGNwV2FrZTsNCg0KLyohDQogKiBcYnJp ZWYgREhDUCB3YWl0aW5nIHF1ZXVlLg0KICoNCiAqIEFwcGxpY2F0aW9uIHRocmVhZHMgd2FpdCBv biB0aGlzIHF1ZXVlIHVudGlsIERIQ1Agc3VjY2VzcyBvciBmYWlsdXJlLg0KICovDQpzdGF0aWMg SEFORExFIGRoY3BEb25lOw0KDQovKiENCiAqIFxicmllZiBNYXhpbXVtIG51bWJlciBvZiBtaWxs aXNlY29uZHMgdG8gd2FpdCBvbiBccmVmIGRoY3BEb25lLg0KICoNCiAqIFNwZWNpZmllZCBieSB0 aGUgYXBwbGljYXRpb24gd2hlbiBjYWxsaW5nIHRoZSBESENQIGNsaWVudCBBUEkuDQogKi8NCnN0 YXRpYyB1aW50MzJfdCBkaGNwQXBpVGltZW91dDsNCg0KLyohDQogKiBcYnJpZWYgVGltZSBhdCB3 aGljaCB0aGUgYXBwbGljYXRpb24gc3RhcnRlZCB0byB3YWl0Lg0KICoNCiAqIFVzZWQgaW4gY29u anVuY3Rpb24gd2l0aCBccmVmIGRoY3BBcGlUaW1lb3V0IHRvIGxpbWl0IHRoZSBtYXhpbXVtDQog KiB3YWl0IHRpbWUgZm9yIHNlcnZlciByZXNwb25zZXMuDQogKi8NCnN0YXRpYyB1aW50MzJfdCBk aGNwQXBpU3RhcnQ7DQoNCi8qIQ0KICogXGJyaWVmIERIQ1AgZGV2aWNlLg0KICoNCiAqIFRoZSBB Uk0gcG9ydCBkb2Vzbid0IHByb3ZpZGUgcGFyYW1ldGVyIHBhc3NpbmcgdG8gdGhyZWFkIHJvdXRp bmVzLg0KICogVGh1cyB3ZSB1c2UgYSBnbG9iYWwgdmFyaWFibGUgdG8gc3RvcmUgdGhlIE5VVERF VklDRSBwb2ludGVyLg0KICovDQojaWZkZWYgX19hcm1fXw0Kc3RhdGljIE5VVERFVklDRSAqZGhj cERldjsNCiNlbmRpZg0KDQovKiENCiAqIFxicmllZiBEeW5hbWljIHN0cmluZyBjb3B5Lg0KICoN CiAqIFxwYXJhbSBkc3QgUG9pbnRzIHRvIGEgc3RyaW5nIHBvaW50ZXIuIElmIHRoZSBwb2ludGVy IGlzIG5vdCBOVUxMLCBpdA0KICogICAgICAgICAgICBpcyBhc3N1bWVkIHRoYXQgaXQgcG9pbnRz IHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVyDQogKiAgICAgICAgICAgIGFuZCB0aGlz IGJ1ZmZlciB3aWxsIGJlIHJlbGVhc2VkIGZpcnN0LiBUaGVuIGEgbmV3IGJ1ZmZlcg0KICogICAg ICAgICAgICB3aWxsIGJlIGFsbG9jYXRlZCBhbmQgdGhlIHNvdXJjZSBzdHJpbmcgd2lsbCBiZSBj b3BpZWQgdG8NCiAqICAgICAgICAgICAgdGhpcyBidWZmZXIuDQogKiBccGFyYW0gc3JjIFRoZSBz b3VyY2Ugc3RyaW5nLiBObyBkZWxpbWl0ZXIgcmVxdWlyZWQuDQogKiBccGFyYW0gbGVuIExlbmd0 aCBvZiB0aGUgc291cmNlIHN0cmluZy4NCiAqLw0Kc3RhdGljIHZvaWQgY29weV9zdHIodWludDhf dCAqKiBkc3QsIHZvaWQgKnNyYywgaW50IGxlbikNCnsNCiAgICBpZiAoKmRzdCkgew0KICAgICAg ICBmcmVlKCpkc3QpOw0KICAgIH0NCiAgICBpZiAoKCpkc3QgPSBtYWxsb2MobGVuICsgMSkpICE9 IDApIHsNCiAgICAgICAgaWYgKGxlbikgew0KICAgICAgICAgICAgbWVtY3B5KCpkc3QsIHNyYywg bGVuKTsNCiAgICAgICAgfQ0KICAgICAgICAqKCpkc3QgKyBsZW4pID0gMDsNCiAgICB9DQp9DQoN Ci8qIQ0KICogXGJyaWVmIFJlbGVhc2UgRFlOQ0ZHIHN0cnVjdHVyZS4NCiAqDQogKiBGcmVlcyBh bGwgbWVtb3J5IG9jY3VwaWVkIGJ5IGEgXHJlZiBEWU5DRkcgc3RydWN0dXJlLg0KICoNCiAqIFxw YXJhbSBkeW5jZmcgVGhpcyBzdHJ1Y3R1cmUgd2lsbCBiZSByZWxlYXNlZC4NCiAqLw0Kc3RhdGlj IHZvaWQgUmVsZWFzZUR5bkNmZyhEWU5DRkcgKiBkeW5jZmcpDQp7DQogICAgaWYgKGR5bmNmZykg ew0KICAgICAgICBpZiAoZHluY2ZnLT5keW5faG9zdG5hbWUpIHsNCiAgICAgICAgICAgIGZyZWUo ZHluY2ZnLT5keW5faG9zdG5hbWUpOw0KICAgICAgICB9DQogICAgICAgIGlmIChkeW5jZmctPmR5 bl9kb21haW4pIHsNCiAgICAgICAgICAgIGZyZWUoZHluY2ZnLT5keW5fZG9tYWluKTsNCiAgICAg ICAgfQ0KICAgICAgICBmcmVlKGR5bmNmZyk7DQogICAgfQ0KfQ0KDQovKiENCiAqIFxicmllZiBQ YXJzZSBhIERIQ1AgcmVwbHkgbWVzc2FnZS4NCiAqDQogKiBccGFyYW0gYnAgIFBvaW50ZXIgdG8g dGhlIHJlcGx5IG1lc3NhZ2UuIFRoZSBjYWxsZXIgbXVzdCBtYWtlIHN1cmUsDQogKiAgICAgICAg ICAgIHRoYXQgdGhpcyBjb250YWlucyBhIHZhbGlkIEJPT1RQIHJlcGx5IGhlYWRlciB3aXRoIGF0 DQogKiAgICAgICAgICAgIGxlYXN0IGZpdmUgYnl0ZXMgaW4gdGhlIG9wdGlvbnMgZmllbGQuDQog KiBccGFyYW0gbGVuIE51bWJlciBvZiB2YWxpZCBieXRlcyBpbiB0aGUgcmVwbHkgbWVzc2FnZS4N CiAqDQogKiBccmV0dXJuIFBvaW50ZXIgdG8gY29uZmlnIHN0cnVjdHVyZS4gTXVzdCBiZSByZWxl YXNlZCBieSB0aGUgY2FsbGVyLg0KICogICAgICAgICBOVUxMIGlzIHJldHVybmVkIGluIGNhc2Ug b2YgcGFyc2luZyBlcnJvcnMuDQogKi8NCnN0YXRpYyBEWU5DRkcgKlBhcnNlUmVwbHkoQk9PVFAg KmJwLCBpbnQgbGVuKQ0Kew0KICAgIHVpbnQ4X3QgKm9wOw0KICAgIGludCBsZWZ0Ow0KICAgIERZ TkNGRyAqY2ZncDsNCg0KICAgIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHN0cnVj dHVyZS4gKi8NCiAgICBpZiAoKGNmZ3AgPSBtYWxsb2Moc2l6ZW9mKERZTkNGRykpKSA9PSAwKSB7 DQogICAgICAgIHJldHVybiAwOw0KICAgIH0NCiAgICBtZW1zZXQoY2ZncCwgMCwgc2l6ZW9mKERZ TkNGRykpOw0KICAgIGNmZ3AtPmR5bl9sZWFzZVRpbWUgPSBESENQX0RFRkFVTFRfTEVBU0U7DQoN CiAgICAvKiBTZXQgdGhlIGFzc2lnbmVkIElQIGFkZHJlc3MuICovDQogICAgbWVtY3B5KCZjZmdw LT5keW5feWlhZGRyLCAmYnAtPmJwX3lpYWRkciwgNCk7DQoNCiAgICAvKg0KICAgICAqIFBhcnNl IG9wdGlvbnMgdW50aWwgYW4gZW5kIG9wdGlvbiBpcyBmb3VuZCBvciB1bnRpbCB3ZSByZWFjaGVk DQogICAgICogdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4NCiAgICAgKi8NCiAgICBvcCA9IGJwLT5i cF9vcHRpb25zICsgNDsNCiAgICBsZWZ0ID0gbGVuIC0gKHNpemVvZigqYnApIC0gc2l6ZW9mKGJw LT5icF9vcHRpb25zKSkgLSA0Ow0KICAgIHdoaWxlICgqb3AgIT0gREhDUE9QVF9FTkQgJiYgbGVm dCA+IDApIHsNCiAgICAgICAgdWludDhfdCBvbDsNCg0KI2lmZGVmIE5VVERFQlVHDQogICAgICAg IGlmIChfX3RjcF90cmYpIHsNCiAgICAgICAgICAgIGZwcmludGYoX190Y3BfdHJzLCAiW0RIQ1At T3B0LSV1XSIsICpvcCk7DQogICAgICAgIH0NCiNlbmRpZg0KICAgICAgICAvKiBQYWQgb3B0aW9u IGlzIHVzZWQgZm9yIGJvdW5kYXJ5IGFsaWdubWVudC4gKi8NCiAgICAgICAgaWYgKCpvcCA9PSBE SENQT1BUX1BBRCkgew0KICAgICAgICAgICAgb3ArKzsNCiAgICAgICAgICAgIGxlZnQtLTsNCiAg ICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQoNCiAgICAgICAgLyogUmVqZWN0IGlmIG9w dGlvbiBsZW5ndGggZXhjZWVkcyB0b3RhbCBsZW5ndGguICovDQogICAgICAgIGlmICgob2wgPSAq KG9wICsgMSkpID4gbGVmdCkgew0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAg ICAgICAvKiBUeXBlIG9mIHRoaXMgbWVzc2FnZS4gKi8NCiAgICAgICAgaWYgKCpvcCA9PSBESENQ T1BUX01TR1RZUEUpIHsNCiAgICAgICAgICAgIGlmIChvbCAhPSAxKSB7DQogICAgICAgICAgICAg ICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjZmdwLT5keW5fbXNndHlwID0g KihvcCArIDIpOw0KDQojaWZkZWYgTlVUREVCVUcNCiAgICAgICAgICAgIGlmIChfX3RjcF90cmYg JiBORVRfREJHX0RIQ1ApIHsNCiAgICAgICAgICAgICAgICBzd2l0Y2goY2ZncC0+ZHluX21zZ3R5 cCkgew0KICAgICAgICAgICAgICAgICAgICBjYXNlIERIQ1BfT0ZGRVI6DQogICAgICAgICAgICAg ICAgICAgICAgICBmcHJpbnRmKF9fdGNwX3RycywgIitNU0dULU9GRkVSK1xuIik7DQogICAgICAg ICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSBESENQX0FD SzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoX190Y3BfdHJzLCAiK01TR1QtQUNL K1xuIik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAg ICAgY2FzZSBESENQX05BSzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoX190Y3Bf dHJzLCAiLU1TR1QtTkFLLVxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAg ICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgIGZwcmlu dGYoX190Y3BfdHJzLCAiI01TR1QtVU5LI1xuIik7DQogICAgICAgICAgICAgICAgICAgICAgICBi cmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQojZW5kaWYNCiAgICAgICAg fQ0KICAgICAgICAvKiBPdXIgaG9zdCBuYW1lLiBNYXkgb3IgbWF5IG5vdCBpbmNsdWRlIHRoZSBk b21haW4uICovDQogICAgICAgIGVsc2UgaWYgKCpvcCA9PSBESENQT1BUX0hPU1ROQU1FKSB7DQog ICAgICAgICAgICBjb3B5X3N0cigmY2ZncC0+ZHluX2hvc3RuYW1lLCBvcCArIDIsIG9sKTsNCiAg ICAgICAgfQ0KICAgICAgICAvKiBOYW1lIG9mIHRoZSBkb21haW4gd2UgYXJlIGluLiAqLw0KICAg ICAgICBlbHNlIGlmICgqb3AgPT0gREhDUE9QVF9ET01BSU4pIHsNCiAgICAgICAgICAgIGNvcHlf c3RyKCZjZmdwLT5keW5fZG9tYWluLCBvcCArIDIsIG9sKTsNCiAgICAgICAgfQ0KDQogICAgICAg IC8qIEFsbCByZW1haW5pbmcgb3B0aW9ucyByZXF1aXJlIGF0IGxlYXN0IDQgb2N0ZXRzLiAqLw0K ICAgICAgICBlbHNlIGlmIChvbCA+PSA0KSB7DQogICAgICAgICAgICAvKiBQcmVzZXQgbW9zdCBv ZnRlbiB1c2VkIGxvbmcgdmFsdWUuICovDQogICAgICAgICAgICB1aW50MzJfdCBsdmFsID0gKihv cCArIDIpOw0KICAgICAgICAgICAgbHZhbCArPSAodWludDMyX3QpKCoob3AgKyAzKSkgPDwgODsN CiAgICAgICAgICAgIGx2YWwgKz0gKHVpbnQzMl90KSgqKG9wICsgNCkpIDw8IDE2Ow0KICAgICAg ICAgICAgbHZhbCArPSAodWludDMyX3QpKCoob3AgKyA1KSkgPDwgMjQ7DQoNCiAgICAgICAgICAg IC8qIE91ciBJUCBuZXR3b3JrIG1hc2suICovDQogICAgICAgICAgICBpZiAoKm9wID09IERIQ1BP UFRfTkVUTUFTSykgew0KICAgICAgICAgICAgICAgIGNmZ3AtPmR5bl9uZXRtYXNrID0gbHZhbDsN CiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8qIE91ciBJUCBicm9hZGNhc3QgYWRkcmVzcy4g Ki8NCiAgICAgICAgICAgIGVsc2UgaWYgKCpvcCA9PSBESENQT1BUX0JST0FEQ0FTVCkgew0KICAg ICAgICAgICAgICAgIGNmZ3AtPmR5bl9icm9hZGNhc3QgPSBsdmFsOw0KICAgICAgICAgICAgfQ0K ICAgICAgICAgICAgLyogT3VyIElQIGRlZmF1bHQgZ2F0ZS4gTW9yZSB0aGFuIG9uZSBnYXRld2F5 IG1heSBiZQ0KICAgICAgICAgICAgICAgc3BlY2lmaWVkLiBXZSB0YWtlIHRoZSBmaXN0IG9uZSBv bmx5IGFuZCBpZ25vcmUgdGhlDQogICAgICAgICAgICAgICByZXN0LiAqLw0KICAgICAgICAgICAg ZWxzZSBpZiAoKm9wID09IERIQ1BPUFRfR0FURVdBWSkgew0KICAgICAgICAgICAgICAgIGNmZ3At PmR5bl9nYXRld2F5ID0gbHZhbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8qIE91ciBE TlMgc2VydmVyLiBVcGRhdGVkIGJ5IEplbGxlIE1hcnRpam4gS29rIHRvDQogICAgICAgICAgICAg ICBzdXBwb3J0IGEgc2Vjb25kYXJ5IEROUy4gKi8NCiAgICAgICAgICAgIGVsc2UgaWYgKCpvcCA9 PSBESENQT1BUX0ROUykgew0KICAgICAgICAgICAgICAgIGNmZ3AtPmR5bl9wZG5zID0gbHZhbDsN CiAgICAgICAgICAgICAgICBpZiAob2wgPj0gOCkgew0KICAgICAgICAgICAgICAgICAgICBjZmdw LT5keW5fc2RucyA9ICoob3AgKyA2KTsNCiAgICAgICAgICAgICAgICAgICAgY2ZncC0+ZHluX3Nk bnMgKz0gKHVpbnQzMl90KSgqKG9wICsgNykpIDw8IDg7DQogICAgICAgICAgICAgICAgICAgIGNm Z3AtPmR5bl9zZG5zICs9ICh1aW50MzJfdCkoKihvcCArIDgpKSA8PCAxNjsNCiAgICAgICAgICAg ICAgICAgICAgY2ZncC0+ZHluX3NkbnMgKz0gKHVpbnQzMl90KSgqKG9wICsgOSkpIDw8IDI0Ow0K ICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8qIFNlcnZlciBp ZGVudGlmaWVyLiAqLw0KICAgICAgICAgICAgZWxzZSBpZiAoKm9wID09IERIQ1BPUFRfU0lEKSB7 DQogICAgICAgICAgICAgICAgY2ZncC0+ZHluX3NpZCA9IGx2YWw7DQogICAgICAgICAgICB9DQog ICAgICAgICAgICAvKiBSZW5ld2FsIHRpbWUuICovDQogICAgICAgICAgICBlbHNlIGlmICgqb3Ag PT0gREhDUE9QVF9SRU5FV0FMVElNRSkgew0KICAgICAgICAgICAgICAgIGNmZ3AtPmR5bl9yZW5l d2FsVGltZSA9IG50b2hsKGx2YWwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLyogUmVi aW5kaW5nIHRpbWUuICovDQogICAgICAgICAgICBlbHNlIGlmICgqb3AgPT0gREhDUE9QVF9SRUJJ TkRUSU1FKSB7DQogICAgICAgICAgICAgICAgY2ZncC0+ZHluX3JlYmluZFRpbWUgPSBudG9obChs dmFsKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8qIFRvdGFsIGxlYXNlIHRpbWUgZ3Jh bnRlZC4gKi8NCiAgICAgICAgICAgIGVsc2UgaWYgKCpvcCA9PSBESENQT1BUX0xFQVNFVElNRSkg ew0KICAgICAgICAgICAgICAgIGNmZ3AtPmR5bl9sZWFzZVRpbWUgPSBudG9obChsdmFsKTsNCiAg ICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBvcCArPSBvbCArIDI7DQogICAgICAgIGxl ZnQgLT0gb2wgKyAyOw0KICAgIH0NCg0KICAgIC8qDQogICAgICogRGlzY2FyZCB0aGlzIGNvbmZp Z3VyYXRpb24gaWYgcGFyc2luZyBzdG9wcGVkIGJlZm9yZSByZWFjaGluZw0KICAgICAqIHRoZSBl bmQgb3B0aW9uIG9yIGlmIHdlIGRpZG4ndCByZWNlaXZlIGFuIGV4cGVjdGVkIG1lc3NhZ2UgdHlw ZS4NCiAgICAgKi8NCiAgICBpZiAoKm9wICE9IERIQ1BPUFRfRU5EIHx8DQogICAgICAgIChjZmdw LT5keW5fbXNndHlwICE9IERIQ1BfT0ZGRVIgJiYNCiAgICAgICAgIGNmZ3AtPmR5bl9tc2d0eXAg IT0gREhDUF9BQ0sgJiYNCiAgICAgICAgIGNmZ3AtPmR5bl9tc2d0eXAgIT0gREhDUF9OQUspKSB7 DQojaWZkZWYgTlVUREVCVUcNCiAgICAgICAgaWYgKF9fdGNwX3RyZiAmIE5FVF9EQkdfREhDUCkg ew0KICAgICAgICAgICAgZnByaW50ZihfX3RjcF90cnMsICJbREhDUC1QYXJzZSBFcnJvcl0iKTsN CiAgICAgICAgfQ0KI2VuZGlmDQogICAgICAgIFJlbGVhc2VEeW5DZmcoY2ZncCk7DQogICAgICAg IHJldHVybiAwOw0KICAgIH0NCg0KICAgIC8qIENhbGN1bGF0ZSByZW5ld2FsIGFuZCByZWJpbmQg dGltZXMuICovDQogICAgaWYgKGNmZ3AtPmR5bl9yZW5ld2FsVGltZSA9PSAwKSB7DQogICAgICAg IGNmZ3AtPmR5bl9yZW5ld2FsVGltZSA9IGNmZ3AtPmR5bl9sZWFzZVRpbWUgLyAyOw0KICAgIH0N CiAgICBpZiAoY2ZncC0+ZHluX3JlYmluZFRpbWUgPT0gMCkgew0KICAgICAgICBjZmdwLT5keW5f cmViaW5kVGltZSA9IGNmZ3AtPmR5bl9yZW5ld2FsVGltZSArICAvKiAqLw0KICAgICAgICAgICAg Y2ZncC0+ZHluX3JlbmV3YWxUaW1lIC8gMiArIC8qICovDQogICAgICAgICAgICBjZmdwLT5keW5f cmVuZXdhbFRpbWUgLyA0Ow0KICAgIH0NCiAgICByZXR1cm4gY2ZncDsNCn0NCg0KLyohDQogKiBc YnJpZWYgQWRkIHZhcmlhYmxlIGxlbmd0aCBvcHRpb24uDQogKg0KICogXHBhcmFtIG9wICBQb2lu dGVyIGludG8gdGhlIG9wdGlvbiBidWZmZXIuDQogKiBccGFyYW0gb3QgIE9wdGlvbiB0eXBlLg0K ICogXHBhcmFtIG92ICBQb2ludGVyIHRvIGJ1ZmZlciB0byBjb3B5IGZyb20uDQogKiBccGFyYW0g bGVuIE51bWJlciBvZiBvY3RldHMgdG8gY29weS4NCiAqDQogKiBccmV0dXJuIFRvdGFsIG51bWJl ciBvZiBvY3RldHMgYWRkZWQsIGluY2x1ZGUgdHlwZSBhbmQgbGVuZ3RoLg0KICovDQpzdGF0aWMg c2l6ZV90IERoY3BBZGRPcHRpb24odWludDhfdCAqIG9wLCB1aW50OF90IG90LCB2b2lkICpvdiwg dWludDhfdCBsZW4pDQp7DQogICAgKm9wKysgPSBvdDsNCiAgICAqb3ArKyA9IGxlbjsNCiAgICBt ZW1jcHkob3AsIG92LCBsZW4pOw0KDQogICAgcmV0dXJuIDIgKyBsZW47DQp9DQoNCi8qIQ0KICog XGJyaWVmIEFkZCBzaW5nbGUgb2N0ZXQgb3B0aW9uLg0KICoNCiAqIFxwYXJhbSBvcCBQb2ludGVy IGludG8gdGhlIG9wdGlvbiBidWZmZXIuDQogKiBccGFyYW0gb3QgT3B0aW9uIHR5cGUuDQogKiBc cGFyYW0gb3YgT3B0aW9uIHZhbHVlLg0KICoNCiAqIFxyZXR1cm4gVG90YWwgbnVtYmVyIG9mIG9j dGV0cyBhZGRlZCwgaW5jbHVkZSB0eXBlIGFuZCBsZW5ndGguDQogKi8NCnN0YXRpYyBzaXplX3Qg RGhjcEFkZEJ5dGVPcHRpb24odWludDhfdCAqIG9wLCB1aW50OF90IG90LCB1aW50OF90IG92KQ0K ew0KICAgICpvcCsrID0gb3Q7DQogICAgKm9wKysgPSAxOw0KICAgICpvcCsrID0gb3Y7DQoNCiAg ICByZXR1cm4gMzsNCn0NCg0KLyohDQogKiBcYnJpZWYgQWRkIGRvdWJsZSBvY3RldCBvcHRpb24u DQogKg0KICogXHBhcmFtIG9wIFBvaW50ZXIgaW50byB0aGUgb3B0aW9uIGJ1ZmZlci4NCiAqIFxw YXJhbSBvdCBPcHRpb24gdHlwZS4NCiAqIFxwYXJhbSBvdiBPcHRpb24gdmFsdWUgaW4gaG9zdCBi eXRlIG9yZGVyLiBXaWxsIGJlIGNvbnZlcnRlZCB0byBuZXR3b3JrDQogKiAgICAgICAgICAgYnl0 ZSBvcmRlci4NCiAqDQogKiBccmV0dXJuIFRvdGFsIG51bWJlciBvZiBvY3RldHMgYWRkZWQsIGlu Y2x1ZGUgdHlwZSBhbmQgbGVuZ3RoLg0KICovDQpzdGF0aWMgc2l6ZV90IERoY3BBZGRTaG9ydE9w dGlvbih1aW50OF90ICogb3AsIHVpbnQ4X3Qgb3QsIHVpbnQxNl90IG92KQ0Kew0KICAgICpvcCsr ID0gb3Q7DQogICAgKm9wKysgPSAyOw0KICAgIG92ID0gaHRvbnMob3YpOw0KICAgIG1lbWNweShv cCwgJm92LCAyKTsNCg0KICAgIHJldHVybiA0Ow0KfQ0KDQovKiENCiAqIFxicmllZiBBZGQgcGFy YW1ldGVyIHJlcXVlc3Qgb3B0aW9uLg0KICoNCiAqIFJGQyAyMTMxIGRlbWFuZHMgdG8gdXNlIHRo ZSBzYW1lIHBhcmFtZXRlciByZXF1ZXN0IGluIGRpc2NvdmVyIGFuZA0KICogcmVxdWVzdCBtZXNz YWdlcy4NCiAqDQogKiBccGFyYW0gb3AgUG9pbnRlciBpbnRvIHRoZSBvcHRpb24gYnVmZmVyLg0K ICogXHBhcmFtIG90IE9wdGlvbiB0eXBlLg0KICogXHBhcmFtIG92IE9wdGlvbiB2YWx1ZSBpbiBo b3N0IGJ5dGUgb3JkZXIuDQogKg0KICogXHJldHVybiBUb3RhbCBudW1iZXIgb2Ygb2N0ZXRzIGFk ZGVkLCBpbmNsdWRlIHR5cGUgYW5kIGxlbmd0aC4NCiAqLw0Kc3RhdGljIHNpemVfdCBEaGNwQWRk UGFybVJlcU9wdGlvbih1aW50OF90ICogb3ApDQp7DQogICAgKm9wKysgPSBESENQT1BUX1BBUkFN UkVRVUVTVDsNCiAgICAqb3ArKyA9IDM7ICAgICAgICAgICAgICAgICAgLyogQWRqdXN0IHdoZW4g YWRkaW5nIG1vcmUgb3B0aW9ucyEgKi8NCiAgICAqb3ArKyA9IERIQ1BPUFRfTkVUTUFTSzsgICAg LyogVHlwaWNhbGx5IHNlbnQgYnkgZGVmYXVsdCwgYnV0IHBsYXkgc2FmZS4gKi8NCiAgICAqb3Ar KyA9IERIQ1BPUFRfR0FURVdBWTsgICAgLyogV2Ugd2FudCBhIGRlZmF1bHQgZ2F0ZXdheS4gKi8N CiAgICAqb3ArKyA9IERIQ1BPUFRfRE5TOyAgICAgICAgLyogV2Ugd2FudCB0aGUgRE5TJyBJUC4g Ki8NCiAgICByZXR1cm4gNTsgICAgICAgICAgICAgICAgICAgLyogQWRqdXN0IHdoZW4gYWRkaW5n IG1vcmUgb3B0aW9ucyEgKi8NCn0NCg0KLyohDQogKiBcYnJpZWYgUHJlcGFyZSBhIEJPT1RQIHJl cXVlc3QgbWVzc2FnZSBoZWFkZXIuDQogKg0KICogQSBCT09UUCBoZWFkZXIgd2lsbCBiZSBpbml0 aWFsaXplZCBhdCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBhZGRyZXNzDQogKiBhbmQgdGhlIHJvdXRp bmUgd2lsbCBhZGQgdGhlIERIQ1AgbWFnaWMgY29va2llIChSRkMgMTQ5NykgYW5kIGFuDQogKiBh ZGRpdGlvbmFsIG9wdGlvbiBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgREhDUCBtZXNzYWdlIHR5 cGUuDQogKg0KICogQWxsIG90aGVyIGZpZWxkcyBhcmUgY2xlYXJlZCB0byB6ZXJvLg0KICoNCiAq IFxwYXJhbSBicCAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIGluaXRpYWxpemUuDQogKiBc cGFyYW0gbXNndHlwIERIQ1AgbWVzc2FnZSB0eXBlLCBlaXRoZXIgXHJlZiBESENQX0RJU0NPVkVS LA0KICogICAgICAgICAgICAgICBccmVmIERIQ1BfUkVRVUVTVCBvciBccmVmIERIQ1BfUkVMRUFT RS4NCiAqIFxwYXJhbSB4aWQgICAgUmFuZG9tIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIuDQogKiBc cGFyYW0gY2lhZGRyIE91ciBJUCBhZGRyZXNzLiBTaG91bGQgYmUgc2V0IHRvIHplcm8gdW5sZXNz IHdlIGFyZSBpbg0KICogICAgICAgICAgICAgICBCT1VORCwgUkVORVcgb3IgUkVCSU5ESU5HIHN0 YXRlIGFuZCBjYW4gcmVzcG9uZCB0byBBUlANCiAqICAgICAgICAgICAgICAgcmVxdWVzdHMuDQog KiBccGFyYW0gc2VjcyAgIFNlY29uZHMgZWxhcHNlZCwgc2luY2Ugd2UgYmVnYW4gYWRkcmVzcyBh Y3F1aXNpdGlvbiBvcg0KICogICAgICAgICAgICAgICByZW5ld2FsLg0KICoNCiAqIFxyZXR1cm4g VG90YWwgbnVtYmVyIG9mIG9jdGV0cyBhZGRlZC4NCiAqLw0Kc3RhdGljIHVuc2lnbmVkIGludCBE aGNwUHJlcEhlYWRlcihCT09UUCAqYnAsIHVpbnQ4X3QgbXNndHlwLCB1aW50MzJfdCB4aWQsIHVp bnQzMl90IGNpYWRkciwgdWludDE2X3Qgc2VjcykNCnsNCiAgICB1aW50OF90ICpvcDsNCg0KICAg IG1lbXNldChicCwgMCwgc2l6ZW9mKCpicCkpOw0KICAgIC8qIENsaWVudHMgc2VuZCBib290cCBy ZXF1ZXN0cyAob3AgY29kZSAxKSBvbmx5LiAqLw0KICAgIGJwLT5icF9vcCA9IDE7DQogICAgLyog RXRoZXJuZXQgYWRkcmVzc2VzIGFyZSB0eXBlIDEgd2l0aCA2IG9jdGV0cy4gKi8NCiAgICBicC0+ YnBfaHR5cGUgPSAxOw0KICAgIGJwLT5icF9obGVuID0gNjsNCiAgICBtZW1jcHkoYnAtPmJwX2No YWRkciwgY29uZm5ldC5jZG5fbWFjLCA2KTsNCiAgICAvKiBUcmFuc2FjdGlvbiBpZGVudGlmaWVy LiAqLw0KICAgIGJwLT5icF94aWQgPSB4aWQ7DQogICAgLyogU2Vjb25kcyBlbGFwc2VkIHNpbmNl IGFkZHJlc3MgYWNxdWlzaXRpb24uICovDQogICAgYnAtPmJwX3NlY3MgPSBodG9ucyhzZWNzKTsN Cg0KI2lmZGVmIERIQ1BfQlJPQURDQVNUX0ZMQUcNCiAgICAvKg0KICAgICAqIFdlIGRvIG5vdCBu ZWVkIHRoZSBicm9hZGNhc3QgZmxhZywgYmVjYXVzZSBvdXIgc3RhY2sgYWNjZXB0cyBJUA0KICAg ICAqIG1lc3NhZ2VzIHRvIGFueSBkZXN0aW5hdGlvbiBpZiBubyBsb2NhbCBhZGRyZXNzIGhhcyBi ZWVuIGFzc2lnbmVkLA0KICAgICAqIEhvd2V2ZXIsIHdlIGNvbnRpbnVlIHN1cHBvcnRpbmcgdGhp cyBjb21waWxlIHRpbWUgb3B0aW9uLg0KICAgICAqLw0KICAgIGJwLT5icF9mbGFncyA9IGh0b25z KDB4ODAwMCk7DQojZW5kaWYNCg0KICAgIGJwLT5icF9jaWFkZHIgPSBjaWFkZHI7DQoNCiAgICAv KiBBZGQgdGhlIERIQ1AgbWFnaWMgY29va2llIGFjY29yZGluZyB0byBSRkMgMTQ5Ny4gKi8NCiAg ICBvcCA9IGJwLT5icF9vcHRpb25zOw0KICAgICpvcCsrID0gMHg2MzsNCiAgICAqb3ArKyA9IDB4 ODI7DQogICAgKm9wKysgPSAweDUzOw0KICAgICpvcCsrID0gMHg2MzsNCg0KICAgIC8qIEFkZCB0 aGUgREhDUCBtZXNzYWdlIHR5cGUgb3B0aW9uLiAqLw0KICAgIHJldHVybiBEaGNwQWRkQnl0ZU9w dGlvbihvcCwgREhDUE9QVF9NU0dUWVBFLCBtc2d0eXApICsgNDsNCn0NCg0KLyohDQogKiBcYnJp ZWYgU2VuZCBhIERIQ1AgbWVzc2FnZSB0byB0aGUgc2VydmVyLg0KICoNCiAqIFRoaXMgcm91dGlu ZSB3aWxsIGFsc28gYWRkIGFuIGVuZCBvZiBvcHRpb24gaWRlbnRpZmllciBhbmQgdGFrZSBjYXJl LA0KICogdGhhdCB0aGUgbWVzc2FnZSBsZW5ndGggd2lsbCBub3QgZmFsbCBiZWxvdyB0aGUgbWlu aW11bSBleHBlY3RlZCBieQ0KICogQk9PVFAuDQogKg0KICogXHBhcmFtIHNvY2sgU29ja2V0IGRl c2NyaXB0b3IuIFRoaXMgcG9pbnRlciBtdXN0IGhhdmUgYmVlbg0KICogICAgICAgICAgICAgcmV0 cmlldmVkIGJ5IGNhbGxpbmcgTnV0VWRwQ3JlYXRlU29ja2V0KCkuDQogKiBccGFyYW0gYWRkciBE ZXN0aW5hdGlvbiBJUCBhZGRyZXMuDQogKiBccGFyYW0gYnAgICBQb2ludGVyIHRvIGEgYnVmZmVy IHRvIGJlIHVzZWQgZm9yIHRyYW5zbWlzc2lvbi4NCiAqICAgICAgICAgICAgIE11c3QgY29udGFp biBhIGZ1bGx5IGluaXRpYWxpemVkIGhlYWRlciBhbmQgb3B0aW9uDQogKiAgICAgICAgICAgICBm aWVsZHMuDQogKiBccGFyYW0gbGVuICBUb3RhbCBudW1iZXIgb2YgREhDUCBvcHRpb24gb2N0ZXRz Lg0KICoNCiAqIFxyZXR1cm4gMCBvbiBzdWNjZXNzLiBPbiBlcnJvcnMgLTEgaXMgcmV0dXJuZWQg YW5kIFxyZWYgZGhjcEVycm9yIHdpbGwNCiAqICAgICAgICAgYmUgc2V0IHRvIFxyZWYgREhDUEVS Ul9UUkFOU01JVC4NCiAqLw0Kc3RhdGljIGludCBEaGNwU2VuZE1lc3NhZ2UoVURQU09DS0VUICog c29jaywgdWludDMyX3QgYWRkciwgQk9PVFAgKmJwLCBzaXplX3QgbGVuKQ0Kew0KICAgIC8qIEFk ZCAnZW5kIG9mIG9wdGlvbnMnLiAqLw0KICAgIGJwLT5icF9vcHRpb25zW2xlbisrXSA9IERIQ1BP UFRfRU5EOw0KDQogICAgLyogTWFpbnRhaW4gYSBCT09UUCBjb21wYXRpYmxlIG1pbmltdW0gcGFj a2V0IHNpemUgb2YgMzAwIG9jdGV0cy4NCiAgICAgICBUaGFua3MgdG8gVG9tb2hpcm8gSGFyYWlr YXdhLiAqLw0KICAgIGlmICgobGVuICs9IHNpemVvZihCT09UUCkgLSBzaXplb2YoYnAtPmJwX29w dGlvbnMpKSA8IE1JTl9ESENQX01TR1NJWkUpIHsNCiAgICAgICAgbGVuID0gTUlOX0RIQ1BfTVNH U0laRTsNCiAgICB9DQojaWZkZWYgTlVUREVCVUcNCiAgICBpZiAoX190Y3BfdHJmICYgTkVUX0RC R19ESENQKSB7DQogICAgICAgIGZwcmludGYoX190Y3BfdHJzLCAiW0RIQ1AtU2VuZCB0byAlc10i LCBpbmV0X250b2EoYWRkcikpOw0KICAgIH0NCiNlbmRpZg0KICAgIGlmIChOdXRVZHBTZW5kVG8o c29jaywgYWRkciwgREhDUF9TRVJWRVJQT1JULCBicCwgbGVuKSA8IDApIHsNCiAgICAgICAgZGhj cEVycm9yID0gREhDUEVSUl9UUkFOU01JVDsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCiAg ICByZXR1cm4gMDsNCn0NCg0KLyohDQogKiBcYnJpZWYgUmVjZWl2ZSBhIERIQ1AgcmVwbHkgZnJv bSB0aGUgc2VydmVyLg0KICoNCiAqIFxwYXJhbSBzb2NrIFNvY2tldCBkZXNjcmlwdG9yLg0KICog XHBhcmFtIHhpZCAgRXhwZWN0ZWQgdHJhbnNhY3Rpb24gaWRlbnRpZmllci4gSW5jb21pbmcgbWVz c2FnZXMgd2l0aCBhDQogKiAgICAgICAgICAgICBkaWZmZXJlbnQgaWRlbnRpZmllciBhcmUgc2ls ZW50bHkgZGlzY2FyZGVkLg0KICogXHBhcmFtIGJwICAgUG9pbnRlciB0byB0aGUgcmVjZWl2ZSBi dWZmZXIuDQogKiBccGFyYW0gdG1vICBNYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8g d2FpdCBmb3IgYSB2YWxpZCBtZXNzYWdlLg0KICoNCiAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBi eXRlcyByZWNlaXZlZCwgaWYgc3VjY2Vzc2Z1bC4gVGhlIHJldHVybg0KICogICAgICAgICB2YWx1 ZSAtMSBpbmRpY2F0ZXMgYW4gZXJyb3IsIGluIHdoaWNoIGNhc2UgZGhjcEVycm9yIGlzDQogKiAg ICAgICAgIHNldCB0byBhbiBlcnJvciBjb2RlLiBPbiB0aW1lb3V0IDAgaXMgcmV0dXJuZWQuDQog Ki8NCnN0YXRpYyBpbnQgRGhjcFJlY3ZNZXNzYWdlKFVEUFNPQ0tFVCAqIHNvY2ssIHVpbnQzMl90 IHhpZCwgQk9PVFAgKmJwLCB1aW50MzJfdCB0bW8pDQp7DQogICAgaW50IHJjOw0KICAgIHVpbnQx Nl90IHBvcnQ7DQogICAgdWludDMyX3QgYWRkcjsNCiAgICB1aW50MzJfdCBldGltOw0KICAgIHVp bnQzMl90IHd0aW07DQoNCiAgICAvKiBTZXQgb3VyIHN0YXJ0IHRpbWUuICovDQogICAgZXRpbSA9 IE51dEdldE1pbGxpcygpOw0KICAgIC8qIFNldCB0aGUgaW5pdGlhbCByZWNlaXZlIHRpbWVvdXQu ICovDQogICAgd3RpbSA9IHRtbzsNCiAgICBmb3IgKDs7KSB7DQogICAgICAgIHJjID0gTnV0VWRw UmVjZWl2ZUZyb20oc29jaywgJmFkZHIsICZwb3J0LCBicCwgc2l6ZW9mKEJPT1RQKSwgd3RpbSk7 DQojaWZkZWYgTlVUREVCVUcNCiAgICAgICAgaWYgKF9fdGNwX3RyZiAmIE5FVF9EQkdfREhDUCkg ew0KICAgICAgICAgICAgaWYgKHJjID4gMCkgew0KICAgICAgICAgICAgICAgIGZwcmludGYoX190 Y3BfdHJzLCAiW0RIQ1AtUmVjdiBmcm9tICVzXSIsIGluZXRfbnRvYShhZGRyKSk7DQogICAgICAg ICAgICB9IGVsc2UgaWYgKHJjIDwgMCkgew0KICAgICAgICAgICAgICAgIGZwcmludGYoX190Y3Bf dHJzLCAiW0RIQ1AtUmVjdiBFcnJvcl0iKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAg ICAgICAgICAgZnByaW50ZihfX3RjcF90cnMsICJbREhDUC1SZWN2IFRpbWVvdXQgJWx1XSIsIHRt byk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiNlbmRpZg0KICAgICAgICAvKiBJbW1lZGlh dGVseSByZXR1cm4gb24gcmVjZWl2ZSBlcnJvcnMgYW5kIHRpbWVvdXRzLiAqLw0KICAgICAgICBp ZiAocmMgPD0gMCkgew0KICAgICAgICAgICAgaWYgKHJjIDwgMCkgew0KICAgICAgICAgICAgICAg IGRoY3BFcnJvciA9IERIQ1BFUlJfUkVDRUlWRTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAg IGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIC8qIFRoZSBtZXNzYWdlIG11c3QgYXQgbGVhc3Qg aW5jbHVkZSB0aGUgQk9PVFAgaGVhZGVyIHBsdXMgZml2ZQ0KICAgICAgICAgICBieXRlcyBvZiBv cHRpb25zIChtYWdpYyBhbmQgZW5kKS4gV2UgYXJlIHF1aXRlIGxpYmVyYWwgaGVyZS4gKi8NCiAg ICAgICAgaWYgKHJjID4gc2l6ZW9mKEJPT1RQKSAtIHNpemVvZihicC0+YnBfb3B0aW9ucykgKyA1 KSB7DQogICAgICAgICAgICAvKiBUaGUgbWVzc2FnZSBtdXN0IGJlIGEgQk9PVFAgcmVwbHkgd2l0 aCB0aGUgZXhwZWN0ZWQgWElELiAqLw0KICAgICAgICAgICAgaWYgKGJwLT5icF9vcCA9PSAyICYm IGJwLT5icF94aWQgPT0geGlkKSB7DQogICAgICAgICAgICAgICAgLyogTWVzc2FnZSBpcyBhY2Nl cHRhYmxlLiAqLw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAg ICB9DQogICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgcmVtYWluaW5nIHRpbWVvdXQgZm9yIG5vdCBn ZXR0aW5nIHRyYXBwZWQgaGVyZQ0KICAgICAgICAgICBvbiBhIGJ1c3kgbmV0d29yaywgd2hpY2gg cmVndWxhcmx5IGJyb2FkY2FzdHMgREhDUCBtZXNzYWdlcy4gKi8NCiAgICAgICAgd3RpbSA9IE51 dEdldE1pbGxpcygpIC0gZXRpbTsNCiAgICAgICAgaWYgKHd0aW0gPj0gdG1vIC0gMjUwKSB7DQog ICAgICAgICAgICAvKiBMZXNzIHRoYW4gMjUwIG1zIGxlZnQsIHJldHVybiB0aW1lb3V0LiAqLw0K ICAgICAgICAgICAgcmMgPSAwOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAg ICAgd3RpbSA9IHRtbyAtIHd0aW07DQogICAgfQ0KICAgIHJldHVybiByYzsNCn0NCg0KLyohDQog KiBcYnJpZWYgQnJvYWRjYXN0IGEgREhDUCBkaXNjb3ZlciBtZXNzYWdlLg0KICoNCiAqIFxwYXJh bSBzb2NrICBTb2NrZXQgZGVzY3JpcHRvci4gVGhpcyBwb2ludGVyIG11c3QgaGF2ZSBiZWVuIHJl dHJpZXZlZA0KICogICAgICAgICAgICAgIGJ5IGNhbGxpbmcgTnV0VWRwQ3JlYXRlU29ja2V0KCku DQogKiBccGFyYW0gYnAgICAgUG9pbnRlciB0byBhIGJ1ZmZlciB0byBiZSB1c2VkIGZvciB0cmFu c21pc3Npb24uIE5vIHNwZWNpZmljDQogKiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gcmVx dWlyZWQuDQogKiBccGFyYW0geGlkICAgUmFuZG9tIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIuDQog KiBccGFyYW0gcmFkZHIgUmVxdWVzdGVkIElQIGFkZHJlc3MuIE9wdGlvbmFsLg0KICogXHBhcmFt IHNlY3MgIFNlY29uZHMgZWxhcHNlZCBzaW5jZSBzdGFydCBvZiBhZGRyZXNzIGFjcXVpc2l0aW9u LiBSZWxhdGVkDQogKiAgICAgICAgICAgICAgcmVxdWVzdHMgbXVzdCB1c2UgdGhlIHNhbWUgdmFs dWUuDQogKg0KICogXHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGlmIHNlbmQgZmFpbGVkLg0KICov DQpzdGF0aWMgaW50IERoY3BCcm9hZGNhc3REaXNjb3ZlcihVRFBTT0NLRVQgKiBzb2NrLCBCT09U UCAqYnAsIHVpbnQzMl90IHhpZCwgdWludDMyX3QgcmFkZHIsIHVpbnQxNl90IHNlY3MpDQp7DQog ICAgc2l6ZV90IG9wdGxlbjsNCiAgICBpbnQgbGVuOw0KICAgIHVpbnQ4X3QgKm9wID0gYnAtPmJw X29wdGlvbnM7DQoNCiAgICBvcHRsZW4gPSBEaGNwUHJlcEhlYWRlcihicCwgREhDUF9ESVNDT1ZF UiwgeGlkLCAwLCBzZWNzKTsNCg0KICAgIC8qIFJlcXVlc3QgYSBzcGVjaWZpYyBJUCBpZiBvbmUg aGFkIGJlZW4gYXNzaWduZWQgcHJldmlvdXNseS4gKi8NCiAgICBpZiAocmFkZHIpIHsNCiAgICAg ICAgb3B0bGVuICs9IERoY3BBZGRPcHRpb24ob3AgKyBvcHRsZW4sIERIQ1BPUFRfUkVRRVNUSVAs ICZyYWRkciwgc2l6ZW9mKHJhZGRyKSk7DQogICAgfQ0KDQogICAgb3B0bGVuICs9IERoY3BBZGRQ YXJtUmVxT3B0aW9uKG9wICsgb3B0bGVuKTsNCg0KICAgIC8qIFBhc3MgaG9zdCBuYW1lIGlmIHNw ZWNpZmllZCBpbiBjb25mb3Mgc3RydWN0dXJlLg0KICAgICAqIFdpbjJrIERIQ1Agc2VydmVyIGNh biByZWdpc3RlciB0aGlzIGFzIGR5bmFtaWMgRE5TIGVudHJ5Lg0KICAgICAqIEFsc28gdmlld2lu ZyBESENQIGxlYXNlIHRhYmxlIHNob3dzIHNvbWV0aGluZyBzZW5zaWJsZS4NCiAgICAgKi8NCiAg ICBsZW4gPSBzdHJsZW4oY29uZm9zLmhvc3RuYW1lKTsNCiAgICBpZiAobGVuID4gMCkgew0KICAg ICAgICBvcHRsZW4gKz0gRGhjcEFkZE9wdGlvbihvcCArIG9wdGxlbiwgREhDUE9QVF9IT1NUTkFN RSwgY29uZm9zLmhvc3RuYW1lLCBsZW4pOw0KICAgIH0NCg0KICAgIC8qIFJlcXVlc3QgYSBtYXhp bXVtIG1lc3NhZ2Ugc2l6ZS4gKi8NCiAgICBvcHRsZW4gKz0gRGhjcEFkZFNob3J0T3B0aW9uKG9w ICsgb3B0bGVuLCBESENQT1BUX01BWE1TR1NJWkUsIE1BWF9ESENQX01TR1NJWkUpOw0KDQogICAg cmV0dXJuIERoY3BTZW5kTWVzc2FnZShzb2NrLCBJTkFERFJfQlJPQURDQVNULCBicCwgb3B0bGVu KTsNCn0NCg0KDQovKiENCiAqIFxicmllZiBTZW5kIGEgREhDUCByZXF1ZXN0IG1lc3NhZ2UuDQog Kg0KICogXHBhcmFtIHNvY2sgIFNvY2tldCBkZXNjcmlwdG9yLiBUaGlzIHBvaW50ZXIgbXVzdCBo YXZlIGJlZW4gcmV0cmlldmVkIGJ5DQogKiAgICAgICAgICAgICAgY2FsbGluZyBOdXRVZHBDcmVh dGVTb2NrZXQoKS4NCiAqIFxwYXJhbSBkYWRkciBJUCBhZGRyZXNzIG9mIHRoZSBESENQIHNlcnZl ciBvciBccmVmIElOQUREUl9CUk9BRENBU1QuDQogKiBccGFyYW0gYnAgICAgUG9pbnRlciB0byBh IGJ1ZmZlciB0byBiZSB1c2VkIGZvciB0cmFuc21pc3Npb24uDQogKiBccGFyYW0geGlkICAgUmFu ZG9tIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIuDQogKiBccGFyYW0gY2FkZHIgT3VyIElQIGFkZHJl c3MuIFNob3VsZCBiZSBzZXQgb25seSBpZiB3ZSBhcmUgYWJsZSB0byByZXNwb25kDQogKiAgICAg ICAgICAgICAgdG8gQVJQIHJlcXVlc3RzLiBPdGhlcndpc2UgbXVzdCBiZSBzZXQgdG8gMC4NCiAq IFxwYXJhbSByYWRkciBSZXF1ZXN0ZWQgSVAgYWRkcmVzcy4gUmVxdWlyZWQuDQogKiBccGFyYW0g c2lkICAgU2VydmVyIGlkZW50aWZpZXIuIElmIHRoaXMgcmVxdWVzdCBpcyBub3QgYW4gb2ZmZXIg cmVzcG9uc2UsDQogKiAgICAgICAgICAgICAgdGhlbiBzZXQgaXQgdG8gemVyby4NCiAqIFxwYXJh bSBzZWNzICBTZWNvbmRzIGVsYXBzZWQgc2luY2Ugc3RhcnQgb2YgYWRkcmVzcyBhY3F1aXNpdGlv bi4gSWYgdGhpcw0KICogICAgICAgICAgICAgIHJlcXVlc3QgaXMgc2VudCBpbiByZXBvbnNlIHRv IGFuIG9mZmVyLCB0aGUgc2FtZSB2YWx1ZSBtdXN0DQogKiAgICAgICAgICAgICAgYmUgdXNlZC4N CiAqDQogKiBccmV0dXJuIDAgb24gc3VjY2VzcywgLTEgaWYgc2VuZCBmYWlsZWQuDQogKi8NCnN0 YXRpYyBpbnQgRGhjcFNlbmRSZXF1ZXN0KFVEUFNPQ0tFVCAqIHNvY2ssIHVpbnQzMl90IGRhZGRy LCBCT09UUCAqYnAsIHVpbnQzMl90IHhpZCwgICAgICAgIC8qICovDQogICAgICAgICAgICAgICAg ICAgICAgICAgICB1aW50MzJfdCBjYWRkciwgdWludDMyX3QgcmFkZHIsIHVpbnQzMl90IHNpZCwg dWludDE2X3Qgc2VjcykNCnsNCiAgICBzaXplX3Qgb3B0bGVuOw0KICAgIGludCBsZW47DQogICAg dWludDhfdCAqb3AgPSBicC0+YnBfb3B0aW9uczsNCg0KICAgIC8qIEluaXRpYWxpemUgdGhlIEJP T1RQIGhlYWRlci4gKi8NCiAgICBvcHRsZW4gPSBEaGNwUHJlcEhlYWRlcihicCwgREhDUF9SRVFV RVNULCB4aWQsIGNhZGRyLCBzZWNzKTsNCg0KICAgIC8qIEFkZCBzcGVjaWZpZWQgb3B0aW9ucy4g Ki8NCiAgICBpZiAocmFkZHIpIHsNCiAgICAgICAgb3B0bGVuICs9IERoY3BBZGRPcHRpb24ob3Ag KyBvcHRsZW4sIERIQ1BPUFRfUkVRRVNUSVAsICZyYWRkciwgc2l6ZW9mKHJhZGRyKSk7DQogICAg fQ0KICAgIGlmIChzaWQpIHsNCiAgICAgICAgb3B0bGVuICs9IERoY3BBZGRPcHRpb24ob3AgKyBv cHRsZW4sIERIQ1BPUFRfU0lELCAmc2lkLCBzaXplb2Yoc2lkKSk7DQogICAgfQ0KICAgIG9wdGxl biArPSBEaGNwQWRkUGFybVJlcU9wdGlvbihvcCArIG9wdGxlbik7DQoNCiAgICAvKiBQYXNzIGhv c3QgbmFtZSBpZiBzcGVjaWZpZWQgaW4gY29uZm9zIHN0cnVjdHVyZS4gICovDQogICAgLyogdmll d2luZyBESENQIGxlYXNlIHRhYmxlIHNob3dzIHNvbWV0aGluZyBzZW5zaWJsZS4gKi8NCiAgICBs ZW4gPSBzdHJsZW4oY29uZm9zLmhvc3RuYW1lKTsNCiAgICBpZiAobGVuID4gMCkgew0KICAgICAg ICBvcHRsZW4gKz0gRGhjcEFkZE9wdGlvbihvcCArIG9wdGxlbiwgREhDUE9QVF9IT1NUTkFNRSwg Y29uZm9zLmhvc3RuYW1lLCBsZW4pOw0KICAgIH0NCg0KICAgIHJldHVybiBEaGNwU2VuZE1lc3Nh Z2Uoc29jaywgZGFkZHIsIGJwLCBvcHRsZW4pOw0KfQ0KDQovKiENCiAqIFxicmllZiBCcm9hZGNh c3QgYSBESENQIHJlcXVlc3QgbWVzc2FnZS4NCiAqDQogKiBccGFyYW0gc29jayAgU29ja2V0IGRl c2NyaXB0b3IuIFRoaXMgcG9pbnRlciBtdXN0IGhhdmUgYmVlbiByZXRyaWV2ZWQgYnkNCiAqICAg ICAgICAgICAgICBjYWxsaW5nIE51dFVkcENyZWF0ZVNvY2tldCgpLg0KICogXHBhcmFtIGJwICAg IFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gYmUgdXNlZCBmb3IgdHJhbnNtaXNzaW9uLg0KICogXHBh cmFtIHhpZCAgIFJhbmRvbSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyLg0KICogXHBhcmFtIGNhZGRy IE91ciBJUCBhZGRyZXNzLiBTaG91bGQgYmUgc2V0IG9ubHkgaWYgd2UgYXJlIGFibGUgdG8gcmVz cG9uZA0KICogICAgICAgICAgICAgIHRvIEFSUCByZXF1ZXN0cy4gT3RoZXJ3aXNlIG11c3QgYmUg c2V0IHRvIDAuDQogKiBccGFyYW0gcmFkZHIgUmVxdWVzdGVkIElQIGFkZHJlc3MuIFJlcXVpcmVk Lg0KICogXHBhcmFtIHNpZCAgIFNlcnZlciBpZGVudGlmaWVyLiBJZiB0aGlzIHJlcXVlc3QgaXMg bm90IGFuIG9mZmVyIHJlc3BvbnNlLA0KICogICAgICAgICAgICAgIHRoZW4gc2V0IGl0IHRvIHpl cm8uDQogKiBccGFyYW0gc2VjcyAgU2Vjb25kcyBlbGFwc2VkIHNpbmNlIHN0YXJ0IG9mIGFkZHJl c3MgYWNxdWlzaXRpb24uIElmIHRoaXMNCiAqICAgICAgICAgICAgICByZXF1ZXN0IGlzIHNlbnQg aW4gcmVwb25zZSB0byBhbiBvZmZlciwgdGhlIHNhbWUgdmFsdWUgbXVzdA0KICogICAgICAgICAg ICAgIGJlIHVzZWQuDQogKg0KICogXHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGlmIHNlbmQgZmFp bGVkLg0KICovDQpzdGF0aWMgaW50IERoY3BCcm9hZGNhc3RSZXF1ZXN0KFVEUFNPQ0tFVCAqIHNv Y2ssIEJPT1RQICpicCwgdWludDMyX3QgeGlkLCAvKiAqLw0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB1aW50MzJfdCBjYWRkciwgdWludDMyX3QgcmFkZHIsIHVpbnQzMl90IHNpZCwg dWludDE2X3Qgc2VjcykNCnsNCiAgICByZXR1cm4gRGhjcFNlbmRSZXF1ZXN0KHNvY2ssIElOQURE Ul9CUk9BRENBU1QsIGJwLCB4aWQsIGNhZGRyLCByYWRkciwgc2lkLCBzZWNzKTsNCn0NCg0KLyoh DQogKiBcYnJpZWYgUmVsaW5ndWlzaCBvdXIgREhDUCBsZWFzZS4NCiAqDQogKiBccGFyYW0gc29j ayAgU29ja2V0IGRlc2NyaXB0b3IuIFRoaXMgcG9pbnRlciBtdXN0IGhhdmUgYmVlbiByZXRyaWV2 ZWQgYnkNCiAqICAgICAgICAgICAgICBjYWxsaW5nIE51dFVkcENyZWF0ZVNvY2tldCgpLg0KICog XHBhcmFtIGRhZGRyIElQIGFkZHJlc3Mgb2YgdGhlIERIQ1Agc2VydmVyLg0KICogXHBhcmFtIGJw ICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gYmUgdXNlZCBmb3IgdHJhbnNtaXNzaW9uLg0KICog XHBhcmFtIHhpZCAgIFJhbmRvbSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyLg0KICogXHBhcmFtIGNh ZGRyIE91ciBJUCBhZGRyZXNzLiBTaG91bGQgYmUgc2V0IG9ubHkgaWYgd2UgYXJlIGFibGUgdG8g cmVzcG9uZA0KICogICAgICAgICAgICAgIHRvIEFSUCByZXF1ZXN0cy4gT3RoZXJ3aXNlIG11c3Qg YmUgc2V0IHRvIDAuDQogKiBccGFyYW0gc2lkICAgU2VydmVyIGlkZW50aWZpZXIuIElmIHRoaXMg cmVxdWVzdCBpcyBub3QgYW4gb2ZmZXIgcmVzcG9uc2UsDQogKiAgICAgICAgICAgICAgdGhlbiBz ZXQgaXQgdG8gemVyby4NCiAqDQogKiBccmV0dXJuIDAgb24gc3VjY2VzcywgLTEgaWYgc2VuZCBm YWlsZWQuDQogKi8NCnN0YXRpYyBpbnQgRGhjcFNlbmRSZWxlYXNlKFVEUFNPQ0tFVCAqIHNvY2ss IHVpbnQzMl90IGRhZGRyLCBCT09UUCAqYnAsIHVpbnQzMl90IHhpZCwgdWludDMyX3QgY2FkZHIs IHVpbnQzMl90IHNpZCkNCnsNCiAgICBzaXplX3Qgb3B0bGVuOw0KICAgIHVpbnQ4X3QgKm9wID0g YnAtPmJwX29wdGlvbnM7DQoNCiAgICAvKiBQcmVwYXJlIEJPT1RQIGhlYWRlci4gJ3NlY3MnIGlz IHNldCB0byB6ZXJvLiAqLw0KICAgIG9wdGxlbiA9IERoY3BQcmVwSGVhZGVyKGJwLCBESENQX1JF TEVBU0UsIHhpZCwgY2FkZHIsIDApOw0KDQogICAgLyogT3B0aW9uYWxseSBhZGQgc2VydmVyIGlk ZW50aWZpZXIuICovDQogICAgaWYgKHNpZCkgew0KICAgICAgICBvcHRsZW4gKz0gRGhjcEFkZE9w dGlvbihvcCArIG9wdGxlbiwgREhDUE9QVF9TSUQsICZzaWQsIHNpemVvZihzaWQpKTsNCiAgICB9 DQogICAgcmV0dXJuIERoY3BTZW5kTWVzc2FnZShzb2NrLCBkYWRkciwgYnAsIG9wdGxlbik7DQp9 DQoNCi8qIQ0KICogXGJyaWVmIEluZm9ybSBESENQIGFib3V0IGFuIGV4dGVybmFsbHkgYWxsb2Nh dGVkIGFkZHJlc3MuDQogKg0KICogXHBhcmFtIHNvY2sgIFNvY2tldCBkZXNjcmlwdG9yLiBUaGlz IHBvaW50ZXIgbXVzdCBoYXZlIGJlZW4gcmV0cmlldmVkIGJ5DQogKiAgICAgICAgICAgICAgY2Fs bGluZyBOdXRVZHBDcmVhdGVTb2NrZXQoKS4NCiAqIFxwYXJhbSBkYWRkciBJUCBhZGRyZXNzIG9m IHRoZSBESENQIHNlcnZlciBvciBJTkFERFJfQlJPQURDQVNULg0KICogXHBhcmFtIGJwICAgIFBv aW50ZXIgdG8gYSBidWZmZXIgdG8gYmUgdXNlZCBmb3IgdHJhbnNtaXNzaW9uLg0KICogXHBhcmFt IHhpZCAgIFJhbmRvbSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyLg0KICogXHBhcmFtIGNhZGRyIE91 ciBJUCBhZGRyZXNzLiBSZXF1aXJlZC4NCiAqDQogKiBccmV0dXJuIDAgb24gc3VjY2VzcywgLTEg aWYgc2VuZCBmYWlsZWQuDQogKi8NCnN0YXRpYyBpbnQgRGhjcFNlbmRJbmZvcm0oVURQU09DS0VU ICogc29jaywgdWludDMyX3QgZGFkZHIsIEJPT1RQICpicCwgdWludDMyX3QgeGlkLCB1aW50MzJf dCBjYWRkcikNCnsNCiAgICBzaXplX3Qgb3B0bGVuOw0KICAgIHNpemVfdCBsZW47DQogICAgdWlu dDhfdCAqb3AgPSBicC0+YnBfb3B0aW9uczsNCg0KICAgIC8qIFByZXBhcmUgQk9PVFAgaGVhZGVy LiAnc2VjcycgaXMgc2V0IHRvIHplcm8uICovDQogICAgb3B0bGVuID0gRGhjcFByZXBIZWFkZXIo YnAsIERIQ1BfSU5GT1JNLCB4aWQsIGNhZGRyLCAwKTsNCg0KICAgIC8qIEFkZGl0aW9uYWwgb3B0 aW9ucyB3ZSB3YW50LiAqLw0KICAgIG9wdGxlbiArPSBEaGNwQWRkUGFybVJlcU9wdGlvbihvcCAr IG9wdGxlbik7DQoNCiAgICAvKiBBZGQgb3VyIGNvbmZpZ3VyZWQgaG9zdCBuYW1lLiAqLw0KICAg IGxlbiA9IHN0cmxlbihjb25mb3MuaG9zdG5hbWUpOw0KICAgIGlmIChsZW4gPiAwKSB7DQogICAg ICAgIG9wdGxlbiArPSBEaGNwQWRkT3B0aW9uKG9wICsgb3B0bGVuLCBESENQT1BUX0hPU1ROQU1F LCBjb25mb3MuaG9zdG5hbWUsIGxlbik7DQogICAgfQ0KDQogICAgLyogV2Ugc2hvdWxkIHByb3Zp ZGUgdGhlIG1heGltdW0gbWVzc2FnZSBzaXplLiAqLw0KICAgIG9wdGxlbiArPSBEaGNwQWRkU2hv cnRPcHRpb24ob3AgKyBvcHRsZW4sIERIQ1BPUFRfTUFYTVNHU0laRSwgTUFYX0RIQ1BfTVNHU0la RSk7DQoNCiAgICByZXR1cm4gRGhjcFNlbmRNZXNzYWdlKHNvY2ssIGRhZGRyLCBicCwgb3B0bGVu KTsNCn0NCg0KDQovKiENCiAqIFxicmllZiBDaGVjayBhIG5ldyBvZmZlci4NCiAqDQogKiBccGFy YW0gZHluY2ZnIEN1cnJlbnQgY29uZmlndXJhdGlvbiwgbWF5IGJlIE5VTEwuDQogKiBccGFyYW0g aXAgICAgIERIQ1Agc2VydmVyIElQIGFkZHJlc3MuDQogKiBccGFyYW0gYnAgICAgIERIQ1Agb2Zm ZXIgbWVzc2FnZS4NCiAqIFxwYXJhbSBsZW4gICAgREhDUCBtZXNzYWdlIGxlbmd0aC4NCiAqDQog KiBccmV0dXJuIFVwZGF0ZWQgY29uZmlndXJhdGlvbi4NCiAqLw0Kc3RhdGljIERZTkNGRyAqQ2hl Y2tPZmZlcihEWU5DRkcgKiBkeW5jZmcsIEJPT1RQICpicCwgc2l6ZV90IGxlbikNCnsNCiAgICBE WU5DRkcgKm9mZmVyOw0KDQojaWZkZWYgTlVUREVCVUcNCiAgICBpZiAoX190Y3BfdHJmICYgTkVU X0RCR19ESENQKSBmcHJpbnRmKF9fdGNwX3RycywgIlxuW2Noa29mZmVyICVzICIsIGluZXRfbnRv YSggZHluY2ZnLT5keW5feWlhZGRyKSk7DQojZW5kaWYNCg0KICAgIC8qIFBhcnNlIHRoZSBuZXcg b2ZmZXIuIElmIGl0J3MgaW52YWxpZCwgcmV0dXJuIHRoZSBjdXJyZW50DQogICAgICAgY29uZmln dXJhdGlvbi4gKi8NCiAgICBpZiAoKG9mZmVyID0gUGFyc2VSZXBseShicCwgbGVuKSkgPT0gMCkg ew0KI2lmZGVmIE5VVERFQlVHDQogICAgICAgIGlmIChfX3RjcF90cmYgJiBORVRfREJHX0RIQ1Ap IGZwcmludGYoX190Y3BfdHJzLCAiVEFLRTogJXNdIiwgaW5ldF9udG9hKCBvZmZlci0+ZHluX3lp YWRkcikpOw0KI2VuZGlmDQogICAgICAgIHJldHVybiBkeW5jZmc7DQogICAgfQ0KDQogICAgLyog RGlzY2FyZCBhbnl0aGluZyB3aGljaCBpcyBub3QgYW4gb2ZmZXIuICovDQogICAgaWYgKG9mZmVy LT5keW5fbXNndHlwICE9IERIQ1BfT0ZGRVIpIHsNCiAgICAgICAgUmVsZWFzZUR5bkNmZyhvZmZl cik7DQojaWZkZWYgTlVUREVCVUcNCiAgICAgICAgaWYgKF9fdGNwX3RyZiAmIE5FVF9EQkdfREhD UCkgZnByaW50ZihfX3RjcF90cnMsICJOTy1PRkZFUl0iKTsNCiNlbmRpZg0KICAgICAgICByZXR1 cm4gZHluY2ZnOw0KICAgIH0NCg0KICAgIC8qIEZpcnN0IG9mZmVyLCB0YWtlIGl0LiAqLw0KICAg IGlmIChkeW5jZmcgPT0gMCkgew0KICAgICAgICBkeW5jZmcgPSBvZmZlcjsNCiNpZmRlZiBOVVRE RUJVRw0KICAgICAgICBpZiAoX190Y3BfdHJmICYgTkVUX0RCR19ESENQKSBmcHJpbnRmKF9fdGNw X3RycywgIkZJUlNUOiAlc10iLCBpbmV0X250b2Eob2ZmZXItPmR5bl95aWFkZHIpKTsNCiNlbmRp Zg0KICAgIH0NCg0KICAgIC8qDQogICAgICogQ2hlY2sgaWYgdGhlIG5ldyBvZmZlciBpcyBiZXR0 ZXIgdGhhbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uOg0KICAgICAqLw0KICAgIGVsc2Ugew0K ICAgICAgICAvKiBJZiB3ZSByZW1lbWJlciBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIElQIHdoaWNo IGlzbid0IGluIHRoZQ0KICAgICAgICAgICBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYnV0IGluIHRo ZSBuZXcgb2ZmZXIsIHRoZW4gbGV0J3MgdGFrZQ0KICAgICAgICAgICB0aGUgbmV3IG9uZS4gKi8N CiNpZmRlZiBOVVRERUJVRw0KICAgICAgICBpZiAoX190Y3BfdHJmICYgTkVUX0RCR19ESENQKSBm cHJpbnRmKF9fdGNwX3RycywgIlBSRVYgIik7DQojZW5kaWYNCiAgICAgICAgaWYgKGNvbmZuZXQu Y2RuX2lwX2FkZHIgJiBjb25mbmV0LmNkbl9pcF9tYXNrKSB7DQogICAgICAgICAgICBpZiAoZHlu Y2ZnLT5keW5feWlhZGRyICE9IGNvbmZuZXQuY2RuX2lwX2FkZHIgJiYgICAgLyogKi8NCiAgICAg ICAgICAgICAgICBvZmZlci0+ZHluX3lpYWRkciA9PSBjb25mbmV0LmNkbl9pcF9hZGRyKSB7DQog ICAgICAgICAgICAgICAgUmVsZWFzZUR5bkNmZyhkeW5jZmcpOw0KICAgICAgICAgICAgICAgIGR5 bmNmZyA9IG9mZmVyOw0KI2lmZGVmIE5VVERFQlVHDQogICAgICAgICAgICAgICAgaWYgKF9fdGNw X3RyZiAmIE5FVF9EQkdfREhDUCkgZnByaW50ZihfX3RjcF90cnMsICJPTEQ6ICVzXSIsIGluZXRf bnRvYSggZHluY2ZnLT5keW5feWlhZGRyKSk7DQojZW5kaWYNCiAgICAgICAgICAgIH0NCiAgICAg ICAgfQ0KICAgICAgICAvKiBJbiB0aGUgc2Vjb25kIHBsYWNlIHByZWZlciBsb25nIGxlYXNlIHRp bWVzLiAqLw0KICAgICAgICBlbHNlIGlmIChvZmZlci0+ZHluX2xlYXNlVGltZSA+IGR5bmNmZy0+ ZHluX2xlYXNlVGltZSkgew0KICAgICAgICAgICAgUmVsZWFzZUR5bkNmZyhkeW5jZmcpOw0KICAg ICAgICAgICAgZHluY2ZnID0gb2ZmZXI7DQojaWZkZWYgTlVUREVCVUcNCiAgICAgICAgICAgIGlm IChfX3RjcF90cmYgJiBORVRfREJHX0RIQ1ApIGZwcmludGYoX190Y3BfdHJzLCAiTE9ORzogJXNd IiwgaW5ldF9udG9hKCBkeW5jZmctPmR5bl95aWFkZHIpKTsNCiNlbmRpZg0KICAgICAgICB9DQog ICAgICAgIC8qIFRoZSBuZXcgb25lIGRlb3NuJ3Qgb2ZmZXIgYW55dGhpbmcgaW50ZXJlc3Rpbmcu IERpc2NhcmQgaXQuICovDQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgUmVsZWFzZUR5bkNm ZyhvZmZlcik7DQojaWZkZWYgTlVUREVCVUcNCiAgICAgICAgICAgIGlmIChfX3RjcF90cmYgJiBO RVRfREJHX0RIQ1ApIGZwcmludGYoX190Y3BfdHJzLCAiRFNJQ10iKTsNCiNlbmRpZg0KICAgICAg ICB9DQogICAgfQ0KICAgIHJldHVybiBkeW5jZmc7DQp9DQoNCiNpZmRlZiBOVVRERUJVRw0Kdm9p ZCBEaGNwU3RhdGVEZWJ1ZyggdWludF9mYXN0OF90IG4sIHVpbnRfZmFzdDhfdCBzLCBpbnQgbGks IGludCBsdCwgdXJlZ190IHJldHJpZXMpDQp7DQogICAgaWYgKF9fdGNwX3RyZiAmIE5FVF9EQkdf REhDUCkgew0KICAgICAgICBpZiggbikNCiAgICAgICAgICAgIGZwcmludGYoX190Y3BfdHJzLCAi XG5bJXUuREhDUC0iLCByZXRyaWVzICsgMSk7DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIGZw cmludGYoX190Y3BfdHJzLCAiXG4tPlsldS5ESENQLSIsIHJldHJpZXMgKyAxKTsNCg0KICAgICAg ICBzd2l0Y2ggKGRoY3BTdGF0ZSkgew0KICAgICAgICBjYXNlIERIQ1BTVF9JTklUOg0KICAgICAg ICAgICAgZnByaW50ZihfX3RjcF90cnMsICJJTklUXSIpOw0KICAgICAgICAgICAgYnJlYWs7DQog ICAgICAgIGNhc2UgREhDUFNUX1NFTEVDVElORzoNCiAgICAgICAgICAgIGZwcmludGYoX190Y3Bf dHJzLCAiU0VMRUNUSU5HXSIpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgREhD UFNUX1JFUVVFU1RJTkc6DQogICAgICAgICAgICBmcHJpbnRmKF9fdGNwX3RycywgIlJFUVVFU1RJ TkddIik7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBESENQU1RfUkVCT09USU5H Og0KICAgICAgICAgICAgZnByaW50ZihfX3RjcF90cnMsICJSRUJPT1RJTkcgJXNdIiwgaW5ldF9u dG9hKGxpKSk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBESENQU1RfQk9VTkQ6 DQogICAgICAgICAgICBmcHJpbnRmKF9fdGNwX3RycywgIkJPVU5EICVsdV0iLCBOdXRHZXRTZWNv bmRzKCkgLSBsdCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBESENQU1RfUkVO RVdJTkc6DQogICAgICAgICAgICBmcHJpbnRmKF9fdGNwX3RycywgIlJFTkVXSU5HICVsdV0iLCBO dXRHZXRTZWNvbmRzKCkgLSBsdCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBE SENQU1RfUkVCSU5ESU5HOg0KICAgICAgICAgICAgZnByaW50ZihfX3RjcF90cnMsICJSRUJJTkRJ TkcgJWx1XSIsIE51dEdldFNlY29uZHMoKSAtIGx0KTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAg ICAgICBjYXNlIERIQ1BTVF9JTkZPUk1JTkc6DQogICAgICAgICAgICBmcHJpbnRmKF9fdGNwX3Ry cywgIklORk9STUlOR10iKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIERIQ1BT VF9SRUxFQVNJTkc6DQogICAgICAgICAgICBmcHJpbnRmKF9fdGNwX3RycywgIlJFTEVBU0lOR10i KTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIERIQ1BTVF9JRExFOg0KICAgICAg ICAgICAgaWYgKGRoY3BFcnJvcikgew0KICAgICAgICAgICAgICAgIGZwcmludGYoX190Y3BfdHJz LCAiRVJST1IgJXVdIiwgZGhjcEVycm9yKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAg ICAgICAgICAgZnByaW50ZihfX3RjcF90cnMsICJJRExFXSIpOw0KICAgICAgICAgICAgfQ0KICAg ICAgICAgICAgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICBmcHJpbnRmKF9f dGNwX3RycywgIlVOS05PV04gJXVdIiwgZGhjcFN0YXRlKTsNCiAgICAgICAgICAgIGJyZWFrOw0K ICAgICAgICB9DQogICAgfQ0KfQ0KI2VuZGlmDQoNCi8qISBcZm4gTnV0RGhjcENsaWVudCh2b2lk ICphcmcpDQogKiBcYnJpZWYgREhDUCBjbGllbnQgdGhyZWFkLg0KICoNCiAqIFRoaXMgdGhyZWFk IGltcGxlbWVudHMgYSBESENQIHN0YXRlIG1hY2hpbmUgYW5kIGlzIGF1dG9tYXRpY2FsbHkgc3Rh cnRlZA0KICogd2hlbiBjYWxsaW5nIE51dERoY3BJZkNvbmZpZygpIG9yIE51dERoY3BJbmZvcm0o KS4NCiAqDQogKiBcYnVnIFdlIGFyZSBub3QgYWJsZSB0byBzaHV0ZG93biBvdXIgaW50ZXJmYWNl LCB3aGljaCBtYXkgY2F1c2UgcHJvYmxlbXMNCiAqICAgICAgaWYgb3V0IG9yaWdpbmFsIERIQ1Ag c2VydmVyIGRpZXMuDQogKg0KICogXHRvZG8gV2UgYXJlIHVzaW5nIGEgYnVuY2ggb2YgZ2xvYmFs IHZhcmlhYmxlcywgd2hpY2ggbXVzdCBiZSBhc3NvY2lhdGVkDQogKiAgICAgICB0byBhIHNwZWNp ZmljIGludGVyZmFzZSBpZiB3ZSB3YW50IHRvIHN1cHBvcnQgbW9yZSB0aGFuIG9uZQ0KICogICAg ICAgRXRoZXJuZXQgcG9ydC4NCiAqLw0KVEhSRUFEKE51dERoY3BDbGllbnQsIGFyZykNCnsNCiAg ICBEWU5DRkcgKnJlcGx5ID0gMDsNCiAgICBVRFBTT0NLRVQgKnNvY2sgPSAwOw0KICAgIEJPT1RQ ICpicCA9IDA7DQogICAgaW50IG47DQogICAgdWludDMyX3QgeGlkOw0KICAgIElGTkVUICpuaWY7 DQogICAgdWludDE2X3Qgc2VjcyA9IDA7DQogICAgdWludDMyX3QgYXFzVGltZSA9IE51dEdldFNl Y29uZHMoKTsNCiAgICB1aW50MzJfdCBsZWFzZVRpbWUgPSAwOw0KICAgIHVpbnQzMl90IG5hcFRp bWU7DQogICAgdXJlZ190IHJldHJpZXM7DQogICAgdWludDMyX3QgdG1vID0gTUlOX0RIQ1BfV0FJ VDsNCiAgICB1aW50MzJfdCBsYXN0X2lwID0gY29uZm5ldC5jZG5faXBfYWRkcjsNCiAgICB1aW50 MzJfdCBzZXJ2ZXJfaXA7DQoNCiAgICAvKg0KICAgICAqIEhhY2sgYWxlcnQ6IE91ciBBUk0gcG9y dCBkb2Vzbid0IGFsbG93IHBhcmFtZXRlcg0KICAgICAqIHBhc3NpbmcgdG8gdGhyZWFkcy4NCiAg ICAgKi8NCiNpZmRlZiBfX2FybV9fDQogICAgbmlmID0gZGhjcERldi0+ZGV2X2ljYjsNCiNlbHNl DQogICAgbmlmID0gKChOVVRERVZJQ0UgKikgYXJnKS0+ZGV2X2ljYjsNCiNlbmRpZg0KDQogICAg LyoNCiAgICAgKiBHZW5lcmF0ZSBhIHJhbmRvbSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyIGJhc2Vk IG9uIG91ciBNQUMNCiAgICAgKiBhZGRyZXNzIHdpdGggdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5 dGUgb2YgdGhlIE1BQyBhZGRyZXNzDQogICAgICogYmVjb21pbmcgdGhlIG1vc3Qgc2lnbmlmaWNh bnQgYnl0ZSBvZiB0aGUgaWRlbnRpZmllci4gVGhpcw0KICAgICAqIHNob3VsZCBnaXZlIGEgc3Vm ZmljaWVudCB1bmlxdWUgdmFsdWUgd2hlbiBzZXZlcmFsIEV0aGVybnV0cw0KICAgICAqIGFyZSBz dGFydGVkIGNvbmN1cnJlbnRseS4NCiAgICAgKi8NCiAgICB4aWQgPSAwOw0KICAgIGZvciAocmV0 cmllcyA9IDA7IHJldHJpZXMgPCBzaXplb2YoeGlkKTsgcmV0cmllcysrKSB7DQogICAgICAgIHhp ZCA8PD0gODsNCiAgICAgICAgeGlkICs9IG5pZi0+aWZfbWFjWzUgLSByZXRyaWVzXTsNCiAgICB9 DQogICAgcmV0cmllcyA9IDA7DQoNCiAgICBmb3IgKDs7KSB7DQoNCiNpZmRlZiBOVVRERUJVRw0K ICAgICAgICBEaGNwU3RhdGVEZWJ1ZyggMCwgZGhjcFN0YXRlLCBsYXN0X2lwLCBsZWFzZVRpbWUs IHJldHJpZXMpOw0KI2VuZGlmDQoNCiAgICAgICAgLyoNCiAgICAgICAgICogU2V0dXAgc29tZSB2 YWx1ZXMgYmFzZWQgb24gdGhlIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cy4NCiAgICAgICAgICov DQogICAgICAgIHNlcnZlcl9pcCA9IElOQUREUl9CUk9BRENBU1Q7ICAgLyogQnJvYWRjYXN0aW5n IGlzIGRlZmF1bHQuICovDQogICAgICAgIGlmIChyZXRyaWVzKSB7DQogICAgICAgICAgICAvKiBE b3VibGUgb3VyIHRpbWVvdXQgb24gZWFjaCByZXRyeS4gKi8NCiAgICAgICAgICAgIHRtbyArPSB0 bW87DQogICAgICAgICAgICBpZiAodG1vID4gTUFYX0RIQ1BfV0FJVCkgew0KICAgICAgICAgICAg ICAgIHRtbyA9IE1BWF9ESENQX1dBSVQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7 DQogICAgICAgICAgICAvKiBTdGFydCB3aXRoIG1pbmltdW0gdGltZW91dCBmaXJzdC4gKi8NCiAg ICAgICAgICAgIHRtbyA9IE1JTl9ESENQX1dBSVQ7DQogICAgICAgICAgICAvKiBVc2UgYSBuZXcg eGlkIGZvciB0aGUgZmlyc3QgbWVzc2FnZSBpbiBlYWNoIHN0YXRlIGV4Y2VwdA0KICAgICAgICAg ICAgICogd2hlbiByZXF1ZXN0aW5nLCB3aGVyZSB3ZSBzaG91bGQgY29udGludWUgdXNpbmcgdGhl IHhpZA0KICAgICAgICAgICAgICogZnJvbSB0aGUgb2ZmZXIgbWVzc2FnZSB3ZSByZWNlaXZlZC4N CiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgaWYgKGRoY3BTdGF0ZSAhPSBESENQU1RfUkVR VUVTVElORykgew0KICAgICAgICAgICAgICAgIHhpZCsrOw0KICAgICAgICAgICAgfQ0KDQogICAg ICAgICAgICAvKiBJZiB3ZSBrbm93IHRoZSBzZXJ2ZXIncyBJUCwgdHJ5IHRvIHVuaWNhc3Qgb24g dGhlIGZpcnN0DQogICAgICAgICAgICAgICBhdHRlbXB0LiAqLw0KICAgICAgICAgICAgaWYgKGRo Y3BDb25maWcgJiYgZGhjcENvbmZpZy0+ZHluX3NpZCkgew0KICAgICAgICAgICAgICAgIHNlcnZl cl9pcCA9IGRoY3BDb25maWctPmR5bl9zaWQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0K ICAgICAgICAvKg0KICAgICAgICAgKiBLZWVwIHRyYWNrIG9mIHRoZSBBUEkgdGltZW91dC4NCiAg ICAgICAgICovDQogICAgICAgIGlmIChkaGNwU3RhdGUgIT0gREhDUFNUX0lETEUgJiYgZGhjcEFw aVRpbWVvdXQgIT0gTlVUX1dBSVRfSU5GSU5JVEUpIHsNCiAgICAgICAgICAgIHVpbnQzMl90IHR0 ID0gTnV0R2V0TWlsbGlzKCkgLSBkaGNwQXBpU3RhcnQ7DQoNCiAgICAgICAgICAgIGlmIChkaGNw QXBpVGltZW91dCA8PSB0dCkgew0KICAgICAgICAgICAgICAgIGRoY3BFcnJvciA9IERIQ1BFUlJf VElNRU9VVDsNCiAgICAgICAgICAgICAgICBkaGNwU3RhdGUgPSBESENQU1RfSURMRTsNCiAgICAg ICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICgodHQg PSBkaGNwQXBpVGltZW91dCAtIHR0KSA8IHRtbykgew0KICAgICAgICAgICAgICAgIHRtbyA9IHR0 Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLyoNCiAgICAgICAgICogS2Vl cCB0cmFjayBvZiBhY3F1aXNpdGlvbiB0aW1lLg0KICAgICAgICAgKi8NCiAgICAgICAgaWYgKChk aGNwU3RhdGUgPT0gREhDUFNUX1NFTEVDVElORykgfHwgKGRoY3BTdGF0ZSA9PSBESENQU1RfUkVO RVdJTkcpIHx8IChkaGNwU3RhdGUgPT0gREhDUFNUX1JFQklORElORykpIHsNCiAgICAgICAgICAg IC8qIEZvciByZXRyaWVzIG1ha2Ugc3VyZSB0aGF0IHNlY3MgZG9lc24ndCBvdmVyZmxvdy4gKi8N CiAgICAgICAgICAgIGlmIChyZXRyaWVzKSB7DQogICAgICAgICAgICAgICAgaWYgKE51dEdldFNl Y29uZHMoKSAtIGFxc1RpbWUgPiAweGZmZmZVTCkgew0KICAgICAgICAgICAgICAgICAgICBzZWNz ID0gMHhmZmZmOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAg IHNlY3MgPSAodWludDE2X3QpIChOdXRHZXRTZWNvbmRzKCkgLSBhcXNUaW1lKTsNCiAgICAgICAg ICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvKiBGb3IgZmlyc3QgdHJhbnNt aXNzaW9ucyBtYWtlIHN1cmUgdGhhdCBzZWNzIGlzIHplcm8uICovDQogICAgICAgICAgICBlbHNl IHsNCiAgICAgICAgICAgICAgICBhcXNUaW1lID0gTnV0R2V0U2Vjb25kcygpOw0KICAgICAgICAg ICAgICAgIHNlY3MgPSAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLyoN CiAgICAgICAgICogUmVsZWFzZSBVRFAgc29ja2V0IGFuZCBidWZmZXIgaW4gc3RhdGVzIHdpdGgg bG9uZyBpbmFjdGl2ZSB0aW1lLg0KICAgICAgICAgKi8NCiAgICAgICAgaWYgKChkaGNwU3RhdGUg PT0gREhDUFNUX0JPVU5EKSB8fCAoZGhjcFN0YXRlID09IERIQ1BTVF9JRExFKSkgew0KICAgICAg ICAgICAgaWYgKHNvY2spIHsNCiAgICAgICAgICAgICAgICBOdXRVZHBEZXN0cm95U29ja2V0KHNv Y2spOw0KICAgICAgICAgICAgICAgIHNvY2sgPSAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAg ICAgaWYgKGJwKSB7DQogICAgICAgICAgICAgICAgZnJlZShicCk7DQogICAgICAgICAgICAgICAg YnAgPSAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLyoNCiAgICAgICAg ICogSW4gYWxsIG90aGVyIHN0YXRlcyB3ZSBuZWVkIHRoZSBzb2NrZXQgYW5kIHRoZSBidWZmZXIu DQogICAgICAgICAqLw0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIC8qDQogICAgICAgICAg ICAgKiBDaGVjayBpZiBzb21ldGhpbmcgZWxzZSBjb25maWd1cmVkIG91ciBpbnRlcmZhY2UuDQog ICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIGlmIChkaGNwQ29uZmlnID09IDAgJiYgbmlmLT5p Zl9sb2NhbF9pcCkgew0KICAgICAgICAgICAgICAgIC8qIElmIHdlIG5lZWQgYWRkaXRpb25hbCBj b25maWd1cmF0aW9uLCB3ZSBjYW4gc2VudA0KICAgICAgICAgICAgICAgICAgIGEgREhDUCBJbmZv cm0gbWVzc2FnZSBoZXJlLiAqLw0KICAgICAgICAgICAgICAgIGRoY3BTdGF0ZSA9IERIQ1BTVF9J RExFOw0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAg ICAgICBpZiAoKHNvY2sgPT0gMCkgfHwgKGJwID09IDApKSB7DQogICAgICAgICAgICAgICAgaWYg KHNvY2sgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICBzb2NrID0gTnV0VWRwQ3JlYXRlU29j a2V0KERIQ1BfQ0xJRU5UUE9SVCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAg IGlmIChicCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgIGJwID0gbWFsbG9jKHNpemVvZihC T09UUCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoKHNvY2sgPT0g MCkgfHwgKGJwID09IDApKSB7DQogICAgICAgICAgICAgICAgICAgIC8qIExvb2tzIGxpa2Ugd2Ug YXJlIG91dCBvZiBtZW1vcnkuICovDQogICAgICAgICAgICAgICAgICAgIGRoY3BFcnJvciA9IERI Q1BFUlJfU1lTVEVNOw0KICAgICAgICAgICAgICAgICAgICBkaGNwU3RhdGUgPSBESENQU1RfSURM RTsNCiAgICAgICAgICAgICAgICAgICAgLyogQXQgdGhpcyBwb2ludCBlaXRoZXIgc29ja2V0IG9y IGJ1ZmZlciBtYXkgYmUgYWxsb2NhdGVkLg0KICAgICAgICAgICAgICAgICAgICAgICBUaHVzIHdl IG5lZWQgdG8ganVtcCBiYWNrIHRvIHRoZSB0b3Agb2Ygb3VyIHN0YXRlIGxvb3ANCiAgICAgICAg ICAgICAgICAgICAgICAgdG8gcmVsZWFzZSBpdC4gKi8NCiAgICAgICAgICAgICAgICAgICAgY29u dGludWU7DQogICAgICAgICAgICAgICAgfQ0KI2lmIE1BWF9ESENQX0JVRlNJWkUNCiAgICAgICAg ICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1heF9tcyA9IE1BWF9ESENQ X0JVRlNJWkU7DQogICAgICAgICAgICAgICAgICAgIE51dFVkcFNldFNvY2tPcHQoc29jaywgU09f UkNWQlVGLCAmbWF4X21zLCBzaXplb2YobWF4X21zKSk7DQogICAgICAgICAgICAgICAgfQ0KI2Vu ZGlmDQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvKg0KICAgICAgICAgKiAo UmUpU3RhcnQuDQogICAgICAgICAqLw0KICAgICAgICBpZiAoZGhjcFN0YXRlID09IERIQ1BTVF9J TklUKSB7DQogICAgICAgICAgICAvKiBDbGVhciB0aGUgcmV0cnkgY291bnRlci4gKi8NCiAgICAg ICAgICAgIHJldHJpZXMgPSAwOw0KICAgICAgICAgICAgLyogVXNlIGEgbmV3IFhJRCBvbiBlYWNo IGF0dGVtcHQuICovDQogICAgICAgICAgICB4aWQrKzsNCiAgICAgICAgICAgIC8qIERldGVybWlu ZSB3aGV0aGVyIHRoaXMgaXMgYW4gaW5pdGlhbCBib290IG9yIGEgcmVib290LiAqLw0KICAgICAg ICAgICAgaWYgKChsYXN0X2lwICYgY29uZm5ldC5jZG5faXBfbWFzaykgPT0gMCkgew0KICAgICAg ICAgICAgICAgIC8qIE5vIHByZXZpb3VzIElQLCBzdGFydCBmcm9tIGdyb3VuZCB1cC4gKi8NCiAg ICAgICAgICAgICAgICBkaGNwU3RhdGUgPSBESENQU1RfU0VMRUNUSU5HOw0KICAgICAgICAgICAg fSBlbHNlIHsNCiAgICAgICAgICAgICAgICAvKiBXZSBnb3QgYSBwcmV2aW91c2x5IGFsbG9jYXRl ZCBJUCBjb25maWd1cmF0aW9uIGZyb20NCiAgICAgICAgICAgICAgICAgKiBub24tdm9sYXRpbGUg Y29uZmlndXJhdGlvbiBtZW1vcnkuIFRyeSB0byByZS11c2UgaXQuICovDQogICAgICAgICAgICAg ICAgZGhjcFN0YXRlID0gREhDUFNUX1JFQk9PVElORzsNCiAgICAgICAgICAgIH0NCiAgICAgICAg fQ0KDQoNCiAgICAgICAgLyoNCiAgICAgICAgICogQnJvYWRjYXN0IGRpc2NvdmVyIGFuZCBjb2xs ZWN0IGluY29taW5nIG9mZmVycy4NCiAgICAgICAgICovDQogICAgICAgIGVsc2UgaWYgKGRoY3BT dGF0ZSA9PSBESENQU1RfU0VMRUNUSU5HKSB7DQojaWZkZWYgTlVUREVCVUcNCiAgICAgICAgICAg IGlmIChfX3RjcF90cmYgJiBORVRfREJHX0RIQ1ApIGZwcmludGYoX190Y3BfdHJzLCAiW1NFTDog VElDSyAlcF0iLCBkaGNwQ29uZmlnKTsNCiNlbmRpZg0KDQogICAgICAgICAgICBpZiAocmV0cmll cysrID4gTUFYX0RDSFBfUkVUUklFUykgew0KICAgICAgICAgICAgICAgIGlmKCBkaGNwQ29uZmln KSB7DQogICAgICAgICAgICAgICAgICAgIC8qIFVscmljaCBzYXlzOiB3ZSBnb3QgYXQgbGVhc3Qg b25lIHZhbGlkIG9mZmVyIGZyb20gYSBESENQIHNlcnZlciAqLw0KICAgICAgICAgICAgICAgICAg ICByZXBseSA9IDA7DQogICAgICAgICAgICAgICAgICAgIGxlYXNlVGltZSA9IGFxc1RpbWU7DQog ICAgICAgICAgICAgICAgICAgIGRoY3BTdGF0ZSA9IERIQ1BTVF9CT1VORDsNCiAgICAgICAgICAg ICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8qIFRv byBtYW55IHJldHJpZXMgd2hpbGUgZGlzY292ZXJpbmcgREhDUC4gR2l2ZSB1cC4gKi8NCiAgICAg ICAgICAgICAgICAgICAgZGhjcEVycm9yID0gREhDUEVSUl9USU1FT1VUOw0KICAgICAgICAgICAg ICAgICAgICBkaGNwU3RhdGUgPSBESENQU1RfSURMRTsNCiAgICAgICAgICAgICAgICB9DQogICAg ICAgICAgICB9DQogICAgICAgICAgICAvKiBTZW5kIHRoZSBkaXNjb3ZlcmluZyBicm9hZGNhc3Qu ICovDQogICAgICAgICAgICBlbHNlIGlmIChEaGNwQnJvYWRjYXN0RGlzY292ZXIoc29jaywgYnAs IHhpZCwgbGFzdF9pcCwgc2VjcykgPCAwKSB7DQogICAgICAgICAgICAgICAgLyogRmF0YWwgdHJh bnNtaXQgZXJyb3Igb24gYnJvYWRjYXN0LiAqLw0KI2lmZGVmIE5VVERFQlVHDQogICAgICAgICAg ICAgICAgaWYgKF9fdGNwX3RyZiAmIE5FVF9EQkdfREhDUCkgZnByaW50ZihfX3RjcF90cnMsICJb U0VMLVRYRVJSXSIpOw0KI2VuZGlmDQogICAgICAgICAgICAgICAgZGhjcFN0YXRlID0gREhDUFNU X0lETEU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIC8qIENvbGxlY3Qg aW5jb21pbmcgb2ZmZXJzLiAqLw0KICAgICAgICAgICAgICAgIHdoaWxlICgobiA9IERoY3BSZWN2 TWVzc2FnZShzb2NrLCB4aWQsIGJwLCB0bW8pKSA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAg LyogQ2hlY2sgaWYgdGhpcyBpcyBhIHZhbGlkIG9mZmVyLiAqLw0KICAgICAgICAgICAgICAgICAg ICBpZiAoKGRoY3BDb25maWcgPSBDaGVja09mZmVyKGRoY3BDb25maWcsIGJwLCBuKSkgIT0gMCkg ew0KI2lmZGVmIE5VVERFQlVHDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX190Y3BfdHJm ICYgTkVUX0RCR19ESENQKSBmcHJpbnRmKF9fdGNwX3RycywgIltTRUwtT0ZGRVIgbj0lZF0iLCBu KTsNCiNlbmRpZg0KICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGNhbGxlcnMgdGlt ZW91dCBpcyBsb3csIGRvIG5vdCBjb2xsZWN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICBt b3JlIHRoYW4gb25lLiBUaGFua3MgdG8gSmVsbGUgS29rLiAqLw0KICAgICAgICAgICAgICAgICAg ICAgICAgaWYgKGRoY3BBcGlUaW1lb3V0IDwgTUlOX0RIQ1BfV0FJVCAqIDMpIHsNCiNpZmRlZiBO VVRERUJVRw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX3RjcF90cmYgJiBORVRf REJHX0RIQ1ApIGZwcmludGYoX190Y3BfdHJzLCAiW05PVExdIik7DQojZW5kaWYNCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAg ICAgICAgICAgICAgICAgICAgICAgIC8qIFN3aXRjaCB0byBsb3dlc3QgdGltZW91dCBhZnRlciB3 ZSByZWNlaXZlZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBmaXJzdCByZXNwb25zZS4g Ki8NCiAgICAgICAgICAgICAgICAgICAgICAgIHRtbyA9IE1JTl9ESENQX1dBSVQ7DQogICAgICAg ICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLyogQ2hh bmdlIHRvIEVSUk9SIHN0YXRlIG9uIGZhdGFsIHJlY2VpdmUgZXJyb3JzLiAqLw0KICAgICAgICAg ICAgICAgIGlmIChuIDwgMCkgew0KI2lmZGVmIE5VVERFQlVHDQogICAgICAgICAgICAgICAgICAg IGlmIChfX3RjcF90cmYgJiBORVRfREJHX0RIQ1ApIGZwcmludGYoX190Y3BfdHJzLCAiW1NFTC1G QVRFUlJdIik7DQojZW5kaWYNCiAgICAgICAgICAgICAgICAgICAgZGhjcFN0YXRlID0gREhDUFNU X0lETEU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8qIENoYW5nZSB0byBS RVFVRVNUSU5HIHN0YXRlIGlmIHdlIGdvdCBhIHZhbGlkIG9mZmVyLg0KICAgICAgICAgICAgICAg ICAgIE90aGVyd2lzZSB3ZSBzdGF5IGluIFNFTEVDVElORyBzdGF0ZS4gKi8NCiAgICAgICAgICAg ICAgICBlbHNlIGlmIChkaGNwQ29uZmlnKSB7DQogICAgICAgICAgICAgICAgICAgIC8qIFdhaXQg Zm9yIGF0IGxlYXN0IG9uZSBwZXJpb2QgZm9yIG90aGVyIERIQ1Agc2VydmVycyB0byBvZmZlciAq Lw0KICAgICAgICAgICAgICAgICAgICByZXRyaWVzID0gTUFYX0RDSFBfUkVUUklFUysxOw0KLy8g ICAgICAgICAgICAgICAgICAgIGRoY3BTdGF0ZSA9IERIQ1BTVF9SRVFVRVNUSU5HOw0KI2lmZGVm IE5VVERFQlVHDQogICAgICAgICAgICAgICAgICAgIGlmIChfX3RjcF90cmYgJiBORVRfREJHX0RI Q1ApIGZwcmludGYoX190Y3BfdHJzLCAiW1NFTC1XQUlUXSIpOw0KI2VuZGlmDQogICAgICAgICAg ICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCgkJDQoNCiAgICAgICAgLyoNCiAg ICAgICAgICogU2VuZCByZXF1ZXN0IGFuZCB3YWl0IGZvciBhbiBhY2tub3dsZWRnZS4NCiAgICAg ICAgICovDQogICAgICAgIGVsc2UgaWYgKGRoY3BTdGF0ZSA9PSBESENQU1RfUkVRVUVTVElORykg ew0KICAgICAgICAgICAgaWYgKHJldHJpZXMrKyA+IE1BWF9EQ0hQX1JFVFJJRVMpIHsNCiAgICAg ICAgICAgICAgICAvKiBUb28gbWFueSByZXRyaWVzIHdpdGggdGhpcyBzZXJ2ZXIsIGZhbGwgYmFj ayB0byBkaXNjb3ZlcnkuICovDQogICAgICAgICAgICAgICAgZGhjcFN0YXRlID0gREhDUFNUX0lO SVQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvKiBSZXF1ZXN0IGFuIG9mZmVyZWQgY29u ZmlndXJhdGlvbi4gQWNjb3JkaW5nIHRvIFJGQyAyMTMxIHRoaXMNCiAgICAgICAgICAgICAgIGhh cyB0byBiZSBicm9hZGNhc3RlZC4gKi8NCiAgICAgICAgICAgIGVsc2UgaWYgKERoY3BCcm9hZGNh c3RSZXF1ZXN0KHNvY2ssIGJwLCB4aWQsIDAsIGRoY3BDb25maWctPmR5bl95aWFkZHIsIGRoY3BD b25maWctPmR5bl9zaWQsIHNlY3MpIDwgMCkgew0KICAgICAgICAgICAgICAgIC8qIEZhdGFsIHRy YW5zbWl0IGVycm9yIG9uIGJyb2FkY2FzdC4gR2l2ZSB1cC4gKi8NCiAgICAgICAgICAgICAgICBk aGNwU3RhdGUgPSBESENQU1RfSURMRTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoKG4gPSBEaGNw UmVjdk1lc3NhZ2Uoc29jaywgeGlkLCBicCwgdG1vKSkgPCAwKSB7DQogICAgICAgICAgICAgICAg LyogRmF0YWwgcmVjZWl2ZSBlcnJvci4gKi8NCiAgICAgICAgICAgICAgICBkaGNwU3RhdGUgPSBE SENQU1RfSURMRTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobiA+IDAgJiYgKHJlcGx5ID0gUGFy c2VSZXBseShicCwgbikpICE9IDApIHsNCiAgICAgICAgICAgICAgICAvKiBUaGUgc2VydmVyIGFj Y2VwdGVkIG91ciByZXF1ZXN0LiBXZSBhcmUgYm91bmQuICovDQogICAgICAgICAgICAgICAgaWYg KHJlcGx5LT5keW5fbXNndHlwID09IERIQ1BfQUNLKSB7DQogICAgICAgICAgICAgICAgICAgIFJl bGVhc2VEeW5DZmcoZGhjcENvbmZpZyk7DQogICAgICAgICAgICAgICAgICAgIGRoY3BDb25maWcg PSByZXBseTsNCiAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSAwOw0KICAgICAgICAgICAgICAg ICAgICBsZWFzZVRpbWUgPSBhcXNUaW1lOw0KICAgICAgICAgICAgICAgICAgICBkaGNwU3RhdGUg PSBESENQU1RfQk9VTkQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8qIFRo ZSBzZXJ2ZXIgZGVjbGluZXMgYSBwcmV2aW91c2x5IG9mZmVyZWQgY29uZmlndXJhdGlvbi4NCiAg ICAgICAgICAgICAgICAgICBSZXN0YXJ0IGRpc2NvdmVyeS4gKi8NCiAgICAgICAgICAgICAgICBl bHNlIGlmIChyZXBseS0+ZHluX21zZ3R5cCA9PSBESENQX05BSykgew0KI2lmZGVmIE5VVERFQlVH DQogICAgICAgIGlmIChfX3RjcF90cmYgJiBORVRfREJHX0RIQ1ApIGZwcmludGYoX190Y3BfdHJz LCAiW0RIQ1AtTkFLMV0iKTsNCiNlbmRpZg0KICAgICAgICAgICAgICAgICAgICBkaGNwU3RhdGUg PSBESENQU1RfSU5JVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAg IH0NCg0KICAgICAgICAvKg0KICAgICAgICAgKiBSZXVzaW5nIGEgcHJldmlvdXNseSBhbGxvY2F0 ZWQgbmV0d29yayBhZGRyZXNzIGFmdGVyIHJlYm9vdC4NCiAgICAgICAgICovDQogICAgICAgIGVs c2UgaWYgKGRoY3BTdGF0ZSA9PSBESENQU1RfUkVCT09USU5HKSB7DQogICAgICAgICAgICBpZiAo KytyZXRyaWVzID4gTUFYX0RDSFBfUkVUUklFUykgew0KICAgICAgICAgICAgICAgIC8qIFRvbyBt YW55IHJldHJpZXMsIGZhbGwgYmFjayB0byBkaXNjb3ZlcnkuICovDQogICAgICAgICAgICAgICAg bGFzdF9pcCA9IDA7DQogICAgICAgICAgICAgICAgZGhjcFN0YXRlID0gREhDUFNUX0lOSVQ7DQog ICAgICAgICAgICB9DQogICAgICAgICAgICAvKiBCcm9hZGNhc3QgYSByZXF1ZXN0IGZvciBvdXIg cHJldmlvdXMgY29uZmlndXJhdGlvbi4gKi8NCiAgICAgICAgICAgIGVsc2UgaWYgKERoY3BCcm9h ZGNhc3RSZXF1ZXN0KHNvY2ssIGJwLCB4aWQsIDAsIGxhc3RfaXAsIDAsIHNlY3MpIDwgMCkgew0K ICAgICAgICAgICAgICAgIC8qIEZhdGFsIHRyYW5zbWl0IGVycm9yIG9uIGJyb2FkY2FzdC4gR2l2 ZSB1cC4gKi8NCiNpZmRlZiBOVVRERUJVRw0KICAgICAgICAgICAgICAgICAgICBpZiAoX190Y3Bf dHJmICYgTkVUX0RCR19ESENQKSBmcHJpbnRmKF9fdGNwX3RycywgIltCQy1GQVRBTF0iKTsNCiNl bmRpZg0KICAgICAgICAgICAgICAgIGRoY3BTdGF0ZSA9IERIQ1BTVF9JRExFOw0KICAgICAgICAg ICAgfSBlbHNlIGlmICgobiA9IERoY3BSZWN2TWVzc2FnZShzb2NrLCB4aWQsIGJwLCB0bW8pKSA8 IDApIHsNCiAgICAgICAgICAgICAgICAvKiBGYXRhbCByZWNlaXZlIGVycm9yLiAqLw0KI2lmZGVm IE5VVERFQlVHDQogICAgICAgICAgICAgICAgICAgIGlmIChfX3RjcF90cmYgJiBORVRfREJHX0RI Q1ApIGZwcmludGYoX190Y3BfdHJzLCAiW1JDVi1GQVRBTF0iKTsNCiNlbmRpZg0KICAgICAgICAg ICAgICAgIGRoY3BTdGF0ZSA9IERIQ1BTVF9JRExFOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChu ID4gMCAmJiAocmVwbHkgPSBQYXJzZVJlcGx5KGJwLCBuKSkgIT0gMCkgew0KICAgICAgICAgICAg ICAgIGlmIChyZXBseS0+ZHluX21zZ3R5cCA9PSBESENQX0FDSykgew0KICAgICAgICAgICAgICAg ICAgICBSZWxlYXNlRHluQ2ZnKGRoY3BDb25maWcpOw0KICAgICAgICAgICAgICAgICAgICBkaGNw Q29uZmlnID0gcmVwbHk7DQogICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gMDsNCiAgICAgICAg ICAgICAgICAgICAgbGVhc2VUaW1lID0gYXFzVGltZTsNCiAgICAgICAgICAgICAgICAgICAgZGhj cFN0YXRlID0gREhDUFNUX0JPVU5EOw0KI2lmZGVmIE5VVERFQlVHDQogICAgICAgICAgICAgICAg ICAgIGlmIChfX3RjcF90cmYgJiBORVRfREJHX0RIQ1ApIGZwcmludGYoX190Y3BfdHJzLCAiW09L XSIpOw0KI2VuZGlmDQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXBseS0+ZHluX21zZ3R5 cCA9PSBESENQX05BSykgew0KICAgICAgICAgICAgICAgICAgICAvKiBFaXRoZXIgb3VyIHByZXZp b3VzIGFkZHJlc3MgaGFkIGJlZW4gYWxsb2NhdGVkIGJ5DQogICAgICAgICAgICAgICAgICAgICAg IHNvbWVvbmUgZWxzZSBvciB3ZSBjaGFuZ2VkIHRoZSBuZXR3b3JrLiBSZW1vdmUgdGhlDQogICAg ICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIGFkZHJlc3MgYW5kIHJlc3RhcnQuICovDQojaWZk ZWYgTlVUREVCVUcNCiAgICAgICAgICAgICAgICAgICAgaWYgKF9fdGNwX3RyZiAmIE5FVF9EQkdf REhDUCkgZnByaW50ZihfX3RjcF90cnMsICJbREhDUC1OQUsyXSIpOw0KI2VuZGlmDQogICAgICAg ICAgICAgICAgICAgIGxhc3RfaXAgPSAwOw0KICAgICAgICAgICAgICAgICAgICBkaGNwU3RhdGUg PSBESENQU1RfSU5JVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAg IH0NCg0KICAgICAgICAvKg0KICAgICAgICAgKiBNYWludGFpbiBsZWFzZSB0aW1lLg0KICAgICAg ICAgKi8NCiAgICAgICAgZWxzZSBpZiAoZGhjcFN0YXRlID09IERIQ1BTVF9CT1VORCkgew0KICAg ICAgICAgICAgcmV0cmllcyA9IDA7DQogICAgICAgICAgICBOdXRFdmVudEJyb2FkY2FzdEFzeW5j KCZkaGNwRG9uZSk7IC8vIEFzeW5jIHdnLiBSYWNlY29uZGl0aW9uDQogICAgICAgICAgICBpZiAo ZGhjcENvbmZpZy0+ZHluX3JlbmV3YWxUaW1lIDw9IE51dEdldFNlY29uZHMoKSAtIGxlYXNlVGlt ZSkgew0KICAgICAgICAgICAgICAgIGRoY3BTdGF0ZSA9IERIQ1BTVF9SRU5FV0lORzsNCiAgICAg ICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSByZW1haW5p bmcgbGVhc2UgdGltZSBhbmQgdGFrZSBhIG5hcC4gKi8NCiAgICAgICAgICAgICAgICBuYXBUaW1l ID0gZGhjcENvbmZpZy0+ZHluX3JlbmV3YWxUaW1lIC0gKE51dEdldFNlY29uZHMoKSAtIGxlYXNl VGltZSk7DQogICAgICAgICAgICAgICAgaWYgKG5hcFRpbWUgPiBNQVhfREhDUF9OQVBUSU1FKSB7 DQogICAgICAgICAgICAgICAgICAgIG5hcFRpbWUgPSBNQVhfREhDUF9OQVBUSU1FOw0KICAgICAg ICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBOdXRFdmVudFdhaXQoJmRoY3BXYWtlLCBuYXBU aW1lICogMTAwMFVMKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8qDQog ICAgICAgICAqIFdhaXRpbmcgZm9yIGFuIGFja25vd2xlZGdlIG9mIG91ciByZW5ld2FsIHJlcXVl c3QuDQogICAgICAgICAqLw0KICAgICAgICBlbHNlIGlmIChkaGNwU3RhdGUgPT0gREhDUFNUX1JF TkVXSU5HKSB7DQogICAgICAgICAgICByZXRyaWVzKys7DQogICAgICAgICAgICBpZiAodG1vIC8g MTAwMCA+IGRoY3BDb25maWctPmR5bl9yZWJpbmRUaW1lIC0gKE51dEdldFNlY29uZHMoKSAtIGxl YXNlVGltZSkpIHsNCiAgICAgICAgICAgICAgICB0bW8gPSBkaGNwQ29uZmlnLT5keW5fcmViaW5k VGltZSAtIChOdXRHZXRTZWNvbmRzKCkgLSBsZWFzZVRpbWUpICogMTAwMDsNCiAgICAgICAgICAg IH0NCiAgICAgICAgICAgIGlmIChkaGNwQ29uZmlnLT5keW5fcmViaW5kVGltZSA8PSBOdXRHZXRT ZWNvbmRzKCkgLSBsZWFzZVRpbWUpIHsNCiAgICAgICAgICAgICAgICByZXRyaWVzID0gMDsNCiAg ICAgICAgICAgICAgICBkaGNwU3RhdGUgPSBESENQU1RfUkVCSU5ESU5HOw0KICAgICAgICAgICAg fQ0KICAgICAgICAgICAgLyogU2VuZCBhIHJlcXVlc3QgdG8gb3VyIGxlYXNpbmcgc2VydmVyLiBX ZSBtdXN0IG5vdCBpbmNsdWRlDQogICAgICAgICAgICAgICB0aGUgc2VydmVyIGlkZW50aWZpZXIu ICovDQogICAgICAgICAgICBlbHNlIGlmIChEaGNwU2VuZFJlcXVlc3Qoc29jaywgZGhjcENvbmZp Zy0+ZHluX3NpZCwgYnAsIHhpZCwgZGhjcENvbmZpZy0+ZHluX3lpYWRkciwgZGhjcENvbmZpZy0+ ZHluX3lpYWRkciwgMCwgc2VjcykgPA0KICAgICAgICAgICAgICAgICAgICAgMCkgew0KICAgICAg ICAgICAgICAgIC8qIFVuaWNhc3QgdHJhbnNtaXQgZXJyb3IuICovDQogICAgICAgICAgICAgICAg cmV0cmllcyA9IDA7DQogICAgICAgICAgICAgICAgZGhjcFN0YXRlID0gREhDUFNUX1JFQklORElO RzsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoKG4gPSBEaGNwUmVjdk1lc3NhZ2Uoc29jaywgeGlk LCBicCwgdG1vKSkgPCAwKSB7DQogICAgICAgICAgICAgICAgLyogRmF0YWwgcmVjZWl2ZSBlcnJv ci4gKi8NCiAgICAgICAgICAgICAgICBkaGNwU3RhdGUgPSBESENQU1RfSURMRTsNCiAgICAgICAg ICAgIH0gZWxzZSBpZiAobiA+IDAgJiYgKHJlcGx5ID0gUGFyc2VSZXBseShicCwgbikpICE9IDAp IHsNCiAgICAgICAgICAgICAgICBpZiAocmVwbHktPmR5bl9tc2d0eXAgPT0gREhDUF9BQ0spIHsN CiAgICAgICAgICAgICAgICAgICAgLyogR290IGFuIGFja25vd2xlZGdlLCByZXR1cm4gdG8gYm91 bmQgc3RhdGUuICovDQogICAgICAgICAgICAgICAgICAgIFJlbGVhc2VEeW5DZmcoZGhjcENvbmZp Zyk7DQogICAgICAgICAgICAgICAgICAgIGRoY3BDb25maWcgPSByZXBseTsNCiAgICAgICAgICAg ICAgICAgICAgcmVwbHkgPSAwOw0KICAgICAgICAgICAgICAgICAgICBsZWFzZVRpbWUgPSBhcXNU aW1lOw0KICAgICAgICAgICAgICAgICAgICBkaGNwU3RhdGUgPSBESENQU1RfQk9VTkQ7DQogICAg ICAgICAgICAgICAgfSBlbHNlIGlmIChyZXBseS0+ZHluX21zZ3R5cCA9PSBESENQX05BSykgew0K ICAgICAgICAgICAgICAgICAgICAvKiBVbmV4cGVjdGVkIE5BSy4gKi8NCiNpZmRlZiBOVVRERUJV Rw0KICAgICAgICAgICAgICAgICAgICBpZiAoX190Y3BfdHJmICYgTkVUX0RCR19ESENQKSBmcHJp bnRmKF9fdGNwX3RycywgIltESENQLVVYTkFLXSIpOw0KI2VuZGlmDQogICAgICAgICAgICAgICAg ICAgIHJldHJpZXMgPSAwOw0KICAgICAgICAgICAgICAgICAgICBkaGNwU3RhdGUgPSBESENQU1Rf UkVCSU5ESU5HOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0K DQogICAgICAgIC8qDQogICAgICAgICAqIFdhaXRpbmcgZm9yIGFuIGFja25vd2xlZGdlIG9mIG91 ciByZWJpbmQgcmVxdWVzdC4NCiAgICAgICAgICovDQogICAgICAgIGVsc2UgaWYgKGRoY3BTdGF0 ZSA9PSBESENQU1RfUkVCSU5ESU5HKSB7DQogICAgICAgICAgICByZXRyaWVzKys7DQogICAgICAg ICAgICBpZiAodG1vID4gZGhjcENvbmZpZy0+ZHluX3JlYmluZFRpbWUgLSAoTnV0R2V0U2Vjb25k cygpIC0gbGVhc2VUaW1lKSkgew0KICAgICAgICAgICAgICAgIHRtbyA9IGRoY3BDb25maWctPmR5 bl9yZWJpbmRUaW1lIC0gTnV0R2V0U2Vjb25kcygpIC0gbGVhc2VUaW1lOw0KICAgICAgICAgICAg fQ0KICAgICAgICAgICAgaWYgKGRoY3BDb25maWctPmR5bl9yZWJpbmRUaW1lIDw9IE51dEdldFNl Y29uZHMoKSAtIGxlYXNlVGltZSkgew0KICAgICAgICAgICAgICAgIHJldHJpZXMgPSAwOw0KICAg ICAgICAgICAgICAgIGRoY3BTdGF0ZSA9IERIQ1BTVF9SRUJJTkRJTkc7DQogICAgICAgICAgICB9 DQogICAgICAgICAgICAvKiBCcm9hZGNhc3QgYSByZXF1ZXN0IGZvciBvdXIgcHJldmlvdXMgY29u ZmlndXJhdGlvbi4gV2UNCiAgICAgICAgICAgICAgIG11c3Qgbm90IGluY2x1ZGUgYSBzZXJ2ZXIg aWRlbnRpZmllci4gKi8NCiAgICAgICAgICAgIGVsc2UgaWYgKERoY3BCcm9hZGNhc3RSZXF1ZXN0 KHNvY2ssIGJwLCB4aWQsIGRoY3BDb25maWctPmR5bl95aWFkZHIsIGRoY3BDb25maWctPmR5bl95 aWFkZHIsIDAsIHNlY3MpIDwgMCkgew0KICAgICAgICAgICAgICAgIC8qIEZhdGFsIHRyYW5zbWl0 IGVycm9yIG9uIGJyb2FkY2FzdC4gR2l2ZSB1cC4gKi8NCiAgICAgICAgICAgICAgICBkaGNwU3Rh dGUgPSBESENQU1RfSURMRTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoKG4gPSBEaGNwUmVjdk1l c3NhZ2Uoc29jaywgeGlkLCBicCwgdG1vKSkgPCAwKSB7DQogICAgICAgICAgICAgICAgLyogRmF0 YWwgcmVjZWl2ZSBlcnJvci4gKi8NCiAgICAgICAgICAgICAgICBkaGNwU3RhdGUgPSBESENQU1Rf SURMRTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobiA+IDAgJiYgKHJlcGx5ID0gUGFyc2VSZXBs eShicCwgbikpICE9IDApIHsNCiAgICAgICAgICAgICAgICBpZiAocmVwbHktPmR5bl9tc2d0eXAg PT0gREhDUF9BQ0spIHsNCiAgICAgICAgICAgICAgICAgICAgLyogR290IGFuIGFja25vd2xlZGdl LCByZXR1cm4gdG8gYm91bmQgc3RhdGUuICovDQogICAgICAgICAgICAgICAgICAgIFJlbGVhc2VE eW5DZmcoZGhjcENvbmZpZyk7DQogICAgICAgICAgICAgICAgICAgIGRoY3BDb25maWcgPSByZXBs eTsNCiAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSAwOw0KICAgICAgICAgICAgICAgICAgICBs ZWFzZVRpbWUgPSBhcXNUaW1lOw0KICAgICAgICAgICAgICAgICAgICBkaGNwU3RhdGUgPSBESENQ U1RfQk9VTkQ7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXBseS0+ZHluX21zZ3R5cCA9 PSBESENQX05BSykgew0KICAgICAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAg ICAgKiBXZSBoYXZlIGEgcHJvYmxlbSBoZXJlIGlmIHRoZSBsYXN0IERIQ1Agc2VydmVyIGRpZWQu DQogICAgICAgICAgICAgICAgICAgICAqIElmIGEgYmFja3VwIHNlcnZlciBleGlzdHMsIGl0IG1h eSBwcm9iZSBvdXIgSVAgYWRkcmVzcw0KICAgICAgICAgICAgICAgICAgICAgKiB1c2luZyBBUlAg b3IgSUNNUC4gT3VyIGludGVyZmFjZSBpcyB1cCBhbmQgcmVzcG9uZGluZywNCiAgICAgICAgICAg ICAgICAgICAgICogc28gdGhlIGJhY2t1cCBzZXJ2ZXIgbWF5IHRoaW5rIHRoYXQgdGhlIElQIGFk ZHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICogaXMgaW4gdXNlIGFuZCByZXNwb25kIHdpdGgg TkFLLiBXaXRob3V0IHNodXR0aW5nDQogICAgICAgICAgICAgICAgICAgICAqIGRvd24gb3VyIGlu dGVyZmFjZSAobm90IHlldCBpbXBsZW1lbnRlZCkgd2UgYXJlIHN0dWNrLg0KICAgICAgICAgICAg ICAgICAgICAgKiBXZSBzd2l0Y2ggdG8gZGlzY292ZXJ5IHN0YXRlLCBidXQgdGhlIHByb2JsZW0g cmVtYWlucy4NCiAgICAgICAgICAgICAgICAgICAgICovDQojaWZkZWYgTlVUREVCVUcNCiAgICAg ICAgICAgICAgICAgICAgaWYgKF9fdGNwX3RyZiAmIE5FVF9EQkdfREhDUCkgZnByaW50ZihfX3Rj cF90cnMsICJbREhDUC1OQUszXSIpOw0KI2VuZGlmDQogICAgICAgICAgICAgICAgICAgIGRoY3BT dGF0ZSA9IERIQ1BTVF9JTklUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAg ICAgICAgfQ0KDQogICAgICAgIC8qDQogICAgICAgICAqIFNlbmQgYW4gaW5mb3JtIGFuZCB3YWl0 IGZvciBpdHMgKG9wdGlvbmFsKSBlY2hvLg0KICAgICAgICAgKi8NCiAgICAgICAgZWxzZSBpZiAo ZGhjcFN0YXRlID09IERIQ1BTVF9JTkZPUk1JTkcpIHsNCiAgICAgICAgICAgIGlmIChyZXRyaWVz KysgPiBNQVhfRENIUF9SRVRSSUVTKSB7DQogICAgICAgICAgICAgICAgZGhjcFN0YXRlID0gREhD UFNUX0lETEU7DQogICAgICAgICAgICB9IGVsc2UgaWYgKERoY3BTZW5kSW5mb3JtKHNvY2ssIHNl cnZlcl9pcCwgYnAsIHhpZCwgbmlmLT5pZl9sb2NhbF9pcCkgPCAwKSB7DQogICAgICAgICAgICAg ICAgaWYgKHNlcnZlcl9pcCA9PSBJTkFERFJfQlJPQURDQVNUKSB7DQogICAgICAgICAgICAgICAg ICAgIGRoY3BTdGF0ZSA9IERIQ1BTVF9JRExFOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAg ICAgIH0gZWxzZSBpZiAoKG4gPSBEaGNwUmVjdk1lc3NhZ2Uoc29jaywgeGlkLCBicCwgdG1vKSkg IT0gMCkgew0KICAgICAgICAgICAgICAgIGlmIChuID4gMCAmJiAgICAvKiBObyByZWNlaXZlIGVy cm9yLiAqLw0KICAgICAgICAgICAgICAgICAgICAocmVwbHkgPSBQYXJzZVJlcGx5KGJwLCBuKSkg IT0gMCAmJiAvKiBObyBwYXJzZXIgZXJyb3IuICovDQogICAgICAgICAgICAgICAgICAgIHJlcGx5 LT5keW5fbXNndHlwID09IERIQ1BfQUNLKSB7ICAgIC8qIEFja25vd2xlZGdlZC4gKi8NCiAgICAg ICAgICAgICAgICAgICAgLyogVGFrZSBvdmVyIHRoaXMgY29uZmlndXJhdGlvbi4gKi8NCiAgICAg ICAgICAgICAgICAgICAgUmVsZWFzZUR5bkNmZyhkaGNwQ29uZmlnKTsNCiAgICAgICAgICAgICAg ICAgICAgZGhjcENvbmZpZyA9IHJlcGx5Ow0KICAgICAgICAgICAgICAgICAgICByZXBseSA9IDA7 DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGRoY3BTdGF0ZSA9IERIQ1BTVF9J RExFOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLyoNCiAgICAgICAgICog U2VuZCBhIHJlbGVhc2UgYW5kIHdhaXQgZm9yIGl0cyAob3B0aW9uYWwpIGVjaG8uDQogICAgICAg ICAqLw0KICAgICAgICBlbHNlIGlmIChkaGNwU3RhdGUgPT0gREhDUFNUX1JFTEVBU0lORykgew0K ICAgICAgICAgICAgaWYgKGRoY3BDb25maWcgPT0gMCB8fCAgICAgIC8qIE5vdCBjb25maWd1cmVk LiAqLw0KICAgICAgICAgICAgICAgIHJldHJpZXMrKyA+IE1BWF9EQ0hQX1JFTEVBU0VfUkVUUklF UyB8fCAvKiBUb28gbWFueSByZXRyaWVzLiAqLw0KICAgICAgICAgICAgICAgIERoY3BTZW5kUmVs ZWFzZShzb2NrLCBzZXJ2ZXJfaXAsIGJwLCB4aWQsIGRoY3BDb25maWctPmR5bl95aWFkZHIsIGRo Y3BDb25maWctPmR5bl9zaWQpIDwgMCkgew0KICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJfaXAg PT0gSU5BRERSX0JST0FEQ0FTVCkgew0KICAgICAgICAgICAgICAgICAgICBkaGNwU3RhdGUgPSBE SENQU1RfSURMRTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2UgaWYgKChu ID0gRGhjcFJlY3ZNZXNzYWdlKHNvY2ssIHhpZCwgYnAsIHRtbykpIDwgMCkgew0KICAgICAgICAg ICAgICAgIC8qIEZhdGFsIHJlY2VpdmUgZXJyb3IuICovDQogICAgICAgICAgICAgICAgZGhjcFN0 YXRlID0gREhDUFNUX0lETEU7DQogICAgICAgICAgICB9IGVsc2UgaWYgKG4gPiAwICYmIChyZXBs eSA9IFBhcnNlUmVwbHkoYnAsIG4pKSAhPSAwKSB7DQogICAgICAgICAgICAgICAgaWYgKHJlcGx5 LT5keW5fbXNndHlwID09IERIQ1BfQUNLKSB7DQogICAgICAgICAgICAgICAgICAgIGRoY3BTdGF0 ZSA9IERIQ1BTVF9JRExFOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVwbHktPmR5bl9t c2d0eXAgPT0gREhDUF9OQUspIHsNCiNpZmRlZiBOVVRERUJVRw0KICAgICAgICAgICAgICAgICAg ICBpZiAoX190Y3BfdHJmICYgTkVUX0RCR19ESENQKSBmcHJpbnRmKF9fdGNwX3RycywgIltESENQ LUZOQUtdIik7DQojZW5kaWYNCiAgICAgICAgICAgICAgICAgICAgZGhjcFN0YXRlID0gREhDUFNU X0lETEU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAg ICAgICAgLyoNCiAgICAgICAgICogV2UgYXJlIGRvbmUgc29tZWhvdy4gRWl0aGVyIGEgZmF0YWwg ZXJyb3Igb2NjdXJlZCBvciB3ZQ0KICAgICAgICAgKiByZWFjaGVkIHRoZSBzcGVjaWZpZWQgdGlt ZW91dCB0aW1lIG9yIG91ciBsZWFzZSBoYXMgYmVlbg0KICAgICAgICAgKiByZWxlYXNlIG9yIHNv bWV0aGluZyBlbHNlIGNvbmZpZ3VyZWQgb3VyIGludGVyZmFjZS4NCiAgICAgICAgICogUmVsZWFz ZSBhbGwgcmVzb3VyY2VzIGFuZCB3YWl0IGZvciBhIG5ldyBBUEkgY2FsbCB0bw0KICAgICAgICAg KiB3YWtlIHVzIHVwLg0KICAgICAgICAgKi8NCiAgICAgICAgZWxzZSBpZiAoZGhjcFN0YXRlID09 IERIQ1BTVF9JRExFKSB7DQogICAgICAgICAgICBSZWxlYXNlRHluQ2ZnKGRoY3BDb25maWcpOw0K ICAgICAgICAgICAgZGhjcENvbmZpZyA9IDA7DQogICAgICAgICAgICByZXRyaWVzID0gMDsNCiAg ICAgICAgICAgIE51dEV2ZW50QnJvYWRjYXN0QXN5bmMoJmRoY3BEb25lKTsgLy8gQXN5bmMgd2cu IFJhY2Vkb25kaXRpb24NCgkJCS8vIGlmIHdlIGhhdmUgYSBkZXZpY2UNCiAgICAgICAgICAgIGlm KGRoY3BEZXYhPTApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KCQkJCQkJICAgIAlO dXRJcFJvdXRlRGVsQWxsKGRoY3BEZXYpOyAvLyBkZWxldGUgYWxsIHJvdXRlcywgYmVjYXVzZSB0 aGV5IGFyZSBuZWVkaW5nIEhlYXAgbWVtb3J5IGFuZCB0aGlzIGhhcyB0byBiZWUgZnJlZWQuDQoJ CQkJCQkJfQ0KDQoJCQkNCgkJCQ0KICAgICAgICAgICAgTnV0RXZlbnRXYWl0KCZkaGNwV2FrZSwg TlVUX1dBSVRfSU5GSU5JVEUpOw0KICAgICAgICB9DQojaWZkZWYgTlVUREVCVUcNCiAgICAgICBE aGNwU3RhdGVEZWJ1ZyggMSwgZGhjcFN0YXRlLCBsYXN0X2lwLCBsZWFzZVRpbWUsIHJldHJpZXMp Ow0KI2VuZGlmDQogICAgICAgIC8qIFJlbGVhc2UgYW55IHJlY2VpdmVkIHJlcGx5LiAqLw0KICAg ICAgICBpZiAocmVwbHkpIHsNCiAgICAgICAgICAgIFJlbGVhc2VEeW5DZmcocmVwbHkpOw0KICAg ICAgICAgICAgcmVwbHkgPSAwOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQovKiENCiAqIFxicmll ZiBBY3RpdmF0ZSB0aGUgREhDUCBjbGllbnQgdGhyZWFkLg0KICoNCiAqIFN0YXJ0IHRoZSBESENQ IHRocmVhZCBpZiBub3QgcnVubmluZyBvciB3YWtlIGl0IHVwLiBQYXNzIHRoZSBjYWxsZXIncw0K ICogdGltZW91dCB0byB0aGUgdGhyZWFkIGFuZCB3YWl0IGFuIGluZmluaXRlIHRpbWUuIFdlIHJl bHkgb24gdGhlIHRocmVhZA0KICogdG8gd2FrZSB1cyB1cCBvbiB0aW1lb3V0Lg0KICoNCiAqIFxw YXJhbSBuYW1lICAgIE5hbWUgb2YgdGhlIHJlZ2lzdGVyZWQgRXRoZXJuZXQgZGV2aWNlLg0KICog XHBhcmFtIHN0YXRlICAgU3RhdGUgdG8gc3RhcnQgd2l0aC4NCiAqIFxwYXJhbSB0aW1lb3V0IE1h eGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0LiBUbyBkaXNhYmxlDQogKiAgICAg ICAgICAgICAgICB0aW1lb3V0LCBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gXHJlZiBOVVRfV0FJVF9J TkZJTklURS4NCiAqICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgbXVzdCBiZSBsYXJnZXIgdGhh biAzIHRpbWVzIG9mIFxyZWYgTUlOX0RIQ1BfV0FJVA0KICogICAgICAgICAgICAgICAgdG8gZW5h YmxlIGNvbGxlY3Rpb24gb2Ygb2ZmZXJzIGZyb20gbXVsdGlwbGUgc2VydmVycy4NCiAqLw0Kc3Rh dGljIGludCBEaGNwS2ljayhjb25zdCBjaGFyICpuYW1lLCB1aW50OF90IHN0YXRlLCB1aW50MzJf dCB0aW1lb3V0KQ0Kew0KICAgIE5VVERFVklDRSAqZGV2Ow0KICAgIElGTkVUICpuaWY7DQoNCiAg ICAvKiBMb29rdXAgdGhlIEV0aGVybmV0IGRldmljZS4gKi8NCiAgICBpZiAoKGRldiA9IE51dERl dmljZUxvb2t1cChuYW1lKSkgPT0gMCB8fCAgIC8qIE5vIGRldmljZSAqLw0KICAgICAgICBkZXYt PmRldl90eXBlICE9IElGVFlQX05FVCB8fCAgIC8qIFdyb25nIHR5cGUgKi8NCiAgICAgICAgKG5p ZiA9IGRldi0+ZGV2X2ljYikgPT0gMCB8fCAgICAvKiBObyBuZXRpZiAqLw0KICAgICAgICBuaWYt PmlmX3R5cGUgIT0gSUZUX0VUSEVSKSB7ICAgIC8qIFdyb25nIGlmIHR5cGUgKi8NCiAgICAgICAg ZGhjcEVycm9yID0gREhDUEVSUl9CQURERVY7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoN CiAgICAvKiBJbml0aWFsaXplIHRpbWVvdXQgY2hlY2tpbmcuICovDQogICAgZGhjcEFwaVN0YXJ0 ID0gTnV0R2V0TWlsbGlzKCk7DQogICAgZGhjcEFwaVRpbWVvdXQgPSB0aW1lb3V0Ow0KDQogICAg ZGhjcFN0YXRlID0gc3RhdGU7DQogICAgaWYgKGRoY3BUaHJlYWQgPT0gMCkgew0KI2lmZGVmIF9f YXJtX18NCiAgICAgICAgZGhjcERldiA9IGRldjsNCiNlbmRpZg0KICAgICAgICBkaGNwVGhyZWFk ID0gTnV0VGhyZWFkQ3JlYXRlKCJkaGNwYyIsIE51dERoY3BDbGllbnQsIGRldiwNCiAgICAgICAg ICAgIChOVVRfVEhSRUFEX0RIQ1BTVEFDSyAqIE5VVF9USFJFQURfU1RBQ0tfTVVMVCkgKyBOVVRf VEhSRUFEX1NUQUNLX0FERCk7DQogICAgfQ0KICAgIE51dEV2ZW50UG9zdEFzeW5jKCZkaGNwV2Fr ZSk7ICAvLyBFcnJvciByYWNlIGNvbmRpdGlvbg0KICAgIE51dEV2ZW50V2FpdCgmZGhjcERvbmUs IE5VVF9XQUlUX0lORklOSVRFKTsNCg0KICAgIHJldHVybiAwOw0KfQ0KDQovKiENCiAqIFxicmll ZiBBdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSBhbiBFdGhlcm5ldCBuZXR3b3JrIGludGVyZmFjZS4N CiAqDQogKiBJZiBubyBNQUMgYWRkcmVzcyBpcyBzcGVjaWZpZWQsIHRoaXMgcm91dGluZSB3aWxs IHRyeSB0byByZWFkIGENCiAqIHByZXZpb3VzbHkgc3RvcmVkIGNvbmZpZ3VyYXRpb24gZnJvbSB0 aGUgRUVQUk9NLiBJZiB0aGlzIHJldHJpZXZlcw0KICogYSBmaXhlZCBJUCBjb25maWd1cmF0aW9u LCB0aGVuIHRoZSBuZXR3b3JrIGludGVyZmFjZSB3aWxsIGJlDQogKiBpbW1lZGlhdGVseSBjb25m aWd1cmVkIHdpdGggdGhlc2UgdmFsdWVzIGJ5IGNhbGxpbmcgTnV0TmV0SWZDb25maWcoKS4NCiAq IElmIG5vIHZhbGlkIElQIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gcmVhZCwgdGhlbiB0aGlzIHJv dXRpbmUgd2lsbA0KICogc3RhcnQgdGhlIERIQ1AgY2xpZW50IHRocmVhZCBhbmQgd2FpdCB1cHRv IGEgZ2l2ZW4gbnVtYmVyIG9mDQogKiBtaWxsaXNlY29uZHMgZm9yIGFuIGFja25vd2xlZGdlZCBj b25maWd1cmF0aW9uIGZyb20gYSBESENQIHNlcnZlci4NCiAqDQogKiBJZiBhIE1BQyBhZGRyZXNz IGhhcyBiZWVuIHNwZWNpZmllZCwgdGhpcyByb3V0aW5lIHdpbGwgbm90IHJlYWQgdGhlDQogKiBF RVBST00gY29uZmlndXJhdGlvbi4gSWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBzZXQgdGhlIGdsb2Jh bA0KICogXHJlZiBDT05GTkVUIHN0cnVjdHVyZSB0byBhIHZhbGlkIElQIGNvbmZpZ3VyYXRpb24g YmVmb3JlIGNhbGxpbmcNCiAqIHRoaXMgZnVuY3Rpb24sIHRoZW4gdGhlIG5ldHdvcmsgaW50ZXJm YWNlIHdpbGwgYmUgaW1tZWRpYXRlbHkNCiAqIGNvbmZpZ3VyZWQgd2l0aCB0aGVzZSB2YWx1ZXMg YnkgY2FsbGluZyBOdXROZXRJZkNvbmZpZygpLiBPdGhlcndpc2UNCiAqIHRoZSBESENQIGNsaWVu dCB0aHJlYWQgd2lsbCBiZSBzdGFydGVkIGFuZCB0aGlzIHJvdXRpbmUgd2lsbCB3YWl0DQogKiB1 cHRvIGEgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmb3IgYW4gYWNrbm93bGVkZ2VkIGNv bmZpZ3VyYXRpb24NCiAqIGZyb20gYSBESENQIHNlcnZlci4NCiAqDQogKiBccGFyYW0gbmFtZSAg ICBOYW1lIG9mIHRoZSByZWdpc3RlcmVkIEV0aGVybmV0IGRldmljZS4NCiAqIFxwYXJhbSBtYWMg ICAgIE1BQyBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbi4gU2V0IE5VTEwgdG8gdXNlIHRoZQ0K ICogICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBzdG9yZWQgaW4gdGhlIEVFUFJPTS4NCiAq IFxwYXJhbSB0aW1lb3V0IE1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0LiBU byBkaXNhYmxlDQogKiAgICAgICAgICAgICAgICB0aW1lb3V0LCBzZXQgdGhpcyBwYXJhbWV0ZXIg dG8gXHJlZiBOVVRfV0FJVF9JTkZJTklURS4NCiAqICAgICAgICAgICAgICAgIE90aGVyd2lzZSB0 aGUgdmFsdWUgbXVzdCBiZSBsYXJnZXIgdGhhbiAzIHRpbWVzIG9mDQogKiAgICAgICAgICAgICAg ICBccmVmIE1JTl9ESENQX1dBSVQgdG8gZW5hYmxlIGNvbGxlY3Rpb24gb2Ygb2ZmZXJzDQogKiAg ICAgICAgICAgICAgICBmcm9tIG11bHRpcGxlIHNlcnZlcnMuDQogKg0KICogXHJldHVybiAwIGlm IHRoZSBpbnRlcmZhY2UgaGFkIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWQuIEluIG1vc3QN CiAqICAgICAgICAgY2FzZXMgdGhpcyBpbmZvcm1hdGlvbiBpcyBzdWZmaWNpZW50LCBiZWNhdXNl IHRoZSBhcHBsaWNhdGlvbg0KICogICAgICAgICB3aWxsIG5vdCBjYXJlIHdoZXRoZXIgdGhlIGNv bmZpZ3VyYXRpb24gaGFkIGJlZW4gcHJvdmlkZWQgYnkNCiAqICAgICAgICAgYSBESENQIHNlcnZl ciBvciBFRVBST00gdmFsdWVzLiBIb3dldmVyLCBpZiBFRVBST00gdmFsdWVzIGhhZA0KICogICAg ICAgICBiZWVuIHVzZWQsIHRoZW4gbm8gRE5TIHNlcnZlcnMgaGFkIGJlZW4gc2V0LiBUaGUgYXBw bGljYXRpb24NCiAqICAgICAgICAgY2FuIGNhbGwgTnV0RGhjcFN0YXR1cygpIHRvIGNoZWNrIHRo ZSBESENQIGJvdW5kIHN0YXRlLiAtMSBpcw0KICogICAgICAgICByZXR1cm5lZCBpZiB0aGUgaW50 ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZmFpbGVkLiBJbiB0aGlzIGNhc2UNCiAqICAgICAgICAgTnV0 RGhjcEVycm9yKCkgY2FuIGJlIGNhbGxlZCB0byBnZXQgYSBtb3JlIHNwZWNpZmljIGVycm9yDQog KiAgICAgICAgIGNvZGUuDQogKi8NCmludCBOdXREaGNwSWZDb25maWcoY29uc3QgY2hhciAqbmFt ZSwgdWludDhfdCAqIG1hYywgdWludDMyX3QgdGltZW91dCkNCnsNCiAgICBOVVRERVZJQ0UgKmRl djsNCiAgICBJRk5FVCAqbmlmID0gTlVMTDsNCg0KICAgIC8qDQogICAgICogVmVyaWZ5IHRoZSBn aXZlbiBFdGhlcm5ldCBkZXZpY2UuDQogICAgICovDQogICAgZGV2ID0gTnV0RGV2aWNlTG9va3Vw KG5hbWUpOw0KICAgIGlmIChkZXYgJiYgZGV2LT5kZXZfdHlwZSA9PSBJRlRZUF9ORVQpIHsNCiAg ICAgICAgbmlmID0gKElGTkVUICopIGRldi0+ZGV2X2ljYjsNCiAgICB9DQogICAgaWYgKG5pZiA9 PSBOVUxMIHx8IG5pZi0+aWZfdHlwZSAhPSBJRlRfRVRIRVIpIHsNCiAgICAgICAgLyogTm90IGEg bmV0d29yayBkZXZpY2Ugb3Igd3JvbmcgaW50ZXJmYWNlIHR5cGUuICovDQogICAgICAgIGRoY3BF cnJvciA9IERIQ1BFUlJfQkFEREVWOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAg LyoNCiAgICAgKiBEZXRlcm1pbmUgdGhlIE1BQyBhZGRyZXNzLg0KICAgICAqLw0KICAgIGlmICht YWMgJiYgIUVUSEVSX0lTX0JST0FEQ0FTVChtYWMpKSB7DQogICAgICAgICAvKiBJZiB0aGUgY2Fs bGVyIHNwZWNpZmllZCBhIHZhbGlkIE1BQyBhZGRyZXNzLCB3ZSB1c2UgaXQNCiAgICAgICAgICAg IHRvIG92ZXJyaWRlIHRoZSBjb25maWd1cmF0aW9uLiAqLw0KICAgICAgICBtZW1jcHkoY29uZm5l dC5jZG5fbWFjLCBtYWMsIHNpemVvZihjb25mbmV0LmNkbl9tYWMpKTsNCiAgICB9DQogICAgZWxz ZSBpZiAoRVRIRVJfSVNfWkVSTyhuaWYtPmlmX21hYykpIHsNCiAgICAgICAgLyogVGhlIGludGVy ZmFjZSBoYXMgbm90IGRlZmluZWQgYSBNQUMuIFRyeSB0byBnZXQgb25lIGZyb20NCiAgICAgICAg ICAgbm9uLXZvbGF0aWxlIG1lbW9yeS4gKi8NCiAgICAgICAgTnV0TmV0TG9hZENvbmZpZyhuYW1l KTsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIENoZWNrIGlmIHdlIGhhdmUgYSB2YWxpZCBNQUMg YWRkcmVzcy4gSW4gb3JkZXIgdG8gbWFpbnRhaW4NCiAgICAgKiBiYWNrd2FyZCBjb21wYXRpYmls aXR5LCB3ZSBhY2NlcHQgYW55dGhpbmcgd2hpY2ggaXMgbmVpdGhlcg0KICAgICAqIHplcm8gbm9y IHRoZSBicm9hZGNhc3QgYWRkcmVzcy4gTGF0ZXIgdmVyc2lvbnMgbWF5IGJlY29tZSBtb3JlDQog ICAgICogcmVzdHJpY3RpdmUgYW5kIGRlbWFuZCBhIHZhbGlkIHVuaWNhc3QgYWRkcmVzcy4NCiAg ICAgKi8NCiAgICBpZiAoRVRIRVJfSVNfWkVSTyhjb25mbmV0LmNkbl9tYWMpIHx8IEVUSEVSX0lT X0JST0FEQ0FTVChjb25mbmV0LmNkbl9tYWMpKSB7DQogICAgICAgIGRoY3BFcnJvciA9IERIQ1BF UlJfTk9NQUM7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICAvKg0KICAgICAqIENv cHkgdGhlIE1BQyBhZGRyZXNzIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlLiBUaGlzIHdpbGwN CiAgICAgKiBtYWdpY2FsbHkgZW5hYmxlIHRoZSBicmFpbiBkZWFkIGludGVyZmFjZS4NCiAgICAg Ki8NCiAgICBtZW1jcHkobmlmLT5pZl9tYWMsIGNvbmZuZXQuY2RuX21hYywgNik7DQogICAgTnV0 U2xlZXAoNTAwKTsNCg0KICAgIC8qDQogICAgICogWmVybyBvdXQgdGhlIGlwIGFkZHJlc3MgYW5k IG1hc2suIFRoaXMgYWxsb3dzIHRvIHN3aXRjaCBiZXR3ZWVuDQogICAgICogREhDUCBhbmQgc3Rh dGljIElQIGFkZHJlc3NlcyB3aXRob3V0IHJlc2V0dGluZy9wb3dlciBjeWNsaW5nLg0KICAgICAq IFNlZSBwYXRjaCAjMjkwMzk0MC4NCiAgICAgKi8NCiAgICBuaWYtPmlmX2xvY2FsX2lwID0gMDsN CiAgICBuaWYtPmlmX21hc2sgPSBjb25mbmV0LmNkbl9pcF9tYXNrOw0KDQogICAgLyoNCiAgICAg KiBJZiB0aGUgRUVQUk9NIGNvbnRhaW5zIGEgZml4ZWQgbmV0d29yayBjb25maWd1cmF0aW9uLCB3 ZSBza2lwIERIQ1AuDQogICAgICovDQogICAgaWYgKGNvbmZuZXQuY2RuX2NpcF9hZGRyICYgY29u Zm5ldC5jZG5faXBfbWFzaykgew0KICAgICAgICAvKiBHaXZlIHVwIGEgcHJldmlvdXNseSBhbGxv Y2F0ZWQgbGVhc2UuIFNlZSBwYXRjaCAjMjkwMzk0MC4gKi8NCiAgICAgICAgKHZvaWQpTnV0RGhj cFJlbGVhc2UobmFtZSwgKDMqTUlOX0RIQ1BfV0FJVCkpOw0KICAgICAgICBjb25mbmV0LmNkbl9p cF9hZGRyID0gY29uZm5ldC5jZG5fY2lwX2FkZHI7DQogICAgICAgIHJldHVybiBOdXROZXRJZkNv bmZpZzIobmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZuZXQuY2RuX21hYywNCiAg ICAgICAgICAgICAgICAgICAgICAgIGNvbmZuZXQuY2RuX2lwX2FkZHIsDQogICAgICAgICAgICAg ICAgICAgICAgICBjb25mbmV0LmNkbl9pcF9tYXNrLA0KICAgICAgICAgICAgICAgICAgICAgICAg Y29uZm5ldC5jZG5fZ2F0ZXdheSk7DQogICAgfQ0KDQogICAgLyoNCiAgICAgKiBTdGFydCB0aGUg REhDUCB0aHJlYWQgaWYgbm90IHJ1bm5pbmcgb3Igd2FrZSBpdCB1cC4gUGFzcyB0aGUgY2FsbGVy J3MNCiAgICAgKiB0aW1lb3V0IHRvIHRoZSB0aHJlYWQgYW5kIHdhaXQgYW4gaW5maW5pdGUgdGlt ZS4gV2UgcmVseSBvbiB0aGUgdGhyZWFkDQogICAgICogdG8gd2FrZSB1cyB1cCBvbiB0aW1lb3V0 Lg0KICAgICAqLw0KICAgIGlmIChEaGNwS2ljayhuYW1lLCBESENQU1RfSU5JVCwgdGltZW91dCkg PT0gMCkgew0KICAgICAgICAvKg0KICAgICAgICAgKiBUaGUgdGhyZWFkIGZpbmlzaGVkIGl0cyB0 YXNrLiBJZiBpdCByZWFjaGVkIHRoZSBib3VuZCBzdGF0ZSwgdGhlbg0KICAgICAgICAgKiB3ZSBn b3QgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gREhDUC4NCiAgICAgICAgICovDQogICAgICAg IGlmIChkaGNwU3RhdGUgPT0gREhDUFNUX0JPVU5EKSB7DQojaWZkZWYgTlVUREVCVUcNCiAgICAg ICAgICAgIGlmIChfX3RjcF90cmYgJiBORVRfREJHX0RIQ1ApIHsNCiAgICAgICAgICAgICAgICBm cHJpbnRmKF9fdGNwX3RycywgIltESENQLUNvbmZpZyAlc10iLCBpbmV0X250b2EoZGhjcENvbmZp Zy0+ZHluX3lpYWRkcikpOw0KICAgICAgICAgICAgfQ0KI2VuZGlmDQogICAgICAgICAgICBOdXRO ZXRJZlNldHVwKGRldiwgZGhjcENvbmZpZy0+ZHluX3lpYWRkciwgZGhjcENvbmZpZy0+ZHluX25l dG1hc2ssIGRoY3BDb25maWctPmR5bl9nYXRld2F5KTsNCiAgICAgICAgICAgIE51dERuc0NvbmZp ZzIoTlVMTCwgTlVMTCwgZGhjcENvbmZpZy0+ZHluX3BkbnMsIGRoY3BDb25maWctPmR5bl9zZG5z KTsNCiAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQoNCiAgICAgICAgLyoNCiAgICAg ICAgICogT3VyIGludGVyZmFjZSBoYXMgYmVlbiBjb25maWd1cmVkIGV4dGVybmFsbHksIHBvc3Np Ymx5IGJ5IGF1dG8NCiAgICAgICAgICogQVJQIG9yIGEgc2ltaWxhciBmdW5jdGlvbiBpbXBsZW1l bnRlZCBieSB0aGUgYXBwbGljYXRpb24uDQogICAgICAgICAqLw0KICAgICAgICBpZiAobmlmLT5p Zl9sb2NhbF9pcCkgew0KI2lmZGVmIE5VVERFQlVHDQogICAgICAgICAgICBpZiAoX190Y3BfdHJm ICYgTkVUX0RCR19ESENQKSB7DQogICAgICAgICAgICAgICAgZnByaW50ZihfX3RjcF90cnMsICJb REhDUC1FeHRlcm5hbCAlc10iLCBpbmV0X250b2EobmlmLT5pZl9sb2NhbF9pcCkpOw0KICAgICAg ICAgICAgfQ0KI2VuZGlmDQogICAgICAgICAgICByZXR1cm4gMDsNCiAgICAgICAgfQ0KDQogICAg ICAgIC8qDQogICAgICAgICAqIERIQ1AgZmFpbGVkLiBJbiBjYXNlIHdlIHJlbWVtYmVyIGEgcHJl dmlvdXNseSBhbGxvY2F0ZWQgYWRkcmVzcywNCiAgICAgICAgICogdGhlbiBsZXQncyB1c2UgaXQu DQogICAgICAgICAqLw0KICAgICAgICBpZiAoKGNvbmZuZXQuY2RuX2lwX2FkZHIgJiBjb25mbmV0 LmNkbl9pcF9tYXNrKSAhPSAwKSB7DQojaWZkZWYgTlVUREVCVUcNCiAgICAgICAgICAgIGlmIChf X3RjcF90cmYgJiBORVRfREJHX0RIQ1ApIHsNCiAgICAgICAgICAgICAgICBmcHJpbnRmKF9fdGNw X3RycywgIltESENQLVJldXNpbmcgJXNdIiwgaW5ldF9udG9hKGNvbmZuZXQuY2RuX2lwX2FkZHIp KTsNCiAgICAgICAgICAgIH0NCiNlbmRpZg0KICAgICAgICAgICAgTnV0TmV0SWZDb25maWcyKG5h bWUsIGNvbmZuZXQuY2RuX21hYywgY29uZm5ldC5jZG5faXBfYWRkciwgY29uZm5ldC5jZG5faXBf bWFzaywgY29uZm5ldC5jZG5fZ2F0ZXdheSk7DQogICAgICAgICAgICByZXR1cm4gMDsNCiAgICAg ICAgfQ0KICAgIH0NCiAgICByZXR1cm4gLTE7DQp9DQoNCi8qIQ0KICogXGJyaWVmIFJlbGluZ3Vp c2ggb3VyIERIQ1AgbGVhc2UuDQogKg0KICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGJ5 IHRoZSBhcHBsaWNhdGlvbiBpZiB3ZSBhcmUgbW92aW5nDQogKiB0byBhbm90aGVyIG5ldHdvcmsu IEl0IGhlbHBzIHRoZSBESENQIHNlcnZlciB0byB0aWR5IHVwIGhpcw0KICogYWxsb2NhdGlvbiB0 YWJsZSwgYnV0IGlzIG5vdCBhIHJlcXVpcmVkIERIQ1AgZnVuY3Rpb24uDQogKg0KICogVXBvbiBy ZXR1cm4sIHRoZSBzeXN0ZW0gc2hvdWxkIGJlIHNodXQgZG93biB3aXRoaW4gMjAgc2Vjb25kcy4N CiAqDQogKiBUaGUgY2xpZW50IG11c3QgcmVzaWRlIGluIHN0YXRlIFxyZWYgREhDUFNUX0JPVU5E Lg0KICoNCiAqIFxwYXJhbSBuYW1lICAgIE5hbWUgb2YgdGhlIHJlZ2lzdGVyZWQgRXRoZXJuZXQg ZGV2aWNlLCBjdXJyZW50bHkgaWdub3JlZC4NCiAqIFxwYXJhbSB0aW1lb3V0IE1heGltdW0gbnVt YmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0Lg0KICoNCiAqIFxyZXR1cm4gMCBvbiBzdWNjZXNz IG9yIC0xIGluIGNhc2Ugb2YgYW4gZXJyb3IuDQogKi8NCmludCBOdXREaGNwUmVsZWFzZShjb25z dCBjaGFyICpuYW1lLCB1aW50MzJfdCB0aW1lb3V0KQ0Kew0KICAgIC8qIENoZWNrIHRoZSBzdGF0 ZS4gKi8NCiAgICBpZiAoZGhjcFN0YXRlICE9IERIQ1BTVF9CT1VORCkgew0KICAgICAgICBkaGNw RXJyb3IgPSBESENQRVJSX1NUQVRFOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAg LyogQWN0aW9uISAqLw0KICAgIHJldHVybiBEaGNwS2ljayhuYW1lLCBESENQU1RfUkVMRUFTSU5H LCB0aW1lb3V0KTsNCn0NCg0KLyohDQogKiBcYnJpZWYgSW5mb3JtIERIQ1AgYWJvdXQgYW4gYWxs b2NhdGVkIGFkZHJlc3MuDQogKg0KICogVGhlIGNsaWVudCBtdXN0IHJlc2lkZSBpbiBzdGF0ZSBc cmVmIERIQ1BTVF9JRExFLg0KICoNCiAqIFxwYXJhbSBuYW1lICAgIE5hbWUgb2YgdGhlIHJlZ2lz dGVyZWQgRXRoZXJuZXQgZGV2aWNlLCBjdXJyZW50bHkgaWdub3JlZC4NCiAqIFxwYXJhbSB0aW1l b3V0IE1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0Lg0KICoNCiAqIFxyZXR1 cm4gMCBvbiBzdWNjZXNzIG9yIC0xIGluIGNhc2Ugb2YgYW4gZXJyb3IuDQogKi8NCmludCBOdXRE aGNwSW5mb3JtKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHRpbWVvdXQpDQp7DQogICAgLyog Q2hlY2sgdGhlIHN0YXRlLiAqLw0KICAgIGlmIChkaGNwU3RhdGUgIT0gREhDUFNUX0lETEUpIHsN CiAgICAgICAgZGhjcEVycm9yID0gREhDUEVSUl9TVEFURTsNCiAgICAgICAgcmV0dXJuIC0xOw0K ICAgIH0NCg0KICAgIC8qIEFjdGlvbiEgKi8NCiAgICByZXR1cm4gRGhjcEtpY2sobmFtZSwgREhD UFNUX0lORk9STUlORywgdGltZW91dCk7DQp9DQoNCi8qIQ0KICogXGJyaWVmIFJldHVybiBESENQ IGNsaWVudCBzdGF0dXMuDQogKg0KICogXHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVnaXN0ZXJl ZCBFdGhlcm5ldCBkZXZpY2UsIGN1cnJlbnRseSBpZ25vcmVkLg0KICoNCiAqIFxyZXR1cm4gREhD UCBzdGF0dXMgY29kZSwgd2hpY2ggbWF5IGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOg0KICogICAg ICAgICAtIFxyZWYgREhDUFNUX0lOSVQNCiAqICAgICAgICAgLSBccmVmIERIQ1BTVF9TRUxFQ1RJ TkcNCiAqICAgICAgICAgLSBccmVmIERIQ1BTVF9SRVFVRVNUSU5HDQogKiAgICAgICAgIC0gXHJl ZiBESENQU1RfUkVCT09USU5HDQogKiAgICAgICAgIC0gXHJlZiBESENQU1RfQk9VTkQNCiAqICAg ICAgICAgLSBccmVmIERIQ1BTVF9SRU5FV0lORw0KICogICAgICAgICAtIFxyZWYgREhDUFNUX1JF QklORElORw0KICogICAgICAgICAtIFxyZWYgREhDUFNUX0lORk9STUlORw0KICogICAgICAgICAt IFxyZWYgREhDUFNUX1JFTEVBU0lORw0KICogICAgICAgICAtIFxyZWYgREhDUFNUX0lETEUNCiAq Lw0KaW50IE51dERoY3BTdGF0dXMoY29uc3QgY2hhciAqbmFtZSkNCnsNCiAgICByZXR1cm4gZGhj cFN0YXRlOw0KfQ0KDQovKiENCiAqIFxicmllZiBSZXR1cm4gREhDUCBlcnJvciBjb2RlLg0KICoN CiAqIFBvc3NpYmxlIGVycm9yIGNvZGVzIGFyZQ0KICoNCiAqICAgICAgICAgLSBccmVmIERIQ1BF UlJfVElNRU9VVA0KICogICAgICAgICAtIFxyZWYgREhDUEVSUl9OT01BQw0KICogICAgICAgICAt IFxyZWYgREhDUEVSUl9CQURERVYNCiAqICAgICAgICAgLSBccmVmIERIQ1BFUlJfU1lTVEVNDQog KiAgICAgICAgIC0gXHJlZiBESENQRVJSX1RSQU5TTUlUDQogKiAgICAgICAgIC0gXHJlZiBESENQ RVJSX1JFQ0VJVkUNCiAqDQogKiBUaGUgZXJyb3Igd2lsbCBiZSBjbGVhcmVkIHVwb24gcmV0dXJu Lg0KICoNCiAqIFxwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlZ2lzdGVyZWQgRXRoZXJuZXQgZGV2 aWNlLCBjdXJyZW50bHkgaWdub3JlZC4NCiAqDQogKiBccmV0dXJuIERIQ1AgZXJyb3IgY29kZSBv ciAwIGlmIG5vIGVycm9yIG9jY3VyZWQuDQogKi8NCmludCBOdXREaGNwRXJyb3IoY29uc3QgY2hh ciAqbmFtZSkNCnsNCiAgICBpbnQgcmMgPSBkaGNwRXJyb3I7DQogICAgZGhjcEVycm9yID0gMDsN CiAgICByZXR1cm4gcmM7DQp9DQoNCi8qIQ0KICogXGJyaWVmIENoZWNrIGlmIERIQ1AgaGFzIGNv bmZpZ3VyZWQgb3VyIGludGVyZmFjZQ0KICoNCiAqIFxkZXByZWNhdGVkIEFwcGxpY2F0aW9ucyBz aG91bGQgdXNlIE51dERoY3BTdGF0dXMoKS4NCiAqDQogKiBccmV0dXJuIDAgaWYgREhDUCBpcyBp biBib3VuZCBzdGF0ZS4NCiAqLw0KaW50IE51dERoY3BJc0NvbmZpZ3VyZWQodm9pZCkNCnsNCiAg ICByZXR1cm4gKGRoY3BTdGF0ZSA9PSBESENQU1RfQk9VTkQpOw0KfQ0KDQovKkB9Ki8NCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmh0dHA6Ly9saXN0cy5l Z25pdGUuZGUvbWFpbG1hbi9saXN0aW5mby9lbi1udXQtZGlzY3Vzc2lvbgo=