LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF90aW0uYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjMuNC4wDQogICogQGRhdGUgICAgMTAvMTUvMjAxMA0KICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIFRJTSBmaXJtd2FyZSBmdW5jdGlvbnMuDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLyANCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfdGltLmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIFRJTSANCiAgKiBAYnJpZWYgVElNIGRyaXZlciBtb2R1bGVzDQogICogQHsNCiAgKi8NCg0KLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9UeXBlc0RlZmluaXRpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9EZWZpbmVzDQogICogQHsNCiAgKi8NCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUSU0gcmVnaXN0ZXJzIGJpdCBtYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KI2RlZmluZSBTTUNSX0VUUl9NYXNrICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwRkYpIA0KI2RlZmluZSBDQ01SX09mZnNldCAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMTgpDQojZGVmaW5lIENDRVJfQ0NFX1NldCAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMSkgIA0KI2RlZmluZQlDQ0VSX0NDTkVfU2V0ICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDQpIA0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX01hY3Jvcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfVmFyaWFibGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KDQpzdGF0aWMgdm9pZCBUSTFfQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQb2xhcml0eSwgdWludDE2X3QgVElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNGaWx0ZXIpOw0Kc3RhdGljIHZvaWQgVEkyX0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lDUG9sYXJpdHksIHVpbnQxNl90IFRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgVElNX0lDRmlsdGVyKTsNCnN0YXRpYyB2b2lkIFRJM19Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFRJTV9JQ0ZpbHRlcik7DQpzdGF0aWMgdm9pZCBUSTRfQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQb2xhcml0eSwgdWludDE2X3QgVElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNGaWx0ZXIpOw0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9NYWNyb3MNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX1ZhcmlhYmxlcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgVElNX1ByaXZhdGVfRnVuY3Rpb25Qcm90b3R5cGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIFRJTXggcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIHRvIDE3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9EZUluaXQoVElNX1R5cGVEZWYqIFRJTXgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fQUxMX1BFUklQSChUSU14KSk7IA0KIA0KICBpZiAoVElNeCA9PSBUSU0xKQ0KICB7DQogICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU0xLCBFTkFCTEUpOw0KICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNMSwgRElTQUJMRSk7ICANCiAgfSAgICAgDQogIGVsc2UgaWYgKFRJTXggPT0gVElNMikNCiAgew0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMiwgRU5BQkxFKTsNCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTIsIERJU0FCTEUpOw0KICB9DQogIGVsc2UgaWYgKFRJTXggPT0gVElNMykNCiAgew0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMywgRU5BQkxFKTsNCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTMsIERJU0FCTEUpOw0KICB9DQogIGVsc2UgaWYgKFRJTXggPT0gVElNNCkNCiAgew0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNNCwgRU5BQkxFKTsNCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTQsIERJU0FCTEUpOw0KICB9IA0KICBlbHNlIGlmIChUSU14ID09IFRJTTUpDQogIHsNCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTUsIEVOQUJMRSk7DQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU01LCBESVNBQkxFKTsNCiAgfSANCiAgZWxzZSBpZiAoVElNeCA9PSBUSU02KQ0KICB7DQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU02LCBFTkFCTEUpOw0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNNiwgRElTQUJMRSk7DQogIH0gDQogIGVsc2UgaWYgKFRJTXggPT0gVElNNykNCiAgew0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNNywgRU5BQkxFKTsNCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTcsIERJU0FCTEUpOw0KICB9IA0KICBlbHNlIGlmIChUSU14ID09IFRJTTgpDQogIHsNCiAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTgsIEVOQUJMRSk7DQogICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU04LCBESVNBQkxFKTsNCiAgfQ0KICBlbHNlIGlmIChUSU14ID09IFRJTTkpDQogIHsgICAgICANCiAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTksIEVOQUJMRSk7DQogICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU05LCBESVNBQkxFKTsgIA0KICAgfSAgDQogIGVsc2UgaWYgKFRJTXggPT0gVElNMTApDQogIHsgICAgICANCiAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTEwLCBFTkFCTEUpOw0KICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNMTAsIERJU0FCTEUpOyAgDQogIH0gIA0KICBlbHNlIGlmIChUSU14ID09IFRJTTExKSANCiAgeyAgICAgDQogICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU0xMSwgRU5BQkxFKTsNCiAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTExLCBESVNBQkxFKTsgIA0KICB9ICANCiAgZWxzZSBpZiAoVElNeCA9PSBUSU0xMikNCiAgeyAgICAgIA0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMTIsIEVOQUJMRSk7DQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU0xMiwgRElTQUJMRSk7ICANCiAgfSAgDQogIGVsc2UgaWYgKFRJTXggPT0gVElNMTMpIA0KICB7ICAgICAgIA0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMTMsIEVOQUJMRSk7DQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9USU0xMywgRElTQUJMRSk7ICANCiAgfQ0KICBlbHNlIGlmIChUSU14ID09IFRJTTE0KSANCiAgeyAgICAgICANCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTE0LCBFTkFCTEUpOw0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVElNMTQsIERJU0FCTEUpOyAgDQogIH0gICAgICAgIA0KICBlbHNlIGlmIChUSU14ID09IFRJTTE1KQ0KICB7DQogICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU0xNSwgRU5BQkxFKTsNCiAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTE1LCBESVNBQkxFKTsNCiAgfSANCiAgZWxzZSBpZiAoVElNeCA9PSBUSU0xNikNCiAgew0KICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNMTYsIEVOQUJMRSk7DQogICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9USU0xNiwgRElTQUJMRSk7DQogIH0gDQogIGVsc2UNCiAgew0KICAgIGlmIChUSU14ID09IFRJTTE3KQ0KICAgIHsNCiAgICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVElNMTcsIEVOQUJMRSk7DQogICAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1RJTTE3LCBESVNBQkxFKTsNCiAgICB9ICANCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU14IFRpbWUgQmFzZSBVbml0IHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIA0KICAqICAgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fVGltZUJhc2VJbml0U3RydWN0Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX1RpbWVCYXNlSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9UaW1lQmFzZUluaXRUeXBlRGVmDQogICogICBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1RpbWVCYXNlSW5pdChUSU1fVHlwZURlZiogVElNeCwgVElNX1RpbWVCYXNlSW5pdFR5cGVEZWYqIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QpDQp7DQogIHVpbnQxNl90IHRtcGNyMSA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsgDQogIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9Db3VudGVyTW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0NLRF9ESVYoVElNX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNX0Nsb2NrRGl2aXNpb24pKTsNCg0KICB0bXBjcjEgPSBUSU14LT5DUjE7ICANCg0KICBpZigoVElNeCA9PSBUSU0xKSB8fCAoVElNeCA9PSBUSU04KXx8IChUSU14ID09IFRJTTIpIHx8IChUSU14ID09IFRJTTMpfHwNCiAgICAgKFRJTXggPT0gVElNNCkgfHwgKFRJTXggPT0gVElNNSkpIA0KICB7DQogICAgLyogU2VsZWN0IHRoZSBDb3VudGVyIE1vZGUgKi8NCiAgICB0bXBjcjEgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdCkoVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUykpKTsNCiAgICB0bXBjcjEgfD0gKHVpbnQzMl90KVRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9Db3VudGVyTW9kZTsNCiAgfQ0KIA0KICBpZigoVElNeCAhPSBUSU02KSAmJiAoVElNeCAhPSBUSU03KSkNCiAgew0KICAgIC8qIFNldCB0aGUgY2xvY2sgZGl2aXNpb24gKi8NCiAgICB0bXBjcjEgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ1IxX0NLRCkpOw0KICAgIHRtcGNyMSB8PSAodWludDMyX3QpVElNX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNX0Nsb2NrRGl2aXNpb247DQogIH0NCg0KICBUSU14LT5DUjEgPSB0bXBjcjE7DQoNCiAgLyogU2V0IHRoZSBBdXRvcmVsb2FkIHZhbHVlICovDQogIFRJTXgtPkFSUiA9IFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9QZXJpb2QgOw0KIA0KICAvKiBTZXQgdGhlIFByZXNjYWxlciB2YWx1ZSAqLw0KICBUSU14LT5QU0MgPSBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fUHJlc2NhbGVyOw0KICAgIA0KICBpZiAoKFRJTXggPT0gVElNMSkgfHwgKFRJTXggPT0gVElNOCl8fCAoVElNeCA9PSBUSU0xNSl8fCAoVElNeCA9PSBUSU0xNikgfHwgKFRJTXggPT0gVElNMTcpKSAgDQogIHsNCiAgICAvKiBTZXQgdGhlIFJlcGV0aXRpb24gQ291bnRlciB2YWx1ZSAqLw0KICAgIFRJTXgtPlJDUiA9IFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9SZXBldGl0aW9uQ291bnRlcjsNCiAgfQ0KDQogIC8qIEdlbmVyYXRlIGFuIHVwZGF0ZSBldmVudCB0byByZWxvYWQgdGhlIFByZXNjYWxlciBhbmQgdGhlIFJlcGV0aXRpb24gY291bnRlcg0KICAgICB2YWx1ZXMgaW1tZWRpYXRlbHkgKi8NCiAgVElNeC0+RUdSID0gVElNX1BTQ1JlbG9hZE1vZGVfSW1tZWRpYXRlOyAgICAgICAgICAgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTXggQ2hhbm5lbDEgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ0luaXRTdHJ1Y3QuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSB0byAxNyBleGNlcHQgNiBhbmQgNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9PQ0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KICAqICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DMUluaXQoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9PQ0luaXRUeXBlRGVmKiBUSU1fT0NJbml0U3RydWN0KQ0Kew0KICB1aW50MTZfdCB0bXBjY21yeCA9IDAsIHRtcGNjZXIgPSAwLCB0bXBjcjIgPSAwOw0KICAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDhfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19NT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PVVRQVVRfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dFN0YXRlKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkpKTsgICANCiAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLw0KICBUSU14LT5DQ0VSICY9ICh1aW50MTZfdCkofih1aW50MTZfdClUSU1fQ0NFUl9DQzFFKTsNCiAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY3IyID0gIFRJTXgtPkNSMjsNCiAgDQogIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXBjY21yeCA9IFRJTXgtPkNDTVIxOw0KICAgIA0KICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovDQogIHRtcGNjbXJ4ICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDTVIxX09DMU0pKTsNCiAgdG1wY2NtcnggJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MxUykpOw0KDQogIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLw0KICB0bXBjY21yeCB8PSBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlOw0KICANCiAgLyogUmVzZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLw0KICB0bXBjY2VyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0MxUCkpOw0KICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovDQogIHRtcGNjZXIgfD0gVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHk7DQogIA0KICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLw0KICB0bXBjY2VyIHw9IFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXRTdGF0ZTsNCiAgICANCiAgaWYoKFRJTXggPT0gVElNMSkgfHwgKFRJTXggPT0gVElNOCl8fCAoVElNeCA9PSBUSU0xNSl8fA0KICAgICAoVElNeCA9PSBUSU0xNil8fCAoVElNeCA9PSBUSU0xNykpDQogIHsNCiAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09VVFBVVE5fU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dE5TdGF0ZSkpOw0KICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOX1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05Qb2xhcml0eSkpOw0KICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOSURMRV9TVEFURShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NOSWRsZVN0YXRlKSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0lETEVfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX09DSWRsZVN0YXRlKSk7DQogICAgDQogICAgLyogUmVzZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5IGxldmVsICovDQogICAgdG1wY2NlciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMU5QKSk7DQogICAgLyogU2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSAqLw0KICAgIHRtcGNjZXIgfD0gVElNX09DSW5pdFN0cnVjdC0+VElNX09DTlBvbGFyaXR5Ow0KICAgIA0KICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBTdGF0ZSAqLw0KICAgIHRtcGNjZXIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzFORSkpOyAgICANCiAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFN0YXRlICovDQogICAgdG1wY2NlciB8PSBUSU1fT0NJbml0U3RydWN0LT5USU1fT3V0cHV0TlN0YXRlOw0KICAgIA0KICAgIC8qIFJlc2V0IHRoZSBPdXB1dCBDb21wYXJlIGFuZCBPdXRwdXQgQ29tcGFyZSBOIElETEUgU3RhdGUgKi8NCiAgICB0bXBjcjIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ1IyX09JUzEpKTsNCiAgICB0bXBjcjIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ1IyX09JUzFOKSk7DQogICAgDQogICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLw0KICAgIHRtcGNyMiB8PSBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NJZGxlU3RhdGU7DQogICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovDQogICAgdG1wY3IyIHw9IFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05JZGxlU3RhdGU7DQogIH0NCiAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8NCiAgVElNeC0+Q1IyID0gdG1wY3IyOw0KICANCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLw0KICBUSU14LT5DQ01SMSA9IHRtcGNjbXJ4Ow0KDQogIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTXgtPkNDUjEgPSBUSU1fT0NJbml0U3RydWN0LT5USU1fUHVsc2U7IA0KIA0KICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCiAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTXggQ2hhbm5lbDIgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ0luaXRTdHJ1Y3QuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IA0KICAqICAgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9PQ0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KICAqICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DMkluaXQoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9PQ0luaXRUeXBlRGVmKiBUSU1fT0NJbml0U3RydWN0KQ0Kew0KICB1aW50MTZfdCB0bXBjY21yeCA9IDAsIHRtcGNjZXIgPSAwLCB0bXBjcjIgPSAwOw0KICAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsgDQogIGFzc2VydF9wYXJhbShJU19USU1fT0NfTU9ERShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT1VUUFVUX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXRTdGF0ZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5KSk7ICAgDQogICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQzJFIEJpdCAqLw0KICBUSU14LT5DQ0VSICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0MyRSkpOw0KICANCiAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8gIA0KICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCiAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXBjcjIgPSAgVElNeC0+Q1IyOw0KICANCiAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjE7DQogICAgDQogIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBtb2RlIGFuZCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8NCiAgdG1wY2NtcnggJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MyTSkpOw0KICB0bXBjY21yeCAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ01SMV9DQzJTKSk7DQogIA0KICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8NCiAgdG1wY2NtcnggfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlIDw8IDgpOw0KICANCiAgLyogUmVzZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLw0KICB0bXBjY2VyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0MyUCkpOw0KICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovDQogIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NQb2xhcml0eSA8PCA0KTsNCiAgDQogIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovDQogIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT3V0cHV0U3RhdGUgPDwgNCk7DQogICAgDQogIGlmKChUSU14ID09IFRJTTEpIHx8IChUSU14ID09IFRJTTgpKQ0KICB7DQogICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PVVRQVVROX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXROU3RhdGUpKTsNCiAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NOUG9sYXJpdHkpKTsNCiAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTklETEVfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX09DTklkbGVTdGF0ZSkpOw0KICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NJRExFX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ0lkbGVTdGF0ZSkpOw0KICAgIA0KICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSBsZXZlbCAqLw0KICAgIHRtcGNjZXIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzJOUCkpOw0KICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgKi8NCiAgICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DTlBvbGFyaXR5IDw8IDQpOw0KICAgIA0KICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBTdGF0ZSAqLw0KICAgIHRtcGNjZXIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzJORSkpOyAgICANCiAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFN0YXRlICovDQogICAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXROU3RhdGUgPDwgNCk7DQogICAgDQogICAgLyogUmVzZXQgdGhlIE91cHV0IENvbXBhcmUgYW5kIE91dHB1dCBDb21wYXJlIE4gSURMRSBTdGF0ZSAqLw0KICAgIHRtcGNyMiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DUjJfT0lTMikpOw0KICAgIHRtcGNyMiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DUjJfT0lTMk4pKTsNCiAgICANCiAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovDQogICAgdG1wY3IyIHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DSWRsZVN0YXRlIDw8IDIpOw0KICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gSWRsZSBzdGF0ZSAqLw0KICAgIHRtcGNyMiB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05JZGxlU3RhdGUgPDwgMik7DQogIH0NCiAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8NCiAgVElNeC0+Q1IyID0gdG1wY3IyOw0KICANCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLw0KICBUSU14LT5DQ01SMSA9IHRtcGNjbXJ4Ow0KDQogIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTXgtPkNDUjIgPSBUSU1fT0NJbml0U3RydWN0LT5USU1fUHVsc2U7DQogIA0KICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCiAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTXggQ2hhbm5lbDMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ0luaXRTdHJ1Y3QuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNX09DSW5pdFR5cGVEZWYgc3RydWN0dXJlDQogICogICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRJTSBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MzSW5pdChUSU1fVHlwZURlZiogVElNeCwgVElNX09DSW5pdFR5cGVEZWYqIFRJTV9PQ0luaXRTdHJ1Y3QpDQp7DQogIHVpbnQxNl90IHRtcGNjbXJ4ID0gMCwgdG1wY2NlciA9IDAsIHRtcGNyMiA9IDA7DQogICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOyANCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19NT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PVVRQVVRfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dFN0YXRlKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkpKTsgICANCiAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8NCiAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDM0UpKTsNCiAgDQogIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcGNyMiA9ICBUSU14LT5DUjI7DQogIA0KICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY2NtcnggPSBUSU14LT5DQ01SMjsNCiAgICANCiAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIG1vZGUgYW5kIENhcHR1cmUvQ29tcGFyZSBzZWxlY3Rpb24gQml0cyAqLw0KICB0bXBjY21yeCAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzNNKSk7DQogIHRtcGNjbXJ4ICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDTVIyX0NDM1MpKTsgIA0KICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8NCiAgdG1wY2NtcnggfD0gVElNX09DSW5pdFN0cnVjdC0+VElNX09DTW9kZTsNCiAgDQogIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8NCiAgdG1wY2NlciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDM1ApKTsNCiAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLw0KICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkgPDwgOCk7DQogIA0KICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLw0KICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dFN0YXRlIDw8IDgpOw0KICAgIA0KICBpZigoVElNeCA9PSBUSU0xKSB8fCAoVElNeCA9PSBUSU04KSkNCiAgew0KICAgIGFzc2VydF9wYXJhbShJU19USU1fT1VUUFVUTl9TVEFURShUSU1fT0NJbml0U3RydWN0LT5USU1fT3V0cHV0TlN0YXRlKSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05fUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DTlBvbGFyaXR5KSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05JRExFX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05JZGxlU3RhdGUpKTsNCiAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DSURMRV9TVEFURShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NJZGxlU3RhdGUpKTsNCiAgICANCiAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgbGV2ZWwgKi8NCiAgICB0bXBjY2VyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0MzTlApKTsNCiAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5ICovDQogICAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05Qb2xhcml0eSA8PCA4KTsNCiAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gU3RhdGUgKi8NCiAgICB0bXBjY2VyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDRVJfQ0MzTkUpKTsNCiAgICANCiAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFN0YXRlICovDQogICAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PdXRwdXROU3RhdGUgPDwgOCk7DQogICAgLyogUmVzZXQgdGhlIE91cHV0IENvbXBhcmUgYW5kIE91dHB1dCBDb21wYXJlIE4gSURMRSBTdGF0ZSAqLw0KICAgIHRtcGNyMiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DUjJfT0lTMykpOw0KICAgIHRtcGNyMiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DUjJfT0lTM04pKTsNCiAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovDQogICAgdG1wY3IyIHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DSWRsZVN0YXRlIDw8IDQpOw0KICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gSWRsZSBzdGF0ZSAqLw0KICAgIHRtcGNyMiB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05JZGxlU3RhdGUgPDwgNCk7DQogIH0NCiAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8NCiAgVElNeC0+Q1IyID0gdG1wY3IyOw0KICANCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLw0KICBUSU14LT5DQ01SMiA9IHRtcGNjbXJ4Ow0KDQogIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTXgtPkNDUjMgPSBUSU1fT0NJbml0U3RydWN0LT5USU1fUHVsc2U7DQogIA0KICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCiAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTXggQ2hhbm5lbDQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ0luaXRTdHJ1Y3QuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNX09DSW5pdFR5cGVEZWYgc3RydWN0dXJlDQogICogICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRJTSBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0M0SW5pdChUSU1fVHlwZURlZiogVElNeCwgVElNX09DSW5pdFR5cGVEZWYqIFRJTV9PQ0luaXRTdHJ1Y3QpDQp7DQogIHVpbnQxNl90IHRtcGNjbXJ4ID0gMCwgdG1wY2NlciA9IDAsIHRtcGNyMiA9IDA7DQogICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOyANCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19NT0RFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PVVRQVVRfU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dFN0YXRlKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkpKTsgICANCiAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0M0RSBCaXQgKi8NCiAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDNEUpKTsNCiAgDQogIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcGNyMiA9ICBUSU14LT5DUjI7DQogIA0KICAvKiBHZXQgdGhlIFRJTXggQ0NNUjIgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY2NtcnggPSBUSU14LT5DQ01SMjsNCiAgICANCiAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIG1vZGUgYW5kIENhcHR1cmUvQ29tcGFyZSBzZWxlY3Rpb24gQml0cyAqLw0KICB0bXBjY21yeCAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzRNKSk7DQogIHRtcGNjbXJ4ICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NDTVIyX0NDNFMpKTsNCiAgDQogIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLw0KICB0bXBjY21yeCB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGUgPDwgOCk7DQogIA0KICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovDQogIHRtcGNjZXIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzRQKSk7DQogIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8NCiAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5IDw8IDEyKTsNCiAgDQogIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovDQogIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fT0NJbml0U3RydWN0LT5USU1fT3V0cHV0U3RhdGUgPDwgMTIpOw0KICAgIA0KICBpZigoVElNeCA9PSBUSU0xKSB8fCAoVElNeCA9PSBUSU04KSkNCiAgew0KICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NJRExFX1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ0lkbGVTdGF0ZSkpOw0KICAgIC8qIFJlc2V0IHRoZSBPdXB1dCBDb21wYXJlIElETEUgU3RhdGUgKi8NCiAgICB0bXBjcjIgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ1IyX09JUzQpKTsNCiAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovDQogICAgdG1wY3IyIHw9ICh1aW50MTZfdCkoVElNX09DSW5pdFN0cnVjdC0+VElNX09DSWRsZVN0YXRlIDw8IDYpOw0KICB9DQogIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovDQogIFRJTXgtPkNSMiA9IHRtcGNyMjsNCiAgDQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgKi8gIA0KICBUSU14LT5DQ01SMiA9IHRtcGNjbXJ4Ow0KDQogIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTXgtPkNDUjQgPSBUSU1fT0NJbml0U3RydWN0LT5USU1fUHVsc2U7DQogIA0KICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8NCiAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQogICogICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSUNJbml0U3RydWN0Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEgdG8gMTcgZXhjZXB0IDYgYW5kIDcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fSUNJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiAgKiAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVElNIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9JQ0luaXQoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9JQ0luaXRUeXBlRGVmKiBUSU1fSUNJbml0U3RydWN0KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0NIQU5ORUwoVElNX0lDSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwpKTsgIA0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1NFTEVDVElPTihUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24pKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlcikpOw0KICANCiAgaWYoKFRJTXggPT0gVElNMSkgfHwgKFRJTXggPT0gVElNOCkgfHwgKFRJTXggPT0gVElNMikgfHwgKFRJTXggPT0gVElNMykgfHwNCiAgICAgKFRJTXggPT0gVElNNCkgfHwoVElNeCA9PSBUSU01KSkNCiAgew0KICAgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHkpKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZX0xJVEUoVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHkpKTsNCiAgfQ0KICBpZiAoVElNX0lDSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMSkNCiAgew0KICAgIGFzc2VydF9wYXJhbShJU19USU1fTElTVDhfUEVSSVBIKFRJTXgpKTsNCiAgICAvKiBUSTEgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJMV9Db25maWcoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHksDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KICAgIC8qIFNldCB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIgdmFsdWUgKi8NCiAgICBUSU1fU2V0SUMxUHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQogIH0NCiAgZWxzZSBpZiAoVElNX0lDSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMikNCiAgew0KICAgIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCiAgICAvKiBUSTIgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJMl9Db25maWcoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHksDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KICAgIC8qIFNldCB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIgdmFsdWUgKi8NCiAgICBUSU1fU2V0SUMyUHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQogIH0NCiAgZWxzZSBpZiAoVElNX0lDSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMykNCiAgew0KICAgIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCiAgICAvKiBUSTMgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJM19Db25maWcoVElNeCwgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5LA0KICAgICAgICAgICAgICAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDRmlsdGVyKTsNCiAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQogICAgVElNX1NldElDM1ByZXNjYWxlcihUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQcmVzY2FsZXIpOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCiAgICAvKiBUSTQgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJNF9Db25maWcoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHksDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KICAgIC8qIFNldCB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIgdmFsdWUgKi8NCiAgICBUSU1fU2V0SUM0UHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU0gcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KICAqICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX0lDSW5pdFN0cnVjdCB0byBtZWFzdXJlIGFuIGV4dGVybmFsIFBXTSBzaWduYWwuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fSUNJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiAgKiAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVElNIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9QV01JQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fSUNJbml0VHlwZURlZiogVElNX0lDSW5pdFN0cnVjdCkNCnsNCiAgdWludDE2X3QgaWNvcHBvc2l0ZXBvbGFyaXR5ID0gVElNX0lDUG9sYXJpdHlfUmlzaW5nOw0KICB1aW50MTZfdCBpY29wcG9zaXRlc2VsZWN0aW9uID0gVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q2X1BFUklQSChUSU14KSk7DQogIC8qIFNlbGVjdCB0aGUgT3Bwb3NpdGUgSW5wdXQgUG9sYXJpdHkgKi8NCiAgaWYgKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5ID09IFRJTV9JQ1BvbGFyaXR5X1Jpc2luZykNCiAgew0KICAgIGljb3Bwb3NpdGVwb2xhcml0eSA9IFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmc7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgaWNvcHBvc2l0ZXBvbGFyaXR5ID0gVElNX0lDUG9sYXJpdHlfUmlzaW5nOw0KICB9DQogIC8qIFNlbGVjdCB0aGUgT3Bwb3NpdGUgSW5wdXQgKi8NCiAgaWYgKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiA9PSBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEkpDQogIHsNCiAgICBpY29wcG9zaXRlc2VsZWN0aW9uID0gVElNX0lDU2VsZWN0aW9uX0luZGlyZWN0VEk7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgaWNvcHBvc2l0ZXNlbGVjdGlvbiA9IFRJTV9JQ1NlbGVjdGlvbl9EaXJlY3RUSTsNCiAgfQ0KICBpZiAoVElNX0lDSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMSkNCiAgew0KICAgIC8qIFRJMSBDb25maWd1cmF0aW9uICovDQogICAgVEkxX0NvbmZpZyhUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQb2xhcml0eSwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDRmlsdGVyKTsNCiAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQogICAgVElNX1NldElDMVByZXNjYWxlcihUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQcmVzY2FsZXIpOw0KICAgIC8qIFRJMiBDb25maWd1cmF0aW9uICovDQogICAgVEkyX0NvbmZpZyhUSU14LCBpY29wcG9zaXRlcG9sYXJpdHksIGljb3Bwb3NpdGVzZWxlY3Rpb24sIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlcik7DQogICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgIFRJTV9TZXRJQzJQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCiAgfQ0KICBlbHNlDQogIHsgDQogICAgLyogVEkyIENvbmZpZ3VyYXRpb24gKi8NCiAgICBUSTJfQ29uZmlnKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KICAgIC8qIFNldCB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIgdmFsdWUgKi8NCiAgICBUSU1fU2V0SUMyUHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQogICAgLyogVEkxIENvbmZpZ3VyYXRpb24gKi8NCiAgICBUSTFfQ29uZmlnKFRJTXgsIGljb3Bwb3NpdGVwb2xhcml0eSwgaWNvcHBvc2l0ZXNlbGVjdGlvbiwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDRmlsdGVyKTsNCiAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQogICAgVElNX1NldElDMVByZXNjYWxlcihUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQcmVzY2FsZXIpOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGU6IEJyZWFrIGZlYXR1cmUsIGRlYWQgdGltZSwgTG9jayBsZXZlbCwgdGhlIE9TU0ksDQogICogICB0aGUgT1NTUiBTdGF0ZSBhbmQgdGhlIEFPRShhdXRvbWF0aWMgb3V0cHV0IGVuYWJsZSkuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIA0KICAqIEBwYXJhbSAgVElNX0JEVFJJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNX0JEVFJJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KICAqICAgY29udGFpbnMgdGhlIEJEVFIgUmVnaXN0ZXIgY29uZmlndXJhdGlvbiAgaW5mb3JtYXRpb24gZm9yIHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0JEVFJDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9CRFRSSW5pdFR5cGVEZWYgKlRJTV9CRFRSSW5pdFN0cnVjdCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUMl9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09TU1JfU1RBVEUoVElNX0JEVFJJbml0U3RydWN0LT5USU1fT1NTUlN0YXRlKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT1NTSV9TVEFURShUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9PU1NJU3RhdGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MT0NLX0xFVkVMKFRJTV9CRFRSSW5pdFN0cnVjdC0+VElNX0xPQ0tMZXZlbCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX1NUQVRFKFRJTV9CRFRSSW5pdFN0cnVjdC0+VElNX0JyZWFrKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfUE9MQVJJVFkoVElNX0JEVFJJbml0U3RydWN0LT5USU1fQnJlYWtQb2xhcml0eSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoVElNX0JEVFJJbml0U3RydWN0LT5USU1fQXV0b21hdGljT3V0cHV0KSk7DQogIC8qIFNldCB0aGUgTG9jayBsZXZlbCwgdGhlIEJyZWFrIGVuYWJsZSBCaXQgYW5kIHRoZSBQbG9hcml0eSwgdGhlIE9TU1IgU3RhdGUsDQogICAgIHRoZSBPU1NJIFN0YXRlLCB0aGUgZGVhZCB0aW1lIHZhbHVlIGFuZCB0aGUgQXV0b21hdGljIE91dHB1dCBFbmFibGUgQml0ICovDQogIFRJTXgtPkJEVFIgPSAodWludDMyX3QpVElNX0JEVFJJbml0U3RydWN0LT5USU1fT1NTUlN0YXRlIHwgVElNX0JEVFJJbml0U3RydWN0LT5USU1fT1NTSVN0YXRlIHwNCiAgICAgICAgICAgICBUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9MT0NLTGV2ZWwgfCBUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9EZWFkVGltZSB8DQogICAgICAgICAgICAgVElNX0JEVFJJbml0U3RydWN0LT5USU1fQnJlYWsgfCBUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9CcmVha1BvbGFyaXR5IHwNCiAgICAgICAgICAgICBUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9BdXRvbWF0aWNPdXRwdXQ7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBUSU1fVGltZUJhc2VJbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KICAqIEBwYXJhbSAgVElNX1RpbWVCYXNlSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBUSU1fVGltZUJhc2VJbml0VHlwZURlZg0KICAqICAgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9UaW1lQmFzZVN0cnVjdEluaXQoVElNX1RpbWVCYXNlSW5pdFR5cGVEZWYqIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QpDQp7DQogIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovDQogIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9QZXJpb2QgPSAweEZGRkY7DQogIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9QcmVzY2FsZXIgPSAweDAwMDA7DQogIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9DbG9ja0RpdmlzaW9uID0gVElNX0NLRF9ESVYxOw0KICBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fQ291bnRlck1vZGUgPSBUSU1fQ291bnRlck1vZGVfVXA7DQogIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9SZXBldGl0aW9uQ291bnRlciA9IDB4MDAwMDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBGaWxscyBlYWNoIFRJTV9PQ0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtICBUSU1fT0NJbml0U3RydWN0IDogcG9pbnRlciB0byBhIFRJTV9PQ0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsDQogICogICBiZSBpbml0aWFsaXplZC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DU3RydWN0SW5pdChUSU1fT0NJbml0VHlwZURlZiogVElNX09DSW5pdFN0cnVjdCkNCnsNCiAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8NCiAgVElNX09DSW5pdFN0cnVjdC0+VElNX09DTW9kZSA9IFRJTV9PQ01vZGVfVGltaW5nOw0KICBUSU1fT0NJbml0U3RydWN0LT5USU1fT3V0cHV0U3RhdGUgPSBUSU1fT3V0cHV0U3RhdGVfRGlzYWJsZTsNCiAgVElNX09DSW5pdFN0cnVjdC0+VElNX091dHB1dE5TdGF0ZSA9IFRJTV9PdXRwdXROU3RhdGVfRGlzYWJsZTsNCiAgVElNX09DSW5pdFN0cnVjdC0+VElNX1B1bHNlID0gMHgwMDAwOw0KICBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NQb2xhcml0eSA9IFRJTV9PQ1BvbGFyaXR5X0hpZ2g7DQogIFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ05Qb2xhcml0eSA9IFRJTV9PQ1BvbGFyaXR5X0hpZ2g7DQogIFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ0lkbGVTdGF0ZSA9IFRJTV9PQ0lkbGVTdGF0ZV9SZXNldDsNCiAgVElNX09DSW5pdFN0cnVjdC0+VElNX09DTklkbGVTdGF0ZSA9IFRJTV9PQ05JZGxlU3RhdGVfUmVzZXQ7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBUSU1fSUNJbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KICAqIEBwYXJhbSAgVElNX0lDSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBUSU1fSUNJbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbA0KICAqICAgYmUgaW5pdGlhbGl6ZWQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9JQ1N0cnVjdEluaXQoVElNX0lDSW5pdFR5cGVEZWYqIFRJTV9JQ0luaXRTdHJ1Y3QpDQp7DQogIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovDQogIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsID0gVElNX0NoYW5uZWxfMTsNCiAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHkgPSBUSU1fSUNQb2xhcml0eV9SaXNpbmc7DQogIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiA9IFRJTV9JQ1NlbGVjdGlvbl9EaXJlY3RUSTsNCiAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyID0gVElNX0lDUFNDX0RJVjE7DQogIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlciA9IDB4MDA7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBUSU1fQkRUUkluaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtICBUSU1fQkRUUkluaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fQkRUUkluaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaA0KICAqICAgd2lsbCBiZSBpbml0aWFsaXplZC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0JEVFJTdHJ1Y3RJbml0KFRJTV9CRFRSSW5pdFR5cGVEZWYqIFRJTV9CRFRSSW5pdFN0cnVjdCkNCnsNCiAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8NCiAgVElNX0JEVFJJbml0U3RydWN0LT5USU1fT1NTUlN0YXRlID0gVElNX09TU1JTdGF0ZV9EaXNhYmxlOw0KICBUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9PU1NJU3RhdGUgPSBUSU1fT1NTSVN0YXRlX0Rpc2FibGU7DQogIFRJTV9CRFRSSW5pdFN0cnVjdC0+VElNX0xPQ0tMZXZlbCA9IFRJTV9MT0NLTGV2ZWxfT0ZGOw0KICBUSU1fQkRUUkluaXRTdHJ1Y3QtPlRJTV9EZWFkVGltZSA9IDB4MDA7DQogIFRJTV9CRFRSSW5pdFN0cnVjdC0+VElNX0JyZWFrID0gVElNX0JyZWFrX0Rpc2FibGU7DQogIFRJTV9CRFRSSW5pdFN0cnVjdC0+VElNX0JyZWFrUG9sYXJpdHkgPSBUSU1fQnJlYWtQb2xhcml0eV9Mb3c7DQogIFRJTV9CRFRSSW5pdFN0cnVjdC0+VElNX0F1dG9tYXRpY091dHB1dCA9IFRJTV9BdXRvbWF0aWNPdXRwdXRfRGlzYWJsZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIHRvIDE3IHRvIHNlbGVjdCB0aGUgVElNeCBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBwZXJpcGhlcmFsLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0NtZChUSU1fVHlwZURlZiogVElNeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIFRJTSBDb3VudGVyICovDQogICAgVElNeC0+Q1IxIHw9IFRJTV9DUjFfQ0VOOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIFRJTSBDb3VudGVyICovDQogICAgVElNeC0+Q1IxICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0NSMV9DRU4pKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTSBwZXJpcGhlcmFsIE1haW4gT3V0cHV0cy4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDgsIDE1LCAxNiBvciAxNyB0byBzZWxlY3QgdGhlIFRJTXggcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTSBwZXJpcGhlcmFsIE1haW4gT3V0cHV0cy4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9DdHJsUFdNT3V0cHV0cyhUSU1fVHlwZURlZiogVElNeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QyX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBUSU0gTWFpbiBPdXRwdXQgKi8NCiAgICBUSU14LT5CRFRSIHw9IFRJTV9CRFRSX01PRTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBUSU0gTWFpbiBPdXRwdXQgKi8NCiAgICBUSU14LT5CRFRSICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX0JEVFJfTU9FKSk7DQogIH0gIA0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0cy4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU14IHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fSVQ6IHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdHMgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fSVRfVXBkYXRlOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfQ0MxOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDEgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9JVF9DQzI6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBJbnRlcnJ1cHQgc291cmNlDQogICogICAgIEBhcmcgVElNX0lUX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfQ0M0OiBUSU0gQ2FwdHVyZSBDb21wYXJlIDQgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9JVF9DT006IFRJTSBDb21tdXRhdGlvbiBJbnRlcnJ1cHQgc291cmNlDQogICogICAgIEBhcmcgVElNX0lUX1RyaWdnZXI6IFRJTSBUcmlnZ2VyIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfQnJlYWs6IFRJTSBCcmVhayBJbnRlcnJ1cHQgc291cmNlDQogICogQG5vdGUgDQogICogICAtIFRJTTYgYW5kIFRJTTcgY2FuIG9ubHkgZ2VuZXJhdGUgYW4gdXBkYXRlIGludGVycnVwdC4NCiAgKiAgIC0gVElNOSwgVElNMTIgYW5kIFRJTTE1IGNhbiBoYXZlIG9ubHkgVElNX0lUX1VwZGF0ZSwgVElNX0lUX0NDMSwNCiAgKiAgICAgIFRJTV9JVF9DQzIgb3IgVElNX0lUX1RyaWdnZXIuIA0KICAqICAgLSBUSU0xMCwgVElNMTEsIFRJTTEzLCBUSU0xNCwgVElNMTYgYW5kIFRJTTE3IGNhbiBoYXZlIFRJTV9JVF9VcGRhdGUgb3IgVElNX0lUX0NDMS4gICANCiAgKiAgIC0gVElNX0lUX0JyZWFrIGlzIHVzZWQgb25seSB3aXRoIFRJTTEsIFRJTTggYW5kIFRJTTE1LiANCiAgKiAgIC0gVElNX0lUX0NPTSBpcyB1c2VkIG9ubHkgd2l0aCBUSU0xLCBUSU04LCBUSU0xNSwgVElNMTYgYW5kIFRJTTE3LiAgICANCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTSBpbnRlcnJ1cHRzLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0lUQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsgIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lUKFRJTV9JVCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIEludGVycnVwdCBzb3VyY2VzICovDQogICAgVElNeC0+RElFUiB8PSBUSU1fSVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgSW50ZXJydXB0IHNvdXJjZXMgKi8NCiAgICBUSU14LT5ESUVSICY9ICh1aW50MTZfdCl+VElNX0lUOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBldmVudCB0byBiZSBnZW5lcmF0ZSBieSBzb2Z0d2FyZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9FdmVudFNvdXJjZTogc3BlY2lmaWVzIHRoZSBldmVudCBzb3VyY2UuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CSAgIA0KICAqICAgICBAYXJnIFRJTV9FdmVudFNvdXJjZV9VcGRhdGU6IFRpbWVyIHVwZGF0ZSBFdmVudCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQ0MxOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMSBFdmVudCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQ0MyOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMiBFdmVudCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQ0MzOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMyBFdmVudCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQ0M0OiBUaW1lciBDYXB0dXJlIENvbXBhcmUgNCBFdmVudCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQ09NOiBUaW1lciBDT00gZXZlbnQgc291cmNlICANCiAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfVHJpZ2dlcjogVGltZXIgVHJpZ2dlciBFdmVudCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fRXZlbnRTb3VyY2VfQnJlYWs6IFRpbWVyIEJyZWFrIGV2ZW50IHNvdXJjZQ0KICAqIEBub3RlIA0KICAqICAgLSBUSU02IGFuZCBUSU03IGNhbiBvbmx5IGdlbmVyYXRlIGFuIHVwZGF0ZSBldmVudC4gDQogICogICAtIFRJTV9FdmVudFNvdXJjZV9DT00gYW5kIFRJTV9FdmVudFNvdXJjZV9CcmVhayBhcmUgdXNlZCBvbmx5IHdpdGggVElNMSBhbmQgVElNOC4gICAgICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0dlbmVyYXRlRXZlbnQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9FdmVudFNvdXJjZSkNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fQUxMX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRVZFTlRfU09VUkNFKFRJTV9FdmVudFNvdXJjZSkpOw0KICANCiAgLyogU2V0IHRoZSBldmVudCBzb3VyY2VzICovDQogIFRJTXgtPkVHUiA9IFRJTV9FdmVudFNvdXJjZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14knMgRE1BIGludGVyZmFjZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1LCA4LCAxNSwgMTYgb3IgMTcgdG8gc2VsZWN0IA0KICAqICAgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0RNQUJhc2U6IERNQSBCYXNlIGFkZHJlc3MuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9ETUFCYXNlX0NSLCBUSU1fRE1BQmFzZV9DUjIsIFRJTV9ETUFCYXNlX1NNQ1IsDQogICogICBUSU1fRE1BQmFzZV9ESUVSLCBUSU0xX0RNQUJhc2VfU1IsIFRJTV9ETUFCYXNlX0VHUiwNCiAgKiAgIFRJTV9ETUFCYXNlX0NDTVIxLCBUSU1fRE1BQmFzZV9DQ01SMiwgVElNX0RNQUJhc2VfQ0NFUiwNCiAgKiAgIFRJTV9ETUFCYXNlX0NOVCwgVElNX0RNQUJhc2VfUFNDLCBUSU1fRE1BQmFzZV9BUlIsDQogICogICBUSU1fRE1BQmFzZV9SQ1IsIFRJTV9ETUFCYXNlX0NDUjEsIFRJTV9ETUFCYXNlX0NDUjIsDQogICogICBUSU1fRE1BQmFzZV9DQ1IzLCBUSU1fRE1BQmFzZV9DQ1I0LCBUSU1fRE1BQmFzZV9CRFRSLA0KICAqICAgVElNX0RNQUJhc2VfRENSLg0KICAqIEBwYXJhbSAgVElNX0RNQUJ1cnN0TGVuZ3RoOiBETUEgQnVyc3QgbGVuZ3RoLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZSBiZXR3ZWVuOg0KICAqICAgVElNX0RNQUJ1cnN0TGVuZ3RoXzFCeXRlIGFuZCBUSU1fRE1BQnVyc3RMZW5ndGhfMThCeXRlcy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0RNQUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0RNQUJhc2UsIHVpbnQxNl90IFRJTV9ETUFCdXJzdExlbmd0aCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9CQVNFKFRJTV9ETUFCYXNlKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0xFTkdUSChUSU1fRE1BQnVyc3RMZW5ndGgpKTsNCiAgLyogU2V0IHRoZSBETUEgQmFzZSBhbmQgdGhlIERNQSBCdXJzdCBMZW5ndGggKi8NCiAgVElNeC0+RENSID0gVElNX0RNQUJhc2UgfCBUSU1fRE1BQnVyc3RMZW5ndGg7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNeJJzIERNQSBSZXF1ZXN0cy4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAxNSwgMTYgb3IgMTcgDQogICogICB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLiANCiAgKiBAcGFyYW0gIFRJTV9ETUFTb3VyY2U6IHNwZWNpZmllcyB0aGUgRE1BIFJlcXVlc3Qgc291cmNlcy4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0RNQV9VcGRhdGU6IFRJTSB1cGRhdGUgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9ETUFfQ0MxOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDEgRE1BIHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9ETUFfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9ETUFfQ0MzOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgRE1BIHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9ETUFfQ0M0OiBUSU0gQ2FwdHVyZSBDb21wYXJlIDQgRE1BIHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9ETUFfQ09NOiBUSU0gQ29tbXV0YXRpb24gRE1BIHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9ETUFfVHJpZ2dlcjogVElNIFRyaWdnZXIgRE1BIHNvdXJjZQ0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRE1BIFJlcXVlc3Qgc291cmNlcy4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9ETUFDbWQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9ETUFTb3VyY2UsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDlfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKFRJTV9ETUFTb3VyY2UpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBETUEgc291cmNlcyAqLw0KICAgIFRJTXgtPkRJRVIgfD0gVElNX0RNQVNvdXJjZTsgDQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgRE1BIHNvdXJjZXMgKi8NCiAgICBUSU14LT5ESUVSICY9ICh1aW50MTZfdCl+VElNX0RNQVNvdXJjZTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggaW50ZXJybmFsIENsb2NrDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUNCiAgKiAgIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9JbnRlcm5hbENsb2NrQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q2X1BFUklQSChUSU14KSk7DQogIC8qIERpc2FibGUgc2xhdmUgbW9kZSB0byBjbG9jayB0aGUgcHJlc2NhbGVyIGRpcmVjdGx5IHdpdGggdGhlIGludGVybmFsIGNsb2NrICovDQogIFRJTXgtPlNNQ1IgJj0gICh1aW50MTZfdCkofigodWludDE2X3QpVElNX1NNQ1JfU01TKSk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBJbnRlcm5hbCBUcmlnZ2VyIGFzIEV4dGVybmFsIENsb2NrDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JVFJTb3VyY2U6IFRyaWdnZXIgc291cmNlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAcGFyYW0gIFRJTV9UU19JVFIwOiBJbnRlcm5hbCBUcmlnZ2VyIDANCiAgKiBAcGFyYW0gIFRJTV9UU19JVFIxOiBJbnRlcm5hbCBUcmlnZ2VyIDENCiAgKiBAcGFyYW0gIFRJTV9UU19JVFIyOiBJbnRlcm5hbCBUcmlnZ2VyIDINCiAgKiBAcGFyYW0gIFRJTV9UU19JVFIzOiBJbnRlcm5hbCBUcmlnZ2VyIDMNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0lUUnhFeHRlcm5hbENsb2NrQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSW5wdXRUcmlnZ2VyU291cmNlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q2X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fSU5URVJOQUxfVFJJR0dFUl9TRUxFQ1RJT04oVElNX0lucHV0VHJpZ2dlclNvdXJjZSkpOw0KICAvKiBTZWxlY3QgdGhlIEludGVybmFsIFRyaWdnZXIgKi8NCiAgVElNX1NlbGVjdElucHV0VHJpZ2dlcihUSU14LCBUSU1fSW5wdXRUcmlnZ2VyU291cmNlKTsNCiAgLyogU2VsZWN0IHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMSAqLw0KICBUSU14LT5TTUNSIHw9IFRJTV9TbGF2ZU1vZGVfRXh0ZXJuYWwxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggVHJpZ2dlciBhcyBFeHRlcm5hbCBDbG9jaw0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUsIDksIDEyIG9yIDE1IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fVEl4RXh0ZXJuYWxDTEtTb3VyY2U6IFRyaWdnZXIgc291cmNlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fVEl4RXh0ZXJuYWxDTEsxU291cmNlX1RJMUVEOiBUSTEgRWRnZSBEZXRlY3Rvcg0KICAqICAgICBAYXJnIFRJTV9USXhFeHRlcm5hbENMSzFTb3VyY2VfVEkxOiBGaWx0ZXJlZCBUaW1lciBJbnB1dCAxDQogICogICAgIEBhcmcgVElNX1RJeEV4dGVybmFsQ0xLMVNvdXJjZV9USTI6IEZpbHRlcmVkIFRpbWVyIElucHV0IDINCiAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIFRJeCBQb2xhcml0eS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfUmlzaW5nDQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfRmFsbGluZw0KICAqIEBwYXJhbSAgSUNGaWx0ZXIgOiBzcGVjaWZpZXMgdGhlIGZpbHRlciB2YWx1ZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MCBhbmQgMHhGLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fVEl4RXh0ZXJuYWxDbG9ja0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX1RJeEV4dGVybmFsQ0xLU291cmNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBUSU1fSUNQb2xhcml0eSwgdWludDE2X3QgSUNGaWx0ZXIpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9USVhDTEtfU09VUkNFKFRJTV9USXhFeHRlcm5hbENMS1NvdXJjZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZKFRJTV9JQ1BvbGFyaXR5KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKElDRmlsdGVyKSk7DQogIC8qIENvbmZpZ3VyZSB0aGUgVGltZXIgSW5wdXQgQ2xvY2sgU291cmNlICovDQogIGlmIChUSU1fVEl4RXh0ZXJuYWxDTEtTb3VyY2UgPT0gVElNX1RJeEV4dGVybmFsQ0xLMVNvdXJjZV9USTIpDQogIHsNCiAgICBUSTJfQ29uZmlnKFRJTXgsIFRJTV9JQ1BvbGFyaXR5LCBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEksIElDRmlsdGVyKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBUSTFfQ29uZmlnKFRJTXgsIFRJTV9JQ1BvbGFyaXR5LCBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEksIElDRmlsdGVyKTsNCiAgfQ0KICAvKiBTZWxlY3QgdGhlIFRyaWdnZXIgc291cmNlICovDQogIFRJTV9TZWxlY3RJbnB1dFRyaWdnZXIoVElNeCwgVElNX1RJeEV4dGVybmFsQ0xLU291cmNlKTsNCiAgLyogU2VsZWN0IHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMSAqLw0KICBUSU14LT5TTUNSIHw9IFRJTV9TbGF2ZU1vZGVfRXh0ZXJuYWwxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIEV4dGVybmFsIGNsb2NrIE1vZGUxDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fRXh0VFJHUHJlc2NhbGVyOiBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQcmVzY2FsZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfT0ZGOiBFVFJQIFByZXNjYWxlciBPRkYuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVYyOiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDIuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVY0OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDQuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVY4OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDguDQogICogQHBhcmFtICBUSU1fRXh0VFJHUG9sYXJpdHk6IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFBvbGFyaXR5Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUG9sYXJpdHlfSW52ZXJ0ZWQ6IGFjdGl2ZSBsb3cgb3IgZmFsbGluZyBlZGdlIGFjdGl2ZS4NCiAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUG9sYXJpdHlfTm9uSW52ZXJ0ZWQ6IGFjdGl2ZSBoaWdoIG9yIHJpc2luZyBlZGdlIGFjdGl2ZS4NCiAgKiBAcGFyYW0gIEV4dFRSR0ZpbHRlcjogRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9FVFJDbG9ja01vZGUxQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRXh0VFJHUHJlc2NhbGVyLCB1aW50MTZfdCBUSU1fRXh0VFJHUG9sYXJpdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IEV4dFRSR0ZpbHRlcikNCnsNCiAgdWludDE2X3QgdG1wc21jciA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfUFJFU0NBTEVSKFRJTV9FeHRUUkdQcmVzY2FsZXIpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FWFRfUE9MQVJJVFkoVElNX0V4dFRSR1BvbGFyaXR5KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRVhUX0ZJTFRFUihFeHRUUkdGaWx0ZXIpKTsNCiAgLyogQ29uZmlndXJlIHRoZSBFVFIgQ2xvY2sgc291cmNlICovDQogIFRJTV9FVFJDb25maWcoVElNeCwgVElNX0V4dFRSR1ByZXNjYWxlciwgVElNX0V4dFRSR1BvbGFyaXR5LCBFeHRUUkdGaWx0ZXIpOw0KICANCiAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wc21jciA9IFRJTXgtPlNNQ1I7DQogIC8qIFJlc2V0IHRoZSBTTVMgQml0cyAqLw0KICB0bXBzbWNyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX1NNQ1JfU01TKSk7DQogIC8qIFNlbGVjdCB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTEgKi8NCiAgdG1wc21jciB8PSBUSU1fU2xhdmVNb2RlX0V4dGVybmFsMTsNCiAgLyogU2VsZWN0IHRoZSBUcmlnZ2VyIHNlbGVjdGlvbiA6IEVUUkYgKi8NCiAgdG1wc21jciAmPSAodWludDE2X3QpKH4oKHVpbnQxNl90KVRJTV9TTUNSX1RTKSk7DQogIHRtcHNtY3IgfD0gVElNX1RTX0VUUkY7DQogIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLw0KICBUSU14LT5TTUNSID0gdG1wc21jcjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBFeHRlcm5hbCBjbG9jayBNb2RlMg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0V4dFRSR1ByZXNjYWxlcjogVGhlIGV4dGVybmFsIFRyaWdnZXIgUHJlc2NhbGVyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUFNDX09GRjogRVRSUCBQcmVzY2FsZXIgT0ZGLg0KICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfRElWMjogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSAyLg0KICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfRElWNDogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSA0Lg0KICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfRElWODogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSA4Lg0KICAqIEBwYXJhbSAgVElNX0V4dFRSR1BvbGFyaXR5OiBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0V4dFRSR1BvbGFyaXR5X0ludmVydGVkOiBhY3RpdmUgbG93IG9yIGZhbGxpbmcgZWRnZSBhY3RpdmUuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BvbGFyaXR5X05vbkludmVydGVkOiBhY3RpdmUgaGlnaCBvciByaXNpbmcgZWRnZSBhY3RpdmUuDQogICogQHBhcmFtICBFeHRUUkdGaWx0ZXI6IEV4dGVybmFsIFRyaWdnZXIgRmlsdGVyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fRVRSQ2xvY2tNb2RlMkNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0V4dFRSR1ByZXNjYWxlciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFRJTV9FeHRUUkdQb2xhcml0eSwgdWludDE2X3QgRXh0VFJHRmlsdGVyKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRVhUX1BSRVNDQUxFUihUSU1fRXh0VFJHUHJlc2NhbGVyKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRVhUX1BPTEFSSVRZKFRJTV9FeHRUUkdQb2xhcml0eSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0VYVF9GSUxURVIoRXh0VFJHRmlsdGVyKSk7DQogIC8qIENvbmZpZ3VyZSB0aGUgRVRSIENsb2NrIHNvdXJjZSAqLw0KICBUSU1fRVRSQ29uZmlnKFRJTXgsIFRJTV9FeHRUUkdQcmVzY2FsZXIsIFRJTV9FeHRUUkdQb2xhcml0eSwgRXh0VFJHRmlsdGVyKTsNCiAgLyogRW5hYmxlIHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMiAqLw0KICBUSU14LT5TTUNSIHw9IFRJTV9TTUNSX0VDRTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IEV4dGVybmFsIFRyaWdnZXIgKEVUUikuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fRXh0VFJHUHJlc2NhbGVyOiBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQcmVzY2FsZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9FeHRUUkdQU0NfT0ZGOiBFVFJQIFByZXNjYWxlciBPRkYuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVYyOiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDIuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVY0OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDQuDQogICogICAgIEBhcmcgVElNX0V4dFRSR1BTQ19ESVY4OiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDguDQogICogQHBhcmFtICBUSU1fRXh0VFJHUG9sYXJpdHk6IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFBvbGFyaXR5Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUG9sYXJpdHlfSW52ZXJ0ZWQ6IGFjdGl2ZSBsb3cgb3IgZmFsbGluZyBlZGdlIGFjdGl2ZS4NCiAgKiAgICAgQGFyZyBUSU1fRXh0VFJHUG9sYXJpdHlfTm9uSW52ZXJ0ZWQ6IGFjdGl2ZSBoaWdoIG9yIHJpc2luZyBlZGdlIGFjdGl2ZS4NCiAgKiBAcGFyYW0gIEV4dFRSR0ZpbHRlcjogRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9FVFJDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9FeHRUUkdQcmVzY2FsZXIsIHVpbnQxNl90IFRJTV9FeHRUUkdQb2xhcml0eSwNCiAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBFeHRUUkdGaWx0ZXIpDQp7DQogIHVpbnQxNl90IHRtcHNtY3IgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRVhUX1BSRVNDQUxFUihUSU1fRXh0VFJHUHJlc2NhbGVyKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRVhUX1BPTEFSSVRZKFRJTV9FeHRUUkdQb2xhcml0eSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0VYVF9GSUxURVIoRXh0VFJHRmlsdGVyKSk7DQogIHRtcHNtY3IgPSBUSU14LT5TTUNSOw0KICAvKiBSZXNldCB0aGUgRVRSIEJpdHMgKi8NCiAgdG1wc21jciAmPSBTTUNSX0VUUl9NYXNrOw0KICAvKiBTZXQgdGhlIFByZXNjYWxlciwgdGhlIEZpbHRlciB2YWx1ZSBhbmQgdGhlIFBvbGFyaXR5ICovDQogIHRtcHNtY3IgfD0gKHVpbnQxNl90KShUSU1fRXh0VFJHUHJlc2NhbGVyIHwgKHVpbnQxNl90KShUSU1fRXh0VFJHUG9sYXJpdHkgfCAodWludDE2X3QpKEV4dFRSR0ZpbHRlciA8PCAodWludDE2X3QpOCkpKTsNCiAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovDQogIFRJTXgtPlNNQ1IgPSB0bXBzbWNyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggUHJlc2NhbGVyLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgUHJlc2NhbGVyOiBzcGVjaWZpZXMgdGhlIFByZXNjYWxlciBSZWdpc3RlciB2YWx1ZQ0KICAqIEBwYXJhbSAgVElNX1BTQ1JlbG9hZE1vZGU6IHNwZWNpZmllcyB0aGUgVElNIFByZXNjYWxlciBSZWxvYWQgbW9kZQ0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fUFNDUmVsb2FkTW9kZV9VcGRhdGU6IFRoZSBQcmVzY2FsZXIgaXMgbG9hZGVkIGF0IHRoZSB1cGRhdGUgZXZlbnQuDQogICogICAgIEBhcmcgVElNX1BTQ1JlbG9hZE1vZGVfSW1tZWRpYXRlOiBUaGUgUHJlc2NhbGVyIGlzIGxvYWRlZCBpbW1lZGlhdGVseS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1ByZXNjYWxlckNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgUHJlc2NhbGVyLCB1aW50MTZfdCBUSU1fUFNDUmVsb2FkTW9kZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9QUkVTQ0FMRVJfUkVMT0FEKFRJTV9QU0NSZWxvYWRNb2RlKSk7DQogIC8qIFNldCB0aGUgUHJlc2NhbGVyIHZhbHVlICovDQogIFRJTXgtPlBTQyA9IFByZXNjYWxlcjsNCiAgLyogU2V0IG9yIHJlc2V0IHRoZSBVRyBCaXQgKi8NCiAgVElNeC0+RUdSID0gVElNX1BTQ1JlbG9hZE1vZGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU3BlY2lmaWVzIHRoZSBUSU14IENvdW50ZXIgTW9kZSB0byBiZSB1c2VkLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0NvdW50ZXJNb2RlOiBzcGVjaWZpZXMgdGhlIENvdW50ZXIgTW9kZSB0byBiZSB1c2VkDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9Db3VudGVyTW9kZV9VcDogVElNIFVwIENvdW50aW5nIE1vZGUNCiAgKiAgICAgQGFyZyBUSU1fQ291bnRlck1vZGVfRG93bjogVElNIERvd24gQ291bnRpbmcgTW9kZQ0KICAqICAgICBAYXJnIFRJTV9Db3VudGVyTW9kZV9DZW50ZXJBbGlnbmVkMTogVElNIENlbnRlciBBbGlnbmVkIE1vZGUxDQogICogICAgIEBhcmcgVElNX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQyOiBUSU0gQ2VudGVyIEFsaWduZWQgTW9kZTINCiAgKiAgICAgQGFyZyBUSU1fQ291bnRlck1vZGVfQ2VudGVyQWxpZ25lZDM6IFRJTSBDZW50ZXIgQWxpZ25lZCBNb2RlMw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fQ291bnRlck1vZGVDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9Db3VudGVyTW9kZSkNCnsNCiAgdWludDE2X3QgdG1wY3IxID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShUSU1fQ291bnRlck1vZGUpKTsNCiAgdG1wY3IxID0gVElNeC0+Q1IxOw0KICAvKiBSZXNldCB0aGUgQ01TIGFuZCBESVIgQml0cyAqLw0KICB0bXBjcjEgJj0gKHVpbnQxNl90KSh+KCh1aW50MTZfdCkoVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUykpKTsNCiAgLyogU2V0IHRoZSBDb3VudGVyIE1vZGUgKi8NCiAgdG1wY3IxIHw9IFRJTV9Db3VudGVyTW9kZTsNCiAgLyogV3JpdGUgdG8gVElNeCBDUjEgcmVnaXN0ZXIgKi8NCiAgVElNeC0+Q1IxID0gdG1wY3IxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIElucHV0IFRyaWdnZXIgc291cmNlDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JbnB1dFRyaWdnZXJTb3VyY2U6IFRoZSBJbnB1dCBUcmlnZ2VyIHNvdXJjZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX1RTX0lUUjA6IEludGVybmFsIFRyaWdnZXIgMA0KICAqICAgICBAYXJnIFRJTV9UU19JVFIxOiBJbnRlcm5hbCBUcmlnZ2VyIDENCiAgKiAgICAgQGFyZyBUSU1fVFNfSVRSMjogSW50ZXJuYWwgVHJpZ2dlciAyDQogICogICAgIEBhcmcgVElNX1RTX0lUUjM6IEludGVybmFsIFRyaWdnZXIgMw0KICAqICAgICBAYXJnIFRJTV9UU19USTFGX0VEOiBUSTEgRWRnZSBEZXRlY3Rvcg0KICAqICAgICBAYXJnIFRJTV9UU19USTFGUDE6IEZpbHRlcmVkIFRpbWVyIElucHV0IDENCiAgKiAgICAgQGFyZyBUSU1fVFNfVEkyRlAyOiBGaWx0ZXJlZCBUaW1lciBJbnB1dCAyDQogICogICAgIEBhcmcgVElNX1RTX0VUUkY6IEV4dGVybmFsIFRyaWdnZXIgaW5wdXQNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NlbGVjdElucHV0VHJpZ2dlcihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lucHV0VHJpZ2dlclNvdXJjZSkNCnsNCiAgdWludDE2X3QgdG1wc21jciA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSX1NFTEVDVElPTihUSU1fSW5wdXRUcmlnZ2VyU291cmNlKSk7DQogIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcHNtY3IgPSBUSU14LT5TTUNSOw0KICAvKiBSZXNldCB0aGUgVFMgQml0cyAqLw0KICB0bXBzbWNyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX1NNQ1JfVFMpKTsNCiAgLyogU2V0IHRoZSBJbnB1dCBUcmlnZ2VyIHNvdXJjZSAqLw0KICB0bXBzbWNyIHw9IFRJTV9JbnB1dFRyaWdnZXJTb3VyY2U7DQogIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLw0KICBUSU14LT5TTUNSID0gdG1wc21jcjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IEVuY29kZXIgSW50ZXJmYWNlLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0VuY29kZXJNb2RlOiBzcGVjaWZpZXMgdGhlIFRJTXggRW5jb2RlciBNb2RlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fRW5jb2Rlck1vZGVfVEkxOiBDb3VudGVyIGNvdW50cyBvbiBUSTFGUDEgZWRnZSBkZXBlbmRpbmcgb24gVEkyRlAyIGxldmVsLg0KICAqICAgICBAYXJnIFRJTV9FbmNvZGVyTW9kZV9USTI6IENvdW50ZXIgY291bnRzIG9uIFRJMkZQMiBlZGdlIGRlcGVuZGluZyBvbiBUSTFGUDEgbGV2ZWwuDQogICogICAgIEBhcmcgVElNX0VuY29kZXJNb2RlX1RJMTI6IENvdW50ZXIgY291bnRzIG9uIGJvdGggVEkxRlAxIGFuZCBUSTJGUDIgZWRnZXMgZGVwZW5kaW5nDQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBsZXZlbCBvZiB0aGUgb3RoZXIgaW5wdXQuDQogICogQHBhcmFtICBUSU1fSUMxUG9sYXJpdHk6IHNwZWNpZmllcyB0aGUgSUMxIFBvbGFyaXR5DQogICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfRmFsbGluZzogSUMgRmFsbGluZyBlZGdlLg0KICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X1Jpc2luZzogSUMgUmlzaW5nIGVkZ2UuDQogICogQHBhcmFtICBUSU1fSUMyUG9sYXJpdHk6IHNwZWNpZmllcyB0aGUgSUMyIFBvbGFyaXR5DQogICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfRmFsbGluZzogSUMgRmFsbGluZyBlZGdlLg0KICAqICAgICBAYXJnIFRJTV9JQ1BvbGFyaXR5X1Jpc2luZzogSUMgUmlzaW5nIGVkZ2UuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9FbmNvZGVySW50ZXJmYWNlQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRW5jb2Rlck1vZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFRJTV9JQzFQb2xhcml0eSwgdWludDE2X3QgVElNX0lDMlBvbGFyaXR5KQ0Kew0KICB1aW50MTZfdCB0bXBzbWNyID0gMDsNCiAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KICB1aW50MTZfdCB0bXBjY2VyID0gMDsNCiAgICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNV9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfTU9ERShUSU1fRW5jb2Rlck1vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QT0xBUklUWShUSU1fSUMxUG9sYXJpdHkpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QT0xBUklUWShUSU1fSUMyUG9sYXJpdHkpKTsNCg0KICAvKiBHZXQgdGhlIFRJTXggU01DUiByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXBzbWNyID0gVElNeC0+U01DUjsNCiAgDQogIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KICANCiAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIA0KICAvKiBTZXQgdGhlIGVuY29kZXIgTW9kZSAqLw0KICB0bXBzbWNyICY9ICh1aW50MTZfdCkofigodWludDE2X3QpVElNX1NNQ1JfU01TKSk7DQogIHRtcHNtY3IgfD0gVElNX0VuY29kZXJNb2RlOw0KICANCiAgLyogU2VsZWN0IHRoZSBDYXB0dXJlIENvbXBhcmUgMSBhbmQgdGhlIENhcHR1cmUgQ29tcGFyZSAyIGFzIGlucHV0ICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCkoKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MxUykpICYgKHVpbnQxNl90KSh+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MyUykpKTsNCiAgdG1wY2NtcjEgfD0gVElNX0NDTVIxX0NDMVNfMCB8IFRJTV9DQ01SMV9DQzJTXzA7DQogIA0KICAvKiBTZXQgdGhlIFRJMSBhbmQgdGhlIFRJMiBQb2xhcml0aWVzICovDQogIHRtcGNjZXIgJj0gKHVpbnQxNl90KSgoKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMVApKSAmICgodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0MyUCkpKTsNCiAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9JQzFQb2xhcml0eSB8ICh1aW50MTZfdCkoVElNX0lDMlBvbGFyaXR5IDw8ICh1aW50MTZfdCk0KSk7DQogIA0KICAvKiBXcml0ZSB0byBUSU14IFNNQ1IgKi8NCiAgVElNeC0+U01DUiA9IHRtcHNtY3I7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8NCiAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovDQogIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZvcmNlcyB0aGUgVElNeCBvdXRwdXQgMSB3YXZlZm9ybSB0byBhY3RpdmUgb3IgaW5hY3RpdmUgbGV2ZWwuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSB0byAxNyBleGNlcHQgNiBhbmQgNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0ZvcmNlZEFjdGlvbjogc3BlY2lmaWVzIHRoZSBmb3JjZWQgQWN0aW9uIHRvIGJlIHNldCB0byB0aGUgb3V0cHV0IHdhdmVmb3JtLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0FjdGl2ZTogRm9yY2UgYWN0aXZlIGxldmVsIG9uIE9DMVJFRg0KICAqICAgICBAYXJnIFRJTV9Gb3JjZWRBY3Rpb25fSW5BY3RpdmU6IEZvcmNlIGluYWN0aXZlIGxldmVsIG9uIE9DMVJFRi4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0ZvcmNlZE9DMUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0ZvcmNlZEFjdGlvbikNCnsNCiAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q4X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fRk9SQ0VEX0FDVElPTihUSU1fRm9yY2VkQWN0aW9uKSk7DQogIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7DQogIC8qIFJlc2V0IHRoZSBPQzFNIEJpdHMgKi8NCiAgdG1wY2NtcjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMV9PQzFNKTsNCiAgLyogQ29uZmlndXJlIFRoZSBGb3JjZWQgb3V0cHV0IE1vZGUgKi8NCiAgdG1wY2NtcjEgfD0gVElNX0ZvcmNlZEFjdGlvbjsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSByZWdpc3RlciAqLw0KICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZvcmNlcyB0aGUgVElNeCBvdXRwdXQgMiB3YXZlZm9ybSB0byBhY3RpdmUgb3IgaW5hY3RpdmUgbGV2ZWwuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9Gb3JjZWRBY3Rpb246IHNwZWNpZmllcyB0aGUgZm9yY2VkIEFjdGlvbiB0byBiZSBzZXQgdG8gdGhlIG91dHB1dCB3YXZlZm9ybS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0ZvcmNlZEFjdGlvbl9BY3RpdmU6IEZvcmNlIGFjdGl2ZSBsZXZlbCBvbiBPQzJSRUYNCiAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0luQWN0aXZlOiBGb3JjZSBpbmFjdGl2ZSBsZXZlbCBvbiBPQzJSRUYuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9Gb3JjZWRPQzJDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9Gb3JjZWRBY3Rpb24pDQp7DQogIHVpbnQxNl90IHRtcGNjbXIxID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNl9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0ZPUkNFRF9BQ1RJT04oVElNX0ZvcmNlZEFjdGlvbikpOw0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KICAvKiBSZXNldCB0aGUgT0MyTSBCaXRzICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MyTSk7DQogIC8qIENvbmZpZ3VyZSBUaGUgRm9yY2VkIG91dHB1dCBNb2RlICovDQogIHRtcGNjbXIxIHw9ICh1aW50MTZfdCkoVElNX0ZvcmNlZEFjdGlvbiA8PCA4KTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSByZWdpc3RlciAqLw0KICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZvcmNlcyB0aGUgVElNeCBvdXRwdXQgMyB3YXZlZm9ybSB0byBhY3RpdmUgb3IgaW5hY3RpdmUgbGV2ZWwuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fRm9yY2VkQWN0aW9uOiBzcGVjaWZpZXMgdGhlIGZvcmNlZCBBY3Rpb24gdG8gYmUgc2V0IHRvIHRoZSBvdXRwdXQgd2F2ZWZvcm0uDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9Gb3JjZWRBY3Rpb25fQWN0aXZlOiBGb3JjZSBhY3RpdmUgbGV2ZWwgb24gT0MzUkVGDQogICogICAgIEBhcmcgVElNX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZTogRm9yY2UgaW5hY3RpdmUgbGV2ZWwgb24gT0MzUkVGLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fRm9yY2VkT0MzQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fRm9yY2VkQWN0aW9uKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMiA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9GT1JDRURfQUNUSU9OKFRJTV9Gb3JjZWRBY3Rpb24pKTsNCiAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsNCiAgLyogUmVzZXQgdGhlIE9DMU0gQml0cyAqLw0KICB0bXBjY21yMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX09DM00pOw0KICAvKiBDb25maWd1cmUgVGhlIEZvcmNlZCBvdXRwdXQgTW9kZSAqLw0KICB0bXBjY21yMiB8PSBUSU1fRm9yY2VkQWN0aW9uOw0KICAvKiBXcml0ZSB0byBUSU14IENDTVIyIHJlZ2lzdGVyICovDQogIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRm9yY2VzIHRoZSBUSU14IG91dHB1dCA0IHdhdmVmb3JtIHRvIGFjdGl2ZSBvciBpbmFjdGl2ZSBsZXZlbC4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1IG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9Gb3JjZWRBY3Rpb246IHNwZWNpZmllcyB0aGUgZm9yY2VkIEFjdGlvbiB0byBiZSBzZXQgdG8gdGhlIG91dHB1dCB3YXZlZm9ybS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0ZvcmNlZEFjdGlvbl9BY3RpdmU6IEZvcmNlIGFjdGl2ZSBsZXZlbCBvbiBPQzRSRUYNCiAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0luQWN0aXZlOiBGb3JjZSBpbmFjdGl2ZSBsZXZlbCBvbiBPQzRSRUYuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9Gb3JjZWRPQzRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9Gb3JjZWRBY3Rpb24pDQp7DQogIHVpbnQxNl90IHRtcGNjbXIyID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0ZPUkNFRF9BQ1RJT04oVElNX0ZvcmNlZEFjdGlvbikpOw0KICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KICAvKiBSZXNldCB0aGUgT0MyTSBCaXRzICovDQogIHRtcGNjbXIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfT0M0TSk7DQogIC8qIENvbmZpZ3VyZSBUaGUgRm9yY2VkIG91dHB1dCBNb2RlICovDQogIHRtcGNjbXIyIHw9ICh1aW50MTZfdCkoVElNX0ZvcmNlZEFjdGlvbiA8PCA4KTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiByZWdpc3RlciAqLw0KICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXIgb24gQVJSLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fQVJSUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIFNldCB0aGUgQVJSIFByZWxvYWQgQml0ICovDQogICAgVElNeC0+Q1IxIHw9IFRJTV9DUjFfQVJQRTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBSZXNldCB0aGUgQVJSIFByZWxvYWQgQml0ICovDQogICAgVElNeC0+Q1IxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ1IxX0FSUEUpOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2VsZWN0cyB0aGUgVElNIHBlcmlwaGVyYWwgQ29tbXV0YXRpb24gZXZlbnQuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgOCwgMTUsIDE2IG9yIDE3IHRvIHNlbGVjdCB0aGUgVElNeCBwZXJpcGhlcmFsDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBDb21tdXRhdGlvbiBldmVudC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9TZWxlY3RDT00oVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUMl9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIFNldCB0aGUgQ09NIEJpdCAqLw0KICAgIFRJTXgtPkNSMiB8PSBUSU1fQ1IyX0NDVVM7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmVzZXQgdGhlIENPTSBCaXQgKi8NCiAgICBUSU14LT5DUjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DUjJfQ0NVUyk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBTZWxlY3RzIHRoZSBUSU14IHBlcmlwaGVyYWwgQ2FwdHVyZSBDb21wYXJlIERNQSBzb3VyY2UuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSwgOCwgMTUsIDE2IG9yIDE3IHRvIHNlbGVjdCANCiAgKiAgIHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIENhcHR1cmUgQ29tcGFyZSBETUEgc291cmNlDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2VsZWN0Q0NETUEoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIFNldCB0aGUgQ0NEUyBCaXQgKi8NCiAgICBUSU14LT5DUjIgfD0gVElNX0NSMl9DQ0RTOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFJlc2V0IHRoZSBDQ0RTIEJpdCAqLw0KICAgIFRJTXgtPkNSMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMl9DQ0RTKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgb3IgUmVzZXRzIHRoZSBUSU0gcGVyaXBoZXJhbCBDYXB0dXJlIENvbXBhcmUgUHJlbG9hZCBDb250cm9sIGJpdC4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAgMSwgMiwgMywgNCwgNSwgOCBvciAxNSANCiAgKiAgIHRvIHNlbGVjdCB0aGUgVElNeCBwZXJpcGhlcmFsDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBDYXB0dXJlIENvbXBhcmUgUHJlbG9hZCBDb250cm9sIGJpdA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0NDUHJlbG9hZENvbnRyb2woVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDVfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBTZXQgdGhlIENDUEMgQml0ICovDQogICAgVElNeC0+Q1IyIHw9IFRJTV9DUjJfQ0NQQzsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBSZXNldCB0aGUgQ0NQQyBCaXQgKi8NCiAgICBUSU14LT5DUjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DUjJfQ0NQQyk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3RlciBvbiBDQ1IxLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEgdG8gMTcgZXhjZXB0IDYgYW5kIDcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ1ByZWxvYWQ6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXINCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DUHJlbG9hZF9FbmFibGUNCiAgKiAgICAgQGFyZyBUSU1fT0NQcmVsb2FkX0Rpc2FibGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DMVByZWxvYWRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ1ByZWxvYWQpDQp7DQogIHVpbnQxNl90IHRtcGNjbXIxID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DUFJFTE9BRF9TVEFURShUSU1fT0NQcmVsb2FkKSk7DQogIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7DQogIC8qIFJlc2V0IHRoZSBPQzFQRSBCaXQgKi8NCiAgdG1wY2NtcjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMV9PQzFQRSk7DQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBQcmVsb2FkIGZlYXR1cmUgKi8NCiAgdG1wY2NtcjEgfD0gVElNX09DUHJlbG9hZDsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSByZWdpc3RlciAqLw0KICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyIG9uIENDUjIuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IA0KICAqICAgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DUHJlbG9hZDogbmV3IHN0YXRlIG9mIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3Rlcg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fT0NQcmVsb2FkX0VuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ1ByZWxvYWRfRGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MyUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUHJlbG9hZCkNCnsNCiAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q2X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NQUkVMT0FEX1NUQVRFKFRJTV9PQ1ByZWxvYWQpKTsNCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCiAgLyogUmVzZXQgdGhlIE9DMlBFIEJpdCAqLw0KICB0bXBjY21yMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIxX09DMlBFKTsNCiAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIFByZWxvYWQgZmVhdHVyZSAqLw0KICB0bXBjY21yMSB8PSAodWludDE2X3QpKFRJTV9PQ1ByZWxvYWQgPDwgOCk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgcmVnaXN0ZXIgKi8NCiAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3RlciBvbiBDQ1IzLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DUHJlbG9hZDogbmV3IHN0YXRlIG9mIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3Rlcg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fT0NQcmVsb2FkX0VuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ1ByZWxvYWRfRGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MzUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUHJlbG9hZCkNCnsNCiAgdWludDE2X3QgdG1wY2NtcjIgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NQUkVMT0FEX1NUQVRFKFRJTV9PQ1ByZWxvYWQpKTsNCiAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsNCiAgLyogUmVzZXQgdGhlIE9DM1BFIEJpdCAqLw0KICB0bXBjY21yMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX09DM1BFKTsNCiAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIFByZWxvYWQgZmVhdHVyZSAqLw0KICB0bXBjY21yMiB8PSBUSU1fT0NQcmVsb2FkOw0KICAvKiBXcml0ZSB0byBUSU14IENDTVIyIHJlZ2lzdGVyICovDQogIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXIgb24gQ0NSNC4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1IG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ1ByZWxvYWQ6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXINCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DUHJlbG9hZF9FbmFibGUNCiAgKiAgICAgQGFyZyBUSU1fT0NQcmVsb2FkX0Rpc2FibGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DNFByZWxvYWRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ1ByZWxvYWQpDQp7DQogIHVpbnQxNl90IHRtcGNjbXIyID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DUFJFTE9BRF9TVEFURShUSU1fT0NQcmVsb2FkKSk7DQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQogIC8qIFJlc2V0IHRoZSBPQzRQRSBCaXQgKi8NCiAgdG1wY2NtcjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzRQRSk7DQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBQcmVsb2FkIGZlYXR1cmUgKi8NCiAgdG1wY2NtcjIgfD0gKHVpbnQxNl90KShUSU1fT0NQcmVsb2FkIDw8IDgpOw0KICAvKiBXcml0ZSB0byBUSU14IENDTVIyIHJlZ2lzdGVyICovDQogIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBPdXRwdXQgQ29tcGFyZSAxIEZhc3QgZmVhdHVyZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxIHRvIDE3IGV4Y2VwdCA2IGFuZCA3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NGYXN0OiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgRW5hYmxlIEJpdC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DRmFzdF9FbmFibGU6IFRJTSBvdXRwdXQgY29tcGFyZSBmYXN0IGVuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ0Zhc3RfRGlzYWJsZTogVElNIG91dHB1dCBjb21wYXJlIGZhc3QgZGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MxRmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DRmFzdCkNCnsNCiAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q4X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NGQVNUX1NUQVRFKFRJTV9PQ0Zhc3QpKTsNCiAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7DQogIC8qIFJlc2V0IHRoZSBPQzFGRSBCaXQgKi8NCiAgdG1wY2NtcjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMV9PQzFGRSk7DQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEJpdCAqLw0KICB0bXBjY21yMSB8PSBUSU1fT0NGYXN0Ow0KICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovDQogIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBPdXRwdXQgQ29tcGFyZSAyIEZhc3QgZmVhdHVyZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1LCA4LCA5LCAxMiBvciAxNSB0byBzZWxlY3QgDQogICogICB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NGYXN0OiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgRW5hYmxlIEJpdC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DRmFzdF9FbmFibGU6IFRJTSBvdXRwdXQgY29tcGFyZSBmYXN0IGVuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ0Zhc3RfRGlzYWJsZTogVElNIG91dHB1dCBjb21wYXJlIGZhc3QgZGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MyRmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DRmFzdCkNCnsNCiAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q2X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NGQVNUX1NUQVRFKFRJTV9PQ0Zhc3QpKTsNCiAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7DQogIC8qIFJlc2V0IHRoZSBPQzJGRSBCaXQgKi8NCiAgdG1wY2NtcjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMV9PQzJGRSk7DQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEJpdCAqLw0KICB0bXBjY21yMSB8PSAodWludDE2X3QpKFRJTV9PQ0Zhc3QgPDwgOCk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8NCiAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IE91dHB1dCBDb21wYXJlIDMgRmFzdCBmZWF0dXJlLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DRmFzdDogbmV3IHN0YXRlIG9mIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEVuYWJsZSBCaXQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9PQ0Zhc3RfRW5hYmxlOiBUSU0gb3V0cHV0IGNvbXBhcmUgZmFzdCBlbmFibGUNCiAgKiAgICAgQGFyZyBUSU1fT0NGYXN0X0Rpc2FibGU6IFRJTSBvdXRwdXQgY29tcGFyZSBmYXN0IGRpc2FibGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DM0Zhc3RDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ0Zhc3QpDQp7DQogIHVpbnQxNl90IHRtcGNjbXIyID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DRkFTVF9TVEFURShUSU1fT0NGYXN0KSk7DQogIC8qIEdldCB0aGUgVElNeCBDQ01SMiByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KICAvKiBSZXNldCB0aGUgT0MzRkUgQml0ICovDQogIHRtcGNjbXIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfT0MzRkUpOw0KICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgRmFzdCBCaXQgKi8NCiAgdG1wY2NtcjIgfD0gVElNX09DRmFzdDsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLw0KICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggT3V0cHV0IENvbXBhcmUgNCBGYXN0IGZlYXR1cmUuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NGYXN0OiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgRW5hYmxlIEJpdC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DRmFzdF9FbmFibGU6IFRJTSBvdXRwdXQgY29tcGFyZSBmYXN0IGVuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ0Zhc3RfRGlzYWJsZTogVElNIG91dHB1dCBjb21wYXJlIGZhc3QgZGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0M0RmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DRmFzdCkNCnsNCiAgdWludDE2X3QgdG1wY2NtcjIgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NGQVNUX1NUQVRFKFRJTV9PQ0Zhc3QpKTsNCiAgLyogR2V0IHRoZSBUSU14IENDTVIyIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQogIC8qIFJlc2V0IHRoZSBPQzRGRSBCaXQgKi8NCiAgdG1wY2NtcjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzRGRSk7DQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEJpdCAqLw0KICB0bXBjY21yMiB8PSAodWludDE2X3QpKFRJTV9PQ0Zhc3QgPDwgOCk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgKi8NCiAgVElNeC0+Q0NNUjIgPSB0bXBjY21yMjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgb3Igc2FmZWd1YXJkcyB0aGUgT0NSRUYxIHNpZ25hbCBvbiBhbiBleHRlcm5hbCBldmVudA0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DQ2xlYXI6IG5ldyBzdGF0ZSBvZiB0aGUgT3V0cHV0IENvbXBhcmUgQ2xlYXIgRW5hYmxlIEJpdC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DQ2xlYXJfRW5hYmxlOiBUSU0gT3V0cHV0IGNsZWFyIGVuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ0NsZWFyX0Rpc2FibGU6IFRJTSBPdXRwdXQgY2xlYXIgZGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fQ2xlYXJPQzFSZWYoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ0NsZWFyKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMSA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0NMRUFSX1NUQVRFKFRJTV9PQ0NsZWFyKSk7DQoNCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCg0KICAvKiBSZXNldCB0aGUgT0MxQ0UgQml0ICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MxQ0UpOw0KICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgQ2xlYXIgQml0ICovDQogIHRtcGNjbXIxIHw9IFRJTV9PQ0NsZWFyOw0KICAvKiBXcml0ZSB0byBUSU14IENDTVIxIHJlZ2lzdGVyICovDQogIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIG9yIHNhZmVndWFyZHMgdGhlIE9DUkVGMiBzaWduYWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQNCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxLCAyLCAzLCA0LCA1IG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ0NsZWFyOiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIENsZWFyIEVuYWJsZSBCaXQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9PQ0NsZWFyX0VuYWJsZTogVElNIE91dHB1dCBjbGVhciBlbmFibGUNCiAgKiAgICAgQGFyZyBUSU1fT0NDbGVhcl9EaXNhYmxlOiBUSU0gT3V0cHV0IGNsZWFyIGRpc2FibGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0NsZWFyT0MyUmVmKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NDbGVhcikNCnsNCiAgdWludDE2X3QgdG1wY2NtcjEgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NDTEVBUl9TVEFURShUSU1fT0NDbGVhcikpOw0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KICAvKiBSZXNldCB0aGUgT0MyQ0UgQml0ICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfT0MyQ0UpOw0KICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgQ2xlYXIgQml0ICovDQogIHRtcGNjbXIxIHw9ICh1aW50MTZfdCkoVElNX09DQ2xlYXIgPDwgOCk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgcmVnaXN0ZXIgKi8NCiAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgb3Igc2FmZWd1YXJkcyB0aGUgT0NSRUYzIHNpZ25hbCBvbiBhbiBleHRlcm5hbCBldmVudA0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DQ2xlYXI6IG5ldyBzdGF0ZSBvZiB0aGUgT3V0cHV0IENvbXBhcmUgQ2xlYXIgRW5hYmxlIEJpdC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DQ2xlYXJfRW5hYmxlOiBUSU0gT3V0cHV0IGNsZWFyIGVuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ0NsZWFyX0Rpc2FibGU6IFRJTSBPdXRwdXQgY2xlYXIgZGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fQ2xlYXJPQzNSZWYoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ0NsZWFyKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMiA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0NMRUFSX1NUQVRFKFRJTV9PQ0NsZWFyKSk7DQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQogIC8qIFJlc2V0IHRoZSBPQzNDRSBCaXQgKi8NCiAgdG1wY2NtcjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzNDRSk7DQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBDbGVhciBCaXQgKi8NCiAgdG1wY2NtcjIgfD0gVElNX09DQ2xlYXI7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgcmVnaXN0ZXIgKi8NCiAgVElNeC0+Q0NNUjIgPSB0bXBjY21yMjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgb3Igc2FmZWd1YXJkcyB0aGUgT0NSRUY0IHNpZ25hbCBvbiBhbiBleHRlcm5hbCBldmVudA0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DQ2xlYXI6IG5ldyBzdGF0ZSBvZiB0aGUgT3V0cHV0IENvbXBhcmUgQ2xlYXIgRW5hYmxlIEJpdC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DQ2xlYXJfRW5hYmxlOiBUSU0gT3V0cHV0IGNsZWFyIGVuYWJsZQ0KICAqICAgICBAYXJnIFRJTV9PQ0NsZWFyX0Rpc2FibGU6IFRJTSBPdXRwdXQgY2xlYXIgZGlzYWJsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fQ2xlYXJPQzRSZWYoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ0NsZWFyKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMiA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ0NMRUFSX1NUQVRFKFRJTV9PQ0NsZWFyKSk7DQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQogIC8qIFJlc2V0IHRoZSBPQzRDRSBCaXQgKi8NCiAgdG1wY2NtcjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9PQzRDRSk7DQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBDbGVhciBCaXQgKi8NCiAgdG1wY2NtcjIgfD0gKHVpbnQxNl90KShUSU1fT0NDbGVhciA8PCA4KTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiByZWdpc3RlciAqLw0KICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggY2hhbm5lbCAxIHBvbGFyaXR5Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyBleGNlcHQgNiBhbmQgNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DUG9sYXJpdHk6IHNwZWNpZmllcyB0aGUgT0MxIFBvbGFyaXR5DQogICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DUG9sYXJpdHlfSGlnaDogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGhpZ2gNCiAgKiAgICAgQGFyZyBUSU1fT0NQb2xhcml0eV9Mb3c6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBsb3cNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX09DMVBvbGFyaXR5Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NQb2xhcml0eSkNCnsNCiAgdWludDE2X3QgdG1wY2NlciA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDhfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ19QT0xBUklUWShUSU1fT0NQb2xhcml0eSkpOw0KICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzFQIEJpdCAqLw0KICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzFQKTsNCiAgdG1wY2NlciB8PSBUSU1fT0NQb2xhcml0eTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ0VSIHJlZ2lzdGVyICovDQogIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggQ2hhbm5lbCAxTiBwb2xhcml0eS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDgsIDE1LCAxNiBvciAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX09DTlBvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIE9DMU4gUG9sYXJpdHkNCiAgKiAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fT0NOUG9sYXJpdHlfSGlnaDogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGhpZ2gNCiAgKiAgICAgQGFyZyBUSU1fT0NOUG9sYXJpdHlfTG93OiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgbG93DQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9PQzFOUG9sYXJpdHlDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ05Qb2xhcml0eSkNCnsNCiAgdWludDE2X3QgdG1wY2NlciA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDJfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PQ05fUE9MQVJJVFkoVElNX09DTlBvbGFyaXR5KSk7DQogICANCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIC8qIFNldCBvciBSZXNldCB0aGUgQ0MxTlAgQml0ICovDQogIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMU5QKTsNCiAgdG1wY2NlciB8PSBUSU1fT0NOUG9sYXJpdHk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiByZWdpc3RlciAqLw0KICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IGNoYW5uZWwgMiBwb2xhcml0eS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUsIDgsIDksIDEyIG9yIDE1IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBPQzIgUG9sYXJpdHkNCiAgKiAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fT0NQb2xhcml0eV9IaWdoOiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgaGlnaA0KICAqICAgICBAYXJnIFRJTV9PQ1BvbGFyaXR5X0xvdzogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGxvdw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MyUG9sYXJpdHlDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ1BvbGFyaXR5KQ0Kew0KICB1aW50MTZfdCB0bXBjY2VyID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNl9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ1BvbGFyaXR5KSk7DQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDMlAgQml0ICovDQogIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMlApOw0KICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DUG9sYXJpdHkgPDwgNCk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiByZWdpc3RlciAqLw0KICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IENoYW5uZWwgMk4gcG9sYXJpdHkuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ05Qb2xhcml0eTogc3BlY2lmaWVzIHRoZSBPQzJOIFBvbGFyaXR5DQogICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DTlBvbGFyaXR5X0hpZ2g6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBoaWdoDQogICogICAgIEBhcmcgVElNX09DTlBvbGFyaXR5X0xvdzogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGxvdw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MyTlBvbGFyaXR5Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NOUG9sYXJpdHkpDQp7DQogIHVpbnQxNl90IHRtcGNjZXIgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QxX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NOX1BPTEFSSVRZKFRJTV9PQ05Qb2xhcml0eSkpOw0KICANCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIC8qIFNldCBvciBSZXNldCB0aGUgQ0MyTlAgQml0ICovDQogIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDMk5QKTsNCiAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9PQ05Qb2xhcml0eSA8PCA0KTsNCiAgLyogV3JpdGUgdG8gVElNeCBDQ0VSIHJlZ2lzdGVyICovDQogIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggY2hhbm5lbCAzIHBvbGFyaXR5Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fT0NQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBPQzMgUG9sYXJpdHkNCiAgKiAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fT0NQb2xhcml0eV9IaWdoOiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgaGlnaA0KICAqICAgICBAYXJnIFRJTV9PQ1BvbGFyaXR5X0xvdzogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGxvdw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MzUG9sYXJpdHlDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9PQ1BvbGFyaXR5KQ0Kew0KICB1aW50MTZfdCB0bXBjY2VyID0gMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ1BvbGFyaXR5KSk7DQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDM1AgQml0ICovDQogIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ0VSX0NDM1ApOw0KICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DUG9sYXJpdHkgPDwgOCk7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiByZWdpc3RlciAqLw0KICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU14IENoYW5uZWwgM04gcG9sYXJpdHkuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ05Qb2xhcml0eTogc3BlY2lmaWVzIHRoZSBPQzNOIFBvbGFyaXR5DQogICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09DTlBvbGFyaXR5X0hpZ2g6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBoaWdoDQogICogICAgIEBhcmcgVElNX09DTlBvbGFyaXR5X0xvdzogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGxvdw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fT0MzTlBvbGFyaXR5Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fT0NOUG9sYXJpdHkpDQp7DQogIHVpbnQxNl90IHRtcGNjZXIgPSAwOw0KIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QxX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NOX1BPTEFSSVRZKFRJTV9PQ05Qb2xhcml0eSkpOw0KICAgIA0KICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzNOUCBCaXQgKi8NCiAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0MzTlApOw0KICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX09DTlBvbGFyaXR5IDw8IDgpOw0KICAvKiBXcml0ZSB0byBUSU14IENDRVIgcmVnaXN0ZXIgKi8NCiAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBjaGFubmVsIDQgcG9sYXJpdHkuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxLCAyLCAzLCA0LCA1IG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PQ1BvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIE9DNCBQb2xhcml0eQ0KICAqICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9PQ1BvbGFyaXR5X0hpZ2g6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBoaWdoDQogICogICAgIEBhcmcgVElNX09DUG9sYXJpdHlfTG93OiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgbG93DQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9PQzRQb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09DUG9sYXJpdHkpDQp7DQogIHVpbnQxNl90IHRtcGNjZXIgPSAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoVElNX09DUG9sYXJpdHkpKTsNCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIC8qIFNldCBvciBSZXNldCB0aGUgQ0M0UCBCaXQgKi8NCiAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0M0UCk7DQogIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fT0NQb2xhcml0eSA8PCAxMik7DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiByZWdpc3RlciAqLw0KICBUSU14LT5DQ0VSID0gdG1wY2NlcjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU0gQ2FwdHVyZSBDb21wYXJlIENoYW5uZWwgeC4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgZXhjZXB0IDYgYW5kIDcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9DaGFubmVsOiBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsDQogICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0NoYW5uZWxfMTogVElNIENoYW5uZWwgMQ0KICAqICAgICBAYXJnIFRJTV9DaGFubmVsXzI6IFRJTSBDaGFubmVsIDINCiAgKiAgICAgQGFyZyBUSU1fQ2hhbm5lbF8zOiBUSU0gQ2hhbm5lbCAzDQogICogICAgIEBhcmcgVElNX0NoYW5uZWxfNDogVElNIENoYW5uZWwgNA0KICAqIEBwYXJhbSAgVElNX0NDeDogc3BlY2lmaWVzIHRoZSBUSU0gQ2hhbm5lbCBDQ3hFIGJpdCBuZXcgc3RhdGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IFRJTV9DQ3hfRW5hYmxlIG9yIFRJTV9DQ3hfRGlzYWJsZS4gDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9DQ3hDbWQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9DaGFubmVsLCB1aW50MTZfdCBUSU1fQ0N4KQ0Kew0KICB1aW50MTZfdCB0bXAgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDhfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DSEFOTkVMKFRJTV9DaGFubmVsKSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fQ0NYKFRJTV9DQ3gpKTsNCg0KICB0bXAgPSBDQ0VSX0NDRV9TZXQgPDwgVElNX0NoYW5uZWw7DQoNCiAgLyogUmVzZXQgdGhlIENDeEUgQml0ICovDQogIFRJTXgtPkNDRVIgJj0gKHVpbnQxNl90KX4gdG1wOw0KDQogIC8qIFNldCBvciByZXNldCB0aGUgQ0N4RSBCaXQgKi8gDQogIFRJTXgtPkNDRVIgfD0gICh1aW50MTZfdCkoVElNX0NDeCA8PCBUSU1fQ2hhbm5lbCk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNIENhcHR1cmUgQ29tcGFyZSBDaGFubmVsIHhOLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgOCwgMTUsIDE2IG9yIDE3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fQ2hhbm5lbDogc3BlY2lmaWVzIHRoZSBUSU0gQ2hhbm5lbA0KICAqICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9DaGFubmVsXzE6IFRJTSBDaGFubmVsIDENCiAgKiAgICAgQGFyZyBUSU1fQ2hhbm5lbF8yOiBUSU0gQ2hhbm5lbCAyDQogICogICAgIEBhcmcgVElNX0NoYW5uZWxfMzogVElNIENoYW5uZWwgMw0KICAqIEBwYXJhbSAgVElNX0NDeE46IHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwgQ0N4TkUgYml0IG5ldyBzdGF0ZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogVElNX0NDeE5fRW5hYmxlIG9yIFRJTV9DQ3hOX0Rpc2FibGUuIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fQ0N4TkNtZChUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0NoYW5uZWwsIHVpbnQxNl90IFRJTV9DQ3hOKQ0Kew0KICB1aW50MTZfdCB0bXAgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDJfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT01QTEVNRU5UQVJZX0NIQU5ORUwoVElNX0NoYW5uZWwpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOKFRJTV9DQ3hOKSk7DQoNCiAgdG1wID0gQ0NFUl9DQ05FX1NldCA8PCBUSU1fQ2hhbm5lbDsNCg0KICAvKiBSZXNldCB0aGUgQ0N4TkUgQml0ICovDQogIFRJTXgtPkNDRVIgJj0gKHVpbnQxNl90KSB+dG1wOw0KDQogIC8qIFNldCBvciByZXNldCB0aGUgQ0N4TkUgQml0ICovIA0KICBUSU14LT5DQ0VSIHw9ICAodWludDE2X3QpKFRJTV9DQ3hOIDw8IFRJTV9DaGFubmVsKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZWxlY3RzIHRoZSBUSU0gT3VwdXQgQ29tcGFyZSBNb2RlLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBiZWZvcmUgY2hhbmdpbmcgdGhlIE91cHV0DQogICogICAgICAgICBDb21wYXJlIE1vZGUuDQogICogICAgICAgICBVc2VyIGhhcyB0byBlbmFibGUgdGhpcyBjaGFubmVsIHVzaW5nIFRJTV9DQ3hDbWQgYW5kIFRJTV9DQ3hOQ21kIGZ1bmN0aW9ucy4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgZXhjZXB0IDYgYW5kIDcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9DaGFubmVsOiBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsDQogICogICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0NoYW5uZWxfMTogVElNIENoYW5uZWwgMQ0KICAqICAgICBAYXJnIFRJTV9DaGFubmVsXzI6IFRJTSBDaGFubmVsIDINCiAgKiAgICAgQGFyZyBUSU1fQ2hhbm5lbF8zOiBUSU0gQ2hhbm5lbCAzDQogICogICAgIEBhcmcgVElNX0NoYW5uZWxfNDogVElNIENoYW5uZWwgNA0KICAqIEBwYXJhbSAgVElNX09DTW9kZTogc3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgTW9kZS4NCiAgKiAgIFRoaXMgcGFyYW10ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fT0NNb2RlX1RpbWluZw0KICAqICAgICBAYXJnIFRJTV9PQ01vZGVfQWN0aXZlDQogICogICAgIEBhcmcgVElNX09DTW9kZV9Ub2dnbGUNCiAgKiAgICAgQGFyZyBUSU1fT0NNb2RlX1BXTTENCiAgKiAgICAgQGFyZyBUSU1fT0NNb2RlX1BXTTINCiAgKiAgICAgQGFyZyBUSU1fRm9yY2VkQWN0aW9uX0FjdGl2ZQ0KICAqICAgICBAYXJnIFRJTV9Gb3JjZWRBY3Rpb25fSW5BY3RpdmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NlbGVjdE9DeE0oVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9DaGFubmVsLCB1aW50MTZfdCBUSU1fT0NNb2RlKQ0Kew0KICB1aW50MzJfdCB0bXAgPSAwOw0KICB1aW50MTZfdCB0bXAxID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q4X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fQ0hBTk5FTChUSU1fQ2hhbm5lbCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTShUSU1fT0NNb2RlKSk7DQoNCiAgdG1wID0gKHVpbnQzMl90KSBUSU14Ow0KICB0bXAgKz0gQ0NNUl9PZmZzZXQ7DQoNCiAgdG1wMSA9IENDRVJfQ0NFX1NldCA8PCAodWludDE2X3QpVElNX0NoYW5uZWw7DQoNCiAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbDogUmVzZXQgdGhlIENDeEUgQml0ICovDQogIFRJTXgtPkNDRVIgJj0gKHVpbnQxNl90KSB+dG1wMTsNCg0KICBpZigoVElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMSkgfHwoVElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMykpDQogIHsNCiAgICB0bXAgKz0gKFRJTV9DaGFubmVsPj4xKTsNCg0KICAgIC8qIFJlc2V0IHRoZSBPQ3hNIGJpdHMgaW4gdGhlIENDTVJ4IHJlZ2lzdGVyICovDQogICAgKihfX0lPIHVpbnQzMl90ICopIHRtcCAmPSAodWludDMyX3QpfigodWludDMyX3QpVElNX0NDTVIxX09DMU0pOw0KICAgDQogICAgLyogQ29uZmlndXJlIHRoZSBPQ3hNIGJpdHMgaW4gdGhlIENDTVJ4IHJlZ2lzdGVyICovDQogICAgKihfX0lPIHVpbnQzMl90ICopIHRtcCB8PSBUSU1fT0NNb2RlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHRtcCArPSAodWludDE2X3QpKFRJTV9DaGFubmVsIC0gKHVpbnQxNl90KTQpPj4gKHVpbnQxNl90KTE7DQoNCiAgICAvKiBSZXNldCB0aGUgT0N4TSBiaXRzIGluIHRoZSBDQ01SeCByZWdpc3RlciAqLw0KICAgICooX19JTyB1aW50MzJfdCAqKSB0bXAgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KVRJTV9DQ01SMV9PQzJNKTsNCiAgICANCiAgICAvKiBDb25maWd1cmUgdGhlIE9DeE0gYml0cyBpbiB0aGUgQ0NNUnggcmVnaXN0ZXIgKi8NCiAgICAqKF9fSU8gdWludDMyX3QgKikgdG1wIHw9ICh1aW50MTZfdCkoVElNX09DTW9kZSA8PCA4KTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgRGlzYWJsZXMgdGhlIFRJTXggVXBkYXRlIGV2ZW50Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBVRElTIGJpdA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1VwZGF0ZURpc2FibGVDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBTZXQgdGhlIFVwZGF0ZSBEaXNhYmxlIEJpdCAqLw0KICAgIFRJTXgtPkNSMSB8PSBUSU1fQ1IxX1VESVM7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmVzZXQgdGhlIFVwZGF0ZSBEaXNhYmxlIEJpdCAqLw0KICAgIFRJTXgtPkNSMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMV9VRElTKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTXggVXBkYXRlIFJlcXVlc3QgSW50ZXJydXB0IHNvdXJjZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9VcGRhdGVTb3VyY2U6IHNwZWNpZmllcyB0aGUgVXBkYXRlIHNvdXJjZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX1VwZGF0ZVNvdXJjZV9SZWd1bGFyOiBTb3VyY2Ugb2YgdXBkYXRlIGlzIHRoZSBjb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIHNldHRpbmcgb2YgVUcgYml0LCBvciBhbiB1cGRhdGUgZ2VuZXJhdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyLg0KICAqICAgICBAYXJnIFRJTV9VcGRhdGVTb3VyY2VfR2xvYmFsOiBTb3VyY2Ugb2YgdXBkYXRlIGlzIGNvdW50ZXIgb3ZlcmZsb3cvdW5kZXJmbG93Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fVXBkYXRlUmVxdWVzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX1VwZGF0ZVNvdXJjZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9VUERBVEVfU09VUkNFKFRJTV9VcGRhdGVTb3VyY2UpKTsNCiAgaWYgKFRJTV9VcGRhdGVTb3VyY2UgIT0gVElNX1VwZGF0ZVNvdXJjZV9HbG9iYWwpDQogIHsNCiAgICAvKiBTZXQgdGhlIFVSUyBCaXQgKi8NCiAgICBUSU14LT5DUjEgfD0gVElNX0NSMV9VUlM7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmVzZXQgdGhlIFVSUyBCaXQgKi8NCiAgICBUSU14LT5DUjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DUjFfVVJTKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTXiScyBIYWxsIHNlbnNvciBpbnRlcmZhY2UuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxLCAyLCAzLCA0LCA1IG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTXggSGFsbCBzZW5zb3IgaW50ZXJmYWNlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NlbGVjdEhhbGxTZW5zb3IoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNl9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIFNldCB0aGUgVEkxUyBCaXQgKi8NCiAgICBUSU14LT5DUjIgfD0gVElNX0NSMl9USTFTOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFJlc2V0IHRoZSBUSTFTIEJpdCAqLw0KICAgIFRJTXgtPkNSMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMl9USTFTKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIFRJTXiScyBPbmUgUHVsc2UgTW9kZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9PUE1vZGU6IHNwZWNpZmllcyB0aGUgT1BNIE1vZGUgdG8gYmUgdXNlZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX09QTW9kZV9TaW5nbGUNCiAgKiAgICAgQGFyZyBUSU1fT1BNb2RlX1JlcGV0aXRpdmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NlbGVjdE9uZVB1bHNlTW9kZShUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX09QTW9kZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PUE1fTU9ERShUSU1fT1BNb2RlKSk7DQogIC8qIFJlc2V0IHRoZSBPUE0gQml0ICovDQogIFRJTXgtPkNSMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMV9PUE0pOw0KICAvKiBDb25maWd1cmUgdGhlIE9QTSBNb2RlICovDQogIFRJTXgtPkNSMSB8PSBUSU1fT1BNb2RlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIFRJTXggVHJpZ2dlciBPdXRwdXQgTW9kZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEyIG9yIDE1IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fVFJHT1NvdXJjZTogc3BlY2lmaWVzIHRoZSBUcmlnZ2VyIE91dHB1dCBzb3VyY2UuDQogICogICBUaGlzIHBhcmFtdGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICoNCiAgKiAgLSBGb3IgYWxsIFRJTXgNCiAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9SZXNldDogIFRoZSBVRyBiaXQgaW4gdGhlIFRJTV9FR1IgcmVnaXN0ZXIgaXMgdXNlZCBhcyB0aGUgdHJpZ2dlciBvdXRwdXQgKFRSR08pLg0KICAqICAgICBAYXJnIFRJTV9UUkdPU291cmNlX0VuYWJsZTogVGhlIENvdW50ZXIgRW5hYmxlIENFTiBpcyB1c2VkIGFzIHRoZSB0cmlnZ2VyIG91dHB1dCAoVFJHTykuDQogICogICAgIEBhcmcgVElNX1RSR09Tb3VyY2VfVXBkYXRlOiBUaGUgdXBkYXRlIGV2ZW50IGlzIHNlbGVjdGVkIGFzIHRoZSB0cmlnZ2VyIG91dHB1dCAoVFJHTykuDQogICoNCiAgKiAgLSBGb3IgYWxsIFRJTXggZXhjZXB0IFRJTTYgYW5kIFRJTTcNCiAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9PQzE6IFRoZSB0cmlnZ2VyIG91dHB1dCBzZW5kcyBhIHBvc2l0aXZlIHB1bHNlIHdoZW4gdGhlIENDMUlGIGZsYWcNCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRvIGJlIHNldCwgYXMgc29vbiBhcyBhIGNhcHR1cmUgb3IgY29tcGFyZSBtYXRjaCBvY2N1cnMgKFRSR08pLg0KICAqICAgICBAYXJnIFRJTV9UUkdPU291cmNlX09DMVJlZjogT0MxUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRoZSB0cmlnZ2VyIG91dHB1dCAoVFJHTykuDQogICogICAgIEBhcmcgVElNX1RSR09Tb3VyY2VfT0MyUmVmOiBPQzJSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdGhlIHRyaWdnZXIgb3V0cHV0IChUUkdPKS4NCiAgKiAgICAgQGFyZyBUSU1fVFJHT1NvdXJjZV9PQzNSZWY6IE9DM1JFRiBzaWduYWwgaXMgdXNlZCBhcyB0aGUgdHJpZ2dlciBvdXRwdXQgKFRSR08pLg0KICAqICAgICBAYXJnIFRJTV9UUkdPU291cmNlX09DNFJlZjogT0M0UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRoZSB0cmlnZ2VyIG91dHB1dCAoVFJHTykuDQogICoNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NlbGVjdE91dHB1dFRyaWdnZXIoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9UUkdPU291cmNlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q3X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fVFJHT19TT1VSQ0UoVElNX1RSR09Tb3VyY2UpKTsNCiAgLyogUmVzZXQgdGhlIE1NUyBCaXRzICovDQogIFRJTXgtPkNSMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NSMl9NTVMpOw0KICAvKiBTZWxlY3QgdGhlIFRSR08gc291cmNlICovDQogIFRJTXgtPkNSMiB8PSAgVElNX1RSR09Tb3VyY2U7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2VsZWN0cyB0aGUgVElNeCBTbGF2ZSBNb2RlLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9TbGF2ZU1vZGU6IHNwZWNpZmllcyB0aGUgVGltZXIgU2xhdmUgTW9kZS4NCiAgKiAgIFRoaXMgcGFyYW10ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fU2xhdmVNb2RlX1Jlc2V0OiBSaXNpbmcgZWRnZSBvZiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciBzaWduYWwgKFRSR0kpIHJlLWluaXRpYWxpemVzDQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvdW50ZXIgYW5kIHRyaWdnZXJzIGFuIHVwZGF0ZSBvZiB0aGUgcmVnaXN0ZXJzLg0KICAqICAgICBAYXJnIFRJTV9TbGF2ZU1vZGVfR2F0ZWQ6ICAgICBUaGUgY291bnRlciBjbG9jayBpcyBlbmFibGVkIHdoZW4gdGhlIHRyaWdnZXIgc2lnbmFsIChUUkdJKSBpcyBoaWdoLg0KICAqICAgICBAYXJnIFRJTV9TbGF2ZU1vZGVfVHJpZ2dlcjogICBUaGUgY291bnRlciBzdGFydHMgYXQgYSByaXNpbmcgZWRnZSBvZiB0aGUgdHJpZ2dlciBUUkdJLg0KICAqICAgICBAYXJnIFRJTV9TbGF2ZU1vZGVfRXh0ZXJuYWwxOiBSaXNpbmcgZWRnZXMgb2YgdGhlIHNlbGVjdGVkIHRyaWdnZXIgKFRSR0kpIGNsb2NrIHRoZSBjb3VudGVyLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2VsZWN0U2xhdmVNb2RlKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fU2xhdmVNb2RlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1Q2X1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfTU9ERShUSU1fU2xhdmVNb2RlKSk7DQogLyogUmVzZXQgdGhlIFNNUyBCaXRzICovDQogIFRJTXgtPlNNQ1IgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9TTUNSX1NNUyk7DQogIC8qIFNlbGVjdCB0aGUgU2xhdmUgTW9kZSAqLw0KICBUSU14LT5TTUNSIHw9IFRJTV9TbGF2ZU1vZGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyBvciBSZXNldHMgdGhlIFRJTXggTWFzdGVyL1NsYXZlIE1vZGUuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxLCAyLCAzLCA0LCA1LCA4LCA5LCAxMiBvciAxNSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX01hc3RlclNsYXZlTW9kZTogc3BlY2lmaWVzIHRoZSBUaW1lciBNYXN0ZXIgU2xhdmUgTW9kZS4NCiAgKiAgIFRoaXMgcGFyYW10ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fTWFzdGVyU2xhdmVNb2RlX0VuYWJsZTogc3luY2hyb25pemF0aW9uIGJldHdlZW4gdGhlIGN1cnJlbnQgdGltZXINCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGl0cyBzbGF2ZXMgKHRocm91Z2ggVFJHTykuDQogICogICAgIEBhcmcgVElNX01hc3RlclNsYXZlTW9kZV9EaXNhYmxlOiBObyBhY3Rpb24NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NlbGVjdE1hc3RlclNsYXZlTW9kZShUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX01hc3RlclNsYXZlTW9kZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNl9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX01TTV9TVEFURShUSU1fTWFzdGVyU2xhdmVNb2RlKSk7DQogIC8qIFJlc2V0IHRoZSBNU00gQml0ICovDQogIFRJTXgtPlNNQ1IgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9TTUNSX01TTSk7DQogIA0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIE1TTSBCaXQgKi8NCiAgVElNeC0+U01DUiB8PSBUSU1fTWFzdGVyU2xhdmVNb2RlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggQ291bnRlciBSZWdpc3RlciB2YWx1ZQ0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgQ291bnRlcjogc3BlY2lmaWVzIHRoZSBDb3VudGVyIHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NldENvdW50ZXIoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IENvdW50ZXIpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fQUxMX1BFUklQSChUSU14KSk7DQogIC8qIFNldCB0aGUgQ291bnRlciBSZWdpc3RlciB2YWx1ZSAqLw0KICBUSU14LT5DTlQgPSBDb3VudGVyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggQXV0b3JlbG9hZCBSZWdpc3RlciB2YWx1ZQ0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgQXV0b3JlbG9hZDogc3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NldEF1dG9yZWxvYWQoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IEF1dG9yZWxvYWQpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fQUxMX1BFUklQSChUSU14KSk7DQogIC8qIFNldCB0aGUgQXV0b3JlbG9hZCBSZWdpc3RlciB2YWx1ZSAqLw0KICBUSU14LT5BUlIgPSBBdXRvcmVsb2FkOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggQ2FwdHVyZSBDb21wYXJlMSBSZWdpc3RlciB2YWx1ZQ0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyBleGNlcHQgNiBhbmQgNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgQ29tcGFyZTE6IHNwZWNpZmllcyB0aGUgQ2FwdHVyZSBDb21wYXJlMSByZWdpc3RlciBuZXcgdmFsdWUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9TZXRDb21wYXJlMShUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgQ29tcGFyZTEpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDhfUEVSSVBIKFRJTXgpKTsNCiAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUxIFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTXgtPkNDUjEgPSBDb21wYXJlMTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBUSU14IENhcHR1cmUgQ29tcGFyZTIgUmVnaXN0ZXIgdmFsdWUNCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUsIDgsIDksIDEyIG9yIDE1IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBDb21wYXJlMjogc3BlY2lmaWVzIHRoZSBDYXB0dXJlIENvbXBhcmUyIHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NldENvbXBhcmUyKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBDb21wYXJlMikNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUNl9QRVJJUEgoVElNeCkpOw0KICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZTIgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgVElNeC0+Q0NSMiA9IENvbXBhcmUyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggQ2FwdHVyZSBDb21wYXJlMyBSZWdpc3RlciB2YWx1ZQ0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBDb21wYXJlMzogc3BlY2lmaWVzIHRoZSBDYXB0dXJlIENvbXBhcmUzIHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NldENvbXBhcmUzKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBDb21wYXJlMykNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZTMgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgVElNeC0+Q0NSMyA9IENvbXBhcmUzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggQ2FwdHVyZSBDb21wYXJlNCBSZWdpc3RlciB2YWx1ZQ0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBDb21wYXJlNDogc3BlY2lmaWVzIHRoZSBDYXB0dXJlIENvbXBhcmU0IHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NldENvbXBhcmU0KFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBDb21wYXJlNCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZTQgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgVElNeC0+Q0NSNCA9IENvbXBhcmU0Ow0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggSW5wdXQgQ2FwdHVyZSAxIHByZXNjYWxlci4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgZXhjZXB0IDYgYW5kIDcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JQ1BTQzogc3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlMSBwcmVzY2FsZXIgbmV3IHZhbHVlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWMTogbm8gcHJlc2NhbGVyDQogICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjI6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzDQogICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjQ6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzDQogICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjg6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDggZXZlbnRzDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9TZXRJQzFQcmVzY2FsZXIoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BTQykNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihUSU1fSUNQU0MpKTsNCiAgLyogUmVzZXQgdGhlIElDMVBTQyBCaXRzICovDQogIFRJTXgtPkNDTVIxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfSUMxUFNDKTsNCiAgLyogU2V0IHRoZSBJQzFQU0MgdmFsdWUgKi8NCiAgVElNeC0+Q0NNUjEgfD0gVElNX0lDUFNDOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggSW5wdXQgQ2FwdHVyZSAyIHByZXNjYWxlci4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUsIDgsIDksIDEyIG9yIDE1IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fSUNQU0M6IHNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZTIgcHJlc2NhbGVyIG5ldyB2YWx1ZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcg0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYyOiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSAyIGV2ZW50cw0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cw0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2V0SUMyUHJlc2NhbGVyKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQU0MpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoVElNX0lDUFNDKSk7DQogIC8qIFJlc2V0IHRoZSBJQzJQU0MgQml0cyAqLw0KICBUSU14LT5DQ01SMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIxX0lDMlBTQyk7DQogIC8qIFNldCB0aGUgSUMyUFNDIHZhbHVlICovDQogIFRJTXgtPkNDTVIxIHw9ICh1aW50MTZfdCkoVElNX0lDUFNDIDw8IDgpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFRJTXggSW5wdXQgQ2FwdHVyZSAzIHByZXNjYWxlci4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0lDUFNDOiBzcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUzIHByZXNjYWxlciBuZXcgdmFsdWUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXINCiAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMNCiAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWNDogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgNCBldmVudHMNCiAgKiAgICAgQGFyZyBUSU1fSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX1NldElDM1ByZXNjYWxlcihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lDUFNDKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7DQogIGFzc2VydF9wYXJhbShJU19USU1fSUNfUFJFU0NBTEVSKFRJTV9JQ1BTQykpOw0KICAvKiBSZXNldCB0aGUgSUMzUFNDIEJpdHMgKi8NCiAgVElNeC0+Q0NNUjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVRJTV9DQ01SMl9JQzNQU0MpOw0KICAvKiBTZXQgdGhlIElDM1BTQyB2YWx1ZSAqLw0KICBUSU14LT5DQ01SMiB8PSBUSU1fSUNQU0M7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgVElNeCBJbnB1dCBDYXB0dXJlIDQgcHJlc2NhbGVyLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fSUNQU0M6IHNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZTQgcHJlc2NhbGVyIG5ldyB2YWx1ZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcg0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVYyOiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSAyIGV2ZW50cw0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cw0KICAqICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2V0SUM0UHJlc2NhbGVyKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSUNQU0MpDQp7ICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUM19QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihUSU1fSUNQU0MpKTsNCiAgLyogUmVzZXQgdGhlIElDNFBTQyBCaXRzICovDQogIFRJTXgtPkNDTVIyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfSUM0UFNDKTsNCiAgLyogU2V0IHRoZSBJQzRQU0MgdmFsdWUgKi8NCiAgVElNeC0+Q0NNUjIgfD0gKHVpbnQxNl90KShUSU1fSUNQU0MgPDwgOCk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgVElNeCBDbG9jayBEaXZpc2lvbiB2YWx1ZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlICAxIHRvIDE3IGV4Y2VwdCA2IGFuZCA3IHRvIHNlbGVjdCANCiAgKiAgIHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9DS0Q6IHNwZWNpZmllcyB0aGUgY2xvY2sgZGl2aXNpb24gdmFsdWUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWU6DQogICogICAgIEBhcmcgVElNX0NLRF9ESVYxOiBURFRTID0gVGNrX3RpbQ0KICAqICAgICBAYXJnIFRJTV9DS0RfRElWMjogVERUUyA9IDIqVGNrX3RpbQ0KICAqICAgICBAYXJnIFRJTV9DS0RfRElWNDogVERUUyA9IDQqVGNrX3RpbQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBUSU1fU2V0Q2xvY2tEaXZpc2lvbihUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0NLRCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MSVNUOF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0NLRF9ESVYoVElNX0NLRCkpOw0KICAvKiBSZXNldCB0aGUgQ0tEIEJpdHMgKi8NCiAgVElNeC0+Q1IxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ1IxX0NLRCk7DQogIC8qIFNldCB0aGUgQ0tEIHZhbHVlICovDQogIFRJTXgtPkNSMSB8PSBUSU1fQ0tEOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEdldHMgdGhlIFRJTXggSW5wdXQgQ2FwdHVyZSAxIHZhbHVlLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyBleGNlcHQgNiBhbmQgNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgQ2FwdHVyZSBDb21wYXJlIDEgUmVnaXN0ZXIgdmFsdWUuDQogICovDQp1aW50MTZfdCBUSU1fR2V0Q2FwdHVyZTEoVElNX1R5cGVEZWYqIFRJTXgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDhfUEVSSVBIKFRJTXgpKTsNCiAgLyogR2V0IHRoZSBDYXB0dXJlIDEgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTXgtPkNDUjE7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgR2V0cyB0aGUgVElNeCBJbnB1dCBDYXB0dXJlIDIgdmFsdWUuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxLCAyLCAzLCA0LCA1LCA4LCA5LCAxMiBvciAxNSB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgQ2FwdHVyZSBDb21wYXJlIDIgUmVnaXN0ZXIgdmFsdWUuDQogICovDQp1aW50MTZfdCBUSU1fR2V0Q2FwdHVyZTIoVElNX1R5cGVEZWYqIFRJTXgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDZfUEVSSVBIKFRJTXgpKTsNCiAgLyogR2V0IHRoZSBDYXB0dXJlIDIgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTXgtPkNDUjI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgR2V0cyB0aGUgVElNeCBJbnB1dCBDYXB0dXJlIDMgdmFsdWUuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxLCAyLCAzLCA0LCA1IG9yIDggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIENhcHR1cmUgQ29tcGFyZSAzIFJlZ2lzdGVyIHZhbHVlLg0KICAqLw0KdWludDE2X3QgVElNX0dldENhcHR1cmUzKFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0xJU1QzX1BFUklQSChUSU14KSk7IA0KICAvKiBHZXQgdGhlIENhcHR1cmUgMyBSZWdpc3RlciB2YWx1ZSAqLw0KICByZXR1cm4gVElNeC0+Q0NSMzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBHZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgNCB2YWx1ZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMsIDQsIDUgb3IgOCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgQ2FwdHVyZSBDb21wYXJlIDQgUmVnaXN0ZXIgdmFsdWUuDQogICovDQp1aW50MTZfdCBUSU1fR2V0Q2FwdHVyZTQoVElNX1R5cGVEZWYqIFRJTXgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fTElTVDNfUEVSSVBIKFRJTXgpKTsNCiAgLyogR2V0IHRoZSBDYXB0dXJlIDQgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTXgtPkNDUjQ7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgR2V0cyB0aGUgVElNeCBDb3VudGVyIHZhbHVlLg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgQ291bnRlciBSZWdpc3RlciB2YWx1ZS4NCiAgKi8NCnVpbnQxNl90IFRJTV9HZXRDb3VudGVyKFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICAvKiBHZXQgdGhlIENvdW50ZXIgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTXgtPkNOVDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBHZXRzIHRoZSBUSU14IFByZXNjYWxlciB2YWx1ZS4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIFByZXNjYWxlciBSZWdpc3RlciB2YWx1ZS4NCiAgKi8NCnVpbnQxNl90IFRJTV9HZXRQcmVzY2FsZXIoVElNX1R5cGVEZWYqIFRJTXgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19USU1fQUxMX1BFUklQSChUSU14KSk7DQogIC8qIEdldCB0aGUgUHJlc2NhbGVyIFJlZ2lzdGVyIHZhbHVlICovDQogIHJldHVybiBUSU14LT5QU0M7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBUSU0gZmxhZyBpcyBzZXQgb3Igbm90Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0ZMQUdfVXBkYXRlOiBUSU0gdXBkYXRlIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBGbGFnDQogICogICAgIEBhcmcgVElNX0ZMQUdfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRmxhZw0KICAqICAgICBAYXJnIFRJTV9GTEFHX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBGbGFnDQogICogICAgIEBhcmcgVElNX0ZMQUdfQ09NOiBUSU0gQ29tbXV0YXRpb24gRmxhZw0KICAqICAgICBAYXJnIFRJTV9GTEFHX1RyaWdnZXI6IFRJTSBUcmlnZ2VyIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19CcmVhazogVElNIEJyZWFrIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogVElNIENhcHR1cmUgQ29tcGFyZSAxIG92ZXJjYXB0dXJlIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzJPRjogVElNIENhcHR1cmUgQ29tcGFyZSAyIG92ZXJjYXB0dXJlIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogVElNIENhcHR1cmUgQ29tcGFyZSAzIG92ZXJjYXB0dXJlIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogVElNIENhcHR1cmUgQ29tcGFyZSA0IG92ZXJjYXB0dXJlIEZsYWcNCiAgKiBAbm90ZQ0KICAqICAgLSBUSU02IGFuZCBUSU03IGNhbiBoYXZlIG9ubHkgb25lIHVwZGF0ZSBmbGFnLiANCiAgKiAgIC0gVElNOSwgVElNMTIgYW5kIFRJTTE1IGNhbiBoYXZlIG9ubHkgVElNX0ZMQUdfVXBkYXRlLCBUSU1fRkxBR19DQzEsDQogICogICAgICBUSU1fRkxBR19DQzIgb3IgVElNX0ZMQUdfVHJpZ2dlci4gDQogICogICAtIFRJTTEwLCBUSU0xMSwgVElNMTMsIFRJTTE0LCBUSU0xNiBhbmQgVElNMTcgY2FuIGhhdmUgVElNX0ZMQUdfVXBkYXRlIG9yIFRJTV9GTEFHX0NDMS4gICANCiAgKiAgIC0gVElNX0ZMQUdfQnJlYWsgaXMgdXNlZCBvbmx5IHdpdGggVElNMSwgVElNOCBhbmQgVElNMTUuIA0KICAqICAgLSBUSU1fRkxBR19DT00gaXMgdXNlZCBvbmx5IHdpdGggVElNMSwgVElNOCwgVElNMTUsIFRJTTE2IGFuZCBUSU0xNy4gICAgDQogICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFRJTV9GTEFHIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KRmxhZ1N0YXR1cyBUSU1fR2V0RmxhZ1N0YXR1cyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0ZMQUcpDQp7IA0KICBJVFN0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsgIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0dFVF9GTEFHKFRJTV9GTEFHKSk7DQogIA0KICBpZiAoKFRJTXgtPlNSICYgVElNX0ZMQUcpICE9ICh1aW50MTZfdClSRVNFVCkNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgVElNeCdzIHBlbmRpbmcgZmxhZ3MuDQogICogQHBhcmFtICBUSU14OiB3aGVyZSB4IGNhbiBiZSAxIHRvIDE3IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIGJpdCB0byBjbGVhci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0ZMQUdfVXBkYXRlOiBUSU0gdXBkYXRlIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBGbGFnDQogICogICAgIEBhcmcgVElNX0ZMQUdfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRmxhZw0KICAqICAgICBAYXJnIFRJTV9GTEFHX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBGbGFnDQogICogICAgIEBhcmcgVElNX0ZMQUdfQ09NOiBUSU0gQ29tbXV0YXRpb24gRmxhZw0KICAqICAgICBAYXJnIFRJTV9GTEFHX1RyaWdnZXI6IFRJTSBUcmlnZ2VyIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19CcmVhazogVElNIEJyZWFrIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogVElNIENhcHR1cmUgQ29tcGFyZSAxIG92ZXJjYXB0dXJlIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzJPRjogVElNIENhcHR1cmUgQ29tcGFyZSAyIG92ZXJjYXB0dXJlIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogVElNIENhcHR1cmUgQ29tcGFyZSAzIG92ZXJjYXB0dXJlIEZsYWcNCiAgKiAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogVElNIENhcHR1cmUgQ29tcGFyZSA0IG92ZXJjYXB0dXJlIEZsYWcNCiAgKiBAbm90ZQ0KICAqICAgLSBUSU02IGFuZCBUSU03IGNhbiBoYXZlIG9ubHkgb25lIHVwZGF0ZSBmbGFnLiANCiAgKiAgIC0gVElNOSwgVElNMTIgYW5kIFRJTTE1IGNhbiBoYXZlIG9ubHkgVElNX0ZMQUdfVXBkYXRlLCBUSU1fRkxBR19DQzEsDQogICogICAgICBUSU1fRkxBR19DQzIgb3IgVElNX0ZMQUdfVHJpZ2dlci4gDQogICogICAtIFRJTTEwLCBUSU0xMSwgVElNMTMsIFRJTTE0LCBUSU0xNiBhbmQgVElNMTcgY2FuIGhhdmUgVElNX0ZMQUdfVXBkYXRlIG9yIFRJTV9GTEFHX0NDMS4gICANCiAgKiAgIC0gVElNX0ZMQUdfQnJlYWsgaXMgdXNlZCBvbmx5IHdpdGggVElNMSwgVElNOCBhbmQgVElNMTUuIA0KICAqICAgLSBUSU1fRkxBR19DT00gaXMgdXNlZCBvbmx5IHdpdGggVElNMSwgVElNOCwgVElNMTUsIFRJTTE2IGFuZCBUSU0xNy4gICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVElNX0NsZWFyRmxhZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0ZMQUcpDQp7ICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTEVBUl9GTEFHKFRJTV9GTEFHKSk7DQogICANCiAgLyogQ2xlYXIgdGhlIGZsYWdzICovDQogIFRJTXgtPlNSID0gKHVpbnQxNl90KX5USU1fRkxBRzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgVElNIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSB0byAxNyB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVElNX0lUOiBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fSVRfVXBkYXRlOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfQ0MxOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDEgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9JVF9DQzI6IFRJTSBDYXB0dXJlIENvbXBhcmUgMiBJbnRlcnJ1cHQgc291cmNlDQogICogICAgIEBhcmcgVElNX0lUX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfQ0M0OiBUSU0gQ2FwdHVyZSBDb21wYXJlIDQgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9JVF9DT006IFRJTSBDb21tdXRhdGlvbiBJbnRlcnJ1cHQgc291cmNlDQogICogICAgIEBhcmcgVElNX0lUX1RyaWdnZXI6IFRJTSBUcmlnZ2VyIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfQnJlYWs6IFRJTSBCcmVhayBJbnRlcnJ1cHQgc291cmNlDQogICogQG5vdGUNCiAgKiAgIC0gVElNNiBhbmQgVElNNyBjYW4gZ2VuZXJhdGUgb25seSBhbiB1cGRhdGUgaW50ZXJydXB0Lg0KICAqICAgLSBUSU05LCBUSU0xMiBhbmQgVElNMTUgY2FuIGhhdmUgb25seSBUSU1fSVRfVXBkYXRlLCBUSU1fSVRfQ0MxLA0KICAqICAgICAgVElNX0lUX0NDMiBvciBUSU1fSVRfVHJpZ2dlci4gDQogICogICAtIFRJTTEwLCBUSU0xMSwgVElNMTMsIFRJTTE0LCBUSU0xNiBhbmQgVElNMTcgY2FuIGhhdmUgVElNX0lUX1VwZGF0ZSBvciBUSU1fSVRfQ0MxLiAgIA0KICAqICAgLSBUSU1fSVRfQnJlYWsgaXMgdXNlZCBvbmx5IHdpdGggVElNMSwgVElNOCBhbmQgVElNMTUuIA0KICAqICAgLSBUSU1fSVRfQ09NIGlzIHVzZWQgb25seSB3aXRoIFRJTTEsIFRJTTgsIFRJTTE1LCBUSU0xNiBhbmQgVElNMTcuICANCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgdGhlIFRJTV9JVChTRVQgb3IgUkVTRVQpLg0KICAqLw0KSVRTdGF0dXMgVElNX0dldElUU3RhdHVzKFRJTV9UeXBlRGVmKiBUSU14LCB1aW50MTZfdCBUSU1fSVQpDQp7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOyAgDQogIHVpbnQxNl90IGl0c3RhdHVzID0gMHgwLCBpdGVuYWJsZSA9IDB4MDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BTExfUEVSSVBIKFRJTXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1RJTV9HRVRfSVQoVElNX0lUKSk7DQogICANCiAgaXRzdGF0dXMgPSBUSU14LT5TUiAmIFRJTV9JVDsNCiAgDQogIGl0ZW5hYmxlID0gVElNeC0+RElFUiAmIFRJTV9JVDsNCiAgaWYgKChpdHN0YXR1cyAhPSAodWludDE2X3QpUkVTRVQpICYmIChpdGVuYWJsZSAhPSAodWludDE2X3QpUkVTRVQpKQ0KICB7DQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIHJldHVybiBiaXRzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBUSU14J3MgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JVDogc3BlY2lmaWVzIHRoZSBwZW5kaW5nIGJpdCB0byBjbGVhci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lUX1VwZGF0ZTogVElNMSB1cGRhdGUgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9JVF9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBJbnRlcnJ1cHQgc291cmNlDQogICogICAgIEBhcmcgVElNX0lUX0NDMjogVElNIENhcHR1cmUgQ29tcGFyZSAyIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfQ0MzOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDMgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9JVF9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBJbnRlcnJ1cHQgc291cmNlDQogICogICAgIEBhcmcgVElNX0lUX0NPTTogVElNIENvbW11dGF0aW9uIEludGVycnVwdCBzb3VyY2UNCiAgKiAgICAgQGFyZyBUSU1fSVRfVHJpZ2dlcjogVElNIFRyaWdnZXIgSW50ZXJydXB0IHNvdXJjZQ0KICAqICAgICBAYXJnIFRJTV9JVF9CcmVhazogVElNIEJyZWFrIEludGVycnVwdCBzb3VyY2UNCiAgKiBAbm90ZQ0KICAqICAgLSBUSU02IGFuZCBUSU03IGNhbiBnZW5lcmF0ZSBvbmx5IGFuIHVwZGF0ZSBpbnRlcnJ1cHQuDQogICogICAtIFRJTTksIFRJTTEyIGFuZCBUSU0xNSBjYW4gaGF2ZSBvbmx5IFRJTV9JVF9VcGRhdGUsIFRJTV9JVF9DQzEsDQogICogICAgICBUSU1fSVRfQ0MyIG9yIFRJTV9JVF9UcmlnZ2VyLiANCiAgKiAgIC0gVElNMTAsIFRJTTExLCBUSU0xMywgVElNMTQsIFRJTTE2IGFuZCBUSU0xNyBjYW4gaGF2ZSBUSU1fSVRfVXBkYXRlIG9yIFRJTV9JVF9DQzEuICAgDQogICogICAtIFRJTV9JVF9CcmVhayBpcyB1c2VkIG9ubHkgd2l0aCBUSU0xLCBUSU04IGFuZCBUSU0xNS4gDQogICogICAtIFRJTV9JVF9DT00gaXMgdXNlZCBvbmx5IHdpdGggVElNMSwgVElNOCwgVElNMTUsIFRJTTE2IGFuZCBUSU0xNy4gICAgDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFRJTV9DbGVhcklUUGVuZGluZ0JpdChUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lUKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0FMTF9QRVJJUEgoVElNeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVElNX0lUKFRJTV9JVCkpOw0KICAvKiBDbGVhciB0aGUgSVQgcGVuZGluZyBCaXQgKi8NCiAgVElNeC0+U1IgPSAodWludDE2X3QpflRJTV9JVDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJMSBhcyBJbnB1dC4NCiAgKiBAcGFyYW0gIFRJTXg6IHdoZXJlIHggY2FuIGJlIDEgdG8gMTcgZXhjZXB0IDYgYW5kIDcgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IDogVGhlIElucHV0IFBvbGFyaXR5Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9SaXNpbmcNCiAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9GYWxsaW5nDQogICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb246IHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJOiBUSU0gSW5wdXQgMSBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMxLg0KICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9JbmRpcmVjdFRJOiBUSU0gSW5wdXQgMSBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMyLg0KICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9UUkM6IFRJTSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuDQogICogQHBhcmFtICBUSU1fSUNGaWx0ZXI6IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgVEkxX0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lDUG9sYXJpdHksIHVpbnQxNl90IFRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgVElNX0lDRmlsdGVyKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMSA9IDAsIHRtcGNjZXIgPSAwOw0KICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLw0KICBUSU14LT5DQ0VSICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzFFKTsNCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCkoKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MxUykpICYgKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfSUMxRikpKTsNCiAgdG1wY2NtcjEgfD0gKHVpbnQxNl90KShUSU1fSUNTZWxlY3Rpb24gfCAodWludDE2X3QpKFRJTV9JQ0ZpbHRlciA8PCAodWludDE2X3QpNCkpOw0KICANCiAgaWYoKFRJTXggPT0gVElNMSkgfHwgKFRJTXggPT0gVElNOCkgfHwgKFRJTXggPT0gVElNMikgfHwgKFRJTXggPT0gVElNMykgfHwNCiAgICAgKFRJTXggPT0gVElNNCkgfHwoVElNeCA9PSBUSU01KSkNCiAgew0KICAgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MxRSBCaXQgKi8NCiAgICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdCkoVElNX0NDRVJfQ0MxUCkpOw0KICAgIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fSUNQb2xhcml0eSB8ICh1aW50MTZfdClUSU1fQ0NFUl9DQzFFKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDMUUgQml0ICovDQogICAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpKFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCkpOw0KICAgIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fSUNQb2xhcml0eSB8ICh1aW50MTZfdClUSU1fQ0NFUl9DQzFFKTsNCiAgfQ0KDQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovDQogIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7DQogIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEkyIGFzIElucHV0Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSwgOCwgOSwgMTIgb3IgMTUgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IDogVGhlIElucHV0IFBvbGFyaXR5Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9SaXNpbmcNCiAgKiAgICAgQGFyZyBUSU1fSUNQb2xhcml0eV9GYWxsaW5nDQogICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb246IHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJOiBUSU0gSW5wdXQgMiBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMyLg0KICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9JbmRpcmVjdFRJOiBUSU0gSW5wdXQgMiBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMxLg0KICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9UUkM6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuDQogICogQHBhcmFtICBUSU1fSUNGaWx0ZXI6IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgVEkyX0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdWludDE2X3QgVElNX0lDUG9sYXJpdHksIHVpbnQxNl90IFRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgVElNX0lDRmlsdGVyKQ0Kew0KICB1aW50MTZfdCB0bXBjY21yMSA9IDAsIHRtcGNjZXIgPSAwLCB0bXAgPSAwOw0KICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQzJFIEJpdCAqLw0KICBUSU14LT5DQ0VSICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NFUl9DQzJFKTsNCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQogIHRtcCA9ICh1aW50MTZfdCkoVElNX0lDUG9sYXJpdHkgPDwgNCk7DQogIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyICovDQogIHRtcGNjbXIxICY9ICh1aW50MTZfdCkoKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfQ0MyUykpICYgKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjFfSUMyRikpKTsNCiAgdG1wY2NtcjEgfD0gKHVpbnQxNl90KShUSU1fSUNGaWx0ZXIgPDwgMTIpOw0KICB0bXBjY21yMSB8PSAodWludDE2X3QpKFRJTV9JQ1NlbGVjdGlvbiA8PCA4KTsNCiAgDQogIGlmKChUSU14ID09IFRJTTEpIHx8IChUSU14ID09IFRJTTgpIHx8IChUSU14ID09IFRJTTIpIHx8IChUSU14ID09IFRJTTMpIHx8DQogICAgIChUSU14ID09IFRJTTQpIHx8KFRJTXggPT0gVElNNSkpDQogIHsNCiAgICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDMkUgQml0ICovDQogICAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpKFRJTV9DQ0VSX0NDMlApKTsNCiAgICB0bXBjY2VyIHw9ICAodWludDE2X3QpKHRtcCB8ICh1aW50MTZfdClUSU1fQ0NFUl9DQzJFKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDMkUgQml0ICovDQogICAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpKFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCkpOw0KICAgIHRtcGNjZXIgfD0gKHVpbnQxNl90KShUSU1fSUNQb2xhcml0eSB8ICh1aW50MTZfdClUSU1fQ0NFUl9DQzJFKTsNCiAgfQ0KICANCiAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSBhbmQgQ0NFUiByZWdpc3RlcnMgKi8NCiAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMSA7DQogIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEkzIGFzIElucHV0Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSA6IFRoZSBJbnB1dCBQb2xhcml0eS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfUmlzaW5nDQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfRmFsbGluZw0KICAqIEBwYXJhbSAgVElNX0lDU2VsZWN0aW9uOiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9EaXJlY3RUSTogVElNIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMy4NCiAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fSW5kaXJlY3RUSTogVElNIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDNC4NCiAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fVFJDOiBUSU0gSW5wdXQgMyBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gVFJDLg0KICAqIEBwYXJhbSAgVElNX0lDRmlsdGVyOiBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnN0YXRpYyB2b2lkIFRJM19Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFRJTV9JQ0ZpbHRlcikNCnsNCiAgdWludDE2X3QgdG1wY2NtcjIgPSAwLCB0bXBjY2VyID0gMCwgdG1wID0gMDsNCiAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAzOiBSZXNldCB0aGUgQ0MzRSBCaXQgKi8NCiAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0MzRSk7DQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KICB0bXAgPSAodWludDE2X3QpKFRJTV9JQ1BvbGFyaXR5IDw8IDgpOw0KICAvKiBTZWxlY3QgdGhlIElucHV0IGFuZCBzZXQgdGhlIGZpbHRlciAqLw0KICB0bXBjY21yMiAmPSAodWludDE2X3QpKCgodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX0NDM1MpKSAmICgodWludDE2X3QpfigodWludDE2X3QpVElNX0NDTVIyX0lDM0YpKSk7DQogIHRtcGNjbXIyIHw9ICh1aW50MTZfdCkoVElNX0lDU2VsZWN0aW9uIHwgKHVpbnQxNl90KShUSU1fSUNGaWx0ZXIgPDwgKHVpbnQxNl90KTQpKTsNCiAgICANCiAgaWYoKFRJTXggPT0gVElNMSkgfHwgKFRJTXggPT0gVElNOCkgfHwgKFRJTXggPT0gVElNMikgfHwgKFRJTXggPT0gVElNMykgfHwNCiAgICAgKFRJTXggPT0gVElNNCkgfHwoVElNeCA9PSBUSU01KSkNCiAgew0KICAgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MzRSBCaXQgKi8NCiAgICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdCkoVElNX0NDRVJfQ0MzUCkpOw0KICAgIHRtcGNjZXIgfD0gKHVpbnQxNl90KSh0bXAgfCAodWludDE2X3QpVElNX0NDRVJfQ0MzRSk7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzNFIEJpdCAqLw0KICAgIHRtcGNjZXIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KShUSU1fQ0NFUl9DQzNQIHwgVElNX0NDRVJfQ0MzTlApKTsNCiAgICB0bXBjY2VyIHw9ICh1aW50MTZfdCkoVElNX0lDUG9sYXJpdHkgfCAodWludDE2X3QpVElNX0NDRVJfQ0MzRSk7DQogIH0NCiAgDQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgYW5kIENDRVIgcmVnaXN0ZXJzICovDQogIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQogIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVEk0IGFzIElucHV0Lg0KICAqIEBwYXJhbSAgVElNeDogd2hlcmUgeCBjYW4gYmUgMSwgMiwgMywgNCwgNSBvciA4IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSA6IFRoZSBJbnB1dCBQb2xhcml0eS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfUmlzaW5nDQogICogICAgIEBhcmcgVElNX0lDUG9sYXJpdHlfRmFsbGluZw0KICAqIEBwYXJhbSAgVElNX0lDU2VsZWN0aW9uOiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFRJTV9JQ1NlbGVjdGlvbl9EaXJlY3RUSTogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDNC4NCiAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fSW5kaXJlY3RUSTogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMy4NCiAgKiAgICAgQGFyZyBUSU1fSUNTZWxlY3Rpb25fVFJDOiBUSU0gSW5wdXQgNCBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gVFJDLg0KICAqIEBwYXJhbSAgVElNX0lDRmlsdGVyOiBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnN0YXRpYyB2b2lkIFRJNF9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHVpbnQxNl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MTZfdCBUSU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFRJTV9JQ0ZpbHRlcikNCnsNCiAgdWludDE2X3QgdG1wY2NtcjIgPSAwLCB0bXBjY2VyID0gMCwgdG1wID0gMDsNCg0KICAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCA0OiBSZXNldCB0aGUgQ0M0RSBCaXQgKi8NCiAgVElNeC0+Q0NFUiAmPSAodWludDE2X3QpfigodWludDE2X3QpVElNX0NDRVJfQ0M0RSk7DQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KICB0bXAgPSAodWludDE2X3QpKFRJTV9JQ1BvbGFyaXR5IDw8IDEyKTsNCiAgLyogU2VsZWN0IHRoZSBJbnB1dCBhbmQgc2V0IHRoZSBmaWx0ZXIgKi8NCiAgdG1wY2NtcjIgJj0gKHVpbnQxNl90KSgodWludDE2X3QpKH4odWludDE2X3QpVElNX0NDTVIyX0NDNFMpICYgKCh1aW50MTZfdCl+KCh1aW50MTZfdClUSU1fQ0NNUjJfSUM0RikpKTsNCiAgdG1wY2NtcjIgfD0gKHVpbnQxNl90KShUSU1fSUNTZWxlY3Rpb24gPDwgOCk7DQogIHRtcGNjbXIyIHw9ICh1aW50MTZfdCkoVElNX0lDRmlsdGVyIDw8IDEyKTsNCiAgDQogIGlmKChUSU14ID09IFRJTTEpIHx8IChUSU14ID09IFRJTTgpIHx8IChUSU14ID09IFRJTTIpIHx8IChUSU14ID09IFRJTTMpIHx8DQogICAgIChUSU14ID09IFRJTTQpIHx8KFRJTXggPT0gVElNNSkpDQogIHsNCiAgICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDNEUgQml0ICovDQogICAgdG1wY2NlciAmPSAodWludDE2X3QpfigodWludDE2X3QpKFRJTV9DQ0VSX0NDNFApKTsNCiAgICB0bXBjY2VyIHw9ICh1aW50MTZfdCkodG1wIHwgKHVpbnQxNl90KVRJTV9DQ0VSX0NDNEUpOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0M0RSBCaXQgKi8NCiAgICB0bXBjY2VyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdCkoVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDNE5QKSk7DQogICAgdG1wY2NlciB8PSAodWludDE2X3QpKFRJTV9JQ1BvbGFyaXR5IHwgKHVpbnQxNl90KVRJTV9DQ0VSX0NDNEUpOw0KICB9DQogIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgYW5kIENDRVIgcmVnaXN0ZXJzICovDQogIFRJTXgtPkNDTVIyID0gdG1wY2NtcjI7DQogIFRJTXgtPkNDRVIgPSB0bXBjY2VyOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K