LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF9kbWEuYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjMuNC4wDQogICogQGRhdGUgICAgMTAvMTUvMjAxMA0KICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIERNQSBmaXJtd2FyZSBmdW5jdGlvbnMuDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLyANCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfZG1hLmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIERNQSANCiAgKiBAYnJpZWYgRE1BIGRyaXZlciBtb2R1bGVzDQogICogQHsNCiAgKi8gDQoNCi8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KICAqIEB7DQogICovIA0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBETUFfUHJpdmF0ZV9EZWZpbmVzDQogICogQHsNCiAgKi8NCg0KDQovKiBETUExIENoYW5uZWx4IGludGVycnVwdCBwZW5kaW5nIGJpdCBtYXNrcyAqLw0KI2RlZmluZSBETUExX0NoYW5uZWwxX0lUX01hc2sgICAgKCh1aW50MzJfdCkoRE1BX0lTUl9HSUYxIHwgRE1BX0lTUl9UQ0lGMSB8IERNQV9JU1JfSFRJRjEgfCBETUFfSVNSX1RFSUYxKSkNCiNkZWZpbmUgRE1BMV9DaGFubmVsMl9JVF9NYXNrICAgICgodWludDMyX3QpKERNQV9JU1JfR0lGMiB8IERNQV9JU1JfVENJRjIgfCBETUFfSVNSX0hUSUYyIHwgRE1BX0lTUl9URUlGMikpDQojZGVmaW5lIERNQTFfQ2hhbm5lbDNfSVRfTWFzayAgICAoKHVpbnQzMl90KShETUFfSVNSX0dJRjMgfCBETUFfSVNSX1RDSUYzIHwgRE1BX0lTUl9IVElGMyB8IERNQV9JU1JfVEVJRjMpKQ0KI2RlZmluZSBETUExX0NoYW5uZWw0X0lUX01hc2sgICAgKCh1aW50MzJfdCkoRE1BX0lTUl9HSUY0IHwgRE1BX0lTUl9UQ0lGNCB8IERNQV9JU1JfSFRJRjQgfCBETUFfSVNSX1RFSUY0KSkNCiNkZWZpbmUgRE1BMV9DaGFubmVsNV9JVF9NYXNrICAgICgodWludDMyX3QpKERNQV9JU1JfR0lGNSB8IERNQV9JU1JfVENJRjUgfCBETUFfSVNSX0hUSUY1IHwgRE1BX0lTUl9URUlGNSkpDQojZGVmaW5lIERNQTFfQ2hhbm5lbDZfSVRfTWFzayAgICAoKHVpbnQzMl90KShETUFfSVNSX0dJRjYgfCBETUFfSVNSX1RDSUY2IHwgRE1BX0lTUl9IVElGNiB8IERNQV9JU1JfVEVJRjYpKQ0KI2RlZmluZSBETUExX0NoYW5uZWw3X0lUX01hc2sgICAgKCh1aW50MzJfdCkoRE1BX0lTUl9HSUY3IHwgRE1BX0lTUl9UQ0lGNyB8IERNQV9JU1JfSFRJRjcgfCBETUFfSVNSX1RFSUY3KSkNCg0KLyogRE1BMiBDaGFubmVseCBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgbWFza3MgKi8NCiNkZWZpbmUgRE1BMl9DaGFubmVsMV9JVF9NYXNrICAgICgodWludDMyX3QpKERNQV9JU1JfR0lGMSB8IERNQV9JU1JfVENJRjEgfCBETUFfSVNSX0hUSUYxIHwgRE1BX0lTUl9URUlGMSkpDQojZGVmaW5lIERNQTJfQ2hhbm5lbDJfSVRfTWFzayAgICAoKHVpbnQzMl90KShETUFfSVNSX0dJRjIgfCBETUFfSVNSX1RDSUYyIHwgRE1BX0lTUl9IVElGMiB8IERNQV9JU1JfVEVJRjIpKQ0KI2RlZmluZSBETUEyX0NoYW5uZWwzX0lUX01hc2sgICAgKCh1aW50MzJfdCkoRE1BX0lTUl9HSUYzIHwgRE1BX0lTUl9UQ0lGMyB8IERNQV9JU1JfSFRJRjMgfCBETUFfSVNSX1RFSUYzKSkNCiNkZWZpbmUgRE1BMl9DaGFubmVsNF9JVF9NYXNrICAgICgodWludDMyX3QpKERNQV9JU1JfR0lGNCB8IERNQV9JU1JfVENJRjQgfCBETUFfSVNSX0hUSUY0IHwgRE1BX0lTUl9URUlGNCkpDQojZGVmaW5lIERNQTJfQ2hhbm5lbDVfSVRfTWFzayAgICAoKHVpbnQzMl90KShETUFfSVNSX0dJRjUgfCBETUFfSVNSX1RDSUY1IHwgRE1BX0lTUl9IVElGNSB8IERNQV9JU1JfVEVJRjUpKQ0KDQovKiBETUEyIEZMQUcgbWFzayAqLw0KI2RlZmluZSBGTEFHX01hc2sgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDAwKQ0KDQovKiBETUEgcmVnaXN0ZXJzIE1hc2tzICovDQojZGVmaW5lIENDUl9DTEVBUl9NYXNrICAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRjgwMEYpDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfTWFjcm9zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBETUFfUHJpdmF0ZV9WYXJpYWJsZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIERNQV9Qcml2YXRlX0Z1bmN0aW9uUHJvdG90eXBlcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfRnVuY3Rpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBETUF5IENoYW5uZWx4IHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0DQogICogICB2YWx1ZXMuDQogICogQHBhcmFtICBETUF5X0NoYW5uZWx4OiB3aGVyZSB5IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBETUEgYW5kDQogICogICB4IGNhbiBiZSAxIHRvIDcgZm9yIERNQTEgYW5kIDEgdG8gNSBmb3IgRE1BMiB0byBzZWxlY3QgdGhlIERNQSBDaGFubmVsLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBETUFfRGVJbml0KERNQV9DaGFubmVsX1R5cGVEZWYqIERNQXlfQ2hhbm5lbHgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19ETUFfQUxMX1BFUklQSChETUF5X0NoYW5uZWx4KSk7DQogIA0KICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBETUF5IENoYW5uZWx4ICovDQogIERNQXlfQ2hhbm5lbHgtPkNDUiAmPSAodWludDE2X3QpKH5ETUFfQ0NSMV9FTik7DQogIA0KICAvKiBSZXNldCBETUF5IENoYW5uZWx4IGNvbnRyb2wgcmVnaXN0ZXIgKi8NCiAgRE1BeV9DaGFubmVseC0+Q0NSICA9IDA7DQogIA0KICAvKiBSZXNldCBETUF5IENoYW5uZWx4IHJlbWFpbmluZyBieXRlcyByZWdpc3RlciAqLw0KICBETUF5X0NoYW5uZWx4LT5DTkRUUiA9IDA7DQogIA0KICAvKiBSZXNldCBETUF5IENoYW5uZWx4IHBlcmlwaGVyYWwgYWRkcmVzcyByZWdpc3RlciAqLw0KICBETUF5X0NoYW5uZWx4LT5DUEFSICA9IDA7DQogIA0KICAvKiBSZXNldCBETUF5IENoYW5uZWx4IG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyICovDQogIERNQXlfQ2hhbm5lbHgtPkNNQVIgPSAwOw0KICANCiAgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMV9DaGFubmVsMSkNCiAgew0KICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQTEgQ2hhbm5lbDEgKi8NCiAgICBETUExLT5JRkNSIHw9IERNQTFfQ2hhbm5lbDFfSVRfTWFzazsNCiAgfQ0KICBlbHNlIGlmIChETUF5X0NoYW5uZWx4ID09IERNQTFfQ2hhbm5lbDIpDQogIHsNCiAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUExIENoYW5uZWwyICovDQogICAgRE1BMS0+SUZDUiB8PSBETUExX0NoYW5uZWwyX0lUX01hc2s7DQogIH0NCiAgZWxzZSBpZiAoRE1BeV9DaGFubmVseCA9PSBETUExX0NoYW5uZWwzKQ0KICB7DQogICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMSBDaGFubmVsMyAqLw0KICAgIERNQTEtPklGQ1IgfD0gRE1BMV9DaGFubmVsM19JVF9NYXNrOw0KICB9DQogIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMV9DaGFubmVsNCkNCiAgew0KICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQTEgQ2hhbm5lbDQgKi8NCiAgICBETUExLT5JRkNSIHw9IERNQTFfQ2hhbm5lbDRfSVRfTWFzazsNCiAgfQ0KICBlbHNlIGlmIChETUF5X0NoYW5uZWx4ID09IERNQTFfQ2hhbm5lbDUpDQogIHsNCiAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUExIENoYW5uZWw1ICovDQogICAgRE1BMS0+SUZDUiB8PSBETUExX0NoYW5uZWw1X0lUX01hc2s7DQogIH0NCiAgZWxzZSBpZiAoRE1BeV9DaGFubmVseCA9PSBETUExX0NoYW5uZWw2KQ0KICB7DQogICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMSBDaGFubmVsNiAqLw0KICAgIERNQTEtPklGQ1IgfD0gRE1BMV9DaGFubmVsNl9JVF9NYXNrOw0KICB9DQogIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMV9DaGFubmVsNykNCiAgew0KICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQTEgQ2hhbm5lbDcgKi8NCiAgICBETUExLT5JRkNSIHw9IERNQTFfQ2hhbm5lbDdfSVRfTWFzazsNCiAgfQ0KICBlbHNlIGlmIChETUF5X0NoYW5uZWx4ID09IERNQTJfQ2hhbm5lbDEpDQogIHsNCiAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUEyIENoYW5uZWwxICovDQogICAgRE1BMi0+SUZDUiB8PSBETUEyX0NoYW5uZWwxX0lUX01hc2s7DQogIH0NCiAgZWxzZSBpZiAoRE1BeV9DaGFubmVseCA9PSBETUEyX0NoYW5uZWwyKQ0KICB7DQogICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMiBDaGFubmVsMiAqLw0KICAgIERNQTItPklGQ1IgfD0gRE1BMl9DaGFubmVsMl9JVF9NYXNrOw0KICB9DQogIGVsc2UgaWYgKERNQXlfQ2hhbm5lbHggPT0gRE1BMl9DaGFubmVsMykNCiAgew0KICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQTIgQ2hhbm5lbDMgKi8NCiAgICBETUEyLT5JRkNSIHw9IERNQTJfQ2hhbm5lbDNfSVRfTWFzazsNCiAgfQ0KICBlbHNlIGlmIChETUF5X0NoYW5uZWx4ID09IERNQTJfQ2hhbm5lbDQpDQogIHsNCiAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUEyIENoYW5uZWw0ICovDQogICAgRE1BMi0+SUZDUiB8PSBETUEyX0NoYW5uZWw0X0lUX01hc2s7DQogIH0NCiAgZWxzZQ0KICB7IA0KICAgIGlmIChETUF5X0NoYW5uZWx4ID09IERNQTJfQ2hhbm5lbDUpDQogICAgew0KICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BMiBDaGFubmVsNSAqLw0KICAgICAgRE1BMi0+SUZDUiB8PSBETUEyX0NoYW5uZWw1X0lUX01hc2s7DQogICAgfQ0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIERNQXkgQ2hhbm5lbHggYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIERNQV9Jbml0U3RydWN0Lg0KICAqIEBwYXJhbSAgRE1BeV9DaGFubmVseDogd2hlcmUgeSBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgRE1BIGFuZCANCiAgKiAgIHggY2FuIGJlIDEgdG8gNyBmb3IgRE1BMSBhbmQgMSB0byA1IGZvciBETUEyIHRvIHNlbGVjdCB0aGUgRE1BIENoYW5uZWwuDQogICogQHBhcmFtICBETUFfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIERNQV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KICAqICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIERNQV9Jbml0KERNQV9DaGFubmVsX1R5cGVEZWYqIERNQXlfQ2hhbm5lbHgsIERNQV9Jbml0VHlwZURlZiogRE1BX0luaXRTdHJ1Y3QpDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfUEVSSVBIKERNQXlfQ2hhbm5lbHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RNQV9ESVIoRE1BX0luaXRTdHJ1Y3QtPkRNQV9ESVIpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RNQV9CVUZGRVJfU0laRShETUFfSW5pdFN0cnVjdC0+RE1BX0J1ZmZlclNpemUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RNQV9QRVJJUEhFUkFMX0lOQ19TVEFURShETUFfSW5pdFN0cnVjdC0+RE1BX1BlcmlwaGVyYWxJbmMpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RNQV9NRU1PUllfSU5DX1NUQVRFKERNQV9Jbml0U3RydWN0LT5ETUFfTWVtb3J5SW5jKSk7ICAgDQogIGFzc2VydF9wYXJhbShJU19ETUFfUEVSSVBIRVJBTF9EQVRBX1NJWkUoRE1BX0luaXRTdHJ1Y3QtPkRNQV9QZXJpcGhlcmFsRGF0YVNpemUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RNQV9NRU1PUllfREFUQV9TSVpFKERNQV9Jbml0U3RydWN0LT5ETUFfTWVtb3J5RGF0YVNpemUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RNQV9NT0RFKERNQV9Jbml0U3RydWN0LT5ETUFfTW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRE1BX1BSSU9SSVRZKERNQV9Jbml0U3RydWN0LT5ETUFfUHJpb3JpdHkpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RNQV9NMk1fU1RBVEUoRE1BX0luaXRTdHJ1Y3QtPkRNQV9NMk0pKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BeSBDaGFubmVseCBDQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIEdldCB0aGUgRE1BeV9DaGFubmVseCBDQ1IgdmFsdWUgKi8NCiAgdG1wcmVnID0gRE1BeV9DaGFubmVseC0+Q0NSOw0KICAvKiBDbGVhciBNRU0yTUVNLCBQTCwgTVNJWkUsIFBTSVpFLCBNSU5DLCBQSU5DLCBDSVJDIGFuZCBESVIgYml0cyAqLw0KICB0bXByZWcgJj0gQ0NSX0NMRUFSX01hc2s7DQogIC8qIENvbmZpZ3VyZSBETUF5IENoYW5uZWx4OiBkYXRhIHRyYW5zZmVyLCBkYXRhIHNpemUsIHByaW9yaXR5IGxldmVsIGFuZCBtb2RlICovDQogIC8qIFNldCBESVIgYml0IGFjY29yZGluZyB0byBETUFfRElSIHZhbHVlICovDQogIC8qIFNldCBDSVJDIGJpdCBhY2NvcmRpbmcgdG8gRE1BX01vZGUgdmFsdWUgKi8NCiAgLyogU2V0IFBJTkMgYml0IGFjY29yZGluZyB0byBETUFfUGVyaXBoZXJhbEluYyB2YWx1ZSAqLw0KICAvKiBTZXQgTUlOQyBiaXQgYWNjb3JkaW5nIHRvIERNQV9NZW1vcnlJbmMgdmFsdWUgKi8NCiAgLyogU2V0IFBTSVpFIGJpdHMgYWNjb3JkaW5nIHRvIERNQV9QZXJpcGhlcmFsRGF0YVNpemUgdmFsdWUgKi8NCiAgLyogU2V0IE1TSVpFIGJpdHMgYWNjb3JkaW5nIHRvIERNQV9NZW1vcnlEYXRhU2l6ZSB2YWx1ZSAqLw0KICAvKiBTZXQgUEwgYml0cyBhY2NvcmRpbmcgdG8gRE1BX1ByaW9yaXR5IHZhbHVlICovDQogIC8qIFNldCB0aGUgTUVNMk1FTSBiaXQgYWNjb3JkaW5nIHRvIERNQV9NMk0gdmFsdWUgKi8NCiAgdG1wcmVnIHw9IERNQV9Jbml0U3RydWN0LT5ETUFfRElSIHwgRE1BX0luaXRTdHJ1Y3QtPkRNQV9Nb2RlIHwNCiAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5ETUFfUGVyaXBoZXJhbEluYyB8IERNQV9Jbml0U3RydWN0LT5ETUFfTWVtb3J5SW5jIHwNCiAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5ETUFfUGVyaXBoZXJhbERhdGFTaXplIHwgRE1BX0luaXRTdHJ1Y3QtPkRNQV9NZW1vcnlEYXRhU2l6ZSB8DQogICAgICAgICAgICBETUFfSW5pdFN0cnVjdC0+RE1BX1ByaW9yaXR5IHwgRE1BX0luaXRTdHJ1Y3QtPkRNQV9NMk07DQoNCiAgLyogV3JpdGUgdG8gRE1BeSBDaGFubmVseCBDQ1IgKi8NCiAgRE1BeV9DaGFubmVseC0+Q0NSID0gdG1wcmVnOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBETUF5IENoYW5uZWx4IENORFRSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogV3JpdGUgdG8gRE1BeSBDaGFubmVseCBDTkRUUiAqLw0KICBETUF5X0NoYW5uZWx4LT5DTkRUUiA9IERNQV9Jbml0U3RydWN0LT5ETUFfQnVmZmVyU2l6ZTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BeSBDaGFubmVseCBDUEFSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIFdyaXRlIHRvIERNQXkgQ2hhbm5lbHggQ1BBUiAqLw0KICBETUF5X0NoYW5uZWx4LT5DUEFSID0gRE1BX0luaXRTdHJ1Y3QtPkRNQV9QZXJpcGhlcmFsQmFzZUFkZHI7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERNQXkgQ2hhbm5lbHggQ01BUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBXcml0ZSB0byBETUF5IENoYW5uZWx4IENNQVIgKi8NCiAgRE1BeV9DaGFubmVseC0+Q01BUiA9IERNQV9Jbml0U3RydWN0LT5ETUFfTWVtb3J5QmFzZUFkZHI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBETUFfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiAgKiBAcGFyYW0gIERNQV9Jbml0U3RydWN0IDogcG9pbnRlciB0byBhIERNQV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbA0KICAqICAgYmUgaW5pdGlhbGl6ZWQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIERNQV9TdHJ1Y3RJbml0KERNQV9Jbml0VHlwZURlZiogRE1BX0luaXRTdHJ1Y3QpDQp7DQovKi0tLS0tLS0tLS0tLS0tIFJlc2V0IERNQSBpbml0IHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHZhbHVlcyAtLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBJbml0aWFsaXplIHRoZSBETUFfUGVyaXBoZXJhbEJhc2VBZGRyIG1lbWJlciAqLw0KICBETUFfSW5pdFN0cnVjdC0+RE1BX1BlcmlwaGVyYWxCYXNlQWRkciA9IDA7DQogIC8qIEluaXRpYWxpemUgdGhlIERNQV9NZW1vcnlCYXNlQWRkciBtZW1iZXIgKi8NCiAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9NZW1vcnlCYXNlQWRkciA9IDA7DQogIC8qIEluaXRpYWxpemUgdGhlIERNQV9ESVIgbWVtYmVyICovDQogIERNQV9Jbml0U3RydWN0LT5ETUFfRElSID0gRE1BX0RJUl9QZXJpcGhlcmFsU1JDOw0KICAvKiBJbml0aWFsaXplIHRoZSBETUFfQnVmZmVyU2l6ZSBtZW1iZXIgKi8NCiAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9CdWZmZXJTaXplID0gMDsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BX1BlcmlwaGVyYWxJbmMgbWVtYmVyICovDQogIERNQV9Jbml0U3RydWN0LT5ETUFfUGVyaXBoZXJhbEluYyA9IERNQV9QZXJpcGhlcmFsSW5jX0Rpc2FibGU7DQogIC8qIEluaXRpYWxpemUgdGhlIERNQV9NZW1vcnlJbmMgbWVtYmVyICovDQogIERNQV9Jbml0U3RydWN0LT5ETUFfTWVtb3J5SW5jID0gRE1BX01lbW9yeUluY19EaXNhYmxlOw0KICAvKiBJbml0aWFsaXplIHRoZSBETUFfUGVyaXBoZXJhbERhdGFTaXplIG1lbWJlciAqLw0KICBETUFfSW5pdFN0cnVjdC0+RE1BX1BlcmlwaGVyYWxEYXRhU2l6ZSA9IERNQV9QZXJpcGhlcmFsRGF0YVNpemVfQnl0ZTsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BX01lbW9yeURhdGFTaXplIG1lbWJlciAqLw0KICBETUFfSW5pdFN0cnVjdC0+RE1BX01lbW9yeURhdGFTaXplID0gRE1BX01lbW9yeURhdGFTaXplX0J5dGU7DQogIC8qIEluaXRpYWxpemUgdGhlIERNQV9Nb2RlIG1lbWJlciAqLw0KICBETUFfSW5pdFN0cnVjdC0+RE1BX01vZGUgPSBETUFfTW9kZV9Ob3JtYWw7DQogIC8qIEluaXRpYWxpemUgdGhlIERNQV9Qcmlvcml0eSBtZW1iZXIgKi8NCiAgRE1BX0luaXRTdHJ1Y3QtPkRNQV9Qcmlvcml0eSA9IERNQV9Qcmlvcml0eV9Mb3c7DQogIC8qIEluaXRpYWxpemUgdGhlIERNQV9NMk0gbWVtYmVyICovDQogIERNQV9Jbml0U3RydWN0LT5ETUFfTTJNID0gRE1BX00yTV9EaXNhYmxlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBETUF5IENoYW5uZWx4Lg0KICAqIEBwYXJhbSAgRE1BeV9DaGFubmVseDogd2hlcmUgeSBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgRE1BIGFuZCANCiAgKiAgIHggY2FuIGJlIDEgdG8gNyBmb3IgRE1BMSBhbmQgMSB0byA1IGZvciBETUEyIHRvIHNlbGVjdCB0aGUgRE1BIENoYW5uZWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBETUF5IENoYW5uZWx4LiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIERNQV9DbWQoRE1BX0NoYW5uZWxfVHlwZURlZiogRE1BeV9DaGFubmVseCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9QRVJJUEgoRE1BeV9DaGFubmVseCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBETUF5IENoYW5uZWx4ICovDQogICAgRE1BeV9DaGFubmVseC0+Q0NSIHw9IERNQV9DQ1IxX0VOOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIERNQXkgQ2hhbm5lbHggKi8NCiAgICBETUF5X0NoYW5uZWx4LT5DQ1IgJj0gKHVpbnQxNl90KSh+RE1BX0NDUjFfRU4pOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIERNQXkgQ2hhbm5lbHggaW50ZXJydXB0cy4NCiAgKiBAcGFyYW0gIERNQXlfQ2hhbm5lbHg6IHdoZXJlIHkgY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIERNQSBhbmQgDQogICogICB4IGNhbiBiZSAxIHRvIDcgZm9yIERNQTEgYW5kIDEgdG8gNSBmb3IgRE1BMiB0byBzZWxlY3QgdGhlIERNQSBDaGFubmVsLg0KICAqIEBwYXJhbSAgRE1BX0lUOiBzcGVjaWZpZXMgdGhlIERNQSBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gYmUgZW5hYmxlZA0KICAqICAgb3IgZGlzYWJsZWQuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBETUFfSVRfVEM6ICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgbWFzaw0KICAqICAgICBAYXJnIERNQV9JVF9IVDogIEhhbGYgdHJhbnNmZXIgaW50ZXJydXB0IG1hc2sNCiAgKiAgICAgQGFyZyBETUFfSVRfVEU6ICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaw0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIERNQSBpbnRlcnJ1cHRzLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgRE1BX0lUQ29uZmlnKERNQV9DaGFubmVsX1R5cGVEZWYqIERNQXlfQ2hhbm5lbHgsIHVpbnQzMl90IERNQV9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9QRVJJUEgoRE1BeV9DaGFubmVseCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRE1BX0NPTkZJR19JVChETUFfSVQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIERNQSBpbnRlcnJ1cHRzICovDQogICAgRE1BeV9DaGFubmVseC0+Q0NSIHw9IERNQV9JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBETUEgaW50ZXJydXB0cyAqLw0KICAgIERNQXlfQ2hhbm5lbHgtPkNDUiAmPSB+RE1BX0lUOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgbnVtYmVyIG9mIGRhdGEgdW5pdHMgaW4gdGhlIGN1cnJlbnQgRE1BeSBDaGFubmVseCB0cmFuc2Zlci4NCiAgKiBAcGFyYW0gIERNQXlfQ2hhbm5lbHg6IHdoZXJlIHkgY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIERNQSBhbmQgDQogICogICAgICAgICB4IGNhbiBiZSAxIHRvIDcgZm9yIERNQTEgYW5kIDEgdG8gNSBmb3IgRE1BMiB0byBzZWxlY3QgdGhlIERNQSBDaGFubmVsLg0KICAqIEBwYXJhbSAgRGF0YU51bWJlcjogVGhlIG51bWJlciBvZiBkYXRhIHVuaXRzIGluIHRoZSBjdXJyZW50IERNQXkgQ2hhbm5lbHgNCiAgKiAgICAgICAgIHRyYW5zZmVyLiAgIA0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIERNQXlfQ2hhbm5lbHggaXMgZGlzYWJsZWQuICAgICAgICAgICAgICAgICANCiAgKiBAcmV0dmFsIE5vbmUuDQogICovDQp2b2lkIERNQV9TZXRDdXJyRGF0YUNvdW50ZXIoRE1BX0NoYW5uZWxfVHlwZURlZiogRE1BeV9DaGFubmVseCwgdWludDE2X3QgRGF0YU51bWJlcikNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfUEVSSVBIKERNQXlfQ2hhbm5lbHgpKTsNCiAgDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBETUF5IENoYW5uZWx4IENORFRSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogV3JpdGUgdG8gRE1BeSBDaGFubmVseCBDTkRUUiAqLw0KICBETUF5X0NoYW5uZWx4LT5DTkRUUiA9IERhdGFOdW1iZXI7ICANCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGRhdGEgdW5pdHMgaW4gdGhlIGN1cnJlbnQNCiAgKiAgIERNQXkgQ2hhbm5lbHggdHJhbnNmZXIuDQogICogQHBhcmFtICBETUF5X0NoYW5uZWx4OiB3aGVyZSB5IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBETUEgYW5kIA0KICAqICAgeCBjYW4gYmUgMSB0byA3IGZvciBETUExIGFuZCAxIHRvIDUgZm9yIERNQTIgdG8gc2VsZWN0IHRoZSBETUEgQ2hhbm5lbC4NCiAgKiBAcmV0dmFsIFRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGRhdGEgdW5pdHMgaW4gdGhlIGN1cnJlbnQgRE1BeSBDaGFubmVseA0KICAqICAgdHJhbnNmZXIuDQogICovDQp1aW50MTZfdCBETUFfR2V0Q3VyckRhdGFDb3VudGVyKERNQV9DaGFubmVsX1R5cGVEZWYqIERNQXlfQ2hhbm5lbHgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19ETUFfQUxMX1BFUklQSChETUF5X0NoYW5uZWx4KSk7DQogIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBkYXRhIHVuaXRzIGZvciBETUF5IENoYW5uZWx4ICovDQogIHJldHVybiAoKHVpbnQxNl90KShETUF5X0NoYW5uZWx4LT5DTkRUUikpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRE1BeSBDaGFubmVseCBmbGFnIGlzIHNldCBvciBub3QuDQogICogQHBhcmFtICBETUFfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfR0wxOiBETUExIENoYW5uZWwxIGdsb2JhbCBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19UQzE6IERNQTEgQ2hhbm5lbDEgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfSFQxOiBETUExIENoYW5uZWwxIGhhbGYgdHJhbnNmZXIgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEUxOiBETUExIENoYW5uZWwxIHRyYW5zZmVyIGVycm9yIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX0dMMjogRE1BMSBDaGFubmVsMiBnbG9iYWwgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEMyOiBETUExIENoYW5uZWwyIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX0hUMjogRE1BMSBDaGFubmVsMiBoYWxmIHRyYW5zZmVyIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX1RFMjogRE1BMSBDaGFubmVsMiB0cmFuc2ZlciBlcnJvciBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19HTDM6IERNQTEgQ2hhbm5lbDMgZ2xvYmFsIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX1RDMzogRE1BMSBDaGFubmVsMyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19IVDM6IERNQTEgQ2hhbm5lbDMgaGFsZiB0cmFuc2ZlciBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19URTM6IERNQTEgQ2hhbm5lbDMgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfR0w0OiBETUExIENoYW5uZWw0IGdsb2JhbCBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19UQzQ6IERNQTEgQ2hhbm5lbDQgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfSFQ0OiBETUExIENoYW5uZWw0IGhhbGYgdHJhbnNmZXIgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEU0OiBETUExIENoYW5uZWw0IHRyYW5zZmVyIGVycm9yIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX0dMNTogRE1BMSBDaGFubmVsNSBnbG9iYWwgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEM1OiBETUExIENoYW5uZWw1IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX0hUNTogRE1BMSBDaGFubmVsNSBoYWxmIHRyYW5zZmVyIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX1RFNTogRE1BMSBDaGFubmVsNSB0cmFuc2ZlciBlcnJvciBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19HTDY6IERNQTEgQ2hhbm5lbDYgZ2xvYmFsIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX1RDNjogRE1BMSBDaGFubmVsNiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19IVDY6IERNQTEgQ2hhbm5lbDYgaGFsZiB0cmFuc2ZlciBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19URTY6IERNQTEgQ2hhbm5lbDYgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfR0w3OiBETUExIENoYW5uZWw3IGdsb2JhbCBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19UQzc6IERNQTEgQ2hhbm5lbDcgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfSFQ3OiBETUExIENoYW5uZWw3IGhhbGYgdHJhbnNmZXIgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEU3OiBETUExIENoYW5uZWw3IHRyYW5zZmVyIGVycm9yIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX0dMMTogRE1BMiBDaGFubmVsMSBnbG9iYWwgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfVEMxOiBETUEyIENoYW5uZWwxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX0hUMTogRE1BMiBDaGFubmVsMSBoYWxmIHRyYW5zZmVyIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX1RFMTogRE1BMiBDaGFubmVsMSB0cmFuc2ZlciBlcnJvciBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19HTDI6IERNQTIgQ2hhbm5lbDIgZ2xvYmFsIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX1RDMjogRE1BMiBDaGFubmVsMiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19IVDI6IERNQTIgQ2hhbm5lbDIgaGFsZiB0cmFuc2ZlciBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19URTI6IERNQTIgQ2hhbm5lbDIgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfR0wzOiBETUEyIENoYW5uZWwzIGdsb2JhbCBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19UQzM6IERNQTIgQ2hhbm5lbDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfSFQzOiBETUEyIENoYW5uZWwzIGhhbGYgdHJhbnNmZXIgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfVEUzOiBETUEyIENoYW5uZWwzIHRyYW5zZmVyIGVycm9yIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX0dMNDogRE1BMiBDaGFubmVsNCBnbG9iYWwgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfVEM0OiBETUEyIENoYW5uZWw0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX0hUNDogRE1BMiBDaGFubmVsNCBoYWxmIHRyYW5zZmVyIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX1RFNDogRE1BMiBDaGFubmVsNCB0cmFuc2ZlciBlcnJvciBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19HTDU6IERNQTIgQ2hhbm5lbDUgZ2xvYmFsIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX1RDNTogRE1BMiBDaGFubmVsNSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19IVDU6IERNQTIgQ2hhbm5lbDUgaGFsZiB0cmFuc2ZlciBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19URTU6IERNQTIgQ2hhbm5lbDUgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgRE1BX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQogICovDQpGbGFnU3RhdHVzIERNQV9HZXRGbGFnU3RhdHVzKHVpbnQzMl90IERNQV9GTEFHKQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB1aW50MzJfdCB0bXByZWcgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRE1BX0dFVF9GTEFHKERNQV9GTEFHKSk7DQoNCiAgLyogQ2FsY3VsYXRlIHRoZSB1c2VkIERNQSAqLw0KICBpZiAoKERNQV9GTEFHICYgRkxBR19NYXNrKSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICAvKiBHZXQgRE1BMiBJU1IgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgICB0bXByZWcgPSBETUEyLT5JU1IgOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIEdldCBETUExIElTUiByZWdpc3RlciB2YWx1ZSAqLw0KICAgIHRtcHJlZyA9IERNQTEtPklTUiA7DQogIH0NCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgRE1BIGZsYWcgKi8NCiAgaWYgKCh0bXByZWcgJiBETUFfRkxBRykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICB7DQogICAgLyogRE1BX0ZMQUcgaXMgc2V0ICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERNQV9GTEFHIGlzIHJlc2V0ICovDQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgDQogIC8qIFJldHVybiB0aGUgRE1BX0ZMQUcgc3RhdHVzICovDQogIHJldHVybiAgYml0c3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgRE1BeSBDaGFubmVseCdzIHBlbmRpbmcgZmxhZ3MuDQogICogQHBhcmFtICBETUFfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiAoZm9yIHRoZSBzYW1lIERNQSkgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgRE1BMV9GTEFHX0dMMTogRE1BMSBDaGFubmVsMSBnbG9iYWwgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEMxOiBETUExIENoYW5uZWwxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX0hUMTogRE1BMSBDaGFubmVsMSBoYWxmIHRyYW5zZmVyIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX1RFMTogRE1BMSBDaGFubmVsMSB0cmFuc2ZlciBlcnJvciBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19HTDI6IERNQTEgQ2hhbm5lbDIgZ2xvYmFsIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX1RDMjogRE1BMSBDaGFubmVsMiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19IVDI6IERNQTEgQ2hhbm5lbDIgaGFsZiB0cmFuc2ZlciBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19URTI6IERNQTEgQ2hhbm5lbDIgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfR0wzOiBETUExIENoYW5uZWwzIGdsb2JhbCBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19UQzM6IERNQTEgQ2hhbm5lbDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfSFQzOiBETUExIENoYW5uZWwzIGhhbGYgdHJhbnNmZXIgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEUzOiBETUExIENoYW5uZWwzIHRyYW5zZmVyIGVycm9yIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX0dMNDogRE1BMSBDaGFubmVsNCBnbG9iYWwgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEM0OiBETUExIENoYW5uZWw0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX0hUNDogRE1BMSBDaGFubmVsNCBoYWxmIHRyYW5zZmVyIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX1RFNDogRE1BMSBDaGFubmVsNCB0cmFuc2ZlciBlcnJvciBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19HTDU6IERNQTEgQ2hhbm5lbDUgZ2xvYmFsIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX1RDNTogRE1BMSBDaGFubmVsNSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19IVDU6IERNQTEgQ2hhbm5lbDUgaGFsZiB0cmFuc2ZlciBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19URTU6IERNQTEgQ2hhbm5lbDUgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfR0w2OiBETUExIENoYW5uZWw2IGdsb2JhbCBmbGFnLg0KICAqICAgICBAYXJnIERNQTFfRkxBR19UQzY6IERNQTEgQ2hhbm5lbDYgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfSFQ2OiBETUExIENoYW5uZWw2IGhhbGYgdHJhbnNmZXIgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEU2OiBETUExIENoYW5uZWw2IHRyYW5zZmVyIGVycm9yIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX0dMNzogRE1BMSBDaGFubmVsNyBnbG9iYWwgZmxhZy4NCiAgKiAgICAgQGFyZyBETUExX0ZMQUdfVEM3OiBETUExIENoYW5uZWw3IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX0hUNzogRE1BMSBDaGFubmVsNyBoYWxmIHRyYW5zZmVyIGZsYWcuDQogICogICAgIEBhcmcgRE1BMV9GTEFHX1RFNzogRE1BMSBDaGFubmVsNyB0cmFuc2ZlciBlcnJvciBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19HTDE6IERNQTIgQ2hhbm5lbDEgZ2xvYmFsIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX1RDMTogRE1BMiBDaGFubmVsMSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19IVDE6IERNQTIgQ2hhbm5lbDEgaGFsZiB0cmFuc2ZlciBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19URTE6IERNQTIgQ2hhbm5lbDEgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfR0wyOiBETUEyIENoYW5uZWwyIGdsb2JhbCBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19UQzI6IERNQTIgQ2hhbm5lbDIgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfSFQyOiBETUEyIENoYW5uZWwyIGhhbGYgdHJhbnNmZXIgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfVEUyOiBETUEyIENoYW5uZWwyIHRyYW5zZmVyIGVycm9yIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX0dMMzogRE1BMiBDaGFubmVsMyBnbG9iYWwgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfVEMzOiBETUEyIENoYW5uZWwzIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX0hUMzogRE1BMiBDaGFubmVsMyBoYWxmIHRyYW5zZmVyIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX1RFMzogRE1BMiBDaGFubmVsMyB0cmFuc2ZlciBlcnJvciBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19HTDQ6IERNQTIgQ2hhbm5lbDQgZ2xvYmFsIGZsYWcuDQogICogICAgIEBhcmcgRE1BMl9GTEFHX1RDNDogRE1BMiBDaGFubmVsNCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19IVDQ6IERNQTIgQ2hhbm5lbDQgaGFsZiB0cmFuc2ZlciBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19URTQ6IERNQTIgQ2hhbm5lbDQgdHJhbnNmZXIgZXJyb3IgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfR0w1OiBETUEyIENoYW5uZWw1IGdsb2JhbCBmbGFnLg0KICAqICAgICBAYXJnIERNQTJfRkxBR19UQzU6IERNQTIgQ2hhbm5lbDUgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfSFQ1OiBETUEyIENoYW5uZWw1IGhhbGYgdHJhbnNmZXIgZmxhZy4NCiAgKiAgICAgQGFyZyBETUEyX0ZMQUdfVEU1OiBETUEyIENoYW5uZWw1IHRyYW5zZmVyIGVycm9yIGZsYWcuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIERNQV9DbGVhckZsYWcodWludDMyX3QgRE1BX0ZMQUcpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19ETUFfQ0xFQVJfRkxBRyhETUFfRkxBRykpOw0KICAvKiBDYWxjdWxhdGUgdGhlIHVzZWQgRE1BICovDQoNCiAgaWYgKChETUFfRkxBRyAmIEZMQUdfTWFzaykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICB7DQogICAgLyogQ2xlYXIgdGhlIHNlbGVjdGVkIERNQSBmbGFncyAqLw0KICAgIERNQTItPklGQ1IgPSBETUFfRkxBRzsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgRE1BIGZsYWdzICovDQogICAgRE1BMS0+SUZDUiA9IERNQV9GTEFHOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBETUF5IENoYW5uZWx4IGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KICAqIEBwYXJhbSAgRE1BX0lUOiBzcGVjaWZpZXMgdGhlIERNQSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgRE1BMV9JVF9HTDE6IERNQTEgQ2hhbm5lbDEgZ2xvYmFsIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX1RDMTogRE1BMSBDaGFubmVsMSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9IVDE6IERNQTEgQ2hhbm5lbDEgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9URTE6IERNQTEgQ2hhbm5lbDEgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfR0wyOiBETUExIENoYW5uZWwyIGdsb2JhbCBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9UQzI6IERNQTEgQ2hhbm5lbDIgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfSFQyOiBETUExIENoYW5uZWwyIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfVEUyOiBETUExIENoYW5uZWwyIHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX0dMMzogRE1BMSBDaGFubmVsMyBnbG9iYWwgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfVEMzOiBETUExIENoYW5uZWwzIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX0hUMzogRE1BMSBDaGFubmVsMyBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX1RFMzogRE1BMSBDaGFubmVsMyB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9HTDQ6IERNQTEgQ2hhbm5lbDQgZ2xvYmFsIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX1RDNDogRE1BMSBDaGFubmVsNCB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9IVDQ6IERNQTEgQ2hhbm5lbDQgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9URTQ6IERNQTEgQ2hhbm5lbDQgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfR0w1OiBETUExIENoYW5uZWw1IGdsb2JhbCBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9UQzU6IERNQTEgQ2hhbm5lbDUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfSFQ1OiBETUExIENoYW5uZWw1IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfVEU1OiBETUExIENoYW5uZWw1IHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX0dMNjogRE1BMSBDaGFubmVsNiBnbG9iYWwgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfVEM2OiBETUExIENoYW5uZWw2IHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX0hUNjogRE1BMSBDaGFubmVsNiBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX1RFNjogRE1BMSBDaGFubmVsNiB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9HTDc6IERNQTEgQ2hhbm5lbDcgZ2xvYmFsIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX1RDNzogRE1BMSBDaGFubmVsNyB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9IVDc6IERNQTEgQ2hhbm5lbDcgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9URTc6IERNQTEgQ2hhbm5lbDcgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfR0wxOiBETUEyIENoYW5uZWwxIGdsb2JhbCBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMl9JVF9UQzE6IERNQTIgQ2hhbm5lbDEgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfSFQxOiBETUEyIENoYW5uZWwxIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfVEUxOiBETUEyIENoYW5uZWwxIHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX0dMMjogRE1BMiBDaGFubmVsMiBnbG9iYWwgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfVEMyOiBETUEyIENoYW5uZWwyIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX0hUMjogRE1BMiBDaGFubmVsMiBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX1RFMjogRE1BMiBDaGFubmVsMiB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMl9JVF9HTDM6IERNQTIgQ2hhbm5lbDMgZ2xvYmFsIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX1RDMzogRE1BMiBDaGFubmVsMyB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMl9JVF9IVDM6IERNQTIgQ2hhbm5lbDMgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMl9JVF9URTM6IERNQTIgQ2hhbm5lbDMgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfR0w0OiBETUEyIENoYW5uZWw0IGdsb2JhbCBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMl9JVF9UQzQ6IERNQTIgQ2hhbm5lbDQgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfSFQ0OiBETUEyIENoYW5uZWw0IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfVEU0OiBETUEyIENoYW5uZWw0IHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX0dMNTogRE1BMiBDaGFubmVsNSBnbG9iYWwgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfVEM1OiBETUEyIENoYW5uZWw1IHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX0hUNTogRE1BMiBDaGFubmVsNSBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX1RFNTogRE1BMiBDaGFubmVsNSB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQogICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIERNQV9JVCAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCklUU3RhdHVzIERNQV9HZXRJVFN0YXR1cyh1aW50MzJfdCBETUFfSVQpDQp7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB1aW50MzJfdCB0bXByZWcgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRE1BX0dFVF9JVChETUFfSVQpKTsNCg0KICAvKiBDYWxjdWxhdGUgdGhlIHVzZWQgRE1BICovDQogIGlmICgoRE1BX0lUICYgRkxBR19NYXNrKSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICAvKiBHZXQgRE1BMiBJU1IgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgICB0bXByZWcgPSBETUEyLT5JU1IgOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIEdldCBETUExIElTUiByZWdpc3RlciB2YWx1ZSAqLw0KICAgIHRtcHJlZyA9IERNQTEtPklTUiA7DQogIH0NCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgRE1BIGludGVycnVwdCAqLw0KICBpZiAoKHRtcHJlZyAmIERNQV9JVCkgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICB7DQogICAgLyogRE1BX0lUIGlzIHNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBETUFfSVQgaXMgcmVzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICAvKiBSZXR1cm4gdGhlIERNQV9JVCBzdGF0dXMgKi8NCiAgcmV0dXJuICBiaXRzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBETUF5IENoYW5uZWx4knMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiAgKiBAcGFyYW0gIERNQV9JVDogc3BlY2lmaWVzIHRoZSBETUEgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiAoZm9yIHRoZSBzYW1lIERNQSkgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgRE1BMV9JVF9HTDE6IERNQTEgQ2hhbm5lbDEgZ2xvYmFsIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX1RDMTogRE1BMSBDaGFubmVsMSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9IVDE6IERNQTEgQ2hhbm5lbDEgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9URTE6IERNQTEgQ2hhbm5lbDEgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfR0wyOiBETUExIENoYW5uZWwyIGdsb2JhbCBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9UQzI6IERNQTEgQ2hhbm5lbDIgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfSFQyOiBETUExIENoYW5uZWwyIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfVEUyOiBETUExIENoYW5uZWwyIHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX0dMMzogRE1BMSBDaGFubmVsMyBnbG9iYWwgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfVEMzOiBETUExIENoYW5uZWwzIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX0hUMzogRE1BMSBDaGFubmVsMyBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX1RFMzogRE1BMSBDaGFubmVsMyB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9HTDQ6IERNQTEgQ2hhbm5lbDQgZ2xvYmFsIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX1RDNDogRE1BMSBDaGFubmVsNCB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9IVDQ6IERNQTEgQ2hhbm5lbDQgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9URTQ6IERNQTEgQ2hhbm5lbDQgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfR0w1OiBETUExIENoYW5uZWw1IGdsb2JhbCBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9UQzU6IERNQTEgQ2hhbm5lbDUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfSFQ1OiBETUExIENoYW5uZWw1IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfVEU1OiBETUExIENoYW5uZWw1IHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX0dMNjogRE1BMSBDaGFubmVsNiBnbG9iYWwgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTFfSVRfVEM2OiBETUExIENoYW5uZWw2IHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX0hUNjogRE1BMSBDaGFubmVsNiBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX1RFNjogRE1BMSBDaGFubmVsNiB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9HTDc6IERNQTEgQ2hhbm5lbDcgZ2xvYmFsIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUExX0lUX1RDNzogRE1BMSBDaGFubmVsNyB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9IVDc6IERNQTEgQ2hhbm5lbDcgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMV9JVF9URTc6IERNQTEgQ2hhbm5lbDcgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfR0wxOiBETUEyIENoYW5uZWwxIGdsb2JhbCBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMl9JVF9UQzE6IERNQTIgQ2hhbm5lbDEgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfSFQxOiBETUEyIENoYW5uZWwxIGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfVEUxOiBETUEyIENoYW5uZWwxIHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX0dMMjogRE1BMiBDaGFubmVsMiBnbG9iYWwgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfVEMyOiBETUEyIENoYW5uZWwyIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX0hUMjogRE1BMiBDaGFubmVsMiBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX1RFMjogRE1BMiBDaGFubmVsMiB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMl9JVF9HTDM6IERNQTIgQ2hhbm5lbDMgZ2xvYmFsIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX1RDMzogRE1BMiBDaGFubmVsMyB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMl9JVF9IVDM6IERNQTIgQ2hhbm5lbDMgaGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMl9JVF9URTM6IERNQTIgQ2hhbm5lbDMgdHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfR0w0OiBETUEyIENoYW5uZWw0IGdsb2JhbCBpbnRlcnJ1cHQuDQogICogICAgIEBhcmcgRE1BMl9JVF9UQzQ6IERNQTIgQ2hhbm5lbDQgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfSFQ0OiBETUEyIENoYW5uZWw0IGhhbGYgdHJhbnNmZXIgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfVEU0OiBETUEyIENoYW5uZWw0IHRyYW5zZmVyIGVycm9yIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX0dMNTogRE1BMiBDaGFubmVsNSBnbG9iYWwgaW50ZXJydXB0Lg0KICAqICAgICBAYXJnIERNQTJfSVRfVEM1OiBETUEyIENoYW5uZWw1IHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX0hUNTogRE1BMiBDaGFubmVsNSBoYWxmIHRyYW5zZmVyIGludGVycnVwdC4NCiAgKiAgICAgQGFyZyBETUEyX0lUX1RFNTogRE1BMiBDaGFubmVsNSB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIERNQV9DbGVhcklUUGVuZGluZ0JpdCh1aW50MzJfdCBETUFfSVQpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19ETUFfQ0xFQVJfSVQoRE1BX0lUKSk7DQoNCiAgLyogQ2FsY3VsYXRlIHRoZSB1c2VkIERNQSAqLw0KICBpZiAoKERNQV9JVCAmIEZMQUdfTWFzaykgIT0gKHVpbnQzMl90KVJFU0VUKQ0KICB7DQogICAgLyogQ2xlYXIgdGhlIHNlbGVjdGVkIERNQSBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzICovDQogICAgRE1BMi0+SUZDUiA9IERNQV9JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgRE1BIGludGVycnVwdCBwZW5kaW5nIGJpdHMgKi8NCiAgICBETUExLT5JRkNSID0gRE1BX0lUOw0KICB9DQp9DQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=