LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMybF9kaXNjb3ZlcnlfbGNkLmMNCiAgKiBAYXV0aG9yICBNaWNyb2NvbnRyb2xsZXIgRGl2aXNpb24NCiAgKiBAdmVyc2lvbiBWMS4wLjMNCiAgKiBAZGF0ZSAgICBNYXktMjAxMw0KICAqIEBicmllZiAgIFRoaXMgZmlsZSBpbmNsdWRlcyBkcml2ZXIgZm9yIHRoZSBnbGFzcyBMQ0QgTW9kdWxlIG1vdW50ZWQgb24NCiAgKiAgICAgICAgICBTVE0zMmwgZGlzY292ZXJ5IGJvYXJkIE1COTYzDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMSBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLw0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMybF9kaXNjb3ZlcnlfbGNkLmgiDQojaW5jbHVkZSAiZGlzY292ZXJfYm9hcmQuaCINCiNpbmNsdWRlICJzdG0zMmwxeHhfbGNkLmgiDQoNCi8qIHRoaXMgdmFyaWFibGUgY2FuIGJlIHVzZWQgZm9yIGFjY2VsZXJhdGUgdGhlIHNjcm9sbGluZyBleGl0IHdoZW4gcHVzaCB1c2VyIGJ1dHRvbiAqLw0Kdm9sYXRpbGUgYm9vbCBLZXlQcmVzc2VkID0gRkFMU0U7DQoNCi8qIExDRCBCQVIgc3RhdHVzOiBXZSBkb24ndCB3cml0ZSBkaXJlY3RseSBpbiBMQ0QgUkFNIGZvciBzYXZlIHRoZSBiYXIgc2V0dGluZyAqLw0KdWludDhfdCB0X2JhclsyXT17MHgwLDBYMH07DQoNCi8qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ0QgTUFQUElORw0KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCgkgICAgQQ0KICAgICBfICAtLS0tLS0tLS0tDQpDT0wgfF98IHxcICAgfEogIC98DQogICAgICAgRnwgSCAgfCAgSyB8Qg0KICAgICBfICB8ICBcIHwgLyAgfA0KQ09MIHxffCAtLUctLSAtLU0tLQ0KICAgICAgICB8ICAgL3wgXCAgfA0KICAgICAgIEV8ICBRIHwgIE4gfEMNCiAgICAgXyAgfCAvICB8UCAgXHwNCkRQICB8X3wgLS0tLS0tLS0tLS0NCgkgICAgRA0KDQogQW4gTENEIGNoYXJhY3RlciBjb2RpbmcgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBtYXRyaXg6DQogICAgICB7IEUgLCBEICwgUCAsIE4gICB9DQogICAgICB7IE0gLCBDICwgQ09MICwgRFB9DQogICAgICB7IEIgLCBBICwgSyAsIEogICB9DQogICAgICB7IEcgLCBGICwgUSAsIEggICB9DQoNCiBUaGUgY2hhcmFjdGVyICdBJyBmb3IgZXhhbXBsZSBpczoNCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KTFNCICAgeyAxICwgMCAsIDAgLCAwICAgfQ0KICAgICAgeyAxICwgMSAsIDAgLCAwICAgfQ0KICAgICAgeyAxICwgMSAsIDAgLCAwICAgfQ0KTVNCICAgeyAxICwgMSAsIDAgLCAwICAgfQ0KICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAnQScgPSAgRiAgICBFICAgMCAgIDAgaGV4YQ0KDQoqLw0KDQovKiBDb25zdGFudCB0YWJsZSBmb3IgY2FwIGNoYXJhY3RlcnMgJ0EnIC0tPiAnWicgKi8NCmNvbnN0IHVpbnQxNl90IENhcExldHRlck1hcFsyNl09DQogICAgew0KICAgICAgICAvKiBBICAgICAgQiAgICAgIEMgICAgICBEICAgICAgRSAgICAgIEYgICAgICBHICAgICAgSCAgICAgIEkgICovDQogICAgICAgIDB4RkUwMCwweDY3MTQsMHgxZDAwLDB4NDcxNCwweDlkMDAsMHg5YzAwLDB4M2YwMCwweGZhMDAsMHgwMDE0LA0KICAgICAgICAvKiBKICAgICAgSyAgICAgIEwgICAgICBNICAgICAgTiAgICAgIE8gICAgICBQICAgICAgUSAgICAgIFIgICovDQogICAgICAgIDB4NTMwMCwweDk4NDEsMHgxOTAwLDB4NWE0OCwweDVhMDksMHg1ZjAwLDB4RkMwMCwweDVGMDEsMHhGQzAxLA0KICAgICAgICAvKiBTICAgICAgVCAgICAgIFUgICAgICBWICAgICAgVyAgICAgIFggICAgICBZICAgICAgWiAgKi8NCiAgICAgICAgMHhBRjAwLDB4MDQxNCwweDViMDAsMHgxOGMwLDB4NWE4MSwweDAwYzksMHgwMDU4LDB4MDVjMA0KICAgIH07DQoNCi8qIENvbnN0YW50IHRhYmxlIGZvciBudW1iZXIgJzAnIC0tPiAnOScgKi8NCmNvbnN0IHVpbnQxNl90IE51bWJlck1hcFsxMF09DQogICAgew0KICAgICAgICAvKiAwICAgICAgMSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNyAgICAgIDggICAgICA5ICAqLw0KICAgICAgICAweDVGMDAsMHg0MjAwLDB4RjUwMCwweDY3MDAsMHhFYTAwLDB4QUYwMCwweEJGMDAsMHgwNDYwMCwweEZGMDAsMHhFRjAwDQogICAgfTsNCg0Kc3RhdGljIHZvaWQgTENEX0NvbnZfQ2hhcl9TZWcodWludDhfdCogYyxib29sIHBvaW50LGJvb2wgY29sdW1uLHVpbnQ4X3QqIGRpZ2l0KTsNCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBMQ0QgR0xBU1MgcmVsYXRpdmUgR1BJTyBwb3J0IElPcyBhbmQgTENEIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9HTEFTU19Jbml0KHZvaWQpDQp7DQogIExDRF9Jbml0VHlwZURlZiBMQ0RfSW5pdFN0cnVjdDsNCg0KDQogIExDRF9Jbml0U3RydWN0LkxDRF9QcmVzY2FsZXIgPSBMQ0RfUHJlc2NhbGVyXzE7DQogIExDRF9Jbml0U3RydWN0LkxDRF9EaXZpZGVyID0gTENEX0RpdmlkZXJfMzE7DQogIExDRF9Jbml0U3RydWN0LkxDRF9EdXR5ID0gTENEX0R1dHlfMV80Ow0KICBMQ0RfSW5pdFN0cnVjdC5MQ0RfQmlhcyA9IExDRF9CaWFzXzFfMzsNCiAgTENEX0luaXRTdHJ1Y3QuTENEX1ZvbHRhZ2VTb3VyY2UgPSBMQ0RfVm9sdGFnZVNvdXJjZV9JbnRlcm5hbDsNCg0KDQogIC8qIEluaXRpYWxpemUgdGhlIExDRCAqLw0KICBMQ0RfSW5pdCgmTENEX0luaXRTdHJ1Y3QpOw0KDQogIExDRF9NdXhTZWdtZW50Q21kKEVOQUJMRSk7DQoNCiAgLyogVG8gc2V0IGNvbnRyYXN0IHRvIG1lYW4gdmFsdWUgKi8NCiAgTENEX0NvbnRyYXN0Q29uZmlnKExDRF9Db250cmFzdF9MZXZlbF80KTsNCg0KICBMQ0RfRGVhZFRpbWVDb25maWcoTENEX0RlYWRUaW1lXzApOw0KICBMQ0RfUHVsc2VPbkR1cmF0aW9uQ29uZmlnKExDRF9QdWxzZU9uRHVyYXRpb25fNCk7DQoNCiAgLyogV2FpdCBVbnRpbCB0aGUgTENEIEZDUiByZWdpc3RlciBpcyBzeW5jaHJvbml6ZWQgKi8NCiAgTENEX1dhaXRGb3JTeW5jaHJvKCk7DQoNCiAgLyogRW5hYmxlIExDRCBwZXJpcGhlcmFsICovDQogIExDRF9DbWQoRU5BQkxFKTsNCg0KICAvKiBXYWl0IFVudGlsIHRoZSBMQ0QgaXMgZW5hYmxlZCAqLw0KICB3aGlsZShMQ0RfR2V0RmxhZ1N0YXR1cyhMQ0RfRkxBR19FTlMpID09IFJFU0VUKQ0KICB7DQogIH0NCiAgLyohPCBXYWl0IFVudGlsIHRoZSBMQ0QgQm9vc3RlciBpcyByZWFkeSAqLw0KICB3aGlsZShMQ0RfR2V0RmxhZ1N0YXR1cyhMQ0RfRkxBR19SRFkpID09IFJFU0VUKQ0KICB7DQogIH0NCg0KICBMQ0RfQmxpbmtDb25maWcoTENEX0JsaW5rTW9kZV9PZmYsTENEX0JsaW5rRnJlcXVlbmN5X0RpdjMyKTsNCiAgTENEX0dMQVNTX0NsZWFyKCk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgVG8gaW5pdGlhbGl6ZSB0aGUgTENEIHBpbnMNCiAgKiBAY2FsbGVyIG1haW4NCiAgKiBAcGFyYW0gTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KDQp2b2lkIExDRF9HTEFTU19Db25maWd1cmVfR1BJTyh2b2lkKQ0Kew0KICBHUElPX0luaXRUeXBlRGVmIEdQSU9fSW5pdFN0cnVjdHVyZTsNCg0KLyogRW5hYmxlIEdQSU9zIGNsb2NrICovDQogIFJDQ19BSEJQZXJpcGhDbG9ja0NtZChSQ0NfQUhCUGVyaXBoX0dQSU9BIHwgUkNDX0FIQlBlcmlwaF9HUElPQiB8IFJDQ19BSEJQZXJpcGhfR1BJT0MgfA0KICAgICAgICAgICAgICAgICAgICAgICAgUkNDX0FIQlBlcmlwaF9HUElPRCB8IFJDQ19BSEJQZXJpcGhfR1BJT0UgfCBSQ0NfQUhCUGVyaXBoX0dQSU9ILCBFTkFCTEUpOw0KDQoNCi8qIENvbmZpZ3VyZSBPdXRwdXQgZm9yIExDRCAqLw0KLyogUG9ydCBBICovDQogIEdQSU9fU3RydWN0SW5pdCgmR1BJT19Jbml0U3RydWN0dXJlKTsNCiAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fUGluID0gR1BJT19QaW5fMSB8IEdQSU9fUGluXzIgfCBHUElPX1Bpbl8zIHwgR1BJT19QaW5fOCB8IEdQSU9fUGluXzkgfEdQSU9fUGluXzEwIHxHUElPX1Bpbl8xNTsNCiAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fTW9kZSA9IEdQSU9fTW9kZV9BRjsNCiAgR1BJT19Jbml0KCBHUElPQSwgJkdQSU9fSW5pdFN0cnVjdHVyZSk7DQoNCiAgR1BJT19QaW5BRkNvbmZpZyhHUElPQSwgR1BJT19QaW5Tb3VyY2UxLEdQSU9fQUZfTENEKSA7DQogIEdQSU9fUGluQUZDb25maWcoR1BJT0EsIEdQSU9fUGluU291cmNlMixHUElPX0FGX0xDRCkgOw0KICBHUElPX1BpbkFGQ29uZmlnKEdQSU9BLCBHUElPX1BpblNvdXJjZTMsR1BJT19BRl9MQ0QpIDsNCiAgR1BJT19QaW5BRkNvbmZpZyhHUElPQSwgR1BJT19QaW5Tb3VyY2U4LEdQSU9fQUZfTENEKSA7DQogIEdQSU9fUGluQUZDb25maWcoR1BJT0EsIEdQSU9fUGluU291cmNlOSxHUElPX0FGX0xDRCkgOw0KICBHUElPX1BpbkFGQ29uZmlnKEdQSU9BLCBHUElPX1BpblNvdXJjZTEwLEdQSU9fQUZfTENEKSA7DQogIEdQSU9fUGluQUZDb25maWcoR1BJT0EsIEdQSU9fUGluU291cmNlMTUsR1BJT19BRl9MQ0QpIDsNCg0KLyogQ29uZmlndXJlIE91dHB1dCBmb3IgTENEICovDQovKiBQb3J0IEIgKi8NCiAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fUGluID0gR1BJT19QaW5fMyB8IEdQSU9fUGluXzQgfCBHUElPX1Bpbl81IHwgR1BJT19QaW5fOCB8IEdQSU9fUGluXzkgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHUElPX1Bpbl8xMCB8IEdQSU9fUGluXzExIHwgR1BJT19QaW5fMTIgfCBHUElPX1Bpbl8xMyB8IEdQSU9fUGluXzE0IHwgR1BJT19QaW5fMTU7DQogIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX01vZGUgPSBHUElPX01vZGVfQUY7DQogIEdQSU9fSW5pdCggR1BJT0IsICZHUElPX0luaXRTdHJ1Y3R1cmUpOw0KDQogIEdQSU9fUGluQUZDb25maWcoR1BJT0IsIEdQSU9fUGluU291cmNlMyxHUElPX0FGX0xDRCkgOw0KICBHUElPX1BpbkFGQ29uZmlnKEdQSU9CLCBHUElPX1BpblNvdXJjZTQsR1BJT19BRl9MQ0QpIDsNCiAgR1BJT19QaW5BRkNvbmZpZyhHUElPQiwgR1BJT19QaW5Tb3VyY2U1LEdQSU9fQUZfTENEKSA7DQogIEdQSU9fUGluQUZDb25maWcoR1BJT0IsIEdQSU9fUGluU291cmNlOCxHUElPX0FGX0xDRCkgOw0KICBHUElPX1BpbkFGQ29uZmlnKEdQSU9CLCBHUElPX1BpblNvdXJjZTksR1BJT19BRl9MQ0QpIDsNCiAgR1BJT19QaW5BRkNvbmZpZyhHUElPQiwgR1BJT19QaW5Tb3VyY2UxMCxHUElPX0FGX0xDRCkgOw0KICBHUElPX1BpbkFGQ29uZmlnKEdQSU9CLCBHUElPX1BpblNvdXJjZTExLEdQSU9fQUZfTENEKSA7DQogIEdQSU9fUGluQUZDb25maWcoR1BJT0IsIEdQSU9fUGluU291cmNlMTIsR1BJT19BRl9MQ0QpIDsNCiAgR1BJT19QaW5BRkNvbmZpZyhHUElPQiwgR1BJT19QaW5Tb3VyY2UxMyxHUElPX0FGX0xDRCkgOw0KICBHUElPX1BpbkFGQ29uZmlnKEdQSU9CLCBHUElPX1BpblNvdXJjZTE0LEdQSU9fQUZfTENEKSA7DQogIEdQSU9fUGluQUZDb25maWcoR1BJT0IsIEdQSU9fUGluU291cmNlMTUsR1BJT19BRl9MQ0QpIDsNCg0KLyogQ29uZmlndXJlIE91dHB1dCBmb3IgTENEICovDQovKiBQb3J0IEMqLw0KICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19QaW4gPSBHUElPX1Bpbl8wIHwgR1BJT19QaW5fMSB8IEdQSU9fUGluXzIgfCBHUElPX1Bpbl8zIHwgR1BJT19QaW5fNiBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdQSU9fUGluXzcgfCBHUElPX1Bpbl84IHwgR1BJT19QaW5fOSB8IEdQSU9fUGluXzEwIHxHUElPX1Bpbl8xMSA7DQogIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX01vZGUgPSBHUElPX01vZGVfQUY7DQogIEdQSU9fSW5pdCggR1BJT0MsICZHUElPX0luaXRTdHJ1Y3R1cmUpOw0KDQoNCiAgR1BJT19QaW5BRkNvbmZpZyhHUElPQywgR1BJT19QaW5Tb3VyY2UwLEdQSU9fQUZfTENEKSA7DQogIEdQSU9fUGluQUZDb25maWcoR1BJT0MsIEdQSU9fUGluU291cmNlMSxHUElPX0FGX0xDRCkgOw0KICBHUElPX1BpbkFGQ29uZmlnKEdQSU9DLCBHUElPX1BpblNvdXJjZTIsR1BJT19BRl9MQ0QpIDsNCiAgR1BJT19QaW5BRkNvbmZpZyhHUElPQywgR1BJT19QaW5Tb3VyY2UzLEdQSU9fQUZfTENEKSA7DQogIEdQSU9fUGluQUZDb25maWcoR1BJT0MsIEdQSU9fUGluU291cmNlNixHUElPX0FGX0xDRCkgOw0KICBHUElPX1BpbkFGQ29uZmlnKEdQSU9DLCBHUElPX1BpblNvdXJjZTcsR1BJT19BRl9MQ0QpIDsNCiAgR1BJT19QaW5BRkNvbmZpZyhHUElPQywgR1BJT19QaW5Tb3VyY2U4LEdQSU9fQUZfTENEKSA7DQogIEdQSU9fUGluQUZDb25maWcoR1BJT0MsIEdQSU9fUGluU291cmNlOSxHUElPX0FGX0xDRCkgOw0KICBHUElPX1BpbkFGQ29uZmlnKEdQSU9DLCBHUElPX1BpblNvdXJjZTEwLEdQSU9fQUZfTENEKSA7DQogIEdQSU9fUGluQUZDb25maWcoR1BJT0MsIEdQSU9fUGluU291cmNlMTEsR1BJT19BRl9MQ0QpIDsNCg0KLyogRGlzYWJsZSBHUElPcyBjbG9jayAqLw0KICBSQ0NfQUhCUGVyaXBoQ2xvY2tDbWQoUkNDX0FIQlBlcmlwaF9HUElPQSB8IFJDQ19BSEJQZXJpcGhfR1BJT0IgfCBSQ0NfQUhCUGVyaXBoX0dQSU9DIHwNCiAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19BSEJQZXJpcGhfR1BJT0QgfCBSQ0NfQUhCUGVyaXBoX0dQSU9FIHwgUkNDX0FIQlBlcmlwaF9HUElPSCwgRElTQUJMRSk7DQoNCn0NCg0KLyoqDQogICogQGJyaWVmICBMQ0QgY29udHJhc3Qgc2V0dGluZyBtaW4tLT5tYXgtLT5taW4gYnkgcHJlc3NpbmcgdXNlciBidXR0b24NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgTENEX2NvbnRyYXN0KCkNCnsNCiAgdWludDMyX3QgY29udHJhc3QgOw0KDQogIC8qIFRvIGdldCB0aGUgYWN0dWFsIGNvbnRyYXN0IHZhbHVlIGluIHJlZ2lzdGVyICovDQogIGNvbnRyYXN0ID0gTENELT5GQ1IgJiBMQ0RfQ29udHJhc3RfTGV2ZWxfNzsNCg0KICB3aGlsZSAoKEdQSU9DLT5JRFIgJiBVU0VSQlVUVE9OX0dQSU9fUElOKSA9PSAweDApDQogIHsNCiAgICBjb250cmFzdCArPSBMQ0RfQ29udHJhc3RfTGV2ZWxfMTsNCg0KICAgIGlmIChjb250cmFzdCA+IExDRF9Db250cmFzdF9MZXZlbF83KQ0KICAgICBjb250cmFzdD1MQ0RfQ29udHJhc3RfTGV2ZWxfMDsNCg0KICAgIExDRF9Db250cmFzdENvbmZpZyhjb250cmFzdCk7DQogICAgLy9EZWxheSgxMDApOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0dGluZyBiYXIgb24gTENELCB3cml0ZXMgYmFyIHZhbHVlIGluIExDRCBmcmFtZSBidWZmZXINCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgTENEX2JhcigpDQp7DQoNCiAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzRdICY9IDB4ZmZmZjVmZmY7DQogIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl82XSAmPSAweGZmZmY1ZmZmOw0KLyogYmFyMSBiYXIzICovDQogIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl80XSB8PSAodWludDMyX3QpKHRfYmFyWzBdPDwxMik7DQoNCi8qYmFyMCBiYXIyICovDQogIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl82XSB8PSAodWludDMyX3QpKHRfYmFyWzFdPDwxMik7DQoNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb252ZXJ0cyBhbiBhc2NpaSBjaGFyIHRvIHRoZSBhIExDRCBkaWdpdC4NCiAgKiBAcGFyYW0gIGM6IGEgY2hhciB0byBkaXNwbGF5Lg0KICAqIEBwYXJhbSAgcG9pbnQ6IGEgcG9pbnQgdG8gYWRkIGluIGZyb250IG9mIGNoYXINCiAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogUE9JTlRfT0ZGIG9yIFBPSU5UX09ODQogICogQHBhcmFtICBjb2x1bW4gOiBmbGFnIGluZGljYXRpbmcgaWYgYSBjb2x1bW4gaGFzIHRvIGJlIGFkZCBpbiBmcm9udA0KICAqICAgICAgICAgb2YgZGlzcGxheWVkIGNoYXJhY3Rlci4NCiAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogQ09MVU1OX09GRiBvciBDT0xVTU5fT04uDQoJKiBAcGFyYW0gCWRpZ2l0IGFycmF5IHdpdGggc2VnbWVudA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgTENEX0NvbnZfQ2hhcl9TZWcodWludDhfdCogYyxib29sIHBvaW50LGJvb2wgY29sdW1uLCB1aW50OF90KiBkaWdpdCkNCnsNCiAgdWludDE2X3QgY2ggPSAwIDsNCiAgdWludDhfdCBpLGo7DQoNCiAgc3dpdGNoICgqYykNCiAgICB7DQogICAgY2FzZSAnICcgOg0KICAgICAgY2ggPSAweDAwOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlICcqJzoNCiAgICAgIGNoID0gc3RhcjsNCiAgICAgIGJyZWFrOw0KDQogICAgY2FzZSAntScgOg0KICAgICAgY2ggPSBDX1VNQVA7DQogICAgICBicmVhazsNCg0KICAgIGNhc2UgJ20nIDoNCiAgICAgIGNoID0gQ19tTWFwOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlICduJyA6DQogICAgICBjaCA9IENfbk1hcDsNCiAgICAgIGJyZWFrOw0KDQogICAgY2FzZSAnLScgOg0KICAgICAgY2ggPSBDX21pbnVzOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlICcvJyA6DQogICAgICBjaCA9IENfc2xhdGNoOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlICewJyA6DQogICAgICBjaCA9IENfcGVyY2VudF8xOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSAnJScgOg0KICAgICAgY2ggPSBDX3BlcmNlbnRfMjsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgMjU1IDoNCiAgICAgIGNoID0gQ19mdWxsOw0KICAgICAgYnJlYWsgOw0KDQogICAgY2FzZSAnMCc6DQogICAgY2FzZSAnMSc6DQogICAgY2FzZSAnMic6DQogICAgY2FzZSAnMyc6DQogICAgY2FzZSAnNCc6DQogICAgY2FzZSAnNSc6DQogICAgY2FzZSAnNic6DQogICAgY2FzZSAnNyc6DQogICAgY2FzZSAnOCc6DQogICAgY2FzZSAnOSc6DQogICAgICBjaCA9IE51bWJlck1hcFsqYy0weDMwXTsNCiAgICAgIGJyZWFrOw0KDQogICAgZGVmYXVsdDoNCiAgICAgIC8qIFRoZSBjaGFyYWN0ZXIgYyBpcyBvbmUgbGV0dGVyIGluIHVwcGVyIGNhc2UqLw0KICAgICAgaWYgKCAoKmMgPCAweDViKSAmJiAoKmMgPiAweDQwKSApDQogICAgICB7DQogICAgICAgIGNoID0gQ2FwTGV0dGVyTWFwWypjLSdBJ107DQogICAgICB9DQogICAgICAvKiBUaGUgY2hhcmFjdGVyIGMgaXMgb25lIGxldHRlciBpbiBsb3dlciBjYXNlKi8NCiAgICAgIGlmICggKCpjIDwweDdiKSAmJiAoICpjPiAweDYwKSApDQogICAgICB7DQogICAgICAgIGNoID0gQ2FwTGV0dGVyTWFwWypjLSdhJ107DQogICAgICB9DQogICAgICBicmVhazsNCiAgfQ0KDQogIC8qIFNldCB0aGUgZGlnaXRhbCBwb2ludCBjYW4gYmUgZGlzcGxheWVkIGlmIHRoZSBwb2ludCBpcyBvbiAqLw0KICBpZiAocG9pbnQpDQogIHsNCiAgICBjaCB8PSAweDAwMDI7DQogIH0NCg0KICAvKiBTZXQgdGhlICJDT0wiIHNlZ21lbnQgaW4gdGhlIGNoYXJhY3RlciB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgaWYgdGhlIGNvbHVtbiBpcyBvbiAqLw0KICBpZiAoY29sdW1uKQ0KICB7DQogICAgY2ggfD0gMHgwMDIwOw0KICB9DQoNCiAgZm9yIChpID0gMTIsaj0wIDtqPDQ7IGktPTQsaisrKQ0KICB7DQogICAgZGlnaXRbal0gPSAoY2ggPj4gaSkgJiAweDBmOyAvL1RvIGlzb2xhdGUgdGhlIGxlc3Mgc2lnbmlmaWFudCBkaWJpdA0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSBjaGFyIGluIHRoZSBMQ0QgZnJhbWUgYnVmZmVyLg0KICAqIEBwYXJhbSAgY2g6IHRoZSBjaGFyYWN0ZXIgdG8gZGlzcGxheS4NCiAgKiBAcGFyYW0gIHBvaW50OiBhIHBvaW50IHRvIGFkZCBpbiBmcm9udCBvZiBjaGFyDQogICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IFBPSU5UX09GRiBvciBQT0lOVF9PTg0KICAqIEBwYXJhbSAgY29sdW1uOiBmbGFnIGluZGljYXRpbmcgaWYgYSBjb2x1bW4gaGFzIHRvIGJlIGFkZCBpbiBmcm9udA0KICAqICAgICAgICAgb2YgZGlzcGxheWVkIGNoYXJhY3Rlci4NCiAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogQ09MVU1OX09GRiBvciBDT0xVTU5fT04uDQogICogQHBhcmFtICBwb3NpdGlvbjogcG9zaXRpb24gaW4gdGhlIExDRCBvZiB0aGUgY2FyYWN0ZXIgdG8gd3JpdGUgWzA6N10NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKiBAcGFyICAgIFJlcXVpcmVkIHByZWNvbmRpdGlvbnM6IFRoZSBMQ0Qgc2hvdWxkIGJlIGNsZWFyZWQgYmVmb3JlIHRvIHN0YXJ0IHRoZQ0KICAqICAgICAgICAgd3JpdGUgb3BlcmF0aW9uLg0KICAqLw0Kdm9pZCBMQ0RfR0xBU1NfV3JpdGVDaGFyKHVpbnQ4X3QqIGNoLCBib29sIHBvaW50LCBib29sIGNvbHVtbiwgdWludDhfdCBwb3NpdGlvbikNCnsNCiAgdWludDhfdCBkaWdpdFs0XTsgICAgIC8qIERpZ2l0IGZyYW1lIGJ1ZmZlciAqLw0KDQovKiBUbyBjb252ZXJ0IGRpc3BsYXllZCBjaGFyYWN0ZXIgaW4gc2VnbWVudCBpbiBhcnJheSBkaWdpdCAqLw0KICBMQ0RfQ29udl9DaGFyX1NlZyhjaCxwb2ludCxjb2x1bW4sZGlnaXQpOw0KDQoNCiAgc3dpdGNoIChwb3NpdGlvbikNCiAgew0KICAgIC8qIFBvc2l0aW9uIDEgb24gTENEIChEaWdpdDEpKi8NCiAgICBjYXNlIDE6DQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfMF0gJj0gMHhjZmZmZmZmYzsNCiAgICAgIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl8yXSAmPSAweGNmZmZmZmZjOw0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzRdICY9IDB4Y2ZmZmZmZmM7DQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfNl0gJj0gMHhjZmZmZmZmYzsNCg0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzBdIHw9ICgoZGlnaXRbMF0mIDB4MGMpIDw8IDI2ICkgfCAoZGlnaXRbMF0mIDB4MDMpIDsgLy8gMUcgMUIgMU0gMUUNCiAgICAgIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl8yXSB8PSAoKGRpZ2l0WzFdJiAweDBjKSA8PCAyNiApIHwgKGRpZ2l0WzFdJiAweDAzKSA7IC8vIDFGIDFBIDFDIDFEDQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfNF0gfD0gKChkaWdpdFsyXSYgMHgwYykgPDwgMjYgKSB8IChkaWdpdFsyXSYgMHgwMykgOyAvLyAxUSAxSyAxQ29sIDFQDQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfNl0gfD0gKChkaWdpdFszXSYgMHgwYykgPDwgMjYgKSB8IChkaWdpdFszXSYgMHgwMykgOyAvLyAxSCAxSiAxRFAgMU4NCg0KICAgICAgYnJlYWs7DQoNCiAgICAvKiBQb3NpdGlvbiAyIG9uIExDRCAoRGlnaXQyKSovDQogICAgY2FzZSAyOg0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzBdICY9IDB4ZjNmZmZmMDM7DQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfMl0gJj0gMHhmM2ZmZmYwMzsNCiAgICAgIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl80XSAmPSAweGYzZmZmZjAzOw0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzZdICY9IDB4ZjNmZmZmMDM7DQoNCiAgICAgIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl8wXSB8PSAoKGRpZ2l0WzBdJiAweDBjKSA8PCAyNCApfCgoZGlnaXRbMF0mIDB4MDIpIDw8IDYgKXwoKGRpZ2l0WzBdJiAweDAxKSA8PCAyICkgOyAvLyAyRyAyQiAyTSAyRQ0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzJdIHw9ICgoZGlnaXRbMV0mIDB4MGMpIDw8IDI0ICl8KChkaWdpdFsxXSYgMHgwMikgPDwgNiApfCgoZGlnaXRbMV0mIDB4MDEpIDw8IDIgKSA7IC8vIDJGIDJBIDJDIDJEDQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfNF0gfD0gKChkaWdpdFsyXSYgMHgwYykgPDwgMjQgKXwoKGRpZ2l0WzJdJiAweDAyKSA8PCA2ICl8KChkaWdpdFsyXSYgMHgwMSkgPDwgMiApIDsgLy8gMlEgMksgMkNvbCAyUA0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzZdIHw9ICgoZGlnaXRbM10mIDB4MGMpIDw8IDI0ICl8KChkaWdpdFszXSYgMHgwMikgPDwgNiApfCgoZGlnaXRbM10mIDB4MDEpIDw8IDIgKSA7IC8vIDJIIDJKIDJEUCAyTg0KDQogICAgICBicmVhazsNCg0KICAgIC8qIFBvc2l0aW9uIDMgb24gTENEIChEaWdpdDMpKi8NCiAgICBjYXNlIDM6DQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfMF0gJj0gMHhmY2ZmZmNmZjsNCiAgICAgIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl8yXSAmPSAweGZjZmZmY2ZmOw0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzRdICY9IDB4ZmNmZmZjZmY7DQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfNl0gJj0gMHhmY2ZmZmNmZjsNCg0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzBdIHw9ICgoZGlnaXRbMF0mIDB4MGMpIDw8IDIyICkgfCAoKGRpZ2l0WzBdJiAweDAzKSA8PCA4ICkgOyAvLyAzRyAzQiAzTSAzRQ0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzJdIHw9ICgoZGlnaXRbMV0mIDB4MGMpIDw8IDIyICkgfCAoKGRpZ2l0WzFdJiAweDAzKSA8PCA4ICkgOyAvLyAzRiAzQSAzQyAzRA0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzRdIHw9ICgoZGlnaXRbMl0mIDB4MGMpIDw8IDIyICkgfCAoKGRpZ2l0WzJdJiAweDAzKSA8PCA4ICkgOyAvLyAzUSAzSyAzQ29sIDNQDQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfNl0gfD0gKChkaWdpdFszXSYgMHgwYykgPDwgMjIgKSB8ICgoZGlnaXRbM10mIDB4MDMpIDw8IDggKSA7IC8vIDNIIDNKIDNEUCAzTg0KDQogICAgICBicmVhazsNCg0KICAgIC8qIFBvc2l0aW9uIDQgb24gTENEIChEaWdpdDQpKi8NCiAgICBjYXNlIDQ6DQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfMF0gJj0gMHhmZmNmZjNmZjsNCiAgICAgIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl8yXSAmPSAweGZmY2ZmM2ZmOw0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzRdICY9IDB4ZmZjZmYzZmY7DQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfNl0gJj0gMHhmZmNmZjNmZjsNCg0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzBdIHw9ICgoZGlnaXRbMF0mIDB4MGMpIDw8IDE4ICkgfCAoKGRpZ2l0WzBdJiAweDAzKSA8PCAxMCApIDsgLy8gNEcgNEIgNE0gNEUNCiAgICAgIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl8yXSB8PSAoKGRpZ2l0WzFdJiAweDBjKSA8PCAxOCApIHwgKChkaWdpdFsxXSYgMHgwMykgPDwgMTAgKSA7IC8vIDRGIDRBIDRDIDREDQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfNF0gfD0gKChkaWdpdFsyXSYgMHgwYykgPDwgMTggKSB8ICgoZGlnaXRbMl0mIDB4MDMpIDw8IDEwICkgOyAvLyA0USA0SyA0Q29sIDRQDQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfNl0gfD0gKChkaWdpdFszXSYgMHgwYykgPDwgMTggKSB8ICgoZGlnaXRbM10mIDB4MDMpIDw8IDEwICkgOyAvLyA0SCA0SiA0RFAgNE4NCg0KICAgICAgYnJlYWs7DQoNCiAgICAvKiBQb3NpdGlvbiA1IG9uIExDRCAoRGlnaXQ1KSovDQogICAgY2FzZSA1Og0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzBdICY9IDB4ZmZmM2NmZmY7DQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfMl0gJj0gMHhmZmYzY2ZmZjsNCiAgICAgIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl80XSAmPSAweGZmZjNlZmZmOw0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzZdICY9IDB4ZmZmM2VmZmY7DQoNCiAgICAgIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl8wXSB8PSAoKGRpZ2l0WzBdJiAweDBjKSA8PCAxNiApIHwgKChkaWdpdFswXSYgMHgwMykgPDwgMTIgKSA7IC8vIDVHIDVCIDVNIDVFDQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfMl0gfD0gKChkaWdpdFsxXSYgMHgwYykgPDwgMTYgKSB8ICgoZGlnaXRbMV0mIDB4MDMpIDw8IDEyICkgOyAvLyA1RiA1QSA1QyA1RA0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzRdIHw9ICgoZGlnaXRbMl0mIDB4MGMpIDw8IDE2ICkgfCAoKGRpZ2l0WzJdJiAweDAxKSA8PCAxMiApIDsgLy8gNVEgNUsgICA1UA0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzZdIHw9ICgoZGlnaXRbM10mIDB4MGMpIDw8IDE2ICkgfCAoKGRpZ2l0WzNdJiAweDAxKSA8PCAxMiApIDsgLy8gNUggNUogICA1Tg0KDQogICAgICBicmVhazsNCg0KICAgIC8qIFBvc2l0aW9uIDYgb24gTENEIChEaWdpdDYpKi8NCiAgICBjYXNlIDY6DQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfMF0gJj0gMHhmZmZjM2ZmZjsNCiAgICAgIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl8yXSAmPSAweGZmZmMzZmZmOw0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzRdICY9IDB4ZmZmYzNmZmY7DQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfNl0gJj0gMHhmZmZjM2ZmZjsNCg0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzBdIHw9ICgoZGlnaXRbMF0mIDB4MDQpIDw8IDE1ICkgfCAoKGRpZ2l0WzBdJiAweDA4KSA8PCAxMyApIHwgKChkaWdpdFswXSYgMHgwMykgPDwgMTQgKSA7IC8vIDZCIDZHIDZNIDZFDQogICAgICBMQ0QtPlJBTVtMQ0RfUkFNUmVnaXN0ZXJfMl0gfD0gKChkaWdpdFsxXSYgMHgwNCkgPDwgMTUgKSB8ICgoZGlnaXRbMV0mIDB4MDgpIDw8IDEzICkgfCAoKGRpZ2l0WzFdJiAweDAzKSA8PCAxNCApIDsgLy8gNkEgNkYgNkMgNkQNCiAgICAgIExDRC0+UkFNW0xDRF9SQU1SZWdpc3Rlcl80XSB8PSAoKGRpZ2l0WzJdJiAweDA0KSA8PCAxNSApIHwgKChkaWdpdFsyXSYgMHgwOCkgPDwgMTMgKSB8ICgoZGlnaXRbMl0mIDB4MDEpIDw8IDE0ICkgOyAvLyA2SyA2USAgICA2UA0KICAgICAgTENELT5SQU1bTENEX1JBTVJlZ2lzdGVyXzZdIHw9ICgoZGlnaXRbM10mIDB4MDQpIDw8IDE1ICkgfCAoKGRpZ2l0WzNdJiAweDA4KSA8PCAxMyApIHwgKChkaWdpdFszXSYgMHgwMSkgPDwgMTQgKSA7IC8vIDZKIDZIICAgNk4NCg0KICAgICAgYnJlYWs7DQoNCiAgICAgZGVmYXVsdDoNCiAgICAgIGJyZWFrOw0KICB9DQoNCi8qIFJlZnJlc2ggTENEICBiYXIgKi8NCiAgTENEX2JhcigpOw0KDQp9DQoNCi8qKg0KICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSBjaGFyIGluIHRoZSBMQ0QgUkFNLg0KICAqIEBwYXJhbSAgcHRyOiBQb2ludGVyIHRvIHN0cmluZyB0byBkaXNwbGF5IG9uIHRoZSBMQ0QgR2xhc3MuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIExDRF9HTEFTU19EaXNwbGF5U3RyaW5nKHVpbnQ4X3QqIHB0cikNCnsNCiAgdWludDhfdCBpID0gMHgwMTsNCg0KCS8qIHdhaXQgZm9yIExDRCBSZWFkeSAqLw0KICB3aGlsZSggTENEX0dldEZsYWdTdGF0dXMgKExDRF9GTEFHX1VEUikgIT0gUkVTRVQpIDsNCg0KICAvKiBTZW5kIHRoZSBzdHJpbmcgY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBvbiBsQ0QgKi8NCiAgd2hpbGUgKCgqcHRyICE9IDApICYgKGkgPCA4KSkNCiAgew0KICAgIC8qIERpc3BsYXkgb25lIGNoYXJhY3RlciBvbiBMQ0QgKi8NCiAgICBMQ0RfR0xBU1NfV3JpdGVDaGFyKHB0ciwgRkFMU0UsIEZBTFNFLCBpKTsNCg0KICAgIC8qIFBvaW50IG9uIHRoZSBuZXh0IGNoYXJhY3RlciAqLw0KICAgIHB0cisrOw0KDQogICAgLyogSW5jcmVtZW50IHRoZSBjaGFyYWN0ZXIgY291bnRlciAqLw0KICAgIGkrKzsNCiAgfQ0KDQoJLyogVXBkYXRlIHRoZSBMQ0QgZGlzcGxheSAqLw0KICBMQ0RfVXBkYXRlRGlzcGxheVJlcXVlc3QoKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBhIGNoYXIgaW4gdGhlIExDRCBSQU0uDQogICogQHBhcmFtICBwdHI6IFBvaW50ZXIgdG8gc3RyaW5nIHRvIGRpc3BsYXkgb24gdGhlIExDRCBHbGFzcy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKiBAcGFyICAgIFJlcXVpcmVkIHByZWNvbmRpdGlvbnM6IENoYXIgaXMgQVNDQ0kgdmFsdWUgIk9yZWQiIHdpdGggZGVjaW1hbCBwb2ludCBvciBDb2x1bW4gZmxhZw0KICAqLw0Kdm9pZCBMQ0RfR0xBU1NfRGlzcGxheVN0ckRlY2kodWludDE2X3QqIHB0cikNCnsNCiAgdWludDhfdCBpID0gMHgwMTsNCiAgdWludDhfdCBjaGFyX3RtcDsNCg0KCS8qIFRPIHdhaXQgTENEIFJlYWR5ICovDQogIHdoaWxlKCBMQ0RfR2V0RmxhZ1N0YXR1cyAoTENEX0ZMQUdfVURSKSAhPSBSRVNFVCkgOw0KDQogIC8qIFNlbmQgdGhlIHN0cmluZyBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyIG9uIGxDRCAqLw0KICB3aGlsZSAoKCpwdHIgIT0gMCkgJiAoaSA8IDgpKQ0KICB7DQogICAgY2hhcl90bXAgPSAoKnB0cikgJiAweDAwZmY7DQoNCiAgICBzd2l0Y2ggKCgqcHRyKSAmIDB4ZjAwMCkNCiAgICB7DQogICAgICBjYXNlIERPVDoNCiAgICAgICAgICAvKiBEaXNwbGF5IG9uZSBjaGFyYWN0ZXIgb24gTENEIHdpdGggZGVjaW1hbCBwb2ludCAqLw0KICAgICAgICAgIExDRF9HTEFTU19Xcml0ZUNoYXIoJmNoYXJfdG1wLCBQT0lOVF9PTiwgQ09MVU1OX09GRiwgaSk7DQogICAgICAgICAgYnJlYWs7DQogICAgICBjYXNlIERPVUJMRV9ET1Q6DQogICAgICAgICAgLyogRGlzcGxheSBvbmUgY2hhcmFjdGVyIG9uIExDRCB3aXRoIGRlY2ltYWwgcG9pbnQgKi8NCiAgICAgICAgICBMQ0RfR0xBU1NfV3JpdGVDaGFyKCZjaGFyX3RtcCwgUE9JTlRfT0ZGLCBDT0xVTU5fT04sIGkpOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgZGVmYXVsdDoNCiAgICAgICAgICBMQ0RfR0xBU1NfV3JpdGVDaGFyKCZjaGFyX3RtcCwgUE9JTlRfT0ZGLCBDT0xVTU5fT0ZGLCBpKTsNCiAgICAgICAgICBicmVhazsNCiAgICB9LyogUG9pbnQgb24gdGhlIG5leHQgY2hhcmFjdGVyICovDQogICAgcHRyKys7DQoNCiAgICAvKiBJbmNyZW1lbnQgdGhlIGNoYXJhY3RlciBjb3VudGVyICovDQogICAgaSsrOw0KICB9DQoJLyogVXBkYXRlIHRoZSBMQ0QgZGlzcGxheSAqLw0KICBMQ0RfVXBkYXRlRGlzcGxheVJlcXVlc3QoKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIENsZWFyIHRoZSB3aG9sZSBMQ0QgUkFNLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBMQ0RfR0xBU1NfQ2xlYXIodm9pZCkNCnsNCiAgdWludDMyX3QgY291bnRlciA9IDA7DQoNCiAgLyogVE8gd2FpdCBMQ0QgUmVhZHkgKi8NCiAgd2hpbGUoIExDRF9HZXRGbGFnU3RhdHVzIChMQ0RfRkxBR19VRFIpICE9IFJFU0VUKSA7DQoNCiAgZm9yIChjb3VudGVyID0gTENEX1JBTVJlZ2lzdGVyXzA7IGNvdW50ZXIgPD0gTENEX1JBTVJlZ2lzdGVyXzE1OyBjb3VudGVyKyspDQogIHsNCiAgICBMQ0QtPlJBTVtjb3VudGVyXSA9IDA7DQogIH0NCg0KICAvKiBVcGRhdGUgdGhlIExDRCBkaXNwbGF5ICovDQogIExDRF9VcGRhdGVEaXNwbGF5UmVxdWVzdCgpOw0KDQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGlzcGxheSBhIHN0cmluZyBpbiBzY3JvbGxpbmcgbW9kZQ0KICAqIEBwYXJhbSAgcHRyOiBQb2ludGVyIHRvIHN0cmluZyB0byBkaXNwbGF5IG9uIHRoZSBMQ0QgR2xhc3MuDQogICogQHBhcmFtICBuU2Nyb2xsOiBTcGVjaWZpZXMgaG93IG1hbnkgdGltZSB0aGUgbWVzc2FnZSB3aWxsIGJlIHNjcm9sbGVkDQogICogQHBhcmFtICBTY3JvbGxTcGVlZCA6IFNwZWNpaWZlcyB0aGUgc3BlZWQgb2YgdGhlIHNjcm9sbCwgbG93IHZhbHVlIGdpdmVzDQogICogICAgICAgICBoaWdoZXIgc3BlZWQNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKiBAcGFyICAgIFJlcXVpcmVkIHByZWNvbmRpdGlvbnM6IFRoZSBMQ0Qgc2hvdWxkIGJlIGNsZWFyZWQgYmVmb3JlIHRvIHN0YXJ0IHRoZQ0KICAqICAgICAgICAgd3JpdGUgb3BlcmF0aW9uLg0KICAqLw0Kdm9pZCBMQ0RfR0xBU1NfU2Nyb2xsU2VudGVuY2UodWludDhfdCogcHRyLCB1aW50MTZfdCBuU2Nyb2xsLCB1aW50MTZfdCBTY3JvbGxTcGVlZCkNCnsNCiAgdWludDhfdCBSZXBldGl0aW9uOw0KICB1aW50OF90IENoYXJfTmI7DQogIHVpbnQ4X3QqIHB0cjE7DQogIHVpbnQ4X3Qgc3RyWzddPSIiOw0KICB1aW50OF90IFN0cl9zaXplOw0KDQogIGlmIChwdHIgPT0gMCkgcmV0dXJuOw0KDQovKiBUbyBjYWxjdWxhdGUgZW5kIG9mIHN0cmluZyAqLw0KICBmb3IgKHB0cjE9cHRyLFN0cl9zaXplID0gMCA7ICpwdHIxICE9IDA7IFN0cl9zaXplKysscHRyMSsrKSA7DQoNCiAgcHRyMSA9IHB0cjsNCg0KICBMQ0RfR0xBU1NfRGlzcGxheVN0cmluZyhwdHIpOw0KICAvL0RlbGF5KFNjcm9sbFNwZWVkKTsNCg0KLyogVG8gc2hpZnQgdGhlIHN0cmluZyBmb3Igc2Nyb2xsaW5nIGRpc3BsYXkqLw0KICBmb3IgKFJlcGV0aXRpb249MDsgUmVwZXRpdGlvbjxuU2Nyb2xsOyBSZXBldGl0aW9uKyspDQogIHsNCiAgICBmb3IgKENoYXJfTmI9MDsgQ2hhcl9OYjxTdHJfc2l6ZTsgQ2hhcl9OYisrKQ0KICAgIHsNCiAgICAgICooc3RyKSA9KiAocHRyMSsoKENoYXJfTmIrMSklU3RyX3NpemUpKTsNCiAgICAgICooc3RyKzEpID0qIChwdHIxKygoQ2hhcl9OYisyKSVTdHJfc2l6ZSkpOw0KICAgICAgKihzdHIrMikgPSogKHB0cjErKChDaGFyX05iKzMpJVN0cl9zaXplKSk7DQogICAgICAqKHN0ciszKSA9KiAocHRyMSsoKENoYXJfTmIrNCklU3RyX3NpemUpKTsNCiAgICAgICooc3RyKzQpID0qIChwdHIxKygoQ2hhcl9OYis1KSVTdHJfc2l6ZSkpOw0KICAgICAgKihzdHIrNSkgPSogKHB0cjErKChDaGFyX05iKzYpJVN0cl9zaXplKSk7DQogICAgICBMQ0RfR0xBU1NfQ2xlYXIoKTsNCiAgICAgIExDRF9HTEFTU19EaXNwbGF5U3RyaW5nKHN0cik7DQoNCiAgLyogdXNlciBidXR0b24gcHJlc3NlZCBzdG9wIHRoZSBzY3JvbGxpbmcgc2VudGVuY2UgKi8NCiAgICAgIGlmIChLZXlQcmVzc2VkKQ0KICAgICAgICAgICAgICByZXR1cm47DQogICAgICAvL0RlbGF5KFNjcm9sbFNwZWVkKTsNCiAgICB9DQogIH0NCg0KfQ0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTEgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K