LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogNzV4X3B3bS5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDAzLzEwLzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgUFdNIHNvZnR3YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA3LzE3LzIwMDYgOiBWMS4wDQoqIDAzLzEwLzIwMDYgOiBWMC4xDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBUSEUgUFJFU0VOVCBTT0ZUV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUgVElNRS4NCiogQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQoqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HIEZST00gVEhFDQoqIENPTlRFTlQgT0YgU1VDSCBTT0ZUV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUgQ09ESU5HDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICI3NXhfcHdtLmgiDQojaW5jbHVkZSAiNzV4X21yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFBXTSBpbnRlcnJ1cHQgbWFza3MgKi8NCiNkZWZpbmUgUFdNX0lUX0NsZWFyX01hc2sgICAgMHg3RkZGDQojZGVmaW5lIFBXTV9JVF9FbmFibGVfTWFzayAgIDB4RUZGRg0KDQovKiBQV01fQ1IgTWFza3MgYml0ICovDQojZGVmaW5lIFBXTV9Db3VudGVyTW9kZV9NYXNrICAgICAgICAgICAweEZGOEYNCiNkZWZpbmUgUFdNX0RCQVNFX01hc2sgICAgICAgICAgICAgICAgIDB4MDc3Rg0KI2RlZmluZSBQV01fTWFzdGVyTW9kZVNlbGVjdGlvbl9NYXNrICAgMHhGQzdGDQoNCi8qIFBXTSBVcGRhdGUgZmxhZyBzZWxlY3Rpb24gU2V0L1Jlc2V0IHZhbHVlICovDQojZGVmaW5lIFBXTV9VRlNfUmVzZXQgMHhGRkZFDQojZGVmaW5lIFBXTV9VRlNfU2V0ICAgMHgwMDAxDQoNCi8qIFBXTSBDb3VudGVyIHZhbHVlICovDQojZGVmaW5lIFBXTV9DT1VOVEVSX1Jlc2V0ICAweDAwMDINCiNkZWZpbmUgUFdNX0NPVU5URVJfU3RhcnQgIDB4MDAwNA0KI2RlZmluZSBQV01fQ09VTlRFUl9TdG9wICAgMHhGRkZCDQoNCi8qIFBXTSBEZWJ1ZyBNb2RlIFNldC9SZXNldCB2YWx1ZSAqLw0KI2RlZmluZSBQV01fREJHQ19TZXQgICAgMHgwNDAwDQojZGVmaW5lIFBXTV9EQkdDX1Jlc2V0ICAweEZCRkYNCg0KLyogUFdNIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5IFNldC9SZXNldCB2YWx1ZSAqLw0KI2RlZmluZSBQV01fT0MxUF9TZXQgICAgMHgwMDIwDQojZGVmaW5lIFBXTV9PQzFQX1Jlc2V0ICAweEZGREYNCg0KI2RlZmluZSBQV01fT0MxTlBfU2V0ICAgIDB4MDA4MA0KI2RlZmluZSBQV01fT0MxTlBfUmVzZXQgIDB4RkY3Rg0KDQojZGVmaW5lIFBXTV9PQzJQX1NldCAgICAweDIwMDANCiNkZWZpbmUgUFdNX09DMlBfUmVzZXQgIDB4REZGRg0KDQojZGVmaW5lIFBXTV9PQzJOUF9TZXQgICAgMHg4MDAwDQojZGVmaW5lIFBXTV9PQzJOUF9SZXNldCAgMHg3RkZGDQoNCiNkZWZpbmUgUFdNX09DM1BfU2V0ICAgICAweDAwMjANCiNkZWZpbmUgUFdNX09DM1BfUmVzZXQgICAweEZGREYNCg0KI2RlZmluZSBQV01fT0MzTlBfU2V0ICAgIDB4MDA4MA0KI2RlZmluZSBQV01fT0MzTlBfUmVzZXQgIDB4RkY3Rg0KDQovKiBQV00gT3V0cHV0IENvbXBhcmUgY29udHJvbCBtb2RlIGNvbnN0YW50ICovDQojZGVmaW5lIFBXTV9PQ0NvbnRyb2xfUFdNICAgICAgICAgMHgwMDBDDQojZGVmaW5lIFBXTV9PQ0NvbnRyb2xfT0NUb2dnbGUgICAgMHgwMDA2DQojZGVmaW5lIFBXTV9PQ0NvbnRyb2xfT0NJbmFjdGl2ZSAgMHgwMDA0DQojZGVmaW5lIFBXTV9PQ0NvbnRyb2xfT0NBY3RpdmUgICAgMHgwMDAyDQojZGVmaW5lIFBXTV9PQ0NvbnRyb2xfT0NUaW1pbmcgICAgMHgwMDAwDQoNCi8qIFBXTSBPdXRwdXQgQ29tcGFyZSBtb2RlIEVuYWJsZSB2YWx1ZSAqLw0KI2RlZmluZSBQV01fT0MxX0VuYWJsZSAgMHgwMDEwDQojZGVmaW5lIFBXTV9PQzJfRW5hYmxlICAweDEwMDANCiNkZWZpbmUgUFdNX09DM19FbmFibGUgIDB4MDAxMA0KDQojZGVmaW5lIFBXTV9PQzFfRGlzYWJsZSAgMHhGRkVGDQojZGVmaW5lIFBXTV9PQzJfRGlzYWJsZSAgMHhFRkZGDQojZGVmaW5lIFBXTV9PQzNfRGlzYWJsZSAgMHhGRkVGDQoNCiNkZWZpbmUgUFdNX09DMU5fRW5hYmxlICAweDAwNDANCiNkZWZpbmUgUFdNX09DMk5fRW5hYmxlICAweDQwMDANCiNkZWZpbmUgUFdNX09DM05fRW5hYmxlICAweDAwNDANCg0KI2RlZmluZSBQV01fT0MxTl9EaXNhYmxlICAweEZGQkYNCiNkZWZpbmUgUFdNX09DMk5fRGlzYWJsZSAgMHhCRkZGDQojZGVmaW5lIFBXTV9PQzNOX0Rpc2FibGUgIDB4RkZCRg0KDQovKiBQV00gT3V0cHV0IENvbXBhcmUgbW9kZSBNYXNrIHZhbHVlICovDQojZGVmaW5lIFBXTV9PQzFDX01hc2sgIDB4RkZGMQ0KI2RlZmluZSBQV01fT0MyQ19NYXNrICAweEYxRkYNCiNkZWZpbmUgUFdNX09DM0NfTWFzayAgMHhGRkYxDQoNCi8qIFBXTSBQcmVsb2FkIGJpdCBTZXQvUmVzZXQgdmFsdWUgKi8NCiNkZWZpbmUgUFdNX1BMRDFfU2V0ICAgIDB4MDAwMQ0KI2RlZmluZSBQV01fUExEMl9TZXQgICAweDAxMDANCiNkZWZpbmUgUFdNX1BMRDNfU2V0ICAgMHgwMDAxDQoNCi8qIFBXTSBPQ1JNIFNldC9SZXNldCB2YWx1ZSAqLw0KI2RlZmluZSBQV01fT0NNUl9TZXQgICAgMHgwMDgwDQojZGVmaW5lIFBXTV9PQ01SX1Jlc2V0ICAweEZGN0YNCg0KLyogUFdNX0RUUiBiaXQgTWFza3MgdmFsdWUgKi8NCiNkZWZpbmUgUFdNX0RUUl9NYXNrICAgMHhGQzAwDQojZGVmaW5lIFBXTV9MT0NLX01hc2sgIDB4RjNGRg0KDQovKiBQV00gTU9FIFNldCB2YWx1ZSAqLw0KI2RlZmluZSBQV01fTU9FX1NldCAgICAweDgwMDANCiNkZWZpbmUgUFdNX01PRV9SZXNldCAgMHg3RkZGDQoNCi8qIFBXTSBPU1NSIGJpdCBTZXQvUmVzZXQgdmFsdWUgKi8NCiNkZWZpbmUgUFdNX09TU1JfU2V0ICAgIDB4NDAwMA0KI2RlZmluZSBQV01fT1NTUl9SZXNldCAgMHhCRkZGDQoNCi8qIFJlc2V0IFJlZ2lzdGVyIE1hc2tzICovDQojZGVmaW5lIFBXTV9QcmVzY2FsZXJfUmVzZXRfTWFzayAgICAgICAgICAweDAwMDANCiNkZWZpbmUgUFdNX1B1bHNlMV9SZXNldF9NYXNrICAgICAgICAgICAgIDB4MDAwMA0KI2RlZmluZSBQV01fUHVsc2UyX1Jlc2V0X01hc2sgICAgICAgICAgICAgMHgwMDAwDQojZGVmaW5lIFBXTV9QdWxzZTNfUmVzZXRfTWFzayAgICAgICAgICAgICAweDAwMDANCiNkZWZpbmUgUFdNX1BlcmlvZF9SZXNldF9NYXNrICAgICAgICAgICAgIDB4RkZGRg0KI2RlZmluZSBQV01fUmVwZXRpdGlvbkNvdW50ZXJfUmVzZXRfTWFzayAgMHgwMDAwDQojZGVmaW5lIFBXTV9EZWFkVGltZV9SZXNldF9NYXNrICAgICAgICAgICAweDAwMDANCg0KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCnN0YXRpYyB2b2lkIE9DTV9Nb2R1bGVDb25maWcoUFdNX0luaXRUeXBlRGVmKiBQV01fSW5pdFN0cnVjdCk7DQoNCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBQV01fRGVJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRGVpbml0aWFsaXplcyBQV00gcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldA0KKiAgICAgICAgICAgICAgICAgIHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFBXTV9EZUluaXQodm9pZCkNCnsNCiAgLyogRW50ZXJzIGFuZCBleGl0cyB0aGUgUFdNIHBlcmlwaGVyYWwgdG8gYW5kIGZyb20gcmVzZXQgKi8NCiAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfUFdNLEVOQUJMRSk7DQogIE1SQ0NfUGVyaXBoZXJhbFNXUmVzZXRDb25maWcoTVJDQ19QZXJpcGhlcmFsX1BXTSxESVNBQkxFKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBQV01fSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBQV00gcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFBXTV9Jbml0U3RydWN0IC4NCiogSW5wdXQgICAgICAgICAgOiBQV01fSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFBXTV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KKiAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUFdNIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFBXTV9Jbml0KFBXTV9Jbml0VHlwZURlZiogUFdNX0luaXRTdHJ1Y3QpDQp7DQogIC8qIFNldHMgdGhlIHByZXNjYWxlciB2YWx1ZSAqLw0KICBQV00tPlBTQyA9IFBXTV9Jbml0U3RydWN0LT5QV01fUHJlc2NhbGVyOw0KDQogIC8qIFNlbGVjdHMgdGhlIGNvdW50ZXIgbW9kZSAqLw0KICBQV00tPkNSICY9IFBXTV9Db3VudGVyTW9kZV9NYXNrOw0KICBQV00tPkNSIHw9IFBXTV9Jbml0U3RydWN0LT5QV01fQ291bnRlck1vZGU7DQoNCiAgLyogU2V0cyB0aGUgcGVyaW9kIHZhbHVlICovDQogIFBXTS0+QVJSID0gUFdNX0luaXRTdHJ1Y3QtPlBXTV9QZXJpb2Q7DQogIA0KICAvKiBTZXRzIHRoZSByZXBldGl0aW9uIGNvdW50ZXIgKi8NCiAgUFdNLT5SQ1IgJj0gUFdNX1JlcGV0aXRpb25Db3VudGVyX1Jlc2V0X01hc2s7DQogIFBXTS0+UkNSIHw9IFBXTV9Jbml0U3RydWN0LT5QV01fUmVwZXRpdGlvbkNvdW50ZXI7DQogIA0KICAvKiBDb25maWd1cmVzIHRoZSBQV00gYWNjb3JkaW5nIHRvIHRoZSBQV01fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHBhcmFtZXRlcnMgKi8NCiAgT0NNX01vZHVsZUNvbmZpZyhQV01fSW5pdFN0cnVjdCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUFdNX1N0cnVjdEluaXQNCiogRGVzY3JpcHRpb24gICAgOiBGaWxscyBlYWNoIFBXTV9Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IFBXTV9Jbml0U3RydWN0IDogcG9pbnRlciB0byBhIFBXTV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2gNCiogICAgICAgICAgICAgICAgICB3aWxsIGJlIGluaXRpYWxpemVkLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUgICAgICAgICAgICAgICAgICAgICAgICANCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUFdNX1N0cnVjdEluaXQoUFdNX0luaXRUeXBlRGVmICpQV01fSW5pdFN0cnVjdCkNCnsNCiAgLyogU2V0cyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovDQogIFBXTV9Jbml0U3RydWN0LT5QV01fTW9kZSA9IFBXTV9Nb2RlX09DVGltaW5nOw0KICBQV01fSW5pdFN0cnVjdC0+UFdNX1ByZXNjYWxlciA9IFBXTV9QcmVzY2FsZXJfUmVzZXRfTWFzazsNCiAgUFdNX0luaXRTdHJ1Y3QtPlBXTV9Db3VudGVyTW9kZSA9IFBXTV9Db3VudGVyTW9kZV9VcDsNCiAgUFdNX0luaXRTdHJ1Y3QtPlBXTV9QZXJpb2QgPSBQV01fUGVyaW9kX1Jlc2V0X01hc2s7DQogIFBXTV9Jbml0U3RydWN0LT5QV01fQ29tcGxlbWVudGFyeSA9IFBXTV9Db21wbGVtZW50YXJ5X0Rpc2FibGU7DQogIFBXTV9Jbml0U3RydWN0LT5QV01fT0NTdGF0ZSA9IFBXTV9PQ1N0YXRlX0Rpc2FibGU7DQogIFBXTV9Jbml0U3RydWN0LT5QV01fT0NOU3RhdGUgPSBQV01fT0NOU3RhdGVfRGlzYWJsZTsNCiAgUFdNX0luaXRTdHJ1Y3QtPlBXTV9DaGFubmVsID0gUFdNX0NoYW5uZWxfMTsNCiAgUFdNX0luaXRTdHJ1Y3QtPlBXTV9QdWxzZTEgPSBQV01fUHVsc2UxX1Jlc2V0X01hc2s7DQogIFBXTV9Jbml0U3RydWN0LT5QV01fUHVsc2UyID0gUFdNX1B1bHNlMl9SZXNldF9NYXNrOw0KICBQV01fSW5pdFN0cnVjdC0+UFdNX1B1bHNlMyA9IFBXTV9QdWxzZTNfUmVzZXRfTWFzazsNCiAgUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTEgPSBQV01fUG9sYXJpdHkxX0hpZ2g7DQogIFBXTV9Jbml0U3RydWN0LT5QV01fUG9sYXJpdHkyID0gUFdNX1BvbGFyaXR5Ml9IaWdoOw0KICBQV01fSW5pdFN0cnVjdC0+UFdNX1BvbGFyaXR5MyA9IFBXTV9Qb2xhcml0eTNfSGlnaDsNCiAgUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTFOID0gUFdNX1BvbGFyaXR5MU5fSGlnaDsNCiAgUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTJOID0gUFdNX1BvbGFyaXR5Mk5fSGlnaDsNCiAgUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTNOID0gUFdNX1BvbGFyaXR5M05fSGlnaDsNCiAgUFdNX0luaXRTdHJ1Y3QtPlBXTV9EVFJBY2Nlc3MgPSBQV01fRFRSQWNjZXNzX0Rpc2FibGU7DQogIFBXTV9Jbml0U3RydWN0LT5QV01fRGVhZFRpbWUgPSBQV01fRGVhZFRpbWVfUmVzZXRfTWFzazsNCiAgUFdNX0luaXRTdHJ1Y3QtPlBXTV9FbWVyZ2VuY3kgPSBQV01fRW1lcmdlbmN5X0Rpc2FibGU7DQogIFBXTV9Jbml0U3RydWN0LT5QV01fTE9DS0xldmVsID0gUFdNX0xPQ0tMZXZlbF9PRkY7DQogIFBXTV9Jbml0U3RydWN0LT5QV01fT1NTSVN0YXRlID0gUFdNX09TU0lTdGF0ZV9EaXNhYmxlOw0KICBQV01fSW5pdFN0cnVjdC0+UFdNX1JlcGV0aXRpb25Db3VudGVyID0gUFdNX1JlcGV0aXRpb25Db3VudGVyX1Jlc2V0X01hc2s7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUFdNX0NtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFBXTSBwZXJpcGhlcmFsLg0KKiBJbnB1dCAgICAgICAgICA6IE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFBXTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFBXTV9DbWQoRnVuY3Rpb25hbFN0YXRlIE5ld3N0YXRlKQ0Kew0KIGlmKE5ld3N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIFBXTS0+Q1IgfD0gUFdNX0NPVU5URVJfU3RhcnQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgUFdNLT5DUiAmPSBQV01fQ09VTlRFUl9TdG9wOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUFdNX0N0cmxQV01PdXRwdXRzDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyBQV00gcGVyaXBoZXJhbCBNYWluIE91dHB1dHMuDQoqIElucHV0ICAgICAgICAgIDogTmV3c3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgUFdNIHBlcmlwaGVyYWwgTWFpbiBPdXRwdXRzLiANCiogICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBQV01fQ3RybFBXTU91dHB1dHMoRnVuY3Rpb25hbFN0YXRlIE5ld3N0YXRlKQ0Kew0KIGlmKE5ld3N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIFBXTS0+RFRSIHw9IFBXTV9NT0VfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIFBXTS0+RFRSICY9IFBXTV9NT0VfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBQV01fSVRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBQV00gaW50ZXJydXB0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIFBXTV9JVDogc3BlY2lmaWVzIHRoZSBQV00gaW50ZXJydXB0cyBzb3VyY2VzIHRvIGJlIGVuYWJsZWQNCiogICAgICAgICAgICAgICAgICAgIG9yIGRpc2FibGVkLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fSVRfT0MxOiBQV00gT3V0cHV0IENvbXBhcmUgMSBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0lUX09DMjogUFdNIE91dHB1dCBDb21wYXJlIDIgSW50ZXJydXB0IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9JVF9PQzM6IFBXTSBPdXRwdXQgQ29tcGFyZSAzIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fSVRfVXBkYXRlOiBQV00gdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fSVRfRW1lcmdlbmN5OiBQV00gRW1lcmdlbmN5IGludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fSVRfR2xvYmFsVXBkYXRlOiBQV00gZ2xvYmFsIHVwZGF0ZSBJbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAtIE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgUFdNIGludGVycnVwdHMuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBQV01fSVRDb25maWcodTE2IFBXTV9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld3N0YXRlKQ0KeyANCiAgdTE2IFBXTV9JVF9FbmFibGUgPSAwOw0KDQogIFBXTV9JVF9FbmFibGUgPSBQV01fSVQgJiBQV01fSVRfRW5hYmxlX01hc2s7DQoNCiAgaWYoTmV3c3RhdGUgPT0gRU5BQkxFKQ0KICB7DQogICAgLyogVXBkYXRlIGludGVycnVwdCBnbG9iYWwgc291cmNlOiBvdmVyZmxvdy91bmRlZmxvdywgY291bnRlciByZXNldCBvcGVyYXRpb24NCiAgICBvciBzbGF2ZSBtb2RlIGNvbnRyb2xsZXIgaW4gcmVzZXQgbW9kZSAqLw0KICAgIGlmICgoUFdNX0lUICYgUFdNX0lUX0dsb2JhbFVwZGF0ZSkgPT0gUFdNX0lUX0dsb2JhbFVwZGF0ZSkNCiAgICB7DQogICAgICBQV00tPkNSICY9IFBXTV9VRlNfUmVzZXQ7DQogICAgfQ0KICAgIC8qIFVwZGF0ZSBpbnRlcnJ1cHQgc291cmNlOiBjb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdyAqLw0KICAgIGVsc2UgaWYgKChQV01fSVQgJiBQV01fSVRfVXBkYXRlKSA9PSBQV01fSVRfVXBkYXRlKQ0KICAgIHsNCiAgICAgIFBXTS0+Q1IgfD0gUFdNX1VGU19TZXQ7DQogICAgfQ0KICAgIC8qIFNlbGVjdCBhbmQgZW5hYmxlIHRoZSBpbnRlcnJ1cHRzIHJlcXVlc3RzICovDQogICAgUFdNLT5SU1IgfD0gUFdNX0lUX0VuYWJsZTsNCiAgICBQV00tPlJFUiB8PSBQV01fSVRfRW5hYmxlOw0KICB9DQogIC8qIERpc2FibGUgdGhlIGludGVycnVwdHMgcmVxdWVzdHMgKi8NCiAgZWxzZQ0KICB7DQogICAgUFdNLT5SU1IgJj0gflBXTV9JVF9FbmFibGU7DQogICAgUFdNLT5SRVIgJj0gflBXTV9JVF9FbmFibGU7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBQV01fRE1BQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgUFdNknMgRE1BIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFBXTV9ETUFTb3VyY2VzOiBzcGVjaWZpZXMgdGhlIERNQSBSZXF1ZXN0IHNvdXJjZXMuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9ETUFTb3VyY2VfT0MxOiBQV00gT3V0cHV0IENvbXBhcmUgMSBETUEgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0RNQVNvdXJjZV9PQzI6IFBXTSBPdXRwdXQgQ29tcGFyZSAyIERNQSBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fRE1BU291cmNlX09DMzogUFdNIE91dHB1dCBDb21wYXJlIDMgRE1BIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9ETUFTb3VyY2VfVXBkYXRlOiBQV00gVXBkYXRlIERNQSBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAtIFBXTV9PQ1JNU3RhdGU6IHRoZSBzdGF0ZSBvZiBvdXRwdXQgY29tcGFyZSByZXF1ZXN0IG1vZGUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9PQ1JNU3RhdGVfRW5hYmxlIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9PQ1JNU3RhdGVfRGlzYWJsZSANCiogICAgICAgICAgICAgICAgICAtIFBXTV9ETUFCYXNlOkRNQSBCYXNlIGFkZHJlc3MuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgUFdNX0RNQUJhc2VfQ1IsIFBXTV9ETUFCYXNlX1NDUiwgUFdNX0RNQUJhc2VfT01SMSwgDQoqICAgICAgICAgICAgICAgICAgICBQV01fRE1BQmFzZV9PTVIyLCBQV01fRE1BQmFzZV9SU1IsIFBXTV9ETUFCYXNlX1JFUiwgDQoqICAgICAgICAgICAgICAgICAgICBQV01fRE1BQmFzZV9JU1IsIFBXTV9ETUFCYXNlX0NOVCwgUFdNX0RNQUJhc2VfUFNDLA0KKiAgICAgICAgICAgICAgICAgICAgUFdNX0RNQUJhc2VfUkNSLCBQV01fRE1BQmFzZV9BUlIsIFBXTV9ETUFCYXNlX09DUjEsDQoqICAgICAgICAgICAgICAgICAgICBQV01fRE1BQmFzZV9PQ1IyLCBQV01fRE1BQmFzZV9PQ1IzICxQV01fRE1BQmFzZV9EVFIuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFBXTV9ETUFDb25maWcodTE2IFBXTV9ETUFTb3VyY2VzLCB1MTYgUFdNX09DUk1TdGF0ZSwgdTE2IFBXTV9ETUFCYXNlKQ0Kew0KICAvKiBTZWxlY3QgdGhlIERNQSByZXF1ZXN0cyAqLw0KICBQV00tPlJTUiAmPSB+UFdNX0RNQVNvdXJjZXM7DQogIA0KICAvKiBTZXRzIHRoZSBPQ1JNIHN0YXRlICovDQogIGlmKFBXTV9PQ1JNU3RhdGUgPT0gUFdNX09DUk1TdGF0ZV9FbmFibGUpDQogIHsNCiAgICBQV00tPlJTUiB8PSBQV01fT0NNUl9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgUFdNLT5SU1IgJj0gUFdNX09DTVJfUmVzZXQ7DQogIH0NCg0KICAvKiBTZXRzIHRoZSBETUEgQmFzZSBhZGRyZXNzICovDQogIFBXTS0+Q1IgJj0gUFdNX0RCQVNFX01hc2s7DQogIFBXTS0+Q1IgfD0gUFdNX0RNQUJhc2U7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUFdNX0RNQUNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFBXTZJzIERNQSBpbnRlcmZhY2UuDQoqIElucHV0ICAgICAgICAgIDogLSBQV01fRE1BU291cmNlczogc3BlY2lmaWVzIHRoZSBETUEgUmVxdWVzdCBzb3VyY2VzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fRE1BU291cmNlX09DMTogUFdNIE91dHB1dCBDb21wYXJlIDEgRE1BIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9ETUFTb3VyY2VfT0MyOiBQV00gT3V0cHV0IENvbXBhcmUgMiBETUEgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0RNQVNvdXJjZV9PQzM6IFBXTSBPdXRwdXQgQ29tcGFyZSAzIERNQSBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fRE1BU291cmNlX1VwZGF0ZTogUFdNIFVwZGF0ZSBETUEgc291cmNlDQoqICAgICAgICAgICAgICAgICAgLSBOZXdzdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBETUEgUmVxdWVzdCBzb3VyY2VzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUFdNX0RNQUNtZCh1MTYgUFdNX0RNQVNvdXJjZXMsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdzdGF0ZSkNCnsNCiAgaWYoTmV3c3RhdGUgPT0gRU5BQkxFKQ0KICB7DQogICAgUFdNLT5SRVIgfD0gUFdNX0RNQVNvdXJjZXM7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgUFdNLT5SRVIgJj0gflBXTV9ETUFTb3VyY2VzOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUFdNX1NldFByZXNjYWxlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFBXTSBwcmVzY2FsZXIgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogUHJlc2NhbGVyOiBQV00gcHJlc2NhbGVyIG5ldyB2YWx1ZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUFdNX1NldFByZXNjYWxlcih1MTYgUHJlc2NhbGVyKQ0Kew0KICBQV00tPlBTQyA9IFByZXNjYWxlcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBQV01fU2V0UGVyaW9kDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgUFdNIHBlcmlvZCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBQZXJpb2Q6IFBXTSBwZXJpb2QgbmV3IHZhbHVlLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBQV01fU2V0UGVyaW9kKHUxNiBQZXJpb2QpDQp7DQogIFBXTS0+QVJSID0gUGVyaW9kOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFBXTV9TZXRQdWxzZQ0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFBXTSBwdWxzZSB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFBXTV9DaGFubmVsOiBzcGVjaWZpZXMgdGhlIFBXTSBjaGFubmVsIHRvIGJlIHVzZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9DaGFubmVsXzE6IFBXTSBDaGFubmVsIDEgaXMgdXNlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9DaGFubmVsXzI6IFBXTSBDaGFubmVsIDIgaXMgdXNlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9DaGFubmVsXzM6IFBXTSBDaGFubmVsIDMgaXMgdXNlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9DaGFubmVsX0FMTDogUFdNIENoYW5uZWwgMSwgQ2hhbm5lbCAyIGFuZCAzIGFyZSB1c2VkDQoqICAgICAgICAgICAgICAgICAgLSBQdWxzZTogUFdNIHB1bHNlIG5ldyB2YWx1ZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUFdNX1NldFB1bHNlKHUxNiBQV01fQ2hhbm5lbCwgdTE2IFB1bHNlKQ0Kew0KICAvKiBTZXRzIENoYW5uZWwgMSBwdWxzZSB2YWx1ZSAqLw0KICBpZihQV01fQ2hhbm5lbCA9PSBQV01fQ2hhbm5lbF8xKQ0KICB7DQogICAgUFdNLT5PQ1IxID0gUHVsc2U7DQogIH0NCiAgLyogU2V0cyBDaGFubmVsIDIgcHVsc2UgdmFsdWUgKi8NCiAgZWxzZSBpZihQV01fQ2hhbm5lbCA9PSBQV01fQ2hhbm5lbF8yKQ0KICB7DQogICAgUFdNLT5PQ1IyID0gUHVsc2U7DQogIH0NCiAgLyogU2V0cyBDaGFubmVsIDMgcHVsc2UgdmFsdWUgKi8NCiAgZWxzZSBpZihQV01fQ2hhbm5lbCA9PSBQV01fQ2hhbm5lbF8zKQ0KICB7DQogICAgUFdNLT5PQ1IzID0gUHVsc2U7DQogIH0NCiAgLyogU2V0cyBDaGFubmVsIDEsIENoYW5uZWwgMiBhbmQgQ2hhbm5lbCAzIHB1bHNlIHZhbHVlcyAqLw0KICBlbHNlIGlmKFBXTV9DaGFubmVsID09IFBXTV9DaGFubmVsX0FMTCkNCiAgew0KICAgIFBXTS0+T0NSMSA9IFB1bHNlOw0KICAgIFBXTS0+T0NSMiA9IFB1bHNlOw0KICAgIFBXTS0+T0NSMyA9IFB1bHNlOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUFdNX1NldFB1bHNlMQ0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFBXTSBDaGFubmVsIDEgcHVsc2UgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogLSBQdWxzZTogUFdNIENoYW5uZWwgMSBwdWxzZSBuZXcgdmFsdWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFBXTV9TZXRQdWxzZTEodTE2IFB1bHNlKQ0Kew0KICBQV00tPk9DUjEgPSBQdWxzZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBQV01fU2V0UHVsc2UyDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgUFdNIENoYW5uZWwgMiBwdWxzZSB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFB1bHNlOiBQV00gQ2hhbm5lbCAyIHB1bHNlIG5ldyB2YWx1ZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUFdNX1NldFB1bHNlMih1MTYgUHVsc2UpDQp7DQogIFBXTS0+T0NSMiA9IFB1bHNlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFBXTV9TZXRQdWxzZTMNCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBQV00gQ2hhbm5lbCAzIHB1bHNlIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gUHVsc2U6IFBXTSBDaGFubmVsIDMgcHVsc2UgbmV3IHZhbHVlLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBQV01fU2V0UHVsc2UzKHUxNiBQdWxzZSkNCnsNCiAgUFdNLT5PQ1IzID0gUHVsc2U7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUFdNX0RlYnVnQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyBQV00gcGVyaXBoZXJhbCBEZWJ1ZyBjb250cm9sLg0KKiBJbnB1dCAgICAgICAgICA6IE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFBXTSBEZWJ1ZyBjb250cm9sLg0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFBXTV9EZWJ1Z0NtZChGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogIGlmKE5ld3N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIFBXTS0+Q1IgfD0gUFdNX0RCR0NfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIFBXTS0+Q1IgJj0gUFdNX0RCR0NfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBQV01fQ291bnRlck1vZGVDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBTcGVjaWZpZXMgdGhlIENvdW50ZXIgTW9kZSB0byBiZSB1c2VkLg0KKiBJbnB1dCAgICAgICAgICA6IFBXTV9Db3VudGVyTW9kZTogc3BlY2lmaWVzIHRoZSBDb3VudGVyIE1vZGUgdG8gYmUgdXNlZA0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0NvdW50ZXJNb2RlX1VwOiBQV00gVXAgQ291bnRpbmcgTW9kZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9Db3VudGVyTW9kZV9Eb3duOiBQV00gRG93biBDb3VudGluZyBNb2RlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQxOiBQV00gQ2VudGVyIEFsaWduZWQxIE1vZGUNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fQ291bnRlck1vZGVfQ2VudGVyQWxpZ25lZDI6IFBXTSBDZW50ZXIgQWxpZ25lZDIgTW9kZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9Db3VudGVyTW9kZV9DZW50ZXJBbGlnbmVkMzogUFdNIENlbnRlciBBbGlnbmVkMyBNb2RlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFBXTV9Db3VudGVyTW9kZUNvbmZpZyh1MTYgUFdNX0NvdW50ZXJNb2RlKQ0Kew0KICAvKiBDb3VudGVyIG1vZGUgY29uZmlndXJhdGlvbiAqLw0KICBQV00tPkNSICY9IFBXTV9Db3VudGVyTW9kZV9NYXNrOw0KICBQV00tPkNSIHw9IFBXTV9Db3VudGVyTW9kZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBQV01fRm9yY2VkT0NDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBGb3JjZXMgdGhlIFBXTSBvdXRwdXQgd2F2ZWZvcm0gdG8gYWN0aXZlIG9yIGluYWN0aXZlIGxldmVsLg0KKiBJbnB1dCAgICAgICAgICA6IC0gUFdNX0NoYW5uZWw6IHNwZWNpZmllcyB0aGUgUFdNIGNoYW5uZWwgdG8gYmUgdXNlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0NoYW5uZWxfMTogUFdNIENoYW5uZWwgMSBpcyB1c2VkDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0NoYW5uZWxfMjogUFdNIENoYW5uZWwgMiBpcyB1c2VkDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0NoYW5uZWxfMzogUFdNIENoYW5uZWwgMyBpcyB1c2VkDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0NoYW5uZWxfQUxMOiBQV00gQ2hhbm5lbCAxLCBDaGFubmVsIDIgYW5kIDMgYXJlIHVzZWQNCiogICAgICAgICAgICAgICAgICAtIFBXTV9Gb3JjZWRBY3Rpb246IHNwZWNpZmllcyB0aGUgZm9yY2VkIEFjdGlvbiB0byBiZSBzZXQgdG8gdGhlDQoqICAgICAgICAgICAgICAgICAgICBvdXRwdXQgd2F2ZWZvcm0uDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9Gb3JjZWRBY3Rpb25fQWN0aXZlOiBGb3JjZSBhY3RpdmUgbGV2ZWwgb24gT0N4UkVGDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZTogRm9yY2UgaW5hY3RpdmUgbGV2ZWwgb24gDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgT0N4UkVGDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFBXTV9Gb3JjZWRPQ0NvbmZpZyh1MTYgUFdNX0NoYW5uZWwsIHUxNiBQV01fRm9yY2VkQWN0aW9uKQ0Kew0KICAvKiBDaGFubmVsIDEgRm9yY2VkIE91dHB1dCBDb21wYXJlIG1vZGUgY29uZmlndXJhdGlvbiAqLw0KICBpZihQV01fQ2hhbm5lbCA9PSBQV01fQ2hhbm5lbF8xKQ0KICB7DQogICAgUFdNLT5PTVIxICY9IFBXTV9PQzFDX01hc2s7DQogICAgUFdNLT5PTVIxIHw9IFBXTV9Gb3JjZWRBY3Rpb247DQogIH0NCiAgLyogQ2hhbm5lbCAyIEZvcmNlZCBPdXRwdXQgQ29tcGFyZSBtb2RlIGNvbmZpZ3VyYXRpb24gKi8NCiAgZWxzZQ0KICB7DQogICAgaWYoUFdNX0NoYW5uZWwgPT0gUFdNX0NoYW5uZWxfMikNCiAgICB7DQogICAgICBQV00tPk9NUjEgJj0gUFdNX09DMkNfTWFzazsNCiAgICAgIFBXTS0+T01SMSB8PSAoUFdNX0ZvcmNlZEFjdGlvbjw8OCk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAvKiBDaGFubmVsIDMgRm9yY2VkIE91dHB1dCBDb21wYXJlIG1vZGUgY29uZmlndXJhdGlvbiAqLw0KICAgICAgaWYoUFdNX0NoYW5uZWwgPT0gUFdNX0NoYW5uZWxfMykNCiAgICAgIHsNCiAgICAgICAgUFdNLT5PTVIyICY9IFBXTV9PQzNDX01hc2s7DQogICAgICAgIFBXTS0+T01SMiB8PSBQV01fRm9yY2VkQWN0aW9uOw0KICAgICAgfQ0KICAgICAgLyogQ2hhbm5lbCAxLCBDaGFubmVsIDIgYW5kIENoYW5uZWwgMyBGb3JjZWQgT3V0cHV0IENvbXBhcmUgbW9kZSANCiAgICAgIGNvbmZpZ3VyYXRpb24gKi8NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgUFdNLT5PTVIxICY9IFBXTV9PQzFDX01hc2s7DQogICAgICAgIFBXTS0+T01SMSB8PSBQV01fRm9yY2VkQWN0aW9uOw0KDQogICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MyQ19NYXNrOw0KICAgICAgICBQV00tPk9NUjEgfD0gKFBXTV9Gb3JjZWRBY3Rpb248PDgpOw0KICAgICAgICANCiAgICAgICAgUFdNLT5PTVIyICY9IFBXTV9PQzNDX01hc2s7DQogICAgICAgIFBXTS0+T01SMiB8PSBQV01fRm9yY2VkQWN0aW9uOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFBXTV9TZXREZWFkVGltZQ0KKiBEZXNjcmlwdGlvbiAgICA6IEluc2VydHMgZGVhZCB0aW1lIGJldHdlZW4gdGhlIE9DeCBhbmQgT0NOeC4NCiogSW5wdXQgICAgICAgICAgOiBEZWFkVGltZTogUFdNIERlYWQgVGltZSB2YWx1ZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUFdNX1NldERlYWRUaW1lKHUxNiBEZWFkVGltZSkNCnsNCiAgLyogU2V0cyB0aGUgZGVhZCB0aW1lIHZhbHVlICovDQogIFBXTS0+RFRSICY9IFBXTV9EVFJfTWFzazsNCiAgUFdNLT5EVFIgfD0gRGVhZFRpbWU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUFdNX1Jlc2V0Q291bnRlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFJlLWludGlhbGl6ZXMgdGhlIFBXTSBjb3VudGVyIGFuZCBnZW5lcmF0ZXMgYW4gdXBkYXRlIG9mIHRoZQ0KKiAgICAgICAgICAgICAgICAgIHJlZ2lzdGVycy4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFBXTV9SZXNldENvdW50ZXIodm9pZCkNCnsNCiAgLyogUmVzZXRzIHRoZSBQV00gY291bnRlciAqLw0KICBQV00tPkNSIHw9IFBXTV9DT1VOVEVSX1Jlc2V0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFBXTV9UUkdPU2VsZWN0aW9uDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgUFdNIE1hc3RlciBNb2RlIHNlbGVjdGlvbiBiaXRzLg0KKiBJbnB1dCAgICAgICAgICA6IFBXTV9UUkdPTW9kZTogc3BlY2lmaWVzIHRoZSBUUkdPIHNvdXJjZS4NCiogICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9UUkdPTW9kZV9FbmFibGU6IFRoZSBDTlRfRU4gYml0IGlzIHVzZWQgYXMgVFJHTw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9UUkdPTW9kZV9VcGRhdGU6IFRoZSBVcGRhdGUgZXZlbnQgaXMgdXNlZCBhcyBUUkdPDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX1RSR09Nb2RlX1Jlc2V0OiBUaGUgQ05UX1JTVCBiaXQgaXMgdXNlZCBhcyBUUkdPDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX1RSR09Nb2RlX09DOiBUaGUgT0MxIHNpZ25hbCBpcyB1c2VkIGFzIFRSR08NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUFdNX1RSR09TZWxlY3Rpb24odTE2IFBXTV9UUkdPTW9kZSkNCnsNCiAgLyogU2V0cyB0aGUgc3luY2hyb25pemF0aW9uIGFjdGlvbiAqLw0KICBQV00tPkNSICY9IFBXTV9NYXN0ZXJNb2RlU2VsZWN0aW9uX01hc2s7DQogIFBXTS0+Q1IgfD0gUFdNX1RSR09Nb2RlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFBXTV9HZXRGbGFnU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBQV00gZmxhZyBpcyBzZXQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IFBXTV9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQoqICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fRkxBR19PQzE6IE91dHB1dCBDb21wYXJlIDEgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9GTEFHX09DMjogT3V0cHV0IENvbXBhcmUgMiBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0ZMQUdfT0MzOiBPdXRwdXQgQ29tcGFyZSAzIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fRkxBR19VcGRhdGU6IFBXTSB1cGRhdGUgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9GTEFHX0VtZXJnZW5jeTogUFdNIEVtZXJnZW5jeSBGbGFnDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgdGhlIFBXTV9GTEFHKFNFVCBvciBSRVNFVCkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KRmxhZ1N0YXR1cyBQV01fR2V0RmxhZ1N0YXR1cyh1MTYgUFdNX0ZMQUcpDQp7DQogIGlmKChQV00tPklTUiAmIFBXTV9GTEFHKSAhPSBSRVNFVCApDQogIHsNCiAgICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJldHVybiBSRVNFVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFBXTV9DbGVhckZsYWcNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIFBXTZJzIHBlbmRpbmcgZmxhZ3MuIA0KKiBJbnB1dCAgICAgICAgICA6IFBXTV9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuIA0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0ZMQUdfT0MxOiBPdXRwdXQgQ29tcGFyZSAxIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fRkxBR19PQzI6IE91dHB1dCBDb21wYXJlIDIgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9GTEFHX09DMzogT3V0cHV0IENvbXBhcmUgMyBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0ZMQUdfVXBkYXRlOiBQV00gdXBkYXRlIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fRkxBR19FbWVyZ2VuY3k6IFBXTSBFbWVyZ2VuY3kgZmxhZw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBQV01fQ2xlYXJGbGFnKHUxNiBQV01fRkxBRykNCnsNCiAgLyogQ2xlYXJzIHRoZSBmbGFncyAqLw0KICBQV00tPklTUiAmPSB+UFdNX0ZMQUc7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUFdNX0dldElUU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIFBXTSBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiBQV01fSVQ6IHNwZWNpZmllcyB0aGUgUFdNIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suIA0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0lUX09DMTogUFdNIE91dHB1dCBDb21wYXJlIDEgSW50ZXJydXB0IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9JVF9PQzI6IFBXTSBPdXRwdXQgQ29tcGFyZSAyIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fSVRfT0MzOiBQV00gT3V0cHV0IENvbXBhcmUgMyBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0lUX1VwZGF0ZTogUFdNIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0lUX0VtZXJnZW5jeTogUFdNIEVtZXJnZW5jeSBpbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0lUX0dsb2JhbFVwZGF0ZTogUFdNIGdsb2JhbCB1cGRhdGUgSW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgdGhlIFBXTV9JVChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIFBXTV9HZXRJVFN0YXR1cyh1MTYgUFdNX0lUKQ0Kew0KICB1MTYgUFdNX0lUX0NoZWNrID0gMDsNCg0KICAvKiBDYWxjdWxhdGVzIHRoZSBwZW5kaW5nIGJpdHMgdG8gYmUgY2hlY2tlZCAqLw0KICBQV01fSVRfQ2hlY2sgPSBQV01fSVQgJiBQV01fSVRfQ2xlYXJfTWFzazsNCiAgDQogIGlmKChQV00tPklTUiAmIFBXTV9JVF9DaGVjaykgIT0gUkVTRVQgKQ0KICB7DQogICAgcmV0dXJuIFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICByZXR1cm4gUkVTRVQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBQV01fQ2xlYXJJVFBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIFBXTSdzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQoqIElucHV0ICAgICAgICAgIDogUFdNX0lUOiBzcGVjaWZpZXMgdGhlIHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0lUX09DMTogUFdNIE91dHB1dCBDb21wYXJlIDEgSW50ZXJydXB0IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFBXTV9JVF9PQzI6IFBXTSBPdXRwdXQgQ29tcGFyZSAyIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBQV01fSVRfT0MzOiBQV00gT3V0cHV0IENvbXBhcmUgMyBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0lUX1VwZGF0ZTogUFdNIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0lUX0VtZXJnZW5jeTogUFdNIEVtZXJnZW5jeSBpbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gUFdNX0lUX0dsb2JhbFVwZGF0ZTogUFdNIGdsb2JhbCB1cGRhdGUgSW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFBXTV9DbGVhcklUUGVuZGluZ0JpdCh1MTYgUFdNX0lUKQ0Kew0KICB1MTYgUFdNX0lUX0NsZWFyID0gMDsNCg0KICAvKiBDYWxjdWxhdGVzIHRoZSBwZW5kaW5nIGJpdHMgdG8gYmUgY2xlYXJlZCAqLw0KICBQV01fSVRfQ2xlYXIgPSBQV01fSVQgJiBQV01fSVRfQ2xlYXJfTWFzazsNCg0KICAvKiBDbGVhcnMgdGhlIHBlbmRpbmcgYml0cyAqLw0KICBQV00tPklTUiAmPSB+UFdNX0lUX0NsZWFyOw0KICANCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBPQ01fTW9kdWxlQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogT3V0cHV0IENvbXBhcmUgTW9kdWxlIGNvbmZpZ3VyYXRpb24uDQoqIElucHV0ICAgICAgICAgIDogUFdNX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBQV01fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCiogICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFBXTSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHZvaWQgT0NNX01vZHVsZUNvbmZpZyhQV01fSW5pdFR5cGVEZWYqIFBXTV9Jbml0U3RydWN0KQ0Kew0KICB1MTYgUFdNX09DQ29udHJvbCA9IDB4MDAwMDsNCiAgdTE2IERUUl9SRUcgPSAweDAwMDA7DQogICAgDQogIGlmKFBXTV9Jbml0U3RydWN0LT5QV01fTW9kZSA9PSBQV01fTW9kZV9PQ1RpbWluZykNCiAgew0KICAgIFBXTV9PQ0NvbnRyb2wgPSBQV01fT0NDb250cm9sX09DVGltaW5nOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGlmKFBXTV9Jbml0U3RydWN0LT5QV01fTW9kZSA9PSBQV01fTW9kZV9PQ0FjdGl2ZSkNCiAgICB7DQogICAgICBQV01fT0NDb250cm9sID0gUFdNX09DQ29udHJvbF9PQ0FjdGl2ZTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIGlmKFBXTV9Jbml0U3RydWN0LT5QV01fTW9kZSA9PSBQV01fTW9kZV9PQ0luYWN0aXZlKQ0KICAgICAgew0KICAgICAgICBQV01fT0NDb250cm9sID0gUFdNX09DQ29udHJvbF9PQ0luYWN0aXZlOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBpZihQV01fSW5pdFN0cnVjdC0+UFdNX01vZGUgPT0gUFdNX01vZGVfT0NUb2dnbGUpDQogICAgICAgIHsNCiAgICAgICAgICBQV01fT0NDb250cm9sID0gUFdNX09DQ29udHJvbF9PQ1RvZ2dsZTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICBQV01fT0NDb250cm9sID0gUFdNX09DQ29udHJvbF9QV007DQoNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8qIFJlYWQgRFRSIHJlZ2lzdGVyICovDQogIERUUl9SRUcgPSBQV00tPkRUUiAmIDB4ODAwMDsNCg0KLypDaGFubmVsIDEgQ29uZmlndXJhdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICBpZihQV01fSW5pdFN0cnVjdC0+UFdNX0NoYW5uZWwgPT0gUFdNX0NoYW5uZWxfMSkNCiAgICB7DQogICAgICAvKiBQV00gT3V0cHV0IENvbXBsZW1lbnRhcnkgQ29uZmlndXJhdGlvbiAqLw0KICAgICAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9Db21wbGVtZW50YXJ5ID09IFBXTV9Db21wbGVtZW50YXJ5X0VuYWJsZSkNCiAgICAgIHsNCiAgICAgICAgLyogQ29uZmlndXJlcyBDaGFubmVsIDEgb24gT3V0cHV0IENvbXBhcmUgbW9kZSAqLw0KICAgICAgICAgUFdNLT5PTVIxICY9IFBXTV9PQzFDX01hc2s7DQogICAgICAgICBQV00tPk9NUjEgfD0gUFdNX09DQ29udHJvbHxQV01fT0MxX0VuYWJsZXxQV01fT0MxTl9FbmFibGV8UFdNX1BMRDFfU2V0Ow0KICAgICAgICAgUFdNLT5PQ1IxID0gUFdNX0luaXRTdHJ1Y3QtPlBXTV9QdWxzZTE7DQogICAgICAgICANCiAgICAgICAgLyogU2V0cyB0aGUgT0MxIHdhdmUgcG9sYXJpdHkgKi8NCiAgICAgICAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTEgPT0gUFdNX1BvbGFyaXR5MV9Mb3cpDQogICAgICAgIHsNCiAgICAgICAgICAgUFdNLT5PTVIxIHw9IFBXTV9PQzFQX1NldDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgUFdNLT5PTVIxICY9IFBXTV9PQzFQX1Jlc2V0Ow0KICAgICAgICB9DQoNCiAgICAgICAgLyogU2V0cyB0aGUgT0MxTiB3YXZlIHBvbGFyaXR5ICovDQogICAgICAgIGlmKFBXTV9Jbml0U3RydWN0LT5QV01fUG9sYXJpdHkxTiA9PSBQV01fUG9sYXJpdHkxTl9Mb3cpDQogICAgICAgIHsNCiAgICAgICAgICAgUFdNLT5PTVIxIHw9IFBXTV9PQzFOUF9TZXQ7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MxTlBfUmVzZXQ7DQogICAgICAgIH0NCiAgICAgIH0vKiBFbmQgY29tcGxlbWVudGFyeSBjYXNlICovDQogICAgICAvKiBTaW5nbGUgUFdNIE91dHB1dCBjb25maWd1cmF0dWlvbiAqLw0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBzd2l0Y2goUFdNX0luaXRTdHJ1Y3QtPlBXTV9PQ1N0YXRlKQ0KICAgICAgICB7DQogICAgICAgICAgY2FzZSBQV01fT0NTdGF0ZV9FbmFibGU6DQogICAgICAgICAgew0KICAgICAgICAgICAgLyogQ29uZmlndXJlcyBDaGFubmVsIDEgb24gT3V0cHV0IENvbXBhcmUgbW9kZSAqLw0KICAgICAgICAgICAgUFdNLT5PTVIxICY9IFBXTV9PQzFDX01hc2s7DQogICAgICAgICAgICBQV00tPk9NUjEgfD0gUFdNX09DQ29udHJvbHxQV01fT0MxX0VuYWJsZTsNCiAgICAgICAgICAgIFBXTS0+T01SMSB8PSBQV01fUExEMV9TZXQ7DQogICAgICAgICAgICBQV00tPk9DUjEgPSBQV01fSW5pdFN0cnVjdC0+UFdNX1B1bHNlMTsNCg0KICAgICAgICAgICAgLyogU2V0cyB0aGUgT0MxIHdhdmUgcG9sYXJpdHkgKi8NCiAgICAgICAgICAgIGlmKFBXTV9Jbml0U3RydWN0LT5QV01fUG9sYXJpdHkxID09IFBXTV9Qb2xhcml0eTFfTG93KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICBQV00tPk9NUjEgfD0gUFdNX09DMVBfU2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICBQV00tPk9NUjEgJj0gUFdNX09DMVBfUmVzZXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgIGNhc2UgUFdNX09DU3RhdGVfRGlzYWJsZToNCiAgICAgICAgICB7DQogICAgICAgICAgICAvKiBPQzFFID0gMCBhbmQgT1NTUiA9IDAgc2V0cyB0aGUgcG9sYXJpdHkgKi8NCiAgICAgICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MxX0Rpc2FibGU7DQogICAgICAgICAgICBEVFJfUkVHICY9IFBXTV9PU1NSX1Jlc2V0Ow0KICAgICAgICAgIH0NCiAgICAgICAgICBicmVhazsNCiAgICAgICAgICBjYXNlIFBXTV9PQ1N0YXRlX09mZlN0YXRlOg0KICAgICAgICAgIHsNCiAgICAgICAgICAgIC8qIE9DMUUgPSAwIGFuZCBPU1NSID0gMSBhbmQgc2V0cyB0aGUgcG9sYXJpdHkgKi8NCiAgICAgICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MxX0Rpc2FibGU7DQogICAgICAgICAgICBEVFJfUkVHIHw9IFBXTV9PU1NSX1NldDsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLyogU2V0cyB0aGUgT0MxIHdhdmUgcG9sYXJpdHkgKi8NCiAgICAgICAgICAgIGlmKFBXTV9Jbml0U3RydWN0LT5QV01fUG9sYXJpdHkxID09IFBXTV9Qb2xhcml0eTFfTG93KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICBQV00tPk9NUjEgfD0gUFdNX09DMVBfU2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICBQV00tPk9NUjEgJj0gUFdNX09DMVBfUmVzZXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQoNCiAgICAgICAgc3dpdGNoKFBXTV9Jbml0U3RydWN0LT5QV01fT0NOU3RhdGUpDQogICAgICAgIHsNCiAgICAgICAgICBjYXNlIFBXTV9PQ05TdGF0ZV9FbmFibGU6DQogICAgICAgICAgew0KICAgICAgICAgICAgLyogQ29uZmlndXJlcyBDaGFubmVsIDFOIG9uIE91dHB1dCBDb21wYXJlIG1vZGUgKi8NCiAgICAgICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MxQ19NYXNrOw0KICAgICAgICAgICAgUFdNLT5PTVIxIHw9IFBXTV9PQ0NvbnRyb2wgfFBXTV9PQzFOX0VuYWJsZSB8UFdNX1BMRDFfU2V0OyANCiAgICAgICAgICAgIFBXTS0+T0NSMSA9IFBXTV9Jbml0U3RydWN0LT5QV01fUHVsc2UxOw0KDQogICAgICAgICAgICAvKiBTZXRzIHRoZSBPQzFOIHdhdmUgcG9sYXJpdHkgKi8NCiAgICAgICAgICAgIGlmKFBXTV9Jbml0U3RydWN0LT5QV01fUG9sYXJpdHkxTiA9PSBQV01fUG9sYXJpdHkxTl9Mb3cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgIFBXTS0+T01SMSB8PSBQV01fT0MxTlBfU2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICBQV00tPk9NUjEgJj0gUFdNX09DMU5QX1Jlc2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBicmVhazsNCiAgICAgICAgICBjYXNlIFBXTV9PQ05TdGF0ZV9EaXNhYmxlOg0KICAgICAgICAgIHsNCiAgICAgICAgICAgIC8qIE9DMU4gPSAwIE9TU1IgPSAwICovDQogICAgICAgICAgICBQV00tPk9NUjEgJj0gUFdNX09DMU5fRGlzYWJsZTsNCiAgICAgICAgICAgIERUUl9SRUcgJj0gUFdNX09TU1JfUmVzZXQ7DQogICAgICAgICAgfQ0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgIGNhc2UgUFdNX09DTlN0YXRlX09mZlN0YXRlOg0KICAgICAgICAgIHsNCiAgICAgICAgICAgIC8qIE9DMU4gPSAwIE9TU1IgPSAxIGFuZCBzZXRzIHRoZSBwb2xhcml0eSAqLw0KICAgICAgICAgICAgUFdNLT5PTVIxICY9IFBXTV9PQzFOX0Rpc2FibGU7DQogICAgICAgICAgICBEVFJfUkVHIHw9IFBXTV9PU1NSX1NldDsNCg0KICAgICAgICAgICAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTFOID09IFBXTV9Qb2xhcml0eTFOX0xvdykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgUFdNLT5PTVIxIHw9IFBXTV9PQzFOUF9TZXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MxTlBfUmVzZXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9IA0KICAgICAgfSAvKiBFbmQgbm90IGNvbXBsZW1lbnRhcnkgY2FzZSAqLw0KICAgIH0vKiBlbmQgY2hhbm5lbCAxICovDQoNCi8qQ2hhbm5lbCAyIENvbmZpZ3VyYXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogICAgICBpZihQV01fSW5pdFN0cnVjdC0+UFdNX0NoYW5uZWwgPT0gUFdNX0NoYW5uZWxfMikNCiAgICAgIHsNCiAgICAgICAgLyogUFdNIE91dHB1dCBDb21wbGVtZW50YXJ5IENvbmZpZ3VyYXRpb24gKi8NCiAgICAgICAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9Db21wbGVtZW50YXJ5ID09IFBXTV9Db21wbGVtZW50YXJ5X0VuYWJsZSkNCiAgICAgICAgew0KICAgICAgICAgIC8qIENvbmZpZ3VyZXMgQ2hhbm5lbCAyIG9uIE91dHB1dCBDb21wYXJlIG1vZGUgKi8NCiAgICAgICAgICBQV00tPk9NUjEgJj0gUFdNX09DMkNfTWFzazsNCiAgICAgICAgICBQV00tPk9NUjEgfD0gKFBXTV9PQ0NvbnRyb2w8PDgpfFBXTV9PQzJfRW5hYmxlfFBXTV9PQzJOX0VuYWJsZXxQV01fUExEMl9TZXQ7DQogICAgICAgICAgUFdNLT5PQ1IyID0gUFdNX0luaXRTdHJ1Y3QtPlBXTV9QdWxzZTI7DQoNCiAgICAgICAgLyogU2V0IHRoZSBPQzIgd2F2ZSBwb2xhcml0eSAqLw0KICAgICAgICBpZihQV01fSW5pdFN0cnVjdC0+UFdNX1BvbGFyaXR5MiA9PSBQV01fUG9sYXJpdHkyX0xvdykNCiAgICAgICAgew0KICAgICAgICAgICBQV00tPk9NUjEgfD0gUFdNX09DMlBfU2V0Ow0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICBQV00tPk9NUjEgJj0gUFdNX09DMlBfUmVzZXQ7DQogICAgICAgIH0NCg0KICAgICAgICAvKiBTZXRzIHRoZSBPQzJOIHdhdmUgcG9sYXJpdHkgKi8NCiAgICAgICAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTJOID09IFBXTV9Qb2xhcml0eTJOX0xvdykNCiAgICAgICAgew0KICAgICAgICAgICBQV00tPk9NUjEgfD0gUFdNX09DMk5QX1NldDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgUFdNLT5PTVIxICY9IFBXTV9PQzJOUF9SZXNldDsNCiAgICAgICAgfQ0KDQogICAgICAgIH0vKiBFbmQgY29tcGxlbnRhcnkgY2FzZSAqLw0KICAgICAgICBlbHNlDQogICAgICAgIC8qIFNpbmdsZSBQV00gT3V0cHV0IGNvbmZpZ3VyYXR1aW9uICovDQogICAgICAgIHsNCiAgICAgICAgICBzd2l0Y2goUFdNX0luaXRTdHJ1Y3QtPlBXTV9PQ1N0YXRlKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgUFdNX09DU3RhdGVfRW5hYmxlOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAvKiBDb25maWd1cmVzIENoYW5uZWwgMiBvbiBPdXRwdXQgQ29tcGFyZSBtb2RlICovDQogICAgICAgICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MyQ19NYXNrOw0KICAgICAgICAgICAgICBQV00tPk9NUjEgfD0gKFBXTV9PQ0NvbnRyb2w8PDgpfFBXTV9PQzJfRW5hYmxlfFBXTV9QTEQyX1NldDsNCiAgICAgICAgICAgICAgUFdNLT5PQ1IyID0gUFdNX0luaXRTdHJ1Y3QtPlBXTV9QdWxzZTI7DQoNCiAgICAgICAgICAgICAgLyogU2V0cyB0aGUgT0MyIHdhdmUgcG9sYXJpdHkgKi8NCiAgICAgICAgICAgICAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTIgPT0gUFdNX1BvbGFyaXR5Ml9Mb3cpDQogICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBQV00tPk9NUjEgfD0gUFdNX09DMlBfU2V0Ow0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MyUF9SZXNldDsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlIFBXTV9PQ1N0YXRlX0Rpc2FibGU6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgIC8qIE9DMkUgPSAwIGFuZCBPU1NSID0gMCAgKi8NCiAgICAgICAgICAgICAgUFdNLT5PTVIxICY9IFBXTV9PQzJfRGlzYWJsZTsNCiAgICAgICAgICAgICAgRFRSX1JFRyAmPSBQV01fT1NTUl9SZXNldDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSBQV01fT0NTdGF0ZV9PZmZTdGF0ZToNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgLyogT0MyRSA9IDAgYW5kIE9TU1IgPSAxIHNldHMgdGhlIHBvbGFyaXR5ICovDQogICAgICAgICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MyX0Rpc2FibGU7DQogICAgICAgICAgICAgIERUUl9SRUcgfD0gUFdNX09TU1JfU2V0Ow0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgLyogU2V0cyB0aGUgT0MyIHdhdmUgcG9sYXJpdHkgKi8NCiAgICAgICAgICAgICAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTIgPT0gUFdNX1BvbGFyaXR5Ml9Mb3cpDQogICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBQV00tPk9NUjEgfD0gUFdNX09DMlBfU2V0Ow0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MyUF9SZXNldDsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgfQ0KICAgICAgICAgIHN3aXRjaChQV01fSW5pdFN0cnVjdC0+UFdNX09DTlN0YXRlKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgUFdNX09DTlN0YXRlX0VuYWJsZToNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgLyogQ29uZmlndXJlcyBDaGFubmVsIDJOIG9uIE91dHB1dCBDb21wYXJlIG1vZGUgKi8NCiAgICAgICAgICAgICAgUFdNLT5PTVIxICY9IFBXTV9PQzJDX01hc2s7DQogICAgICAgICAgICAgIFBXTS0+T01SMSB8PSAoUFdNX09DQ29udHJvbDw8OCl8UFdNX09DMk5fRW5hYmxlfFBXTV9QTEQyX1NldDsNCiAgICAgICAgICAgICAgUFdNLT5PQ1IyID0gUFdNX0luaXRTdHJ1Y3QtPlBXTV9QdWxzZTI7DQoNCiAgICAgICAgICAgICAgLyogU2V0cyB0aGUgT0MyIHdhdmUgcG9sYXJpdHkgKi8NCiAgICAgICAgICAgICAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTJOID09IFBXTV9Qb2xhcml0eTJOX0xvdykNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFBXTS0+T01SMSB8PSBQV01fT0MyTlBfU2V0Ow0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MyTlBfUmVzZXQ7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSBQV01fT0NOU3RhdGVfRGlzYWJsZToNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgLyogT0MyTiA9IDAgT1NTUiA9IDAgKi8NCiAgICAgICAgICAgICAgUFdNLT5PTVIxICY9IFBXTV9PQzJOX0Rpc2FibGU7DQogICAgICAgICAgICAgIERUUl9SRUcgJj0gUFdNX09TU1JfUmVzZXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgUFdNX09DTlN0YXRlX09mZlN0YXRlOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAvKiBPQzJOID0gMCBPU1NSID0gMSBhbmQgc2V0cyB0aGUgcG9sYXJpdHkgKi8NCiAgICAgICAgICAgICAgUFdNLT5PTVIxICY9IFBXTV9PQzJOX0Rpc2FibGU7DQogICAgICAgICAgICAgIERUUl9SRUcgfD0gUFdNX09TU1JfU2V0Ow0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTJOID09IFBXTV9Qb2xhcml0eTJOX0xvdykNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFBXTS0+T01SMSB8PSBQV01fT0MyTlBfU2V0Ow0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFBXTS0+T01SMSAmPSBQV01fT0MyTlBfUmVzZXQ7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgIH0NCiAgICAgICAgfSAvKiBFbmQgbm90IGNvbXBsZW1lbnRhcnkgY2FzZSAqLw0KICAgICAgfS8qIGVuZCBjaGFubmVsIDIgKi8NCg0KLypDaGFubmVsIDMgQ29uZmlndXJhdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICAgIGlmKFBXTV9Jbml0U3RydWN0LT5QV01fQ2hhbm5lbCA9PSBQV01fQ2hhbm5lbF8zKQ0KICAgICAgew0KICAgICAgICAvKiBQV00gT3V0cHV0IENvbXBsZW1lbnRhcnkgQ29uZmlndXJhdGlvbiAqLw0KICAgICAgICBpZihQV01fSW5pdFN0cnVjdC0+UFdNX0NvbXBsZW1lbnRhcnkgPT0gUFdNX0NvbXBsZW1lbnRhcnlfRW5hYmxlKQ0KICAgICAgICB7DQogICAgICAgICAgLyogQ29uZmlndXJlcyBDaGFubmVsIDMgb24gT3V0cHV0IENvbXBhcmUgbW9kZSAqLw0KICAgICAgICAgICBQV00tPk9NUjIgJj0gUFdNX09DM0NfTWFzazsNCiAgICAgICAgICAgUFdNLT5PTVIyIHw9IFBXTV9PQ0NvbnRyb2x8UFdNX09DM19FbmFibGV8UFdNX09DM05fRW5hYmxlfFBXTV9QTEQzX1NldDsNCiAgICAgICAgICAgUFdNLT5PQ1IzID0gUFdNX0luaXRTdHJ1Y3QtPlBXTV9QdWxzZTM7DQoNCiAgICAgICAgICAvKiBTZXRzIHRoZSBPQzMgd2F2ZSBwb2xhcml0eSAqLw0KICAgICAgICAgIGlmKFBXTV9Jbml0U3RydWN0LT5QV01fUG9sYXJpdHkzID09IFBXTV9Qb2xhcml0eTNfTG93KQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIFBXTS0+T01SMiB8PSBQV01fT0MzUF9TZXQ7DQogICAgICAgICAgfQ0KICAgICAgICAgIGVsc2UNCiAgICAgICAgICB7DQogICAgICAgICAgICBQV00tPk9NUjIgJj0gUFdNX09DM1BfUmVzZXQ7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLyogU2V0cyB0aGUgT0MzTiB3YXZlIHBvbGFyaXR5ICovDQogICAgICAgICAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTNOID09IFBXTV9Qb2xhcml0eTNOX0xvdykNCiAgICAgICAgICB7DQogICAgICAgICAgICBQV00tPk9NUjIgfD0gUFdNX09DM05QX1NldDsNCiAgICAgICAgICB9DQogICAgICAgICAgZWxzZQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIFBXTS0+T01SMiAmPSBQV01fT0MzTlBfUmVzZXQ7DQogICAgICAgICAgfQ0KICAgICAgICB9LyogRW5kIGNvbXBsZW1lbnRhcnkgY2FzZSAqLw0KICAgICAgICBlbHNlDQogICAgICAgIC8qIFNpbmdsZSBQV00gT3V0cHV0IGNvbmZpZ3VyYXR1aW9uICovDQogICAgICAgIHsNCiAgICAgICAgICBzd2l0Y2goUFdNX0luaXRTdHJ1Y3QtPlBXTV9PQ1N0YXRlKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgUFdNX09DU3RhdGVfRW5hYmxlOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAvKiBDb25maWd1cmVzIENoYW5uZWwgMyBvbiBPdXRwdXQgQ29tcGFyZSBtb2RlICovDQogICAgICAgICAgICAgIFBXTS0+T01SMiAmPSBQV01fT0MzQ19NYXNrOw0KICAgICAgICAgICAgICBQV00tPk9NUjIgfD0gUFdNX09DQ29udHJvbHxQV01fT0MzX0VuYWJsZXxQV01fUExEM19TZXQ7DQogICAgICAgICAgICAgIFBXTS0+T0NSMyA9IFBXTV9Jbml0U3RydWN0LT5QV01fUHVsc2UzOw0KDQogICAgICAgICAgICAgIC8qIFNldHMgdGhlIE9DQyB3YXZlIHBvbGFyaXR5ICovDQogICAgICAgICAgICAgIGlmKFBXTV9Jbml0U3RydWN0LT5QV01fUG9sYXJpdHkzID09IFBXTV9Qb2xhcml0eTNfTG93KQ0KICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgUFdNLT5PTVIyIHw9IFBXTV9PQzNQX1NldDsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBQV00tPk9NUjIgJj0gUFdNX09DM1BfUmVzZXQ7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSBQV01fT0NTdGF0ZV9EaXNhYmxlOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAvKiBPQzNFID0gMCBhbmQgT1NTUiA9IDAgICovDQogICAgICAgICAgICAgIFBXTS0+T01SMiAmPSBQV01fT0MzX0Rpc2FibGU7DQogICAgICAgICAgICAgIERUUl9SRUcgJj0gUFdNX09TU1JfUmVzZXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgUFdNX09DU3RhdGVfT2ZmU3RhdGU6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgIC8qIE9DM0UgPSAwIGFuZCBPU1NSID0gMSBzZXRzIHRoZSBwb2xhcml0eSAqLw0KICAgICAgICAgICAgICBQV00tPk9NUjIgJj0gUFdNX09DM19EaXNhYmxlOw0KICAgICAgICAgICAgICBEVFJfUkVHIHw9IFBXTV9PU1NSX1NldDsNCg0KICAgICAgICAgICAgICBpZihQV01fSW5pdFN0cnVjdC0+UFdNX1BvbGFyaXR5MyA9PSBQV01fUG9sYXJpdHkzX0xvdykNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFBXTS0+T01SMiB8PSBQV01fT0MzUF9TZXQ7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgUFdNLT5PTVIyICY9IFBXTV9PQzNQX1Jlc2V0Ow0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICBzd2l0Y2goUFdNX0luaXRTdHJ1Y3QtPlBXTV9PQ05TdGF0ZSkNCiAgICAgICAgICB7DQogICAgICAgICAgICBjYXNlIFBXTV9PQ05TdGF0ZV9FbmFibGU6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgIC8qIENvbmZpZ3VyZXMgQ2hhbm5lbCAzTiBvbiBPdXRwdXQgQ29tcGFyZSBtb2RlICovDQogICAgICAgICAgICAgIFBXTS0+T01SMiAmPSBQV01fT0MzQ19NYXNrOw0KICAgICAgICAgICAgICBQV00tPk9NUjIgfD0gUFdNX09DQ29udHJvbCB8UFdNX09DM05fRW5hYmxlfFBXTV9QTEQzX1NldDsNCiAgICAgICAgICAgICAgUFdNLT5PQ1IzID0gUFdNX0luaXRTdHJ1Y3QtPlBXTV9QdWxzZTM7DQoNCiAgICAgICAgICAgICAgLyogU2V0cyB0aGUgT0MzIHdhdmUgcG9sYXJpdHkgKi8NCiAgICAgICAgICAgICAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9Qb2xhcml0eTNOID09IFBXTV9Qb2xhcml0eTNOX0xvdykNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFBXTS0+T01SMiB8PSBQV01fT0MzTlBfU2V0Ow0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFBXTS0+T01SMiAmPSBQV01fT0MzTlBfUmVzZXQ7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSBQV01fT0NOU3RhdGVfRGlzYWJsZToNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgLyogT0MzTiA9IDAgT1NTUiA9IDAgKi8NCiAgICAgICAgICAgICAgUFdNLT5PTVIyICY9IFBXTV9PQzNOX0Rpc2FibGU7DQogICAgICAgICAgICAgIERUUl9SRUcgJj0gUFdNX09TU1JfUmVzZXQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgUFdNX09DTlN0YXRlX09mZlN0YXRlOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAvKiBPQzNOID0gMCBPU1NSID0gMSBhbmQgc2V0cyB0aGUgcG9sYXJpdHkgKi8NCiAgICAgICAgICAgICAgUFdNLT5PTVIyICY9IFBXTV9PQzNOX0Rpc2FibGU7DQogICAgICAgICAgICAgIERUUl9SRUcgfD0gUFdNX09TU1JfU2V0Ow0KDQogICAgICAgICAgICAgIGlmKFBXTV9Jbml0U3RydWN0LT5QV01fUG9sYXJpdHkzTiA9PSBQV01fUG9sYXJpdHkzTl9Mb3cpDQogICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBQV00tPk9NUjIgfD0gUFdNX09DM05QX1NldDsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBQV00tPk9NUjIgJj0gUFdNX09DM05QX1Jlc2V0Ow0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICB9DQogICAgICAgIH0gLyogRW5kIG5vdCBjb21wbGVtZW50YXJ5IGNhc2UgKi8NCiAgICAgIH0vKiBlbmQgY2hhbm5lbCAzICovDQoNCiAgaWYoUFdNX0luaXRTdHJ1Y3QtPlBXTV9EVFJBY2Nlc3MgPT0gUFdNX0RUUkFjY2Vzc19FbmFibGUpDQogIHsNCiAgICBEVFJfUkVHIHw9IFBXTV9Jbml0U3RydWN0LT5QV01fTE9DS0xldmVsIHwgUFdNX0luaXRTdHJ1Y3QtPlBXTV9FbWVyZ2VuY3kgfA0KICAgICAgICAgICAgICBQV01fSW5pdFN0cnVjdC0+UFdNX0RlYWRUaW1lIHwgUFdNX0luaXRTdHJ1Y3QtPlBXTV9PU1NJU3RhdGU7DQogICAgUFdNLT5EVFIgPSBEVFJfUkVHOw0KICB9IA0KfQ0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDA2IFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==