LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogNzV4X3NtaS5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDAzLzEwLzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgU01JIHNvZnR3YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA3LzE3LzIwMDYgOiBWMS4wDQoqIDAzLzEwLzIwMDYgOiBWMC4xDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBUSEUgUFJFU0VOVCBTT0ZUV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUgVElNRS4NCiogQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQoqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HIEZST00gVEhFDQoqIENPTlRFTlQgT0YgU1VDSCBTT0ZUV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUgQ09ESU5HDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICI3NXhfc21pLmgiDQoNCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogU01JX0NSMSBtYXNrIGJpdHMgKi8NCiNkZWZpbmUgU01JX0hPTERQUkVTQ1RDU19SRVNFVF9NYXNrICAweEZGMDA4MDBGDQojZGVmaW5lIFNNSV9QcmVzY2FsZXJfTWF4VmFsdWUgICAgICAgMHg3Rg0KI2RlZmluZSBTTUlfRGVzZWxlY3RUaW1lX01heFZhbHVlICAgIDB4MEYNCiNkZWZpbmUgU01JX0Nsb2NrSG9sZF9NYXNrICAgICAgICAgICAweDAwDQojZGVmaW5lIFNNSV9QcmVzY2FsZXJfTWFzayAgICAgICAgICAgMHgwMg0KI2RlZmluZSBTTUlfRGVzZWxlY3RUaW1lX01hc2sgICAgICAgIDB4NQ0KDQovKiBTTUlfQ1IyIG1hc2sgYml0cyAqLw0KI2RlZmluZSBTTUlfQlNfUkVTRVRfTWFzayAgICAgICAgICAgICAgMHhGRkZGQ0ZGRg0KI2RlZmluZSBTTUlfQlNfQmFuazFfTWFzayAgICAgICAgICAgICAgMHgwMDAwMTAwMA0KI2RlZmluZSBTTUlfQlNfQmFuazJfTWFzayAgICAgICAgICAgICAgMHgwMDAwMjAwMA0KI2RlZmluZSBTTUlfQlNfQmFuazNfTWFzayAgICAgICAgICAgICAgMHgwMDAwMzAwMA0KI2RlZmluZSBTTUlfV0VOX01hc2sgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMA0KI2RlZmluZSBTTUlfUlNSX01hc2sgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMA0KI2RlZmluZSBTTUlfU0VORF9NYXNrICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MA0KI2RlZmluZSBTTUlfVFJBUkVDTEVOR1RIX1JFU0VUX01hc2sgICAgMHhGRkZGRkY4OA0KDQovKiBTTUlfU1IgbWFzayBiaXRzICovDQojZGVmaW5lIFNNSV9TVEFUVVNSRUdJU1RFUl9NYXNrICAgIDB4RkYNCg0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTTUlfRGVJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRGVpbml0aWFsaXplcyB0aGUgU01JIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQNCiogICAgICAgICAgICAgICAgICByZXNldCB2YWx1ZXMuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgdXNlZCB3aGVuIGJvb3RpbmcNCiogICAgICAgICAgICAgICAgICBmcm9tIHRoZSBTTUkgZXh0ZXJuYWwgbWVtb3J5Lg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU01JX0RlSW5pdCh2b2lkKQ0Kew0KICBTTUktPkNSMSA9IDB4MDAwMDAyNTA7DQogIFNNSS0+Q1IyID0gMHgwMDsNCiAgU01JLT5TUiAmPSAweEZGRkZGMEZGOw0KICBTTUktPlRSID0gMHgwMDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTTUlfSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBTTUkgcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFNNSV9Jbml0U3RydWN0Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gU01JX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBTTUlfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCiogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgICBTTUkgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU01JX0luaXQoU01JX0luaXRUeXBlRGVmKiBTTUlfSW5pdFN0cnVjdCkNCnsNCiAgdTMyIFRlbXAgPSAwOw0KIA0KICAvKiBDbGVhciBIT0xEWzc6MF0sIFBSRVNDWzY6MF0gYW5kIFRDU1szOjBdIGJpdHMgKi8NCiAgVGVtcCA9IFNNSS0+Q1IxICYgU01JX0hPTERQUkVTQ1RDU19SRVNFVF9NYXNrOw0KDQogIC8qIFNldCBIT0xEWzc6MF0gYml0cyBhY2NvcmRpbmcgdG8gU01JX0Nsb2NrSG9sZCB2YWx1ZSAqLw0KICBUZW1wIHw9IFNNSV9Jbml0U3RydWN0LT5TTUlfQ2xvY2tIb2xkIDw8IDE2Ow0KDQogIGlmKFNNSV9Jbml0U3RydWN0LT5TTUlfUHJlc2NhbGVyIDw9IFNNSV9QcmVzY2FsZXJfTWF4VmFsdWUpDQogIHsNCiAgICAvKiBTZXQgUFJFU0NbNjowXSBiaXRzIGFjY29yZGluZyB0byBTTUlfUHJlc2NhbGVyIHZhbHVlICovDQogICAgVGVtcCB8PSBTTUlfSW5pdFN0cnVjdC0+U01JX1ByZXNjYWxlciA8PCA4Ow0KICB9DQoNCiAgaWYoU01JX0luaXRTdHJ1Y3QtPlNNSV9EZXNlbGVjdFRpbWUgPD0gU01JX0Rlc2VsZWN0VGltZV9NYXhWYWx1ZSkNCiAgew0KICAgIC8qIFNldCBUQ1NbMzowXSBiaXRzIGFjY29yZGluZyB0byBTTUlfRGVzZWxlY3RUaW1lIHZhbHVlICovDQogICAgVGVtcCB8PSBTTUlfSW5pdFN0cnVjdC0+U01JX0Rlc2VsZWN0VGltZSA8PCA0Ow0KICB9DQoNCiAgLyogU3RvcmUgdGhlIG5ldyB2YWx1ZSAqLw0KICBTTUktPkNSMSA9IFRlbXA7IA0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNNSV9TdHJ1Y3RJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRmlsbHMgZWFjaCBTTUlfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgcmVzZXQgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogLSBTTUlfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFNNSV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2gNCiogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNNSV9TdHJ1Y3RJbml0KFNNSV9Jbml0VHlwZURlZiogU01JX0luaXRTdHJ1Y3QpDQp7DQogIC8qIFNNSV9DSyBpcyBzZW50IGNvbnRpbnVvdXNseSAqLw0KICBTTUlfSW5pdFN0cnVjdC0+U01JX0Nsb2NrSG9sZCA9IFNNSV9DbG9ja0hvbGRfTWFzazsNCiAgDQogIC8qIFNNSV9DSyA9IEhDTEsvMiAqLw0KICBTTUlfSW5pdFN0cnVjdC0+U01JX1ByZXNjYWxlciA9IFNNSV9QcmVzY2FsZXJfTWFzazsNCiAgDQogIC8qIERlc2VsZWN0IFRpbWUgc2V0IHRvIDYqU01JX0NLIHBlcmlvZHMgKi8NCiAgU01JX0luaXRTdHJ1Y3QtPlNNSV9EZXNlbGVjdFRpbWUgPSBTTUlfRGVzZWxlY3RUaW1lX01hc2s7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU01JX01vZGVDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBTZWxlY3RzIHRoZSBTTUkgbW9kZTogaGFyZHdhcmUgb3Igc29mdHdhcmUuDQoqIElucHV0ICAgICAgICAgIDogLSBTTUlfTW9kZTogc3BlY2lmaWVzIHRoZSBTTUkgbW9kZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9Nb2RlX0hXOiBTTUkgaW4gaGFyZHdhcmUgbW9kZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfTW9kZV9TVzogU01JIGluIHNvZnR3YXJlIG1vZGUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU01JX01vZGVDb25maWcodTMyIFNNSV9Nb2RlKQ0Kew0KICBpZihTTUlfTW9kZSA9PSBTTUlfTW9kZV9TVykNCiAgeyAgIA0KICAgIFNNSS0+Q1IxIHw9IFNNSV9Nb2RlX1NXOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFNNSS0+Q1IxICY9IFNNSV9Nb2RlX0hXOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU01JX1R4UnhMZW5ndGhDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQgYW5kIHJlY2VpdmVkDQoqICAgICAgICAgICAgICAgICAgdG8vZnJvbSBleHRlcm5hbCBtZW1vcnkuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBTb2Z0d2FyZQ0KKiAgICAgICAgICAgICAgICAgIG1vZGUgb25seS4NCiogSW5wdXQgICAgICAgICAgOiAtIFNNSV9UeExlbmd0aDogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQNCiogICAgICAgICAgICAgICAgICAgIHRvIGV4dGVybmFsIG1lbW9yeS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9UeExlbmd0aF8wQnl0ZXM6IE5vIGJ5dGVzIHRyYW5zbWl0dGVkICANCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gU01JX1R4TGVuZ3RoXzFCeXRlOiAxIGJ5dGUgdHJhbnNtaXR0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gU01JX1R4TGVuZ3RoXzJCeXRlczogMiBieXRlcyB0cmFuc21pdHRlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfVHhMZW5ndGhfM0J5dGVzOiAzIGJ5dGVzIHRyYW5zbWl0dGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9UeExlbmd0aF80Qnl0ZXM6IDQgYnl0ZXMgdHJhbnNtaXR0ZWQNCiogICAgICAgICAgICAgICAgICAtIFNNSV9SeExlbmd0aDogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVjZWl2ZWQNCiogICAgICAgICAgICAgICAgICAgIGZyb20gZXh0ZXJuYWwgbWVtb3J5Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gU01JX1J4TGVuZ3RoXzBCeXRlczogTm8gYnl0ZXMgcmVjZWl2ZWQgIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfUnhMZW5ndGhfMUJ5dGU6IDEgYnl0ZSByZWNlaXZlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfUnhMZW5ndGhfMkJ5dGVzOiAyIGJ5dGVzIHJlY2VpdmVkDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9SeExlbmd0aF8zQnl0ZXM6IDMgYnl0ZXMgcmVjZWl2ZWQNCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gU01JX1J4TGVuZ3RoXzRCeXRlczogNCBieXRlcyByZWNlaXZlZA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTTUlfVHhSeExlbmd0aENvbmZpZyh1MzIgU01JX1R4TGVuZ3RoLCB1MzIgU01JX1J4TGVuZ3RoKSANCnsNCiAgdTMyIFRlbXAgPSAwOw0KIA0KICAvKiBDbGVhciBUUkFfTEVOR1RIWzI6MF0gYW5kIFJFQ19MRU5HVEhbMjowXSBiaXRzICovDQogIFRlbXAgPSBTTUktPkNSMiAmIFNNSV9UUkFSRUNMRU5HVEhfUkVTRVRfTWFzazsNCiANCiAgLyogU2V0IFRSQV9MRU5HVEhbMjowXSBhbmQgUkVDX0xFTkdUSFsyOjBdIGJpdHMgYWNjb3JkaW5nIHRvIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8NCiAgVGVtcCB8PSBTTUlfVHhMZW5ndGggfCBTTUlfUnhMZW5ndGg7DQogDQogIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8NCiAgU01JLT5DUjIgPSBUZW1wOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNNSV9CYW5rQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBCYW5rLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU01JX0Jhbms6IHNwZWNpZmllcyB0aGUgbWVtb3J5IEJhbmsgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9CYW5rXzANCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gU01JX0JhbmtfMQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfQmFua18yDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9CYW5rXzMNCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBtZW1vcnkgQmFuay4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNNSV9CYW5rQ21kKHUzMiBTTUlfQmFuaywgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBpZihOZXdTdGF0ZSA9PSBFTkFCTEUpDQogIHsNCiAgICBTTUktPkNSMSB8PSBTTUlfQmFuazsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBTTUktPkNSMSAmPSB+U01JX0Jhbms7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTTUlfSVRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgU01JIGludGVycnVwdHMuDQoqIElucHV0ICAgICAgICAgIDogLSBTTUlfSVQ6IHNwZWNpZmllcyB0aGUgU01JIGludGVycnVwdHMgc291cmNlcyB0byBiZQ0KKiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbg0KKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9JVF9XQyA6IFdyaXRlIENvbXBsZXRlIEludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfSVRfVEYgOiBUcmFuc2ZlciBGaW5pc2hlZCBJbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBTTUkgaW50ZXJydXB0cy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNNSV9JVENvbmZpZyh1MzIgU01JX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGlmKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIFNNSS0+Q1IyIHw9IFNNSV9JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBTTUktPkNSMiAmPSB+U01JX0lUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU01JX1NlbGVjdEJhbmsNCiogRGVzY3JpcHRpb24gICAgOiBTZWxlY3RzIHRoZSBtZW1vcnkgQmFuayB0byBiZSBhY2Nlc3NlZC4gT25seSBvbmUgQmFuayBjYW4gYmUNCiogICAgICAgICAgICAgICAgICBzZWxlY3RlZCBhdCBhIHRpbWUuDQoqIElucHV0ICAgICAgICAgIDogLSBTTUlfQmFuazogc3BlY2lmaWVzIHRoZSBtZW1vcnkgQmFuayB0byBiZSBzZWxlY3RlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9CYW5rXzANCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gU01JX0JhbmtfMQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfQmFua18yDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9CYW5rXzMNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU01JX1NlbGVjdEJhbmsodTMyIFNNSV9CYW5rKQ0Kew0KICAvKiBDbGVhciBCU1sxOjBdIGJpdHMgKEJhbmswIGlzIHNlbGVjdGVkKSovDQogIFNNSS0+Q1IyICY9IFNNSV9CU19SRVNFVF9NYXNrOw0KDQogIHN3aXRjaChTTUlfQmFuaykNCiAgew0KICAgIGNhc2UgU01JX0JhbmtfMToNCiAgICAgIC8qIFNlbGVjdCBCYW5rMSAqLw0KICAgICAgU01JLT5DUjIgfD0gU01JX0JTX0JhbmsxX01hc2s7DQogICAgICBicmVhazsNCg0KICAgIGNhc2UgU01JX0JhbmtfMjoNCiAgICAgIC8qIFNlbGVjdCBCYW5rMiAqLw0KICAgICAgU01JLT5DUjIgfD0gU01JX0JTX0JhbmsyX01hc2s7DQogICAgICBicmVhazsNCg0KICAgIGNhc2UgU01JX0JhbmtfMzoNCiAgICAgIC8qIFNlbGVjdCBCYW5rMyAqLw0KICAgICAgU01JLT5DUjIgfD0gU01JX0JTX0JhbmszX01hc2s7DQogICAgICBicmVhazsNCiAgICAgIA0KICAgIGRlZmF1bHQ6DQogICAgICBicmVhazsgICAgICANCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNNSV9TZW5kV0VOQ21kDQoqIERlc2NyaXB0aW9uICAgIDogU2VuZHMgYSBXcml0ZSBFbmFibGUgY29tbWFuZCB0byB0aGUgc2VsZWN0ZWQgbWVtb3J5IEJhbmsuDQoqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIEhhcmR3YXJlIG1vZGUgb25seS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNNSV9TZW5kV0VOQ21kKHZvaWQpDQp7DQogIFNNSS0+Q1IyIHw9IFNNSV9XRU5fTWFzazsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTTUlfU2VuZFJTUkNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IFNlbmRzIGEgUmVhZCBTdGF0dXMgUmVnaXN0ZXIgQ29tbWFuZCB0byB0aGUgc2VsZWN0ZWQgbWVtb3J5DQoqICAgICAgICAgICAgICAgICAgQmFuay4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNNSV9TZW5kUlNSQ21kKHZvaWQpDQp7DQogIFNNSS0+Q1IyIHw9IFNNSV9SU1JfTWFzazsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTTUlfU2VuZENtZA0KKiBEZXNjcmlwdGlvbiAgICA6IFNlbmRzIGNvbW1hbmQgdG8gdGhlIHNlbGVjdGVkIG1lbW9yeSBCYW5rLiBUaGlzIGZ1bmN0aW9uIGlzDQoqICAgICAgICAgICAgICAgICAgdXNlZCBpbiBTb2Z0d2FyZSBtb2RlIG9ubHkuDQoqIElucHV0ICAgICAgICAgIDogLSBDb21tYW5kOiBzcGVjaWZpZXMgdGhlIGNvbW1hbmQgdG8gc2VuZCB0byB0aGUgZXh0ZXJuYWwgbWVtb3J5Lg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTTUlfU2VuZENtZCh1MzIgQ29tbWFuZCkNCnsNCiAgLyogTG9hZCB0aGUgY29tbWFuZCBpbiB0aGUgVHJhbnNtaXQgUmVnaXN0ZXIgKi8NCiAgU01JLT5UUiA9IENvbW1hbmQ7DQoNCiAgLyogU3RhcnQgdHJhbnNmZXIgKi8gICAgDQogIFNNSS0+Q1IyIHw9IFNNSV9TRU5EX01hc2s7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU01JX0Zhc3RSZWFkQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgRmFzdCBSZWFkIE1vZGUuDQoqIElucHV0ICAgICAgICAgIDogLSBTTUlfRmFzdFJlYWQ6IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBGYXN0IFJlYWQgTW9kZSBpcw0KKiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9GYXN0UmVhZF9EaXNhYmxlIDogRmFzdCBSZWFkIE1vZGUgZGlzYWJsZWQNCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gU01JX0Zhc3RSZWFkX0VuYWJsZSA6IEZhc3QgUmVhZCBNb2RlIGVuYWJsZWQNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU01JX0Zhc3RSZWFkQ29uZmlnKHUzMiBTTUlfRmFzdFJlYWQpDQp7DQogIGlmKFNNSV9GYXN0UmVhZCA9PSBTTUlfRmFzdFJlYWRfRW5hYmxlKQ0KICB7DQogICAgU01JLT5DUjEgfD0gU01JX0Zhc3RSZWFkX0VuYWJsZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBTTUktPkNSMSAmPSBTTUlfRmFzdFJlYWRfRGlzYWJsZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNNSV9Xcml0ZUJ1cnN0Q29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgV3JpdGUgQnVyc3QgTW9kZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFNNSV9Xcml0ZUJ1cnN0OiBzcGVjaWZpZXMgd2hldGhlciB0aGUgV3JpdGUgQnVyc3QgTW9kZSBpcw0KKiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9Xcml0ZUJ1cnN0X0Rpc2FibGUgOiBXcml0ZSBCdXJzdCBNb2RlIGRpc2FibGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9Xcml0ZUJ1cnN0X0VuYWJsZSA6IFdyaXRlIEJ1cnN0IE1vZGUgZW5hYmxlZA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTTUlfV3JpdGVCdXJzdENvbmZpZyh1MzIgU01JX1dyaXRlQnVyc3QpDQp7DQogIGlmKFNNSV9Xcml0ZUJ1cnN0ID09IFNNSV9Xcml0ZUJ1cnN0X0VuYWJsZSkNCiAgew0KICAgIFNNSS0+Q1IxIHw9IFNNSV9Xcml0ZUJ1cnN0X0VuYWJsZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBTTUktPkNSMSAmPSBTTUlfV3JpdGVCdXJzdF9EaXNhYmxlOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU01JX1dyaXRlQnl0ZQ0KKiBEZXNjcmlwdGlvbiAgICA6IFdyaXRlcyBhIEJ5dGUgdG8gdGhlIHNlbGVjdGVkIG1lbW9yeSBCYW5rLiBUaGlzIGZ1bmN0aW9uIGlzDQoqICAgICAgICAgICAgICAgICAgdXNlZCBpbiBIYXJkd2FyZSBtb2RlIG9ubHkuDQoqICAgICAgICAgICAgICAgICAgQmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgc2VuZCBhIFdyaXRlIEVuYWJsZSBjb21tYW5kIHRvIA0KKiAgICAgICAgICAgICAgICAgIHRoZSBzZWxlY3RlZCBtZW1vcnkgQmFuayB1c2luZyBTTUlfU2VuZFdFTkNtZCgpIGZ1bmN0aW9uLg0KKiBJbnB1dCAgICAgICAgICA6IC0gV3JpdGVBZGRyOiBleHRlcm5hbCBtZW1vcnkgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSBkYXRhIHdpbGwNCiogICAgICAgICAgICAgICAgICAgIGJlIHdyaXR0ZW4uDQoqICAgICAgICAgICAgICAgICAgLSBEYXRhOiBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGV4dGVybmFsIG1lbW9yeS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU01JX1dyaXRlQnl0ZSh1MzIgV3JpdGVBZGRyLCB1OCBEYXRhKQ0Kew0KICAvKiBUcmFuc2ZlciBkYXRhIHRvIHRoZSBtZW1vcnkgKi8NCiAgKih1OCAqKSBXcml0ZUFkZHIgPSBEYXRhOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNNSV9Xcml0ZUhhbGZXb3JkDQoqIERlc2NyaXB0aW9uICAgIDogV3JpdGVzIGEgSGFsZiBXb3JkIHRvIHRoZSBzZWxlY3RlZCBtZW1vcnkgQmFuay4gVGhpcyBmdW5jdGlvbg0KKiAgICAgICAgICAgICAgICAgIGlzIHVzZWQgaW4gSGFyZHdhcmUgbW9kZSBvbmx5Lg0KKiAgICAgICAgICAgICAgICAgIEJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHNlbmQgYSBXcml0ZSBFbmFibGUgY29tbWFuZCB0byANCiogICAgICAgICAgICAgICAgICB0aGUgc2VsZWN0ZWQgbWVtb3J5IEJhbmsgdXNpbmcgU01JX1NlbmRXRU5DbWQoKSBmdW5jdGlvbi4NCiogSW5wdXQgICAgICAgICAgOiAtIFdyaXRlQWRkcjogZXh0ZXJuYWwgbWVtb3J5IGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgZGF0YSB3aWxsDQoqICAgICAgICAgICAgICAgICAgICBiZSB3cml0dGVuLg0KKiAgICAgICAgICAgICAgICAgIC0gRGF0YTogZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBleHRlcm5hbCBtZW1vcnkuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNNSV9Xcml0ZUhhbGZXb3JkKHUzMiBXcml0ZUFkZHIsIHUxNiBEYXRhKQ0Kew0KICAvKiBUcmFuc2ZlciBkYXRhIHRvIHRoZSBtZW1vcnkgKi8NCiAgKih1MTYgKikgV3JpdGVBZGRyID0gRGF0YTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTTUlfV3JpdGVXb3JkDQoqIERlc2NyaXB0aW9uICAgIDogV3JpdGVzIGEgV29yZCB0byB0aGUgc2VsZWN0ZWQgbWVtb3J5IEJhbmsuIFRoaXMgZnVuY3Rpb24gaXMNCiogICAgICAgICAgICAgICAgICB1c2VkIGluIEhhcmR3YXJlIG1vZGUgb25seS4NCiogICAgICAgICAgICAgICAgICBCZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBzZW5kIGEgV3JpdGUgRW5hYmxlIGNvbW1hbmQgdG8gDQoqICAgICAgICAgICAgICAgICAgdGhlIHNlbGVjdGVkIG1lbW9yeSBCYW5rIHVzaW5nIFNNSV9TZW5kV0VOQ21kKCkgZnVuY3Rpb24uDQoqIElucHV0ICAgICAgICAgIDogLSBXcml0ZUFkZHI6IGV4dGVybmFsIG1lbW9yeSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIGRhdGEgd2lsbA0KKiAgICAgICAgICAgICAgICAgICAgYmUgd3JpdHRlbi4NCiogICAgICAgICAgICAgICAgICAtIERhdGE6IGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgZXh0ZXJuYWwgbWVtb3J5Lg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTTUlfV3JpdGVXb3JkKHUzMiBXcml0ZUFkZHIsIHUzMiBEYXRhKQ0Kew0KICAvKiBUcmFuc2ZlciBkYXRhIHRvIHRoZSBtZW1vcnkgKi8NCiAgKih1MzIgKikgV3JpdGVBZGRyID0gRGF0YTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTTUlfUmVhZEJ5dGUNCiogRGVzY3JpcHRpb24gICAgOiBSZWFkcyBhIEJ5dGUgZnJvbSB0aGUgc2VsZWN0ZWQgbWVtb3J5IEJhbmsuIFRoaXMgZnVuY3Rpb24gaXMNCiogICAgICAgICAgICAgICAgICB1c2VkIGluIEhhcmR3YXJlIG1vZGUgb25seS4NCiogSW5wdXQgICAgICAgICAgOiAtIFJlYWRBZGRyOiBleHRlcm5hbCBtZW1vcnkgYWRkcmVzcyB0byByZWFkIGZyb20uDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IERhdGEgcmVhZCBmcm9tIHRoZSBleHRlcm5hbCBtZW1vcnkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTggU01JX1JlYWRCeXRlKHUzMiBSZWFkQWRkcikNCnsNCiAgcmV0dXJuKCoodTggKikgUmVhZEFkZHIpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNNSV9SZWFkSGFsZldvcmQNCiogRGVzY3JpcHRpb24gICAgOiBSZWFkcyBhIEhhbGYgV29yZCBmcm9tIHRoZSBzZWxlY3RlZCBtZW1vcnkgQmFuay4gVGhpcyBmdW5jdGlvbg0KKiAgICAgICAgICAgICAgICAgIGlzIHVzZWQgaW4gSGFyZHdhcmUgbW9kZSBvbmx5Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gUmVhZEFkZHI6IGV4dGVybmFsIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQgZnJvbS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogRGF0YSByZWFkIGZyb20gdGhlIGV4dGVybmFsIG1lbW9yeS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgU01JX1JlYWRIYWxmV29yZCh1MzIgUmVhZEFkZHIpDQp7DQogIHJldHVybigqKHUxNiAqKSBSZWFkQWRkcik7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU01JX1JlYWRXb3JkDQoqIERlc2NyaXB0aW9uICAgIDogUmVhZHMgYSBXb3JkIGZyb20gdGhlIHNlbGVjdGVkIG1lbW9yeSBCYW5rLiBUaGlzIGZ1bmN0aW9uIGlzDQoqICAgICAgICAgICAgICAgICAgdXNlZCBpbiBIYXJkd2FyZSBtb2RlIG9ubHkuDQoqIElucHV0ICAgICAgICAgIDogLSBSZWFkQWRkcjogZXh0ZXJuYWwgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZCBmcm9tLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBEYXRhIHJlYWQgZnJvbSB0aGUgZXh0ZXJuYWwgbWVtb3J5Lg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUzMiBTTUlfUmVhZFdvcmQodTMyIFJlYWRBZGRyKQ0Kew0KICByZXR1cm4oKih1MzIgKikgUmVhZEFkZHIpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNNSV9SZWFkTWVtb3J5U3RhdHVzUmVnaXN0ZXINCiogRGVzY3JpcHRpb24gICAgOiBSZWFkcyB0aGUgc3RhdHVzIHJlZ2lzdGVyIG9mIHRoZSBtZW1vcnkgY29ubmVjdGVkIHRvIHRoZQ0KKiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIEJhbmsuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBFeHRlcm5hbCBtZW1vcnkgc3RhdHVzIHJlZ2lzdGVyIHZhbHVlLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnU4IFNNSV9SZWFkTWVtb3J5U3RhdHVzUmVnaXN0ZXIodm9pZCkNCnsNCiByZXR1cm4oKHU4KSAoU01JLT5TUiAmIFNNSV9TVEFUVVNSRUdJU1RFUl9NYXNrKSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU01JX0dldEZsYWdTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNNSSBmbGFnIGlzIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBTTUlfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gU01JX0ZMQUdfQmFuazNfV00gOiBNZW1vcnkgQmFuazMgV3JpdGUgTW9kZSBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9GTEFHX0JhbmsyX1dNIDogTWVtb3J5IEJhbmsyIFdyaXRlIE1vZGUgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfRkxBR19CYW5rMV9XTSA6IE1lbW9yeSBCYW5rMSBXcml0ZSBNb2RlIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gU01JX0ZMQUdfQmFuazBfV00gOiBNZW1vcnkgQmFuazAgV3JpdGUgTW9kZSBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9GTEFHX0VSRjIgOiBFcnJvciBGbGFnIDI6IEZvcmJpZGRlbiBXcml0ZSBSZXF1ZXN0DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9GTEFHX0VSRjEgOiBFcnJvciBGbGFnIDE6IEZvcmJpZGRlbiBBY2Nlc3MNCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gU01JX0ZMQUdfV0MgOiBXcml0ZSBDb21wbGV0ZSBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9GTEFHX1RGIDogVHJhbnNmZXIgRmluaXNoZWQgZmxhZw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIFNNSV9GTEFHIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgU01JX0dldEZsYWdTdGF0dXModTMyIFNNSV9GTEFHKQ0Kew0KICBpZigoU01JLT5TUiAmIFNNSV9GTEFHKSAhPSBSRVNFVCkNCiAgew0KICAgIHJldHVybiBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgcmV0dXJuIFJFU0VUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU01JX0NsZWFyRmxhZw0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgU01JknMgcGVuZGluZyBmbGFncy4NCiogSW5wdXQgICAgICAgICAgOiAtIFNNSV9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfRkxBR19FUkYyIDogRXJyb3IgRmxhZyAyOiBGb3JiaWRkZW4gV3JpdGUgUmVxdWVzdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfRkxBR19FUkYxIDogRXJyb3IgRmxhZyAxOiBGb3JiaWRkZW4gQWNjZXNzDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9GTEFHX1dDIDogV3JpdGUgQ29tcGxldGUgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfRkxBR19URiA6IFRyYW5zZmVyIEZpbmlzaGVkIGZsYWcNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU01JX0NsZWFyRmxhZyh1MzIgU01JX0ZMQUcpDQp7DQogIFNNSS0+U1IgJj0gflNNSV9GTEFHOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNNSV9HZXRJVFN0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU01JIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gU01JX0ZMQUc6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9JVF9XQyA6IFdyaXRlIENvbXBsZXRlIEludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTTUlfSVRfVEYgOiBUcmFuc2ZlciBGaW5pc2hlZCBJbnRlcnJ1cHQNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBTTUlfSVQgKFNFVCBvciBSRVNFVCkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KSVRTdGF0dXMgU01JX0dldElUU3RhdHVzKHUzMiBTTUlfSVQpDQp7DQogIGlmKCgoU01JLT5DUjIgJiBTTUlfSVQpICE9IFJFU0VUKSAmJiAoKFNNSS0+U1IgJiBTTUlfSVQpICE9IFJFU0VUKSkNCiAgew0KICAgIHJldHVybiBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgcmV0dXJuIFJFU0VUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU01JX0NsZWFySVRQZW5kaW5nQml0DQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBTTUmScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU01JX0ZMQUc6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0cyBzb3VyY2VzIHRvIGNsZWFyLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gU01JX0lUX1dDIDogV3JpdGUgQ29tcGxldGUgSW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNNSV9JVF9URiA6IFRyYW5zZmVyIEZpbmlzaGVkIEludGVycnVwdA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTTUlfQ2xlYXJJVFBlbmRpbmdCaXQodTMyIFNNSV9JVCkNCnsNCiAgU01JLT5TUiAmPSB+U01JX0lUOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDYgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K