LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogNzV4X3NzcC5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDAzLzEwLzIwMDYgDQoqIERlc2NyaXB0aW9uICAgICAgICA6IFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIFNTUCBzb2Z0d2FyZSBmdW5jdGlvbnMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBIaXN0b3J5Og0KKiAwNy8xNy8yMDA2IDogVjEuMA0KKiAwMy8xMC8yMDA2IDogVjAuMQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgU09GVFdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULCANCiogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcgRlJPTSBUSEUNCiogQ09OVEVOVCBPRiBTVUNIIFNPRlRXQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRSBDT0RJTkcgDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICI3NXhfc3NwLmgiDQojaW5jbHVkZSAiNzV4X21yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogU1NQIHBlcmlwaGVyYWwgRW5hYmxlICovDQojZGVmaW5lIFNTUF9FbmFibGUgICAweDAwMDINCiNkZWZpbmUgU1NQX0Rpc2FibGUgIDB4RkZGRA0KDQovKiBTU1AgTG9vcCBCYWNrIE1vZGUgRW5hYmxlICovDQojZGVmaW5lIFNTUF9Mb29wQmFja01vZGVfRW5hYmxlICAgMHgwMDAxDQojZGVmaW5lIFNTUF9Mb29wQmFja01vZGVfRGlzYWJsZSAgMHhGRkZFDQoNCi8qIFNTUCBGbGFnIE1hc2sgKi8NCiNkZWZpbmUgU1NQX0ZsYWdfTWFzayAgMHgwMDFGDQoNCi8qIFNTUCBETUEgdHJhbnNtaXQvIHJlY2VpdmUgZW5hYmxlL2Rpc2FibGUgTWFza3MgKi8NCiNkZWZpbmUgU1NQMF9ETUFfVHJhbnNtaXRFbmFibGUgICAweDAwMDINCiNkZWZpbmUgU1NQMF9ETUFfVHJhbnNtaXREaXNhYmxlICAweEZGRkQNCiNkZWZpbmUgU1NQMF9ETUFfUmVjZWl2ZUVuYWJsZSAgICAweDAwMDENCiNkZWZpbmUgU1NQMF9ETUFfUmVjZWl2ZURpc2FibGUgICAweEZGRkUNCg0KLyogU1NQIE1hc2tzICovDQojZGVmaW5lIFNTUF9GcmFtZUZvcm1hdF9NYXNrICAgICAweEZGQ0YNCiNkZWZpbmUgU1NQX0RhdGFTaXplX01hc2sgICAgICAgIDB4RkZGMA0KI2RlZmluZSBTU1BfQ2xvY2tSYXRlX01hc2sgICAgICAgMHgwMEZGDQojZGVmaW5lIFNTUF9DbG9ja1ByZXNjYWxlcl9NYXNrICAweEZGMDANCiNkZWZpbmUgU1NQX1NTSV9TZXRfTWFzayAgICAgICAgIDB4MDAyMA0KI2RlZmluZSBTU1BfU1NJX1Jlc2V0X01hc2sgICAgICAgMHhGRkRGDQoNCg0KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU1NQX0RlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgdGhlIFNTUHggcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdA0KKiAgICAgICAgICAgICAgICAgIHJlc2V0IHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiBTU1B4OiB3aGVyZSB4IGNhbiBiZSAwIG9yIDEgdG8gc2VsZWN0IHRoZSBTU1AgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1NQX0RlSW5pdChTU1BfVHlwZURlZiogU1NQeCkNCnsNCiAgaWYoU1NQeCA9PSBTU1AwKQ0KICB7DQogICAgLyogUmVzZXQgdGhlIFNTUDAgcmVnaXN0ZXJzIHZhbHVlcyovDQogICAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfU1NQMCxFTkFCTEUpOw0KICAgIE1SQ0NfUGVyaXBoZXJhbFNXUmVzZXRDb25maWcoTVJDQ19QZXJpcGhlcmFsX1NTUDAsRElTQUJMRSk7IA0KICB9DQogIGVsc2UgaWYgKFNTUHggPT0gU1NQMSkNCiAgew0KICAgIC8qIFJlc2V0IHRoZSBTU1AxIHJlZ2lzdGVycyB2YWx1ZXMqLw0KICAgIE1SQ0NfUGVyaXBoZXJhbFNXUmVzZXRDb25maWcoTVJDQ19QZXJpcGhlcmFsX1NTUDEsRU5BQkxFKTsNCiAgICBNUkNDX1BlcmlwaGVyYWxTV1Jlc2V0Q29uZmlnKE1SQ0NfUGVyaXBoZXJhbF9TU1AxLERJU0FCTEUpOyANCiAgfSANCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTU1BfSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBTU1B4ICBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgU1NQX0luaXRUeXBlRGVmIHN0cnVjdHVyZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFNTUHg6IHdoZXJlIHggY2FuIGJlIDAgb3IgMSB0byBzZWxlY3QgdGhlIFNTUCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gU1NQX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBTU1BfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCiogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNTUA0KKiAgICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1NQX0luaXQoU1NQX1R5cGVEZWYqIFNTUHgsIFNTUF9Jbml0VHlwZURlZiogU1NQX0luaXRTdHJ1Y3QpDQp7IA0KICAvKiBDb25maWd1cmUgdGhlIEZyYW1lIGZvcm1hdCAqLw0KICBpZihTU1BfSW5pdFN0cnVjdC0+U1NQX0ZyYW1lRm9ybWF0ID09IFNTUF9GcmFtZUZvcm1hdF9USSkNCiAgeyAgIA0KICAgIC8qIENsZWFyIHRoZSBGUkZbMTowXSBiaXRzICovDQogICAgU1NQeC0+Q1IwICY9IFNTUF9GcmFtZUZvcm1hdF9NYXNrOw0KICAgIC8qIFNldCB0aGUgVEkgZnJhbWUgZm9ybWF0ICovDQogICAgU1NQeC0+Q1IwIHw9IFNTUF9GcmFtZUZvcm1hdF9USTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBTZXQgdGhlIE1vdG9yb2xhIGZyYW1lIGZvcm1hdCAqLw0KICAgIFNTUHgtPkNSMCAmPSBTU1BfRnJhbWVGb3JtYXRfTW90b3JvbGE7DQogICAgLyogQ29uZmlndXJlIHRoZSBDbG9jayBwb2xhcml0eSAqLw0KICAgIGlmKFNTUF9Jbml0U3RydWN0LT5TU1BfQ1BPTCA9PSBTU1BfQ1BPTF9IaWdoKQ0KICAgIHsgICANCiAgICAgIC8qIFNDSyBpcyBoZWxkIGhpZ2ggd2hlbiBubyBkYXRhIGlzIGJlaW5nIHRyYW5zZmVyZWQgKi8gICAgDQogICAgICBTU1B4LT5DUjAgfD0gU1NQX0NQT0xfSGlnaDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8qIFNDSyBpcyBoZWxkIGxvdyB3aGVuIG5vIGRhdGEgaXMgYmVpbmcgdHJhbnNmZXJlZCAqLyANCiAgICAgIFNTUHgtPkNSMCAmPSBTU1BfQ1BPTF9Mb3c7DQogICAgfQ0KICAgIC8qIENvbmZpZ3VyZSB0aGUgQ2xvY2sgUGhhc2UgKi8NCiAgICBpZihTU1BfSW5pdFN0cnVjdC0+U1NQX0NQSEEgPT0gU1NQX0NQSEFfMkVkZ2UpDQogICAgeyAgICANCiAgICAgIC8qIERhdGEgY2FwdHVyZWQgb24gc2Vjb25kIGNsb2NrIGVkZ2UgKi8gICANCiAgICAgIFNTUHgtPkNSMCB8PSBTU1BfQ1BIQV8yRWRnZTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8qIERhdGEgY2FwdHVyZWQgb24gZmlyc3QgY2xvY2sgZWRnZSAqLw0KICAgICAgU1NQeC0+Q1IwICY9IFNTUF9DUEhBXzFFZGdlOw0KICAgIH0NCiAgfQ0KICANCiAgLyogQ29uZmlndXJlIHRoZSBNb2RlICovDQogIGlmKFNTUF9Jbml0U3RydWN0LT5TU1BfTW9kZSA9PSBTU1BfTW9kZV9TbGF2ZSkNCiAgeyAgDQogICAgLyogU2V0IHRoZSBzbGF2ZSBtb2RlICovIA0KICAgIFNTUHgtPkNSMSB8PSBTU1BfTW9kZV9TbGF2ZTsNCiAgICAvKiBDb25maWd1cmUgdGhlIFNsYXZlIG91dHB1dCAqLw0KICAgIGlmKFNTUF9Jbml0U3RydWN0LT5TU1BfU2xhdmVPdXRwdXQgPT0gU1NQX1NsYXZlT3V0cHV0X0Rpc2FibGUpDQogICAgeyAgDQogICAgICAvKiBTbGF2ZSBvdXRwdXQgZGlzYWJsZWQgKi8gICAgIA0KICAgICAgU1NQeC0+Q1IxIHw9IFNTUF9TbGF2ZU91dHB1dF9EaXNhYmxlOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgLyogU2xhdmUgb3V0cHV0IGVuYWJsZWQgKi8gICAgIA0KICAgICAgU1NQeC0+Q1IxICY9IFNTUF9TbGF2ZU91dHB1dF9FbmFibGU7DQogICAgfQ0KICAgIC8qIENvbmZpZ3VyZSB0aGUgTlNTIHBpbiAqLw0KICAgIGlmKFNTUF9Jbml0U3RydWN0LT5TU1BfTlNTID09IFNTUF9OU1NfU29mdCkNCiAgICB7ICANCiAgICAgIC8qIFNsYXZlIHNlbGVjdGVkIGJ5IHNvZnR3YXJlIHRocm91Z2ggU1NJIGJpdCAqLyAgICAgDQogICAgICBTU1B4LT5DUjEgfD0gU1NQX05TU19Tb2Z0Ow0KICAgICAgU1NQeC0+Q1IxICY9IFNTUF9TU0lfUmVzZXRfTWFzazsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8qIFNsYXZlIHNlbGVjdGVkIGJ5IGhhcmR3YXJlIHRocm91Z2ggZXh0ZXJuYWwgU1NwaW4gKi8NCiAgICAgIFNTUHgtPkNSMSAmPSBTU1BfTlNTX0hhcmQ7DQogICAgfQ0KICAgIC8qIENvbmZpZ3VyZSB0aGUgQ2xvY2sgcmF0ZSBhbmQgcHJlc2NhbGVyIGluIFRJIHNsYXZlIG1vZGUgKi8NCiAgICBpZihTU1BfSW5pdFN0cnVjdC0+U1NQX0ZyYW1lRm9ybWF0ID09IFNTUF9GcmFtZUZvcm1hdF9USSkNCiAgICB7IA0KICAgICAgLyogQ2xlYXIgY2xvY2sgcmF0ZSBTQ1JbNzowXSBiaXRzICovDQogICAgICBTU1B4LT5DUjAgJj0gU1NQX0Nsb2NrUmF0ZV9NYXNrOyANCiAgICAgIC8qIFNldCB0aGUgc2VyaWFsIGNsb2NrIHJhdGUgKi8NCiAgICAgIFNTUHgtPkNSMCB8PSAoU1NQX0luaXRTdHJ1Y3QtPlNTUF9DbG9ja1JhdGU8PDgpOw0KICAgICAgLyogQ2xlYXIgY2xvY2sgcHJlc2NhbGVyIENQU0RWU1JbNzowXSBiaXRzICovDQogICAgICBTU1B4LT5QUiAmPSBTU1BfQ2xvY2tQcmVzY2FsZXJfTWFzazsNCiAgICAgIC8qIFNldCB0aGUgc2VyaWFsIGNsb2NrIHByZXNjYWxlciAqLw0KICAgICAgU1NQeC0+UFIgfD0gU1NQX0luaXRTdHJ1Y3QtPlNTUF9DbG9ja1ByZXNjYWxlcjsNCiAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogU2V0IHRoZSBtYXN0ZXIgbW9kZSAqLw0KICAgIFNTUHgtPkNSMSAmPSBTU1BfTW9kZV9NYXN0ZXI7DQogICAgLyogQ29uZmlndXJlIHRoZSBOU1MgcGluICovDQogICAgaWYoU1NQX0luaXRTdHJ1Y3QtPlNTUF9OU1MgPT0gU1NQX05TU19Tb2Z0KQ0KICAgIHsgIA0KICAgICAgLyogTWFzdGVyIHNlbGVjdGVkIGJ5IHNvZnR3YXJlIHRocm91Z2ggU1NJIGJpdCAqLyAgICAgDQogICAgICBTU1B4LT5DUjEgfD0gU1NQX05TU19Tb2Z0Ow0KICAgICAgU1NQeC0+Q1IxIHw9IFNTUF9TU0lfU2V0X01hc2s7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAvKiBNYXN0ZXIgc2VsZWN0ZWQgYnkgaGFyZHdhcmUgdGhyb3VnaCBleHRlcm5hbCBTU3BpbiAqLw0KICAgICAgU1NQeC0+Q1IxICY9IFNTUF9OU1NfSGFyZDsNCiAgICB9DQogICAgLyogQ2xlYXIgY2xvY2sgcmF0ZSBTQ1JbNzowXSBiaXRzICovDQogICAgU1NQeC0+Q1IwICY9IFNTUF9DbG9ja1JhdGVfTWFzazsgDQogICAgLyogU2V0IHRoZSBzZXJpYWwgY2xvY2sgcmF0ZSAqLw0KICAgIFNTUHgtPkNSMCB8PSAoU1NQX0luaXRTdHJ1Y3QtPlNTUF9DbG9ja1JhdGU8PDgpOw0KICAgIC8qIENsZWFyIGNsb2NrIHByZXNjYWxlciBDUFNEVlNSWzc6MF0gYml0cyAqLw0KICAgIFNTUHgtPlBSICY9IFNTUF9DbG9ja1ByZXNjYWxlcl9NYXNrOw0KICAgIC8qIFNldCB0aGUgc2VyaWFsIGNsb2NrIHByZXNjYWxlciAqLw0KICAgIFNTUHgtPlBSIHw9IFNTUF9Jbml0U3RydWN0LT5TU1BfQ2xvY2tQcmVzY2FsZXI7DQogIH0NCiAgDQogIC8qIENsZWFyIGRhdGEgc2l6ZSBEU1NbMzowXSBiaXRzICovDQogIFNTUHgtPkNSMCAmPSBTU1BfRGF0YVNpemVfTWFzazsNCiAgLyogU2V0IHRoZSBkYXRhIHNpemUgKi8NCiAgU1NQeC0+Q1IwIHw9IFNTUF9Jbml0U3RydWN0LT5TU1BfRGF0YVNpemU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU1NQX1N0cnVjdEluaXQNCiogRGVzY3JpcHRpb24gICAgOiBGaWxscyBlYWNoIFNTUF9Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IFNTUF9Jbml0U3RydWN0IDogcG9pbnRlciB0byBhIFNTUF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiAgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTU1BfU3RydWN0SW5pdChTU1BfSW5pdFR5cGVEZWYqIFNTUF9Jbml0U3RydWN0KQ0Kew0KICAvKiBJbml0aWFsaXplIHRoZSBTU1BfRnJhbWVGb3JtYXQgbWVtYmVyICovDQogIFNTUF9Jbml0U3RydWN0LT5TU1BfRnJhbWVGb3JtYXQgPSBTU1BfRnJhbWVGb3JtYXRfTW90b3JvbGE7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgU1NQX01vZGUgbWVtYmVyICovDQogIFNTUF9Jbml0U3RydWN0LT5TU1BfTW9kZSA9IFNTUF9Nb2RlX01hc3RlcjsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBTU1BfQ1BPTCBtZW1iZXIgKi8NCiAgU1NQX0luaXRTdHJ1Y3QtPlNTUF9DUE9MID0gU1NQX0NQT0xfTG93Ow0KDQogIC8qIEluaXRpYWxpemUgdGhlIFNTUF9DUEhBIG1lbWJlciAqLw0KICBTU1BfSW5pdFN0cnVjdC0+U1NQX0NQSEEgPSBTU1BfQ1BIQV8xRWRnZTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBTU1BfRGF0YVNpemUgbWVtYmVyICovDQogIFNTUF9Jbml0U3RydWN0LT5TU1BfRGF0YVNpemUgPSBTU1BfRGF0YVNpemVfOGI7DQogIA0KICAvKiBJbml0aWFsaXplIHRoZSBTU1BfTlNTICBtZW1iZXIgKi8NCiAgU1NQX0luaXRTdHJ1Y3QtPlNTUF9OU1MgPSBTU1BfTlNTX0hhcmQ7DQogIA0KICAvKiBJbml0aWFsaXplIHRoZSBTU1BfU2xhdmVPdXRwdXQgbWVtYmVyICovDQogIFNTUF9Jbml0U3RydWN0LT5TU1BfU2xhdmVPdXRwdXQgPSBTU1BfU2xhdmVPdXRwdXRfRW5hYmxlOw0KICANCiAgLyogSW5pdGlhbGl6ZSB0aGUgU1NQX0Nsb2NrUmF0ZSBtZW1iZXIgKi8NCiAgU1NQX0luaXRTdHJ1Y3QtPlNTUF9DbG9ja1JhdGUgPSAwOw0KICANCiAgLyogSW5pdGlhbGl6ZSB0aGUgU1NQX0Nsb2NrUHJlc2NhbGVyIG1lbWJlciAqLw0KICBTU1BfSW5pdFN0cnVjdC0+U1NQX0Nsb2NrUHJlc2NhbGVyID0gMDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTU1BfQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFNTUCBwZXJpcGhlcmFsLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU1NQeDogd2hlcmUgeCBjYW4gYmUgMCBvciAxIHRvIHNlbGVjdCB0aGUgU1NQIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBTU1B4IHBlcmlwaGVyYWwuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1NQX0NtZChTU1BfVHlwZURlZiogU1NQeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBpZihOZXdTdGF0ZSA9PSBFTkFCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIFNTUCBwZXJpcGhlcmFsICovDQogICAgU1NQeC0+Q1IxIHw9IFNTUF9FbmFibGU7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgU1NQIHBlcmlwaGVyYWwgKi8NCiAgICBTU1B4LT5DUjEgJj0gU1NQX0Rpc2FibGU7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTU1BfSVRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgU1NQIGludGVycnVwdHMuDQoqIElucHV0ICAgICAgICAgIDogLSBTU1B4OiB3aGVyZSB4IGNhbiBiZSAwIG9yIDEgdG8gc2VsZWN0IHRoZSBTU1AgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFNTUF9JVDogc3BlY2lmaWVzIHRoZSBTU1AgaW50ZXJydXB0cyBzb3VyY2VzIHRvIGJlIGVuYWJsZWQNCiogICAgICAgICAgICAgICAgICAgIG9yIGRpc2FibGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZQ0KKiAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1BfSVRfVHhGaWZvOiBUcmFuc21pdCBGSUZPIGhhbGYgZW1wdHkgb3IgbGVzcyBpbnRlcnJ1cHQgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQX0lUX1J4RmlmbzogUmVjZWl2ZSBGSUZPIGhhbGYgZnVsbCBvciBsZXNzIGludGVycnVwdCANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1BfSVRfUnhUaW1lT3V0OiBSZWNlaXZlIHRpbWVvdXQgaW50ZXJydXB0IA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTUF9JVF9SeE92ZXJydW46IFJlY2VpdmUgb3ZlcnJ1biBpbnRlcnJ1cHQgDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgU1NQIGludGVycnVwdHMuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTU1BfSVRDb25maWcoU1NQX1R5cGVEZWYqIFNTUHgsIHUxNiBTU1BfSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgaWYoTmV3U3RhdGUgPT0gRU5BQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBTU1AgaW50ZXJydXB0cyAqLw0KICAgIFNTUHgtPklNU0NSIHw9IFNTUF9JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTU1AgaW50ZXJydXB0cyAqLw0KICAgIFNTUHgtPklNU0NSICY9IH5TU1BfSVQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTU1BfRE1BQ21kDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgU1NQMCBETUEgaW50ZXJmYWNlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU1NQMF9ETUF0cmFuc2ZlciA6IHNwZWNpZmllcyB0aGUgRE1BIHRyYW5zZmVyIHRvIGJlIA0KKiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUNCiogICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQMF9ETUFfVHJhbnNtaXQ6IHRyYW5zbWl0IEZpZm8gRE1BIHRyYW5zZmVyDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQMF9ETUFfUmVjZWl2ZTogcmVjZWl2ZSBGaWZvIERNQSB0cmFuc2ZlciANCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgU1NQMCBETUEgdHJhbnNmZXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTU1BfRE1BQ21kKHUxNiBTU1AwX0RNQXRyYW5zZmVyLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGlmKE5ld1N0YXRlID09IEVOQUJMRSkgDQogIHsNCiAgICBpZihTU1AwX0RNQXRyYW5zZmVyID09IFNTUDBfRE1BX1RyYW5zbWl0KSANCiAgICB7DQogICAgICAvKiBFbmFibGUgRE1BIGZvciB0aGUgdHJhbnNtaXQgRklGTyAqLw0KICAgICAgU1NQMC0+RE1BQ1IgfD0gU1NQMF9ETUFfVHJhbnNtaXRFbmFibGU7DQogICAgfQ0KICAgIGVsc2UgDQogICAgew0KICAgICAgLyogRW5hYmxlIERNQSBmb3IgdGhlIHJlY2VpdmUgRklGTyAqLw0KICAgICAgU1NQMC0+RE1BQ1IgfD0gU1NQMF9ETUFfUmVjZWl2ZUVuYWJsZTsNCiAgICB9DQogIH0NCiAgZWxzZSANCiAgew0KICAgIGlmKFNTUDBfRE1BdHJhbnNmZXIgPT0gU1NQMF9ETUFfVHJhbnNtaXQpIA0KICAgIHsNCiAgICAgIC8qIERpc2FibGUgRE1BIGZvciB0aGUgdHJhbnNtaXQgRklGTyAqLw0KICAgICAgU1NQMC0+RE1BQ1IgJj0gU1NQMF9ETUFfVHJhbnNtaXREaXNhYmxlOw0KICAgIH0NCiAgICBlbHNlIA0KICAgIHsNCiAgICAgIC8qIERpc2FibGUgRE1BIGZvciB0aGUgcmVjZWl2ZSBGSUZPICovDQogICAgICBTU1AwLT5ETUFDUiAmPSBTU1AwX0RNQV9SZWNlaXZlRGlzYWJsZTsNCiAgICB9DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTU1BfRE1BVHhDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBTU1AwIERNQSB0cmFuc21pdCB0cmFuc2Zlci4NCiogSW5wdXQgICAgICAgICAgOiAtIFNTUDBfRE1BVHhSZXEgOiBzcGVjaWZpZXMgdGhlIFNTUDAgRE1BIHRyYW5zbWl0IHJlcXVlc3QgdG8gIA0KKiAgICAgICAgICAgICAgICAgICAgYmUgZW5hYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nDQoqICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQMF9ETUFUeFJlcV9TaW5nbGU6IFRyYW5zbWl0IEZJRk8gRE1BIHNpbmdsZSANCiogICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IGVuYWJsZWQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1AwX0RNQVR4UmVxX0J1cnN0OiBUcmFuc21pdCBGSUZPIERNQSBidXJzdCByZXF1ZXN0DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTU1BfRE1BVHhDb25maWcodTE2IFNTUDBfRE1BVHhSZXEpDQp7DQogIGlmKFNTUDBfRE1BVHhSZXEgPT0gU1NQMF9ETUFUeFJlcV9CdXJzdCkgDQogIHsNCiAgICAvKiBFbmFibGUgRE1BIHRyYW5zbWl0IGJ1cnN0IHJlcXVlc3QgKi8NCiAgICBTU1AwLT5ETUFDUiB8PSBTU1AwX0RNQVR4UmVxX0J1cnN0Ow0KICB9DQogIGVsc2UgICANCiAgew0KICAgIC8qIEVuYWJsZSBETUEgdHJhbnNtaXQgc2luZ2xlIHJlcXVlc3QgKi8NCiAgICBTU1AwLT5ETUFDUiAmPSBTU1AwX0RNQVR4UmVxX1NpbmdsZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNTUF9ETUFSeENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFNTUDAgRE1BIHJlY2VpdmUgdHJhbnNmZXIuDQoqIElucHV0ICAgICAgICAgIDogLSBTU1AwX0RNQVJ4UmVxIDogc3BlY2lmaWVzIHRoZSBTU1AwIERNQSByZWNlaXZlIHJlcXVlc3QgdG8gIA0KKiAgICAgICAgICAgICAgICAgICAgYmUgZW5hYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nDQoqICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQMF9ETUFSeFJlcV9TaW5nbGU6IFJlY2VpdmUgRklGTyBETUEgYnVyc3QgcmVxdWVzdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1AwX0RNQVJ4UmVxX0J1cnN0OiBSZWNlaXZlIEZJRk8gRE1BIHNpbmdsZSByZXF1ZXN0DQoqICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNTUF9ETUFSeENvbmZpZyh1MTYgU1NQMF9ETUFSeFJlcSkNCnsNCiAgaWYoU1NQMF9ETUFSeFJlcSA9PSBTU1AwX0RNQVJ4UmVxX0J1cnN0KSANCiAgew0KICAgIC8qIEVuYWJsZSBETUEgcmVjZWl2ZSBidXJzdCByZXF1ZXN0ICovDQogICAgU1NQMC0+RE1BQ1IgfD0gU1NQMF9ETUFSeFJlcV9CdXJzdDsNCiAgfQ0KICBlbHNlICAgDQogIHsNCiAgICAvKiBFbmFibGUgRE1BIHJlY2VpdmUgc2luZ2xlIHJlcXVlc3QgKi8NCiAgICBTU1AwLT5ETUFDUiAmPSBTU1AwX0RNQVJ4UmVxX1NpbmdsZTsNCiAgfSAgDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU1NQX1NlbmREYXRhDQoqIERlc2NyaXB0aW9uICAgIDogVHJhbnNtaXRzIGEgRGF0YSB0aHJvdWdoIHRoZSBTU1AgcGVyaXBoZXJhbC4NCiogSW5wdXQgICAgICAgICAgOiAtIFNTUHg6IHdoZXJlIHggY2FuIGJlIDAgb3IgMSB0byBzZWxlY3QgdGhlIFNTUCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gRGF0YSA6IERhdGEgdG8gYmUgdHJhbnNtaXR0ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNTUF9TZW5kRGF0YShTU1BfVHlwZURlZiogU1NQeCwgdTE2IERhdGEpDQp7DQogIC8qIFdyaXRlIGluIHRoZSBEUiByZWdpc3RlciB0aGUgZGF0YSB0byBiZSBzZW50ICovDQogIFNTUHgtPkRSID0gRGF0YTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTU1BfUmVjZWl2ZURhdGENCiogRGVzY3JpcHRpb24gICAgOiBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCByZWNlaXZlZCBkYXRhIGJ5IHRoZSBTU1AgcGVyaXBoZXJhbC4NCiogSW5wdXQgICAgICAgICAgOiBTU1B4OiB3aGVyZSB4IGNhbiBiZSAwIG9yIDEgdG8gc2VsZWN0IHRoZSBTU1AgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlZCBkYXRhLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUxNiBTU1BfUmVjZWl2ZURhdGEoU1NQX1R5cGVEZWYqIFNTUHgpDQp7DQogIC8qIFJldHVybiB0aGUgZGF0YSBpbiB0aGUgRFIgcmVnaXN0ZXIgKi8JDQogIHJldHVybiBTU1B4LT5EUjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTU1BfTG9vcEJhY2tDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBMb29wIGJhY2sgbW9kZSBmb3IgdGhlIHNlbGVjdGVkIFNTUA0KKiAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBTU1B4OiB3aGVyZSB4IGNhbiBiZSAwIG9yIDEgdG8gc2VsZWN0IHRoZSBTU1AgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIExvb3AgQmFjayBtb2RlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1NQX0xvb3BCYWNrQ29uZmlnKFNTUF9UeXBlRGVmKiBTU1B4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGlmKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSBsb29wIGJhY2sgbW9kZSAqLw0KICAgIFNTUHgtPkNSMSB8PSBTU1BfTG9vcEJhY2tNb2RlX0VuYWJsZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIGxvb3AgYmFjayBtb2RlICovDQogICAgU1NQeC0+Q1IxICY9IFNTUF9Mb29wQmFja01vZGVfRGlzYWJsZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNTUF9OU1NJbnRlcm5hbENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgYnkgc29mdHdhcmUgdGhlIE5TUyBwaW4uDQoqIElucHV0ICAgICAgICAgIDogLSBTU1B4OiB3aGVyZSB4IGNhbiBiZSAwIG9yIDEgdG8gc2VsZWN0IHRoZSBTU1AgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFNTUF9OU1NTdGF0ZTogTlNTIGludGVybmFsIHN0YXRlLlRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUNCiogICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTUF9OU1NJbnRlcm5hbF9TZXQ6IFNldCBOU1MgcGluIGludGVybmFsbHkNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1BfTlNTSW50ZXJuYWxfUmVzZXQ6IFJlc2V0IE5TUyBwaW4gaW50ZXJuYWxseQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTU1BfTlNTSW50ZXJuYWxDb25maWcoU1NQX1R5cGVEZWYqIFNTUHgsIHUxNiBTU1BfTlNTU3RhdGUpDQp7DQogIGlmKFNTUF9OU1NTdGF0ZSA9PSBTU1BfTlNTSW50ZXJuYWxfU2V0KQ0KICB7DQogICAgLyogU2V0IE5TUyBwaW4gaW50ZXJuYWxseSAqLw0KICAgIFNTUHgtPkNSMSB8PSBTU1BfTlNTSW50ZXJuYWxfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFJlc2V0IE5TUyBwaW4gaW50ZXJuYWxseSAqLw0KICAgIFNTUHgtPkNSMSAmPSBTU1BfTlNTSW50ZXJuYWxfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTU1BfR2V0RmxhZ1N0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU1NQIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFNTUHg6IHdoZXJlIHggY2FuIGJlIDAgb3IgMSB0byBzZWxlY3QgdGhlIFNTUCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gU1NQX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gIFRoaXMgcGFyYW1ldGVyIGNhbiANCiogICAgICAgICAgICAgICAgICAgIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1BfRkxBR19CdXN5OiBidXN5IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1BfRkxBR19SeEZpZm9GdWxsOiBSZWNlaXZlIEZJRk8gZnVsbCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQX0ZMQUdfUnhGaWZvTm90RW1wdHk6IFJlY2VpdmUgRklGTyBub3QgZW1wdHkgZmxhZyANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1BfRkxBR19UeEZpZm9Ob3RGdWxsOiBUcmFuc21pdCBGSUZPIG5vdCBmdWxsIGZsYWcgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQX0ZMQUdfVHhGaWZvRW1wdHk6IFRyYW5zbWl0IEZJRk8gZW1wdHkgZmxhZyANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1BfRkxBR19UeEZpZm86IFRyYW5zbWl0IEZJRk8gaGFsZiBlbXB0eSBvciBsZXNzIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1BfRkxBR19SeEZpZm86IFJlY2VpdmUgRklGTyBoYWxmIGZ1bGwgb3IgbGVzcyBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQX0ZMQUdfUnhUaW1lT3V0OiBSZWNlaXZlIHRpbWVvdXQgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTUF9GTEFHX1J4T3ZlcnJ1bjogUmVjZWl2ZSBvdmVycnVuIGZsYWcNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBTU1BfRkxBRyhTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgU1NQX0dldEZsYWdTdGF0dXMoU1NQX1R5cGVEZWYqIFNTUHgsIHUxNiBTU1BfRkxBRykNCnsNCiAgdTMyIFNTUFJlZyA9IDAsIEZsYWdQb3MgPSAwOw0KICB1MzIgU3RhdHVzUmVnID0gMDsNCg0KICAvKiBHZXQgdGhlIFNTUCByZWdpc3RlciBpbmRleCAqLw0KICBTU1BSZWcgPSBTU1BfRkxBRyA+PiA1Ow0KDQogIC8qIEdldCB0aGUgZmxhZyBwb3NpdGlvbiAqLw0KICBGbGFnUG9zID0gU1NQX0ZMQUcgJiBTU1BfRmxhZ19NYXNrOw0KDQogIC8qIEZpbmQgdGhlIHJlZ2lzdGVyIG9mIHRoZSBmbGFnIHRvIGNoZWNrICovDQogIGlmKFNTUFJlZyA9PSAxKSANCiAgew0KICAgIC8qIFRoZSBmbGFnIHRvIGNoZWNrIGlzIGluIFNSIHJlZ2lzdGVyICovDQogICAgU3RhdHVzUmVnID0gU1NQeC0+U1I7ICAJDQogIH0NCiAgZWxzZSBpZiAoU1NQUmVnID09IDIpIA0KICB7DQogICAgLyogVGhlIGZsYWcgdG8gY2hlY2sgaXMgaW4gUklTUiByZWdpc3RlciAqLw0KICAgIFN0YXR1c1JlZyA9IFNTUHgtPlJJU1I7DQogIH0NCiAgDQogIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBTU1AgZmxhZyAqLw0KICBpZigoU3RhdHVzUmVnICYgKDEgPDwgRmxhZ1BvcykpICE9IFJFU0VUKQ0KICB7DQogICAgLyogUmV0dXJuIFNFVCBpZiB0aGUgU1NQIGZsYWcgaXMgc2V0ICovDQogICAgcmV0dXJuIFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBSZXR1cm4gUkVTRVQgaWYgdGhlIFNTUCBmbGFnIGlzIHJlc2V0ICovDQogICAgcmV0dXJuIFJFU0VUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU1NQX0NsZWFyRmxhZw0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgU1NQeJJzIHBlbmRpbmcgZmxhZ3MuDQoqIElucHV0ICAgICAgICAgIDogLSBTU1B4OiB3aGVyZSB4IGNhbiBiZSAwIG9yIDEgdG8gc2VsZWN0IHRoZSBTU1AgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFNTUF9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuICBUaGlzIHBhcmFtZXRlciBjYW4gIA0KKiAgICAgICAgICAgICAgICAgICAgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTUF9GTEFHX1J4VGltZU91dDogUmVjZWl2ZSB0aW1lb3V0IGZsYWcgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQX0ZMQUdfUnhPdmVycnVuOiBSZWNlaXZlIG92ZXJydW4gZmxhZyANCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1NQX0NsZWFyRmxhZyhTU1BfVHlwZURlZiogU1NQeCwgdTE2IFNTUF9GTEFHKQ0KeyANCiAgdTggRmxhZ1BvcyA9IDA7DQoNCiAgLyogR2V0IHRoZSBmbGFnIHBvc2l0aW9uICovDQogIEZsYWdQb3MgPSBTU1BfRkxBRyAmIFNTUF9GbGFnX01hc2s7DQogIA0KICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgU1NQIGZsYWcgKi8gIA0KICBTU1B4LT5JQ1IgPSAoMSA8PCBGbGFnUG9zKTsgIA0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNTUF9HZXRJVFN0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU1NQIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gU1NQeDogd2hlcmUgeCBjYW4gYmUgMCBvciAxIHRvIHNlbGVjdCB0aGUgU1NQIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBTU1BfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4gICANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQX0lUX1R4RmlmbzogVHJhbnNtaXQgRklGTyBoYWxmIGVtcHR5IG9yIGxlc3MgaW50ZXJydXB0IA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTUF9JVF9SeEZpZm86IFJlY2VpdmUgRklGTyBoYWxmIGZ1bGwgb3IgbGVzcyBpbnRlcnJ1cHQgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQX0lUX1J4VGltZU91dDogUmVjZWl2ZSB0aW1lb3V0IGludGVycnVwdCANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1BfSVRfUnhPdmVycnVuOiBSZWNlaXZlIG92ZXJydW4gaW50ZXJydXB0IA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIFNTUF9JVChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIFNTUF9HZXRJVFN0YXR1cyhTU1BfVHlwZURlZiogU1NQeCwgdTE2IFNTUF9JVCkNCnsNCiAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIGludGVycnVwdCBmbGFnICovDQogIGlmKChTU1B4LT5NSVNSICYgU1NQX0lUKSAhPSBSRVNFVCkNCiAgew0KICAgIC8qIFJldHVybiBTRVQgaWYgdGhlIFNTUCBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQgKi8NCiAgICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFJldHVybiBSRVNFVCBpZiBTU1AgaW50ZXJydXB0IGZsYWcgaXMgcmVzZXQgKi8NCiAgICByZXR1cm4gUkVTRVQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTU1BfQ2xlYXJJVFBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIFNTUHiScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU1NQeDogd2hlcmUgeCBjYW4gYmUgMCBvciAxIHRvIHNlbGVjdCB0aGUgU1NQIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBTU1BfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLiAgDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTUF9JVF9SeFRpbWVPdXQ6IFJlY2VpdmUgdGltZW91dCBpbnRlcnJ1cHQgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NQX0lUX1J4T3ZlcnJ1bjogUmVjZWl2ZSBvdmVycnVuIGludGVycnVwdCANCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1NQX0NsZWFySVRQZW5kaW5nQml0KFNTUF9UeXBlRGVmKiBTU1B4LCB1MTYgU1NQX0lUKQ0Kew0KICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgU1NQIGludGVycnVwdHMgcGVuZGluZyBiaXRzICovDQogIFNTUHgtPklDUiA9IFNTUF9JVDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDA2IFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==