LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBTQU0gU29mdHdhcmUgUGFja2FnZSBMaWNlbnNlDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEF0bWVsIENvcnBvcmF0aW9uDQogKg0KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqDQogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KICoNCiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93Lg0KICoNCiAqIEF0bWVsJ3MgbmFtZSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCiAqDQogKiBESVNDTEFJTUVSOiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SDQogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GDQogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UIEFSRQ0KICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwNCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLA0KICogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcNCiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwNCiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKi8NCg0KLyoqIFxhZGR0b2dyb3VwIGFlc19tb2R1bGUgV29ya2luZyB3aXRoIEFFUw0KICogXGluZ3JvdXAgcGVyaXBoZXJhbHNfbW9kdWxlDQogKiBUaGUgQUVTIGRyaXZlciBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIHRvIGNvbmZpZ3VyZSBhbmQgdXNlIHRoZSBBRVMgcGVyaXBoZXJhbC4NCiAqIFxuDQogKg0KICogVGhlIEFkdmFuY2VkIEVuY3J5cHRpb24gU3RhbmRhcmQgKEFFUykgc3BlY2lmaWVzIGEgRklQUy1hcHByb3ZlZCBjcnlwdG9ncmFwaGljIGFsZ29yaXRobQ0KICogdGhhdCBjYW4gYmUgdXNlZCB0byBwcm90ZWN0IGVsZWN0cm9uaWMgZGF0YS4gVGhlIEFFUyBhbGdvcml0aG0gaXMgYSBzeW1tZXRyaWMgYmxvY2sgDQogKiBjaXBoZXIgdGhhdCBjYW4gZW5jcnlwdCAoZW5jaXBoZXIpIGFuZCBkZWNyeXB0IChkZWNpcGhlcikgaW5mb3JtYXRpb24uDQogKiBFbmNyeXB0aW9uIGNvbnZlcnRzIGRhdGEgdG8gYW4gdW5pbnRlbGxpZ2libGUgZm9ybSBjYWxsZWQgY2lwaGVydGV4dC4gDQogKiBEZWNyeXB0aW5nIHRoZSBjaXBoZXJ0ZXh0IGNvbnZlcnRzIHRoZSBkYXRhIGJhY2sgaW50byBpdHMgb3JpZ2luYWwgZm9ybSwgDQogKiBjYWxsZWQgcGxhaW50ZXh0LiBUaGUgQ0lQSEVSIGJpdCBpbiB0aGUgQUVTIE1vZGUgUmVnaXN0ZXIgKEFFU19NUikgYWxsb3dzIHNlbGVjdGlvbiANCiAqIGJldHdlZW4gdGhlIGVuY3J5cHRpb24gYW5kIHRoZSBkZWNyeXB0aW9uIHByb2Nlc3Nlcy4gVGhlIEFFUyBpcyBjYXBhYmxlIG9mIHVzaW5nIGNyeXB0b2dyYXBoaWMgDQogKiBrZXlzIG9mIDEyOC8xOTIvMjU2IGJpdHMgdG8gZW5jcnlwdCBhbmQgZGVjcnlwdCBkYXRhIGluIGJsb2NrcyBvZiAxMjggYml0cy4gDQogKiBUaGlzIDEyOC1iaXQvMTkyLWJpdC8yNTYtYml0IGtleSBpcyBkZWZpbmVkIGluIHRoZSBLZXkgUmVnaXN0ZXJzIChBRVNfS0VZV1J4KSBhbmQgc2V0IGJ5IA0KICogQUVTX1dyaXRlS2V5KCkuIFRoZSBpbnB1dCB0byB0aGUgZW5jcnlwdGlvbiBwcm9jZXNzZXMgb2YgdGhlIENCQywgQ0ZCLCBhbmQgT0ZCIG1vZGVzIGluY2x1ZGVzLA0KICogaW4gYWRkaXRpb24gdG8gdGhlIHBsYWludGV4dCwgYSAxMjgtYml0IGRhdGEgYmxvY2sgY2FsbGVkIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSwgDQogKiB3aGljaCBtdXN0IGJlIHNldCB3aXRoIEFFU19TZXRWZWN0b3IoKS4gDQogKiBUaGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGlzIHVzZWQgaW4gYW4gaW5pdGlhbCBzdGVwIGluIHRoZSBlbmNyeXB0aW9uIG9mIGEgbWVzc2FnZSBhbmQgDQogKiBpbiB0aGUgY29ycmVzcG9uZGluZyBkZWNyeXB0aW9uIG9mIHRoZSBtZXNzYWdlLiBUaGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yIFJlZ2lzdGVycyBhcmUgDQogKiBhbHNvIHVzZWQgYnkgdGhlIENUUiBtb2RlIHRvIHNldCB0aGUgY291bnRlciB2YWx1ZS4NCiAqDQogICogVG8gRW5hYmxlIGEgQUVTIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24sdGhlIHVzZXIgaGFzIHRvIGZvbGxvdyB0aGVzZSBmZXcgc3RlcHM6DQogKiA8dWw+DQogKiA8bGk+IEEgc29mdHdhcmUgdHJpZ2dlcmVkIGhhcmR3YXJlIHJlc2V0IG9mIHRoZSBBRVMgaW50ZXJmYWNlIGlzIHBlcmZvcm1lZCBieSBBRVNfU29mdFJlc2V0KCkuPC9saT4NCiAqIDxsaT4gQ29uZmlndXJlIEFFUyBhbGdvcml0aG0gbW9kZSwga2V5IG1vZGUsIHN0YXJ0IG1vZGUgYW5kIG9wZXJhdGlvbiBtb2RlIGJ5IEFFU19Db25maWd1cmUoKS4gPC9saT4NCiAqIDxsaT4gSW5wdXQgQUVTIGRhdGEgZm9yIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gd2l0aCBmdW5jdGlvbiBBRVNfU2V0SW5wdXQoKSA8L2xpPg0KICogPGxpPiBTZXQgQUVTIGtleSB3aXRoIGZ1Y250aW9uIEFFU19Xcml0ZUtleSgpLiA8L2xpPg0KICogPGxpPiBUbyBzdGFydCB0aGUgZW5jcnlwdGlvbiBvciB0aGUgZGVjcnlwdGlvbiBwcm9jZXNzIHdpdGggQUVTX1N0YXJ0KCk8L2xpPg0KICogPGxpPiBUbyBnZXQgdGhlIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiByZXNsdXQgYnkgQUVTX0dldE91dHB1dCgpIDwvbGk+DQogKiA8L3VsPg0KICoNCiAqDQogKiBGb3IgbW9yZSBhY2N1cmF0ZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGxvb2sgYXQgdGhlIEFFUyBzZWN0aW9uIG9mIHRoZQ0KICogRGF0YXNoZWV0Lg0KICoNCiAqIFJlbGF0ZWQgZmlsZXMgOlxuDQogKiBccmVmIGFlcy5jXG4NCiAqIFxyZWYgYWVzLmhcbg0KICovDQovKkB7Ki8NCi8qQH0qLw0KDQoNCi8qKg0KICogXGZpbGUNCiAqDQogKiBJbXBsZW1lbnRhdGlvbiBvZiBBZHZhbmNlZCBFbmNyeXB0aW9uIFN0YW5kYXJkIChBRVMpDQogKg0KICovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgIEhlYWRlcnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCiNpbmNsdWRlICJjaGlwLmgiDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgIEV4cG9ydGVkIGZ1bmN0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqDQogKiBcYnJpZWYgU3RhcnRzIE1hbnVhbCBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcHJvY2Vzcy4NCiAqLw0Kdm9pZCBBRVNfU3RhcnQodm9pZCkNCnsNCiAgICBBRVMtPkFFU19DUiA9IEFFU19DUl9TVEFSVDsNCn0NCg0KLyoqDQogKiBcYnJpZWYgUmVzZXRzIHRoZSBBRVMuIEEgc29mdHdhcmUgdHJpZ2dlcmVkIGhhcmR3YXJlIHJlc2V0IG9mIHRoZSBBRVMgaW50ZXJmYWNlIGlzIHBlcmZvcm1lZC4NCiAqLw0Kdm9pZCBBRVNfU29mdFJlc2V0KHZvaWQpDQp7DQogICAgQUVTLT5BRVNfQ1IgPSBBRVNfQ1JfU1dSU1Q7DQp9DQoNCi8qKg0KICogXGJyaWVmIFJlc3RhcnRzIHRoZSBjb3VudGVybWVhc3VyZXMgZ2VuZXJhdG9yIHRvIGFuIGludGVybmFsIHByZS1kZWZpbmVkIHZhbHVlLg0KICovDQp2b2lkIEFFU19SZWNvdW50KHZvaWQpDQp7DQogICAgQUVTLT5BRVNfQ1IgPSBBRVNfQ1JfTE9BRFNFRUQ7DQp9DQoNCi8qKg0KICogXGJyaWVmIENvbmZpZ3VyZXMgYW4gQUVTIHBlcmlwaGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuDQogKiAgXHBhcmFtIG1vZGUgIERlc2lyZWQgdmFsdWUgZm9yIHRoZSBBRVMgbW9kZSByZWdpc3RlciAoc2VlIHRoZSBkYXRhc2hlZXQpLg0KICovDQp2b2lkIEFFU19Db25maWd1cmUodWludDMyX3QgbW9kZSkNCnsNCiAgICBBRVMtPkFFU19NUiA9IG1vZGU7IA0KfQ0KDQovKioNCiAqIFxicmllZiBFbmFibGVzIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHRzIHNvdXJjZXMgb24gYSBBRVMgcGVyaXBoZXJhbC4NCiAqIFxwYXJhbSBzb3VyY2VzICBCaXR3aXNlIE9SIG9mIHNlbGVjdGVkIGludGVycnVwdCBzb3VyY2VzLg0KICovDQp2b2lkIEFFU19FbmFibGVJdCh1aW50MzJfdCBzb3VyY2VzKQ0Kew0KICAgIEFFUy0+QUVTX0lFUiA9IHNvdXJjZXM7DQp9DQoNCi8qKg0KICogXGJyaWVmIERpc2FibGVzIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHRzIHNvdXJjZXMgb24gYSBBRVMgcGVyaXBoZXJhbC4NCiAqIFxwYXJhbSBzb3VyY2VzICBCaXR3aXNlIE9SIG9mIHNlbGVjdGVkIGludGVycnVwdCBzb3VyY2VzLg0KICovDQp2b2lkIEFFU19EaXNhYmxlSXQodWludDMyX3Qgc291cmNlcykNCnsNCiAgICBBRVMtPkFFU19JRFIgPSBzb3VyY2VzOw0KfQ0KDQovKioNCiAqIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRoZSBnaXZlbiBBRVMgcGVyaXBoZXJhbC4NCiAqIFxyZXR1cm4gIEFFUyBzdGF0dXMgcmVnaXN0ZXIuDQogKi8NCnVpbnQzMl90IEFFU19HZXRTdGF0dXModm9pZCkNCnsNCiAgICByZXR1cm4gQUVTLT5BRVNfSVNSOw0KfQ0KDQovKioNCiAqIFxicmllZiBTZXQgdGhlIDEyOC1iaXQvMTkyLWJpdC8yNTYtYml0IGNyeXB0b2dyYXBoaWMga2V5IHVzZWQgZm9yIGVuY3J5cHRpb24vZGVjcnlwdGlvbi4NCiAqIFxwYXJhbSBwS2V5IFBvaW50ZXIgdG8gYSAxNi8yNC8zMiBieXRlcyBjaXBoZXIga2V5Lg0KICogXHBhcmFtIGtleUxlbmd0aCBsZW5ndGggb2Yga2V5DQogKi8NCnZvaWQgQUVTX1dyaXRlS2V5KGNvbnN0IHVpbnQzMl90ICpwS2V5LCB1aW50MzJfdCBrZXlMZW5ndGgpDQp7DQogICAgQUVTLT5BRVNfS0VZV1JbMF0gPSBwS2V5WzBdOw0KICAgIEFFUy0+QUVTX0tFWVdSWzFdID0gcEtleVsxXTsNCiAgICBBRVMtPkFFU19LRVlXUlsyXSA9IHBLZXlbMl07DQogICAgQUVTLT5BRVNfS0VZV1JbM10gPSBwS2V5WzNdOw0KDQogICAgaWYoIGtleUxlbmd0aCA+PSAyNCApIHsNCiAgICAgICAgQUVTLT5BRVNfS0VZV1JbNF0gPSBwS2V5WzRdOw0KICAgICAgICBBRVMtPkFFU19LRVlXUls1XSA9IHBLZXlbNV07DQogICAgfQ0KICAgIGlmKCBrZXlMZW5ndGggPT0gMzIgKSB7DQogICAgICAgIEFFUy0+QUVTX0tFWVdSWzZdID0gcEtleVs2XTsNCiAgICAgICAgQUVTLT5BRVNfS0VZV1JbN10gPSBwS2V5WzddOw0KICAgIH0NCn0NCg0KLyoqDQogKiBcYnJpZWYgU2V0IHRoZSBmb3IgMzItYml0IGlucHV0IERhdGEgYWxsb3cgdG8gc2V0IHRoZSAxMjgtYml0IGRhdGEgYmxvY2sgdXNlZCBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLg0KICogXHBhcmFtIGRhdGEgUG9pbnRlciB0byB0aGUgMTYtYnl0ZXMgZGF0YSB0byBjaXBoZXIvZGVjaXBoZXIuDQogKi8NCnZvaWQgQUVTX1NldElucHV0KHVpbnQzMl90ICpkYXRhKQ0Kew0KICAgIHVpbnQ4X3QgaTsNCiAgICBmb3IgKGkgPSAwOyBpPCA0OyBpKyspDQogICAgICAgIEFFUy0+QUVTX0lEQVRBUltpXSA9IGRhdGFbaV07DQp9DQoNCi8qKg0KICogXGJyaWVmIEdldCB0aGUgZm91ciAzMi1iaXQgZGF0YSBjb250YWluIHRoZSAxMjgtYml0IGRhdGEgYmxvY2sgd2hpY2ggaGFzIGJlZW4gZW5jcnlwdGVkL2RlY3J5cHRlZC4NCiAqIFxwYXJhbSBkYXRhIHBvaW50ZXIgdG8gdGhlIHdvcmQgdGhhdCBoYXMgYmVlbiBlbmNyeXB0ZWQvZGVjcnlwdGVkLi4NCiAqLw0Kdm9pZCBBRVNfR2V0T3V0cHV0KHVpbnQzMl90ICpkYXRhKQ0Kew0KICAgIHVpbnQ4X3QgaTsNCiAgICBmb3IgKGkgPSAwOyBpPCA0OyBpKyspIA0KICAgICAgICBkYXRhW2ldID0gQUVTLT5BRVNfT0RBVEFSW2ldOw0KfQ0KDQovKioNCiAqIFxicmllZiBTZXQgZm91ciA2NC1iaXQgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGRhdGEgYmxvY2ssIHdoaWNoIGlzIHVzZWQgYnkgc29tZQ0KICogbW9kZXMgb2Ygb3BlcmF0aW9uIGFzIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBpbnB1dC4NCiAqIFxwYXJhbSBwVmVjdG9yIHBvaW50IHRvIHRoZSB3b3JkIG9mIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IuDQogKi8NCnZvaWQgQUVTX1NldFZlY3Rvcihjb25zdCB1aW50MzJfdCAqcFZlY3RvcikNCnsNCiAgICBBRVMtPkFFU19JVlJbMF0gPSBwVmVjdG9yWzBdOw0KICAgIEFFUy0+QUVTX0lWUlsxXSA9IHBWZWN0b3JbMV07DQogICAgQUVTLT5BRVNfSVZSWzJdID0gcFZlY3RvclsyXTsNCiAgICBBRVMtPkFFU19JVlJbM10gPSBwVmVjdG9yWzNdOw0KfQ0KDQoNCi8qKg0KICogXGJyaWVmIFNldCBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIEFBRCBkYXRhIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkLg0KICogXHBhcmFtIGxlbiBMZW5ndGguDQogKi8NCnZvaWQgQUVTX1NldEFhZExlbih1aW50MzJfdCBsZW4pDQp7DQogICAgQUVTLT5BRVNfQUFETEVOUiA9IGxlbjsNCn0NCg0KLyoqDQogKiBcYnJpZWYgU2V0IExlbmd0aCBpbiBieXRlcyBvZiB0aGUgTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSANCiAqIHBsYWludGV4dC9jaXBoZXJ0ZXh0IChDKSBkYXRhIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkLi4NCiAqIFxwYXJhbSBsZW4gTGVuZ3RoLg0KICovDQp2b2lkIEFFU19TZXREYXRhTGVuKHVpbnQzMl90IGxlbikNCnsNCiAgICBBRVMtPkFFU19DTEVOUiA9IGxlbjsNCn0NCg0KLyoqDQogKiBcYnJpZWYgU2V0IFRoZSBmb3VyIDMyLWJpdCBIYXNoIFdvcmQgcmVnaXN0ZXJzIGV4cG9zZSB0aGUgaW50ZXJtZWRpYXRlIEdIQVNIIHZhbHVlLiANCiAqIE1heSBiZSByZWFkIHRvIHNhdmUgdGhlIGN1cnJlbnQgR0hBU0ggdmFsdWUgc28gcHJvY2Vzc2luZyBjYW4gbGF0ZXIgYmUgcmVzdW1lZCwgDQogKiBwcmVzdW1hYmx5IG9uIGEgbGF0ZXIgbWVzc2FnZSBmcmFnbWVudC4gbW9kZXMgb2Ygb3BlcmF0aW9uIGFzIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBpbnB1dC4NCiAqIFxwYXJhbSBoYXNoIHBvaW50IHRvIHRoZSB3b3JkIG9mIHRoZSBoYXNoLg0KICovDQp2b2lkIEFFU19TZXRHY21IYXNoKHVpbnQzMl90ICogaGFzaCkNCnsNCiAgICB1aW50OF90IGk7DQogICAgZm9yIChpID0gMDsgaTwgNDsgaSsrKSANCiAgICAgICAgQUVTLT5BRVNfR0hBU0hSW2ldID0gaGFzaFtpXTsNCn0NCg0KDQovKioNCiAqIFxicmllZiBHZXQgVGhlIGZvdXIgMzItYml0IFRhZyB3aGljaCBjb250YWluIHRoZSBmaW5hbCAxMjgtYml0IEdDTSBBdXRoZW50aWNhdGlvbiB0YWcgDQogKiChsFShsSB3aGVuIEdDTSBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLg0KICogXHBhcmFtIHRhZyBwb2ludCB0byB0aGUgd29yZCBvZiB0aGUgdGFnLg0KICovDQp2b2lkIEFFU19HZXRHY21UYWcodWludDMyX3QgKiB0YWcpDQp7DQogICAgdWludDhfdCBpOw0KICAgIGZvciAoaSA9IDA7IGk8IDQ7IGkrKykgDQogICAgICAgIHRhZ1tpXSA9IEFFUy0+QUVTX1RBR1JbaV0gOw0KfQ0KDQovKioNCiAqIFxicmllZiBSZXBvcnRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAzMi1iaXQgR0NNIGNvdW50ZXINCiAqIFxwYXJhbSBjb3VudGVyIFBvaW50IHRvIHZhbHVlIG9mIEdDTSBjb3VudGVyLg0KICovDQp2b2lkIEFFU19HZXRHY21Db3VudGVyKHVpbnQzMl90ICogY291bnRlcikNCnsNCiAgICAqY291bnRlciA9IEFFUy0+QUVTX0NUUlI7DQp9DQoNCg0KLyoqDQogKiBcYnJpZWYgR2V0IHRoZSBmb3VyIDMyLWJpdCBkYXRhIGNvbnRhaW4gdGhlIDEyOC1iaXQgSCB2YWx1ZSBjb21wdXRlZCBmcm9tIHRoZSBLRVlXIHZhbHVlDQogKiBccGFyYW0gZGF0YSBwb2ludCB0byB0aGUgd29yZCB0aGF0IGhhcyBiZWVuIGVuY3J5cHRlZC9kZWNyeXB0ZWQuLg0KICovDQp2b2lkIEFFU19HZXRHY21IKHVpbnQzMl90ICpoKQ0Kew0KICAgIHVpbnQ4X3QgaTsNCiAgICBmb3IgKGkgPSAwOyBpPCA0OyBpKyspIA0KICAgICAgICBoW2ldID0gQUVTLT5BRVNfR0NNSFJbaV07DQp9DQoNCg0K